From 8dabc51ca4b3b76ed7e327b74072d6ad35a4aa19 Mon Sep 17 00:00:00 2001 From: Justin Espedal Date: Thu, 17 Sep 2020 02:21:13 +0900 Subject: [PATCH] Update to 1.20.1 --- Alc/ALc.c | 4754 ---------- Alc/ALu.c | 1902 ---- Alc/alconfig.c | 675 -- Alc/alconfig.h | 17 - Alc/alstring.h | 58 - Alc/ambdec.c | 566 -- Alc/ambdec.h | 46 - Alc/backends/alsa.c | 1463 ---- Alc/backends/base.c | 83 - Alc/backends/base.h | 168 - Alc/backends/coreaudio.c | 810 -- Alc/backends/dsound.c | 1078 --- Alc/backends/jack.c | 607 -- Alc/backends/loopback.c | 128 - Alc/backends/null.c | 221 - Alc/backends/opensl.c | 1074 --- Alc/backends/oss.c | 878 -- Alc/backends/portaudio.c | 558 -- Alc/backends/pulseaudio.c | 1919 ---- Alc/backends/sdl2.c | 287 - Alc/backends/sndio.c | 342 - Alc/backends/solaris.c | 360 - Alc/backends/wasapi.c | 2044 ----- Alc/backends/wave.c | 453 - Alc/backends/winmm.c | 792 -- Alc/bformatdec.c | 492 -- Alc/bformatdec.h | 57 - Alc/compat.h | 65 - Alc/converter.c | 468 - Alc/converter.h | 55 - Alc/effects/autowah.c | 321 - Alc/effects/chorus.c | 555 -- Alc/effects/compressor.c | 244 - Alc/effects/dedicated.c | 184 - Alc/effects/distortion.c | 287 - Alc/effects/echo.c | 310 - Alc/effects/fshifter.c | 329 - Alc/effects/modulator.c | 307 - Alc/effects/null.c | 179 - Alc/effects/pshifter.c | 441 - Alc/effects/reverb.c | 2058 ----- Alc/filters/defs.h | 112 - Alc/filters/nfc.c | 426 - Alc/filters/nfc.h | 49 - Alc/filters/splitter.c | 109 - Alc/filters/splitter.h | 40 - Alc/fpu_modes.h | 34 - Alc/helpers.c | 1189 --- Alc/hrtf.c | 1465 ---- Alc/hrtf.h | 84 - Alc/logging.h | 69 - Alc/mastering.c | 232 - Alc/mastering.h | 57 - Alc/mixer/defs.h | 119 - Alc/mixer/hrtf_inc.c | 128 - Alc/mixer/mixer_c.c | 179 - Alc/mixer/mixer_neon.c | 283 - Alc/mixer/mixer_sse.c | 249 - Alc/mixer/mixer_sse2.c | 85 - Alc/mixer/mixer_sse41.c | 86 - Alc/mixvoice.c | 761 -- Alc/panning.c | 1265 --- Alc/polymorphism.h | 105 - Alc/ringbuffer.c | 295 - Alc/ringbuffer.h | 77 - Alc/uhjfilter.c | 120 - Alc/vector.h | 94 - OpenAL32/alAuxEffectSlot.c | 798 -- OpenAL32/alBuffer.c | 1305 --- OpenAL32/alEffect.c | 819 -- OpenAL32/alFilter.c | 671 -- OpenAL32/alListener.c | 502 -- OpenAL32/alSource.c | 3706 -------- OpenAL32/alState.c | 900 -- OpenAL32/event.c | 140 - OpenAL32/include/alAuxEffectSlot.h | 185 - OpenAL32/include/alBuffer.h | 115 - OpenAL32/include/alEffect.h | 213 - OpenAL32/include/alError.h | 29 - OpenAL32/include/alFilter.h | 67 - OpenAL32/include/alListener.h | 67 - OpenAL32/include/alMain.h | 913 -- OpenAL32/include/alSource.h | 120 - OpenAL32/include/alu.h | 548 -- OpenAL32/include/sample_cvt.h | 15 - OpenAL32/sample_cvt.c | 276 - al/auxeffectslot.cpp | 796 ++ al/auxeffectslot.h | 105 + al/buffer.cpp | 1422 +++ al/buffer.h | 104 + al/effect.cpp | 725 ++ al/effect.h | 61 + OpenAL32/alError.c => al/error.cpp | 94 +- al/event.cpp | 205 + al/event.h | 55 + OpenAL32/alExtension.c => al/extension.cpp | 64 +- al/filter.cpp | 650 ++ al/filter.h | 56 + al/listener.cpp | 452 + al/listener.h | 64 + al/source.cpp | 3345 +++++++ al/source.h | 129 + al/state.cpp | 880 ++ alc/alc.cpp | 4300 +++++++++ alc/alcmain.h | 399 + alc/alconfig.cpp | 550 ++ alc/alconfig.h | 20 + alc/alcontext.h | 196 + alc/alu.cpp | 2042 +++++ alc/alu.h | 159 + alc/ambdec.cpp | 434 + alc/ambdec.h | 48 + alc/ambidefs.h | 132 + alc/backends/alsa.cpp | 1267 +++ alc/backends/alsa.h | 19 + alc/backends/base.cpp | 62 + alc/backends/base.h | 84 + alc/backends/coreaudio.cpp | 660 ++ alc/backends/coreaudio.h | 19 + alc/backends/dsound.cpp | 917 ++ alc/backends/dsound.h | 19 + alc/backends/jack.cpp | 532 ++ alc/backends/jack.h | 19 + alc/backends/loopback.cpp | 79 + alc/backends/loopback.h | 19 + alc/backends/null.cpp | 182 + alc/backends/null.h | 19 + alc/backends/opensl.cpp | 966 ++ alc/backends/opensl.h | 19 + alc/backends/oss.cpp | 713 ++ alc/backends/oss.h | 19 + alc/backends/portaudio.cpp | 448 + alc/backends/portaudio.h | 19 + alc/backends/pulseaudio.cpp | 1507 ++++ alc/backends/pulseaudio.h | 19 + Alc/backends/qsa.c => alc/backends/qsa.cpp | 520 +- alc/backends/qsa.h | 19 + alc/backends/sdl2.cpp | 227 + alc/backends/sdl2.h | 19 + alc/backends/sndio.cpp | 477 + alc/backends/sndio.h | 19 + alc/backends/solaris.cpp | 300 + alc/backends/solaris.h | 19 + alc/backends/wasapi.cpp | 1777 ++++ alc/backends/wasapi.h | 19 + alc/backends/wave.cpp | 403 + alc/backends/wave.h | 19 + alc/backends/winmm.cpp | 636 ++ alc/backends/winmm.h | 19 + alc/bformatdec.cpp | 159 + alc/bformatdec.h | 71 + Alc/bs2b.c => alc/bs2b.cpp | 80 +- {OpenAL32/include => alc}/bs2b.h | 27 +- alc/compat.h | 9 + alc/converter.cpp | 360 + alc/converter.h | 61 + {Alc => alc}/cpu_caps.h | 1 + alc/devformat.h | 121 + alc/effects/autowah.cpp | 299 + alc/effects/base.h | 193 + alc/effects/chorus.cpp | 534 ++ alc/effects/compressor.cpp | 221 + alc/effects/dedicated.cpp | 160 + alc/effects/distortion.cpp | 262 + alc/effects/echo.cpp | 266 + .../equalizer.c => alc/effects/equalizer.cpp | 265 +- alc/effects/fshifter.cpp | 332 + alc/effects/modulator.cpp | 269 + alc/effects/null.cpp | 165 + alc/effects/pshifter.cpp | 373 + alc/effects/reverb.cpp | 2081 +++++ alc/effects/vmorpher.cpp | 432 + .../filter.c => alc/filters/biquad.cpp | 101 +- alc/filters/biquad.h | 134 + alc/filters/nfc.cpp | 383 + alc/filters/nfc.h | 63 + alc/filters/splitter.cpp | 113 + alc/filters/splitter.h | 36 + alc/fpu_modes.h | 25 + alc/helpers.cpp | 649 ++ alc/hrtf.cpp | 1373 +++ alc/hrtf.h | 106 + {Alc => alc}/inprogext.h | 29 +- alc/logging.h | 59 + alc/mastering.cpp | 443 + alc/mastering.h | 105 + alc/mixer/defs.h | 68 + alc/mixer/hrtfbase.h | 112 + alc/mixer/mixer_c.cpp | 219 + alc/mixer/mixer_neon.cpp | 324 + alc/mixer/mixer_sse.cpp | 298 + alc/mixer/mixer_sse2.cpp | 83 + .../mixer_sse3.c => alc/mixer/mixer_sse3.cpp | 0 alc/mixer/mixer_sse41.cpp | 88 + alc/panning.cpp | 994 +++ alc/ringbuffer.cpp | 236 + alc/ringbuffer.h | 111 + alc/uhjfilter.cpp | 138 + {Alc => alc}/uhjfilter.h | 33 +- alc/uiddefs.cpp | 37 + alc/voice.cpp | 837 ++ alc/voice.h | 306 + build/bsinc_inc.h | 7729 +++++++++++------ build/default-44100.mhr.h | 5025 ----------- build/default-48000.mhr.h | 5025 ----------- build/hrtf_default.h | 5025 +++++++++++ build/version.h | 7 +- common/albyte.h | 99 + common/alcomplex.c | 92 - common/alcomplex.cpp | 73 + common/alcomplex.h | 66 +- common/alexcpt.cpp | 30 + common/alexcpt.h | 36 + common/alfstream.cpp | 147 + common/alfstream.h | 70 + common/align.h | 21 - common/almalloc.c | 110 - common/almalloc.cpp | 67 + common/almalloc.h | 310 +- common/alnumeric.h | 347 + common/aloptional.h | 149 + common/alspan.h | 297 + common/alstring.cpp | 45 + common/alstring.h | 29 + common/atomic.c | 10 - common/atomic.h | 442 +- common/bool.h | 18 - common/dynload.cpp | 44 + common/dynload.h | 14 + common/endiantest.h | 14 + common/intrusive_ptr.h | 120 + common/math_defs.h | 61 +- common/opthelpers.h | 39 + common/polyphase_resampler.cpp | 227 + common/polyphase_resampler.h | 45 + common/pragmadefs.h | 21 + common/rwlock.c | 59 - common/rwlock.h | 31 - common/static_assert.h | 21 - common/strutils.cpp | 62 + common/strutils.h | 24 + common/threads.c | 716 -- common/threads.cpp | 169 + common/threads.h | 253 +- common/uintmap.c | 182 - common/uintmap.h | 41 - common/vecmat.h | 86 + common/vector.h | 15 + common/win_main_utf8.h | 4 +- files.xml | 150 +- include/AL/alc.h | 4 +- include/AL/alext.h | 21 + include/AL/efx.h | 1 + include/align.h | 21 - include/atomic.h | 334 - include/bool.h | 18 - include/config-android.h | 102 +- include/config-linux-x86_64.h | 100 +- include/config-macos-x86_64.h | 98 +- include/config-windows-x86.h | 110 +- include/config-windows-x86_64.h | 104 +- include/static_assert.h | 21 - router/{al.c => al.cpp} | 26 +- router/{alc.c => alc.cpp} | 504 +- router/{router.c => router.cpp} | 358 +- router/router.h | 283 +- 266 files changed, 56585 insertions(+), 63734 deletions(-) delete mode 100644 Alc/ALc.c delete mode 100644 Alc/ALu.c delete mode 100644 Alc/alconfig.c delete mode 100644 Alc/alconfig.h delete mode 100644 Alc/alstring.h delete mode 100644 Alc/ambdec.c delete mode 100644 Alc/ambdec.h delete mode 100644 Alc/backends/alsa.c delete mode 100644 Alc/backends/base.c delete mode 100644 Alc/backends/base.h delete mode 100644 Alc/backends/coreaudio.c delete mode 100644 Alc/backends/dsound.c delete mode 100644 Alc/backends/jack.c delete mode 100644 Alc/backends/loopback.c delete mode 100644 Alc/backends/null.c delete mode 100644 Alc/backends/opensl.c delete mode 100644 Alc/backends/oss.c delete mode 100644 Alc/backends/portaudio.c delete mode 100644 Alc/backends/pulseaudio.c delete mode 100644 Alc/backends/sdl2.c delete mode 100644 Alc/backends/sndio.c delete mode 100644 Alc/backends/solaris.c delete mode 100644 Alc/backends/wasapi.c delete mode 100644 Alc/backends/wave.c delete mode 100644 Alc/backends/winmm.c delete mode 100644 Alc/bformatdec.c delete mode 100644 Alc/bformatdec.h delete mode 100644 Alc/compat.h delete mode 100644 Alc/converter.c delete mode 100644 Alc/converter.h delete mode 100644 Alc/effects/autowah.c delete mode 100644 Alc/effects/chorus.c delete mode 100644 Alc/effects/compressor.c delete mode 100644 Alc/effects/dedicated.c delete mode 100644 Alc/effects/distortion.c delete mode 100644 Alc/effects/echo.c delete mode 100644 Alc/effects/fshifter.c delete mode 100644 Alc/effects/modulator.c delete mode 100644 Alc/effects/null.c delete mode 100644 Alc/effects/pshifter.c delete mode 100644 Alc/effects/reverb.c delete mode 100644 Alc/filters/defs.h delete mode 100644 Alc/filters/nfc.c delete mode 100644 Alc/filters/nfc.h delete mode 100644 Alc/filters/splitter.c delete mode 100644 Alc/filters/splitter.h delete mode 100644 Alc/fpu_modes.h delete mode 100644 Alc/helpers.c delete mode 100644 Alc/hrtf.c delete mode 100644 Alc/hrtf.h delete mode 100644 Alc/logging.h delete mode 100644 Alc/mastering.c delete mode 100644 Alc/mastering.h delete mode 100644 Alc/mixer/defs.h delete mode 100644 Alc/mixer/hrtf_inc.c delete mode 100644 Alc/mixer/mixer_c.c delete mode 100644 Alc/mixer/mixer_neon.c delete mode 100644 Alc/mixer/mixer_sse.c delete mode 100644 Alc/mixer/mixer_sse2.c delete mode 100644 Alc/mixer/mixer_sse41.c delete mode 100644 Alc/mixvoice.c delete mode 100644 Alc/panning.c delete mode 100644 Alc/polymorphism.h delete mode 100644 Alc/ringbuffer.c delete mode 100644 Alc/ringbuffer.h delete mode 100644 Alc/uhjfilter.c delete mode 100644 Alc/vector.h delete mode 100644 OpenAL32/alAuxEffectSlot.c delete mode 100644 OpenAL32/alBuffer.c delete mode 100644 OpenAL32/alEffect.c delete mode 100644 OpenAL32/alFilter.c delete mode 100644 OpenAL32/alListener.c delete mode 100644 OpenAL32/alSource.c delete mode 100644 OpenAL32/alState.c delete mode 100644 OpenAL32/event.c delete mode 100644 OpenAL32/include/alAuxEffectSlot.h delete mode 100644 OpenAL32/include/alBuffer.h delete mode 100644 OpenAL32/include/alEffect.h delete mode 100644 OpenAL32/include/alError.h delete mode 100644 OpenAL32/include/alFilter.h delete mode 100644 OpenAL32/include/alListener.h delete mode 100644 OpenAL32/include/alMain.h delete mode 100644 OpenAL32/include/alSource.h delete mode 100644 OpenAL32/include/alu.h delete mode 100644 OpenAL32/include/sample_cvt.h delete mode 100644 OpenAL32/sample_cvt.c create mode 100644 al/auxeffectslot.cpp create mode 100644 al/auxeffectslot.h create mode 100644 al/buffer.cpp create mode 100644 al/buffer.h create mode 100644 al/effect.cpp create mode 100644 al/effect.h rename OpenAL32/alError.c => al/error.cpp (50%) create mode 100644 al/event.cpp create mode 100644 al/event.h rename OpenAL32/alExtension.c => al/extension.cpp (58%) create mode 100644 al/filter.cpp create mode 100644 al/filter.h create mode 100644 al/listener.cpp create mode 100644 al/listener.h create mode 100644 al/source.cpp create mode 100644 al/source.h create mode 100644 al/state.cpp create mode 100644 alc/alc.cpp create mode 100644 alc/alcmain.h create mode 100644 alc/alconfig.cpp create mode 100644 alc/alconfig.h create mode 100644 alc/alcontext.h create mode 100644 alc/alu.cpp create mode 100644 alc/alu.h create mode 100644 alc/ambdec.cpp create mode 100644 alc/ambdec.h create mode 100644 alc/ambidefs.h create mode 100644 alc/backends/alsa.cpp create mode 100644 alc/backends/alsa.h create mode 100644 alc/backends/base.cpp create mode 100644 alc/backends/base.h create mode 100644 alc/backends/coreaudio.cpp create mode 100644 alc/backends/coreaudio.h create mode 100644 alc/backends/dsound.cpp create mode 100644 alc/backends/dsound.h create mode 100644 alc/backends/jack.cpp create mode 100644 alc/backends/jack.h create mode 100644 alc/backends/loopback.cpp create mode 100644 alc/backends/loopback.h create mode 100644 alc/backends/null.cpp create mode 100644 alc/backends/null.h create mode 100644 alc/backends/opensl.cpp create mode 100644 alc/backends/opensl.h create mode 100644 alc/backends/oss.cpp create mode 100644 alc/backends/oss.h create mode 100644 alc/backends/portaudio.cpp create mode 100644 alc/backends/portaudio.h create mode 100644 alc/backends/pulseaudio.cpp create mode 100644 alc/backends/pulseaudio.h rename Alc/backends/qsa.c => alc/backends/qsa.cpp (61%) create mode 100644 alc/backends/qsa.h create mode 100644 alc/backends/sdl2.cpp create mode 100644 alc/backends/sdl2.h create mode 100644 alc/backends/sndio.cpp create mode 100644 alc/backends/sndio.h create mode 100644 alc/backends/solaris.cpp create mode 100644 alc/backends/solaris.h create mode 100644 alc/backends/wasapi.cpp create mode 100644 alc/backends/wasapi.h create mode 100644 alc/backends/wave.cpp create mode 100644 alc/backends/wave.h create mode 100644 alc/backends/winmm.cpp create mode 100644 alc/backends/winmm.h create mode 100644 alc/bformatdec.cpp create mode 100644 alc/bformatdec.h rename Alc/bs2b.c => alc/bs2b.cpp (64%) rename {OpenAL32/include => alc}/bs2b.h (83%) create mode 100644 alc/compat.h create mode 100644 alc/converter.cpp create mode 100644 alc/converter.h rename {Alc => alc}/cpu_caps.h (99%) create mode 100644 alc/devformat.h create mode 100644 alc/effects/autowah.cpp create mode 100644 alc/effects/base.h create mode 100644 alc/effects/chorus.cpp create mode 100644 alc/effects/compressor.cpp create mode 100644 alc/effects/dedicated.cpp create mode 100644 alc/effects/distortion.cpp create mode 100644 alc/effects/echo.cpp rename Alc/effects/equalizer.c => alc/effects/equalizer.cpp (55%) create mode 100644 alc/effects/fshifter.cpp create mode 100644 alc/effects/modulator.cpp create mode 100644 alc/effects/null.cpp create mode 100644 alc/effects/pshifter.cpp create mode 100644 alc/effects/reverb.cpp create mode 100644 alc/effects/vmorpher.cpp rename Alc/filters/filter.c => alc/filters/biquad.cpp (57%) create mode 100644 alc/filters/biquad.h create mode 100644 alc/filters/nfc.cpp create mode 100644 alc/filters/nfc.h create mode 100644 alc/filters/splitter.cpp create mode 100644 alc/filters/splitter.h create mode 100644 alc/fpu_modes.h create mode 100644 alc/helpers.cpp create mode 100644 alc/hrtf.cpp create mode 100644 alc/hrtf.h rename {Alc => alc}/inprogext.h (78%) create mode 100644 alc/logging.h create mode 100644 alc/mastering.cpp create mode 100644 alc/mastering.h create mode 100644 alc/mixer/defs.h create mode 100644 alc/mixer/hrtfbase.h create mode 100644 alc/mixer/mixer_c.cpp create mode 100644 alc/mixer/mixer_neon.cpp create mode 100644 alc/mixer/mixer_sse.cpp create mode 100644 alc/mixer/mixer_sse2.cpp rename Alc/mixer/mixer_sse3.c => alc/mixer/mixer_sse3.cpp (100%) create mode 100644 alc/mixer/mixer_sse41.cpp create mode 100644 alc/panning.cpp create mode 100644 alc/ringbuffer.cpp create mode 100644 alc/ringbuffer.h create mode 100644 alc/uhjfilter.cpp rename {Alc => alc}/uhjfilter.h (66%) create mode 100644 alc/uiddefs.cpp create mode 100644 alc/voice.cpp create mode 100644 alc/voice.h delete mode 100644 build/default-44100.mhr.h delete mode 100644 build/default-48000.mhr.h create mode 100644 build/hrtf_default.h create mode 100644 common/albyte.h delete mode 100644 common/alcomplex.c create mode 100644 common/alcomplex.cpp create mode 100644 common/alexcpt.cpp create mode 100644 common/alexcpt.h create mode 100644 common/alfstream.cpp create mode 100644 common/alfstream.h delete mode 100644 common/align.h delete mode 100644 common/almalloc.c create mode 100644 common/almalloc.cpp create mode 100644 common/alnumeric.h create mode 100644 common/aloptional.h create mode 100644 common/alspan.h create mode 100644 common/alstring.cpp create mode 100644 common/alstring.h delete mode 100644 common/atomic.c delete mode 100644 common/bool.h create mode 100644 common/dynload.cpp create mode 100644 common/dynload.h create mode 100644 common/endiantest.h create mode 100644 common/intrusive_ptr.h create mode 100644 common/opthelpers.h create mode 100644 common/polyphase_resampler.cpp create mode 100644 common/polyphase_resampler.h create mode 100644 common/pragmadefs.h delete mode 100644 common/rwlock.c delete mode 100644 common/rwlock.h delete mode 100644 common/static_assert.h create mode 100644 common/strutils.cpp create mode 100644 common/strutils.h delete mode 100644 common/threads.c create mode 100644 common/threads.cpp delete mode 100644 common/uintmap.c delete mode 100644 common/uintmap.h create mode 100644 common/vecmat.h create mode 100644 common/vector.h delete mode 100644 include/align.h delete mode 100644 include/atomic.h delete mode 100644 include/bool.h delete mode 100644 include/static_assert.h rename router/{al.c => al.cpp} (85%) rename router/{alc.c => alc.cpp} (58%) rename router/{router.c => router.cpp} (50%) diff --git a/Alc/ALc.c b/Alc/ALc.c deleted file mode 100644 index 486ad2f..0000000 --- a/Alc/ALc.c +++ /dev/null @@ -1,4754 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include "version.h" - -#include -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "alSource.h" -#include "alListener.h" -#include "alSource.h" -#include "alBuffer.h" -#include "alFilter.h" -#include "alEffect.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "mastering.h" -#include "bformatdec.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" - -#include "fpu_modes.h" -#include "cpu_caps.h" -#include "compat.h" -#include "threads.h" -#include "alstring.h" -#include "almalloc.h" - -#include "backends/base.h" - - -/************************************************ - * Backends - ************************************************/ -struct BackendInfo { - const char *name; - ALCbackendFactory* (*getFactory)(void); -}; - -static struct BackendInfo BackendList[] = { -#ifdef HAVE_JACK - { "jack", ALCjackBackendFactory_getFactory }, -#endif -#ifdef HAVE_PULSEAUDIO - { "pulse", ALCpulseBackendFactory_getFactory }, -#endif -#ifdef HAVE_ALSA - { "alsa", ALCalsaBackendFactory_getFactory }, -#endif -#ifdef HAVE_COREAUDIO - { "core", ALCcoreAudioBackendFactory_getFactory }, -#endif -#ifdef HAVE_SOLARIS - { "solaris", ALCsolarisBackendFactory_getFactory }, -#endif -#ifdef HAVE_SNDIO - { "sndio", ALCsndioBackendFactory_getFactory }, -#endif -#ifdef HAVE_OSS - { "oss", ALCossBackendFactory_getFactory }, -#endif -#ifdef HAVE_QSA - { "qsa", ALCqsaBackendFactory_getFactory }, -#endif -#ifdef HAVE_WASAPI - { "wasapi", ALCwasapiBackendFactory_getFactory }, -#endif -#ifdef HAVE_DSOUND - { "dsound", ALCdsoundBackendFactory_getFactory }, -#endif -#ifdef HAVE_WINMM - { "winmm", ALCwinmmBackendFactory_getFactory }, -#endif -#ifdef HAVE_PORTAUDIO - { "port", ALCportBackendFactory_getFactory }, -#endif -#ifdef HAVE_OPENSL - { "opensl", ALCopenslBackendFactory_getFactory }, -#endif -#ifdef HAVE_SDL2 - { "sdl2", ALCsdl2BackendFactory_getFactory }, -#endif - - { "null", ALCnullBackendFactory_getFactory }, -#ifdef HAVE_WAVE - { "wave", ALCwaveBackendFactory_getFactory }, -#endif -}; -static ALsizei BackendListSize = COUNTOF(BackendList); -#undef EmptyFuncs - -static struct BackendInfo PlaybackBackend; -static struct BackendInfo CaptureBackend; - - -/************************************************ - * Functions, enums, and errors - ************************************************/ -#define DECL(x) { #x, (ALCvoid*)(x) } -static const struct { - const ALCchar *funcName; - ALCvoid *address; -} alcFunctions[] = { - DECL(alcCreateContext), - DECL(alcMakeContextCurrent), - DECL(alcProcessContext), - DECL(alcSuspendContext), - DECL(alcDestroyContext), - DECL(alcGetCurrentContext), - DECL(alcGetContextsDevice), - DECL(alcOpenDevice), - DECL(alcCloseDevice), - DECL(alcGetError), - DECL(alcIsExtensionPresent), - DECL(alcGetProcAddress), - DECL(alcGetEnumValue), - DECL(alcGetString), - DECL(alcGetIntegerv), - DECL(alcCaptureOpenDevice), - DECL(alcCaptureCloseDevice), - DECL(alcCaptureStart), - DECL(alcCaptureStop), - DECL(alcCaptureSamples), - - DECL(alcSetThreadContext), - DECL(alcGetThreadContext), - - DECL(alcLoopbackOpenDeviceSOFT), - DECL(alcIsRenderFormatSupportedSOFT), - DECL(alcRenderSamplesSOFT), - - DECL(alcDevicePauseSOFT), - DECL(alcDeviceResumeSOFT), - - DECL(alcGetStringiSOFT), - DECL(alcResetDeviceSOFT), - - DECL(alcGetInteger64vSOFT), - - DECL(alEnable), - DECL(alDisable), - DECL(alIsEnabled), - DECL(alGetString), - DECL(alGetBooleanv), - DECL(alGetIntegerv), - DECL(alGetFloatv), - DECL(alGetDoublev), - DECL(alGetBoolean), - DECL(alGetInteger), - DECL(alGetFloat), - DECL(alGetDouble), - DECL(alGetError), - DECL(alIsExtensionPresent), - DECL(alGetProcAddress), - DECL(alGetEnumValue), - DECL(alListenerf), - DECL(alListener3f), - DECL(alListenerfv), - DECL(alListeneri), - DECL(alListener3i), - DECL(alListeneriv), - DECL(alGetListenerf), - DECL(alGetListener3f), - DECL(alGetListenerfv), - DECL(alGetListeneri), - DECL(alGetListener3i), - DECL(alGetListeneriv), - DECL(alGenSources), - DECL(alDeleteSources), - DECL(alIsSource), - DECL(alSourcef), - DECL(alSource3f), - DECL(alSourcefv), - DECL(alSourcei), - DECL(alSource3i), - DECL(alSourceiv), - DECL(alGetSourcef), - DECL(alGetSource3f), - DECL(alGetSourcefv), - DECL(alGetSourcei), - DECL(alGetSource3i), - DECL(alGetSourceiv), - DECL(alSourcePlayv), - DECL(alSourceStopv), - DECL(alSourceRewindv), - DECL(alSourcePausev), - DECL(alSourcePlay), - DECL(alSourceStop), - DECL(alSourceRewind), - DECL(alSourcePause), - DECL(alSourceQueueBuffers), - DECL(alSourceUnqueueBuffers), - DECL(alGenBuffers), - DECL(alDeleteBuffers), - DECL(alIsBuffer), - DECL(alBufferData), - DECL(alBufferf), - DECL(alBuffer3f), - DECL(alBufferfv), - DECL(alBufferi), - DECL(alBuffer3i), - DECL(alBufferiv), - DECL(alGetBufferf), - DECL(alGetBuffer3f), - DECL(alGetBufferfv), - DECL(alGetBufferi), - DECL(alGetBuffer3i), - DECL(alGetBufferiv), - DECL(alDopplerFactor), - DECL(alDopplerVelocity), - DECL(alSpeedOfSound), - DECL(alDistanceModel), - - DECL(alGenFilters), - DECL(alDeleteFilters), - DECL(alIsFilter), - DECL(alFilteri), - DECL(alFilteriv), - DECL(alFilterf), - DECL(alFilterfv), - DECL(alGetFilteri), - DECL(alGetFilteriv), - DECL(alGetFilterf), - DECL(alGetFilterfv), - DECL(alGenEffects), - DECL(alDeleteEffects), - DECL(alIsEffect), - DECL(alEffecti), - DECL(alEffectiv), - DECL(alEffectf), - DECL(alEffectfv), - DECL(alGetEffecti), - DECL(alGetEffectiv), - DECL(alGetEffectf), - DECL(alGetEffectfv), - DECL(alGenAuxiliaryEffectSlots), - DECL(alDeleteAuxiliaryEffectSlots), - DECL(alIsAuxiliaryEffectSlot), - DECL(alAuxiliaryEffectSloti), - DECL(alAuxiliaryEffectSlotiv), - DECL(alAuxiliaryEffectSlotf), - DECL(alAuxiliaryEffectSlotfv), - DECL(alGetAuxiliaryEffectSloti), - DECL(alGetAuxiliaryEffectSlotiv), - DECL(alGetAuxiliaryEffectSlotf), - DECL(alGetAuxiliaryEffectSlotfv), - - DECL(alDeferUpdatesSOFT), - DECL(alProcessUpdatesSOFT), - - DECL(alSourcedSOFT), - DECL(alSource3dSOFT), - DECL(alSourcedvSOFT), - DECL(alGetSourcedSOFT), - DECL(alGetSource3dSOFT), - DECL(alGetSourcedvSOFT), - DECL(alSourcei64SOFT), - DECL(alSource3i64SOFT), - DECL(alSourcei64vSOFT), - DECL(alGetSourcei64SOFT), - DECL(alGetSource3i64SOFT), - DECL(alGetSourcei64vSOFT), - - DECL(alGetStringiSOFT), - - DECL(alBufferStorageSOFT), - DECL(alMapBufferSOFT), - DECL(alUnmapBufferSOFT), - DECL(alFlushMappedBufferSOFT), - - DECL(alEventControlSOFT), - DECL(alEventCallbackSOFT), - DECL(alGetPointerSOFT), - DECL(alGetPointervSOFT), -}; -#undef DECL - -#define DECL(x) { #x, (x) } -static const struct { - const ALCchar *enumName; - ALCenum value; -} alcEnumerations[] = { - DECL(ALC_INVALID), - DECL(ALC_FALSE), - DECL(ALC_TRUE), - - DECL(ALC_MAJOR_VERSION), - DECL(ALC_MINOR_VERSION), - DECL(ALC_ATTRIBUTES_SIZE), - DECL(ALC_ALL_ATTRIBUTES), - DECL(ALC_DEFAULT_DEVICE_SPECIFIER), - DECL(ALC_DEVICE_SPECIFIER), - DECL(ALC_ALL_DEVICES_SPECIFIER), - DECL(ALC_DEFAULT_ALL_DEVICES_SPECIFIER), - DECL(ALC_EXTENSIONS), - DECL(ALC_FREQUENCY), - DECL(ALC_REFRESH), - DECL(ALC_SYNC), - DECL(ALC_MONO_SOURCES), - DECL(ALC_STEREO_SOURCES), - DECL(ALC_CAPTURE_DEVICE_SPECIFIER), - DECL(ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER), - DECL(ALC_CAPTURE_SAMPLES), - DECL(ALC_CONNECTED), - - DECL(ALC_EFX_MAJOR_VERSION), - DECL(ALC_EFX_MINOR_VERSION), - DECL(ALC_MAX_AUXILIARY_SENDS), - - DECL(ALC_FORMAT_CHANNELS_SOFT), - DECL(ALC_FORMAT_TYPE_SOFT), - - DECL(ALC_MONO_SOFT), - DECL(ALC_STEREO_SOFT), - DECL(ALC_QUAD_SOFT), - DECL(ALC_5POINT1_SOFT), - DECL(ALC_6POINT1_SOFT), - DECL(ALC_7POINT1_SOFT), - DECL(ALC_BFORMAT3D_SOFT), - - DECL(ALC_BYTE_SOFT), - DECL(ALC_UNSIGNED_BYTE_SOFT), - DECL(ALC_SHORT_SOFT), - DECL(ALC_UNSIGNED_SHORT_SOFT), - DECL(ALC_INT_SOFT), - DECL(ALC_UNSIGNED_INT_SOFT), - DECL(ALC_FLOAT_SOFT), - - DECL(ALC_HRTF_SOFT), - DECL(ALC_DONT_CARE_SOFT), - DECL(ALC_HRTF_STATUS_SOFT), - DECL(ALC_HRTF_DISABLED_SOFT), - DECL(ALC_HRTF_ENABLED_SOFT), - DECL(ALC_HRTF_DENIED_SOFT), - DECL(ALC_HRTF_REQUIRED_SOFT), - DECL(ALC_HRTF_HEADPHONES_DETECTED_SOFT), - DECL(ALC_HRTF_UNSUPPORTED_FORMAT_SOFT), - DECL(ALC_NUM_HRTF_SPECIFIERS_SOFT), - DECL(ALC_HRTF_SPECIFIER_SOFT), - DECL(ALC_HRTF_ID_SOFT), - - DECL(ALC_AMBISONIC_LAYOUT_SOFT), - DECL(ALC_AMBISONIC_SCALING_SOFT), - DECL(ALC_AMBISONIC_ORDER_SOFT), - DECL(ALC_ACN_SOFT), - DECL(ALC_FUMA_SOFT), - DECL(ALC_N3D_SOFT), - DECL(ALC_SN3D_SOFT), - - DECL(ALC_OUTPUT_LIMITER_SOFT), - - DECL(ALC_NO_ERROR), - DECL(ALC_INVALID_DEVICE), - DECL(ALC_INVALID_CONTEXT), - DECL(ALC_INVALID_ENUM), - DECL(ALC_INVALID_VALUE), - DECL(ALC_OUT_OF_MEMORY), - - - DECL(AL_INVALID), - DECL(AL_NONE), - DECL(AL_FALSE), - DECL(AL_TRUE), - - DECL(AL_SOURCE_RELATIVE), - DECL(AL_CONE_INNER_ANGLE), - DECL(AL_CONE_OUTER_ANGLE), - DECL(AL_PITCH), - DECL(AL_POSITION), - DECL(AL_DIRECTION), - DECL(AL_VELOCITY), - DECL(AL_LOOPING), - DECL(AL_BUFFER), - DECL(AL_GAIN), - DECL(AL_MIN_GAIN), - DECL(AL_MAX_GAIN), - DECL(AL_ORIENTATION), - DECL(AL_REFERENCE_DISTANCE), - DECL(AL_ROLLOFF_FACTOR), - DECL(AL_CONE_OUTER_GAIN), - DECL(AL_MAX_DISTANCE), - DECL(AL_SEC_OFFSET), - DECL(AL_SAMPLE_OFFSET), - DECL(AL_BYTE_OFFSET), - DECL(AL_SOURCE_TYPE), - DECL(AL_STATIC), - DECL(AL_STREAMING), - DECL(AL_UNDETERMINED), - DECL(AL_METERS_PER_UNIT), - DECL(AL_LOOP_POINTS_SOFT), - DECL(AL_DIRECT_CHANNELS_SOFT), - - DECL(AL_DIRECT_FILTER), - DECL(AL_AUXILIARY_SEND_FILTER), - DECL(AL_AIR_ABSORPTION_FACTOR), - DECL(AL_ROOM_ROLLOFF_FACTOR), - DECL(AL_CONE_OUTER_GAINHF), - DECL(AL_DIRECT_FILTER_GAINHF_AUTO), - DECL(AL_AUXILIARY_SEND_FILTER_GAIN_AUTO), - DECL(AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO), - - DECL(AL_SOURCE_STATE), - DECL(AL_INITIAL), - DECL(AL_PLAYING), - DECL(AL_PAUSED), - DECL(AL_STOPPED), - - DECL(AL_BUFFERS_QUEUED), - DECL(AL_BUFFERS_PROCESSED), - - DECL(AL_FORMAT_MONO8), - DECL(AL_FORMAT_MONO16), - DECL(AL_FORMAT_MONO_FLOAT32), - DECL(AL_FORMAT_MONO_DOUBLE_EXT), - DECL(AL_FORMAT_STEREO8), - DECL(AL_FORMAT_STEREO16), - DECL(AL_FORMAT_STEREO_FLOAT32), - DECL(AL_FORMAT_STEREO_DOUBLE_EXT), - DECL(AL_FORMAT_MONO_IMA4), - DECL(AL_FORMAT_STEREO_IMA4), - DECL(AL_FORMAT_MONO_MSADPCM_SOFT), - DECL(AL_FORMAT_STEREO_MSADPCM_SOFT), - DECL(AL_FORMAT_QUAD8_LOKI), - DECL(AL_FORMAT_QUAD16_LOKI), - DECL(AL_FORMAT_QUAD8), - DECL(AL_FORMAT_QUAD16), - DECL(AL_FORMAT_QUAD32), - DECL(AL_FORMAT_51CHN8), - DECL(AL_FORMAT_51CHN16), - DECL(AL_FORMAT_51CHN32), - DECL(AL_FORMAT_61CHN8), - DECL(AL_FORMAT_61CHN16), - DECL(AL_FORMAT_61CHN32), - DECL(AL_FORMAT_71CHN8), - DECL(AL_FORMAT_71CHN16), - DECL(AL_FORMAT_71CHN32), - DECL(AL_FORMAT_REAR8), - DECL(AL_FORMAT_REAR16), - DECL(AL_FORMAT_REAR32), - DECL(AL_FORMAT_MONO_MULAW), - DECL(AL_FORMAT_MONO_MULAW_EXT), - DECL(AL_FORMAT_STEREO_MULAW), - DECL(AL_FORMAT_STEREO_MULAW_EXT), - DECL(AL_FORMAT_QUAD_MULAW), - DECL(AL_FORMAT_51CHN_MULAW), - DECL(AL_FORMAT_61CHN_MULAW), - DECL(AL_FORMAT_71CHN_MULAW), - DECL(AL_FORMAT_REAR_MULAW), - DECL(AL_FORMAT_MONO_ALAW_EXT), - DECL(AL_FORMAT_STEREO_ALAW_EXT), - - DECL(AL_FORMAT_BFORMAT2D_8), - DECL(AL_FORMAT_BFORMAT2D_16), - DECL(AL_FORMAT_BFORMAT2D_FLOAT32), - DECL(AL_FORMAT_BFORMAT2D_MULAW), - DECL(AL_FORMAT_BFORMAT3D_8), - DECL(AL_FORMAT_BFORMAT3D_16), - DECL(AL_FORMAT_BFORMAT3D_FLOAT32), - DECL(AL_FORMAT_BFORMAT3D_MULAW), - - DECL(AL_FREQUENCY), - DECL(AL_BITS), - DECL(AL_CHANNELS), - DECL(AL_SIZE), - DECL(AL_UNPACK_BLOCK_ALIGNMENT_SOFT), - DECL(AL_PACK_BLOCK_ALIGNMENT_SOFT), - - DECL(AL_SOURCE_RADIUS), - - DECL(AL_STEREO_ANGLES), - - DECL(AL_UNUSED), - DECL(AL_PENDING), - DECL(AL_PROCESSED), - - DECL(AL_NO_ERROR), - DECL(AL_INVALID_NAME), - DECL(AL_INVALID_ENUM), - DECL(AL_INVALID_VALUE), - DECL(AL_INVALID_OPERATION), - DECL(AL_OUT_OF_MEMORY), - - DECL(AL_VENDOR), - DECL(AL_VERSION), - DECL(AL_RENDERER), - DECL(AL_EXTENSIONS), - - DECL(AL_DOPPLER_FACTOR), - DECL(AL_DOPPLER_VELOCITY), - DECL(AL_DISTANCE_MODEL), - DECL(AL_SPEED_OF_SOUND), - DECL(AL_SOURCE_DISTANCE_MODEL), - DECL(AL_DEFERRED_UPDATES_SOFT), - DECL(AL_GAIN_LIMIT_SOFT), - - DECL(AL_INVERSE_DISTANCE), - DECL(AL_INVERSE_DISTANCE_CLAMPED), - DECL(AL_LINEAR_DISTANCE), - DECL(AL_LINEAR_DISTANCE_CLAMPED), - DECL(AL_EXPONENT_DISTANCE), - DECL(AL_EXPONENT_DISTANCE_CLAMPED), - - DECL(AL_FILTER_TYPE), - DECL(AL_FILTER_NULL), - DECL(AL_FILTER_LOWPASS), - DECL(AL_FILTER_HIGHPASS), - DECL(AL_FILTER_BANDPASS), - - DECL(AL_LOWPASS_GAIN), - DECL(AL_LOWPASS_GAINHF), - - DECL(AL_HIGHPASS_GAIN), - DECL(AL_HIGHPASS_GAINLF), - - DECL(AL_BANDPASS_GAIN), - DECL(AL_BANDPASS_GAINHF), - DECL(AL_BANDPASS_GAINLF), - - DECL(AL_EFFECT_TYPE), - DECL(AL_EFFECT_NULL), - DECL(AL_EFFECT_REVERB), - DECL(AL_EFFECT_EAXREVERB), - DECL(AL_EFFECT_CHORUS), - DECL(AL_EFFECT_DISTORTION), - DECL(AL_EFFECT_ECHO), - DECL(AL_EFFECT_FLANGER), - DECL(AL_EFFECT_PITCH_SHIFTER), - DECL(AL_EFFECT_FREQUENCY_SHIFTER), -#if 0 - DECL(AL_EFFECT_VOCAL_MORPHER), -#endif - DECL(AL_EFFECT_RING_MODULATOR), - DECL(AL_EFFECT_AUTOWAH), - DECL(AL_EFFECT_COMPRESSOR), - DECL(AL_EFFECT_EQUALIZER), - DECL(AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT), - DECL(AL_EFFECT_DEDICATED_DIALOGUE), - - DECL(AL_EFFECTSLOT_EFFECT), - DECL(AL_EFFECTSLOT_GAIN), - DECL(AL_EFFECTSLOT_AUXILIARY_SEND_AUTO), - DECL(AL_EFFECTSLOT_NULL), - - DECL(AL_EAXREVERB_DENSITY), - DECL(AL_EAXREVERB_DIFFUSION), - DECL(AL_EAXREVERB_GAIN), - DECL(AL_EAXREVERB_GAINHF), - DECL(AL_EAXREVERB_GAINLF), - DECL(AL_EAXREVERB_DECAY_TIME), - DECL(AL_EAXREVERB_DECAY_HFRATIO), - DECL(AL_EAXREVERB_DECAY_LFRATIO), - DECL(AL_EAXREVERB_REFLECTIONS_GAIN), - DECL(AL_EAXREVERB_REFLECTIONS_DELAY), - DECL(AL_EAXREVERB_REFLECTIONS_PAN), - DECL(AL_EAXREVERB_LATE_REVERB_GAIN), - DECL(AL_EAXREVERB_LATE_REVERB_DELAY), - DECL(AL_EAXREVERB_LATE_REVERB_PAN), - DECL(AL_EAXREVERB_ECHO_TIME), - DECL(AL_EAXREVERB_ECHO_DEPTH), - DECL(AL_EAXREVERB_MODULATION_TIME), - DECL(AL_EAXREVERB_MODULATION_DEPTH), - DECL(AL_EAXREVERB_AIR_ABSORPTION_GAINHF), - DECL(AL_EAXREVERB_HFREFERENCE), - DECL(AL_EAXREVERB_LFREFERENCE), - DECL(AL_EAXREVERB_ROOM_ROLLOFF_FACTOR), - DECL(AL_EAXREVERB_DECAY_HFLIMIT), - - DECL(AL_REVERB_DENSITY), - DECL(AL_REVERB_DIFFUSION), - DECL(AL_REVERB_GAIN), - DECL(AL_REVERB_GAINHF), - DECL(AL_REVERB_DECAY_TIME), - DECL(AL_REVERB_DECAY_HFRATIO), - DECL(AL_REVERB_REFLECTIONS_GAIN), - DECL(AL_REVERB_REFLECTIONS_DELAY), - DECL(AL_REVERB_LATE_REVERB_GAIN), - DECL(AL_REVERB_LATE_REVERB_DELAY), - DECL(AL_REVERB_AIR_ABSORPTION_GAINHF), - DECL(AL_REVERB_ROOM_ROLLOFF_FACTOR), - DECL(AL_REVERB_DECAY_HFLIMIT), - - DECL(AL_CHORUS_WAVEFORM), - DECL(AL_CHORUS_PHASE), - DECL(AL_CHORUS_RATE), - DECL(AL_CHORUS_DEPTH), - DECL(AL_CHORUS_FEEDBACK), - DECL(AL_CHORUS_DELAY), - - DECL(AL_DISTORTION_EDGE), - DECL(AL_DISTORTION_GAIN), - DECL(AL_DISTORTION_LOWPASS_CUTOFF), - DECL(AL_DISTORTION_EQCENTER), - DECL(AL_DISTORTION_EQBANDWIDTH), - - DECL(AL_ECHO_DELAY), - DECL(AL_ECHO_LRDELAY), - DECL(AL_ECHO_DAMPING), - DECL(AL_ECHO_FEEDBACK), - DECL(AL_ECHO_SPREAD), - - DECL(AL_FLANGER_WAVEFORM), - DECL(AL_FLANGER_PHASE), - DECL(AL_FLANGER_RATE), - DECL(AL_FLANGER_DEPTH), - DECL(AL_FLANGER_FEEDBACK), - DECL(AL_FLANGER_DELAY), - - DECL(AL_FREQUENCY_SHIFTER_FREQUENCY), - DECL(AL_FREQUENCY_SHIFTER_LEFT_DIRECTION), - DECL(AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION), - - DECL(AL_RING_MODULATOR_FREQUENCY), - DECL(AL_RING_MODULATOR_HIGHPASS_CUTOFF), - DECL(AL_RING_MODULATOR_WAVEFORM), - - DECL(AL_PITCH_SHIFTER_COARSE_TUNE), - DECL(AL_PITCH_SHIFTER_FINE_TUNE), - - DECL(AL_COMPRESSOR_ONOFF), - - DECL(AL_EQUALIZER_LOW_GAIN), - DECL(AL_EQUALIZER_LOW_CUTOFF), - DECL(AL_EQUALIZER_MID1_GAIN), - DECL(AL_EQUALIZER_MID1_CENTER), - DECL(AL_EQUALIZER_MID1_WIDTH), - DECL(AL_EQUALIZER_MID2_GAIN), - DECL(AL_EQUALIZER_MID2_CENTER), - DECL(AL_EQUALIZER_MID2_WIDTH), - DECL(AL_EQUALIZER_HIGH_GAIN), - DECL(AL_EQUALIZER_HIGH_CUTOFF), - - DECL(AL_DEDICATED_GAIN), - - DECL(AL_AUTOWAH_ATTACK_TIME), - DECL(AL_AUTOWAH_RELEASE_TIME), - DECL(AL_AUTOWAH_RESONANCE), - DECL(AL_AUTOWAH_PEAK_GAIN), - - DECL(AL_NUM_RESAMPLERS_SOFT), - DECL(AL_DEFAULT_RESAMPLER_SOFT), - DECL(AL_SOURCE_RESAMPLER_SOFT), - DECL(AL_RESAMPLER_NAME_SOFT), - - DECL(AL_SOURCE_SPATIALIZE_SOFT), - DECL(AL_AUTO_SOFT), - - DECL(AL_MAP_READ_BIT_SOFT), - DECL(AL_MAP_WRITE_BIT_SOFT), - DECL(AL_MAP_PERSISTENT_BIT_SOFT), - DECL(AL_PRESERVE_DATA_BIT_SOFT), - - DECL(AL_EVENT_CALLBACK_FUNCTION_SOFT), - DECL(AL_EVENT_CALLBACK_USER_PARAM_SOFT), - DECL(AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT), - DECL(AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT), - DECL(AL_EVENT_TYPE_ERROR_SOFT), - DECL(AL_EVENT_TYPE_PERFORMANCE_SOFT), - DECL(AL_EVENT_TYPE_DEPRECATED_SOFT), -}; -#undef DECL - -static const ALCchar alcNoError[] = "No Error"; -static const ALCchar alcErrInvalidDevice[] = "Invalid Device"; -static const ALCchar alcErrInvalidContext[] = "Invalid Context"; -static const ALCchar alcErrInvalidEnum[] = "Invalid Enum"; -static const ALCchar alcErrInvalidValue[] = "Invalid Value"; -static const ALCchar alcErrOutOfMemory[] = "Out of Memory"; - - -/************************************************ - * Global variables - ************************************************/ - -/* Enumerated device names */ -static const ALCchar alcDefaultName[] = "OpenAL Soft\0"; - -static al_string alcAllDevicesList; -static al_string alcCaptureDeviceList; - -/* Default is always the first in the list */ -static ALCchar *alcDefaultAllDevicesSpecifier; -static ALCchar *alcCaptureDefaultDeviceSpecifier; - -/* Default context extensions */ -static const ALchar alExtList[] = - "AL_EXT_ALAW " - "AL_EXT_BFORMAT " - "AL_EXT_DOUBLE " - "AL_EXT_EXPONENT_DISTANCE " - "AL_EXT_FLOAT32 " - "AL_EXT_IMA4 " - "AL_EXT_LINEAR_DISTANCE " - "AL_EXT_MCFORMATS " - "AL_EXT_MULAW " - "AL_EXT_MULAW_BFORMAT " - "AL_EXT_MULAW_MCFORMATS " - "AL_EXT_OFFSET " - "AL_EXT_source_distance_model " - "AL_EXT_SOURCE_RADIUS " - "AL_EXT_STEREO_ANGLES " - "AL_LOKI_quadriphonic " - "AL_SOFT_block_alignment " - "AL_SOFT_deferred_updates " - "AL_SOFT_direct_channels " - "AL_SOFTX_events " - "AL_SOFTX_filter_gain_ex " - "AL_SOFT_gain_clamp_ex " - "AL_SOFT_loop_points " - "AL_SOFTX_map_buffer " - "AL_SOFT_MSADPCM " - "AL_SOFT_source_latency " - "AL_SOFT_source_length " - "AL_SOFT_source_resampler " - "AL_SOFT_source_spatialize"; - -static ATOMIC(ALCenum) LastNullDeviceError = ATOMIC_INIT_STATIC(ALC_NO_ERROR); - -/* Thread-local current context */ -static altss_t LocalContext; -/* Process-wide current context */ -static ATOMIC(ALCcontext*) GlobalContext = ATOMIC_INIT_STATIC(NULL); - -/* Mixing thread piority level */ -ALint RTPrioLevel; - -FILE *LogFile; -#ifdef _DEBUG -enum LogLevel LogLevel = LogWarning; -#else -enum LogLevel LogLevel = LogError; -#endif - -/* Flag to trap ALC device errors */ -static ALCboolean TrapALCError = ALC_FALSE; - -/* One-time configuration init control */ -static alonce_flag alc_config_once = AL_ONCE_FLAG_INIT; - -/* Default effect that applies to sources that don't have an effect on send 0 */ -static ALeffect DefaultEffect; - -/* Flag to specify if alcSuspendContext/alcProcessContext should defer/process - * updates. - */ -static ALCboolean SuspendDefers = ALC_TRUE; - - -/************************************************ - * ALC information - ************************************************/ -static const ALCchar alcNoDeviceExtList[] = - "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE " - "ALC_EXT_thread_local_context ALC_SOFT_loopback"; -static const ALCchar alcExtensionList[] = - "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE " - "ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX " - "ALC_EXT_thread_local_context ALC_SOFT_device_clock ALC_SOFT_HRTF " - "ALC_SOFT_loopback ALC_SOFT_output_limiter ALC_SOFT_pause_device"; -static const ALCint alcMajorVersion = 1; -static const ALCint alcMinorVersion = 1; - -static const ALCint alcEFXMajorVersion = 1; -static const ALCint alcEFXMinorVersion = 0; - - -/************************************************ - * Device lists - ************************************************/ -static ATOMIC(ALCdevice*) DeviceList = ATOMIC_INIT_STATIC(NULL); - -static almtx_t ListLock; -static inline void LockLists(void) -{ - int ret = almtx_lock(&ListLock); - assert(ret == althrd_success); -} -static inline void UnlockLists(void) -{ - int ret = almtx_unlock(&ListLock); - assert(ret == althrd_success); -} - -/************************************************ - * Library initialization - ************************************************/ -#if defined(_WIN32) -static void alc_init(void); -static void alc_deinit(void); -static void alc_deinit_safe(void); - -#ifndef AL_LIBTYPE_STATIC -BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved) -{ - switch(reason) - { - case DLL_PROCESS_ATTACH: - /* Pin the DLL so we won't get unloaded until the process terminates */ - GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - (WCHAR*)hModule, &hModule); - alc_init(); - break; - - case DLL_THREAD_DETACH: - althrd_thread_detach(); - break; - - case DLL_PROCESS_DETACH: - if(!lpReserved) - alc_deinit(); - else - alc_deinit_safe(); - break; - } - return TRUE; -} -#elif defined(_MSC_VER) -#pragma section(".CRT$XCU",read) -static void alc_constructor(void); -static void alc_destructor(void); -__declspec(allocate(".CRT$XCU")) void (__cdecl* alc_constructor_)(void) = alc_constructor; - -static void alc_constructor(void) -{ - atexit(alc_destructor); - alc_init(); -} - -static void alc_destructor(void) -{ - alc_deinit(); -} -#elif defined(HAVE_GCC_DESTRUCTOR) -static void alc_init(void) __attribute__((constructor)); -static void alc_deinit(void) __attribute__((destructor)); -#else -#error "No static initialization available on this platform!" -#endif - -#elif defined(HAVE_GCC_DESTRUCTOR) - -static void alc_init(void) __attribute__((constructor)); -static void alc_deinit(void) __attribute__((destructor)); - -#else -#error "No global initialization available on this platform!" -#endif - -static void ReleaseThreadCtx(void *ptr); -static void alc_init(void) -{ - const char *str; - int ret; - - LogFile = stderr; - - AL_STRING_INIT(alcAllDevicesList); - AL_STRING_INIT(alcCaptureDeviceList); - - str = getenv("__ALSOFT_HALF_ANGLE_CONES"); - if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) - ConeScale *= 0.5f; - - str = getenv("__ALSOFT_REVERSE_Z"); - if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) - ZScale *= -1.0f; - - str = getenv("__ALSOFT_REVERB_IGNORES_SOUND_SPEED"); - if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) - OverrideReverbSpeedOfSound = AL_TRUE; - - ret = altss_create(&LocalContext, ReleaseThreadCtx); - assert(ret == althrd_success); - - ret = almtx_init(&ListLock, almtx_recursive); - assert(ret == althrd_success); -} - -static void alc_initconfig(void) -{ - const char *devs, *str; - int capfilter; - float valf; - int i, n; - - str = getenv("ALSOFT_LOGLEVEL"); - if(str) - { - long lvl = strtol(str, NULL, 0); - if(lvl >= NoLog && lvl <= LogRef) - LogLevel = lvl; - } - - str = getenv("ALSOFT_LOGFILE"); - if(str && str[0]) - { - FILE *logfile = al_fopen(str, "wt"); - if(logfile) LogFile = logfile; - else ERR("Failed to open log file '%s'\n", str); - } - - TRACE("Initializing library v%s-%s %s\n", ALSOFT_VERSION, - ALSOFT_GIT_COMMIT_HASH, ALSOFT_GIT_BRANCH); - { - char buf[1024] = ""; - int len = 0; - - if(BackendListSize > 0) - len += snprintf(buf, sizeof(buf), "%s", BackendList[0].name); - for(i = 1;i < BackendListSize;i++) - len += snprintf(buf+len, sizeof(buf)-len, ", %s", BackendList[i].name); - TRACE("Supported backends: %s\n", buf); - } - ReadALConfig(); - - str = getenv("__ALSOFT_SUSPEND_CONTEXT"); - if(str && *str) - { - if(strcasecmp(str, "ignore") == 0) - { - SuspendDefers = ALC_FALSE; - TRACE("Selected context suspend behavior, \"ignore\"\n"); - } - else - ERR("Unhandled context suspend behavior setting: \"%s\"\n", str); - } - - capfilter = 0; -#if defined(HAVE_SSE4_1) - capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3 | CPU_CAP_SSE4_1; -#elif defined(HAVE_SSE3) - capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3; -#elif defined(HAVE_SSE2) - capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2; -#elif defined(HAVE_SSE) - capfilter |= CPU_CAP_SSE; -#endif -#ifdef HAVE_NEON - capfilter |= CPU_CAP_NEON; -#endif - if(ConfigValueStr(NULL, NULL, "disable-cpu-exts", &str)) - { - if(strcasecmp(str, "all") == 0) - capfilter = 0; - else - { - size_t len; - const char *next = str; - - do { - str = next; - while(isspace(str[0])) - str++; - next = strchr(str, ','); - - if(!str[0] || str[0] == ',') - continue; - - len = (next ? ((size_t)(next-str)) : strlen(str)); - while(len > 0 && isspace(str[len-1])) - len--; - if(len == 3 && strncasecmp(str, "sse", len) == 0) - capfilter &= ~CPU_CAP_SSE; - else if(len == 4 && strncasecmp(str, "sse2", len) == 0) - capfilter &= ~CPU_CAP_SSE2; - else if(len == 4 && strncasecmp(str, "sse3", len) == 0) - capfilter &= ~CPU_CAP_SSE3; - else if(len == 6 && strncasecmp(str, "sse4.1", len) == 0) - capfilter &= ~CPU_CAP_SSE4_1; - else if(len == 4 && strncasecmp(str, "neon", len) == 0) - capfilter &= ~CPU_CAP_NEON; - else - WARN("Invalid CPU extension \"%s\"\n", str); - } while(next++); - } - } - FillCPUCaps(capfilter); - -#ifdef _WIN32 - RTPrioLevel = 1; -#else - RTPrioLevel = 0; -#endif - ConfigValueInt(NULL, NULL, "rt-prio", &RTPrioLevel); - - aluInit(); - aluInitMixer(); - - str = getenv("ALSOFT_TRAP_ERROR"); - if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) - { - TrapALError = AL_TRUE; - TrapALCError = AL_TRUE; - } - else - { - str = getenv("ALSOFT_TRAP_AL_ERROR"); - if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) - TrapALError = AL_TRUE; - TrapALError = GetConfigValueBool(NULL, NULL, "trap-al-error", TrapALError); - - str = getenv("ALSOFT_TRAP_ALC_ERROR"); - if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) - TrapALCError = ALC_TRUE; - TrapALCError = GetConfigValueBool(NULL, NULL, "trap-alc-error", TrapALCError); - } - - if(ConfigValueFloat(NULL, "reverb", "boost", &valf)) - ReverbBoost *= powf(10.0f, valf / 20.0f); - - if(((devs=getenv("ALSOFT_DRIVERS")) && devs[0]) || - ConfigValueStr(NULL, NULL, "drivers", &devs)) - { - int n; - size_t len; - const char *next = devs; - int endlist, delitem; - - i = 0; - do { - devs = next; - while(isspace(devs[0])) - devs++; - next = strchr(devs, ','); - - delitem = (devs[0] == '-'); - if(devs[0] == '-') devs++; - - if(!devs[0] || devs[0] == ',') - { - endlist = 0; - continue; - } - endlist = 1; - - len = (next ? ((size_t)(next-devs)) : strlen(devs)); - while(len > 0 && isspace(devs[len-1])) - len--; -#ifdef HAVE_WASAPI - /* HACK: For backwards compatibility, convert backend references of - * mmdevapi to wasapi. This should eventually be removed. - */ - if(len == 8 && strncmp(devs, "mmdevapi", len) == 0) - { - devs = "wasapi"; - len = 6; - } -#endif - for(n = i;n < BackendListSize;n++) - { - if(len == strlen(BackendList[n].name) && - strncmp(BackendList[n].name, devs, len) == 0) - { - if(delitem) - { - for(;n+1 < BackendListSize;n++) - BackendList[n] = BackendList[n+1]; - BackendListSize--; - } - else - { - struct BackendInfo Bkp = BackendList[n]; - for(;n > i;n--) - BackendList[n] = BackendList[n-1]; - BackendList[n] = Bkp; - - i++; - } - break; - } - } - } while(next++); - - if(endlist) - BackendListSize = i; - } - - for(n = i = 0;i < BackendListSize && (!PlaybackBackend.name || !CaptureBackend.name);i++) - { - ALCbackendFactory *factory; - BackendList[n] = BackendList[i]; - - factory = BackendList[n].getFactory(); - if(!V0(factory,init)()) - { - WARN("Failed to initialize backend \"%s\"\n", BackendList[n].name); - continue; - } - - TRACE("Initialized backend \"%s\"\n", BackendList[n].name); - if(!PlaybackBackend.name && V(factory,querySupport)(ALCbackend_Playback)) - { - PlaybackBackend = BackendList[n]; - TRACE("Added \"%s\" for playback\n", PlaybackBackend.name); - } - if(!CaptureBackend.name && V(factory,querySupport)(ALCbackend_Capture)) - { - CaptureBackend = BackendList[n]; - TRACE("Added \"%s\" for capture\n", CaptureBackend.name); - } - n++; - } - BackendListSize = n; - - { - ALCbackendFactory *factory = ALCloopbackFactory_getFactory(); - V0(factory,init)(); - } - - if(!PlaybackBackend.name) - WARN("No playback backend available!\n"); - if(!CaptureBackend.name) - WARN("No capture backend available!\n"); - - if(ConfigValueStr(NULL, NULL, "excludefx", &str)) - { - size_t len; - const char *next = str; - - do { - str = next; - next = strchr(str, ','); - - if(!str[0] || next == str) - continue; - - len = (next ? ((size_t)(next-str)) : strlen(str)); - for(n = 0;n < EFFECTLIST_SIZE;n++) - { - if(len == strlen(EffectList[n].name) && - strncmp(EffectList[n].name, str, len) == 0) - DisabledEffects[EffectList[n].type] = AL_TRUE; - } - } while(next++); - } - - InitEffect(&DefaultEffect); - str = getenv("ALSOFT_DEFAULT_REVERB"); - if((str && str[0]) || ConfigValueStr(NULL, NULL, "default-reverb", &str)) - LoadReverbPreset(str, &DefaultEffect); -} -#define DO_INITCONFIG() alcall_once(&alc_config_once, alc_initconfig) - -#ifdef __ANDROID__ -#include -#ifdef HAVE_SDL2 -#include -#endif - -static JavaVM *gJavaVM; -static pthread_key_t gJVMThreadKey; - -static void CleanupJNIEnv(void* UNUSED(ptr)) -{ - JCALL0(gJavaVM,DetachCurrentThread)(); -} - -void *Android_GetJNIEnv(void) -{ - #ifdef HAVE_SDL2 - return SDL_AndroidGetJNIEnv(); - #else - if(!gJavaVM) - { - WARN("gJavaVM is NULL!\n"); - return NULL; - } - - /* http://developer.android.com/guide/practices/jni.html - * - * All threads are Linux threads, scheduled by the kernel. They're usually - * started from managed code (using Thread.start), but they can also be - * created elsewhere and then attached to the JavaVM. For example, a thread - * started with pthread_create can be attached with the JNI - * AttachCurrentThread or AttachCurrentThreadAsDaemon functions. Until a - * thread is attached, it has no JNIEnv, and cannot make JNI calls. - * Attaching a natively-created thread causes a java.lang.Thread object to - * be constructed and added to the "main" ThreadGroup, making it visible to - * the debugger. Calling AttachCurrentThread on an already-attached thread - * is a no-op. - */ - JNIEnv *env = pthread_getspecific(gJVMThreadKey); - if(!env) - { - int status = JCALL(gJavaVM,AttachCurrentThread)(&env, NULL); - if(status < 0) - { - ERR("Failed to attach current thread\n"); - return NULL; - } - pthread_setspecific(gJVMThreadKey, env); - } - return env; - #endif -} - -#ifndef HAVE_SDL2 -/* Automatically called by JNI. */ -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void* UNUSED(reserved)) -{ - void *env; - int err; - - gJavaVM = jvm; - if(JCALL(gJavaVM,GetEnv)(&env, JNI_VERSION_1_4) != JNI_OK) - { - ERR("Failed to get JNIEnv with JNI_VERSION_1_4\n"); - return JNI_ERR; - } - - /* Create gJVMThreadKey so we can keep track of the JNIEnv assigned to each - * thread. The JNIEnv *must* be detached before the thread is destroyed. - */ - if((err=pthread_key_create(&gJVMThreadKey, CleanupJNIEnv)) != 0) - ERR("pthread_key_create failed: %d\n", err); - pthread_setspecific(gJVMThreadKey, env); - return JNI_VERSION_1_4; -} -#endif -#endif - - -/************************************************ - * Library deinitialization - ************************************************/ -static void alc_cleanup(void) -{ - ALCdevice *dev; - - AL_STRING_DEINIT(alcAllDevicesList); - AL_STRING_DEINIT(alcCaptureDeviceList); - - free(alcDefaultAllDevicesSpecifier); - alcDefaultAllDevicesSpecifier = NULL; - free(alcCaptureDefaultDeviceSpecifier); - alcCaptureDefaultDeviceSpecifier = NULL; - - if((dev=ATOMIC_EXCHANGE_PTR_SEQ(&DeviceList, NULL)) != NULL) - { - ALCuint num = 0; - do { - num++; - dev = ATOMIC_LOAD(&dev->next, almemory_order_relaxed); - } while(dev != NULL); - //ERR("%u device%s not closed\n", num, (num>1)?"s":""); - } -} - -static void alc_deinit_safe(void) -{ - alc_cleanup(); - - FreeHrtfs(); - FreeALConfig(); - - almtx_destroy(&ListLock); - altss_delete(LocalContext); - - if(LogFile != stderr) - fclose(LogFile); - LogFile = NULL; - - althrd_deinit(); -} - -static void alc_deinit(void) -{ - int i; - - alc_cleanup(); - - memset(&PlaybackBackend, 0, sizeof(PlaybackBackend)); - memset(&CaptureBackend, 0, sizeof(CaptureBackend)); - - for(i = 0;i < BackendListSize;i++) - { - ALCbackendFactory *factory = BackendList[i].getFactory(); - V0(factory,deinit)(); - } - { - ALCbackendFactory *factory = ALCloopbackFactory_getFactory(); - V0(factory,deinit)(); - } - - alc_deinit_safe(); -} - - -/************************************************ - * Device enumeration - ************************************************/ -static void ProbeDevices(al_string *list, struct BackendInfo *backendinfo, enum DevProbe type) -{ - DO_INITCONFIG(); - - LockLists(); - alstr_clear(list); - - if(backendinfo->getFactory) - { - ALCbackendFactory *factory = backendinfo->getFactory(); - V(factory,probe)(type); - } - - UnlockLists(); -} -static void ProbeAllDevicesList(void) -{ ProbeDevices(&alcAllDevicesList, &PlaybackBackend, ALL_DEVICE_PROBE); } -static void ProbeCaptureDeviceList(void) -{ ProbeDevices(&alcCaptureDeviceList, &CaptureBackend, CAPTURE_DEVICE_PROBE); } - -static void AppendDevice(const ALCchar *name, al_string *devnames) -{ - size_t len = strlen(name); - if(len > 0) - alstr_append_range(devnames, name, name+len+1); -} -void AppendAllDevicesList(const ALCchar *name) -{ AppendDevice(name, &alcAllDevicesList); } -void AppendCaptureDeviceList(const ALCchar *name) -{ AppendDevice(name, &alcCaptureDeviceList); } - - -/************************************************ - * Device format information - ************************************************/ -const ALCchar *DevFmtTypeString(enum DevFmtType type) -{ - switch(type) - { - case DevFmtByte: return "Signed Byte"; - case DevFmtUByte: return "Unsigned Byte"; - case DevFmtShort: return "Signed Short"; - case DevFmtUShort: return "Unsigned Short"; - case DevFmtInt: return "Signed Int"; - case DevFmtUInt: return "Unsigned Int"; - case DevFmtFloat: return "Float"; - } - return "(unknown type)"; -} -const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans) -{ - switch(chans) - { - case DevFmtMono: return "Mono"; - case DevFmtStereo: return "Stereo"; - case DevFmtQuad: return "Quadraphonic"; - case DevFmtX51: return "5.1 Surround"; - case DevFmtX51Rear: return "5.1 Surround (Rear)"; - case DevFmtX61: return "6.1 Surround"; - case DevFmtX71: return "7.1 Surround"; - case DevFmtAmbi3D: return "Ambisonic 3D"; - } - return "(unknown channels)"; -} - -extern inline ALsizei FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type, ALsizei ambiorder); -ALsizei BytesFromDevFmt(enum DevFmtType type) -{ - switch(type) - { - case DevFmtByte: return sizeof(ALbyte); - case DevFmtUByte: return sizeof(ALubyte); - case DevFmtShort: return sizeof(ALshort); - case DevFmtUShort: return sizeof(ALushort); - case DevFmtInt: return sizeof(ALint); - case DevFmtUInt: return sizeof(ALuint); - case DevFmtFloat: return sizeof(ALfloat); - } - return 0; -} -ALsizei ChannelsFromDevFmt(enum DevFmtChannels chans, ALsizei ambiorder) -{ - switch(chans) - { - case DevFmtMono: return 1; - case DevFmtStereo: return 2; - case DevFmtQuad: return 4; - case DevFmtX51: return 6; - case DevFmtX51Rear: return 6; - case DevFmtX61: return 7; - case DevFmtX71: return 8; - case DevFmtAmbi3D: return (ambiorder >= 3) ? 16 : - (ambiorder == 2) ? 9 : - (ambiorder == 1) ? 4 : 1; - } - return 0; -} - -static ALboolean DecomposeDevFormat(ALenum format, enum DevFmtChannels *chans, - enum DevFmtType *type) -{ - static const struct { - ALenum format; - enum DevFmtChannels channels; - enum DevFmtType type; - } list[] = { - { AL_FORMAT_MONO8, DevFmtMono, DevFmtUByte }, - { AL_FORMAT_MONO16, DevFmtMono, DevFmtShort }, - { AL_FORMAT_MONO_FLOAT32, DevFmtMono, DevFmtFloat }, - - { AL_FORMAT_STEREO8, DevFmtStereo, DevFmtUByte }, - { AL_FORMAT_STEREO16, DevFmtStereo, DevFmtShort }, - { AL_FORMAT_STEREO_FLOAT32, DevFmtStereo, DevFmtFloat }, - - { AL_FORMAT_QUAD8, DevFmtQuad, DevFmtUByte }, - { AL_FORMAT_QUAD16, DevFmtQuad, DevFmtShort }, - { AL_FORMAT_QUAD32, DevFmtQuad, DevFmtFloat }, - - { AL_FORMAT_51CHN8, DevFmtX51, DevFmtUByte }, - { AL_FORMAT_51CHN16, DevFmtX51, DevFmtShort }, - { AL_FORMAT_51CHN32, DevFmtX51, DevFmtFloat }, - - { AL_FORMAT_61CHN8, DevFmtX61, DevFmtUByte }, - { AL_FORMAT_61CHN16, DevFmtX61, DevFmtShort }, - { AL_FORMAT_61CHN32, DevFmtX61, DevFmtFloat }, - - { AL_FORMAT_71CHN8, DevFmtX71, DevFmtUByte }, - { AL_FORMAT_71CHN16, DevFmtX71, DevFmtShort }, - { AL_FORMAT_71CHN32, DevFmtX71, DevFmtFloat }, - }; - ALuint i; - - for(i = 0;i < COUNTOF(list);i++) - { - if(list[i].format == format) - { - *chans = list[i].channels; - *type = list[i].type; - return AL_TRUE; - } - } - - return AL_FALSE; -} - -static ALCboolean IsValidALCType(ALCenum type) -{ - switch(type) - { - case ALC_BYTE_SOFT: - case ALC_UNSIGNED_BYTE_SOFT: - case ALC_SHORT_SOFT: - case ALC_UNSIGNED_SHORT_SOFT: - case ALC_INT_SOFT: - case ALC_UNSIGNED_INT_SOFT: - case ALC_FLOAT_SOFT: - return ALC_TRUE; - } - return ALC_FALSE; -} - -static ALCboolean IsValidALCChannels(ALCenum channels) -{ - switch(channels) - { - case ALC_MONO_SOFT: - case ALC_STEREO_SOFT: - case ALC_QUAD_SOFT: - case ALC_5POINT1_SOFT: - case ALC_6POINT1_SOFT: - case ALC_7POINT1_SOFT: - case ALC_BFORMAT3D_SOFT: - return ALC_TRUE; - } - return ALC_FALSE; -} - -static ALCboolean IsValidAmbiLayout(ALCenum layout) -{ - switch(layout) - { - case ALC_ACN_SOFT: - case ALC_FUMA_SOFT: - return ALC_TRUE; - } - return ALC_FALSE; -} - -static ALCboolean IsValidAmbiScaling(ALCenum scaling) -{ - switch(scaling) - { - case ALC_N3D_SOFT: - case ALC_SN3D_SOFT: - case ALC_FUMA_SOFT: - return ALC_TRUE; - } - return ALC_FALSE; -} - -/************************************************ - * Miscellaneous ALC helpers - ************************************************/ - -/* SetDefaultWFXChannelOrder - * - * Sets the default channel order used by WaveFormatEx. - */ -void SetDefaultWFXChannelOrder(ALCdevice *device) -{ - ALsizei i; - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - device->RealOut.ChannelName[i] = InvalidChannel; - - switch(device->FmtChans) - { - case DevFmtMono: - device->RealOut.ChannelName[0] = FrontCenter; - break; - case DevFmtStereo: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - break; - case DevFmtQuad: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = BackLeft; - device->RealOut.ChannelName[3] = BackRight; - break; - case DevFmtX51: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = FrontCenter; - device->RealOut.ChannelName[3] = LFE; - device->RealOut.ChannelName[4] = SideLeft; - device->RealOut.ChannelName[5] = SideRight; - break; - case DevFmtX51Rear: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = FrontCenter; - device->RealOut.ChannelName[3] = LFE; - device->RealOut.ChannelName[4] = BackLeft; - device->RealOut.ChannelName[5] = BackRight; - break; - case DevFmtX61: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = FrontCenter; - device->RealOut.ChannelName[3] = LFE; - device->RealOut.ChannelName[4] = BackCenter; - device->RealOut.ChannelName[5] = SideLeft; - device->RealOut.ChannelName[6] = SideRight; - break; - case DevFmtX71: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = FrontCenter; - device->RealOut.ChannelName[3] = LFE; - device->RealOut.ChannelName[4] = BackLeft; - device->RealOut.ChannelName[5] = BackRight; - device->RealOut.ChannelName[6] = SideLeft; - device->RealOut.ChannelName[7] = SideRight; - break; - case DevFmtAmbi3D: - device->RealOut.ChannelName[0] = Aux0; - if(device->AmbiOrder > 0) - { - device->RealOut.ChannelName[1] = Aux1; - device->RealOut.ChannelName[2] = Aux2; - device->RealOut.ChannelName[3] = Aux3; - } - if(device->AmbiOrder > 1) - { - device->RealOut.ChannelName[4] = Aux4; - device->RealOut.ChannelName[5] = Aux5; - device->RealOut.ChannelName[6] = Aux6; - device->RealOut.ChannelName[7] = Aux7; - device->RealOut.ChannelName[8] = Aux8; - } - if(device->AmbiOrder > 2) - { - device->RealOut.ChannelName[9] = Aux9; - device->RealOut.ChannelName[10] = Aux10; - device->RealOut.ChannelName[11] = Aux11; - device->RealOut.ChannelName[12] = Aux12; - device->RealOut.ChannelName[13] = Aux13; - device->RealOut.ChannelName[14] = Aux14; - device->RealOut.ChannelName[15] = Aux15; - } - break; - } -} - -/* SetDefaultChannelOrder - * - * Sets the default channel order used by most non-WaveFormatEx-based APIs. - */ -void SetDefaultChannelOrder(ALCdevice *device) -{ - ALsizei i; - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - device->RealOut.ChannelName[i] = InvalidChannel; - - switch(device->FmtChans) - { - case DevFmtX51Rear: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = BackLeft; - device->RealOut.ChannelName[3] = BackRight; - device->RealOut.ChannelName[4] = FrontCenter; - device->RealOut.ChannelName[5] = LFE; - return; - case DevFmtX71: - device->RealOut.ChannelName[0] = FrontLeft; - device->RealOut.ChannelName[1] = FrontRight; - device->RealOut.ChannelName[2] = BackLeft; - device->RealOut.ChannelName[3] = BackRight; - device->RealOut.ChannelName[4] = FrontCenter; - device->RealOut.ChannelName[5] = LFE; - device->RealOut.ChannelName[6] = SideLeft; - device->RealOut.ChannelName[7] = SideRight; - return; - - /* Same as WFX order */ - case DevFmtMono: - case DevFmtStereo: - case DevFmtQuad: - case DevFmtX51: - case DevFmtX61: - case DevFmtAmbi3D: - SetDefaultWFXChannelOrder(device); - break; - } -} - -extern inline ALint GetChannelIndex(const enum Channel names[MAX_OUTPUT_CHANNELS], enum Channel chan); -extern inline ALint GetChannelIdxByName(const RealMixParams *real, enum Channel chan); - - -/* ALCcontext_DeferUpdates - * - * Defers/suspends updates for the given context's listener and sources. This - * does *NOT* stop mixing, but rather prevents certain property changes from - * taking effect. - */ -void ALCcontext_DeferUpdates(ALCcontext *context) -{ - ATOMIC_STORE_SEQ(&context->DeferUpdates, AL_TRUE); -} - -/* ALCcontext_ProcessUpdates - * - * Resumes update processing after being deferred. - */ -void ALCcontext_ProcessUpdates(ALCcontext *context) -{ - almtx_lock(&context->PropLock); - if(ATOMIC_EXCHANGE_SEQ(&context->DeferUpdates, AL_FALSE)) - { - /* Tell the mixer to stop applying updates, then wait for any active - * updating to finish, before providing updates. - */ - ATOMIC_STORE_SEQ(&context->HoldUpdates, AL_TRUE); - while((ATOMIC_LOAD(&context->UpdateCount, almemory_order_acquire)&1) != 0) - althrd_yield(); - - if(!ATOMIC_FLAG_TEST_AND_SET(&context->PropsClean, almemory_order_acq_rel)) - UpdateContextProps(context); - if(!ATOMIC_FLAG_TEST_AND_SET(&context->Listener->PropsClean, almemory_order_acq_rel)) - UpdateListenerProps(context); - UpdateAllEffectSlotProps(context); - UpdateAllSourceProps(context); - - /* Now with all updates declared, let the mixer continue applying them - * so they all happen at once. - */ - ATOMIC_STORE_SEQ(&context->HoldUpdates, AL_FALSE); - } - almtx_unlock(&context->PropLock); -} - - -/* alcSetError - * - * Stores the latest ALC device error - */ -static void alcSetError(ALCdevice *device, ALCenum errorCode) -{ - WARN("Error generated on device %p, code 0x%04x\n", device, errorCode); - if(TrapALCError) - { -#ifdef _WIN32 - /* DebugBreak() will cause an exception if there is no debugger */ - if(IsDebuggerPresent()) - DebugBreak(); -#elif defined(SIGTRAP) - raise(SIGTRAP); -#endif - } - - if(device) - ATOMIC_STORE_SEQ(&device->LastError, errorCode); - else - ATOMIC_STORE_SEQ(&LastNullDeviceError, errorCode); -} - - -struct Compressor *CreateDeviceLimiter(const ALCdevice *device) -{ - return CompressorInit(0.0f, 0.0f, AL_FALSE, AL_TRUE, 0.0f, 0.0f, 0.5f, 2.0f, - 0.0f, -3.0f, 3.0f, device->Frequency); -} - -/* UpdateClockBase - * - * Updates the device's base clock time with however many samples have been - * done. This is used so frequency changes on the device don't cause the time - * to jump forward or back. Must not be called while the device is running/ - * mixing. - */ -static inline void UpdateClockBase(ALCdevice *device) -{ - IncrementRef(&device->MixCount); - device->ClockBase += device->SamplesDone * DEVICE_CLOCK_RES / device->Frequency; - device->SamplesDone = 0; - IncrementRef(&device->MixCount); -} - -/* UpdateDeviceParams - * - * Updates device parameters according to the attribute list (caller is - * responsible for holding the list lock). - */ -static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) -{ - enum HrtfRequestMode hrtf_userreq = Hrtf_Default; - enum HrtfRequestMode hrtf_appreq = Hrtf_Default; - ALCenum gainLimiter = device->Limiter ? ALC_TRUE : ALC_FALSE; - const ALsizei old_sends = device->NumAuxSends; - ALsizei new_sends = device->NumAuxSends; - enum DevFmtChannels oldChans; - enum DevFmtType oldType; - ALboolean update_failed; - ALCsizei hrtf_id = -1; - ALCcontext *context; - ALCuint oldFreq; - size_t size; - ALCsizei i; - int val; - - // Check for attributes - if(device->Type == Loopback) - { - ALCsizei numMono, numStereo, numSends; - ALCenum alayout = AL_NONE; - ALCenum ascale = AL_NONE; - ALCenum schans = AL_NONE; - ALCenum stype = AL_NONE; - ALCsizei attrIdx = 0; - ALCsizei aorder = 0; - ALCuint freq = 0; - - if(!attrList) - { - WARN("Missing attributes for loopback device\n"); - return ALC_INVALID_VALUE; - } - - numMono = device->NumMonoSources; - numStereo = device->NumStereoSources; - numSends = old_sends; - -#define TRACE_ATTR(a, v) TRACE("Loopback %s = %d\n", #a, v) - while(attrList[attrIdx]) - { - switch(attrList[attrIdx]) - { - case ALC_FORMAT_CHANNELS_SOFT: - schans = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_FORMAT_CHANNELS_SOFT, schans); - if(!IsValidALCChannels(schans)) - return ALC_INVALID_VALUE; - break; - - case ALC_FORMAT_TYPE_SOFT: - stype = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_FORMAT_TYPE_SOFT, stype); - if(!IsValidALCType(stype)) - return ALC_INVALID_VALUE; - break; - - case ALC_FREQUENCY: - freq = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_FREQUENCY, freq); - if(freq < MIN_OUTPUT_RATE) - return ALC_INVALID_VALUE; - break; - - case ALC_AMBISONIC_LAYOUT_SOFT: - alayout = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_AMBISONIC_LAYOUT_SOFT, alayout); - if(!IsValidAmbiLayout(alayout)) - return ALC_INVALID_VALUE; - break; - - case ALC_AMBISONIC_SCALING_SOFT: - ascale = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_AMBISONIC_SCALING_SOFT, ascale); - if(!IsValidAmbiScaling(ascale)) - return ALC_INVALID_VALUE; - break; - - case ALC_AMBISONIC_ORDER_SOFT: - aorder = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_AMBISONIC_ORDER_SOFT, aorder); - if(aorder < 1 || aorder > MAX_AMBI_ORDER) - return ALC_INVALID_VALUE; - break; - - case ALC_MONO_SOURCES: - numMono = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_MONO_SOURCES, numMono); - numMono = maxi(numMono, 0); - break; - - case ALC_STEREO_SOURCES: - numStereo = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_STEREO_SOURCES, numStereo); - numStereo = maxi(numStereo, 0); - break; - - case ALC_MAX_AUXILIARY_SENDS: - numSends = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_MAX_AUXILIARY_SENDS, numSends); - numSends = clampi(numSends, 0, MAX_SENDS); - break; - - case ALC_HRTF_SOFT: - TRACE_ATTR(ALC_HRTF_SOFT, attrList[attrIdx + 1]); - if(attrList[attrIdx + 1] == ALC_FALSE) - hrtf_appreq = Hrtf_Disable; - else if(attrList[attrIdx + 1] == ALC_TRUE) - hrtf_appreq = Hrtf_Enable; - else - hrtf_appreq = Hrtf_Default; - break; - - case ALC_HRTF_ID_SOFT: - hrtf_id = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_HRTF_ID_SOFT, hrtf_id); - break; - - case ALC_OUTPUT_LIMITER_SOFT: - gainLimiter = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_OUTPUT_LIMITER_SOFT, gainLimiter); - break; - - default: - TRACE("Loopback 0x%04X = %d (0x%x)\n", attrList[attrIdx], - attrList[attrIdx + 1], attrList[attrIdx + 1]); - break; - } - - attrIdx += 2; - } -#undef TRACE_ATTR - - if(!schans || !stype || !freq) - { - WARN("Missing format for loopback device\n"); - return ALC_INVALID_VALUE; - } - if(schans == ALC_BFORMAT3D_SOFT && (!alayout || !ascale || !aorder)) - { - WARN("Missing ambisonic info for loopback device\n"); - return ALC_INVALID_VALUE; - } - - if((device->Flags&DEVICE_RUNNING)) - V0(device->Backend,stop)(); - device->Flags &= ~DEVICE_RUNNING; - - UpdateClockBase(device); - - device->Frequency = freq; - device->FmtChans = schans; - device->FmtType = stype; - if(schans == ALC_BFORMAT3D_SOFT) - { - device->AmbiOrder = aorder; - device->AmbiLayout = alayout; - device->AmbiScale = ascale; - } - - if(numMono > INT_MAX-numStereo) - numMono = INT_MAX-numStereo; - numMono += numStereo; - if(ConfigValueInt(NULL, NULL, "sources", &numMono)) - { - if(numMono <= 0) - numMono = 256; - } - else - numMono = maxi(numMono, 256); - numStereo = mini(numStereo, numMono); - numMono -= numStereo; - device->SourcesMax = numMono + numStereo; - - device->NumMonoSources = numMono; - device->NumStereoSources = numStereo; - - if(ConfigValueInt(NULL, NULL, "sends", &new_sends)) - new_sends = mini(numSends, clampi(new_sends, 0, MAX_SENDS)); - else - new_sends = numSends; - } - else if(attrList && attrList[0]) - { - ALCsizei numMono, numStereo, numSends; - ALCsizei attrIdx = 0; - ALCuint freq; - - /* If a context is already running on the device, stop playback so the - * device attributes can be updated. */ - if((device->Flags&DEVICE_RUNNING)) - V0(device->Backend,stop)(); - device->Flags &= ~DEVICE_RUNNING; - - UpdateClockBase(device); - - freq = device->Frequency; - numMono = device->NumMonoSources; - numStereo = device->NumStereoSources; - numSends = old_sends; - -#define TRACE_ATTR(a, v) TRACE("%s = %d\n", #a, v) - while(attrList[attrIdx]) - { - switch(attrList[attrIdx]) - { - case ALC_FREQUENCY: - freq = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_FREQUENCY, freq); - device->Flags |= DEVICE_FREQUENCY_REQUEST; - break; - - case ALC_MONO_SOURCES: - numMono = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_MONO_SOURCES, numMono); - numMono = maxi(numMono, 0); - break; - - case ALC_STEREO_SOURCES: - numStereo = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_STEREO_SOURCES, numStereo); - numStereo = maxi(numStereo, 0); - break; - - case ALC_MAX_AUXILIARY_SENDS: - numSends = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_MAX_AUXILIARY_SENDS, numSends); - numSends = clampi(numSends, 0, MAX_SENDS); - break; - - case ALC_HRTF_SOFT: - TRACE_ATTR(ALC_HRTF_SOFT, attrList[attrIdx + 1]); - if(attrList[attrIdx + 1] == ALC_FALSE) - hrtf_appreq = Hrtf_Disable; - else if(attrList[attrIdx + 1] == ALC_TRUE) - hrtf_appreq = Hrtf_Enable; - else - hrtf_appreq = Hrtf_Default; - break; - - case ALC_HRTF_ID_SOFT: - hrtf_id = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_HRTF_ID_SOFT, hrtf_id); - break; - - case ALC_OUTPUT_LIMITER_SOFT: - gainLimiter = attrList[attrIdx + 1]; - TRACE_ATTR(ALC_OUTPUT_LIMITER_SOFT, gainLimiter); - break; - - default: - TRACE("0x%04X = %d (0x%x)\n", attrList[attrIdx], - attrList[attrIdx + 1], attrList[attrIdx + 1]); - break; - } - - attrIdx += 2; - } -#undef TRACE_ATTR - - ConfigValueUInt(alstr_get_cstr(device->DeviceName), NULL, "frequency", &freq); - freq = maxu(freq, MIN_OUTPUT_RATE); - - device->UpdateSize = (ALuint64)device->UpdateSize * freq / - device->Frequency; - /* SSE and Neon do best with the update size being a multiple of 4 */ - if((CPUCapFlags&(CPU_CAP_SSE|CPU_CAP_NEON)) != 0) - device->UpdateSize = (device->UpdateSize+3)&~3; - - device->Frequency = freq; - - if(numMono > INT_MAX-numStereo) - numMono = INT_MAX-numStereo; - numMono += numStereo; - if(ConfigValueInt(alstr_get_cstr(device->DeviceName), NULL, "sources", &numMono)) - { - if(numMono <= 0) - numMono = 256; - } - else - numMono = maxi(numMono, 256); - numStereo = mini(numStereo, numMono); - numMono -= numStereo; - device->SourcesMax = numMono + numStereo; - - device->NumMonoSources = numMono; - device->NumStereoSources = numStereo; - - if(ConfigValueInt(alstr_get_cstr(device->DeviceName), NULL, "sends", &new_sends)) - new_sends = mini(numSends, clampi(new_sends, 0, MAX_SENDS)); - else - new_sends = numSends; - } - - if((device->Flags&DEVICE_RUNNING)) - return ALC_NO_ERROR; - - al_free(device->Uhj_Encoder); - device->Uhj_Encoder = NULL; - - al_free(device->Bs2b); - device->Bs2b = NULL; - - al_free(device->ChannelDelay[0].Buffer); - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Length = 0; - device->ChannelDelay[i].Buffer = NULL; - } - - al_free(device->Dry.Buffer); - device->Dry.Buffer = NULL; - device->Dry.NumChannels = 0; - device->FOAOut.Buffer = NULL; - device->FOAOut.NumChannels = 0; - device->RealOut.Buffer = NULL; - device->RealOut.NumChannels = 0; - - UpdateClockBase(device); - - device->DitherSeed = DITHER_RNG_SEED; - - /************************************************************************* - * Update device format request if HRTF is requested - */ - device->HrtfStatus = ALC_HRTF_DISABLED_SOFT; - if(device->Type != Loopback) - { - const char *hrtf; - if(ConfigValueStr(alstr_get_cstr(device->DeviceName), NULL, "hrtf", &hrtf)) - { - if(strcasecmp(hrtf, "true") == 0) - hrtf_userreq = Hrtf_Enable; - else if(strcasecmp(hrtf, "false") == 0) - hrtf_userreq = Hrtf_Disable; - else if(strcasecmp(hrtf, "auto") != 0) - ERR("Unexpected hrtf value: %s\n", hrtf); - } - - if(hrtf_userreq == Hrtf_Enable || (hrtf_userreq != Hrtf_Disable && hrtf_appreq == Hrtf_Enable)) - { - struct Hrtf *hrtf = NULL; - if(VECTOR_SIZE(device->HrtfList) == 0) - { - VECTOR_DEINIT(device->HrtfList); - device->HrtfList = EnumerateHrtf(device->DeviceName); - } - if(VECTOR_SIZE(device->HrtfList) > 0) - { - if(hrtf_id >= 0 && (size_t)hrtf_id < VECTOR_SIZE(device->HrtfList)) - hrtf = GetLoadedHrtf(VECTOR_ELEM(device->HrtfList, hrtf_id).hrtf); - else - hrtf = GetLoadedHrtf(VECTOR_ELEM(device->HrtfList, 0).hrtf); - } - - if(hrtf) - { - device->FmtChans = DevFmtStereo; - device->Frequency = hrtf->sampleRate; - device->Flags |= DEVICE_CHANNELS_REQUEST | DEVICE_FREQUENCY_REQUEST; - if(device->HrtfHandle) - Hrtf_DecRef(device->HrtfHandle); - device->HrtfHandle = hrtf; - } - else - { - hrtf_userreq = Hrtf_Default; - hrtf_appreq = Hrtf_Disable; - device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT; - } - } - } - - oldFreq = device->Frequency; - oldChans = device->FmtChans; - oldType = device->FmtType; - - TRACE("Pre-reset: %s%s, %s%s, %s%uhz, %u update size x%d\n", - (device->Flags&DEVICE_CHANNELS_REQUEST)?"*":"", DevFmtChannelsString(device->FmtChans), - (device->Flags&DEVICE_SAMPLE_TYPE_REQUEST)?"*":"", DevFmtTypeString(device->FmtType), - (device->Flags&DEVICE_FREQUENCY_REQUEST)?"*":"", device->Frequency, - device->UpdateSize, device->NumUpdates - ); - - if(V0(device->Backend,reset)() == ALC_FALSE) - return ALC_INVALID_DEVICE; - - if(device->FmtChans != oldChans && (device->Flags&DEVICE_CHANNELS_REQUEST)) - { - ERR("Failed to set %s, got %s instead\n", DevFmtChannelsString(oldChans), - DevFmtChannelsString(device->FmtChans)); - device->Flags &= ~DEVICE_CHANNELS_REQUEST; - } - if(device->FmtType != oldType && (device->Flags&DEVICE_SAMPLE_TYPE_REQUEST)) - { - ERR("Failed to set %s, got %s instead\n", DevFmtTypeString(oldType), - DevFmtTypeString(device->FmtType)); - device->Flags &= ~DEVICE_SAMPLE_TYPE_REQUEST; - } - if(device->Frequency != oldFreq && (device->Flags&DEVICE_FREQUENCY_REQUEST)) - { - ERR("Failed to set %uhz, got %uhz instead\n", oldFreq, device->Frequency); - device->Flags &= ~DEVICE_FREQUENCY_REQUEST; - } - - if((device->UpdateSize&3) != 0) - { - if((CPUCapFlags&CPU_CAP_SSE)) - WARN("SSE performs best with multiple of 4 update sizes (%u)\n", device->UpdateSize); - if((CPUCapFlags&CPU_CAP_NEON)) - WARN("NEON performs best with multiple of 4 update sizes (%u)\n", device->UpdateSize); - } - - TRACE("Post-reset: %s, %s, %uhz, %u update size x%d\n", - DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), - device->Frequency, device->UpdateSize, device->NumUpdates - ); - - aluInitRenderer(device, hrtf_id, hrtf_appreq, hrtf_userreq); - TRACE("Channel config, Dry: %d, FOA: %d, Real: %d\n", device->Dry.NumChannels, - device->FOAOut.NumChannels, device->RealOut.NumChannels); - - /* Allocate extra channels for any post-filter output. */ - size = (device->Dry.NumChannels + device->FOAOut.NumChannels + - device->RealOut.NumChannels)*sizeof(device->Dry.Buffer[0]); - - TRACE("Allocating "SZFMT" channels, "SZFMT" bytes\n", size/sizeof(device->Dry.Buffer[0]), size); - device->Dry.Buffer = al_calloc(16, size); - if(!device->Dry.Buffer) - { - ERR("Failed to allocate "SZFMT" bytes for mix buffer\n", size); - return ALC_INVALID_DEVICE; - } - - if(device->RealOut.NumChannels != 0) - device->RealOut.Buffer = device->Dry.Buffer + device->Dry.NumChannels + - device->FOAOut.NumChannels; - else - { - device->RealOut.Buffer = device->Dry.Buffer; - device->RealOut.NumChannels = device->Dry.NumChannels; - } - - if(device->FOAOut.NumChannels != 0) - device->FOAOut.Buffer = device->Dry.Buffer + device->Dry.NumChannels; - else - { - device->FOAOut.Buffer = device->Dry.Buffer; - device->FOAOut.NumChannels = device->Dry.NumChannels; - } - - device->NumAuxSends = new_sends; - TRACE("Max sources: %d (%d + %d), effect slots: %d, sends: %d\n", - device->SourcesMax, device->NumMonoSources, device->NumStereoSources, - device->AuxiliaryEffectSlotMax, device->NumAuxSends); - - device->DitherDepth = 0.0f; - if(GetConfigValueBool(alstr_get_cstr(device->DeviceName), NULL, "dither", 1)) - { - ALint depth = 0; - ConfigValueInt(alstr_get_cstr(device->DeviceName), NULL, "dither-depth", &depth); - if(depth <= 0) - { - switch(device->FmtType) - { - case DevFmtByte: - case DevFmtUByte: - depth = 8; - break; - case DevFmtShort: - case DevFmtUShort: - depth = 16; - break; - case DevFmtInt: - case DevFmtUInt: - case DevFmtFloat: - break; - } - } - - if(depth > 0) - { - depth = clampi(depth, 2, 20); - device->DitherDepth = powf(2.0f, (ALfloat)(depth-1)); - } - } - -#ifndef log2f -#ifndef M_LOG2_E -#define M_LOG2_E 0.693147180559945309417 -#endif -#define log2f(x) (log (x) / (float) M_LOG2_E) -#endif - - if(!(device->DitherDepth > 0.0f)) - TRACE("Dithering disabled\n"); - else - TRACE("Dithering enabled (%g-bit, %g)\n", log2f(device->DitherDepth)+1.0f, - device->DitherDepth); - - if(ConfigValueBool(alstr_get_cstr(device->DeviceName), NULL, "output-limiter", &val)) - gainLimiter = val ? ALC_TRUE : ALC_FALSE; - /* Valid values for gainLimiter are ALC_DONT_CARE_SOFT, ALC_TRUE, and - * ALC_FALSE. We default to on, so ALC_DONT_CARE_SOFT is the same as - * ALC_TRUE. - */ - if(gainLimiter != ALC_FALSE) - { - if(!device->Limiter || device->Frequency != GetCompressorSampleRate(device->Limiter)) - { - al_free(device->Limiter); - device->Limiter = CreateDeviceLimiter(device); - } - } - else - { - al_free(device->Limiter); - device->Limiter = NULL; - } - TRACE("Output limiter %s\n", device->Limiter ? "enabled" : "disabled"); - - aluSelectPostProcess(device); - - /* Need to delay returning failure until replacement Send arrays have been - * allocated with the appropriate size. - */ - update_failed = AL_FALSE; - START_MIXER_MODE(); - context = ATOMIC_LOAD_SEQ(&device->ContextList); - while(context) - { - SourceSubList *sublist, *subend; - struct ALvoiceProps *vprops; - ALsizei pos; - - if(context->DefaultSlot) - { - ALeffectslot *slot = context->DefaultSlot; - ALeffectState *state = slot->Effect.State; - - state->OutBuffer = device->Dry.Buffer; - state->OutChannels = device->Dry.NumChannels; - if(V(state,deviceUpdate)(device) == AL_FALSE) - update_failed = AL_TRUE; - else - UpdateEffectSlotProps(slot, context); - } - - almtx_lock(&context->PropLock); - almtx_lock(&context->EffectSlotLock); - for(pos = 0;pos < (ALsizei)VECTOR_SIZE(context->EffectSlotList);pos++) - { - ALeffectslot *slot = VECTOR_ELEM(context->EffectSlotList, pos); - ALeffectState *state = slot->Effect.State; - - state->OutBuffer = device->Dry.Buffer; - state->OutChannels = device->Dry.NumChannels; - if(V(state,deviceUpdate)(device) == AL_FALSE) - update_failed = AL_TRUE; - else - UpdateEffectSlotProps(slot, context); - } - almtx_unlock(&context->EffectSlotLock); - - almtx_lock(&context->SourceLock); - sublist = VECTOR_BEGIN(context->SourceList); - subend = VECTOR_END(context->SourceList); - for(;sublist != subend;++sublist) - { - ALuint64 usemask = ~sublist->FreeMask; - while(usemask) - { - ALsizei idx = CTZ64(usemask); - ALsource *source = sublist->Sources + idx; - - usemask &= ~(U64(1) << idx); - - if(old_sends != device->NumAuxSends) - { - ALvoid *sends = al_calloc(16, device->NumAuxSends*sizeof(source->Send[0])); - ALsizei s; - - memcpy(sends, source->Send, - mini(device->NumAuxSends, old_sends)*sizeof(source->Send[0]) - ); - for(s = device->NumAuxSends;s < old_sends;s++) - { - if(source->Send[s].Slot) - DecrementRef(&source->Send[s].Slot->ref); - source->Send[s].Slot = NULL; - } - al_free(source->Send); - source->Send = sends; - for(s = old_sends;s < device->NumAuxSends;s++) - { - source->Send[s].Slot = NULL; - source->Send[s].Gain = 1.0f; - source->Send[s].GainHF = 1.0f; - source->Send[s].HFReference = LOWPASSFREQREF; - source->Send[s].GainLF = 1.0f; - source->Send[s].LFReference = HIGHPASSFREQREF; - } - } - - ATOMIC_FLAG_CLEAR(&source->PropsClean, almemory_order_release); - } - } - - /* Clear any pre-existing voice property structs, in case the number of - * auxiliary sends is changing. Active sources will have updates - * respecified in UpdateAllSourceProps. - */ - vprops = ATOMIC_EXCHANGE_PTR(&context->FreeVoiceProps, NULL, almemory_order_acq_rel); - while(vprops) - { - struct ALvoiceProps *next = ATOMIC_LOAD(&vprops->next, almemory_order_relaxed); - al_free(vprops); - vprops = next; - } - - AllocateVoices(context, context->MaxVoices, old_sends); - for(pos = 0;pos < context->VoiceCount;pos++) - { - ALvoice *voice = context->Voices[pos]; - - al_free(ATOMIC_EXCHANGE_PTR(&voice->Update, NULL, almemory_order_acq_rel)); - - if(ATOMIC_LOAD(&voice->Source, almemory_order_acquire) == NULL) - continue; - - if(device->AvgSpeakerDist > 0.0f) - { - /* Reinitialize the NFC filters for new parameters. */ - ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / - (device->AvgSpeakerDist * device->Frequency); - for(i = 0;i < voice->NumChannels;i++) - NfcFilterCreate(&voice->Direct.Params[i].NFCtrlFilter, 0.0f, w1); - } - } - almtx_unlock(&context->SourceLock); - - ATOMIC_FLAG_TEST_AND_SET(&context->PropsClean, almemory_order_release); - UpdateContextProps(context); - ATOMIC_FLAG_TEST_AND_SET(&context->Listener->PropsClean, almemory_order_release); - UpdateListenerProps(context); - UpdateAllSourceProps(context); - almtx_unlock(&context->PropLock); - - context = ATOMIC_LOAD(&context->next, almemory_order_relaxed); - } - END_MIXER_MODE(); - if(update_failed) - return ALC_INVALID_DEVICE; - - if(!(device->Flags&DEVICE_PAUSED)) - { - if(V0(device->Backend,start)() == ALC_FALSE) - return ALC_INVALID_DEVICE; - device->Flags |= DEVICE_RUNNING; - } - - return ALC_NO_ERROR; -} - - -static void InitDevice(ALCdevice *device, enum DeviceType type) -{ - ALsizei i; - - InitRef(&device->ref, 1); - ATOMIC_INIT(&device->Connected, ALC_TRUE); - device->Type = type; - ATOMIC_INIT(&device->LastError, ALC_NO_ERROR); - - device->Flags = 0; - device->Render_Mode = NormalRender; - device->AvgSpeakerDist = 0.0f; - - ATOMIC_INIT(&device->ContextList, NULL); - - device->ClockBase = 0; - device->SamplesDone = 0; - - device->SourcesMax = 0; - device->AuxiliaryEffectSlotMax = 0; - device->NumAuxSends = 0; - - device->Dry.Buffer = NULL; - device->Dry.NumChannels = 0; - device->FOAOut.Buffer = NULL; - device->FOAOut.NumChannels = 0; - device->RealOut.Buffer = NULL; - device->RealOut.NumChannels = 0; - - AL_STRING_INIT(device->DeviceName); - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Gain = 1.0f; - device->ChannelDelay[i].Length = 0; - device->ChannelDelay[i].Buffer = NULL; - } - - AL_STRING_INIT(device->HrtfName); - VECTOR_INIT(device->HrtfList); - device->HrtfHandle = NULL; - device->Hrtf = NULL; - device->Bs2b = NULL; - device->Uhj_Encoder = NULL; - device->AmbiDecoder = NULL; - device->AmbiUp = NULL; - device->Stablizer = NULL; - device->Limiter = NULL; - - VECTOR_INIT(device->BufferList); - almtx_init(&device->BufferLock, almtx_plain); - - VECTOR_INIT(device->EffectList); - almtx_init(&device->EffectLock, almtx_plain); - - VECTOR_INIT(device->FilterList); - almtx_init(&device->FilterLock, almtx_plain); - - almtx_init(&device->BackendLock, almtx_plain); - device->Backend = NULL; - - ATOMIC_INIT(&device->next, NULL); -} - -/* FreeDevice - * - * Frees the device structure, and destroys any objects the app failed to - * delete. Called once there's no more references on the device. - */ -static ALCvoid FreeDevice(ALCdevice *device) -{ - ALsizei i; - - TRACE("%p\n", device); - - if(device->Backend) - DELETE_OBJ(device->Backend); - device->Backend = NULL; - - almtx_destroy(&device->BackendLock); - - ReleaseALBuffers(device); -#define FREE_BUFFERSUBLIST(x) al_free((x)->Buffers) - VECTOR_FOR_EACH(BufferSubList, device->BufferList, FREE_BUFFERSUBLIST); -#undef FREE_BUFFERSUBLIST - VECTOR_DEINIT(device->BufferList); - almtx_destroy(&device->BufferLock); - - ReleaseALEffects(device); -#define FREE_EFFECTSUBLIST(x) al_free((x)->Effects) - VECTOR_FOR_EACH(EffectSubList, device->EffectList, FREE_EFFECTSUBLIST); -#undef FREE_EFFECTSUBLIST - VECTOR_DEINIT(device->EffectList); - almtx_destroy(&device->EffectLock); - - ReleaseALFilters(device); -#define FREE_FILTERSUBLIST(x) al_free((x)->Filters) - VECTOR_FOR_EACH(FilterSubList, device->FilterList, FREE_FILTERSUBLIST); -#undef FREE_FILTERSUBLIST - VECTOR_DEINIT(device->FilterList); - almtx_destroy(&device->FilterLock); - - AL_STRING_DEINIT(device->HrtfName); - FreeHrtfList(&device->HrtfList); - if(device->HrtfHandle) - Hrtf_DecRef(device->HrtfHandle); - device->HrtfHandle = NULL; - al_free(device->Hrtf); - device->Hrtf = NULL; - - al_free(device->Bs2b); - device->Bs2b = NULL; - - al_free(device->Uhj_Encoder); - device->Uhj_Encoder = NULL; - - bformatdec_free(&device->AmbiDecoder); - ambiup_free(&device->AmbiUp); - - al_free(device->Stablizer); - device->Stablizer = NULL; - - al_free(device->Limiter); - device->Limiter = NULL; - - al_free(device->ChannelDelay[0].Buffer); - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Gain = 1.0f; - device->ChannelDelay[i].Length = 0; - device->ChannelDelay[i].Buffer = NULL; - } - - AL_STRING_DEINIT(device->DeviceName); - - al_free(device->Dry.Buffer); - device->Dry.Buffer = NULL; - device->Dry.NumChannels = 0; - device->FOAOut.Buffer = NULL; - device->FOAOut.NumChannels = 0; - device->RealOut.Buffer = NULL; - device->RealOut.NumChannels = 0; - - al_free(device); -} - - -void ALCdevice_IncRef(ALCdevice *device) -{ - uint ref; - ref = IncrementRef(&device->ref); - TRACEREF("%p increasing refcount to %u\n", device, ref); -} - -void ALCdevice_DecRef(ALCdevice *device) -{ - uint ref; - ref = DecrementRef(&device->ref); - TRACEREF("%p decreasing refcount to %u\n", device, ref); - if(ref == 0) FreeDevice(device); -} - -/* VerifyDevice - * - * Checks if the device handle is valid, and increments its ref count if so. - */ -static ALCboolean VerifyDevice(ALCdevice **device) -{ - ALCdevice *tmpDevice; - - LockLists(); - tmpDevice = ATOMIC_LOAD_SEQ(&DeviceList); - while(tmpDevice) - { - if(tmpDevice == *device) - { - ALCdevice_IncRef(tmpDevice); - UnlockLists(); - return ALC_TRUE; - } - tmpDevice = ATOMIC_LOAD(&tmpDevice->next, almemory_order_relaxed); - } - UnlockLists(); - - *device = NULL; - return ALC_FALSE; -} - - -/* InitContext - * - * Initializes context fields - */ -static ALvoid InitContext(ALCcontext *Context) -{ - ALlistener *listener = Context->Listener; - struct ALeffectslotArray *auxslots; - - //Initialise listener - listener->Gain = 1.0f; - listener->Position[0] = 0.0f; - listener->Position[1] = 0.0f; - listener->Position[2] = 0.0f; - listener->Velocity[0] = 0.0f; - listener->Velocity[1] = 0.0f; - listener->Velocity[2] = 0.0f; - listener->Forward[0] = 0.0f; - listener->Forward[1] = 0.0f; - listener->Forward[2] = -1.0f; - listener->Up[0] = 0.0f; - listener->Up[1] = 1.0f; - listener->Up[2] = 0.0f; - ATOMIC_FLAG_TEST_AND_SET(&listener->PropsClean, almemory_order_relaxed); - - ATOMIC_INIT(&listener->Update, NULL); - - //Validate Context - InitRef(&Context->UpdateCount, 0); - ATOMIC_INIT(&Context->HoldUpdates, AL_FALSE); - Context->GainBoost = 1.0f; - almtx_init(&Context->PropLock, almtx_plain); - ATOMIC_INIT(&Context->LastError, AL_NO_ERROR); - VECTOR_INIT(Context->SourceList); - Context->NumSources = 0; - almtx_init(&Context->SourceLock, almtx_plain); - VECTOR_INIT(Context->EffectSlotList); - almtx_init(&Context->EffectSlotLock, almtx_plain); - - if(Context->DefaultSlot) - { - auxslots = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, 1)); - auxslots->count = 1; - auxslots->slot[0] = Context->DefaultSlot; - } - else - { - auxslots = al_calloc(DEF_ALIGN, sizeof(struct ALeffectslotArray)); - auxslots->count = 0; - } - ATOMIC_INIT(&Context->ActiveAuxSlots, auxslots); - - //Set globals - Context->DistanceModel = DefaultDistanceModel; - Context->SourceDistanceModel = AL_FALSE; - Context->DopplerFactor = 1.0f; - Context->DopplerVelocity = 1.0f; - Context->SpeedOfSound = SPEEDOFSOUNDMETRESPERSEC; - Context->MetersPerUnit = AL_DEFAULT_METERS_PER_UNIT; - ATOMIC_FLAG_TEST_AND_SET(&Context->PropsClean, almemory_order_relaxed); - ATOMIC_INIT(&Context->DeferUpdates, AL_FALSE); - almtx_init(&Context->EventThrdLock, almtx_plain); - alsem_init(&Context->EventSem, 0); - Context->AsyncEvents = NULL; - ATOMIC_INIT(&Context->EnabledEvts, 0); - almtx_init(&Context->EventCbLock, almtx_plain); - Context->EventCb = NULL; - Context->EventParam = NULL; - - ATOMIC_INIT(&Context->Update, NULL); - ATOMIC_INIT(&Context->FreeContextProps, NULL); - ATOMIC_INIT(&Context->FreeListenerProps, NULL); - ATOMIC_INIT(&Context->FreeVoiceProps, NULL); - ATOMIC_INIT(&Context->FreeEffectslotProps, NULL); - - Context->ExtensionList = alExtList; - - - listener->Params.Matrix = IdentityMatrixf; - aluVectorSet(&listener->Params.Velocity, 0.0f, 0.0f, 0.0f, 0.0f); - listener->Params.Gain = listener->Gain; - listener->Params.MetersPerUnit = Context->MetersPerUnit; - listener->Params.DopplerFactor = Context->DopplerFactor; - listener->Params.SpeedOfSound = Context->SpeedOfSound * Context->DopplerVelocity; - listener->Params.ReverbSpeedOfSound = listener->Params.SpeedOfSound * - listener->Params.MetersPerUnit; - listener->Params.SourceDistanceModel = Context->SourceDistanceModel; - listener->Params.DistanceModel = Context->DistanceModel; -} - - -/* FreeContext - * - * Cleans up the context, and destroys any remaining objects the app failed to - * delete. Called once there's no more references on the context. - */ -static void FreeContext(ALCcontext *context) -{ - ALlistener *listener = context->Listener; - struct ALeffectslotArray *auxslots; - struct ALeffectslotProps *eprops; - struct ALlistenerProps *lprops; - struct ALcontextProps *cprops; - struct ALvoiceProps *vprops; - size_t count; - ALsizei i; - - TRACE("%p\n", context); - - if((cprops=ATOMIC_LOAD(&context->Update, almemory_order_acquire)) != NULL) - { - TRACE("Freed unapplied context update %p\n", cprops); - al_free(cprops); - } - - count = 0; - cprops = ATOMIC_LOAD(&context->FreeContextProps, almemory_order_acquire); - while(cprops) - { - struct ALcontextProps *next = ATOMIC_LOAD(&cprops->next, almemory_order_acquire); - al_free(cprops); - cprops = next; - ++count; - } - TRACE("Freed "SZFMT" context property object%s\n", count, (count==1)?"":"s"); - - if(context->DefaultSlot) - { - DeinitEffectSlot(context->DefaultSlot); - context->DefaultSlot = NULL; - } - - auxslots = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, NULL, almemory_order_relaxed); - al_free(auxslots); - - ReleaseALSources(context); -#define FREE_SOURCESUBLIST(x) al_free((x)->Sources) - VECTOR_FOR_EACH(SourceSubList, context->SourceList, FREE_SOURCESUBLIST); -#undef FREE_SOURCESUBLIST - VECTOR_DEINIT(context->SourceList); - context->NumSources = 0; - almtx_destroy(&context->SourceLock); - - count = 0; - eprops = ATOMIC_LOAD(&context->FreeEffectslotProps, almemory_order_relaxed); - while(eprops) - { - struct ALeffectslotProps *next = ATOMIC_LOAD(&eprops->next, almemory_order_relaxed); - if(eprops->State) ALeffectState_DecRef(eprops->State); - al_free(eprops); - eprops = next; - ++count; - } - TRACE("Freed "SZFMT" AuxiliaryEffectSlot property object%s\n", count, (count==1)?"":"s"); - - ReleaseALAuxiliaryEffectSlots(context); -#define FREE_EFFECTSLOTPTR(x) al_free(*(x)) - VECTOR_FOR_EACH(ALeffectslotPtr, context->EffectSlotList, FREE_EFFECTSLOTPTR); -#undef FREE_EFFECTSLOTPTR - VECTOR_DEINIT(context->EffectSlotList); - almtx_destroy(&context->EffectSlotLock); - - count = 0; - vprops = ATOMIC_LOAD(&context->FreeVoiceProps, almemory_order_relaxed); - while(vprops) - { - struct ALvoiceProps *next = ATOMIC_LOAD(&vprops->next, almemory_order_relaxed); - al_free(vprops); - vprops = next; - ++count; - } - TRACE("Freed "SZFMT" voice property object%s\n", count, (count==1)?"":"s"); - - for(i = 0;i < context->VoiceCount;i++) - DeinitVoice(context->Voices[i]); - al_free(context->Voices); - context->Voices = NULL; - context->VoiceCount = 0; - context->MaxVoices = 0; - - if((lprops=ATOMIC_LOAD(&listener->Update, almemory_order_acquire)) != NULL) - { - TRACE("Freed unapplied listener update %p\n", lprops); - al_free(lprops); - } - count = 0; - lprops = ATOMIC_LOAD(&context->FreeListenerProps, almemory_order_acquire); - while(lprops) - { - struct ALlistenerProps *next = ATOMIC_LOAD(&lprops->next, almemory_order_acquire); - al_free(lprops); - lprops = next; - ++count; - } - TRACE("Freed "SZFMT" listener property object%s\n", count, (count==1)?"":"s"); - - if(ATOMIC_EXCHANGE(&context->EnabledEvts, 0, almemory_order_acq_rel)) - { - static const AsyncEvent kill_evt = { 0 }; - while(ll_ringbuffer_write(context->AsyncEvents, (const char*)&kill_evt, 1) == 0) - althrd_yield(); - alsem_post(&context->EventSem); - althrd_join(context->EventThread, NULL); - } - - almtx_destroy(&context->EventCbLock); - almtx_destroy(&context->EventThrdLock); - alsem_destroy(&context->EventSem); - - ll_ringbuffer_free(context->AsyncEvents); - context->AsyncEvents = NULL; - - almtx_destroy(&context->PropLock); - - ALCdevice_DecRef(context->Device); - context->Device = NULL; - - //Invalidate context - memset(context, 0, sizeof(ALCcontext)); - al_free(context); -} - -/* ReleaseContext - * - * Removes the context reference from the given device and removes it from - * being current on the running thread or globally. Returns true if other - * contexts still exist on the device. - */ -static bool ReleaseContext(ALCcontext *context, ALCdevice *device) -{ - ALCcontext *origctx, *newhead; - bool ret = true; - - if(altss_get(LocalContext) == context) - { - WARN("%p released while current on thread\n", context); - altss_set(LocalContext, NULL); - ALCcontext_DecRef(context); - } - - origctx = context; - if(ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&GlobalContext, &origctx, NULL)) - ALCcontext_DecRef(context); - - V0(device->Backend,lock)(); - origctx = context; - newhead = ATOMIC_LOAD(&context->next, almemory_order_relaxed); - if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&device->ContextList, &origctx, newhead)) - { - ALCcontext *list; - do { - /* origctx is what the desired context failed to match. Try - * swapping out the next one in the list. - */ - list = origctx; - origctx = context; - } while(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&list->next, &origctx, newhead)); - } - else - ret = !!newhead; - V0(device->Backend,unlock)(); - - ALCcontext_DecRef(context); - return ret; -} - -static void ALCcontext_IncRef(ALCcontext *context) -{ - uint ref = IncrementRef(&context->ref); - TRACEREF("%p increasing refcount to %u\n", context, ref); -} - -void ALCcontext_DecRef(ALCcontext *context) -{ - uint ref = DecrementRef(&context->ref); - TRACEREF("%p decreasing refcount to %u\n", context, ref); - if(ref == 0) FreeContext(context); -} - -static void ReleaseThreadCtx(void *ptr) -{ - ALCcontext *context = ptr; - uint ref = DecrementRef(&context->ref); - TRACEREF("%p decreasing refcount to %u\n", context, ref); - ERR("Context %p current for thread being destroyed, possible leak!\n", context); -} - -/* VerifyContext - * - * Checks that the given context is valid, and increments its reference count. - */ -static ALCboolean VerifyContext(ALCcontext **context) -{ - ALCdevice *dev; - - LockLists(); - dev = ATOMIC_LOAD_SEQ(&DeviceList); - while(dev) - { - ALCcontext *ctx = ATOMIC_LOAD(&dev->ContextList, almemory_order_acquire); - while(ctx) - { - if(ctx == *context) - { - ALCcontext_IncRef(ctx); - UnlockLists(); - return ALC_TRUE; - } - ctx = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); - } - dev = ATOMIC_LOAD(&dev->next, almemory_order_relaxed); - } - UnlockLists(); - - *context = NULL; - return ALC_FALSE; -} - - -/* GetContextRef - * - * Returns the currently active context for this thread, and adds a reference - * without locking it. - */ -ALCcontext *GetContextRef(void) -{ - ALCcontext *context; - - context = altss_get(LocalContext); - if(context) - ALCcontext_IncRef(context); - else - { - LockLists(); - context = ATOMIC_LOAD_SEQ(&GlobalContext); - if(context) - ALCcontext_IncRef(context); - UnlockLists(); - } - - return context; -} - - -void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends) -{ - ALCdevice *device = context->Device; - ALsizei num_sends = device->NumAuxSends; - struct ALvoiceProps *props; - size_t sizeof_props; - size_t sizeof_voice; - ALvoice **voices; - ALvoice *voice; - ALsizei v = 0; - size_t size; - - if(num_voices == context->MaxVoices && num_sends == old_sends) - return; - - /* Allocate the voice pointers, voices, and the voices' stored source - * property set (including the dynamically-sized Send[] array) in one - * chunk. - */ - sizeof_voice = RoundUp(FAM_SIZE(ALvoice, Send, num_sends), 16); - sizeof_props = RoundUp(FAM_SIZE(struct ALvoiceProps, Send, num_sends), 16); - size = sizeof(ALvoice*) + sizeof_voice + sizeof_props; - - voices = al_calloc(16, RoundUp(size*num_voices, 16)); - /* The voice and property objects are stored interleaved since they're - * paired together. - */ - voice = (ALvoice*)((char*)voices + RoundUp(num_voices*sizeof(ALvoice*), 16)); - props = (struct ALvoiceProps*)((char*)voice + sizeof_voice); - - if(context->Voices) - { - const ALsizei v_count = mini(context->VoiceCount, num_voices); - const ALsizei s_count = mini(old_sends, num_sends); - - for(;v < v_count;v++) - { - ALvoice *old_voice = context->Voices[v]; - ALsizei i; - - /* Copy the old voice data and source property set to the new - * storage. - */ - *voice = *old_voice; - for(i = 0;i < s_count;i++) - voice->Send[i] = old_voice->Send[i]; - *props = *(old_voice->Props); - for(i = 0;i < s_count;i++) - props->Send[i] = old_voice->Props->Send[i]; - - /* Set this voice's property set pointer and voice reference. */ - voice->Props = props; - voices[v] = voice; - - /* Increment pointers to the next storage space. */ - voice = (ALvoice*)((char*)props + sizeof_props); - props = (struct ALvoiceProps*)((char*)voice + sizeof_voice); - } - /* Deinit any left over voices that weren't copied over to the new - * array. NOTE: If this does anything, v equals num_voices and - * num_voices is less than VoiceCount, so the following loop won't do - * anything. - */ - for(;v < context->VoiceCount;v++) - DeinitVoice(context->Voices[v]); - } - /* Finish setting the voices' property set pointers and references. */ - for(;v < num_voices;v++) - { - ATOMIC_INIT(&voice->Update, NULL); - - voice->Props = props; - voices[v] = voice; - - voice = (ALvoice*)((char*)props + sizeof_props); - props = (struct ALvoiceProps*)((char*)voice + sizeof_voice); - } - - al_free(context->Voices); - context->Voices = voices; - context->MaxVoices = num_voices; - context->VoiceCount = mini(context->VoiceCount, num_voices); -} - - -/************************************************ - * Standard ALC functions - ************************************************/ - -/* alcGetError - * - * Return last ALC generated error code for the given device -*/ -ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device) -{ - ALCenum errorCode; - - if(VerifyDevice(&device)) - { - errorCode = ATOMIC_EXCHANGE_SEQ(&device->LastError, ALC_NO_ERROR); - ALCdevice_DecRef(device); - } - else - errorCode = ATOMIC_EXCHANGE_SEQ(&LastNullDeviceError, ALC_NO_ERROR); - - return errorCode; -} - - -/* alcSuspendContext - * - * Suspends updates for the given context - */ -ALC_API ALCvoid ALC_APIENTRY alcSuspendContext(ALCcontext *context) -{ - if(!SuspendDefers) - return; - - if(!VerifyContext(&context)) - alcSetError(NULL, ALC_INVALID_CONTEXT); - else - { - ALCcontext_DeferUpdates(context); - ALCcontext_DecRef(context); - } -} - -/* alcProcessContext - * - * Resumes processing updates for the given context - */ -ALC_API ALCvoid ALC_APIENTRY alcProcessContext(ALCcontext *context) -{ - if(!SuspendDefers) - return; - - if(!VerifyContext(&context)) - alcSetError(NULL, ALC_INVALID_CONTEXT); - else - { - ALCcontext_ProcessUpdates(context); - ALCcontext_DecRef(context); - } -} - - -/* alcGetString - * - * Returns information about the device, and error strings - */ -ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *Device, ALCenum param) -{ - const ALCchar *value = NULL; - - switch(param) - { - case ALC_NO_ERROR: - value = alcNoError; - break; - - case ALC_INVALID_ENUM: - value = alcErrInvalidEnum; - break; - - case ALC_INVALID_VALUE: - value = alcErrInvalidValue; - break; - - case ALC_INVALID_DEVICE: - value = alcErrInvalidDevice; - break; - - case ALC_INVALID_CONTEXT: - value = alcErrInvalidContext; - break; - - case ALC_OUT_OF_MEMORY: - value = alcErrOutOfMemory; - break; - - case ALC_DEVICE_SPECIFIER: - value = alcDefaultName; - break; - - case ALC_ALL_DEVICES_SPECIFIER: - if(VerifyDevice(&Device)) - { - value = alstr_get_cstr(Device->DeviceName); - ALCdevice_DecRef(Device); - } - else - { - ProbeAllDevicesList(); - value = alstr_get_cstr(alcAllDevicesList); - } - break; - - case ALC_CAPTURE_DEVICE_SPECIFIER: - if(VerifyDevice(&Device)) - { - value = alstr_get_cstr(Device->DeviceName); - ALCdevice_DecRef(Device); - } - else - { - ProbeCaptureDeviceList(); - value = alstr_get_cstr(alcCaptureDeviceList); - } - break; - - /* Default devices are always first in the list */ - case ALC_DEFAULT_DEVICE_SPECIFIER: - value = alcDefaultName; - break; - - case ALC_DEFAULT_ALL_DEVICES_SPECIFIER: - if(alstr_empty(alcAllDevicesList)) - ProbeAllDevicesList(); - - VerifyDevice(&Device); - - free(alcDefaultAllDevicesSpecifier); - alcDefaultAllDevicesSpecifier = strdup(alstr_get_cstr(alcAllDevicesList)); - if(!alcDefaultAllDevicesSpecifier) - alcSetError(Device, ALC_OUT_OF_MEMORY); - - value = alcDefaultAllDevicesSpecifier; - if(Device) ALCdevice_DecRef(Device); - break; - - case ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER: - if(alstr_empty(alcCaptureDeviceList)) - ProbeCaptureDeviceList(); - - VerifyDevice(&Device); - - free(alcCaptureDefaultDeviceSpecifier); - alcCaptureDefaultDeviceSpecifier = strdup(alstr_get_cstr(alcCaptureDeviceList)); - if(!alcCaptureDefaultDeviceSpecifier) - alcSetError(Device, ALC_OUT_OF_MEMORY); - - value = alcCaptureDefaultDeviceSpecifier; - if(Device) ALCdevice_DecRef(Device); - break; - - case ALC_EXTENSIONS: - if(!VerifyDevice(&Device)) - value = alcNoDeviceExtList; - else - { - value = alcExtensionList; - ALCdevice_DecRef(Device); - } - break; - - case ALC_HRTF_SPECIFIER_SOFT: - if(!VerifyDevice(&Device)) - alcSetError(NULL, ALC_INVALID_DEVICE); - else - { - almtx_lock(&Device->BackendLock); - value = (Device->HrtfHandle ? alstr_get_cstr(Device->HrtfName) : ""); - almtx_unlock(&Device->BackendLock); - ALCdevice_DecRef(Device); - } - break; - - default: - VerifyDevice(&Device); - alcSetError(Device, ALC_INVALID_ENUM); - if(Device) ALCdevice_DecRef(Device); - break; - } - - return value; -} - - -static inline ALCsizei NumAttrsForDevice(ALCdevice *device) -{ - if(device->Type == Capture) return 9; - if(device->Type != Loopback) return 29; - if(device->FmtChans == DevFmtAmbi3D) - return 35; - return 29; -} - -static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) -{ - ALCsizei i; - - if(size <= 0 || values == NULL) - { - alcSetError(device, ALC_INVALID_VALUE); - return 0; - } - - if(!device) - { - switch(param) - { - case ALC_MAJOR_VERSION: - values[0] = alcMajorVersion; - return 1; - case ALC_MINOR_VERSION: - values[0] = alcMinorVersion; - return 1; - - case ALC_ATTRIBUTES_SIZE: - case ALC_ALL_ATTRIBUTES: - case ALC_FREQUENCY: - case ALC_REFRESH: - case ALC_SYNC: - case ALC_MONO_SOURCES: - case ALC_STEREO_SOURCES: - case ALC_CAPTURE_SAMPLES: - case ALC_FORMAT_CHANNELS_SOFT: - case ALC_FORMAT_TYPE_SOFT: - case ALC_AMBISONIC_LAYOUT_SOFT: - case ALC_AMBISONIC_SCALING_SOFT: - case ALC_AMBISONIC_ORDER_SOFT: - case ALC_MAX_AMBISONIC_ORDER_SOFT: - alcSetError(NULL, ALC_INVALID_DEVICE); - return 0; - - default: - alcSetError(NULL, ALC_INVALID_ENUM); - return 0; - } - return 0; - } - - if(device->Type == Capture) - { - switch(param) - { - case ALC_ATTRIBUTES_SIZE: - values[0] = NumAttrsForDevice(device); - return 1; - - case ALC_ALL_ATTRIBUTES: - if(size < NumAttrsForDevice(device)) - { - alcSetError(device, ALC_INVALID_VALUE); - return 0; - } - - i = 0; - almtx_lock(&device->BackendLock); - values[i++] = ALC_MAJOR_VERSION; - values[i++] = alcMajorVersion; - values[i++] = ALC_MINOR_VERSION; - values[i++] = alcMinorVersion; - values[i++] = ALC_CAPTURE_SAMPLES; - values[i++] = V0(device->Backend,availableSamples)(); - values[i++] = ALC_CONNECTED; - values[i++] = ATOMIC_LOAD(&device->Connected, almemory_order_relaxed); - almtx_unlock(&device->BackendLock); - - values[i++] = 0; - return i; - - case ALC_MAJOR_VERSION: - values[0] = alcMajorVersion; - return 1; - case ALC_MINOR_VERSION: - values[0] = alcMinorVersion; - return 1; - - case ALC_CAPTURE_SAMPLES: - almtx_lock(&device->BackendLock); - values[0] = V0(device->Backend,availableSamples)(); - almtx_unlock(&device->BackendLock); - return 1; - - case ALC_CONNECTED: - values[0] = ATOMIC_LOAD(&device->Connected, almemory_order_acquire); - return 1; - - default: - alcSetError(device, ALC_INVALID_ENUM); - return 0; - } - return 0; - } - - /* render device */ - switch(param) - { - case ALC_ATTRIBUTES_SIZE: - values[0] = NumAttrsForDevice(device); - return 1; - - case ALC_ALL_ATTRIBUTES: - if(size < NumAttrsForDevice(device)) - { - alcSetError(device, ALC_INVALID_VALUE); - return 0; - } - - i = 0; - almtx_lock(&device->BackendLock); - values[i++] = ALC_MAJOR_VERSION; - values[i++] = alcMajorVersion; - values[i++] = ALC_MINOR_VERSION; - values[i++] = alcMinorVersion; - values[i++] = ALC_EFX_MAJOR_VERSION; - values[i++] = alcEFXMajorVersion; - values[i++] = ALC_EFX_MINOR_VERSION; - values[i++] = alcEFXMinorVersion; - - values[i++] = ALC_FREQUENCY; - values[i++] = device->Frequency; - if(device->Type != Loopback) - { - values[i++] = ALC_REFRESH; - values[i++] = device->Frequency / device->UpdateSize; - - values[i++] = ALC_SYNC; - values[i++] = ALC_FALSE; - } - else - { - if(device->FmtChans == DevFmtAmbi3D) - { - values[i++] = ALC_AMBISONIC_LAYOUT_SOFT; - values[i++] = device->AmbiLayout; - - values[i++] = ALC_AMBISONIC_SCALING_SOFT; - values[i++] = device->AmbiScale; - - values[i++] = ALC_AMBISONIC_ORDER_SOFT; - values[i++] = device->AmbiOrder; - } - - values[i++] = ALC_FORMAT_CHANNELS_SOFT; - values[i++] = device->FmtChans; - - values[i++] = ALC_FORMAT_TYPE_SOFT; - values[i++] = device->FmtType; - } - - values[i++] = ALC_MONO_SOURCES; - values[i++] = device->NumMonoSources; - - values[i++] = ALC_STEREO_SOURCES; - values[i++] = device->NumStereoSources; - - values[i++] = ALC_MAX_AUXILIARY_SENDS; - values[i++] = device->NumAuxSends; - - values[i++] = ALC_HRTF_SOFT; - values[i++] = (device->HrtfHandle ? ALC_TRUE : ALC_FALSE); - - values[i++] = ALC_HRTF_STATUS_SOFT; - values[i++] = device->HrtfStatus; - - values[i++] = ALC_OUTPUT_LIMITER_SOFT; - values[i++] = device->Limiter ? ALC_TRUE : ALC_FALSE; - - values[i++] = ALC_MAX_AMBISONIC_ORDER_SOFT; - values[i++] = MAX_AMBI_ORDER; - almtx_unlock(&device->BackendLock); - - values[i++] = 0; - return i; - - case ALC_MAJOR_VERSION: - values[0] = alcMajorVersion; - return 1; - - case ALC_MINOR_VERSION: - values[0] = alcMinorVersion; - return 1; - - case ALC_EFX_MAJOR_VERSION: - values[0] = alcEFXMajorVersion; - return 1; - - case ALC_EFX_MINOR_VERSION: - values[0] = alcEFXMinorVersion; - return 1; - - case ALC_FREQUENCY: - values[0] = device->Frequency; - return 1; - - case ALC_REFRESH: - if(device->Type == Loopback) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - almtx_lock(&device->BackendLock); - values[0] = device->Frequency / device->UpdateSize; - almtx_unlock(&device->BackendLock); - return 1; - - case ALC_SYNC: - if(device->Type == Loopback) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - values[0] = ALC_FALSE; - return 1; - - case ALC_FORMAT_CHANNELS_SOFT: - if(device->Type != Loopback) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - values[0] = device->FmtChans; - return 1; - - case ALC_FORMAT_TYPE_SOFT: - if(device->Type != Loopback) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - values[0] = device->FmtType; - return 1; - - case ALC_AMBISONIC_LAYOUT_SOFT: - if(device->Type != Loopback || device->FmtChans != DevFmtAmbi3D) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - values[0] = device->AmbiLayout; - return 1; - - case ALC_AMBISONIC_SCALING_SOFT: - if(device->Type != Loopback || device->FmtChans != DevFmtAmbi3D) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - values[0] = device->AmbiScale; - return 1; - - case ALC_AMBISONIC_ORDER_SOFT: - if(device->Type != Loopback || device->FmtChans != DevFmtAmbi3D) - { - alcSetError(device, ALC_INVALID_DEVICE); - return 0; - } - values[0] = device->AmbiOrder; - return 1; - - case ALC_MONO_SOURCES: - values[0] = device->NumMonoSources; - return 1; - - case ALC_STEREO_SOURCES: - values[0] = device->NumStereoSources; - return 1; - - case ALC_MAX_AUXILIARY_SENDS: - values[0] = device->NumAuxSends; - return 1; - - case ALC_CONNECTED: - values[0] = ATOMIC_LOAD(&device->Connected, almemory_order_acquire); - return 1; - - case ALC_HRTF_SOFT: - values[0] = (device->HrtfHandle ? ALC_TRUE : ALC_FALSE); - return 1; - - case ALC_HRTF_STATUS_SOFT: - values[0] = device->HrtfStatus; - return 1; - - case ALC_NUM_HRTF_SPECIFIERS_SOFT: - almtx_lock(&device->BackendLock); - FreeHrtfList(&device->HrtfList); - device->HrtfList = EnumerateHrtf(device->DeviceName); - values[0] = (ALCint)VECTOR_SIZE(device->HrtfList); - almtx_unlock(&device->BackendLock); - return 1; - - case ALC_OUTPUT_LIMITER_SOFT: - values[0] = device->Limiter ? ALC_TRUE : ALC_FALSE; - return 1; - - case ALC_MAX_AMBISONIC_ORDER_SOFT: - values[0] = MAX_AMBI_ORDER; - return 1; - - default: - alcSetError(device, ALC_INVALID_ENUM); - return 0; - } - return 0; -} - -/* alcGetIntegerv - * - * Returns information about the device and the version of OpenAL - */ -ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) -{ - VerifyDevice(&device); - if(size <= 0 || values == NULL) - alcSetError(device, ALC_INVALID_VALUE); - else - GetIntegerv(device, param, size, values); - if(device) ALCdevice_DecRef(device); -} - -ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALCsizei size, ALCint64SOFT *values) -{ - ALCint *ivals; - ALsizei i; - - VerifyDevice(&device); - if(size <= 0 || values == NULL) - alcSetError(device, ALC_INVALID_VALUE); - else if(!device || device->Type == Capture) - { - ivals = malloc(size * sizeof(ALCint)); - size = GetIntegerv(device, pname, size, ivals); - for(i = 0;i < size;i++) - values[i] = ivals[i]; - free(ivals); - } - else /* render device */ - { - ClockLatency clock; - ALuint64 basecount; - ALuint samplecount; - ALuint refcount; - - switch(pname) - { - case ALC_ATTRIBUTES_SIZE: - *values = NumAttrsForDevice(device)+4; - break; - - case ALC_ALL_ATTRIBUTES: - if(size < NumAttrsForDevice(device)+4) - alcSetError(device, ALC_INVALID_VALUE); - else - { - i = 0; - almtx_lock(&device->BackendLock); - values[i++] = ALC_FREQUENCY; - values[i++] = device->Frequency; - - if(device->Type != Loopback) - { - values[i++] = ALC_REFRESH; - values[i++] = device->Frequency / device->UpdateSize; - - values[i++] = ALC_SYNC; - values[i++] = ALC_FALSE; - } - else - { - if(device->FmtChans == DevFmtAmbi3D) - { - values[i++] = ALC_AMBISONIC_LAYOUT_SOFT; - values[i++] = device->AmbiLayout; - - values[i++] = ALC_AMBISONIC_SCALING_SOFT; - values[i++] = device->AmbiScale; - - values[i++] = ALC_AMBISONIC_ORDER_SOFT; - values[i++] = device->AmbiOrder; - } - - values[i++] = ALC_FORMAT_CHANNELS_SOFT; - values[i++] = device->FmtChans; - - values[i++] = ALC_FORMAT_TYPE_SOFT; - values[i++] = device->FmtType; - } - - values[i++] = ALC_MONO_SOURCES; - values[i++] = device->NumMonoSources; - - values[i++] = ALC_STEREO_SOURCES; - values[i++] = device->NumStereoSources; - - values[i++] = ALC_MAX_AUXILIARY_SENDS; - values[i++] = device->NumAuxSends; - - values[i++] = ALC_HRTF_SOFT; - values[i++] = (device->HrtfHandle ? ALC_TRUE : ALC_FALSE); - - values[i++] = ALC_HRTF_STATUS_SOFT; - values[i++] = device->HrtfStatus; - - values[i++] = ALC_OUTPUT_LIMITER_SOFT; - values[i++] = device->Limiter ? ALC_TRUE : ALC_FALSE; - - clock = V0(device->Backend,getClockLatency)(); - values[i++] = ALC_DEVICE_CLOCK_SOFT; - values[i++] = clock.ClockTime; - - values[i++] = ALC_DEVICE_LATENCY_SOFT; - values[i++] = clock.Latency; - almtx_unlock(&device->BackendLock); - - values[i++] = 0; - } - break; - - case ALC_DEVICE_CLOCK_SOFT: - almtx_lock(&device->BackendLock); - do { - while(((refcount=ReadRef(&device->MixCount))&1) != 0) - althrd_yield(); - basecount = device->ClockBase; - samplecount = device->SamplesDone; - } while(refcount != ReadRef(&device->MixCount)); - *values = basecount + (samplecount*DEVICE_CLOCK_RES/device->Frequency); - almtx_unlock(&device->BackendLock); - break; - - case ALC_DEVICE_LATENCY_SOFT: - almtx_lock(&device->BackendLock); - clock = V0(device->Backend,getClockLatency)(); - almtx_unlock(&device->BackendLock); - *values = clock.Latency; - break; - - case ALC_DEVICE_CLOCK_LATENCY_SOFT: - if(size < 2) - alcSetError(device, ALC_INVALID_VALUE); - else - { - almtx_lock(&device->BackendLock); - clock = V0(device->Backend,getClockLatency)(); - almtx_unlock(&device->BackendLock); - values[0] = clock.ClockTime; - values[1] = clock.Latency; - } - break; - - default: - ivals = malloc(size * sizeof(ALCint)); - size = GetIntegerv(device, pname, size, ivals); - for(i = 0;i < size;i++) - values[i] = ivals[i]; - free(ivals); - break; - } - } - if(device) - ALCdevice_DecRef(device); -} - - -/* alcIsExtensionPresent - * - * Determines if there is support for a particular extension - */ -ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extName) -{ - ALCboolean bResult = ALC_FALSE; - - VerifyDevice(&device); - - if(!extName) - alcSetError(device, ALC_INVALID_VALUE); - else - { - size_t len = strlen(extName); - const char *ptr = (device ? alcExtensionList : alcNoDeviceExtList); - while(ptr && *ptr) - { - if(strncasecmp(ptr, extName, len) == 0 && - (ptr[len] == '\0' || isspace(ptr[len]))) - { - bResult = ALC_TRUE; - break; - } - if((ptr=strchr(ptr, ' ')) != NULL) - { - do { - ++ptr; - } while(isspace(*ptr)); - } - } - } - if(device) - ALCdevice_DecRef(device); - return bResult; -} - - -/* alcGetProcAddress - * - * Retrieves the function address for a particular extension function - */ -ALC_API ALCvoid* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcName) -{ - ALCvoid *ptr = NULL; - - if(!funcName) - { - VerifyDevice(&device); - alcSetError(device, ALC_INVALID_VALUE); - if(device) ALCdevice_DecRef(device); - } - else - { - size_t i = 0; - for(i = 0;i < COUNTOF(alcFunctions);i++) - { - if(strcmp(alcFunctions[i].funcName, funcName) == 0) - { - ptr = alcFunctions[i].address; - break; - } - } - } - - return ptr; -} - - -/* alcGetEnumValue - * - * Get the value for a particular ALC enumeration name - */ -ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumName) -{ - ALCenum val = 0; - - if(!enumName) - { - VerifyDevice(&device); - alcSetError(device, ALC_INVALID_VALUE); - if(device) ALCdevice_DecRef(device); - } - else - { - size_t i = 0; - for(i = 0;i < COUNTOF(alcEnumerations);i++) - { - if(strcmp(alcEnumerations[i].enumName, enumName) == 0) - { - val = alcEnumerations[i].value; - break; - } - } - } - - return val; -} - - -/* alcCreateContext - * - * Create and attach a context to the given device. - */ -ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrList) -{ - ALCcontext *ALContext; - ALfloat valf; - ALCenum err; - - /* Explicitly hold the list lock while taking the BackendLock in case the - * device is asynchronously destropyed, to ensure this new context is - * properly cleaned up after being made. - */ - LockLists(); - if(!VerifyDevice(&device) || device->Type == Capture || - !ATOMIC_LOAD(&device->Connected, almemory_order_relaxed)) - { - UnlockLists(); - alcSetError(device, ALC_INVALID_DEVICE); - if(device) ALCdevice_DecRef(device); - return NULL; - } - almtx_lock(&device->BackendLock); - UnlockLists(); - - ATOMIC_STORE_SEQ(&device->LastError, ALC_NO_ERROR); - - if(device->Type == Playback && DefaultEffect.type != AL_EFFECT_NULL) - ALContext = al_calloc(16, sizeof(ALCcontext)+sizeof(ALlistener)+sizeof(ALeffectslot)); - else - ALContext = al_calloc(16, sizeof(ALCcontext)+sizeof(ALlistener)); - if(!ALContext) - { - almtx_unlock(&device->BackendLock); - - alcSetError(device, ALC_OUT_OF_MEMORY); - ALCdevice_DecRef(device); - return NULL; - } - - InitRef(&ALContext->ref, 1); - ALContext->Listener = (ALlistener*)ALContext->_listener_mem; - ALContext->DefaultSlot = NULL; - - ALContext->Voices = NULL; - ALContext->VoiceCount = 0; - ALContext->MaxVoices = 0; - ATOMIC_INIT(&ALContext->ActiveAuxSlots, NULL); - ALContext->Device = device; - ATOMIC_INIT(&ALContext->next, NULL); - - if((err=UpdateDeviceParams(device, attrList)) != ALC_NO_ERROR) - { - almtx_unlock(&device->BackendLock); - - al_free(ALContext); - ALContext = NULL; - - alcSetError(device, err); - if(err == ALC_INVALID_DEVICE) - { - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "Device update failure"); - V0(device->Backend,unlock)(); - } - ALCdevice_DecRef(device); - return NULL; - } - AllocateVoices(ALContext, 256, device->NumAuxSends); - - if(DefaultEffect.type != AL_EFFECT_NULL && device->Type == Playback) - { - ALContext->DefaultSlot = (ALeffectslot*)(ALContext->_listener_mem + sizeof(ALlistener)); - if(InitEffectSlot(ALContext->DefaultSlot) == AL_NO_ERROR) - aluInitEffectPanning(ALContext->DefaultSlot); - else - { - ALContext->DefaultSlot = NULL; - ERR("Failed to initialize the default effect slot\n"); - } - } - - ALCdevice_IncRef(ALContext->Device); - InitContext(ALContext); - - if(ConfigValueFloat(alstr_get_cstr(device->DeviceName), NULL, "volume-adjust", &valf)) - { - if(!isfinite(valf)) - ERR("volume-adjust must be finite: %f\n", valf); - else - { - ALfloat db = clampf(valf, -24.0f, 24.0f); - if(db != valf) - WARN("volume-adjust clamped: %f, range: +/-%f\n", valf, 24.0f); - ALContext->GainBoost = powf(10.0f, db/20.0f); - TRACE("volume-adjust gain: %f\n", ALContext->GainBoost); - } - } - UpdateListenerProps(ALContext); - - { - ALCcontext *head = ATOMIC_LOAD_SEQ(&device->ContextList); - do { - ATOMIC_STORE(&ALContext->next, head, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&device->ContextList, &head, - ALContext) == 0); - } - almtx_unlock(&device->BackendLock); - - if(ALContext->DefaultSlot) - { - if(InitializeEffect(ALContext, ALContext->DefaultSlot, &DefaultEffect) == AL_NO_ERROR) - UpdateEffectSlotProps(ALContext->DefaultSlot, ALContext); - else - ERR("Failed to initialize the default effect\n"); - } - - ALCdevice_DecRef(device); - - TRACE("Created context %p\n", ALContext); - return ALContext; -} - -/* alcDestroyContext - * - * Remove a context from its device - */ -ALC_API ALCvoid ALC_APIENTRY alcDestroyContext(ALCcontext *context) -{ - ALCdevice *Device; - - LockLists(); - if(!VerifyContext(&context)) - { - UnlockLists(); - alcSetError(NULL, ALC_INVALID_CONTEXT); - return; - } - - Device = context->Device; - if(Device) - { - almtx_lock(&Device->BackendLock); - if(!ReleaseContext(context, Device)) - { - V0(Device->Backend,stop)(); - Device->Flags &= ~DEVICE_RUNNING; - } - almtx_unlock(&Device->BackendLock); - } - UnlockLists(); - - ALCcontext_DecRef(context); -} - - -/* alcGetCurrentContext - * - * Returns the currently active context on the calling thread - */ -ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void) -{ - ALCcontext *Context = altss_get(LocalContext); - if(!Context) Context = ATOMIC_LOAD_SEQ(&GlobalContext); - return Context; -} - -/* alcGetThreadContext - * - * Returns the currently active thread-local context - */ -ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void) -{ - return altss_get(LocalContext); -} - - -/* alcMakeContextCurrent - * - * Makes the given context the active process-wide context, and removes the - * thread-local context for the calling thread. - */ -ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context) -{ - /* context must be valid or NULL */ - if(context && !VerifyContext(&context)) - { - alcSetError(NULL, ALC_INVALID_CONTEXT); - return ALC_FALSE; - } - /* context's reference count is already incremented */ - context = ATOMIC_EXCHANGE_PTR_SEQ(&GlobalContext, context); - if(context) ALCcontext_DecRef(context); - - if((context=altss_get(LocalContext)) != NULL) - { - altss_set(LocalContext, NULL); - ALCcontext_DecRef(context); - } - - return ALC_TRUE; -} - -/* alcSetThreadContext - * - * Makes the given context the active context for the current thread - */ -ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context) -{ - ALCcontext *old; - - /* context must be valid or NULL */ - if(context && !VerifyContext(&context)) - { - alcSetError(NULL, ALC_INVALID_CONTEXT); - return ALC_FALSE; - } - /* context's reference count is already incremented */ - old = altss_get(LocalContext); - altss_set(LocalContext, context); - if(old) ALCcontext_DecRef(old); - - return ALC_TRUE; -} - - -/* alcGetContextsDevice - * - * Returns the device that a particular context is attached to - */ -ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *Context) -{ - ALCdevice *Device; - - if(!VerifyContext(&Context)) - { - alcSetError(NULL, ALC_INVALID_CONTEXT); - return NULL; - } - Device = Context->Device; - ALCcontext_DecRef(Context); - - return Device; -} - - -/* alcOpenDevice - * - * Opens the named device. - */ -ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) -{ - ALCbackendFactory *factory; - const ALCchar *fmt; - ALCdevice *device; - ALCenum err; - - DO_INITCONFIG(); - - if(!PlaybackBackend.name) - { - alcSetError(NULL, ALC_INVALID_VALUE); - return NULL; - } - - if(deviceName && (!deviceName[0] || strcasecmp(deviceName, alcDefaultName) == 0 || strcasecmp(deviceName, "openal-soft") == 0 -#ifdef _WIN32 - /* Some old Windows apps hardcode these expecting OpenAL to use a - * specific audio API, even when they're not enumerated. Creative's - * router effectively ignores them too. - */ - || strcasecmp(deviceName, "DirectSound3D") == 0 || strcasecmp(deviceName, "DirectSound") == 0 - || strcasecmp(deviceName, "MMSYSTEM") == 0 -#endif - )) - deviceName = NULL; - - device = al_calloc(16, sizeof(ALCdevice)); - if(!device) - { - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - //Validate device - InitDevice(device, Playback); - - //Set output format - device->FmtChans = DevFmtChannelsDefault; - device->FmtType = DevFmtTypeDefault; - device->Frequency = DEFAULT_OUTPUT_RATE; - device->IsHeadphones = AL_FALSE; - device->AmbiLayout = AmbiLayout_Default; - device->AmbiScale = AmbiNorm_Default; - device->NumUpdates = 3; - device->UpdateSize = 1024; - - device->SourcesMax = 256; - device->AuxiliaryEffectSlotMax = 64; - device->NumAuxSends = DEFAULT_SENDS; - - if(ConfigValueStr(deviceName, NULL, "channels", &fmt)) - { - static const struct { - const char name[16]; - enum DevFmtChannels chans; - ALsizei order; - } chanlist[] = { - { "mono", DevFmtMono, 0 }, - { "stereo", DevFmtStereo, 0 }, - { "quad", DevFmtQuad, 0 }, - { "surround51", DevFmtX51, 0 }, - { "surround61", DevFmtX61, 0 }, - { "surround71", DevFmtX71, 0 }, - { "surround51rear", DevFmtX51Rear, 0 }, - { "ambi1", DevFmtAmbi3D, 1 }, - { "ambi2", DevFmtAmbi3D, 2 }, - { "ambi3", DevFmtAmbi3D, 3 }, - }; - size_t i; - - for(i = 0;i < COUNTOF(chanlist);i++) - { - if(strcasecmp(chanlist[i].name, fmt) == 0) - { - device->FmtChans = chanlist[i].chans; - device->AmbiOrder = chanlist[i].order; - device->Flags |= DEVICE_CHANNELS_REQUEST; - break; - } - } - if(i == COUNTOF(chanlist)) - ERR("Unsupported channels: %s\n", fmt); - } - if(ConfigValueStr(deviceName, NULL, "sample-type", &fmt)) - { - static const struct { - const char name[16]; - enum DevFmtType type; - } typelist[] = { - { "int8", DevFmtByte }, - { "uint8", DevFmtUByte }, - { "int16", DevFmtShort }, - { "uint16", DevFmtUShort }, - { "int32", DevFmtInt }, - { "uint32", DevFmtUInt }, - { "float32", DevFmtFloat }, - }; - size_t i; - - for(i = 0;i < COUNTOF(typelist);i++) - { - if(strcasecmp(typelist[i].name, fmt) == 0) - { - device->FmtType = typelist[i].type; - device->Flags |= DEVICE_SAMPLE_TYPE_REQUEST; - break; - } - } - if(i == COUNTOF(typelist)) - ERR("Unsupported sample-type: %s\n", fmt); - } - - if(ConfigValueUInt(deviceName, NULL, "frequency", &device->Frequency)) - { - device->Flags |= DEVICE_FREQUENCY_REQUEST; - if(device->Frequency < MIN_OUTPUT_RATE) - ERR("%uhz request clamped to %uhz minimum\n", device->Frequency, MIN_OUTPUT_RATE); - device->Frequency = maxu(device->Frequency, MIN_OUTPUT_RATE); - } - - ConfigValueUInt(deviceName, NULL, "periods", &device->NumUpdates); - device->NumUpdates = clampu(device->NumUpdates, 2, 16); - - ConfigValueUInt(deviceName, NULL, "period_size", &device->UpdateSize); - device->UpdateSize = clampu(device->UpdateSize, 64, 8192); - if((CPUCapFlags&(CPU_CAP_SSE|CPU_CAP_NEON)) != 0) - device->UpdateSize = (device->UpdateSize+3)&~3; - - ConfigValueUInt(deviceName, NULL, "sources", &device->SourcesMax); - if(device->SourcesMax == 0) device->SourcesMax = 256; - - ConfigValueUInt(deviceName, NULL, "slots", &device->AuxiliaryEffectSlotMax); - if(device->AuxiliaryEffectSlotMax == 0) device->AuxiliaryEffectSlotMax = 64; - else device->AuxiliaryEffectSlotMax = minu(device->AuxiliaryEffectSlotMax, INT_MAX); - - if(ConfigValueInt(deviceName, NULL, "sends", &device->NumAuxSends)) - device->NumAuxSends = clampi( - DEFAULT_SENDS, 0, clampi(device->NumAuxSends, 0, MAX_SENDS) - ); - - device->NumStereoSources = 1; - device->NumMonoSources = device->SourcesMax - device->NumStereoSources; - - factory = PlaybackBackend.getFactory(); - device->Backend = V(factory,createBackend)(device, ALCbackend_Playback); - if(!device->Backend) - { - FreeDevice(device); - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - // Find a playback device to open - if((err=V(device->Backend,open)(deviceName)) != ALC_NO_ERROR) - { - FreeDevice(device); - alcSetError(NULL, err); - return NULL; - } - - if(ConfigValueStr(alstr_get_cstr(device->DeviceName), NULL, "ambi-format", &fmt)) - { - if(strcasecmp(fmt, "fuma") == 0) - { - device->AmbiLayout = AmbiLayout_FuMa; - device->AmbiScale = AmbiNorm_FuMa; - } - else if(strcasecmp(fmt, "acn+sn3d") == 0) - { - device->AmbiLayout = AmbiLayout_ACN; - device->AmbiScale = AmbiNorm_SN3D; - } - else if(strcasecmp(fmt, "acn+n3d") == 0) - { - device->AmbiLayout = AmbiLayout_ACN; - device->AmbiScale = AmbiNorm_N3D; - } - else - ERR("Unsupported ambi-format: %s\n", fmt); - } - - device->Limiter = CreateDeviceLimiter(device); - - { - ALCdevice *head = ATOMIC_LOAD_SEQ(&DeviceList); - do { - ATOMIC_STORE(&device->next, head, almemory_order_relaxed); - } while(!ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&DeviceList, &head, device)); - } - - TRACE("Created device %p, \"%s\"\n", device, alstr_get_cstr(device->DeviceName)); - return device; -} - -/* alcCloseDevice - * - * Closes the given device. - */ -ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) -{ - ALCdevice *iter, *origdev, *nextdev; - ALCcontext *ctx; - - LockLists(); - iter = ATOMIC_LOAD_SEQ(&DeviceList); - do { - if(iter == device) - break; - iter = ATOMIC_LOAD(&iter->next, almemory_order_relaxed); - } while(iter != NULL); - if(!iter || iter->Type == Capture) - { - alcSetError(iter, ALC_INVALID_DEVICE); - UnlockLists(); - return ALC_FALSE; - } - almtx_lock(&device->BackendLock); - - origdev = device; - nextdev = ATOMIC_LOAD(&device->next, almemory_order_relaxed); - if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&DeviceList, &origdev, nextdev)) - { - ALCdevice *list; - do { - list = origdev; - origdev = device; - } while(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&list->next, &origdev, nextdev)); - } - UnlockLists(); - - ctx = ATOMIC_LOAD_SEQ(&device->ContextList); - while(ctx != NULL) - { - ALCcontext *next = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); - WARN("Releasing context %p\n", ctx); - ReleaseContext(ctx, device); - ctx = next; - } - if((device->Flags&DEVICE_RUNNING)) - V0(device->Backend,stop)(); - device->Flags &= ~DEVICE_RUNNING; - almtx_unlock(&device->BackendLock); - - ALCdevice_DecRef(device); - - return ALC_TRUE; -} - - -/************************************************ - * ALC capture functions - ************************************************/ -ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, ALCuint frequency, ALCenum format, ALCsizei samples) -{ - ALCbackendFactory *factory; - ALCdevice *device = NULL; - ALCenum err; - - DO_INITCONFIG(); - - if(!CaptureBackend.name) - { - alcSetError(NULL, ALC_INVALID_VALUE); - return NULL; - } - - if(samples <= 0) - { - alcSetError(NULL, ALC_INVALID_VALUE); - return NULL; - } - - if(deviceName && (!deviceName[0] || strcasecmp(deviceName, alcDefaultName) == 0 || strcasecmp(deviceName, "openal-soft") == 0)) - deviceName = NULL; - - device = al_calloc(16, sizeof(ALCdevice)); - if(!device) - { - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - //Validate device - InitDevice(device, Capture); - - device->Frequency = frequency; - device->Flags |= DEVICE_FREQUENCY_REQUEST; - - if(DecomposeDevFormat(format, &device->FmtChans, &device->FmtType) == AL_FALSE) - { - FreeDevice(device); - alcSetError(NULL, ALC_INVALID_ENUM); - return NULL; - } - device->Flags |= DEVICE_CHANNELS_REQUEST | DEVICE_SAMPLE_TYPE_REQUEST; - device->IsHeadphones = AL_FALSE; - device->AmbiOrder = 0; - device->AmbiLayout = AmbiLayout_Default; - device->AmbiScale = AmbiNorm_Default; - - device->UpdateSize = samples; - device->NumUpdates = 1; - - factory = CaptureBackend.getFactory(); - device->Backend = V(factory,createBackend)(device, ALCbackend_Capture); - if(!device->Backend) - { - FreeDevice(device); - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - TRACE("Capture format: %s, %s, %uhz, %u update size x%d\n", - DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), - device->Frequency, device->UpdateSize, device->NumUpdates - ); - if((err=V(device->Backend,open)(deviceName)) != ALC_NO_ERROR) - { - FreeDevice(device); - alcSetError(NULL, err); - return NULL; - } - - { - ALCdevice *head = ATOMIC_LOAD_SEQ(&DeviceList); - do { - ATOMIC_STORE(&device->next, head, almemory_order_relaxed); - } while(!ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&DeviceList, &head, device)); - } - - TRACE("Created device %p, \"%s\"\n", device, alstr_get_cstr(device->DeviceName)); - return device; -} - -ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device) -{ - ALCdevice *iter, *origdev, *nextdev; - - LockLists(); - iter = ATOMIC_LOAD_SEQ(&DeviceList); - do { - if(iter == device) - break; - iter = ATOMIC_LOAD(&iter->next, almemory_order_relaxed); - } while(iter != NULL); - if(!iter || iter->Type != Capture) - { - alcSetError(iter, ALC_INVALID_DEVICE); - UnlockLists(); - return ALC_FALSE; - } - - origdev = device; - nextdev = ATOMIC_LOAD(&device->next, almemory_order_relaxed); - if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&DeviceList, &origdev, nextdev)) - { - ALCdevice *list; - do { - list = origdev; - origdev = device; - } while(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&list->next, &origdev, nextdev)); - } - UnlockLists(); - - almtx_lock(&device->BackendLock); - if((device->Flags&DEVICE_RUNNING)) - V0(device->Backend,stop)(); - device->Flags &= ~DEVICE_RUNNING; - almtx_unlock(&device->BackendLock); - - ALCdevice_DecRef(device); - - return ALC_TRUE; -} - -ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) -{ - if(!VerifyDevice(&device) || device->Type != Capture) - alcSetError(device, ALC_INVALID_DEVICE); - else - { - almtx_lock(&device->BackendLock); - if(!ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - alcSetError(device, ALC_INVALID_DEVICE); - else if(!(device->Flags&DEVICE_RUNNING)) - { - if(V0(device->Backend,start)()) - device->Flags |= DEVICE_RUNNING; - else - { - aluHandleDisconnect(device, "Device start failure"); - alcSetError(device, ALC_INVALID_DEVICE); - } - } - almtx_unlock(&device->BackendLock); - } - - if(device) ALCdevice_DecRef(device); -} - -ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device) -{ - if(!VerifyDevice(&device) || device->Type != Capture) - alcSetError(device, ALC_INVALID_DEVICE); - else - { - almtx_lock(&device->BackendLock); - if((device->Flags&DEVICE_RUNNING)) - V0(device->Backend,stop)(); - device->Flags &= ~DEVICE_RUNNING; - almtx_unlock(&device->BackendLock); - } - - if(device) ALCdevice_DecRef(device); -} - -ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) -{ - if(!VerifyDevice(&device) || device->Type != Capture) - alcSetError(device, ALC_INVALID_DEVICE); - else - { - ALCenum err = ALC_INVALID_VALUE; - - almtx_lock(&device->BackendLock); - if(samples >= 0 && V0(device->Backend,availableSamples)() >= (ALCuint)samples) - err = V(device->Backend,captureSamples)(buffer, samples); - almtx_unlock(&device->BackendLock); - - if(err != ALC_NO_ERROR) - alcSetError(device, err); - } - if(device) ALCdevice_DecRef(device); -} - - -/************************************************ - * ALC loopback functions - ************************************************/ - -/* alcLoopbackOpenDeviceSOFT - * - * Open a loopback device, for manual rendering. - */ -ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName) -{ - ALCbackendFactory *factory; - ALCdevice *device; - - DO_INITCONFIG(); - - /* Make sure the device name, if specified, is us. */ - if(deviceName && strcmp(deviceName, alcDefaultName) != 0) - { - alcSetError(NULL, ALC_INVALID_VALUE); - return NULL; - } - - device = al_calloc(16, sizeof(ALCdevice)); - if(!device) - { - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - //Validate device - InitDevice(device, Loopback); - - device->SourcesMax = 256; - device->AuxiliaryEffectSlotMax = 64; - device->NumAuxSends = DEFAULT_SENDS; - - //Set output format - device->NumUpdates = 0; - device->UpdateSize = 0; - - device->Frequency = DEFAULT_OUTPUT_RATE; - device->FmtChans = DevFmtChannelsDefault; - device->FmtType = DevFmtTypeDefault; - device->IsHeadphones = AL_FALSE; - device->AmbiLayout = AmbiLayout_Default; - device->AmbiScale = AmbiNorm_Default; - - ConfigValueUInt(NULL, NULL, "sources", &device->SourcesMax); - if(device->SourcesMax == 0) device->SourcesMax = 256; - - ConfigValueUInt(NULL, NULL, "slots", &device->AuxiliaryEffectSlotMax); - if(device->AuxiliaryEffectSlotMax == 0) device->AuxiliaryEffectSlotMax = 64; - else device->AuxiliaryEffectSlotMax = minu(device->AuxiliaryEffectSlotMax, INT_MAX); - - if(ConfigValueInt(NULL, NULL, "sends", &device->NumAuxSends)) - device->NumAuxSends = clampi( - DEFAULT_SENDS, 0, clampi(device->NumAuxSends, 0, MAX_SENDS) - ); - - device->NumStereoSources = 1; - device->NumMonoSources = device->SourcesMax - device->NumStereoSources; - - factory = ALCloopbackFactory_getFactory(); - device->Backend = V(factory,createBackend)(device, ALCbackend_Loopback); - if(!device->Backend) - { - al_free(device); - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - // Open the "backend" - V(device->Backend,open)("Loopback"); - - device->Limiter = CreateDeviceLimiter(device); - - { - ALCdevice *head = ATOMIC_LOAD_SEQ(&DeviceList); - do { - ATOMIC_STORE(&device->next, head, almemory_order_relaxed); - } while(!ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&DeviceList, &head, device)); - } - - TRACE("Created device %p\n", device); - return device; -} - -/* alcIsRenderFormatSupportedSOFT - * - * Determines if the loopback device supports the given format for rendering. - */ -ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type) -{ - ALCboolean ret = ALC_FALSE; - - if(!VerifyDevice(&device) || device->Type != Loopback) - alcSetError(device, ALC_INVALID_DEVICE); - else if(freq <= 0) - alcSetError(device, ALC_INVALID_VALUE); - else - { - if(IsValidALCType(type) && IsValidALCChannels(channels) && freq >= MIN_OUTPUT_RATE) - ret = ALC_TRUE; - } - if(device) ALCdevice_DecRef(device); - - return ret; -} - -/* alcRenderSamplesSOFT - * - * Renders some samples into a buffer, using the format last set by the - * attributes given to alcCreateContext. - */ -FORCE_ALIGN ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) -{ - if(!VerifyDevice(&device) || device->Type != Loopback) - alcSetError(device, ALC_INVALID_DEVICE); - else if(samples < 0 || (samples > 0 && buffer == NULL)) - alcSetError(device, ALC_INVALID_VALUE); - else - { - V0(device->Backend,lock)(); - aluMixData(device, buffer, samples); - V0(device->Backend,unlock)(); - } - if(device) ALCdevice_DecRef(device); -} - - -/************************************************ - * ALC DSP pause/resume functions - ************************************************/ - -/* alcDevicePauseSOFT - * - * Pause the DSP to stop audio processing. - */ -ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device) -{ - if(!VerifyDevice(&device) || device->Type != Playback) - alcSetError(device, ALC_INVALID_DEVICE); - else - { - almtx_lock(&device->BackendLock); - if((device->Flags&DEVICE_RUNNING)) - V0(device->Backend,stop)(); - device->Flags &= ~DEVICE_RUNNING; - device->Flags |= DEVICE_PAUSED; - almtx_unlock(&device->BackendLock); - } - if(device) ALCdevice_DecRef(device); -} - -/* alcDeviceResumeSOFT - * - * Resume the DSP to restart audio processing. - */ -ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device) -{ - if(!VerifyDevice(&device) || device->Type != Playback) - alcSetError(device, ALC_INVALID_DEVICE); - else - { - almtx_lock(&device->BackendLock); - if((device->Flags&DEVICE_PAUSED)) - { - device->Flags &= ~DEVICE_PAUSED; - if(ATOMIC_LOAD_SEQ(&device->ContextList) != NULL) - { - if(V0(device->Backend,start)() != ALC_FALSE) - device->Flags |= DEVICE_RUNNING; - else - { - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "Device start failure"); - V0(device->Backend,unlock)(); - alcSetError(device, ALC_INVALID_DEVICE); - } - } - } - almtx_unlock(&device->BackendLock); - } - if(device) ALCdevice_DecRef(device); -} - - -/************************************************ - * ALC HRTF functions - ************************************************/ - -/* alcGetStringiSOFT - * - * Gets a string parameter at the given index. - */ -ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum paramName, ALCsizei index) -{ - const ALCchar *str = NULL; - - if(!VerifyDevice(&device) || device->Type == Capture) - alcSetError(device, ALC_INVALID_DEVICE); - else switch(paramName) - { - case ALC_HRTF_SPECIFIER_SOFT: - if(index >= 0 && (size_t)index < VECTOR_SIZE(device->HrtfList)) - str = alstr_get_cstr(VECTOR_ELEM(device->HrtfList, index).name); - else - alcSetError(device, ALC_INVALID_VALUE); - break; - - default: - alcSetError(device, ALC_INVALID_ENUM); - break; - } - if(device) ALCdevice_DecRef(device); - - return str; -} - -/* alcResetDeviceSOFT - * - * Resets the given device output, using the specified attribute list. - */ -ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs) -{ - ALCenum err; - - LockLists(); - if(!VerifyDevice(&device) || device->Type == Capture || - !ATOMIC_LOAD(&device->Connected, almemory_order_relaxed)) - { - UnlockLists(); - alcSetError(device, ALC_INVALID_DEVICE); - if(device) ALCdevice_DecRef(device); - return ALC_FALSE; - } - almtx_lock(&device->BackendLock); - UnlockLists(); - - err = UpdateDeviceParams(device, attribs); - almtx_unlock(&device->BackendLock); - - if(err != ALC_NO_ERROR) - { - alcSetError(device, err); - if(err == ALC_INVALID_DEVICE) - { - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "Device start failure"); - V0(device->Backend,unlock)(); - } - ALCdevice_DecRef(device); - return ALC_FALSE; - } - ALCdevice_DecRef(device); - - return ALC_TRUE; -} diff --git a/Alc/ALu.c b/Alc/ALu.c deleted file mode 100644 index e5203d6..0000000 --- a/Alc/ALu.c +++ /dev/null @@ -1,1902 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "alSource.h" -#include "alBuffer.h" -#include "alListener.h" -#include "alAuxEffectSlot.h" -#include "alu.h" -#include "bs2b.h" -#include "hrtf.h" -#include "mastering.h" -#include "uhjfilter.h" -#include "bformatdec.h" -#include "static_assert.h" -#include "ringbuffer.h" -#include "filters/splitter.h" - -#include "mixer/defs.h" -#include "fpu_modes.h" -#include "cpu_caps.h" -#include "bsinc_inc.h" - -#include "backends/base.h" - - -extern inline ALfloat minf(ALfloat a, ALfloat b); -extern inline ALfloat maxf(ALfloat a, ALfloat b); -extern inline ALfloat clampf(ALfloat val, ALfloat min, ALfloat max); - -extern inline ALdouble mind(ALdouble a, ALdouble b); -extern inline ALdouble maxd(ALdouble a, ALdouble b); -extern inline ALdouble clampd(ALdouble val, ALdouble min, ALdouble max); - -extern inline ALuint minu(ALuint a, ALuint b); -extern inline ALuint maxu(ALuint a, ALuint b); -extern inline ALuint clampu(ALuint val, ALuint min, ALuint max); - -extern inline ALint mini(ALint a, ALint b); -extern inline ALint maxi(ALint a, ALint b); -extern inline ALint clampi(ALint val, ALint min, ALint max); - -extern inline ALint64 mini64(ALint64 a, ALint64 b); -extern inline ALint64 maxi64(ALint64 a, ALint64 b); -extern inline ALint64 clampi64(ALint64 val, ALint64 min, ALint64 max); - -extern inline ALuint64 minu64(ALuint64 a, ALuint64 b); -extern inline ALuint64 maxu64(ALuint64 a, ALuint64 b); -extern inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max); - -extern inline size_t minz(size_t a, size_t b); -extern inline size_t maxz(size_t a, size_t b); -extern inline size_t clampz(size_t val, size_t min, size_t max); - -extern inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu); -extern inline ALfloat cubic(ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat mu); - -extern inline void aluVectorSet(aluVector *restrict vector, ALfloat x, ALfloat y, ALfloat z, ALfloat w); - -extern inline void aluMatrixfSetRow(aluMatrixf *matrix, ALuint row, - ALfloat m0, ALfloat m1, ALfloat m2, ALfloat m3); -extern inline void aluMatrixfSet(aluMatrixf *matrix, - ALfloat m00, ALfloat m01, ALfloat m02, ALfloat m03, - ALfloat m10, ALfloat m11, ALfloat m12, ALfloat m13, - ALfloat m20, ALfloat m21, ALfloat m22, ALfloat m23, - ALfloat m30, ALfloat m31, ALfloat m32, ALfloat m33); - - -/* Cone scalar */ -ALfloat ConeScale = 1.0f; - -/* Localized Z scalar for mono sources */ -ALfloat ZScale = 1.0f; - -/* Force default speed of sound for distance-related reverb decay. */ -ALboolean OverrideReverbSpeedOfSound = AL_FALSE; - -const aluMatrixf IdentityMatrixf = {{ - { 1.0f, 0.0f, 0.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f, 1.0f }, -}}; - - -static void ClearArray(ALfloat f[MAX_OUTPUT_CHANNELS]) -{ - size_t i; - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - f[i] = 0.0f; -} - -struct ChanMap { - enum Channel channel; - ALfloat angle; - ALfloat elevation; -}; - -static HrtfDirectMixerFunc MixDirectHrtf = MixDirectHrtf_C; - - -void DeinitVoice(ALvoice *voice) -{ - al_free(ATOMIC_EXCHANGE_PTR_SEQ(&voice->Update, NULL)); -} - - -static inline HrtfDirectMixerFunc SelectHrtfMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixDirectHrtf_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixDirectHrtf_SSE; -#endif - - return MixDirectHrtf_C; -} - - -/* This RNG method was created based on the math found in opusdec. It's quick, - * and starting with a seed value of 22222, is suitable for generating - * whitenoise. - */ -static inline ALuint dither_rng(ALuint *seed) -{ - *seed = (*seed * 96314165) + 907633515; - return *seed; -} - - -static inline void aluCrossproduct(const ALfloat *inVector1, const ALfloat *inVector2, ALfloat *outVector) -{ - outVector[0] = inVector1[1]*inVector2[2] - inVector1[2]*inVector2[1]; - outVector[1] = inVector1[2]*inVector2[0] - inVector1[0]*inVector2[2]; - outVector[2] = inVector1[0]*inVector2[1] - inVector1[1]*inVector2[0]; -} - -static inline ALfloat aluDotproduct(const aluVector *vec1, const aluVector *vec2) -{ - return vec1->v[0]*vec2->v[0] + vec1->v[1]*vec2->v[1] + vec1->v[2]*vec2->v[2]; -} - -static ALfloat aluNormalize(ALfloat *vec) -{ - ALfloat length = sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); - if(length > FLT_EPSILON) - { - ALfloat inv_length = 1.0f/length; - vec[0] *= inv_length; - vec[1] *= inv_length; - vec[2] *= inv_length; - return length; - } - vec[0] = vec[1] = vec[2] = 0.0f; - return 0.0f; -} - -static void aluMatrixfFloat3(ALfloat *vec, ALfloat w, const aluMatrixf *mtx) -{ - ALfloat v[4] = { vec[0], vec[1], vec[2], w }; - - vec[0] = v[0]*mtx->m[0][0] + v[1]*mtx->m[1][0] + v[2]*mtx->m[2][0] + v[3]*mtx->m[3][0]; - vec[1] = v[0]*mtx->m[0][1] + v[1]*mtx->m[1][1] + v[2]*mtx->m[2][1] + v[3]*mtx->m[3][1]; - vec[2] = v[0]*mtx->m[0][2] + v[1]*mtx->m[1][2] + v[2]*mtx->m[2][2] + v[3]*mtx->m[3][2]; -} - -static aluVector aluMatrixfVector(const aluMatrixf *mtx, const aluVector *vec) -{ - aluVector v; - v.v[0] = vec->v[0]*mtx->m[0][0] + vec->v[1]*mtx->m[1][0] + vec->v[2]*mtx->m[2][0] + vec->v[3]*mtx->m[3][0]; - v.v[1] = vec->v[0]*mtx->m[0][1] + vec->v[1]*mtx->m[1][1] + vec->v[2]*mtx->m[2][1] + vec->v[3]*mtx->m[3][1]; - v.v[2] = vec->v[0]*mtx->m[0][2] + vec->v[1]*mtx->m[1][2] + vec->v[2]*mtx->m[2][2] + vec->v[3]*mtx->m[3][2]; - v.v[3] = vec->v[0]*mtx->m[0][3] + vec->v[1]*mtx->m[1][3] + vec->v[2]*mtx->m[2][3] + vec->v[3]*mtx->m[3][3]; - return v; -} - - -void aluInit(void) -{ - MixDirectHrtf = SelectHrtfMixer(); -} - - -static void SendSourceStoppedEvent(ALCcontext *context, ALuint id) -{ - ALbitfieldSOFT enabledevt; - AsyncEvent evt; - size_t strpos; - ALuint scale; - - enabledevt = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); - if(!(enabledevt&EventType_SourceStateChange)) return; - - evt.EnumType = EventType_SourceStateChange; - evt.Type = AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT; - evt.ObjectId = id; - evt.Param = AL_STOPPED; - - /* Normally snprintf would be used, but this is called from the mixer and - * that function's not real-time safe, so we have to construct it manually. - */ - strcpy(evt.Message, "Source ID "); strpos = 10; - scale = 1000000000; - while(scale > 0 && scale > id) - scale /= 10; - while(scale > 0) - { - evt.Message[strpos++] = '0' + ((id/scale)%10); - scale /= 10; - } - strcpy(evt.Message+strpos, " state changed to AL_STOPPED"); - - if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) - alsem_post(&context->EventSem); -} - - -static void ProcessHrtf(ALCdevice *device, ALsizei SamplesToDo) -{ - DirectHrtfState *state; - int lidx, ridx; - ALsizei c; - - if(device->AmbiUp) - ambiup_process(device->AmbiUp, - device->Dry.Buffer, device->Dry.NumChannels, device->FOAOut.Buffer, - SamplesToDo - ); - - lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); - ridx = GetChannelIdxByName(&device->RealOut, FrontRight); - assert(lidx != -1 && ridx != -1); - - state = device->Hrtf; - for(c = 0;c < device->Dry.NumChannels;c++) - { - MixDirectHrtf(device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], - device->Dry.Buffer[c], state->Offset, state->IrSize, - state->Chan[c].Coeffs, state->Chan[c].Values, SamplesToDo - ); - } - state->Offset += SamplesToDo; -} - -static void ProcessAmbiDec(ALCdevice *device, ALsizei SamplesToDo) -{ - if(device->Dry.Buffer != device->FOAOut.Buffer) - bformatdec_upSample(device->AmbiDecoder, - device->Dry.Buffer, device->FOAOut.Buffer, device->FOAOut.NumChannels, - SamplesToDo - ); - bformatdec_process(device->AmbiDecoder, - device->RealOut.Buffer, device->RealOut.NumChannels, device->Dry.Buffer, - SamplesToDo - ); -} - -static void ProcessAmbiUp(ALCdevice *device, ALsizei SamplesToDo) -{ - ambiup_process(device->AmbiUp, - device->RealOut.Buffer, device->RealOut.NumChannels, device->FOAOut.Buffer, - SamplesToDo - ); -} - -static void ProcessUhj(ALCdevice *device, ALsizei SamplesToDo) -{ - int lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); - int ridx = GetChannelIdxByName(&device->RealOut, FrontRight); - assert(lidx != -1 && ridx != -1); - - /* Encode to stereo-compatible 2-channel UHJ output. */ - EncodeUhj2(device->Uhj_Encoder, - device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], - device->Dry.Buffer, SamplesToDo - ); -} - -static void ProcessBs2b(ALCdevice *device, ALsizei SamplesToDo) -{ - int lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); - int ridx = GetChannelIdxByName(&device->RealOut, FrontRight); - assert(lidx != -1 && ridx != -1); - - /* Apply binaural/crossfeed filter */ - bs2b_cross_feed(device->Bs2b, device->RealOut.Buffer[lidx], - device->RealOut.Buffer[ridx], SamplesToDo); -} - -void aluSelectPostProcess(ALCdevice *device) -{ - if(device->HrtfHandle) - device->PostProcess = ProcessHrtf; - else if(device->AmbiDecoder) - device->PostProcess = ProcessAmbiDec; - else if(device->AmbiUp) - device->PostProcess = ProcessAmbiUp; - else if(device->Uhj_Encoder) - device->PostProcess = ProcessUhj; - else if(device->Bs2b) - device->PostProcess = ProcessBs2b; - else - device->PostProcess = NULL; -} - - -/* Prepares the interpolator for a given rate (determined by increment). - * - * With a bit of work, and a trade of memory for CPU cost, this could be - * modified for use with an interpolated increment for buttery-smooth pitch - * changes. - */ -void BsincPrepare(const ALuint increment, BsincState *state, const BSincTable *table) -{ - ALfloat sf = 0.0f; - ALsizei si = BSINC_SCALE_COUNT-1; - - if(increment > FRACTIONONE) - { - sf = (ALfloat)FRACTIONONE / increment; - sf = maxf(0.0f, (BSINC_SCALE_COUNT-1) * (sf-table->scaleBase) * table->scaleRange); - si = float2int(sf); - /* The interpolation factor is fit to this diagonally-symmetric curve - * to reduce the transition ripple caused by interpolating different - * scales of the sinc function. - */ - sf = 1.0f - cosf(asinf(sf - si)); - } - - state->sf = sf; - state->m = table->m[si]; - state->l = -((state->m/2) - 1); - state->filter = table->Tab + table->filterOffset[si]; -} - - -static bool CalcContextParams(ALCcontext *Context) -{ - ALlistener *Listener = Context->Listener; - struct ALcontextProps *props; - - props = ATOMIC_EXCHANGE_PTR(&Context->Update, NULL, almemory_order_acq_rel); - if(!props) return false; - - Listener->Params.MetersPerUnit = props->MetersPerUnit; - - Listener->Params.DopplerFactor = props->DopplerFactor; - Listener->Params.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity; - if(!OverrideReverbSpeedOfSound) - Listener->Params.ReverbSpeedOfSound = Listener->Params.SpeedOfSound * - Listener->Params.MetersPerUnit; - - Listener->Params.SourceDistanceModel = props->SourceDistanceModel; - Listener->Params.DistanceModel = props->DistanceModel; - - ATOMIC_REPLACE_HEAD(struct ALcontextProps*, &Context->FreeContextProps, props); - return true; -} - -static bool CalcListenerParams(ALCcontext *Context) -{ - ALlistener *Listener = Context->Listener; - ALfloat N[3], V[3], U[3], P[3]; - struct ALlistenerProps *props; - aluVector vel; - - props = ATOMIC_EXCHANGE_PTR(&Listener->Update, NULL, almemory_order_acq_rel); - if(!props) return false; - - /* AT then UP */ - N[0] = props->Forward[0]; - N[1] = props->Forward[1]; - N[2] = props->Forward[2]; - aluNormalize(N); - V[0] = props->Up[0]; - V[1] = props->Up[1]; - V[2] = props->Up[2]; - aluNormalize(V); - /* Build and normalize right-vector */ - aluCrossproduct(N, V, U); - aluNormalize(U); - - aluMatrixfSet(&Listener->Params.Matrix, - U[0], V[0], -N[0], 0.0, - U[1], V[1], -N[1], 0.0, - U[2], V[2], -N[2], 0.0, - 0.0, 0.0, 0.0, 1.0 - ); - - P[0] = props->Position[0]; - P[1] = props->Position[1]; - P[2] = props->Position[2]; - aluMatrixfFloat3(P, 1.0, &Listener->Params.Matrix); - aluMatrixfSetRow(&Listener->Params.Matrix, 3, -P[0], -P[1], -P[2], 1.0f); - - aluVectorSet(&vel, props->Velocity[0], props->Velocity[1], props->Velocity[2], 0.0f); - Listener->Params.Velocity = aluMatrixfVector(&Listener->Params.Matrix, &vel); - - Listener->Params.Gain = props->Gain * Context->GainBoost; - - ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &Context->FreeListenerProps, props); - return true; -} - -static bool CalcEffectSlotParams(ALeffectslot *slot, ALCcontext *context, bool force) -{ - struct ALeffectslotProps *props; - ALeffectState *state; - - props = ATOMIC_EXCHANGE_PTR(&slot->Update, NULL, almemory_order_acq_rel); - if(!props && !force) return false; - - if(props) - { - slot->Params.Gain = props->Gain; - slot->Params.AuxSendAuto = props->AuxSendAuto; - slot->Params.EffectType = props->Type; - slot->Params.EffectProps = props->Props; - if(IsReverbEffect(props->Type)) - { - slot->Params.RoomRolloff = props->Props.Reverb.RoomRolloffFactor; - slot->Params.DecayTime = props->Props.Reverb.DecayTime; - slot->Params.DecayLFRatio = props->Props.Reverb.DecayLFRatio; - slot->Params.DecayHFRatio = props->Props.Reverb.DecayHFRatio; - slot->Params.DecayHFLimit = props->Props.Reverb.DecayHFLimit; - slot->Params.AirAbsorptionGainHF = props->Props.Reverb.AirAbsorptionGainHF; - } - else - { - slot->Params.RoomRolloff = 0.0f; - slot->Params.DecayTime = 0.0f; - slot->Params.DecayLFRatio = 0.0f; - slot->Params.DecayHFRatio = 0.0f; - slot->Params.DecayHFLimit = AL_FALSE; - slot->Params.AirAbsorptionGainHF = 1.0f; - } - - /* Swap effect states. No need to play with the ref counts since they - * keep the same number of refs. - */ - state = props->State; - props->State = slot->Params.EffectState; - slot->Params.EffectState = state; - - ATOMIC_REPLACE_HEAD(struct ALeffectslotProps*, &context->FreeEffectslotProps, props); - } - else - state = slot->Params.EffectState; - - V(state,update)(context, slot, &slot->Params.EffectProps); - return true; -} - - -static const struct ChanMap MonoMap[1] = { - { FrontCenter, 0.0f, 0.0f } -}, RearMap[2] = { - { BackLeft, DEG2RAD(-150.0f), DEG2RAD(0.0f) }, - { BackRight, DEG2RAD( 150.0f), DEG2RAD(0.0f) } -}, QuadMap[4] = { - { FrontLeft, DEG2RAD( -45.0f), DEG2RAD(0.0f) }, - { FrontRight, DEG2RAD( 45.0f), DEG2RAD(0.0f) }, - { BackLeft, DEG2RAD(-135.0f), DEG2RAD(0.0f) }, - { BackRight, DEG2RAD( 135.0f), DEG2RAD(0.0f) } -}, X51Map[6] = { - { FrontLeft, DEG2RAD( -30.0f), DEG2RAD(0.0f) }, - { FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) }, - { FrontCenter, DEG2RAD( 0.0f), DEG2RAD(0.0f) }, - { LFE, 0.0f, 0.0f }, - { SideLeft, DEG2RAD(-110.0f), DEG2RAD(0.0f) }, - { SideRight, DEG2RAD( 110.0f), DEG2RAD(0.0f) } -}, X61Map[7] = { - { FrontLeft, DEG2RAD(-30.0f), DEG2RAD(0.0f) }, - { FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) }, - { FrontCenter, DEG2RAD( 0.0f), DEG2RAD(0.0f) }, - { LFE, 0.0f, 0.0f }, - { BackCenter, DEG2RAD(180.0f), DEG2RAD(0.0f) }, - { SideLeft, DEG2RAD(-90.0f), DEG2RAD(0.0f) }, - { SideRight, DEG2RAD( 90.0f), DEG2RAD(0.0f) } -}, X71Map[8] = { - { FrontLeft, DEG2RAD( -30.0f), DEG2RAD(0.0f) }, - { FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) }, - { FrontCenter, DEG2RAD( 0.0f), DEG2RAD(0.0f) }, - { LFE, 0.0f, 0.0f }, - { BackLeft, DEG2RAD(-150.0f), DEG2RAD(0.0f) }, - { BackRight, DEG2RAD( 150.0f), DEG2RAD(0.0f) }, - { SideLeft, DEG2RAD( -90.0f), DEG2RAD(0.0f) }, - { SideRight, DEG2RAD( 90.0f), DEG2RAD(0.0f) } -}; - -static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev, - const ALfloat Distance, const ALfloat Spread, - const ALfloat DryGain, const ALfloat DryGainHF, - const ALfloat DryGainLF, const ALfloat *WetGain, - const ALfloat *WetGainLF, const ALfloat *WetGainHF, - ALeffectslot **SendSlots, const ALbuffer *Buffer, - const struct ALvoiceProps *props, const ALlistener *Listener, - const ALCdevice *Device) -{ - struct ChanMap StereoMap[2] = { - { FrontLeft, DEG2RAD(-30.0f), DEG2RAD(0.0f) }, - { FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) } - }; - bool DirectChannels = props->DirectChannels; - const ALsizei NumSends = Device->NumAuxSends; - const ALuint Frequency = Device->Frequency; - const struct ChanMap *chans = NULL; - ALsizei num_channels = 0; - bool isbformat = false; - ALfloat downmix_gain = 1.0f; - ALsizei c, i; - - switch(Buffer->FmtChannels) - { - case FmtMono: - chans = MonoMap; - num_channels = 1; - /* Mono buffers are never played direct. */ - DirectChannels = false; - break; - - case FmtStereo: - /* Convert counter-clockwise to clockwise. */ - StereoMap[0].angle = -props->StereoPan[0]; - StereoMap[1].angle = -props->StereoPan[1]; - - chans = StereoMap; - num_channels = 2; - downmix_gain = 1.0f / 2.0f; - break; - - case FmtRear: - chans = RearMap; - num_channels = 2; - downmix_gain = 1.0f / 2.0f; - break; - - case FmtQuad: - chans = QuadMap; - num_channels = 4; - downmix_gain = 1.0f / 4.0f; - break; - - case FmtX51: - chans = X51Map; - num_channels = 6; - /* NOTE: Excludes LFE. */ - downmix_gain = 1.0f / 5.0f; - break; - - case FmtX61: - chans = X61Map; - num_channels = 7; - /* NOTE: Excludes LFE. */ - downmix_gain = 1.0f / 6.0f; - break; - - case FmtX71: - chans = X71Map; - num_channels = 8; - /* NOTE: Excludes LFE. */ - downmix_gain = 1.0f / 7.0f; - break; - - case FmtBFormat2D: - num_channels = 3; - isbformat = true; - DirectChannels = false; - break; - - case FmtBFormat3D: - num_channels = 4; - isbformat = true; - DirectChannels = false; - break; - } - - for(c = 0;c < num_channels;c++) - { - memset(&voice->Direct.Params[c].Hrtf.Target, 0, - sizeof(voice->Direct.Params[c].Hrtf.Target)); - ClearArray(voice->Direct.Params[c].Gains.Target); - } - for(i = 0;i < NumSends;i++) - { - for(c = 0;c < num_channels;c++) - ClearArray(voice->Send[i].Params[c].Gains.Target); - } - - voice->Flags &= ~(VOICE_HAS_HRTF | VOICE_HAS_NFC); - if(isbformat) - { - /* Special handling for B-Format sources. */ - - if(Distance > FLT_EPSILON) - { - /* Panning a B-Format sound toward some direction is easy. Just pan - * the first (W) channel as a normal mono sound and silence the - * others. - */ - ALfloat coeffs[MAX_AMBI_COEFFS]; - - if(Device->AvgSpeakerDist > 0.0f) - { - ALfloat mdist = Distance * Listener->Params.MetersPerUnit; - ALfloat w0 = SPEEDOFSOUNDMETRESPERSEC / - (mdist * (ALfloat)Device->Frequency); - ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / - (Device->AvgSpeakerDist * (ALfloat)Device->Frequency); - /* Clamp w0 for really close distances, to prevent excessive - * bass. - */ - w0 = minf(w0, w1*4.0f); - - /* Only need to adjust the first channel of a B-Format source. */ - NfcFilterAdjust(&voice->Direct.Params[0].NFCtrlFilter, w0); - - for(i = 0;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = Device->Dry.NumChannelsPerOrder[i]; - voice->Flags |= VOICE_HAS_NFC; - } - - /* A scalar of 1.5 for plain stereo results in +/-60 degrees being - * moved to +/-90 degrees for direct right and left speaker - * responses. - */ - CalcAngleCoeffs((Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(Azi, 1.5f) : Azi, - Elev, Spread, coeffs); - - /* NOTE: W needs to be scaled by sqrt(2) due to FuMa normalization. */ - ComputeDryPanGains(&Device->Dry, coeffs, DryGain*1.414213562f, - voice->Direct.Params[0].Gains.Target); - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, - coeffs, WetGain[i]*1.414213562f, voice->Send[i].Params[0].Gains.Target - ); - } - } - else - { - /* Local B-Format sources have their XYZ channels rotated according - * to the orientation. - */ - const ALfloat sqrt_2 = sqrtf(2.0f); - const ALfloat sqrt_3 = sqrtf(3.0f); - ALfloat N[3], V[3], U[3]; - aluMatrixf matrix; - - if(Device->AvgSpeakerDist > 0.0f) - { - /* NOTE: The NFCtrlFilters were created with a w0 of 0, which - * is what we want for FOA input. The first channel may have - * been previously re-adjusted if panned, so reset it. - */ - NfcFilterAdjust(&voice->Direct.Params[0].NFCtrlFilter, 0.0f); - - voice->Direct.ChannelsPerOrder[0] = 1; - voice->Direct.ChannelsPerOrder[1] = mini(voice->Direct.Channels-1, 3); - for(i = 2;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = 0; - voice->Flags |= VOICE_HAS_NFC; - } - - /* AT then UP */ - N[0] = props->Orientation[0][0]; - N[1] = props->Orientation[0][1]; - N[2] = props->Orientation[0][2]; - aluNormalize(N); - V[0] = props->Orientation[1][0]; - V[1] = props->Orientation[1][1]; - V[2] = props->Orientation[1][2]; - aluNormalize(V); - if(!props->HeadRelative) - { - const aluMatrixf *lmatrix = &Listener->Params.Matrix; - aluMatrixfFloat3(N, 0.0f, lmatrix); - aluMatrixfFloat3(V, 0.0f, lmatrix); - } - /* Build and normalize right-vector */ - aluCrossproduct(N, V, U); - aluNormalize(U); - - /* Build a rotate + conversion matrix (FuMa -> ACN+N3D). NOTE: This - * matrix is transposed, for the inputs to align on the rows and - * outputs on the columns. - */ - aluMatrixfSet(&matrix, - // ACN0 ACN1 ACN2 ACN3 - sqrt_2, 0.0f, 0.0f, 0.0f, // Ambi W - 0.0f, -N[0]*sqrt_3, N[1]*sqrt_3, -N[2]*sqrt_3, // Ambi X - 0.0f, U[0]*sqrt_3, -U[1]*sqrt_3, U[2]*sqrt_3, // Ambi Y - 0.0f, -V[0]*sqrt_3, V[1]*sqrt_3, -V[2]*sqrt_3 // Ambi Z - ); - - voice->Direct.Buffer = Device->FOAOut.Buffer; - voice->Direct.Channels = Device->FOAOut.NumChannels; - for(c = 0;c < num_channels;c++) - ComputeFirstOrderGains(&Device->FOAOut, matrix.m[c], DryGain, - voice->Direct.Params[c].Gains.Target); - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - { - for(c = 0;c < num_channels;c++) - ComputeFirstOrderGainsBF(Slot->ChanMap, Slot->NumChannels, - matrix.m[c], WetGain[i], voice->Send[i].Params[c].Gains.Target - ); - } - } - } - } - else if(DirectChannels) - { - /* Direct source channels always play local. Skip the virtual channels - * and write inputs to the matching real outputs. - */ - voice->Direct.Buffer = Device->RealOut.Buffer; - voice->Direct.Channels = Device->RealOut.NumChannels; - - for(c = 0;c < num_channels;c++) - { - int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel); - if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain; - } - - /* Auxiliary sends still use normal channel panning since they mix to - * B-Format, which can't channel-match. - */ - for(c = 0;c < num_channels;c++) - { - ALfloat coeffs[MAX_AMBI_COEFFS]; - CalcAngleCoeffs(chans[c].angle, chans[c].elevation, 0.0f, coeffs); - - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, - coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target - ); - } - } - } - else if(Device->Render_Mode == HrtfRender) - { - /* Full HRTF rendering. Skip the virtual channels and render to the - * real outputs. - */ - voice->Direct.Buffer = Device->RealOut.Buffer; - voice->Direct.Channels = Device->RealOut.NumChannels; - - if(Distance > FLT_EPSILON) - { - ALfloat coeffs[MAX_AMBI_COEFFS]; - - /* Get the HRIR coefficients and delays just once, for the given - * source direction. - */ - GetHrtfCoeffs(Device->HrtfHandle, Elev, Azi, Spread, - voice->Direct.Params[0].Hrtf.Target.Coeffs, - voice->Direct.Params[0].Hrtf.Target.Delay); - voice->Direct.Params[0].Hrtf.Target.Gain = DryGain * downmix_gain; - - /* Remaining channels use the same results as the first. */ - for(c = 1;c < num_channels;c++) - { - /* Skip LFE */ - if(chans[c].channel != LFE) - voice->Direct.Params[c].Hrtf.Target = voice->Direct.Params[0].Hrtf.Target; - } - - /* Calculate the directional coefficients once, which apply to all - * input channels of the source sends. - */ - CalcAngleCoeffs(Azi, Elev, Spread, coeffs); - - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - for(c = 0;c < num_channels;c++) - { - /* Skip LFE */ - if(chans[c].channel != LFE) - ComputePanningGainsBF(Slot->ChanMap, - Slot->NumChannels, coeffs, WetGain[i] * downmix_gain, - voice->Send[i].Params[c].Gains.Target - ); - } - } - } - else - { - /* Local sources on HRTF play with each channel panned to its - * relative location around the listener, providing "virtual - * speaker" responses. - */ - for(c = 0;c < num_channels;c++) - { - ALfloat coeffs[MAX_AMBI_COEFFS]; - - if(chans[c].channel == LFE) - { - /* Skip LFE */ - continue; - } - - /* Get the HRIR coefficients and delays for this channel - * position. - */ - GetHrtfCoeffs(Device->HrtfHandle, - chans[c].elevation, chans[c].angle, Spread, - voice->Direct.Params[c].Hrtf.Target.Coeffs, - voice->Direct.Params[c].Hrtf.Target.Delay - ); - voice->Direct.Params[c].Hrtf.Target.Gain = DryGain; - - /* Normal panning for auxiliary sends. */ - CalcAngleCoeffs(chans[c].angle, chans[c].elevation, Spread, coeffs); - - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, - coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target - ); - } - } - } - - voice->Flags |= VOICE_HAS_HRTF; - } - else - { - /* Non-HRTF rendering. Use normal panning to the output. */ - - if(Distance > FLT_EPSILON) - { - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat w0 = 0.0f; - - /* Calculate NFC filter coefficient if needed. */ - if(Device->AvgSpeakerDist > 0.0f) - { - ALfloat mdist = Distance * Listener->Params.MetersPerUnit; - ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / - (Device->AvgSpeakerDist * (ALfloat)Device->Frequency); - w0 = SPEEDOFSOUNDMETRESPERSEC / - (mdist * (ALfloat)Device->Frequency); - /* Clamp w0 for really close distances, to prevent excessive - * bass. - */ - w0 = minf(w0, w1*4.0f); - - /* Adjust NFC filters. */ - for(c = 0;c < num_channels;c++) - NfcFilterAdjust(&voice->Direct.Params[c].NFCtrlFilter, w0); - - for(i = 0;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = Device->Dry.NumChannelsPerOrder[i]; - voice->Flags |= VOICE_HAS_NFC; - } - - /* Calculate the directional coefficients once, which apply to all - * input channels. - */ - CalcAngleCoeffs((Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(Azi, 1.5f) : Azi, - Elev, Spread, coeffs); - - for(c = 0;c < num_channels;c++) - { - /* Special-case LFE */ - if(chans[c].channel == LFE) - { - if(Device->Dry.Buffer == Device->RealOut.Buffer) - { - int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel); - if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain; - } - continue; - } - - ComputeDryPanGains(&Device->Dry, - coeffs, DryGain * downmix_gain, voice->Direct.Params[c].Gains.Target - ); - } - - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - for(c = 0;c < num_channels;c++) - { - /* Skip LFE */ - if(chans[c].channel != LFE) - ComputePanningGainsBF(Slot->ChanMap, - Slot->NumChannels, coeffs, WetGain[i] * downmix_gain, - voice->Send[i].Params[c].Gains.Target - ); - } - } - } - else - { - ALfloat w0 = 0.0f; - - if(Device->AvgSpeakerDist > 0.0f) - { - /* If the source distance is 0, set w0 to w1 to act as a pass- - * through. We still want to pass the signal through the - * filters so they keep an appropriate history, in case the - * source moves away from the listener. - */ - w0 = SPEEDOFSOUNDMETRESPERSEC / - (Device->AvgSpeakerDist * (ALfloat)Device->Frequency); - - for(c = 0;c < num_channels;c++) - NfcFilterAdjust(&voice->Direct.Params[c].NFCtrlFilter, w0); - - for(i = 0;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = Device->Dry.NumChannelsPerOrder[i]; - voice->Flags |= VOICE_HAS_NFC; - } - - for(c = 0;c < num_channels;c++) - { - ALfloat coeffs[MAX_AMBI_COEFFS]; - - /* Special-case LFE */ - if(chans[c].channel == LFE) - { - if(Device->Dry.Buffer == Device->RealOut.Buffer) - { - int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel); - if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain; - } - continue; - } - - CalcAngleCoeffs( - (Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(chans[c].angle, 3.0f) - : chans[c].angle, - chans[c].elevation, Spread, coeffs - ); - - ComputeDryPanGains(&Device->Dry, - coeffs, DryGain, voice->Direct.Params[c].Gains.Target - ); - for(i = 0;i < NumSends;i++) - { - const ALeffectslot *Slot = SendSlots[i]; - if(Slot) - ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, - coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target - ); - } - } - } - } - - { - ALfloat hfScale = props->Direct.HFReference / Frequency; - ALfloat lfScale = props->Direct.LFReference / Frequency; - ALfloat gainHF = maxf(DryGainHF, 0.001f); /* Limit -60dB */ - ALfloat gainLF = maxf(DryGainLF, 0.001f); - - voice->Direct.FilterType = AF_None; - if(gainHF != 1.0f) voice->Direct.FilterType |= AF_LowPass; - if(gainLF != 1.0f) voice->Direct.FilterType |= AF_HighPass; - BiquadFilter_setParams( - &voice->Direct.Params[0].LowPass, BiquadType_HighShelf, - gainHF, hfScale, calc_rcpQ_from_slope(gainHF, 1.0f) - ); - BiquadFilter_setParams( - &voice->Direct.Params[0].HighPass, BiquadType_LowShelf, - gainLF, lfScale, calc_rcpQ_from_slope(gainLF, 1.0f) - ); - for(c = 1;c < num_channels;c++) - { - BiquadFilter_copyParams(&voice->Direct.Params[c].LowPass, - &voice->Direct.Params[0].LowPass); - BiquadFilter_copyParams(&voice->Direct.Params[c].HighPass, - &voice->Direct.Params[0].HighPass); - } - } - for(i = 0;i < NumSends;i++) - { - ALfloat hfScale = props->Send[i].HFReference / Frequency; - ALfloat lfScale = props->Send[i].LFReference / Frequency; - ALfloat gainHF = maxf(WetGainHF[i], 0.001f); - ALfloat gainLF = maxf(WetGainLF[i], 0.001f); - - voice->Send[i].FilterType = AF_None; - if(gainHF != 1.0f) voice->Send[i].FilterType |= AF_LowPass; - if(gainLF != 1.0f) voice->Send[i].FilterType |= AF_HighPass; - BiquadFilter_setParams( - &voice->Send[i].Params[0].LowPass, BiquadType_HighShelf, - gainHF, hfScale, calc_rcpQ_from_slope(gainHF, 1.0f) - ); - BiquadFilter_setParams( - &voice->Send[i].Params[0].HighPass, BiquadType_LowShelf, - gainLF, lfScale, calc_rcpQ_from_slope(gainLF, 1.0f) - ); - for(c = 1;c < num_channels;c++) - { - BiquadFilter_copyParams(&voice->Send[i].Params[c].LowPass, - &voice->Send[i].Params[0].LowPass); - BiquadFilter_copyParams(&voice->Send[i].Params[c].HighPass, - &voice->Send[i].Params[0].HighPass); - } - } -} - -static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) -{ - const ALCdevice *Device = ALContext->Device; - const ALlistener *Listener = ALContext->Listener; - ALfloat DryGain, DryGainHF, DryGainLF; - ALfloat WetGain[MAX_SENDS]; - ALfloat WetGainHF[MAX_SENDS]; - ALfloat WetGainLF[MAX_SENDS]; - ALeffectslot *SendSlots[MAX_SENDS]; - ALfloat Pitch; - ALsizei i; - - voice->Direct.Buffer = Device->Dry.Buffer; - voice->Direct.Channels = Device->Dry.NumChannels; - for(i = 0;i < Device->NumAuxSends;i++) - { - SendSlots[i] = props->Send[i].Slot; - if(!SendSlots[i] && i == 0) - SendSlots[i] = ALContext->DefaultSlot; - if(!SendSlots[i] || SendSlots[i]->Params.EffectType == AL_EFFECT_NULL) - { - SendSlots[i] = NULL; - voice->Send[i].Buffer = NULL; - voice->Send[i].Channels = 0; - } - else - { - voice->Send[i].Buffer = SendSlots[i]->WetBuffer; - voice->Send[i].Channels = SendSlots[i]->NumChannels; - } - } - - /* Calculate the stepping value */ - Pitch = (ALfloat)ALBuffer->Frequency/(ALfloat)Device->Frequency * props->Pitch; - if(Pitch > (ALfloat)MAX_PITCH) - voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch * FRACTIONONE), 1); - if(props->Resampler == BSinc24Resampler) - BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc24); - else if(props->Resampler == BSinc12Resampler) - BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc12); - voice->Resampler = SelectResampler(props->Resampler); - - /* Calculate gains */ - DryGain = clampf(props->Gain, props->MinGain, props->MaxGain); - DryGain *= props->Direct.Gain * Listener->Params.Gain; - DryGain = minf(DryGain, GAIN_MIX_MAX); - DryGainHF = props->Direct.GainHF; - DryGainLF = props->Direct.GainLF; - for(i = 0;i < Device->NumAuxSends;i++) - { - WetGain[i] = clampf(props->Gain, props->MinGain, props->MaxGain); - WetGain[i] *= props->Send[i].Gain * Listener->Params.Gain; - WetGain[i] = minf(WetGain[i], GAIN_MIX_MAX); - WetGainHF[i] = props->Send[i].GainHF; - WetGainLF[i] = props->Send[i].GainLF; - } - - CalcPanningAndFilters(voice, 0.0f, 0.0f, 0.0f, 0.0f, DryGain, DryGainHF, DryGainLF, WetGain, - WetGainLF, WetGainHF, SendSlots, ALBuffer, props, Listener, Device); -} - -static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) -{ - const ALCdevice *Device = ALContext->Device; - const ALlistener *Listener = ALContext->Listener; - const ALsizei NumSends = Device->NumAuxSends; - aluVector Position, Velocity, Direction, SourceToListener; - ALfloat Distance, ClampedDist, DopplerFactor; - ALeffectslot *SendSlots[MAX_SENDS]; - ALfloat RoomRolloff[MAX_SENDS]; - ALfloat DecayDistance[MAX_SENDS]; - ALfloat DecayLFDistance[MAX_SENDS]; - ALfloat DecayHFDistance[MAX_SENDS]; - ALfloat DryGain, DryGainHF, DryGainLF; - ALfloat WetGain[MAX_SENDS]; - ALfloat WetGainHF[MAX_SENDS]; - ALfloat WetGainLF[MAX_SENDS]; - bool directional; - ALfloat ev, az; - ALfloat spread; - ALfloat Pitch; - ALint i; - - /* Set mixing buffers and get send parameters. */ - voice->Direct.Buffer = Device->Dry.Buffer; - voice->Direct.Channels = Device->Dry.NumChannels; - for(i = 0;i < NumSends;i++) - { - SendSlots[i] = props->Send[i].Slot; - if(!SendSlots[i] && i == 0) - SendSlots[i] = ALContext->DefaultSlot; - if(!SendSlots[i] || SendSlots[i]->Params.EffectType == AL_EFFECT_NULL) - { - SendSlots[i] = NULL; - RoomRolloff[i] = 0.0f; - DecayDistance[i] = 0.0f; - DecayLFDistance[i] = 0.0f; - DecayHFDistance[i] = 0.0f; - } - else if(SendSlots[i]->Params.AuxSendAuto) - { - RoomRolloff[i] = SendSlots[i]->Params.RoomRolloff + props->RoomRolloffFactor; - /* Calculate the distances to where this effect's decay reaches - * -60dB. - */ - DecayDistance[i] = SendSlots[i]->Params.DecayTime * - Listener->Params.ReverbSpeedOfSound; - DecayLFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayLFRatio; - DecayHFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayHFRatio; - if(SendSlots[i]->Params.DecayHFLimit) - { - ALfloat airAbsorption = SendSlots[i]->Params.AirAbsorptionGainHF; - if(airAbsorption < 1.0f) - { - /* Calculate the distance to where this effect's air - * absorption reaches -60dB, and limit the effect's HF - * decay distance (so it doesn't take any longer to decay - * than the air would allow). - */ - ALfloat absorb_dist = log10f(REVERB_DECAY_GAIN) / log10f(airAbsorption); - DecayHFDistance[i] = minf(absorb_dist, DecayHFDistance[i]); - } - } - } - else - { - /* If the slot's auxiliary send auto is off, the data sent to the - * effect slot is the same as the dry path, sans filter effects */ - RoomRolloff[i] = props->RolloffFactor; - DecayDistance[i] = 0.0f; - DecayLFDistance[i] = 0.0f; - DecayHFDistance[i] = 0.0f; - } - - if(!SendSlots[i]) - { - voice->Send[i].Buffer = NULL; - voice->Send[i].Channels = 0; - } - else - { - voice->Send[i].Buffer = SendSlots[i]->WetBuffer; - voice->Send[i].Channels = SendSlots[i]->NumChannels; - } - } - - /* Transform source to listener space (convert to head relative) */ - aluVectorSet(&Position, props->Position[0], props->Position[1], props->Position[2], 1.0f); - aluVectorSet(&Direction, props->Direction[0], props->Direction[1], props->Direction[2], 0.0f); - aluVectorSet(&Velocity, props->Velocity[0], props->Velocity[1], props->Velocity[2], 0.0f); - if(props->HeadRelative == AL_FALSE) - { - const aluMatrixf *Matrix = &Listener->Params.Matrix; - /* Transform source vectors */ - Position = aluMatrixfVector(Matrix, &Position); - Velocity = aluMatrixfVector(Matrix, &Velocity); - Direction = aluMatrixfVector(Matrix, &Direction); - } - else - { - const aluVector *lvelocity = &Listener->Params.Velocity; - /* Offset the source velocity to be relative of the listener velocity */ - Velocity.v[0] += lvelocity->v[0]; - Velocity.v[1] += lvelocity->v[1]; - Velocity.v[2] += lvelocity->v[2]; - } - - directional = aluNormalize(Direction.v) > 0.0f; - SourceToListener.v[0] = -Position.v[0]; - SourceToListener.v[1] = -Position.v[1]; - SourceToListener.v[2] = -Position.v[2]; - SourceToListener.v[3] = 0.0f; - Distance = aluNormalize(SourceToListener.v); - - /* Initial source gain */ - DryGain = props->Gain; - DryGainHF = 1.0f; - DryGainLF = 1.0f; - for(i = 0;i < NumSends;i++) - { - WetGain[i] = props->Gain; - WetGainHF[i] = 1.0f; - WetGainLF[i] = 1.0f; - } - - /* Calculate distance attenuation */ - ClampedDist = Distance; - - switch(Listener->Params.SourceDistanceModel ? - props->DistanceModel : Listener->Params.DistanceModel) - { - case InverseDistanceClamped: - ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance); - if(props->MaxDistance < props->RefDistance) - break; - /*fall-through*/ - case InverseDistance: - if(!(props->RefDistance > 0.0f)) - ClampedDist = props->RefDistance; - else - { - ALfloat dist = lerp(props->RefDistance, ClampedDist, props->RolloffFactor); - if(dist > 0.0f) DryGain *= props->RefDistance / dist; - for(i = 0;i < NumSends;i++) - { - dist = lerp(props->RefDistance, ClampedDist, RoomRolloff[i]); - if(dist > 0.0f) WetGain[i] *= props->RefDistance / dist; - } - } - break; - - case LinearDistanceClamped: - ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance); - if(props->MaxDistance < props->RefDistance) - break; - /*fall-through*/ - case LinearDistance: - if(!(props->MaxDistance != props->RefDistance)) - ClampedDist = props->RefDistance; - else - { - ALfloat attn = props->RolloffFactor * (ClampedDist-props->RefDistance) / - (props->MaxDistance-props->RefDistance); - DryGain *= maxf(1.0f - attn, 0.0f); - for(i = 0;i < NumSends;i++) - { - attn = RoomRolloff[i] * (ClampedDist-props->RefDistance) / - (props->MaxDistance-props->RefDistance); - WetGain[i] *= maxf(1.0f - attn, 0.0f); - } - } - break; - - case ExponentDistanceClamped: - ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance); - if(props->MaxDistance < props->RefDistance) - break; - /*fall-through*/ - case ExponentDistance: - if(!(ClampedDist > 0.0f && props->RefDistance > 0.0f)) - ClampedDist = props->RefDistance; - else - { - DryGain *= powf(ClampedDist/props->RefDistance, -props->RolloffFactor); - for(i = 0;i < NumSends;i++) - WetGain[i] *= powf(ClampedDist/props->RefDistance, -RoomRolloff[i]); - } - break; - - case DisableDistance: - ClampedDist = props->RefDistance; - break; - } - - /* Calculate directional soundcones */ - if(directional && props->InnerAngle < 360.0f) - { - ALfloat ConeVolume; - ALfloat ConeHF; - ALfloat Angle; - - Angle = acosf(aluDotproduct(&Direction, &SourceToListener)); - Angle = RAD2DEG(Angle * ConeScale * 2.0f); - if(!(Angle > props->InnerAngle)) - { - ConeVolume = 1.0f; - ConeHF = 1.0f; - } - else if(Angle < props->OuterAngle) - { - ALfloat scale = ( Angle-props->InnerAngle) / - (props->OuterAngle-props->InnerAngle); - ConeVolume = lerp(1.0f, props->OuterGain, scale); - ConeHF = lerp(1.0f, props->OuterGainHF, scale); - } - else - { - ConeVolume = props->OuterGain; - ConeHF = props->OuterGainHF; - } - - DryGain *= ConeVolume; - if(props->DryGainHFAuto) - DryGainHF *= ConeHF; - if(props->WetGainAuto) - { - for(i = 0;i < NumSends;i++) - WetGain[i] *= ConeVolume; - } - if(props->WetGainHFAuto) - { - for(i = 0;i < NumSends;i++) - WetGainHF[i] *= ConeHF; - } - } - - /* Apply gain and frequency filters */ - DryGain = clampf(DryGain, props->MinGain, props->MaxGain); - DryGain = minf(DryGain*props->Direct.Gain*Listener->Params.Gain, GAIN_MIX_MAX); - DryGainHF *= props->Direct.GainHF; - DryGainLF *= props->Direct.GainLF; - for(i = 0;i < NumSends;i++) - { - WetGain[i] = clampf(WetGain[i], props->MinGain, props->MaxGain); - WetGain[i] = minf(WetGain[i]*props->Send[i].Gain*Listener->Params.Gain, GAIN_MIX_MAX); - WetGainHF[i] *= props->Send[i].GainHF; - WetGainLF[i] *= props->Send[i].GainLF; - } - - /* Distance-based air absorption and initial send decay. */ - if(ClampedDist > props->RefDistance && props->RolloffFactor > 0.0f) - { - ALfloat meters_base = (ClampedDist-props->RefDistance) * props->RolloffFactor * - Listener->Params.MetersPerUnit; - if(props->AirAbsorptionFactor > 0.0f) - { - ALfloat hfattn = powf(AIRABSORBGAINHF, meters_base * props->AirAbsorptionFactor); - DryGainHF *= hfattn; - for(i = 0;i < NumSends;i++) - WetGainHF[i] *= hfattn; - } - - if(props->WetGainAuto) - { - /* Apply a decay-time transformation to the wet path, based on the - * source distance in meters. The initial decay of the reverb - * effect is calculated and applied to the wet path. - */ - for(i = 0;i < NumSends;i++) - { - ALfloat gain, gainhf, gainlf; - - if(!(DecayDistance[i] > 0.0f)) - continue; - - gain = powf(REVERB_DECAY_GAIN, meters_base/DecayDistance[i]); - WetGain[i] *= gain; - /* Yes, the wet path's air absorption is applied with - * WetGainAuto on, rather than WetGainHFAuto. - */ - if(gain > 0.0f) - { - gainhf = powf(REVERB_DECAY_GAIN, meters_base/DecayHFDistance[i]); - WetGainHF[i] *= minf(gainhf / gain, 1.0f); - gainlf = powf(REVERB_DECAY_GAIN, meters_base/DecayLFDistance[i]); - WetGainLF[i] *= minf(gainlf / gain, 1.0f); - } - } - } - } - - - /* Initial source pitch */ - Pitch = props->Pitch; - - /* Calculate velocity-based doppler effect */ - DopplerFactor = props->DopplerFactor * Listener->Params.DopplerFactor; - if(DopplerFactor > 0.0f) - { - const aluVector *lvelocity = &Listener->Params.Velocity; - const ALfloat SpeedOfSound = Listener->Params.SpeedOfSound; - ALfloat vss, vls; - - vss = aluDotproduct(&Velocity, &SourceToListener) * DopplerFactor; - vls = aluDotproduct(lvelocity, &SourceToListener) * DopplerFactor; - - if(!(vls < SpeedOfSound)) - { - /* Listener moving away from the source at the speed of sound. - * Sound waves can't catch it. - */ - Pitch = 0.0f; - } - else if(!(vss < SpeedOfSound)) - { - /* Source moving toward the listener at the speed of sound. Sound - * waves bunch up to extreme frequencies. - */ - Pitch = HUGE_VALF; - } - else - { - /* Source and listener movement is nominal. Calculate the proper - * doppler shift. - */ - Pitch *= (SpeedOfSound-vls) / (SpeedOfSound-vss); - } - } - - /* Adjust pitch based on the buffer and output frequencies, and calculate - * fixed-point stepping value. - */ - Pitch *= (ALfloat)ALBuffer->Frequency/(ALfloat)Device->Frequency; - if(Pitch > (ALfloat)MAX_PITCH) - voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch * FRACTIONONE), 1); - if(props->Resampler == BSinc24Resampler) - BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc24); - else if(props->Resampler == BSinc12Resampler) - BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc12); - voice->Resampler = SelectResampler(props->Resampler); - - if(Distance > 0.0f) - { - /* Clamp Y, in case rounding errors caused it to end up outside of - * -1...+1. - */ - ev = asinf(clampf(-SourceToListener.v[1], -1.0f, 1.0f)); - /* Double negation on Z cancels out; negate once for changing source- - * to-listener to listener-to-source, and again for right-handed coords - * with -Z in front. - */ - az = atan2f(-SourceToListener.v[0], SourceToListener.v[2]*ZScale); - } - else - ev = az = 0.0f; - - if(props->Radius > Distance) - spread = F_TAU - Distance/props->Radius*F_PI; - else if(Distance > 0.0f) - spread = asinf(props->Radius / Distance) * 2.0f; - else - spread = 0.0f; - - CalcPanningAndFilters(voice, az, ev, Distance, spread, DryGain, DryGainHF, DryGainLF, WetGain, - WetGainLF, WetGainHF, SendSlots, ALBuffer, props, Listener, Device); -} - -static void CalcSourceParams(ALvoice *voice, ALCcontext *context, bool force) -{ - ALbufferlistitem *BufferListItem; - struct ALvoiceProps *props; - - props = ATOMIC_EXCHANGE_PTR(&voice->Update, NULL, almemory_order_acq_rel); - if(!props && !force) return; - - if(props) - { - memcpy(voice->Props, props, - FAM_SIZE(struct ALvoiceProps, Send, context->Device->NumAuxSends) - ); - - ATOMIC_REPLACE_HEAD(struct ALvoiceProps*, &context->FreeVoiceProps, props); - } - props = voice->Props; - - BufferListItem = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - while(BufferListItem != NULL) - { - const ALbuffer *buffer = NULL; - ALsizei i = 0; - while(!buffer && i < BufferListItem->num_buffers) - buffer = BufferListItem->buffers[i]; - if(LIKELY(buffer)) - { - if(props->SpatializeMode == SpatializeOn || - (props->SpatializeMode == SpatializeAuto && buffer->FmtChannels == FmtMono)) - CalcAttnSourceParams(voice, props, buffer, context); - else - CalcNonAttnSourceParams(voice, props, buffer, context); - break; - } - BufferListItem = ATOMIC_LOAD(&BufferListItem->next, almemory_order_acquire); - } -} - - -static void ProcessParamUpdates(ALCcontext *ctx, const struct ALeffectslotArray *slots) -{ - ALvoice **voice, **voice_end; - ALsource *source; - ALsizei i; - - IncrementRef(&ctx->UpdateCount); - if(!ATOMIC_LOAD(&ctx->HoldUpdates, almemory_order_acquire)) - { - bool cforce = CalcContextParams(ctx); - bool force = CalcListenerParams(ctx) | cforce; - for(i = 0;i < slots->count;i++) - force |= CalcEffectSlotParams(slots->slot[i], ctx, cforce); - - voice = ctx->Voices; - voice_end = voice + ctx->VoiceCount; - for(;voice != voice_end;++voice) - { - source = ATOMIC_LOAD(&(*voice)->Source, almemory_order_acquire); - if(source) CalcSourceParams(*voice, ctx, force); - } - } - IncrementRef(&ctx->UpdateCount); -} - - -static void ApplyStablizer(FrontStablizer *Stablizer, ALfloat (*restrict Buffer)[BUFFERSIZE], - int lidx, int ridx, int cidx, ALsizei SamplesToDo, - ALsizei NumChannels) -{ - ALfloat (*restrict lsplit)[BUFFERSIZE] = ASSUME_ALIGNED(Stablizer->LSplit, 16); - ALfloat (*restrict rsplit)[BUFFERSIZE] = ASSUME_ALIGNED(Stablizer->RSplit, 16); - ALsizei i; - - /* Apply an all-pass to all channels, except the front-left and front- - * right, so they maintain the same relative phase. - */ - for(i = 0;i < NumChannels;i++) - { - if(i == lidx || i == ridx) - continue; - splitterap_process(&Stablizer->APFilter[i], Buffer[i], SamplesToDo); - } - - bandsplit_process(&Stablizer->LFilter, lsplit[1], lsplit[0], Buffer[lidx], SamplesToDo); - bandsplit_process(&Stablizer->RFilter, rsplit[1], rsplit[0], Buffer[ridx], SamplesToDo); - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat lfsum, hfsum; - ALfloat m, s, c; - - lfsum = lsplit[0][i] + rsplit[0][i]; - hfsum = lsplit[1][i] + rsplit[1][i]; - s = lsplit[0][i] + lsplit[1][i] - rsplit[0][i] - rsplit[1][i]; - - /* This pans the separate low- and high-frequency sums between being on - * the center channel and the left/right channels. The low-frequency - * sum is 1/3rd toward center (2/3rds on left/right) and the high- - * frequency sum is 1/4th toward center (3/4ths on left/right). These - * values can be tweaked. - */ - m = lfsum*cosf(1.0f/3.0f * F_PI_2) + hfsum*cosf(1.0f/4.0f * F_PI_2); - c = lfsum*sinf(1.0f/3.0f * F_PI_2) + hfsum*sinf(1.0f/4.0f * F_PI_2); - - /* The generated center channel signal adds to the existing signal, - * while the modified left and right channels replace. - */ - Buffer[lidx][i] = (m + s) * 0.5f; - Buffer[ridx][i] = (m - s) * 0.5f; - Buffer[cidx][i] += c * 0.5f; - } -} - -static void ApplyDistanceComp(ALfloat (*restrict Samples)[BUFFERSIZE], DistanceComp *distcomp, - ALfloat *restrict Values, ALsizei SamplesToDo, ALsizei numchans) -{ - ALsizei i, c; - - Values = ASSUME_ALIGNED(Values, 16); - for(c = 0;c < numchans;c++) - { - ALfloat *restrict inout = ASSUME_ALIGNED(Samples[c], 16); - const ALfloat gain = distcomp[c].Gain; - const ALsizei base = distcomp[c].Length; - ALfloat *restrict distbuf = ASSUME_ALIGNED(distcomp[c].Buffer, 16); - - if(base == 0) - { - if(gain < 1.0f) - { - for(i = 0;i < SamplesToDo;i++) - inout[i] *= gain; - } - continue; - } - - if(LIKELY(SamplesToDo >= base)) - { - for(i = 0;i < base;i++) - Values[i] = distbuf[i]; - for(;i < SamplesToDo;i++) - Values[i] = inout[i-base]; - memcpy(distbuf, &inout[SamplesToDo-base], base*sizeof(ALfloat)); - } - else - { - for(i = 0;i < SamplesToDo;i++) - Values[i] = distbuf[i]; - memmove(distbuf, distbuf+SamplesToDo, (base-SamplesToDo)*sizeof(ALfloat)); - memcpy(distbuf+base-SamplesToDo, inout, SamplesToDo*sizeof(ALfloat)); - } - for(i = 0;i < SamplesToDo;i++) - inout[i] = Values[i]*gain; - } -} - -static void ApplyDither(ALfloat (*restrict Samples)[BUFFERSIZE], ALuint *dither_seed, - const ALfloat quant_scale, const ALsizei SamplesToDo, - const ALsizei numchans) -{ - const ALfloat invscale = 1.0f / quant_scale; - ALuint seed = *dither_seed; - ALsizei c, i; - - ASSUME(numchans > 0); - ASSUME(SamplesToDo > 0); - - /* Dithering. Step 1, generate whitenoise (uniform distribution of random - * values between -1 and +1). Step 2 is to add the noise to the samples, - * before rounding and after scaling up to the desired quantization depth. - */ - for(c = 0;c < numchans;c++) - { - ALfloat *restrict samples = Samples[c]; - for(i = 0;i < SamplesToDo;i++) - { - ALfloat val = samples[i] * quant_scale; - ALuint rng0 = dither_rng(&seed); - ALuint rng1 = dither_rng(&seed); - val += (ALfloat)(rng0*(1.0/UINT_MAX) - rng1*(1.0/UINT_MAX)); - samples[i] = fast_roundf(val) * invscale; - } - } - *dither_seed = seed; -} - - -static inline ALfloat Conv_ALfloat(ALfloat val) -{ return val; } -static inline ALint Conv_ALint(ALfloat val) -{ - /* Floats have a 23-bit mantissa. There is an implied 1 bit in the mantissa - * along with the sign bit, giving 25 bits total, so [-16777216, +16777216] - * is the max value a normalized float can be scaled to before losing - * precision. - */ - return fastf2i(clampf(val*16777216.0f, -16777216.0f, 16777215.0f))<<7; -} -static inline ALshort Conv_ALshort(ALfloat val) -{ return fastf2i(clampf(val*32768.0f, -32768.0f, 32767.0f)); } -static inline ALbyte Conv_ALbyte(ALfloat val) -{ return fastf2i(clampf(val*128.0f, -128.0f, 127.0f)); } - -/* Define unsigned output variations. */ -#define DECL_TEMPLATE(T, func, O) \ -static inline T Conv_##T(ALfloat val) { return func(val)+O; } - -DECL_TEMPLATE(ALubyte, Conv_ALbyte, 128) -DECL_TEMPLATE(ALushort, Conv_ALshort, 32768) -DECL_TEMPLATE(ALuint, Conv_ALint, 2147483648u) - -#undef DECL_TEMPLATE - -#define DECL_TEMPLATE(T, A) \ -static void Write##A(const ALfloat (*restrict InBuffer)[BUFFERSIZE], \ - ALvoid *OutBuffer, ALsizei Offset, ALsizei SamplesToDo, \ - ALsizei numchans) \ -{ \ - ALsizei i, j; \ - \ - ASSUME(numchans > 0); \ - ASSUME(SamplesToDo > 0); \ - \ - for(j = 0;j < numchans;j++) \ - { \ - const ALfloat *restrict in = ASSUME_ALIGNED(InBuffer[j], 16); \ - T *restrict out = (T*)OutBuffer + Offset*numchans + j; \ - \ - for(i = 0;i < SamplesToDo;i++) \ - out[i*numchans] = Conv_##T(in[i]); \ - } \ -} - -DECL_TEMPLATE(ALfloat, F32) -DECL_TEMPLATE(ALuint, UI32) -DECL_TEMPLATE(ALint, I32) -DECL_TEMPLATE(ALushort, UI16) -DECL_TEMPLATE(ALshort, I16) -DECL_TEMPLATE(ALubyte, UI8) -DECL_TEMPLATE(ALbyte, I8) - -#undef DECL_TEMPLATE - - -void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples) -{ - ALsizei SamplesToDo; - ALsizei SamplesDone; - ALCcontext *ctx; - ALsizei i, c; - - START_MIXER_MODE(); - for(SamplesDone = 0;SamplesDone < NumSamples;) - { - SamplesToDo = mini(NumSamples-SamplesDone, BUFFERSIZE); - for(c = 0;c < device->Dry.NumChannels;c++) - memset(device->Dry.Buffer[c], 0, SamplesToDo*sizeof(ALfloat)); - if(device->Dry.Buffer != device->FOAOut.Buffer) - for(c = 0;c < device->FOAOut.NumChannels;c++) - memset(device->FOAOut.Buffer[c], 0, SamplesToDo*sizeof(ALfloat)); - if(device->Dry.Buffer != device->RealOut.Buffer) - for(c = 0;c < device->RealOut.NumChannels;c++) - memset(device->RealOut.Buffer[c], 0, SamplesToDo*sizeof(ALfloat)); - - IncrementRef(&device->MixCount); - - ctx = ATOMIC_LOAD(&device->ContextList, almemory_order_acquire); - while(ctx) - { - const struct ALeffectslotArray *auxslots; - - auxslots = ATOMIC_LOAD(&ctx->ActiveAuxSlots, almemory_order_acquire); - ProcessParamUpdates(ctx, auxslots); - - for(i = 0;i < auxslots->count;i++) - { - ALeffectslot *slot = auxslots->slot[i]; - for(c = 0;c < slot->NumChannels;c++) - memset(slot->WetBuffer[c], 0, SamplesToDo*sizeof(ALfloat)); - } - - /* source processing */ - for(i = 0;i < ctx->VoiceCount;i++) - { - ALvoice *voice = ctx->Voices[i]; - ALsource *source = ATOMIC_LOAD(&voice->Source, almemory_order_acquire); - if(source && ATOMIC_LOAD(&voice->Playing, almemory_order_relaxed) && - voice->Step > 0) - { - if(!MixSource(voice, source->id, ctx, SamplesToDo)) - { - ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - SendSourceStoppedEvent(ctx, source->id); - } - } - } - - /* effect slot processing */ - for(i = 0;i < auxslots->count;i++) - { - const ALeffectslot *slot = auxslots->slot[i]; - ALeffectState *state = slot->Params.EffectState; - V(state,process)(SamplesToDo, slot->WetBuffer, state->OutBuffer, - state->OutChannels); - } - - ctx = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); - } - - /* Increment the clock time. Every second's worth of samples is - * converted and added to clock base so that large sample counts don't - * overflow during conversion. This also guarantees an exact, stable - * conversion. */ - device->SamplesDone += SamplesToDo; - device->ClockBase += (device->SamplesDone/device->Frequency) * DEVICE_CLOCK_RES; - device->SamplesDone %= device->Frequency; - IncrementRef(&device->MixCount); - - /* Apply post-process for finalizing the Dry mix to the RealOut - * (Ambisonic decode, UHJ encode, etc). - */ - if(LIKELY(device->PostProcess)) - device->PostProcess(device, SamplesToDo); - - if(device->Stablizer) - { - int lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); - int ridx = GetChannelIdxByName(&device->RealOut, FrontRight); - int cidx = GetChannelIdxByName(&device->RealOut, FrontCenter); - assert(lidx >= 0 && ridx >= 0 && cidx >= 0); - - ApplyStablizer(device->Stablizer, device->RealOut.Buffer, lidx, ridx, cidx, - SamplesToDo, device->RealOut.NumChannels); - } - - ApplyDistanceComp(device->RealOut.Buffer, device->ChannelDelay, device->TempBuffer[0], - SamplesToDo, device->RealOut.NumChannels); - - if(device->Limiter) - ApplyCompression(device->Limiter, device->RealOut.NumChannels, SamplesToDo, - device->RealOut.Buffer); - - if(device->DitherDepth > 0.0f) - ApplyDither(device->RealOut.Buffer, &device->DitherSeed, device->DitherDepth, - SamplesToDo, device->RealOut.NumChannels); - - if(LIKELY(OutBuffer)) - { - ALfloat (*Buffer)[BUFFERSIZE] = device->RealOut.Buffer; - ALsizei Channels = device->RealOut.NumChannels; - - switch(device->FmtType) - { -#define HANDLE_WRITE(T, S) case T: \ - Write##S(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); break; - HANDLE_WRITE(DevFmtByte, I8) - HANDLE_WRITE(DevFmtUByte, UI8) - HANDLE_WRITE(DevFmtShort, I16) - HANDLE_WRITE(DevFmtUShort, UI16) - HANDLE_WRITE(DevFmtInt, I32) - HANDLE_WRITE(DevFmtUInt, UI32) - HANDLE_WRITE(DevFmtFloat, F32) -#undef HANDLE_WRITE - } - } - - SamplesDone += SamplesToDo; - } - END_MIXER_MODE(); -} - - -void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) -{ - ALCcontext *ctx; - AsyncEvent evt; - va_list args; - int msglen; - - if(!ATOMIC_EXCHANGE(&device->Connected, AL_FALSE, almemory_order_acq_rel)) - return; - - evt.EnumType = EventType_Disconnected; - evt.Type = AL_EVENT_TYPE_DISCONNECTED_SOFT; - evt.ObjectId = 0; - evt.Param = 0; - - va_start(args, msg); - msglen = vsnprintf(evt.Message, sizeof(evt.Message), msg, args); - va_end(args); - - if(msglen < 0 || (size_t)msglen >= sizeof(evt.Message)) - evt.Message[sizeof(evt.Message)-1] = 0; - - ctx = ATOMIC_LOAD_SEQ(&device->ContextList); - while(ctx) - { - ALbitfieldSOFT enabledevt = ATOMIC_LOAD(&ctx->EnabledEvts, almemory_order_acquire); - ALsizei i; - - if((enabledevt&EventType_Disconnected) && - ll_ringbuffer_write(ctx->AsyncEvents, (const char*)&evt, 1) == 1) - alsem_post(&ctx->EventSem); - - for(i = 0;i < ctx->VoiceCount;i++) - { - ALvoice *voice = ctx->Voices[i]; - ALsource *source; - - source = ATOMIC_EXCHANGE_PTR(&voice->Source, NULL, almemory_order_relaxed); - if(source && ATOMIC_LOAD(&voice->Playing, almemory_order_relaxed)) - { - /* If the source's voice was playing, it's now effectively - * stopped (the source state will be updated the next time it's - * checked). - */ - SendSourceStoppedEvent(ctx, source->id); - } - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - } - - ctx = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); - } -} diff --git a/Alc/alconfig.c b/Alc/alconfig.c deleted file mode 100644 index 5dbf59d..0000000 --- a/Alc/alconfig.c +++ /dev/null @@ -1,675 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#ifdef _WIN32 -#ifdef __MINGW32__ -#define _WIN32_IE 0x501 -#else -#define _WIN32_IE 0x400 -#endif -#endif - -#include "config.h" - -#include -#include -#include -#include -#ifdef _WIN32_IE -#include -#include -#endif - -#include "alMain.h" -#include "alconfig.h" -#include "compat.h" -#include "bool.h" - - -typedef struct ConfigEntry { - char *key; - char *value; -} ConfigEntry; - -typedef struct ConfigBlock { - ConfigEntry *entries; - unsigned int entryCount; -} ConfigBlock; -static ConfigBlock cfgBlock; - - -static char *lstrip(char *line) -{ - while(isspace(line[0])) - line++; - return line; -} - -static char *rstrip(char *line) -{ - size_t len = strlen(line); - while(len > 0 && isspace(line[len-1])) - len--; - line[len] = 0; - return line; -} - -static int readline(FILE *f, char **output, size_t *maxlen) -{ - size_t len = 0; - int c; - - while((c=fgetc(f)) != EOF && (c == '\r' || c == '\n')) - ; - if(c == EOF) - return 0; - - do { - if(len+1 >= *maxlen) - { - void *temp = NULL; - size_t newmax; - - newmax = (*maxlen ? (*maxlen)<<1 : 32); - if(newmax > *maxlen) - temp = realloc(*output, newmax); - if(!temp) - { - ERR("Failed to realloc "SZFMT" bytes from "SZFMT"!\n", newmax, *maxlen); - return 0; - } - - *output = temp; - *maxlen = newmax; - } - (*output)[len++] = c; - (*output)[len] = '\0'; - } while((c=fgetc(f)) != EOF && c != '\r' && c != '\n'); - - return 1; -} - - -static char *expdup(const char *str) -{ - char *output = NULL; - size_t maxlen = 0; - size_t len = 0; - - while(*str != '\0') - { - const char *addstr; - size_t addstrlen; - size_t i; - - if(str[0] != '$') - { - const char *next = strchr(str, '$'); - addstr = str; - addstrlen = next ? (size_t)(next-str) : strlen(str); - - str += addstrlen; - } - else - { - str++; - if(*str == '$') - { - const char *next = strchr(str+1, '$'); - addstr = str; - addstrlen = next ? (size_t)(next-str) : strlen(str); - - str += addstrlen; - } - else - { - bool hasbraces; - char envname[1024]; - size_t k = 0; - - hasbraces = (*str == '{'); - if(hasbraces) str++; - - while((isalnum(*str) || *str == '_') && k < sizeof(envname)-1) - envname[k++] = *(str++); - envname[k++] = '\0'; - - if(hasbraces && *str != '}') - continue; - - if(hasbraces) str++; - if((addstr=getenv(envname)) == NULL) - continue; - addstrlen = strlen(addstr); - } - } - if(addstrlen == 0) - continue; - - if(addstrlen >= maxlen-len) - { - void *temp = NULL; - size_t newmax; - - newmax = len+addstrlen+1; - if(newmax > maxlen) - temp = realloc(output, newmax); - if(!temp) - { - ERR("Failed to realloc "SZFMT" bytes from "SZFMT"!\n", newmax, maxlen); - return output; - } - - output = temp; - maxlen = newmax; - } - - for(i = 0;i < addstrlen;i++) - output[len++] = addstr[i]; - output[len] = '\0'; - } - - return output ? output : calloc(1, 1); -} - - -static void LoadConfigFromFile(FILE *f) -{ - char curSection[128] = ""; - char *buffer = NULL; - size_t maxlen = 0; - ConfigEntry *ent; - - while(readline(f, &buffer, &maxlen)) - { - char *line, *comment; - char key[256] = ""; - char value[256] = ""; - - line = rstrip(lstrip(buffer)); - if(!line[0]) continue; - - if(line[0] == '[') - { - char *section = line+1; - char *endsection; - - endsection = strchr(section, ']'); - if(!endsection || section == endsection) - { - ERR("config parse error: bad line \"%s\"\n", line); - continue; - } - if(endsection[1] != 0) - { - char *end = endsection+1; - while(isspace(*end)) - ++end; - if(*end != 0 && *end != '#') - { - ERR("config parse error: bad line \"%s\"\n", line); - continue; - } - } - *endsection = 0; - - if(strcasecmp(section, "general") == 0) - curSection[0] = 0; - else - { - size_t len, p = 0; - do { - char *nextp = strchr(section, '%'); - if(!nextp) - { - strncpy(curSection+p, section, sizeof(curSection)-1-p); - break; - } - - len = nextp - section; - if(len > sizeof(curSection)-1-p) - len = sizeof(curSection)-1-p; - strncpy(curSection+p, section, len); - p += len; - section = nextp; - - if(((section[1] >= '0' && section[1] <= '9') || - (section[1] >= 'a' && section[1] <= 'f') || - (section[1] >= 'A' && section[1] <= 'F')) && - ((section[2] >= '0' && section[2] <= '9') || - (section[2] >= 'a' && section[2] <= 'f') || - (section[2] >= 'A' && section[2] <= 'F'))) - { - unsigned char b = 0; - if(section[1] >= '0' && section[1] <= '9') - b = (section[1]-'0') << 4; - else if(section[1] >= 'a' && section[1] <= 'f') - b = (section[1]-'a'+0xa) << 4; - else if(section[1] >= 'A' && section[1] <= 'F') - b = (section[1]-'A'+0x0a) << 4; - if(section[2] >= '0' && section[2] <= '9') - b |= (section[2]-'0'); - else if(section[2] >= 'a' && section[2] <= 'f') - b |= (section[2]-'a'+0xa); - else if(section[2] >= 'A' && section[2] <= 'F') - b |= (section[2]-'A'+0x0a); - if(p < sizeof(curSection)-1) - curSection[p++] = b; - section += 3; - } - else if(section[1] == '%') - { - if(p < sizeof(curSection)-1) - curSection[p++] = '%'; - section += 2; - } - else - { - if(p < sizeof(curSection)-1) - curSection[p++] = '%'; - section += 1; - } - if(p < sizeof(curSection)-1) - curSection[p] = 0; - } while(p < sizeof(curSection)-1 && *section != 0); - curSection[sizeof(curSection)-1] = 0; - } - - continue; - } - - comment = strchr(line, '#'); - if(comment) *(comment++) = 0; - if(!line[0]) continue; - - if(sscanf(line, "%255[^=] = \"%255[^\"]\"", key, value) == 2 || - sscanf(line, "%255[^=] = '%255[^\']'", key, value) == 2 || - sscanf(line, "%255[^=] = %255[^\n]", key, value) == 2) - { - /* sscanf doesn't handle '' or "" as empty values, so clip it - * manually. */ - if(strcmp(value, "\"\"") == 0 || strcmp(value, "''") == 0) - value[0] = 0; - } - else if(sscanf(line, "%255[^=] %255[=]", key, value) == 2) - { - /* Special case for 'key =' */ - value[0] = 0; - } - else - { - ERR("config parse error: malformed option line: \"%s\"\n\n", line); - continue; - } - rstrip(key); - - if(curSection[0] != 0) - { - size_t len = strlen(curSection); - memmove(&key[len+1], key, sizeof(key)-1-len); - key[len] = '/'; - memcpy(key, curSection, len); - } - - /* Check if we already have this option set */ - ent = cfgBlock.entries; - while((unsigned int)(ent-cfgBlock.entries) < cfgBlock.entryCount) - { - if(strcasecmp(ent->key, key) == 0) - break; - ent++; - } - - if((unsigned int)(ent-cfgBlock.entries) >= cfgBlock.entryCount) - { - /* Allocate a new option entry */ - ent = realloc(cfgBlock.entries, (cfgBlock.entryCount+1)*sizeof(ConfigEntry)); - if(!ent) - { - ERR("config parse error: error reallocating config entries\n"); - continue; - } - cfgBlock.entries = ent; - ent = cfgBlock.entries + cfgBlock.entryCount; - cfgBlock.entryCount++; - - ent->key = strdup(key); - ent->value = NULL; - } - - free(ent->value); - ent->value = expdup(value); - - TRACE("found '%s' = '%s'\n", ent->key, ent->value); - } - - free(buffer); -} - -#ifdef _WIN32 -void ReadALConfig(void) -{ - al_string ppath = AL_STRING_INIT_STATIC(); - WCHAR buffer[MAX_PATH]; - const WCHAR *str; - FILE *f; - - if(SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, FALSE) != FALSE) - { - al_string filepath = AL_STRING_INIT_STATIC(); - alstr_copy_wcstr(&filepath, buffer); - alstr_append_cstr(&filepath, "\\alsoft.ini"); - - TRACE("Loading config %s...\n", alstr_get_cstr(filepath)); - f = al_fopen(alstr_get_cstr(filepath), "rt"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - alstr_reset(&filepath); - } - - GetProcBinary(&ppath, NULL); - if(!alstr_empty(ppath)) - { - alstr_append_cstr(&ppath, "\\alsoft.ini"); - TRACE("Loading config %s...\n", alstr_get_cstr(ppath)); - f = al_fopen(alstr_get_cstr(ppath), "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - } - - if((str=_wgetenv(L"ALSOFT_CONF")) != NULL && *str) - { - al_string filepath = AL_STRING_INIT_STATIC(); - alstr_copy_wcstr(&filepath, str); - - TRACE("Loading config %s...\n", alstr_get_cstr(filepath)); - f = al_fopen(alstr_get_cstr(filepath), "rt"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - alstr_reset(&filepath); - } - - alstr_reset(&ppath); -} -#else -void ReadALConfig(void) -{ - al_string confpaths = AL_STRING_INIT_STATIC(); - al_string fname = AL_STRING_INIT_STATIC(); - const char *str; - FILE *f; - - str = "/etc/openal/alsoft.conf"; - - TRACE("Loading config %s...\n", str); - f = al_fopen(str, "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - - if(!(str=getenv("XDG_CONFIG_DIRS")) || str[0] == 0) - str = "/etc/xdg"; - alstr_copy_cstr(&confpaths, str); - /* Go through the list in reverse, since "the order of base directories - * denotes their importance; the first directory listed is the most - * important". Ergo, we need to load the settings from the later dirs - * first so that the settings in the earlier dirs override them. - */ - while(!alstr_empty(confpaths)) - { - char *next = strrchr(alstr_get_cstr(confpaths), ':'); - if(next) - { - size_t len = next - alstr_get_cstr(confpaths); - alstr_copy_cstr(&fname, next+1); - VECTOR_RESIZE(confpaths, len, len+1); - VECTOR_ELEM(confpaths, len) = 0; - } - else - { - alstr_reset(&fname); - fname = confpaths; - AL_STRING_INIT(confpaths); - } - - if(alstr_empty(fname) || VECTOR_FRONT(fname) != '/') - WARN("Ignoring XDG config dir: %s\n", alstr_get_cstr(fname)); - else - { - if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/alsoft.conf"); - else alstr_append_cstr(&fname, "alsoft.conf"); - - TRACE("Loading config %s...\n", alstr_get_cstr(fname)); - f = al_fopen(alstr_get_cstr(fname), "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - } - alstr_clear(&fname); - } - - if((str=getenv("HOME")) != NULL && *str) - { - alstr_copy_cstr(&fname, str); - if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/.alsoftrc"); - else alstr_append_cstr(&fname, ".alsoftrc"); - - TRACE("Loading config %s...\n", alstr_get_cstr(fname)); - f = al_fopen(alstr_get_cstr(fname), "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - } - - if((str=getenv("XDG_CONFIG_HOME")) != NULL && str[0] != 0) - { - alstr_copy_cstr(&fname, str); - if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/alsoft.conf"); - else alstr_append_cstr(&fname, "alsoft.conf"); - } - else - { - alstr_clear(&fname); - if((str=getenv("HOME")) != NULL && str[0] != 0) - { - alstr_copy_cstr(&fname, str); - if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/.config/alsoft.conf"); - else alstr_append_cstr(&fname, ".config/alsoft.conf"); - } - } - if(!alstr_empty(fname)) - { - TRACE("Loading config %s...\n", alstr_get_cstr(fname)); - f = al_fopen(alstr_get_cstr(fname), "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - } - - alstr_clear(&fname); - GetProcBinary(&fname, NULL); - if(!alstr_empty(fname)) - { - if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/alsoft.conf"); - else alstr_append_cstr(&fname, "alsoft.conf"); - - TRACE("Loading config %s...\n", alstr_get_cstr(fname)); - f = al_fopen(alstr_get_cstr(fname), "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - } - - if((str=getenv("ALSOFT_CONF")) != NULL && *str) - { - TRACE("Loading config %s...\n", str); - f = al_fopen(str, "r"); - if(f) - { - LoadConfigFromFile(f); - fclose(f); - } - } - - alstr_reset(&fname); - alstr_reset(&confpaths); -} -#endif - -void FreeALConfig(void) -{ - unsigned int i; - - for(i = 0;i < cfgBlock.entryCount;i++) - { - free(cfgBlock.entries[i].key); - free(cfgBlock.entries[i].value); - } - free(cfgBlock.entries); -} - -const char *GetConfigValue(const char *devName, const char *blockName, const char *keyName, const char *def) -{ - unsigned int i; - char key[256]; - - if(!keyName) - return def; - - if(blockName && strcasecmp(blockName, "general") != 0) - { - if(devName) - snprintf(key, sizeof(key), "%s/%s/%s", blockName, devName, keyName); - else - snprintf(key, sizeof(key), "%s/%s", blockName, keyName); - } - else - { - if(devName) - snprintf(key, sizeof(key), "%s/%s", devName, keyName); - else - { - strncpy(key, keyName, sizeof(key)-1); - key[sizeof(key)-1] = 0; - } - } - - for(i = 0;i < cfgBlock.entryCount;i++) - { - if(strcmp(cfgBlock.entries[i].key, key) == 0) - { - TRACE("Found %s = \"%s\"\n", key, cfgBlock.entries[i].value); - if(cfgBlock.entries[i].value[0]) - return cfgBlock.entries[i].value; - return def; - } - } - - if(!devName) - { - TRACE("Key %s not found\n", key); - return def; - } - return GetConfigValue(NULL, blockName, keyName, def); -} - -int ConfigValueExists(const char *devName, const char *blockName, const char *keyName) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - return !!val[0]; -} - -int ConfigValueStr(const char *devName, const char *blockName, const char *keyName, const char **ret) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - if(!val[0]) return 0; - - *ret = val; - return 1; -} - -int ConfigValueInt(const char *devName, const char *blockName, const char *keyName, int *ret) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - if(!val[0]) return 0; - - *ret = strtol(val, NULL, 0); - return 1; -} - -int ConfigValueUInt(const char *devName, const char *blockName, const char *keyName, unsigned int *ret) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - if(!val[0]) return 0; - - *ret = strtoul(val, NULL, 0); - return 1; -} - -int ConfigValueFloat(const char *devName, const char *blockName, const char *keyName, float *ret) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - if(!val[0]) return 0; - -#ifdef HAVE_STRTOF - *ret = strtof(val, NULL); -#else - *ret = (float)strtod(val, NULL); -#endif - return 1; -} - -int ConfigValueBool(const char *devName, const char *blockName, const char *keyName, int *ret) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - if(!val[0]) return 0; - - *ret = (strcasecmp(val, "true") == 0 || strcasecmp(val, "yes") == 0 || - strcasecmp(val, "on") == 0 || atoi(val) != 0); - return 1; -} - -int GetConfigValueBool(const char *devName, const char *blockName, const char *keyName, int def) -{ - const char *val = GetConfigValue(devName, blockName, keyName, ""); - - if(!val[0]) return !!def; - return (strcasecmp(val, "true") == 0 || strcasecmp(val, "yes") == 0 || - strcasecmp(val, "on") == 0 || atoi(val) != 0); -} diff --git a/Alc/alconfig.h b/Alc/alconfig.h deleted file mode 100644 index 1e493e2..0000000 --- a/Alc/alconfig.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ALCONFIG_H -#define ALCONFIG_H - -void ReadALConfig(void); -void FreeALConfig(void); - -int ConfigValueExists(const char *devName, const char *blockName, const char *keyName); -const char *GetConfigValue(const char *devName, const char *blockName, const char *keyName, const char *def); -int GetConfigValueBool(const char *devName, const char *blockName, const char *keyName, int def); - -int ConfigValueStr(const char *devName, const char *blockName, const char *keyName, const char **ret); -int ConfigValueInt(const char *devName, const char *blockName, const char *keyName, int *ret); -int ConfigValueUInt(const char *devName, const char *blockName, const char *keyName, unsigned int *ret); -int ConfigValueFloat(const char *devName, const char *blockName, const char *keyName, float *ret); -int ConfigValueBool(const char *devName, const char *blockName, const char *keyName, int *ret); - -#endif /* ALCONFIG_H */ diff --git a/Alc/alstring.h b/Alc/alstring.h deleted file mode 100644 index 923a5ea..0000000 --- a/Alc/alstring.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef ALSTRING_H -#define ALSTRING_H - -#include - -#include "vector.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef char al_string_char_type; -TYPEDEF_VECTOR(al_string_char_type, al_string) -TYPEDEF_VECTOR(al_string, vector_al_string) - -inline void alstr_reset(al_string *str) -{ VECTOR_DEINIT(*str); } -#define AL_STRING_INIT(_x) do { (_x) = (al_string)NULL; } while(0) -#define AL_STRING_INIT_STATIC() ((al_string)NULL) -#define AL_STRING_DEINIT(_x) alstr_reset(&(_x)) - -inline size_t alstr_length(const_al_string str) -{ return VECTOR_SIZE(str); } - -inline ALboolean alstr_empty(const_al_string str) -{ return alstr_length(str) == 0; } - -inline const al_string_char_type *alstr_get_cstr(const_al_string str) -{ return str ? &VECTOR_FRONT(str) : ""; } - -void alstr_clear(al_string *str); - -int alstr_cmp(const_al_string str1, const_al_string str2); -int alstr_cmp_cstr(const_al_string str1, const al_string_char_type *str2); - -void alstr_copy(al_string *str, const_al_string from); -void alstr_copy_cstr(al_string *str, const al_string_char_type *from); -void alstr_copy_range(al_string *str, const al_string_char_type *from, const al_string_char_type *to); - -void alstr_append_char(al_string *str, const al_string_char_type c); -void alstr_append_cstr(al_string *str, const al_string_char_type *from); -void alstr_append_range(al_string *str, const al_string_char_type *from, const al_string_char_type *to); - -#ifdef _WIN32 -#include -/* Windows-only methods to deal with WideChar strings. */ -void alstr_copy_wcstr(al_string *str, const wchar_t *from); -void alstr_append_wcstr(al_string *str, const wchar_t *from); -void alstr_copy_wrange(al_string *str, const wchar_t *from, const wchar_t *to); -void alstr_append_wrange(al_string *str, const wchar_t *from, const wchar_t *to); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ALSTRING_H */ diff --git a/Alc/ambdec.c b/Alc/ambdec.c deleted file mode 100644 index da11433..0000000 --- a/Alc/ambdec.c +++ /dev/null @@ -1,566 +0,0 @@ - -#include "config.h" - -#include "ambdec.h" - -#include -#include -#include - -#include "compat.h" - - -static char *lstrip(char *line) -{ - while(isspace(line[0])) - line++; - return line; -} - -static char *rstrip(char *line) -{ - size_t len = strlen(line); - while(len > 0 && isspace(line[len-1])) - len--; - line[len] = 0; - return line; -} - -static int readline(FILE *f, char **output, size_t *maxlen) -{ - size_t len = 0; - int c; - - while((c=fgetc(f)) != EOF && (c == '\r' || c == '\n')) - ; - if(c == EOF) - return 0; - - do { - if(len+1 >= *maxlen) - { - void *temp = NULL; - size_t newmax; - - newmax = (*maxlen ? (*maxlen)<<1 : 32); - if(newmax > *maxlen) - temp = realloc(*output, newmax); - if(!temp) - { - ERR("Failed to realloc "SZFMT" bytes from "SZFMT"!\n", newmax, *maxlen); - return 0; - } - - *output = temp; - *maxlen = newmax; - } - (*output)[len++] = c; - (*output)[len] = '\0'; - } while((c=fgetc(f)) != EOF && c != '\r' && c != '\n'); - - return 1; -} - - -/* Custom strtok_r, since we can't rely on it existing. */ -static char *my_strtok_r(char *str, const char *delim, char **saveptr) -{ - /* Sanity check and update internal pointer. */ - if(!saveptr || !delim) return NULL; - if(str) *saveptr = str; - str = *saveptr; - - /* Nothing more to do with this string. */ - if(!str) return NULL; - - /* Find the first non-delimiter character. */ - while(*str != '\0' && strchr(delim, *str) != NULL) - str++; - if(*str == '\0') - { - /* End of string. */ - *saveptr = NULL; - return NULL; - } - - /* Find the next delimiter character. */ - *saveptr = strpbrk(str, delim); - if(*saveptr) *((*saveptr)++) = '\0'; - - return str; -} - -static char *read_int(ALint *num, const char *line, int base) -{ - char *end; - *num = strtol(line, &end, base); - if(end && *end != '\0') - end = lstrip(end); - return end; -} - -static char *read_uint(ALuint *num, const char *line, int base) -{ - char *end; - *num = strtoul(line, &end, base); - if(end && *end != '\0') - end = lstrip(end); - return end; -} - -static char *read_float(ALfloat *num, const char *line) -{ - char *end; -#ifdef HAVE_STRTOF - *num = strtof(line, &end); -#else - *num = (ALfloat)strtod(line, &end); -#endif - if(end && *end != '\0') - end = lstrip(end); - return end; -} - - -char *read_clipped_line(FILE *f, char **buffer, size_t *maxlen) -{ - while(readline(f, buffer, maxlen)) - { - char *line, *comment; - - line = lstrip(*buffer); - comment = strchr(line, '#'); - if(comment) *(comment++) = 0; - - line = rstrip(line); - if(line[0]) return line; - } - return NULL; -} - -static int load_ambdec_speakers(AmbDecConf *conf, FILE *f, char **buffer, size_t *maxlen, char **saveptr) -{ - ALsizei cur = 0; - while(cur < conf->NumSpeakers) - { - const char *cmd = my_strtok_r(NULL, " \t", saveptr); - if(!cmd) - { - char *line = read_clipped_line(f, buffer, maxlen); - if(!line) - { - ERR("Unexpected end of file\n"); - return 0; - } - cmd = my_strtok_r(line, " \t", saveptr); - } - - if(strcmp(cmd, "add_spkr") == 0) - { - const char *name = my_strtok_r(NULL, " \t", saveptr); - const char *dist = my_strtok_r(NULL, " \t", saveptr); - const char *az = my_strtok_r(NULL, " \t", saveptr); - const char *elev = my_strtok_r(NULL, " \t", saveptr); - const char *conn = my_strtok_r(NULL, " \t", saveptr); - - if(!name) WARN("Name not specified for speaker %u\n", cur+1); - else alstr_copy_cstr(&conf->Speakers[cur].Name, name); - if(!dist) WARN("Distance not specified for speaker %u\n", cur+1); - else read_float(&conf->Speakers[cur].Distance, dist); - if(!az) WARN("Azimuth not specified for speaker %u\n", cur+1); - else read_float(&conf->Speakers[cur].Azimuth, az); - if(!elev) WARN("Elevation not specified for speaker %u\n", cur+1); - else read_float(&conf->Speakers[cur].Elevation, elev); - if(!conn) TRACE("Connection not specified for speaker %u\n", cur+1); - else alstr_copy_cstr(&conf->Speakers[cur].Connection, conn); - - cur++; - } - else - { - ERR("Unexpected speakers command: %s\n", cmd); - return 0; - } - - cmd = my_strtok_r(NULL, " \t", saveptr); - if(cmd) - { - ERR("Unexpected junk on line: %s\n", cmd); - return 0; - } - } - - return 1; -} - -static int load_ambdec_matrix(ALfloat *gains, ALfloat (*matrix)[MAX_AMBI_COEFFS], ALsizei maxrow, FILE *f, char **buffer, size_t *maxlen, char **saveptr) -{ - int gotgains = 0; - ALsizei cur = 0; - while(cur < maxrow) - { - const char *cmd = my_strtok_r(NULL, " \t", saveptr); - if(!cmd) - { - char *line = read_clipped_line(f, buffer, maxlen); - if(!line) - { - ERR("Unexpected end of file\n"); - return 0; - } - cmd = my_strtok_r(line, " \t", saveptr); - } - - if(strcmp(cmd, "order_gain") == 0) - { - ALuint curgain = 0; - char *line; - while((line=my_strtok_r(NULL, " \t", saveptr)) != NULL) - { - ALfloat value; - line = read_float(&value, line); - if(line && *line != '\0') - { - ERR("Extra junk on gain %u: %s\n", curgain+1, line); - return 0; - } - if(curgain < MAX_AMBI_ORDER+1) - gains[curgain] = value; - curgain++; - } - while(curgain < MAX_AMBI_ORDER+1) - gains[curgain++] = 0.0f; - gotgains = 1; - } - else if(strcmp(cmd, "add_row") == 0) - { - ALuint curidx = 0; - char *line; - while((line=my_strtok_r(NULL, " \t", saveptr)) != NULL) - { - ALfloat value; - line = read_float(&value, line); - if(line && *line != '\0') - { - ERR("Extra junk on matrix element %ux%u: %s\n", cur, curidx, line); - return 0; - } - if(curidx < MAX_AMBI_COEFFS) - matrix[cur][curidx] = value; - curidx++; - } - while(curidx < MAX_AMBI_COEFFS) - matrix[cur][curidx++] = 0.0f; - cur++; - } - else - { - ERR("Unexpected speakers command: %s\n", cmd); - return 0; - } - - cmd = my_strtok_r(NULL, " \t", saveptr); - if(cmd) - { - ERR("Unexpected junk on line: %s\n", cmd); - return 0; - } - } - - if(!gotgains) - { - ERR("Matrix order_gain not specified\n"); - return 0; - } - - return 1; -} - -void ambdec_init(AmbDecConf *conf) -{ - ALsizei i; - - memset(conf, 0, sizeof(*conf)); - AL_STRING_INIT(conf->Description); - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - AL_STRING_INIT(conf->Speakers[i].Name); - AL_STRING_INIT(conf->Speakers[i].Connection); - } -} - -void ambdec_deinit(AmbDecConf *conf) -{ - ALsizei i; - - alstr_reset(&conf->Description); - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - alstr_reset(&conf->Speakers[i].Name); - alstr_reset(&conf->Speakers[i].Connection); - } - memset(conf, 0, sizeof(*conf)); -} - -int ambdec_load(AmbDecConf *conf, const char *fname) -{ - char *buffer = NULL; - size_t maxlen = 0; - char *line; - FILE *f; - - f = al_fopen(fname, "r"); - if(!f) - { - ERR("Failed to open: %s\n", fname); - return 0; - } - - while((line=read_clipped_line(f, &buffer, &maxlen)) != NULL) - { - char *saveptr; - char *command; - - command = my_strtok_r(line, "/ \t", &saveptr); - if(!command) - { - ERR("Malformed line: %s\n", line); - goto fail; - } - - if(strcmp(command, "description") == 0) - { - char *value = my_strtok_r(NULL, "", &saveptr); - alstr_copy_cstr(&conf->Description, lstrip(value)); - } - else if(strcmp(command, "version") == 0) - { - line = my_strtok_r(NULL, "", &saveptr); - line = read_uint(&conf->Version, line, 10); - if(line && *line != '\0') - { - ERR("Extra junk after version: %s\n", line); - goto fail; - } - if(conf->Version != 3) - { - ERR("Unsupported version: %u\n", conf->Version); - goto fail; - } - } - else if(strcmp(command, "dec") == 0) - { - const char *dec = my_strtok_r(NULL, "/ \t", &saveptr); - if(strcmp(dec, "chan_mask") == 0) - { - line = my_strtok_r(NULL, "", &saveptr); - line = read_uint(&conf->ChanMask, line, 16); - if(line && *line != '\0') - { - ERR("Extra junk after mask: %s\n", line); - goto fail; - } - } - else if(strcmp(dec, "freq_bands") == 0) - { - line = my_strtok_r(NULL, "", &saveptr); - line = read_uint(&conf->FreqBands, line, 10); - if(line && *line != '\0') - { - ERR("Extra junk after freq_bands: %s\n", line); - goto fail; - } - if(conf->FreqBands != 1 && conf->FreqBands != 2) - { - ERR("Invalid freq_bands value: %u\n", conf->FreqBands); - goto fail; - } - } - else if(strcmp(dec, "speakers") == 0) - { - line = my_strtok_r(NULL, "", &saveptr); - line = read_int(&conf->NumSpeakers, line, 10); - if(line && *line != '\0') - { - ERR("Extra junk after speakers: %s\n", line); - goto fail; - } - if(conf->NumSpeakers > MAX_OUTPUT_CHANNELS) - { - ERR("Unsupported speaker count: %u\n", conf->NumSpeakers); - goto fail; - } - } - else if(strcmp(dec, "coeff_scale") == 0) - { - line = my_strtok_r(NULL, " \t", &saveptr); - if(strcmp(line, "n3d") == 0) - conf->CoeffScale = ADS_N3D; - else if(strcmp(line, "sn3d") == 0) - conf->CoeffScale = ADS_SN3D; - else if(strcmp(line, "fuma") == 0) - conf->CoeffScale = ADS_FuMa; - else - { - ERR("Unsupported coeff scale: %s\n", line); - goto fail; - } - } - else - { - ERR("Unexpected /dec option: %s\n", dec); - goto fail; - } - } - else if(strcmp(command, "opt") == 0) - { - const char *opt = my_strtok_r(NULL, "/ \t", &saveptr); - if(strcmp(opt, "xover_freq") == 0) - { - line = my_strtok_r(NULL, "", &saveptr); - line = read_float(&conf->XOverFreq, line); - if(line && *line != '\0') - { - ERR("Extra junk after xover_freq: %s\n", line); - goto fail; - } - } - else if(strcmp(opt, "xover_ratio") == 0) - { - line = my_strtok_r(NULL, "", &saveptr); - line = read_float(&conf->XOverRatio, line); - if(line && *line != '\0') - { - ERR("Extra junk after xover_ratio: %s\n", line); - goto fail; - } - } - else if(strcmp(opt, "input_scale") == 0 || strcmp(opt, "nfeff_comp") == 0 || - strcmp(opt, "delay_comp") == 0 || strcmp(opt, "level_comp") == 0) - { - /* Unused */ - my_strtok_r(NULL, " \t", &saveptr); - } - else - { - ERR("Unexpected /opt option: %s\n", opt); - goto fail; - } - } - else if(strcmp(command, "speakers") == 0) - { - const char *value = my_strtok_r(NULL, "/ \t", &saveptr); - if(strcmp(value, "{") != 0) - { - ERR("Expected { after %s command, got %s\n", command, value); - goto fail; - } - if(!load_ambdec_speakers(conf, f, &buffer, &maxlen, &saveptr)) - goto fail; - value = my_strtok_r(NULL, "/ \t", &saveptr); - if(!value) - { - line = read_clipped_line(f, &buffer, &maxlen); - if(!line) - { - ERR("Unexpected end of file\n"); - goto fail; - } - value = my_strtok_r(line, "/ \t", &saveptr); - } - if(strcmp(value, "}") != 0) - { - ERR("Expected } after speaker definitions, got %s\n", value); - goto fail; - } - } - else if(strcmp(command, "lfmatrix") == 0 || strcmp(command, "hfmatrix") == 0 || - strcmp(command, "matrix") == 0) - { - const char *value = my_strtok_r(NULL, "/ \t", &saveptr); - if(strcmp(value, "{") != 0) - { - ERR("Expected { after %s command, got %s\n", command, value); - goto fail; - } - if(conf->FreqBands == 1) - { - if(strcmp(command, "matrix") != 0) - { - ERR("Unexpected \"%s\" type for a single-band decoder\n", command); - goto fail; - } - if(!load_ambdec_matrix(conf->HFOrderGain, conf->HFMatrix, conf->NumSpeakers, - f, &buffer, &maxlen, &saveptr)) - goto fail; - } - else - { - if(strcmp(command, "lfmatrix") == 0) - { - if(!load_ambdec_matrix(conf->LFOrderGain, conf->LFMatrix, conf->NumSpeakers, - f, &buffer, &maxlen, &saveptr)) - goto fail; - } - else if(strcmp(command, "hfmatrix") == 0) - { - if(!load_ambdec_matrix(conf->HFOrderGain, conf->HFMatrix, conf->NumSpeakers, - f, &buffer, &maxlen, &saveptr)) - goto fail; - } - else - { - ERR("Unexpected \"%s\" type for a dual-band decoder\n", command); - goto fail; - } - } - value = my_strtok_r(NULL, "/ \t", &saveptr); - if(!value) - { - line = read_clipped_line(f, &buffer, &maxlen); - if(!line) - { - ERR("Unexpected end of file\n"); - goto fail; - } - value = my_strtok_r(line, "/ \t", &saveptr); - } - if(strcmp(value, "}") != 0) - { - ERR("Expected } after matrix definitions, got %s\n", value); - goto fail; - } - } - else if(strcmp(command, "end") == 0) - { - line = my_strtok_r(NULL, "/ \t", &saveptr); - if(line) - { - ERR("Unexpected junk on end: %s\n", line); - goto fail; - } - - fclose(f); - free(buffer); - return 1; - } - else - { - ERR("Unexpected command: %s\n", command); - goto fail; - } - - line = my_strtok_r(NULL, "/ \t", &saveptr); - if(line) - { - ERR("Unexpected junk on line: %s\n", line); - goto fail; - } - } - ERR("Unexpected end of file\n"); - -fail: - fclose(f); - free(buffer); - return 0; -} diff --git a/Alc/ambdec.h b/Alc/ambdec.h deleted file mode 100644 index 0bb8407..0000000 --- a/Alc/ambdec.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef AMBDEC_H -#define AMBDEC_H - -#include "alstring.h" -#include "alMain.h" - -/* Helpers to read .ambdec configuration files. */ - -enum AmbDecScaleType { - ADS_N3D, - ADS_SN3D, - ADS_FuMa, -}; -typedef struct AmbDecConf { - al_string Description; - ALuint Version; /* Must be 3 */ - - ALuint ChanMask; - ALuint FreqBands; /* Must be 1 or 2 */ - ALsizei NumSpeakers; - enum AmbDecScaleType CoeffScale; - - ALfloat XOverFreq; - ALfloat XOverRatio; - - struct { - al_string Name; - ALfloat Distance; - ALfloat Azimuth; - ALfloat Elevation; - al_string Connection; - } Speakers[MAX_OUTPUT_CHANNELS]; - - /* Unused when FreqBands == 1 */ - ALfloat LFOrderGain[MAX_AMBI_ORDER+1]; - ALfloat LFMatrix[MAX_OUTPUT_CHANNELS][MAX_AMBI_COEFFS]; - - ALfloat HFOrderGain[MAX_AMBI_ORDER+1]; - ALfloat HFMatrix[MAX_OUTPUT_CHANNELS][MAX_AMBI_COEFFS]; -} AmbDecConf; - -void ambdec_init(AmbDecConf *conf); -void ambdec_deinit(AmbDecConf *conf); -int ambdec_load(AmbDecConf *conf, const char *fname); - -#endif /* AMBDEC_H */ diff --git a/Alc/backends/alsa.c b/Alc/backends/alsa.c deleted file mode 100644 index 409be7f..0000000 --- a/Alc/backends/alsa.c +++ /dev/null @@ -1,1463 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - -#include - - -static const ALCchar alsaDevice[] = "ALSA Default"; - - -#ifdef HAVE_DYNLOAD -#define ALSA_FUNCS(MAGIC) \ - MAGIC(snd_strerror); \ - MAGIC(snd_pcm_open); \ - MAGIC(snd_pcm_close); \ - MAGIC(snd_pcm_nonblock); \ - MAGIC(snd_pcm_frames_to_bytes); \ - MAGIC(snd_pcm_bytes_to_frames); \ - MAGIC(snd_pcm_hw_params_malloc); \ - MAGIC(snd_pcm_hw_params_free); \ - MAGIC(snd_pcm_hw_params_any); \ - MAGIC(snd_pcm_hw_params_current); \ - MAGIC(snd_pcm_hw_params_set_access); \ - MAGIC(snd_pcm_hw_params_set_format); \ - MAGIC(snd_pcm_hw_params_set_channels); \ - MAGIC(snd_pcm_hw_params_set_periods_near); \ - MAGIC(snd_pcm_hw_params_set_rate_near); \ - MAGIC(snd_pcm_hw_params_set_rate); \ - MAGIC(snd_pcm_hw_params_set_rate_resample); \ - MAGIC(snd_pcm_hw_params_set_buffer_time_near); \ - MAGIC(snd_pcm_hw_params_set_period_time_near); \ - MAGIC(snd_pcm_hw_params_set_buffer_size_near); \ - MAGIC(snd_pcm_hw_params_set_period_size_near); \ - MAGIC(snd_pcm_hw_params_set_buffer_size_min); \ - MAGIC(snd_pcm_hw_params_get_buffer_time_min); \ - MAGIC(snd_pcm_hw_params_get_buffer_time_max); \ - MAGIC(snd_pcm_hw_params_get_period_time_min); \ - MAGIC(snd_pcm_hw_params_get_period_time_max); \ - MAGIC(snd_pcm_hw_params_get_buffer_size); \ - MAGIC(snd_pcm_hw_params_get_period_size); \ - MAGIC(snd_pcm_hw_params_get_access); \ - MAGIC(snd_pcm_hw_params_get_periods); \ - MAGIC(snd_pcm_hw_params_test_format); \ - MAGIC(snd_pcm_hw_params_test_channels); \ - MAGIC(snd_pcm_hw_params); \ - MAGIC(snd_pcm_sw_params_malloc); \ - MAGIC(snd_pcm_sw_params_current); \ - MAGIC(snd_pcm_sw_params_set_avail_min); \ - MAGIC(snd_pcm_sw_params_set_stop_threshold); \ - MAGIC(snd_pcm_sw_params); \ - MAGIC(snd_pcm_sw_params_free); \ - MAGIC(snd_pcm_prepare); \ - MAGIC(snd_pcm_start); \ - MAGIC(snd_pcm_resume); \ - MAGIC(snd_pcm_reset); \ - MAGIC(snd_pcm_wait); \ - MAGIC(snd_pcm_delay); \ - MAGIC(snd_pcm_state); \ - MAGIC(snd_pcm_avail_update); \ - MAGIC(snd_pcm_areas_silence); \ - MAGIC(snd_pcm_mmap_begin); \ - MAGIC(snd_pcm_mmap_commit); \ - MAGIC(snd_pcm_readi); \ - MAGIC(snd_pcm_writei); \ - MAGIC(snd_pcm_drain); \ - MAGIC(snd_pcm_drop); \ - MAGIC(snd_pcm_recover); \ - MAGIC(snd_pcm_info_malloc); \ - MAGIC(snd_pcm_info_free); \ - MAGIC(snd_pcm_info_set_device); \ - MAGIC(snd_pcm_info_set_subdevice); \ - MAGIC(snd_pcm_info_set_stream); \ - MAGIC(snd_pcm_info_get_name); \ - MAGIC(snd_ctl_pcm_next_device); \ - MAGIC(snd_ctl_pcm_info); \ - MAGIC(snd_ctl_open); \ - MAGIC(snd_ctl_close); \ - MAGIC(snd_ctl_card_info_malloc); \ - MAGIC(snd_ctl_card_info_free); \ - MAGIC(snd_ctl_card_info); \ - MAGIC(snd_ctl_card_info_get_name); \ - MAGIC(snd_ctl_card_info_get_id); \ - MAGIC(snd_card_next); \ - MAGIC(snd_config_update_free_global) - -static void *alsa_handle; -#define MAKE_FUNC(f) static __typeof(f) * p##f -ALSA_FUNCS(MAKE_FUNC); -#undef MAKE_FUNC - -#define snd_strerror psnd_strerror -#define snd_pcm_open psnd_pcm_open -#define snd_pcm_close psnd_pcm_close -#define snd_pcm_nonblock psnd_pcm_nonblock -#define snd_pcm_frames_to_bytes psnd_pcm_frames_to_bytes -#define snd_pcm_bytes_to_frames psnd_pcm_bytes_to_frames -#define snd_pcm_hw_params_malloc psnd_pcm_hw_params_malloc -#define snd_pcm_hw_params_free psnd_pcm_hw_params_free -#define snd_pcm_hw_params_any psnd_pcm_hw_params_any -#define snd_pcm_hw_params_current psnd_pcm_hw_params_current -#define snd_pcm_hw_params_set_access psnd_pcm_hw_params_set_access -#define snd_pcm_hw_params_set_format psnd_pcm_hw_params_set_format -#define snd_pcm_hw_params_set_channels psnd_pcm_hw_params_set_channels -#define snd_pcm_hw_params_set_periods_near psnd_pcm_hw_params_set_periods_near -#define snd_pcm_hw_params_set_rate_near psnd_pcm_hw_params_set_rate_near -#define snd_pcm_hw_params_set_rate psnd_pcm_hw_params_set_rate -#define snd_pcm_hw_params_set_rate_resample psnd_pcm_hw_params_set_rate_resample -#define snd_pcm_hw_params_set_buffer_time_near psnd_pcm_hw_params_set_buffer_time_near -#define snd_pcm_hw_params_set_period_time_near psnd_pcm_hw_params_set_period_time_near -#define snd_pcm_hw_params_set_buffer_size_near psnd_pcm_hw_params_set_buffer_size_near -#define snd_pcm_hw_params_set_period_size_near psnd_pcm_hw_params_set_period_size_near -#define snd_pcm_hw_params_set_buffer_size_min psnd_pcm_hw_params_set_buffer_size_min -#define snd_pcm_hw_params_get_buffer_time_min psnd_pcm_hw_params_get_buffer_time_min -#define snd_pcm_hw_params_get_buffer_time_max psnd_pcm_hw_params_get_buffer_time_max -#define snd_pcm_hw_params_get_period_time_min psnd_pcm_hw_params_get_period_time_min -#define snd_pcm_hw_params_get_period_time_max psnd_pcm_hw_params_get_period_time_max -#define snd_pcm_hw_params_get_buffer_size psnd_pcm_hw_params_get_buffer_size -#define snd_pcm_hw_params_get_period_size psnd_pcm_hw_params_get_period_size -#define snd_pcm_hw_params_get_access psnd_pcm_hw_params_get_access -#define snd_pcm_hw_params_get_periods psnd_pcm_hw_params_get_periods -#define snd_pcm_hw_params_test_format psnd_pcm_hw_params_test_format -#define snd_pcm_hw_params_test_channels psnd_pcm_hw_params_test_channels -#define snd_pcm_hw_params psnd_pcm_hw_params -#define snd_pcm_sw_params_malloc psnd_pcm_sw_params_malloc -#define snd_pcm_sw_params_current psnd_pcm_sw_params_current -#define snd_pcm_sw_params_set_avail_min psnd_pcm_sw_params_set_avail_min -#define snd_pcm_sw_params_set_stop_threshold psnd_pcm_sw_params_set_stop_threshold -#define snd_pcm_sw_params psnd_pcm_sw_params -#define snd_pcm_sw_params_free psnd_pcm_sw_params_free -#define snd_pcm_prepare psnd_pcm_prepare -#define snd_pcm_start psnd_pcm_start -#define snd_pcm_resume psnd_pcm_resume -#define snd_pcm_reset psnd_pcm_reset -#define snd_pcm_wait psnd_pcm_wait -#define snd_pcm_delay psnd_pcm_delay -#define snd_pcm_state psnd_pcm_state -#define snd_pcm_avail_update psnd_pcm_avail_update -#define snd_pcm_areas_silence psnd_pcm_areas_silence -#define snd_pcm_mmap_begin psnd_pcm_mmap_begin -#define snd_pcm_mmap_commit psnd_pcm_mmap_commit -#define snd_pcm_readi psnd_pcm_readi -#define snd_pcm_writei psnd_pcm_writei -#define snd_pcm_drain psnd_pcm_drain -#define snd_pcm_drop psnd_pcm_drop -#define snd_pcm_recover psnd_pcm_recover -#define snd_pcm_info_malloc psnd_pcm_info_malloc -#define snd_pcm_info_free psnd_pcm_info_free -#define snd_pcm_info_set_device psnd_pcm_info_set_device -#define snd_pcm_info_set_subdevice psnd_pcm_info_set_subdevice -#define snd_pcm_info_set_stream psnd_pcm_info_set_stream -#define snd_pcm_info_get_name psnd_pcm_info_get_name -#define snd_ctl_pcm_next_device psnd_ctl_pcm_next_device -#define snd_ctl_pcm_info psnd_ctl_pcm_info -#define snd_ctl_open psnd_ctl_open -#define snd_ctl_close psnd_ctl_close -#define snd_ctl_card_info_malloc psnd_ctl_card_info_malloc -#define snd_ctl_card_info_free psnd_ctl_card_info_free -#define snd_ctl_card_info psnd_ctl_card_info -#define snd_ctl_card_info_get_name psnd_ctl_card_info_get_name -#define snd_ctl_card_info_get_id psnd_ctl_card_info_get_id -#define snd_card_next psnd_card_next -#define snd_config_update_free_global psnd_config_update_free_global -#endif - - -static ALCboolean alsa_load(void) -{ - ALCboolean error = ALC_FALSE; - -#ifdef HAVE_DYNLOAD - if(!alsa_handle) - { - al_string missing_funcs = AL_STRING_INIT_STATIC(); - - alsa_handle = LoadLib("libasound.so.2"); - if(!alsa_handle) - { - WARN("Failed to load %s\n", "libasound.so.2"); - return ALC_FALSE; - } - - error = ALC_FALSE; -#define LOAD_FUNC(f) do { \ - p##f = GetSymbol(alsa_handle, #f); \ - if(p##f == NULL) { \ - error = ALC_TRUE; \ - alstr_append_cstr(&missing_funcs, "\n" #f); \ - } \ -} while(0) - ALSA_FUNCS(LOAD_FUNC); -#undef LOAD_FUNC - - if(error) - { - WARN("Missing expected functions:%s\n", alstr_get_cstr(missing_funcs)); - CloseLib(alsa_handle); - alsa_handle = NULL; - } - alstr_reset(&missing_funcs); - } -#endif - - return !error; -} - - -typedef struct { - al_string name; - al_string device_name; -} DevMap; -TYPEDEF_VECTOR(DevMap, vector_DevMap) - -static vector_DevMap PlaybackDevices; -static vector_DevMap CaptureDevices; - -static void clear_devlist(vector_DevMap *devlist) -{ -#define FREE_DEV(i) do { \ - AL_STRING_DEINIT((i)->name); \ - AL_STRING_DEINIT((i)->device_name); \ -} while(0) - VECTOR_FOR_EACH(DevMap, *devlist, FREE_DEV); - VECTOR_RESIZE(*devlist, 0, 0); -#undef FREE_DEV -} - - -static const char *prefix_name(snd_pcm_stream_t stream) -{ - assert(stream == SND_PCM_STREAM_PLAYBACK || stream == SND_PCM_STREAM_CAPTURE); - return (stream==SND_PCM_STREAM_PLAYBACK) ? "device-prefix" : "capture-prefix"; -} - -static void probe_devices(snd_pcm_stream_t stream, vector_DevMap *DeviceList) -{ - const char *main_prefix = "plughw:"; - snd_ctl_t *handle; - snd_ctl_card_info_t *info; - snd_pcm_info_t *pcminfo; - int card, err, dev; - DevMap entry; - - clear_devlist(DeviceList); - - snd_ctl_card_info_malloc(&info); - snd_pcm_info_malloc(&pcminfo); - - AL_STRING_INIT(entry.name); - AL_STRING_INIT(entry.device_name); - alstr_copy_cstr(&entry.name, alsaDevice); - alstr_copy_cstr(&entry.device_name, GetConfigValue( - NULL, "alsa", (stream==SND_PCM_STREAM_PLAYBACK) ? "device" : "capture", "default" - )); - VECTOR_PUSH_BACK(*DeviceList, entry); - - if(stream == SND_PCM_STREAM_PLAYBACK) - { - const char *customdevs, *sep, *next; - next = GetConfigValue(NULL, "alsa", "custom-devices", ""); - while((customdevs=next) != NULL && customdevs[0]) - { - next = strchr(customdevs, ';'); - sep = strchr(customdevs, '='); - if(!sep) - { - al_string spec = AL_STRING_INIT_STATIC(); - if(next) - alstr_copy_range(&spec, customdevs, next++); - else - alstr_copy_cstr(&spec, customdevs); - ERR("Invalid ALSA device specification \"%s\"\n", alstr_get_cstr(spec)); - alstr_reset(&spec); - continue; - } - - AL_STRING_INIT(entry.name); - AL_STRING_INIT(entry.device_name); - alstr_copy_range(&entry.name, customdevs, sep++); - if(next) - alstr_copy_range(&entry.device_name, sep, next++); - else - alstr_copy_cstr(&entry.device_name, sep); - TRACE("Got device \"%s\", \"%s\"\n", alstr_get_cstr(entry.name), - alstr_get_cstr(entry.device_name)); - VECTOR_PUSH_BACK(*DeviceList, entry); - } - } - - card = -1; - if((err=snd_card_next(&card)) < 0) - ERR("Failed to find a card: %s\n", snd_strerror(err)); - ConfigValueStr(NULL, "alsa", prefix_name(stream), &main_prefix); - while(card >= 0) - { - const char *card_prefix = main_prefix; - const char *cardname, *cardid; - char name[256]; - - snprintf(name, sizeof(name), "hw:%d", card); - if((err = snd_ctl_open(&handle, name, 0)) < 0) - { - ERR("control open (hw:%d): %s\n", card, snd_strerror(err)); - goto next_card; - } - if((err = snd_ctl_card_info(handle, info)) < 0) - { - ERR("control hardware info (hw:%d): %s\n", card, snd_strerror(err)); - snd_ctl_close(handle); - goto next_card; - } - - cardname = snd_ctl_card_info_get_name(info); - cardid = snd_ctl_card_info_get_id(info); - - snprintf(name, sizeof(name), "%s-%s", prefix_name(stream), cardid); - ConfigValueStr(NULL, "alsa", name, &card_prefix); - - dev = -1; - while(1) - { - const char *device_prefix = card_prefix; - const char *devname; - char device[128]; - - if(snd_ctl_pcm_next_device(handle, &dev) < 0) - ERR("snd_ctl_pcm_next_device failed\n"); - if(dev < 0) - break; - - snd_pcm_info_set_device(pcminfo, dev); - snd_pcm_info_set_subdevice(pcminfo, 0); - snd_pcm_info_set_stream(pcminfo, stream); - if((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) - { - if(err != -ENOENT) - ERR("control digital audio info (hw:%d): %s\n", card, snd_strerror(err)); - continue; - } - - devname = snd_pcm_info_get_name(pcminfo); - - snprintf(name, sizeof(name), "%s-%s-%d", prefix_name(stream), cardid, dev); - ConfigValueStr(NULL, "alsa", name, &device_prefix); - - snprintf(name, sizeof(name), "%s, %s (CARD=%s,DEV=%d)", - cardname, devname, cardid, dev); - snprintf(device, sizeof(device), "%sCARD=%s,DEV=%d", - device_prefix, cardid, dev); - - TRACE("Got device \"%s\", \"%s\"\n", name, device); - AL_STRING_INIT(entry.name); - AL_STRING_INIT(entry.device_name); - alstr_copy_cstr(&entry.name, name); - alstr_copy_cstr(&entry.device_name, device); - VECTOR_PUSH_BACK(*DeviceList, entry); - } - snd_ctl_close(handle); - next_card: - if(snd_card_next(&card) < 0) { - ERR("snd_card_next failed\n"); - break; - } - } - - snd_pcm_info_free(pcminfo); - snd_ctl_card_info_free(info); -} - - -static int verify_state(snd_pcm_t *handle) -{ - snd_pcm_state_t state = snd_pcm_state(handle); - int err; - - switch(state) - { - case SND_PCM_STATE_OPEN: - case SND_PCM_STATE_SETUP: - case SND_PCM_STATE_PREPARED: - case SND_PCM_STATE_RUNNING: - case SND_PCM_STATE_DRAINING: - case SND_PCM_STATE_PAUSED: - /* All Okay */ - break; - - case SND_PCM_STATE_XRUN: - if((err=snd_pcm_recover(handle, -EPIPE, 1)) < 0) - return err; - break; - case SND_PCM_STATE_SUSPENDED: - if((err=snd_pcm_recover(handle, -ESTRPIPE, 1)) < 0) - return err; - break; - case SND_PCM_STATE_DISCONNECTED: - return -ENODEV; - } - - return state; -} - - -typedef struct ALCplaybackAlsa { - DERIVE_FROM_TYPE(ALCbackend); - - snd_pcm_t *pcmHandle; - - ALvoid *buffer; - ALsizei size; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCplaybackAlsa; - -static int ALCplaybackAlsa_mixerProc(void *ptr); -static int ALCplaybackAlsa_mixerNoMMapProc(void *ptr); - -static void ALCplaybackAlsa_Construct(ALCplaybackAlsa *self, ALCdevice *device); -static void ALCplaybackAlsa_Destruct(ALCplaybackAlsa *self); -static ALCenum ALCplaybackAlsa_open(ALCplaybackAlsa *self, const ALCchar *name); -static ALCboolean ALCplaybackAlsa_reset(ALCplaybackAlsa *self); -static ALCboolean ALCplaybackAlsa_start(ALCplaybackAlsa *self); -static void ALCplaybackAlsa_stop(ALCplaybackAlsa *self); -static DECLARE_FORWARD2(ALCplaybackAlsa, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCplaybackAlsa, ALCbackend, ALCuint, availableSamples) -static ClockLatency ALCplaybackAlsa_getClockLatency(ALCplaybackAlsa *self); -static DECLARE_FORWARD(ALCplaybackAlsa, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCplaybackAlsa, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCplaybackAlsa) - -DEFINE_ALCBACKEND_VTABLE(ALCplaybackAlsa); - - -static void ALCplaybackAlsa_Construct(ALCplaybackAlsa *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCplaybackAlsa, ALCbackend, self); - - self->pcmHandle = NULL; - self->buffer = NULL; - - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -void ALCplaybackAlsa_Destruct(ALCplaybackAlsa *self) -{ - if(self->pcmHandle) - snd_pcm_close(self->pcmHandle); - self->pcmHandle = NULL; - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCplaybackAlsa_mixerProc(void *ptr) -{ - ALCplaybackAlsa *self = (ALCplaybackAlsa*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const snd_pcm_channel_area_t *areas = NULL; - snd_pcm_uframes_t update_size, num_updates; - snd_pcm_sframes_t avail, commitres; - snd_pcm_uframes_t offset, frames; - char *WritePtr; - int err; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - update_size = device->UpdateSize; - num_updates = device->NumUpdates; - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) - { - int state = verify_state(self->pcmHandle); - if(state < 0) - { - ERR("Invalid state detected: %s\n", snd_strerror(state)); - ALCplaybackAlsa_lock(self); - aluHandleDisconnect(device, "Bad state: %s", snd_strerror(state)); - ALCplaybackAlsa_unlock(self); - break; - } - - avail = snd_pcm_avail_update(self->pcmHandle); - if(avail < 0) - { - ERR("available update failed: %s\n", snd_strerror(avail)); - continue; - } - - if((snd_pcm_uframes_t)avail > update_size*(num_updates+1)) - { - WARN("available samples exceeds the buffer size\n"); - snd_pcm_reset(self->pcmHandle); - continue; - } - - // make sure there's frames to process - if((snd_pcm_uframes_t)avail < update_size) - { - if(state != SND_PCM_STATE_RUNNING) - { - err = snd_pcm_start(self->pcmHandle); - if(err < 0) - { - ERR("start failed: %s\n", snd_strerror(err)); - continue; - } - } - if(snd_pcm_wait(self->pcmHandle, 1000) == 0) - ERR("Wait timeout... buffer size too low?\n"); - continue; - } - avail -= avail%update_size; - - // it is possible that contiguous areas are smaller, thus we use a loop - ALCplaybackAlsa_lock(self); - while(avail > 0) - { - frames = avail; - - err = snd_pcm_mmap_begin(self->pcmHandle, &areas, &offset, &frames); - if(err < 0) - { - ERR("mmap begin error: %s\n", snd_strerror(err)); - break; - } - - WritePtr = (char*)areas->addr + (offset * areas->step / 8); - aluMixData(device, WritePtr, frames); - - commitres = snd_pcm_mmap_commit(self->pcmHandle, offset, frames); - if(commitres < 0 || (commitres-frames) != 0) - { - ERR("mmap commit error: %s\n", - snd_strerror(commitres >= 0 ? -EPIPE : commitres)); - break; - } - - avail -= frames; - } - ALCplaybackAlsa_unlock(self); - } - - return 0; -} - -static int ALCplaybackAlsa_mixerNoMMapProc(void *ptr) -{ - ALCplaybackAlsa *self = (ALCplaybackAlsa*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - snd_pcm_uframes_t update_size, num_updates; - snd_pcm_sframes_t avail; - char *WritePtr; - int err; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - update_size = device->UpdateSize; - num_updates = device->NumUpdates; - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) - { - int state = verify_state(self->pcmHandle); - if(state < 0) - { - ERR("Invalid state detected: %s\n", snd_strerror(state)); - ALCplaybackAlsa_lock(self); - aluHandleDisconnect(device, "Bad state: %s", snd_strerror(state)); - ALCplaybackAlsa_unlock(self); - break; - } - - avail = snd_pcm_avail_update(self->pcmHandle); - if(avail < 0) - { - ERR("available update failed: %s\n", snd_strerror(avail)); - continue; - } - - if((snd_pcm_uframes_t)avail > update_size*num_updates) - { - WARN("available samples exceeds the buffer size\n"); - snd_pcm_reset(self->pcmHandle); - continue; - } - - if((snd_pcm_uframes_t)avail < update_size) - { - if(state != SND_PCM_STATE_RUNNING) - { - err = snd_pcm_start(self->pcmHandle); - if(err < 0) - { - ERR("start failed: %s\n", snd_strerror(err)); - continue; - } - } - if(snd_pcm_wait(self->pcmHandle, 1000) == 0) - ERR("Wait timeout... buffer size too low?\n"); - continue; - } - - ALCplaybackAlsa_lock(self); - WritePtr = self->buffer; - avail = snd_pcm_bytes_to_frames(self->pcmHandle, self->size); - aluMixData(device, WritePtr, avail); - - while(avail > 0) - { - int ret = snd_pcm_writei(self->pcmHandle, WritePtr, avail); - switch (ret) - { - case -EAGAIN: - continue; -#if ESTRPIPE != EPIPE - case -ESTRPIPE: -#endif - case -EPIPE: - case -EINTR: - ret = snd_pcm_recover(self->pcmHandle, ret, 1); - if(ret < 0) - avail = 0; - break; - default: - if (ret >= 0) - { - WritePtr += snd_pcm_frames_to_bytes(self->pcmHandle, ret); - avail -= ret; - } - break; - } - if (ret < 0) - { - ret = snd_pcm_prepare(self->pcmHandle); - if(ret < 0) - break; - } - } - ALCplaybackAlsa_unlock(self); - } - - return 0; -} - - -static ALCenum ALCplaybackAlsa_open(ALCplaybackAlsa *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const char *driver = NULL; - int err; - - if(name) - { - const DevMap *iter; - - if(VECTOR_SIZE(PlaybackDevices) == 0) - probe_devices(SND_PCM_STREAM_PLAYBACK, &PlaybackDevices); - -#define MATCH_NAME(i) (alstr_cmp_cstr((i)->name, name) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(PlaybackDevices)) - return ALC_INVALID_VALUE; - driver = alstr_get_cstr(iter->device_name); - } - else - { - name = alsaDevice; - driver = GetConfigValue(NULL, "alsa", "device", "default"); - } - - TRACE("Opening device \"%s\"\n", driver); - err = snd_pcm_open(&self->pcmHandle, driver, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); - if(err < 0) - { - ERR("Could not open playback device '%s': %s\n", driver, snd_strerror(err)); - return ALC_OUT_OF_MEMORY; - } - - /* Free alsa's global config tree. Otherwise valgrind reports a ton of leaks. */ - snd_config_update_free_global(); - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCplaybackAlsa_reset(ALCplaybackAlsa *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - snd_pcm_uframes_t periodSizeInFrames; - unsigned int periodLen, bufferLen; - snd_pcm_sw_params_t *sp = NULL; - snd_pcm_hw_params_t *hp = NULL; - snd_pcm_format_t format = -1; - snd_pcm_access_t access; - unsigned int periods; - unsigned int rate; - const char *funcerr; - int allowmmap; - int dir; - int err; - - switch(device->FmtType) - { - case DevFmtByte: - format = SND_PCM_FORMAT_S8; - break; - case DevFmtUByte: - format = SND_PCM_FORMAT_U8; - break; - case DevFmtShort: - format = SND_PCM_FORMAT_S16; - break; - case DevFmtUShort: - format = SND_PCM_FORMAT_U16; - break; - case DevFmtInt: - format = SND_PCM_FORMAT_S32; - break; - case DevFmtUInt: - format = SND_PCM_FORMAT_U32; - break; - case DevFmtFloat: - format = SND_PCM_FORMAT_FLOAT; - break; - } - - allowmmap = GetConfigValueBool(alstr_get_cstr(device->DeviceName), "alsa", "mmap", 1); - periods = device->NumUpdates; - periodLen = (ALuint64)device->UpdateSize * 1000000 / device->Frequency; - bufferLen = periodLen * periods; - rate = device->Frequency; - - snd_pcm_hw_params_malloc(&hp); -#define CHECK(x) if((funcerr=#x),(err=(x)) < 0) goto error - CHECK(snd_pcm_hw_params_any(self->pcmHandle, hp)); - /* set interleaved access */ - if(!allowmmap || snd_pcm_hw_params_set_access(self->pcmHandle, hp, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) - { - /* No mmap */ - CHECK(snd_pcm_hw_params_set_access(self->pcmHandle, hp, SND_PCM_ACCESS_RW_INTERLEAVED)); - } - /* test and set format (implicitly sets sample bits) */ - if(snd_pcm_hw_params_test_format(self->pcmHandle, hp, format) < 0) - { - static const struct { - snd_pcm_format_t format; - enum DevFmtType fmttype; - } formatlist[] = { - { SND_PCM_FORMAT_FLOAT, DevFmtFloat }, - { SND_PCM_FORMAT_S32, DevFmtInt }, - { SND_PCM_FORMAT_U32, DevFmtUInt }, - { SND_PCM_FORMAT_S16, DevFmtShort }, - { SND_PCM_FORMAT_U16, DevFmtUShort }, - { SND_PCM_FORMAT_S8, DevFmtByte }, - { SND_PCM_FORMAT_U8, DevFmtUByte }, - }; - size_t k; - - for(k = 0;k < COUNTOF(formatlist);k++) - { - format = formatlist[k].format; - if(snd_pcm_hw_params_test_format(self->pcmHandle, hp, format) >= 0) - { - device->FmtType = formatlist[k].fmttype; - break; - } - } - } - CHECK(snd_pcm_hw_params_set_format(self->pcmHandle, hp, format)); - /* test and set channels (implicitly sets frame bits) */ - if(snd_pcm_hw_params_test_channels(self->pcmHandle, hp, ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder)) < 0) - { - static const enum DevFmtChannels channellist[] = { - DevFmtStereo, - DevFmtQuad, - DevFmtX51, - DevFmtX71, - DevFmtMono, - }; - size_t k; - - for(k = 0;k < COUNTOF(channellist);k++) - { - if(snd_pcm_hw_params_test_channels(self->pcmHandle, hp, ChannelsFromDevFmt(channellist[k], 0)) >= 0) - { - device->FmtChans = channellist[k]; - device->AmbiOrder = 0; - break; - } - } - } - CHECK(snd_pcm_hw_params_set_channels(self->pcmHandle, hp, ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder))); - /* set rate (implicitly constrains period/buffer parameters) */ - if(!GetConfigValueBool(alstr_get_cstr(device->DeviceName), "alsa", "allow-resampler", 0) || - !(device->Flags&DEVICE_FREQUENCY_REQUEST)) - { - if(snd_pcm_hw_params_set_rate_resample(self->pcmHandle, hp, 0) < 0) - ERR("Failed to disable ALSA resampler\n"); - } - else if(snd_pcm_hw_params_set_rate_resample(self->pcmHandle, hp, 1) < 0) - ERR("Failed to enable ALSA resampler\n"); - CHECK(snd_pcm_hw_params_set_rate_near(self->pcmHandle, hp, &rate, NULL)); - /* set buffer time (implicitly constrains period/buffer parameters) */ - if((err=snd_pcm_hw_params_set_buffer_time_near(self->pcmHandle, hp, &bufferLen, NULL)) < 0) - ERR("snd_pcm_hw_params_set_buffer_time_near failed: %s\n", snd_strerror(err)); - /* set period time (implicitly sets buffer size/bytes/time and period size/bytes) */ - if((err=snd_pcm_hw_params_set_period_time_near(self->pcmHandle, hp, &periodLen, NULL)) < 0) - ERR("snd_pcm_hw_params_set_period_time_near failed: %s\n", snd_strerror(err)); - /* install and prepare hardware configuration */ - CHECK(snd_pcm_hw_params(self->pcmHandle, hp)); - /* retrieve configuration info */ - CHECK(snd_pcm_hw_params_get_access(hp, &access)); - CHECK(snd_pcm_hw_params_get_period_size(hp, &periodSizeInFrames, NULL)); - CHECK(snd_pcm_hw_params_get_periods(hp, &periods, &dir)); - if(dir != 0) - WARN("Inexact period count: %u (%d)\n", periods, dir); - - snd_pcm_hw_params_free(hp); - hp = NULL; - snd_pcm_sw_params_malloc(&sp); - - CHECK(snd_pcm_sw_params_current(self->pcmHandle, sp)); - CHECK(snd_pcm_sw_params_set_avail_min(self->pcmHandle, sp, periodSizeInFrames)); - CHECK(snd_pcm_sw_params_set_stop_threshold(self->pcmHandle, sp, periodSizeInFrames*periods)); - CHECK(snd_pcm_sw_params(self->pcmHandle, sp)); -#undef CHECK - snd_pcm_sw_params_free(sp); - sp = NULL; - - device->NumUpdates = periods; - device->UpdateSize = periodSizeInFrames; - device->Frequency = rate; - - SetDefaultChannelOrder(device); - - return ALC_TRUE; - -error: - ERR("%s failed: %s\n", funcerr, snd_strerror(err)); - if(hp) snd_pcm_hw_params_free(hp); - if(sp) snd_pcm_sw_params_free(sp); - return ALC_FALSE; -} - -static ALCboolean ALCplaybackAlsa_start(ALCplaybackAlsa *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - int (*thread_func)(void*) = NULL; - snd_pcm_hw_params_t *hp = NULL; - snd_pcm_access_t access; - const char *funcerr; - int err; - - snd_pcm_hw_params_malloc(&hp); -#define CHECK(x) if((funcerr=#x),(err=(x)) < 0) goto error - CHECK(snd_pcm_hw_params_current(self->pcmHandle, hp)); - /* retrieve configuration info */ - CHECK(snd_pcm_hw_params_get_access(hp, &access)); -#undef CHECK - snd_pcm_hw_params_free(hp); - hp = NULL; - - self->size = snd_pcm_frames_to_bytes(self->pcmHandle, device->UpdateSize); - if(access == SND_PCM_ACCESS_RW_INTERLEAVED) - { - self->buffer = al_malloc(16, self->size); - if(!self->buffer) - { - ERR("buffer malloc failed\n"); - return ALC_FALSE; - } - thread_func = ALCplaybackAlsa_mixerNoMMapProc; - } - else - { - err = snd_pcm_prepare(self->pcmHandle); - if(err < 0) - { - ERR("snd_pcm_prepare(data->pcmHandle) failed: %s\n", snd_strerror(err)); - return ALC_FALSE; - } - thread_func = ALCplaybackAlsa_mixerProc; - } - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, thread_func, self) != althrd_success) - { - ERR("Could not create playback thread\n"); - al_free(self->buffer); - self->buffer = NULL; - return ALC_FALSE; - } - - return ALC_TRUE; - -error: - ERR("%s failed: %s\n", funcerr, snd_strerror(err)); - if(hp) snd_pcm_hw_params_free(hp); - return ALC_FALSE; -} - -static void ALCplaybackAlsa_stop(ALCplaybackAlsa *self) -{ - int res; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - althrd_join(self->thread, &res); - - al_free(self->buffer); - self->buffer = NULL; -} - -static ClockLatency ALCplaybackAlsa_getClockLatency(ALCplaybackAlsa *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - snd_pcm_sframes_t delay = 0; - ClockLatency ret; - int err; - - ALCplaybackAlsa_lock(self); - ret.ClockTime = GetDeviceClockTime(device); - if((err=snd_pcm_delay(self->pcmHandle, &delay)) < 0) - { - ERR("Failed to get pcm delay: %s\n", snd_strerror(err)); - delay = 0; - } - if(delay < 0) delay = 0; - ret.Latency = delay * DEVICE_CLOCK_RES / device->Frequency; - ALCplaybackAlsa_unlock(self); - - return ret; -} - - -typedef struct ALCcaptureAlsa { - DERIVE_FROM_TYPE(ALCbackend); - - snd_pcm_t *pcmHandle; - - ALvoid *buffer; - ALsizei size; - - ALboolean doCapture; - ll_ringbuffer_t *ring; - - snd_pcm_sframes_t last_avail; -} ALCcaptureAlsa; - -static void ALCcaptureAlsa_Construct(ALCcaptureAlsa *self, ALCdevice *device); -static void ALCcaptureAlsa_Destruct(ALCcaptureAlsa *self); -static ALCenum ALCcaptureAlsa_open(ALCcaptureAlsa *self, const ALCchar *name); -static DECLARE_FORWARD(ALCcaptureAlsa, ALCbackend, ALCboolean, reset) -static ALCboolean ALCcaptureAlsa_start(ALCcaptureAlsa *self); -static void ALCcaptureAlsa_stop(ALCcaptureAlsa *self); -static ALCenum ALCcaptureAlsa_captureSamples(ALCcaptureAlsa *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCcaptureAlsa_availableSamples(ALCcaptureAlsa *self); -static ClockLatency ALCcaptureAlsa_getClockLatency(ALCcaptureAlsa *self); -static DECLARE_FORWARD(ALCcaptureAlsa, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCcaptureAlsa, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCcaptureAlsa) - -DEFINE_ALCBACKEND_VTABLE(ALCcaptureAlsa); - - -static void ALCcaptureAlsa_Construct(ALCcaptureAlsa *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCcaptureAlsa, ALCbackend, self); - - self->pcmHandle = NULL; - self->buffer = NULL; - self->ring = NULL; -} - -void ALCcaptureAlsa_Destruct(ALCcaptureAlsa *self) -{ - if(self->pcmHandle) - snd_pcm_close(self->pcmHandle); - self->pcmHandle = NULL; - - al_free(self->buffer); - self->buffer = NULL; - - ll_ringbuffer_free(self->ring); - self->ring = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static ALCenum ALCcaptureAlsa_open(ALCcaptureAlsa *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const char *driver = NULL; - snd_pcm_hw_params_t *hp; - snd_pcm_uframes_t bufferSizeInFrames; - snd_pcm_uframes_t periodSizeInFrames; - ALboolean needring = AL_FALSE; - snd_pcm_format_t format = -1; - const char *funcerr; - int err; - - if(name) - { - const DevMap *iter; - - if(VECTOR_SIZE(CaptureDevices) == 0) - probe_devices(SND_PCM_STREAM_CAPTURE, &CaptureDevices); - -#define MATCH_NAME(i) (alstr_cmp_cstr((i)->name, name) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(CaptureDevices)) - return ALC_INVALID_VALUE; - driver = alstr_get_cstr(iter->device_name); - } - else - { - name = alsaDevice; - driver = GetConfigValue(NULL, "alsa", "capture", "default"); - } - - TRACE("Opening device \"%s\"\n", driver); - err = snd_pcm_open(&self->pcmHandle, driver, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK); - if(err < 0) - { - ERR("Could not open capture device '%s': %s\n", driver, snd_strerror(err)); - return ALC_INVALID_VALUE; - } - - /* Free alsa's global config tree. Otherwise valgrind reports a ton of leaks. */ - snd_config_update_free_global(); - - switch(device->FmtType) - { - case DevFmtByte: - format = SND_PCM_FORMAT_S8; - break; - case DevFmtUByte: - format = SND_PCM_FORMAT_U8; - break; - case DevFmtShort: - format = SND_PCM_FORMAT_S16; - break; - case DevFmtUShort: - format = SND_PCM_FORMAT_U16; - break; - case DevFmtInt: - format = SND_PCM_FORMAT_S32; - break; - case DevFmtUInt: - format = SND_PCM_FORMAT_U32; - break; - case DevFmtFloat: - format = SND_PCM_FORMAT_FLOAT; - break; - } - - funcerr = NULL; - bufferSizeInFrames = maxu(device->UpdateSize*device->NumUpdates, - 100*device->Frequency/1000); - periodSizeInFrames = minu(bufferSizeInFrames, 25*device->Frequency/1000); - - snd_pcm_hw_params_malloc(&hp); -#define CHECK(x) if((funcerr=#x),(err=(x)) < 0) goto error - CHECK(snd_pcm_hw_params_any(self->pcmHandle, hp)); - /* set interleaved access */ - CHECK(snd_pcm_hw_params_set_access(self->pcmHandle, hp, SND_PCM_ACCESS_RW_INTERLEAVED)); - /* set format (implicitly sets sample bits) */ - CHECK(snd_pcm_hw_params_set_format(self->pcmHandle, hp, format)); - /* set channels (implicitly sets frame bits) */ - CHECK(snd_pcm_hw_params_set_channels(self->pcmHandle, hp, ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder))); - /* set rate (implicitly constrains period/buffer parameters) */ - CHECK(snd_pcm_hw_params_set_rate(self->pcmHandle, hp, device->Frequency, 0)); - /* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */ - if(snd_pcm_hw_params_set_buffer_size_min(self->pcmHandle, hp, &bufferSizeInFrames) < 0) - { - TRACE("Buffer too large, using intermediate ring buffer\n"); - needring = AL_TRUE; - CHECK(snd_pcm_hw_params_set_buffer_size_near(self->pcmHandle, hp, &bufferSizeInFrames)); - } - /* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */ - CHECK(snd_pcm_hw_params_set_period_size_near(self->pcmHandle, hp, &periodSizeInFrames, NULL)); - /* install and prepare hardware configuration */ - CHECK(snd_pcm_hw_params(self->pcmHandle, hp)); - /* retrieve configuration info */ - CHECK(snd_pcm_hw_params_get_period_size(hp, &periodSizeInFrames, NULL)); -#undef CHECK - snd_pcm_hw_params_free(hp); - hp = NULL; - - if(needring) - { - self->ring = ll_ringbuffer_create( - device->UpdateSize*device->NumUpdates, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), - false - ); - if(!self->ring) - { - ERR("ring buffer create failed\n"); - goto error2; - } - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; - -error: - ERR("%s failed: %s\n", funcerr, snd_strerror(err)); - if(hp) snd_pcm_hw_params_free(hp); - -error2: - ll_ringbuffer_free(self->ring); - self->ring = NULL; - snd_pcm_close(self->pcmHandle); - self->pcmHandle = NULL; - - return ALC_INVALID_VALUE; -} - -static ALCboolean ALCcaptureAlsa_start(ALCcaptureAlsa *self) -{ - int err = snd_pcm_prepare(self->pcmHandle); - if(err < 0) - ERR("prepare failed: %s\n", snd_strerror(err)); - else - { - err = snd_pcm_start(self->pcmHandle); - if(err < 0) - ERR("start failed: %s\n", snd_strerror(err)); - } - if(err < 0) - { - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, "Capture state failure: %s", - snd_strerror(err)); - return ALC_FALSE; - } - - self->doCapture = AL_TRUE; - return ALC_TRUE; -} - -static void ALCcaptureAlsa_stop(ALCcaptureAlsa *self) -{ - ALCuint avail; - int err; - - /* OpenAL requires access to unread audio after stopping, but ALSA's - * snd_pcm_drain is unreliable and snd_pcm_drop drops it. Capture what's - * available now so it'll be available later after the drop. */ - avail = ALCcaptureAlsa_availableSamples(self); - if(!self->ring && avail > 0) - { - /* The ring buffer implicitly captures when checking availability. - * Direct access needs to explicitly capture it into temp storage. */ - ALsizei size; - void *ptr; - - size = snd_pcm_frames_to_bytes(self->pcmHandle, avail); - ptr = al_malloc(16, size); - if(ptr) - { - ALCcaptureAlsa_captureSamples(self, ptr, avail); - al_free(self->buffer); - self->buffer = ptr; - self->size = size; - } - } - err = snd_pcm_drop(self->pcmHandle); - if(err < 0) - ERR("drop failed: %s\n", snd_strerror(err)); - self->doCapture = AL_FALSE; -} - -static ALCenum ALCcaptureAlsa_captureSamples(ALCcaptureAlsa *self, ALCvoid *buffer, ALCuint samples) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - if(self->ring) - { - ll_ringbuffer_read(self->ring, buffer, samples); - return ALC_NO_ERROR; - } - - self->last_avail -= samples; - while(ATOMIC_LOAD(&device->Connected, almemory_order_acquire) && samples > 0) - { - snd_pcm_sframes_t amt = 0; - - if(self->size > 0) - { - /* First get any data stored from the last stop */ - amt = snd_pcm_bytes_to_frames(self->pcmHandle, self->size); - if((snd_pcm_uframes_t)amt > samples) amt = samples; - - amt = snd_pcm_frames_to_bytes(self->pcmHandle, amt); - memcpy(buffer, self->buffer, amt); - - if(self->size > amt) - { - memmove(self->buffer, self->buffer+amt, self->size - amt); - self->size -= amt; - } - else - { - al_free(self->buffer); - self->buffer = NULL; - self->size = 0; - } - amt = snd_pcm_bytes_to_frames(self->pcmHandle, amt); - } - else if(self->doCapture) - amt = snd_pcm_readi(self->pcmHandle, buffer, samples); - if(amt < 0) - { - ERR("read error: %s\n", snd_strerror(amt)); - - if(amt == -EAGAIN) - continue; - if((amt=snd_pcm_recover(self->pcmHandle, amt, 1)) >= 0) - { - amt = snd_pcm_start(self->pcmHandle); - if(amt >= 0) - amt = snd_pcm_avail_update(self->pcmHandle); - } - if(amt < 0) - { - ERR("restore error: %s\n", snd_strerror(amt)); - aluHandleDisconnect(device, "Capture recovery failure: %s", snd_strerror(amt)); - break; - } - /* If the amount available is less than what's asked, we lost it - * during recovery. So just give silence instead. */ - if((snd_pcm_uframes_t)amt < samples) - break; - continue; - } - - buffer = (ALbyte*)buffer + amt; - samples -= amt; - } - if(samples > 0) - memset(buffer, ((device->FmtType == DevFmtUByte) ? 0x80 : 0), - snd_pcm_frames_to_bytes(self->pcmHandle, samples)); - - return ALC_NO_ERROR; -} - -static ALCuint ALCcaptureAlsa_availableSamples(ALCcaptureAlsa *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - snd_pcm_sframes_t avail = 0; - - if(ATOMIC_LOAD(&device->Connected, almemory_order_acquire) && self->doCapture) - avail = snd_pcm_avail_update(self->pcmHandle); - if(avail < 0) - { - ERR("avail update failed: %s\n", snd_strerror(avail)); - - if((avail=snd_pcm_recover(self->pcmHandle, avail, 1)) >= 0) - { - if(self->doCapture) - avail = snd_pcm_start(self->pcmHandle); - if(avail >= 0) - avail = snd_pcm_avail_update(self->pcmHandle); - } - if(avail < 0) - { - ERR("restore error: %s\n", snd_strerror(avail)); - aluHandleDisconnect(device, "Capture recovery failure: %s", snd_strerror(avail)); - } - } - - if(!self->ring) - { - if(avail < 0) avail = 0; - avail += snd_pcm_bytes_to_frames(self->pcmHandle, self->size); - if(avail > self->last_avail) self->last_avail = avail; - return self->last_avail; - } - - while(avail > 0) - { - ll_ringbuffer_data_t vec[2]; - snd_pcm_sframes_t amt; - - ll_ringbuffer_get_write_vector(self->ring, vec); - if(vec[0].len == 0) break; - - amt = (vec[0].len < (snd_pcm_uframes_t)avail) ? - vec[0].len : (snd_pcm_uframes_t)avail; - amt = snd_pcm_readi(self->pcmHandle, vec[0].buf, amt); - if(amt < 0) - { - ERR("read error: %s\n", snd_strerror(amt)); - - if(amt == -EAGAIN) - continue; - if((amt=snd_pcm_recover(self->pcmHandle, amt, 1)) >= 0) - { - if(self->doCapture) - amt = snd_pcm_start(self->pcmHandle); - if(amt >= 0) - amt = snd_pcm_avail_update(self->pcmHandle); - } - if(amt < 0) - { - ERR("restore error: %s\n", snd_strerror(amt)); - aluHandleDisconnect(device, "Capture recovery failure: %s", snd_strerror(amt)); - break; - } - avail = amt; - continue; - } - - ll_ringbuffer_write_advance(self->ring, amt); - avail -= amt; - } - - return ll_ringbuffer_read_space(self->ring); -} - -static ClockLatency ALCcaptureAlsa_getClockLatency(ALCcaptureAlsa *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - snd_pcm_sframes_t delay = 0; - ClockLatency ret; - int err; - - ALCcaptureAlsa_lock(self); - ret.ClockTime = GetDeviceClockTime(device); - if((err=snd_pcm_delay(self->pcmHandle, &delay)) < 0) - { - ERR("Failed to get pcm delay: %s\n", snd_strerror(err)); - delay = 0; - } - if(delay < 0) delay = 0; - ret.Latency = delay * DEVICE_CLOCK_RES / device->Frequency; - ALCcaptureAlsa_unlock(self); - - return ret; -} - - -static inline void AppendAllDevicesList2(const DevMap *entry) -{ AppendAllDevicesList(alstr_get_cstr(entry->name)); } -static inline void AppendCaptureDeviceList2(const DevMap *entry) -{ AppendCaptureDeviceList(alstr_get_cstr(entry->name)); } - -typedef struct ALCalsaBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCalsaBackendFactory; -#define ALCALSABACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCalsaBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCalsaBackendFactory_init(ALCalsaBackendFactory* UNUSED(self)) -{ - VECTOR_INIT(PlaybackDevices); - VECTOR_INIT(CaptureDevices); - - if(!alsa_load()) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCalsaBackendFactory_deinit(ALCalsaBackendFactory* UNUSED(self)) -{ - clear_devlist(&PlaybackDevices); - VECTOR_DEINIT(PlaybackDevices); - - clear_devlist(&CaptureDevices); - VECTOR_DEINIT(CaptureDevices); - -#ifdef HAVE_DYNLOAD - if(alsa_handle) - CloseLib(alsa_handle); - alsa_handle = NULL; -#endif -} - -static ALCboolean ALCalsaBackendFactory_querySupport(ALCalsaBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCalsaBackendFactory_probe(ALCalsaBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - probe_devices(SND_PCM_STREAM_PLAYBACK, &PlaybackDevices); - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, AppendAllDevicesList2); - break; - - case CAPTURE_DEVICE_PROBE: - probe_devices(SND_PCM_STREAM_CAPTURE, &CaptureDevices); - VECTOR_FOR_EACH(const DevMap, CaptureDevices, AppendCaptureDeviceList2); - break; - } -} - -static ALCbackend* ALCalsaBackendFactory_createBackend(ALCalsaBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCplaybackAlsa *backend; - NEW_OBJ(backend, ALCplaybackAlsa)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCcaptureAlsa *backend; - NEW_OBJ(backend, ALCcaptureAlsa)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCalsaBackendFactory); - - -ALCbackendFactory *ALCalsaBackendFactory_getFactory(void) -{ - static ALCalsaBackendFactory factory = ALCALSABACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/backends/base.c b/Alc/backends/base.c deleted file mode 100644 index a451fee..0000000 --- a/Alc/backends/base.c +++ /dev/null @@ -1,83 +0,0 @@ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" - -#include "backends/base.h" - - -extern inline ALuint64 GetDeviceClockTime(ALCdevice *device); -extern inline void ALCdevice_Lock(ALCdevice *device); -extern inline void ALCdevice_Unlock(ALCdevice *device); - -/* Base ALCbackend method implementations. */ -void ALCbackend_Construct(ALCbackend *self, ALCdevice *device) -{ - int ret = almtx_init(&self->mMutex, almtx_recursive); - assert(ret == althrd_success); - self->mDevice = device; -} - -void ALCbackend_Destruct(ALCbackend *self) -{ - almtx_destroy(&self->mMutex); -} - -ALCboolean ALCbackend_reset(ALCbackend* UNUSED(self)) -{ - return ALC_FALSE; -} - -ALCenum ALCbackend_captureSamples(ALCbackend* UNUSED(self), void* UNUSED(buffer), ALCuint UNUSED(samples)) -{ - return ALC_INVALID_DEVICE; -} - -ALCuint ALCbackend_availableSamples(ALCbackend* UNUSED(self)) -{ - return 0; -} - -ClockLatency ALCbackend_getClockLatency(ALCbackend *self) -{ - ALCdevice *device = self->mDevice; - ALuint refcount; - ClockLatency ret; - - do { - while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1)) - althrd_yield(); - ret.ClockTime = GetDeviceClockTime(device); - ATOMIC_THREAD_FENCE(almemory_order_acquire); - } while(refcount != ATOMIC_LOAD(&device->MixCount, almemory_order_relaxed)); - - /* NOTE: The device will generally have about all but one periods filled at - * any given time during playback. Without a more accurate measurement from - * the output, this is an okay approximation. - */ - ret.Latency = device->UpdateSize * DEVICE_CLOCK_RES / device->Frequency * - maxu(device->NumUpdates-1, 1); - - return ret; -} - -void ALCbackend_lock(ALCbackend *self) -{ - int ret = almtx_lock(&self->mMutex); - assert(ret == althrd_success); -} - -void ALCbackend_unlock(ALCbackend *self) -{ - int ret = almtx_unlock(&self->mMutex); - assert(ret == althrd_success); -} - - -/* Base ALCbackendFactory method implementations. */ -void ALCbackendFactory_deinit(ALCbackendFactory* UNUSED(self)) -{ -} diff --git a/Alc/backends/base.h b/Alc/backends/base.h deleted file mode 100644 index ba92b4a..0000000 --- a/Alc/backends/base.h +++ /dev/null @@ -1,168 +0,0 @@ -#ifndef AL_BACKENDS_BASE_H -#define AL_BACKENDS_BASE_H - -#include "alMain.h" -#include "threads.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct ClockLatency { - ALint64 ClockTime; - ALint64 Latency; -} ClockLatency; - -/* Helper to get the current clock time from the device's ClockBase, and - * SamplesDone converted from the sample rate. - */ -inline ALuint64 GetDeviceClockTime(ALCdevice *device) -{ - return device->ClockBase + (device->SamplesDone * DEVICE_CLOCK_RES / - device->Frequency); -} - - -struct ALCbackendVtable; - -typedef struct ALCbackend { - const struct ALCbackendVtable *vtbl; - - ALCdevice *mDevice; - - almtx_t mMutex; -} ALCbackend; - -void ALCbackend_Construct(ALCbackend *self, ALCdevice *device); -void ALCbackend_Destruct(ALCbackend *self); -ALCboolean ALCbackend_reset(ALCbackend *self); -ALCenum ALCbackend_captureSamples(ALCbackend *self, void *buffer, ALCuint samples); -ALCuint ALCbackend_availableSamples(ALCbackend *self); -ClockLatency ALCbackend_getClockLatency(ALCbackend *self); -void ALCbackend_lock(ALCbackend *self); -void ALCbackend_unlock(ALCbackend *self); - -struct ALCbackendVtable { - void (*const Destruct)(ALCbackend*); - - ALCenum (*const open)(ALCbackend*, const ALCchar*); - - ALCboolean (*const reset)(ALCbackend*); - ALCboolean (*const start)(ALCbackend*); - void (*const stop)(ALCbackend*); - - ALCenum (*const captureSamples)(ALCbackend*, void*, ALCuint); - ALCuint (*const availableSamples)(ALCbackend*); - - ClockLatency (*const getClockLatency)(ALCbackend*); - - void (*const lock)(ALCbackend*); - void (*const unlock)(ALCbackend*); - - void (*const Delete)(void*); -}; - -#define DEFINE_ALCBACKEND_VTABLE(T) \ -DECLARE_THUNK(T, ALCbackend, void, Destruct) \ -DECLARE_THUNK1(T, ALCbackend, ALCenum, open, const ALCchar*) \ -DECLARE_THUNK(T, ALCbackend, ALCboolean, reset) \ -DECLARE_THUNK(T, ALCbackend, ALCboolean, start) \ -DECLARE_THUNK(T, ALCbackend, void, stop) \ -DECLARE_THUNK2(T, ALCbackend, ALCenum, captureSamples, void*, ALCuint) \ -DECLARE_THUNK(T, ALCbackend, ALCuint, availableSamples) \ -DECLARE_THUNK(T, ALCbackend, ClockLatency, getClockLatency) \ -DECLARE_THUNK(T, ALCbackend, void, lock) \ -DECLARE_THUNK(T, ALCbackend, void, unlock) \ -static void T##_ALCbackend_Delete(void *ptr) \ -{ T##_Delete(STATIC_UPCAST(T, ALCbackend, (ALCbackend*)ptr)); } \ - \ -static const struct ALCbackendVtable T##_ALCbackend_vtable = { \ - T##_ALCbackend_Destruct, \ - \ - T##_ALCbackend_open, \ - T##_ALCbackend_reset, \ - T##_ALCbackend_start, \ - T##_ALCbackend_stop, \ - T##_ALCbackend_captureSamples, \ - T##_ALCbackend_availableSamples, \ - T##_ALCbackend_getClockLatency, \ - T##_ALCbackend_lock, \ - T##_ALCbackend_unlock, \ - \ - T##_ALCbackend_Delete, \ -} - - -typedef enum ALCbackend_Type { - ALCbackend_Playback, - ALCbackend_Capture, - ALCbackend_Loopback -} ALCbackend_Type; - - -struct ALCbackendFactoryVtable; - -typedef struct ALCbackendFactory { - const struct ALCbackendFactoryVtable *vtbl; -} ALCbackendFactory; - -void ALCbackendFactory_deinit(ALCbackendFactory *self); - -struct ALCbackendFactoryVtable { - ALCboolean (*const init)(ALCbackendFactory *self); - void (*const deinit)(ALCbackendFactory *self); - - ALCboolean (*const querySupport)(ALCbackendFactory *self, ALCbackend_Type type); - - void (*const probe)(ALCbackendFactory *self, enum DevProbe type); - - ALCbackend* (*const createBackend)(ALCbackendFactory *self, ALCdevice *device, ALCbackend_Type type); -}; - -#define DEFINE_ALCBACKENDFACTORY_VTABLE(T) \ -DECLARE_THUNK(T, ALCbackendFactory, ALCboolean, init) \ -DECLARE_THUNK(T, ALCbackendFactory, void, deinit) \ -DECLARE_THUNK1(T, ALCbackendFactory, ALCboolean, querySupport, ALCbackend_Type) \ -DECLARE_THUNK1(T, ALCbackendFactory, void, probe, enum DevProbe) \ -DECLARE_THUNK2(T, ALCbackendFactory, ALCbackend*, createBackend, ALCdevice*, ALCbackend_Type) \ - \ -static const struct ALCbackendFactoryVtable T##_ALCbackendFactory_vtable = { \ - T##_ALCbackendFactory_init, \ - T##_ALCbackendFactory_deinit, \ - T##_ALCbackendFactory_querySupport, \ - T##_ALCbackendFactory_probe, \ - T##_ALCbackendFactory_createBackend, \ -} - - -ALCbackendFactory *ALCpulseBackendFactory_getFactory(void); -ALCbackendFactory *ALCalsaBackendFactory_getFactory(void); -ALCbackendFactory *ALCcoreAudioBackendFactory_getFactory(void); -ALCbackendFactory *ALCossBackendFactory_getFactory(void); -ALCbackendFactory *ALCjackBackendFactory_getFactory(void); -ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void); -ALCbackendFactory *ALCsndioBackendFactory_getFactory(void); -ALCbackendFactory *ALCqsaBackendFactory_getFactory(void); -ALCbackendFactory *ALCwasapiBackendFactory_getFactory(void); -ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void); -ALCbackendFactory *ALCwinmmBackendFactory_getFactory(void); -ALCbackendFactory *ALCportBackendFactory_getFactory(void); -ALCbackendFactory *ALCopenslBackendFactory_getFactory(void); -ALCbackendFactory *ALCnullBackendFactory_getFactory(void); -ALCbackendFactory *ALCwaveBackendFactory_getFactory(void); -ALCbackendFactory *ALCsdl2BackendFactory_getFactory(void); -ALCbackendFactory *ALCloopbackFactory_getFactory(void); - - -inline void ALCdevice_Lock(ALCdevice *device) -{ V0(device->Backend,lock)(); } - -inline void ALCdevice_Unlock(ALCdevice *device) -{ V0(device->Backend,unlock)(); } - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* AL_BACKENDS_BASE_H */ diff --git a/Alc/backends/coreaudio.c b/Alc/backends/coreaudio.c deleted file mode 100644 index a8787f7..0000000 --- a/Alc/backends/coreaudio.c +++ /dev/null @@ -1,810 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "ringbuffer.h" - -#include -#include -#include -#include - -#include "backends/base.h" - - -static const ALCchar ca_device[] = "CoreAudio Default"; - - -typedef struct ALCcoreAudioPlayback { - DERIVE_FROM_TYPE(ALCbackend); - - AudioUnit audioUnit; - - ALuint frameSize; - AudioStreamBasicDescription format; // This is the OpenAL format as a CoreAudio ASBD -} ALCcoreAudioPlayback; - -static void ALCcoreAudioPlayback_Construct(ALCcoreAudioPlayback *self, ALCdevice *device); -static void ALCcoreAudioPlayback_Destruct(ALCcoreAudioPlayback *self); -static ALCenum ALCcoreAudioPlayback_open(ALCcoreAudioPlayback *self, const ALCchar *name); -static ALCboolean ALCcoreAudioPlayback_reset(ALCcoreAudioPlayback *self); -static ALCboolean ALCcoreAudioPlayback_start(ALCcoreAudioPlayback *self); -static void ALCcoreAudioPlayback_stop(ALCcoreAudioPlayback *self); -static DECLARE_FORWARD2(ALCcoreAudioPlayback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCcoreAudioPlayback, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCcoreAudioPlayback, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCcoreAudioPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCcoreAudioPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCcoreAudioPlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCcoreAudioPlayback); - - -static void ALCcoreAudioPlayback_Construct(ALCcoreAudioPlayback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCcoreAudioPlayback, ALCbackend, self); - - self->frameSize = 0; - memset(&self->format, 0, sizeof(self->format)); -} - -static void ALCcoreAudioPlayback_Destruct(ALCcoreAudioPlayback *self) -{ - AudioUnitUninitialize(self->audioUnit); - AudioComponentInstanceDispose(self->audioUnit); - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static OSStatus ALCcoreAudioPlayback_MixerProc(void *inRefCon, - AudioUnitRenderActionFlags* UNUSED(ioActionFlags), const AudioTimeStamp* UNUSED(inTimeStamp), - UInt32 UNUSED(inBusNumber), UInt32 UNUSED(inNumberFrames), AudioBufferList *ioData) -{ - ALCcoreAudioPlayback *self = inRefCon; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - ALCcoreAudioPlayback_lock(self); - aluMixData(device, ioData->mBuffers[0].mData, - ioData->mBuffers[0].mDataByteSize / self->frameSize); - ALCcoreAudioPlayback_unlock(self); - - return noErr; -} - - -static ALCenum ALCcoreAudioPlayback_open(ALCcoreAudioPlayback *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - AudioComponentDescription desc; - AudioComponent comp; - OSStatus err; - - if(!name) - name = ca_device; - else if(strcmp(name, ca_device) != 0) - return ALC_INVALID_VALUE; - - /* open the default output unit */ - desc.componentType = kAudioUnitType_Output; - desc.componentSubType = kAudioUnitSubType_DefaultOutput; - desc.componentManufacturer = kAudioUnitManufacturer_Apple; - desc.componentFlags = 0; - desc.componentFlagsMask = 0; - - comp = AudioComponentFindNext(NULL, &desc); - if(comp == NULL) - { - ERR("AudioComponentFindNext failed\n"); - return ALC_INVALID_VALUE; - } - - err = AudioComponentInstanceNew(comp, &self->audioUnit); - if(err != noErr) - { - ERR("AudioComponentInstanceNew failed\n"); - return ALC_INVALID_VALUE; - } - - /* init and start the default audio unit... */ - err = AudioUnitInitialize(self->audioUnit); - if(err != noErr) - { - ERR("AudioUnitInitialize failed\n"); - AudioComponentInstanceDispose(self->audioUnit); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - return ALC_NO_ERROR; -} - -static ALCboolean ALCcoreAudioPlayback_reset(ALCcoreAudioPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - AudioStreamBasicDescription streamFormat; - AURenderCallbackStruct input; - OSStatus err; - UInt32 size; - - err = AudioUnitUninitialize(self->audioUnit); - if(err != noErr) - ERR("-- AudioUnitUninitialize failed.\n"); - - /* retrieve default output unit's properties (output side) */ - size = sizeof(AudioStreamBasicDescription); - err = AudioUnitGetProperty(self->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &streamFormat, &size); - if(err != noErr || size != sizeof(AudioStreamBasicDescription)) - { - ERR("AudioUnitGetProperty failed\n"); - return ALC_FALSE; - } - -#if 0 - TRACE("Output streamFormat of default output unit -\n"); - TRACE(" streamFormat.mFramesPerPacket = %d\n", streamFormat.mFramesPerPacket); - TRACE(" streamFormat.mChannelsPerFrame = %d\n", streamFormat.mChannelsPerFrame); - TRACE(" streamFormat.mBitsPerChannel = %d\n", streamFormat.mBitsPerChannel); - TRACE(" streamFormat.mBytesPerPacket = %d\n", streamFormat.mBytesPerPacket); - TRACE(" streamFormat.mBytesPerFrame = %d\n", streamFormat.mBytesPerFrame); - TRACE(" streamFormat.mSampleRate = %5.0f\n", streamFormat.mSampleRate); -#endif - - /* set default output unit's input side to match output side */ - err = AudioUnitSetProperty(self->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, size); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - return ALC_FALSE; - } - - if(device->Frequency != streamFormat.mSampleRate) - { - device->NumUpdates = (ALuint)((ALuint64)device->NumUpdates * - streamFormat.mSampleRate / - device->Frequency); - device->Frequency = streamFormat.mSampleRate; - } - - /* FIXME: How to tell what channels are what in the output device, and how - * to specify what we're giving? eg, 6.0 vs 5.1 */ - switch(streamFormat.mChannelsPerFrame) - { - case 1: - device->FmtChans = DevFmtMono; - break; - case 2: - device->FmtChans = DevFmtStereo; - break; - case 4: - device->FmtChans = DevFmtQuad; - break; - case 6: - device->FmtChans = DevFmtX51; - break; - case 7: - device->FmtChans = DevFmtX61; - break; - case 8: - device->FmtChans = DevFmtX71; - break; - default: - ERR("Unhandled channel count (%d), using Stereo\n", streamFormat.mChannelsPerFrame); - device->FmtChans = DevFmtStereo; - streamFormat.mChannelsPerFrame = 2; - break; - } - SetDefaultWFXChannelOrder(device); - - /* use channel count and sample rate from the default output unit's current - * parameters, but reset everything else */ - streamFormat.mFramesPerPacket = 1; - streamFormat.mFormatFlags = 0; - switch(device->FmtType) - { - case DevFmtUByte: - device->FmtType = DevFmtByte; - /* fall-through */ - case DevFmtByte: - streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; - streamFormat.mBitsPerChannel = 8; - break; - case DevFmtUShort: - device->FmtType = DevFmtShort; - /* fall-through */ - case DevFmtShort: - streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; - streamFormat.mBitsPerChannel = 16; - break; - case DevFmtUInt: - device->FmtType = DevFmtInt; - /* fall-through */ - case DevFmtInt: - streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; - streamFormat.mBitsPerChannel = 32; - break; - case DevFmtFloat: - streamFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; - streamFormat.mBitsPerChannel = 32; - break; - } - streamFormat.mBytesPerFrame = streamFormat.mChannelsPerFrame * - streamFormat.mBitsPerChannel / 8; - streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame; - streamFormat.mFormatID = kAudioFormatLinearPCM; - streamFormat.mFormatFlags |= kAudioFormatFlagsNativeEndian | - kLinearPCMFormatFlagIsPacked; - - err = AudioUnitSetProperty(self->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, sizeof(AudioStreamBasicDescription)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - return ALC_FALSE; - } - - /* setup callback */ - self->frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - input.inputProc = ALCcoreAudioPlayback_MixerProc; - input.inputProcRefCon = self; - - err = AudioUnitSetProperty(self->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &input, sizeof(AURenderCallbackStruct)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - return ALC_FALSE; - } - - /* init the default audio unit... */ - err = AudioUnitInitialize(self->audioUnit); - if(err != noErr) - { - ERR("AudioUnitInitialize failed\n"); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static ALCboolean ALCcoreAudioPlayback_start(ALCcoreAudioPlayback *self) -{ - OSStatus err = AudioOutputUnitStart(self->audioUnit); - if(err != noErr) - { - ERR("AudioOutputUnitStart failed\n"); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCcoreAudioPlayback_stop(ALCcoreAudioPlayback *self) -{ - OSStatus err = AudioOutputUnitStop(self->audioUnit); - if(err != noErr) - ERR("AudioOutputUnitStop failed\n"); -} - - - - -typedef struct ALCcoreAudioCapture { - DERIVE_FROM_TYPE(ALCbackend); - - AudioUnit audioUnit; - - ALuint frameSize; - ALdouble sampleRateRatio; // Ratio of hardware sample rate / requested sample rate - AudioStreamBasicDescription format; // This is the OpenAL format as a CoreAudio ASBD - - AudioConverterRef audioConverter; // Sample rate converter if needed - AudioBufferList *bufferList; // Buffer for data coming from the input device - ALCvoid *resampleBuffer; // Buffer for returned RingBuffer data when resampling - - ll_ringbuffer_t *ring; -} ALCcoreAudioCapture; - -static void ALCcoreAudioCapture_Construct(ALCcoreAudioCapture *self, ALCdevice *device); -static void ALCcoreAudioCapture_Destruct(ALCcoreAudioCapture *self); -static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar *name); -static DECLARE_FORWARD(ALCcoreAudioCapture, ALCbackend, ALCboolean, reset) -static ALCboolean ALCcoreAudioCapture_start(ALCcoreAudioCapture *self); -static void ALCcoreAudioCapture_stop(ALCcoreAudioCapture *self); -static ALCenum ALCcoreAudioCapture_captureSamples(ALCcoreAudioCapture *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCcoreAudioCapture_availableSamples(ALCcoreAudioCapture *self); -static DECLARE_FORWARD(ALCcoreAudioCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCcoreAudioCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCcoreAudioCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCcoreAudioCapture) - -DEFINE_ALCBACKEND_VTABLE(ALCcoreAudioCapture); - - -static AudioBufferList *allocate_buffer_list(UInt32 channelCount, UInt32 byteSize) -{ - AudioBufferList *list; - - list = calloc(1, FAM_SIZE(AudioBufferList, mBuffers, 1) + byteSize); - if(list) - { - list->mNumberBuffers = 1; - - list->mBuffers[0].mNumberChannels = channelCount; - list->mBuffers[0].mDataByteSize = byteSize; - list->mBuffers[0].mData = &list->mBuffers[1]; - } - return list; -} - -static void destroy_buffer_list(AudioBufferList *list) -{ - free(list); -} - - -static void ALCcoreAudioCapture_Construct(ALCcoreAudioCapture *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCcoreAudioCapture, ALCbackend, self); - - self->audioUnit = 0; - self->audioConverter = NULL; - self->bufferList = NULL; - self->resampleBuffer = NULL; - self->ring = NULL; -} - -static void ALCcoreAudioCapture_Destruct(ALCcoreAudioCapture *self) -{ - ll_ringbuffer_free(self->ring); - self->ring = NULL; - - free(self->resampleBuffer); - self->resampleBuffer = NULL; - - destroy_buffer_list(self->bufferList); - self->bufferList = NULL; - - if(self->audioConverter) - AudioConverterDispose(self->audioConverter); - self->audioConverter = NULL; - - if(self->audioUnit) - AudioComponentInstanceDispose(self->audioUnit); - self->audioUnit = 0; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static OSStatus ALCcoreAudioCapture_RecordProc(void *inRefCon, - AudioUnitRenderActionFlags* UNUSED(ioActionFlags), - const AudioTimeStamp *inTimeStamp, UInt32 UNUSED(inBusNumber), - UInt32 inNumberFrames, AudioBufferList* UNUSED(ioData)) -{ - ALCcoreAudioCapture *self = inRefCon; - AudioUnitRenderActionFlags flags = 0; - OSStatus err; - - // fill the bufferList with data from the input device - err = AudioUnitRender(self->audioUnit, &flags, inTimeStamp, 1, inNumberFrames, self->bufferList); - if(err != noErr) - { - ERR("AudioUnitRender error: %d\n", err); - return err; - } - - ll_ringbuffer_write(self->ring, self->bufferList->mBuffers[0].mData, inNumberFrames); - - return noErr; -} - -static OSStatus ALCcoreAudioCapture_ConvertCallback(AudioConverterRef UNUSED(inAudioConverter), - UInt32 *ioNumberDataPackets, AudioBufferList *ioData, - AudioStreamPacketDescription** UNUSED(outDataPacketDescription), - void *inUserData) -{ - ALCcoreAudioCapture *self = inUserData; - - // Read from the ring buffer and store temporarily in a large buffer - ll_ringbuffer_read(self->ring, self->resampleBuffer, *ioNumberDataPackets); - - // Set the input data - ioData->mNumberBuffers = 1; - ioData->mBuffers[0].mNumberChannels = self->format.mChannelsPerFrame; - ioData->mBuffers[0].mData = self->resampleBuffer; - ioData->mBuffers[0].mDataByteSize = (*ioNumberDataPackets) * self->format.mBytesPerFrame; - - return noErr; -} - - -static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - AudioStreamBasicDescription requestedFormat; // The application requested format - AudioStreamBasicDescription hardwareFormat; // The hardware format - AudioStreamBasicDescription outputFormat; // The AudioUnit output format - AURenderCallbackStruct input; - AudioComponentDescription desc; - AudioDeviceID inputDevice; - UInt32 outputFrameCount; - UInt32 propertySize; - AudioObjectPropertyAddress propertyAddress; - UInt32 enableIO; - AudioComponent comp; - OSStatus err; - - if(!name) - name = ca_device; - else if(strcmp(name, ca_device) != 0) - return ALC_INVALID_VALUE; - - desc.componentType = kAudioUnitType_Output; - desc.componentSubType = kAudioUnitSubType_HALOutput; - desc.componentManufacturer = kAudioUnitManufacturer_Apple; - desc.componentFlags = 0; - desc.componentFlagsMask = 0; - - // Search for component with given description - comp = AudioComponentFindNext(NULL, &desc); - if(comp == NULL) - { - ERR("AudioComponentFindNext failed\n"); - return ALC_INVALID_VALUE; - } - - // Open the component - err = AudioComponentInstanceNew(comp, &self->audioUnit); - if(err != noErr) - { - ERR("AudioComponentInstanceNew failed\n"); - goto error; - } - - // Turn off AudioUnit output - enableIO = 0; - err = AudioUnitSetProperty(self->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO, sizeof(ALuint)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - goto error; - } - - // Turn on AudioUnit input - enableIO = 1; - err = AudioUnitSetProperty(self->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO, sizeof(ALuint)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - goto error; - } - - // Get the default input device - - propertySize = sizeof(AudioDeviceID); - propertyAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; - propertyAddress.mScope = kAudioObjectPropertyScopeGlobal; - propertyAddress.mElement = kAudioObjectPropertyElementMaster; - - err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &propertySize, &inputDevice); - if(err != noErr) - { - ERR("AudioObjectGetPropertyData failed\n"); - goto error; - } - - if(inputDevice == kAudioDeviceUnknown) - { - ERR("No input device found\n"); - goto error; - } - - // Track the input device - err = AudioUnitSetProperty(self->audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &inputDevice, sizeof(AudioDeviceID)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - goto error; - } - - // set capture callback - input.inputProc = ALCcoreAudioCapture_RecordProc; - input.inputProcRefCon = self; - - err = AudioUnitSetProperty(self->audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &input, sizeof(AURenderCallbackStruct)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - goto error; - } - - // Initialize the device - err = AudioUnitInitialize(self->audioUnit); - if(err != noErr) - { - ERR("AudioUnitInitialize failed\n"); - goto error; - } - - // Get the hardware format - propertySize = sizeof(AudioStreamBasicDescription); - err = AudioUnitGetProperty(self->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 1, &hardwareFormat, &propertySize); - if(err != noErr || propertySize != sizeof(AudioStreamBasicDescription)) - { - ERR("AudioUnitGetProperty failed\n"); - goto error; - } - - // Set up the requested format description - switch(device->FmtType) - { - case DevFmtUByte: - requestedFormat.mBitsPerChannel = 8; - requestedFormat.mFormatFlags = kAudioFormatFlagIsPacked; - break; - case DevFmtShort: - requestedFormat.mBitsPerChannel = 16; - requestedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; - break; - case DevFmtInt: - requestedFormat.mBitsPerChannel = 32; - requestedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; - break; - case DevFmtFloat: - requestedFormat.mBitsPerChannel = 32; - requestedFormat.mFormatFlags = kAudioFormatFlagIsPacked; - break; - case DevFmtByte: - case DevFmtUShort: - case DevFmtUInt: - ERR("%s samples not supported\n", DevFmtTypeString(device->FmtType)); - goto error; - } - - switch(device->FmtChans) - { - case DevFmtMono: - requestedFormat.mChannelsPerFrame = 1; - break; - case DevFmtStereo: - requestedFormat.mChannelsPerFrame = 2; - break; - - case DevFmtQuad: - case DevFmtX51: - case DevFmtX51Rear: - case DevFmtX61: - case DevFmtX71: - case DevFmtAmbi3D: - ERR("%s not supported\n", DevFmtChannelsString(device->FmtChans)); - goto error; - } - - requestedFormat.mBytesPerFrame = requestedFormat.mChannelsPerFrame * requestedFormat.mBitsPerChannel / 8; - requestedFormat.mBytesPerPacket = requestedFormat.mBytesPerFrame; - requestedFormat.mSampleRate = device->Frequency; - requestedFormat.mFormatID = kAudioFormatLinearPCM; - requestedFormat.mReserved = 0; - requestedFormat.mFramesPerPacket = 1; - - // save requested format description for later use - self->format = requestedFormat; - self->frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - // Use intermediate format for sample rate conversion (outputFormat) - // Set sample rate to the same as hardware for resampling later - outputFormat = requestedFormat; - outputFormat.mSampleRate = hardwareFormat.mSampleRate; - - // Determine sample rate ratio for resampling - self->sampleRateRatio = outputFormat.mSampleRate / device->Frequency; - - // The output format should be the requested format, but using the hardware sample rate - // This is because the AudioUnit will automatically scale other properties, except for sample rate - err = AudioUnitSetProperty(self->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, (void *)&outputFormat, sizeof(outputFormat)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed\n"); - goto error; - } - - // Set the AudioUnit output format frame count - outputFrameCount = device->UpdateSize * self->sampleRateRatio; - err = AudioUnitSetProperty(self->audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Output, 0, &outputFrameCount, sizeof(outputFrameCount)); - if(err != noErr) - { - ERR("AudioUnitSetProperty failed: %d\n", err); - goto error; - } - - // Set up sample converter - err = AudioConverterNew(&outputFormat, &requestedFormat, &self->audioConverter); - if(err != noErr) - { - ERR("AudioConverterNew failed: %d\n", err); - goto error; - } - - // Create a buffer for use in the resample callback - self->resampleBuffer = malloc(device->UpdateSize * self->frameSize * self->sampleRateRatio); - - // Allocate buffer for the AudioUnit output - self->bufferList = allocate_buffer_list(outputFormat.mChannelsPerFrame, device->UpdateSize * self->frameSize * self->sampleRateRatio); - if(self->bufferList == NULL) - goto error; - - self->ring = ll_ringbuffer_create( - (size_t)ceil(device->UpdateSize*self->sampleRateRatio*device->NumUpdates), - self->frameSize, false - ); - if(!self->ring) goto error; - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; - -error: - ll_ringbuffer_free(self->ring); - self->ring = NULL; - free(self->resampleBuffer); - self->resampleBuffer = NULL; - destroy_buffer_list(self->bufferList); - self->bufferList = NULL; - - if(self->audioConverter) - AudioConverterDispose(self->audioConverter); - self->audioConverter = NULL; - if(self->audioUnit) - AudioComponentInstanceDispose(self->audioUnit); - self->audioUnit = 0; - - return ALC_INVALID_VALUE; -} - - -static ALCboolean ALCcoreAudioCapture_start(ALCcoreAudioCapture *self) -{ - OSStatus err = AudioOutputUnitStart(self->audioUnit); - if(err != noErr) - { - ERR("AudioOutputUnitStart failed\n"); - return ALC_FALSE; - } - return ALC_TRUE; -} - -static void ALCcoreAudioCapture_stop(ALCcoreAudioCapture *self) -{ - OSStatus err = AudioOutputUnitStop(self->audioUnit); - if(err != noErr) - ERR("AudioOutputUnitStop failed\n"); -} - -static ALCenum ALCcoreAudioCapture_captureSamples(ALCcoreAudioCapture *self, ALCvoid *buffer, ALCuint samples) -{ - union { - ALbyte _[sizeof(AudioBufferList) + sizeof(AudioBuffer)]; - AudioBufferList list; - } audiobuf = { { 0 } }; - UInt32 frameCount; - OSStatus err; - - // If no samples are requested, just return - if(samples == 0) return ALC_NO_ERROR; - - // Point the resampling buffer to the capture buffer - audiobuf.list.mNumberBuffers = 1; - audiobuf.list.mBuffers[0].mNumberChannels = self->format.mChannelsPerFrame; - audiobuf.list.mBuffers[0].mDataByteSize = samples * self->frameSize; - audiobuf.list.mBuffers[0].mData = buffer; - - // Resample into another AudioBufferList - frameCount = samples; - err = AudioConverterFillComplexBuffer(self->audioConverter, - ALCcoreAudioCapture_ConvertCallback, self, &frameCount, &audiobuf.list, NULL - ); - if(err != noErr) - { - ERR("AudioConverterFillComplexBuffer error: %d\n", err); - return ALC_INVALID_VALUE; - } - return ALC_NO_ERROR; -} - -static ALCuint ALCcoreAudioCapture_availableSamples(ALCcoreAudioCapture *self) -{ - return ll_ringbuffer_read_space(self->ring) / self->sampleRateRatio; -} - - -typedef struct ALCcoreAudioBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCcoreAudioBackendFactory; -#define ALCCOREAUDIOBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCcoreAudioBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCcoreAudioBackendFactory_getFactory(void); - -static ALCboolean ALCcoreAudioBackendFactory_init(ALCcoreAudioBackendFactory *self); -static DECLARE_FORWARD(ALCcoreAudioBackendFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCcoreAudioBackendFactory_querySupport(ALCcoreAudioBackendFactory *self, ALCbackend_Type type); -static void ALCcoreAudioBackendFactory_probe(ALCcoreAudioBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCcoreAudioBackendFactory_createBackend(ALCcoreAudioBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCcoreAudioBackendFactory); - - -ALCbackendFactory *ALCcoreAudioBackendFactory_getFactory(void) -{ - static ALCcoreAudioBackendFactory factory = ALCCOREAUDIOBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCcoreAudioBackendFactory_init(ALCcoreAudioBackendFactory* UNUSED(self)) -{ - return ALC_TRUE; -} - -static ALCboolean ALCcoreAudioBackendFactory_querySupport(ALCcoreAudioBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCcoreAudioBackendFactory_probe(ALCcoreAudioBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(ca_device); - break; - case CAPTURE_DEVICE_PROBE: - AppendCaptureDeviceList(ca_device); - break; - } -} - -static ALCbackend* ALCcoreAudioBackendFactory_createBackend(ALCcoreAudioBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCcoreAudioPlayback *backend; - NEW_OBJ(backend, ALCcoreAudioPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCcoreAudioCapture *backend; - NEW_OBJ(backend, ALCcoreAudioCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/dsound.c b/Alc/backends/dsound.c deleted file mode 100644 index 6bab641..0000000 --- a/Alc/backends/dsound.c +++ /dev/null @@ -1,1078 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include -#include -#include -#ifndef _WAVEFORMATEXTENSIBLE_ -#include -#include -#endif - -#include "alMain.h" -#include "alu.h" -#include "ringbuffer.h" -#include "threads.h" -#include "compat.h" -#include "alstring.h" - -#include "backends/base.h" - -#ifndef DSSPEAKER_5POINT1 -# define DSSPEAKER_5POINT1 0x00000006 -#endif -#ifndef DSSPEAKER_5POINT1_BACK -# define DSSPEAKER_5POINT1_BACK 0x00000006 -#endif -#ifndef DSSPEAKER_7POINT1 -# define DSSPEAKER_7POINT1 0x00000007 -#endif -#ifndef DSSPEAKER_7POINT1_SURROUND -# define DSSPEAKER_7POINT1_SURROUND 0x00000008 -#endif -#ifndef DSSPEAKER_5POINT1_SURROUND -# define DSSPEAKER_5POINT1_SURROUND 0x00000009 -#endif - - -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); - -#define DEVNAME_HEAD "OpenAL Soft on " - - -#ifdef HAVE_DYNLOAD -static void *ds_handle; -static HRESULT (WINAPI *pDirectSoundCreate)(const GUID *pcGuidDevice, IDirectSound **ppDS, IUnknown *pUnkOuter); -static HRESULT (WINAPI *pDirectSoundEnumerateW)(LPDSENUMCALLBACKW pDSEnumCallback, void *pContext); -static HRESULT (WINAPI *pDirectSoundCaptureCreate)(const GUID *pcGuidDevice, IDirectSoundCapture **ppDSC, IUnknown *pUnkOuter); -static HRESULT (WINAPI *pDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW pDSEnumCallback, void *pContext); - -#define DirectSoundCreate pDirectSoundCreate -#define DirectSoundEnumerateW pDirectSoundEnumerateW -#define DirectSoundCaptureCreate pDirectSoundCaptureCreate -#define DirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW -#endif - - -static ALCboolean DSoundLoad(void) -{ -#ifdef HAVE_DYNLOAD - if(!ds_handle) - { - ds_handle = LoadLib("dsound.dll"); - if(ds_handle == NULL) - { - ERR("Failed to load dsound.dll\n"); - return ALC_FALSE; - } - -#define LOAD_FUNC(f) do { \ - p##f = GetSymbol(ds_handle, #f); \ - if(p##f == NULL) { \ - CloseLib(ds_handle); \ - ds_handle = NULL; \ - return ALC_FALSE; \ - } \ -} while(0) - LOAD_FUNC(DirectSoundCreate); - LOAD_FUNC(DirectSoundEnumerateW); - LOAD_FUNC(DirectSoundCaptureCreate); - LOAD_FUNC(DirectSoundCaptureEnumerateW); -#undef LOAD_FUNC - } -#endif - return ALC_TRUE; -} - - -#define MAX_UPDATES 128 - -typedef struct { - al_string name; - GUID guid; -} DevMap; -TYPEDEF_VECTOR(DevMap, vector_DevMap) - -static vector_DevMap PlaybackDevices; -static vector_DevMap CaptureDevices; - -static void clear_devlist(vector_DevMap *list) -{ -#define DEINIT_STR(i) AL_STRING_DEINIT((i)->name) - VECTOR_FOR_EACH(DevMap, *list, DEINIT_STR); - VECTOR_RESIZE(*list, 0, 0); -#undef DEINIT_STR -} - -static BOOL CALLBACK DSoundEnumDevices(GUID *guid, const WCHAR *desc, const WCHAR* UNUSED(drvname), void *data) -{ - vector_DevMap *devices = data; - OLECHAR *guidstr = NULL; - DevMap entry; - HRESULT hr; - int count; - - if(!guid) - return TRUE; - - AL_STRING_INIT(entry.name); - - count = 0; - while(1) - { - const DevMap *iter; - - alstr_copy_cstr(&entry.name, DEVNAME_HEAD); - alstr_append_wcstr(&entry.name, desc); - if(count != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", count+1); - alstr_append_cstr(&entry.name, str); - } - -#define MATCH_ENTRY(i) (alstr_cmp(entry.name, (i)->name) == 0) - VECTOR_FIND_IF(iter, const DevMap, *devices, MATCH_ENTRY); - if(iter == VECTOR_END(*devices)) break; -#undef MATCH_ENTRY - count++; - } - entry.guid = *guid; - - hr = StringFromCLSID(guid, &guidstr); - if(SUCCEEDED(hr)) - { - TRACE("Got device \"%s\", GUID \"%ls\"\n", alstr_get_cstr(entry.name), guidstr); - CoTaskMemFree(guidstr); - } - - VECTOR_PUSH_BACK(*devices, entry); - - return TRUE; -} - - -typedef struct ALCdsoundPlayback { - DERIVE_FROM_TYPE(ALCbackend); - - IDirectSound *DS; - IDirectSoundBuffer *PrimaryBuffer; - IDirectSoundBuffer *Buffer; - IDirectSoundNotify *Notifies; - HANDLE NotifyEvent; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCdsoundPlayback; - -static int ALCdsoundPlayback_mixerProc(void *ptr); - -static void ALCdsoundPlayback_Construct(ALCdsoundPlayback *self, ALCdevice *device); -static void ALCdsoundPlayback_Destruct(ALCdsoundPlayback *self); -static ALCenum ALCdsoundPlayback_open(ALCdsoundPlayback *self, const ALCchar *name); -static ALCboolean ALCdsoundPlayback_reset(ALCdsoundPlayback *self); -static ALCboolean ALCdsoundPlayback_start(ALCdsoundPlayback *self); -static void ALCdsoundPlayback_stop(ALCdsoundPlayback *self); -static DECLARE_FORWARD2(ALCdsoundPlayback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCdsoundPlayback, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCdsoundPlayback, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCdsoundPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCdsoundPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCdsoundPlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCdsoundPlayback); - - -static void ALCdsoundPlayback_Construct(ALCdsoundPlayback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCdsoundPlayback, ALCbackend, self); - - self->DS = NULL; - self->PrimaryBuffer = NULL; - self->Buffer = NULL; - self->Notifies = NULL; - self->NotifyEvent = NULL; - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCdsoundPlayback_Destruct(ALCdsoundPlayback *self) -{ - if(self->Notifies) - IDirectSoundNotify_Release(self->Notifies); - self->Notifies = NULL; - if(self->Buffer) - IDirectSoundBuffer_Release(self->Buffer); - self->Buffer = NULL; - if(self->PrimaryBuffer != NULL) - IDirectSoundBuffer_Release(self->PrimaryBuffer); - self->PrimaryBuffer = NULL; - - if(self->DS) - IDirectSound_Release(self->DS); - self->DS = NULL; - if(self->NotifyEvent) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -FORCE_ALIGN static int ALCdsoundPlayback_mixerProc(void *ptr) -{ - ALCdsoundPlayback *self = ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - DSBCAPS DSBCaps; - DWORD LastCursor = 0; - DWORD PlayCursor; - void *WritePtr1, *WritePtr2; - DWORD WriteCnt1, WriteCnt2; - BOOL Playing = FALSE; - DWORD FrameSize; - DWORD FragSize; - DWORD avail; - HRESULT err; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - memset(&DSBCaps, 0, sizeof(DSBCaps)); - DSBCaps.dwSize = sizeof(DSBCaps); - err = IDirectSoundBuffer_GetCaps(self->Buffer, &DSBCaps); - if(FAILED(err)) - { - ERR("Failed to get buffer caps: 0x%lx\n", err); - ALCdevice_Lock(device); - aluHandleDisconnect(device, "Failure retrieving playback buffer info: 0x%lx", err); - ALCdevice_Unlock(device); - return 1; - } - - FrameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - FragSize = device->UpdateSize * FrameSize; - - IDirectSoundBuffer_GetCurrentPosition(self->Buffer, &LastCursor, NULL); - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - // Get current play cursor - IDirectSoundBuffer_GetCurrentPosition(self->Buffer, &PlayCursor, NULL); - avail = (PlayCursor-LastCursor+DSBCaps.dwBufferBytes) % DSBCaps.dwBufferBytes; - - if(avail < FragSize) - { - if(!Playing) - { - err = IDirectSoundBuffer_Play(self->Buffer, 0, 0, DSBPLAY_LOOPING); - if(FAILED(err)) - { - ERR("Failed to play buffer: 0x%lx\n", err); - ALCdevice_Lock(device); - aluHandleDisconnect(device, "Failure starting playback: 0x%lx", err); - ALCdevice_Unlock(device); - return 1; - } - Playing = TRUE; - } - - avail = WaitForSingleObjectEx(self->NotifyEvent, 2000, FALSE); - if(avail != WAIT_OBJECT_0) - ERR("WaitForSingleObjectEx error: 0x%lx\n", avail); - continue; - } - avail -= avail%FragSize; - - // Lock output buffer - WriteCnt1 = 0; - WriteCnt2 = 0; - err = IDirectSoundBuffer_Lock(self->Buffer, LastCursor, avail, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0); - - // If the buffer is lost, restore it and lock - if(err == DSERR_BUFFERLOST) - { - WARN("Buffer lost, restoring...\n"); - err = IDirectSoundBuffer_Restore(self->Buffer); - if(SUCCEEDED(err)) - { - Playing = FALSE; - LastCursor = 0; - err = IDirectSoundBuffer_Lock(self->Buffer, 0, DSBCaps.dwBufferBytes, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0); - } - } - - // Successfully locked the output buffer - if(SUCCEEDED(err)) - { - // If we have an active context, mix data directly into output buffer otherwise fill with silence - ALCdevice_Lock(device); - aluMixData(device, WritePtr1, WriteCnt1/FrameSize); - aluMixData(device, WritePtr2, WriteCnt2/FrameSize); - ALCdevice_Unlock(device); - - // Unlock output buffer only when successfully locked - IDirectSoundBuffer_Unlock(self->Buffer, WritePtr1, WriteCnt1, WritePtr2, WriteCnt2); - } - else - { - ERR("Buffer lock error: %#lx\n", err); - ALCdevice_Lock(device); - aluHandleDisconnect(device, "Failed to lock output buffer: 0x%lx", err); - ALCdevice_Unlock(device); - return 1; - } - - // Update old write cursor location - LastCursor += WriteCnt1+WriteCnt2; - LastCursor %= DSBCaps.dwBufferBytes; - } - - return 0; -} - -static ALCenum ALCdsoundPlayback_open(ALCdsoundPlayback *self, const ALCchar *deviceName) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const GUID *guid = NULL; - HRESULT hr, hrcom; - - if(VECTOR_SIZE(PlaybackDevices) == 0) - { - /* Initialize COM to prevent name truncation */ - hrcom = CoInitialize(NULL); - hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices); - if(FAILED(hr)) - ERR("Error enumerating DirectSound devices (0x%lx)!\n", hr); - if(SUCCEEDED(hrcom)) - CoUninitialize(); - } - - if(!deviceName && VECTOR_SIZE(PlaybackDevices) > 0) - { - deviceName = alstr_get_cstr(VECTOR_FRONT(PlaybackDevices).name); - guid = &VECTOR_FRONT(PlaybackDevices).guid; - } - else - { - const DevMap *iter; - -#define MATCH_NAME(i) (alstr_cmp_cstr((i)->name, deviceName) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(PlaybackDevices)) - return ALC_INVALID_VALUE; - guid = &iter->guid; - } - - hr = DS_OK; - self->NotifyEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - if(self->NotifyEvent == NULL) - hr = E_FAIL; - - //DirectSound Init code - if(SUCCEEDED(hr)) - hr = DirectSoundCreate(guid, &self->DS, NULL); - if(SUCCEEDED(hr)) - hr = IDirectSound_SetCooperativeLevel(self->DS, GetForegroundWindow(), DSSCL_PRIORITY); - if(FAILED(hr)) - { - if(self->DS) - IDirectSound_Release(self->DS); - self->DS = NULL; - if(self->NotifyEvent) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - - ERR("Device init failed: 0x%08lx\n", hr); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, deviceName); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCdsoundPlayback_reset(ALCdsoundPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - DSBUFFERDESC DSBDescription; - WAVEFORMATEXTENSIBLE OutputType; - DWORD speakers; - HRESULT hr; - - memset(&OutputType, 0, sizeof(OutputType)); - - if(self->Notifies) - IDirectSoundNotify_Release(self->Notifies); - self->Notifies = NULL; - if(self->Buffer) - IDirectSoundBuffer_Release(self->Buffer); - self->Buffer = NULL; - if(self->PrimaryBuffer != NULL) - IDirectSoundBuffer_Release(self->PrimaryBuffer); - self->PrimaryBuffer = NULL; - - switch(device->FmtType) - { - case DevFmtByte: - device->FmtType = DevFmtUByte; - break; - case DevFmtFloat: - if((device->Flags&DEVICE_SAMPLE_TYPE_REQUEST)) - break; - /* fall-through */ - case DevFmtUShort: - device->FmtType = DevFmtShort; - break; - case DevFmtUInt: - device->FmtType = DevFmtInt; - break; - case DevFmtUByte: - case DevFmtShort: - case DevFmtInt: - break; - } - - hr = IDirectSound_GetSpeakerConfig(self->DS, &speakers); - if(SUCCEEDED(hr)) - { - speakers = DSSPEAKER_CONFIG(speakers); - if(!(device->Flags&DEVICE_CHANNELS_REQUEST)) - { - if(speakers == DSSPEAKER_MONO) - device->FmtChans = DevFmtMono; - else if(speakers == DSSPEAKER_STEREO || speakers == DSSPEAKER_HEADPHONE) - device->FmtChans = DevFmtStereo; - else if(speakers == DSSPEAKER_QUAD) - device->FmtChans = DevFmtQuad; - else if(speakers == DSSPEAKER_5POINT1_SURROUND) - device->FmtChans = DevFmtX51; - else if(speakers == DSSPEAKER_5POINT1_BACK) - device->FmtChans = DevFmtX51Rear; - else if(speakers == DSSPEAKER_7POINT1 || speakers == DSSPEAKER_7POINT1_SURROUND) - device->FmtChans = DevFmtX71; - else - ERR("Unknown system speaker config: 0x%lx\n", speakers); - } - device->IsHeadphones = (device->FmtChans == DevFmtStereo && - speakers == DSSPEAKER_HEADPHONE); - - switch(device->FmtChans) - { - case DevFmtMono: - OutputType.dwChannelMask = SPEAKER_FRONT_CENTER; - break; - case DevFmtAmbi3D: - device->FmtChans = DevFmtStereo; - /*fall-through*/ - case DevFmtStereo: - OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT; - break; - case DevFmtQuad: - OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_BACK_LEFT | - SPEAKER_BACK_RIGHT; - break; - case DevFmtX51: - OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_SIDE_LEFT | - SPEAKER_SIDE_RIGHT; - break; - case DevFmtX51Rear: - OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_BACK_LEFT | - SPEAKER_BACK_RIGHT; - break; - case DevFmtX61: - OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_BACK_CENTER | - SPEAKER_SIDE_LEFT | - SPEAKER_SIDE_RIGHT; - break; - case DevFmtX71: - OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_BACK_LEFT | - SPEAKER_BACK_RIGHT | - SPEAKER_SIDE_LEFT | - SPEAKER_SIDE_RIGHT; - break; - } - -retry_open: - hr = S_OK; - OutputType.Format.wFormatTag = WAVE_FORMAT_PCM; - OutputType.Format.nChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - OutputType.Format.wBitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - OutputType.Format.nBlockAlign = OutputType.Format.nChannels*OutputType.Format.wBitsPerSample/8; - OutputType.Format.nSamplesPerSec = device->Frequency; - OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec*OutputType.Format.nBlockAlign; - OutputType.Format.cbSize = 0; - } - - if(OutputType.Format.nChannels > 2 || device->FmtType == DevFmtFloat) - { - OutputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample; - OutputType.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); - if(device->FmtType == DevFmtFloat) - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - else - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - - if(self->PrimaryBuffer) - IDirectSoundBuffer_Release(self->PrimaryBuffer); - self->PrimaryBuffer = NULL; - } - else - { - if(SUCCEEDED(hr) && !self->PrimaryBuffer) - { - memset(&DSBDescription,0,sizeof(DSBUFFERDESC)); - DSBDescription.dwSize=sizeof(DSBUFFERDESC); - DSBDescription.dwFlags=DSBCAPS_PRIMARYBUFFER; - hr = IDirectSound_CreateSoundBuffer(self->DS, &DSBDescription, &self->PrimaryBuffer, NULL); - } - if(SUCCEEDED(hr)) - hr = IDirectSoundBuffer_SetFormat(self->PrimaryBuffer,&OutputType.Format); - } - - if(SUCCEEDED(hr)) - { - if(device->NumUpdates > MAX_UPDATES) - { - device->UpdateSize = (device->UpdateSize*device->NumUpdates + - MAX_UPDATES-1) / MAX_UPDATES; - device->NumUpdates = MAX_UPDATES; - } - - memset(&DSBDescription,0,sizeof(DSBUFFERDESC)); - DSBDescription.dwSize=sizeof(DSBUFFERDESC); - DSBDescription.dwFlags=DSBCAPS_CTRLPOSITIONNOTIFY|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_GLOBALFOCUS; - DSBDescription.dwBufferBytes=device->UpdateSize * device->NumUpdates * - OutputType.Format.nBlockAlign; - DSBDescription.lpwfxFormat=&OutputType.Format; - hr = IDirectSound_CreateSoundBuffer(self->DS, &DSBDescription, &self->Buffer, NULL); - if(FAILED(hr) && device->FmtType == DevFmtFloat) - { - device->FmtType = DevFmtShort; - goto retry_open; - } - } - - if(SUCCEEDED(hr)) - { - hr = IDirectSoundBuffer_QueryInterface(self->Buffer, &IID_IDirectSoundNotify, (void**)&self->Notifies); - if(SUCCEEDED(hr)) - { - DSBPOSITIONNOTIFY notifies[MAX_UPDATES]; - ALuint i; - - for(i = 0;i < device->NumUpdates;++i) - { - notifies[i].dwOffset = i * device->UpdateSize * - OutputType.Format.nBlockAlign; - notifies[i].hEventNotify = self->NotifyEvent; - } - if(IDirectSoundNotify_SetNotificationPositions(self->Notifies, device->NumUpdates, notifies) != DS_OK) - hr = E_FAIL; - } - } - - if(FAILED(hr)) - { - if(self->Notifies != NULL) - IDirectSoundNotify_Release(self->Notifies); - self->Notifies = NULL; - if(self->Buffer != NULL) - IDirectSoundBuffer_Release(self->Buffer); - self->Buffer = NULL; - if(self->PrimaryBuffer != NULL) - IDirectSoundBuffer_Release(self->PrimaryBuffer); - self->PrimaryBuffer = NULL; - return ALC_FALSE; - } - - ResetEvent(self->NotifyEvent); - SetDefaultWFXChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCdsoundPlayback_start(ALCdsoundPlayback *self) -{ - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCdsoundPlayback_mixerProc, self) != althrd_success) - return ALC_FALSE; - - return ALC_TRUE; -} - -static void ALCdsoundPlayback_stop(ALCdsoundPlayback *self) -{ - int res; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - althrd_join(self->thread, &res); - - IDirectSoundBuffer_Stop(self->Buffer); -} - - - -typedef struct ALCdsoundCapture { - DERIVE_FROM_TYPE(ALCbackend); - - IDirectSoundCapture *DSC; - IDirectSoundCaptureBuffer *DSCbuffer; - DWORD BufferBytes; - DWORD Cursor; - - ll_ringbuffer_t *Ring; -} ALCdsoundCapture; - -static void ALCdsoundCapture_Construct(ALCdsoundCapture *self, ALCdevice *device); -static void ALCdsoundCapture_Destruct(ALCdsoundCapture *self); -static ALCenum ALCdsoundCapture_open(ALCdsoundCapture *self, const ALCchar *name); -static DECLARE_FORWARD(ALCdsoundCapture, ALCbackend, ALCboolean, reset) -static ALCboolean ALCdsoundCapture_start(ALCdsoundCapture *self); -static void ALCdsoundCapture_stop(ALCdsoundCapture *self); -static ALCenum ALCdsoundCapture_captureSamples(ALCdsoundCapture *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCdsoundCapture_availableSamples(ALCdsoundCapture *self); -static DECLARE_FORWARD(ALCdsoundCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCdsoundCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCdsoundCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCdsoundCapture) - -DEFINE_ALCBACKEND_VTABLE(ALCdsoundCapture); - -static void ALCdsoundCapture_Construct(ALCdsoundCapture *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCdsoundCapture, ALCbackend, self); - - self->DSC = NULL; - self->DSCbuffer = NULL; - self->Ring = NULL; -} - -static void ALCdsoundCapture_Destruct(ALCdsoundCapture *self) -{ - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - if(self->DSCbuffer != NULL) - { - IDirectSoundCaptureBuffer_Stop(self->DSCbuffer); - IDirectSoundCaptureBuffer_Release(self->DSCbuffer); - self->DSCbuffer = NULL; - } - - if(self->DSC) - IDirectSoundCapture_Release(self->DSC); - self->DSC = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static ALCenum ALCdsoundCapture_open(ALCdsoundCapture *self, const ALCchar *deviceName) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - WAVEFORMATEXTENSIBLE InputType; - DSCBUFFERDESC DSCBDescription; - const GUID *guid = NULL; - HRESULT hr, hrcom; - ALuint samples; - - if(VECTOR_SIZE(CaptureDevices) == 0) - { - /* Initialize COM to prevent name truncation */ - hrcom = CoInitialize(NULL); - hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices); - if(FAILED(hr)) - ERR("Error enumerating DirectSound devices (0x%lx)!\n", hr); - if(SUCCEEDED(hrcom)) - CoUninitialize(); - } - - if(!deviceName && VECTOR_SIZE(CaptureDevices) > 0) - { - deviceName = alstr_get_cstr(VECTOR_FRONT(CaptureDevices).name); - guid = &VECTOR_FRONT(CaptureDevices).guid; - } - else - { - const DevMap *iter; - -#define MATCH_NAME(i) (alstr_cmp_cstr((i)->name, deviceName) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(CaptureDevices)) - return ALC_INVALID_VALUE; - guid = &iter->guid; - } - - switch(device->FmtType) - { - case DevFmtByte: - case DevFmtUShort: - case DevFmtUInt: - WARN("%s capture samples not supported\n", DevFmtTypeString(device->FmtType)); - return ALC_INVALID_ENUM; - - case DevFmtUByte: - case DevFmtShort: - case DevFmtInt: - case DevFmtFloat: - break; - } - - memset(&InputType, 0, sizeof(InputType)); - switch(device->FmtChans) - { - case DevFmtMono: - InputType.dwChannelMask = SPEAKER_FRONT_CENTER; - break; - case DevFmtStereo: - InputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT; - break; - case DevFmtQuad: - InputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_BACK_LEFT | - SPEAKER_BACK_RIGHT; - break; - case DevFmtX51: - InputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_SIDE_LEFT | - SPEAKER_SIDE_RIGHT; - break; - case DevFmtX51Rear: - InputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_BACK_LEFT | - SPEAKER_BACK_RIGHT; - break; - case DevFmtX61: - InputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_BACK_CENTER | - SPEAKER_SIDE_LEFT | - SPEAKER_SIDE_RIGHT; - break; - case DevFmtX71: - InputType.dwChannelMask = SPEAKER_FRONT_LEFT | - SPEAKER_FRONT_RIGHT | - SPEAKER_FRONT_CENTER | - SPEAKER_LOW_FREQUENCY | - SPEAKER_BACK_LEFT | - SPEAKER_BACK_RIGHT | - SPEAKER_SIDE_LEFT | - SPEAKER_SIDE_RIGHT; - break; - case DevFmtAmbi3D: - WARN("%s capture not supported\n", DevFmtChannelsString(device->FmtChans)); - return ALC_INVALID_ENUM; - } - - InputType.Format.wFormatTag = WAVE_FORMAT_PCM; - InputType.Format.nChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - InputType.Format.wBitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - InputType.Format.nBlockAlign = InputType.Format.nChannels*InputType.Format.wBitsPerSample/8; - InputType.Format.nSamplesPerSec = device->Frequency; - InputType.Format.nAvgBytesPerSec = InputType.Format.nSamplesPerSec*InputType.Format.nBlockAlign; - InputType.Format.cbSize = 0; - InputType.Samples.wValidBitsPerSample = InputType.Format.wBitsPerSample; - if(device->FmtType == DevFmtFloat) - InputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - else - InputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - - if(InputType.Format.nChannels > 2 || device->FmtType == DevFmtFloat) - { - InputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - InputType.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); - } - - samples = device->UpdateSize * device->NumUpdates; - samples = maxu(samples, 100 * device->Frequency / 1000); - - memset(&DSCBDescription, 0, sizeof(DSCBUFFERDESC)); - DSCBDescription.dwSize = sizeof(DSCBUFFERDESC); - DSCBDescription.dwFlags = 0; - DSCBDescription.dwBufferBytes = samples * InputType.Format.nBlockAlign; - DSCBDescription.lpwfxFormat = &InputType.Format; - - //DirectSoundCapture Init code - hr = DirectSoundCaptureCreate(guid, &self->DSC, NULL); - if(SUCCEEDED(hr)) - hr = IDirectSoundCapture_CreateCaptureBuffer(self->DSC, &DSCBDescription, &self->DSCbuffer, NULL); - if(SUCCEEDED(hr)) - { - self->Ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates, - InputType.Format.nBlockAlign, false); - if(self->Ring == NULL) - hr = DSERR_OUTOFMEMORY; - } - - if(FAILED(hr)) - { - ERR("Device init failed: 0x%08lx\n", hr); - - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - if(self->DSCbuffer != NULL) - IDirectSoundCaptureBuffer_Release(self->DSCbuffer); - self->DSCbuffer = NULL; - if(self->DSC) - IDirectSoundCapture_Release(self->DSC); - self->DSC = NULL; - - return ALC_INVALID_VALUE; - } - - self->BufferBytes = DSCBDescription.dwBufferBytes; - SetDefaultWFXChannelOrder(device); - - alstr_copy_cstr(&device->DeviceName, deviceName); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCdsoundCapture_start(ALCdsoundCapture *self) -{ - HRESULT hr; - - hr = IDirectSoundCaptureBuffer_Start(self->DSCbuffer, DSCBSTART_LOOPING); - if(FAILED(hr)) - { - ERR("start failed: 0x%08lx\n", hr); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, - "Failure starting capture: 0x%lx", hr); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCdsoundCapture_stop(ALCdsoundCapture *self) -{ - HRESULT hr; - - hr = IDirectSoundCaptureBuffer_Stop(self->DSCbuffer); - if(FAILED(hr)) - { - ERR("stop failed: 0x%08lx\n", hr); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, - "Failure stopping capture: 0x%lx", hr); - } -} - -static ALCenum ALCdsoundCapture_captureSamples(ALCdsoundCapture *self, ALCvoid *buffer, ALCuint samples) -{ - ll_ringbuffer_read(self->Ring, buffer, samples); - return ALC_NO_ERROR; -} - -static ALCuint ALCdsoundCapture_availableSamples(ALCdsoundCapture *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - DWORD ReadCursor, LastCursor, BufferBytes, NumBytes; - void *ReadPtr1, *ReadPtr2; - DWORD ReadCnt1, ReadCnt2; - DWORD FrameSize; - HRESULT hr; - - if(!ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - goto done; - - FrameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - BufferBytes = self->BufferBytes; - LastCursor = self->Cursor; - - hr = IDirectSoundCaptureBuffer_GetCurrentPosition(self->DSCbuffer, NULL, &ReadCursor); - if(SUCCEEDED(hr)) - { - NumBytes = (ReadCursor-LastCursor + BufferBytes) % BufferBytes; - if(NumBytes == 0) - goto done; - hr = IDirectSoundCaptureBuffer_Lock(self->DSCbuffer, LastCursor, NumBytes, - &ReadPtr1, &ReadCnt1, - &ReadPtr2, &ReadCnt2, 0); - } - if(SUCCEEDED(hr)) - { - ll_ringbuffer_write(self->Ring, ReadPtr1, ReadCnt1/FrameSize); - if(ReadPtr2 != NULL) - ll_ringbuffer_write(self->Ring, ReadPtr2, ReadCnt2/FrameSize); - hr = IDirectSoundCaptureBuffer_Unlock(self->DSCbuffer, - ReadPtr1, ReadCnt1, - ReadPtr2, ReadCnt2); - self->Cursor = (LastCursor+ReadCnt1+ReadCnt2) % BufferBytes; - } - - if(FAILED(hr)) - { - ERR("update failed: 0x%08lx\n", hr); - aluHandleDisconnect(device, "Failure retrieving capture data: 0x%lx", hr); - } - -done: - return (ALCuint)ll_ringbuffer_read_space(self->Ring); -} - - -static inline void AppendAllDevicesList2(const DevMap *entry) -{ AppendAllDevicesList(alstr_get_cstr(entry->name)); } -static inline void AppendCaptureDeviceList2(const DevMap *entry) -{ AppendCaptureDeviceList(alstr_get_cstr(entry->name)); } - -typedef struct ALCdsoundBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCdsoundBackendFactory; -#define ALCDSOUNDBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCdsoundBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void); - -static ALCboolean ALCdsoundBackendFactory_init(ALCdsoundBackendFactory *self); -static void ALCdsoundBackendFactory_deinit(ALCdsoundBackendFactory *self); -static ALCboolean ALCdsoundBackendFactory_querySupport(ALCdsoundBackendFactory *self, ALCbackend_Type type); -static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCdsoundBackendFactory_createBackend(ALCdsoundBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCdsoundBackendFactory); - - -ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void) -{ - static ALCdsoundBackendFactory factory = ALCDSOUNDBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCdsoundBackendFactory_init(ALCdsoundBackendFactory* UNUSED(self)) -{ - VECTOR_INIT(PlaybackDevices); - VECTOR_INIT(CaptureDevices); - - if(!DSoundLoad()) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCdsoundBackendFactory_deinit(ALCdsoundBackendFactory* UNUSED(self)) -{ - clear_devlist(&PlaybackDevices); - VECTOR_DEINIT(PlaybackDevices); - - clear_devlist(&CaptureDevices); - VECTOR_DEINIT(CaptureDevices); - -#ifdef HAVE_DYNLOAD - if(ds_handle) - CloseLib(ds_handle); - ds_handle = NULL; -#endif -} - -static ALCboolean ALCdsoundBackendFactory_querySupport(ALCdsoundBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory* UNUSED(self), enum DevProbe type) -{ - HRESULT hr, hrcom; - - /* Initialize COM to prevent name truncation */ - hrcom = CoInitialize(NULL); - switch(type) - { - case ALL_DEVICE_PROBE: - clear_devlist(&PlaybackDevices); - hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices); - if(FAILED(hr)) - ERR("Error enumerating DirectSound playback devices (0x%lx)!\n", hr); - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, AppendAllDevicesList2); - break; - - case CAPTURE_DEVICE_PROBE: - clear_devlist(&CaptureDevices); - hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices); - if(FAILED(hr)) - ERR("Error enumerating DirectSound capture devices (0x%lx)!\n", hr); - VECTOR_FOR_EACH(const DevMap, CaptureDevices, AppendCaptureDeviceList2); - break; - } - if(SUCCEEDED(hrcom)) - CoUninitialize(); -} - -static ALCbackend* ALCdsoundBackendFactory_createBackend(ALCdsoundBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCdsoundPlayback *backend; - NEW_OBJ(backend, ALCdsoundPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - if(type == ALCbackend_Capture) - { - ALCdsoundCapture *backend; - NEW_OBJ(backend, ALCdsoundCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/jack.c b/Alc/backends/jack.c deleted file mode 100644 index 67e3c10..0000000 --- a/Alc/backends/jack.c +++ /dev/null @@ -1,607 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - -#include -#include - - -static const ALCchar jackDevice[] = "JACK Default"; - - -#ifdef HAVE_DYNLOAD -#define JACK_FUNCS(MAGIC) \ - MAGIC(jack_client_open); \ - MAGIC(jack_client_close); \ - MAGIC(jack_client_name_size); \ - MAGIC(jack_get_client_name); \ - MAGIC(jack_connect); \ - MAGIC(jack_activate); \ - MAGIC(jack_deactivate); \ - MAGIC(jack_port_register); \ - MAGIC(jack_port_unregister); \ - MAGIC(jack_port_get_buffer); \ - MAGIC(jack_port_name); \ - MAGIC(jack_get_ports); \ - MAGIC(jack_free); \ - MAGIC(jack_get_sample_rate); \ - MAGIC(jack_set_error_function); \ - MAGIC(jack_set_process_callback); \ - MAGIC(jack_set_buffer_size_callback); \ - MAGIC(jack_set_buffer_size); \ - MAGIC(jack_get_buffer_size); - -static void *jack_handle; -#define MAKE_FUNC(f) static __typeof(f) * p##f -JACK_FUNCS(MAKE_FUNC); -static __typeof(jack_error_callback) * pjack_error_callback; -#undef MAKE_FUNC - -#define jack_client_open pjack_client_open -#define jack_client_close pjack_client_close -#define jack_client_name_size pjack_client_name_size -#define jack_get_client_name pjack_get_client_name -#define jack_connect pjack_connect -#define jack_activate pjack_activate -#define jack_deactivate pjack_deactivate -#define jack_port_register pjack_port_register -#define jack_port_unregister pjack_port_unregister -#define jack_port_get_buffer pjack_port_get_buffer -#define jack_port_name pjack_port_name -#define jack_get_ports pjack_get_ports -#define jack_free pjack_free -#define jack_get_sample_rate pjack_get_sample_rate -#define jack_set_error_function pjack_set_error_function -#define jack_set_process_callback pjack_set_process_callback -#define jack_set_buffer_size_callback pjack_set_buffer_size_callback -#define jack_set_buffer_size pjack_set_buffer_size -#define jack_get_buffer_size pjack_get_buffer_size -#define jack_error_callback (*pjack_error_callback) -#endif - - -static jack_options_t ClientOptions = JackNullOption; - -static ALCboolean jack_load(void) -{ - ALCboolean error = ALC_FALSE; - -#ifdef HAVE_DYNLOAD - if(!jack_handle) - { - al_string missing_funcs = AL_STRING_INIT_STATIC(); - -#ifdef _WIN32 -#define JACKLIB "libjack.dll" -#else -#define JACKLIB "libjack.so.0" -#endif - jack_handle = LoadLib(JACKLIB); - if(!jack_handle) - { - WARN("Failed to load %s\n", JACKLIB); - return ALC_FALSE; - } - - error = ALC_FALSE; -#define LOAD_FUNC(f) do { \ - p##f = GetSymbol(jack_handle, #f); \ - if(p##f == NULL) { \ - error = ALC_TRUE; \ - alstr_append_cstr(&missing_funcs, "\n" #f); \ - } \ -} while(0) - JACK_FUNCS(LOAD_FUNC); -#undef LOAD_FUNC - /* Optional symbols. These don't exist in all versions of JACK. */ -#define LOAD_SYM(f) p##f = GetSymbol(jack_handle, #f) - LOAD_SYM(jack_error_callback); -#undef LOAD_SYM - - if(error) - { - WARN("Missing expected functions:%s\n", alstr_get_cstr(missing_funcs)); - CloseLib(jack_handle); - jack_handle = NULL; - } - alstr_reset(&missing_funcs); - } -#endif - - return !error; -} - - -typedef struct ALCjackPlayback { - DERIVE_FROM_TYPE(ALCbackend); - - jack_client_t *Client; - jack_port_t *Port[MAX_OUTPUT_CHANNELS]; - - ll_ringbuffer_t *Ring; - alsem_t Sem; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCjackPlayback; - -static int ALCjackPlayback_bufferSizeNotify(jack_nframes_t numframes, void *arg); - -static int ALCjackPlayback_process(jack_nframes_t numframes, void *arg); -static int ALCjackPlayback_mixerProc(void *arg); - -static void ALCjackPlayback_Construct(ALCjackPlayback *self, ALCdevice *device); -static void ALCjackPlayback_Destruct(ALCjackPlayback *self); -static ALCenum ALCjackPlayback_open(ALCjackPlayback *self, const ALCchar *name); -static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self); -static ALCboolean ALCjackPlayback_start(ALCjackPlayback *self); -static void ALCjackPlayback_stop(ALCjackPlayback *self); -static DECLARE_FORWARD2(ALCjackPlayback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCjackPlayback, ALCbackend, ALCuint, availableSamples) -static ClockLatency ALCjackPlayback_getClockLatency(ALCjackPlayback *self); -static DECLARE_FORWARD(ALCjackPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCjackPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCjackPlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCjackPlayback); - - -static void ALCjackPlayback_Construct(ALCjackPlayback *self, ALCdevice *device) -{ - ALuint i; - - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCjackPlayback, ALCbackend, self); - - alsem_init(&self->Sem, 0); - - self->Client = NULL; - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - self->Port[i] = NULL; - self->Ring = NULL; - - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCjackPlayback_Destruct(ALCjackPlayback *self) -{ - ALuint i; - - if(self->Client) - { - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - if(self->Port[i]) - jack_port_unregister(self->Client, self->Port[i]); - self->Port[i] = NULL; - } - jack_client_close(self->Client); - self->Client = NULL; - } - - alsem_destroy(&self->Sem); - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCjackPlayback_bufferSizeNotify(jack_nframes_t numframes, void *arg) -{ - ALCjackPlayback *self = arg; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - ALuint bufsize; - - ALCjackPlayback_lock(self); - device->UpdateSize = numframes; - device->NumUpdates = 2; - - bufsize = device->UpdateSize; - if(ConfigValueUInt(alstr_get_cstr(device->DeviceName), "jack", "buffer-size", &bufsize)) - bufsize = maxu(NextPowerOf2(bufsize), device->UpdateSize); - device->NumUpdates = (bufsize+device->UpdateSize) / device->UpdateSize; - - TRACE("%u update size x%u\n", device->UpdateSize, device->NumUpdates); - - ll_ringbuffer_free(self->Ring); - self->Ring = ll_ringbuffer_create(bufsize, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), - true - ); - if(!self->Ring) - { - ERR("Failed to reallocate ringbuffer\n"); - aluHandleDisconnect(device, "Failed to reallocate %u-sample buffer", bufsize); - } - ALCjackPlayback_unlock(self); - return 0; -} - - -static int ALCjackPlayback_process(jack_nframes_t numframes, void *arg) -{ - ALCjackPlayback *self = arg; - jack_default_audio_sample_t *out[MAX_OUTPUT_CHANNELS]; - ll_ringbuffer_data_t data[2]; - jack_nframes_t total = 0; - jack_nframes_t todo; - ALsizei i, c, numchans; - - ll_ringbuffer_get_read_vector(self->Ring, data); - - for(c = 0;c < MAX_OUTPUT_CHANNELS && self->Port[c];c++) - out[c] = jack_port_get_buffer(self->Port[c], numframes); - numchans = c; - - todo = minu(numframes, data[0].len); - for(c = 0;c < numchans;c++) - { - const ALfloat *restrict in = ((ALfloat*)data[0].buf) + c; - for(i = 0;(jack_nframes_t)i < todo;i++) - out[c][i] = in[i*numchans]; - out[c] += todo; - } - total += todo; - - todo = minu(numframes-total, data[1].len); - if(todo > 0) - { - for(c = 0;c < numchans;c++) - { - const ALfloat *restrict in = ((ALfloat*)data[1].buf) + c; - for(i = 0;(jack_nframes_t)i < todo;i++) - out[c][i] = in[i*numchans]; - out[c] += todo; - } - total += todo; - } - - ll_ringbuffer_read_advance(self->Ring, total); - alsem_post(&self->Sem); - - if(numframes > total) - { - todo = numframes-total; - for(c = 0;c < numchans;c++) - { - for(i = 0;(jack_nframes_t)i < todo;i++) - out[c][i] = 0.0f; - } - } - - return 0; -} - -static int ALCjackPlayback_mixerProc(void *arg) -{ - ALCjackPlayback *self = arg; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - ll_ringbuffer_data_t data[2]; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - ALCjackPlayback_lock(self); - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - ALuint todo, len1, len2; - - if(ll_ringbuffer_write_space(self->Ring) < device->UpdateSize) - { - ALCjackPlayback_unlock(self); - alsem_wait(&self->Sem); - ALCjackPlayback_lock(self); - continue; - } - - ll_ringbuffer_get_write_vector(self->Ring, data); - todo = data[0].len + data[1].len; - todo -= todo%device->UpdateSize; - - len1 = minu(data[0].len, todo); - len2 = minu(data[1].len, todo-len1); - - aluMixData(device, data[0].buf, len1); - if(len2 > 0) - aluMixData(device, data[1].buf, len2); - ll_ringbuffer_write_advance(self->Ring, todo); - } - ALCjackPlayback_unlock(self); - - return 0; -} - - -static ALCenum ALCjackPlayback_open(ALCjackPlayback *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const char *client_name = "alsoft"; - jack_status_t status; - - if(!name) - name = jackDevice; - else if(strcmp(name, jackDevice) != 0) - return ALC_INVALID_VALUE; - - self->Client = jack_client_open(client_name, ClientOptions, &status, NULL); - if(self->Client == NULL) - { - ERR("jack_client_open() failed, status = 0x%02x\n", status); - return ALC_INVALID_VALUE; - } - if((status&JackServerStarted)) - TRACE("JACK server started\n"); - if((status&JackNameNotUnique)) - { - client_name = jack_get_client_name(self->Client); - TRACE("Client name not unique, got `%s' instead\n", client_name); - } - - jack_set_process_callback(self->Client, ALCjackPlayback_process, self); - jack_set_buffer_size_callback(self->Client, ALCjackPlayback_bufferSizeNotify, self); - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALsizei numchans, i; - ALuint bufsize; - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - if(self->Port[i]) - jack_port_unregister(self->Client, self->Port[i]); - self->Port[i] = NULL; - } - - /* Ignore the requested buffer metrics and just keep one JACK-sized buffer - * ready for when requested. - */ - device->Frequency = jack_get_sample_rate(self->Client); - device->UpdateSize = jack_get_buffer_size(self->Client); - device->NumUpdates = 2; - - bufsize = device->UpdateSize; - if(ConfigValueUInt(alstr_get_cstr(device->DeviceName), "jack", "buffer-size", &bufsize)) - bufsize = maxu(NextPowerOf2(bufsize), device->UpdateSize); - device->NumUpdates = (bufsize+device->UpdateSize) / device->UpdateSize; - - /* Force 32-bit float output. */ - device->FmtType = DevFmtFloat; - - numchans = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - for(i = 0;i < numchans;i++) - { - char name[64]; - snprintf(name, sizeof(name), "channel_%d", i+1); - self->Port[i] = jack_port_register(self->Client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); - if(self->Port[i] == NULL) - { - ERR("Not enough JACK ports available for %s output\n", DevFmtChannelsString(device->FmtChans)); - if(i == 0) return ALC_FALSE; - break; - } - } - if(i < numchans) - { - if(i == 1) - device->FmtChans = DevFmtMono; - else - { - for(--i;i >= 2;i--) - { - jack_port_unregister(self->Client, self->Port[i]); - self->Port[i] = NULL; - } - device->FmtChans = DevFmtStereo; - } - } - - ll_ringbuffer_free(self->Ring); - self->Ring = ll_ringbuffer_create(bufsize, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), - true - ); - if(!self->Ring) - { - ERR("Failed to allocate ringbuffer\n"); - return ALC_FALSE; - } - - SetDefaultChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCjackPlayback_start(ALCjackPlayback *self) -{ - const char **ports; - ALsizei i; - - if(jack_activate(self->Client)) - { - ERR("Failed to activate client\n"); - return ALC_FALSE; - } - - ports = jack_get_ports(self->Client, NULL, NULL, JackPortIsPhysical|JackPortIsInput); - if(ports == NULL) - { - ERR("No physical playback ports found\n"); - jack_deactivate(self->Client); - return ALC_FALSE; - } - for(i = 0;i < MAX_OUTPUT_CHANNELS && self->Port[i];i++) - { - if(!ports[i]) - { - ERR("No physical playback port for \"%s\"\n", jack_port_name(self->Port[i])); - break; - } - if(jack_connect(self->Client, jack_port_name(self->Port[i]), ports[i])) - ERR("Failed to connect output port \"%s\" to \"%s\"\n", jack_port_name(self->Port[i]), ports[i]); - } - jack_free(ports); - - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCjackPlayback_mixerProc, self) != althrd_success) - { - jack_deactivate(self->Client); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCjackPlayback_stop(ALCjackPlayback *self) -{ - int res; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - - alsem_post(&self->Sem); - althrd_join(self->thread, &res); - - jack_deactivate(self->Client); -} - - -static ClockLatency ALCjackPlayback_getClockLatency(ALCjackPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ClockLatency ret; - - ALCjackPlayback_lock(self); - ret.ClockTime = GetDeviceClockTime(device); - ret.Latency = ll_ringbuffer_read_space(self->Ring) * DEVICE_CLOCK_RES / - device->Frequency; - ALCjackPlayback_unlock(self); - - return ret; -} - - -static void jack_msg_handler(const char *message) -{ - WARN("%s\n", message); -} - -typedef struct ALCjackBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCjackBackendFactory; -#define ALCJACKBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCjackBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCjackBackendFactory_init(ALCjackBackendFactory* UNUSED(self)) -{ - void (*old_error_cb)(const char*); - jack_client_t *client; - jack_status_t status; - - if(!jack_load()) - return ALC_FALSE; - - if(!GetConfigValueBool(NULL, "jack", "spawn-server", 0)) - ClientOptions |= JackNoStartServer; - - old_error_cb = (&jack_error_callback ? jack_error_callback : NULL); - jack_set_error_function(jack_msg_handler); - client = jack_client_open("alsoft", ClientOptions, &status, NULL); - jack_set_error_function(old_error_cb); - if(client == NULL) - { - WARN("jack_client_open() failed, 0x%02x\n", status); - if((status&JackServerFailed) && !(ClientOptions&JackNoStartServer)) - ERR("Unable to connect to JACK server\n"); - return ALC_FALSE; - } - - jack_client_close(client); - return ALC_TRUE; -} - -static void ALCjackBackendFactory_deinit(ALCjackBackendFactory* UNUSED(self)) -{ -#ifdef HAVE_DYNLOAD - if(jack_handle) - CloseLib(jack_handle); - jack_handle = NULL; -#endif -} - -static ALCboolean ALCjackBackendFactory_querySupport(ALCjackBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCjackBackendFactory_probe(ALCjackBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(jackDevice); - break; - - case CAPTURE_DEVICE_PROBE: - break; - } -} - -static ALCbackend* ALCjackBackendFactory_createBackend(ALCjackBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCjackPlayback *backend; - NEW_OBJ(backend, ALCjackPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCjackBackendFactory); - - -ALCbackendFactory *ALCjackBackendFactory_getFactory(void) -{ - static ALCjackBackendFactory factory = ALCJACKBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/backends/loopback.c b/Alc/backends/loopback.c deleted file mode 100644 index 9186a92..0000000 --- a/Alc/backends/loopback.c +++ /dev/null @@ -1,128 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2011 by Chris Robinson - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" - -#include "backends/base.h" - - -typedef struct ALCloopback { - DERIVE_FROM_TYPE(ALCbackend); -} ALCloopback; - -static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device); -static DECLARE_FORWARD(ALCloopback, ALCbackend, void, Destruct) -static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name); -static ALCboolean ALCloopback_reset(ALCloopback *self); -static ALCboolean ALCloopback_start(ALCloopback *self); -static void ALCloopback_stop(ALCloopback *self); -static DECLARE_FORWARD2(ALCloopback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCloopback, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCloopback, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCloopback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCloopback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCloopback) -DEFINE_ALCBACKEND_VTABLE(ALCloopback); - - -static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCloopback, ALCbackend, self); -} - - -static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - alstr_copy_cstr(&device->DeviceName, name); - return ALC_NO_ERROR; -} - -static ALCboolean ALCloopback_reset(ALCloopback *self) -{ - SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice); - return ALC_TRUE; -} - -static ALCboolean ALCloopback_start(ALCloopback* UNUSED(self)) -{ - return ALC_TRUE; -} - -static void ALCloopback_stop(ALCloopback* UNUSED(self)) -{ -} - - -typedef struct ALCloopbackFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCloopbackFactory; -#define ALCNULLBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCloopbackFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCloopbackFactory_getFactory(void); -static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory *self); -static DECLARE_FORWARD(ALCloopbackFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory *self, ALCbackend_Type type); -static void ALCloopbackFactory_probe(ALCloopbackFactory *self, enum DevProbe type); -static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCloopbackFactory); - - -ALCbackendFactory *ALCloopbackFactory_getFactory(void) -{ - static ALCloopbackFactory factory = ALCNULLBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - -static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory* UNUSED(self)) -{ - return ALC_TRUE; -} - -static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Loopback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCloopbackFactory_probe(ALCloopbackFactory* UNUSED(self), enum DevProbe UNUSED(type)) -{ -} - -static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Loopback) - { - ALCloopback *backend; - NEW_OBJ(backend, ALCloopback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/null.c b/Alc/backends/null.c deleted file mode 100644 index 2c2db54..0000000 --- a/Alc/backends/null.c +++ /dev/null @@ -1,221 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2010 by Chris Robinson - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#ifdef HAVE_WINDOWS_H -#include -#endif - -#include "alMain.h" -#include "alu.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - - -typedef struct ALCnullBackend { - DERIVE_FROM_TYPE(ALCbackend); - - ATOMIC(int) killNow; - althrd_t thread; -} ALCnullBackend; - -static int ALCnullBackend_mixerProc(void *ptr); - -static void ALCnullBackend_Construct(ALCnullBackend *self, ALCdevice *device); -static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, Destruct) -static ALCenum ALCnullBackend_open(ALCnullBackend *self, const ALCchar *name); -static ALCboolean ALCnullBackend_reset(ALCnullBackend *self); -static ALCboolean ALCnullBackend_start(ALCnullBackend *self); -static void ALCnullBackend_stop(ALCnullBackend *self); -static DECLARE_FORWARD2(ALCnullBackend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCnullBackend, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCnullBackend, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCnullBackend) - -DEFINE_ALCBACKEND_VTABLE(ALCnullBackend); - - -static const ALCchar nullDevice[] = "No Output"; - - -static void ALCnullBackend_Construct(ALCnullBackend *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCnullBackend, ALCbackend, self); - - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - - -static int ALCnullBackend_mixerProc(void *ptr) -{ - ALCnullBackend *self = (ALCnullBackend*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - struct timespec now, start; - ALuint64 avail, done; - const long restTime = (long)((ALuint64)device->UpdateSize * 1000000000 / - device->Frequency / 2); - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - done = 0; - if(altimespec_get(&start, AL_TIME_UTC) != AL_TIME_UTC) - { - ERR("Failed to get starting time\n"); - return 1; - } - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - if(altimespec_get(&now, AL_TIME_UTC) != AL_TIME_UTC) - { - ERR("Failed to get current time\n"); - return 1; - } - - avail = (now.tv_sec - start.tv_sec) * device->Frequency; - avail += (ALint64)(now.tv_nsec - start.tv_nsec) * device->Frequency / 1000000000; - if(avail < done) - { - /* Oops, time skipped backwards. Reset the number of samples done - * with one update available since we (likely) just came back from - * sleeping. */ - done = avail - device->UpdateSize; - } - - if(avail-done < device->UpdateSize) - al_nssleep(restTime); - else while(avail-done >= device->UpdateSize) - { - ALCnullBackend_lock(self); - aluMixData(device, NULL, device->UpdateSize); - ALCnullBackend_unlock(self); - done += device->UpdateSize; - } - } - - return 0; -} - - -static ALCenum ALCnullBackend_open(ALCnullBackend *self, const ALCchar *name) -{ - ALCdevice *device; - - if(!name) - name = nullDevice; - else if(strcmp(name, nullDevice) != 0) - return ALC_INVALID_VALUE; - - device = STATIC_CAST(ALCbackend, self)->mDevice; - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCnullBackend_reset(ALCnullBackend *self) -{ - SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice); - return ALC_TRUE; -} - -static ALCboolean ALCnullBackend_start(ALCnullBackend *self) -{ - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCnullBackend_mixerProc, self) != althrd_success) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCnullBackend_stop(ALCnullBackend *self) -{ - int res; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - althrd_join(self->thread, &res); -} - - -typedef struct ALCnullBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCnullBackendFactory; -#define ALCNULLBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCnullBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCnullBackendFactory_getFactory(void); - -static ALCboolean ALCnullBackendFactory_init(ALCnullBackendFactory *self); -static DECLARE_FORWARD(ALCnullBackendFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCnullBackendFactory_querySupport(ALCnullBackendFactory *self, ALCbackend_Type type); -static void ALCnullBackendFactory_probe(ALCnullBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCnullBackendFactory_createBackend(ALCnullBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCnullBackendFactory); - - -ALCbackendFactory *ALCnullBackendFactory_getFactory(void) -{ - static ALCnullBackendFactory factory = ALCNULLBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCnullBackendFactory_init(ALCnullBackendFactory* UNUSED(self)) -{ - return ALC_TRUE; -} - -static ALCboolean ALCnullBackendFactory_querySupport(ALCnullBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCnullBackendFactory_probe(ALCnullBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(nullDevice); - break; - case CAPTURE_DEVICE_PROBE: - break; - } -} - -static ALCbackend* ALCnullBackendFactory_createBackend(ALCnullBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCnullBackend *backend; - NEW_OBJ(backend, ALCnullBackend)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/opensl.c b/Alc/backends/opensl.c deleted file mode 100644 index 262fdae..0000000 --- a/Alc/backends/opensl.c +++ /dev/null @@ -1,1074 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* This is an OpenAL backend for Android using the native audio APIs based on - * OpenSL ES 1.0.1. It is based on source code for the native-audio sample app - * bundled with NDK. - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "ringbuffer.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - -#include -#include -#include - -/* Helper macros */ -#define VCALL(obj, func) ((*(obj))->func((obj), EXTRACT_VCALL_ARGS -#define VCALL0(obj, func) ((*(obj))->func((obj) EXTRACT_VCALL_ARGS - - -static const ALCchar opensl_device[] = "OpenSL"; - - -static SLuint32 GetChannelMask(enum DevFmtChannels chans) -{ - switch(chans) - { - case DevFmtMono: return SL_SPEAKER_FRONT_CENTER; - case DevFmtStereo: return SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT; - case DevFmtQuad: return SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT| - SL_SPEAKER_BACK_LEFT|SL_SPEAKER_BACK_RIGHT; - case DevFmtX51: return SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT| - SL_SPEAKER_FRONT_CENTER|SL_SPEAKER_LOW_FREQUENCY| - SL_SPEAKER_SIDE_LEFT|SL_SPEAKER_SIDE_RIGHT; - case DevFmtX51Rear: return SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT| - SL_SPEAKER_FRONT_CENTER|SL_SPEAKER_LOW_FREQUENCY| - SL_SPEAKER_BACK_LEFT|SL_SPEAKER_BACK_RIGHT; - case DevFmtX61: return SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT| - SL_SPEAKER_FRONT_CENTER|SL_SPEAKER_LOW_FREQUENCY| - SL_SPEAKER_BACK_CENTER| - SL_SPEAKER_SIDE_LEFT|SL_SPEAKER_SIDE_RIGHT; - case DevFmtX71: return SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT| - SL_SPEAKER_FRONT_CENTER|SL_SPEAKER_LOW_FREQUENCY| - SL_SPEAKER_BACK_LEFT|SL_SPEAKER_BACK_RIGHT| - SL_SPEAKER_SIDE_LEFT|SL_SPEAKER_SIDE_RIGHT; - case DevFmtAmbi3D: - break; - } - return 0; -} - -#ifdef SL_DATAFORMAT_PCM_EX -static SLuint32 GetTypeRepresentation(enum DevFmtType type) -{ - switch(type) - { - case DevFmtUByte: - case DevFmtUShort: - case DevFmtUInt: - return SL_PCM_REPRESENTATION_UNSIGNED_INT; - case DevFmtByte: - case DevFmtShort: - case DevFmtInt: - return SL_PCM_REPRESENTATION_SIGNED_INT; - case DevFmtFloat: - return SL_PCM_REPRESENTATION_FLOAT; - } - return 0; -} -#endif - -static const char *res_str(SLresult result) -{ - switch(result) - { - case SL_RESULT_SUCCESS: return "Success"; - case SL_RESULT_PRECONDITIONS_VIOLATED: return "Preconditions violated"; - case SL_RESULT_PARAMETER_INVALID: return "Parameter invalid"; - case SL_RESULT_MEMORY_FAILURE: return "Memory failure"; - case SL_RESULT_RESOURCE_ERROR: return "Resource error"; - case SL_RESULT_RESOURCE_LOST: return "Resource lost"; - case SL_RESULT_IO_ERROR: return "I/O error"; - case SL_RESULT_BUFFER_INSUFFICIENT: return "Buffer insufficient"; - case SL_RESULT_CONTENT_CORRUPTED: return "Content corrupted"; - case SL_RESULT_CONTENT_UNSUPPORTED: return "Content unsupported"; - case SL_RESULT_CONTENT_NOT_FOUND: return "Content not found"; - case SL_RESULT_PERMISSION_DENIED: return "Permission denied"; - case SL_RESULT_FEATURE_UNSUPPORTED: return "Feature unsupported"; - case SL_RESULT_INTERNAL_ERROR: return "Internal error"; - case SL_RESULT_UNKNOWN_ERROR: return "Unknown error"; - case SL_RESULT_OPERATION_ABORTED: return "Operation aborted"; - case SL_RESULT_CONTROL_LOST: return "Control lost"; -#ifdef SL_RESULT_READONLY - case SL_RESULT_READONLY: return "ReadOnly"; -#endif -#ifdef SL_RESULT_ENGINEOPTION_UNSUPPORTED - case SL_RESULT_ENGINEOPTION_UNSUPPORTED: return "Engine option unsupported"; -#endif -#ifdef SL_RESULT_SOURCE_SINK_INCOMPATIBLE - case SL_RESULT_SOURCE_SINK_INCOMPATIBLE: return "Source/Sink incompatible"; -#endif - } - return "Unknown error code"; -} - -#define PRINTERR(x, s) do { \ - if((x) != SL_RESULT_SUCCESS) \ - ERR("%s: %s\n", (s), res_str((x))); \ -} while(0) - - -typedef struct ALCopenslPlayback { - DERIVE_FROM_TYPE(ALCbackend); - - /* engine interfaces */ - SLObjectItf mEngineObj; - SLEngineItf mEngine; - - /* output mix interfaces */ - SLObjectItf mOutputMix; - - /* buffer queue player interfaces */ - SLObjectItf mBufferQueueObj; - - ll_ringbuffer_t *mRing; - alsem_t mSem; - - ALsizei mFrameSize; - - ATOMIC(ALenum) mKillNow; - althrd_t mThread; -} ALCopenslPlayback; - -static void ALCopenslPlayback_process(SLAndroidSimpleBufferQueueItf bq, void *context); -static int ALCopenslPlayback_mixerProc(void *arg); - -static void ALCopenslPlayback_Construct(ALCopenslPlayback *self, ALCdevice *device); -static void ALCopenslPlayback_Destruct(ALCopenslPlayback *self); -static ALCenum ALCopenslPlayback_open(ALCopenslPlayback *self, const ALCchar *name); -static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self); -static ALCboolean ALCopenslPlayback_start(ALCopenslPlayback *self); -static void ALCopenslPlayback_stop(ALCopenslPlayback *self); -static DECLARE_FORWARD2(ALCopenslPlayback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCopenslPlayback, ALCbackend, ALCuint, availableSamples) -static ClockLatency ALCopenslPlayback_getClockLatency(ALCopenslPlayback *self); -static DECLARE_FORWARD(ALCopenslPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCopenslPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCopenslPlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCopenslPlayback); - - -static void ALCopenslPlayback_Construct(ALCopenslPlayback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCopenslPlayback, ALCbackend, self); - - self->mEngineObj = NULL; - self->mEngine = NULL; - self->mOutputMix = NULL; - self->mBufferQueueObj = NULL; - - self->mRing = NULL; - alsem_init(&self->mSem, 0); - - self->mFrameSize = 0; - - ATOMIC_INIT(&self->mKillNow, AL_FALSE); -} - -static void ALCopenslPlayback_Destruct(ALCopenslPlayback* self) -{ - if(self->mBufferQueueObj != NULL) - VCALL0(self->mBufferQueueObj,Destroy)(); - self->mBufferQueueObj = NULL; - - if(self->mOutputMix) - VCALL0(self->mOutputMix,Destroy)(); - self->mOutputMix = NULL; - - if(self->mEngineObj) - VCALL0(self->mEngineObj,Destroy)(); - self->mEngineObj = NULL; - self->mEngine = NULL; - - alsem_destroy(&self->mSem); - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -/* this callback handler is called every time a buffer finishes playing */ -static void ALCopenslPlayback_process(SLAndroidSimpleBufferQueueItf UNUSED(bq), void *context) -{ - ALCopenslPlayback *self = context; - - /* A note on the ringbuffer usage: The buffer queue seems to hold on to the - * pointer passed to the Enqueue method, rather than copying the audio. - * Consequently, the ringbuffer contains the audio that is currently queued - * and waiting to play. This process() callback is called when a buffer is - * finished, so we simply move the read pointer up to indicate the space is - * available for writing again, and wake up the mixer thread to mix and - * queue more audio. - */ - ll_ringbuffer_read_advance(self->mRing, 1); - - alsem_post(&self->mSem); -} - - -static int ALCopenslPlayback_mixerProc(void *arg) -{ - ALCopenslPlayback *self = arg; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - SLAndroidSimpleBufferQueueItf bufferQueue; - ll_ringbuffer_data_t data[2]; - SLPlayItf player; - SLresult result; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, - &bufferQueue); - PRINTERR(result, "bufferQueue->GetInterface SL_IID_ANDROIDSIMPLEBUFFERQUEUE"); - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_PLAY, &player); - PRINTERR(result, "bufferQueue->GetInterface SL_IID_PLAY"); - } - if(SL_RESULT_SUCCESS != result) - { - ALCopenslPlayback_lock(self); - aluHandleDisconnect(device, "Failed to get playback buffer: 0x%08x", result); - ALCopenslPlayback_unlock(self); - return 1; - } - - ALCopenslPlayback_lock(self); - while(!ATOMIC_LOAD(&self->mKillNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - size_t todo, len0, len1; - - if(ll_ringbuffer_write_space(self->mRing) == 0) - { - SLuint32 state = 0; - - result = VCALL(player,GetPlayState)(&state); - PRINTERR(result, "player->GetPlayState"); - if(SL_RESULT_SUCCESS == result && state != SL_PLAYSTATE_PLAYING) - { - result = VCALL(player,SetPlayState)(SL_PLAYSTATE_PLAYING); - PRINTERR(result, "player->SetPlayState"); - } - if(SL_RESULT_SUCCESS != result) - { - aluHandleDisconnect(device, "Failed to start platback: 0x%08x", result); - break; - } - - if(ll_ringbuffer_write_space(self->mRing) == 0) - { - ALCopenslPlayback_unlock(self); - alsem_wait(&self->mSem); - ALCopenslPlayback_lock(self); - continue; - } - } - - ll_ringbuffer_get_write_vector(self->mRing, data); - todo = data[0].len+data[1].len; - - len0 = minu(todo, data[0].len); - len1 = minu(todo-len0, data[1].len); - - aluMixData(device, data[0].buf, len0*device->UpdateSize); - for(size_t i = 0;i < len0;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[0].buf, device->UpdateSize*self->mFrameSize); - PRINTERR(result, "bufferQueue->Enqueue"); - if(SL_RESULT_SUCCESS == result) - ll_ringbuffer_write_advance(self->mRing, 1); - - data[0].buf += device->UpdateSize*self->mFrameSize; - } - - if(len1 > 0) - { - aluMixData(device, data[1].buf, len1*device->UpdateSize); - for(size_t i = 0;i < len1;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[1].buf, device->UpdateSize*self->mFrameSize); - PRINTERR(result, "bufferQueue->Enqueue"); - if(SL_RESULT_SUCCESS == result) - ll_ringbuffer_write_advance(self->mRing, 1); - - data[1].buf += device->UpdateSize*self->mFrameSize; - } - } - } - ALCopenslPlayback_unlock(self); - - return 0; -} - - -static ALCenum ALCopenslPlayback_open(ALCopenslPlayback *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - SLresult result; - - if(!name) - name = opensl_device; - else if(strcmp(name, opensl_device) != 0) - return ALC_INVALID_VALUE; - - // create engine - result = slCreateEngine(&self->mEngineObj, 0, NULL, 0, NULL, NULL); - PRINTERR(result, "slCreateEngine"); - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mEngineObj,Realize)(SL_BOOLEAN_FALSE); - PRINTERR(result, "engine->Realize"); - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mEngineObj,GetInterface)(SL_IID_ENGINE, &self->mEngine); - PRINTERR(result, "engine->GetInterface"); - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mEngine,CreateOutputMix)(&self->mOutputMix, 0, NULL, NULL); - PRINTERR(result, "engine->CreateOutputMix"); - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mOutputMix,Realize)(SL_BOOLEAN_FALSE); - PRINTERR(result, "outputMix->Realize"); - } - - if(SL_RESULT_SUCCESS != result) - { - if(self->mOutputMix != NULL) - VCALL0(self->mOutputMix,Destroy)(); - self->mOutputMix = NULL; - - if(self->mEngineObj != NULL) - VCALL0(self->mEngineObj,Destroy)(); - self->mEngineObj = NULL; - self->mEngine = NULL; - - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - SLDataLocator_AndroidSimpleBufferQueue loc_bufq; - SLDataLocator_OutputMix loc_outmix; - SLDataSource audioSrc; - SLDataSink audioSnk; - ALuint sampleRate; - SLInterfaceID ids[2]; - SLboolean reqs[2]; - SLresult result; - JNIEnv *env; - - if(self->mBufferQueueObj != NULL) - VCALL0(self->mBufferQueueObj,Destroy)(); - self->mBufferQueueObj = NULL; - - sampleRate = device->Frequency; - if(!(device->Flags&DEVICE_FREQUENCY_REQUEST) && (env=Android_GetJNIEnv()) != NULL) - { - /* FIXME: Disabled until I figure out how to get the Context needed for - * the getSystemService call. - */ -#if 0 - /* Get necessary stuff for using java.lang.Integer, - * android.content.Context, and android.media.AudioManager. - */ - jclass int_cls = JCALL(env,FindClass)("java/lang/Integer"); - jmethodID int_parseint = JCALL(env,GetStaticMethodID)(int_cls, - "parseInt", "(Ljava/lang/String;)I" - ); - TRACE("Integer: %p, parseInt: %p\n", int_cls, int_parseint); - - jclass ctx_cls = JCALL(env,FindClass)("android/content/Context"); - jfieldID ctx_audsvc = JCALL(env,GetStaticFieldID)(ctx_cls, - "AUDIO_SERVICE", "Ljava/lang/String;" - ); - jmethodID ctx_getSysSvc = JCALL(env,GetMethodID)(ctx_cls, - "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;" - ); - TRACE("Context: %p, AUDIO_SERVICE: %p, getSystemService: %p\n", - ctx_cls, ctx_audsvc, ctx_getSysSvc); - - jclass audmgr_cls = JCALL(env,FindClass)("android/media/AudioManager"); - jfieldID audmgr_prop_out_srate = JCALL(env,GetStaticFieldID)(audmgr_cls, - "PROPERTY_OUTPUT_SAMPLE_RATE", "Ljava/lang/String;" - ); - jmethodID audmgr_getproperty = JCALL(env,GetMethodID)(audmgr_cls, - "getProperty", "(Ljava/lang/String;)Ljava/lang/String;" - ); - TRACE("AudioManager: %p, PROPERTY_OUTPUT_SAMPLE_RATE: %p, getProperty: %p\n", - audmgr_cls, audmgr_prop_out_srate, audmgr_getproperty); - - const char *strchars; - jstring strobj; - - /* Now make the calls. */ - //AudioManager audMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); - strobj = JCALL(env,GetStaticObjectField)(ctx_cls, ctx_audsvc); - jobject audMgr = JCALL(env,CallObjectMethod)(ctx_cls, ctx_getSysSvc, strobj); - strchars = JCALL(env,GetStringUTFChars)(strobj, NULL); - TRACE("Context.getSystemService(%s) = %p\n", strchars, audMgr); - JCALL(env,ReleaseStringUTFChars)(strobj, strchars); - - //String srateStr = audMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); - strobj = JCALL(env,GetStaticObjectField)(audmgr_cls, audmgr_prop_out_srate); - jstring srateStr = JCALL(env,CallObjectMethod)(audMgr, audmgr_getproperty, strobj); - strchars = JCALL(env,GetStringUTFChars)(strobj, NULL); - TRACE("audMgr.getProperty(%s) = %p\n", strchars, srateStr); - JCALL(env,ReleaseStringUTFChars)(strobj, strchars); - - //int sampleRate = Integer.parseInt(srateStr); - sampleRate = JCALL(env,CallStaticIntMethod)(int_cls, int_parseint, srateStr); - - strchars = JCALL(env,GetStringUTFChars)(srateStr, NULL); - TRACE("Got system sample rate %uhz (%s)\n", sampleRate, strchars); - JCALL(env,ReleaseStringUTFChars)(srateStr, strchars); - - if(!sampleRate) sampleRate = device->Frequency; - else sampleRate = maxu(sampleRate, MIN_OUTPUT_RATE); -#endif - } - - if(sampleRate != device->Frequency) - { - device->NumUpdates = (device->NumUpdates*sampleRate + (device->Frequency>>1)) / - device->Frequency; - device->NumUpdates = maxu(device->NumUpdates, 2); - device->Frequency = sampleRate; - } - - device->FmtChans = DevFmtStereo; - device->FmtType = DevFmtShort; - - SetDefaultWFXChannelOrder(device); - self->mFrameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - - loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; - loc_bufq.numBuffers = device->NumUpdates; - -#ifdef SL_DATAFORMAT_PCM_EX - SLDataFormat_PCM_EX format_pcm; - format_pcm.formatType = SL_DATAFORMAT_PCM_EX; - format_pcm.numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - format_pcm.sampleRate = device->Frequency * 1000; - format_pcm.bitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - format_pcm.containerSize = format_pcm.bitsPerSample; - format_pcm.channelMask = GetChannelMask(device->FmtChans); - format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : - SL_BYTEORDER_BIGENDIAN; - format_pcm.representation = GetTypeRepresentation(device->FmtType); -#else - SLDataFormat_PCM format_pcm; - format_pcm.formatType = SL_DATAFORMAT_PCM; - format_pcm.numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - format_pcm.samplesPerSec = device->Frequency * 1000; - format_pcm.bitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - format_pcm.containerSize = format_pcm.bitsPerSample; - format_pcm.channelMask = GetChannelMask(device->FmtChans); - format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : - SL_BYTEORDER_BIGENDIAN; -#endif - - audioSrc.pLocator = &loc_bufq; - audioSrc.pFormat = &format_pcm; - - loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; - loc_outmix.outputMix = self->mOutputMix; - audioSnk.pLocator = &loc_outmix; - audioSnk.pFormat = NULL; - - - ids[0] = SL_IID_ANDROIDSIMPLEBUFFERQUEUE; - reqs[0] = SL_BOOLEAN_TRUE; - ids[1] = SL_IID_ANDROIDCONFIGURATION; - reqs[1] = SL_BOOLEAN_FALSE; - - result = VCALL(self->mEngine,CreateAudioPlayer)(&self->mBufferQueueObj, - &audioSrc, &audioSnk, COUNTOF(ids), ids, reqs - ); - PRINTERR(result, "engine->CreateAudioPlayer"); - if(SL_RESULT_SUCCESS == result) - { - /* Set the stream type to "media" (games, music, etc), if possible. */ - SLAndroidConfigurationItf config; - result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_ANDROIDCONFIGURATION, &config); - PRINTERR(result, "bufferQueue->GetInterface SL_IID_ANDROIDCONFIGURATION"); - if(SL_RESULT_SUCCESS == result) - { - SLint32 streamType = SL_ANDROID_STREAM_MEDIA; - result = VCALL(config,SetConfiguration)(SL_ANDROID_KEY_STREAM_TYPE, - &streamType, sizeof(streamType) - ); - PRINTERR(result, "config->SetConfiguration"); - } - - /* Clear any error since this was optional. */ - result = SL_RESULT_SUCCESS; - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mBufferQueueObj,Realize)(SL_BOOLEAN_FALSE); - PRINTERR(result, "bufferQueue->Realize"); - } - - if(SL_RESULT_SUCCESS != result) - { - if(self->mBufferQueueObj != NULL) - VCALL0(self->mBufferQueueObj,Destroy)(); - self->mBufferQueueObj = NULL; - - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static ALCboolean ALCopenslPlayback_start(ALCopenslPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - SLAndroidSimpleBufferQueueItf bufferQueue; - SLresult result; - - ll_ringbuffer_free(self->mRing); - self->mRing = ll_ringbuffer_create(device->NumUpdates, self->mFrameSize*device->UpdateSize, - true); - - result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, - &bufferQueue); - PRINTERR(result, "bufferQueue->GetInterface"); - if(SL_RESULT_SUCCESS != result) - return ALC_FALSE; - - result = VCALL(bufferQueue,RegisterCallback)(ALCopenslPlayback_process, self); - PRINTERR(result, "bufferQueue->RegisterCallback"); - if(SL_RESULT_SUCCESS != result) - return ALC_FALSE; - - ATOMIC_STORE_SEQ(&self->mKillNow, AL_FALSE); - if(althrd_create(&self->mThread, ALCopenslPlayback_mixerProc, self) != althrd_success) - { - ERR("Failed to start mixer thread\n"); - return ALC_FALSE; - } - - return ALC_TRUE; -} - - -static void ALCopenslPlayback_stop(ALCopenslPlayback *self) -{ - SLAndroidSimpleBufferQueueItf bufferQueue; - SLPlayItf player; - SLresult result; - int res; - - if(ATOMIC_EXCHANGE_SEQ(&self->mKillNow, AL_TRUE)) - return; - - alsem_post(&self->mSem); - althrd_join(self->mThread, &res); - - result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_PLAY, &player); - PRINTERR(result, "bufferQueue->GetInterface"); - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(player,SetPlayState)(SL_PLAYSTATE_STOPPED); - PRINTERR(result, "player->SetPlayState"); - } - - result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, - &bufferQueue); - PRINTERR(result, "bufferQueue->GetInterface"); - if(SL_RESULT_SUCCESS == result) - { - result = VCALL0(bufferQueue,Clear)(); - PRINTERR(result, "bufferQueue->Clear"); - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(bufferQueue,RegisterCallback)(NULL, NULL); - PRINTERR(result, "bufferQueue->RegisterCallback"); - } - if(SL_RESULT_SUCCESS == result) - { - SLAndroidSimpleBufferQueueState state; - do { - althrd_yield(); - result = VCALL(bufferQueue,GetState)(&state); - } while(SL_RESULT_SUCCESS == result && state.count > 0); - PRINTERR(result, "bufferQueue->GetState"); - } - - ll_ringbuffer_free(self->mRing); - self->mRing = NULL; -} - -static ClockLatency ALCopenslPlayback_getClockLatency(ALCopenslPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ClockLatency ret; - - ALCopenslPlayback_lock(self); - ret.ClockTime = GetDeviceClockTime(device); - ret.Latency = ll_ringbuffer_read_space(self->mRing)*device->UpdateSize * - DEVICE_CLOCK_RES / device->Frequency; - ALCopenslPlayback_unlock(self); - - return ret; -} - - -typedef struct ALCopenslCapture { - DERIVE_FROM_TYPE(ALCbackend); - - /* engine interfaces */ - SLObjectItf mEngineObj; - SLEngineItf mEngine; - - /* recording interfaces */ - SLObjectItf mRecordObj; - - ll_ringbuffer_t *mRing; - ALCuint mSplOffset; - - ALsizei mFrameSize; -} ALCopenslCapture; - -static void ALCopenslCapture_process(SLAndroidSimpleBufferQueueItf bq, void *context); - -static void ALCopenslCapture_Construct(ALCopenslCapture *self, ALCdevice *device); -static void ALCopenslCapture_Destruct(ALCopenslCapture *self); -static ALCenum ALCopenslCapture_open(ALCopenslCapture *self, const ALCchar *name); -static DECLARE_FORWARD(ALCopenslCapture, ALCbackend, ALCboolean, reset) -static ALCboolean ALCopenslCapture_start(ALCopenslCapture *self); -static void ALCopenslCapture_stop(ALCopenslCapture *self); -static ALCenum ALCopenslCapture_captureSamples(ALCopenslCapture *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCopenslCapture_availableSamples(ALCopenslCapture *self); -static DECLARE_FORWARD(ALCopenslCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCopenslCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCopenslCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCopenslCapture) -DEFINE_ALCBACKEND_VTABLE(ALCopenslCapture); - - -static void ALCopenslCapture_process(SLAndroidSimpleBufferQueueItf UNUSED(bq), void *context) -{ - ALCopenslCapture *self = context; - /* A new chunk has been written into the ring buffer, advance it. */ - ll_ringbuffer_write_advance(self->mRing, 1); -} - - -static void ALCopenslCapture_Construct(ALCopenslCapture *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCopenslCapture, ALCbackend, self); - - self->mEngineObj = NULL; - self->mEngine = NULL; - - self->mRecordObj = NULL; - - self->mRing = NULL; - self->mSplOffset = 0; - - self->mFrameSize = 0; -} - -static void ALCopenslCapture_Destruct(ALCopenslCapture *self) -{ - ll_ringbuffer_free(self->mRing); - self->mRing = NULL; - - if(self->mRecordObj != NULL) - VCALL0(self->mRecordObj,Destroy)(); - self->mRecordObj = NULL; - - if(self->mEngineObj != NULL) - VCALL0(self->mEngineObj,Destroy)(); - self->mEngineObj = NULL; - self->mEngine = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - -static ALCenum ALCopenslCapture_open(ALCopenslCapture *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - SLDataLocator_AndroidSimpleBufferQueue loc_bq; - SLAndroidSimpleBufferQueueItf bufferQueue; - SLDataLocator_IODevice loc_dev; - SLDataSource audioSrc; - SLDataSink audioSnk; - SLresult result; - - if(!name) - name = opensl_device; - else if(strcmp(name, opensl_device) != 0) - return ALC_INVALID_VALUE; - - result = slCreateEngine(&self->mEngineObj, 0, NULL, 0, NULL, NULL); - PRINTERR(result, "slCreateEngine"); - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mEngineObj,Realize)(SL_BOOLEAN_FALSE); - PRINTERR(result, "engine->Realize"); - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mEngineObj,GetInterface)(SL_IID_ENGINE, &self->mEngine); - PRINTERR(result, "engine->GetInterface"); - } - if(SL_RESULT_SUCCESS == result) - { - /* Ensure the total length is at least 100ms */ - ALsizei length = maxi(device->NumUpdates * device->UpdateSize, - device->Frequency / 10); - /* Ensure the per-chunk length is at least 10ms, and no more than 50ms. */ - ALsizei update_len = clampi(device->NumUpdates*device->UpdateSize / 3, - device->Frequency / 100, - device->Frequency / 100 * 5); - - device->UpdateSize = update_len; - device->NumUpdates = (length+update_len-1) / update_len; - - self->mFrameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - } - loc_dev.locatorType = SL_DATALOCATOR_IODEVICE; - loc_dev.deviceType = SL_IODEVICE_AUDIOINPUT; - loc_dev.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT; - loc_dev.device = NULL; - - audioSrc.pLocator = &loc_dev; - audioSrc.pFormat = NULL; - - loc_bq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; - loc_bq.numBuffers = device->NumUpdates; - -#ifdef SL_DATAFORMAT_PCM_EX - SLDataFormat_PCM_EX format_pcm; - format_pcm.formatType = SL_DATAFORMAT_PCM_EX; - format_pcm.numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - format_pcm.sampleRate = device->Frequency * 1000; - format_pcm.bitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - format_pcm.containerSize = format_pcm.bitsPerSample; - format_pcm.channelMask = GetChannelMask(device->FmtChans); - format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : - SL_BYTEORDER_BIGENDIAN; - format_pcm.representation = GetTypeRepresentation(device->FmtType); -#else - SLDataFormat_PCM format_pcm; - format_pcm.formatType = SL_DATAFORMAT_PCM; - format_pcm.numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - format_pcm.samplesPerSec = device->Frequency * 1000; - format_pcm.bitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - format_pcm.containerSize = format_pcm.bitsPerSample; - format_pcm.channelMask = GetChannelMask(device->FmtChans); - format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : - SL_BYTEORDER_BIGENDIAN; -#endif - - audioSnk.pLocator = &loc_bq; - audioSnk.pFormat = &format_pcm; - - if(SL_RESULT_SUCCESS == result) - { - const SLInterfaceID ids[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }; - const SLboolean reqs[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE }; - - result = VCALL(self->mEngine,CreateAudioRecorder)(&self->mRecordObj, - &audioSrc, &audioSnk, COUNTOF(ids), ids, reqs - ); - PRINTERR(result, "engine->CreateAudioRecorder"); - } - if(SL_RESULT_SUCCESS == result) - { - /* Set the record preset to "generic", if possible. */ - SLAndroidConfigurationItf config; - result = VCALL(self->mRecordObj,GetInterface)(SL_IID_ANDROIDCONFIGURATION, &config); - PRINTERR(result, "recordObj->GetInterface SL_IID_ANDROIDCONFIGURATION"); - if(SL_RESULT_SUCCESS == result) - { - SLuint32 preset = SL_ANDROID_RECORDING_PRESET_GENERIC; - result = VCALL(config,SetConfiguration)(SL_ANDROID_KEY_RECORDING_PRESET, - &preset, sizeof(preset) - ); - PRINTERR(result, "config->SetConfiguration"); - } - - /* Clear any error since this was optional. */ - result = SL_RESULT_SUCCESS; - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(self->mRecordObj,Realize)(SL_BOOLEAN_FALSE); - PRINTERR(result, "recordObj->Realize"); - } - - if(SL_RESULT_SUCCESS == result) - { - self->mRing = ll_ringbuffer_create(device->NumUpdates, device->UpdateSize*self->mFrameSize, - false); - - result = VCALL(self->mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, - &bufferQueue); - PRINTERR(result, "recordObj->GetInterface"); - } - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(bufferQueue,RegisterCallback)(ALCopenslCapture_process, self); - PRINTERR(result, "bufferQueue->RegisterCallback"); - } - if(SL_RESULT_SUCCESS == result) - { - ALsizei chunk_size = device->UpdateSize * self->mFrameSize; - ll_ringbuffer_data_t data[2]; - size_t i; - - ll_ringbuffer_get_write_vector(self->mRing, data); - for(i = 0;i < data[0].len && SL_RESULT_SUCCESS == result;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[0].buf + chunk_size*i, chunk_size); - PRINTERR(result, "bufferQueue->Enqueue"); - } - for(i = 0;i < data[1].len && SL_RESULT_SUCCESS == result;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[1].buf + chunk_size*i, chunk_size); - PRINTERR(result, "bufferQueue->Enqueue"); - } - } - - if(SL_RESULT_SUCCESS != result) - { - if(self->mRecordObj != NULL) - VCALL0(self->mRecordObj,Destroy)(); - self->mRecordObj = NULL; - - if(self->mEngineObj != NULL) - VCALL0(self->mEngineObj,Destroy)(); - self->mEngineObj = NULL; - self->mEngine = NULL; - - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCopenslCapture_start(ALCopenslCapture *self) -{ - SLRecordItf record; - SLresult result; - - result = VCALL(self->mRecordObj,GetInterface)(SL_IID_RECORD, &record); - PRINTERR(result, "recordObj->GetInterface"); - - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(record,SetRecordState)(SL_RECORDSTATE_RECORDING); - PRINTERR(result, "record->SetRecordState"); - } - - if(SL_RESULT_SUCCESS != result) - { - ALCopenslCapture_lock(self); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, - "Failed to start capture: 0x%08x", result); - ALCopenslCapture_unlock(self); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCopenslCapture_stop(ALCopenslCapture *self) -{ - SLRecordItf record; - SLresult result; - - result = VCALL(self->mRecordObj,GetInterface)(SL_IID_RECORD, &record); - PRINTERR(result, "recordObj->GetInterface"); - - if(SL_RESULT_SUCCESS == result) - { - result = VCALL(record,SetRecordState)(SL_RECORDSTATE_PAUSED); - PRINTERR(result, "record->SetRecordState"); - } -} - -static ALCenum ALCopenslCapture_captureSamples(ALCopenslCapture *self, ALCvoid *buffer, ALCuint samples) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALsizei chunk_size = device->UpdateSize * self->mFrameSize; - SLAndroidSimpleBufferQueueItf bufferQueue; - ll_ringbuffer_data_t data[2]; - SLresult result; - size_t advance; - ALCuint i; - - /* Read the desired samples from the ring buffer then advance its read - * pointer. - */ - ll_ringbuffer_get_read_vector(self->mRing, data); - advance = 0; - for(i = 0;i < samples;) - { - ALCuint rem = minu(samples - i, device->UpdateSize - self->mSplOffset); - memcpy((ALCbyte*)buffer + i*self->mFrameSize, - data[0].buf + self->mSplOffset*self->mFrameSize, - rem * self->mFrameSize); - - self->mSplOffset += rem; - if(self->mSplOffset == device->UpdateSize) - { - /* Finished a chunk, reset the offset and advance the read pointer. */ - self->mSplOffset = 0; - advance++; - - data[0].len--; - if(!data[0].len) - data[0] = data[1]; - else - data[0].buf += chunk_size; - } - - i += rem; - } - ll_ringbuffer_read_advance(self->mRing, advance); - - result = VCALL(self->mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, - &bufferQueue); - PRINTERR(result, "recordObj->GetInterface"); - - /* Enqueue any newly-writable chunks in the ring buffer. */ - ll_ringbuffer_get_write_vector(self->mRing, data); - for(i = 0;i < data[0].len && SL_RESULT_SUCCESS == result;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[0].buf + chunk_size*i, chunk_size); - PRINTERR(result, "bufferQueue->Enqueue"); - } - for(i = 0;i < data[1].len && SL_RESULT_SUCCESS == result;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[1].buf + chunk_size*i, chunk_size); - PRINTERR(result, "bufferQueue->Enqueue"); - } - - if(SL_RESULT_SUCCESS != result) - { - ALCopenslCapture_lock(self); - aluHandleDisconnect(device, "Failed to update capture buffer: 0x%08x", result); - ALCopenslCapture_unlock(self); - return ALC_INVALID_DEVICE; - } - - return ALC_NO_ERROR; -} - -static ALCuint ALCopenslCapture_availableSamples(ALCopenslCapture *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - return ll_ringbuffer_read_space(self->mRing) * device->UpdateSize; -} - - -typedef struct ALCopenslBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCopenslBackendFactory; -#define ALCOPENSLBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCopenslBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCopenslBackendFactory_init(ALCopenslBackendFactory* UNUSED(self)) -{ - return ALC_TRUE; -} - -static void ALCopenslBackendFactory_deinit(ALCopenslBackendFactory* UNUSED(self)) -{ -} - -static ALCboolean ALCopenslBackendFactory_querySupport(ALCopenslBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCopenslBackendFactory_probe(ALCopenslBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(opensl_device); - break; - - case CAPTURE_DEVICE_PROBE: - AppendCaptureDeviceList(opensl_device); - break; - } -} - -static ALCbackend* ALCopenslBackendFactory_createBackend(ALCopenslBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCopenslPlayback *backend; - NEW_OBJ(backend, ALCopenslPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCopenslCapture *backend; - NEW_OBJ(backend, ALCopenslCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCopenslBackendFactory); - - -ALCbackendFactory *ALCopenslBackendFactory_getFactory(void) -{ - static ALCopenslBackendFactory factory = ALCOPENSLBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/backends/oss.c b/Alc/backends/oss.c deleted file mode 100644 index c0c98c4..0000000 --- a/Alc/backends/oss.c +++ /dev/null @@ -1,878 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - -#include - -/* - * The OSS documentation talks about SOUND_MIXER_READ, but the header - * only contains MIXER_READ. Play safe. Same for WRITE. - */ -#ifndef SOUND_MIXER_READ -#define SOUND_MIXER_READ MIXER_READ -#endif -#ifndef SOUND_MIXER_WRITE -#define SOUND_MIXER_WRITE MIXER_WRITE -#endif - -#if defined(SOUND_VERSION) && (SOUND_VERSION < 0x040000) -#define ALC_OSS_COMPAT -#endif -#ifndef SNDCTL_AUDIOINFO -#define ALC_OSS_COMPAT -#endif - -/* - * FreeBSD strongly discourages the use of specific devices, - * such as those returned in oss_audioinfo.devnode - */ -#ifdef __FreeBSD__ -#define ALC_OSS_DEVNODE_TRUC -#endif - -struct oss_device { - const ALCchar *handle; - const char *path; - struct oss_device *next; -}; - -static struct oss_device oss_playback = { - "OSS Default", - "/dev/dsp", - NULL -}; - -static struct oss_device oss_capture = { - "OSS Default", - "/dev/dsp", - NULL -}; - -#ifdef ALC_OSS_COMPAT - -#define DSP_CAP_OUTPUT 0x00020000 -#define DSP_CAP_INPUT 0x00010000 -static void ALCossListPopulate(struct oss_device *UNUSED(devlist), int UNUSED(type_flag)) -{ -} - -#else - -#ifndef HAVE_STRNLEN -static size_t strnlen(const char *str, size_t maxlen) -{ - const char *end = memchr(str, 0, maxlen); - if(!end) return maxlen; - return end - str; -} -#endif - -static void ALCossListAppend(struct oss_device *list, const char *handle, size_t hlen, const char *path, size_t plen) -{ - struct oss_device *next; - struct oss_device *last; - size_t i; - - /* skip the first item "OSS Default" */ - last = list; - next = list->next; -#ifdef ALC_OSS_DEVNODE_TRUC - for(i = 0;i < plen;i++) - { - if(path[i] == '.') - { - if(strncmp(path + i, handle + hlen + i - plen, plen - i) == 0) - hlen = hlen + i - plen; - plen = i; - } - } -#else - (void)i; -#endif - if(handle[0] == '\0') - { - handle = path; - hlen = plen; - } - - while(next != NULL) - { - if(strncmp(next->path, path, plen) == 0) - return; - last = next; - next = next->next; - } - - next = (struct oss_device*)malloc(sizeof(struct oss_device) + hlen + plen + 2); - next->handle = (char*)(next + 1); - next->path = next->handle + hlen + 1; - next->next = NULL; - last->next = next; - - strncpy((char*)next->handle, handle, hlen); - ((char*)next->handle)[hlen] = '\0'; - strncpy((char*)next->path, path, plen); - ((char*)next->path)[plen] = '\0'; - - TRACE("Got device \"%s\", \"%s\"\n", next->handle, next->path); -} - -static void ALCossListPopulate(struct oss_device *devlist, int type_flag) -{ - struct oss_sysinfo si; - struct oss_audioinfo ai; - int fd, i; - - if((fd=open("/dev/mixer", O_RDONLY)) < 0) - { - TRACE("Could not open /dev/mixer: %s\n", strerror(errno)); - return; - } - if(ioctl(fd, SNDCTL_SYSINFO, &si) == -1) - { - TRACE("SNDCTL_SYSINFO failed: %s\n", strerror(errno)); - goto done; - } - for(i = 0;i < si.numaudios;i++) - { - const char *handle; - size_t len; - - ai.dev = i; - if(ioctl(fd, SNDCTL_AUDIOINFO, &ai) == -1) - { - ERR("SNDCTL_AUDIOINFO (%d) failed: %s\n", i, strerror(errno)); - continue; - } - if(ai.devnode[0] == '\0') - continue; - - if(ai.handle[0] != '\0') - { - len = strnlen(ai.handle, sizeof(ai.handle)); - handle = ai.handle; - } - else - { - len = strnlen(ai.name, sizeof(ai.name)); - handle = ai.name; - } - if((ai.caps&type_flag)) - ALCossListAppend(devlist, handle, len, ai.devnode, - strnlen(ai.devnode, sizeof(ai.devnode))); - } - -done: - close(fd); -} - -#endif - -static void ALCossListFree(struct oss_device *list) -{ - struct oss_device *cur; - if(list == NULL) - return; - - /* skip the first item "OSS Default" */ - cur = list->next; - list->next = NULL; - - while(cur != NULL) - { - struct oss_device *next = cur->next; - free(cur); - cur = next; - } -} - -static int log2i(ALCuint x) -{ - int y = 0; - while (x > 1) - { - x >>= 1; - y++; - } - return y; -} - -typedef struct ALCplaybackOSS { - DERIVE_FROM_TYPE(ALCbackend); - - int fd; - - ALubyte *mix_data; - int data_size; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCplaybackOSS; - -static int ALCplaybackOSS_mixerProc(void *ptr); - -static void ALCplaybackOSS_Construct(ALCplaybackOSS *self, ALCdevice *device); -static void ALCplaybackOSS_Destruct(ALCplaybackOSS *self); -static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name); -static ALCboolean ALCplaybackOSS_reset(ALCplaybackOSS *self); -static ALCboolean ALCplaybackOSS_start(ALCplaybackOSS *self); -static void ALCplaybackOSS_stop(ALCplaybackOSS *self); -static DECLARE_FORWARD2(ALCplaybackOSS, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) -static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCplaybackOSS) -DEFINE_ALCBACKEND_VTABLE(ALCplaybackOSS); - - -static int ALCplaybackOSS_mixerProc(void *ptr) -{ - ALCplaybackOSS *self = (ALCplaybackOSS*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - struct timeval timeout; - ALubyte *write_ptr; - ALint frame_size; - ALint to_write; - ssize_t wrote; - fd_set wfds; - int sret; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - ALCplaybackOSS_lock(self); - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - FD_ZERO(&wfds); - FD_SET(self->fd, &wfds); - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - ALCplaybackOSS_unlock(self); - sret = select(self->fd+1, NULL, &wfds, NULL, &timeout); - ALCplaybackOSS_lock(self); - if(sret < 0) - { - if(errno == EINTR) - continue; - ERR("select failed: %s\n", strerror(errno)); - aluHandleDisconnect(device, "Failed waiting for playback buffer: %s", strerror(errno)); - break; - } - else if(sret == 0) - { - WARN("select timeout\n"); - continue; - } - - write_ptr = self->mix_data; - to_write = self->data_size; - aluMixData(device, write_ptr, to_write/frame_size); - while(to_write > 0 && !ATOMIC_LOAD_SEQ(&self->killNow)) - { - wrote = write(self->fd, write_ptr, to_write); - if(wrote < 0) - { - if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) - continue; - ERR("write failed: %s\n", strerror(errno)); - aluHandleDisconnect(device, "Failed writing playback samples: %s", - strerror(errno)); - break; - } - - to_write -= wrote; - write_ptr += wrote; - } - } - ALCplaybackOSS_unlock(self); - - return 0; -} - - -static void ALCplaybackOSS_Construct(ALCplaybackOSS *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCplaybackOSS, ALCbackend, self); - - self->fd = -1; - ATOMIC_INIT(&self->killNow, AL_FALSE); -} - -static void ALCplaybackOSS_Destruct(ALCplaybackOSS *self) -{ - if(self->fd != -1) - close(self->fd); - self->fd = -1; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - -static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name) -{ - struct oss_device *dev = &oss_playback; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - if(!name || strcmp(name, dev->handle) == 0) - name = dev->handle; - else - { - if(!dev->next) - { - ALCossListPopulate(&oss_playback, DSP_CAP_OUTPUT); - dev = &oss_playback; - } - while(dev != NULL) - { - if (strcmp(dev->handle, name) == 0) - break; - dev = dev->next; - } - if(dev == NULL) - { - WARN("Could not find \"%s\" in device list\n", name); - return ALC_INVALID_VALUE; - } - } - - self->fd = open(dev->path, O_WRONLY); - if(self->fd == -1) - { - ERR("Could not open %s: %s\n", dev->path, strerror(errno)); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCplaybackOSS_reset(ALCplaybackOSS *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - int numFragmentsLogSize; - int log2FragmentSize; - unsigned int periods; - audio_buf_info info; - ALuint frameSize; - int numChannels; - int ossFormat; - int ossSpeed; - char *err; - - switch(device->FmtType) - { - case DevFmtByte: - ossFormat = AFMT_S8; - break; - case DevFmtUByte: - ossFormat = AFMT_U8; - break; - case DevFmtUShort: - case DevFmtInt: - case DevFmtUInt: - case DevFmtFloat: - device->FmtType = DevFmtShort; - /* fall-through */ - case DevFmtShort: - ossFormat = AFMT_S16_NE; - break; - } - - periods = device->NumUpdates; - numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - ossSpeed = device->Frequency; - frameSize = numChannels * BytesFromDevFmt(device->FmtType); - /* According to the OSS spec, 16 bytes (log2(16)) is the minimum. */ - log2FragmentSize = maxi(log2i(device->UpdateSize*frameSize), 4); - numFragmentsLogSize = (periods << 16) | log2FragmentSize; - -#define CHECKERR(func) if((func) < 0) { \ - err = #func; \ - goto err; \ -} - /* Don't fail if SETFRAGMENT fails. We can handle just about anything - * that's reported back via GETOSPACE */ - ioctl(self->fd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_SETFMT, &ossFormat)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_CHANNELS, &numChannels)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_SPEED, &ossSpeed)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_GETOSPACE, &info)); - if(0) - { - err: - ERR("%s failed: %s\n", err, strerror(errno)); - return ALC_FALSE; - } -#undef CHECKERR - - if((int)ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder) != numChannels) - { - ERR("Failed to set %s, got %d channels instead\n", DevFmtChannelsString(device->FmtChans), numChannels); - return ALC_FALSE; - } - - if(!((ossFormat == AFMT_S8 && device->FmtType == DevFmtByte) || - (ossFormat == AFMT_U8 && device->FmtType == DevFmtUByte) || - (ossFormat == AFMT_S16_NE && device->FmtType == DevFmtShort))) - { - ERR("Failed to set %s samples, got OSS format %#x\n", DevFmtTypeString(device->FmtType), ossFormat); - return ALC_FALSE; - } - - device->Frequency = ossSpeed; - device->UpdateSize = info.fragsize / frameSize; - device->NumUpdates = info.fragments; - - SetDefaultChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCplaybackOSS_start(ALCplaybackOSS *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - self->data_size = device->UpdateSize * FrameSizeFromDevFmt( - device->FmtChans, device->FmtType, device->AmbiOrder - ); - self->mix_data = calloc(1, self->data_size); - - ATOMIC_STORE_SEQ(&self->killNow, AL_FALSE); - if(althrd_create(&self->thread, ALCplaybackOSS_mixerProc, self) != althrd_success) - { - free(self->mix_data); - self->mix_data = NULL; - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCplaybackOSS_stop(ALCplaybackOSS *self) -{ - int res; - - if(ATOMIC_EXCHANGE_SEQ(&self->killNow, AL_TRUE)) - return; - althrd_join(self->thread, &res); - - if(ioctl(self->fd, SNDCTL_DSP_RESET) != 0) - ERR("Error resetting device: %s\n", strerror(errno)); - - free(self->mix_data); - self->mix_data = NULL; -} - - -typedef struct ALCcaptureOSS { - DERIVE_FROM_TYPE(ALCbackend); - - int fd; - - ll_ringbuffer_t *ring; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCcaptureOSS; - -static int ALCcaptureOSS_recordProc(void *ptr); - -static void ALCcaptureOSS_Construct(ALCcaptureOSS *self, ALCdevice *device); -static void ALCcaptureOSS_Destruct(ALCcaptureOSS *self); -static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name); -static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, ALCboolean, reset) -static ALCboolean ALCcaptureOSS_start(ALCcaptureOSS *self); -static void ALCcaptureOSS_stop(ALCcaptureOSS *self); -static ALCenum ALCcaptureOSS_captureSamples(ALCcaptureOSS *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCcaptureOSS_availableSamples(ALCcaptureOSS *self); -static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCcaptureOSS) -DEFINE_ALCBACKEND_VTABLE(ALCcaptureOSS); - - -static int ALCcaptureOSS_recordProc(void *ptr) -{ - ALCcaptureOSS *self = (ALCcaptureOSS*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - struct timeval timeout; - int frame_size; - fd_set rfds; - ssize_t amt; - int sret; - - SetRTPriority(); - althrd_setname(althrd_current(), RECORD_THREAD_NAME); - - frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - while(!ATOMIC_LOAD_SEQ(&self->killNow)) - { - ll_ringbuffer_data_t vec[2]; - - FD_ZERO(&rfds); - FD_SET(self->fd, &rfds); - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - sret = select(self->fd+1, &rfds, NULL, NULL, &timeout); - if(sret < 0) - { - if(errno == EINTR) - continue; - ERR("select failed: %s\n", strerror(errno)); - aluHandleDisconnect(device, "Failed to check capture samples: %s", strerror(errno)); - break; - } - else if(sret == 0) - { - WARN("select timeout\n"); - continue; - } - - ll_ringbuffer_get_write_vector(self->ring, vec); - if(vec[0].len > 0) - { - amt = read(self->fd, vec[0].buf, vec[0].len*frame_size); - if(amt < 0) - { - ERR("read failed: %s\n", strerror(errno)); - ALCcaptureOSS_lock(self); - aluHandleDisconnect(device, "Failed reading capture samples: %s", strerror(errno)); - ALCcaptureOSS_unlock(self); - break; - } - ll_ringbuffer_write_advance(self->ring, amt/frame_size); - } - } - - return 0; -} - - -static void ALCcaptureOSS_Construct(ALCcaptureOSS *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCcaptureOSS, ALCbackend, self); - - self->fd = -1; - self->ring = NULL; - ATOMIC_INIT(&self->killNow, AL_FALSE); -} - -static void ALCcaptureOSS_Destruct(ALCcaptureOSS *self) -{ - if(self->fd != -1) - close(self->fd); - self->fd = -1; - - ll_ringbuffer_free(self->ring); - self->ring = NULL; - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - -static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - struct oss_device *dev = &oss_capture; - int numFragmentsLogSize; - int log2FragmentSize; - unsigned int periods; - audio_buf_info info; - ALuint frameSize; - int numChannels; - int ossFormat; - int ossSpeed; - char *err; - - if(!name || strcmp(name, dev->handle) == 0) - name = dev->handle; - else - { - if(!dev->next) - { - ALCossListPopulate(&oss_capture, DSP_CAP_INPUT); - dev = &oss_capture; - } - while(dev != NULL) - { - if (strcmp(dev->handle, name) == 0) - break; - dev = dev->next; - } - if(dev == NULL) - { - WARN("Could not find \"%s\" in device list\n", name); - return ALC_INVALID_VALUE; - } - } - - self->fd = open(dev->path, O_RDONLY); - if(self->fd == -1) - { - ERR("Could not open %s: %s\n", dev->path, strerror(errno)); - return ALC_INVALID_VALUE; - } - - switch(device->FmtType) - { - case DevFmtByte: - ossFormat = AFMT_S8; - break; - case DevFmtUByte: - ossFormat = AFMT_U8; - break; - case DevFmtShort: - ossFormat = AFMT_S16_NE; - break; - case DevFmtUShort: - case DevFmtInt: - case DevFmtUInt: - case DevFmtFloat: - ERR("%s capture samples not supported\n", DevFmtTypeString(device->FmtType)); - return ALC_INVALID_VALUE; - } - - periods = 4; - numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - frameSize = numChannels * BytesFromDevFmt(device->FmtType); - ossSpeed = device->Frequency; - log2FragmentSize = log2i(device->UpdateSize * device->NumUpdates * - frameSize / periods); - - /* according to the OSS spec, 16 bytes are the minimum */ - if (log2FragmentSize < 4) - log2FragmentSize = 4; - numFragmentsLogSize = (periods << 16) | log2FragmentSize; - -#define CHECKERR(func) if((func) < 0) { \ - err = #func; \ - goto err; \ -} - CHECKERR(ioctl(self->fd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_SETFMT, &ossFormat)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_CHANNELS, &numChannels)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_SPEED, &ossSpeed)); - CHECKERR(ioctl(self->fd, SNDCTL_DSP_GETISPACE, &info)); - if(0) - { - err: - ERR("%s failed: %s\n", err, strerror(errno)); - close(self->fd); - self->fd = -1; - return ALC_INVALID_VALUE; - } -#undef CHECKERR - - if((int)ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder) != numChannels) - { - ERR("Failed to set %s, got %d channels instead\n", DevFmtChannelsString(device->FmtChans), numChannels); - close(self->fd); - self->fd = -1; - return ALC_INVALID_VALUE; - } - - if(!((ossFormat == AFMT_S8 && device->FmtType == DevFmtByte) || - (ossFormat == AFMT_U8 && device->FmtType == DevFmtUByte) || - (ossFormat == AFMT_S16_NE && device->FmtType == DevFmtShort))) - { - ERR("Failed to set %s samples, got OSS format %#x\n", DevFmtTypeString(device->FmtType), ossFormat); - close(self->fd); - self->fd = -1; - return ALC_INVALID_VALUE; - } - - self->ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates, frameSize, false); - if(!self->ring) - { - ERR("Ring buffer create failed\n"); - close(self->fd); - self->fd = -1; - return ALC_OUT_OF_MEMORY; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCcaptureOSS_start(ALCcaptureOSS *self) -{ - ATOMIC_STORE_SEQ(&self->killNow, AL_FALSE); - if(althrd_create(&self->thread, ALCcaptureOSS_recordProc, self) != althrd_success) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCcaptureOSS_stop(ALCcaptureOSS *self) -{ - int res; - - if(ATOMIC_EXCHANGE_SEQ(&self->killNow, AL_TRUE)) - return; - - althrd_join(self->thread, &res); - - if(ioctl(self->fd, SNDCTL_DSP_RESET) != 0) - ERR("Error resetting device: %s\n", strerror(errno)); -} - -static ALCenum ALCcaptureOSS_captureSamples(ALCcaptureOSS *self, ALCvoid *buffer, ALCuint samples) -{ - ll_ringbuffer_read(self->ring, buffer, samples); - return ALC_NO_ERROR; -} - -static ALCuint ALCcaptureOSS_availableSamples(ALCcaptureOSS *self) -{ - return ll_ringbuffer_read_space(self->ring); -} - - -typedef struct ALCossBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCossBackendFactory; -#define ALCOSSBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCossBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCossBackendFactory_getFactory(void); - -static ALCboolean ALCossBackendFactory_init(ALCossBackendFactory *self); -static void ALCossBackendFactory_deinit(ALCossBackendFactory *self); -static ALCboolean ALCossBackendFactory_querySupport(ALCossBackendFactory *self, ALCbackend_Type type); -static void ALCossBackendFactory_probe(ALCossBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCossBackendFactory_createBackend(ALCossBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCossBackendFactory); - - -ALCbackendFactory *ALCossBackendFactory_getFactory(void) -{ - static ALCossBackendFactory factory = ALCOSSBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -ALCboolean ALCossBackendFactory_init(ALCossBackendFactory* UNUSED(self)) -{ - ConfigValueStr(NULL, "oss", "device", &oss_playback.path); - ConfigValueStr(NULL, "oss", "capture", &oss_capture.path); - - return ALC_TRUE; -} - -void ALCossBackendFactory_deinit(ALCossBackendFactory* UNUSED(self)) -{ - ALCossListFree(&oss_playback); - ALCossListFree(&oss_capture); -} - - -ALCboolean ALCossBackendFactory_querySupport(ALCossBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -void ALCossBackendFactory_probe(ALCossBackendFactory* UNUSED(self), enum DevProbe type) -{ - struct oss_device *cur; - switch(type) - { - case ALL_DEVICE_PROBE: - ALCossListFree(&oss_playback); - ALCossListPopulate(&oss_playback, DSP_CAP_OUTPUT); - cur = &oss_playback; - while(cur != NULL) - { -#ifdef HAVE_STAT - struct stat buf; - if(stat(cur->path, &buf) == 0) -#endif - AppendAllDevicesList(cur->handle); - cur = cur->next; - } - break; - - case CAPTURE_DEVICE_PROBE: - ALCossListFree(&oss_capture); - ALCossListPopulate(&oss_capture, DSP_CAP_INPUT); - cur = &oss_capture; - while(cur != NULL) - { -#ifdef HAVE_STAT - struct stat buf; - if(stat(cur->path, &buf) == 0) -#endif - AppendCaptureDeviceList(cur->handle); - cur = cur->next; - } - break; - } -} - -ALCbackend* ALCossBackendFactory_createBackend(ALCossBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCplaybackOSS *backend; - NEW_OBJ(backend, ALCplaybackOSS)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCcaptureOSS *backend; - NEW_OBJ(backend, ALCcaptureOSS)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/portaudio.c b/Alc/backends/portaudio.c deleted file mode 100644 index 9b0d348..0000000 --- a/Alc/backends/portaudio.c +++ /dev/null @@ -1,558 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" -#include "compat.h" - -#include "backends/base.h" - -#include - - -static const ALCchar pa_device[] = "PortAudio Default"; - - -#ifdef HAVE_DYNLOAD -static void *pa_handle; -#define MAKE_FUNC(x) static __typeof(x) * p##x -MAKE_FUNC(Pa_Initialize); -MAKE_FUNC(Pa_Terminate); -MAKE_FUNC(Pa_GetErrorText); -MAKE_FUNC(Pa_StartStream); -MAKE_FUNC(Pa_StopStream); -MAKE_FUNC(Pa_OpenStream); -MAKE_FUNC(Pa_CloseStream); -MAKE_FUNC(Pa_GetDefaultOutputDevice); -MAKE_FUNC(Pa_GetDefaultInputDevice); -MAKE_FUNC(Pa_GetStreamInfo); -#undef MAKE_FUNC - -#define Pa_Initialize pPa_Initialize -#define Pa_Terminate pPa_Terminate -#define Pa_GetErrorText pPa_GetErrorText -#define Pa_StartStream pPa_StartStream -#define Pa_StopStream pPa_StopStream -#define Pa_OpenStream pPa_OpenStream -#define Pa_CloseStream pPa_CloseStream -#define Pa_GetDefaultOutputDevice pPa_GetDefaultOutputDevice -#define Pa_GetDefaultInputDevice pPa_GetDefaultInputDevice -#define Pa_GetStreamInfo pPa_GetStreamInfo -#endif - -static ALCboolean pa_load(void) -{ - PaError err; - -#ifdef HAVE_DYNLOAD - if(!pa_handle) - { -#ifdef _WIN32 -# define PALIB "portaudio.dll" -#elif defined(__APPLE__) && defined(__MACH__) -# define PALIB "libportaudio.2.dylib" -#elif defined(__OpenBSD__) -# define PALIB "libportaudio.so" -#else -# define PALIB "libportaudio.so.2" -#endif - - pa_handle = LoadLib(PALIB); - if(!pa_handle) - return ALC_FALSE; - -#define LOAD_FUNC(f) do { \ - p##f = GetSymbol(pa_handle, #f); \ - if(p##f == NULL) \ - { \ - CloseLib(pa_handle); \ - pa_handle = NULL; \ - return ALC_FALSE; \ - } \ -} while(0) - LOAD_FUNC(Pa_Initialize); - LOAD_FUNC(Pa_Terminate); - LOAD_FUNC(Pa_GetErrorText); - LOAD_FUNC(Pa_StartStream); - LOAD_FUNC(Pa_StopStream); - LOAD_FUNC(Pa_OpenStream); - LOAD_FUNC(Pa_CloseStream); - LOAD_FUNC(Pa_GetDefaultOutputDevice); - LOAD_FUNC(Pa_GetDefaultInputDevice); - LOAD_FUNC(Pa_GetStreamInfo); -#undef LOAD_FUNC - - if((err=Pa_Initialize()) != paNoError) - { - ERR("Pa_Initialize() returned an error: %s\n", Pa_GetErrorText(err)); - CloseLib(pa_handle); - pa_handle = NULL; - return ALC_FALSE; - } - } -#else - if((err=Pa_Initialize()) != paNoError) - { - ERR("Pa_Initialize() returned an error: %s\n", Pa_GetErrorText(err)); - return ALC_FALSE; - } -#endif - return ALC_TRUE; -} - - -typedef struct ALCportPlayback { - DERIVE_FROM_TYPE(ALCbackend); - - PaStream *stream; - PaStreamParameters params; - ALuint update_size; -} ALCportPlayback; - -static int ALCportPlayback_WriteCallback(const void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, - const PaStreamCallbackFlags statusFlags, void *userData); - -static void ALCportPlayback_Construct(ALCportPlayback *self, ALCdevice *device); -static void ALCportPlayback_Destruct(ALCportPlayback *self); -static ALCenum ALCportPlayback_open(ALCportPlayback *self, const ALCchar *name); -static ALCboolean ALCportPlayback_reset(ALCportPlayback *self); -static ALCboolean ALCportPlayback_start(ALCportPlayback *self); -static void ALCportPlayback_stop(ALCportPlayback *self); -static DECLARE_FORWARD2(ALCportPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) -static DECLARE_FORWARD(ALCportPlayback, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCportPlayback, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCportPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCportPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCportPlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCportPlayback); - - -static void ALCportPlayback_Construct(ALCportPlayback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCportPlayback, ALCbackend, self); - - self->stream = NULL; -} - -static void ALCportPlayback_Destruct(ALCportPlayback *self) -{ - PaError err = self->stream ? Pa_CloseStream(self->stream) : paNoError; - if(err != paNoError) - ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); - self->stream = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCportPlayback_WriteCallback(const void *UNUSED(inputBuffer), void *outputBuffer, - unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *UNUSED(timeInfo), - const PaStreamCallbackFlags UNUSED(statusFlags), void *userData) -{ - ALCportPlayback *self = userData; - - ALCportPlayback_lock(self); - aluMixData(STATIC_CAST(ALCbackend, self)->mDevice, outputBuffer, framesPerBuffer); - ALCportPlayback_unlock(self); - return 0; -} - - -static ALCenum ALCportPlayback_open(ALCportPlayback *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - PaError err; - - if(!name) - name = pa_device; - else if(strcmp(name, pa_device) != 0) - return ALC_INVALID_VALUE; - - self->update_size = device->UpdateSize; - - self->params.device = -1; - if(!ConfigValueInt(NULL, "port", "device", &self->params.device) || - self->params.device < 0) - self->params.device = Pa_GetDefaultOutputDevice(); - self->params.suggestedLatency = (device->UpdateSize*device->NumUpdates) / - (float)device->Frequency; - self->params.hostApiSpecificStreamInfo = NULL; - - self->params.channelCount = ((device->FmtChans == DevFmtMono) ? 1 : 2); - - switch(device->FmtType) - { - case DevFmtByte: - self->params.sampleFormat = paInt8; - break; - case DevFmtUByte: - self->params.sampleFormat = paUInt8; - break; - case DevFmtUShort: - /* fall-through */ - case DevFmtShort: - self->params.sampleFormat = paInt16; - break; - case DevFmtUInt: - /* fall-through */ - case DevFmtInt: - self->params.sampleFormat = paInt32; - break; - case DevFmtFloat: - self->params.sampleFormat = paFloat32; - break; - } - -retry_open: - err = Pa_OpenStream(&self->stream, NULL, &self->params, - device->Frequency, device->UpdateSize, paNoFlag, - ALCportPlayback_WriteCallback, self - ); - if(err != paNoError) - { - if(self->params.sampleFormat == paFloat32) - { - self->params.sampleFormat = paInt16; - goto retry_open; - } - ERR("Pa_OpenStream() returned an error: %s\n", Pa_GetErrorText(err)); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; - -} - -static ALCboolean ALCportPlayback_reset(ALCportPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const PaStreamInfo *streamInfo; - - streamInfo = Pa_GetStreamInfo(self->stream); - device->Frequency = streamInfo->sampleRate; - device->UpdateSize = self->update_size; - - if(self->params.sampleFormat == paInt8) - device->FmtType = DevFmtByte; - else if(self->params.sampleFormat == paUInt8) - device->FmtType = DevFmtUByte; - else if(self->params.sampleFormat == paInt16) - device->FmtType = DevFmtShort; - else if(self->params.sampleFormat == paInt32) - device->FmtType = DevFmtInt; - else if(self->params.sampleFormat == paFloat32) - device->FmtType = DevFmtFloat; - else - { - ERR("Unexpected sample format: 0x%lx\n", self->params.sampleFormat); - return ALC_FALSE; - } - - if(self->params.channelCount == 2) - device->FmtChans = DevFmtStereo; - else if(self->params.channelCount == 1) - device->FmtChans = DevFmtMono; - else - { - ERR("Unexpected channel count: %u\n", self->params.channelCount); - return ALC_FALSE; - } - SetDefaultChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCportPlayback_start(ALCportPlayback *self) -{ - PaError err; - - err = Pa_StartStream(self->stream); - if(err != paNoError) - { - ERR("Pa_StartStream() returned an error: %s\n", Pa_GetErrorText(err)); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCportPlayback_stop(ALCportPlayback *self) -{ - PaError err = Pa_StopStream(self->stream); - if(err != paNoError) - ERR("Error stopping stream: %s\n", Pa_GetErrorText(err)); -} - - -typedef struct ALCportCapture { - DERIVE_FROM_TYPE(ALCbackend); - - PaStream *stream; - PaStreamParameters params; - - ll_ringbuffer_t *ring; -} ALCportCapture; - -static int ALCportCapture_ReadCallback(const void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, - const PaStreamCallbackFlags statusFlags, void *userData); - -static void ALCportCapture_Construct(ALCportCapture *self, ALCdevice *device); -static void ALCportCapture_Destruct(ALCportCapture *self); -static ALCenum ALCportCapture_open(ALCportCapture *self, const ALCchar *name); -static DECLARE_FORWARD(ALCportCapture, ALCbackend, ALCboolean, reset) -static ALCboolean ALCportCapture_start(ALCportCapture *self); -static void ALCportCapture_stop(ALCportCapture *self); -static ALCenum ALCportCapture_captureSamples(ALCportCapture *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCportCapture_availableSamples(ALCportCapture *self); -static DECLARE_FORWARD(ALCportCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCportCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCportCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCportCapture) - -DEFINE_ALCBACKEND_VTABLE(ALCportCapture); - - -static void ALCportCapture_Construct(ALCportCapture *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCportCapture, ALCbackend, self); - - self->stream = NULL; - self->ring = NULL; -} - -static void ALCportCapture_Destruct(ALCportCapture *self) -{ - PaError err = self->stream ? Pa_CloseStream(self->stream) : paNoError; - if(err != paNoError) - ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); - self->stream = NULL; - - ll_ringbuffer_free(self->ring); - self->ring = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCportCapture_ReadCallback(const void *inputBuffer, void *UNUSED(outputBuffer), - unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *UNUSED(timeInfo), - const PaStreamCallbackFlags UNUSED(statusFlags), void *userData) -{ - ALCportCapture *self = userData; - size_t writable = ll_ringbuffer_write_space(self->ring); - - if(framesPerBuffer > writable) - framesPerBuffer = writable; - ll_ringbuffer_write(self->ring, inputBuffer, framesPerBuffer); - return 0; -} - - -static ALCenum ALCportCapture_open(ALCportCapture *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALuint samples, frame_size; - PaError err; - - if(!name) - name = pa_device; - else if(strcmp(name, pa_device) != 0) - return ALC_INVALID_VALUE; - - samples = device->UpdateSize * device->NumUpdates; - samples = maxu(samples, 100 * device->Frequency / 1000); - frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - self->ring = ll_ringbuffer_create(samples, frame_size, false); - if(self->ring == NULL) return ALC_INVALID_VALUE; - - self->params.device = -1; - if(!ConfigValueInt(NULL, "port", "capture", &self->params.device) || - self->params.device < 0) - self->params.device = Pa_GetDefaultInputDevice(); - self->params.suggestedLatency = 0.0f; - self->params.hostApiSpecificStreamInfo = NULL; - - switch(device->FmtType) - { - case DevFmtByte: - self->params.sampleFormat = paInt8; - break; - case DevFmtUByte: - self->params.sampleFormat = paUInt8; - break; - case DevFmtShort: - self->params.sampleFormat = paInt16; - break; - case DevFmtInt: - self->params.sampleFormat = paInt32; - break; - case DevFmtFloat: - self->params.sampleFormat = paFloat32; - break; - case DevFmtUInt: - case DevFmtUShort: - ERR("%s samples not supported\n", DevFmtTypeString(device->FmtType)); - return ALC_INVALID_VALUE; - } - self->params.channelCount = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - - err = Pa_OpenStream(&self->stream, &self->params, NULL, - device->Frequency, paFramesPerBufferUnspecified, paNoFlag, - ALCportCapture_ReadCallback, self - ); - if(err != paNoError) - { - ERR("Pa_OpenStream() returned an error: %s\n", Pa_GetErrorText(err)); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - - -static ALCboolean ALCportCapture_start(ALCportCapture *self) -{ - PaError err = Pa_StartStream(self->stream); - if(err != paNoError) - { - ERR("Error starting stream: %s\n", Pa_GetErrorText(err)); - return ALC_FALSE; - } - return ALC_TRUE; -} - -static void ALCportCapture_stop(ALCportCapture *self) -{ - PaError err = Pa_StopStream(self->stream); - if(err != paNoError) - ERR("Error stopping stream: %s\n", Pa_GetErrorText(err)); -} - - -static ALCuint ALCportCapture_availableSamples(ALCportCapture *self) -{ - return ll_ringbuffer_read_space(self->ring); -} - -static ALCenum ALCportCapture_captureSamples(ALCportCapture *self, ALCvoid *buffer, ALCuint samples) -{ - ll_ringbuffer_read(self->ring, buffer, samples); - return ALC_NO_ERROR; -} - - -typedef struct ALCportBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCportBackendFactory; -#define ALCPORTBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCportBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCportBackendFactory_init(ALCportBackendFactory *self); -static void ALCportBackendFactory_deinit(ALCportBackendFactory *self); -static ALCboolean ALCportBackendFactory_querySupport(ALCportBackendFactory *self, ALCbackend_Type type); -static void ALCportBackendFactory_probe(ALCportBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCportBackendFactory_createBackend(ALCportBackendFactory *self, ALCdevice *device, ALCbackend_Type type); - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCportBackendFactory); - - -static ALCboolean ALCportBackendFactory_init(ALCportBackendFactory* UNUSED(self)) -{ - if(!pa_load()) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCportBackendFactory_deinit(ALCportBackendFactory* UNUSED(self)) -{ -#ifdef HAVE_DYNLOAD - if(pa_handle) - { - Pa_Terminate(); - CloseLib(pa_handle); - pa_handle = NULL; - } -#else - Pa_Terminate(); -#endif -} - -static ALCboolean ALCportBackendFactory_querySupport(ALCportBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCportBackendFactory_probe(ALCportBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(pa_device); - break; - case CAPTURE_DEVICE_PROBE: - AppendCaptureDeviceList(pa_device); - break; - } -} - -static ALCbackend* ALCportBackendFactory_createBackend(ALCportBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCportPlayback *backend; - NEW_OBJ(backend, ALCportPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCportCapture *backend; - NEW_OBJ(backend, ALCportCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - -ALCbackendFactory *ALCportBackendFactory_getFactory(void) -{ - static ALCportBackendFactory factory = ALCPORTBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/backends/pulseaudio.c b/Alc/backends/pulseaudio.c deleted file mode 100644 index 74d1a14..0000000 --- a/Alc/backends/pulseaudio.c +++ /dev/null @@ -1,1919 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2009 by Konstantinos Natsakis - * Copyright (C) 2010 by Chris Robinson - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - -#include - -#if PA_API_VERSION == 12 - -#ifdef HAVE_DYNLOAD -static void *pa_handle; -#define MAKE_FUNC(x) static __typeof(x) * p##x -MAKE_FUNC(pa_context_unref); -MAKE_FUNC(pa_sample_spec_valid); -MAKE_FUNC(pa_frame_size); -MAKE_FUNC(pa_stream_drop); -MAKE_FUNC(pa_strerror); -MAKE_FUNC(pa_context_get_state); -MAKE_FUNC(pa_stream_get_state); -MAKE_FUNC(pa_threaded_mainloop_signal); -MAKE_FUNC(pa_stream_peek); -MAKE_FUNC(pa_threaded_mainloop_wait); -MAKE_FUNC(pa_threaded_mainloop_unlock); -MAKE_FUNC(pa_threaded_mainloop_in_thread); -MAKE_FUNC(pa_context_new); -MAKE_FUNC(pa_threaded_mainloop_stop); -MAKE_FUNC(pa_context_disconnect); -MAKE_FUNC(pa_threaded_mainloop_start); -MAKE_FUNC(pa_threaded_mainloop_get_api); -MAKE_FUNC(pa_context_set_state_callback); -MAKE_FUNC(pa_stream_write); -MAKE_FUNC(pa_xfree); -MAKE_FUNC(pa_stream_connect_record); -MAKE_FUNC(pa_stream_connect_playback); -MAKE_FUNC(pa_stream_readable_size); -MAKE_FUNC(pa_stream_writable_size); -MAKE_FUNC(pa_stream_is_corked); -MAKE_FUNC(pa_stream_cork); -MAKE_FUNC(pa_stream_is_suspended); -MAKE_FUNC(pa_stream_get_device_name); -MAKE_FUNC(pa_stream_get_latency); -MAKE_FUNC(pa_path_get_filename); -MAKE_FUNC(pa_get_binary_name); -MAKE_FUNC(pa_threaded_mainloop_free); -MAKE_FUNC(pa_context_errno); -MAKE_FUNC(pa_xmalloc); -MAKE_FUNC(pa_stream_unref); -MAKE_FUNC(pa_threaded_mainloop_accept); -MAKE_FUNC(pa_stream_set_write_callback); -MAKE_FUNC(pa_threaded_mainloop_new); -MAKE_FUNC(pa_context_connect); -MAKE_FUNC(pa_stream_set_buffer_attr); -MAKE_FUNC(pa_stream_get_buffer_attr); -MAKE_FUNC(pa_stream_get_sample_spec); -MAKE_FUNC(pa_stream_get_time); -MAKE_FUNC(pa_stream_set_read_callback); -MAKE_FUNC(pa_stream_set_state_callback); -MAKE_FUNC(pa_stream_set_moved_callback); -MAKE_FUNC(pa_stream_set_underflow_callback); -MAKE_FUNC(pa_stream_new_with_proplist); -MAKE_FUNC(pa_stream_disconnect); -MAKE_FUNC(pa_threaded_mainloop_lock); -MAKE_FUNC(pa_channel_map_init_auto); -MAKE_FUNC(pa_channel_map_parse); -MAKE_FUNC(pa_channel_map_snprint); -MAKE_FUNC(pa_channel_map_equal); -MAKE_FUNC(pa_context_get_server_info); -MAKE_FUNC(pa_context_get_sink_info_by_name); -MAKE_FUNC(pa_context_get_sink_info_list); -MAKE_FUNC(pa_context_get_source_info_by_name); -MAKE_FUNC(pa_context_get_source_info_list); -MAKE_FUNC(pa_operation_get_state); -MAKE_FUNC(pa_operation_unref); -MAKE_FUNC(pa_proplist_new); -MAKE_FUNC(pa_proplist_free); -MAKE_FUNC(pa_proplist_set); -MAKE_FUNC(pa_channel_map_superset); -MAKE_FUNC(pa_stream_set_buffer_attr_callback); -MAKE_FUNC(pa_stream_begin_write); -#undef MAKE_FUNC - -#define pa_context_unref ppa_context_unref -#define pa_sample_spec_valid ppa_sample_spec_valid -#define pa_frame_size ppa_frame_size -#define pa_stream_drop ppa_stream_drop -#define pa_strerror ppa_strerror -#define pa_context_get_state ppa_context_get_state -#define pa_stream_get_state ppa_stream_get_state -#define pa_threaded_mainloop_signal ppa_threaded_mainloop_signal -#define pa_stream_peek ppa_stream_peek -#define pa_threaded_mainloop_wait ppa_threaded_mainloop_wait -#define pa_threaded_mainloop_unlock ppa_threaded_mainloop_unlock -#define pa_threaded_mainloop_in_thread ppa_threaded_mainloop_in_thread -#define pa_context_new ppa_context_new -#define pa_threaded_mainloop_stop ppa_threaded_mainloop_stop -#define pa_context_disconnect ppa_context_disconnect -#define pa_threaded_mainloop_start ppa_threaded_mainloop_start -#define pa_threaded_mainloop_get_api ppa_threaded_mainloop_get_api -#define pa_context_set_state_callback ppa_context_set_state_callback -#define pa_stream_write ppa_stream_write -#define pa_xfree ppa_xfree -#define pa_stream_connect_record ppa_stream_connect_record -#define pa_stream_connect_playback ppa_stream_connect_playback -#define pa_stream_readable_size ppa_stream_readable_size -#define pa_stream_writable_size ppa_stream_writable_size -#define pa_stream_is_corked ppa_stream_is_corked -#define pa_stream_cork ppa_stream_cork -#define pa_stream_is_suspended ppa_stream_is_suspended -#define pa_stream_get_device_name ppa_stream_get_device_name -#define pa_stream_get_latency ppa_stream_get_latency -#define pa_path_get_filename ppa_path_get_filename -#define pa_get_binary_name ppa_get_binary_name -#define pa_threaded_mainloop_free ppa_threaded_mainloop_free -#define pa_context_errno ppa_context_errno -#define pa_xmalloc ppa_xmalloc -#define pa_stream_unref ppa_stream_unref -#define pa_threaded_mainloop_accept ppa_threaded_mainloop_accept -#define pa_stream_set_write_callback ppa_stream_set_write_callback -#define pa_threaded_mainloop_new ppa_threaded_mainloop_new -#define pa_context_connect ppa_context_connect -#define pa_stream_set_buffer_attr ppa_stream_set_buffer_attr -#define pa_stream_get_buffer_attr ppa_stream_get_buffer_attr -#define pa_stream_get_sample_spec ppa_stream_get_sample_spec -#define pa_stream_get_time ppa_stream_get_time -#define pa_stream_set_read_callback ppa_stream_set_read_callback -#define pa_stream_set_state_callback ppa_stream_set_state_callback -#define pa_stream_set_moved_callback ppa_stream_set_moved_callback -#define pa_stream_set_underflow_callback ppa_stream_set_underflow_callback -#define pa_stream_new_with_proplist ppa_stream_new_with_proplist -#define pa_stream_disconnect ppa_stream_disconnect -#define pa_threaded_mainloop_lock ppa_threaded_mainloop_lock -#define pa_channel_map_init_auto ppa_channel_map_init_auto -#define pa_channel_map_parse ppa_channel_map_parse -#define pa_channel_map_snprint ppa_channel_map_snprint -#define pa_channel_map_equal ppa_channel_map_equal -#define pa_context_get_server_info ppa_context_get_server_info -#define pa_context_get_sink_info_by_name ppa_context_get_sink_info_by_name -#define pa_context_get_sink_info_list ppa_context_get_sink_info_list -#define pa_context_get_source_info_by_name ppa_context_get_source_info_by_name -#define pa_context_get_source_info_list ppa_context_get_source_info_list -#define pa_operation_get_state ppa_operation_get_state -#define pa_operation_unref ppa_operation_unref -#define pa_proplist_new ppa_proplist_new -#define pa_proplist_free ppa_proplist_free -#define pa_proplist_set ppa_proplist_set -#define pa_channel_map_superset ppa_channel_map_superset -#define pa_stream_set_buffer_attr_callback ppa_stream_set_buffer_attr_callback -#define pa_stream_begin_write ppa_stream_begin_write - -#endif - -static ALCboolean pulse_load(void) -{ - ALCboolean ret = ALC_TRUE; -#ifdef HAVE_DYNLOAD - if(!pa_handle) - { - al_string missing_funcs = AL_STRING_INIT_STATIC(); - -#ifdef _WIN32 -#define PALIB "libpulse-0.dll" -#elif defined(__APPLE__) && defined(__MACH__) -#define PALIB "libpulse.0.dylib" -#else -#define PALIB "libpulse.so.0" -#endif - pa_handle = LoadLib(PALIB); - if(!pa_handle) - { - WARN("Failed to load %s\n", PALIB); - return ALC_FALSE; - } - -#define LOAD_FUNC(x) do { \ - p##x = GetSymbol(pa_handle, #x); \ - if(!(p##x)) { \ - ret = ALC_FALSE; \ - alstr_append_cstr(&missing_funcs, "\n" #x); \ - } \ -} while(0) - LOAD_FUNC(pa_context_unref); - LOAD_FUNC(pa_sample_spec_valid); - LOAD_FUNC(pa_stream_drop); - LOAD_FUNC(pa_frame_size); - LOAD_FUNC(pa_strerror); - LOAD_FUNC(pa_context_get_state); - LOAD_FUNC(pa_stream_get_state); - LOAD_FUNC(pa_threaded_mainloop_signal); - LOAD_FUNC(pa_stream_peek); - LOAD_FUNC(pa_threaded_mainloop_wait); - LOAD_FUNC(pa_threaded_mainloop_unlock); - LOAD_FUNC(pa_threaded_mainloop_in_thread); - LOAD_FUNC(pa_context_new); - LOAD_FUNC(pa_threaded_mainloop_stop); - LOAD_FUNC(pa_context_disconnect); - LOAD_FUNC(pa_threaded_mainloop_start); - LOAD_FUNC(pa_threaded_mainloop_get_api); - LOAD_FUNC(pa_context_set_state_callback); - LOAD_FUNC(pa_stream_write); - LOAD_FUNC(pa_xfree); - LOAD_FUNC(pa_stream_connect_record); - LOAD_FUNC(pa_stream_connect_playback); - LOAD_FUNC(pa_stream_readable_size); - LOAD_FUNC(pa_stream_writable_size); - LOAD_FUNC(pa_stream_is_corked); - LOAD_FUNC(pa_stream_cork); - LOAD_FUNC(pa_stream_is_suspended); - LOAD_FUNC(pa_stream_get_device_name); - LOAD_FUNC(pa_stream_get_latency); - LOAD_FUNC(pa_path_get_filename); - LOAD_FUNC(pa_get_binary_name); - LOAD_FUNC(pa_threaded_mainloop_free); - LOAD_FUNC(pa_context_errno); - LOAD_FUNC(pa_xmalloc); - LOAD_FUNC(pa_stream_unref); - LOAD_FUNC(pa_threaded_mainloop_accept); - LOAD_FUNC(pa_stream_set_write_callback); - LOAD_FUNC(pa_threaded_mainloop_new); - LOAD_FUNC(pa_context_connect); - LOAD_FUNC(pa_stream_set_buffer_attr); - LOAD_FUNC(pa_stream_get_buffer_attr); - LOAD_FUNC(pa_stream_get_sample_spec); - LOAD_FUNC(pa_stream_get_time); - LOAD_FUNC(pa_stream_set_read_callback); - LOAD_FUNC(pa_stream_set_state_callback); - LOAD_FUNC(pa_stream_set_moved_callback); - LOAD_FUNC(pa_stream_set_underflow_callback); - LOAD_FUNC(pa_stream_new_with_proplist); - LOAD_FUNC(pa_stream_disconnect); - LOAD_FUNC(pa_threaded_mainloop_lock); - LOAD_FUNC(pa_channel_map_init_auto); - LOAD_FUNC(pa_channel_map_parse); - LOAD_FUNC(pa_channel_map_snprint); - LOAD_FUNC(pa_channel_map_equal); - LOAD_FUNC(pa_context_get_server_info); - LOAD_FUNC(pa_context_get_sink_info_by_name); - LOAD_FUNC(pa_context_get_sink_info_list); - LOAD_FUNC(pa_context_get_source_info_by_name); - LOAD_FUNC(pa_context_get_source_info_list); - LOAD_FUNC(pa_operation_get_state); - LOAD_FUNC(pa_operation_unref); - LOAD_FUNC(pa_proplist_new); - LOAD_FUNC(pa_proplist_free); - LOAD_FUNC(pa_proplist_set); - LOAD_FUNC(pa_channel_map_superset); - LOAD_FUNC(pa_stream_set_buffer_attr_callback); - LOAD_FUNC(pa_stream_begin_write); -#undef LOAD_FUNC - - if(ret == ALC_FALSE) - { - WARN("Missing expected functions:%s\n", alstr_get_cstr(missing_funcs)); - CloseLib(pa_handle); - pa_handle = NULL; - } - alstr_reset(&missing_funcs); - } -#endif /* HAVE_DYNLOAD */ - return ret; -} - - -/* Global flags and properties */ -static pa_context_flags_t pulse_ctx_flags; -static pa_proplist *prop_filter; - - -/* PulseAudio Event Callbacks */ -static void context_state_callback(pa_context *context, void *pdata) -{ - pa_threaded_mainloop *loop = pdata; - pa_context_state_t state; - - state = pa_context_get_state(context); - if(state == PA_CONTEXT_READY || !PA_CONTEXT_IS_GOOD(state)) - pa_threaded_mainloop_signal(loop, 0); -} - -static void stream_state_callback(pa_stream *stream, void *pdata) -{ - pa_threaded_mainloop *loop = pdata; - pa_stream_state_t state; - - state = pa_stream_get_state(stream); - if(state == PA_STREAM_READY || !PA_STREAM_IS_GOOD(state)) - pa_threaded_mainloop_signal(loop, 0); -} - -static void stream_success_callback(pa_stream *UNUSED(stream), int UNUSED(success), void *pdata) -{ - pa_threaded_mainloop *loop = pdata; - pa_threaded_mainloop_signal(loop, 0); -} - -static void wait_for_operation(pa_operation *op, pa_threaded_mainloop *loop) -{ - if(op) - { - while(pa_operation_get_state(op) == PA_OPERATION_RUNNING) - pa_threaded_mainloop_wait(loop); - pa_operation_unref(op); - } -} - - -static pa_context *connect_context(pa_threaded_mainloop *loop, ALboolean silent) -{ - const char *name = "OpenAL Soft"; - al_string binname = AL_STRING_INIT_STATIC(); - pa_context_state_t state; - pa_context *context; - int err; - - GetProcBinary(NULL, &binname); - if(!alstr_empty(binname)) - name = alstr_get_cstr(binname); - - context = pa_context_new(pa_threaded_mainloop_get_api(loop), name); - if(!context) - { - ERR("pa_context_new() failed\n"); - alstr_reset(&binname); - return NULL; - } - - pa_context_set_state_callback(context, context_state_callback, loop); - - if((err=pa_context_connect(context, NULL, pulse_ctx_flags, NULL)) >= 0) - { - while((state=pa_context_get_state(context)) != PA_CONTEXT_READY) - { - if(!PA_CONTEXT_IS_GOOD(state)) - { - err = pa_context_errno(context); - if(err > 0) err = -err; - break; - } - - pa_threaded_mainloop_wait(loop); - } - } - pa_context_set_state_callback(context, NULL, NULL); - - if(err < 0) - { - if(!silent) - ERR("Context did not connect: %s\n", pa_strerror(err)); - pa_context_unref(context); - context = NULL; - } - - alstr_reset(&binname); - return context; -} - - -static ALCboolean pulse_open(pa_threaded_mainloop **loop, pa_context **context, - void(*state_cb)(pa_context*,void*), void *ptr) -{ - if(!(*loop = pa_threaded_mainloop_new())) - { - ERR("pa_threaded_mainloop_new() failed!\n"); - return ALC_FALSE; - } - if(pa_threaded_mainloop_start(*loop) < 0) - { - ERR("pa_threaded_mainloop_start() failed\n"); - goto error; - } - - pa_threaded_mainloop_lock(*loop); - - *context = connect_context(*loop, AL_FALSE); - if(!*context) - { - pa_threaded_mainloop_unlock(*loop); - pa_threaded_mainloop_stop(*loop); - goto error; - } - pa_context_set_state_callback(*context, state_cb, ptr); - - pa_threaded_mainloop_unlock(*loop); - return ALC_TRUE; - -error: - pa_threaded_mainloop_free(*loop); - *loop = NULL; - - return ALC_FALSE; -} - -static void pulse_close(pa_threaded_mainloop *loop, pa_context *context, pa_stream *stream) -{ - pa_threaded_mainloop_lock(loop); - - if(stream) - { - pa_stream_set_state_callback(stream, NULL, NULL); - pa_stream_set_moved_callback(stream, NULL, NULL); - pa_stream_set_write_callback(stream, NULL, NULL); - pa_stream_set_buffer_attr_callback(stream, NULL, NULL); - pa_stream_disconnect(stream); - pa_stream_unref(stream); - } - - pa_context_disconnect(context); - pa_context_unref(context); - - pa_threaded_mainloop_unlock(loop); - - pa_threaded_mainloop_stop(loop); - pa_threaded_mainloop_free(loop); -} - - -typedef struct { - al_string name; - al_string device_name; -} DevMap; -TYPEDEF_VECTOR(DevMap, vector_DevMap) - -static vector_DevMap PlaybackDevices; -static vector_DevMap CaptureDevices; - -static void clear_devlist(vector_DevMap *list) -{ -#define DEINIT_STRS(i) (AL_STRING_DEINIT((i)->name),AL_STRING_DEINIT((i)->device_name)) - VECTOR_FOR_EACH(DevMap, *list, DEINIT_STRS); -#undef DEINIT_STRS - VECTOR_RESIZE(*list, 0, 0); -} - - -typedef struct ALCpulsePlayback { - DERIVE_FROM_TYPE(ALCbackend); - - al_string device_name; - - pa_buffer_attr attr; - pa_sample_spec spec; - - pa_threaded_mainloop *loop; - - pa_stream *stream; - pa_context *context; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCpulsePlayback; - -static void ALCpulsePlayback_deviceCallback(pa_context *context, const pa_sink_info *info, int eol, void *pdata); -static void ALCpulsePlayback_probeDevices(void); - -static void ALCpulsePlayback_bufferAttrCallback(pa_stream *stream, void *pdata); -static void ALCpulsePlayback_contextStateCallback(pa_context *context, void *pdata); -static void ALCpulsePlayback_streamStateCallback(pa_stream *stream, void *pdata); -static void ALCpulsePlayback_streamWriteCallback(pa_stream *p, size_t nbytes, void *userdata); -static void ALCpulsePlayback_sinkInfoCallback(pa_context *context, const pa_sink_info *info, int eol, void *pdata); -static void ALCpulsePlayback_sinkNameCallback(pa_context *context, const pa_sink_info *info, int eol, void *pdata); -static void ALCpulsePlayback_streamMovedCallback(pa_stream *stream, void *pdata); -static pa_stream *ALCpulsePlayback_connectStream(const char *device_name, pa_threaded_mainloop *loop, - pa_context *context, pa_stream_flags_t flags, - pa_buffer_attr *attr, pa_sample_spec *spec, - pa_channel_map *chanmap); -static int ALCpulsePlayback_mixerProc(void *ptr); - -static void ALCpulsePlayback_Construct(ALCpulsePlayback *self, ALCdevice *device); -static void ALCpulsePlayback_Destruct(ALCpulsePlayback *self); -static ALCenum ALCpulsePlayback_open(ALCpulsePlayback *self, const ALCchar *name); -static ALCboolean ALCpulsePlayback_reset(ALCpulsePlayback *self); -static ALCboolean ALCpulsePlayback_start(ALCpulsePlayback *self); -static void ALCpulsePlayback_stop(ALCpulsePlayback *self); -static DECLARE_FORWARD2(ALCpulsePlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) -static DECLARE_FORWARD(ALCpulsePlayback, ALCbackend, ALCuint, availableSamples) -static ClockLatency ALCpulsePlayback_getClockLatency(ALCpulsePlayback *self); -static void ALCpulsePlayback_lock(ALCpulsePlayback *self); -static void ALCpulsePlayback_unlock(ALCpulsePlayback *self); -DECLARE_DEFAULT_ALLOCATORS(ALCpulsePlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCpulsePlayback); - - -static void ALCpulsePlayback_Construct(ALCpulsePlayback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCpulsePlayback, ALCbackend, self); - - self->loop = NULL; - AL_STRING_INIT(self->device_name); - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCpulsePlayback_Destruct(ALCpulsePlayback *self) -{ - if(self->loop) - { - pulse_close(self->loop, self->context, self->stream); - self->loop = NULL; - self->context = NULL; - self->stream = NULL; - } - AL_STRING_DEINIT(self->device_name); - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static void ALCpulsePlayback_deviceCallback(pa_context *UNUSED(context), const pa_sink_info *info, int eol, void *pdata) -{ - pa_threaded_mainloop *loop = pdata; - const DevMap *iter; - DevMap entry; - int count; - - if(eol) - { - pa_threaded_mainloop_signal(loop, 0); - return; - } - -#define MATCH_INFO_NAME(iter) (alstr_cmp_cstr((iter)->device_name, info->name) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_INFO_NAME); - if(iter != VECTOR_END(PlaybackDevices)) return; -#undef MATCH_INFO_NAME - - AL_STRING_INIT(entry.name); - AL_STRING_INIT(entry.device_name); - - alstr_copy_cstr(&entry.device_name, info->name); - - count = 0; - while(1) - { - alstr_copy_cstr(&entry.name, info->description); - if(count != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", count+1); - alstr_append_cstr(&entry.name, str); - } - -#define MATCH_ENTRY(i) (alstr_cmp(entry.name, (i)->name) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_ENTRY); - if(iter == VECTOR_END(PlaybackDevices)) break; -#undef MATCH_ENTRY - count++; - } - - TRACE("Got device \"%s\", \"%s\"\n", alstr_get_cstr(entry.name), alstr_get_cstr(entry.device_name)); - - VECTOR_PUSH_BACK(PlaybackDevices, entry); -} - -static void ALCpulsePlayback_probeDevices(void) -{ - pa_threaded_mainloop *loop; - - clear_devlist(&PlaybackDevices); - - if((loop=pa_threaded_mainloop_new()) && - pa_threaded_mainloop_start(loop) >= 0) - { - pa_context *context; - - pa_threaded_mainloop_lock(loop); - context = connect_context(loop, AL_FALSE); - if(context) - { - pa_operation *o; - pa_stream_flags_t flags; - pa_sample_spec spec; - pa_stream *stream; - - flags = PA_STREAM_FIX_FORMAT | PA_STREAM_FIX_RATE | - PA_STREAM_FIX_CHANNELS | PA_STREAM_DONT_MOVE; - - spec.format = PA_SAMPLE_S16NE; - spec.rate = 44100; - spec.channels = 2; - - stream = ALCpulsePlayback_connectStream(NULL, loop, context, flags, - NULL, &spec, NULL); - if(stream) - { - o = pa_context_get_sink_info_by_name(context, pa_stream_get_device_name(stream), - ALCpulsePlayback_deviceCallback, loop); - wait_for_operation(o, loop); - - pa_stream_disconnect(stream); - pa_stream_unref(stream); - stream = NULL; - } - - o = pa_context_get_sink_info_list(context, ALCpulsePlayback_deviceCallback, loop); - wait_for_operation(o, loop); - - pa_context_disconnect(context); - pa_context_unref(context); - } - pa_threaded_mainloop_unlock(loop); - pa_threaded_mainloop_stop(loop); - } - if(loop) - pa_threaded_mainloop_free(loop); -} - - -static void ALCpulsePlayback_bufferAttrCallback(pa_stream *stream, void *pdata) -{ - ALCpulsePlayback *self = pdata; - - self->attr = *pa_stream_get_buffer_attr(stream); - TRACE("minreq=%d, tlength=%d, prebuf=%d\n", self->attr.minreq, self->attr.tlength, self->attr.prebuf); - /* FIXME: Update the device's UpdateSize (and/or NumUpdates) using the new - * buffer attributes? Changing UpdateSize will change the ALC_REFRESH - * property, which probably shouldn't change between device resets. But - * leaving it alone means ALC_REFRESH will be off. - */ -} - -static void ALCpulsePlayback_contextStateCallback(pa_context *context, void *pdata) -{ - ALCpulsePlayback *self = pdata; - if(pa_context_get_state(context) == PA_CONTEXT_FAILED) - { - ERR("Received context failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Playback state failure"); - } - pa_threaded_mainloop_signal(self->loop, 0); -} - -static void ALCpulsePlayback_streamStateCallback(pa_stream *stream, void *pdata) -{ - ALCpulsePlayback *self = pdata; - if(pa_stream_get_state(stream) == PA_STREAM_FAILED) - { - ERR("Received stream failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Playback stream failure"); - } - pa_threaded_mainloop_signal(self->loop, 0); -} - -static void ALCpulsePlayback_streamWriteCallback(pa_stream* UNUSED(p), size_t UNUSED(nbytes), void *pdata) -{ - ALCpulsePlayback *self = pdata; - pa_threaded_mainloop_signal(self->loop, 0); -} - -static void ALCpulsePlayback_sinkInfoCallback(pa_context *UNUSED(context), const pa_sink_info *info, int eol, void *pdata) -{ - static const struct { - enum DevFmtChannels chans; - pa_channel_map map; - } chanmaps[] = { - { DevFmtX71, { 8, { - PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, - PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, - PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, - PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT - } } }, - { DevFmtX61, { 7, { - PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, - PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, - PA_CHANNEL_POSITION_REAR_CENTER, - PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT - } } }, - { DevFmtX51, { 6, { - PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, - PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, - PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT - } } }, - { DevFmtX51Rear, { 6, { - PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, - PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, - PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT - } } }, - { DevFmtQuad, { 4, { - PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, - PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT - } } }, - { DevFmtStereo, { 2, { - PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT - } } }, - { DevFmtMono, { 1, {PA_CHANNEL_POSITION_MONO} } } - }; - ALCpulsePlayback *self = pdata; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - size_t i; - - if(eol) - { - pa_threaded_mainloop_signal(self->loop, 0); - return; - } - - for(i = 0;i < COUNTOF(chanmaps);i++) - { - if(pa_channel_map_superset(&info->channel_map, &chanmaps[i].map)) - { - if(!(device->Flags&DEVICE_CHANNELS_REQUEST)) - device->FmtChans = chanmaps[i].chans; - break; - } - } - if(i == COUNTOF(chanmaps)) - { - char chanmap_str[PA_CHANNEL_MAP_SNPRINT_MAX] = ""; - pa_channel_map_snprint(chanmap_str, sizeof(chanmap_str), &info->channel_map); - WARN("Failed to find format for channel map:\n %s\n", chanmap_str); - } - - if(info->active_port) - TRACE("Active port: %s (%s)\n", info->active_port->name, info->active_port->description); - device->IsHeadphones = (info->active_port && - strcmp(info->active_port->name, "analog-output-headphones") == 0 && - device->FmtChans == DevFmtStereo); -} - -static void ALCpulsePlayback_sinkNameCallback(pa_context *UNUSED(context), const pa_sink_info *info, int eol, void *pdata) -{ - ALCpulsePlayback *self = pdata; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - if(eol) - { - pa_threaded_mainloop_signal(self->loop, 0); - return; - } - - alstr_copy_cstr(&device->DeviceName, info->description); -} - - -static void ALCpulsePlayback_streamMovedCallback(pa_stream *stream, void *pdata) -{ - ALCpulsePlayback *self = pdata; - - alstr_copy_cstr(&self->device_name, pa_stream_get_device_name(stream)); - - TRACE("Stream moved to %s\n", alstr_get_cstr(self->device_name)); -} - - -static pa_stream *ALCpulsePlayback_connectStream(const char *device_name, - pa_threaded_mainloop *loop, pa_context *context, - pa_stream_flags_t flags, pa_buffer_attr *attr, pa_sample_spec *spec, - pa_channel_map *chanmap) -{ - pa_stream_state_t state; - pa_stream *stream; - - if(!device_name) - { - device_name = getenv("ALSOFT_PULSE_DEFAULT"); - if(device_name && !device_name[0]) - device_name = NULL; - } - - stream = pa_stream_new_with_proplist(context, "Playback Stream", spec, chanmap, prop_filter); - if(!stream) - { - ERR("pa_stream_new_with_proplist() failed: %s\n", pa_strerror(pa_context_errno(context))); - return NULL; - } - - pa_stream_set_state_callback(stream, stream_state_callback, loop); - - if(pa_stream_connect_playback(stream, device_name, attr, flags, NULL, NULL) < 0) - { - ERR("Stream did not connect: %s\n", pa_strerror(pa_context_errno(context))); - pa_stream_unref(stream); - return NULL; - } - - while((state=pa_stream_get_state(stream)) != PA_STREAM_READY) - { - if(!PA_STREAM_IS_GOOD(state)) - { - ERR("Stream did not get ready: %s\n", pa_strerror(pa_context_errno(context))); - pa_stream_unref(stream); - return NULL; - } - - pa_threaded_mainloop_wait(loop); - } - pa_stream_set_state_callback(stream, NULL, NULL); - - return stream; -} - - -static int ALCpulsePlayback_mixerProc(void *ptr) -{ - ALCpulsePlayback *self = ptr; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - ALuint buffer_size; - size_t frame_size; - ssize_t len; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - pa_threaded_mainloop_lock(self->loop); - frame_size = pa_frame_size(&self->spec); - - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - void *buf; - int ret; - - len = pa_stream_writable_size(self->stream); - if(len < 0) - { - ERR("Failed to get writable size: %ld", (long)len); - aluHandleDisconnect(device, "Failed to get writable size: %ld", (long)len); - break; - } - - /* Make sure we're going to write at least 2 'periods' (minreqs), in - * case the server increased it since starting playback. Also round up - * the number of writable periods if it's not an integer count. - */ - buffer_size = maxu((self->attr.tlength + self->attr.minreq/2) / self->attr.minreq, 2) * - self->attr.minreq; - - /* NOTE: This assumes pa_stream_writable_size returns between 0 and - * tlength, else there will be more latency than intended. - */ - len = mini(len - (ssize_t)self->attr.tlength, 0) + buffer_size; - if(len < (int32_t)self->attr.minreq) - { - if(pa_stream_is_corked(self->stream)) - { - pa_operation *o; - o = pa_stream_cork(self->stream, 0, NULL, NULL); - if(o) pa_operation_unref(o); - } - pa_threaded_mainloop_wait(self->loop); - continue; - } - - len -= len%self->attr.minreq; - len -= len%frame_size; - - buf = pa_xmalloc(len); - - aluMixData(device, buf, len/frame_size); - - ret = pa_stream_write(self->stream, buf, len, pa_xfree, 0, PA_SEEK_RELATIVE); - if(ret != PA_OK) ERR("Failed to write to stream: %d, %s\n", ret, pa_strerror(ret)); - } - pa_threaded_mainloop_unlock(self->loop); - - return 0; -} - - -static ALCenum ALCpulsePlayback_open(ALCpulsePlayback *self, const ALCchar *name) -{ - const_al_string dev_name = AL_STRING_INIT_STATIC(); - const char *pulse_name = NULL; - pa_stream_flags_t flags; - pa_sample_spec spec; - - if(name) - { - const DevMap *iter; - - if(VECTOR_SIZE(PlaybackDevices) == 0) - ALCpulsePlayback_probeDevices(); - -#define MATCH_NAME(iter) (alstr_cmp_cstr((iter)->name, name) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(PlaybackDevices)) - return ALC_INVALID_VALUE; - pulse_name = alstr_get_cstr(iter->device_name); - dev_name = iter->name; - } - - if(!pulse_open(&self->loop, &self->context, ALCpulsePlayback_contextStateCallback, self)) - return ALC_INVALID_VALUE; - - pa_threaded_mainloop_lock(self->loop); - - flags = PA_STREAM_FIX_FORMAT | PA_STREAM_FIX_RATE | - PA_STREAM_FIX_CHANNELS; - if(!GetConfigValueBool(NULL, "pulse", "allow-moves", 0)) - flags |= PA_STREAM_DONT_MOVE; - - spec.format = PA_SAMPLE_S16NE; - spec.rate = 44100; - spec.channels = 2; - - TRACE("Connecting to \"%s\"\n", pulse_name ? pulse_name : "(default)"); - self->stream = ALCpulsePlayback_connectStream(pulse_name, self->loop, self->context, - flags, NULL, &spec, NULL); - if(!self->stream) - { - pa_threaded_mainloop_unlock(self->loop); - pulse_close(self->loop, self->context, self->stream); - self->loop = NULL; - self->context = NULL; - return ALC_INVALID_VALUE; - } - pa_stream_set_moved_callback(self->stream, ALCpulsePlayback_streamMovedCallback, self); - - alstr_copy_cstr(&self->device_name, pa_stream_get_device_name(self->stream)); - if(alstr_empty(dev_name)) - { - pa_operation *o = pa_context_get_sink_info_by_name( - self->context, alstr_get_cstr(self->device_name), - ALCpulsePlayback_sinkNameCallback, self - ); - wait_for_operation(o, self->loop); - } - else - { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - alstr_copy(&device->DeviceName, dev_name); - } - - pa_threaded_mainloop_unlock(self->loop); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCpulsePlayback_reset(ALCpulsePlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - pa_stream_flags_t flags = 0; - const char *mapname = NULL; - pa_channel_map chanmap; - pa_operation *o; - - pa_threaded_mainloop_lock(self->loop); - - if(self->stream) - { - pa_stream_set_state_callback(self->stream, NULL, NULL); - pa_stream_set_moved_callback(self->stream, NULL, NULL); - pa_stream_set_write_callback(self->stream, NULL, NULL); - pa_stream_set_buffer_attr_callback(self->stream, NULL, NULL); - pa_stream_disconnect(self->stream); - pa_stream_unref(self->stream); - self->stream = NULL; - } - - o = pa_context_get_sink_info_by_name(self->context, alstr_get_cstr(self->device_name), - ALCpulsePlayback_sinkInfoCallback, self); - wait_for_operation(o, self->loop); - - if(GetConfigValueBool(alstr_get_cstr(device->DeviceName), "pulse", "fix-rate", 0) || - !(device->Flags&DEVICE_FREQUENCY_REQUEST)) - flags |= PA_STREAM_FIX_RATE; - flags |= PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE; - flags |= PA_STREAM_ADJUST_LATENCY; - flags |= PA_STREAM_START_CORKED; - if(!GetConfigValueBool(NULL, "pulse", "allow-moves", 0)) - flags |= PA_STREAM_DONT_MOVE; - - switch(device->FmtType) - { - case DevFmtByte: - device->FmtType = DevFmtUByte; - /* fall-through */ - case DevFmtUByte: - self->spec.format = PA_SAMPLE_U8; - break; - case DevFmtUShort: - device->FmtType = DevFmtShort; - /* fall-through */ - case DevFmtShort: - self->spec.format = PA_SAMPLE_S16NE; - break; - case DevFmtUInt: - device->FmtType = DevFmtInt; - /* fall-through */ - case DevFmtInt: - self->spec.format = PA_SAMPLE_S32NE; - break; - case DevFmtFloat: - self->spec.format = PA_SAMPLE_FLOAT32NE; - break; - } - self->spec.rate = device->Frequency; - self->spec.channels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - - if(pa_sample_spec_valid(&self->spec) == 0) - { - ERR("Invalid sample format\n"); - pa_threaded_mainloop_unlock(self->loop); - return ALC_FALSE; - } - - switch(device->FmtChans) - { - case DevFmtMono: - mapname = "mono"; - break; - case DevFmtAmbi3D: - device->FmtChans = DevFmtStereo; - /*fall-through*/ - case DevFmtStereo: - mapname = "front-left,front-right"; - break; - case DevFmtQuad: - mapname = "front-left,front-right,rear-left,rear-right"; - break; - case DevFmtX51: - mapname = "front-left,front-right,front-center,lfe,side-left,side-right"; - break; - case DevFmtX51Rear: - mapname = "front-left,front-right,front-center,lfe,rear-left,rear-right"; - break; - case DevFmtX61: - mapname = "front-left,front-right,front-center,lfe,rear-center,side-left,side-right"; - break; - case DevFmtX71: - mapname = "front-left,front-right,front-center,lfe,rear-left,rear-right,side-left,side-right"; - break; - } - if(!pa_channel_map_parse(&chanmap, mapname)) - { - ERR("Failed to build channel map for %s\n", DevFmtChannelsString(device->FmtChans)); - pa_threaded_mainloop_unlock(self->loop); - return ALC_FALSE; - } - SetDefaultWFXChannelOrder(device); - - self->attr.fragsize = -1; - self->attr.prebuf = 0; - self->attr.minreq = device->UpdateSize * pa_frame_size(&self->spec); - self->attr.tlength = self->attr.minreq * maxu(device->NumUpdates, 2); - self->attr.maxlength = -1; - - self->stream = ALCpulsePlayback_connectStream(alstr_get_cstr(self->device_name), - self->loop, self->context, flags, &self->attr, &self->spec, &chanmap - ); - if(!self->stream) - { - pa_threaded_mainloop_unlock(self->loop); - return ALC_FALSE; - } - pa_stream_set_state_callback(self->stream, ALCpulsePlayback_streamStateCallback, self); - pa_stream_set_moved_callback(self->stream, ALCpulsePlayback_streamMovedCallback, self); - pa_stream_set_write_callback(self->stream, ALCpulsePlayback_streamWriteCallback, self); - - self->spec = *(pa_stream_get_sample_spec(self->stream)); - if(device->Frequency != self->spec.rate) - { - /* Server updated our playback rate, so modify the buffer attribs - * accordingly. */ - device->NumUpdates = (ALuint)clampd( - (ALdouble)device->NumUpdates/device->Frequency*self->spec.rate + 0.5, 2.0, 16.0 - ); - - self->attr.minreq = device->UpdateSize * pa_frame_size(&self->spec); - self->attr.tlength = self->attr.minreq * device->NumUpdates; - self->attr.maxlength = -1; - self->attr.prebuf = 0; - - o = pa_stream_set_buffer_attr(self->stream, &self->attr, - stream_success_callback, self->loop); - wait_for_operation(o, self->loop); - - device->Frequency = self->spec.rate; - } - - pa_stream_set_buffer_attr_callback(self->stream, ALCpulsePlayback_bufferAttrCallback, self); - ALCpulsePlayback_bufferAttrCallback(self->stream, self); - - device->NumUpdates = (ALuint)clampu64( - (self->attr.tlength + self->attr.minreq/2) / self->attr.minreq, 2, 16 - ); - device->UpdateSize = self->attr.minreq / pa_frame_size(&self->spec); - - /* HACK: prebuf should be 0 as that's what we set it to. However on some - * systems it comes back as non-0, so we have to make sure the device will - * write enough audio to start playback. The lack of manual start control - * may have unintended consequences, but it's better than not starting at - * all. - */ - if(self->attr.prebuf != 0) - { - ALuint len = self->attr.prebuf / pa_frame_size(&self->spec); - if(len <= device->UpdateSize*device->NumUpdates) - ERR("Non-0 prebuf, %u samples (%u bytes), device has %u samples\n", - len, self->attr.prebuf, device->UpdateSize*device->NumUpdates); - else - { - ERR("Large prebuf, %u samples (%u bytes), increasing device from %u samples", - len, self->attr.prebuf, device->UpdateSize*device->NumUpdates); - device->NumUpdates = (len+device->UpdateSize-1) / device->UpdateSize; - } - } - - pa_threaded_mainloop_unlock(self->loop); - return ALC_TRUE; -} - -static ALCboolean ALCpulsePlayback_start(ALCpulsePlayback *self) -{ - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCpulsePlayback_mixerProc, self) != althrd_success) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCpulsePlayback_stop(ALCpulsePlayback *self) -{ - pa_operation *o; - int res; - - if(!self->stream || ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - - /* Signal the main loop in case PulseAudio isn't sending us audio requests - * (e.g. if the device is suspended). We need to lock the mainloop in case - * the mixer is between checking the killNow flag but before waiting for - * the signal. - */ - pa_threaded_mainloop_lock(self->loop); - pa_threaded_mainloop_unlock(self->loop); - pa_threaded_mainloop_signal(self->loop, 0); - althrd_join(self->thread, &res); - - pa_threaded_mainloop_lock(self->loop); - - o = pa_stream_cork(self->stream, 1, stream_success_callback, self->loop); - wait_for_operation(o, self->loop); - - pa_threaded_mainloop_unlock(self->loop); -} - - -static ClockLatency ALCpulsePlayback_getClockLatency(ALCpulsePlayback *self) -{ - ClockLatency ret; - pa_usec_t latency; - int neg, err; - - pa_threaded_mainloop_lock(self->loop); - ret.ClockTime = GetDeviceClockTime(STATIC_CAST(ALCbackend,self)->mDevice); - err = pa_stream_get_latency(self->stream, &latency, &neg); - pa_threaded_mainloop_unlock(self->loop); - - if(UNLIKELY(err != 0)) - { - /* FIXME: if err = -PA_ERR_NODATA, it means we were called too soon - * after starting the stream and no timing info has been received from - * the server yet. Should we wait, possibly stalling the app, or give a - * dummy value? Either way, it shouldn't be 0. */ - if(err != -PA_ERR_NODATA) - ERR("Failed to get stream latency: 0x%x\n", err); - latency = 0; - neg = 0; - } - else if(UNLIKELY(neg)) - latency = 0; - ret.Latency = (ALint64)minu64(latency, U64(0x7fffffffffffffff)/1000) * 1000; - - return ret; -} - - -static void ALCpulsePlayback_lock(ALCpulsePlayback *self) -{ - pa_threaded_mainloop_lock(self->loop); -} - -static void ALCpulsePlayback_unlock(ALCpulsePlayback *self) -{ - pa_threaded_mainloop_unlock(self->loop); -} - - -typedef struct ALCpulseCapture { - DERIVE_FROM_TYPE(ALCbackend); - - al_string device_name; - - const void *cap_store; - size_t cap_len; - size_t cap_remain; - - ALCuint last_readable; - - pa_buffer_attr attr; - pa_sample_spec spec; - - pa_threaded_mainloop *loop; - - pa_stream *stream; - pa_context *context; -} ALCpulseCapture; - -static void ALCpulseCapture_deviceCallback(pa_context *context, const pa_source_info *info, int eol, void *pdata); -static void ALCpulseCapture_probeDevices(void); - -static void ALCpulseCapture_contextStateCallback(pa_context *context, void *pdata); -static void ALCpulseCapture_streamStateCallback(pa_stream *stream, void *pdata); -static void ALCpulseCapture_sourceNameCallback(pa_context *context, const pa_source_info *info, int eol, void *pdata); -static void ALCpulseCapture_streamMovedCallback(pa_stream *stream, void *pdata); -static pa_stream *ALCpulseCapture_connectStream(const char *device_name, - pa_threaded_mainloop *loop, pa_context *context, - pa_stream_flags_t flags, pa_buffer_attr *attr, - pa_sample_spec *spec, pa_channel_map *chanmap); - -static void ALCpulseCapture_Construct(ALCpulseCapture *self, ALCdevice *device); -static void ALCpulseCapture_Destruct(ALCpulseCapture *self); -static ALCenum ALCpulseCapture_open(ALCpulseCapture *self, const ALCchar *name); -static DECLARE_FORWARD(ALCpulseCapture, ALCbackend, ALCboolean, reset) -static ALCboolean ALCpulseCapture_start(ALCpulseCapture *self); -static void ALCpulseCapture_stop(ALCpulseCapture *self); -static ALCenum ALCpulseCapture_captureSamples(ALCpulseCapture *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCpulseCapture_availableSamples(ALCpulseCapture *self); -static ClockLatency ALCpulseCapture_getClockLatency(ALCpulseCapture *self); -static void ALCpulseCapture_lock(ALCpulseCapture *self); -static void ALCpulseCapture_unlock(ALCpulseCapture *self); -DECLARE_DEFAULT_ALLOCATORS(ALCpulseCapture) - -DEFINE_ALCBACKEND_VTABLE(ALCpulseCapture); - - -static void ALCpulseCapture_Construct(ALCpulseCapture *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCpulseCapture, ALCbackend, self); - - self->loop = NULL; - AL_STRING_INIT(self->device_name); -} - -static void ALCpulseCapture_Destruct(ALCpulseCapture *self) -{ - if(self->loop) - { - pulse_close(self->loop, self->context, self->stream); - self->loop = NULL; - self->context = NULL; - self->stream = NULL; - } - AL_STRING_DEINIT(self->device_name); - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static void ALCpulseCapture_deviceCallback(pa_context *UNUSED(context), const pa_source_info *info, int eol, void *pdata) -{ - pa_threaded_mainloop *loop = pdata; - const DevMap *iter; - DevMap entry; - int count; - - if(eol) - { - pa_threaded_mainloop_signal(loop, 0); - return; - } - -#define MATCH_INFO_NAME(iter) (alstr_cmp_cstr((iter)->device_name, info->name) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_INFO_NAME); - if(iter != VECTOR_END(CaptureDevices)) return; -#undef MATCH_INFO_NAME - - AL_STRING_INIT(entry.name); - AL_STRING_INIT(entry.device_name); - - alstr_copy_cstr(&entry.device_name, info->name); - - count = 0; - while(1) - { - alstr_copy_cstr(&entry.name, info->description); - if(count != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", count+1); - alstr_append_cstr(&entry.name, str); - } - -#define MATCH_ENTRY(i) (alstr_cmp(entry.name, (i)->name) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_ENTRY); - if(iter == VECTOR_END(CaptureDevices)) break; -#undef MATCH_ENTRY - count++; - } - - TRACE("Got device \"%s\", \"%s\"\n", alstr_get_cstr(entry.name), alstr_get_cstr(entry.device_name)); - - VECTOR_PUSH_BACK(CaptureDevices, entry); -} - -static void ALCpulseCapture_probeDevices(void) -{ - pa_threaded_mainloop *loop; - - clear_devlist(&CaptureDevices); - - if((loop=pa_threaded_mainloop_new()) && - pa_threaded_mainloop_start(loop) >= 0) - { - pa_context *context; - - pa_threaded_mainloop_lock(loop); - context = connect_context(loop, AL_FALSE); - if(context) - { - pa_operation *o; - pa_stream_flags_t flags; - pa_sample_spec spec; - pa_stream *stream; - - flags = PA_STREAM_FIX_FORMAT | PA_STREAM_FIX_RATE | - PA_STREAM_FIX_CHANNELS | PA_STREAM_DONT_MOVE; - - spec.format = PA_SAMPLE_S16NE; - spec.rate = 44100; - spec.channels = 1; - - stream = ALCpulseCapture_connectStream(NULL, loop, context, flags, - NULL, &spec, NULL); - if(stream) - { - o = pa_context_get_source_info_by_name(context, pa_stream_get_device_name(stream), - ALCpulseCapture_deviceCallback, loop); - wait_for_operation(o, loop); - - pa_stream_disconnect(stream); - pa_stream_unref(stream); - stream = NULL; - } - - o = pa_context_get_source_info_list(context, ALCpulseCapture_deviceCallback, loop); - wait_for_operation(o, loop); - - pa_context_disconnect(context); - pa_context_unref(context); - } - pa_threaded_mainloop_unlock(loop); - pa_threaded_mainloop_stop(loop); - } - if(loop) - pa_threaded_mainloop_free(loop); -} - - -static void ALCpulseCapture_contextStateCallback(pa_context *context, void *pdata) -{ - ALCpulseCapture *self = pdata; - if(pa_context_get_state(context) == PA_CONTEXT_FAILED) - { - ERR("Received context failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Capture state failure"); - } - pa_threaded_mainloop_signal(self->loop, 0); -} - -static void ALCpulseCapture_streamStateCallback(pa_stream *stream, void *pdata) -{ - ALCpulseCapture *self = pdata; - if(pa_stream_get_state(stream) == PA_STREAM_FAILED) - { - ERR("Received stream failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Capture stream failure"); - } - pa_threaded_mainloop_signal(self->loop, 0); -} - - -static void ALCpulseCapture_sourceNameCallback(pa_context *UNUSED(context), const pa_source_info *info, int eol, void *pdata) -{ - ALCpulseCapture *self = pdata; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - if(eol) - { - pa_threaded_mainloop_signal(self->loop, 0); - return; - } - - alstr_copy_cstr(&device->DeviceName, info->description); -} - - -static void ALCpulseCapture_streamMovedCallback(pa_stream *stream, void *pdata) -{ - ALCpulseCapture *self = pdata; - - alstr_copy_cstr(&self->device_name, pa_stream_get_device_name(stream)); - - TRACE("Stream moved to %s\n", alstr_get_cstr(self->device_name)); -} - - -static pa_stream *ALCpulseCapture_connectStream(const char *device_name, - pa_threaded_mainloop *loop, pa_context *context, - pa_stream_flags_t flags, pa_buffer_attr *attr, pa_sample_spec *spec, - pa_channel_map *chanmap) -{ - pa_stream_state_t state; - pa_stream *stream; - - stream = pa_stream_new_with_proplist(context, "Capture Stream", spec, chanmap, prop_filter); - if(!stream) - { - ERR("pa_stream_new_with_proplist() failed: %s\n", pa_strerror(pa_context_errno(context))); - return NULL; - } - - pa_stream_set_state_callback(stream, stream_state_callback, loop); - - if(pa_stream_connect_record(stream, device_name, attr, flags) < 0) - { - ERR("Stream did not connect: %s\n", pa_strerror(pa_context_errno(context))); - pa_stream_unref(stream); - return NULL; - } - - while((state=pa_stream_get_state(stream)) != PA_STREAM_READY) - { - if(!PA_STREAM_IS_GOOD(state)) - { - ERR("Stream did not get ready: %s\n", pa_strerror(pa_context_errno(context))); - pa_stream_unref(stream); - return NULL; - } - - pa_threaded_mainloop_wait(loop); - } - pa_stream_set_state_callback(stream, NULL, NULL); - - return stream; -} - - -static ALCenum ALCpulseCapture_open(ALCpulseCapture *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - const char *pulse_name = NULL; - pa_stream_flags_t flags = 0; - const char *mapname = NULL; - pa_channel_map chanmap; - ALuint samples; - - if(name) - { - const DevMap *iter; - - if(VECTOR_SIZE(CaptureDevices) == 0) - ALCpulseCapture_probeDevices(); - -#define MATCH_NAME(iter) (alstr_cmp_cstr((iter)->name, name) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(CaptureDevices)) - return ALC_INVALID_VALUE; - pulse_name = alstr_get_cstr(iter->device_name); - alstr_copy(&device->DeviceName, iter->name); - } - - if(!pulse_open(&self->loop, &self->context, ALCpulseCapture_contextStateCallback, self)) - return ALC_INVALID_VALUE; - - pa_threaded_mainloop_lock(self->loop); - - switch(device->FmtType) - { - case DevFmtUByte: - self->spec.format = PA_SAMPLE_U8; - break; - case DevFmtShort: - self->spec.format = PA_SAMPLE_S16NE; - break; - case DevFmtInt: - self->spec.format = PA_SAMPLE_S32NE; - break; - case DevFmtFloat: - self->spec.format = PA_SAMPLE_FLOAT32NE; - break; - case DevFmtByte: - case DevFmtUShort: - case DevFmtUInt: - ERR("%s capture samples not supported\n", DevFmtTypeString(device->FmtType)); - pa_threaded_mainloop_unlock(self->loop); - goto fail; - } - - switch(device->FmtChans) - { - case DevFmtMono: - mapname = "mono"; - break; - case DevFmtStereo: - mapname = "front-left,front-right"; - break; - case DevFmtQuad: - mapname = "front-left,front-right,rear-left,rear-right"; - break; - case DevFmtX51: - mapname = "front-left,front-right,front-center,lfe,side-left,side-right"; - break; - case DevFmtX51Rear: - mapname = "front-left,front-right,front-center,lfe,rear-left,rear-right"; - break; - case DevFmtX61: - mapname = "front-left,front-right,front-center,lfe,rear-center,side-left,side-right"; - break; - case DevFmtX71: - mapname = "front-left,front-right,front-center,lfe,rear-left,rear-right,side-left,side-right"; - break; - case DevFmtAmbi3D: - ERR("%s capture samples not supported\n", DevFmtChannelsString(device->FmtChans)); - pa_threaded_mainloop_unlock(self->loop); - goto fail; - } - if(!pa_channel_map_parse(&chanmap, mapname)) - { - ERR("Failed to build channel map for %s\n", DevFmtChannelsString(device->FmtChans)); - pa_threaded_mainloop_unlock(self->loop); - return ALC_FALSE; - } - - self->spec.rate = device->Frequency; - self->spec.channels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - - if(pa_sample_spec_valid(&self->spec) == 0) - { - ERR("Invalid sample format\n"); - pa_threaded_mainloop_unlock(self->loop); - goto fail; - } - - if(!pa_channel_map_init_auto(&chanmap, self->spec.channels, PA_CHANNEL_MAP_WAVEEX)) - { - ERR("Couldn't build map for channel count (%d)!\n", self->spec.channels); - pa_threaded_mainloop_unlock(self->loop); - goto fail; - } - - samples = device->UpdateSize * device->NumUpdates; - samples = maxu(samples, 100 * device->Frequency / 1000); - - self->attr.minreq = -1; - self->attr.prebuf = -1; - self->attr.maxlength = samples * pa_frame_size(&self->spec); - self->attr.tlength = -1; - self->attr.fragsize = minu(samples, 50*device->Frequency/1000) * - pa_frame_size(&self->spec); - - flags |= PA_STREAM_START_CORKED|PA_STREAM_ADJUST_LATENCY; - if(!GetConfigValueBool(NULL, "pulse", "allow-moves", 0)) - flags |= PA_STREAM_DONT_MOVE; - - TRACE("Connecting to \"%s\"\n", pulse_name ? pulse_name : "(default)"); - self->stream = ALCpulseCapture_connectStream(pulse_name, - self->loop, self->context, flags, &self->attr, &self->spec, &chanmap - ); - if(!self->stream) - { - pa_threaded_mainloop_unlock(self->loop); - goto fail; - } - pa_stream_set_moved_callback(self->stream, ALCpulseCapture_streamMovedCallback, self); - pa_stream_set_state_callback(self->stream, ALCpulseCapture_streamStateCallback, self); - - alstr_copy_cstr(&self->device_name, pa_stream_get_device_name(self->stream)); - if(alstr_empty(device->DeviceName)) - { - pa_operation *o = pa_context_get_source_info_by_name( - self->context, alstr_get_cstr(self->device_name), - ALCpulseCapture_sourceNameCallback, self - ); - wait_for_operation(o, self->loop); - } - - pa_threaded_mainloop_unlock(self->loop); - return ALC_NO_ERROR; - -fail: - pulse_close(self->loop, self->context, self->stream); - self->loop = NULL; - self->context = NULL; - self->stream = NULL; - - return ALC_INVALID_VALUE; -} - -static ALCboolean ALCpulseCapture_start(ALCpulseCapture *self) -{ - pa_operation *o; - pa_threaded_mainloop_lock(self->loop); - o = pa_stream_cork(self->stream, 0, stream_success_callback, self->loop); - wait_for_operation(o, self->loop); - pa_threaded_mainloop_unlock(self->loop); - return ALC_TRUE; -} - -static void ALCpulseCapture_stop(ALCpulseCapture *self) -{ - pa_operation *o; - pa_threaded_mainloop_lock(self->loop); - o = pa_stream_cork(self->stream, 1, stream_success_callback, self->loop); - wait_for_operation(o, self->loop); - pa_threaded_mainloop_unlock(self->loop); -} - -static ALCenum ALCpulseCapture_captureSamples(ALCpulseCapture *self, ALCvoid *buffer, ALCuint samples) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - ALCuint todo = samples * pa_frame_size(&self->spec); - - /* Capture is done in fragment-sized chunks, so we loop until we get all - * that's available */ - self->last_readable -= todo; - pa_threaded_mainloop_lock(self->loop); - while(todo > 0) - { - size_t rem = todo; - - if(self->cap_len == 0) - { - pa_stream_state_t state; - - state = pa_stream_get_state(self->stream); - if(!PA_STREAM_IS_GOOD(state)) - { - aluHandleDisconnect(device, "Bad capture state: %u", state); - break; - } - if(pa_stream_peek(self->stream, &self->cap_store, &self->cap_len) < 0) - { - ERR("pa_stream_peek() failed: %s\n", - pa_strerror(pa_context_errno(self->context))); - aluHandleDisconnect(device, "Failed retrieving capture samples: %s", - pa_strerror(pa_context_errno(self->context))); - break; - } - self->cap_remain = self->cap_len; - } - if(rem > self->cap_remain) - rem = self->cap_remain; - - memcpy(buffer, self->cap_store, rem); - - buffer = (ALbyte*)buffer + rem; - todo -= rem; - - self->cap_store = (ALbyte*)self->cap_store + rem; - self->cap_remain -= rem; - if(self->cap_remain == 0) - { - pa_stream_drop(self->stream); - self->cap_len = 0; - } - } - pa_threaded_mainloop_unlock(self->loop); - if(todo > 0) - memset(buffer, ((device->FmtType==DevFmtUByte) ? 0x80 : 0), todo); - - return ALC_NO_ERROR; -} - -static ALCuint ALCpulseCapture_availableSamples(ALCpulseCapture *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - size_t readable = self->cap_remain; - - if(ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - ssize_t got; - pa_threaded_mainloop_lock(self->loop); - got = pa_stream_readable_size(self->stream); - if(got < 0) - { - ERR("pa_stream_readable_size() failed: %s\n", pa_strerror(got)); - aluHandleDisconnect(device, "Failed getting readable size: %s", pa_strerror(got)); - } - else if((size_t)got > self->cap_len) - readable += got - self->cap_len; - pa_threaded_mainloop_unlock(self->loop); - } - - if(self->last_readable < readable) - self->last_readable = readable; - return self->last_readable / pa_frame_size(&self->spec); -} - - -static ClockLatency ALCpulseCapture_getClockLatency(ALCpulseCapture *self) -{ - ClockLatency ret; - pa_usec_t latency; - int neg, err; - - pa_threaded_mainloop_lock(self->loop); - ret.ClockTime = GetDeviceClockTime(STATIC_CAST(ALCbackend,self)->mDevice); - err = pa_stream_get_latency(self->stream, &latency, &neg); - pa_threaded_mainloop_unlock(self->loop); - - if(UNLIKELY(err != 0)) - { - ERR("Failed to get stream latency: 0x%x\n", err); - latency = 0; - neg = 0; - } - else if(UNLIKELY(neg)) - latency = 0; - ret.Latency = (ALint64)minu64(latency, U64(0x7fffffffffffffff)/1000) * 1000; - - return ret; -} - - -static void ALCpulseCapture_lock(ALCpulseCapture *self) -{ - pa_threaded_mainloop_lock(self->loop); -} - -static void ALCpulseCapture_unlock(ALCpulseCapture *self) -{ - pa_threaded_mainloop_unlock(self->loop); -} - - -typedef struct ALCpulseBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCpulseBackendFactory; -#define ALCPULSEBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCpulseBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCpulseBackendFactory_init(ALCpulseBackendFactory *self); -static void ALCpulseBackendFactory_deinit(ALCpulseBackendFactory *self); -static ALCboolean ALCpulseBackendFactory_querySupport(ALCpulseBackendFactory *self, ALCbackend_Type type); -static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCpulseBackendFactory_createBackend(ALCpulseBackendFactory *self, ALCdevice *device, ALCbackend_Type type); - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCpulseBackendFactory); - - -static ALCboolean ALCpulseBackendFactory_init(ALCpulseBackendFactory* UNUSED(self)) -{ - ALCboolean ret = ALC_FALSE; - - VECTOR_INIT(PlaybackDevices); - VECTOR_INIT(CaptureDevices); - - if(pulse_load()) - { - pa_threaded_mainloop *loop; - - pulse_ctx_flags = 0; - if(!GetConfigValueBool(NULL, "pulse", "spawn-server", 1)) - pulse_ctx_flags |= PA_CONTEXT_NOAUTOSPAWN; - - if((loop=pa_threaded_mainloop_new()) && - pa_threaded_mainloop_start(loop) >= 0) - { - pa_context *context; - - pa_threaded_mainloop_lock(loop); - context = connect_context(loop, AL_TRUE); - if(context) - { - ret = ALC_TRUE; - - /* Some libraries (Phonon, Qt) set some pulseaudio properties - * through environment variables, which causes all streams in - * the process to inherit them. This attempts to filter those - * properties out by setting them to 0-length data. */ - prop_filter = pa_proplist_new(); - pa_proplist_set(prop_filter, PA_PROP_MEDIA_ROLE, NULL, 0); - pa_proplist_set(prop_filter, "phonon.streamid", NULL, 0); - - pa_context_disconnect(context); - pa_context_unref(context); - } - pa_threaded_mainloop_unlock(loop); - pa_threaded_mainloop_stop(loop); - } - if(loop) - pa_threaded_mainloop_free(loop); - } - - return ret; -} - -static void ALCpulseBackendFactory_deinit(ALCpulseBackendFactory* UNUSED(self)) -{ - clear_devlist(&PlaybackDevices); - VECTOR_DEINIT(PlaybackDevices); - - clear_devlist(&CaptureDevices); - VECTOR_DEINIT(CaptureDevices); - - if(prop_filter) - pa_proplist_free(prop_filter); - prop_filter = NULL; - - /* PulseAudio doesn't like being CloseLib'd sometimes */ -} - -static ALCboolean ALCpulseBackendFactory_querySupport(ALCpulseBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - ALCpulsePlayback_probeDevices(); -#define APPEND_ALL_DEVICES_LIST(e) AppendAllDevicesList(alstr_get_cstr((e)->name)) - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, APPEND_ALL_DEVICES_LIST); -#undef APPEND_ALL_DEVICES_LIST - break; - - case CAPTURE_DEVICE_PROBE: - ALCpulseCapture_probeDevices(); -#define APPEND_CAPTURE_DEVICE_LIST(e) AppendCaptureDeviceList(alstr_get_cstr((e)->name)) - VECTOR_FOR_EACH(const DevMap, CaptureDevices, APPEND_CAPTURE_DEVICE_LIST); -#undef APPEND_CAPTURE_DEVICE_LIST - break; - } -} - -static ALCbackend* ALCpulseBackendFactory_createBackend(ALCpulseBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCpulsePlayback *backend; - NEW_OBJ(backend, ALCpulsePlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCpulseCapture *backend; - NEW_OBJ(backend, ALCpulseCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - - -#else /* PA_API_VERSION == 12 */ - -#warning "Unsupported API version, backend will be unavailable!" - -typedef struct ALCpulseBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCpulseBackendFactory; -#define ALCPULSEBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCpulseBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCpulseBackendFactory_init(ALCpulseBackendFactory* UNUSED(self)) -{ - return ALC_FALSE; -} - -static void ALCpulseBackendFactory_deinit(ALCpulseBackendFactory* UNUSED(self)) -{ -} - -static ALCboolean ALCpulseBackendFactory_querySupport(ALCpulseBackendFactory* UNUSED(self), ALCbackend_Type UNUSED(type)) -{ - return ALC_FALSE; -} - -static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory* UNUSED(self), enum DevProbe UNUSED(type)) -{ -} - -static ALCbackend* ALCpulseBackendFactory_createBackend(ALCpulseBackendFactory* UNUSED(self), ALCdevice* UNUSED(device), ALCbackend_Type UNUSED(type)) -{ - return NULL; -} - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCpulseBackendFactory); - -#endif /* PA_API_VERSION == 12 */ - -ALCbackendFactory *ALCpulseBackendFactory_getFactory(void) -{ - static ALCpulseBackendFactory factory = ALCPULSEBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/backends/sdl2.c b/Alc/backends/sdl2.c deleted file mode 100644 index 5996640..0000000 --- a/Alc/backends/sdl2.c +++ /dev/null @@ -1,287 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2018 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - - -#ifdef _WIN32 -#define DEVNAME_PREFIX "OpenAL Soft on " -#else -#define DEVNAME_PREFIX "" -#endif - -typedef struct ALCsdl2Backend { - DERIVE_FROM_TYPE(ALCbackend); - - SDL_AudioDeviceID deviceID; - ALsizei frameSize; - - ALuint Frequency; - enum DevFmtChannels FmtChans; - enum DevFmtType FmtType; - ALuint UpdateSize; -} ALCsdl2Backend; - -static void ALCsdl2Backend_Construct(ALCsdl2Backend *self, ALCdevice *device); -static void ALCsdl2Backend_Destruct(ALCsdl2Backend *self); -static ALCenum ALCsdl2Backend_open(ALCsdl2Backend *self, const ALCchar *name); -static ALCboolean ALCsdl2Backend_reset(ALCsdl2Backend *self); -static ALCboolean ALCsdl2Backend_start(ALCsdl2Backend *self); -static void ALCsdl2Backend_stop(ALCsdl2Backend *self); -static DECLARE_FORWARD2(ALCsdl2Backend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCsdl2Backend, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCsdl2Backend, ALCbackend, ClockLatency, getClockLatency) -static void ALCsdl2Backend_lock(ALCsdl2Backend *self); -static void ALCsdl2Backend_unlock(ALCsdl2Backend *self); -DECLARE_DEFAULT_ALLOCATORS(ALCsdl2Backend) - -DEFINE_ALCBACKEND_VTABLE(ALCsdl2Backend); - -static const ALCchar defaultDeviceName[] = DEVNAME_PREFIX "Default Device"; - -static void ALCsdl2Backend_Construct(ALCsdl2Backend *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCsdl2Backend, ALCbackend, self); - - self->deviceID = 0; - self->frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - self->Frequency = device->Frequency; - self->FmtChans = device->FmtChans; - self->FmtType = device->FmtType; - self->UpdateSize = device->UpdateSize; -} - -static void ALCsdl2Backend_Destruct(ALCsdl2Backend *self) -{ - if(self->deviceID) - SDL_CloseAudioDevice(self->deviceID); - self->deviceID = 0; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static void ALCsdl2Backend_audioCallback(void *ptr, Uint8 *stream, int len) -{ - ALCsdl2Backend *self = (ALCsdl2Backend*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - assert((len % self->frameSize) == 0); - aluMixData(device, stream, len / self->frameSize); -} - -static ALCenum ALCsdl2Backend_open(ALCsdl2Backend *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - SDL_AudioSpec want, have; - - SDL_zero(want); - SDL_zero(have); - - want.freq = device->Frequency; - switch(device->FmtType) - { - case DevFmtUByte: want.format = AUDIO_U8; break; - case DevFmtByte: want.format = AUDIO_S8; break; - case DevFmtUShort: want.format = AUDIO_U16SYS; break; - case DevFmtShort: want.format = AUDIO_S16SYS; break; - case DevFmtUInt: /* fall-through */ - case DevFmtInt: want.format = AUDIO_S32SYS; break; - case DevFmtFloat: want.format = AUDIO_F32; break; - } - want.channels = (device->FmtChans == DevFmtMono) ? 1 : 2; - want.samples = device->UpdateSize; - want.callback = ALCsdl2Backend_audioCallback; - want.userdata = self; - - /* Passing NULL to SDL_OpenAudioDevice opens a default, which isn't - * necessarily the first in the list. - */ - if(!name || strcmp(name, defaultDeviceName) == 0) - self->deviceID = SDL_OpenAudioDevice(NULL, SDL_FALSE, &want, &have, - SDL_AUDIO_ALLOW_ANY_CHANGE); - else - { - const size_t prefix_len = strlen(DEVNAME_PREFIX); - if(strncmp(name, DEVNAME_PREFIX, prefix_len) == 0) - self->deviceID = SDL_OpenAudioDevice(name+prefix_len, SDL_FALSE, &want, &have, - SDL_AUDIO_ALLOW_ANY_CHANGE); - else - self->deviceID = SDL_OpenAudioDevice(name, SDL_FALSE, &want, &have, - SDL_AUDIO_ALLOW_ANY_CHANGE); - } - if(self->deviceID == 0) - return ALC_INVALID_VALUE; - - device->Frequency = have.freq; - if(have.channels == 1) - device->FmtChans = DevFmtMono; - else if(have.channels == 2) - device->FmtChans = DevFmtStereo; - else - { - ERR("Got unhandled SDL channel count: %d\n", (int)have.channels); - return ALC_INVALID_VALUE; - } - switch(have.format) - { - case AUDIO_U8: device->FmtType = DevFmtUByte; break; - case AUDIO_S8: device->FmtType = DevFmtByte; break; - case AUDIO_U16SYS: device->FmtType = DevFmtUShort; break; - case AUDIO_S16SYS: device->FmtType = DevFmtShort; break; - case AUDIO_S32SYS: device->FmtType = DevFmtInt; break; - case AUDIO_F32SYS: device->FmtType = DevFmtFloat; break; - default: - ERR("Got unsupported SDL format: 0x%04x\n", have.format); - return ALC_INVALID_VALUE; - } - device->UpdateSize = have.samples; - device->NumUpdates = 2; /* SDL always (tries to) use two periods. */ - - self->frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - self->Frequency = device->Frequency; - self->FmtChans = device->FmtChans; - self->FmtType = device->FmtType; - self->UpdateSize = device->UpdateSize; - - alstr_copy_cstr(&device->DeviceName, name ? name : defaultDeviceName); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCsdl2Backend_reset(ALCsdl2Backend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - device->Frequency = self->Frequency; - device->FmtChans = self->FmtChans; - device->FmtType = self->FmtType; - device->UpdateSize = self->UpdateSize; - device->NumUpdates = 2; - SetDefaultWFXChannelOrder(device); - return ALC_TRUE; -} - -static ALCboolean ALCsdl2Backend_start(ALCsdl2Backend *self) -{ - SDL_PauseAudioDevice(self->deviceID, 0); - return ALC_TRUE; -} - -static void ALCsdl2Backend_stop(ALCsdl2Backend *self) -{ - SDL_PauseAudioDevice(self->deviceID, 1); -} - -static void ALCsdl2Backend_lock(ALCsdl2Backend *self) -{ - SDL_LockAudioDevice(self->deviceID); -} - -static void ALCsdl2Backend_unlock(ALCsdl2Backend *self) -{ - SDL_UnlockAudioDevice(self->deviceID); -} - - -typedef struct ALCsdl2BackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCsdl2BackendFactory; -#define ALCsdl2BACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCsdl2BackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCsdl2BackendFactory_getFactory(void); - -static ALCboolean ALCsdl2BackendFactory_init(ALCsdl2BackendFactory *self); -static void ALCsdl2BackendFactory_deinit(ALCsdl2BackendFactory *self); -static ALCboolean ALCsdl2BackendFactory_querySupport(ALCsdl2BackendFactory *self, ALCbackend_Type type); -static void ALCsdl2BackendFactory_probe(ALCsdl2BackendFactory *self, enum DevProbe type); -static ALCbackend* ALCsdl2BackendFactory_createBackend(ALCsdl2BackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCsdl2BackendFactory); - - -ALCbackendFactory *ALCsdl2BackendFactory_getFactory(void) -{ - static ALCsdl2BackendFactory factory = ALCsdl2BACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCsdl2BackendFactory_init(ALCsdl2BackendFactory* UNUSED(self)) -{ - if(SDL_InitSubSystem(SDL_INIT_AUDIO) == 0) - return AL_TRUE; - return ALC_FALSE; -} - -static void ALCsdl2BackendFactory_deinit(ALCsdl2BackendFactory* UNUSED(self)) -{ - SDL_QuitSubSystem(SDL_INIT_AUDIO); -} - -static ALCboolean ALCsdl2BackendFactory_querySupport(ALCsdl2BackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCsdl2BackendFactory_probe(ALCsdl2BackendFactory* UNUSED(self), enum DevProbe type) -{ - int num_devices, i; - al_string name; - - if(type != ALL_DEVICE_PROBE) - return; - - AL_STRING_INIT(name); - num_devices = SDL_GetNumAudioDevices(SDL_FALSE); - - AppendAllDevicesList(defaultDeviceName); - for(i = 0;i < num_devices;++i) - { - alstr_copy_cstr(&name, DEVNAME_PREFIX); - alstr_append_cstr(&name, SDL_GetAudioDeviceName(i, SDL_FALSE)); - AppendAllDevicesList(alstr_get_cstr(name)); - } - alstr_reset(&name); -} - -static ALCbackend* ALCsdl2BackendFactory_createBackend(ALCsdl2BackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCsdl2Backend *backend; - NEW_OBJ(backend, ALCsdl2Backend)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/sndio.c b/Alc/backends/sndio.c deleted file mode 100644 index 5aea457..0000000 --- a/Alc/backends/sndio.c +++ /dev/null @@ -1,342 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "threads.h" - -#include "backends/base.h" - -#include - - - - -typedef struct ALCsndioBackend { - DERIVE_FROM_TYPE(ALCbackend); - - struct sio_hdl *sndHandle; - - ALvoid *mix_data; - ALsizei data_size; - - ATOMIC(int) killNow; - althrd_t thread; -} ALCsndioBackend; - -static int ALCsndioBackend_mixerProc(void *ptr); - -static void ALCsndioBackend_Construct(ALCsndioBackend *self, ALCdevice *device); -static void ALCsndioBackend_Destruct(ALCsndioBackend *self); -static ALCenum ALCsndioBackend_open(ALCsndioBackend *self, const ALCchar *name); -static ALCboolean ALCsndioBackend_reset(ALCsndioBackend *self); -static ALCboolean ALCsndioBackend_start(ALCsndioBackend *self); -static void ALCsndioBackend_stop(ALCsndioBackend *self); -static DECLARE_FORWARD2(ALCsndioBackend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCsndioBackend) - -DEFINE_ALCBACKEND_VTABLE(ALCsndioBackend); - - -static const ALCchar sndio_device[] = "SndIO Default"; - - -static void ALCsndioBackend_Construct(ALCsndioBackend *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCsndioBackend, ALCbackend, self); - - self->sndHandle = NULL; - self->mix_data = NULL; - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCsndioBackend_Destruct(ALCsndioBackend *self) -{ - if(self->sndHandle) - sio_close(self->sndHandle); - self->sndHandle = NULL; - - al_free(self->mix_data); - self->mix_data = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCsndioBackend_mixerProc(void *ptr) -{ - ALCsndioBackend *self = (ALCsndioBackend*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALsizei frameSize; - size_t wrote; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - ALsizei len = self->data_size; - ALubyte *WritePtr = self->mix_data; - - ALCsndioBackend_lock(self); - aluMixData(device, WritePtr, len/frameSize); - ALCsndioBackend_unlock(self); - while(len > 0 && !ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) - { - wrote = sio_write(self->sndHandle, WritePtr, len); - if(wrote == 0) - { - ERR("sio_write failed\n"); - ALCdevice_Lock(device); - aluHandleDisconnect(device, "Failed to write playback samples"); - ALCdevice_Unlock(device); - break; - } - - len -= wrote; - WritePtr += wrote; - } - } - - return 0; -} - - -static ALCenum ALCsndioBackend_open(ALCsndioBackend *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - if(!name) - name = sndio_device; - else if(strcmp(name, sndio_device) != 0) - return ALC_INVALID_VALUE; - - self->sndHandle = sio_open(NULL, SIO_PLAY, 0); - if(self->sndHandle == NULL) - { - ERR("Could not open device\n"); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCsndioBackend_reset(ALCsndioBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - struct sio_par par; - - sio_initpar(&par); - - par.rate = device->Frequency; - par.pchan = ((device->FmtChans != DevFmtMono) ? 2 : 1); - - switch(device->FmtType) - { - case DevFmtByte: - par.bits = 8; - par.sig = 1; - break; - case DevFmtUByte: - par.bits = 8; - par.sig = 0; - break; - case DevFmtFloat: - case DevFmtShort: - par.bits = 16; - par.sig = 1; - break; - case DevFmtUShort: - par.bits = 16; - par.sig = 0; - break; - case DevFmtInt: - par.bits = 32; - par.sig = 1; - break; - case DevFmtUInt: - par.bits = 32; - par.sig = 0; - break; - } - par.le = SIO_LE_NATIVE; - - par.round = device->UpdateSize; - par.appbufsz = device->UpdateSize * (device->NumUpdates-1); - if(!par.appbufsz) par.appbufsz = device->UpdateSize; - - if(!sio_setpar(self->sndHandle, &par) || !sio_getpar(self->sndHandle, &par)) - { - ERR("Failed to set device parameters\n"); - return ALC_FALSE; - } - - if(par.bits != par.bps*8) - { - ERR("Padded samples not supported (%u of %u bits)\n", par.bits, par.bps*8); - return ALC_FALSE; - } - - device->Frequency = par.rate; - device->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo); - - if(par.bits == 8 && par.sig == 1) - device->FmtType = DevFmtByte; - else if(par.bits == 8 && par.sig == 0) - device->FmtType = DevFmtUByte; - else if(par.bits == 16 && par.sig == 1) - device->FmtType = DevFmtShort; - else if(par.bits == 16 && par.sig == 0) - device->FmtType = DevFmtUShort; - else if(par.bits == 32 && par.sig == 1) - device->FmtType = DevFmtInt; - else if(par.bits == 32 && par.sig == 0) - device->FmtType = DevFmtUInt; - else - { - ERR("Unhandled sample format: %s %u-bit\n", (par.sig?"signed":"unsigned"), par.bits); - return ALC_FALSE; - } - - device->UpdateSize = par.round; - device->NumUpdates = (par.bufsz/par.round) + 1; - - SetDefaultChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCsndioBackend_start(ALCsndioBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - self->data_size = device->UpdateSize * FrameSizeFromDevFmt( - device->FmtChans, device->FmtType, device->AmbiOrder - ); - al_free(self->mix_data); - self->mix_data = al_calloc(16, self->data_size); - - if(!sio_start(self->sndHandle)) - { - ERR("Error starting playback\n"); - return ALC_FALSE; - } - - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCsndioBackend_mixerProc, self) != althrd_success) - { - sio_stop(self->sndHandle); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCsndioBackend_stop(ALCsndioBackend *self) -{ - int res; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - althrd_join(self->thread, &res); - - if(!sio_stop(self->sndHandle)) - ERR("Error stopping device\n"); - - al_free(self->mix_data); - self->mix_data = NULL; -} - - -typedef struct ALCsndioBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCsndioBackendFactory; -#define ALCSNDIOBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCsndioBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCsndioBackendFactory_getFactory(void); - -static ALCboolean ALCsndioBackendFactory_init(ALCsndioBackendFactory *self); -static DECLARE_FORWARD(ALCsndioBackendFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCsndioBackendFactory_querySupport(ALCsndioBackendFactory *self, ALCbackend_Type type); -static void ALCsndioBackendFactory_probe(ALCsndioBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCsndioBackendFactory_createBackend(ALCsndioBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCsndioBackendFactory); - - -ALCbackendFactory *ALCsndioBackendFactory_getFactory(void) -{ - static ALCsndioBackendFactory factory = ALCSNDIOBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCsndioBackendFactory_init(ALCsndioBackendFactory* UNUSED(self)) -{ - /* No dynamic loading */ - return ALC_TRUE; -} - -static ALCboolean ALCsndioBackendFactory_querySupport(ALCsndioBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCsndioBackendFactory_probe(ALCsndioBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(sndio_device); - break; - case CAPTURE_DEVICE_PROBE: - break; - } -} - -static ALCbackend* ALCsndioBackendFactory_createBackend(ALCsndioBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCsndioBackend *backend; - NEW_OBJ(backend, ALCsndioBackend)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/solaris.c b/Alc/backends/solaris.c deleted file mode 100644 index f1c4aea..0000000 --- a/Alc/backends/solaris.c +++ /dev/null @@ -1,360 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - -#include - - -typedef struct ALCsolarisBackend { - DERIVE_FROM_TYPE(ALCbackend); - - int fd; - - ALubyte *mix_data; - int data_size; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCsolarisBackend; - -static int ALCsolarisBackend_mixerProc(void *ptr); - -static void ALCsolarisBackend_Construct(ALCsolarisBackend *self, ALCdevice *device); -static void ALCsolarisBackend_Destruct(ALCsolarisBackend *self); -static ALCenum ALCsolarisBackend_open(ALCsolarisBackend *self, const ALCchar *name); -static ALCboolean ALCsolarisBackend_reset(ALCsolarisBackend *self); -static ALCboolean ALCsolarisBackend_start(ALCsolarisBackend *self); -static void ALCsolarisBackend_stop(ALCsolarisBackend *self); -static DECLARE_FORWARD2(ALCsolarisBackend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCsolarisBackend, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCsolarisBackend, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCsolarisBackend, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCsolarisBackend, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCsolarisBackend) - -DEFINE_ALCBACKEND_VTABLE(ALCsolarisBackend); - - -static const ALCchar solaris_device[] = "Solaris Default"; - -static const char *solaris_driver = "/dev/audio"; - - -static void ALCsolarisBackend_Construct(ALCsolarisBackend *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCsolarisBackend, ALCbackend, self); - - self->fd = -1; - self->mix_data = NULL; - ATOMIC_INIT(&self->killNow, AL_FALSE); -} - -static void ALCsolarisBackend_Destruct(ALCsolarisBackend *self) -{ - if(self->fd != -1) - close(self->fd); - self->fd = -1; - - free(self->mix_data); - self->mix_data = NULL; - self->data_size = 0; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCsolarisBackend_mixerProc(void *ptr) -{ - ALCsolarisBackend *self = ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - struct timeval timeout; - ALubyte *write_ptr; - ALint frame_size; - ALint to_write; - ssize_t wrote; - fd_set wfds; - int sret; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - ALCsolarisBackend_lock(self); - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - FD_ZERO(&wfds); - FD_SET(self->fd, &wfds); - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - ALCsolarisBackend_unlock(self); - sret = select(self->fd+1, NULL, &wfds, NULL, &timeout); - ALCsolarisBackend_lock(self); - if(sret < 0) - { - if(errno == EINTR) - continue; - ERR("select failed: %s\n", strerror(errno)); - aluHandleDisconnect(device, "Failed to wait for playback buffer: %s", strerror(errno)); - break; - } - else if(sret == 0) - { - WARN("select timeout\n"); - continue; - } - - write_ptr = self->mix_data; - to_write = self->data_size; - aluMixData(device, write_ptr, to_write/frame_size); - while(to_write > 0 && !ATOMIC_LOAD_SEQ(&self->killNow)) - { - wrote = write(self->fd, write_ptr, to_write); - if(wrote < 0) - { - if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) - continue; - ERR("write failed: %s\n", strerror(errno)); - aluHandleDisconnect(device, "Failed to write playback samples: %s", - strerror(errno)); - break; - } - - to_write -= wrote; - write_ptr += wrote; - } - } - ALCsolarisBackend_unlock(self); - - return 0; -} - - -static ALCenum ALCsolarisBackend_open(ALCsolarisBackend *self, const ALCchar *name) -{ - ALCdevice *device; - - if(!name) - name = solaris_device; - else if(strcmp(name, solaris_device) != 0) - return ALC_INVALID_VALUE; - - self->fd = open(solaris_driver, O_WRONLY); - if(self->fd == -1) - { - ERR("Could not open %s: %s\n", solaris_driver, strerror(errno)); - return ALC_INVALID_VALUE; - } - - device = STATIC_CAST(ALCbackend,self)->mDevice; - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCsolarisBackend_reset(ALCsolarisBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - audio_info_t info; - ALsizei frameSize; - ALsizei numChannels; - - AUDIO_INITINFO(&info); - - info.play.sample_rate = device->Frequency; - - if(device->FmtChans != DevFmtMono) - device->FmtChans = DevFmtStereo; - numChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - info.play.channels = numChannels; - - switch(device->FmtType) - { - case DevFmtByte: - info.play.precision = 8; - info.play.encoding = AUDIO_ENCODING_LINEAR; - break; - case DevFmtUByte: - info.play.precision = 8; - info.play.encoding = AUDIO_ENCODING_LINEAR8; - break; - case DevFmtUShort: - case DevFmtInt: - case DevFmtUInt: - case DevFmtFloat: - device->FmtType = DevFmtShort; - /* fall-through */ - case DevFmtShort: - info.play.precision = 16; - info.play.encoding = AUDIO_ENCODING_LINEAR; - break; - } - - frameSize = numChannels * BytesFromDevFmt(device->FmtType); - info.play.buffer_size = device->UpdateSize*device->NumUpdates * frameSize; - - if(ioctl(self->fd, AUDIO_SETINFO, &info) < 0) - { - ERR("ioctl failed: %s\n", strerror(errno)); - return ALC_FALSE; - } - - if(ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder) != (ALsizei)info.play.channels) - { - ERR("Failed to set %s, got %u channels instead\n", DevFmtChannelsString(device->FmtChans), info.play.channels); - return ALC_FALSE; - } - - if(!((info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR8 && device->FmtType == DevFmtUByte) || - (info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR && device->FmtType == DevFmtByte) || - (info.play.precision == 16 && info.play.encoding == AUDIO_ENCODING_LINEAR && device->FmtType == DevFmtShort) || - (info.play.precision == 32 && info.play.encoding == AUDIO_ENCODING_LINEAR && device->FmtType == DevFmtInt))) - { - ERR("Could not set %s samples, got %d (0x%x)\n", DevFmtTypeString(device->FmtType), - info.play.precision, info.play.encoding); - return ALC_FALSE; - } - - device->Frequency = info.play.sample_rate; - device->UpdateSize = (info.play.buffer_size/device->NumUpdates) + 1; - - SetDefaultChannelOrder(device); - - free(self->mix_data); - self->data_size = device->UpdateSize * FrameSizeFromDevFmt( - device->FmtChans, device->FmtType, device->AmbiOrder - ); - self->mix_data = calloc(1, self->data_size); - - return ALC_TRUE; -} - -static ALCboolean ALCsolarisBackend_start(ALCsolarisBackend *self) -{ - ATOMIC_STORE_SEQ(&self->killNow, AL_FALSE); - if(althrd_create(&self->thread, ALCsolarisBackend_mixerProc, self) != althrd_success) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCsolarisBackend_stop(ALCsolarisBackend *self) -{ - int res; - - if(ATOMIC_EXCHANGE_SEQ(&self->killNow, AL_TRUE)) - return; - - althrd_join(self->thread, &res); - - if(ioctl(self->fd, AUDIO_DRAIN) < 0) - ERR("Error draining device: %s\n", strerror(errno)); -} - - -typedef struct ALCsolarisBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCsolarisBackendFactory; -#define ALCSOLARISBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCsolarisBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void); - -static ALCboolean ALCsolarisBackendFactory_init(ALCsolarisBackendFactory *self); -static DECLARE_FORWARD(ALCsolarisBackendFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCsolarisBackendFactory_querySupport(ALCsolarisBackendFactory *self, ALCbackend_Type type); -static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCsolarisBackendFactory_createBackend(ALCsolarisBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCsolarisBackendFactory); - - -ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void) -{ - static ALCsolarisBackendFactory factory = ALCSOLARISBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCsolarisBackendFactory_init(ALCsolarisBackendFactory* UNUSED(self)) -{ - ConfigValueStr(NULL, "solaris", "device", &solaris_driver); - return ALC_TRUE; -} - -static ALCboolean ALCsolarisBackendFactory_querySupport(ALCsolarisBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - { -#ifdef HAVE_STAT - struct stat buf; - if(stat(solaris_driver, &buf) == 0) -#endif - AppendAllDevicesList(solaris_device); - } - break; - - case CAPTURE_DEVICE_PROBE: - break; - } -} - -ALCbackend* ALCsolarisBackendFactory_createBackend(ALCsolarisBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCsolarisBackend *backend; - NEW_OBJ(backend, ALCsolarisBackend)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/wasapi.c b/Alc/backends/wasapi.c deleted file mode 100644 index 50471f6..0000000 --- a/Alc/backends/wasapi.c +++ /dev/null @@ -1,2044 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2011 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#define COBJMACROS -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef _WAVEFORMATEXTENSIBLE_ -#include -#include -#endif - -#include "alMain.h" -#include "alu.h" -#include "ringbuffer.h" -#include "threads.h" -#include "compat.h" -#include "alstring.h" -#include "converter.h" - -#include "backends/base.h" - - -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); - -DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14); -DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FormFactor, 0x1da5d803, 0xd492, 0x4edd, 0x8c,0x23, 0xe0,0xc0,0xff,0xee,0x7f,0x0e, 0); -DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23,0xe0, 0xc0,0xff,0xee,0x7f,0x0e, 4 ); - -#define MONO SPEAKER_FRONT_CENTER -#define STEREO (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT) -#define QUAD (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT) -#define X5DOT1 (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT) -#define X5DOT1REAR (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT) -#define X6DOT1 (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT) -#define X7DOT1 (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT) -#define X7DOT1_WIDE (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_FRONT_LEFT_OF_CENTER|SPEAKER_FRONT_RIGHT_OF_CENTER) - -#define REFTIME_PER_SEC ((REFERENCE_TIME)10000000) - -#define DEVNAME_HEAD "OpenAL Soft on " - - -/* Scales the given value using 64-bit integer math, ceiling the result. */ -static inline ALuint64 ScaleCeil(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale) -{ - return (val*new_scale + old_scale-1) / old_scale; -} - - -typedef struct { - al_string name; - al_string endpoint_guid; // obtained from PKEY_AudioEndpoint_GUID , set to "Unknown device GUID" if absent. - WCHAR *devid; -} DevMap; -TYPEDEF_VECTOR(DevMap, vector_DevMap) - -static void clear_devlist(vector_DevMap *list) -{ -#define CLEAR_DEVMAP(i) do { \ - AL_STRING_DEINIT((i)->name); \ - AL_STRING_DEINIT((i)->endpoint_guid); \ - free((i)->devid); \ - (i)->devid = NULL; \ -} while(0) - VECTOR_FOR_EACH(DevMap, *list, CLEAR_DEVMAP); - VECTOR_RESIZE(*list, 0, 0); -#undef CLEAR_DEVMAP -} - -static vector_DevMap PlaybackDevices; -static vector_DevMap CaptureDevices; - - -static HANDLE ThreadHdl; -static DWORD ThreadID; - -typedef struct { - HANDLE FinishedEvt; - HRESULT result; -} ThreadRequest; - -#define WM_USER_First (WM_USER+0) -#define WM_USER_OpenDevice (WM_USER+0) -#define WM_USER_ResetDevice (WM_USER+1) -#define WM_USER_StartDevice (WM_USER+2) -#define WM_USER_StopDevice (WM_USER+3) -#define WM_USER_CloseDevice (WM_USER+4) -#define WM_USER_Enumerate (WM_USER+5) -#define WM_USER_Last (WM_USER+5) - -static const char MessageStr[WM_USER_Last+1-WM_USER][20] = { - "Open Device", - "Reset Device", - "Start Device", - "Stop Device", - "Close Device", - "Enumerate Devices", -}; - -static inline void ReturnMsgResponse(ThreadRequest *req, HRESULT res) -{ - req->result = res; - SetEvent(req->FinishedEvt); -} - -static HRESULT WaitForResponse(ThreadRequest *req) -{ - if(WaitForSingleObject(req->FinishedEvt, INFINITE) == WAIT_OBJECT_0) - return req->result; - ERR("Message response error: %lu\n", GetLastError()); - return E_FAIL; -} - - -static void get_device_name_and_guid(IMMDevice *device, al_string *name, al_string *guid) -{ - IPropertyStore *ps; - PROPVARIANT pvname; - PROPVARIANT pvguid; - HRESULT hr; - - alstr_copy_cstr(name, DEVNAME_HEAD); - - hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); - if(FAILED(hr)) - { - WARN("OpenPropertyStore failed: 0x%08lx\n", hr); - alstr_append_cstr(name, "Unknown Device Name"); - if(guid!=NULL)alstr_copy_cstr(guid, "Unknown Device GUID"); - return; - } - - PropVariantInit(&pvname); - - hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pvname); - if(FAILED(hr)) - { - WARN("GetValue Device_FriendlyName failed: 0x%08lx\n", hr); - alstr_append_cstr(name, "Unknown Device Name"); - } - else if(pvname.vt == VT_LPWSTR) - alstr_append_wcstr(name, pvname.pwszVal); - else - { - WARN("Unexpected PROPVARIANT type: 0x%04x\n", pvname.vt); - alstr_append_cstr(name, "Unknown Device Name"); - } - PropVariantClear(&pvname); - - if(guid!=NULL){ - PropVariantInit(&pvguid); - - hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY*)&PKEY_AudioEndpoint_GUID, &pvguid); - if(FAILED(hr)) - { - WARN("GetValue AudioEndpoint_GUID failed: 0x%08lx\n", hr); - alstr_copy_cstr(guid, "Unknown Device GUID"); - } - else if(pvguid.vt == VT_LPWSTR) - alstr_copy_wcstr(guid, pvguid.pwszVal); - else - { - WARN("Unexpected PROPVARIANT type: 0x%04x\n", pvguid.vt); - alstr_copy_cstr(guid, "Unknown Device GUID"); - } - - PropVariantClear(&pvguid); - } - - IPropertyStore_Release(ps); -} - -static void get_device_formfactor(IMMDevice *device, EndpointFormFactor *formfactor) -{ - IPropertyStore *ps; - PROPVARIANT pvform; - HRESULT hr; - - hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); - if(FAILED(hr)) - { - WARN("OpenPropertyStore failed: 0x%08lx\n", hr); - return; - } - - PropVariantInit(&pvform); - - hr = IPropertyStore_GetValue(ps, &PKEY_AudioEndpoint_FormFactor, &pvform); - if(FAILED(hr)) - WARN("GetValue AudioEndpoint_FormFactor failed: 0x%08lx\n", hr); - else if(pvform.vt == VT_UI4) - *formfactor = pvform.ulVal; - else if(pvform.vt == VT_EMPTY) - *formfactor = UnknownFormFactor; - else - WARN("Unexpected PROPVARIANT type: 0x%04x\n", pvform.vt); - - PropVariantClear(&pvform); - IPropertyStore_Release(ps); -} - - -static void add_device(IMMDevice *device, const WCHAR *devid, vector_DevMap *list) -{ - int count = 0; - al_string tmpname; - DevMap entry; - - AL_STRING_INIT(tmpname); - AL_STRING_INIT(entry.name); - AL_STRING_INIT(entry.endpoint_guid); - - entry.devid = strdupW(devid); - get_device_name_and_guid(device, &tmpname, &entry.endpoint_guid); - - while(1) - { - const DevMap *iter; - - alstr_copy(&entry.name, tmpname); - if(count != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", count+1); - alstr_append_cstr(&entry.name, str); - } - -#define MATCH_ENTRY(i) (alstr_cmp(entry.name, (i)->name) == 0) - VECTOR_FIND_IF(iter, const DevMap, *list, MATCH_ENTRY); - if(iter == VECTOR_END(*list)) break; -#undef MATCH_ENTRY - count++; - } - - TRACE("Got device \"%s\", \"%s\", \"%ls\"\n", alstr_get_cstr(entry.name), alstr_get_cstr(entry.endpoint_guid), entry.devid); - VECTOR_PUSH_BACK(*list, entry); - - AL_STRING_DEINIT(tmpname); -} - -static WCHAR *get_device_id(IMMDevice *device) -{ - WCHAR *devid; - HRESULT hr; - - hr = IMMDevice_GetId(device, &devid); - if(FAILED(hr)) - { - ERR("Failed to get device id: %lx\n", hr); - return NULL; - } - - return devid; -} - -static HRESULT probe_devices(IMMDeviceEnumerator *devenum, EDataFlow flowdir, vector_DevMap *list) -{ - IMMDeviceCollection *coll; - IMMDevice *defdev = NULL; - WCHAR *defdevid = NULL; - HRESULT hr; - UINT count; - UINT i; - - hr = IMMDeviceEnumerator_EnumAudioEndpoints(devenum, flowdir, DEVICE_STATE_ACTIVE, &coll); - if(FAILED(hr)) - { - ERR("Failed to enumerate audio endpoints: 0x%08lx\n", hr); - return hr; - } - - count = 0; - hr = IMMDeviceCollection_GetCount(coll, &count); - if(SUCCEEDED(hr) && count > 0) - { - clear_devlist(list); - VECTOR_RESIZE(*list, 0, count); - - hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(devenum, flowdir, - eMultimedia, &defdev); - } - if(SUCCEEDED(hr) && defdev != NULL) - { - defdevid = get_device_id(defdev); - if(defdevid) - add_device(defdev, defdevid, list); - } - - for(i = 0;i < count;++i) - { - IMMDevice *device; - WCHAR *devid; - - hr = IMMDeviceCollection_Item(coll, i, &device); - if(FAILED(hr)) continue; - - devid = get_device_id(device); - if(devid) - { - if(wcscmp(devid, defdevid) != 0) - add_device(device, devid, list); - CoTaskMemFree(devid); - } - IMMDevice_Release(device); - } - - if(defdev) IMMDevice_Release(defdev); - if(defdevid) CoTaskMemFree(defdevid); - IMMDeviceCollection_Release(coll); - - return S_OK; -} - - -/* Proxy interface used by the message handler. */ -struct ALCwasapiProxyVtable; - -typedef struct ALCwasapiProxy { - const struct ALCwasapiProxyVtable *vtbl; -} ALCwasapiProxy; - -struct ALCwasapiProxyVtable { - HRESULT (*const openProxy)(ALCwasapiProxy*); - void (*const closeProxy)(ALCwasapiProxy*); - - HRESULT (*const resetProxy)(ALCwasapiProxy*); - HRESULT (*const startProxy)(ALCwasapiProxy*); - void (*const stopProxy)(ALCwasapiProxy*); -}; - -#define DEFINE_ALCWASAPIPROXY_VTABLE(T) \ -DECLARE_THUNK(T, ALCwasapiProxy, HRESULT, openProxy) \ -DECLARE_THUNK(T, ALCwasapiProxy, void, closeProxy) \ -DECLARE_THUNK(T, ALCwasapiProxy, HRESULT, resetProxy) \ -DECLARE_THUNK(T, ALCwasapiProxy, HRESULT, startProxy) \ -DECLARE_THUNK(T, ALCwasapiProxy, void, stopProxy) \ - \ -static const struct ALCwasapiProxyVtable T##_ALCwasapiProxy_vtable = { \ - T##_ALCwasapiProxy_openProxy, \ - T##_ALCwasapiProxy_closeProxy, \ - T##_ALCwasapiProxy_resetProxy, \ - T##_ALCwasapiProxy_startProxy, \ - T##_ALCwasapiProxy_stopProxy, \ -} - -static void ALCwasapiProxy_Construct(ALCwasapiProxy* UNUSED(self)) { } -static void ALCwasapiProxy_Destruct(ALCwasapiProxy* UNUSED(self)) { } - -static DWORD CALLBACK ALCwasapiProxy_messageHandler(void *ptr) -{ - ThreadRequest *req = ptr; - IMMDeviceEnumerator *Enumerator; - ALuint deviceCount = 0; - ALCwasapiProxy *proxy; - HRESULT hr, cohr; - MSG msg; - - TRACE("Starting message thread\n"); - - cohr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if(FAILED(cohr)) - { - WARN("Failed to initialize COM: 0x%08lx\n", cohr); - ReturnMsgResponse(req, cohr); - return 0; - } - - hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr); - if(FAILED(hr)) - { - WARN("Failed to create IMMDeviceEnumerator instance: 0x%08lx\n", hr); - CoUninitialize(); - ReturnMsgResponse(req, hr); - return 0; - } - Enumerator = ptr; - IMMDeviceEnumerator_Release(Enumerator); - Enumerator = NULL; - - CoUninitialize(); - - /* HACK: Force Windows to create a message queue for this thread before - * returning success, otherwise PostThreadMessage may fail if it gets - * called before GetMessage. - */ - PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); - - TRACE("Message thread initialization complete\n"); - ReturnMsgResponse(req, S_OK); - - TRACE("Starting message loop\n"); - while(GetMessage(&msg, NULL, WM_USER_First, WM_USER_Last)) - { - TRACE("Got message \"%s\" (0x%04x, lparam=%p, wparam=%p)\n", - (msg.message >= WM_USER && msg.message <= WM_USER_Last) ? - MessageStr[msg.message-WM_USER] : "Unknown", - msg.message, (void*)msg.lParam, (void*)msg.wParam - ); - switch(msg.message) - { - case WM_USER_OpenDevice: - req = (ThreadRequest*)msg.wParam; - proxy = (ALCwasapiProxy*)msg.lParam; - - hr = cohr = S_OK; - if(++deviceCount == 1) - hr = cohr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if(SUCCEEDED(hr)) - hr = V0(proxy,openProxy)(); - if(FAILED(hr)) - { - if(--deviceCount == 0 && SUCCEEDED(cohr)) - CoUninitialize(); - } - - ReturnMsgResponse(req, hr); - continue; - - case WM_USER_ResetDevice: - req = (ThreadRequest*)msg.wParam; - proxy = (ALCwasapiProxy*)msg.lParam; - - hr = V0(proxy,resetProxy)(); - ReturnMsgResponse(req, hr); - continue; - - case WM_USER_StartDevice: - req = (ThreadRequest*)msg.wParam; - proxy = (ALCwasapiProxy*)msg.lParam; - - hr = V0(proxy,startProxy)(); - ReturnMsgResponse(req, hr); - continue; - - case WM_USER_StopDevice: - req = (ThreadRequest*)msg.wParam; - proxy = (ALCwasapiProxy*)msg.lParam; - - V0(proxy,stopProxy)(); - ReturnMsgResponse(req, S_OK); - continue; - - case WM_USER_CloseDevice: - req = (ThreadRequest*)msg.wParam; - proxy = (ALCwasapiProxy*)msg.lParam; - - V0(proxy,closeProxy)(); - if(--deviceCount == 0) - CoUninitialize(); - - ReturnMsgResponse(req, S_OK); - continue; - - case WM_USER_Enumerate: - req = (ThreadRequest*)msg.wParam; - - hr = cohr = S_OK; - if(++deviceCount == 1) - hr = cohr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if(SUCCEEDED(hr)) - hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr); - if(SUCCEEDED(hr)) - { - Enumerator = ptr; - - if(msg.lParam == ALL_DEVICE_PROBE) - hr = probe_devices(Enumerator, eRender, &PlaybackDevices); - else if(msg.lParam == CAPTURE_DEVICE_PROBE) - hr = probe_devices(Enumerator, eCapture, &CaptureDevices); - - IMMDeviceEnumerator_Release(Enumerator); - Enumerator = NULL; - } - - if(--deviceCount == 0 && SUCCEEDED(cohr)) - CoUninitialize(); - - ReturnMsgResponse(req, hr); - continue; - - default: - ERR("Unexpected message: %u\n", msg.message); - continue; - } - } - TRACE("Message loop finished\n"); - - return 0; -} - - -typedef struct ALCwasapiPlayback { - DERIVE_FROM_TYPE(ALCbackend); - DERIVE_FROM_TYPE(ALCwasapiProxy); - - WCHAR *devid; - - IMMDevice *mmdev; - IAudioClient *client; - IAudioRenderClient *render; - HANDLE NotifyEvent; - - HANDLE MsgEvent; - - ATOMIC(UINT32) Padding; - - ATOMIC(int) killNow; - althrd_t thread; -} ALCwasapiPlayback; - -static int ALCwasapiPlayback_mixerProc(void *arg); - -static void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device); -static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self); -static ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *name); -static HRESULT ALCwasapiPlayback_openProxy(ALCwasapiPlayback *self); -static void ALCwasapiPlayback_closeProxy(ALCwasapiPlayback *self); -static ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self); -static HRESULT ALCwasapiPlayback_resetProxy(ALCwasapiPlayback *self); -static ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self); -static HRESULT ALCwasapiPlayback_startProxy(ALCwasapiPlayback *self); -static void ALCwasapiPlayback_stop(ALCwasapiPlayback *self); -static void ALCwasapiPlayback_stopProxy(ALCwasapiPlayback *self); -static DECLARE_FORWARD2(ALCwasapiPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) -static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, ALCuint, availableSamples) -static ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self); -static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCwasapiPlayback) - -DEFINE_ALCWASAPIPROXY_VTABLE(ALCwasapiPlayback); -DEFINE_ALCBACKEND_VTABLE(ALCwasapiPlayback); - - -static void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device) -{ - SET_VTABLE2(ALCwasapiPlayback, ALCbackend, self); - SET_VTABLE2(ALCwasapiPlayback, ALCwasapiProxy, self); - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - ALCwasapiProxy_Construct(STATIC_CAST(ALCwasapiProxy, self)); - - self->devid = NULL; - - self->mmdev = NULL; - self->client = NULL; - self->render = NULL; - self->NotifyEvent = NULL; - - self->MsgEvent = NULL; - - ATOMIC_INIT(&self->Padding, 0); - - ATOMIC_INIT(&self->killNow, 0); -} - -static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self) -{ - if(self->MsgEvent) - { - ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_CloseDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - (void)WaitForResponse(&req); - - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - } - - if(self->NotifyEvent) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - - free(self->devid); - self->devid = NULL; - - if(self->NotifyEvent != NULL) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - if(self->MsgEvent != NULL) - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - - free(self->devid); - self->devid = NULL; - - ALCwasapiProxy_Destruct(STATIC_CAST(ALCwasapiProxy, self)); - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -FORCE_ALIGN static int ALCwasapiPlayback_mixerProc(void *arg) -{ - ALCwasapiPlayback *self = arg; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - UINT32 buffer_len, written; - ALuint update_size, len; - BYTE *buffer; - HRESULT hr; - - hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if(FAILED(hr)) - { - ERR("CoInitializeEx(NULL, COINIT_MULTITHREADED) failed: 0x%08lx\n", hr); - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "COM init failed: 0x%08lx", hr); - V0(device->Backend,unlock)(); - return 1; - } - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - update_size = device->UpdateSize; - buffer_len = update_size * device->NumUpdates; - while(!ATOMIC_LOAD(&self->killNow, almemory_order_relaxed)) - { - hr = IAudioClient_GetCurrentPadding(self->client, &written); - if(FAILED(hr)) - { - ERR("Failed to get padding: 0x%08lx\n", hr); - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "Failed to retrieve buffer padding: 0x%08lx", hr); - V0(device->Backend,unlock)(); - break; - } - ATOMIC_STORE(&self->Padding, written, almemory_order_relaxed); - - len = buffer_len - written; - if(len < update_size) - { - DWORD res; - res = WaitForSingleObjectEx(self->NotifyEvent, 2000, FALSE); - if(res != WAIT_OBJECT_0) - ERR("WaitForSingleObjectEx error: 0x%lx\n", res); - continue; - } - len -= len%update_size; - - hr = IAudioRenderClient_GetBuffer(self->render, len, &buffer); - if(SUCCEEDED(hr)) - { - ALCwasapiPlayback_lock(self); - aluMixData(device, buffer, len); - ATOMIC_STORE(&self->Padding, written + len, almemory_order_relaxed); - ALCwasapiPlayback_unlock(self); - hr = IAudioRenderClient_ReleaseBuffer(self->render, len, 0); - } - if(FAILED(hr)) - { - ERR("Failed to buffer data: 0x%08lx\n", hr); - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "Failed to send playback samples: 0x%08lx", hr); - V0(device->Backend,unlock)(); - break; - } - } - ATOMIC_STORE(&self->Padding, 0, almemory_order_release); - - CoUninitialize(); - return 0; -} - - -static ALCboolean MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX *in) -{ - memset(out, 0, sizeof(*out)); - if(in->wFormatTag == WAVE_FORMAT_EXTENSIBLE) - *out = *(const WAVEFORMATEXTENSIBLE*)in; - else if(in->wFormatTag == WAVE_FORMAT_PCM) - { - out->Format = *in; - out->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - out->Format.cbSize = sizeof(*out) - sizeof(*in); - if(out->Format.nChannels == 1) - out->dwChannelMask = MONO; - else if(out->Format.nChannels == 2) - out->dwChannelMask = STEREO; - else - ERR("Unhandled PCM channel count: %d\n", out->Format.nChannels); - out->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - } - else if(in->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) - { - out->Format = *in; - out->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - out->Format.cbSize = sizeof(*out) - sizeof(*in); - if(out->Format.nChannels == 1) - out->dwChannelMask = MONO; - else if(out->Format.nChannels == 2) - out->dwChannelMask = STEREO; - else - ERR("Unhandled IEEE float channel count: %d\n", out->Format.nChannels); - out->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - } - else - { - ERR("Unhandled format tag: 0x%04x\n", in->wFormatTag); - return ALC_FALSE; - } - return ALC_TRUE; -} - -static ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *deviceName) -{ - HRESULT hr = S_OK; - - self->NotifyEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - self->MsgEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - if(self->NotifyEvent == NULL || self->MsgEvent == NULL) - { - ERR("Failed to create message events: %lu\n", GetLastError()); - hr = E_FAIL; - } - - if(SUCCEEDED(hr)) - { - if(deviceName) - { - const DevMap *iter; - - if(VECTOR_SIZE(PlaybackDevices) == 0) - { - ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_Enumerate, (WPARAM)&req, ALL_DEVICE_PROBE)) - (void)WaitForResponse(&req); - } - - hr = E_FAIL; -#define MATCH_NAME(i) (alstr_cmp_cstr((i)->name, deviceName) == 0 || \ - alstr_cmp_cstr((i)->endpoint_guid, deviceName) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(PlaybackDevices)) - { - int len; - if((len=MultiByteToWideChar(CP_UTF8, 0, deviceName, -1, NULL, 0)) > 0) - { - WCHAR *wname = calloc(sizeof(WCHAR), len); - MultiByteToWideChar(CP_UTF8, 0, deviceName, -1, wname, len); -#define MATCH_NAME(i) (wcscmp((i)->devid, wname) == 0) - VECTOR_FIND_IF(iter, const DevMap, PlaybackDevices, MATCH_NAME); -#undef MATCH_NAME - free(wname); - } - } - if(iter == VECTOR_END(PlaybackDevices)) - WARN("Failed to find device name matching \"%s\"\n", deviceName); - else - { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - self->devid = strdupW(iter->devid); - alstr_copy(&device->DeviceName, iter->name); - hr = S_OK; - } - } - } - - if(SUCCEEDED(hr)) - { - ThreadRequest req = { self->MsgEvent, 0 }; - - hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_OpenDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - hr = WaitForResponse(&req); - else - ERR("Failed to post thread message: %lu\n", GetLastError()); - } - - if(FAILED(hr)) - { - if(self->NotifyEvent != NULL) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - if(self->MsgEvent != NULL) - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - - free(self->devid); - self->devid = NULL; - - ERR("Device init failed: 0x%08lx\n", hr); - return ALC_INVALID_VALUE; - } - - return ALC_NO_ERROR; -} - -static HRESULT ALCwasapiPlayback_openProxy(ALCwasapiPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - void *ptr; - HRESULT hr; - - hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr); - if(SUCCEEDED(hr)) - { - IMMDeviceEnumerator *Enumerator = ptr; - if(!self->devid) - hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(Enumerator, eRender, eMultimedia, &self->mmdev); - else - hr = IMMDeviceEnumerator_GetDevice(Enumerator, self->devid, &self->mmdev); - IMMDeviceEnumerator_Release(Enumerator); - Enumerator = NULL; - } - if(SUCCEEDED(hr)) - hr = IMMDevice_Activate(self->mmdev, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, &ptr); - if(SUCCEEDED(hr)) - { - self->client = ptr; - if(alstr_empty(device->DeviceName)) - get_device_name_and_guid(self->mmdev, &device->DeviceName, NULL); - } - - if(FAILED(hr)) - { - if(self->mmdev) - IMMDevice_Release(self->mmdev); - self->mmdev = NULL; - } - - return hr; -} - - -static void ALCwasapiPlayback_closeProxy(ALCwasapiPlayback *self) -{ - if(self->client) - IAudioClient_Release(self->client); - self->client = NULL; - - if(self->mmdev) - IMMDevice_Release(self->mmdev); - self->mmdev = NULL; -} - - -static ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - HRESULT hr = E_FAIL; - - if(PostThreadMessage(ThreadID, WM_USER_ResetDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - hr = WaitForResponse(&req); - - return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE; -} - -static HRESULT ALCwasapiPlayback_resetProxy(ALCwasapiPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - EndpointFormFactor formfactor = UnknownFormFactor; - WAVEFORMATEXTENSIBLE OutputType; - WAVEFORMATEX *wfx = NULL; - REFERENCE_TIME min_per, buf_time; - UINT32 buffer_len, min_len; - void *ptr = NULL; - HRESULT hr; - - if(self->client) - IAudioClient_Release(self->client); - self->client = NULL; - - hr = IMMDevice_Activate(self->mmdev, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, &ptr); - if(FAILED(hr)) - { - ERR("Failed to reactivate audio client: 0x%08lx\n", hr); - return hr; - } - self->client = ptr; - - hr = IAudioClient_GetMixFormat(self->client, &wfx); - if(FAILED(hr)) - { - ERR("Failed to get mix format: 0x%08lx\n", hr); - return hr; - } - - if(!MakeExtensible(&OutputType, wfx)) - { - CoTaskMemFree(wfx); - return E_FAIL; - } - CoTaskMemFree(wfx); - wfx = NULL; - - buf_time = ScaleCeil(device->UpdateSize*device->NumUpdates, REFTIME_PER_SEC, - device->Frequency); - - if(!(device->Flags&DEVICE_FREQUENCY_REQUEST)) - device->Frequency = OutputType.Format.nSamplesPerSec; - if(!(device->Flags&DEVICE_CHANNELS_REQUEST)) - { - if(OutputType.Format.nChannels == 1 && OutputType.dwChannelMask == MONO) - device->FmtChans = DevFmtMono; - else if(OutputType.Format.nChannels == 2 && OutputType.dwChannelMask == STEREO) - device->FmtChans = DevFmtStereo; - else if(OutputType.Format.nChannels == 4 && OutputType.dwChannelMask == QUAD) - device->FmtChans = DevFmtQuad; - else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1) - device->FmtChans = DevFmtX51; - else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1REAR) - device->FmtChans = DevFmtX51Rear; - else if(OutputType.Format.nChannels == 7 && OutputType.dwChannelMask == X6DOT1) - device->FmtChans = DevFmtX61; - else if(OutputType.Format.nChannels == 8 && (OutputType.dwChannelMask == X7DOT1 || OutputType.dwChannelMask == X7DOT1_WIDE)) - device->FmtChans = DevFmtX71; - else - ERR("Unhandled channel config: %d -- 0x%08lx\n", OutputType.Format.nChannels, OutputType.dwChannelMask); - } - - switch(device->FmtChans) - { - case DevFmtMono: - OutputType.Format.nChannels = 1; - OutputType.dwChannelMask = MONO; - break; - case DevFmtAmbi3D: - device->FmtChans = DevFmtStereo; - /*fall-through*/ - case DevFmtStereo: - OutputType.Format.nChannels = 2; - OutputType.dwChannelMask = STEREO; - break; - case DevFmtQuad: - OutputType.Format.nChannels = 4; - OutputType.dwChannelMask = QUAD; - break; - case DevFmtX51: - OutputType.Format.nChannels = 6; - OutputType.dwChannelMask = X5DOT1; - break; - case DevFmtX51Rear: - OutputType.Format.nChannels = 6; - OutputType.dwChannelMask = X5DOT1REAR; - break; - case DevFmtX61: - OutputType.Format.nChannels = 7; - OutputType.dwChannelMask = X6DOT1; - break; - case DevFmtX71: - OutputType.Format.nChannels = 8; - OutputType.dwChannelMask = X7DOT1; - break; - } - switch(device->FmtType) - { - case DevFmtByte: - device->FmtType = DevFmtUByte; - /* fall-through */ - case DevFmtUByte: - OutputType.Format.wBitsPerSample = 8; - OutputType.Samples.wValidBitsPerSample = 8; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - break; - case DevFmtUShort: - device->FmtType = DevFmtShort; - /* fall-through */ - case DevFmtShort: - OutputType.Format.wBitsPerSample = 16; - OutputType.Samples.wValidBitsPerSample = 16; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - break; - case DevFmtUInt: - device->FmtType = DevFmtInt; - /* fall-through */ - case DevFmtInt: - OutputType.Format.wBitsPerSample = 32; - OutputType.Samples.wValidBitsPerSample = 32; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - break; - case DevFmtFloat: - OutputType.Format.wBitsPerSample = 32; - OutputType.Samples.wValidBitsPerSample = 32; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - break; - } - OutputType.Format.nSamplesPerSec = device->Frequency; - - OutputType.Format.nBlockAlign = OutputType.Format.nChannels * - OutputType.Format.wBitsPerSample / 8; - OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec * - OutputType.Format.nBlockAlign; - - hr = IAudioClient_IsFormatSupported(self->client, AUDCLNT_SHAREMODE_SHARED, &OutputType.Format, &wfx); - if(FAILED(hr)) - { - ERR("Failed to check format support: 0x%08lx\n", hr); - hr = IAudioClient_GetMixFormat(self->client, &wfx); - } - if(FAILED(hr)) - { - ERR("Failed to find a supported format: 0x%08lx\n", hr); - return hr; - } - - if(wfx != NULL) - { - if(!MakeExtensible(&OutputType, wfx)) - { - CoTaskMemFree(wfx); - return E_FAIL; - } - CoTaskMemFree(wfx); - wfx = NULL; - - device->Frequency = OutputType.Format.nSamplesPerSec; - if(OutputType.Format.nChannels == 1 && OutputType.dwChannelMask == MONO) - device->FmtChans = DevFmtMono; - else if(OutputType.Format.nChannels == 2 && OutputType.dwChannelMask == STEREO) - device->FmtChans = DevFmtStereo; - else if(OutputType.Format.nChannels == 4 && OutputType.dwChannelMask == QUAD) - device->FmtChans = DevFmtQuad; - else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1) - device->FmtChans = DevFmtX51; - else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1REAR) - device->FmtChans = DevFmtX51Rear; - else if(OutputType.Format.nChannels == 7 && OutputType.dwChannelMask == X6DOT1) - device->FmtChans = DevFmtX61; - else if(OutputType.Format.nChannels == 8 && (OutputType.dwChannelMask == X7DOT1 || OutputType.dwChannelMask == X7DOT1_WIDE)) - device->FmtChans = DevFmtX71; - else - { - ERR("Unhandled extensible channels: %d -- 0x%08lx\n", OutputType.Format.nChannels, OutputType.dwChannelMask); - device->FmtChans = DevFmtStereo; - OutputType.Format.nChannels = 2; - OutputType.dwChannelMask = STEREO; - } - - if(IsEqualGUID(&OutputType.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)) - { - if(OutputType.Format.wBitsPerSample == 8) - device->FmtType = DevFmtUByte; - else if(OutputType.Format.wBitsPerSample == 16) - device->FmtType = DevFmtShort; - else if(OutputType.Format.wBitsPerSample == 32) - device->FmtType = DevFmtInt; - else - { - device->FmtType = DevFmtShort; - OutputType.Format.wBitsPerSample = 16; - } - } - else if(IsEqualGUID(&OutputType.SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) - { - device->FmtType = DevFmtFloat; - OutputType.Format.wBitsPerSample = 32; - } - else - { - ERR("Unhandled format sub-type\n"); - device->FmtType = DevFmtShort; - OutputType.Format.wBitsPerSample = 16; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - } - OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample; - } - get_device_formfactor(self->mmdev, &formfactor); - device->IsHeadphones = (device->FmtChans == DevFmtStereo && - (formfactor == Headphones || formfactor == Headset) - ); - - SetDefaultWFXChannelOrder(device); - - hr = IAudioClient_Initialize(self->client, AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - buf_time, 0, &OutputType.Format, NULL); - if(FAILED(hr)) - { - ERR("Failed to initialize audio client: 0x%08lx\n", hr); - return hr; - } - - hr = IAudioClient_GetDevicePeriod(self->client, &min_per, NULL); - if(SUCCEEDED(hr)) - { - min_len = (UINT32)ScaleCeil(min_per, device->Frequency, REFTIME_PER_SEC); - /* Find the nearest multiple of the period size to the update size */ - if(min_len < device->UpdateSize) - min_len *= (device->UpdateSize + min_len/2)/min_len; - hr = IAudioClient_GetBufferSize(self->client, &buffer_len); - } - if(FAILED(hr)) - { - ERR("Failed to get audio buffer info: 0x%08lx\n", hr); - return hr; - } - - device->UpdateSize = min_len; - device->NumUpdates = buffer_len / device->UpdateSize; - if(device->NumUpdates <= 1) - { - ERR("Audio client returned buffer_len < period*2; expect break up\n"); - device->NumUpdates = 2; - device->UpdateSize = buffer_len / device->NumUpdates; - } - - hr = IAudioClient_SetEventHandle(self->client, self->NotifyEvent); - if(FAILED(hr)) - { - ERR("Failed to set event handle: 0x%08lx\n", hr); - return hr; - } - - return hr; -} - - -static ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - HRESULT hr = E_FAIL; - - if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - hr = WaitForResponse(&req); - - return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE; -} - -static HRESULT ALCwasapiPlayback_startProxy(ALCwasapiPlayback *self) -{ - HRESULT hr; - void *ptr; - - ResetEvent(self->NotifyEvent); - hr = IAudioClient_Start(self->client); - if(FAILED(hr)) - ERR("Failed to start audio client: 0x%08lx\n", hr); - - if(SUCCEEDED(hr)) - hr = IAudioClient_GetService(self->client, &IID_IAudioRenderClient, &ptr); - if(SUCCEEDED(hr)) - { - self->render = ptr; - ATOMIC_STORE(&self->killNow, 0, almemory_order_release); - if(althrd_create(&self->thread, ALCwasapiPlayback_mixerProc, self) != althrd_success) - { - if(self->render) - IAudioRenderClient_Release(self->render); - self->render = NULL; - IAudioClient_Stop(self->client); - ERR("Failed to start thread\n"); - hr = E_FAIL; - } - } - - return hr; -} - - -static void ALCwasapiPlayback_stop(ALCwasapiPlayback *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_StopDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - (void)WaitForResponse(&req); -} - -static void ALCwasapiPlayback_stopProxy(ALCwasapiPlayback *self) -{ - int res; - - if(!self->render) - return; - - ATOMIC_STORE_SEQ(&self->killNow, 1); - althrd_join(self->thread, &res); - - IAudioRenderClient_Release(self->render); - self->render = NULL; - IAudioClient_Stop(self->client); -} - - -static ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ClockLatency ret; - - ALCwasapiPlayback_lock(self); - ret.ClockTime = GetDeviceClockTime(device); - ret.Latency = ATOMIC_LOAD(&self->Padding, almemory_order_relaxed) * DEVICE_CLOCK_RES / - device->Frequency; - ALCwasapiPlayback_unlock(self); - - return ret; -} - - -typedef struct ALCwasapiCapture { - DERIVE_FROM_TYPE(ALCbackend); - DERIVE_FROM_TYPE(ALCwasapiProxy); - - WCHAR *devid; - - IMMDevice *mmdev; - IAudioClient *client; - IAudioCaptureClient *capture; - HANDLE NotifyEvent; - - HANDLE MsgEvent; - - ChannelConverter *ChannelConv; - SampleConverter *SampleConv; - ll_ringbuffer_t *Ring; - - ATOMIC(int) killNow; - althrd_t thread; -} ALCwasapiCapture; - -static int ALCwasapiCapture_recordProc(void *arg); - -static void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device); -static void ALCwasapiCapture_Destruct(ALCwasapiCapture *self); -static ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *name); -static HRESULT ALCwasapiCapture_openProxy(ALCwasapiCapture *self); -static void ALCwasapiCapture_closeProxy(ALCwasapiCapture *self); -static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ALCboolean, reset) -static HRESULT ALCwasapiCapture_resetProxy(ALCwasapiCapture *self); -static ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self); -static HRESULT ALCwasapiCapture_startProxy(ALCwasapiCapture *self); -static void ALCwasapiCapture_stop(ALCwasapiCapture *self); -static void ALCwasapiCapture_stopProxy(ALCwasapiCapture *self); -static ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples); -static ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self); -static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCwasapiCapture) - -DEFINE_ALCWASAPIPROXY_VTABLE(ALCwasapiCapture); -DEFINE_ALCBACKEND_VTABLE(ALCwasapiCapture); - - -static void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device) -{ - SET_VTABLE2(ALCwasapiCapture, ALCbackend, self); - SET_VTABLE2(ALCwasapiCapture, ALCwasapiProxy, self); - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - ALCwasapiProxy_Construct(STATIC_CAST(ALCwasapiProxy, self)); - - self->devid = NULL; - - self->mmdev = NULL; - self->client = NULL; - self->capture = NULL; - self->NotifyEvent = NULL; - - self->MsgEvent = NULL; - - self->ChannelConv = NULL; - self->SampleConv = NULL; - self->Ring = NULL; - - ATOMIC_INIT(&self->killNow, 0); -} - -static void ALCwasapiCapture_Destruct(ALCwasapiCapture *self) -{ - if(self->MsgEvent) - { - ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_CloseDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - (void)WaitForResponse(&req); - - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - } - - if(self->NotifyEvent != NULL) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - DestroySampleConverter(&self->SampleConv); - DestroyChannelConverter(&self->ChannelConv); - - free(self->devid); - self->devid = NULL; - - ALCwasapiProxy_Destruct(STATIC_CAST(ALCwasapiProxy, self)); - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -FORCE_ALIGN int ALCwasapiCapture_recordProc(void *arg) -{ - ALCwasapiCapture *self = arg; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALfloat *samples = NULL; - size_t samplesmax = 0; - HRESULT hr; - - hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if(FAILED(hr)) - { - ERR("CoInitializeEx(NULL, COINIT_MULTITHREADED) failed: 0x%08lx\n", hr); - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "COM init failed: 0x%08lx", hr); - V0(device->Backend,unlock)(); - return 1; - } - - althrd_setname(althrd_current(), RECORD_THREAD_NAME); - - while(!ATOMIC_LOAD(&self->killNow, almemory_order_relaxed)) - { - UINT32 avail; - DWORD res; - - hr = IAudioCaptureClient_GetNextPacketSize(self->capture, &avail); - if(FAILED(hr)) - ERR("Failed to get next packet size: 0x%08lx\n", hr); - else if(avail > 0) - { - UINT32 numsamples; - DWORD flags; - BYTE *rdata; - - hr = IAudioCaptureClient_GetBuffer(self->capture, - &rdata, &numsamples, &flags, NULL, NULL - ); - if(FAILED(hr)) - ERR("Failed to get capture buffer: 0x%08lx\n", hr); - else - { - ll_ringbuffer_data_t data[2]; - size_t dstframes = 0; - - if(self->ChannelConv) - { - if(samplesmax < numsamples) - { - size_t newmax = RoundUp(numsamples, 4096); - ALfloat *tmp = al_calloc(DEF_ALIGN, newmax*2*sizeof(ALfloat)); - al_free(samples); - samples = tmp; - samplesmax = newmax; - } - ChannelConverterInput(self->ChannelConv, rdata, samples, numsamples); - rdata = (BYTE*)samples; - } - - ll_ringbuffer_get_write_vector(self->Ring, data); - - if(self->SampleConv) - { - const ALvoid *srcdata = rdata; - ALsizei srcframes = numsamples; - - dstframes = SampleConverterInput(self->SampleConv, - &srcdata, &srcframes, data[0].buf, (ALsizei)minz(data[0].len, INT_MAX) - ); - if(srcframes > 0 && dstframes == data[0].len && data[1].len > 0) - { - /* If some source samples remain, all of the first dest - * block was filled, and there's space in the second - * dest block, do another run for the second block. - */ - dstframes += SampleConverterInput(self->SampleConv, - &srcdata, &srcframes, data[1].buf, (ALsizei)minz(data[1].len, INT_MAX) - ); - } - } - else - { - ALuint framesize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, - device->AmbiOrder); - size_t len1 = minz(data[0].len, numsamples); - size_t len2 = minz(data[1].len, numsamples-len1); - - memcpy(data[0].buf, rdata, len1*framesize); - if(len2 > 0) - memcpy(data[1].buf, rdata+len1*framesize, len2*framesize); - dstframes = len1 + len2; - } - - ll_ringbuffer_write_advance(self->Ring, dstframes); - - hr = IAudioCaptureClient_ReleaseBuffer(self->capture, numsamples); - if(FAILED(hr)) ERR("Failed to release capture buffer: 0x%08lx\n", hr); - } - } - - if(FAILED(hr)) - { - V0(device->Backend,lock)(); - aluHandleDisconnect(device, "Failed to capture samples: 0x%08lx", hr); - V0(device->Backend,unlock)(); - break; - } - - res = WaitForSingleObjectEx(self->NotifyEvent, 2000, FALSE); - if(res != WAIT_OBJECT_0) - ERR("WaitForSingleObjectEx error: 0x%lx\n", res); - } - - al_free(samples); - samples = NULL; - samplesmax = 0; - - CoUninitialize(); - return 0; -} - - -static ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *deviceName) -{ - HRESULT hr = S_OK; - - self->NotifyEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - self->MsgEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - if(self->NotifyEvent == NULL || self->MsgEvent == NULL) - { - ERR("Failed to create message events: %lu\n", GetLastError()); - hr = E_FAIL; - } - - if(SUCCEEDED(hr)) - { - if(deviceName) - { - const DevMap *iter; - - if(VECTOR_SIZE(CaptureDevices) == 0) - { - ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_Enumerate, (WPARAM)&req, CAPTURE_DEVICE_PROBE)) - (void)WaitForResponse(&req); - } - - hr = E_FAIL; -#define MATCH_NAME(i) (alstr_cmp_cstr((i)->name, deviceName) == 0 || \ - alstr_cmp_cstr((i)->endpoint_guid, deviceName) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_NAME); -#undef MATCH_NAME - if(iter == VECTOR_END(CaptureDevices)) - { - int len; - if((len=MultiByteToWideChar(CP_UTF8, 0, deviceName, -1, NULL, 0)) > 0) - { - WCHAR *wname = calloc(sizeof(WCHAR), len); - MultiByteToWideChar(CP_UTF8, 0, deviceName, -1, wname, len); -#define MATCH_NAME(i) (wcscmp((i)->devid, wname) == 0) - VECTOR_FIND_IF(iter, const DevMap, CaptureDevices, MATCH_NAME); -#undef MATCH_NAME - free(wname); - } - } - if(iter == VECTOR_END(CaptureDevices)) - WARN("Failed to find device name matching \"%s\"\n", deviceName); - else - { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - self->devid = strdupW(iter->devid); - alstr_copy(&device->DeviceName, iter->name); - hr = S_OK; - } - } - } - - if(SUCCEEDED(hr)) - { - ThreadRequest req = { self->MsgEvent, 0 }; - - hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_OpenDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - hr = WaitForResponse(&req); - else - ERR("Failed to post thread message: %lu\n", GetLastError()); - } - - if(FAILED(hr)) - { - if(self->NotifyEvent != NULL) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - if(self->MsgEvent != NULL) - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - - free(self->devid); - self->devid = NULL; - - ERR("Device init failed: 0x%08lx\n", hr); - return ALC_INVALID_VALUE; - } - else - { - ThreadRequest req = { self->MsgEvent, 0 }; - - hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_ResetDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - hr = WaitForResponse(&req); - else - ERR("Failed to post thread message: %lu\n", GetLastError()); - - if(FAILED(hr)) - { - if(hr == E_OUTOFMEMORY) - return ALC_OUT_OF_MEMORY; - return ALC_INVALID_VALUE; - } - } - - return ALC_NO_ERROR; -} - -static HRESULT ALCwasapiCapture_openProxy(ALCwasapiCapture *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - void *ptr; - HRESULT hr; - - hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr); - if(SUCCEEDED(hr)) - { - IMMDeviceEnumerator *Enumerator = ptr; - if(!self->devid) - hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(Enumerator, eCapture, eMultimedia, &self->mmdev); - else - hr = IMMDeviceEnumerator_GetDevice(Enumerator, self->devid, &self->mmdev); - IMMDeviceEnumerator_Release(Enumerator); - Enumerator = NULL; - } - if(SUCCEEDED(hr)) - hr = IMMDevice_Activate(self->mmdev, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, &ptr); - if(SUCCEEDED(hr)) - { - self->client = ptr; - if(alstr_empty(device->DeviceName)) - get_device_name_and_guid(self->mmdev, &device->DeviceName, NULL); - } - - if(FAILED(hr)) - { - if(self->mmdev) - IMMDevice_Release(self->mmdev); - self->mmdev = NULL; - } - - return hr; -} - - -static void ALCwasapiCapture_closeProxy(ALCwasapiCapture *self) -{ - if(self->client) - IAudioClient_Release(self->client); - self->client = NULL; - - if(self->mmdev) - IMMDevice_Release(self->mmdev); - self->mmdev = NULL; -} - - -static HRESULT ALCwasapiCapture_resetProxy(ALCwasapiCapture *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - WAVEFORMATEXTENSIBLE OutputType; - WAVEFORMATEX *wfx = NULL; - enum DevFmtType srcType; - REFERENCE_TIME buf_time; - UINT32 buffer_len; - void *ptr = NULL; - HRESULT hr; - - if(self->client) - IAudioClient_Release(self->client); - self->client = NULL; - - hr = IMMDevice_Activate(self->mmdev, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, &ptr); - if(FAILED(hr)) - { - ERR("Failed to reactivate audio client: 0x%08lx\n", hr); - return hr; - } - self->client = ptr; - - buf_time = ScaleCeil(device->UpdateSize*device->NumUpdates, REFTIME_PER_SEC, - device->Frequency); - // Make sure buffer is at least 100ms in size - buf_time = maxu64(buf_time, REFTIME_PER_SEC/10); - device->UpdateSize = (ALuint)ScaleCeil(buf_time, device->Frequency, REFTIME_PER_SEC) / - device->NumUpdates; - - OutputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - switch(device->FmtChans) - { - case DevFmtMono: - OutputType.Format.nChannels = 1; - OutputType.dwChannelMask = MONO; - break; - case DevFmtStereo: - OutputType.Format.nChannels = 2; - OutputType.dwChannelMask = STEREO; - break; - case DevFmtQuad: - OutputType.Format.nChannels = 4; - OutputType.dwChannelMask = QUAD; - break; - case DevFmtX51: - OutputType.Format.nChannels = 6; - OutputType.dwChannelMask = X5DOT1; - break; - case DevFmtX51Rear: - OutputType.Format.nChannels = 6; - OutputType.dwChannelMask = X5DOT1REAR; - break; - case DevFmtX61: - OutputType.Format.nChannels = 7; - OutputType.dwChannelMask = X6DOT1; - break; - case DevFmtX71: - OutputType.Format.nChannels = 8; - OutputType.dwChannelMask = X7DOT1; - break; - - case DevFmtAmbi3D: - return E_FAIL; - } - switch(device->FmtType) - { - /* NOTE: Signedness doesn't matter, the converter will handle it. */ - case DevFmtByte: - case DevFmtUByte: - OutputType.Format.wBitsPerSample = 8; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - break; - case DevFmtShort: - case DevFmtUShort: - OutputType.Format.wBitsPerSample = 16; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - break; - case DevFmtInt: - case DevFmtUInt: - OutputType.Format.wBitsPerSample = 32; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - break; - case DevFmtFloat: - OutputType.Format.wBitsPerSample = 32; - OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - break; - } - OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample; - OutputType.Format.nSamplesPerSec = device->Frequency; - - OutputType.Format.nBlockAlign = OutputType.Format.nChannels * - OutputType.Format.wBitsPerSample / 8; - OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec * - OutputType.Format.nBlockAlign; - OutputType.Format.cbSize = sizeof(OutputType) - sizeof(OutputType.Format); - - hr = IAudioClient_IsFormatSupported(self->client, - AUDCLNT_SHAREMODE_SHARED, &OutputType.Format, &wfx - ); - if(FAILED(hr)) - { - ERR("Failed to check format support: 0x%08lx\n", hr); - return hr; - } - - DestroySampleConverter(&self->SampleConv); - DestroyChannelConverter(&self->ChannelConv); - - if(wfx != NULL) - { - if(!(wfx->nChannels == OutputType.Format.nChannels || - (wfx->nChannels == 1 && OutputType.Format.nChannels == 2) || - (wfx->nChannels == 2 && OutputType.Format.nChannels == 1))) - { - ERR("Failed to get matching format, wanted: %s %s %uhz, got: %d channel%s %d-bit %luhz\n", - DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), - device->Frequency, wfx->nChannels, (wfx->nChannels==1)?"":"s", wfx->wBitsPerSample, - wfx->nSamplesPerSec); - CoTaskMemFree(wfx); - return E_FAIL; - } - - if(!MakeExtensible(&OutputType, wfx)) - { - CoTaskMemFree(wfx); - return E_FAIL; - } - CoTaskMemFree(wfx); - wfx = NULL; - } - - if(IsEqualGUID(&OutputType.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)) - { - if(OutputType.Format.wBitsPerSample == 8) - srcType = DevFmtUByte; - else if(OutputType.Format.wBitsPerSample == 16) - srcType = DevFmtShort; - else if(OutputType.Format.wBitsPerSample == 32) - srcType = DevFmtInt; - else - { - ERR("Unhandled integer bit depth: %d\n", OutputType.Format.wBitsPerSample); - return E_FAIL; - } - } - else if(IsEqualGUID(&OutputType.SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) - { - if(OutputType.Format.wBitsPerSample == 32) - srcType = DevFmtFloat; - else - { - ERR("Unhandled float bit depth: %d\n", OutputType.Format.wBitsPerSample); - return E_FAIL; - } - } - else - { - ERR("Unhandled format sub-type\n"); - return E_FAIL; - } - - if(device->FmtChans == DevFmtMono && OutputType.Format.nChannels == 2) - { - self->ChannelConv = CreateChannelConverter(srcType, DevFmtStereo, - device->FmtChans); - if(!self->ChannelConv) - { - ERR("Failed to create %s stereo-to-mono converter\n", DevFmtTypeString(srcType)); - return E_FAIL; - } - TRACE("Created %s stereo-to-mono converter\n", DevFmtTypeString(srcType)); - /* The channel converter always outputs float, so change the input type - * for the resampler/type-converter. - */ - srcType = DevFmtFloat; - } - else if(device->FmtChans == DevFmtStereo && OutputType.Format.nChannels == 1) - { - self->ChannelConv = CreateChannelConverter(srcType, DevFmtMono, - device->FmtChans); - if(!self->ChannelConv) - { - ERR("Failed to create %s mono-to-stereo converter\n", DevFmtTypeString(srcType)); - return E_FAIL; - } - TRACE("Created %s mono-to-stereo converter\n", DevFmtTypeString(srcType)); - srcType = DevFmtFloat; - } - - if(device->Frequency != OutputType.Format.nSamplesPerSec || device->FmtType != srcType) - { - self->SampleConv = CreateSampleConverter( - srcType, device->FmtType, ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder), - OutputType.Format.nSamplesPerSec, device->Frequency - ); - if(!self->SampleConv) - { - ERR("Failed to create converter for %s format, dst: %s %uhz, src: %s %luhz\n", - DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), - device->Frequency, DevFmtTypeString(srcType), OutputType.Format.nSamplesPerSec); - return E_FAIL; - } - TRACE("Created converter for %s format, dst: %s %uhz, src: %s %luhz\n", - DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), - device->Frequency, DevFmtTypeString(srcType), OutputType.Format.nSamplesPerSec); - } - - hr = IAudioClient_Initialize(self->client, - AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - buf_time, 0, &OutputType.Format, NULL - ); - if(FAILED(hr)) - { - ERR("Failed to initialize audio client: 0x%08lx\n", hr); - return hr; - } - - hr = IAudioClient_GetBufferSize(self->client, &buffer_len); - if(FAILED(hr)) - { - ERR("Failed to get buffer size: 0x%08lx\n", hr); - return hr; - } - - buffer_len = maxu(device->UpdateSize*device->NumUpdates, buffer_len); - ll_ringbuffer_free(self->Ring); - self->Ring = ll_ringbuffer_create(buffer_len, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), - false - ); - if(!self->Ring) - { - ERR("Failed to allocate capture ring buffer\n"); - return E_OUTOFMEMORY; - } - - hr = IAudioClient_SetEventHandle(self->client, self->NotifyEvent); - if(FAILED(hr)) - { - ERR("Failed to set event handle: 0x%08lx\n", hr); - return hr; - } - - return hr; -} - - -static ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - HRESULT hr = E_FAIL; - - if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - hr = WaitForResponse(&req); - - return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE; -} - -static HRESULT ALCwasapiCapture_startProxy(ALCwasapiCapture *self) -{ - HRESULT hr; - void *ptr; - - ResetEvent(self->NotifyEvent); - hr = IAudioClient_Start(self->client); - if(FAILED(hr)) - { - ERR("Failed to start audio client: 0x%08lx\n", hr); - return hr; - } - - hr = IAudioClient_GetService(self->client, &IID_IAudioCaptureClient, &ptr); - if(SUCCEEDED(hr)) - { - self->capture = ptr; - ATOMIC_STORE(&self->killNow, 0, almemory_order_release); - if(althrd_create(&self->thread, ALCwasapiCapture_recordProc, self) != althrd_success) - { - ERR("Failed to start thread\n"); - IAudioCaptureClient_Release(self->capture); - self->capture = NULL; - hr = E_FAIL; - } - } - - if(FAILED(hr)) - { - IAudioClient_Stop(self->client); - IAudioClient_Reset(self->client); - } - - return hr; -} - - -static void ALCwasapiCapture_stop(ALCwasapiCapture *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_StopDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) - (void)WaitForResponse(&req); -} - -static void ALCwasapiCapture_stopProxy(ALCwasapiCapture *self) -{ - int res; - - if(!self->capture) - return; - - ATOMIC_STORE_SEQ(&self->killNow, 1); - althrd_join(self->thread, &res); - - IAudioCaptureClient_Release(self->capture); - self->capture = NULL; - IAudioClient_Stop(self->client); - IAudioClient_Reset(self->client); -} - - -ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self) -{ - return (ALuint)ll_ringbuffer_read_space(self->Ring); -} - -ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples) -{ - if(ALCwasapiCapture_availableSamples(self) < samples) - return ALC_INVALID_VALUE; - ll_ringbuffer_read(self->Ring, buffer, samples); - return ALC_NO_ERROR; -} - - -static inline void AppendAllDevicesList2(const DevMap *entry) -{ AppendAllDevicesList(alstr_get_cstr(entry->name)); } -static inline void AppendCaptureDeviceList2(const DevMap *entry) -{ AppendCaptureDeviceList(alstr_get_cstr(entry->name)); } - -typedef struct ALCwasapiBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCwasapiBackendFactory; -#define ALCWASAPIBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCwasapiBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory *self); -static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory *self); -static ALCboolean ALCwasapiBackendFactory_querySupport(ALCwasapiBackendFactory *self, ALCbackend_Type type); -static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory *self, ALCdevice *device, ALCbackend_Type type); - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwasapiBackendFactory); - - -static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory* UNUSED(self)) -{ - static HRESULT InitResult; - - VECTOR_INIT(PlaybackDevices); - VECTOR_INIT(CaptureDevices); - - if(!ThreadHdl) - { - ThreadRequest req; - InitResult = E_FAIL; - - req.FinishedEvt = CreateEventW(NULL, FALSE, FALSE, NULL); - if(req.FinishedEvt == NULL) - ERR("Failed to create event: %lu\n", GetLastError()); - else - { - ThreadHdl = CreateThread(NULL, 0, ALCwasapiProxy_messageHandler, &req, 0, &ThreadID); - if(ThreadHdl != NULL) - InitResult = WaitForResponse(&req); - CloseHandle(req.FinishedEvt); - } - } - - return SUCCEEDED(InitResult) ? ALC_TRUE : ALC_FALSE; -} - -static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory* UNUSED(self)) -{ - clear_devlist(&PlaybackDevices); - VECTOR_DEINIT(PlaybackDevices); - - clear_devlist(&CaptureDevices); - VECTOR_DEINIT(CaptureDevices); - - if(ThreadHdl) - { - TRACE("Sending WM_QUIT to Thread %04lx\n", ThreadID); - PostThreadMessage(ThreadID, WM_QUIT, 0, 0); - CloseHandle(ThreadHdl); - ThreadHdl = NULL; - } -} - -static ALCboolean ALCwasapiBackendFactory_querySupport(ALCwasapiBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory* UNUSED(self), enum DevProbe type) -{ - ThreadRequest req = { NULL, 0 }; - - req.FinishedEvt = CreateEventW(NULL, FALSE, FALSE, NULL); - if(req.FinishedEvt == NULL) - ERR("Failed to create event: %lu\n", GetLastError()); - else - { - HRESULT hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_Enumerate, (WPARAM)&req, type)) - hr = WaitForResponse(&req); - if(SUCCEEDED(hr)) switch(type) - { - case ALL_DEVICE_PROBE: - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, AppendAllDevicesList2); - break; - - case CAPTURE_DEVICE_PROBE: - VECTOR_FOR_EACH(const DevMap, CaptureDevices, AppendCaptureDeviceList2); - break; - } - CloseHandle(req.FinishedEvt); - req.FinishedEvt = NULL; - } -} - -static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCwasapiPlayback *backend; - NEW_OBJ(backend, ALCwasapiPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCwasapiCapture *backend; - NEW_OBJ(backend, ALCwasapiCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - - -ALCbackendFactory *ALCwasapiBackendFactory_getFactory(void) -{ - static ALCwasapiBackendFactory factory = ALCWASAPIBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/backends/wave.c b/Alc/backends/wave.c deleted file mode 100644 index 557c2bf..0000000 --- a/Alc/backends/wave.c +++ /dev/null @@ -1,453 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alconfig.h" -#include "threads.h" -#include "compat.h" - -#include "backends/base.h" - - -static const ALCchar waveDevice[] = "Wave File Writer"; - -static const ALubyte SUBTYPE_PCM[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, - 0x00, 0x38, 0x9b, 0x71 -}; -static const ALubyte SUBTYPE_FLOAT[] = { - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, - 0x00, 0x38, 0x9b, 0x71 -}; - -static const ALubyte SUBTYPE_BFORMAT_PCM[] = { - 0x01, 0x00, 0x00, 0x00, 0x21, 0x07, 0xd3, 0x11, 0x86, 0x44, 0xc8, 0xc1, - 0xca, 0x00, 0x00, 0x00 -}; - -static const ALubyte SUBTYPE_BFORMAT_FLOAT[] = { - 0x03, 0x00, 0x00, 0x00, 0x21, 0x07, 0xd3, 0x11, 0x86, 0x44, 0xc8, 0xc1, - 0xca, 0x00, 0x00, 0x00 -}; - -static void fwrite16le(ALushort val, FILE *f) -{ - ALubyte data[2] = { val&0xff, (val>>8)&0xff }; - fwrite(data, 1, 2, f); -} - -static void fwrite32le(ALuint val, FILE *f) -{ - ALubyte data[4] = { val&0xff, (val>>8)&0xff, (val>>16)&0xff, (val>>24)&0xff }; - fwrite(data, 1, 4, f); -} - - -typedef struct ALCwaveBackend { - DERIVE_FROM_TYPE(ALCbackend); - - FILE *mFile; - long mDataStart; - - ALvoid *mBuffer; - ALuint mSize; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCwaveBackend; - -static int ALCwaveBackend_mixerProc(void *ptr); - -static void ALCwaveBackend_Construct(ALCwaveBackend *self, ALCdevice *device); -static void ALCwaveBackend_Destruct(ALCwaveBackend *self); -static ALCenum ALCwaveBackend_open(ALCwaveBackend *self, const ALCchar *name); -static ALCboolean ALCwaveBackend_reset(ALCwaveBackend *self); -static ALCboolean ALCwaveBackend_start(ALCwaveBackend *self); -static void ALCwaveBackend_stop(ALCwaveBackend *self); -static DECLARE_FORWARD2(ALCwaveBackend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCwaveBackend, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCwaveBackend, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCwaveBackend, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCwaveBackend, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCwaveBackend) - -DEFINE_ALCBACKEND_VTABLE(ALCwaveBackend); - - -static void ALCwaveBackend_Construct(ALCwaveBackend *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCwaveBackend, ALCbackend, self); - - self->mFile = NULL; - self->mDataStart = -1; - - self->mBuffer = NULL; - self->mSize = 0; - - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCwaveBackend_Destruct(ALCwaveBackend *self) -{ - if(self->mFile) - fclose(self->mFile); - self->mFile = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - -static int ALCwaveBackend_mixerProc(void *ptr) -{ - ALCwaveBackend *self = (ALCwaveBackend*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - struct timespec now, start; - ALint64 avail, done; - ALuint frameSize; - size_t fs; - const long restTime = (long)((ALuint64)device->UpdateSize * 1000000000 / - device->Frequency / 2); - - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - done = 0; - if(altimespec_get(&start, AL_TIME_UTC) != AL_TIME_UTC) - { - ERR("Failed to get starting time\n"); - return 1; - } - while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && - ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - if(altimespec_get(&now, AL_TIME_UTC) != AL_TIME_UTC) - { - ERR("Failed to get current time\n"); - return 1; - } - - avail = (now.tv_sec - start.tv_sec) * device->Frequency; - avail += (ALint64)(now.tv_nsec - start.tv_nsec) * device->Frequency / 1000000000; - if(avail < done) - { - /* Oops, time skipped backwards. Reset the number of samples done - * with one update available since we (likely) just came back from - * sleeping. */ - done = avail - device->UpdateSize; - } - - if(avail-done < device->UpdateSize) - al_nssleep(restTime); - else while(avail-done >= device->UpdateSize) - { - ALCwaveBackend_lock(self); - aluMixData(device, self->mBuffer, device->UpdateSize); - ALCwaveBackend_unlock(self); - done += device->UpdateSize; - - if(!IS_LITTLE_ENDIAN) - { - ALuint bytesize = BytesFromDevFmt(device->FmtType); - ALuint i; - - if(bytesize == 2) - { - ALushort *samples = self->mBuffer; - ALuint len = self->mSize / 2; - for(i = 0;i < len;i++) - { - ALushort samp = samples[i]; - samples[i] = (samp>>8) | (samp<<8); - } - } - else if(bytesize == 4) - { - ALuint *samples = self->mBuffer; - ALuint len = self->mSize / 4; - for(i = 0;i < len;i++) - { - ALuint samp = samples[i]; - samples[i] = (samp>>24) | ((samp>>8)&0x0000ff00) | - ((samp<<8)&0x00ff0000) | (samp<<24); - } - } - } - - fs = fwrite(self->mBuffer, frameSize, device->UpdateSize, self->mFile); - (void)fs; - if(ferror(self->mFile)) - { - ERR("Error writing to file\n"); - ALCdevice_Lock(device); - aluHandleDisconnect(device, "Failed to write playback samples"); - ALCdevice_Unlock(device); - break; - } - } - } - - return 0; -} - - -static ALCenum ALCwaveBackend_open(ALCwaveBackend *self, const ALCchar *name) -{ - ALCdevice *device; - const char *fname; - - fname = GetConfigValue(NULL, "wave", "file", ""); - if(!fname[0]) return ALC_INVALID_VALUE; - - if(!name) - name = waveDevice; - else if(strcmp(name, waveDevice) != 0) - return ALC_INVALID_VALUE; - - self->mFile = al_fopen(fname, "wb"); - if(!self->mFile) - { - ERR("Could not open file '%s': %s\n", fname, strerror(errno)); - return ALC_INVALID_VALUE; - } - - device = STATIC_CAST(ALCbackend, self)->mDevice; - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static ALCboolean ALCwaveBackend_reset(ALCwaveBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALuint channels=0, bits=0, chanmask=0; - int isbformat = 0; - size_t val; - - fseek(self->mFile, 0, SEEK_SET); - clearerr(self->mFile); - - if(GetConfigValueBool(NULL, "wave", "bformat", 0)) - { - device->FmtChans = DevFmtAmbi3D; - device->AmbiOrder = 1; - } - - switch(device->FmtType) - { - case DevFmtByte: - device->FmtType = DevFmtUByte; - break; - case DevFmtUShort: - device->FmtType = DevFmtShort; - break; - case DevFmtUInt: - device->FmtType = DevFmtInt; - break; - case DevFmtUByte: - case DevFmtShort: - case DevFmtInt: - case DevFmtFloat: - break; - } - switch(device->FmtChans) - { - case DevFmtMono: chanmask = 0x04; break; - case DevFmtStereo: chanmask = 0x01 | 0x02; break; - case DevFmtQuad: chanmask = 0x01 | 0x02 | 0x10 | 0x20; break; - case DevFmtX51: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x200 | 0x400; break; - case DevFmtX51Rear: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x010 | 0x020; break; - case DevFmtX61: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x100 | 0x200 | 0x400; break; - case DevFmtX71: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x010 | 0x020 | 0x200 | 0x400; break; - case DevFmtAmbi3D: - /* .amb output requires FuMa */ - device->AmbiLayout = AmbiLayout_FuMa; - device->AmbiScale = AmbiNorm_FuMa; - isbformat = 1; - chanmask = 0; - break; - } - bits = BytesFromDevFmt(device->FmtType) * 8; - channels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - - fputs("RIFF", self->mFile); - fwrite32le(0xFFFFFFFF, self->mFile); // 'RIFF' header len; filled in at close - - fputs("WAVE", self->mFile); - - fputs("fmt ", self->mFile); - fwrite32le(40, self->mFile); // 'fmt ' header len; 40 bytes for EXTENSIBLE - - // 16-bit val, format type id (extensible: 0xFFFE) - fwrite16le(0xFFFE, self->mFile); - // 16-bit val, channel count - fwrite16le(channels, self->mFile); - // 32-bit val, frequency - fwrite32le(device->Frequency, self->mFile); - // 32-bit val, bytes per second - fwrite32le(device->Frequency * channels * bits / 8, self->mFile); - // 16-bit val, frame size - fwrite16le(channels * bits / 8, self->mFile); - // 16-bit val, bits per sample - fwrite16le(bits, self->mFile); - // 16-bit val, extra byte count - fwrite16le(22, self->mFile); - // 16-bit val, valid bits per sample - fwrite16le(bits, self->mFile); - // 32-bit val, channel mask - fwrite32le(chanmask, self->mFile); - // 16 byte GUID, sub-type format - val = fwrite((device->FmtType == DevFmtFloat) ? - (isbformat ? SUBTYPE_BFORMAT_FLOAT : SUBTYPE_FLOAT) : - (isbformat ? SUBTYPE_BFORMAT_PCM : SUBTYPE_PCM), 1, 16, self->mFile); - (void)val; - - fputs("data", self->mFile); - fwrite32le(0xFFFFFFFF, self->mFile); // 'data' header len; filled in at close - - if(ferror(self->mFile)) - { - ERR("Error writing header: %s\n", strerror(errno)); - return ALC_FALSE; - } - self->mDataStart = ftell(self->mFile); - - SetDefaultWFXChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCwaveBackend_start(ALCwaveBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - self->mSize = device->UpdateSize * FrameSizeFromDevFmt( - device->FmtChans, device->FmtType, device->AmbiOrder - ); - self->mBuffer = malloc(self->mSize); - if(!self->mBuffer) - { - ERR("Buffer malloc failed\n"); - return ALC_FALSE; - } - - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCwaveBackend_mixerProc, self) != althrd_success) - { - free(self->mBuffer); - self->mBuffer = NULL; - self->mSize = 0; - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCwaveBackend_stop(ALCwaveBackend *self) -{ - ALuint dataLen; - long size; - int res; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - althrd_join(self->thread, &res); - - free(self->mBuffer); - self->mBuffer = NULL; - - size = ftell(self->mFile); - if(size > 0) - { - dataLen = size - self->mDataStart; - if(fseek(self->mFile, self->mDataStart-4, SEEK_SET) == 0) - fwrite32le(dataLen, self->mFile); // 'data' header len - if(fseek(self->mFile, 4, SEEK_SET) == 0) - fwrite32le(size-8, self->mFile); // 'WAVE' header len - } -} - - -typedef struct ALCwaveBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCwaveBackendFactory; -#define ALCWAVEBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCwaveBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCwaveBackendFactory_getFactory(void); - -static ALCboolean ALCwaveBackendFactory_init(ALCwaveBackendFactory *self); -static DECLARE_FORWARD(ALCwaveBackendFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCwaveBackendFactory_querySupport(ALCwaveBackendFactory *self, ALCbackend_Type type); -static void ALCwaveBackendFactory_probe(ALCwaveBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCwaveBackendFactory_createBackend(ALCwaveBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwaveBackendFactory); - - -ALCbackendFactory *ALCwaveBackendFactory_getFactory(void) -{ - static ALCwaveBackendFactory factory = ALCWAVEBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCwaveBackendFactory_init(ALCwaveBackendFactory* UNUSED(self)) -{ - return ALC_TRUE; -} - -static ALCboolean ALCwaveBackendFactory_querySupport(ALCwaveBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return !!ConfigValueExists(NULL, "wave", "file"); - return ALC_FALSE; -} - -static void ALCwaveBackendFactory_probe(ALCwaveBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(waveDevice); - break; - case CAPTURE_DEVICE_PROBE: - break; - } -} - -static ALCbackend* ALCwaveBackendFactory_createBackend(ALCwaveBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCwaveBackend *backend; - NEW_OBJ(backend, ALCwaveBackend)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/winmm.c b/Alc/backends/winmm.c deleted file mode 100644 index 2f4c65d..0000000 --- a/Alc/backends/winmm.c +++ /dev/null @@ -1,792 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "ringbuffer.h" -#include "threads.h" - -#include "backends/base.h" - -#ifndef WAVE_FORMAT_IEEE_FLOAT -#define WAVE_FORMAT_IEEE_FLOAT 0x0003 -#endif - -#define DEVNAME_HEAD "OpenAL Soft on " - - -static vector_al_string PlaybackDevices; -static vector_al_string CaptureDevices; - -static void clear_devlist(vector_al_string *list) -{ - VECTOR_FOR_EACH(al_string, *list, alstr_reset); - VECTOR_RESIZE(*list, 0, 0); -} - - -static void ProbePlaybackDevices(void) -{ - ALuint numdevs; - ALuint i; - - clear_devlist(&PlaybackDevices); - - numdevs = waveOutGetNumDevs(); - VECTOR_RESIZE(PlaybackDevices, 0, numdevs); - for(i = 0;i < numdevs;i++) - { - WAVEOUTCAPSW WaveCaps; - const al_string *iter; - al_string dname; - - AL_STRING_INIT(dname); - if(waveOutGetDevCapsW(i, &WaveCaps, sizeof(WaveCaps)) == MMSYSERR_NOERROR) - { - ALuint count = 0; - while(1) - { - alstr_copy_cstr(&dname, DEVNAME_HEAD); - alstr_append_wcstr(&dname, WaveCaps.szPname); - if(count != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", count+1); - alstr_append_cstr(&dname, str); - } - count++; - -#define MATCH_ENTRY(i) (alstr_cmp(dname, *(i)) == 0) - VECTOR_FIND_IF(iter, const al_string, PlaybackDevices, MATCH_ENTRY); - if(iter == VECTOR_END(PlaybackDevices)) break; -#undef MATCH_ENTRY - } - - TRACE("Got device \"%s\", ID %u\n", alstr_get_cstr(dname), i); - } - VECTOR_PUSH_BACK(PlaybackDevices, dname); - } -} - -static void ProbeCaptureDevices(void) -{ - ALuint numdevs; - ALuint i; - - clear_devlist(&CaptureDevices); - - numdevs = waveInGetNumDevs(); - VECTOR_RESIZE(CaptureDevices, 0, numdevs); - for(i = 0;i < numdevs;i++) - { - WAVEINCAPSW WaveCaps; - const al_string *iter; - al_string dname; - - AL_STRING_INIT(dname); - if(waveInGetDevCapsW(i, &WaveCaps, sizeof(WaveCaps)) == MMSYSERR_NOERROR) - { - ALuint count = 0; - while(1) - { - alstr_copy_cstr(&dname, DEVNAME_HEAD); - alstr_append_wcstr(&dname, WaveCaps.szPname); - if(count != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", count+1); - alstr_append_cstr(&dname, str); - } - count++; - -#define MATCH_ENTRY(i) (alstr_cmp(dname, *(i)) == 0) - VECTOR_FIND_IF(iter, const al_string, CaptureDevices, MATCH_ENTRY); - if(iter == VECTOR_END(CaptureDevices)) break; -#undef MATCH_ENTRY - } - - TRACE("Got device \"%s\", ID %u\n", alstr_get_cstr(dname), i); - } - VECTOR_PUSH_BACK(CaptureDevices, dname); - } -} - - -typedef struct ALCwinmmPlayback { - DERIVE_FROM_TYPE(ALCbackend); - - RefCount WaveBuffersCommitted; - WAVEHDR WaveBuffer[4]; - - HWAVEOUT OutHdl; - - WAVEFORMATEX Format; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCwinmmPlayback; - -static void ALCwinmmPlayback_Construct(ALCwinmmPlayback *self, ALCdevice *device); -static void ALCwinmmPlayback_Destruct(ALCwinmmPlayback *self); - -static void CALLBACK ALCwinmmPlayback_waveOutProc(HWAVEOUT device, UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR param2); -static int ALCwinmmPlayback_mixerProc(void *arg); - -static ALCenum ALCwinmmPlayback_open(ALCwinmmPlayback *self, const ALCchar *name); -static ALCboolean ALCwinmmPlayback_reset(ALCwinmmPlayback *self); -static ALCboolean ALCwinmmPlayback_start(ALCwinmmPlayback *self); -static void ALCwinmmPlayback_stop(ALCwinmmPlayback *self); -static DECLARE_FORWARD2(ALCwinmmPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) -static DECLARE_FORWARD(ALCwinmmPlayback, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCwinmmPlayback, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCwinmmPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCwinmmPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCwinmmPlayback) - -DEFINE_ALCBACKEND_VTABLE(ALCwinmmPlayback); - - -static void ALCwinmmPlayback_Construct(ALCwinmmPlayback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCwinmmPlayback, ALCbackend, self); - - InitRef(&self->WaveBuffersCommitted, 0); - self->OutHdl = NULL; - - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCwinmmPlayback_Destruct(ALCwinmmPlayback *self) -{ - if(self->OutHdl) - waveOutClose(self->OutHdl); - self->OutHdl = 0; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -/* ALCwinmmPlayback_waveOutProc - * - * Posts a message to 'ALCwinmmPlayback_mixerProc' everytime a WaveOut Buffer - * is completed and returns to the application (for more data) - */ -static void CALLBACK ALCwinmmPlayback_waveOutProc(HWAVEOUT UNUSED(device), UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR UNUSED(param2)) -{ - ALCwinmmPlayback *self = (ALCwinmmPlayback*)instance; - - if(msg != WOM_DONE) - return; - - DecrementRef(&self->WaveBuffersCommitted); - PostThreadMessage(self->thread, msg, 0, param1); -} - -FORCE_ALIGN static int ALCwinmmPlayback_mixerProc(void *arg) -{ - ALCwinmmPlayback *self = arg; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - WAVEHDR *WaveHdr; - MSG msg; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - while(GetMessage(&msg, NULL, 0, 0)) - { - if(msg.message != WOM_DONE) - continue; - - if(ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) - { - if(ReadRef(&self->WaveBuffersCommitted) == 0) - break; - continue; - } - - WaveHdr = ((WAVEHDR*)msg.lParam); - ALCwinmmPlayback_lock(self); - aluMixData(device, WaveHdr->lpData, WaveHdr->dwBufferLength / - self->Format.nBlockAlign); - ALCwinmmPlayback_unlock(self); - - // Send buffer back to play more data - waveOutWrite(self->OutHdl, WaveHdr, sizeof(WAVEHDR)); - IncrementRef(&self->WaveBuffersCommitted); - } - - return 0; -} - - -static ALCenum ALCwinmmPlayback_open(ALCwinmmPlayback *self, const ALCchar *deviceName) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const al_string *iter; - UINT DeviceID; - MMRESULT res; - - if(VECTOR_SIZE(PlaybackDevices) == 0) - ProbePlaybackDevices(); - - // Find the Device ID matching the deviceName if valid -#define MATCH_DEVNAME(iter) (!alstr_empty(*(iter)) && \ - (!deviceName || alstr_cmp_cstr(*(iter), deviceName) == 0)) - VECTOR_FIND_IF(iter, const al_string, PlaybackDevices, MATCH_DEVNAME); - if(iter == VECTOR_END(PlaybackDevices)) - return ALC_INVALID_VALUE; -#undef MATCH_DEVNAME - - DeviceID = (UINT)(iter - VECTOR_BEGIN(PlaybackDevices)); - -retry_open: - memset(&self->Format, 0, sizeof(WAVEFORMATEX)); - if(device->FmtType == DevFmtFloat) - { - self->Format.wFormatTag = WAVE_FORMAT_IEEE_FLOAT; - self->Format.wBitsPerSample = 32; - } - else - { - self->Format.wFormatTag = WAVE_FORMAT_PCM; - if(device->FmtType == DevFmtUByte || device->FmtType == DevFmtByte) - self->Format.wBitsPerSample = 8; - else - self->Format.wBitsPerSample = 16; - } - self->Format.nChannels = ((device->FmtChans == DevFmtMono) ? 1 : 2); - self->Format.nBlockAlign = self->Format.wBitsPerSample * - self->Format.nChannels / 8; - self->Format.nSamplesPerSec = device->Frequency; - self->Format.nAvgBytesPerSec = self->Format.nSamplesPerSec * - self->Format.nBlockAlign; - self->Format.cbSize = 0; - - if((res=waveOutOpen(&self->OutHdl, DeviceID, &self->Format, (DWORD_PTR)&ALCwinmmPlayback_waveOutProc, (DWORD_PTR)self, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR) - { - if(device->FmtType == DevFmtFloat) - { - device->FmtType = DevFmtShort; - goto retry_open; - } - ERR("waveOutOpen failed: %u\n", res); - goto failure; - } - - alstr_copy(&device->DeviceName, VECTOR_ELEM(PlaybackDevices, DeviceID)); - return ALC_NO_ERROR; - -failure: - if(self->OutHdl) - waveOutClose(self->OutHdl); - self->OutHdl = NULL; - - return ALC_INVALID_VALUE; -} - -static ALCboolean ALCwinmmPlayback_reset(ALCwinmmPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - device->UpdateSize = (ALuint)((ALuint64)device->UpdateSize * - self->Format.nSamplesPerSec / - device->Frequency); - device->UpdateSize = (device->UpdateSize*device->NumUpdates + 3) / 4; - device->NumUpdates = 4; - device->Frequency = self->Format.nSamplesPerSec; - - if(self->Format.wFormatTag == WAVE_FORMAT_IEEE_FLOAT) - { - if(self->Format.wBitsPerSample == 32) - device->FmtType = DevFmtFloat; - else - { - ERR("Unhandled IEEE float sample depth: %d\n", self->Format.wBitsPerSample); - return ALC_FALSE; - } - } - else if(self->Format.wFormatTag == WAVE_FORMAT_PCM) - { - if(self->Format.wBitsPerSample == 16) - device->FmtType = DevFmtShort; - else if(self->Format.wBitsPerSample == 8) - device->FmtType = DevFmtUByte; - else - { - ERR("Unhandled PCM sample depth: %d\n", self->Format.wBitsPerSample); - return ALC_FALSE; - } - } - else - { - ERR("Unhandled format tag: 0x%04x\n", self->Format.wFormatTag); - return ALC_FALSE; - } - - if(self->Format.nChannels == 2) - device->FmtChans = DevFmtStereo; - else if(self->Format.nChannels == 1) - device->FmtChans = DevFmtMono; - else - { - ERR("Unhandled channel count: %d\n", self->Format.nChannels); - return ALC_FALSE; - } - SetDefaultWFXChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCwinmmPlayback_start(ALCwinmmPlayback *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALbyte *BufferData; - ALint BufferSize; - ALuint i; - - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCwinmmPlayback_mixerProc, self) != althrd_success) - return ALC_FALSE; - - InitRef(&self->WaveBuffersCommitted, 0); - - // Create 4 Buffers - BufferSize = device->UpdateSize*device->NumUpdates / 4; - BufferSize *= FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - BufferData = calloc(4, BufferSize); - for(i = 0;i < 4;i++) - { - memset(&self->WaveBuffer[i], 0, sizeof(WAVEHDR)); - self->WaveBuffer[i].dwBufferLength = BufferSize; - self->WaveBuffer[i].lpData = ((i==0) ? (CHAR*)BufferData : - (self->WaveBuffer[i-1].lpData + - self->WaveBuffer[i-1].dwBufferLength)); - waveOutPrepareHeader(self->OutHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - waveOutWrite(self->OutHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - IncrementRef(&self->WaveBuffersCommitted); - } - - return ALC_TRUE; -} - -static void ALCwinmmPlayback_stop(ALCwinmmPlayback *self) -{ - void *buffer = NULL; - int i; - - if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - return; - althrd_join(self->thread, &i); - - // Release the wave buffers - for(i = 0;i < 4;i++) - { - waveOutUnprepareHeader(self->OutHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - if(i == 0) buffer = self->WaveBuffer[i].lpData; - self->WaveBuffer[i].lpData = NULL; - } - free(buffer); -} - - - -typedef struct ALCwinmmCapture { - DERIVE_FROM_TYPE(ALCbackend); - - RefCount WaveBuffersCommitted; - WAVEHDR WaveBuffer[4]; - - HWAVEIN InHdl; - - ll_ringbuffer_t *Ring; - - WAVEFORMATEX Format; - - ATOMIC(ALenum) killNow; - althrd_t thread; -} ALCwinmmCapture; - -static void ALCwinmmCapture_Construct(ALCwinmmCapture *self, ALCdevice *device); -static void ALCwinmmCapture_Destruct(ALCwinmmCapture *self); - -static void CALLBACK ALCwinmmCapture_waveInProc(HWAVEIN device, UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR param2); -static int ALCwinmmCapture_captureProc(void *arg); - -static ALCenum ALCwinmmCapture_open(ALCwinmmCapture *self, const ALCchar *name); -static DECLARE_FORWARD(ALCwinmmCapture, ALCbackend, ALCboolean, reset) -static ALCboolean ALCwinmmCapture_start(ALCwinmmCapture *self); -static void ALCwinmmCapture_stop(ALCwinmmCapture *self); -static ALCenum ALCwinmmCapture_captureSamples(ALCwinmmCapture *self, ALCvoid *buffer, ALCuint samples); -static ALCuint ALCwinmmCapture_availableSamples(ALCwinmmCapture *self); -static DECLARE_FORWARD(ALCwinmmCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCwinmmCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCwinmmCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCwinmmCapture) - -DEFINE_ALCBACKEND_VTABLE(ALCwinmmCapture); - - -static void ALCwinmmCapture_Construct(ALCwinmmCapture *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCwinmmCapture, ALCbackend, self); - - InitRef(&self->WaveBuffersCommitted, 0); - self->InHdl = NULL; - - ATOMIC_INIT(&self->killNow, AL_TRUE); -} - -static void ALCwinmmCapture_Destruct(ALCwinmmCapture *self) -{ - void *buffer = NULL; - int i; - - /* Tell the processing thread to quit and wait for it to do so. */ - if(!ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) - { - PostThreadMessage(self->thread, WM_QUIT, 0, 0); - - althrd_join(self->thread, &i); - - /* Make sure capture is stopped and all pending buffers are flushed. */ - waveInReset(self->InHdl); - - // Release the wave buffers - for(i = 0;i < 4;i++) - { - waveInUnprepareHeader(self->InHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - if(i == 0) buffer = self->WaveBuffer[i].lpData; - self->WaveBuffer[i].lpData = NULL; - } - free(buffer); - } - - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - // Close the Wave device - if(self->InHdl) - waveInClose(self->InHdl); - self->InHdl = 0; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -/* ALCwinmmCapture_waveInProc - * - * Posts a message to 'ALCwinmmCapture_captureProc' everytime a WaveIn Buffer - * is completed and returns to the application (with more data). - */ -static void CALLBACK ALCwinmmCapture_waveInProc(HWAVEIN UNUSED(device), UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR UNUSED(param2)) -{ - ALCwinmmCapture *self = (ALCwinmmCapture*)instance; - - if(msg != WIM_DATA) - return; - - DecrementRef(&self->WaveBuffersCommitted); - PostThreadMessage(self->thread, msg, 0, param1); -} - -static int ALCwinmmCapture_captureProc(void *arg) -{ - ALCwinmmCapture *self = arg; - WAVEHDR *WaveHdr; - MSG msg; - - althrd_setname(althrd_current(), RECORD_THREAD_NAME); - - while(GetMessage(&msg, NULL, 0, 0)) - { - if(msg.message != WIM_DATA) - continue; - /* Don't wait for other buffers to finish before quitting. We're - * closing so we don't need them. */ - if(ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) - break; - - WaveHdr = ((WAVEHDR*)msg.lParam); - ll_ringbuffer_write(self->Ring, WaveHdr->lpData, - WaveHdr->dwBytesRecorded / self->Format.nBlockAlign - ); - - // Send buffer back to capture more data - waveInAddBuffer(self->InHdl, WaveHdr, sizeof(WAVEHDR)); - IncrementRef(&self->WaveBuffersCommitted); - } - - return 0; -} - - -static ALCenum ALCwinmmCapture_open(ALCwinmmCapture *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - const al_string *iter; - ALbyte *BufferData = NULL; - DWORD CapturedDataSize; - ALint BufferSize; - UINT DeviceID; - MMRESULT res; - ALuint i; - - if(VECTOR_SIZE(CaptureDevices) == 0) - ProbeCaptureDevices(); - - // Find the Device ID matching the deviceName if valid -#define MATCH_DEVNAME(iter) (!alstr_empty(*(iter)) && (!name || alstr_cmp_cstr(*iter, name) == 0)) - VECTOR_FIND_IF(iter, const al_string, CaptureDevices, MATCH_DEVNAME); - if(iter == VECTOR_END(CaptureDevices)) - return ALC_INVALID_VALUE; -#undef MATCH_DEVNAME - - DeviceID = (UINT)(iter - VECTOR_BEGIN(CaptureDevices)); - - switch(device->FmtChans) - { - case DevFmtMono: - case DevFmtStereo: - break; - - case DevFmtQuad: - case DevFmtX51: - case DevFmtX51Rear: - case DevFmtX61: - case DevFmtX71: - case DevFmtAmbi3D: - return ALC_INVALID_ENUM; - } - - switch(device->FmtType) - { - case DevFmtUByte: - case DevFmtShort: - case DevFmtInt: - case DevFmtFloat: - break; - - case DevFmtByte: - case DevFmtUShort: - case DevFmtUInt: - return ALC_INVALID_ENUM; - } - - memset(&self->Format, 0, sizeof(WAVEFORMATEX)); - self->Format.wFormatTag = ((device->FmtType == DevFmtFloat) ? - WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM); - self->Format.nChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - self->Format.wBitsPerSample = BytesFromDevFmt(device->FmtType) * 8; - self->Format.nBlockAlign = self->Format.wBitsPerSample * - self->Format.nChannels / 8; - self->Format.nSamplesPerSec = device->Frequency; - self->Format.nAvgBytesPerSec = self->Format.nSamplesPerSec * - self->Format.nBlockAlign; - self->Format.cbSize = 0; - - if((res=waveInOpen(&self->InHdl, DeviceID, &self->Format, (DWORD_PTR)&ALCwinmmCapture_waveInProc, (DWORD_PTR)self, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR) - { - ERR("waveInOpen failed: %u\n", res); - goto failure; - } - - // Allocate circular memory buffer for the captured audio - CapturedDataSize = device->UpdateSize*device->NumUpdates; - - // Make sure circular buffer is at least 100ms in size - if(CapturedDataSize < (self->Format.nSamplesPerSec / 10)) - CapturedDataSize = self->Format.nSamplesPerSec / 10; - - self->Ring = ll_ringbuffer_create(CapturedDataSize, self->Format.nBlockAlign, false); - if(!self->Ring) goto failure; - - InitRef(&self->WaveBuffersCommitted, 0); - - // Create 4 Buffers of 50ms each - BufferSize = self->Format.nAvgBytesPerSec / 20; - BufferSize -= (BufferSize % self->Format.nBlockAlign); - - BufferData = calloc(4, BufferSize); - if(!BufferData) goto failure; - - for(i = 0;i < 4;i++) - { - memset(&self->WaveBuffer[i], 0, sizeof(WAVEHDR)); - self->WaveBuffer[i].dwBufferLength = BufferSize; - self->WaveBuffer[i].lpData = ((i==0) ? (CHAR*)BufferData : - (self->WaveBuffer[i-1].lpData + - self->WaveBuffer[i-1].dwBufferLength)); - self->WaveBuffer[i].dwFlags = 0; - self->WaveBuffer[i].dwLoops = 0; - waveInPrepareHeader(self->InHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - waveInAddBuffer(self->InHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - IncrementRef(&self->WaveBuffersCommitted); - } - - ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&self->thread, ALCwinmmCapture_captureProc, self) != althrd_success) - goto failure; - - alstr_copy(&device->DeviceName, VECTOR_ELEM(CaptureDevices, DeviceID)); - return ALC_NO_ERROR; - -failure: - if(BufferData) - { - for(i = 0;i < 4;i++) - waveInUnprepareHeader(self->InHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - free(BufferData); - } - - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - if(self->InHdl) - waveInClose(self->InHdl); - self->InHdl = NULL; - - return ALC_INVALID_VALUE; -} - -static ALCboolean ALCwinmmCapture_start(ALCwinmmCapture *self) -{ - waveInStart(self->InHdl); - return ALC_TRUE; -} - -static void ALCwinmmCapture_stop(ALCwinmmCapture *self) -{ - waveInStop(self->InHdl); -} - -static ALCenum ALCwinmmCapture_captureSamples(ALCwinmmCapture *self, ALCvoid *buffer, ALCuint samples) -{ - ll_ringbuffer_read(self->Ring, buffer, samples); - return ALC_NO_ERROR; -} - -static ALCuint ALCwinmmCapture_availableSamples(ALCwinmmCapture *self) -{ - return (ALCuint)ll_ringbuffer_read_space(self->Ring); -} - - -static inline void AppendAllDevicesList2(const al_string *name) -{ - if(!alstr_empty(*name)) - AppendAllDevicesList(alstr_get_cstr(*name)); -} -static inline void AppendCaptureDeviceList2(const al_string *name) -{ - if(!alstr_empty(*name)) - AppendCaptureDeviceList(alstr_get_cstr(*name)); -} - -typedef struct ALCwinmmBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCwinmmBackendFactory; -#define ALCWINMMBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCwinmmBackendFactory, ALCbackendFactory) } } - -static ALCboolean ALCwinmmBackendFactory_init(ALCwinmmBackendFactory *self); -static void ALCwinmmBackendFactory_deinit(ALCwinmmBackendFactory *self); -static ALCboolean ALCwinmmBackendFactory_querySupport(ALCwinmmBackendFactory *self, ALCbackend_Type type); -static void ALCwinmmBackendFactory_probe(ALCwinmmBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCwinmmBackendFactory_createBackend(ALCwinmmBackendFactory *self, ALCdevice *device, ALCbackend_Type type); - -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwinmmBackendFactory); - - -static ALCboolean ALCwinmmBackendFactory_init(ALCwinmmBackendFactory* UNUSED(self)) -{ - VECTOR_INIT(PlaybackDevices); - VECTOR_INIT(CaptureDevices); - - return ALC_TRUE; -} - -static void ALCwinmmBackendFactory_deinit(ALCwinmmBackendFactory* UNUSED(self)) -{ - clear_devlist(&PlaybackDevices); - VECTOR_DEINIT(PlaybackDevices); - - clear_devlist(&CaptureDevices); - VECTOR_DEINIT(CaptureDevices); -} - -static ALCboolean ALCwinmmBackendFactory_querySupport(ALCwinmmBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCwinmmBackendFactory_probe(ALCwinmmBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - ProbePlaybackDevices(); - VECTOR_FOR_EACH(const al_string, PlaybackDevices, AppendAllDevicesList2); - break; - - case CAPTURE_DEVICE_PROBE: - ProbeCaptureDevices(); - VECTOR_FOR_EACH(const al_string, CaptureDevices, AppendCaptureDeviceList2); - break; - } -} - -static ALCbackend* ALCwinmmBackendFactory_createBackend(ALCwinmmBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCwinmmPlayback *backend; - NEW_OBJ(backend, ALCwinmmPlayback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - ALCwinmmCapture *backend; - NEW_OBJ(backend, ALCwinmmCapture)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} - -ALCbackendFactory *ALCwinmmBackendFactory_getFactory(void) -{ - static ALCwinmmBackendFactory factory = ALCWINMMBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} diff --git a/Alc/bformatdec.c b/Alc/bformatdec.c deleted file mode 100644 index 5889808..0000000 --- a/Alc/bformatdec.c +++ /dev/null @@ -1,492 +0,0 @@ - -#include "config.h" - -#include "bformatdec.h" -#include "ambdec.h" -#include "filters/splitter.h" -#include "alu.h" - -#include "bool.h" -#include "threads.h" -#include "almalloc.h" - - -/* NOTE: These are scale factors as applied to Ambisonics content. Decoder - * coefficients should be divided by these values to get proper N3D scalings. - */ -const ALfloat N3D2N3DScale[MAX_AMBI_COEFFS] = { - 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, - 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f -}; -const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS] = { - 1.000000000f, /* ACN 0 (W), sqrt(1) */ - 1.732050808f, /* ACN 1 (Y), sqrt(3) */ - 1.732050808f, /* ACN 2 (Z), sqrt(3) */ - 1.732050808f, /* ACN 3 (X), sqrt(3) */ - 2.236067978f, /* ACN 4 (V), sqrt(5) */ - 2.236067978f, /* ACN 5 (T), sqrt(5) */ - 2.236067978f, /* ACN 6 (R), sqrt(5) */ - 2.236067978f, /* ACN 7 (S), sqrt(5) */ - 2.236067978f, /* ACN 8 (U), sqrt(5) */ - 2.645751311f, /* ACN 9 (Q), sqrt(7) */ - 2.645751311f, /* ACN 10 (O), sqrt(7) */ - 2.645751311f, /* ACN 11 (M), sqrt(7) */ - 2.645751311f, /* ACN 12 (K), sqrt(7) */ - 2.645751311f, /* ACN 13 (L), sqrt(7) */ - 2.645751311f, /* ACN 14 (N), sqrt(7) */ - 2.645751311f, /* ACN 15 (P), sqrt(7) */ -}; -const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS] = { - 1.414213562f, /* ACN 0 (W), sqrt(2) */ - 1.732050808f, /* ACN 1 (Y), sqrt(3) */ - 1.732050808f, /* ACN 2 (Z), sqrt(3) */ - 1.732050808f, /* ACN 3 (X), sqrt(3) */ - 1.936491673f, /* ACN 4 (V), sqrt(15)/2 */ - 1.936491673f, /* ACN 5 (T), sqrt(15)/2 */ - 2.236067978f, /* ACN 6 (R), sqrt(5) */ - 1.936491673f, /* ACN 7 (S), sqrt(15)/2 */ - 1.936491673f, /* ACN 8 (U), sqrt(15)/2 */ - 2.091650066f, /* ACN 9 (Q), sqrt(35/8) */ - 1.972026594f, /* ACN 10 (O), sqrt(35)/3 */ - 2.231093404f, /* ACN 11 (M), sqrt(224/45) */ - 2.645751311f, /* ACN 12 (K), sqrt(7) */ - 2.231093404f, /* ACN 13 (L), sqrt(224/45) */ - 1.972026594f, /* ACN 14 (N), sqrt(35)/3 */ - 2.091650066f, /* ACN 15 (P), sqrt(35/8) */ -}; - - -#define HF_BAND 0 -#define LF_BAND 1 -#define NUM_BANDS 2 - -/* These points are in AL coordinates! */ -static const ALfloat Ambi3DPoints[8][3] = { - { -0.577350269f, 0.577350269f, -0.577350269f }, - { 0.577350269f, 0.577350269f, -0.577350269f }, - { -0.577350269f, 0.577350269f, 0.577350269f }, - { 0.577350269f, 0.577350269f, 0.577350269f }, - { -0.577350269f, -0.577350269f, -0.577350269f }, - { 0.577350269f, -0.577350269f, -0.577350269f }, - { -0.577350269f, -0.577350269f, 0.577350269f }, - { 0.577350269f, -0.577350269f, 0.577350269f }, -}; -static const ALfloat Ambi3DDecoder[8][MAX_AMBI_COEFFS] = { - { 0.125f, 0.125f, 0.125f, 0.125f }, - { 0.125f, -0.125f, 0.125f, 0.125f }, - { 0.125f, 0.125f, 0.125f, -0.125f }, - { 0.125f, -0.125f, 0.125f, -0.125f }, - { 0.125f, 0.125f, -0.125f, 0.125f }, - { 0.125f, -0.125f, -0.125f, 0.125f }, - { 0.125f, 0.125f, -0.125f, -0.125f }, - { 0.125f, -0.125f, -0.125f, -0.125f }, -}; -static const ALfloat Ambi3DDecoderHFScale[MAX_AMBI_COEFFS] = { - 2.0f, - 1.15470054f, 1.15470054f, 1.15470054f -}; - - -/* NOTE: BandSplitter filters are unused with single-band decoding */ -typedef struct BFormatDec { - ALuint Enabled; /* Bitfield of enabled channels. */ - - union { - alignas(16) ALfloat Dual[MAX_OUTPUT_CHANNELS][NUM_BANDS][MAX_AMBI_COEFFS]; - alignas(16) ALfloat Single[MAX_OUTPUT_CHANNELS][MAX_AMBI_COEFFS]; - } Matrix; - - BandSplitter XOver[MAX_AMBI_COEFFS]; - - ALfloat (*Samples)[BUFFERSIZE]; - /* These two alias into Samples */ - ALfloat (*SamplesHF)[BUFFERSIZE]; - ALfloat (*SamplesLF)[BUFFERSIZE]; - - alignas(16) ALfloat ChannelMix[BUFFERSIZE]; - - struct { - BandSplitter XOver; - ALfloat Gains[NUM_BANDS]; - } UpSampler[4]; - - ALsizei NumChannels; - ALboolean DualBand; -} BFormatDec; - -BFormatDec *bformatdec_alloc() -{ - return al_calloc(16, sizeof(BFormatDec)); -} - -void bformatdec_free(BFormatDec **dec) -{ - if(dec && *dec) - { - al_free((*dec)->Samples); - (*dec)->Samples = NULL; - (*dec)->SamplesHF = NULL; - (*dec)->SamplesLF = NULL; - - al_free(*dec); - *dec = NULL; - } -} - -void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei chanmap[MAX_OUTPUT_CHANNELS]) -{ - static const ALsizei map2DTo3D[MAX_AMBI2D_COEFFS] = { - 0, 1, 3, 4, 8, 9, 15 - }; - const ALfloat *coeff_scale = N3D2N3DScale; - bool periphonic; - ALfloat ratio; - ALsizei i; - - al_free(dec->Samples); - dec->Samples = NULL; - dec->SamplesHF = NULL; - dec->SamplesLF = NULL; - - dec->NumChannels = chancount; - dec->Samples = al_calloc(16, dec->NumChannels*2 * sizeof(dec->Samples[0])); - dec->SamplesHF = dec->Samples; - dec->SamplesLF = dec->SamplesHF + dec->NumChannels; - - dec->Enabled = 0; - for(i = 0;i < conf->NumSpeakers;i++) - dec->Enabled |= 1 << chanmap[i]; - - if(conf->CoeffScale == ADS_SN3D) - coeff_scale = SN3D2N3DScale; - else if(conf->CoeffScale == ADS_FuMa) - coeff_scale = FuMa2N3DScale; - - memset(dec->UpSampler, 0, sizeof(dec->UpSampler)); - ratio = 400.0f / (ALfloat)srate; - for(i = 0;i < 4;i++) - bandsplit_init(&dec->UpSampler[i].XOver, ratio); - if((conf->ChanMask&AMBI_PERIPHONIC_MASK)) - { - periphonic = true; - - dec->UpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H3P : - (conf->ChanMask > 0xf) ? W_SCALE_2H2P : 1.0f; - dec->UpSampler[0].Gains[LF_BAND] = 1.0f; - for(i = 1;i < 4;i++) - { - dec->UpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H3P : - (conf->ChanMask > 0xf) ? XYZ_SCALE_2H2P : 1.0f; - dec->UpSampler[i].Gains[LF_BAND] = 1.0f; - } - } - else - { - periphonic = false; - - dec->UpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H0P : - (conf->ChanMask > 0xf) ? W_SCALE_2H0P : 1.0f; - dec->UpSampler[0].Gains[LF_BAND] = 1.0f; - for(i = 1;i < 3;i++) - { - dec->UpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H0P : - (conf->ChanMask > 0xf) ? XYZ_SCALE_2H0P : 1.0f; - dec->UpSampler[i].Gains[LF_BAND] = 1.0f; - } - dec->UpSampler[3].Gains[HF_BAND] = 0.0f; - dec->UpSampler[3].Gains[LF_BAND] = 0.0f; - } - - memset(&dec->Matrix, 0, sizeof(dec->Matrix)); - if(conf->FreqBands == 1) - { - dec->DualBand = AL_FALSE; - for(i = 0;i < conf->NumSpeakers;i++) - { - ALsizei chan = chanmap[i]; - ALfloat gain; - ALsizei j, k; - - if(!periphonic) - { - for(j = 0,k = 0;j < MAX_AMBI2D_COEFFS;j++) - { - ALsizei l = map2DTo3D[j]; - if(j == 0) gain = conf->HFOrderGain[0]; - else if(j == 1) gain = conf->HFOrderGain[1]; - else if(j == 3) gain = conf->HFOrderGain[2]; - else if(j == 5) gain = conf->HFOrderGain[3]; - if((conf->ChanMask&(1<Matrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[l] * - gain; - } - } - else - { - for(j = 0,k = 0;j < MAX_AMBI_COEFFS;j++) - { - if(j == 0) gain = conf->HFOrderGain[0]; - else if(j == 1) gain = conf->HFOrderGain[1]; - else if(j == 4) gain = conf->HFOrderGain[2]; - else if(j == 9) gain = conf->HFOrderGain[3]; - if((conf->ChanMask&(1<Matrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[j] * - gain; - } - } - } - } - else - { - dec->DualBand = AL_TRUE; - - ratio = conf->XOverFreq / (ALfloat)srate; - for(i = 0;i < MAX_AMBI_COEFFS;i++) - bandsplit_init(&dec->XOver[i], ratio); - - ratio = powf(10.0f, conf->XOverRatio / 40.0f); - for(i = 0;i < conf->NumSpeakers;i++) - { - ALsizei chan = chanmap[i]; - ALfloat gain; - ALsizei j, k; - - if(!periphonic) - { - for(j = 0,k = 0;j < MAX_AMBI2D_COEFFS;j++) - { - ALsizei l = map2DTo3D[j]; - if(j == 0) gain = conf->HFOrderGain[0] * ratio; - else if(j == 1) gain = conf->HFOrderGain[1] * ratio; - else if(j == 3) gain = conf->HFOrderGain[2] * ratio; - else if(j == 5) gain = conf->HFOrderGain[3] * ratio; - if((conf->ChanMask&(1<Matrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / - coeff_scale[l] * gain; - } - for(j = 0,k = 0;j < MAX_AMBI2D_COEFFS;j++) - { - ALsizei l = map2DTo3D[j]; - if(j == 0) gain = conf->LFOrderGain[0] / ratio; - else if(j == 1) gain = conf->LFOrderGain[1] / ratio; - else if(j == 3) gain = conf->LFOrderGain[2] / ratio; - else if(j == 5) gain = conf->LFOrderGain[3] / ratio; - if((conf->ChanMask&(1<Matrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / - coeff_scale[l] * gain; - } - } - else - { - for(j = 0,k = 0;j < MAX_AMBI_COEFFS;j++) - { - if(j == 0) gain = conf->HFOrderGain[0] * ratio; - else if(j == 1) gain = conf->HFOrderGain[1] * ratio; - else if(j == 4) gain = conf->HFOrderGain[2] * ratio; - else if(j == 9) gain = conf->HFOrderGain[3] * ratio; - if((conf->ChanMask&(1<Matrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / - coeff_scale[j] * gain; - } - for(j = 0,k = 0;j < MAX_AMBI_COEFFS;j++) - { - if(j == 0) gain = conf->LFOrderGain[0] / ratio; - else if(j == 1) gain = conf->LFOrderGain[1] / ratio; - else if(j == 4) gain = conf->LFOrderGain[2] / ratio; - else if(j == 9) gain = conf->LFOrderGain[3] / ratio; - if((conf->ChanMask&(1<Matrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / - coeff_scale[j] * gain; - } - } - } - } -} - - -void bformatdec_process(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo) -{ - ALsizei chan, i; - - OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); - if(dec->DualBand) - { - for(i = 0;i < dec->NumChannels;i++) - bandsplit_process(&dec->XOver[i], dec->SamplesHF[i], dec->SamplesLF[i], - InSamples[i], SamplesToDo); - - for(chan = 0;chan < OutChannels;chan++) - { - if(!(dec->Enabled&(1<ChannelMix, 0, SamplesToDo*sizeof(ALfloat)); - MixRowSamples(dec->ChannelMix, dec->Matrix.Dual[chan][HF_BAND], - dec->SamplesHF, dec->NumChannels, 0, SamplesToDo - ); - MixRowSamples(dec->ChannelMix, dec->Matrix.Dual[chan][LF_BAND], - dec->SamplesLF, dec->NumChannels, 0, SamplesToDo - ); - - for(i = 0;i < SamplesToDo;i++) - OutBuffer[chan][i] += dec->ChannelMix[i]; - } - } - else - { - for(chan = 0;chan < OutChannels;chan++) - { - if(!(dec->Enabled&(1<ChannelMix, 0, SamplesToDo*sizeof(ALfloat)); - MixRowSamples(dec->ChannelMix, dec->Matrix.Single[chan], InSamples, - dec->NumChannels, 0, SamplesToDo); - - for(i = 0;i < SamplesToDo;i++) - OutBuffer[chan][i] += dec->ChannelMix[i]; - } - } -} - - -void bformatdec_upSample(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[BUFFERSIZE], const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei InChannels, ALsizei SamplesToDo) -{ - ALsizei i; - - /* This up-sampler leverages the differences observed in dual-band second- - * and third-order decoder matrices compared to first-order. For the same - * output channel configuration, the low-frequency matrix has identical - * coefficients in the shared input channels, while the high-frequency - * matrix has extra scalars applied to the W channel and X/Y/Z channels. - * Mixing the first-order content into the higher-order stream with the - * appropriate counter-scales applied to the HF response results in the - * subsequent higher-order decode generating the same response as a first- - * order decode. - */ - for(i = 0;i < InChannels;i++) - { - /* First, split the first-order components into low and high frequency - * bands. - */ - bandsplit_process(&dec->UpSampler[i].XOver, - dec->Samples[HF_BAND], dec->Samples[LF_BAND], - InSamples[i], SamplesToDo - ); - - /* Now write each band to the output. */ - MixRowSamples(OutBuffer[i], dec->UpSampler[i].Gains, - dec->Samples, NUM_BANDS, 0, SamplesToDo - ); - } -} - - -#define INVALID_UPSAMPLE_INDEX INT_MAX - -static ALsizei GetACNIndex(const BFChannelConfig *chans, ALsizei numchans, ALsizei acn) -{ - ALsizei i; - for(i = 0;i < numchans;i++) - { - if(chans[i].Index == acn) - return i; - } - return INVALID_UPSAMPLE_INDEX; -} -#define GetChannelForACN(b, a) GetACNIndex((b).Ambi.Map, (b).NumChannels, (a)) - -typedef struct AmbiUpsampler { - alignas(16) ALfloat Samples[NUM_BANDS][BUFFERSIZE]; - - BandSplitter XOver[4]; - - ALfloat Gains[4][MAX_OUTPUT_CHANNELS][NUM_BANDS]; -} AmbiUpsampler; - -AmbiUpsampler *ambiup_alloc() -{ - return al_calloc(16, sizeof(AmbiUpsampler)); -} - -void ambiup_free(struct AmbiUpsampler **ambiup) -{ - if(ambiup) - { - al_free(*ambiup); - *ambiup = NULL; - } -} - -void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat w_scale, ALfloat xyz_scale) -{ - ALfloat ratio; - ALsizei i; - - ratio = 400.0f / (ALfloat)device->Frequency; - for(i = 0;i < 4;i++) - bandsplit_init(&ambiup->XOver[i], ratio); - - memset(ambiup->Gains, 0, sizeof(ambiup->Gains)); - if(device->Dry.CoeffCount > 0) - { - ALfloat encgains[8][MAX_OUTPUT_CHANNELS]; - ALsizei j; - size_t k; - - for(k = 0;k < COUNTOF(Ambi3DPoints);k++) - { - ALfloat coeffs[MAX_AMBI_COEFFS] = { 0.0f }; - CalcDirectionCoeffs(Ambi3DPoints[k], 0.0f, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, 1.0f, encgains[k]); - } - - /* Combine the matrices that do the in->virt and virt->out conversions - * so we get a single in->out conversion. NOTE: the Encoder matrix - * (encgains) and output are transposed, so the input channels line up - * with the rows and the output channels line up with the columns. - */ - for(i = 0;i < 4;i++) - { - for(j = 0;j < device->Dry.NumChannels;j++) - { - ALdouble gain = 0.0; - for(k = 0;k < COUNTOF(Ambi3DDecoder);k++) - gain += (ALdouble)Ambi3DDecoder[k][i] * encgains[k][j]; - ambiup->Gains[i][j][HF_BAND] = (ALfloat)(gain * Ambi3DDecoderHFScale[i]); - ambiup->Gains[i][j][LF_BAND] = (ALfloat)gain; - } - } - } - else - { - for(i = 0;i < 4;i++) - { - ALsizei index = GetChannelForACN(device->Dry, i); - if(index != INVALID_UPSAMPLE_INDEX) - { - ALfloat scale = device->Dry.Ambi.Map[index].Scale; - ambiup->Gains[i][index][HF_BAND] = scale * ((i==0) ? w_scale : xyz_scale); - ambiup->Gains[i][index][LF_BAND] = scale; - } - } - } -} - -void ambiup_process(struct AmbiUpsampler *ambiup, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo) -{ - ALsizei i, j; - - for(i = 0;i < 4;i++) - { - bandsplit_process(&ambiup->XOver[i], - ambiup->Samples[HF_BAND], ambiup->Samples[LF_BAND], - InSamples[i], SamplesToDo - ); - - for(j = 0;j < OutChannels;j++) - MixRowSamples(OutBuffer[j], ambiup->Gains[i][j], - ambiup->Samples, NUM_BANDS, 0, SamplesToDo - ); - } -} diff --git a/Alc/bformatdec.h b/Alc/bformatdec.h deleted file mode 100644 index 2d7d1d6..0000000 --- a/Alc/bformatdec.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BFORMATDEC_H -#define BFORMATDEC_H - -#include "alMain.h" - - -/* These are the necessary scales for first-order HF responses to play over - * higher-order 2D (non-periphonic) decoders. - */ -#define W_SCALE_2H0P 1.224744871f /* sqrt(1.5) */ -#define XYZ_SCALE_2H0P 1.0f -#define W_SCALE_3H0P 1.414213562f /* sqrt(2) */ -#define XYZ_SCALE_3H0P 1.082392196f - -/* These are the necessary scales for first-order HF responses to play over - * higher-order 3D (periphonic) decoders. - */ -#define W_SCALE_2H2P 1.341640787f /* sqrt(1.8) */ -#define XYZ_SCALE_2H2P 1.0f -#define W_SCALE_3H3P 1.695486018f -#define XYZ_SCALE_3H3P 1.136697713f - - -/* NOTE: These are scale factors as applied to Ambisonics content. Decoder - * coefficients should be divided by these values to get proper N3D scalings. - */ -const ALfloat N3D2N3DScale[MAX_AMBI_COEFFS]; -const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS]; -const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS]; - - -struct AmbDecConf; -struct BFormatDec; -struct AmbiUpsampler; - - -struct BFormatDec *bformatdec_alloc(); -void bformatdec_free(struct BFormatDec **dec); -void bformatdec_reset(struct BFormatDec *dec, const struct AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei chanmap[MAX_OUTPUT_CHANNELS]); - -/* Decodes the ambisonic input to the given output channels. */ -void bformatdec_process(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo); - -/* Up-samples a first-order input to the decoder's configuration. */ -void bformatdec_upSample(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[BUFFERSIZE], const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei InChannels, ALsizei SamplesToDo); - - -/* Stand-alone first-order upsampler. Kept here because it shares some stuff - * with bformatdec. Assumes a periphonic (4-channel) input mix! - */ -struct AmbiUpsampler *ambiup_alloc(); -void ambiup_free(struct AmbiUpsampler **ambiup); -void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat w_scale, ALfloat xyz_scale); - -void ambiup_process(struct AmbiUpsampler *ambiup, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo); - -#endif /* BFORMATDEC_H */ diff --git a/Alc/compat.h b/Alc/compat.h deleted file mode 100644 index 093184c..0000000 --- a/Alc/compat.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef AL_COMPAT_H -#define AL_COMPAT_H - -#include "alstring.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - -#define WIN32_LEAN_AND_MEAN -#include - -WCHAR *strdupW(const WCHAR *str); - -/* Opens a file with standard I/O. The filename is expected to be UTF-8. */ -FILE *al_fopen(const char *fname, const char *mode); - -#define HAVE_DYNLOAD 1 - -#else - -#define al_fopen fopen - -#if defined(HAVE_DLFCN_H) && !defined(IN_IDE_PARSER) -#define HAVE_DYNLOAD 1 -#endif - -#endif - -struct FileMapping { -#ifdef _WIN32 - HANDLE file; - HANDLE fmap; -#else - int fd; -#endif - void *ptr; - size_t len; -}; -struct FileMapping MapFileToMem(const char *fname); -void UnmapFileMem(const struct FileMapping *mapping); - -void GetProcBinary(al_string *path, al_string *fname); - -#ifdef HAVE_DYNLOAD -void *LoadLib(const char *name); -void CloseLib(void *handle); -void *GetSymbol(void *handle, const char *name); -#endif - -#ifdef __ANDROID__ -#define JCALL(obj, func) ((*(obj))->func((obj), EXTRACT_VCALL_ARGS -#define JCALL0(obj, func) ((*(obj))->func((obj) EXTRACT_VCALL_ARGS - -/** Returns a JNIEnv*. */ -void *Android_GetJNIEnv(void); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* AL_COMPAT_H */ diff --git a/Alc/converter.c b/Alc/converter.c deleted file mode 100644 index ef2eb9a..0000000 --- a/Alc/converter.c +++ /dev/null @@ -1,468 +0,0 @@ - -#include "config.h" - -#include "converter.h" - -#include "fpu_modes.h" -#include "mixer/defs.h" - - -SampleConverter *CreateSampleConverter(enum DevFmtType srcType, enum DevFmtType dstType, ALsizei numchans, ALsizei srcRate, ALsizei dstRate) -{ - SampleConverter *converter; - ALsizei step; - - if(numchans <= 0 || srcRate <= 0 || dstRate <= 0) - return NULL; - - converter = al_calloc(16, FAM_SIZE(SampleConverter, Chan, numchans)); - converter->mSrcType = srcType; - converter->mDstType = dstType; - converter->mNumChannels = numchans; - converter->mSrcTypeSize = BytesFromDevFmt(srcType); - converter->mDstTypeSize = BytesFromDevFmt(dstType); - - converter->mSrcPrepCount = 0; - converter->mFracOffset = 0; - - /* Have to set the mixer FPU mode since that's what the resampler code expects. */ - START_MIXER_MODE(); - step = (ALsizei)mind(((ALdouble)srcRate/dstRate*FRACTIONONE) + 0.5, - MAX_PITCH * FRACTIONONE); - converter->mIncrement = maxi(step, 1); - if(converter->mIncrement == FRACTIONONE) - converter->mResample = Resample_copy_C; - else - { - /* TODO: Allow other resamplers. */ - BsincPrepare(converter->mIncrement, &converter->mState.bsinc, &bsinc12); - converter->mResample = SelectResampler(BSinc12Resampler); - } - END_MIXER_MODE(); - - return converter; -} - -void DestroySampleConverter(SampleConverter **converter) -{ - if(converter) - { - al_free(*converter); - *converter = NULL; - } -} - - -static inline ALfloat Sample_ALbyte(ALbyte val) -{ return val * (1.0f/128.0f); } -static inline ALfloat Sample_ALubyte(ALubyte val) -{ return Sample_ALbyte((ALint)val - 128); } - -static inline ALfloat Sample_ALshort(ALshort val) -{ return val * (1.0f/32768.0f); } -static inline ALfloat Sample_ALushort(ALushort val) -{ return Sample_ALshort((ALint)val - 32768); } - -static inline ALfloat Sample_ALint(ALint val) -{ return (val>>7) * (1.0f/16777216.0f); } -static inline ALfloat Sample_ALuint(ALuint val) -{ return Sample_ALint(val - INT_MAX - 1); } - -static inline ALfloat Sample_ALfloat(ALfloat val) -{ return val; } - -#define DECL_TEMPLATE(T) \ -static inline void Load_##T(ALfloat *restrict dst, const T *restrict src, \ - ALint srcstep, ALsizei samples) \ -{ \ - ALsizei i; \ - for(i = 0;i < samples;i++) \ - dst[i] = Sample_##T(src[i*srcstep]); \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) - -#undef DECL_TEMPLATE - -static void LoadSamples(ALfloat *dst, const ALvoid *src, ALint srcstep, enum DevFmtType srctype, ALsizei samples) -{ - switch(srctype) - { - case DevFmtByte: - Load_ALbyte(dst, src, srcstep, samples); - break; - case DevFmtUByte: - Load_ALubyte(dst, src, srcstep, samples); - break; - case DevFmtShort: - Load_ALshort(dst, src, srcstep, samples); - break; - case DevFmtUShort: - Load_ALushort(dst, src, srcstep, samples); - break; - case DevFmtInt: - Load_ALint(dst, src, srcstep, samples); - break; - case DevFmtUInt: - Load_ALuint(dst, src, srcstep, samples); - break; - case DevFmtFloat: - Load_ALfloat(dst, src, srcstep, samples); - break; - } -} - - -static inline ALbyte ALbyte_Sample(ALfloat val) -{ return fastf2i(clampf(val*128.0f, -128.0f, 127.0f)); } -static inline ALubyte ALubyte_Sample(ALfloat val) -{ return ALbyte_Sample(val)+128; } - -static inline ALshort ALshort_Sample(ALfloat val) -{ return fastf2i(clampf(val*32768.0f, -32768.0f, 32767.0f)); } -static inline ALushort ALushort_Sample(ALfloat val) -{ return ALshort_Sample(val)+32768; } - -static inline ALint ALint_Sample(ALfloat val) -{ return fastf2i(clampf(val*16777216.0f, -16777216.0f, 16777215.0f)) << 7; } -static inline ALuint ALuint_Sample(ALfloat val) -{ return ALint_Sample(val)+INT_MAX+1; } - -static inline ALfloat ALfloat_Sample(ALfloat val) -{ return val; } - -#define DECL_TEMPLATE(T) \ -static inline void Store_##T(T *restrict dst, const ALfloat *restrict src, \ - ALint dststep, ALsizei samples) \ -{ \ - ALsizei i; \ - for(i = 0;i < samples;i++) \ - dst[i*dststep] = T##_Sample(src[i]); \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) - -#undef DECL_TEMPLATE - -static void StoreSamples(ALvoid *dst, const ALfloat *src, ALint dststep, enum DevFmtType dsttype, ALsizei samples) -{ - switch(dsttype) - { - case DevFmtByte: - Store_ALbyte(dst, src, dststep, samples); - break; - case DevFmtUByte: - Store_ALubyte(dst, src, dststep, samples); - break; - case DevFmtShort: - Store_ALshort(dst, src, dststep, samples); - break; - case DevFmtUShort: - Store_ALushort(dst, src, dststep, samples); - break; - case DevFmtInt: - Store_ALint(dst, src, dststep, samples); - break; - case DevFmtUInt: - Store_ALuint(dst, src, dststep, samples); - break; - case DevFmtFloat: - Store_ALfloat(dst, src, dststep, samples); - break; - } -} - - -ALsizei SampleConverterAvailableOut(SampleConverter *converter, ALsizei srcframes) -{ - ALint prepcount = converter->mSrcPrepCount; - ALsizei increment = converter->mIncrement; - ALsizei DataPosFrac = converter->mFracOffset; - ALuint64 DataSize64; - - if(prepcount < 0) - { - /* Negative prepcount means we need to skip that many input samples. */ - if(-prepcount >= srcframes) - return 0; - srcframes += prepcount; - prepcount = 0; - } - - if(srcframes < 1) - { - /* No output samples if there's no input samples. */ - return 0; - } - - if(prepcount < MAX_RESAMPLE_PADDING*2 && - MAX_RESAMPLE_PADDING*2 - prepcount >= srcframes) - { - /* Not enough input samples to generate an output sample. */ - return 0; - } - - DataSize64 = prepcount; - DataSize64 += srcframes; - DataSize64 -= MAX_RESAMPLE_PADDING*2; - DataSize64 <<= FRACTIONBITS; - DataSize64 -= DataPosFrac; - - /* If we have a full prep, we can generate at least one sample. */ - return (ALsizei)clampu64((DataSize64 + increment-1)/increment, 1, BUFFERSIZE); -} - - -ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALsizei *srcframes, ALvoid *dst, ALsizei dstframes) -{ - const ALsizei SrcFrameSize = converter->mNumChannels * converter->mSrcTypeSize; - const ALsizei DstFrameSize = converter->mNumChannels * converter->mDstTypeSize; - const ALsizei increment = converter->mIncrement; - ALsizei pos = 0; - - START_MIXER_MODE(); - while(pos < dstframes && *srcframes > 0) - { - ALfloat *restrict SrcData = ASSUME_ALIGNED(converter->mSrcSamples, 16); - ALfloat *restrict DstData = ASSUME_ALIGNED(converter->mDstSamples, 16); - ALint prepcount = converter->mSrcPrepCount; - ALsizei DataPosFrac = converter->mFracOffset; - ALuint64 DataSize64; - ALsizei DstSize; - ALint toread; - ALsizei chan; - - if(prepcount < 0) - { - /* Negative prepcount means we need to skip that many input samples. */ - if(-prepcount >= *srcframes) - { - converter->mSrcPrepCount = prepcount + *srcframes; - *srcframes = 0; - break; - } - *src = (const ALbyte*)*src + SrcFrameSize*-prepcount; - *srcframes += prepcount; - converter->mSrcPrepCount = 0; - continue; - } - toread = mini(*srcframes, BUFFERSIZE - MAX_RESAMPLE_PADDING*2); - - if(prepcount < MAX_RESAMPLE_PADDING*2 && - MAX_RESAMPLE_PADDING*2 - prepcount >= toread) - { - /* Not enough input samples to generate an output sample. Store - * what we're given for later. - */ - for(chan = 0;chan < converter->mNumChannels;chan++) - LoadSamples(&converter->Chan[chan].mPrevSamples[prepcount], - (const ALbyte*)*src + converter->mSrcTypeSize*chan, - converter->mNumChannels, converter->mSrcType, toread - ); - - converter->mSrcPrepCount = prepcount + toread; - *srcframes = 0; - break; - } - - DataSize64 = prepcount; - DataSize64 += toread; - DataSize64 -= MAX_RESAMPLE_PADDING*2; - DataSize64 <<= FRACTIONBITS; - DataSize64 -= DataPosFrac; - - /* If we have a full prep, we can generate at least one sample. */ - DstSize = (ALsizei)clampu64((DataSize64 + increment-1)/increment, 1, BUFFERSIZE); - DstSize = mini(DstSize, dstframes-pos); - - for(chan = 0;chan < converter->mNumChannels;chan++) - { - const ALbyte *SrcSamples = (const ALbyte*)*src + converter->mSrcTypeSize*chan; - ALbyte *DstSamples = (ALbyte*)dst + converter->mDstTypeSize*chan; - const ALfloat *ResampledData; - ALsizei SrcDataEnd; - - /* Load the previous samples into the source data first, then the - * new samples from the input buffer. - */ - memcpy(SrcData, converter->Chan[chan].mPrevSamples, - prepcount*sizeof(ALfloat)); - LoadSamples(SrcData + prepcount, SrcSamples, - converter->mNumChannels, converter->mSrcType, toread - ); - - /* Store as many prep samples for next time as possible, given the - * number of output samples being generated. - */ - SrcDataEnd = (DataPosFrac + increment*DstSize)>>FRACTIONBITS; - if(SrcDataEnd >= prepcount+toread) - memset(converter->Chan[chan].mPrevSamples, 0, - sizeof(converter->Chan[chan].mPrevSamples)); - else - { - size_t len = mini(MAX_RESAMPLE_PADDING*2, prepcount+toread-SrcDataEnd); - memcpy(converter->Chan[chan].mPrevSamples, &SrcData[SrcDataEnd], - len*sizeof(ALfloat)); - memset(converter->Chan[chan].mPrevSamples+len, 0, - sizeof(converter->Chan[chan].mPrevSamples) - len*sizeof(ALfloat)); - } - - /* Now resample, and store the result in the output buffer. */ - ResampledData = converter->mResample(&converter->mState, - SrcData+MAX_RESAMPLE_PADDING, DataPosFrac, increment, - DstData, DstSize - ); - - StoreSamples(DstSamples, ResampledData, converter->mNumChannels, - converter->mDstType, DstSize); - } - - /* Update the number of prep samples still available, as well as the - * fractional offset. - */ - DataPosFrac += increment*DstSize; - converter->mSrcPrepCount = mini(prepcount + toread - (DataPosFrac>>FRACTIONBITS), - MAX_RESAMPLE_PADDING*2); - converter->mFracOffset = DataPosFrac & FRACTIONMASK; - - /* Update the src and dst pointers in case there's still more to do. */ - *src = (const ALbyte*)*src + SrcFrameSize*(DataPosFrac>>FRACTIONBITS); - *srcframes -= mini(*srcframes, (DataPosFrac>>FRACTIONBITS)); - - dst = (ALbyte*)dst + DstFrameSize*DstSize; - pos += DstSize; - } - END_MIXER_MODE(); - - return pos; -} - - -ChannelConverter *CreateChannelConverter(enum DevFmtType srcType, enum DevFmtChannels srcChans, enum DevFmtChannels dstChans) -{ - ChannelConverter *converter; - - if(srcChans != dstChans && !((srcChans == DevFmtMono && dstChans == DevFmtStereo) || - (srcChans == DevFmtStereo && dstChans == DevFmtMono))) - return NULL; - - converter = al_calloc(DEF_ALIGN, sizeof(*converter)); - converter->mSrcType = srcType; - converter->mSrcChans = srcChans; - converter->mDstChans = dstChans; - - return converter; -} - -void DestroyChannelConverter(ChannelConverter **converter) -{ - if(converter) - { - al_free(*converter); - *converter = NULL; - } -} - - -#define DECL_TEMPLATE(T) \ -static void Mono2Stereo##T(ALfloat *restrict dst, const T *src, ALsizei frames)\ -{ \ - ALsizei i; \ - for(i = 0;i < frames;i++) \ - dst[i*2 + 1] = dst[i*2 + 0] = Sample_##T(src[i]) * 0.707106781187f; \ -} \ - \ -static void Stereo2Mono##T(ALfloat *restrict dst, const T *src, ALsizei frames)\ -{ \ - ALsizei i; \ - for(i = 0;i < frames;i++) \ - dst[i] = (Sample_##T(src[i*2 + 0])+Sample_##T(src[i*2 + 1])) * \ - 0.707106781187f; \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) - -#undef DECL_TEMPLATE - -void ChannelConverterInput(ChannelConverter *converter, const ALvoid *src, ALfloat *dst, ALsizei frames) -{ - if(converter->mSrcChans == converter->mDstChans) - { - LoadSamples(dst, src, 1, converter->mSrcType, - frames*ChannelsFromDevFmt(converter->mSrcChans, 0)); - return; - } - - if(converter->mSrcChans == DevFmtStereo && converter->mDstChans == DevFmtMono) - { - switch(converter->mSrcType) - { - case DevFmtByte: - Stereo2MonoALbyte(dst, src, frames); - break; - case DevFmtUByte: - Stereo2MonoALubyte(dst, src, frames); - break; - case DevFmtShort: - Stereo2MonoALshort(dst, src, frames); - break; - case DevFmtUShort: - Stereo2MonoALushort(dst, src, frames); - break; - case DevFmtInt: - Stereo2MonoALint(dst, src, frames); - break; - case DevFmtUInt: - Stereo2MonoALuint(dst, src, frames); - break; - case DevFmtFloat: - Stereo2MonoALfloat(dst, src, frames); - break; - } - } - else /*if(converter->mSrcChans == DevFmtMono && converter->mDstChans == DevFmtStereo)*/ - { - switch(converter->mSrcType) - { - case DevFmtByte: - Mono2StereoALbyte(dst, src, frames); - break; - case DevFmtUByte: - Mono2StereoALubyte(dst, src, frames); - break; - case DevFmtShort: - Mono2StereoALshort(dst, src, frames); - break; - case DevFmtUShort: - Mono2StereoALushort(dst, src, frames); - break; - case DevFmtInt: - Mono2StereoALint(dst, src, frames); - break; - case DevFmtUInt: - Mono2StereoALuint(dst, src, frames); - break; - case DevFmtFloat: - Mono2StereoALfloat(dst, src, frames); - break; - } - } -} diff --git a/Alc/converter.h b/Alc/converter.h deleted file mode 100644 index b58fd83..0000000 --- a/Alc/converter.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef CONVERTER_H -#define CONVERTER_H - -#include "alMain.h" -#include "alu.h" - -#ifdef __cpluspluc -extern "C" { -#endif - -typedef struct SampleConverter { - enum DevFmtType mSrcType; - enum DevFmtType mDstType; - ALsizei mNumChannels; - ALsizei mSrcTypeSize; - ALsizei mDstTypeSize; - - ALint mSrcPrepCount; - - ALsizei mFracOffset; - ALsizei mIncrement; - InterpState mState; - ResamplerFunc mResample; - - alignas(16) ALfloat mSrcSamples[BUFFERSIZE]; - alignas(16) ALfloat mDstSamples[BUFFERSIZE]; - - struct { - alignas(16) ALfloat mPrevSamples[MAX_RESAMPLE_PADDING*2]; - } Chan[]; -} SampleConverter; - -SampleConverter *CreateSampleConverter(enum DevFmtType srcType, enum DevFmtType dstType, ALsizei numchans, ALsizei srcRate, ALsizei dstRate); -void DestroySampleConverter(SampleConverter **converter); - -ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALsizei *srcframes, ALvoid *dst, ALsizei dstframes); -ALsizei SampleConverterAvailableOut(SampleConverter *converter, ALsizei srcframes); - - -typedef struct ChannelConverter { - enum DevFmtType mSrcType; - enum DevFmtChannels mSrcChans; - enum DevFmtChannels mDstChans; -} ChannelConverter; - -ChannelConverter *CreateChannelConverter(enum DevFmtType srcType, enum DevFmtChannels srcChans, enum DevFmtChannels dstChans); -void DestroyChannelConverter(ChannelConverter **converter); - -void ChannelConverterInput(ChannelConverter *converter, const ALvoid *src, ALfloat *dst, ALsizei frames); - -#ifdef __cpluspluc -} -#endif - -#endif /* CONVERTER_H */ diff --git a/Alc/effects/autowah.c b/Alc/effects/autowah.c deleted file mode 100644 index 28b366b..0000000 --- a/Alc/effects/autowah.c +++ /dev/null @@ -1,321 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2018 by Raul Herraiz. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - -#define MIN_FREQ 20.0f -#define MAX_FREQ 2500.0f -#define Q_FACTOR 5.0f - -typedef struct ALautowahState { - DERIVE_FROM_TYPE(ALeffectState); - - /* Effect parameters */ - ALfloat AttackRate; - ALfloat ReleaseRate; - ALfloat ResonanceGain; - ALfloat PeakGain; - ALfloat FreqMinNorm; - ALfloat BandwidthNorm; - ALfloat env_delay; - - /* Filter components derived from the envelope. */ - struct { - ALfloat cos_w0; - ALfloat alpha; - } Env[BUFFERSIZE]; - - struct { - /* Effect filters' history. */ - struct { - ALfloat z1, z2; - } Filter; - - /* Effect gains for each output channel */ - ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; - ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; - } Chans[MAX_EFFECT_CHANNELS]; - - /* Effects buffers */ - alignas(16) ALfloat BufferOut[BUFFERSIZE]; -} ALautowahState; - -static ALvoid ALautowahState_Destruct(ALautowahState *state); -static ALboolean ALautowahState_deviceUpdate(ALautowahState *state, ALCdevice *device); -static ALvoid ALautowahState_update(ALautowahState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALautowahState_process(ALautowahState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALautowahState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALautowahState); - -static void ALautowahState_Construct(ALautowahState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALautowahState, ALeffectState, state); -} - -static ALvoid ALautowahState_Destruct(ALautowahState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALautowahState_deviceUpdate(ALautowahState *state, ALCdevice *UNUSED(device)) -{ - /* (Re-)initializing parameters and clear the buffers. */ - ALsizei i, j; - - state->AttackRate = 1.0f; - state->ReleaseRate = 1.0f; - state->ResonanceGain = 10.0f; - state->PeakGain = 4.5f; - state->FreqMinNorm = 4.5e-4f; - state->BandwidthNorm = 0.05f; - state->env_delay = 0.0f; - - memset(state->Env, 0, sizeof(state->Env)); - - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - { - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - state->Chans[i].CurrentGains[j] = 0.0f; - state->Chans[i].Filter.z1 = 0.0f; - state->Chans[i].Filter.z2 = 0.0f; - } - - return AL_TRUE; -} - -static ALvoid ALautowahState_update(ALautowahState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALfloat ReleaseTime; - ALsizei i; - - ReleaseTime = clampf(props->Autowah.ReleaseTime, 0.001f, 1.0f); - - state->AttackRate = expf(-1.0f / (props->Autowah.AttackTime*device->Frequency)); - state->ReleaseRate = expf(-1.0f / (ReleaseTime*device->Frequency)); - /* 0-20dB Resonance Peak gain */ - state->ResonanceGain = sqrtf(log10f(props->Autowah.Resonance)*10.0f / 3.0f); - state->PeakGain = 1.0f - log10f(props->Autowah.PeakGain/AL_AUTOWAH_MAX_PEAK_GAIN); - state->FreqMinNorm = MIN_FREQ / device->Frequency; - state->BandwidthNorm = (MAX_FREQ-MIN_FREQ) / device->Frequency; - - STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(&device->FOAOut, IdentityMatrixf.m[i], - slot->Params.Gain, state->Chans[i].TargetGains); -} - -static ALvoid ALautowahState_process(ALautowahState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - const ALfloat attack_rate = state->AttackRate; - const ALfloat release_rate = state->ReleaseRate; - const ALfloat res_gain = state->ResonanceGain; - const ALfloat peak_gain = state->PeakGain; - const ALfloat freq_min = state->FreqMinNorm; - const ALfloat bandwidth = state->BandwidthNorm; - ALfloat env_delay; - ALsizei c, i; - - env_delay = state->env_delay; - for(i = 0;i < SamplesToDo;i++) - { - ALfloat w0, sample, a; - - /* Envelope follower described on the book: Audio Effects, Theory, - * Implementation and Application. - */ - sample = peak_gain * fabsf(SamplesIn[0][i]); - a = (sample > env_delay) ? attack_rate : release_rate; - env_delay = lerp(sample, env_delay, a); - - /* Calculate the cos and alpha components for this sample's filter. */ - w0 = minf((bandwidth*env_delay + freq_min), 0.46f) * F_TAU; - state->Env[i].cos_w0 = cosf(w0); - state->Env[i].alpha = sinf(w0)/(2.0f * Q_FACTOR); - } - state->env_delay = env_delay; - - for(c = 0;c < MAX_EFFECT_CHANNELS; c++) - { - /* This effectively inlines BiquadFilter_setParams for a peaking - * filter and BiquadFilter_processC. The alpha and cosine components - * for the filter coefficients were previously calculated with the - * envelope. Because the filter changes for each sample, the - * coefficients are transient and don't need to be held. - */ - ALfloat z1 = state->Chans[c].Filter.z1; - ALfloat z2 = state->Chans[c].Filter.z2; - - for(i = 0;i < SamplesToDo;i++) - { - const ALfloat alpha = state->Env[i].alpha; - const ALfloat cos_w0 = state->Env[i].cos_w0; - ALfloat input, output; - ALfloat a[3], b[3]; - - b[0] = 1.0f + alpha*res_gain; - b[1] = -2.0f * cos_w0; - b[2] = 1.0f - alpha*res_gain; - a[0] = 1.0f + alpha/res_gain; - a[1] = -2.0f * cos_w0; - a[2] = 1.0f - alpha/res_gain; - - input = SamplesIn[c][i]; - output = input*(b[0]/a[0]) + z1; - z1 = input*(b[1]/a[0]) - output*(a[1]/a[0]) + z2; - z2 = input*(b[2]/a[0]) - output*(a[2]/a[0]); - state->BufferOut[i] = output; - } - state->Chans[c].Filter.z1 = z1; - state->Chans[c].Filter.z2 = z2; - - /* Now, mix the processed sound data to the output. */ - MixSamples(state->BufferOut, NumChannels, SamplesOut, state->Chans[c].CurrentGains, - state->Chans[c].TargetGains, SamplesToDo, 0, SamplesToDo); - } -} - -typedef struct AutowahStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} AutowahStateFactory; - -static ALeffectState *AutowahStateFactory_create(AutowahStateFactory *UNUSED(factory)) -{ - ALautowahState *state; - - NEW_OBJ0(state, ALautowahState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(AutowahStateFactory); - -EffectStateFactory *AutowahStateFactory_getFactory(void) -{ - static AutowahStateFactory AutowahFactory = { { GET_VTABLE2(AutowahStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &AutowahFactory); -} - -void ALautowah_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_AUTOWAH_ATTACK_TIME: - if(!(val >= AL_AUTOWAH_MIN_ATTACK_TIME && val <= AL_AUTOWAH_MAX_ATTACK_TIME)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah attack time out of range"); - props->Autowah.AttackTime = val; - break; - - case AL_AUTOWAH_RELEASE_TIME: - if(!(val >= AL_AUTOWAH_MIN_RELEASE_TIME && val <= AL_AUTOWAH_MAX_RELEASE_TIME)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah release time out of range"); - props->Autowah.ReleaseTime = val; - break; - - case AL_AUTOWAH_RESONANCE: - if(!(val >= AL_AUTOWAH_MIN_RESONANCE && val <= AL_AUTOWAH_MAX_RESONANCE)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah resonance out of range"); - props->Autowah.Resonance = val; - break; - - case AL_AUTOWAH_PEAK_GAIN: - if(!(val >= AL_AUTOWAH_MIN_PEAK_GAIN && val <= AL_AUTOWAH_MAX_PEAK_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah peak gain out of range"); - props->Autowah.PeakGain = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param); - } -} - -void ALautowah_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALautowah_setParamf(effect, context, param, vals[0]); -} - -void ALautowah_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ - alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param); -} - -void ALautowah_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ - alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param); -} - -void ALautowah_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ - alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param); -} -void ALautowah_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ - alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param); -} - -void ALautowah_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_AUTOWAH_ATTACK_TIME: - *val = props->Autowah.AttackTime; - break; - - case AL_AUTOWAH_RELEASE_TIME: - *val = props->Autowah.ReleaseTime; - break; - - case AL_AUTOWAH_RESONANCE: - *val = props->Autowah.Resonance; - break; - - case AL_AUTOWAH_PEAK_GAIN: - *val = props->Autowah.PeakGain; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param); - } - -} - -void ALautowah_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALautowah_getParamf(effect, context, param, vals); -} - -DEFINE_ALEFFECT_VTABLE(ALautowah); diff --git a/Alc/effects/chorus.c b/Alc/effects/chorus.c deleted file mode 100644 index ffb2b57..0000000 --- a/Alc/effects/chorus.c +++ /dev/null @@ -1,555 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2013 by Mike Gorchak - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - - -static_assert(AL_CHORUS_WAVEFORM_SINUSOID == AL_FLANGER_WAVEFORM_SINUSOID, "Chorus/Flanger waveform value mismatch"); -static_assert(AL_CHORUS_WAVEFORM_TRIANGLE == AL_FLANGER_WAVEFORM_TRIANGLE, "Chorus/Flanger waveform value mismatch"); - -enum WaveForm { - WF_Sinusoid, - WF_Triangle -}; - -typedef struct ALchorusState { - DERIVE_FROM_TYPE(ALeffectState); - - ALfloat *SampleBuffer; - ALsizei BufferLength; - ALsizei offset; - - ALsizei lfo_offset; - ALsizei lfo_range; - ALfloat lfo_scale; - ALint lfo_disp; - - /* Gains for left and right sides */ - struct { - ALfloat Current[MAX_OUTPUT_CHANNELS]; - ALfloat Target[MAX_OUTPUT_CHANNELS]; - } Gains[2]; - - /* effect parameters */ - enum WaveForm waveform; - ALint delay; - ALfloat depth; - ALfloat feedback; -} ALchorusState; - -static ALvoid ALchorusState_Destruct(ALchorusState *state); -static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device); -static ALvoid ALchorusState_update(ALchorusState *state, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props); -static ALvoid ALchorusState_process(ALchorusState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALchorusState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALchorusState); - - -static void ALchorusState_Construct(ALchorusState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALchorusState, ALeffectState, state); - - state->BufferLength = 0; - state->SampleBuffer = NULL; - state->offset = 0; - state->lfo_offset = 0; - state->lfo_range = 1; - state->waveform = WF_Triangle; -} - -static ALvoid ALchorusState_Destruct(ALchorusState *state) -{ - al_free(state->SampleBuffer); - state->SampleBuffer = NULL; - - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device) -{ - const ALfloat max_delay = maxf(AL_CHORUS_MAX_DELAY, AL_FLANGER_MAX_DELAY); - ALsizei maxlen; - - maxlen = NextPowerOf2(float2int(max_delay*2.0f*Device->Frequency) + 1u); - if(maxlen <= 0) return AL_FALSE; - - if(maxlen != state->BufferLength) - { - void *temp = al_calloc(16, maxlen * sizeof(ALfloat)); - if(!temp) return AL_FALSE; - - al_free(state->SampleBuffer); - state->SampleBuffer = temp; - - state->BufferLength = maxlen; - } - - memset(state->SampleBuffer, 0, state->BufferLength*sizeof(ALfloat)); - memset(state->Gains, 0, sizeof(state->Gains)); - - return AL_TRUE; -} - -static ALvoid ALchorusState_update(ALchorusState *state, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props) -{ - const ALsizei mindelay = MAX_RESAMPLE_PADDING << FRACTIONBITS; - const ALCdevice *device = Context->Device; - ALfloat frequency = (ALfloat)device->Frequency; - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat rate; - ALint phase; - - switch(props->Chorus.Waveform) - { - case AL_CHORUS_WAVEFORM_TRIANGLE: - state->waveform = WF_Triangle; - break; - case AL_CHORUS_WAVEFORM_SINUSOID: - state->waveform = WF_Sinusoid; - break; - } - - /* The LFO depth is scaled to be relative to the sample delay. Clamp the - * delay and depth to allow enough padding for resampling. - */ - state->delay = maxi(float2int(props->Chorus.Delay*frequency*FRACTIONONE + 0.5f), - mindelay); - state->depth = minf(props->Chorus.Depth * state->delay, - (ALfloat)(state->delay - mindelay)); - - state->feedback = props->Chorus.Feedback; - - /* Gains for left and right sides */ - CalcAngleCoeffs(-F_PI_2, 0.0f, 0.0f, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, Slot->Params.Gain, state->Gains[0].Target); - CalcAngleCoeffs( F_PI_2, 0.0f, 0.0f, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, Slot->Params.Gain, state->Gains[1].Target); - - phase = props->Chorus.Phase; - rate = props->Chorus.Rate; - if(!(rate > 0.0f)) - { - state->lfo_offset = 0; - state->lfo_range = 1; - state->lfo_scale = 0.0f; - state->lfo_disp = 0; - } - else - { - /* Calculate LFO coefficient (number of samples per cycle). Limit the - * max range to avoid overflow when calculating the displacement. - */ - ALsizei lfo_range = float2int(minf(frequency/rate + 0.5f, (ALfloat)(INT_MAX/360 - 180))); - - state->lfo_offset = float2int((ALfloat)state->lfo_offset/state->lfo_range* - lfo_range + 0.5f) % lfo_range; - state->lfo_range = lfo_range; - switch(state->waveform) - { - case WF_Triangle: - state->lfo_scale = 4.0f / state->lfo_range; - break; - case WF_Sinusoid: - state->lfo_scale = F_TAU / state->lfo_range; - break; - } - - /* Calculate lfo phase displacement */ - if(phase < 0) phase = 360 + phase; - state->lfo_disp = (state->lfo_range*phase + 180) / 360; - } -} - -static void GetTriangleDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, - const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, - const ALsizei todo) -{ - ALsizei i; - for(i = 0;i < todo;i++) - { - delays[i] = fastf2i((1.0f - fabsf(2.0f - lfo_scale*offset)) * depth) + delay; - offset = (offset+1)%lfo_range; - } -} - -static void GetSinusoidDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, - const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, - const ALsizei todo) -{ - ALsizei i; - for(i = 0;i < todo;i++) - { - delays[i] = fastf2i(sinf(lfo_scale*offset) * depth) + delay; - offset = (offset+1)%lfo_range; - } -} - - -static ALvoid ALchorusState_process(ALchorusState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - const ALsizei bufmask = state->BufferLength-1; - const ALfloat feedback = state->feedback; - const ALsizei avgdelay = (state->delay + (FRACTIONONE>>1)) >> FRACTIONBITS; - ALfloat *restrict delaybuf = state->SampleBuffer; - ALsizei offset = state->offset; - ALsizei i, c; - ALsizei base; - - for(base = 0;base < SamplesToDo;) - { - const ALsizei todo = mini(256, SamplesToDo-base); - ALint moddelays[2][256]; - alignas(16) ALfloat temps[2][256]; - - if(state->waveform == WF_Sinusoid) - { - GetSinusoidDelays(moddelays[0], state->lfo_offset, state->lfo_range, state->lfo_scale, - state->depth, state->delay, todo); - GetSinusoidDelays(moddelays[1], (state->lfo_offset+state->lfo_disp)%state->lfo_range, - state->lfo_range, state->lfo_scale, state->depth, state->delay, - todo); - } - else /*if(state->waveform == WF_Triangle)*/ - { - GetTriangleDelays(moddelays[0], state->lfo_offset, state->lfo_range, state->lfo_scale, - state->depth, state->delay, todo); - GetTriangleDelays(moddelays[1], (state->lfo_offset+state->lfo_disp)%state->lfo_range, - state->lfo_range, state->lfo_scale, state->depth, state->delay, - todo); - } - state->lfo_offset = (state->lfo_offset+todo) % state->lfo_range; - - for(i = 0;i < todo;i++) - { - ALint delay; - ALfloat mu; - - // Feed the buffer's input first (necessary for delays < 1). - delaybuf[offset&bufmask] = SamplesIn[0][base+i]; - - // Tap for the left output. - delay = offset - (moddelays[0][i]>>FRACTIONBITS); - mu = (moddelays[0][i]&FRACTIONMASK) * (1.0f/FRACTIONONE); - temps[0][i] = cubic(delaybuf[(delay+1) & bufmask], delaybuf[(delay ) & bufmask], - delaybuf[(delay-1) & bufmask], delaybuf[(delay-2) & bufmask], - mu); - - // Tap for the right output. - delay = offset - (moddelays[1][i]>>FRACTIONBITS); - mu = (moddelays[1][i]&FRACTIONMASK) * (1.0f/FRACTIONONE); - temps[1][i] = cubic(delaybuf[(delay+1) & bufmask], delaybuf[(delay ) & bufmask], - delaybuf[(delay-1) & bufmask], delaybuf[(delay-2) & bufmask], - mu); - - // Accumulate feedback from the average delay of the taps. - delaybuf[offset&bufmask] += delaybuf[(offset-avgdelay) & bufmask] * feedback; - offset++; - } - - for(c = 0;c < 2;c++) - MixSamples(temps[c], NumChannels, SamplesOut, state->Gains[c].Current, - state->Gains[c].Target, SamplesToDo-base, base, todo); - - base += todo; - } - - state->offset = offset; -} - - -typedef struct ChorusStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} ChorusStateFactory; - -static ALeffectState *ChorusStateFactory_create(ChorusStateFactory *UNUSED(factory)) -{ - ALchorusState *state; - - NEW_OBJ0(state, ALchorusState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(ChorusStateFactory); - - -EffectStateFactory *ChorusStateFactory_getFactory(void) -{ - static ChorusStateFactory ChorusFactory = { { GET_VTABLE2(ChorusStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &ChorusFactory); -} - - -void ALchorus_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_WAVEFORM: - if(!(val >= AL_CHORUS_MIN_WAVEFORM && val <= AL_CHORUS_MAX_WAVEFORM)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid chorus waveform"); - props->Chorus.Waveform = val; - break; - - case AL_CHORUS_PHASE: - if(!(val >= AL_CHORUS_MIN_PHASE && val <= AL_CHORUS_MAX_PHASE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus phase out of range"); - props->Chorus.Phase = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param); - } -} -void ALchorus_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ ALchorus_setParami(effect, context, param, vals[0]); } -void ALchorus_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_RATE: - if(!(val >= AL_CHORUS_MIN_RATE && val <= AL_CHORUS_MAX_RATE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus rate out of range"); - props->Chorus.Rate = val; - break; - - case AL_CHORUS_DEPTH: - if(!(val >= AL_CHORUS_MIN_DEPTH && val <= AL_CHORUS_MAX_DEPTH)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus depth out of range"); - props->Chorus.Depth = val; - break; - - case AL_CHORUS_FEEDBACK: - if(!(val >= AL_CHORUS_MIN_FEEDBACK && val <= AL_CHORUS_MAX_FEEDBACK)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus feedback out of range"); - props->Chorus.Feedback = val; - break; - - case AL_CHORUS_DELAY: - if(!(val >= AL_CHORUS_MIN_DELAY && val <= AL_CHORUS_MAX_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus delay out of range"); - props->Chorus.Delay = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param); - } -} -void ALchorus_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALchorus_setParamf(effect, context, param, vals[0]); } - -void ALchorus_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_WAVEFORM: - *val = props->Chorus.Waveform; - break; - - case AL_CHORUS_PHASE: - *val = props->Chorus.Phase; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param); - } -} -void ALchorus_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ ALchorus_getParami(effect, context, param, vals); } -void ALchorus_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_RATE: - *val = props->Chorus.Rate; - break; - - case AL_CHORUS_DEPTH: - *val = props->Chorus.Depth; - break; - - case AL_CHORUS_FEEDBACK: - *val = props->Chorus.Feedback; - break; - - case AL_CHORUS_DELAY: - *val = props->Chorus.Delay; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param); - } -} -void ALchorus_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALchorus_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALchorus); - - -/* Flanger is basically a chorus with a really short delay. They can both use - * the same processing functions, so piggyback flanger on the chorus functions. - */ -typedef struct FlangerStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} FlangerStateFactory; - -ALeffectState *FlangerStateFactory_create(FlangerStateFactory *UNUSED(factory)) -{ - ALchorusState *state; - - NEW_OBJ0(state, ALchorusState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(FlangerStateFactory); - -EffectStateFactory *FlangerStateFactory_getFactory(void) -{ - static FlangerStateFactory FlangerFactory = { { GET_VTABLE2(FlangerStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &FlangerFactory); -} - - -void ALflanger_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_WAVEFORM: - if(!(val >= AL_FLANGER_MIN_WAVEFORM && val <= AL_FLANGER_MAX_WAVEFORM)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid flanger waveform"); - props->Chorus.Waveform = val; - break; - - case AL_FLANGER_PHASE: - if(!(val >= AL_FLANGER_MIN_PHASE && val <= AL_FLANGER_MAX_PHASE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger phase out of range"); - props->Chorus.Phase = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param); - } -} -void ALflanger_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ ALflanger_setParami(effect, context, param, vals[0]); } -void ALflanger_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_RATE: - if(!(val >= AL_FLANGER_MIN_RATE && val <= AL_FLANGER_MAX_RATE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger rate out of range"); - props->Chorus.Rate = val; - break; - - case AL_FLANGER_DEPTH: - if(!(val >= AL_FLANGER_MIN_DEPTH && val <= AL_FLANGER_MAX_DEPTH)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger depth out of range"); - props->Chorus.Depth = val; - break; - - case AL_FLANGER_FEEDBACK: - if(!(val >= AL_FLANGER_MIN_FEEDBACK && val <= AL_FLANGER_MAX_FEEDBACK)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger feedback out of range"); - props->Chorus.Feedback = val; - break; - - case AL_FLANGER_DELAY: - if(!(val >= AL_FLANGER_MIN_DELAY && val <= AL_FLANGER_MAX_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger delay out of range"); - props->Chorus.Delay = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param); - } -} -void ALflanger_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALflanger_setParamf(effect, context, param, vals[0]); } - -void ALflanger_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_WAVEFORM: - *val = props->Chorus.Waveform; - break; - - case AL_FLANGER_PHASE: - *val = props->Chorus.Phase; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param); - } -} -void ALflanger_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ ALflanger_getParami(effect, context, param, vals); } -void ALflanger_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_RATE: - *val = props->Chorus.Rate; - break; - - case AL_FLANGER_DEPTH: - *val = props->Chorus.Depth; - break; - - case AL_FLANGER_FEEDBACK: - *val = props->Chorus.Feedback; - break; - - case AL_FLANGER_DELAY: - *val = props->Chorus.Delay; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param); - } -} -void ALflanger_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALflanger_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALflanger); diff --git a/Alc/effects/compressor.c b/Alc/effects/compressor.c deleted file mode 100644 index af60777..0000000 --- a/Alc/effects/compressor.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2013 by Anis A. Hireche - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include - -#include "config.h" -#include "alError.h" -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alu.h" - - -#define AMP_ENVELOPE_MIN 0.5f -#define AMP_ENVELOPE_MAX 2.0f - -#define ATTACK_TIME 0.1f /* 100ms to rise from min to max */ -#define RELEASE_TIME 0.2f /* 200ms to drop from max to min */ - - -typedef struct ALcompressorState { - DERIVE_FROM_TYPE(ALeffectState); - - /* Effect gains for each channel */ - ALfloat Gain[MAX_EFFECT_CHANNELS][MAX_OUTPUT_CHANNELS]; - - /* Effect parameters */ - ALboolean Enabled; - ALfloat AttackMult; - ALfloat ReleaseMult; - ALfloat EnvFollower; -} ALcompressorState; - -static ALvoid ALcompressorState_Destruct(ALcompressorState *state); -static ALboolean ALcompressorState_deviceUpdate(ALcompressorState *state, ALCdevice *device); -static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALcompressorState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALcompressorState); - - -static void ALcompressorState_Construct(ALcompressorState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALcompressorState, ALeffectState, state); - - state->Enabled = AL_TRUE; - state->AttackMult = 1.0f; - state->ReleaseMult = 1.0f; - state->EnvFollower = 1.0f; -} - -static ALvoid ALcompressorState_Destruct(ALcompressorState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALcompressorState_deviceUpdate(ALcompressorState *state, ALCdevice *device) -{ - /* Number of samples to do a full attack and release (non-integer sample - * counts are okay). - */ - const ALfloat attackCount = (ALfloat)device->Frequency * ATTACK_TIME; - const ALfloat releaseCount = (ALfloat)device->Frequency * RELEASE_TIME; - - /* Calculate per-sample multipliers to attack and release at the desired - * rates. - */ - state->AttackMult = powf(AMP_ENVELOPE_MAX/AMP_ENVELOPE_MIN, 1.0f/attackCount); - state->ReleaseMult = powf(AMP_ENVELOPE_MIN/AMP_ENVELOPE_MAX, 1.0f/releaseCount); - - return AL_TRUE; -} - -static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALuint i; - - state->Enabled = props->Compressor.OnOff; - - STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; - for(i = 0;i < 4;i++) - ComputeFirstOrderGains(&device->FOAOut, IdentityMatrixf.m[i], - slot->Params.Gain, state->Gain[i]); -} - -static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ALsizei i, j, k; - ALsizei base; - - for(base = 0;base < SamplesToDo;) - { - ALfloat gains[256]; - ALsizei td = mini(256, SamplesToDo-base); - ALfloat env = state->EnvFollower; - - /* Generate the per-sample gains from the signal envelope. */ - if(state->Enabled) - { - for(i = 0;i < td;++i) - { - /* Clamp the absolute amplitude to the defined envelope limits, - * then attack or release the envelope to reach it. - */ - ALfloat amplitude = clampf(fabsf(SamplesIn[0][base+i]), - AMP_ENVELOPE_MIN, AMP_ENVELOPE_MAX); - if(amplitude > env) - env = minf(env*state->AttackMult, amplitude); - else if(amplitude < env) - env = maxf(env*state->ReleaseMult, amplitude); - - /* Apply the reciprocal of the envelope to normalize the volume - * (compress the dynamic range). - */ - gains[i] = 1.0f / env; - } - } - else - { - /* Same as above, except the amplitude is forced to 1. This helps - * ensure smooth gain changes when the compressor is turned on and - * off. - */ - for(i = 0;i < td;++i) - { - ALfloat amplitude = 1.0f; - if(amplitude > env) - env = minf(env*state->AttackMult, amplitude); - else if(amplitude < env) - env = maxf(env*state->ReleaseMult, amplitude); - - gains[i] = 1.0f / env; - } - } - state->EnvFollower = env; - - /* Now compress the signal amplitude to output. */ - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - { - for(k = 0;k < NumChannels;k++) - { - ALfloat gain = state->Gain[j][k]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - for(i = 0;i < td;i++) - SamplesOut[k][base+i] += SamplesIn[j][base+i] * gains[i] * gain; - } - } - - base += td; - } -} - - -typedef struct CompressorStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} CompressorStateFactory; - -static ALeffectState *CompressorStateFactory_create(CompressorStateFactory *UNUSED(factory)) -{ - ALcompressorState *state; - - NEW_OBJ0(state, ALcompressorState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(CompressorStateFactory); - -EffectStateFactory *CompressorStateFactory_getFactory(void) -{ - static CompressorStateFactory CompressorFactory = { { GET_VTABLE2(CompressorStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &CompressorFactory); -} - - -void ALcompressor_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_COMPRESSOR_ONOFF: - if(!(val >= AL_COMPRESSOR_MIN_ONOFF && val <= AL_COMPRESSOR_MAX_ONOFF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Compressor state out of range"); - props->Compressor.OnOff = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", - param); - } -} -void ALcompressor_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ ALcompressor_setParami(effect, context, param, vals[0]); } -void ALcompressor_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param); } -void ALcompressor_setParamfv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param); } - -void ALcompressor_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_COMPRESSOR_ONOFF: - *val = props->Compressor.OnOff; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", - param); - } -} -void ALcompressor_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ ALcompressor_getParami(effect, context, param, vals); } -void ALcompressor_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param); } -void ALcompressor_getParamfv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param); } - -DEFINE_ALEFFECT_VTABLE(ALcompressor); diff --git a/Alc/effects/dedicated.c b/Alc/effects/dedicated.c deleted file mode 100644 index 62a3894..0000000 --- a/Alc/effects/dedicated.c +++ /dev/null @@ -1,184 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2011 by Chris Robinson. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - - -typedef struct ALdedicatedState { - DERIVE_FROM_TYPE(ALeffectState); - - ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; - ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; -} ALdedicatedState; - -static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state); -static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *state, ALCdevice *device); -static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALdedicatedState_process(ALdedicatedState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALdedicatedState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALdedicatedState); - - -static void ALdedicatedState_Construct(ALdedicatedState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALdedicatedState, ALeffectState, state); -} - -static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *state, ALCdevice *UNUSED(device)) -{ - ALsizei i; - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - state->CurrentGains[i] = 0.0f; - return AL_TRUE; -} - -static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALfloat Gain; - ALsizei i; - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - state->TargetGains[i] = 0.0f; - - Gain = slot->Params.Gain * props->Dedicated.Gain; - if(slot->Params.EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT) - { - int idx; - if((idx=GetChannelIdxByName(&device->RealOut, LFE)) != -1) - { - STATIC_CAST(ALeffectState,state)->OutBuffer = device->RealOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->RealOut.NumChannels; - state->TargetGains[idx] = Gain; - } - } - else if(slot->Params.EffectType == AL_EFFECT_DEDICATED_DIALOGUE) - { - int idx; - /* Dialog goes to the front-center speaker if it exists, otherwise it - * plays from the front-center location. */ - if((idx=GetChannelIdxByName(&device->RealOut, FrontCenter)) != -1) - { - STATIC_CAST(ALeffectState,state)->OutBuffer = device->RealOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->RealOut.NumChannels; - state->TargetGains[idx] = Gain; - } - else - { - ALfloat coeffs[MAX_AMBI_COEFFS]; - CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); - - STATIC_CAST(ALeffectState,state)->OutBuffer = device->Dry.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->Dry.NumChannels; - ComputeDryPanGains(&device->Dry, coeffs, Gain, state->TargetGains); - } - } -} - -static ALvoid ALdedicatedState_process(ALdedicatedState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - MixSamples(SamplesIn[0], NumChannels, SamplesOut, state->CurrentGains, - state->TargetGains, SamplesToDo, 0, SamplesToDo); -} - - -typedef struct DedicatedStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} DedicatedStateFactory; - -ALeffectState *DedicatedStateFactory_create(DedicatedStateFactory *UNUSED(factory)) -{ - ALdedicatedState *state; - - NEW_OBJ0(state, ALdedicatedState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(DedicatedStateFactory); - - -EffectStateFactory *DedicatedStateFactory_getFactory(void) -{ - static DedicatedStateFactory DedicatedFactory = { { GET_VTABLE2(DedicatedStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &DedicatedFactory); -} - - -void ALdedicated_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param); } -void ALdedicated_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param); } -void ALdedicated_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_DEDICATED_GAIN: - if(!(val >= 0.0f && isfinite(val))) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Dedicated gain out of range"); - props->Dedicated.Gain = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param); - } -} -void ALdedicated_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALdedicated_setParamf(effect, context, param, vals[0]); } - -void ALdedicated_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param); } -void ALdedicated_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param); } -void ALdedicated_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_DEDICATED_GAIN: - *val = props->Dedicated.Gain; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param); - } -} -void ALdedicated_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALdedicated_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALdedicated); diff --git a/Alc/effects/distortion.c b/Alc/effects/distortion.c deleted file mode 100644 index f4e9969..0000000 --- a/Alc/effects/distortion.c +++ /dev/null @@ -1,287 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2013 by Mike Gorchak - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - - -typedef struct ALdistortionState { - DERIVE_FROM_TYPE(ALeffectState); - - /* Effect gains for each channel */ - ALfloat Gain[MAX_OUTPUT_CHANNELS]; - - /* Effect parameters */ - BiquadFilter lowpass; - BiquadFilter bandpass; - ALfloat attenuation; - ALfloat edge_coeff; - - ALfloat Buffer[2][BUFFERSIZE]; -} ALdistortionState; - -static ALvoid ALdistortionState_Destruct(ALdistortionState *state); -static ALboolean ALdistortionState_deviceUpdate(ALdistortionState *state, ALCdevice *device); -static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALdistortionState_process(ALdistortionState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALdistortionState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALdistortionState); - - -static void ALdistortionState_Construct(ALdistortionState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALdistortionState, ALeffectState, state); -} - -static ALvoid ALdistortionState_Destruct(ALdistortionState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALdistortionState_deviceUpdate(ALdistortionState *state, ALCdevice *UNUSED(device)) -{ - BiquadFilter_clear(&state->lowpass); - BiquadFilter_clear(&state->bandpass); - return AL_TRUE; -} - -static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALfloat frequency = (ALfloat)device->Frequency; - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat bandwidth; - ALfloat cutoff; - ALfloat edge; - - /* Store waveshaper edge settings. */ - edge = sinf(props->Distortion.Edge * (F_PI_2)); - edge = minf(edge, 0.99f); - state->edge_coeff = 2.0f * edge / (1.0f-edge); - - cutoff = props->Distortion.LowpassCutoff; - /* Bandwidth value is constant in octaves. */ - bandwidth = (cutoff / 2.0f) / (cutoff * 0.67f); - /* Multiply sampling frequency by the amount of oversampling done during - * processing. - */ - BiquadFilter_setParams(&state->lowpass, BiquadType_LowPass, 1.0f, - cutoff / (frequency*4.0f), calc_rcpQ_from_bandwidth(cutoff / (frequency*4.0f), bandwidth) - ); - - cutoff = props->Distortion.EQCenter; - /* Convert bandwidth in Hz to octaves. */ - bandwidth = props->Distortion.EQBandwidth / (cutoff * 0.67f); - BiquadFilter_setParams(&state->bandpass, BiquadType_BandPass, 1.0f, - cutoff / (frequency*4.0f), calc_rcpQ_from_bandwidth(cutoff / (frequency*4.0f), bandwidth) - ); - - CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, slot->Params.Gain * props->Distortion.Gain, - state->Gain); -} - -static ALvoid ALdistortionState_process(ALdistortionState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ALfloat (*restrict buffer)[BUFFERSIZE] = state->Buffer; - const ALfloat fc = state->edge_coeff; - ALsizei base; - ALsizei i, k; - - for(base = 0;base < SamplesToDo;) - { - /* Perform 4x oversampling to avoid aliasing. Oversampling greatly - * improves distortion quality and allows to implement lowpass and - * bandpass filters using high frequencies, at which classic IIR - * filters became unstable. - */ - ALsizei todo = mini(BUFFERSIZE, (SamplesToDo-base) * 4); - - /* Fill oversample buffer using zero stuffing. Multiply the sample by - * the amount of oversampling to maintain the signal's power. - */ - for(i = 0;i < todo;i++) - buffer[0][i] = !(i&3) ? SamplesIn[0][(i>>2)+base] * 4.0f : 0.0f; - - /* First step, do lowpass filtering of original signal. Additionally - * perform buffer interpolation and lowpass cutoff for oversampling - * (which is fortunately first step of distortion). So combine three - * operations into the one. - */ - BiquadFilter_process(&state->lowpass, buffer[1], buffer[0], todo); - - /* Second step, do distortion using waveshaper function to emulate - * signal processing during tube overdriving. Three steps of - * waveshaping are intended to modify waveform without boost/clipping/ - * attenuation process. - */ - for(i = 0;i < todo;i++) - { - ALfloat smp = buffer[1][i]; - - smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)); - smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)) * -1.0f; - smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)); - - buffer[0][i] = smp; - } - - /* Third step, do bandpass filtering of distorted signal. */ - BiquadFilter_process(&state->bandpass, buffer[1], buffer[0], todo); - - todo >>= 2; - for(k = 0;k < NumChannels;k++) - { - /* Fourth step, final, do attenuation and perform decimation, - * storing only one sample out of four. - */ - ALfloat gain = state->Gain[k]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - for(i = 0;i < todo;i++) - SamplesOut[k][base+i] += gain * buffer[1][i*4]; - } - - base += todo; - } -} - - -typedef struct DistortionStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} DistortionStateFactory; - -static ALeffectState *DistortionStateFactory_create(DistortionStateFactory *UNUSED(factory)) -{ - ALdistortionState *state; - - NEW_OBJ0(state, ALdistortionState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(DistortionStateFactory); - - -EffectStateFactory *DistortionStateFactory_getFactory(void) -{ - static DistortionStateFactory DistortionFactory = { { GET_VTABLE2(DistortionStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &DistortionFactory); -} - - -void ALdistortion_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param); } -void ALdistortion_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param); } -void ALdistortion_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_DISTORTION_EDGE: - if(!(val >= AL_DISTORTION_MIN_EDGE && val <= AL_DISTORTION_MAX_EDGE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion edge out of range"); - props->Distortion.Edge = val; - break; - - case AL_DISTORTION_GAIN: - if(!(val >= AL_DISTORTION_MIN_GAIN && val <= AL_DISTORTION_MAX_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion gain out of range"); - props->Distortion.Gain = val; - break; - - case AL_DISTORTION_LOWPASS_CUTOFF: - if(!(val >= AL_DISTORTION_MIN_LOWPASS_CUTOFF && val <= AL_DISTORTION_MAX_LOWPASS_CUTOFF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion low-pass cutoff out of range"); - props->Distortion.LowpassCutoff = val; - break; - - case AL_DISTORTION_EQCENTER: - if(!(val >= AL_DISTORTION_MIN_EQCENTER && val <= AL_DISTORTION_MAX_EQCENTER)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion EQ center out of range"); - props->Distortion.EQCenter = val; - break; - - case AL_DISTORTION_EQBANDWIDTH: - if(!(val >= AL_DISTORTION_MIN_EQBANDWIDTH && val <= AL_DISTORTION_MAX_EQBANDWIDTH)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion EQ bandwidth out of range"); - props->Distortion.EQBandwidth = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", - param); - } -} -void ALdistortion_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALdistortion_setParamf(effect, context, param, vals[0]); } - -void ALdistortion_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param); } -void ALdistortion_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param); } -void ALdistortion_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_DISTORTION_EDGE: - *val = props->Distortion.Edge; - break; - - case AL_DISTORTION_GAIN: - *val = props->Distortion.Gain; - break; - - case AL_DISTORTION_LOWPASS_CUTOFF: - *val = props->Distortion.LowpassCutoff; - break; - - case AL_DISTORTION_EQCENTER: - *val = props->Distortion.EQCenter; - break; - - case AL_DISTORTION_EQBANDWIDTH: - *val = props->Distortion.EQBandwidth; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", - param); - } -} -void ALdistortion_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALdistortion_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALdistortion); diff --git a/Alc/effects/echo.c b/Alc/effects/echo.c deleted file mode 100644 index 676b17e..0000000 --- a/Alc/effects/echo.c +++ /dev/null @@ -1,310 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2009 by Chris Robinson. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alFilter.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - - -typedef struct ALechoState { - DERIVE_FROM_TYPE(ALeffectState); - - ALfloat *SampleBuffer; - ALsizei BufferLength; - - // The echo is two tap. The delay is the number of samples from before the - // current offset - struct { - ALsizei delay; - } Tap[2]; - ALsizei Offset; - - /* The panning gains for the two taps */ - struct { - ALfloat Current[MAX_OUTPUT_CHANNELS]; - ALfloat Target[MAX_OUTPUT_CHANNELS]; - } Gains[2]; - - ALfloat FeedGain; - - BiquadFilter Filter; -} ALechoState; - -static ALvoid ALechoState_Destruct(ALechoState *state); -static ALboolean ALechoState_deviceUpdate(ALechoState *state, ALCdevice *Device); -static ALvoid ALechoState_update(ALechoState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALechoState_process(ALechoState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALechoState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALechoState); - - -static void ALechoState_Construct(ALechoState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALechoState, ALeffectState, state); - - state->BufferLength = 0; - state->SampleBuffer = NULL; - - state->Tap[0].delay = 0; - state->Tap[1].delay = 0; - state->Offset = 0; - - BiquadFilter_clear(&state->Filter); -} - -static ALvoid ALechoState_Destruct(ALechoState *state) -{ - al_free(state->SampleBuffer); - state->SampleBuffer = NULL; - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALechoState_deviceUpdate(ALechoState *state, ALCdevice *Device) -{ - ALsizei maxlen; - - // Use the next power of 2 for the buffer length, so the tap offsets can be - // wrapped using a mask instead of a modulo - maxlen = float2int(AL_ECHO_MAX_DELAY*Device->Frequency + 0.5f) + - float2int(AL_ECHO_MAX_LRDELAY*Device->Frequency + 0.5f); - maxlen = NextPowerOf2(maxlen); - if(maxlen <= 0) return AL_FALSE; - - if(maxlen != state->BufferLength) - { - void *temp = al_calloc(16, maxlen * sizeof(ALfloat)); - if(!temp) return AL_FALSE; - - al_free(state->SampleBuffer); - state->SampleBuffer = temp; - state->BufferLength = maxlen; - } - - memset(state->SampleBuffer, 0, state->BufferLength*sizeof(ALfloat)); - memset(state->Gains, 0, sizeof(state->Gains)); - - return AL_TRUE; -} - -static ALvoid ALechoState_update(ALechoState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALuint frequency = device->Frequency; - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat gainhf, lrpan, spread; - - state->Tap[0].delay = maxi(float2int(props->Echo.Delay*frequency + 0.5f), 1); - state->Tap[1].delay = float2int(props->Echo.LRDelay*frequency + 0.5f); - state->Tap[1].delay += state->Tap[0].delay; - - spread = props->Echo.Spread; - if(spread < 0.0f) lrpan = -1.0f; - else lrpan = 1.0f; - /* Convert echo spread (where 0 = omni, +/-1 = directional) to coverage - * spread (where 0 = point, tau = omni). - */ - spread = asinf(1.0f - fabsf(spread))*4.0f; - - state->FeedGain = props->Echo.Feedback; - - gainhf = maxf(1.0f - props->Echo.Damping, 0.0625f); /* Limit -24dB */ - BiquadFilter_setParams(&state->Filter, BiquadType_HighShelf, - gainhf, LOWPASSFREQREF/frequency, calc_rcpQ_from_slope(gainhf, 1.0f) - ); - - /* First tap panning */ - CalcAngleCoeffs(-F_PI_2*lrpan, 0.0f, spread, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, slot->Params.Gain, state->Gains[0].Target); - - /* Second tap panning */ - CalcAngleCoeffs( F_PI_2*lrpan, 0.0f, spread, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, slot->Params.Gain, state->Gains[1].Target); -} - -static ALvoid ALechoState_process(ALechoState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - const ALsizei mask = state->BufferLength-1; - const ALsizei tap1 = state->Tap[0].delay; - const ALsizei tap2 = state->Tap[1].delay; - ALfloat *restrict delaybuf = state->SampleBuffer; - ALsizei offset = state->Offset; - ALfloat z1, z2, in, out; - ALsizei base; - ALsizei c, i; - - z1 = state->Filter.z1; - z2 = state->Filter.z2; - for(base = 0;base < SamplesToDo;) - { - alignas(16) ALfloat temps[2][128]; - ALsizei td = mini(128, SamplesToDo-base); - - for(i = 0;i < td;i++) - { - /* Feed the delay buffer's input first. */ - delaybuf[offset&mask] = SamplesIn[0][i+base]; - - /* First tap */ - temps[0][i] = delaybuf[(offset-tap1) & mask]; - /* Second tap */ - temps[1][i] = delaybuf[(offset-tap2) & mask]; - - /* Apply damping to the second tap, then add it to the buffer with - * feedback attenuation. - */ - in = temps[1][i]; - out = in*state->Filter.b0 + z1; - z1 = in*state->Filter.b1 - out*state->Filter.a1 + z2; - z2 = in*state->Filter.b2 - out*state->Filter.a2; - - delaybuf[offset&mask] += out * state->FeedGain; - offset++; - } - - for(c = 0;c < 2;c++) - MixSamples(temps[c], NumChannels, SamplesOut, state->Gains[c].Current, - state->Gains[c].Target, SamplesToDo-base, base, td); - - base += td; - } - state->Filter.z1 = z1; - state->Filter.z2 = z2; - - state->Offset = offset; -} - - -typedef struct EchoStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} EchoStateFactory; - -ALeffectState *EchoStateFactory_create(EchoStateFactory *UNUSED(factory)) -{ - ALechoState *state; - - NEW_OBJ0(state, ALechoState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(EchoStateFactory); - -EffectStateFactory *EchoStateFactory_getFactory(void) -{ - static EchoStateFactory EchoFactory = { { GET_VTABLE2(EchoStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &EchoFactory); -} - - -void ALecho_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param); } -void ALecho_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param); } -void ALecho_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_ECHO_DELAY: - if(!(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo delay out of range"); - props->Echo.Delay = val; - break; - - case AL_ECHO_LRDELAY: - if(!(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo LR delay out of range"); - props->Echo.LRDelay = val; - break; - - case AL_ECHO_DAMPING: - if(!(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo damping out of range"); - props->Echo.Damping = val; - break; - - case AL_ECHO_FEEDBACK: - if(!(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo feedback out of range"); - props->Echo.Feedback = val; - break; - - case AL_ECHO_SPREAD: - if(!(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo spread out of range"); - props->Echo.Spread = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param); - } -} -void ALecho_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALecho_setParamf(effect, context, param, vals[0]); } - -void ALecho_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param); } -void ALecho_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param); } -void ALecho_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_ECHO_DELAY: - *val = props->Echo.Delay; - break; - - case AL_ECHO_LRDELAY: - *val = props->Echo.LRDelay; - break; - - case AL_ECHO_DAMPING: - *val = props->Echo.Damping; - break; - - case AL_ECHO_FEEDBACK: - *val = props->Echo.Feedback; - break; - - case AL_ECHO_SPREAD: - *val = props->Echo.Spread; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param); - } -} -void ALecho_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALecho_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALecho); diff --git a/Alc/effects/fshifter.c b/Alc/effects/fshifter.c deleted file mode 100644 index 5aa0845..0000000 --- a/Alc/effects/fshifter.c +++ /dev/null @@ -1,329 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2018 by Raul Herraiz. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - -#include "alcomplex.h" - -#define HIL_SIZE 1024 -#define OVERSAMP (1<<2) - -#define HIL_STEP (HIL_SIZE / OVERSAMP) -#define FIFO_LATENCY (HIL_STEP * (OVERSAMP-1)) - - -typedef struct ALfshifterState { - DERIVE_FROM_TYPE(ALeffectState); - - /* Effect parameters */ - ALsizei count; - ALsizei PhaseStep; - ALsizei Phase; - ALdouble ld_sign; - - /*Effects buffers*/ - ALfloat InFIFO[HIL_SIZE]; - ALcomplex OutFIFO[HIL_SIZE]; - ALcomplex OutputAccum[HIL_SIZE]; - ALcomplex Analytic[HIL_SIZE]; - ALcomplex Outdata[BUFFERSIZE]; - - alignas(16) ALfloat BufferOut[BUFFERSIZE]; - - /* Effect gains for each output channel */ - ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; - ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; -} ALfshifterState; - -static ALvoid ALfshifterState_Destruct(ALfshifterState *state); -static ALboolean ALfshifterState_deviceUpdate(ALfshifterState *state, ALCdevice *device); -static ALvoid ALfshifterState_update(ALfshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALfshifterState_process(ALfshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALfshifterState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALfshifterState); - -/* Define a Hann window, used to filter the HIL input and output. */ -alignas(16) static ALdouble HannWindow[HIL_SIZE]; - -static void InitHannWindow(void) -{ - ALsizei i; - - /* Create lookup table of the Hann window for the desired size, i.e. HIL_SIZE */ - for(i = 0;i < HIL_SIZE>>1;i++) - { - ALdouble val = sin(M_PI * (ALdouble)i / (ALdouble)(HIL_SIZE-1)); - HannWindow[i] = HannWindow[HIL_SIZE-1-i] = val * val; - } -} - -static alonce_flag HannInitOnce = AL_ONCE_FLAG_INIT; - -static void ALfshifterState_Construct(ALfshifterState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALfshifterState, ALeffectState, state); - - alcall_once(&HannInitOnce, InitHannWindow); -} - -static ALvoid ALfshifterState_Destruct(ALfshifterState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALfshifterState_deviceUpdate(ALfshifterState *state, ALCdevice *UNUSED(device)) -{ - /* (Re-)initializing parameters and clear the buffers. */ - state->count = FIFO_LATENCY; - state->PhaseStep = 0; - state->Phase = 0; - state->ld_sign = 1.0; - - memset(state->InFIFO, 0, sizeof(state->InFIFO)); - memset(state->OutFIFO, 0, sizeof(state->OutFIFO)); - memset(state->OutputAccum, 0, sizeof(state->OutputAccum)); - memset(state->Analytic, 0, sizeof(state->Analytic)); - - memset(state->CurrentGains, 0, sizeof(state->CurrentGains)); - memset(state->TargetGains, 0, sizeof(state->TargetGains)); - - return AL_TRUE; -} - -static ALvoid ALfshifterState_update(ALfshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat step; - - step = props->Fshifter.Frequency / (ALfloat)device->Frequency; - state->PhaseStep = fastf2i(minf(step, 0.5f) * FRACTIONONE); - - switch(props->Fshifter.LeftDirection) - { - case AL_FREQUENCY_SHIFTER_DIRECTION_DOWN: - state->ld_sign = -1.0; - break; - - case AL_FREQUENCY_SHIFTER_DIRECTION_UP: - state->ld_sign = 1.0; - break; - - case AL_FREQUENCY_SHIFTER_DIRECTION_OFF: - state->Phase = 0; - state->PhaseStep = 0; - break; - } - - CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, slot->Params.Gain, state->TargetGains); -} - -static ALvoid ALfshifterState_process(ALfshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - static const ALcomplex complex_zero = { 0.0, 0.0 }; - ALfloat *restrict BufferOut = state->BufferOut; - ALsizei j, k, base; - - for(base = 0;base < SamplesToDo;) - { - ALsizei todo = mini(HIL_SIZE-state->count, SamplesToDo-base); - - ASSUME(todo > 0); - - /* Fill FIFO buffer with samples data */ - k = state->count; - for(j = 0;j < todo;j++,k++) - { - state->InFIFO[k] = SamplesIn[0][base+j]; - state->Outdata[base+j] = state->OutFIFO[k-FIFO_LATENCY]; - } - state->count += todo; - base += todo; - - /* Check whether FIFO buffer is filled */ - if(state->count < HIL_SIZE) continue; - - state->count = FIFO_LATENCY; - - /* Real signal windowing and store in Analytic buffer */ - for(k = 0;k < HIL_SIZE;k++) - { - state->Analytic[k].Real = state->InFIFO[k] * HannWindow[k]; - state->Analytic[k].Imag = 0.0; - } - - /* Processing signal by Discrete Hilbert Transform (analytical signal). */ - complex_hilbert(state->Analytic, HIL_SIZE); - - /* Windowing and add to output accumulator */ - for(k = 0;k < HIL_SIZE;k++) - { - state->OutputAccum[k].Real += 2.0/OVERSAMP*HannWindow[k]*state->Analytic[k].Real; - state->OutputAccum[k].Imag += 2.0/OVERSAMP*HannWindow[k]*state->Analytic[k].Imag; - } - - /* Shift accumulator, input & output FIFO */ - for(k = 0;k < HIL_STEP;k++) state->OutFIFO[k] = state->OutputAccum[k]; - for(j = 0;k < HIL_SIZE;k++,j++) state->OutputAccum[j] = state->OutputAccum[k]; - for(;j < HIL_SIZE;j++) state->OutputAccum[j] = complex_zero; - for(k = 0;k < FIFO_LATENCY;k++) - state->InFIFO[k] = state->InFIFO[k+HIL_STEP]; - } - - /* Process frequency shifter using the analytic signal obtained. */ - for(k = 0;k < SamplesToDo;k++) - { - ALdouble phase = state->Phase * ((1.0/FRACTIONONE) * 2.0*M_PI); - BufferOut[k] = (ALfloat)(state->Outdata[k].Real*cos(phase) + - state->Outdata[k].Imag*sin(phase)*state->ld_sign); - - state->Phase += state->PhaseStep; - state->Phase &= FRACTIONMASK; - } - - /* Now, mix the processed sound data to the output. */ - MixSamples(BufferOut, NumChannels, SamplesOut, state->CurrentGains, state->TargetGains, - maxi(SamplesToDo, 512), 0, SamplesToDo); -} - -typedef struct FshifterStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} FshifterStateFactory; - -static ALeffectState *FshifterStateFactory_create(FshifterStateFactory *UNUSED(factory)) -{ - ALfshifterState *state; - - NEW_OBJ0(state, ALfshifterState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(FshifterStateFactory); - -EffectStateFactory *FshifterStateFactory_getFactory(void) -{ - static FshifterStateFactory FshifterFactory = { { GET_VTABLE2(FshifterStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &FshifterFactory); -} - -void ALfshifter_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FREQUENCY_SHIFTER_FREQUENCY: - if(!(val >= AL_FREQUENCY_SHIFTER_MIN_FREQUENCY && val <= AL_FREQUENCY_SHIFTER_MAX_FREQUENCY)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter frequency out of range"); - props->Fshifter.Frequency = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x", param); - } -} - -void ALfshifter_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALfshifter_setParamf(effect, context, param, vals[0]); -} - -void ALfshifter_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION: - if(!(val >= AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION && val <= AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter left direction out of range"); - props->Fshifter.LeftDirection = val; - break; - - case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION: - if(!(val >= AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION && val <= AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter right direction out of range"); - props->Fshifter.RightDirection = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter integer property 0x%04x", param); - } -} -void ALfshifter_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALfshifter_setParami(effect, context, param, vals[0]); -} - -void ALfshifter_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION: - *val = props->Fshifter.LeftDirection; - break; - case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION: - *val = props->Fshifter.RightDirection; - break; - default: - alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter integer property 0x%04x", param); - } -} -void ALfshifter_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALfshifter_getParami(effect, context, param, vals); -} - -void ALfshifter_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FREQUENCY_SHIFTER_FREQUENCY: - *val = props->Fshifter.Frequency; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x", param); - } - -} - -void ALfshifter_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALfshifter_getParamf(effect, context, param, vals); -} - -DEFINE_ALEFFECT_VTABLE(ALfshifter); diff --git a/Alc/effects/modulator.c b/Alc/effects/modulator.c deleted file mode 100644 index 9855b1b..0000000 --- a/Alc/effects/modulator.c +++ /dev/null @@ -1,307 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2009 by Chris Robinson. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - - -#define MAX_UPDATE_SAMPLES 128 - -typedef struct ALmodulatorState { - DERIVE_FROM_TYPE(ALeffectState); - - void (*GetSamples)(ALfloat*, ALsizei, const ALsizei, ALsizei); - - ALsizei index; - ALsizei step; - - struct { - BiquadFilter Filter; - - ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; - ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; - } Chans[MAX_EFFECT_CHANNELS]; -} ALmodulatorState; - -static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state); -static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *state, ALCdevice *device); -static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALmodulatorState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALmodulatorState); - - -#define WAVEFORM_FRACBITS 24 -#define WAVEFORM_FRACONE (1<>(WAVEFORM_FRACBITS-2))&2) - 1); -} - -static inline ALfloat One(ALsizei UNUSED(index)) -{ - return 1.0f; -} - -#define DECL_TEMPLATE(func) \ -static void Modulate##func(ALfloat *restrict dst, ALsizei index, \ - const ALsizei step, ALsizei todo) \ -{ \ - ALsizei i; \ - for(i = 0;i < todo;i++) \ - { \ - index += step; \ - index &= WAVEFORM_FRACMASK; \ - dst[i] = func(index); \ - } \ -} - -DECL_TEMPLATE(Sin) -DECL_TEMPLATE(Saw) -DECL_TEMPLATE(Square) -DECL_TEMPLATE(One) - -#undef DECL_TEMPLATE - - -static void ALmodulatorState_Construct(ALmodulatorState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALmodulatorState, ALeffectState, state); - - state->index = 0; - state->step = 1; -} - -static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *state, ALCdevice *UNUSED(device)) -{ - ALsizei i, j; - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - { - BiquadFilter_clear(&state->Chans[i].Filter); - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - state->Chans[i].CurrentGains[j] = 0.0f; - } - return AL_TRUE; -} - -static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALfloat f0norm; - ALsizei i; - - state->step = fastf2i(props->Modulator.Frequency / (ALfloat)device->Frequency * - WAVEFORM_FRACONE); - state->step = clampi(state->step, 0, WAVEFORM_FRACONE-1); - - if(state->step == 0) - state->GetSamples = ModulateOne; - else if(props->Modulator.Waveform == AL_RING_MODULATOR_SINUSOID) - state->GetSamples = ModulateSin; - else if(props->Modulator.Waveform == AL_RING_MODULATOR_SAWTOOTH) - state->GetSamples = ModulateSaw; - else /*if(Slot->Params.EffectProps.Modulator.Waveform == AL_RING_MODULATOR_SQUARE)*/ - state->GetSamples = ModulateSquare; - - f0norm = props->Modulator.HighPassCutoff / (ALfloat)device->Frequency; - f0norm = clampf(f0norm, 1.0f/512.0f, 0.49f); - /* Bandwidth value is constant in octaves. */ - BiquadFilter_setParams(&state->Chans[0].Filter, BiquadType_HighPass, 1.0f, - f0norm, calc_rcpQ_from_bandwidth(f0norm, 0.75f)); - for(i = 1;i < MAX_EFFECT_CHANNELS;i++) - BiquadFilter_copyParams(&state->Chans[i].Filter, &state->Chans[0].Filter); - - STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(&device->FOAOut, IdentityMatrixf.m[i], - slot->Params.Gain, state->Chans[i].TargetGains); -} - -static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - const ALsizei step = state->step; - ALsizei base; - - for(base = 0;base < SamplesToDo;) - { - alignas(16) ALfloat modsamples[MAX_UPDATE_SAMPLES]; - ALsizei td = mini(MAX_UPDATE_SAMPLES, SamplesToDo-base); - ALsizei c, i; - - state->GetSamples(modsamples, state->index, step, td); - state->index += (step*td) & WAVEFORM_FRACMASK; - state->index &= WAVEFORM_FRACMASK; - - for(c = 0;c < MAX_EFFECT_CHANNELS;c++) - { - alignas(16) ALfloat temps[MAX_UPDATE_SAMPLES]; - - BiquadFilter_process(&state->Chans[c].Filter, temps, &SamplesIn[c][base], td); - for(i = 0;i < td;i++) - temps[i] *= modsamples[i]; - - MixSamples(temps, NumChannels, SamplesOut, state->Chans[c].CurrentGains, - state->Chans[c].TargetGains, SamplesToDo-base, base, td); - } - - base += td; - } -} - - -typedef struct ModulatorStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} ModulatorStateFactory; - -static ALeffectState *ModulatorStateFactory_create(ModulatorStateFactory *UNUSED(factory)) -{ - ALmodulatorState *state; - - NEW_OBJ0(state, ALmodulatorState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(ModulatorStateFactory); - -EffectStateFactory *ModulatorStateFactory_getFactory(void) -{ - static ModulatorStateFactory ModulatorFactory = { { GET_VTABLE2(ModulatorStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &ModulatorFactory); -} - - -void ALmodulator_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_RING_MODULATOR_FREQUENCY: - if(!(val >= AL_RING_MODULATOR_MIN_FREQUENCY && val <= AL_RING_MODULATOR_MAX_FREQUENCY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Modulator frequency out of range"); - props->Modulator.Frequency = val; - break; - - case AL_RING_MODULATOR_HIGHPASS_CUTOFF: - if(!(val >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF && val <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Modulator high-pass cutoff out of range"); - props->Modulator.HighPassCutoff = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param); - } -} -void ALmodulator_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALmodulator_setParamf(effect, context, param, vals[0]); } -void ALmodulator_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_RING_MODULATOR_FREQUENCY: - case AL_RING_MODULATOR_HIGHPASS_CUTOFF: - ALmodulator_setParamf(effect, context, param, (ALfloat)val); - break; - - case AL_RING_MODULATOR_WAVEFORM: - if(!(val >= AL_RING_MODULATOR_MIN_WAVEFORM && val <= AL_RING_MODULATOR_MAX_WAVEFORM)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid modulator waveform"); - props->Modulator.Waveform = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid modulator integer property 0x%04x", param); - } -} -void ALmodulator_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ ALmodulator_setParami(effect, context, param, vals[0]); } - -void ALmodulator_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_RING_MODULATOR_FREQUENCY: - *val = (ALint)props->Modulator.Frequency; - break; - case AL_RING_MODULATOR_HIGHPASS_CUTOFF: - *val = (ALint)props->Modulator.HighPassCutoff; - break; - case AL_RING_MODULATOR_WAVEFORM: - *val = props->Modulator.Waveform; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid modulator integer property 0x%04x", param); - } -} -void ALmodulator_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ ALmodulator_getParami(effect, context, param, vals); } -void ALmodulator_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_RING_MODULATOR_FREQUENCY: - *val = props->Modulator.Frequency; - break; - case AL_RING_MODULATOR_HIGHPASS_CUTOFF: - *val = props->Modulator.HighPassCutoff; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param); - } -} -void ALmodulator_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALmodulator_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALmodulator); diff --git a/Alc/effects/null.c b/Alc/effects/null.c deleted file mode 100644 index e57359e..0000000 --- a/Alc/effects/null.c +++ /dev/null @@ -1,179 +0,0 @@ -#include "config.h" - -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" - - -typedef struct ALnullState { - DERIVE_FROM_TYPE(ALeffectState); -} ALnullState; - -/* Forward-declare "virtual" functions to define the vtable with. */ -static ALvoid ALnullState_Destruct(ALnullState *state); -static ALboolean ALnullState_deviceUpdate(ALnullState *state, ALCdevice *device); -static ALvoid ALnullState_update(ALnullState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALnullState_process(ALnullState *state, ALsizei samplesToDo, const ALfloat (*restrict samplesIn)[BUFFERSIZE], ALfloat (*restrict samplesOut)[BUFFERSIZE], ALsizei mumChannels); -static void *ALnullState_New(size_t size); -static void ALnullState_Delete(void *ptr); - -/* Define the ALeffectState vtable for this type. */ -DEFINE_ALEFFECTSTATE_VTABLE(ALnullState); - - -/* This constructs the effect state. It's called when the object is first - * created. Make sure to call the parent Construct function first, and set the - * vtable! - */ -static void ALnullState_Construct(ALnullState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALnullState, ALeffectState, state); -} - -/* This destructs (not free!) the effect state. It's called only when the - * effect slot is no longer used. Make sure to call the parent Destruct - * function before returning! - */ -static ALvoid ALnullState_Destruct(ALnullState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -/* This updates the device-dependant effect state. This is called on - * initialization and any time the device parameters (eg. playback frequency, - * format) have been changed. - */ -static ALboolean ALnullState_deviceUpdate(ALnullState* UNUSED(state), ALCdevice* UNUSED(device)) -{ - return AL_TRUE; -} - -/* This updates the effect state. This is called any time the effect is - * (re)loaded into a slot. - */ -static ALvoid ALnullState_update(ALnullState* UNUSED(state), const ALCcontext* UNUSED(context), const ALeffectslot* UNUSED(slot), const ALeffectProps* UNUSED(props)) -{ -} - -/* This processes the effect state, for the given number of samples from the - * input to the output buffer. The result should be added to the output buffer, - * not replace it. - */ -static ALvoid ALnullState_process(ALnullState* UNUSED(state), ALsizei UNUSED(samplesToDo), const ALfloatBUFFERSIZE*restrict UNUSED(samplesIn), ALfloatBUFFERSIZE*restrict UNUSED(samplesOut), ALsizei UNUSED(numChannels)) -{ -} - -/* This allocates memory to store the object, before it gets constructed. - * DECLARE_DEFAULT_ALLOCATORS can be used to declare a default method. - */ -static void *ALnullState_New(size_t size) -{ - return al_malloc(16, size); -} - -/* This frees the memory used by the object, after it has been destructed. - * DECLARE_DEFAULT_ALLOCATORS can be used to declare a default method. - */ -static void ALnullState_Delete(void *ptr) -{ - al_free(ptr); -} - - -typedef struct NullStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} NullStateFactory; - -/* Creates ALeffectState objects of the appropriate type. */ -ALeffectState *NullStateFactory_create(NullStateFactory *UNUSED(factory)) -{ - ALnullState *state; - - NEW_OBJ0(state, ALnullState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -/* Define the EffectStateFactory vtable for this type. */ -DEFINE_EFFECTSTATEFACTORY_VTABLE(NullStateFactory); - -EffectStateFactory *NullStateFactory_getFactory(void) -{ - static NullStateFactory NullFactory = { { GET_VTABLE2(NullStateFactory, EffectStateFactory) } }; - return STATIC_CAST(EffectStateFactory, &NullFactory); -} - - -void ALnull_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x", param); - } -} -void ALnull_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint* UNUSED(vals)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer-vector property 0x%04x", param); - } -} -void ALnull_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect float property 0x%04x", param); - } -} -void ALnull_setParamfv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat* UNUSED(vals)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect float-vector property 0x%04x", param); - } -} - -void ALnull_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(val)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x", param); - } -} -void ALnull_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(vals)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer-vector property 0x%04x", param); - } -} -void ALnull_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(val)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect float property 0x%04x", param); - } -} -void ALnull_getParamfv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(vals)) -{ - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid null effect float-vector property 0x%04x", param); - } -} - -DEFINE_ALEFFECT_VTABLE(ALnull); diff --git a/Alc/effects/pshifter.c b/Alc/effects/pshifter.c deleted file mode 100644 index f27c413..0000000 --- a/Alc/effects/pshifter.c +++ /dev/null @@ -1,441 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2018 by Raul Herraiz. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" -#include "filters/defs.h" - -#include "alcomplex.h" - - -#define STFT_SIZE 1024 -#define STFT_HALF_SIZE (STFT_SIZE>>1) -#define OVERSAMP (1<<2) - -#define STFT_STEP (STFT_SIZE / OVERSAMP) -#define FIFO_LATENCY (STFT_STEP * (OVERSAMP-1)) - - -typedef struct ALphasor { - ALdouble Amplitude; - ALdouble Phase; -} ALphasor; - -typedef struct ALFrequencyDomain { - ALdouble Amplitude; - ALdouble Frequency; -} ALfrequencyDomain; - - -typedef struct ALpshifterState { - DERIVE_FROM_TYPE(ALeffectState); - - /* Effect parameters */ - ALsizei count; - ALsizei PitchShiftI; - ALfloat PitchShift; - ALfloat FreqPerBin; - - /*Effects buffers*/ - ALfloat InFIFO[STFT_SIZE]; - ALfloat OutFIFO[STFT_STEP]; - ALdouble LastPhase[STFT_HALF_SIZE+1]; - ALdouble SumPhase[STFT_HALF_SIZE+1]; - ALdouble OutputAccum[STFT_SIZE]; - - ALcomplex FFTbuffer[STFT_SIZE]; - - ALfrequencyDomain Analysis_buffer[STFT_HALF_SIZE+1]; - ALfrequencyDomain Syntesis_buffer[STFT_HALF_SIZE+1]; - - alignas(16) ALfloat BufferOut[BUFFERSIZE]; - - /* Effect gains for each output channel */ - ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; - ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; -} ALpshifterState; - -static ALvoid ALpshifterState_Destruct(ALpshifterState *state); -static ALboolean ALpshifterState_deviceUpdate(ALpshifterState *state, ALCdevice *device); -static ALvoid ALpshifterState_update(ALpshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALpshifterState_process(ALpshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALpshifterState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALpshifterState); - - -/* Define a Hann window, used to filter the STFT input and output. */ -alignas(16) static ALdouble HannWindow[STFT_SIZE]; - -static void InitHannWindow(void) -{ - ALsizei i; - - /* Create lookup table of the Hann window for the desired size, i.e. STFT_SIZE */ - for(i = 0;i < STFT_SIZE>>1;i++) - { - ALdouble val = sin(M_PI * (ALdouble)i / (ALdouble)(STFT_SIZE-1)); - HannWindow[i] = HannWindow[STFT_SIZE-1-i] = val * val; - } -} -static alonce_flag HannInitOnce = AL_ONCE_FLAG_INIT; - - -static inline ALint double2int(ALdouble d) -{ -#if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ - !defined(__SSE2_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP < 2) - ALint sign, shift; - ALint64 mant; - union { - ALdouble d; - ALint64 i64; - } conv; - - conv.d = d; - sign = (conv.i64>>63) | 1; - shift = ((conv.i64>>52)&0x7ff) - (1023+52); - - /* Over/underflow */ - if(UNLIKELY(shift >= 63 || shift < -52)) - return 0; - - mant = (conv.i64&I64(0xfffffffffffff)) | I64(0x10000000000000); - if(LIKELY(shift < 0)) - return (ALint)(mant >> -shift) * sign; - return (ALint)(mant << shift) * sign; - -#else - - return (ALint)d; -#endif -} - - -/* Converts ALcomplex to ALphasor */ -static inline ALphasor rect2polar(ALcomplex number) -{ - ALphasor polar; - - polar.Amplitude = sqrt(number.Real*number.Real + number.Imag*number.Imag); - polar.Phase = atan2(number.Imag, number.Real); - - return polar; -} - -/* Converts ALphasor to ALcomplex */ -static inline ALcomplex polar2rect(ALphasor number) -{ - ALcomplex cartesian; - - cartesian.Real = number.Amplitude * cos(number.Phase); - cartesian.Imag = number.Amplitude * sin(number.Phase); - - return cartesian; -} - - -static void ALpshifterState_Construct(ALpshifterState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALpshifterState, ALeffectState, state); - - alcall_once(&HannInitOnce, InitHannWindow); -} - -static ALvoid ALpshifterState_Destruct(ALpshifterState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALpshifterState_deviceUpdate(ALpshifterState *state, ALCdevice *device) -{ - /* (Re-)initializing parameters and clear the buffers. */ - state->count = FIFO_LATENCY; - state->PitchShiftI = FRACTIONONE; - state->PitchShift = 1.0f; - state->FreqPerBin = device->Frequency / (ALfloat)STFT_SIZE; - - memset(state->InFIFO, 0, sizeof(state->InFIFO)); - memset(state->OutFIFO, 0, sizeof(state->OutFIFO)); - memset(state->FFTbuffer, 0, sizeof(state->FFTbuffer)); - memset(state->LastPhase, 0, sizeof(state->LastPhase)); - memset(state->SumPhase, 0, sizeof(state->SumPhase)); - memset(state->OutputAccum, 0, sizeof(state->OutputAccum)); - memset(state->Analysis_buffer, 0, sizeof(state->Analysis_buffer)); - memset(state->Syntesis_buffer, 0, sizeof(state->Syntesis_buffer)); - - memset(state->CurrentGains, 0, sizeof(state->CurrentGains)); - memset(state->TargetGains, 0, sizeof(state->TargetGains)); - - return AL_TRUE; -} - -static ALvoid ALpshifterState_update(ALpshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) -{ - const ALCdevice *device = context->Device; - ALfloat coeffs[MAX_AMBI_COEFFS]; - float pitch; - - pitch = powf(2.0f, - (ALfloat)(props->Pshifter.CoarseTune*100 + props->Pshifter.FineTune) / 1200.0f - ); - state->PitchShiftI = fastf2i(pitch*FRACTIONONE); - state->PitchShift = state->PitchShiftI * (1.0f/FRACTIONONE); - - CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); - ComputeDryPanGains(&device->Dry, coeffs, slot->Params.Gain, state->TargetGains); -} - -static ALvoid ALpshifterState_process(ALpshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - /* Pitch shifter engine based on the work of Stephan Bernsee. - * http://blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/ - */ - - static const ALdouble expected = M_PI*2.0 / OVERSAMP; - const ALdouble freq_per_bin = state->FreqPerBin; - ALfloat *restrict bufferOut = state->BufferOut; - ALsizei count = state->count; - ALsizei i, j, k; - - for(i = 0;i < SamplesToDo;) - { - do { - /* Fill FIFO buffer with samples data */ - state->InFIFO[count] = SamplesIn[0][i]; - bufferOut[i] = state->OutFIFO[count - FIFO_LATENCY]; - - count++; - } while(++i < SamplesToDo && count < STFT_SIZE); - - /* Check whether FIFO buffer is filled */ - if(count < STFT_SIZE) break; - count = FIFO_LATENCY; - - /* Real signal windowing and store in FFTbuffer */ - for(k = 0;k < STFT_SIZE;k++) - { - state->FFTbuffer[k].Real = state->InFIFO[k] * HannWindow[k]; - state->FFTbuffer[k].Imag = 0.0; - } - - /* ANALYSIS */ - /* Apply FFT to FFTbuffer data */ - complex_fft(state->FFTbuffer, STFT_SIZE, -1.0); - - /* Analyze the obtained data. Since the real FFT is symmetric, only - * STFT_HALF_SIZE+1 samples are needed. - */ - for(k = 0;k < STFT_HALF_SIZE+1;k++) - { - ALphasor component; - ALdouble tmp; - ALint qpd; - - /* Compute amplitude and phase */ - component = rect2polar(state->FFTbuffer[k]); - - /* Compute phase difference and subtract expected phase difference */ - tmp = (component.Phase - state->LastPhase[k]) - k*expected; - - /* Map delta phase into +/- Pi interval */ - qpd = double2int(tmp / M_PI); - tmp -= M_PI * (qpd + (qpd%2)); - - /* Get deviation from bin frequency from the +/- Pi interval */ - tmp /= expected; - - /* Compute the k-th partials' true frequency, twice the amplitude - * for maintain the gain (because half of bins are used) and store - * amplitude and true frequency in analysis buffer. - */ - state->Analysis_buffer[k].Amplitude = 2.0 * component.Amplitude; - state->Analysis_buffer[k].Frequency = (k + tmp) * freq_per_bin; - - /* Store actual phase[k] for the calculations in the next frame*/ - state->LastPhase[k] = component.Phase; - } - - /* PROCESSING */ - /* pitch shifting */ - for(k = 0;k < STFT_HALF_SIZE+1;k++) - { - state->Syntesis_buffer[k].Amplitude = 0.0; - state->Syntesis_buffer[k].Frequency = 0.0; - } - - for(k = 0;k < STFT_HALF_SIZE+1;k++) - { - j = (k*state->PitchShiftI) >> FRACTIONBITS; - if(j >= STFT_HALF_SIZE+1) break; - - state->Syntesis_buffer[j].Amplitude += state->Analysis_buffer[k].Amplitude; - state->Syntesis_buffer[j].Frequency = state->Analysis_buffer[k].Frequency * - state->PitchShift; - } - - /* SYNTHESIS */ - /* Synthesis the processing data */ - for(k = 0;k < STFT_HALF_SIZE+1;k++) - { - ALphasor component; - ALdouble tmp; - - /* Compute bin deviation from scaled freq */ - tmp = state->Syntesis_buffer[k].Frequency/freq_per_bin - k; - - /* Calculate actual delta phase and accumulate it to get bin phase */ - state->SumPhase[k] += (k + tmp) * expected; - - component.Amplitude = state->Syntesis_buffer[k].Amplitude; - component.Phase = state->SumPhase[k]; - - /* Compute phasor component to cartesian complex number and storage it into FFTbuffer*/ - state->FFTbuffer[k] = polar2rect(component); - } - /* zero negative frequencies for recontruct a real signal */ - for(k = STFT_HALF_SIZE+1;k < STFT_SIZE;k++) - { - state->FFTbuffer[k].Real = 0.0; - state->FFTbuffer[k].Imag = 0.0; - } - - /* Apply iFFT to buffer data */ - complex_fft(state->FFTbuffer, STFT_SIZE, 1.0); - - /* Windowing and add to output */ - for(k = 0;k < STFT_SIZE;k++) - state->OutputAccum[k] += HannWindow[k] * state->FFTbuffer[k].Real / - (0.5 * STFT_HALF_SIZE * OVERSAMP); - - /* Shift accumulator, input & output FIFO */ - for(k = 0;k < STFT_STEP;k++) state->OutFIFO[k] = (ALfloat)state->OutputAccum[k]; - for(j = 0;k < STFT_SIZE;k++,j++) state->OutputAccum[j] = state->OutputAccum[k]; - for(;j < STFT_SIZE;j++) state->OutputAccum[j] = 0.0; - for(k = 0;k < FIFO_LATENCY;k++) - state->InFIFO[k] = state->InFIFO[k+STFT_STEP]; - } - state->count = count; - - /* Now, mix the processed sound data to the output. */ - MixSamples(bufferOut, NumChannels, SamplesOut, state->CurrentGains, state->TargetGains, - maxi(SamplesToDo, 512), 0, SamplesToDo); -} - -typedef struct PshifterStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} PshifterStateFactory; - -static ALeffectState *PshifterStateFactory_create(PshifterStateFactory *UNUSED(factory)) -{ - ALpshifterState *state; - - NEW_OBJ0(state, ALpshifterState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(PshifterStateFactory); - -EffectStateFactory *PshifterStateFactory_getFactory(void) -{ - static PshifterStateFactory PshifterFactory = { { GET_VTABLE2(PshifterStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &PshifterFactory); -} - - -void ALpshifter_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) -{ - alSetError( context, AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param ); -} - -void ALpshifter_setParamfv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat *UNUSED(vals)) -{ - alSetError( context, AL_INVALID_ENUM, "Invalid pitch shifter float-vector property 0x%04x", param ); -} - -void ALpshifter_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_PITCH_SHIFTER_COARSE_TUNE: - if(!(val >= AL_PITCH_SHIFTER_MIN_COARSE_TUNE && val <= AL_PITCH_SHIFTER_MAX_COARSE_TUNE)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Pitch shifter coarse tune out of range"); - props->Pshifter.CoarseTune = val; - break; - - case AL_PITCH_SHIFTER_FINE_TUNE: - if(!(val >= AL_PITCH_SHIFTER_MIN_FINE_TUNE && val <= AL_PITCH_SHIFTER_MAX_FINE_TUNE)) - SETERR_RETURN(context, AL_INVALID_VALUE,,"Pitch shifter fine tune out of range"); - props->Pshifter.FineTune = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter integer property 0x%04x", param); - } -} -void ALpshifter_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALpshifter_setParami(effect, context, param, vals[0]); -} - -void ALpshifter_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_PITCH_SHIFTER_COARSE_TUNE: - *val = (ALint)props->Pshifter.CoarseTune; - break; - case AL_PITCH_SHIFTER_FINE_TUNE: - *val = (ALint)props->Pshifter.FineTune; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter integer property 0x%04x", param); - } -} -void ALpshifter_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALpshifter_getParami(effect, context, param, vals); -} - -void ALpshifter_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(val)) -{ - alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param); -} - -void ALpshifter_getParamfv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(vals)) -{ - alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter float vector-property 0x%04x", param); -} - -DEFINE_ALEFFECT_VTABLE(ALpshifter); diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.c deleted file mode 100644 index c739084..0000000 --- a/Alc/effects/reverb.c +++ /dev/null @@ -1,2058 +0,0 @@ -/** - * Ambisonic reverb engine for the OpenAL cross platform audio library - * Copyright (C) 2008-2017 by Chris Robinson and Christopher Fitzgerald. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alAuxEffectSlot.h" -#include "alListener.h" -#include "alError.h" -#include "filters/defs.h" - -/* This is a user config option for modifying the overall output of the reverb - * effect. - */ -ALfloat ReverbBoost = 1.0f; - -/* This is the maximum number of samples processed for each inner loop - * iteration. */ -#define MAX_UPDATE_SAMPLES 256 - -/* The number of samples used for cross-faded delay lines. This can be used - * to balance the compensation for abrupt line changes and attenuation due to - * minimally lengthed recursive lines. Try to keep this below the device - * update size. - */ -#define FADE_SAMPLES 128 - -/* The number of spatialized lines or channels to process. Four channels allows - * for a 3D A-Format response. NOTE: This can't be changed without taking care - * of the conversion matrices, and a few places where the length arrays are - * assumed to have 4 elements. - */ -#define NUM_LINES 4 - - -/* The B-Format to A-Format conversion matrix. The arrangement of rows is - * deliberately chosen to align the resulting lines to their spatial opposites - * (0:above front left <-> 3:above back right, 1:below front right <-> 2:below - * back left). It's not quite opposite, since the A-Format results in a - * tetrahedron, but it's close enough. Should the model be extended to 8-lines - * in the future, true opposites can be used. - */ -static const aluMatrixf B2A = {{ - { 0.288675134595f, 0.288675134595f, 0.288675134595f, 0.288675134595f }, - { 0.288675134595f, -0.288675134595f, -0.288675134595f, 0.288675134595f }, - { 0.288675134595f, 0.288675134595f, -0.288675134595f, -0.288675134595f }, - { 0.288675134595f, -0.288675134595f, 0.288675134595f, -0.288675134595f } -}}; - -/* Converts A-Format to B-Format. */ -static const aluMatrixf A2B = {{ - { 0.866025403785f, 0.866025403785f, 0.866025403785f, 0.866025403785f }, - { 0.866025403785f, -0.866025403785f, 0.866025403785f, -0.866025403785f }, - { 0.866025403785f, -0.866025403785f, -0.866025403785f, 0.866025403785f }, - { 0.866025403785f, 0.866025403785f, -0.866025403785f, -0.866025403785f } -}}; - -static const ALfloat FadeStep = 1.0f / FADE_SAMPLES; - -/* The all-pass and delay lines have a variable length dependent on the - * effect's density parameter, which helps alter the perceived environment - * size. The size-to-density conversion is a cubed scale: - * - * density = min(1.0, pow(size, 3.0) / DENSITY_SCALE); - * - * The line lengths scale linearly with room size, so the inverse density - * conversion is needed, taking the cube root of the re-scaled density to - * calculate the line length multiplier: - * - * length_mult = max(5.0, cbrtf(density*DENSITY_SCALE)); - * - * The density scale below will result in a max line multiplier of 50, for an - * effective size range of 5m to 50m. - */ -static const ALfloat DENSITY_SCALE = 125000.0f; - -/* All delay line lengths are specified in seconds. - * - * To approximate early reflections, we break them up into primary (those - * arriving from the same direction as the source) and secondary (those - * arriving from the opposite direction). - * - * The early taps decorrelate the 4-channel signal to approximate an average - * room response for the primary reflections after the initial early delay. - * - * Given an average room dimension (d_a) and the speed of sound (c) we can - * calculate the average reflection delay (r_a) regardless of listener and - * source positions as: - * - * r_a = d_a / c - * c = 343.3 - * - * This can extended to finding the average difference (r_d) between the - * maximum (r_1) and minimum (r_0) reflection delays: - * - * r_0 = 2 / 3 r_a - * = r_a - r_d / 2 - * = r_d - * r_1 = 4 / 3 r_a - * = r_a + r_d / 2 - * = 2 r_d - * r_d = 2 / 3 r_a - * = r_1 - r_0 - * - * As can be determined by integrating the 1D model with a source (s) and - * listener (l) positioned across the dimension of length (d_a): - * - * r_d = int_(l=0)^d_a (int_(s=0)^d_a |2 d_a - 2 (l + s)| ds) dl / c - * - * The initial taps (T_(i=0)^N) are then specified by taking a power series - * that ranges between r_0 and half of r_1 less r_0: - * - * R_i = 2^(i / (2 N - 1)) r_d - * = r_0 + (2^(i / (2 N - 1)) - 1) r_d - * = r_0 + T_i - * T_i = R_i - r_0 - * = (2^(i / (2 N - 1)) - 1) r_d - * - * Assuming an average of 1m, we get the following taps: - */ -static const ALfloat EARLY_TAP_LENGTHS[NUM_LINES] = -{ - 0.0000000e+0f, 2.0213520e-4f, 4.2531060e-4f, 6.7171600e-4f -}; - -/* The early all-pass filter lengths are based on the early tap lengths: - * - * A_i = R_i / a - * - * Where a is the approximate maximum all-pass cycle limit (20). - */ -static const ALfloat EARLY_ALLPASS_LENGTHS[NUM_LINES] = -{ - 9.7096800e-5f, 1.0720356e-4f, 1.1836234e-4f, 1.3068260e-4f -}; - -/* The early delay lines are used to transform the primary reflections into - * the secondary reflections. The A-format is arranged in such a way that - * the channels/lines are spatially opposite: - * - * C_i is opposite C_(N-i-1) - * - * The delays of the two opposing reflections (R_i and O_i) from a source - * anywhere along a particular dimension always sum to twice its full delay: - * - * 2 r_a = R_i + O_i - * - * With that in mind we can determine the delay between the two reflections - * and thus specify our early line lengths (L_(i=0)^N) using: - * - * O_i = 2 r_a - R_(N-i-1) - * L_i = O_i - R_(N-i-1) - * = 2 (r_a - R_(N-i-1)) - * = 2 (r_a - T_(N-i-1) - r_0) - * = 2 r_a (1 - (2 / 3) 2^((N - i - 1) / (2 N - 1))) - * - * Using an average dimension of 1m, we get: - */ -static const ALfloat EARLY_LINE_LENGTHS[NUM_LINES] = -{ - 5.9850400e-4f, 1.0913150e-3f, 1.5376658e-3f, 1.9419362e-3f -}; - -/* The late all-pass filter lengths are based on the late line lengths: - * - * A_i = (5 / 3) L_i / r_1 - */ -static const ALfloat LATE_ALLPASS_LENGTHS[NUM_LINES] = -{ - 1.6182800e-4f, 2.0389060e-4f, 2.8159360e-4f, 3.2365600e-4f -}; - -/* The late lines are used to approximate the decaying cycle of recursive - * late reflections. - * - * Splitting the lines in half, we start with the shortest reflection paths - * (L_(i=0)^(N/2)): - * - * L_i = 2^(i / (N - 1)) r_d - * - * Then for the opposite (longest) reflection paths (L_(i=N/2)^N): - * - * L_i = 2 r_a - L_(i-N/2) - * = 2 r_a - 2^((i - N / 2) / (N - 1)) r_d - * - * For our 1m average room, we get: - */ -static const ALfloat LATE_LINE_LENGTHS[NUM_LINES] = -{ - 1.9419362e-3f, 2.4466860e-3f, 3.3791220e-3f, 3.8838720e-3f -}; - - -typedef struct DelayLineI { - /* The delay lines use interleaved samples, with the lengths being powers - * of 2 to allow the use of bit-masking instead of a modulus for wrapping. - */ - ALsizei Mask; - ALfloat (*Line)[NUM_LINES]; -} DelayLineI; - -typedef struct VecAllpass { - DelayLineI Delay; - ALfloat Coeff; - ALsizei Offset[NUM_LINES][2]; -} VecAllpass; - -typedef struct T60Filter { - /* Two filters are used to adjust the signal. One to control the low - * frequencies, and one to control the high frequencies. - */ - ALfloat MidGain[2]; - BiquadFilter HFFilter, LFFilter; -} T60Filter; - -typedef struct EarlyReflections { - /* A Gerzon vector all-pass filter is used to simulate initial diffusion. - * The spread from this filter also helps smooth out the reverb tail. - */ - VecAllpass VecAp; - - /* An echo line is used to complete the second half of the early - * reflections. - */ - DelayLineI Delay; - ALsizei Offset[NUM_LINES][2]; - ALfloat Coeff[NUM_LINES][2]; - - /* The gain for each output channel based on 3D panning. */ - ALfloat CurrentGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; - ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; -} EarlyReflections; - -typedef struct LateReverb { - /* A recursive delay line is used fill in the reverb tail. */ - DelayLineI Delay; - ALsizei Offset[NUM_LINES][2]; - - /* Attenuation to compensate for the modal density and decay rate of the - * late lines. - */ - ALfloat DensityGain[2]; - - /* T60 decay filters are used to simulate absorption. */ - T60Filter T60[NUM_LINES]; - - /* A Gerzon vector all-pass filter is used to simulate diffusion. */ - VecAllpass VecAp; - - /* The gain for each output channel based on 3D panning. */ - ALfloat CurrentGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; - ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; -} LateReverb; - -typedef struct ALreverbState { - DERIVE_FROM_TYPE(ALeffectState); - - /* All delay lines are allocated as a single buffer to reduce memory - * fragmentation and management code. - */ - ALfloat *SampleBuffer; - ALuint TotalSamples; - - /* Master effect filters */ - struct { - BiquadFilter Lp; - BiquadFilter Hp; - } Filter[NUM_LINES]; - - /* Core delay line (early reflections and late reverb tap from this). */ - DelayLineI Delay; - - /* Tap points for early reflection delay. */ - ALsizei EarlyDelayTap[NUM_LINES][2]; - ALfloat EarlyDelayCoeff[NUM_LINES][2]; - - /* Tap points for late reverb feed and delay. */ - ALsizei LateFeedTap; - ALsizei LateDelayTap[NUM_LINES][2]; - - /* Coefficients for the all-pass and line scattering matrices. */ - ALfloat MixX; - ALfloat MixY; - - EarlyReflections Early; - - LateReverb Late; - - /* Indicates the cross-fade point for delay line reads [0,FADE_SAMPLES]. */ - ALsizei FadeCount; - - /* Maximum number of samples to process at once. */ - ALsizei MaxUpdate[2]; - - /* The current write offset for all delay lines. */ - ALsizei Offset; - - /* Temporary storage used when processing. */ - alignas(16) ALfloat TempSamples[NUM_LINES][MAX_UPDATE_SAMPLES]; - alignas(16) ALfloat MixSamples[NUM_LINES][MAX_UPDATE_SAMPLES]; -} ALreverbState; - -static ALvoid ALreverbState_Destruct(ALreverbState *State); -static ALboolean ALreverbState_deviceUpdate(ALreverbState *State, ALCdevice *Device); -static ALvoid ALreverbState_update(ALreverbState *State, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props); -static ALvoid ALreverbState_process(ALreverbState *State, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALreverbState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALreverbState); - -static void ALreverbState_Construct(ALreverbState *state) -{ - ALsizei i, j; - - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALreverbState, ALeffectState, state); - - state->TotalSamples = 0; - state->SampleBuffer = NULL; - - for(i = 0;i < NUM_LINES;i++) - { - BiquadFilter_clear(&state->Filter[i].Lp); - BiquadFilter_clear(&state->Filter[i].Hp); - } - - state->Delay.Mask = 0; - state->Delay.Line = NULL; - - for(i = 0;i < NUM_LINES;i++) - { - state->EarlyDelayTap[i][0] = 0; - state->EarlyDelayTap[i][1] = 0; - state->EarlyDelayCoeff[i][0] = 0.0f; - state->EarlyDelayCoeff[i][1] = 0.0f; - } - - state->LateFeedTap = 0; - - for(i = 0;i < NUM_LINES;i++) - { - state->LateDelayTap[i][0] = 0; - state->LateDelayTap[i][1] = 0; - } - - state->MixX = 0.0f; - state->MixY = 0.0f; - - state->Early.VecAp.Delay.Mask = 0; - state->Early.VecAp.Delay.Line = NULL; - state->Early.VecAp.Coeff = 0.0f; - state->Early.Delay.Mask = 0; - state->Early.Delay.Line = NULL; - for(i = 0;i < NUM_LINES;i++) - { - state->Early.VecAp.Offset[i][0] = 0; - state->Early.VecAp.Offset[i][1] = 0; - state->Early.Offset[i][0] = 0; - state->Early.Offset[i][1] = 0; - state->Early.Coeff[i][0] = 0.0f; - state->Early.Coeff[i][1] = 0.0f; - } - - state->Late.DensityGain[0] = 0.0f; - state->Late.DensityGain[1] = 0.0f; - state->Late.Delay.Mask = 0; - state->Late.Delay.Line = NULL; - state->Late.VecAp.Delay.Mask = 0; - state->Late.VecAp.Delay.Line = NULL; - state->Late.VecAp.Coeff = 0.0f; - for(i = 0;i < NUM_LINES;i++) - { - state->Late.Offset[i][0] = 0; - state->Late.Offset[i][1] = 0; - - state->Late.VecAp.Offset[i][0] = 0; - state->Late.VecAp.Offset[i][1] = 0; - - state->Late.T60[i].MidGain[0] = 0.0f; - state->Late.T60[i].MidGain[1] = 0.0f; - BiquadFilter_clear(&state->Late.T60[i].HFFilter); - BiquadFilter_clear(&state->Late.T60[i].LFFilter); - } - - for(i = 0;i < NUM_LINES;i++) - { - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - { - state->Early.CurrentGain[i][j] = 0.0f; - state->Early.PanGain[i][j] = 0.0f; - state->Late.CurrentGain[i][j] = 0.0f; - state->Late.PanGain[i][j] = 0.0f; - } - } - - state->FadeCount = 0; - state->MaxUpdate[0] = MAX_UPDATE_SAMPLES; - state->MaxUpdate[1] = MAX_UPDATE_SAMPLES; - state->Offset = 0; -} - -static ALvoid ALreverbState_Destruct(ALreverbState *State) -{ - al_free(State->SampleBuffer); - State->SampleBuffer = NULL; - - ALeffectState_Destruct(STATIC_CAST(ALeffectState,State)); -} - -/************************************** - * Device Update * - **************************************/ - -static inline ALfloat CalcDelayLengthMult(ALfloat density) -{ - return maxf(5.0f, cbrtf(density*DENSITY_SCALE)); -} - -/* Given the allocated sample buffer, this function updates each delay line - * offset. - */ -static inline ALvoid RealizeLineOffset(ALfloat *sampleBuffer, DelayLineI *Delay) -{ - union { - ALfloat *f; - ALfloat (*f4)[NUM_LINES]; - } u; - u.f = &sampleBuffer[(ptrdiff_t)Delay->Line * NUM_LINES]; - Delay->Line = u.f4; -} - -/* Calculate the length of a delay line and store its mask and offset. */ -static ALuint CalcLineLength(const ALfloat length, const ptrdiff_t offset, const ALuint frequency, - const ALuint extra, DelayLineI *Delay) -{ - ALuint samples; - - /* All line lengths are powers of 2, calculated from their lengths in - * seconds, rounded up. - */ - samples = float2int(ceilf(length*frequency)); - samples = NextPowerOf2(samples + extra); - - /* All lines share a single sample buffer. */ - Delay->Mask = samples - 1; - Delay->Line = (ALfloat(*)[NUM_LINES])offset; - - /* Return the sample count for accumulation. */ - return samples; -} - -/* Calculates the delay line metrics and allocates the shared sample buffer - * for all lines given the sample rate (frequency). If an allocation failure - * occurs, it returns AL_FALSE. - */ -static ALboolean AllocLines(const ALuint frequency, ALreverbState *State) -{ - ALuint totalSamples, i; - ALfloat multiplier, length; - - /* All delay line lengths are calculated to accomodate the full range of - * lengths given their respective paramters. - */ - totalSamples = 0; - - /* Multiplier for the maximum density value, i.e. density=1, which is - * actually the least density... - */ - multiplier = CalcDelayLengthMult(AL_EAXREVERB_MAX_DENSITY); - - /* The main delay length includes the maximum early reflection delay, the - * largest early tap width, the maximum late reverb delay, and the - * largest late tap width. Finally, it must also be extended by the - * update size (MAX_UPDATE_SAMPLES) for block processing. - */ - length = AL_EAXREVERB_MAX_REFLECTIONS_DELAY + EARLY_TAP_LENGTHS[NUM_LINES-1]*multiplier + - AL_EAXREVERB_MAX_LATE_REVERB_DELAY + - (LATE_LINE_LENGTHS[NUM_LINES-1] - LATE_LINE_LENGTHS[0])*0.25f*multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, MAX_UPDATE_SAMPLES, - &State->Delay); - - /* The early vector all-pass line. */ - length = EARLY_ALLPASS_LENGTHS[NUM_LINES-1] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Early.VecAp.Delay); - - /* The early reflection line. */ - length = EARLY_LINE_LENGTHS[NUM_LINES-1] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Early.Delay); - - /* The late vector all-pass line. */ - length = LATE_ALLPASS_LENGTHS[NUM_LINES-1] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Late.VecAp.Delay); - - /* The late delay lines are calculated from the largest maximum density - * line length. - */ - length = LATE_LINE_LENGTHS[NUM_LINES-1] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Late.Delay); - - if(totalSamples != State->TotalSamples) - { - ALfloat *newBuffer; - - TRACE("New reverb buffer length: %ux4 samples\n", totalSamples); - newBuffer = al_calloc(16, sizeof(ALfloat[NUM_LINES]) * totalSamples); - if(!newBuffer) return AL_FALSE; - - al_free(State->SampleBuffer); - State->SampleBuffer = newBuffer; - State->TotalSamples = totalSamples; - } - - /* Update all delays to reflect the new sample buffer. */ - RealizeLineOffset(State->SampleBuffer, &State->Delay); - RealizeLineOffset(State->SampleBuffer, &State->Early.VecAp.Delay); - RealizeLineOffset(State->SampleBuffer, &State->Early.Delay); - RealizeLineOffset(State->SampleBuffer, &State->Late.VecAp.Delay); - RealizeLineOffset(State->SampleBuffer, &State->Late.Delay); - - /* Clear the sample buffer. */ - for(i = 0;i < State->TotalSamples;i++) - State->SampleBuffer[i] = 0.0f; - - return AL_TRUE; -} - -static ALboolean ALreverbState_deviceUpdate(ALreverbState *State, ALCdevice *Device) -{ - ALuint frequency = Device->Frequency; - ALfloat multiplier; - - /* Allocate the delay lines. */ - if(!AllocLines(frequency, State)) - return AL_FALSE; - - multiplier = CalcDelayLengthMult(AL_EAXREVERB_MAX_DENSITY); - - /* The late feed taps are set a fixed position past the latest delay tap. */ - State->LateFeedTap = float2int((AL_EAXREVERB_MAX_REFLECTIONS_DELAY + - EARLY_TAP_LENGTHS[NUM_LINES-1]*multiplier) * - frequency); - - return AL_TRUE; -} - -/************************************** - * Effect Update * - **************************************/ - -/* Calculate a decay coefficient given the length of each cycle and the time - * until the decay reaches -60 dB. - */ -static inline ALfloat CalcDecayCoeff(const ALfloat length, const ALfloat decayTime) -{ - return powf(REVERB_DECAY_GAIN, length/decayTime); -} - -/* Calculate a decay length from a coefficient and the time until the decay - * reaches -60 dB. - */ -static inline ALfloat CalcDecayLength(const ALfloat coeff, const ALfloat decayTime) -{ - return log10f(coeff) * decayTime / log10f(REVERB_DECAY_GAIN); -} - -/* Calculate an attenuation to be applied to the input of any echo models to - * compensate for modal density and decay time. - */ -static inline ALfloat CalcDensityGain(const ALfloat a) -{ - /* The energy of a signal can be obtained by finding the area under the - * squared signal. This takes the form of Sum(x_n^2), where x is the - * amplitude for the sample n. - * - * Decaying feedback matches exponential decay of the form Sum(a^n), - * where a is the attenuation coefficient, and n is the sample. The area - * under this decay curve can be calculated as: 1 / (1 - a). - * - * Modifying the above equation to find the area under the squared curve - * (for energy) yields: 1 / (1 - a^2). Input attenuation can then be - * calculated by inverting the square root of this approximation, - * yielding: 1 / sqrt(1 / (1 - a^2)), simplified to: sqrt(1 - a^2). - */ - return sqrtf(1.0f - a*a); -} - -/* Calculate the scattering matrix coefficients given a diffusion factor. */ -static inline ALvoid CalcMatrixCoeffs(const ALfloat diffusion, ALfloat *x, ALfloat *y) -{ - ALfloat n, t; - - /* The matrix is of order 4, so n is sqrt(4 - 1). */ - n = sqrtf(3.0f); - t = diffusion * atanf(n); - - /* Calculate the first mixing matrix coefficient. */ - *x = cosf(t); - /* Calculate the second mixing matrix coefficient. */ - *y = sinf(t) / n; -} - -/* Calculate the limited HF ratio for use with the late reverb low-pass - * filters. - */ -static ALfloat CalcLimitedHfRatio(const ALfloat hfRatio, const ALfloat airAbsorptionGainHF, - const ALfloat decayTime, const ALfloat SpeedOfSound) -{ - ALfloat limitRatio; - - /* Find the attenuation due to air absorption in dB (converting delay - * time to meters using the speed of sound). Then reversing the decay - * equation, solve for HF ratio. The delay length is cancelled out of - * the equation, so it can be calculated once for all lines. - */ - limitRatio = 1.0f / (CalcDecayLength(airAbsorptionGainHF, decayTime) * SpeedOfSound); - - /* Using the limit calculated above, apply the upper bound to the HF ratio. - */ - return minf(limitRatio, hfRatio); -} - - -/* Calculates the 3-band T60 damping coefficients for a particular delay line - * of specified length, using a combination of two shelf filter sections given - * decay times for each band split at two reference frequencies. - */ -static void CalcT60DampingCoeffs(const ALfloat length, const ALfloat lfDecayTime, - const ALfloat mfDecayTime, const ALfloat hfDecayTime, - const ALfloat lf0norm, const ALfloat hf0norm, - T60Filter *filter) -{ - ALfloat lfGain = CalcDecayCoeff(length, lfDecayTime); - ALfloat mfGain = CalcDecayCoeff(length, mfDecayTime); - ALfloat hfGain = CalcDecayCoeff(length, hfDecayTime); - - filter->MidGain[1] = mfGain; - BiquadFilter_setParams(&filter->LFFilter, BiquadType_LowShelf, lfGain/mfGain, lf0norm, - calc_rcpQ_from_slope(lfGain/mfGain, 1.0f)); - BiquadFilter_setParams(&filter->HFFilter, BiquadType_HighShelf, hfGain/mfGain, hf0norm, - calc_rcpQ_from_slope(hfGain/mfGain, 1.0f)); -} - -/* Update the offsets for the main effect delay line. */ -static ALvoid UpdateDelayLine(const ALfloat earlyDelay, const ALfloat lateDelay, const ALfloat density, const ALfloat decayTime, const ALuint frequency, ALreverbState *State) -{ - ALfloat multiplier, length; - ALuint i; - - multiplier = CalcDelayLengthMult(density); - - /* Early reflection taps are decorrelated by means of an average room - * reflection approximation described above the definition of the taps. - * This approximation is linear and so the above density multiplier can - * be applied to adjust the width of the taps. A single-band decay - * coefficient is applied to simulate initial attenuation and absorption. - * - * Late reverb taps are based on the late line lengths to allow a zero- - * delay path and offsets that would continue the propagation naturally - * into the late lines. - */ - for(i = 0;i < NUM_LINES;i++) - { - length = earlyDelay + EARLY_TAP_LENGTHS[i]*multiplier; - State->EarlyDelayTap[i][1] = float2int(length * frequency); - - length = EARLY_TAP_LENGTHS[i]*multiplier; - State->EarlyDelayCoeff[i][1] = CalcDecayCoeff(length, decayTime); - - length = lateDelay + (LATE_LINE_LENGTHS[i] - LATE_LINE_LENGTHS[0])*0.25f*multiplier; - State->LateDelayTap[i][1] = State->LateFeedTap + float2int(length * frequency); - } -} - -/* Update the early reflection line lengths and gain coefficients. */ -static ALvoid UpdateEarlyLines(const ALfloat density, const ALfloat diffusion, const ALfloat decayTime, const ALuint frequency, EarlyReflections *Early) -{ - ALfloat multiplier, length; - ALsizei i; - - multiplier = CalcDelayLengthMult(density); - - /* Calculate the all-pass feed-back/forward coefficient. */ - Early->VecAp.Coeff = sqrtf(0.5f) * powf(diffusion, 2.0f); - - for(i = 0;i < NUM_LINES;i++) - { - /* Calculate the length (in seconds) of each all-pass line. */ - length = EARLY_ALLPASS_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each all-pass line. */ - Early->VecAp.Offset[i][1] = float2int(length * frequency); - - /* Calculate the length (in seconds) of each delay line. */ - length = EARLY_LINE_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each delay line. */ - Early->Offset[i][1] = float2int(length * frequency); - - /* Calculate the gain (coefficient) for each line. */ - Early->Coeff[i][1] = CalcDecayCoeff(length, decayTime); - } -} - -/* Update the late reverb line lengths and T60 coefficients. */ -static ALvoid UpdateLateLines(const ALfloat density, const ALfloat diffusion, const ALfloat lfDecayTime, const ALfloat mfDecayTime, const ALfloat hfDecayTime, const ALfloat lf0norm, const ALfloat hf0norm, const ALuint frequency, LateReverb *Late) -{ - /* Scaling factor to convert the normalized reference frequencies from - * representing 0...freq to 0...max_reference. - */ - const ALfloat norm_weight_factor = (ALfloat)frequency / AL_EAXREVERB_MAX_HFREFERENCE; - ALfloat multiplier, length, bandWeights[3]; - ALsizei i; - - /* To compensate for changes in modal density and decay time of the late - * reverb signal, the input is attenuated based on the maximal energy of - * the outgoing signal. This approximation is used to keep the apparent - * energy of the signal equal for all ranges of density and decay time. - * - * The average length of the delay lines is used to calculate the - * attenuation coefficient. - */ - multiplier = CalcDelayLengthMult(density); - length = (LATE_LINE_LENGTHS[0] + LATE_LINE_LENGTHS[1] + - LATE_LINE_LENGTHS[2] + LATE_LINE_LENGTHS[3]) / 4.0f * multiplier; - length += (LATE_ALLPASS_LENGTHS[0] + LATE_ALLPASS_LENGTHS[1] + - LATE_ALLPASS_LENGTHS[2] + LATE_ALLPASS_LENGTHS[3]) / 4.0f * multiplier; - /* The density gain calculation uses an average decay time weighted by - * approximate bandwidth. This attempts to compensate for losses of energy - * that reduce decay time due to scattering into highly attenuated bands. - */ - bandWeights[0] = lf0norm*norm_weight_factor; - bandWeights[1] = hf0norm*norm_weight_factor - lf0norm*norm_weight_factor; - bandWeights[2] = 1.0f - hf0norm*norm_weight_factor; - Late->DensityGain[1] = CalcDensityGain( - CalcDecayCoeff(length, - bandWeights[0]*lfDecayTime + bandWeights[1]*mfDecayTime + bandWeights[2]*hfDecayTime - ) - ); - - /* Calculate the all-pass feed-back/forward coefficient. */ - Late->VecAp.Coeff = sqrtf(0.5f) * powf(diffusion, 2.0f); - - for(i = 0;i < NUM_LINES;i++) - { - /* Calculate the length (in seconds) of each all-pass line. */ - length = LATE_ALLPASS_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each all-pass line. */ - Late->VecAp.Offset[i][1] = float2int(length * frequency); - - /* Calculate the length (in seconds) of each delay line. */ - length = LATE_LINE_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each delay line. */ - Late->Offset[i][1] = float2int(length*frequency + 0.5f); - - /* Approximate the absorption that the vector all-pass would exhibit - * given the current diffusion so we don't have to process a full T60 - * filter for each of its four lines. - */ - length += lerp(LATE_ALLPASS_LENGTHS[i], - (LATE_ALLPASS_LENGTHS[0] + LATE_ALLPASS_LENGTHS[1] + - LATE_ALLPASS_LENGTHS[2] + LATE_ALLPASS_LENGTHS[3]) / 4.0f, - diffusion) * multiplier; - - /* Calculate the T60 damping coefficients for each line. */ - CalcT60DampingCoeffs(length, lfDecayTime, mfDecayTime, hfDecayTime, - lf0norm, hf0norm, &Late->T60[i]); - } -} - -/* Creates a transform matrix given a reverb vector. The vector pans the reverb - * reflections toward the given direction, using its magnitude (up to 1) as a - * focal strength. This function results in a B-Format transformation matrix - * that spatially focuses the signal in the desired direction. - */ -static aluMatrixf GetTransformFromVector(const ALfloat *vec) -{ - const ALfloat sqrt_3 = 1.732050808f; - aluMatrixf focus; - ALfloat norm[3]; - ALfloat mag; - - /* Normalize the panning vector according to the N3D scale, which has an - * extra sqrt(3) term on the directional components. Converting from OpenAL - * to B-Format also requires negating X (ACN 1) and Z (ACN 3). Note however - * that the reverb panning vectors use left-handed coordinates, unlike the - * rest of OpenAL which use right-handed. This is fixed by negating Z, - * which cancels out with the B-Format Z negation. - */ - mag = sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); - if(mag > 1.0f) - { - norm[0] = vec[0] / mag * -sqrt_3; - norm[1] = vec[1] / mag * sqrt_3; - norm[2] = vec[2] / mag * sqrt_3; - mag = 1.0f; - } - else - { - /* If the magnitude is less than or equal to 1, just apply the sqrt(3) - * term. There's no need to renormalize the magnitude since it would - * just be reapplied in the matrix. - */ - norm[0] = vec[0] * -sqrt_3; - norm[1] = vec[1] * sqrt_3; - norm[2] = vec[2] * sqrt_3; - } - - aluMatrixfSet(&focus, - 1.0f, 0.0f, 0.0f, 0.0f, - norm[0], 1.0f-mag, 0.0f, 0.0f, - norm[1], 0.0f, 1.0f-mag, 0.0f, - norm[2], 0.0f, 0.0f, 1.0f-mag - ); - - return focus; -} - -/* Update the early and late 3D panning gains. */ -static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, const ALfloat earlyGain, const ALfloat lateGain, ALreverbState *State) -{ - aluMatrixf transform, rot; - ALsizei i; - - STATIC_CAST(ALeffectState,State)->OutBuffer = Device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,State)->OutChannels = Device->FOAOut.NumChannels; - - /* Note: _res is transposed. */ -#define MATRIX_MULT(_res, _m1, _m2) do { \ - int row, col; \ - for(col = 0;col < 4;col++) \ - { \ - for(row = 0;row < 4;row++) \ - _res.m[col][row] = _m1.m[row][0]*_m2.m[0][col] + _m1.m[row][1]*_m2.m[1][col] + \ - _m1.m[row][2]*_m2.m[2][col] + _m1.m[row][3]*_m2.m[3][col]; \ - } \ -} while(0) - /* Create a matrix that first converts A-Format to B-Format, then - * transforms the B-Format signal according to the panning vector. - */ - rot = GetTransformFromVector(ReflectionsPan); - MATRIX_MULT(transform, rot, A2B); - memset(&State->Early.PanGain, 0, sizeof(State->Early.PanGain)); - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(&Device->FOAOut, transform.m[i], earlyGain, - State->Early.PanGain[i]); - - rot = GetTransformFromVector(LateReverbPan); - MATRIX_MULT(transform, rot, A2B); - memset(&State->Late.PanGain, 0, sizeof(State->Late.PanGain)); - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(&Device->FOAOut, transform.m[i], lateGain, - State->Late.PanGain[i]); -#undef MATRIX_MULT -} - -static ALvoid ALreverbState_update(ALreverbState *State, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props) -{ - const ALCdevice *Device = Context->Device; - const ALlistener *Listener = Context->Listener; - ALuint frequency = Device->Frequency; - ALfloat lf0norm, hf0norm, hfRatio; - ALfloat lfDecayTime, hfDecayTime; - ALfloat gain, gainlf, gainhf; - ALsizei i; - - /* Calculate the master filters */ - hf0norm = minf(props->Reverb.HFReference / frequency, 0.49f); - /* Restrict the filter gains from going below -60dB to keep the filter from - * killing most of the signal. - */ - gainhf = maxf(props->Reverb.GainHF, 0.001f); - BiquadFilter_setParams(&State->Filter[0].Lp, BiquadType_HighShelf, gainhf, hf0norm, - calc_rcpQ_from_slope(gainhf, 1.0f)); - lf0norm = minf(props->Reverb.LFReference / frequency, 0.49f); - gainlf = maxf(props->Reverb.GainLF, 0.001f); - BiquadFilter_setParams(&State->Filter[0].Hp, BiquadType_LowShelf, gainlf, lf0norm, - calc_rcpQ_from_slope(gainlf, 1.0f)); - for(i = 1;i < NUM_LINES;i++) - { - BiquadFilter_copyParams(&State->Filter[i].Lp, &State->Filter[0].Lp); - BiquadFilter_copyParams(&State->Filter[i].Hp, &State->Filter[0].Hp); - } - - /* Update the main effect delay and associated taps. */ - UpdateDelayLine(props->Reverb.ReflectionsDelay, props->Reverb.LateReverbDelay, - props->Reverb.Density, props->Reverb.DecayTime, frequency, - State); - - /* Update the early lines. */ - UpdateEarlyLines(props->Reverb.Density, props->Reverb.Diffusion, - props->Reverb.DecayTime, frequency, &State->Early); - - /* Get the mixing matrix coefficients. */ - CalcMatrixCoeffs(props->Reverb.Diffusion, &State->MixX, &State->MixY); - - /* If the HF limit parameter is flagged, calculate an appropriate limit - * based on the air absorption parameter. - */ - hfRatio = props->Reverb.DecayHFRatio; - if(props->Reverb.DecayHFLimit && props->Reverb.AirAbsorptionGainHF < 1.0f) - hfRatio = CalcLimitedHfRatio(hfRatio, props->Reverb.AirAbsorptionGainHF, - props->Reverb.DecayTime, Listener->Params.ReverbSpeedOfSound - ); - - /* Calculate the LF/HF decay times. */ - lfDecayTime = clampf(props->Reverb.DecayTime * props->Reverb.DecayLFRatio, - AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME); - hfDecayTime = clampf(props->Reverb.DecayTime * hfRatio, - AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME); - - /* Update the late lines. */ - UpdateLateLines(props->Reverb.Density, props->Reverb.Diffusion, - lfDecayTime, props->Reverb.DecayTime, hfDecayTime, lf0norm, hf0norm, - frequency, &State->Late - ); - - /* Update early and late 3D panning. */ - gain = props->Reverb.Gain * Slot->Params.Gain * ReverbBoost; - Update3DPanning(Device, props->Reverb.ReflectionsPan, props->Reverb.LateReverbPan, - props->Reverb.ReflectionsGain*gain, props->Reverb.LateReverbGain*gain, - State); - - /* Calculate the max update size from the smallest relevant delay. */ - State->MaxUpdate[1] = mini(MAX_UPDATE_SAMPLES, State->Late.Offset[0][1]); - - /* Determine if delay-line cross-fading is required. TODO: Add some fuzz - * for the float comparisons? The math should be stable enough that the - * result should be the same if nothing's changed, and changes in the float - * values should (though may not always) be matched by changes in delay - * offsets. - */ - if(State->Late.DensityGain[1] != State->Late.DensityGain[0]) - State->FadeCount = 0; - else for(i = 0;i < NUM_LINES;i++) - { - if(State->EarlyDelayTap[i][1] != State->EarlyDelayTap[i][0] || - State->EarlyDelayCoeff[i][1] != State->EarlyDelayCoeff[i][0] || - State->Early.VecAp.Offset[i][1] != State->Early.VecAp.Offset[i][0] || - State->Early.Offset[i][1] != State->Early.Offset[i][0] || - State->Early.Coeff[i][1] != State->Early.Coeff[i][0] || - State->LateDelayTap[i][1] != State->LateDelayTap[i][0] || - State->Late.VecAp.Offset[i][1] != State->Late.VecAp.Offset[i][0] || - State->Late.Offset[i][1] != State->Late.Offset[i][0] || - State->Late.T60[i].MidGain[1] != State->Late.T60[i].MidGain[0]) - { - State->FadeCount = 0; - break; - } - } -} - - -/************************************** - * Effect Processing * - **************************************/ - -/* Basic delay line input/output routines. */ -static inline ALfloat DelayLineOut(const DelayLineI *Delay, const ALsizei offset, const ALsizei c) -{ - return Delay->Line[offset&Delay->Mask][c]; -} - -/* Cross-faded delay line output routine. Instead of interpolating the - * offsets, this interpolates (cross-fades) the outputs at each offset. - */ -static inline ALfloat FadedDelayLineOut(const DelayLineI *Delay, const ALsizei off0, - const ALsizei off1, const ALsizei c, - const ALfloat sc0, const ALfloat sc1) -{ - return Delay->Line[off0&Delay->Mask][c]*sc0 + - Delay->Line[off1&Delay->Mask][c]*sc1; -} - - -static inline ALvoid DelayLineIn(const DelayLineI *Delay, ALsizei offset, const ALsizei c, - const ALfloat *restrict in, ALsizei count) -{ - ALsizei i; - for(i = 0;i < count;i++) - Delay->Line[(offset++)&Delay->Mask][c] = *(in++); -} - -static inline ALvoid DelayLineIn4Rev(const DelayLineI *Delay, ALsizei offset, const ALfloat in[NUM_LINES]) -{ - ALsizei i; - offset &= Delay->Mask; - for(i = 0;i < NUM_LINES;i++) - Delay->Line[offset][i] = in[NUM_LINES-1-i]; -} - -/* Applies a scattering matrix to the 4-line (vector) input. This is used - * for both the below vector all-pass model and to perform modal feed-back - * delay network (FDN) mixing. - * - * The matrix is derived from a skew-symmetric matrix to form a 4D rotation - * matrix with a single unitary rotational parameter: - * - * [ d, a, b, c ] 1 = a^2 + b^2 + c^2 + d^2 - * [ -a, d, c, -b ] - * [ -b, -c, d, a ] - * [ -c, b, -a, d ] - * - * The rotation is constructed from the effect's diffusion parameter, - * yielding: - * - * 1 = x^2 + 3 y^2 - * - * Where a, b, and c are the coefficient y with differing signs, and d is the - * coefficient x. The final matrix is thus: - * - * [ x, y, -y, y ] n = sqrt(matrix_order - 1) - * [ -y, x, y, y ] t = diffusion_parameter * atan(n) - * [ y, -y, x, y ] x = cos(t) - * [ -y, -y, -y, x ] y = sin(t) / n - * - * Any square orthogonal matrix with an order that is a power of two will - * work (where ^T is transpose, ^-1 is inverse): - * - * M^T = M^-1 - * - * Using that knowledge, finding an appropriate matrix can be accomplished - * naively by searching all combinations of: - * - * M = D + S - S^T - * - * Where D is a diagonal matrix (of x), and S is a triangular matrix (of y) - * whose combination of signs are being iterated. - */ -static inline void VectorPartialScatter(ALfloat *restrict out, const ALfloat *restrict in, - const ALfloat xCoeff, const ALfloat yCoeff) -{ - out[0] = xCoeff*in[0] + yCoeff*( in[1] + -in[2] + in[3]); - out[1] = xCoeff*in[1] + yCoeff*(-in[0] + in[2] + in[3]); - out[2] = xCoeff*in[2] + yCoeff*( in[0] + -in[1] + in[3]); - out[3] = xCoeff*in[3] + yCoeff*(-in[0] + -in[1] + -in[2] ); -} -#define VectorScatterDelayIn(delay, o, in, xcoeff, ycoeff) \ - VectorPartialScatter((delay)->Line[(o)&(delay)->Mask], in, xcoeff, ycoeff) - -/* Same as above, but reverses the input. */ -static inline void VectorPartialScatterRev(ALfloat *restrict out, const ALfloat *restrict in, - const ALfloat xCoeff, const ALfloat yCoeff) -{ - out[0] = xCoeff*in[3] + yCoeff*(in[0] + -in[1] + in[2] ); - out[1] = xCoeff*in[2] + yCoeff*(in[0] + in[1] + -in[3]); - out[2] = xCoeff*in[1] + yCoeff*(in[0] + -in[2] + in[3]); - out[3] = xCoeff*in[0] + yCoeff*( -in[1] + -in[2] + -in[3]); -} -#define VectorScatterRevDelayIn(delay, o, in, xcoeff, ycoeff) \ - VectorPartialScatterRev((delay)->Line[(o)&(delay)->Mask], in, xcoeff, ycoeff) - -/* This applies a Gerzon multiple-in/multiple-out (MIMO) vector all-pass - * filter to the 4-line input. - * - * It works by vectorizing a regular all-pass filter and replacing the delay - * element with a scattering matrix (like the one above) and a diagonal - * matrix of delay elements. - * - * Two static specializations are used for transitional (cross-faded) delay - * line processing and non-transitional processing. - */ -static void VectorAllpass_Unfaded(ALfloat (*restrict samples)[MAX_UPDATE_SAMPLES], ALsizei offset, - const ALfloat xCoeff, const ALfloat yCoeff, ALsizei todo, - VecAllpass *Vap) -{ - const DelayLineI delay = Vap->Delay; - const ALfloat feedCoeff = Vap->Coeff; - ALsizei vap_offset[NUM_LINES]; - ALsizei i, j; - - ASSUME(todo > 0); - - for(j = 0;j < NUM_LINES;j++) - vap_offset[j] = offset-Vap->Offset[j][0]; - for(i = 0;i < todo;i++) - { - ALfloat f[NUM_LINES]; - - for(j = 0;j < NUM_LINES;j++) - { - ALfloat input = samples[j][i]; - ALfloat out = DelayLineOut(&delay, vap_offset[j]++, j) - feedCoeff*input; - f[j] = input + feedCoeff*out; - - samples[j][i] = out; - } - - VectorScatterDelayIn(&delay, offset, f, xCoeff, yCoeff); - ++offset; - } -} -static void VectorAllpass_Faded(ALfloat (*restrict samples)[MAX_UPDATE_SAMPLES], ALsizei offset, - const ALfloat xCoeff, const ALfloat yCoeff, ALfloat fade, - ALsizei todo, VecAllpass *Vap) -{ - const DelayLineI delay = Vap->Delay; - const ALfloat feedCoeff = Vap->Coeff; - ALsizei vap_offset[NUM_LINES][2]; - ALsizei i, j; - - ASSUME(todo > 0); - - for(j = 0;j < NUM_LINES;j++) - { - vap_offset[j][0] = offset-Vap->Offset[j][0]; - vap_offset[j][1] = offset-Vap->Offset[j][1]; - } - for(i = 0;i < todo;i++) - { - ALfloat f[NUM_LINES]; - - for(j = 0;j < NUM_LINES;j++) - { - ALfloat input = samples[j][i]; - ALfloat out = - FadedDelayLineOut(&delay, vap_offset[j][0]++, vap_offset[j][1]++, j, - 1.0f-fade, fade - ) - feedCoeff*input; - f[j] = input + feedCoeff*out; - - samples[j][i] = out; - } - fade += FadeStep; - - VectorScatterDelayIn(&delay, offset, f, xCoeff, yCoeff); - ++offset; - } -} - -/* This generates early reflections. - * - * This is done by obtaining the primary reflections (those arriving from the - * same direction as the source) from the main delay line. These are - * attenuated and all-pass filtered (based on the diffusion parameter). - * - * The early lines are then fed in reverse (according to the approximately - * opposite spatial location of the A-Format lines) to create the secondary - * reflections (those arriving from the opposite direction as the source). - * - * The early response is then completed by combining the primary reflections - * with the delayed and attenuated output from the early lines. - * - * Finally, the early response is reversed, scattered (based on diffusion), - * and fed into the late reverb section of the main delay line. - * - * Two static specializations are used for transitional (cross-faded) delay - * line processing and non-transitional processing. - */ -static void EarlyReflection_Unfaded(ALreverbState *State, ALsizei offset, const ALsizei todo, - ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) -{ - ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; - const DelayLineI early_delay = State->Early.Delay; - const DelayLineI main_delay = State->Delay; - ALsizei early_feedb_tap[NUM_LINES]; - ALfloat early_feedb_coeff[NUM_LINES]; - const ALfloat mixX = State->MixX; - const ALfloat mixY = State->MixY; - ALsizei late_feed_tap; - ALsizei i, j; - - ASSUME(todo > 0); - - /* First, load decorrelated samples from the main delay line as the primary - * reflections. - */ - for(j = 0;j < NUM_LINES;j++) - { - ALsizei early_delay_tap = offset - State->EarlyDelayTap[j][0]; - ALfloat coeff = State->EarlyDelayCoeff[j][0]; - for(i = 0;i < todo;i++) - temps[j][i] = DelayLineOut(&main_delay, early_delay_tap++, j) * coeff; - } - - /* Apply a vector all-pass, to help color the initial reflections based on - * the diffusion strength. - */ - VectorAllpass_Unfaded(temps, offset, mixX, mixY, todo, &State->Early.VecAp); - - for(j = 0;j < NUM_LINES;j++) - { - early_feedb_tap[j] = offset - State->Early.Offset[j][0]; - early_feedb_coeff[j] = State->Early.Coeff[j][0]; - } - late_feed_tap = offset - State->LateFeedTap; - for(i = 0;i < todo;i++) - { - ALfloat f[NUM_LINES]; - - for(j = 0;j < NUM_LINES;j++) - f[j] = temps[j][i]; - - /* Apply a delay and bounce to generate secondary reflections, combine - * with the primary reflections and write out the result for mixing. - */ - DelayLineIn4Rev(&early_delay, offset, f); - for(j = 0;j < NUM_LINES;j++) - { - f[j] += DelayLineOut(&early_delay, early_feedb_tap[j]++, j) * early_feedb_coeff[j]; - out[j][i] = f[j]; - } - - /* Also write the result back to the main delay line for the late - * reverb stage to pick up at the appropriate time, appplying a scatter - * and bounce to improve the initial diffusion in the late reverb. - */ - VectorScatterRevDelayIn(&main_delay, late_feed_tap++, f, mixX, mixY); - offset++; - } -} -static void EarlyReflection_Faded(ALreverbState *State, ALsizei offset, const ALsizei todo, - const ALfloat fade, ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) -{ - ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; - const DelayLineI early_delay = State->Early.Delay; - const DelayLineI main_delay = State->Delay; - ALsizei feedb_tap[NUM_LINES][2]; - ALfloat feedb_oldCoeff[NUM_LINES]; - ALfloat feedb_oldCoeffStep[NUM_LINES]; - ALfloat feedb_newCoeffStep[NUM_LINES]; - const ALfloat mixX = State->MixX; - const ALfloat mixY = State->MixY; - ALsizei late_feed_tap; - ALfloat fadeCount; - ALsizei i, j; - - ASSUME(todo > 0); - - for(j = 0;j < NUM_LINES;j++) - { - ALsizei early_delay_tap0 = offset - State->EarlyDelayTap[j][0]; - ALsizei early_delay_tap1 = offset - State->EarlyDelayTap[j][1]; - ALfloat oldCoeff = State->EarlyDelayCoeff[j][0]; - ALfloat oldCoeffStep = -oldCoeff / FADE_SAMPLES; - ALfloat newCoeffStep = State->EarlyDelayCoeff[j][1] / FADE_SAMPLES; - - fadeCount = fade * FADE_SAMPLES; - for(i = 0;i < todo;i++) - { - const ALfloat fade0 = oldCoeff + oldCoeffStep*fadeCount; - const ALfloat fade1 = newCoeffStep*fadeCount; - temps[j][i] = FadedDelayLineOut(&main_delay, - early_delay_tap0++, early_delay_tap1++, j, fade0, fade1 - ); - fadeCount += 1.0f; - } - } - - VectorAllpass_Faded(temps, offset, mixX, mixY, fade, todo, &State->Early.VecAp); - - for(j = 0;j < NUM_LINES;j++) - { - feedb_tap[j][0] = offset - State->Early.Offset[j][0]; - feedb_tap[j][1] = offset - State->Early.Offset[j][1]; - feedb_oldCoeff[j] = State->Early.Coeff[j][0]; - feedb_oldCoeffStep[j] = -feedb_oldCoeff[j] / FADE_SAMPLES; - feedb_newCoeffStep[j] = State->Early.Coeff[j][1] / FADE_SAMPLES; - } - late_feed_tap = offset - State->LateFeedTap; - fadeCount = fade * FADE_SAMPLES; - for(i = 0;i < todo;i++) - { - ALfloat f[NUM_LINES]; - - for(j = 0;j < NUM_LINES;j++) - f[j] = temps[j][i]; - - DelayLineIn4Rev(&early_delay, offset, f); - for(j = 0;j < NUM_LINES;j++) - { - const ALfloat fade0 = feedb_oldCoeff[j] + feedb_oldCoeffStep[j]*fadeCount; - const ALfloat fade1 = feedb_newCoeffStep[j]*fadeCount; - f[j] += FadedDelayLineOut(&early_delay, - feedb_tap[j][0]++, feedb_tap[j][1]++, j, fade0, fade1 - ); - out[j][i] = f[j]; - } - fadeCount += 1.0f; - - VectorScatterRevDelayIn(&main_delay, late_feed_tap++, f, mixX, mixY); - offset++; - } -} - -/* Applies the two T60 damping filter sections. */ -static inline void LateT60Filter(ALfloat *restrict samples, const ALsizei todo, T60Filter *filter) -{ - ALfloat temp[MAX_UPDATE_SAMPLES]; - BiquadFilter_process(&filter->HFFilter, temp, samples, todo); - BiquadFilter_process(&filter->LFFilter, samples, temp, todo); -} - -/* This generates the reverb tail using a modified feed-back delay network - * (FDN). - * - * Results from the early reflections are mixed with the output from the late - * delay lines. - * - * The late response is then completed by T60 and all-pass filtering the mix. - * - * Finally, the lines are reversed (so they feed their opposite directions) - * and scattered with the FDN matrix before re-feeding the delay lines. - * - * Two variations are made, one for for transitional (cross-faded) delay line - * processing and one for non-transitional processing. - */ -static void LateReverb_Unfaded(ALreverbState *State, ALsizei offset, const ALsizei todo, - ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) -{ - ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; - const DelayLineI late_delay = State->Late.Delay; - const DelayLineI main_delay = State->Delay; - const ALfloat mixX = State->MixX; - const ALfloat mixY = State->MixY; - ALsizei i, j; - - ASSUME(todo > 0); - - /* First, load decorrelated samples from the main and feedback delay lines. - * Filter the signal to apply its frequency-dependent decay. - */ - for(j = 0;j < NUM_LINES;j++) - { - ALsizei late_delay_tap = offset - State->LateDelayTap[j][0]; - ALsizei late_feedb_tap = offset - State->Late.Offset[j][0]; - ALfloat midGain = State->Late.T60[j].MidGain[0]; - const ALfloat densityGain = State->Late.DensityGain[0] * midGain; - for(i = 0;i < todo;i++) - temps[j][i] = DelayLineOut(&main_delay, late_delay_tap++, j)*densityGain + - DelayLineOut(&late_delay, late_feedb_tap++, j)*midGain; - LateT60Filter(temps[j], todo, &State->Late.T60[j]); - } - - /* Apply a vector all-pass to improve micro-surface diffusion, and write - * out the results for mixing. - */ - VectorAllpass_Unfaded(temps, offset, mixX, mixY, todo, &State->Late.VecAp); - - for(j = 0;j < NUM_LINES;j++) - memcpy(out[j], temps[j], todo*sizeof(ALfloat)); - - for(i = 0;i < todo;i++) - { - ALfloat f[NUM_LINES]; - for(j = 0;j < NUM_LINES;j++) - f[j] = temps[j][i]; - - /* Finally, scatter and bounce the results to refeed the feedback - * buffer. - */ - VectorScatterRevDelayIn(&late_delay, offset, f, mixX, mixY); - offset++; - } -} -static void LateReverb_Faded(ALreverbState *State, ALsizei offset, const ALsizei todo, - const ALfloat fade, ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) -{ - ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; - const DelayLineI late_delay = State->Late.Delay; - const DelayLineI main_delay = State->Delay; - const ALfloat mixX = State->MixX; - const ALfloat mixY = State->MixY; - ALsizei i, j; - - ASSUME(todo > 0); - - for(j = 0;j < NUM_LINES;j++) - { - const ALfloat oldMidGain = State->Late.T60[j].MidGain[0]; - const ALfloat midGain = State->Late.T60[j].MidGain[1]; - const ALfloat oldMidStep = -oldMidGain / FADE_SAMPLES; - const ALfloat midStep = midGain / FADE_SAMPLES; - const ALfloat oldDensityGain = State->Late.DensityGain[0] * oldMidGain; - const ALfloat densityGain = State->Late.DensityGain[1] * midGain; - const ALfloat oldDensityStep = -oldDensityGain / FADE_SAMPLES; - const ALfloat densityStep = densityGain / FADE_SAMPLES; - ALsizei late_delay_tap0 = offset - State->LateDelayTap[j][0]; - ALsizei late_delay_tap1 = offset - State->LateDelayTap[j][1]; - ALsizei late_feedb_tap0 = offset - State->Late.Offset[j][0]; - ALsizei late_feedb_tap1 = offset - State->Late.Offset[j][1]; - ALfloat fadeCount = fade * FADE_SAMPLES; - for(i = 0;i < todo;i++) - { - const ALfloat fade0 = oldDensityGain + oldDensityStep*fadeCount; - const ALfloat fade1 = densityStep*fadeCount; - const ALfloat gfade0 = oldMidGain + oldMidStep*fadeCount; - const ALfloat gfade1 = midStep*fadeCount; - temps[j][i] = - FadedDelayLineOut(&main_delay, late_delay_tap0++, late_delay_tap1++, j, - fade0, fade1) + - FadedDelayLineOut(&late_delay, late_feedb_tap0++, late_feedb_tap1++, j, - gfade0, gfade1); - fadeCount += 1.0f; - } - LateT60Filter(temps[j], todo, &State->Late.T60[j]); - } - - VectorAllpass_Faded(temps, offset, mixX, mixY, fade, todo, &State->Late.VecAp); - - for(j = 0;j < NUM_LINES;j++) - memcpy(out[j], temps[j], todo*sizeof(ALfloat)); - - for(i = 0;i < todo;i++) - { - ALfloat f[NUM_LINES]; - for(j = 0;j < NUM_LINES;j++) - f[j] = temps[j][i]; - - VectorScatterRevDelayIn(&late_delay, offset, f, mixX, mixY); - offset++; - } -} - -static ALvoid ALreverbState_process(ALreverbState *State, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ALfloat (*restrict afmt)[MAX_UPDATE_SAMPLES] = State->TempSamples; - ALfloat (*restrict samples)[MAX_UPDATE_SAMPLES] = State->MixSamples; - ALsizei fadeCount = State->FadeCount; - ALsizei offset = State->Offset; - ALsizei base, c; - - /* Process reverb for these samples. */ - for(base = 0;base < SamplesToDo;) - { - ALsizei todo = SamplesToDo - base; - /* If cross-fading, don't do more samples than there are to fade. */ - if(FADE_SAMPLES-fadeCount > 0) - { - todo = mini(todo, FADE_SAMPLES-fadeCount); - todo = mini(todo, State->MaxUpdate[0]); - } - todo = mini(todo, State->MaxUpdate[1]); - - /* Convert B-Format to A-Format for processing. */ - memset(afmt, 0, sizeof(*afmt)*NUM_LINES); - for(c = 0;c < NUM_LINES;c++) - MixRowSamples(afmt[c], B2A.m[c], - SamplesIn, MAX_EFFECT_CHANNELS, base, todo - ); - - /* Process the samples for reverb. */ - for(c = 0;c < NUM_LINES;c++) - { - /* Band-pass the incoming samples. */ - BiquadFilter_process(&State->Filter[c].Lp, samples[0], afmt[c], todo); - BiquadFilter_process(&State->Filter[c].Hp, samples[1], samples[0], todo); - - /* Feed the initial delay line. */ - DelayLineIn(&State->Delay, offset, c, samples[1], todo); - } - - if(UNLIKELY(fadeCount < FADE_SAMPLES)) - { - ALfloat fade = (ALfloat)fadeCount / FADE_SAMPLES; - - /* Generate early reflections. */ - EarlyReflection_Faded(State, offset, todo, fade, samples); - /* Mix the A-Format results to output, implicitly converting back - * to B-Format. - */ - for(c = 0;c < NUM_LINES;c++) - MixSamples(samples[c], NumChannels, SamplesOut, - State->Early.CurrentGain[c], State->Early.PanGain[c], - SamplesToDo-base, base, todo - ); - - /* Generate and mix late reverb. */ - LateReverb_Faded(State, offset, todo, fade, samples); - for(c = 0;c < NUM_LINES;c++) - MixSamples(samples[c], NumChannels, SamplesOut, - State->Late.CurrentGain[c], State->Late.PanGain[c], - SamplesToDo-base, base, todo - ); - - /* Step fading forward. */ - fadeCount += todo; - if(LIKELY(fadeCount >= FADE_SAMPLES)) - { - /* Update the cross-fading delay line taps. */ - fadeCount = FADE_SAMPLES; - for(c = 0;c < NUM_LINES;c++) - { - State->EarlyDelayTap[c][0] = State->EarlyDelayTap[c][1]; - State->EarlyDelayCoeff[c][0] = State->EarlyDelayCoeff[c][1]; - State->Early.VecAp.Offset[c][0] = State->Early.VecAp.Offset[c][1]; - State->Early.Offset[c][0] = State->Early.Offset[c][1]; - State->Early.Coeff[c][0] = State->Early.Coeff[c][1]; - State->LateDelayTap[c][0] = State->LateDelayTap[c][1]; - State->Late.VecAp.Offset[c][0] = State->Late.VecAp.Offset[c][1]; - State->Late.Offset[c][0] = State->Late.Offset[c][1]; - State->Late.T60[c].MidGain[0] = State->Late.T60[c].MidGain[1]; - } - State->Late.DensityGain[0] = State->Late.DensityGain[1]; - State->MaxUpdate[0] = State->MaxUpdate[1]; - } - } - else - { - /* Generate and mix early reflections. */ - EarlyReflection_Unfaded(State, offset, todo, samples); - for(c = 0;c < NUM_LINES;c++) - MixSamples(samples[c], NumChannels, SamplesOut, - State->Early.CurrentGain[c], State->Early.PanGain[c], - SamplesToDo-base, base, todo - ); - - /* Generate and mix late reverb. */ - LateReverb_Unfaded(State, offset, todo, samples); - for(c = 0;c < NUM_LINES;c++) - MixSamples(samples[c], NumChannels, SamplesOut, - State->Late.CurrentGain[c], State->Late.PanGain[c], - SamplesToDo-base, base, todo - ); - } - - /* Step all delays forward. */ - offset += todo; - - base += todo; - } - State->Offset = offset; - State->FadeCount = fadeCount; -} - - -typedef struct ReverbStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} ReverbStateFactory; - -static ALeffectState *ReverbStateFactory_create(ReverbStateFactory* UNUSED(factory)) -{ - ALreverbState *state; - - NEW_OBJ0(state, ALreverbState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(ReverbStateFactory); - -EffectStateFactory *ReverbStateFactory_getFactory(void) -{ - static ReverbStateFactory ReverbFactory = { { GET_VTABLE2(ReverbStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &ReverbFactory); -} - - -void ALeaxreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DECAY_HFLIMIT: - if(!(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay hflimit out of range"); - props->Reverb.DecayHFLimit = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb integer property 0x%04x", - param); - } -} -void ALeaxreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ ALeaxreverb_setParami(effect, context, param, vals[0]); } -void ALeaxreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DENSITY: - if(!(val >= AL_EAXREVERB_MIN_DENSITY && val <= AL_EAXREVERB_MAX_DENSITY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb density out of range"); - props->Reverb.Density = val; - break; - - case AL_EAXREVERB_DIFFUSION: - if(!(val >= AL_EAXREVERB_MIN_DIFFUSION && val <= AL_EAXREVERB_MAX_DIFFUSION)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb diffusion out of range"); - props->Reverb.Diffusion = val; - break; - - case AL_EAXREVERB_GAIN: - if(!(val >= AL_EAXREVERB_MIN_GAIN && val <= AL_EAXREVERB_MAX_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gain out of range"); - props->Reverb.Gain = val; - break; - - case AL_EAXREVERB_GAINHF: - if(!(val >= AL_EAXREVERB_MIN_GAINHF && val <= AL_EAXREVERB_MAX_GAINHF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gainhf out of range"); - props->Reverb.GainHF = val; - break; - - case AL_EAXREVERB_GAINLF: - if(!(val >= AL_EAXREVERB_MIN_GAINLF && val <= AL_EAXREVERB_MAX_GAINLF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gainlf out of range"); - props->Reverb.GainLF = val; - break; - - case AL_EAXREVERB_DECAY_TIME: - if(!(val >= AL_EAXREVERB_MIN_DECAY_TIME && val <= AL_EAXREVERB_MAX_DECAY_TIME)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay time out of range"); - props->Reverb.DecayTime = val; - break; - - case AL_EAXREVERB_DECAY_HFRATIO: - if(!(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO && val <= AL_EAXREVERB_MAX_DECAY_HFRATIO)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay hfratio out of range"); - props->Reverb.DecayHFRatio = val; - break; - - case AL_EAXREVERB_DECAY_LFRATIO: - if(!(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO && val <= AL_EAXREVERB_MAX_DECAY_LFRATIO)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay lfratio out of range"); - props->Reverb.DecayLFRatio = val; - break; - - case AL_EAXREVERB_REFLECTIONS_GAIN: - if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN && val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections gain out of range"); - props->Reverb.ReflectionsGain = val; - break; - - case AL_EAXREVERB_REFLECTIONS_DELAY: - if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY && val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections delay out of range"); - props->Reverb.ReflectionsDelay = val; - break; - - case AL_EAXREVERB_LATE_REVERB_GAIN: - if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN && val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb gain out of range"); - props->Reverb.LateReverbGain = val; - break; - - case AL_EAXREVERB_LATE_REVERB_DELAY: - if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY && val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb delay out of range"); - props->Reverb.LateReverbDelay = val; - break; - - case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: - if(!(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb air absorption gainhf out of range"); - props->Reverb.AirAbsorptionGainHF = val; - break; - - case AL_EAXREVERB_ECHO_TIME: - if(!(val >= AL_EAXREVERB_MIN_ECHO_TIME && val <= AL_EAXREVERB_MAX_ECHO_TIME)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb echo time out of range"); - props->Reverb.EchoTime = val; - break; - - case AL_EAXREVERB_ECHO_DEPTH: - if(!(val >= AL_EAXREVERB_MIN_ECHO_DEPTH && val <= AL_EAXREVERB_MAX_ECHO_DEPTH)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb echo depth out of range"); - props->Reverb.EchoDepth = val; - break; - - case AL_EAXREVERB_MODULATION_TIME: - if(!(val >= AL_EAXREVERB_MIN_MODULATION_TIME && val <= AL_EAXREVERB_MAX_MODULATION_TIME)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb modulation time out of range"); - props->Reverb.ModulationTime = val; - break; - - case AL_EAXREVERB_MODULATION_DEPTH: - if(!(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH && val <= AL_EAXREVERB_MAX_MODULATION_DEPTH)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb modulation depth out of range"); - props->Reverb.ModulationDepth = val; - break; - - case AL_EAXREVERB_HFREFERENCE: - if(!(val >= AL_EAXREVERB_MIN_HFREFERENCE && val <= AL_EAXREVERB_MAX_HFREFERENCE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb hfreference out of range"); - props->Reverb.HFReference = val; - break; - - case AL_EAXREVERB_LFREFERENCE: - if(!(val >= AL_EAXREVERB_MIN_LFREFERENCE && val <= AL_EAXREVERB_MAX_LFREFERENCE)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb lfreference out of range"); - props->Reverb.LFReference = val; - break; - - case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: - if(!(val >= AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb room rolloff factor out of range"); - props->Reverb.RoomRolloffFactor = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", - param); - } -} -void ALeaxreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_REFLECTIONS_PAN: - if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections pan out of range"); - props->Reverb.ReflectionsPan[0] = vals[0]; - props->Reverb.ReflectionsPan[1] = vals[1]; - props->Reverb.ReflectionsPan[2] = vals[2]; - break; - case AL_EAXREVERB_LATE_REVERB_PAN: - if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))) - SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb pan out of range"); - props->Reverb.LateReverbPan[0] = vals[0]; - props->Reverb.LateReverbPan[1] = vals[1]; - props->Reverb.LateReverbPan[2] = vals[2]; - break; - - default: - ALeaxreverb_setParamf(effect, context, param, vals[0]); - break; - } -} - -void ALeaxreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DECAY_HFLIMIT: - *val = props->Reverb.DecayHFLimit; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb integer property 0x%04x", - param); - } -} -void ALeaxreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ ALeaxreverb_getParami(effect, context, param, vals); } -void ALeaxreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DENSITY: - *val = props->Reverb.Density; - break; - - case AL_EAXREVERB_DIFFUSION: - *val = props->Reverb.Diffusion; - break; - - case AL_EAXREVERB_GAIN: - *val = props->Reverb.Gain; - break; - - case AL_EAXREVERB_GAINHF: - *val = props->Reverb.GainHF; - break; - - case AL_EAXREVERB_GAINLF: - *val = props->Reverb.GainLF; - break; - - case AL_EAXREVERB_DECAY_TIME: - *val = props->Reverb.DecayTime; - break; - - case AL_EAXREVERB_DECAY_HFRATIO: - *val = props->Reverb.DecayHFRatio; - break; - - case AL_EAXREVERB_DECAY_LFRATIO: - *val = props->Reverb.DecayLFRatio; - break; - - case AL_EAXREVERB_REFLECTIONS_GAIN: - *val = props->Reverb.ReflectionsGain; - break; - - case AL_EAXREVERB_REFLECTIONS_DELAY: - *val = props->Reverb.ReflectionsDelay; - break; - - case AL_EAXREVERB_LATE_REVERB_GAIN: - *val = props->Reverb.LateReverbGain; - break; - - case AL_EAXREVERB_LATE_REVERB_DELAY: - *val = props->Reverb.LateReverbDelay; - break; - - case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: - *val = props->Reverb.AirAbsorptionGainHF; - break; - - case AL_EAXREVERB_ECHO_TIME: - *val = props->Reverb.EchoTime; - break; - - case AL_EAXREVERB_ECHO_DEPTH: - *val = props->Reverb.EchoDepth; - break; - - case AL_EAXREVERB_MODULATION_TIME: - *val = props->Reverb.ModulationTime; - break; - - case AL_EAXREVERB_MODULATION_DEPTH: - *val = props->Reverb.ModulationDepth; - break; - - case AL_EAXREVERB_HFREFERENCE: - *val = props->Reverb.HFReference; - break; - - case AL_EAXREVERB_LFREFERENCE: - *val = props->Reverb.LFReference; - break; - - case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: - *val = props->Reverb.RoomRolloffFactor; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", - param); - } -} -void ALeaxreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_REFLECTIONS_PAN: - vals[0] = props->Reverb.ReflectionsPan[0]; - vals[1] = props->Reverb.ReflectionsPan[1]; - vals[2] = props->Reverb.ReflectionsPan[2]; - break; - case AL_EAXREVERB_LATE_REVERB_PAN: - vals[0] = props->Reverb.LateReverbPan[0]; - vals[1] = props->Reverb.LateReverbPan[1]; - vals[2] = props->Reverb.LateReverbPan[2]; - break; - - default: - ALeaxreverb_getParamf(effect, context, param, vals); - break; - } -} - -DEFINE_ALEFFECT_VTABLE(ALeaxreverb); - -void ALreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DECAY_HFLIMIT: - if(!(val >= AL_REVERB_MIN_DECAY_HFLIMIT && val <= AL_REVERB_MAX_DECAY_HFLIMIT)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay hflimit out of range"); - props->Reverb.DecayHFLimit = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid reverb integer property 0x%04x", param); - } -} -void ALreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ ALreverb_setParami(effect, context, param, vals[0]); } -void ALreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DENSITY: - if(!(val >= AL_REVERB_MIN_DENSITY && val <= AL_REVERB_MAX_DENSITY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb density out of range"); - props->Reverb.Density = val; - break; - - case AL_REVERB_DIFFUSION: - if(!(val >= AL_REVERB_MIN_DIFFUSION && val <= AL_REVERB_MAX_DIFFUSION)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb diffusion out of range"); - props->Reverb.Diffusion = val; - break; - - case AL_REVERB_GAIN: - if(!(val >= AL_REVERB_MIN_GAIN && val <= AL_REVERB_MAX_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb gain out of range"); - props->Reverb.Gain = val; - break; - - case AL_REVERB_GAINHF: - if(!(val >= AL_REVERB_MIN_GAINHF && val <= AL_REVERB_MAX_GAINHF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb gainhf out of range"); - props->Reverb.GainHF = val; - break; - - case AL_REVERB_DECAY_TIME: - if(!(val >= AL_REVERB_MIN_DECAY_TIME && val <= AL_REVERB_MAX_DECAY_TIME)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay time out of range"); - props->Reverb.DecayTime = val; - break; - - case AL_REVERB_DECAY_HFRATIO: - if(!(val >= AL_REVERB_MIN_DECAY_HFRATIO && val <= AL_REVERB_MAX_DECAY_HFRATIO)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay hfratio out of range"); - props->Reverb.DecayHFRatio = val; - break; - - case AL_REVERB_REFLECTIONS_GAIN: - if(!(val >= AL_REVERB_MIN_REFLECTIONS_GAIN && val <= AL_REVERB_MAX_REFLECTIONS_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb reflections gain out of range"); - props->Reverb.ReflectionsGain = val; - break; - - case AL_REVERB_REFLECTIONS_DELAY: - if(!(val >= AL_REVERB_MIN_REFLECTIONS_DELAY && val <= AL_REVERB_MAX_REFLECTIONS_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb reflections delay out of range"); - props->Reverb.ReflectionsDelay = val; - break; - - case AL_REVERB_LATE_REVERB_GAIN: - if(!(val >= AL_REVERB_MIN_LATE_REVERB_GAIN && val <= AL_REVERB_MAX_LATE_REVERB_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb late reverb gain out of range"); - props->Reverb.LateReverbGain = val; - break; - - case AL_REVERB_LATE_REVERB_DELAY: - if(!(val >= AL_REVERB_MIN_LATE_REVERB_DELAY && val <= AL_REVERB_MAX_LATE_REVERB_DELAY)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb late reverb delay out of range"); - props->Reverb.LateReverbDelay = val; - break; - - case AL_REVERB_AIR_ABSORPTION_GAINHF: - if(!(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb air absorption gainhf out of range"); - props->Reverb.AirAbsorptionGainHF = val; - break; - - case AL_REVERB_ROOM_ROLLOFF_FACTOR: - if(!(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb room rolloff factor out of range"); - props->Reverb.RoomRolloffFactor = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid reverb float property 0x%04x", param); - } -} -void ALreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALreverb_setParamf(effect, context, param, vals[0]); } - -void ALreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DECAY_HFLIMIT: - *val = props->Reverb.DecayHFLimit; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid reverb integer property 0x%04x", param); - } -} -void ALreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ ALreverb_getParami(effect, context, param, vals); } -void ALreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DENSITY: - *val = props->Reverb.Density; - break; - - case AL_REVERB_DIFFUSION: - *val = props->Reverb.Diffusion; - break; - - case AL_REVERB_GAIN: - *val = props->Reverb.Gain; - break; - - case AL_REVERB_GAINHF: - *val = props->Reverb.GainHF; - break; - - case AL_REVERB_DECAY_TIME: - *val = props->Reverb.DecayTime; - break; - - case AL_REVERB_DECAY_HFRATIO: - *val = props->Reverb.DecayHFRatio; - break; - - case AL_REVERB_REFLECTIONS_GAIN: - *val = props->Reverb.ReflectionsGain; - break; - - case AL_REVERB_REFLECTIONS_DELAY: - *val = props->Reverb.ReflectionsDelay; - break; - - case AL_REVERB_LATE_REVERB_GAIN: - *val = props->Reverb.LateReverbGain; - break; - - case AL_REVERB_LATE_REVERB_DELAY: - *val = props->Reverb.LateReverbDelay; - break; - - case AL_REVERB_AIR_ABSORPTION_GAINHF: - *val = props->Reverb.AirAbsorptionGainHF; - break; - - case AL_REVERB_ROOM_ROLLOFF_FACTOR: - *val = props->Reverb.RoomRolloffFactor; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid reverb float property 0x%04x", param); - } -} -void ALreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALreverb_getParamf(effect, context, param, vals); } - -DEFINE_ALEFFECT_VTABLE(ALreverb); diff --git a/Alc/filters/defs.h b/Alc/filters/defs.h deleted file mode 100644 index 133a85e..0000000 --- a/Alc/filters/defs.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef ALC_FILTER_H -#define ALC_FILTER_H - -#include "AL/al.h" -#include "math_defs.h" - -/* Filters implementation is based on the "Cookbook formulae for audio - * EQ biquad filter coefficients" by Robert Bristow-Johnson - * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt - */ -/* Implementation note: For the shelf filters, the specified gain is for the - * reference frequency, which is the centerpoint of the transition band. This - * better matches EFX filter design. To set the gain for the shelf itself, use - * the square root of the desired linear gain (or halve the dB gain). - */ - -typedef enum BiquadType { - /** EFX-style low-pass filter, specifying a gain and reference frequency. */ - BiquadType_HighShelf, - /** EFX-style high-pass filter, specifying a gain and reference frequency. */ - BiquadType_LowShelf, - /** Peaking filter, specifying a gain and reference frequency. */ - BiquadType_Peaking, - - /** Low-pass cut-off filter, specifying a cut-off frequency. */ - BiquadType_LowPass, - /** High-pass cut-off filter, specifying a cut-off frequency. */ - BiquadType_HighPass, - /** Band-pass filter, specifying a center frequency. */ - BiquadType_BandPass, -} BiquadType; - -typedef struct BiquadFilter { - ALfloat z1, z2; /* Last two delayed components for direct form II. */ - ALfloat b0, b1, b2; /* Transfer function coefficients "b" (numerator) */ - ALfloat a1, a2; /* Transfer function coefficients "a" (denominator; a0 is - * pre-applied). */ -} BiquadFilter; -/* Currently only a C-based filter process method is implemented. */ -#define BiquadFilter_process BiquadFilter_processC - -/** - * Calculates the rcpQ (i.e. 1/Q) coefficient for shelving filters, using the - * reference gain and shelf slope parameter. - * \param gain 0 < gain - * \param slope 0 < slope <= 1 - */ -inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope) -{ - return sqrtf((gain + 1.0f/gain)*(1.0f/slope - 1.0f) + 2.0f); -} -/** - * Calculates the rcpQ (i.e. 1/Q) coefficient for filters, using the normalized - * reference frequency and bandwidth. - * \param f0norm 0 < f0norm < 0.5. - * \param bandwidth 0 < bandwidth - */ -inline ALfloat calc_rcpQ_from_bandwidth(ALfloat f0norm, ALfloat bandwidth) -{ - ALfloat w0 = F_TAU * f0norm; - return 2.0f*sinhf(logf(2.0f)/2.0f*bandwidth*w0/sinf(w0)); -} - -inline void BiquadFilter_clear(BiquadFilter *filter) -{ - filter->z1 = 0.0f; - filter->z2 = 0.0f; -} - -/** - * Sets up the filter state for the specified filter type and its parameters. - * - * \param filter The filter object to prepare. - * \param type The type of filter for the object to apply. - * \param gain The gain for the reference frequency response. Only used by the - * Shelf and Peaking filter types. - * \param f0norm The normalized reference frequency (ref_freq / sample_rate). - * This is the center point for the Shelf, Peaking, and BandPass - * filter types, or the cutoff frequency for the LowPass and - * HighPass filter types. - * \param rcpQ The reciprocal of the Q coefficient for the filter's transition - * band. Can be generated from calc_rcpQ_from_slope or - * calc_rcpQ_from_bandwidth depending on the available data. - */ -void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, ALfloat f0norm, ALfloat rcpQ); - -inline void BiquadFilter_copyParams(BiquadFilter *restrict dst, const BiquadFilter *restrict src) -{ - dst->b0 = src->b0; - dst->b1 = src->b1; - dst->b2 = src->b2; - dst->a1 = src->a1; - dst->a2 = src->a2; -} - -void BiquadFilter_processC(BiquadFilter *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples); - -inline void BiquadFilter_passthru(BiquadFilter *filter, ALsizei numsamples) -{ - if(LIKELY(numsamples >= 2)) - { - filter->z1 = 0.0f; - filter->z2 = 0.0f; - } - else if(numsamples == 1) - { - filter->z1 = filter->z2; - filter->z2 = 0.0f; - } -} - -#endif /* ALC_FILTER_H */ diff --git a/Alc/filters/nfc.c b/Alc/filters/nfc.c deleted file mode 100644 index 8869d1d..0000000 --- a/Alc/filters/nfc.c +++ /dev/null @@ -1,426 +0,0 @@ - -#include "config.h" - -#include "nfc.h" -#include "alMain.h" - -#include - - -/* Near-field control filters are the basis for handling the near-field effect. - * The near-field effect is a bass-boost present in the directional components - * of a recorded signal, created as a result of the wavefront curvature (itself - * a function of sound distance). Proper reproduction dictates this be - * compensated for using a bass-cut given the playback speaker distance, to - * avoid excessive bass in the playback. - * - * For real-time rendered audio, emulating the near-field effect based on the - * sound source's distance, and subsequently compensating for it at output - * based on the speaker distances, can create a more realistic perception of - * sound distance beyond a simple 1/r attenuation. - * - * These filters do just that. Each one applies a low-shelf filter, created as - * the combination of a bass-boost for a given sound source distance (near- - * field emulation) along with a bass-cut for a given control/speaker distance - * (near-field compensation). - * - * Note that it is necessary to apply a cut along with the boost, since the - * boost alone is unstable in higher-order ambisonics as it causes an infinite - * DC gain (even first-order ambisonics requires there to be no DC offset for - * the boost to work). Consequently, ambisonics requires a control parameter to - * be used to avoid an unstable boost-only filter. NFC-HOA defines this control - * as a reference delay, calculated with: - * - * reference_delay = control_distance / speed_of_sound - * - * This means w0 (for input) or w1 (for output) should be set to: - * - * wN = 1 / (reference_delay * sample_rate) - * - * when dealing with NFC-HOA content. For FOA input content, which does not - * specify a reference_delay variable, w0 should be set to 0 to apply only - * near-field compensation for output. It's important that w1 be a finite, - * positive, non-0 value or else the bass-boost will become unstable again. - * Also, w0 should not be too large compared to w1, to avoid excessively loud - * low frequencies. - */ - -static const float B[4][3] = { - { 0.0f }, - { 1.0f }, - { 3.0f, 3.0f }, - { 3.6778f, 6.4595f, 2.3222f }, - /*{ 4.2076f, 11.4877f, 5.7924f, 9.1401f }*/ -}; - -static void NfcFilterCreate1(struct NfcFilter1 *nfc, const float w0, const float w1) -{ - float b_00, g_0; - float r; - - nfc->base_gain = 1.0f; - nfc->gain = 1.0f; - - /* Calculate bass-boost coefficients. */ - r = 0.5f * w0; - b_00 = B[1][0] * r; - g_0 = 1.0f + b_00; - - nfc->gain *= g_0; - nfc->b1 = 2.0f * b_00 / g_0; - - /* Calculate bass-cut coefficients. */ - r = 0.5f * w1; - b_00 = B[1][0] * r; - g_0 = 1.0f + b_00; - - nfc->base_gain /= g_0; - nfc->gain /= g_0; - nfc->a1 = 2.0f * b_00 / g_0; -} - -static void NfcFilterAdjust1(struct NfcFilter1 *nfc, const float w0) -{ - float b_00, g_0; - float r; - - r = 0.5f * w0; - b_00 = B[1][0] * r; - g_0 = 1.0f + b_00; - - nfc->gain = nfc->base_gain * g_0; - nfc->b1 = 2.0f * b_00 / g_0; -} - - -static void NfcFilterCreate2(struct NfcFilter2 *nfc, const float w0, const float w1) -{ - float b_10, b_11, g_1; - float r; - - nfc->base_gain = 1.0f; - nfc->gain = 1.0f; - - /* Calculate bass-boost coefficients. */ - r = 0.5f * w0; - b_10 = B[2][0] * r; - b_11 = B[2][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->gain *= g_1; - nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; - nfc->b2 = 4.0f * b_11 / g_1; - - /* Calculate bass-cut coefficients. */ - r = 0.5f * w1; - b_10 = B[2][0] * r; - b_11 = B[2][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->base_gain /= g_1; - nfc->gain /= g_1; - nfc->a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; - nfc->a2 = 4.0f * b_11 / g_1; -} - -static void NfcFilterAdjust2(struct NfcFilter2 *nfc, const float w0) -{ - float b_10, b_11, g_1; - float r; - - r = 0.5f * w0; - b_10 = B[2][0] * r; - b_11 = B[2][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->gain = nfc->base_gain * g_1; - nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; - nfc->b2 = 4.0f * b_11 / g_1; -} - - -static void NfcFilterCreate3(struct NfcFilter3 *nfc, const float w0, const float w1) -{ - float b_10, b_11, g_1; - float b_00, g_0; - float r; - - nfc->base_gain = 1.0f; - nfc->gain = 1.0f; - - /* Calculate bass-boost coefficients. */ - r = 0.5f * w0; - b_10 = B[3][0] * r; - b_11 = B[3][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->gain *= g_1; - nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; - nfc->b2 = 4.0f * b_11 / g_1; - - b_00 = B[3][2] * r; - g_0 = 1.0f + b_00; - - nfc->gain *= g_0; - nfc->b3 = 2.0f * b_00 / g_0; - - /* Calculate bass-cut coefficients. */ - r = 0.5f * w1; - b_10 = B[3][0] * r; - b_11 = B[3][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->base_gain /= g_1; - nfc->gain /= g_1; - nfc->a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; - nfc->a2 = 4.0f * b_11 / g_1; - - b_00 = B[3][2] * r; - g_0 = 1.0f + b_00; - - nfc->base_gain /= g_0; - nfc->gain /= g_0; - nfc->a3 = 2.0f * b_00 / g_0; -} - -static void NfcFilterAdjust3(struct NfcFilter3 *nfc, const float w0) -{ - float b_10, b_11, g_1; - float b_00, g_0; - float r; - - r = 0.5f * w0; - b_10 = B[3][0] * r; - b_11 = B[3][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->gain = nfc->base_gain * g_1; - nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; - nfc->b2 = 4.0f * b_11 / g_1; - - b_00 = B[3][2] * r; - g_0 = 1.0f + b_00; - - nfc->gain *= g_0; - nfc->b3 = 2.0f * b_00 / g_0; -} - - -void NfcFilterCreate(NfcFilter *nfc, const float w0, const float w1) -{ - memset(nfc, 0, sizeof(*nfc)); - NfcFilterCreate1(&nfc->first, w0, w1); - NfcFilterCreate2(&nfc->second, w0, w1); - NfcFilterCreate3(&nfc->third, w0, w1); -} - -void NfcFilterAdjust(NfcFilter *nfc, const float w0) -{ - NfcFilterAdjust1(&nfc->first, w0); - NfcFilterAdjust2(&nfc->second, w0); - NfcFilterAdjust3(&nfc->third, w0); -} - - -void NfcFilterProcess1(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count) -{ - const float gain = nfc->first.gain; - const float b1 = nfc->first.b1; - const float a1 = nfc->first.a1; - float z1 = nfc->first.z[0]; - int i; - - ASSUME(count > 0); - - for(i = 0;i < count;i++) - { - float y = src[i]*gain - a1*z1; - float out = y + b1*z1; - z1 += y; - - dst[i] = out; - } - nfc->first.z[0] = z1; -} - -void NfcFilterProcess2(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count) -{ - const float gain = nfc->second.gain; - const float b1 = nfc->second.b1; - const float b2 = nfc->second.b2; - const float a1 = nfc->second.a1; - const float a2 = nfc->second.a2; - float z1 = nfc->second.z[0]; - float z2 = nfc->second.z[1]; - int i; - - ASSUME(count > 0); - - for(i = 0;i < count;i++) - { - float y = src[i]*gain - a1*z1 - a2*z2; - float out = y + b1*z1 + b2*z2; - z2 += z1; - z1 += y; - - dst[i] = out; - } - nfc->second.z[0] = z1; - nfc->second.z[1] = z2; -} - -void NfcFilterProcess3(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count) -{ - const float gain = nfc->third.gain; - const float b1 = nfc->third.b1; - const float b2 = nfc->third.b2; - const float b3 = nfc->third.b3; - const float a1 = nfc->third.a1; - const float a2 = nfc->third.a2; - const float a3 = nfc->third.a3; - float z1 = nfc->third.z[0]; - float z2 = nfc->third.z[1]; - float z3 = nfc->third.z[2]; - int i; - - ASSUME(count > 0); - - for(i = 0;i < count;i++) - { - float y = src[i]*gain - a1*z1 - a2*z2; - float out = y + b1*z1 + b2*z2; - z2 += z1; - z1 += y; - - y = out - a3*z3; - out = y + b3*z3; - z3 += y; - - dst[i] = out; - } - nfc->third.z[0] = z1; - nfc->third.z[1] = z2; - nfc->third.z[2] = z3; -} - -#if 0 /* Original methods the above are derived from. */ -static void NfcFilterCreate(NfcFilter *nfc, const ALsizei order, const float src_dist, const float ctl_dist, const float rate) -{ - static const float B[4][5] = { - { }, - { 1.0f }, - { 3.0f, 3.0f }, - { 3.6778f, 6.4595f, 2.3222f }, - { 4.2076f, 11.4877f, 5.7924f, 9.1401f } - }; - float w0 = SPEEDOFSOUNDMETRESPERSEC / (src_dist * rate); - float w1 = SPEEDOFSOUNDMETRESPERSEC / (ctl_dist * rate); - ALsizei i; - float r; - - nfc->g = 1.0f; - nfc->coeffs[0] = 1.0f; - - /* NOTE: Slight adjustment from the literature to raise the center - * frequency a bit (0.5 -> 1.0). - */ - r = 1.0f * w0; - for(i = 0; i < (order-1);i += 2) - { - float b_10 = B[order][i ] * r; - float b_11 = B[order][i+1] * r * r; - float g_1 = 1.0f + b_10 + b_11; - - nfc->b[i] = b_10; - nfc->b[i + 1] = b_11; - nfc->coeffs[0] *= g_1; - nfc->coeffs[i+1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[i+2] = (4.0f * b_11) / g_1; - } - if(i < order) - { - float b_00 = B[order][i] * r; - float g_0 = 1.0f + b_00; - - nfc->b[i] = b_00; - nfc->coeffs[0] *= g_0; - nfc->coeffs[i+1] = (2.0f * b_00) / g_0; - } - - r = 1.0f * w1; - for(i = 0;i < (order-1);i += 2) - { - float b_10 = B[order][i ] * r; - float b_11 = B[order][i+1] * r * r; - float g_1 = 1.0f + b_10 + b_11; - - nfc->g /= g_1; - nfc->coeffs[0] /= g_1; - nfc->coeffs[order+i+1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[order+i+2] = (4.0f * b_11) / g_1; - } - if(i < order) - { - float b_00 = B[order][i] * r; - float g_0 = 1.0f + b_00; - - nfc->g /= g_0; - nfc->coeffs[0] /= g_0; - nfc->coeffs[order+i+1] = (2.0f * b_00) / g_0; - } - - for(i = 0; i < MAX_AMBI_ORDER; i++) - nfc->history[i] = 0.0f; -} - -static void NfcFilterAdjust(NfcFilter *nfc, const float distance) -{ - int i; - - nfc->coeffs[0] = nfc->g; - - for(i = 0;i < (nfc->order-1);i += 2) - { - float b_10 = nfc->b[i] / distance; - float b_11 = nfc->b[i+1] / (distance * distance); - float g_1 = 1.0f + b_10 + b_11; - - nfc->coeffs[0] *= g_1; - nfc->coeffs[i+1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[i+2] = (4.0f * b_11) / g_1; - } - if(i < nfc->order) - { - float b_00 = nfc->b[i] / distance; - float g_0 = 1.0f + b_00; - - nfc->coeffs[0] *= g_0; - nfc->coeffs[i+1] = (2.0f * b_00) / g_0; - } -} - -static float NfcFilterProcess(const float in, NfcFilter *nfc) -{ - int i; - float out = in * nfc->coeffs[0]; - - for(i = 0;i < (nfc->order-1);i += 2) - { - float y = out - (nfc->coeffs[nfc->order+i+1] * nfc->history[i]) - - (nfc->coeffs[nfc->order+i+2] * nfc->history[i+1]) + 1.0e-30f; - out = y + (nfc->coeffs[i+1]*nfc->history[i]) + (nfc->coeffs[i+2]*nfc->history[i+1]); - - nfc->history[i+1] += nfc->history[i]; - nfc->history[i] += y; - } - if(i < nfc->order) - { - float y = out - (nfc->coeffs[nfc->order+i+1] * nfc->history[i]) + 1.0e-30f; - - out = y + (nfc->coeffs[i+1] * nfc->history[i]); - nfc->history[i] += y; - } - - return out; -} -#endif diff --git a/Alc/filters/nfc.h b/Alc/filters/nfc.h deleted file mode 100644 index 12a5a18..0000000 --- a/Alc/filters/nfc.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef FILTER_NFC_H -#define FILTER_NFC_H - -struct NfcFilter1 { - float base_gain, gain; - float b1, a1; - float z[1]; -}; -struct NfcFilter2 { - float base_gain, gain; - float b1, b2, a1, a2; - float z[2]; -}; -struct NfcFilter3 { - float base_gain, gain; - float b1, b2, b3, a1, a2, a3; - float z[3]; -}; - -typedef struct NfcFilter { - struct NfcFilter1 first; - struct NfcFilter2 second; - struct NfcFilter3 third; -} NfcFilter; - - -/* NOTE: - * w0 = speed_of_sound / (source_distance * sample_rate); - * w1 = speed_of_sound / (control_distance * sample_rate); - * - * Generally speaking, the control distance should be approximately the average - * speaker distance, or based on the reference delay if outputing NFC-HOA. It - * must not be negative, 0, or infinite. The source distance should not be too - * small relative to the control distance. - */ - -void NfcFilterCreate(NfcFilter *nfc, const float w0, const float w1); -void NfcFilterAdjust(NfcFilter *nfc, const float w0); - -/* Near-field control filter for first-order ambisonic channels (1-3). */ -void NfcFilterProcess1(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); - -/* Near-field control filter for second-order ambisonic channels (4-8). */ -void NfcFilterProcess2(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); - -/* Near-field control filter for third-order ambisonic channels (9-15). */ -void NfcFilterProcess3(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); - -#endif /* FILTER_NFC_H */ diff --git a/Alc/filters/splitter.c b/Alc/filters/splitter.c deleted file mode 100644 index e99f4b9..0000000 --- a/Alc/filters/splitter.c +++ /dev/null @@ -1,109 +0,0 @@ - -#include "config.h" - -#include "splitter.h" - -#include "math_defs.h" - - -void bandsplit_init(BandSplitter *splitter, ALfloat f0norm) -{ - ALfloat w = f0norm * F_TAU; - ALfloat cw = cosf(w); - if(cw > FLT_EPSILON) - splitter->coeff = (sinf(w) - 1.0f) / cw; - else - splitter->coeff = cw * -0.5f; - - splitter->lp_z1 = 0.0f; - splitter->lp_z2 = 0.0f; - splitter->hp_z1 = 0.0f; -} - -void bandsplit_clear(BandSplitter *splitter) -{ - splitter->lp_z1 = 0.0f; - splitter->lp_z2 = 0.0f; - splitter->hp_z1 = 0.0f; -} - -void bandsplit_process(BandSplitter *splitter, ALfloat *restrict hpout, ALfloat *restrict lpout, - const ALfloat *input, ALsizei count) -{ - ALfloat lp_coeff, hp_coeff, lp_y, hp_y, d; - ALfloat lp_z1, lp_z2, hp_z1; - ALsizei i; - - ASSUME(count > 0); - - hp_coeff = splitter->coeff; - lp_coeff = splitter->coeff*0.5f + 0.5f; - lp_z1 = splitter->lp_z1; - lp_z2 = splitter->lp_z2; - hp_z1 = splitter->hp_z1; - for(i = 0;i < count;i++) - { - ALfloat in = input[i]; - - /* Low-pass sample processing. */ - d = (in - lp_z1) * lp_coeff; - lp_y = lp_z1 + d; - lp_z1 = lp_y + d; - - d = (lp_y - lp_z2) * lp_coeff; - lp_y = lp_z2 + d; - lp_z2 = lp_y + d; - - lpout[i] = lp_y; - - /* All-pass sample processing. */ - hp_y = in*hp_coeff + hp_z1; - hp_z1 = in - hp_y*hp_coeff; - - /* High-pass generated from removing low-passed output. */ - hpout[i] = hp_y - lp_y; - } - splitter->lp_z1 = lp_z1; - splitter->lp_z2 = lp_z2; - splitter->hp_z1 = hp_z1; -} - - -void splitterap_init(SplitterAllpass *splitter, ALfloat f0norm) -{ - ALfloat w = f0norm * F_TAU; - ALfloat cw = cosf(w); - if(cw > FLT_EPSILON) - splitter->coeff = (sinf(w) - 1.0f) / cw; - else - splitter->coeff = cw * -0.5f; - - splitter->z1 = 0.0f; -} - -void splitterap_clear(SplitterAllpass *splitter) -{ - splitter->z1 = 0.0f; -} - -void splitterap_process(SplitterAllpass *splitter, ALfloat *restrict samples, ALsizei count) -{ - ALfloat coeff, in, out; - ALfloat z1; - ALsizei i; - - ASSUME(count > 0); - - coeff = splitter->coeff; - z1 = splitter->z1; - for(i = 0;i < count;i++) - { - in = samples[i]; - - out = in*coeff + z1; - z1 = in - out*coeff; - - samples[i] = out; - } - splitter->z1 = z1; -} diff --git a/Alc/filters/splitter.h b/Alc/filters/splitter.h deleted file mode 100644 index a788bc3..0000000 --- a/Alc/filters/splitter.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef FILTER_SPLITTER_H -#define FILTER_SPLITTER_H - -#include "alMain.h" - - -/* Band splitter. Splits a signal into two phase-matching frequency bands. */ -typedef struct BandSplitter { - ALfloat coeff; - ALfloat lp_z1; - ALfloat lp_z2; - ALfloat hp_z1; -} BandSplitter; - -void bandsplit_init(BandSplitter *splitter, ALfloat f0norm); -void bandsplit_clear(BandSplitter *splitter); -void bandsplit_process(BandSplitter *splitter, ALfloat *restrict hpout, ALfloat *restrict lpout, - const ALfloat *input, ALsizei count); - -/* The all-pass portion of the band splitter. Applies the same phase shift - * without splitting the signal. - */ -typedef struct SplitterAllpass { - ALfloat coeff; - ALfloat z1; -} SplitterAllpass; - -void splitterap_init(SplitterAllpass *splitter, ALfloat f0norm); -void splitterap_clear(SplitterAllpass *splitter); -void splitterap_process(SplitterAllpass *splitter, ALfloat *restrict samples, ALsizei count); - - -typedef struct FrontStablizer { - SplitterAllpass APFilter[MAX_OUTPUT_CHANNELS]; - BandSplitter LFilter, RFilter; - alignas(16) ALfloat LSplit[2][BUFFERSIZE]; - alignas(16) ALfloat RSplit[2][BUFFERSIZE]; -} FrontStablizer; - -#endif /* FILTER_SPLITTER_H */ diff --git a/Alc/fpu_modes.h b/Alc/fpu_modes.h deleted file mode 100644 index eb30596..0000000 --- a/Alc/fpu_modes.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef FPU_MODES_H -#define FPU_MODES_H - -#ifdef HAVE_FENV_H -#include -#endif - - -typedef struct FPUCtl { -#if defined(__GNUC__) && defined(HAVE_SSE) - unsigned int sse_state; -#elif defined(HAVE___CONTROL87_2) - unsigned int state; - unsigned int sse_state; -#elif defined(HAVE__CONTROLFP) - unsigned int state; -#endif -} FPUCtl; -void SetMixerFPUMode(FPUCtl *ctl); -void RestoreFPUMode(const FPUCtl *ctl); - -#ifdef __GNUC__ -/* Use an alternate macro set with GCC to avoid accidental continue or break - * statements within the mixer mode. - */ -#define START_MIXER_MODE() __extension__({ FPUCtl _oldMode; SetMixerFPUMode(&_oldMode) -#define END_MIXER_MODE() RestoreFPUMode(&_oldMode); }) -#else -#define START_MIXER_MODE() do { FPUCtl _oldMode; SetMixerFPUMode(&_oldMode) -#define END_MIXER_MODE() RestoreFPUMode(&_oldMode); } while(0) -#endif -#define LEAVE_MIXER_MODE() RestoreFPUMode(&_oldMode) - -#endif /* FPU_MODES_H */ diff --git a/Alc/helpers.c b/Alc/helpers.c deleted file mode 100644 index d2cb625..0000000 --- a/Alc/helpers.c +++ /dev/null @@ -1,1189 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2011 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#ifdef _WIN32 -#ifdef __MINGW32__ -#define _WIN32_IE 0x501 -#else -#define _WIN32_IE 0x400 -#endif -#endif - -#include "config.h" - -#include -#include -#include -#include -#include -#ifdef HAVE_MALLOC_H -#include -#endif -#ifdef HAVE_DIRENT_H -#include -#endif -#ifdef HAVE_PROC_PIDPATH -#include -#endif - -#ifdef __FreeBSD__ -#include -#include -#endif - -#ifndef AL_NO_UID_DEFS -#if defined(HAVE_GUIDDEF_H) || defined(HAVE_INITGUID_H) -#define INITGUID -#include -#ifdef HAVE_GUIDDEF_H -#include -#else -#include -#endif - -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80,0x00, 0x00,0xaa,0x00,0x38,0x9b,0x71); -DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80,0x00, 0x00,0xaa,0x00,0x38,0x9b,0x71); - -DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf,0x08, 0x00,0xa0,0xc9,0x25,0xcd,0x16); - -DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e); -DEFINE_GUID(IID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6); -DEFINE_GUID(IID_IAudioClient, 0x1cb9ad4c, 0xdbfa, 0x4c32, 0xb1,0x78, 0xc2,0xf5,0x68,0xa7,0x03,0xb2); -DEFINE_GUID(IID_IAudioRenderClient, 0xf294acfc, 0x3146, 0x4483, 0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2); -DEFINE_GUID(IID_IAudioCaptureClient, 0xc8adbd64, 0xe71e, 0x48a0, 0xa4,0xde, 0x18,0x5c,0x39,0x5c,0xd3,0x17); - -#ifdef HAVE_WASAPI -#include -#include -#include -DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14); -DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FormFactor, 0x1da5d803, 0xd492, 0x4edd, 0x8c,0x23, 0xe0,0xc0,0xff,0xee,0x7f,0x0e, 0); -DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23,0xe0, 0xc0,0xff,0xee,0x7f,0x0e, 4 ); -#endif -#endif -#endif /* AL_NO_UID_DEFS */ - -#ifdef HAVE_DLFCN_H -#include -#endif -#ifdef HAVE_INTRIN_H -#include -#endif -#ifdef HAVE_CPUID_H -#include -#endif -#ifdef HAVE_SYS_SYSCONF_H -#include -#endif -#ifdef HAVE_FLOAT_H -#include -#endif -#ifdef HAVE_IEEEFP_H -#include -#endif - -#ifndef _WIN32 -#include -#include -#include -#include -#include -#elif defined(_WIN32_IE) -#include -#endif - -#include "alMain.h" -#include "alu.h" -#include "cpu_caps.h" -#include "fpu_modes.h" -#include "atomic.h" -#include "uintmap.h" -#include "vector.h" -#include "alstring.h" -#include "compat.h" -#include "threads.h" - - -extern inline ALuint NextPowerOf2(ALuint value); -extern inline size_t RoundUp(size_t value, size_t r); -extern inline ALint fastf2i(ALfloat f); -extern inline int float2int(float f); -extern inline float fast_roundf(float f); -#ifndef __GNUC__ -#if defined(HAVE_BITSCANFORWARD64_INTRINSIC) -extern inline int msvc64_ctz64(ALuint64 v); -#elif defined(HAVE_BITSCANFORWARD_INTRINSIC) -extern inline int msvc_ctz64(ALuint64 v); -#else -extern inline int fallback_popcnt64(ALuint64 v); -extern inline int fallback_ctz64(ALuint64 value); -#endif -#endif - - -#if defined(HAVE_GCC_GET_CPUID) && (defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64)) -typedef unsigned int reg_type; -static inline void get_cpuid(int f, reg_type *regs) -{ __get_cpuid(f, ®s[0], ®s[1], ®s[2], ®s[3]); } -#define CAN_GET_CPUID -#elif defined(HAVE_CPUID_INTRINSIC) && (defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64)) -typedef int reg_type; -static inline void get_cpuid(int f, reg_type *regs) -{ (__cpuid)(regs, f); } -#define CAN_GET_CPUID -#endif - -int CPUCapFlags = 0; - -void FillCPUCaps(int capfilter) -{ - int caps = 0; - -/* FIXME: We really should get this for all available CPUs in case different - * CPUs have different caps (is that possible on one machine?). */ -#ifdef CAN_GET_CPUID - union { - reg_type regs[4]; - char str[sizeof(reg_type[4])]; - } cpuinf[3] = {{ { 0, 0, 0, 0 } }}; - - get_cpuid(0, cpuinf[0].regs); - if(cpuinf[0].regs[0] == 0) - ERR("Failed to get CPUID\n"); - else - { - unsigned int maxfunc = cpuinf[0].regs[0]; - unsigned int maxextfunc; - - get_cpuid(0x80000000, cpuinf[0].regs); - maxextfunc = cpuinf[0].regs[0]; - - TRACE("Detected max CPUID function: 0x%x (ext. 0x%x)\n", maxfunc, maxextfunc); - - TRACE("Vendor ID: \"%.4s%.4s%.4s\"\n", cpuinf[0].str+4, cpuinf[0].str+12, cpuinf[0].str+8); - if(maxextfunc >= 0x80000004) - { - get_cpuid(0x80000002, cpuinf[0].regs); - get_cpuid(0x80000003, cpuinf[1].regs); - get_cpuid(0x80000004, cpuinf[2].regs); - TRACE("Name: \"%.16s%.16s%.16s\"\n", cpuinf[0].str, cpuinf[1].str, cpuinf[2].str); - } - - if(maxfunc >= 1) - { - get_cpuid(1, cpuinf[0].regs); - if((cpuinf[0].regs[3]&(1<<25))) - caps |= CPU_CAP_SSE; - if((caps&CPU_CAP_SSE) && (cpuinf[0].regs[3]&(1<<26))) - caps |= CPU_CAP_SSE2; - if((caps&CPU_CAP_SSE2) && (cpuinf[0].regs[2]&(1<<0))) - caps |= CPU_CAP_SSE3; - if((caps&CPU_CAP_SSE3) && (cpuinf[0].regs[2]&(1<<19))) - caps |= CPU_CAP_SSE4_1; - } - } -#else - /* Assume support for whatever's supported if we can't check for it */ -#if defined(HAVE_SSE4_1) -#warning "Assuming SSE 4.1 run-time support!" - caps |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3 | CPU_CAP_SSE4_1; -#elif defined(HAVE_SSE3) -#warning "Assuming SSE 3 run-time support!" - caps |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3; -#elif defined(HAVE_SSE2) -#warning "Assuming SSE 2 run-time support!" - caps |= CPU_CAP_SSE | CPU_CAP_SSE2; -#elif defined(HAVE_SSE) -#warning "Assuming SSE run-time support!" - caps |= CPU_CAP_SSE; -#endif -#endif -#ifdef HAVE_NEON - FILE *file = fopen("/proc/cpuinfo", "rt"); - if(!file) - ERR("Failed to open /proc/cpuinfo, cannot check for NEON support\n"); - else - { - al_string features = AL_STRING_INIT_STATIC(); - char buf[256]; - - while(fgets(buf, sizeof(buf), file) != NULL) - { - if(strncmp(buf, "Features\t:", 10) != 0) - continue; - - alstr_copy_cstr(&features, buf+10); - while(VECTOR_BACK(features) != '\n') - { - if(fgets(buf, sizeof(buf), file) == NULL) - break; - alstr_append_cstr(&features, buf); - } - break; - } - fclose(file); - file = NULL; - - if(!alstr_empty(features)) - { - const char *str = alstr_get_cstr(features); - while(isspace(str[0])) ++str; - - TRACE("Got features string:%s\n", str); - while((str=strstr(str, "neon")) != NULL) - { - if(isspace(*(str-1)) && (str[4] == 0 || isspace(str[4]))) - { - caps |= CPU_CAP_NEON; - break; - } - ++str; - } - } - - alstr_reset(&features); - } -#endif - - TRACE("Extensions:%s%s%s%s%s%s\n", - ((capfilter&CPU_CAP_SSE) ? ((caps&CPU_CAP_SSE) ? " +SSE" : " -SSE") : ""), - ((capfilter&CPU_CAP_SSE2) ? ((caps&CPU_CAP_SSE2) ? " +SSE2" : " -SSE2") : ""), - ((capfilter&CPU_CAP_SSE3) ? ((caps&CPU_CAP_SSE3) ? " +SSE3" : " -SSE3") : ""), - ((capfilter&CPU_CAP_SSE4_1) ? ((caps&CPU_CAP_SSE4_1) ? " +SSE4.1" : " -SSE4.1") : ""), - ((capfilter&CPU_CAP_NEON) ? ((caps&CPU_CAP_NEON) ? " +NEON" : " -NEON") : ""), - ((!capfilter) ? " -none-" : "") - ); - CPUCapFlags = caps & capfilter; -} - - -void SetMixerFPUMode(FPUCtl *ctl) -{ -#if defined(__GNUC__) && defined(HAVE_SSE) - if((CPUCapFlags&CPU_CAP_SSE)) - { - __asm__ __volatile__("stmxcsr %0" : "=m" (*&ctl->sse_state)); - unsigned int sseState = ctl->sse_state; - sseState |= 0x8000; /* set flush-to-zero */ - if((CPUCapFlags&CPU_CAP_SSE2)) - sseState |= 0x0040; /* set denormals-are-zero */ - __asm__ __volatile__("ldmxcsr %0" : : "m" (*&sseState)); - } - -#elif defined(HAVE___CONTROL87_2) - - __control87_2(0, 0, &ctl->state, &ctl->sse_state); - _control87(_DN_FLUSH, _MCW_DN); - -#elif defined(HAVE__CONTROLFP) - - ctl->state = _controlfp(0, 0); - _controlfp(_DN_FLUSH, _MCW_DN); -#endif -} - -void RestoreFPUMode(const FPUCtl *ctl) -{ -#if defined(__GNUC__) && defined(HAVE_SSE) - if((CPUCapFlags&CPU_CAP_SSE)) - __asm__ __volatile__("ldmxcsr %0" : : "m" (*&ctl->sse_state)); - -#elif defined(HAVE___CONTROL87_2) - - int mode; - __control87_2(ctl->state, _MCW_DN, &mode, NULL); - __control87_2(ctl->sse_state, _MCW_DN, NULL, &mode); - -#elif defined(HAVE__CONTROLFP) - - _controlfp(ctl->state, _MCW_DN); -#endif -} - - -static int StringSortCompare(const void *str1, const void *str2) -{ - return alstr_cmp(*(const_al_string*)str1, *(const_al_string*)str2); -} - -#ifdef _WIN32 - -static WCHAR *strrchrW(WCHAR *str, WCHAR ch) -{ - WCHAR *ret = NULL; - while(*str) - { - if(*str == ch) - ret = str; - ++str; - } - return ret; -} - -void GetProcBinary(al_string *path, al_string *fname) -{ - WCHAR *pathname, *sep; - DWORD pathlen; - DWORD len; - - pathlen = 256; - pathname = malloc(pathlen * sizeof(pathname[0])); - while(pathlen > 0 && (len=GetModuleFileNameW(NULL, pathname, pathlen)) == pathlen) - { - free(pathname); - pathlen <<= 1; - pathname = malloc(pathlen * sizeof(pathname[0])); - } - if(len == 0) - { - free(pathname); - ERR("Failed to get process name: error %lu\n", GetLastError()); - return; - } - - pathname[len] = 0; - if((sep=strrchrW(pathname, '\\')) != NULL) - { - WCHAR *sep2 = strrchrW(sep+1, '/'); - if(sep2) sep = sep2; - } - else - sep = strrchrW(pathname, '/'); - - if(sep) - { - if(path) alstr_copy_wrange(path, pathname, sep); - if(fname) alstr_copy_wcstr(fname, sep+1); - } - else - { - if(path) alstr_clear(path); - if(fname) alstr_copy_wcstr(fname, pathname); - } - free(pathname); - - if(path && fname) - TRACE("Got: %s, %s\n", alstr_get_cstr(*path), alstr_get_cstr(*fname)); - else if(path) TRACE("Got path: %s\n", alstr_get_cstr(*path)); - else if(fname) TRACE("Got filename: %s\n", alstr_get_cstr(*fname)); -} - - -static WCHAR *FromUTF8(const char *str) -{ - WCHAR *out = NULL; - int len; - - if((len=MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0)) > 0) - { - out = calloc(sizeof(WCHAR), len); - MultiByteToWideChar(CP_UTF8, 0, str, -1, out, len); - } - return out; -} - - -void *LoadLib(const char *name) -{ - HANDLE hdl = NULL; - WCHAR *wname; - - wname = FromUTF8(name); - if(!wname) - ERR("Failed to convert UTF-8 filename: \"%s\"\n", name); - else - { - hdl = LoadLibraryW(wname); - free(wname); - } - return hdl; -} -void CloseLib(void *handle) -{ FreeLibrary((HANDLE)handle); } -void *GetSymbol(void *handle, const char *name) -{ - void *ret; - - ret = (void*)GetProcAddress((HANDLE)handle, name); - if(ret == NULL) - ERR("Failed to load %s\n", name); - return ret; -} - -WCHAR *strdupW(const WCHAR *str) -{ - const WCHAR *n; - WCHAR *ret; - size_t len; - - n = str; - while(*n) n++; - len = n - str; - - ret = calloc(sizeof(WCHAR), len+1); - if(ret != NULL) - memcpy(ret, str, sizeof(WCHAR)*len); - return ret; -} - -FILE *al_fopen(const char *fname, const char *mode) -{ - WCHAR *wname=NULL, *wmode=NULL; - FILE *file = NULL; - - wname = FromUTF8(fname); - wmode = FromUTF8(mode); - if(!wname) - ERR("Failed to convert UTF-8 filename: \"%s\"\n", fname); - else if(!wmode) - ERR("Failed to convert UTF-8 mode: \"%s\"\n", mode); - else - file = _wfopen(wname, wmode); - - free(wname); - free(wmode); - - return file; -} - - -void al_print(const char *type, const char *func, const char *fmt, ...) -{ - char str[1024]; - WCHAR *wstr; - va_list ap; - - va_start(ap, fmt); - vsnprintf(str, sizeof(str), fmt, ap); - va_end(ap); - - str[sizeof(str)-1] = 0; - wstr = FromUTF8(str); - if(!wstr) - fprintf(LogFile, "AL lib: %s %s: %s", type, func, str); - else - { - fprintf(LogFile, "AL lib: %s %s: %ls", type, func, wstr); - free(wstr); - wstr = NULL; - } - fflush(LogFile); -} - - -static inline int is_slash(int c) -{ return (c == '\\' || c == '/'); } - -static void DirectorySearch(const char *path, const char *ext, vector_al_string *results) -{ - al_string pathstr = AL_STRING_INIT_STATIC(); - WIN32_FIND_DATAW fdata; - WCHAR *wpath; - HANDLE hdl; - - alstr_copy_cstr(&pathstr, path); - alstr_append_cstr(&pathstr, "\\*"); - alstr_append_cstr(&pathstr, ext); - - TRACE("Searching %s\n", alstr_get_cstr(pathstr)); - - wpath = FromUTF8(alstr_get_cstr(pathstr)); - - hdl = FindFirstFileW(wpath, &fdata); - if(hdl != INVALID_HANDLE_VALUE) - { - size_t base = VECTOR_SIZE(*results); - do { - al_string str = AL_STRING_INIT_STATIC(); - alstr_copy_cstr(&str, path); - alstr_append_char(&str, '\\'); - alstr_append_wcstr(&str, fdata.cFileName); - TRACE("Got result %s\n", alstr_get_cstr(str)); - VECTOR_PUSH_BACK(*results, str); - } while(FindNextFileW(hdl, &fdata)); - FindClose(hdl); - - if(VECTOR_SIZE(*results) > base) - qsort(VECTOR_BEGIN(*results)+base, VECTOR_SIZE(*results)-base, - sizeof(VECTOR_FRONT(*results)), StringSortCompare); - } - - free(wpath); - alstr_reset(&pathstr); -} - -vector_al_string SearchDataFiles(const char *ext, const char *subdir) -{ - static const int ids[2] = { CSIDL_APPDATA, CSIDL_COMMON_APPDATA }; - static RefCount search_lock; - vector_al_string results = VECTOR_INIT_STATIC(); - size_t i; - - while(ATOMIC_EXCHANGE_SEQ(&search_lock, 1) == 1) - althrd_yield(); - - /* If the path is absolute, use it directly. */ - if(isalpha(subdir[0]) && subdir[1] == ':' && is_slash(subdir[2])) - { - al_string path = AL_STRING_INIT_STATIC(); - alstr_copy_cstr(&path, subdir); -#define FIX_SLASH(i) do { if(*(i) == '/') *(i) = '\\'; } while(0) - VECTOR_FOR_EACH(char, path, FIX_SLASH); -#undef FIX_SLASH - - DirectorySearch(alstr_get_cstr(path), ext, &results); - - alstr_reset(&path); - } - else if(subdir[0] == '\\' && subdir[1] == '\\' && subdir[2] == '?' && subdir[3] == '\\') - DirectorySearch(subdir, ext, &results); - else - { - al_string path = AL_STRING_INIT_STATIC(); - WCHAR *cwdbuf; - - /* Search the app-local directory. */ - if((cwdbuf=_wgetenv(L"ALSOFT_LOCAL_PATH")) && *cwdbuf != '\0') - { - alstr_copy_wcstr(&path, cwdbuf); - if(is_slash(VECTOR_BACK(path))) - { - VECTOR_POP_BACK(path); - *VECTOR_END(path) = 0; - } - } - else if(!(cwdbuf=_wgetcwd(NULL, 0))) - alstr_copy_cstr(&path, "."); - else - { - alstr_copy_wcstr(&path, cwdbuf); - if(is_slash(VECTOR_BACK(path))) - { - VECTOR_POP_BACK(path); - *VECTOR_END(path) = 0; - } - free(cwdbuf); - } -#define FIX_SLASH(i) do { if(*(i) == '/') *(i) = '\\'; } while(0) - VECTOR_FOR_EACH(char, path, FIX_SLASH); -#undef FIX_SLASH - DirectorySearch(alstr_get_cstr(path), ext, &results); - - /* Search the local and global data dirs. */ - for(i = 0;i < COUNTOF(ids);i++) - { - WCHAR buffer[MAX_PATH]; - if(SHGetSpecialFolderPathW(NULL, buffer, ids[i], FALSE) != FALSE) - { - alstr_copy_wcstr(&path, buffer); - if(!is_slash(VECTOR_BACK(path))) - alstr_append_char(&path, '\\'); - alstr_append_cstr(&path, subdir); -#define FIX_SLASH(i) do { if(*(i) == '/') *(i) = '\\'; } while(0) - VECTOR_FOR_EACH(char, path, FIX_SLASH); -#undef FIX_SLASH - - DirectorySearch(alstr_get_cstr(path), ext, &results); - } - } - - alstr_reset(&path); - } - - ATOMIC_STORE_SEQ(&search_lock, 0); - - return results; -} - - -struct FileMapping MapFileToMem(const char *fname) -{ - struct FileMapping ret = { NULL, NULL, NULL, 0 }; - MEMORY_BASIC_INFORMATION meminfo; - HANDLE file, fmap; - WCHAR *wname; - void *ptr; - - wname = FromUTF8(fname); - - file = CreateFileW(wname, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if(file == INVALID_HANDLE_VALUE) - { - ERR("Failed to open %s: %lu\n", fname, GetLastError()); - free(wname); - return ret; - } - free(wname); - wname = NULL; - - fmap = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); - if(!fmap) - { - ERR("Failed to create map for %s: %lu\n", fname, GetLastError()); - CloseHandle(file); - return ret; - } - - ptr = MapViewOfFile(fmap, FILE_MAP_READ, 0, 0, 0); - if(!ptr) - { - ERR("Failed to map %s: %lu\n", fname, GetLastError()); - CloseHandle(fmap); - CloseHandle(file); - return ret; - } - - if(VirtualQuery(ptr, &meminfo, sizeof(meminfo)) != sizeof(meminfo)) - { - ERR("Failed to get map size for %s: %lu\n", fname, GetLastError()); - UnmapViewOfFile(ptr); - CloseHandle(fmap); - CloseHandle(file); - return ret; - } - - ret.file = file; - ret.fmap = fmap; - ret.ptr = ptr; - ret.len = meminfo.RegionSize; - return ret; -} - -void UnmapFileMem(const struct FileMapping *mapping) -{ - UnmapViewOfFile(mapping->ptr); - CloseHandle(mapping->fmap); - CloseHandle(mapping->file); -} - -#else - -void GetProcBinary(al_string *path, al_string *fname) -{ - char *pathname = NULL; - size_t pathlen; - -#ifdef __FreeBSD__ - int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; - if(sysctl(mib, 4, NULL, &pathlen, NULL, 0) == -1) - WARN("Failed to sysctl kern.proc.pathname: %s\n", strerror(errno)); - else - { - pathname = malloc(pathlen + 1); - sysctl(mib, 4, (void*)pathname, &pathlen, NULL, 0); - pathname[pathlen] = 0; - } -#endif -#ifdef HAVE_PROC_PIDPATH - if(!pathname) - { - const pid_t pid = getpid(); - char procpath[PROC_PIDPATHINFO_MAXSIZE]; - int ret; - - ret = proc_pidpath(pid, procpath, sizeof(procpath)); - if(ret < 1) - { - WARN("proc_pidpath(%d, ...) failed: %s\n", pid, strerror(errno)); - free(pathname); - pathname = NULL; - } - else - { - pathlen = strlen(procpath); - pathname = strdup(procpath); - } - } -#endif - if(!pathname) - { - const char *selfname; - ssize_t len; - - pathlen = 256; - pathname = malloc(pathlen); - - selfname = "/proc/self/exe"; - len = readlink(selfname, pathname, pathlen); - if(len == -1 && errno == ENOENT) - { - selfname = "/proc/self/file"; - len = readlink(selfname, pathname, pathlen); - } - if(len == -1 && errno == ENOENT) - { - selfname = "/proc/curproc/exe"; - len = readlink(selfname, pathname, pathlen); - } - if(len == -1 && errno == ENOENT) - { - selfname = "/proc/curproc/file"; - len = readlink(selfname, pathname, pathlen); - } - - while(len > 0 && (size_t)len == pathlen) - { - free(pathname); - pathlen <<= 1; - pathname = malloc(pathlen); - len = readlink(selfname, pathname, pathlen); - } - if(len <= 0) - { - free(pathname); - WARN("Failed to readlink %s: %s\n", selfname, strerror(errno)); - return; - } - - pathname[len] = 0; - } - - char *sep = strrchr(pathname, '/'); - if(sep) - { - if(path) alstr_copy_range(path, pathname, sep); - if(fname) alstr_copy_cstr(fname, sep+1); - } - else - { - if(path) alstr_clear(path); - if(fname) alstr_copy_cstr(fname, pathname); - } - free(pathname); - - if(path && fname) - TRACE("Got: %s, %s\n", alstr_get_cstr(*path), alstr_get_cstr(*fname)); - else if(path) TRACE("Got path: %s\n", alstr_get_cstr(*path)); - else if(fname) TRACE("Got filename: %s\n", alstr_get_cstr(*fname)); -} - - -#ifdef HAVE_DLFCN_H - -void *LoadLib(const char *name) -{ - const char *err; - void *handle; - - dlerror(); - handle = dlopen(name, RTLD_NOW); - if((err=dlerror()) != NULL) - handle = NULL; - return handle; -} -void CloseLib(void *handle) -{ dlclose(handle); } -void *GetSymbol(void *handle, const char *name) -{ - const char *err; - void *sym; - - dlerror(); - sym = dlsym(handle, name); - if((err=dlerror()) != NULL) - { - WARN("Failed to load %s: %s\n", name, err); - sym = NULL; - } - return sym; -} - -#endif /* HAVE_DLFCN_H */ - -void al_print(const char *type, const char *func, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - fprintf(LogFile, "AL lib: %s %s: ", type, func); - vfprintf(LogFile, fmt, ap); - va_end(ap); - - fflush(LogFile); -} - - -static void DirectorySearch(const char *path, const char *ext, vector_al_string *results) -{ - size_t extlen = strlen(ext); - DIR *dir; - - TRACE("Searching %s for *%s\n", path, ext); - dir = opendir(path); - if(dir != NULL) - { - size_t base = VECTOR_SIZE(*results); - struct dirent *dirent; - while((dirent=readdir(dir)) != NULL) - { - al_string str; - size_t len; - if(strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) - continue; - - len = strlen(dirent->d_name); - if(!(len > extlen)) - continue; - if(strcasecmp(dirent->d_name+len-extlen, ext) != 0) - continue; - - AL_STRING_INIT(str); - alstr_copy_cstr(&str, path); - if(VECTOR_BACK(str) != '/') - alstr_append_char(&str, '/'); - alstr_append_cstr(&str, dirent->d_name); - TRACE("Got result %s\n", alstr_get_cstr(str)); - VECTOR_PUSH_BACK(*results, str); - } - closedir(dir); - - if(VECTOR_SIZE(*results) > base) - qsort(VECTOR_BEGIN(*results)+base, VECTOR_SIZE(*results)-base, - sizeof(VECTOR_FRONT(*results)), StringSortCompare); - } -} - -vector_al_string SearchDataFiles(const char *ext, const char *subdir) -{ - static RefCount search_lock; - vector_al_string results = VECTOR_INIT_STATIC(); - - while(ATOMIC_EXCHANGE_SEQ(&search_lock, 1) == 1) - althrd_yield(); - - if(subdir[0] == '/') - DirectorySearch(subdir, ext, &results); - else - { - al_string path = AL_STRING_INIT_STATIC(); - const char *str, *next; - - /* Search the app-local directory. */ - if((str=getenv("ALSOFT_LOCAL_PATH")) && *str != '\0') - DirectorySearch(str, ext, &results); - else - { - size_t cwdlen = 256; - char *cwdbuf = malloc(cwdlen); - while(!getcwd(cwdbuf, cwdlen)) - { - free(cwdbuf); - cwdbuf = NULL; - if(errno != ERANGE) - break; - cwdlen <<= 1; - cwdbuf = malloc(cwdlen); - } - if(!cwdbuf) - DirectorySearch(".", ext, &results); - else - { - DirectorySearch(cwdbuf, ext, &results); - free(cwdbuf); - cwdbuf = NULL; - } - } - - // Search local data dir - if((str=getenv("XDG_DATA_HOME")) != NULL && str[0] != '\0') - { - alstr_copy_cstr(&path, str); - if(VECTOR_BACK(path) != '/') - alstr_append_char(&path, '/'); - alstr_append_cstr(&path, subdir); - DirectorySearch(alstr_get_cstr(path), ext, &results); - } - else if((str=getenv("HOME")) != NULL && str[0] != '\0') - { - alstr_copy_cstr(&path, str); - if(VECTOR_BACK(path) == '/') - { - VECTOR_POP_BACK(path); - *VECTOR_END(path) = 0; - } - alstr_append_cstr(&path, "/.local/share/"); - alstr_append_cstr(&path, subdir); - DirectorySearch(alstr_get_cstr(path), ext, &results); - } - - // Search global data dirs - if((str=getenv("XDG_DATA_DIRS")) == NULL || str[0] == '\0') - str = "/usr/local/share/:/usr/share/"; - - next = str; - while((str=next) != NULL && str[0] != '\0') - { - next = strchr(str, ':'); - if(!next) - alstr_copy_cstr(&path, str); - else - { - alstr_copy_range(&path, str, next); - ++next; - } - if(!alstr_empty(path)) - { - if(VECTOR_BACK(path) != '/') - alstr_append_char(&path, '/'); - alstr_append_cstr(&path, subdir); - - DirectorySearch(alstr_get_cstr(path), ext, &results); - } - } - - alstr_reset(&path); - } - - ATOMIC_STORE_SEQ(&search_lock, 0); - - return results; -} - - -struct FileMapping MapFileToMem(const char *fname) -{ - struct FileMapping ret = { -1, NULL, 0 }; - struct stat sbuf; - void *ptr; - int fd; - - fd = open(fname, O_RDONLY, 0); - if(fd == -1) - { - ERR("Failed to open %s: (%d) %s\n", fname, errno, strerror(errno)); - return ret; - } - if(fstat(fd, &sbuf) == -1) - { - ERR("Failed to stat %s: (%d) %s\n", fname, errno, strerror(errno)); - close(fd); - return ret; - } - - ptr = mmap(NULL, sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if(ptr == MAP_FAILED) - { - ERR("Failed to map %s: (%d) %s\n", fname, errno, strerror(errno)); - close(fd); - return ret; - } - - ret.fd = fd; - ret.ptr = ptr; - ret.len = sbuf.st_size; - return ret; -} - -void UnmapFileMem(const struct FileMapping *mapping) -{ - munmap(mapping->ptr, mapping->len); - close(mapping->fd); -} - -#endif - - -void SetRTPriority(void) -{ - ALboolean failed = AL_FALSE; - -#ifdef _WIN32 - if(RTPrioLevel > 0) - failed = !SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); -#elif defined(HAVE_PTHREAD_SETSCHEDPARAM) && !defined(__OpenBSD__) - if(RTPrioLevel > 0) - { - struct sched_param param; - /* Use the minimum real-time priority possible for now (on Linux this - * should be 1 for SCHED_RR) */ - param.sched_priority = sched_get_priority_min(SCHED_RR); - failed = !!pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); - } -#else - /* Real-time priority not available */ - failed = (RTPrioLevel>0); -#endif - if(failed) - ERR("Failed to set priority level for thread\n"); -} - - -extern inline void alstr_reset(al_string *str); -extern inline size_t alstr_length(const_al_string str); -extern inline ALboolean alstr_empty(const_al_string str); -extern inline const al_string_char_type *alstr_get_cstr(const_al_string str); - -void alstr_clear(al_string *str) -{ - if(!alstr_empty(*str)) - { - /* Reserve one more character than the total size of the string. This - * is to ensure we have space to add a null terminator in the string - * data so it can be used as a C-style string. - */ - VECTOR_RESIZE(*str, 0, 1); - VECTOR_ELEM(*str, 0) = 0; - } -} - -static inline int alstr_compare(const al_string_char_type *str1, size_t str1len, - const al_string_char_type *str2, size_t str2len) -{ - size_t complen = (str1len < str2len) ? str1len : str2len; - int ret = memcmp(str1, str2, complen); - if(ret == 0) - { - if(str1len > str2len) return 1; - if(str1len < str2len) return -1; - } - return ret; -} -int alstr_cmp(const_al_string str1, const_al_string str2) -{ - return alstr_compare(&VECTOR_FRONT(str1), alstr_length(str1), - &VECTOR_FRONT(str2), alstr_length(str2)); -} -int alstr_cmp_cstr(const_al_string str1, const al_string_char_type *str2) -{ - return alstr_compare(&VECTOR_FRONT(str1), alstr_length(str1), - str2, strlen(str2)); -} - -void alstr_copy(al_string *str, const_al_string from) -{ - size_t len = alstr_length(from); - size_t i; - - VECTOR_RESIZE(*str, len, len+1); - for(i = 0;i < len;i++) - VECTOR_ELEM(*str, i) = VECTOR_ELEM(from, i); - VECTOR_ELEM(*str, i) = 0; -} - -void alstr_copy_cstr(al_string *str, const al_string_char_type *from) -{ - size_t len = strlen(from); - size_t i; - - VECTOR_RESIZE(*str, len, len+1); - for(i = 0;i < len;i++) - VECTOR_ELEM(*str, i) = from[i]; - VECTOR_ELEM(*str, i) = 0; -} - -void alstr_copy_range(al_string *str, const al_string_char_type *from, const al_string_char_type *to) -{ - size_t len = to - from; - size_t i; - - VECTOR_RESIZE(*str, len, len+1); - for(i = 0;i < len;i++) - VECTOR_ELEM(*str, i) = from[i]; - VECTOR_ELEM(*str, i) = 0; -} - -void alstr_append_char(al_string *str, const al_string_char_type c) -{ - size_t len = alstr_length(*str); - VECTOR_RESIZE(*str, len+1, len+2); - VECTOR_BACK(*str) = c; - VECTOR_ELEM(*str, len+1) = 0; -} - -void alstr_append_cstr(al_string *str, const al_string_char_type *from) -{ - size_t len = strlen(from); - if(len != 0) - { - size_t base = alstr_length(*str); - size_t i; - - VECTOR_RESIZE(*str, base+len, base+len+1); - for(i = 0;i < len;i++) - VECTOR_ELEM(*str, base+i) = from[i]; - VECTOR_ELEM(*str, base+i) = 0; - } -} - -void alstr_append_range(al_string *str, const al_string_char_type *from, const al_string_char_type *to) -{ - size_t len = to - from; - if(len != 0) - { - size_t base = alstr_length(*str); - size_t i; - - VECTOR_RESIZE(*str, base+len, base+len+1); - for(i = 0;i < len;i++) - VECTOR_ELEM(*str, base+i) = from[i]; - VECTOR_ELEM(*str, base+i) = 0; - } -} - -#ifdef _WIN32 -void alstr_copy_wcstr(al_string *str, const wchar_t *from) -{ - int len; - if((len=WideCharToMultiByte(CP_UTF8, 0, from, -1, NULL, 0, NULL, NULL)) > 0) - { - VECTOR_RESIZE(*str, len-1, len); - WideCharToMultiByte(CP_UTF8, 0, from, -1, &VECTOR_FRONT(*str), len, NULL, NULL); - VECTOR_ELEM(*str, len-1) = 0; - } -} - -void alstr_append_wcstr(al_string *str, const wchar_t *from) -{ - int len; - if((len=WideCharToMultiByte(CP_UTF8, 0, from, -1, NULL, 0, NULL, NULL)) > 0) - { - size_t base = alstr_length(*str); - VECTOR_RESIZE(*str, base+len-1, base+len); - WideCharToMultiByte(CP_UTF8, 0, from, -1, &VECTOR_ELEM(*str, base), len, NULL, NULL); - VECTOR_ELEM(*str, base+len-1) = 0; - } -} - -void alstr_copy_wrange(al_string *str, const wchar_t *from, const wchar_t *to) -{ - int len; - if((len=WideCharToMultiByte(CP_UTF8, 0, from, (int)(to-from), NULL, 0, NULL, NULL)) > 0) - { - VECTOR_RESIZE(*str, len, len+1); - WideCharToMultiByte(CP_UTF8, 0, from, (int)(to-from), &VECTOR_FRONT(*str), len+1, NULL, NULL); - VECTOR_ELEM(*str, len) = 0; - } -} - -void alstr_append_wrange(al_string *str, const wchar_t *from, const wchar_t *to) -{ - int len; - if((len=WideCharToMultiByte(CP_UTF8, 0, from, (int)(to-from), NULL, 0, NULL, NULL)) > 0) - { - size_t base = alstr_length(*str); - VECTOR_RESIZE(*str, base+len, base+len+1); - WideCharToMultiByte(CP_UTF8, 0, from, (int)(to-from), &VECTOR_ELEM(*str, base), len+1, NULL, NULL); - VECTOR_ELEM(*str, base+len) = 0; - } -} -#endif diff --git a/Alc/hrtf.c b/Alc/hrtf.c deleted file mode 100644 index ddbd3a2..0000000 --- a/Alc/hrtf.c +++ /dev/null @@ -1,1465 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2011 by Chris Robinson - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alSource.h" -#include "alu.h" -#include "hrtf.h" -#include "alconfig.h" -#include "filters/splitter.h" - -#include "compat.h" -#include "almalloc.h" - - -/* Current data set limits defined by the makehrtf utility. */ -#define MIN_IR_SIZE (8) -#define MAX_IR_SIZE (512) -#define MOD_IR_SIZE (8) - -#define MIN_FD_COUNT (1) -#define MAX_FD_COUNT (16) - -#define MIN_FD_DISTANCE (50) -#define MAX_FD_DISTANCE (2500) - -#define MIN_EV_COUNT (5) -#define MAX_EV_COUNT (128) - -#define MIN_AZ_COUNT (1) -#define MAX_AZ_COUNT (128) - -#define MAX_HRIR_DELAY (HRTF_HISTORY_LENGTH-1) - -struct HrtfEntry { - struct HrtfEntry *next; - struct Hrtf *handle; - char filename[]; -}; - -static const ALchar magicMarker00[8] = "MinPHR00"; -static const ALchar magicMarker01[8] = "MinPHR01"; -static const ALchar magicMarker02[8] = "MinPHR02"; - -/* First value for pass-through coefficients (remaining are 0), used for omni- - * directional sounds. */ -static const ALfloat PassthruCoeff = 0.707106781187f/*sqrt(0.5)*/; - -static ATOMIC_FLAG LoadedHrtfLock = ATOMIC_FLAG_INIT; -static struct HrtfEntry *LoadedHrtfs = NULL; - - -/* Calculate the elevation index given the polar elevation in radians. This - * will return an index between 0 and (evcount - 1). - */ -static ALsizei CalcEvIndex(ALsizei evcount, ALfloat ev, ALfloat *mu) -{ - ALsizei idx; - ev = (F_PI_2+ev) * (evcount-1) / F_PI; - idx = float2int(ev); - - *mu = ev - idx; - return mini(idx, evcount-1); -} - -/* Calculate the azimuth index given the polar azimuth in radians. This will - * return an index between 0 and (azcount - 1). - */ -static ALsizei CalcAzIndex(ALsizei azcount, ALfloat az, ALfloat *mu) -{ - ALsizei idx; - az = (F_TAU+az) * azcount / F_TAU; - - idx = float2int(az); - *mu = az - idx; - return idx % azcount; -} - -/* Calculates static HRIR coefficients and delays for the given polar elevation - * and azimuth in radians. The coefficients are normalized. - */ -void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat spread, - ALfloat (*restrict coeffs)[2], ALsizei *delays) -{ - ALsizei evidx, azidx, idx[4]; - ALsizei evoffset; - ALfloat emu, amu[2]; - ALfloat blend[4]; - ALfloat dirfact; - ALsizei i, c; - - dirfact = 1.0f - (spread / F_TAU); - - /* Claculate the lower elevation index. */ - evidx = CalcEvIndex(Hrtf->evCount, elevation, &emu); - evoffset = Hrtf->evOffset[evidx]; - - /* Calculate lower azimuth index. */ - azidx= CalcAzIndex(Hrtf->azCount[evidx], azimuth, &amu[0]); - - /* Calculate the lower HRIR indices. */ - idx[0] = evoffset + azidx; - idx[1] = evoffset + ((azidx+1) % Hrtf->azCount[evidx]); - if(evidx < Hrtf->evCount-1) - { - /* Increment elevation to the next (upper) index. */ - evidx++; - evoffset = Hrtf->evOffset[evidx]; - - /* Calculate upper azimuth index. */ - azidx = CalcAzIndex(Hrtf->azCount[evidx], azimuth, &amu[1]); - - /* Calculate the upper HRIR indices. */ - idx[2] = evoffset + azidx; - idx[3] = evoffset + ((azidx+1) % Hrtf->azCount[evidx]); - } - else - { - /* If the lower elevation is the top index, the upper elevation is the - * same as the lower. - */ - amu[1] = amu[0]; - idx[2] = idx[0]; - idx[3] = idx[1]; - } - - /* Calculate bilinear blending weights, attenuated according to the - * directional panning factor. - */ - blend[0] = (1.0f-emu) * (1.0f-amu[0]) * dirfact; - blend[1] = (1.0f-emu) * ( amu[0]) * dirfact; - blend[2] = ( emu) * (1.0f-amu[1]) * dirfact; - blend[3] = ( emu) * ( amu[1]) * dirfact; - - /* Calculate the blended HRIR delays. */ - delays[0] = fastf2i( - Hrtf->delays[idx[0]][0]*blend[0] + Hrtf->delays[idx[1]][0]*blend[1] + - Hrtf->delays[idx[2]][0]*blend[2] + Hrtf->delays[idx[3]][0]*blend[3] - ); - delays[1] = fastf2i( - Hrtf->delays[idx[0]][1]*blend[0] + Hrtf->delays[idx[1]][1]*blend[1] + - Hrtf->delays[idx[2]][1]*blend[2] + Hrtf->delays[idx[3]][1]*blend[3] - ); - - /* Calculate the sample offsets for the HRIR indices. */ - idx[0] *= Hrtf->irSize; - idx[1] *= Hrtf->irSize; - idx[2] *= Hrtf->irSize; - idx[3] *= Hrtf->irSize; - - ASSUME(Hrtf->irSize >= MIN_IR_SIZE && (Hrtf->irSize%MOD_IR_SIZE) == 0); - coeffs = ASSUME_ALIGNED(coeffs, 16); - /* Calculate the blended HRIR coefficients. */ - coeffs[0][0] = PassthruCoeff * (1.0f-dirfact); - coeffs[0][1] = PassthruCoeff * (1.0f-dirfact); - for(i = 1;i < Hrtf->irSize;i++) - { - coeffs[i][0] = 0.0f; - coeffs[i][1] = 0.0f; - } - for(c = 0;c < 4;c++) - { - const ALfloat (*restrict srccoeffs)[2] = ASSUME_ALIGNED(Hrtf->coeffs+idx[c], 16); - for(i = 0;i < Hrtf->irSize;i++) - { - coeffs[i][0] += srccoeffs[i][0] * blend[c]; - coeffs[i][1] += srccoeffs[i][1] * blend[c]; - } - } -} - - -void BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsizei NumChannels, const struct AngularPoint *AmbiPoints, const ALfloat (*restrict AmbiMatrix)[MAX_AMBI_COEFFS], ALsizei AmbiCount, const ALfloat *restrict AmbiOrderHFGain) -{ -/* Set this to 2 for dual-band HRTF processing. May require a higher quality - * band-splitter, or better calculation of the new IR length to deal with the - * tail generated by the filter. - */ -#define NUM_BANDS 2 - BandSplitter splitter; - ALdouble (*tmpres)[HRIR_LENGTH][2]; - ALsizei *restrict idx; - ALsizei min_delay = HRTF_HISTORY_LENGTH; - ALsizei max_delay = 0; - ALfloat temps[3][HRIR_LENGTH]; - ALsizei max_length; - ALsizei i, c, b; - - idx = al_calloc(DEF_ALIGN, AmbiCount*sizeof(*idx)); - - for(c = 0;c < AmbiCount;c++) - { - ALuint evidx, azidx; - ALuint evoffset; - ALuint azcount; - - /* Calculate elevation index. */ - evidx = (ALsizei)((F_PI_2+AmbiPoints[c].Elev) * (Hrtf->evCount-1) / F_PI + 0.5f); - evidx = clampi(evidx, 0, Hrtf->evCount-1); - - azcount = Hrtf->azCount[evidx]; - evoffset = Hrtf->evOffset[evidx]; - - /* Calculate azimuth index for this elevation. */ - azidx = (ALsizei)((F_TAU+AmbiPoints[c].Azim) * azcount / F_TAU + 0.5f) % azcount; - - /* Calculate indices for left and right channels. */ - idx[c] = evoffset + azidx; - - min_delay = mini(min_delay, mini(Hrtf->delays[idx[c]][0], Hrtf->delays[idx[c]][1])); - max_delay = maxi(max_delay, maxi(Hrtf->delays[idx[c]][0], Hrtf->delays[idx[c]][1])); - } - - tmpres = al_calloc(16, NumChannels * sizeof(*tmpres)); - - memset(temps, 0, sizeof(temps)); - bandsplit_init(&splitter, 400.0f / (ALfloat)Hrtf->sampleRate); - for(c = 0;c < AmbiCount;c++) - { - const ALfloat (*fir)[2] = &Hrtf->coeffs[idx[c] * Hrtf->irSize]; - ALsizei ldelay = Hrtf->delays[idx[c]][0] - min_delay; - ALsizei rdelay = Hrtf->delays[idx[c]][1] - min_delay; - - if(NUM_BANDS == 1) - { - for(i = 0;i < NumChannels;++i) - { - ALdouble mult = (ALdouble)AmbiOrderHFGain[(ALsizei)sqrt(i)] * AmbiMatrix[c][i]; - ALsizei lidx = ldelay, ridx = rdelay; - ALsizei j = 0; - while(lidx < HRIR_LENGTH && ridx < HRIR_LENGTH && j < Hrtf->irSize) - { - tmpres[i][lidx++][0] += fir[j][0] * mult; - tmpres[i][ridx++][1] += fir[j][1] * mult; - j++; - } - } - } - else - { - /* Band-split left HRIR into low and high frequency responses. */ - bandsplit_clear(&splitter); - for(i = 0;i < Hrtf->irSize;i++) - temps[2][i] = fir[i][0]; - bandsplit_process(&splitter, temps[0], temps[1], temps[2], HRIR_LENGTH); - - /* Apply left ear response with delay. */ - for(i = 0;i < NumChannels;++i) - { - ALfloat hfgain = AmbiOrderHFGain[(ALsizei)sqrt(i)]; - for(b = 0;b < NUM_BANDS;b++) - { - ALdouble mult = AmbiMatrix[c][i] * (ALdouble)((b==0) ? hfgain : 1.0); - ALsizei lidx = ldelay; - ALsizei j = 0; - while(lidx < HRIR_LENGTH) - tmpres[i][lidx++][0] += temps[b][j++] * mult; - } - } - - /* Band-split right HRIR into low and high frequency responses. */ - bandsplit_clear(&splitter); - for(i = 0;i < Hrtf->irSize;i++) - temps[2][i] = fir[i][1]; - bandsplit_process(&splitter, temps[0], temps[1], temps[2], HRIR_LENGTH); - - /* Apply right ear response with delay. */ - for(i = 0;i < NumChannels;++i) - { - ALfloat hfgain = AmbiOrderHFGain[(ALsizei)sqrt(i)]; - for(b = 0;b < NUM_BANDS;b++) - { - ALdouble mult = AmbiMatrix[c][i] * (ALdouble)((b==0) ? hfgain : 1.0); - ALsizei ridx = rdelay; - ALsizei j = 0; - while(ridx < HRIR_LENGTH) - tmpres[i][ridx++][1] += temps[b][j++] * mult; - } - } - } - } - - for(i = 0;i < NumChannels;++i) - { - int idx; - for(idx = 0;idx < HRIR_LENGTH;idx++) - { - state->Chan[i].Coeffs[idx][0] = (ALfloat)tmpres[i][idx][0]; - state->Chan[i].Coeffs[idx][1] = (ALfloat)tmpres[i][idx][1]; - } - } - al_free(tmpres); - tmpres = NULL; - al_free(idx); - idx = NULL; - - if(NUM_BANDS == 1) - max_length = mini(max_delay-min_delay + Hrtf->irSize, HRIR_LENGTH); - else - { - /* Increase the IR size by 2/3rds to account for the tail generated by - * the band-split filter. - */ - const ALsizei irsize = mini(Hrtf->irSize*5/3, HRIR_LENGTH); - max_length = mini(max_delay-min_delay + irsize, HRIR_LENGTH); - } - /* Round up to the next IR size multiple. */ - max_length += MOD_IR_SIZE-1; - max_length -= max_length%MOD_IR_SIZE; - - TRACE("Skipped delay: %d, max delay: %d, new FIR length: %d\n", - min_delay, max_delay-min_delay, max_length); - state->IrSize = max_length; -#undef NUM_BANDS -} - - -static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, - ALfloat distance, ALsizei evCount, ALsizei irCount, const ALubyte *azCount, - const ALushort *evOffset, const ALfloat (*coeffs)[2], const ALubyte (*delays)[2], - const char *filename) -{ - struct Hrtf *Hrtf; - size_t total; - - total = sizeof(struct Hrtf); - total += sizeof(Hrtf->azCount[0])*evCount; - total = RoundUp(total, sizeof(ALushort)); /* Align for ushort fields */ - total += sizeof(Hrtf->evOffset[0])*evCount; - total = RoundUp(total, 16); /* Align for coefficients using SIMD */ - total += sizeof(Hrtf->coeffs[0])*irSize*irCount; - total += sizeof(Hrtf->delays[0])*irCount; - - Hrtf = al_calloc(16, total); - if(Hrtf == NULL) - ERR("Out of memory allocating storage for %s.\n", filename); - else - { - uintptr_t offset = sizeof(struct Hrtf); - char *base = (char*)Hrtf; - ALushort *_evOffset; - ALubyte *_azCount; - ALubyte (*_delays)[2]; - ALfloat (*_coeffs)[2]; - ALsizei i; - - InitRef(&Hrtf->ref, 0); - Hrtf->sampleRate = rate; - Hrtf->irSize = irSize; - Hrtf->distance = distance; - Hrtf->evCount = evCount; - - /* Set up pointers to storage following the main HRTF struct. */ - _azCount = (ALubyte*)(base + offset); - offset += sizeof(_azCount[0])*evCount; - - offset = RoundUp(offset, sizeof(ALushort)); /* Align for ushort fields */ - _evOffset = (ALushort*)(base + offset); - offset += sizeof(_evOffset[0])*evCount; - - offset = RoundUp(offset, 16); /* Align for coefficients using SIMD */ - _coeffs = (ALfloat(*)[2])(base + offset); - offset += sizeof(_coeffs[0])*irSize*irCount; - - _delays = (ALubyte(*)[2])(base + offset); - offset += sizeof(_delays[0])*irCount; - - assert(offset == total); - - /* Copy input data to storage. */ - for(i = 0;i < evCount;i++) _azCount[i] = azCount[i]; - for(i = 0;i < evCount;i++) _evOffset[i] = evOffset[i]; - for(i = 0;i < irSize*irCount;i++) - { - _coeffs[i][0] = coeffs[i][0]; - _coeffs[i][1] = coeffs[i][1]; - } - for(i = 0;i < irCount;i++) - { - _delays[i][0] = delays[i][0]; - _delays[i][1] = delays[i][1]; - } - - /* Finally, assign the storage pointers. */ - Hrtf->azCount = _azCount; - Hrtf->evOffset = _evOffset; - Hrtf->coeffs = _coeffs; - Hrtf->delays = _delays; - } - - return Hrtf; -} - -static ALubyte GetLE_ALubyte(const ALubyte **data, size_t *len) -{ - ALubyte ret = (*data)[0]; - *data += 1; *len -= 1; - return ret; -} - -static ALshort GetLE_ALshort(const ALubyte **data, size_t *len) -{ - ALshort ret = (*data)[0] | ((*data)[1]<<8); - *data += 2; *len -= 2; - return ret; -} - -static ALushort GetLE_ALushort(const ALubyte **data, size_t *len) -{ - ALushort ret = (*data)[0] | ((*data)[1]<<8); - *data += 2; *len -= 2; - return ret; -} - -static ALint GetLE_ALint24(const ALubyte **data, size_t *len) -{ - ALint ret = (*data)[0] | ((*data)[1]<<8) | ((*data)[2]<<16); - *data += 3; *len -= 3; - return (ret^0x800000) - 0x800000; -} - -static ALuint GetLE_ALuint(const ALubyte **data, size_t *len) -{ - ALuint ret = (*data)[0] | ((*data)[1]<<8) | ((*data)[2]<<16) | ((*data)[3]<<24); - *data += 4; *len -= 4; - return ret; -} - -static const ALubyte *Get_ALubytePtr(const ALubyte **data, size_t *len, size_t size) -{ - const ALubyte *ret = *data; - *data += size; *len -= size; - return ret; -} - -static struct Hrtf *LoadHrtf00(const ALubyte *data, size_t datalen, const char *filename) -{ - struct Hrtf *Hrtf = NULL; - ALboolean failed = AL_FALSE; - ALuint rate = 0; - ALushort irCount = 0; - ALushort irSize = 0; - ALubyte evCount = 0; - ALubyte *azCount = NULL; - ALushort *evOffset = NULL; - ALfloat (*coeffs)[2] = NULL; - ALubyte (*delays)[2] = NULL; - ALsizei i, j; - - if(datalen < 9) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT")\n", filename, 9, datalen); - return NULL; - } - - rate = GetLE_ALuint(&data, &datalen); - - irCount = GetLE_ALushort(&data, &datalen); - - irSize = GetLE_ALushort(&data, &datalen); - - evCount = GetLE_ALubyte(&data, &datalen); - - if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE)) - { - ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n", - irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE); - failed = AL_TRUE; - } - if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) - { - ERR("Unsupported elevation count: evCount=%d (%d to %d)\n", - evCount, MIN_EV_COUNT, MAX_EV_COUNT); - failed = AL_TRUE; - } - if(failed) - return NULL; - - if(datalen < evCount*2u) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT")\n", filename, evCount*2, datalen); - return NULL; - } - - azCount = malloc(sizeof(azCount[0])*evCount); - evOffset = malloc(sizeof(evOffset[0])*evCount); - if(azCount == NULL || evOffset == NULL) - { - ERR("Out of memory.\n"); - failed = AL_TRUE; - } - - if(!failed) - { - evOffset[0] = GetLE_ALushort(&data, &datalen); - for(i = 1;i < evCount;i++) - { - evOffset[i] = GetLE_ALushort(&data, &datalen); - if(evOffset[i] <= evOffset[i-1]) - { - ERR("Invalid evOffset: evOffset[%d]=%d (last=%d)\n", - i, evOffset[i], evOffset[i-1]); - failed = AL_TRUE; - } - - azCount[i-1] = evOffset[i] - evOffset[i-1]; - if(azCount[i-1] < MIN_AZ_COUNT || azCount[i-1] > MAX_AZ_COUNT) - { - ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n", - i-1, azCount[i-1], MIN_AZ_COUNT, MAX_AZ_COUNT); - failed = AL_TRUE; - } - } - if(irCount <= evOffset[i-1]) - { - ERR("Invalid evOffset: evOffset[%d]=%d (irCount=%d)\n", - i-1, evOffset[i-1], irCount); - failed = AL_TRUE; - } - - azCount[i-1] = irCount - evOffset[i-1]; - if(azCount[i-1] < MIN_AZ_COUNT || azCount[i-1] > MAX_AZ_COUNT) - { - ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n", - i-1, azCount[i-1], MIN_AZ_COUNT, MAX_AZ_COUNT); - failed = AL_TRUE; - } - } - - if(!failed) - { - coeffs = malloc(sizeof(coeffs[0])*irSize*irCount); - delays = malloc(sizeof(delays[0])*irCount); - if(coeffs == NULL || delays == NULL) - { - ERR("Out of memory.\n"); - failed = AL_TRUE; - } - } - - if(!failed) - { - size_t reqsize = 2*irSize*irCount + irCount; - if(datalen < reqsize) - { - ERR("Unexpected end of %s data (req "SZFMT", rem "SZFMT")\n", - filename, reqsize, datalen); - failed = AL_TRUE; - } - } - - if(!failed) - { - for(i = 0;i < irCount;i++) - { - for(j = 0;j < irSize;j++) - coeffs[i*irSize + j][0] = GetLE_ALshort(&data, &datalen) / 32768.0f; - } - - for(i = 0;i < irCount;i++) - { - delays[i][0] = GetLE_ALubyte(&data, &datalen); - if(delays[i][0] > MAX_HRIR_DELAY) - { - ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); - failed = AL_TRUE; - } - } - } - - if(!failed) - { - /* Mirror the left ear responses to the right ear. */ - for(i = 0;i < evCount;i++) - { - ALushort evoffset = evOffset[i]; - ALubyte azcount = azCount[i]; - for(j = 0;j < azcount;j++) - { - ALsizei lidx = evoffset + j; - ALsizei ridx = evoffset + ((azcount-j) % azcount); - ALsizei k; - - for(k = 0;k < irSize;k++) - coeffs[ridx*irSize + k][1] = coeffs[lidx*irSize + k][0]; - delays[ridx][1] = delays[lidx][0]; - } - } - - Hrtf = CreateHrtfStore(rate, irSize, 0.0f, evCount, irCount, azCount, - evOffset, coeffs, delays, filename); - } - - free(azCount); - free(evOffset); - free(coeffs); - free(delays); - return Hrtf; -} - -static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const char *filename) -{ - struct Hrtf *Hrtf = NULL; - ALboolean failed = AL_FALSE; - ALuint rate = 0; - ALushort irCount = 0; - ALushort irSize = 0; - ALubyte evCount = 0; - const ALubyte *azCount = NULL; - ALushort *evOffset = NULL; - ALfloat (*coeffs)[2] = NULL; - ALubyte (*delays)[2] = NULL; - ALsizei i, j; - - if(datalen < 6) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, 6, datalen); - return NULL; - } - - rate = GetLE_ALuint(&data, &datalen); - - irSize = GetLE_ALubyte(&data, &datalen); - - evCount = GetLE_ALubyte(&data, &datalen); - - if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE)) - { - ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n", - irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE); - failed = AL_TRUE; - } - if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) - { - ERR("Unsupported elevation count: evCount=%d (%d to %d)\n", - evCount, MIN_EV_COUNT, MAX_EV_COUNT); - failed = AL_TRUE; - } - if(failed) - return NULL; - - if(datalen < evCount) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, evCount, datalen); - return NULL; - } - - azCount = Get_ALubytePtr(&data, &datalen, evCount); - - evOffset = malloc(sizeof(evOffset[0])*evCount); - if(azCount == NULL || evOffset == NULL) - { - ERR("Out of memory.\n"); - failed = AL_TRUE; - } - - if(!failed) - { - for(i = 0;i < evCount;i++) - { - if(azCount[i] < MIN_AZ_COUNT || azCount[i] > MAX_AZ_COUNT) - { - ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n", - i, azCount[i], MIN_AZ_COUNT, MAX_AZ_COUNT); - failed = AL_TRUE; - } - } - } - - if(!failed) - { - evOffset[0] = 0; - irCount = azCount[0]; - for(i = 1;i < evCount;i++) - { - evOffset[i] = evOffset[i-1] + azCount[i-1]; - irCount += azCount[i]; - } - - coeffs = malloc(sizeof(coeffs[0])*irSize*irCount); - delays = malloc(sizeof(delays[0])*irCount); - if(coeffs == NULL || delays == NULL) - { - ERR("Out of memory.\n"); - failed = AL_TRUE; - } - } - - if(!failed) - { - size_t reqsize = 2*irSize*irCount + irCount; - if(datalen < reqsize) - { - ERR("Unexpected end of %s data (req "SZFMT", rem "SZFMT"\n", - filename, reqsize, datalen); - failed = AL_TRUE; - } - } - - if(!failed) - { - for(i = 0;i < irCount;i++) - { - for(j = 0;j < irSize;j++) - coeffs[i*irSize + j][0] = GetLE_ALshort(&data, &datalen) / 32768.0f; - } - - for(i = 0;i < irCount;i++) - { - delays[i][0] = GetLE_ALubyte(&data, &datalen); - if(delays[i][0] > MAX_HRIR_DELAY) - { - ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); - failed = AL_TRUE; - } - } - } - - if(!failed) - { - /* Mirror the left ear responses to the right ear. */ - for(i = 0;i < evCount;i++) - { - ALushort evoffset = evOffset[i]; - ALubyte azcount = azCount[i]; - for(j = 0;j < azcount;j++) - { - ALsizei lidx = evoffset + j; - ALsizei ridx = evoffset + ((azcount-j) % azcount); - ALsizei k; - - for(k = 0;k < irSize;k++) - coeffs[ridx*irSize + k][1] = coeffs[lidx*irSize + k][0]; - delays[ridx][1] = delays[lidx][0]; - } - } - - Hrtf = CreateHrtfStore(rate, irSize, 0.0f, evCount, irCount, azCount, - evOffset, coeffs, delays, filename); - } - - free(evOffset); - free(coeffs); - free(delays); - return Hrtf; -} - -#define SAMPLETYPE_S16 0 -#define SAMPLETYPE_S24 1 - -#define CHANTYPE_LEFTONLY 0 -#define CHANTYPE_LEFTRIGHT 1 - -static struct Hrtf *LoadHrtf02(const ALubyte *data, size_t datalen, const char *filename) -{ - struct Hrtf *Hrtf = NULL; - ALboolean failed = AL_FALSE; - ALuint rate = 0; - ALubyte sampleType; - ALubyte channelType; - ALushort irCount = 0; - ALushort irSize = 0; - ALubyte fdCount = 0; - ALushort distance = 0; - ALubyte evCount = 0; - const ALubyte *azCount = NULL; - ALushort *evOffset = NULL; - ALfloat (*coeffs)[2] = NULL; - ALubyte (*delays)[2] = NULL; - ALsizei i, j; - - if(datalen < 8) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, 8, datalen); - return NULL; - } - - rate = GetLE_ALuint(&data, &datalen); - sampleType = GetLE_ALubyte(&data, &datalen); - channelType = GetLE_ALubyte(&data, &datalen); - - irSize = GetLE_ALubyte(&data, &datalen); - - fdCount = GetLE_ALubyte(&data, &datalen); - - if(sampleType > SAMPLETYPE_S24) - { - ERR("Unsupported sample type: %d\n", sampleType); - failed = AL_TRUE; - } - if(channelType > CHANTYPE_LEFTRIGHT) - { - ERR("Unsupported channel type: %d\n", channelType); - failed = AL_TRUE; - } - - if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE)) - { - ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n", - irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE); - failed = AL_TRUE; - } - if(fdCount != 1) - { - ERR("Multiple field-depths not supported: fdCount=%d (%d to %d)\n", - evCount, MIN_FD_COUNT, MAX_FD_COUNT); - failed = AL_TRUE; - } - if(failed) - return NULL; - - for(i = 0;i < fdCount;i++) - { - if(datalen < 3) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, 3, datalen); - return NULL; - } - - distance = GetLE_ALushort(&data, &datalen); - if(distance < MIN_FD_DISTANCE || distance > MAX_FD_DISTANCE) - { - ERR("Unsupported field distance: distance=%d (%dmm to %dmm)\n", - distance, MIN_FD_DISTANCE, MAX_FD_DISTANCE); - failed = AL_TRUE; - } - - evCount = GetLE_ALubyte(&data, &datalen); - if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) - { - ERR("Unsupported elevation count: evCount=%d (%d to %d)\n", - evCount, MIN_EV_COUNT, MAX_EV_COUNT); - failed = AL_TRUE; - } - if(failed) - return NULL; - - if(datalen < evCount) - { - ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, evCount, datalen); - return NULL; - } - - azCount = Get_ALubytePtr(&data, &datalen, evCount); - for(j = 0;j < evCount;j++) - { - if(azCount[j] < MIN_AZ_COUNT || azCount[j] > MAX_AZ_COUNT) - { - ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n", - j, azCount[j], MIN_AZ_COUNT, MAX_AZ_COUNT); - failed = AL_TRUE; - } - } - } - if(failed) - return NULL; - - evOffset = malloc(sizeof(evOffset[0])*evCount); - if(azCount == NULL || evOffset == NULL) - { - ERR("Out of memory.\n"); - failed = AL_TRUE; - } - - if(!failed) - { - evOffset[0] = 0; - irCount = azCount[0]; - for(i = 1;i < evCount;i++) - { - evOffset[i] = evOffset[i-1] + azCount[i-1]; - irCount += azCount[i]; - } - - coeffs = malloc(sizeof(coeffs[0])*irSize*irCount); - delays = malloc(sizeof(delays[0])*irCount); - if(coeffs == NULL || delays == NULL) - { - ERR("Out of memory.\n"); - failed = AL_TRUE; - } - } - - if(!failed) - { - size_t reqsize = 2*irSize*irCount + irCount; - if(datalen < reqsize) - { - ERR("Unexpected end of %s data (req "SZFMT", rem "SZFMT"\n", - filename, reqsize, datalen); - failed = AL_TRUE; - } - } - - if(!failed) - { - if(channelType == CHANTYPE_LEFTONLY) - { - if(sampleType == SAMPLETYPE_S16) - for(i = 0;i < irCount;i++) - { - for(j = 0;j < irSize;j++) - coeffs[i*irSize + j][0] = GetLE_ALshort(&data, &datalen) / 32768.0f; - } - else if(sampleType == SAMPLETYPE_S24) - for(i = 0;i < irCount;i++) - { - for(j = 0;j < irSize;j++) - coeffs[i*irSize + j][0] = GetLE_ALint24(&data, &datalen) / 8388608.0f; - } - - for(i = 0;i < irCount;i++) - { - delays[i][0] = GetLE_ALubyte(&data, &datalen); - if(delays[i][0] > MAX_HRIR_DELAY) - { - ERR("Invalid delays[%d][0]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); - failed = AL_TRUE; - } - } - } - else if(channelType == CHANTYPE_LEFTRIGHT) - { - if(sampleType == SAMPLETYPE_S16) - for(i = 0;i < irCount;i++) - { - for(j = 0;j < irSize;j++) - { - coeffs[i*irSize + j][0] = GetLE_ALshort(&data, &datalen) / 32768.0f; - coeffs[i*irSize + j][1] = GetLE_ALshort(&data, &datalen) / 32768.0f; - } - } - else if(sampleType == SAMPLETYPE_S24) - for(i = 0;i < irCount;i++) - { - for(j = 0;j < irSize;j++) - { - coeffs[i*irSize + j][0] = GetLE_ALint24(&data, &datalen) / 8388608.0f; - coeffs[i*irSize + j][1] = GetLE_ALint24(&data, &datalen) / 8388608.0f; - } - } - - for(i = 0;i < irCount;i++) - { - delays[i][0] = GetLE_ALubyte(&data, &datalen); - if(delays[i][0] > MAX_HRIR_DELAY) - { - ERR("Invalid delays[%d][0]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); - failed = AL_TRUE; - } - delays[i][1] = GetLE_ALubyte(&data, &datalen); - if(delays[i][1] > MAX_HRIR_DELAY) - { - ERR("Invalid delays[%d][1]: %d (%d)\n", i, delays[i][1], MAX_HRIR_DELAY); - failed = AL_TRUE; - } - } - } - } - - if(!failed) - { - if(channelType == CHANTYPE_LEFTONLY) - { - /* Mirror the left ear responses to the right ear. */ - for(i = 0;i < evCount;i++) - { - ALushort evoffset = evOffset[i]; - ALubyte azcount = azCount[i]; - for(j = 0;j < azcount;j++) - { - ALsizei lidx = evoffset + j; - ALsizei ridx = evoffset + ((azcount-j) % azcount); - ALsizei k; - - for(k = 0;k < irSize;k++) - coeffs[ridx*irSize + k][1] = coeffs[lidx*irSize + k][0]; - delays[ridx][1] = delays[lidx][0]; - } - } - } - - Hrtf = CreateHrtfStore(rate, irSize, - (ALfloat)distance / 1000.0f, evCount, irCount, azCount, evOffset, - coeffs, delays, filename - ); - } - - free(evOffset); - free(coeffs); - free(delays); - return Hrtf; -} - - -static void AddFileEntry(vector_EnumeratedHrtf *list, const_al_string filename) -{ - EnumeratedHrtf entry = { AL_STRING_INIT_STATIC(), NULL }; - struct HrtfEntry *loaded_entry; - const EnumeratedHrtf *iter; - const char *name; - const char *ext; - int i; - - /* Check if this file has already been loaded globally. */ - loaded_entry = LoadedHrtfs; - while(loaded_entry) - { - if(alstr_cmp_cstr(filename, loaded_entry->filename) == 0) - { - /* Check if this entry has already been added to the list. */ -#define MATCH_ENTRY(i) (loaded_entry == (i)->hrtf) - VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_ENTRY); -#undef MATCH_ENTRY - if(iter != VECTOR_END(*list)) - { - TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename)); - return; - } - - break; - } - loaded_entry = loaded_entry->next; - } - - if(!loaded_entry) - { - TRACE("Got new file \"%s\"\n", alstr_get_cstr(filename)); - - loaded_entry = al_calloc(DEF_ALIGN, - FAM_SIZE(struct HrtfEntry, filename, alstr_length(filename)+1) - ); - loaded_entry->next = LoadedHrtfs; - loaded_entry->handle = NULL; - strcpy(loaded_entry->filename, alstr_get_cstr(filename)); - LoadedHrtfs = loaded_entry; - } - - /* TODO: Get a human-readable name from the HRTF data (possibly coming in a - * format update). */ - name = strrchr(alstr_get_cstr(filename), '/'); - if(!name) name = strrchr(alstr_get_cstr(filename), '\\'); - if(!name) name = alstr_get_cstr(filename); - else ++name; - - ext = strrchr(name, '.'); - - i = 0; - do { - if(!ext) - alstr_copy_cstr(&entry.name, name); - else - alstr_copy_range(&entry.name, name, ext); - if(i != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", i+1); - alstr_append_cstr(&entry.name, str); - } - ++i; - -#define MATCH_NAME(i) (alstr_cmp(entry.name, (i)->name) == 0) - VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_NAME); -#undef MATCH_NAME - } while(iter != VECTOR_END(*list)); - entry.hrtf = loaded_entry; - - TRACE("Adding entry \"%s\" from file \"%s\"\n", alstr_get_cstr(entry.name), - alstr_get_cstr(filename)); - VECTOR_PUSH_BACK(*list, entry); -} - -/* Unfortunate that we have to duplicate AddFileEntry to take a memory buffer - * for input instead of opening the given filename. - */ -static void AddBuiltInEntry(vector_EnumeratedHrtf *list, const_al_string filename, ALuint residx) -{ - EnumeratedHrtf entry = { AL_STRING_INIT_STATIC(), NULL }; - struct HrtfEntry *loaded_entry; - struct Hrtf *hrtf = NULL; - const EnumeratedHrtf *iter; - const char *name; - const char *ext; - int i; - - loaded_entry = LoadedHrtfs; - while(loaded_entry) - { - if(alstr_cmp_cstr(filename, loaded_entry->filename) == 0) - { -#define MATCH_ENTRY(i) (loaded_entry == (i)->hrtf) - VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_ENTRY); -#undef MATCH_ENTRY - if(iter != VECTOR_END(*list)) - { - TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename)); - return; - } - - break; - } - loaded_entry = loaded_entry->next; - } - - if(!loaded_entry) - { - size_t namelen = alstr_length(filename)+32; - - TRACE("Got new file \"%s\"\n", alstr_get_cstr(filename)); - - loaded_entry = al_calloc(DEF_ALIGN, - FAM_SIZE(struct HrtfEntry, filename, namelen) - ); - loaded_entry->next = LoadedHrtfs; - loaded_entry->handle = hrtf; - snprintf(loaded_entry->filename, namelen, "!%u_%s", - residx, alstr_get_cstr(filename)); - LoadedHrtfs = loaded_entry; - } - - /* TODO: Get a human-readable name from the HRTF data (possibly coming in a - * format update). */ - name = strrchr(alstr_get_cstr(filename), '/'); - if(!name) name = strrchr(alstr_get_cstr(filename), '\\'); - if(!name) name = alstr_get_cstr(filename); - else ++name; - - ext = strrchr(name, '.'); - - i = 0; - do { - if(!ext) - alstr_copy_cstr(&entry.name, name); - else - alstr_copy_range(&entry.name, name, ext); - if(i != 0) - { - char str[64]; - snprintf(str, sizeof(str), " #%d", i+1); - alstr_append_cstr(&entry.name, str); - } - ++i; - -#define MATCH_NAME(i) (alstr_cmp(entry.name, (i)->name) == 0) - VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_NAME); -#undef MATCH_NAME - } while(iter != VECTOR_END(*list)); - entry.hrtf = loaded_entry; - - TRACE("Adding built-in entry \"%s\"\n", alstr_get_cstr(entry.name)); - VECTOR_PUSH_BACK(*list, entry); -} - - -#define IDR_DEFAULT_44100_MHR 1 -#define IDR_DEFAULT_48000_MHR 2 - -#ifndef ALSOFT_EMBED_HRTF_DATA - -static const ALubyte *GetResource(int UNUSED(name), size_t *size) -{ - *size = 0; - return NULL; -} - -#else - -#include "default-44100.mhr.h" -#include "default-48000.mhr.h" - -static const ALubyte *GetResource(int name, size_t *size) -{ - if(name == IDR_DEFAULT_44100_MHR) - { - *size = sizeof(hrtf_default_44100); - return hrtf_default_44100; - } - if(name == IDR_DEFAULT_48000_MHR) - { - *size = sizeof(hrtf_default_48000); - return hrtf_default_48000; - } - *size = 0; - return NULL; -} -#endif - -vector_EnumeratedHrtf EnumerateHrtf(const_al_string devname) -{ - vector_EnumeratedHrtf list = VECTOR_INIT_STATIC(); - const char *defaulthrtf = ""; - const char *pathlist = ""; - bool usedefaults = true; - - if(ConfigValueStr(alstr_get_cstr(devname), NULL, "hrtf-paths", &pathlist)) - { - al_string pname = AL_STRING_INIT_STATIC(); - while(pathlist && *pathlist) - { - const char *next, *end; - - while(isspace(*pathlist) || *pathlist == ',') - pathlist++; - if(*pathlist == '\0') - continue; - - next = strchr(pathlist, ','); - if(next) - end = next++; - else - { - end = pathlist + strlen(pathlist); - usedefaults = false; - } - - while(end != pathlist && isspace(*(end-1))) - --end; - if(end != pathlist) - { - vector_al_string flist; - size_t i; - - alstr_copy_range(&pname, pathlist, end); - - flist = SearchDataFiles(".mhr", alstr_get_cstr(pname)); - for(i = 0;i < VECTOR_SIZE(flist);i++) - AddFileEntry(&list, VECTOR_ELEM(flist, i)); - VECTOR_FOR_EACH(al_string, flist, alstr_reset); - VECTOR_DEINIT(flist); - } - - pathlist = next; - } - - alstr_reset(&pname); - } - else if(ConfigValueExists(alstr_get_cstr(devname), NULL, "hrtf_tables")) - ERR("The hrtf_tables option is deprecated, please use hrtf-paths instead.\n"); - - if(usedefaults) - { - al_string ename = AL_STRING_INIT_STATIC(); - vector_al_string flist; - const ALubyte *rdata; - size_t rsize, i; - - flist = SearchDataFiles(".mhr", "openal/hrtf"); - for(i = 0;i < VECTOR_SIZE(flist);i++) - AddFileEntry(&list, VECTOR_ELEM(flist, i)); - VECTOR_FOR_EACH(al_string, flist, alstr_reset); - VECTOR_DEINIT(flist); - - rdata = GetResource(IDR_DEFAULT_44100_MHR, &rsize); - if(rdata != NULL && rsize > 0) - { - alstr_copy_cstr(&ename, "Built-In 44100hz"); - AddBuiltInEntry(&list, ename, IDR_DEFAULT_44100_MHR); - } - - rdata = GetResource(IDR_DEFAULT_48000_MHR, &rsize); - if(rdata != NULL && rsize > 0) - { - alstr_copy_cstr(&ename, "Built-In 48000hz"); - AddBuiltInEntry(&list, ename, IDR_DEFAULT_48000_MHR); - } - alstr_reset(&ename); - } - - if(VECTOR_SIZE(list) > 1 && ConfigValueStr(alstr_get_cstr(devname), NULL, "default-hrtf", &defaulthrtf)) - { - const EnumeratedHrtf *iter; - /* Find the preferred HRTF and move it to the front of the list. */ -#define FIND_ENTRY(i) (alstr_cmp_cstr((i)->name, defaulthrtf) == 0) - VECTOR_FIND_IF(iter, const EnumeratedHrtf, list, FIND_ENTRY); -#undef FIND_ENTRY - if(iter == VECTOR_END(list)) - WARN("Failed to find default HRTF \"%s\"\n", defaulthrtf); - else if(iter != VECTOR_BEGIN(list)) - { - EnumeratedHrtf entry = *iter; - memmove(&VECTOR_ELEM(list,1), &VECTOR_ELEM(list,0), - (iter-VECTOR_BEGIN(list))*sizeof(EnumeratedHrtf)); - VECTOR_ELEM(list,0) = entry; - } - } - - return list; -} - -void FreeHrtfList(vector_EnumeratedHrtf *list) -{ -#define CLEAR_ENTRY(i) alstr_reset(&(i)->name) - VECTOR_FOR_EACH(EnumeratedHrtf, *list, CLEAR_ENTRY); - VECTOR_DEINIT(*list); -#undef CLEAR_ENTRY -} - -struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry) -{ - struct Hrtf *hrtf = NULL; - struct FileMapping fmap; - const ALubyte *rdata; - const char *name; - ALuint residx; - size_t rsize; - char ch; - - while(ATOMIC_FLAG_TEST_AND_SET(&LoadedHrtfLock, almemory_order_seq_cst)) - althrd_yield(); - - if(entry->handle) - { - hrtf = entry->handle; - Hrtf_IncRef(hrtf); - goto done; - } - - fmap.ptr = NULL; - fmap.len = 0; - if(sscanf(entry->filename, "!%u%c", &residx, &ch) == 2 && ch == '_') - { - name = strchr(entry->filename, ch)+1; - - TRACE("Loading %s...\n", name); - rdata = GetResource(residx, &rsize); - if(rdata == NULL || rsize == 0) - { - ERR("Could not get resource %u, %s\n", residx, name); - goto done; - } - } - else - { - name = entry->filename; - - TRACE("Loading %s...\n", entry->filename); - fmap = MapFileToMem(entry->filename); - if(fmap.ptr == NULL) - { - ERR("Could not open %s\n", entry->filename); - goto done; - } - - rdata = fmap.ptr; - rsize = fmap.len; - } - - if(rsize < sizeof(magicMarker02)) - ERR("%s data is too short ("SZFMT" bytes)\n", name, rsize); - else if(memcmp(rdata, magicMarker02, sizeof(magicMarker02)) == 0) - { - TRACE("Detected data set format v2\n"); - hrtf = LoadHrtf02(rdata+sizeof(magicMarker02), - rsize-sizeof(magicMarker02), name - ); - } - else if(memcmp(rdata, magicMarker01, sizeof(magicMarker01)) == 0) - { - TRACE("Detected data set format v1\n"); - hrtf = LoadHrtf01(rdata+sizeof(magicMarker01), - rsize-sizeof(magicMarker01), name - ); - } - else if(memcmp(rdata, magicMarker00, sizeof(magicMarker00)) == 0) - { - TRACE("Detected data set format v0\n"); - hrtf = LoadHrtf00(rdata+sizeof(magicMarker00), - rsize-sizeof(magicMarker00), name - ); - } - else - ERR("Invalid header in %s: \"%.8s\"\n", name, (const char*)rdata); - if(fmap.ptr) - UnmapFileMem(&fmap); - - if(!hrtf) - { - ERR("Failed to load %s\n", name); - goto done; - } - entry->handle = hrtf; - Hrtf_IncRef(hrtf); - - TRACE("Loaded HRTF support for format: %s %uhz\n", - DevFmtChannelsString(DevFmtStereo), hrtf->sampleRate); - -done: - ATOMIC_FLAG_CLEAR(&LoadedHrtfLock, almemory_order_seq_cst); - return hrtf; -} - - -void Hrtf_IncRef(struct Hrtf *hrtf) -{ - uint ref = IncrementRef(&hrtf->ref); - TRACEREF("%p increasing refcount to %u\n", hrtf, ref); -} - -void Hrtf_DecRef(struct Hrtf *hrtf) -{ - struct HrtfEntry *Hrtf; - uint ref = DecrementRef(&hrtf->ref); - TRACEREF("%p decreasing refcount to %u\n", hrtf, ref); - if(ref == 0) - { - while(ATOMIC_FLAG_TEST_AND_SET(&LoadedHrtfLock, almemory_order_seq_cst)) - althrd_yield(); - - Hrtf = LoadedHrtfs; - while(Hrtf != NULL) - { - /* Need to double-check that it's still unused, as another device - * could've reacquired this HRTF after its reference went to 0 and - * before the lock was taken. - */ - if(hrtf == Hrtf->handle && ReadRef(&hrtf->ref) == 0) - { - al_free(Hrtf->handle); - Hrtf->handle = NULL; - TRACE("Unloaded unused HRTF %s\n", Hrtf->filename); - } - Hrtf = Hrtf->next; - } - - ATOMIC_FLAG_CLEAR(&LoadedHrtfLock, almemory_order_seq_cst); - } -} - - -void FreeHrtfs(void) -{ - struct HrtfEntry *Hrtf = LoadedHrtfs; - LoadedHrtfs = NULL; - - while(Hrtf != NULL) - { - struct HrtfEntry *next = Hrtf->next; - al_free(Hrtf->handle); - al_free(Hrtf); - Hrtf = next; - } -} diff --git a/Alc/hrtf.h b/Alc/hrtf.h deleted file mode 100644 index ab68929..0000000 --- a/Alc/hrtf.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef ALC_HRTF_H -#define ALC_HRTF_H - -#include "AL/al.h" -#include "AL/alc.h" - -#include "alMain.h" -#include "alstring.h" -#include "atomic.h" - - -#define HRTF_HISTORY_BITS (6) -#define HRTF_HISTORY_LENGTH (1< - - -#ifdef __GNUC__ -#define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z)))) -#else -#define DECL_FORMAT(x, y, z) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -extern FILE *LogFile; - -#if defined(__GNUC__) && !defined(_WIN32) -#define AL_PRINT(T, MSG, ...) fprintf(LogFile, "AL lib: %s %s: "MSG, T, __FUNCTION__ , ## __VA_ARGS__) -#else -void al_print(const char *type, const char *func, const char *fmt, ...) DECL_FORMAT(printf, 3,4); -#define AL_PRINT(T, ...) al_print((T), __FUNCTION__, __VA_ARGS__) -#endif - -#ifdef __ANDROID__ -#include -#define LOG_ANDROID(T, MSG, ...) __android_log_print(T, "openal", "AL lib: %s: "MSG, __FUNCTION__ , ## __VA_ARGS__) -#else -#define LOG_ANDROID(T, MSG, ...) ((void)0) -#endif - -enum LogLevel { - NoLog, - LogError, - LogWarning, - LogTrace, - LogRef -}; -extern enum LogLevel LogLevel; - -#define TRACEREF(...) do { \ - if(LogLevel >= LogRef) \ - AL_PRINT("(--)", __VA_ARGS__); \ -} while(0) - -#define TRACE(...) do { \ - if(LogLevel >= LogTrace) \ - AL_PRINT("(II)", __VA_ARGS__); \ - LOG_ANDROID(ANDROID_LOG_DEBUG, __VA_ARGS__); \ -} while(0) - -#define WARN(...) do { \ - if(LogLevel >= LogWarning) \ - AL_PRINT("(WW)", __VA_ARGS__); \ - LOG_ANDROID(ANDROID_LOG_WARN, __VA_ARGS__); \ -} while(0) - -#define ERR(...) do { \ - if(LogLevel >= LogError) \ - AL_PRINT("(EE)", __VA_ARGS__); \ - LOG_ANDROID(ANDROID_LOG_ERROR, __VA_ARGS__); \ -} while(0) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LOGGING_H */ diff --git a/Alc/mastering.c b/Alc/mastering.c deleted file mode 100644 index 1636c8d..0000000 --- a/Alc/mastering.c +++ /dev/null @@ -1,232 +0,0 @@ -#include "config.h" - -#include - -#include "mastering.h" -#include "alu.h" -#include "almalloc.h" - - -extern inline ALuint GetCompressorSampleRate(const Compressor *Comp); - -#define RMS_WINDOW_SIZE (1<<7) -#define RMS_WINDOW_MASK (RMS_WINDOW_SIZE-1) -#define RMS_VALUE_MAX (1<<24) - -static_assert(RMS_VALUE_MAX < (UINT_MAX / RMS_WINDOW_SIZE), "RMS_VALUE_MAX is too big"); - - -/* Multichannel compression is linked via one of two modes: - * - * Summed - Absolute sum of all channels. - * Maxed - Absolute maximum of any channel. - */ -static void SumChannels(Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]) -{ - ALsizei c, i; - - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = 0.0f; - - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] += OutBuffer[c][i]; - } - - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = fabsf(Comp->Envelope[i]); -} - -static void MaxChannels(Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]) -{ - ALsizei c, i; - - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = 0.0f; - - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = maxf(Comp->Envelope[i], fabsf(OutBuffer[c][i])); - } -} - -/* Envelope detection/sensing can be done via: - * - * RMS - Rectangular windowed root mean square of linking stage. - * Peak - Implicit output from linking stage. - */ -static void RmsDetection(Compressor *Comp, const ALsizei SamplesToDo) -{ - ALuint sum = Comp->RmsSum; - ALuint *window = Comp->RmsWindow; - ALsizei index = Comp->RmsIndex; - ALsizei i; - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat sig = Comp->Envelope[i]; - - sum -= window[index]; - window[index] = fastf2i(minf(sig * sig * 65536.0f, RMS_VALUE_MAX)); - sum += window[index]; - index = (index + 1) & RMS_WINDOW_MASK; - - Comp->Envelope[i] = sqrtf(sum / 65536.0f / RMS_WINDOW_SIZE); - } - - Comp->RmsSum = sum; - Comp->RmsIndex = index; -} - -/* This isn't a very sophisticated envelope follower, but it gets the job - * done. First, it operates at logarithmic scales to keep transitions - * appropriate for human hearing. Second, it can apply adaptive (automated) - * attack/release adjustments based on the signal. - */ -static void FollowEnvelope(Compressor *Comp, const ALsizei SamplesToDo) -{ - ALfloat attackMin = Comp->AttackMin; - ALfloat attackMax = Comp->AttackMax; - ALfloat releaseMin = Comp->ReleaseMin; - ALfloat releaseMax = Comp->ReleaseMax; - ALfloat last = Comp->EnvLast; - ALsizei i; - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat env = log10f(maxf(Comp->Envelope[i], 0.000001f)); - ALfloat slope = minf(1.0f, fabsf(env - last) / 4.5f); - - if(env > last) - last = minf(env, last + lerp(attackMin, attackMax, 1.0f - (slope * slope))); - else - last = maxf(env, last + lerp(releaseMin, releaseMax, 1.0f - (slope * slope))); - - Comp->Envelope[i] = last; - } - - Comp->EnvLast = last; -} - -/* The envelope is converted to control gain with an optional soft knee. */ -static void EnvelopeGain(Compressor *Comp, const ALsizei SamplesToDo, const ALfloat Slope) -{ - const ALfloat threshold = Comp->Threshold; - const ALfloat knee = Comp->Knee; - ALsizei i; - - if(!(knee > 0.0f)) - { - for(i = 0;i < SamplesToDo;i++) - { - ALfloat gain = Slope * (threshold - Comp->Envelope[i]); - Comp->Envelope[i] = powf(10.0f, minf(0.0f, gain)); - } - } - else - { - const ALfloat lower = threshold - (0.5f * knee); - const ALfloat upper = threshold + (0.5f * knee); - const ALfloat m = 0.5f * Slope / knee; - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat env = Comp->Envelope[i]; - ALfloat gain; - - if(env > lower && env < upper) - gain = m * (env - lower) * (lower - env); - else - gain = Slope * (threshold - env); - - Comp->Envelope[i] = powf(10.0f, minf(0.0f, gain)); - } - } -} - - -Compressor *CompressorInit(const ALfloat PreGainDb, const ALfloat PostGainDb, - const ALboolean SummedLink, const ALboolean RmsSensing, - const ALfloat AttackTimeMin, const ALfloat AttackTimeMax, - const ALfloat ReleaseTimeMin, const ALfloat ReleaseTimeMax, - const ALfloat Ratio, const ALfloat ThresholdDb, - const ALfloat KneeDb, const ALuint SampleRate) -{ - Compressor *Comp; - size_t size; - ALsizei i; - - size = sizeof(*Comp); - if(RmsSensing) - size += sizeof(Comp->RmsWindow[0]) * RMS_WINDOW_SIZE; - Comp = al_calloc(16, size); - - Comp->PreGain = powf(10.0f, PreGainDb / 20.0f); - Comp->PostGain = powf(10.0f, PostGainDb / 20.0f); - Comp->SummedLink = SummedLink; - Comp->AttackMin = 1.0f / maxf(0.000001f, AttackTimeMin * SampleRate * logf(10.0f)); - Comp->AttackMax = 1.0f / maxf(0.000001f, AttackTimeMax * SampleRate * logf(10.0f)); - Comp->ReleaseMin = -1.0f / maxf(0.000001f, ReleaseTimeMin * SampleRate * logf(10.0f)); - Comp->ReleaseMax = -1.0f / maxf(0.000001f, ReleaseTimeMax * SampleRate * logf(10.0f)); - Comp->Ratio = Ratio; - Comp->Threshold = ThresholdDb / 20.0f; - Comp->Knee = maxf(0.0f, KneeDb / 20.0f); - Comp->SampleRate = SampleRate; - - Comp->RmsSum = 0; - if(RmsSensing) - Comp->RmsWindow = (ALuint*)(Comp+1); - else - Comp->RmsWindow = NULL; - Comp->RmsIndex = 0; - - for(i = 0;i < BUFFERSIZE;i++) - Comp->Envelope[i] = 0.0f; - Comp->EnvLast = -6.0f; - - return Comp; -} - -void ApplyCompression(Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]) -{ - ALsizei c, i; - - if(Comp->PreGain != 1.0f) - { - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - OutBuffer[c][i] *= Comp->PreGain; - } - } - - if(Comp->SummedLink) - SumChannels(Comp, NumChans, SamplesToDo, OutBuffer); - else - MaxChannels(Comp, NumChans, SamplesToDo, OutBuffer); - - if(Comp->RmsWindow) - RmsDetection(Comp, SamplesToDo); - FollowEnvelope(Comp, SamplesToDo); - - if(Comp->Ratio > 0.0f) - EnvelopeGain(Comp, SamplesToDo, 1.0f - (1.0f / Comp->Ratio)); - else - EnvelopeGain(Comp, SamplesToDo, 1.0f); - - if(Comp->PostGain != 1.0f) - { - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] *= Comp->PostGain; - } - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - OutBuffer[c][i] *= Comp->Envelope[i]; - } -} diff --git a/Alc/mastering.h b/Alc/mastering.h deleted file mode 100644 index 0a7b490..0000000 --- a/Alc/mastering.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef MASTERING_H -#define MASTERING_H - -#include "AL/al.h" - -/* For BUFFERSIZE. */ -#include "alMain.h" - -typedef struct Compressor { - ALfloat PreGain; - ALfloat PostGain; - ALboolean SummedLink; - ALfloat AttackMin; - ALfloat AttackMax; - ALfloat ReleaseMin; - ALfloat ReleaseMax; - ALfloat Ratio; - ALfloat Threshold; - ALfloat Knee; - ALuint SampleRate; - - ALuint RmsSum; - ALuint *RmsWindow; - ALsizei RmsIndex; - ALfloat Envelope[BUFFERSIZE]; - ALfloat EnvLast; -} Compressor; - -/* The compressor requires the following information for proper - * initialization: - * - * PreGainDb - Gain applied before detection (in dB). - * PostGainDb - Gain applied after compression (in dB). - * SummedLink - Whether to use summed (true) or maxed (false) linking. - * RmsSensing - Whether to use RMS (true) or Peak (false) sensing. - * AttackTimeMin - Minimum attack time (in seconds). - * AttackTimeMax - Maximum attack time. Automates when min != max. - * ReleaseTimeMin - Minimum release time (in seconds). - * ReleaseTimeMax - Maximum release time. Automates when min != max. - * Ratio - Compression ratio (x:1). Set to 0 for true limiter. - * ThresholdDb - Triggering threshold (in dB). - * KneeDb - Knee width (below threshold; in dB). - * SampleRate - Sample rate to process. - */ -Compressor *CompressorInit(const ALfloat PreGainDb, const ALfloat PostGainDb, - const ALboolean SummedLink, const ALboolean RmsSensing, const ALfloat AttackTimeMin, - const ALfloat AttackTimeMax, const ALfloat ReleaseTimeMin, const ALfloat ReleaseTimeMax, - const ALfloat Ratio, const ALfloat ThresholdDb, const ALfloat KneeDb, - const ALuint SampleRate); - -void ApplyCompression(struct Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]); - -inline ALuint GetCompressorSampleRate(const Compressor *Comp) -{ return Comp->SampleRate; } - -#endif /* MASTERING_H */ diff --git a/Alc/mixer/defs.h b/Alc/mixer/defs.h deleted file mode 100644 index fe19cef..0000000 --- a/Alc/mixer/defs.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef MIXER_DEFS_H -#define MIXER_DEFS_H - -#include "AL/alc.h" -#include "AL/al.h" -#include "alMain.h" -#include "alu.h" - -struct MixGains; - -struct MixHrtfParams; -struct HrtfState; - -/* C resamplers */ -const ALfloat *Resample_copy_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_point_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_lerp_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_cubic_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); - - -/* C mixers */ -void MixHrtf_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, struct MixHrtfParams *hrtfparams, - struct HrtfState *hrtfstate, ALsizei BufferSize); -void MixHrtfBlend_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -void MixDirectHrtf_C(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize); -void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); - -/* SSE mixers */ -void MixHrtf_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, struct MixHrtfParams *hrtfparams, - struct HrtfState *hrtfstate, ALsizei BufferSize); -void MixHrtfBlend_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -void MixDirectHrtf_SSE(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize); -void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); - -/* SSE resamplers */ -inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) -{ - ALsizei i; - - pos_arr[0] = 0; - frac_arr[0] = frac; - for(i = 1;i < size;i++) - { - ALint frac_tmp = frac_arr[i-1] + increment; - pos_arr[i] = pos_arr[i-1] + (frac_tmp>>FRACTIONBITS); - frac_arr[i] = frac_tmp&FRACTIONMASK; - } -} - -const ALfloat *Resample_lerp_SSE2(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_lerp_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); - -const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); - -/* Neon mixers */ -void MixHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, struct MixHrtfParams *hrtfparams, - struct HrtfState *hrtfstate, ALsizei BufferSize); -void MixHrtfBlend_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -void MixDirectHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize); -void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); - -/* Neon resamplers */ -const ALfloat *Resample_lerp_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); - -#endif /* MIXER_DEFS_H */ diff --git a/Alc/mixer/hrtf_inc.c b/Alc/mixer/hrtf_inc.c deleted file mode 100644 index 3ef22f2..0000000 --- a/Alc/mixer/hrtf_inc.c +++ /dev/null @@ -1,128 +0,0 @@ -#include "config.h" - -#include "alMain.h" -#include "alSource.h" - -#include "hrtf.h" -#include "align.h" -#include "alu.h" -#include "defs.h" - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei irSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right); - - -void MixHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, MixHrtfParams *hrtfparams, HrtfState *hrtfstate, - ALsizei BufferSize) -{ - const ALfloat (*Coeffs)[2] = ASSUME_ALIGNED(hrtfparams->Coeffs, 16); - const ALsizei Delay[2] = { hrtfparams->Delay[0], hrtfparams->Delay[1] }; - const ALfloat gainstep = hrtfparams->GainStep; - const ALfloat gain = hrtfparams->Gain; - ALfloat g, stepcount = 0.0f; - ALfloat left, right; - ALsizei i; - - ASSUME(IrSize >= 4); - ASSUME(BufferSize > 0); - - LeftOut += OutPos; - RightOut += OutPos; - for(i = 0;i < BufferSize;i++) - { - hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); - - g = gain + gainstep*stepcount; - left = hrtfstate->History[(Offset-Delay[0])&HRTF_HISTORY_MASK]*g; - right = hrtfstate->History[(Offset-Delay[1])&HRTF_HISTORY_MASK]*g; - - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; - - ApplyCoeffs(Offset, hrtfstate->Values, IrSize, Coeffs, left, right); - *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; - *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; - - stepcount += 1.0f; - Offset++; - } - hrtfparams->Gain = gain + gainstep*stepcount; -} - -void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize) -{ - const ALfloat (*OldCoeffs)[2] = ASSUME_ALIGNED(oldparams->Coeffs, 16); - const ALsizei OldDelay[2] = { oldparams->Delay[0], oldparams->Delay[1] }; - const ALfloat oldGain = oldparams->Gain; - const ALfloat oldGainStep = -oldGain / (ALfloat)BufferSize; - const ALfloat (*NewCoeffs)[2] = ASSUME_ALIGNED(newparams->Coeffs, 16); - const ALsizei NewDelay[2] = { newparams->Delay[0], newparams->Delay[1] }; - const ALfloat newGain = newparams->Gain; - const ALfloat newGainStep = newparams->GainStep; - ALfloat g, stepcount = 0.0f; - ALfloat left, right; - ALsizei i; - - ASSUME(IrSize >= 4); - ASSUME(BufferSize > 0); - - LeftOut += OutPos; - RightOut += OutPos; - for(i = 0;i < BufferSize;i++) - { - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; - hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; - - hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); - - g = oldGain + oldGainStep*stepcount; - left = hrtfstate->History[(Offset-OldDelay[0])&HRTF_HISTORY_MASK]*g; - right = hrtfstate->History[(Offset-OldDelay[1])&HRTF_HISTORY_MASK]*g; - ApplyCoeffs(Offset, hrtfstate->Values, IrSize, OldCoeffs, left, right); - - g = newGain + newGainStep*stepcount; - left = hrtfstate->History[(Offset-NewDelay[0])&HRTF_HISTORY_MASK]*g; - right = hrtfstate->History[(Offset-NewDelay[1])&HRTF_HISTORY_MASK]*g; - ApplyCoeffs(Offset, hrtfstate->Values, IrSize, NewCoeffs, left, right); - - *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; - *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; - - stepcount += 1.0f; - Offset++; - } - newparams->Gain = newGain + newGainStep*stepcount; -} - -void MixDirectHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2], - ALsizei BufferSize) -{ - ALfloat insample; - ALsizei i; - - ASSUME(IrSize >= 4); - ASSUME(BufferSize > 0); - - for(i = 0;i < BufferSize;i++) - { - Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f; - Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f; - Offset++; - - insample = *(data++); - ApplyCoeffs(Offset, Values, IrSize, Coeffs, insample, insample); - *(LeftOut++) += Values[Offset&HRIR_MASK][0]; - *(RightOut++) += Values[Offset&HRIR_MASK][1]; - } -} diff --git a/Alc/mixer/mixer_c.c b/Alc/mixer/mixer_c.c deleted file mode 100644 index 25149e0..0000000 --- a/Alc/mixer/mixer_c.c +++ /dev/null @@ -1,179 +0,0 @@ -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" -#include "alSource.h" -#include "alAuxEffectSlot.h" -#include "defs.h" - - -static inline ALfloat do_point(const ALfloat *restrict vals, ALsizei UNUSED(frac)) -{ return vals[0]; } -static inline ALfloat do_lerp(const ALfloat *restrict vals, ALsizei frac) -{ return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } -static inline ALfloat do_cubic(const ALfloat *restrict vals, ALsizei frac) -{ return cubic(vals[0], vals[1], vals[2], vals[3], frac * (1.0f/FRACTIONONE)); } - -const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), - ALfloat *restrict dst, ALsizei numsamples) -{ -#if defined(HAVE_SSE) || defined(HAVE_NEON) - /* Avoid copying the source data if it's aligned like the destination. */ - if((((intptr_t)src)&15) == (((intptr_t)dst)&15)) - return src; -#endif - memcpy(dst, src, numsamples*sizeof(ALfloat)); - return dst; -} - -#define DECL_TEMPLATE(Tag, Sampler, O) \ -const ALfloat *Resample_##Tag##_C(const InterpState* UNUSED(state), \ - const ALfloat *restrict src, ALsizei frac, ALint increment, \ - ALfloat *restrict dst, ALsizei numsamples) \ -{ \ - ALsizei i; \ - \ - src -= O; \ - for(i = 0;i < numsamples;i++) \ - { \ - dst[i] = Sampler(src, frac); \ - \ - frac += increment; \ - src += frac>>FRACTIONBITS; \ - frac &= FRACTIONMASK; \ - } \ - return dst; \ -} - -DECL_TEMPLATE(point, do_point, 0) -DECL_TEMPLATE(lerp, do_lerp, 0) -DECL_TEMPLATE(cubic, do_cubic, 1) - -#undef DECL_TEMPLATE - -const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) -{ - const ALfloat *fil, *scd, *phd, *spd; - const ALfloat *const filter = state->bsinc.filter; - const ALfloat sf = state->bsinc.sf; - const ALsizei m = state->bsinc.m; - ALsizei j_f, pi, i; - ALfloat pf, r; - - ASSUME(m > 0); - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - ALsizei c; - for(c = 0;c < IrSize;c++) - { - const ALsizei off = (Offset+c)&HRIR_MASK; - Values[off][0] += Coeffs[c][0] * left; - Values[off][1] += Coeffs[c][1] * right; - } -} - -#define MixHrtf MixHrtf_C -#define MixHrtfBlend MixHrtfBlend_C -#define MixDirectHrtf MixDirectHrtf_C -#include "hrtf_inc.c" - - -void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - ALfloat gain, delta, step; - ALsizei c; - - ASSUME(OutChans > 0); - ASSUME(BufferSize > 0); - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - ALfloat step_count = 0.0f; - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos] * (gain + step*step_count); - step_count += 1.0f; - } - if(pos == Counter) - gain = TargetGains[c]; - else - gain += step*step_count; - CurrentGains[c] = gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -/* Basically the inverse of the above. Rather than one input going to multiple - * outputs (each with its own gain), it's multiple inputs (each with its own - * gain) going to one output. This applies one row (vs one column) of a matrix - * transform. And as the matrices are more or less static once set up, no - * stepping is necessary. - */ -void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - ALsizei c, i; - - ASSUME(InChans > 0); - ASSUME(BufferSize > 0); - - for(c = 0;c < InChans;c++) - { - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - for(i = 0;i < BufferSize;i++) - OutBuffer[i] += data[c][InPos+i] * gain; - } -} diff --git a/Alc/mixer/mixer_neon.c b/Alc/mixer/mixer_neon.c deleted file mode 100644 index db61fd4..0000000 --- a/Alc/mixer/mixer_neon.c +++ /dev/null @@ -1,283 +0,0 @@ -#include "config.h" - -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alu.h" -#include "hrtf.h" -#include "defs.h" - - -const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const int32x4_t increment4 = vdupq_n_s32(increment*4); - const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); - const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); - alignas(16) ALint pos_[4]; - alignas(16) ALsizei frac_[4]; - int32x4_t pos4, frac4; - ALsizei todo, pos, i; - - ASSUME(numsamples > 0); - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - frac4 = vld1q_s32(frac_); - pos4 = vld1q_s32(pos_); - - todo = numsamples & ~3; - for(i = 0;i < todo;i += 4) - { - const int pos0 = vgetq_lane_s32(pos4, 0); - const int pos1 = vgetq_lane_s32(pos4, 1); - const int pos2 = vgetq_lane_s32(pos4, 2); - const int pos3 = vgetq_lane_s32(pos4, 3); - const float32x4_t val1 = (float32x4_t){src[pos0], src[pos1], src[pos2], src[pos3]}; - const float32x4_t val2 = (float32x4_t){src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]}; - - /* val1 + (val2-val1)*mu */ - const float32x4_t r0 = vsubq_f32(val2, val1); - const float32x4_t mu = vmulq_f32(vcvtq_f32_s32(frac4), fracOne4); - const float32x4_t out = vmlaq_f32(val1, mu, r0); - - vst1q_f32(&dst[i], out); - - frac4 = vaddq_s32(frac4, increment4); - pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); - frac4 = vandq_s32(frac4, fracMask4); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = vgetq_lane_s32(pos4, 0); - frac = vgetq_lane_s32(frac4, 0); - - for(;i < numsamples;++i) - { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - -const ALfloat *Resample_bsinc_Neon(const InterpState *state, - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei dstlen) -{ - const ALfloat *const filter = state->bsinc.filter; - const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); - const ALsizei m = state->bsinc.m; - const float32x4_t *fil, *scd, *phd, *spd; - ALsizei pi, i, j, offset; - float32x4_t r4; - ALfloat pf; - - ASSUME(m > 0); - ASSUME(dstlen > 0); - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<> 2; - const float32x4_t pf4 = vdupq_n_f32(pf); - - ASSUME(count > 0); - - for(j = 0;j < count;j++) - { - /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ - const float32x4_t f4 = vmlaq_f32( - vmlaq_f32(fil[j], sf4, scd[j]), - pf4, vmlaq_f32(phd[j], sf4, spd[j]) - ); - /* r += f*src */ - r4 = vmlaq_f32(r4, f4, vld1q_f32(&src[j*4])); - } - } - r4 = vaddq_f32(r4, vcombine_f32(vrev64_f32(vget_high_f32(r4)), - vrev64_f32(vget_low_f32(r4)))); - dst[i] = vget_lane_f32(vadd_f32(vget_low_f32(r4), vget_high_f32(r4)), 0); - - frac += increment; - src += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - ALsizei c; - float32x4_t leftright4; - { - float32x2_t leftright2 = vdup_n_f32(0.0); - leftright2 = vset_lane_f32(left, leftright2, 0); - leftright2 = vset_lane_f32(right, leftright2, 1); - leftright4 = vcombine_f32(leftright2, leftright2); - } - Values = ASSUME_ALIGNED(Values, 16); - Coeffs = ASSUME_ALIGNED(Coeffs, 16); - for(c = 0;c < IrSize;c += 2) - { - const ALsizei o0 = (Offset+c)&HRIR_MASK; - const ALsizei o1 = (o0+1)&HRIR_MASK; - float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]), - vld1_f32((float32_t*)&Values[o1][0])); - float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]); - - vals = vmlaq_f32(vals, coefs, leftright4); - - vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals)); - vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals)); - } -} - -#define MixHrtf MixHrtf_Neon -#define MixHrtfBlend MixHrtfBlend_Neon -#define MixDirectHrtf MixDirectHrtf_Neon -#include "hrtf_inc.c" - - -void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - const ALfloat delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - ALsizei c; - - ASSUME(OutChans > 0); - ASSUME(BufferSize > 0); - data = ASSUME_ALIGNED(data, 16); - OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - ALfloat gain = CurrentGains[c]; - const ALfloat step = (TargetGains[c] - gain) * delta; - - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - ALfloat step_count = 0.0f; - /* Mix with applying gain steps in aligned multiples of 4. */ - if(LIKELY(minsize > 3)) - { - const float32x4_t four4 = vdupq_n_f32(4.0f); - const float32x4_t step4 = vdupq_n_f32(step); - const float32x4_t gain4 = vdupq_n_f32(gain); - float32x4_t step_count4 = vsetq_lane_f32(0.0f, - vsetq_lane_f32(1.0f, - vsetq_lane_f32(2.0f, - vsetq_lane_f32(3.0f, vdupq_n_f32(0.0f), 3), - 2), 1), 0 - ); - ALsizei todo = minsize >> 2; - - do { - const float32x4_t val4 = vld1q_f32(&data[pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); - dry4 = vmlaq_f32(dry4, val4, vmlaq_f32(gain4, step4, step_count4)); - step_count4 = vaddq_f32(step_count4, four4); - vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); - pos += 4; - } while(--todo); - /* NOTE: step_count4 now represents the next four counts after - * the last four mixed samples, so the lowest element - * represents the next step count to apply. - */ - step_count = vgetq_lane_f32(step_count4, 0); - } - /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos]*(gain + step*step_count); - step_count += 1.0f; - } - if(pos == Counter) - gain = TargetGains[c]; - else - gain += step*step_count; - CurrentGains[c] = gain; - - /* Mix until pos is aligned with 4 or the mix is done. */ - minsize = mini(BufferSize, (pos+3)&~3); - for(;pos < minsize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - if(LIKELY(BufferSize-pos > 3)) - { - ALsizei todo = (BufferSize-pos) >> 2; - const float32x4_t gain4 = vdupq_n_f32(gain); - do { - const float32x4_t val4 = vld1q_f32(&data[pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); - pos += 4; - } while(--todo); - } - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - ALsizei c; - - ASSUME(InChans > 0); - ASSUME(BufferSize > 0); - - for(c = 0;c < InChans;c++) - { - ALsizei pos = 0; - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - if(LIKELY(BufferSize > 3)) - { - ALsizei todo = BufferSize >> 2; - float32x4_t gain4 = vdupq_n_f32(gain); - do { - const float32x4_t val4 = vld1q_f32(&data[c][InPos+pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - vst1q_f32(&OutBuffer[pos], dry4); - pos += 4; - } while(--todo); - } - for(;pos < BufferSize;pos++) - OutBuffer[pos] += data[c][InPos+pos]*gain; - } -} diff --git a/Alc/mixer/mixer_sse.c b/Alc/mixer/mixer_sse.c deleted file mode 100644 index d7d5499..0000000 --- a/Alc/mixer/mixer_sse.c +++ /dev/null @@ -1,249 +0,0 @@ -#include "config.h" - -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alu.h" - -#include "alSource.h" -#include "alAuxEffectSlot.h" -#include "defs.h" - - -const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) -{ - const ALfloat *const filter = state->bsinc.filter; - const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); - const ALsizei m = state->bsinc.m; - const __m128 *fil, *scd, *phd, *spd; - ALsizei pi, i, j, offset; - ALfloat pf; - __m128 r4; - - ASSUME(m > 0); - ASSUME(dstlen > 0); - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<> 2; - const __m128 pf4 = _mm_set1_ps(pf); - - ASSUME(count > 0); - -#define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) - for(j = 0;j < count;j++) - { - /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ - const __m128 f4 = MLA4( - MLA4(fil[j], sf4, scd[j]), - pf4, MLA4(phd[j], sf4, spd[j]) - ); - /* r += f*src */ - r4 = MLA4(r4, f4, _mm_loadu_ps(&src[j*4])); - } -#undef MLA4 - } - r4 = _mm_add_ps(r4, _mm_shuffle_ps(r4, r4, _MM_SHUFFLE(0, 1, 2, 3))); - r4 = _mm_add_ps(r4, _mm_movehl_ps(r4, r4)); - dst[i] = _mm_cvtss_f32(r4); - - frac += increment; - src += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - const __m128 lrlr = _mm_setr_ps(left, right, left, right); - __m128 vals = _mm_setzero_ps(); - __m128 coeffs; - ALsizei i; - - Values = ASSUME_ALIGNED(Values, 16); - Coeffs = ASSUME_ALIGNED(Coeffs, 16); - if((Offset&1)) - { - const ALsizei o0 = Offset&HRIR_MASK; - const ALsizei o1 = (Offset+IrSize-1)&HRIR_MASK; - __m128 imp0, imp1; - - coeffs = _mm_load_ps(&Coeffs[0][0]); - vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]); - imp0 = _mm_mul_ps(lrlr, coeffs); - vals = _mm_add_ps(imp0, vals); - _mm_storel_pi((__m64*)&Values[o0][0], vals); - for(i = 1;i < IrSize-1;i += 2) - { - const ALsizei o2 = (Offset+i)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[i+1][0]); - vals = _mm_load_ps(&Values[o2][0]); - imp1 = _mm_mul_ps(lrlr, coeffs); - imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2)); - vals = _mm_add_ps(imp0, vals); - _mm_store_ps(&Values[o2][0], vals); - imp0 = imp1; - } - vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]); - imp0 = _mm_movehl_ps(imp0, imp0); - vals = _mm_add_ps(imp0, vals); - _mm_storel_pi((__m64*)&Values[o1][0], vals); - } - else - { - for(i = 0;i < IrSize;i += 2) - { - const ALsizei o = (Offset + i)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[i][0]); - vals = _mm_load_ps(&Values[o][0]); - vals = _mm_add_ps(vals, _mm_mul_ps(lrlr, coeffs)); - _mm_store_ps(&Values[o][0], vals); - } - } -} - -#define MixHrtf MixHrtf_SSE -#define MixHrtfBlend MixHrtfBlend_SSE -#define MixDirectHrtf MixDirectHrtf_SSE -#include "hrtf_inc.c" - - -void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - const ALfloat delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - ALsizei c; - - ASSUME(OutChans > 0); - ASSUME(BufferSize > 0); - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - ALfloat gain = CurrentGains[c]; - const ALfloat step = (TargetGains[c] - gain) * delta; - - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - ALfloat step_count = 0.0f; - /* Mix with applying gain steps in aligned multiples of 4. */ - if(LIKELY(minsize > 3)) - { - const __m128 four4 = _mm_set1_ps(4.0f); - const __m128 step4 = _mm_set1_ps(step); - const __m128 gain4 = _mm_set1_ps(gain); - __m128 step_count4 = _mm_setr_ps(0.0f, 1.0f, 2.0f, 3.0f); - ALsizei todo = minsize >> 2; - do { - const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); -#define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) - /* dry += val * (gain + step*step_count) */ - dry4 = MLA4(dry4, val4, MLA4(gain4, step4, step_count4)); -#undef MLA4 - _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); - step_count4 = _mm_add_ps(step_count4, four4); - pos += 4; - } while(--todo); - /* NOTE: step_count4 now represents the next four counts after - * the last four mixed samples, so the lowest element - * represents the next step count to apply. - */ - step_count = _mm_cvtss_f32(step_count4); - } - /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos]*(gain + step*step_count); - step_count += 1.0f; - } - if(pos == Counter) - gain = TargetGains[c]; - else - gain += step*step_count; - CurrentGains[c] = gain; - - /* Mix until pos is aligned with 4 or the mix is done. */ - minsize = mini(BufferSize, (pos+3)&~3); - for(;pos < minsize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - if(LIKELY(BufferSize-pos > 3)) - { - ALsizei todo = (BufferSize-pos) >> 2; - const __m128 gain4 = _mm_set1_ps(gain); - do { - const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); - pos += 4; - } while(--todo); - } - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - ALsizei c; - - ASSUME(InChans > 0); - ASSUME(BufferSize > 0); - - for(c = 0;c < InChans;c++) - { - ALsizei pos = 0; - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - if(LIKELY(BufferSize > 3)) - { - ALsizei todo = BufferSize >> 2; - const __m128 gain4 = _mm_set1_ps(gain); - do { - const __m128 val4 = _mm_load_ps(&data[c][InPos+pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - _mm_store_ps(&OutBuffer[pos], dry4); - pos += 4; - } while(--todo); - } - for(;pos < BufferSize;pos++) - OutBuffer[pos] += data[c][InPos+pos]*gain; - } -} diff --git a/Alc/mixer/mixer_sse2.c b/Alc/mixer/mixer_sse2.c deleted file mode 100644 index 629e0ec..0000000 --- a/Alc/mixer/mixer_sse2.c +++ /dev/null @@ -1,85 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2014 by Timothy Arceri . - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alu.h" -#include "defs.h" - - -const ALfloat *Resample_lerp_SSE2(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - ALint pos_[4]; - ALsizei frac_[4]; - __m128i frac4, pos4; - ALsizei todo, pos, i; - - ASSUME(numsamples > 0); - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - frac4 = _mm_setr_epi32(frac_[0], frac_[1], frac_[2], frac_[3]); - pos4 = _mm_setr_epi32(pos_[0], pos_[1], pos_[2], pos_[3]); - - todo = numsamples & ~3; - for(i = 0;i < todo;i += 4) - { - const int pos0 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(0, 0, 0, 0))); - const int pos1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(1, 1, 1, 1))); - const int pos2 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(2, 2, 2, 2))); - const int pos3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(3, 3, 3, 3))); - const __m128 val1 = _mm_setr_ps(src[pos0 ], src[pos1 ], src[pos2 ], src[pos3 ]); - const __m128 val2 = _mm_setr_ps(src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]); - - /* val1 + (val2-val1)*mu */ - const __m128 r0 = _mm_sub_ps(val2, val1); - const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); - const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = _mm_cvtsi128_si32(pos4); - frac = _mm_cvtsi128_si32(frac4); - - for(;i < numsamples;++i) - { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/Alc/mixer/mixer_sse41.c b/Alc/mixer/mixer_sse41.c deleted file mode 100644 index 128acad..0000000 --- a/Alc/mixer/mixer_sse41.c +++ /dev/null @@ -1,86 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2014 by Timothy Arceri . - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alu.h" -#include "defs.h" - - -const ALfloat *Resample_lerp_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - ALint pos_[4]; - ALsizei frac_[4]; - __m128i frac4, pos4; - ALsizei todo, pos, i; - - ASSUME(numsamples > 0); - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - frac4 = _mm_setr_epi32(frac_[0], frac_[1], frac_[2], frac_[3]); - pos4 = _mm_setr_epi32(pos_[0], pos_[1], pos_[2], pos_[3]); - - todo = numsamples & ~3; - for(i = 0;i < todo;i += 4) - { - const int pos0 = _mm_extract_epi32(pos4, 0); - const int pos1 = _mm_extract_epi32(pos4, 1); - const int pos2 = _mm_extract_epi32(pos4, 2); - const int pos3 = _mm_extract_epi32(pos4, 3); - const __m128 val1 = _mm_setr_ps(src[pos0 ], src[pos1 ], src[pos2 ], src[pos3 ]); - const __m128 val2 = _mm_setr_ps(src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]); - - /* val1 + (val2-val1)*mu */ - const __m128 r0 = _mm_sub_ps(val2, val1); - const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); - const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = _mm_cvtsi128_si32(pos4); - frac = _mm_cvtsi128_si32(frac4); - - for(;i < numsamples;++i) - { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/Alc/mixvoice.c b/Alc/mixvoice.c deleted file mode 100644 index 2d935ce..0000000 --- a/Alc/mixvoice.c +++ /dev/null @@ -1,761 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "AL/al.h" -#include "AL/alc.h" -#include "alSource.h" -#include "alBuffer.h" -#include "alListener.h" -#include "alAuxEffectSlot.h" -#include "sample_cvt.h" -#include "alu.h" -#include "alconfig.h" -#include "ringbuffer.h" - -#include "cpu_caps.h" -#include "mixer/defs.h" - - -static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, - "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); - -extern inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); - - -/* BSinc24 requires up to 23 extra samples before the current position, and 24 after. */ -static_assert(MAX_RESAMPLE_PADDING >= 24, "MAX_RESAMPLE_PADDING must be at least 24!"); - - -enum Resampler ResamplerDefault = LinearResampler; - -MixerFunc MixSamples = Mix_C; -RowMixerFunc MixRowSamples = MixRow_C; -static HrtfMixerFunc MixHrtfSamples = MixHrtf_C; -static HrtfMixerBlendFunc MixHrtfBlendSamples = MixHrtfBlend_C; - -static MixerFunc SelectMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Mix_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return Mix_SSE; -#endif - return Mix_C; -} - -static RowMixerFunc SelectRowMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixRow_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixRow_SSE; -#endif - return MixRow_C; -} - -static inline HrtfMixerFunc SelectHrtfMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixHrtf_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixHrtf_SSE; -#endif - return MixHrtf_C; -} - -static inline HrtfMixerBlendFunc SelectHrtfBlendMixer(void) -{ -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return MixHrtfBlend_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return MixHrtfBlend_SSE; -#endif - return MixHrtfBlend_C; -} - -ResamplerFunc SelectResampler(enum Resampler resampler) -{ - switch(resampler) - { - case PointResampler: - return Resample_point_C; - case LinearResampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_lerp_Neon; -#endif -#ifdef HAVE_SSE4_1 - if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_lerp_SSE41; -#endif -#ifdef HAVE_SSE2 - if((CPUCapFlags&CPU_CAP_SSE2)) - return Resample_lerp_SSE2; -#endif - return Resample_lerp_C; - case FIR4Resampler: - return Resample_cubic_C; - case BSinc12Resampler: - case BSinc24Resampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_bsinc_Neon; -#endif -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - return Resample_bsinc_SSE; -#endif - return Resample_bsinc_C; - } - - return Resample_point_C; -} - - -void aluInitMixer(void) -{ - const char *str; - - if(ConfigValueStr(NULL, NULL, "resampler", &str)) - { - if(strcasecmp(str, "point") == 0 || strcasecmp(str, "none") == 0) - ResamplerDefault = PointResampler; - else if(strcasecmp(str, "linear") == 0) - ResamplerDefault = LinearResampler; - else if(strcasecmp(str, "cubic") == 0) - ResamplerDefault = FIR4Resampler; - else if(strcasecmp(str, "bsinc12") == 0) - ResamplerDefault = BSinc12Resampler; - else if(strcasecmp(str, "bsinc24") == 0) - ResamplerDefault = BSinc24Resampler; - else if(strcasecmp(str, "bsinc") == 0) - { - WARN("Resampler option \"%s\" is deprecated, using bsinc12\n", str); - ResamplerDefault = BSinc12Resampler; - } - else if(strcasecmp(str, "sinc4") == 0 || strcasecmp(str, "sinc8") == 0) - { - WARN("Resampler option \"%s\" is deprecated, using cubic\n", str); - ResamplerDefault = FIR4Resampler; - } - else - { - char *end; - long n = strtol(str, &end, 0); - if(*end == '\0' && (n == PointResampler || n == LinearResampler || n == FIR4Resampler)) - ResamplerDefault = n; - else - WARN("Invalid resampler: %s\n", str); - } - } - - MixHrtfBlendSamples = SelectHrtfBlendMixer(); - MixHrtfSamples = SelectHrtfMixer(); - MixSamples = SelectMixer(); - MixRowSamples = SelectRowMixer(); -} - - -static void SendAsyncEvent(ALCcontext *context, ALuint enumtype, ALenum type, - ALuint objid, ALuint param, const char *msg) -{ - AsyncEvent evt; - evt.EnumType = enumtype; - evt.Type = type; - evt.ObjectId = objid; - evt.Param = param; - strcpy(evt.Message, msg); - if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) - alsem_post(&context->EventSem); -} - - -static inline ALfloat Sample_ALubyte(ALubyte val) -{ return (val-128) * (1.0f/128.0f); } - -static inline ALfloat Sample_ALshort(ALshort val) -{ return val * (1.0f/32768.0f); } - -static inline ALfloat Sample_ALfloat(ALfloat val) -{ return val; } - -static inline ALfloat Sample_ALdouble(ALdouble val) -{ return (ALfloat)val; } - -typedef ALubyte ALmulaw; -static inline ALfloat Sample_ALmulaw(ALmulaw val) -{ return muLawDecompressionTable[val] * (1.0f/32768.0f); } - -typedef ALubyte ALalaw; -static inline ALfloat Sample_ALalaw(ALalaw val) -{ return aLawDecompressionTable[val] * (1.0f/32768.0f); } - -#define DECL_TEMPLATE(T) \ -static inline void Load_##T(ALfloat *restrict dst, const T *restrict src, \ - ALint srcstep, ALsizei samples) \ -{ \ - ALsizei i; \ - for(i = 0;i < samples;i++) \ - dst[i] += Sample_##T(src[i*srcstep]); \ -} - -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) - -#undef DECL_TEMPLATE - -static void LoadSamples(ALfloat *restrict dst, const ALvoid *restrict src, ALint srcstep, - enum FmtType srctype, ALsizei samples) -{ -#define HANDLE_FMT(ET, ST) case ET: Load_##ST(dst, src, srcstep, samples); break - switch(srctype) - { - HANDLE_FMT(FmtUByte, ALubyte); - HANDLE_FMT(FmtShort, ALshort); - HANDLE_FMT(FmtFloat, ALfloat); - HANDLE_FMT(FmtDouble, ALdouble); - HANDLE_FMT(FmtMulaw, ALmulaw); - HANDLE_FMT(FmtAlaw, ALalaw); - } -#undef HANDLE_FMT -} - - -static const ALfloat *DoFilters(BiquadFilter *lpfilter, BiquadFilter *hpfilter, - ALfloat *restrict dst, const ALfloat *restrict src, - ALsizei numsamples, enum ActiveFilters type) -{ - ALsizei i; - switch(type) - { - case AF_None: - BiquadFilter_passthru(lpfilter, numsamples); - BiquadFilter_passthru(hpfilter, numsamples); - break; - - case AF_LowPass: - BiquadFilter_process(lpfilter, dst, src, numsamples); - BiquadFilter_passthru(hpfilter, numsamples); - return dst; - case AF_HighPass: - BiquadFilter_passthru(lpfilter, numsamples); - BiquadFilter_process(hpfilter, dst, src, numsamples); - return dst; - - case AF_BandPass: - for(i = 0;i < numsamples;) - { - ALfloat temp[256]; - ALsizei todo = mini(256, numsamples-i); - - BiquadFilter_process(lpfilter, temp, src+i, todo); - BiquadFilter_process(hpfilter, dst+i, temp, todo); - i += todo; - } - return dst; - } - return src; -} - - -/* This function uses these device temp buffers. */ -#define SOURCE_DATA_BUF 0 -#define RESAMPLED_BUF 1 -#define FILTERED_BUF 2 -#define NFC_DATA_BUF 3 -ALboolean MixSource(ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo) -{ - ALCdevice *Device = Context->Device; - ALbufferlistitem *BufferListItem; - ALbufferlistitem *BufferLoopItem; - ALsizei NumChannels, SampleSize; - ALbitfieldSOFT enabledevt; - ALsizei buffers_done = 0; - ResamplerFunc Resample; - ALsizei DataPosInt; - ALsizei DataPosFrac; - ALint64 DataSize64; - ALint increment; - ALsizei Counter; - ALsizei OutPos; - ALsizei IrSize; - bool isplaying; - bool firstpass; - bool isstatic; - ALsizei chan; - ALsizei send; - - /* Get source info */ - isplaying = true; /* Will only be called while playing. */ - isstatic = !!(voice->Flags&VOICE_IS_STATIC); - DataPosInt = ATOMIC_LOAD(&voice->position, almemory_order_acquire); - DataPosFrac = ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed); - BufferListItem = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - BufferLoopItem = ATOMIC_LOAD(&voice->loop_buffer, almemory_order_relaxed); - NumChannels = voice->NumChannels; - SampleSize = voice->SampleSize; - increment = voice->Step; - - IrSize = (Device->HrtfHandle ? Device->HrtfHandle->irSize : 0); - - Resample = ((increment == FRACTIONONE && DataPosFrac == 0) ? - Resample_copy_C : voice->Resampler); - - Counter = (voice->Flags&VOICE_IS_FADING) ? SamplesToDo : 0; - firstpass = true; - OutPos = 0; - - do { - ALsizei SrcBufferSize, DstBufferSize; - - /* Figure out how many buffer samples will be needed */ - DataSize64 = SamplesToDo-OutPos; - DataSize64 *= increment; - DataSize64 += DataPosFrac+FRACTIONMASK; - DataSize64 >>= FRACTIONBITS; - DataSize64 += MAX_RESAMPLE_PADDING*2; - SrcBufferSize = (ALsizei)mini64(DataSize64, BUFFERSIZE); - - /* Figure out how many samples we can actually mix from this. */ - DataSize64 = SrcBufferSize; - DataSize64 -= MAX_RESAMPLE_PADDING*2; - DataSize64 <<= FRACTIONBITS; - DataSize64 -= DataPosFrac; - DstBufferSize = (ALsizei)mini64((DataSize64+(increment-1)) / increment, - SamplesToDo - OutPos); - - /* Some mixers like having a multiple of 4, so try to give that unless - * this is the last update. */ - if(DstBufferSize < SamplesToDo-OutPos) - DstBufferSize &= ~3; - - /* It's impossible to have a buffer list item with no entries. */ - assert(BufferListItem->num_buffers > 0); - - for(chan = 0;chan < NumChannels;chan++) - { - const ALfloat *ResampledData; - ALfloat *SrcData = Device->TempBuffer[SOURCE_DATA_BUF]; - ALsizei FilledAmt; - - /* Load the previous samples into the source data first, and clear the rest. */ - memcpy(SrcData, voice->PrevSamples[chan], MAX_RESAMPLE_PADDING*sizeof(ALfloat)); - memset(SrcData+MAX_RESAMPLE_PADDING, 0, (BUFFERSIZE-MAX_RESAMPLE_PADDING)* - sizeof(ALfloat)); - FilledAmt = MAX_RESAMPLE_PADDING; - - if(isstatic) - { - /* TODO: For static sources, loop points are taken from the - * first buffer (should be adjusted by any buffer offset, to - * possibly be added later). - */ - const ALbuffer *Buffer0 = BufferListItem->buffers[0]; - const ALsizei LoopStart = Buffer0->LoopStart; - const ALsizei LoopEnd = Buffer0->LoopEnd; - const ALsizei LoopSize = LoopEnd - LoopStart; - - /* If current pos is beyond the loop range, do not loop */ - if(!BufferLoopItem || DataPosInt >= LoopEnd) - { - ALsizei SizeToDo = SrcBufferSize - FilledAmt; - ALsizei CompLen = 0; - ALsizei i; - - BufferLoopItem = NULL; - - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - const ALubyte *Data = buffer->data; - ALsizei DataSize; - - if(DataPosInt >= buffer->SampleLen) - continue; - - /* Load what's left to play from the buffer */ - DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); - CompLen = maxi(CompLen, DataSize); - - LoadSamples(&SrcData[FilledAmt], - &Data[(DataPosInt*NumChannels + chan)*SampleSize], - NumChannels, buffer->FmtType, DataSize - ); - } - FilledAmt += CompLen; - } - else - { - ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopEnd - DataPosInt); - ALsizei CompLen = 0; - ALsizei i; - - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - const ALubyte *Data = buffer->data; - ALsizei DataSize; - - if(DataPosInt >= buffer->SampleLen) - continue; - - /* Load what's left of this loop iteration */ - DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); - CompLen = maxi(CompLen, DataSize); - - LoadSamples(&SrcData[FilledAmt], - &Data[(DataPosInt*NumChannels + chan)*SampleSize], - NumChannels, buffer->FmtType, DataSize - ); - } - FilledAmt += CompLen; - - while(SrcBufferSize > FilledAmt) - { - const ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopSize); - - CompLen = 0; - for(i = 0;i < BufferListItem->num_buffers;i++) - { - const ALbuffer *buffer = BufferListItem->buffers[i]; - const ALubyte *Data = buffer->data; - ALsizei DataSize; - - if(LoopStart >= buffer->SampleLen) - continue; - - DataSize = mini(SizeToDo, buffer->SampleLen - LoopStart); - CompLen = maxi(CompLen, DataSize); - - LoadSamples(&SrcData[FilledAmt], - &Data[(LoopStart*NumChannels + chan)*SampleSize], - NumChannels, buffer->FmtType, DataSize - ); - } - FilledAmt += CompLen; - } - } - } - else - { - /* Crawl the buffer queue to fill in the temp buffer */ - ALbufferlistitem *tmpiter = BufferListItem; - ALsizei pos = DataPosInt; - - while(tmpiter && SrcBufferSize > FilledAmt) - { - ALsizei SizeToDo = SrcBufferSize - FilledAmt; - ALsizei i; - - for(i = 0;i < tmpiter->num_buffers;i++) - { - const ALbuffer *ALBuffer = tmpiter->buffers[i]; - ALsizei DataSize = ALBuffer ? ALBuffer->SampleLen : 0; - - if(DataSize > pos) - { - const ALubyte *Data = ALBuffer->data; - Data += (pos*NumChannels + chan)*SampleSize; - - DataSize = minu(SizeToDo, DataSize - pos); - LoadSamples(&SrcData[FilledAmt], Data, NumChannels, - ALBuffer->FmtType, DataSize); - } - } - if(pos > tmpiter->max_samples) - pos -= tmpiter->max_samples; - else - { - FilledAmt += tmpiter->max_samples - pos; - pos = 0; - } - if(SrcBufferSize > FilledAmt) - { - tmpiter = ATOMIC_LOAD(&tmpiter->next, almemory_order_acquire); - if(!tmpiter) tmpiter = BufferLoopItem; - } - } - } - - /* Store the last source samples used for next time. */ - memcpy(voice->PrevSamples[chan], - &SrcData[(increment*DstBufferSize + DataPosFrac)>>FRACTIONBITS], - MAX_RESAMPLE_PADDING*sizeof(ALfloat) - ); - - /* Now resample, then filter and mix to the appropriate outputs. */ - ResampledData = Resample(&voice->ResampleState, - &SrcData[MAX_RESAMPLE_PADDING], DataPosFrac, increment, - Device->TempBuffer[RESAMPLED_BUF], DstBufferSize - ); - { - DirectParams *parms = &voice->Direct.Params[chan]; - const ALfloat *samples; - - samples = DoFilters( - &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], - ResampledData, DstBufferSize, voice->Direct.FilterType - ); - if(!(voice->Flags&VOICE_HAS_HRTF)) - { - if(!Counter) - memcpy(parms->Gains.Current, parms->Gains.Target, - sizeof(parms->Gains.Current)); - if(!(voice->Flags&VOICE_HAS_NFC)) - MixSamples(samples, voice->Direct.Channels, voice->Direct.Buffer, - parms->Gains.Current, parms->Gains.Target, Counter, OutPos, - DstBufferSize - ); - else - { - ALfloat *nfcsamples = Device->TempBuffer[NFC_DATA_BUF]; - ALsizei chanoffset = 0; - - MixSamples(samples, - voice->Direct.ChannelsPerOrder[0], voice->Direct.Buffer, - parms->Gains.Current, parms->Gains.Target, Counter, OutPos, - DstBufferSize - ); - chanoffset += voice->Direct.ChannelsPerOrder[0]; -#define APPLY_NFC_MIX(order) \ - if(voice->Direct.ChannelsPerOrder[order] > 0) \ - { \ - NfcFilterProcess##order(&parms->NFCtrlFilter, nfcsamples, samples, \ - DstBufferSize); \ - MixSamples(nfcsamples, voice->Direct.ChannelsPerOrder[order], \ - voice->Direct.Buffer+chanoffset, parms->Gains.Current+chanoffset, \ - parms->Gains.Target+chanoffset, Counter, OutPos, DstBufferSize \ - ); \ - chanoffset += voice->Direct.ChannelsPerOrder[order]; \ - } - APPLY_NFC_MIX(1) - APPLY_NFC_MIX(2) - APPLY_NFC_MIX(3) -#undef APPLY_NFC_MIX - } - } - else - { - MixHrtfParams hrtfparams; - ALsizei fademix = 0; - int lidx, ridx; - - lidx = GetChannelIdxByName(&Device->RealOut, FrontLeft); - ridx = GetChannelIdxByName(&Device->RealOut, FrontRight); - assert(lidx != -1 && ridx != -1); - - if(!Counter) - { - /* No fading, just overwrite the old HRTF params. */ - parms->Hrtf.Old = parms->Hrtf.Target; - } - else if(!(parms->Hrtf.Old.Gain > GAIN_SILENCE_THRESHOLD)) - { - /* The old HRTF params are silent, so overwrite the old - * coefficients with the new, and reset the old gain to - * 0. The future mix will then fade from silence. - */ - parms->Hrtf.Old = parms->Hrtf.Target; - parms->Hrtf.Old.Gain = 0.0f; - } - else if(firstpass) - { - ALfloat gain; - - /* Fade between the coefficients over 128 samples. */ - fademix = mini(DstBufferSize, 128); - - /* The new coefficients need to fade in completely - * since they're replacing the old ones. To keep the - * gain fading consistent, interpolate between the old - * and new target gains given how much of the fade time - * this mix handles. - */ - gain = lerp(parms->Hrtf.Old.Gain, parms->Hrtf.Target.Gain, - minf(1.0f, (ALfloat)fademix/Counter)); - hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; - hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; - hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; - hrtfparams.Gain = 0.0f; - hrtfparams.GainStep = gain / (ALfloat)fademix; - - MixHrtfBlendSamples( - voice->Direct.Buffer[lidx], voice->Direct.Buffer[ridx], - samples, voice->Offset, OutPos, IrSize, &parms->Hrtf.Old, - &hrtfparams, &parms->Hrtf.State, fademix - ); - /* Update the old parameters with the result. */ - parms->Hrtf.Old = parms->Hrtf.Target; - if(fademix < Counter) - parms->Hrtf.Old.Gain = hrtfparams.Gain; - } - - if(fademix < DstBufferSize) - { - ALsizei todo = DstBufferSize - fademix; - ALfloat gain = parms->Hrtf.Target.Gain; - - /* Interpolate the target gain if the gain fading lasts - * longer than this mix. - */ - if(Counter > DstBufferSize) - gain = lerp(parms->Hrtf.Old.Gain, gain, - (ALfloat)todo/(Counter-fademix)); - - hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; - hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; - hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; - hrtfparams.Gain = parms->Hrtf.Old.Gain; - hrtfparams.GainStep = (gain - parms->Hrtf.Old.Gain) / (ALfloat)todo; - MixHrtfSamples( - voice->Direct.Buffer[lidx], voice->Direct.Buffer[ridx], - samples+fademix, voice->Offset+fademix, OutPos+fademix, IrSize, - &hrtfparams, &parms->Hrtf.State, todo - ); - /* Store the interpolated gain or the final target gain - * depending if the fade is done. - */ - if(DstBufferSize < Counter) - parms->Hrtf.Old.Gain = gain; - else - parms->Hrtf.Old.Gain = parms->Hrtf.Target.Gain; - } - } - } - - for(send = 0;send < Device->NumAuxSends;send++) - { - SendParams *parms = &voice->Send[send].Params[chan]; - const ALfloat *samples; - - if(!voice->Send[send].Buffer) - continue; - - samples = DoFilters( - &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], - ResampledData, DstBufferSize, voice->Send[send].FilterType - ); - - if(!Counter) - memcpy(parms->Gains.Current, parms->Gains.Target, - sizeof(parms->Gains.Current)); - MixSamples(samples, voice->Send[send].Channels, voice->Send[send].Buffer, - parms->Gains.Current, parms->Gains.Target, Counter, OutPos, DstBufferSize - ); - } - } - /* Update positions */ - DataPosFrac += increment*DstBufferSize; - DataPosInt += DataPosFrac>>FRACTIONBITS; - DataPosFrac &= FRACTIONMASK; - - OutPos += DstBufferSize; - voice->Offset += DstBufferSize; - Counter = maxi(DstBufferSize, Counter) - DstBufferSize; - firstpass = false; - - if(isstatic) - { - if(BufferLoopItem) - { - /* Handle looping static source */ - const ALbuffer *Buffer = BufferListItem->buffers[0]; - ALsizei LoopStart = Buffer->LoopStart; - ALsizei LoopEnd = Buffer->LoopEnd; - if(DataPosInt >= LoopEnd) - { - assert(LoopEnd > LoopStart); - DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart; - } - } - else - { - /* Handle non-looping static source */ - if(DataPosInt >= BufferListItem->max_samples) - { - isplaying = false; - BufferListItem = NULL; - DataPosInt = 0; - DataPosFrac = 0; - break; - } - } - } - else while(1) - { - /* Handle streaming source */ - if(BufferListItem->max_samples > DataPosInt) - break; - - buffers_done += BufferListItem->num_buffers; - BufferListItem = ATOMIC_LOAD(&BufferListItem->next, almemory_order_acquire); - if(!BufferListItem && !(BufferListItem=BufferLoopItem)) - { - isplaying = false; - DataPosInt = 0; - DataPosFrac = 0; - break; - } - - DataPosInt -= BufferListItem->max_samples; - } - } while(isplaying && OutPos < SamplesToDo); - - voice->Flags |= VOICE_IS_FADING; - - /* Update source info */ - ATOMIC_STORE(&voice->position, DataPosInt, almemory_order_relaxed); - ATOMIC_STORE(&voice->position_fraction, DataPosFrac, almemory_order_relaxed); - ATOMIC_STORE(&voice->current_buffer, BufferListItem, almemory_order_release); - - /* Send any events now, after the position/buffer info was updated. */ - enabledevt = ATOMIC_LOAD(&Context->EnabledEvts, almemory_order_acquire); - if(buffers_done > 0 && (enabledevt&EventType_BufferCompleted)) - SendAsyncEvent(Context, EventType_BufferCompleted, - AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, SourceID, buffers_done, "Buffer completed" - ); - - return isplaying; -} diff --git a/Alc/panning.c b/Alc/panning.c deleted file mode 100644 index d114295..0000000 --- a/Alc/panning.c +++ /dev/null @@ -1,1265 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2010 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#include - -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alu.h" -#include "alconfig.h" -#include "bool.h" -#include "ambdec.h" -#include "bformatdec.h" -#include "filters/splitter.h" -#include "uhjfilter.h" -#include "bs2b.h" - - -extern inline void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]); -extern inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]); -extern inline float ScaleAzimuthFront(float azimuth, float scale); -extern inline void ComputeDryPanGains(const DryMixParams *dry, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -extern inline void ComputeFirstOrderGains(const BFMixParams *foa, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); - - -static const ALsizei FuMa2ACN[MAX_AMBI_COEFFS] = { - 0, /* W */ - 3, /* X */ - 1, /* Y */ - 2, /* Z */ - 6, /* R */ - 7, /* S */ - 5, /* T */ - 8, /* U */ - 4, /* V */ - 12, /* K */ - 13, /* L */ - 11, /* M */ - 14, /* N */ - 10, /* O */ - 15, /* P */ - 9, /* Q */ -}; -static const ALsizei ACN2ACN[MAX_AMBI_COEFFS] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15 -}; - - -void CalcAmbiCoeffs(const ALfloat y, const ALfloat z, const ALfloat x, const ALfloat spread, - ALfloat coeffs[MAX_AMBI_COEFFS]) -{ - /* Zeroth-order */ - coeffs[0] = 1.0f; /* ACN 0 = 1 */ - /* First-order */ - coeffs[1] = 1.732050808f * y; /* ACN 1 = sqrt(3) * Y */ - coeffs[2] = 1.732050808f * z; /* ACN 2 = sqrt(3) * Z */ - coeffs[3] = 1.732050808f * x; /* ACN 3 = sqrt(3) * X */ - /* Second-order */ - coeffs[4] = 3.872983346f * x * y; /* ACN 4 = sqrt(15) * X * Y */ - coeffs[5] = 3.872983346f * y * z; /* ACN 5 = sqrt(15) * Y * Z */ - coeffs[6] = 1.118033989f * (3.0f*z*z - 1.0f); /* ACN 6 = sqrt(5)/2 * (3*Z*Z - 1) */ - coeffs[7] = 3.872983346f * x * z; /* ACN 7 = sqrt(15) * X * Z */ - coeffs[8] = 1.936491673f * (x*x - y*y); /* ACN 8 = sqrt(15)/2 * (X*X - Y*Y) */ - /* Third-order */ - coeffs[9] = 2.091650066f * y * (3.0f*x*x - y*y); /* ACN 9 = sqrt(35/8) * Y * (3*X*X - Y*Y) */ - coeffs[10] = 10.246950766f * z * x * y; /* ACN 10 = sqrt(105) * Z * X * Y */ - coeffs[11] = 1.620185175f * y * (5.0f*z*z - 1.0f); /* ACN 11 = sqrt(21/8) * Y * (5*Z*Z - 1) */ - coeffs[12] = 1.322875656f * z * (5.0f*z*z - 3.0f); /* ACN 12 = sqrt(7)/2 * Z * (5*Z*Z - 3) */ - coeffs[13] = 1.620185175f * x * (5.0f*z*z - 1.0f); /* ACN 13 = sqrt(21/8) * X * (5*Z*Z - 1) */ - coeffs[14] = 5.123475383f * z * (x*x - y*y); /* ACN 14 = sqrt(105)/2 * Z * (X*X - Y*Y) */ - coeffs[15] = 2.091650066f * x * (x*x - 3.0f*y*y); /* ACN 15 = sqrt(35/8) * X * (X*X - 3*Y*Y) */ - - if(spread > 0.0f) - { - /* Implement the spread by using a spherical source that subtends the - * angle spread. See: - * http://www.ppsloan.org/publications/StupidSH36.pdf - Appendix A3 - * - * When adjusted for N3D normalization instead of SN3D, these - * calculations are: - * - * ZH0 = -sqrt(pi) * (-1+ca); - * ZH1 = 0.5*sqrt(pi) * sa*sa; - * ZH2 = -0.5*sqrt(pi) * ca*(-1+ca)*(ca+1); - * ZH3 = -0.125*sqrt(pi) * (-1+ca)*(ca+1)*(5*ca*ca - 1); - * ZH4 = -0.125*sqrt(pi) * ca*(-1+ca)*(ca+1)*(7*ca*ca - 3); - * ZH5 = -0.0625*sqrt(pi) * (-1+ca)*(ca+1)*(21*ca*ca*ca*ca - 14*ca*ca + 1); - * - * The gain of the source is compensated for size, so that the - * loundness doesn't depend on the spread. Thus: - * - * ZH0 = 1.0f; - * ZH1 = 0.5f * (ca+1.0f); - * ZH2 = 0.5f * (ca+1.0f)*ca; - * ZH3 = 0.125f * (ca+1.0f)*(5.0f*ca*ca - 1.0f); - * ZH4 = 0.125f * (ca+1.0f)*(7.0f*ca*ca - 3.0f)*ca; - * ZH5 = 0.0625f * (ca+1.0f)*(21.0f*ca*ca*ca*ca - 14.0f*ca*ca + 1.0f); - */ - ALfloat ca = cosf(spread * 0.5f); - /* Increase the source volume by up to +3dB for a full spread. */ - ALfloat scale = sqrtf(1.0f + spread/F_TAU); - - ALfloat ZH0_norm = scale; - ALfloat ZH1_norm = 0.5f * (ca+1.f) * scale; - ALfloat ZH2_norm = 0.5f * (ca+1.f)*ca * scale; - ALfloat ZH3_norm = 0.125f * (ca+1.f)*(5.f*ca*ca-1.f) * scale; - - /* Zeroth-order */ - coeffs[0] *= ZH0_norm; - /* First-order */ - coeffs[1] *= ZH1_norm; - coeffs[2] *= ZH1_norm; - coeffs[3] *= ZH1_norm; - /* Second-order */ - coeffs[4] *= ZH2_norm; - coeffs[5] *= ZH2_norm; - coeffs[6] *= ZH2_norm; - coeffs[7] *= ZH2_norm; - coeffs[8] *= ZH2_norm; - /* Third-order */ - coeffs[9] *= ZH3_norm; - coeffs[10] *= ZH3_norm; - coeffs[11] *= ZH3_norm; - coeffs[12] *= ZH3_norm; - coeffs[13] *= ZH3_norm; - coeffs[14] *= ZH3_norm; - coeffs[15] *= ZH3_norm; - } -} - - -void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALsizei numcoeffs, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i, j; - - for(i = 0;i < numchans;i++) - { - float gain = 0.0f; - for(j = 0;j < numcoeffs;j++) - gain += chancoeffs[i][j]*coeffs[j]; - gains[i] = clampf(gain, 0.0f, 1.0f) * ingain; - } - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - -void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i; - - for(i = 0;i < numchans;i++) - gains[i] = chanmap[i].Scale * coeffs[chanmap[i].Index] * ingain; - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - -void ComputeFirstOrderGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i, j; - - for(i = 0;i < numchans;i++) - { - float gain = 0.0f; - for(j = 0;j < 4;j++) - gain += chancoeffs[i][j] * mtx[j]; - gains[i] = clampf(gain, 0.0f, 1.0f) * ingain; - } - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - -void ComputeFirstOrderGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i; - - for(i = 0;i < numchans;i++) - gains[i] = chanmap[i].Scale * mtx[chanmap[i].Index] * ingain; - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - - -static inline const char *GetLabelFromChannel(enum Channel channel) -{ - switch(channel) - { - case FrontLeft: return "front-left"; - case FrontRight: return "front-right"; - case FrontCenter: return "front-center"; - case LFE: return "lfe"; - case BackLeft: return "back-left"; - case BackRight: return "back-right"; - case BackCenter: return "back-center"; - case SideLeft: return "side-left"; - case SideRight: return "side-right"; - - case UpperFrontLeft: return "upper-front-left"; - case UpperFrontRight: return "upper-front-right"; - case UpperBackLeft: return "upper-back-left"; - case UpperBackRight: return "upper-back-right"; - case LowerFrontLeft: return "lower-front-left"; - case LowerFrontRight: return "lower-front-right"; - case LowerBackLeft: return "lower-back-left"; - case LowerBackRight: return "lower-back-right"; - - case Aux0: return "aux-0"; - case Aux1: return "aux-1"; - case Aux2: return "aux-2"; - case Aux3: return "aux-3"; - case Aux4: return "aux-4"; - case Aux5: return "aux-5"; - case Aux6: return "aux-6"; - case Aux7: return "aux-7"; - case Aux8: return "aux-8"; - case Aux9: return "aux-9"; - case Aux10: return "aux-10"; - case Aux11: return "aux-11"; - case Aux12: return "aux-12"; - case Aux13: return "aux-13"; - case Aux14: return "aux-14"; - case Aux15: return "aux-15"; - - case InvalidChannel: break; - } - return "(unknown)"; -} - - -typedef struct ChannelMap { - enum Channel ChanName; - ChannelConfig Config; -} ChannelMap; - -static void SetChannelMap(const enum Channel devchans[MAX_OUTPUT_CHANNELS], - ChannelConfig *ambicoeffs, const ChannelMap *chanmap, - ALsizei count, ALsizei *outcount) -{ - ALsizei maxchans = 0; - ALsizei i, j; - - for(i = 0;i < count;i++) - { - ALint idx = GetChannelIndex(devchans, chanmap[i].ChanName); - if(idx < 0) - { - ERR("Failed to find %s channel in device\n", - GetLabelFromChannel(chanmap[i].ChanName)); - continue; - } - - maxchans = maxi(maxchans, idx+1); - for(j = 0;j < MAX_AMBI_COEFFS;j++) - ambicoeffs[idx][j] = chanmap[i].Config[j]; - } - *outcount = mini(maxchans, MAX_OUTPUT_CHANNELS); -} - -static bool MakeSpeakerMap(ALCdevice *device, const AmbDecConf *conf, ALsizei speakermap[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i; - - for(i = 0;i < conf->NumSpeakers;i++) - { - enum Channel ch; - int chidx = -1; - - /* NOTE: AmbDec does not define any standard speaker names, however - * for this to work we have to by able to find the output channel - * the speaker definition corresponds to. Therefore, OpenAL Soft - * requires these channel labels to be recognized: - * - * LF = Front left - * RF = Front right - * LS = Side left - * RS = Side right - * LB = Back left - * RB = Back right - * CE = Front center - * CB = Back center - * - * Additionally, surround51 will acknowledge back speakers for side - * channels, and surround51rear will acknowledge side speakers for - * back channels, to avoid issues with an ambdec expecting 5.1 to - * use the side channels when the device is configured for back, - * and vice-versa. - */ - if(alstr_cmp_cstr(conf->Speakers[i].Name, "LF") == 0) - ch = FrontLeft; - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "RF") == 0) - ch = FrontRight; - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "CE") == 0) - ch = FrontCenter; - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "LS") == 0) - { - if(device->FmtChans == DevFmtX51Rear) - ch = BackLeft; - else - ch = SideLeft; - } - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "RS") == 0) - { - if(device->FmtChans == DevFmtX51Rear) - ch = BackRight; - else - ch = SideRight; - } - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "LB") == 0) - { - if(device->FmtChans == DevFmtX51) - ch = SideLeft; - else - ch = BackLeft; - } - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "RB") == 0) - { - if(device->FmtChans == DevFmtX51) - ch = SideRight; - else - ch = BackRight; - } - else if(alstr_cmp_cstr(conf->Speakers[i].Name, "CB") == 0) - ch = BackCenter; - else - { - const char *name = alstr_get_cstr(conf->Speakers[i].Name); - unsigned int n; - char c; - - if(sscanf(name, "AUX%u%c", &n, &c) == 1 && n < 16) - ch = Aux0+n; - else - { - ERR("AmbDec speaker label \"%s\" not recognized\n", name); - return false; - } - } - chidx = GetChannelIdxByName(&device->RealOut, ch); - if(chidx == -1) - { - ERR("Failed to lookup AmbDec speaker label %s\n", - alstr_get_cstr(conf->Speakers[i].Name)); - return false; - } - speakermap[i] = chidx; - } - - return true; -} - - -static const ChannelMap MonoCfg[1] = { - { FrontCenter, { 1.0f } }, -}, StereoCfg[2] = { - { FrontLeft, { 5.00000000e-1f, 2.88675135e-1f, 0.0f, 5.52305643e-2f } }, - { FrontRight, { 5.00000000e-1f, -2.88675135e-1f, 0.0f, 5.52305643e-2f } }, -}, QuadCfg[4] = { - { BackLeft, { 3.53553391e-1f, 2.04124145e-1f, 0.0f, -2.04124145e-1f } }, - { FrontLeft, { 3.53553391e-1f, 2.04124145e-1f, 0.0f, 2.04124145e-1f } }, - { FrontRight, { 3.53553391e-1f, -2.04124145e-1f, 0.0f, 2.04124145e-1f } }, - { BackRight, { 3.53553391e-1f, -2.04124145e-1f, 0.0f, -2.04124145e-1f } }, -}, X51SideCfg[4] = { - { SideLeft, { 3.33000782e-1f, 1.89084803e-1f, 0.0f, -2.00042375e-1f, -2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, - { FrontLeft, { 1.88542860e-1f, 1.27709292e-1f, 0.0f, 1.66295695e-1f, 7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, - { FrontRight, { 1.88542860e-1f, -1.27709292e-1f, 0.0f, 1.66295695e-1f, -7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, - { SideRight, { 3.33000782e-1f, -1.89084803e-1f, 0.0f, -2.00042375e-1f, 2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, -}, X51RearCfg[4] = { - { BackLeft, { 3.33000782e-1f, 1.89084803e-1f, 0.0f, -2.00042375e-1f, -2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, - { FrontLeft, { 1.88542860e-1f, 1.27709292e-1f, 0.0f, 1.66295695e-1f, 7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, - { FrontRight, { 1.88542860e-1f, -1.27709292e-1f, 0.0f, 1.66295695e-1f, -7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, - { BackRight, { 3.33000782e-1f, -1.89084803e-1f, 0.0f, -2.00042375e-1f, 2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, -}, X61Cfg[6] = { - { SideLeft, { 2.04460341e-1f, 2.17177926e-1f, 0.0f, -4.39996780e-2f, -2.60790269e-2f, 0.0f, 0.0f, 0.0f, -6.87239792e-2f } }, - { FrontLeft, { 1.58923161e-1f, 9.21772680e-2f, 0.0f, 1.59658796e-1f, 6.66278083e-2f, 0.0f, 0.0f, 0.0f, 3.84686854e-2f } }, - { FrontRight, { 1.58923161e-1f, -9.21772680e-2f, 0.0f, 1.59658796e-1f, -6.66278083e-2f, 0.0f, 0.0f, 0.0f, 3.84686854e-2f } }, - { SideRight, { 2.04460341e-1f, -2.17177926e-1f, 0.0f, -4.39996780e-2f, 2.60790269e-2f, 0.0f, 0.0f, 0.0f, -6.87239792e-2f } }, - { BackCenter, { 2.50001688e-1f, 0.00000000e+0f, 0.0f, -2.50000094e-1f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, 6.05133395e-2f } }, -}, X71Cfg[6] = { - { BackLeft, { 2.04124145e-1f, 1.08880247e-1f, 0.0f, -1.88586120e-1f, -1.29099444e-1f, 0.0f, 0.0f, 0.0f, 7.45355993e-2f, 3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, - { SideLeft, { 2.04124145e-1f, 2.17760495e-1f, 0.0f, 0.00000000e+0f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, -1.49071198e-1f, -3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, - { FrontLeft, { 2.04124145e-1f, 1.08880247e-1f, 0.0f, 1.88586120e-1f, 1.29099444e-1f, 0.0f, 0.0f, 0.0f, 7.45355993e-2f, 3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, - { FrontRight, { 2.04124145e-1f, -1.08880247e-1f, 0.0f, 1.88586120e-1f, -1.29099444e-1f, 0.0f, 0.0f, 0.0f, 7.45355993e-2f, -3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, - { SideRight, { 2.04124145e-1f, -2.17760495e-1f, 0.0f, 0.00000000e+0f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, -1.49071198e-1f, 3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, - { BackRight, { 2.04124145e-1f, -1.08880247e-1f, 0.0f, -1.88586120e-1f, 1.29099444e-1f, 0.0f, 0.0f, 0.0f, 7.45355993e-2f, -3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, -}; - -static void InitNearFieldCtrl(ALCdevice *device, ALfloat ctrl_dist, ALsizei order, - const ALsizei *restrict chans_per_order) -{ - const char *devname = alstr_get_cstr(device->DeviceName); - ALsizei i; - - if(GetConfigValueBool(devname, "decoder", "nfc", 1) && ctrl_dist > 0.0f) - { - /* NFC is only used when AvgSpeakerDist is greater than 0, and can only - * be used when rendering to an ambisonic buffer. - */ - device->AvgSpeakerDist = minf(ctrl_dist, 10.0f); - TRACE("Using near-field reference distance: %.2f meters\n", device->AvgSpeakerDist); - - for(i = 0;i < order+1;i++) - device->Dry.NumChannelsPerOrder[i] = chans_per_order[i]; - for(;i < MAX_AMBI_ORDER+1;i++) - device->Dry.NumChannelsPerOrder[i] = 0; - } -} - -static void InitDistanceComp(ALCdevice *device, const AmbDecConf *conf, const ALsizei speakermap[MAX_OUTPUT_CHANNELS]) -{ - const char *devname = alstr_get_cstr(device->DeviceName); - ALfloat maxdist = 0.0f; - size_t total = 0; - ALsizei i; - - for(i = 0;i < conf->NumSpeakers;i++) - maxdist = maxf(maxdist, conf->Speakers[i].Distance); - - if(GetConfigValueBool(devname, "decoder", "distance-comp", 1) && maxdist > 0.0f) - { - ALfloat srate = (ALfloat)device->Frequency; - for(i = 0;i < conf->NumSpeakers;i++) - { - ALsizei chan = speakermap[i]; - ALfloat delay; - - /* Distance compensation only delays in steps of the sample rate. - * This is a bit less accurate since the delay time falls to the - * nearest sample time, but it's far simpler as it doesn't have to - * deal with phase offsets. This means at 48khz, for instance, the - * distance delay will be in steps of about 7 millimeters. - */ - delay = floorf((maxdist-conf->Speakers[i].Distance) / SPEEDOFSOUNDMETRESPERSEC * - srate + 0.5f); - if(delay >= (ALfloat)MAX_DELAY_LENGTH) - ERR("Delay for speaker \"%s\" exceeds buffer length (%f >= %u)\n", - alstr_get_cstr(conf->Speakers[i].Name), delay, MAX_DELAY_LENGTH); - - device->ChannelDelay[chan].Length = (ALsizei)clampf( - delay, 0.0f, (ALfloat)(MAX_DELAY_LENGTH-1) - ); - device->ChannelDelay[chan].Gain = conf->Speakers[i].Distance / maxdist; - TRACE("Channel %u \"%s\" distance compensation: %d samples, %f gain\n", chan, - alstr_get_cstr(conf->Speakers[i].Name), device->ChannelDelay[chan].Length, - device->ChannelDelay[chan].Gain - ); - - /* Round up to the next 4th sample, so each channel buffer starts - * 16-byte aligned. - */ - total += RoundUp(device->ChannelDelay[chan].Length, 4); - } - } - - if(total > 0) - { - device->ChannelDelay[0].Buffer = al_calloc(16, total * sizeof(ALfloat)); - for(i = 1;i < MAX_OUTPUT_CHANNELS;i++) - { - size_t len = RoundUp(device->ChannelDelay[i-1].Length, 4); - device->ChannelDelay[i].Buffer = device->ChannelDelay[i-1].Buffer + len; - } - } -} - -static void InitPanning(ALCdevice *device) -{ - const ChannelMap *chanmap = NULL; - ALsizei coeffcount = 0; - ALsizei count = 0; - ALsizei i, j; - - switch(device->FmtChans) - { - case DevFmtMono: - count = COUNTOF(MonoCfg); - chanmap = MonoCfg; - coeffcount = 1; - break; - - case DevFmtStereo: - count = COUNTOF(StereoCfg); - chanmap = StereoCfg; - coeffcount = 4; - break; - - case DevFmtQuad: - count = COUNTOF(QuadCfg); - chanmap = QuadCfg; - coeffcount = 4; - break; - - case DevFmtX51: - count = COUNTOF(X51SideCfg); - chanmap = X51SideCfg; - coeffcount = 9; - break; - - case DevFmtX51Rear: - count = COUNTOF(X51RearCfg); - chanmap = X51RearCfg; - coeffcount = 9; - break; - - case DevFmtX61: - count = COUNTOF(X61Cfg); - chanmap = X61Cfg; - coeffcount = 9; - break; - - case DevFmtX71: - count = COUNTOF(X71Cfg); - chanmap = X71Cfg; - coeffcount = 16; - break; - - case DevFmtAmbi3D: - break; - } - - if(device->FmtChans == DevFmtAmbi3D) - { - const char *devname = alstr_get_cstr(device->DeviceName); - const ALsizei *acnmap = (device->AmbiLayout == AmbiLayout_FuMa) ? FuMa2ACN : ACN2ACN; - const ALfloat *n3dscale = (device->AmbiScale == AmbiNorm_FuMa) ? FuMa2N3DScale : - (device->AmbiScale == AmbiNorm_SN3D) ? SN3D2N3DScale : - /*(device->AmbiScale == AmbiNorm_N3D) ?*/ N3D2N3DScale; - ALfloat nfc_delay = 0.0f; - - count = (device->AmbiOrder == 3) ? 16 : - (device->AmbiOrder == 2) ? 9 : - (device->AmbiOrder == 1) ? 4 : 1; - for(i = 0;i < count;i++) - { - ALsizei acn = acnmap[i]; - device->Dry.Ambi.Map[i].Scale = 1.0f/n3dscale[acn]; - device->Dry.Ambi.Map[i].Index = acn; - } - device->Dry.CoeffCount = 0; - device->Dry.NumChannels = count; - - if(device->AmbiOrder < 2) - { - device->FOAOut.Ambi = device->Dry.Ambi; - device->FOAOut.CoeffCount = device->Dry.CoeffCount; - device->FOAOut.NumChannels = 0; - } - else - { - ALfloat w_scale=1.0f, xyz_scale=1.0f; - - /* FOA output is always ACN+N3D for higher-order ambisonic output. - * The upsampler expects this and will convert it for output. - */ - memset(&device->FOAOut.Ambi, 0, sizeof(device->FOAOut.Ambi)); - for(i = 0;i < 4;i++) - { - device->FOAOut.Ambi.Map[i].Scale = 1.0f; - device->FOAOut.Ambi.Map[i].Index = i; - } - device->FOAOut.CoeffCount = 0; - device->FOAOut.NumChannels = 4; - - if(device->AmbiOrder >= 3) - { - w_scale = W_SCALE_3H3P; - xyz_scale = XYZ_SCALE_3H3P; - } - else - { - w_scale = W_SCALE_2H2P; - xyz_scale = XYZ_SCALE_2H2P; - } - ambiup_reset(device->AmbiUp, device, w_scale, xyz_scale); - } - - if(ConfigValueFloat(devname, "decoder", "nfc-ref-delay", &nfc_delay) && nfc_delay > 0.0f) - { - static const ALsizei chans_per_order[MAX_AMBI_ORDER+1] = { - 1, 3, 5, 7 - }; - nfc_delay = clampf(nfc_delay, 0.001f, 1000.0f); - InitNearFieldCtrl(device, nfc_delay * SPEEDOFSOUNDMETRESPERSEC, - device->AmbiOrder, chans_per_order); - } - } - else - { - ALfloat w_scale, xyz_scale; - - SetChannelMap(device->RealOut.ChannelName, device->Dry.Ambi.Coeffs, - chanmap, count, &device->Dry.NumChannels); - device->Dry.CoeffCount = coeffcount; - - w_scale = (device->Dry.CoeffCount > 9) ? W_SCALE_3H0P : - (device->Dry.CoeffCount > 4) ? W_SCALE_2H0P : 1.0f; - xyz_scale = (device->Dry.CoeffCount > 9) ? XYZ_SCALE_3H0P : - (device->Dry.CoeffCount > 4) ? XYZ_SCALE_2H0P : 1.0f; - - memset(&device->FOAOut.Ambi, 0, sizeof(device->FOAOut.Ambi)); - for(i = 0;i < device->Dry.NumChannels;i++) - { - device->FOAOut.Ambi.Coeffs[i][0] = device->Dry.Ambi.Coeffs[i][0] * w_scale; - for(j = 1;j < 4;j++) - device->FOAOut.Ambi.Coeffs[i][j] = device->Dry.Ambi.Coeffs[i][j] * xyz_scale; - } - device->FOAOut.CoeffCount = 4; - device->FOAOut.NumChannels = 0; - } - device->RealOut.NumChannels = 0; -} - -static void InitCustomPanning(ALCdevice *device, const AmbDecConf *conf, const ALsizei speakermap[MAX_OUTPUT_CHANNELS]) -{ - ChannelMap chanmap[MAX_OUTPUT_CHANNELS]; - const ALfloat *coeff_scale = N3D2N3DScale; - ALfloat w_scale = 1.0f; - ALfloat xyz_scale = 1.0f; - ALsizei i, j; - - if(conf->FreqBands != 1) - ERR("Basic renderer uses the high-frequency matrix as single-band (xover_freq = %.0fhz)\n", - conf->XOverFreq); - - if((conf->ChanMask&AMBI_PERIPHONIC_MASK)) - { - if(conf->ChanMask > 0x1ff) - { - w_scale = W_SCALE_3H3P; - xyz_scale = XYZ_SCALE_3H3P; - } - else if(conf->ChanMask > 0xf) - { - w_scale = W_SCALE_2H2P; - xyz_scale = XYZ_SCALE_2H2P; - } - } - else - { - if(conf->ChanMask > 0x1ff) - { - w_scale = W_SCALE_3H0P; - xyz_scale = XYZ_SCALE_3H0P; - } - else if(conf->ChanMask > 0xf) - { - w_scale = W_SCALE_2H0P; - xyz_scale = XYZ_SCALE_2H0P; - } - } - - if(conf->CoeffScale == ADS_SN3D) - coeff_scale = SN3D2N3DScale; - else if(conf->CoeffScale == ADS_FuMa) - coeff_scale = FuMa2N3DScale; - - for(i = 0;i < conf->NumSpeakers;i++) - { - ALsizei chan = speakermap[i]; - ALfloat gain; - ALsizei k = 0; - - for(j = 0;j < MAX_AMBI_COEFFS;j++) - chanmap[i].Config[j] = 0.0f; - - chanmap[i].ChanName = device->RealOut.ChannelName[chan]; - for(j = 0;j < MAX_AMBI_COEFFS;j++) - { - if(j == 0) gain = conf->HFOrderGain[0]; - else if(j == 1) gain = conf->HFOrderGain[1]; - else if(j == 4) gain = conf->HFOrderGain[2]; - else if(j == 9) gain = conf->HFOrderGain[3]; - if((conf->ChanMask&(1<HFMatrix[i][k++] / coeff_scale[j] * gain; - } - } - - SetChannelMap(device->RealOut.ChannelName, device->Dry.Ambi.Coeffs, chanmap, - conf->NumSpeakers, &device->Dry.NumChannels); - device->Dry.CoeffCount = (conf->ChanMask > 0x1ff) ? 16 : - (conf->ChanMask > 0xf) ? 9 : 4; - - memset(&device->FOAOut.Ambi, 0, sizeof(device->FOAOut.Ambi)); - for(i = 0;i < device->Dry.NumChannels;i++) - { - device->FOAOut.Ambi.Coeffs[i][0] = device->Dry.Ambi.Coeffs[i][0] * w_scale; - for(j = 1;j < 4;j++) - device->FOAOut.Ambi.Coeffs[i][j] = device->Dry.Ambi.Coeffs[i][j] * xyz_scale; - } - device->FOAOut.CoeffCount = 4; - device->FOAOut.NumChannels = 0; - - device->RealOut.NumChannels = 0; - - InitDistanceComp(device, conf, speakermap); -} - -static void InitHQPanning(ALCdevice *device, const AmbDecConf *conf, const ALsizei speakermap[MAX_OUTPUT_CHANNELS]) -{ - static const ALsizei chans_per_order2d[MAX_AMBI_ORDER+1] = { 1, 2, 2, 2 }; - static const ALsizei chans_per_order3d[MAX_AMBI_ORDER+1] = { 1, 3, 5, 7 }; - ALfloat avg_dist; - ALsizei count; - ALsizei i; - - if((conf->ChanMask&AMBI_PERIPHONIC_MASK)) - { - count = (conf->ChanMask > 0x1ff) ? 16 : - (conf->ChanMask > 0xf) ? 9 : 4; - for(i = 0;i < count;i++) - { - device->Dry.Ambi.Map[i].Scale = 1.0f; - device->Dry.Ambi.Map[i].Index = i; - } - } - else - { - static const int map[MAX_AMBI2D_COEFFS] = { 0, 1, 3, 4, 8, 9, 15 }; - - count = (conf->ChanMask > 0x1ff) ? 7 : - (conf->ChanMask > 0xf) ? 5 : 3; - for(i = 0;i < count;i++) - { - device->Dry.Ambi.Map[i].Scale = 1.0f; - device->Dry.Ambi.Map[i].Index = map[i]; - } - } - device->Dry.CoeffCount = 0; - device->Dry.NumChannels = count; - - TRACE("Enabling %s-band %s-order%s ambisonic decoder\n", - (conf->FreqBands == 1) ? "single" : "dual", - (conf->ChanMask > 0xf) ? (conf->ChanMask > 0x1ff) ? "third" : "second" : "first", - (conf->ChanMask&AMBI_PERIPHONIC_MASK) ? " periphonic" : "" - ); - bformatdec_reset(device->AmbiDecoder, conf, count, device->Frequency, speakermap); - - if(!(conf->ChanMask > 0xf)) - { - device->FOAOut.Ambi = device->Dry.Ambi; - device->FOAOut.CoeffCount = device->Dry.CoeffCount; - device->FOAOut.NumChannels = 0; - } - else - { - memset(&device->FOAOut.Ambi, 0, sizeof(device->FOAOut.Ambi)); - if((conf->ChanMask&AMBI_PERIPHONIC_MASK)) - { - count = 4; - for(i = 0;i < count;i++) - { - device->FOAOut.Ambi.Map[i].Scale = 1.0f; - device->FOAOut.Ambi.Map[i].Index = i; - } - } - else - { - static const int map[3] = { 0, 1, 3 }; - count = 3; - for(i = 0;i < count;i++) - { - device->FOAOut.Ambi.Map[i].Scale = 1.0f; - device->FOAOut.Ambi.Map[i].Index = map[i]; - } - } - device->FOAOut.CoeffCount = 0; - device->FOAOut.NumChannels = count; - } - - device->RealOut.NumChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - - avg_dist = 0.0f; - for(i = 0;i < conf->NumSpeakers;i++) - avg_dist += conf->Speakers[i].Distance; - avg_dist /= (ALfloat)conf->NumSpeakers; - InitNearFieldCtrl(device, avg_dist, - (conf->ChanMask > 0x1ff) ? 3 : (conf->ChanMask > 0xf) ? 2 : 1, - (conf->ChanMask&AMBI_PERIPHONIC_MASK) ? chans_per_order3d : chans_per_order2d - ); - - InitDistanceComp(device, conf, speakermap); -} - -static void InitHrtfPanning(ALCdevice *device) -{ - /* NOTE: azimuth goes clockwise. */ - static const struct AngularPoint AmbiPoints[] = { - { DEG2RAD( 90.0f), DEG2RAD( 0.0f) }, - { DEG2RAD( 35.2643897f), DEG2RAD( 45.0f) }, - { DEG2RAD( 35.2643897f), DEG2RAD( 135.0f) }, - { DEG2RAD( 35.2643897f), DEG2RAD(-135.0f) }, - { DEG2RAD( 35.2643897f), DEG2RAD( -45.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( 0.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( 45.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( 90.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( 135.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( 180.0f) }, - { DEG2RAD( 0.0f), DEG2RAD(-135.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( -90.0f) }, - { DEG2RAD( 0.0f), DEG2RAD( -45.0f) }, - { DEG2RAD(-35.2643897f), DEG2RAD( 45.0f) }, - { DEG2RAD(-35.2643897f), DEG2RAD( 135.0f) }, - { DEG2RAD(-35.2643897f), DEG2RAD(-135.0f) }, - { DEG2RAD(-35.2643897f), DEG2RAD( -45.0f) }, - { DEG2RAD(-90.0f), DEG2RAD( 0.0f) }, - }; - static const ALfloat AmbiMatrixFOA[][MAX_AMBI_COEFFS] = { - { 5.55555556e-02f, 0.00000000e+00f, 1.23717915e-01f, 0.00000000e+00f }, - { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f }, - { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f }, - { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f }, - { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f }, - { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, 8.66025404e-02f }, - { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f }, - { 5.55555556e-02f, -8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f }, - { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f }, - { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, -8.66025404e-02f }, - { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f }, - { 5.55555556e-02f, 8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f }, - { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f }, - { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f }, - { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f }, - { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f }, - { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f }, - { 5.55555556e-02f, 0.00000000e+00f, -1.23717915e-01f, 0.00000000e+00f }, - }, AmbiMatrixHOA[][MAX_AMBI_COEFFS] = { - { 5.55555556e-02f, 0.00000000e+00f, 1.23717915e-01f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f }, - { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, 8.66025404e-02f, 0.00000000e+00f, 1.29099445e-01f }, - { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f, -6.83467648e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, -8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f, -1.29099445e-01f }, - { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f, 6.83467648e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, -8.66025404e-02f, 0.00000000e+00f, 1.29099445e-01f }, - { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f, -6.83467648e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f, -1.29099445e-01f }, - { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f, 6.83467648e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, - { 5.55555556e-02f, 0.00000000e+00f, -1.23717915e-01f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f }, - }; - static const ALfloat AmbiOrderHFGainFOA[MAX_AMBI_ORDER+1] = { - 3.00000000e+00f, 1.73205081e+00f - }, AmbiOrderHFGainHOA[MAX_AMBI_ORDER+1] = { - 2.40192231e+00f, 1.86052102e+00f, 9.60768923e-01f - }; - static const ALsizei IndexMap[6] = { 0, 1, 2, 3, 4, 8 }; - static const ALsizei ChansPerOrder[MAX_AMBI_ORDER+1] = { 1, 3, 2, 0 }; - const ALfloat (*restrict AmbiMatrix)[MAX_AMBI_COEFFS] = AmbiMatrixFOA; - const ALfloat *restrict AmbiOrderHFGain = AmbiOrderHFGainFOA; - ALsizei count = 4; - ALsizei i; - - static_assert(COUNTOF(AmbiPoints) == COUNTOF(AmbiMatrixFOA), "FOA Ambisonic HRTF mismatch"); - static_assert(COUNTOF(AmbiPoints) == COUNTOF(AmbiMatrixHOA), "HOA Ambisonic HRTF mismatch"); - - if(device->AmbiUp) - { - AmbiMatrix = AmbiMatrixHOA; - AmbiOrderHFGain = AmbiOrderHFGainHOA; - count = COUNTOF(IndexMap); - } - - device->Hrtf = al_calloc(16, FAM_SIZE(DirectHrtfState, Chan, count)); - - for(i = 0;i < count;i++) - { - device->Dry.Ambi.Map[i].Scale = 1.0f; - device->Dry.Ambi.Map[i].Index = IndexMap[i]; - } - device->Dry.CoeffCount = 0; - device->Dry.NumChannels = count; - - if(device->AmbiUp) - { - memset(&device->FOAOut.Ambi, 0, sizeof(device->FOAOut.Ambi)); - for(i = 0;i < 4;i++) - { - device->FOAOut.Ambi.Map[i].Scale = 1.0f; - device->FOAOut.Ambi.Map[i].Index = i; - } - device->FOAOut.CoeffCount = 0; - device->FOAOut.NumChannels = 4; - - ambiup_reset(device->AmbiUp, device, AmbiOrderHFGainFOA[0] / AmbiOrderHFGain[0], - AmbiOrderHFGainFOA[1] / AmbiOrderHFGain[1]); - } - else - { - device->FOAOut.Ambi = device->Dry.Ambi; - device->FOAOut.CoeffCount = device->Dry.CoeffCount; - device->FOAOut.NumChannels = 0; - } - - device->RealOut.NumChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - - BuildBFormatHrtf(device->HrtfHandle, - device->Hrtf, device->Dry.NumChannels, AmbiPoints, AmbiMatrix, COUNTOF(AmbiPoints), - AmbiOrderHFGain - ); - - InitNearFieldCtrl(device, device->HrtfHandle->distance, device->AmbiUp ? 2 : 1, - ChansPerOrder); -} - -static void InitUhjPanning(ALCdevice *device) -{ - ALsizei count = 3; - ALsizei i; - - for(i = 0;i < count;i++) - { - ALsizei acn = FuMa2ACN[i]; - device->Dry.Ambi.Map[i].Scale = 1.0f/FuMa2N3DScale[acn]; - device->Dry.Ambi.Map[i].Index = acn; - } - device->Dry.CoeffCount = 0; - device->Dry.NumChannels = count; - - device->FOAOut.Ambi = device->Dry.Ambi; - device->FOAOut.CoeffCount = device->Dry.CoeffCount; - device->FOAOut.NumChannels = 0; - - device->RealOut.NumChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); -} - -void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf_appreq, enum HrtfRequestMode hrtf_userreq) -{ - /* Hold the HRTF the device last used, in case it's used again. */ - struct Hrtf *old_hrtf = device->HrtfHandle; - const char *mode; - bool headphones; - int bs2blevel; - size_t i; - - al_free(device->Hrtf); - device->Hrtf = NULL; - device->HrtfHandle = NULL; - alstr_clear(&device->HrtfName); - device->Render_Mode = NormalRender; - - memset(&device->Dry.Ambi, 0, sizeof(device->Dry.Ambi)); - device->Dry.CoeffCount = 0; - device->Dry.NumChannels = 0; - for(i = 0;i < MAX_AMBI_ORDER+1;i++) - device->Dry.NumChannelsPerOrder[i] = 0; - - device->AvgSpeakerDist = 0.0f; - memset(device->ChannelDelay, 0, sizeof(device->ChannelDelay)); - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Gain = 1.0f; - device->ChannelDelay[i].Length = 0; - } - - al_free(device->Stablizer); - device->Stablizer = NULL; - - if(device->FmtChans != DevFmtStereo) - { - ALsizei speakermap[MAX_OUTPUT_CHANNELS]; - const char *devname, *layout = NULL; - AmbDecConf conf, *pconf = NULL; - - if(old_hrtf) - Hrtf_DecRef(old_hrtf); - old_hrtf = NULL; - if(hrtf_appreq == Hrtf_Enable) - device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT; - - ambdec_init(&conf); - - devname = alstr_get_cstr(device->DeviceName); - switch(device->FmtChans) - { - case DevFmtQuad: layout = "quad"; break; - case DevFmtX51: /* fall-through */ - case DevFmtX51Rear: layout = "surround51"; break; - case DevFmtX61: layout = "surround61"; break; - case DevFmtX71: layout = "surround71"; break; - /* Mono, Stereo, and Ambisonics output don't use custom decoders. */ - case DevFmtMono: - case DevFmtStereo: - case DevFmtAmbi3D: - break; - } - if(layout) - { - const char *fname; - if(ConfigValueStr(devname, "decoder", layout, &fname)) - { - if(!ambdec_load(&conf, fname)) - ERR("Failed to load layout file %s\n", fname); - else - { - if(conf.ChanMask > 0xffff) - ERR("Unsupported channel mask 0x%04x (max 0xffff)\n", conf.ChanMask); - else - { - if(MakeSpeakerMap(device, &conf, speakermap)) - pconf = &conf; - } - } - } - } - - if(pconf && GetConfigValueBool(devname, "decoder", "hq-mode", 0)) - { - ambiup_free(&device->AmbiUp); - if(!device->AmbiDecoder) - device->AmbiDecoder = bformatdec_alloc(); - } - else - { - bformatdec_free(&device->AmbiDecoder); - if(device->FmtChans != DevFmtAmbi3D || device->AmbiOrder < 2) - ambiup_free(&device->AmbiUp); - else - { - if(!device->AmbiUp) - device->AmbiUp = ambiup_alloc(); - } - } - - if(!pconf) - InitPanning(device); - else if(device->AmbiDecoder) - InitHQPanning(device, pconf, speakermap); - else - InitCustomPanning(device, pconf, speakermap); - - /* Enable the stablizer only for formats that have front-left, front- - * right, and front-center outputs. - */ - switch(device->FmtChans) - { - case DevFmtX51: - case DevFmtX51Rear: - case DevFmtX61: - case DevFmtX71: - if(GetConfigValueBool(devname, NULL, "front-stablizer", 0)) - { - /* Initialize band-splitting filters for the front-left and - * front-right channels, with a crossover at 5khz (could be - * higher). - */ - ALfloat scale = (ALfloat)(5000.0 / device->Frequency); - FrontStablizer *stablizer = al_calloc(16, sizeof(*stablizer)); - - bandsplit_init(&stablizer->LFilter, scale); - stablizer->RFilter = stablizer->LFilter; - - /* Initialize all-pass filters for all other channels. */ - splitterap_init(&stablizer->APFilter[0], scale); - for(i = 1;i < (size_t)device->RealOut.NumChannels;i++) - stablizer->APFilter[i] = stablizer->APFilter[0]; - - device->Stablizer = stablizer; - } - break; - case DevFmtMono: - case DevFmtStereo: - case DevFmtQuad: - case DevFmtAmbi3D: - break; - } - TRACE("Front stablizer %s\n", device->Stablizer ? "enabled" : "disabled"); - - ambdec_deinit(&conf); - return; - } - - bformatdec_free(&device->AmbiDecoder); - - headphones = device->IsHeadphones; - if(device->Type != Loopback) - { - const char *mode; - if(ConfigValueStr(alstr_get_cstr(device->DeviceName), NULL, "stereo-mode", &mode)) - { - if(strcasecmp(mode, "headphones") == 0) - headphones = true; - else if(strcasecmp(mode, "speakers") == 0) - headphones = false; - else if(strcasecmp(mode, "auto") != 0) - ERR("Unexpected stereo-mode: %s\n", mode); - } - } - - if(hrtf_userreq == Hrtf_Default) - { - bool usehrtf = (headphones && hrtf_appreq != Hrtf_Disable) || - (hrtf_appreq == Hrtf_Enable); - if(!usehrtf) goto no_hrtf; - - device->HrtfStatus = ALC_HRTF_ENABLED_SOFT; - if(headphones && hrtf_appreq != Hrtf_Disable) - device->HrtfStatus = ALC_HRTF_HEADPHONES_DETECTED_SOFT; - } - else - { - if(hrtf_userreq != Hrtf_Enable) - { - if(hrtf_appreq == Hrtf_Enable) - device->HrtfStatus = ALC_HRTF_DENIED_SOFT; - goto no_hrtf; - } - device->HrtfStatus = ALC_HRTF_REQUIRED_SOFT; - } - - if(VECTOR_SIZE(device->HrtfList) == 0) - { - VECTOR_DEINIT(device->HrtfList); - device->HrtfList = EnumerateHrtf(device->DeviceName); - } - - if(hrtf_id >= 0 && (size_t)hrtf_id < VECTOR_SIZE(device->HrtfList)) - { - const EnumeratedHrtf *entry = &VECTOR_ELEM(device->HrtfList, hrtf_id); - struct Hrtf *hrtf = GetLoadedHrtf(entry->hrtf); - if(hrtf && hrtf->sampleRate == device->Frequency) - { - device->HrtfHandle = hrtf; - alstr_copy(&device->HrtfName, entry->name); - } - else if(hrtf) - Hrtf_DecRef(hrtf); - } - - for(i = 0;!device->HrtfHandle && i < VECTOR_SIZE(device->HrtfList);i++) - { - const EnumeratedHrtf *entry = &VECTOR_ELEM(device->HrtfList, i); - struct Hrtf *hrtf = GetLoadedHrtf(entry->hrtf); - if(hrtf && hrtf->sampleRate == device->Frequency) - { - device->HrtfHandle = hrtf; - alstr_copy(&device->HrtfName, entry->name); - } - else if(hrtf) - Hrtf_DecRef(hrtf); - } - - if(device->HrtfHandle) - { - if(old_hrtf) - Hrtf_DecRef(old_hrtf); - old_hrtf = NULL; - - device->Render_Mode = HrtfRender; - if(ConfigValueStr(alstr_get_cstr(device->DeviceName), NULL, "hrtf-mode", &mode)) - { - if(strcasecmp(mode, "full") == 0) - device->Render_Mode = HrtfRender; - else if(strcasecmp(mode, "basic") == 0) - device->Render_Mode = NormalRender; - else - ERR("Unexpected hrtf-mode: %s\n", mode); - } - - if(device->Render_Mode == HrtfRender) - { - /* Don't bother with HOA when using full HRTF rendering. Nothing - * needs it, and it eases the CPU/memory load. - */ - ambiup_free(&device->AmbiUp); - } - else - { - if(!device->AmbiUp) - device->AmbiUp = ambiup_alloc(); - } - - TRACE("%s HRTF rendering enabled, using \"%s\"\n", - ((device->Render_Mode == HrtfRender) ? "Full" : "Basic"), - alstr_get_cstr(device->HrtfName) - ); - InitHrtfPanning(device); - return; - } - device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT; - -no_hrtf: - if(old_hrtf) - Hrtf_DecRef(old_hrtf); - old_hrtf = NULL; - TRACE("HRTF disabled\n"); - - device->Render_Mode = StereoPair; - - ambiup_free(&device->AmbiUp); - - bs2blevel = ((headphones && hrtf_appreq != Hrtf_Disable) || - (hrtf_appreq == Hrtf_Enable)) ? 5 : 0; - if(device->Type != Loopback) - ConfigValueInt(alstr_get_cstr(device->DeviceName), NULL, "cf_level", &bs2blevel); - if(bs2blevel > 0 && bs2blevel <= 6) - { - device->Bs2b = al_calloc(16, sizeof(*device->Bs2b)); - bs2b_set_params(device->Bs2b, bs2blevel, device->Frequency); - TRACE("BS2B enabled\n"); - InitPanning(device); - return; - } - - TRACE("BS2B disabled\n"); - - if(ConfigValueStr(alstr_get_cstr(device->DeviceName), NULL, "stereo-encoding", &mode)) - { - if(strcasecmp(mode, "uhj") == 0) - device->Render_Mode = NormalRender; - else if(strcasecmp(mode, "panpot") != 0) - ERR("Unexpected stereo-encoding: %s\n", mode); - } - if(device->Render_Mode == NormalRender) - { - device->Uhj_Encoder = al_calloc(16, sizeof(Uhj2Encoder)); - TRACE("UHJ enabled\n"); - InitUhjPanning(device); - return; - } - - TRACE("UHJ disabled\n"); - InitPanning(device); -} - - -void aluInitEffectPanning(ALeffectslot *slot) -{ - ALsizei i; - - memset(slot->ChanMap, 0, sizeof(slot->ChanMap)); - slot->NumChannels = 0; - - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - { - slot->ChanMap[i].Scale = 1.0f; - slot->ChanMap[i].Index = i; - } - slot->NumChannels = i; -} diff --git a/Alc/polymorphism.h b/Alc/polymorphism.h deleted file mode 100644 index fa31fad..0000000 --- a/Alc/polymorphism.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef POLYMORPHISM_H -#define POLYMORPHISM_H - -/* Macros to declare inheriting types, and to (down-)cast and up-cast. */ -#define DERIVE_FROM_TYPE(t) t t##_parent -#define STATIC_CAST(to, obj) (&(obj)->to##_parent) -#ifdef __GNUC__ -#define STATIC_UPCAST(to, from, obj) __extension__({ \ - static_assert(__builtin_types_compatible_p(from, __typeof(*(obj))), \ - "Invalid upcast object from type"); \ - (to*)((char*)(obj) - offsetof(to, from##_parent)); \ -}) -#else -#define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent))) -#endif - -/* Defines method forwards, which call the given parent's (T2's) implementation. */ -#define DECLARE_FORWARD(T1, T2, rettype, func) \ -rettype T1##_##func(T1 *obj) \ -{ return T2##_##func(STATIC_CAST(T2, obj)); } - -#define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \ -rettype T1##_##func(T1 *obj, argtype1 a) \ -{ return T2##_##func(STATIC_CAST(T2, obj), a); } - -#define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \ -rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \ -{ return T2##_##func(STATIC_CAST(T2, obj), a, b); } - -#define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ -rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \ -{ return T2##_##func(STATIC_CAST(T2, obj), a, b, c); } - -/* Defines method thunks, functions that call to the child's method. */ -#define DECLARE_THUNK(T1, T2, rettype, func) \ -static rettype T1##_##T2##_##func(T2 *obj) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj)); } - -#define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); } - -#define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); } - -#define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); } - -#define DECLARE_THUNK4(T1, T2, rettype, func, argtype1, argtype2, argtype3, argtype4) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c, argtype4 d) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c, d); } - -/* Defines the default functions used to (de)allocate a polymorphic object. */ -#define DECLARE_DEFAULT_ALLOCATORS(T) \ -static void* T##_New(size_t size) { return al_malloc(16, size); } \ -static void T##_Delete(void *ptr) { al_free(ptr); } - - -/* Helper to extract an argument list for virtual method calls. */ -#define EXTRACT_VCALL_ARGS(...) __VA_ARGS__)) - -/* Call a "virtual" method on an object, with arguments. */ -#define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS -/* Call a "virtual" method on an object, with no arguments. */ -#define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS - - -/* Helper to extract an argument list for NEW_OBJ calls. */ -#define EXTRACT_NEW_ARGS(...) __VA_ARGS__); \ - } \ -} while(0) - -/* Allocate and construct an object, with arguments. */ -#define NEW_OBJ(_res, T) do { \ - _res = T##_New(sizeof(T)); \ - if(_res) \ - { \ - memset(_res, 0, sizeof(T)); \ - T##_Construct(_res, EXTRACT_NEW_ARGS -/* Allocate and construct an object, with no arguments. */ -#define NEW_OBJ0(_res, T) do { \ - _res = T##_New(sizeof(T)); \ - if(_res) \ - { \ - memset(_res, 0, sizeof(T)); \ - T##_Construct(_res EXTRACT_NEW_ARGS - -/* Destructs and deallocate an object. */ -#define DELETE_OBJ(obj) do { \ - if((obj) != NULL) \ - { \ - V0((obj),Destruct)(); \ - V0((obj),Delete)(); \ - } \ -} while(0) - - -/* Helper to get a type's vtable thunk for a child type. */ -#define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable)) -/* Helper to set an object's vtable thunk for a child type. Used when constructing an object. */ -#define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2)) - -#endif /* POLYMORPHISM_H */ diff --git a/Alc/ringbuffer.c b/Alc/ringbuffer.c deleted file mode 100644 index 6c419cf..0000000 --- a/Alc/ringbuffer.c +++ /dev/null @@ -1,295 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "ringbuffer.h" -#include "align.h" -#include "atomic.h" -#include "threads.h" -#include "almalloc.h" -#include "compat.h" - - -/* NOTE: This lockless ringbuffer implementation is copied from JACK, extended - * to include an element size. Consequently, parameters and return values for a - * size or count is in 'elements', not bytes. Additionally, it only supports - * single-consumer/single-provider operation. */ -struct ll_ringbuffer { - ATOMIC(size_t) write_ptr; - ATOMIC(size_t) read_ptr; - size_t size; - size_t size_mask; - size_t elem_size; - - alignas(16) char buf[]; -}; - -ll_ringbuffer_t *ll_ringbuffer_create(size_t sz, size_t elem_sz, int limit_writes) -{ - ll_ringbuffer_t *rb; - size_t power_of_two = 0; - - if(sz > 0) - { - power_of_two = sz; - power_of_two |= power_of_two>>1; - power_of_two |= power_of_two>>2; - power_of_two |= power_of_two>>4; - power_of_two |= power_of_two>>8; - power_of_two |= power_of_two>>16; -#if SIZE_MAX > UINT_MAX - power_of_two |= power_of_two>>32; -#endif - } - power_of_two++; - if(power_of_two < sz) return NULL; - - rb = al_malloc(16, sizeof(*rb) + power_of_two*elem_sz); - if(!rb) return NULL; - - ATOMIC_INIT(&rb->write_ptr, 0); - ATOMIC_INIT(&rb->read_ptr, 0); - rb->size = limit_writes ? sz : power_of_two; - rb->size_mask = power_of_two - 1; - rb->elem_size = elem_sz; - return rb; -} - -void ll_ringbuffer_free(ll_ringbuffer_t *rb) -{ - al_free(rb); -} - -void ll_ringbuffer_reset(ll_ringbuffer_t *rb) -{ - ATOMIC_STORE(&rb->write_ptr, 0, almemory_order_release); - ATOMIC_STORE(&rb->read_ptr, 0, almemory_order_release); - memset(rb->buf, 0, (rb->size_mask+1)*rb->elem_size); -} - - -size_t ll_ringbuffer_read_space(const ll_ringbuffer_t *rb) -{ - size_t w = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->write_ptr, almemory_order_acquire); - size_t r = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->read_ptr, almemory_order_acquire); - return (w-r) & rb->size_mask; -} - -size_t ll_ringbuffer_write_space(const ll_ringbuffer_t *rb) -{ - size_t w = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->write_ptr, almemory_order_acquire); - size_t r = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->read_ptr, almemory_order_acquire); - w = (r-w-1) & rb->size_mask; - return (w > rb->size) ? rb->size : w; -} - - -size_t ll_ringbuffer_read(ll_ringbuffer_t *rb, char *dest, size_t cnt) -{ - size_t read_ptr; - size_t free_cnt; - size_t cnt2; - size_t to_read; - size_t n1, n2; - - free_cnt = ll_ringbuffer_read_space(rb); - if(free_cnt == 0) return 0; - - to_read = (cnt > free_cnt) ? free_cnt : cnt; - read_ptr = ATOMIC_LOAD(&rb->read_ptr, almemory_order_relaxed) & rb->size_mask; - - cnt2 = read_ptr + to_read; - if(cnt2 > rb->size_mask+1) - { - n1 = rb->size_mask+1 - read_ptr; - n2 = cnt2 & rb->size_mask; - } - else - { - n1 = to_read; - n2 = 0; - } - - memcpy(dest, &rb->buf[read_ptr*rb->elem_size], n1*rb->elem_size); - read_ptr += n1; - if(n2) - { - memcpy(dest + n1*rb->elem_size, &rb->buf[(read_ptr&rb->size_mask)*rb->elem_size], - n2*rb->elem_size); - read_ptr += n2; - } - ATOMIC_STORE(&rb->read_ptr, read_ptr, almemory_order_release); - return to_read; -} - -size_t ll_ringbuffer_peek(ll_ringbuffer_t *rb, char *dest, size_t cnt) -{ - size_t free_cnt; - size_t cnt2; - size_t to_read; - size_t n1, n2; - size_t read_ptr; - - free_cnt = ll_ringbuffer_read_space(rb); - if(free_cnt == 0) return 0; - - to_read = (cnt > free_cnt) ? free_cnt : cnt; - read_ptr = ATOMIC_LOAD(&rb->read_ptr, almemory_order_relaxed) & rb->size_mask; - - cnt2 = read_ptr + to_read; - if(cnt2 > rb->size_mask+1) - { - n1 = rb->size_mask+1 - read_ptr; - n2 = cnt2 & rb->size_mask; - } - else - { - n1 = to_read; - n2 = 0; - } - - memcpy(dest, &rb->buf[read_ptr*rb->elem_size], n1*rb->elem_size); - if(n2) - { - read_ptr += n1; - memcpy(dest + n1*rb->elem_size, &rb->buf[(read_ptr&rb->size_mask)*rb->elem_size], - n2*rb->elem_size); - } - return to_read; -} - -size_t ll_ringbuffer_write(ll_ringbuffer_t *rb, const char *src, size_t cnt) -{ - size_t write_ptr; - size_t free_cnt; - size_t cnt2; - size_t to_write; - size_t n1, n2; - - free_cnt = ll_ringbuffer_write_space(rb); - if(free_cnt == 0) return 0; - - to_write = (cnt > free_cnt) ? free_cnt : cnt; - write_ptr = ATOMIC_LOAD(&rb->write_ptr, almemory_order_relaxed) & rb->size_mask; - - cnt2 = write_ptr + to_write; - if(cnt2 > rb->size_mask+1) - { - n1 = rb->size_mask+1 - write_ptr; - n2 = cnt2 & rb->size_mask; - } - else - { - n1 = to_write; - n2 = 0; - } - - memcpy(&rb->buf[write_ptr*rb->elem_size], src, n1*rb->elem_size); - write_ptr += n1; - if(n2) - { - memcpy(&rb->buf[(write_ptr&rb->size_mask)*rb->elem_size], src + n1*rb->elem_size, - n2*rb->elem_size); - write_ptr += n2; - } - ATOMIC_STORE(&rb->write_ptr, write_ptr, almemory_order_release); - return to_write; -} - - -void ll_ringbuffer_read_advance(ll_ringbuffer_t *rb, size_t cnt) -{ - ATOMIC_ADD(&rb->read_ptr, cnt, almemory_order_acq_rel); -} - -void ll_ringbuffer_write_advance(ll_ringbuffer_t *rb, size_t cnt) -{ - ATOMIC_ADD(&rb->write_ptr, cnt, almemory_order_acq_rel); -} - - -void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]) -{ - size_t free_cnt; - size_t cnt2; - size_t w, r; - - w = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->write_ptr, almemory_order_acquire); - r = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->read_ptr, almemory_order_acquire); - w &= rb->size_mask; - r &= rb->size_mask; - free_cnt = (w-r) & rb->size_mask; - - cnt2 = r + free_cnt; - if(cnt2 > rb->size_mask+1) - { - /* Two part vector: the rest of the buffer after the current write ptr, - * plus some from the start of the buffer. */ - vec[0].buf = (char*)&rb->buf[r*rb->elem_size]; - vec[0].len = rb->size_mask+1 - r; - vec[1].buf = (char*)rb->buf; - vec[1].len = cnt2 & rb->size_mask; - } - else - { - /* Single part vector: just the rest of the buffer */ - vec[0].buf = (char*)&rb->buf[r*rb->elem_size]; - vec[0].len = free_cnt; - vec[1].buf = NULL; - vec[1].len = 0; - } -} - -void ll_ringbuffer_get_write_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]) -{ - size_t free_cnt; - size_t cnt2; - size_t w, r; - - w = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->write_ptr, almemory_order_acquire); - r = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->read_ptr, almemory_order_acquire); - w &= rb->size_mask; - r &= rb->size_mask; - free_cnt = (r-w-1) & rb->size_mask; - if(free_cnt > rb->size) free_cnt = rb->size; - - cnt2 = w + free_cnt; - if(cnt2 > rb->size_mask+1) - { - /* Two part vector: the rest of the buffer after the current write ptr, - * plus some from the start of the buffer. */ - vec[0].buf = (char*)&rb->buf[w*rb->elem_size]; - vec[0].len = rb->size_mask+1 - w; - vec[1].buf = (char*)rb->buf; - vec[1].len = cnt2 & rb->size_mask; - } - else - { - vec[0].buf = (char*)&rb->buf[w*rb->elem_size]; - vec[0].len = free_cnt; - vec[1].buf = NULL; - vec[1].len = 0; - } -} diff --git a/Alc/ringbuffer.h b/Alc/ringbuffer.h deleted file mode 100644 index 0d05ec8..0000000 --- a/Alc/ringbuffer.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef RINGBUFFER_H -#define RINGBUFFER_H - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct ll_ringbuffer ll_ringbuffer_t; -typedef struct ll_ringbuffer_data { - char *buf; - size_t len; -} ll_ringbuffer_data_t; - - -/** - * Create a new ringbuffer to hold at least `sz' elements of `elem_sz' bytes. - * The number of elements is rounded up to the next power of two (even if it is - * already a power of two, to ensure the requested amount can be written). - */ -ll_ringbuffer_t *ll_ringbuffer_create(size_t sz, size_t elem_sz, int limit_writes); -/** Free all data associated with the ringbuffer `rb'. */ -void ll_ringbuffer_free(ll_ringbuffer_t *rb); -/** Reset the read and write pointers to zero. This is not thread safe. */ -void ll_ringbuffer_reset(ll_ringbuffer_t *rb); - -/** - * The non-copying data reader. `vec' is an array of two places. Set the values - * at `vec' to hold the current readable data at `rb'. If the readable data is - * in one segment the second segment has zero length. - */ -void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]); -/** - * The non-copying data writer. `vec' is an array of two places. Set the values - * at `vec' to hold the current writeable data at `rb'. If the writeable data - * is in one segment the second segment has zero length. - */ -void ll_ringbuffer_get_write_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]); - -/** - * Return the number of elements available for reading. This is the number of - * elements in front of the read pointer and behind the write pointer. - */ -size_t ll_ringbuffer_read_space(const ll_ringbuffer_t *rb); -/** - * The copying data reader. Copy at most `cnt' elements from `rb' to `dest'. - * Returns the actual number of elements copied. - */ -size_t ll_ringbuffer_read(ll_ringbuffer_t *rb, char *dest, size_t cnt); -/** - * The copying data reader w/o read pointer advance. Copy at most `cnt' - * elements from `rb' to `dest'. Returns the actual number of elements copied. - */ -size_t ll_ringbuffer_peek(ll_ringbuffer_t *rb, char *dest, size_t cnt); -/** Advance the read pointer `cnt' places. */ -void ll_ringbuffer_read_advance(ll_ringbuffer_t *rb, size_t cnt); - -/** - * Return the number of elements available for writing. This is the number of - * elements in front of the write pointer and behind the read pointer. - */ -size_t ll_ringbuffer_write_space(const ll_ringbuffer_t *rb); -/** - * The copying data writer. Copy at most `cnt' elements to `rb' from `src'. - * Returns the actual number of elements copied. - */ -size_t ll_ringbuffer_write(ll_ringbuffer_t *rb, const char *src, size_t cnt); -/** Advance the write pointer `cnt' places. */ -void ll_ringbuffer_write_advance(ll_ringbuffer_t *rb, size_t cnt); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* RINGBUFFER_H */ diff --git a/Alc/uhjfilter.c b/Alc/uhjfilter.c deleted file mode 100644 index 42b0bc4..0000000 --- a/Alc/uhjfilter.c +++ /dev/null @@ -1,120 +0,0 @@ - -#include "config.h" - -#include "alu.h" -#include "uhjfilter.h" - -/* This is the maximum number of samples processed for each inner loop - * iteration. */ -#define MAX_UPDATE_SAMPLES 128 - - -static const ALfloat Filter1CoeffSqr[4] = { - 0.479400865589f, 0.876218493539f, 0.976597589508f, 0.997499255936f -}; -static const ALfloat Filter2CoeffSqr[4] = { - 0.161758498368f, 0.733028932341f, 0.945349700329f, 0.990599156685f -}; - -static void allpass_process(AllPassState *state, ALfloat *restrict dst, const ALfloat *restrict src, const ALfloat aa, ALsizei todo) -{ - ALfloat z1 = state->z[0]; - ALfloat z2 = state->z[1]; - ALsizei i; - - for(i = 0;i < todo;i++) - { - ALfloat input = src[i]; - ALfloat output = input*aa + z1; - z1 = z2; z2 = output*aa - input; - dst[i] = output; - } - - state->z[0] = z1; - state->z[1] = z2; -} - - -/* NOTE: There seems to be a bit of an inconsistency in how this encoding is - * supposed to work. Some references, such as - * - * http://members.tripod.com/martin_leese/Ambisonic/UHJ_file_format.html - * - * specify a pre-scaling of sqrt(2) on the W channel input, while other - * references, such as - * - * https://en.wikipedia.org/wiki/Ambisonic_UHJ_format#Encoding.5B1.5D - * and - * https://wiki.xiph.org/Ambisonics#UHJ_format - * - * do not. The sqrt(2) scaling is in line with B-Format decoder coefficients - * which include such a scaling for the W channel input, however the original - * source for this equation is a 1985 paper by Michael Gerzon, which does not - * apparently include the scaling. Applying the extra scaling creates a louder - * result with a narrower stereo image compared to not scaling, and I don't - * know which is the intended result. - */ - -void EncodeUhj2(Uhj2Encoder *enc, ALfloat *restrict LeftOut, ALfloat *restrict RightOut, ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo) -{ - ALfloat D[MAX_UPDATE_SAMPLES], S[MAX_UPDATE_SAMPLES]; - ALfloat temp[2][MAX_UPDATE_SAMPLES]; - ALsizei base, i; - - ASSUME(SamplesToDo > 0); - - for(base = 0;base < SamplesToDo;) - { - ALsizei todo = mini(SamplesToDo - base, MAX_UPDATE_SAMPLES); - ASSUME(todo > 0); - - /* D = 0.6554516*Y */ - for(i = 0;i < todo;i++) - temp[0][i] = 0.6554516f*InSamples[2][base+i]; - allpass_process(&enc->Filter1_Y[0], temp[1], temp[0], Filter1CoeffSqr[0], todo); - allpass_process(&enc->Filter1_Y[1], temp[0], temp[1], Filter1CoeffSqr[1], todo); - allpass_process(&enc->Filter1_Y[2], temp[1], temp[0], Filter1CoeffSqr[2], todo); - allpass_process(&enc->Filter1_Y[3], temp[0], temp[1], Filter1CoeffSqr[3], todo); - /* NOTE: Filter1 requires a 1 sample delay for the final output, so - * take the last processed sample from the previous run as the first - * output sample. - */ - D[0] = enc->LastY; - for(i = 1;i < todo;i++) - D[i] = temp[0][i-1]; - enc->LastY = temp[0][i-1]; - - /* D += j(-0.3420201*W + 0.5098604*X) */ - for(i = 0;i < todo;i++) - temp[0][i] = -0.3420201f*InSamples[0][base+i] + - 0.5098604f*InSamples[1][base+i]; - allpass_process(&enc->Filter2_WX[0], temp[1], temp[0], Filter2CoeffSqr[0], todo); - allpass_process(&enc->Filter2_WX[1], temp[0], temp[1], Filter2CoeffSqr[1], todo); - allpass_process(&enc->Filter2_WX[2], temp[1], temp[0], Filter2CoeffSqr[2], todo); - allpass_process(&enc->Filter2_WX[3], temp[0], temp[1], Filter2CoeffSqr[3], todo); - for(i = 0;i < todo;i++) - D[i] += temp[0][i]; - - /* S = 0.9396926*W + 0.1855740*X */ - for(i = 0;i < todo;i++) - temp[0][i] = 0.9396926f*InSamples[0][base+i] + - 0.1855740f*InSamples[1][base+i]; - allpass_process(&enc->Filter1_WX[0], temp[1], temp[0], Filter1CoeffSqr[0], todo); - allpass_process(&enc->Filter1_WX[1], temp[0], temp[1], Filter1CoeffSqr[1], todo); - allpass_process(&enc->Filter1_WX[2], temp[1], temp[0], Filter1CoeffSqr[2], todo); - allpass_process(&enc->Filter1_WX[3], temp[0], temp[1], Filter1CoeffSqr[3], todo); - S[0] = enc->LastWX; - for(i = 1;i < todo;i++) - S[i] = temp[0][i-1]; - enc->LastWX = temp[0][i-1]; - - /* Left = (S + D)/2.0 */ - for(i = 0;i < todo;i++) - *(LeftOut++) += (S[i] + D[i]) * 0.5f; - /* Right = (S - D)/2.0 */ - for(i = 0;i < todo;i++) - *(RightOut++) += (S[i] - D[i]) * 0.5f; - - base += todo; - } -} diff --git a/Alc/vector.h b/Alc/vector.h deleted file mode 100644 index ed9acfb..0000000 --- a/Alc/vector.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef AL_VECTOR_H -#define AL_VECTOR_H - -#include - -#include - -#include "almalloc.h" - - -#define TYPEDEF_VECTOR(T, N) typedef struct { \ - size_t Capacity; \ - size_t Size; \ - T Data[]; \ -} _##N; \ -typedef _##N* N; \ -typedef const _##N* const_##N; - -#define VECTOR(T) struct { \ - size_t Capacity; \ - size_t Size; \ - T Data[]; \ -}* - -#define VECTOR_INIT(_x) do { (_x) = NULL; } while(0) -#define VECTOR_INIT_STATIC() NULL -#define VECTOR_DEINIT(_x) do { al_free((_x)); (_x) = NULL; } while(0) - -#define VECTOR_RESIZE(_x, _s, _c) do { \ - size_t _size = (_s); \ - size_t _cap = (_c); \ - if(_size > _cap) \ - _cap = _size; \ - \ - if(!(_x) && _cap == 0) \ - break; \ - \ - if(((_x) ? (_x)->Capacity : 0) < _cap) \ - { \ - ptrdiff_t data_offset = (_x) ? (char*)((_x)->Data) - (char*)(_x) : \ - sizeof(*(_x)); \ - size_t old_size = ((_x) ? (_x)->Size : 0); \ - void *temp; \ - \ - temp = al_calloc(16, data_offset + sizeof((_x)->Data[0])*_cap); \ - assert(temp != NULL); \ - if((_x)) \ - memcpy(((char*)temp)+data_offset, (_x)->Data, \ - sizeof((_x)->Data[0])*old_size); \ - \ - al_free((_x)); \ - (_x) = temp; \ - (_x)->Capacity = _cap; \ - } \ - (_x)->Size = _size; \ -} while(0) \ - -#define VECTOR_CAPACITY(_x) ((_x) ? (_x)->Capacity : 0) -#define VECTOR_SIZE(_x) ((_x) ? (_x)->Size : 0) - -#define VECTOR_BEGIN(_x) ((_x) ? (_x)->Data + 0 : NULL) -#define VECTOR_END(_x) ((_x) ? (_x)->Data + (_x)->Size : NULL) - -#define VECTOR_PUSH_BACK(_x, _obj) do { \ - size_t _pbsize = VECTOR_SIZE(_x)+1; \ - VECTOR_RESIZE(_x, _pbsize, _pbsize); \ - (_x)->Data[(_x)->Size-1] = (_obj); \ -} while(0) -#define VECTOR_POP_BACK(_x) ((void)((_x)->Size--)) - -#define VECTOR_BACK(_x) ((_x)->Data[(_x)->Size-1]) -#define VECTOR_FRONT(_x) ((_x)->Data[0]) - -#define VECTOR_ELEM(_x, _o) ((_x)->Data[(_o)]) - -#define VECTOR_FOR_EACH(_t, _x, _f) do { \ - _t *_iter = VECTOR_BEGIN((_x)); \ - _t *_end = VECTOR_END((_x)); \ - for(;_iter != _end;++_iter) \ - _f(_iter); \ -} while(0) - -#define VECTOR_FIND_IF(_i, _t, _x, _f) do { \ - _t *_iter = VECTOR_BEGIN((_x)); \ - _t *_end = VECTOR_END((_x)); \ - for(;_iter != _end;++_iter) \ - { \ - if(_f(_iter)) \ - break; \ - } \ - (_i) = _iter; \ -} while(0) - -#endif /* AL_VECTOR_H */ diff --git a/OpenAL32/alAuxEffectSlot.c b/OpenAL32/alAuxEffectSlot.c deleted file mode 100644 index 815a8d5..0000000 --- a/OpenAL32/alAuxEffectSlot.c +++ /dev/null @@ -1,798 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alListener.h" -#include "alSource.h" - -#include "fpu_modes.h" -#include "almalloc.h" - - -extern inline void LockEffectSlotList(ALCcontext *context); -extern inline void UnlockEffectSlotList(ALCcontext *context); - -static void AddActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context); -static void RemoveActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context); - -static const struct { - ALenum Type; - EffectStateFactory* (*GetFactory)(void); -} FactoryList[] = { - { AL_EFFECT_NULL, NullStateFactory_getFactory }, - { AL_EFFECT_EAXREVERB, ReverbStateFactory_getFactory }, - { AL_EFFECT_REVERB, ReverbStateFactory_getFactory }, - { AL_EFFECT_AUTOWAH, AutowahStateFactory_getFactory }, - { AL_EFFECT_CHORUS, ChorusStateFactory_getFactory }, - { AL_EFFECT_COMPRESSOR, CompressorStateFactory_getFactory }, - { AL_EFFECT_DISTORTION, DistortionStateFactory_getFactory }, - { AL_EFFECT_ECHO, EchoStateFactory_getFactory }, - { AL_EFFECT_EQUALIZER, EqualizerStateFactory_getFactory }, - { AL_EFFECT_FLANGER, FlangerStateFactory_getFactory }, - { AL_EFFECT_FREQUENCY_SHIFTER, FshifterStateFactory_getFactory }, - { AL_EFFECT_RING_MODULATOR, ModulatorStateFactory_getFactory }, - { AL_EFFECT_PITCH_SHIFTER, PshifterStateFactory_getFactory}, - { AL_EFFECT_DEDICATED_DIALOGUE, DedicatedStateFactory_getFactory }, - { AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, DedicatedStateFactory_getFactory } -}; - -static inline EffectStateFactory *getFactoryByType(ALenum type) -{ - size_t i; - for(i = 0;i < COUNTOF(FactoryList);i++) - { - if(FactoryList[i].Type == type) - return FactoryList[i].GetFactory(); - } - return NULL; -} - -static void ALeffectState_IncRef(ALeffectState *state); - - -static inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) -{ - id--; - if(UNLIKELY(id >= VECTOR_SIZE(context->EffectSlotList))) - return NULL; - return VECTOR_ELEM(context->EffectSlotList, id); -} - -static inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) -{ - EffectSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(device->EffectList))) - return NULL; - sublist = &VECTOR_ELEM(device->EffectList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Effects + slidx; -} - - -#define DO_UPDATEPROPS() do { \ - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ - UpdateEffectSlotProps(slot, context); \ - else \ - ATOMIC_FLAG_CLEAR(&slot->PropsClean, almemory_order_release); \ -} while(0) - - -AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots) -{ - ALCdevice *device; - ALCcontext *context; - ALsizei cur; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Generating %d effect slots", n); - if(n == 0) goto done; - - LockEffectSlotList(context); - device = context->Device; - if(device->AuxiliaryEffectSlotMax - VECTOR_SIZE(context->EffectSlotList) < (ALuint)n) - { - UnlockEffectSlotList(context); - SETERR_GOTO(context, AL_OUT_OF_MEMORY, done, "Exceeding %u auxiliary effect slot limit", - device->AuxiliaryEffectSlotMax); - } - for(cur = 0;cur < n;cur++) - { - ALeffectslotPtr *iter = VECTOR_BEGIN(context->EffectSlotList); - ALeffectslotPtr *end = VECTOR_END(context->EffectSlotList); - ALeffectslot *slot = NULL; - ALenum err = AL_OUT_OF_MEMORY; - - for(;iter != end;iter++) - { - if(!*iter) - break; - } - if(iter == end) - { - VECTOR_PUSH_BACK(context->EffectSlotList, NULL); - iter = &VECTOR_BACK(context->EffectSlotList); - } - slot = al_calloc(16, sizeof(ALeffectslot)); - if(!slot || (err=InitEffectSlot(slot)) != AL_NO_ERROR) - { - al_free(slot); - UnlockEffectSlotList(context); - - alDeleteAuxiliaryEffectSlots(cur, effectslots); - SETERR_GOTO(context, err, done, "Effect slot object allocation failed"); - } - aluInitEffectPanning(slot); - - slot->id = (iter - VECTOR_BEGIN(context->EffectSlotList)) + 1; - *iter = slot; - - effectslots[cur] = slot->id; - } - AddActiveEffectSlots(effectslots, n, context); - UnlockEffectSlotList(context); - -done: - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots) -{ - ALCcontext *context; - ALeffectslot *slot; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d effect slots", n); - if(n == 0) goto done; - - for(i = 0;i < n;i++) - { - if((slot=LookupEffectSlot(context, effectslots[i])) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", - effectslots[i]); - if(ReadRef(&slot->ref) != 0) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Deleting in-use effect slot %u", - effectslots[i]); - } - - // All effectslots are valid - RemoveActiveEffectSlots(effectslots, n, context); - for(i = 0;i < n;i++) - { - if((slot=LookupEffectSlot(context, effectslots[i])) == NULL) - continue; - VECTOR_ELEM(context->EffectSlotList, effectslots[i]-1) = NULL; - - DeinitEffectSlot(slot); - - memset(slot, 0, sizeof(*slot)); - al_free(slot); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot) -{ - ALCcontext *context; - ALboolean ret; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - LockEffectSlotList(context); - ret = (LookupEffectSlot(context, effectslot) ? AL_TRUE : AL_FALSE); - UnlockEffectSlotList(context); - - ALCcontext_DecRef(context); - - return ret; -} - -AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint value) -{ - ALCdevice *device; - ALCcontext *context; - ALeffectslot *slot; - ALeffect *effect = NULL; - ALenum err; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - LockEffectSlotList(context); - if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - case AL_EFFECTSLOT_EFFECT: - device = context->Device; - - LockEffectList(device); - effect = (value ? LookupEffect(device, value) : NULL); - if(!(value == 0 || effect != NULL)) - { - UnlockEffectList(device); - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Invalid effect ID %u", value); - } - err = InitializeEffect(context, slot, effect); - UnlockEffectList(device); - - if(err != AL_NO_ERROR) - SETERR_GOTO(context, err, done, "Effect initialization failed"); - break; - - case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: - if(!(value == AL_TRUE || value == AL_FALSE)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, - "Effect slot auxiliary send auto out of range"); - slot->AuxSendAuto = value; - break; - - default: - SETERR_GOTO(context, AL_INVALID_ENUM, done, "Invalid effect slot integer property 0x%04x", - param); - } - DO_UPDATEPROPS(); - -done: - UnlockEffectSlotList(context); - almtx_unlock(&context->PropLock); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *values) -{ - ALCcontext *context; - - switch(param) - { - case AL_EFFECTSLOT_EFFECT: - case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: - alAuxiliaryEffectSloti(effectslot, param, values[0]); - return; - } - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if(LookupEffectSlot(context, effectslot) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid effect slot integer-vector property 0x%04x", - param); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat value) -{ - ALCcontext *context; - ALeffectslot *slot; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - LockEffectSlotList(context); - if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - case AL_EFFECTSLOT_GAIN: - if(!(value >= 0.0f && value <= 1.0f)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Effect slot gain out of range"); - slot->Gain = value; - break; - - default: - SETERR_GOTO(context, AL_INVALID_ENUM, done, "Invalid effect slot float property 0x%04x", - param); - } - DO_UPDATEPROPS(); - -done: - UnlockEffectSlotList(context); - almtx_unlock(&context->PropLock); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *values) -{ - ALCcontext *context; - - switch(param) - { - case AL_EFFECTSLOT_GAIN: - alAuxiliaryEffectSlotf(effectslot, param, values[0]); - return; - } - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if(LookupEffectSlot(context, effectslot) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid effect slot float-vector property 0x%04x", - param); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *value) -{ - ALCcontext *context; - ALeffectslot *slot; - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: - *value = slot->AuxSendAuto; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid effect slot integer property 0x%04x", param); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *values) -{ - ALCcontext *context; - - switch(param) - { - case AL_EFFECTSLOT_EFFECT: - case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: - alGetAuxiliaryEffectSloti(effectslot, param, values); - return; - } - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if(LookupEffectSlot(context, effectslot) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid effect slot integer-vector property 0x%04x", - param); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *value) -{ - ALCcontext *context; - ALeffectslot *slot; - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - case AL_EFFECTSLOT_GAIN: - *value = slot->Gain; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid effect slot float property 0x%04x", param); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *values) -{ - ALCcontext *context; - - switch(param) - { - case AL_EFFECTSLOT_GAIN: - alGetAuxiliaryEffectSlotf(effectslot, param, values); - return; - } - - context = GetContextRef(); - if(!context) return; - - LockEffectSlotList(context); - if(LookupEffectSlot(context, effectslot) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid effect slot float-vector property 0x%04x", - param); - } - -done: - UnlockEffectSlotList(context); - ALCcontext_DecRef(context); -} - - -ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect) -{ - ALCdevice *Device = Context->Device; - ALenum newtype = (effect ? effect->type : AL_EFFECT_NULL); - struct ALeffectslotProps *props; - ALeffectState *State; - - if(newtype != EffectSlot->Effect.Type) - { - EffectStateFactory *factory; - - factory = getFactoryByType(newtype); - if(!factory) - { - ERR("Failed to find factory for effect type 0x%04x\n", newtype); - return AL_INVALID_ENUM; - } - State = EffectStateFactory_create(factory); - if(!State) return AL_OUT_OF_MEMORY; - - START_MIXER_MODE(); - almtx_lock(&Device->BackendLock); - State->OutBuffer = Device->Dry.Buffer; - State->OutChannels = Device->Dry.NumChannels; - if(V(State,deviceUpdate)(Device) == AL_FALSE) - { - almtx_unlock(&Device->BackendLock); - LEAVE_MIXER_MODE(); - ALeffectState_DecRef(State); - return AL_OUT_OF_MEMORY; - } - almtx_unlock(&Device->BackendLock); - END_MIXER_MODE(); - - if(!effect) - { - EffectSlot->Effect.Type = AL_EFFECT_NULL; - memset(&EffectSlot->Effect.Props, 0, sizeof(EffectSlot->Effect.Props)); - } - else - { - EffectSlot->Effect.Type = effect->type; - EffectSlot->Effect.Props = effect->Props; - } - - ALeffectState_DecRef(EffectSlot->Effect.State); - EffectSlot->Effect.State = State; - } - else if(effect) - EffectSlot->Effect.Props = effect->Props; - - /* Remove state references from old effect slot property updates. */ - props = ATOMIC_LOAD_SEQ(&Context->FreeEffectslotProps); - while(props) - { - if(props->State) - ALeffectState_DecRef(props->State); - props->State = NULL; - props = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } - - return AL_NO_ERROR; -} - - -static void ALeffectState_IncRef(ALeffectState *state) -{ - uint ref; - ref = IncrementRef(&state->Ref); - TRACEREF("%p increasing refcount to %u\n", state, ref); -} - -void ALeffectState_DecRef(ALeffectState *state) -{ - uint ref; - ref = DecrementRef(&state->Ref); - TRACEREF("%p decreasing refcount to %u\n", state, ref); - if(ref == 0) DELETE_OBJ(state); -} - - -void ALeffectState_Construct(ALeffectState *state) -{ - InitRef(&state->Ref, 1); - - state->OutBuffer = NULL; - state->OutChannels = 0; -} - -void ALeffectState_Destruct(ALeffectState *UNUSED(state)) -{ -} - - -static void AddActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context) -{ - struct ALeffectslotArray *curarray = ATOMIC_LOAD(&context->ActiveAuxSlots, - almemory_order_acquire); - struct ALeffectslotArray *newarray = NULL; - ALsizei newcount = curarray->count + count; - ALCdevice *device = context->Device; - ALsizei i, j; - - /* Insert the new effect slots into the head of the array, followed by the - * existing ones. - */ - newarray = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, newcount)); - newarray->count = newcount; - for(i = 0;i < count;i++) - newarray->slot[i] = LookupEffectSlot(context, slotids[i]); - for(j = 0;i < newcount;) - newarray->slot[i++] = curarray->slot[j++]; - /* Remove any duplicates (first instance of each will be kept). */ - for(i = 1;i < newcount;i++) - { - for(j = i;j != 0;) - { - if(UNLIKELY(newarray->slot[i] == newarray->slot[--j])) - { - newcount--; - for(j = i;j < newcount;j++) - newarray->slot[j] = newarray->slot[j+1]; - i--; - break; - } - } - } - - /* Reallocate newarray if the new size ended up smaller from duplicate - * removal. - */ - if(UNLIKELY(newcount < newarray->count)) - { - struct ALeffectslotArray *tmpnewarray = al_calloc(DEF_ALIGN, - FAM_SIZE(struct ALeffectslotArray, slot, newcount)); - memcpy(tmpnewarray, newarray, FAM_SIZE(struct ALeffectslotArray, slot, newcount)); - al_free(newarray); - newarray = tmpnewarray; - newarray->count = newcount; - } - - curarray = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, newarray, almemory_order_acq_rel); - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); - al_free(curarray); -} - -static void RemoveActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context) -{ - struct ALeffectslotArray *curarray = ATOMIC_LOAD(&context->ActiveAuxSlots, - almemory_order_acquire); - struct ALeffectslotArray *newarray = NULL; - ALCdevice *device = context->Device; - ALsizei i, j; - - /* Don't shrink the allocated array size since we don't know how many (if - * any) of the effect slots to remove are in the array. - */ - newarray = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, curarray->count)); - newarray->count = 0; - for(i = 0;i < curarray->count;i++) - { - /* Insert this slot into the new array only if it's not one to remove. */ - ALeffectslot *slot = curarray->slot[i]; - for(j = count;j != 0;) - { - if(slot->id == slotids[--j]) - goto skip_ins; - } - newarray->slot[newarray->count++] = slot; - skip_ins: ; - } - - /* TODO: Could reallocate newarray now that we know it's needed size. */ - - curarray = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, newarray, almemory_order_acq_rel); - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); - al_free(curarray); -} - - -ALenum InitEffectSlot(ALeffectslot *slot) -{ - EffectStateFactory *factory; - - slot->Effect.Type = AL_EFFECT_NULL; - - factory = getFactoryByType(AL_EFFECT_NULL); - slot->Effect.State = EffectStateFactory_create(factory); - if(!slot->Effect.State) return AL_OUT_OF_MEMORY; - - slot->Gain = 1.0; - slot->AuxSendAuto = AL_TRUE; - ATOMIC_FLAG_TEST_AND_SET(&slot->PropsClean, almemory_order_relaxed); - InitRef(&slot->ref, 0); - - ATOMIC_INIT(&slot->Update, NULL); - - slot->Params.Gain = 1.0f; - slot->Params.AuxSendAuto = AL_TRUE; - ALeffectState_IncRef(slot->Effect.State); - slot->Params.EffectState = slot->Effect.State; - slot->Params.RoomRolloff = 0.0f; - slot->Params.DecayTime = 0.0f; - slot->Params.DecayLFRatio = 0.0f; - slot->Params.DecayHFRatio = 0.0f; - slot->Params.DecayHFLimit = AL_FALSE; - slot->Params.AirAbsorptionGainHF = 1.0f; - - return AL_NO_ERROR; -} - -void DeinitEffectSlot(ALeffectslot *slot) -{ - struct ALeffectslotProps *props; - - props = ATOMIC_LOAD_SEQ(&slot->Update); - if(props) - { - if(props->State) ALeffectState_DecRef(props->State); - TRACE("Freed unapplied AuxiliaryEffectSlot update %p\n", props); - al_free(props); - } - - ALeffectState_DecRef(slot->Effect.State); - if(slot->Params.EffectState) - ALeffectState_DecRef(slot->Params.EffectState); -} - -void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context) -{ - struct ALeffectslotProps *props; - ALeffectState *oldstate; - - /* Get an unused property container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&context->FreeEffectslotProps, almemory_order_relaxed); - if(!props) - props = al_calloc(16, sizeof(*props)); - else - { - struct ALeffectslotProps *next; - do { - next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeEffectslotProps, &props, next, - almemory_order_seq_cst, almemory_order_acquire) == 0); - } - - /* Copy in current property values. */ - props->Gain = slot->Gain; - props->AuxSendAuto = slot->AuxSendAuto; - - props->Type = slot->Effect.Type; - props->Props = slot->Effect.Props; - /* Swap out any stale effect state object there may be in the container, to - * delete it. - */ - ALeffectState_IncRef(slot->Effect.State); - oldstate = props->State; - props->State = slot->Effect.State; - - /* Set the new container for updating internal parameters. */ - props = ATOMIC_EXCHANGE_PTR(&slot->Update, props, almemory_order_acq_rel); - if(props) - { - /* If there was an unused update container, put it back in the - * freelist. - */ - ATOMIC_REPLACE_HEAD(struct ALeffectslotProps*, &context->FreeEffectslotProps, props); - } - - if(oldstate) - ALeffectState_DecRef(oldstate); -} - -void UpdateAllEffectSlotProps(ALCcontext *context) -{ - struct ALeffectslotArray *auxslots; - ALsizei i; - - LockEffectSlotList(context); - auxslots = ATOMIC_LOAD(&context->ActiveAuxSlots, almemory_order_acquire); - for(i = 0;i < auxslots->count;i++) - { - ALeffectslot *slot = auxslots->slot[i]; - if(!ATOMIC_FLAG_TEST_AND_SET(&slot->PropsClean, almemory_order_acq_rel)) - UpdateEffectSlotProps(slot, context); - } - UnlockEffectSlotList(context); -} - -ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *context) -{ - ALeffectslotPtr *iter = VECTOR_BEGIN(context->EffectSlotList); - ALeffectslotPtr *end = VECTOR_END(context->EffectSlotList); - size_t leftover = 0; - - for(;iter != end;iter++) - { - ALeffectslot *slot = *iter; - if(!slot) continue; - *iter = NULL; - - DeinitEffectSlot(slot); - - memset(slot, 0, sizeof(*slot)); - al_free(slot); - ++leftover; - } - if(leftover > 0) - WARN("(%p) Deleted "SZFMT" AuxiliaryEffectSlot%s\n", context, leftover, (leftover==1)?"":"s"); -} diff --git a/OpenAL32/alBuffer.c b/OpenAL32/alBuffer.c deleted file mode 100644 index ed71243..0000000 --- a/OpenAL32/alBuffer.c +++ /dev/null @@ -1,1305 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#ifdef HAVE_MALLOC_H -#include -#endif - -#include "alMain.h" -#include "alu.h" -#include "alError.h" -#include "alBuffer.h" -#include "sample_cvt.h" - - -extern inline void LockBufferList(ALCdevice *device); -extern inline void UnlockBufferList(ALCdevice *device); -extern inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type); -extern inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type); - -static ALbuffer *AllocBuffer(ALCcontext *context); -static void FreeBuffer(ALCdevice *device, ALbuffer *buffer); -static const ALchar *NameFromUserFmtType(enum UserFmtType type); -static void LoadData(ALCcontext *context, ALbuffer *buffer, ALuint freq, ALsizei size, - enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, - const ALvoid *data, ALbitfieldSOFT access); -static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, enum UserFmtType *type); -static ALsizei SanitizeAlignment(enum UserFmtType type, ALsizei align); - -static inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) -{ - BufferSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(device->BufferList))) - return NULL; - sublist = &VECTOR_ELEM(device->BufferList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Buffers + slidx; -} - - -#define INVALID_STORAGE_MASK ~(AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT | AL_PRESERVE_DATA_BIT_SOFT | AL_MAP_PERSISTENT_BIT_SOFT) -#define MAP_READ_WRITE_FLAGS (AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT) -#define INVALID_MAP_FLAGS ~(AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT | AL_MAP_PERSISTENT_BIT_SOFT) - - -AL_API ALvoid AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers) -{ - ALCcontext *context; - ALsizei cur = 0; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - alSetError(context, AL_INVALID_VALUE, "Generating %d buffers", n); - else for(cur = 0;cur < n;cur++) - { - ALbuffer *buffer = AllocBuffer(context); - if(!buffer) - { - alDeleteBuffers(cur, buffers); - break; - } - - buffers[cur] = buffer->id; - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *ALBuf; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - - LockBufferList(device); - if(UNLIKELY(n < 0)) - { - alSetError(context, AL_INVALID_VALUE, "Deleting %d buffers", n); - goto done; - } - - for(i = 0;i < n;i++) - { - if(!buffers[i]) - continue; - - /* Check for valid Buffer ID, and make sure it's not in use. */ - if((ALBuf=LookupBuffer(device, buffers[i])) == NULL) - { - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffers[i]); - goto done; - } - if(ReadRef(&ALBuf->ref) != 0) - { - alSetError(context, AL_INVALID_OPERATION, "Deleting in-use buffer %u", buffers[i]); - goto done; - } - } - for(i = 0;i < n;i++) - { - if((ALBuf=LookupBuffer(device, buffers[i])) != NULL) - FreeBuffer(device, ALBuf); - } - -done: - UnlockBufferList(device); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer) -{ - ALCcontext *context; - ALboolean ret; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - LockBufferList(context->Device); - ret = ((!buffer || LookupBuffer(context->Device, buffer)) ? - AL_TRUE : AL_FALSE); - UnlockBufferList(context->Device); - - ALCcontext_DecRef(context); - - return ret; -} - - -AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq) -{ alBufferStorageSOFT(buffer, format, data, size, freq, 0); } - -AL_API void AL_APIENTRY alBufferStorageSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq, ALbitfieldSOFT flags) -{ - enum UserFmtChannels srcchannels = UserFmtMono; - enum UserFmtType srctype = UserFmtUByte; - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(size < 0)) - alSetError(context, AL_INVALID_VALUE, "Negative storage size %d", size); - else if(UNLIKELY(freq < 1)) - alSetError(context, AL_INVALID_VALUE, "Invalid sample rate %d", freq); - else if(UNLIKELY((flags&INVALID_STORAGE_MASK) != 0)) - alSetError(context, AL_INVALID_VALUE, "Invalid storage flags 0x%x", - flags&INVALID_STORAGE_MASK); - else if(UNLIKELY((flags&AL_MAP_PERSISTENT_BIT_SOFT) && !(flags&MAP_READ_WRITE_FLAGS))) - alSetError(context, AL_INVALID_VALUE, - "Declaring persistently mapped storage without read or write access"); - else if(UNLIKELY(DecomposeUserFormat(format, &srcchannels, &srctype) == AL_FALSE)) - alSetError(context, AL_INVALID_ENUM, "Invalid format 0x%04x", format); - else - LoadData(context, albuf, freq, size, srcchannels, srctype, data, flags); - - UnlockBufferList(device); - ALCcontext_DecRef(context); -} - -AL_API void* AL_APIENTRY alMapBufferSOFT(ALuint buffer, ALsizei offset, ALsizei length, ALbitfieldSOFT access) -{ - void *retval = NULL; - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return retval; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY((access&INVALID_MAP_FLAGS) != 0)) - alSetError(context, AL_INVALID_VALUE, "Invalid map flags 0x%x", access&INVALID_MAP_FLAGS); - else if(UNLIKELY(!(access&MAP_READ_WRITE_FLAGS))) - alSetError(context, AL_INVALID_VALUE, "Mapping buffer %u without read or write access", - buffer); - else - { - ALbitfieldSOFT unavailable = (albuf->Access^access) & access; - if(UNLIKELY(ReadRef(&albuf->ref) != 0 && !(access&AL_MAP_PERSISTENT_BIT_SOFT))) - alSetError(context, AL_INVALID_OPERATION, - "Mapping in-use buffer %u without persistent mapping", buffer); - else if(UNLIKELY(albuf->MappedAccess != 0)) - alSetError(context, AL_INVALID_OPERATION, "Mapping already-mapped buffer %u", buffer); - else if(UNLIKELY((unavailable&AL_MAP_READ_BIT_SOFT))) - alSetError(context, AL_INVALID_VALUE, - "Mapping buffer %u for reading without read access", buffer); - else if(UNLIKELY((unavailable&AL_MAP_WRITE_BIT_SOFT))) - alSetError(context, AL_INVALID_VALUE, - "Mapping buffer %u for writing without write access", buffer); - else if(UNLIKELY((unavailable&AL_MAP_PERSISTENT_BIT_SOFT))) - alSetError(context, AL_INVALID_VALUE, - "Mapping buffer %u persistently without persistent access", buffer); - else if(UNLIKELY(offset < 0 || offset >= albuf->OriginalSize || - length <= 0 || length > albuf->OriginalSize - offset)) - alSetError(context, AL_INVALID_VALUE, "Mapping invalid range %d+%d for buffer %u", - offset, length, buffer); - else - { - retval = (ALbyte*)albuf->data + offset; - albuf->MappedAccess = access; - albuf->MappedOffset = offset; - albuf->MappedSize = length; - } - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); - return retval; -} - -AL_API void AL_APIENTRY alUnmapBufferSOFT(ALuint buffer) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(albuf->MappedAccess == 0) - alSetError(context, AL_INVALID_OPERATION, "Unmapping unmapped buffer %u", buffer); - else - { - albuf->MappedAccess = 0; - albuf->MappedOffset = 0; - albuf->MappedSize = 0; - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alFlushMappedBufferSOFT(ALuint buffer, ALsizei offset, ALsizei length) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!(albuf->MappedAccess&AL_MAP_WRITE_BIT_SOFT))) - alSetError(context, AL_INVALID_OPERATION, - "Flushing buffer %u while not mapped for writing", buffer); - else if(UNLIKELY(offset < albuf->MappedOffset || - offset >= albuf->MappedOffset+albuf->MappedSize || - length <= 0 || length > albuf->MappedOffset+albuf->MappedSize-offset)) - alSetError(context, AL_INVALID_VALUE, "Flushing invalid range %d+%d on buffer %u", - offset, length, buffer); - else - { - /* FIXME: Need to use some method of double-buffering for the mixer and - * app to hold separate memory, which can be safely transfered - * asynchronously. Currently we just say the app shouldn't write where - * OpenAL's reading, and hope for the best... - */ - ATOMIC_THREAD_FENCE(almemory_order_seq_cst); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length) -{ - enum UserFmtChannels srcchannels = UserFmtMono; - enum UserFmtType srctype = UserFmtUByte; - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(DecomposeUserFormat(format, &srcchannels, &srctype) == AL_FALSE)) - alSetError(context, AL_INVALID_ENUM, "Invalid format 0x%04x", format); - else - { - ALsizei unpack_align, align; - ALsizei byte_align; - ALsizei frame_size; - ALsizei num_chans; - void *dst; - - unpack_align = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - align = SanitizeAlignment(srctype, unpack_align); - if(UNLIKELY(align < 1)) - alSetError(context, AL_INVALID_VALUE, "Invalid unpack alignment %d", unpack_align); - else if(UNLIKELY((long)srcchannels != (long)albuf->FmtChannels || - srctype != albuf->OriginalType)) - alSetError(context, AL_INVALID_ENUM, "Unpacking data with mismatched format"); - else if(UNLIKELY(align != albuf->OriginalAlign)) - alSetError(context, AL_INVALID_VALUE, - "Unpacking data with alignment %u does not match original alignment %u", - align, albuf->OriginalAlign); - else if(UNLIKELY(albuf->MappedAccess != 0)) - alSetError(context, AL_INVALID_OPERATION, "Unpacking data into mapped buffer %u", - buffer); - else - { - num_chans = ChannelsFromFmt(albuf->FmtChannels); - frame_size = num_chans * BytesFromFmt(albuf->FmtType); - if(albuf->OriginalType == UserFmtIMA4) - byte_align = ((align-1)/2 + 4) * num_chans; - else if(albuf->OriginalType == UserFmtMSADPCM) - byte_align = ((align-2)/2 + 7) * num_chans; - else - byte_align = align * frame_size; - - if(UNLIKELY(offset < 0 || length < 0 || offset > albuf->OriginalSize || - length > albuf->OriginalSize-offset)) - alSetError(context, AL_INVALID_VALUE, "Invalid data sub-range %d+%d on buffer %u", - offset, length, buffer); - else if(UNLIKELY((offset%byte_align) != 0)) - alSetError(context, AL_INVALID_VALUE, - "Sub-range offset %d is not a multiple of frame size %d (%d unpack alignment)", - offset, byte_align, align); - else if(UNLIKELY((length%byte_align) != 0)) - alSetError(context, AL_INVALID_VALUE, - "Sub-range length %d is not a multiple of frame size %d (%d unpack alignment)", - length, byte_align, align); - else - { - /* offset -> byte offset, length -> sample count */ - offset = offset/byte_align * align * frame_size; - length = length/byte_align * align; - - dst = (ALbyte*)albuf->data + offset; - if(srctype == UserFmtIMA4 && albuf->FmtType == FmtShort) - Convert_ALshort_ALima4(dst, data, num_chans, length, align); - else if(srctype == UserFmtMSADPCM && albuf->FmtType == FmtShort) - Convert_ALshort_ALmsadpcm(dst, data, num_chans, length, align); - else - { - assert((long)srctype == (long)albuf->FmtType); - memcpy(dst, data, length*frame_size); - } - } - } - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint UNUSED(buffer), - ALuint UNUSED(samplerate), ALenum UNUSED(internalformat), ALsizei UNUSED(samples), - ALenum UNUSED(channels), ALenum UNUSED(type), const ALvoid *UNUSED(data)) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - alSetError(context, AL_INVALID_OPERATION, "alBufferSamplesSOFT not supported"); - - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint UNUSED(buffer), - ALsizei UNUSED(offset), ALsizei UNUSED(samples), - ALenum UNUSED(channels), ALenum UNUSED(type), const ALvoid *UNUSED(data)) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - alSetError(context, AL_INVALID_OPERATION, "alBufferSubSamplesSOFT not supported"); - - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint UNUSED(buffer), - ALsizei UNUSED(offset), ALsizei UNUSED(samples), - ALenum UNUSED(channels), ALenum UNUSED(type), ALvoid *UNUSED(data)) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - alSetError(context, AL_INVALID_OPERATION, "alGetBufferSamplesSOFT not supported"); - - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum UNUSED(format)) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - alSetError(context, AL_INVALID_OPERATION, "alIsBufferFormatSupportedSOFT not supported"); - - ALCcontext_DecRef(context); - return AL_FALSE; -} - - -AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat UNUSED(value)) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer float property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat UNUSED(value1), ALfloat UNUSED(value2), ALfloat UNUSED(value3)) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-float property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!values)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer float-vector property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else switch(param) - { - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - if(UNLIKELY(value < 0)) - alSetError(context, AL_INVALID_VALUE, "Invalid unpack block alignment %d", value); - else - ATOMIC_STORE_SEQ(&albuf->UnpackAlign, value); - break; - - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - if(UNLIKELY(value < 0)) - alSetError(context, AL_INVALID_VALUE, "Invalid pack block alignment %d", value); - else - ATOMIC_STORE_SEQ(&albuf->PackAlign, value); - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint UNUSED(value1), ALint UNUSED(value2), ALint UNUSED(value3)) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-integer property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - if(values) - { - switch(param) - { - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - alBufferi(buffer, param, values[0]); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!values)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_LOOP_POINTS_SOFT: - if(UNLIKELY(ReadRef(&albuf->ref) != 0)) - alSetError(context, AL_INVALID_OPERATION, "Modifying in-use buffer %u's loop points", - buffer); - else if(UNLIKELY(values[0] >= values[1] || values[0] < 0 || values[1] > albuf->SampleLen)) - alSetError(context, AL_INVALID_VALUE, "Invalid loop point range %d -> %d o buffer %u", - values[0], values[1], buffer); - else - { - albuf->LoopStart = values[0]; - albuf->LoopEnd = values[1]; - } - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer-vector property 0x%04x", - param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!value)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer float property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!value1 || !value2 || !value3)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-float property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values) -{ - ALCdevice *device; - ALCcontext *context; - - switch(param) - { - case AL_SEC_LENGTH_SOFT: - alGetBufferf(buffer, param, values); - return; - } - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!values)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer float-vector property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!value)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_FREQUENCY: - *value = albuf->Frequency; - break; - - case AL_BITS: - *value = BytesFromFmt(albuf->FmtType) * 8; - break; - - case AL_CHANNELS: - *value = ChannelsFromFmt(albuf->FmtChannels); - break; - - case AL_SIZE: - *value = albuf->SampleLen * FrameSizeFromFmt(albuf->FmtChannels, - albuf->FmtType); - break; - - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - *value = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - break; - - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - *value = ATOMIC_LOAD_SEQ(&albuf->PackAlign); - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!value1 || !value2 || !value3)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-integer property 0x%04x", param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - switch(param) - { - case AL_FREQUENCY: - case AL_BITS: - case AL_CHANNELS: - case AL_SIZE: - case AL_INTERNAL_FORMAT_SOFT: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - alGetBufferi(buffer, param, values); - return; - } - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBufferList(device); - if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) - alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); - else if(UNLIKELY(!values)) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_LOOP_POINTS_SOFT: - values[0] = albuf->LoopStart; - values[1] = albuf->LoopEnd; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer-vector property 0x%04x", - param); - } - UnlockBufferList(device); - - ALCcontext_DecRef(context); -} - - -static const ALchar *NameFromUserFmtType(enum UserFmtType type) -{ - switch(type) - { - case UserFmtUByte: return "Unsigned Byte"; - case UserFmtShort: return "Signed Short"; - case UserFmtFloat: return "Float32"; - case UserFmtDouble: return "Float64"; - case UserFmtMulaw: return "muLaw"; - case UserFmtAlaw: return "aLaw"; - case UserFmtIMA4: return "IMA4 ADPCM"; - case UserFmtMSADPCM: return "MSADPCM"; - } - return ""; -} - -/* - * LoadData - * - * Loads the specified data into the buffer, using the specified format. - */ -static void LoadData(ALCcontext *context, ALbuffer *ALBuf, ALuint freq, ALsizei size, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALbitfieldSOFT access) -{ - enum FmtChannels DstChannels = FmtMono; - enum FmtType DstType = FmtUByte; - ALsizei NumChannels, FrameSize; - ALsizei SrcByteAlign; - ALsizei unpackalign; - ALsizei newsize; - ALsizei frames; - ALsizei align; - - if(UNLIKELY(ReadRef(&ALBuf->ref) != 0 || ALBuf->MappedAccess != 0)) - SETERR_RETURN(context, AL_INVALID_OPERATION,, "Modifying storage for in-use buffer %u", - ALBuf->id); - - /* Currently no channel configurations need to be converted. */ - switch(SrcChannels) - { - case UserFmtMono: DstChannels = FmtMono; break; - case UserFmtStereo: DstChannels = FmtStereo; break; - case UserFmtRear: DstChannels = FmtRear; break; - case UserFmtQuad: DstChannels = FmtQuad; break; - case UserFmtX51: DstChannels = FmtX51; break; - case UserFmtX61: DstChannels = FmtX61; break; - case UserFmtX71: DstChannels = FmtX71; break; - case UserFmtBFormat2D: DstChannels = FmtBFormat2D; break; - case UserFmtBFormat3D: DstChannels = FmtBFormat3D; break; - } - if(UNLIKELY((long)SrcChannels != (long)DstChannels)) - SETERR_RETURN(context, AL_INVALID_ENUM,, "Invalid format"); - - /* IMA4 and MSADPCM convert to 16-bit short. */ - switch(SrcType) - { - case UserFmtUByte: DstType = FmtUByte; break; - case UserFmtShort: DstType = FmtShort; break; - case UserFmtFloat: DstType = FmtFloat; break; - case UserFmtDouble: DstType = FmtDouble; break; - case UserFmtAlaw: DstType = FmtAlaw; break; - case UserFmtMulaw: DstType = FmtMulaw; break; - case UserFmtIMA4: DstType = FmtShort; break; - case UserFmtMSADPCM: DstType = FmtShort; break; - } - - /* TODO: Currently we can only map samples when they're not converted. To - * allow it would need some kind of double-buffering to hold onto a copy of - * the original data. - */ - if((access&MAP_READ_WRITE_FLAGS)) - { - if(UNLIKELY((long)SrcType != (long)DstType)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "%s samples cannot be mapped", - NameFromUserFmtType(SrcType)); - } - - unpackalign = ATOMIC_LOAD_SEQ(&ALBuf->UnpackAlign); - if(UNLIKELY((align=SanitizeAlignment(SrcType, unpackalign)) < 1)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid unpack alignment %d for %s samples", - unpackalign, NameFromUserFmtType(SrcType)); - - if((access&AL_PRESERVE_DATA_BIT_SOFT)) - { - /* Can only preserve data with the same format and alignment. */ - if(UNLIKELY(ALBuf->FmtChannels != DstChannels || ALBuf->OriginalType != SrcType)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Preserving data of mismatched format"); - if(UNLIKELY(ALBuf->OriginalAlign != align)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Preserving data of mismatched alignment"); - } - - /* Convert the input/source size in bytes to sample frames using the unpack - * block alignment. - */ - if(SrcType == UserFmtIMA4) - SrcByteAlign = ((align-1)/2 + 4) * ChannelsFromUserFmt(SrcChannels); - else if(SrcType == UserFmtMSADPCM) - SrcByteAlign = ((align-2)/2 + 7) * ChannelsFromUserFmt(SrcChannels); - else - SrcByteAlign = align * FrameSizeFromUserFmt(SrcChannels, SrcType); - if(UNLIKELY((size%SrcByteAlign) != 0)) - SETERR_RETURN(context, AL_INVALID_VALUE,, - "Data size %d is not a multiple of frame size %d (%d unpack alignment)", - size, SrcByteAlign, align); - - if(UNLIKELY(size / SrcByteAlign > INT_MAX / align)) - SETERR_RETURN(context, AL_OUT_OF_MEMORY,, - "Buffer size overflow, %d blocks x %d samples per block", size/SrcByteAlign, align); - frames = size / SrcByteAlign * align; - - /* Convert the sample frames to the number of bytes needed for internal - * storage. - */ - NumChannels = ChannelsFromFmt(DstChannels); - FrameSize = NumChannels * BytesFromFmt(DstType); - if(UNLIKELY(frames > INT_MAX/FrameSize)) - SETERR_RETURN(context, AL_OUT_OF_MEMORY,, - "Buffer size overflow, %d frames x %d bytes per frame", frames, FrameSize); - newsize = frames*FrameSize; - - /* Round up to the next 16-byte multiple. This could reallocate only when - * increasing or the new size is less than half the current, but then the - * buffer's AL_SIZE would not be very reliable for accounting buffer memory - * usage, and reporting the real size could cause problems for apps that - * use AL_SIZE to try to get the buffer's play length. - */ - if(LIKELY(newsize <= INT_MAX-15)) - newsize = (newsize+15) & ~0xf; - if(newsize != ALBuf->BytesAlloc) - { - void *temp = al_malloc(16, (size_t)newsize); - if(UNLIKELY(!temp && newsize)) - SETERR_RETURN(context, AL_OUT_OF_MEMORY,, "Failed to allocate %d bytes of storage", - newsize); - if((access&AL_PRESERVE_DATA_BIT_SOFT)) - { - ALsizei tocopy = mini(newsize, ALBuf->BytesAlloc); - if(tocopy > 0) memcpy(temp, ALBuf->data, tocopy); - } - al_free(ALBuf->data); - ALBuf->data = temp; - ALBuf->BytesAlloc = newsize; - } - - if(SrcType == UserFmtIMA4) - { - assert(DstType == FmtShort); - if(data != NULL && ALBuf->data != NULL) - Convert_ALshort_ALima4(ALBuf->data, data, NumChannels, frames, align); - ALBuf->OriginalAlign = align; - } - else if(SrcType == UserFmtMSADPCM) - { - assert(DstType == FmtShort); - if(data != NULL && ALBuf->data != NULL) - Convert_ALshort_ALmsadpcm(ALBuf->data, data, NumChannels, frames, align); - ALBuf->OriginalAlign = align; - } - else - { - assert((long)SrcType == (long)DstType); - if(data != NULL && ALBuf->data != NULL) - memcpy(ALBuf->data, data, frames*FrameSize); - ALBuf->OriginalAlign = 1; - } - ALBuf->OriginalSize = size; - ALBuf->OriginalType = SrcType; - - ALBuf->Frequency = freq; - ALBuf->FmtChannels = DstChannels; - ALBuf->FmtType = DstType; - ALBuf->Access = access; - - ALBuf->SampleLen = frames; - ALBuf->LoopStart = 0; - ALBuf->LoopEnd = ALBuf->SampleLen; -} - - -ALsizei BytesFromUserFmt(enum UserFmtType type) -{ - switch(type) - { - case UserFmtUByte: return sizeof(ALubyte); - case UserFmtShort: return sizeof(ALshort); - case UserFmtFloat: return sizeof(ALfloat); - case UserFmtDouble: return sizeof(ALdouble); - case UserFmtMulaw: return sizeof(ALubyte); - case UserFmtAlaw: return sizeof(ALubyte); - case UserFmtIMA4: break; /* not handled here */ - case UserFmtMSADPCM: break; /* not handled here */ - } - return 0; -} -ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans) -{ - switch(chans) - { - case UserFmtMono: return 1; - case UserFmtStereo: return 2; - case UserFmtRear: return 2; - case UserFmtQuad: return 4; - case UserFmtX51: return 6; - case UserFmtX61: return 7; - case UserFmtX71: return 8; - case UserFmtBFormat2D: return 3; - case UserFmtBFormat3D: return 4; - } - return 0; -} -static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, - enum UserFmtType *type) -{ - static const struct { - ALenum format; - enum UserFmtChannels channels; - enum UserFmtType type; - } list[] = { - { AL_FORMAT_MONO8, UserFmtMono, UserFmtUByte }, - { AL_FORMAT_MONO16, UserFmtMono, UserFmtShort }, - { AL_FORMAT_MONO_FLOAT32, UserFmtMono, UserFmtFloat }, - { AL_FORMAT_MONO_DOUBLE_EXT, UserFmtMono, UserFmtDouble }, - { AL_FORMAT_MONO_IMA4, UserFmtMono, UserFmtIMA4 }, - { AL_FORMAT_MONO_MSADPCM_SOFT, UserFmtMono, UserFmtMSADPCM }, - { AL_FORMAT_MONO_MULAW, UserFmtMono, UserFmtMulaw }, - { AL_FORMAT_MONO_ALAW_EXT, UserFmtMono, UserFmtAlaw }, - - { AL_FORMAT_STEREO8, UserFmtStereo, UserFmtUByte }, - { AL_FORMAT_STEREO16, UserFmtStereo, UserFmtShort }, - { AL_FORMAT_STEREO_FLOAT32, UserFmtStereo, UserFmtFloat }, - { AL_FORMAT_STEREO_DOUBLE_EXT, UserFmtStereo, UserFmtDouble }, - { AL_FORMAT_STEREO_IMA4, UserFmtStereo, UserFmtIMA4 }, - { AL_FORMAT_STEREO_MSADPCM_SOFT, UserFmtStereo, UserFmtMSADPCM }, - { AL_FORMAT_STEREO_MULAW, UserFmtStereo, UserFmtMulaw }, - { AL_FORMAT_STEREO_ALAW_EXT, UserFmtStereo, UserFmtAlaw }, - - { AL_FORMAT_REAR8, UserFmtRear, UserFmtUByte }, - { AL_FORMAT_REAR16, UserFmtRear, UserFmtShort }, - { AL_FORMAT_REAR32, UserFmtRear, UserFmtFloat }, - { AL_FORMAT_REAR_MULAW, UserFmtRear, UserFmtMulaw }, - - { AL_FORMAT_QUAD8_LOKI, UserFmtQuad, UserFmtUByte }, - { AL_FORMAT_QUAD16_LOKI, UserFmtQuad, UserFmtShort }, - - { AL_FORMAT_QUAD8, UserFmtQuad, UserFmtUByte }, - { AL_FORMAT_QUAD16, UserFmtQuad, UserFmtShort }, - { AL_FORMAT_QUAD32, UserFmtQuad, UserFmtFloat }, - { AL_FORMAT_QUAD_MULAW, UserFmtQuad, UserFmtMulaw }, - - { AL_FORMAT_51CHN8, UserFmtX51, UserFmtUByte }, - { AL_FORMAT_51CHN16, UserFmtX51, UserFmtShort }, - { AL_FORMAT_51CHN32, UserFmtX51, UserFmtFloat }, - { AL_FORMAT_51CHN_MULAW, UserFmtX51, UserFmtMulaw }, - - { AL_FORMAT_61CHN8, UserFmtX61, UserFmtUByte }, - { AL_FORMAT_61CHN16, UserFmtX61, UserFmtShort }, - { AL_FORMAT_61CHN32, UserFmtX61, UserFmtFloat }, - { AL_FORMAT_61CHN_MULAW, UserFmtX61, UserFmtMulaw }, - - { AL_FORMAT_71CHN8, UserFmtX71, UserFmtUByte }, - { AL_FORMAT_71CHN16, UserFmtX71, UserFmtShort }, - { AL_FORMAT_71CHN32, UserFmtX71, UserFmtFloat }, - { AL_FORMAT_71CHN_MULAW, UserFmtX71, UserFmtMulaw }, - - { AL_FORMAT_BFORMAT2D_8, UserFmtBFormat2D, UserFmtUByte }, - { AL_FORMAT_BFORMAT2D_16, UserFmtBFormat2D, UserFmtShort }, - { AL_FORMAT_BFORMAT2D_FLOAT32, UserFmtBFormat2D, UserFmtFloat }, - { AL_FORMAT_BFORMAT2D_MULAW, UserFmtBFormat2D, UserFmtMulaw }, - - { AL_FORMAT_BFORMAT3D_8, UserFmtBFormat3D, UserFmtUByte }, - { AL_FORMAT_BFORMAT3D_16, UserFmtBFormat3D, UserFmtShort }, - { AL_FORMAT_BFORMAT3D_FLOAT32, UserFmtBFormat3D, UserFmtFloat }, - { AL_FORMAT_BFORMAT3D_MULAW, UserFmtBFormat3D, UserFmtMulaw }, - }; - ALuint i; - - for(i = 0;i < COUNTOF(list);i++) - { - if(list[i].format == format) - { - *chans = list[i].channels; - *type = list[i].type; - return AL_TRUE; - } - } - - return AL_FALSE; -} - -ALsizei BytesFromFmt(enum FmtType type) -{ - switch(type) - { - case FmtUByte: return sizeof(ALubyte); - case FmtShort: return sizeof(ALshort); - case FmtFloat: return sizeof(ALfloat); - case FmtDouble: return sizeof(ALdouble); - case FmtMulaw: return sizeof(ALubyte); - case FmtAlaw: return sizeof(ALubyte); - } - return 0; -} -ALsizei ChannelsFromFmt(enum FmtChannels chans) -{ - switch(chans) - { - case FmtMono: return 1; - case FmtStereo: return 2; - case FmtRear: return 2; - case FmtQuad: return 4; - case FmtX51: return 6; - case FmtX61: return 7; - case FmtX71: return 8; - case FmtBFormat2D: return 3; - case FmtBFormat3D: return 4; - } - return 0; -} - -static ALsizei SanitizeAlignment(enum UserFmtType type, ALsizei align) -{ - if(align < 0) - return 0; - - if(align == 0) - { - if(type == UserFmtIMA4) - { - /* Here is where things vary: - * nVidia and Apple use 64+1 sample frames per block -> block_size=36 bytes per channel - * Most PC sound software uses 2040+1 sample frames per block -> block_size=1024 bytes per channel - */ - return 65; - } - if(type == UserFmtMSADPCM) - return 64; - return 1; - } - - if(type == UserFmtIMA4) - { - /* IMA4 block alignment must be a multiple of 8, plus 1. */ - if((align&7) == 1) return align; - return 0; - } - if(type == UserFmtMSADPCM) - { - /* MSADPCM block alignment must be a multiple of 2. */ - if((align&1) == 0) return align; - return 0; - } - - return align; -} - - -static ALbuffer *AllocBuffer(ALCcontext *context) -{ - ALCdevice *device = context->Device; - BufferSubList *sublist, *subend; - ALbuffer *buffer = NULL; - ALsizei lidx = 0; - ALsizei slidx; - - almtx_lock(&device->BufferLock); - sublist = VECTOR_BEGIN(device->BufferList); - subend = VECTOR_END(device->BufferList); - for(;sublist != subend;++sublist) - { - if(sublist->FreeMask) - { - slidx = CTZ64(sublist->FreeMask); - buffer = sublist->Buffers + slidx; - break; - } - ++lidx; - } - if(UNLIKELY(!buffer)) - { - const BufferSubList empty_sublist = { 0, NULL }; - /* Don't allocate so many list entries that the 32-bit ID could - * overflow... - */ - if(UNLIKELY(VECTOR_SIZE(device->BufferList) >= 1<<25)) - { - almtx_unlock(&device->BufferLock); - alSetError(context, AL_OUT_OF_MEMORY, "Too many buffers allocated"); - return NULL; - } - lidx = (ALsizei)VECTOR_SIZE(device->BufferList); - VECTOR_PUSH_BACK(device->BufferList, empty_sublist); - sublist = &VECTOR_BACK(device->BufferList); - sublist->FreeMask = ~U64(0); - sublist->Buffers = al_calloc(16, sizeof(ALbuffer)*64); - if(UNLIKELY(!sublist->Buffers)) - { - VECTOR_POP_BACK(device->BufferList); - almtx_unlock(&device->BufferLock); - alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate buffer batch"); - return NULL; - } - - slidx = 0; - buffer = sublist->Buffers + slidx; - } - - memset(buffer, 0, sizeof(*buffer)); - - /* Add 1 to avoid buffer ID 0. */ - buffer->id = ((lidx<<6) | slidx) + 1; - - sublist->FreeMask &= ~(U64(1)<BufferLock); - - return buffer; -} - -static void FreeBuffer(ALCdevice *device, ALbuffer *buffer) -{ - ALuint id = buffer->id - 1; - ALsizei lidx = id >> 6; - ALsizei slidx = id & 0x3f; - - al_free(buffer->data); - memset(buffer, 0, sizeof(*buffer)); - - VECTOR_ELEM(device->BufferList, lidx).FreeMask |= U64(1) << slidx; -} - - -/* - * ReleaseALBuffers() - * - * INTERNAL: Called to destroy any buffers that still exist on the device - */ -ALvoid ReleaseALBuffers(ALCdevice *device) -{ - BufferSubList *sublist = VECTOR_BEGIN(device->BufferList); - BufferSubList *subend = VECTOR_END(device->BufferList); - size_t leftover = 0; - for(;sublist != subend;++sublist) - { - ALuint64 usemask = ~sublist->FreeMask; - while(usemask) - { - ALsizei idx = CTZ64(usemask); - ALbuffer *buffer = sublist->Buffers + idx; - - al_free(buffer->data); - memset(buffer, 0, sizeof(*buffer)); - ++leftover; - - usemask &= ~(U64(1) << idx); - } - sublist->FreeMask = ~usemask; - } - if(leftover > 0) - WARN("(%p) Deleted "SZFMT" Buffer%s\n", device, leftover, (leftover==1)?"":"s"); -} diff --git a/OpenAL32/alEffect.c b/OpenAL32/alEffect.c deleted file mode 100644 index c2a78a0..0000000 --- a/OpenAL32/alEffect.c +++ /dev/null @@ -1,819 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alEffect.h" -#include "alError.h" - - -extern inline void LockEffectList(ALCdevice *device); -extern inline void UnlockEffectList(ALCdevice *device); -extern inline ALboolean IsReverbEffect(ALenum type); - -const struct EffectList EffectList[EFFECTLIST_SIZE] = { - { "eaxreverb", EAXREVERB_EFFECT, AL_EFFECT_EAXREVERB }, - { "reverb", REVERB_EFFECT, AL_EFFECT_REVERB }, - { "autowah", AUTOWAH_EFFECT, AL_EFFECT_AUTOWAH }, - { "chorus", CHORUS_EFFECT, AL_EFFECT_CHORUS }, - { "compressor", COMPRESSOR_EFFECT, AL_EFFECT_COMPRESSOR }, - { "distortion", DISTORTION_EFFECT, AL_EFFECT_DISTORTION }, - { "echo", ECHO_EFFECT, AL_EFFECT_ECHO }, - { "equalizer", EQUALIZER_EFFECT, AL_EFFECT_EQUALIZER }, - { "flanger", FLANGER_EFFECT, AL_EFFECT_FLANGER }, - { "fshifter", FSHIFTER_EFFECT, AL_EFFECT_FREQUENCY_SHIFTER }, - { "modulator", MODULATOR_EFFECT, AL_EFFECT_RING_MODULATOR }, - { "pshifter", PSHIFTER_EFFECT, AL_EFFECT_PITCH_SHIFTER }, - { "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT }, - { "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_DIALOGUE }, -}; - -ALboolean DisabledEffects[MAX_EFFECTS]; - -static ALeffect *AllocEffect(ALCcontext *context); -static void FreeEffect(ALCdevice *device, ALeffect *effect); -static void InitEffectParams(ALeffect *effect, ALenum type); - -static inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) -{ - EffectSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(device->EffectList))) - return NULL; - sublist = &VECTOR_ELEM(device->EffectList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Effects + slidx; -} - - -AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects) -{ - ALCcontext *context; - ALsizei cur; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - alSetError(context, AL_INVALID_VALUE, "Generating %d effects", n); - else for(cur = 0;cur < n;cur++) - { - ALeffect *effect = AllocEffect(context); - if(!effect) - { - alDeleteEffects(cur, effects); - break; - } - effects[cur] = effect->id; - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects) -{ - ALCdevice *device; - ALCcontext *context; - ALeffect *effect; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockEffectList(device); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d effects", n); - for(i = 0;i < n;i++) - { - if(effects[i] && LookupEffect(device, effects[i]) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect ID %u", effects[i]); - } - for(i = 0;i < n;i++) - { - if((effect=LookupEffect(device, effects[i])) != NULL) - FreeEffect(device, effect); - } - -done: - UnlockEffectList(device); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect) -{ - ALCcontext *Context; - ALboolean result; - - Context = GetContextRef(); - if(!Context) return AL_FALSE; - - LockEffectList(Context->Device); - result = ((!effect || LookupEffect(Context->Device, effect)) ? - AL_TRUE : AL_FALSE); - UnlockEffectList(Context->Device); - - ALCcontext_DecRef(Context); - - return result; -} - -AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - if(param == AL_EFFECT_TYPE) - { - ALboolean isOk = (value == AL_EFFECT_NULL); - ALint i; - for(i = 0;!isOk && i < EFFECTLIST_SIZE;i++) - { - if(value == EffectList[i].val && - !DisabledEffects[EffectList[i].type]) - isOk = AL_TRUE; - } - - if(isOk) - InitEffectParams(ALEffect, value); - else - alSetError(Context, AL_INVALID_VALUE, "Effect type 0x%04x not supported", value); - } - else - { - /* Call the appropriate handler */ - ALeffect_setParami(ALEffect, Context, param, value); - } - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - switch(param) - { - case AL_EFFECT_TYPE: - alEffecti(effect, param, values[0]); - return; - } - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - /* Call the appropriate handler */ - ALeffect_setParamiv(ALEffect, Context, param, values); - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - /* Call the appropriate handler */ - ALeffect_setParamf(ALEffect, Context, param, value); - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - /* Call the appropriate handler */ - ALeffect_setParamfv(ALEffect, Context, param, values); - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - if(param == AL_EFFECT_TYPE) - *value = ALEffect->type; - else - { - /* Call the appropriate handler */ - ALeffect_getParami(ALEffect, Context, param, value); - } - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - switch(param) - { - case AL_EFFECT_TYPE: - alGetEffecti(effect, param, values); - return; - } - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - /* Call the appropriate handler */ - ALeffect_getParamiv(ALEffect, Context, param, values); - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - /* Call the appropriate handler */ - ALeffect_getParamf(ALEffect, Context, param, value); - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALeffect *ALEffect; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockEffectList(Device); - if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); - else - { - /* Call the appropriate handler */ - ALeffect_getParamfv(ALEffect, Context, param, values); - } - UnlockEffectList(Device); - - ALCcontext_DecRef(Context); -} - - -void InitEffect(ALeffect *effect) -{ - InitEffectParams(effect, AL_EFFECT_NULL); -} - -static ALeffect *AllocEffect(ALCcontext *context) -{ - ALCdevice *device = context->Device; - EffectSubList *sublist, *subend; - ALeffect *effect = NULL; - ALsizei lidx = 0; - ALsizei slidx; - - almtx_lock(&device->EffectLock); - sublist = VECTOR_BEGIN(device->EffectList); - subend = VECTOR_END(device->EffectList); - for(;sublist != subend;++sublist) - { - if(sublist->FreeMask) - { - slidx = CTZ64(sublist->FreeMask); - effect = sublist->Effects + slidx; - break; - } - ++lidx; - } - if(UNLIKELY(!effect)) - { - const EffectSubList empty_sublist = { 0, NULL }; - /* Don't allocate so many list entries that the 32-bit ID could - * overflow... - */ - if(UNLIKELY(VECTOR_SIZE(device->EffectList) >= 1<<25)) - { - almtx_unlock(&device->EffectLock); - alSetError(context, AL_OUT_OF_MEMORY, "Too many effects allocated"); - return NULL; - } - lidx = (ALsizei)VECTOR_SIZE(device->EffectList); - VECTOR_PUSH_BACK(device->EffectList, empty_sublist); - sublist = &VECTOR_BACK(device->EffectList); - sublist->FreeMask = ~U64(0); - sublist->Effects = al_calloc(16, sizeof(ALeffect)*64); - if(UNLIKELY(!sublist->Effects)) - { - VECTOR_POP_BACK(device->EffectList); - almtx_unlock(&device->EffectLock); - alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate effect batch"); - return NULL; - } - - slidx = 0; - effect = sublist->Effects + slidx; - } - - memset(effect, 0, sizeof(*effect)); - InitEffectParams(effect, AL_EFFECT_NULL); - - /* Add 1 to avoid effect ID 0. */ - effect->id = ((lidx<<6) | slidx) + 1; - - sublist->FreeMask &= ~(U64(1)<EffectLock); - - return effect; -} - -static void FreeEffect(ALCdevice *device, ALeffect *effect) -{ - ALuint id = effect->id - 1; - ALsizei lidx = id >> 6; - ALsizei slidx = id & 0x3f; - - memset(effect, 0, sizeof(*effect)); - - VECTOR_ELEM(device->EffectList, lidx).FreeMask |= U64(1) << slidx; -} - -void ReleaseALEffects(ALCdevice *device) -{ - EffectSubList *sublist = VECTOR_BEGIN(device->EffectList); - EffectSubList *subend = VECTOR_END(device->EffectList); - size_t leftover = 0; - for(;sublist != subend;++sublist) - { - ALuint64 usemask = ~sublist->FreeMask; - while(usemask) - { - ALsizei idx = CTZ64(usemask); - ALeffect *effect = sublist->Effects + idx; - - memset(effect, 0, sizeof(*effect)); - ++leftover; - - usemask &= ~(U64(1) << idx); - } - sublist->FreeMask = ~usemask; - } - if(leftover > 0) - WARN("(%p) Deleted "SZFMT" Effect%s\n", device, leftover, (leftover==1)?"":"s"); -} - - -static void InitEffectParams(ALeffect *effect, ALenum type) -{ - switch(type) - { - case AL_EFFECT_EAXREVERB: - effect->Props.Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY; - effect->Props.Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION; - effect->Props.Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN; - effect->Props.Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF; - effect->Props.Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF; - effect->Props.Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME; - effect->Props.Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO; - effect->Props.Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO; - effect->Props.Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN; - effect->Props.Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY; - effect->Props.Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; - effect->Props.Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; - effect->Props.Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; - effect->Props.Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN; - effect->Props.Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY; - effect->Props.Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; - effect->Props.Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; - effect->Props.Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; - effect->Props.Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME; - effect->Props.Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH; - effect->Props.Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME; - effect->Props.Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH; - effect->Props.Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF; - effect->Props.Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE; - effect->Props.Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE; - effect->Props.Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; - effect->Props.Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT; - effect->vtab = &ALeaxreverb_vtable; - break; - case AL_EFFECT_REVERB: - effect->Props.Reverb.Density = AL_REVERB_DEFAULT_DENSITY; - effect->Props.Reverb.Diffusion = AL_REVERB_DEFAULT_DIFFUSION; - effect->Props.Reverb.Gain = AL_REVERB_DEFAULT_GAIN; - effect->Props.Reverb.GainHF = AL_REVERB_DEFAULT_GAINHF; - effect->Props.Reverb.GainLF = 1.0f; - effect->Props.Reverb.DecayTime = AL_REVERB_DEFAULT_DECAY_TIME; - effect->Props.Reverb.DecayHFRatio = AL_REVERB_DEFAULT_DECAY_HFRATIO; - effect->Props.Reverb.DecayLFRatio = 1.0f; - effect->Props.Reverb.ReflectionsGain = AL_REVERB_DEFAULT_REFLECTIONS_GAIN; - effect->Props.Reverb.ReflectionsDelay = AL_REVERB_DEFAULT_REFLECTIONS_DELAY; - effect->Props.Reverb.ReflectionsPan[0] = 0.0f; - effect->Props.Reverb.ReflectionsPan[1] = 0.0f; - effect->Props.Reverb.ReflectionsPan[2] = 0.0f; - effect->Props.Reverb.LateReverbGain = AL_REVERB_DEFAULT_LATE_REVERB_GAIN; - effect->Props.Reverb.LateReverbDelay = AL_REVERB_DEFAULT_LATE_REVERB_DELAY; - effect->Props.Reverb.LateReverbPan[0] = 0.0f; - effect->Props.Reverb.LateReverbPan[1] = 0.0f; - effect->Props.Reverb.LateReverbPan[2] = 0.0f; - effect->Props.Reverb.EchoTime = 0.25f; - effect->Props.Reverb.EchoDepth = 0.0f; - effect->Props.Reverb.ModulationTime = 0.25f; - effect->Props.Reverb.ModulationDepth = 0.0f; - effect->Props.Reverb.AirAbsorptionGainHF = AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF; - effect->Props.Reverb.HFReference = 5000.0f; - effect->Props.Reverb.LFReference = 250.0f; - effect->Props.Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; - effect->Props.Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT; - effect->vtab = &ALreverb_vtable; - break; - case AL_EFFECT_AUTOWAH: - effect->Props.Autowah.AttackTime = AL_AUTOWAH_DEFAULT_ATTACK_TIME; - effect->Props.Autowah.ReleaseTime = AL_AUTOWAH_DEFAULT_RELEASE_TIME; - effect->Props.Autowah.Resonance = AL_AUTOWAH_DEFAULT_RESONANCE; - effect->Props.Autowah.PeakGain = AL_AUTOWAH_DEFAULT_PEAK_GAIN; - effect->vtab = &ALautowah_vtable; - break; - case AL_EFFECT_CHORUS: - effect->Props.Chorus.Waveform = AL_CHORUS_DEFAULT_WAVEFORM; - effect->Props.Chorus.Phase = AL_CHORUS_DEFAULT_PHASE; - effect->Props.Chorus.Rate = AL_CHORUS_DEFAULT_RATE; - effect->Props.Chorus.Depth = AL_CHORUS_DEFAULT_DEPTH; - effect->Props.Chorus.Feedback = AL_CHORUS_DEFAULT_FEEDBACK; - effect->Props.Chorus.Delay = AL_CHORUS_DEFAULT_DELAY; - effect->vtab = &ALchorus_vtable; - break; - case AL_EFFECT_COMPRESSOR: - effect->Props.Compressor.OnOff = AL_COMPRESSOR_DEFAULT_ONOFF; - effect->vtab = &ALcompressor_vtable; - break; - case AL_EFFECT_DISTORTION: - effect->Props.Distortion.Edge = AL_DISTORTION_DEFAULT_EDGE; - effect->Props.Distortion.Gain = AL_DISTORTION_DEFAULT_GAIN; - effect->Props.Distortion.LowpassCutoff = AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF; - effect->Props.Distortion.EQCenter = AL_DISTORTION_DEFAULT_EQCENTER; - effect->Props.Distortion.EQBandwidth = AL_DISTORTION_DEFAULT_EQBANDWIDTH; - effect->vtab = &ALdistortion_vtable; - break; - case AL_EFFECT_ECHO: - effect->Props.Echo.Delay = AL_ECHO_DEFAULT_DELAY; - effect->Props.Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY; - effect->Props.Echo.Damping = AL_ECHO_DEFAULT_DAMPING; - effect->Props.Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK; - effect->Props.Echo.Spread = AL_ECHO_DEFAULT_SPREAD; - effect->vtab = &ALecho_vtable; - break; - case AL_EFFECT_EQUALIZER: - effect->Props.Equalizer.LowCutoff = AL_EQUALIZER_DEFAULT_LOW_CUTOFF; - effect->Props.Equalizer.LowGain = AL_EQUALIZER_DEFAULT_LOW_GAIN; - effect->Props.Equalizer.Mid1Center = AL_EQUALIZER_DEFAULT_MID1_CENTER; - effect->Props.Equalizer.Mid1Gain = AL_EQUALIZER_DEFAULT_MID1_GAIN; - effect->Props.Equalizer.Mid1Width = AL_EQUALIZER_DEFAULT_MID1_WIDTH; - effect->Props.Equalizer.Mid2Center = AL_EQUALIZER_DEFAULT_MID2_CENTER; - effect->Props.Equalizer.Mid2Gain = AL_EQUALIZER_DEFAULT_MID2_GAIN; - effect->Props.Equalizer.Mid2Width = AL_EQUALIZER_DEFAULT_MID2_WIDTH; - effect->Props.Equalizer.HighCutoff = AL_EQUALIZER_DEFAULT_HIGH_CUTOFF; - effect->Props.Equalizer.HighGain = AL_EQUALIZER_DEFAULT_HIGH_GAIN; - effect->vtab = &ALequalizer_vtable; - break; - case AL_EFFECT_FLANGER: - effect->Props.Chorus.Waveform = AL_FLANGER_DEFAULT_WAVEFORM; - effect->Props.Chorus.Phase = AL_FLANGER_DEFAULT_PHASE; - effect->Props.Chorus.Rate = AL_FLANGER_DEFAULT_RATE; - effect->Props.Chorus.Depth = AL_FLANGER_DEFAULT_DEPTH; - effect->Props.Chorus.Feedback = AL_FLANGER_DEFAULT_FEEDBACK; - effect->Props.Chorus.Delay = AL_FLANGER_DEFAULT_DELAY; - effect->vtab = &ALflanger_vtable; - break; - case AL_EFFECT_FREQUENCY_SHIFTER: - effect->Props.Fshifter.Frequency = AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY; - effect->Props.Fshifter.LeftDirection = AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION; - effect->Props.Fshifter.RightDirection = AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION; - effect->vtab = &ALfshifter_vtable; - break; - case AL_EFFECT_RING_MODULATOR: - effect->Props.Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY; - effect->Props.Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF; - effect->Props.Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM; - effect->vtab = &ALmodulator_vtable; - break; - case AL_EFFECT_PITCH_SHIFTER: - effect->Props.Pshifter.CoarseTune = AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE; - effect->Props.Pshifter.FineTune = AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE; - effect->vtab = &ALpshifter_vtable; - break; - case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT: - case AL_EFFECT_DEDICATED_DIALOGUE: - effect->Props.Dedicated.Gain = 1.0f; - effect->vtab = &ALdedicated_vtable; - break; - default: - effect->vtab = &ALnull_vtable; - break; - } - effect->type = type; -} - - -#include "AL/efx-presets.h" - -#define DECL(x) { #x, EFX_REVERB_PRESET_##x } -static const struct { - const char name[32]; - EFXEAXREVERBPROPERTIES props; -} reverblist[] = { - DECL(GENERIC), - DECL(PADDEDCELL), - DECL(ROOM), - DECL(BATHROOM), - DECL(LIVINGROOM), - DECL(STONEROOM), - DECL(AUDITORIUM), - DECL(CONCERTHALL), - DECL(CAVE), - DECL(ARENA), - DECL(HANGAR), - DECL(CARPETEDHALLWAY), - DECL(HALLWAY), - DECL(STONECORRIDOR), - DECL(ALLEY), - DECL(FOREST), - DECL(CITY), - DECL(MOUNTAINS), - DECL(QUARRY), - DECL(PLAIN), - DECL(PARKINGLOT), - DECL(SEWERPIPE), - DECL(UNDERWATER), - DECL(DRUGGED), - DECL(DIZZY), - DECL(PSYCHOTIC), - - DECL(CASTLE_SMALLROOM), - DECL(CASTLE_SHORTPASSAGE), - DECL(CASTLE_MEDIUMROOM), - DECL(CASTLE_LARGEROOM), - DECL(CASTLE_LONGPASSAGE), - DECL(CASTLE_HALL), - DECL(CASTLE_CUPBOARD), - DECL(CASTLE_COURTYARD), - DECL(CASTLE_ALCOVE), - - DECL(FACTORY_SMALLROOM), - DECL(FACTORY_SHORTPASSAGE), - DECL(FACTORY_MEDIUMROOM), - DECL(FACTORY_LARGEROOM), - DECL(FACTORY_LONGPASSAGE), - DECL(FACTORY_HALL), - DECL(FACTORY_CUPBOARD), - DECL(FACTORY_COURTYARD), - DECL(FACTORY_ALCOVE), - - DECL(ICEPALACE_SMALLROOM), - DECL(ICEPALACE_SHORTPASSAGE), - DECL(ICEPALACE_MEDIUMROOM), - DECL(ICEPALACE_LARGEROOM), - DECL(ICEPALACE_LONGPASSAGE), - DECL(ICEPALACE_HALL), - DECL(ICEPALACE_CUPBOARD), - DECL(ICEPALACE_COURTYARD), - DECL(ICEPALACE_ALCOVE), - - DECL(SPACESTATION_SMALLROOM), - DECL(SPACESTATION_SHORTPASSAGE), - DECL(SPACESTATION_MEDIUMROOM), - DECL(SPACESTATION_LARGEROOM), - DECL(SPACESTATION_LONGPASSAGE), - DECL(SPACESTATION_HALL), - DECL(SPACESTATION_CUPBOARD), - DECL(SPACESTATION_ALCOVE), - - DECL(WOODEN_SMALLROOM), - DECL(WOODEN_SHORTPASSAGE), - DECL(WOODEN_MEDIUMROOM), - DECL(WOODEN_LARGEROOM), - DECL(WOODEN_LONGPASSAGE), - DECL(WOODEN_HALL), - DECL(WOODEN_CUPBOARD), - DECL(WOODEN_COURTYARD), - DECL(WOODEN_ALCOVE), - - DECL(SPORT_EMPTYSTADIUM), - DECL(SPORT_SQUASHCOURT), - DECL(SPORT_SMALLSWIMMINGPOOL), - DECL(SPORT_LARGESWIMMINGPOOL), - DECL(SPORT_GYMNASIUM), - DECL(SPORT_FULLSTADIUM), - DECL(SPORT_STADIUMTANNOY), - - DECL(PREFAB_WORKSHOP), - DECL(PREFAB_SCHOOLROOM), - DECL(PREFAB_PRACTISEROOM), - DECL(PREFAB_OUTHOUSE), - DECL(PREFAB_CARAVAN), - - DECL(DOME_TOMB), - DECL(PIPE_SMALL), - DECL(DOME_SAINTPAULS), - DECL(PIPE_LONGTHIN), - DECL(PIPE_LARGE), - DECL(PIPE_RESONANT), - - DECL(OUTDOORS_BACKYARD), - DECL(OUTDOORS_ROLLINGPLAINS), - DECL(OUTDOORS_DEEPCANYON), - DECL(OUTDOORS_CREEK), - DECL(OUTDOORS_VALLEY), - - DECL(MOOD_HEAVEN), - DECL(MOOD_HELL), - DECL(MOOD_MEMORY), - - DECL(DRIVING_COMMENTATOR), - DECL(DRIVING_PITGARAGE), - DECL(DRIVING_INCAR_RACER), - DECL(DRIVING_INCAR_SPORTS), - DECL(DRIVING_INCAR_LUXURY), - DECL(DRIVING_FULLGRANDSTAND), - DECL(DRIVING_EMPTYGRANDSTAND), - DECL(DRIVING_TUNNEL), - - DECL(CITY_STREETS), - DECL(CITY_SUBWAY), - DECL(CITY_MUSEUM), - DECL(CITY_LIBRARY), - DECL(CITY_UNDERPASS), - DECL(CITY_ABANDONED), - - DECL(DUSTYROOM), - DECL(CHAPEL), - DECL(SMALLWATERROOM), -}; -#undef DECL - -void LoadReverbPreset(const char *name, ALeffect *effect) -{ - size_t i; - - if(strcasecmp(name, "NONE") == 0) - { - InitEffectParams(effect, AL_EFFECT_NULL); - TRACE("Loading reverb '%s'\n", "NONE"); - return; - } - - if(!DisabledEffects[EAXREVERB_EFFECT]) - InitEffectParams(effect, AL_EFFECT_EAXREVERB); - else if(!DisabledEffects[REVERB_EFFECT]) - InitEffectParams(effect, AL_EFFECT_REVERB); - else - InitEffectParams(effect, AL_EFFECT_NULL); - for(i = 0;i < COUNTOF(reverblist);i++) - { - const EFXEAXREVERBPROPERTIES *props; - - if(strcasecmp(name, reverblist[i].name) != 0) - continue; - - TRACE("Loading reverb '%s'\n", reverblist[i].name); - props = &reverblist[i].props; - effect->Props.Reverb.Density = props->flDensity; - effect->Props.Reverb.Diffusion = props->flDiffusion; - effect->Props.Reverb.Gain = props->flGain; - effect->Props.Reverb.GainHF = props->flGainHF; - effect->Props.Reverb.GainLF = props->flGainLF; - effect->Props.Reverb.DecayTime = props->flDecayTime; - effect->Props.Reverb.DecayHFRatio = props->flDecayHFRatio; - effect->Props.Reverb.DecayLFRatio = props->flDecayLFRatio; - effect->Props.Reverb.ReflectionsGain = props->flReflectionsGain; - effect->Props.Reverb.ReflectionsDelay = props->flReflectionsDelay; - effect->Props.Reverb.ReflectionsPan[0] = props->flReflectionsPan[0]; - effect->Props.Reverb.ReflectionsPan[1] = props->flReflectionsPan[1]; - effect->Props.Reverb.ReflectionsPan[2] = props->flReflectionsPan[2]; - effect->Props.Reverb.LateReverbGain = props->flLateReverbGain; - effect->Props.Reverb.LateReverbDelay = props->flLateReverbDelay; - effect->Props.Reverb.LateReverbPan[0] = props->flLateReverbPan[0]; - effect->Props.Reverb.LateReverbPan[1] = props->flLateReverbPan[1]; - effect->Props.Reverb.LateReverbPan[2] = props->flLateReverbPan[2]; - effect->Props.Reverb.EchoTime = props->flEchoTime; - effect->Props.Reverb.EchoDepth = props->flEchoDepth; - effect->Props.Reverb.ModulationTime = props->flModulationTime; - effect->Props.Reverb.ModulationDepth = props->flModulationDepth; - effect->Props.Reverb.AirAbsorptionGainHF = props->flAirAbsorptionGainHF; - effect->Props.Reverb.HFReference = props->flHFReference; - effect->Props.Reverb.LFReference = props->flLFReference; - effect->Props.Reverb.RoomRolloffFactor = props->flRoomRolloffFactor; - effect->Props.Reverb.DecayHFLimit = props->iDecayHFLimit; - return; - } - - WARN("Reverb preset '%s' not found\n", name); -} diff --git a/OpenAL32/alFilter.c b/OpenAL32/alFilter.c deleted file mode 100644 index e57653e..0000000 --- a/OpenAL32/alFilter.c +++ /dev/null @@ -1,671 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" -#include "alFilter.h" -#include "alError.h" - - -#define FILTER_MIN_GAIN 0.0f -#define FILTER_MAX_GAIN 4.0f /* +12dB */ - -extern inline void LockFilterList(ALCdevice *device); -extern inline void UnlockFilterList(ALCdevice *device); - -static ALfilter *AllocFilter(ALCcontext *context); -static void FreeFilter(ALCdevice *device, ALfilter *filter); -static void InitFilterParams(ALfilter *filter, ALenum type); - -static inline ALfilter *LookupFilter(ALCdevice *device, ALuint id) -{ - FilterSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(device->FilterList))) - return NULL; - sublist = &VECTOR_ELEM(device->FilterList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Filters + slidx; -} - - -AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters) -{ - ALCcontext *context; - ALsizei cur = 0; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - alSetError(context, AL_INVALID_VALUE, "Generating %d filters", n); - else for(cur = 0;cur < n;cur++) - { - ALfilter *filter = AllocFilter(context); - if(!filter) - { - alDeleteFilters(cur, filters); - break; - } - - filters[cur] = filter->id; - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters) -{ - ALCdevice *device; - ALCcontext *context; - ALfilter *filter; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockFilterList(device); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d filters", n); - for(i = 0;i < n;i++) - { - if(filters[i] && LookupFilter(device, filters[i]) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid filter ID %u", filters[i]); - } - for(i = 0;i < n;i++) - { - if((filter=LookupFilter(device, filters[i])) != NULL) - FreeFilter(device, filter); - } - -done: - UnlockFilterList(device); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter) -{ - ALCcontext *Context; - ALboolean result; - - Context = GetContextRef(); - if(!Context) return AL_FALSE; - - LockFilterList(Context->Device); - result = ((!filter || LookupFilter(Context->Device, filter)) ? - AL_TRUE : AL_FALSE); - UnlockFilterList(Context->Device); - - ALCcontext_DecRef(Context); - - return result; -} - -AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - if(param == AL_FILTER_TYPE) - { - if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS || - value == AL_FILTER_HIGHPASS || value == AL_FILTER_BANDPASS) - InitFilterParams(ALFilter, value); - else - alSetError(Context, AL_INVALID_VALUE, "Invalid filter type 0x%04x", value); - } - else - { - /* Call the appropriate handler */ - ALfilter_setParami(ALFilter, Context, param, value); - } - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - switch(param) - { - case AL_FILTER_TYPE: - alFilteri(filter, param, values[0]); - return; - } - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - /* Call the appropriate handler */ - ALfilter_setParamiv(ALFilter, Context, param, values); - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - /* Call the appropriate handler */ - ALfilter_setParamf(ALFilter, Context, param, value); - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - /* Call the appropriate handler */ - ALfilter_setParamfv(ALFilter, Context, param, values); - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - if(param == AL_FILTER_TYPE) - *value = ALFilter->type; - else - { - /* Call the appropriate handler */ - ALfilter_getParami(ALFilter, Context, param, value); - } - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - switch(param) - { - case AL_FILTER_TYPE: - alGetFilteri(filter, param, values); - return; - } - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - /* Call the appropriate handler */ - ALfilter_getParamiv(ALFilter, Context, param, values); - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - /* Call the appropriate handler */ - ALfilter_getParamf(ALFilter, Context, param, value); - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFilterList(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); - else - { - /* Call the appropriate handler */ - ALfilter_getParamfv(ALFilter, Context, param, values); - } - UnlockFilterList(Device); - - ALCcontext_DecRef(Context); -} - - -static void ALlowpass_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer property 0x%04x", param); } -static void ALlowpass_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer-vector property 0x%04x", param); } -static void ALlowpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) -{ - switch(param) - { - case AL_LOWPASS_GAIN: - if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Low-pass gain %f out of range", val); - filter->Gain = val; - break; - - case AL_LOWPASS_GAINHF: - if(!(val >= AL_LOWPASS_MIN_GAINHF && val <= AL_LOWPASS_MAX_GAINHF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Low-pass gainhf %f out of range", val); - filter->GainHF = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid low-pass float property 0x%04x", param); - } -} -static void ALlowpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALlowpass_setParamf(filter, context, param, vals[0]); } - -static void ALlowpass_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer property 0x%04x", param); } -static void ALlowpass_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer-vector property 0x%04x", param); } -static void ALlowpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) -{ - switch(param) - { - case AL_LOWPASS_GAIN: - *val = filter->Gain; - break; - - case AL_LOWPASS_GAINHF: - *val = filter->GainHF; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid low-pass float property 0x%04x", param); - } -} -static void ALlowpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALlowpass_getParamf(filter, context, param, vals); } - -DEFINE_ALFILTER_VTABLE(ALlowpass); - - -static void ALhighpass_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer property 0x%04x", param); } -static void ALhighpass_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer-vector property 0x%04x", param); } -static void ALhighpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) -{ - switch(param) - { - case AL_HIGHPASS_GAIN: - if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "High-pass gain out of range"); - filter->Gain = val; - break; - - case AL_HIGHPASS_GAINLF: - if(!(val >= AL_HIGHPASS_MIN_GAINLF && val <= AL_HIGHPASS_MAX_GAINLF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "High-pass gainlf out of range"); - filter->GainLF = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid high-pass float property 0x%04x", param); - } -} -static void ALhighpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALhighpass_setParamf(filter, context, param, vals[0]); } - -static void ALhighpass_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer property 0x%04x", param); } -static void ALhighpass_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer-vector property 0x%04x", param); } -static void ALhighpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) -{ - switch(param) - { - case AL_HIGHPASS_GAIN: - *val = filter->Gain; - break; - - case AL_HIGHPASS_GAINLF: - *val = filter->GainLF; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid high-pass float property 0x%04x", param); - } -} -static void ALhighpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALhighpass_getParamf(filter, context, param, vals); } - -DEFINE_ALFILTER_VTABLE(ALhighpass); - - -static void ALbandpass_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer property 0x%04x", param); } -static void ALbandpass_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer-vector property 0x%04x", param); } -static void ALbandpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) -{ - switch(param) - { - case AL_BANDPASS_GAIN: - if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gain out of range"); - filter->Gain = val; - break; - - case AL_BANDPASS_GAINHF: - if(!(val >= AL_BANDPASS_MIN_GAINHF && val <= AL_BANDPASS_MAX_GAINHF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gainhf out of range"); - filter->GainHF = val; - break; - - case AL_BANDPASS_GAINLF: - if(!(val >= AL_BANDPASS_MIN_GAINLF && val <= AL_BANDPASS_MAX_GAINLF)) - SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gainlf out of range"); - filter->GainLF = val; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid band-pass float property 0x%04x", param); - } -} -static void ALbandpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALbandpass_setParamf(filter, context, param, vals[0]); } - -static void ALbandpass_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer property 0x%04x", param); } -static void ALbandpass_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer-vector property 0x%04x", param); } -static void ALbandpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) -{ - switch(param) - { - case AL_BANDPASS_GAIN: - *val = filter->Gain; - break; - - case AL_BANDPASS_GAINHF: - *val = filter->GainHF; - break; - - case AL_BANDPASS_GAINLF: - *val = filter->GainLF; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid band-pass float property 0x%04x", param); - } -} -static void ALbandpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALbandpass_getParamf(filter, context, param, vals); } - -DEFINE_ALFILTER_VTABLE(ALbandpass); - - -static void ALnullfilter_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } -static void ALnullfilter_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } -static void ALnullfilter_setParamf(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } -static void ALnullfilter_setParamfv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALfloat *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } - -static void ALnullfilter_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } -static void ALnullfilter_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } -static void ALnullfilter_getParamf(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALfloat *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } -static void ALnullfilter_getParamfv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALfloat *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } - -DEFINE_ALFILTER_VTABLE(ALnullfilter); - - -static ALfilter *AllocFilter(ALCcontext *context) -{ - ALCdevice *device = context->Device; - FilterSubList *sublist, *subend; - ALfilter *filter = NULL; - ALsizei lidx = 0; - ALsizei slidx; - - almtx_lock(&device->FilterLock); - sublist = VECTOR_BEGIN(device->FilterList); - subend = VECTOR_END(device->FilterList); - for(;sublist != subend;++sublist) - { - if(sublist->FreeMask) - { - slidx = CTZ64(sublist->FreeMask); - filter = sublist->Filters + slidx; - break; - } - ++lidx; - } - if(UNLIKELY(!filter)) - { - const FilterSubList empty_sublist = { 0, NULL }; - /* Don't allocate so many list entries that the 32-bit ID could - * overflow... - */ - if(UNLIKELY(VECTOR_SIZE(device->FilterList) >= 1<<25)) - { - almtx_unlock(&device->FilterLock); - alSetError(context, AL_OUT_OF_MEMORY, "Too many filters allocated"); - return NULL; - } - lidx = (ALsizei)VECTOR_SIZE(device->FilterList); - VECTOR_PUSH_BACK(device->FilterList, empty_sublist); - sublist = &VECTOR_BACK(device->FilterList); - sublist->FreeMask = ~U64(0); - sublist->Filters = al_calloc(16, sizeof(ALfilter)*64); - if(UNLIKELY(!sublist->Filters)) - { - VECTOR_POP_BACK(device->FilterList); - almtx_unlock(&device->FilterLock); - alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate filter batch"); - return NULL; - } - - slidx = 0; - filter = sublist->Filters + slidx; - } - - memset(filter, 0, sizeof(*filter)); - InitFilterParams(filter, AL_FILTER_NULL); - - /* Add 1 to avoid filter ID 0. */ - filter->id = ((lidx<<6) | slidx) + 1; - - sublist->FreeMask &= ~(U64(1)<FilterLock); - - return filter; -} - -static void FreeFilter(ALCdevice *device, ALfilter *filter) -{ - ALuint id = filter->id - 1; - ALsizei lidx = id >> 6; - ALsizei slidx = id & 0x3f; - - memset(filter, 0, sizeof(*filter)); - - VECTOR_ELEM(device->FilterList, lidx).FreeMask |= U64(1) << slidx; -} - -void ReleaseALFilters(ALCdevice *device) -{ - FilterSubList *sublist = VECTOR_BEGIN(device->FilterList); - FilterSubList *subend = VECTOR_END(device->FilterList); - size_t leftover = 0; - for(;sublist != subend;++sublist) - { - ALuint64 usemask = ~sublist->FreeMask; - while(usemask) - { - ALsizei idx = CTZ64(usemask); - ALfilter *filter = sublist->Filters + idx; - - memset(filter, 0, sizeof(*filter)); - ++leftover; - - usemask &= ~(U64(1) << idx); - } - sublist->FreeMask = ~usemask; - } - if(leftover > 0) - WARN("(%p) Deleted "SZFMT" Filter%s\n", device, leftover, (leftover==1)?"":"s"); -} - - -static void InitFilterParams(ALfilter *filter, ALenum type) -{ - if(type == AL_FILTER_LOWPASS) - { - filter->Gain = AL_LOWPASS_DEFAULT_GAIN; - filter->GainHF = AL_LOWPASS_DEFAULT_GAINHF; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = 1.0f; - filter->LFReference = HIGHPASSFREQREF; - filter->vtab = &ALlowpass_vtable; - } - else if(type == AL_FILTER_HIGHPASS) - { - filter->Gain = AL_HIGHPASS_DEFAULT_GAIN; - filter->GainHF = 1.0f; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = AL_HIGHPASS_DEFAULT_GAINLF; - filter->LFReference = HIGHPASSFREQREF; - filter->vtab = &ALhighpass_vtable; - } - else if(type == AL_FILTER_BANDPASS) - { - filter->Gain = AL_BANDPASS_DEFAULT_GAIN; - filter->GainHF = AL_BANDPASS_DEFAULT_GAINHF; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = AL_BANDPASS_DEFAULT_GAINLF; - filter->LFReference = HIGHPASSFREQREF; - filter->vtab = &ALbandpass_vtable; - } - else - { - filter->Gain = 1.0f; - filter->GainHF = 1.0f; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = 1.0f; - filter->LFReference = HIGHPASSFREQREF; - filter->vtab = &ALnullfilter_vtable; - } - filter->type = type; -} diff --git a/OpenAL32/alListener.c b/OpenAL32/alListener.c deleted file mode 100644 index f1ac3ff..0000000 --- a/OpenAL32/alListener.c +++ /dev/null @@ -1,502 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include "alMain.h" -#include "alu.h" -#include "alError.h" -#include "alListener.h" -#include "alSource.h" - -#define DO_UPDATEPROPS() do { \ - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ - UpdateListenerProps(context); \ - else \ - ATOMIC_FLAG_CLEAR(&listener->PropsClean, almemory_order_release); \ -} while(0) - - -AL_API ALvoid AL_APIENTRY alListenerf(ALenum param, ALfloat value) -{ - ALlistener *listener; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - listener = context->Listener; - almtx_lock(&context->PropLock); - switch(param) - { - case AL_GAIN: - if(!(value >= 0.0f && isfinite(value))) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener gain out of range"); - listener->Gain = value; - DO_UPDATEPROPS(); - break; - - case AL_METERS_PER_UNIT: - if(!(value >= AL_MIN_METERS_PER_UNIT && value <= AL_MAX_METERS_PER_UNIT)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener meters per unit out of range"); - context->MetersPerUnit = value; - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateContextProps(context); - else - ATOMIC_FLAG_CLEAR(&context->PropsClean, almemory_order_release); - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener float property"); - } - -done: - almtx_unlock(&context->PropLock); - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) -{ - ALlistener *listener; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - listener = context->Listener; - almtx_lock(&context->PropLock); - switch(param) - { - case AL_POSITION: - if(!(isfinite(value1) && isfinite(value2) && isfinite(value3))) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener position out of range"); - listener->Position[0] = value1; - listener->Position[1] = value2; - listener->Position[2] = value3; - DO_UPDATEPROPS(); - break; - - case AL_VELOCITY: - if(!(isfinite(value1) && isfinite(value2) && isfinite(value3))) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener velocity out of range"); - listener->Velocity[0] = value1; - listener->Velocity[1] = value2; - listener->Velocity[2] = value3; - DO_UPDATEPROPS(); - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-float property"); - } - -done: - almtx_unlock(&context->PropLock); - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values) -{ - ALlistener *listener; - ALCcontext *context; - - if(values) - { - switch(param) - { - case AL_GAIN: - case AL_METERS_PER_UNIT: - alListenerf(param, values[0]); - return; - - case AL_POSITION: - case AL_VELOCITY: - alListener3f(param, values[0], values[1], values[2]); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - listener = context->Listener; - almtx_lock(&context->PropLock); - if(!values) SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer"); - switch(param) - { - case AL_ORIENTATION: - if(!(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]) && - isfinite(values[3]) && isfinite(values[4]) && isfinite(values[5]))) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener orientation out of range"); - /* AT then UP */ - listener->Forward[0] = values[0]; - listener->Forward[1] = values[1]; - listener->Forward[2] = values[2]; - listener->Up[0] = values[3]; - listener->Up[1] = values[4]; - listener->Up[2] = values[5]; - DO_UPDATEPROPS(); - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener float-vector property"); - } - -done: - almtx_unlock(&context->PropLock); - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alListeneri(ALenum param, ALint UNUSED(value)) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener integer property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3) -{ - ALCcontext *context; - - switch(param) - { - case AL_POSITION: - case AL_VELOCITY: - alListener3f(param, (ALfloat)value1, (ALfloat)value2, (ALfloat)value3); - return; - } - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-integer property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values) -{ - ALCcontext *context; - - if(values) - { - ALfloat fvals[6]; - switch(param) - { - case AL_POSITION: - case AL_VELOCITY: - alListener3f(param, (ALfloat)values[0], (ALfloat)values[1], (ALfloat)values[2]); - return; - - case AL_ORIENTATION: - fvals[0] = (ALfloat)values[0]; - fvals[1] = (ALfloat)values[1]; - fvals[2] = (ALfloat)values[2]; - fvals[3] = (ALfloat)values[3]; - fvals[4] = (ALfloat)values[4]; - fvals[5] = (ALfloat)values[5]; - alListenerfv(param, fvals); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener integer-vector property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!value) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_GAIN: - *value = context->Listener->Gain; - break; - - case AL_METERS_PER_UNIT: - *value = context->MetersPerUnit; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener float property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!value1 || !value2 || !value3) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_POSITION: - *value1 = context->Listener->Position[0]; - *value2 = context->Listener->Position[1]; - *value3 = context->Listener->Position[2]; - break; - - case AL_VELOCITY: - *value1 = context->Listener->Velocity[0]; - *value2 = context->Listener->Velocity[1]; - *value3 = context->Listener->Velocity[2]; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-float property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values) -{ - ALCcontext *context; - - switch(param) - { - case AL_GAIN: - case AL_METERS_PER_UNIT: - alGetListenerf(param, values); - return; - - case AL_POSITION: - case AL_VELOCITY: - alGetListener3f(param, values+0, values+1, values+2); - return; - } - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_ORIENTATION: - // AT then UP - values[0] = context->Listener->Forward[0]; - values[1] = context->Listener->Forward[1]; - values[2] = context->Listener->Forward[2]; - values[3] = context->Listener->Up[0]; - values[4] = context->Listener->Up[1]; - values[5] = context->Listener->Up[2]; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener float-vector property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetListeneri(ALenum param, ALint *value) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!value) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener integer property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!value1 || !value2 || !value3) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_POSITION: - *value1 = (ALint)context->Listener->Position[0]; - *value2 = (ALint)context->Listener->Position[1]; - *value3 = (ALint)context->Listener->Position[2]; - break; - - case AL_VELOCITY: - *value1 = (ALint)context->Listener->Velocity[0]; - *value2 = (ALint)context->Listener->Velocity[1]; - *value3 = (ALint)context->Listener->Velocity[2]; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-integer property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint* values) -{ - ALCcontext *context; - - switch(param) - { - case AL_POSITION: - case AL_VELOCITY: - alGetListener3i(param, values+0, values+1, values+2); - return; - } - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - else switch(param) - { - case AL_ORIENTATION: - // AT then UP - values[0] = (ALint)context->Listener->Forward[0]; - values[1] = (ALint)context->Listener->Forward[1]; - values[2] = (ALint)context->Listener->Forward[2]; - values[3] = (ALint)context->Listener->Up[0]; - values[4] = (ALint)context->Listener->Up[1]; - values[5] = (ALint)context->Listener->Up[2]; - break; - - default: - alSetError(context, AL_INVALID_ENUM, "Invalid listener integer-vector property"); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - - -void UpdateListenerProps(ALCcontext *context) -{ - ALlistener *listener = context->Listener; - struct ALlistenerProps *props; - - /* Get an unused proprty container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&context->FreeListenerProps, almemory_order_acquire); - if(!props) - props = al_calloc(16, sizeof(*props)); - else - { - struct ALlistenerProps *next; - do { - next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeListenerProps, &props, next, - almemory_order_seq_cst, almemory_order_acquire) == 0); - } - - /* Copy in current property values. */ - props->Position[0] = listener->Position[0]; - props->Position[1] = listener->Position[1]; - props->Position[2] = listener->Position[2]; - - props->Velocity[0] = listener->Velocity[0]; - props->Velocity[1] = listener->Velocity[1]; - props->Velocity[2] = listener->Velocity[2]; - - props->Forward[0] = listener->Forward[0]; - props->Forward[1] = listener->Forward[1]; - props->Forward[2] = listener->Forward[2]; - props->Up[0] = listener->Up[0]; - props->Up[1] = listener->Up[1]; - props->Up[2] = listener->Up[2]; - - props->Gain = listener->Gain; - - /* Set the new container for updating internal parameters. */ - props = ATOMIC_EXCHANGE_PTR(&listener->Update, props, almemory_order_acq_rel); - if(props) - { - /* If there was an unused update container, put it back in the - * freelist. - */ - ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &context->FreeListenerProps, props); - } -} diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c deleted file mode 100644 index 5ce439c..0000000 --- a/OpenAL32/alSource.c +++ /dev/null @@ -1,3706 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alError.h" -#include "alSource.h" -#include "alBuffer.h" -#include "alFilter.h" -#include "alAuxEffectSlot.h" -#include "ringbuffer.h" - -#include "backends/base.h" - -#include "threads.h" -#include "almalloc.h" - - -static ALsource *AllocSource(ALCcontext *context); -static void FreeSource(ALCcontext *context, ALsource *source); -static void InitSourceParams(ALsource *Source, ALsizei num_sends); -static void DeinitSource(ALsource *source, ALsizei num_sends); -static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_sends, ALCcontext *context); -static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime); -static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime); -static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context); -static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac); -static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice); - -static inline void LockSourceList(ALCcontext *context) -{ almtx_lock(&context->SourceLock); } -static inline void UnlockSourceList(ALCcontext *context) -{ almtx_unlock(&context->SourceLock); } - -static inline ALsource *LookupSource(ALCcontext *context, ALuint id) -{ - SourceSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(context->SourceList))) - return NULL; - sublist = &VECTOR_ELEM(context->SourceList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Sources + slidx; -} - -static inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) -{ - BufferSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(device->BufferList))) - return NULL; - sublist = &VECTOR_ELEM(device->BufferList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Buffers + slidx; -} - -static inline ALfilter *LookupFilter(ALCdevice *device, ALuint id) -{ - FilterSubList *sublist; - ALuint lidx = (id-1) >> 6; - ALsizei slidx = (id-1) & 0x3f; - - if(UNLIKELY(lidx >= VECTOR_SIZE(device->FilterList))) - return NULL; - sublist = &VECTOR_ELEM(device->FilterList, lidx); - if(UNLIKELY(sublist->FreeMask & (U64(1)<Filters + slidx; -} - -static inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) -{ - id--; - if(UNLIKELY(id >= VECTOR_SIZE(context->EffectSlotList))) - return NULL; - return VECTOR_ELEM(context->EffectSlotList, id); -} - - -typedef enum SourceProp { - srcPitch = AL_PITCH, - srcGain = AL_GAIN, - srcMinGain = AL_MIN_GAIN, - srcMaxGain = AL_MAX_GAIN, - srcMaxDistance = AL_MAX_DISTANCE, - srcRolloffFactor = AL_ROLLOFF_FACTOR, - srcDopplerFactor = AL_DOPPLER_FACTOR, - srcConeOuterGain = AL_CONE_OUTER_GAIN, - srcSecOffset = AL_SEC_OFFSET, - srcSampleOffset = AL_SAMPLE_OFFSET, - srcByteOffset = AL_BYTE_OFFSET, - srcConeInnerAngle = AL_CONE_INNER_ANGLE, - srcConeOuterAngle = AL_CONE_OUTER_ANGLE, - srcRefDistance = AL_REFERENCE_DISTANCE, - - srcPosition = AL_POSITION, - srcVelocity = AL_VELOCITY, - srcDirection = AL_DIRECTION, - - srcSourceRelative = AL_SOURCE_RELATIVE, - srcLooping = AL_LOOPING, - srcBuffer = AL_BUFFER, - srcSourceState = AL_SOURCE_STATE, - srcBuffersQueued = AL_BUFFERS_QUEUED, - srcBuffersProcessed = AL_BUFFERS_PROCESSED, - srcSourceType = AL_SOURCE_TYPE, - - /* ALC_EXT_EFX */ - srcConeOuterGainHF = AL_CONE_OUTER_GAINHF, - srcAirAbsorptionFactor = AL_AIR_ABSORPTION_FACTOR, - srcRoomRolloffFactor = AL_ROOM_ROLLOFF_FACTOR, - srcDirectFilterGainHFAuto = AL_DIRECT_FILTER_GAINHF_AUTO, - srcAuxSendFilterGainAuto = AL_AUXILIARY_SEND_FILTER_GAIN_AUTO, - srcAuxSendFilterGainHFAuto = AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO, - srcDirectFilter = AL_DIRECT_FILTER, - srcAuxSendFilter = AL_AUXILIARY_SEND_FILTER, - - /* AL_SOFT_direct_channels */ - srcDirectChannelsSOFT = AL_DIRECT_CHANNELS_SOFT, - - /* AL_EXT_source_distance_model */ - srcDistanceModel = AL_DISTANCE_MODEL, - - /* AL_SOFT_source_latency */ - srcSampleOffsetLatencySOFT = AL_SAMPLE_OFFSET_LATENCY_SOFT, - srcSecOffsetLatencySOFT = AL_SEC_OFFSET_LATENCY_SOFT, - - /* AL_EXT_STEREO_ANGLES */ - srcAngles = AL_STEREO_ANGLES, - - /* AL_EXT_SOURCE_RADIUS */ - srcRadius = AL_SOURCE_RADIUS, - - /* AL_EXT_BFORMAT */ - srcOrientation = AL_ORIENTATION, - - /* AL_SOFT_source_resampler */ - srcResampler = AL_SOURCE_RESAMPLER_SOFT, - - /* AL_SOFT_source_spatialize */ - srcSpatialize = AL_SOURCE_SPATIALIZE_SOFT, - - /* ALC_SOFT_device_clock */ - srcSampleOffsetClockSOFT = AL_SAMPLE_OFFSET_CLOCK_SOFT, - srcSecOffsetClockSOFT = AL_SEC_OFFSET_CLOCK_SOFT, -} SourceProp; - -static ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALfloat *values); -static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint *values); -static ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint64SOFT *values); - -static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALdouble *values); -static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint *values); -static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint64 *values); - -static inline ALvoice *GetSourceVoice(ALsource *source, ALCcontext *context) -{ - ALint idx = source->VoiceIdx; - if(idx >= 0 && idx < context->VoiceCount) - { - ALvoice *voice = context->Voices[idx]; - if(ATOMIC_LOAD(&voice->Source, almemory_order_acquire) == source) - return voice; - } - source->VoiceIdx = -1; - return NULL; -} - -/** - * Returns if the last known state for the source was playing or paused. Does - * not sync with the mixer voice. - */ -static inline bool IsPlayingOrPaused(ALsource *source) -{ return source->state == AL_PLAYING || source->state == AL_PAUSED; } - -/** - * Returns an updated source state using the matching voice's status (or lack - * thereof). - */ -static inline ALenum GetSourceState(ALsource *source, ALvoice *voice) -{ - if(!voice && source->state == AL_PLAYING) - source->state = AL_STOPPED; - return source->state; -} - -/** - * Returns if the source should specify an update, given the context's - * deferring state and the source's last known state. - */ -static inline bool SourceShouldUpdate(ALsource *source, ALCcontext *context) -{ - return !ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire) && - IsPlayingOrPaused(source); -} - - -/** Can only be called while the mixer is locked! */ -static void SendStateChangeEvent(ALCcontext *context, ALuint id, ALenum state) -{ - ALbitfieldSOFT enabledevt; - AsyncEvent evt; - - enabledevt = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); - if(!(enabledevt&EventType_SourceStateChange)) return; - - evt.EnumType = EventType_SourceStateChange; - evt.Type = AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT; - evt.ObjectId = id; - evt.Param = state; - snprintf(evt.Message, sizeof(evt.Message), "Source ID %u state changed to %s", id, - (state==AL_INITIAL) ? "AL_INITIAL" : - (state==AL_PLAYING) ? "AL_PLAYING" : - (state==AL_PAUSED) ? "AL_PAUSED" : - (state==AL_STOPPED) ? "AL_STOPPED" : "" - ); - /* The mixer may have queued a state change that's not yet been processed, - * and we don't want state change messages to occur out of order, so send - * it through the async queue to ensure proper ordering. - */ - if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) - alsem_post(&context->EventSem); -} - - -static ALint FloatValsByProp(ALenum prop) -{ - if(prop != (ALenum)((SourceProp)prop)) - return 0; - switch((SourceProp)prop) - { - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_MAX_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_DOPPLER_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_REFERENCE_DISTANCE: - case AL_CONE_OUTER_GAINHF: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_SOURCE_STATE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_TYPE: - case AL_SOURCE_RADIUS: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - return 1; - - case AL_STEREO_ANGLES: - return 2; - - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - return 3; - - case AL_ORIENTATION: - return 6; - - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - break; /* Double only */ - - case AL_BUFFER: - case AL_DIRECT_FILTER: - case AL_AUXILIARY_SEND_FILTER: - break; /* i/i64 only */ - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - break; /* i64 only */ - } - return 0; -} -static ALint DoubleValsByProp(ALenum prop) -{ - if(prop != (ALenum)((SourceProp)prop)) - return 0; - switch((SourceProp)prop) - { - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_MAX_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_DOPPLER_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_REFERENCE_DISTANCE: - case AL_CONE_OUTER_GAINHF: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_SOURCE_STATE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_TYPE: - case AL_SOURCE_RADIUS: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - return 1; - - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - case AL_STEREO_ANGLES: - return 2; - - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - return 3; - - case AL_ORIENTATION: - return 6; - - case AL_BUFFER: - case AL_DIRECT_FILTER: - case AL_AUXILIARY_SEND_FILTER: - break; /* i/i64 only */ - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - break; /* i64 only */ - } - return 0; -} - -static ALint IntValsByProp(ALenum prop) -{ - if(prop != (ALenum)((SourceProp)prop)) - return 0; - switch((SourceProp)prop) - { - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_MAX_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_DOPPLER_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_REFERENCE_DISTANCE: - case AL_CONE_OUTER_GAINHF: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_BUFFER: - case AL_SOURCE_STATE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_TYPE: - case AL_DIRECT_FILTER: - case AL_SOURCE_RADIUS: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - return 1; - - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - case AL_AUXILIARY_SEND_FILTER: - return 3; - - case AL_ORIENTATION: - return 6; - - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - break; /* i64 only */ - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - break; /* Double only */ - case AL_STEREO_ANGLES: - break; /* Float/double only */ - } - return 0; -} -static ALint Int64ValsByProp(ALenum prop) -{ - if(prop != (ALenum)((SourceProp)prop)) - return 0; - switch((SourceProp)prop) - { - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_MAX_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_DOPPLER_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_REFERENCE_DISTANCE: - case AL_CONE_OUTER_GAINHF: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_BUFFER: - case AL_SOURCE_STATE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_TYPE: - case AL_DIRECT_FILTER: - case AL_SOURCE_RADIUS: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - return 1; - - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - return 2; - - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - case AL_AUXILIARY_SEND_FILTER: - return 3; - - case AL_ORIENTATION: - return 6; - - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - break; /* Double only */ - case AL_STEREO_ANGLES: - break; /* Float/double only */ - } - return 0; -} - - -#define CHECKVAL(x) do { \ - if(!(x)) \ - { \ - alSetError(Context, AL_INVALID_VALUE, "Value out of range"); \ - return AL_FALSE; \ - } \ -} while(0) - -#define DO_UPDATEPROPS() do { \ - ALvoice *voice; \ - if(SourceShouldUpdate(Source, Context) && \ - (voice=GetSourceVoice(Source, Context)) != NULL) \ - UpdateSourceProps(Source, voice, device->NumAuxSends, Context); \ - else \ - ATOMIC_FLAG_CLEAR(&Source->PropsClean, almemory_order_release); \ -} while(0) - -static ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALfloat *values) -{ - ALCdevice *device = Context->Device; - ALint ival; - - switch(prop) - { - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - /* Query only */ - SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, - "Setting read-only source property 0x%04x", prop); - - case AL_PITCH: - CHECKVAL(*values >= 0.0f); - - Source->Pitch = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_CONE_INNER_ANGLE: - CHECKVAL(*values >= 0.0f && *values <= 360.0f); - - Source->InnerAngle = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_CONE_OUTER_ANGLE: - CHECKVAL(*values >= 0.0f && *values <= 360.0f); - - Source->OuterAngle = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_GAIN: - CHECKVAL(*values >= 0.0f); - - Source->Gain = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_MAX_DISTANCE: - CHECKVAL(*values >= 0.0f); - - Source->MaxDistance = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_ROLLOFF_FACTOR: - CHECKVAL(*values >= 0.0f); - - Source->RolloffFactor = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_REFERENCE_DISTANCE: - CHECKVAL(*values >= 0.0f); - - Source->RefDistance = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_MIN_GAIN: - CHECKVAL(*values >= 0.0f); - - Source->MinGain = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_MAX_GAIN: - CHECKVAL(*values >= 0.0f); - - Source->MaxGain = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_CONE_OUTER_GAIN: - CHECKVAL(*values >= 0.0f && *values <= 1.0f); - - Source->OuterGain = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_CONE_OUTER_GAINHF: - CHECKVAL(*values >= 0.0f && *values <= 1.0f); - - Source->OuterGainHF = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_AIR_ABSORPTION_FACTOR: - CHECKVAL(*values >= 0.0f && *values <= 10.0f); - - Source->AirAbsorptionFactor = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_ROOM_ROLLOFF_FACTOR: - CHECKVAL(*values >= 0.0f && *values <= 10.0f); - - Source->RoomRolloffFactor = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_DOPPLER_FACTOR: - CHECKVAL(*values >= 0.0f && *values <= 1.0f); - - Source->DopplerFactor = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - CHECKVAL(*values >= 0.0f); - - Source->OffsetType = prop; - Source->Offset = *values; - - if(IsPlayingOrPaused(Source)) - { - ALvoice *voice; - - ALCdevice_Lock(Context->Device); - /* Double-check that the source is still playing while we have - * the lock. - */ - voice = GetSourceVoice(Source, Context); - if(voice) - { - if(ApplyOffset(Source, voice) == AL_FALSE) - { - ALCdevice_Unlock(Context->Device); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid offset"); - } - } - ALCdevice_Unlock(Context->Device); - } - return AL_TRUE; - - case AL_SOURCE_RADIUS: - CHECKVAL(*values >= 0.0f && isfinite(*values)); - - Source->Radius = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_STEREO_ANGLES: - CHECKVAL(isfinite(values[0]) && isfinite(values[1])); - - Source->StereoPan[0] = values[0]; - Source->StereoPan[1] = values[1]; - DO_UPDATEPROPS(); - return AL_TRUE; - - - case AL_POSITION: - CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2])); - - Source->Position[0] = values[0]; - Source->Position[1] = values[1]; - Source->Position[2] = values[2]; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_VELOCITY: - CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2])); - - Source->Velocity[0] = values[0]; - Source->Velocity[1] = values[1]; - Source->Velocity[2] = values[2]; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_DIRECTION: - CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2])); - - Source->Direction[0] = values[0]; - Source->Direction[1] = values[1]; - Source->Direction[2] = values[2]; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_ORIENTATION: - CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]) && - isfinite(values[3]) && isfinite(values[4]) && isfinite(values[5])); - - Source->Orientation[0][0] = values[0]; - Source->Orientation[0][1] = values[1]; - Source->Orientation[0][2] = values[2]; - Source->Orientation[1][0] = values[3]; - Source->Orientation[1][1] = values[4]; - Source->Orientation[1][2] = values[5]; - DO_UPDATEPROPS(); - return AL_TRUE; - - - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_SOURCE_STATE: - case AL_SOURCE_TYPE: - case AL_DISTANCE_MODEL: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - ival = (ALint)values[0]; - return SetSourceiv(Source, Context, prop, &ival); - - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - ival = (ALint)((ALuint)values[0]); - return SetSourceiv(Source, Context, prop, &ival); - - case AL_BUFFER: - case AL_DIRECT_FILTER: - case AL_AUXILIARY_SEND_FILTER: - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - break; - } - - ERR("Unexpected property: 0x%04x\n", prop); - SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source float property 0x%04x", prop); -} - -static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint *values) -{ - ALCdevice *device = Context->Device; - ALbuffer *buffer = NULL; - ALfilter *filter = NULL; - ALeffectslot *slot = NULL; - ALbufferlistitem *oldlist; - ALfloat fvals[6]; - - switch(prop) - { - case AL_SOURCE_STATE: - case AL_SOURCE_TYPE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - /* Query only */ - SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, - "Setting read-only source property 0x%04x", prop); - - case AL_SOURCE_RELATIVE: - CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - - Source->HeadRelative = (ALboolean)*values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_LOOPING: - CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - - Source->Looping = (ALboolean)*values; - if(IsPlayingOrPaused(Source)) - { - ALvoice *voice = GetSourceVoice(Source, Context); - if(voice) - { - if(Source->Looping) - ATOMIC_STORE(&voice->loop_buffer, Source->queue, almemory_order_release); - else - ATOMIC_STORE(&voice->loop_buffer, NULL, almemory_order_release); - - /* If the source is playing, wait for the current mix to finish - * to ensure it isn't currently looping back or reaching the - * end. - */ - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); - } - } - return AL_TRUE; - - case AL_BUFFER: - LockBufferList(device); - if(!(*values == 0 || (buffer=LookupBuffer(device, *values)) != NULL)) - { - UnlockBufferList(device); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid buffer ID %u", - *values); - } - - if(buffer && buffer->MappedAccess != 0 && - !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) - { - UnlockBufferList(device); - SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, - "Setting non-persistently mapped buffer %u", buffer->id); - } - else - { - ALenum state = GetSourceState(Source, GetSourceVoice(Source, Context)); - if(state == AL_PLAYING || state == AL_PAUSED) - { - UnlockBufferList(device); - SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, - "Setting buffer on playing or paused source %u", Source->id); - } - } - - oldlist = Source->queue; - if(buffer != NULL) - { - /* Add the selected buffer to a one-item queue */ - ALbufferlistitem *newlist = al_calloc(DEF_ALIGN, - FAM_SIZE(ALbufferlistitem, buffers, 1)); - ATOMIC_INIT(&newlist->next, NULL); - newlist->max_samples = buffer->SampleLen; - newlist->num_buffers = 1; - newlist->buffers[0] = buffer; - IncrementRef(&buffer->ref); - - /* Source is now Static */ - Source->SourceType = AL_STATIC; - Source->queue = newlist; - } - else - { - /* Source is now Undetermined */ - Source->SourceType = AL_UNDETERMINED; - Source->queue = NULL; - } - UnlockBufferList(device); - - /* Delete all elements in the previous queue */ - while(oldlist != NULL) - { - ALsizei i; - ALbufferlistitem *temp = oldlist; - oldlist = ATOMIC_LOAD(&temp->next, almemory_order_relaxed); - - for(i = 0;i < temp->num_buffers;i++) - { - if(temp->buffers[i]) - DecrementRef(&temp->buffers[i]->ref); - } - al_free(temp); - } - return AL_TRUE; - - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - CHECKVAL(*values >= 0); - - Source->OffsetType = prop; - Source->Offset = *values; - - if(IsPlayingOrPaused(Source)) - { - ALvoice *voice; - - ALCdevice_Lock(Context->Device); - voice = GetSourceVoice(Source, Context); - if(voice) - { - if(ApplyOffset(Source, voice) == AL_FALSE) - { - ALCdevice_Unlock(Context->Device); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, - "Invalid source offset"); - } - } - ALCdevice_Unlock(Context->Device); - } - return AL_TRUE; - - case AL_DIRECT_FILTER: - LockFilterList(device); - if(!(*values == 0 || (filter=LookupFilter(device, *values)) != NULL)) - { - UnlockFilterList(device); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid filter ID %u", - *values); - } - - if(!filter) - { - Source->Direct.Gain = 1.0f; - Source->Direct.GainHF = 1.0f; - Source->Direct.HFReference = LOWPASSFREQREF; - Source->Direct.GainLF = 1.0f; - Source->Direct.LFReference = HIGHPASSFREQREF; - } - else - { - Source->Direct.Gain = filter->Gain; - Source->Direct.GainHF = filter->GainHF; - Source->Direct.HFReference = filter->HFReference; - Source->Direct.GainLF = filter->GainLF; - Source->Direct.LFReference = filter->LFReference; - } - UnlockFilterList(device); - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_DIRECT_FILTER_GAINHF_AUTO: - CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - - Source->DryGainHFAuto = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - - Source->WetGainAuto = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - - Source->WetGainHFAuto = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_DIRECT_CHANNELS_SOFT: - CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - - Source->DirectChannels = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_DISTANCE_MODEL: - CHECKVAL(*values == AL_NONE || - *values == AL_INVERSE_DISTANCE || - *values == AL_INVERSE_DISTANCE_CLAMPED || - *values == AL_LINEAR_DISTANCE || - *values == AL_LINEAR_DISTANCE_CLAMPED || - *values == AL_EXPONENT_DISTANCE || - *values == AL_EXPONENT_DISTANCE_CLAMPED); - - Source->DistanceModel = *values; - if(Context->SourceDistanceModel) - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_SOURCE_RESAMPLER_SOFT: - CHECKVAL(*values >= 0 && *values <= ResamplerMax); - - Source->Resampler = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - case AL_SOURCE_SPATIALIZE_SOFT: - CHECKVAL(*values >= AL_FALSE && *values <= AL_AUTO_SOFT); - - Source->Spatialize = *values; - DO_UPDATEPROPS(); - return AL_TRUE; - - - case AL_AUXILIARY_SEND_FILTER: - LockEffectSlotList(Context); - if(!(values[0] == 0 || (slot=LookupEffectSlot(Context, values[0])) != NULL)) - { - UnlockEffectSlotList(Context); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid effect ID %u", - values[0]); - } - if(!((ALuint)values[1] < (ALuint)device->NumAuxSends)) - { - UnlockEffectSlotList(Context); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid send %u", values[1]); - } - LockFilterList(device); - if(!(values[2] == 0 || (filter=LookupFilter(device, values[2])) != NULL)) - { - UnlockFilterList(device); - UnlockEffectSlotList(Context); - SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid filter ID %u", - values[2]); - } - - if(!filter) - { - /* Disable filter */ - Source->Send[values[1]].Gain = 1.0f; - Source->Send[values[1]].GainHF = 1.0f; - Source->Send[values[1]].HFReference = LOWPASSFREQREF; - Source->Send[values[1]].GainLF = 1.0f; - Source->Send[values[1]].LFReference = HIGHPASSFREQREF; - } - else - { - Source->Send[values[1]].Gain = filter->Gain; - Source->Send[values[1]].GainHF = filter->GainHF; - Source->Send[values[1]].HFReference = filter->HFReference; - Source->Send[values[1]].GainLF = filter->GainLF; - Source->Send[values[1]].LFReference = filter->LFReference; - } - UnlockFilterList(device); - - if(slot != Source->Send[values[1]].Slot && IsPlayingOrPaused(Source)) - { - ALvoice *voice; - /* Add refcount on the new slot, and release the previous slot */ - if(slot) IncrementRef(&slot->ref); - if(Source->Send[values[1]].Slot) - DecrementRef(&Source->Send[values[1]].Slot->ref); - Source->Send[values[1]].Slot = slot; - - /* We must force an update if the auxiliary slot changed on an - * active source, in case the slot is about to be deleted. - */ - if((voice=GetSourceVoice(Source, Context)) != NULL) - UpdateSourceProps(Source, voice, device->NumAuxSends, Context); - else - ATOMIC_FLAG_CLEAR(&Source->PropsClean, almemory_order_release); - } - else - { - if(slot) IncrementRef(&slot->ref); - if(Source->Send[values[1]].Slot) - DecrementRef(&Source->Send[values[1]].Slot->ref); - Source->Send[values[1]].Slot = slot; - DO_UPDATEPROPS(); - } - UnlockEffectSlotList(Context); - - return AL_TRUE; - - - /* 1x float */ - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_REFERENCE_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_MAX_DISTANCE: - case AL_DOPPLER_FACTOR: - case AL_CONE_OUTER_GAINHF: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_SOURCE_RADIUS: - fvals[0] = (ALfloat)*values; - return SetSourcefv(Source, Context, (int)prop, fvals); - - /* 3x float */ - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - fvals[0] = (ALfloat)values[0]; - fvals[1] = (ALfloat)values[1]; - fvals[2] = (ALfloat)values[2]; - return SetSourcefv(Source, Context, (int)prop, fvals); - - /* 6x float */ - case AL_ORIENTATION: - fvals[0] = (ALfloat)values[0]; - fvals[1] = (ALfloat)values[1]; - fvals[2] = (ALfloat)values[2]; - fvals[3] = (ALfloat)values[3]; - fvals[4] = (ALfloat)values[4]; - fvals[5] = (ALfloat)values[5]; - return SetSourcefv(Source, Context, (int)prop, fvals); - - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - case AL_STEREO_ANGLES: - break; - } - - ERR("Unexpected property: 0x%04x\n", prop); - SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer property 0x%04x", - prop); -} - -static ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint64SOFT *values) -{ - ALfloat fvals[6]; - ALint ivals[3]; - - switch(prop) - { - case AL_SOURCE_TYPE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_STATE: - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - /* Query only */ - SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, - "Setting read-only source property 0x%04x", prop); - - /* 1x int */ - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - CHECKVAL(*values <= INT_MAX && *values >= INT_MIN); - - ivals[0] = (ALint)*values; - return SetSourceiv(Source, Context, (int)prop, ivals); - - /* 1x uint */ - case AL_BUFFER: - case AL_DIRECT_FILTER: - CHECKVAL(*values <= UINT_MAX && *values >= 0); - - ivals[0] = (ALuint)*values; - return SetSourceiv(Source, Context, (int)prop, ivals); - - /* 3x uint */ - case AL_AUXILIARY_SEND_FILTER: - CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0 && - values[1] <= UINT_MAX && values[1] >= 0 && - values[2] <= UINT_MAX && values[2] >= 0); - - ivals[0] = (ALuint)values[0]; - ivals[1] = (ALuint)values[1]; - ivals[2] = (ALuint)values[2]; - return SetSourceiv(Source, Context, (int)prop, ivals); - - /* 1x float */ - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_REFERENCE_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_MAX_DISTANCE: - case AL_DOPPLER_FACTOR: - case AL_CONE_OUTER_GAINHF: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_SOURCE_RADIUS: - fvals[0] = (ALfloat)*values; - return SetSourcefv(Source, Context, (int)prop, fvals); - - /* 3x float */ - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - fvals[0] = (ALfloat)values[0]; - fvals[1] = (ALfloat)values[1]; - fvals[2] = (ALfloat)values[2]; - return SetSourcefv(Source, Context, (int)prop, fvals); - - /* 6x float */ - case AL_ORIENTATION: - fvals[0] = (ALfloat)values[0]; - fvals[1] = (ALfloat)values[1]; - fvals[2] = (ALfloat)values[2]; - fvals[3] = (ALfloat)values[3]; - fvals[4] = (ALfloat)values[4]; - fvals[5] = (ALfloat)values[5]; - return SetSourcefv(Source, Context, (int)prop, fvals); - - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - case AL_STEREO_ANGLES: - break; - } - - ERR("Unexpected property: 0x%04x\n", prop); - SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer64 property 0x%04x", - prop); -} - -#undef CHECKVAL - - -static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALdouble *values) -{ - ALCdevice *device = Context->Device; - ClockLatency clocktime; - ALuint64 srcclock; - ALint ivals[3]; - ALboolean err; - - switch(prop) - { - case AL_GAIN: - *values = Source->Gain; - return AL_TRUE; - - case AL_PITCH: - *values = Source->Pitch; - return AL_TRUE; - - case AL_MAX_DISTANCE: - *values = Source->MaxDistance; - return AL_TRUE; - - case AL_ROLLOFF_FACTOR: - *values = Source->RolloffFactor; - return AL_TRUE; - - case AL_REFERENCE_DISTANCE: - *values = Source->RefDistance; - return AL_TRUE; - - case AL_CONE_INNER_ANGLE: - *values = Source->InnerAngle; - return AL_TRUE; - - case AL_CONE_OUTER_ANGLE: - *values = Source->OuterAngle; - return AL_TRUE; - - case AL_MIN_GAIN: - *values = Source->MinGain; - return AL_TRUE; - - case AL_MAX_GAIN: - *values = Source->MaxGain; - return AL_TRUE; - - case AL_CONE_OUTER_GAIN: - *values = Source->OuterGain; - return AL_TRUE; - - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - *values = GetSourceOffset(Source, prop, Context); - return AL_TRUE; - - case AL_CONE_OUTER_GAINHF: - *values = Source->OuterGainHF; - return AL_TRUE; - - case AL_AIR_ABSORPTION_FACTOR: - *values = Source->AirAbsorptionFactor; - return AL_TRUE; - - case AL_ROOM_ROLLOFF_FACTOR: - *values = Source->RoomRolloffFactor; - return AL_TRUE; - - case AL_DOPPLER_FACTOR: - *values = Source->DopplerFactor; - return AL_TRUE; - - case AL_SOURCE_RADIUS: - *values = Source->Radius; - return AL_TRUE; - - case AL_STEREO_ANGLES: - values[0] = Source->StereoPan[0]; - values[1] = Source->StereoPan[1]; - return AL_TRUE; - - case AL_SEC_OFFSET_LATENCY_SOFT: - /* Get the source offset with the clock time first. Then get the - * clock time with the device latency. Order is important. - */ - values[0] = GetSourceSecOffset(Source, Context, &srcclock); - almtx_lock(&device->BackendLock); - clocktime = V0(device->Backend,getClockLatency)(); - almtx_unlock(&device->BackendLock); - if(srcclock == (ALuint64)clocktime.ClockTime) - values[1] = (ALdouble)clocktime.Latency / 1000000000.0; - else - { - /* If the clock time incremented, reduce the latency by that - * much since it's that much closer to the source offset it got - * earlier. - */ - ALuint64 diff = clocktime.ClockTime - srcclock; - values[1] = (ALdouble)(clocktime.Latency - minu64(clocktime.Latency, diff)) / - 1000000000.0; - } - return AL_TRUE; - - case AL_SEC_OFFSET_CLOCK_SOFT: - values[0] = GetSourceSecOffset(Source, Context, &srcclock); - values[1] = srcclock / 1000000000.0; - return AL_TRUE; - - case AL_POSITION: - values[0] = Source->Position[0]; - values[1] = Source->Position[1]; - values[2] = Source->Position[2]; - return AL_TRUE; - - case AL_VELOCITY: - values[0] = Source->Velocity[0]; - values[1] = Source->Velocity[1]; - values[2] = Source->Velocity[2]; - return AL_TRUE; - - case AL_DIRECTION: - values[0] = Source->Direction[0]; - values[1] = Source->Direction[1]; - values[2] = Source->Direction[2]; - return AL_TRUE; - - case AL_ORIENTATION: - values[0] = Source->Orientation[0][0]; - values[1] = Source->Orientation[0][1]; - values[2] = Source->Orientation[0][2]; - values[3] = Source->Orientation[1][0]; - values[4] = Source->Orientation[1][1]; - values[5] = Source->Orientation[1][2]; - return AL_TRUE; - - /* 1x int */ - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_SOURCE_STATE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_TYPE: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - if((err=GetSourceiv(Source, Context, (int)prop, ivals)) != AL_FALSE) - *values = (ALdouble)ivals[0]; - return err; - - case AL_BUFFER: - case AL_DIRECT_FILTER: - case AL_AUXILIARY_SEND_FILTER: - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - break; - } - - ERR("Unexpected property: 0x%04x\n", prop); - SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source double property 0x%04x", - prop); -} - -static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint *values) -{ - ALbufferlistitem *BufferList; - ALdouble dvals[6]; - ALboolean err; - - switch(prop) - { - case AL_SOURCE_RELATIVE: - *values = Source->HeadRelative; - return AL_TRUE; - - case AL_LOOPING: - *values = Source->Looping; - return AL_TRUE; - - case AL_BUFFER: - BufferList = (Source->SourceType == AL_STATIC) ? Source->queue : NULL; - *values = (BufferList && BufferList->num_buffers >= 1 && BufferList->buffers[0]) ? - BufferList->buffers[0]->id : 0; - return AL_TRUE; - - case AL_SOURCE_STATE: - *values = GetSourceState(Source, GetSourceVoice(Source, Context)); - return AL_TRUE; - - case AL_BUFFERS_QUEUED: - if(!(BufferList=Source->queue)) - *values = 0; - else - { - ALsizei count = 0; - do { - count += BufferList->num_buffers; - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } while(BufferList != NULL); - *values = count; - } - return AL_TRUE; - - case AL_BUFFERS_PROCESSED: - if(Source->Looping || Source->SourceType != AL_STREAMING) - { - /* Buffers on a looping source are in a perpetual state of - * PENDING, so don't report any as PROCESSED */ - *values = 0; - } - else - { - const ALbufferlistitem *BufferList = Source->queue; - const ALbufferlistitem *Current = NULL; - ALsizei played = 0; - ALvoice *voice; - - if((voice=GetSourceVoice(Source, Context)) != NULL) - Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - else if(Source->state == AL_INITIAL) - Current = BufferList; - - while(BufferList && BufferList != Current) - { - played += BufferList->num_buffers; - BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, - almemory_order_relaxed); - } - *values = played; - } - return AL_TRUE; - - case AL_SOURCE_TYPE: - *values = Source->SourceType; - return AL_TRUE; - - case AL_DIRECT_FILTER_GAINHF_AUTO: - *values = Source->DryGainHFAuto; - return AL_TRUE; - - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - *values = Source->WetGainAuto; - return AL_TRUE; - - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - *values = Source->WetGainHFAuto; - return AL_TRUE; - - case AL_DIRECT_CHANNELS_SOFT: - *values = Source->DirectChannels; - return AL_TRUE; - - case AL_DISTANCE_MODEL: - *values = Source->DistanceModel; - return AL_TRUE; - - case AL_SOURCE_RESAMPLER_SOFT: - *values = Source->Resampler; - return AL_TRUE; - - case AL_SOURCE_SPATIALIZE_SOFT: - *values = Source->Spatialize; - return AL_TRUE; - - /* 1x float/double */ - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_REFERENCE_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_MAX_DISTANCE: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_DOPPLER_FACTOR: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_CONE_OUTER_GAINHF: - case AL_SOURCE_RADIUS: - if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) - *values = (ALint)dvals[0]; - return err; - - /* 3x float/double */ - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) - { - values[0] = (ALint)dvals[0]; - values[1] = (ALint)dvals[1]; - values[2] = (ALint)dvals[2]; - } - return err; - - /* 6x float/double */ - case AL_ORIENTATION: - if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) - { - values[0] = (ALint)dvals[0]; - values[1] = (ALint)dvals[1]; - values[2] = (ALint)dvals[2]; - values[3] = (ALint)dvals[3]; - values[4] = (ALint)dvals[4]; - values[5] = (ALint)dvals[5]; - } - return err; - - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - break; /* i64 only */ - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - break; /* Double only */ - case AL_STEREO_ANGLES: - break; /* Float/double only */ - - case AL_DIRECT_FILTER: - case AL_AUXILIARY_SEND_FILTER: - break; /* ??? */ - } - - ERR("Unexpected property: 0x%04x\n", prop); - SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer property 0x%04x", - prop); -} - -static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint64 *values) -{ - ALCdevice *device = Context->Device; - ClockLatency clocktime; - ALuint64 srcclock; - ALdouble dvals[6]; - ALint ivals[3]; - ALboolean err; - - switch(prop) - { - case AL_SAMPLE_OFFSET_LATENCY_SOFT: - /* Get the source offset with the clock time first. Then get the - * clock time with the device latency. Order is important. - */ - values[0] = GetSourceSampleOffset(Source, Context, &srcclock); - almtx_lock(&device->BackendLock); - clocktime = V0(device->Backend,getClockLatency)(); - almtx_unlock(&device->BackendLock); - if(srcclock == (ALuint64)clocktime.ClockTime) - values[1] = clocktime.Latency; - else - { - /* If the clock time incremented, reduce the latency by that - * much since it's that much closer to the source offset it got - * earlier. - */ - ALuint64 diff = clocktime.ClockTime - srcclock; - values[1] = clocktime.Latency - minu64(clocktime.Latency, diff); - } - return AL_TRUE; - - case AL_SAMPLE_OFFSET_CLOCK_SOFT: - values[0] = GetSourceSampleOffset(Source, Context, &srcclock); - values[1] = srcclock; - return AL_TRUE; - - /* 1x float/double */ - case AL_CONE_INNER_ANGLE: - case AL_CONE_OUTER_ANGLE: - case AL_PITCH: - case AL_GAIN: - case AL_MIN_GAIN: - case AL_MAX_GAIN: - case AL_REFERENCE_DISTANCE: - case AL_ROLLOFF_FACTOR: - case AL_CONE_OUTER_GAIN: - case AL_MAX_DISTANCE: - case AL_SEC_OFFSET: - case AL_SAMPLE_OFFSET: - case AL_BYTE_OFFSET: - case AL_DOPPLER_FACTOR: - case AL_AIR_ABSORPTION_FACTOR: - case AL_ROOM_ROLLOFF_FACTOR: - case AL_CONE_OUTER_GAINHF: - case AL_SOURCE_RADIUS: - if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) - *values = (ALint64)dvals[0]; - return err; - - /* 3x float/double */ - case AL_POSITION: - case AL_VELOCITY: - case AL_DIRECTION: - if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) - { - values[0] = (ALint64)dvals[0]; - values[1] = (ALint64)dvals[1]; - values[2] = (ALint64)dvals[2]; - } - return err; - - /* 6x float/double */ - case AL_ORIENTATION: - if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) - { - values[0] = (ALint64)dvals[0]; - values[1] = (ALint64)dvals[1]; - values[2] = (ALint64)dvals[2]; - values[3] = (ALint64)dvals[3]; - values[4] = (ALint64)dvals[4]; - values[5] = (ALint64)dvals[5]; - } - return err; - - /* 1x int */ - case AL_SOURCE_RELATIVE: - case AL_LOOPING: - case AL_SOURCE_STATE: - case AL_BUFFERS_QUEUED: - case AL_BUFFERS_PROCESSED: - case AL_SOURCE_TYPE: - case AL_DIRECT_FILTER_GAINHF_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: - case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: - case AL_DIRECT_CHANNELS_SOFT: - case AL_DISTANCE_MODEL: - case AL_SOURCE_RESAMPLER_SOFT: - case AL_SOURCE_SPATIALIZE_SOFT: - if((err=GetSourceiv(Source, Context, prop, ivals)) != AL_FALSE) - *values = ivals[0]; - return err; - - /* 1x uint */ - case AL_BUFFER: - case AL_DIRECT_FILTER: - if((err=GetSourceiv(Source, Context, prop, ivals)) != AL_FALSE) - *values = (ALuint)ivals[0]; - return err; - - /* 3x uint */ - case AL_AUXILIARY_SEND_FILTER: - if((err=GetSourceiv(Source, Context, prop, ivals)) != AL_FALSE) - { - values[0] = (ALuint)ivals[0]; - values[1] = (ALuint)ivals[1]; - values[2] = (ALuint)ivals[2]; - } - return err; - - case AL_SEC_OFFSET_LATENCY_SOFT: - case AL_SEC_OFFSET_CLOCK_SOFT: - break; /* Double only */ - case AL_STEREO_ANGLES: - break; /* Float/double only */ - } - - ERR("Unexpected property: 0x%04x\n", prop); - SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer64 property 0x%04x", - prop); -} - - -AL_API ALvoid AL_APIENTRY alGenSources(ALsizei n, ALuint *sources) -{ - ALCcontext *context; - ALsizei cur = 0; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - alSetError(context, AL_INVALID_VALUE, "Generating %d sources", n); - else for(cur = 0;cur < n;cur++) - { - ALsource *source = AllocSource(context); - if(!source) - { - alDeleteSources(cur, sources); - break; - } - sources[cur] = source->id; - } - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources) -{ - ALCcontext *context; - ALsource *Source; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - LockSourceList(context); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d sources", n); - - /* Check that all Sources are valid */ - for(i = 0;i < n;i++) - { - if(LookupSource(context, sources[i]) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); - } - for(i = 0;i < n;i++) - { - if((Source=LookupSource(context, sources[i])) != NULL) - FreeSource(context, Source); - } - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - - -AL_API ALboolean AL_APIENTRY alIsSource(ALuint source) -{ - ALCcontext *context; - ALboolean ret; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - LockSourceList(context); - ret = (LookupSource(context, source) ? AL_TRUE : AL_FALSE); - UnlockSourceList(context); - - ALCcontext_DecRef(context); - - return ret; -} - - -AL_API ALvoid AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(FloatValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid float property 0x%04x", param); - else - SetSourcefv(Source, Context, param, &value); - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(FloatValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-float property 0x%04x", param); - else - { - ALfloat fvals[3] = { value1, value2, value3 }; - SetSourcefv(Source, Context, param, fvals); - } - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(FloatValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM, "Invalid float-vector property 0x%04x", param); - else - SetSourcefv(Source, Context, param, values); - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(DoubleValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid double property 0x%04x", param); - else - { - ALfloat fval = (ALfloat)value; - SetSourcefv(Source, Context, param, &fval); - } - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(DoubleValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-double property 0x%04x", param); - else - { - ALfloat fvals[3] = { (ALfloat)value1, (ALfloat)value2, (ALfloat)value3 }; - SetSourcefv(Source, Context, param, fvals); - } - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values) -{ - ALCcontext *Context; - ALsource *Source; - ALint count; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!((count=DoubleValsByProp(param)) > 0 && count <= 6)) - alSetError(Context, AL_INVALID_ENUM, "Invalid double-vector property 0x%04x", param); - else - { - ALfloat fvals[6]; - ALint i; - - for(i = 0;i < count;i++) - fvals[i] = (ALfloat)values[i]; - SetSourcefv(Source, Context, param, fvals); - } - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(IntValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer property 0x%04x", param); - else - SetSourceiv(Source, Context, param, &value); - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(IntValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer property 0x%04x", param); - else - { - ALint ivals[3] = { value1, value2, value3 }; - SetSourceiv(Source, Context, param, ivals); - } - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(IntValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer-vector property 0x%04x", param); - else - SetSourceiv(Source, Context, param, values); - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(Int64ValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer64 property 0x%04x", param); - else - SetSourcei64v(Source, Context, param, &value); - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(Int64ValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer64 property 0x%04x", param); - else - { - ALint64SOFT i64vals[3] = { value1, value2, value3 }; - SetSourcei64v(Source, Context, param, i64vals); - } - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - almtx_lock(&Context->PropLock); - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(Int64ValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer64-vector property 0x%04x", param); - else - SetSourcei64v(Source, Context, param, values); - UnlockSourceList(Context); - almtx_unlock(&Context->PropLock); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!value) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(FloatValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid float property 0x%04x", param); - else - { - ALdouble dval; - if(GetSourcedv(Source, Context, param, &dval)) - *value = (ALfloat)dval; - } - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(FloatValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-float property 0x%04x", param); - else - { - ALdouble dvals[3]; - if(GetSourcedv(Source, Context, param, dvals)) - { - *value1 = (ALfloat)dvals[0]; - *value2 = (ALfloat)dvals[1]; - *value3 = (ALfloat)dvals[2]; - } - } - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values) -{ - ALCcontext *Context; - ALsource *Source; - ALint count; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!((count=FloatValsByProp(param)) > 0 && count <= 6)) - alSetError(Context, AL_INVALID_ENUM, "Invalid float-vector property 0x%04x", param); - else - { - ALdouble dvals[6]; - if(GetSourcedv(Source, Context, param, dvals)) - { - ALint i; - for(i = 0;i < count;i++) - values[i] = (ALfloat)dvals[i]; - } - } - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!value) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(DoubleValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid double property 0x%04x", param); - else - GetSourcedv(Source, Context, param, value); - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(DoubleValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-double property 0x%04x", param); - else - { - ALdouble dvals[3]; - if(GetSourcedv(Source, Context, param, dvals)) - { - *value1 = dvals[0]; - *value2 = dvals[1]; - *value3 = dvals[2]; - } - } - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(DoubleValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM, "Invalid double-vector property 0x%04x", param); - else - GetSourcedv(Source, Context, param, values); - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!value) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(IntValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer property 0x%04x", param); - else - GetSourceiv(Source, Context, param, value); - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(IntValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer property 0x%04x", param); - else - { - ALint ivals[3]; - if(GetSourceiv(Source, Context, param, ivals)) - { - *value1 = ivals[0]; - *value2 = ivals[1]; - *value3 = ivals[2]; - } - } - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(IntValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer-vector property 0x%04x", param); - else - GetSourceiv(Source, Context, param, values); - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!value) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(Int64ValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer64 property 0x%04x", param); - else - GetSourcei64v(Source, Context, param, value); - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(Int64ValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer64 property 0x%04x", param); - else - { - ALint64 i64vals[3]; - if(GetSourcei64v(Source, Context, param, i64vals)) - { - *value1 = i64vals[0]; - *value2 = i64vals[1]; - *value3 = i64vals[2]; - } - } - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - -AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values) -{ - ALCcontext *Context; - ALsource *Source; - - Context = GetContextRef(); - if(!Context) return; - - LockSourceList(Context); - if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); - else if(!values) - alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); - else if(!(Int64ValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM, "Invalid integer64-vector property 0x%04x", param); - else - GetSourcei64v(Source, Context, param, values); - UnlockSourceList(Context); - - ALCcontext_DecRef(Context); -} - - -AL_API ALvoid AL_APIENTRY alSourcePlay(ALuint source) -{ - alSourcePlayv(1, &source); -} -AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) -{ - ALCcontext *context; - ALCdevice *device; - ALsource *source; - ALvoice *voice; - ALsizei i, j; - - context = GetContextRef(); - if(!context) return; - - LockSourceList(context); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Playing %d sources", n); - for(i = 0;i < n;i++) - { - if(!LookupSource(context, sources[i])) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); - } - - device = context->Device; - ALCdevice_Lock(device); - /* If the device is disconnected, go right to stopped. */ - if(!ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) - { - /* TODO: Send state change event? */ - for(i = 0;i < n;i++) - { - source = LookupSource(context, sources[i]); - source->OffsetType = AL_NONE; - source->Offset = 0.0; - source->state = AL_STOPPED; - } - ALCdevice_Unlock(device); - goto done; - } - - while(n > context->MaxVoices-context->VoiceCount) - { - ALsizei newcount = context->MaxVoices << 1; - if(context->MaxVoices >= newcount) - { - ALCdevice_Unlock(device); - SETERR_GOTO(context, AL_OUT_OF_MEMORY, done, - "Overflow increasing voice count %d -> %d", context->MaxVoices, newcount); - } - AllocateVoices(context, newcount, device->NumAuxSends); - } - - for(i = 0;i < n;i++) - { - ALbufferlistitem *BufferList; - bool start_fading = false; - ALint vidx = -1; - - source = LookupSource(context, sources[i]); - /* Check that there is a queue containing at least one valid, non zero - * length buffer. - */ - BufferList = source->queue; - while(BufferList && BufferList->max_samples == 0) - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - - /* If there's nothing to play, go right to stopped. */ - if(UNLIKELY(!BufferList)) - { - /* NOTE: A source without any playable buffers should not have an - * ALvoice since it shouldn't be in a playing or paused state. So - * there's no need to look up its voice and clear the source. - */ - ALenum oldstate = GetSourceState(source, NULL); - source->OffsetType = AL_NONE; - source->Offset = 0.0; - if(oldstate != AL_STOPPED) - { - source->state = AL_STOPPED; - SendStateChangeEvent(context, source->id, AL_STOPPED); - } - continue; - } - - voice = GetSourceVoice(source, context); - switch(GetSourceState(source, voice)) - { - case AL_PLAYING: - assert(voice != NULL); - /* A source that's already playing is restarted from the beginning. */ - ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_relaxed); - ATOMIC_STORE(&voice->position, 0, almemory_order_relaxed); - ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_release); - continue; - - case AL_PAUSED: - assert(voice != NULL); - /* A source that's paused simply resumes. */ - ATOMIC_STORE(&voice->Playing, true, almemory_order_release); - source->state = AL_PLAYING; - SendStateChangeEvent(context, source->id, AL_PLAYING); - continue; - - default: - break; - } - - /* Look for an unused voice to play this source with. */ - assert(voice == NULL); - for(j = 0;j < context->VoiceCount;j++) - { - if(ATOMIC_LOAD(&context->Voices[j]->Source, almemory_order_acquire) == NULL) - { - vidx = j; - break; - } - } - if(vidx == -1) - vidx = context->VoiceCount++; - voice = context->Voices[vidx]; - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - - ATOMIC_FLAG_TEST_AND_SET(&source->PropsClean, almemory_order_acquire); - UpdateSourceProps(source, voice, device->NumAuxSends, context); - - /* A source that's not playing or paused has any offset applied when it - * starts playing. - */ - if(source->Looping) - ATOMIC_STORE(&voice->loop_buffer, source->queue, almemory_order_relaxed); - else - ATOMIC_STORE(&voice->loop_buffer, NULL, almemory_order_relaxed); - ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_relaxed); - ATOMIC_STORE(&voice->position, 0, almemory_order_relaxed); - ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_relaxed); - if(ApplyOffset(source, voice) != AL_FALSE) - start_fading = ATOMIC_LOAD(&voice->position, almemory_order_relaxed) != 0 || - ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed) != 0 || - ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed) != BufferList; - - for(j = 0;j < BufferList->num_buffers;j++) - { - ALbuffer *buffer = BufferList->buffers[j]; - if(buffer) - { - voice->NumChannels = ChannelsFromFmt(buffer->FmtChannels); - voice->SampleSize = BytesFromFmt(buffer->FmtType); - break; - } - } - - /* Clear previous samples. */ - memset(voice->PrevSamples, 0, sizeof(voice->PrevSamples)); - - /* Clear the stepping value so the mixer knows not to mix this until - * the update gets applied. - */ - voice->Step = 0; - - voice->Flags = start_fading ? VOICE_IS_FADING : 0; - if(source->SourceType == AL_STATIC) voice->Flags |= VOICE_IS_STATIC; - memset(voice->Direct.Params, 0, sizeof(voice->Direct.Params[0])*voice->NumChannels); - for(j = 0;j < device->NumAuxSends;j++) - memset(voice->Send[j].Params, 0, sizeof(voice->Send[j].Params[0])*voice->NumChannels); - if(device->AvgSpeakerDist > 0.0f) - { - ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / - (device->AvgSpeakerDist * device->Frequency); - for(j = 0;j < voice->NumChannels;j++) - NfcFilterCreate(&voice->Direct.Params[j].NFCtrlFilter, 0.0f, w1); - } - - ATOMIC_STORE(&voice->Source, source, almemory_order_relaxed); - ATOMIC_STORE(&voice->Playing, true, almemory_order_release); - source->state = AL_PLAYING; - source->VoiceIdx = vidx; - - SendStateChangeEvent(context, source->id, AL_PLAYING); - } - ALCdevice_Unlock(device); - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alSourcePause(ALuint source) -{ - alSourcePausev(1, &source); -} -AL_API ALvoid AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources) -{ - ALCcontext *context; - ALCdevice *device; - ALsource *source; - ALvoice *voice; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - LockSourceList(context); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Pausing %d sources", n); - for(i = 0;i < n;i++) - { - if(!LookupSource(context, sources[i])) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); - } - - device = context->Device; - ALCdevice_Lock(device); - for(i = 0;i < n;i++) - { - source = LookupSource(context, sources[i]); - if((voice=GetSourceVoice(source, context)) != NULL) - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - if(GetSourceState(source, voice) == AL_PLAYING) - { - source->state = AL_PAUSED; - SendStateChangeEvent(context, source->id, AL_PAUSED); - } - } - ALCdevice_Unlock(device); - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alSourceStop(ALuint source) -{ - alSourceStopv(1, &source); -} -AL_API ALvoid AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources) -{ - ALCcontext *context; - ALCdevice *device; - ALsource *source; - ALvoice *voice; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - LockSourceList(context); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Stopping %d sources", n); - for(i = 0;i < n;i++) - { - if(!LookupSource(context, sources[i])) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); - } - - device = context->Device; - ALCdevice_Lock(device); - for(i = 0;i < n;i++) - { - ALenum oldstate; - source = LookupSource(context, sources[i]); - if((voice=GetSourceVoice(source, context)) != NULL) - { - ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - voice = NULL; - } - oldstate = GetSourceState(source, voice); - if(oldstate != AL_INITIAL && oldstate != AL_STOPPED) - { - source->state = AL_STOPPED; - SendStateChangeEvent(context, source->id, AL_STOPPED); - } - source->OffsetType = AL_NONE; - source->Offset = 0.0; - } - ALCdevice_Unlock(device); - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alSourceRewind(ALuint source) -{ - alSourceRewindv(1, &source); -} -AL_API ALvoid AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources) -{ - ALCcontext *context; - ALCdevice *device; - ALsource *source; - ALvoice *voice; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - LockSourceList(context); - if(!(n >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Rewinding %d sources", n); - for(i = 0;i < n;i++) - { - if(!LookupSource(context, sources[i])) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); - } - - device = context->Device; - ALCdevice_Lock(device); - for(i = 0;i < n;i++) - { - source = LookupSource(context, sources[i]); - if((voice=GetSourceVoice(source, context)) != NULL) - { - ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - voice = NULL; - } - if(GetSourceState(source, voice) != AL_INITIAL) - { - source->state = AL_INITIAL; - SendStateChangeEvent(context, source->id, AL_INITIAL); - } - source->OffsetType = AL_NONE; - source->Offset = 0.0; - } - ALCdevice_Unlock(device); - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint src, ALsizei nb, const ALuint *buffers) -{ - ALCdevice *device; - ALCcontext *context; - ALsource *source; - ALsizei i; - ALbufferlistitem *BufferListStart; - ALbufferlistitem *BufferList; - ALbuffer *BufferFmt = NULL; - - if(nb == 0) - return; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - - LockSourceList(context); - if(!(nb >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Queueing %d buffers", nb); - if((source=LookupSource(context, src)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", src); - - if(source->SourceType == AL_STATIC) - { - /* Can't queue on a Static Source */ - SETERR_GOTO(context, AL_INVALID_OPERATION, done, "Queueing onto static source %u", src); - } - - /* Check for a valid Buffer, for its frequency and format */ - BufferList = source->queue; - while(BufferList) - { - for(i = 0;i < BufferList->num_buffers;i++) - { - if((BufferFmt=BufferList->buffers[i]) != NULL) - break; - } - if(BufferFmt) break; - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } - - LockBufferList(device); - BufferListStart = NULL; - BufferList = NULL; - for(i = 0;i < nb;i++) - { - ALbuffer *buffer = NULL; - if(buffers[i] && (buffer=LookupBuffer(device, buffers[i])) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, buffer_error, "Queueing invalid buffer ID %u", - buffers[i]); - - if(!BufferListStart) - { - BufferListStart = al_calloc(DEF_ALIGN, - FAM_SIZE(ALbufferlistitem, buffers, 1)); - BufferList = BufferListStart; - } - else - { - ALbufferlistitem *item = al_calloc(DEF_ALIGN, - FAM_SIZE(ALbufferlistitem, buffers, 1)); - ATOMIC_STORE(&BufferList->next, item, almemory_order_relaxed); - BufferList = item; - } - ATOMIC_INIT(&BufferList->next, NULL); - BufferList->max_samples = buffer ? buffer->SampleLen : 0; - BufferList->num_buffers = 1; - BufferList->buffers[0] = buffer; - if(!buffer) continue; - - IncrementRef(&buffer->ref); - - if(buffer->MappedAccess != 0 && !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) - SETERR_GOTO(context, AL_INVALID_OPERATION, buffer_error, - "Queueing non-persistently mapped buffer %u", buffer->id); - - if(BufferFmt == NULL) - BufferFmt = buffer; - else if(BufferFmt->Frequency != buffer->Frequency || - BufferFmt->FmtChannels != buffer->FmtChannels || - BufferFmt->OriginalType != buffer->OriginalType) - { - alSetError(context, AL_INVALID_OPERATION, "Queueing buffer with mismatched format"); - - buffer_error: - /* A buffer failed (invalid ID or format), so unlock and release - * each buffer we had. */ - while(BufferListStart) - { - ALbufferlistitem *next = ATOMIC_LOAD(&BufferListStart->next, - almemory_order_relaxed); - for(i = 0;i < BufferListStart->num_buffers;i++) - { - if((buffer=BufferListStart->buffers[i]) != NULL) - DecrementRef(&buffer->ref); - } - al_free(BufferListStart); - BufferListStart = next; - } - UnlockBufferList(device); - goto done; - } - } - /* All buffers good. */ - UnlockBufferList(device); - - /* Source is now streaming */ - source->SourceType = AL_STREAMING; - - if(!(BufferList=source->queue)) - source->queue = BufferListStart; - else - { - ALbufferlistitem *next; - while((next=ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed)) != NULL) - BufferList = next; - ATOMIC_STORE(&BufferList->next, BufferListStart, almemory_order_release); - } - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alSourceQueueBufferLayersSOFT(ALuint src, ALsizei nb, const ALuint *buffers) -{ - ALCdevice *device; - ALCcontext *context; - ALbufferlistitem *BufferListStart; - ALbufferlistitem *BufferList; - ALbuffer *BufferFmt = NULL; - ALsource *source; - ALsizei i; - - if(nb == 0) - return; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - - LockSourceList(context); - if(!(nb >= 0 && nb < 16)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Queueing %d buffer layers", nb); - if((source=LookupSource(context, src)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", src); - - if(source->SourceType == AL_STATIC) - { - /* Can't queue on a Static Source */ - SETERR_GOTO(context, AL_INVALID_OPERATION, done, "Queueing onto static source %u", src); - } - - /* Check for a valid Buffer, for its frequency and format */ - BufferList = source->queue; - while(BufferList) - { - for(i = 0;i < BufferList->num_buffers;i++) - { - if((BufferFmt=BufferList->buffers[i]) != NULL) - break; - } - if(BufferFmt) break; - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } - - LockBufferList(device); - BufferListStart = al_calloc(DEF_ALIGN, FAM_SIZE(ALbufferlistitem, buffers, nb)); - BufferList = BufferListStart; - ATOMIC_INIT(&BufferList->next, NULL); - BufferList->max_samples = 0; - BufferList->num_buffers = 0; - for(i = 0;i < nb;i++) - { - ALbuffer *buffer = NULL; - if(buffers[i] && (buffer=LookupBuffer(device, buffers[i])) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, buffer_error, "Queueing invalid buffer ID %u", - buffers[i]); - - BufferList->buffers[BufferList->num_buffers++] = buffer; - if(!buffer) continue; - - IncrementRef(&buffer->ref); - - BufferList->max_samples = maxi(BufferList->max_samples, buffer->SampleLen); - - if(buffer->MappedAccess != 0 && !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) - SETERR_GOTO(context, AL_INVALID_OPERATION, buffer_error, - "Queueing non-persistently mapped buffer %u", buffer->id); - - if(BufferFmt == NULL) - BufferFmt = buffer; - else if(BufferFmt->Frequency != buffer->Frequency || - BufferFmt->FmtChannels != buffer->FmtChannels || - BufferFmt->OriginalType != buffer->OriginalType) - { - alSetError(context, AL_INVALID_OPERATION, "Queueing buffer with mismatched format"); - - buffer_error: - /* A buffer failed (invalid ID or format), so unlock and release - * each buffer we had. */ - while(BufferListStart) - { - ALbufferlistitem *next = ATOMIC_LOAD(&BufferListStart->next, - almemory_order_relaxed); - for(i = 0;i < BufferListStart->num_buffers;i++) - { - if((buffer=BufferListStart->buffers[i]) != NULL) - DecrementRef(&buffer->ref); - } - al_free(BufferListStart); - BufferListStart = next; - } - UnlockBufferList(device); - goto done; - } - } - /* All buffers good. */ - UnlockBufferList(device); - - /* Source is now streaming */ - source->SourceType = AL_STREAMING; - - if(!(BufferList=source->queue)) - source->queue = BufferListStart; - else - { - ALbufferlistitem *next; - while((next=ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed)) != NULL) - BufferList = next; - ATOMIC_STORE(&BufferList->next, BufferListStart, almemory_order_release); - } - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alSourceUnqueueBuffers(ALuint src, ALsizei nb, ALuint *buffers) -{ - ALCcontext *context; - ALsource *source; - ALbufferlistitem *BufferList; - ALbufferlistitem *Current; - ALvoice *voice; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - LockSourceList(context); - if(!(nb >= 0)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing %d buffers", nb); - if((source=LookupSource(context, src)) == NULL) - SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", src); - - /* Nothing to unqueue. */ - if(nb == 0) goto done; - - if(source->Looping) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing from looping source %u", src); - if(source->SourceType != AL_STREAMING) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing from a non-streaming source %u", - src); - - /* Make sure enough buffers have been processed to unqueue. */ - BufferList = source->queue; - Current = NULL; - if((voice=GetSourceVoice(source, context)) != NULL) - Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - else if(source->state == AL_INITIAL) - Current = BufferList; - if(BufferList == Current) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing pending buffers"); - - i = BufferList->num_buffers; - while(i < nb) - { - /* If the next bufferlist to check is NULL or is the current one, it's - * trying to unqueue pending buffers. - */ - ALbufferlistitem *next = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - if(!next || next == Current) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing pending buffers"); - BufferList = next; - - i += BufferList->num_buffers; - } - - while(nb > 0) - { - ALbufferlistitem *head = source->queue; - ALbufferlistitem *next = ATOMIC_LOAD(&head->next, almemory_order_relaxed); - for(i = 0;i < head->num_buffers && nb > 0;i++,nb--) - { - ALbuffer *buffer = head->buffers[i]; - if(!buffer) - *(buffers++) = 0; - else - { - *(buffers++) = buffer->id; - DecrementRef(&buffer->ref); - } - } - if(i < head->num_buffers) - { - /* This head has some buffers left over, so move them to the front - * and update the sample and buffer count. - */ - ALsizei max_length = 0; - ALsizei j = 0; - while(i < head->num_buffers) - { - ALbuffer *buffer = head->buffers[i++]; - if(buffer) max_length = maxi(max_length, buffer->SampleLen); - head->buffers[j++] = buffer; - } - head->max_samples = max_length; - head->num_buffers = j; - break; - } - - /* Otherwise, free this item and set the source queue head to the next - * one. - */ - al_free(head); - source->queue = next; - } - -done: - UnlockSourceList(context); - ALCcontext_DecRef(context); -} - - -static void InitSourceParams(ALsource *Source, ALsizei num_sends) -{ - ALsizei i; - - Source->InnerAngle = 360.0f; - Source->OuterAngle = 360.0f; - Source->Pitch = 1.0f; - Source->Position[0] = 0.0f; - Source->Position[1] = 0.0f; - Source->Position[2] = 0.0f; - Source->Velocity[0] = 0.0f; - Source->Velocity[1] = 0.0f; - Source->Velocity[2] = 0.0f; - Source->Direction[0] = 0.0f; - Source->Direction[1] = 0.0f; - Source->Direction[2] = 0.0f; - Source->Orientation[0][0] = 0.0f; - Source->Orientation[0][1] = 0.0f; - Source->Orientation[0][2] = -1.0f; - Source->Orientation[1][0] = 0.0f; - Source->Orientation[1][1] = 1.0f; - Source->Orientation[1][2] = 0.0f; - Source->RefDistance = 1.0f; - Source->MaxDistance = FLT_MAX; - Source->RolloffFactor = 1.0f; - Source->Gain = 1.0f; - Source->MinGain = 0.0f; - Source->MaxGain = 1.0f; - Source->OuterGain = 0.0f; - Source->OuterGainHF = 1.0f; - - Source->DryGainHFAuto = AL_TRUE; - Source->WetGainAuto = AL_TRUE; - Source->WetGainHFAuto = AL_TRUE; - Source->AirAbsorptionFactor = 0.0f; - Source->RoomRolloffFactor = 0.0f; - Source->DopplerFactor = 1.0f; - Source->HeadRelative = AL_FALSE; - Source->Looping = AL_FALSE; - Source->DistanceModel = DefaultDistanceModel; - Source->Resampler = ResamplerDefault; - Source->DirectChannels = AL_FALSE; - Source->Spatialize = SpatializeAuto; - - Source->StereoPan[0] = DEG2RAD( 30.0f); - Source->StereoPan[1] = DEG2RAD(-30.0f); - - Source->Radius = 0.0f; - - Source->Direct.Gain = 1.0f; - Source->Direct.GainHF = 1.0f; - Source->Direct.HFReference = LOWPASSFREQREF; - Source->Direct.GainLF = 1.0f; - Source->Direct.LFReference = HIGHPASSFREQREF; - Source->Send = al_calloc(16, num_sends*sizeof(Source->Send[0])); - for(i = 0;i < num_sends;i++) - { - Source->Send[i].Slot = NULL; - Source->Send[i].Gain = 1.0f; - Source->Send[i].GainHF = 1.0f; - Source->Send[i].HFReference = LOWPASSFREQREF; - Source->Send[i].GainLF = 1.0f; - Source->Send[i].LFReference = HIGHPASSFREQREF; - } - - Source->Offset = 0.0; - Source->OffsetType = AL_NONE; - Source->SourceType = AL_UNDETERMINED; - Source->state = AL_INITIAL; - - Source->queue = NULL; - - /* No way to do an 'init' here, so just test+set with relaxed ordering and - * ignore the test. - */ - ATOMIC_FLAG_TEST_AND_SET(&Source->PropsClean, almemory_order_relaxed); - - Source->VoiceIdx = -1; -} - -static void DeinitSource(ALsource *source, ALsizei num_sends) -{ - ALbufferlistitem *BufferList; - ALsizei i; - - BufferList = source->queue; - while(BufferList != NULL) - { - ALbufferlistitem *next = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - for(i = 0;i < BufferList->num_buffers;i++) - { - if(BufferList->buffers[i] != NULL) - DecrementRef(&BufferList->buffers[i]->ref); - } - al_free(BufferList); - BufferList = next; - } - source->queue = NULL; - - if(source->Send) - { - for(i = 0;i < num_sends;i++) - { - if(source->Send[i].Slot) - DecrementRef(&source->Send[i].Slot->ref); - source->Send[i].Slot = NULL; - } - al_free(source->Send); - source->Send = NULL; - } -} - -static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_sends, ALCcontext *context) -{ - struct ALvoiceProps *props; - ALsizei i; - - /* Get an unused property container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&context->FreeVoiceProps, almemory_order_acquire); - if(!props) - props = al_calloc(16, FAM_SIZE(struct ALvoiceProps, Send, num_sends)); - else - { - struct ALvoiceProps *next; - do { - next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeVoiceProps, &props, next, - almemory_order_acq_rel, almemory_order_acquire) == 0); - } - - /* Copy in current property values. */ - props->Pitch = source->Pitch; - props->Gain = source->Gain; - props->OuterGain = source->OuterGain; - props->MinGain = source->MinGain; - props->MaxGain = source->MaxGain; - props->InnerAngle = source->InnerAngle; - props->OuterAngle = source->OuterAngle; - props->RefDistance = source->RefDistance; - props->MaxDistance = source->MaxDistance; - props->RolloffFactor = source->RolloffFactor; - for(i = 0;i < 3;i++) - props->Position[i] = source->Position[i]; - for(i = 0;i < 3;i++) - props->Velocity[i] = source->Velocity[i]; - for(i = 0;i < 3;i++) - props->Direction[i] = source->Direction[i]; - for(i = 0;i < 2;i++) - { - ALsizei j; - for(j = 0;j < 3;j++) - props->Orientation[i][j] = source->Orientation[i][j]; - } - props->HeadRelative = source->HeadRelative; - props->DistanceModel = source->DistanceModel; - props->Resampler = source->Resampler; - props->DirectChannels = source->DirectChannels; - props->SpatializeMode = source->Spatialize; - - props->DryGainHFAuto = source->DryGainHFAuto; - props->WetGainAuto = source->WetGainAuto; - props->WetGainHFAuto = source->WetGainHFAuto; - props->OuterGainHF = source->OuterGainHF; - - props->AirAbsorptionFactor = source->AirAbsorptionFactor; - props->RoomRolloffFactor = source->RoomRolloffFactor; - props->DopplerFactor = source->DopplerFactor; - - props->StereoPan[0] = source->StereoPan[0]; - props->StereoPan[1] = source->StereoPan[1]; - - props->Radius = source->Radius; - - props->Direct.Gain = source->Direct.Gain; - props->Direct.GainHF = source->Direct.GainHF; - props->Direct.HFReference = source->Direct.HFReference; - props->Direct.GainLF = source->Direct.GainLF; - props->Direct.LFReference = source->Direct.LFReference; - - for(i = 0;i < num_sends;i++) - { - props->Send[i].Slot = source->Send[i].Slot; - props->Send[i].Gain = source->Send[i].Gain; - props->Send[i].GainHF = source->Send[i].GainHF; - props->Send[i].HFReference = source->Send[i].HFReference; - props->Send[i].GainLF = source->Send[i].GainLF; - props->Send[i].LFReference = source->Send[i].LFReference; - } - - /* Set the new container for updating internal parameters. */ - props = ATOMIC_EXCHANGE_PTR(&voice->Update, props, almemory_order_acq_rel); - if(props) - { - /* If there was an unused update container, put it back in the - * freelist. - */ - ATOMIC_REPLACE_HEAD(struct ALvoiceProps*, &context->FreeVoiceProps, props); - } -} - -void UpdateAllSourceProps(ALCcontext *context) -{ - ALsizei num_sends = context->Device->NumAuxSends; - ALsizei pos; - - for(pos = 0;pos < context->VoiceCount;pos++) - { - ALvoice *voice = context->Voices[pos]; - ALsource *source = ATOMIC_LOAD(&voice->Source, almemory_order_acquire); - if(source && !ATOMIC_FLAG_TEST_AND_SET(&source->PropsClean, almemory_order_acq_rel)) - UpdateSourceProps(source, voice, num_sends, context); - } -} - - -/* GetSourceSampleOffset - * - * Gets the current read offset for the given Source, in 32.32 fixed-point - * samples. The offset is relative to the start of the queue (not the start of - * the current buffer). - */ -static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime) -{ - ALCdevice *device = context->Device; - const ALbufferlistitem *Current; - ALuint64 readPos; - ALuint refcount; - ALvoice *voice; - - do { - Current = NULL; - readPos = 0; - while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1)) - althrd_yield(); - *clocktime = GetDeviceClockTime(device); - - voice = GetSourceVoice(Source, context); - if(voice) - { - Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - - readPos = (ALuint64)ATOMIC_LOAD(&voice->position, almemory_order_relaxed) << 32; - readPos |= (ALuint64)ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed) << - (32-FRACTIONBITS); - } - ATOMIC_THREAD_FENCE(almemory_order_acquire); - } while(refcount != ATOMIC_LOAD(&device->MixCount, almemory_order_relaxed)); - - if(voice) - { - const ALbufferlistitem *BufferList = Source->queue; - while(BufferList && BufferList != Current) - { - readPos += (ALuint64)BufferList->max_samples << 32; - BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, - almemory_order_relaxed); - } - readPos = minu64(readPos, U64(0x7fffffffffffffff)); - } - - return (ALint64)readPos; -} - -/* GetSourceSecOffset - * - * Gets the current read offset for the given Source, in seconds. The offset is - * relative to the start of the queue (not the start of the current buffer). - */ -static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime) -{ - ALCdevice *device = context->Device; - const ALbufferlistitem *Current; - ALuint64 readPos; - ALuint refcount; - ALdouble offset; - ALvoice *voice; - - do { - Current = NULL; - readPos = 0; - while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1)) - althrd_yield(); - *clocktime = GetDeviceClockTime(device); - - voice = GetSourceVoice(Source, context); - if(voice) - { - Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - - readPos = (ALuint64)ATOMIC_LOAD(&voice->position, almemory_order_relaxed) << - FRACTIONBITS; - readPos |= ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed); - } - ATOMIC_THREAD_FENCE(almemory_order_acquire); - } while(refcount != ATOMIC_LOAD(&device->MixCount, almemory_order_relaxed)); - - offset = 0.0; - if(voice) - { - const ALbufferlistitem *BufferList = Source->queue; - const ALbuffer *BufferFmt = NULL; - while(BufferList && BufferList != Current) - { - ALsizei i = 0; - while(!BufferFmt && i < BufferList->num_buffers) - BufferFmt = BufferList->buffers[i++]; - readPos += (ALuint64)BufferList->max_samples << FRACTIONBITS; - BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, - almemory_order_relaxed); - } - - while(BufferList && !BufferFmt) - { - ALsizei i = 0; - while(!BufferFmt && i < BufferList->num_buffers) - BufferFmt = BufferList->buffers[i++]; - BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, - almemory_order_relaxed); - } - assert(BufferFmt != NULL); - - offset = (ALdouble)readPos / (ALdouble)FRACTIONONE / - (ALdouble)BufferFmt->Frequency; - } - - return offset; -} - -/* GetSourceOffset - * - * Gets the current read offset for the given Source, in the appropriate format - * (Bytes, Samples or Seconds). The offset is relative to the start of the - * queue (not the start of the current buffer). - */ -static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context) -{ - ALCdevice *device = context->Device; - const ALbufferlistitem *Current; - ALuint readPos; - ALsizei readPosFrac; - ALuint refcount; - ALdouble offset; - ALvoice *voice; - - do { - Current = NULL; - readPos = readPosFrac = 0; - while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1)) - althrd_yield(); - voice = GetSourceVoice(Source, context); - if(voice) - { - Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); - - readPos = ATOMIC_LOAD(&voice->position, almemory_order_relaxed); - readPosFrac = ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed); - } - ATOMIC_THREAD_FENCE(almemory_order_acquire); - } while(refcount != ATOMIC_LOAD(&device->MixCount, almemory_order_relaxed)); - - offset = 0.0; - if(voice) - { - const ALbufferlistitem *BufferList = Source->queue; - const ALbuffer *BufferFmt = NULL; - ALboolean readFin = AL_FALSE; - ALuint totalBufferLen = 0; - - while(BufferList != NULL) - { - ALsizei i = 0; - while(!BufferFmt && i < BufferList->num_buffers) - BufferFmt = BufferList->buffers[i++]; - - readFin |= (BufferList == Current); - totalBufferLen += BufferList->max_samples; - if(!readFin) readPos += BufferList->max_samples; - - BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, - almemory_order_relaxed); - } - assert(BufferFmt != NULL); - - if(Source->Looping) - readPos %= totalBufferLen; - else - { - /* Wrap back to 0 */ - if(readPos >= totalBufferLen) - readPos = readPosFrac = 0; - } - - offset = 0.0; - switch(name) - { - case AL_SEC_OFFSET: - offset = (readPos + (ALdouble)readPosFrac/FRACTIONONE) / BufferFmt->Frequency; - break; - - case AL_SAMPLE_OFFSET: - offset = readPos + (ALdouble)readPosFrac/FRACTIONONE; - break; - - case AL_BYTE_OFFSET: - if(BufferFmt->OriginalType == UserFmtIMA4) - { - ALsizei align = (BufferFmt->OriginalAlign-1)/2 + 4; - ALuint BlockSize = align * ChannelsFromFmt(BufferFmt->FmtChannels); - ALuint FrameBlockSize = BufferFmt->OriginalAlign; - - /* Round down to nearest ADPCM block */ - offset = (ALdouble)(readPos / FrameBlockSize * BlockSize); - } - else if(BufferFmt->OriginalType == UserFmtMSADPCM) - { - ALsizei align = (BufferFmt->OriginalAlign-2)/2 + 7; - ALuint BlockSize = align * ChannelsFromFmt(BufferFmt->FmtChannels); - ALuint FrameBlockSize = BufferFmt->OriginalAlign; - - /* Round down to nearest ADPCM block */ - offset = (ALdouble)(readPos / FrameBlockSize * BlockSize); - } - else - { - ALuint FrameSize = FrameSizeFromFmt(BufferFmt->FmtChannels, - BufferFmt->FmtType); - offset = (ALdouble)(readPos * FrameSize); - } - break; - } - } - - return offset; -} - - -/* ApplyOffset - * - * Apply the stored playback offset to the Source. This function will update - * the number of buffers "played" given the stored offset. - */ -static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice) -{ - ALbufferlistitem *BufferList; - ALuint totalBufferLen; - ALuint offset = 0; - ALsizei frac = 0; - - /* Get sample frame offset */ - if(!GetSampleOffset(Source, &offset, &frac)) - return AL_FALSE; - - totalBufferLen = 0; - BufferList = Source->queue; - while(BufferList && totalBufferLen <= offset) - { - if((ALuint)BufferList->max_samples > offset-totalBufferLen) - { - /* Offset is in this buffer */ - ATOMIC_STORE(&voice->position, offset - totalBufferLen, almemory_order_relaxed); - ATOMIC_STORE(&voice->position_fraction, frac, almemory_order_relaxed); - ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_release); - return AL_TRUE; - } - totalBufferLen += BufferList->max_samples; - - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } - - /* Offset is out of range of the queue */ - return AL_FALSE; -} - - -/* GetSampleOffset - * - * Retrieves the sample offset into the Source's queue (from the Sample, Byte - * or Second offset supplied by the application). This takes into account the - * fact that the buffer format may have been modifed since. - */ -static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac) -{ - const ALbuffer *BufferFmt = NULL; - const ALbufferlistitem *BufferList; - ALdouble dbloff, dblfrac; - - /* Find the first valid Buffer in the Queue */ - BufferList = Source->queue; - while(BufferList) - { - ALsizei i; - for(i = 0;i < BufferList->num_buffers && !BufferFmt;i++) - BufferFmt = BufferList->buffers[i]; - if(BufferFmt) break; - BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, - almemory_order_relaxed); - } - if(!BufferFmt) - { - Source->OffsetType = AL_NONE; - Source->Offset = 0.0; - return AL_FALSE; - } - - switch(Source->OffsetType) - { - case AL_BYTE_OFFSET: - /* Determine the ByteOffset (and ensure it is block aligned) */ - *offset = (ALuint)Source->Offset; - if(BufferFmt->OriginalType == UserFmtIMA4) - { - ALsizei align = (BufferFmt->OriginalAlign-1)/2 + 4; - *offset /= align * ChannelsFromFmt(BufferFmt->FmtChannels); - *offset *= BufferFmt->OriginalAlign; - } - else if(BufferFmt->OriginalType == UserFmtMSADPCM) - { - ALsizei align = (BufferFmt->OriginalAlign-2)/2 + 7; - *offset /= align * ChannelsFromFmt(BufferFmt->FmtChannels); - *offset *= BufferFmt->OriginalAlign; - } - else - *offset /= FrameSizeFromFmt(BufferFmt->FmtChannels, BufferFmt->FmtType); - *frac = 0; - break; - - case AL_SAMPLE_OFFSET: - dblfrac = modf(Source->Offset, &dbloff); - *offset = (ALuint)mind(dbloff, UINT_MAX); - *frac = (ALsizei)mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0); - break; - - case AL_SEC_OFFSET: - dblfrac = modf(Source->Offset*BufferFmt->Frequency, &dbloff); - *offset = (ALuint)mind(dbloff, UINT_MAX); - *frac = (ALsizei)mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0); - break; - } - Source->OffsetType = AL_NONE; - Source->Offset = 0.0; - - return AL_TRUE; -} - - -static ALsource *AllocSource(ALCcontext *context) -{ - ALCdevice *device = context->Device; - SourceSubList *sublist, *subend; - ALsource *source = NULL; - ALsizei lidx = 0; - ALsizei slidx; - - almtx_lock(&context->SourceLock); - if(context->NumSources >= device->SourcesMax) - { - almtx_unlock(&context->SourceLock); - alSetError(context, AL_OUT_OF_MEMORY, "Exceeding %u source limit", device->SourcesMax); - return NULL; - } - sublist = VECTOR_BEGIN(context->SourceList); - subend = VECTOR_END(context->SourceList); - for(;sublist != subend;++sublist) - { - if(sublist->FreeMask) - { - slidx = CTZ64(sublist->FreeMask); - source = sublist->Sources + slidx; - break; - } - ++lidx; - } - if(UNLIKELY(!source)) - { - const SourceSubList empty_sublist = { 0, NULL }; - /* Don't allocate so many list entries that the 32-bit ID could - * overflow... - */ - if(UNLIKELY(VECTOR_SIZE(context->SourceList) >= 1<<25)) - { - almtx_unlock(&device->BufferLock); - alSetError(context, AL_OUT_OF_MEMORY, "Too many sources allocated"); - return NULL; - } - lidx = (ALsizei)VECTOR_SIZE(context->SourceList); - VECTOR_PUSH_BACK(context->SourceList, empty_sublist); - sublist = &VECTOR_BACK(context->SourceList); - sublist->FreeMask = ~U64(0); - sublist->Sources = al_calloc(16, sizeof(ALsource)*64); - if(UNLIKELY(!sublist->Sources)) - { - VECTOR_POP_BACK(context->SourceList); - almtx_unlock(&context->SourceLock); - alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate source batch"); - return NULL; - } - - slidx = 0; - source = sublist->Sources + slidx; - } - - memset(source, 0, sizeof(*source)); - InitSourceParams(source, device->NumAuxSends); - - /* Add 1 to avoid source ID 0. */ - source->id = ((lidx<<6) | slidx) + 1; - - context->NumSources++; - sublist->FreeMask &= ~(U64(1)<SourceLock); - - return source; -} - -static void FreeSource(ALCcontext *context, ALsource *source) -{ - ALCdevice *device = context->Device; - ALuint id = source->id - 1; - ALsizei lidx = id >> 6; - ALsizei slidx = id & 0x3f; - ALvoice *voice; - - ALCdevice_Lock(device); - if((voice=GetSourceVoice(source, context)) != NULL) - { - ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - } - ALCdevice_Unlock(device); - - DeinitSource(source, device->NumAuxSends); - memset(source, 0, sizeof(*source)); - - VECTOR_ELEM(context->SourceList, lidx).FreeMask |= U64(1) << slidx; - context->NumSources--; -} - -/* ReleaseALSources - * - * Destroys all sources in the source map. - */ -ALvoid ReleaseALSources(ALCcontext *context) -{ - ALCdevice *device = context->Device; - SourceSubList *sublist = VECTOR_BEGIN(context->SourceList); - SourceSubList *subend = VECTOR_END(context->SourceList); - size_t leftover = 0; - for(;sublist != subend;++sublist) - { - ALuint64 usemask = ~sublist->FreeMask; - while(usemask) - { - ALsizei idx = CTZ64(usemask); - ALsource *source = sublist->Sources + idx; - - DeinitSource(source, device->NumAuxSends); - memset(source, 0, sizeof(*source)); - ++leftover; - - usemask &= ~(U64(1) << idx); - } - sublist->FreeMask = ~usemask; - } - if(leftover > 0) - WARN("(%p) Deleted "SZFMT" Source%s\n", device, leftover, (leftover==1)?"":"s"); -} diff --git a/OpenAL32/alState.c b/OpenAL32/alState.c deleted file mode 100644 index ce93e14..0000000 --- a/OpenAL32/alState.c +++ /dev/null @@ -1,900 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include "version.h" - -#include -#include "alMain.h" -#include "AL/alc.h" -#include "AL/al.h" -#include "AL/alext.h" -#include "alError.h" -#include "alListener.h" -#include "alSource.h" -#include "alAuxEffectSlot.h" - -#include "backends/base.h" - - -static const ALchar alVendor[] = "OpenAL Community"; -static const ALchar alVersion[] = "1.1 ALSOFT "ALSOFT_VERSION; -static const ALchar alRenderer[] = "OpenAL Soft"; - -// Error Messages -static const ALchar alNoError[] = "No Error"; -static const ALchar alErrInvalidName[] = "Invalid Name"; -static const ALchar alErrInvalidEnum[] = "Invalid Enum"; -static const ALchar alErrInvalidValue[] = "Invalid Value"; -static const ALchar alErrInvalidOp[] = "Invalid Operation"; -static const ALchar alErrOutOfMemory[] = "Out of Memory"; - -/* Resampler strings */ -static const ALchar alPointResampler[] = "Nearest"; -static const ALchar alLinearResampler[] = "Linear"; -static const ALchar alCubicResampler[] = "Cubic"; -static const ALchar alBSinc12Resampler[] = "11th order Sinc"; -static const ALchar alBSinc24Resampler[] = "23rd order Sinc"; - -/* WARNING: Non-standard export! Not part of any extension, or exposed in the - * alcFunctions list. - */ -AL_API const ALchar* AL_APIENTRY alsoft_get_version(void) -{ - const char *spoof = getenv("ALSOFT_SPOOF_VERSION"); - if(spoof && spoof[0] != '\0') return spoof; - return ALSOFT_VERSION; -} - -#define DO_UPDATEPROPS() do { \ - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ - UpdateContextProps(context); \ - else \ - ATOMIC_FLAG_CLEAR(&context->PropsClean, almemory_order_release); \ -} while(0) - - -AL_API ALvoid AL_APIENTRY alEnable(ALenum capability) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - switch(capability) - { - case AL_SOURCE_DISTANCE_MODEL: - context->SourceDistanceModel = AL_TRUE; - DO_UPDATEPROPS(); - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid enable property 0x%04x", capability); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDisable(ALenum capability) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - switch(capability) - { - case AL_SOURCE_DISTANCE_MODEL: - context->SourceDistanceModel = AL_FALSE; - DO_UPDATEPROPS(); - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid disable property 0x%04x", capability); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability) -{ - ALCcontext *context; - ALboolean value=AL_FALSE; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - almtx_lock(&context->PropLock); - switch(capability) - { - case AL_SOURCE_DISTANCE_MODEL: - value = context->SourceDistanceModel; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid is enabled property 0x%04x", capability); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum pname) -{ - ALCcontext *context; - ALboolean value=AL_FALSE; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - almtx_lock(&context->PropLock); - switch(pname) - { - case AL_DOPPLER_FACTOR: - if(context->DopplerFactor != 0.0f) - value = AL_TRUE; - break; - - case AL_DOPPLER_VELOCITY: - if(context->DopplerVelocity != 0.0f) - value = AL_TRUE; - break; - - case AL_DISTANCE_MODEL: - if(context->DistanceModel == AL_INVERSE_DISTANCE_CLAMPED) - value = AL_TRUE; - break; - - case AL_SPEED_OF_SOUND: - if(context->SpeedOfSound != 0.0f) - value = AL_TRUE; - break; - - case AL_DEFERRED_UPDATES_SOFT: - if(ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - value = AL_TRUE; - break; - - case AL_GAIN_LIMIT_SOFT: - if(GAIN_MIX_MAX/context->GainBoost != 0.0f) - value = AL_TRUE; - break; - - case AL_NUM_RESAMPLERS_SOFT: - /* Always non-0. */ - value = AL_TRUE; - break; - - case AL_DEFAULT_RESAMPLER_SOFT: - value = ResamplerDefault ? AL_TRUE : AL_FALSE; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid boolean property 0x%04x", pname); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname) -{ - ALCcontext *context; - ALdouble value = 0.0; - - context = GetContextRef(); - if(!context) return 0.0; - - almtx_lock(&context->PropLock); - switch(pname) - { - case AL_DOPPLER_FACTOR: - value = (ALdouble)context->DopplerFactor; - break; - - case AL_DOPPLER_VELOCITY: - value = (ALdouble)context->DopplerVelocity; - break; - - case AL_DISTANCE_MODEL: - value = (ALdouble)context->DistanceModel; - break; - - case AL_SPEED_OF_SOUND: - value = (ALdouble)context->SpeedOfSound; - break; - - case AL_DEFERRED_UPDATES_SOFT: - if(ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - value = (ALdouble)AL_TRUE; - break; - - case AL_GAIN_LIMIT_SOFT: - value = (ALdouble)GAIN_MIX_MAX/context->GainBoost; - break; - - case AL_NUM_RESAMPLERS_SOFT: - value = (ALdouble)(ResamplerMax + 1); - break; - - case AL_DEFAULT_RESAMPLER_SOFT: - value = (ALdouble)ResamplerDefault; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid double property 0x%04x", pname); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname) -{ - ALCcontext *context; - ALfloat value = 0.0f; - - context = GetContextRef(); - if(!context) return 0.0f; - - almtx_lock(&context->PropLock); - switch(pname) - { - case AL_DOPPLER_FACTOR: - value = context->DopplerFactor; - break; - - case AL_DOPPLER_VELOCITY: - value = context->DopplerVelocity; - break; - - case AL_DISTANCE_MODEL: - value = (ALfloat)context->DistanceModel; - break; - - case AL_SPEED_OF_SOUND: - value = context->SpeedOfSound; - break; - - case AL_DEFERRED_UPDATES_SOFT: - if(ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - value = (ALfloat)AL_TRUE; - break; - - case AL_GAIN_LIMIT_SOFT: - value = GAIN_MIX_MAX/context->GainBoost; - break; - - case AL_NUM_RESAMPLERS_SOFT: - value = (ALfloat)(ResamplerMax + 1); - break; - - case AL_DEFAULT_RESAMPLER_SOFT: - value = (ALfloat)ResamplerDefault; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid float property 0x%04x", pname); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALint AL_APIENTRY alGetInteger(ALenum pname) -{ - ALCcontext *context; - ALint value = 0; - - context = GetContextRef(); - if(!context) return 0; - - almtx_lock(&context->PropLock); - switch(pname) - { - case AL_DOPPLER_FACTOR: - value = (ALint)context->DopplerFactor; - break; - - case AL_DOPPLER_VELOCITY: - value = (ALint)context->DopplerVelocity; - break; - - case AL_DISTANCE_MODEL: - value = (ALint)context->DistanceModel; - break; - - case AL_SPEED_OF_SOUND: - value = (ALint)context->SpeedOfSound; - break; - - case AL_DEFERRED_UPDATES_SOFT: - if(ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - value = (ALint)AL_TRUE; - break; - - case AL_GAIN_LIMIT_SOFT: - value = (ALint)(GAIN_MIX_MAX/context->GainBoost); - break; - - case AL_NUM_RESAMPLERS_SOFT: - value = ResamplerMax + 1; - break; - - case AL_DEFAULT_RESAMPLER_SOFT: - value = ResamplerDefault; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid integer property 0x%04x", pname); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname) -{ - ALCcontext *context; - ALint64SOFT value = 0; - - context = GetContextRef(); - if(!context) return 0; - - almtx_lock(&context->PropLock); - switch(pname) - { - case AL_DOPPLER_FACTOR: - value = (ALint64SOFT)context->DopplerFactor; - break; - - case AL_DOPPLER_VELOCITY: - value = (ALint64SOFT)context->DopplerVelocity; - break; - - case AL_DISTANCE_MODEL: - value = (ALint64SOFT)context->DistanceModel; - break; - - case AL_SPEED_OF_SOUND: - value = (ALint64SOFT)context->SpeedOfSound; - break; - - case AL_DEFERRED_UPDATES_SOFT: - if(ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - value = (ALint64SOFT)AL_TRUE; - break; - - case AL_GAIN_LIMIT_SOFT: - value = (ALint64SOFT)(GAIN_MIX_MAX/context->GainBoost); - break; - - case AL_NUM_RESAMPLERS_SOFT: - value = (ALint64SOFT)(ResamplerMax + 1); - break; - - case AL_DEFAULT_RESAMPLER_SOFT: - value = (ALint64SOFT)ResamplerDefault; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid integer64 property 0x%04x", pname); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API void* AL_APIENTRY alGetPointerSOFT(ALenum pname) -{ - ALCcontext *context; - void *value = NULL; - - context = GetContextRef(); - if(!context) return NULL; - - almtx_lock(&context->PropLock); - switch(pname) - { - case AL_EVENT_CALLBACK_FUNCTION_SOFT: - value = context->EventCb; - break; - - case AL_EVENT_CALLBACK_USER_PARAM_SOFT: - value = context->EventParam; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid pointer property 0x%04x", pname); - } - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALvoid AL_APIENTRY alGetBooleanv(ALenum pname, ALboolean *values) -{ - ALCcontext *context; - - if(values) - { - switch(pname) - { - case AL_DOPPLER_FACTOR: - case AL_DOPPLER_VELOCITY: - case AL_DISTANCE_MODEL: - case AL_SPEED_OF_SOUND: - case AL_DEFERRED_UPDATES_SOFT: - case AL_GAIN_LIMIT_SOFT: - case AL_NUM_RESAMPLERS_SOFT: - case AL_DEFAULT_RESAMPLER_SOFT: - values[0] = alGetBoolean(pname); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - switch(pname) - { - default: - alSetError(context, AL_INVALID_VALUE, "Invalid boolean-vector property 0x%04x", pname); - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetDoublev(ALenum pname, ALdouble *values) -{ - ALCcontext *context; - - if(values) - { - switch(pname) - { - case AL_DOPPLER_FACTOR: - case AL_DOPPLER_VELOCITY: - case AL_DISTANCE_MODEL: - case AL_SPEED_OF_SOUND: - case AL_DEFERRED_UPDATES_SOFT: - case AL_GAIN_LIMIT_SOFT: - case AL_NUM_RESAMPLERS_SOFT: - case AL_DEFAULT_RESAMPLER_SOFT: - values[0] = alGetDouble(pname); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - switch(pname) - { - default: - alSetError(context, AL_INVALID_VALUE, "Invalid double-vector property 0x%04x", pname); - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetFloatv(ALenum pname, ALfloat *values) -{ - ALCcontext *context; - - if(values) - { - switch(pname) - { - case AL_DOPPLER_FACTOR: - case AL_DOPPLER_VELOCITY: - case AL_DISTANCE_MODEL: - case AL_SPEED_OF_SOUND: - case AL_DEFERRED_UPDATES_SOFT: - case AL_GAIN_LIMIT_SOFT: - case AL_NUM_RESAMPLERS_SOFT: - case AL_DEFAULT_RESAMPLER_SOFT: - values[0] = alGetFloat(pname); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - switch(pname) - { - default: - alSetError(context, AL_INVALID_VALUE, "Invalid float-vector property 0x%04x", pname); - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values) -{ - ALCcontext *context; - - if(values) - { - switch(pname) - { - case AL_DOPPLER_FACTOR: - case AL_DOPPLER_VELOCITY: - case AL_DISTANCE_MODEL: - case AL_SPEED_OF_SOUND: - case AL_DEFERRED_UPDATES_SOFT: - case AL_GAIN_LIMIT_SOFT: - case AL_NUM_RESAMPLERS_SOFT: - case AL_DEFAULT_RESAMPLER_SOFT: - values[0] = alGetInteger(pname); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - switch(pname) - { - default: - alSetError(context, AL_INVALID_VALUE, "Invalid integer-vector property 0x%04x", pname); - } - - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values) -{ - ALCcontext *context; - - if(values) - { - switch(pname) - { - case AL_DOPPLER_FACTOR: - case AL_DOPPLER_VELOCITY: - case AL_DISTANCE_MODEL: - case AL_SPEED_OF_SOUND: - case AL_DEFERRED_UPDATES_SOFT: - case AL_GAIN_LIMIT_SOFT: - case AL_NUM_RESAMPLERS_SOFT: - case AL_DEFAULT_RESAMPLER_SOFT: - values[0] = alGetInteger64SOFT(pname); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - switch(pname) - { - default: - alSetError(context, AL_INVALID_VALUE, "Invalid integer64-vector property 0x%04x", pname); - } - - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values) -{ - ALCcontext *context; - - if(values) - { - switch(pname) - { - case AL_EVENT_CALLBACK_FUNCTION_SOFT: - case AL_EVENT_CALLBACK_USER_PARAM_SOFT: - values[0] = alGetPointerSOFT(pname); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - if(!values) - alSetError(context, AL_INVALID_VALUE, "NULL pointer"); - switch(pname) - { - default: - alSetError(context, AL_INVALID_VALUE, "Invalid pointer-vector property 0x%04x", pname); - } - - ALCcontext_DecRef(context); -} - -AL_API const ALchar* AL_APIENTRY alGetString(ALenum pname) -{ - const ALchar *value = NULL; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return NULL; - - switch(pname) - { - case AL_VENDOR: - value = alVendor; - break; - - case AL_VERSION: - value = alVersion; - break; - - case AL_RENDERER: - value = alRenderer; - break; - - case AL_EXTENSIONS: - value = context->ExtensionList; - break; - - case AL_NO_ERROR: - value = alNoError; - break; - - case AL_INVALID_NAME: - value = alErrInvalidName; - break; - - case AL_INVALID_ENUM: - value = alErrInvalidEnum; - break; - - case AL_INVALID_VALUE: - value = alErrInvalidValue; - break; - - case AL_INVALID_OPERATION: - value = alErrInvalidOp; - break; - - case AL_OUT_OF_MEMORY: - value = alErrOutOfMemory; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid string property 0x%04x", pname); - } - - ALCcontext_DecRef(context); - return value; -} - -AL_API ALvoid AL_APIENTRY alDopplerFactor(ALfloat value) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - if(!(value >= 0.0f && isfinite(value))) - alSetError(context, AL_INVALID_VALUE, "Doppler factor %f out of range", value); - else - { - almtx_lock(&context->PropLock); - context->DopplerFactor = value; - DO_UPDATEPROPS(); - almtx_unlock(&context->PropLock); - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDopplerVelocity(ALfloat value) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - if((ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)&EventType_Deprecated)) - { - static const ALCchar msg[] = - "alDopplerVelocity is deprecated in AL1.1, use alSpeedOfSound"; - const ALsizei msglen = (ALsizei)strlen(msg); - ALbitfieldSOFT enabledevts; - almtx_lock(&context->EventCbLock); - enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); - if((enabledevts&EventType_Deprecated) && context->EventCb) - (*context->EventCb)(AL_EVENT_TYPE_DEPRECATED_SOFT, 0, 0, msglen, msg, - context->EventParam); - almtx_unlock(&context->EventCbLock); - } - - if(!(value >= 0.0f && isfinite(value))) - alSetError(context, AL_INVALID_VALUE, "Doppler velocity %f out of range", value); - else - { - almtx_lock(&context->PropLock); - context->DopplerVelocity = value; - DO_UPDATEPROPS(); - almtx_unlock(&context->PropLock); - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alSpeedOfSound(ALfloat value) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - if(!(value > 0.0f && isfinite(value))) - alSetError(context, AL_INVALID_VALUE, "Speed of sound %f out of range", value); - else - { - almtx_lock(&context->PropLock); - context->SpeedOfSound = value; - DO_UPDATEPROPS(); - almtx_unlock(&context->PropLock); - } - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDistanceModel(ALenum value) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - if(!(value == AL_INVERSE_DISTANCE || value == AL_INVERSE_DISTANCE_CLAMPED || - value == AL_LINEAR_DISTANCE || value == AL_LINEAR_DISTANCE_CLAMPED || - value == AL_EXPONENT_DISTANCE || value == AL_EXPONENT_DISTANCE_CLAMPED || - value == AL_NONE)) - alSetError(context, AL_INVALID_VALUE, "Distance model 0x%04x out of range", value); - else - { - almtx_lock(&context->PropLock); - context->DistanceModel = value; - if(!context->SourceDistanceModel) - DO_UPDATEPROPS(); - almtx_unlock(&context->PropLock); - } - - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - ALCcontext_DeferUpdates(context); - - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - ALCcontext_ProcessUpdates(context); - - ALCcontext_DecRef(context); -} - - -AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index) -{ - const char *ResamplerNames[] = { - alPointResampler, alLinearResampler, - alCubicResampler, alBSinc12Resampler, - alBSinc24Resampler, - }; - const ALchar *value = NULL; - ALCcontext *context; - - static_assert(COUNTOF(ResamplerNames) == ResamplerMax+1, "Incorrect ResamplerNames list"); - - context = GetContextRef(); - if(!context) return NULL; - - switch(pname) - { - case AL_RESAMPLER_NAME_SOFT: - if(index < 0 || (size_t)index >= COUNTOF(ResamplerNames)) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "Resampler name index %d out of range", - index); - value = ResamplerNames[index]; - break; - - default: - alSetError(context, AL_INVALID_VALUE, "Invalid string indexed property"); - } - -done: - ALCcontext_DecRef(context); - return value; -} - - -void UpdateContextProps(ALCcontext *context) -{ - struct ALcontextProps *props; - - /* Get an unused proprty container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&context->FreeContextProps, almemory_order_acquire); - if(!props) - props = al_calloc(16, sizeof(*props)); - else - { - struct ALcontextProps *next; - do { - next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeContextProps, &props, next, - almemory_order_seq_cst, almemory_order_acquire) == 0); - } - - /* Copy in current property values. */ - props->MetersPerUnit = context->MetersPerUnit; - - props->DopplerFactor = context->DopplerFactor; - props->DopplerVelocity = context->DopplerVelocity; - props->SpeedOfSound = context->SpeedOfSound; - - props->SourceDistanceModel = context->SourceDistanceModel; - props->DistanceModel = context->DistanceModel; - - /* Set the new container for updating internal parameters. */ - props = ATOMIC_EXCHANGE_PTR(&context->Update, props, almemory_order_acq_rel); - if(props) - { - /* If there was an unused update container, put it back in the - * freelist. - */ - ATOMIC_REPLACE_HEAD(struct ALcontextProps*, &context->FreeContextProps, props); - } -} diff --git a/OpenAL32/event.c b/OpenAL32/event.c deleted file mode 100644 index 1263648..0000000 --- a/OpenAL32/event.c +++ /dev/null @@ -1,140 +0,0 @@ - -#include "config.h" - -#include "AL/alc.h" -#include "AL/al.h" -#include "AL/alext.h" -#include "alMain.h" -#include "alError.h" -#include "ringbuffer.h" - - -static int EventThread(void *arg) -{ - ALCcontext *context = arg; - - /* Clear all pending posts on the semaphore. */ - while(alsem_trywait(&context->EventSem) == althrd_success) - { - } - - while(1) - { - ALbitfieldSOFT enabledevts; - AsyncEvent evt; - - if(ll_ringbuffer_read(context->AsyncEvents, (char*)&evt, 1) == 0) - { - alsem_wait(&context->EventSem); - continue; - } - if(!evt.EnumType) - break; - - almtx_lock(&context->EventCbLock); - enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); - if(context->EventCb && (enabledevts&evt.EnumType) == evt.EnumType) - context->EventCb(evt.Type, evt.ObjectId, evt.Param, (ALsizei)strlen(evt.Message), - evt.Message, context->EventParam); - almtx_unlock(&context->EventCbLock); - } - return 0; -} - -AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, ALboolean enable) -{ - ALCcontext *context; - ALbitfieldSOFT enabledevts; - ALbitfieldSOFT flags = 0; - bool isrunning; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - if(count < 0) SETERR_GOTO(context, AL_INVALID_VALUE, done, "Controlling %d events", count); - if(count == 0) goto done; - if(!types) SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer"); - - for(i = 0;i < count;i++) - { - if(types[i] == AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT) - flags |= EventType_BufferCompleted; - else if(types[i] == AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT) - flags |= EventType_SourceStateChange; - else if(types[i] == AL_EVENT_TYPE_ERROR_SOFT) - flags |= EventType_Error; - else if(types[i] == AL_EVENT_TYPE_PERFORMANCE_SOFT) - flags |= EventType_Performance; - else if(types[i] == AL_EVENT_TYPE_DEPRECATED_SOFT) - flags |= EventType_Deprecated; - else if(types[i] == AL_EVENT_TYPE_DISCONNECTED_SOFT) - flags |= EventType_Disconnected; - else - SETERR_GOTO(context, AL_INVALID_ENUM, done, "Invalid event type 0x%04x", types[i]); - } - - almtx_lock(&context->EventThrdLock); - if(enable) - { - if(!context->AsyncEvents) - context->AsyncEvents = ll_ringbuffer_create(63, sizeof(AsyncEvent), false); - enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); - isrunning = !!enabledevts; - while(ATOMIC_COMPARE_EXCHANGE_WEAK(&context->EnabledEvts, &enabledevts, enabledevts|flags, - almemory_order_acq_rel, almemory_order_acquire) == 0) - { - /* enabledevts is (re-)filled with the current value on failure, so - * just try again. - */ - } - if(!isrunning && flags) - althrd_create(&context->EventThread, EventThread, context); - } - else - { - enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); - isrunning = !!enabledevts; - while(ATOMIC_COMPARE_EXCHANGE_WEAK(&context->EnabledEvts, &enabledevts, enabledevts&~flags, - almemory_order_acq_rel, almemory_order_acquire) == 0) - { - } - if(isrunning && !(enabledevts&~flags)) - { - static const AsyncEvent kill_evt = { 0 }; - while(ll_ringbuffer_write(context->AsyncEvents, (const char*)&kill_evt, 1) == 0) - althrd_yield(); - alsem_post(&context->EventSem); - althrd_join(context->EventThread, NULL); - } - else - { - /* Wait to ensure the event handler sees the changed flags before - * returning. - */ - almtx_lock(&context->EventCbLock); - almtx_unlock(&context->EventCbLock); - } - } - almtx_unlock(&context->EventThrdLock); - -done: - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alEventCallbackSOFT(ALEVENTPROCSOFT callback, void *userParam) -{ - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - almtx_lock(&context->PropLock); - almtx_lock(&context->EventCbLock); - context->EventCb = callback; - context->EventParam = userParam; - almtx_unlock(&context->EventCbLock); - almtx_unlock(&context->PropLock); - - ALCcontext_DecRef(context); -} diff --git a/OpenAL32/include/alAuxEffectSlot.h b/OpenAL32/include/alAuxEffectSlot.h deleted file mode 100644 index c4d662f..0000000 --- a/OpenAL32/include/alAuxEffectSlot.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef _AL_AUXEFFECTSLOT_H_ -#define _AL_AUXEFFECTSLOT_H_ - -#include "alMain.h" -#include "alEffect.h" - -#include "atomic.h" -#include "align.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct ALeffectStateVtable; -struct ALeffectslot; - -typedef struct ALeffectState { - RefCount Ref; - const struct ALeffectStateVtable *vtbl; - - ALfloat (*OutBuffer)[BUFFERSIZE]; - ALsizei OutChannels; -} ALeffectState; - -void ALeffectState_Construct(ALeffectState *state); -void ALeffectState_Destruct(ALeffectState *state); - -struct ALeffectStateVtable { - void (*const Destruct)(ALeffectState *state); - - ALboolean (*const deviceUpdate)(ALeffectState *state, ALCdevice *device); - void (*const update)(ALeffectState *state, const ALCcontext *context, const struct ALeffectslot *slot, const union ALeffectProps *props); - void (*const process)(ALeffectState *state, ALsizei samplesToDo, const ALfloat (*restrict samplesIn)[BUFFERSIZE], ALfloat (*restrict samplesOut)[BUFFERSIZE], ALsizei numChannels); - - void (*const Delete)(void *ptr); -}; - -/* Small hack to use a pointer-to-array types as a normal argument type. - * Shouldn't be used directly. - */ -typedef ALfloat ALfloatBUFFERSIZE[BUFFERSIZE]; - -#define DEFINE_ALEFFECTSTATE_VTABLE(T) \ -DECLARE_THUNK(T, ALeffectState, void, Destruct) \ -DECLARE_THUNK1(T, ALeffectState, ALboolean, deviceUpdate, ALCdevice*) \ -DECLARE_THUNK3(T, ALeffectState, void, update, const ALCcontext*, const ALeffectslot*, const ALeffectProps*) \ -DECLARE_THUNK4(T, ALeffectState, void, process, ALsizei, const ALfloatBUFFERSIZE*restrict, ALfloatBUFFERSIZE*restrict, ALsizei) \ -static void T##_ALeffectState_Delete(void *ptr) \ -{ return T##_Delete(STATIC_UPCAST(T, ALeffectState, (ALeffectState*)ptr)); } \ - \ -static const struct ALeffectStateVtable T##_ALeffectState_vtable = { \ - T##_ALeffectState_Destruct, \ - \ - T##_ALeffectState_deviceUpdate, \ - T##_ALeffectState_update, \ - T##_ALeffectState_process, \ - \ - T##_ALeffectState_Delete, \ -} - - -struct EffectStateFactoryVtable; - -typedef struct EffectStateFactory { - const struct EffectStateFactoryVtable *vtab; -} EffectStateFactory; - -struct EffectStateFactoryVtable { - ALeffectState *(*const create)(EffectStateFactory *factory); -}; -#define EffectStateFactory_create(x) ((x)->vtab->create((x))) - -#define DEFINE_EFFECTSTATEFACTORY_VTABLE(T) \ -DECLARE_THUNK(T, EffectStateFactory, ALeffectState*, create) \ - \ -static const struct EffectStateFactoryVtable T##_EffectStateFactory_vtable = { \ - T##_EffectStateFactory_create, \ -} - - -#define MAX_EFFECT_CHANNELS (4) - - -struct ALeffectslotArray { - ALsizei count; - struct ALeffectslot *slot[]; -}; - - -struct ALeffectslotProps { - ALfloat Gain; - ALboolean AuxSendAuto; - - ALenum Type; - ALeffectProps Props; - - ALeffectState *State; - - ATOMIC(struct ALeffectslotProps*) next; -}; - - -typedef struct ALeffectslot { - ALfloat Gain; - ALboolean AuxSendAuto; - - struct { - ALenum Type; - ALeffectProps Props; - - ALeffectState *State; - } Effect; - - ATOMIC_FLAG PropsClean; - - RefCount ref; - - ATOMIC(struct ALeffectslotProps*) Update; - - struct { - ALfloat Gain; - ALboolean AuxSendAuto; - - ALenum EffectType; - ALeffectProps EffectProps; - ALeffectState *EffectState; - - ALfloat RoomRolloff; /* Added to the source's room rolloff, not multiplied. */ - ALfloat DecayTime; - ALfloat DecayLFRatio; - ALfloat DecayHFRatio; - ALboolean DecayHFLimit; - ALfloat AirAbsorptionGainHF; - } Params; - - /* Self ID */ - ALuint id; - - ALsizei NumChannels; - BFChannelConfig ChanMap[MAX_EFFECT_CHANNELS]; - /* Wet buffer configuration is ACN channel order with N3D scaling: - * * Channel 0 is the unattenuated mono signal. - * * Channel 1 is OpenAL -X * sqrt(3) - * * Channel 2 is OpenAL Y * sqrt(3) - * * Channel 3 is OpenAL -Z * sqrt(3) - * Consequently, effects that only want to work with mono input can use - * channel 0 by itself. Effects that want multichannel can process the - * ambisonics signal and make a B-Format pan (ComputeFirstOrderGains) for - * first-order device output (FOAOut). - */ - alignas(16) ALfloat WetBuffer[MAX_EFFECT_CHANNELS][BUFFERSIZE]; -} ALeffectslot; - -ALenum InitEffectSlot(ALeffectslot *slot); -void DeinitEffectSlot(ALeffectslot *slot); -void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context); -void UpdateAllEffectSlotProps(ALCcontext *context); -ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context); - - -EffectStateFactory *NullStateFactory_getFactory(void); -EffectStateFactory *ReverbStateFactory_getFactory(void); -EffectStateFactory *AutowahStateFactory_getFactory(void); -EffectStateFactory *ChorusStateFactory_getFactory(void); -EffectStateFactory *CompressorStateFactory_getFactory(void); -EffectStateFactory *DistortionStateFactory_getFactory(void); -EffectStateFactory *EchoStateFactory_getFactory(void); -EffectStateFactory *EqualizerStateFactory_getFactory(void); -EffectStateFactory *FlangerStateFactory_getFactory(void); -EffectStateFactory *FshifterStateFactory_getFactory(void); -EffectStateFactory *ModulatorStateFactory_getFactory(void); -EffectStateFactory *PshifterStateFactory_getFactory(void); - -EffectStateFactory *DedicatedStateFactory_getFactory(void); - - -ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect); - -void ALeffectState_DecRef(ALeffectState *state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alBuffer.h b/OpenAL32/include/alBuffer.h deleted file mode 100644 index fbe3e6e..0000000 --- a/OpenAL32/include/alBuffer.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef _AL_BUFFER_H_ -#define _AL_BUFFER_H_ - -#include "AL/alc.h" -#include "AL/al.h" -#include "AL/alext.h" - -#include "inprogext.h" -#include "atomic.h" -#include "rwlock.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* User formats */ -enum UserFmtType { - UserFmtUByte, - UserFmtShort, - UserFmtFloat, - UserFmtDouble, - UserFmtMulaw, - UserFmtAlaw, - UserFmtIMA4, - UserFmtMSADPCM, -}; -enum UserFmtChannels { - UserFmtMono, - UserFmtStereo, - UserFmtRear, - UserFmtQuad, - UserFmtX51, /* (WFX order) */ - UserFmtX61, /* (WFX order) */ - UserFmtX71, /* (WFX order) */ - UserFmtBFormat2D, /* WXY */ - UserFmtBFormat3D, /* WXYZ */ -}; - -ALsizei BytesFromUserFmt(enum UserFmtType type); -ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans); -inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type) -{ - return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type); -} - - -/* Storable formats */ -enum FmtType { - FmtUByte = UserFmtUByte, - FmtShort = UserFmtShort, - FmtFloat = UserFmtFloat, - FmtDouble = UserFmtDouble, - FmtMulaw = UserFmtMulaw, - FmtAlaw = UserFmtAlaw, -}; -enum FmtChannels { - FmtMono = UserFmtMono, - FmtStereo = UserFmtStereo, - FmtRear = UserFmtRear, - FmtQuad = UserFmtQuad, - FmtX51 = UserFmtX51, - FmtX61 = UserFmtX61, - FmtX71 = UserFmtX71, - FmtBFormat2D = UserFmtBFormat2D, - FmtBFormat3D = UserFmtBFormat3D, -}; -#define MAX_INPUT_CHANNELS (8) - -ALsizei BytesFromFmt(enum FmtType type); -ALsizei ChannelsFromFmt(enum FmtChannels chans); -inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type) -{ - return ChannelsFromFmt(chans) * BytesFromFmt(type); -} - - -typedef struct ALbuffer { - ALvoid *data; - - ALsizei Frequency; - ALbitfieldSOFT Access; - ALsizei SampleLen; - - enum FmtChannels FmtChannels; - enum FmtType FmtType; - ALsizei BytesAlloc; - - enum UserFmtType OriginalType; - ALsizei OriginalSize; - ALsizei OriginalAlign; - - ALsizei LoopStart; - ALsizei LoopEnd; - - ATOMIC(ALsizei) UnpackAlign; - ATOMIC(ALsizei) PackAlign; - - ALbitfieldSOFT MappedAccess; - ALsizei MappedOffset; - ALsizei MappedSize; - - /* Number of times buffer was attached to a source (deletion can only occur when 0) */ - RefCount ref; - - /* Self ID */ - ALuint id; -} ALbuffer; - -ALvoid ReleaseALBuffers(ALCdevice *device); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alEffect.h b/OpenAL32/include/alEffect.h deleted file mode 100644 index 7b849c0..0000000 --- a/OpenAL32/include/alEffect.h +++ /dev/null @@ -1,213 +0,0 @@ -#ifndef _AL_EFFECT_H_ -#define _AL_EFFECT_H_ - -#include "alMain.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct ALeffect; - -enum { - EAXREVERB_EFFECT = 0, - REVERB_EFFECT, - AUTOWAH_EFFECT, - CHORUS_EFFECT, - COMPRESSOR_EFFECT, - DISTORTION_EFFECT, - ECHO_EFFECT, - EQUALIZER_EFFECT, - FLANGER_EFFECT, - FSHIFTER_EFFECT, - MODULATOR_EFFECT, - PSHIFTER_EFFECT, - DEDICATED_EFFECT, - - MAX_EFFECTS -}; -extern ALboolean DisabledEffects[MAX_EFFECTS]; - -extern ALfloat ReverbBoost; - -struct EffectList { - const char name[16]; - int type; - ALenum val; -}; -#define EFFECTLIST_SIZE 14 -extern const struct EffectList EffectList[EFFECTLIST_SIZE]; - - -struct ALeffectVtable { - void (*const setParami)(struct ALeffect *effect, ALCcontext *context, ALenum param, ALint val); - void (*const setParamiv)(struct ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals); - void (*const setParamf)(struct ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val); - void (*const setParamfv)(struct ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals); - - void (*const getParami)(const struct ALeffect *effect, ALCcontext *context, ALenum param, ALint *val); - void (*const getParamiv)(const struct ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals); - void (*const getParamf)(const struct ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val); - void (*const getParamfv)(const struct ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals); -}; - -#define DEFINE_ALEFFECT_VTABLE(T) \ -const struct ALeffectVtable T##_vtable = { \ - T##_setParami, T##_setParamiv, \ - T##_setParamf, T##_setParamfv, \ - T##_getParami, T##_getParamiv, \ - T##_getParamf, T##_getParamfv, \ -} - -extern const struct ALeffectVtable ALeaxreverb_vtable; -extern const struct ALeffectVtable ALreverb_vtable; -extern const struct ALeffectVtable ALautowah_vtable; -extern const struct ALeffectVtable ALchorus_vtable; -extern const struct ALeffectVtable ALcompressor_vtable; -extern const struct ALeffectVtable ALdistortion_vtable; -extern const struct ALeffectVtable ALecho_vtable; -extern const struct ALeffectVtable ALequalizer_vtable; -extern const struct ALeffectVtable ALflanger_vtable; -extern const struct ALeffectVtable ALfshifter_vtable; -extern const struct ALeffectVtable ALmodulator_vtable; -extern const struct ALeffectVtable ALnull_vtable; -extern const struct ALeffectVtable ALpshifter_vtable; -extern const struct ALeffectVtable ALdedicated_vtable; - - -typedef union ALeffectProps { - struct { - // Shared Reverb Properties - ALfloat Density; - ALfloat Diffusion; - ALfloat Gain; - ALfloat GainHF; - ALfloat DecayTime; - ALfloat DecayHFRatio; - ALfloat ReflectionsGain; - ALfloat ReflectionsDelay; - ALfloat LateReverbGain; - ALfloat LateReverbDelay; - ALfloat AirAbsorptionGainHF; - ALfloat RoomRolloffFactor; - ALboolean DecayHFLimit; - - // Additional EAX Reverb Properties - ALfloat GainLF; - ALfloat DecayLFRatio; - ALfloat ReflectionsPan[3]; - ALfloat LateReverbPan[3]; - ALfloat EchoTime; - ALfloat EchoDepth; - ALfloat ModulationTime; - ALfloat ModulationDepth; - ALfloat HFReference; - ALfloat LFReference; - } Reverb; - - struct { - ALfloat AttackTime; - ALfloat ReleaseTime; - ALfloat Resonance; - ALfloat PeakGain; - } Autowah; - - struct { - ALint Waveform; - ALint Phase; - ALfloat Rate; - ALfloat Depth; - ALfloat Feedback; - ALfloat Delay; - } Chorus; /* Also Flanger */ - - struct { - ALboolean OnOff; - } Compressor; - - struct { - ALfloat Edge; - ALfloat Gain; - ALfloat LowpassCutoff; - ALfloat EQCenter; - ALfloat EQBandwidth; - } Distortion; - - struct { - ALfloat Delay; - ALfloat LRDelay; - - ALfloat Damping; - ALfloat Feedback; - - ALfloat Spread; - } Echo; - - struct { - ALfloat LowCutoff; - ALfloat LowGain; - ALfloat Mid1Center; - ALfloat Mid1Gain; - ALfloat Mid1Width; - ALfloat Mid2Center; - ALfloat Mid2Gain; - ALfloat Mid2Width; - ALfloat HighCutoff; - ALfloat HighGain; - } Equalizer; - - struct { - ALfloat Frequency; - ALint LeftDirection; - ALint RightDirection; - } Fshifter; - - struct { - ALfloat Frequency; - ALfloat HighPassCutoff; - ALint Waveform; - } Modulator; - - struct { - ALint CoarseTune; - ALint FineTune; - } Pshifter; - - struct { - ALfloat Gain; - } Dedicated; -} ALeffectProps; - -typedef struct ALeffect { - // Effect type (AL_EFFECT_NULL, ...) - ALenum type; - - ALeffectProps Props; - - const struct ALeffectVtable *vtab; - - /* Self ID */ - ALuint id; -} ALeffect; -#define ALeffect_setParami(o, c, p, v) ((o)->vtab->setParami(o, c, p, v)) -#define ALeffect_setParamf(o, c, p, v) ((o)->vtab->setParamf(o, c, p, v)) -#define ALeffect_setParamiv(o, c, p, v) ((o)->vtab->setParamiv(o, c, p, v)) -#define ALeffect_setParamfv(o, c, p, v) ((o)->vtab->setParamfv(o, c, p, v)) -#define ALeffect_getParami(o, c, p, v) ((o)->vtab->getParami(o, c, p, v)) -#define ALeffect_getParamf(o, c, p, v) ((o)->vtab->getParamf(o, c, p, v)) -#define ALeffect_getParamiv(o, c, p, v) ((o)->vtab->getParamiv(o, c, p, v)) -#define ALeffect_getParamfv(o, c, p, v) ((o)->vtab->getParamfv(o, c, p, v)) - -inline ALboolean IsReverbEffect(ALenum type) -{ return type == AL_EFFECT_REVERB || type == AL_EFFECT_EAXREVERB; } - -void InitEffect(ALeffect *effect); -void ReleaseALEffects(ALCdevice *device); - -void LoadReverbPreset(const char *name, ALeffect *effect); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alError.h b/OpenAL32/include/alError.h deleted file mode 100644 index 858f81d..0000000 --- a/OpenAL32/include/alError.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _AL_ERROR_H_ -#define _AL_ERROR_H_ - -#include "alMain.h" -#include "logging.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern ALboolean TrapALError; - -void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...) DECL_FORMAT(printf, 3, 4); - -#define SETERR_GOTO(ctx, err, lbl, ...) do { \ - alSetError((ctx), (err), __VA_ARGS__); \ - goto lbl; \ -} while(0) - -#define SETERR_RETURN(ctx, err, retval, ...) do { \ - alSetError((ctx), (err), __VA_ARGS__); \ - return retval; \ -} while(0) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alFilter.h b/OpenAL32/include/alFilter.h deleted file mode 100644 index 2634d5e..0000000 --- a/OpenAL32/include/alFilter.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _AL_FILTER_H_ -#define _AL_FILTER_H_ - -#include "AL/alc.h" -#include "AL/al.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define LOWPASSFREQREF (5000.0f) -#define HIGHPASSFREQREF (250.0f) - - -struct ALfilter; - -typedef struct ALfilterVtable { - void (*const setParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint val); - void (*const setParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals); - void (*const setParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val); - void (*const setParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals); - - void (*const getParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *val); - void (*const getParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals); - void (*const getParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val); - void (*const getParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals); -} ALfilterVtable; - -#define DEFINE_ALFILTER_VTABLE(T) \ -const struct ALfilterVtable T##_vtable = { \ - T##_setParami, T##_setParamiv, \ - T##_setParamf, T##_setParamfv, \ - T##_getParami, T##_getParamiv, \ - T##_getParamf, T##_getParamfv, \ -} - -typedef struct ALfilter { - // Filter type (AL_FILTER_NULL, ...) - ALenum type; - - ALfloat Gain; - ALfloat GainHF; - ALfloat HFReference; - ALfloat GainLF; - ALfloat LFReference; - - const struct ALfilterVtable *vtab; - - /* Self ID */ - ALuint id; -} ALfilter; -#define ALfilter_setParami(o, c, p, v) ((o)->vtab->setParami(o, c, p, v)) -#define ALfilter_setParamf(o, c, p, v) ((o)->vtab->setParamf(o, c, p, v)) -#define ALfilter_setParamiv(o, c, p, v) ((o)->vtab->setParamiv(o, c, p, v)) -#define ALfilter_setParamfv(o, c, p, v) ((o)->vtab->setParamfv(o, c, p, v)) -#define ALfilter_getParami(o, c, p, v) ((o)->vtab->getParami(o, c, p, v)) -#define ALfilter_getParamf(o, c, p, v) ((o)->vtab->getParamf(o, c, p, v)) -#define ALfilter_getParamiv(o, c, p, v) ((o)->vtab->getParamiv(o, c, p, v)) -#define ALfilter_getParamfv(o, c, p, v) ((o)->vtab->getParamfv(o, c, p, v)) - -void ReleaseALFilters(ALCdevice *device); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alListener.h b/OpenAL32/include/alListener.h deleted file mode 100644 index 0d80a8d..0000000 --- a/OpenAL32/include/alListener.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _AL_LISTENER_H_ -#define _AL_LISTENER_H_ - -#include "alMain.h" -#include "alu.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct ALcontextProps { - ALfloat DopplerFactor; - ALfloat DopplerVelocity; - ALfloat SpeedOfSound; - ALboolean SourceDistanceModel; - enum DistanceModel DistanceModel; - ALfloat MetersPerUnit; - - ATOMIC(struct ALcontextProps*) next; -}; - -struct ALlistenerProps { - ALfloat Position[3]; - ALfloat Velocity[3]; - ALfloat Forward[3]; - ALfloat Up[3]; - ALfloat Gain; - - ATOMIC(struct ALlistenerProps*) next; -}; - -typedef struct ALlistener { - alignas(16) ALfloat Position[3]; - ALfloat Velocity[3]; - ALfloat Forward[3]; - ALfloat Up[3]; - ALfloat Gain; - - ATOMIC_FLAG PropsClean; - - /* Pointer to the most recent property values that are awaiting an update. - */ - ATOMIC(struct ALlistenerProps*) Update; - - struct { - aluMatrixf Matrix; - aluVector Velocity; - - ALfloat Gain; - ALfloat MetersPerUnit; - - ALfloat DopplerFactor; - ALfloat SpeedOfSound; /* in units per sec! */ - ALfloat ReverbSpeedOfSound; /* in meters per sec! */ - - ALboolean SourceDistanceModel; - enum DistanceModel DistanceModel; - } Params; -} ALlistener; - -void UpdateListenerProps(ALCcontext *context); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alMain.h b/OpenAL32/include/alMain.h deleted file mode 100644 index 74dba1a..0000000 --- a/OpenAL32/include/alMain.h +++ /dev/null @@ -1,913 +0,0 @@ -#ifndef AL_MAIN_H -#define AL_MAIN_H - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_STRINGS_H -#include -#endif -#ifdef HAVE_INTRIN_H -#include -#endif - -#include "AL/al.h" -#include "AL/alc.h" -#include "AL/alext.h" - -#include "inprogext.h" -#include "logging.h" -#include "polymorphism.h" -#include "static_assert.h" -#include "align.h" -#include "atomic.h" -#include "vector.h" -#include "alstring.h" -#include "almalloc.h" -#include "threads.h" - - -#if defined(_WIN64) -#define SZFMT "%I64u" -#elif defined(_WIN32) -#define SZFMT "%u" -#else -#define SZFMT "%zu" -#endif - -#ifdef __has_builtin -#define HAS_BUILTIN __has_builtin -#else -#define HAS_BUILTIN(x) (0) -#endif - -#ifdef __GNUC__ -/* LIKELY optimizes the case where the condition is true. The condition is not - * required to be true, but it can result in more optimal code for the true - * path at the expense of a less optimal false path. - */ -#define LIKELY(x) __builtin_expect(!!(x), !0) -/* The opposite of LIKELY, optimizing the case where the condition is false. */ -#define UNLIKELY(x) __builtin_expect(!!(x), 0) -/* Unlike LIKELY, ASSUME requires the condition to be true or else it invokes - * undefined behavior. It's essentially an assert without actually checking the - * condition at run-time, allowing for stronger optimizations than LIKELY. - */ -#if HAS_BUILTIN(__builtin_assume) -#define ASSUME __builtin_assume -#else -#define ASSUME(x) do { if(!(x)) __builtin_unreachable(); } while(0) -#endif - -#else - -#define LIKELY(x) (!!(x)) -#define UNLIKELY(x) (!!(x)) -#ifdef _MSC_VER -#define ASSUME __assume -#else -#define ASSUME(x) ((void)0) -#endif -#endif - -#ifndef UINT64_MAX -#define UINT64_MAX U64(18446744073709551615) -#endif - -#ifndef UNUSED -#if defined(__cplusplus) -#define UNUSED(x) -#elif defined(__GNUC__) -#define UNUSED(x) UNUSED_##x __attribute__((unused)) -#elif defined(__LCLINT__) -#define UNUSED(x) /*@unused@*/ x -#else -#define UNUSED(x) x -#endif -#endif - -/* Calculates the size of a struct with N elements of a flexible array member. - * GCC and Clang allow offsetof(Type, fam[N]) for this, but MSVC seems to have - * trouble, so a bit more verbose workaround is needed. - */ -#define FAM_SIZE(T, M, N) (offsetof(T, M) + sizeof(((T*)NULL)->M[0])*(N)) - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef ALint64SOFT ALint64; -typedef ALuint64SOFT ALuint64; - -#ifndef U64 -#if defined(_MSC_VER) -#define U64(x) ((ALuint64)(x##ui64)) -#elif SIZEOF_LONG == 8 -#define U64(x) ((ALuint64)(x##ul)) -#elif SIZEOF_LONG_LONG == 8 -#define U64(x) ((ALuint64)(x##ull)) -#endif -#endif - -#ifndef I64 -#if defined(_MSC_VER) -#define I64(x) ((ALint64)(x##i64)) -#elif SIZEOF_LONG == 8 -#define I64(x) ((ALint64)(x##l)) -#elif SIZEOF_LONG_LONG == 8 -#define I64(x) ((ALint64)(x##ll)) -#endif -#endif - -/* Define a CTZ64 macro (count trailing zeros, for 64-bit integers). The result - * is *UNDEFINED* if the value is 0. - */ -#ifdef __GNUC__ - -#if SIZEOF_LONG == 8 -#define CTZ64 __builtin_ctzl -#else -#define CTZ64 __builtin_ctzll -#endif - -#elif defined(HAVE_BITSCANFORWARD64_INTRINSIC) - -inline int msvc64_ctz64(ALuint64 v) -{ - unsigned long idx = 64; - _BitScanForward64(&idx, v); - return (int)idx; -} -#define CTZ64 msvc64_ctz64 - -#elif defined(HAVE_BITSCANFORWARD_INTRINSIC) - -inline int msvc_ctz64(ALuint64 v) -{ - unsigned long idx = 64; - if(!_BitScanForward(&idx, v&0xffffffff)) - { - if(_BitScanForward(&idx, v>>32)) - idx += 32; - } - return (int)idx; -} -#define CTZ64 msvc_ctz64 - -#else - -/* There be black magics here. The popcnt64 method is derived from - * https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel - * while the ctz-utilizing-popcnt algorithm is shown here - * http://www.hackersdelight.org/hdcodetxt/ntz.c.txt - * as the ntz2 variant. These likely aren't the most efficient methods, but - * they're good enough if the GCC or MSVC intrinsics aren't available. - */ -inline int fallback_popcnt64(ALuint64 v) -{ - v = v - ((v >> 1) & U64(0x5555555555555555)); - v = (v & U64(0x3333333333333333)) + ((v >> 2) & U64(0x3333333333333333)); - v = (v + (v >> 4)) & U64(0x0f0f0f0f0f0f0f0f); - return (int)((v * U64(0x0101010101010101)) >> 56); -} - -inline int fallback_ctz64(ALuint64 value) -{ - return fallback_popcnt64(~value & (value - 1)); -} -#define CTZ64 fallback_ctz64 -#endif - -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) -#define IS_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#else -static const union { - ALuint u; - ALubyte b[sizeof(ALuint)]; -} EndianTest = { 1 }; -#define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1) -#endif - -#define COUNTOF(x) (sizeof(x) / sizeof(0[x])) - - -struct ll_ringbuffer; -struct Hrtf; -struct HrtfEntry; -struct DirectHrtfState; -struct FrontStablizer; -struct Compressor; -struct ALCbackend; -struct ALbuffer; -struct ALeffect; -struct ALfilter; -struct ALsource; -struct ALcontextProps; -struct ALlistenerProps; -struct ALvoiceProps; -struct ALeffectslotProps; - - -#define DEFAULT_OUTPUT_RATE (44100) -#define MIN_OUTPUT_RATE (8000) - - -/* Find the next power-of-2 for non-power-of-2 numbers. */ -inline ALuint NextPowerOf2(ALuint value) -{ - if(value > 0) - { - value--; - value |= value>>1; - value |= value>>2; - value |= value>>4; - value |= value>>8; - value |= value>>16; - } - return value+1; -} - -/** Round up a value to the next multiple. */ -inline size_t RoundUp(size_t value, size_t r) -{ - value += r-1; - return value - (value%r); -} - -/* Fast float-to-int conversion. No particular rounding mode is assumed; the - * IEEE-754 default is round-to-nearest with ties-to-even, though an app could - * change it on its own threads. On some systems, a truncating conversion may - * always be the fastest method. - */ -inline ALint fastf2i(ALfloat f) -{ -#if defined(HAVE_INTRIN_H) && ((defined(_M_IX86_FP) && (_M_IX86_FP > 0)) || defined(_M_X64)) - return _mm_cvt_ss2si(_mm_set1_ps(f)); - -#elif defined(_MSC_VER) && defined(_M_IX86_FP) - - ALint i; - __asm fld f - __asm fistp i - return i; - -#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) - - ALint i; -#ifdef __SSE_MATH__ - __asm__("cvtss2si %1, %0" : "=r"(i) : "x"(f)); -#else - __asm__ __volatile__("fistpl %0" : "=m"(i) : "t"(f) : "st"); -#endif - return i; - - /* On GCC when compiling with -fno-math-errno, lrintf can be inlined to - * some simple instructions. Clang does not inline it, always generating a - * libc call, while MSVC's implementation is horribly slow, so always fall - * back to a normal integer conversion for them. - */ -#elif defined(HAVE_LRINTF) && !defined(_MSC_VER) && !defined(__clang__) - - return lrintf(f); - -#else - - return (ALint)f; -#endif -} - -/* Converts float-to-int using standard behavior (truncation). */ -inline int float2int(float f) -{ -#if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ - !defined(__SSE_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0) - ALint sign, shift, mant; - union { - ALfloat f; - ALint i; - } conv; - - conv.f = f; - sign = (conv.i>>31) | 1; - shift = ((conv.i>>23)&0xff) - (127+23); - - /* Over/underflow */ - if(UNLIKELY(shift >= 31 || shift < -23)) - return 0; - - mant = (conv.i&0x7fffff) | 0x800000; - if(LIKELY(shift < 0)) - return (mant >> -shift) * sign; - return (mant << shift) * sign; - -#else - - return (ALint)f; -#endif -} - -/* Rounds a float to the nearest integral value, according to the current - * rounding mode. This is essentially an inlined version of rintf, although - * makes fewer promises (e.g. -0 or -0.25 rounded to 0 may result in +0). - */ -inline float fast_roundf(float f) -{ -#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ - !defined(__SSE_MATH__) - - float out; - __asm__ __volatile__("frndint" : "=t"(out) : "0"(f)); - return out; - -#else - - /* Integral limit, where sub-integral precision is not available for - * floats. - */ - static const float ilim[2] = { - 8388608.0f /* 0x1.0p+23 */, - -8388608.0f /* -0x1.0p+23 */ - }; - ALuint sign, expo; - union { - ALfloat f; - ALuint i; - } conv; - - conv.f = f; - sign = (conv.i>>31)&0x01; - expo = (conv.i>>23)&0xff; - - if(UNLIKELY(expo >= 150/*+23*/)) - { - /* An exponent (base-2) of 23 or higher is incapable of sub-integral - * precision, so it's already an integral value. We don't need to worry - * about infinity or NaN here. - */ - return f; - } - /* Adding the integral limit to the value (with a matching sign) forces a - * result that has no sub-integral precision, and is consequently forced to - * round to an integral value. Removing the integral limit then restores - * the initial value rounded to the integral. The compiler should not - * optimize this out because of non-associative rules on floating-point - * math (as long as you don't use -fassociative-math, - * -funsafe-math-optimizations, -ffast-math, or -Ofast, in which case this - * may break). - */ - f += ilim[sign]; - return f - ilim[sign]; -#endif -} - - -enum DevProbe { - ALL_DEVICE_PROBE, - CAPTURE_DEVICE_PROBE -}; - - -enum DistanceModel { - InverseDistanceClamped = AL_INVERSE_DISTANCE_CLAMPED, - LinearDistanceClamped = AL_LINEAR_DISTANCE_CLAMPED, - ExponentDistanceClamped = AL_EXPONENT_DISTANCE_CLAMPED, - InverseDistance = AL_INVERSE_DISTANCE, - LinearDistance = AL_LINEAR_DISTANCE, - ExponentDistance = AL_EXPONENT_DISTANCE, - DisableDistance = AL_NONE, - - DefaultDistanceModel = InverseDistanceClamped -}; - -enum Channel { - FrontLeft = 0, - FrontRight, - FrontCenter, - LFE, - BackLeft, - BackRight, - BackCenter, - SideLeft, - SideRight, - - UpperFrontLeft, - UpperFrontRight, - UpperBackLeft, - UpperBackRight, - LowerFrontLeft, - LowerFrontRight, - LowerBackLeft, - LowerBackRight, - - Aux0, - Aux1, - Aux2, - Aux3, - Aux4, - Aux5, - Aux6, - Aux7, - Aux8, - Aux9, - Aux10, - Aux11, - Aux12, - Aux13, - Aux14, - Aux15, - - InvalidChannel -}; - - -/* Device formats */ -enum DevFmtType { - DevFmtByte = ALC_BYTE_SOFT, - DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT, - DevFmtShort = ALC_SHORT_SOFT, - DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT, - DevFmtInt = ALC_INT_SOFT, - DevFmtUInt = ALC_UNSIGNED_INT_SOFT, - DevFmtFloat = ALC_FLOAT_SOFT, - - DevFmtTypeDefault = DevFmtFloat -}; -enum DevFmtChannels { - DevFmtMono = ALC_MONO_SOFT, - DevFmtStereo = ALC_STEREO_SOFT, - DevFmtQuad = ALC_QUAD_SOFT, - DevFmtX51 = ALC_5POINT1_SOFT, - DevFmtX61 = ALC_6POINT1_SOFT, - DevFmtX71 = ALC_7POINT1_SOFT, - DevFmtAmbi3D = ALC_BFORMAT3D_SOFT, - - /* Similar to 5.1, except using rear channels instead of sides */ - DevFmtX51Rear = 0x80000000, - - DevFmtChannelsDefault = DevFmtStereo -}; -#define MAX_OUTPUT_CHANNELS (16) - -ALsizei BytesFromDevFmt(enum DevFmtType type); -ALsizei ChannelsFromDevFmt(enum DevFmtChannels chans, ALsizei ambiorder); -inline ALsizei FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type, ALsizei ambiorder) -{ - return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type); -} - -enum AmbiLayout { - AmbiLayout_FuMa = ALC_FUMA_SOFT, /* FuMa channel order */ - AmbiLayout_ACN = ALC_ACN_SOFT, /* ACN channel order */ - - AmbiLayout_Default = AmbiLayout_ACN -}; - -enum AmbiNorm { - AmbiNorm_FuMa = ALC_FUMA_SOFT, /* FuMa normalization */ - AmbiNorm_SN3D = ALC_SN3D_SOFT, /* SN3D normalization */ - AmbiNorm_N3D = ALC_N3D_SOFT, /* N3D normalization */ - - AmbiNorm_Default = AmbiNorm_SN3D -}; - - -enum DeviceType { - Playback, - Capture, - Loopback -}; - - -enum RenderMode { - NormalRender, - StereoPair, - HrtfRender -}; - - -/* The maximum number of Ambisonics coefficients. For a given order (o), the - * size needed will be (o+1)**2, thus zero-order has 1, first-order has 4, - * second-order has 9, third-order has 16, and fourth-order has 25. - */ -#define MAX_AMBI_ORDER 3 -#define MAX_AMBI_COEFFS ((MAX_AMBI_ORDER+1) * (MAX_AMBI_ORDER+1)) - -/* A bitmask of ambisonic channels with height information. If none of these - * channels are used/needed, there's no height (e.g. with most surround sound - * speaker setups). This only specifies up to 4th order, which is the highest - * order a 32-bit mask value can specify (a 64-bit mask could handle up to 7th - * order). This is ACN ordering, with bit 0 being ACN 0, etc. - */ -#define AMBI_PERIPHONIC_MASK (0xfe7ce4) - -/* The maximum number of Ambisonic coefficients for 2D (non-periphonic) - * representation. This is 2 per each order above zero-order, plus 1 for zero- - * order. Or simply, o*2 + 1. - */ -#define MAX_AMBI2D_COEFFS (MAX_AMBI_ORDER*2 + 1) - - -typedef ALfloat ChannelConfig[MAX_AMBI_COEFFS]; -typedef struct BFChannelConfig { - ALfloat Scale; - ALsizei Index; -} BFChannelConfig; - -typedef union AmbiConfig { - /* Ambisonic coefficients for mixing to the dry buffer. */ - ChannelConfig Coeffs[MAX_OUTPUT_CHANNELS]; - /* Coefficient channel mapping for mixing to the dry buffer. */ - BFChannelConfig Map[MAX_OUTPUT_CHANNELS]; -} AmbiConfig; - - -typedef struct BufferSubList { - ALuint64 FreeMask; - struct ALbuffer *Buffers; /* 64 */ -} BufferSubList; -TYPEDEF_VECTOR(BufferSubList, vector_BufferSubList) - -typedef struct EffectSubList { - ALuint64 FreeMask; - struct ALeffect *Effects; /* 64 */ -} EffectSubList; -TYPEDEF_VECTOR(EffectSubList, vector_EffectSubList) - -typedef struct FilterSubList { - ALuint64 FreeMask; - struct ALfilter *Filters; /* 64 */ -} FilterSubList; -TYPEDEF_VECTOR(FilterSubList, vector_FilterSubList) - -typedef struct SourceSubList { - ALuint64 FreeMask; - struct ALsource *Sources; /* 64 */ -} SourceSubList; -TYPEDEF_VECTOR(SourceSubList, vector_SourceSubList) - -/* Effect slots are rather large, and apps aren't likely to have more than one - * or two (let alone 64), so hold them individually. - */ -typedef struct ALeffectslot *ALeffectslotPtr; -TYPEDEF_VECTOR(ALeffectslotPtr, vector_ALeffectslotPtr) - - -typedef struct EnumeratedHrtf { - al_string name; - - struct HrtfEntry *hrtf; -} EnumeratedHrtf; -TYPEDEF_VECTOR(EnumeratedHrtf, vector_EnumeratedHrtf) - - -/* Maximum delay in samples for speaker distance compensation. */ -#define MAX_DELAY_LENGTH 1024 - -typedef struct DistanceComp { - ALfloat Gain; - ALsizei Length; /* Valid range is [0...MAX_DELAY_LENGTH). */ - ALfloat *Buffer; -} DistanceComp; - -/* Size for temporary storage of buffer data, in ALfloats. Larger values need - * more memory, while smaller values may need more iterations. The value needs - * to be a sensible size, however, as it constrains the max stepping value used - * for mixing, as well as the maximum number of samples per mixing iteration. - */ -#define BUFFERSIZE 2048 - -typedef struct DryMixParams { - AmbiConfig Ambi; - /* Number of coefficients in each Ambi.Coeffs to mix together (4 for first- - * order, 9 for second-order, etc). If the count is 0, Ambi.Map is used - * instead to map each output to a coefficient index. - */ - ALsizei CoeffCount; - - ALfloat (*Buffer)[BUFFERSIZE]; - ALsizei NumChannels; - ALsizei NumChannelsPerOrder[MAX_AMBI_ORDER+1]; -} DryMixParams; - -typedef struct BFMixParams { - AmbiConfig Ambi; - /* Will only be 4 or 0. */ - ALsizei CoeffCount; - - ALfloat (*Buffer)[BUFFERSIZE]; - ALsizei NumChannels; -} BFMixParams; - -typedef struct RealMixParams { - enum Channel ChannelName[MAX_OUTPUT_CHANNELS]; - - ALfloat (*Buffer)[BUFFERSIZE]; - ALsizei NumChannels; -} RealMixParams; - -typedef void (*POSTPROCESS)(ALCdevice *device, ALsizei SamplesToDo); - -struct ALCdevice_struct { - RefCount ref; - - ATOMIC(ALenum) Connected; - enum DeviceType Type; - - ALuint Frequency; - ALuint UpdateSize; - ALuint NumUpdates; - enum DevFmtChannels FmtChans; - enum DevFmtType FmtType; - ALboolean IsHeadphones; - ALsizei AmbiOrder; - /* For DevFmtAmbi* output only, specifies the channel order and - * normalization. - */ - enum AmbiLayout AmbiLayout; - enum AmbiNorm AmbiScale; - - al_string DeviceName; - - ATOMIC(ALCenum) LastError; - - // Maximum number of sources that can be created - ALuint SourcesMax; - // Maximum number of slots that can be created - ALuint AuxiliaryEffectSlotMax; - - ALCuint NumMonoSources; - ALCuint NumStereoSources; - ALsizei NumAuxSends; - - // Map of Buffers for this device - vector_BufferSubList BufferList; - almtx_t BufferLock; - - // Map of Effects for this device - vector_EffectSubList EffectList; - almtx_t EffectLock; - - // Map of Filters for this device - vector_FilterSubList FilterList; - almtx_t FilterLock; - - POSTPROCESS PostProcess; - - /* HRTF state and info */ - struct DirectHrtfState *Hrtf; - al_string HrtfName; - struct Hrtf *HrtfHandle; - vector_EnumeratedHrtf HrtfList; - ALCenum HrtfStatus; - - /* UHJ encoder state */ - struct Uhj2Encoder *Uhj_Encoder; - - /* High quality Ambisonic decoder */ - struct BFormatDec *AmbiDecoder; - - /* Stereo-to-binaural filter */ - struct bs2b *Bs2b; - - /* First-order ambisonic upsampler for higher-order output */ - struct AmbiUpsampler *AmbiUp; - - /* Rendering mode. */ - enum RenderMode Render_Mode; - - // Device flags - ALuint Flags; - - ALuint64 ClockBase; - ALuint SamplesDone; - - /* Temp storage used for mixer processing. */ - alignas(16) ALfloat TempBuffer[4][BUFFERSIZE]; - - /* The "dry" path corresponds to the main output. */ - DryMixParams Dry; - - /* First-order ambisonics output, to be upsampled to the dry buffer if different. */ - BFMixParams FOAOut; - - /* "Real" output, which will be written to the device buffer. May alias the - * dry buffer. - */ - RealMixParams RealOut; - - struct FrontStablizer *Stablizer; - - struct Compressor *Limiter; - - /* The average speaker distance as determined by the ambdec configuration - * (or alternatively, by the NFC-HOA reference delay). Only used for NFC. - */ - ALfloat AvgSpeakerDist; - - /* Delay buffers used to compensate for speaker distances. */ - DistanceComp ChannelDelay[MAX_OUTPUT_CHANNELS]; - - /* Dithering control. */ - ALfloat DitherDepth; - ALuint DitherSeed; - - /* Running count of the mixer invocations, in 31.1 fixed point. This - * actually increments *twice* when mixing, first at the start and then at - * the end, so the bottom bit indicates if the device is currently mixing - * and the upper bits indicates how many mixes have been done. - */ - RefCount MixCount; - - // Contexts created on this device - ATOMIC(ALCcontext*) ContextList; - - almtx_t BackendLock; - struct ALCbackend *Backend; - - ATOMIC(ALCdevice*) next; -}; - -// Frequency was requested by the app or config file -#define DEVICE_FREQUENCY_REQUEST (1u<<1) -// Channel configuration was requested by the config file -#define DEVICE_CHANNELS_REQUEST (1u<<2) -// Sample type was requested by the config file -#define DEVICE_SAMPLE_TYPE_REQUEST (1u<<3) - -// Specifies if the DSP is paused at user request -#define DEVICE_PAUSED (1u<<30) - -// Specifies if the device is currently running -#define DEVICE_RUNNING (1u<<31) - - -/* Nanosecond resolution for the device clock time. */ -#define DEVICE_CLOCK_RES U64(1000000000) - - -/* Must be less than 15 characters (16 including terminating null) for - * compatibility with pthread_setname_np limitations. */ -#define MIXER_THREAD_NAME "alsoft-mixer" - -#define RECORD_THREAD_NAME "alsoft-record" - - -enum { - EventType_SourceStateChange = 1<<0, - EventType_BufferCompleted = 1<<1, - EventType_Error = 1<<2, - EventType_Performance = 1<<3, - EventType_Deprecated = 1<<4, - EventType_Disconnected = 1<<5, -}; - -typedef struct AsyncEvent { - unsigned int EnumType; - ALenum Type; - ALuint ObjectId; - ALuint Param; - ALchar Message[1008]; -} AsyncEvent; - -struct ALCcontext_struct { - RefCount ref; - - struct ALlistener *Listener; - - vector_SourceSubList SourceList; - ALuint NumSources; - almtx_t SourceLock; - - vector_ALeffectslotPtr EffectSlotList; - almtx_t EffectSlotLock; - - ATOMIC(ALenum) LastError; - - enum DistanceModel DistanceModel; - ALboolean SourceDistanceModel; - - ALfloat DopplerFactor; - ALfloat DopplerVelocity; - ALfloat SpeedOfSound; - ALfloat MetersPerUnit; - - ATOMIC_FLAG PropsClean; - ATOMIC(ALenum) DeferUpdates; - - almtx_t PropLock; - - /* Counter for the pre-mixing updates, in 31.1 fixed point (lowest bit - * indicates if updates are currently happening). - */ - RefCount UpdateCount; - ATOMIC(ALenum) HoldUpdates; - - ALfloat GainBoost; - - ATOMIC(struct ALcontextProps*) Update; - - /* Linked lists of unused property containers, free to use for future - * updates. - */ - ATOMIC(struct ALcontextProps*) FreeContextProps; - ATOMIC(struct ALlistenerProps*) FreeListenerProps; - ATOMIC(struct ALvoiceProps*) FreeVoiceProps; - ATOMIC(struct ALeffectslotProps*) FreeEffectslotProps; - - struct ALvoice **Voices; - ALsizei VoiceCount; - ALsizei MaxVoices; - - ATOMIC(struct ALeffectslotArray*) ActiveAuxSlots; - - almtx_t EventThrdLock; - althrd_t EventThread; - alsem_t EventSem; - struct ll_ringbuffer *AsyncEvents; - ATOMIC(ALbitfieldSOFT) EnabledEvts; - almtx_t EventCbLock; - ALEVENTPROCSOFT EventCb; - void *EventParam; - - /* Default effect slot */ - struct ALeffectslot *DefaultSlot; - - ALCdevice *Device; - const ALCchar *ExtensionList; - - ATOMIC(ALCcontext*) next; - - /* Memory space used by the listener (and possibly default effect slot) */ - alignas(16) ALCbyte _listener_mem[]; -}; - -ALCcontext *GetContextRef(void); - -void ALCcontext_DecRef(ALCcontext *context); - -void ALCcontext_DeferUpdates(ALCcontext *context); -void ALCcontext_ProcessUpdates(ALCcontext *context); - -void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends); - -void AppendAllDevicesList(const ALCchar *name); -void AppendCaptureDeviceList(const ALCchar *name); - - -extern ALint RTPrioLevel; -void SetRTPriority(void); - -void SetDefaultChannelOrder(ALCdevice *device); -void SetDefaultWFXChannelOrder(ALCdevice *device); - -const ALCchar *DevFmtTypeString(enum DevFmtType type); -const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans); - -inline ALint GetChannelIndex(const enum Channel names[MAX_OUTPUT_CHANNELS], enum Channel chan) -{ - ALint i; - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - if(names[i] == chan) - return i; - } - return -1; -} -/** - * GetChannelIdxByName - * - * Returns the index for the given channel name (e.g. FrontCenter), or -1 if it - * doesn't exist. - */ -inline ALint GetChannelIdxByName(const RealMixParams *real, enum Channel chan) -{ return GetChannelIndex(real->ChannelName, chan); } - - -inline void LockBufferList(ALCdevice *device) { almtx_lock(&device->BufferLock); } -inline void UnlockBufferList(ALCdevice *device) { almtx_unlock(&device->BufferLock); } - -inline void LockEffectList(ALCdevice *device) { almtx_lock(&device->EffectLock); } -inline void UnlockEffectList(ALCdevice *device) { almtx_unlock(&device->EffectLock); } - -inline void LockFilterList(ALCdevice *device) { almtx_lock(&device->FilterLock); } -inline void UnlockFilterList(ALCdevice *device) { almtx_unlock(&device->FilterLock); } - -inline void LockEffectSlotList(ALCcontext *context) -{ almtx_lock(&context->EffectSlotLock); } -inline void UnlockEffectSlotList(ALCcontext *context) -{ almtx_unlock(&context->EffectSlotLock); } - - -vector_al_string SearchDataFiles(const char *match, const char *subdir); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alSource.h b/OpenAL32/include/alSource.h deleted file mode 100644 index 5f07c09..0000000 --- a/OpenAL32/include/alSource.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef _AL_SOURCE_H_ -#define _AL_SOURCE_H_ - -#include "bool.h" -#include "alMain.h" -#include "alu.h" -#include "hrtf.h" -#include "atomic.h" - -#define MAX_SENDS 16 -#define DEFAULT_SENDS 2 - -#ifdef __cplusplus -extern "C" { -#endif - -struct ALbuffer; -struct ALsource; - - -typedef struct ALbufferlistitem { - ATOMIC(struct ALbufferlistitem*) next; - ALsizei max_samples; - ALsizei num_buffers; - struct ALbuffer *buffers[]; -} ALbufferlistitem; - - -typedef struct ALsource { - /** Source properties. */ - ALfloat Pitch; - ALfloat Gain; - ALfloat OuterGain; - ALfloat MinGain; - ALfloat MaxGain; - ALfloat InnerAngle; - ALfloat OuterAngle; - ALfloat RefDistance; - ALfloat MaxDistance; - ALfloat RolloffFactor; - ALfloat Position[3]; - ALfloat Velocity[3]; - ALfloat Direction[3]; - ALfloat Orientation[2][3]; - ALboolean HeadRelative; - ALboolean Looping; - enum DistanceModel DistanceModel; - enum Resampler Resampler; - ALboolean DirectChannels; - enum SpatializeMode Spatialize; - - ALboolean DryGainHFAuto; - ALboolean WetGainAuto; - ALboolean WetGainHFAuto; - ALfloat OuterGainHF; - - ALfloat AirAbsorptionFactor; - ALfloat RoomRolloffFactor; - ALfloat DopplerFactor; - - /* NOTE: Stereo pan angles are specified in radians, counter-clockwise - * rather than clockwise. - */ - ALfloat StereoPan[2]; - - ALfloat Radius; - - /** Direct filter and auxiliary send info. */ - struct { - ALfloat Gain; - ALfloat GainHF; - ALfloat HFReference; - ALfloat GainLF; - ALfloat LFReference; - } Direct; - struct { - struct ALeffectslot *Slot; - ALfloat Gain; - ALfloat GainHF; - ALfloat HFReference; - ALfloat GainLF; - ALfloat LFReference; - } *Send; - - /** - * Last user-specified offset, and the offset type (bytes, samples, or - * seconds). - */ - ALdouble Offset; - ALenum OffsetType; - - /** Source type (static, streaming, or undetermined) */ - ALint SourceType; - - /** Source state (initial, playing, paused, or stopped) */ - ALenum state; - - /** Source Buffer Queue head. */ - ALbufferlistitem *queue; - - ATOMIC_FLAG PropsClean; - - /* Index into the context's Voices array. Lazily updated, only checked and - * reset when looking up the voice. - */ - ALint VoiceIdx; - - /** Self ID */ - ALuint id; -} ALsource; - -void UpdateAllSourceProps(ALCcontext *context); - -ALvoid ReleaseALSources(ALCcontext *Context); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/alu.h b/OpenAL32/include/alu.h deleted file mode 100644 index c3e6ba1..0000000 --- a/OpenAL32/include/alu.h +++ /dev/null @@ -1,548 +0,0 @@ -#ifndef _ALU_H_ -#define _ALU_H_ - -#include -#include -#ifdef HAVE_FLOAT_H -#include -#endif -#ifdef HAVE_IEEEFP_H -#include -#endif - -#include "alMain.h" -#include "alBuffer.h" - -#include "hrtf.h" -#include "align.h" -#include "math_defs.h" -#include "filters/defs.h" -#include "filters/nfc.h" - - -#define MAX_PITCH (255) - -/* Maximum number of samples to pad on either end of a buffer for resampling. - * Note that both the beginning and end need padding! - */ -#define MAX_RESAMPLE_PADDING 24 - - -#ifdef __cplusplus -extern "C" { -#endif - -struct BSincTable; -struct ALsource; -struct ALbufferlistitem; -struct ALvoice; -struct ALeffectslot; - - -#define DITHER_RNG_SEED 22222 - - -enum SpatializeMode { - SpatializeOff = AL_FALSE, - SpatializeOn = AL_TRUE, - SpatializeAuto = AL_AUTO_SOFT -}; - -enum Resampler { - PointResampler, - LinearResampler, - FIR4Resampler, - BSinc12Resampler, - BSinc24Resampler, - - ResamplerMax = BSinc24Resampler -}; -extern enum Resampler ResamplerDefault; - -/* The number of distinct scale and phase intervals within the bsinc filter - * table. - */ -#define BSINC_SCALE_BITS 4 -#define BSINC_SCALE_COUNT (1<v[0] = x; - vector->v[1] = y; - vector->v[2] = z; - vector->v[3] = w; -} - - -typedef union aluMatrixf { - alignas(16) ALfloat m[4][4]; -} aluMatrixf; -extern const aluMatrixf IdentityMatrixf; - -inline void aluMatrixfSetRow(aluMatrixf *matrix, ALuint row, - ALfloat m0, ALfloat m1, ALfloat m2, ALfloat m3) -{ - matrix->m[row][0] = m0; - matrix->m[row][1] = m1; - matrix->m[row][2] = m2; - matrix->m[row][3] = m3; -} - -inline void aluMatrixfSet(aluMatrixf *matrix, ALfloat m00, ALfloat m01, ALfloat m02, ALfloat m03, - ALfloat m10, ALfloat m11, ALfloat m12, ALfloat m13, - ALfloat m20, ALfloat m21, ALfloat m22, ALfloat m23, - ALfloat m30, ALfloat m31, ALfloat m32, ALfloat m33) -{ - aluMatrixfSetRow(matrix, 0, m00, m01, m02, m03); - aluMatrixfSetRow(matrix, 1, m10, m11, m12, m13); - aluMatrixfSetRow(matrix, 2, m20, m21, m22, m23); - aluMatrixfSetRow(matrix, 3, m30, m31, m32, m33); -} - - -enum ActiveFilters { - AF_None = 0, - AF_LowPass = 1, - AF_HighPass = 2, - AF_BandPass = AF_LowPass | AF_HighPass -}; - - -typedef struct MixHrtfParams { - const ALfloat (*Coeffs)[2]; - ALsizei Delay[2]; - ALfloat Gain; - ALfloat GainStep; -} MixHrtfParams; - - -typedef struct DirectParams { - BiquadFilter LowPass; - BiquadFilter HighPass; - - NfcFilter NFCtrlFilter; - - struct { - HrtfParams Old; - HrtfParams Target; - HrtfState State; - } Hrtf; - - struct { - ALfloat Current[MAX_OUTPUT_CHANNELS]; - ALfloat Target[MAX_OUTPUT_CHANNELS]; - } Gains; -} DirectParams; - -typedef struct SendParams { - BiquadFilter LowPass; - BiquadFilter HighPass; - - struct { - ALfloat Current[MAX_OUTPUT_CHANNELS]; - ALfloat Target[MAX_OUTPUT_CHANNELS]; - } Gains; -} SendParams; - - -struct ALvoiceProps { - ATOMIC(struct ALvoiceProps*) next; - - ALfloat Pitch; - ALfloat Gain; - ALfloat OuterGain; - ALfloat MinGain; - ALfloat MaxGain; - ALfloat InnerAngle; - ALfloat OuterAngle; - ALfloat RefDistance; - ALfloat MaxDistance; - ALfloat RolloffFactor; - ALfloat Position[3]; - ALfloat Velocity[3]; - ALfloat Direction[3]; - ALfloat Orientation[2][3]; - ALboolean HeadRelative; - enum DistanceModel DistanceModel; - enum Resampler Resampler; - ALboolean DirectChannels; - enum SpatializeMode SpatializeMode; - - ALboolean DryGainHFAuto; - ALboolean WetGainAuto; - ALboolean WetGainHFAuto; - ALfloat OuterGainHF; - - ALfloat AirAbsorptionFactor; - ALfloat RoomRolloffFactor; - ALfloat DopplerFactor; - - ALfloat StereoPan[2]; - - ALfloat Radius; - - /** Direct filter and auxiliary send info. */ - struct { - ALfloat Gain; - ALfloat GainHF; - ALfloat HFReference; - ALfloat GainLF; - ALfloat LFReference; - } Direct; - struct { - struct ALeffectslot *Slot; - ALfloat Gain; - ALfloat GainHF; - ALfloat HFReference; - ALfloat GainLF; - ALfloat LFReference; - } Send[]; -}; - -#define VOICE_IS_STATIC (1<<0) -#define VOICE_IS_FADING (1<<1) /* Fading sources use gain stepping for smooth transitions. */ -#define VOICE_HAS_HRTF (1<<2) -#define VOICE_HAS_NFC (1<<3) - -typedef struct ALvoice { - struct ALvoiceProps *Props; - - ATOMIC(struct ALvoiceProps*) Update; - - ATOMIC(struct ALsource*) Source; - ATOMIC(bool) Playing; - - /** - * Source offset in samples, relative to the currently playing buffer, NOT - * the whole queue, and the fractional (fixed-point) offset to the next - * sample. - */ - ATOMIC(ALuint) position; - ATOMIC(ALsizei) position_fraction; - - /* Current buffer queue item being played. */ - ATOMIC(struct ALbufferlistitem*) current_buffer; - - /* Buffer queue item to loop to at end of queue (will be NULL for non- - * looping voices). - */ - ATOMIC(struct ALbufferlistitem*) loop_buffer; - - /** - * Number of channels and bytes-per-sample for the attached source's - * buffer(s). - */ - ALsizei NumChannels; - ALsizei SampleSize; - - /** Current target parameters used for mixing. */ - ALint Step; - - ResamplerFunc Resampler; - - ALuint Flags; - - ALuint Offset; /* Number of output samples mixed since starting. */ - - alignas(16) ALfloat PrevSamples[MAX_INPUT_CHANNELS][MAX_RESAMPLE_PADDING]; - - InterpState ResampleState; - - struct { - enum ActiveFilters FilterType; - DirectParams Params[MAX_INPUT_CHANNELS]; - - ALfloat (*Buffer)[BUFFERSIZE]; - ALsizei Channels; - ALsizei ChannelsPerOrder[MAX_AMBI_ORDER+1]; - } Direct; - - struct { - enum ActiveFilters FilterType; - SendParams Params[MAX_INPUT_CHANNELS]; - - ALfloat (*Buffer)[BUFFERSIZE]; - ALsizei Channels; - } Send[]; -} ALvoice; - -void DeinitVoice(ALvoice *voice); - - -typedef void (*MixerFunc)(const ALfloat *data, ALsizei OutChans, - ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALfloat *CurrentGains, - const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize); -typedef void (*RowMixerFunc)(ALfloat *OutBuffer, const ALfloat *gains, - const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, - ALsizei InPos, ALsizei BufferSize); -typedef void (*HrtfMixerFunc)(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, MixHrtfParams *hrtfparams, - HrtfState *hrtfstate, ALsizei BufferSize); -typedef void (*HrtfMixerBlendFunc)(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, ALsizei OutPos, - const ALsizei IrSize, const HrtfParams *oldparams, - MixHrtfParams *newparams, HrtfState *hrtfstate, - ALsizei BufferSize); -typedef void (*HrtfDirectMixerFunc)(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, - const ALfloat *data, ALsizei Offset, const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat (*restrict Values)[2], ALsizei BufferSize); - - -#define GAIN_MIX_MAX (16.0f) /* +24dB */ - -#define GAIN_SILENCE_THRESHOLD (0.00001f) /* -100dB */ - -#define SPEEDOFSOUNDMETRESPERSEC (343.3f) -#define AIRABSORBGAINHF (0.99426f) /* -0.05dB */ - -/* Target gain for the reverb decay feedback reaching the decay time. */ -#define REVERB_DECAY_GAIN (0.001f) /* -60 dB */ - -#define FRACTIONBITS (12) -#define FRACTIONONE (1< b) ? b : a); } -inline ALfloat maxf(ALfloat a, ALfloat b) -{ return ((a > b) ? a : b); } -inline ALfloat clampf(ALfloat val, ALfloat min, ALfloat max) -{ return minf(max, maxf(min, val)); } - -inline ALdouble mind(ALdouble a, ALdouble b) -{ return ((a > b) ? b : a); } -inline ALdouble maxd(ALdouble a, ALdouble b) -{ return ((a > b) ? a : b); } -inline ALdouble clampd(ALdouble val, ALdouble min, ALdouble max) -{ return mind(max, maxd(min, val)); } - -inline ALuint minu(ALuint a, ALuint b) -{ return ((a > b) ? b : a); } -inline ALuint maxu(ALuint a, ALuint b) -{ return ((a > b) ? a : b); } -inline ALuint clampu(ALuint val, ALuint min, ALuint max) -{ return minu(max, maxu(min, val)); } - -inline ALint mini(ALint a, ALint b) -{ return ((a > b) ? b : a); } -inline ALint maxi(ALint a, ALint b) -{ return ((a > b) ? a : b); } -inline ALint clampi(ALint val, ALint min, ALint max) -{ return mini(max, maxi(min, val)); } - -inline ALint64 mini64(ALint64 a, ALint64 b) -{ return ((a > b) ? b : a); } -inline ALint64 maxi64(ALint64 a, ALint64 b) -{ return ((a > b) ? a : b); } -inline ALint64 clampi64(ALint64 val, ALint64 min, ALint64 max) -{ return mini64(max, maxi64(min, val)); } - -inline ALuint64 minu64(ALuint64 a, ALuint64 b) -{ return ((a > b) ? b : a); } -inline ALuint64 maxu64(ALuint64 a, ALuint64 b) -{ return ((a > b) ? a : b); } -inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max) -{ return minu64(max, maxu64(min, val)); } - -inline size_t minz(size_t a, size_t b) -{ return ((a > b) ? b : a); } -inline size_t maxz(size_t a, size_t b) -{ return ((a > b) ? a : b); } -inline size_t clampz(size_t val, size_t min, size_t max) -{ return minz(max, maxz(min, val)); } - - -inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) -{ - return val1 + (val2-val1)*mu; -} -inline ALfloat cubic(ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat mu) -{ - ALfloat mu2 = mu*mu, mu3 = mu2*mu; - ALfloat a0 = -0.5f*mu3 + mu2 + -0.5f*mu; - ALfloat a1 = 1.5f*mu3 + -2.5f*mu2 + 1.0f; - ALfloat a2 = -1.5f*mu3 + 2.0f*mu2 + 0.5f*mu; - ALfloat a3 = 0.5f*mu3 + -0.5f*mu2; - return val1*a0 + val2*a1 + val3*a2 + val4*a3; -} - - -enum HrtfRequestMode { - Hrtf_Default = 0, - Hrtf_Enable = 1, - Hrtf_Disable = 2, -}; - -void aluInit(void); - -void aluInitMixer(void); - -ResamplerFunc SelectResampler(enum Resampler resampler); - -/* aluInitRenderer - * - * Set up the appropriate panning method and mixing method given the device - * properties. - */ -void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf_appreq, enum HrtfRequestMode hrtf_userreq); - -void aluInitEffectPanning(struct ALeffectslot *slot); - -void aluSelectPostProcess(ALCdevice *device); - -/** - * Calculates ambisonic encoder coefficients using the X, Y, and Z direction - * components, which must represent a normalized (unit length) vector, and the - * spread is the angular width of the sound (0...tau). - * - * NOTE: The components use ambisonic coordinates. As a result: - * - * Ambisonic Y = OpenAL -X - * Ambisonic Z = OpenAL Y - * Ambisonic X = OpenAL -Z - * - * The components are ordered such that OpenAL's X, Y, and Z are the first, - * second, and third parameters respectively -- simply negate X and Z. - */ -void CalcAmbiCoeffs(const ALfloat y, const ALfloat z, const ALfloat x, const ALfloat spread, - ALfloat coeffs[MAX_AMBI_COEFFS]); - -/** - * CalcDirectionCoeffs - * - * Calculates ambisonic coefficients based on an OpenAL direction vector. The - * vector must be normalized (unit length), and the spread is the angular width - * of the sound (0...tau). - */ -inline void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]) -{ - /* Convert from OpenAL coords to Ambisonics. */ - CalcAmbiCoeffs(-dir[0], dir[1], -dir[2], spread, coeffs); -} - -/** - * CalcAngleCoeffs - * - * Calculates ambisonic coefficients based on azimuth and elevation. The - * azimuth and elevation parameters are in radians, going right and up - * respectively. - */ -inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]) -{ - ALfloat x = -sinf(azimuth) * cosf(elevation); - ALfloat y = sinf(elevation); - ALfloat z = cosf(azimuth) * cosf(elevation); - - CalcAmbiCoeffs(x, y, z, spread, coeffs); -} - -/** - * ScaleAzimuthFront - * - * Scales the given azimuth toward the side (+/- pi/2 radians) for positions in - * front. - */ -inline float ScaleAzimuthFront(float azimuth, float scale) -{ - ALfloat sign = copysignf(1.0f, azimuth); - if(!(fabsf(azimuth) > F_PI_2)) - return minf(fabsf(azimuth) * scale, F_PI_2) * sign; - return azimuth; -} - - -void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALsizei numcoeffs, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -/** - * ComputeDryPanGains - * - * Computes panning gains using the given channel decoder coefficients and the - * pre-calculated direction or angle coefficients. - */ -inline void ComputeDryPanGains(const DryMixParams *dry, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - if(dry->CoeffCount > 0) - ComputePanningGainsMC(dry->Ambi.Coeffs, dry->NumChannels, dry->CoeffCount, - coeffs, ingain, gains); - else - ComputePanningGainsBF(dry->Ambi.Map, dry->NumChannels, coeffs, ingain, gains); -} - -void ComputeFirstOrderGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -void ComputeFirstOrderGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -/** - * ComputeFirstOrderGains - * - * Sets channel gains for a first-order ambisonics input channel. The matrix is - * a 1x4 'slice' of a transform matrix for the input channel, used to scale and - * orient the sound samples. - */ -inline void ComputeFirstOrderGains(const BFMixParams *foa, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - if(foa->CoeffCount > 0) - ComputeFirstOrderGainsMC(foa->Ambi.Coeffs, foa->NumChannels, mtx, ingain, gains); - else - ComputeFirstOrderGainsBF(foa->Ambi.Map, foa->NumChannels, mtx, ingain, gains); -} - - -ALboolean MixSource(struct ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo); - -void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples); -/* Caller must lock the device, and the mixer must not be running. */ -void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) DECL_FORMAT(printf, 2, 3); - -void UpdateContextProps(ALCcontext *context); - -extern MixerFunc MixSamples; -extern RowMixerFunc MixRowSamples; - -extern ALfloat ConeScale; -extern ALfloat ZScale; -extern ALboolean OverrideReverbSpeedOfSound; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/OpenAL32/include/sample_cvt.h b/OpenAL32/include/sample_cvt.h deleted file mode 100644 index c041760..0000000 --- a/OpenAL32/include/sample_cvt.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SAMPLE_CVT_H -#define SAMPLE_CVT_H - -#include "AL/al.h" -#include "alBuffer.h" - -extern const ALshort muLawDecompressionTable[256]; -extern const ALshort aLawDecompressionTable[256]; - -void Convert_ALshort_ALima4(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, - ALsizei align); -void Convert_ALshort_ALmsadpcm(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, - ALsizei align); - -#endif /* SAMPLE_CVT_H */ diff --git a/OpenAL32/sample_cvt.c b/OpenAL32/sample_cvt.c deleted file mode 100644 index 4a85f74..0000000 --- a/OpenAL32/sample_cvt.c +++ /dev/null @@ -1,276 +0,0 @@ - -#include "config.h" - -#include "sample_cvt.h" - -#include "AL/al.h" -#include "alu.h" -#include "alBuffer.h" - - -/* IMA ADPCM Stepsize table */ -static const int IMAStep_size[89] = { - 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, - 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, - 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, - 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, - 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, - 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, - 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442, - 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794, - 32767 -}; - -/* IMA4 ADPCM Codeword decode table */ -static const int IMA4Codeword[16] = { - 1, 3, 5, 7, 9, 11, 13, 15, - -1,-3,-5,-7,-9,-11,-13,-15, -}; - -/* IMA4 ADPCM Step index adjust decode table */ -static const int IMA4Index_adjust[16] = { - -1,-1,-1,-1, 2, 4, 6, 8, - -1,-1,-1,-1, 2, 4, 6, 8 -}; - - -/* MSADPCM Adaption table */ -static const int MSADPCMAdaption[16] = { - 230, 230, 230, 230, 307, 409, 512, 614, - 768, 614, 512, 409, 307, 230, 230, 230 -}; - -/* MSADPCM Adaption Coefficient tables */ -static const int MSADPCMAdaptionCoeff[7][2] = { - { 256, 0 }, - { 512, -256 }, - { 0, 0 }, - { 192, 64 }, - { 240, 0 }, - { 460, -208 }, - { 392, -232 } -}; - - -/* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a - * signed 16-bit sample */ -const ALshort muLawDecompressionTable[256] = { - -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956, - -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764, - -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412, - -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316, - -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, - -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, - -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, - -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, - -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, - -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, - -876, -844, -812, -780, -748, -716, -684, -652, - -620, -588, -556, -524, -492, -460, -428, -396, - -372, -356, -340, -324, -308, -292, -276, -260, - -244, -228, -212, -196, -180, -164, -148, -132, - -120, -112, -104, -96, -88, -80, -72, -64, - -56, -48, -40, -32, -24, -16, -8, 0, - 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, - 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, - 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, - 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, - 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, - 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, - 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, - 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, - 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, - 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, - 876, 844, 812, 780, 748, 716, 684, 652, - 620, 588, 556, 524, 492, 460, 428, 396, - 372, 356, 340, 324, 308, 292, 276, 260, - 244, 228, 212, 196, 180, 164, 148, 132, - 120, 112, 104, 96, 88, 80, 72, 64, - 56, 48, 40, 32, 24, 16, 8, 0 -}; - - -/* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a - * signed 16-bit sample */ -const ALshort aLawDecompressionTable[256] = { - -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, - -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, - -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, - -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, - -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, - -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, - -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, - -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, - -344, -328, -376, -360, -280, -264, -312, -296, - -472, -456, -504, -488, -408, -392, -440, -424, - -88, -72, -120, -104, -24, -8, -56, -40, - -216, -200, -248, -232, -152, -136, -184, -168, - -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, - -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, - -688, -656, -752, -720, -560, -528, -624, -592, - -944, -912, -1008, -976, -816, -784, -880, -848, - 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, - 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, - 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, - 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, - 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, - 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, - 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, - 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, - 344, 328, 376, 360, 280, 264, 312, 296, - 472, 456, 504, 488, 408, 392, 440, 424, - 88, 72, 120, 104, 24, 8, 56, 40, - 216, 200, 248, 232, 152, 136, 184, 168, - 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, - 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, - 688, 656, 752, 720, 560, 528, 624, 592, - 944, 912, 1008, 976, 816, 784, 880, 848 -}; - - -static void DecodeIMA4Block(ALshort *dst, const ALubyte *src, ALint numchans, ALsizei align) -{ - ALint sample[MAX_INPUT_CHANNELS] = { 0 }; - ALint index[MAX_INPUT_CHANNELS] = { 0 }; - ALuint code[MAX_INPUT_CHANNELS] = { 0 }; - ALsizei c, i; - - for(c = 0;c < numchans;c++) - { - sample[c] = *(src++); - sample[c] |= *(src++) << 8; - sample[c] = (sample[c]^0x8000) - 32768; - index[c] = *(src++); - index[c] |= *(src++) << 8; - index[c] = (index[c]^0x8000) - 32768; - - index[c] = clampi(index[c], 0, 88); - - dst[c] = sample[c]; - } - - for(i = 1;i < align;i++) - { - if((i&7) == 1) - { - for(c = 0;c < numchans;c++) - { - code[c] = *(src++); - code[c] |= *(src++) << 8; - code[c] |= *(src++) << 16; - code[c] |= *(src++) << 24; - } - } - - for(c = 0;c < numchans;c++) - { - int nibble = code[c]&0xf; - code[c] >>= 4; - - sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8; - sample[c] = clampi(sample[c], -32768, 32767); - - index[c] += IMA4Index_adjust[nibble]; - index[c] = clampi(index[c], 0, 88); - - *(dst++) = sample[c]; - } - } -} - -static void DecodeMSADPCMBlock(ALshort *dst, const ALubyte *src, ALint numchans, ALsizei align) -{ - ALubyte blockpred[MAX_INPUT_CHANNELS] = { 0 }; - ALint delta[MAX_INPUT_CHANNELS] = { 0 }; - ALshort samples[MAX_INPUT_CHANNELS][2] = { { 0, 0 } }; - ALint c, i; - - for(c = 0;c < numchans;c++) - { - blockpred[c] = *(src++); - blockpred[c] = minu(blockpred[c], 6); - } - for(c = 0;c < numchans;c++) - { - delta[c] = *(src++); - delta[c] |= *(src++) << 8; - delta[c] = (delta[c]^0x8000) - 32768; - } - for(c = 0;c < numchans;c++) - { - samples[c][0] = *(src++); - samples[c][0] |= *(src++) << 8; - samples[c][0] = (samples[c][0]^0x8000) - 32768; - } - for(c = 0;c < numchans;c++) - { - samples[c][1] = *(src++); - samples[c][1] |= *(src++) << 8; - samples[c][1] = (samples[c][1]^0x8000) - 0x8000; - } - - /* Second sample is written first. */ - for(c = 0;c < numchans;c++) - *(dst++) = samples[c][1]; - for(c = 0;c < numchans;c++) - *(dst++) = samples[c][0]; - - for(i = 2;i < align;i++) - { - for(c = 0;c < numchans;c++) - { - const ALint num = (i*numchans) + c; - ALint nibble, pred; - - /* Read the nibble (first is in the upper bits). */ - if(!(num&1)) - nibble = (*src>>4)&0x0f; - else - nibble = (*(src++))&0x0f; - - pred = (samples[c][0]*MSADPCMAdaptionCoeff[blockpred[c]][0] + - samples[c][1]*MSADPCMAdaptionCoeff[blockpred[c]][1]) / 256; - pred += ((nibble^0x08) - 0x08) * delta[c]; - pred = clampi(pred, -32768, 32767); - - samples[c][1] = samples[c][0]; - samples[c][0] = pred; - - delta[c] = (MSADPCMAdaption[nibble] * delta[c]) / 256; - delta[c] = maxi(16, delta[c]); - - *(dst++) = pred; - } - } -} - - -void Convert_ALshort_ALima4(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, - ALsizei align) -{ - ALsizei byte_align = ((align-1)/2 + 4) * numchans; - ALsizei i; - - assert(align > 0 && (len%align) == 0); - for(i = 0;i < len;i += align) - { - DecodeIMA4Block(dst, src, numchans, align); - src += byte_align; - dst += align*numchans; - } -} - -void Convert_ALshort_ALmsadpcm(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, - ALsizei align) -{ - ALsizei byte_align = ((align-2)/2 + 7) * numchans; - ALsizei i; - - assert(align > 1 && (len%align) == 0); - for(i = 0;i < len;i += align) - { - DecodeMSADPCMBlock(dst, src, numchans, align); - src += byte_align; - dst += align*numchans; - } -} diff --git a/al/auxeffectslot.cpp b/al/auxeffectslot.cpp new file mode 100644 index 0000000..efc75aa --- /dev/null +++ b/al/auxeffectslot.cpp @@ -0,0 +1,796 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "auxeffectslot.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "alcmain.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alspan.h" +#include "alu.h" +#include "effect.h" +#include "fpu_modes.h" +#include "inprogext.h" +#include "logging.h" +#include "opthelpers.h" + + +namespace { + +inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) noexcept +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= context->mEffectSlotList.size()) + return nullptr; + EffectSlotSubList &sublist{context->mEffectSlotList[lidx]}; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.EffectSlots + slidx; +} + +inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) noexcept +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= device->EffectList.size()) + return nullptr; + EffectSubList &sublist = device->EffectList[lidx]; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Effects + slidx; +} + + +void AddActiveEffectSlots(const ALuint *slotids, size_t count, ALCcontext *context) +{ + if(count < 1) return; + ALeffectslotArray *curarray{context->mActiveAuxSlots.load(std::memory_order_acquire)}; + size_t newcount{curarray->size() + count}; + + /* Insert the new effect slots into the head of the array, followed by the + * existing ones. + */ + ALeffectslotArray *newarray = ALeffectslot::CreatePtrArray(newcount); + auto slotiter = std::transform(slotids, slotids+count, newarray->begin(), + [context](ALuint id) noexcept -> ALeffectslot* + { return LookupEffectSlot(context, id); } + ); + std::copy(curarray->begin(), curarray->end(), slotiter); + + /* Remove any duplicates (first instance of each will be kept). */ + auto last = newarray->end(); + for(auto start=newarray->begin()+1;;) + { + last = std::remove(start, last, *(start-1)); + if(start == last) break; + ++start; + } + newcount = static_cast(std::distance(newarray->begin(), last)); + + /* Reallocate newarray if the new size ended up smaller from duplicate + * removal. + */ + if UNLIKELY(newcount < newarray->size()) + { + curarray = newarray; + newarray = ALeffectslot::CreatePtrArray(newcount); + std::copy_n(curarray->begin(), newcount, newarray->begin()); + delete curarray; + curarray = nullptr; + } + std::uninitialized_fill_n(newarray->end(), newcount, nullptr); + + curarray = context->mActiveAuxSlots.exchange(newarray, std::memory_order_acq_rel); + ALCdevice *device{context->mDevice.get()}; + while((device->MixCount.load(std::memory_order_acquire)&1)) + std::this_thread::yield(); + al::destroy_n(curarray->end(), curarray->size()); + delete curarray; +} + +void RemoveActiveEffectSlots(const ALuint *slotids, size_t count, ALCcontext *context) +{ + if(count < 1) return; + ALeffectslotArray *curarray{context->mActiveAuxSlots.load(std::memory_order_acquire)}; + + /* Don't shrink the allocated array size since we don't know how many (if + * any) of the effect slots to remove are in the array. + */ + ALeffectslotArray *newarray = ALeffectslot::CreatePtrArray(curarray->size()); + + /* Copy each element in curarray to newarray whose ID is not in slotids. */ + const ALuint *slotids_end{slotids + count}; + auto slotiter = std::copy_if(curarray->begin(), curarray->end(), newarray->begin(), + [slotids, slotids_end](const ALeffectslot *slot) -> bool + { return std::find(slotids, slotids_end, slot->id) == slotids_end; } + ); + + /* Reallocate with the new size. */ + auto newsize = static_cast(std::distance(newarray->begin(), slotiter)); + if LIKELY(newsize != newarray->size()) + { + curarray = newarray; + newarray = ALeffectslot::CreatePtrArray(newsize); + std::copy_n(curarray->begin(), newsize, newarray->begin()); + + delete curarray; + curarray = nullptr; + } + std::uninitialized_fill_n(newarray->end(), newsize, nullptr); + + curarray = context->mActiveAuxSlots.exchange(newarray, std::memory_order_acq_rel); + ALCdevice *device{context->mDevice.get()}; + while((device->MixCount.load(std::memory_order_acquire)&1)) + std::this_thread::yield(); + al::destroy_n(curarray->end(), curarray->size()); + delete curarray; +} + + +bool EnsureEffectSlots(ALCcontext *context, size_t needed) +{ + size_t count{std::accumulate(context->mEffectSlotList.cbegin(), + context->mEffectSlotList.cend(), size_t{0}, + [](size_t cur, const EffectSlotSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(sublist.FreeMask)); } + )}; + + while(needed > count) + { + if UNLIKELY(context->mEffectSlotList.size() >= 1<<25) + return false; + + context->mEffectSlotList.emplace_back(); + auto sublist = context->mEffectSlotList.end() - 1; + sublist->FreeMask = ~0_u64; + sublist->EffectSlots = static_cast( + al_calloc(alignof(ALeffectslot), sizeof(ALeffectslot)*64)); + if UNLIKELY(!sublist->EffectSlots) + { + context->mEffectSlotList.pop_back(); + return false; + } + count += 64; + } + return true; +} + +ALeffectslot *AllocEffectSlot(ALCcontext *context) +{ + auto sublist = std::find_if(context->mEffectSlotList.begin(), context->mEffectSlotList.end(), + [](const EffectSlotSubList &entry) noexcept -> bool + { return entry.FreeMask != 0; } + ); + auto lidx = static_cast(std::distance(context->mEffectSlotList.begin(), sublist)); + auto slidx = static_cast(CTZ64(sublist->FreeMask)); + + ALeffectslot *slot{::new (sublist->EffectSlots + slidx) ALeffectslot{}}; + if(ALenum err{InitEffectSlot(slot)}) + { + al::destroy_at(slot); + context->setError(err, "Effect slot object initialization failed"); + return nullptr; + } + aluInitEffectPanning(slot, context->mDevice.get()); + + /* Add 1 to avoid source ID 0. */ + slot->id = ((lidx<<6) | slidx) + 1; + + context->mNumEffectSlots += 1; + sublist->FreeMask &= ~(1_u64 << slidx); + + return slot; +} + +void FreeEffectSlot(ALCcontext *context, ALeffectslot *slot) +{ + const ALuint id{slot->id - 1}; + const size_t lidx{id >> 6}; + const ALuint slidx{id & 0x3f}; + + al::destroy_at(slot); + + context->mEffectSlotList[lidx].FreeMask |= 1_u64 << slidx; + context->mNumEffectSlots--; +} + + +#define DO_UPDATEPROPS() do { \ + if(!context->mDeferUpdates.load(std::memory_order_acquire)) \ + UpdateEffectSlotProps(slot, context.get()); \ + else \ + slot->PropsClean.clear(std::memory_order_release); \ +} while(0) + +} // namespace + +ALeffectslotArray *ALeffectslot::CreatePtrArray(size_t count) noexcept +{ + /* Allocate space for twice as many pointers, so the mixer has scratch + * space to store a sorted list during mixing. + */ + void *ptr{al_calloc(alignof(ALeffectslotArray), ALeffectslotArray::Sizeof(count*2))}; + return new (ptr) ALeffectslotArray{count}; +} + + +AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Generating %d effect slots", n); + if UNLIKELY(n <= 0) return; + + std::unique_lock slotlock{context->mEffectSlotLock}; + ALCdevice *device{context->mDevice.get()}; + if(static_cast(n) > device->AuxiliaryEffectSlotMax-context->mNumEffectSlots) + { + context->setError(AL_OUT_OF_MEMORY, "Exceeding %u effect slot limit (%u + %d)", + device->AuxiliaryEffectSlotMax, context->mNumEffectSlots, n); + return; + } + if(!EnsureEffectSlots(context.get(), static_cast(n))) + { + context->setError(AL_OUT_OF_MEMORY, "Failed to allocate %d effectslot%s", n, + (n==1) ? "" : "s"); + return; + } + + if(n == 1) + { + ALeffectslot *slot{AllocEffectSlot(context.get())}; + if(!slot) return; + effectslots[0] = slot->id; + } + else + { + al::vector ids; + ALsizei count{n}; + ids.reserve(static_cast(count)); + do { + ALeffectslot *slot{AllocEffectSlot(context.get())}; + if(!slot) + { + slotlock.unlock(); + alDeleteAuxiliaryEffectSlots(static_cast(ids.size()), ids.data()); + return; + } + ids.emplace_back(slot->id); + } while(--count); + std::copy(ids.cbegin(), ids.cend(), effectslots); + } + + AddActiveEffectSlots(effectslots, static_cast(n), context.get()); +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Deleting %d effect slots", n); + if UNLIKELY(n <= 0) return; + + std::lock_guard _{context->mEffectSlotLock}; + auto validate_slot = [&context](const ALuint id) -> bool + { + ALeffectslot *slot{LookupEffectSlot(context.get(), id)}; + if UNLIKELY(!slot) + { + context->setError(AL_INVALID_NAME, "Invalid effect slot ID %u", id); + return false; + } + if UNLIKELY(ReadRef(slot->ref) != 0) + { + context->setError(AL_INVALID_OPERATION, "Deleting in-use effect slot %u", id); + return false; + } + return true; + }; + auto effectslots_end = effectslots + n; + auto bad_slot = std::find_if_not(effectslots, effectslots_end, validate_slot); + if UNLIKELY(bad_slot != effectslots_end) return; + + // All effectslots are valid, remove and delete them + RemoveActiveEffectSlots(effectslots, static_cast(n), context.get()); + auto delete_slot = [&context](const ALuint sid) -> void + { + ALeffectslot *slot{LookupEffectSlot(context.get(), sid)}; + if(slot) FreeEffectSlot(context.get(), slot); + }; + std::for_each(effectslots, effectslots_end, delete_slot); +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if LIKELY(context) + { + std::lock_guard _{context->mEffectSlotLock}; + if(LookupEffectSlot(context.get(), effectslot) != nullptr) + return AL_TRUE; + } + return AL_FALSE; +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + ALeffectslot *target{}; + ALCdevice *device{}; + ALenum err{}; + switch(param) + { + case AL_EFFECTSLOT_EFFECT: + device = context->mDevice.get(); + + { std::lock_guard ___{device->EffectLock}; + ALeffect *effect{value ? LookupEffect(device, static_cast(value)) : nullptr}; + if(!(value == 0 || effect != nullptr)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid effect ID %u", value); + err = InitializeEffect(context.get(), slot, effect); + } + if(err != AL_NO_ERROR) + { + context->setError(err, "Effect initialization failed"); + return; + } + break; + + case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: + if(!(value == AL_TRUE || value == AL_FALSE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, + "Effect slot auxiliary send auto out of range"); + slot->AuxSendAuto = static_cast(value); + break; + + case AL_EFFECTSLOT_TARGET_SOFT: + target = LookupEffectSlot(context.get(), static_cast(value)); + if(value && !target) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid effect slot target ID"); + if(target) + { + ALeffectslot *checker{target}; + while(checker && checker != slot) + checker = checker->Target; + if(checker) + SETERR_RETURN(context, AL_INVALID_OPERATION,, + "Setting target of effect slot ID %u to %u creates circular chain", slot->id, + target->id); + } + + if(ALeffectslot *oldtarget{slot->Target}) + { + /* We must force an update if there was an existing effect slot + * target, in case it's about to be deleted. + */ + if(target) IncrementRef(target->ref); + DecrementRef(oldtarget->ref); + slot->Target = target; + UpdateEffectSlotProps(slot, context.get()); + return; + } + + if(target) IncrementRef(target->ref); + slot->Target = target; + break; + + default: + SETERR_RETURN(context, AL_INVALID_ENUM,, "Invalid effect slot integer property 0x%04x", + param); + } + DO_UPDATEPROPS(); +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_EFFECTSLOT_EFFECT: + case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: + case AL_EFFECTSLOT_TARGET_SOFT: + alAuxiliaryEffectSloti(effectslot, param, values[0]); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + default: + SETERR_RETURN(context, AL_INVALID_ENUM,, + "Invalid effect slot integer-vector property 0x%04x", param); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + case AL_EFFECTSLOT_GAIN: + if(!(value >= 0.0f && value <= 1.0f)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Effect slot gain out of range"); + slot->Gain = value; + break; + + default: + SETERR_RETURN(context, AL_INVALID_ENUM,, "Invalid effect slot float property 0x%04x", + param); + } + DO_UPDATEPROPS(); +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *values) +START_API_FUNC +{ + switch(param) + { + case AL_EFFECTSLOT_GAIN: + alAuxiliaryEffectSlotf(effectslot, param, values[0]); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + default: + SETERR_RETURN(context, AL_INVALID_ENUM,, + "Invalid effect slot float-vector property 0x%04x", param); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: + *value = slot->AuxSendAuto; + break; + + case AL_EFFECTSLOT_TARGET_SOFT: + if(auto *target = slot->Target) + *value = static_cast(target->id); + else + *value = 0; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid effect slot integer property 0x%04x", param); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_EFFECTSLOT_EFFECT: + case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: + case AL_EFFECTSLOT_TARGET_SOFT: + alGetAuxiliaryEffectSloti(effectslot, param, values); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid effect slot integer-vector property 0x%04x", + param); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + case AL_EFFECTSLOT_GAIN: + *value = slot->Gain; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid effect slot float property 0x%04x", param); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *values) +START_API_FUNC +{ + switch(param) + { + case AL_EFFECTSLOT_GAIN: + alGetAuxiliaryEffectSlotf(effectslot, param, values); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslot *slot = LookupEffectSlot(context.get(), effectslot); + if UNLIKELY(!slot) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid effect slot ID %u", effectslot); + + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid effect slot float-vector property 0x%04x", + param); + } +} +END_API_FUNC + + +ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect) +{ + ALenum newtype{effect ? effect->type : AL_EFFECT_NULL}; + if(newtype != EffectSlot->Effect.Type) + { + EffectStateFactory *factory{getFactoryByType(newtype)}; + if(!factory) + { + ERR("Failed to find factory for effect type 0x%04x\n", newtype); + return AL_INVALID_ENUM; + } + EffectState *State{factory->create()}; + if(!State) return AL_OUT_OF_MEMORY; + + FPUCtl mixer_mode{}; + ALCdevice *Device{Context->mDevice.get()}; + std::unique_lock statelock{Device->StateLock}; + State->mOutTarget = Device->Dry.Buffer; + if(State->deviceUpdate(Device) == AL_FALSE) + { + statelock.unlock(); + mixer_mode.leave(); + State->release(); + return AL_OUT_OF_MEMORY; + } + mixer_mode.leave(); + + if(!effect) + { + EffectSlot->Effect.Type = AL_EFFECT_NULL; + EffectSlot->Effect.Props = EffectProps {}; + } + else + { + EffectSlot->Effect.Type = effect->type; + EffectSlot->Effect.Props = effect->Props; + } + + EffectSlot->Effect.State->release(); + EffectSlot->Effect.State = State; + } + else if(effect) + EffectSlot->Effect.Props = effect->Props; + + /* Remove state references from old effect slot property updates. */ + ALeffectslotProps *props{Context->mFreeEffectslotProps.load()}; + while(props) + { + if(props->State) + props->State->release(); + props->State = nullptr; + props = props->next.load(std::memory_order_relaxed); + } + + return AL_NO_ERROR; +} + + +ALenum InitEffectSlot(ALeffectslot *slot) +{ + EffectStateFactory *factory{getFactoryByType(slot->Effect.Type)}; + if(!factory) return AL_INVALID_VALUE; + slot->Effect.State = factory->create(); + if(!slot->Effect.State) return AL_OUT_OF_MEMORY; + + slot->Effect.State->add_ref(); + slot->Params.mEffectState = slot->Effect.State; + return AL_NO_ERROR; +} + +ALeffectslot::~ALeffectslot() +{ + if(Target) + DecrementRef(Target->ref); + Target = nullptr; + + ALeffectslotProps *props{Params.Update.load()}; + if(props) + { + if(props->State) props->State->release(); + TRACE("Freed unapplied AuxiliaryEffectSlot update %p\n", + decltype(std::declval()){props}); + delete props; + } + + if(Effect.State) + Effect.State->release(); + if(Params.mEffectState) + Params.mEffectState->release(); +} + +void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context) +{ + /* Get an unused property container, or allocate a new one as needed. */ + ALeffectslotProps *props{context->mFreeEffectslotProps.load(std::memory_order_relaxed)}; + if(!props) + props = new ALeffectslotProps{}; + else + { + ALeffectslotProps *next; + do { + next = props->next.load(std::memory_order_relaxed); + } while(context->mFreeEffectslotProps.compare_exchange_weak(props, next, + std::memory_order_seq_cst, std::memory_order_acquire) == 0); + } + + /* Copy in current property values. */ + props->Gain = slot->Gain; + props->AuxSendAuto = slot->AuxSendAuto; + props->Target = slot->Target; + + props->Type = slot->Effect.Type; + props->Props = slot->Effect.Props; + /* Swap out any stale effect state object there may be in the container, to + * delete it. + */ + EffectState *oldstate{props->State}; + slot->Effect.State->add_ref(); + props->State = slot->Effect.State; + + /* Set the new container for updating internal parameters. */ + props = slot->Params.Update.exchange(props, std::memory_order_acq_rel); + if(props) + { + /* If there was an unused update container, put it back in the + * freelist. + */ + if(props->State) + props->State->release(); + props->State = nullptr; + AtomicReplaceHead(context->mFreeEffectslotProps, props); + } + + if(oldstate) + oldstate->release(); +} + +void UpdateAllEffectSlotProps(ALCcontext *context) +{ + std::lock_guard _{context->mEffectSlotLock}; + ALeffectslotArray *auxslots{context->mActiveAuxSlots.load(std::memory_order_acquire)}; + for(ALeffectslot *slot : *auxslots) + { + if(!slot->PropsClean.test_and_set(std::memory_order_acq_rel)) + UpdateEffectSlotProps(slot, context); + } +} + +EffectSlotSubList::~EffectSlotSubList() +{ + uint64_t usemask{~FreeMask}; + while(usemask) + { + ALsizei idx{CTZ64(usemask)}; + al::destroy_at(EffectSlots+idx); + usemask &= ~(1_u64 << idx); + } + FreeMask = ~usemask; + al_free(EffectSlots); + EffectSlots = nullptr; +} diff --git a/al/auxeffectslot.h b/al/auxeffectslot.h new file mode 100644 index 0000000..2471447 --- /dev/null +++ b/al/auxeffectslot.h @@ -0,0 +1,105 @@ +#ifndef AL_AUXEFFECTSLOT_H +#define AL_AUXEFFECTSLOT_H + +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "alcmain.h" +#include "almalloc.h" +#include "atomic.h" +#include "effects/base.h" +#include "vector.h" + +struct ALeffect; +struct ALeffectslot; + + +using ALeffectslotArray = al::FlexArray; + + +struct ALeffectslotProps { + ALfloat Gain; + ALboolean AuxSendAuto; + ALeffectslot *Target; + + ALenum Type; + EffectProps Props; + + EffectState *State; + + std::atomic next; + + DEF_NEWDEL(ALeffectslotProps) +}; + + +struct ALeffectslot { + ALfloat Gain{1.0f}; + ALboolean AuxSendAuto{AL_TRUE}; + ALeffectslot *Target{nullptr}; + + struct { + ALenum Type{AL_EFFECT_NULL}; + EffectProps Props{}; + + EffectState *State{nullptr}; + } Effect; + + std::atomic_flag PropsClean; + + RefCount ref{0u}; + + struct { + std::atomic Update{nullptr}; + + ALfloat Gain{1.0f}; + ALboolean AuxSendAuto{AL_TRUE}; + ALeffectslot *Target{nullptr}; + + ALenum EffectType{AL_EFFECT_NULL}; + EffectProps mEffectProps{}; + EffectState *mEffectState{nullptr}; + + ALfloat RoomRolloff{0.0f}; /* Added to the source's room rolloff, not multiplied. */ + ALfloat DecayTime{0.0f}; + ALfloat DecayLFRatio{0.0f}; + ALfloat DecayHFRatio{0.0f}; + ALboolean DecayHFLimit{AL_FALSE}; + ALfloat AirAbsorptionGainHF{1.0f}; + } Params; + + /* Self ID */ + ALuint id{}; + + /* Mixing buffer used by the Wet mix. */ + al::vector MixBuffer; + + /* Wet buffer configuration is ACN channel order with N3D scaling. + * Consequently, effects that only want to work with mono input can use + * channel 0 by itself. Effects that want multichannel can process the + * ambisonics signal and make a B-Format source pan. + */ + MixParams Wet; + + ALeffectslot() { PropsClean.test_and_set(std::memory_order_relaxed); } + ALeffectslot(const ALeffectslot&) = delete; + ALeffectslot& operator=(const ALeffectslot&) = delete; + ~ALeffectslot(); + + static ALeffectslotArray *CreatePtrArray(size_t count) noexcept; + + DEF_NEWDEL(ALeffectslot) +}; + +ALenum InitEffectSlot(ALeffectslot *slot); +void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context); +void UpdateAllEffectSlotProps(ALCcontext *context); + + +ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect); + +#endif diff --git a/al/buffer.cpp b/al/buffer.cpp new file mode 100644 index 0000000..de8abeb --- /dev/null +++ b/al/buffer.cpp @@ -0,0 +1,1422 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "buffer.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" + +#include "albyte.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "atomic.h" +#include "inprogext.h" +#include "opthelpers.h" + + +namespace { + +/* IMA ADPCM Stepsize table */ +constexpr int IMAStep_size[89] = { + 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, + 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, + 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, + 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, + 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, + 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, + 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442, + 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794, + 32767 +}; + +/* IMA4 ADPCM Codeword decode table */ +constexpr int IMA4Codeword[16] = { + 1, 3, 5, 7, 9, 11, 13, 15, + -1,-3,-5,-7,-9,-11,-13,-15, +}; + +/* IMA4 ADPCM Step index adjust decode table */ +constexpr int IMA4Index_adjust[16] = { + -1,-1,-1,-1, 2, 4, 6, 8, + -1,-1,-1,-1, 2, 4, 6, 8 +}; + + +/* MSADPCM Adaption table */ +constexpr int MSADPCMAdaption[16] = { + 230, 230, 230, 230, 307, 409, 512, 614, + 768, 614, 512, 409, 307, 230, 230, 230 +}; + +/* MSADPCM Adaption Coefficient tables */ +constexpr int MSADPCMAdaptionCoeff[7][2] = { + { 256, 0 }, + { 512, -256 }, + { 0, 0 }, + { 192, 64 }, + { 240, 0 }, + { 460, -208 }, + { 392, -232 } +}; + + +void DecodeIMA4Block(ALshort *dst, const al::byte *src, size_t numchans, size_t align) +{ + ALint sample[MAX_INPUT_CHANNELS]{}; + ALint index[MAX_INPUT_CHANNELS]{}; + ALuint code[MAX_INPUT_CHANNELS]{}; + + for(size_t c{0};c < numchans;c++) + { + sample[c] = al::to_integer(src[0]) | (al::to_integer(src[1])<<8); + sample[c] = (sample[c]^0x8000) - 32768; + src += 2; + index[c] = al::to_integer(src[0]) | (al::to_integer(src[1])<<8); + index[c] = clampi((index[c]^0x8000) - 32768, 0, 88); + src += 2; + + *(dst++) = static_cast(sample[c]); + } + + for(size_t i{1};i < align;i++) + { + if((i&7) == 1) + { + for(size_t c{0};c < numchans;c++) + { + code[c] = al::to_integer(src[0]) | (al::to_integer(src[1])<< 8) | + (al::to_integer(src[2])<<16) | (al::to_integer(src[3])<<24); + src += 4; + } + } + + for(size_t c{0};c < numchans;c++) + { + const ALuint nibble{code[c]&0xf}; + code[c] >>= 4; + + sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8; + sample[c] = clampi(sample[c], -32768, 32767); + + index[c] += IMA4Index_adjust[nibble]; + index[c] = clampi(index[c], 0, 88); + + *(dst++) = static_cast(sample[c]); + } + } +} + +void DecodeMSADPCMBlock(ALshort *dst, const al::byte *src, size_t numchans, size_t align) +{ + ALubyte blockpred[MAX_INPUT_CHANNELS]{}; + ALint delta[MAX_INPUT_CHANNELS]{}; + ALshort samples[MAX_INPUT_CHANNELS][2]{}; + + for(size_t c{0};c < numchans;c++) + { + blockpred[c] = std::min(al::to_integer(src[0]), 6); + ++src; + } + for(size_t c{0};c < numchans;c++) + { + delta[c] = al::to_integer(src[0]) | (al::to_integer(src[1])<<8); + delta[c] = (delta[c]^0x8000) - 32768; + src += 2; + } + for(size_t c{0};c < numchans;c++) + { + samples[c][0] = static_cast(al::to_integer(src[0]) | + (al::to_integer(src[1])<<8)); + src += 2; + } + for(size_t c{0};c < numchans;c++) + { + samples[c][1] = static_cast(al::to_integer(src[0]) | + (al::to_integer(src[1])<<8)); + src += 2; + } + + /* Second sample is written first. */ + for(size_t c{0};c < numchans;c++) + *(dst++) = samples[c][1]; + for(size_t c{0};c < numchans;c++) + *(dst++) = samples[c][0]; + + int num{0}; + for(size_t i{2};i < align;i++) + { + for(size_t c{0};c < numchans;c++) + { + /* Read the nibble (first is in the upper bits). */ + al::byte nibble; + if(!(num++ & 1)) + nibble = *src >> 4; + else + nibble = *(src++) & 0x0f; + + ALint pred{(samples[c][0]*MSADPCMAdaptionCoeff[blockpred[c]][0] + + samples[c][1]*MSADPCMAdaptionCoeff[blockpred[c]][1]) / 256}; + pred += (al::to_integer(nibble^0x08) - 0x08) * delta[c]; + pred = clampi(pred, -32768, 32767); + + samples[c][1] = samples[c][0]; + samples[c][0] = static_cast(pred); + + delta[c] = (MSADPCMAdaption[al::to_integer(nibble)] * delta[c]) / 256; + delta[c] = maxi(16, delta[c]); + + *(dst++) = static_cast(pred); + } + } +} + +void Convert_ALshort_ALima4(ALshort *dst, const al::byte *src, size_t numchans, size_t len, + size_t align) +{ + const size_t byte_align{((align-1)/2 + 4) * numchans}; + + len /= align; + while(len--) + { + DecodeIMA4Block(dst, src, numchans, align); + src += byte_align; + dst += align*numchans; + } +} + +void Convert_ALshort_ALmsadpcm(ALshort *dst, const al::byte *src, size_t numchans, size_t len, + size_t align) +{ + const size_t byte_align{((align-2)/2 + 7) * numchans}; + + len /= align; + while(len--) + { + DecodeMSADPCMBlock(dst, src, numchans, align); + src += byte_align; + dst += align*numchans; + } +} + + +ALuint BytesFromUserFmt(UserFmtType type) +{ + switch(type) + { + case UserFmtUByte: return sizeof(ALubyte); + case UserFmtShort: return sizeof(ALshort); + case UserFmtFloat: return sizeof(ALfloat); + case UserFmtDouble: return sizeof(ALdouble); + case UserFmtMulaw: return sizeof(ALubyte); + case UserFmtAlaw: return sizeof(ALubyte); + case UserFmtIMA4: break; /* not handled here */ + case UserFmtMSADPCM: break; /* not handled here */ + } + return 0; +} +ALuint ChannelsFromUserFmt(UserFmtChannels chans) +{ + switch(chans) + { + case UserFmtMono: return 1; + case UserFmtStereo: return 2; + case UserFmtRear: return 2; + case UserFmtQuad: return 4; + case UserFmtX51: return 6; + case UserFmtX61: return 7; + case UserFmtX71: return 8; + case UserFmtBFormat2D: return 3; + case UserFmtBFormat3D: return 4; + } + return 0; +} +inline ALuint FrameSizeFromUserFmt(UserFmtChannels chans, UserFmtType type) +{ return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type); } + + +constexpr ALbitfieldSOFT INVALID_STORAGE_MASK{~unsigned(AL_MAP_READ_BIT_SOFT | + AL_MAP_WRITE_BIT_SOFT | AL_MAP_PERSISTENT_BIT_SOFT | AL_PRESERVE_DATA_BIT_SOFT)}; +constexpr ALbitfieldSOFT MAP_READ_WRITE_FLAGS{AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT}; +constexpr ALbitfieldSOFT INVALID_MAP_FLAGS{~unsigned(AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT | + AL_MAP_PERSISTENT_BIT_SOFT)}; + + +bool EnsureBuffers(ALCdevice *device, size_t needed) +{ + size_t count{std::accumulate(device->BufferList.cbegin(), device->BufferList.cend(), size_t{0}, + [](size_t cur, const BufferSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(sublist.FreeMask)); } + )}; + + while(needed > count) + { + if UNLIKELY(device->BufferList.size() >= 1<<25) + return false; + + device->BufferList.emplace_back(); + auto sublist = device->BufferList.end() - 1; + sublist->FreeMask = ~0_u64; + sublist->Buffers = static_cast(al_calloc(alignof(ALbuffer), sizeof(ALbuffer)*64)); + if UNLIKELY(!sublist->Buffers) + { + device->BufferList.pop_back(); + return false; + } + count += 64; + } + return true; +} + +ALbuffer *AllocBuffer(ALCdevice *device) +{ + auto sublist = std::find_if(device->BufferList.begin(), device->BufferList.end(), + [](const BufferSubList &entry) noexcept -> bool + { return entry.FreeMask != 0; } + ); + + auto lidx = static_cast(std::distance(device->BufferList.begin(), sublist)); + auto slidx = static_cast(CTZ64(sublist->FreeMask)); + + ALbuffer *buffer{::new (sublist->Buffers + slidx) ALbuffer{}}; + + /* Add 1 to avoid buffer ID 0. */ + buffer->id = ((lidx<<6) | slidx) + 1; + + sublist->FreeMask &= ~(1_u64 << slidx); + + return buffer; +} + +void FreeBuffer(ALCdevice *device, ALbuffer *buffer) +{ + const ALuint id{buffer->id - 1}; + const size_t lidx{id >> 6}; + const ALuint slidx{id & 0x3f}; + + al::destroy_at(buffer); + + device->BufferList[lidx].FreeMask |= 1_u64 << slidx; +} + +inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= device->BufferList.size()) + return nullptr; + BufferSubList &sublist = device->BufferList[lidx]; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Buffers + slidx; +} + + +ALuint SanitizeAlignment(UserFmtType type, ALuint align) +{ + if(align == 0) + { + if(type == UserFmtIMA4) + { + /* Here is where things vary: + * nVidia and Apple use 64+1 sample frames per block -> block_size=36 bytes per channel + * Most PC sound software uses 2040+1 sample frames per block -> block_size=1024 bytes per channel + */ + return 65; + } + if(type == UserFmtMSADPCM) + return 64; + return 1; + } + + if(type == UserFmtIMA4) + { + /* IMA4 block alignment must be a multiple of 8, plus 1. */ + if((align&7) == 1) return static_cast(align); + return 0; + } + if(type == UserFmtMSADPCM) + { + /* MSADPCM block alignment must be a multiple of 2. */ + if((align&1) == 0) return static_cast(align); + return 0; + } + + return static_cast(align); +} + + +const ALchar *NameFromUserFmtType(UserFmtType type) +{ + switch(type) + { + case UserFmtUByte: return "Unsigned Byte"; + case UserFmtShort: return "Signed Short"; + case UserFmtFloat: return "Float32"; + case UserFmtDouble: return "Float64"; + case UserFmtMulaw: return "muLaw"; + case UserFmtAlaw: return "aLaw"; + case UserFmtIMA4: return "IMA4 ADPCM"; + case UserFmtMSADPCM: return "MSADPCM"; + } + return ""; +} + +/** Loads the specified data into the buffer, using the specified format. */ +void LoadData(ALCcontext *context, ALbuffer *ALBuf, ALsizei freq, ALuint size, + UserFmtChannels SrcChannels, UserFmtType SrcType, const al::byte *SrcData, + ALbitfieldSOFT access) +{ + if UNLIKELY(ReadRef(ALBuf->ref) != 0 || ALBuf->MappedAccess != 0) + SETERR_RETURN(context, AL_INVALID_OPERATION,, "Modifying storage for in-use buffer %u", + ALBuf->id); + + /* Currently no channel configurations need to be converted. */ + FmtChannels DstChannels{FmtMono}; + switch(SrcChannels) + { + case UserFmtMono: DstChannels = FmtMono; break; + case UserFmtStereo: DstChannels = FmtStereo; break; + case UserFmtRear: DstChannels = FmtRear; break; + case UserFmtQuad: DstChannels = FmtQuad; break; + case UserFmtX51: DstChannels = FmtX51; break; + case UserFmtX61: DstChannels = FmtX61; break; + case UserFmtX71: DstChannels = FmtX71; break; + case UserFmtBFormat2D: DstChannels = FmtBFormat2D; break; + case UserFmtBFormat3D: DstChannels = FmtBFormat3D; break; + } + if UNLIKELY(static_cast(SrcChannels) != static_cast(DstChannels)) + SETERR_RETURN(context, AL_INVALID_ENUM, , "Invalid format"); + + /* IMA4 and MSADPCM convert to 16-bit short. */ + FmtType DstType{FmtUByte}; + switch(SrcType) + { + case UserFmtUByte: DstType = FmtUByte; break; + case UserFmtShort: DstType = FmtShort; break; + case UserFmtFloat: DstType = FmtFloat; break; + case UserFmtDouble: DstType = FmtDouble; break; + case UserFmtAlaw: DstType = FmtAlaw; break; + case UserFmtMulaw: DstType = FmtMulaw; break; + case UserFmtIMA4: DstType = FmtShort; break; + case UserFmtMSADPCM: DstType = FmtShort; break; + } + + /* TODO: Currently we can only map samples when they're not converted. To + * allow it would need some kind of double-buffering to hold onto a copy of + * the original data. + */ + if((access&MAP_READ_WRITE_FLAGS)) + { + if UNLIKELY(static_cast(SrcType) != static_cast(DstType)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "%s samples cannot be mapped", + NameFromUserFmtType(SrcType)); + } + + const ALuint unpackalign{ALBuf->UnpackAlign}; + const ALuint align{SanitizeAlignment(SrcType, unpackalign)}; + if UNLIKELY(align < 1) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid unpack alignment %u for %s samples", + unpackalign, NameFromUserFmtType(SrcType)); + + if((access&AL_PRESERVE_DATA_BIT_SOFT)) + { + /* Can only preserve data with the same format and alignment. */ + if UNLIKELY(ALBuf->mFmtChannels != DstChannels || ALBuf->OriginalType != SrcType) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Preserving data of mismatched format"); + if UNLIKELY(ALBuf->OriginalAlign != align) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Preserving data of mismatched alignment"); + } + + /* Convert the input/source size in bytes to sample frames using the unpack + * block alignment. + */ + const ALuint SrcByteAlign{ + (SrcType == UserFmtIMA4) ? ((align-1)/2 + 4) * ChannelsFromUserFmt(SrcChannels) : + (SrcType == UserFmtMSADPCM) ? ((align-2)/2 + 7) * ChannelsFromUserFmt(SrcChannels) : + (align * FrameSizeFromUserFmt(SrcChannels, SrcType)) + }; + if UNLIKELY((size%SrcByteAlign) != 0) + SETERR_RETURN(context, AL_INVALID_VALUE,, + "Data size %d is not a multiple of frame size %d (%d unpack alignment)", + size, SrcByteAlign, align); + + if UNLIKELY(size/SrcByteAlign > std::numeric_limits::max()/align) + SETERR_RETURN(context, AL_OUT_OF_MEMORY,, + "Buffer size overflow, %d blocks x %d samples per block", size/SrcByteAlign, align); + const ALuint frames{size / SrcByteAlign * align}; + + /* Convert the sample frames to the number of bytes needed for internal + * storage. + */ + ALuint NumChannels{ChannelsFromFmt(DstChannels)}; + ALuint FrameSize{NumChannels * BytesFromFmt(DstType)}; + if UNLIKELY(frames > std::numeric_limits::max()/FrameSize) + SETERR_RETURN(context, AL_OUT_OF_MEMORY,, + "Buffer size overflow, %d frames x %d bytes per frame", frames, FrameSize); + size_t newsize{static_cast(frames) * FrameSize}; + + /* Round up to the next 16-byte multiple. This could reallocate only when + * increasing or the new size is less than half the current, but then the + * buffer's AL_SIZE would not be very reliable for accounting buffer memory + * usage, and reporting the real size could cause problems for apps that + * use AL_SIZE to try to get the buffer's play length. + */ + newsize = RoundUp(newsize, 16); + if(newsize != ALBuf->mData.size()) + { + auto newdata = al::vector(newsize, al::byte{}); + if((access&AL_PRESERVE_DATA_BIT_SOFT)) + { + const size_t tocopy{minz(newdata.size(), ALBuf->mData.size())}; + std::copy_n(ALBuf->mData.begin(), tocopy, newdata.begin()); + } + ALBuf->mData = std::move(newdata); + } + + if(SrcType == UserFmtIMA4) + { + assert(DstType == FmtShort); + if(SrcData != nullptr && !ALBuf->mData.empty()) + Convert_ALshort_ALima4(reinterpret_cast(ALBuf->mData.data()), + SrcData, NumChannels, frames, align); + ALBuf->OriginalAlign = align; + } + else if(SrcType == UserFmtMSADPCM) + { + assert(DstType == FmtShort); + if(SrcData != nullptr && !ALBuf->mData.empty()) + Convert_ALshort_ALmsadpcm(reinterpret_cast(ALBuf->mData.data()), + SrcData, NumChannels, frames, align); + ALBuf->OriginalAlign = align; + } + else + { + assert(static_cast(SrcType) == static_cast(DstType)); + if(SrcData != nullptr && !ALBuf->mData.empty()) + std::copy_n(SrcData, frames*FrameSize, ALBuf->mData.begin()); + ALBuf->OriginalAlign = 1; + } + ALBuf->OriginalSize = size; + ALBuf->OriginalType = SrcType; + + ALBuf->Frequency = static_cast(freq); + ALBuf->mFmtChannels = DstChannels; + ALBuf->mFmtType = DstType; + ALBuf->Access = access; + + ALBuf->SampleLen = frames; + ALBuf->LoopStart = 0; + ALBuf->LoopEnd = ALBuf->SampleLen; +} + +struct DecompResult { UserFmtChannels channels; UserFmtType type; }; +al::optional DecomposeUserFormat(ALenum format) +{ + struct FormatMap { + ALenum format; + UserFmtChannels channels; + UserFmtType type; + }; + static const std::array UserFmtList{{ + { AL_FORMAT_MONO8, UserFmtMono, UserFmtUByte }, + { AL_FORMAT_MONO16, UserFmtMono, UserFmtShort }, + { AL_FORMAT_MONO_FLOAT32, UserFmtMono, UserFmtFloat }, + { AL_FORMAT_MONO_DOUBLE_EXT, UserFmtMono, UserFmtDouble }, + { AL_FORMAT_MONO_IMA4, UserFmtMono, UserFmtIMA4 }, + { AL_FORMAT_MONO_MSADPCM_SOFT, UserFmtMono, UserFmtMSADPCM }, + { AL_FORMAT_MONO_MULAW, UserFmtMono, UserFmtMulaw }, + { AL_FORMAT_MONO_ALAW_EXT, UserFmtMono, UserFmtAlaw }, + + { AL_FORMAT_STEREO8, UserFmtStereo, UserFmtUByte }, + { AL_FORMAT_STEREO16, UserFmtStereo, UserFmtShort }, + { AL_FORMAT_STEREO_FLOAT32, UserFmtStereo, UserFmtFloat }, + { AL_FORMAT_STEREO_DOUBLE_EXT, UserFmtStereo, UserFmtDouble }, + { AL_FORMAT_STEREO_IMA4, UserFmtStereo, UserFmtIMA4 }, + { AL_FORMAT_STEREO_MSADPCM_SOFT, UserFmtStereo, UserFmtMSADPCM }, + { AL_FORMAT_STEREO_MULAW, UserFmtStereo, UserFmtMulaw }, + { AL_FORMAT_STEREO_ALAW_EXT, UserFmtStereo, UserFmtAlaw }, + + { AL_FORMAT_REAR8, UserFmtRear, UserFmtUByte }, + { AL_FORMAT_REAR16, UserFmtRear, UserFmtShort }, + { AL_FORMAT_REAR32, UserFmtRear, UserFmtFloat }, + { AL_FORMAT_REAR_MULAW, UserFmtRear, UserFmtMulaw }, + + { AL_FORMAT_QUAD8_LOKI, UserFmtQuad, UserFmtUByte }, + { AL_FORMAT_QUAD16_LOKI, UserFmtQuad, UserFmtShort }, + + { AL_FORMAT_QUAD8, UserFmtQuad, UserFmtUByte }, + { AL_FORMAT_QUAD16, UserFmtQuad, UserFmtShort }, + { AL_FORMAT_QUAD32, UserFmtQuad, UserFmtFloat }, + { AL_FORMAT_QUAD_MULAW, UserFmtQuad, UserFmtMulaw }, + + { AL_FORMAT_51CHN8, UserFmtX51, UserFmtUByte }, + { AL_FORMAT_51CHN16, UserFmtX51, UserFmtShort }, + { AL_FORMAT_51CHN32, UserFmtX51, UserFmtFloat }, + { AL_FORMAT_51CHN_MULAW, UserFmtX51, UserFmtMulaw }, + + { AL_FORMAT_61CHN8, UserFmtX61, UserFmtUByte }, + { AL_FORMAT_61CHN16, UserFmtX61, UserFmtShort }, + { AL_FORMAT_61CHN32, UserFmtX61, UserFmtFloat }, + { AL_FORMAT_61CHN_MULAW, UserFmtX61, UserFmtMulaw }, + + { AL_FORMAT_71CHN8, UserFmtX71, UserFmtUByte }, + { AL_FORMAT_71CHN16, UserFmtX71, UserFmtShort }, + { AL_FORMAT_71CHN32, UserFmtX71, UserFmtFloat }, + { AL_FORMAT_71CHN_MULAW, UserFmtX71, UserFmtMulaw }, + + { AL_FORMAT_BFORMAT2D_8, UserFmtBFormat2D, UserFmtUByte }, + { AL_FORMAT_BFORMAT2D_16, UserFmtBFormat2D, UserFmtShort }, + { AL_FORMAT_BFORMAT2D_FLOAT32, UserFmtBFormat2D, UserFmtFloat }, + { AL_FORMAT_BFORMAT2D_MULAW, UserFmtBFormat2D, UserFmtMulaw }, + + { AL_FORMAT_BFORMAT3D_8, UserFmtBFormat3D, UserFmtUByte }, + { AL_FORMAT_BFORMAT3D_16, UserFmtBFormat3D, UserFmtShort }, + { AL_FORMAT_BFORMAT3D_FLOAT32, UserFmtBFormat3D, UserFmtFloat }, + { AL_FORMAT_BFORMAT3D_MULAW, UserFmtBFormat3D, UserFmtMulaw }, + }}; + + for(const auto &fmt : UserFmtList) + { + if(fmt.format == format) + return al::make_optional({fmt.channels, fmt.type}); + } + return al::nullopt; +} + +} // namespace + + +AL_API ALvoid AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Generating %d buffers", n); + if UNLIKELY(n <= 0) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + if(!EnsureBuffers(device, static_cast(n))) + { + context->setError(AL_OUT_OF_MEMORY, "Failed to allocate %d buffer%s", n, (n==1)?"":"s"); + return; + } + + if LIKELY(n == 1) + { + /* Special handling for the easy and normal case. */ + ALbuffer *buffer{AllocBuffer(device)}; + buffers[0] = buffer->id; + } + else + { + /* Store the allocated buffer IDs in a separate local list, to avoid + * modifying the user storage in case of failure. + */ + al::vector ids; + ids.reserve(static_cast(n)); + do { + ALbuffer *buffer{AllocBuffer(device)}; + ids.emplace_back(buffer->id); + } while(--n); + std::copy(ids.begin(), ids.end(), buffers); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Deleting %d buffers", n); + if UNLIKELY(n <= 0) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + /* First try to find any buffers that are invalid or in-use. */ + auto validate_buffer = [device, &context](const ALuint bid) -> bool + { + if(!bid) return true; + ALbuffer *ALBuf{LookupBuffer(device, bid)}; + if UNLIKELY(!ALBuf) + { + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", bid); + return false; + } + if UNLIKELY(ReadRef(ALBuf->ref) != 0) + { + context->setError(AL_INVALID_OPERATION, "Deleting in-use buffer %u", bid); + return false; + } + return true; + }; + const ALuint *buffers_end = buffers + n; + auto invbuf = std::find_if_not(buffers, buffers_end, validate_buffer); + if UNLIKELY(invbuf != buffers_end) return; + + /* All good. Delete non-0 buffer IDs. */ + auto delete_buffer = [device](const ALuint bid) -> void + { + ALbuffer *buffer{bid ? LookupBuffer(device, bid) : nullptr}; + if(buffer) FreeBuffer(device, buffer); + }; + std::for_each(buffers, buffers_end, delete_buffer); +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if LIKELY(context) + { + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + if(!buffer || LookupBuffer(device, buffer)) + return AL_TRUE; + } + return AL_FALSE; +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq) +START_API_FUNC +{ alBufferStorageSOFT(buffer, format, data, size, freq, 0); } +END_API_FUNC + +AL_API void AL_APIENTRY alBufferStorageSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq, ALbitfieldSOFT flags) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(size < 0) + context->setError(AL_INVALID_VALUE, "Negative storage size %d", size); + else if UNLIKELY(freq < 1) + context->setError(AL_INVALID_VALUE, "Invalid sample rate %d", freq); + else if UNLIKELY((flags&INVALID_STORAGE_MASK) != 0) + context->setError(AL_INVALID_VALUE, "Invalid storage flags 0x%x", + flags&INVALID_STORAGE_MASK); + else if UNLIKELY((flags&AL_MAP_PERSISTENT_BIT_SOFT) && !(flags&MAP_READ_WRITE_FLAGS)) + context->setError(AL_INVALID_VALUE, + "Declaring persistently mapped storage without read or write access"); + else + { + auto usrfmt = DecomposeUserFormat(format); + if UNLIKELY(!usrfmt) + context->setError(AL_INVALID_ENUM, "Invalid format 0x%04x", format); + else + LoadData(context.get(), albuf, freq, static_cast(size), usrfmt->channels, + usrfmt->type, static_cast(data), flags); + } +} +END_API_FUNC + +AL_API void* AL_APIENTRY alMapBufferSOFT(ALuint buffer, ALsizei offset, ALsizei length, ALbitfieldSOFT access) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return nullptr; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY((access&INVALID_MAP_FLAGS) != 0) + context->setError(AL_INVALID_VALUE, "Invalid map flags 0x%x", access&INVALID_MAP_FLAGS); + else if UNLIKELY(!(access&MAP_READ_WRITE_FLAGS)) + context->setError(AL_INVALID_VALUE, "Mapping buffer %u without read or write access", + buffer); + else + { + ALbitfieldSOFT unavailable = (albuf->Access^access) & access; + if UNLIKELY(ReadRef(albuf->ref) != 0 && !(access&AL_MAP_PERSISTENT_BIT_SOFT)) + context->setError(AL_INVALID_OPERATION, + "Mapping in-use buffer %u without persistent mapping", buffer); + else if UNLIKELY(albuf->MappedAccess != 0) + context->setError(AL_INVALID_OPERATION, "Mapping already-mapped buffer %u", buffer); + else if UNLIKELY((unavailable&AL_MAP_READ_BIT_SOFT)) + context->setError(AL_INVALID_VALUE, + "Mapping buffer %u for reading without read access", buffer); + else if UNLIKELY((unavailable&AL_MAP_WRITE_BIT_SOFT)) + context->setError(AL_INVALID_VALUE, + "Mapping buffer %u for writing without write access", buffer); + else if UNLIKELY((unavailable&AL_MAP_PERSISTENT_BIT_SOFT)) + context->setError(AL_INVALID_VALUE, + "Mapping buffer %u persistently without persistent access", buffer); + else if UNLIKELY(offset < 0 || length <= 0 + || static_cast(offset) >= albuf->OriginalSize + || static_cast(length) > albuf->OriginalSize - static_cast(offset)) + context->setError(AL_INVALID_VALUE, "Mapping invalid range %d+%d for buffer %u", + offset, length, buffer); + else + { + void *retval = albuf->mData.data() + offset; + albuf->MappedAccess = access; + albuf->MappedOffset = offset; + albuf->MappedSize = length; + return retval; + } + } + + return nullptr; +} +END_API_FUNC + +AL_API void AL_APIENTRY alUnmapBufferSOFT(ALuint buffer) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(albuf->MappedAccess == 0) + context->setError(AL_INVALID_OPERATION, "Unmapping unmapped buffer %u", buffer); + else + { + albuf->MappedAccess = 0; + albuf->MappedOffset = 0; + albuf->MappedSize = 0; + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alFlushMappedBufferSOFT(ALuint buffer, ALsizei offset, ALsizei length) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!(albuf->MappedAccess&AL_MAP_WRITE_BIT_SOFT)) + context->setError(AL_INVALID_OPERATION, "Flushing buffer %u while not mapped for writing", + buffer); + else if UNLIKELY(offset < albuf->MappedOffset || length <= 0 + || offset >= albuf->MappedOffset+albuf->MappedSize + || length > albuf->MappedOffset+albuf->MappedSize-offset) + context->setError(AL_INVALID_VALUE, "Flushing invalid range %d+%d on buffer %u", offset, + length, buffer); + else + { + /* FIXME: Need to use some method of double-buffering for the mixer and + * app to hold separate memory, which can be safely transfered + * asynchronously. Currently we just say the app shouldn't write where + * OpenAL's reading, and hope for the best... + */ + std::atomic_thread_fence(std::memory_order_seq_cst); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + { + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + return; + } + + auto usrfmt = DecomposeUserFormat(format); + if UNLIKELY(!usrfmt) + { + context->setError(AL_INVALID_ENUM, "Invalid format 0x%04x", format); + return; + } + + ALuint unpack_align{albuf->UnpackAlign}; + ALuint align{SanitizeAlignment(usrfmt->type, unpack_align)}; + if UNLIKELY(align < 1) + context->setError(AL_INVALID_VALUE, "Invalid unpack alignment %u", unpack_align); + else if UNLIKELY(long{usrfmt->channels} != long{albuf->mFmtChannels} + || usrfmt->type != albuf->OriginalType) + context->setError(AL_INVALID_ENUM, "Unpacking data with mismatched format"); + else if UNLIKELY(align != albuf->OriginalAlign) + context->setError(AL_INVALID_VALUE, + "Unpacking data with alignment %u does not match original alignment %u", align, + albuf->OriginalAlign); + else if UNLIKELY(albuf->MappedAccess != 0) + context->setError(AL_INVALID_OPERATION, "Unpacking data into mapped buffer %u", buffer); + else + { + ALuint num_chans{albuf->channelsFromFmt()}; + ALuint frame_size{num_chans * albuf->bytesFromFmt()}; + ALuint byte_align{ + (albuf->OriginalType == UserFmtIMA4) ? ((align-1)/2 + 4) * num_chans : + (albuf->OriginalType == UserFmtMSADPCM) ? ((align-2)/2 + 7) * num_chans : + (align * frame_size) + }; + + if UNLIKELY(offset < 0 || length < 0 || static_cast(offset) > albuf->OriginalSize + || static_cast(length) > albuf->OriginalSize-static_cast(offset)) + context->setError(AL_INVALID_VALUE, "Invalid data sub-range %d+%d on buffer %u", + offset, length, buffer); + else if UNLIKELY((static_cast(offset)%byte_align) != 0) + context->setError(AL_INVALID_VALUE, + "Sub-range offset %d is not a multiple of frame size %d (%d unpack alignment)", + offset, byte_align, align); + else if UNLIKELY((static_cast(length)%byte_align) != 0) + context->setError(AL_INVALID_VALUE, + "Sub-range length %d is not a multiple of frame size %d (%d unpack alignment)", + length, byte_align, align); + else + { + /* offset -> byte offset, length -> sample count */ + size_t byteoff{static_cast(offset)/byte_align * align * frame_size}; + size_t samplen{static_cast(length)/byte_align * align}; + + void *dst = albuf->mData.data() + byteoff; + if(usrfmt->type == UserFmtIMA4 && albuf->mFmtType == FmtShort) + Convert_ALshort_ALima4(static_cast(dst), + static_cast(data), num_chans, samplen, align); + else if(usrfmt->type == UserFmtMSADPCM && albuf->mFmtType == FmtShort) + Convert_ALshort_ALmsadpcm(static_cast(dst), + static_cast(data), num_chans, samplen, align); + else + { + assert(long{usrfmt->type} == long{albuf->mFmtType}); + memcpy(dst, data, size_t{samplen} * frame_size); + } + } + } +} +END_API_FUNC + + +AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint /*buffer*/, ALuint /*samplerate*/, + ALenum /*internalformat*/, ALsizei /*samples*/, ALenum /*channels*/, ALenum /*type*/, + const ALvoid* /*data*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + context->setError(AL_INVALID_OPERATION, "alBufferSamplesSOFT not supported"); +} +END_API_FUNC + +AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint /*buffer*/, ALsizei /*offset*/, + ALsizei /*samples*/, ALenum /*channels*/, ALenum /*type*/, const ALvoid* /*data*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + context->setError(AL_INVALID_OPERATION, "alBufferSubSamplesSOFT not supported"); +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint /*buffer*/, ALsizei /*offset*/, + ALsizei /*samples*/, ALenum /*channels*/, ALenum /*type*/, ALvoid* /*data*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + context->setError(AL_INVALID_OPERATION, "alGetBufferSamplesSOFT not supported"); +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum /*format*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return AL_FALSE; + + context->setError(AL_INVALID_OPERATION, "alIsBufferFormatSupportedSOFT not supported"); + return AL_FALSE; +} +END_API_FUNC + + +AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat /*value*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer float property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, + ALfloat /*value1*/, ALfloat /*value2*/, ALfloat /*value3*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer 3-float property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer float-vector property 0x%04x", param); + } +} +END_API_FUNC + + +AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + if UNLIKELY(value < 0) + context->setError(AL_INVALID_VALUE, "Invalid unpack block alignment %d", value); + else + albuf->UnpackAlign = static_cast(value); + break; + + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + if UNLIKELY(value < 0) + context->setError(AL_INVALID_VALUE, "Invalid pack block alignment %d", value); + else + albuf->PackAlign = static_cast(value); + break; + + case AL_AMBISONIC_LAYOUT_SOFT: + if UNLIKELY(ReadRef(albuf->ref) != 0) + context->setError(AL_INVALID_OPERATION, "Modifying in-use buffer %u's ambisonic layout", + buffer); + else if UNLIKELY(value != AL_FUMA_SOFT && value != AL_ACN_SOFT) + context->setError(AL_INVALID_VALUE, "Invalid unpack ambisonic layout %04x", value); + else + albuf->AmbiLayout = value; + break; + + case AL_AMBISONIC_SCALING_SOFT: + if UNLIKELY(ReadRef(albuf->ref) != 0) + context->setError(AL_INVALID_OPERATION, "Modifying in-use buffer %u's ambisonic scaling", + buffer); + else if UNLIKELY(value != AL_FUMA_SOFT && value != AL_SN3D_SOFT && value != AL_N3D_SOFT) + context->setError(AL_INVALID_VALUE, "Invalid unpack ambisonic scaling %04x", value); + else + albuf->AmbiScaling = value; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, + ALint /*value1*/, ALint /*value2*/, ALint /*value3*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer 3-integer property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values) +START_API_FUNC +{ + if(values) + { + switch(param) + { + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + case AL_AMBISONIC_LAYOUT_SOFT: + case AL_AMBISONIC_SCALING_SOFT: + alBufferi(buffer, param, values[0]); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_LOOP_POINTS_SOFT: + if UNLIKELY(ReadRef(albuf->ref) != 0) + context->setError(AL_INVALID_OPERATION, "Modifying in-use buffer %u's loop points", + buffer); + else if UNLIKELY(values[0] < 0 || values[0] >= values[1] + || static_cast(values[1]) > albuf->SampleLen) + context->setError(AL_INVALID_VALUE, "Invalid loop point range %d -> %d on buffer %u", + values[0], values[1], buffer); + else + { + albuf->LoopStart = static_cast(values[0]); + albuf->LoopEnd = static_cast(values[1]); + } + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer integer-vector property 0x%04x", param); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer float property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!value1 || !value2 || !value3) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer 3-float property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values) +START_API_FUNC +{ + switch(param) + { + case AL_SEC_LENGTH_SOFT: + alGetBufferf(buffer, param, values); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer float-vector property 0x%04x", param); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_FREQUENCY: + *value = static_cast(albuf->Frequency); + break; + + case AL_BITS: + *value = static_cast(albuf->bytesFromFmt() * 8); + break; + + case AL_CHANNELS: + *value = static_cast(albuf->channelsFromFmt()); + break; + + case AL_SIZE: + *value = static_cast(albuf->SampleLen * albuf->frameSizeFromFmt()); + break; + + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + *value = static_cast(albuf->UnpackAlign); + break; + + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + *value = static_cast(albuf->PackAlign); + break; + + case AL_AMBISONIC_LAYOUT_SOFT: + *value = albuf->AmbiLayout; + break; + + case AL_AMBISONIC_SCALING_SOFT: + *value = albuf->AmbiScaling; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + if UNLIKELY(LookupBuffer(device, buffer) == nullptr) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!value1 || !value2 || !value3) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer 3-integer property 0x%04x", param); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_FREQUENCY: + case AL_BITS: + case AL_CHANNELS: + case AL_SIZE: + case AL_INTERNAL_FORMAT_SOFT: + case AL_BYTE_LENGTH_SOFT: + case AL_SAMPLE_LENGTH_SOFT: + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + case AL_AMBISONIC_LAYOUT_SOFT: + case AL_AMBISONIC_SCALING_SOFT: + alGetBufferi(buffer, param, values); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->BufferLock}; + ALbuffer *albuf = LookupBuffer(device, buffer); + if UNLIKELY(!albuf) + context->setError(AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_LOOP_POINTS_SOFT: + values[0] = static_cast(albuf->LoopStart); + values[1] = static_cast(albuf->LoopEnd); + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid buffer integer-vector property 0x%04x", param); + } +} +END_API_FUNC + + +ALuint BytesFromFmt(FmtType type) noexcept +{ + switch(type) + { + case FmtUByte: return sizeof(ALubyte); + case FmtShort: return sizeof(ALshort); + case FmtFloat: return sizeof(ALfloat); + case FmtDouble: return sizeof(ALdouble); + case FmtMulaw: return sizeof(ALubyte); + case FmtAlaw: return sizeof(ALubyte); + } + return 0; +} +ALuint ChannelsFromFmt(FmtChannels chans) noexcept +{ + switch(chans) + { + case FmtMono: return 1; + case FmtStereo: return 2; + case FmtRear: return 2; + case FmtQuad: return 4; + case FmtX51: return 6; + case FmtX61: return 7; + case FmtX71: return 8; + case FmtBFormat2D: return 3; + case FmtBFormat3D: return 4; + } + return 0; +} + + +BufferSubList::~BufferSubList() +{ + uint64_t usemask{~FreeMask}; + while(usemask) + { + ALsizei idx{CTZ64(usemask)}; + al::destroy_at(Buffers+idx); + usemask &= ~(1_u64 << idx); + } + FreeMask = ~usemask; + al_free(Buffers); + Buffers = nullptr; +} diff --git a/al/buffer.h b/al/buffer.h new file mode 100644 index 0000000..07012b2 --- /dev/null +++ b/al/buffer.h @@ -0,0 +1,104 @@ +#ifndef AL_BUFFER_H +#define AL_BUFFER_H + +#include + +#include "AL/al.h" + +#include "albyte.h" +#include "almalloc.h" +#include "atomic.h" +#include "inprogext.h" +#include "vector.h" + + +/* User formats */ +enum UserFmtType : unsigned char { + UserFmtUByte, + UserFmtShort, + UserFmtFloat, + UserFmtDouble, + UserFmtMulaw, + UserFmtAlaw, + UserFmtIMA4, + UserFmtMSADPCM, +}; +enum UserFmtChannels : unsigned char { + UserFmtMono, + UserFmtStereo, + UserFmtRear, + UserFmtQuad, + UserFmtX51, /* (WFX order) */ + UserFmtX61, /* (WFX order) */ + UserFmtX71, /* (WFX order) */ + UserFmtBFormat2D, /* WXY */ + UserFmtBFormat3D, /* WXYZ */ +}; + + +/* Storable formats */ +enum FmtType : unsigned char { + FmtUByte = UserFmtUByte, + FmtShort = UserFmtShort, + FmtFloat = UserFmtFloat, + FmtDouble = UserFmtDouble, + FmtMulaw = UserFmtMulaw, + FmtAlaw = UserFmtAlaw, +}; +enum FmtChannels : unsigned char { + FmtMono = UserFmtMono, + FmtStereo = UserFmtStereo, + FmtRear = UserFmtRear, + FmtQuad = UserFmtQuad, + FmtX51 = UserFmtX51, + FmtX61 = UserFmtX61, + FmtX71 = UserFmtX71, + FmtBFormat2D = UserFmtBFormat2D, + FmtBFormat3D = UserFmtBFormat3D, +}; +#define MAX_INPUT_CHANNELS (8) + + +ALuint BytesFromFmt(FmtType type) noexcept; +ALuint ChannelsFromFmt(FmtChannels chans) noexcept; + + +struct ALbuffer { + al::vector mData; + + ALuint Frequency{0u}; + ALbitfieldSOFT Access{0u}; + ALuint SampleLen{0u}; + + FmtChannels mFmtChannels{}; + FmtType mFmtType{}; + + UserFmtType OriginalType{}; + ALuint OriginalSize{0}; + ALuint OriginalAlign{0}; + + ALenum AmbiLayout{AL_FUMA_SOFT}; + ALenum AmbiScaling{AL_FUMA_SOFT}; + + ALuint LoopStart{0u}; + ALuint LoopEnd{0u}; + + ALuint UnpackAlign{0}; + ALuint PackAlign{0}; + + ALbitfieldSOFT MappedAccess{0u}; + ALsizei MappedOffset{0}; + ALsizei MappedSize{0}; + + /* Number of times buffer was attached to a source (deletion can only occur when 0) */ + RefCount ref{0u}; + + /* Self ID */ + ALuint id{0}; + + inline ALuint bytesFromFmt() const noexcept { return BytesFromFmt(mFmtType); } + inline ALuint channelsFromFmt() const noexcept { return ChannelsFromFmt(mFmtChannels); } + inline ALuint frameSizeFromFmt() const noexcept { return channelsFromFmt() * bytesFromFmt(); } +}; + +#endif diff --git a/al/effect.cpp b/al/effect.cpp new file mode 100644 index 0000000..f7d17f5 --- /dev/null +++ b/al/effect.cpp @@ -0,0 +1,725 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "effect.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" +#include "AL/efx-presets.h" +#include "AL/efx.h" + +#include "alcmain.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alstring.h" +#include "effects/base.h" +#include "logging.h" +#include "opthelpers.h" +#include "vector.h" + + +const EffectList gEffectList[15]{ + { "eaxreverb", EAXREVERB_EFFECT, AL_EFFECT_EAXREVERB }, + { "reverb", REVERB_EFFECT, AL_EFFECT_REVERB }, + { "autowah", AUTOWAH_EFFECT, AL_EFFECT_AUTOWAH }, + { "chorus", CHORUS_EFFECT, AL_EFFECT_CHORUS }, + { "compressor", COMPRESSOR_EFFECT, AL_EFFECT_COMPRESSOR }, + { "distortion", DISTORTION_EFFECT, AL_EFFECT_DISTORTION }, + { "echo", ECHO_EFFECT, AL_EFFECT_ECHO }, + { "equalizer", EQUALIZER_EFFECT, AL_EFFECT_EQUALIZER }, + { "flanger", FLANGER_EFFECT, AL_EFFECT_FLANGER }, + { "fshifter", FSHIFTER_EFFECT, AL_EFFECT_FREQUENCY_SHIFTER }, + { "modulator", MODULATOR_EFFECT, AL_EFFECT_RING_MODULATOR }, + { "pshifter", PSHIFTER_EFFECT, AL_EFFECT_PITCH_SHIFTER }, + { "vmorpher", VMORPHER_EFFECT, AL_EFFECT_VOCAL_MORPHER }, + { "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT }, + { "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_DIALOGUE }, +}; + +ALboolean DisabledEffects[MAX_EFFECTS]; + +namespace { + +constexpr struct FactoryItem { + ALenum Type; + EffectStateFactory* (&GetFactory)(void); +} FactoryList[] = { + { AL_EFFECT_NULL, NullStateFactory_getFactory }, + { AL_EFFECT_EAXREVERB, ReverbStateFactory_getFactory }, + { AL_EFFECT_REVERB, StdReverbStateFactory_getFactory }, + { AL_EFFECT_AUTOWAH, AutowahStateFactory_getFactory }, + { AL_EFFECT_CHORUS, ChorusStateFactory_getFactory }, + { AL_EFFECT_COMPRESSOR, CompressorStateFactory_getFactory }, + { AL_EFFECT_DISTORTION, DistortionStateFactory_getFactory }, + { AL_EFFECT_ECHO, EchoStateFactory_getFactory }, + { AL_EFFECT_EQUALIZER, EqualizerStateFactory_getFactory }, + { AL_EFFECT_FLANGER, FlangerStateFactory_getFactory }, + { AL_EFFECT_FREQUENCY_SHIFTER, FshifterStateFactory_getFactory }, + { AL_EFFECT_RING_MODULATOR, ModulatorStateFactory_getFactory }, + { AL_EFFECT_PITCH_SHIFTER, PshifterStateFactory_getFactory}, + { AL_EFFECT_VOCAL_MORPHER, VmorpherStateFactory_getFactory}, + { AL_EFFECT_DEDICATED_DIALOGUE, DedicatedStateFactory_getFactory }, + { AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, DedicatedStateFactory_getFactory } +}; + + +template +void ALeffect_setParami(ALeffect *effect, T&& ...args) +{ effect->vtab->setParami(&effect->Props, std::forward(args)...); } +template +void ALeffect_setParamiv(ALeffect *effect, T&& ...args) +{ effect->vtab->setParamiv(&effect->Props, std::forward(args)...); } +template +void ALeffect_setParamf(ALeffect *effect, T&& ...args) +{ effect->vtab->setParamf(&effect->Props, std::forward(args)...); } +template +void ALeffect_setParamfv(ALeffect *effect, T&& ...args) +{ effect->vtab->setParamfv(&effect->Props, std::forward(args)...); } + +template +void ALeffect_getParami(const ALeffect *effect, T&& ...args) +{ effect->vtab->getParami(&effect->Props, std::forward(args)...); } +template +void ALeffect_getParamiv(const ALeffect *effect, T&& ...args) +{ effect->vtab->getParamiv(&effect->Props, std::forward(args)...); } +template +void ALeffect_getParamf(const ALeffect *effect, T&& ...args) +{ effect->vtab->getParamf(&effect->Props, std::forward(args)...); } +template +void ALeffect_getParamfv(const ALeffect *effect, T&& ...args) +{ effect->vtab->getParamfv(&effect->Props, std::forward(args)...); } + + +void InitEffectParams(ALeffect *effect, ALenum type) +{ + EffectStateFactory *factory = getFactoryByType(type); + if(factory) + { + effect->Props = factory->getDefaultProps(); + effect->vtab = factory->getEffectVtable(); + } + else + { + effect->Props = EffectProps{}; + effect->vtab = nullptr; + } + effect->type = type; +} + +bool EnsureEffects(ALCdevice *device, size_t needed) +{ + size_t count{std::accumulate(device->EffectList.cbegin(), device->EffectList.cend(), size_t{0}, + [](size_t cur, const EffectSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(sublist.FreeMask)); } + )}; + + while(needed > count) + { + if UNLIKELY(device->EffectList.size() >= 1<<25) + return false; + + device->EffectList.emplace_back(); + auto sublist = device->EffectList.end() - 1; + sublist->FreeMask = ~0_u64; + sublist->Effects = static_cast(al_calloc(alignof(ALeffect), sizeof(ALeffect)*64)); + if UNLIKELY(!sublist->Effects) + { + device->EffectList.pop_back(); + return false; + } + count += 64; + } + return true; +} + +ALeffect *AllocEffect(ALCdevice *device) +{ + auto sublist = std::find_if(device->EffectList.begin(), device->EffectList.end(), + [](const EffectSubList &entry) noexcept -> bool + { return entry.FreeMask != 0; } + ); + auto lidx = static_cast(std::distance(device->EffectList.begin(), sublist)); + auto slidx = static_cast(CTZ64(sublist->FreeMask)); + + ALeffect *effect{::new (sublist->Effects + slidx) ALeffect{}}; + InitEffectParams(effect, AL_EFFECT_NULL); + + /* Add 1 to avoid effect ID 0. */ + effect->id = ((lidx<<6) | slidx) + 1; + + sublist->FreeMask &= ~(1_u64 << slidx); + + return effect; +} + +void FreeEffect(ALCdevice *device, ALeffect *effect) +{ + const ALuint id{effect->id - 1}; + const size_t lidx{id >> 6}; + const ALuint slidx{id & 0x3f}; + + al::destroy_at(effect); + + device->EffectList[lidx].FreeMask |= 1_u64 << slidx; +} + +inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= device->EffectList.size()) + return nullptr; + EffectSubList &sublist = device->EffectList[lidx]; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Effects + slidx; +} + +} // namespace + +AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Generating %d effects", n); + if UNLIKELY(n <= 0) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + if(!EnsureEffects(device, static_cast(n))) + { + context->setError(AL_OUT_OF_MEMORY, "Failed to allocate %d effect%s", n, (n==1)?"":"s"); + return; + } + + if LIKELY(n == 1) + { + /* Special handling for the easy and normal case. */ + ALeffect *effect{AllocEffect(device)}; + effects[0] = effect->id; + } + else + { + /* Store the allocated buffer IDs in a separate local list, to avoid + * modifying the user storage in case of failure. + */ + al::vector ids; + ids.reserve(static_cast(n)); + do { + ALeffect *effect{AllocEffect(device)}; + ids.emplace_back(effect->id); + } while(--n); + std::copy(ids.cbegin(), ids.cend(), effects); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Deleting %d effects", n); + if UNLIKELY(n <= 0) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + /* First try to find any effects that are invalid. */ + auto validate_effect = [device](const ALuint eid) -> bool + { return !eid || LookupEffect(device, eid) != nullptr; }; + + const ALuint *effects_end = effects + n; + auto inveffect = std::find_if_not(effects, effects_end, validate_effect); + if UNLIKELY(inveffect != effects_end) + { + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", *inveffect); + return; + } + + /* All good. Delete non-0 effect IDs. */ + auto delete_effect = [device](ALuint eid) -> void + { + ALeffect *effect{eid ? LookupEffect(device, eid) : nullptr}; + if(effect) FreeEffect(device, effect); + }; + std::for_each(effects, effects_end, delete_effect); +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if LIKELY(context) + { + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + if(!effect || LookupEffect(device, effect)) + return AL_TRUE; + } + return AL_FALSE; +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + if(param == AL_EFFECT_TYPE) + { + ALboolean isOk{value == AL_EFFECT_NULL}; + if(!isOk) + { + for(const EffectList &effectitem : gEffectList) + { + if(value == effectitem.val && !DisabledEffects[effectitem.type]) + { + isOk = AL_TRUE; + break; + } + } + } + + if(isOk) + InitEffectParams(aleffect, value); + else + context->setError(AL_INVALID_VALUE, "Effect type 0x%04x not supported", value); + } + else + { + /* Call the appropriate handler */ + ALeffect_setParami(aleffect, context.get(), param, value); + } + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_EFFECT_TYPE: + alEffecti(effect, param, values[0]); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + /* Call the appropriate handler */ + ALeffect_setParamiv(aleffect, context.get(), param, values); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + /* Call the appropriate handler */ + ALeffect_setParamf(aleffect, context.get(), param, value); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + /* Call the appropriate handler */ + ALeffect_setParamfv(aleffect, context.get(), param, values); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + const ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + if(param == AL_EFFECT_TYPE) + *value = aleffect->type; + else + { + /* Call the appropriate handler */ + ALeffect_getParami(aleffect, context.get(), param, value); + } + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_EFFECT_TYPE: + alGetEffecti(effect, param, values); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + const ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + /* Call the appropriate handler */ + ALeffect_getParamiv(aleffect, context.get(), param, values); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + const ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + /* Call the appropriate handler */ + ALeffect_getParamf(aleffect, context.get(), param, value); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + + const ALeffect *aleffect{LookupEffect(device, effect)}; + if UNLIKELY(!aleffect) + context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect); + else + { + /* Call the appropriate handler */ + ALeffect_getParamfv(aleffect, context.get(), param, values); + } +} +END_API_FUNC + + +void InitEffect(ALeffect *effect) +{ + InitEffectParams(effect, AL_EFFECT_NULL); +} + +EffectSubList::~EffectSubList() +{ + uint64_t usemask{~FreeMask}; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + al::destroy_at(Effects+idx); + usemask &= ~(1_u64 << idx); + } + FreeMask = ~usemask; + al_free(Effects); + Effects = nullptr; +} + + +EffectStateFactory *getFactoryByType(ALenum type) +{ + auto iter = std::find_if(std::begin(FactoryList), std::end(FactoryList), + [type](const FactoryItem &item) noexcept -> bool + { return item.Type == type; } + ); + return (iter != std::end(FactoryList)) ? iter->GetFactory() : nullptr; +} + + +#define DECL(x) { #x, EFX_REVERB_PRESET_##x } +static const struct { + const char name[32]; + EFXEAXREVERBPROPERTIES props; +} reverblist[] = { + DECL(GENERIC), + DECL(PADDEDCELL), + DECL(ROOM), + DECL(BATHROOM), + DECL(LIVINGROOM), + DECL(STONEROOM), + DECL(AUDITORIUM), + DECL(CONCERTHALL), + DECL(CAVE), + DECL(ARENA), + DECL(HANGAR), + DECL(CARPETEDHALLWAY), + DECL(HALLWAY), + DECL(STONECORRIDOR), + DECL(ALLEY), + DECL(FOREST), + DECL(CITY), + DECL(MOUNTAINS), + DECL(QUARRY), + DECL(PLAIN), + DECL(PARKINGLOT), + DECL(SEWERPIPE), + DECL(UNDERWATER), + DECL(DRUGGED), + DECL(DIZZY), + DECL(PSYCHOTIC), + + DECL(CASTLE_SMALLROOM), + DECL(CASTLE_SHORTPASSAGE), + DECL(CASTLE_MEDIUMROOM), + DECL(CASTLE_LARGEROOM), + DECL(CASTLE_LONGPASSAGE), + DECL(CASTLE_HALL), + DECL(CASTLE_CUPBOARD), + DECL(CASTLE_COURTYARD), + DECL(CASTLE_ALCOVE), + + DECL(FACTORY_SMALLROOM), + DECL(FACTORY_SHORTPASSAGE), + DECL(FACTORY_MEDIUMROOM), + DECL(FACTORY_LARGEROOM), + DECL(FACTORY_LONGPASSAGE), + DECL(FACTORY_HALL), + DECL(FACTORY_CUPBOARD), + DECL(FACTORY_COURTYARD), + DECL(FACTORY_ALCOVE), + + DECL(ICEPALACE_SMALLROOM), + DECL(ICEPALACE_SHORTPASSAGE), + DECL(ICEPALACE_MEDIUMROOM), + DECL(ICEPALACE_LARGEROOM), + DECL(ICEPALACE_LONGPASSAGE), + DECL(ICEPALACE_HALL), + DECL(ICEPALACE_CUPBOARD), + DECL(ICEPALACE_COURTYARD), + DECL(ICEPALACE_ALCOVE), + + DECL(SPACESTATION_SMALLROOM), + DECL(SPACESTATION_SHORTPASSAGE), + DECL(SPACESTATION_MEDIUMROOM), + DECL(SPACESTATION_LARGEROOM), + DECL(SPACESTATION_LONGPASSAGE), + DECL(SPACESTATION_HALL), + DECL(SPACESTATION_CUPBOARD), + DECL(SPACESTATION_ALCOVE), + + DECL(WOODEN_SMALLROOM), + DECL(WOODEN_SHORTPASSAGE), + DECL(WOODEN_MEDIUMROOM), + DECL(WOODEN_LARGEROOM), + DECL(WOODEN_LONGPASSAGE), + DECL(WOODEN_HALL), + DECL(WOODEN_CUPBOARD), + DECL(WOODEN_COURTYARD), + DECL(WOODEN_ALCOVE), + + DECL(SPORT_EMPTYSTADIUM), + DECL(SPORT_SQUASHCOURT), + DECL(SPORT_SMALLSWIMMINGPOOL), + DECL(SPORT_LARGESWIMMINGPOOL), + DECL(SPORT_GYMNASIUM), + DECL(SPORT_FULLSTADIUM), + DECL(SPORT_STADIUMTANNOY), + + DECL(PREFAB_WORKSHOP), + DECL(PREFAB_SCHOOLROOM), + DECL(PREFAB_PRACTISEROOM), + DECL(PREFAB_OUTHOUSE), + DECL(PREFAB_CARAVAN), + + DECL(DOME_TOMB), + DECL(PIPE_SMALL), + DECL(DOME_SAINTPAULS), + DECL(PIPE_LONGTHIN), + DECL(PIPE_LARGE), + DECL(PIPE_RESONANT), + + DECL(OUTDOORS_BACKYARD), + DECL(OUTDOORS_ROLLINGPLAINS), + DECL(OUTDOORS_DEEPCANYON), + DECL(OUTDOORS_CREEK), + DECL(OUTDOORS_VALLEY), + + DECL(MOOD_HEAVEN), + DECL(MOOD_HELL), + DECL(MOOD_MEMORY), + + DECL(DRIVING_COMMENTATOR), + DECL(DRIVING_PITGARAGE), + DECL(DRIVING_INCAR_RACER), + DECL(DRIVING_INCAR_SPORTS), + DECL(DRIVING_INCAR_LUXURY), + DECL(DRIVING_FULLGRANDSTAND), + DECL(DRIVING_EMPTYGRANDSTAND), + DECL(DRIVING_TUNNEL), + + DECL(CITY_STREETS), + DECL(CITY_SUBWAY), + DECL(CITY_MUSEUM), + DECL(CITY_LIBRARY), + DECL(CITY_UNDERPASS), + DECL(CITY_ABANDONED), + + DECL(DUSTYROOM), + DECL(CHAPEL), + DECL(SMALLWATERROOM), +}; +#undef DECL + +void LoadReverbPreset(const char *name, ALeffect *effect) +{ + if(al::strcasecmp(name, "NONE") == 0) + { + InitEffectParams(effect, AL_EFFECT_NULL); + TRACE("Loading reverb '%s'\n", "NONE"); + return; + } + + if(!DisabledEffects[EAXREVERB_EFFECT]) + InitEffectParams(effect, AL_EFFECT_EAXREVERB); + else if(!DisabledEffects[REVERB_EFFECT]) + InitEffectParams(effect, AL_EFFECT_REVERB); + else + InitEffectParams(effect, AL_EFFECT_NULL); + for(const auto &reverbitem : reverblist) + { + const EFXEAXREVERBPROPERTIES *props; + + if(al::strcasecmp(name, reverbitem.name) != 0) + continue; + + TRACE("Loading reverb '%s'\n", reverbitem.name); + props = &reverbitem.props; + effect->Props.Reverb.Density = props->flDensity; + effect->Props.Reverb.Diffusion = props->flDiffusion; + effect->Props.Reverb.Gain = props->flGain; + effect->Props.Reverb.GainHF = props->flGainHF; + effect->Props.Reverb.GainLF = props->flGainLF; + effect->Props.Reverb.DecayTime = props->flDecayTime; + effect->Props.Reverb.DecayHFRatio = props->flDecayHFRatio; + effect->Props.Reverb.DecayLFRatio = props->flDecayLFRatio; + effect->Props.Reverb.ReflectionsGain = props->flReflectionsGain; + effect->Props.Reverb.ReflectionsDelay = props->flReflectionsDelay; + effect->Props.Reverb.ReflectionsPan[0] = props->flReflectionsPan[0]; + effect->Props.Reverb.ReflectionsPan[1] = props->flReflectionsPan[1]; + effect->Props.Reverb.ReflectionsPan[2] = props->flReflectionsPan[2]; + effect->Props.Reverb.LateReverbGain = props->flLateReverbGain; + effect->Props.Reverb.LateReverbDelay = props->flLateReverbDelay; + effect->Props.Reverb.LateReverbPan[0] = props->flLateReverbPan[0]; + effect->Props.Reverb.LateReverbPan[1] = props->flLateReverbPan[1]; + effect->Props.Reverb.LateReverbPan[2] = props->flLateReverbPan[2]; + effect->Props.Reverb.EchoTime = props->flEchoTime; + effect->Props.Reverb.EchoDepth = props->flEchoDepth; + effect->Props.Reverb.ModulationTime = props->flModulationTime; + effect->Props.Reverb.ModulationDepth = props->flModulationDepth; + effect->Props.Reverb.AirAbsorptionGainHF = props->flAirAbsorptionGainHF; + effect->Props.Reverb.HFReference = props->flHFReference; + effect->Props.Reverb.LFReference = props->flLFReference; + effect->Props.Reverb.RoomRolloffFactor = props->flRoomRolloffFactor; + effect->Props.Reverb.DecayHFLimit = props->iDecayHFLimit ? AL_TRUE : AL_FALSE; + return; + } + + WARN("Reverb preset '%s' not found\n", name); +} diff --git a/al/effect.h b/al/effect.h new file mode 100644 index 0000000..270b8e2 --- /dev/null +++ b/al/effect.h @@ -0,0 +1,61 @@ +#ifndef AL_EFFECT_H +#define AL_EFFECT_H + +#include "AL/al.h" +#include "AL/efx.h" + +#include "effects/base.h" + + +enum { + EAXREVERB_EFFECT = 0, + REVERB_EFFECT, + AUTOWAH_EFFECT, + CHORUS_EFFECT, + COMPRESSOR_EFFECT, + DISTORTION_EFFECT, + ECHO_EFFECT, + EQUALIZER_EFFECT, + FLANGER_EFFECT, + FSHIFTER_EFFECT, + MODULATOR_EFFECT, + PSHIFTER_EFFECT, + VMORPHER_EFFECT, + DEDICATED_EFFECT, + + MAX_EFFECTS +}; +extern ALboolean DisabledEffects[MAX_EFFECTS]; + +extern ALfloat ReverbBoost; + +struct EffectList { + const char name[16]; + int type; + ALenum val; +}; +extern const EffectList gEffectList[15]; + + +struct ALeffect { + // Effect type (AL_EFFECT_NULL, ...) + ALenum type{AL_EFFECT_NULL}; + + EffectProps Props{}; + + const EffectVtable *vtab{nullptr}; + + /* Self ID */ + ALuint id{0u}; +}; + +inline ALboolean IsReverbEffect(ALenum type) +{ return type == AL_EFFECT_REVERB || type == AL_EFFECT_EAXREVERB; } + +EffectStateFactory *getFactoryByType(ALenum type); + +void InitEffect(ALeffect *effect); + +void LoadReverbPreset(const char *name, ALeffect *effect); + +#endif diff --git a/OpenAL32/alError.c b/al/error.cpp similarity index 50% rename from OpenAL32/alError.c rename to al/error.cpp index b6208f7..b667d14 100644 --- a/OpenAL32/alError.c +++ b/al/error.cpp @@ -20,46 +20,55 @@ #include "config.h" -#include -#include - -#ifdef HAVE_WINDOWS_H +#ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #endif -#include "alMain.h" +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" #include "AL/alc.h" -#include "alError.h" -ALboolean TrapALError = AL_FALSE; +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "event.h" +#include "inprogext.h" +#include "logging.h" +#include "opthelpers.h" +#include "vector.h" + -void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...) +bool TrapALError{false}; + +void ALCcontext::setError(ALenum errorCode, const char *msg, ...) { - ALenum curerr = AL_NO_ERROR; - char message[1024] = { 0 }; - va_list args; - int msglen; + auto message = al::vector(256); + va_list args, args2; va_start(args, msg); - msglen = vsnprintf(message, sizeof(message), msg, args); - va_end(args); - - if(msglen < 0 || (size_t)msglen >= sizeof(message)) + va_copy(args2, args); + int msglen{std::vsnprintf(message.data(), message.size(), msg, args)}; + if(msglen >= 0 && static_cast(msglen) >= message.size()) { - message[sizeof(message)-1] = 0; - msglen = (int)strlen(message); - } - if(msglen > 0) - msg = message; - else - { - msg = ""; - msglen = (int)strlen(msg); + message.resize(static_cast(msglen) + 1u); + msglen = std::vsnprintf(message.data(), message.size(), msg, args2); } + va_end(args2); + va_end(args); + + if(msglen >= 0) msg = message.data(); + else msg = ""; + msglen = static_cast(strlen(msg)); WARN("Error generated on context %p, code 0x%04x, \"%s\"\n", - context, errorCode, message); + decltype(std::declval()){this}, errorCode, msg); if(TrapALError) { #ifdef _WIN32 @@ -71,28 +80,25 @@ void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...) #endif } - ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(&context->LastError, &curerr, errorCode); - if((ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)&EventType_Error)) + ALenum curerr{AL_NO_ERROR}; + mLastError.compare_exchange_strong(curerr, errorCode); + if((mEnabledEvts.load(std::memory_order_relaxed)&EventType_Error)) { - ALbitfieldSOFT enabledevts; - almtx_lock(&context->EventCbLock); - enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); - if((enabledevts&EventType_Error) && context->EventCb) - (*context->EventCb)(AL_EVENT_TYPE_ERROR_SOFT, 0, errorCode, msglen, msg, - context->EventParam); - almtx_unlock(&context->EventCbLock); + std::lock_guard _{mEventCbLock}; + ALbitfieldSOFT enabledevts{mEnabledEvts.load(std::memory_order_relaxed)}; + if((enabledevts&EventType_Error) && mEventCb) + (*mEventCb)(AL_EVENT_TYPE_ERROR_SOFT, 0, static_cast(errorCode), msglen, msg, + mEventParam); } } AL_API ALenum AL_APIENTRY alGetError(void) +START_API_FUNC { - ALCcontext *context; - ALenum errorCode; - - context = GetContextRef(); - if(!context) + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) { - const ALenum deferror = AL_INVALID_OPERATION; + constexpr ALenum deferror{AL_INVALID_OPERATION}; WARN("Querying error state on null context (implicitly 0x%04x)\n", deferror); if(TrapALError) { @@ -106,8 +112,6 @@ AL_API ALenum AL_APIENTRY alGetError(void) return deferror; } - errorCode = ATOMIC_EXCHANGE_SEQ(&context->LastError, AL_NO_ERROR); - - ALCcontext_DecRef(context); - return errorCode; + return context->mLastError.exchange(AL_NO_ERROR); } +END_API_FUNC diff --git a/al/event.cpp b/al/event.cpp new file mode 100644 index 0000000..0da48cb --- /dev/null +++ b/al/event.cpp @@ -0,0 +1,205 @@ + +#include "config.h" + +#include "event.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" + +#include "albyte.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "effects/base.h" +#include "inprogext.h" +#include "logging.h" +#include "opthelpers.h" +#include "ringbuffer.h" +#include "threads.h" + + +static int EventThread(ALCcontext *context) +{ + RingBuffer *ring{context->mAsyncEvents.get()}; + bool quitnow{false}; + while LIKELY(!quitnow) + { + auto evt_data = ring->getReadVector().first; + if(evt_data.len == 0) + { + context->mEventSem.wait(); + continue; + } + + std::lock_guard _{context->mEventCbLock}; + do { + auto *evt_ptr = reinterpret_cast(evt_data.buf); + evt_data.buf += sizeof(AsyncEvent); + evt_data.len -= 1; + + AsyncEvent evt{*evt_ptr}; + al::destroy_at(evt_ptr); + ring->readAdvance(1); + + quitnow = evt.EnumType == EventType_KillThread; + if UNLIKELY(quitnow) break; + + if(evt.EnumType == EventType_ReleaseEffectState) + { + evt.u.mEffectState->release(); + continue; + } + + ALbitfieldSOFT enabledevts{context->mEnabledEvts.load(std::memory_order_acquire)}; + if(!context->mEventCb) continue; + + if(evt.EnumType == EventType_SourceStateChange) + { + if(!(enabledevts&EventType_SourceStateChange)) + continue; + std::string msg{"Source ID " + std::to_string(evt.u.srcstate.id)}; + msg += " state has changed to "; + msg += (evt.u.srcstate.state==AL_INITIAL) ? "AL_INITIAL" : + (evt.u.srcstate.state==AL_PLAYING) ? "AL_PLAYING" : + (evt.u.srcstate.state==AL_PAUSED) ? "AL_PAUSED" : + (evt.u.srcstate.state==AL_STOPPED) ? "AL_STOPPED" : ""; + context->mEventCb(AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT, evt.u.srcstate.id, + static_cast(evt.u.srcstate.state), static_cast(msg.length()), + msg.c_str(), context->mEventParam); + } + else if(evt.EnumType == EventType_BufferCompleted) + { + if(!(enabledevts&EventType_BufferCompleted)) + continue; + std::string msg{std::to_string(evt.u.bufcomp.count)}; + if(evt.u.bufcomp.count == 1) msg += " buffer completed"; + else msg += " buffers completed"; + context->mEventCb(AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, evt.u.bufcomp.id, + evt.u.bufcomp.count, static_cast(msg.length()), msg.c_str(), + context->mEventParam); + } + else if((enabledevts&evt.EnumType) == evt.EnumType) + context->mEventCb(evt.u.user.type, evt.u.user.id, evt.u.user.param, + static_cast(strlen(evt.u.user.msg)), evt.u.user.msg, + context->mEventParam); + } while(evt_data.len != 0); + } + return 0; +} + +void StartEventThrd(ALCcontext *ctx) +{ + try { + ctx->mEventThread = std::thread{EventThread, ctx}; + } + catch(std::exception& e) { + ERR("Failed to start event thread: %s\n", e.what()); + } + catch(...) { + ERR("Failed to start event thread! Expect problems.\n"); + } +} + +void StopEventThrd(ALCcontext *ctx) +{ + RingBuffer *ring{ctx->mAsyncEvents.get()}; + auto evt_data = ring->getWriteVector().first; + if(evt_data.len == 0) + { + do { + std::this_thread::yield(); + evt_data = ring->getWriteVector().first; + } while(evt_data.len == 0); + } + new (evt_data.buf) AsyncEvent{EventType_KillThread}; + ring->writeAdvance(1); + + ctx->mEventSem.post(); + if(ctx->mEventThread.joinable()) + ctx->mEventThread.join(); +} + +AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, ALboolean enable) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(count < 0) context->setError(AL_INVALID_VALUE, "Controlling %d events", count); + if(count <= 0) return; + if(!types) SETERR_RETURN(context, AL_INVALID_VALUE,, "NULL pointer"); + + ALbitfieldSOFT flags{0}; + const ALenum *types_end = types+count; + auto bad_type = std::find_if_not(types, types_end, + [&flags](ALenum type) noexcept -> bool + { + if(type == AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT) + flags |= EventType_BufferCompleted; + else if(type == AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT) + flags |= EventType_SourceStateChange; + else if(type == AL_EVENT_TYPE_ERROR_SOFT) + flags |= EventType_Error; + else if(type == AL_EVENT_TYPE_PERFORMANCE_SOFT) + flags |= EventType_Performance; + else if(type == AL_EVENT_TYPE_DEPRECATED_SOFT) + flags |= EventType_Deprecated; + else if(type == AL_EVENT_TYPE_DISCONNECTED_SOFT) + flags |= EventType_Disconnected; + else + return false; + return true; + } + ); + if(bad_type != types_end) + SETERR_RETURN(context, AL_INVALID_ENUM,, "Invalid event type 0x%04x", *bad_type); + + if(enable) + { + ALbitfieldSOFT enabledevts{context->mEnabledEvts.load(std::memory_order_relaxed)}; + while(context->mEnabledEvts.compare_exchange_weak(enabledevts, enabledevts|flags, + std::memory_order_acq_rel, std::memory_order_acquire) == 0) + { + /* enabledevts is (re-)filled with the current value on failure, so + * just try again. + */ + } + } + else + { + ALbitfieldSOFT enabledevts{context->mEnabledEvts.load(std::memory_order_relaxed)}; + while(context->mEnabledEvts.compare_exchange_weak(enabledevts, enabledevts&~flags, + std::memory_order_acq_rel, std::memory_order_acquire) == 0) + { + } + /* Wait to ensure the event handler sees the changed flags before + * returning. + */ + std::lock_guard{context->mEventCbLock}; + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alEventCallbackSOFT(ALEVENTPROCSOFT callback, void *userParam) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mEventCbLock}; + context->mEventCb = callback; + context->mEventParam = userParam; +} +END_API_FUNC diff --git a/al/event.h b/al/event.h new file mode 100644 index 0000000..9056d57 --- /dev/null +++ b/al/event.h @@ -0,0 +1,55 @@ +#ifndef AL_EVENT_H +#define AL_EVENT_H + +#include "AL/al.h" +#include "AL/alc.h" + +struct EffectState; + + +enum { + /* End event thread processing. */ + EventType_KillThread = 0, + + /* User event types. */ + EventType_SourceStateChange = 1<<0, + EventType_BufferCompleted = 1<<1, + EventType_Error = 1<<2, + EventType_Performance = 1<<3, + EventType_Deprecated = 1<<4, + EventType_Disconnected = 1<<5, + + /* Internal events. */ + EventType_ReleaseEffectState = 65536, +}; + +struct AsyncEvent { + unsigned int EnumType{0u}; + union { + char dummy; + struct { + ALuint id; + ALenum state; + } srcstate; + struct { + ALuint id; + ALuint count; + } bufcomp; + struct { + ALenum type; + ALuint id; + ALuint param; + ALchar msg[232]; + } user; + EffectState *mEffectState; + } u{}; + + AsyncEvent() noexcept = default; + constexpr AsyncEvent(unsigned int type) noexcept : EnumType{type} { } +}; + + +void StartEventThrd(ALCcontext *ctx); +void StopEventThrd(ALCcontext *ctx); + +#endif diff --git a/OpenAL32/alExtension.c b/al/extension.cpp similarity index 58% rename from OpenAL32/alExtension.c rename to al/extension.cpp index f6378c7..35c5313 100644 --- a/OpenAL32/alExtension.c +++ b/al/extension.cpp @@ -20,45 +20,36 @@ #include "config.h" -#include -#include -#include +#include +#include +#include -#include "alError.h" -#include "alMain.h" -#include "alFilter.h" -#include "alEffect.h" -#include "alAuxEffectSlot.h" -#include "alSource.h" -#include "alBuffer.h" #include "AL/al.h" #include "AL/alc.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "alstring.h" +#include "opthelpers.h" + AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extName) +START_API_FUNC { - ALboolean ret = AL_FALSE; - ALCcontext *context; - const char *ptr; - size_t len; - - context = GetContextRef(); - if(!context) return AL_FALSE; + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return AL_FALSE; if(!extName) - SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer"); + SETERR_RETURN(context, AL_INVALID_VALUE, AL_FALSE, "NULL pointer"); - len = strlen(extName); - ptr = context->ExtensionList; + size_t len{strlen(extName)}; + const char *ptr{context->mExtensionList}; while(ptr && *ptr) { - if(strncasecmp(ptr, extName, len) == 0 && - (ptr[len] == '\0' || isspace(ptr[len]))) - { - ret = AL_TRUE; - break; - } - if((ptr=strchr(ptr, ' ')) != NULL) + if(al::strncasecmp(ptr, extName, len) == 0 && (ptr[len] == '\0' || isspace(ptr[len]))) + return AL_TRUE; + + if((ptr=strchr(ptr, ' ')) != nullptr) { do { ++ptr; @@ -66,22 +57,23 @@ AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extName) } } -done: - ALCcontext_DecRef(context); - return ret; + return AL_FALSE; } +END_API_FUNC AL_API ALvoid* AL_APIENTRY alGetProcAddress(const ALchar *funcName) +START_API_FUNC { - if(!funcName) - return NULL; - return alcGetProcAddress(NULL, funcName); + if(!funcName) return nullptr; + return alcGetProcAddress(nullptr, funcName); } +END_API_FUNC AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *enumName) +START_API_FUNC { - if(!enumName) - return (ALenum)0; - return alcGetEnumValue(NULL, enumName); + if(!enumName) return static_cast(0); + return alcGetEnumValue(nullptr, enumName); } +END_API_FUNC diff --git a/al/filter.cpp b/al/filter.cpp new file mode 100644 index 0000000..3388725 --- /dev/null +++ b/al/filter.cpp @@ -0,0 +1,650 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "filter.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "alcmain.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "opthelpers.h" +#include "vector.h" + + +namespace { + +#define FILTER_MIN_GAIN 0.0f +#define FILTER_MAX_GAIN 4.0f /* +12dB */ + +void ALlowpass_setParami(ALfilter*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid low-pass integer property 0x%04x", param); } +void ALlowpass_setParamiv(ALfilter*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid low-pass integer-vector property 0x%04x", param); } +void ALlowpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_LOWPASS_GAIN: + if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Low-pass gain %f out of range", val); + filter->Gain = val; + break; + + case AL_LOWPASS_GAINHF: + if(!(val >= AL_LOWPASS_MIN_GAINHF && val <= AL_LOWPASS_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Low-pass gainhf %f out of range", val); + filter->GainHF = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid low-pass float property 0x%04x", param); + } +} +void ALlowpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALlowpass_setParamf(filter, context, param, vals[0]); } + +void ALlowpass_getParami(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid low-pass integer property 0x%04x", param); } +void ALlowpass_getParamiv(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid low-pass integer-vector property 0x%04x", param); } +void ALlowpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_LOWPASS_GAIN: + *val = filter->Gain; + break; + + case AL_LOWPASS_GAINHF: + *val = filter->GainHF; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid low-pass float property 0x%04x", param); + } +} +void ALlowpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALlowpass_getParamf(filter, context, param, vals); } + +DEFINE_ALFILTER_VTABLE(ALlowpass); + + +void ALhighpass_setParami(ALfilter*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid high-pass integer property 0x%04x", param); } +void ALhighpass_setParamiv(ALfilter*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid high-pass integer-vector property 0x%04x", param); } +void ALhighpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_HIGHPASS_GAIN: + if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "High-pass gain out of range"); + filter->Gain = val; + break; + + case AL_HIGHPASS_GAINLF: + if(!(val >= AL_HIGHPASS_MIN_GAINLF && val <= AL_HIGHPASS_MAX_GAINLF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "High-pass gainlf out of range"); + filter->GainLF = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid high-pass float property 0x%04x", param); + } +} +void ALhighpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALhighpass_setParamf(filter, context, param, vals[0]); } + +void ALhighpass_getParami(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid high-pass integer property 0x%04x", param); } +void ALhighpass_getParamiv(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid high-pass integer-vector property 0x%04x", param); } +void ALhighpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_HIGHPASS_GAIN: + *val = filter->Gain; + break; + + case AL_HIGHPASS_GAINLF: + *val = filter->GainLF; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid high-pass float property 0x%04x", param); + } +} +void ALhighpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALhighpass_getParamf(filter, context, param, vals); } + +DEFINE_ALFILTER_VTABLE(ALhighpass); + + +void ALbandpass_setParami(ALfilter*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid band-pass integer property 0x%04x", param); } +void ALbandpass_setParamiv(ALfilter*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid band-pass integer-vector property 0x%04x", param); } +void ALbandpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_BANDPASS_GAIN: + if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gain out of range"); + filter->Gain = val; + break; + + case AL_BANDPASS_GAINHF: + if(!(val >= AL_BANDPASS_MIN_GAINHF && val <= AL_BANDPASS_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gainhf out of range"); + filter->GainHF = val; + break; + + case AL_BANDPASS_GAINLF: + if(!(val >= AL_BANDPASS_MIN_GAINLF && val <= AL_BANDPASS_MAX_GAINLF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gainlf out of range"); + filter->GainLF = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid band-pass float property 0x%04x", param); + } +} +void ALbandpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALbandpass_setParamf(filter, context, param, vals[0]); } + +void ALbandpass_getParami(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid band-pass integer property 0x%04x", param); } +void ALbandpass_getParamiv(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid band-pass integer-vector property 0x%04x", param); } +void ALbandpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_BANDPASS_GAIN: + *val = filter->Gain; + break; + + case AL_BANDPASS_GAINHF: + *val = filter->GainHF; + break; + + case AL_BANDPASS_GAINLF: + *val = filter->GainLF; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid band-pass float property 0x%04x", param); + } +} +void ALbandpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALbandpass_getParamf(filter, context, param, vals); } + +DEFINE_ALFILTER_VTABLE(ALbandpass); + + +void ALnullfilter_setParami(ALfilter*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +void ALnullfilter_setParamiv(ALfilter*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +void ALnullfilter_setParamf(ALfilter*, ALCcontext *context, ALenum param, ALfloat) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +void ALnullfilter_setParamfv(ALfilter*, ALCcontext *context, ALenum param, const ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } + +void ALnullfilter_getParami(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +void ALnullfilter_getParamiv(ALfilter*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +void ALnullfilter_getParamf(ALfilter*, ALCcontext *context, ALenum param, ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +void ALnullfilter_getParamfv(ALfilter*, ALCcontext *context, ALenum param, ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } + +DEFINE_ALFILTER_VTABLE(ALnullfilter); + + +void InitFilterParams(ALfilter *filter, ALenum type) +{ + if(type == AL_FILTER_LOWPASS) + { + filter->Gain = AL_LOWPASS_DEFAULT_GAIN; + filter->GainHF = AL_LOWPASS_DEFAULT_GAINHF; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = 1.0f; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALlowpass_vtable; + } + else if(type == AL_FILTER_HIGHPASS) + { + filter->Gain = AL_HIGHPASS_DEFAULT_GAIN; + filter->GainHF = 1.0f; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = AL_HIGHPASS_DEFAULT_GAINLF; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALhighpass_vtable; + } + else if(type == AL_FILTER_BANDPASS) + { + filter->Gain = AL_BANDPASS_DEFAULT_GAIN; + filter->GainHF = AL_BANDPASS_DEFAULT_GAINHF; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = AL_BANDPASS_DEFAULT_GAINLF; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALbandpass_vtable; + } + else + { + filter->Gain = 1.0f; + filter->GainHF = 1.0f; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = 1.0f; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALnullfilter_vtable; + } + filter->type = type; +} + +bool EnsureFilters(ALCdevice *device, size_t needed) +{ + size_t count{std::accumulate(device->FilterList.cbegin(), device->FilterList.cend(), size_t{0}, + [](size_t cur, const FilterSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(sublist.FreeMask)); } + )}; + + while(needed > count) + { + if UNLIKELY(device->FilterList.size() >= 1<<25) + return false; + + device->FilterList.emplace_back(); + auto sublist = device->FilterList.end() - 1; + sublist->FreeMask = ~0_u64; + sublist->Filters = static_cast(al_calloc(alignof(ALfilter), sizeof(ALfilter)*64)); + if UNLIKELY(!sublist->Filters) + { + device->FilterList.pop_back(); + return false; + } + count += 64; + } + return true; +} + + +ALfilter *AllocFilter(ALCdevice *device) +{ + auto sublist = std::find_if(device->FilterList.begin(), device->FilterList.end(), + [](const FilterSubList &entry) noexcept -> bool + { return entry.FreeMask != 0; } + ); + auto lidx = static_cast(std::distance(device->FilterList.begin(), sublist)); + auto slidx = static_cast(CTZ64(sublist->FreeMask)); + + ALfilter *filter{::new (sublist->Filters + slidx) ALfilter{}}; + InitFilterParams(filter, AL_FILTER_NULL); + + /* Add 1 to avoid filter ID 0. */ + filter->id = ((lidx<<6) | slidx) + 1; + + sublist->FreeMask &= ~(1_u64 << slidx); + + return filter; +} + +void FreeFilter(ALCdevice *device, ALfilter *filter) +{ + const ALuint id{filter->id - 1}; + const size_t lidx{id >> 6}; + const ALuint slidx{id & 0x3f}; + + al::destroy_at(filter); + + device->FilterList[lidx].FreeMask |= 1_u64 << slidx; +} + + +inline ALfilter *LookupFilter(ALCdevice *device, ALuint id) +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= device->FilterList.size()) + return nullptr; + FilterSubList &sublist = device->FilterList[lidx]; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Filters + slidx; +} + +} // namespace + +AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Generating %d filters", n); + if UNLIKELY(n <= 0) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->EffectLock}; + if(!EnsureFilters(device, static_cast(n))) + { + context->setError(AL_OUT_OF_MEMORY, "Failed to allocate %d filter%s", n, (n==1)?"":"s"); + return; + } + + if LIKELY(n == 1) + { + /* Special handling for the easy and normal case. */ + ALfilter *filter{AllocFilter(device)}; + if(filter) filters[0] = filter->id; + } + else + { + /* Store the allocated buffer IDs in a separate local list, to avoid + * modifying the user storage in case of failure. + */ + al::vector ids; + ids.reserve(static_cast(n)); + do { + ALfilter *filter{AllocFilter(device)}; + ids.emplace_back(filter->id); + } while(--n); + std::copy(ids.begin(), ids.end(), filters); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Deleting %d filters", n); + if UNLIKELY(n <= 0) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + /* First try to find any filters that are invalid. */ + auto validate_filter = [device](const ALuint fid) -> bool + { return !fid || LookupFilter(device, fid) != nullptr; }; + + const ALuint *filters_end = filters + n; + auto invflt = std::find_if_not(filters, filters_end, validate_filter); + if UNLIKELY(invflt != filters_end) + { + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", *invflt); + return; + } + + /* All good. Delete non-0 filter IDs. */ + auto delete_filter = [device](const ALuint fid) -> void + { + ALfilter *filter{fid ? LookupFilter(device, fid) : nullptr}; + if(filter) FreeFilter(device, filter); + }; + std::for_each(filters, filters_end, delete_filter); +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if LIKELY(context) + { + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + if(!filter || LookupFilter(device, filter)) + return AL_TRUE; + } + return AL_FALSE; +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + if(param == AL_FILTER_TYPE) + { + if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS || + value == AL_FILTER_HIGHPASS || value == AL_FILTER_BANDPASS) + InitFilterParams(alfilt, value); + else + context->setError(AL_INVALID_VALUE, "Invalid filter type 0x%04x", value); + } + else + { + /* Call the appropriate handler */ + ALfilter_setParami(alfilt, context.get(), param, value); + } + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_FILTER_TYPE: + alFilteri(filter, param, values[0]); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_setParamiv(alfilt, context.get(), param, values); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_setParamf(alfilt, context.get(), param, value); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_setParamfv(alfilt, context.get(), param, values); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + if(param == AL_FILTER_TYPE) + *value = alfilt->type; + else + { + /* Call the appropriate handler */ + ALfilter_getParami(alfilt, context.get(), param, value); + } + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *values) +START_API_FUNC +{ + switch(param) + { + case AL_FILTER_TYPE: + alGetFilteri(filter, param, values); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_getParamiv(alfilt, context.get(), param, values); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_getParamf(alfilt, context.get(), param, value); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALCdevice *device{context->mDevice.get()}; + std::lock_guard _{device->FilterLock}; + + ALfilter *alfilt{LookupFilter(device, filter)}; + if UNLIKELY(!alfilt) + context->setError(AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_getParamfv(alfilt, context.get(), param, values); + } +} +END_API_FUNC + + +FilterSubList::~FilterSubList() +{ + uint64_t usemask{~FreeMask}; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + al::destroy_at(Filters+idx); + usemask &= ~(1_u64 << idx); + } + FreeMask = ~usemask; + al_free(Filters); + Filters = nullptr; +} diff --git a/al/filter.h b/al/filter.h new file mode 100644 index 0000000..db098d7 --- /dev/null +++ b/al/filter.h @@ -0,0 +1,56 @@ +#ifndef AL_FILTER_H +#define AL_FILTER_H + +#include "AL/al.h" +#include "AL/alc.h" + + +#define LOWPASSFREQREF (5000.0f) +#define HIGHPASSFREQREF (250.0f) + + +struct ALfilter; + +struct ALfilterVtable { + void (*const setParami)(ALfilter *filter, ALCcontext *context, ALenum param, ALint val); + void (*const setParamiv)(ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals); + void (*const setParamf)(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val); + void (*const setParamfv)(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals); + + void (*const getParami)(ALfilter *filter, ALCcontext *context, ALenum param, ALint *val); + void (*const getParamiv)(ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals); + void (*const getParamf)(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val); + void (*const getParamfv)(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals); +}; + +#define DEFINE_ALFILTER_VTABLE(T) \ +const ALfilterVtable T##_vtable = { \ + T##_setParami, T##_setParamiv, T##_setParamf, T##_setParamfv, \ + T##_getParami, T##_getParamiv, T##_getParamf, T##_getParamfv, \ +} + +struct ALfilter { + // Filter type (AL_FILTER_NULL, ...) + ALenum type; + + ALfloat Gain; + ALfloat GainHF; + ALfloat HFReference; + ALfloat GainLF; + ALfloat LFReference; + + const ALfilterVtable *vtab; + + /* Self ID */ + ALuint id; +}; +#define ALfilter_setParami(o, c, p, v) ((o)->vtab->setParami(o, c, p, v)) +#define ALfilter_setParamf(o, c, p, v) ((o)->vtab->setParamf(o, c, p, v)) +#define ALfilter_setParamiv(o, c, p, v) ((o)->vtab->setParamiv(o, c, p, v)) +#define ALfilter_setParamfv(o, c, p, v) ((o)->vtab->setParamfv(o, c, p, v)) +#define ALfilter_getParami(o, c, p, v) ((o)->vtab->getParami(o, c, p, v)) +#define ALfilter_getParamf(o, c, p, v) ((o)->vtab->getParamf(o, c, p, v)) +#define ALfilter_getParamiv(o, c, p, v) ((o)->vtab->getParamiv(o, c, p, v)) +#define ALfilter_getParamfv(o, c, p, v) ((o)->vtab->getParamfv(o, c, p, v)) + +#endif diff --git a/al/listener.cpp b/al/listener.cpp new file mode 100644 index 0000000..7a14a9b --- /dev/null +++ b/al/listener.cpp @@ -0,0 +1,452 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2000 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "listener.h" + +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "atomic.h" +#include "opthelpers.h" + + +#define DO_UPDATEPROPS() do { \ + if(!context->mDeferUpdates.load(std::memory_order_acquire)) \ + UpdateListenerProps(context.get()); \ + else \ + listener.PropsClean.clear(std::memory_order_release); \ +} while(0) + + +AL_API ALvoid AL_APIENTRY alListenerf(ALenum param, ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + switch(param) + { + case AL_GAIN: + if(!(value >= 0.0f && std::isfinite(value))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Listener gain out of range"); + listener.Gain = value; + DO_UPDATEPROPS(); + break; + + case AL_METERS_PER_UNIT: + if(!(value >= AL_MIN_METERS_PER_UNIT && value <= AL_MAX_METERS_PER_UNIT)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Listener meters per unit out of range"); + listener.mMetersPerUnit = value; + DO_UPDATEPROPS(); + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener float property"); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + switch(param) + { + case AL_POSITION: + if(!(std::isfinite(value1) && std::isfinite(value2) && std::isfinite(value3))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Listener position out of range"); + listener.Position[0] = value1; + listener.Position[1] = value2; + listener.Position[2] = value3; + DO_UPDATEPROPS(); + break; + + case AL_VELOCITY: + if(!(std::isfinite(value1) && std::isfinite(value2) && std::isfinite(value3))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Listener velocity out of range"); + listener.Velocity[0] = value1; + listener.Velocity[1] = value2; + listener.Velocity[2] = value3; + DO_UPDATEPROPS(); + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener 3-float property"); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values) +START_API_FUNC +{ + if(values) + { + switch(param) + { + case AL_GAIN: + case AL_METERS_PER_UNIT: + alListenerf(param, values[0]); + return; + + case AL_POSITION: + case AL_VELOCITY: + alListener3f(param, values[0], values[1], values[2]); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + if(!values) SETERR_RETURN(context, AL_INVALID_VALUE,, "NULL pointer"); + switch(param) + { + case AL_ORIENTATION: + if(!(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2]) && + std::isfinite(values[3]) && std::isfinite(values[4]) && std::isfinite(values[5]))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Listener orientation out of range"); + /* AT then UP */ + listener.OrientAt[0] = values[0]; + listener.OrientAt[1] = values[1]; + listener.OrientAt[2] = values[2]; + listener.OrientUp[0] = values[3]; + listener.OrientUp[1] = values[4]; + listener.OrientUp[2] = values[5]; + DO_UPDATEPROPS(); + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener float-vector property"); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alListeneri(ALenum param, ALint /*value*/) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid listener integer property"); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3) +START_API_FUNC +{ + switch(param) + { + case AL_POSITION: + case AL_VELOCITY: + alListener3f(param, static_cast(value1), static_cast(value2), static_cast(value3)); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid listener 3-integer property"); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values) +START_API_FUNC +{ + if(values) + { + ALfloat fvals[6]; + switch(param) + { + case AL_POSITION: + case AL_VELOCITY: + alListener3f(param, static_cast(values[0]), static_cast(values[1]), static_cast(values[2])); + return; + + case AL_ORIENTATION: + fvals[0] = static_cast(values[0]); + fvals[1] = static_cast(values[1]); + fvals[2] = static_cast(values[2]); + fvals[3] = static_cast(values[3]); + fvals[4] = static_cast(values[4]); + fvals[5] = static_cast(values[5]); + alListenerfv(param, fvals); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid listener integer-vector property"); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + if(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_GAIN: + *value = listener.Gain; + break; + + case AL_METERS_PER_UNIT: + *value = listener.mMetersPerUnit; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener float property"); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + if(!value1 || !value2 || !value3) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_POSITION: + *value1 = listener.Position[0]; + *value2 = listener.Position[1]; + *value3 = listener.Position[2]; + break; + + case AL_VELOCITY: + *value1 = listener.Velocity[0]; + *value2 = listener.Velocity[1]; + *value3 = listener.Velocity[2]; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener 3-float property"); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values) +START_API_FUNC +{ + switch(param) + { + case AL_GAIN: + case AL_METERS_PER_UNIT: + alGetListenerf(param, values); + return; + + case AL_POSITION: + case AL_VELOCITY: + alGetListener3f(param, values+0, values+1, values+2); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_ORIENTATION: + // AT then UP + values[0] = listener.OrientAt[0]; + values[1] = listener.OrientAt[1]; + values[2] = listener.OrientAt[2]; + values[3] = listener.OrientUp[0]; + values[4] = listener.OrientUp[1]; + values[5] = listener.OrientUp[2]; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener float-vector property"); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetListeneri(ALenum param, ALint *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + if(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid listener integer property"); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + if(!value1 || !value2 || !value3) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_POSITION: + *value1 = static_cast(listener.Position[0]); + *value2 = static_cast(listener.Position[1]); + *value3 = static_cast(listener.Position[2]); + break; + + case AL_VELOCITY: + *value1 = static_cast(listener.Velocity[0]); + *value2 = static_cast(listener.Velocity[1]); + *value3 = static_cast(listener.Velocity[2]); + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener 3-integer property"); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint* values) +START_API_FUNC +{ + switch(param) + { + case AL_POSITION: + case AL_VELOCITY: + alGetListener3i(param, values+0, values+1, values+2); + return; + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + ALlistener &listener = context->mListener; + std::lock_guard _{context->mPropLock}; + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_ORIENTATION: + // AT then UP + values[0] = static_cast(listener.OrientAt[0]); + values[1] = static_cast(listener.OrientAt[1]); + values[2] = static_cast(listener.OrientAt[2]); + values[3] = static_cast(listener.OrientUp[0]); + values[4] = static_cast(listener.OrientUp[1]); + values[5] = static_cast(listener.OrientUp[2]); + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid listener integer-vector property"); + } +} +END_API_FUNC + + +void UpdateListenerProps(ALCcontext *context) +{ + /* Get an unused proprty container, or allocate a new one as needed. */ + ALlistenerProps *props{context->mFreeListenerProps.load(std::memory_order_acquire)}; + if(!props) + props = new ALlistenerProps{}; + else + { + ALlistenerProps *next; + do { + next = props->next.load(std::memory_order_relaxed); + } while(context->mFreeListenerProps.compare_exchange_weak(props, next, + std::memory_order_seq_cst, std::memory_order_acquire) == 0); + } + + /* Copy in current property values. */ + ALlistener &listener = context->mListener; + props->Position = listener.Position; + props->Velocity = listener.Velocity; + props->OrientAt = listener.OrientAt; + props->OrientUp = listener.OrientUp; + props->Gain = listener.Gain; + props->MetersPerUnit = listener.mMetersPerUnit; + + /* Set the new container for updating internal parameters. */ + props = listener.Params.Update.exchange(props, std::memory_order_acq_rel); + if(props) + { + /* If there was an unused update container, put it back in the + * freelist. + */ + AtomicReplaceHead(context->mFreeListenerProps, props); + } +} diff --git a/al/listener.h b/al/listener.h new file mode 100644 index 0000000..318ab02 --- /dev/null +++ b/al/listener.h @@ -0,0 +1,64 @@ +#ifndef AL_LISTENER_H +#define AL_LISTENER_H + +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "almalloc.h" +#include "vecmat.h" + +enum class DistanceModel; + + +struct ALlistenerProps { + std::array Position; + std::array Velocity; + std::array OrientAt; + std::array OrientUp; + ALfloat Gain; + ALfloat MetersPerUnit; + + std::atomic next; + + DEF_NEWDEL(ALlistenerProps) +}; + +struct ALlistener { + std::array Position{{0.0f, 0.0f, 0.0f}}; + std::array Velocity{{0.0f, 0.0f, 0.0f}}; + std::array OrientAt{{0.0f, 0.0f, -1.0f}}; + std::array OrientUp{{0.0f, 1.0f, 0.0f}}; + ALfloat Gain{1.0f}; + ALfloat mMetersPerUnit{AL_DEFAULT_METERS_PER_UNIT}; + + std::atomic_flag PropsClean; + + struct { + /* Pointer to the most recent property values that are awaiting an + * update. + */ + std::atomic Update{nullptr}; + + alu::Matrix Matrix; + alu::Vector Velocity; + + ALfloat Gain; + ALfloat MetersPerUnit; + + ALfloat DopplerFactor; + ALfloat SpeedOfSound; /* in units per sec! */ + + ALboolean SourceDistanceModel; + DistanceModel mDistanceModel; + } Params; + + ALlistener() { PropsClean.test_and_set(std::memory_order_relaxed); } +}; + +void UpdateListenerProps(ALCcontext *context); + +#endif diff --git a/al/source.cpp b/al/source.cpp new file mode 100644 index 0000000..ed94f20 --- /dev/null +++ b/al/source.cpp @@ -0,0 +1,3345 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "source.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" +#include "AL/efx.h" + +#include "alcmain.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alspan.h" +#include "alu.h" +#include "ambidefs.h" +#include "atomic.h" +#include "auxeffectslot.h" +#include "backends/base.h" +#include "bformatdec.h" +#include "buffer.h" +#include "event.h" +#include "filter.h" +#include "filters/nfc.h" +#include "filters/splitter.h" +#include "inprogext.h" +#include "logging.h" +#include "math_defs.h" +#include "opthelpers.h" +#include "ringbuffer.h" +#include "threads.h" + + +namespace { + +using namespace std::placeholders; +using std::chrono::nanoseconds; + +ALvoice *GetSourceVoice(ALsource *source, ALCcontext *context) +{ + ALuint idx{source->VoiceIdx}; + if(idx < context->mVoices.size()) + { + ALuint sid{source->id}; + ALvoice &voice = context->mVoices[idx]; + if(voice.mSourceID.load(std::memory_order_acquire) == sid) + return &voice; + } + source->VoiceIdx = INVALID_VOICE_IDX; + return nullptr; +} + +void UpdateSourceProps(const ALsource *source, ALvoice *voice, ALCcontext *context) +{ + /* Get an unused property container, or allocate a new one as needed. */ + ALvoiceProps *props{context->mFreeVoiceProps.load(std::memory_order_acquire)}; + if(!props) + props = new ALvoiceProps{}; + else + { + ALvoiceProps *next; + do { + next = props->next.load(std::memory_order_relaxed); + } while(context->mFreeVoiceProps.compare_exchange_weak(props, next, + std::memory_order_acq_rel, std::memory_order_acquire) == 0); + } + + /* Copy in current property values. */ + props->Pitch = source->Pitch; + props->Gain = source->Gain; + props->OuterGain = source->OuterGain; + props->MinGain = source->MinGain; + props->MaxGain = source->MaxGain; + props->InnerAngle = source->InnerAngle; + props->OuterAngle = source->OuterAngle; + props->RefDistance = source->RefDistance; + props->MaxDistance = source->MaxDistance; + props->RolloffFactor = source->RolloffFactor; + props->Position = source->Position; + props->Velocity = source->Velocity; + props->Direction = source->Direction; + props->OrientAt = source->OrientAt; + props->OrientUp = source->OrientUp; + props->HeadRelative = source->HeadRelative; + props->mDistanceModel = source->mDistanceModel; + props->mResampler = source->mResampler; + props->DirectChannels = source->DirectChannels; + props->mSpatializeMode = source->mSpatialize; + + props->DryGainHFAuto = source->DryGainHFAuto; + props->WetGainAuto = source->WetGainAuto; + props->WetGainHFAuto = source->WetGainHFAuto; + props->OuterGainHF = source->OuterGainHF; + + props->AirAbsorptionFactor = source->AirAbsorptionFactor; + props->RoomRolloffFactor = source->RoomRolloffFactor; + props->DopplerFactor = source->DopplerFactor; + + props->StereoPan = source->StereoPan; + + props->Radius = source->Radius; + + props->Direct.Gain = source->Direct.Gain; + props->Direct.GainHF = source->Direct.GainHF; + props->Direct.HFReference = source->Direct.HFReference; + props->Direct.GainLF = source->Direct.GainLF; + props->Direct.LFReference = source->Direct.LFReference; + + auto copy_send = [](const ALsource::SendData &srcsend) noexcept -> ALvoicePropsBase::SendData + { + ALvoicePropsBase::SendData ret; + ret.Slot = srcsend.Slot; + ret.Gain = srcsend.Gain; + ret.GainHF = srcsend.GainHF; + ret.HFReference = srcsend.HFReference; + ret.GainLF = srcsend.GainLF; + ret.LFReference = srcsend.LFReference; + return ret; + }; + std::transform(source->Send.cbegin(), source->Send.cend(), props->Send, copy_send); + + /* Set the new container for updating internal parameters. */ + props = voice->mUpdate.exchange(props, std::memory_order_acq_rel); + if(props) + { + /* If there was an unused update container, put it back in the + * freelist. + */ + AtomicReplaceHead(context->mFreeVoiceProps, props); + } +} + +/* GetSourceSampleOffset + * + * Gets the current read offset for the given Source, in 32.32 fixed-point + * samples. The offset is relative to the start of the queue (not the start of + * the current buffer). + */ +int64_t GetSourceSampleOffset(ALsource *Source, ALCcontext *context, nanoseconds *clocktime) +{ + ALCdevice *device{context->mDevice.get()}; + const ALbufferlistitem *Current; + uint64_t readPos; + ALuint refcount; + ALvoice *voice; + + do { + Current = nullptr; + readPos = 0; + while(((refcount=device->MixCount.load(std::memory_order_acquire))&1)) + std::this_thread::yield(); + *clocktime = GetDeviceClockTime(device); + + voice = GetSourceVoice(Source, context); + if(voice) + { + Current = voice->mCurrentBuffer.load(std::memory_order_relaxed); + + readPos = uint64_t{voice->mPosition.load(std::memory_order_relaxed)} << 32; + readPos |= uint64_t{voice->mPositionFrac.load(std::memory_order_relaxed)} << + (32-FRACTIONBITS); + } + std::atomic_thread_fence(std::memory_order_acquire); + } while(refcount != device->MixCount.load(std::memory_order_relaxed)); + + if(voice) + { + const ALbufferlistitem *BufferList{Source->queue}; + while(BufferList && BufferList != Current) + { + readPos += uint64_t{BufferList->mSampleLen} << 32; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + readPos = minu64(readPos, 0x7fffffffffffffff_u64); + } + + return static_cast(readPos); +} + +/* GetSourceSecOffset + * + * Gets the current read offset for the given Source, in seconds. The offset is + * relative to the start of the queue (not the start of the current buffer). + */ +ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, nanoseconds *clocktime) +{ + ALCdevice *device{context->mDevice.get()}; + const ALbufferlistitem *Current; + uint64_t readPos; + ALuint refcount; + ALvoice *voice; + + do { + Current = nullptr; + readPos = 0; + while(((refcount=device->MixCount.load(std::memory_order_acquire))&1)) + std::this_thread::yield(); + *clocktime = GetDeviceClockTime(device); + + voice = GetSourceVoice(Source, context); + if(voice) + { + Current = voice->mCurrentBuffer.load(std::memory_order_relaxed); + + readPos = uint64_t{voice->mPosition.load(std::memory_order_relaxed)} << FRACTIONBITS; + readPos |= voice->mPositionFrac.load(std::memory_order_relaxed); + } + std::atomic_thread_fence(std::memory_order_acquire); + } while(refcount != device->MixCount.load(std::memory_order_relaxed)); + + ALdouble offset{0.0}; + if(voice) + { + const ALbufferlistitem *BufferList{Source->queue}; + const ALbuffer *BufferFmt{nullptr}; + while(BufferList && BufferList != Current) + { + if(!BufferFmt) BufferFmt = BufferList->mBuffer; + readPos += uint64_t{BufferList->mSampleLen} << FRACTIONBITS; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + + while(BufferList && !BufferFmt) + { + BufferFmt = BufferList->mBuffer; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + assert(BufferFmt != nullptr); + + offset = static_cast(readPos) / ALdouble{FRACTIONONE} / BufferFmt->Frequency; + } + + return offset; +} + +/* GetSourceOffset + * + * Gets the current read offset for the given Source, in the appropriate format + * (Bytes, Samples or Seconds). The offset is relative to the start of the + * queue (not the start of the current buffer). + */ +ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context) +{ + ALCdevice *device{context->mDevice.get()}; + const ALbufferlistitem *Current; + ALuint readPos; + ALuint readPosFrac; + ALuint refcount; + ALvoice *voice; + + do { + Current = nullptr; + readPos = readPosFrac = 0; + while(((refcount=device->MixCount.load(std::memory_order_acquire))&1)) + std::this_thread::yield(); + voice = GetSourceVoice(Source, context); + if(voice) + { + Current = voice->mCurrentBuffer.load(std::memory_order_relaxed); + + readPos = voice->mPosition.load(std::memory_order_relaxed); + readPosFrac = voice->mPositionFrac.load(std::memory_order_relaxed); + } + std::atomic_thread_fence(std::memory_order_acquire); + } while(refcount != device->MixCount.load(std::memory_order_relaxed)); + + ALdouble offset{0.0}; + if(!voice) return offset; + + const ALbufferlistitem *BufferList{Source->queue}; + const ALbuffer *BufferFmt{nullptr}; + ALuint totalBufferLen{0u}; + bool readFin{false}; + + while(BufferList) + { + if(!BufferFmt) BufferFmt = BufferList->mBuffer; + + readFin |= (BufferList == Current); + totalBufferLen += BufferList->mSampleLen; + if(!readFin) readPos += BufferList->mSampleLen; + + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + assert(BufferFmt != nullptr); + + if(Source->Looping) + readPos %= totalBufferLen; + else + { + /* Wrap back to 0 */ + if(readPos >= totalBufferLen) + readPos = readPosFrac = 0; + } + + switch(name) + { + case AL_SEC_OFFSET: + offset = (readPos + static_cast(readPosFrac)/FRACTIONONE) / BufferFmt->Frequency; + break; + + case AL_SAMPLE_OFFSET: + offset = readPos + static_cast(readPosFrac)/FRACTIONONE; + break; + + case AL_BYTE_OFFSET: + if(BufferFmt->OriginalType == UserFmtIMA4) + { + ALuint FrameBlockSize{BufferFmt->OriginalAlign}; + ALuint align{(BufferFmt->OriginalAlign-1)/2 + 4}; + ALuint BlockSize{align * BufferFmt->channelsFromFmt()}; + + /* Round down to nearest ADPCM block */ + offset = static_cast(readPos / FrameBlockSize * BlockSize); + } + else if(BufferFmt->OriginalType == UserFmtMSADPCM) + { + ALuint FrameBlockSize{BufferFmt->OriginalAlign}; + ALuint align{(FrameBlockSize-2)/2 + 7}; + ALuint BlockSize{align * BufferFmt->channelsFromFmt()}; + + /* Round down to nearest ADPCM block */ + offset = static_cast(readPos / FrameBlockSize * BlockSize); + } + else + { + const ALuint FrameSize{BufferFmt->frameSizeFromFmt()}; + offset = static_cast(readPos * FrameSize); + } + break; + } + + return offset; +} + + +struct VoicePos { + ALuint pos, frac; + ALbufferlistitem *bufferitem; +}; + +/** + * GetSampleOffset + * + * Retrieves the voice position, fixed-point fraction, and bufferlist item + * using the source's stored offset and offset type. If the source has no + * stored offset, or the offset is out of range, returns an empty optional. + */ +al::optional GetSampleOffset(ALsource *Source) +{ + al::optional ret; + + /* Find the first valid Buffer in the Queue */ + const ALbuffer *BufferFmt{nullptr}; + ALbufferlistitem *BufferList{Source->queue}; + while(BufferList) + { + if((BufferFmt=BufferList->mBuffer) != nullptr) break; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + if(!BufferList) + { + Source->OffsetType = AL_NONE; + Source->Offset = 0.0; + return ret; + } + + /* Get sample frame offset */ + ALuint offset{0u}, frac{0u}; + ALdouble dbloff, dblfrac; + switch(Source->OffsetType) + { + case AL_BYTE_OFFSET: + /* Determine the ByteOffset (and ensure it is block aligned) */ + offset = static_cast(Source->Offset); + if(BufferFmt->OriginalType == UserFmtIMA4) + { + const ALuint align{(BufferFmt->OriginalAlign-1)/2 + 4}; + offset /= align * BufferFmt->channelsFromFmt(); + offset *= BufferFmt->OriginalAlign; + } + else if(BufferFmt->OriginalType == UserFmtMSADPCM) + { + const ALuint align{(BufferFmt->OriginalAlign-2)/2 + 7}; + offset /= align * BufferFmt->channelsFromFmt(); + offset *= BufferFmt->OriginalAlign; + } + else + offset /= BufferFmt->frameSizeFromFmt(); + frac = 0; + break; + + case AL_SAMPLE_OFFSET: + dblfrac = std::modf(Source->Offset, &dbloff); + offset = static_cast(mind(dbloff, std::numeric_limits::max())); + frac = static_cast(mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0)); + break; + + case AL_SEC_OFFSET: + dblfrac = std::modf(Source->Offset*BufferFmt->Frequency, &dbloff); + offset = static_cast(mind(dbloff, std::numeric_limits::max())); + frac = static_cast(mind(dblfrac*FRACTIONONE, FRACTIONONE-1.0)); + break; + } + Source->OffsetType = AL_NONE; + Source->Offset = 0.0; + + /* Find the bufferlist item this offset belongs to. */ + ALuint totalBufferLen{0u}; + while(BufferList && totalBufferLen <= offset) + { + if(BufferList->mSampleLen > offset-totalBufferLen) + { + /* Offset is in this buffer */ + ret = {offset-totalBufferLen, frac, BufferList}; + return ret; + } + totalBufferLen += BufferList->mSampleLen; + + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + + /* Offset is out of range of the queue */ + return ret; +} + + +/** + * Returns if the last known state for the source was playing or paused. Does + * not sync with the mixer voice. + */ +inline bool IsPlayingOrPaused(ALsource *source) +{ return source->state == AL_PLAYING || source->state == AL_PAUSED; } + +/** + * Returns an updated source state using the matching voice's status (or lack + * thereof). + */ +inline ALenum GetSourceState(ALsource *source, ALvoice *voice) +{ + if(!voice && source->state == AL_PLAYING) + source->state = AL_STOPPED; + return source->state; +} + +/** + * Returns if the source should specify an update, given the context's + * deferring state and the source's last known state. + */ +inline bool SourceShouldUpdate(ALsource *source, ALCcontext *context) +{ + return !context->mDeferUpdates.load(std::memory_order_acquire) && + IsPlayingOrPaused(source); +} + + +bool EnsureSources(ALCcontext *context, size_t needed) +{ + size_t count{std::accumulate(context->mSourceList.cbegin(), context->mSourceList.cend(), + size_t{0}, + [](size_t cur, const SourceSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(sublist.FreeMask)); } + )}; + + while(needed > count) + { + if UNLIKELY(context->mSourceList.size() >= 1<<25) + return false; + + context->mSourceList.emplace_back(); + auto sublist = context->mSourceList.end() - 1; + sublist->FreeMask = ~0_u64; + sublist->Sources = static_cast(al_calloc(alignof(ALsource), sizeof(ALsource)*64)); + if UNLIKELY(!sublist->Sources) + { + context->mSourceList.pop_back(); + return false; + } + count += 64; + } + return true; +} + +ALsource *AllocSource(ALCcontext *context, ALuint num_sends) +{ + auto sublist = std::find_if(context->mSourceList.begin(), context->mSourceList.end(), + [](const SourceSubList &entry) noexcept -> bool + { return entry.FreeMask != 0; } + ); + auto lidx = static_cast(std::distance(context->mSourceList.begin(), sublist)); + auto slidx = static_cast(CTZ64(sublist->FreeMask)); + + ALsource *source{::new (sublist->Sources + slidx) ALsource{num_sends}}; + + /* Add 1 to avoid source ID 0. */ + source->id = ((lidx<<6) | slidx) + 1; + + context->mNumSources += 1; + sublist->FreeMask &= ~(1_u64 << slidx); + + return source; +} + +void FreeSource(ALCcontext *context, ALsource *source) +{ + const ALuint id{source->id - 1}; + const size_t lidx{id >> 6}; + const ALuint slidx{id & 0x3f}; + + if(IsPlayingOrPaused(source)) + { + ALCdevice *device{context->mDevice.get()}; + BackendLockGuard _{*device->Backend}; + if(ALvoice *voice{GetSourceVoice(source, context)}) + { + voice->mCurrentBuffer.store(nullptr, std::memory_order_relaxed); + voice->mLoopBuffer.store(nullptr, std::memory_order_relaxed); + voice->mSourceID.store(0u, std::memory_order_relaxed); + std::atomic_thread_fence(std::memory_order_release); + /* Don't set the voice to stopping if it was already stopped or + * stopping. + */ + ALvoice::State oldvstate{ALvoice::Playing}; + voice->mPlayState.compare_exchange_strong(oldvstate, ALvoice::Stopping, + std::memory_order_acq_rel, std::memory_order_acquire); + } + } + + al::destroy_at(source); + + context->mSourceList[lidx].FreeMask |= 1_u64 << slidx; + context->mNumSources--; +} + + +inline ALsource *LookupSource(ALCcontext *context, ALuint id) noexcept +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= context->mSourceList.size()) + return nullptr; + SourceSubList &sublist{context->mSourceList[lidx]}; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Sources + slidx; +} + +inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) noexcept +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= device->BufferList.size()) + return nullptr; + BufferSubList &sublist = device->BufferList[lidx]; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Buffers + slidx; +} + +inline ALfilter *LookupFilter(ALCdevice *device, ALuint id) noexcept +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= device->FilterList.size()) + return nullptr; + FilterSubList &sublist = device->FilterList[lidx]; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.Filters + slidx; +} + +inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) noexcept +{ + const size_t lidx{(id-1) >> 6}; + const ALuint slidx{(id-1) & 0x3f}; + + if UNLIKELY(lidx >= context->mEffectSlotList.size()) + return nullptr; + EffectSlotSubList &sublist{context->mEffectSlotList[lidx]}; + if UNLIKELY(sublist.FreeMask & (1_u64 << slidx)) + return nullptr; + return sublist.EffectSlots + slidx; +} + + +enum SourceProp : ALenum { + srcPitch = AL_PITCH, + srcGain = AL_GAIN, + srcMinGain = AL_MIN_GAIN, + srcMaxGain = AL_MAX_GAIN, + srcMaxDistance = AL_MAX_DISTANCE, + srcRolloffFactor = AL_ROLLOFF_FACTOR, + srcDopplerFactor = AL_DOPPLER_FACTOR, + srcConeOuterGain = AL_CONE_OUTER_GAIN, + srcSecOffset = AL_SEC_OFFSET, + srcSampleOffset = AL_SAMPLE_OFFSET, + srcByteOffset = AL_BYTE_OFFSET, + srcConeInnerAngle = AL_CONE_INNER_ANGLE, + srcConeOuterAngle = AL_CONE_OUTER_ANGLE, + srcRefDistance = AL_REFERENCE_DISTANCE, + + srcPosition = AL_POSITION, + srcVelocity = AL_VELOCITY, + srcDirection = AL_DIRECTION, + + srcSourceRelative = AL_SOURCE_RELATIVE, + srcLooping = AL_LOOPING, + srcBuffer = AL_BUFFER, + srcSourceState = AL_SOURCE_STATE, + srcBuffersQueued = AL_BUFFERS_QUEUED, + srcBuffersProcessed = AL_BUFFERS_PROCESSED, + srcSourceType = AL_SOURCE_TYPE, + + /* ALC_EXT_EFX */ + srcConeOuterGainHF = AL_CONE_OUTER_GAINHF, + srcAirAbsorptionFactor = AL_AIR_ABSORPTION_FACTOR, + srcRoomRolloffFactor = AL_ROOM_ROLLOFF_FACTOR, + srcDirectFilterGainHFAuto = AL_DIRECT_FILTER_GAINHF_AUTO, + srcAuxSendFilterGainAuto = AL_AUXILIARY_SEND_FILTER_GAIN_AUTO, + srcAuxSendFilterGainHFAuto = AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO, + srcDirectFilter = AL_DIRECT_FILTER, + srcAuxSendFilter = AL_AUXILIARY_SEND_FILTER, + + /* AL_SOFT_direct_channels */ + srcDirectChannelsSOFT = AL_DIRECT_CHANNELS_SOFT, + + /* AL_EXT_source_distance_model */ + srcDistanceModel = AL_DISTANCE_MODEL, + + /* AL_SOFT_source_latency */ + srcSampleOffsetLatencySOFT = AL_SAMPLE_OFFSET_LATENCY_SOFT, + srcSecOffsetLatencySOFT = AL_SEC_OFFSET_LATENCY_SOFT, + + /* AL_EXT_STEREO_ANGLES */ + srcAngles = AL_STEREO_ANGLES, + + /* AL_EXT_SOURCE_RADIUS */ + srcRadius = AL_SOURCE_RADIUS, + + /* AL_EXT_BFORMAT */ + srcOrientation = AL_ORIENTATION, + + /* AL_SOFT_source_resampler */ + srcResampler = AL_SOURCE_RESAMPLER_SOFT, + + /* AL_SOFT_source_spatialize */ + srcSpatialize = AL_SOURCE_SPATIALIZE_SOFT, + + /* ALC_SOFT_device_clock */ + srcSampleOffsetClockSOFT = AL_SAMPLE_OFFSET_CLOCK_SOFT, + srcSecOffsetClockSOFT = AL_SEC_OFFSET_CLOCK_SOFT, +}; + + +/** Can only be called while the mixer is locked! */ +void SendStateChangeEvent(ALCcontext *context, ALuint id, ALenum state) +{ + ALbitfieldSOFT enabledevt{context->mEnabledEvts.load(std::memory_order_acquire)}; + if(!(enabledevt&EventType_SourceStateChange)) return; + + /* The mixer may have queued a state change that's not yet been processed, + * and we don't want state change messages to occur out of order, so send + * it through the async queue to ensure proper ordering. + */ + RingBuffer *ring{context->mAsyncEvents.get()}; + auto evt_vec = ring->getWriteVector(); + if(evt_vec.first.len < 1) return; + + AsyncEvent *evt{::new (evt_vec.first.buf) AsyncEvent{EventType_SourceStateChange}}; + evt->u.srcstate.id = id; + evt->u.srcstate.state = state; + ring->writeAdvance(1); + context->mEventSem.post(); +} + + +constexpr size_t MaxValues{6u}; + +ALuint FloatValsByProp(ALenum prop) +{ + switch(static_cast(prop)) + { + case AL_PITCH: + case AL_GAIN: + case AL_MIN_GAIN: + case AL_MAX_GAIN: + case AL_MAX_DISTANCE: + case AL_ROLLOFF_FACTOR: + case AL_DOPPLER_FACTOR: + case AL_CONE_OUTER_GAIN: + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + case AL_CONE_INNER_ANGLE: + case AL_CONE_OUTER_ANGLE: + case AL_REFERENCE_DISTANCE: + case AL_CONE_OUTER_GAINHF: + case AL_AIR_ABSORPTION_FACTOR: + case AL_ROOM_ROLLOFF_FACTOR: + case AL_DIRECT_FILTER_GAINHF_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + case AL_DIRECT_CHANNELS_SOFT: + case AL_DISTANCE_MODEL: + case AL_SOURCE_RELATIVE: + case AL_LOOPING: + case AL_SOURCE_STATE: + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + case AL_SOURCE_TYPE: + case AL_SOURCE_RADIUS: + case AL_SOURCE_RESAMPLER_SOFT: + case AL_SOURCE_SPATIALIZE_SOFT: + return 1; + + case AL_STEREO_ANGLES: + return 2; + + case AL_POSITION: + case AL_VELOCITY: + case AL_DIRECTION: + return 3; + + case AL_ORIENTATION: + return 6; + + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + break; /* Double only */ + + case AL_BUFFER: + case AL_DIRECT_FILTER: + case AL_AUXILIARY_SEND_FILTER: + break; /* i/i64 only */ + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + break; /* i64 only */ + } + return 0; +} +ALuint DoubleValsByProp(ALenum prop) +{ + switch(static_cast(prop)) + { + case AL_PITCH: + case AL_GAIN: + case AL_MIN_GAIN: + case AL_MAX_GAIN: + case AL_MAX_DISTANCE: + case AL_ROLLOFF_FACTOR: + case AL_DOPPLER_FACTOR: + case AL_CONE_OUTER_GAIN: + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + case AL_CONE_INNER_ANGLE: + case AL_CONE_OUTER_ANGLE: + case AL_REFERENCE_DISTANCE: + case AL_CONE_OUTER_GAINHF: + case AL_AIR_ABSORPTION_FACTOR: + case AL_ROOM_ROLLOFF_FACTOR: + case AL_DIRECT_FILTER_GAINHF_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + case AL_DIRECT_CHANNELS_SOFT: + case AL_DISTANCE_MODEL: + case AL_SOURCE_RELATIVE: + case AL_LOOPING: + case AL_SOURCE_STATE: + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + case AL_SOURCE_TYPE: + case AL_SOURCE_RADIUS: + case AL_SOURCE_RESAMPLER_SOFT: + case AL_SOURCE_SPATIALIZE_SOFT: + return 1; + + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + case AL_STEREO_ANGLES: + return 2; + + case AL_POSITION: + case AL_VELOCITY: + case AL_DIRECTION: + return 3; + + case AL_ORIENTATION: + return 6; + + case AL_BUFFER: + case AL_DIRECT_FILTER: + case AL_AUXILIARY_SEND_FILTER: + break; /* i/i64 only */ + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + break; /* i64 only */ + } + return 0; +} + + +bool SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values); +bool SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values); +bool SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values); + +#define CHECKSIZE(v, s) do { \ + if LIKELY((v).size() == (s) || (v).size() == MaxValues) break; \ + Context->setError(AL_INVALID_ENUM, \ + "Property 0x%04x expects %d value(s), got %zu", prop, (s), \ + (v).size()); \ + return false; \ +} while(0) +#define CHECKVAL(x) do { \ + if LIKELY(x) break; \ + Context->setError(AL_INVALID_VALUE, "Value out of range"); \ + return false; \ +} while(0) + +bool UpdateSourceProps(ALsource *source, ALCcontext *context) +{ + ALvoice *voice; + if(SourceShouldUpdate(source, context) && (voice=GetSourceVoice(source, context)) != nullptr) + UpdateSourceProps(source, voice, context); + else + source->PropsClean.clear(std::memory_order_release); + return true; +} + +bool SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values) +{ + ALint ival; + + switch(prop) + { + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + /* Query only */ + SETERR_RETURN(Context, AL_INVALID_OPERATION, false, + "Setting read-only source property 0x%04x", prop); + + case AL_PITCH: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->Pitch = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_CONE_INNER_ANGLE: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 360.0f); + + Source->InnerAngle = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_CONE_OUTER_ANGLE: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 360.0f); + + Source->OuterAngle = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_GAIN: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->Gain = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_MAX_DISTANCE: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->MaxDistance = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_ROLLOFF_FACTOR: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->RolloffFactor = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_REFERENCE_DISTANCE: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->RefDistance = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_MIN_GAIN: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->MinGain = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_MAX_GAIN: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->MaxGain = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_CONE_OUTER_GAIN: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 1.0f); + + Source->OuterGain = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_CONE_OUTER_GAINHF: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 1.0f); + + Source->OuterGainHF = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_AIR_ABSORPTION_FACTOR: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 10.0f); + + Source->AirAbsorptionFactor = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_ROOM_ROLLOFF_FACTOR: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 10.0f); + + Source->RoomRolloffFactor = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_DOPPLER_FACTOR: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && values[0] <= 1.0f); + + Source->DopplerFactor = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f); + + Source->OffsetType = prop; + Source->Offset = values[0]; + + if(IsPlayingOrPaused(Source)) + { + ALCdevice *device{Context->mDevice.get()}; + BackendLockGuard _{*device->Backend}; + /* Double-check that the source is still playing while we have the + * lock. + */ + if(ALvoice *voice{GetSourceVoice(Source, Context)}) + { + auto vpos = GetSampleOffset(Source); + if(!vpos) SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid offset"); + + voice->mPosition.store(vpos->pos, std::memory_order_relaxed); + voice->mPositionFrac.store(vpos->frac, std::memory_order_relaxed); + voice->mCurrentBuffer.store(vpos->bufferitem, std::memory_order_release); + } + } + return true; + + case AL_SOURCE_RADIUS: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0.0f && std::isfinite(values[0])); + + Source->Radius = values[0]; + return UpdateSourceProps(Source, Context); + + case AL_STEREO_ANGLES: + CHECKSIZE(values, 2); + CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1])); + + Source->StereoPan[0] = values[0]; + Source->StereoPan[1] = values[1]; + return UpdateSourceProps(Source, Context); + + + case AL_POSITION: + CHECKSIZE(values, 3); + CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2])); + + Source->Position[0] = values[0]; + Source->Position[1] = values[1]; + Source->Position[2] = values[2]; + return UpdateSourceProps(Source, Context); + + case AL_VELOCITY: + CHECKSIZE(values, 3); + CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2])); + + Source->Velocity[0] = values[0]; + Source->Velocity[1] = values[1]; + Source->Velocity[2] = values[2]; + return UpdateSourceProps(Source, Context); + + case AL_DIRECTION: + CHECKSIZE(values, 3); + CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2])); + + Source->Direction[0] = values[0]; + Source->Direction[1] = values[1]; + Source->Direction[2] = values[2]; + return UpdateSourceProps(Source, Context); + + case AL_ORIENTATION: + CHECKSIZE(values, 6); + CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2]) + && std::isfinite(values[3]) && std::isfinite(values[4]) && std::isfinite(values[5])); + + Source->OrientAt[0] = values[0]; + Source->OrientAt[1] = values[1]; + Source->OrientAt[2] = values[2]; + Source->OrientUp[0] = values[3]; + Source->OrientUp[1] = values[4]; + Source->OrientUp[2] = values[5]; + return UpdateSourceProps(Source, Context); + + + case AL_SOURCE_RELATIVE: + case AL_LOOPING: + case AL_SOURCE_STATE: + case AL_SOURCE_TYPE: + case AL_DISTANCE_MODEL: + case AL_DIRECT_FILTER_GAINHF_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + case AL_DIRECT_CHANNELS_SOFT: + case AL_SOURCE_RESAMPLER_SOFT: + case AL_SOURCE_SPATIALIZE_SOFT: + CHECKSIZE(values, 1); + ival = static_cast(values[0]); + return SetSourceiv(Source, Context, prop, {&ival, 1u}); + + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + CHECKSIZE(values, 1); + ival = static_cast(static_cast(values[0])); + return SetSourceiv(Source, Context, prop, {&ival, 1u}); + + case AL_BUFFER: + case AL_DIRECT_FILTER: + case AL_AUXILIARY_SEND_FILTER: + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + break; + } + + ERR("Unexpected property: 0x%04x\n", prop); + Context->setError(AL_INVALID_ENUM, "Invalid source float property 0x%04x", prop); + return false; +} + +bool SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values) +{ + ALCdevice *device{Context->mDevice.get()}; + ALbuffer *buffer{nullptr}; + ALfilter *filter{nullptr}; + ALeffectslot *slot{nullptr}; + ALbufferlistitem *oldlist{nullptr}; + std::unique_lock slotlock; + std::unique_lock filtlock; + std::unique_lock buflock; + ALfloat fvals[6]; + + switch(prop) + { + case AL_SOURCE_STATE: + case AL_SOURCE_TYPE: + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + /* Query only */ + SETERR_RETURN(Context, AL_INVALID_OPERATION, false, + "Setting read-only source property 0x%04x", prop); + + case AL_SOURCE_RELATIVE: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE); + + Source->HeadRelative = values[0] != AL_FALSE; + return UpdateSourceProps(Source, Context); + + case AL_LOOPING: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE); + + Source->Looping = values[0] != AL_FALSE; + if(IsPlayingOrPaused(Source)) + { + if(ALvoice *voice{GetSourceVoice(Source, Context)}) + { + if(Source->Looping) + voice->mLoopBuffer.store(Source->queue, std::memory_order_release); + else + voice->mLoopBuffer.store(nullptr, std::memory_order_release); + + /* If the source is playing, wait for the current mix to finish + * to ensure it isn't currently looping back or reaching the + * end. + */ + while((device->MixCount.load(std::memory_order_acquire)&1)) + std::this_thread::yield(); + } + } + return true; + + case AL_BUFFER: + CHECKSIZE(values, 1); + buflock = std::unique_lock{device->BufferLock}; + if(values[0] && (buffer=LookupBuffer(device, static_cast(values[0]))) == nullptr) + SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid buffer ID %u", + static_cast(values[0])); + + if(buffer && buffer->MappedAccess != 0 && + !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) + SETERR_RETURN(Context, AL_INVALID_OPERATION, false, + "Setting non-persistently mapped buffer %u", buffer->id); + else + { + ALenum state = GetSourceState(Source, GetSourceVoice(Source, Context)); + if(state == AL_PLAYING || state == AL_PAUSED) + SETERR_RETURN(Context, AL_INVALID_OPERATION, false, + "Setting buffer on playing or paused source %u", Source->id); + } + + oldlist = Source->queue; + if(buffer != nullptr) + { + /* Add the selected buffer to a one-item queue */ + auto newlist = new ALbufferlistitem{}; + newlist->mSampleLen = buffer->SampleLen; + newlist->mBuffer = buffer; + IncrementRef(buffer->ref); + + /* Source is now Static */ + Source->SourceType = AL_STATIC; + Source->queue = newlist; + } + else + { + /* Source is now Undetermined */ + Source->SourceType = AL_UNDETERMINED; + Source->queue = nullptr; + } + buflock.unlock(); + + /* Delete all elements in the previous queue */ + while(oldlist != nullptr) + { + std::unique_ptr temp{oldlist}; + oldlist = temp->mNext.load(std::memory_order_relaxed); + + if((buffer=temp->mBuffer) != nullptr) + DecrementRef(buffer->ref); + } + return true; + + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0); + + Source->OffsetType = prop; + Source->Offset = values[0]; + + if(IsPlayingOrPaused(Source)) + { + BackendLockGuard _{*device->Backend}; + if(ALvoice *voice{GetSourceVoice(Source, Context)}) + { + auto vpos = GetSampleOffset(Source); + if(!vpos) SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid source offset"); + + voice->mPosition.store(vpos->pos, std::memory_order_relaxed); + voice->mPositionFrac.store(vpos->frac, std::memory_order_relaxed); + voice->mCurrentBuffer.store(vpos->bufferitem, std::memory_order_release); + } + } + return true; + + case AL_DIRECT_FILTER: + CHECKSIZE(values, 1); + filtlock = std::unique_lock{device->FilterLock}; + if(values[0] && (filter=LookupFilter(device, static_cast(values[0]))) == nullptr) + SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid filter ID %u", + static_cast(values[0])); + + if(!filter) + { + Source->Direct.Gain = 1.0f; + Source->Direct.GainHF = 1.0f; + Source->Direct.HFReference = LOWPASSFREQREF; + Source->Direct.GainLF = 1.0f; + Source->Direct.LFReference = HIGHPASSFREQREF; + } + else + { + Source->Direct.Gain = filter->Gain; + Source->Direct.GainHF = filter->GainHF; + Source->Direct.HFReference = filter->HFReference; + Source->Direct.GainLF = filter->GainLF; + Source->Direct.LFReference = filter->LFReference; + } + filtlock.unlock(); + return UpdateSourceProps(Source, Context); + + case AL_DIRECT_FILTER_GAINHF_AUTO: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE); + + Source->DryGainHFAuto = values[0] != AL_FALSE; + return UpdateSourceProps(Source, Context); + + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE); + + Source->WetGainAuto = values[0] != AL_FALSE; + return UpdateSourceProps(Source, Context); + + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE); + + Source->WetGainHFAuto = values[0] != AL_FALSE; + return UpdateSourceProps(Source, Context); + + case AL_DIRECT_CHANNELS_SOFT: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_FALSE || values[0] == AL_DROP_UNMATCHED_SOFT /* aka AL_TRUE */ + || values[0] == AL_REMIX_UNMATCHED_SOFT); + + Source->DirectChannels = static_cast(values[0]); + return UpdateSourceProps(Source, Context); + + case AL_DISTANCE_MODEL: + CHECKSIZE(values, 1); + CHECKVAL(values[0] == AL_NONE || + values[0] == AL_INVERSE_DISTANCE || values[0] == AL_INVERSE_DISTANCE_CLAMPED || + values[0] == AL_LINEAR_DISTANCE || values[0] == AL_LINEAR_DISTANCE_CLAMPED || + values[0] == AL_EXPONENT_DISTANCE || values[0] == AL_EXPONENT_DISTANCE_CLAMPED); + + Source->mDistanceModel = static_cast(values[0]); + if(Context->mSourceDistanceModel) + return UpdateSourceProps(Source, Context); + return true; + + case AL_SOURCE_RESAMPLER_SOFT: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= 0 && values[0] <= static_cast(Resampler::Max)); + + Source->mResampler = static_cast(values[0]); + return UpdateSourceProps(Source, Context); + + case AL_SOURCE_SPATIALIZE_SOFT: + CHECKSIZE(values, 1); + CHECKVAL(values[0] >= AL_FALSE && values[0] <= AL_AUTO_SOFT); + + Source->mSpatialize = static_cast(values[0]); + return UpdateSourceProps(Source, Context); + + + case AL_AUXILIARY_SEND_FILTER: + CHECKSIZE(values, 3); + slotlock = std::unique_lock{Context->mEffectSlotLock}; + if(values[0] && (slot=LookupEffectSlot(Context, static_cast(values[0]))) == nullptr) + SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid effect ID %u", values[0]); + if(static_cast(values[1]) >= device->NumAuxSends) + SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid send %u", values[1]); + + filtlock = std::unique_lock{device->FilterLock}; + if(values[2] && (filter=LookupFilter(device, static_cast(values[2]))) == nullptr) + SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid filter ID %u", values[2]); + + if(!filter) + { + /* Disable filter */ + auto &send = Source->Send[static_cast(values[1])]; + send.Gain = 1.0f; + send.GainHF = 1.0f; + send.HFReference = LOWPASSFREQREF; + send.GainLF = 1.0f; + send.LFReference = HIGHPASSFREQREF; + } + else + { + auto &send = Source->Send[static_cast(values[1])]; + send.Gain = filter->Gain; + send.GainHF = filter->GainHF; + send.HFReference = filter->HFReference; + send.GainLF = filter->GainLF; + send.LFReference = filter->LFReference; + } + filtlock.unlock(); + + if(slot != Source->Send[static_cast(values[1])].Slot && IsPlayingOrPaused(Source)) + { + /* Add refcount on the new slot, and release the previous slot */ + if(slot) IncrementRef(slot->ref); + if(auto *oldslot = Source->Send[static_cast(values[1])].Slot) + DecrementRef(oldslot->ref); + Source->Send[static_cast(values[1])].Slot = slot; + + /* We must force an update if the auxiliary slot changed on an + * active source, in case the slot is about to be deleted. + */ + ALvoice *voice{GetSourceVoice(Source, Context)}; + if(voice) UpdateSourceProps(Source, voice, Context); + else Source->PropsClean.clear(std::memory_order_release); + } + else + { + if(slot) IncrementRef(slot->ref); + if(auto *oldslot = Source->Send[static_cast(values[1])].Slot) + DecrementRef(oldslot->ref); + Source->Send[static_cast(values[1])].Slot = slot; + UpdateSourceProps(Source, Context); + } + return true; + + + /* 1x float */ + case AL_CONE_INNER_ANGLE: + case AL_CONE_OUTER_ANGLE: + case AL_PITCH: + case AL_GAIN: + case AL_MIN_GAIN: + case AL_MAX_GAIN: + case AL_REFERENCE_DISTANCE: + case AL_ROLLOFF_FACTOR: + case AL_CONE_OUTER_GAIN: + case AL_MAX_DISTANCE: + case AL_DOPPLER_FACTOR: + case AL_CONE_OUTER_GAINHF: + case AL_AIR_ABSORPTION_FACTOR: + case AL_ROOM_ROLLOFF_FACTOR: + case AL_SOURCE_RADIUS: + CHECKSIZE(values, 1); + fvals[0] = static_cast(values[0]); + return SetSourcefv(Source, Context, prop, {fvals, 1u}); + + /* 3x float */ + case AL_POSITION: + case AL_VELOCITY: + case AL_DIRECTION: + CHECKSIZE(values, 3); + fvals[0] = static_cast(values[0]); + fvals[1] = static_cast(values[1]); + fvals[2] = static_cast(values[2]); + return SetSourcefv(Source, Context, prop, {fvals, 3u}); + + /* 6x float */ + case AL_ORIENTATION: + CHECKSIZE(values, 6); + fvals[0] = static_cast(values[0]); + fvals[1] = static_cast(values[1]); + fvals[2] = static_cast(values[2]); + fvals[3] = static_cast(values[3]); + fvals[4] = static_cast(values[4]); + fvals[5] = static_cast(values[5]); + return SetSourcefv(Source, Context, prop, {fvals, 6u}); + + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + case AL_STEREO_ANGLES: + break; + } + + ERR("Unexpected property: 0x%04x\n", prop); + Context->setError(AL_INVALID_ENUM, "Invalid source integer property 0x%04x", prop); + return false; +} + +bool SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values) +{ + ALfloat fvals[MaxValues]; + ALint ivals[MaxValues]; + + switch(prop) + { + case AL_SOURCE_TYPE: + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + case AL_SOURCE_STATE: + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + /* Query only */ + SETERR_RETURN(Context, AL_INVALID_OPERATION, false, + "Setting read-only source property 0x%04x", prop); + + /* 1x int */ + case AL_SOURCE_RELATIVE: + case AL_LOOPING: + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + case AL_DIRECT_FILTER_GAINHF_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + case AL_DIRECT_CHANNELS_SOFT: + case AL_DISTANCE_MODEL: + case AL_SOURCE_RESAMPLER_SOFT: + case AL_SOURCE_SPATIALIZE_SOFT: + CHECKSIZE(values, 1); + CHECKVAL(values[0] <= INT_MAX && values[0] >= INT_MIN); + + ivals[0] = static_cast(values[0]); + return SetSourceiv(Source, Context, prop, {ivals, 1u}); + + /* 1x uint */ + case AL_BUFFER: + case AL_DIRECT_FILTER: + CHECKSIZE(values, 1); + CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0); + + ivals[0] = static_cast(values[0]); + return SetSourceiv(Source, Context, prop, {ivals, 1u}); + + /* 3x uint */ + case AL_AUXILIARY_SEND_FILTER: + CHECKSIZE(values, 3); + CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0 && values[1] <= UINT_MAX && values[1] >= 0 + && values[2] <= UINT_MAX && values[2] >= 0); + + ivals[0] = static_cast(values[0]); + ivals[1] = static_cast(values[1]); + ivals[2] = static_cast(values[2]); + return SetSourceiv(Source, Context, prop, {ivals, 3u}); + + /* 1x float */ + case AL_CONE_INNER_ANGLE: + case AL_CONE_OUTER_ANGLE: + case AL_PITCH: + case AL_GAIN: + case AL_MIN_GAIN: + case AL_MAX_GAIN: + case AL_REFERENCE_DISTANCE: + case AL_ROLLOFF_FACTOR: + case AL_CONE_OUTER_GAIN: + case AL_MAX_DISTANCE: + case AL_DOPPLER_FACTOR: + case AL_CONE_OUTER_GAINHF: + case AL_AIR_ABSORPTION_FACTOR: + case AL_ROOM_ROLLOFF_FACTOR: + case AL_SOURCE_RADIUS: + CHECKSIZE(values, 1); + fvals[0] = static_cast(values[0]); + return SetSourcefv(Source, Context, prop, {fvals, 1u}); + + /* 3x float */ + case AL_POSITION: + case AL_VELOCITY: + case AL_DIRECTION: + CHECKSIZE(values, 3); + fvals[0] = static_cast(values[0]); + fvals[1] = static_cast(values[1]); + fvals[2] = static_cast(values[2]); + return SetSourcefv(Source, Context, prop, {fvals, 3u}); + + /* 6x float */ + case AL_ORIENTATION: + CHECKSIZE(values, 6); + fvals[0] = static_cast(values[0]); + fvals[1] = static_cast(values[1]); + fvals[2] = static_cast(values[2]); + fvals[3] = static_cast(values[3]); + fvals[4] = static_cast(values[4]); + fvals[5] = static_cast(values[5]); + return SetSourcefv(Source, Context, prop, {fvals, 6u}); + + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + case AL_STEREO_ANGLES: + break; + } + + ERR("Unexpected property: 0x%04x\n", prop); + Context->setError(AL_INVALID_ENUM, "Invalid source integer64 property 0x%04x", prop); + return false; +} + +#undef CHECKVAL + + +bool GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values); +bool GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values); +bool GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values); + +bool GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values) +{ + ALCdevice *device{Context->mDevice.get()}; + ClockLatency clocktime; + nanoseconds srcclock; + ALint ivals[MaxValues]; + bool err; + + switch(prop) + { + case AL_GAIN: + CHECKSIZE(values, 1); + values[0] = Source->Gain; + return true; + + case AL_PITCH: + CHECKSIZE(values, 1); + values[0] = Source->Pitch; + return true; + + case AL_MAX_DISTANCE: + CHECKSIZE(values, 1); + values[0] = Source->MaxDistance; + return true; + + case AL_ROLLOFF_FACTOR: + CHECKSIZE(values, 1); + values[0] = Source->RolloffFactor; + return true; + + case AL_REFERENCE_DISTANCE: + CHECKSIZE(values, 1); + values[0] = Source->RefDistance; + return true; + + case AL_CONE_INNER_ANGLE: + CHECKSIZE(values, 1); + values[0] = Source->InnerAngle; + return true; + + case AL_CONE_OUTER_ANGLE: + CHECKSIZE(values, 1); + values[0] = Source->OuterAngle; + return true; + + case AL_MIN_GAIN: + CHECKSIZE(values, 1); + values[0] = Source->MinGain; + return true; + + case AL_MAX_GAIN: + CHECKSIZE(values, 1); + values[0] = Source->MaxGain; + return true; + + case AL_CONE_OUTER_GAIN: + CHECKSIZE(values, 1); + values[0] = Source->OuterGain; + return true; + + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + CHECKSIZE(values, 1); + values[0] = GetSourceOffset(Source, prop, Context); + return true; + + case AL_CONE_OUTER_GAINHF: + CHECKSIZE(values, 1); + values[0] = Source->OuterGainHF; + return true; + + case AL_AIR_ABSORPTION_FACTOR: + CHECKSIZE(values, 1); + values[0] = Source->AirAbsorptionFactor; + return true; + + case AL_ROOM_ROLLOFF_FACTOR: + CHECKSIZE(values, 1); + values[0] = Source->RoomRolloffFactor; + return true; + + case AL_DOPPLER_FACTOR: + CHECKSIZE(values, 1); + values[0] = Source->DopplerFactor; + return true; + + case AL_SOURCE_RADIUS: + CHECKSIZE(values, 1); + values[0] = Source->Radius; + return true; + + case AL_STEREO_ANGLES: + CHECKSIZE(values, 2); + values[0] = Source->StereoPan[0]; + values[1] = Source->StereoPan[1]; + return true; + + case AL_SEC_OFFSET_LATENCY_SOFT: + CHECKSIZE(values, 2); + /* Get the source offset with the clock time first. Then get the clock + * time with the device latency. Order is important. + */ + values[0] = GetSourceSecOffset(Source, Context, &srcclock); + { + std::lock_guard _{device->StateLock}; + clocktime = GetClockLatency(device); + } + if(srcclock == clocktime.ClockTime) + values[1] = static_cast(clocktime.Latency.count()) / 1000000000.0; + else + { + /* If the clock time incremented, reduce the latency by that much + * since it's that much closer to the source offset it got earlier. + */ + const nanoseconds diff{clocktime.ClockTime - srcclock}; + const nanoseconds latency{clocktime.Latency - std::min(clocktime.Latency, diff)}; + values[1] = static_cast(latency.count()) / 1000000000.0; + } + return true; + + case AL_SEC_OFFSET_CLOCK_SOFT: + CHECKSIZE(values, 2); + values[0] = GetSourceSecOffset(Source, Context, &srcclock); + values[1] = static_cast(srcclock.count()) / 1000000000.0; + return true; + + case AL_POSITION: + CHECKSIZE(values, 3); + values[0] = Source->Position[0]; + values[1] = Source->Position[1]; + values[2] = Source->Position[2]; + return true; + + case AL_VELOCITY: + CHECKSIZE(values, 3); + values[0] = Source->Velocity[0]; + values[1] = Source->Velocity[1]; + values[2] = Source->Velocity[2]; + return true; + + case AL_DIRECTION: + CHECKSIZE(values, 3); + values[0] = Source->Direction[0]; + values[1] = Source->Direction[1]; + values[2] = Source->Direction[2]; + return true; + + case AL_ORIENTATION: + CHECKSIZE(values, 6); + values[0] = Source->OrientAt[0]; + values[1] = Source->OrientAt[1]; + values[2] = Source->OrientAt[2]; + values[3] = Source->OrientUp[0]; + values[4] = Source->OrientUp[1]; + values[5] = Source->OrientUp[2]; + return true; + + /* 1x int */ + case AL_SOURCE_RELATIVE: + case AL_LOOPING: + case AL_SOURCE_STATE: + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + case AL_SOURCE_TYPE: + case AL_DIRECT_FILTER_GAINHF_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + case AL_DIRECT_CHANNELS_SOFT: + case AL_DISTANCE_MODEL: + case AL_SOURCE_RESAMPLER_SOFT: + case AL_SOURCE_SPATIALIZE_SOFT: + CHECKSIZE(values, 1); + if((err=GetSourceiv(Source, Context, prop, {ivals, 1u})) != false) + values[0] = static_cast(ivals[0]); + return err; + + case AL_BUFFER: + case AL_DIRECT_FILTER: + case AL_AUXILIARY_SEND_FILTER: + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + break; + } + + ERR("Unexpected property: 0x%04x\n", prop); + Context->setError(AL_INVALID_ENUM, "Invalid source double property 0x%04x", prop); + return false; +} + +bool GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values) +{ + ALdouble dvals[MaxValues]; + bool err; + + switch(prop) + { + case AL_SOURCE_RELATIVE: + CHECKSIZE(values, 1); + values[0] = Source->HeadRelative; + return true; + + case AL_LOOPING: + CHECKSIZE(values, 1); + values[0] = Source->Looping; + return true; + + case AL_BUFFER: + CHECKSIZE(values, 1); + { + ALbufferlistitem *BufferList{nullptr}; + if(Source->SourceType == AL_STATIC) BufferList = Source->queue; + ALbuffer *buffer{nullptr}; + if(BufferList) buffer = BufferList->mBuffer; + values[0] = buffer ? static_cast(buffer->id) : 0; + } + return true; + + case AL_SOURCE_STATE: + CHECKSIZE(values, 1); + values[0] = GetSourceState(Source, GetSourceVoice(Source, Context)); + return true; + + case AL_BUFFERS_QUEUED: + CHECKSIZE(values, 1); + if(ALbufferlistitem *BufferList{Source->queue}) + { + ALsizei count{0}; + do { + ++count; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } while(BufferList != nullptr); + values[0] = count; + } + else + values[0] = 0; + return true; + + case AL_BUFFERS_PROCESSED: + CHECKSIZE(values, 1); + if(Source->Looping || Source->SourceType != AL_STREAMING) + { + /* Buffers on a looping source are in a perpetual state of PENDING, + * so don't report any as PROCESSED + */ + values[0] = 0; + } + else + { + const ALbufferlistitem *BufferList{Source->queue}; + const ALbufferlistitem *Current{nullptr}; + ALsizei played{0}; + + ALvoice *voice{GetSourceVoice(Source, Context)}; + if(voice != nullptr) + Current = voice->mCurrentBuffer.load(std::memory_order_relaxed); + else if(Source->state == AL_INITIAL) + Current = BufferList; + + while(BufferList && BufferList != Current) + { + ++played; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + values[0] = played; + } + return true; + + case AL_SOURCE_TYPE: + CHECKSIZE(values, 1); + values[0] = Source->SourceType; + return true; + + case AL_DIRECT_FILTER_GAINHF_AUTO: + CHECKSIZE(values, 1); + values[0] = Source->DryGainHFAuto; + return true; + + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + CHECKSIZE(values, 1); + values[0] = Source->WetGainAuto; + return true; + + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + CHECKSIZE(values, 1); + values[0] = Source->WetGainHFAuto; + return true; + + case AL_DIRECT_CHANNELS_SOFT: + CHECKSIZE(values, 1); + values[0] = static_cast(Source->DirectChannels); + return true; + + case AL_DISTANCE_MODEL: + CHECKSIZE(values, 1); + values[0] = static_cast(Source->mDistanceModel); + return true; + + case AL_SOURCE_RESAMPLER_SOFT: + CHECKSIZE(values, 1); + values[0] = static_cast(Source->mResampler); + return true; + + case AL_SOURCE_SPATIALIZE_SOFT: + CHECKSIZE(values, 1); + values[0] = Source->mSpatialize; + return true; + + /* 1x float/double */ + case AL_CONE_INNER_ANGLE: + case AL_CONE_OUTER_ANGLE: + case AL_PITCH: + case AL_GAIN: + case AL_MIN_GAIN: + case AL_MAX_GAIN: + case AL_REFERENCE_DISTANCE: + case AL_ROLLOFF_FACTOR: + case AL_CONE_OUTER_GAIN: + case AL_MAX_DISTANCE: + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + case AL_DOPPLER_FACTOR: + case AL_AIR_ABSORPTION_FACTOR: + case AL_ROOM_ROLLOFF_FACTOR: + case AL_CONE_OUTER_GAINHF: + case AL_SOURCE_RADIUS: + CHECKSIZE(values, 1); + if((err=GetSourcedv(Source, Context, prop, {dvals, 1u})) != false) + values[0] = static_cast(dvals[0]); + return err; + + /* 3x float/double */ + case AL_POSITION: + case AL_VELOCITY: + case AL_DIRECTION: + CHECKSIZE(values, 3); + if((err=GetSourcedv(Source, Context, prop, {dvals, 3u})) != false) + { + values[0] = static_cast(dvals[0]); + values[1] = static_cast(dvals[1]); + values[2] = static_cast(dvals[2]); + } + return err; + + /* 6x float/double */ + case AL_ORIENTATION: + CHECKSIZE(values, 6); + if((err=GetSourcedv(Source, Context, prop, {dvals, 6u})) != false) + { + values[0] = static_cast(dvals[0]); + values[1] = static_cast(dvals[1]); + values[2] = static_cast(dvals[2]); + values[3] = static_cast(dvals[3]); + values[4] = static_cast(dvals[4]); + values[5] = static_cast(dvals[5]); + } + return err; + + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + break; /* i64 only */ + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + break; /* Double only */ + case AL_STEREO_ANGLES: + break; /* Float/double only */ + + case AL_DIRECT_FILTER: + case AL_AUXILIARY_SEND_FILTER: + break; /* ??? */ + } + + ERR("Unexpected property: 0x%04x\n", prop); + Context->setError(AL_INVALID_ENUM, "Invalid source integer property 0x%04x", prop); + return false; +} + +bool GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span values) +{ + ALCdevice *device = Context->mDevice.get(); + ClockLatency clocktime; + nanoseconds srcclock; + ALdouble dvals[MaxValues]; + ALint ivals[MaxValues]; + bool err; + + switch(prop) + { + case AL_SAMPLE_OFFSET_LATENCY_SOFT: + CHECKSIZE(values, 2); + /* Get the source offset with the clock time first. Then get the clock + * time with the device latency. Order is important. + */ + values[0] = GetSourceSampleOffset(Source, Context, &srcclock); + { + std::lock_guard _{device->StateLock}; + clocktime = GetClockLatency(device); + } + if(srcclock == clocktime.ClockTime) + values[1] = clocktime.Latency.count(); + else + { + /* If the clock time incremented, reduce the latency by that much + * since it's that much closer to the source offset it got earlier. + */ + const nanoseconds diff{clocktime.ClockTime - srcclock}; + values[1] = nanoseconds{clocktime.Latency - std::min(clocktime.Latency, diff)}.count(); + } + return true; + + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + CHECKSIZE(values, 2); + values[0] = GetSourceSampleOffset(Source, Context, &srcclock); + values[1] = srcclock.count(); + return true; + + /* 1x float/double */ + case AL_CONE_INNER_ANGLE: + case AL_CONE_OUTER_ANGLE: + case AL_PITCH: + case AL_GAIN: + case AL_MIN_GAIN: + case AL_MAX_GAIN: + case AL_REFERENCE_DISTANCE: + case AL_ROLLOFF_FACTOR: + case AL_CONE_OUTER_GAIN: + case AL_MAX_DISTANCE: + case AL_SEC_OFFSET: + case AL_SAMPLE_OFFSET: + case AL_BYTE_OFFSET: + case AL_DOPPLER_FACTOR: + case AL_AIR_ABSORPTION_FACTOR: + case AL_ROOM_ROLLOFF_FACTOR: + case AL_CONE_OUTER_GAINHF: + case AL_SOURCE_RADIUS: + CHECKSIZE(values, 1); + if((err=GetSourcedv(Source, Context, prop, {dvals, 1u})) != false) + values[0] = static_cast(dvals[0]); + return err; + + /* 3x float/double */ + case AL_POSITION: + case AL_VELOCITY: + case AL_DIRECTION: + CHECKSIZE(values, 3); + if((err=GetSourcedv(Source, Context, prop, {dvals, 3u})) != false) + { + values[0] = static_cast(dvals[0]); + values[1] = static_cast(dvals[1]); + values[2] = static_cast(dvals[2]); + } + return err; + + /* 6x float/double */ + case AL_ORIENTATION: + CHECKSIZE(values, 6); + if((err=GetSourcedv(Source, Context, prop, {dvals, 6u})) != false) + { + values[0] = static_cast(dvals[0]); + values[1] = static_cast(dvals[1]); + values[2] = static_cast(dvals[2]); + values[3] = static_cast(dvals[3]); + values[4] = static_cast(dvals[4]); + values[5] = static_cast(dvals[5]); + } + return err; + + /* 1x int */ + case AL_SOURCE_RELATIVE: + case AL_LOOPING: + case AL_SOURCE_STATE: + case AL_BUFFERS_QUEUED: + case AL_BUFFERS_PROCESSED: + case AL_SOURCE_TYPE: + case AL_DIRECT_FILTER_GAINHF_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: + case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: + case AL_DIRECT_CHANNELS_SOFT: + case AL_DISTANCE_MODEL: + case AL_SOURCE_RESAMPLER_SOFT: + case AL_SOURCE_SPATIALIZE_SOFT: + CHECKSIZE(values, 1); + if((err=GetSourceiv(Source, Context, prop, {ivals, 1u})) != false) + values[0] = ivals[0]; + return err; + + /* 1x uint */ + case AL_BUFFER: + case AL_DIRECT_FILTER: + CHECKSIZE(values, 1); + if((err=GetSourceiv(Source, Context, prop, {ivals, 1u})) != false) + values[0] = static_cast(ivals[0]); + return err; + + /* 3x uint */ + case AL_AUXILIARY_SEND_FILTER: + CHECKSIZE(values, 3); + if((err=GetSourceiv(Source, Context, prop, {ivals, 3u})) != false) + { + values[0] = static_cast(ivals[0]); + values[1] = static_cast(ivals[1]); + values[2] = static_cast(ivals[2]); + } + return err; + + case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + break; /* Double only */ + case AL_STEREO_ANGLES: + break; /* Float/double only */ + } + + ERR("Unexpected property: 0x%04x\n", prop); + Context->setError(AL_INVALID_ENUM, "Invalid source integer64 property 0x%04x", prop); + return false; +} + +} // namespace + +AL_API ALvoid AL_APIENTRY alGenSources(ALsizei n, ALuint *sources) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Generating %d sources", n); + if UNLIKELY(n <= 0) return; + + std::unique_lock srclock{context->mSourceLock}; + ALCdevice *device{context->mDevice.get()}; + if(static_cast(n) > device->SourcesMax-context->mNumSources) + { + context->setError(AL_OUT_OF_MEMORY, "Exceeding %u source limit (%u + %d)", + device->SourcesMax, context->mNumSources, n); + return; + } + if(!EnsureSources(context.get(), static_cast(n))) + { + context->setError(AL_OUT_OF_MEMORY, "Failed to allocate %d source%s", n, (n==1)?"":"s"); + return; + } + + if(n == 1) + { + ALsource *source{AllocSource(context.get(), device->NumAuxSends)}; + sources[0] = source->id; + } + else + { + const ALuint num_sends{device->NumAuxSends}; + al::vector ids; + ids.reserve(static_cast(n)); + do { + ALsource *source{AllocSource(context.get(), num_sends)}; + ids.emplace_back(source->id); + } while(--n); + std::copy(ids.cbegin(), ids.cend(), sources); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Deleting %d sources", n); + + std::lock_guard _{context->mSourceLock}; + + /* Check that all Sources are valid */ + auto validate_source = [&context](const ALuint sid) -> bool + { return LookupSource(context.get(), sid) != nullptr; }; + + const ALuint *sources_end = sources + n; + auto invsrc = std::find_if_not(sources, sources_end, validate_source); + if UNLIKELY(invsrc != sources_end) + { + context->setError(AL_INVALID_NAME, "Invalid source ID %u", *invsrc); + return; + } + + /* All good. Delete source IDs. */ + auto delete_source = [&context](const ALuint sid) -> void + { + ALsource *src{LookupSource(context.get(), sid)}; + if(src) FreeSource(context.get(), src); + }; + std::for_each(sources, sources_end, delete_source); +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsSource(ALuint source) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if LIKELY(context) + { + std::lock_guard _{context->mSourceLock}; + if(LookupSource(context.get(), source) != nullptr) + return AL_TRUE; + } + return AL_FALSE; +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + SetSourcefv(Source, context.get(), static_cast(param), {&value, 1u}); +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + { + const ALfloat fvals[3]{ value1, value2, value3 }; + SetSourcefv(Source, context.get(), static_cast(param), fvals); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + SetSourcefv(Source, context.get(), static_cast(param), {values, MaxValues}); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + { + const ALfloat fval[1]{static_cast(value)}; + SetSourcefv(Source, context.get(), static_cast(param), fval); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + { + const ALfloat fvals[3]{static_cast(value1), static_cast(value2), + static_cast(value3)}; + SetSourcefv(Source, context.get(), static_cast(param), fvals); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + const ALuint count{DoubleValsByProp(param)}; + ALfloat fvals[MaxValues]; + for(ALuint i{0};i < count;i++) + fvals[i] = static_cast(values[i]); + SetSourcefv(Source, context.get(), static_cast(param), {fvals, count}); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + SetSourceiv(Source, context.get(), static_cast(param), {&value, 1u}); +} +END_API_FUNC + +AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + { + const ALint ivals[3]{ value1, value2, value3 }; + SetSourceiv(Source, context.get(), static_cast(param), ivals); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source = LookupSource(context.get(), source); + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + SetSourceiv(Source, context.get(), static_cast(param), {values, MaxValues}); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + SetSourcei64v(Source, context.get(), static_cast(param), {&value, 1u}); +} +END_API_FUNC + +AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else + { + const ALint64SOFT i64vals[3]{ value1, value2, value3 }; + SetSourcei64v(Source, context.get(), static_cast(param), i64vals); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + std::lock_guard __{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + SetSourcei64v(Source, context.get(), static_cast(param), {values, MaxValues}); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + ALdouble dval[1]; + if(GetSourcedv(Source, context.get(), static_cast(param), dval)) + *value = static_cast(dval[0]); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!(value1 && value2 && value3)) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + ALdouble dvals[3]; + if(GetSourcedv(Source, context.get(), static_cast(param), dvals)) + { + *value1 = static_cast(dvals[0]); + *value2 = static_cast(dvals[1]); + *value3 = static_cast(dvals[2]); + } + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + const ALuint count{FloatValsByProp(param)}; + ALdouble dvals[MaxValues]; + if(GetSourcedv(Source, context.get(), static_cast(param), {dvals, count})) + { + for(ALuint i{0};i < count;i++) + values[i] = static_cast(dvals[i]); + } + } +} +END_API_FUNC + + +AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + GetSourcedv(Source, context.get(), static_cast(param), {value, 1u}); +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!(value1 && value2 && value3)) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + ALdouble dvals[3]; + if(GetSourcedv(Source, context.get(), static_cast(param), dvals)) + { + *value1 = dvals[0]; + *value2 = dvals[1]; + *value3 = dvals[2]; + } + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + GetSourcedv(Source, context.get(), static_cast(param), {values, MaxValues}); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + GetSourceiv(Source, context.get(), static_cast(param), {value, 1u}); +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!(value1 && value2 && value3)) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + ALint ivals[3]; + if(GetSourceiv(Source, context.get(), static_cast(param), ivals)) + { + *value1 = ivals[0]; + *value2 = ivals[1]; + *value3 = ivals[2]; + } + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + GetSourceiv(Source, context.get(), static_cast(param), {values, MaxValues}); +} +END_API_FUNC + + +AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!value) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + GetSourcei64v(Source, context.get(), static_cast(param), {value, 1u}); +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!(value1 && value2 && value3)) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + { + ALint64SOFT i64vals[3]; + if(GetSourcei64v(Source, context.get(), static_cast(param), i64vals)) + { + *value1 = i64vals[0]; + *value2 = i64vals[1]; + *value3 = i64vals[2]; + } + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *Source{LookupSource(context.get(), source)}; + if UNLIKELY(!Source) + context->setError(AL_INVALID_NAME, "Invalid source ID %u", source); + else if UNLIKELY(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else + GetSourcei64v(Source, context.get(), static_cast(param), {values, MaxValues}); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourcePlay(ALuint source) +START_API_FUNC +{ alSourcePlayv(1, &source); } +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Playing %d sources", n); + if UNLIKELY(n <= 0) return; + + al::vector extra_sources; + std::array source_storage; + al::span srchandles; + if LIKELY(static_cast(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast(n)}; + else + { + extra_sources.resize(static_cast(n)); + srchandles = {extra_sources.data(), extra_sources.size()}; + } + + std::lock_guard _{context->mSourceLock}; + for(auto &srchdl : srchandles) + { + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; + } + + ALCdevice *device{context->mDevice.get()}; + BackendLockGuard __{*device->Backend}; + /* If the device is disconnected, go right to stopped. */ + if UNLIKELY(!device->Connected.load(std::memory_order_acquire)) + { + /* TODO: Send state change event? */ + std::for_each(srchandles.begin(), srchandles.end(), + [](ALsource *source) -> void + { + source->OffsetType = AL_NONE; + source->Offset = 0.0; + source->state = AL_STOPPED; + } + ); + return; + } + + /* Count the number of reusable voices. */ + auto count_free_voices = [](const ALuint count, const ALvoice &voice) noexcept -> ALuint + { + if(voice.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped + && voice.mSourceID.load(std::memory_order_relaxed) == 0u) + return count + 1; + return count; + }; + auto free_voices = std::accumulate(context->mVoices.begin(), context->mVoices.end(), + ALuint{0}, count_free_voices); + if UNLIKELY(srchandles.size() > free_voices) + { + /* Increase the number of voices to handle the request. */ + const size_t need_voices{srchandles.size() - free_voices}; + context->mVoices.resize(context->mVoices.size() + need_voices); + } + + auto start_source = [&context,device](ALsource *source) -> void + { + /* Check that there is a queue containing at least one valid, non zero + * length buffer. + */ + ALbufferlistitem *BufferList{source->queue}; + while(BufferList && BufferList->mSampleLen == 0) + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + + /* If there's nothing to play, go right to stopped. */ + if UNLIKELY(!BufferList) + { + /* NOTE: A source without any playable buffers should not have an + * ALvoice since it shouldn't be in a playing or paused state. So + * there's no need to look up its voice and clear the source. + */ + ALenum oldstate{GetSourceState(source, nullptr)}; + source->OffsetType = AL_NONE; + source->Offset = 0.0; + if(oldstate != AL_STOPPED) + { + source->state = AL_STOPPED; + SendStateChangeEvent(context.get(), source->id, AL_STOPPED); + } + return; + } + + ALvoice *voice{GetSourceVoice(source, context.get())}; + switch(GetSourceState(source, voice)) + { + case AL_PAUSED: + assert(voice != nullptr); + /* A source that's paused simply resumes. */ + voice->mPlayState.store(ALvoice::Playing, std::memory_order_release); + source->state = AL_PLAYING; + SendStateChangeEvent(context.get(), source->id, AL_PLAYING); + return; + + case AL_PLAYING: + assert(voice != nullptr); + /* A source that's already playing is restarted from the beginning. + * Stop the current voice and start a new one so it properly cross- + * fades back to the beginning. + */ + voice->mCurrentBuffer.store(nullptr, std::memory_order_relaxed); + voice->mLoopBuffer.store(nullptr, std::memory_order_relaxed); + voice->mSourceID.store(0u, std::memory_order_release); + voice->mPlayState.store(ALvoice::Stopping, std::memory_order_release); + voice = nullptr; + break; + + default: + assert(voice == nullptr); + break; + } + + /* Look for an unused voice to play this source with. */ + auto find_voice = [](const ALvoice &v) noexcept -> bool + { + return v.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped + && v.mSourceID.load(std::memory_order_relaxed) == 0u; + }; + auto voices_end = context->mVoices.data() + context->mVoices.size(); + voice = std::find_if(context->mVoices.data(), voices_end, find_voice); + assert(voice != voices_end); + + auto vidx = static_cast(std::distance(context->mVoices.data(), voice)); + voice->mPlayState.store(ALvoice::Stopped, std::memory_order_release); + + source->PropsClean.test_and_set(std::memory_order_acquire); + UpdateSourceProps(source, voice, context.get()); + + /* A source that's not playing or paused has any offset applied when it + * starts playing. + */ + if(source->Looping) + voice->mLoopBuffer.store(source->queue, std::memory_order_relaxed); + else + voice->mLoopBuffer.store(nullptr, std::memory_order_relaxed); + voice->mCurrentBuffer.store(BufferList, std::memory_order_relaxed); + voice->mPosition.store(0u, std::memory_order_relaxed); + voice->mPositionFrac.store(0, std::memory_order_relaxed); + bool start_fading{false}; + if(auto vpos = GetSampleOffset(source)) + { + start_fading = vpos->pos != 0 || vpos->frac != 0 || vpos->bufferitem != BufferList; + voice->mPosition.store(vpos->pos, std::memory_order_relaxed); + voice->mPositionFrac.store(vpos->frac, std::memory_order_relaxed); + voice->mCurrentBuffer.store(vpos->bufferitem, std::memory_order_relaxed); + } + + ALbuffer *buffer{BufferList->mBuffer}; + voice->mFrequency = buffer->Frequency; + voice->mFmtChannels = buffer->mFmtChannels; + voice->mNumChannels = buffer->channelsFromFmt(); + voice->mSampleSize = buffer->bytesFromFmt(); + voice->mAmbiLayout = static_cast(buffer->AmbiLayout); + voice->mAmbiScaling = static_cast(buffer->AmbiScaling); + voice->mAmbiOrder = 1; + + /* Clear the stepping value so the mixer knows not to mix this until + * the update gets applied. + */ + voice->mStep = 0; + + voice->mFlags = start_fading ? VOICE_IS_FADING : 0; + if(source->SourceType == AL_STATIC) voice->mFlags |= VOICE_IS_STATIC; + + /* Don't need to set the VOICE_IS_AMBISONIC flag if the device is not + * higher order than the voice. No HF scaling is necessary to mix it. + */ + if((voice->mFmtChannels == FmtBFormat2D || voice->mFmtChannels == FmtBFormat3D) + && device->mAmbiOrder > voice->mAmbiOrder) + { + const uint8_t *OrderFromChan{(voice->mFmtChannels == FmtBFormat2D) ? + AmbiIndex::OrderFrom2DChannel.data() : + AmbiIndex::OrderFromChannel.data()}; + + const BandSplitter splitter{400.0f / static_cast(device->Frequency)}; + + const auto scales = BFormatDec::GetHFOrderScales(voice->mAmbiOrder, + device->mAmbiOrder); + auto init_ambi = [device,&scales,&OrderFromChan,splitter](ALvoice::ChannelData &chandata) -> void + { + chandata.mPrevSamples.fill(0.0f); + chandata.mAmbiScale = scales[*(OrderFromChan++)]; + chandata.mAmbiSplitter = splitter; + chandata.mDryParams = DirectParams{}; + std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{}); + }; + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + init_ambi); + + voice->mFlags |= VOICE_IS_AMBISONIC; + } + else + { + /* Clear previous samples. */ + auto clear_prevs = [device](ALvoice::ChannelData &chandata) -> void + { + chandata.mPrevSamples.fill(0.0f); + chandata.mDryParams = DirectParams{}; + std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{}); + }; + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + clear_prevs); + } + + if(device->AvgSpeakerDist > 0.0f) + { + const ALfloat w1{SPEEDOFSOUNDMETRESPERSEC / + (device->AvgSpeakerDist * static_cast(device->Frequency))}; + auto init_nfc = [w1](ALvoice::ChannelData &chandata) -> void + { chandata.mDryParams.NFCtrlFilter.init(w1); }; + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + init_nfc); + } + + voice->mSourceID.store(source->id, std::memory_order_relaxed); + voice->mPlayState.store(ALvoice::Playing, std::memory_order_release); + source->VoiceIdx = vidx; + + if(source->state != AL_PLAYING) + { + source->state = AL_PLAYING; + SendStateChangeEvent(context.get(), source->id, AL_PLAYING); + } + }; + std::for_each(srchandles.begin(), srchandles.end(), start_source); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourcePause(ALuint source) +START_API_FUNC +{ alSourcePausev(1, &source); } +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Pausing %d sources", n); + if UNLIKELY(n <= 0) return; + + al::vector extra_sources; + std::array source_storage; + al::span srchandles; + if LIKELY(static_cast(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast(n)}; + else + { + extra_sources.resize(static_cast(n)); + srchandles = {extra_sources.data(), extra_sources.size()}; + } + + std::lock_guard _{context->mSourceLock}; + for(auto &srchdl : srchandles) + { + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; + } + + ALCdevice *device{context->mDevice.get()}; + BackendLockGuard __{*device->Backend}; + auto pause_source = [&context](ALsource *source) -> void + { + ALvoice *voice{GetSourceVoice(source, context.get())}; + if(voice) + { + std::atomic_thread_fence(std::memory_order_release); + ALvoice::State oldvstate{ALvoice::Playing}; + voice->mPlayState.compare_exchange_strong(oldvstate, ALvoice::Stopping, + std::memory_order_acq_rel, std::memory_order_acquire); + } + if(GetSourceState(source, voice) == AL_PLAYING) + { + source->state = AL_PAUSED; + SendStateChangeEvent(context.get(), source->id, AL_PAUSED); + } + }; + std::for_each(srchandles.begin(), srchandles.end(), pause_source); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourceStop(ALuint source) +START_API_FUNC +{ alSourceStopv(1, &source); } +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Stopping %d sources", n); + if UNLIKELY(n <= 0) return; + + al::vector extra_sources; + std::array source_storage; + al::span srchandles; + if LIKELY(static_cast(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast(n)}; + else + { + extra_sources.resize(static_cast(n)); + srchandles = {extra_sources.data(), extra_sources.size()}; + } + + std::lock_guard _{context->mSourceLock}; + for(auto &srchdl : srchandles) + { + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; + } + + ALCdevice *device{context->mDevice.get()}; + BackendLockGuard __{*device->Backend}; + auto stop_source = [&context](ALsource *source) -> void + { + /* Get the source state before clearing from the voice, so we know what + * state the source+voice was actually in. + */ + ALvoice *voice{GetSourceVoice(source, context.get())}; + const ALenum oldstate{GetSourceState(source, voice)}; + if(voice != nullptr) + { + voice->mCurrentBuffer.store(nullptr, std::memory_order_relaxed); + voice->mLoopBuffer.store(nullptr, std::memory_order_relaxed); + voice->mSourceID.store(0u, std::memory_order_relaxed); + std::atomic_thread_fence(std::memory_order_release); + ALvoice::State oldvstate{ALvoice::Playing}; + voice->mPlayState.compare_exchange_strong(oldvstate, ALvoice::Stopping, + std::memory_order_acq_rel, std::memory_order_acquire); + voice = nullptr; + } + if(oldstate != AL_INITIAL && oldstate != AL_STOPPED) + { + source->state = AL_STOPPED; + SendStateChangeEvent(context.get(), source->id, AL_STOPPED); + } + source->OffsetType = AL_NONE; + source->Offset = 0.0; + }; + std::for_each(srchandles.begin(), srchandles.end(), stop_source); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourceRewind(ALuint source) +START_API_FUNC +{ alSourceRewindv(1, &source); } +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(n < 0) + context->setError(AL_INVALID_VALUE, "Rewinding %d sources", n); + if UNLIKELY(n <= 0) return; + + al::vector extra_sources; + std::array source_storage; + al::span srchandles; + if LIKELY(static_cast(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast(n)}; + else + { + extra_sources.resize(static_cast(n)); + srchandles = {extra_sources.data(), extra_sources.size()}; + } + + std::lock_guard _{context->mSourceLock}; + for(auto &srchdl : srchandles) + { + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; + } + + ALCdevice *device{context->mDevice.get()}; + BackendLockGuard __{*device->Backend}; + auto rewind_source = [&context](ALsource *source) -> void + { + ALvoice *voice{GetSourceVoice(source, context.get())}; + if(voice != nullptr) + { + voice->mCurrentBuffer.store(nullptr, std::memory_order_relaxed); + voice->mLoopBuffer.store(nullptr, std::memory_order_relaxed); + voice->mSourceID.store(0u, std::memory_order_relaxed); + std::atomic_thread_fence(std::memory_order_release); + ALvoice::State oldvstate{ALvoice::Playing}; + voice->mPlayState.compare_exchange_strong(oldvstate, ALvoice::Stopping, + std::memory_order_acq_rel, std::memory_order_acquire); + voice = nullptr; + } + if(source->state != AL_INITIAL) + { + source->state = AL_INITIAL; + SendStateChangeEvent(context.get(), source->id, AL_INITIAL); + } + source->OffsetType = AL_NONE; + source->Offset = 0.0; + }; + std::for_each(srchandles.begin(), srchandles.end(), rewind_source); +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint src, ALsizei nb, const ALuint *buffers) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(nb < 0) + context->setError(AL_INVALID_VALUE, "Queueing %d buffers", nb); + if UNLIKELY(nb <= 0) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *source{LookupSource(context.get(),src)}; + if UNLIKELY(!source) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", src); + + /* Can't queue on a Static Source */ + if UNLIKELY(source->SourceType == AL_STATIC) + SETERR_RETURN(context, AL_INVALID_OPERATION,, "Queueing onto static source %u", src); + + /* Check for a valid Buffer, for its frequency and format */ + ALCdevice *device{context->mDevice.get()}; + ALbuffer *BufferFmt{nullptr}; + ALbufferlistitem *BufferList{source->queue}; + while(BufferList && !BufferFmt) + { + BufferFmt = BufferList->mBuffer; + BufferList = BufferList->mNext.load(std::memory_order_relaxed); + } + + std::unique_lock buflock{device->BufferLock}; + ALbufferlistitem *BufferListStart{nullptr}; + BufferList = nullptr; + for(ALsizei i{0};i < nb;i++) + { + ALbuffer *buffer{nullptr}; + if(buffers[i] && (buffer=LookupBuffer(device, buffers[i])) == nullptr) + { + context->setError(AL_INVALID_NAME, "Queueing invalid buffer ID %u", buffers[i]); + goto buffer_error; + } + + if(!BufferListStart) + { + BufferListStart = new ALbufferlistitem{}; + BufferList = BufferListStart; + } + else + { + auto item = new ALbufferlistitem{}; + BufferList->mNext.store(item, std::memory_order_relaxed); + BufferList = item; + } + BufferList->mNext.store(nullptr, std::memory_order_relaxed); + BufferList->mSampleLen = buffer ? buffer->SampleLen : 0; + BufferList->mBuffer = buffer; + if(!buffer) continue; + + IncrementRef(buffer->ref); + + if(buffer->MappedAccess != 0 && !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) + { + context->setError(AL_INVALID_OPERATION, "Queueing non-persistently mapped buffer %u", + buffer->id); + goto buffer_error; + } + + if(BufferFmt == nullptr) + BufferFmt = buffer; + else if(BufferFmt->Frequency != buffer->Frequency || + BufferFmt->mFmtChannels != buffer->mFmtChannels || + ((BufferFmt->mFmtChannels == FmtBFormat2D || + BufferFmt->mFmtChannels == FmtBFormat3D) && + (BufferFmt->AmbiLayout != buffer->AmbiLayout || + BufferFmt->AmbiScaling != buffer->AmbiScaling)) || + BufferFmt->OriginalType != buffer->OriginalType) + { + context->setError(AL_INVALID_OPERATION, "Queueing buffer with mismatched format"); + + buffer_error: + /* A buffer failed (invalid ID or format), so unlock and release + * each buffer we had. */ + while(BufferListStart) + { + std::unique_ptr head{BufferListStart}; + BufferListStart = head->mNext.load(std::memory_order_relaxed); + if((buffer=head->mBuffer) != nullptr) DecrementRef(buffer->ref); + } + return; + } + } + /* All buffers good. */ + buflock.unlock(); + + /* Source is now streaming */ + source->SourceType = AL_STREAMING; + + BufferList = source->queue; + if(!BufferList) + source->queue = BufferListStart; + else + { + ALbufferlistitem *next; + while((next=BufferList->mNext.load(std::memory_order_relaxed)) != nullptr) + BufferList = next; + BufferList->mNext.store(BufferListStart, std::memory_order_release); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSourceUnqueueBuffers(ALuint src, ALsizei nb, ALuint *buffers) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if UNLIKELY(nb < 0) + context->setError(AL_INVALID_VALUE, "Unqueueing %d buffers", nb); + if UNLIKELY(nb <= 0) return; + + std::lock_guard _{context->mSourceLock}; + ALsource *source{LookupSource(context.get(),src)}; + if UNLIKELY(!source) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", src); + + if UNLIKELY(source->Looping) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Unqueueing from looping source %u", src); + if UNLIKELY(source->SourceType != AL_STREAMING) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Unqueueing from a non-streaming source %u", + src); + + /* Make sure enough buffers have been processed to unqueue. */ + ALbufferlistitem *BufferList{source->queue}; + ALvoice *voice{GetSourceVoice(source, context.get())}; + ALbufferlistitem *Current{nullptr}; + if(voice) + Current = voice->mCurrentBuffer.load(std::memory_order_relaxed); + else if(source->state == AL_INITIAL) + Current = BufferList; + if UNLIKELY(BufferList == Current) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Unqueueing pending buffers"); + + ALuint i{1u}; + while(i < static_cast(nb)) + { + /* If the next bufferlist to check is NULL or is the current one, it's + * trying to unqueue pending buffers. + */ + ALbufferlistitem *next{BufferList->mNext.load(std::memory_order_relaxed)}; + if UNLIKELY(!next || next == Current) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Unqueueing pending buffers"); + BufferList = next; + + ++i; + } + + do { + std::unique_ptr head{source->queue}; + source->queue = head->mNext.load(std::memory_order_relaxed); + + if(ALbuffer *buffer{head->mBuffer}) + { + *(buffers++) = buffer->id; + DecrementRef(buffer->ref); + } + else + *(buffers++) = 0; + } while(--nb); +} +END_API_FUNC + + +ALsource::ALsource(ALuint num_sends) +{ + InnerAngle = 360.0f; + OuterAngle = 360.0f; + Pitch = 1.0f; + Position[0] = 0.0f; + Position[1] = 0.0f; + Position[2] = 0.0f; + Velocity[0] = 0.0f; + Velocity[1] = 0.0f; + Velocity[2] = 0.0f; + Direction[0] = 0.0f; + Direction[1] = 0.0f; + Direction[2] = 0.0f; + OrientAt[0] = 0.0f; + OrientAt[1] = 0.0f; + OrientAt[2] = -1.0f; + OrientUp[0] = 0.0f; + OrientUp[1] = 1.0f; + OrientUp[2] = 0.0f; + RefDistance = 1.0f; + MaxDistance = std::numeric_limits::max(); + RolloffFactor = 1.0f; + Gain = 1.0f; + MinGain = 0.0f; + MaxGain = 1.0f; + OuterGain = 0.0f; + OuterGainHF = 1.0f; + + DryGainHFAuto = AL_TRUE; + WetGainAuto = AL_TRUE; + WetGainHFAuto = AL_TRUE; + AirAbsorptionFactor = 0.0f; + RoomRolloffFactor = 0.0f; + DopplerFactor = 1.0f; + HeadRelative = AL_FALSE; + Looping = AL_FALSE; + mDistanceModel = DistanceModel::Default; + mResampler = ResamplerDefault; + DirectChannels = DirectMode::Off; + mSpatialize = SpatializeAuto; + + StereoPan[0] = Deg2Rad( 30.0f); + StereoPan[1] = Deg2Rad(-30.0f); + + Radius = 0.0f; + + Direct.Gain = 1.0f; + Direct.GainHF = 1.0f; + Direct.HFReference = LOWPASSFREQREF; + Direct.GainLF = 1.0f; + Direct.LFReference = HIGHPASSFREQREF; + Send.resize(num_sends); + for(auto &send : Send) + { + send.Slot = nullptr; + send.Gain = 1.0f; + send.GainHF = 1.0f; + send.HFReference = LOWPASSFREQREF; + send.GainLF = 1.0f; + send.LFReference = HIGHPASSFREQREF; + } + + PropsClean.test_and_set(std::memory_order_relaxed); +} + +ALsource::~ALsource() +{ + ALbufferlistitem *BufferList{queue}; + while(BufferList != nullptr) + { + std::unique_ptr head{BufferList}; + BufferList = head->mNext.load(std::memory_order_relaxed); + if(ALbuffer *buffer{head->mBuffer}) DecrementRef(buffer->ref); + } + queue = nullptr; + + std::for_each(Send.begin(), Send.end(), + [](ALsource::SendData &send) -> void + { + if(send.Slot) + DecrementRef(send.Slot->ref); + send.Slot = nullptr; + } + ); +} + +void UpdateAllSourceProps(ALCcontext *context) +{ + std::lock_guard _{context->mSourceLock}; + std::for_each(context->mVoices.begin(), context->mVoices.end(), + [context](ALvoice &voice) -> void + { + ALuint sid{voice.mSourceID.load(std::memory_order_acquire)}; + ALsource *source = sid ? LookupSource(context, sid) : nullptr; + if(source && !source->PropsClean.test_and_set(std::memory_order_acq_rel)) + UpdateSourceProps(source, &voice, context); + } + ); +} + +SourceSubList::~SourceSubList() +{ + uint64_t usemask{~FreeMask}; + while(usemask) + { + ALsizei idx{CTZ64(usemask)}; + al::destroy_at(Sources+idx); + usemask &= ~(1_u64 << idx); + } + FreeMask = ~usemask; + al_free(Sources); + Sources = nullptr; +} diff --git a/al/source.h b/al/source.h new file mode 100644 index 0000000..40bd084 --- /dev/null +++ b/al/source.h @@ -0,0 +1,129 @@ +#ifndef AL_SOURCE_H +#define AL_SOURCE_H + +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" + +#include "alcontext.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alu.h" +#include "vector.h" + +struct ALbuffer; +struct ALeffectslot; + + +#define DEFAULT_SENDS 2 + +#define INVALID_VOICE_IDX static_cast(-1) + +struct ALbufferlistitem { + std::atomic mNext{nullptr}; + ALuint mSampleLen{0u}; + ALbuffer *mBuffer{nullptr}; + + DEF_NEWDEL(ALbufferlistitem) +}; + + +struct ALsource { + /** Source properties. */ + ALfloat Pitch; + ALfloat Gain; + ALfloat OuterGain; + ALfloat MinGain; + ALfloat MaxGain; + ALfloat InnerAngle; + ALfloat OuterAngle; + ALfloat RefDistance; + ALfloat MaxDistance; + ALfloat RolloffFactor; + std::array Position; + std::array Velocity; + std::array Direction; + std::array OrientAt; + std::array OrientUp; + bool HeadRelative; + bool Looping; + DistanceModel mDistanceModel; + Resampler mResampler; + DirectMode DirectChannels; + SpatializeMode mSpatialize; + + bool DryGainHFAuto; + bool WetGainAuto; + bool WetGainHFAuto; + ALfloat OuterGainHF; + + ALfloat AirAbsorptionFactor; + ALfloat RoomRolloffFactor; + ALfloat DopplerFactor; + + /* NOTE: Stereo pan angles are specified in radians, counter-clockwise + * rather than clockwise. + */ + std::array StereoPan; + + ALfloat Radius; + + /** Direct filter and auxiliary send info. */ + struct { + ALfloat Gain; + ALfloat GainHF; + ALfloat HFReference; + ALfloat GainLF; + ALfloat LFReference; + } Direct; + struct SendData { + ALeffectslot *Slot; + ALfloat Gain; + ALfloat GainHF; + ALfloat HFReference; + ALfloat GainLF; + ALfloat LFReference; + }; + al::vector Send; + + /** + * Last user-specified offset, and the offset type (bytes, samples, or + * seconds). + */ + ALdouble Offset{0.0}; + ALenum OffsetType{AL_NONE}; + + /** Source type (static, streaming, or undetermined) */ + ALenum SourceType{AL_UNDETERMINED}; + + /** Source state (initial, playing, paused, or stopped) */ + ALenum state{AL_INITIAL}; + + /** Source Buffer Queue head. */ + ALbufferlistitem *queue{nullptr}; + + std::atomic_flag PropsClean; + + /* Index into the context's Voices array. Lazily updated, only checked and + * reset when looking up the voice. + */ + ALuint VoiceIdx{INVALID_VOICE_IDX}; + + /** Self ID */ + ALuint id{0}; + + + ALsource(ALuint num_sends); + ~ALsource(); + + ALsource(const ALsource&) = delete; + ALsource& operator=(const ALsource&) = delete; +}; + +void UpdateAllSourceProps(ALCcontext *context); + +#endif diff --git a/al/state.cpp b/al/state.cpp new file mode 100644 index 0000000..25a0efd --- /dev/null +++ b/al/state.cpp @@ -0,0 +1,880 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2000 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "version.h" + +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" + +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alspan.h" +#include "alu.h" +#include "atomic.h" +#include "event.h" +#include "inprogext.h" +#include "opthelpers.h" +#include "strutils.h" + + +namespace { + +constexpr ALchar alVendor[] = "OpenAL Community"; +constexpr ALchar alVersion[] = "1.1 ALSOFT " ALSOFT_VERSION; +constexpr ALchar alRenderer[] = "OpenAL Soft"; + +// Error Messages +constexpr ALchar alNoError[] = "No Error"; +constexpr ALchar alErrInvalidName[] = "Invalid Name"; +constexpr ALchar alErrInvalidEnum[] = "Invalid Enum"; +constexpr ALchar alErrInvalidValue[] = "Invalid Value"; +constexpr ALchar alErrInvalidOp[] = "Invalid Operation"; +constexpr ALchar alErrOutOfMemory[] = "Out of Memory"; + +/* Resampler strings */ +template struct ResamplerName { }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "Nearest"; } }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "Linear"; } }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "Cubic"; } }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "11th order Sinc (fast)"; } }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "11th order Sinc"; } }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "23rd order Sinc (fast)"; } }; +template<> struct ResamplerName +{ static constexpr const ALchar *Get() noexcept { return "23rd order Sinc"; } }; + +const ALchar *GetResamplerName(const Resampler rtype) +{ +#define HANDLE_RESAMPLER(r) case r: return ResamplerName::Get() + switch(rtype) + { + HANDLE_RESAMPLER(Resampler::Point); + HANDLE_RESAMPLER(Resampler::Linear); + HANDLE_RESAMPLER(Resampler::Cubic); + HANDLE_RESAMPLER(Resampler::FastBSinc12); + HANDLE_RESAMPLER(Resampler::BSinc12); + HANDLE_RESAMPLER(Resampler::FastBSinc24); + HANDLE_RESAMPLER(Resampler::BSinc24); + } +#undef HANDLE_RESAMPLER + /* Should never get here. */ + throw std::runtime_error{"Unexpected resampler index"}; +} + +} // namespace + +/* WARNING: Non-standard export! Not part of any extension, or exposed in the + * alcFunctions list. + */ +extern "C" AL_API const ALchar* AL_APIENTRY alsoft_get_version(void) +START_API_FUNC +{ + static const auto spoof = al::getenv("ALSOFT_SPOOF_VERSION"); + if(spoof) return spoof->c_str(); + return ALSOFT_VERSION; +} +END_API_FUNC + +#define DO_UPDATEPROPS() do { \ + if(!context->mDeferUpdates.load(std::memory_order_acquire)) \ + UpdateContextProps(context.get()); \ + else \ + context->mPropsClean.clear(std::memory_order_release); \ +} while(0) + + +AL_API ALvoid AL_APIENTRY alEnable(ALenum capability) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + switch(capability) + { + case AL_SOURCE_DISTANCE_MODEL: + context->mSourceDistanceModel = AL_TRUE; + DO_UPDATEPROPS(); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid enable property 0x%04x", capability); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDisable(ALenum capability) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + std::lock_guard _{context->mPropLock}; + switch(capability) + { + case AL_SOURCE_DISTANCE_MODEL: + context->mSourceDistanceModel = AL_FALSE; + DO_UPDATEPROPS(); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid disable property 0x%04x", capability); + } +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return AL_FALSE; + + std::lock_guard _{context->mPropLock}; + ALboolean value{AL_FALSE}; + switch(capability) + { + case AL_SOURCE_DISTANCE_MODEL: + value = context->mSourceDistanceModel; + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid is enabled property 0x%04x", capability); + } + + return value; +} +END_API_FUNC + +AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return AL_FALSE; + + std::lock_guard _{context->mPropLock}; + ALboolean value{AL_FALSE}; + switch(pname) + { + case AL_DOPPLER_FACTOR: + if(context->mDopplerFactor != 0.0f) + value = AL_TRUE; + break; + + case AL_DOPPLER_VELOCITY: + if(context->mDopplerVelocity != 0.0f) + value = AL_TRUE; + break; + + case AL_DISTANCE_MODEL: + if(context->mDistanceModel == DistanceModel::Default) + value = AL_TRUE; + break; + + case AL_SPEED_OF_SOUND: + if(context->mSpeedOfSound != 0.0f) + value = AL_TRUE; + break; + + case AL_DEFERRED_UPDATES_SOFT: + if(context->mDeferUpdates.load(std::memory_order_acquire)) + value = AL_TRUE; + break; + + case AL_GAIN_LIMIT_SOFT: + if(GAIN_MIX_MAX/context->mGainBoost != 0.0f) + value = AL_TRUE; + break; + + case AL_NUM_RESAMPLERS_SOFT: + /* Always non-0. */ + value = AL_TRUE; + break; + + case AL_DEFAULT_RESAMPLER_SOFT: + value = static_cast(ResamplerDefault) ? AL_TRUE : AL_FALSE; + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid boolean property 0x%04x", pname); + } + + return value; +} +END_API_FUNC + +AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return 0.0; + + std::lock_guard _{context->mPropLock}; + ALdouble value{0.0}; + switch(pname) + { + case AL_DOPPLER_FACTOR: + value = context->mDopplerFactor; + break; + + case AL_DOPPLER_VELOCITY: + value = context->mDopplerVelocity; + break; + + case AL_DISTANCE_MODEL: + value = static_cast(context->mDistanceModel); + break; + + case AL_SPEED_OF_SOUND: + value = context->mSpeedOfSound; + break; + + case AL_DEFERRED_UPDATES_SOFT: + if(context->mDeferUpdates.load(std::memory_order_acquire)) + value = static_cast(AL_TRUE); + break; + + case AL_GAIN_LIMIT_SOFT: + value = ALdouble{GAIN_MIX_MAX}/context->mGainBoost; + break; + + case AL_NUM_RESAMPLERS_SOFT: + value = static_cast(Resampler::Max) + 1.0; + break; + + case AL_DEFAULT_RESAMPLER_SOFT: + value = static_cast(ResamplerDefault); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid double property 0x%04x", pname); + } + + return value; +} +END_API_FUNC + +AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return 0.0f; + + std::lock_guard _{context->mPropLock}; + ALfloat value{0.0f}; + switch(pname) + { + case AL_DOPPLER_FACTOR: + value = context->mDopplerFactor; + break; + + case AL_DOPPLER_VELOCITY: + value = context->mDopplerVelocity; + break; + + case AL_DISTANCE_MODEL: + value = static_cast(context->mDistanceModel); + break; + + case AL_SPEED_OF_SOUND: + value = context->mSpeedOfSound; + break; + + case AL_DEFERRED_UPDATES_SOFT: + if(context->mDeferUpdates.load(std::memory_order_acquire)) + value = static_cast(AL_TRUE); + break; + + case AL_GAIN_LIMIT_SOFT: + value = GAIN_MIX_MAX/context->mGainBoost; + break; + + case AL_NUM_RESAMPLERS_SOFT: + value = static_cast(Resampler::Max) + 1.0f; + break; + + case AL_DEFAULT_RESAMPLER_SOFT: + value = static_cast(ResamplerDefault); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid float property 0x%04x", pname); + } + + return value; +} +END_API_FUNC + +AL_API ALint AL_APIENTRY alGetInteger(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return 0; + + std::lock_guard _{context->mPropLock}; + ALint value{0}; + switch(pname) + { + case AL_DOPPLER_FACTOR: + value = static_cast(context->mDopplerFactor); + break; + + case AL_DOPPLER_VELOCITY: + value = static_cast(context->mDopplerVelocity); + break; + + case AL_DISTANCE_MODEL: + value = static_cast(context->mDistanceModel); + break; + + case AL_SPEED_OF_SOUND: + value = static_cast(context->mSpeedOfSound); + break; + + case AL_DEFERRED_UPDATES_SOFT: + if(context->mDeferUpdates.load(std::memory_order_acquire)) + value = AL_TRUE; + break; + + case AL_GAIN_LIMIT_SOFT: + value = static_cast(GAIN_MIX_MAX/context->mGainBoost); + break; + + case AL_NUM_RESAMPLERS_SOFT: + value = static_cast(Resampler::Max) + 1; + break; + + case AL_DEFAULT_RESAMPLER_SOFT: + value = static_cast(ResamplerDefault); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid integer property 0x%04x", pname); + } + + return value; +} +END_API_FUNC + +extern "C" AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return 0_i64; + + std::lock_guard _{context->mPropLock}; + ALint64SOFT value{0}; + switch(pname) + { + case AL_DOPPLER_FACTOR: + value = static_cast(context->mDopplerFactor); + break; + + case AL_DOPPLER_VELOCITY: + value = static_cast(context->mDopplerVelocity); + break; + + case AL_DISTANCE_MODEL: + value = static_cast(context->mDistanceModel); + break; + + case AL_SPEED_OF_SOUND: + value = static_cast(context->mSpeedOfSound); + break; + + case AL_DEFERRED_UPDATES_SOFT: + if(context->mDeferUpdates.load(std::memory_order_acquire)) + value = AL_TRUE; + break; + + case AL_GAIN_LIMIT_SOFT: + value = static_cast(GAIN_MIX_MAX/context->mGainBoost); + break; + + case AL_NUM_RESAMPLERS_SOFT: + value = static_cast(Resampler::Max) + 1; + break; + + case AL_DEFAULT_RESAMPLER_SOFT: + value = static_cast(ResamplerDefault); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid integer64 property 0x%04x", pname); + } + + return value; +} +END_API_FUNC + +AL_API void* AL_APIENTRY alGetPointerSOFT(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return nullptr; + + std::lock_guard _{context->mPropLock}; + void *value{nullptr}; + switch(pname) + { + case AL_EVENT_CALLBACK_FUNCTION_SOFT: + value = reinterpret_cast(context->mEventCb); + break; + + case AL_EVENT_CALLBACK_USER_PARAM_SOFT: + value = context->mEventParam; + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid pointer property 0x%04x", pname); + } + + return value; +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetBooleanv(ALenum pname, ALboolean *values) +START_API_FUNC +{ + if(values) + { + switch(pname) + { + case AL_DOPPLER_FACTOR: + case AL_DOPPLER_VELOCITY: + case AL_DISTANCE_MODEL: + case AL_SPEED_OF_SOUND: + case AL_DEFERRED_UPDATES_SOFT: + case AL_GAIN_LIMIT_SOFT: + case AL_NUM_RESAMPLERS_SOFT: + case AL_DEFAULT_RESAMPLER_SOFT: + values[0] = alGetBoolean(pname); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(pname) + { + default: + context->setError(AL_INVALID_VALUE, "Invalid boolean-vector property 0x%04x", pname); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetDoublev(ALenum pname, ALdouble *values) +START_API_FUNC +{ + if(values) + { + switch(pname) + { + case AL_DOPPLER_FACTOR: + case AL_DOPPLER_VELOCITY: + case AL_DISTANCE_MODEL: + case AL_SPEED_OF_SOUND: + case AL_DEFERRED_UPDATES_SOFT: + case AL_GAIN_LIMIT_SOFT: + case AL_NUM_RESAMPLERS_SOFT: + case AL_DEFAULT_RESAMPLER_SOFT: + values[0] = alGetDouble(pname); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(pname) + { + default: + context->setError(AL_INVALID_VALUE, "Invalid double-vector property 0x%04x", pname); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetFloatv(ALenum pname, ALfloat *values) +START_API_FUNC +{ + if(values) + { + switch(pname) + { + case AL_DOPPLER_FACTOR: + case AL_DOPPLER_VELOCITY: + case AL_DISTANCE_MODEL: + case AL_SPEED_OF_SOUND: + case AL_DEFERRED_UPDATES_SOFT: + case AL_GAIN_LIMIT_SOFT: + case AL_NUM_RESAMPLERS_SOFT: + case AL_DEFAULT_RESAMPLER_SOFT: + values[0] = alGetFloat(pname); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(pname) + { + default: + context->setError(AL_INVALID_VALUE, "Invalid float-vector property 0x%04x", pname); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values) +START_API_FUNC +{ + if(values) + { + switch(pname) + { + case AL_DOPPLER_FACTOR: + case AL_DOPPLER_VELOCITY: + case AL_DISTANCE_MODEL: + case AL_SPEED_OF_SOUND: + case AL_DEFERRED_UPDATES_SOFT: + case AL_GAIN_LIMIT_SOFT: + case AL_NUM_RESAMPLERS_SOFT: + case AL_DEFAULT_RESAMPLER_SOFT: + values[0] = alGetInteger(pname); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(pname) + { + default: + context->setError(AL_INVALID_VALUE, "Invalid integer-vector property 0x%04x", pname); + } +} +END_API_FUNC + +extern "C" AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values) +START_API_FUNC +{ + if(values) + { + switch(pname) + { + case AL_DOPPLER_FACTOR: + case AL_DOPPLER_VELOCITY: + case AL_DISTANCE_MODEL: + case AL_SPEED_OF_SOUND: + case AL_DEFERRED_UPDATES_SOFT: + case AL_GAIN_LIMIT_SOFT: + case AL_NUM_RESAMPLERS_SOFT: + case AL_DEFAULT_RESAMPLER_SOFT: + values[0] = alGetInteger64SOFT(pname); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(pname) + { + default: + context->setError(AL_INVALID_VALUE, "Invalid integer64-vector property 0x%04x", pname); + } +} +END_API_FUNC + +AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values) +START_API_FUNC +{ + if(values) + { + switch(pname) + { + case AL_EVENT_CALLBACK_FUNCTION_SOFT: + case AL_EVENT_CALLBACK_USER_PARAM_SOFT: + values[0] = alGetPointerSOFT(pname); + return; + } + } + + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!values) + context->setError(AL_INVALID_VALUE, "NULL pointer"); + else switch(pname) + { + default: + context->setError(AL_INVALID_VALUE, "Invalid pointer-vector property 0x%04x", pname); + } +} +END_API_FUNC + +AL_API const ALchar* AL_APIENTRY alGetString(ALenum pname) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return nullptr; + + const ALchar *value{nullptr}; + switch(pname) + { + case AL_VENDOR: + value = alVendor; + break; + + case AL_VERSION: + value = alVersion; + break; + + case AL_RENDERER: + value = alRenderer; + break; + + case AL_EXTENSIONS: + value = context->mExtensionList; + break; + + case AL_NO_ERROR: + value = alNoError; + break; + + case AL_INVALID_NAME: + value = alErrInvalidName; + break; + + case AL_INVALID_ENUM: + value = alErrInvalidEnum; + break; + + case AL_INVALID_VALUE: + value = alErrInvalidValue; + break; + + case AL_INVALID_OPERATION: + value = alErrInvalidOp; + break; + + case AL_OUT_OF_MEMORY: + value = alErrOutOfMemory; + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid string property 0x%04x", pname); + } + return value; +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDopplerFactor(ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!(value >= 0.0f && std::isfinite(value))) + context->setError(AL_INVALID_VALUE, "Doppler factor %f out of range", value); + else + { + std::lock_guard _{context->mPropLock}; + context->mDopplerFactor = value; + DO_UPDATEPROPS(); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDopplerVelocity(ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if((context->mEnabledEvts.load(std::memory_order_relaxed)&EventType_Deprecated)) + { + std::lock_guard _{context->mEventCbLock}; + ALbitfieldSOFT enabledevts{context->mEnabledEvts.load(std::memory_order_relaxed)}; + if((enabledevts&EventType_Deprecated) && context->mEventCb) + { + static const char msg[] = + "alDopplerVelocity is deprecated in AL1.1, use alSpeedOfSound"; + const ALsizei msglen{sizeof(msg)-1}; + (*context->mEventCb)(AL_EVENT_TYPE_DEPRECATED_SOFT, 0, 0, msglen, msg, + context->mEventParam); + } + } + + if(!(value >= 0.0f && std::isfinite(value))) + context->setError(AL_INVALID_VALUE, "Doppler velocity %f out of range", value); + else + { + std::lock_guard _{context->mPropLock}; + context->mDopplerVelocity = value; + DO_UPDATEPROPS(); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alSpeedOfSound(ALfloat value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!(value > 0.0f && std::isfinite(value))) + context->setError(AL_INVALID_VALUE, "Speed of sound %f out of range", value); + else + { + std::lock_guard _{context->mPropLock}; + context->mSpeedOfSound = value; + DO_UPDATEPROPS(); + } +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alDistanceModel(ALenum value) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + if(!(value == AL_INVERSE_DISTANCE || value == AL_INVERSE_DISTANCE_CLAMPED || + value == AL_LINEAR_DISTANCE || value == AL_LINEAR_DISTANCE_CLAMPED || + value == AL_EXPONENT_DISTANCE || value == AL_EXPONENT_DISTANCE_CLAMPED || + value == AL_NONE)) + context->setError(AL_INVALID_VALUE, "Distance model 0x%04x out of range", value); + else + { + std::lock_guard _{context->mPropLock}; + context->mDistanceModel = static_cast(value); + if(!context->mSourceDistanceModel) + DO_UPDATEPROPS(); + } +} +END_API_FUNC + + +AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + context->deferUpdates(); +} +END_API_FUNC + +AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return; + + context->processUpdates(); +} +END_API_FUNC + + +AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index) +START_API_FUNC +{ + ContextRef context{GetContextRef()}; + if UNLIKELY(!context) return nullptr; + + const ALchar *value{nullptr}; + switch(pname) + { + case AL_RESAMPLER_NAME_SOFT: + if(index < 0 || index > static_cast(Resampler::Max)) + context->setError(AL_INVALID_VALUE, "Resampler name index %d out of range", index); + else + value = GetResamplerName(static_cast(index)); + break; + + default: + context->setError(AL_INVALID_VALUE, "Invalid string indexed property"); + } + return value; +} +END_API_FUNC + + +void UpdateContextProps(ALCcontext *context) +{ + /* Get an unused proprty container, or allocate a new one as needed. */ + ALcontextProps *props{context->mFreeContextProps.load(std::memory_order_acquire)}; + if(!props) + props = new ALcontextProps{}; + else + { + ALcontextProps *next; + do { + next = props->next.load(std::memory_order_relaxed); + } while(context->mFreeContextProps.compare_exchange_weak(props, next, + std::memory_order_seq_cst, std::memory_order_acquire) == 0); + } + + /* Copy in current property values. */ + props->DopplerFactor = context->mDopplerFactor; + props->DopplerVelocity = context->mDopplerVelocity; + props->SpeedOfSound = context->mSpeedOfSound; + + props->SourceDistanceModel = context->mSourceDistanceModel; + props->mDistanceModel = context->mDistanceModel; + + /* Set the new container for updating internal parameters. */ + props = context->mUpdate.exchange(props, std::memory_order_acq_rel); + if(props) + { + /* If there was an unused update container, put it back in the + * freelist. + */ + AtomicReplaceHead(context->mFreeContextProps, props); + } +} diff --git a/alc/alc.cpp b/alc/alc.cpp new file mode 100644 index 0000000..f716bf0 --- /dev/null +++ b/alc/alc.cpp @@ -0,0 +1,4300 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "version.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" +#include "AL/efx.h" + +#include "al/auxeffectslot.h" +#include "al/effect.h" +#include "al/event.h" +#include "al/filter.h" +#include "al/listener.h" +#include "al/source.h" +#include "alcmain.h" +#include "albyte.h" +#include "alconfig.h" +#include "alcontext.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alspan.h" +#include "alstring.h" +#include "alu.h" +#include "ambidefs.h" +#include "atomic.h" +#include "bformatdec.h" +#include "bs2b.h" +#include "compat.h" +#include "cpu_caps.h" +#include "devformat.h" +#include "effects/base.h" +#include "filters/nfc.h" +#include "filters/splitter.h" +#include "fpu_modes.h" +#include "hrtf.h" +#include "inprogext.h" +#include "intrusive_ptr.h" +#include "logging.h" +#include "mastering.h" +#include "opthelpers.h" +#include "pragmadefs.h" +#include "ringbuffer.h" +#include "strutils.h" +#include "threads.h" +#include "uhjfilter.h" +#include "vecmat.h" +#include "vector.h" + +#include "backends/base.h" +#include "backends/null.h" +#include "backends/loopback.h" +#ifdef HAVE_JACK +#include "backends/jack.h" +#endif +#ifdef HAVE_PULSEAUDIO +#include "backends/pulseaudio.h" +#endif +#ifdef HAVE_ALSA +#include "backends/alsa.h" +#endif +#ifdef HAVE_WASAPI +#include "backends/wasapi.h" +#endif +#ifdef HAVE_COREAUDIO +#include "backends/coreaudio.h" +#endif +#ifdef HAVE_OPENSL +#include "backends/opensl.h" +#endif +#ifdef HAVE_SOLARIS +#include "backends/solaris.h" +#endif +#ifdef HAVE_SNDIO +#include "backends/sndio.h" +#endif +#ifdef HAVE_OSS +#include "backends/oss.h" +#endif +#ifdef HAVE_QSA +#include "backends/qsa.h" +#endif +#ifdef HAVE_DSOUND +#include "backends/dsound.h" +#endif +#ifdef HAVE_WINMM +#include "backends/winmm.h" +#endif +#ifdef HAVE_PORTAUDIO +#include "backends/portaudio.h" +#endif +#ifdef HAVE_SDL2 +#include "backends/sdl2.h" +#endif +#ifdef HAVE_WAVE +#include "backends/wave.h" +#endif + + +namespace { + +using namespace std::placeholders; +using std::chrono::seconds; +using std::chrono::nanoseconds; + + +/************************************************ + * Backends + ************************************************/ +struct BackendInfo { + const char *name; + BackendFactory& (*getFactory)(void); +}; + +BackendInfo BackendList[] = { +#ifdef HAVE_JACK + { "jack", JackBackendFactory::getFactory }, +#endif +#ifdef HAVE_PULSEAUDIO + { "pulse", PulseBackendFactory::getFactory }, +#endif +#ifdef HAVE_ALSA + { "alsa", AlsaBackendFactory::getFactory }, +#endif +#ifdef HAVE_WASAPI + { "wasapi", WasapiBackendFactory::getFactory }, +#endif +#ifdef HAVE_COREAUDIO + { "core", CoreAudioBackendFactory::getFactory }, +#endif +#ifdef HAVE_OPENSL + { "opensl", OSLBackendFactory::getFactory }, +#endif +#ifdef HAVE_SOLARIS + { "solaris", SolarisBackendFactory::getFactory }, +#endif +#ifdef HAVE_SNDIO + { "sndio", SndIOBackendFactory::getFactory }, +#endif +#ifdef HAVE_OSS + { "oss", OSSBackendFactory::getFactory }, +#endif +#ifdef HAVE_QSA + { "qsa", QSABackendFactory::getFactory }, +#endif +#ifdef HAVE_DSOUND + { "dsound", DSoundBackendFactory::getFactory }, +#endif +#ifdef HAVE_WINMM + { "winmm", WinMMBackendFactory::getFactory }, +#endif +#ifdef HAVE_PORTAUDIO + { "port", PortBackendFactory::getFactory }, +#endif +#ifdef HAVE_SDL2 + { "sdl2", SDL2BackendFactory::getFactory }, +#endif + + { "null", NullBackendFactory::getFactory }, +#ifdef HAVE_WAVE + { "wave", WaveBackendFactory::getFactory }, +#endif +}; +auto BackendListEnd = std::end(BackendList); + +BackendFactory *PlaybackFactory{}; +BackendFactory *CaptureFactory{}; + + +/************************************************ + * Functions, enums, and errors + ************************************************/ +#define DECL(x) { #x, reinterpret_cast(x) } +const struct { + const ALCchar *funcName; + ALCvoid *address; +} alcFunctions[] = { + DECL(alcCreateContext), + DECL(alcMakeContextCurrent), + DECL(alcProcessContext), + DECL(alcSuspendContext), + DECL(alcDestroyContext), + DECL(alcGetCurrentContext), + DECL(alcGetContextsDevice), + DECL(alcOpenDevice), + DECL(alcCloseDevice), + DECL(alcGetError), + DECL(alcIsExtensionPresent), + DECL(alcGetProcAddress), + DECL(alcGetEnumValue), + DECL(alcGetString), + DECL(alcGetIntegerv), + DECL(alcCaptureOpenDevice), + DECL(alcCaptureCloseDevice), + DECL(alcCaptureStart), + DECL(alcCaptureStop), + DECL(alcCaptureSamples), + + DECL(alcSetThreadContext), + DECL(alcGetThreadContext), + + DECL(alcLoopbackOpenDeviceSOFT), + DECL(alcIsRenderFormatSupportedSOFT), + DECL(alcRenderSamplesSOFT), + + DECL(alcDevicePauseSOFT), + DECL(alcDeviceResumeSOFT), + + DECL(alcGetStringiSOFT), + DECL(alcResetDeviceSOFT), + + DECL(alcGetInteger64vSOFT), + + DECL(alEnable), + DECL(alDisable), + DECL(alIsEnabled), + DECL(alGetString), + DECL(alGetBooleanv), + DECL(alGetIntegerv), + DECL(alGetFloatv), + DECL(alGetDoublev), + DECL(alGetBoolean), + DECL(alGetInteger), + DECL(alGetFloat), + DECL(alGetDouble), + DECL(alGetError), + DECL(alIsExtensionPresent), + DECL(alGetProcAddress), + DECL(alGetEnumValue), + DECL(alListenerf), + DECL(alListener3f), + DECL(alListenerfv), + DECL(alListeneri), + DECL(alListener3i), + DECL(alListeneriv), + DECL(alGetListenerf), + DECL(alGetListener3f), + DECL(alGetListenerfv), + DECL(alGetListeneri), + DECL(alGetListener3i), + DECL(alGetListeneriv), + DECL(alGenSources), + DECL(alDeleteSources), + DECL(alIsSource), + DECL(alSourcef), + DECL(alSource3f), + DECL(alSourcefv), + DECL(alSourcei), + DECL(alSource3i), + DECL(alSourceiv), + DECL(alGetSourcef), + DECL(alGetSource3f), + DECL(alGetSourcefv), + DECL(alGetSourcei), + DECL(alGetSource3i), + DECL(alGetSourceiv), + DECL(alSourcePlayv), + DECL(alSourceStopv), + DECL(alSourceRewindv), + DECL(alSourcePausev), + DECL(alSourcePlay), + DECL(alSourceStop), + DECL(alSourceRewind), + DECL(alSourcePause), + DECL(alSourceQueueBuffers), + DECL(alSourceUnqueueBuffers), + DECL(alGenBuffers), + DECL(alDeleteBuffers), + DECL(alIsBuffer), + DECL(alBufferData), + DECL(alBufferf), + DECL(alBuffer3f), + DECL(alBufferfv), + DECL(alBufferi), + DECL(alBuffer3i), + DECL(alBufferiv), + DECL(alGetBufferf), + DECL(alGetBuffer3f), + DECL(alGetBufferfv), + DECL(alGetBufferi), + DECL(alGetBuffer3i), + DECL(alGetBufferiv), + DECL(alDopplerFactor), + DECL(alDopplerVelocity), + DECL(alSpeedOfSound), + DECL(alDistanceModel), + + DECL(alGenFilters), + DECL(alDeleteFilters), + DECL(alIsFilter), + DECL(alFilteri), + DECL(alFilteriv), + DECL(alFilterf), + DECL(alFilterfv), + DECL(alGetFilteri), + DECL(alGetFilteriv), + DECL(alGetFilterf), + DECL(alGetFilterfv), + DECL(alGenEffects), + DECL(alDeleteEffects), + DECL(alIsEffect), + DECL(alEffecti), + DECL(alEffectiv), + DECL(alEffectf), + DECL(alEffectfv), + DECL(alGetEffecti), + DECL(alGetEffectiv), + DECL(alGetEffectf), + DECL(alGetEffectfv), + DECL(alGenAuxiliaryEffectSlots), + DECL(alDeleteAuxiliaryEffectSlots), + DECL(alIsAuxiliaryEffectSlot), + DECL(alAuxiliaryEffectSloti), + DECL(alAuxiliaryEffectSlotiv), + DECL(alAuxiliaryEffectSlotf), + DECL(alAuxiliaryEffectSlotfv), + DECL(alGetAuxiliaryEffectSloti), + DECL(alGetAuxiliaryEffectSlotiv), + DECL(alGetAuxiliaryEffectSlotf), + DECL(alGetAuxiliaryEffectSlotfv), + + DECL(alDeferUpdatesSOFT), + DECL(alProcessUpdatesSOFT), + + DECL(alSourcedSOFT), + DECL(alSource3dSOFT), + DECL(alSourcedvSOFT), + DECL(alGetSourcedSOFT), + DECL(alGetSource3dSOFT), + DECL(alGetSourcedvSOFT), + DECL(alSourcei64SOFT), + DECL(alSource3i64SOFT), + DECL(alSourcei64vSOFT), + DECL(alGetSourcei64SOFT), + DECL(alGetSource3i64SOFT), + DECL(alGetSourcei64vSOFT), + + DECL(alGetStringiSOFT), + + DECL(alBufferStorageSOFT), + DECL(alMapBufferSOFT), + DECL(alUnmapBufferSOFT), + DECL(alFlushMappedBufferSOFT), + + DECL(alEventControlSOFT), + DECL(alEventCallbackSOFT), + DECL(alGetPointerSOFT), + DECL(alGetPointervSOFT), +}; +#undef DECL + +#define DECL(x) { #x, (x) } +constexpr struct { + const ALCchar *enumName; + ALCenum value; +} alcEnumerations[] = { + DECL(ALC_INVALID), + DECL(ALC_FALSE), + DECL(ALC_TRUE), + + DECL(ALC_MAJOR_VERSION), + DECL(ALC_MINOR_VERSION), + DECL(ALC_ATTRIBUTES_SIZE), + DECL(ALC_ALL_ATTRIBUTES), + DECL(ALC_DEFAULT_DEVICE_SPECIFIER), + DECL(ALC_DEVICE_SPECIFIER), + DECL(ALC_ALL_DEVICES_SPECIFIER), + DECL(ALC_DEFAULT_ALL_DEVICES_SPECIFIER), + DECL(ALC_EXTENSIONS), + DECL(ALC_FREQUENCY), + DECL(ALC_REFRESH), + DECL(ALC_SYNC), + DECL(ALC_MONO_SOURCES), + DECL(ALC_STEREO_SOURCES), + DECL(ALC_CAPTURE_DEVICE_SPECIFIER), + DECL(ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER), + DECL(ALC_CAPTURE_SAMPLES), + DECL(ALC_CONNECTED), + + DECL(ALC_EFX_MAJOR_VERSION), + DECL(ALC_EFX_MINOR_VERSION), + DECL(ALC_MAX_AUXILIARY_SENDS), + + DECL(ALC_FORMAT_CHANNELS_SOFT), + DECL(ALC_FORMAT_TYPE_SOFT), + + DECL(ALC_MONO_SOFT), + DECL(ALC_STEREO_SOFT), + DECL(ALC_QUAD_SOFT), + DECL(ALC_5POINT1_SOFT), + DECL(ALC_6POINT1_SOFT), + DECL(ALC_7POINT1_SOFT), + DECL(ALC_BFORMAT3D_SOFT), + + DECL(ALC_BYTE_SOFT), + DECL(ALC_UNSIGNED_BYTE_SOFT), + DECL(ALC_SHORT_SOFT), + DECL(ALC_UNSIGNED_SHORT_SOFT), + DECL(ALC_INT_SOFT), + DECL(ALC_UNSIGNED_INT_SOFT), + DECL(ALC_FLOAT_SOFT), + + DECL(ALC_HRTF_SOFT), + DECL(ALC_DONT_CARE_SOFT), + DECL(ALC_HRTF_STATUS_SOFT), + DECL(ALC_HRTF_DISABLED_SOFT), + DECL(ALC_HRTF_ENABLED_SOFT), + DECL(ALC_HRTF_DENIED_SOFT), + DECL(ALC_HRTF_REQUIRED_SOFT), + DECL(ALC_HRTF_HEADPHONES_DETECTED_SOFT), + DECL(ALC_HRTF_UNSUPPORTED_FORMAT_SOFT), + DECL(ALC_NUM_HRTF_SPECIFIERS_SOFT), + DECL(ALC_HRTF_SPECIFIER_SOFT), + DECL(ALC_HRTF_ID_SOFT), + + DECL(ALC_AMBISONIC_LAYOUT_SOFT), + DECL(ALC_AMBISONIC_SCALING_SOFT), + DECL(ALC_AMBISONIC_ORDER_SOFT), + DECL(ALC_ACN_SOFT), + DECL(ALC_FUMA_SOFT), + DECL(ALC_N3D_SOFT), + DECL(ALC_SN3D_SOFT), + + DECL(ALC_OUTPUT_LIMITER_SOFT), + + DECL(ALC_NO_ERROR), + DECL(ALC_INVALID_DEVICE), + DECL(ALC_INVALID_CONTEXT), + DECL(ALC_INVALID_ENUM), + DECL(ALC_INVALID_VALUE), + DECL(ALC_OUT_OF_MEMORY), + + + DECL(AL_INVALID), + DECL(AL_NONE), + DECL(AL_FALSE), + DECL(AL_TRUE), + + DECL(AL_SOURCE_RELATIVE), + DECL(AL_CONE_INNER_ANGLE), + DECL(AL_CONE_OUTER_ANGLE), + DECL(AL_PITCH), + DECL(AL_POSITION), + DECL(AL_DIRECTION), + DECL(AL_VELOCITY), + DECL(AL_LOOPING), + DECL(AL_BUFFER), + DECL(AL_GAIN), + DECL(AL_MIN_GAIN), + DECL(AL_MAX_GAIN), + DECL(AL_ORIENTATION), + DECL(AL_REFERENCE_DISTANCE), + DECL(AL_ROLLOFF_FACTOR), + DECL(AL_CONE_OUTER_GAIN), + DECL(AL_MAX_DISTANCE), + DECL(AL_SEC_OFFSET), + DECL(AL_SAMPLE_OFFSET), + DECL(AL_BYTE_OFFSET), + DECL(AL_SOURCE_TYPE), + DECL(AL_STATIC), + DECL(AL_STREAMING), + DECL(AL_UNDETERMINED), + DECL(AL_METERS_PER_UNIT), + DECL(AL_LOOP_POINTS_SOFT), + DECL(AL_DIRECT_CHANNELS_SOFT), + + DECL(AL_DIRECT_FILTER), + DECL(AL_AUXILIARY_SEND_FILTER), + DECL(AL_AIR_ABSORPTION_FACTOR), + DECL(AL_ROOM_ROLLOFF_FACTOR), + DECL(AL_CONE_OUTER_GAINHF), + DECL(AL_DIRECT_FILTER_GAINHF_AUTO), + DECL(AL_AUXILIARY_SEND_FILTER_GAIN_AUTO), + DECL(AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO), + + DECL(AL_SOURCE_STATE), + DECL(AL_INITIAL), + DECL(AL_PLAYING), + DECL(AL_PAUSED), + DECL(AL_STOPPED), + + DECL(AL_BUFFERS_QUEUED), + DECL(AL_BUFFERS_PROCESSED), + + DECL(AL_FORMAT_MONO8), + DECL(AL_FORMAT_MONO16), + DECL(AL_FORMAT_MONO_FLOAT32), + DECL(AL_FORMAT_MONO_DOUBLE_EXT), + DECL(AL_FORMAT_STEREO8), + DECL(AL_FORMAT_STEREO16), + DECL(AL_FORMAT_STEREO_FLOAT32), + DECL(AL_FORMAT_STEREO_DOUBLE_EXT), + DECL(AL_FORMAT_MONO_IMA4), + DECL(AL_FORMAT_STEREO_IMA4), + DECL(AL_FORMAT_MONO_MSADPCM_SOFT), + DECL(AL_FORMAT_STEREO_MSADPCM_SOFT), + DECL(AL_FORMAT_QUAD8_LOKI), + DECL(AL_FORMAT_QUAD16_LOKI), + DECL(AL_FORMAT_QUAD8), + DECL(AL_FORMAT_QUAD16), + DECL(AL_FORMAT_QUAD32), + DECL(AL_FORMAT_51CHN8), + DECL(AL_FORMAT_51CHN16), + DECL(AL_FORMAT_51CHN32), + DECL(AL_FORMAT_61CHN8), + DECL(AL_FORMAT_61CHN16), + DECL(AL_FORMAT_61CHN32), + DECL(AL_FORMAT_71CHN8), + DECL(AL_FORMAT_71CHN16), + DECL(AL_FORMAT_71CHN32), + DECL(AL_FORMAT_REAR8), + DECL(AL_FORMAT_REAR16), + DECL(AL_FORMAT_REAR32), + DECL(AL_FORMAT_MONO_MULAW), + DECL(AL_FORMAT_MONO_MULAW_EXT), + DECL(AL_FORMAT_STEREO_MULAW), + DECL(AL_FORMAT_STEREO_MULAW_EXT), + DECL(AL_FORMAT_QUAD_MULAW), + DECL(AL_FORMAT_51CHN_MULAW), + DECL(AL_FORMAT_61CHN_MULAW), + DECL(AL_FORMAT_71CHN_MULAW), + DECL(AL_FORMAT_REAR_MULAW), + DECL(AL_FORMAT_MONO_ALAW_EXT), + DECL(AL_FORMAT_STEREO_ALAW_EXT), + + DECL(AL_FORMAT_BFORMAT2D_8), + DECL(AL_FORMAT_BFORMAT2D_16), + DECL(AL_FORMAT_BFORMAT2D_FLOAT32), + DECL(AL_FORMAT_BFORMAT2D_MULAW), + DECL(AL_FORMAT_BFORMAT3D_8), + DECL(AL_FORMAT_BFORMAT3D_16), + DECL(AL_FORMAT_BFORMAT3D_FLOAT32), + DECL(AL_FORMAT_BFORMAT3D_MULAW), + + DECL(AL_FREQUENCY), + DECL(AL_BITS), + DECL(AL_CHANNELS), + DECL(AL_SIZE), + DECL(AL_UNPACK_BLOCK_ALIGNMENT_SOFT), + DECL(AL_PACK_BLOCK_ALIGNMENT_SOFT), + + DECL(AL_SOURCE_RADIUS), + + DECL(AL_STEREO_ANGLES), + + DECL(AL_UNUSED), + DECL(AL_PENDING), + DECL(AL_PROCESSED), + + DECL(AL_NO_ERROR), + DECL(AL_INVALID_NAME), + DECL(AL_INVALID_ENUM), + DECL(AL_INVALID_VALUE), + DECL(AL_INVALID_OPERATION), + DECL(AL_OUT_OF_MEMORY), + + DECL(AL_VENDOR), + DECL(AL_VERSION), + DECL(AL_RENDERER), + DECL(AL_EXTENSIONS), + + DECL(AL_DOPPLER_FACTOR), + DECL(AL_DOPPLER_VELOCITY), + DECL(AL_DISTANCE_MODEL), + DECL(AL_SPEED_OF_SOUND), + DECL(AL_SOURCE_DISTANCE_MODEL), + DECL(AL_DEFERRED_UPDATES_SOFT), + DECL(AL_GAIN_LIMIT_SOFT), + + DECL(AL_INVERSE_DISTANCE), + DECL(AL_INVERSE_DISTANCE_CLAMPED), + DECL(AL_LINEAR_DISTANCE), + DECL(AL_LINEAR_DISTANCE_CLAMPED), + DECL(AL_EXPONENT_DISTANCE), + DECL(AL_EXPONENT_DISTANCE_CLAMPED), + + DECL(AL_FILTER_TYPE), + DECL(AL_FILTER_NULL), + DECL(AL_FILTER_LOWPASS), + DECL(AL_FILTER_HIGHPASS), + DECL(AL_FILTER_BANDPASS), + + DECL(AL_LOWPASS_GAIN), + DECL(AL_LOWPASS_GAINHF), + + DECL(AL_HIGHPASS_GAIN), + DECL(AL_HIGHPASS_GAINLF), + + DECL(AL_BANDPASS_GAIN), + DECL(AL_BANDPASS_GAINHF), + DECL(AL_BANDPASS_GAINLF), + + DECL(AL_EFFECT_TYPE), + DECL(AL_EFFECT_NULL), + DECL(AL_EFFECT_REVERB), + DECL(AL_EFFECT_EAXREVERB), + DECL(AL_EFFECT_CHORUS), + DECL(AL_EFFECT_DISTORTION), + DECL(AL_EFFECT_ECHO), + DECL(AL_EFFECT_FLANGER), + DECL(AL_EFFECT_PITCH_SHIFTER), + DECL(AL_EFFECT_FREQUENCY_SHIFTER), + DECL(AL_EFFECT_VOCAL_MORPHER), + DECL(AL_EFFECT_RING_MODULATOR), + DECL(AL_EFFECT_AUTOWAH), + DECL(AL_EFFECT_COMPRESSOR), + DECL(AL_EFFECT_EQUALIZER), + DECL(AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT), + DECL(AL_EFFECT_DEDICATED_DIALOGUE), + + DECL(AL_EFFECTSLOT_EFFECT), + DECL(AL_EFFECTSLOT_GAIN), + DECL(AL_EFFECTSLOT_AUXILIARY_SEND_AUTO), + DECL(AL_EFFECTSLOT_NULL), + + DECL(AL_EAXREVERB_DENSITY), + DECL(AL_EAXREVERB_DIFFUSION), + DECL(AL_EAXREVERB_GAIN), + DECL(AL_EAXREVERB_GAINHF), + DECL(AL_EAXREVERB_GAINLF), + DECL(AL_EAXREVERB_DECAY_TIME), + DECL(AL_EAXREVERB_DECAY_HFRATIO), + DECL(AL_EAXREVERB_DECAY_LFRATIO), + DECL(AL_EAXREVERB_REFLECTIONS_GAIN), + DECL(AL_EAXREVERB_REFLECTIONS_DELAY), + DECL(AL_EAXREVERB_REFLECTIONS_PAN), + DECL(AL_EAXREVERB_LATE_REVERB_GAIN), + DECL(AL_EAXREVERB_LATE_REVERB_DELAY), + DECL(AL_EAXREVERB_LATE_REVERB_PAN), + DECL(AL_EAXREVERB_ECHO_TIME), + DECL(AL_EAXREVERB_ECHO_DEPTH), + DECL(AL_EAXREVERB_MODULATION_TIME), + DECL(AL_EAXREVERB_MODULATION_DEPTH), + DECL(AL_EAXREVERB_AIR_ABSORPTION_GAINHF), + DECL(AL_EAXREVERB_HFREFERENCE), + DECL(AL_EAXREVERB_LFREFERENCE), + DECL(AL_EAXREVERB_ROOM_ROLLOFF_FACTOR), + DECL(AL_EAXREVERB_DECAY_HFLIMIT), + + DECL(AL_REVERB_DENSITY), + DECL(AL_REVERB_DIFFUSION), + DECL(AL_REVERB_GAIN), + DECL(AL_REVERB_GAINHF), + DECL(AL_REVERB_DECAY_TIME), + DECL(AL_REVERB_DECAY_HFRATIO), + DECL(AL_REVERB_REFLECTIONS_GAIN), + DECL(AL_REVERB_REFLECTIONS_DELAY), + DECL(AL_REVERB_LATE_REVERB_GAIN), + DECL(AL_REVERB_LATE_REVERB_DELAY), + DECL(AL_REVERB_AIR_ABSORPTION_GAINHF), + DECL(AL_REVERB_ROOM_ROLLOFF_FACTOR), + DECL(AL_REVERB_DECAY_HFLIMIT), + + DECL(AL_CHORUS_WAVEFORM), + DECL(AL_CHORUS_PHASE), + DECL(AL_CHORUS_RATE), + DECL(AL_CHORUS_DEPTH), + DECL(AL_CHORUS_FEEDBACK), + DECL(AL_CHORUS_DELAY), + + DECL(AL_DISTORTION_EDGE), + DECL(AL_DISTORTION_GAIN), + DECL(AL_DISTORTION_LOWPASS_CUTOFF), + DECL(AL_DISTORTION_EQCENTER), + DECL(AL_DISTORTION_EQBANDWIDTH), + + DECL(AL_ECHO_DELAY), + DECL(AL_ECHO_LRDELAY), + DECL(AL_ECHO_DAMPING), + DECL(AL_ECHO_FEEDBACK), + DECL(AL_ECHO_SPREAD), + + DECL(AL_FLANGER_WAVEFORM), + DECL(AL_FLANGER_PHASE), + DECL(AL_FLANGER_RATE), + DECL(AL_FLANGER_DEPTH), + DECL(AL_FLANGER_FEEDBACK), + DECL(AL_FLANGER_DELAY), + + DECL(AL_FREQUENCY_SHIFTER_FREQUENCY), + DECL(AL_FREQUENCY_SHIFTER_LEFT_DIRECTION), + DECL(AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION), + + DECL(AL_RING_MODULATOR_FREQUENCY), + DECL(AL_RING_MODULATOR_HIGHPASS_CUTOFF), + DECL(AL_RING_MODULATOR_WAVEFORM), + + DECL(AL_PITCH_SHIFTER_COARSE_TUNE), + DECL(AL_PITCH_SHIFTER_FINE_TUNE), + + DECL(AL_COMPRESSOR_ONOFF), + + DECL(AL_EQUALIZER_LOW_GAIN), + DECL(AL_EQUALIZER_LOW_CUTOFF), + DECL(AL_EQUALIZER_MID1_GAIN), + DECL(AL_EQUALIZER_MID1_CENTER), + DECL(AL_EQUALIZER_MID1_WIDTH), + DECL(AL_EQUALIZER_MID2_GAIN), + DECL(AL_EQUALIZER_MID2_CENTER), + DECL(AL_EQUALIZER_MID2_WIDTH), + DECL(AL_EQUALIZER_HIGH_GAIN), + DECL(AL_EQUALIZER_HIGH_CUTOFF), + + DECL(AL_DEDICATED_GAIN), + + DECL(AL_AUTOWAH_ATTACK_TIME), + DECL(AL_AUTOWAH_RELEASE_TIME), + DECL(AL_AUTOWAH_RESONANCE), + DECL(AL_AUTOWAH_PEAK_GAIN), + + DECL(AL_VOCAL_MORPHER_PHONEMEA), + DECL(AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING), + DECL(AL_VOCAL_MORPHER_PHONEMEB), + DECL(AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING), + DECL(AL_VOCAL_MORPHER_WAVEFORM), + DECL(AL_VOCAL_MORPHER_RATE), + + DECL(AL_NUM_RESAMPLERS_SOFT), + DECL(AL_DEFAULT_RESAMPLER_SOFT), + DECL(AL_SOURCE_RESAMPLER_SOFT), + DECL(AL_RESAMPLER_NAME_SOFT), + + DECL(AL_SOURCE_SPATIALIZE_SOFT), + DECL(AL_AUTO_SOFT), + + DECL(AL_MAP_READ_BIT_SOFT), + DECL(AL_MAP_WRITE_BIT_SOFT), + DECL(AL_MAP_PERSISTENT_BIT_SOFT), + DECL(AL_PRESERVE_DATA_BIT_SOFT), + + DECL(AL_EVENT_CALLBACK_FUNCTION_SOFT), + DECL(AL_EVENT_CALLBACK_USER_PARAM_SOFT), + DECL(AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT), + DECL(AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT), + DECL(AL_EVENT_TYPE_ERROR_SOFT), + DECL(AL_EVENT_TYPE_PERFORMANCE_SOFT), + DECL(AL_EVENT_TYPE_DEPRECATED_SOFT), + + DECL(AL_DROP_UNMATCHED_SOFT), + DECL(AL_REMIX_UNMATCHED_SOFT), + + DECL(AL_AMBISONIC_LAYOUT_SOFT), + DECL(AL_AMBISONIC_SCALING_SOFT), + DECL(AL_FUMA_SOFT), + DECL(AL_ACN_SOFT), + DECL(AL_SN3D_SOFT), + DECL(AL_N3D_SOFT), +}; +#undef DECL + +constexpr ALCchar alcNoError[] = "No Error"; +constexpr ALCchar alcErrInvalidDevice[] = "Invalid Device"; +constexpr ALCchar alcErrInvalidContext[] = "Invalid Context"; +constexpr ALCchar alcErrInvalidEnum[] = "Invalid Enum"; +constexpr ALCchar alcErrInvalidValue[] = "Invalid Value"; +constexpr ALCchar alcErrOutOfMemory[] = "Out of Memory"; + + +/************************************************ + * Global variables + ************************************************/ + +/* Enumerated device names */ +constexpr ALCchar alcDefaultName[] = "OpenAL Soft\0"; + +std::string alcAllDevicesList; +std::string alcCaptureDeviceList; + +/* Default is always the first in the list */ +al::string alcDefaultAllDevicesSpecifier; +al::string alcCaptureDefaultDeviceSpecifier; + +/* Default context extensions */ +constexpr ALchar alExtList[] = + "AL_EXT_ALAW " + "AL_EXT_BFORMAT " + "AL_EXT_DOUBLE " + "AL_EXT_EXPONENT_DISTANCE " + "AL_EXT_FLOAT32 " + "AL_EXT_IMA4 " + "AL_EXT_LINEAR_DISTANCE " + "AL_EXT_MCFORMATS " + "AL_EXT_MULAW " + "AL_EXT_MULAW_BFORMAT " + "AL_EXT_MULAW_MCFORMATS " + "AL_EXT_OFFSET " + "AL_EXT_source_distance_model " + "AL_EXT_SOURCE_RADIUS " + "AL_EXT_STEREO_ANGLES " + "AL_LOKI_quadriphonic " + "AL_SOFT_bformat_ex " + "AL_SOFT_block_alignment " + "AL_SOFT_deferred_updates " + "AL_SOFT_direct_channels " + "AL_SOFT_direct_channels_remix " + "AL_SOFTX_effect_chain " + "AL_SOFTX_events " + "AL_SOFTX_filter_gain_ex " + "AL_SOFT_gain_clamp_ex " + "AL_SOFT_loop_points " + "AL_SOFTX_map_buffer " + "AL_SOFT_MSADPCM " + "AL_SOFT_source_latency " + "AL_SOFT_source_length " + "AL_SOFT_source_resampler " + "AL_SOFT_source_spatialize"; + +std::atomic LastNullDeviceError{ALC_NO_ERROR}; + +/* Thread-local current context */ +class ThreadCtx { + ALCcontext *ctx{nullptr}; + +public: + ~ThreadCtx() + { + if(ctx) + { + const bool result{ctx->releaseIfNoDelete()}; + ERR("Context %p current for thread being destroyed%s!\n", + decltype(std::declval()){ctx}, result ? "" : ", leak detected"); + } + } + + ALCcontext *get() const noexcept { return ctx; } + void set(ALCcontext *ctx_) noexcept { ctx = ctx_; } +}; +thread_local ThreadCtx LocalContext; +/* Process-wide current context */ +std::atomic GlobalContext{nullptr}; + +/* Flag to trap ALC device errors */ +bool TrapALCError{false}; + +/* One-time configuration init control */ +std::once_flag alc_config_once{}; + +/* Default effect that applies to sources that don't have an effect on send 0 */ +ALeffect DefaultEffect; + +/* Flag to specify if alcSuspendContext/alcProcessContext should defer/process + * updates. + */ +bool SuspendDefers{true}; + +/* Initial seed for dithering. */ +constexpr ALuint DitherRNGSeed{22222u}; + + +/************************************************ + * ALC information + ************************************************/ +constexpr ALCchar alcNoDeviceExtList[] = + "ALC_ENUMERATE_ALL_EXT " + "ALC_ENUMERATION_EXT " + "ALC_EXT_CAPTURE " + "ALC_EXT_thread_local_context " + "ALC_SOFT_loopback"; +constexpr ALCchar alcExtensionList[] = + "ALC_ENUMERATE_ALL_EXT " + "ALC_ENUMERATION_EXT " + "ALC_EXT_CAPTURE " + "ALC_EXT_DEDICATED " + "ALC_EXT_disconnect " + "ALC_EXT_EFX " + "ALC_EXT_thread_local_context " + "ALC_SOFT_device_clock " + "ALC_SOFT_HRTF " + "ALC_SOFT_loopback " + "ALC_SOFT_output_limiter " + "ALC_SOFT_pause_device"; +constexpr ALCint alcMajorVersion = 1; +constexpr ALCint alcMinorVersion = 1; + +constexpr ALCint alcEFXMajorVersion = 1; +constexpr ALCint alcEFXMinorVersion = 0; + + +/* To avoid extraneous allocations, a 0-sized FlexArray is defined + * globally as a sharable object. MSVC warns that a zero-sized array will have + * zero objects here, so silence that. + */ +DIAGNOSTIC_PUSH +msc_pragma(warning(disable : 4815)) +al::FlexArray EmptyContextArray{0u}; +DIAGNOSTIC_POP + + +using DeviceRef = al::intrusive_ptr; + + +/************************************************ + * Device lists + ************************************************/ +al::vector DeviceList; +al::vector ContextList; + +std::recursive_mutex ListLock; + + +void alc_initconfig(void) +{ + if(auto loglevel = al::getenv("ALSOFT_LOGLEVEL")) + { + long lvl = strtol(loglevel->c_str(), nullptr, 0); + if(lvl >= NoLog && lvl <= LogRef) + gLogLevel = static_cast(lvl); + } + + if(auto logfile = al::getenv("ALSOFT_LOGFILE")) + { +#ifdef _WIN32 + std::wstring wname{utf8_to_wstr(logfile->c_str())}; + FILE *logf{_wfopen(wname.c_str(), L"wt")}; +#else + FILE *logf{fopen(logfile->c_str(), "wt")}; +#endif + if(logf) gLogFile = logf; + else ERR("Failed to open log file '%s'\n", logfile->c_str()); + } + + TRACE("Initializing library v%s-%s %s\n", ALSOFT_VERSION, ALSOFT_GIT_COMMIT_HASH, + ALSOFT_GIT_BRANCH); + { + al::string names; + if(std::begin(BackendList) == BackendListEnd) + names += "(none)"; + else + { + const al::span infos{std::begin(BackendList), BackendListEnd}; + names += infos[0].name; + for(const auto &backend : infos.subspan(1)) + { + names += ", "; + names += backend.name; + } + } + TRACE("Supported backends: %s\n", names.c_str()); + } + ReadALConfig(); + + if(auto suspendmode = al::getenv("__ALSOFT_SUSPEND_CONTEXT")) + { + if(al::strcasecmp(suspendmode->c_str(), "ignore") == 0) + { + SuspendDefers = false; + TRACE("Selected context suspend behavior, \"ignore\"\n"); + } + else + ERR("Unhandled context suspend behavior setting: \"%s\"\n", suspendmode->c_str()); + } + + int capfilter{0}; +#if defined(HAVE_SSE4_1) + capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3 | CPU_CAP_SSE4_1; +#elif defined(HAVE_SSE3) + capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3; +#elif defined(HAVE_SSE2) + capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2; +#elif defined(HAVE_SSE) + capfilter |= CPU_CAP_SSE; +#endif +#ifdef HAVE_NEON + capfilter |= CPU_CAP_NEON; +#endif + if(auto cpuopt = ConfigValueStr(nullptr, nullptr, "disable-cpu-exts")) + { + const char *str{cpuopt->c_str()}; + if(al::strcasecmp(str, "all") == 0) + capfilter = 0; + else + { + const char *next = str; + do { + str = next; + while(isspace(str[0])) + str++; + next = strchr(str, ','); + + if(!str[0] || str[0] == ',') + continue; + + size_t len{next ? static_cast(next-str) : strlen(str)}; + while(len > 0 && isspace(str[len-1])) + len--; + if(len == 3 && al::strncasecmp(str, "sse", len) == 0) + capfilter &= ~CPU_CAP_SSE; + else if(len == 4 && al::strncasecmp(str, "sse2", len) == 0) + capfilter &= ~CPU_CAP_SSE2; + else if(len == 4 && al::strncasecmp(str, "sse3", len) == 0) + capfilter &= ~CPU_CAP_SSE3; + else if(len == 6 && al::strncasecmp(str, "sse4.1", len) == 0) + capfilter &= ~CPU_CAP_SSE4_1; + else if(len == 4 && al::strncasecmp(str, "neon", len) == 0) + capfilter &= ~CPU_CAP_NEON; + else + WARN("Invalid CPU extension \"%s\"\n", str); + } while(next++); + } + } + FillCPUCaps(capfilter); + +#ifdef _WIN32 +#define DEF_MIXER_PRIO 1 +#else +#define DEF_MIXER_PRIO 0 +#endif + RTPrioLevel = ConfigValueInt(nullptr, nullptr, "rt-prio").value_or(DEF_MIXER_PRIO); +#undef DEF_MIXER_PRIO + + aluInit(); + aluInitMixer(); + + auto traperr = al::getenv("ALSOFT_TRAP_ERROR"); + if(traperr && (al::strcasecmp(traperr->c_str(), "true") == 0 + || std::strtol(traperr->c_str(), nullptr, 0) == 1)) + { + TrapALError = true; + TrapALCError = true; + } + else + { + traperr = al::getenv("ALSOFT_TRAP_AL_ERROR"); + if(traperr) + TrapALError = al::strcasecmp(traperr->c_str(), "true") == 0 + || strtol(traperr->c_str(), nullptr, 0) == 1; + else + TrapALError = !!GetConfigValueBool(nullptr, nullptr, "trap-al-error", false); + + traperr = al::getenv("ALSOFT_TRAP_ALC_ERROR"); + if(traperr) + TrapALCError = al::strcasecmp(traperr->c_str(), "true") == 0 + || strtol(traperr->c_str(), nullptr, 0) == 1; + else + TrapALCError = !!GetConfigValueBool(nullptr, nullptr, "trap-alc-error", false); + } + + if(auto boostopt = ConfigValueFloat(nullptr, "reverb", "boost")) + { + const float valf{std::isfinite(*boostopt) ? clampf(*boostopt, -24.0f, 24.0f) : 0.0f}; + ReverbBoost *= std::pow(10.0f, valf / 20.0f); + } + + auto devopt = al::getenv("ALSOFT_DRIVERS"); + if(devopt || (devopt=ConfigValueStr(nullptr, nullptr, "drivers"))) + { + auto backendlist_cur = std::begin(BackendList); + + bool endlist{true}; + const char *next{devopt->c_str()}; + do { + const char *devs{next}; + while(isspace(devs[0])) + devs++; + next = strchr(devs, ','); + + const bool delitem{devs[0] == '-'}; + if(devs[0] == '-') devs++; + + if(!devs[0] || devs[0] == ',') + { + endlist = false; + continue; + } + endlist = true; + + size_t len{next ? (static_cast(next-devs)) : strlen(devs)}; + while(len > 0 && isspace(devs[len-1])) --len; +#ifdef HAVE_WASAPI + /* HACK: For backwards compatibility, convert backend references of + * mmdevapi to wasapi. This should eventually be removed. + */ + if(len == 8 && strncmp(devs, "mmdevapi", len) == 0) + { + devs = "wasapi"; + len = 6; + } +#endif + + auto find_backend = [devs,len](const BackendInfo &backend) -> bool + { return len == strlen(backend.name) && strncmp(backend.name, devs, len) == 0; }; + auto this_backend = std::find_if(std::begin(BackendList), BackendListEnd, + find_backend); + + if(this_backend == BackendListEnd) + continue; + + if(delitem) + BackendListEnd = std::move(this_backend+1, BackendListEnd, this_backend); + else + backendlist_cur = std::rotate(backendlist_cur, this_backend, this_backend+1); + } while(next++); + + if(endlist) + BackendListEnd = backendlist_cur; + } + + auto init_backend = [](BackendInfo &backend) -> bool + { + if(PlaybackFactory && CaptureFactory) + return true; + + BackendFactory &factory = backend.getFactory(); + if(!factory.init()) + { + WARN("Failed to initialize backend \"%s\"\n", backend.name); + return true; + } + + TRACE("Initialized backend \"%s\"\n", backend.name); + if(!PlaybackFactory && factory.querySupport(BackendType::Playback)) + { + PlaybackFactory = &factory; + TRACE("Added \"%s\" for playback\n", backend.name); + } + if(!CaptureFactory && factory.querySupport(BackendType::Capture)) + { + CaptureFactory = &factory; + TRACE("Added \"%s\" for capture\n", backend.name); + } + return false; + }; + BackendListEnd = std::remove_if(std::begin(BackendList), BackendListEnd, init_backend); + + LoopbackBackendFactory::getFactory().init(); + + if(!PlaybackFactory) + WARN("No playback backend available!\n"); + if(!CaptureFactory) + WARN("No capture backend available!\n"); + + if(auto exclopt = ConfigValueStr(nullptr, nullptr, "excludefx")) + { + const char *next{exclopt->c_str()}; + do { + const char *str{next}; + next = strchr(str, ','); + + if(!str[0] || next == str) + continue; + + size_t len{next ? static_cast(next-str) : strlen(str)}; + for(const EffectList &effectitem : gEffectList) + { + if(len == strlen(effectitem.name) && + strncmp(effectitem.name, str, len) == 0) + DisabledEffects[effectitem.type] = AL_TRUE; + } + } while(next++); + } + + InitEffect(&DefaultEffect); + auto defrevopt = al::getenv("ALSOFT_DEFAULT_REVERB"); + if(defrevopt || (defrevopt=ConfigValueStr(nullptr, nullptr, "default-reverb"))) + LoadReverbPreset(defrevopt->c_str(), &DefaultEffect); +} +#define DO_INITCONFIG() std::call_once(alc_config_once, [](){alc_initconfig();}) + + +/************************************************ + * Device enumeration + ************************************************/ +void ProbeAllDevicesList() +{ + DO_INITCONFIG(); + + std::lock_guard _{ListLock}; + alcAllDevicesList.clear(); + if(PlaybackFactory) + PlaybackFactory->probe(DevProbe::Playback, &alcAllDevicesList); +} +void ProbeCaptureDeviceList() +{ + DO_INITCONFIG(); + + std::lock_guard _{ListLock}; + alcCaptureDeviceList.clear(); + if(CaptureFactory) + CaptureFactory->probe(DevProbe::Capture, &alcCaptureDeviceList); +} + +} // namespace + +/* Mixing thread piority level */ +ALint RTPrioLevel; + +FILE *gLogFile{stderr}; +#ifdef _DEBUG +LogLevel gLogLevel{LogWarning}; +#else +LogLevel gLogLevel{LogError}; +#endif + +/************************************************ + * Library initialization + ************************************************/ +#if defined(_WIN32) && !defined(AL_LIBTYPE_STATIC) +BOOL APIENTRY DllMain(HINSTANCE module, DWORD reason, LPVOID /*reserved*/) +{ + switch(reason) + { + case DLL_PROCESS_ATTACH: + /* Pin the DLL so we won't get unloaded until the process terminates */ + GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + reinterpret_cast(module), &module); + break; + } + return TRUE; +} +#endif + +/************************************************ + * Device format information + ************************************************/ +const ALCchar *DevFmtTypeString(DevFmtType type) noexcept +{ + switch(type) + { + case DevFmtByte: return "Signed Byte"; + case DevFmtUByte: return "Unsigned Byte"; + case DevFmtShort: return "Signed Short"; + case DevFmtUShort: return "Unsigned Short"; + case DevFmtInt: return "Signed Int"; + case DevFmtUInt: return "Unsigned Int"; + case DevFmtFloat: return "Float"; + } + return "(unknown type)"; +} +const ALCchar *DevFmtChannelsString(DevFmtChannels chans) noexcept +{ + switch(chans) + { + case DevFmtMono: return "Mono"; + case DevFmtStereo: return "Stereo"; + case DevFmtQuad: return "Quadraphonic"; + case DevFmtX51: return "5.1 Surround"; + case DevFmtX51Rear: return "5.1 Surround (Rear)"; + case DevFmtX61: return "6.1 Surround"; + case DevFmtX71: return "7.1 Surround"; + case DevFmtAmbi3D: return "Ambisonic 3D"; + } + return "(unknown channels)"; +} + +ALuint BytesFromDevFmt(DevFmtType type) noexcept +{ + switch(type) + { + case DevFmtByte: return sizeof(ALbyte); + case DevFmtUByte: return sizeof(ALubyte); + case DevFmtShort: return sizeof(ALshort); + case DevFmtUShort: return sizeof(ALushort); + case DevFmtInt: return sizeof(ALint); + case DevFmtUInt: return sizeof(ALuint); + case DevFmtFloat: return sizeof(ALfloat); + } + return 0; +} +ALuint ChannelsFromDevFmt(DevFmtChannels chans, ALuint ambiorder) noexcept +{ + switch(chans) + { + case DevFmtMono: return 1; + case DevFmtStereo: return 2; + case DevFmtQuad: return 4; + case DevFmtX51: return 6; + case DevFmtX51Rear: return 6; + case DevFmtX61: return 7; + case DevFmtX71: return 8; + case DevFmtAmbi3D: return (ambiorder+1) * (ambiorder+1); + } + return 0; +} + +namespace { + +struct DevFmtPair { DevFmtChannels chans; DevFmtType type; }; +al::optional DecomposeDevFormat(ALenum format) +{ + static const struct { + ALenum format; + DevFmtChannels channels; + DevFmtType type; + } list[] = { + { AL_FORMAT_MONO8, DevFmtMono, DevFmtUByte }, + { AL_FORMAT_MONO16, DevFmtMono, DevFmtShort }, + { AL_FORMAT_MONO_FLOAT32, DevFmtMono, DevFmtFloat }, + + { AL_FORMAT_STEREO8, DevFmtStereo, DevFmtUByte }, + { AL_FORMAT_STEREO16, DevFmtStereo, DevFmtShort }, + { AL_FORMAT_STEREO_FLOAT32, DevFmtStereo, DevFmtFloat }, + + { AL_FORMAT_QUAD8, DevFmtQuad, DevFmtUByte }, + { AL_FORMAT_QUAD16, DevFmtQuad, DevFmtShort }, + { AL_FORMAT_QUAD32, DevFmtQuad, DevFmtFloat }, + + { AL_FORMAT_51CHN8, DevFmtX51, DevFmtUByte }, + { AL_FORMAT_51CHN16, DevFmtX51, DevFmtShort }, + { AL_FORMAT_51CHN32, DevFmtX51, DevFmtFloat }, + + { AL_FORMAT_61CHN8, DevFmtX61, DevFmtUByte }, + { AL_FORMAT_61CHN16, DevFmtX61, DevFmtShort }, + { AL_FORMAT_61CHN32, DevFmtX61, DevFmtFloat }, + + { AL_FORMAT_71CHN8, DevFmtX71, DevFmtUByte }, + { AL_FORMAT_71CHN16, DevFmtX71, DevFmtShort }, + { AL_FORMAT_71CHN32, DevFmtX71, DevFmtFloat }, + }; + + for(const auto &item : list) + { + if(item.format == format) + return al::make_optional(DevFmtPair{item.channels, item.type}); + } + + return al::nullopt; +} + +bool IsValidALCType(ALCenum type) +{ + switch(type) + { + case ALC_BYTE_SOFT: + case ALC_UNSIGNED_BYTE_SOFT: + case ALC_SHORT_SOFT: + case ALC_UNSIGNED_SHORT_SOFT: + case ALC_INT_SOFT: + case ALC_UNSIGNED_INT_SOFT: + case ALC_FLOAT_SOFT: + return true; + } + return false; +} + +bool IsValidALCChannels(ALCenum channels) +{ + switch(channels) + { + case ALC_MONO_SOFT: + case ALC_STEREO_SOFT: + case ALC_QUAD_SOFT: + case ALC_5POINT1_SOFT: + case ALC_6POINT1_SOFT: + case ALC_7POINT1_SOFT: + case ALC_BFORMAT3D_SOFT: + return true; + } + return false; +} + +bool IsValidAmbiLayout(ALCenum layout) +{ + switch(layout) + { + case ALC_ACN_SOFT: + case ALC_FUMA_SOFT: + return true; + } + return false; +} + +bool IsValidAmbiScaling(ALCenum scaling) +{ + switch(scaling) + { + case ALC_N3D_SOFT: + case ALC_SN3D_SOFT: + case ALC_FUMA_SOFT: + return true; + } + return false; +} + + +/* Downmixing channel arrays, to map the given format's missing channels to + * existing ones. Based on Wine's DSound downmix values, which are based on + * PulseAudio's. + */ +const std::array MonoDownmix{{ + { FrontLeft, {{{FrontCenter, 0.5f}, {LFE, 0.0f}}} }, + { FrontRight, {{{FrontCenter, 0.5f}, {LFE, 0.0f}}} }, + { SideLeft, {{{FrontCenter, 0.5f/9.0f}, {LFE, 0.0f}}} }, + { SideRight, {{{FrontCenter, 0.5f/9.0f}, {LFE, 0.0f}}} }, + { BackLeft, {{{FrontCenter, 0.5f/9.0f}, {LFE, 0.0f}}} }, + { BackRight, {{{FrontCenter, 0.5f/9.0f}, {LFE, 0.0f}}} }, + { BackCenter, {{{FrontCenter, 1.0f/9.0f}, {LFE, 0.0f}}} }, +}}; +const std::array StereoDownmix{{ + { FrontCenter, {{{FrontLeft, 0.5f}, {FrontRight, 0.5f}}} }, + { SideLeft, {{{FrontLeft, 1.0f/9.0f}, {FrontRight, 0.0f}}} }, + { SideRight, {{{FrontLeft, 0.0f}, {FrontRight, 1.0f/9.0f}}} }, + { BackLeft, {{{FrontLeft, 1.0f/9.0f}, {FrontRight, 0.0f}}} }, + { BackRight, {{{FrontLeft, 0.0f}, {FrontRight, 1.0f/9.0f}}} }, + { BackCenter, {{{FrontLeft, 0.5f/9.0f}, {FrontRight, 0.5f/9.0f}}} }, +}}; +const std::array QuadDownmix{{ + { FrontCenter, {{{FrontLeft, 0.5f}, {FrontRight, 0.5f}}} }, + { SideLeft, {{{FrontLeft, 0.5f}, {BackLeft, 0.5f}}} }, + { SideRight, {{{FrontRight, 0.5f}, {BackRight, 0.5f}}} }, + { BackCenter, {{{BackLeft, 0.5f}, {BackRight, 0.5f}}} }, +}}; +const std::array X51Downmix{{ + { BackLeft, {{{SideLeft, 1.0f}, {SideRight, 0.0f}}} }, + { BackRight, {{{SideLeft, 0.0f}, {SideRight, 1.0f}}} }, + { BackCenter, {{{SideLeft, 0.5f}, {SideRight, 0.5f}}} }, +}}; +const std::array X51RearDownmix{{ + { SideLeft, {{{BackLeft, 1.0f}, {BackRight, 0.0f}}} }, + { SideRight, {{{BackLeft, 0.0f}, {BackRight, 1.0f}}} }, + { BackCenter, {{{BackLeft, 0.5f}, {BackRight, 0.5f}}} }, +}}; +const std::array X61Downmix{{ + { BackLeft, {{{BackCenter, 0.5f}, {SideLeft, 0.5f}}} }, + { BackRight, {{{BackCenter, 0.5f}, {SideRight, 0.5f}}} }, +}}; +const std::array X71Downmix{{ + { BackCenter, {{{BackLeft, 0.5f}, {BackRight, 0.5f}}} }, +}}; + +} // namespace + +/************************************************ + * Miscellaneous ALC helpers + ************************************************/ + +/* SetDefaultWFXChannelOrder + * + * Sets the default channel order used by WaveFormatEx. + */ +void SetDefaultWFXChannelOrder(ALCdevice *device) +{ + device->RealOut.ChannelIndex.fill(INVALID_CHANNEL_INDEX); + + switch(device->FmtChans) + { + case DevFmtMono: + device->RealOut.ChannelIndex[FrontCenter] = 0; + break; + case DevFmtStereo: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + break; + case DevFmtQuad: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[BackLeft] = 2; + device->RealOut.ChannelIndex[BackRight] = 3; + break; + case DevFmtX51: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[FrontCenter] = 2; + device->RealOut.ChannelIndex[LFE] = 3; + device->RealOut.ChannelIndex[SideLeft] = 4; + device->RealOut.ChannelIndex[SideRight] = 5; + break; + case DevFmtX51Rear: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[FrontCenter] = 2; + device->RealOut.ChannelIndex[LFE] = 3; + device->RealOut.ChannelIndex[BackLeft] = 4; + device->RealOut.ChannelIndex[BackRight] = 5; + break; + case DevFmtX61: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[FrontCenter] = 2; + device->RealOut.ChannelIndex[LFE] = 3; + device->RealOut.ChannelIndex[BackCenter] = 4; + device->RealOut.ChannelIndex[SideLeft] = 5; + device->RealOut.ChannelIndex[SideRight] = 6; + break; + case DevFmtX71: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[FrontCenter] = 2; + device->RealOut.ChannelIndex[LFE] = 3; + device->RealOut.ChannelIndex[BackLeft] = 4; + device->RealOut.ChannelIndex[BackRight] = 5; + device->RealOut.ChannelIndex[SideLeft] = 6; + device->RealOut.ChannelIndex[SideRight] = 7; + break; + case DevFmtAmbi3D: + device->RealOut.ChannelIndex[Aux0] = 0; + if(device->mAmbiOrder > 0) + { + device->RealOut.ChannelIndex[Aux1] = 1; + device->RealOut.ChannelIndex[Aux2] = 2; + device->RealOut.ChannelIndex[Aux3] = 3; + } + if(device->mAmbiOrder > 1) + { + device->RealOut.ChannelIndex[Aux4] = 4; + device->RealOut.ChannelIndex[Aux5] = 5; + device->RealOut.ChannelIndex[Aux6] = 6; + device->RealOut.ChannelIndex[Aux7] = 7; + device->RealOut.ChannelIndex[Aux8] = 8; + } + if(device->mAmbiOrder > 2) + { + device->RealOut.ChannelIndex[Aux9] = 9; + device->RealOut.ChannelIndex[Aux10] = 10; + device->RealOut.ChannelIndex[Aux11] = 11; + device->RealOut.ChannelIndex[Aux12] = 12; + device->RealOut.ChannelIndex[Aux13] = 13; + device->RealOut.ChannelIndex[Aux14] = 14; + device->RealOut.ChannelIndex[Aux15] = 15; + } + break; + } +} + +/* SetDefaultChannelOrder + * + * Sets the default channel order used by most non-WaveFormatEx-based APIs. + */ +void SetDefaultChannelOrder(ALCdevice *device) +{ + device->RealOut.ChannelIndex.fill(INVALID_CHANNEL_INDEX); + + switch(device->FmtChans) + { + case DevFmtX51Rear: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[BackLeft] = 2; + device->RealOut.ChannelIndex[BackRight] = 3; + device->RealOut.ChannelIndex[FrontCenter] = 4; + device->RealOut.ChannelIndex[LFE] = 5; + return; + case DevFmtX71: + device->RealOut.ChannelIndex[FrontLeft] = 0; + device->RealOut.ChannelIndex[FrontRight] = 1; + device->RealOut.ChannelIndex[BackLeft] = 2; + device->RealOut.ChannelIndex[BackRight] = 3; + device->RealOut.ChannelIndex[FrontCenter] = 4; + device->RealOut.ChannelIndex[LFE] = 5; + device->RealOut.ChannelIndex[SideLeft] = 6; + device->RealOut.ChannelIndex[SideRight] = 7; + return; + + /* Same as WFX order */ + case DevFmtMono: + case DevFmtStereo: + case DevFmtQuad: + case DevFmtX51: + case DevFmtX61: + case DevFmtAmbi3D: + SetDefaultWFXChannelOrder(device); + break; + } +} + + +void ALCcontext::processUpdates() +{ + std::lock_guard _{mPropLock}; + if(mDeferUpdates.exchange(false)) + { + /* Tell the mixer to stop applying updates, then wait for any active + * updating to finish, before providing updates. + */ + mHoldUpdates.store(true, std::memory_order_release); + while((mUpdateCount.load(std::memory_order_acquire)&1) != 0) + std::this_thread::yield(); + + if(!mPropsClean.test_and_set(std::memory_order_acq_rel)) + UpdateContextProps(this); + if(!mListener.PropsClean.test_and_set(std::memory_order_acq_rel)) + UpdateListenerProps(this); + UpdateAllEffectSlotProps(this); + UpdateAllSourceProps(this); + + /* Now with all updates declared, let the mixer continue applying them + * so they all happen at once. + */ + mHoldUpdates.store(false, std::memory_order_release); + } +} + + +/* alcSetError + * + * Stores the latest ALC device error + */ +static void alcSetError(ALCdevice *device, ALCenum errorCode) +{ + WARN("Error generated on device %p, code 0x%04x\n", decltype(std::declval()){device}, + errorCode); + if(TrapALCError) + { +#ifdef _WIN32 + /* DebugBreak() will cause an exception if there is no debugger */ + if(IsDebuggerPresent()) + DebugBreak(); +#elif defined(SIGTRAP) + raise(SIGTRAP); +#endif + } + + if(device) + device->LastError.store(errorCode); + else + LastNullDeviceError.store(errorCode); +} + + +static std::unique_ptr CreateDeviceLimiter(const ALCdevice *device, const float threshold) +{ + return Compressor::Create(device->RealOut.Buffer.size(), static_cast(device->Frequency), + AL_TRUE, AL_TRUE, AL_TRUE, AL_TRUE, AL_TRUE, 0.001f, 0.002f, 0.0f, 0.0f, threshold, + std::numeric_limits::infinity(), 0.0f, 0.020f, 0.200f); +} + +/* UpdateClockBase + * + * Updates the device's base clock time with however many samples have been + * done. This is used so frequency changes on the device don't cause the time + * to jump forward or back. Must not be called while the device is running/ + * mixing. + */ +static inline void UpdateClockBase(ALCdevice *device) +{ + IncrementRef(device->MixCount); + device->ClockBase += nanoseconds{seconds{device->SamplesDone}} / device->Frequency; + device->SamplesDone = 0; + IncrementRef(device->MixCount); +} + +/* UpdateDeviceParams + * + * Updates device parameters according to the attribute list (caller is + * responsible for holding the list lock). + */ +static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) +{ + HrtfRequestMode hrtf_userreq{Hrtf_Default}; + HrtfRequestMode hrtf_appreq{Hrtf_Default}; + ALCenum gainLimiter{device->LimiterState}; + const ALCuint old_sends{device->NumAuxSends}; + ALCuint new_sends{device->NumAuxSends}; + DevFmtChannels oldChans; + DevFmtType oldType; + ALboolean update_failed; + ALCsizei hrtf_id{-1}; + ALCuint oldFreq; + + if((!attrList || !attrList[0]) && device->Type == Loopback) + { + WARN("Missing attributes for loopback device\n"); + return ALC_INVALID_VALUE; + } + + // Check for attributes + if(attrList && attrList[0]) + { + ALCenum alayout{AL_NONE}; + ALCenum ascale{AL_NONE}; + ALCenum schans{AL_NONE}; + ALCenum stype{AL_NONE}; + ALCsizei attrIdx{0}; + ALCuint aorder{0}; + ALCuint freq{0u}; + + ALuint numMono{device->NumMonoSources}; + ALuint numStereo{device->NumStereoSources}; + ALuint numSends{old_sends}; + +#define TRACE_ATTR(a, v) TRACE("%s = %d\n", #a, v) + while(attrList[attrIdx]) + { + switch(attrList[attrIdx]) + { + case ALC_FORMAT_CHANNELS_SOFT: + schans = attrList[attrIdx + 1]; + TRACE_ATTR(ALC_FORMAT_CHANNELS_SOFT, schans); + break; + + case ALC_FORMAT_TYPE_SOFT: + stype = attrList[attrIdx + 1]; + TRACE_ATTR(ALC_FORMAT_TYPE_SOFT, stype); + break; + + case ALC_FREQUENCY: + freq = static_cast(attrList[attrIdx + 1]); + TRACE_ATTR(ALC_FREQUENCY, freq); + break; + + case ALC_AMBISONIC_LAYOUT_SOFT: + alayout = attrList[attrIdx + 1]; + TRACE_ATTR(ALC_AMBISONIC_LAYOUT_SOFT, alayout); + break; + + case ALC_AMBISONIC_SCALING_SOFT: + ascale = attrList[attrIdx + 1]; + TRACE_ATTR(ALC_AMBISONIC_SCALING_SOFT, ascale); + break; + + case ALC_AMBISONIC_ORDER_SOFT: + aorder = static_cast(attrList[attrIdx + 1]); + TRACE_ATTR(ALC_AMBISONIC_ORDER_SOFT, aorder); + break; + + case ALC_MONO_SOURCES: + numMono = static_cast(attrList[attrIdx + 1]); + TRACE_ATTR(ALC_MONO_SOURCES, numMono); + if(numMono > INT_MAX) numMono = 0; + break; + + case ALC_STEREO_SOURCES: + numStereo = static_cast(attrList[attrIdx + 1]); + TRACE_ATTR(ALC_STEREO_SOURCES, numStereo); + if(numStereo > INT_MAX) numStereo = 0; + break; + + case ALC_MAX_AUXILIARY_SENDS: + numSends = static_cast(attrList[attrIdx + 1]); + TRACE_ATTR(ALC_MAX_AUXILIARY_SENDS, numSends); + if(numSends > INT_MAX) numSends = 0; + else numSends = minu(numSends, MAX_SENDS); + break; + + case ALC_HRTF_SOFT: + TRACE_ATTR(ALC_HRTF_SOFT, attrList[attrIdx + 1]); + if(attrList[attrIdx + 1] == ALC_FALSE) + hrtf_appreq = Hrtf_Disable; + else if(attrList[attrIdx + 1] == ALC_TRUE) + hrtf_appreq = Hrtf_Enable; + else + hrtf_appreq = Hrtf_Default; + break; + + case ALC_HRTF_ID_SOFT: + hrtf_id = attrList[attrIdx + 1]; + TRACE_ATTR(ALC_HRTF_ID_SOFT, hrtf_id); + break; + + case ALC_OUTPUT_LIMITER_SOFT: + gainLimiter = attrList[attrIdx + 1]; + TRACE_ATTR(ALC_OUTPUT_LIMITER_SOFT, gainLimiter); + break; + + default: + TRACE("0x%04X = %d (0x%x)\n", attrList[attrIdx], + attrList[attrIdx + 1], attrList[attrIdx + 1]); + break; + } + + attrIdx += 2; + } +#undef TRACE_ATTR + + const bool loopback{device->Type == Loopback}; + if(loopback) + { + if(!schans || !stype || !freq) + { + WARN("Missing format for loopback device\n"); + return ALC_INVALID_VALUE; + } + if(!IsValidALCChannels(schans) || !IsValidALCType(stype) || freq < MIN_OUTPUT_RATE) + return ALC_INVALID_VALUE; + if(schans == ALC_BFORMAT3D_SOFT) + { + if(!alayout || !ascale || !aorder) + { + WARN("Missing ambisonic info for loopback device\n"); + return ALC_INVALID_VALUE; + } + if(!IsValidAmbiLayout(alayout) || !IsValidAmbiScaling(ascale)) + return ALC_INVALID_VALUE; + if(aorder < 1 || aorder > MAX_AMBI_ORDER) + return ALC_INVALID_VALUE; + if((alayout == ALC_FUMA_SOFT || ascale == ALC_FUMA_SOFT) && aorder > 3) + return ALC_INVALID_VALUE; + } + } + + /* If a context is already running on the device, stop playback so the + * device attributes can be updated. + */ + if(device->Flags.get()) + device->Backend->stop(); + device->Flags.unset(); + + UpdateClockBase(device); + + const char *devname{nullptr}; + if(!loopback) + { + devname = device->DeviceName.c_str(); + + device->BufferSize = DEFAULT_UPDATE_SIZE * DEFAULT_NUM_UPDATES; + device->UpdateSize = DEFAULT_UPDATE_SIZE; + device->Frequency = DEFAULT_OUTPUT_RATE; + + freq = ConfigValueUInt(devname, nullptr, "frequency").value_or(freq); + if(freq < 1) + device->Flags.unset(); + else + { + freq = maxu(freq, MIN_OUTPUT_RATE); + + device->UpdateSize = (device->UpdateSize*freq + device->Frequency/2) / + device->Frequency; + device->BufferSize = (device->BufferSize*freq + device->Frequency/2) / + device->Frequency; + + device->Frequency = freq; + device->Flags.set(); + } + + if(auto persizeopt = ConfigValueUInt(devname, nullptr, "period_size")) + device->UpdateSize = clampu(*persizeopt, 64, 8192); + + if(auto peropt = ConfigValueUInt(devname, nullptr, "periods")) + device->BufferSize = device->UpdateSize * clampu(*peropt, 2, 16); + else + device->BufferSize = maxu(device->BufferSize, device->UpdateSize*2); + } + else + { + device->Frequency = freq; + device->FmtChans = static_cast(schans); + device->FmtType = static_cast(stype); + if(schans == ALC_BFORMAT3D_SOFT) + { + device->mAmbiOrder = aorder; + device->mAmbiLayout = static_cast(alayout); + device->mAmbiScale = static_cast(ascale); + } + } + + if(numMono > INT_MAX-numStereo) + numMono = INT_MAX-numStereo; + numMono += numStereo; + if(auto srcsopt = ConfigValueUInt(devname, nullptr, "sources")) + { + if(*srcsopt <= 0) numMono = 256; + else numMono = *srcsopt; + } + else + numMono = maxu(numMono, 256); + numStereo = minu(numStereo, numMono); + numMono -= numStereo; + device->SourcesMax = numMono + numStereo; + + device->NumMonoSources = numMono; + device->NumStereoSources = numStereo; + + if(auto sendsopt = ConfigValueInt(devname, nullptr, "sends")) + new_sends = minu(numSends, static_cast(clampi(*sendsopt, 0, MAX_SENDS))); + else + new_sends = numSends; + } + + if(device->Flags.get()) + return ALC_NO_ERROR; + + device->AvgSpeakerDist = 0.0f; + device->Uhj_Encoder = nullptr; + device->AmbiDecoder = nullptr; + device->Bs2b = nullptr; + device->PostProcess = nullptr; + + device->Stablizer = nullptr; + device->Limiter = nullptr; + device->ChannelDelay.clear(); + + std::fill(std::begin(device->HrtfAccumData), std::end(device->HrtfAccumData), float2{}); + + device->Dry.AmbiMap.fill(BFChannelConfig{}); + device->Dry.Buffer = {}; + std::fill(std::begin(device->NumChannelsPerOrder), std::end(device->NumChannelsPerOrder), 0u); + device->RealOut.RemixMap = {}; + device->RealOut.ChannelIndex.fill(INVALID_CHANNEL_INDEX); + device->RealOut.Buffer = {}; + device->MixBuffer.clear(); + device->MixBuffer.shrink_to_fit(); + + UpdateClockBase(device); + device->FixedLatency = nanoseconds::zero(); + + device->DitherDepth = 0.0f; + device->DitherSeed = DitherRNGSeed; + + /************************************************************************* + * Update device format request if HRTF is requested + */ + device->HrtfStatus = ALC_HRTF_DISABLED_SOFT; + if(device->Type != Loopback) + { + if(auto hrtfopt = ConfigValueStr(device->DeviceName.c_str(), nullptr, "hrtf")) + { + const char *hrtf{hrtfopt->c_str()}; + if(al::strcasecmp(hrtf, "true") == 0) + hrtf_userreq = Hrtf_Enable; + else if(al::strcasecmp(hrtf, "false") == 0) + hrtf_userreq = Hrtf_Disable; + else if(al::strcasecmp(hrtf, "auto") != 0) + ERR("Unexpected hrtf value: %s\n", hrtf); + } + + if(hrtf_userreq == Hrtf_Enable || (hrtf_userreq != Hrtf_Disable && hrtf_appreq == Hrtf_Enable)) + { + device->FmtChans = DevFmtStereo; + device->Flags.set(); + } + } + + oldFreq = device->Frequency; + oldChans = device->FmtChans; + oldType = device->FmtType; + + TRACE("Pre-reset: %s%s, %s%s, %s%uhz, %u / %u buffer\n", + device->Flags.get()?"*":"", DevFmtChannelsString(device->FmtChans), + device->Flags.get()?"*":"", DevFmtTypeString(device->FmtType), + device->Flags.get()?"*":"", device->Frequency, + device->UpdateSize, device->BufferSize); + + try { + if(device->Backend->reset() == false) + return ALC_INVALID_DEVICE; + } + catch(std::exception &e) { + ERR("Device reset failed: %s\n", e.what()); + return ALC_INVALID_DEVICE; + } + + if(device->FmtChans != oldChans && device->Flags.get()) + { + ERR("Failed to set %s, got %s instead\n", DevFmtChannelsString(oldChans), + DevFmtChannelsString(device->FmtChans)); + device->Flags.unset(); + } + if(device->FmtType != oldType && device->Flags.get()) + { + ERR("Failed to set %s, got %s instead\n", DevFmtTypeString(oldType), + DevFmtTypeString(device->FmtType)); + device->Flags.unset(); + } + if(device->Frequency != oldFreq && device->Flags.get()) + { + WARN("Failed to set %uhz, got %uhz instead\n", oldFreq, device->Frequency); + device->Flags.unset(); + } + + TRACE("Post-reset: %s, %s, %uhz, %u / %u buffer\n", + DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), + device->Frequency, device->UpdateSize, device->BufferSize); + + switch(device->FmtChans) + { + case DevFmtMono: device->RealOut.RemixMap = MonoDownmix; break; + case DevFmtStereo: device->RealOut.RemixMap = StereoDownmix; break; + case DevFmtQuad: device->RealOut.RemixMap = QuadDownmix; break; + case DevFmtX51: device->RealOut.RemixMap = X51Downmix; break; + case DevFmtX51Rear: device->RealOut.RemixMap = X51RearDownmix; break; + case DevFmtX61: device->RealOut.RemixMap = X61Downmix; break; + case DevFmtX71: device->RealOut.RemixMap = X71Downmix; break; + case DevFmtAmbi3D: break; + } + + aluInitRenderer(device, hrtf_id, hrtf_appreq, hrtf_userreq); + + device->NumAuxSends = new_sends; + TRACE("Max sources: %d (%d + %d), effect slots: %d, sends: %d\n", + device->SourcesMax, device->NumMonoSources, device->NumStereoSources, + device->AuxiliaryEffectSlotMax, device->NumAuxSends); + + /* Enable the stablizer only for formats that have front-left, front-right, + * and front-center outputs. + */ + switch(device->FmtChans) + { + case DevFmtX51: + case DevFmtX51Rear: + case DevFmtX61: + case DevFmtX71: + if(GetConfigValueBool(device->DeviceName.c_str(), nullptr, "front-stablizer", 0)) + { + auto stablizer = al::make_unique(); + /* Initialize band-splitting filters for the front-left and front- + * right channels, with a crossover at 5khz (could be higher). + */ + const ALfloat scale{5000.0f / static_cast(device->Frequency)}; + + stablizer->LFilter.init(scale); + stablizer->RFilter = stablizer->LFilter; + + device->Stablizer = std::move(stablizer); + /* NOTE: Don't know why this has to be "copied" into a local static + * constexpr variable to avoid a reference on + * FrontStablizer::DelayLength... + */ + constexpr size_t StablizerDelay{FrontStablizer::DelayLength}; + device->FixedLatency += nanoseconds{seconds{StablizerDelay}} / device->Frequency; + } + break; + case DevFmtMono: + case DevFmtStereo: + case DevFmtQuad: + case DevFmtAmbi3D: + break; + } + TRACE("Front stablizer %s\n", device->Stablizer ? "enabled" : "disabled"); + + if(GetConfigValueBool(device->DeviceName.c_str(), nullptr, "dither", 1)) + { + ALint depth{ + ConfigValueInt(device->DeviceName.c_str(), nullptr, "dither-depth").value_or(0)}; + if(depth <= 0) + { + switch(device->FmtType) + { + case DevFmtByte: + case DevFmtUByte: + depth = 8; + break; + case DevFmtShort: + case DevFmtUShort: + depth = 16; + break; + case DevFmtInt: + case DevFmtUInt: + case DevFmtFloat: + break; + } + } + + if(depth > 0) + { + depth = clampi(depth, 2, 24); + device->DitherDepth = std::pow(2.0f, static_cast(depth-1)); + } + } + if(!(device->DitherDepth > 0.0f)) + TRACE("Dithering disabled\n"); + else + TRACE("Dithering enabled (%d-bit, %g)\n", float2int(std::log2(device->DitherDepth)+0.5f)+1, + device->DitherDepth); + + device->LimiterState = gainLimiter; + if(auto limopt = ConfigValueBool(device->DeviceName.c_str(), nullptr, "output-limiter")) + gainLimiter = *limopt ? ALC_TRUE : ALC_FALSE; + + /* Valid values for gainLimiter are ALC_DONT_CARE_SOFT, ALC_TRUE, and + * ALC_FALSE. For ALC_DONT_CARE_SOFT, use the limiter for integer-based + * output (where samples must be clamped), and don't for floating-point + * (which can take unclamped samples). + */ + if(gainLimiter == ALC_DONT_CARE_SOFT) + { + switch(device->FmtType) + { + case DevFmtByte: + case DevFmtUByte: + case DevFmtShort: + case DevFmtUShort: + case DevFmtInt: + case DevFmtUInt: + gainLimiter = ALC_TRUE; + break; + case DevFmtFloat: + gainLimiter = ALC_FALSE; + break; + } + } + if(gainLimiter == ALC_FALSE) + TRACE("Output limiter disabled\n"); + else + { + ALfloat thrshld = 1.0f; + switch(device->FmtType) + { + case DevFmtByte: + case DevFmtUByte: + thrshld = 127.0f / 128.0f; + break; + case DevFmtShort: + case DevFmtUShort: + thrshld = 32767.0f / 32768.0f; + break; + case DevFmtInt: + case DevFmtUInt: + case DevFmtFloat: + break; + } + if(device->DitherDepth > 0.0f) + thrshld -= 1.0f / device->DitherDepth; + + const float thrshld_dB{std::log10(thrshld) * 20.0f}; + auto limiter = CreateDeviceLimiter(device, thrshld_dB); + /* Convert the lookahead from samples to nanosamples to nanoseconds. */ + device->FixedLatency += nanoseconds{seconds{limiter->getLookAhead()}} / device->Frequency; + device->Limiter = std::move(limiter); + TRACE("Output limiter enabled, %.4fdB limit\n", thrshld_dB); + } + + TRACE("Fixed device latency: %" PRId64 "ns\n", int64_t{device->FixedLatency.count()}); + + /* Need to delay returning failure until replacement Send arrays have been + * allocated with the appropriate size. + */ + update_failed = AL_FALSE; + FPUCtl mixer_mode{}; + for(ALCcontext *context : *device->mContexts.load()) + { + if(context->mDefaultSlot) + { + ALeffectslot *slot = context->mDefaultSlot.get(); + aluInitEffectPanning(slot, device); + + EffectState *state{slot->Effect.State}; + state->mOutTarget = device->Dry.Buffer; + if(state->deviceUpdate(device) == AL_FALSE) + update_failed = AL_TRUE; + else + UpdateEffectSlotProps(slot, context); + } + + std::unique_lock proplock{context->mPropLock}; + std::unique_lock slotlock{context->mEffectSlotLock}; + if(ALeffectslotArray *curarray{context->mActiveAuxSlots.load(std::memory_order_relaxed)}) + std::fill_n(curarray->end(), curarray->size(), nullptr); + for(auto &sublist : context->mEffectSlotList) + { + uint64_t usemask = ~sublist.FreeMask; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + ALeffectslot *slot = sublist.EffectSlots + idx; + + usemask &= ~(1_u64 << idx); + + aluInitEffectPanning(slot, device); + + EffectState *state{slot->Effect.State}; + state->mOutTarget = device->Dry.Buffer; + if(state->deviceUpdate(device) == AL_FALSE) + update_failed = AL_TRUE; + else + UpdateEffectSlotProps(slot, context); + } + } + slotlock.unlock(); + + std::unique_lock srclock{context->mSourceLock}; + for(auto &sublist : context->mSourceList) + { + uint64_t usemask = ~sublist.FreeMask; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + ALsource *source = sublist.Sources + idx; + + usemask &= ~(1_u64 << idx); + + if(old_sends != device->NumAuxSends) + { + if(source->Send.size() > device->NumAuxSends) + { + auto clear_send = [](ALsource::SendData &send) -> void + { + if(send.Slot) + DecrementRef(send.Slot->ref); + send.Slot = nullptr; + }; + auto send_begin = source->Send.begin() + + static_cast(device->NumAuxSends); + std::for_each(send_begin, source->Send.end(), clear_send); + } + + source->Send.resize(device->NumAuxSends, + {nullptr, 1.0f, 1.0f, LOWPASSFREQREF, 1.0f, HIGHPASSFREQREF}); + source->Send.shrink_to_fit(); + } + + source->PropsClean.clear(std::memory_order_release); + } + } + + /* Clear any pre-existing voice property structs, in case the number of + * auxiliary sends is changing. Active sources will have updates + * respecified in UpdateAllSourceProps. + */ + ALvoiceProps *vprops{context->mFreeVoiceProps.exchange(nullptr, std::memory_order_acq_rel)}; + while(vprops) + { + ALvoiceProps *next = vprops->next.load(std::memory_order_relaxed); + delete vprops; + vprops = next; + } + + if(device->NumAuxSends < old_sends) + { + const ALuint num_sends{device->NumAuxSends}; + /* Clear extraneous property set sends. */ + auto clear_sends = [num_sends](ALvoice &voice) -> void + { + std::fill(std::begin(voice.mProps.Send)+num_sends, std::end(voice.mProps.Send), + ALvoiceProps::SendData{}); + + std::fill(voice.mSend.begin()+num_sends, voice.mSend.end(), ALvoice::TargetData{}); + auto clear_chan_sends = [num_sends](ALvoice::ChannelData &chandata) -> void + { + std::fill(chandata.mWetParams.begin()+num_sends, chandata.mWetParams.end(), + SendParams{}); + }; + std::for_each(voice.mChans.begin(), voice.mChans.end(), clear_chan_sends); + }; + std::for_each(context->mVoices.begin(), context->mVoices.end(), clear_sends); + } + auto reset_voice = [device](ALvoice &voice) -> void + { + delete voice.mUpdate.exchange(nullptr, std::memory_order_acq_rel); + + /* Force the voice to stopped if it was stopping. */ + ALvoice::State vstate{ALvoice::Stopping}; + voice.mPlayState.compare_exchange_strong(vstate, ALvoice::Stopped, + std::memory_order_acquire, std::memory_order_acquire); + if(voice.mSourceID.load(std::memory_order_relaxed) == 0u) + return; + + voice.mStep = 0; + voice.mFlags |= VOICE_IS_FADING; + + if((voice.mFmtChannels == FmtBFormat2D || voice.mFmtChannels == FmtBFormat3D) + && device->mAmbiOrder > voice.mAmbiOrder) + { + const uint8_t *OrderFromChan{(voice.mFmtChannels == FmtBFormat2D) ? + AmbiIndex::OrderFrom2DChannel.data() : + AmbiIndex::OrderFromChannel.data()}; + + const BandSplitter splitter{400.0f / static_cast(device->Frequency)}; + + const auto scales = BFormatDec::GetHFOrderScales(voice.mAmbiOrder, + device->mAmbiOrder); + auto init_ambi = [device,&scales,&OrderFromChan,splitter](ALvoice::ChannelData &chandata) -> void + { + chandata.mPrevSamples.fill(0.0f); + chandata.mAmbiScale = scales[*(OrderFromChan++)]; + chandata.mAmbiSplitter = splitter; + chandata.mDryParams = DirectParams{}; + std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{}); + }; + std::for_each(voice.mChans.begin(), voice.mChans.begin()+voice.mNumChannels, + init_ambi); + + voice.mFlags |= VOICE_IS_AMBISONIC; + } + else + { + /* Clear previous samples. */ + auto clear_prevs = [device](ALvoice::ChannelData &chandata) -> void + { + chandata.mPrevSamples.fill(0.0f); + chandata.mDryParams = DirectParams{}; + std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{}); + }; + std::for_each(voice.mChans.begin(), voice.mChans.begin()+voice.mNumChannels, + clear_prevs); + + voice.mFlags &= ~VOICE_IS_AMBISONIC; + } + + if(device->AvgSpeakerDist > 0.0f) + { + /* Reinitialize the NFC filters for new parameters. */ + const ALfloat w1{SPEEDOFSOUNDMETRESPERSEC / + (device->AvgSpeakerDist * static_cast(device->Frequency))}; + auto init_nfc = [w1](ALvoice::ChannelData &chandata) -> void + { chandata.mDryParams.NFCtrlFilter.init(w1); }; + std::for_each(voice.mChans.begin(), voice.mChans.begin()+voice.mNumChannels, + init_nfc); + } + }; + std::for_each(context->mVoices.begin(), context->mVoices.end(), reset_voice); + srclock.unlock(); + + context->mPropsClean.test_and_set(std::memory_order_release); + UpdateContextProps(context); + context->mListener.PropsClean.test_and_set(std::memory_order_release); + UpdateListenerProps(context); + UpdateAllSourceProps(context); + } + mixer_mode.leave(); + if(update_failed) + return ALC_INVALID_DEVICE; + + if(!device->Flags.get()) + { + try { + auto backend = device->Backend.get(); + if(!backend->start()) + throw al::backend_exception{ALC_INVALID_DEVICE, "Backend error"}; + device->Flags.set(); + } + catch(al::backend_exception& e) { + WARN("Failed to start playback: %s\n", e.what()); + return ALC_INVALID_DEVICE; + } + } + + return ALC_NO_ERROR; +} + + +ALCdevice::ALCdevice(DeviceType type) : Type{type}, mContexts{&EmptyContextArray} +{ +} + +/* ALCdevice::~ALCdevice + * + * Frees the device structure, and destroys any objects the app failed to + * delete. Called once there's no more references on the device. + */ +ALCdevice::~ALCdevice() +{ + TRACE("Freeing device %p\n", decltype(std::declval()){this}); + + Backend = nullptr; + + size_t count{std::accumulate(BufferList.cbegin(), BufferList.cend(), size_t{0u}, + [](size_t cur, const BufferSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(~sublist.FreeMask)); } + )}; + if(count > 0) + WARN("%zu Buffer%s not deleted\n", count, (count==1)?"":"s"); + + count = std::accumulate(EffectList.cbegin(), EffectList.cend(), size_t{0u}, + [](size_t cur, const EffectSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(~sublist.FreeMask)); } + ); + if(count > 0) + WARN("%zu Effect%s not deleted\n", count, (count==1)?"":"s"); + + count = std::accumulate(FilterList.cbegin(), FilterList.cend(), size_t{0u}, + [](size_t cur, const FilterSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(~sublist.FreeMask)); } + ); + if(count > 0) + WARN("%zu Filter%s not deleted\n", count, (count==1)?"":"s"); + + if(mHrtf) + mHrtf->DecRef(); + mHrtf = nullptr; + + auto *oldarray = mContexts.exchange(nullptr, std::memory_order_relaxed); + if(oldarray != &EmptyContextArray) delete oldarray; +} + + +/* VerifyDevice + * + * Checks if the device handle is valid, and returns a new reference if so. + */ +static DeviceRef VerifyDevice(ALCdevice *device) +{ + std::lock_guard _{ListLock}; + auto iter = std::lower_bound(DeviceList.begin(), DeviceList.end(), device); + if(iter != DeviceList.end() && *iter == device) + { + (*iter)->add_ref(); + return DeviceRef{*iter}; + } + return nullptr; +} + + +ALCcontext::ALCcontext(al::intrusive_ptr device) : mDevice{std::move(device)} +{ + mPropsClean.test_and_set(std::memory_order_relaxed); +} + +ALCcontext::~ALCcontext() +{ + TRACE("Freeing context %p\n", decltype(std::declval()){this}); + + size_t count{0}; + ALcontextProps *cprops{mUpdate.exchange(nullptr, std::memory_order_relaxed)}; + if(cprops) + { + ++count; + delete cprops; + } + cprops = mFreeContextProps.exchange(nullptr, std::memory_order_acquire); + while(cprops) + { + ALcontextProps *next{cprops->next.load(std::memory_order_relaxed)}; + delete cprops; + cprops = next; + ++count; + } + TRACE("Freed %zu context property object%s\n", count, (count==1)?"":"s"); + + count = std::accumulate(mSourceList.cbegin(), mSourceList.cend(), size_t{0u}, + [](size_t cur, const SourceSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(~sublist.FreeMask)); } + ); + if(count > 0) + WARN("%zu Source%s not deleted\n", count, (count==1)?"":"s"); + mSourceList.clear(); + mNumSources = 0; + + count = 0; + ALeffectslotProps *eprops{mFreeEffectslotProps.exchange(nullptr, std::memory_order_acquire)}; + while(eprops) + { + ALeffectslotProps *next{eprops->next.load(std::memory_order_relaxed)}; + if(eprops->State) eprops->State->release(); + delete eprops; + eprops = next; + ++count; + } + TRACE("Freed %zu AuxiliaryEffectSlot property object%s\n", count, (count==1)?"":"s"); + + if(ALeffectslotArray *curarray{mActiveAuxSlots.exchange(nullptr, std::memory_order_relaxed)}) + { + al::destroy_n(curarray->end(), curarray->size()); + delete curarray; + } + mDefaultSlot = nullptr; + + count = std::accumulate(mEffectSlotList.cbegin(), mEffectSlotList.cend(), size_t{0u}, + [](size_t cur, const EffectSlotSubList &sublist) noexcept -> size_t + { return cur + static_cast(POPCNT64(~sublist.FreeMask)); } + ); + if(count > 0) + WARN("%zu AuxiliaryEffectSlot%s not deleted\n", count, (count==1)?"":"s"); + mEffectSlotList.clear(); + mNumEffectSlots = 0; + + count = 0; + ALvoiceProps *vprops{mFreeVoiceProps.exchange(nullptr, std::memory_order_acquire)}; + while(vprops) + { + ALvoiceProps *next{vprops->next.load(std::memory_order_relaxed)}; + delete vprops; + vprops = next; + ++count; + } + TRACE("Freed %zu voice property object%s\n", count, (count==1)?"":"s"); + + mVoices.clear(); + + count = 0; + ALlistenerProps *lprops{mListener.Params.Update.exchange(nullptr, std::memory_order_relaxed)}; + if(lprops) + { + ++count; + delete lprops; + } + lprops = mFreeListenerProps.exchange(nullptr, std::memory_order_acquire); + while(lprops) + { + ALlistenerProps *next{lprops->next.load(std::memory_order_relaxed)}; + delete lprops; + lprops = next; + ++count; + } + TRACE("Freed %zu listener property object%s\n", count, (count==1)?"":"s"); + + if(mAsyncEvents) + { + count = 0; + auto evt_vec = mAsyncEvents->getReadVector(); + if(evt_vec.first.len > 0) + { + al::destroy_n(reinterpret_cast(evt_vec.first.buf), evt_vec.first.len); + count += evt_vec.first.len; + } + if(evt_vec.second.len > 0) + { + al::destroy_n(reinterpret_cast(evt_vec.second.buf), evt_vec.second.len); + count += evt_vec.second.len; + } + if(count > 0) + TRACE("Destructed %zu orphaned event%s\n", count, (count==1)?"":"s"); + mAsyncEvents->readAdvance(count); + } +} + +void ALCcontext::init() +{ + if(DefaultEffect.type != AL_EFFECT_NULL && mDevice->Type == Playback) + { + mDefaultSlot = std::unique_ptr{new ALeffectslot{}}; + if(InitEffectSlot(mDefaultSlot.get()) == AL_NO_ERROR) + aluInitEffectPanning(mDefaultSlot.get(), mDevice.get()); + else + { + mDefaultSlot = nullptr; + ERR("Failed to initialize the default effect slot\n"); + } + } + + ALeffectslotArray *auxslots; + if(!mDefaultSlot) + auxslots = ALeffectslot::CreatePtrArray(0); + else + { + auxslots = ALeffectslot::CreatePtrArray(1); + (*auxslots)[0] = mDefaultSlot.get(); + } + mActiveAuxSlots.store(auxslots, std::memory_order_relaxed); + + mExtensionList = alExtList; + + + mListener.Params.Matrix = alu::Matrix::Identity(); + mListener.Params.Velocity = alu::Vector{}; + mListener.Params.Gain = mListener.Gain; + mListener.Params.MetersPerUnit = mListener.mMetersPerUnit; + mListener.Params.DopplerFactor = mDopplerFactor; + mListener.Params.SpeedOfSound = mSpeedOfSound * mDopplerVelocity; + mListener.Params.SourceDistanceModel = mSourceDistanceModel; + mListener.Params.mDistanceModel = mDistanceModel; + + + mAsyncEvents = RingBuffer::Create(511, sizeof(AsyncEvent), false); + StartEventThrd(this); + + + mVoices.reserve(256); + mVoices.resize(64); +} + +bool ALCcontext::deinit() +{ + if(LocalContext.get() == this) + { + WARN("%p released while current on thread\n", decltype(std::declval()){this}); + LocalContext.set(nullptr); + release(); + } + + ALCcontext *origctx{this}; + if(GlobalContext.compare_exchange_strong(origctx, nullptr)) + release(); + + bool ret{}; + /* First make sure this context exists in the device's list. */ + auto *oldarray = mDevice->mContexts.load(std::memory_order_acquire); + if(auto toremove = static_cast(std::count(oldarray->begin(), oldarray->end(), this))) + { + using ContextArray = al::FlexArray; + auto alloc_ctx_array = [](const size_t count) -> ContextArray* + { + if(count == 0) return &EmptyContextArray; + return ContextArray::Create(count).release(); + }; + auto *newarray = alloc_ctx_array(oldarray->size() - toremove); + + /* Copy the current/old context handles to the new array, excluding the + * given context. + */ + std::copy_if(oldarray->begin(), oldarray->end(), newarray->begin(), + std::bind(std::not_equal_to{}, _1, this)); + + /* Store the new context array in the device. Wait for any current mix + * to finish before deleting the old array. + */ + mDevice->mContexts.store(newarray); + if(oldarray != &EmptyContextArray) + { + while((mDevice->MixCount.load(std::memory_order_acquire)&1)) + std::this_thread::yield(); + delete oldarray; + } + + ret = !newarray->empty(); + } + else + ret = !oldarray->empty(); + + StopEventThrd(this); + + return ret; +} + + +/* VerifyContext + * + * Checks if the given context is valid, returning a new reference to it if so. + */ +static ContextRef VerifyContext(ALCcontext *context) +{ + std::lock_guard _{ListLock}; + auto iter = std::lower_bound(ContextList.begin(), ContextList.end(), context); + if(iter != ContextList.end() && *iter == context) + { + (*iter)->add_ref(); + return ContextRef{*iter}; + } + return nullptr; +} + +/* GetContextRef + * + * Returns a new reference to the currently active context for this thread. + */ +ContextRef GetContextRef(void) +{ + ALCcontext *context{LocalContext.get()}; + if(context) + context->add_ref(); + else + { + std::lock_guard _{ListLock}; + context = GlobalContext.load(std::memory_order_acquire); + if(context) context->add_ref(); + } + return ContextRef{context}; +} + + +/************************************************ + * Standard ALC functions + ************************************************/ + +/* alcGetError + * + * Return last ALC generated error code for the given device + */ +ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(dev) return dev->LastError.exchange(ALC_NO_ERROR); + return LastNullDeviceError.exchange(ALC_NO_ERROR); +} +END_API_FUNC + + +/* alcSuspendContext + * + * Suspends updates for the given context + */ +ALC_API ALCvoid ALC_APIENTRY alcSuspendContext(ALCcontext *context) +START_API_FUNC +{ + if(!SuspendDefers) + return; + + ContextRef ctx{VerifyContext(context)}; + if(!ctx) + alcSetError(nullptr, ALC_INVALID_CONTEXT); + else + ctx->deferUpdates(); +} +END_API_FUNC + +/* alcProcessContext + * + * Resumes processing updates for the given context + */ +ALC_API ALCvoid ALC_APIENTRY alcProcessContext(ALCcontext *context) +START_API_FUNC +{ + if(!SuspendDefers) + return; + + ContextRef ctx{VerifyContext(context)}; + if(!ctx) + alcSetError(nullptr, ALC_INVALID_CONTEXT); + else + ctx->processUpdates(); +} +END_API_FUNC + + +/* alcGetString + * + * Returns information about the device, and error strings + */ +ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *Device, ALCenum param) +START_API_FUNC +{ + const ALCchar *value = nullptr; + + switch(param) + { + case ALC_NO_ERROR: + value = alcNoError; + break; + + case ALC_INVALID_ENUM: + value = alcErrInvalidEnum; + break; + + case ALC_INVALID_VALUE: + value = alcErrInvalidValue; + break; + + case ALC_INVALID_DEVICE: + value = alcErrInvalidDevice; + break; + + case ALC_INVALID_CONTEXT: + value = alcErrInvalidContext; + break; + + case ALC_OUT_OF_MEMORY: + value = alcErrOutOfMemory; + break; + + case ALC_DEVICE_SPECIFIER: + value = alcDefaultName; + break; + + case ALC_ALL_DEVICES_SPECIFIER: + if(DeviceRef dev{VerifyDevice(Device)}) + value = dev->DeviceName.c_str(); + else + { + ProbeAllDevicesList(); + value = alcAllDevicesList.c_str(); + } + break; + + case ALC_CAPTURE_DEVICE_SPECIFIER: + if(DeviceRef dev{VerifyDevice(Device)}) + value = dev->DeviceName.c_str(); + else + { + ProbeCaptureDeviceList(); + value = alcCaptureDeviceList.c_str(); + } + break; + + /* Default devices are always first in the list */ + case ALC_DEFAULT_DEVICE_SPECIFIER: + value = alcDefaultName; + break; + + case ALC_DEFAULT_ALL_DEVICES_SPECIFIER: + if(alcAllDevicesList.empty()) + ProbeAllDevicesList(); + + /* Copy first entry as default. */ + alcDefaultAllDevicesSpecifier = alcAllDevicesList.c_str(); + value = alcDefaultAllDevicesSpecifier.c_str(); + break; + + case ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER: + if(alcCaptureDeviceList.empty()) + ProbeCaptureDeviceList(); + + /* Copy first entry as default. */ + alcCaptureDefaultDeviceSpecifier = alcCaptureDeviceList.c_str(); + value = alcCaptureDefaultDeviceSpecifier.c_str(); + break; + + case ALC_EXTENSIONS: + if(VerifyDevice(Device)) + value = alcExtensionList; + else + value = alcNoDeviceExtList; + break; + + case ALC_HRTF_SPECIFIER_SOFT: + if(DeviceRef dev{VerifyDevice(Device)}) + { + std::lock_guard _{dev->StateLock}; + value = (dev->mHrtf ? dev->HrtfName.c_str() : ""); + } + else + alcSetError(nullptr, ALC_INVALID_DEVICE); + break; + + default: + alcSetError(VerifyDevice(Device).get(), ALC_INVALID_ENUM); + break; + } + + return value; +} +END_API_FUNC + + +static inline ALCsizei NumAttrsForDevice(ALCdevice *device) +{ + if(device->Type == Capture) return 9; + if(device->Type != Loopback) return 29; + if(device->FmtChans == DevFmtAmbi3D) + return 35; + return 29; +} + +static size_t GetIntegerv(ALCdevice *device, ALCenum param, const al::span values) +{ + size_t i; + + if(values.empty()) + { + alcSetError(device, ALC_INVALID_VALUE); + return 0; + } + + if(!device) + { + switch(param) + { + case ALC_MAJOR_VERSION: + values[0] = alcMajorVersion; + return 1; + case ALC_MINOR_VERSION: + values[0] = alcMinorVersion; + return 1; + + case ALC_ATTRIBUTES_SIZE: + case ALC_ALL_ATTRIBUTES: + case ALC_FREQUENCY: + case ALC_REFRESH: + case ALC_SYNC: + case ALC_MONO_SOURCES: + case ALC_STEREO_SOURCES: + case ALC_CAPTURE_SAMPLES: + case ALC_FORMAT_CHANNELS_SOFT: + case ALC_FORMAT_TYPE_SOFT: + case ALC_AMBISONIC_LAYOUT_SOFT: + case ALC_AMBISONIC_SCALING_SOFT: + case ALC_AMBISONIC_ORDER_SOFT: + case ALC_MAX_AMBISONIC_ORDER_SOFT: + alcSetError(nullptr, ALC_INVALID_DEVICE); + return 0; + + default: + alcSetError(nullptr, ALC_INVALID_ENUM); + return 0; + } + return 0; + } + + if(device->Type == Capture) + { + switch(param) + { + case ALC_ATTRIBUTES_SIZE: + values[0] = NumAttrsForDevice(device); + return 1; + + case ALC_ALL_ATTRIBUTES: + i = 0; + if(values.size() < static_cast(NumAttrsForDevice(device))) + alcSetError(device, ALC_INVALID_VALUE); + else + { + std::lock_guard _{device->StateLock}; + values[i++] = ALC_MAJOR_VERSION; + values[i++] = alcMajorVersion; + values[i++] = ALC_MINOR_VERSION; + values[i++] = alcMinorVersion; + values[i++] = ALC_CAPTURE_SAMPLES; + values[i++] = static_cast(device->Backend->availableSamples()); + values[i++] = ALC_CONNECTED; + values[i++] = device->Connected.load(std::memory_order_relaxed); + values[i++] = 0; + } + return i; + + case ALC_MAJOR_VERSION: + values[0] = alcMajorVersion; + return 1; + case ALC_MINOR_VERSION: + values[0] = alcMinorVersion; + return 1; + + case ALC_CAPTURE_SAMPLES: + { + std::lock_guard _{device->StateLock}; + values[0] = static_cast(device->Backend->availableSamples()); + } + return 1; + + case ALC_CONNECTED: + { + std::lock_guard _{device->StateLock}; + values[0] = device->Connected.load(std::memory_order_acquire); + } + return 1; + + default: + alcSetError(device, ALC_INVALID_ENUM); + } + return 0; + } + + /* render device */ + switch(param) + { + case ALC_ATTRIBUTES_SIZE: + values[0] = NumAttrsForDevice(device); + return 1; + + case ALC_ALL_ATTRIBUTES: + i = 0; + if(values.size() < static_cast(NumAttrsForDevice(device))) + alcSetError(device, ALC_INVALID_VALUE); + else + { + std::lock_guard _{device->StateLock}; + values[i++] = ALC_MAJOR_VERSION; + values[i++] = alcMajorVersion; + values[i++] = ALC_MINOR_VERSION; + values[i++] = alcMinorVersion; + values[i++] = ALC_EFX_MAJOR_VERSION; + values[i++] = alcEFXMajorVersion; + values[i++] = ALC_EFX_MINOR_VERSION; + values[i++] = alcEFXMinorVersion; + + values[i++] = ALC_FREQUENCY; + values[i++] = static_cast(device->Frequency); + if(device->Type != Loopback) + { + values[i++] = ALC_REFRESH; + values[i++] = static_cast(device->Frequency / device->UpdateSize); + + values[i++] = ALC_SYNC; + values[i++] = ALC_FALSE; + } + else + { + if(device->FmtChans == DevFmtAmbi3D) + { + values[i++] = ALC_AMBISONIC_LAYOUT_SOFT; + values[i++] = static_cast(device->mAmbiLayout); + + values[i++] = ALC_AMBISONIC_SCALING_SOFT; + values[i++] = static_cast(device->mAmbiScale); + + values[i++] = ALC_AMBISONIC_ORDER_SOFT; + values[i++] = static_cast(device->mAmbiOrder); + } + + values[i++] = ALC_FORMAT_CHANNELS_SOFT; + values[i++] = device->FmtChans; + + values[i++] = ALC_FORMAT_TYPE_SOFT; + values[i++] = device->FmtType; + } + + values[i++] = ALC_MONO_SOURCES; + values[i++] = static_cast(device->NumMonoSources); + + values[i++] = ALC_STEREO_SOURCES; + values[i++] = static_cast(device->NumStereoSources); + + values[i++] = ALC_MAX_AUXILIARY_SENDS; + values[i++] = static_cast(device->NumAuxSends); + + values[i++] = ALC_HRTF_SOFT; + values[i++] = (device->mHrtf ? ALC_TRUE : ALC_FALSE); + + values[i++] = ALC_HRTF_STATUS_SOFT; + values[i++] = device->HrtfStatus; + + values[i++] = ALC_OUTPUT_LIMITER_SOFT; + values[i++] = device->Limiter ? ALC_TRUE : ALC_FALSE; + + values[i++] = ALC_MAX_AMBISONIC_ORDER_SOFT; + values[i++] = MAX_AMBI_ORDER; + + values[i++] = 0; + } + return i; + + case ALC_MAJOR_VERSION: + values[0] = alcMajorVersion; + return 1; + + case ALC_MINOR_VERSION: + values[0] = alcMinorVersion; + return 1; + + case ALC_EFX_MAJOR_VERSION: + values[0] = alcEFXMajorVersion; + return 1; + + case ALC_EFX_MINOR_VERSION: + values[0] = alcEFXMinorVersion; + return 1; + + case ALC_FREQUENCY: + values[0] = static_cast(device->Frequency); + return 1; + + case ALC_REFRESH: + if(device->Type == Loopback) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + { + std::lock_guard _{device->StateLock}; + values[0] = static_cast(device->Frequency / device->UpdateSize); + } + return 1; + + case ALC_SYNC: + if(device->Type == Loopback) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + values[0] = ALC_FALSE; + return 1; + + case ALC_FORMAT_CHANNELS_SOFT: + if(device->Type != Loopback) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + values[0] = device->FmtChans; + return 1; + + case ALC_FORMAT_TYPE_SOFT: + if(device->Type != Loopback) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + values[0] = device->FmtType; + return 1; + + case ALC_AMBISONIC_LAYOUT_SOFT: + if(device->Type != Loopback || device->FmtChans != DevFmtAmbi3D) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + values[0] = static_cast(device->mAmbiLayout); + return 1; + + case ALC_AMBISONIC_SCALING_SOFT: + if(device->Type != Loopback || device->FmtChans != DevFmtAmbi3D) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + values[0] = static_cast(device->mAmbiScale); + return 1; + + case ALC_AMBISONIC_ORDER_SOFT: + if(device->Type != Loopback || device->FmtChans != DevFmtAmbi3D) + { + alcSetError(device, ALC_INVALID_DEVICE); + return 0; + } + values[0] = static_cast(device->mAmbiOrder); + return 1; + + case ALC_MONO_SOURCES: + values[0] = static_cast(device->NumMonoSources); + return 1; + + case ALC_STEREO_SOURCES: + values[0] = static_cast(device->NumStereoSources); + return 1; + + case ALC_MAX_AUXILIARY_SENDS: + values[0] = static_cast(device->NumAuxSends); + return 1; + + case ALC_CONNECTED: + { + std::lock_guard _{device->StateLock}; + values[0] = device->Connected.load(std::memory_order_acquire); + } + return 1; + + case ALC_HRTF_SOFT: + values[0] = (device->mHrtf ? ALC_TRUE : ALC_FALSE); + return 1; + + case ALC_HRTF_STATUS_SOFT: + values[0] = device->HrtfStatus; + return 1; + + case ALC_NUM_HRTF_SPECIFIERS_SOFT: + { + std::lock_guard _{device->StateLock}; + device->HrtfList = EnumerateHrtf(device->DeviceName.c_str()); + values[0] = static_cast(minz(device->HrtfList.size(), + std::numeric_limits::max())); + } + return 1; + + case ALC_OUTPUT_LIMITER_SOFT: + values[0] = device->Limiter ? ALC_TRUE : ALC_FALSE; + return 1; + + case ALC_MAX_AMBISONIC_ORDER_SOFT: + values[0] = MAX_AMBI_ORDER; + return 1; + + default: + alcSetError(device, ALC_INVALID_ENUM); + } + return 0; +} + +/* alcGetIntegerv + * + * Returns information about the device and the version of OpenAL + */ +ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(size <= 0 || values == nullptr) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else + GetIntegerv(dev.get(), param, {values, values+size}); +} +END_API_FUNC + +ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALCsizei size, ALCint64SOFT *values) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(size <= 0 || values == nullptr) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else if(!dev || dev->Type == Capture) + { + auto ivals = al::vector(static_cast(size)); + size_t got{GetIntegerv(dev.get(), pname, {ivals.data(), ivals.size()})}; + std::copy_n(ivals.begin(), got, values); + return; + } + /* render device */ + switch(pname) + { + case ALC_ATTRIBUTES_SIZE: + *values = NumAttrsForDevice(dev.get())+4; + break; + + case ALC_ALL_ATTRIBUTES: + if(size < NumAttrsForDevice(dev.get())+4) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else + { + size_t i{0}; + std::lock_guard _{dev->StateLock}; + values[i++] = ALC_FREQUENCY; + values[i++] = dev->Frequency; + + if(dev->Type != Loopback) + { + values[i++] = ALC_REFRESH; + values[i++] = dev->Frequency / dev->UpdateSize; + + values[i++] = ALC_SYNC; + values[i++] = ALC_FALSE; + } + else + { + if(dev->FmtChans == DevFmtAmbi3D) + { + values[i++] = ALC_AMBISONIC_LAYOUT_SOFT; + values[i++] = static_cast(dev->mAmbiLayout); + + values[i++] = ALC_AMBISONIC_SCALING_SOFT; + values[i++] = static_cast(dev->mAmbiScale); + + values[i++] = ALC_AMBISONIC_ORDER_SOFT; + values[i++] = dev->mAmbiOrder; + } + + values[i++] = ALC_FORMAT_CHANNELS_SOFT; + values[i++] = dev->FmtChans; + + values[i++] = ALC_FORMAT_TYPE_SOFT; + values[i++] = dev->FmtType; + } + + values[i++] = ALC_MONO_SOURCES; + values[i++] = dev->NumMonoSources; + + values[i++] = ALC_STEREO_SOURCES; + values[i++] = dev->NumStereoSources; + + values[i++] = ALC_MAX_AUXILIARY_SENDS; + values[i++] = dev->NumAuxSends; + + values[i++] = ALC_HRTF_SOFT; + values[i++] = (dev->mHrtf ? ALC_TRUE : ALC_FALSE); + + values[i++] = ALC_HRTF_STATUS_SOFT; + values[i++] = dev->HrtfStatus; + + values[i++] = ALC_OUTPUT_LIMITER_SOFT; + values[i++] = dev->Limiter ? ALC_TRUE : ALC_FALSE; + + ClockLatency clock{GetClockLatency(dev.get())}; + values[i++] = ALC_DEVICE_CLOCK_SOFT; + values[i++] = clock.ClockTime.count(); + + values[i++] = ALC_DEVICE_LATENCY_SOFT; + values[i++] = clock.Latency.count(); + + values[i++] = 0; + } + break; + + case ALC_DEVICE_CLOCK_SOFT: + { std::lock_guard _{dev->StateLock}; + nanoseconds basecount; + ALuint samplecount; + ALuint refcount; + do { + while(((refcount=ReadRef(dev->MixCount))&1) != 0) + std::this_thread::yield(); + basecount = dev->ClockBase; + samplecount = dev->SamplesDone; + } while(refcount != ReadRef(dev->MixCount)); + basecount += nanoseconds{seconds{samplecount}} / dev->Frequency; + *values = basecount.count(); + } + break; + + case ALC_DEVICE_LATENCY_SOFT: + { std::lock_guard _{dev->StateLock}; + ClockLatency clock{GetClockLatency(dev.get())}; + *values = clock.Latency.count(); + } + break; + + case ALC_DEVICE_CLOCK_LATENCY_SOFT: + if(size < 2) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else + { + std::lock_guard _{dev->StateLock}; + ClockLatency clock{GetClockLatency(dev.get())}; + values[0] = clock.ClockTime.count(); + values[1] = clock.Latency.count(); + } + break; + + default: + auto ivals = al::vector(static_cast(size)); + size_t got{GetIntegerv(dev.get(), pname, {ivals.data(), ivals.size()})}; + std::copy_n(ivals.begin(), got, values); + break; + } +} +END_API_FUNC + + +/* alcIsExtensionPresent + * + * Determines if there is support for a particular extension + */ +ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extName) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!extName) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else + { + size_t len = strlen(extName); + const char *ptr = (dev ? alcExtensionList : alcNoDeviceExtList); + while(ptr && *ptr) + { + if(al::strncasecmp(ptr, extName, len) == 0 && (ptr[len] == '\0' || isspace(ptr[len]))) + return ALC_TRUE; + + if((ptr=strchr(ptr, ' ')) != nullptr) + { + do { + ++ptr; + } while(isspace(*ptr)); + } + } + } + return ALC_FALSE; +} +END_API_FUNC + + +/* alcGetProcAddress + * + * Retrieves the function address for a particular extension function + */ +ALC_API ALCvoid* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcName) +START_API_FUNC +{ + if(!funcName) + { + DeviceRef dev{VerifyDevice(device)}; + alcSetError(dev.get(), ALC_INVALID_VALUE); + } + else + { + for(const auto &func : alcFunctions) + { + if(strcmp(func.funcName, funcName) == 0) + return func.address; + } + } + return nullptr; +} +END_API_FUNC + + +/* alcGetEnumValue + * + * Get the value for a particular ALC enumeration name + */ +ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumName) +START_API_FUNC +{ + if(!enumName) + { + DeviceRef dev{VerifyDevice(device)}; + alcSetError(dev.get(), ALC_INVALID_VALUE); + } + else + { + for(const auto &enm : alcEnumerations) + { + if(strcmp(enm.enumName, enumName) == 0) + return enm.value; + } + } + return 0; +} +END_API_FUNC + + +/* alcCreateContext + * + * Create and attach a context to the given device. + */ +ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrList) +START_API_FUNC +{ + /* Explicitly hold the list lock while taking the StateLock in case the + * device is asynchronously destroyed, to ensure this new context is + * properly cleaned up after being made. + */ + std::unique_lock listlock{ListLock}; + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type == Capture || !dev->Connected.load(std::memory_order_relaxed)) + { + listlock.unlock(); + alcSetError(dev.get(), ALC_INVALID_DEVICE); + return nullptr; + } + std::unique_lock statelock{dev->StateLock}; + listlock.unlock(); + + dev->LastError.store(ALC_NO_ERROR); + + ALCenum err{UpdateDeviceParams(dev.get(), attrList)}; + if(err != ALC_NO_ERROR) + { + alcSetError(dev.get(), err); + if(err == ALC_INVALID_DEVICE) + aluHandleDisconnect(dev.get(), "Device update failure"); + return nullptr; + } + + ContextRef context{new ALCcontext{dev}}; + context->init(); + + if(auto volopt = ConfigValueFloat(dev->DeviceName.c_str(), nullptr, "volume-adjust")) + { + const ALfloat valf{*volopt}; + if(!std::isfinite(valf)) + ERR("volume-adjust must be finite: %f\n", valf); + else + { + const ALfloat db{clampf(valf, -24.0f, 24.0f)}; + if(db != valf) + WARN("volume-adjust clamped: %f, range: +/-%f\n", valf, 24.0f); + context->mGainBoost = std::pow(10.0f, db/20.0f); + TRACE("volume-adjust gain: %f\n", context->mGainBoost); + } + } + UpdateListenerProps(context.get()); + + { + using ContextArray = al::FlexArray; + + /* Allocate a new context array, which holds 1 more than the current/ + * old array. + */ + auto *oldarray = device->mContexts.load(); + const size_t newcount{oldarray->size()+1}; + std::unique_ptr newarray{ContextArray::Create(newcount)}; + + /* Copy the current/old context handles to the new array, appending the + * new context. + */ + auto iter = std::copy(oldarray->begin(), oldarray->end(), newarray->begin()); + *iter = context.get(); + + /* Store the new context array in the device. Wait for any current mix + * to finish before deleting the old array. + */ + dev->mContexts.store(newarray.release()); + if(oldarray != &EmptyContextArray) + { + while((dev->MixCount.load(std::memory_order_acquire)&1)) + std::this_thread::yield(); + delete oldarray; + } + } + statelock.unlock(); + + { + std::lock_guard _{ListLock}; + auto iter = std::lower_bound(ContextList.cbegin(), ContextList.cend(), context.get()); + ContextList.emplace(iter, context.get()); + } + + if(context->mDefaultSlot) + { + if(InitializeEffect(context.get(), context->mDefaultSlot.get(), &DefaultEffect) == AL_NO_ERROR) + UpdateEffectSlotProps(context->mDefaultSlot.get(), context.get()); + else + ERR("Failed to initialize the default effect\n"); + } + + TRACE("Created context %p\n", decltype(std::declval()){context.get()}); + return context.release(); +} +END_API_FUNC + +/* alcDestroyContext + * + * Remove a context from its device + */ +ALC_API ALCvoid ALC_APIENTRY alcDestroyContext(ALCcontext *context) +START_API_FUNC +{ + std::unique_lock listlock{ListLock}; + auto iter = std::lower_bound(ContextList.begin(), ContextList.end(), context); + if(iter == ContextList.end() || *iter != context) + { + listlock.unlock(); + alcSetError(nullptr, ALC_INVALID_CONTEXT); + return; + } + /* Hold a reference to this context so it remains valid until the ListLock + * is released. + */ + ContextRef ctx{*iter}; + ContextList.erase(iter); + + ALCdevice *Device{ctx->mDevice.get()}; + + std::lock_guard _{Device->StateLock}; + if(!ctx->deinit() && Device->Flags.get()) + { + Device->Backend->stop(); + Device->Flags.unset(); + } +} +END_API_FUNC + + +/* alcGetCurrentContext + * + * Returns the currently active context on the calling thread + */ +ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void) +START_API_FUNC +{ + ALCcontext *Context{LocalContext.get()}; + if(!Context) Context = GlobalContext.load(); + return Context; +} +END_API_FUNC + +/* alcGetThreadContext + * + * Returns the currently active thread-local context + */ +ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void) +START_API_FUNC +{ return LocalContext.get(); } +END_API_FUNC + +/* alcMakeContextCurrent + * + * Makes the given context the active process-wide context, and removes the + * thread-local context for the calling thread. + */ +ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context) +START_API_FUNC +{ + /* context must be valid or nullptr */ + ContextRef ctx; + if(context) + { + ctx = VerifyContext(context); + if(!ctx) + { + alcSetError(nullptr, ALC_INVALID_CONTEXT); + return ALC_FALSE; + } + } + /* Release this reference (if any) to store it in the GlobalContext + * pointer. Take ownership of the reference (if any) that was previously + * stored there. + */ + ctx = ContextRef{GlobalContext.exchange(ctx.release())}; + + /* Reset (decrement) the previous global reference by replacing it with the + * thread-local context. Take ownership of the thread-local context + * reference (if any), clearing the storage to null. + */ + ctx = ContextRef{LocalContext.get()}; + if(ctx) LocalContext.set(nullptr); + /* Reset (decrement) the previous thread-local reference. */ + + return ALC_TRUE; +} +END_API_FUNC + +/* alcSetThreadContext + * + * Makes the given context the active context for the current thread + */ +ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context) +START_API_FUNC +{ + /* context must be valid or nullptr */ + ContextRef ctx; + if(context) + { + ctx = VerifyContext(context); + if(!ctx) + { + alcSetError(nullptr, ALC_INVALID_CONTEXT); + return ALC_FALSE; + } + } + /* context's reference count is already incremented */ + ContextRef old{LocalContext.get()}; + LocalContext.set(ctx.release()); + + return ALC_TRUE; +} +END_API_FUNC + + +/* alcGetContextsDevice + * + * Returns the device that a particular context is attached to + */ +ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *Context) +START_API_FUNC +{ + ContextRef ctx{VerifyContext(Context)}; + if(!ctx) + { + alcSetError(nullptr, ALC_INVALID_CONTEXT); + return nullptr; + } + return ctx->mDevice.get(); +} +END_API_FUNC + + +/* alcOpenDevice + * + * Opens the named device. + */ +ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) +START_API_FUNC +{ + DO_INITCONFIG(); + + if(!PlaybackFactory) + { + alcSetError(nullptr, ALC_INVALID_VALUE); + return nullptr; + } + + if(deviceName) + { + if(!deviceName[0] || al::strcasecmp(deviceName, alcDefaultName) == 0 +#ifdef _WIN32 + /* Some old Windows apps hardcode these expecting OpenAL to use a + * specific audio API, even when they're not enumerated. Creative's + * router effectively ignores them too. + */ + || al::strcasecmp(deviceName, "DirectSound3D") == 0 + || al::strcasecmp(deviceName, "DirectSound") == 0 + || al::strcasecmp(deviceName, "MMSYSTEM") == 0 +#endif + || al::strcasecmp(deviceName, "openal-soft") == 0) + deviceName = nullptr; + } + + DeviceRef device{new ALCdevice{Playback}}; + + /* Set output format */ + device->FmtChans = DevFmtChannelsDefault; + device->FmtType = DevFmtTypeDefault; + device->Frequency = DEFAULT_OUTPUT_RATE; + device->UpdateSize = DEFAULT_UPDATE_SIZE; + device->BufferSize = DEFAULT_UPDATE_SIZE * DEFAULT_NUM_UPDATES; + + device->SourcesMax = 256; + device->AuxiliaryEffectSlotMax = 64; + device->NumAuxSends = DEFAULT_SENDS; + + try { + auto backend = PlaybackFactory->createBackend(device.get(), BackendType::Playback); + backend->open(deviceName); + device->Backend = std::move(backend); + } + catch(al::backend_exception &e) { + WARN("Failed to open playback device: %s\n", e.what()); + alcSetError(nullptr, e.errorCode()); + return nullptr; + } + + deviceName = device->DeviceName.c_str(); + if(auto chanopt = ConfigValueStr(deviceName, nullptr, "channels")) + { + static const struct ChannelMap { + const char name[16]; + DevFmtChannels chans; + ALuint order; + } chanlist[] = { + { "mono", DevFmtMono, 0 }, + { "stereo", DevFmtStereo, 0 }, + { "quad", DevFmtQuad, 0 }, + { "surround51", DevFmtX51, 0 }, + { "surround61", DevFmtX61, 0 }, + { "surround71", DevFmtX71, 0 }, + { "surround51rear", DevFmtX51Rear, 0 }, + { "ambi1", DevFmtAmbi3D, 1 }, + { "ambi2", DevFmtAmbi3D, 2 }, + { "ambi3", DevFmtAmbi3D, 3 }, + }; + + const ALCchar *fmt{chanopt->c_str()}; + auto iter = std::find_if(std::begin(chanlist), std::end(chanlist), + [fmt](const ChannelMap &entry) -> bool + { return al::strcasecmp(entry.name, fmt) == 0; } + ); + if(iter == std::end(chanlist)) + ERR("Unsupported channels: %s\n", fmt); + else + { + device->FmtChans = iter->chans; + device->mAmbiOrder = iter->order; + device->Flags.set(); + } + } + if(auto typeopt = ConfigValueStr(deviceName, nullptr, "sample-type")) + { + static const struct TypeMap { + const char name[16]; + DevFmtType type; + } typelist[] = { + { "int8", DevFmtByte }, + { "uint8", DevFmtUByte }, + { "int16", DevFmtShort }, + { "uint16", DevFmtUShort }, + { "int32", DevFmtInt }, + { "uint32", DevFmtUInt }, + { "float32", DevFmtFloat }, + }; + + const ALCchar *fmt{typeopt->c_str()}; + auto iter = std::find_if(std::begin(typelist), std::end(typelist), + [fmt](const TypeMap &entry) -> bool + { return al::strcasecmp(entry.name, fmt) == 0; } + ); + if(iter == std::end(typelist)) + ERR("Unsupported sample-type: %s\n", fmt); + else + { + device->FmtType = iter->type; + device->Flags.set(); + } + } + + if(ALuint freq{ConfigValueUInt(deviceName, nullptr, "frequency").value_or(0)}) + { + if(freq < MIN_OUTPUT_RATE) + { + ERR("%uhz request clamped to %uhz minimum\n", freq, MIN_OUTPUT_RATE); + freq = MIN_OUTPUT_RATE; + } + device->UpdateSize = (device->UpdateSize*freq + device->Frequency/2) / device->Frequency; + device->BufferSize = (device->BufferSize*freq + device->Frequency/2) / device->Frequency; + device->Frequency = freq; + device->Flags.set(); + } + + if(auto persizeopt = ConfigValueUInt(deviceName, nullptr, "period_size")) + device->UpdateSize = clampu(*persizeopt, 64, 8192); + + if(auto peropt = ConfigValueUInt(deviceName, nullptr, "periods")) + device->BufferSize = device->UpdateSize * clampu(*peropt, 2, 16); + else + device->BufferSize = maxu(device->BufferSize, device->UpdateSize*2); + + if(auto srcsopt = ConfigValueUInt(deviceName, nullptr, "sources")) + { + if(*srcsopt > 0) device->SourcesMax = *srcsopt; + } + + if(auto slotsopt = ConfigValueUInt(deviceName, nullptr, "slots")) + { + if(*slotsopt > 0) + device->AuxiliaryEffectSlotMax = minu(*slotsopt, INT_MAX); + } + + if(auto sendsopt = ConfigValueInt(deviceName, nullptr, "sends")) + device->NumAuxSends = clampu(DEFAULT_SENDS, 0, + static_cast(clampi(*sendsopt, 0, MAX_SENDS))); + + device->NumStereoSources = 1; + device->NumMonoSources = device->SourcesMax - device->NumStereoSources; + + if(auto ambiopt = ConfigValueStr(deviceName, nullptr, "ambi-format")) + { + const ALCchar *fmt{ambiopt->c_str()}; + if(al::strcasecmp(fmt, "fuma") == 0) + { + if(device->mAmbiOrder > 3) + ERR("FuMa is incompatible with %d%s order ambisonics (up to third-order only)\n", + device->mAmbiOrder, + (((device->mAmbiOrder%100)/10) == 1) ? "th" : + ((device->mAmbiOrder%10) == 1) ? "st" : + ((device->mAmbiOrder%10) == 2) ? "nd" : + ((device->mAmbiOrder%10) == 3) ? "rd" : "th"); + else + { + device->mAmbiLayout = AmbiLayout::FuMa; + device->mAmbiScale = AmbiNorm::FuMa; + } + } + else if(al::strcasecmp(fmt, "ambix") == 0 || al::strcasecmp(fmt, "acn+sn3d") == 0) + { + device->mAmbiLayout = AmbiLayout::ACN; + device->mAmbiScale = AmbiNorm::SN3D; + } + else if(al::strcasecmp(fmt, "acn+n3d") == 0) + { + device->mAmbiLayout = AmbiLayout::ACN; + device->mAmbiScale = AmbiNorm::N3D; + } + else + ERR("Unsupported ambi-format: %s\n", fmt); + } + + { + std::lock_guard _{ListLock}; + auto iter = std::lower_bound(DeviceList.cbegin(), DeviceList.cend(), device.get()); + DeviceList.emplace(iter, device.get()); + } + + TRACE("Created device %p, \"%s\"\n", decltype(std::declval()){device.get()}, + device->DeviceName.c_str()); + return device.release(); +} +END_API_FUNC + +/* alcCloseDevice + * + * Closes the given device. + */ +ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) +START_API_FUNC +{ + std::unique_lock listlock{ListLock}; + auto iter = std::lower_bound(DeviceList.begin(), DeviceList.end(), device); + if(iter == DeviceList.end() || *iter != device) + { + alcSetError(nullptr, ALC_INVALID_DEVICE); + return ALC_FALSE; + } + if((*iter)->Type == Capture) + { + alcSetError(*iter, ALC_INVALID_DEVICE); + return ALC_FALSE; + } + + /* Erase the device, and any remaining contexts left on it, from their + * respective lists. + */ + DeviceRef dev{*iter}; + DeviceList.erase(iter); + + std::unique_lock statelock{dev->StateLock}; + al::vector orphanctxs; + for(ALCcontext *ctx : *dev->mContexts.load()) + { + auto ctxiter = std::lower_bound(ContextList.begin(), ContextList.end(), ctx); + if(ctxiter != ContextList.end() && *ctxiter == ctx) + { + orphanctxs.emplace_back(ContextRef{*ctxiter}); + ContextList.erase(ctxiter); + } + } + listlock.unlock(); + + for(ContextRef &context : orphanctxs) + { + WARN("Releasing orphaned context %p\n", decltype(std::declval()){context.get()}); + context->deinit(); + } + orphanctxs.clear(); + + if(dev->Flags.get()) + dev->Backend->stop(); + dev->Flags.unset(); + + return ALC_TRUE; +} +END_API_FUNC + + +/************************************************ + * ALC capture functions + ************************************************/ +ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, ALCuint frequency, ALCenum format, ALCsizei samples) +START_API_FUNC +{ + DO_INITCONFIG(); + + if(!CaptureFactory) + { + alcSetError(nullptr, ALC_INVALID_VALUE); + return nullptr; + } + + if(samples <= 0) + { + alcSetError(nullptr, ALC_INVALID_VALUE); + return nullptr; + } + + if(deviceName) + { + if(!deviceName[0] || al::strcasecmp(deviceName, alcDefaultName) == 0 + || al::strcasecmp(deviceName, "openal-soft") == 0) + deviceName = nullptr; + } + + DeviceRef device{new ALCdevice{Capture}}; + + auto decompfmt = DecomposeDevFormat(format); + if(!decompfmt) + { + alcSetError(nullptr, ALC_INVALID_ENUM); + return nullptr; + } + + device->Frequency = frequency; + device->FmtChans = decompfmt->chans; + device->FmtType = decompfmt->type; + device->Flags.set(); + + device->UpdateSize = static_cast(samples); + device->BufferSize = static_cast(samples); + + try { + TRACE("Capture format: %s, %s, %uhz, %u / %u buffer\n", + DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), + device->Frequency, device->UpdateSize, device->BufferSize); + + auto backend = CaptureFactory->createBackend(device.get(), BackendType::Capture); + backend->open(deviceName); + device->Backend = std::move(backend); + } + catch(al::backend_exception &e) { + WARN("Failed to open capture device: %s\n", e.what()); + alcSetError(nullptr, e.errorCode()); + return nullptr; + } + + { + std::lock_guard _{ListLock}; + auto iter = std::lower_bound(DeviceList.cbegin(), DeviceList.cend(), device.get()); + DeviceList.emplace(iter, device.get()); + } + + TRACE("Created capture device %p, \"%s\"\n", decltype(std::declval()){device.get()}, + device->DeviceName.c_str()); + return device.release(); +} +END_API_FUNC + +ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device) +START_API_FUNC +{ + std::unique_lock listlock{ListLock}; + auto iter = std::lower_bound(DeviceList.begin(), DeviceList.end(), device); + if(iter == DeviceList.end() || *iter != device) + { + alcSetError(nullptr, ALC_INVALID_DEVICE); + return ALC_FALSE; + } + if((*iter)->Type != Capture) + { + alcSetError(*iter, ALC_INVALID_DEVICE); + return ALC_FALSE; + } + + DeviceRef dev{*iter}; + DeviceList.erase(iter); + listlock.unlock(); + + std::lock_guard _{dev->StateLock}; + if(dev->Flags.get()) + dev->Backend->stop(); + dev->Flags.unset(); + + return ALC_TRUE; +} +END_API_FUNC + +ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Capture) + { + alcSetError(dev.get(), ALC_INVALID_DEVICE); + return; + } + + std::lock_guard _{dev->StateLock}; + if(!dev->Connected.load(std::memory_order_acquire)) + alcSetError(dev.get(), ALC_INVALID_DEVICE); + else if(!dev->Flags.get()) + { + try { + auto backend = dev->Backend.get(); + if(!backend->start()) + throw al::backend_exception{ALC_INVALID_DEVICE, "Device start failure"}; + dev->Flags.set(); + } + catch(al::backend_exception& e) { + aluHandleDisconnect(dev.get(), "%s", e.what()); + alcSetError(dev.get(), ALC_INVALID_DEVICE); + } + } +} +END_API_FUNC + +ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Capture) + alcSetError(dev.get(), ALC_INVALID_DEVICE); + else + { + std::lock_guard _{dev->StateLock}; + if(dev->Flags.get()) + dev->Backend->stop(); + dev->Flags.unset(); + } +} +END_API_FUNC + +ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Capture) + { + alcSetError(dev.get(), ALC_INVALID_DEVICE); + return; + } + + if(samples < 0 || (samples > 0 && buffer == nullptr)) + { + alcSetError(dev.get(), ALC_INVALID_VALUE); + return; + } + if(samples < 1) + return; + + std::lock_guard _{dev->StateLock}; + BackendBase *backend{dev->Backend.get()}; + + const auto usamples = static_cast(samples); + if(usamples > backend->availableSamples()) + { + alcSetError(dev.get(), ALC_INVALID_VALUE); + return; + } + + auto *bbuffer = static_cast(buffer); + if(ALCenum err{backend->captureSamples(bbuffer, usamples)}) + alcSetError(dev.get(), err); +} +END_API_FUNC + + +/************************************************ + * ALC loopback functions + ************************************************/ + +/* alcLoopbackOpenDeviceSOFT + * + * Open a loopback device, for manual rendering. + */ +ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName) +START_API_FUNC +{ + DO_INITCONFIG(); + + /* Make sure the device name, if specified, is us. */ + if(deviceName && strcmp(deviceName, alcDefaultName) != 0) + { + alcSetError(nullptr, ALC_INVALID_VALUE); + return nullptr; + } + + DeviceRef device{new ALCdevice{Loopback}}; + + device->SourcesMax = 256; + device->AuxiliaryEffectSlotMax = 64; + device->NumAuxSends = DEFAULT_SENDS; + + //Set output format + device->BufferSize = 0; + device->UpdateSize = 0; + + device->Frequency = DEFAULT_OUTPUT_RATE; + device->FmtChans = DevFmtChannelsDefault; + device->FmtType = DevFmtTypeDefault; + + if(auto srcsopt = ConfigValueUInt(nullptr, nullptr, "sources")) + { + if(*srcsopt > 0) device->SourcesMax = *srcsopt; + } + + if(auto slotsopt = ConfigValueUInt(nullptr, nullptr, "slots")) + { + if(*slotsopt > 0) + device->AuxiliaryEffectSlotMax = minu(*slotsopt, INT_MAX); + } + + if(auto sendsopt = ConfigValueInt(nullptr, nullptr, "sends")) + device->NumAuxSends = clampu(DEFAULT_SENDS, 0, + static_cast(clampi(*sendsopt, 0, MAX_SENDS))); + + device->NumStereoSources = 1; + device->NumMonoSources = device->SourcesMax - device->NumStereoSources; + + try { + auto backend = LoopbackBackendFactory::getFactory().createBackend(device.get(), + BackendType::Playback); + backend->open("Loopback"); + device->Backend = std::move(backend); + } + catch(al::backend_exception &e) { + WARN("Failed to open loopback device: %s\n", e.what()); + alcSetError(nullptr, e.errorCode()); + return nullptr; + } + + { + std::lock_guard _{ListLock}; + auto iter = std::lower_bound(DeviceList.cbegin(), DeviceList.cend(), device.get()); + DeviceList.emplace(iter, device.get()); + } + + TRACE("Created loopback device %p\n", decltype(std::declval()){device.get()}); + return device.release(); +} +END_API_FUNC + +/* alcIsRenderFormatSupportedSOFT + * + * Determines if the loopback device supports the given format for rendering. + */ +ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Loopback) + alcSetError(dev.get(), ALC_INVALID_DEVICE); + else if(freq <= 0) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else + { + if(IsValidALCType(type) && IsValidALCChannels(channels) && freq >= MIN_OUTPUT_RATE) + return ALC_TRUE; + } + + return ALC_FALSE; +} +END_API_FUNC + +/* alcRenderSamplesSOFT + * + * Renders some samples into a buffer, using the format last set by the + * attributes given to alcCreateContext. + */ +FORCE_ALIGN ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Loopback) + alcSetError(dev.get(), ALC_INVALID_DEVICE); + else if(samples < 0 || (samples > 0 && buffer == nullptr)) + alcSetError(dev.get(), ALC_INVALID_VALUE); + else + { + BackendLockGuard _{*dev->Backend}; + aluMixData(dev.get(), buffer, static_cast(samples), dev->channelsFromFmt()); + } +} +END_API_FUNC + + +/************************************************ + * ALC DSP pause/resume functions + ************************************************/ + +/* alcDevicePauseSOFT + * + * Pause the DSP to stop audio processing. + */ +ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Playback) + alcSetError(dev.get(), ALC_INVALID_DEVICE); + else + { + std::lock_guard _{dev->StateLock}; + if(dev->Flags.get()) + dev->Backend->stop(); + dev->Flags.unset(); + dev->Flags.set(); + } +} +END_API_FUNC + +/* alcDeviceResumeSOFT + * + * Resume the DSP to restart audio processing. + */ +ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type != Playback) + { + alcSetError(dev.get(), ALC_INVALID_DEVICE); + return; + } + + std::lock_guard _{dev->StateLock}; + if(!dev->Flags.get()) + return; + dev->Flags.unset(); + if(dev->mContexts.load()->empty()) + return; + + try { + auto backend = dev->Backend.get(); + if(!backend->start()) + throw al::backend_exception{ALC_INVALID_DEVICE, "Device start failure"}; + dev->Flags.set(); + } + catch(al::backend_exception& e) { + aluHandleDisconnect(dev.get(), "%s", e.what()); + alcSetError(dev.get(), ALC_INVALID_DEVICE); + } +} +END_API_FUNC + + +/************************************************ + * ALC HRTF functions + ************************************************/ + +/* alcGetStringiSOFT + * + * Gets a string parameter at the given index. + */ +ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum paramName, ALCsizei index) +START_API_FUNC +{ + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type == Capture) + alcSetError(dev.get(), ALC_INVALID_DEVICE); + else switch(paramName) + { + case ALC_HRTF_SPECIFIER_SOFT: + if(index >= 0 && static_cast(index) < dev->HrtfList.size()) + return dev->HrtfList[static_cast(index)].c_str(); + alcSetError(dev.get(), ALC_INVALID_VALUE); + break; + + default: + alcSetError(dev.get(), ALC_INVALID_ENUM); + break; + } + + return nullptr; +} +END_API_FUNC + +/* alcResetDeviceSOFT + * + * Resets the given device output, using the specified attribute list. + */ +ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs) +START_API_FUNC +{ + std::unique_lock listlock{ListLock}; + DeviceRef dev{VerifyDevice(device)}; + if(!dev || dev->Type == Capture) + { + listlock.unlock(); + alcSetError(dev.get(), ALC_INVALID_DEVICE); + return ALC_FALSE; + } + std::lock_guard _{dev->StateLock}; + listlock.unlock(); + + /* Force the backend to stop mixing first since we're resetting. Also reset + * the connected state so lost devices can attempt recover. + */ + if(dev->Flags.get()) + dev->Backend->stop(); + dev->Flags.unset(); + device->Connected.store(true); + + ALCenum err{UpdateDeviceParams(dev.get(), attribs)}; + if LIKELY(err == ALC_NO_ERROR) return ALC_TRUE; + + alcSetError(dev.get(), err); + if(err == ALC_INVALID_DEVICE) + aluHandleDisconnect(dev.get(), "Device start failure"); + return ALC_FALSE; +} +END_API_FUNC diff --git a/alc/alcmain.h b/alc/alcmain.h new file mode 100644 index 0000000..673997d --- /dev/null +++ b/alc/alcmain.h @@ -0,0 +1,399 @@ +#ifndef ALC_MAIN_H +#define ALC_MAIN_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" + +#include "albyte.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alspan.h" +#include "ambidefs.h" +#include "atomic.h" +#include "devformat.h" +#include "filters/splitter.h" +#include "hrtf.h" +#include "inprogext.h" +#include "intrusive_ptr.h" +#include "vector.h" + +class BFormatDec; +struct ALbuffer; +struct ALeffect; +struct ALfilter; +struct BackendBase; +struct Compressor; +struct EffectState; +struct Uhj2Encoder; +struct bs2b; + + +#define MIN_OUTPUT_RATE 8000 +#define DEFAULT_OUTPUT_RATE 44100 +#define DEFAULT_UPDATE_SIZE 882 /* 20ms */ +#define DEFAULT_NUM_UPDATES 3 + + +enum DeviceType { + Playback, + Capture, + Loopback +}; + + +enum RenderMode { + NormalRender, + StereoPair, + HrtfRender +}; + + +struct InputRemixMap { + struct TargetMix { Channel channel; float mix; }; + + Channel channel; + std::array targets; +}; + + +struct BufferSubList { + uint64_t FreeMask{~0_u64}; + ALbuffer *Buffers{nullptr}; /* 64 */ + + BufferSubList() noexcept = default; + BufferSubList(const BufferSubList&) = delete; + BufferSubList(BufferSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Buffers{rhs.Buffers} + { rhs.FreeMask = ~0_u64; rhs.Buffers = nullptr; } + ~BufferSubList(); + + BufferSubList& operator=(const BufferSubList&) = delete; + BufferSubList& operator=(BufferSubList&& rhs) noexcept + { std::swap(FreeMask, rhs.FreeMask); std::swap(Buffers, rhs.Buffers); return *this; } +}; + +struct EffectSubList { + uint64_t FreeMask{~0_u64}; + ALeffect *Effects{nullptr}; /* 64 */ + + EffectSubList() noexcept = default; + EffectSubList(const EffectSubList&) = delete; + EffectSubList(EffectSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Effects{rhs.Effects} + { rhs.FreeMask = ~0_u64; rhs.Effects = nullptr; } + ~EffectSubList(); + + EffectSubList& operator=(const EffectSubList&) = delete; + EffectSubList& operator=(EffectSubList&& rhs) noexcept + { std::swap(FreeMask, rhs.FreeMask); std::swap(Effects, rhs.Effects); return *this; } +}; + +struct FilterSubList { + uint64_t FreeMask{~0_u64}; + ALfilter *Filters{nullptr}; /* 64 */ + + FilterSubList() noexcept = default; + FilterSubList(const FilterSubList&) = delete; + FilterSubList(FilterSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Filters{rhs.Filters} + { rhs.FreeMask = ~0_u64; rhs.Filters = nullptr; } + ~FilterSubList(); + + FilterSubList& operator=(const FilterSubList&) = delete; + FilterSubList& operator=(FilterSubList&& rhs) noexcept + { std::swap(FreeMask, rhs.FreeMask); std::swap(Filters, rhs.Filters); return *this; } +}; + + +/* Maximum delay in samples for speaker distance compensation. */ +#define MAX_DELAY_LENGTH 1024 + +class DistanceComp { +public: + struct DistData { + ALfloat Gain{1.0f}; + ALuint Length{0u}; /* Valid range is [0...MAX_DELAY_LENGTH). */ + ALfloat *Buffer{nullptr}; + }; + +private: + std::array mChannels; + al::vector mSamples; + +public: + void setSampleCount(size_t new_size) { mSamples.resize(new_size); } + void clear() noexcept + { + for(auto &chan : mChannels) + { + chan.Gain = 1.0f; + chan.Length = 0; + chan.Buffer = nullptr; + } + using SampleVecT = decltype(mSamples); + SampleVecT{}.swap(mSamples); + } + + ALfloat *getSamples() noexcept { return mSamples.data(); } + + al::span as_span() { return mChannels; } +}; + +struct BFChannelConfig { + ALfloat Scale; + ALuint Index; +}; + +/* Size for temporary storage of buffer data, in ALfloats. Larger values need + * more memory, while smaller values may need more iterations. The value needs + * to be a sensible size, however, as it constrains the max stepping value used + * for mixing, as well as the maximum number of samples per mixing iteration. + */ +#define BUFFERSIZE 1024 + +using FloatBufferLine = std::array; + +/* Maximum number of samples to pad on the ends of a buffer for resampling. + * Note that the padding is symmetric (half at the beginning and half at the + * end)! + */ +#define MAX_RESAMPLER_PADDING 48 + + +struct FrontStablizer { + static constexpr size_t DelayLength{256u}; + + alignas(16) float DelayBuf[MAX_OUTPUT_CHANNELS][DelayLength]; + + BandSplitter LFilter, RFilter; + alignas(16) float LSplit[2][BUFFERSIZE]; + alignas(16) float RSplit[2][BUFFERSIZE]; + + alignas(16) float TempBuf[BUFFERSIZE + DelayLength]; + + DEF_NEWDEL(FrontStablizer) +}; + + +struct MixParams { + /* Coefficient channel mapping for mixing to the buffer. */ + std::array AmbiMap{}; + + al::span Buffer; +}; + +struct RealMixParams { + al::span RemixMap; + std::array ChannelIndex{}; + + al::span Buffer; +}; + +enum { + // Frequency was requested by the app or config file + FrequencyRequest, + // Channel configuration was requested by the config file + ChannelsRequest, + // Sample type was requested by the config file + SampleTypeRequest, + + // Specifies if the DSP is paused at user request + DevicePaused, + // Specifies if the device is currently running + DeviceRunning, + + DeviceFlagsCount +}; + +struct ALCdevice : public al::intrusive_ref { + std::atomic Connected{true}; + const DeviceType Type{}; + + ALuint Frequency{}; + ALuint UpdateSize{}; + ALuint BufferSize{}; + + DevFmtChannels FmtChans{}; + DevFmtType FmtType{}; + ALboolean IsHeadphones{AL_FALSE}; + ALuint mAmbiOrder{0}; + /* For DevFmtAmbi* output only, specifies the channel order and + * normalization. + */ + AmbiLayout mAmbiLayout{AmbiLayout::Default}; + AmbiNorm mAmbiScale{AmbiNorm::Default}; + + ALCenum LimiterState{ALC_DONT_CARE_SOFT}; + + std::string DeviceName; + + // Device flags + al::bitfield Flags{}; + + std::string HrtfName; + al::vector HrtfList; + ALCenum HrtfStatus{ALC_FALSE}; + + std::atomic LastError{ALC_NO_ERROR}; + + // Maximum number of sources that can be created + ALuint SourcesMax{}; + // Maximum number of slots that can be created + ALuint AuxiliaryEffectSlotMax{}; + + ALCuint NumMonoSources{}; + ALCuint NumStereoSources{}; + ALCuint NumAuxSends{}; + + // Map of Buffers for this device + std::mutex BufferLock; + al::vector BufferList; + + // Map of Effects for this device + std::mutex EffectLock; + al::vector EffectList; + + // Map of Filters for this device + std::mutex FilterLock; + al::vector FilterList; + + /* Rendering mode. */ + RenderMode mRenderMode{NormalRender}; + + /* The average speaker distance as determined by the ambdec configuration, + * HRTF data set, or the NFC-HOA reference delay. Only used for NFC. + */ + ALfloat AvgSpeakerDist{0.0f}; + + ALuint SamplesDone{0u}; + std::chrono::nanoseconds ClockBase{0}; + std::chrono::nanoseconds FixedLatency{0}; + + /* Temp storage used for mixer processing. */ + alignas(16) ALfloat SourceData[BUFFERSIZE + MAX_RESAMPLER_PADDING]; + alignas(16) ALfloat ResampledData[BUFFERSIZE]; + alignas(16) ALfloat FilteredData[BUFFERSIZE]; + union { + alignas(16) ALfloat HrtfSourceData[BUFFERSIZE + HRTF_HISTORY_LENGTH]; + alignas(16) ALfloat NfcSampleData[BUFFERSIZE]; + }; + + /* Persistent storage for HRTF mixing. */ + alignas(16) float2 HrtfAccumData[BUFFERSIZE + HRIR_LENGTH]; + + /* Mixing buffer used by the Dry mix and Real output. */ + al::vector MixBuffer; + + /* The "dry" path corresponds to the main output. */ + MixParams Dry; + ALuint NumChannelsPerOrder[MAX_AMBI_ORDER+1]{}; + + /* "Real" output, which will be written to the device buffer. May alias the + * dry buffer. + */ + RealMixParams RealOut; + + /* HRTF state and info */ + std::unique_ptr mHrtfState; + HrtfStore *mHrtf{nullptr}; + + /* Ambisonic-to-UHJ encoder */ + std::unique_ptr Uhj_Encoder; + + /* Ambisonic decoder for speakers */ + std::unique_ptr AmbiDecoder; + + /* Stereo-to-binaural filter */ + std::unique_ptr Bs2b; + + using PostProc = void(ALCdevice::*)(const size_t SamplesToDo); + PostProc PostProcess{nullptr}; + + std::unique_ptr Stablizer; + + std::unique_ptr Limiter; + + /* Delay buffers used to compensate for speaker distances. */ + DistanceComp ChannelDelay; + + /* Dithering control. */ + ALfloat DitherDepth{0.0f}; + ALuint DitherSeed{0u}; + + /* Running count of the mixer invocations, in 31.1 fixed point. This + * actually increments *twice* when mixing, first at the start and then at + * the end, so the bottom bit indicates if the device is currently mixing + * and the upper bits indicates how many mixes have been done. + */ + RefCount MixCount{0u}; + + // Contexts created on this device + std::atomic*> mContexts{nullptr}; + + /* This lock protects the device state (format, update size, etc) from + * being from being changed in multiple threads, or being accessed while + * being changed. It's also used to serialize calls to the backend. + */ + std::mutex StateLock; + std::unique_ptr Backend; + + + ALCdevice(DeviceType type); + ALCdevice(const ALCdevice&) = delete; + ALCdevice& operator=(const ALCdevice&) = delete; + ~ALCdevice(); + + ALuint bytesFromFmt() const noexcept { return BytesFromDevFmt(FmtType); } + ALuint channelsFromFmt() const noexcept { return ChannelsFromDevFmt(FmtChans, mAmbiOrder); } + ALuint frameSizeFromFmt() const noexcept { return bytesFromFmt() * channelsFromFmt(); } + + void ProcessHrtf(const size_t SamplesToDo); + void ProcessAmbiDec(const size_t SamplesToDo); + void ProcessUhj(const size_t SamplesToDo); + void ProcessBs2b(const size_t SamplesToDo); + + inline void postProcess(const size_t SamplesToDo) + { if LIKELY(PostProcess) (this->*PostProcess)(SamplesToDo); } + + DEF_NEWDEL(ALCdevice) +}; + +/* Must be less than 15 characters (16 including terminating null) for + * compatibility with pthread_setname_np limitations. */ +#define MIXER_THREAD_NAME "alsoft-mixer" + +#define RECORD_THREAD_NAME "alsoft-record" + + +extern ALint RTPrioLevel; +void SetRTPriority(void); + +void SetDefaultChannelOrder(ALCdevice *device); +void SetDefaultWFXChannelOrder(ALCdevice *device); + +const ALCchar *DevFmtTypeString(DevFmtType type) noexcept; +const ALCchar *DevFmtChannelsString(DevFmtChannels chans) noexcept; + +/** + * GetChannelIdxByName + * + * Returns the index for the given channel name (e.g. FrontCenter), or + * INVALID_CHANNEL_INDEX if it doesn't exist. + */ +inline ALuint GetChannelIdxByName(const RealMixParams &real, Channel chan) noexcept +{ return real.ChannelIndex[chan]; } +#define INVALID_CHANNEL_INDEX ~0u + + +al::vector SearchDataFiles(const char *match, const char *subdir); + +#endif diff --git a/alc/alconfig.cpp b/alc/alconfig.cpp new file mode 100644 index 0000000..dfafa23 --- /dev/null +++ b/alc/alconfig.cpp @@ -0,0 +1,550 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#ifdef _WIN32 +#ifdef __MINGW32__ +#define _WIN32_IE 0x501 +#else +#define _WIN32_IE 0x400 +#endif +#endif + +#include "config.h" + +#include "alconfig.h" + +#include +#include +#include +#ifdef _WIN32_IE +#include +#include +#endif +#ifdef __APPLE__ +#include +#endif + +#include +#include +#include +#include + +#include "alfstream.h" +#include "alstring.h" +#include "compat.h" +#include "logging.h" +#include "strutils.h" +#include "vector.h" + + +namespace { + +struct ConfigEntry { + std::string key; + std::string value; +}; +al::vector ConfOpts; + + +std::string &lstrip(std::string &line) +{ + size_t pos{0}; + while(pos < line.length() && std::isspace(line[pos])) + ++pos; + line.erase(0, pos); + return line; +} + +bool readline(std::istream &f, std::string &output) +{ + while(f.good() && f.peek() == '\n') + f.ignore(); + + return std::getline(f, output) && !output.empty(); +} + +std::string expdup(const char *str) +{ + std::string output; + + std::string envval; + while(*str != '\0') + { + const char *addstr; + size_t addstrlen; + + if(str[0] != '$') + { + const char *next = std::strchr(str, '$'); + addstr = str; + addstrlen = next ? static_cast(next-str) : std::strlen(str); + + str += addstrlen; + } + else + { + str++; + if(*str == '$') + { + const char *next = std::strchr(str+1, '$'); + addstr = str; + addstrlen = next ? static_cast(next-str) : std::strlen(str); + + str += addstrlen; + } + else + { + const bool hasbraces{(*str == '{')}; + + if(hasbraces) str++; + const char *envstart = str; + while(std::isalnum(*str) || *str == '_') + ++str; + if(hasbraces && *str != '}') + continue; + const std::string envname{envstart, str}; + if(hasbraces) str++; + + envval = al::getenv(envname.c_str()).value_or(std::string{}); + addstr = envval.data(); + addstrlen = envval.length(); + } + } + if(addstrlen == 0) + continue; + + output.append(addstr, addstrlen); + } + + return output; +} + +void LoadConfigFromFile(std::istream &f) +{ + std::string curSection; + std::string buffer; + + while(readline(f, buffer)) + { + if(lstrip(buffer).empty()) + continue; + + if(buffer[0] == '[') + { + char *line{&buffer[0]}; + char *section = line+1; + char *endsection; + + endsection = std::strchr(section, ']'); + if(!endsection || section == endsection) + { + ERR(" config parse error: bad line \"%s\"\n", line); + continue; + } + if(endsection[1] != 0) + { + char *end = endsection+1; + while(std::isspace(*end)) + ++end; + if(*end != 0 && *end != '#') + { + ERR(" config parse error: bad line \"%s\"\n", line); + continue; + } + } + *endsection = 0; + + curSection.clear(); + if(al::strcasecmp(section, "general") != 0) + { + do { + char *nextp = std::strchr(section, '%'); + if(!nextp) + { + curSection += section; + break; + } + + curSection.append(section, nextp); + section = nextp; + + if(((section[1] >= '0' && section[1] <= '9') || + (section[1] >= 'a' && section[1] <= 'f') || + (section[1] >= 'A' && section[1] <= 'F')) && + ((section[2] >= '0' && section[2] <= '9') || + (section[2] >= 'a' && section[2] <= 'f') || + (section[2] >= 'A' && section[2] <= 'F'))) + { + int b{0}; + if(section[1] >= '0' && section[1] <= '9') + b = (section[1]-'0') << 4; + else if(section[1] >= 'a' && section[1] <= 'f') + b = (section[1]-'a'+0xa) << 4; + else if(section[1] >= 'A' && section[1] <= 'F') + b = (section[1]-'A'+0x0a) << 4; + if(section[2] >= '0' && section[2] <= '9') + b |= (section[2]-'0'); + else if(section[2] >= 'a' && section[2] <= 'f') + b |= (section[2]-'a'+0xa); + else if(section[2] >= 'A' && section[2] <= 'F') + b |= (section[2]-'A'+0x0a); + curSection += static_cast(b); + section += 3; + } + else if(section[1] == '%') + { + curSection += '%'; + section += 2; + } + else + { + curSection += '%'; + section += 1; + } + } while(*section != 0); + } + + continue; + } + + auto cmtpos = std::min(buffer.find('#'), buffer.size()); + while(cmtpos > 0 && std::isspace(buffer[cmtpos-1])) + --cmtpos; + if(!cmtpos) continue; + buffer.erase(cmtpos); + + auto sep = buffer.find('='); + if(sep == std::string::npos) + { + ERR(" config parse error: malformed option line: \"%s\"\n", buffer.c_str()); + continue; + } + auto keyend = sep++; + while(keyend > 0 && std::isspace(buffer[keyend-1])) + --keyend; + if(!keyend) + { + ERR(" config parse error: malformed option line: \"%s\"\n", buffer.c_str()); + continue; + } + while(sep < buffer.size() && std::isspace(buffer[sep])) + sep++; + + std::string fullKey; + if(!curSection.empty()) + { + fullKey += curSection; + fullKey += '/'; + } + fullKey += buffer.substr(0u, keyend); + + std::string value{(sep < buffer.size()) ? buffer.substr(sep) : std::string{}}; + if(value.size() > 1) + { + if((value.front() == '"' && value.back() == '"') + || (value.front() == '\'' && value.back() == '\'')) + { + value.pop_back(); + value.erase(value.begin()); + } + } + + TRACE(" found '%s' = '%s'\n", fullKey.c_str(), value.c_str()); + + /* Check if we already have this option set */ + auto find_key = [&fullKey](const ConfigEntry &entry) -> bool + { return entry.key == fullKey; }; + auto ent = std::find_if(ConfOpts.begin(), ConfOpts.end(), find_key); + if(ent != ConfOpts.end()) + { + if(!value.empty()) + ent->value = expdup(value.c_str()); + else + ConfOpts.erase(ent); + } + else if(!value.empty()) + ConfOpts.emplace_back(ConfigEntry{std::move(fullKey), expdup(value.c_str())}); + } + ConfOpts.shrink_to_fit(); +} + +} // namespace + + +#ifdef _WIN32 +void ReadALConfig() +{ + WCHAR buffer[MAX_PATH]; + if(SHGetSpecialFolderPathW(nullptr, buffer, CSIDL_APPDATA, FALSE) != FALSE) + { + std::string filepath{wstr_to_utf8(buffer)}; + filepath += "\\alsoft.ini"; + + TRACE("Loading config %s...\n", filepath.c_str()); + al::ifstream f{filepath}; + if(f.is_open()) + LoadConfigFromFile(f); + } + + std::string ppath{GetProcBinary().path}; + if(!ppath.empty()) + { + ppath += "\\alsoft.ini"; + TRACE("Loading config %s...\n", ppath.c_str()); + al::ifstream f{ppath}; + if(f.is_open()) + LoadConfigFromFile(f); + } + + if(auto confpath = al::getenv(L"ALSOFT_CONF")) + { + TRACE("Loading config %s...\n", wstr_to_utf8(confpath->c_str()).c_str()); + al::ifstream f{*confpath}; + if(f.is_open()) + LoadConfigFromFile(f); + } +} + +#else + +void ReadALConfig() +{ + const char *str{"/etc/openal/alsoft.conf"}; + + TRACE("Loading config %s...\n", str); + al::ifstream f{str}; + if(f.is_open()) + LoadConfigFromFile(f); + f.close(); + + std::string confpaths{al::getenv("XDG_CONFIG_DIRS").value_or("/etc/xdg")}; + /* Go through the list in reverse, since "the order of base directories + * denotes their importance; the first directory listed is the most + * important". Ergo, we need to load the settings from the later dirs + * first so that the settings in the earlier dirs override them. + */ + std::string fname; + while(!confpaths.empty()) + { + auto next = confpaths.find_last_of(':'); + if(next < confpaths.length()) + { + fname = confpaths.substr(next+1); + confpaths.erase(next); + } + else + { + fname = confpaths; + confpaths.clear(); + } + + if(fname.empty() || fname.front() != '/') + WARN("Ignoring XDG config dir: %s\n", fname.c_str()); + else + { + if(fname.back() != '/') fname += "/alsoft.conf"; + else fname += "alsoft.conf"; + + TRACE("Loading config %s...\n", fname.c_str()); + f = al::ifstream{fname}; + if(f.is_open()) + LoadConfigFromFile(f); + } + fname.clear(); + } + +#ifdef __APPLE__ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + if(mainBundle) + { + unsigned char fileName[PATH_MAX]; + CFURLRef configURL; + + if((configURL=CFBundleCopyResourceURL(mainBundle, CFSTR(".alsoftrc"), CFSTR(""), nullptr)) && + CFURLGetFileSystemRepresentation(configURL, true, fileName, sizeof(fileName))) + { + f = al::ifstream{reinterpret_cast(fileName)}; + if(f.is_open()) + LoadConfigFromFile(f); + } + } +#endif + + if(auto homedir = al::getenv("HOME")) + { + fname = *homedir; + if(fname.back() != '/') fname += "/.alsoftrc"; + else fname += ".alsoftrc"; + + TRACE("Loading config %s...\n", fname.c_str()); + f = al::ifstream{fname}; + if(f.is_open()) + LoadConfigFromFile(f); + } + + if(auto configdir = al::getenv("XDG_CONFIG_HOME")) + { + fname = *configdir; + if(fname.back() != '/') fname += "/alsoft.conf"; + else fname += "alsoft.conf"; + } + else + { + fname.clear(); + if(auto homedir = al::getenv("HOME")) + { + fname = *homedir; + if(fname.back() != '/') fname += "/.config/alsoft.conf"; + else fname += ".config/alsoft.conf"; + } + } + if(!fname.empty()) + { + TRACE("Loading config %s...\n", fname.c_str()); + f = al::ifstream{fname}; + if(f.is_open()) + LoadConfigFromFile(f); + } + + std::string ppath{GetProcBinary().path}; + if(!ppath.empty()) + { + if(ppath.back() != '/') ppath += "/alsoft.conf"; + else ppath += "alsoft.conf"; + + TRACE("Loading config %s...\n", ppath.c_str()); + f = al::ifstream{ppath}; + if(f.is_open()) + LoadConfigFromFile(f); + } + + if(auto confname = al::getenv("ALSOFT_CONF")) + { + TRACE("Loading config %s...\n", confname->c_str()); + f = al::ifstream{*confname}; + if(f.is_open()) + LoadConfigFromFile(f); + } +} +#endif + +const char *GetConfigValue(const char *devName, const char *blockName, const char *keyName, const char *def) +{ + if(!keyName) + return def; + + std::string key; + if(blockName && al::strcasecmp(blockName, "general") != 0) + { + key = blockName; + if(devName) + { + key += '/'; + key += devName; + } + key += '/'; + key += keyName; + } + else + { + if(devName) + { + key = devName; + key += '/'; + } + key += keyName; + } + + auto iter = std::find_if(ConfOpts.cbegin(), ConfOpts.cend(), + [&key](const ConfigEntry &entry) -> bool + { return entry.key == key; } + ); + if(iter != ConfOpts.cend()) + { + TRACE("Found %s = \"%s\"\n", key.c_str(), iter->value.c_str()); + if(!iter->value.empty()) + return iter->value.c_str(); + return def; + } + + if(!devName) + { + TRACE("Key %s not found\n", key.c_str()); + return def; + } + return GetConfigValue(nullptr, blockName, keyName, def); +} + +int ConfigValueExists(const char *devName, const char *blockName, const char *keyName) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + return val[0] != 0; +} + +al::optional ConfigValueStr(const char *devName, const char *blockName, const char *keyName) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + if(!val[0]) return al::nullopt; + + return al::make_optional(val); +} + +al::optional ConfigValueInt(const char *devName, const char *blockName, const char *keyName) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + if(!val[0]) return al::nullopt; + + return al::make_optional(static_cast(std::strtol(val, nullptr, 0))); +} + +al::optional ConfigValueUInt(const char *devName, const char *blockName, const char *keyName) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + if(!val[0]) return al::nullopt; + + return al::make_optional(static_cast(std::strtoul(val, nullptr, 0))); +} + +al::optional ConfigValueFloat(const char *devName, const char *blockName, const char *keyName) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + if(!val[0]) return al::nullopt; + + return al::make_optional(std::strtof(val, nullptr)); +} + +al::optional ConfigValueBool(const char *devName, const char *blockName, const char *keyName) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + if(!val[0]) return al::nullopt; + + return al::make_optional( + al::strcasecmp(val, "true") == 0 || al::strcasecmp(val, "yes") == 0 || + al::strcasecmp(val, "on") == 0 || atoi(val) != 0); +} + +int GetConfigValueBool(const char *devName, const char *blockName, const char *keyName, int def) +{ + const char *val = GetConfigValue(devName, blockName, keyName, ""); + + if(!val[0]) return def != 0; + return (al::strcasecmp(val, "true") == 0 || al::strcasecmp(val, "yes") == 0 || + al::strcasecmp(val, "on") == 0 || atoi(val) != 0); +} diff --git a/alc/alconfig.h b/alc/alconfig.h new file mode 100644 index 0000000..ffc7ada --- /dev/null +++ b/alc/alconfig.h @@ -0,0 +1,20 @@ +#ifndef ALCONFIG_H +#define ALCONFIG_H + +#include + +#include "aloptional.h" + +void ReadALConfig(); + +int ConfigValueExists(const char *devName, const char *blockName, const char *keyName); +const char *GetConfigValue(const char *devName, const char *blockName, const char *keyName, const char *def); +int GetConfigValueBool(const char *devName, const char *blockName, const char *keyName, int def); + +al::optional ConfigValueStr(const char *devName, const char *blockName, const char *keyName); +al::optional ConfigValueInt(const char *devName, const char *blockName, const char *keyName); +al::optional ConfigValueUInt(const char *devName, const char *blockName, const char *keyName); +al::optional ConfigValueFloat(const char *devName, const char *blockName, const char *keyName); +al::optional ConfigValueBool(const char *devName, const char *blockName, const char *keyName); + +#endif /* ALCONFIG_H */ diff --git a/alc/alcontext.h b/alc/alcontext.h new file mode 100644 index 0000000..ba3942f --- /dev/null +++ b/alc/alcontext.h @@ -0,0 +1,196 @@ +#ifndef ALCONTEXT_H +#define ALCONTEXT_H + +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" + +#include "al/listener.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alu.h" +#include "atomic.h" +#include "inprogext.h" +#include "intrusive_ptr.h" +#include "logging.h" +#include "threads.h" +#include "vector.h" +#include "voice.h" + +struct ALeffectslot; +struct ALeffectslotProps; +struct ALsource; +struct RingBuffer; + + +enum class DistanceModel { + InverseClamped = AL_INVERSE_DISTANCE_CLAMPED, + LinearClamped = AL_LINEAR_DISTANCE_CLAMPED, + ExponentClamped = AL_EXPONENT_DISTANCE_CLAMPED, + Inverse = AL_INVERSE_DISTANCE, + Linear = AL_LINEAR_DISTANCE, + Exponent = AL_EXPONENT_DISTANCE, + Disable = AL_NONE, + + Default = InverseClamped +}; + + +struct ALcontextProps { + ALfloat DopplerFactor; + ALfloat DopplerVelocity; + ALfloat SpeedOfSound; + ALboolean SourceDistanceModel; + DistanceModel mDistanceModel; + + std::atomic next; + + DEF_NEWDEL(ALcontextProps) +}; + + +struct SourceSubList { + uint64_t FreeMask{~0_u64}; + ALsource *Sources{nullptr}; /* 64 */ + + SourceSubList() noexcept = default; + SourceSubList(const SourceSubList&) = delete; + SourceSubList(SourceSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Sources{rhs.Sources} + { rhs.FreeMask = ~0_u64; rhs.Sources = nullptr; } + ~SourceSubList(); + + SourceSubList& operator=(const SourceSubList&) = delete; + SourceSubList& operator=(SourceSubList&& rhs) noexcept + { std::swap(FreeMask, rhs.FreeMask); std::swap(Sources, rhs.Sources); return *this; } +}; + +struct EffectSlotSubList { + uint64_t FreeMask{~0_u64}; + ALeffectslot *EffectSlots{nullptr}; /* 64 */ + + EffectSlotSubList() noexcept = default; + EffectSlotSubList(const EffectSlotSubList&) = delete; + EffectSlotSubList(EffectSlotSubList&& rhs) noexcept + : FreeMask{rhs.FreeMask}, EffectSlots{rhs.EffectSlots} + { rhs.FreeMask = ~0_u64; rhs.EffectSlots = nullptr; } + ~EffectSlotSubList(); + + EffectSlotSubList& operator=(const EffectSlotSubList&) = delete; + EffectSlotSubList& operator=(EffectSlotSubList&& rhs) noexcept + { std::swap(FreeMask, rhs.FreeMask); std::swap(EffectSlots, rhs.EffectSlots); return *this; } +}; + +struct ALCcontext : public al::intrusive_ref { + al::vector mSourceList; + ALuint mNumSources{0}; + std::mutex mSourceLock; + + al::vector mEffectSlotList; + ALuint mNumEffectSlots{0u}; + std::mutex mEffectSlotLock; + + std::atomic mLastError{AL_NO_ERROR}; + + DistanceModel mDistanceModel{DistanceModel::Default}; + ALboolean mSourceDistanceModel{AL_FALSE}; + + ALfloat mDopplerFactor{1.0f}; + ALfloat mDopplerVelocity{1.0f}; + ALfloat mSpeedOfSound{SPEEDOFSOUNDMETRESPERSEC}; + + std::atomic_flag mPropsClean; + std::atomic mDeferUpdates{false}; + + std::mutex mPropLock; + + /* Counter for the pre-mixing updates, in 31.1 fixed point (lowest bit + * indicates if updates are currently happening). + */ + RefCount mUpdateCount{0u}; + std::atomic mHoldUpdates{false}; + + ALfloat mGainBoost{1.0f}; + + std::atomic mUpdate{nullptr}; + + /* Linked lists of unused property containers, free to use for future + * updates. + */ + std::atomic mFreeContextProps{nullptr}; + std::atomic mFreeListenerProps{nullptr}; + std::atomic mFreeVoiceProps{nullptr}; + std::atomic mFreeEffectslotProps{nullptr}; + + al::vector mVoices; + + using ALeffectslotArray = al::FlexArray; + std::atomic mActiveAuxSlots{nullptr}; + + std::thread mEventThread; + al::semaphore mEventSem; + std::unique_ptr mAsyncEvents; + std::atomic mEnabledEvts{0u}; + std::mutex mEventCbLock; + ALEVENTPROCSOFT mEventCb{}; + void *mEventParam{nullptr}; + + /* Default effect slot */ + std::unique_ptr mDefaultSlot; + + const al::intrusive_ptr mDevice; + const ALCchar *mExtensionList{nullptr}; + + ALlistener mListener{}; + + + ALCcontext(al::intrusive_ptr device); + ALCcontext(const ALCcontext&) = delete; + ALCcontext& operator=(const ALCcontext&) = delete; + ~ALCcontext(); + + void init(); + /** + * Removes the context from its device and removes it from being current on + * the running thread or globally. Returns true if other contexts still + * exist on the device. + */ + bool deinit(); + + /** + * Defers/suspends updates for the given context's listener and sources. + * This does *NOT* stop mixing, but rather prevents certain property + * changes from taking effect. + */ + void deferUpdates() noexcept { mDeferUpdates.store(true); } + + /** Resumes update processing after being deferred. */ + void processUpdates(); + + void setError(ALenum errorCode, const char *msg, ...) DECL_FORMAT(printf, 3, 4); + + DEF_NEWDEL(ALCcontext) +}; + +#define SETERR_RETURN(ctx, err, retval, ...) do { \ + (ctx)->setError((err), __VA_ARGS__); \ + return retval; \ +} while(0) + + +using ContextRef = al::intrusive_ptr; + +ContextRef GetContextRef(void); + +void UpdateContextProps(ALCcontext *context); + + +extern bool TrapALError; + +#endif /* ALCONTEXT_H */ diff --git a/alc/alu.cpp b/alc/alu.cpp new file mode 100644 index 0000000..b337286 --- /dev/null +++ b/alc/alu.cpp @@ -0,0 +1,2042 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "alu.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "al/auxeffectslot.h" +#include "al/buffer.h" +#include "al/effect.h" +#include "al/event.h" +#include "al/listener.h" +#include "alcmain.h" +#include "alcontext.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alspan.h" +#include "alstring.h" +#include "ambidefs.h" +#include "atomic.h" +#include "bformatdec.h" +#include "bs2b.h" +#include "cpu_caps.h" +#include "devformat.h" +#include "effects/base.h" +#include "filters/biquad.h" +#include "filters/nfc.h" +#include "filters/splitter.h" +#include "fpu_modes.h" +#include "hrtf.h" +#include "inprogext.h" +#include "mastering.h" +#include "math_defs.h" +#include "mixer/defs.h" +#include "opthelpers.h" +#include "ringbuffer.h" +#include "strutils.h" +#include "threads.h" +#include "uhjfilter.h" +#include "vecmat.h" +#include "voice.h" + +#include "bsinc_inc.h" + + +static_assert(!(MAX_RESAMPLER_PADDING&1) && MAX_RESAMPLER_PADDING >= bsinc24.m[0], + "MAX_RESAMPLER_PADDING is not a multiple of two, or is too small"); + + +namespace { + +using namespace std::placeholders; + +ALfloat InitConeScale() +{ + ALfloat ret{1.0f}; + if(auto optval = al::getenv("__ALSOFT_HALF_ANGLE_CONES")) + { + if(al::strcasecmp(optval->c_str(), "true") == 0 + || strtol(optval->c_str(), nullptr, 0) == 1) + ret *= 0.5f; + } + return ret; +} + +ALfloat InitZScale() +{ + ALfloat ret{1.0f}; + if(auto optval = al::getenv("__ALSOFT_REVERSE_Z")) + { + if(al::strcasecmp(optval->c_str(), "true") == 0 + || strtol(optval->c_str(), nullptr, 0) == 1) + ret *= -1.0f; + } + return ret; +} + +} // namespace + +/* Cone scalar */ +const ALfloat ConeScale{InitConeScale()}; + +/* Localized Z scalar for mono sources */ +const ALfloat ZScale{InitZScale()}; + +MixerFunc MixSamples{Mix_}; +RowMixerFunc MixRowSamples{MixRow_}; + +namespace { + +struct ChanMap { + Channel channel; + ALfloat angle; + ALfloat elevation; +}; + +HrtfDirectMixerFunc MixDirectHrtf = MixDirectHrtf_; + +inline MixerFunc SelectMixer() +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Mix_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return Mix_; +#endif + return Mix_; +} + +inline RowMixerFunc SelectRowMixer() +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixRow_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixRow_; +#endif + return MixRow_; +} + +inline HrtfDirectMixerFunc SelectHrtfMixer(void) +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixDirectHrtf_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixDirectHrtf_; +#endif + + return MixDirectHrtf_; +} + + +inline void BsincPrepare(const ALuint increment, BsincState *state, const BSincTable *table) +{ + size_t si{BSINC_SCALE_COUNT - 1}; + float sf{0.0f}; + + if(increment > FRACTIONONE) + { + sf = FRACTIONONE / static_cast(increment); + sf = maxf(0.0f, (BSINC_SCALE_COUNT-1) * (sf-table->scaleBase) * table->scaleRange); + si = float2uint(sf); + /* The interpolation factor is fit to this diagonally-symmetric curve + * to reduce the transition ripple caused by interpolating different + * scales of the sinc function. + */ + sf = 1.0f - std::cos(std::asin(sf - static_cast(si))); + } + + state->sf = sf; + state->m = table->m[si]; + state->l = (state->m/2) - 1; + state->filter = table->Tab + table->filterOffset[si]; +} + +inline ResamplerFunc SelectResampler(Resampler resampler, ALuint increment) +{ + switch(resampler) + { + case Resampler::Point: + return Resample_; + case Resampler::Linear: +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Resample_; +#endif +#ifdef HAVE_SSE4_1 + if((CPUCapFlags&CPU_CAP_SSE4_1)) + return Resample_; +#endif +#ifdef HAVE_SSE2 + if((CPUCapFlags&CPU_CAP_SSE2)) + return Resample_; +#endif + return Resample_; + case Resampler::Cubic: + return Resample_; + case Resampler::BSinc12: + case Resampler::BSinc24: + if(increment <= FRACTIONONE) + { + /* fall-through */ + case Resampler::FastBSinc12: + case Resampler::FastBSinc24: +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Resample_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return Resample_; +#endif + return Resample_; + } +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return Resample_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return Resample_; +#endif + return Resample_; + } + + return Resample_; +} + +} // namespace + +void aluInit(void) +{ + MixSamples = SelectMixer(); + MixRowSamples = SelectRowMixer(); + MixDirectHrtf = SelectHrtfMixer(); +} + + +ResamplerFunc PrepareResampler(Resampler resampler, ALuint increment, InterpState *state) +{ + switch(resampler) + { + case Resampler::Point: + case Resampler::Linear: + case Resampler::Cubic: + break; + case Resampler::FastBSinc12: + case Resampler::BSinc12: + BsincPrepare(increment, &state->bsinc, &bsinc12); + break; + case Resampler::FastBSinc24: + case Resampler::BSinc24: + BsincPrepare(increment, &state->bsinc, &bsinc24); + break; + } + return SelectResampler(resampler, increment); +} + + +void ALCdevice::ProcessHrtf(const size_t SamplesToDo) +{ + /* HRTF is stereo output only. */ + const ALuint lidx{RealOut.ChannelIndex[FrontLeft]}; + const ALuint ridx{RealOut.ChannelIndex[FrontRight]}; + + MixDirectHrtf(RealOut.Buffer[lidx], RealOut.Buffer[ridx], Dry.Buffer, HrtfAccumData, + mHrtfState.get(), SamplesToDo); +} + +void ALCdevice::ProcessAmbiDec(const size_t SamplesToDo) +{ + AmbiDecoder->process(RealOut.Buffer, Dry.Buffer.data(), SamplesToDo); +} + +void ALCdevice::ProcessUhj(const size_t SamplesToDo) +{ + /* UHJ is stereo output only. */ + const ALuint lidx{RealOut.ChannelIndex[FrontLeft]}; + const ALuint ridx{RealOut.ChannelIndex[FrontRight]}; + + /* Encode to stereo-compatible 2-channel UHJ output. */ + Uhj_Encoder->encode(RealOut.Buffer[lidx], RealOut.Buffer[ridx], Dry.Buffer.data(), + SamplesToDo); +} + +void ALCdevice::ProcessBs2b(const size_t SamplesToDo) +{ + /* First, decode the ambisonic mix to the "real" output. */ + AmbiDecoder->process(RealOut.Buffer, Dry.Buffer.data(), SamplesToDo); + + /* BS2B is stereo output only. */ + const ALuint lidx{RealOut.ChannelIndex[FrontLeft]}; + const ALuint ridx{RealOut.ChannelIndex[FrontRight]}; + + /* Now apply the BS2B binaural/crossfeed filter. */ + bs2b_cross_feed(Bs2b.get(), RealOut.Buffer[lidx].data(), RealOut.Buffer[ridx].data(), + SamplesToDo); +} + + +namespace { + +/* This RNG method was created based on the math found in opusdec. It's quick, + * and starting with a seed value of 22222, is suitable for generating + * whitenoise. + */ +inline ALuint dither_rng(ALuint *seed) noexcept +{ + *seed = (*seed * 96314165) + 907633515; + return *seed; +} + + +auto GetAmbiScales(AmbiNorm scaletype) noexcept -> const std::array& +{ + if(scaletype == AmbiNorm::FuMa) return AmbiScale::FromFuMa; + if(scaletype == AmbiNorm::SN3D) return AmbiScale::FromSN3D; + return AmbiScale::FromN3D; +} + +auto GetAmbiLayout(AmbiLayout layouttype) noexcept -> const std::array& +{ + if(layouttype == AmbiLayout::FuMa) return AmbiIndex::FromFuMa; + return AmbiIndex::FromACN; +} + +auto GetAmbi2DLayout(AmbiLayout layouttype) noexcept -> const std::array& +{ + if(layouttype == AmbiLayout::FuMa) return AmbiIndex::FromFuMa2D; + return AmbiIndex::From2D; +} + + +inline alu::Vector aluCrossproduct(const alu::Vector &in1, const alu::Vector &in2) +{ + return alu::Vector{ + in1[1]*in2[2] - in1[2]*in2[1], + in1[2]*in2[0] - in1[0]*in2[2], + in1[0]*in2[1] - in1[1]*in2[0], + 0.0f + }; +} + +inline ALfloat aluDotproduct(const alu::Vector &vec1, const alu::Vector &vec2) +{ + return vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]; +} + + +alu::Vector operator*(const alu::Matrix &mtx, const alu::Vector &vec) noexcept +{ + return alu::Vector{ + vec[0]*mtx[0][0] + vec[1]*mtx[1][0] + vec[2]*mtx[2][0] + vec[3]*mtx[3][0], + vec[0]*mtx[0][1] + vec[1]*mtx[1][1] + vec[2]*mtx[2][1] + vec[3]*mtx[3][1], + vec[0]*mtx[0][2] + vec[1]*mtx[1][2] + vec[2]*mtx[2][2] + vec[3]*mtx[3][2], + vec[0]*mtx[0][3] + vec[1]*mtx[1][3] + vec[2]*mtx[2][3] + vec[3]*mtx[3][3] + }; +} + + +bool CalcContextParams(ALCcontext *Context) +{ + ALcontextProps *props{Context->mUpdate.exchange(nullptr, std::memory_order_acq_rel)}; + if(!props) return false; + + ALlistener &Listener = Context->mListener; + Listener.Params.DopplerFactor = props->DopplerFactor; + Listener.Params.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity; + + Listener.Params.SourceDistanceModel = props->SourceDistanceModel; + Listener.Params.mDistanceModel = props->mDistanceModel; + + AtomicReplaceHead(Context->mFreeContextProps, props); + return true; +} + +bool CalcListenerParams(ALCcontext *Context) +{ + ALlistener &Listener = Context->mListener; + + ALlistenerProps *props{Listener.Params.Update.exchange(nullptr, std::memory_order_acq_rel)}; + if(!props) return false; + + /* AT then UP */ + alu::Vector N{props->OrientAt[0], props->OrientAt[1], props->OrientAt[2], 0.0f}; + N.normalize(); + alu::Vector V{props->OrientUp[0], props->OrientUp[1], props->OrientUp[2], 0.0f}; + V.normalize(); + /* Build and normalize right-vector */ + alu::Vector U{aluCrossproduct(N, V)}; + U.normalize(); + + Listener.Params.Matrix = alu::Matrix{ + U[0], V[0], -N[0], 0.0f, + U[1], V[1], -N[1], 0.0f, + U[2], V[2], -N[2], 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + const alu::Vector P{Listener.Params.Matrix * + alu::Vector{props->Position[0], props->Position[1], props->Position[2], 1.0f}}; + Listener.Params.Matrix.setRow(3, -P[0], -P[1], -P[2], 1.0f); + + const alu::Vector vel{props->Velocity[0], props->Velocity[1], props->Velocity[2], 0.0f}; + Listener.Params.Velocity = Listener.Params.Matrix * vel; + + Listener.Params.Gain = props->Gain * Context->mGainBoost; + Listener.Params.MetersPerUnit = props->MetersPerUnit; + + AtomicReplaceHead(Context->mFreeListenerProps, props); + return true; +} + +bool CalcEffectSlotParams(ALeffectslot *slot, ALeffectslot **sorted_slots, ALCcontext *context) +{ + ALeffectslotProps *props{slot->Params.Update.exchange(nullptr, std::memory_order_acq_rel)}; + if(!props) return false; + + /* If the effect slot target changed, clear the first sorted entry to force + * a re-sort. + */ + if(slot->Params.Target != props->Target) + *sorted_slots = nullptr; + slot->Params.Gain = props->Gain; + slot->Params.AuxSendAuto = props->AuxSendAuto; + slot->Params.Target = props->Target; + slot->Params.EffectType = props->Type; + slot->Params.mEffectProps = props->Props; + if(IsReverbEffect(props->Type)) + { + slot->Params.RoomRolloff = props->Props.Reverb.RoomRolloffFactor; + slot->Params.DecayTime = props->Props.Reverb.DecayTime; + slot->Params.DecayLFRatio = props->Props.Reverb.DecayLFRatio; + slot->Params.DecayHFRatio = props->Props.Reverb.DecayHFRatio; + slot->Params.DecayHFLimit = props->Props.Reverb.DecayHFLimit; + slot->Params.AirAbsorptionGainHF = props->Props.Reverb.AirAbsorptionGainHF; + } + else + { + slot->Params.RoomRolloff = 0.0f; + slot->Params.DecayTime = 0.0f; + slot->Params.DecayLFRatio = 0.0f; + slot->Params.DecayHFRatio = 0.0f; + slot->Params.DecayHFLimit = AL_FALSE; + slot->Params.AirAbsorptionGainHF = 1.0f; + } + + EffectState *state{props->State}; + props->State = nullptr; + EffectState *oldstate{slot->Params.mEffectState}; + slot->Params.mEffectState = state; + + /* Only release the old state if it won't get deleted, since we can't be + * deleting/freeing anything in the mixer. + */ + if(!oldstate->releaseIfNoDelete()) + { + /* Otherwise, if it would be deleted send it off with a release event. */ + RingBuffer *ring{context->mAsyncEvents.get()}; + auto evt_vec = ring->getWriteVector(); + if LIKELY(evt_vec.first.len > 0) + { + AsyncEvent *evt{new (evt_vec.first.buf) AsyncEvent{EventType_ReleaseEffectState}}; + evt->u.mEffectState = oldstate; + ring->writeAdvance(1); + } + else + { + /* If writing the event failed, the queue was probably full. Store + * the old state in the property object where it can eventually be + * cleaned up sometime later (not ideal, but better than blocking + * or leaking). + */ + props->State = oldstate; + } + } + + AtomicReplaceHead(context->mFreeEffectslotProps, props); + + EffectTarget output; + if(ALeffectslot *target{slot->Params.Target}) + output = EffectTarget{&target->Wet, nullptr}; + else + { + ALCdevice *device{context->mDevice.get()}; + output = EffectTarget{&device->Dry, &device->RealOut}; + } + state->update(context, slot, &slot->Params.mEffectProps, output); + return true; +} + + +/* Scales the given azimuth toward the side (+/- pi/2 radians) for positions in + * front. + */ +inline float ScaleAzimuthFront(float azimuth, float scale) +{ + const ALfloat abs_azi{std::fabs(azimuth)}; + if(!(abs_azi >= al::MathDefs::Pi()*0.5f)) + return std::copysign(minf(abs_azi*scale, al::MathDefs::Pi()*0.5f), azimuth); + return azimuth; +} + + +/* Begin ambisonic rotation helpers. + * + * Rotating first-order B-Format just needs a straight-forward X/Y/Z rotation + * matrix. Higher orders, however, are more complicated. The method implemented + * here is a recursive algorithm (the rotation for first-order is used to help + * generate the second-order rotation, which helps generate the third-order + * rotation, etc). + * + * Adapted from + * , + * provided under the BSD 3-Clause license. + * + * Copyright (c) 2015, Archontis Politis + * Copyright (c) 2019, Christopher Robinson + * + * The u, v, and w coefficients used for generating higher-order rotations are + * precomputed since they're constant. The second-order coefficients are + * followed by the third-order coefficients, etc. + */ +struct RotatorCoeffs { + float u, v, w; + + template + static std::array ConcatArrays(const std::array &lhs, + const std::array &rhs) + { + std::array ret; + auto iter = std::copy(lhs.cbegin(), lhs.cend(), ret.begin()); + std::copy(rhs.cbegin(), rhs.cend(), iter); + return ret; + } + + template + static std::array GenCoeffs() + { + std::array ret{}; + auto coeffs = ret.begin(); + + for(int m{-l};m <= l;++m) + { + for(int n{-l};n <= l;++n) + { + // compute u,v,w terms of Eq.8.1 (Table I) + const bool d{m == 0}; // the delta function d_m0 + const float denom{static_cast((std::abs(n) == l) ? + (2*l) * (2*l - 1) : (l*l - n*n))}; + + const int abs_m{std::abs(m)}; + coeffs->u = std::sqrt(static_cast(l*l - m*m)/denom); + coeffs->v = std::sqrt(static_cast(l+abs_m-1) * static_cast(l+abs_m) / + denom) * (1.0f+d) * (1.0f - 2.0f*d) * 0.5f; + coeffs->w = std::sqrt(static_cast(l-abs_m-1) * static_cast(l-abs_m) / + denom) * (1.0f-d) * -0.5f; + ++coeffs; + } + } + + return ret; + } +}; +const auto RotatorCoeffArray = RotatorCoeffs::ConcatArrays(RotatorCoeffs::GenCoeffs<2>(), + RotatorCoeffs::GenCoeffs<3>()); + +/** + * Given the matrix, pre-filled with the (zeroth- and) first-order rotation + * coefficients, this fills in the coefficients for the higher orders up to and + * including the given order. The matrix is in ACN layout. + */ +void AmbiRotator(std::array,MAX_AMBI_CHANNELS> &matrix, + const int order) +{ + /* Don't do anything for < 2nd order. */ + if(order < 2) return; + + auto P = [](const int i, const int l, const int a, const int n, const size_t last_band, + const std::array,MAX_AMBI_CHANNELS> &R) + { + const float ri1{ R[static_cast(i+2)][ 1+2]}; + const float rim1{R[static_cast(i+2)][-1+2]}; + const float ri0{ R[static_cast(i+2)][ 0+2]}; + + auto vec = R[static_cast(a+l-1) + last_band].cbegin() + last_band; + if(n == -l) + return ri1*vec[0] + rim1*vec[static_cast(l-1)*size_t{2}]; + if(n == l) + return ri1*vec[static_cast(l-1)*size_t{2}] - rim1*vec[0]; + return ri0*vec[static_cast(n+l-1)]; + }; + + auto U = [P](const int l, const int m, const int n, const size_t last_band, + const std::array,MAX_AMBI_CHANNELS> &R) + { + return P(0, l, m, n, last_band, R); + }; + auto V = [P](const int l, const int m, const int n, const size_t last_band, + const std::array,MAX_AMBI_CHANNELS> &R) + { + if(m > 0) + { + const bool d{m == 1}; + const float p0{P( 1, l, m-1, n, last_band, R)}; + const float p1{P(-1, l, -m+1, n, last_band, R)}; + return d ? p0*std::sqrt(2.0f) : (p0 - p1); + } + const bool d{m == -1}; + const float p0{P( 1, l, m+1, n, last_band, R)}; + const float p1{P(-1, l, -m-1, n, last_band, R)}; + return d ? p1*std::sqrt(2.0f) : (p0 + p1); + }; + auto W = [P](const int l, const int m, const int n, const size_t last_band, + const std::array,MAX_AMBI_CHANNELS> &R) + { + assert(m != 0); + if(m > 0) + { + const float p0{P( 1, l, m+1, n, last_band, R)}; + const float p1{P(-1, l, -m-1, n, last_band, R)}; + return p0 + p1; + } + const float p0{P( 1, l, m-1, n, last_band, R)}; + const float p1{P(-1, l, -m+1, n, last_band, R)}; + return p0 - p1; + }; + + // compute rotation matrix of each subsequent band recursively + auto coeffs = RotatorCoeffArray.cbegin(); + size_t band_idx{4}, last_band{1}; + for(int l{2};l <= order;++l) + { + size_t y{band_idx}; + for(int m{-l};m <= l;++m,++y) + { + size_t x{band_idx}; + for(int n{-l};n <= l;++n,++x) + { + float r{0.0f}; + + // computes Eq.8.1 + const float u{coeffs->u}; + if(u != 0.0f) r += u * U(l, m, n, last_band, matrix); + const float v{coeffs->v}; + if(v != 0.0f) r += v * V(l, m, n, last_band, matrix); + const float w{coeffs->w}; + if(w != 0.0f) r += w * W(l, m, n, last_band, matrix); + + matrix[y][x] = r; + ++coeffs; + } + } + last_band = band_idx; + band_idx += static_cast(l)*size_t{2} + 1; + } +} +/* End ambisonic rotation helpers. */ + + +struct GainTriplet { float Base, HF, LF; }; + +void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypos, + const ALfloat zpos, const ALfloat Distance, const ALfloat Spread, const GainTriplet &DryGain, + const al::span WetGain, ALeffectslot *(&SendSlots)[MAX_SENDS], + const ALvoicePropsBase *props, const ALlistener &Listener, const ALCdevice *Device) +{ + static const ChanMap MonoMap[1]{ + { FrontCenter, 0.0f, 0.0f } + }, RearMap[2]{ + { BackLeft, Deg2Rad(-150.0f), Deg2Rad(0.0f) }, + { BackRight, Deg2Rad( 150.0f), Deg2Rad(0.0f) } + }, QuadMap[4]{ + { FrontLeft, Deg2Rad( -45.0f), Deg2Rad(0.0f) }, + { FrontRight, Deg2Rad( 45.0f), Deg2Rad(0.0f) }, + { BackLeft, Deg2Rad(-135.0f), Deg2Rad(0.0f) }, + { BackRight, Deg2Rad( 135.0f), Deg2Rad(0.0f) } + }, X51Map[6]{ + { FrontLeft, Deg2Rad( -30.0f), Deg2Rad(0.0f) }, + { FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) }, + { FrontCenter, Deg2Rad( 0.0f), Deg2Rad(0.0f) }, + { LFE, 0.0f, 0.0f }, + { SideLeft, Deg2Rad(-110.0f), Deg2Rad(0.0f) }, + { SideRight, Deg2Rad( 110.0f), Deg2Rad(0.0f) } + }, X61Map[7]{ + { FrontLeft, Deg2Rad(-30.0f), Deg2Rad(0.0f) }, + { FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) }, + { FrontCenter, Deg2Rad( 0.0f), Deg2Rad(0.0f) }, + { LFE, 0.0f, 0.0f }, + { BackCenter, Deg2Rad(180.0f), Deg2Rad(0.0f) }, + { SideLeft, Deg2Rad(-90.0f), Deg2Rad(0.0f) }, + { SideRight, Deg2Rad( 90.0f), Deg2Rad(0.0f) } + }, X71Map[8]{ + { FrontLeft, Deg2Rad( -30.0f), Deg2Rad(0.0f) }, + { FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) }, + { FrontCenter, Deg2Rad( 0.0f), Deg2Rad(0.0f) }, + { LFE, 0.0f, 0.0f }, + { BackLeft, Deg2Rad(-150.0f), Deg2Rad(0.0f) }, + { BackRight, Deg2Rad( 150.0f), Deg2Rad(0.0f) }, + { SideLeft, Deg2Rad( -90.0f), Deg2Rad(0.0f) }, + { SideRight, Deg2Rad( 90.0f), Deg2Rad(0.0f) } + }; + + ChanMap StereoMap[2]{ + { FrontLeft, Deg2Rad(-30.0f), Deg2Rad(0.0f) }, + { FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) } + }; + + const auto Frequency = static_cast(Device->Frequency); + const ALuint NumSends{Device->NumAuxSends}; + + DirectMode DirectChannels{props->DirectChannels}; + const ALuint num_channels{voice->mNumChannels}; + const ChanMap *chans{nullptr}; + ALfloat downmix_gain{1.0f}; + switch(voice->mFmtChannels) + { + case FmtMono: + chans = MonoMap; + /* Mono buffers are never played direct. */ + DirectChannels = DirectMode::Off; + break; + + case FmtStereo: + if(DirectChannels == DirectMode::Off) + { + /* Convert counter-clockwise to clockwise. */ + StereoMap[0].angle = -props->StereoPan[0]; + StereoMap[1].angle = -props->StereoPan[1]; + } + + chans = StereoMap; + downmix_gain = 1.0f / 2.0f; + break; + + case FmtRear: + chans = RearMap; + downmix_gain = 1.0f / 2.0f; + break; + + case FmtQuad: + chans = QuadMap; + downmix_gain = 1.0f / 4.0f; + break; + + case FmtX51: + chans = X51Map; + /* NOTE: Excludes LFE. */ + downmix_gain = 1.0f / 5.0f; + break; + + case FmtX61: + chans = X61Map; + /* NOTE: Excludes LFE. */ + downmix_gain = 1.0f / 6.0f; + break; + + case FmtX71: + chans = X71Map; + /* NOTE: Excludes LFE. */ + downmix_gain = 1.0f / 7.0f; + break; + + case FmtBFormat2D: + case FmtBFormat3D: + DirectChannels = DirectMode::Off; + break; + } + ASSUME(num_channels > 0); + + std::for_each(voice->mChans.begin(), voice->mChans.begin()+num_channels, + [NumSends](ALvoice::ChannelData &chandata) -> void + { + chandata.mDryParams.Hrtf.Target = HrtfFilter{}; + chandata.mDryParams.Gains.Target.fill(0.0f); + std::for_each(chandata.mWetParams.begin(), chandata.mWetParams.begin()+NumSends, + [](SendParams ¶ms) -> void { params.Gains.Target.fill(0.0f); }); + }); + + voice->mFlags &= ~(VOICE_HAS_HRTF | VOICE_HAS_NFC); + if(voice->mFmtChannels == FmtBFormat2D || voice->mFmtChannels == FmtBFormat3D) + { + /* Special handling for B-Format sources. */ + + if(Distance > std::numeric_limits::epsilon()) + { + /* Panning a B-Format sound toward some direction is easy. Just pan + * the first (W) channel as a normal mono sound and silence the + * others. + */ + + if(Device->AvgSpeakerDist > 0.0f) + { + /* Clamp the distance for really close sources, to prevent + * excessive bass. + */ + const ALfloat mdist{maxf(Distance, Device->AvgSpeakerDist/4.0f)}; + const ALfloat w0{SPEEDOFSOUNDMETRESPERSEC / (mdist * Frequency)}; + + /* Only need to adjust the first channel of a B-Format source. */ + voice->mChans[0].mDryParams.NFCtrlFilter.adjust(w0); + + voice->mFlags |= VOICE_HAS_NFC; + } + + ALfloat coeffs[MAX_AMBI_CHANNELS]; + if(Device->mRenderMode != StereoPair) + CalcDirectionCoeffs({xpos, ypos, zpos}, Spread, coeffs); + else + { + /* Clamp Y, in case rounding errors caused it to end up outside + * of -1...+1. + */ + const ALfloat ev{std::asin(clampf(ypos, -1.0f, 1.0f))}; + /* Negate Z for right-handed coords with -Z in front. */ + const ALfloat az{std::atan2(xpos, -zpos)}; + + /* A scalar of 1.5 for plain stereo results in +/-60 degrees + * being moved to +/-90 degrees for direct right and left + * speaker responses. + */ + CalcAngleCoeffs(ScaleAzimuthFront(az, 1.5f), ev, Spread, coeffs); + } + + /* NOTE: W needs to be scaled according to channel scaling. */ + const float scale0{GetAmbiScales(voice->mAmbiScaling)[0]}; + ComputePanGains(&Device->Dry, coeffs, DryGain.Base*scale0, + voice->mChans[0].mDryParams.Gains.Target); + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base*scale0, + voice->mChans[0].mWetParams[i].Gains.Target); + } + } + else + { + if(Device->AvgSpeakerDist > 0.0f) + { + /* NOTE: The NFCtrlFilters were created with a w0 of 0, which + * is what we want for FOA input. The first channel may have + * been previously re-adjusted if panned, so reset it. + */ + voice->mChans[0].mDryParams.NFCtrlFilter.adjust(0.0f); + + voice->mFlags |= VOICE_HAS_NFC; + } + + /* Local B-Format sources have their XYZ channels rotated according + * to the orientation. + */ + /* AT then UP */ + alu::Vector N{props->OrientAt[0], props->OrientAt[1], props->OrientAt[2], 0.0f}; + N.normalize(); + alu::Vector V{props->OrientUp[0], props->OrientUp[1], props->OrientUp[2], 0.0f}; + V.normalize(); + if(!props->HeadRelative) + { + N = Listener.Params.Matrix * N; + V = Listener.Params.Matrix * V; + } + /* Build and normalize right-vector */ + alu::Vector U{aluCrossproduct(N, V)}; + U.normalize(); + + /* Build a rotation matrix. Manually fill the zeroth- and first- + * order elements, then construct the rotation for the higher + * orders. + */ + std::array,MAX_AMBI_CHANNELS> shrot{}; + shrot[0][0] = 1.0f; + shrot[1][1] = U[0]; shrot[1][2] = -V[0]; shrot[1][3] = -N[0]; + shrot[2][1] = -U[1]; shrot[2][2] = V[1]; shrot[2][3] = N[1]; + shrot[3][1] = U[2]; shrot[3][2] = -V[2]; shrot[3][3] = -N[2]; + AmbiRotator(shrot, static_cast(minu(voice->mAmbiOrder, Device->mAmbiOrder))); + + /* Convert the rotation matrix for input ordering and scaling, and + * whether input is 2D or 3D. + */ + const uint8_t *index_map{(voice->mFmtChannels == FmtBFormat2D) ? + GetAmbi2DLayout(voice->mAmbiLayout).data() : + GetAmbiLayout(voice->mAmbiLayout).data()}; + const float *scales{GetAmbiScales(voice->mAmbiScaling).data()}; + + static const uint8_t ChansPerOrder[MAX_AMBI_ORDER+1]{1, 3, 5, 7,}; + static const uint8_t OrderOffset[MAX_AMBI_ORDER+1]{0, 1, 4, 9,}; + for(ALuint c{0};c < num_channels;c++) + { + const size_t acn{index_map[c]}; + const size_t order{AmbiIndex::OrderFromChannel[acn]}; + const size_t tocopy{ChansPerOrder[order]}; + const size_t offset{OrderOffset[order]}; + const float scale{scales[acn]}; + auto in = shrot.cbegin() + offset; + + float coeffs[MAX_AMBI_CHANNELS]{}; + for(size_t x{0};x < tocopy;++x) + coeffs[offset+x] = in[x][acn] * scale; + + ComputePanGains(&Device->Dry, coeffs, DryGain.Base, + voice->mChans[c].mDryParams.Gains.Target); + + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base, + voice->mChans[c].mWetParams[i].Gains.Target); + } + } + } + } + else if(DirectChannels != DirectMode::Off && Device->FmtChans != DevFmtAmbi3D) + { + /* Direct source channels always play local. Skip the virtual channels + * and write inputs to the matching real outputs. + */ + voice->mDirect.Buffer = Device->RealOut.Buffer; + + for(ALuint c{0};c < num_channels;c++) + { + ALuint idx{GetChannelIdxByName(Device->RealOut, chans[c].channel)}; + if(idx != INVALID_CHANNEL_INDEX) + voice->mChans[c].mDryParams.Gains.Target[idx] = DryGain.Base; + else if(DirectChannels == DirectMode::RemixMismatch) + { + auto match_channel = [chans,c](const InputRemixMap &map) noexcept -> bool + { return chans[c].channel == map.channel; }; + auto remap = std::find_if(Device->RealOut.RemixMap.cbegin(), + Device->RealOut.RemixMap.cend(), match_channel); + if(remap != Device->RealOut.RemixMap.cend()) + for(const auto &target : remap->targets) + { + idx = GetChannelIdxByName(Device->RealOut, target.channel); + if(idx != INVALID_CHANNEL_INDEX) + voice->mChans[c].mDryParams.Gains.Target[idx] = DryGain.Base * + target.mix; + } + } + } + + /* Auxiliary sends still use normal channel panning since they mix to + * B-Format, which can't channel-match. + */ + for(ALuint c{0};c < num_channels;c++) + { + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcAngleCoeffs(chans[c].angle, chans[c].elevation, 0.0f, coeffs); + + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base, + voice->mChans[c].mWetParams[i].Gains.Target); + } + } + } + else if(Device->mRenderMode == HrtfRender) + { + /* Full HRTF rendering. Skip the virtual channels and render to the + * real outputs. + */ + voice->mDirect.Buffer = Device->RealOut.Buffer; + + if(Distance > std::numeric_limits::epsilon()) + { + const ALfloat ev{std::asin(clampf(ypos, -1.0f, 1.0f))}; + const ALfloat az{std::atan2(xpos, -zpos)}; + + /* Get the HRIR coefficients and delays just once, for the given + * source direction. + */ + GetHrtfCoeffs(Device->mHrtf, ev, az, Distance, Spread, + voice->mChans[0].mDryParams.Hrtf.Target.Coeffs, + voice->mChans[0].mDryParams.Hrtf.Target.Delay); + voice->mChans[0].mDryParams.Hrtf.Target.Gain = DryGain.Base * downmix_gain; + + /* Remaining channels use the same results as the first. */ + for(ALuint c{1};c < num_channels;c++) + { + /* Skip LFE */ + if(chans[c].channel == LFE) continue; + voice->mChans[c].mDryParams.Hrtf.Target = voice->mChans[0].mDryParams.Hrtf.Target; + } + + /* Calculate the directional coefficients once, which apply to all + * input channels of the source sends. + */ + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcDirectionCoeffs({xpos, ypos, zpos}, Spread, coeffs); + + for(ALuint c{0};c < num_channels;c++) + { + /* Skip LFE */ + if(chans[c].channel == LFE) + continue; + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base * downmix_gain, + voice->mChans[c].mWetParams[i].Gains.Target); + } + } + } + else + { + /* Local sources on HRTF play with each channel panned to its + * relative location around the listener, providing "virtual + * speaker" responses. + */ + for(ALuint c{0};c < num_channels;c++) + { + /* Skip LFE */ + if(chans[c].channel == LFE) + continue; + + /* Get the HRIR coefficients and delays for this channel + * position. + */ + GetHrtfCoeffs(Device->mHrtf, chans[c].elevation, chans[c].angle, + std::numeric_limits::infinity(), Spread, + voice->mChans[c].mDryParams.Hrtf.Target.Coeffs, + voice->mChans[c].mDryParams.Hrtf.Target.Delay); + voice->mChans[c].mDryParams.Hrtf.Target.Gain = DryGain.Base; + + /* Normal panning for auxiliary sends. */ + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcAngleCoeffs(chans[c].angle, chans[c].elevation, Spread, coeffs); + + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base, + voice->mChans[c].mWetParams[i].Gains.Target); + } + } + } + + voice->mFlags |= VOICE_HAS_HRTF; + } + else + { + /* Non-HRTF rendering. Use normal panning to the output. */ + + if(Distance > std::numeric_limits::epsilon()) + { + /* Calculate NFC filter coefficient if needed. */ + if(Device->AvgSpeakerDist > 0.0f) + { + /* Clamp the distance for really close sources, to prevent + * excessive bass. + */ + const ALfloat mdist{maxf(Distance, Device->AvgSpeakerDist/4.0f)}; + const ALfloat w0{SPEEDOFSOUNDMETRESPERSEC / (mdist * Frequency)}; + + /* Adjust NFC filters. */ + for(ALuint c{0};c < num_channels;c++) + voice->mChans[c].mDryParams.NFCtrlFilter.adjust(w0); + + voice->mFlags |= VOICE_HAS_NFC; + } + + /* Calculate the directional coefficients once, which apply to all + * input channels. + */ + ALfloat coeffs[MAX_AMBI_CHANNELS]; + if(Device->mRenderMode != StereoPair) + CalcDirectionCoeffs({xpos, ypos, zpos}, Spread, coeffs); + else + { + const ALfloat ev{std::asin(clampf(ypos, -1.0f, 1.0f))}; + const ALfloat az{std::atan2(xpos, -zpos)}; + CalcAngleCoeffs(ScaleAzimuthFront(az, 1.5f), ev, Spread, coeffs); + } + + for(ALuint c{0};c < num_channels;c++) + { + /* Special-case LFE */ + if(chans[c].channel == LFE) + { + if(Device->Dry.Buffer.data() == Device->RealOut.Buffer.data()) + { + const ALuint idx{GetChannelIdxByName(Device->RealOut, chans[c].channel)}; + if(idx != INVALID_CHANNEL_INDEX) + voice->mChans[c].mDryParams.Gains.Target[idx] = DryGain.Base; + } + continue; + } + + ComputePanGains(&Device->Dry, coeffs, DryGain.Base * downmix_gain, + voice->mChans[c].mDryParams.Gains.Target); + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base * downmix_gain, + voice->mChans[c].mWetParams[i].Gains.Target); + } + } + } + else + { + if(Device->AvgSpeakerDist > 0.0f) + { + /* If the source distance is 0, set w0 to w1 to act as a pass- + * through. We still want to pass the signal through the + * filters so they keep an appropriate history, in case the + * source moves away from the listener. + */ + const ALfloat w0{SPEEDOFSOUNDMETRESPERSEC / (Device->AvgSpeakerDist * Frequency)}; + + for(ALuint c{0};c < num_channels;c++) + voice->mChans[c].mDryParams.NFCtrlFilter.adjust(w0); + + voice->mFlags |= VOICE_HAS_NFC; + } + + for(ALuint c{0};c < num_channels;c++) + { + /* Special-case LFE */ + if(chans[c].channel == LFE) + { + if(Device->Dry.Buffer.data() == Device->RealOut.Buffer.data()) + { + const ALuint idx{GetChannelIdxByName(Device->RealOut, chans[c].channel)}; + if(idx != INVALID_CHANNEL_INDEX) + voice->mChans[c].mDryParams.Gains.Target[idx] = DryGain.Base; + } + continue; + } + + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcAngleCoeffs( + (Device->mRenderMode==StereoPair) ? ScaleAzimuthFront(chans[c].angle, 3.0f) + : chans[c].angle, + chans[c].elevation, Spread, coeffs + ); + + ComputePanGains(&Device->Dry, coeffs, DryGain.Base, + voice->mChans[c].mDryParams.Gains.Target); + for(ALuint i{0};i < NumSends;i++) + { + if(const ALeffectslot *Slot{SendSlots[i]}) + ComputePanGains(&Slot->Wet, coeffs, WetGain[i].Base, + voice->mChans[c].mWetParams[i].Gains.Target); + } + } + } + } + + { + const float hfNorm{props->Direct.HFReference / Frequency}; + const float lfNorm{props->Direct.LFReference / Frequency}; + + voice->mDirect.FilterType = AF_None; + if(DryGain.HF != 1.0f) voice->mDirect.FilterType |= AF_LowPass; + if(DryGain.LF != 1.0f) voice->mDirect.FilterType |= AF_HighPass; + + auto &lowpass = voice->mChans[0].mDryParams.LowPass; + auto &highpass = voice->mChans[0].mDryParams.HighPass; + lowpass.setParamsFromSlope(BiquadType::HighShelf, hfNorm, DryGain.HF, 1.0f); + highpass.setParamsFromSlope(BiquadType::LowShelf, lfNorm, DryGain.LF, 1.0f); + for(ALuint c{1};c < num_channels;c++) + { + voice->mChans[c].mDryParams.LowPass.copyParamsFrom(lowpass); + voice->mChans[c].mDryParams.HighPass.copyParamsFrom(highpass); + } + } + for(ALuint i{0};i < NumSends;i++) + { + const float hfNorm{props->Send[i].HFReference / Frequency}; + const float lfNorm{props->Send[i].LFReference / Frequency}; + + voice->mSend[i].FilterType = AF_None; + if(WetGain[i].HF != 1.0f) voice->mSend[i].FilterType |= AF_LowPass; + if(WetGain[i].LF != 1.0f) voice->mSend[i].FilterType |= AF_HighPass; + + auto &lowpass = voice->mChans[0].mWetParams[i].LowPass; + auto &highpass = voice->mChans[0].mWetParams[i].HighPass; + lowpass.setParamsFromSlope(BiquadType::HighShelf, hfNorm, WetGain[i].HF, 1.0f); + highpass.setParamsFromSlope(BiquadType::LowShelf, lfNorm, WetGain[i].LF, 1.0f); + for(ALuint c{1};c < num_channels;c++) + { + voice->mChans[c].mWetParams[i].LowPass.copyParamsFrom(lowpass); + voice->mChans[c].mWetParams[i].HighPass.copyParamsFrom(highpass); + } + } +} + +void CalcNonAttnSourceParams(ALvoice *voice, const ALvoicePropsBase *props, const ALCcontext *ALContext) +{ + const ALCdevice *Device{ALContext->mDevice.get()}; + ALeffectslot *SendSlots[MAX_SENDS]; + + voice->mDirect.Buffer = Device->Dry.Buffer; + for(ALuint i{0};i < Device->NumAuxSends;i++) + { + SendSlots[i] = props->Send[i].Slot; + if(!SendSlots[i] && i == 0) + SendSlots[i] = ALContext->mDefaultSlot.get(); + if(!SendSlots[i] || SendSlots[i]->Params.EffectType == AL_EFFECT_NULL) + { + SendSlots[i] = nullptr; + voice->mSend[i].Buffer = {}; + } + else + voice->mSend[i].Buffer = SendSlots[i]->Wet.Buffer; + } + + /* Calculate the stepping value */ + const auto Pitch = static_cast(voice->mFrequency) / + static_cast(Device->Frequency) * props->Pitch; + if(Pitch > float{MAX_PITCH}) + voice->mStep = MAX_PITCH<mStep = maxu(fastf2u(Pitch * FRACTIONONE), 1); + voice->mResampler = PrepareResampler(props->mResampler, voice->mStep, &voice->mResampleState); + + /* Calculate gains */ + const ALlistener &Listener = ALContext->mListener; + GainTriplet DryGain; + DryGain.Base = minf(clampf(props->Gain, props->MinGain, props->MaxGain) * props->Direct.Gain * + Listener.Params.Gain, GAIN_MIX_MAX); + DryGain.HF = props->Direct.GainHF; + DryGain.LF = props->Direct.GainLF; + GainTriplet WetGain[MAX_SENDS]; + for(ALuint i{0};i < Device->NumAuxSends;i++) + { + WetGain[i].Base = minf(clampf(props->Gain, props->MinGain, props->MaxGain) * + props->Send[i].Gain * Listener.Params.Gain, GAIN_MIX_MAX); + WetGain[i].HF = props->Send[i].GainHF; + WetGain[i].LF = props->Send[i].GainLF; + } + + CalcPanningAndFilters(voice, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, DryGain, WetGain, SendSlots, props, + Listener, Device); +} + +void CalcAttnSourceParams(ALvoice *voice, const ALvoicePropsBase *props, const ALCcontext *ALContext) +{ + const ALCdevice *Device{ALContext->mDevice.get()}; + const ALuint NumSends{Device->NumAuxSends}; + const ALlistener &Listener = ALContext->mListener; + + /* Set mixing buffers and get send parameters. */ + voice->mDirect.Buffer = Device->Dry.Buffer; + ALeffectslot *SendSlots[MAX_SENDS]; + ALfloat RoomRolloff[MAX_SENDS]; + ALfloat DecayDistance[MAX_SENDS]; + ALfloat DecayLFDistance[MAX_SENDS]; + ALfloat DecayHFDistance[MAX_SENDS]; + for(ALuint i{0};i < NumSends;i++) + { + SendSlots[i] = props->Send[i].Slot; + if(!SendSlots[i] && i == 0) + SendSlots[i] = ALContext->mDefaultSlot.get(); + if(!SendSlots[i] || SendSlots[i]->Params.EffectType == AL_EFFECT_NULL) + { + SendSlots[i] = nullptr; + RoomRolloff[i] = 0.0f; + DecayDistance[i] = 0.0f; + DecayLFDistance[i] = 0.0f; + DecayHFDistance[i] = 0.0f; + } + else if(SendSlots[i]->Params.AuxSendAuto) + { + RoomRolloff[i] = SendSlots[i]->Params.RoomRolloff + props->RoomRolloffFactor; + /* Calculate the distances to where this effect's decay reaches + * -60dB. + */ + DecayDistance[i] = SendSlots[i]->Params.DecayTime * SPEEDOFSOUNDMETRESPERSEC; + DecayLFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayLFRatio; + DecayHFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayHFRatio; + if(SendSlots[i]->Params.DecayHFLimit) + { + ALfloat airAbsorption{SendSlots[i]->Params.AirAbsorptionGainHF}; + if(airAbsorption < 1.0f) + { + /* Calculate the distance to where this effect's air + * absorption reaches -60dB, and limit the effect's HF + * decay distance (so it doesn't take any longer to decay + * than the air would allow). + */ + ALfloat absorb_dist{std::log10(REVERB_DECAY_GAIN) / std::log10(airAbsorption)}; + DecayHFDistance[i] = minf(absorb_dist, DecayHFDistance[i]); + } + } + } + else + { + /* If the slot's auxiliary send auto is off, the data sent to the + * effect slot is the same as the dry path, sans filter effects */ + RoomRolloff[i] = props->RolloffFactor; + DecayDistance[i] = 0.0f; + DecayLFDistance[i] = 0.0f; + DecayHFDistance[i] = 0.0f; + } + + if(!SendSlots[i]) + voice->mSend[i].Buffer = {}; + else + voice->mSend[i].Buffer = SendSlots[i]->Wet.Buffer; + } + + /* Transform source to listener space (convert to head relative) */ + alu::Vector Position{props->Position[0], props->Position[1], props->Position[2], 1.0f}; + alu::Vector Velocity{props->Velocity[0], props->Velocity[1], props->Velocity[2], 0.0f}; + alu::Vector Direction{props->Direction[0], props->Direction[1], props->Direction[2], 0.0f}; + if(props->HeadRelative == AL_FALSE) + { + /* Transform source vectors */ + Position = Listener.Params.Matrix * Position; + Velocity = Listener.Params.Matrix * Velocity; + Direction = Listener.Params.Matrix * Direction; + } + else + { + /* Offset the source velocity to be relative of the listener velocity */ + Velocity += Listener.Params.Velocity; + } + + const bool directional{Direction.normalize() > 0.0f}; + alu::Vector ToSource{Position[0], Position[1], Position[2], 0.0f}; + const ALfloat Distance{ToSource.normalize()}; + + /* Initial source gain */ + GainTriplet DryGain{props->Gain, 1.0f, 1.0f}; + GainTriplet WetGain[MAX_SENDS]; + for(ALuint i{0};i < NumSends;i++) + WetGain[i] = DryGain; + + /* Calculate distance attenuation */ + float ClampedDist{Distance}; + + switch(Listener.Params.SourceDistanceModel ? + props->mDistanceModel : Listener.Params.mDistanceModel) + { + case DistanceModel::InverseClamped: + ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance); + if(props->MaxDistance < props->RefDistance) break; + /*fall-through*/ + case DistanceModel::Inverse: + if(!(props->RefDistance > 0.0f)) + ClampedDist = props->RefDistance; + else + { + float dist{lerp(props->RefDistance, ClampedDist, props->RolloffFactor)}; + if(dist > 0.0f) DryGain.Base *= props->RefDistance / dist; + for(ALuint i{0};i < NumSends;i++) + { + dist = lerp(props->RefDistance, ClampedDist, RoomRolloff[i]); + if(dist > 0.0f) WetGain[i].Base *= props->RefDistance / dist; + } + } + break; + + case DistanceModel::LinearClamped: + ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance); + if(props->MaxDistance < props->RefDistance) break; + /*fall-through*/ + case DistanceModel::Linear: + if(!(props->MaxDistance != props->RefDistance)) + ClampedDist = props->RefDistance; + else + { + float attn{props->RolloffFactor * (ClampedDist-props->RefDistance) / + (props->MaxDistance-props->RefDistance)}; + DryGain.Base *= maxf(1.0f - attn, 0.0f); + for(ALuint i{0};i < NumSends;i++) + { + attn = RoomRolloff[i] * (ClampedDist-props->RefDistance) / + (props->MaxDistance-props->RefDistance); + WetGain[i].Base *= maxf(1.0f - attn, 0.0f); + } + } + break; + + case DistanceModel::ExponentClamped: + ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance); + if(props->MaxDistance < props->RefDistance) break; + /*fall-through*/ + case DistanceModel::Exponent: + if(!(ClampedDist > 0.0f && props->RefDistance > 0.0f)) + ClampedDist = props->RefDistance; + else + { + DryGain.Base *= std::pow(ClampedDist/props->RefDistance, -props->RolloffFactor); + for(ALuint i{0};i < NumSends;i++) + WetGain[i].Base *= std::pow(ClampedDist/props->RefDistance, -RoomRolloff[i]); + } + break; + + case DistanceModel::Disable: + ClampedDist = props->RefDistance; + break; + } + + /* Calculate directional soundcones */ + if(directional && props->InnerAngle < 360.0f) + { + const float Angle{Rad2Deg(std::acos(-aluDotproduct(Direction, ToSource)) * + ConeScale * 2.0f)}; + + float ConeGain, ConeHF; + if(!(Angle > props->InnerAngle)) + { + ConeGain = 1.0f; + ConeHF = 1.0f; + } + else if(Angle < props->OuterAngle) + { + const float scale{(Angle-props->InnerAngle) / (props->OuterAngle-props->InnerAngle)}; + ConeGain = lerp(1.0f, props->OuterGain, scale); + ConeHF = lerp(1.0f, props->OuterGainHF, scale); + } + else + { + ConeGain = props->OuterGain; + ConeHF = props->OuterGainHF; + } + + DryGain.Base *= ConeGain; + if(props->DryGainHFAuto) + DryGain.HF *= ConeHF; + if(props->WetGainAuto) + std::for_each(std::begin(WetGain), std::begin(WetGain)+NumSends, + [ConeGain](GainTriplet &gain) noexcept -> void { gain.Base *= ConeGain; }); + if(props->WetGainHFAuto) + std::for_each(std::begin(WetGain), std::begin(WetGain)+NumSends, + [ConeHF](GainTriplet &gain) noexcept -> void { gain.HF *= ConeHF; }); + } + + /* Apply gain and frequency filters */ + DryGain.Base = minf(clampf(DryGain.Base, props->MinGain, props->MaxGain) * props->Direct.Gain * + Listener.Params.Gain, GAIN_MIX_MAX); + DryGain.HF *= props->Direct.GainHF; + DryGain.LF *= props->Direct.GainLF; + for(ALuint i{0};i < NumSends;i++) + { + WetGain[i].Base = minf(clampf(WetGain[i].Base, props->MinGain, props->MaxGain) * + props->Send[i].Gain * Listener.Params.Gain, GAIN_MIX_MAX); + WetGain[i].HF *= props->Send[i].GainHF; + WetGain[i].LF *= props->Send[i].GainLF; + } + + /* Distance-based air absorption and initial send decay. */ + if(ClampedDist > props->RefDistance && props->RolloffFactor > 0.0f) + { + const float meters_base{(ClampedDist-props->RefDistance) * props->RolloffFactor * + Listener.Params.MetersPerUnit}; + if(props->AirAbsorptionFactor > 0.0f) + { + const float hfattn{std::pow(AIRABSORBGAINHF, meters_base*props->AirAbsorptionFactor)}; + DryGain.HF *= hfattn; + std::for_each(std::begin(WetGain), std::begin(WetGain)+NumSends, + [hfattn](GainTriplet &gain) noexcept -> void { gain.HF *= hfattn; }); + } + + if(props->WetGainAuto) + { + /* Apply a decay-time transformation to the wet path, based on the + * source distance in meters. The initial decay of the reverb + * effect is calculated and applied to the wet path. + */ + for(ALuint i{0};i < NumSends;i++) + { + if(!(DecayDistance[i] > 0.0f)) + continue; + + const ALfloat gain{std::pow(REVERB_DECAY_GAIN, meters_base/DecayDistance[i])}; + WetGain[i].Base *= gain; + /* Yes, the wet path's air absorption is applied with + * WetGainAuto on, rather than WetGainHFAuto. + */ + if(gain > 0.0f) + { + ALfloat gainhf{std::pow(REVERB_DECAY_GAIN, meters_base/DecayHFDistance[i])}; + WetGain[i].HF *= minf(gainhf / gain, 1.0f); + ALfloat gainlf{std::pow(REVERB_DECAY_GAIN, meters_base/DecayLFDistance[i])}; + WetGain[i].LF *= minf(gainlf / gain, 1.0f); + } + } + } + } + + + /* Initial source pitch */ + ALfloat Pitch{props->Pitch}; + + /* Calculate velocity-based doppler effect */ + ALfloat DopplerFactor{props->DopplerFactor * Listener.Params.DopplerFactor}; + if(DopplerFactor > 0.0f) + { + const alu::Vector &lvelocity = Listener.Params.Velocity; + ALfloat vss{aluDotproduct(Velocity, ToSource) * -DopplerFactor}; + ALfloat vls{aluDotproduct(lvelocity, ToSource) * -DopplerFactor}; + + const ALfloat SpeedOfSound{Listener.Params.SpeedOfSound}; + if(!(vls < SpeedOfSound)) + { + /* Listener moving away from the source at the speed of sound. + * Sound waves can't catch it. + */ + Pitch = 0.0f; + } + else if(!(vss < SpeedOfSound)) + { + /* Source moving toward the listener at the speed of sound. Sound + * waves bunch up to extreme frequencies. + */ + Pitch = std::numeric_limits::infinity(); + } + else + { + /* Source and listener movement is nominal. Calculate the proper + * doppler shift. + */ + Pitch *= (SpeedOfSound-vls) / (SpeedOfSound-vss); + } + } + + /* Adjust pitch based on the buffer and output frequencies, and calculate + * fixed-point stepping value. + */ + Pitch *= static_cast(voice->mFrequency)/static_cast(Device->Frequency); + if(Pitch > float{MAX_PITCH}) + voice->mStep = MAX_PITCH<mStep = maxu(fastf2u(Pitch * FRACTIONONE), 1); + voice->mResampler = PrepareResampler(props->mResampler, voice->mStep, &voice->mResampleState); + + ALfloat spread{0.0f}; + if(props->Radius > Distance) + spread = al::MathDefs::Tau() - Distance/props->Radius*al::MathDefs::Pi(); + else if(Distance > 0.0f) + spread = std::asin(props->Radius/Distance) * 2.0f; + + CalcPanningAndFilters(voice, ToSource[0], ToSource[1], ToSource[2]*ZScale, + Distance*Listener.Params.MetersPerUnit, spread, DryGain, WetGain, SendSlots, props, + Listener, Device); +} + +void CalcSourceParams(ALvoice *voice, ALCcontext *context, bool force) +{ + ALvoiceProps *props{voice->mUpdate.exchange(nullptr, std::memory_order_acq_rel)}; + if(voice->mSourceID.load(std::memory_order_relaxed) == 0) + { + /* Don't update voices that no longer have a source. But make sure any + * update struct it has is returned to the free list. + */ + if UNLIKELY(props) + AtomicReplaceHead(context->mFreeVoiceProps, props); + return; + } + if(!props && !force) + return; + + if(props) + { + voice->mProps = *props; + + AtomicReplaceHead(context->mFreeVoiceProps, props); + } + + if((voice->mProps.DirectChannels != DirectMode::Off && voice->mFmtChannels != FmtMono + && voice->mFmtChannels != FmtBFormat2D && voice->mFmtChannels != FmtBFormat3D) + || voice->mProps.mSpatializeMode == SpatializeOff + || (voice->mProps.mSpatializeMode == SpatializeAuto && voice->mFmtChannels != FmtMono)) + CalcNonAttnSourceParams(voice, &voice->mProps, context); + else + CalcAttnSourceParams(voice, &voice->mProps, context); +} + + +void ProcessParamUpdates(ALCcontext *ctx, const ALeffectslotArray &slots, + const al::span voices) +{ + IncrementRef(ctx->mUpdateCount); + if LIKELY(!ctx->mHoldUpdates.load(std::memory_order_acquire)) + { + bool force{CalcContextParams(ctx)}; + force |= CalcListenerParams(ctx); + auto sorted_slots = const_cast(slots.data() + slots.size()); + for(ALeffectslot *slot : slots) + force |= CalcEffectSlotParams(slot, sorted_slots, ctx); + + auto calc_params = [ctx,force](ALvoice &voice) -> void + { CalcSourceParams(&voice, ctx, force); }; + std::for_each(voices.begin(), voices.end(), calc_params); + } + IncrementRef(ctx->mUpdateCount); +} + +void ProcessContext(ALCcontext *ctx, const ALuint SamplesToDo) +{ + ASSUME(SamplesToDo > 0); + + const ALeffectslotArray &auxslots = *ctx->mActiveAuxSlots.load(std::memory_order_acquire); + const al::span voices{ctx->mVoices.data(), ctx->mVoices.size()}; + + /* Process pending propery updates for objects on the context. */ + ProcessParamUpdates(ctx, auxslots, voices); + + /* Clear auxiliary effect slot mixing buffers. */ + std::for_each(auxslots.begin(), auxslots.end(), + [SamplesToDo](ALeffectslot *slot) -> void + { + for(auto &buffer : slot->MixBuffer) + std::fill_n(buffer.begin(), SamplesToDo, 0.0f); + }); + + /* Process voices that have a playing source. */ + auto mix_voice = [SamplesToDo,ctx](ALvoice &voice) -> void + { + const ALvoice::State vstate{voice.mPlayState.load(std::memory_order_acquire)}; + if(vstate != ALvoice::Stopped) voice.mix(vstate, ctx, SamplesToDo); + }; + std::for_each(voices.begin(), voices.end(), mix_voice); + + /* Process effects. */ + if(const size_t num_slots{auxslots.size()}) + { + auto slots = auxslots.data(); + auto slots_end = slots + num_slots; + + /* First sort the slots into extra storage, so that effects come before + * their effect target (or their targets' target). + */ + auto sorted_slots = const_cast(slots_end); + auto sorted_slots_end = sorted_slots; + if(*sorted_slots) + { + /* Skip sorting if it has already been done. */ + sorted_slots_end += num_slots; + goto skip_sorting; + } + + *sorted_slots_end = *slots; + ++sorted_slots_end; + while(++slots != slots_end) + { + auto in_chain = [](const ALeffectslot *s1, const ALeffectslot *s2) noexcept -> bool + { + while((s1=s1->Params.Target) != nullptr) { + if(s1 == s2) return true; + } + return false; + }; + + /* If this effect slot targets an effect slot already in the list + * (i.e. slots outputs to something in sorted_slots), directly or + * indirectly, insert it prior to that element. + */ + auto checker = sorted_slots; + do { + if(in_chain(*slots, *checker)) break; + } while(++checker != sorted_slots_end); + + checker = std::move_backward(checker, sorted_slots_end, sorted_slots_end+1); + *--checker = *slots; + ++sorted_slots_end; + } + + skip_sorting: + auto process_effect = [SamplesToDo](const ALeffectslot *slot) -> void + { + EffectState *state{slot->Params.mEffectState}; + state->process(SamplesToDo, slot->Wet.Buffer, state->mOutTarget); + }; + std::for_each(sorted_slots, sorted_slots_end, process_effect); + } + + /* Signal the event handler if there are any events to read. */ + RingBuffer *ring{ctx->mAsyncEvents.get()}; + if(ring->readSpace() > 0) + ctx->mEventSem.post(); +} + + +void ApplyStablizer(FrontStablizer *Stablizer, const al::span Buffer, + const ALuint lidx, const ALuint ridx, const ALuint cidx, const ALuint SamplesToDo) +{ + ASSUME(SamplesToDo > 0); + + /* Apply a delay to all channels, except the front-left and front-right, so + * they maintain correct timing. + */ + const size_t NumChannels{Buffer.size()}; + for(size_t i{0u};i < NumChannels;i++) + { + if(i == lidx || i == ridx) + continue; + + auto &DelayBuf = Stablizer->DelayBuf[i]; + auto buffer_end = Buffer[i].begin() + SamplesToDo; + if LIKELY(SamplesToDo >= ALuint{FrontStablizer::DelayLength}) + { + auto delay_end = std::rotate(Buffer[i].begin(), + buffer_end - FrontStablizer::DelayLength, buffer_end); + std::swap_ranges(Buffer[i].begin(), delay_end, std::begin(DelayBuf)); + } + else + { + auto delay_start = std::swap_ranges(Buffer[i].begin(), buffer_end, + std::begin(DelayBuf)); + std::rotate(std::begin(DelayBuf), delay_start, std::end(DelayBuf)); + } + } + + ALfloat (&lsplit)[2][BUFFERSIZE] = Stablizer->LSplit; + ALfloat (&rsplit)[2][BUFFERSIZE] = Stablizer->RSplit; + const al::span tmpbuf{Stablizer->TempBuf, SamplesToDo+FrontStablizer::DelayLength}; + + /* This applies the band-splitter, preserving phase at the cost of some + * delay. The shorter the delay, the more error seeps into the result. + */ + auto apply_splitter = [tmpbuf,SamplesToDo](const FloatBufferLine &InBuf, + const al::span DelayBuf, BandSplitter &Filter, + ALfloat (&splitbuf)[2][BUFFERSIZE]) -> void + { + /* Combine the input and delayed samples into a temp buffer in reverse, + * then copy the final samples into the delay buffer for next time. + * Note that the delay buffer's samples are stored backwards here. + */ + auto tmp_iter = std::reverse_copy(InBuf.cbegin(), InBuf.cbegin()+SamplesToDo, + tmpbuf.begin()); + std::copy(DelayBuf.cbegin(), DelayBuf.cend(), tmp_iter); + std::copy_n(tmpbuf.cbegin(), DelayBuf.size(), DelayBuf.begin()); + + /* Apply an all-pass on the reversed signal, then reverse the samples + * to get the forward signal with a reversed phase shift. + */ + Filter.applyAllpass(tmpbuf); + std::reverse(tmpbuf.begin(), tmpbuf.end()); + + /* Now apply the band-splitter, combining its phase shift with the + * reversed phase shift, restoring the original phase on the split + * signal. + */ + Filter.process(tmpbuf.first(SamplesToDo), splitbuf[1], splitbuf[0]); + }; + apply_splitter(Buffer[lidx], Stablizer->DelayBuf[lidx], Stablizer->LFilter, lsplit); + apply_splitter(Buffer[ridx], Stablizer->DelayBuf[ridx], Stablizer->RFilter, rsplit); + + for(ALuint i{0};i < SamplesToDo;i++) + { + ALfloat lfsum{lsplit[0][i] + rsplit[0][i]}; + ALfloat hfsum{lsplit[1][i] + rsplit[1][i]}; + ALfloat s{lsplit[0][i] + lsplit[1][i] - rsplit[0][i] - rsplit[1][i]}; + + /* This pans the separate low- and high-frequency sums between being on + * the center channel and the left/right channels. The low-frequency + * sum is 1/3rd toward center (2/3rds on left/right) and the high- + * frequency sum is 1/4th toward center (3/4ths on left/right). These + * values can be tweaked. + */ + ALfloat m{lfsum*std::cos(1.0f/3.0f * (al::MathDefs::Pi()*0.5f)) + + hfsum*std::cos(1.0f/4.0f * (al::MathDefs::Pi()*0.5f))}; + ALfloat c{lfsum*std::sin(1.0f/3.0f * (al::MathDefs::Pi()*0.5f)) + + hfsum*std::sin(1.0f/4.0f * (al::MathDefs::Pi()*0.5f))}; + + /* The generated center channel signal adds to the existing signal, + * while the modified left and right channels replace. + */ + Buffer[lidx][i] = (m + s) * 0.5f; + Buffer[ridx][i] = (m - s) * 0.5f; + Buffer[cidx][i] += c * 0.5f; + } +} + +void ApplyDistanceComp(const al::span Samples, const ALuint SamplesToDo, + const DistanceComp::DistData *distcomp) +{ + ASSUME(SamplesToDo > 0); + + for(auto &chanbuffer : Samples) + { + const ALfloat gain{distcomp->Gain}; + const ALuint base{distcomp->Length}; + ALfloat *distbuf{al::assume_aligned<16>(distcomp->Buffer)}; + ++distcomp; + + if(base < 1) + continue; + + ALfloat *inout{al::assume_aligned<16>(chanbuffer.data())}; + auto inout_end = inout + SamplesToDo; + if LIKELY(SamplesToDo >= base) + { + auto delay_end = std::rotate(inout, inout_end - base, inout_end); + std::swap_ranges(inout, delay_end, distbuf); + } + else + { + auto delay_start = std::swap_ranges(inout, inout_end, distbuf); + std::rotate(distbuf, delay_start, distbuf + base); + } + std::transform(inout, inout_end, inout, std::bind(std::multiplies{}, _1, gain)); + } +} + +void ApplyDither(const al::span Samples, ALuint *dither_seed, + const ALfloat quant_scale, const ALuint SamplesToDo) +{ + /* Dithering. Generate whitenoise (uniform distribution of random values + * between -1 and +1) and add it to the sample values, after scaling up to + * the desired quantization depth amd before rounding. + */ + const ALfloat invscale{1.0f / quant_scale}; + ALuint seed{*dither_seed}; + auto dither_channel = [&seed,invscale,quant_scale,SamplesToDo](FloatBufferLine &input) -> void + { + ASSUME(SamplesToDo > 0); + auto dither_sample = [&seed,invscale,quant_scale](const ALfloat sample) noexcept -> ALfloat + { + ALfloat val{sample * quant_scale}; + ALuint rng0{dither_rng(&seed)}; + ALuint rng1{dither_rng(&seed)}; + val += static_cast(rng0*(1.0/UINT_MAX) - rng1*(1.0/UINT_MAX)); + return fast_roundf(val) * invscale; + }; + std::transform(input.begin(), input.begin()+SamplesToDo, input.begin(), dither_sample); + }; + std::for_each(Samples.begin(), Samples.end(), dither_channel); + *dither_seed = seed; +} + + +/* Base template left undefined. Should be marked =delete, but Clang 3.8.1 + * chokes on that given the inline specializations. + */ +template +inline T SampleConv(float) noexcept; + +template<> inline float SampleConv(float val) noexcept +{ return val; } +template<> inline int32_t SampleConv(float val) noexcept +{ + /* Floats have a 23-bit mantissa, plus an implied 1 bit and a sign bit. + * This means a normalized float has at most 25 bits of signed precision. + * When scaling and clamping for a signed 32-bit integer, these following + * values are the best a float can give. + */ + return fastf2i(clampf(val*2147483648.0f, -2147483648.0f, 2147483520.0f)); +} +template<> inline int16_t SampleConv(float val) noexcept +{ return static_cast(fastf2i(clampf(val*32768.0f, -32768.0f, 32767.0f))); } +template<> inline int8_t SampleConv(float val) noexcept +{ return static_cast(fastf2i(clampf(val*128.0f, -128.0f, 127.0f))); } + +/* Define unsigned output variations. */ +template<> inline uint32_t SampleConv(float val) noexcept +{ return static_cast(SampleConv(val)) + 2147483648u; } +template<> inline uint16_t SampleConv(float val) noexcept +{ return static_cast(SampleConv(val) + 32768); } +template<> inline uint8_t SampleConv(float val) noexcept +{ return static_cast(SampleConv(val) + 128); } + +template +void Write(const al::span InBuffer, void *OutBuffer, const size_t Offset, + const ALuint SamplesToDo, const size_t FrameStep) +{ + using SampleType = typename DevFmtTypeTraits::Type; + + ASSUME(FrameStep > 0); + + SampleType *outbase = static_cast(OutBuffer) + Offset*FrameStep; + auto conv_channel = [&outbase,SamplesToDo,FrameStep](const FloatBufferLine &inbuf) -> void + { + ASSUME(SamplesToDo > 0); + SampleType *out{outbase++}; + auto conv_sample = [FrameStep,&out](const float s) noexcept -> void + { + *out = SampleConv(s); + out += FrameStep; + }; + std::for_each(inbuf.begin(), inbuf.begin()+SamplesToDo, conv_sample); + }; + std::for_each(InBuffer.cbegin(), InBuffer.cend(), conv_channel); +} + +} // namespace + +void aluMixData(ALCdevice *device, void *OutBuffer, const ALuint NumSamples, + const size_t FrameStep) +{ + FPUCtl mixer_mode{}; + for(ALuint SamplesDone{0u};SamplesDone < NumSamples;) + { + const ALuint SamplesToDo{minu(NumSamples-SamplesDone, BUFFERSIZE)}; + + /* Clear main mixing buffers. */ + std::for_each(device->MixBuffer.begin(), device->MixBuffer.end(), + [SamplesToDo](std::array &buffer) -> void + { std::fill_n(buffer.begin(), SamplesToDo, 0.0f); } + ); + + /* Increment the mix count at the start (lsb should now be 1). */ + IncrementRef(device->MixCount); + + /* For each context on this device, process and mix its sources and + * effects. + */ + for(ALCcontext *ctx : *device->mContexts.load(std::memory_order_acquire)) + ProcessContext(ctx, SamplesToDo); + + /* Increment the clock time. Every second's worth of samples is + * converted and added to clock base so that large sample counts don't + * overflow during conversion. This also guarantees a stable + * conversion. + */ + device->SamplesDone += SamplesToDo; + device->ClockBase += std::chrono::seconds{device->SamplesDone / device->Frequency}; + device->SamplesDone %= device->Frequency; + + /* Increment the mix count at the end (lsb should now be 0). */ + IncrementRef(device->MixCount); + + /* Apply any needed post-process for finalizing the Dry mix to the + * RealOut (Ambisonic decode, UHJ encode, etc). + */ + device->postProcess(SamplesToDo); + + const al::span RealOut{device->RealOut.Buffer}; + + /* Apply front image stablization for surround sound, if applicable. */ + if(FrontStablizer *stablizer{device->Stablizer.get()}) + { + const ALuint lidx{GetChannelIdxByName(device->RealOut, FrontLeft)}; + const ALuint ridx{GetChannelIdxByName(device->RealOut, FrontRight)}; + const ALuint cidx{GetChannelIdxByName(device->RealOut, FrontCenter)}; + + ApplyStablizer(stablizer, RealOut, lidx, ridx, cidx, SamplesToDo); + } + + /* Apply compression, limiting sample amplitude if needed or desired. */ + if(Compressor *comp{device->Limiter.get()}) + comp->process(SamplesToDo, RealOut.data()); + + /* Apply delays and attenuation for mismatched speaker distances. */ + ApplyDistanceComp(RealOut, SamplesToDo, device->ChannelDelay.as_span().cbegin()); + + /* Apply dithering. The compressor should have left enough headroom for + * the dither noise to not saturate. + */ + if(device->DitherDepth > 0.0f) + ApplyDither(RealOut, &device->DitherSeed, device->DitherDepth, SamplesToDo); + + if LIKELY(OutBuffer) + { + /* Finally, interleave and convert samples, writing to the device's + * output buffer. + */ + switch(device->FmtType) + { +#define HANDLE_WRITE(T) case T: \ + Write(RealOut, OutBuffer, SamplesDone, SamplesToDo, FrameStep); break; + HANDLE_WRITE(DevFmtByte) + HANDLE_WRITE(DevFmtUByte) + HANDLE_WRITE(DevFmtShort) + HANDLE_WRITE(DevFmtUShort) + HANDLE_WRITE(DevFmtInt) + HANDLE_WRITE(DevFmtUInt) + HANDLE_WRITE(DevFmtFloat) +#undef HANDLE_WRITE + } + } + + SamplesDone += SamplesToDo; + } +} + + +void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) +{ + if(!device->Connected.exchange(false, std::memory_order_acq_rel)) + return; + + AsyncEvent evt{EventType_Disconnected}; + evt.u.user.type = AL_EVENT_TYPE_DISCONNECTED_SOFT; + evt.u.user.id = 0; + evt.u.user.param = 0; + + va_list args; + va_start(args, msg); + int msglen{vsnprintf(evt.u.user.msg, sizeof(evt.u.user.msg), msg, args)}; + va_end(args); + + if(msglen < 0 || static_cast(msglen) >= sizeof(evt.u.user.msg)) + evt.u.user.msg[sizeof(evt.u.user.msg)-1] = 0; + + IncrementRef(device->MixCount); + for(ALCcontext *ctx : *device->mContexts.load()) + { + const ALbitfieldSOFT enabledevt{ctx->mEnabledEvts.load(std::memory_order_acquire)}; + if((enabledevt&EventType_Disconnected)) + { + RingBuffer *ring{ctx->mAsyncEvents.get()}; + auto evt_data = ring->getWriteVector().first; + if(evt_data.len > 0) + { + ::new (evt_data.buf) AsyncEvent{evt}; + ring->writeAdvance(1); + ctx->mEventSem.post(); + } + } + + auto stop_voice = [](ALvoice &voice) -> void + { + voice.mCurrentBuffer.store(nullptr, std::memory_order_relaxed); + voice.mLoopBuffer.store(nullptr, std::memory_order_relaxed); + voice.mSourceID.store(0u, std::memory_order_relaxed); + voice.mPlayState.store(ALvoice::Stopped, std::memory_order_release); + }; + std::for_each(ctx->mVoices.begin(), ctx->mVoices.end(), stop_voice); + } + IncrementRef(device->MixCount); +} diff --git a/alc/alu.h b/alc/alu.h new file mode 100644 index 0000000..84a6d81 --- /dev/null +++ b/alc/alu.h @@ -0,0 +1,159 @@ +#ifndef ALU_H +#define ALU_H + +#include +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "alspan.h" +#include "logging.h" + +struct ALbufferlistitem; +struct ALeffectslot; + + +#define MAX_PITCH 255 +#define MAX_SENDS 16 + + +using MixerFunc = void(*)(const al::span InSamples, + const al::span OutBuffer, float *CurrentGains, const float *TargetGains, + const size_t Counter, const size_t OutPos); +using RowMixerFunc = void(*)(const al::span OutBuffer, const al::span Gains, + const float *InSamples, const size_t InStride); +using HrtfDirectMixerFunc = void(*)(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + const al::span InSamples, float2 *AccumSamples, DirectHrtfState *State, + const size_t BufferSize); + +extern MixerFunc MixSamples; +extern RowMixerFunc MixRowSamples; + + +#define GAIN_MIX_MAX (1000.0f) /* +60dB */ + +#define GAIN_SILENCE_THRESHOLD (0.00001f) /* -100dB */ + +#define SPEEDOFSOUNDMETRESPERSEC (343.3f) +#define AIRABSORBGAINHF (0.99426f) /* -0.05dB */ + +/* Target gain for the reverb decay feedback reaching the decay time. */ +#define REVERB_DECAY_GAIN (0.001f) /* -60 dB */ + +#define FRACTIONBITS (12) +#define FRACTIONONE (1< coeffs); + +/** + * CalcDirectionCoeffs + * + * Calculates ambisonic coefficients based on an OpenAL direction vector. The + * vector must be normalized (unit length), and the spread is the angular width + * of the sound (0...tau). + */ +inline void CalcDirectionCoeffs(const float (&dir)[3], const float spread, + const al::span coeffs) +{ + /* Convert from OpenAL coords to Ambisonics. */ + CalcAmbiCoeffs(-dir[0], dir[1], -dir[2], spread, coeffs); +} + +/** + * CalcAngleCoeffs + * + * Calculates ambisonic coefficients based on azimuth and elevation. The + * azimuth and elevation parameters are in radians, going right and up + * respectively. + */ +inline void CalcAngleCoeffs(const float azimuth, const float elevation, const float spread, + const al::span coeffs) +{ + const float x{-std::sin(azimuth) * std::cos(elevation)}; + const float y{ std::sin(elevation)}; + const float z{ std::cos(azimuth) * std::cos(elevation)}; + + CalcAmbiCoeffs(x, y, z, spread, coeffs); +} + + +/** + * ComputePanGains + * + * Computes panning gains using the given channel decoder coefficients and the + * pre-calculated direction or angle coefficients. For B-Format sources, the + * coeffs are a 'slice' of a transform matrix for the input channel, used to + * scale and orient the sound samples. + */ +void ComputePanGains(const MixParams *mix, const float*RESTRICT coeffs, const float ingain, + const al::span gains); + + +inline std::array GetAmbiIdentityRow(size_t i) noexcept +{ + std::array ret{}; + ret[i] = 1.0f; + return ret; +} + + +void aluMixData(ALCdevice *device, void *OutBuffer, const ALuint NumSamples, + const size_t FrameStep); +/* Caller must lock the device state, and the mixer must not be running. */ +void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) DECL_FORMAT(printf, 2, 3); + +extern const ALfloat ConeScale; +extern const ALfloat ZScale; + +#endif diff --git a/alc/ambdec.cpp b/alc/ambdec.cpp new file mode 100644 index 0000000..adf116f --- /dev/null +++ b/alc/ambdec.cpp @@ -0,0 +1,434 @@ + +#include "config.h" + +#include "ambdec.h" + +#include +#include +#include +#include +#include +#include + +#include "alfstream.h" +#include "logging.h" + + +namespace { + +template +constexpr inline std::size_t size(const T(&)[N]) noexcept +{ return N; } + +int readline(std::istream &f, std::string &output) +{ + while(f.good() && f.peek() == '\n') + f.ignore(); + + return std::getline(f, output) && !output.empty(); +} + +bool read_clipped_line(std::istream &f, std::string &buffer) +{ + while(readline(f, buffer)) + { + std::size_t pos{0}; + while(pos < buffer.length() && std::isspace(buffer[pos])) + pos++; + buffer.erase(0, pos); + + std::size_t cmtpos{buffer.find_first_of('#')}; + if(cmtpos < buffer.length()) + buffer.resize(cmtpos); + while(!buffer.empty() && std::isspace(buffer.back())) + buffer.pop_back(); + + if(!buffer.empty()) + return true; + } + return false; +} + + +std::string read_word(std::istream &f) +{ + std::string ret; + f >> ret; + return ret; +} + +bool is_at_end(const std::string &buffer, std::size_t endpos) +{ + while(endpos < buffer.length() && std::isspace(buffer[endpos])) + ++endpos; + return !(endpos < buffer.length()); +} + + +bool load_ambdec_speakers(al::vector &spkrs, const std::size_t num_speakers, std::istream &f, std::string &buffer) +{ + while(spkrs.size() < num_speakers) + { + std::istringstream istr{buffer}; + + std::string cmd{read_word(istr)}; + if(cmd.empty()) + { + if(!read_clipped_line(f, buffer)) + { + ERR("Unexpected end of file\n"); + return false; + } + continue; + } + + if(cmd == "add_spkr") + { + spkrs.emplace_back(); + AmbDecConf::SpeakerConf &spkr = spkrs.back(); + const size_t spkr_num{spkrs.size()}; + + istr >> spkr.Name; + if(istr.fail()) WARN("Name not specified for speaker %zu\n", spkr_num); + istr >> spkr.Distance; + if(istr.fail()) WARN("Distance not specified for speaker %zu\n", spkr_num); + istr >> spkr.Azimuth; + if(istr.fail()) WARN("Azimuth not specified for speaker %zu\n", spkr_num); + istr >> spkr.Elevation; + if(istr.fail()) WARN("Elevation not specified for speaker %zu\n", spkr_num); + istr >> spkr.Connection; + if(istr.fail()) TRACE("Connection not specified for speaker %zu\n", spkr_num); + } + else + { + ERR("Unexpected speakers command: %s\n", cmd.c_str()); + return false; + } + + istr.clear(); + const auto endpos = static_cast(istr.tellg()); + if(!is_at_end(buffer, endpos)) + { + ERR("Unexpected junk on line: %s\n", buffer.c_str()+endpos); + return false; + } + buffer.clear(); + } + + return true; +} + +bool load_ambdec_matrix(float (&gains)[MAX_AMBI_ORDER+1], al::vector &matrix, const std::size_t maxrow, std::istream &f, std::string &buffer) +{ + bool gotgains{false}; + std::size_t cur{0u}; + while(cur < maxrow) + { + std::istringstream istr{buffer}; + + std::string cmd{read_word(istr)}; + if(cmd.empty()) + { + if(!read_clipped_line(f, buffer)) + { + ERR("Unexpected end of file\n"); + return false; + } + continue; + } + + if(cmd == "order_gain") + { + std::size_t curgain{0u}; + float value; + while(istr.good()) + { + istr >> value; + if(istr.fail()) break; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk on gain %zu: %s\n", curgain+1, + buffer.c_str()+static_cast(istr.tellg())); + return false; + } + if(curgain < size(gains)) + gains[curgain++] = value; + } + std::fill(std::begin(gains)+curgain, std::end(gains), 0.0f); + gotgains = true; + } + else if(cmd == "add_row") + { + matrix.emplace_back(); + AmbDecConf::CoeffArray &mtxrow = matrix.back(); + std::size_t curidx{0u}; + float value{}; + while(istr.good()) + { + istr >> value; + if(istr.fail()) break; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk on matrix element %zux%zu: %s\n", curidx, + matrix.size(), buffer.c_str()+static_cast(istr.tellg())); + matrix.pop_back(); + return false; + } + if(curidx < mtxrow.size()) + mtxrow[curidx++] = value; + } + std::fill(mtxrow.begin()+curidx, mtxrow.end(), 0.0f); + cur++; + } + else + { + ERR("Unexpected matrix command: %s\n", cmd.c_str()); + return false; + } + + istr.clear(); + const auto endpos = static_cast(istr.tellg()); + if(!is_at_end(buffer, endpos)) + { + ERR("Unexpected junk on line: %s\n", buffer.c_str()+endpos); + return false; + } + buffer.clear(); + } + + if(!gotgains) + { + ERR("Matrix order_gain not specified\n"); + return false; + } + + return true; +} + +} // namespace + +int AmbDecConf::load(const char *fname) noexcept +{ + al::ifstream f{fname}; + if(!f.is_open()) + { + ERR("Failed to open: %s\n", fname); + return 0; + } + + std::size_t num_speakers{0u}; + std::string buffer; + while(read_clipped_line(f, buffer)) + { + std::istringstream istr{buffer}; + + std::string command{read_word(istr)}; + if(command.empty()) + { + ERR("Malformed line: %s\n", buffer.c_str()); + return 0; + } + + if(command == "/description") + istr >> Description; + else if(command == "/version") + { + istr >> Version; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk after version: %s\n", + buffer.c_str()+static_cast(istr.tellg())); + return 0; + } + if(Version != 3) + { + ERR("Unsupported version: %u\n", Version); + return 0; + } + } + else if(command == "/dec/chan_mask") + { + istr >> std::hex >> ChanMask >> std::dec; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk after mask: %s\n", + buffer.c_str()+static_cast(istr.tellg())); + return 0; + } + } + else if(command == "/dec/freq_bands") + { + istr >> FreqBands; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk after freq_bands: %s\n", + buffer.c_str()+static_cast(istr.tellg())); + return 0; + } + if(FreqBands != 1 && FreqBands != 2) + { + ERR("Invalid freq_bands value: %u\n", FreqBands); + return 0; + } + } + else if(command == "/dec/speakers") + { + istr >> num_speakers; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk after speakers: %s\n", + buffer.c_str()+static_cast(istr.tellg())); + return 0; + } + Speakers.reserve(num_speakers); + LFMatrix.reserve(num_speakers); + HFMatrix.reserve(num_speakers); + } + else if(command == "/dec/coeff_scale") + { + std::string scale = read_word(istr); + if(scale == "n3d") CoeffScale = AmbDecScale::N3D; + else if(scale == "sn3d") CoeffScale = AmbDecScale::SN3D; + else if(scale == "fuma") CoeffScale = AmbDecScale::FuMa; + else + { + ERR("Unsupported coeff scale: %s\n", scale.c_str()); + return 0; + } + } + else if(command == "/opt/xover_freq") + { + istr >> XOverFreq; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk after xover_freq: %s\n", + buffer.c_str()+static_cast(istr.tellg())); + return 0; + } + } + else if(command == "/opt/xover_ratio") + { + istr >> XOverRatio; + if(!istr.eof() && !std::isspace(istr.peek())) + { + ERR("Extra junk after xover_ratio: %s\n", + buffer.c_str()+static_cast(istr.tellg())); + return 0; + } + } + else if(command == "/opt/input_scale" || command == "/opt/nfeff_comp" || + command == "/opt/delay_comp" || command == "/opt/level_comp") + { + /* Unused */ + read_word(istr); + } + else if(command == "/speakers/{") + { + const auto endpos = static_cast(istr.tellg()); + if(!is_at_end(buffer, endpos)) + { + ERR("Unexpected junk on line: %s\n", buffer.c_str()+endpos); + return 0; + } + buffer.clear(); + + if(!load_ambdec_speakers(Speakers, num_speakers, f, buffer)) + return 0; + + if(!read_clipped_line(f, buffer)) + { + ERR("Unexpected end of file\n"); + return 0; + } + std::istringstream istr2{buffer}; + std::string endmark{read_word(istr2)}; + if(endmark != "/}") + { + ERR("Expected /} after speaker definitions, got %s\n", endmark.c_str()); + return 0; + } + istr.swap(istr2); + } + else if(command == "/lfmatrix/{" || command == "/hfmatrix/{" || command == "/matrix/{") + { + const auto endpos = static_cast(istr.tellg()); + if(!is_at_end(buffer, endpos)) + { + ERR("Unexpected junk on line: %s\n", buffer.c_str()+endpos); + return 0; + } + buffer.clear(); + + if(FreqBands == 1) + { + if(command != "/matrix/{") + { + ERR("Unexpected \"%s\" type for a single-band decoder\n", command.c_str()); + return 0; + } + if(!load_ambdec_matrix(HFOrderGain, HFMatrix, num_speakers, f, buffer)) + return 0; + } + else + { + if(command == "/lfmatrix/{") + { + if(!load_ambdec_matrix(LFOrderGain, LFMatrix, num_speakers, f, buffer)) + return 0; + } + else if(command == "/hfmatrix/{") + { + if(!load_ambdec_matrix(HFOrderGain, HFMatrix, num_speakers, f, buffer)) + return 0; + } + else + { + ERR("Unexpected \"%s\" type for a dual-band decoder\n", command.c_str()); + return 0; + } + } + + if(!read_clipped_line(f, buffer)) + { + ERR("Unexpected end of file\n"); + return 0; + } + std::istringstream istr2{buffer}; + std::string endmark{read_word(istr2)}; + if(endmark != "/}") + { + ERR("Expected /} after matrix definitions, got %s\n", endmark.c_str()); + return 0; + } + istr.swap(istr2); + } + else if(command == "/end") + { + const auto endpos = static_cast(istr.tellg()); + if(!is_at_end(buffer, endpos)) + { + ERR("Unexpected junk on end: %s\n", buffer.c_str()+endpos); + return 0; + } + + return 1; + } + else + { + ERR("Unexpected command: %s\n", command.c_str()); + return 0; + } + + istr.clear(); + const auto endpos = static_cast(istr.tellg()); + if(!is_at_end(buffer, endpos)) + { + ERR("Unexpected junk on line: %s\n", buffer.c_str()+endpos); + return 0; + } + buffer.clear(); + } + ERR("Unexpected end of file\n"); + + return 0; +} diff --git a/alc/ambdec.h b/alc/ambdec.h new file mode 100644 index 0000000..ff7b71e --- /dev/null +++ b/alc/ambdec.h @@ -0,0 +1,48 @@ +#ifndef AMBDEC_H +#define AMBDEC_H + +#include +#include + +#include "ambidefs.h" +#include "vector.h" + +/* Helpers to read .ambdec configuration files. */ + +enum class AmbDecScale { + N3D, + SN3D, + FuMa, +}; +struct AmbDecConf { + std::string Description; + int Version{0}; /* Must be 3 */ + + unsigned int ChanMask{0u}; + unsigned int FreqBands{0u}; /* Must be 1 or 2 */ + AmbDecScale CoeffScale{}; + + float XOverFreq{0.0f}; + float XOverRatio{0.0f}; + + struct SpeakerConf { + std::string Name; + float Distance{0.0f}; + float Azimuth{0.0f}; + float Elevation{0.0f}; + std::string Connection; + }; + al::vector Speakers; + + using CoeffArray = std::array; + /* Unused when FreqBands == 1 */ + float LFOrderGain[MAX_AMBI_ORDER+1]{}; + al::vector LFMatrix; + + float HFOrderGain[MAX_AMBI_ORDER+1]{}; + al::vector HFMatrix; + + int load(const char *fname) noexcept; +}; + +#endif /* AMBDEC_H */ diff --git a/alc/ambidefs.h b/alc/ambidefs.h new file mode 100644 index 0000000..5a34804 --- /dev/null +++ b/alc/ambidefs.h @@ -0,0 +1,132 @@ +#ifndef AMBIDEFS_H +#define AMBIDEFS_H + +#include +#include + +/* The maximum number of Ambisonics channels. For a given order (o), the size + * needed will be (o+1)**2, thus zero-order has 1, first-order has 4, second- + * order has 9, third-order has 16, and fourth-order has 25. + */ +#define MAX_AMBI_ORDER 3 +constexpr inline size_t AmbiChannelsFromOrder(size_t order) noexcept +{ return (order+1) * (order+1); } +#define MAX_AMBI_CHANNELS AmbiChannelsFromOrder(MAX_AMBI_ORDER) + +/* A bitmask of ambisonic channels for 0 to 4th order. This only specifies up + * to 4th order, which is the highest order a 32-bit mask value can specify (a + * 64-bit mask could handle up to 7th order). + */ +#define AMBI_0ORDER_MASK 0x00000001 +#define AMBI_1ORDER_MASK 0x0000000f +#define AMBI_2ORDER_MASK 0x000001ff +#define AMBI_3ORDER_MASK 0x0000ffff +#define AMBI_4ORDER_MASK 0x01ffffff + +/* A bitmask of ambisonic channels with height information. If none of these + * channels are used/needed, there's no height (e.g. with most surround sound + * speaker setups). This is ACN ordering, with bit 0 being ACN 0, etc. + */ +#define AMBI_PERIPHONIC_MASK (0xfe7ce4) + +/* The maximum number of ambisonic channels for 2D (non-periphonic) + * representation. This is 2 per each order above zero-order, plus 1 for zero- + * order. Or simply, o*2 + 1. + */ +constexpr inline size_t Ambi2DChannelsFromOrder(size_t order) noexcept +{ return order*2 + 1; } +#define MAX_AMBI2D_CHANNELS Ambi2DChannelsFromOrder(MAX_AMBI_ORDER) + + +/* NOTE: These are scale factors as applied to Ambisonics content. Decoder + * coefficients should be divided by these values to get proper scalings. + */ +struct AmbiScale { + static constexpr std::array FromN3D{{ + 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f + }}; + static constexpr std::array FromSN3D{{ + 1.000000000f, /* ACN 0, sqrt(1) */ + 1.732050808f, /* ACN 1, sqrt(3) */ + 1.732050808f, /* ACN 2, sqrt(3) */ + 1.732050808f, /* ACN 3, sqrt(3) */ + 2.236067978f, /* ACN 4, sqrt(5) */ + 2.236067978f, /* ACN 5, sqrt(5) */ + 2.236067978f, /* ACN 6, sqrt(5) */ + 2.236067978f, /* ACN 7, sqrt(5) */ + 2.236067978f, /* ACN 8, sqrt(5) */ + 2.645751311f, /* ACN 9, sqrt(7) */ + 2.645751311f, /* ACN 10, sqrt(7) */ + 2.645751311f, /* ACN 11, sqrt(7) */ + 2.645751311f, /* ACN 12, sqrt(7) */ + 2.645751311f, /* ACN 13, sqrt(7) */ + 2.645751311f, /* ACN 14, sqrt(7) */ + 2.645751311f, /* ACN 15, sqrt(7) */ + }}; + static constexpr std::array FromFuMa{{ + 1.414213562f, /* ACN 0 (W), sqrt(2) */ + 1.732050808f, /* ACN 1 (Y), sqrt(3) */ + 1.732050808f, /* ACN 2 (Z), sqrt(3) */ + 1.732050808f, /* ACN 3 (X), sqrt(3) */ + 1.936491673f, /* ACN 4 (V), sqrt(15)/2 */ + 1.936491673f, /* ACN 5 (T), sqrt(15)/2 */ + 2.236067978f, /* ACN 6 (R), sqrt(5) */ + 1.936491673f, /* ACN 7 (S), sqrt(15)/2 */ + 1.936491673f, /* ACN 8 (U), sqrt(15)/2 */ + 2.091650066f, /* ACN 9 (Q), sqrt(35/8) */ + 1.972026594f, /* ACN 10 (O), sqrt(35)/3 */ + 2.231093404f, /* ACN 11 (M), sqrt(224/45) */ + 2.645751311f, /* ACN 12 (K), sqrt(7) */ + 2.231093404f, /* ACN 13 (L), sqrt(224/45) */ + 1.972026594f, /* ACN 14 (N), sqrt(35)/3 */ + 2.091650066f, /* ACN 15 (P), sqrt(35/8) */ + }}; +}; + +struct AmbiIndex { + static constexpr std::array FromFuMa{{ + 0, /* W */ + 3, /* X */ + 1, /* Y */ + 2, /* Z */ + 6, /* R */ + 7, /* S */ + 5, /* T */ + 8, /* U */ + 4, /* V */ + 12, /* K */ + 13, /* L */ + 11, /* M */ + 14, /* N */ + 10, /* O */ + 15, /* P */ + 9, /* Q */ + }}; + static constexpr std::array FromFuMa2D{{ + 0, /* W */ + 3, /* X */ + 1, /* Y */ + 8, /* U */ + 4, /* V */ + 15, /* P */ + 9, /* Q */ + }}; + + static constexpr std::array FromACN{{ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15 + }}; + static constexpr std::array From2D{{ + 0, 1,3, 4,8, 9,15 + }}; + + static constexpr std::array OrderFromChannel{{ + 0, 1,1,1, 2,2,2,2,2, 3,3,3,3,3,3,3, + }}; + static constexpr std::array OrderFrom2DChannel{{ + 0, 1,1, 2,2, 3,3, + }}; +}; + +#endif /* AMBIDEFS_H */ diff --git a/alc/backends/alsa.cpp b/alc/backends/alsa.cpp new file mode 100644 index 0000000..a011d72 --- /dev/null +++ b/alc/backends/alsa.cpp @@ -0,0 +1,1267 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/alsa.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" + +#include "albyte.h" +#include "alcmain.h" +#include "alconfig.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alu.h" +#include "dynload.h" +#include "logging.h" +#include "ringbuffer.h" +#include "threads.h" +#include "vector.h" + +#include + + +namespace { + +constexpr ALCchar alsaDevice[] = "ALSA Default"; + + +#ifdef HAVE_DYNLOAD +#define ALSA_FUNCS(MAGIC) \ + MAGIC(snd_strerror); \ + MAGIC(snd_pcm_open); \ + MAGIC(snd_pcm_close); \ + MAGIC(snd_pcm_nonblock); \ + MAGIC(snd_pcm_frames_to_bytes); \ + MAGIC(snd_pcm_bytes_to_frames); \ + MAGIC(snd_pcm_hw_params_malloc); \ + MAGIC(snd_pcm_hw_params_free); \ + MAGIC(snd_pcm_hw_params_any); \ + MAGIC(snd_pcm_hw_params_current); \ + MAGIC(snd_pcm_hw_params_set_access); \ + MAGIC(snd_pcm_hw_params_set_format); \ + MAGIC(snd_pcm_hw_params_set_channels); \ + MAGIC(snd_pcm_hw_params_set_periods_near); \ + MAGIC(snd_pcm_hw_params_set_rate_near); \ + MAGIC(snd_pcm_hw_params_set_rate); \ + MAGIC(snd_pcm_hw_params_set_rate_resample); \ + MAGIC(snd_pcm_hw_params_set_buffer_time_near); \ + MAGIC(snd_pcm_hw_params_set_period_time_near); \ + MAGIC(snd_pcm_hw_params_set_buffer_size_near); \ + MAGIC(snd_pcm_hw_params_set_period_size_near); \ + MAGIC(snd_pcm_hw_params_set_buffer_size_min); \ + MAGIC(snd_pcm_hw_params_get_buffer_time_min); \ + MAGIC(snd_pcm_hw_params_get_buffer_time_max); \ + MAGIC(snd_pcm_hw_params_get_period_time_min); \ + MAGIC(snd_pcm_hw_params_get_period_time_max); \ + MAGIC(snd_pcm_hw_params_get_buffer_size); \ + MAGIC(snd_pcm_hw_params_get_period_size); \ + MAGIC(snd_pcm_hw_params_get_access); \ + MAGIC(snd_pcm_hw_params_get_periods); \ + MAGIC(snd_pcm_hw_params_test_format); \ + MAGIC(snd_pcm_hw_params_test_channels); \ + MAGIC(snd_pcm_hw_params); \ + MAGIC(snd_pcm_sw_params_malloc); \ + MAGIC(snd_pcm_sw_params_current); \ + MAGIC(snd_pcm_sw_params_set_avail_min); \ + MAGIC(snd_pcm_sw_params_set_stop_threshold); \ + MAGIC(snd_pcm_sw_params); \ + MAGIC(snd_pcm_sw_params_free); \ + MAGIC(snd_pcm_prepare); \ + MAGIC(snd_pcm_start); \ + MAGIC(snd_pcm_resume); \ + MAGIC(snd_pcm_reset); \ + MAGIC(snd_pcm_wait); \ + MAGIC(snd_pcm_delay); \ + MAGIC(snd_pcm_state); \ + MAGIC(snd_pcm_avail_update); \ + MAGIC(snd_pcm_areas_silence); \ + MAGIC(snd_pcm_mmap_begin); \ + MAGIC(snd_pcm_mmap_commit); \ + MAGIC(snd_pcm_readi); \ + MAGIC(snd_pcm_writei); \ + MAGIC(snd_pcm_drain); \ + MAGIC(snd_pcm_drop); \ + MAGIC(snd_pcm_recover); \ + MAGIC(snd_pcm_info_malloc); \ + MAGIC(snd_pcm_info_free); \ + MAGIC(snd_pcm_info_set_device); \ + MAGIC(snd_pcm_info_set_subdevice); \ + MAGIC(snd_pcm_info_set_stream); \ + MAGIC(snd_pcm_info_get_name); \ + MAGIC(snd_ctl_pcm_next_device); \ + MAGIC(snd_ctl_pcm_info); \ + MAGIC(snd_ctl_open); \ + MAGIC(snd_ctl_close); \ + MAGIC(snd_ctl_card_info_malloc); \ + MAGIC(snd_ctl_card_info_free); \ + MAGIC(snd_ctl_card_info); \ + MAGIC(snd_ctl_card_info_get_name); \ + MAGIC(snd_ctl_card_info_get_id); \ + MAGIC(snd_card_next); \ + MAGIC(snd_config_update_free_global) + +static void *alsa_handle; +#define MAKE_FUNC(f) decltype(f) * p##f +ALSA_FUNCS(MAKE_FUNC); +#undef MAKE_FUNC + +#ifndef IN_IDE_PARSER +#define snd_strerror psnd_strerror +#define snd_pcm_open psnd_pcm_open +#define snd_pcm_close psnd_pcm_close +#define snd_pcm_nonblock psnd_pcm_nonblock +#define snd_pcm_frames_to_bytes psnd_pcm_frames_to_bytes +#define snd_pcm_bytes_to_frames psnd_pcm_bytes_to_frames +#define snd_pcm_hw_params_malloc psnd_pcm_hw_params_malloc +#define snd_pcm_hw_params_free psnd_pcm_hw_params_free +#define snd_pcm_hw_params_any psnd_pcm_hw_params_any +#define snd_pcm_hw_params_current psnd_pcm_hw_params_current +#define snd_pcm_hw_params_set_access psnd_pcm_hw_params_set_access +#define snd_pcm_hw_params_set_format psnd_pcm_hw_params_set_format +#define snd_pcm_hw_params_set_channels psnd_pcm_hw_params_set_channels +#define snd_pcm_hw_params_set_periods_near psnd_pcm_hw_params_set_periods_near +#define snd_pcm_hw_params_set_rate_near psnd_pcm_hw_params_set_rate_near +#define snd_pcm_hw_params_set_rate psnd_pcm_hw_params_set_rate +#define snd_pcm_hw_params_set_rate_resample psnd_pcm_hw_params_set_rate_resample +#define snd_pcm_hw_params_set_buffer_time_near psnd_pcm_hw_params_set_buffer_time_near +#define snd_pcm_hw_params_set_period_time_near psnd_pcm_hw_params_set_period_time_near +#define snd_pcm_hw_params_set_buffer_size_near psnd_pcm_hw_params_set_buffer_size_near +#define snd_pcm_hw_params_set_period_size_near psnd_pcm_hw_params_set_period_size_near +#define snd_pcm_hw_params_set_buffer_size_min psnd_pcm_hw_params_set_buffer_size_min +#define snd_pcm_hw_params_get_buffer_time_min psnd_pcm_hw_params_get_buffer_time_min +#define snd_pcm_hw_params_get_buffer_time_max psnd_pcm_hw_params_get_buffer_time_max +#define snd_pcm_hw_params_get_period_time_min psnd_pcm_hw_params_get_period_time_min +#define snd_pcm_hw_params_get_period_time_max psnd_pcm_hw_params_get_period_time_max +#define snd_pcm_hw_params_get_buffer_size psnd_pcm_hw_params_get_buffer_size +#define snd_pcm_hw_params_get_period_size psnd_pcm_hw_params_get_period_size +#define snd_pcm_hw_params_get_access psnd_pcm_hw_params_get_access +#define snd_pcm_hw_params_get_periods psnd_pcm_hw_params_get_periods +#define snd_pcm_hw_params_test_format psnd_pcm_hw_params_test_format +#define snd_pcm_hw_params_test_channels psnd_pcm_hw_params_test_channels +#define snd_pcm_hw_params psnd_pcm_hw_params +#define snd_pcm_sw_params_malloc psnd_pcm_sw_params_malloc +#define snd_pcm_sw_params_current psnd_pcm_sw_params_current +#define snd_pcm_sw_params_set_avail_min psnd_pcm_sw_params_set_avail_min +#define snd_pcm_sw_params_set_stop_threshold psnd_pcm_sw_params_set_stop_threshold +#define snd_pcm_sw_params psnd_pcm_sw_params +#define snd_pcm_sw_params_free psnd_pcm_sw_params_free +#define snd_pcm_prepare psnd_pcm_prepare +#define snd_pcm_start psnd_pcm_start +#define snd_pcm_resume psnd_pcm_resume +#define snd_pcm_reset psnd_pcm_reset +#define snd_pcm_wait psnd_pcm_wait +#define snd_pcm_delay psnd_pcm_delay +#define snd_pcm_state psnd_pcm_state +#define snd_pcm_avail_update psnd_pcm_avail_update +#define snd_pcm_areas_silence psnd_pcm_areas_silence +#define snd_pcm_mmap_begin psnd_pcm_mmap_begin +#define snd_pcm_mmap_commit psnd_pcm_mmap_commit +#define snd_pcm_readi psnd_pcm_readi +#define snd_pcm_writei psnd_pcm_writei +#define snd_pcm_drain psnd_pcm_drain +#define snd_pcm_drop psnd_pcm_drop +#define snd_pcm_recover psnd_pcm_recover +#define snd_pcm_info_malloc psnd_pcm_info_malloc +#define snd_pcm_info_free psnd_pcm_info_free +#define snd_pcm_info_set_device psnd_pcm_info_set_device +#define snd_pcm_info_set_subdevice psnd_pcm_info_set_subdevice +#define snd_pcm_info_set_stream psnd_pcm_info_set_stream +#define snd_pcm_info_get_name psnd_pcm_info_get_name +#define snd_ctl_pcm_next_device psnd_ctl_pcm_next_device +#define snd_ctl_pcm_info psnd_ctl_pcm_info +#define snd_ctl_open psnd_ctl_open +#define snd_ctl_close psnd_ctl_close +#define snd_ctl_card_info_malloc psnd_ctl_card_info_malloc +#define snd_ctl_card_info_free psnd_ctl_card_info_free +#define snd_ctl_card_info psnd_ctl_card_info +#define snd_ctl_card_info_get_name psnd_ctl_card_info_get_name +#define snd_ctl_card_info_get_id psnd_ctl_card_info_get_id +#define snd_card_next psnd_card_next +#define snd_config_update_free_global psnd_config_update_free_global +#endif +#endif + + +struct HwParamsDeleter { + void operator()(snd_pcm_hw_params_t *ptr) { snd_pcm_hw_params_free(ptr); } +}; +using HwParamsPtr = std::unique_ptr; +HwParamsPtr CreateHwParams() +{ + snd_pcm_hw_params_t *hp{}; + snd_pcm_hw_params_malloc(&hp); + return HwParamsPtr{hp}; +} + +struct SwParamsDeleter { + void operator()(snd_pcm_sw_params_t *ptr) { snd_pcm_sw_params_free(ptr); } +}; +using SwParamsPtr = std::unique_ptr; +SwParamsPtr CreateSwParams() +{ + snd_pcm_sw_params_t *sp{}; + snd_pcm_sw_params_malloc(&sp); + return SwParamsPtr{sp}; +} + + +struct DevMap { + std::string name; + std::string device_name; +}; + +al::vector PlaybackDevices; +al::vector CaptureDevices; + + +const char *prefix_name(snd_pcm_stream_t stream) +{ + assert(stream == SND_PCM_STREAM_PLAYBACK || stream == SND_PCM_STREAM_CAPTURE); + return (stream==SND_PCM_STREAM_PLAYBACK) ? "device-prefix" : "capture-prefix"; +} + +al::vector probe_devices(snd_pcm_stream_t stream) +{ + al::vector devlist; + + snd_ctl_card_info_t *info; + snd_ctl_card_info_malloc(&info); + snd_pcm_info_t *pcminfo; + snd_pcm_info_malloc(&pcminfo); + + devlist.emplace_back(DevMap{alsaDevice, + GetConfigValue(nullptr, "alsa", (stream==SND_PCM_STREAM_PLAYBACK) ? "device" : "capture", + "default")}); + + const char *customdevs{GetConfigValue(nullptr, "alsa", + (stream == SND_PCM_STREAM_PLAYBACK) ? "custom-devices" : "custom-captures", "")}; + while(const char *curdev{customdevs}) + { + if(!curdev[0]) break; + customdevs = strchr(curdev, ';'); + const char *sep{strchr(curdev, '=')}; + if(!sep) + { + std::string spec{customdevs ? std::string(curdev, customdevs++) : std::string(curdev)}; + ERR("Invalid ALSA device specification \"%s\"\n", spec.c_str()); + continue; + } + + const char *oldsep{sep++}; + devlist.emplace_back(DevMap{std::string(curdev, oldsep), + customdevs ? std::string(sep, customdevs++) : std::string(sep)}); + const auto &entry = devlist.back(); + TRACE("Got device \"%s\", \"%s\"\n", entry.name.c_str(), entry.device_name.c_str()); + } + + const std::string main_prefix{ + ConfigValueStr(nullptr, "alsa", prefix_name(stream)).value_or("plughw:")}; + + int card{-1}; + int err{snd_card_next(&card)}; + for(;err >= 0 && card >= 0;err = snd_card_next(&card)) + { + std::string name{"hw:" + std::to_string(card)}; + + snd_ctl_t *handle; + if((err=snd_ctl_open(&handle, name.c_str(), 0)) < 0) + { + ERR("control open (hw:%d): %s\n", card, snd_strerror(err)); + continue; + } + if((err=snd_ctl_card_info(handle, info)) < 0) + { + ERR("control hardware info (hw:%d): %s\n", card, snd_strerror(err)); + snd_ctl_close(handle); + continue; + } + + const char *cardname{snd_ctl_card_info_get_name(info)}; + const char *cardid{snd_ctl_card_info_get_id(info)}; + name = prefix_name(stream); + name += '-'; + name += cardid; + const std::string card_prefix{ + ConfigValueStr(nullptr, "alsa", name.c_str()).value_or(main_prefix)}; + + int dev{-1}; + while(1) + { + if(snd_ctl_pcm_next_device(handle, &dev) < 0) + ERR("snd_ctl_pcm_next_device failed\n"); + if(dev < 0) break; + + snd_pcm_info_set_device(pcminfo, static_cast(dev)); + snd_pcm_info_set_subdevice(pcminfo, 0); + snd_pcm_info_set_stream(pcminfo, stream); + if((err=snd_ctl_pcm_info(handle, pcminfo)) < 0) + { + if(err != -ENOENT) + ERR("control digital audio info (hw:%d): %s\n", card, snd_strerror(err)); + continue; + } + + /* "prefix-cardid-dev" */ + name = prefix_name(stream); + name += '-'; + name += cardid; + name += '-'; + name += std::to_string(dev); + const std::string device_prefix{ + ConfigValueStr(nullptr, "alsa", name.c_str()).value_or(card_prefix)}; + + /* "CardName, PcmName (CARD=cardid,DEV=dev)" */ + name = cardname; + name += ", "; + name += snd_pcm_info_get_name(pcminfo); + name += " (CARD="; + name += cardid; + name += ",DEV="; + name += std::to_string(dev); + name += ')'; + + /* "devprefixCARD=cardid,DEV=dev" */ + std::string device{device_prefix}; + device += "CARD="; + device += cardid; + device += ",DEV="; + device += std::to_string(dev); + + devlist.emplace_back(DevMap{std::move(name), std::move(device)}); + const auto &entry = devlist.back(); + TRACE("Got device \"%s\", \"%s\"\n", entry.name.c_str(), entry.device_name.c_str()); + } + snd_ctl_close(handle); + } + if(err < 0) + ERR("snd_card_next failed: %s\n", snd_strerror(err)); + + snd_pcm_info_free(pcminfo); + snd_ctl_card_info_free(info); + + return devlist; +} + + +int verify_state(snd_pcm_t *handle) +{ + snd_pcm_state_t state{snd_pcm_state(handle)}; + + int err; + switch(state) + { + case SND_PCM_STATE_OPEN: + case SND_PCM_STATE_SETUP: + case SND_PCM_STATE_PREPARED: + case SND_PCM_STATE_RUNNING: + case SND_PCM_STATE_DRAINING: + case SND_PCM_STATE_PAUSED: + /* All Okay */ + break; + + case SND_PCM_STATE_XRUN: + if((err=snd_pcm_recover(handle, -EPIPE, 1)) < 0) + return err; + break; + case SND_PCM_STATE_SUSPENDED: + if((err=snd_pcm_recover(handle, -ESTRPIPE, 1)) < 0) + return err; + break; + case SND_PCM_STATE_DISCONNECTED: + return -ENODEV; + } + + return state; +} + + +struct AlsaPlayback final : public BackendBase { + AlsaPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~AlsaPlayback() override; + + int mixerProc(); + int mixerNoMMapProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + ClockLatency getClockLatency() override; + + snd_pcm_t *mPcmHandle{nullptr}; + + al::vector mBuffer; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(AlsaPlayback) +}; + +AlsaPlayback::~AlsaPlayback() +{ + if(mPcmHandle) + snd_pcm_close(mPcmHandle); + mPcmHandle = nullptr; +} + + +int AlsaPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t samplebits{mDevice->bytesFromFmt() * 8}; + const snd_pcm_uframes_t update_size{mDevice->UpdateSize}; + const snd_pcm_uframes_t buffer_size{mDevice->BufferSize}; + while(!mKillNow.load(std::memory_order_acquire)) + { + int state{verify_state(mPcmHandle)}; + if(state < 0) + { + ERR("Invalid state detected: %s\n", snd_strerror(state)); + aluHandleDisconnect(mDevice, "Bad state: %s", snd_strerror(state)); + break; + } + + snd_pcm_sframes_t avails{snd_pcm_avail_update(mPcmHandle)}; + if(avails < 0) + { + ERR("available update failed: %s\n", snd_strerror(static_cast(avails))); + continue; + } + snd_pcm_uframes_t avail{static_cast(avails)}; + + if(avail > buffer_size) + { + WARN("available samples exceeds the buffer size\n"); + snd_pcm_reset(mPcmHandle); + continue; + } + + // make sure there's frames to process + if(avail < update_size) + { + if(state != SND_PCM_STATE_RUNNING) + { + int err{snd_pcm_start(mPcmHandle)}; + if(err < 0) + { + ERR("start failed: %s\n", snd_strerror(err)); + continue; + } + } + if(snd_pcm_wait(mPcmHandle, 1000) == 0) + ERR("Wait timeout... buffer size too low?\n"); + continue; + } + avail -= avail%update_size; + + // it is possible that contiguous areas are smaller, thus we use a loop + std::lock_guard _{*this}; + while(avail > 0) + { + snd_pcm_uframes_t frames{avail}; + + const snd_pcm_channel_area_t *areas{}; + snd_pcm_uframes_t offset{}; + int err{snd_pcm_mmap_begin(mPcmHandle, &areas, &offset, &frames)}; + if(err < 0) + { + ERR("mmap begin error: %s\n", snd_strerror(err)); + break; + } + + char *WritePtr{static_cast(areas->addr) + (offset * areas->step / 8)}; + aluMixData(mDevice, WritePtr, static_cast(frames), areas->step / samplebits); + + snd_pcm_sframes_t commitres{snd_pcm_mmap_commit(mPcmHandle, offset, frames)}; + if(commitres < 0 || (static_cast(commitres)-frames) != 0) + { + ERR("mmap commit error: %s\n", + snd_strerror(commitres >= 0 ? -EPIPE : static_cast(commitres))); + break; + } + + avail -= frames; + } + } + + return 0; +} + +int AlsaPlayback::mixerNoMMapProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t frame_step{mDevice->channelsFromFmt()}; + const snd_pcm_uframes_t update_size{mDevice->UpdateSize}; + const snd_pcm_uframes_t buffer_size{mDevice->BufferSize}; + while(!mKillNow.load(std::memory_order_acquire)) + { + int state{verify_state(mPcmHandle)}; + if(state < 0) + { + ERR("Invalid state detected: %s\n", snd_strerror(state)); + aluHandleDisconnect(mDevice, "Bad state: %s", snd_strerror(state)); + break; + } + + snd_pcm_sframes_t avail{snd_pcm_avail_update(mPcmHandle)}; + if(avail < 0) + { + ERR("available update failed: %s\n", snd_strerror(static_cast(avail))); + continue; + } + + if(static_cast(avail) > buffer_size) + { + WARN("available samples exceeds the buffer size\n"); + snd_pcm_reset(mPcmHandle); + continue; + } + + if(static_cast(avail) < update_size) + { + if(state != SND_PCM_STATE_RUNNING) + { + int err{snd_pcm_start(mPcmHandle)}; + if(err < 0) + { + ERR("start failed: %s\n", snd_strerror(err)); + continue; + } + } + if(snd_pcm_wait(mPcmHandle, 1000) == 0) + ERR("Wait timeout... buffer size too low?\n"); + continue; + } + + std::lock_guard _{*this}; + al::byte *WritePtr{mBuffer.data()}; + avail = snd_pcm_bytes_to_frames(mPcmHandle, static_cast(mBuffer.size())); + aluMixData(mDevice, WritePtr, static_cast(avail), frame_step); + while(avail > 0) + { + snd_pcm_sframes_t ret{snd_pcm_writei(mPcmHandle, WritePtr, + static_cast(avail))}; + switch(ret) + { + case -EAGAIN: + continue; +#if ESTRPIPE != EPIPE + case -ESTRPIPE: +#endif + case -EPIPE: + case -EINTR: + ret = snd_pcm_recover(mPcmHandle, static_cast(ret), 1); + if(ret < 0) + avail = 0; + break; + default: + if(ret >= 0) + { + WritePtr += snd_pcm_frames_to_bytes(mPcmHandle, ret); + avail -= ret; + } + break; + } + if(ret < 0) + { + ret = snd_pcm_prepare(mPcmHandle); + if(ret < 0) break; + } + } + } + + return 0; +} + + +void AlsaPlayback::open(const ALCchar *name) +{ + const char *driver{}; + if(name) + { + if(PlaybackDevices.empty()) + PlaybackDevices = probe_devices(SND_PCM_STREAM_PLAYBACK); + + auto iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == PlaybackDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + driver = iter->device_name.c_str(); + } + else + { + name = alsaDevice; + driver = GetConfigValue(nullptr, "alsa", "device", "default"); + } + + TRACE("Opening device \"%s\"\n", driver); + int err{snd_pcm_open(&mPcmHandle, driver, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)}; + if(err < 0) + throw al::backend_exception{ALC_OUT_OF_MEMORY, "Could not open ALSA device \"%s\"", + driver}; + + /* Free alsa's global config tree. Otherwise valgrind reports a ton of leaks. */ + snd_config_update_free_global(); + + mDevice->DeviceName = name; +} + +bool AlsaPlayback::reset() +{ + snd_pcm_format_t format{SND_PCM_FORMAT_UNKNOWN}; + switch(mDevice->FmtType) + { + case DevFmtByte: + format = SND_PCM_FORMAT_S8; + break; + case DevFmtUByte: + format = SND_PCM_FORMAT_U8; + break; + case DevFmtShort: + format = SND_PCM_FORMAT_S16; + break; + case DevFmtUShort: + format = SND_PCM_FORMAT_U16; + break; + case DevFmtInt: + format = SND_PCM_FORMAT_S32; + break; + case DevFmtUInt: + format = SND_PCM_FORMAT_U32; + break; + case DevFmtFloat: + format = SND_PCM_FORMAT_FLOAT; + break; + } + + bool allowmmap{!!GetConfigValueBool(mDevice->DeviceName.c_str(), "alsa", "mmap", 1)}; + ALuint periodLen{static_cast(mDevice->UpdateSize * 1000000_u64 / mDevice->Frequency)}; + ALuint bufferLen{static_cast(mDevice->BufferSize * 1000000_u64 / mDevice->Frequency)}; + ALuint rate{mDevice->Frequency}; + + int err{}; + HwParamsPtr hp{CreateHwParams()}; +#define CHECK(x) do { \ + if((err=(x)) < 0) \ + throw al::backend_exception{ALC_INVALID_VALUE, #x " failed: %s", snd_strerror(err)}; \ +} while(0) + CHECK(snd_pcm_hw_params_any(mPcmHandle, hp.get())); + /* set interleaved access */ + if(!allowmmap + || snd_pcm_hw_params_set_access(mPcmHandle, hp.get(), SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) + { + /* No mmap */ + CHECK(snd_pcm_hw_params_set_access(mPcmHandle, hp.get(), SND_PCM_ACCESS_RW_INTERLEAVED)); + } + /* test and set format (implicitly sets sample bits) */ + if(snd_pcm_hw_params_test_format(mPcmHandle, hp.get(), format) < 0) + { + static const struct { + snd_pcm_format_t format; + DevFmtType fmttype; + } formatlist[] = { + { SND_PCM_FORMAT_FLOAT, DevFmtFloat }, + { SND_PCM_FORMAT_S32, DevFmtInt }, + { SND_PCM_FORMAT_U32, DevFmtUInt }, + { SND_PCM_FORMAT_S16, DevFmtShort }, + { SND_PCM_FORMAT_U16, DevFmtUShort }, + { SND_PCM_FORMAT_S8, DevFmtByte }, + { SND_PCM_FORMAT_U8, DevFmtUByte }, + }; + + for(const auto &fmt : formatlist) + { + format = fmt.format; + if(snd_pcm_hw_params_test_format(mPcmHandle, hp.get(), format) >= 0) + { + mDevice->FmtType = fmt.fmttype; + break; + } + } + } + CHECK(snd_pcm_hw_params_set_format(mPcmHandle, hp.get(), format)); + /* test and set channels (implicitly sets frame bits) */ + if(snd_pcm_hw_params_test_channels(mPcmHandle, hp.get(), mDevice->channelsFromFmt()) < 0) + { + static const DevFmtChannels channellist[] = { + DevFmtStereo, + DevFmtQuad, + DevFmtX51, + DevFmtX71, + DevFmtMono, + }; + + for(const auto &chan : channellist) + { + if(snd_pcm_hw_params_test_channels(mPcmHandle, hp.get(), ChannelsFromDevFmt(chan, 0)) >= 0) + { + mDevice->FmtChans = chan; + mDevice->mAmbiOrder = 0; + break; + } + } + } + CHECK(snd_pcm_hw_params_set_channels(mPcmHandle, hp.get(), mDevice->channelsFromFmt())); + /* set rate (implicitly constrains period/buffer parameters) */ + if(!GetConfigValueBool(mDevice->DeviceName.c_str(), "alsa", "allow-resampler", 0) || + !mDevice->Flags.get()) + { + if(snd_pcm_hw_params_set_rate_resample(mPcmHandle, hp.get(), 0) < 0) + ERR("Failed to disable ALSA resampler\n"); + } + else if(snd_pcm_hw_params_set_rate_resample(mPcmHandle, hp.get(), 1) < 0) + ERR("Failed to enable ALSA resampler\n"); + CHECK(snd_pcm_hw_params_set_rate_near(mPcmHandle, hp.get(), &rate, nullptr)); + /* set period time (implicitly constrains period/buffer parameters) */ + if((err=snd_pcm_hw_params_set_period_time_near(mPcmHandle, hp.get(), &periodLen, nullptr)) < 0) + ERR("snd_pcm_hw_params_set_period_time_near failed: %s\n", snd_strerror(err)); + /* set buffer time (implicitly sets buffer size/bytes/time and period size/bytes) */ + if((err=snd_pcm_hw_params_set_buffer_time_near(mPcmHandle, hp.get(), &bufferLen, nullptr)) < 0) + ERR("snd_pcm_hw_params_set_buffer_time_near failed: %s\n", snd_strerror(err)); + /* install and prepare hardware configuration */ + CHECK(snd_pcm_hw_params(mPcmHandle, hp.get())); + + /* retrieve configuration info */ + snd_pcm_uframes_t periodSizeInFrames{}; + snd_pcm_uframes_t bufferSizeInFrames{}; + snd_pcm_access_t access{}; + + CHECK(snd_pcm_hw_params_get_access(hp.get(), &access)); + CHECK(snd_pcm_hw_params_get_period_size(hp.get(), &periodSizeInFrames, nullptr)); + CHECK(snd_pcm_hw_params_get_buffer_size(hp.get(), &bufferSizeInFrames)); + hp = nullptr; + + SwParamsPtr sp{CreateSwParams()}; + CHECK(snd_pcm_sw_params_current(mPcmHandle, sp.get())); + CHECK(snd_pcm_sw_params_set_avail_min(mPcmHandle, sp.get(), periodSizeInFrames)); + CHECK(snd_pcm_sw_params_set_stop_threshold(mPcmHandle, sp.get(), bufferSizeInFrames)); + CHECK(snd_pcm_sw_params(mPcmHandle, sp.get())); +#undef CHECK + sp = nullptr; + + mDevice->BufferSize = static_cast(bufferSizeInFrames); + mDevice->UpdateSize = static_cast(periodSizeInFrames); + mDevice->Frequency = rate; + + SetDefaultChannelOrder(mDevice); + + return true; +} + +bool AlsaPlayback::start() +{ + int err{}; + snd_pcm_access_t access{}; + HwParamsPtr hp{CreateHwParams()}; +#define CHECK(x) do { \ + if((err=(x)) < 0) \ + throw al::backend_exception{ALC_INVALID_VALUE, #x " failed: %s", snd_strerror(err)}; \ +} while(0) + CHECK(snd_pcm_hw_params_current(mPcmHandle, hp.get())); + /* retrieve configuration info */ + CHECK(snd_pcm_hw_params_get_access(hp.get(), &access)); +#undef CHECK + hp = nullptr; + + int (AlsaPlayback::*thread_func)(){}; + if(access == SND_PCM_ACCESS_RW_INTERLEAVED) + { + mBuffer.resize( + static_cast(snd_pcm_frames_to_bytes(mPcmHandle, mDevice->UpdateSize))); + thread_func = &AlsaPlayback::mixerNoMMapProc; + } + else + { + err = snd_pcm_prepare(mPcmHandle); + if(err < 0) + { + ERR("snd_pcm_prepare(data->mPcmHandle) failed: %s\n", snd_strerror(err)); + return false; + } + thread_func = &AlsaPlayback::mixerProc; + } + + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(thread_func), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + mBuffer.clear(); + return false; +} + +void AlsaPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + mBuffer.clear(); +} + +ClockLatency AlsaPlayback::getClockLatency() +{ + ClockLatency ret; + + std::lock_guard _{*this}; + ret.ClockTime = GetDeviceClockTime(mDevice); + snd_pcm_sframes_t delay{}; + int err{snd_pcm_delay(mPcmHandle, &delay)}; + if(err < 0) + { + ERR("Failed to get pcm delay: %s\n", snd_strerror(err)); + delay = 0; + } + ret.Latency = std::chrono::seconds{std::max(0, delay)}; + ret.Latency /= mDevice->Frequency; + + return ret; +} + + +struct AlsaCapture final : public BackendBase { + AlsaCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~AlsaCapture() override; + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + ClockLatency getClockLatency() override; + + snd_pcm_t *mPcmHandle{nullptr}; + + al::vector mBuffer; + + bool mDoCapture{false}; + RingBufferPtr mRing{nullptr}; + + snd_pcm_sframes_t mLastAvail{0}; + + DEF_NEWDEL(AlsaCapture) +}; + +AlsaCapture::~AlsaCapture() +{ + if(mPcmHandle) + snd_pcm_close(mPcmHandle); + mPcmHandle = nullptr; +} + + +void AlsaCapture::open(const ALCchar *name) +{ + const char *driver{}; + if(name) + { + if(CaptureDevices.empty()) + CaptureDevices = probe_devices(SND_PCM_STREAM_CAPTURE); + + auto iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == CaptureDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + driver = iter->device_name.c_str(); + } + else + { + name = alsaDevice; + driver = GetConfigValue(nullptr, "alsa", "capture", "default"); + } + + TRACE("Opening device \"%s\"\n", driver); + int err{snd_pcm_open(&mPcmHandle, driver, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)}; + if(err < 0) + throw al::backend_exception{ALC_OUT_OF_MEMORY, "Could not open ALSA device \"%s\"", + driver}; + + /* Free alsa's global config tree. Otherwise valgrind reports a ton of leaks. */ + snd_config_update_free_global(); + + snd_pcm_format_t format{SND_PCM_FORMAT_UNKNOWN}; + switch(mDevice->FmtType) + { + case DevFmtByte: + format = SND_PCM_FORMAT_S8; + break; + case DevFmtUByte: + format = SND_PCM_FORMAT_U8; + break; + case DevFmtShort: + format = SND_PCM_FORMAT_S16; + break; + case DevFmtUShort: + format = SND_PCM_FORMAT_U16; + break; + case DevFmtInt: + format = SND_PCM_FORMAT_S32; + break; + case DevFmtUInt: + format = SND_PCM_FORMAT_U32; + break; + case DevFmtFloat: + format = SND_PCM_FORMAT_FLOAT; + break; + } + + snd_pcm_uframes_t bufferSizeInFrames{maxu(mDevice->BufferSize, 100*mDevice->Frequency/1000)}; + snd_pcm_uframes_t periodSizeInFrames{minu(mDevice->BufferSize, 25*mDevice->Frequency/1000)}; + + bool needring{false}; + HwParamsPtr hp{CreateHwParams()}; +#define CHECK(x) do { \ + if((err=(x)) < 0) \ + throw al::backend_exception{ALC_INVALID_VALUE, #x " failed: %s", snd_strerror(err)}; \ +} while(0) + CHECK(snd_pcm_hw_params_any(mPcmHandle, hp.get())); + /* set interleaved access */ + CHECK(snd_pcm_hw_params_set_access(mPcmHandle, hp.get(), SND_PCM_ACCESS_RW_INTERLEAVED)); + /* set format (implicitly sets sample bits) */ + CHECK(snd_pcm_hw_params_set_format(mPcmHandle, hp.get(), format)); + /* set channels (implicitly sets frame bits) */ + CHECK(snd_pcm_hw_params_set_channels(mPcmHandle, hp.get(), mDevice->channelsFromFmt())); + /* set rate (implicitly constrains period/buffer parameters) */ + CHECK(snd_pcm_hw_params_set_rate(mPcmHandle, hp.get(), mDevice->Frequency, 0)); + /* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */ + if(snd_pcm_hw_params_set_buffer_size_min(mPcmHandle, hp.get(), &bufferSizeInFrames) < 0) + { + TRACE("Buffer too large, using intermediate ring buffer\n"); + needring = true; + CHECK(snd_pcm_hw_params_set_buffer_size_near(mPcmHandle, hp.get(), &bufferSizeInFrames)); + } + /* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */ + CHECK(snd_pcm_hw_params_set_period_size_near(mPcmHandle, hp.get(), &periodSizeInFrames, nullptr)); + /* install and prepare hardware configuration */ + CHECK(snd_pcm_hw_params(mPcmHandle, hp.get())); + /* retrieve configuration info */ + CHECK(snd_pcm_hw_params_get_period_size(hp.get(), &periodSizeInFrames, nullptr)); +#undef CHECK + hp = nullptr; + + if(needring) + mRing = RingBuffer::Create(mDevice->BufferSize, mDevice->frameSizeFromFmt(), false); + + mDevice->DeviceName = name; +} + + +bool AlsaCapture::start() +{ + int err{snd_pcm_prepare(mPcmHandle)}; + if(err < 0) + throw al::backend_exception{ALC_INVALID_VALUE, "snd_pcm_prepare failed: %s", + snd_strerror(err)}; + + err = snd_pcm_start(mPcmHandle); + if(err < 0) + throw al::backend_exception{ALC_INVALID_VALUE, "snd_pcm_start failed: %s", + snd_strerror(err)}; + + mDoCapture = true; + return true; +} + +void AlsaCapture::stop() +{ + /* OpenAL requires access to unread audio after stopping, but ALSA's + * snd_pcm_drain is unreliable and snd_pcm_drop drops it. Capture what's + * available now so it'll be available later after the drop. + */ + ALCuint avail{availableSamples()}; + if(!mRing && avail > 0) + { + /* The ring buffer implicitly captures when checking availability. + * Direct access needs to explicitly capture it into temp storage. */ + auto temp = al::vector( + static_cast(snd_pcm_frames_to_bytes(mPcmHandle, avail))); + captureSamples(temp.data(), avail); + mBuffer = std::move(temp); + } + int err{snd_pcm_drop(mPcmHandle)}; + if(err < 0) + ERR("drop failed: %s\n", snd_strerror(err)); + mDoCapture = false; +} + +ALCenum AlsaCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + if(mRing) + { + mRing->read(buffer, samples); + return ALC_NO_ERROR; + } + + mLastAvail -= samples; + while(mDevice->Connected.load(std::memory_order_acquire) && samples > 0) + { + snd_pcm_sframes_t amt{0}; + + if(!mBuffer.empty()) + { + /* First get any data stored from the last stop */ + amt = snd_pcm_bytes_to_frames(mPcmHandle, static_cast(mBuffer.size())); + if(static_cast(amt) > samples) amt = samples; + + amt = snd_pcm_frames_to_bytes(mPcmHandle, amt); + std::copy_n(mBuffer.begin(), amt, buffer); + + mBuffer.erase(mBuffer.begin(), mBuffer.begin()+amt); + amt = snd_pcm_bytes_to_frames(mPcmHandle, amt); + } + else if(mDoCapture) + amt = snd_pcm_readi(mPcmHandle, buffer, samples); + if(amt < 0) + { + ERR("read error: %s\n", snd_strerror(static_cast(amt))); + + if(amt == -EAGAIN) + continue; + if((amt=snd_pcm_recover(mPcmHandle, static_cast(amt), 1)) >= 0) + { + amt = snd_pcm_start(mPcmHandle); + if(amt >= 0) + amt = snd_pcm_avail_update(mPcmHandle); + } + if(amt < 0) + { + const char *err{snd_strerror(static_cast(amt))}; + ERR("restore error: %s\n", err); + aluHandleDisconnect(mDevice, "Capture recovery failure: %s", err); + break; + } + /* If the amount available is less than what's asked, we lost it + * during recovery. So just give silence instead. */ + if(static_cast(amt) < samples) + break; + continue; + } + + buffer = buffer + amt; + samples -= static_cast(amt); + } + if(samples > 0) + std::fill_n(buffer, snd_pcm_frames_to_bytes(mPcmHandle, samples), + al::byte((mDevice->FmtType == DevFmtUByte) ? 0x80 : 0)); + + return ALC_NO_ERROR; +} + +ALCuint AlsaCapture::availableSamples() +{ + snd_pcm_sframes_t avail{0}; + if(mDevice->Connected.load(std::memory_order_acquire) && mDoCapture) + avail = snd_pcm_avail_update(mPcmHandle); + if(avail < 0) + { + ERR("avail update failed: %s\n", snd_strerror(static_cast(avail))); + + if((avail=snd_pcm_recover(mPcmHandle, static_cast(avail), 1)) >= 0) + { + if(mDoCapture) + avail = snd_pcm_start(mPcmHandle); + if(avail >= 0) + avail = snd_pcm_avail_update(mPcmHandle); + } + if(avail < 0) + { + const char *err{snd_strerror(static_cast(avail))}; + ERR("restore error: %s\n", err); + aluHandleDisconnect(mDevice, "Capture recovery failure: %s", err); + } + } + + if(!mRing) + { + if(avail < 0) avail = 0; + avail += snd_pcm_bytes_to_frames(mPcmHandle, static_cast(mBuffer.size())); + if(avail > mLastAvail) mLastAvail = avail; + return static_cast(mLastAvail); + } + + while(avail > 0) + { + auto vec = mRing->getWriteVector(); + if(vec.first.len == 0) break; + + snd_pcm_sframes_t amt{std::min(static_cast(vec.first.len), avail)}; + amt = snd_pcm_readi(mPcmHandle, vec.first.buf, static_cast(amt)); + if(amt < 0) + { + ERR("read error: %s\n", snd_strerror(static_cast(amt))); + + if(amt == -EAGAIN) + continue; + if((amt=snd_pcm_recover(mPcmHandle, static_cast(amt), 1)) >= 0) + { + if(mDoCapture) + amt = snd_pcm_start(mPcmHandle); + if(amt >= 0) + amt = snd_pcm_avail_update(mPcmHandle); + } + if(amt < 0) + { + const char *err{snd_strerror(static_cast(amt))}; + ERR("restore error: %s\n", err); + aluHandleDisconnect(mDevice, "Capture recovery failure: %s", err); + break; + } + avail = amt; + continue; + } + + mRing->writeAdvance(static_cast(amt)); + avail -= amt; + } + + return static_cast(mRing->readSpace()); +} + +ClockLatency AlsaCapture::getClockLatency() +{ + ClockLatency ret; + + std::lock_guard _{*this}; + ret.ClockTime = GetDeviceClockTime(mDevice); + snd_pcm_sframes_t delay{}; + int err{snd_pcm_delay(mPcmHandle, &delay)}; + if(err < 0) + { + ERR("Failed to get pcm delay: %s\n", snd_strerror(err)); + delay = 0; + } + ret.Latency = std::chrono::seconds{std::max(0, delay)}; + ret.Latency /= mDevice->Frequency; + + return ret; +} + +} // namespace + + +bool AlsaBackendFactory::init() +{ + bool error{false}; + +#ifdef HAVE_DYNLOAD + if(!alsa_handle) + { + std::string missing_funcs; + + alsa_handle = LoadLib("libasound.so.2"); + if(!alsa_handle) + { + WARN("Failed to load %s\n", "libasound.so.2"); + return ALC_FALSE; + } + + error = ALC_FALSE; +#define LOAD_FUNC(f) do { \ + p##f = reinterpret_cast(GetSymbol(alsa_handle, #f)); \ + if(p##f == nullptr) { \ + error = true; \ + missing_funcs += "\n" #f; \ + } \ +} while(0) + ALSA_FUNCS(LOAD_FUNC); +#undef LOAD_FUNC + + if(error) + { + WARN("Missing expected functions:%s\n", missing_funcs.c_str()); + CloseLib(alsa_handle); + alsa_handle = nullptr; + } + } +#endif + + return !error; +} + +bool AlsaBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } + +void AlsaBackendFactory::probe(DevProbe type, std::string *outnames) +{ + auto add_device = [outnames](const DevMap &entry) -> void + { + /* +1 to also append the null char (to ensure a null-separated list and + * double-null terminated list). + */ + outnames->append(entry.name.c_str(), entry.name.length()+1); + }; + switch(type) + { + case DevProbe::Playback: + PlaybackDevices = probe_devices(SND_PCM_STREAM_PLAYBACK); + std::for_each(PlaybackDevices.cbegin(), PlaybackDevices.cend(), add_device); + break; + + case DevProbe::Capture: + CaptureDevices = probe_devices(SND_PCM_STREAM_CAPTURE); + std::for_each(CaptureDevices.cbegin(), CaptureDevices.cend(), add_device); + break; + } +} + +BackendPtr AlsaBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new AlsaPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new AlsaCapture{device}}; + return nullptr; +} + +BackendFactory &AlsaBackendFactory::getFactory() +{ + static AlsaBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/alsa.h b/alc/backends/alsa.h new file mode 100644 index 0000000..fb9de00 --- /dev/null +++ b/alc/backends/alsa.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_ALSA_H +#define BACKENDS_ALSA_H + +#include "backends/base.h" + +struct AlsaBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_ALSA_H */ diff --git a/alc/backends/base.cpp b/alc/backends/base.cpp new file mode 100644 index 0000000..25531cf --- /dev/null +++ b/alc/backends/base.cpp @@ -0,0 +1,62 @@ + +#include "config.h" + +#include "base.h" + +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "alexcpt.h" +#include "alnumeric.h" +#include "atomic.h" + + +ClockLatency GetClockLatency(ALCdevice *device) +{ + BackendBase *backend{device->Backend.get()}; + ClockLatency ret{backend->getClockLatency()}; + ret.Latency += device->FixedLatency; + return ret; +} + + +/* BackendBase method implementations. */ +BackendBase::BackendBase(ALCdevice *device) noexcept : mDevice{device} +{ } + +BackendBase::~BackendBase() = default; + +bool BackendBase::reset() +{ throw al::backend_exception{ALC_INVALID_DEVICE, "Invalid BackendBase call"}; } + +ALCenum BackendBase::captureSamples(al::byte*, ALCuint) +{ return ALC_INVALID_DEVICE; } + +ALCuint BackendBase::availableSamples() +{ return 0; } + +ClockLatency BackendBase::getClockLatency() +{ + ClockLatency ret; + + ALuint refcount; + do { + while(((refcount=ReadRef(mDevice->MixCount))&1) != 0) + std::this_thread::yield(); + ret.ClockTime = GetDeviceClockTime(mDevice); + std::atomic_thread_fence(std::memory_order_acquire); + } while(refcount != ReadRef(mDevice->MixCount)); + + /* NOTE: The device will generally have about all but one periods filled at + * any given time during playback. Without a more accurate measurement from + * the output, this is an okay approximation. + */ + ret.Latency = std::max(std::chrono::seconds{mDevice->BufferSize-mDevice->UpdateSize}, + std::chrono::seconds::zero()); + ret.Latency /= mDevice->Frequency; + + return ret; +} diff --git a/alc/backends/base.h b/alc/backends/base.h new file mode 100644 index 0000000..d485681 --- /dev/null +++ b/alc/backends/base.h @@ -0,0 +1,84 @@ +#ifndef ALC_BACKENDS_BASE_H +#define ALC_BACKENDS_BASE_H + +#include +#include +#include +#include + +#include "AL/alc.h" + +#include "alcmain.h" +#include "albyte.h" + + +struct ClockLatency { + std::chrono::nanoseconds ClockTime; + std::chrono::nanoseconds Latency; +}; + +/* Helper to get the current clock time from the device's ClockBase, and + * SamplesDone converted from the sample rate. + */ +inline std::chrono::nanoseconds GetDeviceClockTime(ALCdevice *device) +{ + using std::chrono::seconds; + using std::chrono::nanoseconds; + + auto ns = nanoseconds{seconds{device->SamplesDone}} / device->Frequency; + return device->ClockBase + ns; +} + +ClockLatency GetClockLatency(ALCdevice *device); + +struct BackendBase { + virtual void open(const ALCchar *name) = 0; + + virtual bool reset(); + virtual bool start() = 0; + virtual void stop() = 0; + + virtual ALCenum captureSamples(al::byte *buffer, ALCuint samples); + virtual ALCuint availableSamples(); + + virtual ClockLatency getClockLatency(); + + virtual void lock() { mMutex.lock(); } + virtual void unlock() { mMutex.unlock(); } + + ALCdevice *mDevice; + + std::recursive_mutex mMutex; + + BackendBase(ALCdevice *device) noexcept; + virtual ~BackendBase(); +}; +using BackendPtr = std::unique_ptr; +using BackendUniqueLock = std::unique_lock; +using BackendLockGuard = std::lock_guard; + +enum class BackendType { + Playback, + Capture +}; + +enum class DevProbe { + Playback, + Capture +}; + + +struct BackendFactory { + virtual bool init() = 0; + + virtual bool querySupport(BackendType type) = 0; + + virtual void probe(DevProbe type, std::string *outnames) = 0; + + virtual BackendPtr createBackend(ALCdevice *device, BackendType type) = 0; + +protected: + virtual ~BackendFactory() = default; +}; + +#endif /* ALC_BACKENDS_BASE_H */ diff --git a/alc/backends/coreaudio.cpp b/alc/backends/coreaudio.cpp new file mode 100644 index 0000000..9948d11 --- /dev/null +++ b/alc/backends/coreaudio.cpp @@ -0,0 +1,660 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/coreaudio.h" + +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "ringbuffer.h" +#include "converter.h" +#include "backends/base.h" + +#include +#include +#include + + +namespace { + +static const ALCchar ca_device[] = "CoreAudio Default"; + + +struct CoreAudioPlayback final : public BackendBase { + CoreAudioPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~CoreAudioPlayback() override; + + OSStatus MixerProc(AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, + AudioBufferList *ioData) noexcept; + static OSStatus MixerProcC(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, + AudioBufferList *ioData) noexcept + { + return static_cast(inRefCon)->MixerProc(ioActionFlags, inTimeStamp, + inBusNumber, inNumberFrames, ioData); + } + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + AudioUnit mAudioUnit{}; + + ALuint mFrameSize{0u}; + AudioStreamBasicDescription mFormat{}; // This is the OpenAL format as a CoreAudio ASBD + + DEF_NEWDEL(CoreAudioPlayback) +}; + +CoreAudioPlayback::~CoreAudioPlayback() +{ + AudioUnitUninitialize(mAudioUnit); + AudioComponentInstanceDispose(mAudioUnit); +} + + +OSStatus CoreAudioPlayback::MixerProc(AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32, + UInt32, AudioBufferList *ioData) noexcept +{ + std::lock_guard _{*this}; + aluMixData(mDevice, ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize/mFrameSize, + ioData->mBuffers[0].mNumberChannels); + return noErr; +} + + +void CoreAudioPlayback::open(const ALCchar *name) +{ + if(!name) + name = ca_device; + else if(strcmp(name, ca_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + /* open the default output unit */ + AudioComponentDescription desc{}; + desc.componentType = kAudioUnitType_Output; +#if TARGET_OS_IOS + desc.componentSubType = kAudioUnitSubType_RemoteIO; +#else + desc.componentSubType = kAudioUnitSubType_DefaultOutput; +#endif + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + AudioComponent comp{AudioComponentFindNext(NULL, &desc)}; + if(comp == nullptr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not find audio component"}; + + OSStatus err{AudioComponentInstanceNew(comp, &mAudioUnit)}; + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not create component instance: %u", + err}; + + /* init and start the default audio unit... */ + err = AudioUnitInitialize(mAudioUnit); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not initialize audio unit: %u", err}; + + mDevice->DeviceName = name; +} + +bool CoreAudioPlayback::reset() +{ + OSStatus err{AudioUnitUninitialize(mAudioUnit)}; + if(err != noErr) + ERR("-- AudioUnitUninitialize failed.\n"); + + /* retrieve default output unit's properties (output side) */ + AudioStreamBasicDescription streamFormat{}; + auto size = static_cast(sizeof(AudioStreamBasicDescription)); + err = AudioUnitGetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, + 0, &streamFormat, &size); + if(err != noErr || size != sizeof(AudioStreamBasicDescription)) + { + ERR("AudioUnitGetProperty failed\n"); + return false; + } + +#if 0 + TRACE("Output streamFormat of default output unit -\n"); + TRACE(" streamFormat.mFramesPerPacket = %d\n", streamFormat.mFramesPerPacket); + TRACE(" streamFormat.mChannelsPerFrame = %d\n", streamFormat.mChannelsPerFrame); + TRACE(" streamFormat.mBitsPerChannel = %d\n", streamFormat.mBitsPerChannel); + TRACE(" streamFormat.mBytesPerPacket = %d\n", streamFormat.mBytesPerPacket); + TRACE(" streamFormat.mBytesPerFrame = %d\n", streamFormat.mBytesPerFrame); + TRACE(" streamFormat.mSampleRate = %5.0f\n", streamFormat.mSampleRate); +#endif + + /* set default output unit's input side to match output side */ + err = AudioUnitSetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, + 0, &streamFormat, size); + if(err != noErr) + { + ERR("AudioUnitSetProperty failed\n"); + return false; + } + + if(mDevice->Frequency != streamFormat.mSampleRate) + { + mDevice->BufferSize = static_cast(uint64_t{mDevice->BufferSize} * + streamFormat.mSampleRate / mDevice->Frequency); + mDevice->Frequency = static_cast(streamFormat.mSampleRate); + } + + /* FIXME: How to tell what channels are what in the output device, and how + * to specify what we're giving? eg, 6.0 vs 5.1 */ + switch(streamFormat.mChannelsPerFrame) + { + case 1: + mDevice->FmtChans = DevFmtMono; + break; + case 2: + mDevice->FmtChans = DevFmtStereo; + break; + case 4: + mDevice->FmtChans = DevFmtQuad; + break; + case 6: + mDevice->FmtChans = DevFmtX51; + break; + case 7: + mDevice->FmtChans = DevFmtX61; + break; + case 8: + mDevice->FmtChans = DevFmtX71; + break; + default: + ERR("Unhandled channel count (%d), using Stereo\n", streamFormat.mChannelsPerFrame); + mDevice->FmtChans = DevFmtStereo; + streamFormat.mChannelsPerFrame = 2; + break; + } + SetDefaultWFXChannelOrder(mDevice); + + /* use channel count and sample rate from the default output unit's current + * parameters, but reset everything else */ + streamFormat.mFramesPerPacket = 1; + streamFormat.mFormatFlags = 0; + switch(mDevice->FmtType) + { + case DevFmtUByte: + mDevice->FmtType = DevFmtByte; + /* fall-through */ + case DevFmtByte: + streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + streamFormat.mBitsPerChannel = 8; + break; + case DevFmtUShort: + mDevice->FmtType = DevFmtShort; + /* fall-through */ + case DevFmtShort: + streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + streamFormat.mBitsPerChannel = 16; + break; + case DevFmtUInt: + mDevice->FmtType = DevFmtInt; + /* fall-through */ + case DevFmtInt: + streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + streamFormat.mBitsPerChannel = 32; + break; + case DevFmtFloat: + streamFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; + streamFormat.mBitsPerChannel = 32; + break; + } + streamFormat.mBytesPerFrame = streamFormat.mChannelsPerFrame * + streamFormat.mBitsPerChannel / 8; + streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame; + streamFormat.mFormatID = kAudioFormatLinearPCM; + streamFormat.mFormatFlags |= kAudioFormatFlagsNativeEndian | + kLinearPCMFormatFlagIsPacked; + + err = AudioUnitSetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, + 0, &streamFormat, sizeof(AudioStreamBasicDescription)); + if(err != noErr) + { + ERR("AudioUnitSetProperty failed\n"); + return false; + } + + /* setup callback */ + mFrameSize = mDevice->frameSizeFromFmt(); + AURenderCallbackStruct input{}; + input.inputProc = CoreAudioPlayback::MixerProcC; + input.inputProcRefCon = this; + + err = AudioUnitSetProperty(mAudioUnit, kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Input, 0, &input, sizeof(AURenderCallbackStruct)); + if(err != noErr) + { + ERR("AudioUnitSetProperty failed\n"); + return false; + } + + /* init the default audio unit... */ + err = AudioUnitInitialize(mAudioUnit); + if(err != noErr) + { + ERR("AudioUnitInitialize failed\n"); + return false; + } + + return true; +} + +bool CoreAudioPlayback::start() +{ + OSStatus err{AudioOutputUnitStart(mAudioUnit)}; + if(err != noErr) + { + ERR("AudioOutputUnitStart failed\n"); + return false; + } + return true; +} + +void CoreAudioPlayback::stop() +{ + OSStatus err{AudioOutputUnitStop(mAudioUnit)}; + if(err != noErr) + ERR("AudioOutputUnitStop failed\n"); +} + + +struct CoreAudioCapture final : public BackendBase { + CoreAudioCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~CoreAudioCapture() override; + + OSStatus RecordProc(AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, + UInt32 inNumberFrames, AudioBufferList *ioData) noexcept; + static OSStatus RecordProcC(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, + AudioBufferList *ioData) noexcept + { + return static_cast(inRefCon)->RecordProc(ioActionFlags, inTimeStamp, + inBusNumber, inNumberFrames, ioData); + } + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + AudioUnit mAudioUnit{0}; + + ALuint mFrameSize{0u}; + AudioStreamBasicDescription mFormat{}; // This is the OpenAL format as a CoreAudio ASBD + + SampleConverterPtr mConverter; + + RingBufferPtr mRing{nullptr}; + + DEF_NEWDEL(CoreAudioCapture) +}; + +CoreAudioCapture::~CoreAudioCapture() +{ + if(mAudioUnit) + AudioComponentInstanceDispose(mAudioUnit); + mAudioUnit = 0; +} + + +OSStatus CoreAudioCapture::RecordProc(AudioUnitRenderActionFlags*, + const AudioTimeStamp *inTimeStamp, UInt32, UInt32 inNumberFrames, + AudioBufferList*) noexcept +{ + AudioUnitRenderActionFlags flags = 0; + union { + al::byte _[sizeof(AudioBufferList) + sizeof(AudioBuffer)*2]; + AudioBufferList list; + } audiobuf{}; + + auto rec_vec = mRing->getWriteVector(); + inNumberFrames = static_cast(minz(inNumberFrames, + rec_vec.first.len+rec_vec.second.len)); + + // Fill the ringbuffer's two segments with data from the input device + if(rec_vec.first.len >= inNumberFrames) + { + audiobuf.list.mNumberBuffers = 1; + audiobuf.list.mBuffers[0].mNumberChannels = mFormat.mChannelsPerFrame; + audiobuf.list.mBuffers[0].mData = rec_vec.first.buf; + audiobuf.list.mBuffers[0].mDataByteSize = inNumberFrames * mFormat.mBytesPerFrame; + } + else + { + const auto remaining = static_cast(inNumberFrames - rec_vec.first.len); + audiobuf.list.mNumberBuffers = 2; + audiobuf.list.mBuffers[0].mNumberChannels = mFormat.mChannelsPerFrame; + audiobuf.list.mBuffers[0].mData = rec_vec.first.buf; + audiobuf.list.mBuffers[0].mDataByteSize = static_cast(rec_vec.first.len) * + mFormat.mBytesPerFrame; + audiobuf.list.mBuffers[1].mNumberChannels = mFormat.mChannelsPerFrame; + audiobuf.list.mBuffers[1].mData = rec_vec.second.buf; + audiobuf.list.mBuffers[1].mDataByteSize = remaining * mFormat.mBytesPerFrame; + } + OSStatus err{AudioUnitRender(mAudioUnit, &flags, inTimeStamp, audiobuf.list.mNumberBuffers, + inNumberFrames, &audiobuf.list)}; + if(err != noErr) + { + ERR("AudioUnitRender error: %d\n", err); + return err; + } + + mRing->writeAdvance(inNumberFrames); + return noErr; +} + + +void CoreAudioCapture::open(const ALCchar *name) +{ + AudioStreamBasicDescription requestedFormat; // The application requested format + AudioStreamBasicDescription hardwareFormat; // The hardware format + AudioStreamBasicDescription outputFormat; // The AudioUnit output format + AURenderCallbackStruct input; + AudioComponentDescription desc; + UInt32 outputFrameCount; + UInt32 propertySize; +#if !TARGET_OS_IOS + AudioObjectPropertyAddress propertyAddress; +#endif + UInt32 enableIO; + AudioComponent comp; + OSStatus err; + + if(!name) + name = ca_device; + else if(strcmp(name, ca_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + desc.componentType = kAudioUnitType_Output; +#if TARGET_OS_IOS + desc.componentSubType = kAudioUnitSubType_RemoteIO; +#else + desc.componentSubType = kAudioUnitSubType_HALOutput; +#endif + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + // Search for component with given description + comp = AudioComponentFindNext(NULL, &desc); + if(comp == NULL) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not find audio component"}; + + // Open the component + err = AudioComponentInstanceNew(comp, &mAudioUnit); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not create component instance: %u", + err}; + + // Turn off AudioUnit output + enableIO = 0; + err = AudioUnitSetProperty(mAudioUnit, kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Output, 0, &enableIO, sizeof(ALuint)); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, + "Could not disable audio unit output property: %u", err}; + + // Turn on AudioUnit input + enableIO = 1; + err = AudioUnitSetProperty(mAudioUnit, kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Input, 1, &enableIO, sizeof(ALuint)); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, + "Could not enable audio unit input property: %u", err}; + +#if !TARGET_OS_IOS + { + // Get the default input device + AudioDeviceID inputDevice = kAudioDeviceUnknown; + + propertySize = sizeof(AudioDeviceID); + propertyAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; + propertyAddress.mScope = kAudioObjectPropertyScopeGlobal; + propertyAddress.mElement = kAudioObjectPropertyElementMaster; + + err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, nullptr, + &propertySize, &inputDevice); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not get input device: %u", err}; + if(inputDevice == kAudioDeviceUnknown) + throw al::backend_exception{ALC_INVALID_VALUE, "Unknown input device"}; + + // Track the input device + err = AudioUnitSetProperty(mAudioUnit, kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, 0, &inputDevice, sizeof(AudioDeviceID)); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not set input device: %u", err}; + } +#endif + + // set capture callback + input.inputProc = CoreAudioCapture::RecordProcC; + input.inputProcRefCon = this; + + err = AudioUnitSetProperty(mAudioUnit, kAudioOutputUnitProperty_SetInputCallback, + kAudioUnitScope_Global, 0, &input, sizeof(AURenderCallbackStruct)); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not set capture callback: %u", err}; + + // Initialize the device + err = AudioUnitInitialize(mAudioUnit); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not initialize audio unit: %u", err}; + + // Get the hardware format + propertySize = sizeof(AudioStreamBasicDescription); + err = AudioUnitGetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, + 1, &hardwareFormat, &propertySize); + if(err != noErr || propertySize != sizeof(AudioStreamBasicDescription)) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not get input format: %u", err}; + + // Set up the requested format description + switch(mDevice->FmtType) + { + case DevFmtUByte: + requestedFormat.mBitsPerChannel = 8; + requestedFormat.mFormatFlags = kAudioFormatFlagIsPacked; + break; + case DevFmtShort: + requestedFormat.mBitsPerChannel = 16; + requestedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; + break; + case DevFmtInt: + requestedFormat.mBitsPerChannel = 32; + requestedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; + break; + case DevFmtFloat: + requestedFormat.mBitsPerChannel = 32; + requestedFormat.mFormatFlags = kAudioFormatFlagIsPacked; + break; + case DevFmtByte: + case DevFmtUShort: + case DevFmtUInt: + throw al::backend_exception{ALC_INVALID_VALUE, "%s samples not suppoted", + DevFmtTypeString(mDevice->FmtType)}; + } + + switch(mDevice->FmtChans) + { + case DevFmtMono: + requestedFormat.mChannelsPerFrame = 1; + break; + case DevFmtStereo: + requestedFormat.mChannelsPerFrame = 2; + break; + + case DevFmtQuad: + case DevFmtX51: + case DevFmtX51Rear: + case DevFmtX61: + case DevFmtX71: + case DevFmtAmbi3D: + throw al::backend_exception{ALC_INVALID_VALUE, "%s not supported", + DevFmtChannelsString(mDevice->FmtChans)}; + } + + requestedFormat.mBytesPerFrame = requestedFormat.mChannelsPerFrame * requestedFormat.mBitsPerChannel / 8; + requestedFormat.mBytesPerPacket = requestedFormat.mBytesPerFrame; + requestedFormat.mSampleRate = mDevice->Frequency; + requestedFormat.mFormatID = kAudioFormatLinearPCM; + requestedFormat.mReserved = 0; + requestedFormat.mFramesPerPacket = 1; + + // save requested format description for later use + mFormat = requestedFormat; + mFrameSize = mDevice->frameSizeFromFmt(); + + // Use intermediate format for sample rate conversion (outputFormat) + // Set sample rate to the same as hardware for resampling later + outputFormat = requestedFormat; + outputFormat.mSampleRate = hardwareFormat.mSampleRate; + + // The output format should be the requested format, but using the hardware sample rate + // This is because the AudioUnit will automatically scale other properties, except for sample rate + err = AudioUnitSetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, + 1, &outputFormat, sizeof(outputFormat)); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not set input format: %u", err}; + + // Set the AudioUnit output format frame count + uint64_t FrameCount64{mDevice->UpdateSize}; + FrameCount64 = static_cast(FrameCount64*outputFormat.mSampleRate + mDevice->Frequency-1) / + mDevice->Frequency; + FrameCount64 += MAX_RESAMPLER_PADDING; + if(FrameCount64 > std::numeric_limits::max()/2) + throw al::backend_exception{ALC_INVALID_VALUE, + "Calculated frame count is too large: %" PRIu64, FrameCount64}; + + outputFrameCount = static_cast(FrameCount64); + err = AudioUnitSetProperty(mAudioUnit, kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Output, 0, &outputFrameCount, sizeof(outputFrameCount)); + if(err != noErr) + throw al::backend_exception{ALC_INVALID_VALUE, "Failed to set capture frame count: %u", + err}; + + // Set up sample converter if needed + if(outputFormat.mSampleRate != mDevice->Frequency) + mConverter = CreateSampleConverter(mDevice->FmtType, mDevice->FmtType, + mFormat.mChannelsPerFrame, static_cast(hardwareFormat.mSampleRate), + mDevice->Frequency, Resampler::FastBSinc24); + + mRing = RingBuffer::Create(outputFrameCount, mFrameSize, false); + + mDevice->DeviceName = name; +} + + +bool CoreAudioCapture::start() +{ + OSStatus err{AudioOutputUnitStart(mAudioUnit)}; + if(err != noErr) + { + ERR("AudioOutputUnitStart failed\n"); + return false; + } + return true; +} + +void CoreAudioCapture::stop() +{ + OSStatus err{AudioOutputUnitStop(mAudioUnit)}; + if(err != noErr) + ERR("AudioOutputUnitStop failed\n"); +} + +ALCenum CoreAudioCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + if(!mConverter) + { + mRing->read(buffer, samples); + return ALC_NO_ERROR; + } + + auto rec_vec = mRing->getReadVector(); + const void *src0{rec_vec.first.buf}; + auto src0len = static_cast(rec_vec.first.len); + ALuint got{mConverter->convert(&src0, &src0len, buffer, samples)}; + size_t total_read{rec_vec.first.len - src0len}; + if(got < samples && !src0len && rec_vec.second.len > 0) + { + const void *src1{rec_vec.second.buf}; + auto src1len = static_cast(rec_vec.second.len); + got += mConverter->convert(&src1, &src1len, buffer+got, samples-got); + total_read += rec_vec.second.len - src1len; + } + + mRing->readAdvance(total_read); + return ALC_NO_ERROR; +} + +ALCuint CoreAudioCapture::availableSamples() +{ + if(!mConverter) return static_cast(mRing->readSpace()); + return mConverter->availableOut(static_cast(mRing->readSpace())); +} + +} // namespace + +BackendFactory &CoreAudioBackendFactory::getFactory() +{ + static CoreAudioBackendFactory factory{}; + return factory; +} + +bool CoreAudioBackendFactory::init() { return true; } + +bool CoreAudioBackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback || type == BackendType::Capture; } + +void CoreAudioBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + case DevProbe::Capture: + /* Includes null char. */ + outnames->append(ca_device, sizeof(ca_device)); + break; + } +} + +BackendPtr CoreAudioBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new CoreAudioPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new CoreAudioCapture{device}}; + return nullptr; +} diff --git a/alc/backends/coreaudio.h b/alc/backends/coreaudio.h new file mode 100644 index 0000000..37b9ebe --- /dev/null +++ b/alc/backends/coreaudio.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_COREAUDIO_H +#define BACKENDS_COREAUDIO_H + +#include "backends/base.h" + +struct CoreAudioBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_COREAUDIO_H */ diff --git a/alc/backends/dsound.cpp b/alc/backends/dsound.cpp new file mode 100644 index 0000000..cee5a20 --- /dev/null +++ b/alc/backends/dsound.cpp @@ -0,0 +1,917 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/dsound.h" + +#define WIN32_LEAN_AND_MEAN +#include + +#include +#include +#include + +#include +#include +#ifndef _WAVEFORMATEXTENSIBLE_ +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "ringbuffer.h" +#include "compat.h" +#include "dynload.h" +#include "strutils.h" +#include "threads.h" + +/* MinGW-w64 needs this for some unknown reason now. */ +using LPCWAVEFORMATEX = const WAVEFORMATEX*; +#include + + +#ifndef DSSPEAKER_5POINT1 +# define DSSPEAKER_5POINT1 0x00000006 +#endif +#ifndef DSSPEAKER_5POINT1_BACK +# define DSSPEAKER_5POINT1_BACK 0x00000006 +#endif +#ifndef DSSPEAKER_7POINT1 +# define DSSPEAKER_7POINT1 0x00000007 +#endif +#ifndef DSSPEAKER_7POINT1_SURROUND +# define DSSPEAKER_7POINT1_SURROUND 0x00000008 +#endif +#ifndef DSSPEAKER_5POINT1_SURROUND +# define DSSPEAKER_5POINT1_SURROUND 0x00000009 +#endif + + +/* Some headers seem to define these as macros for __uuidof, which is annoying + * since some headers don't declare them at all. Hopefully the ifdef is enough + * to tell if they need to be declared. + */ +#ifndef KSDATAFORMAT_SUBTYPE_PCM +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); +#endif +#ifndef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); +#endif + +namespace { + +#define DEVNAME_HEAD "OpenAL Soft on " + + +#ifdef HAVE_DYNLOAD +void *ds_handle; +HRESULT (WINAPI *pDirectSoundCreate)(const GUID *pcGuidDevice, IDirectSound **ppDS, IUnknown *pUnkOuter); +HRESULT (WINAPI *pDirectSoundEnumerateW)(LPDSENUMCALLBACKW pDSEnumCallback, void *pContext); +HRESULT (WINAPI *pDirectSoundCaptureCreate)(const GUID *pcGuidDevice, IDirectSoundCapture **ppDSC, IUnknown *pUnkOuter); +HRESULT (WINAPI *pDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW pDSEnumCallback, void *pContext); + +#ifndef IN_IDE_PARSER +#define DirectSoundCreate pDirectSoundCreate +#define DirectSoundEnumerateW pDirectSoundEnumerateW +#define DirectSoundCaptureCreate pDirectSoundCaptureCreate +#define DirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW +#endif +#endif + + +#define MAX_UPDATES 128 + +struct DevMap { + std::string name; + GUID guid; + + template + DevMap(T0&& name_, T1&& guid_) + : name{std::forward(name_)}, guid{std::forward(guid_)} + { } +}; + +al::vector PlaybackDevices; +al::vector CaptureDevices; + +bool checkName(const al::vector &list, const std::string &name) +{ + auto match_name = [&name](const DevMap &entry) -> bool + { return entry.name == name; }; + return std::find_if(list.cbegin(), list.cend(), match_name) != list.cend(); +} + +BOOL CALLBACK DSoundEnumDevices(GUID *guid, const WCHAR *desc, const WCHAR*, void *data) noexcept +{ + if(!guid) + return TRUE; + + auto& devices = *static_cast*>(data); + const std::string basename{DEVNAME_HEAD + wstr_to_utf8(desc)}; + + int count{1}; + std::string newname{basename}; + while(checkName(devices, newname)) + { + newname = basename; + newname += " #"; + newname += std::to_string(++count); + } + devices.emplace_back(std::move(newname), *guid); + const DevMap &newentry = devices.back(); + + OLECHAR *guidstr{nullptr}; + HRESULT hr{StringFromCLSID(*guid, &guidstr)}; + if(SUCCEEDED(hr)) + { + TRACE("Got device \"%s\", GUID \"%ls\"\n", newentry.name.c_str(), guidstr); + CoTaskMemFree(guidstr); + } + + return TRUE; +} + + +struct DSoundPlayback final : public BackendBase { + DSoundPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~DSoundPlayback() override; + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + IDirectSound *mDS{nullptr}; + IDirectSoundBuffer *mPrimaryBuffer{nullptr}; + IDirectSoundBuffer *mBuffer{nullptr}; + IDirectSoundNotify *mNotifies{nullptr}; + HANDLE mNotifyEvent{nullptr}; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(DSoundPlayback) +}; + +DSoundPlayback::~DSoundPlayback() +{ + if(mNotifies) + mNotifies->Release(); + mNotifies = nullptr; + if(mBuffer) + mBuffer->Release(); + mBuffer = nullptr; + if(mPrimaryBuffer) + mPrimaryBuffer->Release(); + mPrimaryBuffer = nullptr; + + if(mDS) + mDS->Release(); + mDS = nullptr; + if(mNotifyEvent) + CloseHandle(mNotifyEvent); + mNotifyEvent = nullptr; +} + + +FORCE_ALIGN int DSoundPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + DSBCAPS DSBCaps{}; + DSBCaps.dwSize = sizeof(DSBCaps); + HRESULT err{mBuffer->GetCaps(&DSBCaps)}; + if(FAILED(err)) + { + ERR("Failed to get buffer caps: 0x%lx\n", err); + aluHandleDisconnect(mDevice, "Failure retrieving playback buffer info: 0x%lx", err); + return 1; + } + + const size_t FrameStep{mDevice->channelsFromFmt()}; + ALuint FrameSize{mDevice->frameSizeFromFmt()}; + DWORD FragSize{mDevice->UpdateSize * FrameSize}; + + bool Playing{false}; + DWORD LastCursor{0u}; + mBuffer->GetCurrentPosition(&LastCursor, nullptr); + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + // Get current play cursor + DWORD PlayCursor; + mBuffer->GetCurrentPosition(&PlayCursor, nullptr); + DWORD avail = (PlayCursor-LastCursor+DSBCaps.dwBufferBytes) % DSBCaps.dwBufferBytes; + + if(avail < FragSize) + { + if(!Playing) + { + err = mBuffer->Play(0, 0, DSBPLAY_LOOPING); + if(FAILED(err)) + { + ERR("Failed to play buffer: 0x%lx\n", err); + aluHandleDisconnect(mDevice, "Failure starting playback: 0x%lx", err); + return 1; + } + Playing = true; + } + + avail = WaitForSingleObjectEx(mNotifyEvent, 2000, FALSE); + if(avail != WAIT_OBJECT_0) + ERR("WaitForSingleObjectEx error: 0x%lx\n", avail); + continue; + } + avail -= avail%FragSize; + + // Lock output buffer + void *WritePtr1, *WritePtr2; + DWORD WriteCnt1{0u}, WriteCnt2{0u}; + err = mBuffer->Lock(LastCursor, avail, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0); + + // If the buffer is lost, restore it and lock + if(err == DSERR_BUFFERLOST) + { + WARN("Buffer lost, restoring...\n"); + err = mBuffer->Restore(); + if(SUCCEEDED(err)) + { + Playing = false; + LastCursor = 0; + err = mBuffer->Lock(0, DSBCaps.dwBufferBytes, &WritePtr1, &WriteCnt1, + &WritePtr2, &WriteCnt2, 0); + } + } + + if(SUCCEEDED(err)) + { + std::unique_lock dlock{*this}; + aluMixData(mDevice, WritePtr1, WriteCnt1/FrameSize, FrameStep); + if(WriteCnt2 > 0) + aluMixData(mDevice, WritePtr2, WriteCnt2/FrameSize, FrameStep); + dlock.unlock(); + + mBuffer->Unlock(WritePtr1, WriteCnt1, WritePtr2, WriteCnt2); + } + else + { + ERR("Buffer lock error: %#lx\n", err); + std::lock_guard _{*this}; + aluHandleDisconnect(mDevice, "Failed to lock output buffer: 0x%lx", err); + return 1; + } + + // Update old write cursor location + LastCursor += WriteCnt1+WriteCnt2; + LastCursor %= DSBCaps.dwBufferBytes; + } + + return 0; +} + +void DSoundPlayback::open(const ALCchar *name) +{ + HRESULT hr; + if(PlaybackDevices.empty()) + { + /* Initialize COM to prevent name truncation */ + HRESULT hrcom{CoInitialize(nullptr)}; + hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices); + if(FAILED(hr)) + ERR("Error enumerating DirectSound devices (0x%lx)!\n", hr); + if(SUCCEEDED(hrcom)) + CoUninitialize(); + } + + const GUID *guid{nullptr}; + if(!name && !PlaybackDevices.empty()) + { + name = PlaybackDevices[0].name.c_str(); + guid = &PlaybackDevices[0].guid; + } + else + { + auto iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == PlaybackDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + guid = &iter->guid; + } + + hr = DS_OK; + mNotifyEvent = CreateEventW(nullptr, FALSE, FALSE, nullptr); + if(!mNotifyEvent) hr = E_FAIL; + + //DirectSound Init code + if(SUCCEEDED(hr)) + hr = DirectSoundCreate(guid, &mDS, nullptr); + if(SUCCEEDED(hr)) + hr = mDS->SetCooperativeLevel(GetForegroundWindow(), DSSCL_PRIORITY); + if(FAILED(hr)) + throw al::backend_exception{ALC_INVALID_VALUE, "Device init failed: 0x%08lx", hr}; + + mDevice->DeviceName = name; +} + +bool DSoundPlayback::reset() +{ + if(mNotifies) + mNotifies->Release(); + mNotifies = nullptr; + if(mBuffer) + mBuffer->Release(); + mBuffer = nullptr; + if(mPrimaryBuffer) + mPrimaryBuffer->Release(); + mPrimaryBuffer = nullptr; + + switch(mDevice->FmtType) + { + case DevFmtByte: + mDevice->FmtType = DevFmtUByte; + break; + case DevFmtFloat: + if(mDevice->Flags.get()) + break; + /* fall-through */ + case DevFmtUShort: + mDevice->FmtType = DevFmtShort; + break; + case DevFmtUInt: + mDevice->FmtType = DevFmtInt; + break; + case DevFmtUByte: + case DevFmtShort: + case DevFmtInt: + break; + } + + WAVEFORMATEXTENSIBLE OutputType{}; + DWORD speakers; + HRESULT hr{mDS->GetSpeakerConfig(&speakers)}; + if(SUCCEEDED(hr)) + { + speakers = DSSPEAKER_CONFIG(speakers); + if(!mDevice->Flags.get()) + { + if(speakers == DSSPEAKER_MONO) + mDevice->FmtChans = DevFmtMono; + else if(speakers == DSSPEAKER_STEREO || speakers == DSSPEAKER_HEADPHONE) + mDevice->FmtChans = DevFmtStereo; + else if(speakers == DSSPEAKER_QUAD) + mDevice->FmtChans = DevFmtQuad; + else if(speakers == DSSPEAKER_5POINT1_SURROUND) + mDevice->FmtChans = DevFmtX51; + else if(speakers == DSSPEAKER_5POINT1_BACK) + mDevice->FmtChans = DevFmtX51Rear; + else if(speakers == DSSPEAKER_7POINT1 || speakers == DSSPEAKER_7POINT1_SURROUND) + mDevice->FmtChans = DevFmtX71; + else + ERR("Unknown system speaker config: 0x%lx\n", speakers); + } + mDevice->IsHeadphones = (mDevice->FmtChans == DevFmtStereo && + speakers == DSSPEAKER_HEADPHONE); + + switch(mDevice->FmtChans) + { + case DevFmtMono: + OutputType.dwChannelMask = SPEAKER_FRONT_CENTER; + break; + case DevFmtAmbi3D: + mDevice->FmtChans = DevFmtStereo; + /*fall-through*/ + case DevFmtStereo: + OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | + SPEAKER_FRONT_RIGHT; + break; + case DevFmtQuad: + OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | + SPEAKER_FRONT_RIGHT | + SPEAKER_BACK_LEFT | + SPEAKER_BACK_RIGHT; + break; + case DevFmtX51: + OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | + SPEAKER_FRONT_RIGHT | + SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | + SPEAKER_SIDE_LEFT | + SPEAKER_SIDE_RIGHT; + break; + case DevFmtX51Rear: + OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | + SPEAKER_FRONT_RIGHT | + SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | + SPEAKER_BACK_LEFT | + SPEAKER_BACK_RIGHT; + break; + case DevFmtX61: + OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | + SPEAKER_FRONT_RIGHT | + SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | + SPEAKER_BACK_CENTER | + SPEAKER_SIDE_LEFT | + SPEAKER_SIDE_RIGHT; + break; + case DevFmtX71: + OutputType.dwChannelMask = SPEAKER_FRONT_LEFT | + SPEAKER_FRONT_RIGHT | + SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | + SPEAKER_BACK_LEFT | + SPEAKER_BACK_RIGHT | + SPEAKER_SIDE_LEFT | + SPEAKER_SIDE_RIGHT; + break; + } + +retry_open: + hr = S_OK; + OutputType.Format.wFormatTag = WAVE_FORMAT_PCM; + OutputType.Format.nChannels = static_cast(mDevice->channelsFromFmt()); + OutputType.Format.wBitsPerSample = static_cast(mDevice->bytesFromFmt() * 8); + OutputType.Format.nBlockAlign = static_cast(OutputType.Format.nChannels * + OutputType.Format.wBitsPerSample / 8); + OutputType.Format.nSamplesPerSec = mDevice->Frequency; + OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec * + OutputType.Format.nBlockAlign; + OutputType.Format.cbSize = 0; + } + + if(OutputType.Format.nChannels > 2 || mDevice->FmtType == DevFmtFloat) + { + OutputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample; + OutputType.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + if(mDevice->FmtType == DevFmtFloat) + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + else + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + + if(mPrimaryBuffer) + mPrimaryBuffer->Release(); + mPrimaryBuffer = nullptr; + } + else + { + if(SUCCEEDED(hr) && !mPrimaryBuffer) + { + DSBUFFERDESC DSBDescription{}; + DSBDescription.dwSize = sizeof(DSBDescription); + DSBDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; + hr = mDS->CreateSoundBuffer(&DSBDescription, &mPrimaryBuffer, nullptr); + } + if(SUCCEEDED(hr)) + hr = mPrimaryBuffer->SetFormat(&OutputType.Format); + } + + if(SUCCEEDED(hr)) + { + ALuint num_updates{mDevice->BufferSize / mDevice->UpdateSize}; + if(num_updates > MAX_UPDATES) + num_updates = MAX_UPDATES; + mDevice->BufferSize = mDevice->UpdateSize * num_updates; + + DSBUFFERDESC DSBDescription{}; + DSBDescription.dwSize = sizeof(DSBDescription); + DSBDescription.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GETCURRENTPOSITION2 | + DSBCAPS_GLOBALFOCUS; + DSBDescription.dwBufferBytes = mDevice->BufferSize * OutputType.Format.nBlockAlign; + DSBDescription.lpwfxFormat = &OutputType.Format; + + hr = mDS->CreateSoundBuffer(&DSBDescription, &mBuffer, nullptr); + if(FAILED(hr) && mDevice->FmtType == DevFmtFloat) + { + mDevice->FmtType = DevFmtShort; + goto retry_open; + } + } + + if(SUCCEEDED(hr)) + { + void *ptr; + hr = mBuffer->QueryInterface(IID_IDirectSoundNotify, &ptr); + if(SUCCEEDED(hr)) + { + auto Notifies = static_cast(ptr); + mNotifies = Notifies; + + ALuint num_updates{mDevice->BufferSize / mDevice->UpdateSize}; + assert(num_updates <= MAX_UPDATES); + + std::array nots; + for(ALuint i{0};i < num_updates;++i) + { + nots[i].dwOffset = i * mDevice->UpdateSize * OutputType.Format.nBlockAlign; + nots[i].hEventNotify = mNotifyEvent; + } + if(Notifies->SetNotificationPositions(num_updates, nots.data()) != DS_OK) + hr = E_FAIL; + } + } + + if(FAILED(hr)) + { + if(mNotifies) + mNotifies->Release(); + mNotifies = nullptr; + if(mBuffer) + mBuffer->Release(); + mBuffer = nullptr; + if(mPrimaryBuffer) + mPrimaryBuffer->Release(); + mPrimaryBuffer = nullptr; + return false; + } + + ResetEvent(mNotifyEvent); + SetDefaultWFXChannelOrder(mDevice); + + return true; +} + +bool DSoundPlayback::start() +{ + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&DSoundPlayback::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Failed to start mixing thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void DSoundPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + mBuffer->Stop(); +} + + +struct DSoundCapture final : public BackendBase { + DSoundCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~DSoundCapture() override; + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + IDirectSoundCapture *mDSC{nullptr}; + IDirectSoundCaptureBuffer *mDSCbuffer{nullptr}; + DWORD mBufferBytes{0u}; + DWORD mCursor{0u}; + + RingBufferPtr mRing; + + DEF_NEWDEL(DSoundCapture) +}; + +DSoundCapture::~DSoundCapture() +{ + if(mDSCbuffer) + { + mDSCbuffer->Stop(); + mDSCbuffer->Release(); + mDSCbuffer = nullptr; + } + + if(mDSC) + mDSC->Release(); + mDSC = nullptr; +} + + +void DSoundCapture::open(const ALCchar *name) +{ + HRESULT hr; + if(CaptureDevices.empty()) + { + /* Initialize COM to prevent name truncation */ + HRESULT hrcom{CoInitialize(nullptr)}; + hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices); + if(FAILED(hr)) + ERR("Error enumerating DirectSound devices (0x%lx)!\n", hr); + if(SUCCEEDED(hrcom)) + CoUninitialize(); + } + + const GUID *guid{nullptr}; + if(!name && !CaptureDevices.empty()) + { + name = CaptureDevices[0].name.c_str(); + guid = &CaptureDevices[0].guid; + } + else + { + auto iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == CaptureDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + guid = &iter->guid; + } + + switch(mDevice->FmtType) + { + case DevFmtByte: + case DevFmtUShort: + case DevFmtUInt: + WARN("%s capture samples not supported\n", DevFmtTypeString(mDevice->FmtType)); + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture samples not supported", + DevFmtTypeString(mDevice->FmtType)}; + + case DevFmtUByte: + case DevFmtShort: + case DevFmtInt: + case DevFmtFloat: + break; + } + + WAVEFORMATEXTENSIBLE InputType{}; + switch(mDevice->FmtChans) + { + case DevFmtMono: + InputType.dwChannelMask = SPEAKER_FRONT_CENTER; + break; + case DevFmtStereo: + InputType.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + break; + case DevFmtQuad: + InputType.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | + SPEAKER_BACK_RIGHT; + break; + case DevFmtX51: + InputType.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; + break; + case DevFmtX51Rear: + InputType.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; + break; + case DevFmtX61: + InputType.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_CENTER | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; + break; + case DevFmtX71: + InputType.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | + SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | + SPEAKER_SIDE_RIGHT; + break; + case DevFmtAmbi3D: + WARN("%s capture not supported\n", DevFmtChannelsString(mDevice->FmtChans)); + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture not supported", + DevFmtChannelsString(mDevice->FmtChans)}; + } + + InputType.Format.wFormatTag = WAVE_FORMAT_PCM; + InputType.Format.nChannels = static_cast(mDevice->channelsFromFmt()); + InputType.Format.wBitsPerSample = static_cast(mDevice->bytesFromFmt() * 8); + InputType.Format.nBlockAlign = static_cast(InputType.Format.nChannels * + InputType.Format.wBitsPerSample / 8); + InputType.Format.nSamplesPerSec = mDevice->Frequency; + InputType.Format.nAvgBytesPerSec = InputType.Format.nSamplesPerSec * + InputType.Format.nBlockAlign; + InputType.Format.cbSize = 0; + InputType.Samples.wValidBitsPerSample = InputType.Format.wBitsPerSample; + if(mDevice->FmtType == DevFmtFloat) + InputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + else + InputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + + if(InputType.Format.nChannels > 2 || mDevice->FmtType == DevFmtFloat) + { + InputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + InputType.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + } + + ALuint samples{mDevice->BufferSize}; + samples = maxu(samples, 100 * mDevice->Frequency / 1000); + + DSCBUFFERDESC DSCBDescription{}; + DSCBDescription.dwSize = sizeof(DSCBDescription); + DSCBDescription.dwFlags = 0; + DSCBDescription.dwBufferBytes = samples * InputType.Format.nBlockAlign; + DSCBDescription.lpwfxFormat = &InputType.Format; + + //DirectSoundCapture Init code + hr = DirectSoundCaptureCreate(guid, &mDSC, nullptr); + if(SUCCEEDED(hr)) + mDSC->CreateCaptureBuffer(&DSCBDescription, &mDSCbuffer, nullptr); + if(SUCCEEDED(hr)) + mRing = RingBuffer::Create(mDevice->BufferSize, InputType.Format.nBlockAlign, false); + + if(FAILED(hr)) + { + mRing = nullptr; + if(mDSCbuffer) + mDSCbuffer->Release(); + mDSCbuffer = nullptr; + if(mDSC) + mDSC->Release(); + mDSC = nullptr; + + throw al::backend_exception{ALC_INVALID_VALUE, "Device init failed: 0x%08lx", hr}; + } + + mBufferBytes = DSCBDescription.dwBufferBytes; + SetDefaultWFXChannelOrder(mDevice); + + mDevice->DeviceName = name; +} + +bool DSoundCapture::start() +{ + HRESULT hr{mDSCbuffer->Start(DSCBSTART_LOOPING)}; + if(FAILED(hr)) + { + ERR("start failed: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "Failure starting capture: 0x%lx", hr); + return false; + } + return true; +} + +void DSoundCapture::stop() +{ + HRESULT hr{mDSCbuffer->Stop()}; + if(FAILED(hr)) + { + ERR("stop failed: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "Failure stopping capture: 0x%lx", hr); + } +} + +ALCenum DSoundCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + mRing->read(buffer, samples); + return ALC_NO_ERROR; +} + +ALCuint DSoundCapture::availableSamples() +{ + if(!mDevice->Connected.load(std::memory_order_acquire)) + return static_cast(mRing->readSpace()); + + ALuint FrameSize{mDevice->frameSizeFromFmt()}; + DWORD BufferBytes{mBufferBytes}; + DWORD LastCursor{mCursor}; + + DWORD ReadCursor{}; + void *ReadPtr1{}, *ReadPtr2{}; + DWORD ReadCnt1{}, ReadCnt2{}; + HRESULT hr{mDSCbuffer->GetCurrentPosition(nullptr, &ReadCursor)}; + if(SUCCEEDED(hr)) + { + DWORD NumBytes{(ReadCursor-LastCursor + BufferBytes) % BufferBytes}; + if(!NumBytes) return static_cast(mRing->readSpace()); + hr = mDSCbuffer->Lock(LastCursor, NumBytes, &ReadPtr1, &ReadCnt1, &ReadPtr2, &ReadCnt2, 0); + } + if(SUCCEEDED(hr)) + { + mRing->write(ReadPtr1, ReadCnt1/FrameSize); + if(ReadPtr2 != nullptr && ReadCnt2 > 0) + mRing->write(ReadPtr2, ReadCnt2/FrameSize); + hr = mDSCbuffer->Unlock(ReadPtr1, ReadCnt1, ReadPtr2, ReadCnt2); + mCursor = (LastCursor+ReadCnt1+ReadCnt2) % BufferBytes; + } + + if(FAILED(hr)) + { + ERR("update failed: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "Failure retrieving capture data: 0x%lx", hr); + } + + return static_cast(mRing->readSpace()); +} + +} // namespace + + +BackendFactory &DSoundBackendFactory::getFactory() +{ + static DSoundBackendFactory factory{}; + return factory; +} + +bool DSoundBackendFactory::init() +{ +#ifdef HAVE_DYNLOAD + if(!ds_handle) + { + ds_handle = LoadLib("dsound.dll"); + if(!ds_handle) + { + ERR("Failed to load dsound.dll\n"); + return false; + } + +#define LOAD_FUNC(f) do { \ + p##f = reinterpret_cast(GetSymbol(ds_handle, #f)); \ + if(!p##f) \ + { \ + CloseLib(ds_handle); \ + ds_handle = nullptr; \ + return false; \ + } \ +} while(0) + LOAD_FUNC(DirectSoundCreate); + LOAD_FUNC(DirectSoundEnumerateW); + LOAD_FUNC(DirectSoundCaptureCreate); + LOAD_FUNC(DirectSoundCaptureEnumerateW); +#undef LOAD_FUNC + } +#endif + return true; +} + +bool DSoundBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } + +void DSoundBackendFactory::probe(DevProbe type, std::string *outnames) +{ + auto add_device = [outnames](const DevMap &entry) -> void + { + /* +1 to also append the null char (to ensure a null-separated list and + * double-null terminated list). + */ + outnames->append(entry.name.c_str(), entry.name.length()+1); + }; + + /* Initialize COM to prevent name truncation */ + HRESULT hr; + HRESULT hrcom{CoInitialize(nullptr)}; + switch(type) + { + case DevProbe::Playback: + PlaybackDevices.clear(); + hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices); + if(FAILED(hr)) + ERR("Error enumerating DirectSound playback devices (0x%lx)!\n", hr); + std::for_each(PlaybackDevices.cbegin(), PlaybackDevices.cend(), add_device); + break; + + case DevProbe::Capture: + CaptureDevices.clear(); + hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices); + if(FAILED(hr)) + ERR("Error enumerating DirectSound capture devices (0x%lx)!\n", hr); + std::for_each(CaptureDevices.cbegin(), CaptureDevices.cend(), add_device); + break; + } + if(SUCCEEDED(hrcom)) + CoUninitialize(); +} + +BackendPtr DSoundBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new DSoundPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new DSoundCapture{device}}; + return nullptr; +} diff --git a/alc/backends/dsound.h b/alc/backends/dsound.h new file mode 100644 index 0000000..6bef0bf --- /dev/null +++ b/alc/backends/dsound.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_DSOUND_H +#define BACKENDS_DSOUND_H + +#include "backends/base.h" + +struct DSoundBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_DSOUND_H */ diff --git a/alc/backends/jack.cpp b/alc/backends/jack.cpp new file mode 100644 index 0000000..485225e --- /dev/null +++ b/alc/backends/jack.cpp @@ -0,0 +1,532 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/jack.h" + +#include +#include +#include + +#include +#include + +#include "alcmain.h" +#include "alu.h" +#include "alconfig.h" +#include "alexcpt.h" +#include "dynload.h" +#include "ringbuffer.h" +#include "threads.h" + +#include +#include + + +namespace { + +constexpr ALCchar jackDevice[] = "JACK Default"; + + +#ifdef HAVE_DYNLOAD +#define JACK_FUNCS(MAGIC) \ + MAGIC(jack_client_open); \ + MAGIC(jack_client_close); \ + MAGIC(jack_client_name_size); \ + MAGIC(jack_get_client_name); \ + MAGIC(jack_connect); \ + MAGIC(jack_activate); \ + MAGIC(jack_deactivate); \ + MAGIC(jack_port_register); \ + MAGIC(jack_port_unregister); \ + MAGIC(jack_port_get_buffer); \ + MAGIC(jack_port_name); \ + MAGIC(jack_get_ports); \ + MAGIC(jack_free); \ + MAGIC(jack_get_sample_rate); \ + MAGIC(jack_set_error_function); \ + MAGIC(jack_set_process_callback); \ + MAGIC(jack_set_buffer_size_callback); \ + MAGIC(jack_set_buffer_size); \ + MAGIC(jack_get_buffer_size); + +void *jack_handle; +#define MAKE_FUNC(f) decltype(f) * p##f +JACK_FUNCS(MAKE_FUNC); +decltype(jack_error_callback) * pjack_error_callback; +#undef MAKE_FUNC + +#ifndef IN_IDE_PARSER +#define jack_client_open pjack_client_open +#define jack_client_close pjack_client_close +#define jack_client_name_size pjack_client_name_size +#define jack_get_client_name pjack_get_client_name +#define jack_connect pjack_connect +#define jack_activate pjack_activate +#define jack_deactivate pjack_deactivate +#define jack_port_register pjack_port_register +#define jack_port_unregister pjack_port_unregister +#define jack_port_get_buffer pjack_port_get_buffer +#define jack_port_name pjack_port_name +#define jack_get_ports pjack_get_ports +#define jack_free pjack_free +#define jack_get_sample_rate pjack_get_sample_rate +#define jack_set_error_function pjack_set_error_function +#define jack_set_process_callback pjack_set_process_callback +#define jack_set_buffer_size_callback pjack_set_buffer_size_callback +#define jack_set_buffer_size pjack_set_buffer_size +#define jack_get_buffer_size pjack_get_buffer_size +#define jack_error_callback (*pjack_error_callback) +#endif +#endif + + +jack_options_t ClientOptions = JackNullOption; + +ALCboolean jack_load() +{ + ALCboolean error = ALC_FALSE; + +#ifdef HAVE_DYNLOAD + if(!jack_handle) + { + std::string missing_funcs; + +#ifdef _WIN32 +#define JACKLIB "libjack.dll" +#else +#define JACKLIB "libjack.so.0" +#endif + jack_handle = LoadLib(JACKLIB); + if(!jack_handle) + { + WARN("Failed to load %s\n", JACKLIB); + return ALC_FALSE; + } + + error = ALC_FALSE; +#define LOAD_FUNC(f) do { \ + p##f = reinterpret_cast(GetSymbol(jack_handle, #f)); \ + if(p##f == nullptr) { \ + error = ALC_TRUE; \ + missing_funcs += "\n" #f; \ + } \ +} while(0) + JACK_FUNCS(LOAD_FUNC); +#undef LOAD_FUNC + /* Optional symbols. These don't exist in all versions of JACK. */ +#define LOAD_SYM(f) p##f = reinterpret_cast(GetSymbol(jack_handle, #f)) + LOAD_SYM(jack_error_callback); +#undef LOAD_SYM + + if(error) + { + WARN("Missing expected functions:%s\n", missing_funcs.c_str()); + CloseLib(jack_handle); + jack_handle = nullptr; + } + } +#endif + + return !error; +} + + +struct JackPlayback final : public BackendBase { + JackPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~JackPlayback() override; + + int process(jack_nframes_t numframes) noexcept; + static int processC(jack_nframes_t numframes, void *arg) noexcept + { return static_cast(arg)->process(numframes); } + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + ClockLatency getClockLatency() override; + + jack_client_t *mClient{nullptr}; + jack_port_t *mPort[MAX_OUTPUT_CHANNELS]{}; + + std::atomic mPlaying{false}; + RingBufferPtr mRing; + al::semaphore mSem; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(JackPlayback) +}; + +JackPlayback::~JackPlayback() +{ + if(!mClient) + return; + + std::for_each(std::begin(mPort), std::end(mPort), + [this](jack_port_t *port) -> void + { if(port) jack_port_unregister(mClient, port); } + ); + std::fill(std::begin(mPort), std::end(mPort), nullptr); + jack_client_close(mClient); + mClient = nullptr; +} + + +int JackPlayback::process(jack_nframes_t numframes) noexcept +{ + jack_default_audio_sample_t *out[MAX_OUTPUT_CHANNELS]; + size_t numchans{0}; + for(auto port : mPort) + { + if(!port) break; + out[numchans++] = static_cast(jack_port_get_buffer(port, numframes)); + } + + jack_nframes_t total{0}; + if LIKELY(mPlaying.load(std::memory_order_acquire)) + { + auto data = mRing->getReadVector(); + jack_nframes_t todo{minu(numframes, static_cast(data.first.len))}; + auto write_first = [&data,numchans,todo](float *outbuf) -> float* + { + const float *RESTRICT in = reinterpret_cast(data.first.buf); + auto deinterlace_input = [&in,numchans]() noexcept -> float + { + float ret{*in}; + in += numchans; + return ret; + }; + std::generate_n(outbuf, todo, deinterlace_input); + data.first.buf += sizeof(float); + return outbuf + todo; + }; + std::transform(out, out+numchans, out, write_first); + total += todo; + + todo = minu(numframes-total, static_cast(data.second.len)); + if(todo > 0) + { + auto write_second = [&data,numchans,todo](float *outbuf) -> float* + { + const float *RESTRICT in = reinterpret_cast(data.second.buf); + auto deinterlace_input = [&in,numchans]() noexcept -> float + { + float ret{*in}; + in += numchans; + return ret; + }; + std::generate_n(outbuf, todo, deinterlace_input); + data.second.buf += sizeof(float); + return outbuf + todo; + }; + std::transform(out, out+numchans, out, write_second); + total += todo; + } + + mRing->readAdvance(total); + mSem.post(); + } + + if(numframes > total) + { + jack_nframes_t todo{numframes - total}; + auto clear_buf = [todo](ALfloat *outbuf) -> void { std::fill_n(outbuf, todo, 0.0f); }; + std::for_each(out, out+numchans, clear_buf); + } + + return 0; +} + +int JackPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t frame_step{mDevice->channelsFromFmt()}; + + std::unique_lock dlock{*this}; + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + if(mRing->writeSpace() < mDevice->UpdateSize) + { + dlock.unlock(); + mSem.wait(); + dlock.lock(); + continue; + } + + auto data = mRing->getWriteVector(); + auto todo = static_cast(data.first.len + data.second.len); + todo -= todo%mDevice->UpdateSize; + + ALuint len1{minu(static_cast(data.first.len), todo)}; + ALuint len2{minu(static_cast(data.second.len), todo-len1)}; + + aluMixData(mDevice, data.first.buf, len1, frame_step); + if(len2 > 0) + aluMixData(mDevice, data.second.buf, len2, frame_step); + mRing->writeAdvance(todo); + } + + return 0; +} + + +void JackPlayback::open(const ALCchar *name) +{ + if(!name) + name = jackDevice; + else if(strcmp(name, jackDevice) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + const char *client_name{"alsoft"}; + jack_status_t status; + mClient = jack_client_open(client_name, ClientOptions, &status, nullptr); + if(mClient == nullptr) + throw al::backend_exception{ALC_INVALID_VALUE, "Failed to open client connection: 0x%02x", + status}; + + if((status&JackServerStarted)) + TRACE("JACK server started\n"); + if((status&JackNameNotUnique)) + { + client_name = jack_get_client_name(mClient); + TRACE("Client name not unique, got '%s' instead\n", client_name); + } + + jack_set_process_callback(mClient, &JackPlayback::processC, this); + + mDevice->DeviceName = name; +} + +bool JackPlayback::reset() +{ + std::for_each(std::begin(mPort), std::end(mPort), + [this](jack_port_t *port) -> void + { if(port) jack_port_unregister(mClient, port); } + ); + std::fill(std::begin(mPort), std::end(mPort), nullptr); + + /* Ignore the requested buffer metrics and just keep one JACK-sized buffer + * ready for when requested. + */ + mDevice->Frequency = jack_get_sample_rate(mClient); + mDevice->UpdateSize = jack_get_buffer_size(mClient); + mDevice->BufferSize = mDevice->UpdateSize * 2; + + const char *devname{mDevice->DeviceName.c_str()}; + ALuint bufsize{ConfigValueUInt(devname, "jack", "buffer-size").value_or(mDevice->UpdateSize)}; + bufsize = maxu(NextPowerOf2(bufsize), mDevice->UpdateSize); + mDevice->BufferSize = bufsize + mDevice->UpdateSize; + + /* Force 32-bit float output. */ + mDevice->FmtType = DevFmtFloat; + + auto ports_end = std::begin(mPort) + mDevice->channelsFromFmt(); + auto bad_port = std::find_if_not(std::begin(mPort), ports_end, + [this](jack_port_t *&port) -> bool + { + std::string name{"channel_" + std::to_string(&port - mPort + 1)}; + port = jack_port_register(mClient, name.c_str(), JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, 0); + return port != nullptr; + } + ); + if(bad_port != ports_end) + { + ERR("Not enough JACK ports available for %s output\n", DevFmtChannelsString(mDevice->FmtChans)); + if(bad_port == std::begin(mPort)) return false; + + if(bad_port == std::begin(mPort)+1) + mDevice->FmtChans = DevFmtMono; + else + { + ports_end = mPort+2; + while(bad_port != ports_end) + { + jack_port_unregister(mClient, *(--bad_port)); + *bad_port = nullptr; + } + mDevice->FmtChans = DevFmtStereo; + } + } + + SetDefaultChannelOrder(mDevice); + + return true; +} + +bool JackPlayback::start() +{ + if(jack_activate(mClient)) + { + ERR("Failed to activate client\n"); + return false; + } + + const char **ports{jack_get_ports(mClient, nullptr, nullptr, + JackPortIsPhysical|JackPortIsInput)}; + if(ports == nullptr) + { + ERR("No physical playback ports found\n"); + jack_deactivate(mClient); + return false; + } + std::mismatch(std::begin(mPort), std::end(mPort), ports, + [this](const jack_port_t *port, const char *pname) -> bool + { + if(!port) return false; + if(!pname) + { + ERR("No physical playback port for \"%s\"\n", jack_port_name(port)); + return false; + } + if(jack_connect(mClient, jack_port_name(port), pname)) + ERR("Failed to connect output port \"%s\" to \"%s\"\n", jack_port_name(port), + pname); + return true; + }); + jack_free(ports); + + /* Reconfigure buffer metrics in case the server changed it since the reset + * (it won't change again after jack_activate), then allocate the ring + * buffer with the appropriate size. + */ + mDevice->Frequency = jack_get_sample_rate(mClient); + mDevice->UpdateSize = jack_get_buffer_size(mClient); + mDevice->BufferSize = mDevice->UpdateSize * 2; + + const char *devname{mDevice->DeviceName.c_str()}; + ALuint bufsize{ConfigValueUInt(devname, "jack", "buffer-size").value_or(mDevice->UpdateSize)}; + bufsize = maxu(NextPowerOf2(bufsize), mDevice->UpdateSize); + mDevice->BufferSize = bufsize + mDevice->UpdateSize; + + mRing = nullptr; + mRing = RingBuffer::Create(bufsize, mDevice->frameSizeFromFmt(), true); + + try { + mPlaying.store(true, std::memory_order_release); + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&JackPlayback::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + catch(...) { + } + jack_deactivate(mClient); + mPlaying.store(false, std::memory_order_release); + return false; +} + +void JackPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + + mSem.post(); + mThread.join(); + + jack_deactivate(mClient); + mPlaying.store(false, std::memory_order_release); +} + + +ClockLatency JackPlayback::getClockLatency() +{ + ClockLatency ret; + + std::lock_guard _{*this}; + ret.ClockTime = GetDeviceClockTime(mDevice); + ret.Latency = std::chrono::seconds{mRing->readSpace()}; + ret.Latency /= mDevice->Frequency; + + return ret; +} + + +void jack_msg_handler(const char *message) +{ + WARN("%s\n", message); +} + +} // namespace + +bool JackBackendFactory::init() +{ + if(!jack_load()) + return false; + + if(!GetConfigValueBool(nullptr, "jack", "spawn-server", 0)) + ClientOptions = static_cast(ClientOptions | JackNoStartServer); + + void (*old_error_cb)(const char*){&jack_error_callback ? jack_error_callback : nullptr}; + jack_set_error_function(jack_msg_handler); + jack_status_t status; + jack_client_t *client{jack_client_open("alsoft", ClientOptions, &status, nullptr)}; + jack_set_error_function(old_error_cb); + if(!client) + { + WARN("jack_client_open() failed, 0x%02x\n", status); + if((status&JackServerFailed) && !(ClientOptions&JackNoStartServer)) + ERR("Unable to connect to JACK server\n"); + return false; + } + + jack_client_close(client); + return true; +} + +bool JackBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback); } + +void JackBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + /* Includes null char. */ + outnames->append(jackDevice, sizeof(jackDevice)); + break; + + case DevProbe::Capture: + break; + } +} + +BackendPtr JackBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new JackPlayback{device}}; + return nullptr; +} + +BackendFactory &JackBackendFactory::getFactory() +{ + static JackBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/jack.h b/alc/backends/jack.h new file mode 100644 index 0000000..10beebf --- /dev/null +++ b/alc/backends/jack.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_JACK_H +#define BACKENDS_JACK_H + +#include "backends/base.h" + +struct JackBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_JACK_H */ diff --git a/alc/backends/loopback.cpp b/alc/backends/loopback.cpp new file mode 100644 index 0000000..511061f --- /dev/null +++ b/alc/backends/loopback.cpp @@ -0,0 +1,79 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2011 by Chris Robinson + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/loopback.h" + +#include "alcmain.h" +#include "alu.h" + + +namespace { + +struct LoopbackBackend final : public BackendBase { + LoopbackBackend(ALCdevice *device) noexcept : BackendBase{device} { } + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + DEF_NEWDEL(LoopbackBackend) +}; + + +void LoopbackBackend::open(const ALCchar *name) +{ + mDevice->DeviceName = name; +} + +bool LoopbackBackend::reset() +{ + SetDefaultWFXChannelOrder(mDevice); + return true; +} + +bool LoopbackBackend::start() +{ return true; } + +void LoopbackBackend::stop() +{ } + +} // namespace + + +bool LoopbackBackendFactory::init() +{ return true; } + +bool LoopbackBackendFactory::querySupport(BackendType) +{ return true; } + +void LoopbackBackendFactory::probe(DevProbe, std::string*) +{ } + +BackendPtr LoopbackBackendFactory::createBackend(ALCdevice *device, BackendType) +{ return BackendPtr{new LoopbackBackend{device}}; } + +BackendFactory &LoopbackBackendFactory::getFactory() +{ + static LoopbackBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/loopback.h b/alc/backends/loopback.h new file mode 100644 index 0000000..09c085b --- /dev/null +++ b/alc/backends/loopback.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_LOOPBACK_H +#define BACKENDS_LOOPBACK_H + +#include "backends/base.h" + +struct LoopbackBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_LOOPBACK_H */ diff --git a/alc/backends/null.cpp b/alc/backends/null.cpp new file mode 100644 index 0000000..9f069be --- /dev/null +++ b/alc/backends/null.cpp @@ -0,0 +1,182 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2010 by Chris Robinson + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/null.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alu.h" +#include "logging.h" +#include "threads.h" + + +namespace { + +using std::chrono::seconds; +using std::chrono::milliseconds; +using std::chrono::nanoseconds; + +constexpr ALCchar nullDevice[] = "No Output"; + + +struct NullBackend final : public BackendBase { + NullBackend(ALCdevice *device) noexcept : BackendBase{device} { } + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(NullBackend) +}; + +int NullBackend::mixerProc() +{ + const milliseconds restTime{mDevice->UpdateSize*1000/mDevice->Frequency / 2}; + + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + int64_t done{0}; + auto start = std::chrono::steady_clock::now(); + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + auto now = std::chrono::steady_clock::now(); + + /* This converts from nanoseconds to nanosamples, then to samples. */ + int64_t avail{std::chrono::duration_cast((now-start) * mDevice->Frequency).count()}; + if(avail-done < mDevice->UpdateSize) + { + std::this_thread::sleep_for(restTime); + continue; + } + while(avail-done >= mDevice->UpdateSize) + { + std::lock_guard _{*this}; + aluMixData(mDevice, nullptr, mDevice->UpdateSize, 0u); + done += mDevice->UpdateSize; + } + + /* For every completed second, increment the start time and reduce the + * samples done. This prevents the difference between the start time + * and current time from growing too large, while maintaining the + * correct number of samples to render. + */ + if(done >= mDevice->Frequency) + { + seconds s{done/mDevice->Frequency}; + start += s; + done -= mDevice->Frequency*s.count(); + } + } + + return 0; +} + + +void NullBackend::open(const ALCchar *name) +{ + if(!name) + name = nullDevice; + else if(strcmp(name, nullDevice) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + mDevice->DeviceName = name; +} + +bool NullBackend::reset() +{ + SetDefaultWFXChannelOrder(mDevice); + return true; +} + +bool NullBackend::start() +{ + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&NullBackend::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Failed to start mixing thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void NullBackend::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); +} + +} // namespace + + +bool NullBackendFactory::init() +{ return true; } + +bool NullBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback); } + +void NullBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + /* Includes null char. */ + outnames->append(nullDevice, sizeof(nullDevice)); + break; + case DevProbe::Capture: + break; + } +} + +BackendPtr NullBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new NullBackend{device}}; + return nullptr; +} + +BackendFactory &NullBackendFactory::getFactory() +{ + static NullBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/null.h b/alc/backends/null.h new file mode 100644 index 0000000..f19d5b4 --- /dev/null +++ b/alc/backends/null.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_NULL_H +#define BACKENDS_NULL_H + +#include "backends/base.h" + +struct NullBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_NULL_H */ diff --git a/alc/backends/opensl.cpp b/alc/backends/opensl.cpp new file mode 100644 index 0000000..aafba2c --- /dev/null +++ b/alc/backends/opensl.cpp @@ -0,0 +1,966 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This is an OpenAL backend for Android using the native audio APIs based on + * OpenSL ES 1.0.1. It is based on source code for the native-audio sample app + * bundled with NDK. + */ + +#include "config.h" + +#include "backends/opensl.h" + +#include +#include + +#include +#include +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "compat.h" +#include "endiantest.h" +#include "ringbuffer.h" +#include "threads.h" + +#include +#include +#include + + +namespace { + +/* Helper macros */ +#define EXTRACT_VCALL_ARGS(...) __VA_ARGS__)) +#define VCALL(obj, func) ((*(obj))->func((obj), EXTRACT_VCALL_ARGS +#define VCALL0(obj, func) ((*(obj))->func((obj) EXTRACT_VCALL_ARGS + + +constexpr ALCchar opensl_device[] = "OpenSL"; + + +SLuint32 GetChannelMask(DevFmtChannels chans) +{ + switch(chans) + { + case DevFmtMono: return SL_SPEAKER_FRONT_CENTER; + case DevFmtStereo: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + case DevFmtQuad: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | + SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT; + case DevFmtX51: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | + SL_SPEAKER_FRONT_CENTER | SL_SPEAKER_LOW_FREQUENCY | SL_SPEAKER_SIDE_LEFT | + SL_SPEAKER_SIDE_RIGHT; + case DevFmtX51Rear: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | + SL_SPEAKER_FRONT_CENTER | SL_SPEAKER_LOW_FREQUENCY | SL_SPEAKER_BACK_LEFT | + SL_SPEAKER_BACK_RIGHT; + case DevFmtX61: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | + SL_SPEAKER_FRONT_CENTER | SL_SPEAKER_LOW_FREQUENCY | SL_SPEAKER_BACK_CENTER | + SL_SPEAKER_SIDE_LEFT | SL_SPEAKER_SIDE_RIGHT; + case DevFmtX71: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | + SL_SPEAKER_FRONT_CENTER | SL_SPEAKER_LOW_FREQUENCY | SL_SPEAKER_BACK_LEFT | + SL_SPEAKER_BACK_RIGHT | SL_SPEAKER_SIDE_LEFT | SL_SPEAKER_SIDE_RIGHT; + case DevFmtAmbi3D: + break; + } + return 0; +} + +#ifdef SL_ANDROID_DATAFORMAT_PCM_EX +SLuint32 GetTypeRepresentation(DevFmtType type) +{ + switch(type) + { + case DevFmtUByte: + case DevFmtUShort: + case DevFmtUInt: + return SL_ANDROID_PCM_REPRESENTATION_UNSIGNED_INT; + case DevFmtByte: + case DevFmtShort: + case DevFmtInt: + return SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; + case DevFmtFloat: + return SL_ANDROID_PCM_REPRESENTATION_FLOAT; + } + return 0; +} +#endif + +const char *res_str(SLresult result) +{ + switch(result) + { + case SL_RESULT_SUCCESS: return "Success"; + case SL_RESULT_PRECONDITIONS_VIOLATED: return "Preconditions violated"; + case SL_RESULT_PARAMETER_INVALID: return "Parameter invalid"; + case SL_RESULT_MEMORY_FAILURE: return "Memory failure"; + case SL_RESULT_RESOURCE_ERROR: return "Resource error"; + case SL_RESULT_RESOURCE_LOST: return "Resource lost"; + case SL_RESULT_IO_ERROR: return "I/O error"; + case SL_RESULT_BUFFER_INSUFFICIENT: return "Buffer insufficient"; + case SL_RESULT_CONTENT_CORRUPTED: return "Content corrupted"; + case SL_RESULT_CONTENT_UNSUPPORTED: return "Content unsupported"; + case SL_RESULT_CONTENT_NOT_FOUND: return "Content not found"; + case SL_RESULT_PERMISSION_DENIED: return "Permission denied"; + case SL_RESULT_FEATURE_UNSUPPORTED: return "Feature unsupported"; + case SL_RESULT_INTERNAL_ERROR: return "Internal error"; + case SL_RESULT_UNKNOWN_ERROR: return "Unknown error"; + case SL_RESULT_OPERATION_ABORTED: return "Operation aborted"; + case SL_RESULT_CONTROL_LOST: return "Control lost"; +#ifdef SL_RESULT_READONLY + case SL_RESULT_READONLY: return "ReadOnly"; +#endif +#ifdef SL_RESULT_ENGINEOPTION_UNSUPPORTED + case SL_RESULT_ENGINEOPTION_UNSUPPORTED: return "Engine option unsupported"; +#endif +#ifdef SL_RESULT_SOURCE_SINK_INCOMPATIBLE + case SL_RESULT_SOURCE_SINK_INCOMPATIBLE: return "Source/Sink incompatible"; +#endif + } + return "Unknown error code"; +} + +#define PRINTERR(x, s) do { \ + if UNLIKELY((x) != SL_RESULT_SUCCESS) \ + ERR("%s: %s\n", (s), res_str((x))); \ +} while(0) + + +struct OpenSLPlayback final : public BackendBase { + OpenSLPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~OpenSLPlayback() override; + + void process(SLAndroidSimpleBufferQueueItf bq) noexcept; + static void processC(SLAndroidSimpleBufferQueueItf bq, void *context) noexcept + { static_cast(context)->process(bq); } + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + ClockLatency getClockLatency() override; + + /* engine interfaces */ + SLObjectItf mEngineObj{nullptr}; + SLEngineItf mEngine{nullptr}; + + /* output mix interfaces */ + SLObjectItf mOutputMix{nullptr}; + + /* buffer queue player interfaces */ + SLObjectItf mBufferQueueObj{nullptr}; + + RingBufferPtr mRing{nullptr}; + al::semaphore mSem; + + ALuint mFrameSize{0}; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(OpenSLPlayback) +}; + +OpenSLPlayback::~OpenSLPlayback() +{ + if(mBufferQueueObj) + VCALL0(mBufferQueueObj,Destroy)(); + mBufferQueueObj = nullptr; + + if(mOutputMix) + VCALL0(mOutputMix,Destroy)(); + mOutputMix = nullptr; + + if(mEngineObj) + VCALL0(mEngineObj,Destroy)(); + mEngineObj = nullptr; + mEngine = nullptr; +} + + +/* this callback handler is called every time a buffer finishes playing */ +void OpenSLPlayback::process(SLAndroidSimpleBufferQueueItf) noexcept +{ + /* A note on the ringbuffer usage: The buffer queue seems to hold on to the + * pointer passed to the Enqueue method, rather than copying the audio. + * Consequently, the ringbuffer contains the audio that is currently queued + * and waiting to play. This process() callback is called when a buffer is + * finished, so we simply move the read pointer up to indicate the space is + * available for writing again, and wake up the mixer thread to mix and + * queue more audio. + */ + mRing->readAdvance(1); + + mSem.post(); +} + +int OpenSLPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + SLPlayItf player; + SLAndroidSimpleBufferQueueItf bufferQueue; + SLresult result{VCALL(mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, + &bufferQueue)}; + PRINTERR(result, "bufferQueue->GetInterface SL_IID_ANDROIDSIMPLEBUFFERQUEUE"); + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mBufferQueueObj,GetInterface)(SL_IID_PLAY, &player); + PRINTERR(result, "bufferQueue->GetInterface SL_IID_PLAY"); + } + + const size_t frame_step{mDevice->channelsFromFmt()}; + + std::unique_lock dlock{*this}; + if(SL_RESULT_SUCCESS != result) + aluHandleDisconnect(mDevice, "Failed to get playback buffer: 0x%08x", result); + + while(SL_RESULT_SUCCESS == result && !mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + if(mRing->writeSpace() == 0) + { + SLuint32 state{0}; + + result = VCALL(player,GetPlayState)(&state); + PRINTERR(result, "player->GetPlayState"); + if(SL_RESULT_SUCCESS == result && state != SL_PLAYSTATE_PLAYING) + { + result = VCALL(player,SetPlayState)(SL_PLAYSTATE_PLAYING); + PRINTERR(result, "player->SetPlayState"); + } + if(SL_RESULT_SUCCESS != result) + { + aluHandleDisconnect(mDevice, "Failed to start platback: 0x%08x", result); + break; + } + + if(mRing->writeSpace() == 0) + { + dlock.unlock(); + mSem.wait(); + dlock.lock(); + continue; + } + } + + auto data = mRing->getWriteVector(); + aluMixData(mDevice, data.first.buf, + static_cast(data.first.len*mDevice->UpdateSize), frame_step); + if(data.second.len > 0) + aluMixData(mDevice, data.second.buf, + static_cast(data.second.len*mDevice->UpdateSize), frame_step); + + size_t todo{data.first.len + data.second.len}; + mRing->writeAdvance(todo); + + for(size_t i{0};i < todo;i++) + { + if(!data.first.len) + { + data.first = data.second; + data.second.buf = nullptr; + data.second.len = 0; + } + + result = VCALL(bufferQueue,Enqueue)(data.first.buf, mDevice->UpdateSize*mFrameSize); + PRINTERR(result, "bufferQueue->Enqueue"); + if(SL_RESULT_SUCCESS != result) + { + aluHandleDisconnect(mDevice, "Failed to queue audio: 0x%08x", result); + break; + } + + data.first.len--; + data.first.buf += mDevice->UpdateSize*mFrameSize; + } + } + + return 0; +} + + +void OpenSLPlayback::open(const ALCchar *name) +{ + if(!name) + name = opensl_device; + else if(strcmp(name, opensl_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + // create engine + SLresult result{slCreateEngine(&mEngineObj, 0, nullptr, 0, nullptr, nullptr)}; + PRINTERR(result, "slCreateEngine"); + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mEngineObj,Realize)(SL_BOOLEAN_FALSE); + PRINTERR(result, "engine->Realize"); + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mEngineObj,GetInterface)(SL_IID_ENGINE, &mEngine); + PRINTERR(result, "engine->GetInterface"); + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mEngine,CreateOutputMix)(&mOutputMix, 0, nullptr, nullptr); + PRINTERR(result, "engine->CreateOutputMix"); + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mOutputMix,Realize)(SL_BOOLEAN_FALSE); + PRINTERR(result, "outputMix->Realize"); + } + + if(SL_RESULT_SUCCESS != result) + { + if(mOutputMix) + VCALL0(mOutputMix,Destroy)(); + mOutputMix = nullptr; + + if(mEngineObj) + VCALL0(mEngineObj,Destroy)(); + mEngineObj = nullptr; + mEngine = nullptr; + + throw al::backend_exception{ALC_INVALID_VALUE, + "Failed to initialize OpenSL device: 0x%08x", result}; + } + + mDevice->DeviceName = name; +} + +bool OpenSLPlayback::reset() +{ + SLresult result; + + if(mBufferQueueObj) + VCALL0(mBufferQueueObj,Destroy)(); + mBufferQueueObj = nullptr; + + mRing = nullptr; + +#if 0 + if(!mDevice->Flags.get()) + { + /* FIXME: Disabled until I figure out how to get the Context needed for + * the getSystemService call. + */ + JNIEnv *env = Android_GetJNIEnv(); + jobject jctx = Android_GetContext(); + + /* Get necessary stuff for using java.lang.Integer, + * android.content.Context, and android.media.AudioManager. + */ + jclass int_cls = JCALL(env,FindClass)("java/lang/Integer"); + jmethodID int_parseint = JCALL(env,GetStaticMethodID)(int_cls, + "parseInt", "(Ljava/lang/String;)I" + ); + TRACE("Integer: %p, parseInt: %p\n", int_cls, int_parseint); + + jclass ctx_cls = JCALL(env,FindClass)("android/content/Context"); + jfieldID ctx_audsvc = JCALL(env,GetStaticFieldID)(ctx_cls, + "AUDIO_SERVICE", "Ljava/lang/String;" + ); + jmethodID ctx_getSysSvc = JCALL(env,GetMethodID)(ctx_cls, + "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;" + ); + TRACE("Context: %p, AUDIO_SERVICE: %p, getSystemService: %p\n", + ctx_cls, ctx_audsvc, ctx_getSysSvc); + + jclass audmgr_cls = JCALL(env,FindClass)("android/media/AudioManager"); + jfieldID audmgr_prop_out_srate = JCALL(env,GetStaticFieldID)(audmgr_cls, + "PROPERTY_OUTPUT_SAMPLE_RATE", "Ljava/lang/String;" + ); + jmethodID audmgr_getproperty = JCALL(env,GetMethodID)(audmgr_cls, + "getProperty", "(Ljava/lang/String;)Ljava/lang/String;" + ); + TRACE("AudioManager: %p, PROPERTY_OUTPUT_SAMPLE_RATE: %p, getProperty: %p\n", + audmgr_cls, audmgr_prop_out_srate, audmgr_getproperty); + + const char *strchars; + jstring strobj; + + /* Now make the calls. */ + //AudioManager audMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); + strobj = JCALL(env,GetStaticObjectField)(ctx_cls, ctx_audsvc); + jobject audMgr = JCALL(env,CallObjectMethod)(jctx, ctx_getSysSvc, strobj); + strchars = JCALL(env,GetStringUTFChars)(strobj, nullptr); + TRACE("Context.getSystemService(%s) = %p\n", strchars, audMgr); + JCALL(env,ReleaseStringUTFChars)(strobj, strchars); + + //String srateStr = audMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); + strobj = JCALL(env,GetStaticObjectField)(audmgr_cls, audmgr_prop_out_srate); + jstring srateStr = JCALL(env,CallObjectMethod)(audMgr, audmgr_getproperty, strobj); + strchars = JCALL(env,GetStringUTFChars)(strobj, nullptr); + TRACE("audMgr.getProperty(%s) = %p\n", strchars, srateStr); + JCALL(env,ReleaseStringUTFChars)(strobj, strchars); + + //int sampleRate = Integer.parseInt(srateStr); + sampleRate = JCALL(env,CallStaticIntMethod)(int_cls, int_parseint, srateStr); + + strchars = JCALL(env,GetStringUTFChars)(srateStr, nullptr); + TRACE("Got system sample rate %uhz (%s)\n", sampleRate, strchars); + JCALL(env,ReleaseStringUTFChars)(srateStr, strchars); + + if(!sampleRate) sampleRate = device->Frequency; + else sampleRate = maxu(sampleRate, MIN_OUTPUT_RATE); + } +#endif + + mDevice->FmtChans = DevFmtStereo; + mDevice->FmtType = DevFmtShort; + + SetDefaultWFXChannelOrder(mDevice); + mFrameSize = mDevice->frameSizeFromFmt(); + + + const std::array ids{{ SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }}; + const std::array reqs{{ SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE }}; + + SLDataLocator_OutputMix loc_outmix{}; + loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; + loc_outmix.outputMix = mOutputMix; + + SLDataSink audioSnk{}; + audioSnk.pLocator = &loc_outmix; + audioSnk.pFormat = nullptr; + + SLDataLocator_AndroidSimpleBufferQueue loc_bufq{}; + loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; + loc_bufq.numBuffers = mDevice->BufferSize / mDevice->UpdateSize; + + SLDataSource audioSrc{}; +#ifdef SL_ANDROID_DATAFORMAT_PCM_EX + SLAndroidDataFormat_PCM_EX format_pcm_ex{}; + format_pcm_ex.formatType = SL_ANDROID_DATAFORMAT_PCM_EX; + format_pcm_ex.numChannels = mDevice->channelsFromFmt(); + format_pcm_ex.sampleRate = mDevice->Frequency * 1000; + format_pcm_ex.bitsPerSample = mDevice->bytesFromFmt() * 8; + format_pcm_ex.containerSize = format_pcm_ex.bitsPerSample; + format_pcm_ex.channelMask = GetChannelMask(mDevice->FmtChans); + format_pcm_ex.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : SL_BYTEORDER_BIGENDIAN; + format_pcm_ex.representation = GetTypeRepresentation(mDevice->FmtType); + + audioSrc.pLocator = &loc_bufq; + audioSrc.pFormat = &format_pcm_ex; + + result = VCALL(mEngine,CreateAudioPlayer)(&mBufferQueueObj, &audioSrc, &audioSnk, ids.size(), + ids.data(), reqs.data()); + if(SL_RESULT_SUCCESS != result) +#endif + { + /* Alter sample type according to what SLDataFormat_PCM can support. */ + switch(mDevice->FmtType) + { + case DevFmtByte: mDevice->FmtType = DevFmtUByte; break; + case DevFmtUInt: mDevice->FmtType = DevFmtInt; break; + case DevFmtFloat: + case DevFmtUShort: mDevice->FmtType = DevFmtShort; break; + case DevFmtUByte: + case DevFmtShort: + case DevFmtInt: + break; + } + + SLDataFormat_PCM format_pcm{}; + format_pcm.formatType = SL_DATAFORMAT_PCM; + format_pcm.numChannels = mDevice->channelsFromFmt(); + format_pcm.samplesPerSec = mDevice->Frequency * 1000; + format_pcm.bitsPerSample = mDevice->bytesFromFmt() * 8; + format_pcm.containerSize = format_pcm.bitsPerSample; + format_pcm.channelMask = GetChannelMask(mDevice->FmtChans); + format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : + SL_BYTEORDER_BIGENDIAN; + + audioSrc.pLocator = &loc_bufq; + audioSrc.pFormat = &format_pcm; + + result = VCALL(mEngine,CreateAudioPlayer)(&mBufferQueueObj, &audioSrc, &audioSnk, ids.size(), + ids.data(), reqs.data()); + PRINTERR(result, "engine->CreateAudioPlayer"); + } + if(SL_RESULT_SUCCESS == result) + { + /* Set the stream type to "media" (games, music, etc), if possible. */ + SLAndroidConfigurationItf config; + result = VCALL(mBufferQueueObj,GetInterface)(SL_IID_ANDROIDCONFIGURATION, &config); + PRINTERR(result, "bufferQueue->GetInterface SL_IID_ANDROIDCONFIGURATION"); + if(SL_RESULT_SUCCESS == result) + { + SLint32 streamType = SL_ANDROID_STREAM_MEDIA; + result = VCALL(config,SetConfiguration)(SL_ANDROID_KEY_STREAM_TYPE, &streamType, + sizeof(streamType)); + PRINTERR(result, "config->SetConfiguration"); + } + + /* Clear any error since this was optional. */ + result = SL_RESULT_SUCCESS; + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mBufferQueueObj,Realize)(SL_BOOLEAN_FALSE); + PRINTERR(result, "bufferQueue->Realize"); + } + if(SL_RESULT_SUCCESS == result) + { + const ALuint num_updates{mDevice->BufferSize / mDevice->UpdateSize}; + mRing = RingBuffer::Create(num_updates, mFrameSize*mDevice->UpdateSize, true); + } + + if(SL_RESULT_SUCCESS != result) + { + if(mBufferQueueObj) + VCALL0(mBufferQueueObj,Destroy)(); + mBufferQueueObj = nullptr; + + return false; + } + + return true; +} + +bool OpenSLPlayback::start() +{ + mRing->reset(); + + SLAndroidSimpleBufferQueueItf bufferQueue; + SLresult result{VCALL(mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, + &bufferQueue)}; + PRINTERR(result, "bufferQueue->GetInterface"); + if(SL_RESULT_SUCCESS != result) + return false; + + result = VCALL(bufferQueue,RegisterCallback)(&OpenSLPlayback::processC, this); + PRINTERR(result, "bufferQueue->RegisterCallback"); + if(SL_RESULT_SUCCESS != result) return false; + + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread(std::mem_fn(&OpenSLPlayback::mixerProc), this); + return true; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void OpenSLPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + + mSem.post(); + mThread.join(); + + SLPlayItf player; + SLresult result{VCALL(mBufferQueueObj,GetInterface)(SL_IID_PLAY, &player)}; + PRINTERR(result, "bufferQueue->GetInterface"); + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(player,SetPlayState)(SL_PLAYSTATE_STOPPED); + PRINTERR(result, "player->SetPlayState"); + } + + SLAndroidSimpleBufferQueueItf bufferQueue; + result = VCALL(mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bufferQueue); + PRINTERR(result, "bufferQueue->GetInterface"); + if(SL_RESULT_SUCCESS == result) + { + result = VCALL0(bufferQueue,Clear)(); + PRINTERR(result, "bufferQueue->Clear"); + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(bufferQueue,RegisterCallback)(nullptr, nullptr); + PRINTERR(result, "bufferQueue->RegisterCallback"); + } + if(SL_RESULT_SUCCESS == result) + { + SLAndroidSimpleBufferQueueState state; + do { + std::this_thread::yield(); + result = VCALL(bufferQueue,GetState)(&state); + } while(SL_RESULT_SUCCESS == result && state.count > 0); + PRINTERR(result, "bufferQueue->GetState"); + } +} + +ClockLatency OpenSLPlayback::getClockLatency() +{ + ClockLatency ret; + + std::lock_guard _{*this}; + ret.ClockTime = GetDeviceClockTime(mDevice); + ret.Latency = std::chrono::seconds{mRing->readSpace() * mDevice->UpdateSize}; + ret.Latency /= mDevice->Frequency; + + return ret; +} + + +struct OpenSLCapture final : public BackendBase { + OpenSLCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~OpenSLCapture() override; + + void process(SLAndroidSimpleBufferQueueItf bq) noexcept; + static void processC(SLAndroidSimpleBufferQueueItf bq, void *context) noexcept + { static_cast(context)->process(bq); } + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + /* engine interfaces */ + SLObjectItf mEngineObj{nullptr}; + SLEngineItf mEngine; + + /* recording interfaces */ + SLObjectItf mRecordObj{nullptr}; + + RingBufferPtr mRing{nullptr}; + ALCuint mSplOffset{0u}; + + ALuint mFrameSize{0}; + + DEF_NEWDEL(OpenSLCapture) +}; + +OpenSLCapture::~OpenSLCapture() +{ + if(mRecordObj) + VCALL0(mRecordObj,Destroy)(); + mRecordObj = nullptr; + + if(mEngineObj) + VCALL0(mEngineObj,Destroy)(); + mEngineObj = nullptr; + mEngine = nullptr; +} + + +void OpenSLCapture::process(SLAndroidSimpleBufferQueueItf) noexcept +{ + /* A new chunk has been written into the ring buffer, advance it. */ + mRing->writeAdvance(1); +} + + +void OpenSLCapture::open(const ALCchar* name) +{ + if(!name) + name = opensl_device; + else if(strcmp(name, opensl_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + SLresult result{slCreateEngine(&mEngineObj, 0, nullptr, 0, nullptr, nullptr)}; + PRINTERR(result, "slCreateEngine"); + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mEngineObj,Realize)(SL_BOOLEAN_FALSE); + PRINTERR(result, "engine->Realize"); + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mEngineObj,GetInterface)(SL_IID_ENGINE, &mEngine); + PRINTERR(result, "engine->GetInterface"); + } + if(SL_RESULT_SUCCESS == result) + { + mFrameSize = mDevice->frameSizeFromFmt(); + /* Ensure the total length is at least 100ms */ + ALuint length{maxu(mDevice->BufferSize, mDevice->Frequency/10)}; + /* Ensure the per-chunk length is at least 10ms, and no more than 50ms. */ + ALuint update_len{clampu(mDevice->BufferSize/3, mDevice->Frequency/100, + mDevice->Frequency/100*5)}; + ALuint num_updates{(length+update_len-1) / update_len}; + + mRing = RingBuffer::Create(num_updates, update_len*mFrameSize, false); + + mDevice->UpdateSize = update_len; + mDevice->BufferSize = static_cast(mRing->writeSpace() * update_len); + } + if(SL_RESULT_SUCCESS == result) + { + const std::array ids{{ SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }}; + const std::array reqs{{ SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE }}; + + SLDataLocator_IODevice loc_dev{}; + loc_dev.locatorType = SL_DATALOCATOR_IODEVICE; + loc_dev.deviceType = SL_IODEVICE_AUDIOINPUT; + loc_dev.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT; + loc_dev.device = nullptr; + + SLDataSource audioSrc{}; + audioSrc.pLocator = &loc_dev; + audioSrc.pFormat = nullptr; + + SLDataLocator_AndroidSimpleBufferQueue loc_bq{}; + loc_bq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; + loc_bq.numBuffers = mDevice->BufferSize / mDevice->UpdateSize; + + SLDataSink audioSnk{}; +#ifdef SL_ANDROID_DATAFORMAT_PCM_EX + SLAndroidDataFormat_PCM_EX format_pcm_ex{}; + format_pcm_ex.formatType = SL_ANDROID_DATAFORMAT_PCM_EX; + format_pcm_ex.numChannels = mDevice->channelsFromFmt(); + format_pcm_ex.sampleRate = mDevice->Frequency * 1000; + format_pcm_ex.bitsPerSample = mDevice->bytesFromFmt() * 8; + format_pcm_ex.containerSize = format_pcm_ex.bitsPerSample; + format_pcm_ex.channelMask = GetChannelMask(mDevice->FmtChans); + format_pcm_ex.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : + SL_BYTEORDER_BIGENDIAN; + format_pcm_ex.representation = GetTypeRepresentation(mDevice->FmtType); + + audioSnk.pLocator = &loc_bq; + audioSnk.pFormat = &format_pcm_ex; + result = VCALL(mEngine,CreateAudioRecorder)(&mRecordObj, &audioSrc, &audioSnk, + ids.size(), ids.data(), reqs.data()); + if(SL_RESULT_SUCCESS != result) +#endif + { + /* Fallback to SLDataFormat_PCM only if it supports the desired + * sample type. + */ + if(mDevice->FmtType == DevFmtUByte || mDevice->FmtType == DevFmtShort + || mDevice->FmtType == DevFmtInt) + { + SLDataFormat_PCM format_pcm{}; + format_pcm.formatType = SL_DATAFORMAT_PCM; + format_pcm.numChannels = mDevice->channelsFromFmt(); + format_pcm.samplesPerSec = mDevice->Frequency * 1000; + format_pcm.bitsPerSample = mDevice->bytesFromFmt() * 8; + format_pcm.containerSize = format_pcm.bitsPerSample; + format_pcm.channelMask = GetChannelMask(mDevice->FmtChans); + format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN : + SL_BYTEORDER_BIGENDIAN; + + audioSnk.pLocator = &loc_bq; + audioSnk.pFormat = &format_pcm; + result = VCALL(mEngine,CreateAudioRecorder)(&mRecordObj, &audioSrc, &audioSnk, + ids.size(), ids.data(), reqs.data()); + } + PRINTERR(result, "engine->CreateAudioRecorder"); + } + } + if(SL_RESULT_SUCCESS == result) + { + /* Set the record preset to "generic", if possible. */ + SLAndroidConfigurationItf config; + result = VCALL(mRecordObj,GetInterface)(SL_IID_ANDROIDCONFIGURATION, &config); + PRINTERR(result, "recordObj->GetInterface SL_IID_ANDROIDCONFIGURATION"); + if(SL_RESULT_SUCCESS == result) + { + SLuint32 preset = SL_ANDROID_RECORDING_PRESET_GENERIC; + result = VCALL(config,SetConfiguration)(SL_ANDROID_KEY_RECORDING_PRESET, &preset, + sizeof(preset)); + PRINTERR(result, "config->SetConfiguration"); + } + + /* Clear any error since this was optional. */ + result = SL_RESULT_SUCCESS; + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mRecordObj,Realize)(SL_BOOLEAN_FALSE); + PRINTERR(result, "recordObj->Realize"); + } + + SLAndroidSimpleBufferQueueItf bufferQueue; + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bufferQueue); + PRINTERR(result, "recordObj->GetInterface"); + } + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(bufferQueue,RegisterCallback)(&OpenSLCapture::processC, this); + PRINTERR(result, "bufferQueue->RegisterCallback"); + } + if(SL_RESULT_SUCCESS == result) + { + const ALuint chunk_size{mDevice->UpdateSize * mFrameSize}; + + auto data = mRing->getWriteVector(); + for(size_t i{0u};i < data.first.len && SL_RESULT_SUCCESS == result;i++) + { + result = VCALL(bufferQueue,Enqueue)(data.first.buf + chunk_size*i, chunk_size); + PRINTERR(result, "bufferQueue->Enqueue"); + } + for(size_t i{0u};i < data.second.len && SL_RESULT_SUCCESS == result;i++) + { + result = VCALL(bufferQueue,Enqueue)(data.second.buf + chunk_size*i, chunk_size); + PRINTERR(result, "bufferQueue->Enqueue"); + } + } + + if(SL_RESULT_SUCCESS != result) + { + if(mRecordObj) + VCALL0(mRecordObj,Destroy)(); + mRecordObj = nullptr; + + if(mEngineObj) + VCALL0(mEngineObj,Destroy)(); + mEngineObj = nullptr; + mEngine = nullptr; + + throw al::backend_exception{ALC_INVALID_VALUE, + "Failed to initialize OpenSL device: 0x%08x", result}; + } + + mDevice->DeviceName = name; +} + +bool OpenSLCapture::start() +{ + SLRecordItf record; + SLresult result{VCALL(mRecordObj,GetInterface)(SL_IID_RECORD, &record)}; + PRINTERR(result, "recordObj->GetInterface"); + + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(record,SetRecordState)(SL_RECORDSTATE_RECORDING); + PRINTERR(result, "record->SetRecordState"); + } + + if(SL_RESULT_SUCCESS != result) + { + aluHandleDisconnect(mDevice, "Failed to start capture: 0x%08x", result); + return false; + } + + return true; +} + +void OpenSLCapture::stop() +{ + SLRecordItf record; + SLresult result{VCALL(mRecordObj,GetInterface)(SL_IID_RECORD, &record)}; + PRINTERR(result, "recordObj->GetInterface"); + + if(SL_RESULT_SUCCESS == result) + { + result = VCALL(record,SetRecordState)(SL_RECORDSTATE_PAUSED); + PRINTERR(result, "record->SetRecordState"); + } +} + +ALCenum OpenSLCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + SLAndroidSimpleBufferQueueItf bufferQueue{}; + if LIKELY(mDevice->Connected.load(std::memory_order_acquire)) + { + const SLresult result{VCALL(mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, + &bufferQueue)}; + PRINTERR(result, "recordObj->GetInterface"); + if UNLIKELY(SL_RESULT_SUCCESS != result) + { + aluHandleDisconnect(mDevice, "Failed to get capture buffer queue: 0x%08x", result); + bufferQueue = nullptr; + } + } + + const ALuint update_size{mDevice->UpdateSize}; + const ALuint chunk_size{update_size * mFrameSize}; + + /* Read the desired samples from the ring buffer then advance its read + * pointer. + */ + auto data = mRing->getReadVector(); + for(ALCuint i{0};i < samples;) + { + const ALCuint rem{minu(samples - i, update_size - mSplOffset)}; + std::copy_n(data.first.buf + mSplOffset*mFrameSize, rem*mFrameSize, buffer + i*mFrameSize); + + mSplOffset += rem; + if(mSplOffset == update_size) + { + /* Finished a chunk, reset the offset and advance the read pointer. */ + mSplOffset = 0; + mRing->readAdvance(1); + + if LIKELY(bufferQueue) + { + const SLresult result{VCALL(bufferQueue,Enqueue)(data.first.buf, chunk_size)}; + PRINTERR(result, "bufferQueue->Enqueue"); + if UNLIKELY(SL_RESULT_SUCCESS != result) + { + aluHandleDisconnect(mDevice, "Failed to update capture buffer: 0x%08x", + result); + bufferQueue = nullptr; + } + } + + data.first.len--; + if(!data.first.len) + data.first = data.second; + else + data.first.buf += chunk_size; + } + + i += rem; + } + + return ALC_NO_ERROR; +} + +ALCuint OpenSLCapture::availableSamples() +{ return static_cast(mRing->readSpace()*mDevice->UpdateSize - mSplOffset); } + +} // namespace + +bool OSLBackendFactory::init() { return true; } + +bool OSLBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } + +void OSLBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + case DevProbe::Capture: + /* Includes null char. */ + outnames->append(opensl_device, sizeof(opensl_device)); + break; + } +} + +BackendPtr OSLBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new OpenSLPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new OpenSLCapture{device}}; + return nullptr; +} + +BackendFactory &OSLBackendFactory::getFactory() +{ + static OSLBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/opensl.h b/alc/backends/opensl.h new file mode 100644 index 0000000..809aa33 --- /dev/null +++ b/alc/backends/opensl.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_OSL_H +#define BACKENDS_OSL_H + +#include "backends/base.h" + +struct OSLBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_OSL_H */ diff --git a/alc/backends/oss.cpp b/alc/backends/oss.cpp new file mode 100644 index 0000000..74bdbb1 --- /dev/null +++ b/alc/backends/oss.cpp @@ -0,0 +1,713 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/oss.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "alconfig.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alu.h" +#include "logging.h" +#include "ringbuffer.h" +#include "threads.h" +#include "vector.h" + +#include + +/* + * The OSS documentation talks about SOUND_MIXER_READ, but the header + * only contains MIXER_READ. Play safe. Same for WRITE. + */ +#ifndef SOUND_MIXER_READ +#define SOUND_MIXER_READ MIXER_READ +#endif +#ifndef SOUND_MIXER_WRITE +#define SOUND_MIXER_WRITE MIXER_WRITE +#endif + +#if defined(SOUND_VERSION) && (SOUND_VERSION < 0x040000) +#define ALC_OSS_COMPAT +#endif +#ifndef SNDCTL_AUDIOINFO +#define ALC_OSS_COMPAT +#endif + +/* + * FreeBSD strongly discourages the use of specific devices, + * such as those returned in oss_audioinfo.devnode + */ +#ifdef __FreeBSD__ +#define ALC_OSS_DEVNODE_TRUC +#endif + +namespace { + +constexpr char DefaultName[] = "OSS Default"; +std::string DefaultPlayback{"/dev/dsp"}; +std::string DefaultCapture{"/dev/dsp"}; + +struct DevMap { + std::string name; + std::string device_name; +}; + +bool checkName(const al::vector &list, const std::string &name) +{ + return std::find_if(list.cbegin(), list.cend(), + [&name](const DevMap &entry) -> bool + { return entry.name == name; } + ) != list.cend(); +} + +al::vector PlaybackDevices; +al::vector CaptureDevices; + + +#ifdef ALC_OSS_COMPAT + +#define DSP_CAP_OUTPUT 0x00020000 +#define DSP_CAP_INPUT 0x00010000 +void ALCossListPopulate(al::vector *devlist, int type) +{ + devlist->emplace_back(DevMap{DefaultName, (type==DSP_CAP_INPUT) ? DefaultCapture : DefaultPlayback}); +} + +#else + +void ALCossListAppend(al::vector *list, const char *handle, size_t hlen, const char *path, size_t plen) +{ +#ifdef ALC_OSS_DEVNODE_TRUC + for(size_t i{0};i < plen;i++) + { + if(path[i] == '.') + { + if(strncmp(path + i, handle + hlen + i - plen, plen - i) == 0) + hlen = hlen + i - plen; + plen = i; + } + } +#endif + if(handle[0] == '\0') + { + handle = path; + hlen = plen; + } + + std::string basename{handle, hlen}; + basename.erase(std::find(basename.begin(), basename.end(), '\0'), basename.end()); + std::string devname{path, plen}; + devname.erase(std::find(devname.begin(), devname.end(), '\0'), devname.end()); + + auto iter = std::find_if(list->cbegin(), list->cend(), + [&devname](const DevMap &entry) -> bool + { return entry.device_name == devname; } + ); + if(iter != list->cend()) + return; + + int count{1}; + std::string newname{basename}; + while(checkName(PlaybackDevices, newname)) + { + newname = basename; + newname += " #"; + newname += std::to_string(++count); + } + + list->emplace_back(DevMap{std::move(newname), std::move(devname)}); + const DevMap &entry = list->back(); + + TRACE("Got device \"%s\", \"%s\"\n", entry.name.c_str(), entry.device_name.c_str()); +} + +void ALCossListPopulate(al::vector *devlist, int type_flag) +{ + int fd{open("/dev/mixer", O_RDONLY)}; + if(fd < 0) + { + TRACE("Could not open /dev/mixer: %s\n", strerror(errno)); + goto done; + } + + oss_sysinfo si; + if(ioctl(fd, SNDCTL_SYSINFO, &si) == -1) + { + TRACE("SNDCTL_SYSINFO failed: %s\n", strerror(errno)); + goto done; + } + + for(int i{0};i < si.numaudios;i++) + { + oss_audioinfo ai; + ai.dev = i; + if(ioctl(fd, SNDCTL_AUDIOINFO, &ai) == -1) + { + ERR("SNDCTL_AUDIOINFO (%d) failed: %s\n", i, strerror(errno)); + continue; + } + if(!(ai.caps&type_flag) || ai.devnode[0] == '\0') + continue; + + const char *handle; + size_t len; + if(ai.handle[0] != '\0') + { + len = strnlen(ai.handle, sizeof(ai.handle)); + handle = ai.handle; + } + else + { + len = strnlen(ai.name, sizeof(ai.name)); + handle = ai.name; + } + + ALCossListAppend(devlist, handle, len, ai.devnode, + strnlen(ai.devnode, sizeof(ai.devnode))); + } + +done: + if(fd >= 0) + close(fd); + fd = -1; + + const char *defdev{((type_flag==DSP_CAP_INPUT) ? DefaultCapture : DefaultPlayback).c_str()}; + auto iter = std::find_if(devlist->cbegin(), devlist->cend(), + [defdev](const DevMap &entry) -> bool + { return entry.device_name == defdev; } + ); + if(iter == devlist->cend()) + devlist->insert(devlist->begin(), DevMap{DefaultName, defdev}); + else + { + DevMap entry{std::move(*iter)}; + devlist->erase(iter); + devlist->insert(devlist->begin(), std::move(entry)); + } + devlist->shrink_to_fit(); +} + +#endif + +ALCuint log2i(ALCuint x) +{ + ALCuint y{0}; + while(x > 1) + { + x >>= 1; + y++; + } + return y; +} + + +struct OSSPlayback final : public BackendBase { + OSSPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~OSSPlayback() override; + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + int mFd{-1}; + + al::vector mMixData; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(OSSPlayback) +}; + +OSSPlayback::~OSSPlayback() +{ + if(mFd != -1) + close(mFd); + mFd = -1; +} + + +int OSSPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t frame_step{mDevice->channelsFromFmt()}; + const ALuint frame_size{mDevice->frameSizeFromFmt()}; + + std::unique_lock dlock{*this}; + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + pollfd pollitem{}; + pollitem.fd = mFd; + pollitem.events = POLLOUT; + + dlock.unlock(); + int pret{poll(&pollitem, 1, 1000)}; + dlock.lock(); + if(pret < 0) + { + if(errno == EINTR || errno == EAGAIN) + continue; + ERR("poll failed: %s\n", strerror(errno)); + aluHandleDisconnect(mDevice, "Failed waiting for playback buffer: %s", strerror(errno)); + break; + } + else if(pret == 0) + { + WARN("poll timeout\n"); + continue; + } + + ALubyte *write_ptr{mMixData.data()}; + size_t to_write{mMixData.size()}; + aluMixData(mDevice, write_ptr, static_cast(to_write/frame_size), frame_step); + while(to_write > 0 && !mKillNow.load(std::memory_order_acquire)) + { + ssize_t wrote{write(mFd, write_ptr, to_write)}; + if(wrote < 0) + { + if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) + continue; + ERR("write failed: %s\n", strerror(errno)); + aluHandleDisconnect(mDevice, "Failed writing playback samples: %s", + strerror(errno)); + break; + } + + to_write -= static_cast(wrote); + write_ptr += wrote; + } + } + + return 0; +} + + +void OSSPlayback::open(const ALCchar *name) +{ + const char *devname{DefaultPlayback.c_str()}; + if(!name) + name = DefaultName; + else + { + if(PlaybackDevices.empty()) + ALCossListPopulate(&PlaybackDevices, DSP_CAP_OUTPUT); + + auto iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [&name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == PlaybackDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + devname = iter->device_name.c_str(); + } + + mFd = ::open(devname, O_WRONLY); + if(mFd == -1) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not open %s: %s", devname, + strerror(errno)}; + + mDevice->DeviceName = name; +} + +bool OSSPlayback::reset() +{ + int ossFormat{}; + switch(mDevice->FmtType) + { + case DevFmtByte: + ossFormat = AFMT_S8; + break; + case DevFmtUByte: + ossFormat = AFMT_U8; + break; + case DevFmtUShort: + case DevFmtInt: + case DevFmtUInt: + case DevFmtFloat: + mDevice->FmtType = DevFmtShort; + /* fall-through */ + case DevFmtShort: + ossFormat = AFMT_S16_NE; + break; + } + + ALuint periods{mDevice->BufferSize / mDevice->UpdateSize}; + ALuint numChannels{mDevice->channelsFromFmt()}; + ALuint ossSpeed{mDevice->Frequency}; + ALuint frameSize{numChannels * mDevice->bytesFromFmt()}; + /* According to the OSS spec, 16 bytes (log2(16)) is the minimum. */ + ALuint log2FragmentSize{maxu(log2i(mDevice->UpdateSize*frameSize), 4)}; + ALuint numFragmentsLogSize{(periods << 16) | log2FragmentSize}; + + audio_buf_info info{}; + const char *err; +#define CHECKERR(func) if((func) < 0) { \ + err = #func; \ + goto err; \ +} + /* Don't fail if SETFRAGMENT fails. We can handle just about anything + * that's reported back via GETOSPACE */ + ioctl(mFd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize); + CHECKERR(ioctl(mFd, SNDCTL_DSP_SETFMT, &ossFormat)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_CHANNELS, &numChannels)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_SPEED, &ossSpeed)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_GETOSPACE, &info)); + if(0) + { + err: + ERR("%s failed: %s\n", err, strerror(errno)); + return false; + } +#undef CHECKERR + + if(mDevice->channelsFromFmt() != numChannels) + { + ERR("Failed to set %s, got %d channels instead\n", DevFmtChannelsString(mDevice->FmtChans), + numChannels); + return false; + } + + if(!((ossFormat == AFMT_S8 && mDevice->FmtType == DevFmtByte) || + (ossFormat == AFMT_U8 && mDevice->FmtType == DevFmtUByte) || + (ossFormat == AFMT_S16_NE && mDevice->FmtType == DevFmtShort))) + { + ERR("Failed to set %s samples, got OSS format %#x\n", DevFmtTypeString(mDevice->FmtType), + ossFormat); + return false; + } + + mDevice->Frequency = ossSpeed; + mDevice->UpdateSize = static_cast(info.fragsize) / frameSize; + mDevice->BufferSize = static_cast(info.fragments) * mDevice->UpdateSize; + + SetDefaultChannelOrder(mDevice); + + mMixData.resize(mDevice->UpdateSize * mDevice->frameSizeFromFmt()); + + return true; +} + +bool OSSPlayback::start() +{ + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&OSSPlayback::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void OSSPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + if(ioctl(mFd, SNDCTL_DSP_RESET) != 0) + ERR("Error resetting device: %s\n", strerror(errno)); +} + + +struct OSScapture final : public BackendBase { + OSScapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~OSScapture() override; + + int recordProc(); + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + int mFd{-1}; + + RingBufferPtr mRing{nullptr}; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(OSScapture) +}; + +OSScapture::~OSScapture() +{ + if(mFd != -1) + close(mFd); + mFd = -1; +} + + +int OSScapture::recordProc() +{ + SetRTPriority(); + althrd_setname(RECORD_THREAD_NAME); + + const ALuint frame_size{mDevice->frameSizeFromFmt()}; + while(!mKillNow.load(std::memory_order_acquire)) + { + pollfd pollitem{}; + pollitem.fd = mFd; + pollitem.events = POLLIN; + + int sret{poll(&pollitem, 1, 1000)}; + if(sret < 0) + { + if(errno == EINTR || errno == EAGAIN) + continue; + ERR("poll failed: %s\n", strerror(errno)); + aluHandleDisconnect(mDevice, "Failed to check capture samples: %s", strerror(errno)); + break; + } + else if(sret == 0) + { + WARN("poll timeout\n"); + continue; + } + + auto vec = mRing->getWriteVector(); + if(vec.first.len > 0) + { + ssize_t amt{read(mFd, vec.first.buf, vec.first.len*frame_size)}; + if(amt < 0) + { + ERR("read failed: %s\n", strerror(errno)); + aluHandleDisconnect(mDevice, "Failed reading capture samples: %s", + strerror(errno)); + break; + } + mRing->writeAdvance(static_cast(amt)/frame_size); + } + } + + return 0; +} + + +void OSScapture::open(const ALCchar *name) +{ + const char *devname{DefaultCapture.c_str()}; + if(!name) + name = DefaultName; + else + { + if(CaptureDevices.empty()) + ALCossListPopulate(&CaptureDevices, DSP_CAP_INPUT); + + auto iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [&name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == CaptureDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + devname = iter->device_name.c_str(); + } + + mFd = ::open(devname, O_RDONLY); + if(mFd == -1) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not open %s: %s", devname, + strerror(errno)}; + + int ossFormat{}; + switch(mDevice->FmtType) + { + case DevFmtByte: + ossFormat = AFMT_S8; + break; + case DevFmtUByte: + ossFormat = AFMT_U8; + break; + case DevFmtShort: + ossFormat = AFMT_S16_NE; + break; + case DevFmtUShort: + case DevFmtInt: + case DevFmtUInt: + case DevFmtFloat: + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture samples not supported", + DevFmtTypeString(mDevice->FmtType)}; + } + + ALuint periods{4}; + ALuint numChannels{mDevice->channelsFromFmt()}; + ALuint frameSize{numChannels * mDevice->bytesFromFmt()}; + ALuint ossSpeed{mDevice->Frequency}; + /* according to the OSS spec, 16 bytes are the minimum */ + ALuint log2FragmentSize{maxu(log2i(mDevice->BufferSize * frameSize / periods), 4)}; + ALuint numFragmentsLogSize{(periods << 16) | log2FragmentSize}; + + audio_buf_info info{}; +#define CHECKERR(func) if((func) < 0) { \ + throw al::backend_exception{ALC_INVALID_VALUE, #func " failed: %s", strerror(errno)}; \ +} + CHECKERR(ioctl(mFd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_SETFMT, &ossFormat)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_CHANNELS, &numChannels)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_SPEED, &ossSpeed)); + CHECKERR(ioctl(mFd, SNDCTL_DSP_GETISPACE, &info)); +#undef CHECKERR + + if(mDevice->channelsFromFmt() != numChannels) + throw al::backend_exception{ALC_INVALID_VALUE, + "Failed to set %s, got %d channels instead", DevFmtChannelsString(mDevice->FmtChans), + numChannels}; + + if(!((ossFormat == AFMT_S8 && mDevice->FmtType == DevFmtByte) + || (ossFormat == AFMT_U8 && mDevice->FmtType == DevFmtUByte) + || (ossFormat == AFMT_S16_NE && mDevice->FmtType == DevFmtShort))) + throw al::backend_exception{ALC_INVALID_VALUE, + "Failed to set %s samples, got OSS format %#x", DevFmtTypeString(mDevice->FmtType), + ossFormat}; + + mRing = RingBuffer::Create(mDevice->BufferSize, frameSize, false); + + mDevice->DeviceName = name; +} + +bool OSScapture::start() +{ + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&OSScapture::recordProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create record thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void OSScapture::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + if(ioctl(mFd, SNDCTL_DSP_RESET) != 0) + ERR("Error resetting device: %s\n", strerror(errno)); +} + +ALCenum OSScapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + mRing->read(buffer, samples); + return ALC_NO_ERROR; +} + +ALCuint OSScapture::availableSamples() +{ return static_cast(mRing->readSpace()); } + +} // namespace + + +BackendFactory &OSSBackendFactory::getFactory() +{ + static OSSBackendFactory factory{}; + return factory; +} + +bool OSSBackendFactory::init() +{ + if(auto devopt = ConfigValueStr(nullptr, "oss", "device")) + DefaultPlayback = std::move(*devopt); + if(auto capopt = ConfigValueStr(nullptr, "oss", "capture")) + DefaultCapture = std::move(*capopt); + + return true; +} + +bool OSSBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } + +void OSSBackendFactory::probe(DevProbe type, std::string *outnames) +{ + auto add_device = [outnames](const DevMap &entry) -> void + { +#ifdef HAVE_STAT + struct stat buf; + if(stat(entry.device_name.c_str(), &buf) == 0) +#endif + { + /* Includes null char. */ + outnames->append(entry.name.c_str(), entry.name.length()+1); + } + }; + + switch(type) + { + case DevProbe::Playback: + PlaybackDevices.clear(); + ALCossListPopulate(&PlaybackDevices, DSP_CAP_OUTPUT); + std::for_each(PlaybackDevices.cbegin(), PlaybackDevices.cend(), add_device); + break; + + case DevProbe::Capture: + CaptureDevices.clear(); + ALCossListPopulate(&CaptureDevices, DSP_CAP_INPUT); + std::for_each(CaptureDevices.cbegin(), CaptureDevices.cend(), add_device); + break; + } +} + +BackendPtr OSSBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new OSSPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new OSScapture{device}}; + return nullptr; +} diff --git a/alc/backends/oss.h b/alc/backends/oss.h new file mode 100644 index 0000000..9e63d7b --- /dev/null +++ b/alc/backends/oss.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_OSS_H +#define BACKENDS_OSS_H + +#include "backends/base.h" + +struct OSSBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_OSS_H */ diff --git a/alc/backends/portaudio.cpp b/alc/backends/portaudio.cpp new file mode 100644 index 0000000..0f5d6d6 --- /dev/null +++ b/alc/backends/portaudio.cpp @@ -0,0 +1,448 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/portaudio.h" + +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "alconfig.h" +#include "dynload.h" +#include "ringbuffer.h" + +#include + + +namespace { + +constexpr ALCchar pa_device[] = "PortAudio Default"; + + +#ifdef HAVE_DYNLOAD +void *pa_handle; +#define MAKE_FUNC(x) decltype(x) * p##x +MAKE_FUNC(Pa_Initialize); +MAKE_FUNC(Pa_Terminate); +MAKE_FUNC(Pa_GetErrorText); +MAKE_FUNC(Pa_StartStream); +MAKE_FUNC(Pa_StopStream); +MAKE_FUNC(Pa_OpenStream); +MAKE_FUNC(Pa_CloseStream); +MAKE_FUNC(Pa_GetDefaultOutputDevice); +MAKE_FUNC(Pa_GetDefaultInputDevice); +MAKE_FUNC(Pa_GetStreamInfo); +#undef MAKE_FUNC + +#ifndef IN_IDE_PARSER +#define Pa_Initialize pPa_Initialize +#define Pa_Terminate pPa_Terminate +#define Pa_GetErrorText pPa_GetErrorText +#define Pa_StartStream pPa_StartStream +#define Pa_StopStream pPa_StopStream +#define Pa_OpenStream pPa_OpenStream +#define Pa_CloseStream pPa_CloseStream +#define Pa_GetDefaultOutputDevice pPa_GetDefaultOutputDevice +#define Pa_GetDefaultInputDevice pPa_GetDefaultInputDevice +#define Pa_GetStreamInfo pPa_GetStreamInfo +#endif +#endif + + +struct PortPlayback final : public BackendBase { + PortPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~PortPlayback() override; + + int writeCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *timeInfo, const PaStreamCallbackFlags statusFlags) noexcept; + static int writeCallbackC(const void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, + const PaStreamCallbackFlags statusFlags, void *userData) noexcept + { + return static_cast(userData)->writeCallback(inputBuffer, outputBuffer, + framesPerBuffer, timeInfo, statusFlags); + } + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + PaStream *mStream{nullptr}; + PaStreamParameters mParams{}; + ALuint mUpdateSize{0u}; + + DEF_NEWDEL(PortPlayback) +}; + +PortPlayback::~PortPlayback() +{ + PaError err{mStream ? Pa_CloseStream(mStream) : paNoError}; + if(err != paNoError) + ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); + mStream = nullptr; +} + + +int PortPlayback::writeCallback(const void*, void *outputBuffer, unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo*, const PaStreamCallbackFlags) noexcept +{ + std::lock_guard _{*this}; + aluMixData(mDevice, outputBuffer, static_cast(framesPerBuffer), + mDevice->channelsFromFmt()); + return 0; +} + + +void PortPlayback::open(const ALCchar *name) +{ + if(!name) + name = pa_device; + else if(strcmp(name, pa_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + mUpdateSize = mDevice->UpdateSize; + + auto devidopt = ConfigValueInt(nullptr, "port", "device"); + if(devidopt && *devidopt >= 0) mParams.device = *devidopt; + else mParams.device = Pa_GetDefaultOutputDevice(); + mParams.suggestedLatency = mDevice->BufferSize / static_cast(mDevice->Frequency); + mParams.hostApiSpecificStreamInfo = nullptr; + + mParams.channelCount = ((mDevice->FmtChans == DevFmtMono) ? 1 : 2); + + switch(mDevice->FmtType) + { + case DevFmtByte: + mParams.sampleFormat = paInt8; + break; + case DevFmtUByte: + mParams.sampleFormat = paUInt8; + break; + case DevFmtUShort: + /* fall-through */ + case DevFmtShort: + mParams.sampleFormat = paInt16; + break; + case DevFmtUInt: + /* fall-through */ + case DevFmtInt: + mParams.sampleFormat = paInt32; + break; + case DevFmtFloat: + mParams.sampleFormat = paFloat32; + break; + } + +retry_open: + PaError err{Pa_OpenStream(&mStream, nullptr, &mParams, mDevice->Frequency, mDevice->UpdateSize, + paNoFlag, &PortPlayback::writeCallbackC, this)}; + if(err != paNoError) + { + if(mParams.sampleFormat == paFloat32) + { + mParams.sampleFormat = paInt16; + goto retry_open; + } + throw al::backend_exception{ALC_INVALID_VALUE, "Failed to open stream: %s", + Pa_GetErrorText(err)}; + } + + mDevice->DeviceName = name; +} + +bool PortPlayback::reset() +{ + const PaStreamInfo *streamInfo{Pa_GetStreamInfo(mStream)}; + mDevice->Frequency = static_cast(streamInfo->sampleRate); + mDevice->UpdateSize = mUpdateSize; + + if(mParams.sampleFormat == paInt8) + mDevice->FmtType = DevFmtByte; + else if(mParams.sampleFormat == paUInt8) + mDevice->FmtType = DevFmtUByte; + else if(mParams.sampleFormat == paInt16) + mDevice->FmtType = DevFmtShort; + else if(mParams.sampleFormat == paInt32) + mDevice->FmtType = DevFmtInt; + else if(mParams.sampleFormat == paFloat32) + mDevice->FmtType = DevFmtFloat; + else + { + ERR("Unexpected sample format: 0x%lx\n", mParams.sampleFormat); + return false; + } + + if(mParams.channelCount == 2) + mDevice->FmtChans = DevFmtStereo; + else if(mParams.channelCount == 1) + mDevice->FmtChans = DevFmtMono; + else + { + ERR("Unexpected channel count: %u\n", mParams.channelCount); + return false; + } + SetDefaultChannelOrder(mDevice); + + return true; +} + +bool PortPlayback::start() +{ + PaError err{Pa_StartStream(mStream)}; + if(err != paNoError) + { + ERR("Pa_StartStream() returned an error: %s\n", Pa_GetErrorText(err)); + return false; + } + return true; +} + +void PortPlayback::stop() +{ + PaError err{Pa_StopStream(mStream)}; + if(err != paNoError) + ERR("Error stopping stream: %s\n", Pa_GetErrorText(err)); +} + + +struct PortCapture final : public BackendBase { + PortCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~PortCapture() override; + + int readCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *timeInfo, const PaStreamCallbackFlags statusFlags) noexcept; + static int readCallbackC(const void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, + const PaStreamCallbackFlags statusFlags, void *userData) noexcept + { + return static_cast(userData)->readCallback(inputBuffer, outputBuffer, + framesPerBuffer, timeInfo, statusFlags); + } + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + PaStream *mStream{nullptr}; + PaStreamParameters mParams; + + RingBufferPtr mRing{nullptr}; + + DEF_NEWDEL(PortCapture) +}; + +PortCapture::~PortCapture() +{ + PaError err{mStream ? Pa_CloseStream(mStream) : paNoError}; + if(err != paNoError) + ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); + mStream = nullptr; +} + + +int PortCapture::readCallback(const void *inputBuffer, void*, unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo*, const PaStreamCallbackFlags) noexcept +{ + mRing->write(inputBuffer, framesPerBuffer); + return 0; +} + + +void PortCapture::open(const ALCchar *name) +{ + if(!name) + name = pa_device; + else if(strcmp(name, pa_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + ALuint samples{mDevice->BufferSize}; + samples = maxu(samples, 100 * mDevice->Frequency / 1000); + ALuint frame_size{mDevice->frameSizeFromFmt()}; + + mRing = RingBuffer::Create(samples, frame_size, false); + + auto devidopt = ConfigValueInt(nullptr, "port", "capture"); + if(devidopt && *devidopt >= 0) mParams.device = *devidopt; + else mParams.device = Pa_GetDefaultOutputDevice(); + mParams.suggestedLatency = 0.0f; + mParams.hostApiSpecificStreamInfo = nullptr; + + switch(mDevice->FmtType) + { + case DevFmtByte: + mParams.sampleFormat = paInt8; + break; + case DevFmtUByte: + mParams.sampleFormat = paUInt8; + break; + case DevFmtShort: + mParams.sampleFormat = paInt16; + break; + case DevFmtInt: + mParams.sampleFormat = paInt32; + break; + case DevFmtFloat: + mParams.sampleFormat = paFloat32; + break; + case DevFmtUInt: + case DevFmtUShort: + throw al::backend_exception{ALC_INVALID_VALUE, "%s samples not supported", + DevFmtTypeString(mDevice->FmtType)}; + } + mParams.channelCount = static_cast(mDevice->channelsFromFmt()); + + PaError err{Pa_OpenStream(&mStream, &mParams, nullptr, mDevice->Frequency, + paFramesPerBufferUnspecified, paNoFlag, &PortCapture::readCallbackC, this)}; + if(err != paNoError) + throw al::backend_exception{ALC_INVALID_VALUE, "Failed to open stream: %s", + Pa_GetErrorText(err)}; + + mDevice->DeviceName = name; +} + + +bool PortCapture::start() +{ + PaError err{Pa_StartStream(mStream)}; + if(err != paNoError) + { + ERR("Error starting stream: %s\n", Pa_GetErrorText(err)); + return false; + } + return true; +} + +void PortCapture::stop() +{ + PaError err{Pa_StopStream(mStream)}; + if(err != paNoError) + ERR("Error stopping stream: %s\n", Pa_GetErrorText(err)); +} + + +ALCuint PortCapture::availableSamples() +{ return static_cast(mRing->readSpace()); } + +ALCenum PortCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + mRing->read(buffer, samples); + return ALC_NO_ERROR; +} + +} // namespace + + +bool PortBackendFactory::init() +{ + PaError err; + +#ifdef HAVE_DYNLOAD + if(!pa_handle) + { +#ifdef _WIN32 +# define PALIB "portaudio.dll" +#elif defined(__APPLE__) && defined(__MACH__) +# define PALIB "libportaudio.2.dylib" +#elif defined(__OpenBSD__) +# define PALIB "libportaudio.so" +#else +# define PALIB "libportaudio.so.2" +#endif + + pa_handle = LoadLib(PALIB); + if(!pa_handle) + return false; + +#define LOAD_FUNC(f) do { \ + p##f = reinterpret_cast(GetSymbol(pa_handle, #f)); \ + if(p##f == nullptr) \ + { \ + CloseLib(pa_handle); \ + pa_handle = nullptr; \ + return false; \ + } \ +} while(0) + LOAD_FUNC(Pa_Initialize); + LOAD_FUNC(Pa_Terminate); + LOAD_FUNC(Pa_GetErrorText); + LOAD_FUNC(Pa_StartStream); + LOAD_FUNC(Pa_StopStream); + LOAD_FUNC(Pa_OpenStream); + LOAD_FUNC(Pa_CloseStream); + LOAD_FUNC(Pa_GetDefaultOutputDevice); + LOAD_FUNC(Pa_GetDefaultInputDevice); + LOAD_FUNC(Pa_GetStreamInfo); +#undef LOAD_FUNC + + if((err=Pa_Initialize()) != paNoError) + { + ERR("Pa_Initialize() returned an error: %s\n", Pa_GetErrorText(err)); + CloseLib(pa_handle); + pa_handle = nullptr; + return false; + } + } +#else + if((err=Pa_Initialize()) != paNoError) + { + ERR("Pa_Initialize() returned an error: %s\n", Pa_GetErrorText(err)); + return false; + } +#endif + return true; +} + +bool PortBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } + +void PortBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + case DevProbe::Capture: + /* Includes null char. */ + outnames->append(pa_device, sizeof(pa_device)); + break; + } +} + +BackendPtr PortBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new PortPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new PortCapture{device}}; + return nullptr; +} + +BackendFactory &PortBackendFactory::getFactory() +{ + static PortBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/portaudio.h b/alc/backends/portaudio.h new file mode 100644 index 0000000..082e902 --- /dev/null +++ b/alc/backends/portaudio.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_PORTAUDIO_H +#define BACKENDS_PORTAUDIO_H + +#include "backends/base.h" + +struct PortBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_PORTAUDIO_H */ diff --git a/alc/backends/pulseaudio.cpp b/alc/backends/pulseaudio.cpp new file mode 100644 index 0000000..be4e742 --- /dev/null +++ b/alc/backends/pulseaudio.cpp @@ -0,0 +1,1507 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2009 by Konstantinos Natsakis + * Copyright (C) 2010 by Chris Robinson + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/pulseaudio.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alcmain.h" +#include "alu.h" +#include "alconfig.h" +#include "alexcpt.h" +#include "compat.h" +#include "dynload.h" +#include "strutils.h" + +#include + + +namespace { + +#ifdef HAVE_DYNLOAD +#define PULSE_FUNCS(MAGIC) \ + MAGIC(pa_mainloop_new); \ + MAGIC(pa_mainloop_free); \ + MAGIC(pa_mainloop_set_poll_func); \ + MAGIC(pa_mainloop_run); \ + MAGIC(pa_mainloop_quit); \ + MAGIC(pa_mainloop_get_api); \ + MAGIC(pa_context_new); \ + MAGIC(pa_context_unref); \ + MAGIC(pa_context_get_state); \ + MAGIC(pa_context_disconnect); \ + MAGIC(pa_context_set_state_callback); \ + MAGIC(pa_context_errno); \ + MAGIC(pa_context_connect); \ + MAGIC(pa_context_get_server_info); \ + MAGIC(pa_context_get_sink_info_by_name); \ + MAGIC(pa_context_get_sink_info_list); \ + MAGIC(pa_context_get_source_info_by_name); \ + MAGIC(pa_context_get_source_info_list); \ + MAGIC(pa_stream_new); \ + MAGIC(pa_stream_unref); \ + MAGIC(pa_stream_drop); \ + MAGIC(pa_stream_get_state); \ + MAGIC(pa_stream_peek); \ + MAGIC(pa_stream_write); \ + MAGIC(pa_stream_connect_record); \ + MAGIC(pa_stream_connect_playback); \ + MAGIC(pa_stream_readable_size); \ + MAGIC(pa_stream_writable_size); \ + MAGIC(pa_stream_is_corked); \ + MAGIC(pa_stream_cork); \ + MAGIC(pa_stream_is_suspended); \ + MAGIC(pa_stream_get_device_name); \ + MAGIC(pa_stream_get_latency); \ + MAGIC(pa_stream_set_write_callback); \ + MAGIC(pa_stream_set_buffer_attr); \ + MAGIC(pa_stream_get_buffer_attr); \ + MAGIC(pa_stream_get_sample_spec); \ + MAGIC(pa_stream_get_time); \ + MAGIC(pa_stream_set_read_callback); \ + MAGIC(pa_stream_set_state_callback); \ + MAGIC(pa_stream_set_moved_callback); \ + MAGIC(pa_stream_set_underflow_callback); \ + MAGIC(pa_stream_new_with_proplist); \ + MAGIC(pa_stream_disconnect); \ + MAGIC(pa_stream_set_buffer_attr_callback); \ + MAGIC(pa_stream_begin_write); \ + MAGIC(pa_channel_map_init_auto); \ + MAGIC(pa_channel_map_parse); \ + MAGIC(pa_channel_map_snprint); \ + MAGIC(pa_channel_map_equal); \ + MAGIC(pa_channel_map_superset); \ + MAGIC(pa_operation_get_state); \ + MAGIC(pa_operation_unref); \ + MAGIC(pa_sample_spec_valid); \ + MAGIC(pa_frame_size); \ + MAGIC(pa_strerror); \ + MAGIC(pa_path_get_filename); \ + MAGIC(pa_get_binary_name); \ + MAGIC(pa_xmalloc); \ + MAGIC(pa_xfree); + +void *pulse_handle; +#define MAKE_FUNC(x) decltype(x) * p##x +PULSE_FUNCS(MAKE_FUNC) +#undef MAKE_FUNC + +#ifndef IN_IDE_PARSER +#define pa_mainloop_new ppa_mainloop_new +#define pa_mainloop_free ppa_mainloop_free +#define pa_mainloop_set_poll_func ppa_mainloop_set_poll_func +#define pa_mainloop_run ppa_mainloop_run +#define pa_mainloop_quit ppa_mainloop_quit +#define pa_mainloop_get_api ppa_mainloop_get_api +#define pa_context_new ppa_context_new +#define pa_context_unref ppa_context_unref +#define pa_context_get_state ppa_context_get_state +#define pa_context_disconnect ppa_context_disconnect +#define pa_context_set_state_callback ppa_context_set_state_callback +#define pa_context_errno ppa_context_errno +#define pa_context_connect ppa_context_connect +#define pa_context_get_server_info ppa_context_get_server_info +#define pa_context_get_sink_info_by_name ppa_context_get_sink_info_by_name +#define pa_context_get_sink_info_list ppa_context_get_sink_info_list +#define pa_context_get_source_info_by_name ppa_context_get_source_info_by_name +#define pa_context_get_source_info_list ppa_context_get_source_info_list +#define pa_stream_new ppa_stream_new +#define pa_stream_unref ppa_stream_unref +#define pa_stream_disconnect ppa_stream_disconnect +#define pa_stream_drop ppa_stream_drop +#define pa_stream_set_write_callback ppa_stream_set_write_callback +#define pa_stream_set_buffer_attr ppa_stream_set_buffer_attr +#define pa_stream_get_buffer_attr ppa_stream_get_buffer_attr +#define pa_stream_get_sample_spec ppa_stream_get_sample_spec +#define pa_stream_get_time ppa_stream_get_time +#define pa_stream_set_read_callback ppa_stream_set_read_callback +#define pa_stream_set_state_callback ppa_stream_set_state_callback +#define pa_stream_set_moved_callback ppa_stream_set_moved_callback +#define pa_stream_set_underflow_callback ppa_stream_set_underflow_callback +#define pa_stream_connect_record ppa_stream_connect_record +#define pa_stream_connect_playback ppa_stream_connect_playback +#define pa_stream_readable_size ppa_stream_readable_size +#define pa_stream_writable_size ppa_stream_writable_size +#define pa_stream_is_corked ppa_stream_is_corked +#define pa_stream_cork ppa_stream_cork +#define pa_stream_is_suspended ppa_stream_is_suspended +#define pa_stream_get_device_name ppa_stream_get_device_name +#define pa_stream_get_latency ppa_stream_get_latency +#define pa_stream_set_buffer_attr_callback ppa_stream_set_buffer_attr_callback +#define pa_stream_begin_write ppa_stream_begin_write*/ +#define pa_channel_map_init_auto ppa_channel_map_init_auto +#define pa_channel_map_parse ppa_channel_map_parse +#define pa_channel_map_snprint ppa_channel_map_snprint +#define pa_channel_map_equal ppa_channel_map_equal +#define pa_channel_map_superset ppa_channel_map_superset +#define pa_operation_get_state ppa_operation_get_state +#define pa_operation_unref ppa_operation_unref +#define pa_sample_spec_valid ppa_sample_spec_valid +#define pa_frame_size ppa_frame_size +#define pa_strerror ppa_strerror +#define pa_stream_get_state ppa_stream_get_state +#define pa_stream_peek ppa_stream_peek +#define pa_stream_write ppa_stream_write +#define pa_xfree ppa_xfree +#define pa_path_get_filename ppa_path_get_filename +#define pa_get_binary_name ppa_get_binary_name +#define pa_xmalloc ppa_xmalloc +#endif /* IN_IDE_PARSER */ + +#endif + + +constexpr pa_channel_map MonoChanMap{ + 1, {PA_CHANNEL_POSITION_MONO} +}, StereoChanMap{ + 2, {PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT} +}, QuadChanMap{ + 4, { + PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, + PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT + } +}, X51ChanMap{ + 6, { + PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, + PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, + PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT + } +}, X51RearChanMap{ + 6, { + PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, + PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, + PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT + } +}, X61ChanMap{ + 7, { + PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, + PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, + PA_CHANNEL_POSITION_REAR_CENTER, + PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT + } +}, X71ChanMap{ + 8, { + PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, + PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE, + PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, + PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT + } +}; + +size_t ChannelFromPulse(pa_channel_position_t chan) +{ + switch(chan) + { + case PA_CHANNEL_POSITION_INVALID: break; + case PA_CHANNEL_POSITION_MONO: return FrontCenter; + case PA_CHANNEL_POSITION_FRONT_LEFT: return FrontLeft; + case PA_CHANNEL_POSITION_FRONT_RIGHT: return FrontRight; + case PA_CHANNEL_POSITION_FRONT_CENTER: return FrontCenter; + case PA_CHANNEL_POSITION_REAR_CENTER: return BackCenter; + case PA_CHANNEL_POSITION_REAR_LEFT: return BackLeft; + case PA_CHANNEL_POSITION_REAR_RIGHT: return BackRight; + case PA_CHANNEL_POSITION_LFE: return LFE; + case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: break; + case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: break; + case PA_CHANNEL_POSITION_SIDE_LEFT: return SideLeft; + case PA_CHANNEL_POSITION_SIDE_RIGHT: return SideRight; + case PA_CHANNEL_POSITION_AUX0: return Aux0; + case PA_CHANNEL_POSITION_AUX1: return Aux1; + case PA_CHANNEL_POSITION_AUX2: return Aux2; + case PA_CHANNEL_POSITION_AUX3: return Aux3; + case PA_CHANNEL_POSITION_AUX4: return Aux4; + case PA_CHANNEL_POSITION_AUX5: return Aux5; + case PA_CHANNEL_POSITION_AUX6: return Aux6; + case PA_CHANNEL_POSITION_AUX7: return Aux7; + case PA_CHANNEL_POSITION_AUX8: return Aux8; + case PA_CHANNEL_POSITION_AUX9: return Aux9; + case PA_CHANNEL_POSITION_AUX10: return Aux10; + case PA_CHANNEL_POSITION_AUX11: return Aux11; + case PA_CHANNEL_POSITION_AUX12: return Aux12; + case PA_CHANNEL_POSITION_AUX13: return Aux13; + case PA_CHANNEL_POSITION_AUX14: return Aux14; + case PA_CHANNEL_POSITION_AUX15: return Aux15; + case PA_CHANNEL_POSITION_AUX16: break; + case PA_CHANNEL_POSITION_AUX17: break; + case PA_CHANNEL_POSITION_AUX18: break; + case PA_CHANNEL_POSITION_AUX19: break; + case PA_CHANNEL_POSITION_AUX20: break; + case PA_CHANNEL_POSITION_AUX21: break; + case PA_CHANNEL_POSITION_AUX22: break; + case PA_CHANNEL_POSITION_AUX23: break; + case PA_CHANNEL_POSITION_AUX24: break; + case PA_CHANNEL_POSITION_AUX25: break; + case PA_CHANNEL_POSITION_AUX26: break; + case PA_CHANNEL_POSITION_AUX27: break; + case PA_CHANNEL_POSITION_AUX28: break; + case PA_CHANNEL_POSITION_AUX29: break; + case PA_CHANNEL_POSITION_AUX30: break; + case PA_CHANNEL_POSITION_AUX31: break; + case PA_CHANNEL_POSITION_TOP_CENTER: break; + case PA_CHANNEL_POSITION_TOP_FRONT_LEFT: return UpperFrontLeft; + case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT: return UpperFrontRight; + case PA_CHANNEL_POSITION_TOP_FRONT_CENTER: break; + case PA_CHANNEL_POSITION_TOP_REAR_LEFT: return UpperBackLeft; + case PA_CHANNEL_POSITION_TOP_REAR_RIGHT: return UpperBackRight; + case PA_CHANNEL_POSITION_TOP_REAR_CENTER: break; + case PA_CHANNEL_POSITION_MAX: break; + } + throw al::backend_exception{ALC_INVALID_VALUE, "Unexpected channel enum %d", chan}; +} + +void SetChannelOrderFromMap(ALCdevice *device, const pa_channel_map &chanmap) +{ + device->RealOut.ChannelIndex.fill(INVALID_CHANNEL_INDEX); + for(ALuint i{0};i < chanmap.channels;++i) + device->RealOut.ChannelIndex[ChannelFromPulse(chanmap.map[i])] = i; +} + + +/* *grumble* Don't use enums for bitflags. */ +constexpr inline pa_stream_flags_t operator|(pa_stream_flags_t lhs, pa_stream_flags_t rhs) +{ return pa_stream_flags_t(int(lhs) | int(rhs)); } +inline pa_stream_flags_t& operator|=(pa_stream_flags_t &lhs, pa_stream_flags_t rhs) +{ + lhs = lhs | rhs; + return lhs; +} +inline pa_stream_flags_t& operator&=(pa_stream_flags_t &lhs, int rhs) +{ + lhs = pa_stream_flags_t(int(lhs) & rhs); + return lhs; +} + +inline pa_context_flags_t& operator|=(pa_context_flags_t &lhs, pa_context_flags_t rhs) +{ + lhs = pa_context_flags_t(int(lhs) | int(rhs)); + return lhs; +} + + +/* Global flags and properties */ +pa_context_flags_t pulse_ctx_flags; + +int pulse_poll_func(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata) noexcept +{ + auto plock = static_cast*>(userdata); + plock->unlock(); + int r{poll(ufds, nfds, timeout)}; + plock->lock(); + return r; +} + +class PulseMainloop { + std::thread mThread; + std::mutex mMutex; + std::condition_variable mCondVar; + pa_mainloop *mMainloop{nullptr}; + +public: + ~PulseMainloop() + { + if(mThread.joinable()) + { + pa_mainloop_quit(mMainloop, 0); + mThread.join(); + } + } + + int mainloop_thread() + { + SetRTPriority(); + + std::unique_lock plock{mMutex}; + mMainloop = pa_mainloop_new(); + + pa_mainloop_set_poll_func(mMainloop, pulse_poll_func, &plock); + mCondVar.notify_all(); + + int ret{}; + pa_mainloop_run(mMainloop, &ret); + + pa_mainloop_free(mMainloop); + mMainloop = nullptr; + + return ret; + } + + void doLock() { mMutex.lock(); } + void doUnlock() { mMutex.unlock(); } + std::unique_lock getLock() { return std::unique_lock{mMutex}; } + std::condition_variable &getCondVar() noexcept { return mCondVar; } + + void contextStateCallback(pa_context *context) noexcept + { + pa_context_state_t state{pa_context_get_state(context)}; + if(state == PA_CONTEXT_READY || !PA_CONTEXT_IS_GOOD(state)) + mCondVar.notify_all(); + } + static void contextStateCallbackC(pa_context *context, void *pdata) noexcept + { static_cast(pdata)->contextStateCallback(context); } + + void streamStateCallback(pa_stream *stream) noexcept + { + pa_stream_state_t state{pa_stream_get_state(stream)}; + if(state == PA_STREAM_READY || !PA_STREAM_IS_GOOD(state)) + mCondVar.notify_all(); + } + static void streamStateCallbackC(pa_stream *stream, void *pdata) noexcept + { static_cast(pdata)->streamStateCallback(stream); } + + void streamSuccessCallback(pa_stream*, int) noexcept + { mCondVar.notify_all(); } + static void streamSuccessCallbackC(pa_stream *stream, int success, void *pdata) noexcept + { static_cast(pdata)->streamSuccessCallback(stream, success); } + + void waitForOperation(pa_operation *op, std::unique_lock &plock) + { + if(op) + { + while(pa_operation_get_state(op) == PA_OPERATION_RUNNING) + mCondVar.wait(plock); + pa_operation_unref(op); + } + } + + pa_context *connectContext(std::unique_lock &plock); + + pa_stream *connectStream(const char *device_name, std::unique_lock &plock, + pa_context *context, pa_stream_flags_t flags, pa_buffer_attr *attr, pa_sample_spec *spec, + pa_channel_map *chanmap, BackendType type); + + void close(pa_context *context, pa_stream *stream); +}; + + +pa_context *PulseMainloop::connectContext(std::unique_lock &plock) +{ + const char *name{"OpenAL Soft"}; + + const PathNamePair &binname = GetProcBinary(); + if(!binname.fname.empty()) + name = binname.fname.c_str(); + + if(!mMainloop) + { + mThread = std::thread{std::mem_fn(&PulseMainloop::mainloop_thread), this}; + while(!mMainloop) mCondVar.wait(plock); + } + + pa_context *context{pa_context_new(pa_mainloop_get_api(mMainloop), name)}; + if(!context) throw al::backend_exception{ALC_OUT_OF_MEMORY, "pa_context_new() failed"}; + + pa_context_set_state_callback(context, &contextStateCallbackC, this); + + int err; + if((err=pa_context_connect(context, nullptr, pulse_ctx_flags, nullptr)) >= 0) + { + pa_context_state_t state; + while((state=pa_context_get_state(context)) != PA_CONTEXT_READY) + { + if(!PA_CONTEXT_IS_GOOD(state)) + { + err = pa_context_errno(context); + if(err > 0) err = -err; + break; + } + + mCondVar.wait(plock); + } + } + pa_context_set_state_callback(context, nullptr, nullptr); + + if(err < 0) + { + pa_context_unref(context); + throw al::backend_exception{ALC_INVALID_VALUE, "Context did not connect (%s)", + pa_strerror(err)}; + } + + return context; +} + +pa_stream *PulseMainloop::connectStream(const char *device_name, + std::unique_lock &plock, pa_context *context, pa_stream_flags_t flags, + pa_buffer_attr *attr, pa_sample_spec *spec, pa_channel_map *chanmap, BackendType type) +{ + const char *stream_id{(type==BackendType::Playback) ? "Playback Stream" : "Capture Stream"}; + pa_stream *stream{pa_stream_new(context, stream_id, spec, chanmap)}; + if(!stream) + throw al::backend_exception{ALC_OUT_OF_MEMORY, "pa_stream_new() failed (%s)", + pa_strerror(pa_context_errno(context))}; + + pa_stream_set_state_callback(stream, &streamStateCallbackC, this); + + int err{(type==BackendType::Playback) ? + pa_stream_connect_playback(stream, device_name, attr, flags, nullptr, nullptr) : + pa_stream_connect_record(stream, device_name, attr, flags)}; + if(err < 0) + { + pa_stream_unref(stream); + throw al::backend_exception{ALC_INVALID_VALUE, "%s did not connect (%s)", stream_id, + pa_strerror(err)}; + } + + pa_stream_state_t state; + while((state=pa_stream_get_state(stream)) != PA_STREAM_READY) + { + if(!PA_STREAM_IS_GOOD(state)) + { + err = pa_context_errno(context); + pa_stream_unref(stream); + throw al::backend_exception{ALC_INVALID_VALUE, "%s did not get ready (%s)", stream_id, + pa_strerror(err)}; + } + + mCondVar.wait(plock); + } + pa_stream_set_state_callback(stream, nullptr, nullptr); + + return stream; +} + +void PulseMainloop::close(pa_context *context, pa_stream *stream) +{ + std::lock_guard _{mMutex}; + if(stream) + { + pa_stream_set_state_callback(stream, nullptr, nullptr); + pa_stream_set_moved_callback(stream, nullptr, nullptr); + pa_stream_set_write_callback(stream, nullptr, nullptr); + pa_stream_set_buffer_attr_callback(stream, nullptr, nullptr); + pa_stream_disconnect(stream); + pa_stream_unref(stream); + } + + pa_context_disconnect(context); + pa_context_unref(context); +} + + +/* Used for initial connection test and enumeration. */ +PulseMainloop gGlobalMainloop; + + +struct DevMap { + std::string name; + std::string device_name; +}; + +bool checkName(const al::vector &list, const std::string &name) +{ + auto match_name = [&name](const DevMap &entry) -> bool { return entry.name == name; }; + return std::find_if(list.cbegin(), list.cend(), match_name) != list.cend(); +} + +al::vector PlaybackDevices; +al::vector CaptureDevices; + + +void device_sink_callback(pa_context*, const pa_sink_info *info, int eol, void *pdata) noexcept +{ + if(eol) + { + static_cast(pdata)->getCondVar().notify_all(); + return; + } + + /* Skip this device is if it's already in the list. */ + if(std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [info](const DevMap &entry) -> bool + { return entry.device_name == info->name; } + ) != PlaybackDevices.cend()) + return; + + /* Make sure the display name (description) is unique. Append a number + * counter as needed. + */ + int count{1}; + std::string newname{info->description}; + while(checkName(PlaybackDevices, newname)) + { + newname = info->description; + newname += " #"; + newname += std::to_string(++count); + } + PlaybackDevices.emplace_back(DevMap{std::move(newname), info->name}); + DevMap &newentry = PlaybackDevices.back(); + + TRACE("Got device \"%s\", \"%s\"\n", newentry.name.c_str(), newentry.device_name.c_str()); +} + +void probePlaybackDevices(PulseMainloop &mainloop) +{ + pa_context *context{}; + pa_stream *stream{}; + + PlaybackDevices.clear(); + try { + auto plock = mainloop.getLock(); + + context = mainloop.connectContext(plock); + + constexpr pa_stream_flags_t flags{PA_STREAM_FIX_FORMAT | PA_STREAM_FIX_RATE | + PA_STREAM_FIX_CHANNELS | PA_STREAM_DONT_MOVE | PA_STREAM_START_CORKED}; + + pa_sample_spec spec{}; + spec.format = PA_SAMPLE_S16NE; + spec.rate = 44100; + spec.channels = 2; + + stream = mainloop.connectStream(nullptr, plock, context, flags, nullptr, &spec, nullptr, + BackendType::Playback); + pa_operation *op{pa_context_get_sink_info_by_name(context, + pa_stream_get_device_name(stream), device_sink_callback, &mainloop)}; + mainloop.waitForOperation(op, plock); + + pa_stream_disconnect(stream); + pa_stream_unref(stream); + stream = nullptr; + + op = pa_context_get_sink_info_list(context, device_sink_callback, &mainloop); + mainloop.waitForOperation(op, plock); + + pa_context_disconnect(context); + pa_context_unref(context); + context = nullptr; + } + catch(std::exception &e) { + ERR("Error enumerating devices: %s\n", e.what()); + if(context) mainloop.close(context, stream); + } +} + + +void device_source_callback(pa_context*, const pa_source_info *info, int eol, void *pdata) noexcept +{ + if(eol) + { + static_cast(pdata)->getCondVar().notify_all(); + return; + } + + /* Skip this device is if it's already in the list. */ + if(std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [info](const DevMap &entry) -> bool + { return entry.device_name == info->name; } + ) != CaptureDevices.cend()) + return; + + /* Make sure the display name (description) is unique. Append a number + * counter as needed. + */ + int count{1}; + std::string newname{info->description}; + while(checkName(CaptureDevices, newname)) + { + newname = info->description; + newname += " #"; + newname += std::to_string(++count); + } + CaptureDevices.emplace_back(DevMap{std::move(newname), info->name}); + DevMap &newentry = CaptureDevices.back(); + + TRACE("Got device \"%s\", \"%s\"\n", newentry.name.c_str(), newentry.device_name.c_str()); +} + +void probeCaptureDevices(PulseMainloop &mainloop) +{ + pa_context *context{}; + pa_stream *stream{}; + + CaptureDevices.clear(); + try { + auto plock = mainloop.getLock(); + + context = mainloop.connectContext(plock); + + constexpr pa_stream_flags_t flags{PA_STREAM_FIX_FORMAT | PA_STREAM_FIX_RATE | + PA_STREAM_FIX_CHANNELS | PA_STREAM_DONT_MOVE | PA_STREAM_START_CORKED}; + + pa_sample_spec spec{}; + spec.format = PA_SAMPLE_S16NE; + spec.rate = 44100; + spec.channels = 1; + + stream = mainloop.connectStream(nullptr, plock, context, flags, nullptr, &spec, nullptr, + BackendType::Capture); + pa_operation *op{pa_context_get_source_info_by_name(context, + pa_stream_get_device_name(stream), device_source_callback, &mainloop)}; + mainloop.waitForOperation(op, plock); + + pa_stream_disconnect(stream); + pa_stream_unref(stream); + stream = nullptr; + + op = pa_context_get_source_info_list(context, device_source_callback, &mainloop); + mainloop.waitForOperation(op, plock); + + pa_context_disconnect(context); + pa_context_unref(context); + context = nullptr; + } + catch(std::exception &e) { + ERR("Error enumerating devices: %s\n", e.what()); + if(context) mainloop.close(context, stream); + } +} + + +struct PulsePlayback final : public BackendBase { + PulsePlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~PulsePlayback() override; + + void bufferAttrCallback(pa_stream *stream) noexcept; + static void bufferAttrCallbackC(pa_stream *stream, void *pdata) noexcept + { static_cast(pdata)->bufferAttrCallback(stream); } + + void streamStateCallback(pa_stream *stream) noexcept; + static void streamStateCallbackC(pa_stream *stream, void *pdata) noexcept + { static_cast(pdata)->streamStateCallback(stream); } + + void streamWriteCallback(pa_stream *stream, size_t nbytes) noexcept; + static void streamWriteCallbackC(pa_stream *stream, size_t nbytes, void *pdata) noexcept + { static_cast(pdata)->streamWriteCallback(stream, nbytes); } + + void sinkInfoCallback(pa_context *context, const pa_sink_info *info, int eol) noexcept; + static void sinkInfoCallbackC(pa_context *context, const pa_sink_info *info, int eol, void *pdata) noexcept + { static_cast(pdata)->sinkInfoCallback(context, info, eol); } + + void sinkNameCallback(pa_context *context, const pa_sink_info *info, int eol) noexcept; + static void sinkNameCallbackC(pa_context *context, const pa_sink_info *info, int eol, void *pdata) noexcept + { static_cast(pdata)->sinkNameCallback(context, info, eol); } + + void streamMovedCallback(pa_stream *stream) noexcept; + static void streamMovedCallbackC(pa_stream *stream, void *pdata) noexcept + { static_cast(pdata)->streamMovedCallback(stream); } + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + ClockLatency getClockLatency() override; + void lock() override { mMainloop.doLock(); } + void unlock() override { mMainloop.doUnlock(); } + + PulseMainloop mMainloop; + + std::string mDeviceName; + + pa_buffer_attr mAttr; + pa_sample_spec mSpec; + + pa_stream *mStream{nullptr}; + pa_context *mContext{nullptr}; + + ALuint mFrameSize{0u}; + + DEF_NEWDEL(PulsePlayback) +}; + +PulsePlayback::~PulsePlayback() +{ + if(!mContext) + return; + + mMainloop.close(mContext, mStream); + mContext = nullptr; + mStream = nullptr; +} + + +void PulsePlayback::bufferAttrCallback(pa_stream *stream) noexcept +{ + /* FIXME: Update the device's UpdateSize (and/or BufferSize) using the new + * buffer attributes? Changing UpdateSize will change the ALC_REFRESH + * property, which probably shouldn't change between device resets. But + * leaving it alone means ALC_REFRESH will be off. + */ + mAttr = *(pa_stream_get_buffer_attr(stream)); + TRACE("minreq=%d, tlength=%d, prebuf=%d\n", mAttr.minreq, mAttr.tlength, mAttr.prebuf); +} + +void PulsePlayback::streamStateCallback(pa_stream *stream) noexcept +{ + if(pa_stream_get_state(stream) == PA_STREAM_FAILED) + { + ERR("Received stream failure!\n"); + aluHandleDisconnect(mDevice, "Playback stream failure"); + } + mMainloop.getCondVar().notify_all(); +} + +void PulsePlayback::streamWriteCallback(pa_stream *stream, size_t nbytes) noexcept +{ + void *buf{pa_xmalloc(nbytes)}; + aluMixData(mDevice, buf, static_cast(nbytes/mFrameSize), mDevice->channelsFromFmt()); + + int ret{pa_stream_write(stream, buf, nbytes, pa_xfree, 0, PA_SEEK_RELATIVE)}; + if UNLIKELY(ret != PA_OK) + ERR("Failed to write to stream: %d, %s\n", ret, pa_strerror(ret)); +} + +void PulsePlayback::sinkInfoCallback(pa_context*, const pa_sink_info *info, int eol) noexcept +{ + struct ChannelMap { + DevFmtChannels fmt; + pa_channel_map map; + }; + static constexpr std::array chanmaps{{ + { DevFmtX71, X71ChanMap }, + { DevFmtX61, X61ChanMap }, + { DevFmtX51, X51ChanMap }, + { DevFmtX51Rear, X51RearChanMap }, + { DevFmtQuad, QuadChanMap }, + { DevFmtStereo, StereoChanMap }, + { DevFmtMono, MonoChanMap } + }}; + + if(eol) + { + mMainloop.getCondVar().notify_all(); + return; + } + + auto chaniter = std::find_if(chanmaps.cbegin(), chanmaps.cend(), + [info](const ChannelMap &chanmap) -> bool + { return pa_channel_map_superset(&info->channel_map, &chanmap.map); } + ); + if(chaniter != chanmaps.cend()) + { + if(!mDevice->Flags.get()) + mDevice->FmtChans = chaniter->fmt; + } + else + { + char chanmap_str[PA_CHANNEL_MAP_SNPRINT_MAX]{}; + pa_channel_map_snprint(chanmap_str, sizeof(chanmap_str), &info->channel_map); + WARN("Failed to find format for channel map:\n %s\n", chanmap_str); + } + + if(info->active_port) + TRACE("Active port: %s (%s)\n", info->active_port->name, info->active_port->description); + mDevice->IsHeadphones = (mDevice->FmtChans == DevFmtStereo && + info->active_port && strcmp(info->active_port->name, "analog-output-headphones") == 0); +} + +void PulsePlayback::sinkNameCallback(pa_context*, const pa_sink_info *info, int eol) noexcept +{ + if(eol) + { + mMainloop.getCondVar().notify_all(); + return; + } + mDevice->DeviceName = info->description; +} + +void PulsePlayback::streamMovedCallback(pa_stream *stream) noexcept +{ + mDeviceName = pa_stream_get_device_name(stream); + TRACE("Stream moved to %s\n", mDeviceName.c_str()); +} + + +void PulsePlayback::open(const ALCchar *name) +{ + const char *pulse_name{nullptr}; + const char *dev_name{nullptr}; + + if(name) + { + if(PlaybackDevices.empty()) + probePlaybackDevices(mMainloop); + + auto iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == PlaybackDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + pulse_name = iter->device_name.c_str(); + dev_name = iter->name.c_str(); + } + + auto plock = mMainloop.getLock(); + + mContext = mMainloop.connectContext(plock); + + pa_stream_flags_t flags{PA_STREAM_START_CORKED | PA_STREAM_FIX_FORMAT | PA_STREAM_FIX_RATE | + PA_STREAM_FIX_CHANNELS}; + if(!GetConfigValueBool(nullptr, "pulse", "allow-moves", 1)) + flags |= PA_STREAM_DONT_MOVE; + + pa_sample_spec spec{}; + spec.format = PA_SAMPLE_S16NE; + spec.rate = 44100; + spec.channels = 2; + + if(!pulse_name) + { + static const auto defname = al::getenv("ALSOFT_PULSE_DEFAULT"); + if(defname) pulse_name = defname->c_str(); + } + TRACE("Connecting to \"%s\"\n", pulse_name ? pulse_name : "(default)"); + mStream = mMainloop.connectStream(pulse_name, plock, mContext, flags, nullptr, &spec, nullptr, + BackendType::Playback); + + pa_stream_set_moved_callback(mStream, &PulsePlayback::streamMovedCallbackC, this); + mFrameSize = static_cast(pa_frame_size(pa_stream_get_sample_spec(mStream))); + + mDeviceName = pa_stream_get_device_name(mStream); + if(!dev_name) + { + pa_operation *op{pa_context_get_sink_info_by_name(mContext, mDeviceName.c_str(), + &PulsePlayback::sinkNameCallbackC, this)}; + mMainloop.waitForOperation(op, plock); + } + else + mDevice->DeviceName = dev_name; +} + +bool PulsePlayback::reset() +{ + auto plock = mMainloop.getLock(); + + if(mStream) + { + pa_stream_set_state_callback(mStream, nullptr, nullptr); + pa_stream_set_moved_callback(mStream, nullptr, nullptr); + pa_stream_set_write_callback(mStream, nullptr, nullptr); + pa_stream_set_buffer_attr_callback(mStream, nullptr, nullptr); + pa_stream_disconnect(mStream); + pa_stream_unref(mStream); + mStream = nullptr; + } + + pa_operation *op{pa_context_get_sink_info_by_name(mContext, mDeviceName.c_str(), + &PulsePlayback::sinkInfoCallbackC, this)}; + mMainloop.waitForOperation(op, plock); + + pa_stream_flags_t flags{PA_STREAM_START_CORKED | PA_STREAM_INTERPOLATE_TIMING | + PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_EARLY_REQUESTS}; + if(!GetConfigValueBool(nullptr, "pulse", "allow-moves", 1)) + flags |= PA_STREAM_DONT_MOVE; + if(GetConfigValueBool(mDevice->DeviceName.c_str(), "pulse", "adjust-latency", 0)) + { + /* ADJUST_LATENCY can't be specified with EARLY_REQUESTS, for some + * reason. So if the user wants to adjust the overall device latency, + * we can't ask to get write signals as soon as minreq is reached. + */ + flags &= ~PA_STREAM_EARLY_REQUESTS; + flags |= PA_STREAM_ADJUST_LATENCY; + } + if(GetConfigValueBool(mDevice->DeviceName.c_str(), "pulse", "fix-rate", 0) || + !mDevice->Flags.get()) + flags |= PA_STREAM_FIX_RATE; + + pa_channel_map chanmap{}; + switch(mDevice->FmtChans) + { + case DevFmtMono: + chanmap = MonoChanMap; + break; + case DevFmtAmbi3D: + mDevice->FmtChans = DevFmtStereo; + /*fall-through*/ + case DevFmtStereo: + chanmap = StereoChanMap; + break; + case DevFmtQuad: + chanmap = QuadChanMap; + break; + case DevFmtX51: + chanmap = X51ChanMap; + break; + case DevFmtX51Rear: + chanmap = X51RearChanMap; + break; + case DevFmtX61: + chanmap = X61ChanMap; + break; + case DevFmtX71: + chanmap = X71ChanMap; + break; + } + SetChannelOrderFromMap(mDevice, chanmap); + + switch(mDevice->FmtType) + { + case DevFmtByte: + mDevice->FmtType = DevFmtUByte; + /* fall-through */ + case DevFmtUByte: + mSpec.format = PA_SAMPLE_U8; + break; + case DevFmtUShort: + mDevice->FmtType = DevFmtShort; + /* fall-through */ + case DevFmtShort: + mSpec.format = PA_SAMPLE_S16NE; + break; + case DevFmtUInt: + mDevice->FmtType = DevFmtInt; + /* fall-through */ + case DevFmtInt: + mSpec.format = PA_SAMPLE_S32NE; + break; + case DevFmtFloat: + mSpec.format = PA_SAMPLE_FLOAT32NE; + break; + } + mSpec.rate = mDevice->Frequency; + mSpec.channels = static_cast(mDevice->channelsFromFmt()); + if(pa_sample_spec_valid(&mSpec) == 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Invalid sample spec"}; + + const ALuint frame_size{static_cast(pa_frame_size(&mSpec))}; + mAttr.maxlength = ~0u; + mAttr.tlength = mDevice->BufferSize * frame_size; + mAttr.prebuf = 0u; + mAttr.minreq = mDevice->UpdateSize * frame_size; + mAttr.fragsize = ~0u; + + mStream = mMainloop.connectStream(mDeviceName.c_str(), plock, mContext, flags, &mAttr, &mSpec, + &chanmap, BackendType::Playback); + + pa_stream_set_state_callback(mStream, &PulsePlayback::streamStateCallbackC, this); + pa_stream_set_moved_callback(mStream, &PulsePlayback::streamMovedCallbackC, this); + + mSpec = *(pa_stream_get_sample_spec(mStream)); + mFrameSize = static_cast(pa_frame_size(&mSpec)); + + if(mDevice->Frequency != mSpec.rate) + { + /* Server updated our playback rate, so modify the buffer attribs + * accordingly. + */ + const auto scale = static_cast(mSpec.rate) / mDevice->Frequency; + const ALuint perlen{static_cast(clampd(scale*mDevice->UpdateSize + 0.5, 64.0, + 8192.0))}; + const ALuint buflen{static_cast(clampd(scale*mDevice->BufferSize + 0.5, perlen*2, + std::numeric_limits::max()/mFrameSize))}; + + mAttr.maxlength = ~0u; + mAttr.tlength = buflen * mFrameSize; + mAttr.prebuf = 0u; + mAttr.minreq = perlen * mFrameSize; + + op = pa_stream_set_buffer_attr(mStream, &mAttr, &PulseMainloop::streamSuccessCallbackC, + &mMainloop); + mMainloop.waitForOperation(op, plock); + + mDevice->Frequency = mSpec.rate; + } + + pa_stream_set_buffer_attr_callback(mStream, &PulsePlayback::bufferAttrCallbackC, this); + bufferAttrCallback(mStream); + + mDevice->BufferSize = mAttr.tlength / mFrameSize; + mDevice->UpdateSize = mAttr.minreq / mFrameSize; + + return true; +} + +bool PulsePlayback::start() +{ + auto plock = mMainloop.getLock(); + + pa_stream_set_write_callback(mStream, &PulsePlayback::streamWriteCallbackC, this); + pa_operation *op{pa_stream_cork(mStream, 0, &PulseMainloop::streamSuccessCallbackC, + &mMainloop)}; + mMainloop.waitForOperation(op, plock); + + return true; +} + +void PulsePlayback::stop() +{ + auto plock = mMainloop.getLock(); + + pa_operation *op{pa_stream_cork(mStream, 1, &PulseMainloop::streamSuccessCallbackC, + &mMainloop)}; + mMainloop.waitForOperation(op, plock); + pa_stream_set_write_callback(mStream, nullptr, nullptr); +} + + +ClockLatency PulsePlayback::getClockLatency() +{ + ClockLatency ret; + pa_usec_t latency; + int neg, err; + + { + auto _ = mMainloop.getLock(); + ret.ClockTime = GetDeviceClockTime(mDevice); + err = pa_stream_get_latency(mStream, &latency, &neg); + } + + if UNLIKELY(err != 0) + { + /* FIXME: if err = -PA_ERR_NODATA, it means we were called too soon + * after starting the stream and no timing info has been received from + * the server yet. Should we wait, possibly stalling the app, or give a + * dummy value? Either way, it shouldn't be 0. */ + if(err != -PA_ERR_NODATA) + ERR("Failed to get stream latency: 0x%x\n", err); + latency = 0; + neg = 0; + } + else if UNLIKELY(neg) + latency = 0; + ret.Latency = std::chrono::microseconds{latency}; + + return ret; +} + + +struct PulseCapture final : public BackendBase { + PulseCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~PulseCapture() override; + + void streamStateCallback(pa_stream *stream) noexcept; + static void streamStateCallbackC(pa_stream *stream, void *pdata) noexcept + { static_cast(pdata)->streamStateCallback(stream); } + + void sourceNameCallback(pa_context *context, const pa_source_info *info, int eol) noexcept; + static void sourceNameCallbackC(pa_context *context, const pa_source_info *info, int eol, void *pdata) noexcept + { static_cast(pdata)->sourceNameCallback(context, info, eol); } + + void streamMovedCallback(pa_stream *stream) noexcept; + static void streamMovedCallbackC(pa_stream *stream, void *pdata) noexcept + { static_cast(pdata)->streamMovedCallback(stream); } + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + ClockLatency getClockLatency() override; + void lock() override { mMainloop.doLock(); } + void unlock() override { mMainloop.doUnlock(); } + + PulseMainloop mMainloop; + + std::string mDeviceName; + + ALCuint mLastReadable{0u}; + al::byte mSilentVal{}; + + al::span mCapBuffer; + ssize_t mCapLen{0}; + + pa_buffer_attr mAttr{}; + pa_sample_spec mSpec{}; + + pa_stream *mStream{nullptr}; + pa_context *mContext{nullptr}; + + DEF_NEWDEL(PulseCapture) +}; + +PulseCapture::~PulseCapture() +{ + if(!mContext) + return; + + mMainloop.close(mContext, mStream); + mContext = nullptr; + mStream = nullptr; +} + + +void PulseCapture::streamStateCallback(pa_stream *stream) noexcept +{ + if(pa_stream_get_state(stream) == PA_STREAM_FAILED) + { + ERR("Received stream failure!\n"); + aluHandleDisconnect(mDevice, "Capture stream failure"); + } + mMainloop.getCondVar().notify_all(); +} + +void PulseCapture::sourceNameCallback(pa_context*, const pa_source_info *info, int eol) noexcept +{ + if(eol) + { + mMainloop.getCondVar().notify_all(); + return; + } + mDevice->DeviceName = info->description; +} + +void PulseCapture::streamMovedCallback(pa_stream *stream) noexcept +{ + mDeviceName = pa_stream_get_device_name(stream); + TRACE("Stream moved to %s\n", mDeviceName.c_str()); +} + + +void PulseCapture::open(const ALCchar *name) +{ + const char *pulse_name{nullptr}; + if(name) + { + if(CaptureDevices.empty()) + probeCaptureDevices(mMainloop); + + auto iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name; } + ); + if(iter == CaptureDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + pulse_name = iter->device_name.c_str(); + mDevice->DeviceName = iter->name; + } + + auto plock = mMainloop.getLock(); + + mContext = mMainloop.connectContext(plock); + + pa_channel_map chanmap{}; + switch(mDevice->FmtChans) + { + case DevFmtMono: + chanmap = MonoChanMap; + break; + case DevFmtStereo: + chanmap = StereoChanMap; + break; + case DevFmtQuad: + chanmap = QuadChanMap; + break; + case DevFmtX51: + chanmap = X51ChanMap; + break; + case DevFmtX51Rear: + chanmap = X51RearChanMap; + break; + case DevFmtX61: + chanmap = X61ChanMap; + break; + case DevFmtX71: + chanmap = X71ChanMap; + break; + case DevFmtAmbi3D: + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture not supported", + DevFmtChannelsString(mDevice->FmtChans)}; + } + SetChannelOrderFromMap(mDevice, chanmap); + + switch(mDevice->FmtType) + { + case DevFmtUByte: + mSilentVal = al::byte(0x80); + mSpec.format = PA_SAMPLE_U8; + break; + case DevFmtShort: + mSpec.format = PA_SAMPLE_S16NE; + break; + case DevFmtInt: + mSpec.format = PA_SAMPLE_S32NE; + break; + case DevFmtFloat: + mSpec.format = PA_SAMPLE_FLOAT32NE; + break; + case DevFmtByte: + case DevFmtUShort: + case DevFmtUInt: + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture samples not supported", + DevFmtTypeString(mDevice->FmtType)}; + } + mSpec.rate = mDevice->Frequency; + mSpec.channels = static_cast(mDevice->channelsFromFmt()); + if(pa_sample_spec_valid(&mSpec) == 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Invalid sample format"}; + + const ALuint frame_size{static_cast(pa_frame_size(&mSpec))}; + const ALuint samples{maxu(mDevice->BufferSize, 100 * mDevice->Frequency / 1000)}; + mAttr.minreq = ~0u; + mAttr.prebuf = ~0u; + mAttr.maxlength = samples * frame_size; + mAttr.tlength = ~0u; + mAttr.fragsize = minu(samples, 50*mDevice->Frequency/1000) * frame_size; + + pa_stream_flags_t flags{PA_STREAM_START_CORKED | PA_STREAM_ADJUST_LATENCY}; + if(!GetConfigValueBool(nullptr, "pulse", "allow-moves", 1)) + flags |= PA_STREAM_DONT_MOVE; + + TRACE("Connecting to \"%s\"\n", pulse_name ? pulse_name : "(default)"); + mStream = mMainloop.connectStream(pulse_name, plock, mContext, flags, &mAttr, &mSpec, &chanmap, + BackendType::Capture); + + pa_stream_set_moved_callback(mStream, &PulseCapture::streamMovedCallbackC, this); + pa_stream_set_state_callback(mStream, &PulseCapture::streamStateCallbackC, this); + + mDeviceName = pa_stream_get_device_name(mStream); + if(mDevice->DeviceName.empty()) + { + pa_operation *op{pa_context_get_source_info_by_name(mContext, mDeviceName.c_str(), + &PulseCapture::sourceNameCallbackC, this)}; + mMainloop.waitForOperation(op, plock); + } +} + +bool PulseCapture::start() +{ + auto plock = mMainloop.getLock(); + pa_operation *op{pa_stream_cork(mStream, 0, &PulseMainloop::streamSuccessCallbackC, + &mMainloop)}; + mMainloop.waitForOperation(op, plock); + return true; +} + +void PulseCapture::stop() +{ + auto plock = mMainloop.getLock(); + pa_operation *op{pa_stream_cork(mStream, 1, &PulseMainloop::streamSuccessCallbackC, + &mMainloop)}; + mMainloop.waitForOperation(op, plock); +} + +ALCenum PulseCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + al::span dstbuf{buffer, samples * pa_frame_size(&mSpec)}; + + /* Capture is done in fragment-sized chunks, so we loop until we get all + * that's available */ + mLastReadable -= static_cast(dstbuf.size()); + while(!dstbuf.empty()) + { + if(!mCapBuffer.empty()) + { + const size_t rem{minz(dstbuf.size(), mCapBuffer.size())}; + if UNLIKELY(mCapLen < 0) + std::fill_n(dstbuf.begin(), rem, mSilentVal); + else + std::copy_n(mCapBuffer.begin(), rem, dstbuf.begin()); + dstbuf = dstbuf.subspan(rem); + mCapBuffer = mCapBuffer.subspan(rem); + + continue; + } + + if UNLIKELY(!mDevice->Connected.load(std::memory_order_acquire)) + break; + + auto plock = mMainloop.getLock(); + if(mCapLen != 0) + { + pa_stream_drop(mStream); + mCapBuffer = {}; + mCapLen = 0; + } + const pa_stream_state_t state{pa_stream_get_state(mStream)}; + if UNLIKELY(!PA_STREAM_IS_GOOD(state)) + { + aluHandleDisconnect(mDevice, "Bad capture state: %u", state); + break; + } + const void *capbuf; + size_t caplen; + if UNLIKELY(pa_stream_peek(mStream, &capbuf, &caplen) < 0) + { + aluHandleDisconnect(mDevice, "Failed retrieving capture samples: %s", + pa_strerror(pa_context_errno(mContext))); + break; + } + plock.unlock(); + + if(caplen == 0) break; + if UNLIKELY(!capbuf) + mCapLen = -static_cast(caplen); + else + mCapLen = static_cast(caplen); + mCapBuffer = {static_cast(capbuf), caplen}; + } + if(!dstbuf.empty()) + std::fill(dstbuf.begin(), dstbuf.end(), mSilentVal); + + return ALC_NO_ERROR; +} + +ALCuint PulseCapture::availableSamples() +{ + size_t readable{mCapBuffer.size()}; + + if(mDevice->Connected.load(std::memory_order_acquire)) + { + auto _ = mMainloop.getLock(); + size_t got{pa_stream_readable_size(mStream)}; + if UNLIKELY(static_cast(got) < 0) + { + const char *err{pa_strerror(static_cast(got))}; + ERR("pa_stream_readable_size() failed: %s\n", err); + aluHandleDisconnect(mDevice, "Failed getting readable size: %s", err); + } + else + { + const auto caplen = static_cast(std::abs(mCapLen)); + if(got > caplen) readable += got - caplen; + } + } + + readable = std::min(readable, std::numeric_limits::max()); + mLastReadable = std::max(mLastReadable, static_cast(readable)); + return mLastReadable / static_cast(pa_frame_size(&mSpec)); +} + + +ClockLatency PulseCapture::getClockLatency() +{ + ClockLatency ret; + pa_usec_t latency; + int neg, err; + + { + auto _ = mMainloop.getLock(); + ret.ClockTime = GetDeviceClockTime(mDevice); + err = pa_stream_get_latency(mStream, &latency, &neg); + } + + if UNLIKELY(err != 0) + { + ERR("Failed to get stream latency: 0x%x\n", err); + latency = 0; + neg = 0; + } + else if UNLIKELY(neg) + latency = 0; + ret.Latency = std::chrono::microseconds{latency}; + + return ret; +} + +} // namespace + + +bool PulseBackendFactory::init() +{ +#ifdef HAVE_DYNLOAD + if(!pulse_handle) + { + bool ret{true}; + std::string missing_funcs; + +#ifdef _WIN32 +#define PALIB "libpulse-0.dll" +#elif defined(__APPLE__) && defined(__MACH__) +#define PALIB "libpulse.0.dylib" +#else +#define PALIB "libpulse.so.0" +#endif + pulse_handle = LoadLib(PALIB); + if(!pulse_handle) + { + WARN("Failed to load %s\n", PALIB); + return false; + } + +#define LOAD_FUNC(x) do { \ + p##x = reinterpret_cast(GetSymbol(pulse_handle, #x)); \ + if(!(p##x)) { \ + ret = false; \ + missing_funcs += "\n" #x; \ + } \ +} while(0) + PULSE_FUNCS(LOAD_FUNC) +#undef LOAD_FUNC + + if(!ret) + { + WARN("Missing expected functions:%s\n", missing_funcs.c_str()); + CloseLib(pulse_handle); + pulse_handle = nullptr; + return false; + } + } +#endif /* HAVE_DYNLOAD */ + + pulse_ctx_flags = PA_CONTEXT_NOFLAGS; + if(!GetConfigValueBool(nullptr, "pulse", "spawn-server", 1)) + pulse_ctx_flags |= PA_CONTEXT_NOAUTOSPAWN; + + try { + auto plock = gGlobalMainloop.getLock(); + pa_context *context{gGlobalMainloop.connectContext(plock)}; + pa_context_disconnect(context); + pa_context_unref(context); + return true; + } + catch(...) { + return false; + } +} + +bool PulseBackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback || type == BackendType::Capture; } + +void PulseBackendFactory::probe(DevProbe type, std::string *outnames) +{ + auto add_device = [outnames](const DevMap &entry) -> void + { + /* +1 to also append the null char (to ensure a null-separated list and + * double-null terminated list). + */ + outnames->append(entry.name.c_str(), entry.name.length()+1); + }; + + switch(type) + { + case DevProbe::Playback: + probePlaybackDevices(gGlobalMainloop); + std::for_each(PlaybackDevices.cbegin(), PlaybackDevices.cend(), add_device); + break; + + case DevProbe::Capture: + probeCaptureDevices(gGlobalMainloop); + std::for_each(CaptureDevices.cbegin(), CaptureDevices.cend(), add_device); + break; + } +} + +BackendPtr PulseBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new PulsePlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new PulseCapture{device}}; + return nullptr; +} + +BackendFactory &PulseBackendFactory::getFactory() +{ + static PulseBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/pulseaudio.h b/alc/backends/pulseaudio.h new file mode 100644 index 0000000..40f3e30 --- /dev/null +++ b/alc/backends/pulseaudio.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_PULSEAUDIO_H +#define BACKENDS_PULSEAUDIO_H + +#include "backends/base.h" + +class PulseBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_PULSEAUDIO_H */ diff --git a/Alc/backends/qsa.c b/alc/backends/qsa.cpp similarity index 61% rename from Alc/backends/qsa.c rename to alc/backends/qsa.cpp index 8f87779..5ed6579 100644 --- a/Alc/backends/qsa.c +++ b/alc/backends/qsa.cpp @@ -20,49 +20,56 @@ #include "config.h" +#include "backends/qsa.h" + #include #include #include #include #include -#include -#include -#include +#include -#include "alMain.h" +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" #include "alu.h" #include "threads.h" -#include "backends/base.h" +#include +#include -typedef struct { - snd_pcm_t* pcmHandle; - int audio_fd; +namespace { - snd_pcm_channel_setup_t csetup; - snd_pcm_channel_params_t cparams; +struct qsa_data { + snd_pcm_t* pcmHandle{nullptr}; + int audio_fd{-1}; - ALvoid* buffer; - ALsizei size; + snd_pcm_channel_setup_t csetup{}; + snd_pcm_channel_params_t cparams{}; - ATOMIC(ALenum) killNow; - althrd_t thread; -} qsa_data; + ALvoid* buffer{nullptr}; + ALsizei size{0}; -typedef struct { + std::atomic mKillNow{AL_TRUE}; + std::thread mThread; +}; + +struct DevMap { ALCchar* name; int card; int dev; -} DevMap; -TYPEDEF_VECTOR(DevMap, vector_DevMap) +}; -static vector_DevMap DeviceNameMap; -static vector_DevMap CaptureNameMap; +al::vector DeviceNameMap; +al::vector CaptureNameMap; -static const ALCchar qsaDevice[] = "QSA Default"; +constexpr ALCchar qsaDevice[] = "QSA Default"; -static const struct { +constexpr struct { int32_t format; } formatlist[] = { {SND_PCM_SFMT_FLOAT_LE}, @@ -75,7 +82,7 @@ static const struct { {0}, }; -static const struct { +constexpr struct { int32_t rate; } ratelist[] = { {192000}, @@ -94,7 +101,7 @@ static const struct { {0}, }; -static const struct { +constexpr struct { int32_t channels; } channellist[] = { {8}, @@ -106,25 +113,29 @@ static const struct { {0}, }; -static void deviceList(int type, vector_DevMap *devmap) +void deviceList(int type, al::vector *devmap) { snd_ctl_t* handle; snd_pcm_info_t pcminfo; int max_cards, card, err, dev; DevMap entry; char name[1024]; - struct snd_ctl_hw_info info; + snd_ctl_hw_info info; max_cards = snd_cards(); if(max_cards < 0) return; - VECTOR_RESIZE(*devmap, 0, max_cards+1); + std::for_each(devmap->begin(), devmap->end(), + [](const DevMap &entry) -> void + { free(entry.name); } + ); + devmap->clear(); entry.name = strdup(qsaDevice); entry.card = 0; entry.dev = 0; - VECTOR_PUSH_BACK(*devmap, entry); + devmap->push_back(entry); for(card = 0;card < max_cards;card++) { @@ -150,7 +161,7 @@ static void deviceList(int type, vector_DevMap *devmap) entry.card = card; entry.dev = dev; - VECTOR_PUSH_BACK(*devmap, entry); + devmap->push_back(entry); TRACE("Got device \"%s\", card %d, dev %d\n", name, card, dev); } } @@ -160,79 +171,71 @@ static void deviceList(int type, vector_DevMap *devmap) /* Wrappers to use an old-style backend with the new interface. */ -typedef struct PlaybackWrapper { - DERIVE_FROM_TYPE(ALCbackend); - qsa_data *ExtraData; -} PlaybackWrapper; - -static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device); -static void PlaybackWrapper_Destruct(PlaybackWrapper *self); -static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name); -static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self); -static ALCboolean PlaybackWrapper_start(PlaybackWrapper *self); -static void PlaybackWrapper_stop(PlaybackWrapper *self); -static DECLARE_FORWARD2(PlaybackWrapper, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, void, lock) -static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(PlaybackWrapper) -DEFINE_ALCBACKEND_VTABLE(PlaybackWrapper); +struct PlaybackWrapper final : public BackendBase { + PlaybackWrapper(ALCdevice *device) noexcept : BackendBase{device} { } + ~PlaybackWrapper() override; + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + std::unique_ptr mExtraData; + + DEF_NEWDEL(PlaybackWrapper) +}; FORCE_ALIGN static int qsa_proc_playback(void *ptr) { - PlaybackWrapper *self = ptr; - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - qsa_data *data = self->ExtraData; + PlaybackWrapper *self = static_cast(ptr); + ALCdevice *device = self->mDevice; + qsa_data *data = self->mExtraData.get(); snd_pcm_channel_status_t status; - struct sched_param param; - struct timeval timeout; + sched_param param; char* write_ptr; - fd_set wfds; ALint len; int sret; SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); + althrd_setname(MIXER_THREAD_NAME); /* Increase default 10 priority to 11 to avoid jerky sound */ SchedGet(0, 0, ¶m); param.sched_priority=param.sched_curpriority+1; SchedSet(0, 0, SCHED_NOCHANGE, ¶m); - const ALint frame_size = FrameSizeFromDevFmt( - device->FmtChans, device->FmtType, device->AmbiOrder - ); + const ALint frame_size = device->frameSizeFromFmt(); - V0(device->Backend,lock)(); - while(!ATOMIC_LOAD(&data->killNow, almemory_order_acquire)) + std::unique_lock dlock{*self}; + while(!data->mKillNow.load(std::memory_order_acquire)) { - FD_ZERO(&wfds); - FD_SET(data->audio_fd, &wfds); - timeout.tv_sec=2; - timeout.tv_usec=0; + pollfd pollitem{}; + pollitem.fd = data->audio_fd; + pollitem.events = POLLOUT; /* Select also works like time slice to OS */ - V0(device->Backend,unlock)(); - sret = select(data->audio_fd+1, NULL, &wfds, NULL, &timeout); - V0(device->Backend,lock)(); + dlock.unlock(); + sret = poll(&pollitem, 1, 2000); + dlock.lock(); if(sret == -1) { - ERR("select error: %s\n", strerror(errno)); + if(errno == EINTR || errno == EAGAIN) + continue; + ERR("poll error: %s\n", strerror(errno)); aluHandleDisconnect(device, "Failed waiting for playback buffer: %s", strerror(errno)); break; } if(sret == 0) { - ERR("select timeout\n"); + ERR("poll timeout\n"); continue; } len = data->size; - write_ptr = data->buffer; + write_ptr = static_cast(data->buffer); aluMixData(device, write_ptr, len/frame_size); - while(len>0 && !ATOMIC_LOAD(&data->killNow, almemory_order_acquire)) + while(len>0 && !data->mKillNow.load(std::memory_order_acquire)) { int wrote = snd_pcm_plugin_write(data->pcmHandle, write_ptr, len); if(wrote <= 0) @@ -263,7 +266,6 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) } } } - V0(device->Backend,unlock)(); return 0; } @@ -274,15 +276,12 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) static ALCenum qsa_open_playback(PlaybackWrapper *self, const ALCchar* deviceName) { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - qsa_data *data; + ALCdevice *device = self->mDevice; int card, dev; int status; - data = (qsa_data*)calloc(1, sizeof(qsa_data)); - if(data == NULL) - return ALC_OUT_OF_MEMORY; - ATOMIC_INIT(&data->killNow, AL_TRUE); + std::unique_ptr data{new qsa_data{}}; + data->mKillNow.store(AL_TRUE, std::memory_order_relaxed); if(!deviceName) deviceName = qsaDevice; @@ -291,46 +290,38 @@ static ALCenum qsa_open_playback(PlaybackWrapper *self, const ALCchar* deviceNam status = snd_pcm_open_preferred(&data->pcmHandle, &card, &dev, SND_PCM_OPEN_PLAYBACK); else { - const DevMap *iter; - - if(VECTOR_SIZE(DeviceNameMap) == 0) + if(DeviceNameMap.empty()) deviceList(SND_PCM_CHANNEL_PLAYBACK, &DeviceNameMap); -#define MATCH_DEVNAME(iter) ((iter)->name && strcmp(deviceName, (iter)->name)==0) - VECTOR_FIND_IF(iter, const DevMap, DeviceNameMap, MATCH_DEVNAME); -#undef MATCH_DEVNAME - if(iter == VECTOR_END(DeviceNameMap)) - { - free(data); + auto iter = std::find_if(DeviceNameMap.begin(), DeviceNameMap.end(), + [deviceName](const DevMap &entry) -> bool + { return entry.name && strcmp(deviceName, entry.name) == 0; } + ); + if(iter == DeviceNameMap.cend()) return ALC_INVALID_DEVICE; - } status = snd_pcm_open(&data->pcmHandle, iter->card, iter->dev, SND_PCM_OPEN_PLAYBACK); } if(status < 0) - { - free(data); return ALC_INVALID_DEVICE; - } data->audio_fd = snd_pcm_file_descriptor(data->pcmHandle, SND_PCM_CHANNEL_PLAYBACK); if(data->audio_fd < 0) { snd_pcm_close(data->pcmHandle); - free(data); return ALC_INVALID_DEVICE; } - alstr_copy_cstr(&device->DeviceName, deviceName); - self->ExtraData = data; + device->DeviceName = deviceName; + self->mExtraData = std::move(data); return ALC_NO_ERROR; } static void qsa_close_playback(PlaybackWrapper *self) { - qsa_data *data = self->ExtraData; + qsa_data *data = self->mExtraData.get(); if (data->buffer!=NULL) { @@ -339,15 +330,14 @@ static void qsa_close_playback(PlaybackWrapper *self) } snd_pcm_close(data->pcmHandle); - free(data); - self->ExtraData = NULL; + self->mExtraData = nullptr; } static ALCboolean qsa_reset_playback(PlaybackWrapper *self) { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - qsa_data *data = self->ExtraData; + ALCdevice *device = self->mDevice; + qsa_data *data = self->mExtraData.get(); int32_t format=-1; switch(device->FmtType) @@ -388,14 +378,13 @@ static ALCboolean qsa_reset_playback(PlaybackWrapper *self) data->cparams.start_mode=SND_PCM_START_FULL; data->cparams.stop_mode=SND_PCM_STOP_STOP; - data->cparams.buf.block.frag_size=device->UpdateSize * - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - data->cparams.buf.block.frags_max=device->NumUpdates; - data->cparams.buf.block.frags_min=device->NumUpdates; + data->cparams.buf.block.frag_size=device->UpdateSize * device->frameSizeFromFmt(); + data->cparams.buf.block.frags_max=device->BufferSize / device->UpdateSize; + data->cparams.buf.block.frags_min=data->cparams.buf.block.frags_max; data->cparams.format.interleave=1; data->cparams.format.rate=device->Frequency; - data->cparams.format.voices=ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); + data->cparams.format.voices=device->channelsFromFmt(); data->cparams.format.format=format; if ((snd_pcm_plugin_params(data->pcmHandle, &data->cparams))<0) @@ -578,8 +567,7 @@ static ALCboolean qsa_reset_playback(PlaybackWrapper *self) SetDefaultChannelOrder(device); - device->UpdateSize=data->csetup.buf.block.frag_size/ - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + device->UpdateSize=data->csetup.buf.block.frag_size / device->frameSizeFromFmt(); device->NumUpdates=data->csetup.buf.block.frags; data->size=data->csetup.buf.block.frag_size; @@ -594,101 +582,84 @@ static ALCboolean qsa_reset_playback(PlaybackWrapper *self) static ALCboolean qsa_start_playback(PlaybackWrapper *self) { - qsa_data *data = self->ExtraData; - - ATOMIC_STORE(&data->killNow, AL_FALSE, almemory_order_release); - if(althrd_create(&data->thread, qsa_proc_playback, self) != althrd_success) - return ALC_FALSE; + qsa_data *data = self->mExtraData.get(); - return ALC_TRUE; + try { + data->mKillNow.store(AL_FALSE, std::memory_order_release); + data->mThread = std::thread(qsa_proc_playback, self); + return ALC_TRUE; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + catch(...) { + } + return ALC_FALSE; } static void qsa_stop_playback(PlaybackWrapper *self) { - qsa_data *data = self->ExtraData; - int res; + qsa_data *data = self->mExtraData.get(); - if(ATOMIC_EXCHANGE(&data->killNow, AL_TRUE, almemory_order_acq_rel)) + if(data->mKillNow.exchange(AL_TRUE, std::memory_order_acq_rel) || !data->mThread.joinable()) return; - althrd_join(data->thread, &res); -} - - -static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(PlaybackWrapper, ALCbackend, self); - - self->ExtraData = NULL; + data->mThread.join(); } -static void PlaybackWrapper_Destruct(PlaybackWrapper *self) -{ - if(self->ExtraData) - qsa_close_playback(self); - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} -static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name) +PlaybackWrapper::~PlaybackWrapper() { - return qsa_open_playback(self, name); + if(mExtraData) + qsa_close_playback(this); } -static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self) +void PlaybackWrapper::open(const ALCchar *name) { - return qsa_reset_playback(self); + if(auto err = qsa_open_playback(this, name)) + throw al::backend_exception{ALC_INVALID_VALUE, "%d", err}; } -static ALCboolean PlaybackWrapper_start(PlaybackWrapper *self) +bool PlaybackWrapper::reset() { - return qsa_start_playback(self); + if(!qsa_reset_playback(this)) + throw al::backend_exception{ALC_INVALID_VALUE, ""}; + return true; } -static void PlaybackWrapper_stop(PlaybackWrapper *self) -{ - qsa_stop_playback(self); -} +bool PlaybackWrapper::start() +{ return qsa_start_playback(this); } +void PlaybackWrapper::stop() +{ qsa_stop_playback(this); } /***********/ /* Capture */ /***********/ -typedef struct CaptureWrapper { - DERIVE_FROM_TYPE(ALCbackend); - qsa_data *ExtraData; -} CaptureWrapper; - -static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device); -static void CaptureWrapper_Destruct(CaptureWrapper *self); -static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name); -static DECLARE_FORWARD(CaptureWrapper, ALCbackend, ALCboolean, reset) -static ALCboolean CaptureWrapper_start(CaptureWrapper *self); -static void CaptureWrapper_stop(CaptureWrapper *self); -static ALCenum CaptureWrapper_captureSamples(CaptureWrapper *self, void *buffer, ALCuint samples); -static ALCuint CaptureWrapper_availableSamples(CaptureWrapper *self); -static DECLARE_FORWARD(CaptureWrapper, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(CaptureWrapper, ALCbackend, void, lock) -static DECLARE_FORWARD(CaptureWrapper, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(CaptureWrapper) -DEFINE_ALCBACKEND_VTABLE(CaptureWrapper); +struct CaptureWrapper final : public BackendBase { + CaptureWrapper(ALCdevice *device) noexcept : BackendBase{device} { } + ~CaptureWrapper() override; + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + std::unique_ptr mExtraData; + + DEF_NEWDEL(CaptureWrapper) +}; static ALCenum qsa_open_capture(CaptureWrapper *self, const ALCchar *deviceName) { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - qsa_data *data; + ALCdevice *device = self->mDevice; int card, dev; int format=-1; int status; - data=(qsa_data*)calloc(1, sizeof(qsa_data)); - if (data==NULL) - { - return ALC_OUT_OF_MEMORY; - } + std::unique_ptr data{new qsa_data{}}; if(!deviceName) deviceName = qsaDevice; @@ -697,39 +668,30 @@ static ALCenum qsa_open_capture(CaptureWrapper *self, const ALCchar *deviceName) status = snd_pcm_open_preferred(&data->pcmHandle, &card, &dev, SND_PCM_OPEN_CAPTURE); else { - const DevMap *iter; - - if(VECTOR_SIZE(CaptureNameMap) == 0) + if(CaptureNameMap.empty()) deviceList(SND_PCM_CHANNEL_CAPTURE, &CaptureNameMap); -#define MATCH_DEVNAME(iter) ((iter)->name && strcmp(deviceName, (iter)->name)==0) - VECTOR_FIND_IF(iter, const DevMap, CaptureNameMap, MATCH_DEVNAME); -#undef MATCH_DEVNAME - if(iter == VECTOR_END(CaptureNameMap)) - { - free(data); + auto iter = std::find_if(CaptureNameMap.cbegin(), CaptureNameMap.cend(), + [deviceName](const DevMap &entry) -> bool + { return entry.name && strcmp(deviceName, entry.name) == 0; } + ); + if(iter == CaptureNameMap.cend()) return ALC_INVALID_DEVICE; - } status = snd_pcm_open(&data->pcmHandle, iter->card, iter->dev, SND_PCM_OPEN_CAPTURE); } if(status < 0) - { - free(data); return ALC_INVALID_DEVICE; - } data->audio_fd = snd_pcm_file_descriptor(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE); if(data->audio_fd < 0) { snd_pcm_close(data->pcmHandle); - free(data); return ALC_INVALID_DEVICE; } - alstr_copy_cstr(&device->DeviceName, deviceName); - self->ExtraData = data; + device->DeviceName = deviceName; switch (device->FmtType) { @@ -768,41 +730,40 @@ static ALCenum qsa_open_capture(CaptureWrapper *self, const ALCchar *deviceName) data->cparams.start_mode=SND_PCM_START_GO; data->cparams.stop_mode=SND_PCM_STOP_STOP; - data->cparams.buf.block.frag_size=device->UpdateSize* - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + data->cparams.buf.block.frag_size=device->UpdateSize * device->frameSizeFromFmt(); data->cparams.buf.block.frags_max=device->NumUpdates; data->cparams.buf.block.frags_min=device->NumUpdates; data->cparams.format.interleave=1; data->cparams.format.rate=device->Frequency; - data->cparams.format.voices=ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); + data->cparams.format.voices=device->channelsFromFmt(); data->cparams.format.format=format; if(snd_pcm_plugin_params(data->pcmHandle, &data->cparams) < 0) { snd_pcm_close(data->pcmHandle); - free(data); - return ALC_INVALID_VALUE; } + self->mExtraData = std::move(data); + return ALC_NO_ERROR; } static void qsa_close_capture(CaptureWrapper *self) { - qsa_data *data = self->ExtraData; + qsa_data *data = self->mExtraData.get(); - if (data->pcmHandle!=NULL) + if (data->pcmHandle!=nullptr) snd_pcm_close(data->pcmHandle); + data->pcmHandle = nullptr; - free(data); - self->ExtraData = NULL; + self->mExtraData = nullptr; } static void qsa_start_capture(CaptureWrapper *self) { - qsa_data *data = self->ExtraData; + qsa_data *data = self->mExtraData.get(); int rstatus; if ((rstatus=snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE))<0) @@ -824,16 +785,16 @@ static void qsa_start_capture(CaptureWrapper *self) static void qsa_stop_capture(CaptureWrapper *self) { - qsa_data *data = self->ExtraData; + qsa_data *data = self->mExtraData.get(); snd_pcm_capture_flush(data->pcmHandle); } static ALCuint qsa_available_samples(CaptureWrapper *self) { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - qsa_data *data = self->ExtraData; + ALCdevice *device = self->mDevice; + qsa_data *data = self->mExtraData.get(); snd_pcm_channel_status_t status; - ALint frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + ALint frame_size = device->frameSizeFromFmt(); ALint free_size; int rstatus; @@ -862,30 +823,27 @@ static ALCuint qsa_available_samples(CaptureWrapper *self) static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuint samples) { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - qsa_data *data = self->ExtraData; + ALCdevice *device = self->mDevice; + qsa_data *data = self->mExtraData.get(); char* read_ptr; snd_pcm_channel_status_t status; - fd_set rfds; int selectret; - struct timeval timeout; int bytes_read; - ALint frame_size=FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + ALint frame_size=device->frameSizeFromFmt(); ALint len=samples*frame_size; int rstatus; - read_ptr=buffer; + read_ptr = static_cast(buffer); while (len>0) { - FD_ZERO(&rfds); - FD_SET(data->audio_fd, &rfds); - timeout.tv_sec=2; - timeout.tv_usec=0; + pollfd pollitem{}; + pollitem.fd = data->audio_fd; + pollitem.events = POLLOUT; /* Select also works like time slice to OS */ bytes_read=0; - selectret=select(data->audio_fd+1, &rfds, NULL, NULL, &timeout); + selectret = poll(&pollitem, 1, 2000); switch (selectret) { case -1: @@ -894,11 +852,7 @@ static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuin case 0: break; default: - if (FD_ISSET(data->audio_fd, &rfds)) - { - bytes_read=snd_pcm_plugin_read(data->pcmHandle, read_ptr, len); - break; - } + bytes_read=snd_pcm_plugin_read(data->pcmHandle, read_ptr, len); break; } @@ -938,136 +892,72 @@ static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuin } -static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device) +CaptureWrapper::~CaptureWrapper() { - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(CaptureWrapper, ALCbackend, self); - - self->ExtraData = NULL; + if(mExtraData) + qsa_close_capture(this); } -static void CaptureWrapper_Destruct(CaptureWrapper *self) +void CaptureWrapper::open(const ALCchar *name) { - if(self->ExtraData) - qsa_close_capture(self); - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); + if(auto err = qsa_open_capture(this, name)) + throw al::backend_exception{ALC_INVALID_VALUE, "%d", err}; } -static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name) -{ - return qsa_open_capture(self, name); -} +bool CaptureWrapper::start() +{ qsa_start_capture(this); return true; } -static ALCboolean CaptureWrapper_start(CaptureWrapper *self) -{ - qsa_start_capture(self); - return ALC_TRUE; -} +void CaptureWrapper::stop() +{ qsa_stop_capture(this); } -static void CaptureWrapper_stop(CaptureWrapper *self) -{ - qsa_stop_capture(self); -} +ALCenum CaptureWrapper::captureSamples(al::byte *buffer, ALCuint samples) +{ return qsa_capture_samples(this, buffer, samples); } -static ALCenum CaptureWrapper_captureSamples(CaptureWrapper *self, void *buffer, ALCuint samples) -{ - return qsa_capture_samples(self, buffer, samples); -} +ALCuint CaptureWrapper::availableSamples() +{ return qsa_available_samples(this); } -static ALCuint CaptureWrapper_availableSamples(CaptureWrapper *self) -{ - return qsa_available_samples(self); -} +} // namespace -typedef struct ALCqsaBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCqsaBackendFactory; -#define ALCQSABACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCqsaBackendFactory, ALCbackendFactory) } } +bool QSABackendFactory::init() +{ return true; } -static ALCboolean ALCqsaBackendFactory_init(ALCqsaBackendFactory* UNUSED(self)); -static void ALCqsaBackendFactory_deinit(ALCqsaBackendFactory* UNUSED(self)); -static ALCboolean ALCqsaBackendFactory_querySupport(ALCqsaBackendFactory* UNUSED(self), ALCbackend_Type type); -static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum DevProbe type); -static ALCbackend* ALCqsaBackendFactory_createBackend(ALCqsaBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCqsaBackendFactory); +bool QSABackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } -static ALCboolean ALCqsaBackendFactory_init(ALCqsaBackendFactory* UNUSED(self)) +void QSABackendFactory::probe(DevProbe type, std::string *outnames) { - return ALC_TRUE; -} - -static void ALCqsaBackendFactory_deinit(ALCqsaBackendFactory* UNUSED(self)) -{ -#define FREE_NAME(iter) free((iter)->name) - VECTOR_FOR_EACH(DevMap, DeviceNameMap, FREE_NAME); - VECTOR_DEINIT(DeviceNameMap); - - VECTOR_FOR_EACH(DevMap, CaptureNameMap, FREE_NAME); - VECTOR_DEINIT(CaptureNameMap); -#undef FREE_NAME -} - -static ALCboolean ALCqsaBackendFactory_querySupport(ALCqsaBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback || type == ALCbackend_Capture) - return ALC_TRUE; - return ALC_FALSE; -} + auto add_device = [outnames](const DevMap &entry) -> void + { + const char *n = entry.name; + if(n && n[0]) + outnames->append(n, strlen(n)+1); + }; -static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum DevProbe type) -{ switch (type) { - case ALL_DEVICE_PROBE: -#define FREE_NAME(iter) free((iter)->name) - VECTOR_FOR_EACH(DevMap, DeviceNameMap, FREE_NAME); - VECTOR_RESIZE(DeviceNameMap, 0, 0); -#undef FREE_NAME - + case DevProbe::Playback: deviceList(SND_PCM_CHANNEL_PLAYBACK, &DeviceNameMap); -#define APPEND_DEVICE(iter) AppendAllDevicesList((iter)->name) - VECTOR_FOR_EACH(const DevMap, DeviceNameMap, APPEND_DEVICE); -#undef APPEND_DEVICE + std::for_each(DeviceNameMap.cbegin(), DeviceNameMap.cend(), add_device); break; - - case CAPTURE_DEVICE_PROBE: -#define FREE_NAME(iter) free((iter)->name) - VECTOR_FOR_EACH(DevMap, CaptureNameMap, FREE_NAME); - VECTOR_RESIZE(CaptureNameMap, 0, 0); -#undef FREE_NAME - + case DevProbe::Capture: deviceList(SND_PCM_CHANNEL_CAPTURE, &CaptureNameMap); -#define APPEND_DEVICE(iter) AppendCaptureDeviceList((iter)->name) - VECTOR_FOR_EACH(const DevMap, CaptureNameMap, APPEND_DEVICE); -#undef APPEND_DEVICE + std::for_each(CaptureNameMap.cbegin(), CaptureNameMap.cend(), add_device); break; } } -static ALCbackend* ALCqsaBackendFactory_createBackend(ALCqsaBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) +BackendPtr QSABackendFactory::createBackend(ALCdevice *device, BackendType type) { - if(type == ALCbackend_Playback) - { - PlaybackWrapper *backend; - NEW_OBJ(backend, PlaybackWrapper)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - if(type == ALCbackend_Capture) - { - CaptureWrapper *backend; - NEW_OBJ(backend, CaptureWrapper)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; + if(type == BackendType::Playback) + return BackendPtr{new PlaybackWrapper{device}}; + if(type == BackendType::Capture) + return BackendPtr{new CaptureWrapper{device}}; + return nullptr; } -ALCbackendFactory *ALCqsaBackendFactory_getFactory(void) +BackendFactory &QSABackendFactory::getFactory() { - static ALCqsaBackendFactory factory = ALCQSABACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); + static QSABackendFactory factory{}; + return factory; } diff --git a/alc/backends/qsa.h b/alc/backends/qsa.h new file mode 100644 index 0000000..da548bb --- /dev/null +++ b/alc/backends/qsa.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_QSA_H +#define BACKENDS_QSA_H + +#include "backends/base.h" + +struct QSABackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_QSA_H */ diff --git a/alc/backends/sdl2.cpp b/alc/backends/sdl2.cpp new file mode 100644 index 0000000..b52fe09 --- /dev/null +++ b/alc/backends/sdl2.cpp @@ -0,0 +1,227 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/sdl2.h" + +#include +#include +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alu.h" +#include "logging.h" + +#include + + +namespace { + +#ifdef _WIN32 +#define DEVNAME_PREFIX "OpenAL Soft on " +#else +#define DEVNAME_PREFIX "" +#endif + +constexpr ALCchar defaultDeviceName[] = DEVNAME_PREFIX "Default Device"; + +struct Sdl2Backend final : public BackendBase { + Sdl2Backend(ALCdevice *device) noexcept : BackendBase{device} { } + ~Sdl2Backend() override; + + void audioCallback(Uint8 *stream, int len) noexcept; + static void audioCallbackC(void *ptr, Uint8 *stream, int len) noexcept + { static_cast(ptr)->audioCallback(stream, len); } + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + void lock() override; + void unlock() override; + + SDL_AudioDeviceID mDeviceID{0u}; + ALuint mFrameSize{0}; + + ALuint mFrequency{0u}; + DevFmtChannels mFmtChans{}; + DevFmtType mFmtType{}; + ALuint mUpdateSize{0u}; + + DEF_NEWDEL(Sdl2Backend) +}; + +Sdl2Backend::~Sdl2Backend() +{ + if(mDeviceID) + SDL_CloseAudioDevice(mDeviceID); + mDeviceID = 0; +} + +void Sdl2Backend::audioCallback(Uint8 *stream, int len) noexcept +{ + const auto ulen = static_cast(len); + assert((ulen % mFrameSize) == 0); + aluMixData(mDevice, stream, ulen / mFrameSize, mDevice->channelsFromFmt()); +} + +void Sdl2Backend::open(const ALCchar *name) +{ + SDL_AudioSpec want{}, have{}; + + want.freq = static_cast(mDevice->Frequency); + switch(mDevice->FmtType) + { + case DevFmtUByte: want.format = AUDIO_U8; break; + case DevFmtByte: want.format = AUDIO_S8; break; + case DevFmtUShort: want.format = AUDIO_U16SYS; break; + case DevFmtShort: want.format = AUDIO_S16SYS; break; + case DevFmtUInt: /* fall-through */ + case DevFmtInt: want.format = AUDIO_S32SYS; break; + case DevFmtFloat: want.format = AUDIO_F32; break; + } + want.channels = (mDevice->FmtChans == DevFmtMono) ? 1 : 2; + want.samples = static_cast(mDevice->UpdateSize); + want.callback = &Sdl2Backend::audioCallbackC; + want.userdata = this; + + /* Passing nullptr to SDL_OpenAudioDevice opens a default, which isn't + * necessarily the first in the list. + */ + if(!name || strcmp(name, defaultDeviceName) == 0) + mDeviceID = SDL_OpenAudioDevice(nullptr, SDL_FALSE, &want, &have, + SDL_AUDIO_ALLOW_ANY_CHANGE); + else + { + const size_t prefix_len = strlen(DEVNAME_PREFIX); + if(strncmp(name, DEVNAME_PREFIX, prefix_len) == 0) + mDeviceID = SDL_OpenAudioDevice(name+prefix_len, SDL_FALSE, &want, &have, + SDL_AUDIO_ALLOW_ANY_CHANGE); + else + mDeviceID = SDL_OpenAudioDevice(name, SDL_FALSE, &want, &have, + SDL_AUDIO_ALLOW_ANY_CHANGE); + } + if(mDeviceID == 0) + throw al::backend_exception{ALC_INVALID_VALUE, "%s", SDL_GetError()}; + + mDevice->Frequency = static_cast(have.freq); + + if(have.channels == 1) + mDevice->FmtChans = DevFmtMono; + else if(have.channels == 2) + mDevice->FmtChans = DevFmtStereo; + else + throw al::backend_exception{ALC_INVALID_VALUE, "Unhandled SDL channel count: %d", + int{have.channels}}; + + switch(have.format) + { + case AUDIO_U8: mDevice->FmtType = DevFmtUByte; break; + case AUDIO_S8: mDevice->FmtType = DevFmtByte; break; + case AUDIO_U16SYS: mDevice->FmtType = DevFmtUShort; break; + case AUDIO_S16SYS: mDevice->FmtType = DevFmtShort; break; + case AUDIO_S32SYS: mDevice->FmtType = DevFmtInt; break; + case AUDIO_F32SYS: mDevice->FmtType = DevFmtFloat; break; + default: + throw al::backend_exception{ALC_INVALID_VALUE, "Unhandled SDL format: 0x%04x", + have.format}; + } + mDevice->UpdateSize = have.samples; + mDevice->BufferSize = have.samples * 2; /* SDL always (tries to) use two periods. */ + + mFrameSize = mDevice->frameSizeFromFmt(); + mFrequency = mDevice->Frequency; + mFmtChans = mDevice->FmtChans; + mFmtType = mDevice->FmtType; + mUpdateSize = mDevice->UpdateSize; + + mDevice->DeviceName = name ? name : defaultDeviceName; +} + +bool Sdl2Backend::reset() +{ + mDevice->Frequency = mFrequency; + mDevice->FmtChans = mFmtChans; + mDevice->FmtType = mFmtType; + mDevice->UpdateSize = mUpdateSize; + mDevice->BufferSize = mUpdateSize * 2; + SetDefaultWFXChannelOrder(mDevice); + return true; +} + +bool Sdl2Backend::start() +{ + SDL_PauseAudioDevice(mDeviceID, 0); + return true; +} + +void Sdl2Backend::stop() +{ SDL_PauseAudioDevice(mDeviceID, 1); } + +void Sdl2Backend::lock() +{ SDL_LockAudioDevice(mDeviceID); } + +void Sdl2Backend::unlock() +{ SDL_UnlockAudioDevice(mDeviceID); } + +} // namespace + +BackendFactory &SDL2BackendFactory::getFactory() +{ + static SDL2BackendFactory factory{}; + return factory; +} + +bool SDL2BackendFactory::init() +{ return (SDL_InitSubSystem(SDL_INIT_AUDIO) == 0); } + +bool SDL2BackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback; } + +void SDL2BackendFactory::probe(DevProbe type, std::string *outnames) +{ + if(type != DevProbe::Playback) + return; + + int num_devices{SDL_GetNumAudioDevices(SDL_FALSE)}; + + /* Includes null char. */ + outnames->append(defaultDeviceName, sizeof(defaultDeviceName)); + for(int i{0};i < num_devices;++i) + { + std::string name{DEVNAME_PREFIX}; + name += SDL_GetAudioDeviceName(i, SDL_FALSE); + if(!name.empty()) + outnames->append(name.c_str(), name.length()+1); + } +} + +BackendPtr SDL2BackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new Sdl2Backend{device}}; + return nullptr; +} diff --git a/alc/backends/sdl2.h b/alc/backends/sdl2.h new file mode 100644 index 0000000..041d47e --- /dev/null +++ b/alc/backends/sdl2.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_SDL2_H +#define BACKENDS_SDL2_H + +#include "backends/base.h" + +struct SDL2BackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_SDL2_H */ diff --git a/alc/backends/sndio.cpp b/alc/backends/sndio.cpp new file mode 100644 index 0000000..0ca7062 --- /dev/null +++ b/alc/backends/sndio.cpp @@ -0,0 +1,477 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/sndio.h" + +#include +#include +#include + +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "threads.h" +#include "vector.h" +#include "ringbuffer.h" + +#include + + +namespace { + +static const ALCchar sndio_device[] = "SndIO Default"; + + +struct SndioPlayback final : public BackendBase { + SndioPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~SndioPlayback() override; + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + sio_hdl *mSndHandle{nullptr}; + + al::vector mBuffer; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(SndioPlayback) +}; + +SndioPlayback::~SndioPlayback() +{ + if(mSndHandle) + sio_close(mSndHandle); + mSndHandle = nullptr; +} + +int SndioPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t frameStep{mDevice->channelsFromFmt()}; + const ALuint frameSize{mDevice->frameSizeFromFmt()}; + + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + ALubyte *WritePtr{mBuffer.data()}; + size_t len{mBuffer.size()}; + + { + std::lock_guard _{*this}; + aluMixData(mDevice, WritePtr, static_cast(len/frameSize), frameStep); + } + while(len > 0 && !mKillNow.load(std::memory_order_acquire)) + { + size_t wrote{sio_write(mSndHandle, WritePtr, len)}; + if(wrote == 0) + { + ERR("sio_write failed\n"); + aluHandleDisconnect(mDevice, "Failed to write playback samples"); + break; + } + + len -= wrote; + WritePtr += wrote; + } + } + + return 0; +} + + +void SndioPlayback::open(const ALCchar *name) +{ + if(!name) + name = sndio_device; + else if(strcmp(name, sndio_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + mSndHandle = sio_open(nullptr, SIO_PLAY, 0); + if(mSndHandle == nullptr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not open backend device"}; + + mDevice->DeviceName = name; +} + +bool SndioPlayback::reset() +{ + sio_par par; + sio_initpar(&par); + + par.rate = mDevice->Frequency; + par.pchan = ((mDevice->FmtChans != DevFmtMono) ? 2 : 1); + + switch(mDevice->FmtType) + { + case DevFmtByte: + par.bits = 8; + par.sig = 1; + break; + case DevFmtUByte: + par.bits = 8; + par.sig = 0; + break; + case DevFmtFloat: + case DevFmtShort: + par.bits = 16; + par.sig = 1; + break; + case DevFmtUShort: + par.bits = 16; + par.sig = 0; + break; + case DevFmtInt: + par.bits = 32; + par.sig = 1; + break; + case DevFmtUInt: + par.bits = 32; + par.sig = 0; + break; + } + par.le = SIO_LE_NATIVE; + + par.round = mDevice->UpdateSize; + par.appbufsz = mDevice->BufferSize - mDevice->UpdateSize; + if(!par.appbufsz) par.appbufsz = mDevice->UpdateSize; + + if(!sio_setpar(mSndHandle, &par) || !sio_getpar(mSndHandle, &par)) + { + ERR("Failed to set device parameters\n"); + return false; + } + + if(par.bits != par.bps*8) + { + ERR("Padded samples not supported (%u of %u bits)\n", par.bits, par.bps*8); + return true; + } + + mDevice->Frequency = par.rate; + mDevice->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo); + + if(par.bits == 8 && par.sig == 1) + mDevice->FmtType = DevFmtByte; + else if(par.bits == 8 && par.sig == 0) + mDevice->FmtType = DevFmtUByte; + else if(par.bits == 16 && par.sig == 1) + mDevice->FmtType = DevFmtShort; + else if(par.bits == 16 && par.sig == 0) + mDevice->FmtType = DevFmtUShort; + else if(par.bits == 32 && par.sig == 1) + mDevice->FmtType = DevFmtInt; + else if(par.bits == 32 && par.sig == 0) + mDevice->FmtType = DevFmtUInt; + else + { + ERR("Unhandled sample format: %s %u-bit\n", (par.sig?"signed":"unsigned"), par.bits); + return false; + } + + SetDefaultChannelOrder(mDevice); + + mDevice->UpdateSize = par.round; + mDevice->BufferSize = par.bufsz + par.round; + + mBuffer.resize(mDevice->UpdateSize * mDevice->frameSizeFromFmt()); + std::fill(mBuffer.begin(), mBuffer.end(), 0); + + return true; +} + +bool SndioPlayback::start() +{ + if(!sio_start(mSndHandle)) + { + ERR("Error starting playback\n"); + return false; + } + + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&SndioPlayback::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + catch(...) { + } + sio_stop(mSndHandle); + return false; +} + +void SndioPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + if(!sio_stop(mSndHandle)) + ERR("Error stopping device\n"); +} + + +struct SndioCapture final : public BackendBase { + SndioCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~SndioCapture() override; + + int recordProc(); + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + sio_hdl *mSndHandle{nullptr}; + + RingBufferPtr mRing; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(SndioCapture) +}; + +SndioCapture::~SndioCapture() +{ + if(mSndHandle) + sio_close(mSndHandle); + mSndHandle = nullptr; +} + +int SndioCapture::recordProc() +{ + SetRTPriority(); + althrd_setname(RECORD_THREAD_NAME); + + const ALuint frameSize{mDevice->frameSizeFromFmt()}; + + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + auto data = mRing->getWriteVector(); + size_t todo{data.first.len + data.second.len}; + if(todo == 0) + { + static char junk[4096]; + sio_read(mSndHandle, junk, + minz(sizeof(junk)/frameSize, mDevice->UpdateSize)*frameSize); + continue; + } + + size_t total{0u}; + data.first.len *= frameSize; + data.second.len *= frameSize; + todo = minz(todo, mDevice->UpdateSize) * frameSize; + while(total < todo) + { + if(!data.first.len) + data.first = data.second; + + size_t got{sio_read(mSndHandle, data.first.buf, minz(todo-total, data.first.len))}; + if(!got) + { + aluHandleDisconnect(mDevice, "Failed to read capture samples"); + break; + } + + data.first.buf += got; + data.first.len -= got; + total += got; + } + mRing->writeAdvance(total / frameSize); + } + + return 0; +} + + +void SndioCapture::open(const ALCchar *name) +{ + if(!name) + name = sndio_device; + else if(strcmp(name, sndio_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + mSndHandle = sio_open(nullptr, SIO_REC, 0); + if(mSndHandle == nullptr) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not open backend device"}; + + sio_par par; + sio_initpar(&par); + + switch(mDevice->FmtType) + { + case DevFmtByte: + par.bps = 1; + par.sig = 1; + break; + case DevFmtUByte: + par.bps = 1; + par.sig = 0; + break; + case DevFmtShort: + par.bps = 2; + par.sig = 1; + break; + case DevFmtUShort: + par.bps = 2; + par.sig = 0; + break; + case DevFmtInt: + par.bps = 4; + par.sig = 1; + break; + case DevFmtUInt: + par.bps = 4; + par.sig = 0; + break; + case DevFmtFloat: + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture samples not supported", + DevFmtTypeString(mDevice->FmtType)}; + } + par.bits = par.bps * 8; + par.le = SIO_LE_NATIVE; + par.msb = SIO_LE_NATIVE ? 0 : 1; + par.rchan = mDevice->channelsFromFmt(); + par.rate = mDevice->Frequency; + + par.appbufsz = maxu(mDevice->BufferSize, mDevice->Frequency/10); + par.round = minu(par.appbufsz, mDevice->Frequency/40); + + mDevice->UpdateSize = par.round; + mDevice->BufferSize = par.appbufsz; + + if(!sio_setpar(mSndHandle, &par) || !sio_getpar(mSndHandle, &par)) + throw al::backend_exception{ALC_INVALID_VALUE, "Failed to set device praameters"}; + + if(par.bits != par.bps*8) + throw al::backend_exception{ALC_INVALID_VALUE, + "Padded samples not supported (got %u of %u bits)", par.bits, par.bps*8}; + + if(!((mDevice->FmtType == DevFmtByte && par.bits == 8 && par.sig != 0) + || (mDevice->FmtType == DevFmtUByte && par.bits == 8 && par.sig == 0) + || (mDevice->FmtType == DevFmtShort && par.bits == 16 && par.sig != 0) + || (mDevice->FmtType == DevFmtUShort && par.bits == 16 && par.sig == 0) + || (mDevice->FmtType == DevFmtInt && par.bits == 32 && par.sig != 0) + || (mDevice->FmtType == DevFmtUInt && par.bits == 32 && par.sig == 0)) + || mDevice->channelsFromFmt() != par.rchan || mDevice->Frequency != par.rate) + throw al::backend_exception{ALC_INVALID_VALUE, + "Failed to set format %s %s %uhz, got %c%u %u-channel %uhz instead", + DevFmtTypeString(mDevice->FmtType), DevFmtChannelsString(mDevice->FmtChans), + mDevice->Frequency, par.sig?'s':'u', par.bits, par.rchan, par.rate}; + + mRing = RingBuffer::Create(mDevice->BufferSize, par.bps*par.rchan, false); + + SetDefaultChannelOrder(mDevice); + + mDevice->DeviceName = name; +} + +bool SndioCapture::start() +{ + if(!sio_start(mSndHandle)) + { + ERR("Error starting playback\n"); + return false; + } + + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&SndioCapture::recordProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create record thread: %s\n", e.what()); + } + catch(...) { + } + sio_stop(mSndHandle); + return false; +} + +void SndioCapture::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + if(!sio_stop(mSndHandle)) + ERR("Error stopping device\n"); +} + +ALCenum SndioCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + mRing->read(buffer, samples); + return ALC_NO_ERROR; +} + +ALCuint SndioCapture::availableSamples() +{ return static_cast(mRing->readSpace()); } + +} // namespace + +BackendFactory &SndIOBackendFactory::getFactory() +{ + static SndIOBackendFactory factory{}; + return factory; +} + +bool SndIOBackendFactory::init() +{ return true; } + +bool SndIOBackendFactory::querySupport(BackendType type) +{ return (type == BackendType::Playback || type == BackendType::Capture); } + +void SndIOBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + case DevProbe::Capture: + /* Includes null char. */ + outnames->append(sndio_device, sizeof(sndio_device)); + break; + } +} + +BackendPtr SndIOBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new SndioPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new SndioCapture{device}}; + return nullptr; +} diff --git a/alc/backends/sndio.h b/alc/backends/sndio.h new file mode 100644 index 0000000..1ed63d5 --- /dev/null +++ b/alc/backends/sndio.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_SNDIO_H +#define BACKENDS_SNDIO_H + +#include "backends/base.h" + +struct SndIOBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_SNDIO_H */ diff --git a/alc/backends/solaris.cpp b/alc/backends/solaris.cpp new file mode 100644 index 0000000..6823777 --- /dev/null +++ b/alc/backends/solaris.cpp @@ -0,0 +1,300 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/solaris.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "alconfig.h" +#include "threads.h" +#include "vector.h" +#include "compat.h" + +#include + + +namespace { + +constexpr ALCchar solaris_device[] = "Solaris Default"; + +std::string solaris_driver{"/dev/audio"}; + + +struct SolarisBackend final : public BackendBase { + SolarisBackend(ALCdevice *device) noexcept : BackendBase{device} { } + ~SolarisBackend() override; + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + int mFd{-1}; + + al::vector mBuffer; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(SolarisBackend) +}; + +SolarisBackend::~SolarisBackend() +{ + if(mFd != -1) + close(mFd); + mFd = -1; +} + +int SolarisBackend::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t frame_step{mDevice->channelsFromFmt()}; + const ALuint frame_size{mDevice->frameSizeFromFmt()}; + + std::unique_lock dlock{*this}; + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + pollfd pollitem{}; + pollitem.fd = mFd; + pollitem.events = POLLOUT; + + dlock.unlock(); + int pret{poll(&pollitem, 1, 1000)}; + dlock.lock(); + if(pret < 0) + { + if(errno == EINTR || errno == EAGAIN) + continue; + ERR("poll failed: %s\n", strerror(errno)); + aluHandleDisconnect(mDevice, "Failed to wait for playback buffer: %s", + strerror(errno)); + break; + } + else if(pret == 0) + { + WARN("poll timeout\n"); + continue; + } + + ALubyte *write_ptr{mBuffer.data()}; + size_t to_write{mBuffer.size()}; + aluMixData(mDevice, write_ptr, to_write/frame_size, frame_step); + while(to_write > 0 && !mKillNow.load(std::memory_order_acquire)) + { + ssize_t wrote{write(mFd, write_ptr, to_write)}; + if(wrote < 0) + { + if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) + continue; + ERR("write failed: %s\n", strerror(errno)); + aluHandleDisconnect(mDevice, "Failed to write playback samples: %s", + strerror(errno)); + break; + } + + to_write -= wrote; + write_ptr += wrote; + } + } + + return 0; +} + + +void SolarisBackend::open(const ALCchar *name) +{ + if(!name) + name = solaris_device; + else if(strcmp(name, solaris_device) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + + mFd = ::open(solaris_driver.c_str(), O_WRONLY); + if(mFd == -1) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not open %s: %s", + solaris_driver.c_str(), strerror(errno)}; + + mDevice->DeviceName = name; +} + +bool SolarisBackend::reset() +{ + audio_info_t info; + AUDIO_INITINFO(&info); + + info.play.sample_rate = mDevice->Frequency; + + if(mDevice->FmtChans != DevFmtMono) + mDevice->FmtChans = DevFmtStereo; + ALuint numChannels{mDevice->channelsFromFmt()}; + info.play.channels = numChannels; + + switch(mDevice->FmtType) + { + case DevFmtByte: + info.play.precision = 8; + info.play.encoding = AUDIO_ENCODING_LINEAR; + break; + case DevFmtUByte: + info.play.precision = 8; + info.play.encoding = AUDIO_ENCODING_LINEAR8; + break; + case DevFmtUShort: + case DevFmtInt: + case DevFmtUInt: + case DevFmtFloat: + mDevice->FmtType = DevFmtShort; + /* fall-through */ + case DevFmtShort: + info.play.precision = 16; + info.play.encoding = AUDIO_ENCODING_LINEAR; + break; + } + + ALuint frameSize{numChannels * mDevice->bytesFromFmt()}; + info.play.buffer_size = mDevice->BufferSize * frameSize; + + if(ioctl(mFd, AUDIO_SETINFO, &info) < 0) + { + ERR("ioctl failed: %s\n", strerror(errno)); + return false; + } + + if(mDevice->channelsFromFmt() != info.play.channels) + { + ERR("Failed to set %s, got %u channels instead\n", DevFmtChannelsString(mDevice->FmtChans), + info.play.channels); + return false; + } + + if(!((info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR8 && mDevice->FmtType == DevFmtUByte) || + (info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR && mDevice->FmtType == DevFmtByte) || + (info.play.precision == 16 && info.play.encoding == AUDIO_ENCODING_LINEAR && mDevice->FmtType == DevFmtShort) || + (info.play.precision == 32 && info.play.encoding == AUDIO_ENCODING_LINEAR && mDevice->FmtType == DevFmtInt))) + { + ERR("Could not set %s samples, got %d (0x%x)\n", DevFmtTypeString(mDevice->FmtType), + info.play.precision, info.play.encoding); + return false; + } + + mDevice->Frequency = info.play.sample_rate; + mDevice->BufferSize = info.play.buffer_size / frameSize; + mDevice->UpdateSize = mDevice->BufferSize / 2; + + SetDefaultChannelOrder(mDevice); + + mBuffer.resize(mDevice->UpdateSize * mDevice->frameSizeFromFmt()); + std::fill(mBuffer.begin(), mBuffer.end(), 0); + + return true; +} + +bool SolarisBackend::start() +{ + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&SolarisBackend::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Could not create playback thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void SolarisBackend::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + if(ioctl(mFd, AUDIO_DRAIN) < 0) + ERR("Error draining device: %s\n", strerror(errno)); +} + +} // namespace + +BackendFactory &SolarisBackendFactory::getFactory() +{ + static SolarisBackendFactory factory{}; + return factory; +} + +bool SolarisBackendFactory::init() +{ + if(auto devopt = ConfigValueStr(nullptr, "solaris", "device")) + solaris_driver = std::move(*devopt); + return true; +} + +bool SolarisBackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback; } + +void SolarisBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + { +#ifdef HAVE_STAT + struct stat buf; + if(stat(solaris_driver.c_str(), &buf) == 0) +#endif + outnames->append(solaris_device, sizeof(solaris_device)); + } + break; + + case DevProbe::Capture: + break; + } +} + +BackendPtr SolarisBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new SolarisBackend{device}}; + return nullptr; +} diff --git a/alc/backends/solaris.h b/alc/backends/solaris.h new file mode 100644 index 0000000..98b1059 --- /dev/null +++ b/alc/backends/solaris.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_SOLARIS_H +#define BACKENDS_SOLARIS_H + +#include "backends/base.h" + +struct SolarisBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_SOLARIS_H */ diff --git a/alc/backends/wasapi.cpp b/alc/backends/wasapi.cpp new file mode 100644 index 0000000..f97c863 --- /dev/null +++ b/alc/backends/wasapi.cpp @@ -0,0 +1,1777 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2011 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/wasapi.h" + +#define WIN32_LEAN_AND_MEAN +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WAVEFORMATEXTENSIBLE_ +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "ringbuffer.h" +#include "compat.h" +#include "converter.h" +#include "strutils.h" +#include "threads.h" + + +/* Some headers seem to define these as macros for __uuidof, which is annoying + * since some headers don't declare them at all. Hopefully the ifdef is enough + * to tell if they need to be declared. + */ +#ifndef KSDATAFORMAT_SUBTYPE_PCM +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); +#endif +#ifndef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); +#endif + +DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FormFactor, 0x1da5d803, 0xd492, 0x4edd, 0x8c,0x23, 0xe0,0xc0,0xff,0xee,0x7f,0x0e, 0); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23,0xe0, 0xc0,0xff,0xee,0x7f,0x0e, 4 ); + + +namespace { + +using std::chrono::milliseconds; +using std::chrono::seconds; + +using ReferenceTime = std::chrono::duration>; + +inline constexpr ReferenceTime operator "" _reftime(unsigned long long int n) noexcept +{ return ReferenceTime{static_cast(n)}; } + + +#define MONO SPEAKER_FRONT_CENTER +#define STEREO (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT) +#define QUAD (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT) +#define X5DOT1 (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT) +#define X5DOT1REAR (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT) +#define X6DOT1 (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT) +#define X7DOT1 (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT) +#define X7DOT1_WIDE (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_FRONT_LEFT_OF_CENTER|SPEAKER_FRONT_RIGHT_OF_CENTER) + +/* TODO: This can't be constexpr in C++11. */ +inline uint32_t MaskFromTopBits(uint32_t b) noexcept +{ + b |= b>>1; + b |= b>>2; + b |= b>>4; + b |= b>>8; + b |= b>>16; + return b; +} +const uint32_t MonoMask{MaskFromTopBits(MONO)}; +const uint32_t StereoMask{MaskFromTopBits(STEREO)}; +const uint32_t QuadMask{MaskFromTopBits(QUAD)}; +const uint32_t X51Mask{MaskFromTopBits(X5DOT1)}; +const uint32_t X51RearMask{MaskFromTopBits(X5DOT1REAR)}; +const uint32_t X61Mask{MaskFromTopBits(X6DOT1)}; +const uint32_t X71Mask{MaskFromTopBits(X7DOT1)}; +const uint32_t X71WideMask{MaskFromTopBits(X7DOT1_WIDE)}; + +#define DEVNAME_HEAD "OpenAL Soft on " + + +/* Scales the given reftime value, ceiling the result. */ +inline ALuint RefTime2Samples(const ReferenceTime &val, ALuint srate) +{ + const auto retval = (val*srate + (seconds{1}-1_reftime)) / seconds{1}; + return static_cast(retval); +} + + +class GuidPrinter { + char mMsg[64]; + +public: + GuidPrinter(const GUID &guid) + { + std::snprintf(mMsg, al::size(mMsg), "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + DWORD{guid.Data1}, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], + guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); + } + const char *c_str() const { return mMsg; } +}; + +struct PropVariant { + PROPVARIANT mProp; + +public: + PropVariant() { PropVariantInit(&mProp); } + ~PropVariant() { clear(); } + + void clear() { PropVariantClear(&mProp); } + + PROPVARIANT* get() noexcept { return &mProp; } + + PROPVARIANT& operator*() noexcept { return mProp; } + const PROPVARIANT& operator*() const noexcept { return mProp; } + + PROPVARIANT* operator->() noexcept { return &mProp; } + const PROPVARIANT* operator->() const noexcept { return &mProp; } +}; + +struct DevMap { + std::string name; + std::string endpoint_guid; // obtained from PKEY_AudioEndpoint_GUID , set to "Unknown device GUID" if absent. + std::wstring devid; + + template + DevMap(T0&& name_, T1&& guid_, T2&& devid_) + : name{std::forward(name_)} + , endpoint_guid{std::forward(guid_)} + , devid{std::forward(devid_)} + { } +}; + +bool checkName(const al::vector &list, const std::string &name) +{ + return std::find_if(list.cbegin(), list.cend(), + [&name](const DevMap &entry) -> bool + { return entry.name == name; } + ) != list.cend(); +} + +al::vector PlaybackDevices; +al::vector CaptureDevices; + + +using NameGUIDPair = std::pair; +NameGUIDPair get_device_name_and_guid(IMMDevice *device) +{ + std::string name{DEVNAME_HEAD}; + std::string guid; + + IPropertyStore *ps; + HRESULT hr = device->OpenPropertyStore(STGM_READ, &ps); + if(FAILED(hr)) + { + WARN("OpenPropertyStore failed: 0x%08lx\n", hr); + return { name+"Unknown Device Name", "Unknown Device GUID" }; + } + + PropVariant pvprop; + hr = ps->GetValue(reinterpret_cast(DEVPKEY_Device_FriendlyName), pvprop.get()); + if(FAILED(hr)) + { + WARN("GetValue Device_FriendlyName failed: 0x%08lx\n", hr); + name += "Unknown Device Name"; + } + else if(pvprop->vt == VT_LPWSTR) + name += wstr_to_utf8(pvprop->pwszVal); + else + { + WARN("Unexpected PROPVARIANT type: 0x%04x\n", pvprop->vt); + name += "Unknown Device Name"; + } + + pvprop.clear(); + hr = ps->GetValue(reinterpret_cast(PKEY_AudioEndpoint_GUID), pvprop.get()); + if(FAILED(hr)) + { + WARN("GetValue AudioEndpoint_GUID failed: 0x%08lx\n", hr); + guid = "Unknown Device GUID"; + } + else if(pvprop->vt == VT_LPWSTR) + guid = wstr_to_utf8(pvprop->pwszVal); + else + { + WARN("Unexpected PROPVARIANT type: 0x%04x\n", pvprop->vt); + guid = "Unknown Device GUID"; + } + + ps->Release(); + + return {name, guid}; +} + +void get_device_formfactor(IMMDevice *device, EndpointFormFactor *formfactor) +{ + IPropertyStore *ps; + HRESULT hr = device->OpenPropertyStore(STGM_READ, &ps); + if(FAILED(hr)) + { + WARN("OpenPropertyStore failed: 0x%08lx\n", hr); + return; + } + + PropVariant pvform; + hr = ps->GetValue(reinterpret_cast(PKEY_AudioEndpoint_FormFactor), pvform.get()); + if(FAILED(hr)) + WARN("GetValue AudioEndpoint_FormFactor failed: 0x%08lx\n", hr); + else if(pvform->vt == VT_UI4) + *formfactor = static_cast(pvform->ulVal); + else if(pvform->vt == VT_EMPTY) + *formfactor = UnknownFormFactor; + else + WARN("Unexpected PROPVARIANT type: 0x%04x\n", pvform->vt); + + ps->Release(); +} + + +void add_device(IMMDevice *device, const WCHAR *devid, al::vector &list) +{ + std::string basename, guidstr; + std::tie(basename, guidstr) = get_device_name_and_guid(device); + + int count{1}; + std::string newname{basename}; + while(checkName(list, newname)) + { + newname = basename; + newname += " #"; + newname += std::to_string(++count); + } + list.emplace_back(std::move(newname), std::move(guidstr), devid); + const DevMap &newentry = list.back(); + + TRACE("Got device \"%s\", \"%s\", \"%ls\"\n", newentry.name.c_str(), + newentry.endpoint_guid.c_str(), newentry.devid.c_str()); +} + +WCHAR *get_device_id(IMMDevice *device) +{ + WCHAR *devid; + + HRESULT hr = device->GetId(&devid); + if(FAILED(hr)) + { + ERR("Failed to get device id: %lx\n", hr); + return nullptr; + } + + return devid; +} + +HRESULT probe_devices(IMMDeviceEnumerator *devenum, EDataFlow flowdir, al::vector &list) +{ + IMMDeviceCollection *coll; + HRESULT hr{devenum->EnumAudioEndpoints(flowdir, DEVICE_STATE_ACTIVE, &coll)}; + if(FAILED(hr)) + { + ERR("Failed to enumerate audio endpoints: 0x%08lx\n", hr); + return hr; + } + + IMMDevice *defdev{nullptr}; + WCHAR *defdevid{nullptr}; + UINT count{0}; + hr = coll->GetCount(&count); + if(SUCCEEDED(hr) && count > 0) + { + list.clear(); + list.reserve(count); + + hr = devenum->GetDefaultAudioEndpoint(flowdir, eMultimedia, &defdev); + } + if(SUCCEEDED(hr) && defdev != nullptr) + { + defdevid = get_device_id(defdev); + if(defdevid) + add_device(defdev, defdevid, list); + } + + for(UINT i{0};i < count;++i) + { + IMMDevice *device; + hr = coll->Item(i, &device); + if(FAILED(hr)) continue; + + WCHAR *devid{get_device_id(device)}; + if(devid) + { + if(!defdevid || wcscmp(devid, defdevid) != 0) + add_device(device, devid, list); + CoTaskMemFree(devid); + } + device->Release(); + } + + if(defdev) defdev->Release(); + if(defdevid) CoTaskMemFree(defdevid); + coll->Release(); + + return S_OK; +} + + +bool MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX *in) +{ + *out = WAVEFORMATEXTENSIBLE{}; + if(in->wFormatTag == WAVE_FORMAT_EXTENSIBLE) + { + *out = *CONTAINING_RECORD(in, const WAVEFORMATEXTENSIBLE, Format); + out->Format.cbSize = sizeof(*out) - sizeof(out->Format); + } + else if(in->wFormatTag == WAVE_FORMAT_PCM) + { + out->Format = *in; + out->Format.cbSize = 0; + out->Samples.wValidBitsPerSample = out->Format.wBitsPerSample; + if(out->Format.nChannels == 1) + out->dwChannelMask = MONO; + else if(out->Format.nChannels == 2) + out->dwChannelMask = STEREO; + else + ERR("Unhandled PCM channel count: %d\n", out->Format.nChannels); + out->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + } + else if(in->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) + { + out->Format = *in; + out->Format.cbSize = 0; + out->Samples.wValidBitsPerSample = out->Format.wBitsPerSample; + if(out->Format.nChannels == 1) + out->dwChannelMask = MONO; + else if(out->Format.nChannels == 2) + out->dwChannelMask = STEREO; + else + ERR("Unhandled IEEE float channel count: %d\n", out->Format.nChannels); + out->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + } + else + { + ERR("Unhandled format tag: 0x%04x\n", in->wFormatTag); + return false; + } + return true; +} + +void TraceFormat(const char *msg, const WAVEFORMATEX *format) +{ + constexpr size_t fmtex_extra_size{sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX)}; + if(format->wFormatTag == WAVE_FORMAT_EXTENSIBLE && format->cbSize >= fmtex_extra_size) + { + const WAVEFORMATEXTENSIBLE *fmtex{ + CONTAINING_RECORD(format, const WAVEFORMATEXTENSIBLE, Format)}; + TRACE("%s:\n" + " FormatTag = 0x%04x\n" + " Channels = %d\n" + " SamplesPerSec = %lu\n" + " AvgBytesPerSec = %lu\n" + " BlockAlign = %d\n" + " BitsPerSample = %d\n" + " Size = %d\n" + " Samples = %d\n" + " ChannelMask = 0x%lx\n" + " SubFormat = %s\n", + msg, fmtex->Format.wFormatTag, fmtex->Format.nChannels, fmtex->Format.nSamplesPerSec, + fmtex->Format.nAvgBytesPerSec, fmtex->Format.nBlockAlign, fmtex->Format.wBitsPerSample, + fmtex->Format.cbSize, fmtex->Samples.wReserved, fmtex->dwChannelMask, + GuidPrinter{fmtex->SubFormat}.c_str()); + } + else + TRACE("%s:\n" + " FormatTag = 0x%04x\n" + " Channels = %d\n" + " SamplesPerSec = %lu\n" + " AvgBytesPerSec = %lu\n" + " BlockAlign = %d\n" + " BitsPerSample = %d\n" + " Size = %d\n", + msg, format->wFormatTag, format->nChannels, format->nSamplesPerSec, + format->nAvgBytesPerSec, format->nBlockAlign, format->wBitsPerSample, format->cbSize); +} + + +enum class MsgType { + OpenDevice, + ResetDevice, + StartDevice, + StopDevice, + CloseDevice, + EnumeratePlayback, + EnumerateCapture, + QuitThread, + + Count +}; + +constexpr char MessageStr[static_cast(MsgType::Count)][20]{ + "Open Device", + "Reset Device", + "Start Device", + "Stop Device", + "Close Device", + "Enumerate Playback", + "Enumerate Capture", + "Quit" +}; + + +/* Proxy interface used by the message handler. */ +struct WasapiProxy { + virtual ~WasapiProxy() = default; + + virtual HRESULT openProxy() = 0; + virtual void closeProxy() = 0; + + virtual HRESULT resetProxy() = 0; + virtual HRESULT startProxy() = 0; + virtual void stopProxy() = 0; + + struct Msg { + MsgType mType; + WasapiProxy *mProxy; + std::promise mPromise; + }; + static std::deque mMsgQueue; + static std::mutex mMsgQueueLock; + static std::condition_variable mMsgQueueCond; + + std::future pushMessage(MsgType type) + { + std::promise promise; + std::future future{promise.get_future()}; + { + std::lock_guard _{mMsgQueueLock}; + mMsgQueue.emplace_back(Msg{type, this, std::move(promise)}); + } + mMsgQueueCond.notify_one(); + return future; + } + + static std::future pushMessageStatic(MsgType type) + { + std::promise promise; + std::future future{promise.get_future()}; + { + std::lock_guard _{mMsgQueueLock}; + mMsgQueue.emplace_back(Msg{type, nullptr, std::move(promise)}); + } + mMsgQueueCond.notify_one(); + return future; + } + + static bool popMessage(Msg &msg) + { + std::unique_lock lock{mMsgQueueLock}; + while(mMsgQueue.empty()) + mMsgQueueCond.wait(lock); + msg = std::move(mMsgQueue.front()); + mMsgQueue.pop_front(); + return msg.mType != MsgType::QuitThread; + } + + static int messageHandler(std::promise *promise); +}; +std::deque WasapiProxy::mMsgQueue; +std::mutex WasapiProxy::mMsgQueueLock; +std::condition_variable WasapiProxy::mMsgQueueCond; + +int WasapiProxy::messageHandler(std::promise *promise) +{ + TRACE("Starting message thread\n"); + + HRESULT cohr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + if(FAILED(cohr)) + { + WARN("Failed to initialize COM: 0x%08lx\n", cohr); + promise->set_value(cohr); + return 0; + } + + void *ptr{}; + HRESULT hr{CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_INPROC_SERVER, + IID_IMMDeviceEnumerator, &ptr)}; + if(FAILED(hr)) + { + WARN("Failed to create IMMDeviceEnumerator instance: 0x%08lx\n", hr); + promise->set_value(hr); + CoUninitialize(); + return 0; + } + auto Enumerator = static_cast(ptr); + Enumerator->Release(); + Enumerator = nullptr; + CoUninitialize(); + + TRACE("Message thread initialization complete\n"); + promise->set_value(S_OK); + promise = nullptr; + + TRACE("Starting message loop\n"); + ALuint deviceCount{0}; + Msg msg; + while(popMessage(msg)) + { + TRACE("Got message \"%s\" (0x%04x, this=%p)\n", + MessageStr[static_cast(msg.mType)], static_cast(msg.mType), + decltype(std::declval()){msg.mProxy}); + + switch(msg.mType) + { + case MsgType::OpenDevice: + hr = cohr = S_OK; + if(++deviceCount == 1) + hr = cohr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + if(SUCCEEDED(hr)) + hr = msg.mProxy->openProxy(); + msg.mPromise.set_value(hr); + + if(FAILED(hr)) + { + if(--deviceCount == 0 && SUCCEEDED(cohr)) + CoUninitialize(); + } + continue; + + case MsgType::ResetDevice: + hr = msg.mProxy->resetProxy(); + msg.mPromise.set_value(hr); + continue; + + case MsgType::StartDevice: + hr = msg.mProxy->startProxy(); + msg.mPromise.set_value(hr); + continue; + + case MsgType::StopDevice: + msg.mProxy->stopProxy(); + msg.mPromise.set_value(S_OK); + continue; + + case MsgType::CloseDevice: + msg.mProxy->closeProxy(); + msg.mPromise.set_value(S_OK); + + if(--deviceCount == 0) + CoUninitialize(); + continue; + + case MsgType::EnumeratePlayback: + case MsgType::EnumerateCapture: + hr = cohr = S_OK; + if(++deviceCount == 1) + hr = cohr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + if(SUCCEEDED(hr)) + hr = CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, &ptr); + if(FAILED(hr)) + msg.mPromise.set_value(hr); + else + { + Enumerator = static_cast(ptr); + + if(msg.mType == MsgType::EnumeratePlayback) + hr = probe_devices(Enumerator, eRender, PlaybackDevices); + else if(msg.mType == MsgType::EnumerateCapture) + hr = probe_devices(Enumerator, eCapture, CaptureDevices); + msg.mPromise.set_value(hr); + + Enumerator->Release(); + Enumerator = nullptr; + } + + if(--deviceCount == 0 && SUCCEEDED(cohr)) + CoUninitialize(); + continue; + + default: + ERR("Unexpected message: %u\n", static_cast(msg.mType)); + msg.mPromise.set_value(E_FAIL); + continue; + } + } + TRACE("Message loop finished\n"); + + return 0; +} + + +struct WasapiPlayback final : public BackendBase, WasapiProxy { + WasapiPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~WasapiPlayback() override; + + int mixerProc(); + + void open(const ALCchar *name) override; + HRESULT openProxy() override; + void closeProxy() override; + + bool reset() override; + HRESULT resetProxy() override; + bool start() override; + HRESULT startProxy() override; + void stop() override; + void stopProxy() override; + + ClockLatency getClockLatency() override; + + std::wstring mDevId; + + IMMDevice *mMMDev{nullptr}; + IAudioClient *mClient{nullptr}; + IAudioRenderClient *mRender{nullptr}; + HANDLE mNotifyEvent{nullptr}; + + UINT32 mFrameStep{0u}; + std::atomic mPadding{0u}; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(WasapiPlayback) +}; + +WasapiPlayback::~WasapiPlayback() +{ + pushMessage(MsgType::CloseDevice).wait(); + + if(mNotifyEvent != nullptr) + CloseHandle(mNotifyEvent); + mNotifyEvent = nullptr; +} + + +FORCE_ALIGN int WasapiPlayback::mixerProc() +{ + HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + if(FAILED(hr)) + { + ERR("CoInitializeEx(nullptr, COINIT_MULTITHREADED) failed: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "COM init failed: 0x%08lx", hr); + return 1; + } + + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const ALuint update_size{mDevice->UpdateSize}; + const UINT32 buffer_len{mDevice->BufferSize}; + while(!mKillNow.load(std::memory_order_relaxed)) + { + UINT32 written; + hr = mClient->GetCurrentPadding(&written); + if(FAILED(hr)) + { + ERR("Failed to get padding: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "Failed to retrieve buffer padding: 0x%08lx", hr); + break; + } + mPadding.store(written, std::memory_order_relaxed); + + ALuint len{buffer_len - written}; + if(len < update_size) + { + DWORD res{WaitForSingleObjectEx(mNotifyEvent, 2000, FALSE)}; + if(res != WAIT_OBJECT_0) + ERR("WaitForSingleObjectEx error: 0x%lx\n", res); + continue; + } + + BYTE *buffer; + hr = mRender->GetBuffer(len, &buffer); + if(SUCCEEDED(hr)) + { + std::unique_lock dlock{*this}; + aluMixData(mDevice, buffer, len, mFrameStep); + mPadding.store(written + len, std::memory_order_relaxed); + dlock.unlock(); + hr = mRender->ReleaseBuffer(len, 0); + } + if(FAILED(hr)) + { + ERR("Failed to buffer data: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "Failed to send playback samples: 0x%08lx", hr); + break; + } + } + mPadding.store(0u, std::memory_order_release); + + CoUninitialize(); + return 0; +} + + +void WasapiPlayback::open(const ALCchar *name) +{ + HRESULT hr{S_OK}; + + mNotifyEvent = CreateEventW(nullptr, FALSE, FALSE, nullptr); + if(mNotifyEvent == nullptr) + { + ERR("Failed to create notify events: %lu\n", GetLastError()); + hr = E_FAIL; + } + + if(SUCCEEDED(hr)) + { + if(name) + { + if(PlaybackDevices.empty()) + pushMessage(MsgType::EnumeratePlayback).wait(); + + hr = E_FAIL; + auto iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name || entry.endpoint_guid == name; } + ); + if(iter == PlaybackDevices.cend()) + { + std::wstring wname{utf8_to_wstr(name)}; + iter = std::find_if(PlaybackDevices.cbegin(), PlaybackDevices.cend(), + [&wname](const DevMap &entry) -> bool + { return entry.devid == wname; } + ); + } + if(iter == PlaybackDevices.cend()) + WARN("Failed to find device name matching \"%s\"\n", name); + else + { + mDevId = iter->devid; + mDevice->DeviceName = iter->name; + hr = S_OK; + } + } + } + + if(SUCCEEDED(hr)) + hr = pushMessage(MsgType::OpenDevice).get(); + + if(FAILED(hr)) + { + if(mNotifyEvent != nullptr) + CloseHandle(mNotifyEvent); + mNotifyEvent = nullptr; + + mDevId.clear(); + + throw al::backend_exception{ALC_INVALID_VALUE, "Device init failed: 0x%08lx", hr}; + } +} + +HRESULT WasapiPlayback::openProxy() +{ + void *ptr; + HRESULT hr{CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, &ptr)}; + if(SUCCEEDED(hr)) + { + auto Enumerator = static_cast(ptr); + if(mDevId.empty()) + hr = Enumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &mMMDev); + else + hr = Enumerator->GetDevice(mDevId.c_str(), &mMMDev); + Enumerator->Release(); + } + if(SUCCEEDED(hr)) + hr = mMMDev->Activate(IID_IAudioClient, CLSCTX_INPROC_SERVER, nullptr, &ptr); + if(SUCCEEDED(hr)) + { + mClient = static_cast(ptr); + if(mDevice->DeviceName.empty()) + mDevice->DeviceName = get_device_name_and_guid(mMMDev).first; + } + + if(FAILED(hr)) + { + if(mMMDev) + mMMDev->Release(); + mMMDev = nullptr; + } + + return hr; +} + +void WasapiPlayback::closeProxy() +{ + if(mClient) + mClient->Release(); + mClient = nullptr; + + if(mMMDev) + mMMDev->Release(); + mMMDev = nullptr; +} + + +bool WasapiPlayback::reset() +{ + HRESULT hr{pushMessage(MsgType::ResetDevice).get()}; + if(FAILED(hr)) + throw al::backend_exception{ALC_INVALID_VALUE, "0x%08lx", hr}; + return true; +} + +HRESULT WasapiPlayback::resetProxy() +{ + if(mClient) + mClient->Release(); + mClient = nullptr; + + void *ptr; + HRESULT hr = mMMDev->Activate(IID_IAudioClient, CLSCTX_INPROC_SERVER, nullptr, &ptr); + if(FAILED(hr)) + { + ERR("Failed to reactivate audio client: 0x%08lx\n", hr); + return hr; + } + mClient = static_cast(ptr); + + WAVEFORMATEX *wfx; + hr = mClient->GetMixFormat(&wfx); + if(FAILED(hr)) + { + ERR("Failed to get mix format: 0x%08lx\n", hr); + return hr; + } + + WAVEFORMATEXTENSIBLE OutputType; + if(!MakeExtensible(&OutputType, wfx)) + { + CoTaskMemFree(wfx); + return E_FAIL; + } + CoTaskMemFree(wfx); + wfx = nullptr; + + const ReferenceTime per_time{ReferenceTime{seconds{mDevice->UpdateSize}} / mDevice->Frequency}; + const ReferenceTime buf_time{ReferenceTime{seconds{mDevice->BufferSize}} / mDevice->Frequency}; + + if(!mDevice->Flags.get()) + mDevice->Frequency = OutputType.Format.nSamplesPerSec; + if(!mDevice->Flags.get()) + { + const uint32_t chancount{OutputType.Format.nChannels}; + const DWORD chanmask{OutputType.dwChannelMask}; + if(chancount >= 8 && ((chanmask&X71Mask)==X7DOT1 || (chanmask&X71WideMask)==X7DOT1_WIDE)) + mDevice->FmtChans = DevFmtX71; + else if(chancount >= 7 && (chanmask&X61Mask) == X6DOT1) + mDevice->FmtChans = DevFmtX61; + else if(chancount >= 6 && (chanmask&X51Mask) == X5DOT1) + mDevice->FmtChans = DevFmtX51; + else if(chancount >= 6 && (chanmask&X51RearMask) == X5DOT1REAR) + mDevice->FmtChans = DevFmtX51Rear; + else if(chancount >= 4 && (chanmask&QuadMask) == QUAD) + mDevice->FmtChans = DevFmtQuad; + else if(chancount >= 2 && (chanmask&StereoMask) == STEREO) + mDevice->FmtChans = DevFmtStereo; + else if(chancount >= 1 && (chanmask&MonoMask) == MONO) + mDevice->FmtChans = DevFmtMono; + else + ERR("Unhandled channel config: %d -- 0x%08lx\n", chancount, chanmask); + } + + OutputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + switch(mDevice->FmtChans) + { + case DevFmtMono: + OutputType.Format.nChannels = 1; + OutputType.dwChannelMask = MONO; + break; + case DevFmtAmbi3D: + mDevice->FmtChans = DevFmtStereo; + /*fall-through*/ + case DevFmtStereo: + OutputType.Format.nChannels = 2; + OutputType.dwChannelMask = STEREO; + break; + case DevFmtQuad: + OutputType.Format.nChannels = 4; + OutputType.dwChannelMask = QUAD; + break; + case DevFmtX51: + OutputType.Format.nChannels = 6; + OutputType.dwChannelMask = X5DOT1; + break; + case DevFmtX51Rear: + OutputType.Format.nChannels = 6; + OutputType.dwChannelMask = X5DOT1REAR; + break; + case DevFmtX61: + OutputType.Format.nChannels = 7; + OutputType.dwChannelMask = X6DOT1; + break; + case DevFmtX71: + OutputType.Format.nChannels = 8; + OutputType.dwChannelMask = X7DOT1; + break; + } + switch(mDevice->FmtType) + { + case DevFmtByte: + mDevice->FmtType = DevFmtUByte; + /* fall-through */ + case DevFmtUByte: + OutputType.Format.wBitsPerSample = 8; + OutputType.Samples.wValidBitsPerSample = 8; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case DevFmtUShort: + mDevice->FmtType = DevFmtShort; + /* fall-through */ + case DevFmtShort: + OutputType.Format.wBitsPerSample = 16; + OutputType.Samples.wValidBitsPerSample = 16; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case DevFmtUInt: + mDevice->FmtType = DevFmtInt; + /* fall-through */ + case DevFmtInt: + OutputType.Format.wBitsPerSample = 32; + OutputType.Samples.wValidBitsPerSample = 32; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case DevFmtFloat: + OutputType.Format.wBitsPerSample = 32; + OutputType.Samples.wValidBitsPerSample = 32; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + break; + } + OutputType.Format.nSamplesPerSec = mDevice->Frequency; + + OutputType.Format.nBlockAlign = static_cast(OutputType.Format.nChannels * + OutputType.Format.wBitsPerSample / 8); + OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec * + OutputType.Format.nBlockAlign; + + TraceFormat("Requesting playback format", &OutputType.Format); + hr = mClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &OutputType.Format, &wfx); + if(FAILED(hr)) + { + ERR("Failed to check format support: 0x%08lx\n", hr); + hr = mClient->GetMixFormat(&wfx); + } + if(FAILED(hr)) + { + ERR("Failed to find a supported format: 0x%08lx\n", hr); + return hr; + } + + if(wfx != nullptr) + { + TraceFormat("Got playback format", wfx); + if(!MakeExtensible(&OutputType, wfx)) + { + CoTaskMemFree(wfx); + return E_FAIL; + } + CoTaskMemFree(wfx); + wfx = nullptr; + + mDevice->Frequency = OutputType.Format.nSamplesPerSec; + const uint32_t chancount{OutputType.Format.nChannels}; + const DWORD chanmask{OutputType.dwChannelMask}; + if(chancount >= 8 && ((chanmask&X71Mask)==X7DOT1 || (chanmask&X71WideMask)==X7DOT1_WIDE)) + mDevice->FmtChans = DevFmtX71; + else if(chancount >= 7 && (chanmask&X61Mask) == X6DOT1) + mDevice->FmtChans = DevFmtX61; + else if(chancount >= 6 && (chanmask&X51Mask) == X5DOT1) + mDevice->FmtChans = DevFmtX51; + else if(chancount >= 6 && (chanmask&X51RearMask) == X5DOT1REAR) + mDevice->FmtChans = DevFmtX51Rear; + else if(chancount >= 4 && (chanmask&QuadMask) == QUAD) + mDevice->FmtChans = DevFmtQuad; + else if(chancount >= 2 && (chanmask&StereoMask) == STEREO) + mDevice->FmtChans = DevFmtStereo; + else if(chancount >= 1 && (chanmask&MonoMask) == MONO) + mDevice->FmtChans = DevFmtMono; + else + { + ERR("Unhandled extensible channels: %d -- 0x%08lx\n", OutputType.Format.nChannels, + OutputType.dwChannelMask); + mDevice->FmtChans = DevFmtStereo; + OutputType.Format.nChannels = 2; + OutputType.dwChannelMask = STEREO; + } + + if(IsEqualGUID(OutputType.SubFormat, KSDATAFORMAT_SUBTYPE_PCM)) + { + if(OutputType.Format.wBitsPerSample == 8) + mDevice->FmtType = DevFmtUByte; + else if(OutputType.Format.wBitsPerSample == 16) + mDevice->FmtType = DevFmtShort; + else if(OutputType.Format.wBitsPerSample == 32) + mDevice->FmtType = DevFmtInt; + else + { + mDevice->FmtType = DevFmtShort; + OutputType.Format.wBitsPerSample = 16; + } + } + else if(IsEqualGUID(OutputType.SubFormat, KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + { + mDevice->FmtType = DevFmtFloat; + OutputType.Format.wBitsPerSample = 32; + } + else + { + ERR("Unhandled format sub-type: %s\n", GuidPrinter{OutputType.SubFormat}.c_str()); + mDevice->FmtType = DevFmtShort; + if(OutputType.Format.wFormatTag != WAVE_FORMAT_EXTENSIBLE) + OutputType.Format.wFormatTag = WAVE_FORMAT_PCM; + OutputType.Format.wBitsPerSample = 16; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + } + OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample; + } + mFrameStep = OutputType.Format.nChannels; + + EndpointFormFactor formfactor{UnknownFormFactor}; + get_device_formfactor(mMMDev, &formfactor); + mDevice->IsHeadphones = (mDevice->FmtChans == DevFmtStereo + && (formfactor == Headphones || formfactor == Headset)); + + SetDefaultWFXChannelOrder(mDevice); + + hr = mClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + buf_time.count(), 0, &OutputType.Format, nullptr); + if(FAILED(hr)) + { + ERR("Failed to initialize audio client: 0x%08lx\n", hr); + return hr; + } + + UINT32 buffer_len{}; + ReferenceTime min_per{}; + hr = mClient->GetDevicePeriod(&reinterpret_cast(min_per), nullptr); + if(SUCCEEDED(hr)) + hr = mClient->GetBufferSize(&buffer_len); + if(FAILED(hr)) + { + ERR("Failed to get audio buffer info: 0x%08lx\n", hr); + return hr; + } + + /* Find the nearest multiple of the period size to the update size */ + if(min_per < per_time) + min_per *= maxi64((per_time + min_per/2) / min_per, 1); + mDevice->UpdateSize = minu(RefTime2Samples(min_per, mDevice->Frequency), buffer_len/2); + mDevice->BufferSize = buffer_len; + + hr = mClient->SetEventHandle(mNotifyEvent); + if(FAILED(hr)) + { + ERR("Failed to set event handle: 0x%08lx\n", hr); + return hr; + } + + return hr; +} + + +bool WasapiPlayback::start() +{ + HRESULT hr{pushMessage(MsgType::StartDevice).get()}; + return SUCCEEDED(hr) ? true : false; +} + +HRESULT WasapiPlayback::startProxy() +{ + ResetEvent(mNotifyEvent); + + HRESULT hr = mClient->Start(); + if(FAILED(hr)) + { + ERR("Failed to start audio client: 0x%08lx\n", hr); + return hr; + } + + void *ptr; + hr = mClient->GetService(IID_IAudioRenderClient, &ptr); + if(SUCCEEDED(hr)) + { + mRender = static_cast(ptr); + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&WasapiPlayback::mixerProc), this}; + } + catch(...) { + mRender->Release(); + mRender = nullptr; + ERR("Failed to start thread\n"); + hr = E_FAIL; + } + } + + if(FAILED(hr)) + mClient->Stop(); + + return hr; +} + + +void WasapiPlayback::stop() +{ pushMessage(MsgType::StopDevice).wait(); } + +void WasapiPlayback::stopProxy() +{ + if(!mRender || !mThread.joinable()) + return; + + mKillNow.store(true, std::memory_order_release); + mThread.join(); + + mRender->Release(); + mRender = nullptr; + mClient->Stop(); +} + + +ClockLatency WasapiPlayback::getClockLatency() +{ + ClockLatency ret; + + std::lock_guard _{*this}; + ret.ClockTime = GetDeviceClockTime(mDevice); + ret.Latency = std::chrono::seconds{mPadding.load(std::memory_order_relaxed)}; + ret.Latency /= mDevice->Frequency; + + return ret; +} + + +struct WasapiCapture final : public BackendBase, WasapiProxy { + WasapiCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~WasapiCapture() override; + + int recordProc(); + + void open(const ALCchar *name) override; + HRESULT openProxy() override; + void closeProxy() override; + + HRESULT resetProxy() override; + bool start() override; + HRESULT startProxy() override; + void stop() override; + void stopProxy() override; + + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + std::wstring mDevId; + + IMMDevice *mMMDev{nullptr}; + IAudioClient *mClient{nullptr}; + IAudioCaptureClient *mCapture{nullptr}; + HANDLE mNotifyEvent{nullptr}; + + ChannelConverter mChannelConv{}; + SampleConverterPtr mSampleConv; + RingBufferPtr mRing; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(WasapiCapture) +}; + +WasapiCapture::~WasapiCapture() +{ + pushMessage(MsgType::CloseDevice).wait(); + + if(mNotifyEvent != nullptr) + CloseHandle(mNotifyEvent); + mNotifyEvent = nullptr; +} + + +FORCE_ALIGN int WasapiCapture::recordProc() +{ + HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + if(FAILED(hr)) + { + ERR("CoInitializeEx(nullptr, COINIT_MULTITHREADED) failed: 0x%08lx\n", hr); + aluHandleDisconnect(mDevice, "COM init failed: 0x%08lx", hr); + return 1; + } + + althrd_setname(RECORD_THREAD_NAME); + + al::vector samples; + while(!mKillNow.load(std::memory_order_relaxed)) + { + UINT32 avail; + hr = mCapture->GetNextPacketSize(&avail); + if(FAILED(hr)) + ERR("Failed to get next packet size: 0x%08lx\n", hr); + else if(avail > 0) + { + UINT32 numsamples; + DWORD flags; + BYTE *rdata; + + hr = mCapture->GetBuffer(&rdata, &numsamples, &flags, nullptr, nullptr); + if(FAILED(hr)) + ERR("Failed to get capture buffer: 0x%08lx\n", hr); + else + { + if(mChannelConv.is_active()) + { + samples.resize(numsamples*2); + mChannelConv.convert(rdata, samples.data(), numsamples); + rdata = reinterpret_cast(samples.data()); + } + + auto data = mRing->getWriteVector(); + + size_t dstframes; + if(mSampleConv) + { + const ALvoid *srcdata{rdata}; + ALuint srcframes{numsamples}; + + dstframes = mSampleConv->convert(&srcdata, &srcframes, data.first.buf, + static_cast(minz(data.first.len, INT_MAX))); + if(srcframes > 0 && dstframes == data.first.len && data.second.len > 0) + { + /* If some source samples remain, all of the first dest + * block was filled, and there's space in the second + * dest block, do another run for the second block. + */ + dstframes += mSampleConv->convert(&srcdata, &srcframes, data.second.buf, + static_cast(minz(data.second.len, INT_MAX))); + } + } + else + { + const auto framesize = static_cast(mDevice->frameSizeFromFmt()); + size_t len1{minz(data.first.len, numsamples)}; + size_t len2{minz(data.second.len, numsamples-len1)}; + + memcpy(data.first.buf, rdata, len1*framesize); + if(len2 > 0) + memcpy(data.second.buf, rdata+len1*framesize, len2*framesize); + dstframes = len1 + len2; + } + + mRing->writeAdvance(dstframes); + + hr = mCapture->ReleaseBuffer(numsamples); + if(FAILED(hr)) ERR("Failed to release capture buffer: 0x%08lx\n", hr); + } + } + + if(FAILED(hr)) + { + aluHandleDisconnect(mDevice, "Failed to capture samples: 0x%08lx", hr); + break; + } + + DWORD res{WaitForSingleObjectEx(mNotifyEvent, 2000, FALSE)}; + if(res != WAIT_OBJECT_0) + ERR("WaitForSingleObjectEx error: 0x%lx\n", res); + } + + CoUninitialize(); + return 0; +} + + +void WasapiCapture::open(const ALCchar *name) +{ + HRESULT hr{S_OK}; + + mNotifyEvent = CreateEventW(nullptr, FALSE, FALSE, nullptr); + if(mNotifyEvent == nullptr) + { + ERR("Failed to create notify event: %lu\n", GetLastError()); + hr = E_FAIL; + } + + if(SUCCEEDED(hr)) + { + if(name) + { + if(CaptureDevices.empty()) + pushMessage(MsgType::EnumerateCapture).wait(); + + hr = E_FAIL; + auto iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [name](const DevMap &entry) -> bool + { return entry.name == name || entry.endpoint_guid == name; } + ); + if(iter == CaptureDevices.cend()) + { + std::wstring wname{utf8_to_wstr(name)}; + iter = std::find_if(CaptureDevices.cbegin(), CaptureDevices.cend(), + [&wname](const DevMap &entry) -> bool + { return entry.devid == wname; } + ); + } + if(iter == CaptureDevices.cend()) + WARN("Failed to find device name matching \"%s\"\n", name); + else + { + mDevId = iter->devid; + mDevice->DeviceName = iter->name; + hr = S_OK; + } + } + } + + if(SUCCEEDED(hr)) + hr = pushMessage(MsgType::OpenDevice).get(); + + if(FAILED(hr)) + { + if(mNotifyEvent != nullptr) + CloseHandle(mNotifyEvent); + mNotifyEvent = nullptr; + + mDevId.clear(); + + throw al::backend_exception{ALC_INVALID_VALUE, "Device init failed: 0x%08lx", hr}; + } + + hr = pushMessage(MsgType::ResetDevice).get(); + if(FAILED(hr)) + { + if(hr == E_OUTOFMEMORY) + throw al::backend_exception{ALC_OUT_OF_MEMORY, "Out of memory"}; + throw al::backend_exception{ALC_INVALID_VALUE, "Device reset failed"}; + } +} + +HRESULT WasapiCapture::openProxy() +{ + void *ptr; + HRESULT hr{CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_INPROC_SERVER, + IID_IMMDeviceEnumerator, &ptr)}; + if(SUCCEEDED(hr)) + { + auto Enumerator = static_cast(ptr); + if(mDevId.empty()) + hr = Enumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, &mMMDev); + else + hr = Enumerator->GetDevice(mDevId.c_str(), &mMMDev); + Enumerator->Release(); + } + if(SUCCEEDED(hr)) + hr = mMMDev->Activate(IID_IAudioClient, CLSCTX_INPROC_SERVER, nullptr, &ptr); + if(SUCCEEDED(hr)) + { + mClient = static_cast(ptr); + if(mDevice->DeviceName.empty()) + mDevice->DeviceName = get_device_name_and_guid(mMMDev).first; + } + + if(FAILED(hr)) + { + if(mMMDev) + mMMDev->Release(); + mMMDev = nullptr; + } + + return hr; +} + +void WasapiCapture::closeProxy() +{ + if(mClient) + mClient->Release(); + mClient = nullptr; + + if(mMMDev) + mMMDev->Release(); + mMMDev = nullptr; +} + +HRESULT WasapiCapture::resetProxy() +{ + if(mClient) + mClient->Release(); + mClient = nullptr; + + void *ptr; + HRESULT hr{mMMDev->Activate(IID_IAudioClient, CLSCTX_INPROC_SERVER, nullptr, &ptr)}; + if(FAILED(hr)) + { + ERR("Failed to reactivate audio client: 0x%08lx\n", hr); + return hr; + } + mClient = static_cast(ptr); + + // Make sure buffer is at least 100ms in size + ReferenceTime buf_time{ReferenceTime{seconds{mDevice->BufferSize}} / mDevice->Frequency}; + buf_time = std::max(buf_time, ReferenceTime{milliseconds{100}}); + + WAVEFORMATEXTENSIBLE OutputType{}; + OutputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + switch(mDevice->FmtChans) + { + case DevFmtMono: + OutputType.Format.nChannels = 1; + OutputType.dwChannelMask = MONO; + break; + case DevFmtStereo: + OutputType.Format.nChannels = 2; + OutputType.dwChannelMask = STEREO; + break; + case DevFmtQuad: + OutputType.Format.nChannels = 4; + OutputType.dwChannelMask = QUAD; + break; + case DevFmtX51: + OutputType.Format.nChannels = 6; + OutputType.dwChannelMask = X5DOT1; + break; + case DevFmtX51Rear: + OutputType.Format.nChannels = 6; + OutputType.dwChannelMask = X5DOT1REAR; + break; + case DevFmtX61: + OutputType.Format.nChannels = 7; + OutputType.dwChannelMask = X6DOT1; + break; + case DevFmtX71: + OutputType.Format.nChannels = 8; + OutputType.dwChannelMask = X7DOT1; + break; + + case DevFmtAmbi3D: + return E_FAIL; + } + switch(mDevice->FmtType) + { + /* NOTE: Signedness doesn't matter, the converter will handle it. */ + case DevFmtByte: + case DevFmtUByte: + OutputType.Format.wBitsPerSample = 8; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case DevFmtShort: + case DevFmtUShort: + OutputType.Format.wBitsPerSample = 16; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case DevFmtInt: + case DevFmtUInt: + OutputType.Format.wBitsPerSample = 32; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case DevFmtFloat: + OutputType.Format.wBitsPerSample = 32; + OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + break; + } + OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample; + OutputType.Format.nSamplesPerSec = mDevice->Frequency; + + OutputType.Format.nBlockAlign = static_cast(OutputType.Format.nChannels * + OutputType.Format.wBitsPerSample / 8); + OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec * + OutputType.Format.nBlockAlign; + OutputType.Format.cbSize = sizeof(OutputType) - sizeof(OutputType.Format); + + TraceFormat("Requesting capture format", &OutputType.Format); + WAVEFORMATEX *wfx; + hr = mClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &OutputType.Format, &wfx); + if(FAILED(hr)) + { + ERR("Failed to check format support: 0x%08lx\n", hr); + return hr; + } + + mSampleConv = nullptr; + mChannelConv = {}; + + if(wfx != nullptr) + { + TraceFormat("Got capture format", wfx); + if(!(wfx->nChannels == OutputType.Format.nChannels || + (wfx->nChannels == 1 && OutputType.Format.nChannels == 2) || + (wfx->nChannels == 2 && OutputType.Format.nChannels == 1))) + { + ERR("Failed to get matching format, wanted: %s %s %uhz, got: %d channel%s %d-bit %luhz\n", + DevFmtChannelsString(mDevice->FmtChans), DevFmtTypeString(mDevice->FmtType), + mDevice->Frequency, wfx->nChannels, (wfx->nChannels==1)?"":"s", wfx->wBitsPerSample, + wfx->nSamplesPerSec); + CoTaskMemFree(wfx); + return E_FAIL; + } + + if(!MakeExtensible(&OutputType, wfx)) + { + CoTaskMemFree(wfx); + return E_FAIL; + } + CoTaskMemFree(wfx); + wfx = nullptr; + } + + DevFmtType srcType; + if(IsEqualGUID(OutputType.SubFormat, KSDATAFORMAT_SUBTYPE_PCM)) + { + if(OutputType.Format.wBitsPerSample == 8) + srcType = DevFmtUByte; + else if(OutputType.Format.wBitsPerSample == 16) + srcType = DevFmtShort; + else if(OutputType.Format.wBitsPerSample == 32) + srcType = DevFmtInt; + else + { + ERR("Unhandled integer bit depth: %d\n", OutputType.Format.wBitsPerSample); + return E_FAIL; + } + } + else if(IsEqualGUID(OutputType.SubFormat, KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + { + if(OutputType.Format.wBitsPerSample == 32) + srcType = DevFmtFloat; + else + { + ERR("Unhandled float bit depth: %d\n", OutputType.Format.wBitsPerSample); + return E_FAIL; + } + } + else + { + ERR("Unhandled format sub-type: %s\n", GuidPrinter{OutputType.SubFormat}.c_str()); + return E_FAIL; + } + + if(mDevice->FmtChans == DevFmtMono && OutputType.Format.nChannels == 2) + { + mChannelConv = ChannelConverter{srcType, DevFmtStereo, mDevice->FmtChans}; + TRACE("Created %s stereo-to-mono converter\n", DevFmtTypeString(srcType)); + /* The channel converter always outputs float, so change the input type + * for the resampler/type-converter. + */ + srcType = DevFmtFloat; + } + else if(mDevice->FmtChans == DevFmtStereo && OutputType.Format.nChannels == 1) + { + mChannelConv = ChannelConverter{srcType, DevFmtMono, mDevice->FmtChans}; + TRACE("Created %s mono-to-stereo converter\n", DevFmtTypeString(srcType)); + srcType = DevFmtFloat; + } + + if(mDevice->Frequency != OutputType.Format.nSamplesPerSec || mDevice->FmtType != srcType) + { + mSampleConv = CreateSampleConverter(srcType, mDevice->FmtType, mDevice->channelsFromFmt(), + OutputType.Format.nSamplesPerSec, mDevice->Frequency, Resampler::FastBSinc24); + if(!mSampleConv) + { + ERR("Failed to create converter for %s format, dst: %s %uhz, src: %s %luhz\n", + DevFmtChannelsString(mDevice->FmtChans), DevFmtTypeString(mDevice->FmtType), + mDevice->Frequency, DevFmtTypeString(srcType), OutputType.Format.nSamplesPerSec); + return E_FAIL; + } + TRACE("Created converter for %s format, dst: %s %uhz, src: %s %luhz\n", + DevFmtChannelsString(mDevice->FmtChans), DevFmtTypeString(mDevice->FmtType), + mDevice->Frequency, DevFmtTypeString(srcType), OutputType.Format.nSamplesPerSec); + } + + hr = mClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + buf_time.count(), 0, &OutputType.Format, nullptr); + if(FAILED(hr)) + { + ERR("Failed to initialize audio client: 0x%08lx\n", hr); + return hr; + } + + UINT32 buffer_len{}; + ReferenceTime min_per{}; + hr = mClient->GetDevicePeriod(&reinterpret_cast(min_per), nullptr); + if(SUCCEEDED(hr)) + hr = mClient->GetBufferSize(&buffer_len); + if(FAILED(hr)) + { + ERR("Failed to get buffer size: 0x%08lx\n", hr); + return hr; + } + mDevice->UpdateSize = RefTime2Samples(min_per, mDevice->Frequency); + mDevice->BufferSize = buffer_len; + + mRing = RingBuffer::Create(buffer_len, mDevice->frameSizeFromFmt(), false); + + hr = mClient->SetEventHandle(mNotifyEvent); + if(FAILED(hr)) + { + ERR("Failed to set event handle: 0x%08lx\n", hr); + return hr; + } + + return hr; +} + + +bool WasapiCapture::start() +{ + HRESULT hr{pushMessage(MsgType::StartDevice).get()}; + return SUCCEEDED(hr) ? true : false; +} + +HRESULT WasapiCapture::startProxy() +{ + ResetEvent(mNotifyEvent); + + HRESULT hr{mClient->Start()}; + if(FAILED(hr)) + { + ERR("Failed to start audio client: 0x%08lx\n", hr); + return hr; + } + + void *ptr; + hr = mClient->GetService(IID_IAudioCaptureClient, &ptr); + if(SUCCEEDED(hr)) + { + mCapture = static_cast(ptr); + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&WasapiCapture::recordProc), this}; + } + catch(...) { + mCapture->Release(); + mCapture = nullptr; + ERR("Failed to start thread\n"); + hr = E_FAIL; + } + } + + if(FAILED(hr)) + { + mClient->Stop(); + mClient->Reset(); + } + + return hr; +} + + +void WasapiCapture::stop() +{ pushMessage(MsgType::StopDevice).wait(); } + +void WasapiCapture::stopProxy() +{ + if(!mCapture || !mThread.joinable()) + return; + + mKillNow.store(true, std::memory_order_release); + mThread.join(); + + mCapture->Release(); + mCapture = nullptr; + mClient->Stop(); + mClient->Reset(); +} + + +ALCuint WasapiCapture::availableSamples() +{ return static_cast(mRing->readSpace()); } + +ALCenum WasapiCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + mRing->read(buffer, samples); + return ALC_NO_ERROR; +} + +} // namespace + + +bool WasapiBackendFactory::init() +{ + static HRESULT InitResult{E_FAIL}; + + if(FAILED(InitResult)) try + { + std::promise promise; + auto future = promise.get_future(); + + std::thread{&WasapiProxy::messageHandler, &promise}.detach(); + InitResult = future.get(); + } + catch(...) { + } + + return SUCCEEDED(InitResult) ? ALC_TRUE : ALC_FALSE; +} + +bool WasapiBackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback || type == BackendType::Capture; } + +void WasapiBackendFactory::probe(DevProbe type, std::string *outnames) +{ + auto add_device = [outnames](const DevMap &entry) -> void + { + /* +1 to also append the null char (to ensure a null-separated list and + * double-null terminated list). + */ + outnames->append(entry.name.c_str(), entry.name.length()+1); + }; + HRESULT hr{}; + switch(type) + { + case DevProbe::Playback: + hr = WasapiProxy::pushMessageStatic(MsgType::EnumeratePlayback).get(); + if(SUCCEEDED(hr)) + std::for_each(PlaybackDevices.cbegin(), PlaybackDevices.cend(), add_device); + break; + + case DevProbe::Capture: + hr = WasapiProxy::pushMessageStatic(MsgType::EnumerateCapture).get(); + if(SUCCEEDED(hr)) + std::for_each(CaptureDevices.cbegin(), CaptureDevices.cend(), add_device); + break; + } +} + +BackendPtr WasapiBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new WasapiPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new WasapiCapture{device}}; + return nullptr; +} + +BackendFactory &WasapiBackendFactory::getFactory() +{ + static WasapiBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/wasapi.h b/alc/backends/wasapi.h new file mode 100644 index 0000000..067dd25 --- /dev/null +++ b/alc/backends/wasapi.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_WASAPI_H +#define BACKENDS_WASAPI_H + +#include "backends/base.h" + +struct WasapiBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_WASAPI_H */ diff --git a/alc/backends/wave.cpp b/alc/backends/wave.cpp new file mode 100644 index 0000000..4f35797 --- /dev/null +++ b/alc/backends/wave.cpp @@ -0,0 +1,403 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/wave.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" + +#include "albyte.h" +#include "alcmain.h" +#include "alconfig.h" +#include "alexcpt.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alu.h" +#include "compat.h" +#include "endiantest.h" +#include "logging.h" +#include "strutils.h" +#include "threads.h" +#include "vector.h" + + +namespace { + +using std::chrono::seconds; +using std::chrono::milliseconds; +using std::chrono::nanoseconds; + +constexpr ALCchar waveDevice[] = "Wave File Writer"; + +constexpr ALubyte SUBTYPE_PCM[]{ + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, + 0x00, 0x38, 0x9b, 0x71 +}; +constexpr ALubyte SUBTYPE_FLOAT[]{ + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, + 0x00, 0x38, 0x9b, 0x71 +}; + +constexpr ALubyte SUBTYPE_BFORMAT_PCM[]{ + 0x01, 0x00, 0x00, 0x00, 0x21, 0x07, 0xd3, 0x11, 0x86, 0x44, 0xc8, 0xc1, + 0xca, 0x00, 0x00, 0x00 +}; + +constexpr ALubyte SUBTYPE_BFORMAT_FLOAT[]{ + 0x03, 0x00, 0x00, 0x00, 0x21, 0x07, 0xd3, 0x11, 0x86, 0x44, 0xc8, 0xc1, + 0xca, 0x00, 0x00, 0x00 +}; + +void fwrite16le(ALushort val, FILE *f) +{ + ALubyte data[2]{ static_cast(val&0xff), static_cast((val>>8)&0xff) }; + fwrite(data, 1, 2, f); +} + +void fwrite32le(ALuint val, FILE *f) +{ + ALubyte data[4]{ static_cast(val&0xff), static_cast((val>>8)&0xff), + static_cast((val>>16)&0xff), static_cast((val>>24)&0xff) }; + fwrite(data, 1, 4, f); +} + + +struct WaveBackend final : public BackendBase { + WaveBackend(ALCdevice *device) noexcept : BackendBase{device} { } + ~WaveBackend() override; + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + FILE *mFile{nullptr}; + long mDataStart{-1}; + + al::vector mBuffer; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(WaveBackend) +}; + +WaveBackend::~WaveBackend() +{ + if(mFile) + fclose(mFile); + mFile = nullptr; +} + +int WaveBackend::mixerProc() +{ + const milliseconds restTime{mDevice->UpdateSize*1000/mDevice->Frequency / 2}; + + althrd_setname(MIXER_THREAD_NAME); + + const size_t frameStep{mDevice->channelsFromFmt()}; + const ALuint frameSize{mDevice->frameSizeFromFmt()}; + + int64_t done{0}; + auto start = std::chrono::steady_clock::now(); + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + auto now = std::chrono::steady_clock::now(); + + /* This converts from nanoseconds to nanosamples, then to samples. */ + int64_t avail{std::chrono::duration_cast((now-start) * + mDevice->Frequency).count()}; + if(avail-done < mDevice->UpdateSize) + { + std::this_thread::sleep_for(restTime); + continue; + } + while(avail-done >= mDevice->UpdateSize) + { + { + std::lock_guard _{*this}; + aluMixData(mDevice, mBuffer.data(), mDevice->UpdateSize, frameStep); + } + done += mDevice->UpdateSize; + + if(!IS_LITTLE_ENDIAN) + { + const ALuint bytesize{mDevice->bytesFromFmt()}; + + if(bytesize == 2) + { + ALushort *samples = reinterpret_cast(mBuffer.data()); + const size_t len{mBuffer.size() / 2}; + for(size_t i{0};i < len;i++) + { + const ALushort samp{samples[i]}; + samples[i] = static_cast((samp>>8) | (samp<<8)); + } + } + else if(bytesize == 4) + { + ALuint *samples = reinterpret_cast(mBuffer.data()); + const size_t len{mBuffer.size() / 4}; + for(size_t i{0};i < len;i++) + { + const ALuint samp{samples[i]}; + samples[i] = (samp>>24) | ((samp>>8)&0x0000ff00) | + ((samp<<8)&0x00ff0000) | (samp<<24); + } + } + } + + size_t fs{fwrite(mBuffer.data(), frameSize, mDevice->UpdateSize, mFile)}; + (void)fs; + if(ferror(mFile)) + { + ERR("Error writing to file\n"); + aluHandleDisconnect(mDevice, "Failed to write playback samples"); + break; + } + } + + /* For every completed second, increment the start time and reduce the + * samples done. This prevents the difference between the start time + * and current time from growing too large, while maintaining the + * correct number of samples to render. + */ + if(done >= mDevice->Frequency) + { + seconds s{done/mDevice->Frequency}; + start += s; + done -= mDevice->Frequency*s.count(); + } + } + + return 0; +} + +void WaveBackend::open(const ALCchar *name) +{ + const char *fname{GetConfigValue(nullptr, "wave", "file", "")}; + if(!fname[0]) throw al::backend_exception{ALC_INVALID_VALUE, "No wave output filename"}; + + if(!name) + name = waveDevice; + else if(strcmp(name, waveDevice) != 0) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + +#ifdef _WIN32 + { + std::wstring wname = utf8_to_wstr(fname); + mFile = _wfopen(wname.c_str(), L"wb"); + } +#else + mFile = fopen(fname, "wb"); +#endif + if(!mFile) + throw al::backend_exception{ALC_INVALID_VALUE, "Could not open file '%s': %s", fname, + strerror(errno)}; + + mDevice->DeviceName = name; +} + +bool WaveBackend::reset() +{ + ALuint channels=0, bytes=0, chanmask=0; + int isbformat = 0; + size_t val; + + fseek(mFile, 0, SEEK_SET); + clearerr(mFile); + + if(GetConfigValueBool(nullptr, "wave", "bformat", 0)) + { + mDevice->FmtChans = DevFmtAmbi3D; + mDevice->mAmbiOrder = 1; + } + + switch(mDevice->FmtType) + { + case DevFmtByte: + mDevice->FmtType = DevFmtUByte; + break; + case DevFmtUShort: + mDevice->FmtType = DevFmtShort; + break; + case DevFmtUInt: + mDevice->FmtType = DevFmtInt; + break; + case DevFmtUByte: + case DevFmtShort: + case DevFmtInt: + case DevFmtFloat: + break; + } + switch(mDevice->FmtChans) + { + case DevFmtMono: chanmask = 0x04; break; + case DevFmtStereo: chanmask = 0x01 | 0x02; break; + case DevFmtQuad: chanmask = 0x01 | 0x02 | 0x10 | 0x20; break; + case DevFmtX51: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x200 | 0x400; break; + case DevFmtX51Rear: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x010 | 0x020; break; + case DevFmtX61: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x100 | 0x200 | 0x400; break; + case DevFmtX71: chanmask = 0x01 | 0x02 | 0x04 | 0x08 | 0x010 | 0x020 | 0x200 | 0x400; break; + case DevFmtAmbi3D: + /* .amb output requires FuMa */ + mDevice->mAmbiOrder = minu(mDevice->mAmbiOrder, 3); + mDevice->mAmbiLayout = AmbiLayout::FuMa; + mDevice->mAmbiScale = AmbiNorm::FuMa; + isbformat = 1; + chanmask = 0; + break; + } + bytes = mDevice->bytesFromFmt(); + channels = mDevice->channelsFromFmt(); + + rewind(mFile); + + fputs("RIFF", mFile); + fwrite32le(0xFFFFFFFF, mFile); // 'RIFF' header len; filled in at close + + fputs("WAVE", mFile); + + fputs("fmt ", mFile); + fwrite32le(40, mFile); // 'fmt ' header len; 40 bytes for EXTENSIBLE + + // 16-bit val, format type id (extensible: 0xFFFE) + fwrite16le(0xFFFE, mFile); + // 16-bit val, channel count + fwrite16le(static_cast(channels), mFile); + // 32-bit val, frequency + fwrite32le(mDevice->Frequency, mFile); + // 32-bit val, bytes per second + fwrite32le(mDevice->Frequency * channels * bytes, mFile); + // 16-bit val, frame size + fwrite16le(static_cast(channels * bytes), mFile); + // 16-bit val, bits per sample + fwrite16le(static_cast(bytes * 8), mFile); + // 16-bit val, extra byte count + fwrite16le(22, mFile); + // 16-bit val, valid bits per sample + fwrite16le(static_cast(bytes * 8), mFile); + // 32-bit val, channel mask + fwrite32le(chanmask, mFile); + // 16 byte GUID, sub-type format + val = fwrite((mDevice->FmtType == DevFmtFloat) ? + (isbformat ? SUBTYPE_BFORMAT_FLOAT : SUBTYPE_FLOAT) : + (isbformat ? SUBTYPE_BFORMAT_PCM : SUBTYPE_PCM), 1, 16, mFile); + (void)val; + + fputs("data", mFile); + fwrite32le(0xFFFFFFFF, mFile); // 'data' header len; filled in at close + + if(ferror(mFile)) + { + ERR("Error writing header: %s\n", strerror(errno)); + return false; + } + mDataStart = ftell(mFile); + + SetDefaultWFXChannelOrder(mDevice); + + const ALuint bufsize{mDevice->frameSizeFromFmt() * mDevice->UpdateSize}; + mBuffer.resize(bufsize); + + return true; +} + +bool WaveBackend::start() +{ + try { + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&WaveBackend::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Failed to start mixing thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void WaveBackend::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + long size{ftell(mFile)}; + if(size > 0) + { + long dataLen{size - mDataStart}; + if(fseek(mFile, mDataStart-4, SEEK_SET) == 0) + fwrite32le(static_cast(dataLen), mFile); // 'data' header len + if(fseek(mFile, 4, SEEK_SET) == 0) + fwrite32le(static_cast(size-8), mFile); // 'WAVE' header len + } +} + +} // namespace + + +bool WaveBackendFactory::init() +{ return true; } + +bool WaveBackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback; } + +void WaveBackendFactory::probe(DevProbe type, std::string *outnames) +{ + switch(type) + { + case DevProbe::Playback: + /* Includes null char. */ + outnames->append(waveDevice, sizeof(waveDevice)); + break; + case DevProbe::Capture: + break; + } +} + +BackendPtr WaveBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new WaveBackend{device}}; + return nullptr; +} + +BackendFactory &WaveBackendFactory::getFactory() +{ + static WaveBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/wave.h b/alc/backends/wave.h new file mode 100644 index 0000000..b9b62d7 --- /dev/null +++ b/alc/backends/wave.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_WAVE_H +#define BACKENDS_WAVE_H + +#include "backends/base.h" + +struct WaveBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_WAVE_H */ diff --git a/alc/backends/winmm.cpp b/alc/backends/winmm.cpp new file mode 100644 index 0000000..53a58d0 --- /dev/null +++ b/alc/backends/winmm.cpp @@ -0,0 +1,636 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "backends/winmm.h" + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "alcmain.h" +#include "alexcpt.h" +#include "alu.h" +#include "ringbuffer.h" +#include "strutils.h" +#include "threads.h" +#include "compat.h" + +#ifndef WAVE_FORMAT_IEEE_FLOAT +#define WAVE_FORMAT_IEEE_FLOAT 0x0003 +#endif + +namespace { + +#define DEVNAME_HEAD "OpenAL Soft on " + + +al::vector PlaybackDevices; +al::vector CaptureDevices; + +bool checkName(const al::vector &list, const std::string &name) +{ return std::find(list.cbegin(), list.cend(), name) != list.cend(); } + +void ProbePlaybackDevices(void) +{ + PlaybackDevices.clear(); + + ALuint numdevs{waveOutGetNumDevs()}; + PlaybackDevices.reserve(numdevs); + for(ALuint i{0};i < numdevs;i++) + { + std::string dname; + + WAVEOUTCAPSW WaveCaps{}; + if(waveOutGetDevCapsW(i, &WaveCaps, sizeof(WaveCaps)) == MMSYSERR_NOERROR) + { + const std::string basename{DEVNAME_HEAD + wstr_to_utf8(WaveCaps.szPname)}; + + int count{1}; + std::string newname{basename}; + while(checkName(PlaybackDevices, newname)) + { + newname = basename; + newname += " #"; + newname += std::to_string(++count); + } + dname = std::move(newname); + + TRACE("Got device \"%s\", ID %u\n", dname.c_str(), i); + } + PlaybackDevices.emplace_back(std::move(dname)); + } +} + +void ProbeCaptureDevices(void) +{ + CaptureDevices.clear(); + + ALuint numdevs{waveInGetNumDevs()}; + CaptureDevices.reserve(numdevs); + for(ALuint i{0};i < numdevs;i++) + { + std::string dname; + + WAVEINCAPSW WaveCaps{}; + if(waveInGetDevCapsW(i, &WaveCaps, sizeof(WaveCaps)) == MMSYSERR_NOERROR) + { + const std::string basename{DEVNAME_HEAD + wstr_to_utf8(WaveCaps.szPname)}; + + int count{1}; + std::string newname{basename}; + while(checkName(CaptureDevices, newname)) + { + newname = basename; + newname += " #"; + newname += std::to_string(++count); + } + dname = std::move(newname); + + TRACE("Got device \"%s\", ID %u\n", dname.c_str(), i); + } + CaptureDevices.emplace_back(std::move(dname)); + } +} + + +struct WinMMPlayback final : public BackendBase { + WinMMPlayback(ALCdevice *device) noexcept : BackendBase{device} { } + ~WinMMPlayback() override; + + void CALLBACK waveOutProc(HWAVEOUT device, UINT msg, DWORD_PTR param1, DWORD_PTR param2) noexcept; + static void CALLBACK waveOutProcC(HWAVEOUT device, UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR param2) noexcept + { reinterpret_cast(instance)->waveOutProc(device, msg, param1, param2); } + + int mixerProc(); + + void open(const ALCchar *name) override; + bool reset() override; + bool start() override; + void stop() override; + + std::atomic mWritable{0u}; + al::semaphore mSem; + ALuint mIdx{0u}; + std::array mWaveBuffer{}; + + HWAVEOUT mOutHdl{nullptr}; + + WAVEFORMATEX mFormat{}; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(WinMMPlayback) +}; + +WinMMPlayback::~WinMMPlayback() +{ + if(mOutHdl) + waveOutClose(mOutHdl); + mOutHdl = nullptr; + + al_free(mWaveBuffer[0].lpData); + std::fill(mWaveBuffer.begin(), mWaveBuffer.end(), WAVEHDR{}); +} + +/* WinMMPlayback::waveOutProc + * + * Posts a message to 'WinMMPlayback::mixerProc' everytime a WaveOut Buffer is + * completed and returns to the application (for more data) + */ +void CALLBACK WinMMPlayback::waveOutProc(HWAVEOUT, UINT msg, DWORD_PTR, DWORD_PTR) noexcept +{ + if(msg != WOM_DONE) return; + mWritable.fetch_add(1, std::memory_order_acq_rel); + mSem.post(); +} + +FORCE_ALIGN int WinMMPlayback::mixerProc() +{ + SetRTPriority(); + althrd_setname(MIXER_THREAD_NAME); + + const size_t frame_step{mDevice->channelsFromFmt()}; + + std::unique_lock dlock{*this}; + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + ALsizei todo = mWritable.load(std::memory_order_acquire); + if(todo < 1) + { + dlock.unlock(); + mSem.wait(); + dlock.lock(); + continue; + } + + size_t widx{mIdx}; + do { + WAVEHDR &waveHdr = mWaveBuffer[widx]; + widx = (widx+1) % mWaveBuffer.size(); + + aluMixData(mDevice, waveHdr.lpData, mDevice->UpdateSize, frame_step); + mWritable.fetch_sub(1, std::memory_order_acq_rel); + waveOutWrite(mOutHdl, &waveHdr, sizeof(WAVEHDR)); + } while(--todo); + mIdx = static_cast(widx); + } + + return 0; +} + + +void WinMMPlayback::open(const ALCchar *name) +{ + if(PlaybackDevices.empty()) + ProbePlaybackDevices(); + + // Find the Device ID matching the deviceName if valid + auto iter = name ? + std::find(PlaybackDevices.cbegin(), PlaybackDevices.cend(), name) : + PlaybackDevices.cbegin(); + if(iter == PlaybackDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + auto DeviceID = static_cast(std::distance(PlaybackDevices.cbegin(), iter)); + +retry_open: + mFormat = WAVEFORMATEX{}; + if(mDevice->FmtType == DevFmtFloat) + { + mFormat.wFormatTag = WAVE_FORMAT_IEEE_FLOAT; + mFormat.wBitsPerSample = 32; + } + else + { + mFormat.wFormatTag = WAVE_FORMAT_PCM; + if(mDevice->FmtType == DevFmtUByte || mDevice->FmtType == DevFmtByte) + mFormat.wBitsPerSample = 8; + else + mFormat.wBitsPerSample = 16; + } + mFormat.nChannels = ((mDevice->FmtChans == DevFmtMono) ? 1 : 2); + mFormat.nBlockAlign = static_cast(mFormat.wBitsPerSample * mFormat.nChannels / 8); + mFormat.nSamplesPerSec = mDevice->Frequency; + mFormat.nAvgBytesPerSec = mFormat.nSamplesPerSec * mFormat.nBlockAlign; + mFormat.cbSize = 0; + + MMRESULT res{waveOutOpen(&mOutHdl, DeviceID, &mFormat, + reinterpret_cast(&WinMMPlayback::waveOutProcC), + reinterpret_cast(this), CALLBACK_FUNCTION)}; + if(res != MMSYSERR_NOERROR) + { + if(mDevice->FmtType == DevFmtFloat) + { + mDevice->FmtType = DevFmtShort; + goto retry_open; + } + throw al::backend_exception{ALC_INVALID_VALUE, "waveOutOpen failed: %u", res}; + } + + mDevice->DeviceName = PlaybackDevices[DeviceID]; +} + +bool WinMMPlayback::reset() +{ + mDevice->BufferSize = static_cast(uint64_t{mDevice->BufferSize} * + mFormat.nSamplesPerSec / mDevice->Frequency); + mDevice->BufferSize = (mDevice->BufferSize+3) & ~0x3; + mDevice->UpdateSize = mDevice->BufferSize / 4; + mDevice->Frequency = mFormat.nSamplesPerSec; + + if(mFormat.wFormatTag == WAVE_FORMAT_IEEE_FLOAT) + { + if(mFormat.wBitsPerSample == 32) + mDevice->FmtType = DevFmtFloat; + else + { + ERR("Unhandled IEEE float sample depth: %d\n", mFormat.wBitsPerSample); + return false; + } + } + else if(mFormat.wFormatTag == WAVE_FORMAT_PCM) + { + if(mFormat.wBitsPerSample == 16) + mDevice->FmtType = DevFmtShort; + else if(mFormat.wBitsPerSample == 8) + mDevice->FmtType = DevFmtUByte; + else + { + ERR("Unhandled PCM sample depth: %d\n", mFormat.wBitsPerSample); + return false; + } + } + else + { + ERR("Unhandled format tag: 0x%04x\n", mFormat.wFormatTag); + return false; + } + + if(mFormat.nChannels == 2) + mDevice->FmtChans = DevFmtStereo; + else if(mFormat.nChannels == 1) + mDevice->FmtChans = DevFmtMono; + else + { + ERR("Unhandled channel count: %d\n", mFormat.nChannels); + return false; + } + SetDefaultWFXChannelOrder(mDevice); + + ALuint BufferSize{mDevice->UpdateSize * mDevice->frameSizeFromFmt()}; + + al_free(mWaveBuffer[0].lpData); + mWaveBuffer[0] = WAVEHDR{}; + mWaveBuffer[0].lpData = static_cast(al_calloc(16, BufferSize * mWaveBuffer.size())); + mWaveBuffer[0].dwBufferLength = BufferSize; + for(size_t i{1};i < mWaveBuffer.size();i++) + { + mWaveBuffer[i] = WAVEHDR{}; + mWaveBuffer[i].lpData = mWaveBuffer[i-1].lpData + mWaveBuffer[i-1].dwBufferLength; + mWaveBuffer[i].dwBufferLength = BufferSize; + } + mIdx = 0; + + return true; +} + +bool WinMMPlayback::start() +{ + try { + std::for_each(mWaveBuffer.begin(), mWaveBuffer.end(), + [this](WAVEHDR &waveHdr) -> void + { waveOutPrepareHeader(mOutHdl, &waveHdr, static_cast(sizeof(WAVEHDR))); } + ); + mWritable.store(static_cast(mWaveBuffer.size()), std::memory_order_release); + + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&WinMMPlayback::mixerProc), this}; + return true; + } + catch(std::exception& e) { + ERR("Failed to start mixing thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void WinMMPlayback::stop() +{ + if(mKillNow.exchange(true, std::memory_order_acq_rel) || !mThread.joinable()) + return; + mThread.join(); + + while(mWritable.load(std::memory_order_acquire) < mWaveBuffer.size()) + mSem.wait(); + std::for_each(mWaveBuffer.begin(), mWaveBuffer.end(), + [this](WAVEHDR &waveHdr) -> void + { waveOutUnprepareHeader(mOutHdl, &waveHdr, sizeof(WAVEHDR)); } + ); + mWritable.store(0, std::memory_order_release); +} + + +struct WinMMCapture final : public BackendBase { + WinMMCapture(ALCdevice *device) noexcept : BackendBase{device} { } + ~WinMMCapture() override; + + void CALLBACK waveInProc(HWAVEIN device, UINT msg, DWORD_PTR param1, DWORD_PTR param2) noexcept; + static void CALLBACK waveInProcC(HWAVEIN device, UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR param2) noexcept + { reinterpret_cast(instance)->waveInProc(device, msg, param1, param2); } + + int captureProc(); + + void open(const ALCchar *name) override; + bool start() override; + void stop() override; + ALCenum captureSamples(al::byte *buffer, ALCuint samples) override; + ALCuint availableSamples() override; + + std::atomic mReadable{0u}; + al::semaphore mSem; + ALuint mIdx{0}; + std::array mWaveBuffer{}; + + HWAVEIN mInHdl{nullptr}; + + RingBufferPtr mRing{nullptr}; + + WAVEFORMATEX mFormat{}; + + std::atomic mKillNow{true}; + std::thread mThread; + + DEF_NEWDEL(WinMMCapture) +}; + +WinMMCapture::~WinMMCapture() +{ + // Close the Wave device + if(mInHdl) + waveInClose(mInHdl); + mInHdl = nullptr; + + al_free(mWaveBuffer[0].lpData); + std::fill(mWaveBuffer.begin(), mWaveBuffer.end(), WAVEHDR{}); +} + +/* WinMMCapture::waveInProc + * + * Posts a message to 'WinMMCapture::captureProc' everytime a WaveIn Buffer is + * completed and returns to the application (with more data). + */ +void CALLBACK WinMMCapture::waveInProc(HWAVEIN, UINT msg, DWORD_PTR, DWORD_PTR) noexcept +{ + if(msg != WIM_DATA) return; + mReadable.fetch_add(1, std::memory_order_acq_rel); + mSem.post(); +} + +int WinMMCapture::captureProc() +{ + althrd_setname(RECORD_THREAD_NAME); + + std::unique_lock dlock{*this}; + while(!mKillNow.load(std::memory_order_acquire) && + mDevice->Connected.load(std::memory_order_acquire)) + { + ALuint todo{mReadable.load(std::memory_order_acquire)}; + if(todo < 1) + { + dlock.unlock(); + mSem.wait(); + dlock.lock(); + continue; + } + + size_t widx{mIdx}; + do { + WAVEHDR &waveHdr = mWaveBuffer[widx]; + widx = (widx+1) % mWaveBuffer.size(); + + mRing->write(waveHdr.lpData, waveHdr.dwBytesRecorded / mFormat.nBlockAlign); + mReadable.fetch_sub(1, std::memory_order_acq_rel); + waveInAddBuffer(mInHdl, &waveHdr, sizeof(WAVEHDR)); + } while(--todo); + mIdx = static_cast(widx); + } + + return 0; +} + + +void WinMMCapture::open(const ALCchar *name) +{ + if(CaptureDevices.empty()) + ProbeCaptureDevices(); + + // Find the Device ID matching the deviceName if valid + auto iter = name ? + std::find(CaptureDevices.cbegin(), CaptureDevices.cend(), name) : + CaptureDevices.cbegin(); + if(iter == CaptureDevices.cend()) + throw al::backend_exception{ALC_INVALID_VALUE, "Device name \"%s\" not found", name}; + auto DeviceID = static_cast(std::distance(CaptureDevices.cbegin(), iter)); + + switch(mDevice->FmtChans) + { + case DevFmtMono: + case DevFmtStereo: + break; + + case DevFmtQuad: + case DevFmtX51: + case DevFmtX51Rear: + case DevFmtX61: + case DevFmtX71: + case DevFmtAmbi3D: + throw al::backend_exception{ALC_INVALID_VALUE, "%s capture not supported", + DevFmtChannelsString(mDevice->FmtChans)}; + } + + switch(mDevice->FmtType) + { + case DevFmtUByte: + case DevFmtShort: + case DevFmtInt: + case DevFmtFloat: + break; + + case DevFmtByte: + case DevFmtUShort: + case DevFmtUInt: + throw al::backend_exception{ALC_INVALID_VALUE, "%s samples not supported", + DevFmtTypeString(mDevice->FmtType)}; + } + + mFormat = WAVEFORMATEX{}; + mFormat.wFormatTag = (mDevice->FmtType == DevFmtFloat) ? + WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM; + mFormat.nChannels = static_cast(mDevice->channelsFromFmt()); + mFormat.wBitsPerSample = static_cast(mDevice->bytesFromFmt() * 8); + mFormat.nBlockAlign = static_cast(mFormat.wBitsPerSample * mFormat.nChannels / 8); + mFormat.nSamplesPerSec = mDevice->Frequency; + mFormat.nAvgBytesPerSec = mFormat.nSamplesPerSec * mFormat.nBlockAlign; + mFormat.cbSize = 0; + + MMRESULT res{waveInOpen(&mInHdl, DeviceID, &mFormat, + reinterpret_cast(&WinMMCapture::waveInProcC), + reinterpret_cast(this), CALLBACK_FUNCTION)}; + if(res != MMSYSERR_NOERROR) + throw al::backend_exception{ALC_INVALID_VALUE, "waveInOpen failed: %u", res}; + + // Ensure each buffer is 50ms each + DWORD BufferSize{mFormat.nAvgBytesPerSec / 20u}; + BufferSize -= (BufferSize % mFormat.nBlockAlign); + + // Allocate circular memory buffer for the captured audio + // Make sure circular buffer is at least 100ms in size + ALuint CapturedDataSize{mDevice->BufferSize}; + CapturedDataSize = static_cast(maxz(CapturedDataSize, BufferSize*mWaveBuffer.size())); + + mRing = RingBuffer::Create(CapturedDataSize, mFormat.nBlockAlign, false); + + al_free(mWaveBuffer[0].lpData); + mWaveBuffer[0] = WAVEHDR{}; + mWaveBuffer[0].lpData = static_cast(al_calloc(16, BufferSize * mWaveBuffer.size())); + mWaveBuffer[0].dwBufferLength = BufferSize; + for(size_t i{1};i < mWaveBuffer.size();++i) + { + mWaveBuffer[i] = WAVEHDR{}; + mWaveBuffer[i].lpData = mWaveBuffer[i-1].lpData + mWaveBuffer[i-1].dwBufferLength; + mWaveBuffer[i].dwBufferLength = mWaveBuffer[i-1].dwBufferLength; + } + + mDevice->DeviceName = CaptureDevices[DeviceID]; +} + +bool WinMMCapture::start() +{ + try { + for(size_t i{0};i < mWaveBuffer.size();++i) + { + waveInPrepareHeader(mInHdl, &mWaveBuffer[i], sizeof(WAVEHDR)); + waveInAddBuffer(mInHdl, &mWaveBuffer[i], sizeof(WAVEHDR)); + } + + mKillNow.store(false, std::memory_order_release); + mThread = std::thread{std::mem_fn(&WinMMCapture::captureProc), this}; + + waveInStart(mInHdl); + return true; + } + catch(std::exception& e) { + ERR("Failed to start mixing thread: %s\n", e.what()); + } + catch(...) { + } + return false; +} + +void WinMMCapture::stop() +{ + waveInStop(mInHdl); + + mKillNow.store(true, std::memory_order_release); + if(mThread.joinable()) + { + mSem.post(); + mThread.join(); + } + + waveInReset(mInHdl); + for(size_t i{0};i < mWaveBuffer.size();++i) + waveInUnprepareHeader(mInHdl, &mWaveBuffer[i], sizeof(WAVEHDR)); + + mReadable.store(0, std::memory_order_release); + mIdx = 0; +} + +ALCenum WinMMCapture::captureSamples(al::byte *buffer, ALCuint samples) +{ + mRing->read(buffer, samples); + return ALC_NO_ERROR; +} + +ALCuint WinMMCapture::availableSamples() +{ return static_cast(mRing->readSpace()); } + +} // namespace + + +bool WinMMBackendFactory::init() +{ return true; } + +bool WinMMBackendFactory::querySupport(BackendType type) +{ return type == BackendType::Playback || type == BackendType::Capture; } + +void WinMMBackendFactory::probe(DevProbe type, std::string *outnames) +{ + auto add_device = [outnames](const std::string &dname) -> void + { + /* +1 to also append the null char (to ensure a null-separated list and + * double-null terminated list). + */ + if(!dname.empty()) + outnames->append(dname.c_str(), dname.length()+1); + }; + switch(type) + { + case DevProbe::Playback: + ProbePlaybackDevices(); + std::for_each(PlaybackDevices.cbegin(), PlaybackDevices.cend(), add_device); + break; + + case DevProbe::Capture: + ProbeCaptureDevices(); + std::for_each(CaptureDevices.cbegin(), CaptureDevices.cend(), add_device); + break; + } +} + +BackendPtr WinMMBackendFactory::createBackend(ALCdevice *device, BackendType type) +{ + if(type == BackendType::Playback) + return BackendPtr{new WinMMPlayback{device}}; + if(type == BackendType::Capture) + return BackendPtr{new WinMMCapture{device}}; + return nullptr; +} + +BackendFactory &WinMMBackendFactory::getFactory() +{ + static WinMMBackendFactory factory{}; + return factory; +} diff --git a/alc/backends/winmm.h b/alc/backends/winmm.h new file mode 100644 index 0000000..e357ec1 --- /dev/null +++ b/alc/backends/winmm.h @@ -0,0 +1,19 @@ +#ifndef BACKENDS_WINMM_H +#define BACKENDS_WINMM_H + +#include "backends/base.h" + +struct WinMMBackendFactory final : public BackendFactory { +public: + bool init() override; + + bool querySupport(BackendType type) override; + + void probe(DevProbe type, std::string *outnames) override; + + BackendPtr createBackend(ALCdevice *device, BackendType type) override; + + static BackendFactory &getFactory(); +}; + +#endif /* BACKENDS_WINMM_H */ diff --git a/alc/bformatdec.cpp b/alc/bformatdec.cpp new file mode 100644 index 0000000..6c9a6be --- /dev/null +++ b/alc/bformatdec.cpp @@ -0,0 +1,159 @@ + +#include "config.h" + +#include "bformatdec.h" + +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" + +#include "almalloc.h" +#include "alu.h" +#include "ambdec.h" +#include "filters/splitter.h" +#include "opthelpers.h" + + +namespace { + +constexpr std::array Ambi3DDecoderHFScale{{ + 1.00000000e+00f, 1.00000000e+00f +}}; +constexpr std::array Ambi3DDecoderHFScale2O{{ + 7.45355990e-01f, 1.00000000e+00f, 1.00000000e+00f +}}; +constexpr std::array Ambi3DDecoderHFScale3O{{ + 5.89792205e-01f, 8.79693856e-01f, 1.00000000e+00f, 1.00000000e+00f +}}; + +inline auto GetDecoderHFScales(ALuint order) noexcept -> const std::array& +{ + if(order >= 3) return Ambi3DDecoderHFScale3O; + if(order == 2) return Ambi3DDecoderHFScale2O; + return Ambi3DDecoderHFScale; +} + +inline auto GetAmbiScales(AmbDecScale scaletype) noexcept + -> const std::array& +{ + if(scaletype == AmbDecScale::FuMa) return AmbiScale::FromFuMa; + if(scaletype == AmbDecScale::SN3D) return AmbiScale::FromSN3D; + return AmbiScale::FromN3D; +} + +} // namespace + + +BFormatDec::BFormatDec(const AmbDecConf *conf, const bool allow_2band, const ALuint inchans, + const ALuint srate, const ALuint (&chanmap)[MAX_OUTPUT_CHANNELS]) : mChannelDec{inchans} +{ + mDualBand = allow_2band && (conf->FreqBands == 2); + + const bool periphonic{(conf->ChanMask&AMBI_PERIPHONIC_MASK) != 0}; + const std::array &coeff_scale = GetAmbiScales(conf->CoeffScale); + + if(!mDualBand) + { + for(size_t j{0},k{0};j < mChannelDec.size();++j) + { + const size_t acn{periphonic ? j : AmbiIndex::From2D[j]}; + if(!(conf->ChanMask&(1u<HFOrderGain[order] / coeff_scale[acn]}; + for(size_t i{0u};i < conf->Speakers.size();++i) + { + const size_t chanidx{chanmap[i]}; + mChannelDec[j].mGains.Single[chanidx] = conf->HFMatrix[i][k] * gain; + } + ++k; + } + } + else + { + mChannelDec[0].mXOver.init(conf->XOverFreq / static_cast(srate)); + for(size_t j{1};j < mChannelDec.size();++j) + mChannelDec[j].mXOver = mChannelDec[0].mXOver; + + const float ratio{std::pow(10.0f, conf->XOverRatio / 40.0f)}; + for(size_t j{0},k{0};j < mChannelDec.size();++j) + { + const size_t acn{periphonic ? j : AmbiIndex::From2D[j]}; + if(!(conf->ChanMask&(1u<HFOrderGain[order] * ratio / coeff_scale[acn]}; + const float lfGain{conf->LFOrderGain[order] / ratio / coeff_scale[acn]}; + for(size_t i{0u};i < conf->Speakers.size();++i) + { + const size_t chanidx{chanmap[i]}; + mChannelDec[j].mGains.Dual[sHFBand][chanidx] = conf->HFMatrix[i][k] * hfGain; + mChannelDec[j].mGains.Dual[sLFBand][chanidx] = conf->LFMatrix[i][k] * lfGain; + } + ++k; + } + } +} + +BFormatDec::BFormatDec(const ALuint inchans, const al::span chancoeffs) + : mChannelDec{inchans} +{ + for(size_t j{0};j < mChannelDec.size();++j) + { + float *outcoeffs{mChannelDec[j].mGains.Single}; + for(const ChannelDec &incoeffs : chancoeffs) + *(outcoeffs++) = incoeffs[j]; + } +} + + +void BFormatDec::process(const al::span OutBuffer, + const FloatBufferLine *InSamples, const size_t SamplesToDo) +{ + ASSUME(SamplesToDo > 0); + + if(mDualBand) + { + const al::span hfSamples{mSamples[sHFBand].data(), SamplesToDo}; + const al::span lfSamples{mSamples[sLFBand].data(), SamplesToDo}; + for(auto &chandec : mChannelDec) + { + chandec.mXOver.process({InSamples->data(), SamplesToDo}, mSamples[sHFBand].data(), + mSamples[sLFBand].data()); + MixSamples(hfSamples, OutBuffer, chandec.mGains.Dual[sHFBand], + chandec.mGains.Dual[sHFBand], 0, 0); + MixSamples(hfSamples, OutBuffer, chandec.mGains.Dual[sLFBand], + chandec.mGains.Dual[sLFBand], 0, 0); + ++InSamples; + } + } + else + { + for(auto &chandec : mChannelDec) + { + MixSamples({InSamples->data(), SamplesToDo}, OutBuffer, chandec.mGains.Single, + chandec.mGains.Single, 0, 0); + ++InSamples; + } + } +} + + +auto BFormatDec::GetHFOrderScales(const ALuint in_order, const ALuint out_order) noexcept + -> std::array +{ + std::array ret{}; + + assert(out_order >= in_order); + + const auto &target = GetDecoderHFScales(out_order); + const auto &input = GetDecoderHFScales(in_order); + + for(size_t i{0};i < in_order+1;++i) + ret[i] = input[i] / target[i]; + + return ret; +} diff --git a/alc/bformatdec.h b/alc/bformatdec.h new file mode 100644 index 0000000..63f8c51 --- /dev/null +++ b/alc/bformatdec.h @@ -0,0 +1,71 @@ +#ifndef BFORMATDEC_H +#define BFORMATDEC_H + +#include +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "almalloc.h" +#include "alspan.h" +#include "ambidefs.h" +#include "devformat.h" +#include "filters/splitter.h" + +struct AmbDecConf; + + +using ChannelDec = float[MAX_AMBI_CHANNELS]; + +class BFormatDec { + static constexpr size_t sHFBand{0}; + static constexpr size_t sLFBand{1}; + static constexpr size_t sNumBands{2}; + + struct ChannelDecoder { + union MatrixU { + float Dual[sNumBands][MAX_OUTPUT_CHANNELS]; + float Single[MAX_OUTPUT_CHANNELS]; + } mGains{}; + + /* NOTE: BandSplitter filter is unused with single-band decoding. */ + BandSplitter mXOver; + }; + + alignas(16) std::array mSamples; + + bool mDualBand{false}; + + al::FlexArray mChannelDec; + +public: + BFormatDec(const AmbDecConf *conf, const bool allow_2band, const ALuint inchans, + const ALuint srate, const ALuint (&chanmap)[MAX_OUTPUT_CHANNELS]); + BFormatDec(const ALuint inchans, const al::span chancoeffs); + + /* Decodes the ambisonic input to the given output channels. */ + void process(const al::span OutBuffer, const FloatBufferLine *InSamples, + const size_t SamplesToDo); + + /* Retrieves per-order HF scaling factors for "upsampling" ambisonic data. */ + static std::array GetHFOrderScales(const ALuint in_order, + const ALuint out_order) noexcept; + + static std::unique_ptr Create(const AmbDecConf *conf, const bool allow_2band, + const ALuint inchans, const ALuint srate, const ALuint (&chanmap)[MAX_OUTPUT_CHANNELS]) + { + return std::unique_ptr{new(FamCount{inchans}) + BFormatDec{conf, allow_2band, inchans, srate, chanmap}}; + } + static std::unique_ptr Create(const ALuint inchans, + const al::span chancoeffs) + { + return std::unique_ptr{new(FamCount{inchans}) BFormatDec{inchans, chancoeffs}}; + } + + DEF_FAM_NEWDEL(BFormatDec, mChannelDec) +}; + +#endif /* BFORMATDEC_H */ diff --git a/Alc/bs2b.c b/alc/bs2b.cpp similarity index 64% rename from Alc/bs2b.c rename to alc/bs2b.cpp index e235e54..00207bc 100644 --- a/Alc/bs2b.c +++ b/alc/bs2b.cpp @@ -23,18 +23,19 @@ #include "config.h" -#include -#include +#include +#include +#include #include "bs2b.h" -#include "alu.h" +#include "math_defs.h" /* Set up all data. */ static void init(struct bs2b *bs2b) { float Fc_lo, Fc_hi; - float G_lo, G_hi; + float G_lo, G_hi; float x, g; switch(bs2b->level) @@ -90,11 +91,11 @@ static void init(struct bs2b *bs2b) * $d = 1 / 2 / pi / $fc; * $x = exp(-1 / $d); */ - x = expf(-2.0f * F_PI * Fc_lo / bs2b->srate); + x = std::exp(-al::MathDefs::Tau() * Fc_lo / static_cast(bs2b->srate)); bs2b->b1_lo = x; bs2b->a0_lo = G_lo * (1.0f - x) * g; - x = expf(-2.0f * F_PI * Fc_hi / bs2b->srate); + x = std::exp(-al::MathDefs::Tau() * Fc_hi / static_cast(bs2b->srate)); bs2b->b1_hi = x; bs2b->a0_hi = (1.0f - G_hi * (1.0f - x)) * g; bs2b->a1_hi = -x * g; @@ -126,60 +127,55 @@ int bs2b_get_srate(struct bs2b *bs2b) void bs2b_clear(struct bs2b *bs2b) { - memset(&bs2b->last_sample, 0, sizeof(bs2b->last_sample)); + std::fill(std::begin(bs2b->history), std::end(bs2b->history), bs2b::t_last_sample{}); } /* bs2b_clear */ -void bs2b_cross_feed(struct bs2b *bs2b, float *restrict Left, float *restrict Right, int SamplesToDo) +void bs2b_cross_feed(struct bs2b *bs2b, float *Left, float *Right, size_t SamplesToDo) { + const float a0_lo{bs2b->a0_lo}; + const float b1_lo{bs2b->b1_lo}; + const float a0_hi{bs2b->a0_hi}; + const float a1_hi{bs2b->a1_hi}; + const float b1_hi{bs2b->b1_hi}; float lsamples[128][2]; float rsamples[128][2]; - int base; - for(base = 0;base < SamplesToDo;) + for(size_t base{0};base < SamplesToDo;) { - int todo = mini(128, SamplesToDo-base); - int i; + const size_t todo{std::min(128, SamplesToDo-base)}; /* Process left input */ - lsamples[0][0] = bs2b->a0_lo*Left[0] + - bs2b->b1_lo*bs2b->last_sample[0].lo; - lsamples[0][1] = bs2b->a0_hi*Left[0] + - bs2b->a1_hi*bs2b->last_sample[0].asis + - bs2b->b1_hi*bs2b->last_sample[0].hi; - for(i = 1;i < todo;i++) + float z_lo{bs2b->history[0].lo}; + float z_hi{bs2b->history[0].hi}; + for(size_t i{0};i < todo;i++) { - lsamples[i][0] = bs2b->a0_lo*Left[i] + - bs2b->b1_lo*lsamples[i-1][0]; - lsamples[i][1] = bs2b->a0_hi*Left[i] + - bs2b->a1_hi*Left[i-1] + - bs2b->b1_hi*lsamples[i-1][1]; + lsamples[i][0] = a0_lo*Left[i] + z_lo; + z_lo = b1_lo*lsamples[i][0]; + + lsamples[i][1] = a0_hi*Left[i] + z_hi; + z_hi = a1_hi*Left[i] + b1_hi*lsamples[i][1]; } - bs2b->last_sample[0].asis = Left[i-1]; - bs2b->last_sample[0].lo = lsamples[i-1][0]; - bs2b->last_sample[0].hi = lsamples[i-1][1]; + bs2b->history[0].lo = z_lo; + bs2b->history[0].hi = z_hi; /* Process right input */ - rsamples[0][0] = bs2b->a0_lo*Right[0] + - bs2b->b1_lo*bs2b->last_sample[1].lo; - rsamples[0][1] = bs2b->a0_hi*Right[0] + - bs2b->a1_hi*bs2b->last_sample[1].asis + - bs2b->b1_hi*bs2b->last_sample[1].hi; - for(i = 1;i < todo;i++) + z_lo = bs2b->history[1].lo; + z_hi = bs2b->history[1].hi; + for(size_t i{0};i < todo;i++) { - rsamples[i][0] = bs2b->a0_lo*Right[i] + - bs2b->b1_lo*rsamples[i-1][0]; - rsamples[i][1] = bs2b->a0_hi*Right[i] + - bs2b->a1_hi*Right[i-1] + - bs2b->b1_hi*rsamples[i-1][1]; + rsamples[i][0] = a0_lo*Right[i] + z_lo; + z_lo = b1_lo*rsamples[i][0]; + + rsamples[i][1] = a0_hi*Right[i] + z_hi; + z_hi = a1_hi*Right[i] + b1_hi*rsamples[i][1]; } - bs2b->last_sample[1].asis = Right[i-1]; - bs2b->last_sample[1].lo = rsamples[i-1][0]; - bs2b->last_sample[1].hi = rsamples[i-1][1]; + bs2b->history[1].lo = z_lo; + bs2b->history[1].hi = z_hi; /* Crossfeed */ - for(i = 0;i < todo;i++) + for(size_t i{0};i < todo;i++) *(Left++) = lsamples[i][1] + rsamples[i][0]; - for(i = 0;i < todo;i++) + for(size_t i{0};i < todo;i++) *(Right++) = rsamples[i][1] + lsamples[i][0]; base += todo; diff --git a/OpenAL32/include/bs2b.h b/alc/bs2b.h similarity index 83% rename from OpenAL32/include/bs2b.h rename to alc/bs2b.h index e845d90..df717cd 100644 --- a/OpenAL32/include/bs2b.h +++ b/alc/bs2b.h @@ -24,6 +24,8 @@ #ifndef BS2B_H #define BS2B_H +#include "almalloc.h" + /* Number of crossfeed levels */ #define BS2B_CLEVELS 3 @@ -42,10 +44,6 @@ /* Default sample rate (Hz) */ #define BS2B_DEFAULT_SRATE 44100 -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - struct bs2b { int level; /* Crossfeed level */ int srate; /* Sample rate (Hz) */ @@ -59,14 +57,15 @@ struct bs2b { float a1_hi; float b1_hi; - /* Buffer of last filtered sample. + /* Buffer of filter history * [0] - first channel, [1] - second channel */ struct t_last_sample { - float asis; float lo; float hi; - } last_sample[2]; + } history[2]; + + DEF_NEWDEL(bs2b) }; /* Clear buffers and set new coefficients with new crossfeed level and sample @@ -74,21 +73,17 @@ struct bs2b { * level - crossfeed level of *LEVEL values. * srate - sample rate by Hz. */ -void bs2b_set_params(struct bs2b *bs2b, int level, int srate); +void bs2b_set_params(bs2b *bs2b, int level, int srate); /* Return current crossfeed level value */ -int bs2b_get_level(struct bs2b *bs2b); +int bs2b_get_level(bs2b *bs2b); /* Return current sample rate value */ -int bs2b_get_srate(struct bs2b *bs2b); +int bs2b_get_srate(bs2b *bs2b); /* Clear buffer */ -void bs2b_clear(struct bs2b *bs2b); - -void bs2b_cross_feed(struct bs2b *bs2b, float *restrict Left, float *restrict Right, int SamplesToDo); +void bs2b_clear(bs2b *bs2b); -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ +void bs2b_cross_feed(bs2b *bs2b, float *Left, float *Right, size_t SamplesToDo); #endif /* BS2B_H */ diff --git a/alc/compat.h b/alc/compat.h new file mode 100644 index 0000000..960b4b9 --- /dev/null +++ b/alc/compat.h @@ -0,0 +1,9 @@ +#ifndef AL_COMPAT_H +#define AL_COMPAT_H + +#include + +struct PathNamePair { std::string path, fname; }; +const PathNamePair &GetProcBinary(void); + +#endif /* AL_COMPAT_H */ diff --git a/alc/converter.cpp b/alc/converter.cpp new file mode 100644 index 0000000..553bad5 --- /dev/null +++ b/alc/converter.cpp @@ -0,0 +1,360 @@ + +#include "config.h" + +#include "converter.h" + +#include +#include +#include + +#include "AL/al.h" + +#include "albyte.h" +#include "alu.h" +#include "fpu_modes.h" +#include "mixer/defs.h" + + +namespace { + +/* Base template left undefined. Should be marked =delete, but Clang 3.8.1 + * chokes on that given the inline specializations. + */ +template +inline ALfloat LoadSample(typename DevFmtTypeTraits::Type val) noexcept; + +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return val * (1.0f/128.0f); } +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return val * (1.0f/32768.0f); } +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return static_cast(val) * (1.0f/2147483648.0f); } +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return val; } + +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return LoadSample(static_cast(val - 128)); } +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return LoadSample(static_cast(val - 32768)); } +template<> inline ALfloat LoadSample(DevFmtTypeTraits::Type val) noexcept +{ return LoadSample(static_cast(val - 2147483648u)); } + + +template +inline void LoadSampleArray(ALfloat *RESTRICT dst, const void *src, const size_t srcstep, + const size_t samples) noexcept +{ + using SampleType = typename DevFmtTypeTraits::Type; + + const SampleType *ssrc = static_cast(src); + for(size_t i{0u};i < samples;i++) + dst[i] = LoadSample(ssrc[i*srcstep]); +} + +void LoadSamples(ALfloat *dst, const ALvoid *src, const size_t srcstep, const DevFmtType srctype, + const size_t samples) noexcept +{ +#define HANDLE_FMT(T) \ + case T: LoadSampleArray(dst, src, srcstep, samples); break + switch(srctype) + { + HANDLE_FMT(DevFmtByte); + HANDLE_FMT(DevFmtUByte); + HANDLE_FMT(DevFmtShort); + HANDLE_FMT(DevFmtUShort); + HANDLE_FMT(DevFmtInt); + HANDLE_FMT(DevFmtUInt); + HANDLE_FMT(DevFmtFloat); + } +#undef HANDLE_FMT +} + + +template +inline typename DevFmtTypeTraits::Type StoreSample(ALfloat) noexcept; + +template<> inline ALfloat StoreSample(ALfloat val) noexcept +{ return val; } +template<> inline ALint StoreSample(ALfloat val) noexcept +{ return fastf2i(clampf(val*2147483648.0f, -2147483648.0f, 2147483520.0f)); } +template<> inline ALshort StoreSample(ALfloat val) noexcept +{ return static_cast(fastf2i(clampf(val*32768.0f, -32768.0f, 32767.0f))); } +template<> inline ALbyte StoreSample(ALfloat val) noexcept +{ return static_cast(fastf2i(clampf(val*128.0f, -128.0f, 127.0f))); } + +/* Define unsigned output variations. */ +template<> inline ALuint StoreSample(ALfloat val) noexcept +{ return static_cast(StoreSample(val)) + 2147483648u; } +template<> inline ALushort StoreSample(ALfloat val) noexcept +{ return static_cast(StoreSample(val) + 32768); } +template<> inline ALubyte StoreSample(ALfloat val) noexcept +{ return static_cast(StoreSample(val) + 128); } + +template +inline void StoreSampleArray(void *dst, const ALfloat *RESTRICT src, const size_t dststep, + const size_t samples) noexcept +{ + using SampleType = typename DevFmtTypeTraits::Type; + + SampleType *sdst = static_cast(dst); + for(size_t i{0u};i < samples;i++) + sdst[i*dststep] = StoreSample(src[i]); +} + + +void StoreSamples(ALvoid *dst, const ALfloat *src, const size_t dststep, const DevFmtType dsttype, + const size_t samples) noexcept +{ +#define HANDLE_FMT(T) \ + case T: StoreSampleArray(dst, src, dststep, samples); break + switch(dsttype) + { + HANDLE_FMT(DevFmtByte); + HANDLE_FMT(DevFmtUByte); + HANDLE_FMT(DevFmtShort); + HANDLE_FMT(DevFmtUShort); + HANDLE_FMT(DevFmtInt); + HANDLE_FMT(DevFmtUInt); + HANDLE_FMT(DevFmtFloat); + } +#undef HANDLE_FMT +} + + +template +void Mono2Stereo(ALfloat *RESTRICT dst, const void *src, const size_t frames) noexcept +{ + using SampleType = typename DevFmtTypeTraits::Type; + + const SampleType *ssrc = static_cast(src); + for(size_t i{0u};i < frames;i++) + dst[i*2 + 1] = dst[i*2 + 0] = LoadSample(ssrc[i]) * 0.707106781187f; +} + +template +void Stereo2Mono(ALfloat *RESTRICT dst, const void *src, const size_t frames) noexcept +{ + using SampleType = typename DevFmtTypeTraits::Type; + + const SampleType *ssrc = static_cast(src); + for(size_t i{0u};i < frames;i++) + dst[i] = (LoadSample(ssrc[i*2 + 0])+LoadSample(ssrc[i*2 + 1])) * + 0.707106781187f; +} + +} // namespace + +SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, size_t numchans, + ALuint srcRate, ALuint dstRate, Resampler resampler) +{ + if(numchans < 1 || srcRate < 1 || dstRate < 1) + return nullptr; + + SampleConverterPtr converter{new (FamCount{numchans}) SampleConverter{numchans}}; + converter->mSrcType = srcType; + converter->mDstType = dstType; + converter->mSrcTypeSize = BytesFromDevFmt(srcType); + converter->mDstTypeSize = BytesFromDevFmt(dstType); + + converter->mSrcPrepCount = 0; + converter->mFracOffset = 0; + + /* Have to set the mixer FPU mode since that's what the resampler code expects. */ + FPUCtl mixer_mode{}; + auto step = static_cast( + mind(srcRate*double{FRACTIONONE}/dstRate + 0.5, MAX_PITCH*FRACTIONONE)); + converter->mIncrement = maxu(step, 1); + if(converter->mIncrement == FRACTIONONE) + converter->mResample = Resample_; + else + converter->mResample = PrepareResampler(resampler, converter->mIncrement, + &converter->mState); + + return converter; +} + +ALuint SampleConverter::availableOut(ALuint srcframes) const +{ + ALint prepcount{mSrcPrepCount}; + if(prepcount < 0) + { + /* Negative prepcount means we need to skip that many input samples. */ + if(static_cast(-prepcount) >= srcframes) + return 0; + srcframes -= static_cast(-prepcount); + prepcount = 0; + } + + if(srcframes < 1) + { + /* No output samples if there's no input samples. */ + return 0; + } + + if(prepcount < MAX_RESAMPLER_PADDING + && static_cast(MAX_RESAMPLER_PADDING - prepcount) >= srcframes) + { + /* Not enough input samples to generate an output sample. */ + return 0; + } + + auto DataSize64 = static_cast(prepcount); + DataSize64 += srcframes; + DataSize64 -= MAX_RESAMPLER_PADDING; + DataSize64 <<= FRACTIONBITS; + DataSize64 -= mFracOffset; + + /* If we have a full prep, we can generate at least one sample. */ + return static_cast(clampu64((DataSize64 + mIncrement-1)/mIncrement, 1, BUFFERSIZE)); +} + +ALuint SampleConverter::convert(const ALvoid **src, ALuint *srcframes, ALvoid *dst, ALuint dstframes) +{ + const ALuint SrcFrameSize{static_cast(mChan.size()) * mSrcTypeSize}; + const ALuint DstFrameSize{static_cast(mChan.size()) * mDstTypeSize}; + const ALuint increment{mIncrement}; + auto SamplesIn = static_cast(*src); + ALuint NumSrcSamples{*srcframes}; + + FPUCtl mixer_mode{}; + ALuint pos{0}; + while(pos < dstframes && NumSrcSamples > 0) + { + ALint prepcount{mSrcPrepCount}; + if(prepcount < 0) + { + /* Negative prepcount means we need to skip that many input samples. */ + if(static_cast(-prepcount) >= NumSrcSamples) + { + mSrcPrepCount = static_cast(NumSrcSamples) + prepcount; + NumSrcSamples = 0; + break; + } + SamplesIn += SrcFrameSize*static_cast(-prepcount); + NumSrcSamples -= static_cast(-prepcount); + mSrcPrepCount = 0; + continue; + } + ALuint toread{minu(NumSrcSamples, BUFFERSIZE - MAX_RESAMPLER_PADDING)}; + + if(prepcount < MAX_RESAMPLER_PADDING + && static_cast(MAX_RESAMPLER_PADDING - prepcount) >= toread) + { + /* Not enough input samples to generate an output sample. Store + * what we're given for later. + */ + for(size_t chan{0u};chan < mChan.size();chan++) + LoadSamples(&mChan[chan].PrevSamples[prepcount], SamplesIn + mSrcTypeSize*chan, + mChan.size(), mSrcType, toread); + + mSrcPrepCount = prepcount + static_cast(toread); + NumSrcSamples = 0; + break; + } + + ALfloat *RESTRICT SrcData{mSrcSamples}; + ALfloat *RESTRICT DstData{mDstSamples}; + ALuint DataPosFrac{mFracOffset}; + auto DataSize64 = static_cast(prepcount); + DataSize64 += toread; + DataSize64 -= MAX_RESAMPLER_PADDING; + DataSize64 <<= FRACTIONBITS; + DataSize64 -= DataPosFrac; + + /* If we have a full prep, we can generate at least one sample. */ + auto DstSize = static_cast( + clampu64((DataSize64 + increment-1)/increment, 1, BUFFERSIZE)); + DstSize = minu(DstSize, dstframes-pos); + + for(size_t chan{0u};chan < mChan.size();chan++) + { + const al::byte *SrcSamples{SamplesIn + mSrcTypeSize*chan}; + al::byte *DstSamples = static_cast(dst) + mDstTypeSize*chan; + + /* Load the previous samples into the source data first, then the + * new samples from the input buffer. + */ + std::copy_n(mChan[chan].PrevSamples, prepcount, SrcData); + LoadSamples(SrcData + prepcount, SrcSamples, mChan.size(), mSrcType, toread); + + /* Store as many prep samples for next time as possible, given the + * number of output samples being generated. + */ + ALuint SrcDataEnd{(DstSize*increment + DataPosFrac)>>FRACTIONBITS}; + if(SrcDataEnd >= static_cast(prepcount)+toread) + std::fill(std::begin(mChan[chan].PrevSamples), + std::end(mChan[chan].PrevSamples), 0.0f); + else + { + const size_t len{minz(al::size(mChan[chan].PrevSamples), + static_cast(prepcount)+toread-SrcDataEnd)}; + std::copy_n(SrcData+SrcDataEnd, len, mChan[chan].PrevSamples); + std::fill(std::begin(mChan[chan].PrevSamples)+len, + std::end(mChan[chan].PrevSamples), 0.0f); + } + + /* Now resample, and store the result in the output buffer. */ + const ALfloat *ResampledData{mResample(&mState, SrcData+(MAX_RESAMPLER_PADDING>>1), + DataPosFrac, increment, {DstData, DstSize})}; + + StoreSamples(DstSamples, ResampledData, mChan.size(), mDstType, DstSize); + } + + /* Update the number of prep samples still available, as well as the + * fractional offset. + */ + DataPosFrac += increment*DstSize; + mSrcPrepCount = mini(prepcount + static_cast(toread - (DataPosFrac>>FRACTIONBITS)), + MAX_RESAMPLER_PADDING); + mFracOffset = DataPosFrac & FRACTIONMASK; + + /* Update the src and dst pointers in case there's still more to do. */ + SamplesIn += SrcFrameSize*(DataPosFrac>>FRACTIONBITS); + NumSrcSamples -= minu(NumSrcSamples, (DataPosFrac>>FRACTIONBITS)); + + dst = static_cast(dst) + DstFrameSize*DstSize; + pos += DstSize; + } + + *src = SamplesIn; + *srcframes = NumSrcSamples; + + return pos; +} + + +void ChannelConverter::convert(const ALvoid *src, ALfloat *dst, ALuint frames) const +{ + if(mSrcChans == DevFmtStereo && mDstChans == DevFmtMono) + { + switch(mSrcType) + { +#define HANDLE_FMT(T) case T: Stereo2Mono(dst, src, frames); break + HANDLE_FMT(DevFmtByte); + HANDLE_FMT(DevFmtUByte); + HANDLE_FMT(DevFmtShort); + HANDLE_FMT(DevFmtUShort); + HANDLE_FMT(DevFmtInt); + HANDLE_FMT(DevFmtUInt); + HANDLE_FMT(DevFmtFloat); +#undef HANDLE_FMT + } + } + else if(mSrcChans == DevFmtMono && mDstChans == DevFmtStereo) + { + switch(mSrcType) + { +#define HANDLE_FMT(T) case T: Mono2Stereo(dst, src, frames); break + HANDLE_FMT(DevFmtByte); + HANDLE_FMT(DevFmtUByte); + HANDLE_FMT(DevFmtShort); + HANDLE_FMT(DevFmtUShort); + HANDLE_FMT(DevFmtInt); + HANDLE_FMT(DevFmtUInt); + HANDLE_FMT(DevFmtFloat); +#undef HANDLE_FMT + } + } + else + LoadSamples(dst, src, 1u, mSrcType, frames * ChannelsFromDevFmt(mSrcChans, 0)); +} diff --git a/alc/converter.h b/alc/converter.h new file mode 100644 index 0000000..5842df0 --- /dev/null +++ b/alc/converter.h @@ -0,0 +1,61 @@ +#ifndef CONVERTER_H +#define CONVERTER_H + +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alu.h" +#include "devformat.h" +#include "voice.h" + + +struct SampleConverter { + DevFmtType mSrcType{}; + DevFmtType mDstType{}; + ALuint mSrcTypeSize{}; + ALuint mDstTypeSize{}; + + ALint mSrcPrepCount{}; + + ALuint mFracOffset{}; + ALuint mIncrement{}; + InterpState mState{}; + ResamplerFunc mResample{}; + + alignas(16) ALfloat mSrcSamples[BUFFERSIZE]{}; + alignas(16) ALfloat mDstSamples[BUFFERSIZE]{}; + + struct ChanSamples { + alignas(16) ALfloat PrevSamples[MAX_RESAMPLER_PADDING]; + }; + al::FlexArray mChan; + + SampleConverter(size_t numchans) : mChan{numchans} { } + + ALuint convert(const ALvoid **src, ALuint *srcframes, ALvoid *dst, ALuint dstframes); + ALuint availableOut(ALuint srcframes) const; + + DEF_FAM_NEWDEL(SampleConverter, mChan) +}; +using SampleConverterPtr = std::unique_ptr; + +SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, size_t numchans, + ALuint srcRate, ALuint dstRate, Resampler resampler); + + +struct ChannelConverter { + DevFmtType mSrcType; + DevFmtChannels mSrcChans; + DevFmtChannels mDstChans; + + bool is_active() const noexcept { return mSrcChans != mDstChans; } + + void convert(const ALvoid *src, ALfloat *dst, ALuint frames) const; +}; + +#endif /* CONVERTER_H */ diff --git a/Alc/cpu_caps.h b/alc/cpu_caps.h similarity index 99% rename from Alc/cpu_caps.h rename to alc/cpu_caps.h index 328d470..64a4ee4 100644 --- a/Alc/cpu_caps.h +++ b/alc/cpu_caps.h @@ -1,6 +1,7 @@ #ifndef CPU_CAPS_H #define CPU_CAPS_H + extern int CPUCapFlags; enum { CPU_CAP_SSE = 1<<0, diff --git a/alc/devformat.h b/alc/devformat.h new file mode 100644 index 0000000..402fb8b --- /dev/null +++ b/alc/devformat.h @@ -0,0 +1,121 @@ +#ifndef ALC_DEVFORMAT_H +#define ALC_DEVFORMAT_H + +#include + +#include "AL/al.h" +#include "AL/alext.h" + +#include "inprogext.h" + + +enum Channel { + FrontLeft = 0, + FrontRight, + FrontCenter, + LFE, + BackLeft, + BackRight, + BackCenter, + SideLeft, + SideRight, + + UpperFrontLeft, + UpperFrontRight, + UpperBackLeft, + UpperBackRight, + LowerFrontLeft, + LowerFrontRight, + LowerBackLeft, + LowerBackRight, + + Aux0, + Aux1, + Aux2, + Aux3, + Aux4, + Aux5, + Aux6, + Aux7, + Aux8, + Aux9, + Aux10, + Aux11, + Aux12, + Aux13, + Aux14, + Aux15, + + MaxChannels +}; + + +/* Device formats */ +enum DevFmtType : ALenum { + DevFmtByte = ALC_BYTE_SOFT, + DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT, + DevFmtShort = ALC_SHORT_SOFT, + DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT, + DevFmtInt = ALC_INT_SOFT, + DevFmtUInt = ALC_UNSIGNED_INT_SOFT, + DevFmtFloat = ALC_FLOAT_SOFT, + + DevFmtTypeDefault = DevFmtFloat +}; +enum DevFmtChannels : ALenum { + DevFmtMono = ALC_MONO_SOFT, + DevFmtStereo = ALC_STEREO_SOFT, + DevFmtQuad = ALC_QUAD_SOFT, + DevFmtX51 = ALC_5POINT1_SOFT, + DevFmtX61 = ALC_6POINT1_SOFT, + DevFmtX71 = ALC_7POINT1_SOFT, + DevFmtAmbi3D = ALC_BFORMAT3D_SOFT, + + /* Similar to 5.1, except using rear channels instead of sides */ + DevFmtX51Rear = 0x70000000, + + DevFmtChannelsDefault = DevFmtStereo +}; +#define MAX_OUTPUT_CHANNELS (16) + +/* DevFmtType traits, providing the type, etc given a DevFmtType. */ +template +struct DevFmtTypeTraits { }; + +template<> +struct DevFmtTypeTraits { using Type = int8_t; }; +template<> +struct DevFmtTypeTraits { using Type = uint8_t; }; +template<> +struct DevFmtTypeTraits { using Type = int16_t; }; +template<> +struct DevFmtTypeTraits { using Type = uint16_t; }; +template<> +struct DevFmtTypeTraits { using Type = int32_t; }; +template<> +struct DevFmtTypeTraits { using Type = uint32_t; }; +template<> +struct DevFmtTypeTraits { using Type = float; }; + + +ALuint BytesFromDevFmt(DevFmtType type) noexcept; +ALuint ChannelsFromDevFmt(DevFmtChannels chans, ALuint ambiorder) noexcept; +inline ALuint FrameSizeFromDevFmt(DevFmtChannels chans, DevFmtType type, ALuint ambiorder) noexcept +{ return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type); } + +enum class AmbiLayout { + FuMa = ALC_FUMA_SOFT, /* FuMa channel order */ + ACN = ALC_ACN_SOFT, /* ACN channel order */ + + Default = ACN +}; + +enum class AmbiNorm { + FuMa = ALC_FUMA_SOFT, /* FuMa normalization */ + SN3D = ALC_SN3D_SOFT, /* SN3D normalization */ + N3D = ALC_N3D_SOFT, /* N3D normalization */ + + Default = SN3D +}; + +#endif /* ALC_DEVFORMAT_H */ diff --git a/alc/effects/autowah.cpp b/alc/effects/autowah.cpp new file mode 100644 index 0000000..a79c21d --- /dev/null +++ b/alc/effects/autowah.cpp @@ -0,0 +1,299 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by Raul Herraiz. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" +#include "filters/biquad.h" +#include "vecmat.h" + +namespace { + +#define MIN_FREQ 20.0f +#define MAX_FREQ 2500.0f +#define Q_FACTOR 5.0f + +struct AutowahState final : public EffectState { + /* Effect parameters */ + ALfloat mAttackRate; + ALfloat mReleaseRate; + ALfloat mResonanceGain; + ALfloat mPeakGain; + ALfloat mFreqMinNorm; + ALfloat mBandwidthNorm; + ALfloat mEnvDelay; + + /* Filter components derived from the envelope. */ + struct { + ALfloat cos_w0; + ALfloat alpha; + } mEnv[BUFFERSIZE]; + + struct { + /* Effect filters' history. */ + struct { + ALfloat z1, z2; + } Filter; + + /* Effect gains for each output channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; + } mChans[MAX_AMBI_CHANNELS]; + + /* Effects buffers */ + alignas(16) ALfloat mBufferOut[BUFFERSIZE]; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(AutowahState) +}; + +ALboolean AutowahState::deviceUpdate(const ALCdevice*) +{ + /* (Re-)initializing parameters and clear the buffers. */ + + mAttackRate = 1.0f; + mReleaseRate = 1.0f; + mResonanceGain = 10.0f; + mPeakGain = 4.5f; + mFreqMinNorm = 4.5e-4f; + mBandwidthNorm = 0.05f; + mEnvDelay = 0.0f; + + for(auto &e : mEnv) + { + e.cos_w0 = 0.0f; + e.alpha = 0.0f; + } + + for(auto &chan : mChans) + { + std::fill(std::begin(chan.CurrentGains), std::end(chan.CurrentGains), 0.0f); + chan.Filter.z1 = 0.0f; + chan.Filter.z2 = 0.0f; + } + + return AL_TRUE; +} + +void AutowahState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *device{context->mDevice.get()}; + const auto frequency = static_cast(device->Frequency); + + const ALfloat ReleaseTime{clampf(props->Autowah.ReleaseTime, 0.001f, 1.0f)}; + + mAttackRate = std::exp(-1.0f / (props->Autowah.AttackTime*frequency)); + mReleaseRate = std::exp(-1.0f / (ReleaseTime*frequency)); + /* 0-20dB Resonance Peak gain */ + mResonanceGain = std::sqrt(std::log10(props->Autowah.Resonance)*10.0f / 3.0f); + mPeakGain = 1.0f - std::log10(props->Autowah.PeakGain/AL_AUTOWAH_MAX_PEAK_GAIN); + mFreqMinNorm = MIN_FREQ / frequency; + mBandwidthNorm = (MAX_FREQ-MIN_FREQ) / frequency; + + mOutTarget = target.Main->Buffer; + for(size_t i{0u};i < slot->Wet.Buffer.size();++i) + { + auto coeffs = GetAmbiIdentityRow(i); + ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); + } +} + +void AutowahState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + const ALfloat attack_rate = mAttackRate; + const ALfloat release_rate = mReleaseRate; + const ALfloat res_gain = mResonanceGain; + const ALfloat peak_gain = mPeakGain; + const ALfloat freq_min = mFreqMinNorm; + const ALfloat bandwidth = mBandwidthNorm; + + ALfloat env_delay{mEnvDelay}; + for(size_t i{0u};i < samplesToDo;i++) + { + ALfloat w0, sample, a; + + /* Envelope follower described on the book: Audio Effects, Theory, + * Implementation and Application. + */ + sample = peak_gain * std::fabs(samplesIn[0][i]); + a = (sample > env_delay) ? attack_rate : release_rate; + env_delay = lerp(sample, env_delay, a); + + /* Calculate the cos and alpha components for this sample's filter. */ + w0 = minf((bandwidth*env_delay + freq_min), 0.46f) * al::MathDefs::Tau(); + mEnv[i].cos_w0 = cosf(w0); + mEnv[i].alpha = sinf(w0)/(2.0f * Q_FACTOR); + } + mEnvDelay = env_delay; + + auto chandata = std::addressof(mChans[0]); + for(const auto &insamples : samplesIn) + { + /* This effectively inlines BiquadFilter_setParams for a peaking + * filter and BiquadFilter_processC. The alpha and cosine components + * for the filter coefficients were previously calculated with the + * envelope. Because the filter changes for each sample, the + * coefficients are transient and don't need to be held. + */ + ALfloat z1{chandata->Filter.z1}; + ALfloat z2{chandata->Filter.z2}; + + for(size_t i{0u};i < samplesToDo;i++) + { + const ALfloat alpha = mEnv[i].alpha; + const ALfloat cos_w0 = mEnv[i].cos_w0; + ALfloat input, output; + ALfloat a[3], b[3]; + + b[0] = 1.0f + alpha*res_gain; + b[1] = -2.0f * cos_w0; + b[2] = 1.0f - alpha*res_gain; + a[0] = 1.0f + alpha/res_gain; + a[1] = -2.0f * cos_w0; + a[2] = 1.0f - alpha/res_gain; + + input = insamples[i]; + output = input*(b[0]/a[0]) + z1; + z1 = input*(b[1]/a[0]) - output*(a[1]/a[0]) + z2; + z2 = input*(b[2]/a[0]) - output*(a[2]/a[0]); + mBufferOut[i] = output; + } + chandata->Filter.z1 = z1; + chandata->Filter.z2 = z2; + + /* Now, mix the processed sound data to the output. */ + MixSamples({mBufferOut, samplesToDo}, samplesOut, chandata->CurrentGains, + chandata->TargetGains, samplesToDo, 0); + ++chandata; + } +} + + +void Autowah_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_AUTOWAH_ATTACK_TIME: + if(!(val >= AL_AUTOWAH_MIN_ATTACK_TIME && val <= AL_AUTOWAH_MAX_ATTACK_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah attack time out of range"); + props->Autowah.AttackTime = val; + break; + + case AL_AUTOWAH_RELEASE_TIME: + if(!(val >= AL_AUTOWAH_MIN_RELEASE_TIME && val <= AL_AUTOWAH_MAX_RELEASE_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah release time out of range"); + props->Autowah.ReleaseTime = val; + break; + + case AL_AUTOWAH_RESONANCE: + if(!(val >= AL_AUTOWAH_MIN_RESONANCE && val <= AL_AUTOWAH_MAX_RESONANCE)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah resonance out of range"); + props->Autowah.Resonance = val; + break; + + case AL_AUTOWAH_PEAK_GAIN: + if(!(val >= AL_AUTOWAH_MIN_PEAK_GAIN && val <= AL_AUTOWAH_MAX_PEAK_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah peak gain out of range"); + props->Autowah.PeakGain = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param); + } +} +void Autowah_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Autowah_setParamf(props, context, param, vals[0]); } + +void Autowah_setParami(EffectProps*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param); } +void Autowah_setParamiv(EffectProps*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param); } + +void Autowah_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_AUTOWAH_ATTACK_TIME: + *val = props->Autowah.AttackTime; + break; + + case AL_AUTOWAH_RELEASE_TIME: + *val = props->Autowah.ReleaseTime; + break; + + case AL_AUTOWAH_RESONANCE: + *val = props->Autowah.Resonance; + break; + + case AL_AUTOWAH_PEAK_GAIN: + *val = props->Autowah.PeakGain; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param); + } + +} +void Autowah_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Autowah_getParamf(props, context, param, vals); } + +void Autowah_getParami(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param); } +void Autowah_getParamiv(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param); } + +DEFINE_ALEFFECT_VTABLE(Autowah); + + +struct AutowahStateFactory final : public EffectStateFactory { + EffectState *create() override { return new AutowahState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Autowah_vtable; } +}; + +EffectProps AutowahStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Autowah.AttackTime = AL_AUTOWAH_DEFAULT_ATTACK_TIME; + props.Autowah.ReleaseTime = AL_AUTOWAH_DEFAULT_RELEASE_TIME; + props.Autowah.Resonance = AL_AUTOWAH_DEFAULT_RESONANCE; + props.Autowah.PeakGain = AL_AUTOWAH_DEFAULT_PEAK_GAIN; + return props; +} + +} // namespace + +EffectStateFactory *AutowahStateFactory_getFactory() +{ + static AutowahStateFactory AutowahFactory{}; + return &AutowahFactory; +} diff --git a/alc/effects/base.h b/alc/effects/base.h new file mode 100644 index 0000000..6889308 --- /dev/null +++ b/alc/effects/base.h @@ -0,0 +1,193 @@ +#ifndef EFFECTS_BASE_H +#define EFFECTS_BASE_H + +#include + +#include "alcmain.h" +#include "almalloc.h" +#include "alspan.h" +#include "atomic.h" +#include "intrusive_ptr.h" + +struct ALeffectslot; + + +union EffectProps { + struct { + // Shared Reverb Properties + ALfloat Density; + ALfloat Diffusion; + ALfloat Gain; + ALfloat GainHF; + ALfloat DecayTime; + ALfloat DecayHFRatio; + ALfloat ReflectionsGain; + ALfloat ReflectionsDelay; + ALfloat LateReverbGain; + ALfloat LateReverbDelay; + ALfloat AirAbsorptionGainHF; + ALfloat RoomRolloffFactor; + bool DecayHFLimit; + + // Additional EAX Reverb Properties + ALfloat GainLF; + ALfloat DecayLFRatio; + ALfloat ReflectionsPan[3]; + ALfloat LateReverbPan[3]; + ALfloat EchoTime; + ALfloat EchoDepth; + ALfloat ModulationTime; + ALfloat ModulationDepth; + ALfloat HFReference; + ALfloat LFReference; + } Reverb; + + struct { + ALfloat AttackTime; + ALfloat ReleaseTime; + ALfloat Resonance; + ALfloat PeakGain; + } Autowah; + + struct { + ALint Waveform; + ALint Phase; + ALfloat Rate; + ALfloat Depth; + ALfloat Feedback; + ALfloat Delay; + } Chorus; /* Also Flanger */ + + struct { + bool OnOff; + } Compressor; + + struct { + ALfloat Edge; + ALfloat Gain; + ALfloat LowpassCutoff; + ALfloat EQCenter; + ALfloat EQBandwidth; + } Distortion; + + struct { + ALfloat Delay; + ALfloat LRDelay; + + ALfloat Damping; + ALfloat Feedback; + + ALfloat Spread; + } Echo; + + struct { + ALfloat LowCutoff; + ALfloat LowGain; + ALfloat Mid1Center; + ALfloat Mid1Gain; + ALfloat Mid1Width; + ALfloat Mid2Center; + ALfloat Mid2Gain; + ALfloat Mid2Width; + ALfloat HighCutoff; + ALfloat HighGain; + } Equalizer; + + struct { + ALfloat Frequency; + ALint LeftDirection; + ALint RightDirection; + } Fshifter; + + struct { + ALfloat Frequency; + ALfloat HighPassCutoff; + ALint Waveform; + } Modulator; + + struct { + ALint CoarseTune; + ALint FineTune; + } Pshifter; + + struct { + ALfloat Rate; + ALint PhonemeA; + ALint PhonemeB; + ALint PhonemeACoarseTuning; + ALint PhonemeBCoarseTuning; + ALint Waveform; + } Vmorpher; + + struct { + ALfloat Gain; + } Dedicated; +}; + + +struct EffectVtable { + void (*const setParami)(EffectProps *props, ALCcontext *context, ALenum param, ALint val); + void (*const setParamiv)(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals); + void (*const setParamf)(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val); + void (*const setParamfv)(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals); + + void (*const getParami)(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val); + void (*const getParamiv)(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals); + void (*const getParamf)(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val); + void (*const getParamfv)(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals); +}; + +#define DEFINE_ALEFFECT_VTABLE(T) \ +const EffectVtable T##_vtable = { \ + T##_setParami, T##_setParamiv, \ + T##_setParamf, T##_setParamfv, \ + T##_getParami, T##_getParamiv, \ + T##_getParamf, T##_getParamfv, \ +} + + +struct EffectTarget { + MixParams *Main; + RealMixParams *RealOut; +}; + +struct EffectState : public al::intrusive_ref { + al::span mOutTarget; + + + virtual ~EffectState() = default; + + virtual ALboolean deviceUpdate(const ALCdevice *device) = 0; + virtual void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) = 0; + virtual void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) = 0; +}; + + +struct EffectStateFactory { + virtual ~EffectStateFactory() { } + + virtual EffectState *create() = 0; + virtual EffectProps getDefaultProps() const noexcept = 0; + virtual const EffectVtable *getEffectVtable() const noexcept = 0; +}; + + +EffectStateFactory *NullStateFactory_getFactory(void); +EffectStateFactory *ReverbStateFactory_getFactory(void); +EffectStateFactory *StdReverbStateFactory_getFactory(void); +EffectStateFactory *AutowahStateFactory_getFactory(void); +EffectStateFactory *ChorusStateFactory_getFactory(void); +EffectStateFactory *CompressorStateFactory_getFactory(void); +EffectStateFactory *DistortionStateFactory_getFactory(void); +EffectStateFactory *EchoStateFactory_getFactory(void); +EffectStateFactory *EqualizerStateFactory_getFactory(void); +EffectStateFactory *FlangerStateFactory_getFactory(void); +EffectStateFactory *FshifterStateFactory_getFactory(void); +EffectStateFactory *ModulatorStateFactory_getFactory(void); +EffectStateFactory *PshifterStateFactory_getFactory(void); +EffectStateFactory* VmorpherStateFactory_getFactory(void); + +EffectStateFactory *DedicatedStateFactory_getFactory(void); + + +#endif /* EFFECTS_BASE_H */ diff --git a/alc/effects/chorus.cpp b/alc/effects/chorus.cpp new file mode 100644 index 0000000..59e05be --- /dev/null +++ b/alc/effects/chorus.cpp @@ -0,0 +1,534 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2013 by Mike Gorchak + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/efx.h" + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "alspan.h" +#include "alu.h" +#include "ambidefs.h" +#include "effects/base.h" +#include "math_defs.h" +#include "opthelpers.h" +#include "vector.h" + + +namespace { + +static_assert(AL_CHORUS_WAVEFORM_SINUSOID == AL_FLANGER_WAVEFORM_SINUSOID, "Chorus/Flanger waveform value mismatch"); +static_assert(AL_CHORUS_WAVEFORM_TRIANGLE == AL_FLANGER_WAVEFORM_TRIANGLE, "Chorus/Flanger waveform value mismatch"); + +enum class WaveForm { + Sinusoid, + Triangle +}; + +void GetTriangleDelays(ALuint *delays, const ALuint start_offset, const ALuint lfo_range, + const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, const size_t todo) +{ + ASSUME(lfo_range > 0); + ASSUME(todo > 0); + + ALuint offset{start_offset}; + auto gen_lfo = [&offset,lfo_range,lfo_scale,depth,delay]() -> ALuint + { + offset = (offset+1)%lfo_range; + const float offset_norm{static_cast(offset) * lfo_scale}; + return static_cast(fastf2i((1.0f-std::abs(2.0f-offset_norm)) * depth) + delay); + }; + std::generate_n(delays, todo, gen_lfo); +} + +void GetSinusoidDelays(ALuint *delays, const ALuint start_offset, const ALuint lfo_range, + const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, const size_t todo) +{ + ASSUME(lfo_range > 0); + ASSUME(todo > 0); + + ALuint offset{start_offset}; + auto gen_lfo = [&offset,lfo_range,lfo_scale,depth,delay]() -> ALuint + { + offset = (offset+1)%lfo_range; + const float offset_norm{static_cast(offset) * lfo_scale}; + return static_cast(fastf2i(std::sin(offset_norm)*depth) + delay); + }; + std::generate_n(delays, todo, gen_lfo); +} + +struct ChorusState final : public EffectState { + al::vector mSampleBuffer; + ALuint mOffset{0}; + + ALuint mLfoOffset{0}; + ALuint mLfoRange{1}; + ALfloat mLfoScale{0.0f}; + ALuint mLfoDisp{0}; + + /* Gains for left and right sides */ + struct { + ALfloat Current[MAX_OUTPUT_CHANNELS]{}; + ALfloat Target[MAX_OUTPUT_CHANNELS]{}; + } mGains[2]; + + /* effect parameters */ + WaveForm mWaveform{}; + ALint mDelay{0}; + ALfloat mDepth{0.0f}; + ALfloat mFeedback{0.0f}; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(ChorusState) +}; + +ALboolean ChorusState::deviceUpdate(const ALCdevice *Device) +{ + constexpr ALfloat max_delay{maxf(AL_CHORUS_MAX_DELAY, AL_FLANGER_MAX_DELAY)}; + + const auto frequency = static_cast(Device->Frequency); + const size_t maxlen{NextPowerOf2(float2uint(max_delay*2.0f*frequency) + 1u)}; + if(maxlen != mSampleBuffer.size()) + { + mSampleBuffer.resize(maxlen); + mSampleBuffer.shrink_to_fit(); + } + + std::fill(mSampleBuffer.begin(), mSampleBuffer.end(), 0.0f); + for(auto &e : mGains) + { + std::fill(std::begin(e.Current), std::end(e.Current), 0.0f); + std::fill(std::begin(e.Target), std::end(e.Target), 0.0f); + } + + return AL_TRUE; +} + +void ChorusState::update(const ALCcontext *Context, const ALeffectslot *Slot, const EffectProps *props, const EffectTarget target) +{ + constexpr ALsizei mindelay{(MAX_RESAMPLER_PADDING>>1) << FRACTIONBITS}; + + switch(props->Chorus.Waveform) + { + case AL_CHORUS_WAVEFORM_TRIANGLE: + mWaveform = WaveForm::Triangle; + break; + case AL_CHORUS_WAVEFORM_SINUSOID: + mWaveform = WaveForm::Sinusoid; + break; + } + + /* The LFO depth is scaled to be relative to the sample delay. Clamp the + * delay and depth to allow enough padding for resampling. + */ + const ALCdevice *device{Context->mDevice.get()}; + const auto frequency = static_cast(device->Frequency); + + mDelay = maxi(float2int(props->Chorus.Delay*frequency*FRACTIONONE + 0.5f), mindelay); + mDepth = minf(props->Chorus.Depth * static_cast(mDelay), + static_cast(mDelay - mindelay)); + + mFeedback = props->Chorus.Feedback; + + /* Gains for left and right sides */ + ALfloat coeffs[2][MAX_AMBI_CHANNELS]; + CalcDirectionCoeffs({-1.0f, 0.0f, 0.0f}, 0.0f, coeffs[0]); + CalcDirectionCoeffs({ 1.0f, 0.0f, 0.0f}, 0.0f, coeffs[1]); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs[0], Slot->Params.Gain, mGains[0].Target); + ComputePanGains(target.Main, coeffs[1], Slot->Params.Gain, mGains[1].Target); + + ALfloat rate{props->Chorus.Rate}; + if(!(rate > 0.0f)) + { + mLfoOffset = 0; + mLfoRange = 1; + mLfoScale = 0.0f; + mLfoDisp = 0; + } + else + { + /* Calculate LFO coefficient (number of samples per cycle). Limit the + * max range to avoid overflow when calculating the displacement. + */ + ALuint lfo_range{float2uint(minf(frequency/rate + 0.5f, ALfloat{INT_MAX/360 - 180}))}; + + mLfoOffset = mLfoOffset * lfo_range / mLfoRange; + mLfoRange = lfo_range; + switch(mWaveform) + { + case WaveForm::Triangle: + mLfoScale = 4.0f / static_cast(mLfoRange); + break; + case WaveForm::Sinusoid: + mLfoScale = al::MathDefs::Tau() / static_cast(mLfoRange); + break; + } + + /* Calculate lfo phase displacement */ + ALint phase{props->Chorus.Phase}; + if(phase < 0) phase = 360 + phase; + mLfoDisp = (mLfoRange*static_cast(phase) + 180) / 360; + } +} + +void ChorusState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + const size_t bufmask{mSampleBuffer.size()-1}; + const ALfloat feedback{mFeedback}; + const ALuint avgdelay{(static_cast(mDelay) + (FRACTIONONE>>1)) >> FRACTIONBITS}; + ALfloat *RESTRICT delaybuf{mSampleBuffer.data()}; + ALuint offset{mOffset}; + + for(size_t base{0u};base < samplesToDo;) + { + const size_t todo{minz(256, samplesToDo-base)}; + + ALuint moddelays[2][256]; + if(mWaveform == WaveForm::Sinusoid) + { + GetSinusoidDelays(moddelays[0], mLfoOffset, mLfoRange, mLfoScale, mDepth, mDelay, + todo); + GetSinusoidDelays(moddelays[1], (mLfoOffset+mLfoDisp)%mLfoRange, mLfoRange, mLfoScale, + mDepth, mDelay, todo); + } + else /*if(mWaveform == WaveForm::Triangle)*/ + { + GetTriangleDelays(moddelays[0], mLfoOffset, mLfoRange, mLfoScale, mDepth, mDelay, + todo); + GetTriangleDelays(moddelays[1], (mLfoOffset+mLfoDisp)%mLfoRange, mLfoRange, mLfoScale, + mDepth, mDelay, todo); + } + mLfoOffset = (mLfoOffset+static_cast(todo)) % mLfoRange; + + alignas(16) ALfloat temps[2][256]; + for(size_t i{0u};i < todo;i++) + { + // Feed the buffer's input first (necessary for delays < 1). + delaybuf[offset&bufmask] = samplesIn[0][base+i]; + + // Tap for the left output. + ALuint delay{offset - (moddelays[0][i]>>FRACTIONBITS)}; + ALfloat mu{static_cast(moddelays[0][i]&FRACTIONMASK) * (1.0f/FRACTIONONE)}; + temps[0][i] = cubic(delaybuf[(delay+1) & bufmask], delaybuf[(delay ) & bufmask], + delaybuf[(delay-1) & bufmask], delaybuf[(delay-2) & bufmask], mu); + + // Tap for the right output. + delay = offset - (moddelays[1][i]>>FRACTIONBITS); + mu = static_cast(moddelays[1][i]&FRACTIONMASK) * (1.0f/FRACTIONONE); + temps[1][i] = cubic(delaybuf[(delay+1) & bufmask], delaybuf[(delay ) & bufmask], + delaybuf[(delay-1) & bufmask], delaybuf[(delay-2) & bufmask], mu); + + // Accumulate feedback from the average delay of the taps. + delaybuf[offset&bufmask] += delaybuf[(offset-avgdelay) & bufmask] * feedback; + ++offset; + } + + for(ALsizei c{0};c < 2;c++) + MixSamples({temps[c], todo}, samplesOut, mGains[c].Current, mGains[c].Target, + samplesToDo-base, base); + + base += todo; + } + + mOffset = offset; +} + + +void Chorus_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_CHORUS_WAVEFORM: + if(!(val >= AL_CHORUS_MIN_WAVEFORM && val <= AL_CHORUS_MAX_WAVEFORM)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid chorus waveform"); + props->Chorus.Waveform = val; + break; + + case AL_CHORUS_PHASE: + if(!(val >= AL_CHORUS_MIN_PHASE && val <= AL_CHORUS_MAX_PHASE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus phase out of range"); + props->Chorus.Phase = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param); + } +} +void Chorus_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ Chorus_setParami(props, context, param, vals[0]); } +void Chorus_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_CHORUS_RATE: + if(!(val >= AL_CHORUS_MIN_RATE && val <= AL_CHORUS_MAX_RATE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus rate out of range"); + props->Chorus.Rate = val; + break; + + case AL_CHORUS_DEPTH: + if(!(val >= AL_CHORUS_MIN_DEPTH && val <= AL_CHORUS_MAX_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus depth out of range"); + props->Chorus.Depth = val; + break; + + case AL_CHORUS_FEEDBACK: + if(!(val >= AL_CHORUS_MIN_FEEDBACK && val <= AL_CHORUS_MAX_FEEDBACK)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus feedback out of range"); + props->Chorus.Feedback = val; + break; + + case AL_CHORUS_DELAY: + if(!(val >= AL_CHORUS_MIN_DELAY && val <= AL_CHORUS_MAX_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus delay out of range"); + props->Chorus.Delay = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param); + } +} +void Chorus_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Chorus_setParamf(props, context, param, vals[0]); } + +void Chorus_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_CHORUS_WAVEFORM: + *val = props->Chorus.Waveform; + break; + + case AL_CHORUS_PHASE: + *val = props->Chorus.Phase; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param); + } +} +void Chorus_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ Chorus_getParami(props, context, param, vals); } +void Chorus_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_CHORUS_RATE: + *val = props->Chorus.Rate; + break; + + case AL_CHORUS_DEPTH: + *val = props->Chorus.Depth; + break; + + case AL_CHORUS_FEEDBACK: + *val = props->Chorus.Feedback; + break; + + case AL_CHORUS_DELAY: + *val = props->Chorus.Delay; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param); + } +} +void Chorus_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Chorus_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Chorus); + + +struct ChorusStateFactory final : public EffectStateFactory { + EffectState *create() override { return new ChorusState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Chorus_vtable; } +}; + +EffectProps ChorusStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Chorus.Waveform = AL_CHORUS_DEFAULT_WAVEFORM; + props.Chorus.Phase = AL_CHORUS_DEFAULT_PHASE; + props.Chorus.Rate = AL_CHORUS_DEFAULT_RATE; + props.Chorus.Depth = AL_CHORUS_DEFAULT_DEPTH; + props.Chorus.Feedback = AL_CHORUS_DEFAULT_FEEDBACK; + props.Chorus.Delay = AL_CHORUS_DEFAULT_DELAY; + return props; +} + + +void Flanger_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_FLANGER_WAVEFORM: + if(!(val >= AL_FLANGER_MIN_WAVEFORM && val <= AL_FLANGER_MAX_WAVEFORM)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid flanger waveform"); + props->Chorus.Waveform = val; + break; + + case AL_FLANGER_PHASE: + if(!(val >= AL_FLANGER_MIN_PHASE && val <= AL_FLANGER_MAX_PHASE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger phase out of range"); + props->Chorus.Phase = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param); + } +} +void Flanger_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ Flanger_setParami(props, context, param, vals[0]); } +void Flanger_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_FLANGER_RATE: + if(!(val >= AL_FLANGER_MIN_RATE && val <= AL_FLANGER_MAX_RATE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger rate out of range"); + props->Chorus.Rate = val; + break; + + case AL_FLANGER_DEPTH: + if(!(val >= AL_FLANGER_MIN_DEPTH && val <= AL_FLANGER_MAX_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger depth out of range"); + props->Chorus.Depth = val; + break; + + case AL_FLANGER_FEEDBACK: + if(!(val >= AL_FLANGER_MIN_FEEDBACK && val <= AL_FLANGER_MAX_FEEDBACK)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger feedback out of range"); + props->Chorus.Feedback = val; + break; + + case AL_FLANGER_DELAY: + if(!(val >= AL_FLANGER_MIN_DELAY && val <= AL_FLANGER_MAX_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger delay out of range"); + props->Chorus.Delay = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param); + } +} +void Flanger_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Flanger_setParamf(props, context, param, vals[0]); } + +void Flanger_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_FLANGER_WAVEFORM: + *val = props->Chorus.Waveform; + break; + + case AL_FLANGER_PHASE: + *val = props->Chorus.Phase; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param); + } +} +void Flanger_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ Flanger_getParami(props, context, param, vals); } +void Flanger_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_FLANGER_RATE: + *val = props->Chorus.Rate; + break; + + case AL_FLANGER_DEPTH: + *val = props->Chorus.Depth; + break; + + case AL_FLANGER_FEEDBACK: + *val = props->Chorus.Feedback; + break; + + case AL_FLANGER_DELAY: + *val = props->Chorus.Delay; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param); + } +} +void Flanger_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Flanger_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Flanger); + + +/* Flanger is basically a chorus with a really short delay. They can both use + * the same processing functions, so piggyback flanger on the chorus functions. + */ +struct FlangerStateFactory final : public EffectStateFactory { + EffectState *create() override { return new ChorusState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Flanger_vtable; } +}; + +EffectProps FlangerStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Chorus.Waveform = AL_FLANGER_DEFAULT_WAVEFORM; + props.Chorus.Phase = AL_FLANGER_DEFAULT_PHASE; + props.Chorus.Rate = AL_FLANGER_DEFAULT_RATE; + props.Chorus.Depth = AL_FLANGER_DEFAULT_DEPTH; + props.Chorus.Feedback = AL_FLANGER_DEFAULT_FEEDBACK; + props.Chorus.Delay = AL_FLANGER_DEFAULT_DELAY; + return props; +} + +} // namespace + +EffectStateFactory *ChorusStateFactory_getFactory() +{ + static ChorusStateFactory ChorusFactory{}; + return &ChorusFactory; +} + +EffectStateFactory *FlangerStateFactory_getFactory() +{ + static FlangerStateFactory FlangerFactory{}; + return &FlangerFactory; +} diff --git a/alc/effects/compressor.cpp b/alc/effects/compressor.cpp new file mode 100644 index 0000000..44ffaae --- /dev/null +++ b/alc/effects/compressor.cpp @@ -0,0 +1,221 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2013 by Anis A. Hireche + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" +#include "vecmat.h" + + +namespace { + +#define AMP_ENVELOPE_MIN 0.5f +#define AMP_ENVELOPE_MAX 2.0f + +#define ATTACK_TIME 0.1f /* 100ms to rise from min to max */ +#define RELEASE_TIME 0.2f /* 200ms to drop from max to min */ + + +struct CompressorState final : public EffectState { + /* Effect gains for each channel */ + ALfloat mGain[MAX_AMBI_CHANNELS][MAX_OUTPUT_CHANNELS]{}; + + /* Effect parameters */ + ALboolean mEnabled{AL_TRUE}; + ALfloat mAttackMult{1.0f}; + ALfloat mReleaseMult{1.0f}; + ALfloat mEnvFollower{1.0f}; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(CompressorState) +}; + +ALboolean CompressorState::deviceUpdate(const ALCdevice *device) +{ + /* Number of samples to do a full attack and release (non-integer sample + * counts are okay). + */ + const ALfloat attackCount = static_cast(device->Frequency) * ATTACK_TIME; + const ALfloat releaseCount = static_cast(device->Frequency) * RELEASE_TIME; + + /* Calculate per-sample multipliers to attack and release at the desired + * rates. + */ + mAttackMult = std::pow(AMP_ENVELOPE_MAX/AMP_ENVELOPE_MIN, 1.0f/attackCount); + mReleaseMult = std::pow(AMP_ENVELOPE_MIN/AMP_ENVELOPE_MAX, 1.0f/releaseCount); + + return AL_TRUE; +} + +void CompressorState::update(const ALCcontext*, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + mEnabled = props->Compressor.OnOff; + + mOutTarget = target.Main->Buffer; + for(size_t i{0u};i < slot->Wet.Buffer.size();++i) + { + auto coeffs = GetAmbiIdentityRow(i); + ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mGain[i]); + } +} + +void CompressorState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + for(size_t base{0u};base < samplesToDo;) + { + ALfloat gains[256]; + const size_t td{minz(256, samplesToDo-base)}; + + /* Generate the per-sample gains from the signal envelope. */ + ALfloat env{mEnvFollower}; + if(mEnabled) + { + for(size_t i{0u};i < td;++i) + { + /* Clamp the absolute amplitude to the defined envelope limits, + * then attack or release the envelope to reach it. + */ + const ALfloat amplitude{clampf(std::fabs(samplesIn[0][base+i]), AMP_ENVELOPE_MIN, + AMP_ENVELOPE_MAX)}; + if(amplitude > env) + env = minf(env*mAttackMult, amplitude); + else if(amplitude < env) + env = maxf(env*mReleaseMult, amplitude); + + /* Apply the reciprocal of the envelope to normalize the volume + * (compress the dynamic range). + */ + gains[i] = 1.0f / env; + } + } + else + { + /* Same as above, except the amplitude is forced to 1. This helps + * ensure smooth gain changes when the compressor is turned on and + * off. + */ + for(size_t i{0u};i < td;++i) + { + const ALfloat amplitude{1.0f}; + if(amplitude > env) + env = minf(env*mAttackMult, amplitude); + else if(amplitude < env) + env = maxf(env*mReleaseMult, amplitude); + + gains[i] = 1.0f / env; + } + } + mEnvFollower = env; + + /* Now compress the signal amplitude to output. */ + auto changains = std::addressof(mGain[0]); + for(const auto &input : samplesIn) + { + const ALfloat *outgains{*(changains++)}; + for(FloatBufferLine &output : samplesOut) + { + const ALfloat gain{*(outgains++)}; + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + for(size_t i{0u};i < td;i++) + output[base+i] += input[base+i] * gains[i] * gain; + } + } + + base += td; + } +} + + +void Compressor_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_COMPRESSOR_ONOFF: + if(!(val >= AL_COMPRESSOR_MIN_ONOFF && val <= AL_COMPRESSOR_MAX_ONOFF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Compressor state out of range"); + props->Compressor.OnOff = val != AL_FALSE; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", + param); + } +} +void Compressor_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ Compressor_setParami(props, context, param, vals[0]); } +void Compressor_setParamf(EffectProps*, ALCcontext *context, ALenum param, ALfloat) +{ context->setError(AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param); } +void Compressor_setParamfv(EffectProps*, ALCcontext *context, ALenum param, const ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param); } + +void Compressor_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_COMPRESSOR_ONOFF: + *val = props->Compressor.OnOff; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", + param); + } +} +void Compressor_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ Compressor_getParami(props, context, param, vals); } +void Compressor_getParamf(const EffectProps*, ALCcontext *context, ALenum param, ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param); } +void Compressor_getParamfv(const EffectProps*, ALCcontext *context, ALenum param, ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param); } + +DEFINE_ALEFFECT_VTABLE(Compressor); + + +struct CompressorStateFactory final : public EffectStateFactory { + EffectState *create() override { return new CompressorState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Compressor_vtable; } +}; + +EffectProps CompressorStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Compressor.OnOff = AL_COMPRESSOR_DEFAULT_ONOFF; + return props; +} + +} // namespace + +EffectStateFactory *CompressorStateFactory_getFactory() +{ + static CompressorStateFactory CompressorFactory{}; + return &CompressorFactory; +} diff --git a/alc/effects/dedicated.cpp b/alc/effects/dedicated.cpp new file mode 100644 index 0000000..aa81e13 --- /dev/null +++ b/alc/effects/dedicated.cpp @@ -0,0 +1,160 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2011 by Chris Robinson. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" + + +namespace { + +struct DedicatedState final : public EffectState { + ALfloat mCurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat mTargetGains[MAX_OUTPUT_CHANNELS]; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(DedicatedState) +}; + +ALboolean DedicatedState::deviceUpdate(const ALCdevice*) +{ + std::fill(std::begin(mCurrentGains), std::end(mCurrentGains), 0.0f); + return AL_TRUE; +} + +void DedicatedState::update(const ALCcontext*, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + std::fill(std::begin(mTargetGains), std::end(mTargetGains), 0.0f); + + const ALfloat Gain{slot->Params.Gain * props->Dedicated.Gain}; + + if(slot->Params.EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT) + { + const ALuint idx{!target.RealOut ? INVALID_CHANNEL_INDEX : + GetChannelIdxByName(*target.RealOut, LFE)}; + if(idx != INVALID_CHANNEL_INDEX) + { + mOutTarget = target.RealOut->Buffer; + mTargetGains[idx] = Gain; + } + } + else if(slot->Params.EffectType == AL_EFFECT_DEDICATED_DIALOGUE) + { + /* Dialog goes to the front-center speaker if it exists, otherwise it + * plays from the front-center location. */ + const ALuint idx{!target.RealOut ? INVALID_CHANNEL_INDEX : + GetChannelIdxByName(*target.RealOut, FrontCenter)}; + if(idx != INVALID_CHANNEL_INDEX) + { + mOutTarget = target.RealOut->Buffer; + mTargetGains[idx] = Gain; + } + else + { + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcDirectionCoeffs({0.0f, 0.0f, -1.0f}, 0.0f, coeffs); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs, Gain, mTargetGains); + } + } +} + +void DedicatedState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + MixSamples({samplesIn[0].data(), samplesToDo}, samplesOut, mCurrentGains, mTargetGains, + samplesToDo, 0); +} + + +void Dedicated_setParami(EffectProps*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param); } +void Dedicated_setParamiv(EffectProps*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param); } +void Dedicated_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_DEDICATED_GAIN: + if(!(val >= 0.0f && std::isfinite(val))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Dedicated gain out of range"); + props->Dedicated.Gain = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param); + } +} +void Dedicated_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Dedicated_setParamf(props, context, param, vals[0]); } + +void Dedicated_getParami(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param); } +void Dedicated_getParamiv(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param); } +void Dedicated_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_DEDICATED_GAIN: + *val = props->Dedicated.Gain; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param); + } +} +void Dedicated_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Dedicated_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Dedicated); + + +struct DedicatedStateFactory final : public EffectStateFactory { + EffectState *create() override { return new DedicatedState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Dedicated_vtable; } +}; + +EffectProps DedicatedStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Dedicated.Gain = 1.0f; + return props; +} + +} // namespace + +EffectStateFactory *DedicatedStateFactory_getFactory() +{ + static DedicatedStateFactory DedicatedFactory{}; + return &DedicatedFactory; +} diff --git a/alc/effects/distortion.cpp b/alc/effects/distortion.cpp new file mode 100644 index 0000000..48fc83e --- /dev/null +++ b/alc/effects/distortion.cpp @@ -0,0 +1,262 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2013 by Mike Gorchak + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" +#include "filters/biquad.h" + + +namespace { + +struct DistortionState final : public EffectState { + /* Effect gains for each channel */ + ALfloat mGain[MAX_OUTPUT_CHANNELS]{}; + + /* Effect parameters */ + BiquadFilter mLowpass; + BiquadFilter mBandpass; + ALfloat mAttenuation{}; + ALfloat mEdgeCoeff{}; + + ALfloat mBuffer[2][BUFFERSIZE]{}; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(DistortionState) +}; + +ALboolean DistortionState::deviceUpdate(const ALCdevice*) +{ + mLowpass.clear(); + mBandpass.clear(); + return AL_TRUE; +} + +void DistortionState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *device{context->mDevice.get()}; + + /* Store waveshaper edge settings. */ + const ALfloat edge{ + minf(std::sin(al::MathDefs::Pi()*0.5f * props->Distortion.Edge), 0.99f)}; + mEdgeCoeff = 2.0f * edge / (1.0f-edge); + + ALfloat cutoff{props->Distortion.LowpassCutoff}; + /* Bandwidth value is constant in octaves. */ + ALfloat bandwidth{(cutoff / 2.0f) / (cutoff * 0.67f)}; + /* Divide normalized frequency by the amount of oversampling done during + * processing. + */ + auto frequency = static_cast(device->Frequency); + mLowpass.setParamsFromBandwidth(BiquadType::LowPass, cutoff/frequency/4.0f, 1.0f, bandwidth); + + cutoff = props->Distortion.EQCenter; + /* Convert bandwidth in Hz to octaves. */ + bandwidth = props->Distortion.EQBandwidth / (cutoff * 0.67f); + mBandpass.setParamsFromBandwidth(BiquadType::BandPass, cutoff/frequency/4.0f, 1.0f, bandwidth); + + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcDirectionCoeffs({0.0f, 0.0f, -1.0f}, 0.0f, coeffs); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs, slot->Params.Gain*props->Distortion.Gain, mGain); +} + +void DistortionState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + const ALfloat fc{mEdgeCoeff}; + for(size_t base{0u};base < samplesToDo;) + { + /* Perform 4x oversampling to avoid aliasing. Oversampling greatly + * improves distortion quality and allows to implement lowpass and + * bandpass filters using high frequencies, at which classic IIR + * filters became unstable. + */ + size_t todo{minz(BUFFERSIZE, (samplesToDo-base) * 4)}; + + /* Fill oversample buffer using zero stuffing. Multiply the sample by + * the amount of oversampling to maintain the signal's power. + */ + for(size_t i{0u};i < todo;i++) + mBuffer[0][i] = !(i&3) ? samplesIn[0][(i>>2)+base] * 4.0f : 0.0f; + + /* First step, do lowpass filtering of original signal. Additionally + * perform buffer interpolation and lowpass cutoff for oversampling + * (which is fortunately first step of distortion). So combine three + * operations into the one. + */ + mLowpass.process({mBuffer[0], todo}, mBuffer[1]); + + /* Second step, do distortion using waveshaper function to emulate + * signal processing during tube overdriving. Three steps of + * waveshaping are intended to modify waveform without boost/clipping/ + * attenuation process. + */ + auto proc_sample = [fc](float smp) -> float + { + smp = (1.0f + fc) * smp/(1.0f + fc*std::abs(smp)); + smp = (1.0f + fc) * smp/(1.0f + fc*std::abs(smp)) * -1.0f; + smp = (1.0f + fc) * smp/(1.0f + fc*std::abs(smp)); + return smp; + }; + std::transform(std::begin(mBuffer[1]), std::begin(mBuffer[1])+todo, std::begin(mBuffer[0]), + proc_sample); + + /* Third step, do bandpass filtering of distorted signal. */ + mBandpass.process({mBuffer[0], todo}, mBuffer[1]); + + todo >>= 2; + const ALfloat *outgains{mGain}; + for(FloatBufferLine &output : samplesOut) + { + /* Fourth step, final, do attenuation and perform decimation, + * storing only one sample out of four. + */ + const ALfloat gain{*(outgains++)}; + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + for(size_t i{0u};i < todo;i++) + output[base+i] += gain * mBuffer[1][i*4]; + } + + base += todo; + } +} + + +void Distortion_setParami(EffectProps*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param); } +void Distortion_setParamiv(EffectProps*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param); } +void Distortion_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_DISTORTION_EDGE: + if(!(val >= AL_DISTORTION_MIN_EDGE && val <= AL_DISTORTION_MAX_EDGE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion edge out of range"); + props->Distortion.Edge = val; + break; + + case AL_DISTORTION_GAIN: + if(!(val >= AL_DISTORTION_MIN_GAIN && val <= AL_DISTORTION_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion gain out of range"); + props->Distortion.Gain = val; + break; + + case AL_DISTORTION_LOWPASS_CUTOFF: + if(!(val >= AL_DISTORTION_MIN_LOWPASS_CUTOFF && val <= AL_DISTORTION_MAX_LOWPASS_CUTOFF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion low-pass cutoff out of range"); + props->Distortion.LowpassCutoff = val; + break; + + case AL_DISTORTION_EQCENTER: + if(!(val >= AL_DISTORTION_MIN_EQCENTER && val <= AL_DISTORTION_MAX_EQCENTER)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion EQ center out of range"); + props->Distortion.EQCenter = val; + break; + + case AL_DISTORTION_EQBANDWIDTH: + if(!(val >= AL_DISTORTION_MIN_EQBANDWIDTH && val <= AL_DISTORTION_MAX_EQBANDWIDTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion EQ bandwidth out of range"); + props->Distortion.EQBandwidth = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", param); + } +} +void Distortion_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Distortion_setParamf(props, context, param, vals[0]); } + +void Distortion_getParami(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param); } +void Distortion_getParamiv(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param); } +void Distortion_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_DISTORTION_EDGE: + *val = props->Distortion.Edge; + break; + + case AL_DISTORTION_GAIN: + *val = props->Distortion.Gain; + break; + + case AL_DISTORTION_LOWPASS_CUTOFF: + *val = props->Distortion.LowpassCutoff; + break; + + case AL_DISTORTION_EQCENTER: + *val = props->Distortion.EQCenter; + break; + + case AL_DISTORTION_EQBANDWIDTH: + *val = props->Distortion.EQBandwidth; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", param); + } +} +void Distortion_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Distortion_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Distortion); + + +struct DistortionStateFactory final : public EffectStateFactory { + EffectState *create() override { return new DistortionState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Distortion_vtable; } +}; + +EffectProps DistortionStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Distortion.Edge = AL_DISTORTION_DEFAULT_EDGE; + props.Distortion.Gain = AL_DISTORTION_DEFAULT_GAIN; + props.Distortion.LowpassCutoff = AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF; + props.Distortion.EQCenter = AL_DISTORTION_DEFAULT_EQCENTER; + props.Distortion.EQBandwidth = AL_DISTORTION_DEFAULT_EQBANDWIDTH; + return props; +} + +} // namespace + +EffectStateFactory *DistortionStateFactory_getFactory() +{ + static DistortionStateFactory DistortionFactory{}; + return &DistortionFactory; +} diff --git a/alc/effects/echo.cpp b/alc/effects/echo.cpp new file mode 100644 index 0000000..e68badd --- /dev/null +++ b/alc/effects/echo.cpp @@ -0,0 +1,266 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2009 by Chris Robinson. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include + +#include "al/auxeffectslot.h" +#include "al/filter.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" +#include "filters/biquad.h" +#include "vector.h" + + +namespace { + +struct EchoState final : public EffectState { + al::vector mSampleBuffer; + + // The echo is two tap. The delay is the number of samples from before the + // current offset + struct { + size_t delay{0u}; + } mTap[2]; + size_t mOffset{0u}; + + /* The panning gains for the two taps */ + struct { + ALfloat Current[MAX_OUTPUT_CHANNELS]{}; + ALfloat Target[MAX_OUTPUT_CHANNELS]{}; + } mGains[2]; + + BiquadFilter mFilter; + ALfloat mFeedGain{0.0f}; + + alignas(16) ALfloat mTempBuffer[2][BUFFERSIZE]; + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(EchoState) +}; + +ALboolean EchoState::deviceUpdate(const ALCdevice *Device) +{ + const auto frequency = static_cast(Device->Frequency); + + // Use the next power of 2 for the buffer length, so the tap offsets can be + // wrapped using a mask instead of a modulo + const ALuint maxlen{NextPowerOf2(float2uint(AL_ECHO_MAX_DELAY*frequency + 0.5f) + + float2uint(AL_ECHO_MAX_LRDELAY*frequency + 0.5f))}; + if(maxlen != mSampleBuffer.size()) + { + mSampleBuffer.resize(maxlen); + mSampleBuffer.shrink_to_fit(); + } + + std::fill(mSampleBuffer.begin(), mSampleBuffer.end(), 0.0f); + for(auto &e : mGains) + { + std::fill(std::begin(e.Current), std::end(e.Current), 0.0f); + std::fill(std::begin(e.Target), std::end(e.Target), 0.0f); + } + + return AL_TRUE; +} + +void EchoState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *device{context->mDevice.get()}; + const auto frequency = static_cast(device->Frequency); + + mTap[0].delay = maxu(float2uint(props->Echo.Delay*frequency + 0.5f), 1); + mTap[1].delay = float2uint(props->Echo.LRDelay*frequency + 0.5f) + mTap[0].delay; + + const ALfloat gainhf{maxf(1.0f - props->Echo.Damping, 0.0625f)}; /* Limit -24dB */ + mFilter.setParamsFromSlope(BiquadType::HighShelf, LOWPASSFREQREF/frequency, gainhf, 1.0f); + + mFeedGain = props->Echo.Feedback; + + /* Convert echo spread (where 0 = center, +/-1 = sides) to angle. */ + const ALfloat angle{std::asin(props->Echo.Spread)}; + + ALfloat coeffs[2][MAX_AMBI_CHANNELS]; + CalcAngleCoeffs(-angle, 0.0f, 0.0f, coeffs[0]); + CalcAngleCoeffs( angle, 0.0f, 0.0f, coeffs[1]); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs[0], slot->Params.Gain, mGains[0].Target); + ComputePanGains(target.Main, coeffs[1], slot->Params.Gain, mGains[1].Target); +} + +void EchoState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + const size_t mask{mSampleBuffer.size()-1}; + ALfloat *RESTRICT delaybuf{mSampleBuffer.data()}; + size_t offset{mOffset}; + size_t tap1{offset - mTap[0].delay}; + size_t tap2{offset - mTap[1].delay}; + ALfloat z1, z2; + + ASSUME(samplesToDo > 0); + + const BiquadFilter filter{mFilter}; + std::tie(z1, z2) = mFilter.getComponents(); + for(size_t i{0u};i < samplesToDo;) + { + offset &= mask; + tap1 &= mask; + tap2 &= mask; + + size_t td{minz(mask+1 - maxz(offset, maxz(tap1, tap2)), samplesToDo-i)}; + do { + /* Feed the delay buffer's input first. */ + delaybuf[offset] = samplesIn[0][i]; + + /* Get delayed output from the first and second taps. Use the + * second tap for feedback. + */ + mTempBuffer[0][i] = delaybuf[tap1++]; + mTempBuffer[1][i] = delaybuf[tap2++]; + const float feedb{mTempBuffer[1][i++]}; + + /* Add feedback to the delay buffer with damping and attenuation. */ + delaybuf[offset++] += filter.processOne(feedb, z1, z2) * mFeedGain; + } while(--td); + } + mFilter.setComponents(z1, z2); + mOffset = offset; + + for(ALsizei c{0};c < 2;c++) + MixSamples({mTempBuffer[c], samplesToDo}, samplesOut, mGains[c].Current, mGains[c].Target, + samplesToDo, 0); +} + + +void Echo_setParami(EffectProps*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param); } +void Echo_setParamiv(EffectProps*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param); } +void Echo_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_ECHO_DELAY: + if(!(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo delay out of range"); + props->Echo.Delay = val; + break; + + case AL_ECHO_LRDELAY: + if(!(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo LR delay out of range"); + props->Echo.LRDelay = val; + break; + + case AL_ECHO_DAMPING: + if(!(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo damping out of range"); + props->Echo.Damping = val; + break; + + case AL_ECHO_FEEDBACK: + if(!(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo feedback out of range"); + props->Echo.Feedback = val; + break; + + case AL_ECHO_SPREAD: + if(!(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo spread out of range"); + props->Echo.Spread = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param); + } +} +void Echo_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Echo_setParamf(props, context, param, vals[0]); } + +void Echo_getParami(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param); } +void Echo_getParamiv(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param); } +void Echo_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_ECHO_DELAY: + *val = props->Echo.Delay; + break; + + case AL_ECHO_LRDELAY: + *val = props->Echo.LRDelay; + break; + + case AL_ECHO_DAMPING: + *val = props->Echo.Damping; + break; + + case AL_ECHO_FEEDBACK: + *val = props->Echo.Feedback; + break; + + case AL_ECHO_SPREAD: + *val = props->Echo.Spread; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param); + } +} +void Echo_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Echo_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Echo); + + +struct EchoStateFactory final : public EffectStateFactory { + EffectState *create() override { return new EchoState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Echo_vtable; } +}; + +EffectProps EchoStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Echo.Delay = AL_ECHO_DEFAULT_DELAY; + props.Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY; + props.Echo.Damping = AL_ECHO_DEFAULT_DAMPING; + props.Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK; + props.Echo.Spread = AL_ECHO_DEFAULT_SPREAD; + return props; +} + +} // namespace + +EffectStateFactory *EchoStateFactory_getFactory() +{ + static EchoStateFactory EchoFactory{}; + return &EchoFactory; +} diff --git a/Alc/effects/equalizer.c b/alc/effects/equalizer.cpp similarity index 55% rename from Alc/effects/equalizer.c rename to alc/effects/equalizer.cpp index 8ff56fb..a4204b3 100644 --- a/Alc/effects/equalizer.c +++ b/alc/effects/equalizer.cpp @@ -20,15 +20,21 @@ #include "config.h" -#include -#include +#include +#include -#include "alMain.h" -#include "alAuxEffectSlot.h" -#include "alError.h" +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" #include "alu.h" -#include "filters/defs.h" +#include "filters/biquad.h" +#include "vecmat.h" + +namespace { /* The document "Effects Extension Guide.pdf" says that low and high * * frequencies are cutoff frequencies. This is not fully correct, they * @@ -72,161 +78,108 @@ * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt */ -typedef struct ALequalizerState { - DERIVE_FROM_TYPE(ALeffectState); - +struct EqualizerState final : public EffectState { struct { - /* Effect gains for each channel */ - ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; - ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; - /* Effect parameters */ BiquadFilter filter[4]; - } Chans[MAX_EFFECT_CHANNELS]; - ALfloat SampleBuffer[MAX_EFFECT_CHANNELS][BUFFERSIZE]; -} ALequalizerState; + /* Effect gains for each channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]{}; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]{}; + } mChans[MAX_AMBI_CHANNELS]; -static ALvoid ALequalizerState_Destruct(ALequalizerState *state); -static ALboolean ALequalizerState_deviceUpdate(ALequalizerState *state, ALCdevice *device); -static ALvoid ALequalizerState_update(ALequalizerState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALequalizerState_process(ALequalizerState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALequalizerState) + ALfloat mSampleBuffer[BUFFERSIZE]{}; -DEFINE_ALEFFECTSTATE_VTABLE(ALequalizerState); + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; -static void ALequalizerState_Construct(ALequalizerState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALequalizerState, ALeffectState, state); -} - -static ALvoid ALequalizerState_Destruct(ALequalizerState *state) -{ - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} + DEF_NEWDEL(EqualizerState) +}; -static ALboolean ALequalizerState_deviceUpdate(ALequalizerState *state, ALCdevice *UNUSED(device)) +ALboolean EqualizerState::deviceUpdate(const ALCdevice*) { - ALsizei i, j; - - for(i = 0; i < MAX_EFFECT_CHANNELS;i++) + for(auto &e : mChans) { - for(j = 0;j < 4;j++) - BiquadFilter_clear(&state->Chans[i].filter[j]); - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - state->Chans[i].CurrentGains[j] = 0.0f; + std::for_each(std::begin(e.filter), std::end(e.filter), + std::mem_fn(&BiquadFilter::clear)); + std::fill(std::begin(e.CurrentGains), std::end(e.CurrentGains), 0.0f); } return AL_TRUE; } -static ALvoid ALequalizerState_update(ALequalizerState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) +void EqualizerState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) { - const ALCdevice *device = context->Device; - ALfloat frequency = (ALfloat)device->Frequency; + const ALCdevice *device{context->mDevice.get()}; + auto frequency = static_cast(device->Frequency); ALfloat gain, f0norm; - ALuint i; - - STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(&device->FOAOut, IdentityMatrixf.m[i], - slot->Params.Gain, state->Chans[i].TargetGains); /* Calculate coefficients for the each type of filter. Note that the shelf - * filters' gain is for the reference frequency, which is the centerpoint - * of the transition band. + * and peaking filters' gain is for the centerpoint of the transition band, + * while the effect property gains are for the shelf/peak itself. So the + * property gains need their dB halved (sqrt of linear gain) for the + * shelf/peak to reach the provided gain. */ - gain = maxf(sqrtf(props->Equalizer.LowGain), 0.0625f); /* Limit -24dB */ - f0norm = props->Equalizer.LowCutoff/frequency; - BiquadFilter_setParams(&state->Chans[0].filter[0], BiquadType_LowShelf, - gain, f0norm, calc_rcpQ_from_slope(gain, 0.75f) - ); - - gain = maxf(props->Equalizer.Mid1Gain, 0.0625f); - f0norm = props->Equalizer.Mid1Center/frequency; - BiquadFilter_setParams(&state->Chans[0].filter[1], BiquadType_Peaking, - gain, f0norm, calc_rcpQ_from_bandwidth( - f0norm, props->Equalizer.Mid1Width - ) - ); - - gain = maxf(props->Equalizer.Mid2Gain, 0.0625f); - f0norm = props->Equalizer.Mid2Center/frequency; - BiquadFilter_setParams(&state->Chans[0].filter[2], BiquadType_Peaking, - gain, f0norm, calc_rcpQ_from_bandwidth( - f0norm, props->Equalizer.Mid2Width - ) - ); - - gain = maxf(sqrtf(props->Equalizer.HighGain), 0.0625f); - f0norm = props->Equalizer.HighCutoff/frequency; - BiquadFilter_setParams(&state->Chans[0].filter[3], BiquadType_HighShelf, - gain, f0norm, calc_rcpQ_from_slope(gain, 0.75f) - ); + gain = std::sqrt(props->Equalizer.LowGain); + f0norm = props->Equalizer.LowCutoff / frequency; + mChans[0].filter[0].setParamsFromSlope(BiquadType::LowShelf, f0norm, gain, 0.75f); + + gain = std::sqrt(props->Equalizer.Mid1Gain); + f0norm = props->Equalizer.Mid1Center / frequency; + mChans[0].filter[1].setParamsFromBandwidth(BiquadType::Peaking, f0norm, gain, + props->Equalizer.Mid1Width); + + gain = std::sqrt(props->Equalizer.Mid2Gain); + f0norm = props->Equalizer.Mid2Center / frequency; + mChans[0].filter[2].setParamsFromBandwidth(BiquadType::Peaking, f0norm, gain, + props->Equalizer.Mid2Width); + + gain = std::sqrt(props->Equalizer.HighGain); + f0norm = props->Equalizer.HighCutoff / frequency; + mChans[0].filter[3].setParamsFromSlope(BiquadType::HighShelf, f0norm, gain, 0.75f); /* Copy the filter coefficients for the other input channels. */ - for(i = 1;i < MAX_EFFECT_CHANNELS;i++) + for(size_t i{1u};i < slot->Wet.Buffer.size();++i) { - BiquadFilter_copyParams(&state->Chans[i].filter[0], &state->Chans[0].filter[0]); - BiquadFilter_copyParams(&state->Chans[i].filter[1], &state->Chans[0].filter[1]); - BiquadFilter_copyParams(&state->Chans[i].filter[2], &state->Chans[0].filter[2]); - BiquadFilter_copyParams(&state->Chans[i].filter[3], &state->Chans[0].filter[3]); + mChans[i].filter[0].copyParamsFrom(mChans[0].filter[0]); + mChans[i].filter[1].copyParamsFrom(mChans[0].filter[1]); + mChans[i].filter[2].copyParamsFrom(mChans[0].filter[2]); + mChans[i].filter[3].copyParamsFrom(mChans[0].filter[3]); } -} -static ALvoid ALequalizerState_process(ALequalizerState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ALfloat (*restrict temps)[BUFFERSIZE] = state->SampleBuffer; - ALsizei c; - - for(c = 0;c < MAX_EFFECT_CHANNELS;c++) + mOutTarget = target.Main->Buffer; + for(size_t i{0u};i < slot->Wet.Buffer.size();++i) { - BiquadFilter_process(&state->Chans[c].filter[0], temps[0], SamplesIn[c], SamplesToDo); - BiquadFilter_process(&state->Chans[c].filter[1], temps[1], temps[0], SamplesToDo); - BiquadFilter_process(&state->Chans[c].filter[2], temps[2], temps[1], SamplesToDo); - BiquadFilter_process(&state->Chans[c].filter[3], temps[3], temps[2], SamplesToDo); - - MixSamples(temps[3], NumChannels, SamplesOut, - state->Chans[c].CurrentGains, state->Chans[c].TargetGains, - SamplesToDo, 0, SamplesToDo - ); + auto coeffs = GetAmbiIdentityRow(i); + ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); } } - -typedef struct EqualizerStateFactory { - DERIVE_FROM_TYPE(EffectStateFactory); -} EqualizerStateFactory; - -ALeffectState *EqualizerStateFactory_create(EqualizerStateFactory *UNUSED(factory)) -{ - ALequalizerState *state; - - NEW_OBJ0(state, ALequalizerState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_EFFECTSTATEFACTORY_VTABLE(EqualizerStateFactory); - -EffectStateFactory *EqualizerStateFactory_getFactory(void) +void EqualizerState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) { - static EqualizerStateFactory EqualizerFactory = { { GET_VTABLE2(EqualizerStateFactory, EffectStateFactory) } }; - - return STATIC_CAST(EffectStateFactory, &EqualizerFactory); + const al::span buffer{mSampleBuffer, samplesToDo}; + auto chandata = std::addressof(mChans[0]); + for(const auto &input : samplesIn) + { + chandata->filter[0].process({input.data(), samplesToDo}, buffer.begin()); + chandata->filter[1].process(buffer, buffer.begin()); + chandata->filter[2].process(buffer, buffer.begin()); + chandata->filter[3].process(buffer, buffer.begin()); + + MixSamples(buffer, samplesOut, chandata->CurrentGains, chandata->TargetGains, samplesToDo, + 0u); + ++chandata; + } } -void ALequalizer_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param); } -void ALequalizer_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param); } -void ALequalizer_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +void Equalizer_setParami(EffectProps*, ALCcontext *context, ALenum param, ALint) +{ context->setError(AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param); } +void Equalizer_setParamiv(EffectProps*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param); } +void Equalizer_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) { - ALeffectProps *props = &effect->Props; switch(param) { case AL_EQUALIZER_LOW_GAIN: @@ -290,19 +243,18 @@ void ALequalizer_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, break; default: - alSetError(context, AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param); + context->setError(AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param); } } -void ALequalizer_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ ALequalizer_setParamf(effect, context, param, vals[0]); } - -void ALequalizer_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param); } -void ALequalizer_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) -{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param); } -void ALequalizer_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +void Equalizer_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Equalizer_setParamf(props, context, param, vals[0]); } + +void Equalizer_getParami(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param); } +void Equalizer_getParamiv(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param); } +void Equalizer_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) { - const ALeffectProps *props = &effect->Props; switch(param) { case AL_EQUALIZER_LOW_GAIN: @@ -346,10 +298,41 @@ void ALequalizer_getParamf(const ALeffect *effect, ALCcontext *context, ALenum p break; default: - alSetError(context, AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param); + context->setError(AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param); } } -void ALequalizer_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ ALequalizer_getParamf(effect, context, param, vals); } +void Equalizer_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Equalizer_getParamf(props, context, param, vals); } -DEFINE_ALEFFECT_VTABLE(ALequalizer); +DEFINE_ALEFFECT_VTABLE(Equalizer); + + +struct EqualizerStateFactory final : public EffectStateFactory { + EffectState *create() override { return new EqualizerState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Equalizer_vtable; } +}; + +EffectProps EqualizerStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Equalizer.LowCutoff = AL_EQUALIZER_DEFAULT_LOW_CUTOFF; + props.Equalizer.LowGain = AL_EQUALIZER_DEFAULT_LOW_GAIN; + props.Equalizer.Mid1Center = AL_EQUALIZER_DEFAULT_MID1_CENTER; + props.Equalizer.Mid1Gain = AL_EQUALIZER_DEFAULT_MID1_GAIN; + props.Equalizer.Mid1Width = AL_EQUALIZER_DEFAULT_MID1_WIDTH; + props.Equalizer.Mid2Center = AL_EQUALIZER_DEFAULT_MID2_CENTER; + props.Equalizer.Mid2Gain = AL_EQUALIZER_DEFAULT_MID2_GAIN; + props.Equalizer.Mid2Width = AL_EQUALIZER_DEFAULT_MID2_WIDTH; + props.Equalizer.HighCutoff = AL_EQUALIZER_DEFAULT_HIGH_CUTOFF; + props.Equalizer.HighGain = AL_EQUALIZER_DEFAULT_HIGH_GAIN; + return props; +} + +} // namespace + +EffectStateFactory *EqualizerStateFactory_getFactory() +{ + static EqualizerStateFactory EqualizerFactory{}; + return &EqualizerFactory; +} diff --git a/alc/effects/fshifter.cpp b/alc/effects/fshifter.cpp new file mode 100644 index 0000000..1b93504 --- /dev/null +++ b/alc/effects/fshifter.cpp @@ -0,0 +1,332 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by Raul Herraiz. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" + +#include "alcomplex.h" + +namespace { + +using complex_d = std::complex; + +#define HIL_SIZE 1024 +#define OVERSAMP (1<<2) + +#define HIL_STEP (HIL_SIZE / OVERSAMP) +#define FIFO_LATENCY (HIL_STEP * (OVERSAMP-1)) + +/* Define a Hann window, used to filter the HIL input and output. */ +/* Making this constexpr seems to require C++14. */ +std::array InitHannWindow() +{ + std::array ret; + /* Create lookup table of the Hann window for the desired size, i.e. HIL_SIZE */ + for(size_t i{0};i < HIL_SIZE>>1;i++) + { + constexpr double scale{al::MathDefs::Pi() / double{HIL_SIZE-1}}; + const double val{std::sin(static_cast(i) * scale)}; + ret[i] = ret[HIL_SIZE-1-i] = val * val; + } + return ret; +} +alignas(16) const std::array HannWindow = InitHannWindow(); + + +struct FshifterState final : public EffectState { + /* Effect parameters */ + size_t mCount{}; + ALsizei mPhaseStep[2]{}; + ALsizei mPhase[2]{}; + ALdouble mSign[2]{}; + + + /*Effects buffers*/ + ALfloat mInFIFO[HIL_SIZE]{}; + complex_d mOutFIFO[HIL_SIZE]{}; + complex_d mOutputAccum[HIL_SIZE]{}; + complex_d mAnalytic[HIL_SIZE]{}; + complex_d mOutdata[BUFFERSIZE]{}; + + alignas(16) ALfloat mBufferOut[BUFFERSIZE]{}; + + /* Effect gains for each output channel */ + struct { + ALfloat Current[MAX_OUTPUT_CHANNELS]{}; + ALfloat Target[MAX_OUTPUT_CHANNELS]{}; + } mGains[2]; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(FshifterState) +}; + +ALboolean FshifterState::deviceUpdate(const ALCdevice*) +{ + /* (Re-)initializing parameters and clear the buffers. */ + mCount = FIFO_LATENCY; + + std::fill(std::begin(mPhaseStep), std::end(mPhaseStep), 0); + std::fill(std::begin(mPhase), std::end(mPhase), 0); + std::fill(std::begin(mSign), std::end(mSign), 1.0); + std::fill(std::begin(mInFIFO), std::end(mInFIFO), 0.0f); + std::fill(std::begin(mOutFIFO), std::end(mOutFIFO), complex_d{}); + std::fill(std::begin(mOutputAccum), std::end(mOutputAccum), complex_d{}); + std::fill(std::begin(mAnalytic), std::end(mAnalytic), complex_d{}); + + for(auto &gain : mGains) + { + std::fill(std::begin(gain.Current), std::end(gain.Current), 0.0f); + std::fill(std::begin(gain.Target), std::end(gain.Target), 0.0f); + } + + return AL_TRUE; +} + +void FshifterState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *device{context->mDevice.get()}; + + ALfloat step{props->Fshifter.Frequency / static_cast(device->Frequency)}; + mPhaseStep[0] = mPhaseStep[1] = fastf2i(minf(step, 0.5f) * FRACTIONONE); + + switch(props->Fshifter.LeftDirection) + { + case AL_FREQUENCY_SHIFTER_DIRECTION_DOWN: + mSign[0] = -1.0; + break; + + case AL_FREQUENCY_SHIFTER_DIRECTION_UP: + mSign[0] = 1.0; + break; + + case AL_FREQUENCY_SHIFTER_DIRECTION_OFF: + mPhase[0] = 0; + mPhaseStep[0] = 0; + break; + } + + switch (props->Fshifter.RightDirection) + { + case AL_FREQUENCY_SHIFTER_DIRECTION_DOWN: + mSign[1] = -1.0; + break; + + case AL_FREQUENCY_SHIFTER_DIRECTION_UP: + mSign[1] = 1.0; + break; + + case AL_FREQUENCY_SHIFTER_DIRECTION_OFF: + mPhase[1] = 0; + mPhaseStep[1] = 0; + break; + } + + ALfloat coeffs[2][MAX_AMBI_CHANNELS]; + CalcDirectionCoeffs({-1.0f, 0.0f, -1.0f}, 0.0f, coeffs[0]); + CalcDirectionCoeffs({ 1.0f, 0.0f, -1.0f}, 0.0f, coeffs[1]); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs[0], slot->Params.Gain, mGains[0].Target); + ComputePanGains(target.Main, coeffs[1], slot->Params.Gain, mGains[1].Target); +} + +void FshifterState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + static constexpr complex_d complex_zero{0.0, 0.0}; + ALfloat *RESTRICT BufferOut = mBufferOut; + size_t j, k; + + for(size_t base{0u};base < samplesToDo;) + { + const size_t todo{minz(HIL_SIZE-mCount, samplesToDo-base)}; + + ASSUME(todo > 0); + + /* Fill FIFO buffer with samples data */ + k = mCount; + for(j = 0;j < todo;j++,k++) + { + mInFIFO[k] = samplesIn[0][base+j]; + mOutdata[base+j] = mOutFIFO[k-FIFO_LATENCY]; + } + mCount += todo; + base += todo; + + /* Check whether FIFO buffer is filled */ + if(mCount < HIL_SIZE) continue; + mCount = FIFO_LATENCY; + + /* Real signal windowing and store in Analytic buffer */ + for(k = 0;k < HIL_SIZE;k++) + { + mAnalytic[k].real(mInFIFO[k] * HannWindow[k]); + mAnalytic[k].imag(0.0); + } + + /* Processing signal by Discrete Hilbert Transform (analytical signal). */ + complex_hilbert(mAnalytic); + + /* Windowing and add to output accumulator */ + for(k = 0;k < HIL_SIZE;k++) + mOutputAccum[k] += 2.0/OVERSAMP*HannWindow[k]*mAnalytic[k]; + + /* Shift accumulator, input & output FIFO */ + for(k = 0;k < HIL_STEP;k++) mOutFIFO[k] = mOutputAccum[k]; + for(j = 0;k < HIL_SIZE;k++,j++) mOutputAccum[j] = mOutputAccum[k]; + for(;j < HIL_SIZE;j++) mOutputAccum[j] = complex_zero; + for(k = 0;k < FIFO_LATENCY;k++) + mInFIFO[k] = mInFIFO[k+HIL_STEP]; + } + + /* Process frequency shifter using the analytic signal obtained. */ + for(ALsizei c{0};c < 2;++c) + { + for(k = 0;k < samplesToDo;++k) + { + double phase = mPhase[c] * ((1.0 / FRACTIONONE) * al::MathDefs::Tau()); + BufferOut[k] = static_cast(mOutdata[k].real()*std::cos(phase) + + mOutdata[k].imag()*std::sin(phase)*mSign[c]); + + mPhase[c] += mPhaseStep[c]; + mPhase[c] &= FRACTIONMASK; + } + + /* Now, mix the processed sound data to the output. */ + MixSamples({BufferOut, samplesToDo}, samplesOut, mGains[c].Current, mGains[c].Target, + maxz(samplesToDo, 512), 0); + } +} + + +void Fshifter_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_FREQUENCY_SHIFTER_FREQUENCY: + if(!(val >= AL_FREQUENCY_SHIFTER_MIN_FREQUENCY && val <= AL_FREQUENCY_SHIFTER_MAX_FREQUENCY)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter frequency out of range"); + props->Fshifter.Frequency = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x", + param); + } +} +void Fshifter_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Fshifter_setParamf(props, context, param, vals[0]); } + +void Fshifter_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION: + if(!(val >= AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION && val <= AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter left direction out of range"); + props->Fshifter.LeftDirection = val; + break; + + case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION: + if(!(val >= AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION && val <= AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter right direction out of range"); + props->Fshifter.RightDirection = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid frequency shifter integer property 0x%04x", + param); + } +} +void Fshifter_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ Fshifter_setParami(props, context, param, vals[0]); } + +void Fshifter_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION: + *val = props->Fshifter.LeftDirection; + break; + case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION: + *val = props->Fshifter.RightDirection; + break; + default: + context->setError(AL_INVALID_ENUM, "Invalid frequency shifter integer property 0x%04x", + param); + } +} +void Fshifter_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ Fshifter_getParami(props, context, param, vals); } + +void Fshifter_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_FREQUENCY_SHIFTER_FREQUENCY: + *val = props->Fshifter.Frequency; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x", + param); + } +} +void Fshifter_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Fshifter_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Fshifter); + + +struct FshifterStateFactory final : public EffectStateFactory { + EffectState *create() override { return new FshifterState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Fshifter_vtable; } +}; + +EffectProps FshifterStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Fshifter.Frequency = AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY; + props.Fshifter.LeftDirection = AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION; + props.Fshifter.RightDirection = AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION; + return props; +} + +} // namespace + +EffectStateFactory *FshifterStateFactory_getFactory() +{ + static FshifterStateFactory FshifterFactory{}; + return &FshifterFactory; +} diff --git a/alc/effects/modulator.cpp b/alc/effects/modulator.cpp new file mode 100644 index 0000000..00afa05 --- /dev/null +++ b/alc/effects/modulator.cpp @@ -0,0 +1,269 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2009 by Chris Robinson. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" +#include "filters/biquad.h" +#include "vecmat.h" + + +namespace { + +#define MAX_UPDATE_SAMPLES 128 + +#define WAVEFORM_FRACBITS 24 +#define WAVEFORM_FRACONE (1<::Tau() / WAVEFORM_FRACONE}; + return std::sin(static_cast(index) * scale); +} + +inline float Saw(ALuint index) +{ return static_cast(index)*(2.0f/WAVEFORM_FRACONE) - 1.0f; } + +inline float Square(ALuint index) +{ return static_cast(static_cast((index>>(WAVEFORM_FRACBITS-2))&2) - 1); } + +inline float One(ALuint) { return 1.0f; } + +template +void Modulate(float *RESTRICT dst, ALuint index, const ALuint step, size_t todo) +{ + for(size_t i{0u};i < todo;i++) + { + index += step; + index &= WAVEFORM_FRACMASK; + dst[i] = func(index); + } +} + + +struct ModulatorState final : public EffectState { + void (*mGetSamples)(float*RESTRICT, ALuint, const ALuint, size_t){}; + + ALuint mIndex{0}; + ALuint mStep{1}; + + struct { + BiquadFilter Filter; + + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]{}; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]{}; + } mChans[MAX_AMBI_CHANNELS]; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(ModulatorState) +}; + +ALboolean ModulatorState::deviceUpdate(const ALCdevice*) +{ + for(auto &e : mChans) + { + e.Filter.clear(); + std::fill(std::begin(e.CurrentGains), std::end(e.CurrentGains), 0.0f); + } + return AL_TRUE; +} + +void ModulatorState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *device{context->mDevice.get()}; + + const float step{props->Modulator.Frequency / static_cast(device->Frequency)}; + mStep = fastf2u(clampf(step*WAVEFORM_FRACONE, 0.0f, ALfloat{WAVEFORM_FRACONE-1})); + + if(mStep == 0) + mGetSamples = Modulate; + else if(props->Modulator.Waveform == AL_RING_MODULATOR_SINUSOID) + mGetSamples = Modulate; + else if(props->Modulator.Waveform == AL_RING_MODULATOR_SAWTOOTH) + mGetSamples = Modulate; + else /*if(props->Modulator.Waveform == AL_RING_MODULATOR_SQUARE)*/ + mGetSamples = Modulate; + + float f0norm{props->Modulator.HighPassCutoff / static_cast(device->Frequency)}; + f0norm = clampf(f0norm, 1.0f/512.0f, 0.49f); + /* Bandwidth value is constant in octaves. */ + mChans[0].Filter.setParamsFromBandwidth(BiquadType::HighPass, f0norm, 1.0f, 0.75f); + for(size_t i{1u};i < slot->Wet.Buffer.size();++i) + mChans[i].Filter.copyParamsFrom(mChans[0].Filter); + + mOutTarget = target.Main->Buffer; + for(size_t i{0u};i < slot->Wet.Buffer.size();++i) + { + auto coeffs = GetAmbiIdentityRow(i); + ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); + } +} + +void ModulatorState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + for(size_t base{0u};base < samplesToDo;) + { + alignas(16) ALfloat modsamples[MAX_UPDATE_SAMPLES]; + size_t td{minz(MAX_UPDATE_SAMPLES, samplesToDo-base)}; + + mGetSamples(modsamples, mIndex, mStep, td); + mIndex += static_cast(mStep * td); + mIndex &= WAVEFORM_FRACMASK; + + auto chandata = std::addressof(mChans[0]); + for(const auto &input : samplesIn) + { + alignas(16) ALfloat temps[MAX_UPDATE_SAMPLES]; + + chandata->Filter.process({&input[base], td}, temps); + for(size_t i{0u};i < td;i++) + temps[i] *= modsamples[i]; + + MixSamples({temps, td}, samplesOut, chandata->CurrentGains, chandata->TargetGains, + samplesToDo-base, base); + ++chandata; + } + + base += td; + } +} + + +void Modulator_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_RING_MODULATOR_FREQUENCY: + if(!(val >= AL_RING_MODULATOR_MIN_FREQUENCY && val <= AL_RING_MODULATOR_MAX_FREQUENCY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Modulator frequency out of range"); + props->Modulator.Frequency = val; + break; + + case AL_RING_MODULATOR_HIGHPASS_CUTOFF: + if(!(val >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF && val <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Modulator high-pass cutoff out of range"); + props->Modulator.HighPassCutoff = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param); + } +} +void Modulator_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Modulator_setParamf(props, context, param, vals[0]); } +void Modulator_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_RING_MODULATOR_FREQUENCY: + case AL_RING_MODULATOR_HIGHPASS_CUTOFF: + Modulator_setParamf(props, context, param, static_cast(val)); + break; + + case AL_RING_MODULATOR_WAVEFORM: + if(!(val >= AL_RING_MODULATOR_MIN_WAVEFORM && val <= AL_RING_MODULATOR_MAX_WAVEFORM)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid modulator waveform"); + props->Modulator.Waveform = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid modulator integer property 0x%04x", param); + } +} +void Modulator_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ Modulator_setParami(props, context, param, vals[0]); } + +void Modulator_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_RING_MODULATOR_FREQUENCY: + *val = static_cast(props->Modulator.Frequency); + break; + case AL_RING_MODULATOR_HIGHPASS_CUTOFF: + *val = static_cast(props->Modulator.HighPassCutoff); + break; + case AL_RING_MODULATOR_WAVEFORM: + *val = props->Modulator.Waveform; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid modulator integer property 0x%04x", param); + } +} +void Modulator_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ Modulator_getParami(props, context, param, vals); } +void Modulator_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_RING_MODULATOR_FREQUENCY: + *val = props->Modulator.Frequency; + break; + case AL_RING_MODULATOR_HIGHPASS_CUTOFF: + *val = props->Modulator.HighPassCutoff; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param); + } +} +void Modulator_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Modulator_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Modulator); + + +struct ModulatorStateFactory final : public EffectStateFactory { + EffectState *create() override { return new ModulatorState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Modulator_vtable; } +}; + +EffectProps ModulatorStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY; + props.Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF; + props.Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM; + return props; +} + +} // namespace + +EffectStateFactory *ModulatorStateFactory_getFactory() +{ + static ModulatorStateFactory ModulatorFactory{}; + return &ModulatorFactory; +} diff --git a/alc/effects/null.cpp b/alc/effects/null.cpp new file mode 100644 index 0000000..e049729 --- /dev/null +++ b/alc/effects/null.cpp @@ -0,0 +1,165 @@ + +#include "config.h" + +#include "AL/al.h" +#include "AL/alc.h" + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "almalloc.h" +#include "alspan.h" +#include "effects/base.h" + + +namespace { + +struct NullState final : public EffectState { + NullState(); + ~NullState() override; + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(NullState) +}; + +/* This constructs the effect state. It's called when the object is first + * created. + */ +NullState::NullState() = default; + +/* This destructs the effect state. It's called only when the effect instance + * is no longer used. + */ +NullState::~NullState() = default; + +/* This updates the device-dependant effect state. This is called on state + * initialization and any time the device parameters (e.g. playback frequency, + * format) have been changed. Will always be followed by a call to the update + * method, if successful. + */ +ALboolean NullState::deviceUpdate(const ALCdevice* /*device*/) +{ + return AL_TRUE; +} + +/* This updates the effect state with new properties. This is called any time + * the effect is (re)loaded into a slot. + */ +void NullState::update(const ALCcontext* /*context*/, const ALeffectslot* /*slot*/, + const EffectProps* /*props*/, const EffectTarget /*target*/) +{ +} + +/* This processes the effect state, for the given number of samples from the + * input to the output buffer. The result should be added to the output buffer, + * not replace it. + */ +void NullState::process(const size_t/*samplesToDo*/, + const al::span /*samplesIn*/, + const al::span /*samplesOut*/) +{ +} + + +void NullEffect_setParami(EffectProps* /*props*/, ALCcontext *context, ALenum param, ALint /*val*/) +{ + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x", param); + } +} +void NullEffect_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ + switch(param) + { + default: + NullEffect_setParami(props, context, param, vals[0]); + } +} +void NullEffect_setParamf(EffectProps* /*props*/, ALCcontext *context, ALenum param, ALfloat /*val*/) +{ + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid null effect float property 0x%04x", param); + } +} +void NullEffect_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ + switch(param) + { + default: + NullEffect_setParamf(props, context, param, vals[0]); + } +} + +void NullEffect_getParami(const EffectProps* /*props*/, ALCcontext *context, ALenum param, ALint* /*val*/) +{ + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x", param); + } +} +void NullEffect_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ + switch(param) + { + default: + NullEffect_getParami(props, context, param, vals); + } +} +void NullEffect_getParamf(const EffectProps* /*props*/, ALCcontext *context, ALenum param, ALfloat* /*val*/) +{ + switch(param) + { + default: + context->setError(AL_INVALID_ENUM, "Invalid null effect float property 0x%04x", param); + } +} +void NullEffect_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ + switch(param) + { + default: + NullEffect_getParamf(props, context, param, vals); + } +} + +DEFINE_ALEFFECT_VTABLE(NullEffect); + + +struct NullStateFactory final : public EffectStateFactory { + EffectState *create() override; + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override; +}; + +/* Creates EffectState objects of the appropriate type. */ +EffectState *NullStateFactory::create() +{ return new NullState{}; } + +/* Returns an ALeffectProps initialized with this effect type's default + * property values. + */ +EffectProps NullStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + return props; +} + +/* Returns a pointer to this effect type's global set/get vtable. */ +const EffectVtable *NullStateFactory::getEffectVtable() const noexcept +{ return &NullEffect_vtable; } + +} // namespace + +EffectStateFactory *NullStateFactory_getFactory() +{ + static NullStateFactory NullFactory{}; + return &NullFactory; +} diff --git a/alc/effects/pshifter.cpp b/alc/effects/pshifter.cpp new file mode 100644 index 0000000..d7ba072 --- /dev/null +++ b/alc/effects/pshifter.cpp @@ -0,0 +1,373 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by Raul Herraiz. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#ifdef HAVE_SSE_INTRINSICS +#include +#endif + +#include +#include +#include +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcomplex.h" +#include "alcontext.h" +#include "alnumeric.h" +#include "alu.h" + + +namespace { + +using complex_d = std::complex; + +#define STFT_SIZE 1024 +#define STFT_HALF_SIZE (STFT_SIZE>>1) +#define OVERSAMP (1<<2) + +#define STFT_STEP (STFT_SIZE / OVERSAMP) +#define FIFO_LATENCY (STFT_STEP * (OVERSAMP-1)) + +/* Define a Hann window, used to filter the STFT input and output. */ +/* Making this constexpr seems to require C++14. */ +std::array InitHannWindow() +{ + std::array ret; + /* Create lookup table of the Hann window for the desired size, i.e. HIL_SIZE */ + for(size_t i{0};i < STFT_SIZE>>1;i++) + { + constexpr double scale{al::MathDefs::Pi() / double{STFT_SIZE-1}}; + const double val{std::sin(static_cast(i) * scale)}; + ret[i] = ret[STFT_SIZE-1-i] = val * val; + } + return ret; +} +alignas(16) const std::array HannWindow = InitHannWindow(); + + +struct ALphasor { + ALdouble Amplitude; + ALdouble Phase; +}; + +struct ALfrequencyDomain { + ALdouble Amplitude; + ALdouble Frequency; +}; + + +/* Converts complex to ALphasor */ +inline ALphasor rect2polar(const complex_d &number) +{ + ALphasor polar; + polar.Amplitude = std::abs(number); + polar.Phase = std::arg(number); + return polar; +} + +/* Converts ALphasor to complex */ +inline complex_d polar2rect(const ALphasor &number) +{ return std::polar(number.Amplitude, number.Phase); } + + +struct PshifterState final : public EffectState { + /* Effect parameters */ + size_t mCount; + ALuint mPitchShiftI; + ALfloat mPitchShift; + ALfloat mFreqPerBin; + + /* Effects buffers */ + ALfloat mInFIFO[STFT_SIZE]; + ALfloat mOutFIFO[STFT_STEP]; + ALdouble mLastPhase[STFT_HALF_SIZE+1]; + ALdouble mSumPhase[STFT_HALF_SIZE+1]; + ALdouble mOutputAccum[STFT_SIZE]; + + complex_d mFFTbuffer[STFT_SIZE]; + + ALfrequencyDomain mAnalysis_buffer[STFT_HALF_SIZE+1]; + ALfrequencyDomain mSyntesis_buffer[STFT_HALF_SIZE+1]; + + alignas(16) ALfloat mBufferOut[BUFFERSIZE]; + + /* Effect gains for each output channel */ + ALfloat mCurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat mTargetGains[MAX_OUTPUT_CHANNELS]; + + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(PshifterState) +}; + +ALboolean PshifterState::deviceUpdate(const ALCdevice *device) +{ + /* (Re-)initializing parameters and clear the buffers. */ + mCount = FIFO_LATENCY; + mPitchShiftI = FRACTIONONE; + mPitchShift = 1.0f; + mFreqPerBin = static_cast(device->Frequency) / float{STFT_SIZE}; + + std::fill(std::begin(mInFIFO), std::end(mInFIFO), 0.0f); + std::fill(std::begin(mOutFIFO), std::end(mOutFIFO), 0.0f); + std::fill(std::begin(mLastPhase), std::end(mLastPhase), 0.0); + std::fill(std::begin(mSumPhase), std::end(mSumPhase), 0.0); + std::fill(std::begin(mOutputAccum), std::end(mOutputAccum), 0.0); + std::fill(std::begin(mFFTbuffer), std::end(mFFTbuffer), complex_d{}); + std::fill(std::begin(mAnalysis_buffer), std::end(mAnalysis_buffer), ALfrequencyDomain{}); + std::fill(std::begin(mSyntesis_buffer), std::end(mSyntesis_buffer), ALfrequencyDomain{}); + + std::fill(std::begin(mCurrentGains), std::end(mCurrentGains), 0.0f); + std::fill(std::begin(mTargetGains), std::end(mTargetGains), 0.0f); + + return AL_TRUE; +} + +void PshifterState::update(const ALCcontext*, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const float pitch{std::pow(2.0f, + static_cast(props->Pshifter.CoarseTune*100 + props->Pshifter.FineTune) / 1200.0f + )}; + mPitchShiftI = fastf2u(pitch*FRACTIONONE); + mPitchShift = static_cast(mPitchShiftI) * (1.0f/FRACTIONONE); + + ALfloat coeffs[MAX_AMBI_CHANNELS]; + CalcDirectionCoeffs({0.0f, 0.0f, -1.0f}, 0.0f, coeffs); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs, slot->Params.Gain, mTargetGains); +} + +void PshifterState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + /* Pitch shifter engine based on the work of Stephan Bernsee. + * http://blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/ + */ + + static constexpr ALdouble expected{al::MathDefs::Tau() / OVERSAMP}; + const ALdouble freq_per_bin{mFreqPerBin}; + ALfloat *RESTRICT bufferOut{mBufferOut}; + size_t count{mCount}; + + for(size_t i{0u};i < samplesToDo;) + { + do { + /* Fill FIFO buffer with samples data */ + mInFIFO[count] = samplesIn[0][i]; + bufferOut[i] = mOutFIFO[count - FIFO_LATENCY]; + + count++; + } while(++i < samplesToDo && count < STFT_SIZE); + + /* Check whether FIFO buffer is filled */ + if(count < STFT_SIZE) break; + count = FIFO_LATENCY; + + /* Real signal windowing and store in FFTbuffer */ + for(ALuint k{0u};k < STFT_SIZE;k++) + { + mFFTbuffer[k].real(mInFIFO[k] * HannWindow[k]); + mFFTbuffer[k].imag(0.0); + } + + /* ANALYSIS */ + /* Apply FFT to FFTbuffer data */ + complex_fft(mFFTbuffer, -1.0); + + /* Analyze the obtained data. Since the real FFT is symmetric, only + * STFT_HALF_SIZE+1 samples are needed. + */ + for(ALuint k{0u};k < STFT_HALF_SIZE+1;k++) + { + /* Compute amplitude and phase */ + ALphasor component{rect2polar(mFFTbuffer[k])}; + + /* Compute phase difference and subtract expected phase difference */ + double tmp{(component.Phase - mLastPhase[k]) - k*expected}; + + /* Map delta phase into +/- Pi interval */ + int qpd{double2int(tmp / al::MathDefs::Pi())}; + tmp -= al::MathDefs::Pi() * (qpd + (qpd%2)); + + /* Get deviation from bin frequency from the +/- Pi interval */ + tmp /= expected; + + /* Compute the k-th partials' true frequency, twice the amplitude + * for maintain the gain (because half of bins are used) and store + * amplitude and true frequency in analysis buffer. + */ + mAnalysis_buffer[k].Amplitude = 2.0 * component.Amplitude; + mAnalysis_buffer[k].Frequency = (k + tmp) * freq_per_bin; + + /* Store actual phase[k] for the calculations in the next frame*/ + mLastPhase[k] = component.Phase; + } + + /* PROCESSING */ + /* pitch shifting */ + for(ALuint k{0u};k < STFT_HALF_SIZE+1;k++) + { + mSyntesis_buffer[k].Amplitude = 0.0; + mSyntesis_buffer[k].Frequency = 0.0; + } + + for(size_t k{0u};k < STFT_HALF_SIZE+1;k++) + { + size_t j{(k*mPitchShiftI) >> FRACTIONBITS}; + if(j >= STFT_HALF_SIZE+1) break; + + mSyntesis_buffer[j].Amplitude += mAnalysis_buffer[k].Amplitude; + mSyntesis_buffer[j].Frequency = mAnalysis_buffer[k].Frequency * mPitchShift; + } + + /* SYNTHESIS */ + /* Synthesis the processing data */ + for(ALuint k{0u};k < STFT_HALF_SIZE+1;k++) + { + ALphasor component; + ALdouble tmp; + + /* Compute bin deviation from scaled freq */ + tmp = mSyntesis_buffer[k].Frequency/freq_per_bin - k; + + /* Calculate actual delta phase and accumulate it to get bin phase */ + mSumPhase[k] += (k + tmp) * expected; + + component.Amplitude = mSyntesis_buffer[k].Amplitude; + component.Phase = mSumPhase[k]; + + /* Compute phasor component to cartesian complex number and storage it into FFTbuffer*/ + mFFTbuffer[k] = polar2rect(component); + } + /* zero negative frequencies for recontruct a real signal */ + for(ALuint k{STFT_HALF_SIZE+1};k < STFT_SIZE;k++) + mFFTbuffer[k] = complex_d{}; + + /* Apply iFFT to buffer data */ + complex_fft(mFFTbuffer, 1.0); + + /* Windowing and add to output */ + for(ALuint k{0u};k < STFT_SIZE;k++) + mOutputAccum[k] += HannWindow[k] * mFFTbuffer[k].real() / + (0.5 * STFT_HALF_SIZE * OVERSAMP); + + /* Shift accumulator, input & output FIFO */ + size_t j, k; + for(k = 0;k < STFT_STEP;k++) mOutFIFO[k] = static_cast(mOutputAccum[k]); + for(j = 0;k < STFT_SIZE;k++,j++) mOutputAccum[j] = mOutputAccum[k]; + for(;j < STFT_SIZE;j++) mOutputAccum[j] = 0.0; + for(k = 0;k < FIFO_LATENCY;k++) + mInFIFO[k] = mInFIFO[k+STFT_STEP]; + } + mCount = count; + + /* Now, mix the processed sound data to the output. */ + MixSamples({bufferOut, samplesToDo}, samplesOut, mCurrentGains, mTargetGains, + maxz(samplesToDo, 512), 0); +} + + +void Pshifter_setParamf(EffectProps*, ALCcontext *context, ALenum param, ALfloat) +{ context->setError(AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param); } +void Pshifter_setParamfv(EffectProps*, ALCcontext *context, ALenum param, const ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid pitch shifter float-vector property 0x%04x", param); } + +void Pshifter_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_PITCH_SHIFTER_COARSE_TUNE: + if(!(val >= AL_PITCH_SHIFTER_MIN_COARSE_TUNE && val <= AL_PITCH_SHIFTER_MAX_COARSE_TUNE)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Pitch shifter coarse tune out of range"); + props->Pshifter.CoarseTune = val; + break; + + case AL_PITCH_SHIFTER_FINE_TUNE: + if(!(val >= AL_PITCH_SHIFTER_MIN_FINE_TUNE && val <= AL_PITCH_SHIFTER_MAX_FINE_TUNE)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Pitch shifter fine tune out of range"); + props->Pshifter.FineTune = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid pitch shifter integer property 0x%04x", + param); + } +} +void Pshifter_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ Pshifter_setParami(props, context, param, vals[0]); } + +void Pshifter_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_PITCH_SHIFTER_COARSE_TUNE: + *val = props->Pshifter.CoarseTune; + break; + case AL_PITCH_SHIFTER_FINE_TUNE: + *val = props->Pshifter.FineTune; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid pitch shifter integer property 0x%04x", + param); + } +} +void Pshifter_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ Pshifter_getParami(props, context, param, vals); } + +void Pshifter_getParamf(const EffectProps*, ALCcontext *context, ALenum param, ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param); } +void Pshifter_getParamfv(const EffectProps*, ALCcontext *context, ALenum param, ALfloat*) +{ context->setError(AL_INVALID_ENUM, "Invalid pitch shifter float vector-property 0x%04x", param); } + +DEFINE_ALEFFECT_VTABLE(Pshifter); + + +struct PshifterStateFactory final : public EffectStateFactory { + EffectState *create() override; + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Pshifter_vtable; } +}; + +EffectState *PshifterStateFactory::create() +{ return new PshifterState{}; } + +EffectProps PshifterStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Pshifter.CoarseTune = AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE; + props.Pshifter.FineTune = AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE; + return props; +} + +} // namespace + +EffectStateFactory *PshifterStateFactory_getFactory() +{ + static PshifterStateFactory PshifterFactory{}; + return &PshifterFactory; +} diff --git a/alc/effects/reverb.cpp b/alc/effects/reverb.cpp new file mode 100644 index 0000000..727c835 --- /dev/null +++ b/alc/effects/reverb.cpp @@ -0,0 +1,2081 @@ +/** + * Ambisonic reverb engine for the OpenAL cross platform audio library + * Copyright (C) 2008-2017 by Chris Robinson and Christopher Fitzgerald. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include "al/auxeffectslot.h" +#include "al/listener.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" +#include "bformatdec.h" +#include "filters/biquad.h" +#include "vector.h" +#include "vecmat.h" + +/* This is a user config option for modifying the overall output of the reverb + * effect. + */ +ALfloat ReverbBoost = 1.0f; + +namespace { + +using namespace std::placeholders; + +/* Max samples per process iteration. Used to limit the size needed for + * temporary buffers. Must be a multiple of 4 for SIMD alignment. + */ +constexpr size_t MAX_UPDATE_SAMPLES{256}; + +/* The number of spatialized lines or channels to process. Four channels allows + * for a 3D A-Format response. NOTE: This can't be changed without taking care + * of the conversion matrices, and a few places where the length arrays are + * assumed to have 4 elements. + */ +constexpr size_t NUM_LINES{4u}; + + +/* The B-Format to A-Format conversion matrix. The arrangement of rows is + * deliberately chosen to align the resulting lines to their spatial opposites + * (0:above front left <-> 3:above back right, 1:below front right <-> 2:below + * back left). It's not quite opposite, since the A-Format results in a + * tetrahedron, but it's close enough. Should the model be extended to 8-lines + * in the future, true opposites can be used. + */ +alignas(16) constexpr ALfloat B2A[NUM_LINES][MAX_AMBI_CHANNELS]{ + { 0.288675134595f, 0.288675134595f, 0.288675134595f, 0.288675134595f }, + { 0.288675134595f, -0.288675134595f, -0.288675134595f, 0.288675134595f }, + { 0.288675134595f, 0.288675134595f, -0.288675134595f, -0.288675134595f }, + { 0.288675134595f, -0.288675134595f, 0.288675134595f, -0.288675134595f } +}; + +/* Converts A-Format to B-Format. */ +alignas(16) constexpr ALfloat A2B[NUM_LINES][NUM_LINES]{ + { 0.866025403785f, 0.866025403785f, 0.866025403785f, 0.866025403785f }, + { 0.866025403785f, -0.866025403785f, 0.866025403785f, -0.866025403785f }, + { 0.866025403785f, -0.866025403785f, -0.866025403785f, 0.866025403785f }, + { 0.866025403785f, 0.866025403785f, -0.866025403785f, -0.866025403785f } +}; + + +/* The all-pass and delay lines have a variable length dependent on the + * effect's density parameter, which helps alter the perceived environment + * size. The size-to-density conversion is a cubed scale: + * + * density = min(1.0, pow(size, 3.0) / DENSITY_SCALE); + * + * The line lengths scale linearly with room size, so the inverse density + * conversion is needed, taking the cube root of the re-scaled density to + * calculate the line length multiplier: + * + * length_mult = max(5.0, cbrt(density*DENSITY_SCALE)); + * + * The density scale below will result in a max line multiplier of 50, for an + * effective size range of 5m to 50m. + */ +constexpr ALfloat DENSITY_SCALE{125000.0f}; + +/* All delay line lengths are specified in seconds. + * + * To approximate early reflections, we break them up into primary (those + * arriving from the same direction as the source) and secondary (those + * arriving from the opposite direction). + * + * The early taps decorrelate the 4-channel signal to approximate an average + * room response for the primary reflections after the initial early delay. + * + * Given an average room dimension (d_a) and the speed of sound (c) we can + * calculate the average reflection delay (r_a) regardless of listener and + * source positions as: + * + * r_a = d_a / c + * c = 343.3 + * + * This can extended to finding the average difference (r_d) between the + * maximum (r_1) and minimum (r_0) reflection delays: + * + * r_0 = 2 / 3 r_a + * = r_a - r_d / 2 + * = r_d + * r_1 = 4 / 3 r_a + * = r_a + r_d / 2 + * = 2 r_d + * r_d = 2 / 3 r_a + * = r_1 - r_0 + * + * As can be determined by integrating the 1D model with a source (s) and + * listener (l) positioned across the dimension of length (d_a): + * + * r_d = int_(l=0)^d_a (int_(s=0)^d_a |2 d_a - 2 (l + s)| ds) dl / c + * + * The initial taps (T_(i=0)^N) are then specified by taking a power series + * that ranges between r_0 and half of r_1 less r_0: + * + * R_i = 2^(i / (2 N - 1)) r_d + * = r_0 + (2^(i / (2 N - 1)) - 1) r_d + * = r_0 + T_i + * T_i = R_i - r_0 + * = (2^(i / (2 N - 1)) - 1) r_d + * + * Assuming an average of 1m, we get the following taps: + */ +constexpr std::array EARLY_TAP_LENGTHS{{ + 0.0000000e+0f, 2.0213520e-4f, 4.2531060e-4f, 6.7171600e-4f +}}; + +/* The early all-pass filter lengths are based on the early tap lengths: + * + * A_i = R_i / a + * + * Where a is the approximate maximum all-pass cycle limit (20). + */ +constexpr std::array EARLY_ALLPASS_LENGTHS{{ + 9.7096800e-5f, 1.0720356e-4f, 1.1836234e-4f, 1.3068260e-4f +}}; + +/* The early delay lines are used to transform the primary reflections into + * the secondary reflections. The A-format is arranged in such a way that + * the channels/lines are spatially opposite: + * + * C_i is opposite C_(N-i-1) + * + * The delays of the two opposing reflections (R_i and O_i) from a source + * anywhere along a particular dimension always sum to twice its full delay: + * + * 2 r_a = R_i + O_i + * + * With that in mind we can determine the delay between the two reflections + * and thus specify our early line lengths (L_(i=0)^N) using: + * + * O_i = 2 r_a - R_(N-i-1) + * L_i = O_i - R_(N-i-1) + * = 2 (r_a - R_(N-i-1)) + * = 2 (r_a - T_(N-i-1) - r_0) + * = 2 r_a (1 - (2 / 3) 2^((N - i - 1) / (2 N - 1))) + * + * Using an average dimension of 1m, we get: + */ +constexpr std::array EARLY_LINE_LENGTHS{{ + 5.9850400e-4f, 1.0913150e-3f, 1.5376658e-3f, 1.9419362e-3f +}}; + +/* The late all-pass filter lengths are based on the late line lengths: + * + * A_i = (5 / 3) L_i / r_1 + */ +constexpr std::array LATE_ALLPASS_LENGTHS{{ + 1.6182800e-4f, 2.0389060e-4f, 2.8159360e-4f, 3.2365600e-4f +}}; + +/* The late lines are used to approximate the decaying cycle of recursive + * late reflections. + * + * Splitting the lines in half, we start with the shortest reflection paths + * (L_(i=0)^(N/2)): + * + * L_i = 2^(i / (N - 1)) r_d + * + * Then for the opposite (longest) reflection paths (L_(i=N/2)^N): + * + * L_i = 2 r_a - L_(i-N/2) + * = 2 r_a - 2^((i - N / 2) / (N - 1)) r_d + * + * For our 1m average room, we get: + */ +constexpr std::array LATE_LINE_LENGTHS{{ + 1.9419362e-3f, 2.4466860e-3f, 3.3791220e-3f, 3.8838720e-3f +}}; + + +using ReverbUpdateLine = std::array; + +struct DelayLineI { + /* The delay lines use interleaved samples, with the lengths being powers + * of 2 to allow the use of bit-masking instead of a modulus for wrapping. + */ + size_t Mask{0u}; + union { + uintptr_t LineOffset{0u}; + std::array *Line; + }; + + /* Given the allocated sample buffer, this function updates each delay line + * offset. + */ + void realizeLineOffset(std::array *sampleBuffer) noexcept + { Line = sampleBuffer + LineOffset; } + + /* Calculate the length of a delay line and store its mask and offset. */ + ALuint calcLineLength(const ALfloat length, const uintptr_t offset, const ALfloat frequency, + const ALuint extra) + { + /* All line lengths are powers of 2, calculated from their lengths in + * seconds, rounded up. + */ + ALuint samples{float2uint(std::ceil(length*frequency))}; + samples = NextPowerOf2(samples + extra); + + /* All lines share a single sample buffer. */ + Mask = samples - 1; + LineOffset = offset; + + /* Return the sample count for accumulation. */ + return samples; + } + + void write(size_t offset, const size_t c, const ALfloat *RESTRICT in, const size_t count) const noexcept + { + ASSUME(count > 0); + for(size_t i{0u};i < count;) + { + offset &= Mask; + size_t td{minz(Mask+1 - offset, count - i)}; + do { + Line[offset++][c] = in[i++]; + } while(--td); + } + } +}; + +struct VecAllpass { + DelayLineI Delay; + ALfloat Coeff{0.0f}; + size_t Offset[NUM_LINES][2]{}; + + void processFaded(const al::span samples, size_t offset, + const ALfloat xCoeff, const ALfloat yCoeff, ALfloat fadeCount, const ALfloat fadeStep, + const size_t todo); + void processUnfaded(const al::span samples, size_t offset, + const ALfloat xCoeff, const ALfloat yCoeff, const size_t todo); +}; + +struct T60Filter { + /* Two filters are used to adjust the signal. One to control the low + * frequencies, and one to control the high frequencies. + */ + ALfloat MidGain[2]{0.0f, 0.0f}; + BiquadFilter HFFilter, LFFilter; + + void calcCoeffs(const ALfloat length, const ALfloat lfDecayTime, const ALfloat mfDecayTime, + const ALfloat hfDecayTime, const ALfloat lf0norm, const ALfloat hf0norm); + + /* Applies the two T60 damping filter sections. */ + void process(const al::span samples) + { + HFFilter.process(samples, samples.begin()); + LFFilter.process(samples, samples.begin()); + } +}; + +struct EarlyReflections { + /* A Gerzon vector all-pass filter is used to simulate initial diffusion. + * The spread from this filter also helps smooth out the reverb tail. + */ + VecAllpass VecAp; + + /* An echo line is used to complete the second half of the early + * reflections. + */ + DelayLineI Delay; + size_t Offset[NUM_LINES][2]{}; + ALfloat Coeff[NUM_LINES][2]{}; + + /* The gain for each output channel based on 3D panning. */ + ALfloat CurrentGain[NUM_LINES][MAX_OUTPUT_CHANNELS]{}; + ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS]{}; + + void updateLines(const ALfloat density, const ALfloat diffusion, const ALfloat decayTime, + const ALfloat frequency); +}; + +struct LateReverb { + /* A recursive delay line is used fill in the reverb tail. */ + DelayLineI Delay; + size_t Offset[NUM_LINES][2]{}; + + /* Attenuation to compensate for the modal density and decay rate of the + * late lines. + */ + ALfloat DensityGain[2]{0.0f, 0.0f}; + + /* T60 decay filters are used to simulate absorption. */ + T60Filter T60[NUM_LINES]; + + /* A Gerzon vector all-pass filter is used to simulate diffusion. */ + VecAllpass VecAp; + + /* The gain for each output channel based on 3D panning. */ + ALfloat CurrentGain[NUM_LINES][MAX_OUTPUT_CHANNELS]{}; + ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS]{}; + + void updateLines(const ALfloat density, const ALfloat diffusion, const ALfloat lfDecayTime, + const ALfloat mfDecayTime, const ALfloat hfDecayTime, const ALfloat lf0norm, + const ALfloat hf0norm, const ALfloat frequency); +}; + +struct ReverbState final : public EffectState { + /* All delay lines are allocated as a single buffer to reduce memory + * fragmentation and management code. + */ + al::vector,16> mSampleBuffer; + + struct { + /* Calculated parameters which indicate if cross-fading is needed after + * an update. + */ + ALfloat Density{AL_EAXREVERB_DEFAULT_DENSITY}; + ALfloat Diffusion{AL_EAXREVERB_DEFAULT_DIFFUSION}; + ALfloat DecayTime{AL_EAXREVERB_DEFAULT_DECAY_TIME}; + ALfloat HFDecayTime{AL_EAXREVERB_DEFAULT_DECAY_HFRATIO * AL_EAXREVERB_DEFAULT_DECAY_TIME}; + ALfloat LFDecayTime{AL_EAXREVERB_DEFAULT_DECAY_LFRATIO * AL_EAXREVERB_DEFAULT_DECAY_TIME}; + ALfloat HFReference{AL_EAXREVERB_DEFAULT_HFREFERENCE}; + ALfloat LFReference{AL_EAXREVERB_DEFAULT_LFREFERENCE}; + } mParams; + + /* Master effect filters */ + struct { + BiquadFilter Lp; + BiquadFilter Hp; + } mFilter[NUM_LINES]; + + /* Core delay line (early reflections and late reverb tap from this). */ + DelayLineI mDelay; + + /* Tap points for early reflection delay. */ + size_t mEarlyDelayTap[NUM_LINES][2]{}; + ALfloat mEarlyDelayCoeff[NUM_LINES][2]{}; + + /* Tap points for late reverb feed and delay. */ + size_t mLateFeedTap{}; + size_t mLateDelayTap[NUM_LINES][2]{}; + + /* Coefficients for the all-pass and line scattering matrices. */ + ALfloat mMixX{0.0f}; + ALfloat mMixY{0.0f}; + + EarlyReflections mEarly; + + LateReverb mLate; + + bool mDoFading{}; + + /* Maximum number of samples to process at once. */ + size_t mMaxUpdate[2]{MAX_UPDATE_SAMPLES, MAX_UPDATE_SAMPLES}; + + /* The current write offset for all delay lines. */ + size_t mOffset{}; + + /* Temporary storage used when processing. */ + union { + alignas(16) FloatBufferLine mTempLine{}; + alignas(16) std::array mTempSamples; + }; + alignas(16) std::array mEarlySamples{}; + alignas(16) std::array mLateSamples{}; + + using MixOutT = void (ReverbState::*)(const al::span samplesOut, + const size_t counter, const size_t offset, const size_t todo); + + MixOutT mMixOut{&ReverbState::MixOutPlain}; + std::array mOrderScales{}; + std::array,2> mAmbiSplitter; + + + void MixOutPlain(const al::span samplesOut, const size_t counter, + const size_t offset, const size_t todo) + { + ASSUME(todo > 0); + + /* Convert back to B-Format, and mix the results to output. */ + const al::span tmpspan{mTempLine.data(), todo}; + for(size_t c{0u};c < NUM_LINES;c++) + { + std::fill(tmpspan.begin(), tmpspan.end(), 0.0f); + MixRowSamples(tmpspan, {A2B[c], NUM_LINES}, mEarlySamples[0].data(), + mEarlySamples[0].size()); + MixSamples(tmpspan, samplesOut, mEarly.CurrentGain[c], mEarly.PanGain[c], counter, + offset); + } + for(size_t c{0u};c < NUM_LINES;c++) + { + std::fill(tmpspan.begin(), tmpspan.end(), 0.0f); + MixRowSamples(tmpspan, {A2B[c], NUM_LINES}, mLateSamples[0].data(), + mLateSamples[0].size()); + MixSamples(tmpspan, samplesOut, mLate.CurrentGain[c], mLate.PanGain[c], counter, + offset); + } + } + + void MixOutAmbiUp(const al::span samplesOut, const size_t counter, + const size_t offset, const size_t todo) + { + ASSUME(todo > 0); + + const al::span tmpspan{mTempLine.data(), todo}; + for(size_t c{0u};c < NUM_LINES;c++) + { + std::fill(tmpspan.begin(), tmpspan.end(), 0.0f); + MixRowSamples(tmpspan, {A2B[c], NUM_LINES}, mEarlySamples[0].data(), + mEarlySamples[0].size()); + + /* Apply scaling to the B-Format's HF response to "upsample" it to + * higher-order output. + */ + const ALfloat hfscale{(c==0) ? mOrderScales[0] : mOrderScales[1]}; + mAmbiSplitter[0][c].applyHfScale(tmpspan, hfscale); + + MixSamples(tmpspan, samplesOut, mEarly.CurrentGain[c], mEarly.PanGain[c], counter, + offset); + } + for(size_t c{0u};c < NUM_LINES;c++) + { + std::fill(tmpspan.begin(), tmpspan.end(), 0.0f); + MixRowSamples(tmpspan, {A2B[c], NUM_LINES}, mLateSamples[0].data(), + mLateSamples[0].size()); + + const ALfloat hfscale{(c==0) ? mOrderScales[0] : mOrderScales[1]}; + mAmbiSplitter[1][c].applyHfScale(tmpspan, hfscale); + + MixSamples(tmpspan, samplesOut, mLate.CurrentGain[c], mLate.PanGain[c], counter, + offset); + } + } + + bool allocLines(const ALfloat frequency); + + void updateDelayLine(const ALfloat earlyDelay, const ALfloat lateDelay, const ALfloat density, + const ALfloat decayTime, const ALfloat frequency); + void update3DPanning(const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, + const ALfloat earlyGain, const ALfloat lateGain, const EffectTarget &target); + + void earlyUnfaded(const size_t offset, const size_t todo); + void earlyFaded(const size_t offset, const size_t todo, const ALfloat fade, + const ALfloat fadeStep); + + void lateUnfaded(const size_t offset, const size_t todo); + void lateFaded(const size_t offset, const size_t todo, const ALfloat fade, + const ALfloat fadeStep); + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + DEF_NEWDEL(ReverbState) +}; + +/************************************** + * Device Update * + **************************************/ + +inline ALfloat CalcDelayLengthMult(ALfloat density) +{ return maxf(5.0f, std::cbrt(density*DENSITY_SCALE)); } + +/* Calculates the delay line metrics and allocates the shared sample buffer + * for all lines given the sample rate (frequency). If an allocation failure + * occurs, it returns AL_FALSE. + */ +bool ReverbState::allocLines(const ALfloat frequency) +{ + /* All delay line lengths are calculated to accomodate the full range of + * lengths given their respective paramters. + */ + size_t totalSamples{0u}; + + /* Multiplier for the maximum density value, i.e. density=1, which is + * actually the least density... + */ + ALfloat multiplier{CalcDelayLengthMult(AL_EAXREVERB_MAX_DENSITY)}; + + /* The main delay length includes the maximum early reflection delay, the + * largest early tap width, the maximum late reverb delay, and the + * largest late tap width. Finally, it must also be extended by the + * update size (BUFFERSIZE) for block processing. + */ + ALfloat length{AL_EAXREVERB_MAX_REFLECTIONS_DELAY + EARLY_TAP_LENGTHS.back()*multiplier + + AL_EAXREVERB_MAX_LATE_REVERB_DELAY + + (LATE_LINE_LENGTHS.back() - LATE_LINE_LENGTHS.front())/float{NUM_LINES}*multiplier}; + totalSamples += mDelay.calcLineLength(length, totalSamples, frequency, BUFFERSIZE); + + /* The early vector all-pass line. */ + length = EARLY_ALLPASS_LENGTHS.back() * multiplier; + totalSamples += mEarly.VecAp.Delay.calcLineLength(length, totalSamples, frequency, 0); + + /* The early reflection line. */ + length = EARLY_LINE_LENGTHS.back() * multiplier; + totalSamples += mEarly.Delay.calcLineLength(length, totalSamples, frequency, 0); + + /* The late vector all-pass line. */ + length = LATE_ALLPASS_LENGTHS.back() * multiplier; + totalSamples += mLate.VecAp.Delay.calcLineLength(length, totalSamples, frequency, 0); + + /* The late delay lines are calculated from the largest maximum density + * line length. + */ + length = LATE_LINE_LENGTHS.back() * multiplier; + totalSamples += mLate.Delay.calcLineLength(length, totalSamples, frequency, 0); + + if(totalSamples != mSampleBuffer.size()) + { + mSampleBuffer.resize(totalSamples); + mSampleBuffer.shrink_to_fit(); + } + + /* Clear the sample buffer. */ + std::fill(mSampleBuffer.begin(), mSampleBuffer.end(), std::array{}); + + /* Update all delays to reflect the new sample buffer. */ + mDelay.realizeLineOffset(mSampleBuffer.data()); + mEarly.VecAp.Delay.realizeLineOffset(mSampleBuffer.data()); + mEarly.Delay.realizeLineOffset(mSampleBuffer.data()); + mLate.VecAp.Delay.realizeLineOffset(mSampleBuffer.data()); + mLate.Delay.realizeLineOffset(mSampleBuffer.data()); + + return true; +} + +ALboolean ReverbState::deviceUpdate(const ALCdevice *device) +{ + const auto frequency = static_cast(device->Frequency); + + /* Allocate the delay lines. */ + if(!allocLines(frequency)) + return AL_FALSE; + + const ALfloat multiplier{CalcDelayLengthMult(AL_EAXREVERB_MAX_DENSITY)}; + + /* The late feed taps are set a fixed position past the latest delay tap. */ + mLateFeedTap = float2uint( + (AL_EAXREVERB_MAX_REFLECTIONS_DELAY + EARLY_TAP_LENGTHS.back()*multiplier) * frequency); + + /* Clear filters and gain coefficients since the delay lines were all just + * cleared (if not reallocated). + */ + for(auto &filter : mFilter) + { + filter.Lp.clear(); + filter.Hp.clear(); + } + + for(auto &coeff : mEarlyDelayCoeff) + std::fill(std::begin(coeff), std::end(coeff), 0.0f); + for(auto &coeff : mEarly.Coeff) + std::fill(std::begin(coeff), std::end(coeff), 0.0f); + + mLate.DensityGain[0] = 0.0f; + mLate.DensityGain[1] = 0.0f; + for(auto &t60 : mLate.T60) + { + t60.MidGain[0] = 0.0f; + t60.MidGain[1] = 0.0f; + t60.HFFilter.clear(); + t60.LFFilter.clear(); + } + + for(auto &gains : mEarly.CurrentGain) + std::fill(std::begin(gains), std::end(gains), 0.0f); + for(auto &gains : mEarly.PanGain) + std::fill(std::begin(gains), std::end(gains), 0.0f); + for(auto &gains : mLate.CurrentGain) + std::fill(std::begin(gains), std::end(gains), 0.0f); + for(auto &gains : mLate.PanGain) + std::fill(std::begin(gains), std::end(gains), 0.0f); + + /* Reset fading and offset base. */ + mDoFading = true; + std::fill(std::begin(mMaxUpdate), std::end(mMaxUpdate), MAX_UPDATE_SAMPLES); + mOffset = 0; + + if(device->mAmbiOrder > 1) + { + mMixOut = &ReverbState::MixOutAmbiUp; + mOrderScales = BFormatDec::GetHFOrderScales(1, device->mAmbiOrder); + } + else + { + mMixOut = &ReverbState::MixOutPlain; + mOrderScales.fill(1.0f); + } + mAmbiSplitter[0][0].init(400.0f / frequency); + std::fill(mAmbiSplitter[0].begin()+1, mAmbiSplitter[0].end(), mAmbiSplitter[0][0]); + std::fill(mAmbiSplitter[1].begin(), mAmbiSplitter[1].end(), mAmbiSplitter[0][0]); + + return AL_TRUE; +} + +/************************************** + * Effect Update * + **************************************/ + +/* Calculate a decay coefficient given the length of each cycle and the time + * until the decay reaches -60 dB. + */ +inline ALfloat CalcDecayCoeff(const ALfloat length, const ALfloat decayTime) +{ return std::pow(REVERB_DECAY_GAIN, length/decayTime); } + +/* Calculate a decay length from a coefficient and the time until the decay + * reaches -60 dB. + */ +inline ALfloat CalcDecayLength(const ALfloat coeff, const ALfloat decayTime) +{ return std::log10(coeff) * decayTime / std::log10(REVERB_DECAY_GAIN); } + +/* Calculate an attenuation to be applied to the input of any echo models to + * compensate for modal density and decay time. + */ +inline ALfloat CalcDensityGain(const ALfloat a) +{ + /* The energy of a signal can be obtained by finding the area under the + * squared signal. This takes the form of Sum(x_n^2), where x is the + * amplitude for the sample n. + * + * Decaying feedback matches exponential decay of the form Sum(a^n), + * where a is the attenuation coefficient, and n is the sample. The area + * under this decay curve can be calculated as: 1 / (1 - a). + * + * Modifying the above equation to find the area under the squared curve + * (for energy) yields: 1 / (1 - a^2). Input attenuation can then be + * calculated by inverting the square root of this approximation, + * yielding: 1 / sqrt(1 / (1 - a^2)), simplified to: sqrt(1 - a^2). + */ + return std::sqrt(1.0f - a*a); +} + +/* Calculate the scattering matrix coefficients given a diffusion factor. */ +inline ALvoid CalcMatrixCoeffs(const ALfloat diffusion, ALfloat *x, ALfloat *y) +{ + /* The matrix is of order 4, so n is sqrt(4 - 1). */ + ALfloat n{std::sqrt(3.0f)}; + ALfloat t{diffusion * std::atan(n)}; + + /* Calculate the first mixing matrix coefficient. */ + *x = std::cos(t); + /* Calculate the second mixing matrix coefficient. */ + *y = std::sin(t) / n; +} + +/* Calculate the limited HF ratio for use with the late reverb low-pass + * filters. + */ +ALfloat CalcLimitedHfRatio(const ALfloat hfRatio, const ALfloat airAbsorptionGainHF, + const ALfloat decayTime) +{ + /* Find the attenuation due to air absorption in dB (converting delay + * time to meters using the speed of sound). Then reversing the decay + * equation, solve for HF ratio. The delay length is cancelled out of + * the equation, so it can be calculated once for all lines. + */ + ALfloat limitRatio{1.0f / + (CalcDecayLength(airAbsorptionGainHF, decayTime) * SPEEDOFSOUNDMETRESPERSEC)}; + + /* Using the limit calculated above, apply the upper bound to the HF ratio. + */ + return minf(limitRatio, hfRatio); +} + + +/* Calculates the 3-band T60 damping coefficients for a particular delay line + * of specified length, using a combination of two shelf filter sections given + * decay times for each band split at two reference frequencies. + */ +void T60Filter::calcCoeffs(const ALfloat length, const ALfloat lfDecayTime, + const ALfloat mfDecayTime, const ALfloat hfDecayTime, const ALfloat lf0norm, + const ALfloat hf0norm) +{ + const float mfGain{CalcDecayCoeff(length, mfDecayTime)}; + const float lfGain{CalcDecayCoeff(length, lfDecayTime) / mfGain}; + const float hfGain{CalcDecayCoeff(length, hfDecayTime) / mfGain}; + + MidGain[1] = mfGain; + LFFilter.setParamsFromSlope(BiquadType::LowShelf, lf0norm, lfGain, 1.0f); + HFFilter.setParamsFromSlope(BiquadType::HighShelf, hf0norm, hfGain, 1.0f); +} + +/* Update the early reflection line lengths and gain coefficients. */ +void EarlyReflections::updateLines(const ALfloat density, const ALfloat diffusion, + const ALfloat decayTime, const ALfloat frequency) +{ + const ALfloat multiplier{CalcDelayLengthMult(density)}; + + /* Calculate the all-pass feed-back/forward coefficient. */ + VecAp.Coeff = std::sqrt(0.5f) * std::pow(diffusion, 2.0f); + + for(size_t i{0u};i < NUM_LINES;i++) + { + /* Calculate the length (in seconds) of each all-pass line. */ + ALfloat length{EARLY_ALLPASS_LENGTHS[i] * multiplier}; + + /* Calculate the delay offset for each all-pass line. */ + VecAp.Offset[i][1] = float2uint(length * frequency); + + /* Calculate the length (in seconds) of each delay line. */ + length = EARLY_LINE_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each delay line. */ + Offset[i][1] = float2uint(length * frequency); + + /* Calculate the gain (coefficient) for each line. */ + Coeff[i][1] = CalcDecayCoeff(length, decayTime); + } +} + +/* Update the late reverb line lengths and T60 coefficients. */ +void LateReverb::updateLines(const ALfloat density, const ALfloat diffusion, + const ALfloat lfDecayTime, const ALfloat mfDecayTime, const ALfloat hfDecayTime, + const ALfloat lf0norm, const ALfloat hf0norm, const ALfloat frequency) +{ + /* Scaling factor to convert the normalized reference frequencies from + * representing 0...freq to 0...max_reference. + */ + const ALfloat norm_weight_factor{frequency / AL_EAXREVERB_MAX_HFREFERENCE}; + + const ALfloat late_allpass_avg{ + std::accumulate(LATE_ALLPASS_LENGTHS.begin(), LATE_ALLPASS_LENGTHS.end(), 0.0f) / + float{NUM_LINES}}; + + /* To compensate for changes in modal density and decay time of the late + * reverb signal, the input is attenuated based on the maximal energy of + * the outgoing signal. This approximation is used to keep the apparent + * energy of the signal equal for all ranges of density and decay time. + * + * The average length of the delay lines is used to calculate the + * attenuation coefficient. + */ + const ALfloat multiplier{CalcDelayLengthMult(density)}; + ALfloat length{std::accumulate(LATE_LINE_LENGTHS.begin(), LATE_LINE_LENGTHS.end(), 0.0f) / + float{NUM_LINES} * multiplier}; + length += late_allpass_avg * multiplier; + /* The density gain calculation uses an average decay time weighted by + * approximate bandwidth. This attempts to compensate for losses of energy + * that reduce decay time due to scattering into highly attenuated bands. + */ + const ALfloat decayTimeWeighted{ + (lf0norm*norm_weight_factor)*lfDecayTime + + (hf0norm*norm_weight_factor - lf0norm*norm_weight_factor)*mfDecayTime + + (1.0f - hf0norm*norm_weight_factor)*hfDecayTime}; + DensityGain[1] = CalcDensityGain(CalcDecayCoeff(length, decayTimeWeighted)); + + /* Calculate the all-pass feed-back/forward coefficient. */ + VecAp.Coeff = std::sqrt(0.5f) * std::pow(diffusion, 2.0f); + + for(size_t i{0u};i < NUM_LINES;i++) + { + /* Calculate the length (in seconds) of each all-pass line. */ + length = LATE_ALLPASS_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each all-pass line. */ + VecAp.Offset[i][1] = float2uint(length * frequency); + + /* Calculate the length (in seconds) of each delay line. */ + length = LATE_LINE_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each delay line. */ + Offset[i][1] = float2uint(length*frequency + 0.5f); + + /* Approximate the absorption that the vector all-pass would exhibit + * given the current diffusion so we don't have to process a full T60 + * filter for each of its four lines. + */ + length += lerp(LATE_ALLPASS_LENGTHS[i], late_allpass_avg, diffusion) * multiplier; + + /* Calculate the T60 damping coefficients for each line. */ + T60[i].calcCoeffs(length, lfDecayTime, mfDecayTime, hfDecayTime, lf0norm, hf0norm); + } +} + + +/* Update the offsets for the main effect delay line. */ +void ReverbState::updateDelayLine(const ALfloat earlyDelay, const ALfloat lateDelay, + const ALfloat density, const ALfloat decayTime, const ALfloat frequency) +{ + const ALfloat multiplier{CalcDelayLengthMult(density)}; + + /* Early reflection taps are decorrelated by means of an average room + * reflection approximation described above the definition of the taps. + * This approximation is linear and so the above density multiplier can + * be applied to adjust the width of the taps. A single-band decay + * coefficient is applied to simulate initial attenuation and absorption. + * + * Late reverb taps are based on the late line lengths to allow a zero- + * delay path and offsets that would continue the propagation naturally + * into the late lines. + */ + for(size_t i{0u};i < NUM_LINES;i++) + { + ALfloat length{earlyDelay + EARLY_TAP_LENGTHS[i]*multiplier}; + mEarlyDelayTap[i][1] = float2uint(length * frequency); + + length = EARLY_TAP_LENGTHS[i]*multiplier; + mEarlyDelayCoeff[i][1] = CalcDecayCoeff(length, decayTime); + + length = (LATE_LINE_LENGTHS[i] - LATE_LINE_LENGTHS.front())/float{NUM_LINES}*multiplier + + lateDelay; + mLateDelayTap[i][1] = mLateFeedTap + float2uint(length * frequency); + } +} + +/* Creates a transform matrix given a reverb vector. The vector pans the reverb + * reflections toward the given direction, using its magnitude (up to 1) as a + * focal strength. This function results in a B-Format transformation matrix + * that spatially focuses the signal in the desired direction. + */ +alu::Matrix GetTransformFromVector(const ALfloat *vec) +{ + constexpr float sqrt_3{1.73205080756887719318f}; + + /* Normalize the panning vector according to the N3D scale, which has an + * extra sqrt(3) term on the directional components. Converting from OpenAL + * to B-Format also requires negating X (ACN 1) and Z (ACN 3). Note however + * that the reverb panning vectors use left-handed coordinates, unlike the + * rest of OpenAL which use right-handed. This is fixed by negating Z, + * which cancels out with the B-Format Z negation. + */ + ALfloat norm[3]; + ALfloat mag{std::sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2])}; + if(mag > 1.0f) + { + norm[0] = vec[0] / mag * -sqrt_3; + norm[1] = vec[1] / mag * sqrt_3; + norm[2] = vec[2] / mag * sqrt_3; + mag = 1.0f; + } + else + { + /* If the magnitude is less than or equal to 1, just apply the sqrt(3) + * term. There's no need to renormalize the magnitude since it would + * just be reapplied in the matrix. + */ + norm[0] = vec[0] * -sqrt_3; + norm[1] = vec[1] * sqrt_3; + norm[2] = vec[2] * sqrt_3; + } + + return alu::Matrix{ + 1.0f, 0.0f, 0.0f, 0.0f, + norm[0], 1.0f-mag, 0.0f, 0.0f, + norm[1], 0.0f, 1.0f-mag, 0.0f, + norm[2], 0.0f, 0.0f, 1.0f-mag + }; +} + +/* Update the early and late 3D panning gains. */ +void ReverbState::update3DPanning(const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, + const ALfloat earlyGain, const ALfloat lateGain, const EffectTarget &target) +{ + /* Create matrices that transform a B-Format signal according to the + * panning vectors. + */ + const alu::Matrix earlymat{GetTransformFromVector(ReflectionsPan)}; + const alu::Matrix latemat{GetTransformFromVector(LateReverbPan)}; + + mOutTarget = target.Main->Buffer; + for(size_t i{0u};i < NUM_LINES;i++) + { + const ALfloat coeffs[MAX_AMBI_CHANNELS]{earlymat[0][i], earlymat[1][i], earlymat[2][i], + earlymat[3][i]}; + ComputePanGains(target.Main, coeffs, earlyGain, mEarly.PanGain[i]); + } + for(size_t i{0u};i < NUM_LINES;i++) + { + const ALfloat coeffs[MAX_AMBI_CHANNELS]{latemat[0][i], latemat[1][i], latemat[2][i], + latemat[3][i]}; + ComputePanGains(target.Main, coeffs, lateGain, mLate.PanGain[i]); + } +} + +void ReverbState::update(const ALCcontext *Context, const ALeffectslot *Slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *Device{Context->mDevice.get()}; + const auto frequency = static_cast(Device->Frequency); + + /* Calculate the master filters */ + float hf0norm{minf(props->Reverb.HFReference/frequency, 0.49f)}; + mFilter[0].Lp.setParamsFromSlope(BiquadType::HighShelf, hf0norm, props->Reverb.GainHF, 1.0f); + float lf0norm{minf(props->Reverb.LFReference/frequency, 0.49f)}; + mFilter[0].Hp.setParamsFromSlope(BiquadType::LowShelf, lf0norm, props->Reverb.GainLF, 1.0f); + for(size_t i{1u};i < NUM_LINES;i++) + { + mFilter[i].Lp.copyParamsFrom(mFilter[0].Lp); + mFilter[i].Hp.copyParamsFrom(mFilter[0].Hp); + } + + /* Update the main effect delay and associated taps. */ + updateDelayLine(props->Reverb.ReflectionsDelay, props->Reverb.LateReverbDelay, + props->Reverb.Density, props->Reverb.DecayTime, frequency); + + /* Update the early lines. */ + mEarly.updateLines(props->Reverb.Density, props->Reverb.Diffusion, props->Reverb.DecayTime, + frequency); + + /* Get the mixing matrix coefficients. */ + CalcMatrixCoeffs(props->Reverb.Diffusion, &mMixX, &mMixY); + + /* If the HF limit parameter is flagged, calculate an appropriate limit + * based on the air absorption parameter. + */ + ALfloat hfRatio{props->Reverb.DecayHFRatio}; + if(props->Reverb.DecayHFLimit && props->Reverb.AirAbsorptionGainHF < 1.0f) + hfRatio = CalcLimitedHfRatio(hfRatio, props->Reverb.AirAbsorptionGainHF, + props->Reverb.DecayTime); + + /* Calculate the LF/HF decay times. */ + const ALfloat lfDecayTime{clampf(props->Reverb.DecayTime * props->Reverb.DecayLFRatio, + AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME)}; + const ALfloat hfDecayTime{clampf(props->Reverb.DecayTime * hfRatio, + AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME)}; + + /* Update the late lines. */ + mLate.updateLines(props->Reverb.Density, props->Reverb.Diffusion, lfDecayTime, + props->Reverb.DecayTime, hfDecayTime, lf0norm, hf0norm, frequency); + + /* Update early and late 3D panning. */ + const ALfloat gain{props->Reverb.Gain * Slot->Params.Gain * ReverbBoost}; + update3DPanning(props->Reverb.ReflectionsPan, props->Reverb.LateReverbPan, + props->Reverb.ReflectionsGain*gain, props->Reverb.LateReverbGain*gain, target); + + /* Calculate the max update size from the smallest relevant delay. */ + mMaxUpdate[1] = minz(MAX_UPDATE_SAMPLES, minz(mEarly.Offset[0][1], mLate.Offset[0][1])); + + /* Determine if delay-line cross-fading is required. Density is essentially + * a master control for the feedback delays, so changes the offsets of many + * delay lines. + */ + mDoFading |= (mParams.Density != props->Reverb.Density || + /* Diffusion and decay times influences the decay rate (gain) of the + * late reverb T60 filter. + */ + mParams.Diffusion != props->Reverb.Diffusion || + mParams.DecayTime != props->Reverb.DecayTime || + mParams.HFDecayTime != hfDecayTime || + mParams.LFDecayTime != lfDecayTime || + /* HF/LF References control the weighting used to calculate the density + * gain. + */ + mParams.HFReference != props->Reverb.HFReference || + mParams.LFReference != props->Reverb.LFReference); + if(mDoFading) + { + mParams.Density = props->Reverb.Density; + mParams.Diffusion = props->Reverb.Diffusion; + mParams.DecayTime = props->Reverb.DecayTime; + mParams.HFDecayTime = hfDecayTime; + mParams.LFDecayTime = lfDecayTime; + mParams.HFReference = props->Reverb.HFReference; + mParams.LFReference = props->Reverb.LFReference; + } +} + + +/************************************** + * Effect Processing * + **************************************/ + +/* Applies a scattering matrix to the 4-line (vector) input. This is used + * for both the below vector all-pass model and to perform modal feed-back + * delay network (FDN) mixing. + * + * The matrix is derived from a skew-symmetric matrix to form a 4D rotation + * matrix with a single unitary rotational parameter: + * + * [ d, a, b, c ] 1 = a^2 + b^2 + c^2 + d^2 + * [ -a, d, c, -b ] + * [ -b, -c, d, a ] + * [ -c, b, -a, d ] + * + * The rotation is constructed from the effect's diffusion parameter, + * yielding: + * + * 1 = x^2 + 3 y^2 + * + * Where a, b, and c are the coefficient y with differing signs, and d is the + * coefficient x. The final matrix is thus: + * + * [ x, y, -y, y ] n = sqrt(matrix_order - 1) + * [ -y, x, y, y ] t = diffusion_parameter * atan(n) + * [ y, -y, x, y ] x = cos(t) + * [ -y, -y, -y, x ] y = sin(t) / n + * + * Any square orthogonal matrix with an order that is a power of two will + * work (where ^T is transpose, ^-1 is inverse): + * + * M^T = M^-1 + * + * Using that knowledge, finding an appropriate matrix can be accomplished + * naively by searching all combinations of: + * + * M = D + S - S^T + * + * Where D is a diagonal matrix (of x), and S is a triangular matrix (of y) + * whose combination of signs are being iterated. + */ +inline auto VectorPartialScatter(const std::array &RESTRICT in, + const ALfloat xCoeff, const ALfloat yCoeff) -> std::array +{ + std::array out; + out[0] = xCoeff*in[0] + yCoeff*( in[1] + -in[2] + in[3]); + out[1] = xCoeff*in[1] + yCoeff*(-in[0] + in[2] + in[3]); + out[2] = xCoeff*in[2] + yCoeff*( in[0] + -in[1] + in[3]); + out[3] = xCoeff*in[3] + yCoeff*(-in[0] + -in[1] + -in[2] ); + return out; +} + +/* Utilizes the above, but reverses the input channels. */ +void VectorScatterRevDelayIn(const DelayLineI delay, size_t offset, const ALfloat xCoeff, + const ALfloat yCoeff, const al::span in, const size_t count) +{ + ASSUME(count > 0); + + for(size_t i{0u};i < count;) + { + offset &= delay.Mask; + size_t td{minz(delay.Mask+1 - offset, count-i)}; + do { + std::array f; + for(size_t j{0u};j < NUM_LINES;j++) + f[NUM_LINES-1-j] = in[j][i]; + ++i; + + delay.Line[offset++] = VectorPartialScatter(f, xCoeff, yCoeff); + } while(--td); + } +} + +/* This applies a Gerzon multiple-in/multiple-out (MIMO) vector all-pass + * filter to the 4-line input. + * + * It works by vectorizing a regular all-pass filter and replacing the delay + * element with a scattering matrix (like the one above) and a diagonal + * matrix of delay elements. + * + * Two static specializations are used for transitional (cross-faded) delay + * line processing and non-transitional processing. + */ +void VecAllpass::processUnfaded(const al::span samples, size_t offset, + const ALfloat xCoeff, const ALfloat yCoeff, const size_t todo) +{ + const DelayLineI delay{Delay}; + const ALfloat feedCoeff{Coeff}; + + ASSUME(todo > 0); + + size_t vap_offset[NUM_LINES]; + for(size_t j{0u};j < NUM_LINES;j++) + vap_offset[j] = offset - Offset[j][0]; + for(size_t i{0u};i < todo;) + { + for(size_t j{0u};j < NUM_LINES;j++) + vap_offset[j] &= delay.Mask; + offset &= delay.Mask; + + size_t maxoff{offset}; + for(size_t j{0u};j < NUM_LINES;j++) + maxoff = maxz(maxoff, vap_offset[j]); + size_t td{minz(delay.Mask+1 - maxoff, todo - i)}; + + do { + std::array f; + for(size_t j{0u};j < NUM_LINES;j++) + { + const ALfloat input{samples[j][i]}; + const ALfloat out{delay.Line[vap_offset[j]++][j] - feedCoeff*input}; + f[j] = input + feedCoeff*out; + + samples[j][i] = out; + } + ++i; + + delay.Line[offset++] = VectorPartialScatter(f, xCoeff, yCoeff); + } while(--td); + } +} +void VecAllpass::processFaded(const al::span samples, size_t offset, + const ALfloat xCoeff, const ALfloat yCoeff, ALfloat fadeCount, const ALfloat fadeStep, + const size_t todo) +{ + const DelayLineI delay{Delay}; + const ALfloat feedCoeff{Coeff}; + + ASSUME(todo > 0); + + size_t vap_offset[NUM_LINES][2]; + for(size_t j{0u};j < NUM_LINES;j++) + { + vap_offset[j][0] = offset - Offset[j][0]; + vap_offset[j][1] = offset - Offset[j][1]; + } + for(size_t i{0u};i < todo;) + { + for(size_t j{0u};j < NUM_LINES;j++) + { + vap_offset[j][0] &= delay.Mask; + vap_offset[j][1] &= delay.Mask; + } + offset &= delay.Mask; + + size_t maxoff{offset}; + for(size_t j{0u};j < NUM_LINES;j++) + maxoff = maxz(maxoff, maxz(vap_offset[j][0], vap_offset[j][1])); + size_t td{minz(delay.Mask+1 - maxoff, todo - i)}; + + do { + fadeCount += 1.0f; + const float fade{fadeCount * fadeStep}; + + std::array f; + for(size_t j{0u};j < NUM_LINES;j++) + f[j] = delay.Line[vap_offset[j][0]++][j]*(1.0f-fade) + + delay.Line[vap_offset[j][1]++][j]*fade; + + for(size_t j{0u};j < NUM_LINES;j++) + { + const ALfloat input{samples[j][i]}; + const ALfloat out{f[j] - feedCoeff*input}; + f[j] = input + feedCoeff*out; + + samples[j][i] = out; + } + ++i; + + delay.Line[offset++] = VectorPartialScatter(f, xCoeff, yCoeff); + } while(--td); + } +} + +/* This generates early reflections. + * + * This is done by obtaining the primary reflections (those arriving from the + * same direction as the source) from the main delay line. These are + * attenuated and all-pass filtered (based on the diffusion parameter). + * + * The early lines are then fed in reverse (according to the approximately + * opposite spatial location of the A-Format lines) to create the secondary + * reflections (those arriving from the opposite direction as the source). + * + * The early response is then completed by combining the primary reflections + * with the delayed and attenuated output from the early lines. + * + * Finally, the early response is reversed, scattered (based on diffusion), + * and fed into the late reverb section of the main delay line. + * + * Two static specializations are used for transitional (cross-faded) delay + * line processing and non-transitional processing. + */ +void ReverbState::earlyUnfaded(const size_t offset, const size_t todo) +{ + const DelayLineI early_delay{mEarly.Delay}; + const DelayLineI main_delay{mDelay}; + const ALfloat mixX{mMixX}; + const ALfloat mixY{mMixY}; + + ASSUME(todo > 0); + + /* First, load decorrelated samples from the main delay line as the primary + * reflections. + */ + for(size_t j{0u};j < NUM_LINES;j++) + { + size_t early_delay_tap{offset - mEarlyDelayTap[j][0]}; + const ALfloat coeff{mEarlyDelayCoeff[j][0]}; + for(size_t i{0u};i < todo;) + { + early_delay_tap &= main_delay.Mask; + size_t td{minz(main_delay.Mask+1 - early_delay_tap, todo - i)}; + do { + mTempSamples[j][i++] = main_delay.Line[early_delay_tap++][j] * coeff; + } while(--td); + } + } + + /* Apply a vector all-pass, to help color the initial reflections based on + * the diffusion strength. + */ + mEarly.VecAp.processUnfaded(mTempSamples, offset, mixX, mixY, todo); + + /* Apply a delay and bounce to generate secondary reflections, combine with + * the primary reflections and write out the result for mixing. + */ + for(size_t j{0u};j < NUM_LINES;j++) + { + size_t feedb_tap{offset - mEarly.Offset[j][0]}; + const ALfloat feedb_coeff{mEarly.Coeff[j][0]}; + float *out = mEarlySamples[j].data(); + + for(size_t i{0u};i < todo;) + { + feedb_tap &= early_delay.Mask; + size_t td{minz(early_delay.Mask+1 - feedb_tap, todo - i)}; + do { + out[i] = mTempSamples[j][i] + early_delay.Line[feedb_tap++][j]*feedb_coeff; + ++i; + } while(--td); + } + } + for(size_t j{0u};j < NUM_LINES;j++) + early_delay.write(offset, NUM_LINES-1-j, mTempSamples[j].data(), todo); + + /* Also write the result back to the main delay line for the late reverb + * stage to pick up at the appropriate time, appplying a scatter and + * bounce to improve the initial diffusion in the late reverb. + */ + const size_t late_feed_tap{offset - mLateFeedTap}; + VectorScatterRevDelayIn(main_delay, late_feed_tap, mixX, mixY, mEarlySamples, todo); +} +void ReverbState::earlyFaded(const size_t offset, const size_t todo, const ALfloat fade, + const ALfloat fadeStep) +{ + const DelayLineI early_delay{mEarly.Delay}; + const DelayLineI main_delay{mDelay}; + const ALfloat mixX{mMixX}; + const ALfloat mixY{mMixY}; + + ASSUME(todo > 0); + + for(size_t j{0u};j < NUM_LINES;j++) + { + size_t early_delay_tap0{offset - mEarlyDelayTap[j][0]}; + size_t early_delay_tap1{offset - mEarlyDelayTap[j][1]}; + const ALfloat oldCoeff{mEarlyDelayCoeff[j][0]}; + const ALfloat oldCoeffStep{-oldCoeff * fadeStep}; + const ALfloat newCoeffStep{mEarlyDelayCoeff[j][1] * fadeStep}; + ALfloat fadeCount{fade}; + + for(size_t i{0u};i < todo;) + { + early_delay_tap0 &= main_delay.Mask; + early_delay_tap1 &= main_delay.Mask; + size_t td{minz(main_delay.Mask+1 - maxz(early_delay_tap0, early_delay_tap1), todo-i)}; + do { + fadeCount += 1.0f; + const ALfloat fade0{oldCoeff + oldCoeffStep*fadeCount}; + const ALfloat fade1{newCoeffStep*fadeCount}; + mTempSamples[j][i++] = + main_delay.Line[early_delay_tap0++][j]*fade0 + + main_delay.Line[early_delay_tap1++][j]*fade1; + } while(--td); + } + } + + mEarly.VecAp.processFaded(mTempSamples, offset, mixX, mixY, fade, fadeStep, todo); + + for(size_t j{0u};j < NUM_LINES;j++) + { + size_t feedb_tap0{offset - mEarly.Offset[j][0]}; + size_t feedb_tap1{offset - mEarly.Offset[j][1]}; + const ALfloat feedb_oldCoeff{mEarly.Coeff[j][0]}; + const ALfloat feedb_oldCoeffStep{-feedb_oldCoeff * fadeStep}; + const ALfloat feedb_newCoeffStep{mEarly.Coeff[j][1] * fadeStep}; + float *out = mEarlySamples[j].data(); + ALfloat fadeCount{fade}; + + for(size_t i{0u};i < todo;) + { + feedb_tap0 &= early_delay.Mask; + feedb_tap1 &= early_delay.Mask; + size_t td{minz(early_delay.Mask+1 - maxz(feedb_tap0, feedb_tap1), todo - i)}; + + do { + fadeCount += 1.0f; + const ALfloat fade0{feedb_oldCoeff + feedb_oldCoeffStep*fadeCount}; + const ALfloat fade1{feedb_newCoeffStep*fadeCount}; + out[i] = mTempSamples[j][i] + + early_delay.Line[feedb_tap0++][j]*fade0 + + early_delay.Line[feedb_tap1++][j]*fade1; + ++i; + } while(--td); + } + } + for(size_t j{0u};j < NUM_LINES;j++) + early_delay.write(offset, NUM_LINES-1-j, mTempSamples[j].data(), todo); + + const size_t late_feed_tap{offset - mLateFeedTap}; + VectorScatterRevDelayIn(main_delay, late_feed_tap, mixX, mixY, mEarlySamples, todo); +} + +/* This generates the reverb tail using a modified feed-back delay network + * (FDN). + * + * Results from the early reflections are mixed with the output from the late + * delay lines. + * + * The late response is then completed by T60 and all-pass filtering the mix. + * + * Finally, the lines are reversed (so they feed their opposite directions) + * and scattered with the FDN matrix before re-feeding the delay lines. + * + * Two variations are made, one for for transitional (cross-faded) delay line + * processing and one for non-transitional processing. + */ +void ReverbState::lateUnfaded(const size_t offset, const size_t todo) +{ + const DelayLineI late_delay{mLate.Delay}; + const DelayLineI main_delay{mDelay}; + const ALfloat mixX{mMixX}; + const ALfloat mixY{mMixY}; + + ASSUME(todo > 0); + + /* First, load decorrelated samples from the main and feedback delay lines. + * Filter the signal to apply its frequency-dependent decay. + */ + for(size_t j{0u};j < NUM_LINES;j++) + { + size_t late_delay_tap{offset - mLateDelayTap[j][0]}; + size_t late_feedb_tap{offset - mLate.Offset[j][0]}; + const ALfloat midGain{mLate.T60[j].MidGain[0]}; + const ALfloat densityGain{mLate.DensityGain[0] * midGain}; + for(size_t i{0u};i < todo;) + { + late_delay_tap &= main_delay.Mask; + late_feedb_tap &= late_delay.Mask; + size_t td{minz(todo - i, + minz(main_delay.Mask+1 - late_delay_tap, late_delay.Mask+1 - late_feedb_tap))}; + do { + mTempSamples[j][i++] = + main_delay.Line[late_delay_tap++][j]*densityGain + + late_delay.Line[late_feedb_tap++][j]*midGain; + } while(--td); + } + mLate.T60[j].process({mTempSamples[j].data(), todo}); + } + + /* Apply a vector all-pass to improve micro-surface diffusion, and write + * out the results for mixing. + */ + mLate.VecAp.processUnfaded(mTempSamples, offset, mixX, mixY, todo); + for(size_t j{0u};j < NUM_LINES;j++) + std::copy_n(mTempSamples[j].begin(), todo, mLateSamples[j].begin()); + + /* Finally, scatter and bounce the results to refeed the feedback buffer. */ + VectorScatterRevDelayIn(late_delay, offset, mixX, mixY, mTempSamples, todo); +} +void ReverbState::lateFaded(const size_t offset, const size_t todo, const ALfloat fade, + const ALfloat fadeStep) +{ + const DelayLineI late_delay{mLate.Delay}; + const DelayLineI main_delay{mDelay}; + const ALfloat mixX{mMixX}; + const ALfloat mixY{mMixY}; + + ASSUME(todo > 0); + + for(size_t j{0u};j < NUM_LINES;j++) + { + const ALfloat oldMidGain{mLate.T60[j].MidGain[0]}; + const ALfloat midGain{mLate.T60[j].MidGain[1]}; + const ALfloat oldMidStep{-oldMidGain * fadeStep}; + const ALfloat midStep{midGain * fadeStep}; + const ALfloat oldDensityGain{mLate.DensityGain[0] * oldMidGain}; + const ALfloat densityGain{mLate.DensityGain[1] * midGain}; + const ALfloat oldDensityStep{-oldDensityGain * fadeStep}; + const ALfloat densityStep{densityGain * fadeStep}; + size_t late_delay_tap0{offset - mLateDelayTap[j][0]}; + size_t late_delay_tap1{offset - mLateDelayTap[j][1]}; + size_t late_feedb_tap0{offset - mLate.Offset[j][0]}; + size_t late_feedb_tap1{offset - mLate.Offset[j][1]}; + ALfloat fadeCount{fade}; + + for(size_t i{0u};i < todo;) + { + late_delay_tap0 &= main_delay.Mask; + late_delay_tap1 &= main_delay.Mask; + late_feedb_tap0 &= late_delay.Mask; + late_feedb_tap1 &= late_delay.Mask; + size_t td{minz(todo - i, + minz(main_delay.Mask+1 - maxz(late_delay_tap0, late_delay_tap1), + late_delay.Mask+1 - maxz(late_feedb_tap0, late_feedb_tap1)))}; + do { + fadeCount += 1.0f; + const ALfloat fade0{oldDensityGain + oldDensityStep*fadeCount}; + const ALfloat fade1{densityStep*fadeCount}; + const ALfloat gfade0{oldMidGain + oldMidStep*fadeCount}; + const ALfloat gfade1{midStep*fadeCount}; + mTempSamples[j][i++] = + main_delay.Line[late_delay_tap0++][j]*fade0 + + main_delay.Line[late_delay_tap1++][j]*fade1 + + late_delay.Line[late_feedb_tap0++][j]*gfade0 + + late_delay.Line[late_feedb_tap1++][j]*gfade1; + } while(--td); + } + mLate.T60[j].process({mTempSamples[j].data(), todo}); + } + + mLate.VecAp.processFaded(mTempSamples, offset, mixX, mixY, fade, fadeStep, todo); + for(size_t j{0u};j < NUM_LINES;j++) + std::copy_n(mTempSamples[j].begin(), todo, mLateSamples[j].begin()); + + VectorScatterRevDelayIn(late_delay, offset, mixX, mixY, mTempSamples, todo); +} + +void ReverbState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + size_t offset{mOffset}; + + ASSUME(samplesToDo > 0); + + /* Convert B-Format to A-Format for processing. */ + const size_t numInput{samplesIn.size()}; + const al::span tmpspan{mTempLine.data(), samplesToDo}; + for(size_t c{0u};c < NUM_LINES;c++) + { + std::fill(tmpspan.begin(), tmpspan.end(), 0.0f); + MixRowSamples(tmpspan, {B2A[c], numInput}, samplesIn[0].data(), samplesIn[0].size()); + + /* Band-pass the incoming samples and feed the initial delay line. */ + mFilter[c].Lp.process(tmpspan, tmpspan.begin()); + mFilter[c].Hp.process(tmpspan, tmpspan.begin()); + mDelay.write(offset, c, tmpspan.cbegin(), samplesToDo); + } + + /* Process reverb for these samples. */ + if LIKELY(!mDoFading) + { + for(size_t base{0};base < samplesToDo;) + { + /* Calculate the number of samples we can do this iteration. */ + size_t todo{minz(samplesToDo - base, mMaxUpdate[0])}; + /* Some mixers require maintaining a 4-sample alignment, so ensure + * that if it's not the last iteration. + */ + if(base+todo < samplesToDo) todo &= ~size_t{3}; + ASSUME(todo > 0); + + /* Generate non-faded early reflections and late reverb. */ + earlyUnfaded(offset, todo); + lateUnfaded(offset, todo); + + /* Finally, mix early reflections and late reverb. */ + (this->*mMixOut)(samplesOut, samplesToDo-base, base, todo); + + offset += todo; + base += todo; + } + } + else + { + const float fadeStep{1.0f / static_cast(samplesToDo)}; + for(size_t base{0};base < samplesToDo;) + { + size_t todo{minz(samplesToDo - base, minz(mMaxUpdate[0], mMaxUpdate[1]))}; + if(base+todo < samplesToDo) todo &= ~size_t{3}; + ASSUME(todo > 0); + + /* Generate cross-faded early reflections and late reverb. */ + auto fadeCount = static_cast(base); + earlyFaded(offset, todo, fadeCount, fadeStep); + lateFaded(offset, todo, fadeCount, fadeStep); + + (this->*mMixOut)(samplesOut, samplesToDo-base, base, todo); + + offset += todo; + base += todo; + } + + /* Update the cross-fading delay line taps. */ + for(size_t c{0u};c < NUM_LINES;c++) + { + mEarlyDelayTap[c][0] = mEarlyDelayTap[c][1]; + mEarlyDelayCoeff[c][0] = mEarlyDelayCoeff[c][1]; + mEarly.VecAp.Offset[c][0] = mEarly.VecAp.Offset[c][1]; + mEarly.Offset[c][0] = mEarly.Offset[c][1]; + mEarly.Coeff[c][0] = mEarly.Coeff[c][1]; + mLateDelayTap[c][0] = mLateDelayTap[c][1]; + mLate.VecAp.Offset[c][0] = mLate.VecAp.Offset[c][1]; + mLate.Offset[c][0] = mLate.Offset[c][1]; + mLate.T60[c].MidGain[0] = mLate.T60[c].MidGain[1]; + } + mLate.DensityGain[0] = mLate.DensityGain[1]; + mMaxUpdate[0] = mMaxUpdate[1]; + mDoFading = false; + } + mOffset = offset; +} + + +void EAXReverb_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_EAXREVERB_DECAY_HFLIMIT: + if(!(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay hflimit out of range"); + props->Reverb.DecayHFLimit = val != AL_FALSE; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid EAX reverb integer property 0x%04x", + param); + } +} +void EAXReverb_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ EAXReverb_setParami(props, context, param, vals[0]); } +void EAXReverb_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_EAXREVERB_DENSITY: + if(!(val >= AL_EAXREVERB_MIN_DENSITY && val <= AL_EAXREVERB_MAX_DENSITY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb density out of range"); + props->Reverb.Density = val; + break; + + case AL_EAXREVERB_DIFFUSION: + if(!(val >= AL_EAXREVERB_MIN_DIFFUSION && val <= AL_EAXREVERB_MAX_DIFFUSION)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb diffusion out of range"); + props->Reverb.Diffusion = val; + break; + + case AL_EAXREVERB_GAIN: + if(!(val >= AL_EAXREVERB_MIN_GAIN && val <= AL_EAXREVERB_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gain out of range"); + props->Reverb.Gain = val; + break; + + case AL_EAXREVERB_GAINHF: + if(!(val >= AL_EAXREVERB_MIN_GAINHF && val <= AL_EAXREVERB_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gainhf out of range"); + props->Reverb.GainHF = val; + break; + + case AL_EAXREVERB_GAINLF: + if(!(val >= AL_EAXREVERB_MIN_GAINLF && val <= AL_EAXREVERB_MAX_GAINLF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gainlf out of range"); + props->Reverb.GainLF = val; + break; + + case AL_EAXREVERB_DECAY_TIME: + if(!(val >= AL_EAXREVERB_MIN_DECAY_TIME && val <= AL_EAXREVERB_MAX_DECAY_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay time out of range"); + props->Reverb.DecayTime = val; + break; + + case AL_EAXREVERB_DECAY_HFRATIO: + if(!(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO && val <= AL_EAXREVERB_MAX_DECAY_HFRATIO)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay hfratio out of range"); + props->Reverb.DecayHFRatio = val; + break; + + case AL_EAXREVERB_DECAY_LFRATIO: + if(!(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO && val <= AL_EAXREVERB_MAX_DECAY_LFRATIO)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay lfratio out of range"); + props->Reverb.DecayLFRatio = val; + break; + + case AL_EAXREVERB_REFLECTIONS_GAIN: + if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN && val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections gain out of range"); + props->Reverb.ReflectionsGain = val; + break; + + case AL_EAXREVERB_REFLECTIONS_DELAY: + if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY && val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections delay out of range"); + props->Reverb.ReflectionsDelay = val; + break; + + case AL_EAXREVERB_LATE_REVERB_GAIN: + if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN && val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb gain out of range"); + props->Reverb.LateReverbGain = val; + break; + + case AL_EAXREVERB_LATE_REVERB_DELAY: + if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY && val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb delay out of range"); + props->Reverb.LateReverbDelay = val; + break; + + case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: + if(!(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb air absorption gainhf out of range"); + props->Reverb.AirAbsorptionGainHF = val; + break; + + case AL_EAXREVERB_ECHO_TIME: + if(!(val >= AL_EAXREVERB_MIN_ECHO_TIME && val <= AL_EAXREVERB_MAX_ECHO_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb echo time out of range"); + props->Reverb.EchoTime = val; + break; + + case AL_EAXREVERB_ECHO_DEPTH: + if(!(val >= AL_EAXREVERB_MIN_ECHO_DEPTH && val <= AL_EAXREVERB_MAX_ECHO_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb echo depth out of range"); + props->Reverb.EchoDepth = val; + break; + + case AL_EAXREVERB_MODULATION_TIME: + if(!(val >= AL_EAXREVERB_MIN_MODULATION_TIME && val <= AL_EAXREVERB_MAX_MODULATION_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb modulation time out of range"); + props->Reverb.ModulationTime = val; + break; + + case AL_EAXREVERB_MODULATION_DEPTH: + if(!(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH && val <= AL_EAXREVERB_MAX_MODULATION_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb modulation depth out of range"); + props->Reverb.ModulationDepth = val; + break; + + case AL_EAXREVERB_HFREFERENCE: + if(!(val >= AL_EAXREVERB_MIN_HFREFERENCE && val <= AL_EAXREVERB_MAX_HFREFERENCE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb hfreference out of range"); + props->Reverb.HFReference = val; + break; + + case AL_EAXREVERB_LFREFERENCE: + if(!(val >= AL_EAXREVERB_MIN_LFREFERENCE && val <= AL_EAXREVERB_MAX_LFREFERENCE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb lfreference out of range"); + props->Reverb.LFReference = val; + break; + + case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: + if(!(val >= AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb room rolloff factor out of range"); + props->Reverb.RoomRolloffFactor = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", param); + } +} +void EAXReverb_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ + switch(param) + { + case AL_EAXREVERB_REFLECTIONS_PAN: + if(!(std::isfinite(vals[0]) && std::isfinite(vals[1]) && std::isfinite(vals[2]))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections pan out of range"); + props->Reverb.ReflectionsPan[0] = vals[0]; + props->Reverb.ReflectionsPan[1] = vals[1]; + props->Reverb.ReflectionsPan[2] = vals[2]; + break; + case AL_EAXREVERB_LATE_REVERB_PAN: + if(!(std::isfinite(vals[0]) && std::isfinite(vals[1]) && std::isfinite(vals[2]))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb pan out of range"); + props->Reverb.LateReverbPan[0] = vals[0]; + props->Reverb.LateReverbPan[1] = vals[1]; + props->Reverb.LateReverbPan[2] = vals[2]; + break; + + default: + EAXReverb_setParamf(props, context, param, vals[0]); + break; + } +} + +void EAXReverb_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_EAXREVERB_DECAY_HFLIMIT: + *val = props->Reverb.DecayHFLimit; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid EAX reverb integer property 0x%04x", + param); + } +} +void EAXReverb_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ EAXReverb_getParami(props, context, param, vals); } +void EAXReverb_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_EAXREVERB_DENSITY: + *val = props->Reverb.Density; + break; + + case AL_EAXREVERB_DIFFUSION: + *val = props->Reverb.Diffusion; + break; + + case AL_EAXREVERB_GAIN: + *val = props->Reverb.Gain; + break; + + case AL_EAXREVERB_GAINHF: + *val = props->Reverb.GainHF; + break; + + case AL_EAXREVERB_GAINLF: + *val = props->Reverb.GainLF; + break; + + case AL_EAXREVERB_DECAY_TIME: + *val = props->Reverb.DecayTime; + break; + + case AL_EAXREVERB_DECAY_HFRATIO: + *val = props->Reverb.DecayHFRatio; + break; + + case AL_EAXREVERB_DECAY_LFRATIO: + *val = props->Reverb.DecayLFRatio; + break; + + case AL_EAXREVERB_REFLECTIONS_GAIN: + *val = props->Reverb.ReflectionsGain; + break; + + case AL_EAXREVERB_REFLECTIONS_DELAY: + *val = props->Reverb.ReflectionsDelay; + break; + + case AL_EAXREVERB_LATE_REVERB_GAIN: + *val = props->Reverb.LateReverbGain; + break; + + case AL_EAXREVERB_LATE_REVERB_DELAY: + *val = props->Reverb.LateReverbDelay; + break; + + case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: + *val = props->Reverb.AirAbsorptionGainHF; + break; + + case AL_EAXREVERB_ECHO_TIME: + *val = props->Reverb.EchoTime; + break; + + case AL_EAXREVERB_ECHO_DEPTH: + *val = props->Reverb.EchoDepth; + break; + + case AL_EAXREVERB_MODULATION_TIME: + *val = props->Reverb.ModulationTime; + break; + + case AL_EAXREVERB_MODULATION_DEPTH: + *val = props->Reverb.ModulationDepth; + break; + + case AL_EAXREVERB_HFREFERENCE: + *val = props->Reverb.HFReference; + break; + + case AL_EAXREVERB_LFREFERENCE: + *val = props->Reverb.LFReference; + break; + + case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: + *val = props->Reverb.RoomRolloffFactor; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", param); + } +} +void EAXReverb_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ + switch(param) + { + case AL_EAXREVERB_REFLECTIONS_PAN: + vals[0] = props->Reverb.ReflectionsPan[0]; + vals[1] = props->Reverb.ReflectionsPan[1]; + vals[2] = props->Reverb.ReflectionsPan[2]; + break; + case AL_EAXREVERB_LATE_REVERB_PAN: + vals[0] = props->Reverb.LateReverbPan[0]; + vals[1] = props->Reverb.LateReverbPan[1]; + vals[2] = props->Reverb.LateReverbPan[2]; + break; + + default: + EAXReverb_getParamf(props, context, param, vals); + break; + } +} + +DEFINE_ALEFFECT_VTABLE(EAXReverb); + + +struct ReverbStateFactory final : public EffectStateFactory { + EffectState *create() override { return new ReverbState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &EAXReverb_vtable; } +}; + +EffectProps ReverbStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY; + props.Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION; + props.Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN; + props.Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF; + props.Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF; + props.Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME; + props.Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO; + props.Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO; + props.Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN; + props.Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY; + props.Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; + props.Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; + props.Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; + props.Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN; + props.Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY; + props.Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; + props.Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; + props.Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; + props.Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME; + props.Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH; + props.Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME; + props.Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH; + props.Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF; + props.Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE; + props.Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE; + props.Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; + props.Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT; + return props; +} + + +void StdReverb_setParami(EffectProps *props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_REVERB_DECAY_HFLIMIT: + if(!(val >= AL_REVERB_MIN_DECAY_HFLIMIT && val <= AL_REVERB_MAX_DECAY_HFLIMIT)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay hflimit out of range"); + props->Reverb.DecayHFLimit = val != AL_FALSE; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid reverb integer property 0x%04x", param); + } +} +void StdReverb_setParamiv(EffectProps *props, ALCcontext *context, ALenum param, const ALint *vals) +{ StdReverb_setParami(props, context, param, vals[0]); } +void StdReverb_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_REVERB_DENSITY: + if(!(val >= AL_REVERB_MIN_DENSITY && val <= AL_REVERB_MAX_DENSITY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb density out of range"); + props->Reverb.Density = val; + break; + + case AL_REVERB_DIFFUSION: + if(!(val >= AL_REVERB_MIN_DIFFUSION && val <= AL_REVERB_MAX_DIFFUSION)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb diffusion out of range"); + props->Reverb.Diffusion = val; + break; + + case AL_REVERB_GAIN: + if(!(val >= AL_REVERB_MIN_GAIN && val <= AL_REVERB_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb gain out of range"); + props->Reverb.Gain = val; + break; + + case AL_REVERB_GAINHF: + if(!(val >= AL_REVERB_MIN_GAINHF && val <= AL_REVERB_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb gainhf out of range"); + props->Reverb.GainHF = val; + break; + + case AL_REVERB_DECAY_TIME: + if(!(val >= AL_REVERB_MIN_DECAY_TIME && val <= AL_REVERB_MAX_DECAY_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay time out of range"); + props->Reverb.DecayTime = val; + break; + + case AL_REVERB_DECAY_HFRATIO: + if(!(val >= AL_REVERB_MIN_DECAY_HFRATIO && val <= AL_REVERB_MAX_DECAY_HFRATIO)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay hfratio out of range"); + props->Reverb.DecayHFRatio = val; + break; + + case AL_REVERB_REFLECTIONS_GAIN: + if(!(val >= AL_REVERB_MIN_REFLECTIONS_GAIN && val <= AL_REVERB_MAX_REFLECTIONS_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb reflections gain out of range"); + props->Reverb.ReflectionsGain = val; + break; + + case AL_REVERB_REFLECTIONS_DELAY: + if(!(val >= AL_REVERB_MIN_REFLECTIONS_DELAY && val <= AL_REVERB_MAX_REFLECTIONS_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb reflections delay out of range"); + props->Reverb.ReflectionsDelay = val; + break; + + case AL_REVERB_LATE_REVERB_GAIN: + if(!(val >= AL_REVERB_MIN_LATE_REVERB_GAIN && val <= AL_REVERB_MAX_LATE_REVERB_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb late reverb gain out of range"); + props->Reverb.LateReverbGain = val; + break; + + case AL_REVERB_LATE_REVERB_DELAY: + if(!(val >= AL_REVERB_MIN_LATE_REVERB_DELAY && val <= AL_REVERB_MAX_LATE_REVERB_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb late reverb delay out of range"); + props->Reverb.LateReverbDelay = val; + break; + + case AL_REVERB_AIR_ABSORPTION_GAINHF: + if(!(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb air absorption gainhf out of range"); + props->Reverb.AirAbsorptionGainHF = val; + break; + + case AL_REVERB_ROOM_ROLLOFF_FACTOR: + if(!(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb room rolloff factor out of range"); + props->Reverb.RoomRolloffFactor = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid reverb float property 0x%04x", param); + } +} +void StdReverb_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ StdReverb_setParamf(props, context, param, vals[0]); } + +void StdReverb_getParami(const EffectProps *props, ALCcontext *context, ALenum param, ALint *val) +{ + switch(param) + { + case AL_REVERB_DECAY_HFLIMIT: + *val = props->Reverb.DecayHFLimit; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid reverb integer property 0x%04x", param); + } +} +void StdReverb_getParamiv(const EffectProps *props, ALCcontext *context, ALenum param, ALint *vals) +{ StdReverb_getParami(props, context, param, vals); } +void StdReverb_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_REVERB_DENSITY: + *val = props->Reverb.Density; + break; + + case AL_REVERB_DIFFUSION: + *val = props->Reverb.Diffusion; + break; + + case AL_REVERB_GAIN: + *val = props->Reverb.Gain; + break; + + case AL_REVERB_GAINHF: + *val = props->Reverb.GainHF; + break; + + case AL_REVERB_DECAY_TIME: + *val = props->Reverb.DecayTime; + break; + + case AL_REVERB_DECAY_HFRATIO: + *val = props->Reverb.DecayHFRatio; + break; + + case AL_REVERB_REFLECTIONS_GAIN: + *val = props->Reverb.ReflectionsGain; + break; + + case AL_REVERB_REFLECTIONS_DELAY: + *val = props->Reverb.ReflectionsDelay; + break; + + case AL_REVERB_LATE_REVERB_GAIN: + *val = props->Reverb.LateReverbGain; + break; + + case AL_REVERB_LATE_REVERB_DELAY: + *val = props->Reverb.LateReverbDelay; + break; + + case AL_REVERB_AIR_ABSORPTION_GAINHF: + *val = props->Reverb.AirAbsorptionGainHF; + break; + + case AL_REVERB_ROOM_ROLLOFF_FACTOR: + *val = props->Reverb.RoomRolloffFactor; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid reverb float property 0x%04x", param); + } +} +void StdReverb_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ StdReverb_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(StdReverb); + + +struct StdReverbStateFactory final : public EffectStateFactory { + EffectState *create() override { return new ReverbState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &StdReverb_vtable; } +}; + +EffectProps StdReverbStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Reverb.Density = AL_REVERB_DEFAULT_DENSITY; + props.Reverb.Diffusion = AL_REVERB_DEFAULT_DIFFUSION; + props.Reverb.Gain = AL_REVERB_DEFAULT_GAIN; + props.Reverb.GainHF = AL_REVERB_DEFAULT_GAINHF; + props.Reverb.GainLF = 1.0f; + props.Reverb.DecayTime = AL_REVERB_DEFAULT_DECAY_TIME; + props.Reverb.DecayHFRatio = AL_REVERB_DEFAULT_DECAY_HFRATIO; + props.Reverb.DecayLFRatio = 1.0f; + props.Reverb.ReflectionsGain = AL_REVERB_DEFAULT_REFLECTIONS_GAIN; + props.Reverb.ReflectionsDelay = AL_REVERB_DEFAULT_REFLECTIONS_DELAY; + props.Reverb.ReflectionsPan[0] = 0.0f; + props.Reverb.ReflectionsPan[1] = 0.0f; + props.Reverb.ReflectionsPan[2] = 0.0f; + props.Reverb.LateReverbGain = AL_REVERB_DEFAULT_LATE_REVERB_GAIN; + props.Reverb.LateReverbDelay = AL_REVERB_DEFAULT_LATE_REVERB_DELAY; + props.Reverb.LateReverbPan[0] = 0.0f; + props.Reverb.LateReverbPan[1] = 0.0f; + props.Reverb.LateReverbPan[2] = 0.0f; + props.Reverb.EchoTime = 0.25f; + props.Reverb.EchoDepth = 0.0f; + props.Reverb.ModulationTime = 0.25f; + props.Reverb.ModulationDepth = 0.0f; + props.Reverb.AirAbsorptionGainHF = AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF; + props.Reverb.HFReference = 5000.0f; + props.Reverb.LFReference = 250.0f; + props.Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; + props.Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT; + return props; +} + +} // namespace + +EffectStateFactory *ReverbStateFactory_getFactory() +{ + static ReverbStateFactory ReverbFactory{}; + return &ReverbFactory; +} + +EffectStateFactory *StdReverbStateFactory_getFactory() +{ + static StdReverbStateFactory ReverbFactory{}; + return &ReverbFactory; +} diff --git a/alc/effects/vmorpher.cpp b/alc/effects/vmorpher.cpp new file mode 100644 index 0000000..b1b7cc0 --- /dev/null +++ b/alc/effects/vmorpher.cpp @@ -0,0 +1,432 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2019 by Anis A. Hireche + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alcontext.h" +#include "alu.h" + +namespace { + +#define MAX_UPDATE_SAMPLES 128 +#define NUM_FORMANTS 4 +#define NUM_FILTERS 2 +#define Q_FACTOR 5.0f + +#define VOWEL_A_INDEX 0 +#define VOWEL_B_INDEX 1 + +#define WAVEFORM_FRACBITS 24 +#define WAVEFORM_FRACONE (1<::Tau() / WAVEFORM_FRACONE}; + return std::sin(static_cast(index) * scale)*0.5f + 0.5f; +} + +inline float Saw(ALuint index) +{ return static_cast(index) / float{WAVEFORM_FRACONE}; } + +inline float Triangle(ALuint index) +{ return std::fabs(static_cast(index)*(2.0f/WAVEFORM_FRACONE) - 1.0f); } + +inline float Half(ALuint) { return 0.5f; } + +template +void Oscillate(float *RESTRICT dst, ALuint index, const ALuint step, size_t todo) +{ + for(size_t i{0u};i < todo;i++) + { + index += step; + index &= WAVEFORM_FRACMASK; + dst[i] = func(index); + } +} + +struct FormantFilter +{ + ALfloat mCoeff{0.0f}; + ALfloat mGain{1.0f}; + ALfloat mS1{0.0f}; + ALfloat mS2{0.0f}; + + FormantFilter() = default; + FormantFilter(ALfloat f0norm, ALfloat gain) + : mCoeff{std::tan(al::MathDefs::Pi() * f0norm)}, mGain{gain} + { } + + inline void process(const ALfloat *samplesIn, ALfloat *samplesOut, const size_t numInput) + { + /* A state variable filter from a topology-preserving transform. + * Based on a talk given by Ivan Cohen: https://www.youtube.com/watch?v=esjHXGPyrhg + */ + const ALfloat g{mCoeff}; + const ALfloat gain{mGain}; + const ALfloat h{1.0f / (1.0f + (g/Q_FACTOR) + (g*g))}; + ALfloat s1{mS1}; + ALfloat s2{mS2}; + + for(size_t i{0u};i < numInput;i++) + { + const ALfloat H{(samplesIn[i] - (1.0f/Q_FACTOR + g)*s1 - s2)*h}; + const ALfloat B{g*H + s1}; + const ALfloat L{g*B + s2}; + + s1 = g*H + B; + s2 = g*B + L; + + // Apply peak and accumulate samples. + samplesOut[i] += B * gain; + } + mS1 = s1; + mS2 = s2; + } + + inline void clear() + { + mS1 = 0.0f; + mS2 = 0.0f; + } +}; + + +struct VmorpherState final : public EffectState { + struct { + /* Effect parameters */ + FormantFilter Formants[NUM_FILTERS][NUM_FORMANTS]; + + /* Effect gains for each channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]{}; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]{}; + } mChans[MAX_AMBI_CHANNELS]; + + void (*mGetSamples)(float*RESTRICT, ALuint, const ALuint, size_t){}; + + ALuint mIndex{0}; + ALuint mStep{1}; + + /* Effects buffers */ + ALfloat mSampleBufferA[MAX_UPDATE_SAMPLES]{}; + ALfloat mSampleBufferB[MAX_UPDATE_SAMPLES]{}; + + ALboolean deviceUpdate(const ALCdevice *device) override; + void update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) override; + void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) override; + + static std::array getFiltersByPhoneme(ALenum phoneme, ALfloat frequency, ALfloat pitch); + + DEF_NEWDEL(VmorpherState) +}; + +std::array VmorpherState::getFiltersByPhoneme(ALenum phoneme, ALfloat frequency, ALfloat pitch) +{ + /* Using soprano formant set of values to + * better match mid-range frequency space. + * + * See: https://www.classes.cs.uchicago.edu/archive/1999/spring/CS295/Computing_Resources/Csound/CsManual3.48b1.HTML/Appendices/table3.html + */ + switch(phoneme) + { + case AL_VOCAL_MORPHER_PHONEME_A: + return {{ + {( 800 * pitch) / frequency, 1.000000f}, /* std::pow(10.0f, 0 / 20.0f); */ + {(1150 * pitch) / frequency, 0.501187f}, /* std::pow(10.0f, -6 / 20.0f); */ + {(2900 * pitch) / frequency, 0.025118f}, /* std::pow(10.0f, -32 / 20.0f); */ + {(3900 * pitch) / frequency, 0.100000f} /* std::pow(10.0f, -20 / 20.0f); */ + }}; + case AL_VOCAL_MORPHER_PHONEME_E: + return {{ + {( 350 * pitch) / frequency, 1.000000f}, /* std::pow(10.0f, 0 / 20.0f); */ + {(2000 * pitch) / frequency, 0.100000f}, /* std::pow(10.0f, -20 / 20.0f); */ + {(2800 * pitch) / frequency, 0.177827f}, /* std::pow(10.0f, -15 / 20.0f); */ + {(3600 * pitch) / frequency, 0.009999f} /* std::pow(10.0f, -40 / 20.0f); */ + }}; + case AL_VOCAL_MORPHER_PHONEME_I: + return {{ + {( 270 * pitch) / frequency, 1.000000f}, /* std::pow(10.0f, 0 / 20.0f); */ + {(2140 * pitch) / frequency, 0.251188f}, /* std::pow(10.0f, -12 / 20.0f); */ + {(2950 * pitch) / frequency, 0.050118f}, /* std::pow(10.0f, -26 / 20.0f); */ + {(3900 * pitch) / frequency, 0.050118f} /* std::pow(10.0f, -26 / 20.0f); */ + }}; + case AL_VOCAL_MORPHER_PHONEME_O: + return {{ + {( 450 * pitch) / frequency, 1.000000f}, /* std::pow(10.0f, 0 / 20.0f); */ + {( 800 * pitch) / frequency, 0.281838f}, /* std::pow(10.0f, -11 / 20.0f); */ + {(2830 * pitch) / frequency, 0.079432f}, /* std::pow(10.0f, -22 / 20.0f); */ + {(3800 * pitch) / frequency, 0.079432f} /* std::pow(10.0f, -22 / 20.0f); */ + }}; + case AL_VOCAL_MORPHER_PHONEME_U: + return {{ + {( 325 * pitch) / frequency, 1.000000f}, /* std::pow(10.0f, 0 / 20.0f); */ + {( 700 * pitch) / frequency, 0.158489f}, /* std::pow(10.0f, -16 / 20.0f); */ + {(2700 * pitch) / frequency, 0.017782f}, /* std::pow(10.0f, -35 / 20.0f); */ + {(3800 * pitch) / frequency, 0.009999f} /* std::pow(10.0f, -40 / 20.0f); */ + }}; + } + return {}; +} + + +ALboolean VmorpherState::deviceUpdate(const ALCdevice* /*device*/) +{ + for(auto &e : mChans) + { + std::for_each(std::begin(e.Formants[VOWEL_A_INDEX]), std::end(e.Formants[VOWEL_A_INDEX]), + std::mem_fn(&FormantFilter::clear)); + std::for_each(std::begin(e.Formants[VOWEL_B_INDEX]), std::end(e.Formants[VOWEL_B_INDEX]), + std::mem_fn(&FormantFilter::clear)); + std::fill(std::begin(e.CurrentGains), std::end(e.CurrentGains), 0.0f); + } + + return AL_TRUE; +} + +void VmorpherState::update(const ALCcontext *context, const ALeffectslot *slot, const EffectProps *props, const EffectTarget target) +{ + const ALCdevice *device{context->mDevice.get()}; + const ALfloat frequency{static_cast(device->Frequency)}; + const ALfloat step{props->Vmorpher.Rate / frequency}; + mStep = fastf2u(clampf(step*WAVEFORM_FRACONE, 0.0f, ALfloat{WAVEFORM_FRACONE-1})); + + if(mStep == 0) + mGetSamples = Oscillate; + else if(props->Vmorpher.Waveform == AL_VOCAL_MORPHER_WAVEFORM_SINUSOID) + mGetSamples = Oscillate; + else if(props->Vmorpher.Waveform == AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH) + mGetSamples = Oscillate; + else /*if(props->Vmorpher.Waveform == AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE)*/ + mGetSamples = Oscillate; + + const ALfloat pitchA{std::pow(2.0f, + static_cast(props->Vmorpher.PhonemeACoarseTuning) / 12.0f)}; + const ALfloat pitchB{std::pow(2.0f, + static_cast(props->Vmorpher.PhonemeBCoarseTuning) / 12.0f)}; + + auto vowelA = getFiltersByPhoneme(props->Vmorpher.PhonemeA, frequency, pitchA); + auto vowelB = getFiltersByPhoneme(props->Vmorpher.PhonemeB, frequency, pitchB); + + /* Copy the filter coefficients to the input channels. */ + for(size_t i{0u};i < slot->Wet.Buffer.size();++i) + { + std::copy(vowelA.begin(), vowelA.end(), std::begin(mChans[i].Formants[VOWEL_A_INDEX])); + std::copy(vowelB.begin(), vowelB.end(), std::begin(mChans[i].Formants[VOWEL_B_INDEX])); + } + + mOutTarget = target.Main->Buffer; + for(size_t i{0u};i < slot->Wet.Buffer.size();++i) + { + auto coeffs = GetAmbiIdentityRow(i); + ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); + } +} + +void VmorpherState::process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) +{ + /* Following the EFX specification for a conformant implementation which describes + * the effect as a pair of 4-band formant filters blended together using an LFO. + */ + for(size_t base{0u};base < samplesToDo;) + { + alignas(16) ALfloat lfo[MAX_UPDATE_SAMPLES]; + const size_t td{minz(MAX_UPDATE_SAMPLES, samplesToDo-base)}; + + mGetSamples(lfo, mIndex, mStep, td); + mIndex += static_cast(mStep * td); + mIndex &= WAVEFORM_FRACMASK; + + auto chandata = std::addressof(mChans[0]); + for(const auto &input : samplesIn) + { + std::fill_n(std::begin(mSampleBufferA), td, 0.0f); + std::fill_n(std::begin(mSampleBufferB), td, 0.0f); + + auto& vowelA = chandata->Formants[VOWEL_A_INDEX]; + auto& vowelB = chandata->Formants[VOWEL_B_INDEX]; + + /* Process first vowel. */ + vowelA[0].process(&input[base], mSampleBufferA, td); + vowelA[1].process(&input[base], mSampleBufferA, td); + vowelA[2].process(&input[base], mSampleBufferA, td); + vowelA[3].process(&input[base], mSampleBufferA, td); + + /* Process second vowel. */ + vowelB[0].process(&input[base], mSampleBufferB, td); + vowelB[1].process(&input[base], mSampleBufferB, td); + vowelB[2].process(&input[base], mSampleBufferB, td); + vowelB[3].process(&input[base], mSampleBufferB, td); + + alignas(16) ALfloat blended[MAX_UPDATE_SAMPLES]; + for(size_t i{0u};i < td;i++) + blended[i] = lerp(mSampleBufferA[i], mSampleBufferB[i], lfo[i]); + + /* Now, mix the processed sound data to the output. */ + MixSamples({blended, td}, samplesOut, chandata->CurrentGains, chandata->TargetGains, + samplesToDo-base, base); + ++chandata; + } + + base += td; + } +} + + +void Vmorpher_setParami(EffectProps* props, ALCcontext *context, ALenum param, ALint val) +{ + switch(param) + { + case AL_VOCAL_MORPHER_WAVEFORM: + if(!(val >= AL_VOCAL_MORPHER_MIN_WAVEFORM && val <= AL_VOCAL_MORPHER_MAX_WAVEFORM)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Vocal morpher waveform out of range"); + props->Vmorpher.Waveform = val; + break; + + case AL_VOCAL_MORPHER_PHONEMEA: + if(!(val >= AL_VOCAL_MORPHER_MIN_PHONEMEA && val <= AL_VOCAL_MORPHER_MAX_PHONEMEA)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Vocal morpher phoneme-a out of range"); + props->Vmorpher.PhonemeA = val; + break; + + case AL_VOCAL_MORPHER_PHONEMEB: + if(!(val >= AL_VOCAL_MORPHER_MIN_PHONEMEB && val <= AL_VOCAL_MORPHER_MAX_PHONEMEB)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Vocal morpher phoneme-b out of range"); + props->Vmorpher.PhonemeB = val; + break; + + case AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING: + if(!(val >= AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING && val <= AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Vocal morpher phoneme-a coarse tuning out of range"); + props->Vmorpher.PhonemeACoarseTuning = val; + break; + + case AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING: + if(!(val >= AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING && val <= AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Vocal morpher phoneme-b coarse tuning out of range"); + props->Vmorpher.PhonemeBCoarseTuning = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid vocal morpher integer property 0x%04x", + param); + } +} +void Vmorpher_setParamiv(EffectProps*, ALCcontext *context, ALenum param, const ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid vocal morpher integer-vector property 0x%04x", param); } +void Vmorpher_setParamf(EffectProps *props, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_VOCAL_MORPHER_RATE: + if(!(val >= AL_VOCAL_MORPHER_MIN_RATE && val <= AL_VOCAL_MORPHER_MAX_RATE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Vocal morpher rate out of range"); + props->Vmorpher.Rate = val; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid vocal morpher float property 0x%04x", + param); + } +} +void Vmorpher_setParamfv(EffectProps *props, ALCcontext *context, ALenum param, const ALfloat *vals) +{ Vmorpher_setParamf(props, context, param, vals[0]); } + +void Vmorpher_getParami(const EffectProps* props, ALCcontext *context, ALenum param, ALint* val) +{ + switch(param) + { + case AL_VOCAL_MORPHER_PHONEMEA: + *val = props->Vmorpher.PhonemeA; + break; + + case AL_VOCAL_MORPHER_PHONEMEB: + *val = props->Vmorpher.PhonemeB; + break; + + case AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING: + *val = props->Vmorpher.PhonemeACoarseTuning; + break; + + case AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING: + *val = props->Vmorpher.PhonemeBCoarseTuning; + break; + + case AL_VOCAL_MORPHER_WAVEFORM: + *val = props->Vmorpher.Waveform; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid vocal morpher integer property 0x%04x", + param); + } +} +void Vmorpher_getParamiv(const EffectProps*, ALCcontext *context, ALenum param, ALint*) +{ context->setError(AL_INVALID_ENUM, "Invalid vocal morpher integer-vector property 0x%04x", param); } +void Vmorpher_getParamf(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_VOCAL_MORPHER_RATE: + *val = props->Vmorpher.Rate; + break; + + default: + context->setError(AL_INVALID_ENUM, "Invalid vocal morpher float property 0x%04x", + param); + } +} +void Vmorpher_getParamfv(const EffectProps *props, ALCcontext *context, ALenum param, ALfloat *vals) +{ Vmorpher_getParamf(props, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(Vmorpher); + + +struct VmorpherStateFactory final : public EffectStateFactory { + EffectState *create() override { return new VmorpherState{}; } + EffectProps getDefaultProps() const noexcept override; + const EffectVtable *getEffectVtable() const noexcept override { return &Vmorpher_vtable; } +}; + +EffectProps VmorpherStateFactory::getDefaultProps() const noexcept +{ + EffectProps props{}; + props.Vmorpher.Rate = AL_VOCAL_MORPHER_DEFAULT_RATE; + props.Vmorpher.PhonemeA = AL_VOCAL_MORPHER_DEFAULT_PHONEMEA; + props.Vmorpher.PhonemeB = AL_VOCAL_MORPHER_DEFAULT_PHONEMEB; + props.Vmorpher.PhonemeACoarseTuning = AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING; + props.Vmorpher.PhonemeBCoarseTuning = AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING; + props.Vmorpher.Waveform = AL_VOCAL_MORPHER_DEFAULT_WAVEFORM; + return props; +} + +} // namespace + +EffectStateFactory *VmorpherStateFactory_getFactory() +{ + static VmorpherStateFactory VmorpherFactory{}; + return &VmorpherFactory; +} diff --git a/Alc/filters/filter.c b/alc/filters/biquad.cpp similarity index 57% rename from Alc/filters/filter.c rename to alc/filters/biquad.cpp index 2b370f8..271ca69 100644 --- a/Alc/filters/filter.c +++ b/alc/filters/biquad.cpp @@ -1,39 +1,35 @@ #include "config.h" -#include "AL/alc.h" -#include "AL/al.h" +#include "biquad.h" -#include "alMain.h" -#include "defs.h" +#include +#include +#include -extern inline void BiquadFilter_clear(BiquadFilter *filter); -extern inline void BiquadFilter_copyParams(BiquadFilter *restrict dst, const BiquadFilter *restrict src); -extern inline void BiquadFilter_passthru(BiquadFilter *filter, ALsizei numsamples); -extern inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope); -extern inline ALfloat calc_rcpQ_from_bandwidth(ALfloat f0norm, ALfloat bandwidth); +#include "opthelpers.h" -void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, ALfloat f0norm, ALfloat rcpQ) +template +void BiquadFilterR::setParams(BiquadType type, Real f0norm, Real gain, Real rcpQ) { - ALfloat alpha, sqrtgain_alpha_2; - ALfloat w0, sin_w0, cos_w0; - ALfloat a[3] = { 1.0f, 0.0f, 0.0f }; - ALfloat b[3] = { 1.0f, 0.0f, 0.0f }; - // Limit gain to -100dB assert(gain > 0.00001f); - w0 = F_TAU * f0norm; - sin_w0 = sinf(w0); - cos_w0 = cosf(w0); - alpha = sin_w0/2.0f * rcpQ; + const Real w0{al::MathDefs::Tau() * f0norm}; + const Real sin_w0{std::sin(w0)}; + const Real cos_w0{std::cos(w0)}; + const Real alpha{sin_w0/2.0f * rcpQ}; + + Real sqrtgain_alpha_2; + Real a[3]{ 1.0f, 0.0f, 0.0f }; + Real b[3]{ 1.0f, 0.0f, 0.0f }; /* Calculate filter coefficients depending on filter type */ switch(type) { - case BiquadType_HighShelf: - sqrtgain_alpha_2 = 2.0f * sqrtf(gain) * alpha; + case BiquadType::HighShelf: + sqrtgain_alpha_2 = 2.0f * std::sqrt(gain) * alpha; b[0] = gain*((gain+1.0f) + (gain-1.0f)*cos_w0 + sqrtgain_alpha_2); b[1] = -2.0f*gain*((gain-1.0f) + (gain+1.0f)*cos_w0 ); b[2] = gain*((gain+1.0f) + (gain-1.0f)*cos_w0 - sqrtgain_alpha_2); @@ -41,8 +37,8 @@ void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, a[1] = 2.0f* ((gain-1.0f) - (gain+1.0f)*cos_w0 ); a[2] = (gain+1.0f) - (gain-1.0f)*cos_w0 - sqrtgain_alpha_2; break; - case BiquadType_LowShelf: - sqrtgain_alpha_2 = 2.0f * sqrtf(gain) * alpha; + case BiquadType::LowShelf: + sqrtgain_alpha_2 = 2.0f * std::sqrt(gain) * alpha; b[0] = gain*((gain+1.0f) - (gain-1.0f)*cos_w0 + sqrtgain_alpha_2); b[1] = 2.0f*gain*((gain-1.0f) - (gain+1.0f)*cos_w0 ); b[2] = gain*((gain+1.0f) - (gain-1.0f)*cos_w0 - sqrtgain_alpha_2); @@ -50,8 +46,7 @@ void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, a[1] = -2.0f* ((gain-1.0f) + (gain+1.0f)*cos_w0 ); a[2] = (gain+1.0f) + (gain-1.0f)*cos_w0 - sqrtgain_alpha_2; break; - case BiquadType_Peaking: - gain = sqrtf(gain); + case BiquadType::Peaking: b[0] = 1.0f + alpha * gain; b[1] = -2.0f * cos_w0; b[2] = 1.0f - alpha * gain; @@ -60,7 +55,7 @@ void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, a[2] = 1.0f - alpha / gain; break; - case BiquadType_LowPass: + case BiquadType::LowPass: b[0] = (1.0f - cos_w0) / 2.0f; b[1] = 1.0f - cos_w0; b[2] = (1.0f - cos_w0) / 2.0f; @@ -68,7 +63,7 @@ void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, a[1] = -2.0f * cos_w0; a[2] = 1.0f - alpha; break; - case BiquadType_HighPass: + case BiquadType::HighPass: b[0] = (1.0f + cos_w0) / 2.0f; b[1] = -(1.0f + cos_w0); b[2] = (1.0f + cos_w0) / 2.0f; @@ -76,9 +71,9 @@ void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, a[1] = -2.0f * cos_w0; a[2] = 1.0f - alpha; break; - case BiquadType_BandPass: + case BiquadType::BandPass: b[0] = alpha; - b[1] = 0; + b[1] = 0.0f; b[2] = -alpha; a[0] = 1.0f + alpha; a[1] = -2.0f * cos_w0; @@ -86,26 +81,23 @@ void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, break; } - filter->a1 = a[1] / a[0]; - filter->a2 = a[2] / a[0]; - filter->b0 = b[0] / a[0]; - filter->b1 = b[1] / a[0]; - filter->b2 = b[2] / a[0]; + mA1 = a[1] / a[0]; + mA2 = a[2] / a[0]; + mB0 = b[0] / a[0]; + mB1 = b[1] / a[0]; + mB2 = b[2] / a[0]; } - -void BiquadFilter_processC(BiquadFilter *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples) +template +void BiquadFilterR::process(const al::span src, Real *dst) { - const ALfloat a1 = filter->a1; - const ALfloat a2 = filter->a2; - const ALfloat b0 = filter->b0; - const ALfloat b1 = filter->b1; - const ALfloat b2 = filter->b2; - ALfloat z1 = filter->z1; - ALfloat z2 = filter->z2; - ALsizei i; - - ASSUME(numsamples > 0); + const Real b0{mB0}; + const Real b1{mB1}; + const Real b2{mB2}; + const Real a1{mA1}; + const Real a2{mA2}; + Real z1{mZ1}; + Real z2{mZ2}; /* Processing loop is Transposed Direct Form II. This requires less storage * compared to Direct Form I (only two delay components, instead of a four- @@ -115,15 +107,18 @@ void BiquadFilter_processC(BiquadFilter *filter, ALfloat *restrict dst, const AL * * See: http://www.earlevel.com/main/2003/02/28/biquads/ */ - for(i = 0;i < numsamples;i++) + auto proc_sample = [b0,b1,b2,a1,a2,&z1,&z2](Real input) noexcept -> Real { - ALfloat input = src[i]; - ALfloat output = input*b0 + z1; + const Real output{input*b0 + z1}; z1 = input*b1 - output*a1 + z2; z2 = input*b2 - output*a2; - dst[i] = output; - } + return output; + }; + std::transform(src.cbegin(), src.cend(), dst, proc_sample); - filter->z1 = z1; - filter->z2 = z2; + mZ1 = z1; + mZ2 = z2; } + +template class BiquadFilterR; +template class BiquadFilterR; diff --git a/alc/filters/biquad.h b/alc/filters/biquad.h new file mode 100644 index 0000000..30eed57 --- /dev/null +++ b/alc/filters/biquad.h @@ -0,0 +1,134 @@ +#ifndef FILTERS_BIQUAD_H +#define FILTERS_BIQUAD_H + +#include +#include +#include +#include + +#include "alspan.h" +#include "math_defs.h" + + +/* Filters implementation is based on the "Cookbook formulae for audio + * EQ biquad filter coefficients" by Robert Bristow-Johnson + * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt + */ +/* Implementation note: For the shelf and peaking filters, the specified gain + * is for the centerpoint of the transition band. This better fits EFX filter + * behavior, which expects the shelf's reference frequency to reach the given + * gain. To set the gain for the shelf or peak itself, use the square root of + * the desired linear gain (or halve the dB gain). + */ + +enum class BiquadType { + /** EFX-style low-pass filter, specifying a gain and reference frequency. */ + HighShelf, + /** EFX-style high-pass filter, specifying a gain and reference frequency. */ + LowShelf, + /** Peaking filter, specifying a gain and reference frequency. */ + Peaking, + + /** Low-pass cut-off filter, specifying a cut-off frequency. */ + LowPass, + /** High-pass cut-off filter, specifying a cut-off frequency. */ + HighPass, + /** Band-pass filter, specifying a center frequency. */ + BandPass, +}; + +template +class BiquadFilterR { + /* Last two delayed components for direct form II. */ + Real mZ1{0.0f}, mZ2{0.0f}; + /* Transfer function coefficients "b" (numerator) */ + Real mB0{1.0f}, mB1{0.0f}, mB2{0.0f}; + /* Transfer function coefficients "a" (denominator; a0 is pre-applied). */ + Real mA1{0.0f}, mA2{0.0f}; + + void setParams(BiquadType type, Real f0norm, Real gain, Real rcpQ); + + /** + * Calculates the rcpQ (i.e. 1/Q) coefficient for shelving filters, using + * the reference gain and shelf slope parameter. + * \param gain 0 < gain + * \param slope 0 < slope <= 1 + */ + static Real rcpQFromSlope(Real gain, Real slope) + { return std::sqrt((gain + 1.0f/gain)*(1.0f/slope - 1.0f) + 2.0f); } + + /** + * Calculates the rcpQ (i.e. 1/Q) coefficient for filters, using the + * normalized reference frequency and bandwidth. + * \param f0norm 0 < f0norm < 0.5. + * \param bandwidth 0 < bandwidth + */ + static Real rcpQFromBandwidth(Real f0norm, Real bandwidth) + { + const Real w0{al::MathDefs::Tau() * f0norm}; + return 2.0f*std::sinh(std::log(Real{2.0f})/2.0f*bandwidth*w0/std::sin(w0)); + } + +public: + void clear() noexcept { mZ1 = mZ2 = 0.0f; } + + /** + * Sets the filter state for the specified filter type and its parameters. + * + * \param type The type of filter to apply. + * \param f0norm The normalized reference frequency (ref / sample_rate). + * This is the center point for the Shelf, Peaking, and BandPass filter + * types, or the cutoff frequency for the LowPass and HighPass filter + * types. + * \param gain The gain for the reference frequency response. Only used by + * the Shelf and Peaking filter types. + * \param slope Slope steepness of the transition band. + */ + void setParamsFromSlope(BiquadType type, Real f0norm, Real gain, Real slope) + { + gain = std::max(gain, 0.001f); /* Limit -60dB */ + setParams(type, f0norm, gain, rcpQFromSlope(gain, slope)); + } + + /** + * Sets the filter state for the specified filter type and its parameters. + * + * \param type The type of filter to apply. + * \param f0norm The normalized reference frequency (ref / sample_rate). + * This is the center point for the Shelf, Peaking, and BandPass filter + * types, or the cutoff frequency for the LowPass and HighPass filter + * types. + * \param gain The gain for the reference frequency response. Only used by + * the Shelf and Peaking filter types. + * \param bandwidth Normalized bandwidth of the transition band. + */ + void setParamsFromBandwidth(BiquadType type, Real f0norm, Real gain, Real bandwidth) + { setParams(type, f0norm, gain, rcpQFromBandwidth(f0norm, bandwidth)); } + + void copyParamsFrom(const BiquadFilterR &other) + { + mB0 = other.mB0; + mB1 = other.mB1; + mB2 = other.mB2; + mA1 = other.mA1; + mA2 = other.mA2; + } + + + void process(const al::span src, Real *dst); + + /* Rather hacky. It's just here to support "manual" processing. */ + std::pair getComponents() const noexcept { return {mZ1, mZ2}; } + void setComponents(Real z1, Real z2) noexcept { mZ1 = z1; mZ2 = z2; } + Real processOne(const Real in, Real &z1, Real &z2) const noexcept + { + const Real out{in*mB0 + z1}; + z1 = in*mB1 - out*mA1 + z2; + z2 = in*mB2 - out*mA2; + return out; + } +}; + +using BiquadFilter = BiquadFilterR; + +#endif /* FILTERS_BIQUAD_H */ diff --git a/alc/filters/nfc.cpp b/alc/filters/nfc.cpp new file mode 100644 index 0000000..9a28517 --- /dev/null +++ b/alc/filters/nfc.cpp @@ -0,0 +1,383 @@ + +#include "config.h" + +#include "nfc.h" + +#include + +#include "opthelpers.h" + + +/* Near-field control filters are the basis for handling the near-field effect. + * The near-field effect is a bass-boost present in the directional components + * of a recorded signal, created as a result of the wavefront curvature (itself + * a function of sound distance). Proper reproduction dictates this be + * compensated for using a bass-cut given the playback speaker distance, to + * avoid excessive bass in the playback. + * + * For real-time rendered audio, emulating the near-field effect based on the + * sound source's distance, and subsequently compensating for it at output + * based on the speaker distances, can create a more realistic perception of + * sound distance beyond a simple 1/r attenuation. + * + * These filters do just that. Each one applies a low-shelf filter, created as + * the combination of a bass-boost for a given sound source distance (near- + * field emulation) along with a bass-cut for a given control/speaker distance + * (near-field compensation). + * + * Note that it is necessary to apply a cut along with the boost, since the + * boost alone is unstable in higher-order ambisonics as it causes an infinite + * DC gain (even first-order ambisonics requires there to be no DC offset for + * the boost to work). Consequently, ambisonics requires a control parameter to + * be used to avoid an unstable boost-only filter. NFC-HOA defines this control + * as a reference delay, calculated with: + * + * reference_delay = control_distance / speed_of_sound + * + * This means w0 (for input) or w1 (for output) should be set to: + * + * wN = 1 / (reference_delay * sample_rate) + * + * when dealing with NFC-HOA content. For FOA input content, which does not + * specify a reference_delay variable, w0 should be set to 0 to apply only + * near-field compensation for output. It's important that w1 be a finite, + * positive, non-0 value or else the bass-boost will become unstable again. + * Also, w0 should not be too large compared to w1, to avoid excessively loud + * low frequencies. + */ + +namespace { + +constexpr float B[5][4] = { + { 0.0f }, + { 1.0f }, + { 3.0f, 3.0f }, + { 3.6778f, 6.4595f, 2.3222f }, + { 4.2076f, 11.4877f, 5.7924f, 9.1401f } +}; + +NfcFilter1 NfcFilterCreate1(const float w0, const float w1) noexcept +{ + NfcFilter1 nfc{}; + float b_00, g_0; + float r; + + nfc.base_gain = 1.0f; + nfc.gain = 1.0f; + + /* Calculate bass-boost coefficients. */ + r = 0.5f * w0; + b_00 = B[1][0] * r; + g_0 = 1.0f + b_00; + + nfc.gain *= g_0; + nfc.b1 = 2.0f * b_00 / g_0; + + /* Calculate bass-cut coefficients. */ + r = 0.5f * w1; + b_00 = B[1][0] * r; + g_0 = 1.0f + b_00; + + nfc.base_gain /= g_0; + nfc.gain /= g_0; + nfc.a1 = 2.0f * b_00 / g_0; + + return nfc; +} + +void NfcFilterAdjust1(NfcFilter1 *nfc, const float w0) noexcept +{ + const float r{0.5f * w0}; + const float b_00{B[1][0] * r}; + const float g_0{1.0f + b_00}; + + nfc->gain = nfc->base_gain * g_0; + nfc->b1 = 2.0f * b_00 / g_0; +} + + +NfcFilter2 NfcFilterCreate2(const float w0, const float w1) noexcept +{ + NfcFilter2 nfc{}; + float b_10, b_11, g_1; + float r; + + nfc.base_gain = 1.0f; + nfc.gain = 1.0f; + + /* Calculate bass-boost coefficients. */ + r = 0.5f * w0; + b_10 = B[2][0] * r; + b_11 = B[2][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc.gain *= g_1; + nfc.b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc.b2 = 4.0f * b_11 / g_1; + + /* Calculate bass-cut coefficients. */ + r = 0.5f * w1; + b_10 = B[2][0] * r; + b_11 = B[2][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc.base_gain /= g_1; + nfc.gain /= g_1; + nfc.a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc.a2 = 4.0f * b_11 / g_1; + + return nfc; +} + +void NfcFilterAdjust2(NfcFilter2 *nfc, const float w0) noexcept +{ + const float r{0.5f * w0}; + const float b_10{B[2][0] * r}; + const float b_11{B[2][1] * r * r}; + const float g_1{1.0f + b_10 + b_11}; + + nfc->gain = nfc->base_gain * g_1; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; +} + + +NfcFilter3 NfcFilterCreate3(const float w0, const float w1) noexcept +{ + NfcFilter3 nfc{}; + float b_10, b_11, g_1; + float b_00, g_0; + float r; + + nfc.base_gain = 1.0f; + nfc.gain = 1.0f; + + /* Calculate bass-boost coefficients. */ + r = 0.5f * w0; + b_10 = B[3][0] * r; + b_11 = B[3][1] * r * r; + b_00 = B[3][2] * r; + g_1 = 1.0f + b_10 + b_11; + g_0 = 1.0f + b_00; + + nfc.gain *= g_1 * g_0; + nfc.b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc.b2 = 4.0f * b_11 / g_1; + nfc.b3 = 2.0f * b_00 / g_0; + + /* Calculate bass-cut coefficients. */ + r = 0.5f * w1; + b_10 = B[3][0] * r; + b_11 = B[3][1] * r * r; + b_00 = B[3][2] * r; + g_1 = 1.0f + b_10 + b_11; + g_0 = 1.0f + b_00; + + nfc.base_gain /= g_1 * g_0; + nfc.gain /= g_1 * g_0; + nfc.a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc.a2 = 4.0f * b_11 / g_1; + nfc.a3 = 2.0f * b_00 / g_0; + + return nfc; +} + +void NfcFilterAdjust3(NfcFilter3 *nfc, const float w0) noexcept +{ + const float r{0.5f * w0}; + const float b_10{B[3][0] * r}; + const float b_11{B[3][1] * r * r}; + const float b_00{B[3][2] * r}; + const float g_1{1.0f + b_10 + b_11}; + const float g_0{1.0f + b_00}; + + nfc->gain = nfc->base_gain * g_1 * g_0; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; + nfc->b3 = 2.0f * b_00 / g_0; +} + + +NfcFilter4 NfcFilterCreate4(const float w0, const float w1) noexcept +{ + NfcFilter4 nfc{}; + float b_10, b_11, g_1; + float b_00, b_01, g_0; + float r; + + nfc.base_gain = 1.0f; + nfc.gain = 1.0f; + + /* Calculate bass-boost coefficients. */ + r = 0.5f * w0; + b_10 = B[4][0] * r; + b_11 = B[4][1] * r * r; + b_00 = B[4][2] * r; + b_01 = B[4][3] * r * r; + g_1 = 1.0f + b_10 + b_11; + g_0 = 1.0f + b_00 + b_01; + + nfc.gain *= g_1 * g_0; + nfc.b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc.b2 = 4.0f * b_11 / g_1; + nfc.b3 = (2.0f*b_00 + 4.0f*b_01) / g_0; + nfc.b4 = 4.0f * b_01 / g_0; + + /* Calculate bass-cut coefficients. */ + r = 0.5f * w1; + b_10 = B[4][0] * r; + b_11 = B[4][1] * r * r; + b_00 = B[4][2] * r; + b_01 = B[4][3] * r * r; + g_1 = 1.0f + b_10 + b_11; + g_0 = 1.0f + b_00 + b_01; + + nfc.base_gain /= g_1 * g_0; + nfc.gain /= g_1 * g_0; + nfc.a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc.a2 = 4.0f * b_11 / g_1; + nfc.a3 = (2.0f*b_00 + 4.0f*b_01) / g_0; + nfc.a4 = 4.0f * b_01 / g_0; + + return nfc; +} + +void NfcFilterAdjust4(NfcFilter4 *nfc, const float w0) noexcept +{ + const float r{0.5f * w0}; + const float b_10{B[4][0] * r}; + const float b_11{B[4][1] * r * r}; + const float b_00{B[4][2] * r}; + const float b_01{B[4][3] * r * r}; + const float g_1{1.0f + b_10 + b_11}; + const float g_0{1.0f + b_00 + b_01}; + + nfc->gain = nfc->base_gain * g_1 * g_0; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; + nfc->b3 = (2.0f*b_00 + 4.0f*b_01) / g_0; + nfc->b4 = 4.0f * b_01 / g_0; +} + +} // namespace + +void NfcFilter::init(const float w1) noexcept +{ + first = NfcFilterCreate1(0.0f, w1); + second = NfcFilterCreate2(0.0f, w1); + third = NfcFilterCreate3(0.0f, w1); + fourth = NfcFilterCreate4(0.0f, w1); +} + +void NfcFilter::adjust(const float w0) noexcept +{ + NfcFilterAdjust1(&first, w0); + NfcFilterAdjust2(&second, w0); + NfcFilterAdjust3(&third, w0); + NfcFilterAdjust4(&fourth, w0); +} + + +void NfcFilter::process1(const al::span src, float *RESTRICT dst) +{ + const float gain{first.gain}; + const float b1{first.b1}; + const float a1{first.a1}; + float z1{first.z[0]}; + auto proc_sample = [gain,b1,a1,&z1](const float in) noexcept -> float + { + const float y{in*gain - a1*z1}; + const float out{y + b1*z1}; + z1 += y; + return out; + }; + std::transform(src.cbegin(), src.cend(), dst, proc_sample); + first.z[0] = z1; +} + +void NfcFilter::process2(const al::span src, float *RESTRICT dst) +{ + const float gain{second.gain}; + const float b1{second.b1}; + const float b2{second.b2}; + const float a1{second.a1}; + const float a2{second.a2}; + float z1{second.z[0]}; + float z2{second.z[1]}; + auto proc_sample = [gain,b1,b2,a1,a2,&z1,&z2](const float in) noexcept -> float + { + const float y{in*gain - a1*z1 - a2*z2}; + const float out{y + b1*z1 + b2*z2}; + z2 += z1; + z1 += y; + return out; + }; + std::transform(src.cbegin(), src.cend(), dst, proc_sample); + second.z[0] = z1; + second.z[1] = z2; +} + +void NfcFilter::process3(const al::span src, float *RESTRICT dst) +{ + const float gain{third.gain}; + const float b1{third.b1}; + const float b2{third.b2}; + const float b3{third.b3}; + const float a1{third.a1}; + const float a2{third.a2}; + const float a3{third.a3}; + float z1{third.z[0]}; + float z2{third.z[1]}; + float z3{third.z[2]}; + auto proc_sample = [gain,b1,b2,b3,a1,a2,a3,&z1,&z2,&z3](const float in) noexcept -> float + { + float y{in*gain - a1*z1 - a2*z2}; + float out{y + b1*z1 + b2*z2}; + z2 += z1; + z1 += y; + + y = out - a3*z3; + out = y + b3*z3; + z3 += y; + return out; + }; + std::transform(src.cbegin(), src.cend(), dst, proc_sample); + third.z[0] = z1; + third.z[1] = z2; + third.z[2] = z3; +} + +void NfcFilter::process4(const al::span src, float *RESTRICT dst) +{ + const float gain{fourth.gain}; + const float b1{fourth.b1}; + const float b2{fourth.b2}; + const float b3{fourth.b3}; + const float b4{fourth.b4}; + const float a1{fourth.a1}; + const float a2{fourth.a2}; + const float a3{fourth.a3}; + const float a4{fourth.a4}; + float z1{fourth.z[0]}; + float z2{fourth.z[1]}; + float z3{fourth.z[2]}; + float z4{fourth.z[3]}; + auto proc_sample = [gain,b1,b2,b3,b4,a1,a2,a3,a4,&z1,&z2,&z3,&z4](const float in) noexcept -> float + { + float y{in*gain - a1*z1 - a2*z2}; + float out{y + b1*z1 + b2*z2}; + z2 += z1; + z1 += y; + + y = out - a3*z3 - a4*z4; + out = y + b3*z3 + b4*z4; + z4 += z3; + z3 += y; + return out; + }; + std::transform(src.cbegin(), src.cend(), dst, proc_sample); + fourth.z[0] = z1; + fourth.z[1] = z2; + fourth.z[2] = z3; + fourth.z[3] = z4; +} diff --git a/alc/filters/nfc.h b/alc/filters/nfc.h new file mode 100644 index 0000000..2327c96 --- /dev/null +++ b/alc/filters/nfc.h @@ -0,0 +1,63 @@ +#ifndef FILTER_NFC_H +#define FILTER_NFC_H + +#include + +#include "alspan.h" + + +struct NfcFilter1 { + float base_gain, gain; + float b1, a1; + float z[1]; +}; +struct NfcFilter2 { + float base_gain, gain; + float b1, b2, a1, a2; + float z[2]; +}; +struct NfcFilter3 { + float base_gain, gain; + float b1, b2, b3, a1, a2, a3; + float z[3]; +}; +struct NfcFilter4 { + float base_gain, gain; + float b1, b2, b3, b4, a1, a2, a3, a4; + float z[4]; +}; + +class NfcFilter { + NfcFilter1 first; + NfcFilter2 second; + NfcFilter3 third; + NfcFilter4 fourth; + +public: + /* NOTE: + * w0 = speed_of_sound / (source_distance * sample_rate); + * w1 = speed_of_sound / (control_distance * sample_rate); + * + * Generally speaking, the control distance should be approximately the + * average speaker distance, or based on the reference delay if outputing + * NFC-HOA. It must not be negative, 0, or infinite. The source distance + * should not be too small relative to the control distance. + */ + + void init(const float w1) noexcept; + void adjust(const float w0) noexcept; + + /* Near-field control filter for first-order ambisonic channels (1-3). */ + void process1(const al::span src, float *RESTRICT dst); + + /* Near-field control filter for second-order ambisonic channels (4-8). */ + void process2(const al::span src, float *RESTRICT dst); + + /* Near-field control filter for third-order ambisonic channels (9-15). */ + void process3(const al::span src, float *RESTRICT dst); + + /* Near-field control filter for fourth-order ambisonic channels (16-24). */ + void process4(const al::span src, float *RESTRICT dst); +}; + +#endif /* FILTER_NFC_H */ diff --git a/alc/filters/splitter.cpp b/alc/filters/splitter.cpp new file mode 100644 index 0000000..e8e0180 --- /dev/null +++ b/alc/filters/splitter.cpp @@ -0,0 +1,113 @@ + +#include "config.h" + +#include "splitter.h" + +#include +#include +#include + +#include "math_defs.h" +#include "opthelpers.h" + + +template +void BandSplitterR::init(Real f0norm) +{ + const Real w{f0norm * al::MathDefs::Tau()}; + const Real cw{std::cos(w)}; + if(cw > std::numeric_limits::epsilon()) + mCoeff = (std::sin(w) - 1.0f) / cw; + else + mCoeff = cw * -0.5f; + + mLpZ1 = 0.0f; + mLpZ2 = 0.0f; + mApZ1 = 0.0f; +} + +template +void BandSplitterR::process(const al::span input, Real *hpout, Real *lpout) +{ + const Real ap_coeff{mCoeff}; + const Real lp_coeff{mCoeff*0.5f + 0.5f}; + Real lp_z1{mLpZ1}; + Real lp_z2{mLpZ2}; + Real ap_z1{mApZ1}; + auto proc_sample = [ap_coeff,lp_coeff,&lp_z1,&lp_z2,&ap_z1,&lpout](const Real in) noexcept -> Real + { + /* Low-pass sample processing. */ + Real d{(in - lp_z1) * lp_coeff}; + Real lp_y{lp_z1 + d}; + lp_z1 = lp_y + d; + + d = (lp_y - lp_z2) * lp_coeff; + lp_y = lp_z2 + d; + lp_z2 = lp_y + d; + + *(lpout++) = lp_y; + + /* All-pass sample processing. */ + Real ap_y{in*ap_coeff + ap_z1}; + ap_z1 = in - ap_y*ap_coeff; + + /* High-pass generated from removing low-passed output. */ + return ap_y - lp_y; + }; + std::transform(input.cbegin(), input.cend(), hpout, proc_sample); + mLpZ1 = lp_z1; + mLpZ2 = lp_z2; + mApZ1 = ap_z1; +} + +template +void BandSplitterR::applyHfScale(const al::span samples, const Real hfscale) +{ + const Real ap_coeff{mCoeff}; + const Real lp_coeff{mCoeff*0.5f + 0.5f}; + Real lp_z1{mLpZ1}; + Real lp_z2{mLpZ2}; + Real ap_z1{mApZ1}; + auto proc_sample = [hfscale,ap_coeff,lp_coeff,&lp_z1,&lp_z2,&ap_z1](const Real in) noexcept -> Real + { + /* Low-pass sample processing. */ + Real d{(in - lp_z1) * lp_coeff}; + Real lp_y{lp_z1 + d}; + lp_z1 = lp_y + d; + + d = (lp_y - lp_z2) * lp_coeff; + lp_y = lp_z2 + d; + lp_z2 = lp_y + d; + + /* All-pass sample processing. */ + Real ap_y{in*ap_coeff + ap_z1}; + ap_z1 = in - ap_y*ap_coeff; + + /* High-pass generated by removing the low-passed signal, which is then + * scaled and added back to the low-passed signal. + */ + return (ap_y-lp_y)*hfscale + lp_y; + }; + std::transform(samples.begin(), samples.end(), samples.begin(), proc_sample); + mLpZ1 = lp_z1; + mLpZ2 = lp_z2; + mApZ1 = ap_z1; +} + +template +void BandSplitterR::applyAllpass(const al::span samples) const +{ + const Real coeff{mCoeff}; + Real z1{0.0f}; + auto proc_sample = [coeff,&z1](const Real in) noexcept -> Real + { + const Real out{in*coeff + z1}; + z1 = in - out*coeff; + return out; + }; + std::transform(samples.begin(), samples.end(), samples.begin(), proc_sample); +} + + +template class BandSplitterR; +template class BandSplitterR; diff --git a/alc/filters/splitter.h b/alc/filters/splitter.h new file mode 100644 index 0000000..d88ef18 --- /dev/null +++ b/alc/filters/splitter.h @@ -0,0 +1,36 @@ +#ifndef FILTER_SPLITTER_H +#define FILTER_SPLITTER_H + +#include + +#include "alspan.h" + + +/* Band splitter. Splits a signal into two phase-matching frequency bands. */ +template +class BandSplitterR { + Real mCoeff{0.0f}; + Real mLpZ1{0.0f}; + Real mLpZ2{0.0f}; + Real mApZ1{0.0f}; + +public: + BandSplitterR() = default; + BandSplitterR(const BandSplitterR&) = default; + BandSplitterR(Real f0norm) { init(f0norm); } + + void init(Real f0norm); + void clear() noexcept { mLpZ1 = mLpZ2 = mApZ1 = 0.0f; } + void process(const al::span input, Real *hpout, Real *lpout); + + void applyHfScale(const al::span samples, const Real hfscale); + + /* The all-pass portion of the band splitter. Applies the same phase shift + * without splitting the signal. Note that each use of this method is + * indepedent, it does not track history between calls. + */ + void applyAllpass(const al::span samples) const; +}; +using BandSplitter = BandSplitterR; + +#endif /* FILTER_SPLITTER_H */ diff --git a/alc/fpu_modes.h b/alc/fpu_modes.h new file mode 100644 index 0000000..5465e9c --- /dev/null +++ b/alc/fpu_modes.h @@ -0,0 +1,25 @@ +#ifndef FPU_MODES_H +#define FPU_MODES_H + +class FPUCtl { +#if defined(HAVE_SSE_INTRINSICS) || (defined(__GNUC__) && defined(HAVE_SSE)) + unsigned int sse_state{}; +#endif + bool in_mode{}; + +public: + FPUCtl(); + /* HACK: 32-bit targets for GCC seem to have a problem here with certain + * noexcept methods (which destructors are) causing an internal compiler + * error. No idea why it's these methods specifically, but this is needed + * to get it to compile. + */ + ~FPUCtl() noexcept(false) { leave(); } + + FPUCtl(const FPUCtl&) = delete; + FPUCtl& operator=(const FPUCtl&) = delete; + + void leave(); +}; + +#endif /* FPU_MODES_H */ diff --git a/alc/helpers.cpp b/alc/helpers.cpp new file mode 100644 index 0000000..4ea94c7 --- /dev/null +++ b/alc/helpers.cpp @@ -0,0 +1,649 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2011 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#ifdef _WIN32 +#ifdef __MINGW32__ +#define _WIN32_IE 0x501 +#else +#define _WIN32_IE 0x400 +#endif +#endif + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_INTRIN_H +#include +#endif +#ifdef HAVE_CPUID_H +#include +#endif +#ifdef HAVE_SSE_INTRINSICS +#include +#endif +#ifdef HAVE_SYS_SYSCONF_H +#include +#endif + +#ifdef HAVE_PROC_PIDPATH +#include +#endif + +#ifdef __FreeBSD__ +#include +#include +#endif + +#ifndef _WIN32 +#include +#elif defined(_WIN32_IE) +#include +#endif + +#include "alcmain.h" +#include "almalloc.h" +#include "alfstream.h" +#include "alspan.h" +#include "alstring.h" +#include "compat.h" +#include "cpu_caps.h" +#include "fpu_modes.h" +#include "logging.h" +#include "strutils.h" +#include "vector.h" + + +#if defined(HAVE_GCC_GET_CPUID) && (defined(__i386__) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64)) +using reg_type = unsigned int; +static inline void get_cpuid(unsigned int f, reg_type *regs) +{ __get_cpuid(f, ®s[0], ®s[1], ®s[2], ®s[3]); } +#define CAN_GET_CPUID +#elif defined(HAVE_CPUID_INTRINSIC) && (defined(__i386__) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64)) +using reg_type = int; +static inline void get_cpuid(unsigned int f, reg_type *regs) +{ (__cpuid)(regs, f); } +#define CAN_GET_CPUID +#endif + +int CPUCapFlags = 0; + +void FillCPUCaps(int capfilter) +{ + int caps = 0; + +/* FIXME: We really should get this for all available CPUs in case different + * CPUs have different caps (is that possible on one machine?). */ +#ifdef CAN_GET_CPUID + union { + reg_type regs[4]; + char str[sizeof(reg_type[4])]; + } cpuinf[3]{}; + + get_cpuid(0, cpuinf[0].regs); + if(cpuinf[0].regs[0] == 0) + ERR("Failed to get CPUID\n"); + else + { + unsigned int maxfunc = cpuinf[0].regs[0]; + unsigned int maxextfunc; + + get_cpuid(0x80000000, cpuinf[0].regs); + maxextfunc = cpuinf[0].regs[0]; + + TRACE("Detected max CPUID function: 0x%x (ext. 0x%x)\n", maxfunc, maxextfunc); + + TRACE("Vendor ID: \"%.4s%.4s%.4s\"\n", cpuinf[0].str+4, cpuinf[0].str+12, cpuinf[0].str+8); + if(maxextfunc >= 0x80000004) + { + get_cpuid(0x80000002, cpuinf[0].regs); + get_cpuid(0x80000003, cpuinf[1].regs); + get_cpuid(0x80000004, cpuinf[2].regs); + TRACE("Name: \"%.16s%.16s%.16s\"\n", cpuinf[0].str, cpuinf[1].str, cpuinf[2].str); + } + + if(maxfunc >= 1) + { + get_cpuid(1, cpuinf[0].regs); + if((cpuinf[0].regs[3]&(1<<25))) + caps |= CPU_CAP_SSE; + if((caps&CPU_CAP_SSE) && (cpuinf[0].regs[3]&(1<<26))) + caps |= CPU_CAP_SSE2; + if((caps&CPU_CAP_SSE2) && (cpuinf[0].regs[2]&(1<<0))) + caps |= CPU_CAP_SSE3; + if((caps&CPU_CAP_SSE3) && (cpuinf[0].regs[2]&(1<<19))) + caps |= CPU_CAP_SSE4_1; + } + } +#else + /* Assume support for whatever's supported if we can't check for it */ +#if defined(HAVE_SSE4_1) +#warning "Assuming SSE 4.1 run-time support!" + caps |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3 | CPU_CAP_SSE4_1; +#elif defined(HAVE_SSE3) +#warning "Assuming SSE 3 run-time support!" + caps |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3; +#elif defined(HAVE_SSE2) +#warning "Assuming SSE 2 run-time support!" + caps |= CPU_CAP_SSE | CPU_CAP_SSE2; +#elif defined(HAVE_SSE) +#warning "Assuming SSE run-time support!" + caps |= CPU_CAP_SSE; +#endif +#endif +#ifdef HAVE_NEON + al::ifstream file{"/proc/cpuinfo"}; + if(!file.is_open()) + ERR("Failed to open /proc/cpuinfo, cannot check for NEON support\n"); + else + { + std::string features; + + auto getline = [](std::istream &f, std::string &output) -> bool + { + while(f.good() && f.peek() == '\n') + f.ignore(); + return std::getline(f, output) && !output.empty(); + + }; + while(getline(file, features)) + { + if(features.compare(0, 10, "Features\t:", 10) == 0) + break; + } + file.close(); + + size_t extpos{9}; + while((extpos=features.find("neon", extpos+1)) != std::string::npos) + { + if((extpos == 0 || std::isspace(features[extpos-1])) && + (extpos+4 == features.length() || std::isspace(features[extpos+4]))) + { + caps |= CPU_CAP_NEON; + break; + } + } + } +#endif + + TRACE("Extensions:%s%s%s%s%s%s\n", + ((capfilter&CPU_CAP_SSE) ? ((caps&CPU_CAP_SSE) ? " +SSE" : " -SSE") : ""), + ((capfilter&CPU_CAP_SSE2) ? ((caps&CPU_CAP_SSE2) ? " +SSE2" : " -SSE2") : ""), + ((capfilter&CPU_CAP_SSE3) ? ((caps&CPU_CAP_SSE3) ? " +SSE3" : " -SSE3") : ""), + ((capfilter&CPU_CAP_SSE4_1) ? ((caps&CPU_CAP_SSE4_1) ? " +SSE4.1" : " -SSE4.1") : ""), + ((capfilter&CPU_CAP_NEON) ? ((caps&CPU_CAP_NEON) ? " +NEON" : " -NEON") : ""), + ((!capfilter) ? " -none-" : "") + ); + CPUCapFlags = caps & capfilter; +} + + +FPUCtl::FPUCtl() +{ +#if defined(HAVE_SSE_INTRINSICS) + this->sse_state = _mm_getcsr(); + unsigned int sseState = this->sse_state; + sseState |= 0x8000; /* set flush-to-zero */ + sseState |= 0x0040; /* set denormals-are-zero */ + _mm_setcsr(sseState); + +#elif defined(__GNUC__) && defined(HAVE_SSE) + + if((CPUCapFlags&CPU_CAP_SSE)) + { + __asm__ __volatile__("stmxcsr %0" : "=m" (*&this->sse_state)); + unsigned int sseState = this->sse_state; + sseState |= 0x8000; /* set flush-to-zero */ + if((CPUCapFlags&CPU_CAP_SSE2)) + sseState |= 0x0040; /* set denormals-are-zero */ + __asm__ __volatile__("ldmxcsr %0" : : "m" (*&sseState)); + } +#endif + + this->in_mode = true; +} + +void FPUCtl::leave() +{ + if(!this->in_mode) return; + +#if defined(HAVE_SSE_INTRINSICS) + _mm_setcsr(this->sse_state); + +#elif defined(__GNUC__) && defined(HAVE_SSE) + + if((CPUCapFlags&CPU_CAP_SSE)) + __asm__ __volatile__("ldmxcsr %0" : : "m" (*&this->sse_state)); +#endif + this->in_mode = false; +} + + +#ifdef _WIN32 + +const PathNamePair &GetProcBinary() +{ + static PathNamePair ret; + if(!ret.fname.empty() || !ret.path.empty()) + return ret; + + al::vector fullpath(256); + DWORD len; + while((len=GetModuleFileNameW(nullptr, fullpath.data(), static_cast(fullpath.size()))) == fullpath.size()) + fullpath.resize(fullpath.size() << 1); + if(len == 0) + { + ERR("Failed to get process name: error %lu\n", GetLastError()); + return ret; + } + + fullpath.resize(len); + if(fullpath.back() != 0) + fullpath.push_back(0); + + auto sep = std::find(fullpath.rbegin()+1, fullpath.rend(), '\\'); + sep = std::find(fullpath.rbegin()+1, sep, '/'); + if(sep != fullpath.rend()) + { + *sep = 0; + ret.fname = wstr_to_utf8(&*sep + 1); + ret.path = wstr_to_utf8(fullpath.data()); + } + else + ret.fname = wstr_to_utf8(fullpath.data()); + + TRACE("Got binary: %s, %s\n", ret.path.c_str(), ret.fname.c_str()); + return ret; +} + + +void al_print(FILE *logfile, const char *fmt, ...) +{ + al::vector dynmsg; + char stcmsg[256]; + char *str{stcmsg}; + + va_list args, args2; + va_start(args, fmt); + va_copy(args2, args); + int msglen{std::vsnprintf(str, sizeof(stcmsg), fmt, args)}; + if UNLIKELY(msglen >= 0 && static_cast(msglen) >= sizeof(stcmsg)) + { + dynmsg.resize(static_cast(msglen) + 1u); + str = dynmsg.data(); + msglen = std::vsnprintf(str, dynmsg.size(), fmt, args2); + } + va_end(args2); + va_end(args); + + std::wstring wstr{utf8_to_wstr(str)}; + fputws(wstr.c_str(), logfile); + fflush(logfile); +} + + +static inline int is_slash(int c) +{ return (c == '\\' || c == '/'); } + +static void DirectorySearch(const char *path, const char *ext, al::vector *const results) +{ + std::string pathstr{path}; + pathstr += "\\*"; + pathstr += ext; + TRACE("Searching %s\n", pathstr.c_str()); + + std::wstring wpath{utf8_to_wstr(pathstr.c_str())}; + WIN32_FIND_DATAW fdata; + HANDLE hdl{FindFirstFileW(wpath.c_str(), &fdata)}; + if(hdl == INVALID_HANDLE_VALUE) return; + + const auto base = results->size(); + + do { + results->emplace_back(); + std::string &str = results->back(); + str = path; + str += '\\'; + str += wstr_to_utf8(fdata.cFileName); + } while(FindNextFileW(hdl, &fdata)); + FindClose(hdl); + + const al::span newlist{results->data()+base, results->size()-base}; + std::sort(newlist.begin(), newlist.end()); + for(const auto &name : newlist) + TRACE(" got %s\n", name.c_str()); +} + +al::vector SearchDataFiles(const char *ext, const char *subdir) +{ + static std::mutex search_lock; + std::lock_guard _{search_lock}; + + /* If the path is absolute, use it directly. */ + al::vector results; + if(isalpha(subdir[0]) && subdir[1] == ':' && is_slash(subdir[2])) + { + std::string path{subdir}; + std::replace(path.begin(), path.end(), '/', '\\'); + DirectorySearch(path.c_str(), ext, &results); + return results; + } + if(subdir[0] == '\\' && subdir[1] == '\\' && subdir[2] == '?' && subdir[3] == '\\') + { + DirectorySearch(subdir, ext, &results); + return results; + } + + std::string path; + + /* Search the app-local directory. */ + if(auto localpath = al::getenv(L"ALSOFT_LOCAL_PATH")) + { + path = wstr_to_utf8(localpath->c_str()); + if(is_slash(path.back())) + path.pop_back(); + } + else if(WCHAR *cwdbuf{_wgetcwd(nullptr, 0)}) + { + path = wstr_to_utf8(cwdbuf); + if(is_slash(path.back())) + path.pop_back(); + free(cwdbuf); + } + else + path = "."; + std::replace(path.begin(), path.end(), '/', '\\'); + DirectorySearch(path.c_str(), ext, &results); + + /* Search the local and global data dirs. */ + static const int ids[2]{ CSIDL_APPDATA, CSIDL_COMMON_APPDATA }; + for(int id : ids) + { + WCHAR buffer[MAX_PATH]; + if(SHGetSpecialFolderPathW(nullptr, buffer, id, FALSE) == FALSE) + continue; + + path = wstr_to_utf8(buffer); + if(!is_slash(path.back())) + path += '\\'; + path += subdir; + std::replace(path.begin(), path.end(), '/', '\\'); + + DirectorySearch(path.c_str(), ext, &results); + } + + return results; +} + +void SetRTPriority(void) +{ + bool failed = false; + if(RTPrioLevel > 0) + failed = !SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); + if(failed) ERR("Failed to set priority level for thread\n"); +} + +#else + +#if defined(HAVE_PTHREAD_SETSCHEDPARAM) && !defined(__OpenBSD__) +#include +#include +#endif + +const PathNamePair &GetProcBinary() +{ + static PathNamePair ret; + if(!ret.fname.empty() || !ret.path.empty()) + return ret; + + al::vector pathname; +#ifdef __FreeBSD__ + size_t pathlen; + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + if(sysctl(mib, 4, nullptr, &pathlen, nullptr, 0) == -1) + WARN("Failed to sysctl kern.proc.pathname: %s\n", strerror(errno)); + else + { + pathname.resize(pathlen + 1); + sysctl(mib, 4, pathname.data(), &pathlen, nullptr, 0); + pathname.resize(pathlen); + } +#endif +#ifdef HAVE_PROC_PIDPATH + if(pathname.empty()) + { + char procpath[PROC_PIDPATHINFO_MAXSIZE]{}; + const pid_t pid{getpid()}; + if(proc_pidpath(pid, procpath, sizeof(procpath)) < 1) + ERR("proc_pidpath(%d, ...) failed: %s\n", pid, strerror(errno)); + else + pathname.insert(pathname.end(), procpath, procpath+strlen(procpath)); + } +#endif + if(pathname.empty()) + { + pathname.resize(256); + + const char *selfname{"/proc/self/exe"}; + ssize_t len{readlink(selfname, pathname.data(), pathname.size())}; + if(len == -1 && errno == ENOENT) + { + selfname = "/proc/self/file"; + len = readlink(selfname, pathname.data(), pathname.size()); + } + if(len == -1 && errno == ENOENT) + { + selfname = "/proc/curproc/exe"; + len = readlink(selfname, pathname.data(), pathname.size()); + } + if(len == -1 && errno == ENOENT) + { + selfname = "/proc/curproc/file"; + len = readlink(selfname, pathname.data(), pathname.size()); + } + + while(len > 0 && static_cast(len) == pathname.size()) + { + pathname.resize(pathname.size() << 1); + len = readlink(selfname, pathname.data(), pathname.size()); + } + if(len <= 0) + { + WARN("Failed to readlink %s: %s\n", selfname, strerror(errno)); + return ret; + } + + pathname.resize(static_cast(len)); + } + while(!pathname.empty() && pathname.back() == 0) + pathname.pop_back(); + + auto sep = std::find(pathname.crbegin(), pathname.crend(), '/'); + if(sep != pathname.crend()) + { + ret.path = std::string(pathname.cbegin(), sep.base()-1); + ret.fname = std::string(sep.base(), pathname.cend()); + } + else + ret.fname = std::string(pathname.cbegin(), pathname.cend()); + + TRACE("Got binary: %s, %s\n", ret.path.c_str(), ret.fname.c_str()); + return ret; +} + + +void al_print(FILE *logfile, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(logfile, fmt, ap); + va_end(ap); + + fflush(logfile); +} + + +static void DirectorySearch(const char *path, const char *ext, al::vector *const results) +{ + TRACE("Searching %s for *%s\n", path, ext); + DIR *dir{opendir(path)}; + if(!dir) return; + + const auto base = results->size(); + const size_t extlen{strlen(ext)}; + + struct dirent *dirent; + while((dirent=readdir(dir)) != nullptr) + { + if(strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) + continue; + + const size_t len{strlen(dirent->d_name)}; + if(len <= extlen) continue; + if(al::strcasecmp(dirent->d_name+len-extlen, ext) != 0) + continue; + + results->emplace_back(); + std::string &str = results->back(); + str = path; + if(str.back() != '/') + str.push_back('/'); + str += dirent->d_name; + } + closedir(dir); + + const al::span newlist{results->data()+base, results->size()-base}; + std::sort(newlist.begin(), newlist.end()); + for(const auto &name : newlist) + TRACE(" got %s\n", name.c_str()); +} + +al::vector SearchDataFiles(const char *ext, const char *subdir) +{ + static std::mutex search_lock; + std::lock_guard _{search_lock}; + + al::vector results; + if(subdir[0] == '/') + { + DirectorySearch(subdir, ext, &results); + return results; + } + + /* Search the app-local directory. */ + if(auto localpath = al::getenv("ALSOFT_LOCAL_PATH")) + DirectorySearch(localpath->c_str(), ext, &results); + else + { + al::vector cwdbuf(256); + while(!getcwd(cwdbuf.data(), cwdbuf.size())) + { + if(errno != ERANGE) + { + cwdbuf.clear(); + break; + } + cwdbuf.resize(cwdbuf.size() << 1); + } + if(cwdbuf.empty()) + DirectorySearch(".", ext, &results); + else + { + DirectorySearch(cwdbuf.data(), ext, &results); + cwdbuf.clear(); + } + } + + // Search local data dir + if(auto datapath = al::getenv("XDG_DATA_HOME")) + { + std::string &path = *datapath; + if(path.back() != '/') + path += '/'; + path += subdir; + DirectorySearch(path.c_str(), ext, &results); + } + else if(auto homepath = al::getenv("HOME")) + { + std::string &path = *homepath; + if(path.back() == '/') + path.pop_back(); + path += "/.local/share/"; + path += subdir; + DirectorySearch(path.c_str(), ext, &results); + } + + // Search global data dirs + std::string datadirs{al::getenv("XDG_DATA_DIRS").value_or("/usr/local/share/:/usr/share/")}; + + size_t curpos{0u}; + while(curpos < datadirs.size()) + { + size_t nextpos{datadirs.find(':', curpos)}; + + std::string path{(nextpos != std::string::npos) ? + datadirs.substr(curpos, nextpos++ - curpos) : datadirs.substr(curpos)}; + curpos = nextpos; + + if(path.empty()) continue; + if(path.back() != '/') + path += '/'; + path += subdir; + + DirectorySearch(path.c_str(), ext, &results); + } + + return results; +} + +void SetRTPriority() +{ + bool failed = false; +#if defined(HAVE_PTHREAD_SETSCHEDPARAM) && !defined(__OpenBSD__) + if(RTPrioLevel > 0) + { + struct sched_param param; + /* Use the minimum real-time priority possible for now (on Linux this + * should be 1 for SCHED_RR) */ + param.sched_priority = sched_get_priority_min(SCHED_RR); + failed = !!pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); + } +#else + /* Real-time priority not available */ + failed = (RTPrioLevel>0); +#endif + if(failed) + ERR("Failed to set priority level for thread\n"); +} + +#endif diff --git a/alc/hrtf.cpp b/alc/hrtf.cpp new file mode 100644 index 0000000..0b6eb43 --- /dev/null +++ b/alc/hrtf.cpp @@ -0,0 +1,1373 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2011 by Chris Robinson + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "hrtf.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" + +#include "alcmain.h" +#include "alconfig.h" +#include "alfstream.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alspan.h" +#include "filters/splitter.h" +#include "logging.h" +#include "math_defs.h" +#include "opthelpers.h" +#include "polyphase_resampler.h" + + +namespace { + +using namespace std::placeholders; + +struct HrtfEntry { + std::string mDispName; + std::string mFilename; +}; + +struct LoadedHrtf { + std::string mFilename; + std::unique_ptr mEntry; +}; + +/* Data set limits must be the same as or more flexible than those defined in + * the makemhr utility. + */ +#define MIN_FD_COUNT (1) +#define MAX_FD_COUNT (16) + +#define MIN_FD_DISTANCE (50) +#define MAX_FD_DISTANCE (2500) + +#define MIN_EV_COUNT (5) +#define MAX_EV_COUNT (181) + +#define MIN_AZ_COUNT (1) +#define MAX_AZ_COUNT (255) + +#define MAX_HRIR_DELAY (HRTF_HISTORY_LENGTH-1) + +#define HRIR_DELAY_FRACBITS 2 +#define HRIR_DELAY_FRACONE (1<>1) + +static_assert(MAX_HRIR_DELAY*HRIR_DELAY_FRACONE < 256, "MAX_HRIR_DELAY or DELAY_FRAC too large"); + +constexpr ALchar magicMarker00[8]{'M','i','n','P','H','R','0','0'}; +constexpr ALchar magicMarker01[8]{'M','i','n','P','H','R','0','1'}; +constexpr ALchar magicMarker02[8]{'M','i','n','P','H','R','0','2'}; + +/* First value for pass-through coefficients (remaining are 0), used for omni- + * directional sounds. */ +constexpr ALfloat PassthruCoeff{0.707106781187f/*sqrt(0.5)*/}; + +std::mutex LoadedHrtfLock; +al::vector LoadedHrtfs; + +std::mutex EnumeratedHrtfLock; +al::vector EnumeratedHrtfs; + + +class databuf final : public std::streambuf { + int_type underflow() override + { return traits_type::eof(); } + + pos_type seekoff(off_type offset, std::ios_base::seekdir whence, std::ios_base::openmode mode) override + { + if((mode&std::ios_base::out) || !(mode&std::ios_base::in)) + return traits_type::eof(); + + char_type *cur; + switch(whence) + { + case std::ios_base::beg: + if(offset < 0 || offset > egptr()-eback()) + return traits_type::eof(); + cur = eback() + offset; + break; + + case std::ios_base::cur: + if((offset >= 0 && offset > egptr()-gptr()) || + (offset < 0 && -offset > gptr()-eback())) + return traits_type::eof(); + cur = gptr() + offset; + break; + + case std::ios_base::end: + if(offset > 0 || -offset > egptr()-eback()) + return traits_type::eof(); + cur = egptr() + offset; + break; + + default: + return traits_type::eof(); + } + + setg(eback(), cur, egptr()); + return cur - eback(); + } + + pos_type seekpos(pos_type pos, std::ios_base::openmode mode) override + { + // Simplified version of seekoff + if((mode&std::ios_base::out) || !(mode&std::ios_base::in)) + return traits_type::eof(); + + if(pos < 0 || pos > egptr()-eback()) + return traits_type::eof(); + + setg(eback(), eback() + static_cast(pos), egptr()); + return pos; + } + +public: + databuf(const char_type *start_, const char_type *end_) noexcept + { + setg(const_cast(start_), const_cast(start_), + const_cast(end_)); + } +}; + +class idstream final : public std::istream { + databuf mStreamBuf; + +public: + idstream(const char *start_, const char *end_) + : std::istream{nullptr}, mStreamBuf{start_, end_} + { init(&mStreamBuf); } +}; + + +struct IdxBlend { ALuint idx; float blend; }; +/* Calculate the elevation index given the polar elevation in radians. This + * will return an index between 0 and (evcount - 1). + */ +IdxBlend CalcEvIndex(ALuint evcount, float ev) +{ + ev = (al::MathDefs::Pi()*0.5f + ev) * static_cast(evcount-1) / + al::MathDefs::Pi(); + ALuint idx{float2uint(ev)}; + + return IdxBlend{minu(idx, evcount-1), ev-static_cast(idx)}; +} + +/* Calculate the azimuth index given the polar azimuth in radians. This will + * return an index between 0 and (azcount - 1). + */ +IdxBlend CalcAzIndex(ALuint azcount, float az) +{ + az = (al::MathDefs::Tau()+az) * static_cast(azcount) / + al::MathDefs::Tau(); + ALuint idx{float2uint(az)}; + + return IdxBlend{idx%azcount, az-static_cast(idx)}; +} + +} // namespace + + +/* Calculates static HRIR coefficients and delays for the given polar elevation + * and azimuth in radians. The coefficients are normalized. + */ +void GetHrtfCoeffs(const HrtfStore *Hrtf, float elevation, float azimuth, float distance, + float spread, HrirArray &coeffs, ALuint (&delays)[2]) +{ + const float dirfact{1.0f - (spread / al::MathDefs::Tau())}; + + const auto *field = Hrtf->field; + const auto *field_end = field + Hrtf->fdCount-1; + size_t ebase{0}; + while(distance < field->distance && field != field_end) + { + ebase += field->evCount; + ++field; + } + + /* Claculate the elevation indinces. */ + const auto elev0 = CalcEvIndex(field->evCount, elevation); + const size_t elev1_idx{minu(elev0.idx+1, field->evCount-1)}; + const size_t ir0offset{Hrtf->elev[ebase + elev0.idx].irOffset}; + const size_t ir1offset{Hrtf->elev[ebase + elev1_idx].irOffset}; + + /* Calculate azimuth indices. */ + const auto az0 = CalcAzIndex(Hrtf->elev[ebase + elev0.idx].azCount, azimuth); + const auto az1 = CalcAzIndex(Hrtf->elev[ebase + elev1_idx].azCount, azimuth); + + /* Calculate the HRIR indices to blend. */ + const size_t idx[4]{ + ir0offset + az0.idx, + ir0offset + ((az0.idx+1) % Hrtf->elev[ebase + elev0.idx].azCount), + ir1offset + az1.idx, + ir1offset + ((az1.idx+1) % Hrtf->elev[ebase + elev1_idx].azCount) + }; + + /* Calculate bilinear blending weights, attenuated according to the + * directional panning factor. + */ + const float blend[4]{ + (1.0f-elev0.blend) * (1.0f-az0.blend) * dirfact, + (1.0f-elev0.blend) * ( az0.blend) * dirfact, + ( elev0.blend) * (1.0f-az1.blend) * dirfact, + ( elev0.blend) * ( az1.blend) * dirfact + }; + + /* Calculate the blended HRIR delays. */ + float d{Hrtf->delays[idx[0]][0]*blend[0] + Hrtf->delays[idx[1]][0]*blend[1] + + Hrtf->delays[idx[2]][0]*blend[2] + Hrtf->delays[idx[3]][0]*blend[3]}; + delays[0] = fastf2u(d * float{1.0f/HRIR_DELAY_FRACONE}); + d = Hrtf->delays[idx[0]][1]*blend[0] + Hrtf->delays[idx[1]][1]*blend[1] + + Hrtf->delays[idx[2]][1]*blend[2] + Hrtf->delays[idx[3]][1]*blend[3]; + delays[1] = fastf2u(d * float{1.0f/HRIR_DELAY_FRACONE}); + + /* Calculate the blended HRIR coefficients. */ + float *coeffout{al::assume_aligned<16>(&coeffs[0][0])}; + coeffout[0] = PassthruCoeff * (1.0f-dirfact); + coeffout[1] = PassthruCoeff * (1.0f-dirfact); + std::fill_n(coeffout+2, size_t{HRIR_LENGTH-1}*2, 0.0f); + for(size_t c{0};c < 4;c++) + { + const float *srccoeffs{al::assume_aligned<16>(Hrtf->coeffs[idx[c]][0].data())}; + const float mult{blend[c]}; + auto blend_coeffs = [mult](const float src, const float coeff) noexcept -> float + { return src*mult + coeff; }; + std::transform(srccoeffs, srccoeffs + HRIR_LENGTH*2, coeffout, coeffout, blend_coeffs); + } +} + + +std::unique_ptr DirectHrtfState::Create(size_t num_chans) +{ + return std::unique_ptr{new (FamCount{num_chans}) DirectHrtfState{num_chans}}; +} + +void BuildBFormatHrtf(const HrtfStore *Hrtf, DirectHrtfState *state, + const al::span AmbiPoints, const float (*AmbiMatrix)[MAX_AMBI_CHANNELS], + const al::span AmbiOrderHFGain) +{ + using double2 = std::array; + struct ImpulseResponse { + const HrirArray &hrir; + ALuint ldelay, rdelay; + }; + + /* Set this to true for dual-band HRTF processing. May require better + * calculation of the new IR length to deal with the head and tail + * generated by the HF scaling. + */ + static constexpr bool DualBand{true}; + + ALuint min_delay{HRTF_HISTORY_LENGTH*HRIR_DELAY_FRACONE}; + ALuint max_delay{0}; + al::vector impres; impres.reserve(AmbiPoints.size()); + auto calc_res = [Hrtf,&max_delay,&min_delay](const AngularPoint &pt) -> ImpulseResponse + { + auto CalcClosestEvIndex = [](ALuint evcount, float ev) -> ALuint + { + ev = (al::MathDefs::Pi()*0.5f + ev) * static_cast(evcount-1) / + al::MathDefs::Pi(); + return minu(float2uint(ev+0.5f), evcount-1); + }; + auto CalcClosestAzIndex = [](ALuint azcount, float az) -> ALuint + { + az = (al::MathDefs::Tau()+az) * static_cast(azcount) / + al::MathDefs::Tau(); + return float2uint(az+0.5f) % azcount; + }; + + auto &field = Hrtf->field[0]; + const size_t elevIdx{CalcClosestEvIndex(field.evCount, pt.Elev.value)}; + const size_t azIdx{CalcClosestAzIndex(Hrtf->elev[elevIdx].azCount, pt.Azim.value)}; + const size_t irOffset{Hrtf->elev[elevIdx].irOffset + azIdx}; + + ImpulseResponse res{Hrtf->coeffs[irOffset], + Hrtf->delays[irOffset][0], Hrtf->delays[irOffset][1]}; + + min_delay = minu(min_delay, minu(res.ldelay, res.rdelay)); + max_delay = maxu(max_delay, maxu(res.ldelay, res.rdelay)); + + return res; + }; + std::transform(AmbiPoints.begin(), AmbiPoints.end(), std::back_inserter(impres), calc_res); + auto hrir_delay_round = [](const ALuint d) noexcept -> ALuint + { return (d+HRIR_DELAY_FRACHALF) >> HRIR_DELAY_FRACBITS; }; + + /* For dual-band processing, add a 16-sample delay to compensate for the HF + * scale on the minimum-phase response. + */ + static constexpr ALuint base_delay{DualBand ? 16 : 0}; + const double xover_norm{400.0 / Hrtf->sampleRate}; + BandSplitterR splitter{xover_norm}; + + auto tmpres = al::vector>(state->Coeffs.size()); + auto tmpflt = al::vector>(3); + const al::span tempir{tmpflt[2].data(), tmpflt[2].size()}; + for(size_t c{0u};c < AmbiPoints.size();++c) + { + const HrirArray &hrir{impres[c].hrir}; + const ALuint ldelay{hrir_delay_round(impres[c].ldelay-min_delay) + base_delay}; + const ALuint rdelay{hrir_delay_round(impres[c].rdelay-min_delay) + base_delay}; + + if /*constexpr*/(!DualBand) + { + /* For single-band decoding, apply the HF scale to the response. */ + for(size_t i{0u};i < state->Coeffs.size();++i) + { + const size_t order{AmbiIndex::OrderFromChannel[i]}; + const double mult{double{AmbiOrderHFGain[order]} * AmbiMatrix[c][i]}; + const ALuint numirs{HRIR_LENGTH - maxu(ldelay, rdelay)}; + ALuint lidx{ldelay}, ridx{rdelay}; + for(ALuint j{0};j < numirs;++j) + { + tmpres[i][lidx++][0] += hrir[j][0] * mult; + tmpres[i][ridx++][1] += hrir[j][1] * mult; + } + } + continue; + } + + /* For dual-band processing, the HRIR needs to be split into low and + * high frequency responses. The band-splitter alone creates frequency- + * dependent phase-shifts, which is not ideal. To counteract it, + * combine it with a backwards phase-shift. + */ + + /* Load the (left) HRIR backwards, into a temp buffer with padding. */ + std::fill(tempir.begin(), tempir.end(), 0.0); + std::transform(hrir.crbegin(), hrir.crend(), tempir.begin(), + [](const float2 &ir) noexcept -> double { return ir[0]; }); + + /* Apply the all-pass on the reversed signal and reverse the resulting + * sample array. This produces the forward response with a backwards + * phase-shift (+n degrees becomes -n degrees). + */ + splitter.applyAllpass({tempir.data(), tempir.size()}); + std::reverse(tempir.begin(), tempir.end()); + + /* Now apply the band-splitter. This applies the normal phase-shift, + * which cancels out with the backwards phase-shift to get the original + * phase on the split signal. + */ + splitter.clear(); + splitter.process(tempir, tmpflt[0].data(), tmpflt[1].data()); + + /* Apply left ear response with delay and HF scale. */ + for(size_t i{0u};i < state->Coeffs.size();++i) + { + const double mult{AmbiMatrix[c][i]}; + const double hfgain{AmbiOrderHFGain[AmbiIndex::OrderFromChannel[i]]}; + size_t j{tmpflt[0].size()-HRIR_LENGTH - ldelay}; + for(size_t lidx{0};lidx < HRIR_LENGTH;++lidx,++j) + tmpres[i][lidx][0] += (tmpflt[0][j]*hfgain + tmpflt[1][j]) * mult; + } + + /* Now run the same process on the right HRIR. */ + std::fill(tempir.begin(), tempir.end(), 0.0); + std::transform(hrir.crbegin(), hrir.crend(), tempir.begin(), + [](const float2 &ir) noexcept -> double { return ir[1]; }); + + splitter.applyAllpass({tempir.data(), tempir.size()}); + std::reverse(tempir.begin(), tempir.end()); + + splitter.clear(); + splitter.process(tempir, tmpflt[0].data(), tmpflt[1].data()); + + for(size_t i{0u};i < state->Coeffs.size();++i) + { + const double mult{AmbiMatrix[c][i]}; + const double hfgain{AmbiOrderHFGain[AmbiIndex::OrderFromChannel[i]]}; + size_t j{tmpflt[0].size()-HRIR_LENGTH - rdelay}; + for(size_t ridx{0};ridx < HRIR_LENGTH;++ridx,++j) + tmpres[i][ridx][1] += (tmpflt[0][j]*hfgain + tmpflt[1][j]) * mult; + } + } + tmpflt.clear(); + impres.clear(); + + for(size_t i{0u};i < state->Coeffs.size();++i) + { + auto copy_arr = [](const double2 &in) noexcept -> float2 + { return float2{{static_cast(in[0]), static_cast(in[1])}}; }; + std::transform(tmpres[i].cbegin(), tmpres[i].cend(), state->Coeffs[i].begin(), + copy_arr); + } + tmpres.clear(); + + max_delay -= min_delay; + /* Increase the IR size by double the base delay with dual-band processing + * to account for the head and tail from the HF response scale. + */ + const ALuint irsize{minu(Hrtf->irSize + base_delay*2, HRIR_LENGTH)}; + const ALuint max_length{minu(hrir_delay_round(max_delay) + irsize, HRIR_LENGTH)}; + + TRACE("Skipped delay: %.2f, max delay: %.2f, new FIR length: %u\n", + min_delay/double{HRIR_DELAY_FRACONE}, max_delay/double{HRIR_DELAY_FRACONE}, + max_length); + state->IrSize = max_length; +} + + +namespace { + +std::unique_ptr CreateHrtfStore(ALuint rate, ALushort irSize, + const al::span fields, + const al::span elevs, const HrirArray *coeffs, + const ubyte2 *delays, const char *filename) +{ + std::unique_ptr Hrtf; + + const size_t irCount{size_t{elevs.back().azCount} + elevs.back().irOffset}; + size_t total{sizeof(HrtfStore)}; + total = RoundUp(total, alignof(HrtfStore::Field)); /* Align for field infos */ + total += sizeof(HrtfStore::Field)*fields.size(); + total = RoundUp(total, alignof(HrtfStore::Elevation)); /* Align for elevation infos */ + total += sizeof(Hrtf->elev[0])*elevs.size(); + total = RoundUp(total, 16); /* Align for coefficients using SIMD */ + total += sizeof(Hrtf->coeffs[0])*irCount; + total += sizeof(Hrtf->delays[0])*irCount; + + Hrtf.reset(new (al_calloc(16, total)) HrtfStore{}); + if(!Hrtf) + ERR("Out of memory allocating storage for %s.\n", filename); + else + { + InitRef(Hrtf->mRef, 1u); + Hrtf->sampleRate = rate; + Hrtf->irSize = irSize; + Hrtf->fdCount = static_cast(fields.size()); + + /* Set up pointers to storage following the main HRTF struct. */ + char *base = reinterpret_cast(Hrtf.get()); + uintptr_t offset = sizeof(HrtfStore); + + offset = RoundUp(offset, alignof(HrtfStore::Field)); /* Align for field infos */ + auto field_ = reinterpret_cast(base + offset); + offset += sizeof(field_[0])*fields.size(); + + offset = RoundUp(offset, alignof(HrtfStore::Elevation)); /* Align for elevation infos */ + auto elev_ = reinterpret_cast(base + offset); + offset += sizeof(elev_[0])*elevs.size(); + + offset = RoundUp(offset, 16); /* Align for coefficients using SIMD */ + auto coeffs_ = reinterpret_cast(base + offset); + offset += sizeof(coeffs_[0])*irCount; + + auto delays_ = reinterpret_cast(base + offset); + offset += sizeof(delays_[0])*irCount; + + assert(offset == total); + + /* Copy input data to storage. */ + std::copy(fields.cbegin(), fields.cend(), field_); + std::copy(elevs.cbegin(), elevs.cend(), elev_); + std::copy_n(coeffs, irCount, coeffs_); + std::copy_n(delays, irCount, delays_); + + /* Finally, assign the storage pointers. */ + Hrtf->field = field_; + Hrtf->elev = elev_; + Hrtf->coeffs = coeffs_; + Hrtf->delays = delays_; + } + + return Hrtf; +} + +void MirrorLeftHrirs(const al::span elevs, HrirArray *coeffs, + ubyte2 *delays) +{ + for(const auto &elev : elevs) + { + const ALushort evoffset{elev.irOffset}; + const ALushort azcount{elev.azCount}; + for(size_t j{0};j < azcount;j++) + { + const size_t lidx{evoffset + j}; + const size_t ridx{evoffset + ((azcount-j) % azcount)}; + + const size_t irSize{coeffs[ridx].size()}; + for(size_t k{0};k < irSize;k++) + coeffs[ridx][k][1] = coeffs[lidx][k][0]; + delays[ridx][1] = delays[lidx][0]; + } + } +} + +ALubyte GetLE_ALubyte(std::istream &data) +{ + return static_cast(data.get()); +} + +ALshort GetLE_ALshort(std::istream &data) +{ + int ret = data.get(); + ret |= data.get() << 8; + return static_cast((ret^32768) - 32768); +} + +ALushort GetLE_ALushort(std::istream &data) +{ + int ret = data.get(); + ret |= data.get() << 8; + return static_cast(ret); +} + +ALint GetLE_ALint24(std::istream &data) +{ + int ret = data.get(); + ret |= data.get() << 8; + ret |= data.get() << 16; + return (ret^8388608) - 8388608; +} + +ALuint GetLE_ALuint(std::istream &data) +{ + int ret = data.get(); + ret |= data.get() << 8; + ret |= data.get() << 16; + ret |= data.get() << 24; + return static_cast(ret); +} + +std::unique_ptr LoadHrtf00(std::istream &data, const char *filename) +{ + ALuint rate{GetLE_ALuint(data)}; + ALushort irCount{GetLE_ALushort(data)}; + ALushort irSize{GetLE_ALushort(data)}; + ALubyte evCount{GetLE_ALubyte(data)}; + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + + if(irSize < MIN_IR_LENGTH || irSize > HRIR_LENGTH) + { + ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MIN_IR_LENGTH, HRIR_LENGTH); + return nullptr; + } + if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) + { + ERR("Unsupported elevation count: evCount=%d (%d to %d)\n", + evCount, MIN_EV_COUNT, MAX_EV_COUNT); + return nullptr; + } + + auto elevs = al::vector(evCount); + for(auto &elev : elevs) + elev.irOffset = GetLE_ALushort(data); + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + for(size_t i{1};i < evCount;i++) + { + if(elevs[i].irOffset <= elevs[i-1].irOffset) + { + ERR("Invalid evOffset: evOffset[%zu]=%d (last=%d)\n", i, elevs[i].irOffset, + elevs[i-1].irOffset); + return nullptr; + } + } + if(irCount <= elevs.back().irOffset) + { + ERR("Invalid evOffset: evOffset[%zu]=%d (irCount=%d)\n", + elevs.size()-1, elevs.back().irOffset, irCount); + return nullptr; + } + + for(size_t i{1};i < evCount;i++) + { + elevs[i-1].azCount = static_cast(elevs[i].irOffset - elevs[i-1].irOffset); + if(elevs[i-1].azCount < MIN_AZ_COUNT || elevs[i-1].azCount > MAX_AZ_COUNT) + { + ERR("Unsupported azimuth count: azCount[%zd]=%d (%d to %d)\n", + i-1, elevs[i-1].azCount, MIN_AZ_COUNT, MAX_AZ_COUNT); + return nullptr; + } + } + elevs.back().azCount = static_cast(irCount - elevs.back().irOffset); + if(elevs.back().azCount < MIN_AZ_COUNT || elevs.back().azCount > MAX_AZ_COUNT) + { + ERR("Unsupported azimuth count: azCount[%zu]=%d (%d to %d)\n", + elevs.size()-1, elevs.back().azCount, MIN_AZ_COUNT, MAX_AZ_COUNT); + return nullptr; + } + + auto coeffs = al::vector(irCount, HrirArray{}); + auto delays = al::vector(irCount); + for(auto &hrir : coeffs) + { + for(auto &val : al::span{hrir.data(), irSize}) + val[0] = GetLE_ALshort(data) / 32768.0f; + } + for(auto &val : delays) + val[0] = GetLE_ALubyte(data); + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + for(size_t i{0};i < irCount;i++) + { + if(delays[i][0] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%zd]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); + return nullptr; + } + delays[i][0] <<= HRIR_DELAY_FRACBITS; + } + + /* Mirror the left ear responses to the right ear. */ + MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data()); + + const HrtfStore::Field field[1]{{0.0f, evCount}}; + return CreateHrtfStore(rate, irSize, field, {elevs.data(), elevs.size()}, coeffs.data(), + delays.data(), filename); +} + +std::unique_ptr LoadHrtf01(std::istream &data, const char *filename) +{ + ALuint rate{GetLE_ALuint(data)}; + ALushort irSize{GetLE_ALubyte(data)}; + ALubyte evCount{GetLE_ALubyte(data)}; + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + + if(irSize < MIN_IR_LENGTH || irSize > HRIR_LENGTH) + { + ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MIN_IR_LENGTH, HRIR_LENGTH); + return nullptr; + } + if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) + { + ERR("Unsupported elevation count: evCount=%d (%d to %d)\n", + evCount, MIN_EV_COUNT, MAX_EV_COUNT); + return nullptr; + } + + auto elevs = al::vector(evCount); + for (auto &elev : elevs) elev.azCount = GetLE_ALubyte(data); + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + for(size_t i{0};i < evCount;++i) + { + if(elevs[i].azCount < MIN_AZ_COUNT || elevs[i].azCount > MAX_AZ_COUNT) + { + ERR("Unsupported azimuth count: azCount[%zd]=%d (%d to %d)\n", i, elevs[i].azCount, + MIN_AZ_COUNT, MAX_AZ_COUNT); + return nullptr; + } + } + + elevs[0].irOffset = 0; + for(size_t i{1};i < evCount;i++) + elevs[i].irOffset = static_cast(elevs[i-1].irOffset + elevs[i-1].azCount); + const ALushort irCount{static_cast(elevs.back().irOffset + elevs.back().azCount)}; + + auto coeffs = al::vector(irCount, HrirArray{}); + auto delays = al::vector(irCount); + for(auto &hrir : coeffs) + { + for(auto &val : al::span{hrir.data(), irSize}) + val[0] = GetLE_ALshort(data) / 32768.0f; + } + for(auto &val : delays) + val[0] = GetLE_ALubyte(data); + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + for(size_t i{0};i < irCount;i++) + { + if(delays[i][0] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%zd]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); + return nullptr; + } + delays[i][0] <<= HRIR_DELAY_FRACBITS; + } + + /* Mirror the left ear responses to the right ear. */ + MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data()); + + const HrtfStore::Field field[1]{{0.0f, evCount}}; + return CreateHrtfStore(rate, irSize, field, {elevs.data(), elevs.size()}, coeffs.data(), + delays.data(), filename); +} + +std::unique_ptr LoadHrtf02(std::istream &data, const char *filename) +{ + constexpr ALubyte SampleType_S16{0}; + constexpr ALubyte SampleType_S24{1}; + constexpr ALubyte ChanType_LeftOnly{0}; + constexpr ALubyte ChanType_LeftRight{1}; + + ALuint rate{GetLE_ALuint(data)}; + ALubyte sampleType{GetLE_ALubyte(data)}; + ALubyte channelType{GetLE_ALubyte(data)}; + ALushort irSize{GetLE_ALubyte(data)}; + ALubyte fdCount{GetLE_ALubyte(data)}; + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + + if(sampleType > SampleType_S24) + { + ERR("Unsupported sample type: %d\n", sampleType); + return nullptr; + } + if(channelType > ChanType_LeftRight) + { + ERR("Unsupported channel type: %d\n", channelType); + return nullptr; + } + + if(irSize < MIN_IR_LENGTH || irSize > HRIR_LENGTH) + { + ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MIN_IR_LENGTH, HRIR_LENGTH); + return nullptr; + } + if(fdCount < 1 || fdCount > MAX_FD_COUNT) + { + ERR("Unsupported number of field-depths: fdCount=%d (%d to %d)\n", fdCount, MIN_FD_COUNT, + MAX_FD_COUNT); + return nullptr; + } + + auto fields = al::vector(fdCount); + auto elevs = al::vector{}; + for(size_t f{0};f < fdCount;f++) + { + const ALushort distance{GetLE_ALushort(data)}; + const ALubyte evCount{GetLE_ALubyte(data)}; + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + + if(distance < MIN_FD_DISTANCE || distance > MAX_FD_DISTANCE) + { + ERR("Unsupported field distance[%zu]=%d (%d to %d millimeters)\n", f, distance, + MIN_FD_DISTANCE, MAX_FD_DISTANCE); + return nullptr; + } + if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) + { + ERR("Unsupported elevation count: evCount[%zu]=%d (%d to %d)\n", f, evCount, + MIN_EV_COUNT, MAX_EV_COUNT); + return nullptr; + } + + fields[f].distance = distance / 1000.0f; + fields[f].evCount = evCount; + if(f > 0 && fields[f].distance <= fields[f-1].distance) + { + ERR("Field distance[%zu] is not after previous (%f > %f)\n", f, fields[f].distance, + fields[f-1].distance); + return nullptr; + } + + const size_t ebase{elevs.size()}; + elevs.resize(ebase + evCount); + for(auto &elev : al::span(elevs.data()+ebase, evCount)) + elev.azCount = GetLE_ALubyte(data); + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + + for(size_t e{0};e < evCount;e++) + { + if(elevs[ebase+e].azCount < MIN_AZ_COUNT || elevs[ebase+e].azCount > MAX_AZ_COUNT) + { + ERR("Unsupported azimuth count: azCount[%zu][%zu]=%d (%d to %d)\n", f, e, + elevs[ebase+e].azCount, MIN_AZ_COUNT, MAX_AZ_COUNT); + return nullptr; + } + } + } + + elevs[0].irOffset = 0; + std::partial_sum(elevs.cbegin(), elevs.cend(), elevs.begin(), + [](const HrtfStore::Elevation &last, const HrtfStore::Elevation &cur) + -> HrtfStore::Elevation + { + return HrtfStore::Elevation{cur.azCount, + static_cast(last.azCount + last.irOffset)}; + }); + const auto irTotal = static_cast(elevs.back().azCount + elevs.back().irOffset); + + auto coeffs = al::vector(irTotal, HrirArray{}); + auto delays = al::vector(irTotal); + if(channelType == ChanType_LeftOnly) + { + if(sampleType == SampleType_S16) + { + for(auto &hrir : coeffs) + { + for(auto &val : al::span{hrir.data(), irSize}) + val[0] = GetLE_ALshort(data) / 32768.0f; + } + } + else if(sampleType == SampleType_S24) + { + for(auto &hrir : coeffs) + { + for(auto &val : al::span{hrir.data(), irSize}) + val[0] = static_cast(GetLE_ALint24(data)) / 8388608.0f; + } + } + for(auto &val : delays) + val[0] = GetLE_ALubyte(data); + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + for(size_t i{0};i < irTotal;++i) + { + if(delays[i][0] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%zu][0]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); + return nullptr; + } + delays[i][0] <<= HRIR_DELAY_FRACBITS; + } + + /* Mirror the left ear responses to the right ear. */ + MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data()); + } + else if(channelType == ChanType_LeftRight) + { + if(sampleType == SampleType_S16) + { + for(auto &hrir : coeffs) + { + for(auto &val : al::span{hrir.data(), irSize}) + { + val[0] = GetLE_ALshort(data) / 32768.0f; + val[1] = GetLE_ALshort(data) / 32768.0f; + } + } + } + else if(sampleType == SampleType_S24) + { + for(auto &hrir : coeffs) + { + for(auto &val : al::span{hrir.data(), irSize}) + { + val[0] = static_cast(GetLE_ALint24(data)) / 8388608.0f; + val[1] = static_cast(GetLE_ALint24(data)) / 8388608.0f; + } + } + } + for(auto &val : delays) + { + val[0] = GetLE_ALubyte(data); + val[1] = GetLE_ALubyte(data); + } + if(!data || data.eof()) + { + ERR("Failed reading %s\n", filename); + return nullptr; + } + + for(size_t i{0};i < irTotal;++i) + { + if(delays[i][0] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%zu][0]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); + return nullptr; + } + if(delays[i][1] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%zu][1]: %d (%d)\n", i, delays[i][1], MAX_HRIR_DELAY); + return nullptr; + } + delays[i][0] <<= HRIR_DELAY_FRACBITS; + delays[i][1] <<= HRIR_DELAY_FRACBITS; + } + } + + if(fdCount > 1) + { + auto fields_ = al::vector(fields.size()); + auto elevs_ = al::vector(elevs.size()); + auto coeffs_ = al::vector(coeffs.size()); + auto delays_ = al::vector(delays.size()); + + /* Simple reverse for the per-field elements. */ + std::reverse_copy(fields.cbegin(), fields.cend(), fields_.begin()); + + /* Each field has a group of elevations, which each have an azimuth + * count. Reverse the order of the groups, keeping the relative order + * of per-group azimuth counts. + */ + auto elevs__end = elevs_.end(); + auto copy_azs = [&elevs,&elevs__end](const ptrdiff_t ebase, const HrtfStore::Field &field) + -> ptrdiff_t + { + auto elevs_src = elevs.begin()+ebase; + elevs__end = std::copy_backward(elevs_src, elevs_src+field.evCount, elevs__end); + return ebase + field.evCount; + }; + std::accumulate(fields.cbegin(), fields.cend(), ptrdiff_t{0}, copy_azs); + assert(elevs_.begin() == elevs__end); + + /* Reestablish the IR offset for each elevation index, given the new + * ordering of elevations. + */ + elevs_[0].irOffset = 0; + std::partial_sum(elevs_.cbegin(), elevs_.cend(), elevs_.begin(), + [](const HrtfStore::Elevation &last, const HrtfStore::Elevation &cur) + -> HrtfStore::Elevation + { + return HrtfStore::Elevation{cur.azCount, + static_cast(last.azCount + last.irOffset)}; + }); + + /* Reverse the order of each field's group of IRs. */ + auto coeffs_end = coeffs_.end(); + auto delays_end = delays_.end(); + auto copy_irs = [&elevs,&coeffs,&delays,&coeffs_end,&delays_end]( + const ptrdiff_t ebase, const HrtfStore::Field &field) -> ptrdiff_t + { + auto accum_az = [](ALsizei count, const HrtfStore::Elevation &elev) noexcept -> ALsizei + { return count + elev.azCount; }; + const auto elevs_mid = elevs.cbegin() + ebase; + const auto elevs_end = elevs_mid + field.evCount; + const ALsizei abase{std::accumulate(elevs.cbegin(), elevs_mid, 0, accum_az)}; + const ALsizei num_azs{std::accumulate(elevs_mid, elevs_end, 0, accum_az)}; + + coeffs_end = std::copy_backward(coeffs.cbegin() + abase, + coeffs.cbegin() + (abase+num_azs), coeffs_end); + delays_end = std::copy_backward(delays.cbegin() + abase, + delays.cbegin() + (abase+num_azs), delays_end); + + return ebase + field.evCount; + }; + std::accumulate(fields.cbegin(), fields.cend(), ptrdiff_t{0}, copy_irs); + assert(coeffs_.begin() == coeffs_end); + assert(delays_.begin() == delays_end); + + fields = std::move(fields_); + elevs = std::move(elevs_); + coeffs = std::move(coeffs_); + delays = std::move(delays_); + } + + return CreateHrtfStore(rate, irSize, {fields.data(), fields.size()}, + {elevs.data(), elevs.size()}, coeffs.data(), delays.data(), filename); +} + + +bool checkName(const std::string &name) +{ + auto match_name = [&name](const HrtfEntry &entry) -> bool { return name == entry.mDispName; }; + auto &enum_names = EnumeratedHrtfs; + return std::find_if(enum_names.cbegin(), enum_names.cend(), match_name) != enum_names.cend(); +} + +void AddFileEntry(const std::string &filename) +{ + /* Check if this file has already been enumerated. */ + auto enum_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(), + [&filename](const HrtfEntry &entry) -> bool + { return entry.mFilename == filename; }); + if(enum_iter != EnumeratedHrtfs.cend()) + { + TRACE("Skipping duplicate file entry %s\n", filename.c_str()); + return; + } + + /* TODO: Get a human-readable name from the HRTF data (possibly coming in a + * format update). */ + size_t namepos = filename.find_last_of('/')+1; + if(!namepos) namepos = filename.find_last_of('\\')+1; + + size_t extpos{filename.find_last_of('.')}; + if(extpos <= namepos) extpos = std::string::npos; + + const std::string basename{(extpos == std::string::npos) ? + filename.substr(namepos) : filename.substr(namepos, extpos-namepos)}; + std::string newname{basename}; + int count{1}; + while(checkName(newname)) + { + newname = basename; + newname += " #"; + newname += std::to_string(++count); + } + EnumeratedHrtfs.emplace_back(HrtfEntry{newname, filename}); + const HrtfEntry &entry = EnumeratedHrtfs.back(); + + TRACE("Adding file entry \"%s\"\n", entry.mFilename.c_str()); +} + +/* Unfortunate that we have to duplicate AddFileEntry to take a memory buffer + * for input instead of opening the given filename. + */ +void AddBuiltInEntry(const std::string &dispname, ALuint residx) +{ + const std::string filename{'!'+std::to_string(residx)+'_'+dispname}; + + auto enum_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(), + [&filename](const HrtfEntry &entry) -> bool + { return entry.mFilename == filename; }); + if(enum_iter != EnumeratedHrtfs.cend()) + { + TRACE("Skipping duplicate file entry %s\n", filename.c_str()); + return; + } + + /* TODO: Get a human-readable name from the HRTF data (possibly coming in a + * format update). */ + + std::string newname{dispname}; + int count{1}; + while(checkName(newname)) + { + newname = dispname; + newname += " #"; + newname += std::to_string(++count); + } + EnumeratedHrtfs.emplace_back(HrtfEntry{newname, filename}); + const HrtfEntry &entry = EnumeratedHrtfs.back(); + + TRACE("Adding built-in entry \"%s\"\n", entry.mFilename.c_str()); +} + + +#define IDR_DEFAULT_HRTF_MHR 1 + +#ifndef ALSOFT_EMBED_HRTF_DATA + +al::span GetResource(int /*name*/) +{ return {}; } + +#else + +#include "hrtf_default.h" + +al::span GetResource(int name) +{ + if(name == IDR_DEFAULT_HRTF_MHR) + return {reinterpret_cast(hrtf_default), sizeof(hrtf_default)}; + return {}; +} +#endif + +} // namespace + + +al::vector EnumerateHrtf(const char *devname) +{ + std::lock_guard _{EnumeratedHrtfLock}; + EnumeratedHrtfs.clear(); + + bool usedefaults{true}; + if(auto pathopt = ConfigValueStr(devname, nullptr, "hrtf-paths")) + { + const char *pathlist{pathopt->c_str()}; + while(pathlist && *pathlist) + { + const char *next, *end; + + while(isspace(*pathlist) || *pathlist == ',') + pathlist++; + if(*pathlist == '\0') + continue; + + next = strchr(pathlist, ','); + if(next) + end = next++; + else + { + end = pathlist + strlen(pathlist); + usedefaults = false; + } + + while(end != pathlist && isspace(*(end-1))) + --end; + if(end != pathlist) + { + const std::string pname{pathlist, end}; + for(const auto &fname : SearchDataFiles(".mhr", pname.c_str())) + AddFileEntry(fname); + } + + pathlist = next; + } + } + + if(usedefaults) + { + for(const auto &fname : SearchDataFiles(".mhr", "openal/hrtf")) + AddFileEntry(fname); + + if(!GetResource(IDR_DEFAULT_HRTF_MHR).empty()) + AddBuiltInEntry("Built-In HRTF", IDR_DEFAULT_HRTF_MHR); + } + + al::vector list; + list.reserve(EnumeratedHrtfs.size()); + for(auto &entry : EnumeratedHrtfs) + list.emplace_back(entry.mDispName); + + if(auto defhrtfopt = ConfigValueStr(devname, nullptr, "default-hrtf")) + { + auto iter = std::find(list.begin(), list.end(), *defhrtfopt); + if(iter == list.end()) + WARN("Failed to find default HRTF \"%s\"\n", defhrtfopt->c_str()); + else if(iter != list.begin()) + std::rotate(list.begin(), iter, iter+1); + } + + return list; +} + +HrtfStore *GetLoadedHrtf(const std::string &name, const char *devname, const ALuint devrate) +{ + std::lock_guard _{EnumeratedHrtfLock}; + auto entry_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(), + [&name](const HrtfEntry &entry) -> bool { return entry.mDispName == name; } + ); + if(entry_iter == EnumeratedHrtfs.cend()) + return nullptr; + const std::string &fname = entry_iter->mFilename; + + std::lock_guard __{LoadedHrtfLock}; + auto hrtf_lt_fname = [](LoadedHrtf &hrtf, const std::string &filename) -> bool + { return hrtf.mFilename < filename; }; + auto handle = std::lower_bound(LoadedHrtfs.begin(), LoadedHrtfs.end(), fname, hrtf_lt_fname); + while(handle != LoadedHrtfs.end() && handle->mFilename == fname) + { + HrtfStore *hrtf{handle->mEntry.get()}; + if(hrtf && hrtf->sampleRate == devrate) + { + hrtf->IncRef(); + return hrtf; + } + ++handle; + } + + std::unique_ptr stream; + ALint residx{}; + char ch{}; + if(sscanf(fname.c_str(), "!%d%c", &residx, &ch) == 2 && ch == '_') + { + TRACE("Loading %s...\n", fname.c_str()); + al::span res{GetResource(residx)}; + if(res.empty()) + { + ERR("Could not get resource %u, %s\n", residx, name.c_str()); + return nullptr; + } + stream = al::make_unique(res.begin(), res.end()); + } + else + { + TRACE("Loading %s...\n", fname.c_str()); + auto fstr = al::make_unique(fname.c_str(), std::ios::binary); + if(!fstr->is_open()) + { + ERR("Could not open %s\n", fname.c_str()); + return nullptr; + } + stream = std::move(fstr); + } + + std::unique_ptr hrtf; + char magic[sizeof(magicMarker02)]; + stream->read(magic, sizeof(magic)); + if(stream->gcount() < static_cast(sizeof(magicMarker02))) + ERR("%s data is too short (%zu bytes)\n", name.c_str(), stream->gcount()); + else if(memcmp(magic, magicMarker02, sizeof(magicMarker02)) == 0) + { + TRACE("Detected data set format v2\n"); + hrtf = LoadHrtf02(*stream, name.c_str()); + } + else if(memcmp(magic, magicMarker01, sizeof(magicMarker01)) == 0) + { + TRACE("Detected data set format v1\n"); + hrtf = LoadHrtf01(*stream, name.c_str()); + } + else if(memcmp(magic, magicMarker00, sizeof(magicMarker00)) == 0) + { + TRACE("Detected data set format v0\n"); + hrtf = LoadHrtf00(*stream, name.c_str()); + } + else + ERR("Invalid header in %s: \"%.8s\"\n", name.c_str(), magic); + stream.reset(); + + if(!hrtf) + { + ERR("Failed to load %s\n", name.c_str()); + return nullptr; + } + + if(hrtf->sampleRate != devrate) + { + /* Calculate the last elevation's index and get the total IR count. */ + const size_t lastEv{std::accumulate(hrtf->field, hrtf->field+hrtf->fdCount, size_t{0}, + [](const size_t curval, const HrtfStore::Field &field) noexcept -> size_t + { return curval + field.evCount; } + ) - 1}; + const size_t irCount{size_t{hrtf->elev[lastEv].irOffset} + hrtf->elev[lastEv].azCount}; + + /* Resample all the IRs. */ + std::array,2> inout; + PPhaseResampler rs; + rs.init(hrtf->sampleRate, devrate); + for(size_t i{0};i < irCount;++i) + { + HrirArray &coeffs = const_cast(hrtf->coeffs[i]); + for(size_t j{0};j < 2;++j) + { + std::transform(coeffs.cbegin(), coeffs.cend(), inout[0].begin(), + [j](const float2 &in) noexcept -> double { return in[j]; }); + rs.process(HRIR_LENGTH, inout[0].data(), HRIR_LENGTH, inout[1].data()); + for(size_t k{0};k < HRIR_LENGTH;++k) + coeffs[k][j] = static_cast(inout[1][k]); + } + } + rs = {}; + + /* Scale the delays for the new sample rate. */ + float max_delay{0.0f}; + auto new_delays = al::vector(irCount); + const float rate_scale{static_cast(devrate)/static_cast(hrtf->sampleRate)}; + for(size_t i{0};i < irCount;++i) + { + for(size_t j{0};j < 2;++j) + { + const float new_delay{std::round(hrtf->delays[i][j] * rate_scale) / + float{HRIR_DELAY_FRACONE}}; + max_delay = maxf(max_delay, new_delay); + new_delays[i][j] = new_delay; + } + } + + /* If the new delays exceed the max, scale it down to fit (essentially + * shrinking the head radius; not ideal but better than a per-delay + * clamp). + */ + float delay_scale{HRIR_DELAY_FRACONE}; + if(max_delay > MAX_HRIR_DELAY) + { + WARN("Resampled delay exceeds max (%.2f > %d)\n", max_delay, MAX_HRIR_DELAY); + delay_scale *= float{MAX_HRIR_DELAY} / max_delay; + } + + for(size_t i{0};i < irCount;++i) + { + ubyte2 &delays = const_cast(hrtf->delays[i]); + for(size_t j{0};j < 2;++j) + delays[j] = static_cast(float2int(new_delays[i][j] * delay_scale)); + } + + /* Scale the IR size for the new sample rate and update the stored + * sample rate. + */ + const float newIrSize{std::round(static_cast(hrtf->irSize) * rate_scale)}; + hrtf->irSize = static_cast(minf(HRIR_LENGTH, newIrSize)); + hrtf->sampleRate = devrate; + } + + if(auto hrtfsizeopt = ConfigValueUInt(devname, nullptr, "hrtf-size")) + { + if(*hrtfsizeopt > 0 && *hrtfsizeopt < hrtf->irSize) + hrtf->irSize = maxu(*hrtfsizeopt, MIN_IR_LENGTH); + } + + TRACE("Loaded HRTF %s for sample rate %uhz, %u-sample filter\n", name.c_str(), + hrtf->sampleRate, hrtf->irSize); + handle = LoadedHrtfs.emplace(handle, LoadedHrtf{fname, std::move(hrtf)}); + + return handle->mEntry.get(); +} + + +void HrtfStore::IncRef() +{ + auto ref = IncrementRef(mRef); + TRACE("HrtfEntry %p increasing refcount to %u\n", decltype(std::declval()){this}, ref); +} + +void HrtfStore::DecRef() +{ + auto ref = DecrementRef(mRef); + TRACE("HrtfEntry %p decreasing refcount to %u\n", decltype(std::declval()){this}, ref); + if(ref == 0) + { + std::lock_guard _{LoadedHrtfLock}; + + /* Go through and remove all unused HRTFs. */ + auto remove_unused = [](LoadedHrtf &hrtf) -> bool + { + HrtfStore *entry{hrtf.mEntry.get()}; + if(entry && ReadRef(entry->mRef) == 0) + { + TRACE("Unloading unused HRTF %s\n", hrtf.mFilename.data()); + hrtf.mEntry = nullptr; + return true; + } + return false; + }; + auto iter = std::remove_if(LoadedHrtfs.begin(), LoadedHrtfs.end(), remove_unused); + LoadedHrtfs.erase(iter, LoadedHrtfs.end()); + } +} diff --git a/alc/hrtf.h b/alc/hrtf.h new file mode 100644 index 0000000..25811cd --- /dev/null +++ b/alc/hrtf.h @@ -0,0 +1,106 @@ +#ifndef ALC_HRTF_H +#define ALC_HRTF_H + +#include +#include +#include +#include + +#include "AL/al.h" + +#include "almalloc.h" +#include "alspan.h" +#include "ambidefs.h" +#include "atomic.h" +#include "vector.h" + + +#define HRTF_HISTORY_BITS (6) +#define HRTF_HISTORY_LENGTH (1<; +using HrirArray = std::array; +using ubyte2 = std::array; + + +struct HrtfStore { + RefCount mRef; + + ALuint sampleRate; + ALuint irSize; + + struct Field { + ALfloat distance; + ALubyte evCount; + }; + /* NOTE: Fields are stored *backwards*. field[0] is the farthest field, and + * field[fdCount-1] is the nearest. + */ + ALuint fdCount; + const Field *field; + + struct Elevation { + ALushort azCount; + ALushort irOffset; + }; + Elevation *elev; + const HrirArray *coeffs; + const ubyte2 *delays; + + void IncRef(); + void DecRef(); + + DEF_PLACE_NEWDEL() +}; + + +struct HrtfFilter { + alignas(16) HrirArray Coeffs; + ALuint Delay[2]; + float Gain; +}; + +struct DirectHrtfState { + /* HRTF filter state for dry buffer content */ + ALuint IrSize{0}; + al::FlexArray Coeffs; + + DirectHrtfState(size_t numchans) : Coeffs{numchans} { } + + static std::unique_ptr Create(size_t num_chans); + + DEF_FAM_NEWDEL(DirectHrtfState, Coeffs) +}; + +struct EvRadians { float value; }; +struct AzRadians { float value; }; +struct AngularPoint { + EvRadians Elev; + AzRadians Azim; +}; + + +al::vector EnumerateHrtf(const char *devname); +HrtfStore *GetLoadedHrtf(const std::string &name, const char *devname, const ALuint devrate); + +void GetHrtfCoeffs(const HrtfStore *Hrtf, float elevation, float azimuth, float distance, + float spread, HrirArray &coeffs, ALuint (&delays)[2]); + +/** + * Produces HRTF filter coefficients for decoding B-Format, given a set of + * virtual speaker positions, a matching decoding matrix, and per-order high- + * frequency gains for the decoder. The calculated impulse responses are + * ordered and scaled according to the matrix input. + */ +void BuildBFormatHrtf(const HrtfStore *Hrtf, DirectHrtfState *state, + const al::span AmbiPoints, const float (*AmbiMatrix)[MAX_AMBI_CHANNELS], + const al::span AmbiOrderHFGain); + +#endif /* ALC_HRTF_H */ diff --git a/Alc/inprogext.h b/alc/inprogext.h similarity index 78% rename from Alc/inprogext.h rename to alc/inprogext.h index 3025abe..ad3ea28 100644 --- a/Alc/inprogext.h +++ b/alc/inprogext.h @@ -9,23 +9,23 @@ extern "C" { #endif -#ifndef ALC_SOFT_loopback2 -#define ALC_SOFT_loopback2 1 -#define ALC_AMBISONIC_LAYOUT_SOFT 0xfff0 -#define ALC_AMBISONIC_SCALING_SOFT 0xfff1 -#define ALC_AMBISONIC_ORDER_SOFT 0xfff2 -#define ALC_MAX_AMBISONIC_ORDER_SOFT 0xfff3 +#ifndef ALC_SOFT_loopback_bformat +#define ALC_SOFT_loopback_bformat 1 +#define ALC_AMBISONIC_LAYOUT_SOFT 0x1997 +#define ALC_AMBISONIC_SCALING_SOFT 0x1998 +#define ALC_AMBISONIC_ORDER_SOFT 0x1999 +#define ALC_MAX_AMBISONIC_ORDER_SOFT 0x199B #define ALC_BFORMAT3D_SOFT 0x1508 /* Ambisonic layouts */ -#define ALC_ACN_SOFT 0xfff4 -#define ALC_FUMA_SOFT 0xfff5 +#define ALC_FUMA_SOFT 0x0000 +#define ALC_ACN_SOFT 0x0001 /* Ambisonic scalings (normalization) */ /*#define ALC_FUMA_SOFT*/ -#define ALC_SN3D_SOFT 0xfff6 -#define ALC_N3D_SOFT 0xfff7 +#define ALC_SN3D_SOFT 0x0001 +#define ALC_N3D_SOFT 0x0002 #endif #ifndef AL_SOFT_map_buffer @@ -72,12 +72,9 @@ AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values); #endif #endif -#ifndef AL_SOFT_buffer_layers -#define AL_SOFT_buffer_layers -typedef void (AL_APIENTRY*LPALSOURCEQUEUEBUFFERLAYERSSOFT)(ALuint src, ALsizei nb, const ALuint *buffers); -#ifdef AL_ALEXT_PROTOTYPES -AL_API void AL_APIENTRY alSourceQueueBufferLayersSOFT(ALuint src, ALsizei nb, const ALuint *buffers); -#endif +#ifndef AL_SOFT_effect_chain +#define AL_SOFT_effect_chain +#define AL_EFFECTSLOT_TARGET_SOFT 0xf000 #endif #ifdef __cplusplus diff --git a/alc/logging.h b/alc/logging.h new file mode 100644 index 0000000..ec6023a --- /dev/null +++ b/alc/logging.h @@ -0,0 +1,59 @@ +#ifndef LOGGING_H +#define LOGGING_H + +#include + +#include "opthelpers.h" + + +#ifdef __GNUC__ +#define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z)))) +#else +#define DECL_FORMAT(x, y, z) +#endif + + +extern FILE *gLogFile; + +void al_print(FILE *logfile, const char *fmt, ...) DECL_FORMAT(printf, 2,3); +#if !defined(_WIN32) +#define AL_PRINT fprintf +#else +#define AL_PRINT al_print +#endif + +#ifdef __ANDROID__ +#include +#define LOG_ANDROID(T, ...) __android_log_print(T, "openal", "AL lib: " __VA_ARGS__) +#else +#define LOG_ANDROID(T, ...) ((void)0) +#endif + +enum LogLevel { + NoLog, + LogError, + LogWarning, + LogTrace, + LogRef +}; +extern LogLevel gLogLevel; + +#define TRACE(...) do { \ + if UNLIKELY(gLogLevel >= LogTrace) \ + AL_PRINT(gLogFile, "AL lib: (II) " __VA_ARGS__); \ + LOG_ANDROID(ANDROID_LOG_DEBUG, __VA_ARGS__); \ +} while(0) + +#define WARN(...) do { \ + if UNLIKELY(gLogLevel >= LogWarning) \ + AL_PRINT(gLogFile, "AL lib: (WW) " __VA_ARGS__); \ + LOG_ANDROID(ANDROID_LOG_WARN, __VA_ARGS__); \ +} while(0) + +#define ERR(...) do { \ + if UNLIKELY(gLogLevel >= LogError) \ + AL_PRINT(gLogFile, "AL lib: (EE) " __VA_ARGS__); \ + LOG_ANDROID(ANDROID_LOG_ERROR, __VA_ARGS__); \ +} while(0) + +#endif /* LOGGING_H */ diff --git a/alc/mastering.cpp b/alc/mastering.cpp new file mode 100644 index 0000000..7e760aa --- /dev/null +++ b/alc/mastering.cpp @@ -0,0 +1,443 @@ + +#include "config.h" + +#include "mastering.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" + +#include "almalloc.h" +#include "alnumeric.h" +#include "alu.h" +#include "opthelpers.h" + + +/* These structures assume BUFFERSIZE is a power of 2. */ +static_assert((BUFFERSIZE & (BUFFERSIZE-1)) == 0, "BUFFERSIZE is not a power of 2"); + +struct SlidingHold { + alignas(16) float mValues[BUFFERSIZE]; + ALuint mExpiries[BUFFERSIZE]; + ALuint mLowerIndex; + ALuint mUpperIndex; + ALuint mLength; +}; + + +namespace { + +using namespace std::placeholders; + +/* This sliding hold follows the input level with an instant attack and a + * fixed duration hold before an instant release to the next highest level. + * It is a sliding window maximum (descending maxima) implementation based on + * Richard Harter's ascending minima algorithm available at: + * + * http://www.richardhartersworld.com/cri/2001/slidingmin.html + */ +ALfloat UpdateSlidingHold(SlidingHold *Hold, const ALuint i, const float in) +{ + static constexpr ALuint mask{BUFFERSIZE - 1}; + const ALuint length{Hold->mLength}; + float (&values)[BUFFERSIZE] = Hold->mValues; + ALuint (&expiries)[BUFFERSIZE] = Hold->mExpiries; + ALuint lowerIndex{Hold->mLowerIndex}; + ALuint upperIndex{Hold->mUpperIndex}; + + if(i >= expiries[upperIndex]) + upperIndex = (upperIndex + 1) & mask; + + if(in >= values[upperIndex]) + { + values[upperIndex] = in; + expiries[upperIndex] = i + length; + lowerIndex = upperIndex; + } + else + { + do { + do { + if(!(in >= values[lowerIndex])) + goto found_place; + } while(lowerIndex--); + lowerIndex = mask; + } while(1); + found_place: + + lowerIndex = (lowerIndex + 1) & mask; + values[lowerIndex] = in; + expiries[lowerIndex] = i + length; + } + + Hold->mLowerIndex = lowerIndex; + Hold->mUpperIndex = upperIndex; + + return values[upperIndex]; +} + +void ShiftSlidingHold(SlidingHold *Hold, const ALuint n) +{ + auto exp_begin = std::begin(Hold->mExpiries) + Hold->mUpperIndex; + auto exp_last = std::begin(Hold->mExpiries) + Hold->mLowerIndex; + if(exp_last-exp_begin < 0) + { + std::transform(exp_begin, std::end(Hold->mExpiries), exp_begin, + std::bind(std::minus{}, _1, n)); + exp_begin = std::begin(Hold->mExpiries); + } + std::transform(exp_begin, exp_last+1, exp_begin, std::bind(std::minus{}, _1, n)); +} + + +/* Multichannel compression is linked via the absolute maximum of all + * channels. + */ +void LinkChannels(Compressor *Comp, const ALuint SamplesToDo, const FloatBufferLine *OutBuffer) +{ + const size_t numChans{Comp->mNumChans}; + + ASSUME(SamplesToDo > 0); + ASSUME(numChans > 0); + + auto side_begin = std::begin(Comp->mSideChain) + Comp->mLookAhead; + std::fill(side_begin, side_begin+SamplesToDo, 0.0f); + + auto fill_max = [SamplesToDo,side_begin](const FloatBufferLine &input) -> void + { + const float *RESTRICT buffer{al::assume_aligned<16>(input.data())}; + auto max_abs = std::bind(maxf, _1, std::bind(static_cast(std::fabs), _2)); + std::transform(side_begin, side_begin+SamplesToDo, buffer, side_begin, max_abs); + }; + std::for_each(OutBuffer, OutBuffer+numChans, fill_max); +} + +/* This calculates the squared crest factor of the control signal for the + * basic automation of the attack/release times. As suggested by the paper, + * it uses an instantaneous squared peak detector and a squared RMS detector + * both with 200ms release times. + */ +static void CrestDetector(Compressor *Comp, const ALuint SamplesToDo) +{ + const float a_crest{Comp->mCrestCoeff}; + float y2_peak{Comp->mLastPeakSq}; + float y2_rms{Comp->mLastRmsSq}; + + ASSUME(SamplesToDo > 0); + + auto calc_crest = [&y2_rms,&y2_peak,a_crest](const float x_abs) noexcept -> float + { + const float x2{clampf(x_abs * x_abs, 0.000001f, 1000000.0f)}; + + y2_peak = maxf(x2, lerp(x2, y2_peak, a_crest)); + y2_rms = lerp(x2, y2_rms, a_crest); + return y2_peak / y2_rms; + }; + auto side_begin = std::begin(Comp->mSideChain) + Comp->mLookAhead; + std::transform(side_begin, side_begin+SamplesToDo, std::begin(Comp->mCrestFactor), calc_crest); + + Comp->mLastPeakSq = y2_peak; + Comp->mLastRmsSq = y2_rms; +} + +/* The side-chain starts with a simple peak detector (based on the absolute + * value of the incoming signal) and performs most of its operations in the + * log domain. + */ +void PeakDetector(Compressor *Comp, const ALuint SamplesToDo) +{ + ASSUME(SamplesToDo > 0); + + /* Clamp the minimum amplitude to near-zero and convert to logarithm. */ + auto side_begin = std::begin(Comp->mSideChain) + Comp->mLookAhead; + std::transform(side_begin, side_begin+SamplesToDo, side_begin, + [](const float s) -> float { return std::log(maxf(0.000001f, s)); }); +} + +/* An optional hold can be used to extend the peak detector so it can more + * solidly detect fast transients. This is best used when operating as a + * limiter. + */ +void PeakHoldDetector(Compressor *Comp, const ALuint SamplesToDo) +{ + ASSUME(SamplesToDo > 0); + + SlidingHold *hold{Comp->mHold}; + ALuint i{0}; + auto detect_peak = [&i,hold](const ALfloat x_abs) -> ALfloat + { + const float x_G{std::log(maxf(0.000001f, x_abs))}; + return UpdateSlidingHold(hold, i++, x_G); + }; + auto side_begin = std::begin(Comp->mSideChain) + Comp->mLookAhead; + std::transform(side_begin, side_begin+SamplesToDo, side_begin, detect_peak); + + ShiftSlidingHold(hold, SamplesToDo); +} + +/* This is the heart of the feed-forward compressor. It operates in the log + * domain (to better match human hearing) and can apply some basic automation + * to knee width, attack/release times, make-up/post gain, and clipping + * reduction. + */ +void GainCompressor(Compressor *Comp, const ALuint SamplesToDo) +{ + const bool autoKnee{Comp->mAuto.Knee}; + const bool autoAttack{Comp->mAuto.Attack}; + const bool autoRelease{Comp->mAuto.Release}; + const bool autoPostGain{Comp->mAuto.PostGain}; + const bool autoDeclip{Comp->mAuto.Declip}; + const ALuint lookAhead{Comp->mLookAhead}; + const float threshold{Comp->mThreshold}; + const float slope{Comp->mSlope}; + const float attack{Comp->mAttack}; + const float release{Comp->mRelease}; + const float c_est{Comp->mGainEstimate}; + const float a_adp{Comp->mAdaptCoeff}; + const float *crestFactor{Comp->mCrestFactor}; + float postGain{Comp->mPostGain}; + float knee{Comp->mKnee}; + float t_att{attack}; + float t_rel{release - attack}; + float a_att{std::exp(-1.0f / t_att)}; + float a_rel{std::exp(-1.0f / t_rel)}; + float y_1{Comp->mLastRelease}; + float y_L{Comp->mLastAttack}; + float c_dev{Comp->mLastGainDev}; + + ASSUME(SamplesToDo > 0); + + for(float &sideChain : al::span{Comp->mSideChain, SamplesToDo}) + { + if(autoKnee) + knee = maxf(0.0f, 2.5f * (c_dev + c_est)); + const float knee_h{0.5f * knee}; + + /* This is the gain computer. It applies a static compression curve + * to the control signal. + */ + const float x_over{std::addressof(sideChain)[lookAhead] - threshold}; + const float y_G{ + (x_over <= -knee_h) ? 0.0f : + (std::fabs(x_over) < knee_h) ? (x_over + knee_h) * (x_over + knee_h) / (2.0f * knee) : + x_over}; + + const float y2_crest{*(crestFactor++)}; + if(autoAttack) + { + t_att = 2.0f*attack/y2_crest; + a_att = std::exp(-1.0f / t_att); + } + if(autoRelease) + { + t_rel = 2.0f*release/y2_crest - t_att; + a_rel = std::exp(-1.0f / t_rel); + } + + /* Gain smoothing (ballistics) is done via a smooth decoupled peak + * detector. The attack time is subtracted from the release time + * above to compensate for the chained operating mode. + */ + const float x_L{-slope * y_G}; + y_1 = maxf(x_L, lerp(x_L, y_1, a_rel)); + y_L = lerp(y_1, y_L, a_att); + + /* Knee width and make-up gain automation make use of a smoothed + * measurement of deviation between the control signal and estimate. + * The estimate is also used to bias the measurement to hot-start its + * average. + */ + c_dev = lerp(-(y_L+c_est), c_dev, a_adp); + + if(autoPostGain) + { + /* Clipping reduction is only viable when make-up gain is being + * automated. It modifies the deviation to further attenuate the + * control signal when clipping is detected. The adaptation time + * is sufficiently long enough to suppress further clipping at the + * same output level. + */ + if(autoDeclip) + c_dev = maxf(c_dev, sideChain - y_L - threshold - c_est); + + postGain = -(c_dev + c_est); + } + + sideChain = std::exp(postGain - y_L); + } + + Comp->mLastRelease = y_1; + Comp->mLastAttack = y_L; + Comp->mLastGainDev = c_dev; +} + +/* Combined with the hold time, a look-ahead delay can improve handling of + * fast transients by allowing the envelope time to converge prior to + * reaching the offending impulse. This is best used when operating as a + * limiter. + */ +void SignalDelay(Compressor *Comp, const ALuint SamplesToDo, FloatBufferLine *OutBuffer) +{ + const size_t numChans{Comp->mNumChans}; + const ALuint lookAhead{Comp->mLookAhead}; + + ASSUME(SamplesToDo > 0); + ASSUME(numChans > 0); + ASSUME(lookAhead > 0); + + for(size_t c{0};c < numChans;c++) + { + ALfloat *inout{al::assume_aligned<16>(OutBuffer[c].data())}; + ALfloat *delaybuf{al::assume_aligned<16>(Comp->mDelay[c].data())}; + + auto inout_end = inout + SamplesToDo; + if LIKELY(SamplesToDo >= lookAhead) + { + auto delay_end = std::rotate(inout, inout_end - lookAhead, inout_end); + std::swap_ranges(inout, delay_end, delaybuf); + } + else + { + auto delay_start = std::swap_ranges(inout, inout_end, delaybuf); + std::rotate(delaybuf, delay_start, delaybuf + lookAhead); + } + } +} + +} // namespace + + +std::unique_ptr Compressor::Create(const size_t NumChans, const float SampleRate, + const bool AutoKnee, const bool AutoAttack, const bool AutoRelease, const bool AutoPostGain, + const bool AutoDeclip, const float LookAheadTime, const float HoldTime, const float PreGainDb, + const float PostGainDb, const float ThresholdDb, const float Ratio, const float KneeDb, + const float AttackTime, const float ReleaseTime) +{ + const auto lookAhead = static_cast( + clampf(std::round(LookAheadTime*SampleRate), 0.0f, BUFFERSIZE-1)); + const auto hold = static_cast( + clampf(std::round(HoldTime*SampleRate), 0.0f, BUFFERSIZE-1)); + + size_t size{sizeof(Compressor)}; + if(lookAhead > 0) + { + size += sizeof(*Compressor::mDelay) * NumChans; + /* The sliding hold implementation doesn't handle a length of 1. A 1- + * sample hold is useless anyway, it would only ever give back what was + * just given to it. + */ + if(hold > 1) + size += sizeof(*Compressor::mHold); + } + + auto Comp = std::unique_ptr{new (al_calloc(16, size)) Compressor{}}; + Comp->mNumChans = NumChans; + Comp->mAuto.Knee = AutoKnee != AL_FALSE; + Comp->mAuto.Attack = AutoAttack != AL_FALSE; + Comp->mAuto.Release = AutoRelease != AL_FALSE; + Comp->mAuto.PostGain = AutoPostGain != AL_FALSE; + Comp->mAuto.Declip = AutoPostGain && AutoDeclip; + Comp->mLookAhead = lookAhead; + Comp->mPreGain = std::pow(10.0f, PreGainDb / 20.0f); + Comp->mPostGain = PostGainDb * std::log(10.0f) / 20.0f; + Comp->mThreshold = ThresholdDb * std::log(10.0f) / 20.0f; + Comp->mSlope = 1.0f / maxf(1.0f, Ratio) - 1.0f; + Comp->mKnee = maxf(0.0f, KneeDb * std::log(10.0f) / 20.0f); + Comp->mAttack = maxf(1.0f, AttackTime * SampleRate); + Comp->mRelease = maxf(1.0f, ReleaseTime * SampleRate); + + /* Knee width automation actually treats the compressor as a limiter. By + * varying the knee width, it can effectively be seen as applying + * compression over a wide range of ratios. + */ + if(AutoKnee) + Comp->mSlope = -1.0f; + + if(lookAhead > 0) + { + if(hold > 1) + { + Comp->mHold = ::new (static_cast(Comp.get() + 1)) SlidingHold{}; + Comp->mHold->mValues[0] = -std::numeric_limits::infinity(); + Comp->mHold->mExpiries[0] = hold; + Comp->mHold->mLength = hold; + Comp->mDelay = ::new (static_cast(Comp->mHold + 1)) FloatBufferLine[NumChans]; + } + else + { + Comp->mDelay = ::new (static_cast(Comp.get() + 1)) FloatBufferLine[NumChans]; + } + std::fill_n(Comp->mDelay, NumChans, FloatBufferLine{}); + } + + Comp->mCrestCoeff = std::exp(-1.0f / (0.200f * SampleRate)); // 200ms + Comp->mGainEstimate = Comp->mThreshold * -0.5f * Comp->mSlope; + Comp->mAdaptCoeff = std::exp(-1.0f / (2.0f * SampleRate)); // 2s + + return Comp; +} + +Compressor::~Compressor() +{ + if(mHold) + al::destroy_at(mHold); + mHold = nullptr; + if(mDelay) + al::destroy_n(mDelay, mNumChans); + mDelay = nullptr; +} + + +void Compressor::process(const ALuint SamplesToDo, FloatBufferLine *OutBuffer) +{ + const size_t numChans{mNumChans}; + + ASSUME(SamplesToDo > 0); + ASSUME(numChans > 0); + + const float preGain{mPreGain}; + if(preGain != 1.0f) + { + auto apply_gain = [SamplesToDo,preGain](FloatBufferLine &input) noexcept -> void + { + float *buffer{al::assume_aligned<16>(input.data())}; + std::transform(buffer, buffer+SamplesToDo, buffer, + std::bind(std::multiplies{}, _1, preGain)); + }; + std::for_each(OutBuffer, OutBuffer+numChans, apply_gain); + } + + LinkChannels(this, SamplesToDo, OutBuffer); + + if(mAuto.Attack || mAuto.Release) + CrestDetector(this, SamplesToDo); + + if(mHold) + PeakHoldDetector(this, SamplesToDo); + else + PeakDetector(this, SamplesToDo); + + GainCompressor(this, SamplesToDo); + + if(mDelay) + SignalDelay(this, SamplesToDo, OutBuffer); + + const ALfloat (&sideChain)[BUFFERSIZE*2] = mSideChain; + auto apply_comp = [SamplesToDo,&sideChain](FloatBufferLine &input) noexcept -> void + { + ALfloat *buffer{al::assume_aligned<16>(input.data())}; + const ALfloat *gains{al::assume_aligned<16>(&sideChain[0])}; + std::transform(gains, gains+SamplesToDo, buffer, buffer, + std::bind(std::multiplies{}, _1, _2)); + }; + std::for_each(OutBuffer, OutBuffer+numChans, apply_comp); + + auto side_begin = std::begin(mSideChain) + SamplesToDo; + std::copy(side_begin, side_begin+mLookAhead, std::begin(mSideChain)); +} diff --git a/alc/mastering.h b/alc/mastering.h new file mode 100644 index 0000000..92c25fe --- /dev/null +++ b/alc/mastering.h @@ -0,0 +1,105 @@ +#ifndef MASTERING_H +#define MASTERING_H + +#include + +#include "AL/al.h" + +/* For FloatBufferLine/BUFFERSIZE. */ +#include "alcmain.h" +#include "almalloc.h" + +struct SlidingHold; + + +/* General topology and basic automation was based on the following paper: + * + * D. Giannoulis, M. Massberg and J. D. Reiss, + * "Parameter Automation in a Dynamic Range Compressor," + * Journal of the Audio Engineering Society, v61 (10), Oct. 2013 + * + * Available (along with supplemental reading) at: + * + * http://c4dm.eecs.qmul.ac.uk/audioengineering/compressors/ + */ +struct Compressor { + size_t mNumChans{0u}; + + struct { + bool Knee : 1; + bool Attack : 1; + bool Release : 1; + bool PostGain : 1; + bool Declip : 1; + } mAuto{}; + + ALuint mLookAhead{0}; + + float mPreGain{0.0f}; + float mPostGain{0.0f}; + + float mThreshold{0.0f}; + float mSlope{0.0f}; + float mKnee{0.0f}; + + float mAttack{0.0f}; + float mRelease{0.0f}; + + alignas(16) float mSideChain[2*BUFFERSIZE]{}; + alignas(16) float mCrestFactor[BUFFERSIZE]{}; + + SlidingHold *mHold{nullptr}; + FloatBufferLine *mDelay{nullptr}; + + float mCrestCoeff{0.0f}; + float mGainEstimate{0.0f}; + float mAdaptCoeff{0.0f}; + + float mLastPeakSq{0.0f}; + float mLastRmsSq{0.0f}; + float mLastRelease{0.0f}; + float mLastAttack{0.0f}; + float mLastGainDev{0.0f}; + + + ~Compressor(); + void process(const ALuint SamplesToDo, FloatBufferLine *OutBuffer); + ALsizei getLookAhead() const noexcept { return static_cast(mLookAhead); } + + DEF_PLACE_NEWDEL() + + /** + * The compressor is initialized with the following settings: + * + * \param NumChans Number of channels to process. + * \param SampleRate Sample rate to process. + * \param AutoKnee Whether to automate the knee width parameter. + * \param AutoAttack Whether to automate the attack time parameter. + * \param AutoRelease Whether to automate the release time parameter. + * \param AutoPostGain Whether to automate the make-up (post) gain + * parameter. + * \param AutoDeclip Whether to automate clipping reduction. Ignored + * when not automating make-up gain. + * \param LookAheadTime Look-ahead time (in seconds). + * \param HoldTime Peak hold-time (in seconds). + * \param PreGainDb Gain applied before detection (in dB). + * \param PostGainDb Make-up gain applied after compression (in dB). + * \param ThresholdDb Triggering threshold (in dB). + * \param Ratio Compression ratio (x:1). Set to INFINIFTY for true + * limiting. Ignored when automating knee width. + * \param KneeDb Knee width (in dB). Ignored when automating knee + * width. + * \param AttackTime Attack time (in seconds). Acts as a maximum when + * automating attack time. + * \param ReleaseTime Release time (in seconds). Acts as a maximum when + * automating release time. + */ + static std::unique_ptr Create(const size_t NumChans, const float SampleRate, + const bool AutoKnee, const bool AutoAttack, const bool AutoRelease, + const bool AutoPostGain, const bool AutoDeclip, const float LookAheadTime, + const float HoldTime, const float PreGainDb, const float PostGainDb, + const float ThresholdDb, const float Ratio, const float KneeDb, const float AttackTime, + const float ReleaseTime); +}; + +#endif /* MASTERING_H */ diff --git a/alc/mixer/defs.h b/alc/mixer/defs.h new file mode 100644 index 0000000..a3b49ad --- /dev/null +++ b/alc/mixer/defs.h @@ -0,0 +1,68 @@ +#ifndef MIXER_DEFS_H +#define MIXER_DEFS_H + +#include "AL/al.h" + +#include "alcmain.h" +#include "alspan.h" +#include "hrtf.h" + +union InterpState; +struct MixHrtfFilter; + + +enum InstSetType { + CTag, + SSETag, + SSE2Tag, + SSE3Tag, + SSE4Tag, + NEONTag +}; + +enum ResampleType { + CopyTag, + PointTag, + LerpTag, + CubicTag, + BSincTag, + FastBSincTag +}; + +template +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, ALuint frac, + ALuint increment, const al::span dst); + +template +void Mix_(const al::span InSamples, const al::span OutBuffer, + float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos); +template +void MixRow_(const al::span OutBuffer, const al::span Gains, + const float *InSamples, const size_t InStride); + +template +void MixHrtf_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const MixHrtfFilter *hrtfparams, const size_t BufferSize); +template +void MixHrtfBlend_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const HrtfFilter *oldparams, const MixHrtfFilter *newparams, const size_t BufferSize); +template +void MixDirectHrtf_(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + const al::span InSamples, float2 *AccumSamples, DirectHrtfState *State, + const size_t BufferSize); + +/* Vectorized resampler helpers */ +inline void InitPosArrays(ALuint frac, ALuint increment, ALuint *frac_arr, ALuint *pos_arr, + size_t size) +{ + pos_arr[0] = 0; + frac_arr[0] = frac; + for(size_t i{1};i < size;i++) + { + const ALuint frac_tmp{frac_arr[i-1] + increment}; + pos_arr[i] = pos_arr[i-1] + (frac_tmp>>FRACTIONBITS); + frac_arr[i] = frac_tmp&FRACTIONMASK; + } +} + +#endif /* MIXER_DEFS_H */ diff --git a/alc/mixer/hrtfbase.h b/alc/mixer/hrtfbase.h new file mode 100644 index 0000000..ed40328 --- /dev/null +++ b/alc/mixer/hrtfbase.h @@ -0,0 +1,112 @@ +#ifndef MIXER_HRTFBASE_H +#define MIXER_HRTFBASE_H + +#include + +#include "alu.h" +#include "../hrtf.h" +#include "opthelpers.h" +#include "voice.h" + + +using ApplyCoeffsT = void(&)(float2 *RESTRICT Values, const ALuint irSize, const HrirArray &Coeffs, + const float left, const float right); + +template +inline void MixHrtfBase(const float *InSamples, float2 *RESTRICT AccumSamples, const ALuint IrSize, + const MixHrtfFilter *hrtfparams, const size_t BufferSize) +{ + ASSUME(BufferSize > 0); + + const HrirArray &Coeffs = *hrtfparams->Coeffs; + const float gainstep{hrtfparams->GainStep}; + const float gain{hrtfparams->Gain}; + + size_t Delay[2]{ + HRTF_HISTORY_LENGTH - hrtfparams->Delay[0], + HRTF_HISTORY_LENGTH - hrtfparams->Delay[1] }; + float stepcount{0.0f}; + for(size_t i{0u};i < BufferSize;++i) + { + const float g{gain + gainstep*stepcount}; + const float left{InSamples[Delay[0]++] * g}; + const float right{InSamples[Delay[1]++] * g}; + ApplyCoeffs(AccumSamples+i, IrSize, Coeffs, left, right); + + stepcount += 1.0f; + } +} + +template +inline void MixHrtfBlendBase(const float *InSamples, float2 *RESTRICT AccumSamples, + const ALuint IrSize, const HrtfFilter *oldparams, const MixHrtfFilter *newparams, + const size_t BufferSize) +{ + const auto &OldCoeffs = oldparams->Coeffs; + const float oldGain{oldparams->Gain}; + const float oldGainStep{-oldGain / static_cast(BufferSize)}; + const auto &NewCoeffs = *newparams->Coeffs; + const float newGainStep{newparams->GainStep}; + + ASSUME(BufferSize > 0); + + size_t Delay[2]{ + HRTF_HISTORY_LENGTH - oldparams->Delay[0], + HRTF_HISTORY_LENGTH - oldparams->Delay[1] }; + float stepcount{0.0f}; + for(size_t i{0u};i < BufferSize;++i) + { + const float g{oldGain + oldGainStep*stepcount}; + const float left{InSamples[Delay[0]++] * g}; + const float right{InSamples[Delay[1]++] * g}; + ApplyCoeffs(AccumSamples+i, IrSize, OldCoeffs, left, right); + + stepcount += 1.0f; + } + + Delay[0] = HRTF_HISTORY_LENGTH - newparams->Delay[0]; + Delay[1] = HRTF_HISTORY_LENGTH - newparams->Delay[1]; + stepcount = 0.0f; + for(size_t i{0u};i < BufferSize;++i) + { + const float g{newGainStep*stepcount}; + const float left{InSamples[Delay[0]++] * g}; + const float right{InSamples[Delay[1]++] * g}; + ApplyCoeffs(AccumSamples+i, IrSize, NewCoeffs, left, right); + + stepcount += 1.0f; + } +} + +template +inline void MixDirectHrtfBase(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + const al::span InSamples, float2 *RESTRICT AccumSamples, + DirectHrtfState *State, const size_t BufferSize) +{ + ASSUME(BufferSize > 0); + + const ALuint IrSize{State->IrSize}; + + auto coeff_iter = State->Coeffs.begin(); + for(const FloatBufferLine &input : InSamples) + { + const auto &Coeffs = *(coeff_iter++); + for(size_t i{0u};i < BufferSize;++i) + { + const float insample{input[i]}; + ApplyCoeffs(AccumSamples+i, IrSize, Coeffs, insample, insample); + } + } + for(size_t i{0u};i < BufferSize;++i) + LeftOut[i] += AccumSamples[i][0]; + for(size_t i{0u};i < BufferSize;++i) + RightOut[i] += AccumSamples[i][1]; + + /* Copy the new in-progress accumulation values to the front and clear the + * following samples for the next mix. + */ + auto accum_iter = std::copy_n(AccumSamples+BufferSize, HRIR_LENGTH, AccumSamples); + std::fill_n(accum_iter, BufferSize, float2{}); +} + +#endif /* MIXER_HRTFBASE_H */ diff --git a/alc/mixer/mixer_c.cpp b/alc/mixer/mixer_c.cpp new file mode 100644 index 0000000..c086dd8 --- /dev/null +++ b/alc/mixer/mixer_c.cpp @@ -0,0 +1,219 @@ +#include "config.h" + +#include + +#include + +#include "alcmain.h" +#include "alu.h" + +#include "defs.h" +#include "hrtfbase.h" + + +namespace { + +inline float do_point(const InterpState&, const float *RESTRICT vals, const ALuint) +{ return vals[0]; } +inline float do_lerp(const InterpState&, const float *RESTRICT vals, const ALuint frac) +{ return lerp(vals[0], vals[1], static_cast(frac)*(1.0f/FRACTIONONE)); } +inline float do_cubic(const InterpState&, const float *RESTRICT vals, const ALuint frac) +{ return cubic(vals[0], vals[1], vals[2], vals[3], static_cast(frac)*(1.0f/FRACTIONONE)); } +inline float do_bsinc(const InterpState &istate, const float *RESTRICT vals, const ALuint frac) +{ + const size_t m{istate.bsinc.m}; + + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + const ALuint pi{frac >> FRAC_PHASE_BITDIFF}; + const float pf{static_cast(frac & ((1<> FRAC_PHASE_BITDIFF}; + const float pf{static_cast(frac & ((1< +const float *DoResample(const InterpState *state, const float *RESTRICT src, ALuint frac, + ALuint increment, const al::span dst) +{ + const InterpState istate{*state}; + auto proc_sample = [&src,&frac,istate,increment]() -> float + { + const float ret{Sampler(istate, src, frac)}; + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + + return ret; + }; + std::generate(dst.begin(), dst.end(), proc_sample); + + return dst.begin(); +} + +inline void ApplyCoeffs(float2 *RESTRICT Values, const ALuint IrSize, const HrirArray &Coeffs, + const float left, const float right) +{ + ASSUME(IrSize >= MIN_IR_LENGTH); + for(ALuint c{0};c < IrSize;++c) + { + Values[c][0] += Coeffs[c][0] * left; + Values[c][1] += Coeffs[c][1] * right; + } +} + +} // namespace + +template<> +const ALfloat *Resample_(const InterpState*, const ALfloat *RESTRICT src, ALuint, + ALuint, const al::span dst) +{ +#if defined(HAVE_SSE) || defined(HAVE_NEON) + /* Avoid copying the source data if it's aligned like the destination. */ + if((reinterpret_cast(src)&15) == (reinterpret_cast(dst.data())&15)) + return src; +#endif + std::copy_n(src, dst.size(), dst.begin()); + return dst.begin(); +} + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ return DoResample(state, src, frac, increment, dst); } + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ return DoResample(state, src, frac, increment, dst); } + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ return DoResample(state, src-1, frac, increment, dst); } + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ return DoResample(state, src-state->bsinc.l, frac, increment, dst); } + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ return DoResample(state, src-state->bsinc.l, frac, increment, dst); } + + +template<> +void MixHrtf_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const MixHrtfFilter *hrtfparams, const size_t BufferSize) +{ MixHrtfBase(InSamples, AccumSamples, IrSize, hrtfparams, BufferSize); } + +template<> +void MixHrtfBlend_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const HrtfFilter *oldparams, const MixHrtfFilter *newparams, const size_t BufferSize) +{ + MixHrtfBlendBase(InSamples, AccumSamples, IrSize, oldparams, newparams, + BufferSize); +} + +template<> +void MixDirectHrtf_(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + const al::span InSamples, float2 *AccumSamples, DirectHrtfState *State, + const size_t BufferSize) +{ MixDirectHrtfBase(LeftOut, RightOut, InSamples, AccumSamples, State, BufferSize); } + + +template<> +void Mix_(const al::span InSamples, const al::span OutBuffer, + float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos) +{ + const ALfloat delta{(Counter > 0) ? 1.0f / static_cast(Counter) : 0.0f}; + const bool reached_target{InSamples.size() >= Counter}; + const auto min_end = reached_target ? InSamples.begin() + Counter : InSamples.end(); + for(FloatBufferLine &output : OutBuffer) + { + ALfloat *RESTRICT dst{al::assume_aligned<16>(output.data()+OutPos)}; + ALfloat gain{*CurrentGains}; + const ALfloat diff{*TargetGains - gain}; + + auto in_iter = InSamples.begin(); + if(std::fabs(diff) > std::numeric_limits::epsilon()) + { + const ALfloat step{diff * delta}; + ALfloat step_count{0.0f}; + while(in_iter != min_end) + { + *(dst++) += *(in_iter++) * (gain + step*step_count); + step_count += 1.0f; + } + if(reached_target) + gain = *TargetGains; + else + gain += step*step_count; + *CurrentGains = gain; + } + ++CurrentGains; + ++TargetGains; + + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + while(in_iter != InSamples.end()) + *(dst++) += *(in_iter++) * gain; + } +} + +/* Basically the inverse of the above. Rather than one input going to multiple + * outputs (each with its own gain), it's multiple inputs (each with its own + * gain) going to one output. This applies one row (vs one column) of a matrix + * transform. And as the matrices are more or less static once set up, no + * stepping is necessary. + */ +template<> +void MixRow_(const al::span OutBuffer, const al::span Gains, + const float *InSamples, const size_t InStride) +{ + for(const float gain : Gains) + { + const float *RESTRICT input{InSamples}; + InSamples += InStride; + + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + auto do_mix = [gain](const float cur, const float src) noexcept -> float + { return cur + src*gain; }; + std::transform(OutBuffer.begin(), OutBuffer.end(), input, OutBuffer.begin(), do_mix); + } +} diff --git a/alc/mixer/mixer_neon.cpp b/alc/mixer/mixer_neon.cpp new file mode 100644 index 0000000..afc9768 --- /dev/null +++ b/alc/mixer/mixer_neon.cpp @@ -0,0 +1,324 @@ +#include "config.h" + +#include + +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "alcmain.h" +#include "alu.h" +#include "hrtf.h" +#include "defs.h" +#include "hrtfbase.h" + + +namespace { + +inline void ApplyCoeffs(float2 *RESTRICT Values, const ALuint IrSize, const HrirArray &Coeffs, + const float left, const float right) +{ + float32x4_t leftright4; + { + float32x2_t leftright2 = vdup_n_f32(0.0); + leftright2 = vset_lane_f32(left, leftright2, 0); + leftright2 = vset_lane_f32(right, leftright2, 1); + leftright4 = vcombine_f32(leftright2, leftright2); + } + + ASSUME(IrSize >= MIN_IR_LENGTH); + for(ALuint c{0};c < IrSize;c += 2) + { + float32x4_t vals = vld1q_f32(&Values[c][0]); + float32x4_t coefs = vld1q_f32(&Coeffs[c][0]); + + vals = vmlaq_f32(vals, coefs, leftright4); + + vst1q_f32(&Values[c][0], vals); + } +} + +} // namespace + +template<> +const ALfloat *Resample_(const InterpState*, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ + const int32x4_t increment4 = vdupq_n_s32(static_cast(increment*4)); + const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); + const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); + alignas(16) ALuint pos_[4], frac_[4]; + int32x4_t pos4, frac4; + + InitPosArrays(frac, increment, frac_, pos_, 4); + frac4 = vld1q_s32(reinterpret_cast(frac_)); + pos4 = vld1q_s32(reinterpret_cast(pos_)); + + auto dst_iter = dst.begin(); + const auto aligned_end = (dst.size()&~3u) + dst_iter; + while(dst_iter != aligned_end) + { + const int pos0{vgetq_lane_s32(pos4, 0)}; + const int pos1{vgetq_lane_s32(pos4, 1)}; + const int pos2{vgetq_lane_s32(pos4, 2)}; + const int pos3{vgetq_lane_s32(pos4, 3)}; + const float32x4_t val1{src[pos0], src[pos1], src[pos2], src[pos3]}; + const float32x4_t val2{src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]}; + + /* val1 + (val2-val1)*mu */ + const float32x4_t r0{vsubq_f32(val2, val1)}; + const float32x4_t mu{vmulq_f32(vcvtq_f32_s32(frac4), fracOne4)}; + const float32x4_t out{vmlaq_f32(val1, mu, r0)}; + + vst1q_f32(dst_iter, out); + dst_iter += 4; + + frac4 = vaddq_s32(frac4, increment4); + pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); + frac4 = vandq_s32(frac4, fracMask4); + } + + if(dst_iter != dst.end()) + { + src += static_cast(vgetq_lane_s32(pos4, 0)); + frac = static_cast(vgetq_lane_s32(frac4, 0)); + + do { + *(dst_iter++) = lerp(src[0], src[1], static_cast(frac) * (1.0f/FRACTIONONE)); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } while(dst_iter != dst.end()); + } + return dst.begin(); +} + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ + const float *const filter{state->bsinc.filter}; + const float32x4_t sf4{vdupq_n_f32(state->bsinc.sf)}; + const size_t m{state->bsinc.m}; + + src -= state->bsinc.l; + for(float &out_sample : dst) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + const ALuint pi{frac >> FRAC_PHASE_BITDIFF}; + const float pf{static_cast(frac & ((1<> 2}; + size_t j{0u}; + + do { + /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ + const float32x4_t f4 = vmlaq_f32( + vmlaq_f32(vld1q_f32(fil), sf4, vld1q_f32(scd)), + pf4, vmlaq_f32(vld1q_f32(phd), sf4, vld1q_f32(spd))); + fil += 4; scd += 4; phd += 4; spd += 4; + /* r += f*src */ + r4 = vmlaq_f32(r4, f4, vld1q_f32(&src[j])); + j += 4; + } while(--td); + } + r4 = vaddq_f32(r4, vrev64q_f32(r4)); + out_sample = vget_lane_f32(vadd_f32(vget_low_f32(r4), vget_high_f32(r4)), 0); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst.begin(); +} + +template<> +const ALfloat *Resample_(const InterpState *state, + const ALfloat *RESTRICT src, ALuint frac, ALuint increment, const al::span dst) +{ + const float *const filter{state->bsinc.filter}; + const size_t m{state->bsinc.m}; + + src -= state->bsinc.l; + for(float &out_sample : dst) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + const ALuint pi{frac >> FRAC_PHASE_BITDIFF}; + const float pf{static_cast(frac & ((1<> 2}; + size_t j{0u}; + + do { + /* f = fil + pf*phd */ + const float32x4_t f4 = vmlaq_f32(vld1q_f32(fil), pf4, vld1q_f32(phd)); + /* r += f*src */ + r4 = vmlaq_f32(r4, f4, vld1q_f32(&src[j])); + fil += 4; phd += 4; j += 4; + } while(--td); + } + r4 = vaddq_f32(r4, vrev64q_f32(r4)); + out_sample = vget_lane_f32(vadd_f32(vget_low_f32(r4), vget_high_f32(r4)), 0); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst.begin(); +} + + +template<> +void MixHrtf_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const MixHrtfFilter *hrtfparams, const size_t BufferSize) +{ MixHrtfBase(InSamples, AccumSamples, IrSize, hrtfparams, BufferSize); } + +template<> +void MixHrtfBlend_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const HrtfFilter *oldparams, const MixHrtfFilter *newparams, const size_t BufferSize) +{ + MixHrtfBlendBase(InSamples, AccumSamples, IrSize, oldparams, newparams, + BufferSize); +} + +template<> +void MixDirectHrtf_(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + const al::span InSamples, float2 *AccumSamples, DirectHrtfState *State, + const size_t BufferSize) +{ MixDirectHrtfBase(LeftOut, RightOut, InSamples, AccumSamples, State, BufferSize); } + + +template<> +void Mix_(const al::span InSamples, const al::span OutBuffer, + float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos) +{ + const ALfloat delta{(Counter > 0) ? 1.0f / static_cast(Counter) : 0.0f}; + const bool reached_target{InSamples.size() >= Counter}; + const auto min_end = reached_target ? InSamples.begin() + Counter : InSamples.end(); + const auto aligned_end = minz(static_cast(min_end-InSamples.begin()+3) & ~3u, + InSamples.size()) + InSamples.begin(); + for(FloatBufferLine &output : OutBuffer) + { + ALfloat *RESTRICT dst{al::assume_aligned<16>(output.data()+OutPos)}; + ALfloat gain{*CurrentGains}; + const ALfloat diff{*TargetGains - gain}; + + auto in_iter = InSamples.begin(); + if(std::fabs(diff) > std::numeric_limits::epsilon()) + { + const ALfloat step{diff * delta}; + ALfloat step_count{0.0f}; + /* Mix with applying gain steps in aligned multiples of 4. */ + if(ptrdiff_t todo{(min_end-in_iter) >> 2}) + { + const float32x4_t four4{vdupq_n_f32(4.0f)}; + const float32x4_t step4{vdupq_n_f32(step)}; + const float32x4_t gain4{vdupq_n_f32(gain)}; + float32x4_t step_count4{vsetq_lane_f32(0.0f, + vsetq_lane_f32(1.0f, + vsetq_lane_f32(2.0f, + vsetq_lane_f32(3.0f, vdupq_n_f32(0.0f), 3), + 2), 1), 0 + )}; + do { + const float32x4_t val4 = vld1q_f32(in_iter); + float32x4_t dry4 = vld1q_f32(dst); + dry4 = vmlaq_f32(dry4, val4, vmlaq_f32(gain4, step4, step_count4)); + step_count4 = vaddq_f32(step_count4, four4); + vst1q_f32(dst, dry4); + in_iter += 4; dst += 4; + } while(--todo); + /* NOTE: step_count4 now represents the next four counts after + * the last four mixed samples, so the lowest element + * represents the next step count to apply. + */ + step_count = vgetq_lane_f32(step_count4, 0); + } + /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ + while(in_iter != min_end) + { + *(dst++) += *(in_iter++) * (gain + step*step_count); + step_count += 1.0f; + } + if(reached_target) + gain = *TargetGains; + else + gain += step*step_count; + *CurrentGains = gain; + + /* Mix until pos is aligned with 4 or the mix is done. */ + while(in_iter != aligned_end) + *(dst++) += *(in_iter++) * gain; + } + ++CurrentGains; + ++TargetGains; + + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + if(ptrdiff_t todo{(InSamples.end()-in_iter) >> 2}) + { + const float32x4_t gain4 = vdupq_n_f32(gain); + do { + const float32x4_t val4 = vld1q_f32(in_iter); + float32x4_t dry4 = vld1q_f32(dst); + dry4 = vmlaq_f32(dry4, val4, gain4); + vst1q_f32(dst, dry4); + in_iter += 4; dst += 4; + } while(--todo); + } + while(in_iter != InSamples.end()) + *(dst++) += *(in_iter++) * gain; + } +} + +template<> +void MixRow_(const al::span OutBuffer, const al::span Gains, + const float *InSamples, const size_t InStride) +{ + for(const ALfloat gain : Gains) + { + const ALfloat *RESTRICT input{InSamples}; + InSamples += InStride; + + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + auto out_iter = OutBuffer.begin(); + if(size_t todo{OutBuffer.size() >> 2}) + { + const float32x4_t gain4{vdupq_n_f32(gain)}; + do { + const float32x4_t val4 = vld1q_f32(input); + float32x4_t dry4 = vld1q_f32(out_iter); + dry4 = vmlaq_f32(dry4, val4, gain4); + vst1q_f32(out_iter, dry4); + out_iter += 4; input += 4; + } while(--todo); + } + + auto do_mix = [gain](const float cur, const float src) noexcept -> float + { return cur + src*gain; }; + std::transform(out_iter, OutBuffer.end(), input, out_iter, do_mix); + } +} diff --git a/alc/mixer/mixer_sse.cpp b/alc/mixer/mixer_sse.cpp new file mode 100644 index 0000000..3bc7b30 --- /dev/null +++ b/alc/mixer/mixer_sse.cpp @@ -0,0 +1,298 @@ +#include "config.h" + +#include + +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "alcmain.h" + +#include "alu.h" +#include "defs.h" +#include "hrtfbase.h" + + +namespace { + +inline void ApplyCoeffs(float2 *RESTRICT Values, const ALuint IrSize, const HrirArray &Coeffs, + const float left, const float right) +{ + const __m128 lrlr{_mm_setr_ps(left, right, left, right)}; + + ASSUME(IrSize >= MIN_IR_LENGTH); + /* This isn't technically correct to test alignment, but it's true for + * systems that support SSE, which is the only one that needs to know the + * alignment of Values (which alternates between 8- and 16-byte aligned). + */ + if(reinterpret_cast(Values)&0x8) + { + __m128 imp0, imp1; + __m128 coeffs{_mm_load_ps(&Coeffs[0][0])}; + __m128 vals{_mm_loadl_pi(_mm_setzero_ps(), reinterpret_cast<__m64*>(&Values[0][0]))}; + imp0 = _mm_mul_ps(lrlr, coeffs); + vals = _mm_add_ps(imp0, vals); + _mm_storel_pi(reinterpret_cast<__m64*>(&Values[0][0]), vals); + ALuint td{(IrSize>>1) - 1}; + size_t i{1}; + do { + coeffs = _mm_load_ps(&Coeffs[i+1][0]); + vals = _mm_load_ps(&Values[i][0]); + imp1 = _mm_mul_ps(lrlr, coeffs); + imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2)); + vals = _mm_add_ps(imp0, vals); + _mm_store_ps(&Values[i][0], vals); + imp0 = imp1; + i += 2; + } while(--td); + vals = _mm_loadl_pi(vals, reinterpret_cast<__m64*>(&Values[i][0])); + imp0 = _mm_movehl_ps(imp0, imp0); + vals = _mm_add_ps(imp0, vals); + _mm_storel_pi(reinterpret_cast<__m64*>(&Values[i][0]), vals); + } + else + { + for(size_t i{0};i < IrSize;i += 2) + { + const __m128 coeffs{_mm_load_ps(&Coeffs[i][0])}; + __m128 vals{_mm_load_ps(&Values[i][0])}; + vals = _mm_add_ps(vals, _mm_mul_ps(lrlr, coeffs)); + _mm_store_ps(&Values[i][0], vals); + } + } +} + +} // namespace + +template<> +const ALfloat *Resample_(const InterpState *state, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ + const float *const filter{state->bsinc.filter}; + const __m128 sf4{_mm_set1_ps(state->bsinc.sf)}; + const size_t m{state->bsinc.m}; + + src -= state->bsinc.l; + for(float &out_sample : dst) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + const ALuint pi{frac >> FRAC_PHASE_BITDIFF}; + const float pf{static_cast(frac & ((1<> 2}; + size_t j{0u}; + +#define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) + do { + /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ + const __m128 f4 = MLA4( + MLA4(_mm_load_ps(fil), sf4, _mm_load_ps(scd)), + pf4, MLA4(_mm_load_ps(phd), sf4, _mm_load_ps(spd))); + fil += 4; scd += 4; phd += 4; spd += 4; + /* r += f*src */ + r4 = MLA4(r4, f4, _mm_loadu_ps(&src[j])); + j += 4; + } while(--td); +#undef MLA4 + } + r4 = _mm_add_ps(r4, _mm_shuffle_ps(r4, r4, _MM_SHUFFLE(0, 1, 2, 3))); + r4 = _mm_add_ps(r4, _mm_movehl_ps(r4, r4)); + out_sample = _mm_cvtss_f32(r4); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst.begin(); +} + +template<> +const ALfloat *Resample_(const InterpState *state, + const ALfloat *RESTRICT src, ALuint frac, ALuint increment, const al::span dst) +{ + const float *const filter{state->bsinc.filter}; + const size_t m{state->bsinc.m}; + + src -= state->bsinc.l; + for(float &out_sample : dst) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + const ALuint pi{frac >> FRAC_PHASE_BITDIFF}; + const float pf{static_cast(frac & ((1<> 2}; + size_t j{0u}; + +#define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) + do { + /* f = fil + pf*phd */ + const __m128 f4 = MLA4(_mm_load_ps(fil), pf4, _mm_load_ps(phd)); + /* r += f*src */ + r4 = MLA4(r4, f4, _mm_loadu_ps(&src[j])); + fil += 4; phd += 4; j += 4; + } while(--td); +#undef MLA4 + } + r4 = _mm_add_ps(r4, _mm_shuffle_ps(r4, r4, _MM_SHUFFLE(0, 1, 2, 3))); + r4 = _mm_add_ps(r4, _mm_movehl_ps(r4, r4)); + out_sample = _mm_cvtss_f32(r4); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst.begin(); +} + + +template<> +void MixHrtf_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const MixHrtfFilter *hrtfparams, const size_t BufferSize) +{ MixHrtfBase(InSamples, AccumSamples, IrSize, hrtfparams, BufferSize); } + +template<> +void MixHrtfBlend_(const float *InSamples, float2 *AccumSamples, const ALuint IrSize, + const HrtfFilter *oldparams, const MixHrtfFilter *newparams, const size_t BufferSize) +{ + MixHrtfBlendBase(InSamples, AccumSamples, IrSize, oldparams, newparams, + BufferSize); +} + +template<> +void MixDirectHrtf_(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + const al::span InSamples, float2 *AccumSamples, DirectHrtfState *State, + const size_t BufferSize) +{ MixDirectHrtfBase(LeftOut, RightOut, InSamples, AccumSamples, State, BufferSize); } + + +template<> +void Mix_(const al::span InSamples, const al::span OutBuffer, + float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos) +{ + const ALfloat delta{(Counter > 0) ? 1.0f / static_cast(Counter) : 0.0f}; + const bool reached_target{InSamples.size() >= Counter}; + const auto min_end = reached_target ? InSamples.begin() + Counter : InSamples.end(); + const auto aligned_end = minz(static_cast(min_end-InSamples.begin()+3) & ~3u, + InSamples.size()) + InSamples.begin(); + for(FloatBufferLine &output : OutBuffer) + { + ALfloat *RESTRICT dst{al::assume_aligned<16>(output.data()+OutPos)}; + ALfloat gain{*CurrentGains}; + const ALfloat diff{*TargetGains - gain}; + + auto in_iter = InSamples.begin(); + if(std::fabs(diff) > std::numeric_limits::epsilon()) + { + const ALfloat step{diff * delta}; + ALfloat step_count{0.0f}; + /* Mix with applying gain steps in aligned multiples of 4. */ + if(ptrdiff_t todo{(min_end-in_iter) >> 2}) + { + const __m128 four4{_mm_set1_ps(4.0f)}; + const __m128 step4{_mm_set1_ps(step)}; + const __m128 gain4{_mm_set1_ps(gain)}; + __m128 step_count4{_mm_setr_ps(0.0f, 1.0f, 2.0f, 3.0f)}; + do { + const __m128 val4{_mm_load_ps(in_iter)}; + __m128 dry4{_mm_load_ps(dst)}; +#define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) + /* dry += val * (gain + step*step_count) */ + dry4 = MLA4(dry4, val4, MLA4(gain4, step4, step_count4)); +#undef MLA4 + _mm_store_ps(dst, dry4); + step_count4 = _mm_add_ps(step_count4, four4); + in_iter += 4; dst += 4; + } while(--todo); + /* NOTE: step_count4 now represents the next four counts after + * the last four mixed samples, so the lowest element + * represents the next step count to apply. + */ + step_count = _mm_cvtss_f32(step_count4); + } + /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ + while(in_iter != min_end) + { + *(dst++) += *(in_iter++) * (gain + step*step_count); + step_count += 1.0f; + } + if(reached_target) + gain = *TargetGains; + else + gain += step*step_count; + *CurrentGains = gain; + + /* Mix until pos is aligned with 4 or the mix is done. */ + while(in_iter != aligned_end) + *(dst++) += *(in_iter++) * gain; + } + ++CurrentGains; + ++TargetGains; + + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + if(ptrdiff_t todo{(InSamples.end()-in_iter) >> 2}) + { + const __m128 gain4{_mm_set1_ps(gain)}; + do { + const __m128 val4{_mm_load_ps(in_iter)}; + __m128 dry4{_mm_load_ps(dst)}; + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + _mm_store_ps(dst, dry4); + in_iter += 4; dst += 4; + } while(--todo); + } + while(in_iter != InSamples.end()) + *(dst++) += *(in_iter++) * gain; + } +} + +template<> +void MixRow_(const al::span OutBuffer, const al::span Gains, + const float *InSamples, const size_t InStride) +{ + for(const float gain : Gains) + { + const float *RESTRICT input{InSamples}; + InSamples += InStride; + + if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + auto out_iter = OutBuffer.begin(); + if(size_t todo{OutBuffer.size() >> 2}) + { + const __m128 gain4 = _mm_set1_ps(gain); + do { + const __m128 val4{_mm_load_ps(input)}; + __m128 dry4{_mm_load_ps(out_iter)}; + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + _mm_store_ps(out_iter, dry4); + out_iter += 4; input += 4; + } while(--todo); + } + + auto do_mix = [gain](const float cur, const float src) noexcept -> float + { return cur + src*gain; }; + std::transform(out_iter, OutBuffer.end(), input, out_iter, do_mix); + } +} diff --git a/alc/mixer/mixer_sse2.cpp b/alc/mixer/mixer_sse2.cpp new file mode 100644 index 0000000..897cd1f --- /dev/null +++ b/alc/mixer/mixer_sse2.cpp @@ -0,0 +1,83 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2014 by Timothy Arceri . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alu.h" +#include "defs.h" + + +template<> +const ALfloat *Resample_(const InterpState*, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ + const __m128i increment4{_mm_set1_epi32(static_cast(increment*4))}; + const __m128 fracOne4{_mm_set1_ps(1.0f/FRACTIONONE)}; + const __m128i fracMask4{_mm_set1_epi32(FRACTIONMASK)}; + + alignas(16) ALuint pos_[4], frac_[4]; + InitPosArrays(frac, increment, frac_, pos_, 4); + __m128i frac4{_mm_setr_epi32(static_cast(frac_[0]), static_cast(frac_[1]), + static_cast(frac_[2]), static_cast(frac_[3]))}; + __m128i pos4{_mm_setr_epi32(static_cast(pos_[0]), static_cast(pos_[1]), + static_cast(pos_[2]), static_cast(pos_[3]))}; + + auto dst_iter = dst.begin(); + const auto aligned_end = (dst.size()&~3u) + dst_iter; + while(dst_iter != aligned_end) + { + const int pos0{_mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(0, 0, 0, 0)))}; + const int pos1{_mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(1, 1, 1, 1)))}; + const int pos2{_mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(2, 2, 2, 2)))}; + const int pos3{_mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(3, 3, 3, 3)))}; + const __m128 val1{_mm_setr_ps(src[pos0 ], src[pos1 ], src[pos2 ], src[pos3 ])}; + const __m128 val2{_mm_setr_ps(src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1])}; + + /* val1 + (val2-val1)*mu */ + const __m128 r0{_mm_sub_ps(val2, val1)}; + const __m128 mu{_mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4)}; + const __m128 out{_mm_add_ps(val1, _mm_mul_ps(mu, r0))}; + + _mm_store_ps(dst_iter, out); + dst_iter += 4; + + frac4 = _mm_add_epi32(frac4, increment4); + pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); + frac4 = _mm_and_si128(frac4, fracMask4); + } + + if(dst_iter != dst.end()) + { + src += static_cast(_mm_cvtsi128_si32(pos4)); + frac = static_cast(_mm_cvtsi128_si32(frac4)); + + do { + *(dst_iter++) = lerp(src[0], src[1], static_cast(frac) * (1.0f/FRACTIONONE)); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } while(dst_iter != dst.end()); + } + return dst.begin(); +} diff --git a/Alc/mixer/mixer_sse3.c b/alc/mixer/mixer_sse3.cpp similarity index 100% rename from Alc/mixer/mixer_sse3.c rename to alc/mixer/mixer_sse3.cpp diff --git a/alc/mixer/mixer_sse41.cpp b/alc/mixer/mixer_sse41.cpp new file mode 100644 index 0000000..cfa21e9 --- /dev/null +++ b/alc/mixer/mixer_sse41.cpp @@ -0,0 +1,88 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2014 by Timothy Arceri . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include "alu.h" +#include "defs.h" + + +template<> +const ALfloat *Resample_(const InterpState*, const ALfloat *RESTRICT src, + ALuint frac, ALuint increment, const al::span dst) +{ + const __m128i increment4{_mm_set1_epi32(static_cast(increment*4))}; + const __m128 fracOne4{_mm_set1_ps(1.0f/FRACTIONONE)}; + const __m128i fracMask4{_mm_set1_epi32(FRACTIONMASK)}; + + alignas(16) ALuint pos_[4], frac_[4]; + InitPosArrays(frac, increment, frac_, pos_, 4); + __m128i frac4{_mm_setr_epi32(static_cast(frac_[0]), static_cast(frac_[1]), + static_cast(frac_[2]), static_cast(frac_[3]))}; + __m128i pos4{_mm_setr_epi32(static_cast(pos_[0]), static_cast(pos_[1]), + static_cast(pos_[2]), static_cast(pos_[3]))}; + + auto dst_iter = dst.begin(); + const auto aligned_end = (dst.size()&~3u) + dst_iter; + while(dst_iter != aligned_end) + { + const int pos0{_mm_extract_epi32(pos4, 0)}; + const int pos1{_mm_extract_epi32(pos4, 1)}; + const int pos2{_mm_extract_epi32(pos4, 2)}; + const int pos3{_mm_extract_epi32(pos4, 3)}; + const __m128 val1{_mm_setr_ps(src[pos0 ], src[pos1 ], src[pos2 ], src[pos3 ])}; + const __m128 val2{_mm_setr_ps(src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1])}; + + /* val1 + (val2-val1)*mu */ + const __m128 r0{_mm_sub_ps(val2, val1)}; + const __m128 mu{_mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4)}; + const __m128 out{_mm_add_ps(val1, _mm_mul_ps(mu, r0))}; + + _mm_store_ps(dst_iter, out); + dst_iter += 4; + + frac4 = _mm_add_epi32(frac4, increment4); + pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); + frac4 = _mm_and_si128(frac4, fracMask4); + } + + if(dst_iter != dst.end()) + { + /* NOTE: These four elements represent the position *after* the last + * four samples, so the lowest element is the next position to + * resample. + */ + src += static_cast(_mm_cvtsi128_si32(pos4)); + frac = static_cast(_mm_cvtsi128_si32(frac4)); + + do { + *(dst_iter++) = lerp(src[0], src[1], static_cast(frac) * (1.0f/FRACTIONONE)); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } while(dst_iter != dst.end()); + } + return dst.begin(); +} diff --git a/alc/panning.cpp b/alc/panning.cpp new file mode 100644 index 0000000..435555d --- /dev/null +++ b/alc/panning.cpp @@ -0,0 +1,994 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2010 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" + +#include "al/auxeffectslot.h" +#include "alcmain.h" +#include "alconfig.h" +#include "almalloc.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alspan.h" +#include "alstring.h" +#include "alu.h" +#include "ambdec.h" +#include "ambidefs.h" +#include "bformatdec.h" +#include "bs2b.h" +#include "devformat.h" +#include "hrtf.h" +#include "logging.h" +#include "math_defs.h" +#include "opthelpers.h" +#include "uhjfilter.h" + + +constexpr std::array AmbiScale::FromN3D; +constexpr std::array AmbiScale::FromSN3D; +constexpr std::array AmbiScale::FromFuMa; +constexpr std::array AmbiIndex::FromFuMa; +constexpr std::array AmbiIndex::FromFuMa2D; +constexpr std::array AmbiIndex::FromACN; +constexpr std::array AmbiIndex::From2D; +constexpr std::array AmbiIndex::OrderFromChannel; +constexpr std::array AmbiIndex::OrderFrom2DChannel; + + +namespace { + +using namespace std::placeholders; +using std::chrono::seconds; +using std::chrono::nanoseconds; + +inline const char *GetLabelFromChannel(Channel channel) +{ + switch(channel) + { + case FrontLeft: return "front-left"; + case FrontRight: return "front-right"; + case FrontCenter: return "front-center"; + case LFE: return "lfe"; + case BackLeft: return "back-left"; + case BackRight: return "back-right"; + case BackCenter: return "back-center"; + case SideLeft: return "side-left"; + case SideRight: return "side-right"; + + case UpperFrontLeft: return "upper-front-left"; + case UpperFrontRight: return "upper-front-right"; + case UpperBackLeft: return "upper-back-left"; + case UpperBackRight: return "upper-back-right"; + case LowerFrontLeft: return "lower-front-left"; + case LowerFrontRight: return "lower-front-right"; + case LowerBackLeft: return "lower-back-left"; + case LowerBackRight: return "lower-back-right"; + + case Aux0: return "aux-0"; + case Aux1: return "aux-1"; + case Aux2: return "aux-2"; + case Aux3: return "aux-3"; + case Aux4: return "aux-4"; + case Aux5: return "aux-5"; + case Aux6: return "aux-6"; + case Aux7: return "aux-7"; + case Aux8: return "aux-8"; + case Aux9: return "aux-9"; + case Aux10: return "aux-10"; + case Aux11: return "aux-11"; + case Aux12: return "aux-12"; + case Aux13: return "aux-13"; + case Aux14: return "aux-14"; + case Aux15: return "aux-15"; + + case MaxChannels: break; + } + return "(unknown)"; +} + + +void AllocChannels(ALCdevice *device, const ALuint main_chans, const ALuint real_chans) +{ + TRACE("Channel config, Main: %u, Real: %u\n", main_chans, real_chans); + + /* Allocate extra channels for any post-filter output. */ + const ALuint num_chans{main_chans + real_chans}; + + TRACE("Allocating %u channels, %zu bytes\n", num_chans, + num_chans*sizeof(device->MixBuffer[0])); + device->MixBuffer.resize(num_chans); + al::span buffer{device->MixBuffer.data(), device->MixBuffer.size()}; + + device->Dry.Buffer = buffer.first(main_chans); + buffer = buffer.subspan(main_chans); + if(real_chans != 0) + { + device->RealOut.Buffer = buffer.first(real_chans); + buffer = buffer.subspan(real_chans); + } + else + device->RealOut.Buffer = device->Dry.Buffer; +} + + +struct ChannelMap { + Channel ChanName; + ALfloat Config[MAX_AMBI2D_CHANNELS]; +}; + +bool MakeSpeakerMap(ALCdevice *device, const AmbDecConf *conf, ALuint (&speakermap)[MAX_OUTPUT_CHANNELS]) +{ + auto map_spkr = [device](const AmbDecConf::SpeakerConf &speaker) -> ALuint + { + /* NOTE: AmbDec does not define any standard speaker names, however + * for this to work we have to by able to find the output channel + * the speaker definition corresponds to. Therefore, OpenAL Soft + * requires these channel labels to be recognized: + * + * LF = Front left + * RF = Front right + * LS = Side left + * RS = Side right + * LB = Back left + * RB = Back right + * CE = Front center + * CB = Back center + * + * Additionally, surround51 will acknowledge back speakers for side + * channels, and surround51rear will acknowledge side speakers for + * back channels, to avoid issues with an ambdec expecting 5.1 to + * use the side channels when the device is configured for back, + * and vice-versa. + */ + Channel ch{}; + if(speaker.Name == "LF") + ch = FrontLeft; + else if(speaker.Name == "RF") + ch = FrontRight; + else if(speaker.Name == "CE") + ch = FrontCenter; + else if(speaker.Name == "LS") + { + if(device->FmtChans == DevFmtX51Rear) + ch = BackLeft; + else + ch = SideLeft; + } + else if(speaker.Name == "RS") + { + if(device->FmtChans == DevFmtX51Rear) + ch = BackRight; + else + ch = SideRight; + } + else if(speaker.Name == "LB") + { + if(device->FmtChans == DevFmtX51) + ch = SideLeft; + else + ch = BackLeft; + } + else if(speaker.Name == "RB") + { + if(device->FmtChans == DevFmtX51) + ch = SideRight; + else + ch = BackRight; + } + else if(speaker.Name == "CB") + ch = BackCenter; + else + { + const char *name{speaker.Name.c_str()}; + unsigned int n; + char c; + + if(sscanf(name, "AUX%u%c", &n, &c) == 1 && n < 16) + ch = static_cast(Aux0+n); + else + { + ERR("AmbDec speaker label \"%s\" not recognized\n", name); + return INVALID_CHANNEL_INDEX; + } + } + const ALuint chidx{GetChannelIdxByName(device->RealOut, ch)}; + if(chidx == INVALID_CHANNEL_INDEX) + ERR("Failed to lookup AmbDec speaker label %s\n", speaker.Name.c_str()); + return chidx; + }; + std::transform(conf->Speakers.begin(), conf->Speakers.end(), std::begin(speakermap), map_spkr); + /* Return success if no invalid entries are found. */ + auto spkrmap_end = std::begin(speakermap) + conf->Speakers.size(); + return std::find(std::begin(speakermap), spkrmap_end, INVALID_CHANNEL_INDEX) == spkrmap_end; +} + + +constexpr ChannelMap MonoCfg[1] = { + { FrontCenter, { 1.0f } }, +}, StereoCfg[2] = { + { FrontLeft, { 5.00000000e-1f, 2.88675135e-1f, 5.52305643e-2f } }, + { FrontRight, { 5.00000000e-1f, -2.88675135e-1f, 5.52305643e-2f } }, +}, QuadCfg[4] = { + { BackLeft, { 3.53553391e-1f, 2.04124145e-1f, -2.04124145e-1f } }, + { FrontLeft, { 3.53553391e-1f, 2.04124145e-1f, 2.04124145e-1f } }, + { FrontRight, { 3.53553391e-1f, -2.04124145e-1f, 2.04124145e-1f } }, + { BackRight, { 3.53553391e-1f, -2.04124145e-1f, -2.04124145e-1f } }, +}, X51SideCfg[4] = { + { SideLeft, { 3.33000782e-1f, 1.89084803e-1f, -2.00042375e-1f, -2.12307769e-2f, -1.14579885e-2f } }, + { FrontLeft, { 1.88542860e-1f, 1.27709292e-1f, 1.66295695e-1f, 7.30571517e-2f, 2.10901184e-2f } }, + { FrontRight, { 1.88542860e-1f, -1.27709292e-1f, 1.66295695e-1f, -7.30571517e-2f, 2.10901184e-2f } }, + { SideRight, { 3.33000782e-1f, -1.89084803e-1f, -2.00042375e-1f, 2.12307769e-2f, -1.14579885e-2f } }, +}, X51RearCfg[4] = { + { BackLeft, { 3.33000782e-1f, 1.89084803e-1f, -2.00042375e-1f, -2.12307769e-2f, -1.14579885e-2f } }, + { FrontLeft, { 1.88542860e-1f, 1.27709292e-1f, 1.66295695e-1f, 7.30571517e-2f, 2.10901184e-2f } }, + { FrontRight, { 1.88542860e-1f, -1.27709292e-1f, 1.66295695e-1f, -7.30571517e-2f, 2.10901184e-2f } }, + { BackRight, { 3.33000782e-1f, -1.89084803e-1f, -2.00042375e-1f, 2.12307769e-2f, -1.14579885e-2f } }, +}, X61Cfg[6] = { + { SideLeft, { 2.04460341e-1f, 2.17177926e-1f, -4.39996780e-2f, -2.60790269e-2f, -6.87239792e-2f } }, + { FrontLeft, { 1.58923161e-1f, 9.21772680e-2f, 1.59658796e-1f, 6.66278083e-2f, 3.84686854e-2f } }, + { FrontRight, { 1.58923161e-1f, -9.21772680e-2f, 1.59658796e-1f, -6.66278083e-2f, 3.84686854e-2f } }, + { SideRight, { 2.04460341e-1f, -2.17177926e-1f, -4.39996780e-2f, 2.60790269e-2f, -6.87239792e-2f } }, + { BackCenter, { 2.50001688e-1f, 0.00000000e+0f, -2.50000094e-1f, 0.00000000e+0f, 6.05133395e-2f } }, +}, X71Cfg[6] = { + { BackLeft, { 2.04124145e-1f, 1.08880247e-1f, -1.88586120e-1f, -1.29099444e-1f, 7.45355993e-2f, 3.73460789e-2f, 0.00000000e+0f } }, + { SideLeft, { 2.04124145e-1f, 2.17760495e-1f, 0.00000000e+0f, 0.00000000e+0f, -1.49071198e-1f, -3.73460789e-2f, 0.00000000e+0f } }, + { FrontLeft, { 2.04124145e-1f, 1.08880247e-1f, 1.88586120e-1f, 1.29099444e-1f, 7.45355993e-2f, 3.73460789e-2f, 0.00000000e+0f } }, + { FrontRight, { 2.04124145e-1f, -1.08880247e-1f, 1.88586120e-1f, -1.29099444e-1f, 7.45355993e-2f, -3.73460789e-2f, 0.00000000e+0f } }, + { SideRight, { 2.04124145e-1f, -2.17760495e-1f, 0.00000000e+0f, 0.00000000e+0f, -1.49071198e-1f, 3.73460789e-2f, 0.00000000e+0f } }, + { BackRight, { 2.04124145e-1f, -1.08880247e-1f, -1.88586120e-1f, 1.29099444e-1f, 7.45355993e-2f, -3.73460789e-2f, 0.00000000e+0f } }, +}; + +void InitNearFieldCtrl(ALCdevice *device, ALfloat ctrl_dist, ALuint order, bool is3d) +{ + /* NFC is only used when AvgSpeakerDist is greater than 0. */ + const char *devname{device->DeviceName.c_str()}; + if(!GetConfigValueBool(devname, "decoder", "nfc", 0) || !(ctrl_dist > 0.0f)) + return; + + device->AvgSpeakerDist = clampf(ctrl_dist, 0.1f, 10.0f); + TRACE("Using near-field reference distance: %.2f meters\n", device->AvgSpeakerDist); + + static const ALuint chans_per_order2d[MAX_AMBI_ORDER+1]{ 1, 2, 2, 2 }; + static const ALuint chans_per_order3d[MAX_AMBI_ORDER+1]{ 1, 3, 5, 7 }; + const al::span chans_per_order{is3d ? chans_per_order3d : chans_per_order2d, + order+1u}; + + auto iter = std::copy(chans_per_order.begin(), chans_per_order.end(), + std::begin(device->NumChannelsPerOrder)); + std::fill(iter, std::end(device->NumChannelsPerOrder), 0u); +} + +void InitDistanceComp(ALCdevice *device, const AmbDecConf *conf, + const ALuint (&speakermap)[MAX_OUTPUT_CHANNELS]) +{ + auto get_max = std::bind(maxf, _1, + std::bind(std::mem_fn(&AmbDecConf::SpeakerConf::Distance), _2)); + const ALfloat maxdist{ + std::accumulate(conf->Speakers.begin(), conf->Speakers.end(), float{0.0f}, get_max)}; + + const char *devname{device->DeviceName.c_str()}; + if(!GetConfigValueBool(devname, "decoder", "distance-comp", 1) || !(maxdist > 0.0f)) + return; + + const auto distSampleScale = static_cast(device->Frequency)/SPEEDOFSOUNDMETRESPERSEC; + const auto ChanDelay = device->ChannelDelay.as_span(); + size_t total{0u}; + for(size_t i{0u};i < conf->Speakers.size();i++) + { + const AmbDecConf::SpeakerConf &speaker = conf->Speakers[i]; + const ALuint chan{speakermap[i]}; + + /* Distance compensation only delays in steps of the sample rate. This + * is a bit less accurate since the delay time falls to the nearest + * sample time, but it's far simpler as it doesn't have to deal with + * phase offsets. This means at 48khz, for instance, the distance delay + * will be in steps of about 7 millimeters. + */ + ALfloat delay{std::floor((maxdist - speaker.Distance)*distSampleScale + 0.5f)}; + if(delay > ALfloat{MAX_DELAY_LENGTH-1}) + { + ERR("Delay for speaker \"%s\" exceeds buffer length (%f > %d)\n", + speaker.Name.c_str(), delay, MAX_DELAY_LENGTH-1); + delay = ALfloat{MAX_DELAY_LENGTH-1}; + } + + ChanDelay[chan].Length = static_cast(delay); + ChanDelay[chan].Gain = speaker.Distance / maxdist; + TRACE("Channel %u \"%s\" distance compensation: %u samples, %f gain\n", chan, + speaker.Name.c_str(), ChanDelay[chan].Length, ChanDelay[chan].Gain); + + /* Round up to the next 4th sample, so each channel buffer starts + * 16-byte aligned. + */ + total += RoundUp(ChanDelay[chan].Length, 4); + } + + if(total > 0) + { + device->ChannelDelay.setSampleCount(total); + ChanDelay[0].Buffer = device->ChannelDelay.getSamples(); + auto set_bufptr = [](const DistanceComp::DistData &last, const DistanceComp::DistData &cur) -> DistanceComp::DistData + { + DistanceComp::DistData ret{cur}; + ret.Buffer = last.Buffer + RoundUp(last.Length, 4); + return ret; + }; + std::partial_sum(ChanDelay.begin(), ChanDelay.end(), ChanDelay.begin(), set_bufptr); + } +} + + +auto GetAmbiScales(AmbiNorm scaletype) noexcept -> const std::array& +{ + if(scaletype == AmbiNorm::FuMa) return AmbiScale::FromFuMa; + if(scaletype == AmbiNorm::SN3D) return AmbiScale::FromSN3D; + return AmbiScale::FromN3D; +} + +auto GetAmbiLayout(AmbiLayout layouttype) noexcept -> const std::array& +{ + if(layouttype == AmbiLayout::FuMa) return AmbiIndex::FromFuMa; + return AmbiIndex::FromACN; +} + + +void InitPanning(ALCdevice *device) +{ + al::span chanmap; + ALuint coeffcount{}; + + switch(device->FmtChans) + { + case DevFmtMono: + chanmap = MonoCfg; + coeffcount = 1; + break; + + case DevFmtStereo: + chanmap = StereoCfg; + coeffcount = 3; + break; + + case DevFmtQuad: + chanmap = QuadCfg; + coeffcount = 3; + break; + + case DevFmtX51: + chanmap = X51SideCfg; + coeffcount = 5; + break; + + case DevFmtX51Rear: + chanmap = X51RearCfg; + coeffcount = 5; + break; + + case DevFmtX61: + chanmap = X61Cfg; + coeffcount = 5; + break; + + case DevFmtX71: + chanmap = X71Cfg; + coeffcount = 7; + break; + + case DevFmtAmbi3D: + break; + } + + if(device->FmtChans == DevFmtAmbi3D) + { + const char *devname{device->DeviceName.c_str()}; + const std::array &acnmap = GetAmbiLayout(device->mAmbiLayout); + const std::array &n3dscale = GetAmbiScales(device->mAmbiScale); + + /* For DevFmtAmbi3D, the ambisonic order is already set. */ + const size_t count{AmbiChannelsFromOrder(device->mAmbiOrder)}; + std::transform(acnmap.begin(), acnmap.begin()+count, std::begin(device->Dry.AmbiMap), + [&n3dscale](const uint8_t &acn) noexcept -> BFChannelConfig + { return BFChannelConfig{1.0f/n3dscale[acn], acn}; } + ); + AllocChannels(device, static_cast(count), 0); + + ALfloat nfc_delay{ConfigValueFloat(devname, "decoder", "nfc-ref-delay").value_or(0.0f)}; + if(nfc_delay > 0.0f) + InitNearFieldCtrl(device, nfc_delay * SPEEDOFSOUNDMETRESPERSEC, device->mAmbiOrder, + true); + } + else + { + ChannelDec chancoeffs[MAX_OUTPUT_CHANNELS]{}; + ALuint outcount{0}; + for(size_t i{0u};i < chanmap.size();++i) + { + const ALuint idx{GetChannelIdxByName(device->RealOut, chanmap[i].ChanName)}; + if(idx == INVALID_CHANNEL_INDEX) + { + ERR("Failed to find %s channel in device\n", + GetLabelFromChannel(chanmap[i].ChanName)); + continue; + } + outcount = maxu(outcount, idx+1u); + std::copy_n(chanmap[i].Config, coeffcount, chancoeffs[idx]); + } + + /* For non-DevFmtAmbi3D, set the ambisonic order given the mixing + * channel count. Built-in speaker decoders are always 2D, so just + * reverse that calculation. + */ + device->mAmbiOrder = (coeffcount-1) / 2; + + std::transform(AmbiIndex::From2D.begin(), AmbiIndex::From2D.begin()+coeffcount, + std::begin(device->Dry.AmbiMap), + [](const uint8_t &index) noexcept { return BFChannelConfig{1.0f, index}; } + ); + AllocChannels(device, coeffcount, device->channelsFromFmt()); + + TRACE("Enabling %s-order%s ambisonic decoder\n", + (coeffcount > 5) ? "third" : + (coeffcount > 3) ? "second" : "first", + ""); + device->AmbiDecoder = BFormatDec::Create(coeffcount, + al::span{chancoeffs, outcount}); + } +} + +void InitCustomPanning(ALCdevice *device, bool hqdec, const AmbDecConf *conf, + const ALuint (&speakermap)[MAX_OUTPUT_CHANNELS]) +{ + if(!hqdec && conf->FreqBands != 1) + ERR("Basic renderer uses the high-frequency matrix as single-band (xover_freq = %.0fhz)\n", + conf->XOverFreq); + + const ALuint order{(conf->ChanMask > AMBI_2ORDER_MASK) ? 3u : + (conf->ChanMask > AMBI_1ORDER_MASK) ? 2u : 1u}; + device->mAmbiOrder = order; + + ALuint count; + if((conf->ChanMask&AMBI_PERIPHONIC_MASK)) + { + count = static_cast(AmbiChannelsFromOrder(order)); + std::transform(AmbiIndex::FromACN.begin(), AmbiIndex::FromACN.begin()+count, + std::begin(device->Dry.AmbiMap), + [](const uint8_t &index) noexcept { return BFChannelConfig{1.0f, index}; } + ); + } + else + { + count = static_cast(Ambi2DChannelsFromOrder(order)); + std::transform(AmbiIndex::From2D.begin(), AmbiIndex::From2D.begin()+count, + std::begin(device->Dry.AmbiMap), + [](const uint8_t &index) noexcept { return BFChannelConfig{1.0f, index}; } + ); + } + AllocChannels(device, count, device->channelsFromFmt()); + + TRACE("Enabling %s-band %s-order%s ambisonic decoder\n", + (!hqdec || conf->FreqBands == 1) ? "single" : "dual", + (conf->ChanMask > AMBI_2ORDER_MASK) ? "third" : + (conf->ChanMask > AMBI_1ORDER_MASK) ? "second" : "first", + (conf->ChanMask&AMBI_PERIPHONIC_MASK) ? " periphonic" : "" + ); + device->AmbiDecoder = BFormatDec::Create(conf, hqdec, count, device->Frequency, speakermap); + + auto accum_spkr_dist = std::bind(std::plus{}, _1, + std::bind(std::mem_fn(&AmbDecConf::SpeakerConf::Distance), _2)); + const float avg_dist{ + std::accumulate(conf->Speakers.begin(), conf->Speakers.end(), 0.0f, accum_spkr_dist) / + static_cast(conf->Speakers.size())}; + InitNearFieldCtrl(device, avg_dist, order, !!(conf->ChanMask&AMBI_PERIPHONIC_MASK)); + + InitDistanceComp(device, conf, speakermap); +} + +void InitHrtfPanning(ALCdevice *device) +{ + constexpr float PI{al::MathDefs::Pi()}; + constexpr float PI_2{PI / 2.0f}; + constexpr float PI_4{PI_2 / 2.0f}; + constexpr float PI3_4{PI_4 * 3.0f}; + static const float CornerElev{static_cast(std::atan2(1.0, std::sqrt(2.0)))}; + static const AngularPoint AmbiPoints1O[]{ + { EvRadians{ CornerElev}, AzRadians{ -PI_4} }, + { EvRadians{ CornerElev}, AzRadians{-PI3_4} }, + { EvRadians{ CornerElev}, AzRadians{ PI_4} }, + { EvRadians{ CornerElev}, AzRadians{ PI3_4} }, + { EvRadians{-CornerElev}, AzRadians{ -PI_4} }, + { EvRadians{-CornerElev}, AzRadians{-PI3_4} }, + { EvRadians{-CornerElev}, AzRadians{ PI_4} }, + { EvRadians{-CornerElev}, AzRadians{ PI3_4} }, + }, AmbiPoints2O[]{ + { EvRadians{ -CornerElev}, AzRadians{ -PI_4} }, + { EvRadians{ -CornerElev}, AzRadians{ -PI3_4} }, + { EvRadians{ CornerElev}, AzRadians{ -PI3_4} }, + { EvRadians{ CornerElev}, AzRadians{ PI3_4} }, + { EvRadians{ CornerElev}, AzRadians{ PI_4} }, + { EvRadians{ -CornerElev}, AzRadians{ PI_4} }, + { EvRadians{ -CornerElev}, AzRadians{ PI3_4} }, + { EvRadians{ CornerElev}, AzRadians{ -PI_4} }, + { EvRadians{-1.205932499e+00f}, AzRadians{ -PI_2} }, + { EvRadians{ 1.205932499e+00f}, AzRadians{ PI_2} }, + { EvRadians{-1.205932499e+00f}, AzRadians{ PI_2} }, + { EvRadians{ 1.205932499e+00f}, AzRadians{ -PI_2} }, + { EvRadians{ 0.0f}, AzRadians{-1.205932499e+00f} }, + { EvRadians{ 0.0f}, AzRadians{-1.935660155e+00f} }, + { EvRadians{ 0.0f}, AzRadians{ 1.205932499e+00f} }, + { EvRadians{ 0.0f}, AzRadians{ 1.935660155e+00f} }, + { EvRadians{-3.648638281e-01f}, AzRadians{ PI} }, + { EvRadians{ 3.648638281e-01f}, AzRadians{ PI} }, + { EvRadians{ 3.648638281e-01f}, AzRadians{ 0.0f} }, + { EvRadians{-3.648638281e-01f}, AzRadians{ 0.0f} }, + }; + static const float AmbiMatrix1O[][MAX_AMBI_CHANNELS]{ + { 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f }, + { 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, -1.250000000e-01f }, + { 1.250000000e-01f, -1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f }, + { 1.250000000e-01f, -1.250000000e-01f, 1.250000000e-01f, -1.250000000e-01f }, + { 1.250000000e-01f, 1.250000000e-01f, -1.250000000e-01f, 1.250000000e-01f }, + { 1.250000000e-01f, 1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f }, + { 1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f, 1.250000000e-01f }, + { 1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f }, + }, AmbiMatrix2O[][MAX_AMBI_CHANNELS]{ + { 5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, 6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, -6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, -6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, 6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, -6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, -6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, 6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, 6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f }, + { 5.000000000e-02f, 3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f }, + { 5.000000000e-02f, -3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f }, + { 5.000000000e-02f, -3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, 6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f }, + { 5.000000000e-02f, 3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, 6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f }, + { 5.000000000e-02f, 8.090169944e-02f, 0.000000000e+00f, 3.090169944e-02f, 6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f }, + { 5.000000000e-02f, 8.090169944e-02f, 0.000000000e+00f, -3.090169944e-02f, -6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f }, + { 5.000000000e-02f, -8.090169944e-02f, 0.000000000e+00f, 3.090169944e-02f, -6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f }, + { 5.000000000e-02f, -8.090169944e-02f, 0.000000000e+00f, -3.090169944e-02f, 6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f }, + { 5.000000000e-02f, 0.000000000e+00f, -3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, 6.454972244e-02f, 8.449668365e-02f }, + { 5.000000000e-02f, 0.000000000e+00f, 3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, -6.454972244e-02f, 8.449668365e-02f }, + { 5.000000000e-02f, 0.000000000e+00f, 3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, 6.454972244e-02f, 8.449668365e-02f }, + { 5.000000000e-02f, 0.000000000e+00f, -3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, -6.454972244e-02f, 8.449668365e-02f }, + }; + static const float AmbiOrderHFGain1O[MAX_AMBI_ORDER+1]{ + 2.000000000e+00f, 1.154700538e+00f + }, AmbiOrderHFGain2O[MAX_AMBI_ORDER+1]{ + 2.357022604e+00f, 1.825741858e+00f, 9.428090416e-01f + }; + + static_assert(al::size(AmbiPoints1O) == al::size(AmbiMatrix1O), "First-Order Ambisonic HRTF mismatch"); + static_assert(al::size(AmbiPoints2O) == al::size(AmbiMatrix2O), "Second-Order Ambisonic HRTF mismatch"); + + /* Don't bother with HOA when using full HRTF rendering. Nothing needs it, + * and it eases the CPU/memory load. + */ + device->mRenderMode = HrtfRender; + ALuint ambi_order{1}; + if(auto modeopt = ConfigValueStr(device->DeviceName.c_str(), nullptr, "hrtf-mode")) + { + struct HrtfModeEntry { + char name[8]; + RenderMode mode; + ALuint order; + }; + static const HrtfModeEntry hrtf_modes[]{ + { "full", HrtfRender, 1 }, + { "ambi1", NormalRender, 1 }, + { "ambi2", NormalRender, 2 }, + }; + + const char *mode{modeopt->c_str()}; + if(al::strcasecmp(mode, "basic") == 0 || al::strcasecmp(mode, "ambi3") == 0) + { + ERR("HRTF mode \"%s\" deprecated, substituting \"%s\"\n", mode, "ambi2"); + mode = "ambi2"; + } + + auto match_entry = [mode](const HrtfModeEntry &entry) -> bool + { return al::strcasecmp(mode, entry.name) == 0; }; + auto iter = std::find_if(std::begin(hrtf_modes), std::end(hrtf_modes), match_entry); + if(iter == std::end(hrtf_modes)) + ERR("Unexpected hrtf-mode: %s\n", mode); + else + { + device->mRenderMode = iter->mode; + ambi_order = iter->order; + } + } + TRACE("%u%s order %sHRTF rendering enabled, using \"%s\"\n", ambi_order, + (((ambi_order%100)/10) == 1) ? "th" : + ((ambi_order%10) == 1) ? "st" : + ((ambi_order%10) == 2) ? "nd" : + ((ambi_order%10) == 3) ? "rd" : "th", + (device->mRenderMode == HrtfRender) ? "+ Full " : "", + device->HrtfName.c_str()); + + al::span AmbiPoints{AmbiPoints1O}; + const float (*AmbiMatrix)[MAX_AMBI_CHANNELS]{AmbiMatrix1O}; + al::span AmbiOrderHFGain{AmbiOrderHFGain1O}; + if(ambi_order >= 2) + { + AmbiPoints = AmbiPoints2O; + AmbiMatrix = AmbiMatrix2O; + AmbiOrderHFGain = AmbiOrderHFGain2O; + } + device->mAmbiOrder = ambi_order; + + const size_t count{AmbiChannelsFromOrder(ambi_order)}; + device->mHrtfState = DirectHrtfState::Create(count); + + std::transform(AmbiIndex::FromACN.begin(), AmbiIndex::FromACN.begin()+count, + std::begin(device->Dry.AmbiMap), + [](const uint8_t &index) noexcept { return BFChannelConfig{1.0f, index}; } + ); + AllocChannels(device, static_cast(count), device->channelsFromFmt()); + + BuildBFormatHrtf(device->mHrtf, device->mHrtfState.get(), AmbiPoints, AmbiMatrix, + AmbiOrderHFGain); + + HrtfStore *Hrtf{device->mHrtf}; + InitNearFieldCtrl(device, Hrtf->field[0].distance, ambi_order, true); +} + +void InitUhjPanning(ALCdevice *device) +{ + /* UHJ is always 2D first-order. */ + constexpr size_t count{Ambi2DChannelsFromOrder(1)}; + + device->mAmbiOrder = 1; + + auto acnmap_end = AmbiIndex::FromFuMa.begin() + count; + std::transform(AmbiIndex::FromFuMa.begin(), acnmap_end, std::begin(device->Dry.AmbiMap), + [](const uint8_t &acn) noexcept -> BFChannelConfig + { return BFChannelConfig{1.0f/AmbiScale::FromFuMa[acn], acn}; } + ); + AllocChannels(device, ALuint{count}, device->channelsFromFmt()); +} + +} // namespace + +void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq) +{ + /* Hold the HRTF the device last used, in case it's used again. */ + HrtfStore *old_hrtf{device->mHrtf}; + + device->mHrtfState = nullptr; + device->mHrtf = nullptr; + device->HrtfName.clear(); + device->mRenderMode = NormalRender; + + if(device->FmtChans != DevFmtStereo) + { + if(old_hrtf) + old_hrtf->DecRef(); + old_hrtf = nullptr; + if(hrtf_appreq == Hrtf_Enable) + device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT; + + const char *layout{nullptr}; + switch(device->FmtChans) + { + case DevFmtQuad: layout = "quad"; break; + case DevFmtX51: /* fall-through */ + case DevFmtX51Rear: layout = "surround51"; break; + case DevFmtX61: layout = "surround61"; break; + case DevFmtX71: layout = "surround71"; break; + /* Mono, Stereo, and Ambisonics output don't use custom decoders. */ + case DevFmtMono: + case DevFmtStereo: + case DevFmtAmbi3D: + break; + } + + const char *devname{device->DeviceName.c_str()}; + ALuint speakermap[MAX_OUTPUT_CHANNELS]; + AmbDecConf *pconf{nullptr}; + AmbDecConf conf{}; + if(layout) + { + if(auto decopt = ConfigValueStr(devname, "decoder", layout)) + { + if(!conf.load(decopt->c_str())) + ERR("Failed to load layout file %s\n", decopt->c_str()); + else if(conf.Speakers.size() > MAX_OUTPUT_CHANNELS) + ERR("Unsupported speaker count %zu (max %d)\n", conf.Speakers.size(), + MAX_OUTPUT_CHANNELS); + else if(conf.ChanMask > AMBI_3ORDER_MASK) + ERR("Unsupported channel mask 0x%04x (max 0x%x)\n", conf.ChanMask, + AMBI_3ORDER_MASK); + else if(MakeSpeakerMap(device, &conf, speakermap)) + pconf = &conf; + } + } + + if(!pconf) + InitPanning(device); + else + { + int hqdec{GetConfigValueBool(devname, "decoder", "hq-mode", 1)}; + InitCustomPanning(device, !!hqdec, pconf, speakermap); + } + if(device->AmbiDecoder) + device->PostProcess = &ALCdevice::ProcessAmbiDec; + return; + } + + bool headphones{device->IsHeadphones != AL_FALSE}; + if(device->Type != Loopback) + { + if(auto modeopt = ConfigValueStr(device->DeviceName.c_str(), nullptr, "stereo-mode")) + { + const char *mode{modeopt->c_str()}; + if(al::strcasecmp(mode, "headphones") == 0) + headphones = true; + else if(al::strcasecmp(mode, "speakers") == 0) + headphones = false; + else if(al::strcasecmp(mode, "auto") != 0) + ERR("Unexpected stereo-mode: %s\n", mode); + } + } + + if(hrtf_userreq == Hrtf_Default) + { + bool usehrtf = (headphones && hrtf_appreq != Hrtf_Disable) || + (hrtf_appreq == Hrtf_Enable); + if(!usehrtf) goto no_hrtf; + + device->HrtfStatus = ALC_HRTF_ENABLED_SOFT; + if(headphones && hrtf_appreq != Hrtf_Disable) + device->HrtfStatus = ALC_HRTF_HEADPHONES_DETECTED_SOFT; + } + else + { + if(hrtf_userreq != Hrtf_Enable) + { + if(hrtf_appreq == Hrtf_Enable) + device->HrtfStatus = ALC_HRTF_DENIED_SOFT; + goto no_hrtf; + } + device->HrtfStatus = ALC_HRTF_REQUIRED_SOFT; + } + + if(device->HrtfList.empty()) + device->HrtfList = EnumerateHrtf(device->DeviceName.c_str()); + + if(hrtf_id >= 0 && static_cast(hrtf_id) < device->HrtfList.size()) + { + const char *devname{device->DeviceName.c_str()}; + const std::string &hrtfname = device->HrtfList[static_cast(hrtf_id)]; + if(HrtfStore *hrtf{GetLoadedHrtf(hrtfname, devname, device->Frequency)}) + { + device->mHrtf = hrtf; + device->HrtfName = hrtfname; + } + } + + if(!device->mHrtf) + { + const char *devname{device->DeviceName.c_str()}; + auto find_hrtf = [device,devname](const std::string &hrtfname) -> bool + { + HrtfStore *hrtf{GetLoadedHrtf(hrtfname, devname, device->Frequency)}; + if(!hrtf) return false; + device->mHrtf = hrtf; + device->HrtfName = hrtfname; + return true; + }; + std::find_if(device->HrtfList.cbegin(), device->HrtfList.cend(), find_hrtf); + } + + if(device->mHrtf) + { + if(old_hrtf) + old_hrtf->DecRef(); + old_hrtf = nullptr; + + InitHrtfPanning(device); + device->PostProcess = &ALCdevice::ProcessHrtf; + return; + } + device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT; + +no_hrtf: + if(old_hrtf) + old_hrtf->DecRef(); + old_hrtf = nullptr; + + device->mRenderMode = StereoPair; + + if(device->Type != Loopback) + { + if(auto cflevopt = ConfigValueInt(device->DeviceName.c_str(), nullptr, "cf_level")) + { + if(*cflevopt > 0 && *cflevopt <= 6) + { + device->Bs2b = al::make_unique(); + bs2b_set_params(device->Bs2b.get(), *cflevopt, + static_cast(device->Frequency)); + TRACE("BS2B enabled\n"); + InitPanning(device); + device->PostProcess = &ALCdevice::ProcessBs2b; + return; + } + } + } + + if(auto encopt = ConfigValueStr(device->DeviceName.c_str(), nullptr, "stereo-encoding")) + { + const char *mode{encopt->c_str()}; + if(al::strcasecmp(mode, "uhj") == 0) + device->mRenderMode = NormalRender; + else if(al::strcasecmp(mode, "panpot") != 0) + ERR("Unexpected stereo-encoding: %s\n", mode); + } + if(device->mRenderMode == NormalRender) + { + device->Uhj_Encoder = al::make_unique(); + TRACE("UHJ enabled\n"); + InitUhjPanning(device); + device->PostProcess = &ALCdevice::ProcessUhj; + return; + } + + TRACE("Stereo rendering\n"); + InitPanning(device); + device->PostProcess = &ALCdevice::ProcessAmbiDec; +} + + +void aluInitEffectPanning(ALeffectslot *slot, ALCdevice *device) +{ + const size_t count{AmbiChannelsFromOrder(device->mAmbiOrder)}; + slot->MixBuffer.resize(count); + slot->MixBuffer.shrink_to_fit(); + + auto acnmap_end = AmbiIndex::FromACN.begin() + count; + auto iter = std::transform(AmbiIndex::FromACN.begin(), acnmap_end, slot->Wet.AmbiMap.begin(), + [](const uint8_t &acn) noexcept -> BFChannelConfig + { return BFChannelConfig{1.0f, acn}; } + ); + std::fill(iter, slot->Wet.AmbiMap.end(), BFChannelConfig{}); + slot->Wet.Buffer = {slot->MixBuffer.data(), slot->MixBuffer.size()}; +} + + +void CalcAmbiCoeffs(const float y, const float z, const float x, const float spread, + const al::span coeffs) +{ + /* Zeroth-order */ + coeffs[0] = 1.0f; /* ACN 0 = 1 */ + /* First-order */ + coeffs[1] = 1.732050808f * y; /* ACN 1 = sqrt(3) * Y */ + coeffs[2] = 1.732050808f * z; /* ACN 2 = sqrt(3) * Z */ + coeffs[3] = 1.732050808f * x; /* ACN 3 = sqrt(3) * X */ + /* Second-order */ + const float xx{x*x}, yy{y*y}, zz{z*z}; + coeffs[4] = 3.872983346f * x * y; /* ACN 4 = sqrt(15) * X * Y */ + coeffs[5] = 3.872983346f * y * z; /* ACN 5 = sqrt(15) * Y * Z */ + coeffs[6] = 1.118033989f * (3.0f*zz - 1.0f); /* ACN 6 = sqrt(5)/2 * (3*Z*Z - 1) */ + coeffs[7] = 3.872983346f * x * z; /* ACN 7 = sqrt(15) * X * Z */ + coeffs[8] = 1.936491673f * (xx - yy); /* ACN 8 = sqrt(15)/2 * (X*X - Y*Y) */ + /* Third-order */ + coeffs[9] = 2.091650066f * y * (3.0f*xx - yy); /* ACN 9 = sqrt(35/8) * Y * (3*X*X - Y*Y) */ + coeffs[10] = 10.246950766f * z * x * y; /* ACN 10 = sqrt(105) * Z * X * Y */ + coeffs[11] = 1.620185175f * y * (5.0f*zz - 1.0f); /* ACN 11 = sqrt(21/8) * Y * (5*Z*Z - 1) */ + coeffs[12] = 1.322875656f * z * (5.0f*zz - 3.0f); /* ACN 12 = sqrt(7)/2 * Z * (5*Z*Z - 3) */ + coeffs[13] = 1.620185175f * x * (5.0f*zz - 1.0f); /* ACN 13 = sqrt(21/8) * X * (5*Z*Z - 1) */ + coeffs[14] = 5.123475383f * z * (xx - yy); /* ACN 14 = sqrt(105)/2 * Z * (X*X - Y*Y) */ + coeffs[15] = 2.091650066f * x * (xx - 3.0f*yy); /* ACN 15 = sqrt(35/8) * X * (X*X - 3*Y*Y) */ + /* Fourth-order */ + /* ACN 16 = sqrt(35)*3/2 * X * Y * (X*X - Y*Y) */ + /* ACN 17 = sqrt(35/2)*3/2 * (3*X*X - Y*Y) * Y * Z */ + /* ACN 18 = sqrt(5)*3/2 * X * Y * (7*Z*Z - 1) */ + /* ACN 19 = sqrt(5/2)*3/2 * Y * Z * (7*Z*Z - 3) */ + /* ACN 20 = 3/8 * (35*Z*Z*Z*Z - 30*Z*Z + 3) */ + /* ACN 21 = sqrt(5/2)*3/2 * X * Z * (7*Z*Z - 3) */ + /* ACN 22 = sqrt(5)*3/4 * (X*X - Y*Y) * (7*Z*Z - 1) */ + /* ACN 23 = sqrt(35/2)*3/2 * (X*X - 3*Y*Y) * X * Z */ + /* ACN 24 = sqrt(35)*3/8 * (X*X*X*X - 6*X*X*Y*Y + Y*Y*Y*Y) */ + + if(spread > 0.0f) + { + /* Implement the spread by using a spherical source that subtends the + * angle spread. See: + * http://www.ppsloan.org/publications/StupidSH36.pdf - Appendix A3 + * + * When adjusted for N3D normalization instead of SN3D, these + * calculations are: + * + * ZH0 = -sqrt(pi) * (-1+ca); + * ZH1 = 0.5*sqrt(pi) * sa*sa; + * ZH2 = -0.5*sqrt(pi) * ca*(-1+ca)*(ca+1); + * ZH3 = -0.125*sqrt(pi) * (-1+ca)*(ca+1)*(5*ca*ca - 1); + * ZH4 = -0.125*sqrt(pi) * ca*(-1+ca)*(ca+1)*(7*ca*ca - 3); + * ZH5 = -0.0625*sqrt(pi) * (-1+ca)*(ca+1)*(21*ca*ca*ca*ca - 14*ca*ca + 1); + * + * The gain of the source is compensated for size, so that the + * loudness doesn't depend on the spread. Thus: + * + * ZH0 = 1.0f; + * ZH1 = 0.5f * (ca+1.0f); + * ZH2 = 0.5f * (ca+1.0f)*ca; + * ZH3 = 0.125f * (ca+1.0f)*(5.0f*ca*ca - 1.0f); + * ZH4 = 0.125f * (ca+1.0f)*(7.0f*ca*ca - 3.0f)*ca; + * ZH5 = 0.0625f * (ca+1.0f)*(21.0f*ca*ca*ca*ca - 14.0f*ca*ca + 1.0f); + */ + const float ca{std::cos(spread * 0.5f)}; + /* Increase the source volume by up to +3dB for a full spread. */ + const float scale{std::sqrt(1.0f + spread/al::MathDefs::Tau())}; + + const float ZH0_norm{scale}; + const float ZH1_norm{scale * 0.5f * (ca+1.f)}; + const float ZH2_norm{scale * 0.5f * (ca+1.f)*ca}; + const float ZH3_norm{scale * 0.125f * (ca+1.f)*(5.f*ca*ca-1.f)}; + + /* Zeroth-order */ + coeffs[0] *= ZH0_norm; + /* First-order */ + coeffs[1] *= ZH1_norm; + coeffs[2] *= ZH1_norm; + coeffs[3] *= ZH1_norm; + /* Second-order */ + coeffs[4] *= ZH2_norm; + coeffs[5] *= ZH2_norm; + coeffs[6] *= ZH2_norm; + coeffs[7] *= ZH2_norm; + coeffs[8] *= ZH2_norm; + /* Third-order */ + coeffs[9] *= ZH3_norm; + coeffs[10] *= ZH3_norm; + coeffs[11] *= ZH3_norm; + coeffs[12] *= ZH3_norm; + coeffs[13] *= ZH3_norm; + coeffs[14] *= ZH3_norm; + coeffs[15] *= ZH3_norm; + } +} + +void ComputePanGains(const MixParams *mix, const float*RESTRICT coeffs, const float ingain, + const al::span gains) +{ + auto ambimap = mix->AmbiMap.cbegin(); + + auto iter = std::transform(ambimap, ambimap+mix->Buffer.size(), gains.begin(), + [coeffs,ingain](const BFChannelConfig &chanmap) noexcept -> float + { return chanmap.Scale * coeffs[chanmap.Index] * ingain; } + ); + std::fill(iter, gains.end(), 0.0f); +} diff --git a/alc/ringbuffer.cpp b/alc/ringbuffer.cpp new file mode 100644 index 0000000..f4146a7 --- /dev/null +++ b/alc/ringbuffer.cpp @@ -0,0 +1,236 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "ringbuffer.h" + +#include +#include +#include +#include + +#include "almalloc.h" + + +RingBufferPtr RingBuffer::Create(size_t sz, size_t elem_sz, int limit_writes) +{ + size_t power_of_two{0u}; + if(sz > 0) + { + power_of_two = sz; + power_of_two |= power_of_two>>1; + power_of_two |= power_of_two>>2; + power_of_two |= power_of_two>>4; + power_of_two |= power_of_two>>8; + power_of_two |= power_of_two>>16; +#if SIZE_MAX > UINT_MAX + power_of_two |= power_of_two>>32; +#endif + } + ++power_of_two; + if(power_of_two <= sz || power_of_two > std::numeric_limits::max()/elem_sz) + throw std::overflow_error{"Ring buffer size overflow"}; + + const size_t bufbytes{power_of_two * elem_sz}; + RingBufferPtr rb{new (FamCount{bufbytes}) RingBuffer{bufbytes}}; + rb->mWriteSize = limit_writes ? sz : (power_of_two-1); + rb->mSizeMask = power_of_two - 1; + rb->mElemSize = elem_sz; + + return rb; +} + +void RingBuffer::reset() noexcept +{ + mWritePtr.store(0, std::memory_order_relaxed); + mReadPtr.store(0, std::memory_order_relaxed); + std::fill_n(mBuffer.begin(), (mSizeMask+1)*mElemSize, al::byte{}); +} + + +size_t RingBuffer::read(void *dest, size_t cnt) noexcept +{ + const size_t free_cnt{readSpace()}; + if(free_cnt == 0) return 0; + + const size_t to_read{std::min(cnt, free_cnt)}; + size_t read_ptr{mReadPtr.load(std::memory_order_relaxed) & mSizeMask}; + + size_t n1, n2; + const size_t cnt2{read_ptr + to_read}; + if(cnt2 > mSizeMask+1) + { + n1 = mSizeMask+1 - read_ptr; + n2 = cnt2 & mSizeMask; + } + else + { + n1 = to_read; + n2 = 0; + } + + auto outiter = std::copy_n(mBuffer.begin() + read_ptr*mElemSize, n1*mElemSize, + static_cast(dest)); + read_ptr += n1; + if(n2 > 0) + { + std::copy_n(mBuffer.begin(), n2*mElemSize, outiter); + read_ptr += n2; + } + mReadPtr.store(read_ptr, std::memory_order_release); + return to_read; +} + +size_t RingBuffer::peek(void *dest, size_t cnt) const noexcept +{ + const size_t free_cnt{readSpace()}; + if(free_cnt == 0) return 0; + + const size_t to_read{std::min(cnt, free_cnt)}; + size_t read_ptr{mReadPtr.load(std::memory_order_relaxed) & mSizeMask}; + + size_t n1, n2; + const size_t cnt2{read_ptr + to_read}; + if(cnt2 > mSizeMask+1) + { + n1 = mSizeMask+1 - read_ptr; + n2 = cnt2 & mSizeMask; + } + else + { + n1 = to_read; + n2 = 0; + } + + auto outiter = std::copy_n(mBuffer.begin() + read_ptr*mElemSize, n1*mElemSize, + static_cast(dest)); + if(n2 > 0) + std::copy_n(mBuffer.begin(), n2*mElemSize, outiter); + return to_read; +} + +size_t RingBuffer::write(const void *src, size_t cnt) noexcept +{ + const size_t free_cnt{writeSpace()}; + if(free_cnt == 0) return 0; + + const size_t to_write{std::min(cnt, free_cnt)}; + size_t write_ptr{mWritePtr.load(std::memory_order_relaxed) & mSizeMask}; + + size_t n1, n2; + const size_t cnt2{write_ptr + to_write}; + if(cnt2 > mSizeMask+1) + { + n1 = mSizeMask+1 - write_ptr; + n2 = cnt2 & mSizeMask; + } + else + { + n1 = to_write; + n2 = 0; + } + + auto srcbytes = static_cast(src); + std::copy_n(srcbytes, n1*mElemSize, mBuffer.begin() + write_ptr*mElemSize); + write_ptr += n1; + if(n2 > 0) + { + std::copy_n(srcbytes + n1*mElemSize, n2*mElemSize, mBuffer.begin()); + write_ptr += n2; + } + mWritePtr.store(write_ptr, std::memory_order_release); + return to_write; +} + + +void RingBuffer::readAdvance(size_t cnt) noexcept +{ + mReadPtr.fetch_add(cnt, std::memory_order_acq_rel); +} + +void RingBuffer::writeAdvance(size_t cnt) noexcept +{ + mWritePtr.fetch_add(cnt, std::memory_order_acq_rel); +} + + +ll_ringbuffer_data_pair RingBuffer::getReadVector() const noexcept +{ + ll_ringbuffer_data_pair ret; + + size_t w{mWritePtr.load(std::memory_order_acquire)}; + size_t r{mReadPtr.load(std::memory_order_acquire)}; + w &= mSizeMask; + r &= mSizeMask; + const size_t free_cnt{(w-r) & mSizeMask}; + + const size_t cnt2{r + free_cnt}; + if(cnt2 > mSizeMask+1) + { + /* Two part vector: the rest of the buffer after the current read ptr, + * plus some from the start of the buffer. */ + ret.first.buf = const_cast(mBuffer.data() + r*mElemSize); + ret.first.len = mSizeMask+1 - r; + ret.second.buf = const_cast(mBuffer.data()); + ret.second.len = cnt2 & mSizeMask; + } + else + { + /* Single part vector: just the rest of the buffer */ + ret.first.buf = const_cast(mBuffer.data() + r*mElemSize); + ret.first.len = free_cnt; + ret.second.buf = nullptr; + ret.second.len = 0; + } + + return ret; +} + +ll_ringbuffer_data_pair RingBuffer::getWriteVector() const noexcept +{ + ll_ringbuffer_data_pair ret; + + size_t w{mWritePtr.load(std::memory_order_acquire)}; + size_t r{mReadPtr.load(std::memory_order_acquire) + mWriteSize - mSizeMask}; + w &= mSizeMask; + r &= mSizeMask; + const size_t free_cnt{(r-w-1) & mSizeMask}; + + const size_t cnt2{w + free_cnt}; + if(cnt2 > mSizeMask+1) + { + /* Two part vector: the rest of the buffer after the current write ptr, + * plus some from the start of the buffer. */ + ret.first.buf = const_cast(mBuffer.data() + w*mElemSize); + ret.first.len = mSizeMask+1 - w; + ret.second.buf = const_cast(mBuffer.data()); + ret.second.len = cnt2 & mSizeMask; + } + else + { + ret.first.buf = const_cast(mBuffer.data() + w*mElemSize); + ret.first.len = free_cnt; + ret.second.buf = nullptr; + ret.second.len = 0; + } + + return ret; +} diff --git a/alc/ringbuffer.h b/alc/ringbuffer.h new file mode 100644 index 0000000..32fb951 --- /dev/null +++ b/alc/ringbuffer.h @@ -0,0 +1,111 @@ +#ifndef RINGBUFFER_H +#define RINGBUFFER_H + +#include + +#include +#include +#include + +#include "albyte.h" +#include "almalloc.h" + + +/* NOTE: This lockless ringbuffer implementation is copied from JACK, extended + * to include an element size. Consequently, parameters and return values for a + * size or count is in 'elements', not bytes. Additionally, it only supports + * single-consumer/single-provider operation. + */ + +struct ll_ringbuffer_data { + al::byte *buf; + size_t len; +}; +using ll_ringbuffer_data_pair = std::pair; + + +struct RingBuffer { +private: + std::atomic mWritePtr{0u}; + std::atomic mReadPtr{0u}; + size_t mWriteSize{0u}; + size_t mSizeMask{0u}; + size_t mElemSize{0u}; + + al::FlexArray mBuffer; + +public: + RingBuffer(const size_t count) : mBuffer{count} { } + + /** Reset the read and write pointers to zero. This is not thread safe. */ + void reset() noexcept; + + /** + * The non-copying data reader. Returns two ringbuffer data pointers that + * hold the current readable data. If the readable data is in one segment + * the second segment has zero length. + */ + ll_ringbuffer_data_pair getReadVector() const noexcept; + /** + * The non-copying data writer. Returns two ringbuffer data pointers that + * hold the current writeable data. If the writeable data is in one segment + * the second segment has zero length. + */ + ll_ringbuffer_data_pair getWriteVector() const noexcept; + + /** + * Return the number of elements available for reading. This is the number + * of elements in front of the read pointer and behind the write pointer. + */ + size_t readSpace() const noexcept + { + const size_t w{mWritePtr.load(std::memory_order_acquire)}; + const size_t r{mReadPtr.load(std::memory_order_acquire)}; + return (w-r) & mSizeMask; + } + + /** + * The copying data reader. Copy at most `cnt' elements into `dest'. + * Returns the actual number of elements copied. + */ + size_t read(void *dest, size_t cnt) noexcept; + /** + * The copying data reader w/o read pointer advance. Copy at most `cnt' + * elements into `dest'. Returns the actual number of elements copied. + */ + size_t peek(void *dest, size_t cnt) const noexcept; + /** Advance the read pointer `cnt' places. */ + void readAdvance(size_t cnt) noexcept; + + /** + * Return the number of elements available for writing. This is the number + * of elements in front of the write pointer and behind the read pointer. + */ + size_t writeSpace() const noexcept + { + const size_t w{mWritePtr.load(std::memory_order_acquire)}; + const size_t r{mReadPtr.load(std::memory_order_acquire) + mWriteSize - mSizeMask}; + return (r-w-1) & mSizeMask; + } + + /** + * The copying data writer. Copy at most `cnt' elements from `src'. Returns + * the actual number of elements copied. + */ + size_t write(const void *src, size_t cnt) noexcept; + /** Advance the write pointer `cnt' places. */ + void writeAdvance(size_t cnt) noexcept; + + /** + * Create a new ringbuffer to hold at least `sz' elements of `elem_sz' + * bytes. The number of elements is rounded up to the next power of two + * (even if it is already a power of two, to ensure the requested amount + * can be written). + */ + static std::unique_ptr Create(size_t sz, size_t elem_sz, int limit_writes); + + DEF_FAM_NEWDEL(RingBuffer, mBuffer) +}; +using RingBufferPtr = std::unique_ptr; + +#endif /* RINGBUFFER_H */ diff --git a/alc/uhjfilter.cpp b/alc/uhjfilter.cpp new file mode 100644 index 0000000..7d01a91 --- /dev/null +++ b/alc/uhjfilter.cpp @@ -0,0 +1,138 @@ + +#include "config.h" + +#include "uhjfilter.h" + +#include +#include + +#include "AL/al.h" + +#include "alnumeric.h" +#include "opthelpers.h" + + +namespace { + +/* This is the maximum number of samples processed for each inner loop + * iteration. */ +#define MAX_UPDATE_SAMPLES 128 + + +constexpr ALfloat Filter1CoeffSqr[4] = { + 0.479400865589f, 0.876218493539f, 0.976597589508f, 0.997499255936f +}; +constexpr ALfloat Filter2CoeffSqr[4] = { + 0.161758498368f, 0.733028932341f, 0.945349700329f, 0.990599156685f +}; + +void allpass_process(AllPassState *state, ALfloat *dst, const ALfloat *src, const ALfloat aa, + const size_t todo) +{ + ALfloat z1{state->z[0]}; + ALfloat z2{state->z[1]}; + auto proc_sample = [aa,&z1,&z2](const ALfloat input) noexcept -> ALfloat + { + const ALfloat output{input*aa + z1}; + z1 = z2; z2 = output*aa - input; + return output; + }; + std::transform(src, src+todo, dst, proc_sample); + state->z[0] = z1; + state->z[1] = z2; +} + +} // namespace + + +/* NOTE: There seems to be a bit of an inconsistency in how this encoding is + * supposed to work. Some references, such as + * + * http://members.tripod.com/martin_leese/Ambisonic/UHJ_file_format.html + * + * specify a pre-scaling of sqrt(2) on the W channel input, while other + * references, such as + * + * https://en.wikipedia.org/wiki/Ambisonic_UHJ_format#Encoding.5B1.5D + * and + * https://wiki.xiph.org/Ambisonics#UHJ_format + * + * do not. The sqrt(2) scaling is in line with B-Format decoder coefficients + * which include such a scaling for the W channel input, however the original + * source for this equation is a 1985 paper by Michael Gerzon, which does not + * apparently include the scaling. Applying the extra scaling creates a louder + * result with a narrower stereo image compared to not scaling, and I don't + * know which is the intended result. + */ + +void Uhj2Encoder::encode(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, + FloatBufferLine *InSamples, const size_t SamplesToDo) +{ + alignas(16) ALfloat D[MAX_UPDATE_SAMPLES], S[MAX_UPDATE_SAMPLES]; + alignas(16) ALfloat temp[MAX_UPDATE_SAMPLES]; + + ASSUME(SamplesToDo > 0); + + auto winput = InSamples[0].cbegin(); + auto xinput = InSamples[1].cbegin(); + auto yinput = InSamples[2].cbegin(); + for(size_t base{0};base < SamplesToDo;) + { + const size_t todo{minz(SamplesToDo - base, MAX_UPDATE_SAMPLES)}; + ASSUME(todo > 0); + + /* D = 0.6554516*Y */ + std::transform(yinput, yinput+todo, std::begin(temp), + [](const float y) noexcept -> float { return 0.6554516f*y; }); + allpass_process(&mFilter1_Y[0], temp, temp, Filter1CoeffSqr[0], todo); + allpass_process(&mFilter1_Y[1], temp, temp, Filter1CoeffSqr[1], todo); + allpass_process(&mFilter1_Y[2], temp, temp, Filter1CoeffSqr[2], todo); + allpass_process(&mFilter1_Y[3], temp, temp, Filter1CoeffSqr[3], todo); + /* NOTE: Filter1 requires a 1 sample delay for the final output, so + * take the last processed sample from the previous run as the first + * output sample. + */ + D[0] = mLastY; + for(size_t i{1};i < todo;i++) + D[i] = temp[i-1]; + mLastY = temp[todo-1]; + + /* D += j(-0.3420201*W + 0.5098604*X) */ + std::transform(winput, winput+todo, xinput, std::begin(temp), + [](const float w, const float x) noexcept -> float + { return -0.3420201f*w + 0.5098604f*x; }); + allpass_process(&mFilter2_WX[0], temp, temp, Filter2CoeffSqr[0], todo); + allpass_process(&mFilter2_WX[1], temp, temp, Filter2CoeffSqr[1], todo); + allpass_process(&mFilter2_WX[2], temp, temp, Filter2CoeffSqr[2], todo); + allpass_process(&mFilter2_WX[3], temp, temp, Filter2CoeffSqr[3], todo); + for(size_t i{0};i < todo;i++) + D[i] += temp[i]; + + /* S = 0.9396926*W + 0.1855740*X */ + std::transform(winput, winput+todo, xinput, std::begin(temp), + [](const float w, const float x) noexcept -> float + { return 0.9396926f*w + 0.1855740f*x; }); + allpass_process(&mFilter1_WX[0], temp, temp, Filter1CoeffSqr[0], todo); + allpass_process(&mFilter1_WX[1], temp, temp, Filter1CoeffSqr[1], todo); + allpass_process(&mFilter1_WX[2], temp, temp, Filter1CoeffSqr[2], todo); + allpass_process(&mFilter1_WX[3], temp, temp, Filter1CoeffSqr[3], todo); + S[0] = mLastWX; + for(size_t i{1};i < todo;i++) + S[i] = temp[i-1]; + mLastWX = temp[todo-1]; + + /* Left = (S + D)/2.0 */ + ALfloat *RESTRICT left = al::assume_aligned<16>(LeftOut.data()+base); + for(size_t i{0};i < todo;i++) + left[i] += (S[i] + D[i]) * 0.5f; + /* Right = (S - D)/2.0 */ + ALfloat *RESTRICT right = al::assume_aligned<16>(RightOut.data()+base); + for(size_t i{0};i < todo;i++) + right[i] += (S[i] - D[i]) * 0.5f; + + winput += todo; + xinput += todo; + yinput += todo; + base += todo; + } +} diff --git a/Alc/uhjfilter.h b/alc/uhjfilter.h similarity index 66% rename from Alc/uhjfilter.h rename to alc/uhjfilter.h index e773e0a..88d3035 100644 --- a/Alc/uhjfilter.h +++ b/alc/uhjfilter.h @@ -3,11 +3,13 @@ #include "AL/al.h" -#include "alMain.h" +#include "alcmain.h" +#include "almalloc.h" -typedef struct AllPassState { - ALfloat z[2]; -} AllPassState; + +struct AllPassState { + ALfloat z[2]{0.0f, 0.0f}; +}; /* Encoding 2-channel UHJ from B-Format is done as: * @@ -34,16 +36,19 @@ typedef struct AllPassState { * other inputs. */ -typedef struct Uhj2Encoder { - AllPassState Filter1_Y[4]; - AllPassState Filter2_WX[4]; - AllPassState Filter1_WX[4]; - ALfloat LastY, LastWX; -} Uhj2Encoder; +struct Uhj2Encoder { + AllPassState mFilter1_Y[4]; + AllPassState mFilter2_WX[4]; + AllPassState mFilter1_WX[4]; + ALfloat mLastY{0.0f}, mLastWX{0.0f}; -/* Encodes a 2-channel UHJ (stereo-compatible) signal from a B-Format input - * signal. The input must use FuMa channel ordering and scaling. - */ -void EncodeUhj2(Uhj2Encoder *enc, ALfloat *restrict LeftOut, ALfloat *restrict RightOut, ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo); + /* Encodes a 2-channel UHJ (stereo-compatible) signal from a B-Format input + * signal. The input must use FuMa channel ordering and scaling. + */ + void encode(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, FloatBufferLine *InSamples, + const size_t SamplesToDo); + + DEF_NEWDEL(Uhj2Encoder) +}; #endif /* UHJFILTER_H */ diff --git a/alc/uiddefs.cpp b/alc/uiddefs.cpp new file mode 100644 index 0000000..244c01a --- /dev/null +++ b/alc/uiddefs.cpp @@ -0,0 +1,37 @@ + +#include "config.h" + + +#ifndef AL_NO_UID_DEFS + +#if defined(HAVE_GUIDDEF_H) || defined(HAVE_INITGUID_H) +#define INITGUID +#include +#ifdef HAVE_GUIDDEF_H +#include +#else +#include +#endif + +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80,0x00, 0x00,0xaa,0x00,0x38,0x9b,0x71); +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80,0x00, 0x00,0xaa,0x00,0x38,0x9b,0x71); + +DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf,0x08, 0x00,0xa0,0xc9,0x25,0xcd,0x16); + +DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e); +DEFINE_GUID(IID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6); +DEFINE_GUID(IID_IAudioClient, 0x1cb9ad4c, 0xdbfa, 0x4c32, 0xb1,0x78, 0xc2,0xf5,0x68,0xa7,0x03,0xb2); +DEFINE_GUID(IID_IAudioRenderClient, 0xf294acfc, 0x3146, 0x4483, 0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2); +DEFINE_GUID(IID_IAudioCaptureClient, 0xc8adbd64, 0xe71e, 0x48a0, 0xa4,0xde, 0x18,0x5c,0x39,0x5c,0xd3,0x17); + +#ifdef HAVE_WASAPI +#include +#include +#include +DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FormFactor, 0x1da5d803, 0xd492, 0x4edd, 0x8c,0x23, 0xe0,0xc0,0xff,0xee,0x7f,0x0e, 0); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23,0xe0, 0xc0,0xff,0xee,0x7f,0x0e, 4 ); +#endif +#endif + +#endif /* AL_NO_UID_DEFS */ diff --git a/alc/voice.cpp b/alc/voice.cpp new file mode 100644 index 0000000..14b3607 --- /dev/null +++ b/alc/voice.cpp @@ -0,0 +1,837 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "voice.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AL/al.h" +#include "AL/alc.h" + +#include "al/buffer.h" +#include "al/event.h" +#include "al/source.h" +#include "alcmain.h" +#include "albyte.h" +#include "alconfig.h" +#include "alcontext.h" +#include "alnumeric.h" +#include "aloptional.h" +#include "alspan.h" +#include "alstring.h" +#include "alu.h" +#include "cpu_caps.h" +#include "devformat.h" +#include "filters/biquad.h" +#include "filters/nfc.h" +#include "filters/splitter.h" +#include "hrtf.h" +#include "inprogext.h" +#include "logging.h" +#include "mixer/defs.h" +#include "opthelpers.h" +#include "ringbuffer.h" +#include "threads.h" +#include "vector.h" + + +static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, + "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); + + +Resampler ResamplerDefault{Resampler::Linear}; + +namespace { + +using HrtfMixerFunc = void(*)(const ALfloat *InSamples, float2 *AccumSamples, const ALuint IrSize, + const MixHrtfFilter *hrtfparams, const size_t BufferSize); +using HrtfMixerBlendFunc = void(*)(const ALfloat *InSamples, float2 *AccumSamples, + const ALuint IrSize, const HrtfFilter *oldparams, const MixHrtfFilter *newparams, + const size_t BufferSize); + +HrtfMixerFunc MixHrtfSamples = MixHrtf_; +HrtfMixerBlendFunc MixHrtfBlendSamples = MixHrtfBlend_; + +inline HrtfMixerFunc SelectHrtfMixer() +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixHrtf_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixHrtf_; +#endif + return MixHrtf_; +} + +inline HrtfMixerBlendFunc SelectHrtfBlendMixer() +{ +#ifdef HAVE_NEON + if((CPUCapFlags&CPU_CAP_NEON)) + return MixHrtfBlend_; +#endif +#ifdef HAVE_SSE + if((CPUCapFlags&CPU_CAP_SSE)) + return MixHrtfBlend_; +#endif + return MixHrtfBlend_; +} + +} // namespace + + +void aluInitMixer() +{ + if(auto resopt = ConfigValueStr(nullptr, nullptr, "resampler")) + { + struct ResamplerEntry { + const char name[16]; + const Resampler resampler; + }; + constexpr ResamplerEntry ResamplerList[]{ + { "none", Resampler::Point }, + { "point", Resampler::Point }, + { "cubic", Resampler::Cubic }, + { "bsinc12", Resampler::BSinc12 }, + { "fast_bsinc12", Resampler::FastBSinc12 }, + { "bsinc24", Resampler::BSinc24 }, + { "fast_bsinc24", Resampler::FastBSinc24 }, + }; + + const char *str{resopt->c_str()}; + if(al::strcasecmp(str, "bsinc") == 0) + { + WARN("Resampler option \"%s\" is deprecated, using bsinc12\n", str); + str = "bsinc12"; + } + else if(al::strcasecmp(str, "sinc4") == 0 || al::strcasecmp(str, "sinc8") == 0) + { + WARN("Resampler option \"%s\" is deprecated, using cubic\n", str); + str = "cubic"; + } + + auto iter = std::find_if(std::begin(ResamplerList), std::end(ResamplerList), + [str](const ResamplerEntry &entry) -> bool + { return al::strcasecmp(str, entry.name) == 0; }); + if(iter == std::end(ResamplerList)) + ERR("Invalid resampler: %s\n", str); + else + ResamplerDefault = iter->resampler; + } + + MixHrtfBlendSamples = SelectHrtfBlendMixer(); + MixHrtfSamples = SelectHrtfMixer(); +} + + +namespace { + +/* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a + * signed 16-bit sample */ +constexpr ALshort muLawDecompressionTable[256] = { + -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956, + -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764, + -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412, + -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316, + -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, + -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, + -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, + -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, + -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, + -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, + -876, -844, -812, -780, -748, -716, -684, -652, + -620, -588, -556, -524, -492, -460, -428, -396, + -372, -356, -340, -324, -308, -292, -276, -260, + -244, -228, -212, -196, -180, -164, -148, -132, + -120, -112, -104, -96, -88, -80, -72, -64, + -56, -48, -40, -32, -24, -16, -8, 0, + 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, + 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, + 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, + 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, + 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, + 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, + 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, + 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, + 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, + 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, + 876, 844, 812, 780, 748, 716, 684, 652, + 620, 588, 556, 524, 492, 460, 428, 396, + 372, 356, 340, 324, 308, 292, 276, 260, + 244, 228, 212, 196, 180, 164, 148, 132, + 120, 112, 104, 96, 88, 80, 72, 64, + 56, 48, 40, 32, 24, 16, 8, 0 +}; + +/* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a + * signed 16-bit sample */ +constexpr ALshort aLawDecompressionTable[256] = { + -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, + -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, + -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, + -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, + -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, + -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, + -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, + -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, + -344, -328, -376, -360, -280, -264, -312, -296, + -472, -456, -504, -488, -408, -392, -440, -424, + -88, -72, -120, -104, -24, -8, -56, -40, + -216, -200, -248, -232, -152, -136, -184, -168, + -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, + -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, -592, + -944, -912, -1008, -976, -816, -784, -880, -848, + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848 +}; + +template +struct FmtTypeTraits { }; + +template<> +struct FmtTypeTraits { + using Type = ALubyte; + static constexpr inline float to_float(const Type val) noexcept + { return val*(1.0f/128.0f) - 1.0f; } +}; +template<> +struct FmtTypeTraits { + using Type = ALshort; + static constexpr inline float to_float(const Type val) noexcept { return val*(1.0f/32768.0f); } +}; +template<> +struct FmtTypeTraits { + using Type = ALfloat; + static constexpr inline float to_float(const Type val) noexcept { return val; } +}; +template<> +struct FmtTypeTraits { + using Type = ALdouble; + static constexpr inline float to_float(const Type val) noexcept + { return static_cast(val); } +}; +template<> +struct FmtTypeTraits { + using Type = ALubyte; + static constexpr inline float to_float(const Type val) noexcept + { return muLawDecompressionTable[val] * (1.0f/32768.0f); } +}; +template<> +struct FmtTypeTraits { + using Type = ALubyte; + static constexpr inline float to_float(const Type val) noexcept + { return aLawDecompressionTable[val] * (1.0f/32768.0f); } +}; + + +void SendSourceStoppedEvent(ALCcontext *context, ALuint id) +{ + RingBuffer *ring{context->mAsyncEvents.get()}; + auto evt_vec = ring->getWriteVector(); + if(evt_vec.first.len < 1) return; + + AsyncEvent *evt{new (evt_vec.first.buf) AsyncEvent{EventType_SourceStateChange}}; + evt->u.srcstate.id = id; + evt->u.srcstate.state = AL_STOPPED; + + ring->writeAdvance(1); +} + + +const float *DoFilters(BiquadFilter *lpfilter, BiquadFilter *hpfilter, float *dst, + const al::span src, int type) +{ + switch(type) + { + case AF_None: + lpfilter->clear(); + hpfilter->clear(); + break; + + case AF_LowPass: + lpfilter->process(src, dst); + hpfilter->clear(); + return dst; + case AF_HighPass: + lpfilter->clear(); + hpfilter->process(src, dst); + return dst; + + case AF_BandPass: + lpfilter->process(src, dst); + hpfilter->process({dst, src.size()}, dst); + return dst; + } + return src.data(); +} + + +template +inline void LoadSampleArray(ALfloat *RESTRICT dst, const al::byte *src, const size_t srcstep, + const size_t samples) noexcept +{ + using SampleType = typename FmtTypeTraits::Type; + + const SampleType *RESTRICT ssrc{reinterpret_cast(src)}; + for(size_t i{0u};i < samples;i++) + dst[i] = FmtTypeTraits::to_float(ssrc[i*srcstep]); +} + +void LoadSamples(ALfloat *RESTRICT dst, const al::byte *src, const size_t srcstep, FmtType srctype, + const size_t samples) noexcept +{ +#define HANDLE_FMT(T) case T: LoadSampleArray(dst, src, srcstep, samples); break + switch(srctype) + { + HANDLE_FMT(FmtUByte); + HANDLE_FMT(FmtShort); + HANDLE_FMT(FmtFloat); + HANDLE_FMT(FmtDouble); + HANDLE_FMT(FmtMulaw); + HANDLE_FMT(FmtAlaw); + } +#undef HANDLE_FMT +} + +ALfloat *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&BufferLoopItem, + const size_t NumChannels, const size_t SampleSize, const size_t chan, size_t DataPosInt, + al::span SrcBuffer) +{ + const ALbuffer *Buffer{BufferListItem->mBuffer}; + const ALuint LoopStart{Buffer->LoopStart}; + const ALuint LoopEnd{Buffer->LoopEnd}; + ASSUME(LoopEnd > LoopStart); + + /* If current pos is beyond the loop range, do not loop */ + if(!BufferLoopItem || DataPosInt >= LoopEnd) + { + BufferLoopItem = nullptr; + + /* Load what's left to play from the buffer */ + const size_t DataRem{minz(SrcBuffer.size(), Buffer->SampleLen-DataPosInt)}; + + const al::byte *Data{Buffer->mData.data()}; + Data += (DataPosInt*NumChannels + chan)*SampleSize; + + LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataRem); + SrcBuffer = SrcBuffer.subspan(DataRem); + } + else + { + /* Load what's left of this loop iteration */ + const size_t DataRem{minz(SrcBuffer.size(), LoopEnd-DataPosInt)}; + + const al::byte *Data{Buffer->mData.data()}; + Data += (DataPosInt*NumChannels + chan)*SampleSize; + + LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataRem); + SrcBuffer = SrcBuffer.subspan(DataRem); + + /* Load any repeats of the loop we can to fill the buffer. */ + const auto LoopSize = static_cast(LoopEnd - LoopStart); + while(!SrcBuffer.empty()) + { + const size_t DataSize{minz(SrcBuffer.size(), LoopSize)}; + + Data = Buffer->mData.data() + (LoopStart*NumChannels + chan)*SampleSize; + + LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataSize); + SrcBuffer = SrcBuffer.subspan(DataSize); + } + } + return SrcBuffer.begin(); +} + +ALfloat *LoadBufferQueue(ALbufferlistitem *BufferListItem, ALbufferlistitem *BufferLoopItem, + const size_t NumChannels, const size_t SampleSize, const size_t chan, size_t DataPosInt, + al::span SrcBuffer) +{ + /* Crawl the buffer queue to fill in the temp buffer */ + while(BufferListItem && !SrcBuffer.empty()) + { + ALbuffer *Buffer{BufferListItem->mBuffer}; + if(!(Buffer && DataPosInt < Buffer->SampleLen)) + { + if(Buffer) DataPosInt -= Buffer->SampleLen; + BufferListItem = BufferListItem->mNext.load(std::memory_order_acquire); + if(!BufferListItem) BufferListItem = BufferLoopItem; + continue; + } + + const size_t DataSize{minz(SrcBuffer.size(), Buffer->SampleLen-DataPosInt)}; + + const al::byte *Data{Buffer->mData.data()}; + Data += (DataPosInt*NumChannels + chan)*SampleSize; + + LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mFmtType, DataSize); + SrcBuffer = SrcBuffer.subspan(DataSize); + if(SrcBuffer.empty()) break; + + DataPosInt = 0; + BufferListItem = BufferListItem->mNext.load(std::memory_order_acquire); + if(!BufferListItem) BufferListItem = BufferLoopItem; + } + + return SrcBuffer.begin(); +} + + +void DoHrtfMix(const float *samples, const ALuint DstBufferSize, DirectParams &parms, + const float TargetGain, const ALuint Counter, ALuint OutPos, const ALuint IrSize, + ALCdevice *Device) +{ + auto &HrtfSamples = Device->HrtfSourceData; + auto &AccumSamples = Device->HrtfAccumData; + + /* Copy the HRTF history and new input samples into a temp buffer. */ + auto src_iter = std::copy(parms.Hrtf.History.begin(), parms.Hrtf.History.end(), + std::begin(HrtfSamples)); + std::copy_n(samples, DstBufferSize, src_iter); + /* Copy the last used samples back into the history buffer for later. */ + std::copy_n(std::begin(HrtfSamples) + DstBufferSize, parms.Hrtf.History.size(), + parms.Hrtf.History.begin()); + + /* If fading, the old gain is not silence, and this is the first mixing + * pass, fade between the IRs. + */ + ALuint fademix{0u}; + if(Counter && parms.Hrtf.Old.Gain > GAIN_SILENCE_THRESHOLD && OutPos == 0) + { + fademix = minu(DstBufferSize, 128); + + float gain{TargetGain}; + + /* The new coefficients need to fade in completely since they're + * replacing the old ones. To keep the gain fading consistent, + * interpolate between the old and new target gains given how much of + * the fade time this mix handles. + */ + if LIKELY(Counter > fademix) + { + const ALfloat a{static_cast(fademix) / static_cast(Counter)}; + gain = lerp(parms.Hrtf.Old.Gain, TargetGain, a); + } + MixHrtfFilter hrtfparams; + hrtfparams.Coeffs = &parms.Hrtf.Target.Coeffs; + hrtfparams.Delay[0] = parms.Hrtf.Target.Delay[0]; + hrtfparams.Delay[1] = parms.Hrtf.Target.Delay[1]; + hrtfparams.Gain = 0.0f; + hrtfparams.GainStep = gain / static_cast(fademix); + + MixHrtfBlendSamples(HrtfSamples, AccumSamples+OutPos, IrSize, &parms.Hrtf.Old, &hrtfparams, + fademix); + /* Update the old parameters with the result. */ + parms.Hrtf.Old = parms.Hrtf.Target; + parms.Hrtf.Old.Gain = gain; + OutPos += fademix; + } + + if LIKELY(fademix < DstBufferSize) + { + const ALuint todo{DstBufferSize - fademix}; + float gain{TargetGain}; + + /* Interpolate the target gain if the gain fading lasts longer than + * this mix. + */ + if(Counter > DstBufferSize) + { + const float a{static_cast(todo) / static_cast(Counter-fademix)}; + gain = lerp(parms.Hrtf.Old.Gain, TargetGain, a); + } + + MixHrtfFilter hrtfparams; + hrtfparams.Coeffs = &parms.Hrtf.Target.Coeffs; + hrtfparams.Delay[0] = parms.Hrtf.Target.Delay[0]; + hrtfparams.Delay[1] = parms.Hrtf.Target.Delay[1]; + hrtfparams.Gain = parms.Hrtf.Old.Gain; + hrtfparams.GainStep = (gain - parms.Hrtf.Old.Gain) / static_cast(todo); + MixHrtfSamples(HrtfSamples+fademix, AccumSamples+OutPos, IrSize, &hrtfparams, todo); + /* Store the now-current gain for next time. */ + parms.Hrtf.Old.Gain = gain; + } +} + +void DoNfcMix(const al::span samples, FloatBufferLine *OutBuffer, DirectParams &parms, + const float *TargetGains, const ALuint Counter, const ALuint OutPos, ALCdevice *Device) +{ + using FilterProc = void (NfcFilter::*)(const al::span, float*); + static constexpr FilterProc NfcProcess[MAX_AMBI_ORDER+1]{ + nullptr, &NfcFilter::process1, &NfcFilter::process2, &NfcFilter::process3}; + + float *CurrentGains{parms.Gains.Current.data()}; + MixSamples(samples, {OutBuffer, 1u}, CurrentGains, TargetGains, Counter, OutPos); + ++OutBuffer; + ++CurrentGains; + ++TargetGains; + + const al::span nfcsamples{Device->NfcSampleData, samples.size()}; + size_t order{1}; + while(const size_t chancount{Device->NumChannelsPerOrder[order]}) + { + (parms.NFCtrlFilter.*NfcProcess[order])(samples, nfcsamples.data()); + MixSamples(nfcsamples, {OutBuffer, chancount}, CurrentGains, TargetGains, Counter, OutPos); + OutBuffer += chancount; + CurrentGains += chancount; + TargetGains += chancount; + if(++order == MAX_AMBI_ORDER+1) + break; + } +} + +} // namespace + +void ALvoice::mix(const State vstate, ALCcontext *Context, const ALuint SamplesToDo) +{ + static constexpr std::array SilentTarget{}; + + ASSUME(SamplesToDo > 0); + + /* Get voice info */ + const bool isstatic{(mFlags&VOICE_IS_STATIC) != 0}; + ALuint DataPosInt{mPosition.load(std::memory_order_relaxed)}; + ALuint DataPosFrac{mPositionFrac.load(std::memory_order_relaxed)}; + ALbufferlistitem *BufferListItem{mCurrentBuffer.load(std::memory_order_relaxed)}; + ALbufferlistitem *BufferLoopItem{mLoopBuffer.load(std::memory_order_relaxed)}; + const ALuint NumChannels{mNumChannels}; + const ALuint SampleSize{mSampleSize}; + const ALuint increment{mStep}; + if UNLIKELY(increment < 1) + { + /* If the voice is supposed to be stopping but can't be mixed, just + * stop it before bailing. + */ + if(vstate == ALvoice::Stopping) + mPlayState.store(ALvoice::Stopped, std::memory_order_release); + return; + } + + ASSUME(NumChannels > 0); + ASSUME(SampleSize > 0); + ASSUME(increment > 0); + + ALCdevice *Device{Context->mDevice.get()}; + const ALuint NumSends{Device->NumAuxSends}; + const ALuint IrSize{Device->mHrtf ? Device->mHrtf->irSize : 0}; + + ResamplerFunc Resample{(increment == FRACTIONONE && DataPosFrac == 0) ? + Resample_ : mResampler}; + + ALuint Counter{(mFlags&VOICE_IS_FADING) ? SamplesToDo : 0}; + if(!Counter) + { + /* No fading, just overwrite the old/current params. */ + for(ALuint chan{0};chan < NumChannels;chan++) + { + ChannelData &chandata = mChans[chan]; + { + DirectParams &parms = chandata.mDryParams; + if(!(mFlags&VOICE_HAS_HRTF)) + parms.Gains.Current = parms.Gains.Target; + else + parms.Hrtf.Old = parms.Hrtf.Target; + } + for(ALuint send{0};send < NumSends;++send) + { + if(mSend[send].Buffer.empty()) + continue; + + SendParams &parms = chandata.mWetParams[send]; + parms.Gains.Current = parms.Gains.Target; + } + } + } + else if((mFlags&VOICE_HAS_HRTF)) + { + for(ALuint chan{0};chan < NumChannels;chan++) + { + DirectParams &parms = mChans[chan].mDryParams; + if(!(parms.Hrtf.Old.Gain > GAIN_SILENCE_THRESHOLD)) + { + /* The old HRTF params are silent, so overwrite the old + * coefficients with the new, and reset the old gain to 0. The + * future mix will then fade from silence. + */ + parms.Hrtf.Old = parms.Hrtf.Target; + parms.Hrtf.Old.Gain = 0.0f; + } + } + } + + ALuint buffers_done{0u}; + ALuint OutPos{0u}; + do { + /* Figure out how many buffer samples will be needed */ + ALuint DstBufferSize{SamplesToDo - OutPos}; + + /* Calculate the last written dst sample pos. */ + uint64_t DataSize64{DstBufferSize - 1}; + /* Calculate the last read src sample pos. */ + DataSize64 = (DataSize64*increment + DataPosFrac) >> FRACTIONBITS; + /* +1 to get the src sample count, include padding. */ + DataSize64 += 1 + MAX_RESAMPLER_PADDING; + + auto SrcBufferSize = static_cast( + minu64(DataSize64, BUFFERSIZE + MAX_RESAMPLER_PADDING + 1)); + if(SrcBufferSize > BUFFERSIZE + MAX_RESAMPLER_PADDING) + { + SrcBufferSize = BUFFERSIZE + MAX_RESAMPLER_PADDING; + /* If the source buffer got saturated, we can't fill the desired + * dst size. Figure out how many samples we can actually mix from + * this. + */ + DataSize64 = SrcBufferSize - MAX_RESAMPLER_PADDING; + DataSize64 = ((DataSize64<(minu64(DataSize64, DstBufferSize)); + + /* Some mixers like having a multiple of 4, so try to give that + * unless this is the last update. + */ + if(DstBufferSize < SamplesToDo-OutPos) + DstBufferSize &= ~3u; + } + + ASSUME(DstBufferSize > 0); + for(ALuint chan{0};chan < NumChannels;chan++) + { + ChannelData &chandata = mChans[chan]; + const al::span SrcData{Device->SourceData, SrcBufferSize}; + + /* Load the previous samples into the source data first, then load + * what we can from the buffer queue. + */ + auto srciter = std::copy_n(chandata.mPrevSamples.begin(), MAX_RESAMPLER_PADDING>>1, + SrcData.begin()); + + if UNLIKELY(!BufferListItem) + srciter = std::copy(chandata.mPrevSamples.begin()+(MAX_RESAMPLER_PADDING>>1), + chandata.mPrevSamples.end(), srciter); + else if(isstatic) + srciter = LoadBufferStatic(BufferListItem, BufferLoopItem, NumChannels, + SampleSize, chan, DataPosInt, {srciter, SrcData.end()}); + else + srciter = LoadBufferQueue(BufferListItem, BufferLoopItem, NumChannels, + SampleSize, chan, DataPosInt, {srciter, SrcData.end()}); + + if UNLIKELY(srciter != SrcData.end()) + { + /* If the source buffer wasn't filled, copy the last sample for + * the remaining buffer. Ideally it should have ended with + * silence, but if not the gain fading should help avoid clicks + * from sudden amplitude changes. + */ + const ALfloat sample{*(srciter-1)}; + std::fill(srciter, SrcData.end(), sample); + } + + /* Store the last source samples used for next time. */ + std::copy_n(&SrcData[(increment*DstBufferSize + DataPosFrac)>>FRACTIONBITS], + chandata.mPrevSamples.size(), chandata.mPrevSamples.begin()); + + /* Resample, then apply ambisonic upsampling as needed. */ + const ALfloat *ResampledData{Resample(&mResampleState, + &SrcData[MAX_RESAMPLER_PADDING>>1], DataPosFrac, increment, + {Device->ResampledData, DstBufferSize})}; + if((mFlags&VOICE_IS_AMBISONIC)) + { + const float hfscale{chandata.mAmbiScale}; + /* Beware the evil const_cast. It's safe since it's pointing to + * either SourceData or ResampledData (both non-const), but the + * resample method takes the source as const float* and may + * return it without copying to output, making it currently + * unavoidable. + */ + const al::span samples{const_cast(ResampledData), DstBufferSize}; + chandata.mAmbiSplitter.applyHfScale(samples, hfscale); + } + + /* Now filter and mix to the appropriate outputs. */ + ALfloat (&FilterBuf)[BUFFERSIZE] = Device->FilteredData; + { + DirectParams &parms = chandata.mDryParams; + const ALfloat *samples{DoFilters(&parms.LowPass, &parms.HighPass, FilterBuf, + {ResampledData, DstBufferSize}, mDirect.FilterType)}; + + if((mFlags&VOICE_HAS_HRTF)) + { + const ALfloat TargetGain{UNLIKELY(vstate == ALvoice::Stopping) ? 0.0f : + parms.Hrtf.Target.Gain}; + DoHrtfMix(samples, DstBufferSize, parms, TargetGain, Counter, OutPos, IrSize, + Device); + } + else if((mFlags&VOICE_HAS_NFC)) + { + const float *TargetGains{UNLIKELY(vstate == ALvoice::Stopping) ? + SilentTarget.data() : parms.Gains.Target.data()}; + DoNfcMix({samples, DstBufferSize}, mDirect.Buffer.data(), parms, TargetGains, + Counter, OutPos, Device); + } + else + { + const float *TargetGains{UNLIKELY(vstate == ALvoice::Stopping) ? + SilentTarget.data() : parms.Gains.Target.data()}; + MixSamples({samples, DstBufferSize}, mDirect.Buffer, + parms.Gains.Current.data(), TargetGains, Counter, OutPos); + } + } + + for(ALuint send{0};send < NumSends;++send) + { + if(mSend[send].Buffer.empty()) + continue; + + SendParams &parms = chandata.mWetParams[send]; + const ALfloat *samples{DoFilters(&parms.LowPass, &parms.HighPass, FilterBuf, + {ResampledData, DstBufferSize}, mSend[send].FilterType)}; + + const float *TargetGains{UNLIKELY(vstate == ALvoice::Stopping) ? + SilentTarget.data() : parms.Gains.Target.data()}; + MixSamples({samples, DstBufferSize}, mSend[send].Buffer, + parms.Gains.Current.data(), TargetGains, Counter, OutPos); + } + } + /* Update positions */ + DataPosFrac += increment*DstBufferSize; + DataPosInt += DataPosFrac>>FRACTIONBITS; + DataPosFrac &= FRACTIONMASK; + + OutPos += DstBufferSize; + Counter = maxu(DstBufferSize, Counter) - DstBufferSize; + + if UNLIKELY(!BufferListItem) + { + /* Do nothing extra when there's no buffers. */ + } + else if(isstatic) + { + if(BufferLoopItem) + { + /* Handle looping static source */ + const ALbuffer *Buffer{BufferListItem->mBuffer}; + const ALuint LoopStart{Buffer->LoopStart}; + const ALuint LoopEnd{Buffer->LoopEnd}; + if(DataPosInt >= LoopEnd) + { + assert(LoopEnd > LoopStart); + DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart; + } + } + else + { + /* Handle non-looping static source */ + if(DataPosInt >= BufferListItem->mSampleLen) + { + BufferListItem = nullptr; + break; + } + } + } + else + { + /* Handle streaming source */ + do { + if(BufferListItem->mSampleLen > DataPosInt) + break; + + DataPosInt -= BufferListItem->mSampleLen; + + ++buffers_done; + BufferListItem = BufferListItem->mNext.load(std::memory_order_relaxed); + if(!BufferListItem) BufferListItem = BufferLoopItem; + } while(BufferListItem); + } + } while(OutPos < SamplesToDo); + + mFlags |= VOICE_IS_FADING; + + /* Don't update positions and buffers if we were stopping. */ + if UNLIKELY(vstate == ALvoice::Stopping) + { + mPlayState.store(ALvoice::Stopped, std::memory_order_release); + return; + } + + /* Capture the source ID in case it's reset for stopping. */ + const ALuint SourceID{mSourceID.load(std::memory_order_relaxed)}; + + /* Update voice info */ + mPosition.store(DataPosInt, std::memory_order_relaxed); + mPositionFrac.store(DataPosFrac, std::memory_order_relaxed); + mCurrentBuffer.store(BufferListItem, std::memory_order_relaxed); + if(!BufferListItem) + { + mLoopBuffer.store(nullptr, std::memory_order_relaxed); + mSourceID.store(0u, std::memory_order_relaxed); + } + std::atomic_thread_fence(std::memory_order_release); + + /* Send any events now, after the position/buffer info was updated. */ + const ALbitfieldSOFT enabledevt{Context->mEnabledEvts.load(std::memory_order_acquire)}; + if(buffers_done > 0 && (enabledevt&EventType_BufferCompleted)) + { + RingBuffer *ring{Context->mAsyncEvents.get()}; + auto evt_vec = ring->getWriteVector(); + if(evt_vec.first.len > 0) + { + AsyncEvent *evt{new (evt_vec.first.buf) AsyncEvent{EventType_BufferCompleted}}; + evt->u.bufcomp.id = SourceID; + evt->u.bufcomp.count = buffers_done; + ring->writeAdvance(1); + } + } + + if(!BufferListItem) + { + /* If the voice just ended, set it to Stopping so the next render + * ensures any residual noise fades to 0 amplitude. + */ + mPlayState.store(ALvoice::Stopping, std::memory_order_release); + if((enabledevt&EventType_SourceStateChange)) + SendSourceStoppedEvent(Context, SourceID); + } +} diff --git a/alc/voice.h b/alc/voice.h new file mode 100644 index 0000000..9e96bdc --- /dev/null +++ b/alc/voice.h @@ -0,0 +1,306 @@ +#ifndef VOICE_H +#define VOICE_H + +#include + +#include "AL/al.h" +#include "AL/alext.h" + +#include "al/buffer.h" +#include "alspan.h" +#include "alu.h" +#include "devformat.h" +#include "filters/biquad.h" +#include "filters/nfc.h" +#include "filters/splitter.h" +#include "hrtf.h" + +enum class DistanceModel; + + +enum SpatializeMode { + SpatializeOff = AL_FALSE, + SpatializeOn = AL_TRUE, + SpatializeAuto = AL_AUTO_SOFT +}; + +enum class DirectMode : unsigned char { + Off = AL_FALSE, + DropMismatch = AL_DROP_UNMATCHED_SOFT, + RemixMismatch = AL_REMIX_UNMATCHED_SOFT +}; + +enum class Resampler { + Point, + Linear, + Cubic, + FastBSinc12, + BSinc12, + FastBSinc24, + BSinc24, + + Max = BSinc24 +}; +extern Resampler ResamplerDefault; + +/* The number of distinct scale and phase intervals within the bsinc filter + * table. + */ +#define BSINC_SCALE_BITS 4 +#define BSINC_SCALE_COUNT (1< dst); + +ResamplerFunc PrepareResampler(Resampler resampler, ALuint increment, InterpState *state); + + +enum { + AF_None = 0, + AF_LowPass = 1, + AF_HighPass = 2, + AF_BandPass = AF_LowPass | AF_HighPass +}; + + +struct MixHrtfFilter { + const HrirArray *Coeffs; + ALuint Delay[2]; + float Gain; + float GainStep; +}; + + +struct DirectParams { + BiquadFilter LowPass; + BiquadFilter HighPass; + + NfcFilter NFCtrlFilter; + + struct { + HrtfFilter Old; + HrtfFilter Target; + alignas(16) std::array History; + } Hrtf; + + struct { + std::array Current; + std::array Target; + } Gains; +}; + +struct SendParams { + BiquadFilter LowPass; + BiquadFilter HighPass; + + struct { + std::array Current; + std::array Target; + } Gains; +}; + + +struct ALvoicePropsBase { + float Pitch; + float Gain; + float OuterGain; + float MinGain; + float MaxGain; + float InnerAngle; + float OuterAngle; + float RefDistance; + float MaxDistance; + float RolloffFactor; + std::array Position; + std::array Velocity; + std::array Direction; + std::array OrientAt; + std::array OrientUp; + bool HeadRelative; + DistanceModel mDistanceModel; + Resampler mResampler; + DirectMode DirectChannels; + SpatializeMode mSpatializeMode; + + bool DryGainHFAuto; + bool WetGainAuto; + bool WetGainHFAuto; + float OuterGainHF; + + float AirAbsorptionFactor; + float RoomRolloffFactor; + float DopplerFactor; + + std::array StereoPan; + + float Radius; + + /** Direct filter and auxiliary send info. */ + struct { + float Gain; + float GainHF; + float HFReference; + float GainLF; + float LFReference; + } Direct; + struct SendData { + ALeffectslot *Slot; + float Gain; + float GainHF; + float HFReference; + float GainLF; + float LFReference; + } Send[MAX_SENDS]; +}; + +struct ALvoiceProps : public ALvoicePropsBase { + std::atomic next{nullptr}; + + DEF_NEWDEL(ALvoiceProps) +}; + +#define VOICE_IS_STATIC (1u<<0) +#define VOICE_IS_FADING (1u<<1) /* Fading sources use gain stepping for smooth transitions. */ +#define VOICE_IS_AMBISONIC (1u<<2) /* Voice needs HF scaling for ambisonic upsampling. */ +#define VOICE_HAS_HRTF (1u<<3) +#define VOICE_HAS_NFC (1u<<4) + +struct ALvoice { + enum State { + Stopped = 0, + Playing = 1, + Stopping = 2 + }; + + std::atomic mUpdate{nullptr}; + + std::atomic mSourceID{0u}; + std::atomic mPlayState{Stopped}; + + ALvoicePropsBase mProps; + + /** + * Source offset in samples, relative to the currently playing buffer, NOT + * the whole queue. + */ + std::atomic mPosition; + /** Fractional (fixed-point) offset to the next sample. */ + std::atomic mPositionFrac; + + /* Current buffer queue item being played. */ + std::atomic mCurrentBuffer; + + /* Buffer queue item to loop to at end of queue (will be NULL for non- + * looping voices). + */ + std::atomic mLoopBuffer; + + /* Properties for the attached buffer(s). */ + FmtChannels mFmtChannels; + ALuint mFrequency; + ALuint mNumChannels; + ALuint mSampleSize; + AmbiLayout mAmbiLayout; + AmbiNorm mAmbiScaling; + ALuint mAmbiOrder; + + /** Current target parameters used for mixing. */ + ALuint mStep; + + ResamplerFunc mResampler; + + InterpState mResampleState; + + ALuint mFlags; + + struct TargetData { + int FilterType; + al::span Buffer; + }; + TargetData mDirect; + std::array mSend; + + struct ChannelData { + alignas(16) std::array mPrevSamples; + + float mAmbiScale; + BandSplitter mAmbiSplitter; + + DirectParams mDryParams; + std::array mWetParams; + }; + std::array mChans; + + ALvoice() = default; + ALvoice(const ALvoice&) = delete; + ALvoice(ALvoice&& rhs) noexcept { *this = std::move(rhs); } + ~ALvoice() { delete mUpdate.exchange(nullptr, std::memory_order_acq_rel); } + ALvoice& operator=(const ALvoice&) = delete; + ALvoice& operator=(ALvoice&& rhs) noexcept + { + ALvoiceProps *old_update{mUpdate.load(std::memory_order_relaxed)}; + mUpdate.store(rhs.mUpdate.exchange(old_update, std::memory_order_relaxed), + std::memory_order_relaxed); + + mSourceID.store(rhs.mSourceID.load(std::memory_order_relaxed), std::memory_order_relaxed); + mPlayState.store(rhs.mPlayState.load(std::memory_order_relaxed), + std::memory_order_relaxed); + + mProps = rhs.mProps; + + mPosition.store(rhs.mPosition.load(std::memory_order_relaxed), std::memory_order_relaxed); + mPositionFrac.store(rhs.mPositionFrac.load(std::memory_order_relaxed), + std::memory_order_relaxed); + + mCurrentBuffer.store(rhs.mCurrentBuffer.load(std::memory_order_relaxed), + std::memory_order_relaxed); + mLoopBuffer.store(rhs.mLoopBuffer.load(std::memory_order_relaxed), + std::memory_order_relaxed); + + mFmtChannels = rhs.mFmtChannels; + mFrequency = rhs.mFrequency; + mNumChannels = rhs.mNumChannels; + mSampleSize = rhs.mSampleSize; + mAmbiLayout = rhs.mAmbiLayout; + mAmbiScaling = rhs.mAmbiScaling; + mAmbiOrder = rhs.mAmbiOrder; + + mStep = rhs.mStep; + mResampler = rhs.mResampler; + + mResampleState = rhs.mResampleState; + + mFlags = rhs.mFlags; + + mDirect = rhs.mDirect; + mSend = rhs.mSend; + mChans = rhs.mChans; + + return *this; + } + + void mix(const State vstate, ALCcontext *Context, const ALuint SamplesToDo); +}; + +#endif /* VOICE_H */ diff --git a/build/bsinc_inc.h b/build/bsinc_inc.h index 218f4ff..80019e1 100644 --- a/build/bsinc_inc.h +++ b/build/bsinc_inc.h @@ -1,15 +1,17 @@ /* Generated by bsincgen, do not edit! */ +#pragma once static_assert(BSINC_SCALE_COUNT == 16, "Unexpected BSINC_SCALE_COUNT value!"); -static_assert(BSINC_PHASE_COUNT == 16, "Unexpected BSINC_PHASE_COUNT value!"); -static_assert(FRACTIONONE == 4096, "Unexpected FRACTIONONE value!"); +static_assert(BSINC_PHASE_COUNT == 32, "Unexpected BSINC_PHASE_COUNT value!"); -typedef struct BSincTable { +namespace { + +struct BSincTable { const float scaleBase, scaleRange; - const int m[BSINC_SCALE_COUNT]; - const int filterOffset[BSINC_SCALE_COUNT]; - alignas(16) const float Tab[]; -} BSincTable; + const unsigned int m[BSINC_SCALE_COUNT]; + const unsigned int filterOffset[BSINC_SCALE_COUNT]; + const float *Tab; +}; /* This 23rd order filter has a rejection of -60dB, yielding a transition width * of ~0.158 (normalized frequency). Order increases when downsampling to a @@ -17,2587 +19,5148 @@ typedef struct BSincTable { * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound * after downsampling by ~3.67 octaves. */ -const BSincTable bsinc24 = { +alignas(16) constexpr float bsinc24_tab[81920] = { + /* 0, 0 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f, + +7.201639933e-06f, +7.808824226e-06f, +7.060810728e-06f, +4.363309672e-06f, -8.494304210e-07f, -9.042191405e-06f, -2.050403146e-05f, -3.527979396e-05f, -5.311682607e-05f, -7.343513463e-05f, -9.532739769e-05f, -1.175924836e-04f, -1.388026701e-04f, -1.574009775e-04f, -1.718213704e-04f, -1.806214921e-04f, -1.826154788e-04f, -1.769935670e-04f, -1.634158161e-04f, -1.420693226e-04f, -1.136816124e-04f, -7.948714106e-05f, -4.114853805e-05f, -6.388853996e-07f, +3.990461040e-05f, +7.834217668e-05f, +1.126932717e-04f, +1.412836031e-04f, +1.628639195e-04f, +1.766901015e-04f, +1.825581262e-04f, +1.807921168e-04f, +1.721884081e-04f, +1.579228174e-04f, +1.394316620e-04f, +1.182791553e-04f, +9.602447380e-05f, +7.410099365e-05f, +5.371811474e-05f, +3.579302665e-05f, +2.091612006e-05f, +9.349966785e-06f, +1.058315911e-06f, -4.241239355e-06f, -7.009111338e-06f, -7.809025104e-06f, -7.235395433e-06f, -5.850110091e-06f, + /* 0, 1 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.724423225e-04f, -7.151403879e-04f, -9.578278075e-04f, -1.147940629e-03f, -1.214156681e-03f, -1.068414757e-03f, -6.103091546e-04f, +2.661968716e-04f, +1.664078274e-03f, +3.673193623e-03f, +6.359724439e-03f, +9.756128885e-03f, +1.385269489e-02f, +1.859172564e-02f, +2.386521801e-02f, +2.951661261e-02f, +3.534682755e-02f, +4.112437288e-02f, +4.659892291e-02f, +5.151734626e-02f, +5.564090171e-02f, +5.876213779e-02f, +6.072000814e-02f, +6.141184024e-02f, +6.080106129e-02f, +5.891996710e-02f, +5.586727659e-02f, +5.180069918e-02f, +4.692520265e-02f, +4.147805655e-02f, +3.571200116e-02f, +2.987802621e-02f, +2.420922778e-02f, +1.890704943e-02f, +1.413092922e-02f, +9.992000524e-03f, +6.551076310e-03f, +3.820729751e-03f, +1.770913215e-03f, +3.372696922e-04f, -5.688890031e-04f, -1.050022599e-03f, -1.212248935e-03f, -1.156545178e-03f, -9.718977296e-04f, -7.307582372e-04f, -4.868793578e-04f, -2.753458351e-04f, + +7.167114757e-06f, +7.807302866e-06f, +7.110604110e-06f, +4.482915520e-06f, -6.434694612e-07f, -8.737628506e-06f, -2.009520355e-05f, -3.476957772e-05f, -5.251798750e-05f, -7.277083693e-05f, -9.463070442e-05f, -1.169047926e-04f, -1.381711284e-04f, -1.568750475e-04f, -1.714488231e-04f, -1.804441899e-04f, -1.826653555e-04f, -1.772892198e-04f, -1.639600817e-04f, -1.428481242e-04f, -1.146642473e-04f, -8.062803289e-05f, -4.239033203e-05f, -1.916622938e-06f, +3.865861306e-05f, +7.719319639e-05f, +1.116992702e-04f, +1.404909963e-04f, +1.623044060e-04f, +1.763788209e-04f, +1.824932796e-04f, +1.809560329e-04f, +1.725498952e-04f, +1.584405205e-04f, +1.400580555e-04f, +1.189647611e-04f, +9.672189189e-05f, +7.476838129e-05f, +5.432183054e-05f, +3.630926307e-05f, +2.133146638e-05f, +9.660960103e-06f, +1.270137912e-06f, -4.116688316e-06f, -6.955487723e-06f, -7.807887439e-06f, -7.268365081e-06f, -5.900645350e-06f, + /* 0, 2 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f, + +7.131836001e-06f, +7.804479049e-06f, +7.158509723e-06f, +4.600073246e-06f, -4.404208828e-07f, -8.436272395e-06f, -1.968963904e-05f, -3.426239038e-05f, -5.192162170e-05f, -7.210813297e-05f, -9.393443463e-05f, -1.162161284e-04f, -1.375370856e-04f, -1.563450745e-04f, -1.710708076e-04f, -1.802602417e-04f, -1.827077745e-04f, -1.775770628e-04f, -1.644967024e-04f, -1.436199778e-04f, -1.156411315e-04f, -8.176479580e-05f, -4.362992850e-05f, -3.194260694e-06f, +3.741061019e-05f, +7.604025715e-05f, +1.106996535e-04f, +1.396915333e-04f, +1.617372905e-04f, +1.760597234e-04f, +1.824209217e-04f, +1.811132097e-04f, +1.729057912e-04f, +1.589540398e-04f, +1.406818019e-04f, +1.196492544e-04f, +9.741961088e-05f, +7.543726457e-05f, +5.492795017e-05f, +3.682849015e-05f, +2.175006713e-05f, +9.975176579e-06f, +1.484908233e-06f, -3.989640402e-06f, -6.899921698e-06f, -7.805393139e-06f, -7.300532620e-06f, -5.950853705e-06f, + /* 0, 3 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.581433717e-04f, -6.995286060e-04f, -9.435586937e-04f, -1.138857640e-03f, -1.215240571e-03f, -1.085588658e-03f, -6.500939972e-04f, +1.971649035e-04f, +1.559638665e-03f, +3.528314653e-03f, +6.171159300e-03f, +9.523007964e-03f, +1.357698668e-02f, +1.827850552e-02f, +2.352269837e-02f, +2.915590817e-02f, +3.498145442e-02f, +4.076950660e-02f, +4.627046613e-02f, +5.123087815e-02f, +5.541059633e-02f, +5.859974496e-02f, +6.063398788e-02f, +6.140672936e-02f, +6.087713051e-02f, +5.907320056e-02f, +5.608967552e-02f, +5.208088171e-02f, +4.724924434e-02f, +4.183049510e-02f, +3.607691536e-02f, +3.024009546e-02f, +2.455468347e-02f, +1.922444399e-02f, +1.441166908e-02f, +1.023061454e-02f, +6.745217813e-03f, +3.970935397e-03f, +1.880162996e-03f, +4.104074455e-04f, -5.258074696e-04f, -1.030386462e-03f, -1.209493888e-03f, -1.164651507e-03f, -9.857531390e-04f, -7.463715178e-04f, -5.014482555e-04f, -2.871973341e-04f, + +7.095819678e-06f, +7.800370763e-06f, +7.204545832e-06f, +4.714799292e-06f, -2.402723706e-07f, -8.138117147e-06f, -1.928734033e-05f, -3.375824403e-05f, -5.132775100e-05f, -7.144705488e-05f, -9.323862873e-05f, -1.155265373e-04f, -1.369005902e-04f, -1.558111055e-04f, -1.706873651e-04f, -1.800696793e-04f, -1.827427547e-04f, -1.778570993e-04f, -1.650256649e-04f, -1.443848538e-04f, -1.166122207e-04f, -8.289737375e-05f, -4.486726377e-05f, -4.471732158e-06f, +3.616066610e-05f, +7.488341620e-05f, +1.096944677e-04f, +1.388852458e-04f, +1.611625883e-04f, +1.757328077e-04f, +1.823410354e-04f, +1.812636169e-04f, +1.732560555e-04f, +1.594633288e-04f, +1.413028526e-04f, +1.203325886e-04f, +9.811758948e-05f, +7.610761022e-05f, +5.553645002e-05f, +3.735069452e-05f, +2.217191876e-05f, +1.029262119e-05f, +1.702638511e-06f, -3.860079559e-06f, -6.842395104e-06f, -7.801524077e-06f, -7.331881716e-06f, -6.000721856e-06f, + /* 0, 4 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f, + +7.059081716e-06f, +7.794995958e-06f, +7.248730722e-06f, +4.827110191e-06f, -4.301144525e-08f, -7.843156605e-06f, -1.888830955e-05f, -3.325715046e-05f, -5.073639743e-05f, -7.078763450e-05f, -9.254332692e-05f, -1.148360655e-04f, -1.362616909e-04f, -1.552731878e-04f, -1.702985375e-04f, -1.798725349e-04f, -1.827703153e-04f, -1.781293332e-04f, -1.655469566e-04f, -1.451427229e-04f, -1.175774709e-04f, -8.402571100e-05f, -4.610227435e-05f, -5.748970827e-06f, +3.490884522e-05f, +7.372273107e-05f, +1.086837592e-04f, +1.380721657e-04f, +1.605803153e-04f, +1.753980729e-04f, +1.822536042e-04f, +1.814072243e-04f, +1.736006478e-04f, +1.599683410e-04f, +1.419211588e-04f, +1.210147169e-04f, +9.881578617e-05f, +7.677938468e-05f, +5.614730615e-05f, +3.787586248e-05f, +2.259701741e-05f, +1.061329869e-05f, +1.923340206e-06f, -3.727989835e-06f, -6.782889817e-06f, -7.796262099e-06f, -7.362395954e-06f, -6.050236397e-06f, + /* 0, 5 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.439884703e-04f, -6.839332393e-04f, -9.291054171e-04f, -1.129315731e-03f, -1.215523855e-03f, -1.101569931e-03f, -6.882696471e-04f, +1.301495090e-04f, +1.457574517e-03f, +3.386079964e-03f, +5.985377344e-03f, +9.292645361e-03f, +1.330382439e-02f, +1.796742122e-02f, +2.318171247e-02f, +2.879596596e-02f, +3.461594135e-02f, +4.041352017e-02f, +4.593989350e-02f, +5.094135058e-02f, +5.517640664e-02f, +5.843282187e-02f, +6.054301834e-02f, +6.139650865e-02f, +6.094820002e-02f, +5.922180670e-02f, +5.630805374e-02f, +5.235783912e-02f, +4.757098725e-02f, +4.218162598e-02f, +3.644151000e-02f, +3.060276630e-02f, +2.490154017e-02f, +1.954387566e-02f, +1.469489309e-02f, +1.047196184e-02f, +6.942151189e-03f, +4.123822392e-03f, +1.991846752e-03f, +4.856340025e-04f, -4.810385334e-04f, -1.009480542e-03f, -1.205867910e-03f, -1.172239576e-03f, -9.993784239e-04f, -7.619693040e-04f, -5.161425332e-04f, -2.992482924e-04f, + +7.021637960e-06f, +7.788372543e-06f, +7.291082698e-06f, +4.937022566e-06f, +1.513745344e-07f, -7.551384381e-06f, -1.849254854e-05f, -3.275912115e-05f, -5.014758269e-05f, -7.012990339e-05f, -9.184856916e-05f, -1.141447587e-04f, -1.356204362e-04f, -1.547313687e-04f, -1.699043667e-04f, -1.796688410e-04f, -1.827904761e-04f, -1.783937689e-04f, -1.660605652e-04f, -1.458935566e-04f, -1.185368387e-04f, -8.514975212e-05f, -4.733489691e-05f, -7.025910221e-06f, +3.365521214e-05f, +7.255825958e-05f, +1.076675748e-04f, +1.372523257e-04f, +1.599904879e-04f, +1.750555188e-04f, +1.821586121e-04f, +1.815440025e-04f, +1.739395284e-04f, +1.604690300e-04f, +1.425366721e-04f, +1.216955923e-04f, +9.951415924e-05f, +7.745255413e-05f, +5.676049434e-05f, +3.840398002e-05f, +2.302535893e-05f, +1.093721356e-05f, +2.147024604e-06f, -3.593355386e-06f, -6.721387745e-06f, -7.789589021e-06f, -7.392058845e-06f, -6.099383813e-06f, + /* 0, 6 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f, + +6.983504168e-06f, +7.780518386e-06f, +7.331620083e-06f, +5.044553124e-06f, +3.428983692e-07f, -7.262793860e-06f, -1.810005886e-05f, -3.226416726e-05f, -4.956132816e-05f, -6.947389279e-05f, -9.115439517e-05f, -1.134526627e-04f, -1.349768747e-04f, -1.541856957e-04f, -1.695048947e-04f, -1.794586306e-04f, -1.828032572e-04f, -1.786504114e-04f, -1.665664791e-04f, -1.466373266e-04f, -1.194902810e-04f, -8.626944199e-05f, -4.856506828e-05f, -8.302483877e-06f, +3.239983159e-05f, +7.139005983e-05f, +1.066459616e-04f, +1.364257588e-04f, +1.593931230e-04f, +1.747051455e-04f, +1.820560435e-04f, +1.816739221e-04f, +1.742726574e-04f, +1.609653496e-04f, +1.431493437e-04f, +1.223751678e-04f, +1.002126668e-04f, +7.812708446e-05f, +5.737599002e-05f, +3.893503281e-05f, +2.345693889e-05f, +1.126437005e-05f, +2.373702808e-06f, -3.456160473e-06f, -6.657870832e-06f, -7.781486633e-06f, -7.420853824e-06f, -6.148150484e-06f, + /* 0, 7 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.299833282e-04f, -6.683643483e-04f, -9.144827144e-04f, -1.119334155e-03f, -1.215029582e-03f, -1.116384110e-03f, -7.248622545e-04f, +6.512622063e-05f, +1.357865606e-03f, +3.246476168e-03f, +5.802374380e-03f, +9.065047940e-03f, +1.303322708e-02f, +1.765850416e-02f, +2.284230321e-02f, +2.843683849e-02f, +3.425034762e-02f, +4.005647599e-02f, +4.560726646e-02f, +5.064881970e-02f, +5.493837952e-02f, +5.826140268e-02f, +6.044711838e-02f, +6.138118026e-02f, +6.101425507e-02f, +5.936575502e-02f, +5.652236728e-02f, +5.263151721e-02f, +4.789037086e-02f, +4.253138664e-02f, +3.680572465e-02f, +3.096598422e-02f, +2.524975236e-02f, +1.986531004e-02f, +1.498057911e-02f, +1.071603260e-02f, +7.141878015e-03f, +4.279402031e-03f, +2.105983236e-03f, +5.629730153e-04f, -4.345562356e-04f, -9.872789584e-04f, -1.201347182e-03f, -1.179289092e-03f, -1.012757683e-03f, -7.775403796e-04f, -5.309554459e-04f, -3.114958267e-04f, + +6.944696012e-06f, +7.771451312e-06f, +7.370361214e-06f, +5.149718660e-06f, +5.315730174e-07f, -6.977378204e-06f, -1.771084180e-05f, -3.177229965e-05f, -4.897765493e-05f, -6.881963368e-05f, -9.046084446e-05f, -1.127598233e-04f, -1.343310549e-04f, -1.536362162e-04f, -1.691001640e-04f, -1.792419368e-04f, -1.828086792e-04f, -1.788992659e-04f, -1.670646871e-04f, -1.473740055e-04f, -1.204377551e-04f, -8.738472583e-05f, -4.979272550e-05f, -9.578625365e-06f, +3.114276840e-05f, +7.021819019e-05f, +1.056189673e-04f, +1.355924986e-04f, +1.587882379e-04f, +1.743469537e-04f, +1.819458831e-04f, +1.817969543e-04f, +1.745999956e-04f, +1.614572536e-04f, +1.437591249e-04f, +1.230533962e-04f, +1.009112666e-04f, +7.880294129e-05f, +5.799376832e-05f, +3.946900620e-05f, +2.389175254e-05f, +1.159477218e-05f, +2.603385740e-06f, -3.316389466e-06f, -6.592321062e-06f, -7.771936700e-06f, -7.448764252e-06f, -6.196522682e-06f, + /* 0, 8 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f, + +6.905229076e-06f, +7.761189099e-06f, +7.407324442e-06f, +5.252536049e-06f, +7.174115923e-07f, -6.695130348e-06f, -1.732489835e-05f, -3.128352883e-05f, -4.839658372e-05f, -6.816715673e-05f, -8.976795629e-05f, -1.120662859e-04f, -1.336830254e-04f, -1.530829779e-04f, -1.686902173e-04f, -1.790187932e-04f, -1.828067631e-04f, -1.791403384e-04f, -1.675551786e-04f, -1.481035659e-04f, -1.213792189e-04f, -8.849554918e-05f, -5.101780578e-05f, -1.085426828e-05f, +2.988408757e-05f, +6.904270931e-05f, +1.045866398e-04f, +1.347525789e-04f, +1.581758507e-04f, +1.739809448e-04f, +1.818281164e-04f, +1.819130706e-04f, +1.749215037e-04f, +1.619446962e-04f, +1.443659673e-04f, +1.237302304e-04f, +1.016099164e-04f, +7.948008996e-05f, +5.861380406e-05f, +4.000588521e-05f, +2.432979486e-05f, +1.192842370e-05f, +2.836084140e-06f, -3.174026850e-06f, -6.524720458e-06f, -7.760920964e-06f, -7.475773419e-06f, -6.244486575e-06f, + /* 0, 9 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.161334031e-04f, -6.528317079e-04f, -8.997050287e-04f, -1.108931901e-03f, -1.213780598e-03f, -1.130056618e-03f, -7.598979946e-04f, +2.070392152e-06f, +1.260491367e-03f, +3.109489377e-03f, +5.622145579e-03f, +8.840221830e-03f, +1.276521300e-02f, +1.735178496e-02f, +2.250451283e-02f, +2.807857776e-02f, +3.388473218e-02f, +3.969843638e-02f, +4.527264659e-02f, +5.035334212e-02f, +5.469656255e-02f, +5.808552240e-02f, +6.034630785e-02f, +6.136074737e-02f, +6.107528192e-02f, +5.950501592e-02f, +5.673257289e-02f, +5.290186229e-02f, +4.820733494e-02f, +4.287971454e-02f, +3.716949865e-02f, +3.132969425e-02f, +2.559927386e-02f, +2.018871199e-02f, +1.526870420e-02f, +1.096281623e-02f, +7.344399198e-03f, +4.437685062e-03f, +2.222590809e-03f, +6.424479067e-04f, -3.863346882e-04f, -9.637557625e-04f, -1.195907712e-03f, -1.185779509e-03f, -1.025874724e-03f, -7.930732373e-04f, -5.458799835e-04f, -3.239368359e-04f, + +6.865118852e-06f, +7.749749481e-06f, +7.442528130e-06f, +5.353022246e-06f, +9.004273601e-07f, -6.416043006e-06f, -1.694222924e-05f, -3.079786504e-05f, -4.781813497e-05f, -6.751649231e-05f, -8.907576968e-05f, -1.113720959e-04f, -1.330328344e-04f, -1.525260286e-04f, -1.682750973e-04f, -1.787892338e-04f, -1.827975304e-04f, -1.793736353e-04f, -1.680379435e-04f, -1.488259813e-04f, -1.223146305e-04f, -8.960185788e-05f, -5.224024653e-05f, -1.212934627e-05f, +2.862385418e-05f, +6.786367609e-05f, +1.035490276e-04f, +1.339060344e-04f, +1.575559798e-04f, +1.736071204e-04f, +1.817027291e-04f, +1.820222430e-04f, +1.752371429e-04f, +1.624276316e-04f, +1.449698222e-04f, +1.244056229e-04f, +1.023085737e-04f, +8.015849554e-05f, +5.923607174e-05f, +4.054565455e-05f, +2.477106051e-05f, +1.226532812e-05f, +3.071808559e-06f, -3.029057220e-06f, -6.455051086e-06f, -7.748421147e-06f, -7.501864540e-06f, -6.292028226e-06f, + /* 0,10 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f, + +6.824380746e-06f, +7.737150143e-06f, +7.475990650e-06f, +5.451194286e-06f, +1.080633738e-06f, -6.140108674e-06f, -1.656283491e-05f, -3.031531818e-05f, -4.724232877e-05f, -6.686767051e-05f, -8.838432342e-05f, -1.106772984e-04f, -1.323805306e-04f, -1.519654159e-04f, -1.678548470e-04f, -1.785532927e-04f, -1.827810030e-04f, -1.795991635e-04f, -1.685129721e-04f, -1.495412255e-04f, -1.232439486e-04f, -9.070359815e-05f, -5.345998535e-05f, -1.340379299e-05f, +2.736213345e-05f, +6.668114971e-05f, +1.025061794e-04f, +1.330529000e-04f, +1.569286442e-04f, +1.732254828e-04f, +1.815697075e-04f, +1.821244437e-04f, +1.755468747e-04f, +1.629060141e-04f, +1.455706410e-04f, +1.250795263e-04f, +1.030071957e-04f, +8.083812284e-05f, +5.986054554e-05f, +4.108829861e-05f, +2.521554387e-05f, +1.260548869e-05f, +3.310569361e-06f, -2.881465290e-06f, -6.383295056e-06f, -7.734418951e-06f, -7.527020764e-06f, -6.339133594e-06f, + /* 0,11 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.024439035e-04f, -6.373448083e-04f, -8.847865099e-04f, -1.098127684e-03f, -1.211799537e-03f, -1.142612770e-03f, -7.934030588e-04f, -5.904279106e-05f, +1.165430903e-03f, +2.975105214e-03f, +5.444685486e-03f, +8.618172436e-03f, +1.249979964e-02f, +1.704729352e-02f, +2.216838289e-02f, +2.772123523e-02f, +3.351915364e-02f, +3.933946359e-02f, +4.493609568e-02f, +5.005497492e-02f, +5.445100397e-02f, +5.790521695e-02f, +6.024060761e-02f, +6.133521423e-02f, +6.113126791e-02f, +5.963956075e-02f, +5.693862809e-02f, +5.316882122e-02f, +4.852181957e-02f, +4.322654714e-02f, +3.753277109e-02f, +3.169384093e-02f, +2.595005788e-02f, +2.051404564e-02f, +1.555924466e-02f, +1.121230138e-02f, +7.549714967e-03f, +4.598681680e-03f, +2.341687426e-03f, +7.240818599e-04f, -3.363480838e-04f, -9.388849457e-04f, -1.189525335e-03f, -1.191690031e-03f, -1.038713070e-03f, -8.085560774e-04f, -5.609088688e-04f, -3.365679977e-04f, + +6.783030070e-06f, +7.723408718e-06f, +7.507730380e-06f, +5.547069277e-06f, +1.258044290e-06f, -5.867319628e-06f, -1.618671553e-05f, -2.983589784e-05f, -4.666918493e-05f, -6.622072111e-05f, -8.769365605e-05f, -1.099819384e-04f, -1.317261621e-04f, -1.514011878e-04f, -1.674295098e-04f, -1.783110046e-04f, -1.827572033e-04f, -1.798169304e-04f, -1.689802556e-04f, -1.502492729e-04f, -1.241671324e-04f, -9.180071650e-05f, -5.467696004e-05f, -1.467754219e-05f, +2.609899070e-05f, +6.549518960e-05f, +1.014581444e-04f, +1.321932110e-04f, +1.562938633e-04f, +1.728360349e-04f, +1.814290384e-04f, +1.822196454e-04f, +1.758506607e-04f, +1.633797983e-04f, +1.461683752e-04f, +1.257518931e-04f, +1.037057395e-04f, +8.151893637e-05f, +6.048719935e-05f, +4.163380147e-05f, +2.566323901e-05f, +1.294890841e-05f, +3.552376721e-06f, -2.731235893e-06f, -6.309434527e-06f, -7.718896060e-06f, -7.551225169e-06f, -6.385788534e-06f, + /* 0,12 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f, + +6.741082046e-06f, +7.708542790e-06f, +7.537765705e-06f, +5.640664402e-06f, +1.432672729e-06f, -5.597667930e-06f, -1.581387101e-05f, -2.935961333e-05f, -4.609872289e-05f, -6.557567358e-05f, -8.700380586e-05f, -1.092860609e-04f, -1.310697774e-04f, -1.508333922e-04f, -1.669991291e-04f, -1.780624044e-04f, -1.827261540e-04f, -1.800269439e-04f, -1.694397852e-04f, -1.509500984e-04f, -1.250841413e-04f, -9.289315982e-05f, -5.589110862e-05f, -1.595052764e-05f, +2.483449136e-05f, +6.430585546e-05f, +1.004049721e-04f, +1.313270034e-04f, +1.556516572e-04f, +1.724387800e-04f, +1.812807091e-04f, +1.823078213e-04f, +1.761484629e-04f, +1.638489388e-04f, +1.467629763e-04f, +1.264226756e-04f, +1.044041619e-04f, +8.220090042e-05f, +6.111600674e-05f, +4.218214685e-05f, +2.611413971e-05f, +1.329559004e-05f, +3.797240619e-06f, -2.578353981e-06f, -6.233451705e-06f, -7.701834142e-06f, -7.574460766e-06f, -6.431978801e-06f, + /* 0,13 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.889197914e-04f, -6.219128568e-04f, -8.697410138e-04f, -1.086939950e-03f, -1.209108819e-03f, -1.154077757e-03f, -8.254036453e-04f, -1.182383022e-04f, +1.072662996e-03f, +2.843308820e-03f, +5.269988024e-03f, +8.398904437e-03f, +1.223700370e-02f, +1.674505894e-02f, +2.183395425e-02f, +2.736486182e-02f, +3.315367029e-02f, +3.897961971e-02f, +4.459767564e-02f, +4.975377555e-02f, +5.420175269e-02f, +5.772052307e-02f, +6.013003955e-02f, +6.130458616e-02f, +6.118220139e-02f, +5.976936179e-02f, +5.714049121e-02f, +5.343234143e-02f, +4.883376509e-02f, +4.357182196e-02f, +3.789548084e-02f, +3.205836840e-02f, +2.630205700e-02f, +2.084127438e-02f, +1.585217601e-02f, +1.146447595e-02f, +7.757824868e-03f, +4.762401517e-03f, +2.463290632e-03f, +8.078978082e-04f, -2.845707051e-04f, -9.126404473e-04f, -1.182175717e-03f, -1.196999621e-03f, -1.051255956e-03f, -8.239768076e-04f, -5.760345548e-04f, -3.493857651e-04f, + +6.698551799e-06f, +7.692569891e-06f, +7.566115013e-06f, +5.731996914e-06f, +1.604532908e-06f, -5.331145428e-06f, -1.544430097e-05f, -2.888647360e-05f, -4.553096181e-05f, -6.493255712e-05f, -8.631481091e-05f, -1.085897106e-04f, -1.304114247e-04f, -1.502620772e-04f, -1.665637486e-04f, -1.778075273e-04f, -1.826878783e-04f, -1.802292123e-04f, -1.698915531e-04f, -1.516436772e-04f, -1.259949353e-04f, -9.398087530e-05f, -5.710236930e-05f, -1.722268318e-05f, +2.356870096e-05f, +6.311320721e-05f, +9.934671235e-05f, +1.304543135e-04f, +1.550020465e-04f, +1.720337218e-04f, +1.811247071e-04f, +1.823889449e-04f, +1.764402438e-04f, +1.643133904e-04f, +1.473543959e-04f, +1.270918263e-04f, +1.051024197e-04f, +8.288397896e-05f, +6.174694096e-05f, +4.273331820e-05f, +2.656823942e-05f, +1.364553606e-05f, +4.045170841e-06f, -2.422804631e-06f, -6.155328848e-06f, -7.683214852e-06f, -7.596710501e-06f, -6.477690047e-06f, + /* 0,14 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f, + +6.655454364e-06f, +7.675507496e-06f, +7.592796692e-06f, +5.821084136e-06f, +1.773638826e-06f, -5.067743758e-06f, -1.507800476e-05f, -2.841648733e-05f, -4.496592050e-05f, -6.429140060e-05f, -8.562670900e-05f, -1.078929320e-04f, -1.297511522e-04f, -1.496872908e-04f, -1.661234121e-04f, -1.775464088e-04f, -1.826423998e-04f, -1.804237446e-04f, -1.703355517e-04f, -1.523299854e-04f, -1.268994749e-04f, -9.506381053e-05f, -5.831068052e-05f, -1.849394269e-05f, +2.230168514e-05f, +6.191730505e-05f, +9.828341550e-05f, +1.295751782e-04f, +1.543450521e-04f, +1.716208647e-04f, +1.809610208e-04f, +1.824629900e-04f, +1.767259657e-04f, +1.647731083e-04f, +1.479425855e-04f, +1.277592971e-04f, +1.058004694e-04f, +8.356813575e-05f, +6.237997497e-05f, +4.328729862e-05f, +2.702553133e-05f, +1.399874871e-05f, +4.296176977e-06f, -2.264573046e-06f, -6.075048267e-06f, -7.663019833e-06f, -7.617957255e-06f, -6.522907823e-06f, + /* 0,15 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.755657852e-04f, -6.065447794e-04f, -8.545821021e-04f, -1.075386869e-03f, -1.205730648e-03f, -1.164476647e-03f, -8.559259511e-04f, -1.755412632e-04f, +9.821661133e-04f, +2.714084862e-03f, +5.098046504e-03f, +8.182421794e-03f, +1.197684112e-02f, +1.644510957e-02f, +2.150126709e-02f, +2.700950789e-02f, +3.278834001e-02f, +3.861896676e-02f, +4.425744853e-02f, +4.944980188e-02f, +5.394885828e-02f, +5.753147838e-02f, +6.001462650e-02f, +6.126886953e-02f, +6.122807178e-02f, +5.989439231e-02f, +5.733812134e-02f, +5.369237093e-02f, +4.914311219e-02f, +4.391547655e-02f, +3.825756657e-02f, +3.242322034e-02f, +2.665522321e-02f, +2.117036087e-02f, +1.614747299e-02f, +1.171932707e-02f, +7.968727757e-03f, +4.928853632e-03f, +2.587417548e-03f, +8.939184250e-04f, -2.309769343e-04f, -8.849961625e-04f, -1.173834369e-03f, -1.201686999e-03f, -1.063486334e-03f, -8.393230423e-04f, -5.912492225e-04f, -3.623863630e-04f, + +6.611804677e-06f, +7.657373026e-06f, +7.617829132e-06f, +5.907943456e-06f, +1.940004617e-06f, -4.807454348e-06f, -1.471498148e-05f, -2.794966288e-05f, -4.440361746e-05f, -6.365223261e-05f, -8.493953768e-05f, -1.071957695e-04f, -1.290890081e-04f, -1.491090813e-04f, -1.656781636e-04f, -1.772790849e-04f, -1.825897425e-04f, -1.806105501e-04f, -1.707717740e-04f, -1.530089992e-04f, -1.277977209e-04f, -9.614191340e-05f, -5.951598093e-05f, -1.976424015e-05f, +2.103350960e-05f, +6.071820940e-05f, +9.721513218e-05f, +1.286896348e-04f, +1.536806957e-04f, +1.712002137e-04f, +1.807896387e-04f, +1.825299310e-04f, +1.770055917e-04f, +1.652280476e-04f, +1.485274967e-04f, +1.284250404e-04f, +1.064982673e-04f, +8.425333425e-05f, +6.301508140e-05f, +4.384407088e-05f, +2.748600830e-05f, +1.435522994e-05f, +4.550268416e-06f, -2.103644554e-06f, -5.992592328e-06f, -7.641230718e-06f, -7.638183844e-06f, -6.567617582e-06f, + /* 0,16 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f, + +6.567617582e-06f, +7.638183844e-06f, +7.641230718e-06f, +5.992592328e-06f, +2.103644554e-06f, -4.550268416e-06f, -1.435522994e-05f, -2.748600830e-05f, -4.384407088e-05f, -6.301508140e-05f, -8.425333425e-05f, -1.064982673e-04f, -1.284250404e-04f, -1.485274967e-04f, -1.652280476e-04f, -1.770055917e-04f, -1.825299310e-04f, -1.807896387e-04f, -1.712002137e-04f, -1.536806957e-04f, -1.286896348e-04f, -9.721513218e-05f, -6.071820940e-05f, -2.103350960e-05f, +1.976424015e-05f, +5.951598093e-05f, +9.614191340e-05f, +1.277977209e-04f, +1.530089992e-04f, +1.707717740e-04f, +1.806105501e-04f, +1.825897425e-04f, +1.772790849e-04f, +1.656781636e-04f, +1.491090813e-04f, +1.290890081e-04f, +1.071957695e-04f, +8.493953768e-05f, +6.365223261e-05f, +4.440361746e-05f, +2.794966288e-05f, +1.471498148e-05f, +4.807454348e-06f, -1.940004617e-06f, -5.907943456e-06f, -7.617829132e-06f, -7.657373026e-06f, -6.611804677e-06f, + /* 0,17 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.623863630e-04f, -5.912492225e-04f, -8.393230423e-04f, -1.063486334e-03f, -1.201686999e-03f, -1.173834369e-03f, -8.849961625e-04f, -2.309769343e-04f, +8.939184250e-04f, +2.587417548e-03f, +4.928853632e-03f, +7.968727757e-03f, +1.171932707e-02f, +1.614747299e-02f, +2.117036087e-02f, +2.665522321e-02f, +3.242322034e-02f, +3.825756657e-02f, +4.391547655e-02f, +4.914311219e-02f, +5.369237093e-02f, +5.733812134e-02f, +5.989439231e-02f, +6.122807178e-02f, +6.126886953e-02f, +6.001462650e-02f, +5.753147838e-02f, +5.394885828e-02f, +4.944980188e-02f, +4.425744853e-02f, +3.861896676e-02f, +3.278834001e-02f, +2.700950789e-02f, +2.150126709e-02f, +1.644510957e-02f, +1.197684112e-02f, +8.182421794e-03f, +5.098046504e-03f, +2.714084862e-03f, +9.821661133e-04f, -1.755412632e-04f, -8.559259511e-04f, -1.164476647e-03f, -1.205730648e-03f, -1.075386869e-03f, -8.545821021e-04f, -6.065447794e-04f, -3.755657852e-04f, + +6.522907823e-06f, +7.617957255e-06f, +7.663019833e-06f, +6.075048267e-06f, +2.264573046e-06f, -4.296176977e-06f, -1.399874871e-05f, -2.702553133e-05f, -4.328729862e-05f, -6.237997497e-05f, -8.356813575e-05f, -1.058004694e-04f, -1.277592971e-04f, -1.479425855e-04f, -1.647731083e-04f, -1.767259657e-04f, -1.824629900e-04f, -1.809610208e-04f, -1.716208647e-04f, -1.543450521e-04f, -1.295751782e-04f, -9.828341550e-05f, -6.191730505e-05f, -2.230168514e-05f, +1.849394269e-05f, +5.831068052e-05f, +9.506381053e-05f, +1.268994749e-04f, +1.523299854e-04f, +1.703355517e-04f, +1.804237446e-04f, +1.826423998e-04f, +1.775464088e-04f, +1.661234121e-04f, +1.496872908e-04f, +1.297511522e-04f, +1.078929320e-04f, +8.562670900e-05f, +6.429140060e-05f, +4.496592050e-05f, +2.841648733e-05f, +1.507800476e-05f, +5.067743758e-06f, -1.773638826e-06f, -5.821084136e-06f, -7.592796692e-06f, -7.675507496e-06f, -6.655454364e-06f, + /* 0,18 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f, + +6.477690047e-06f, +7.596710501e-06f, +7.683214852e-06f, +6.155328848e-06f, +2.422804631e-06f, -4.045170841e-06f, -1.364553606e-05f, -2.656823942e-05f, -4.273331820e-05f, -6.174694096e-05f, -8.288397896e-05f, -1.051024197e-04f, -1.270918263e-04f, -1.473543959e-04f, -1.643133904e-04f, -1.764402438e-04f, -1.823889449e-04f, -1.811247071e-04f, -1.720337218e-04f, -1.550020465e-04f, -1.304543135e-04f, -9.934671235e-05f, -6.311320721e-05f, -2.356870096e-05f, +1.722268318e-05f, +5.710236930e-05f, +9.398087530e-05f, +1.259949353e-04f, +1.516436772e-04f, +1.698915531e-04f, +1.802292123e-04f, +1.826878783e-04f, +1.778075273e-04f, +1.665637486e-04f, +1.502620772e-04f, +1.304114247e-04f, +1.085897106e-04f, +8.631481091e-05f, +6.493255712e-05f, +4.553096181e-05f, +2.888647360e-05f, +1.544430097e-05f, +5.331145428e-06f, -1.604532908e-06f, -5.731996914e-06f, -7.566115013e-06f, -7.692569891e-06f, -6.698551799e-06f, + /* 0,19 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.493857651e-04f, -5.760345548e-04f, -8.239768076e-04f, -1.051255956e-03f, -1.196999621e-03f, -1.182175717e-03f, -9.126404473e-04f, -2.845707051e-04f, +8.078978082e-04f, +2.463290632e-03f, +4.762401517e-03f, +7.757824868e-03f, +1.146447595e-02f, +1.585217601e-02f, +2.084127438e-02f, +2.630205700e-02f, +3.205836840e-02f, +3.789548084e-02f, +4.357182196e-02f, +4.883376509e-02f, +5.343234143e-02f, +5.714049121e-02f, +5.976936179e-02f, +6.118220139e-02f, +6.130458616e-02f, +6.013003955e-02f, +5.772052307e-02f, +5.420175269e-02f, +4.975377555e-02f, +4.459767564e-02f, +3.897961971e-02f, +3.315367029e-02f, +2.736486182e-02f, +2.183395425e-02f, +1.674505894e-02f, +1.223700370e-02f, +8.398904437e-03f, +5.269988024e-03f, +2.843308820e-03f, +1.072662996e-03f, -1.182383022e-04f, -8.254036453e-04f, -1.154077757e-03f, -1.209108819e-03f, -1.086939950e-03f, -8.697410138e-04f, -6.219128568e-04f, -3.889197914e-04f, + +6.431978801e-06f, +7.574460766e-06f, +7.701834142e-06f, +6.233451705e-06f, +2.578353981e-06f, -3.797240619e-06f, -1.329559004e-05f, -2.611413971e-05f, -4.218214685e-05f, -6.111600674e-05f, -8.220090042e-05f, -1.044041619e-04f, -1.264226756e-04f, -1.467629763e-04f, -1.638489388e-04f, -1.761484629e-04f, -1.823078213e-04f, -1.812807091e-04f, -1.724387800e-04f, -1.556516572e-04f, -1.313270034e-04f, -1.004049721e-04f, -6.430585546e-05f, -2.483449136e-05f, +1.595052764e-05f, +5.589110862e-05f, +9.289315982e-05f, +1.250841413e-04f, +1.509500984e-04f, +1.694397852e-04f, +1.800269439e-04f, +1.827261540e-04f, +1.780624044e-04f, +1.669991291e-04f, +1.508333922e-04f, +1.310697774e-04f, +1.092860609e-04f, +8.700380586e-05f, +6.557567358e-05f, +4.609872289e-05f, +2.935961333e-05f, +1.581387101e-05f, +5.597667930e-06f, -1.432672729e-06f, -5.640664402e-06f, -7.537765705e-06f, -7.708542790e-06f, -6.741082046e-06f, + /* 0,20 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f, + +6.385788534e-06f, +7.551225169e-06f, +7.718896060e-06f, +6.309434527e-06f, +2.731235893e-06f, -3.552376721e-06f, -1.294890841e-05f, -2.566323901e-05f, -4.163380147e-05f, -6.048719935e-05f, -8.151893637e-05f, -1.037057395e-04f, -1.257518931e-04f, -1.461683752e-04f, -1.633797983e-04f, -1.758506607e-04f, -1.822196454e-04f, -1.814290384e-04f, -1.728360349e-04f, -1.562938633e-04f, -1.321932110e-04f, -1.014581444e-04f, -6.549518960e-05f, -2.609899070e-05f, +1.467754219e-05f, +5.467696004e-05f, +9.180071650e-05f, +1.241671324e-04f, +1.502492729e-04f, +1.689802556e-04f, +1.798169304e-04f, +1.827572033e-04f, +1.783110046e-04f, +1.674295098e-04f, +1.514011878e-04f, +1.317261621e-04f, +1.099819384e-04f, +8.769365605e-05f, +6.622072111e-05f, +4.666918493e-05f, +2.983589784e-05f, +1.618671553e-05f, +5.867319628e-06f, -1.258044290e-06f, -5.547069277e-06f, -7.507730380e-06f, -7.723408718e-06f, -6.783030070e-06f, + /* 0,21 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.365679977e-04f, -5.609088688e-04f, -8.085560774e-04f, -1.038713070e-03f, -1.191690031e-03f, -1.189525335e-03f, -9.388849457e-04f, -3.363480838e-04f, +7.240818599e-04f, +2.341687426e-03f, +4.598681680e-03f, +7.549714967e-03f, +1.121230138e-02f, +1.555924466e-02f, +2.051404564e-02f, +2.595005788e-02f, +3.169384093e-02f, +3.753277109e-02f, +4.322654714e-02f, +4.852181957e-02f, +5.316882122e-02f, +5.693862809e-02f, +5.963956075e-02f, +6.113126791e-02f, +6.133521423e-02f, +6.024060761e-02f, +5.790521695e-02f, +5.445100397e-02f, +5.005497492e-02f, +4.493609568e-02f, +3.933946359e-02f, +3.351915364e-02f, +2.772123523e-02f, +2.216838289e-02f, +1.704729352e-02f, +1.249979964e-02f, +8.618172436e-03f, +5.444685486e-03f, +2.975105214e-03f, +1.165430903e-03f, -5.904279106e-05f, -7.934030588e-04f, -1.142612770e-03f, -1.211799537e-03f, -1.098127684e-03f, -8.847865099e-04f, -6.373448083e-04f, -4.024439035e-04f, + +6.339133594e-06f, +7.527020764e-06f, +7.734418951e-06f, +6.383295056e-06f, +2.881465290e-06f, -3.310569361e-06f, -1.260548869e-05f, -2.521554387e-05f, -4.108829861e-05f, -5.986054554e-05f, -8.083812284e-05f, -1.030071957e-04f, -1.250795263e-04f, -1.455706410e-04f, -1.629060141e-04f, -1.755468747e-04f, -1.821244437e-04f, -1.815697075e-04f, -1.732254828e-04f, -1.569286442e-04f, -1.330529000e-04f, -1.025061794e-04f, -6.668114971e-05f, -2.736213345e-05f, +1.340379299e-05f, +5.345998535e-05f, +9.070359815e-05f, +1.232439486e-04f, +1.495412255e-04f, +1.685129721e-04f, +1.795991635e-04f, +1.827810030e-04f, +1.785532927e-04f, +1.678548470e-04f, +1.519654159e-04f, +1.323805306e-04f, +1.106772984e-04f, +8.838432342e-05f, +6.686767051e-05f, +4.724232877e-05f, +3.031531818e-05f, +1.656283491e-05f, +6.140108674e-06f, -1.080633738e-06f, -5.451194286e-06f, -7.475990650e-06f, -7.737150143e-06f, -6.824380746e-06f, + /* 0,22 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f, + +6.292028226e-06f, +7.501864540e-06f, +7.748421147e-06f, +6.455051086e-06f, +3.029057220e-06f, -3.071808559e-06f, -1.226532812e-05f, -2.477106051e-05f, -4.054565455e-05f, -5.923607174e-05f, -8.015849554e-05f, -1.023085737e-04f, -1.244056229e-04f, -1.449698222e-04f, -1.624276316e-04f, -1.752371429e-04f, -1.820222430e-04f, -1.817027291e-04f, -1.736071204e-04f, -1.575559798e-04f, -1.339060344e-04f, -1.035490276e-04f, -6.786367609e-05f, -2.862385418e-05f, +1.212934627e-05f, +5.224024653e-05f, +8.960185788e-05f, +1.223146305e-04f, +1.488259813e-04f, +1.680379435e-04f, +1.793736353e-04f, +1.827975304e-04f, +1.787892338e-04f, +1.682750973e-04f, +1.525260286e-04f, +1.330328344e-04f, +1.113720959e-04f, +8.907576968e-05f, +6.751649231e-05f, +4.781813497e-05f, +3.079786504e-05f, +1.694222924e-05f, +6.416043006e-06f, -9.004273601e-07f, -5.353022246e-06f, -7.442528130e-06f, -7.749749481e-06f, -6.865118852e-06f, + /* 0,23 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.239368359e-04f, -5.458799835e-04f, -7.930732373e-04f, -1.025874724e-03f, -1.185779509e-03f, -1.195907712e-03f, -9.637557625e-04f, -3.863346882e-04f, +6.424479067e-04f, +2.222590809e-03f, +4.437685062e-03f, +7.344399198e-03f, +1.096281623e-02f, +1.526870420e-02f, +2.018871199e-02f, +2.559927386e-02f, +3.132969425e-02f, +3.716949865e-02f, +4.287971454e-02f, +4.820733494e-02f, +5.290186229e-02f, +5.673257289e-02f, +5.950501592e-02f, +6.107528192e-02f, +6.136074737e-02f, +6.034630785e-02f, +5.808552240e-02f, +5.469656255e-02f, +5.035334212e-02f, +4.527264659e-02f, +3.969843638e-02f, +3.388473218e-02f, +2.807857776e-02f, +2.250451283e-02f, +1.735178496e-02f, +1.276521300e-02f, +8.840221830e-03f, +5.622145579e-03f, +3.109489377e-03f, +1.260491367e-03f, +2.070392152e-06f, -7.598979946e-04f, -1.130056618e-03f, -1.213780598e-03f, -1.108931901e-03f, -8.997050287e-04f, -6.528317079e-04f, -4.161334031e-04f, + +6.244486575e-06f, +7.475773419e-06f, +7.760920964e-06f, +6.524720458e-06f, +3.174026850e-06f, -2.836084140e-06f, -1.192842370e-05f, -2.432979486e-05f, -4.000588521e-05f, -5.861380406e-05f, -7.948008996e-05f, -1.016099164e-04f, -1.237302304e-04f, -1.443659673e-04f, -1.619446962e-04f, -1.749215037e-04f, -1.819130706e-04f, -1.818281164e-04f, -1.739809448e-04f, -1.581758507e-04f, -1.347525789e-04f, -1.045866398e-04f, -6.904270931e-05f, -2.988408757e-05f, +1.085426828e-05f, +5.101780578e-05f, +8.849554918e-05f, +1.213792189e-04f, +1.481035659e-04f, +1.675551786e-04f, +1.791403384e-04f, +1.828067631e-04f, +1.790187932e-04f, +1.686902173e-04f, +1.530829779e-04f, +1.336830254e-04f, +1.120662859e-04f, +8.976795629e-05f, +6.816715673e-05f, +4.839658372e-05f, +3.128352883e-05f, +1.732489835e-05f, +6.695130348e-06f, -7.174115923e-07f, -5.252536049e-06f, -7.407324442e-06f, -7.761189099e-06f, -6.905229076e-06f, + /* 0,24 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f, + +6.196522682e-06f, +7.448764252e-06f, +7.771936700e-06f, +6.592321062e-06f, +3.316389466e-06f, -2.603385740e-06f, -1.159477218e-05f, -2.389175254e-05f, -3.946900620e-05f, -5.799376832e-05f, -7.880294129e-05f, -1.009112666e-04f, -1.230533962e-04f, -1.437591249e-04f, -1.614572536e-04f, -1.745999956e-04f, -1.817969543e-04f, -1.819458831e-04f, -1.743469537e-04f, -1.587882379e-04f, -1.355924986e-04f, -1.056189673e-04f, -7.021819019e-05f, -3.114276840e-05f, +9.578625365e-06f, +4.979272550e-05f, +8.738472583e-05f, +1.204377551e-04f, +1.473740055e-04f, +1.670646871e-04f, +1.788992659e-04f, +1.828086792e-04f, +1.792419368e-04f, +1.691001640e-04f, +1.536362162e-04f, +1.343310549e-04f, +1.127598233e-04f, +9.046084446e-05f, +6.881963368e-05f, +4.897765493e-05f, +3.177229965e-05f, +1.771084180e-05f, +6.977378204e-06f, -5.315730174e-07f, -5.149718660e-06f, -7.370361214e-06f, -7.771451312e-06f, -6.944696012e-06f, + /* 0,25 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.114958267e-04f, -5.309554459e-04f, -7.775403796e-04f, -1.012757683e-03f, -1.179289092e-03f, -1.201347182e-03f, -9.872789584e-04f, -4.345562356e-04f, +5.629730153e-04f, +2.105983236e-03f, +4.279402031e-03f, +7.141878015e-03f, +1.071603260e-02f, +1.498057911e-02f, +1.986531004e-02f, +2.524975236e-02f, +3.096598422e-02f, +3.680572465e-02f, +4.253138664e-02f, +4.789037086e-02f, +5.263151721e-02f, +5.652236728e-02f, +5.936575502e-02f, +6.101425507e-02f, +6.138118026e-02f, +6.044711838e-02f, +5.826140268e-02f, +5.493837952e-02f, +5.064881970e-02f, +4.560726646e-02f, +4.005647599e-02f, +3.425034762e-02f, +2.843683849e-02f, +2.284230321e-02f, +1.765850416e-02f, +1.303322708e-02f, +9.065047940e-03f, +5.802374380e-03f, +3.246476168e-03f, +1.357865606e-03f, +6.512622063e-05f, -7.248622545e-04f, -1.116384110e-03f, -1.215029582e-03f, -1.119334155e-03f, -9.144827144e-04f, -6.683643483e-04f, -4.299833282e-04f, + +6.148150484e-06f, +7.420853824e-06f, +7.781486633e-06f, +6.657870832e-06f, +3.456160473e-06f, -2.373702808e-06f, -1.126437005e-05f, -2.345693889e-05f, -3.893503281e-05f, -5.737599002e-05f, -7.812708446e-05f, -1.002126668e-04f, -1.223751678e-04f, -1.431493437e-04f, -1.609653496e-04f, -1.742726574e-04f, -1.816739221e-04f, -1.820560435e-04f, -1.747051455e-04f, -1.593931230e-04f, -1.364257588e-04f, -1.066459616e-04f, -7.139005983e-05f, -3.239983159e-05f, +8.302483877e-06f, +4.856506828e-05f, +8.626944199e-05f, +1.194902810e-04f, +1.466373266e-04f, +1.665664791e-04f, +1.786504114e-04f, +1.828032572e-04f, +1.794586306e-04f, +1.695048947e-04f, +1.541856957e-04f, +1.349768747e-04f, +1.134526627e-04f, +9.115439517e-05f, +6.947389279e-05f, +4.956132816e-05f, +3.226416726e-05f, +1.810005886e-05f, +7.262793860e-06f, -3.428983692e-07f, -5.044553124e-06f, -7.331620083e-06f, -7.780518386e-06f, -6.983504168e-06f, + /* 0,26 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f, + +6.099383813e-06f, +7.392058845e-06f, +7.789589021e-06f, +6.721387745e-06f, +3.593355386e-06f, -2.147024604e-06f, -1.093721356e-05f, -2.302535893e-05f, -3.840398002e-05f, -5.676049434e-05f, -7.745255413e-05f, -9.951415924e-05f, -1.216955923e-04f, -1.425366721e-04f, -1.604690300e-04f, -1.739395284e-04f, -1.815440025e-04f, -1.821586121e-04f, -1.750555188e-04f, -1.599904879e-04f, -1.372523257e-04f, -1.076675748e-04f, -7.255825958e-05f, -3.365521214e-05f, +7.025910221e-06f, +4.733489691e-05f, +8.514975212e-05f, +1.185368387e-04f, +1.458935566e-04f, +1.660605652e-04f, +1.783937689e-04f, +1.827904761e-04f, +1.796688410e-04f, +1.699043667e-04f, +1.547313687e-04f, +1.356204362e-04f, +1.141447587e-04f, +9.184856916e-05f, +7.012990339e-05f, +5.014758269e-05f, +3.275912115e-05f, +1.849254854e-05f, +7.551384381e-06f, -1.513745344e-07f, -4.937022566e-06f, -7.291082698e-06f, -7.788372543e-06f, -7.021637960e-06f, + /* 0,27 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.992482924e-04f, -5.161425332e-04f, -7.619693040e-04f, -9.993784239e-04f, -1.172239576e-03f, -1.205867910e-03f, -1.009480542e-03f, -4.810385334e-04f, +4.856340025e-04f, +1.991846752e-03f, +4.123822392e-03f, +6.942151189e-03f, +1.047196184e-02f, +1.469489309e-02f, +1.954387566e-02f, +2.490154017e-02f, +3.060276630e-02f, +3.644151000e-02f, +4.218162598e-02f, +4.757098725e-02f, +5.235783912e-02f, +5.630805374e-02f, +5.922180670e-02f, +6.094820002e-02f, +6.139650865e-02f, +6.054301834e-02f, +5.843282187e-02f, +5.517640664e-02f, +5.094135058e-02f, +4.593989350e-02f, +4.041352017e-02f, +3.461594135e-02f, +2.879596596e-02f, +2.318171247e-02f, +1.796742122e-02f, +1.330382439e-02f, +9.292645361e-03f, +5.985377344e-03f, +3.386079964e-03f, +1.457574517e-03f, +1.301495090e-04f, -6.882696471e-04f, -1.101569931e-03f, -1.215523855e-03f, -1.129315731e-03f, -9.291054171e-04f, -6.839332393e-04f, -4.439884703e-04f, + +6.050236397e-06f, +7.362395954e-06f, +7.796262099e-06f, +6.782889817e-06f, +3.727989835e-06f, -1.923340206e-06f, -1.061329869e-05f, -2.259701741e-05f, -3.787586248e-05f, -5.614730615e-05f, -7.677938468e-05f, -9.881578617e-05f, -1.210147169e-04f, -1.419211588e-04f, -1.599683410e-04f, -1.736006478e-04f, -1.814072243e-04f, -1.822536042e-04f, -1.753980729e-04f, -1.605803153e-04f, -1.380721657e-04f, -1.086837592e-04f, -7.372273107e-05f, -3.490884522e-05f, +5.748970827e-06f, +4.610227435e-05f, +8.402571100e-05f, +1.175774709e-04f, +1.451427229e-04f, +1.655469566e-04f, +1.781293332e-04f, +1.827703153e-04f, +1.798725349e-04f, +1.702985375e-04f, +1.552731878e-04f, +1.362616909e-04f, +1.148360655e-04f, +9.254332692e-05f, +7.078763450e-05f, +5.073639743e-05f, +3.325715046e-05f, +1.888830955e-05f, +7.843156605e-06f, +4.301144525e-08f, -4.827110191e-06f, -7.248730722e-06f, -7.794995958e-06f, -7.059081716e-06f, + /* 0,28 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f, + +6.000721856e-06f, +7.331881716e-06f, +7.801524077e-06f, +6.842395104e-06f, +3.860079559e-06f, -1.702638511e-06f, -1.029262119e-05f, -2.217191876e-05f, -3.735069452e-05f, -5.553645002e-05f, -7.610761022e-05f, -9.811758948e-05f, -1.203325886e-04f, -1.413028526e-04f, -1.594633288e-04f, -1.732560555e-04f, -1.812636169e-04f, -1.823410354e-04f, -1.757328077e-04f, -1.611625883e-04f, -1.388852458e-04f, -1.096944677e-04f, -7.488341620e-05f, -3.616066610e-05f, +4.471732158e-06f, +4.486726377e-05f, +8.289737375e-05f, +1.166122207e-04f, +1.443848538e-04f, +1.650256649e-04f, +1.778570993e-04f, +1.827427547e-04f, +1.800696793e-04f, +1.706873651e-04f, +1.558111055e-04f, +1.369005902e-04f, +1.155265373e-04f, +9.323862873e-05f, +7.144705488e-05f, +5.132775100e-05f, +3.375824403e-05f, +1.928734033e-05f, +8.138117147e-06f, +2.402723706e-07f, -4.714799292e-06f, -7.204545832e-06f, -7.800370763e-06f, -7.095819678e-06f, + /* 0,29 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.871973341e-04f, -5.014482555e-04f, -7.463715178e-04f, -9.857531390e-04f, -1.164651507e-03f, -1.209493888e-03f, -1.030386462e-03f, -5.258074696e-04f, +4.104074455e-04f, +1.880162996e-03f, +3.970935397e-03f, +6.745217813e-03f, +1.023061454e-02f, +1.441166908e-02f, +1.922444399e-02f, +2.455468347e-02f, +3.024009546e-02f, +3.607691536e-02f, +4.183049510e-02f, +4.724924434e-02f, +5.208088171e-02f, +5.608967552e-02f, +5.907320056e-02f, +6.087713051e-02f, +6.140672936e-02f, +6.063398788e-02f, +5.859974496e-02f, +5.541059633e-02f, +5.123087815e-02f, +4.627046613e-02f, +4.076950660e-02f, +3.498145442e-02f, +2.915590817e-02f, +2.352269837e-02f, +1.827850552e-02f, +1.357698668e-02f, +9.523007964e-03f, +6.171159300e-03f, +3.528314653e-03f, +1.559638665e-03f, +1.971649035e-04f, -6.500939972e-04f, -1.085588658e-03f, -1.215240571e-03f, -1.138857640e-03f, -9.435586937e-04f, -6.995286060e-04f, -4.581433717e-04f, + +5.950853705e-06f, +7.300532620e-06f, +7.805393139e-06f, +6.899921698e-06f, +3.989640402e-06f, -1.484908233e-06f, -9.975176579e-06f, -2.175006713e-05f, -3.682849015e-05f, -5.492795017e-05f, -7.543726457e-05f, -9.741961088e-05f, -1.196492544e-04f, -1.406818019e-04f, -1.589540398e-04f, -1.729057912e-04f, -1.811132097e-04f, -1.824209217e-04f, -1.760597234e-04f, -1.617372905e-04f, -1.396915333e-04f, -1.106996535e-04f, -7.604025715e-05f, -3.741061019e-05f, +3.194260694e-06f, +4.362992850e-05f, +8.176479580e-05f, +1.156411315e-04f, +1.436199778e-04f, +1.644967024e-04f, +1.775770628e-04f, +1.827077745e-04f, +1.802602417e-04f, +1.710708076e-04f, +1.563450745e-04f, +1.375370856e-04f, +1.162161284e-04f, +9.393443463e-05f, +7.210813297e-05f, +5.192162170e-05f, +3.426239038e-05f, +1.968963904e-05f, +8.436272395e-06f, +4.404208828e-07f, -4.600073246e-06f, -7.158509723e-06f, -7.804479049e-06f, -7.131836001e-06f, + /* 0,30 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f, + +5.900645350e-06f, +7.268365081e-06f, +7.807887439e-06f, +6.955487723e-06f, +4.116688316e-06f, -1.270137912e-06f, -9.660960103e-06f, -2.133146638e-05f, -3.630926307e-05f, -5.432183054e-05f, -7.476838129e-05f, -9.672189189e-05f, -1.189647611e-04f, -1.400580555e-04f, -1.584405205e-04f, -1.725498952e-04f, -1.809560329e-04f, -1.824932796e-04f, -1.763788209e-04f, -1.623044060e-04f, -1.404909963e-04f, -1.116992702e-04f, -7.719319639e-05f, -3.865861306e-05f, +1.916622938e-06f, +4.239033203e-05f, +8.062803289e-05f, +1.146642473e-04f, +1.428481242e-04f, +1.639600817e-04f, +1.772892198e-04f, +1.826653555e-04f, +1.804441899e-04f, +1.714488231e-04f, +1.568750475e-04f, +1.381711284e-04f, +1.169047926e-04f, +9.463070442e-05f, +7.277083693e-05f, +5.251798750e-05f, +3.476957772e-05f, +2.009520355e-05f, +8.737628506e-06f, +6.434694612e-07f, -4.482915520e-06f, -7.110604110e-06f, -7.807302866e-06f, -7.167114757e-06f, + /* 0,31 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.753458351e-04f, -4.868793578e-04f, -7.307582372e-04f, -9.718977296e-04f, -1.156545178e-03f, -1.212248935e-03f, -1.050022599e-03f, -5.688890031e-04f, +3.372696922e-04f, +1.770913215e-03f, +3.820729751e-03f, +6.551076310e-03f, +9.992000524e-03f, +1.413092922e-02f, +1.890704943e-02f, +2.420922778e-02f, +2.987802621e-02f, +3.571200116e-02f, +4.147805655e-02f, +4.692520265e-02f, +5.180069918e-02f, +5.586727659e-02f, +5.891996710e-02f, +6.080106129e-02f, +6.141184024e-02f, +6.072000814e-02f, +5.876213779e-02f, +5.564090171e-02f, +5.151734626e-02f, +4.659892291e-02f, +4.112437288e-02f, +3.534682755e-02f, +2.951661261e-02f, +2.386521801e-02f, +1.859172564e-02f, +1.385269489e-02f, +9.756128885e-03f, +6.359724439e-03f, +3.673193623e-03f, +1.664078274e-03f, +2.661968716e-04f, -6.103091546e-04f, -1.068414757e-03f, -1.214156681e-03f, -1.147940629e-03f, -9.578278075e-04f, -7.151403879e-04f, -4.724423225e-04f, + +5.850110091e-06f, +7.235395433e-06f, +7.809025104e-06f, +7.009111338e-06f, +4.241239355e-06f, -1.058315911e-06f, -9.349966785e-06f, -2.091612006e-05f, -3.579302665e-05f, -5.371811474e-05f, -7.410099365e-05f, -9.602447380e-05f, -1.182791553e-04f, -1.394316620e-04f, -1.579228174e-04f, -1.721884081e-04f, -1.807921168e-04f, -1.825581262e-04f, -1.766901015e-04f, -1.628639195e-04f, -1.412836031e-04f, -1.126932717e-04f, -7.834217668e-05f, -3.990461040e-05f, +6.388853996e-07f, +4.114853805e-05f, +7.948714106e-05f, +1.136816124e-04f, +1.420693226e-04f, +1.634158161e-04f, +1.769935670e-04f, +1.826154788e-04f, +1.806214921e-04f, +1.718213704e-04f, +1.574009775e-04f, +1.388026701e-04f, +1.175924836e-04f, +9.532739769e-05f, +7.343513463e-05f, +5.311682607e-05f, +3.527979396e-05f, +2.050403146e-05f, +9.042191405e-06f, +8.494304210e-07f, -4.363309672e-06f, -7.060810728e-06f, -7.808824226e-06f, -7.201639933e-06f, + /* 1, 0 (48) */ + -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f, + +7.201639933e-06f, +7.808824226e-06f, +7.060810728e-06f, +4.363309672e-06f, -8.494304210e-07f, -9.042191405e-06f, -2.050403146e-05f, -3.527979396e-05f, -5.311682607e-05f, -7.343513463e-05f, -9.532739769e-05f, -1.175924836e-04f, -1.388026701e-04f, -1.574009775e-04f, -1.718213704e-04f, -1.806214921e-04f, -1.826154788e-04f, -1.769935670e-04f, -1.634158161e-04f, -1.420693226e-04f, -1.136816124e-04f, -7.948714106e-05f, -4.114853805e-05f, -6.388853996e-07f, +3.990461040e-05f, +7.834217668e-05f, +1.126932717e-04f, +1.412836031e-04f, +1.628639195e-04f, +1.766901015e-04f, +1.825581262e-04f, +1.807921168e-04f, +1.721884081e-04f, +1.579228174e-04f, +1.394316620e-04f, +1.182791553e-04f, +9.602447380e-05f, +7.410099365e-05f, +5.371811474e-05f, +3.579302665e-05f, +2.091612006e-05f, +9.349966785e-06f, +1.058315911e-06f, -4.241239355e-06f, -7.009111338e-06f, -7.809025104e-06f, -7.235395433e-06f, -5.850110091e-06f, + +7.400711575e-04f, +1.375020608e-03f, +2.149280883e-03f, +2.889370620e-03f, +3.314167096e-03f, +3.062969010e-03f, +1.758157367e-03f, -9.035293376e-04f, -5.046849967e-03f, -1.052447103e-02f, -1.686036328e-02f, -2.325321288e-02f, -2.865282346e-02f, -3.190731847e-02f, -3.196179918e-02f, -2.807404400e-02f, -2.000388698e-02f, -8.133017718e-03f, +6.517945993e-03f, +2.238959427e-02f, +3.759199639e-02f, +5.018871167e-02f, +5.850644264e-02f, +6.141247912e-02f, +5.850644264e-02f, +5.018871167e-02f, +3.759199639e-02f, +2.238959427e-02f, +6.517945993e-03f, -8.133017718e-03f, -2.000388698e-02f, -2.807404400e-02f, -3.196179918e-02f, -3.190731847e-02f, -2.865282346e-02f, -2.325321288e-02f, -1.686036328e-02f, -1.052447103e-02f, -5.046849967e-03f, -9.035293376e-04f, +1.758157367e-03f, +3.062969010e-03f, +3.314167096e-03f, +2.889370620e-03f, +2.149280883e-03f, +1.375020608e-03f, +7.400711575e-04f, +3.136419749e-04f, + -1.659937380e-05f, -2.256041491e-05f, -2.486780869e-05f, -2.006906889e-05f, -5.045062098e-06f, +2.191765594e-05f, +6.008443510e-05f, +1.055682666e-04f, +1.512517643e-04f, +1.875167265e-04f, +2.037839118e-04f, +1.906528266e-04f, +1.422374703e-04f, +5.817440947e-05f, -5.522355901e-05f, -1.850656642e-04f, -3.133868468e-04f, -4.199011281e-04f, -4.855454817e-04f, -4.961329892e-04f, -4.453540068e-04f, -3.364549421e-04f, -1.821741084e-04f, -2.871243403e-06f, +1.768283313e-04f, +3.322313388e-04f, +4.427876402e-04f, +4.954835019e-04f, +4.867652811e-04f, +4.226610826e-04f, +3.171517381e-04f, +1.892017453e-04f, +5.911498836e-05f, -5.502368951e-05f, -1.401349478e-04f, -1.896917185e-04f, -2.038605671e-04f, -1.883821463e-04f, -1.525821837e-04f, -1.070377027e-04f, -6.142412938e-05f, -2.295246704e-05f, +4.386614560e-06f, +1.976802667e-05f, +2.484354255e-05f, +2.270517913e-05f, +1.680953745e-05f, +1.011663066e-05f, + /* 1, 1 (48) */ + -4.724423225e-04f, -7.151403879e-04f, -9.578278075e-04f, -1.147940629e-03f, -1.214156681e-03f, -1.068414757e-03f, -6.103091546e-04f, +2.661968716e-04f, +1.664078274e-03f, +3.673193623e-03f, +6.359724439e-03f, +9.756128885e-03f, +1.385269489e-02f, +1.859172564e-02f, +2.386521801e-02f, +2.951661261e-02f, +3.534682755e-02f, +4.112437288e-02f, +4.659892291e-02f, +5.151734626e-02f, +5.564090171e-02f, +5.876213779e-02f, +6.072000814e-02f, +6.141184024e-02f, +6.080106129e-02f, +5.891996710e-02f, +5.586727659e-02f, +5.180069918e-02f, +4.692520265e-02f, +4.147805655e-02f, +3.571200116e-02f, +2.987802621e-02f, +2.420922778e-02f, +1.890704943e-02f, +1.413092922e-02f, +9.992000524e-03f, +6.551076310e-03f, +3.820729751e-03f, +1.770913215e-03f, +3.372696922e-04f, -5.688890031e-04f, -1.050022599e-03f, -1.212248935e-03f, -1.156545178e-03f, -9.718977296e-04f, -7.307582372e-04f, -4.868793578e-04f, -2.753458351e-04f, + +7.167114757e-06f, +7.807302866e-06f, +7.110604110e-06f, +4.482915520e-06f, -6.434694612e-07f, -8.737628506e-06f, -2.009520355e-05f, -3.476957772e-05f, -5.251798750e-05f, -7.277083693e-05f, -9.463070442e-05f, -1.169047926e-04f, -1.381711284e-04f, -1.568750475e-04f, -1.714488231e-04f, -1.804441899e-04f, -1.826653555e-04f, -1.772892198e-04f, -1.639600817e-04f, -1.428481242e-04f, -1.146642473e-04f, -8.062803289e-05f, -4.239033203e-05f, -1.916622938e-06f, +3.865861306e-05f, +7.719319639e-05f, +1.116992702e-04f, +1.404909963e-04f, +1.623044060e-04f, +1.763788209e-04f, +1.824932796e-04f, +1.809560329e-04f, +1.725498952e-04f, +1.584405205e-04f, +1.400580555e-04f, +1.189647611e-04f, +9.672189189e-05f, +7.476838129e-05f, +5.432183054e-05f, +3.630926307e-05f, +2.133146638e-05f, +9.660960103e-06f, +1.270137912e-06f, -4.116688316e-06f, -6.955487723e-06f, -7.807887439e-06f, -7.268365081e-06f, -5.900645350e-06f, + +7.234717837e-04f, +1.352460193e-03f, +2.124413074e-03f, +2.869301551e-03f, +3.309122034e-03f, +3.084886666e-03f, +1.818241802e-03f, -7.979610710e-04f, -4.895598203e-03f, -1.033695430e-02f, -1.665657936e-02f, -2.306256005e-02f, -2.851058599e-02f, -3.184914406e-02f, -3.201702274e-02f, -2.825910966e-02f, -2.031727383e-02f, -8.552918846e-03f, +6.032400511e-03f, +2.189346129e-02f, +3.714664238e-02f, +4.985225673e-02f, +5.832426853e-02f, +6.140960788e-02f, +5.868327097e-02f, +5.052094301e-02f, +3.803478403e-02f, +2.288507778e-02f, +7.004711274e-03f, -7.710356635e-03f, -1.968673524e-02f, -2.788484225e-02f, -3.190268420e-02f, -3.196234216e-02f, -2.879295841e-02f, -2.344290460e-02f, -1.706422384e-02f, -1.071285317e-02f, -5.199432151e-03f, -1.010567040e-03f, +1.696733238e-03f, +3.040016543e-03f, +3.318553711e-03f, +2.909138647e-03f, +2.174124425e-03f, +1.397725787e-03f, +7.568806949e-04f, +3.237586056e-04f, + -1.638859383e-05f, -2.241212896e-05f, -2.488511074e-05f, -2.036001099e-05f, -5.691648011e-06f, +2.089404958e-05f, +5.875215808e-05f, +1.040992379e-04f, +1.499122321e-04f, +1.866316842e-04f, +2.036782580e-04f, +1.915790189e-04f, +1.443046239e-04f, +6.129593148e-05f, -5.134861502e-05f, -1.809282955e-04f, -3.096005616e-04f, -4.171008580e-04f, -4.842712606e-04f, -4.967217519e-04f, -4.478628235e-04f, -3.406335909e-04f, -1.874950937e-04f, -8.613337121e-06f, +1.714584810e-04f, +3.279633107e-04f, +4.401639799e-04f, +4.947732413e-04f, +4.879303311e-04f, +4.253801896e-04f, +3.208946069e-04f, +1.933359288e-04f, +6.302241295e-05f, -5.184407396e-05f, -1.379971457e-04f, -1.886955890e-04f, -2.039079747e-04f, -1.892276213e-04f, -1.539031669e-04f, -1.085072808e-04f, -6.277106912e-05f, -2.399841424e-05f, +3.716284432e-06f, +1.945680269e-05f, +2.481220449e-05f, +2.284631865e-05f, +1.701900789e-05f, +1.031543611e-05f, + /* 1, 2 (48) */ + -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f, + +7.131836001e-06f, +7.804479049e-06f, +7.158509723e-06f, +4.600073246e-06f, -4.404208828e-07f, -8.436272395e-06f, -1.968963904e-05f, -3.426239038e-05f, -5.192162170e-05f, -7.210813297e-05f, -9.393443463e-05f, -1.162161284e-04f, -1.375370856e-04f, -1.563450745e-04f, -1.710708076e-04f, -1.802602417e-04f, -1.827077745e-04f, -1.775770628e-04f, -1.644967024e-04f, -1.436199778e-04f, -1.156411315e-04f, -8.176479580e-05f, -4.362992850e-05f, -3.194260694e-06f, +3.741061019e-05f, +7.604025715e-05f, +1.106996535e-04f, +1.396915333e-04f, +1.617372905e-04f, +1.760597234e-04f, +1.824209217e-04f, +1.811132097e-04f, +1.729057912e-04f, +1.589540398e-04f, +1.406818019e-04f, +1.196492544e-04f, +9.741961088e-05f, +7.543726457e-05f, +5.492795017e-05f, +3.682849015e-05f, +2.175006713e-05f, +9.975176579e-06f, +1.484908233e-06f, -3.989640402e-06f, -6.899921698e-06f, -7.805393139e-06f, -7.300532620e-06f, -5.950853705e-06f, + +7.070831898e-04f, +1.330048064e-03f, +2.099527963e-03f, +2.848941540e-03f, +3.303430386e-03f, +3.105780715e-03f, +1.876993960e-03f, -6.938618331e-04f, -4.745685971e-03f, -1.015032262e-02f, -1.645290111e-02f, -2.287098103e-02f, -2.836628136e-02f, -3.178784813e-02f, -3.206837136e-02f, -2.844003796e-02f, -2.062687439e-02f, -8.970019704e-03f, +5.548129250e-03f, +2.139673953e-02f, +3.669877956e-02f, +4.951162314e-02f, +5.813677344e-02f, +6.140099454e-02f, +5.885472945e-02f, +5.084890632e-02f, +3.847494801e-02f, +2.337985102e-02f, +7.492641605e-03f, -7.284976446e-03f, -1.936584064e-02f, -2.769150633e-02f, -3.183966178e-02f, -3.201418624e-02f, -2.893095555e-02f, -2.363160019e-02f, -1.726813182e-02f, -1.090208080e-02f, -5.353335318e-03f, -1.119074321e-03f, +1.633962169e-03f, +3.016018128e-03f, +3.322269995e-03f, +2.928595450e-03f, +2.198936630e-03f, +1.420572106e-03f, +7.738997028e-04f, +3.340740417e-04f, + -1.617727343e-05f, -2.226042371e-05f, -2.489555680e-05f, -2.064093598e-05f, -6.326395649e-06f, +1.988171347e-05f, +5.742746693e-05f, +1.026308797e-04f, +1.485639094e-04f, +1.857273426e-04f, +2.035438583e-04f, +1.924704065e-04f, +1.463363255e-04f, +6.438795966e-05f, -4.749064148e-05f, -1.767902467e-04f, -3.057935123e-04f, -4.142608086e-04f, -4.829429533e-04f, -4.972498479e-04f, -4.503138436e-04f, -3.447667631e-04f, -1.927905726e-04f, -1.435425164e-05f, +1.660652804e-04f, +3.236513949e-04f, +4.374832914e-04f, +4.940021681e-04f, +4.890403118e-04f, +4.280579225e-04f, +3.246148259e-04f, +1.974676028e-04f, +6.694533766e-05f, -4.863587167e-05f, -1.358241603e-04f, -1.876643381e-04f, -2.039258891e-04f, -1.900528304e-04f, -1.552143899e-04f, -1.099767330e-04f, -6.412507928e-05f, -2.505542575e-05f, +3.034053170e-06f, +1.913531668e-05f, +2.477368699e-05f, +2.298372996e-05f, +1.722770722e-05f, +1.051543136e-05f, + /* 1, 3 (48) */ + -4.581433717e-04f, -6.995286060e-04f, -9.435586937e-04f, -1.138857640e-03f, -1.215240571e-03f, -1.085588658e-03f, -6.500939972e-04f, +1.971649035e-04f, +1.559638665e-03f, +3.528314653e-03f, +6.171159300e-03f, +9.523007964e-03f, +1.357698668e-02f, +1.827850552e-02f, +2.352269837e-02f, +2.915590817e-02f, +3.498145442e-02f, +4.076950660e-02f, +4.627046613e-02f, +5.123087815e-02f, +5.541059633e-02f, +5.859974496e-02f, +6.063398788e-02f, +6.140672936e-02f, +6.087713051e-02f, +5.907320056e-02f, +5.608967552e-02f, +5.208088171e-02f, +4.724924434e-02f, +4.183049510e-02f, +3.607691536e-02f, +3.024009546e-02f, +2.455468347e-02f, +1.922444399e-02f, +1.441166908e-02f, +1.023061454e-02f, +6.745217813e-03f, +3.970935397e-03f, +1.880162996e-03f, +4.104074455e-04f, -5.258074696e-04f, -1.030386462e-03f, -1.209493888e-03f, -1.164651507e-03f, -9.857531390e-04f, -7.463715178e-04f, -5.014482555e-04f, -2.871973341e-04f, + +7.095819678e-06f, +7.800370763e-06f, +7.204545832e-06f, +4.714799292e-06f, -2.402723706e-07f, -8.138117147e-06f, -1.928734033e-05f, -3.375824403e-05f, -5.132775100e-05f, -7.144705488e-05f, -9.323862873e-05f, -1.155265373e-04f, -1.369005902e-04f, -1.558111055e-04f, -1.706873651e-04f, -1.800696793e-04f, -1.827427547e-04f, -1.778570993e-04f, -1.650256649e-04f, -1.443848538e-04f, -1.166122207e-04f, -8.289737375e-05f, -4.486726377e-05f, -4.471732158e-06f, +3.616066610e-05f, +7.488341620e-05f, +1.096944677e-04f, +1.388852458e-04f, +1.611625883e-04f, +1.757328077e-04f, +1.823410354e-04f, +1.812636169e-04f, +1.732560555e-04f, +1.594633288e-04f, +1.413028526e-04f, +1.203325886e-04f, +9.811758948e-05f, +7.610761022e-05f, +5.553645002e-05f, +3.735069452e-05f, +2.217191876e-05f, +1.029262119e-05f, +1.702638511e-06f, -3.860079559e-06f, -6.842395104e-06f, -7.801524077e-06f, -7.331881716e-06f, -6.000721856e-06f, + +6.909059164e-04f, +1.307787641e-03f, +2.074632406e-03f, +2.828300604e-03f, +3.297103990e-03f, +3.125662429e-03f, +1.934421427e-03f, -5.912309534e-04f, -4.597122062e-03f, -9.964595275e-03f, -1.624935725e-02f, -2.267851063e-02f, -2.821994504e-02f, -3.172346017e-02f, -3.211586200e-02f, -2.861682821e-02f, -2.093266790e-02f, -9.384280512e-03f, +5.065186297e-03f, +2.089948969e-02f, +3.624846571e-02f, +4.916685638e-02f, +5.794398287e-02f, +6.138664029e-02f, +5.902079474e-02f, +5.117255772e-02f, +3.891243130e-02f, +2.387385319e-02f, +7.981681917e-03f, -6.856918523e-03f, -1.904122581e-02f, -2.749403872e-02f, -3.177271645e-02f, -3.206282211e-02f, -2.906677971e-02f, -2.381926452e-02f, -1.747205771e-02f, -1.109213363e-02f, -5.508549708e-03f, -1.229051054e-03f, +1.569837089e-03f, +2.990962703e-03f, +3.325304048e-03f, +2.947730766e-03f, +2.223710317e-03f, +1.443555836e-03f, +7.911274100e-04f, +3.445894731e-04f, + -1.596548744e-05f, -2.210540102e-05f, -2.489925524e-05f, -2.091192815e-05f, -6.949330726e-06f, +1.888071007e-05f, +5.611052704e-05f, +1.011634523e-04f, +1.472071174e-04f, +1.848040261e-04f, +2.033809683e-04f, +1.933271055e-04f, +1.483324988e-04f, +6.745020468e-05f, -4.365011838e-05f, -1.726521230e-04f, -3.019663296e-04f, -4.113815210e-04f, -4.815609030e-04f, -4.977173448e-04f, -4.527068295e-04f, -3.488539443e-04f, -1.980598351e-04f, -2.009320106e-05f, +1.606494561e-04f, +3.192961356e-04f, +4.347458496e-04f, +4.931702526e-04f, +4.900949110e-04f, +4.306937594e-04f, +3.283117689e-04f, +2.015961528e-04f, +7.088326246e-05f, -4.539939795e-05f, -1.336160942e-04f, -1.865978710e-04f, -2.039140682e-04f, -1.908574537e-04f, -1.565155274e-04f, -1.114457889e-04f, -6.548598165e-05f, -2.612342670e-05f, +2.339904673e-06f, +1.880348977e-05f, +2.472788286e-05f, +2.311730902e-05f, +1.743555650e-05f, +1.071657227e-05f, + /* 1, 4 (48) */ + -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f, + +7.059081716e-06f, +7.794995958e-06f, +7.248730722e-06f, +4.827110191e-06f, -4.301144525e-08f, -7.843156605e-06f, -1.888830955e-05f, -3.325715046e-05f, -5.073639743e-05f, -7.078763450e-05f, -9.254332692e-05f, -1.148360655e-04f, -1.362616909e-04f, -1.552731878e-04f, -1.702985375e-04f, -1.798725349e-04f, -1.827703153e-04f, -1.781293332e-04f, -1.655469566e-04f, -1.451427229e-04f, -1.175774709e-04f, -8.402571100e-05f, -4.610227435e-05f, -5.748970827e-06f, +3.490884522e-05f, +7.372273107e-05f, +1.086837592e-04f, +1.380721657e-04f, +1.605803153e-04f, +1.753980729e-04f, +1.822536042e-04f, +1.814072243e-04f, +1.736006478e-04f, +1.599683410e-04f, +1.419211588e-04f, +1.210147169e-04f, +9.881578617e-05f, +7.677938468e-05f, +5.614730615e-05f, +3.787586248e-05f, +2.259701741e-05f, +1.061329869e-05f, +1.923340206e-06f, -3.727989835e-06f, -6.782889817e-06f, -7.796262099e-06f, -7.362395954e-06f, -6.050236397e-06f, + +6.749404290e-04f, +1.285682239e-03f, +2.049733151e-03f, +2.807388676e-03f, +3.290154659e-03f, +3.144543139e-03f, +1.990531954e-03f, -4.900675011e-04f, -4.449914944e-03f, -9.779791249e-03f, -1.604597628e-02f, -2.248518352e-02f, -2.807161254e-02f, -3.165600997e-02f, -3.215951212e-02f, -2.878948033e-02f, -2.123463423e-02f, -9.795662033e-03f, +4.583625394e-03f, +2.040177234e-02f, +3.579575888e-02f, +4.881800243e-02f, +5.774592303e-02f, +6.136654709e-02f, +5.918144419e-02f, +5.149185385e-02f, +3.934717715e-02f, +2.436702344e-02f, +8.471776828e-03f, -6.426224764e-03f, -1.871291404e-02f, -2.729244257e-02f, -3.170183318e-02f, -3.210822151e-02f, -2.920039581e-02f, -2.400586239e-02f, -1.767597177e-02f, -1.128299108e-02f, -5.665065235e-03f, -1.340496843e-03f, +1.504351108e-03f, +2.964839276e-03f, +3.327643953e-03f, +2.966534256e-03f, +2.248438199e-03f, +1.466673145e-03f, +8.085629665e-04f, +3.553060453e-04f, + -1.575330966e-05f, -2.194716213e-05f, -2.489631464e-05f, -2.117307309e-05f, -7.560481282e-06f, +1.789109874e-05f, +5.480150053e-05f, +9.969721340e-05f, +1.458421761e-04f, +1.838620601e-04f, +2.031898472e-04f, +1.941492378e-04f, +1.502930739e-04f, +7.048238377e-05f, -3.982752051e-05f, -1.685145269e-04f, -2.981196454e-04f, -4.084635409e-04f, -4.801254603e-04f, -4.981243193e-04f, -4.550415531e-04f, -3.528946277e-04f, -2.033021755e-04f, -2.582939980e-05f, +1.552117387e-04f, +3.148980846e-04f, +4.319519384e-04f, +4.922774745e-04f, +4.910938247e-04f, +4.332871834e-04f, +3.319848116e-04f, +2.057209625e-04f, +7.483568249e-05f, -4.213497453e-05f, -1.313730568e-04f, -1.854960989e-04f, -2.038722735e-04f, -1.916411728e-04f, -1.578062534e-04f, -1.129141757e-04f, -6.685359483e-05f, -2.720233902e-05f, +1.633825320e-06f, +1.846124455e-05f, +2.467468530e-05f, +2.324695131e-05f, +1.764247584e-05f, +1.091881357e-05f, + /* 1, 5 (48) */ + -4.439884703e-04f, -6.839332393e-04f, -9.291054171e-04f, -1.129315731e-03f, -1.215523855e-03f, -1.101569931e-03f, -6.882696471e-04f, +1.301495090e-04f, +1.457574517e-03f, +3.386079964e-03f, +5.985377344e-03f, +9.292645361e-03f, +1.330382439e-02f, +1.796742122e-02f, +2.318171247e-02f, +2.879596596e-02f, +3.461594135e-02f, +4.041352017e-02f, +4.593989350e-02f, +5.094135058e-02f, +5.517640664e-02f, +5.843282187e-02f, +6.054301834e-02f, +6.139650865e-02f, +6.094820002e-02f, +5.922180670e-02f, +5.630805374e-02f, +5.235783912e-02f, +4.757098725e-02f, +4.218162598e-02f, +3.644151000e-02f, +3.060276630e-02f, +2.490154017e-02f, +1.954387566e-02f, +1.469489309e-02f, +1.047196184e-02f, +6.942151189e-03f, +4.123822392e-03f, +1.991846752e-03f, +4.856340025e-04f, -4.810385334e-04f, -1.009480542e-03f, -1.205867910e-03f, -1.172239576e-03f, -9.993784239e-04f, -7.619693040e-04f, -5.161425332e-04f, -2.992482924e-04f, + +7.021637960e-06f, +7.788372543e-06f, +7.291082698e-06f, +4.937022566e-06f, +1.513745344e-07f, -7.551384381e-06f, -1.849254854e-05f, -3.275912115e-05f, -5.014758269e-05f, -7.012990339e-05f, -9.184856916e-05f, -1.141447587e-04f, -1.356204362e-04f, -1.547313687e-04f, -1.699043667e-04f, -1.796688410e-04f, -1.827904761e-04f, -1.783937689e-04f, -1.660605652e-04f, -1.458935566e-04f, -1.185368387e-04f, -8.514975212e-05f, -4.733489691e-05f, -7.025910221e-06f, +3.365521214e-05f, +7.255825958e-05f, +1.076675748e-04f, +1.372523257e-04f, +1.599904879e-04f, +1.750555188e-04f, +1.821586121e-04f, +1.815440025e-04f, +1.739395284e-04f, +1.604690300e-04f, +1.425366721e-04f, +1.216955923e-04f, +9.951415924e-05f, +7.745255413e-05f, +5.676049434e-05f, +3.840398002e-05f, +2.302535893e-05f, +1.093721356e-05f, +2.147024604e-06f, -3.593355386e-06f, -6.721387745e-06f, -7.789589021e-06f, -7.392058845e-06f, -6.099383813e-06f, + +6.591871193e-04f, +1.263735077e-03f, +2.024836836e-03f, +2.786215603e-03f, +3.282594178e-03f, +3.162434237e-03f, +2.045333455e-03f, -3.903702877e-04f, -4.304072768e-03f, -9.595929189e-03f, -1.584278643e-02f, -2.229103428e-02f, -2.792131946e-02f, -3.158552758e-02f, -3.219933964e-02f, -2.895799486e-02f, -2.153275388e-02f, -1.020412557e-02f, +4.103499934e-03f, +1.990364802e-02f, +3.534071733e-02f, +4.846510781e-02f, +5.754262086e-02f, +6.134071769e-02f, +5.933665593e-02f, +5.180675194e-02f, +3.977912909e-02f, +2.485930091e-02f, +8.962870652e-03f, -5.992937580e-03f, -1.838092923e-02f, -2.708672161e-02f, -3.162699750e-02f, -3.215035648e-02f, -2.933176886e-02f, -2.419135849e-02f, -1.787984405e-02f, -1.147463225e-02f, -5.822871489e-03f, -1.453411019e-03f, +1.437497513e-03f, +2.937636937e-03f, +3.329277778e-03f, +2.984995501e-03f, +2.273112885e-03f, +1.489920096e-03f, +8.262054424e-04f, +3.662248589e-04f, + -1.554081285e-05f, -2.178580768e-05f, -2.488684375e-05f, -2.142445762e-05f, -8.159877660e-06f, +1.691293576e-05f, +5.350054635e-05f, +9.823241829e-05f, +1.444694044e-04f, +1.829017706e-04f, +2.029707573e-04f, +1.949369302e-04f, +1.522179874e-04f, +7.348422069e-05f, -3.602331742e-05f, -1.643780583e-04f, -2.942540920e-04f, -4.055074182e-04f, -4.786369835e-04f, -4.984708574e-04f, -4.573177959e-04f, -3.568883141e-04f, -2.085168925e-04f, -3.156206276e-05f, +1.497528627e-04f, +3.104578006e-04f, +4.291018512e-04f, +4.913238229e-04f, +4.920367567e-04f, +4.358376830e-04f, +3.356333310e-04f, +2.098414137e-04f, +7.880208811e-05f, -3.884292954e-05f, -1.290951640e-04f, -1.843589381e-04f, -2.038002702e-04f, -1.924036704e-04f, -1.590862412e-04f, -1.143816183e-04f, -6.822773425e-05f, -2.829208151e-05f, +9.158039886e-07f, +1.810850509e-05f, +2.461398792e-05f, +2.337255185e-05f, +1.784838432e-05f, +1.112210891e-05f, + /* 1, 6 (48) */ + -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f, + +6.983504168e-06f, +7.780518386e-06f, +7.331620083e-06f, +5.044553124e-06f, +3.428983692e-07f, -7.262793860e-06f, -1.810005886e-05f, -3.226416726e-05f, -4.956132816e-05f, -6.947389279e-05f, -9.115439517e-05f, -1.134526627e-04f, -1.349768747e-04f, -1.541856957e-04f, -1.695048947e-04f, -1.794586306e-04f, -1.828032572e-04f, -1.786504114e-04f, -1.665664791e-04f, -1.466373266e-04f, -1.194902810e-04f, -8.626944199e-05f, -4.856506828e-05f, -8.302483877e-06f, +3.239983159e-05f, +7.139005983e-05f, +1.066459616e-04f, +1.364257588e-04f, +1.593931230e-04f, +1.747051455e-04f, +1.820560435e-04f, +1.816739221e-04f, +1.742726574e-04f, +1.609653496e-04f, +1.431493437e-04f, +1.223751678e-04f, +1.002126668e-04f, +7.812708446e-05f, +5.737599002e-05f, +3.893503281e-05f, +2.345693889e-05f, +1.126437005e-05f, +2.373702808e-06f, -3.456160473e-06f, -6.657870832e-06f, -7.781486633e-06f, -7.420853824e-06f, -6.148150484e-06f, + +6.436463064e-04f, +1.241949270e-03f, +1.999949993e-03f, +2.764791145e-03f, +3.274434301e-03f, +3.179347173e-03f, +2.098834001e-03f, -2.921378694e-04f, -4.159603364e-03f, -9.413027418e-03f, -1.563981567e-02f, -2.209609735e-02f, -2.776910148e-02f, -3.151204336e-02f, -3.223536296e-02f, -2.912237291e-02f, -2.182700797e-02f, -1.060963299e-02f, +3.624862950e-03f, +1.940517716e-02f, +3.488339953e-02f, +4.810821949e-02f, +5.733410396e-02f, +6.130915563e-02f, +5.948640879e-02f, +5.211720974e-02f, +4.020823094e-02f, +2.535062474e-02f, +9.454907409e-03f, -5.557099897e-03f, -1.804529590e-02f, -2.687688019e-02f, -3.154819541e-02f, -3.218919941e-02f, -2.946086403e-02f, -2.437571743e-02f, -1.808364432e-02f, -1.166703592e-02f, -5.981957730e-03f, -1.567792637e-03f, +1.369269778e-03f, +2.909344855e-03f, +3.330193582e-03f, +3.003104006e-03f, +2.297726873e-03f, +1.513292648e-03f, +8.440538267e-04f, +3.773469678e-04f, + -1.532806871e-05f, -2.162143767e-05f, -2.487095151e-05f, -2.166616976e-05f, -8.747552469e-06f, +1.594627439e-05f, +5.220782014e-05f, +9.676931944e-05f, +1.430891199e-04f, +1.819234847e-04f, +2.027239640e-04f, +1.956903147e-04f, +1.541071826e-04f, +7.645544584e-05f, -3.223797337e-05f, -1.602433145e-04f, -2.903703028e-04f, -4.025137075e-04f, -4.770958382e-04f, -4.987570545e-04f, -4.595353487e-04f, -3.608345123e-04f, -2.137032898e-04f, -3.729040543e-05f, +1.442735657e-04f, +3.059758495e-04f, +4.261958904e-04f, +4.903092966e-04f, +4.929234191e-04f, +4.383447518e-04f, +3.392567061e-04f, +2.139568862e-04f, +8.278196499e-05f, -3.552359748e-05f, -1.267825385e-04f, -1.831863109e-04f, -2.036978274e-04f, -1.931446308e-04f, -1.603551633e-04f, -1.158478390e-04f, -6.960821217e-05f, -2.939256978e-05f, +1.858320897e-07f, +1.774519696e-05f, +2.454568474e-05f, +2.349400520e-05f, +1.805320008e-05f, +1.132641078e-05f, + /* 1, 7 (48) */ + -4.299833282e-04f, -6.683643483e-04f, -9.144827144e-04f, -1.119334155e-03f, -1.215029582e-03f, -1.116384110e-03f, -7.248622545e-04f, +6.512622063e-05f, +1.357865606e-03f, +3.246476168e-03f, +5.802374380e-03f, +9.065047940e-03f, +1.303322708e-02f, +1.765850416e-02f, +2.284230321e-02f, +2.843683849e-02f, +3.425034762e-02f, +4.005647599e-02f, +4.560726646e-02f, +5.064881970e-02f, +5.493837952e-02f, +5.826140268e-02f, +6.044711838e-02f, +6.138118026e-02f, +6.101425507e-02f, +5.936575502e-02f, +5.652236728e-02f, +5.263151721e-02f, +4.789037086e-02f, +4.253138664e-02f, +3.680572465e-02f, +3.096598422e-02f, +2.524975236e-02f, +1.986531004e-02f, +1.498057911e-02f, +1.071603260e-02f, +7.141878015e-03f, +4.279402031e-03f, +2.105983236e-03f, +5.629730153e-04f, -4.345562356e-04f, -9.872789584e-04f, -1.201347182e-03f, -1.179289092e-03f, -1.012757683e-03f, -7.775403796e-04f, -5.309554459e-04f, -3.114958267e-04f, + +6.944696012e-06f, +7.771451312e-06f, +7.370361214e-06f, +5.149718660e-06f, +5.315730174e-07f, -6.977378204e-06f, -1.771084180e-05f, -3.177229965e-05f, -4.897765493e-05f, -6.881963368e-05f, -9.046084446e-05f, -1.127598233e-04f, -1.343310549e-04f, -1.536362162e-04f, -1.691001640e-04f, -1.792419368e-04f, -1.828086792e-04f, -1.788992659e-04f, -1.670646871e-04f, -1.473740055e-04f, -1.204377551e-04f, -8.738472583e-05f, -4.979272550e-05f, -9.578625365e-06f, +3.114276840e-05f, +7.021819019e-05f, +1.056189673e-04f, +1.355924986e-04f, +1.587882379e-04f, +1.743469537e-04f, +1.819458831e-04f, +1.817969543e-04f, +1.745999956e-04f, +1.614572536e-04f, +1.437591249e-04f, +1.230533962e-04f, +1.009112666e-04f, +7.880294129e-05f, +5.799376832e-05f, +3.946900620e-05f, +2.389175254e-05f, +1.159477218e-05f, +2.603385740e-06f, -3.316389466e-06f, -6.592321062e-06f, -7.771936700e-06f, -7.448764252e-06f, -6.196522682e-06f, + +6.283182377e-04f, +1.220327832e-03f, +1.975079041e-03f, +2.743124976e-03f, +3.265686748e-03f, +3.195293448e-03f, +2.151041821e-03f, -1.953685500e-04f, -4.016514244e-03f, -9.231103934e-03f, -1.543709171e-02f, -2.190040704e-02f, -2.761499429e-02f, -3.143558792e-02f, -3.226760093e-02f, -2.928261623e-02f, -2.211737827e-02f, -1.101214670e-02f, +3.147767112e-03f, +1.890642011e-02f, +3.442386419e-02f, +4.774738498e-02f, +5.712040067e-02f, +6.127186522e-02f, +5.963068236e-02f, +5.242318559e-02f, +4.063442683e-02f, +2.584093403e-02f, +9.947830828e-03f, -5.118755146e-03f, -1.770603919e-02f, -2.666292331e-02f, -3.146541345e-02f, -3.222472301e-02f, -2.958764656e-02f, -2.455890374e-02f, -1.828734215e-02f, -1.186018055e-02f, -6.142312893e-03f, -1.683640476e-03f, +1.299661566e-03f, +2.879952286e-03f, +3.330379414e-03f, +3.020849203e-03f, +2.322272557e-03f, +1.536786653e-03f, +8.621070268e-04f, +3.886733786e-04f, + -1.511514789e-05f, -2.145415145e-05f, -2.484874698e-05f, -2.189829870e-05f, -9.323540560e-06f, +1.499116485e-05f, +5.092347434e-05f, +9.530816669e-05f, +1.417016390e-04f, +1.809275301e-04f, +2.024497358e-04f, +1.964095286e-04f, +1.559606090e-04f, +7.939579618e-05f, -2.847194725e-05f, -1.561108897e-04f, -2.864689115e-04f, -3.994829673e-04f, -4.755023974e-04f, -4.989830154e-04f, -4.616940118e-04f, -3.647327390e-04f, -2.188606756e-04f, -4.301364407e-05f, +1.387745892e-04f, +3.014528043e-04f, +4.232343676e-04f, +4.892339038e-04f, +4.937535320e-04f, +4.408078890e-04f, +3.428543174e-04f, +2.180667583e-04f, +8.677479417e-05f, -3.217731919e-05f, -1.244353095e-04f, -1.819781453e-04f, -2.035647178e-04f, -1.938637399e-04f, -1.616126915e-04f, -1.173125582e-04f, -7.099483771e-05f, -3.050371628e-05f, -5.560964085e-07f, +1.737124731e-05f, +2.446967027e-05f, +2.361120550e-05f, +1.825684027e-05f, +1.153167060e-05f, + /* 1, 8 (48) */ + -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f, + +6.905229076e-06f, +7.761189099e-06f, +7.407324442e-06f, +5.252536049e-06f, +7.174115923e-07f, -6.695130348e-06f, -1.732489835e-05f, -3.128352883e-05f, -4.839658372e-05f, -6.816715673e-05f, -8.976795629e-05f, -1.120662859e-04f, -1.336830254e-04f, -1.530829779e-04f, -1.686902173e-04f, -1.790187932e-04f, -1.828067631e-04f, -1.791403384e-04f, -1.675551786e-04f, -1.481035659e-04f, -1.213792189e-04f, -8.849554918e-05f, -5.101780578e-05f, -1.085426828e-05f, +2.988408757e-05f, +6.904270931e-05f, +1.045866398e-04f, +1.347525789e-04f, +1.581758507e-04f, +1.739809448e-04f, +1.818281164e-04f, +1.819130706e-04f, +1.749215037e-04f, +1.619446962e-04f, +1.443659673e-04f, +1.237302304e-04f, +1.016099164e-04f, +7.948008996e-05f, +5.861380406e-05f, +4.000588521e-05f, +2.432979486e-05f, +1.192842370e-05f, +2.836084140e-06f, -3.174026850e-06f, -6.524720458e-06f, -7.760920964e-06f, -7.475773419e-06f, -6.244486575e-06f, + +6.132030899e-04f, +1.198873681e-03f, +1.950230294e-03f, +2.721226677e-03f, +3.256363208e-03f, +3.210284612e-03f, +2.201965296e-03f, -1.000603833e-04f, -3.874812605e-03f, -9.050176404e-03f, -1.523464198e-02f, -2.170399751e-02f, -2.745903369e-02f, -3.135619212e-02f, -3.229607288e-02f, -2.943872712e-02f, -2.240384718e-02f, -1.141162967e-02f, +2.672264714e-03f, +1.840743709e-02f, +3.396217017e-02f, +4.738265224e-02f, +5.690154000e-02f, +6.122885158e-02f, +5.976945695e-02f, +5.272463839e-02f, +4.105766120e-02f, +2.633016794e-02f, +1.044158436e-02f, -4.677947257e-03f, -1.736318488e-02f, -2.644485655e-02f, -3.137863865e-02f, -3.225690033e-02f, -2.971208187e-02f, -2.474088189e-02f, -1.849090686e-02f, -1.205404429e-02f, -6.303925585e-03f, -1.800953034e-03f, +1.228666729e-03f, +2.849448569e-03f, +3.329823318e-03f, +3.038220450e-03f, +2.346742228e-03f, +1.560397859e-03f, +8.803638670e-04f, +4.002050492e-04f, + -1.490211996e-05f, -2.128404769e-05f, -2.482033930e-05f, -2.212093478e-05f, -9.887878991e-06f, +1.404765433e-05f, +4.964765813e-05f, +9.384920717e-05f, +1.403072766e-04f, +1.799142352e-04f, +2.021483440e-04f, +1.970947142e-04f, +1.577782226e-04f, +8.230501533e-05f, -2.472569254e-05f, -1.519813755e-04f, -2.825505523e-04f, -3.964157603e-04f, -4.738570412e-04f, -4.991488536e-04f, -4.637935950e-04f, -3.685825189e-04f, -2.239883633e-04f, -4.873099576e-05f, +1.332566780e-04f, +2.968892447e-04f, +4.202176034e-04f, +4.880976622e-04f, +4.945268237e-04f, +4.432265991e-04f, +3.464255475e-04f, +2.221704064e-04f, +9.078005214e-05f, -2.880444182e-05f, -1.220536131e-04f, -1.807343748e-04f, -2.034007180e-04f, -1.945606850e-04f, -1.628584972e-04f, -1.187754937e-04f, -7.238741685e-05f, -3.162543024e-05f, -1.309984952e-06f, +1.698658485e-05f, +2.438583951e-05f, +2.372404648e-05f, +1.845922109e-05f, +1.173783863e-05f, + /* 1, 9 (48) */ + -4.161334031e-04f, -6.528317079e-04f, -8.997050287e-04f, -1.108931901e-03f, -1.213780598e-03f, -1.130056618e-03f, -7.598979946e-04f, +2.070392152e-06f, +1.260491367e-03f, +3.109489377e-03f, +5.622145579e-03f, +8.840221830e-03f, +1.276521300e-02f, +1.735178496e-02f, +2.250451283e-02f, +2.807857776e-02f, +3.388473218e-02f, +3.969843638e-02f, +4.527264659e-02f, +5.035334212e-02f, +5.469656255e-02f, +5.808552240e-02f, +6.034630785e-02f, +6.136074737e-02f, +6.107528192e-02f, +5.950501592e-02f, +5.673257289e-02f, +5.290186229e-02f, +4.820733494e-02f, +4.287971454e-02f, +3.716949865e-02f, +3.132969425e-02f, +2.559927386e-02f, +2.018871199e-02f, +1.526870420e-02f, +1.096281623e-02f, +7.344399198e-03f, +4.437685062e-03f, +2.222590809e-03f, +6.424479067e-04f, -3.863346882e-04f, -9.637557625e-04f, -1.195907712e-03f, -1.185779509e-03f, -1.025874724e-03f, -7.930732373e-04f, -5.458799835e-04f, -3.239368359e-04f, + +6.865118852e-06f, +7.749749481e-06f, +7.442528130e-06f, +5.353022246e-06f, +9.004273601e-07f, -6.416043006e-06f, -1.694222924e-05f, -3.079786504e-05f, -4.781813497e-05f, -6.751649231e-05f, -8.907576968e-05f, -1.113720959e-04f, -1.330328344e-04f, -1.525260286e-04f, -1.682750973e-04f, -1.787892338e-04f, -1.827975304e-04f, -1.793736353e-04f, -1.680379435e-04f, -1.488259813e-04f, -1.223146305e-04f, -8.960185788e-05f, -5.224024653e-05f, -1.212934627e-05f, +2.862385418e-05f, +6.786367609e-05f, +1.035490276e-04f, +1.339060344e-04f, +1.575559798e-04f, +1.736071204e-04f, +1.817027291e-04f, +1.820222430e-04f, +1.752371429e-04f, +1.624276316e-04f, +1.449698222e-04f, +1.244056229e-04f, +1.023085737e-04f, +8.015849554e-05f, +5.923607174e-05f, +4.054565455e-05f, +2.477106051e-05f, +1.226532812e-05f, +3.071808559e-06f, -3.029057220e-06f, -6.455051086e-06f, -7.748421147e-06f, -7.501864540e-06f, -6.292028226e-06f, + +5.983009699e-04f, +1.177589633e-03f, +1.925409955e-03f, +2.699105742e-03f, +3.246475329e-03f, +3.224332267e-03f, +2.251612954e-03f, -6.211176122e-06f, -3.734505328e-03f, -8.870262169e-03f, -1.503249363e-02f, -2.150690279e-02f, -2.730125546e-02f, -3.127388711e-02f, -3.232079857e-02f, -2.959070849e-02f, -2.268639774e-02f, -1.180804543e-02f, +2.198407673e-03f, +1.790828824e-02f, +3.349837658e-02f, +4.701406972e-02f, +5.667755164e-02f, +6.118012058e-02f, +5.990271363e-02f, +5.302152764e-02f, +4.147787880e-02f, +2.681826560e-02f, +1.093611118e-02f, -4.234720657e-03f, -1.701675933e-02f, -2.622268614e-02f, -3.128785860e-02f, -3.228570477e-02f, -2.983413549e-02f, -2.492161626e-02f, -1.869430758e-02f, -1.224860498e-02f, -6.466784082e-03f, -1.919728528e-03f, +1.156279312e-03f, +2.817823139e-03f, +3.328513333e-03f, +3.055207035e-03f, +2.371128067e-03f, +1.584121905e-03f, +8.988230881e-04f, +4.119428878e-04f, + -1.468905343e-05f, -2.111122436e-05f, -2.478583769e-05f, -2.233416943e-05f, -1.044060700e-05f, +1.311578707e-05f, +4.838051740e-05f, +9.239268525e-05f, +1.389063463e-04f, +1.788839288e-04f, +2.018200630e-04f, +1.977460188e-04f, +1.595599860e-04f, +8.518285353e-05f, -2.099965721e-05f, -1.478553601e-04f, -2.786158599e-04f, -3.933126532e-04f, -4.721601571e-04f, -4.992546924e-04f, -4.658339177e-04f, -3.723833847e-04f, -2.290856711e-04f, -5.444167862e-05f, +1.277205798e-04f, +2.922857573e-04f, +4.171459276e-04f, +4.869005993e-04f, +4.952430311e-04f, +4.456003923e-04f, +3.499697813e-04f, +2.262672056e-04f, +9.479721092e-05f, -2.540531878e-05f, -1.196375918e-04f, -1.794549389e-04f, -2.032056088e-04f, -1.952351551e-04f, -1.640922509e-04f, -1.202363612e-04f, -7.378575245e-05f, -3.275761770e-05f, -2.075834377e-06f, +1.659113991e-05f, +2.429408800e-05f, +2.383242151e-05f, +1.866025781e-05f, +1.194486404e-05f, + /* 1,10 (48) */ + -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f, + +6.824380746e-06f, +7.737150143e-06f, +7.475990650e-06f, +5.451194286e-06f, +1.080633738e-06f, -6.140108674e-06f, -1.656283491e-05f, -3.031531818e-05f, -4.724232877e-05f, -6.686767051e-05f, -8.838432342e-05f, -1.106772984e-04f, -1.323805306e-04f, -1.519654159e-04f, -1.678548470e-04f, -1.785532927e-04f, -1.827810030e-04f, -1.795991635e-04f, -1.685129721e-04f, -1.495412255e-04f, -1.232439486e-04f, -9.070359815e-05f, -5.345998535e-05f, -1.340379299e-05f, +2.736213345e-05f, +6.668114971e-05f, +1.025061794e-04f, +1.330529000e-04f, +1.569286442e-04f, +1.732254828e-04f, +1.815697075e-04f, +1.821244437e-04f, +1.755468747e-04f, +1.629060141e-04f, +1.455706410e-04f, +1.250795263e-04f, +1.030071957e-04f, +8.083812284e-05f, +5.986054554e-05f, +4.108829861e-05f, +2.521554387e-05f, +1.260548869e-05f, +3.310569361e-06f, -2.881465290e-06f, -6.383295056e-06f, -7.734418951e-06f, -7.527020764e-06f, -6.339133594e-06f, + +5.836119165e-04f, +1.156478409e-03f, +1.900624117e-03f, +2.676771573e-03f, +3.236034722e-03f, +3.237448054e-03f, +2.299993471e-03f, +8.618150913e-05f, -3.595598982e-03f, -8.691378240e-03f, -1.483067357e-02f, -2.130915678e-02f, -2.714169548e-02f, -3.118870425e-02f, -3.234179823e-02f, -2.973856385e-02f, -2.296501360e-02f, -1.220135808e-02f, +1.726247516e-03f, +1.740903355e-02f, +3.303254266e-02f, +4.664168634e-02f, +5.644846596e-02f, +6.112567891e-02f, +6.003043421e-02f, +5.331381339e-02f, +4.189502473e-02f, +2.730516620e-02f, +1.143135421e-02f, -3.789120265e-03f, -1.666678955e-02f, -2.599641894e-02f, -3.119306139e-02f, -3.231111009e-02f, -2.995377308e-02f, -2.510107120e-02f, -1.889751319e-02f, -1.244384013e-02f, -6.630876333e-03f, -2.039964889e-03f, +1.082493559e-03f, +2.785065521e-03f, +3.326437498e-03f, +3.071798175e-03f, +2.395422155e-03f, +1.607954327e-03f, +9.174833459e-04f, +4.238877519e-04f, + -1.447601573e-05f, -2.093577875e-05f, -2.474535144e-05f, -2.253809516e-05f, -1.098176596e-05f, +1.219560428e-05f, +4.712219483e-05f, +9.093884253e-05f, +1.374991601e-04f, +1.778369407e-04f, +2.014651700e-04f, +1.983635946e-04f, +1.613058679e-04f, +8.802906768e-05f, -1.729428370e-05f, -1.437334289e-04f, -2.746654690e-04f, -3.901742165e-04f, -4.704121395e-04f, -4.993006637e-04f, -4.678148086e-04f, -3.761348771e-04f, -2.341519224e-04f, -6.014491190e-05f, +1.221670459e-04f, +2.876429354e-04f, +4.140196788e-04f, +4.856427518e-04f, +4.959018989e-04f, +4.479287843e-04f, +3.534864055e-04f, +2.303565294e-04f, +9.882573812e-05f, -2.198030972e-05f, -1.171873950e-04f, -1.781397830e-04f, -2.029791747e-04f, -1.958868412e-04f, -1.653136230e-04f, -1.216948744e-04f, -7.518964427e-05f, -3.390018149e-05f, -2.853642879e-06f, +1.618484449e-05f, +2.419431183e-05f, +2.393622360e-05f, +1.885986474e-05f, +1.215269488e-05f, + /* 1,11 (48) */ + -4.024439035e-04f, -6.373448083e-04f, -8.847865099e-04f, -1.098127684e-03f, -1.211799537e-03f, -1.142612770e-03f, -7.934030588e-04f, -5.904279106e-05f, +1.165430903e-03f, +2.975105214e-03f, +5.444685486e-03f, +8.618172436e-03f, +1.249979964e-02f, +1.704729352e-02f, +2.216838289e-02f, +2.772123523e-02f, +3.351915364e-02f, +3.933946359e-02f, +4.493609568e-02f, +5.005497492e-02f, +5.445100397e-02f, +5.790521695e-02f, +6.024060761e-02f, +6.133521423e-02f, +6.113126791e-02f, +5.963956075e-02f, +5.693862809e-02f, +5.316882122e-02f, +4.852181957e-02f, +4.322654714e-02f, +3.753277109e-02f, +3.169384093e-02f, +2.595005788e-02f, +2.051404564e-02f, +1.555924466e-02f, +1.121230138e-02f, +7.549714967e-03f, +4.598681680e-03f, +2.341687426e-03f, +7.240818599e-04f, -3.363480838e-04f, -9.388849457e-04f, -1.189525335e-03f, -1.191690031e-03f, -1.038713070e-03f, -8.085560774e-04f, -5.609088688e-04f, -3.365679977e-04f, + +6.783030070e-06f, +7.723408718e-06f, +7.507730380e-06f, +5.547069277e-06f, +1.258044290e-06f, -5.867319628e-06f, -1.618671553e-05f, -2.983589784e-05f, -4.666918493e-05f, -6.622072111e-05f, -8.769365605e-05f, -1.099819384e-04f, -1.317261621e-04f, -1.514011878e-04f, -1.674295098e-04f, -1.783110046e-04f, -1.827572033e-04f, -1.798169304e-04f, -1.689802556e-04f, -1.502492729e-04f, -1.241671324e-04f, -9.180071650e-05f, -5.467696004e-05f, -1.467754219e-05f, +2.609899070e-05f, +6.549518960e-05f, +1.014581444e-04f, +1.321932110e-04f, +1.562938633e-04f, +1.728360349e-04f, +1.814290384e-04f, +1.822196454e-04f, +1.758506607e-04f, +1.633797983e-04f, +1.461683752e-04f, +1.257518931e-04f, +1.037057395e-04f, +8.151893637e-05f, +6.048719935e-05f, +4.163380147e-05f, +2.566323901e-05f, +1.294890841e-05f, +3.552376721e-06f, -2.731235893e-06f, -6.309434527e-06f, -7.718896060e-06f, -7.551225169e-06f, -6.385788534e-06f, + +5.691359007e-04f, +1.135542630e-03f, +1.875878766e-03f, +2.654233478e-03f, +3.225052956e-03f, +3.249643658e-03f, +2.347115666e-03f, +1.771203517e-04f, -3.458099822e-03f, -8.513541299e-03f, -1.462920840e-02f, -2.111079318e-02f, -2.698038961e-02f, -3.110067518e-02f, -3.235909251e-02f, -2.988229728e-02f, -2.323967906e-02f, -1.259153230e-02f, +1.255835377e-03f, +1.690973288e-02f, +3.256472785e-02f, +4.626555146e-02f, +5.621431404e-02f, +6.106553399e-02f, +6.015260125e-02f, +5.360145633e-02f, +4.230904441e-02f, +2.779080895e-02f, +1.192725611e-02f, -3.341191481e-03f, -1.631330314e-02f, -2.576606241e-02f, -3.109423565e-02f, -3.233309040e-02f, -3.007096047e-02f, -2.527921098e-02f, -1.910049237e-02f, -1.263972698e-02f, -6.796189956e-03f, -2.161659764e-03f, +1.007303915e-03f, +2.751165340e-03f, +3.323583856e-03f, +3.087983019e-03f, +2.419616467e-03f, +1.631890550e-03f, +9.363432107e-04f, +4.360404467e-04f, + -1.426307319e-05f, -2.075780740e-05f, -2.469898981e-05f, -2.273280550e-05f, -1.151139937e-05f, +1.128714424e-05f, +4.587282982e-05f, +8.948791782e-05f, +1.360860288e-04f, +1.767736006e-04f, +2.010839449e-04f, +1.989475989e-04f, +1.630158436e-04f, +9.084342132e-05f, -1.361000888e-05f, -1.396161639e-04f, -2.707000147e-04f, -3.870010247e-04f, -4.686133899e-04f, -4.992869089e-04f, -4.697361063e-04f, -3.798365454e-04f, -2.391864458e-04f, -6.583991611e-05f, +1.165968301e-04f, +2.829613790e-04f, +4.108392049e-04f, +4.843241664e-04f, +4.965031808e-04f, +4.502112968e-04f, +3.569748093e-04f, +2.344377501e-04f, +1.028650970e-04f, -1.852978049e-05f, -1.147031788e-04f, -1.767888582e-04f, -2.027212045e-04f, -1.965154358e-04f, -1.665222834e-04f, -1.231507447e-04f, -7.659888899e-05f, -3.505302122e-05f, -3.643405993e-06f, +1.576763225e-05f, +2.408640770e-05f, +2.403534541e-05f, +1.905795531e-05f, +1.236127806e-05f, + /* 1,12 (48) */ + -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f, + +6.741082046e-06f, +7.708542790e-06f, +7.537765705e-06f, +5.640664402e-06f, +1.432672729e-06f, -5.597667930e-06f, -1.581387101e-05f, -2.935961333e-05f, -4.609872289e-05f, -6.557567358e-05f, -8.700380586e-05f, -1.092860609e-04f, -1.310697774e-04f, -1.508333922e-04f, -1.669991291e-04f, -1.780624044e-04f, -1.827261540e-04f, -1.800269439e-04f, -1.694397852e-04f, -1.509500984e-04f, -1.250841413e-04f, -9.289315982e-05f, -5.589110862e-05f, -1.595052764e-05f, +2.483449136e-05f, +6.430585546e-05f, +1.004049721e-04f, +1.313270034e-04f, +1.556516572e-04f, +1.724387800e-04f, +1.812807091e-04f, +1.823078213e-04f, +1.761484629e-04f, +1.638489388e-04f, +1.467629763e-04f, +1.264226756e-04f, +1.044041619e-04f, +8.220090042e-05f, +6.111600674e-05f, +4.218214685e-05f, +2.611413971e-05f, +1.329559004e-05f, +3.797240619e-06f, -2.578353981e-06f, -6.233451705e-06f, -7.701834142e-06f, -7.574460766e-06f, -6.431978801e-06f, + +5.548728275e-04f, +1.114784822e-03f, +1.851179776e-03f, +2.631500672e-03f, +3.213541556e-03f, +3.260930802e-03f, +2.392988496e-03f, +2.666082695e-04f, -3.322013793e-03f, -8.336767698e-03f, -1.442812445e-02f, -2.091184558e-02f, -2.681737377e-02f, -3.100983176e-02f, -3.237270252e-02f, -3.002191345e-02f, -2.351037908e-02f, -1.297853332e-02f, +7.872219866e-04f, +1.641044598e-02f, +3.209499175e-02f, +4.588571491e-02f, +5.597512760e-02f, +6.099969408e-02f, +6.026919808e-02f, +5.388441771e-02f, +4.271988361e-02f, +2.827513312e-02f, +1.242375929e-02f, -2.890980184e-03f, -1.595632833e-02f, -2.553162466e-02f, -3.099137055e-02f, -3.235162018e-02f, -3.018566365e-02f, -2.545599984e-02f, -1.930321357e-02f, -1.283624241e-02f, -6.962712239e-03f, -2.284810508e-03f, +9.307050260e-04f, +2.716112319e-03f, +3.319940450e-03f, +3.103750651e-03f, +2.443702875e-03f, +1.655925896e-03f, +9.554011660e-04f, +4.484017248e-04f, + -1.405029109e-05f, -2.057740610e-05f, -2.464686208e-05f, -2.291839499e-05f, -1.202955281e-05f, +1.039044230e-05f, +4.463255849e-05f, +8.804014709e-05f, +1.346672613e-04f, +1.756942389e-04f, +2.006766703e-04f, +1.994981936e-04f, +1.646898946e-04f, +9.362568470e-05f, -9.947263949e-06f, -1.355041440e-04f, -2.667201318e-04f, -3.837936558e-04f, -4.667643167e-04f, -4.992135781e-04f, -4.715976586e-04f, -3.834879467e-04f, -2.441885755e-04f, -7.152591317e-05f, +1.110106893e-04f, +2.782416943e-04f, +4.076048624e-04f, +4.829448989e-04f, +4.970466386e-04f, +4.524474573e-04f, +3.604343844e-04f, +2.385102389e-04f, +1.069147467e-04f, -1.505410309e-05f, -1.121851058e-04f, -1.754021216e-04f, -2.024314911e-04f, -1.971206335e-04f, -1.677179014e-04f, -1.246036813e-04f, -7.801328021e-05f, -3.621603328e-05f, -4.445116563e-06f, +1.533943858e-05f, +2.397027294e-05f, +2.412967932e-05f, +1.925444200e-05f, +1.257055940e-05f, + /* 1,13 (48) */ + -3.889197914e-04f, -6.219128568e-04f, -8.697410138e-04f, -1.086939950e-03f, -1.209108819e-03f, -1.154077757e-03f, -8.254036453e-04f, -1.182383022e-04f, +1.072662996e-03f, +2.843308820e-03f, +5.269988024e-03f, +8.398904437e-03f, +1.223700370e-02f, +1.674505894e-02f, +2.183395425e-02f, +2.736486182e-02f, +3.315367029e-02f, +3.897961971e-02f, +4.459767564e-02f, +4.975377555e-02f, +5.420175269e-02f, +5.772052307e-02f, +6.013003955e-02f, +6.130458616e-02f, +6.118220139e-02f, +5.976936179e-02f, +5.714049121e-02f, +5.343234143e-02f, +4.883376509e-02f, +4.357182196e-02f, +3.789548084e-02f, +3.205836840e-02f, +2.630205700e-02f, +2.084127438e-02f, +1.585217601e-02f, +1.146447595e-02f, +7.757824868e-03f, +4.762401517e-03f, +2.463290632e-03f, +8.078978082e-04f, -2.845707051e-04f, -9.126404473e-04f, -1.182175717e-03f, -1.196999621e-03f, -1.051255956e-03f, -8.239768076e-04f, -5.760345548e-04f, -3.493857651e-04f, + +6.698551799e-06f, +7.692569891e-06f, +7.566115013e-06f, +5.731996914e-06f, +1.604532908e-06f, -5.331145428e-06f, -1.544430097e-05f, -2.888647360e-05f, -4.553096181e-05f, -6.493255712e-05f, -8.631481091e-05f, -1.085897106e-04f, -1.304114247e-04f, -1.502620772e-04f, -1.665637486e-04f, -1.778075273e-04f, -1.826878783e-04f, -1.802292123e-04f, -1.698915531e-04f, -1.516436772e-04f, -1.259949353e-04f, -9.398087530e-05f, -5.710236930e-05f, -1.722268318e-05f, +2.356870096e-05f, +6.311320721e-05f, +9.934671235e-05f, +1.304543135e-04f, +1.550020465e-04f, +1.720337218e-04f, +1.811247071e-04f, +1.823889449e-04f, +1.764402438e-04f, +1.643133904e-04f, +1.473543959e-04f, +1.270918263e-04f, +1.051024197e-04f, +8.288397896e-05f, +6.174694096e-05f, +4.273331820e-05f, +2.656823942e-05f, +1.364553606e-05f, +4.045170841e-06f, -2.422804631e-06f, -6.155328848e-06f, -7.683214852e-06f, -7.596710501e-06f, -6.477690047e-06f, + +5.408225365e-04f, +1.094207416e-03f, +1.826532914e-03f, +2.608582277e-03f, +3.201512003e-03f, +3.271321245e-03f, +2.437621054e-03f, +3.546484166e-04f, -3.187346532e-03f, -8.161073460e-03f, -1.422744778e-02f, -2.071234739e-02f, -2.665268387e-02f, -3.091620608e-02f, -3.238264978e-02f, -3.015741759e-02f, -2.377709921e-02f, -1.336232698e-02f, +3.204576699e-04f, +1.591123240e-02f, +3.162339409e-02f, +4.550222697e-02f, +5.573093902e-02f, +6.092816816e-02f, +6.038020877e-02f, +5.416265940e-02f, +4.312748847e-02f, +2.875807801e-02f, +1.292080593e-02f, -2.438532727e-03f, -1.559589395e-02f, -2.529311442e-02f, -3.088445581e-02f, -3.236667428e-02f, -3.029784876e-02f, -2.563140196e-02f, -1.950564506e-02f, -1.303336304e-02f, -7.130430141e-03f, -2.409414189e-03f, +8.526917458e-04f, +2.679896285e-03f, +3.315495333e-03f, +3.119090090e-03f, +2.467673148e-03f, +1.680055575e-03f, +9.746556080e-04f, +4.609722842e-04f, + -1.383773357e-05f, -2.039466990e-05f, -2.458907746e-05f, -2.309495914e-05f, -1.253627391e-05f, +9.505530872e-06f, +4.340151373e-05f, +8.659576347e-05f, +1.332431650e-04f, +1.745991863e-04f, +2.002436315e-04f, +2.000155457e-04f, +1.663280088e-04f, +9.637563473e-05f, -6.306474398e-06f, -1.313979444e-04f, -2.627264553e-04f, -3.805526914e-04f, -4.648653351e-04f, -4.990808307e-04f, -4.733993232e-04f, -3.870886467e-04f, -2.491576510e-04f, -7.720212654e-05f, +1.054093829e-04f, +2.734844944e-04f, +4.043170167e-04f, +4.815050153e-04f, +4.975320429e-04f, +4.546367993e-04f, +3.638645247e-04f, +2.425733656e-04f, +1.109741421e-04f, -1.155365566e-05f, -1.096333455e-04f, -1.739795362e-04f, -2.021098317e-04f, -1.977021306e-04f, -1.689001464e-04f, -1.260533915e-04f, -7.943260847e-05f, -3.738911081e-05f, -5.258764720e-06f, +1.490020064e-05f, +2.384580553e-05f, +2.421911742e-05f, +1.944923643e-05f, +1.278048359e-05f, + /* 1,14 (48) */ + -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f, + +6.655454364e-06f, +7.675507496e-06f, +7.592796692e-06f, +5.821084136e-06f, +1.773638826e-06f, -5.067743758e-06f, -1.507800476e-05f, -2.841648733e-05f, -4.496592050e-05f, -6.429140060e-05f, -8.562670900e-05f, -1.078929320e-04f, -1.297511522e-04f, -1.496872908e-04f, -1.661234121e-04f, -1.775464088e-04f, -1.826423998e-04f, -1.804237446e-04f, -1.703355517e-04f, -1.523299854e-04f, -1.268994749e-04f, -9.506381053e-05f, -5.831068052e-05f, -1.849394269e-05f, +2.230168514e-05f, +6.191730505e-05f, +9.828341550e-05f, +1.295751782e-04f, +1.543450521e-04f, +1.716208647e-04f, +1.809610208e-04f, +1.824629900e-04f, +1.767259657e-04f, +1.647731083e-04f, +1.479425855e-04f, +1.277592971e-04f, +1.058004694e-04f, +8.356813575e-05f, +6.237997497e-05f, +4.328729862e-05f, +2.702553133e-05f, +1.399874871e-05f, +4.296176977e-06f, -2.264573046e-06f, -6.075048267e-06f, -7.663019833e-06f, -7.617957255e-06f, -6.522907823e-06f, + +5.269848029e-04f, +1.073812746e-03f, +1.801943836e-03f, +2.585487318e-03f, +3.188975729e-03f, +3.280826776e-03f, +2.481022568e-03f, +4.412441800e-04f, -3.054103367e-03f, -7.986474273e-03f, -1.402720415e-02f, -2.051233184e-02f, -2.648635586e-02f, -3.081983044e-02f, -3.238895626e-02f, -3.028881553e-02f, -2.403982567e-02f, -1.374287967e-02f, -1.444076651e-04f, +1.541215157e-02f, +3.114999476e-02f, +4.511513832e-02f, +5.548178137e-02f, +6.085096604e-02f, +6.048561815e-02f, +5.443614390e-02f, +4.353180549e-02f, +2.923958303e-02f, +1.341833798e-02f, -1.983895928e-03f, -1.523202942e-02f, -2.505054105e-02f, -3.077348167e-02f, -3.237822794e-02f, -3.040748210e-02f, -2.580538150e-02f, -1.970775489e-02f, -1.323106518e-02f, -7.299330287e-03f, -2.535467581e-03f, +7.732591374e-04f, +2.642507175e-03f, +3.310236568e-03f, +3.133990291e-03f, +2.491518953e-03f, +1.704274692e-03f, +9.941048444e-04f, +4.737527678e-04f, + -1.362546371e-05f, -2.020969306e-05f, -2.452574511e-05f, -2.326259437e-05f, -1.303161231e-05f, +8.632439490e-06f, +4.217982515e-05f, +8.515499721e-05f, +1.318140456e-04f, +1.734887737e-04f, +1.997851162e-04f, +2.004998266e-04f, +1.679301801e-04f, +9.909305502e-05f, -2.688059979e-06f, -1.272981371e-04f, -2.587196197e-04f, -3.772787163e-04f, -4.629168670e-04f, -4.988888348e-04f, -4.751409672e-04f, -3.906382195e-04f, -2.540930173e-04f, -8.286778134e-05f, +9.979367328e-05f, +2.686903983e-04f, +4.009760422e-04f, +4.800045906e-04f, +4.979591725e-04f, +4.567788623e-04f, +3.672646271e-04f, +2.466264993e-04f, +1.150427340e-04f, -8.028822401e-06f, -1.070480740e-04f, -1.725210712e-04f, -2.017560275e-04f, -1.982596258e-04f, -1.700686873e-04f, -1.274995807e-04f, -8.085666129e-05f, -3.857214372e-05f, -6.084337856e-06f, +1.444985736e-05f, +2.371290417e-05f, +2.430355154e-05f, +1.964224932e-05f, +1.299099421e-05f, + /* 1,15 (48) */ + -3.755657852e-04f, -6.065447794e-04f, -8.545821021e-04f, -1.075386869e-03f, -1.205730648e-03f, -1.164476647e-03f, -8.559259511e-04f, -1.755412632e-04f, +9.821661133e-04f, +2.714084862e-03f, +5.098046504e-03f, +8.182421794e-03f, +1.197684112e-02f, +1.644510957e-02f, +2.150126709e-02f, +2.700950789e-02f, +3.278834001e-02f, +3.861896676e-02f, +4.425744853e-02f, +4.944980188e-02f, +5.394885828e-02f, +5.753147838e-02f, +6.001462650e-02f, +6.126886953e-02f, +6.122807178e-02f, +5.989439231e-02f, +5.733812134e-02f, +5.369237093e-02f, +4.914311219e-02f, +4.391547655e-02f, +3.825756657e-02f, +3.242322034e-02f, +2.665522321e-02f, +2.117036087e-02f, +1.614747299e-02f, +1.171932707e-02f, +7.968727757e-03f, +4.928853632e-03f, +2.587417548e-03f, +8.939184250e-04f, -2.309769343e-04f, -8.849961625e-04f, -1.173834369e-03f, -1.201686999e-03f, -1.063486334e-03f, -8.393230423e-04f, -5.912492225e-04f, -3.623863630e-04f, + +6.611804677e-06f, +7.657373026e-06f, +7.617829132e-06f, +5.907943456e-06f, +1.940004617e-06f, -4.807454348e-06f, -1.471498148e-05f, -2.794966288e-05f, -4.440361746e-05f, -6.365223261e-05f, -8.493953768e-05f, -1.071957695e-04f, -1.290890081e-04f, -1.491090813e-04f, -1.656781636e-04f, -1.772790849e-04f, -1.825897425e-04f, -1.806105501e-04f, -1.707717740e-04f, -1.530089992e-04f, -1.277977209e-04f, -9.614191340e-05f, -5.951598093e-05f, -1.976424015e-05f, +2.103350960e-05f, +6.071820940e-05f, +9.721513218e-05f, +1.286896348e-04f, +1.536806957e-04f, +1.712002137e-04f, +1.807896387e-04f, +1.825299310e-04f, +1.770055917e-04f, +1.652280476e-04f, +1.485274967e-04f, +1.284250404e-04f, +1.064982673e-04f, +8.425333425e-05f, +6.301508140e-05f, +4.384407088e-05f, +2.748600830e-05f, +1.435522994e-05f, +4.550268416e-06f, -2.103644554e-06f, -5.992592328e-06f, -7.641230718e-06f, -7.638183844e-06f, -6.567617582e-06f, + +5.133593392e-04f, +1.053603053e-03f, +1.777418091e-03f, +2.562224724e-03f, +3.175944117e-03f, +3.289459215e-03f, +2.523202393e-03f, +5.263991772e-04f, -2.922289321e-03f, -7.812985500e-03f, -1.382741904e-02f, -2.031183202e-02f, -2.631842568e-02f, -3.072073739e-02f, -3.239164432e-02f, -3.041611367e-02f, -2.429854529e-02f, -1.412015839e-02f, -6.073245321e-04f, +1.491326273e-02f, +3.067485380e-02f, +4.472450010e-02f, +5.522768835e-02f, +6.076809826e-02f, +6.058541183e-02f, +5.470483430e-02f, +4.393278153e-02f, +2.971958762e-02f, +1.391629715e-02f, -1.527117065e-03f, -1.486476480e-02f, -2.480391455e-02f, -3.065843893e-02f, -3.238625676e-02f, -3.051453018e-02f, -2.597790257e-02f, -1.990951092e-02f, -1.342932480e-02f, -7.469398974e-03f, -2.662967162e-03f, +6.924024761e-04f, +2.603935031e-03f, +3.304152230e-03f, +3.148440148e-03f, +2.515231857e-03f, +1.728578244e-03f, +1.013747094e-03f, +4.867437620e-04f, + -1.341354347e-05f, -2.002256905e-05f, -2.445697407e-05f, -2.342139801e-05f, -1.351561964e-05f, +7.771194801e-06f, +4.096761910e-05f, +8.371807564e-05f, +1.303802073e-04f, +1.723633322e-04f, +1.993014146e-04f, +2.009512126e-04f, +1.694964089e-04f, +1.017777359e-04f, +9.075653692e-07f, -1.232052905e-04f, -2.547002593e-04f, -3.739723191e-04f, -4.609193410e-04f, -4.986377677e-04f, -4.768224673e-04f, -3.941362476e-04f, -2.589940252e-04f, -8.852210449e-05f, +9.416432483e-05f, +2.638600314e-04f, +3.975823219e-04f, +4.784437097e-04f, +4.983278153e-04f, +4.588731922e-04f, +3.706340911e-04f, +2.506690081e-04f, +1.191199691e-04f, -4.479993558e-06f, -1.044294743e-04f, -1.710267017e-04f, -2.013698844e-04f, -1.987928195e-04f, -1.712231930e-04f, -1.289419522e-04f, -8.228522318e-05f, -3.976501868e-05f, -6.921820601e-06f, +1.398834949e-05f, +2.357146827e-05f, +2.438287329e-05f, +1.983339052e-05f, +1.320203372e-05f, + /* 1,16 (48) */ + -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f, + +6.567617582e-06f, +7.638183844e-06f, +7.641230718e-06f, +5.992592328e-06f, +2.103644554e-06f, -4.550268416e-06f, -1.435522994e-05f, -2.748600830e-05f, -4.384407088e-05f, -6.301508140e-05f, -8.425333425e-05f, -1.064982673e-04f, -1.284250404e-04f, -1.485274967e-04f, -1.652280476e-04f, -1.770055917e-04f, -1.825299310e-04f, -1.807896387e-04f, -1.712002137e-04f, -1.536806957e-04f, -1.286896348e-04f, -9.721513218e-05f, -6.071820940e-05f, -2.103350960e-05f, +1.976424015e-05f, +5.951598093e-05f, +9.614191340e-05f, +1.277977209e-04f, +1.530089992e-04f, +1.707717740e-04f, +1.806105501e-04f, +1.825897425e-04f, +1.772790849e-04f, +1.656781636e-04f, +1.491090813e-04f, +1.290890081e-04f, +1.071957695e-04f, +8.493953768e-05f, +6.365223261e-05f, +4.440361746e-05f, +2.794966288e-05f, +1.471498148e-05f, +4.807454348e-06f, -1.940004617e-06f, -5.907943456e-06f, -7.617829132e-06f, -7.657373026e-06f, -6.611804677e-06f, + +4.999457957e-04f, +1.033580484e-03f, +1.752961117e-03f, +2.538803326e-03f, +3.162428497e-03f, +3.297230410e-03f, +2.564170012e-03f, +6.101172529e-04f, -2.791909114e-03f, -7.640622167e-03f, -1.362811762e-02f, -2.011088080e-02f, -2.614892927e-02f, -3.061895965e-02f, -3.239073675e-02f, -3.053931896e-02f, -2.455324555e-02f, -1.449413070e-02f, -1.068243873e-03f, +1.441462496e-02f, +3.019803133e-02f, +4.433036385e-02f, +5.496869433e-02f, +6.067957615e-02f, +6.067957615e-02f, +5.496869433e-02f, +4.433036385e-02f, +3.019803133e-02f, +1.441462496e-02f, -1.068243873e-03f, -1.449413070e-02f, -2.455324555e-02f, -3.053931896e-02f, -3.239073675e-02f, -3.061895965e-02f, -2.614892927e-02f, -2.011088080e-02f, -1.362811762e-02f, -7.640622167e-03f, -2.791909114e-03f, +6.101172529e-04f, +2.564170012e-03f, +3.297230410e-03f, +3.162428497e-03f, +2.538803326e-03f, +1.752961117e-03f, +1.033580484e-03f, +4.999457957e-04f, + -1.320203372e-05f, -1.983339052e-05f, -2.438287329e-05f, -2.357146827e-05f, -1.398834949e-05f, +6.921820601e-06f, +3.976501868e-05f, +8.228522318e-05f, +1.289419522e-04f, +1.712231930e-04f, +1.987928195e-04f, +2.013698844e-04f, +1.710267017e-04f, +1.044294743e-04f, +4.479993558e-06f, -1.191199691e-04f, -2.506690081e-04f, -3.706340911e-04f, -4.588731922e-04f, -4.983278153e-04f, -4.784437097e-04f, -3.975823219e-04f, -2.638600314e-04f, -9.416432483e-05f, +8.852210449e-05f, +2.589940252e-04f, +3.941362476e-04f, +4.768224673e-04f, +4.986377677e-04f, +4.609193410e-04f, +3.739723191e-04f, +2.547002593e-04f, +1.232052905e-04f, -9.075653692e-07f, -1.017777359e-04f, -1.694964089e-04f, -2.009512126e-04f, -1.993014146e-04f, -1.723633322e-04f, -1.303802073e-04f, -8.371807564e-05f, -4.096761910e-05f, -7.771194801e-06f, +1.351561964e-05f, +2.342139801e-05f, +2.445697407e-05f, +2.002256905e-05f, +1.341354347e-05f, + /* 1,17 (48) */ + -3.623863630e-04f, -5.912492225e-04f, -8.393230423e-04f, -1.063486334e-03f, -1.201686999e-03f, -1.173834369e-03f, -8.849961625e-04f, -2.309769343e-04f, +8.939184250e-04f, +2.587417548e-03f, +4.928853632e-03f, +7.968727757e-03f, +1.171932707e-02f, +1.614747299e-02f, +2.117036087e-02f, +2.665522321e-02f, +3.242322034e-02f, +3.825756657e-02f, +4.391547655e-02f, +4.914311219e-02f, +5.369237093e-02f, +5.733812134e-02f, +5.989439231e-02f, +6.122807178e-02f, +6.126886953e-02f, +6.001462650e-02f, +5.753147838e-02f, +5.394885828e-02f, +4.944980188e-02f, +4.425744853e-02f, +3.861896676e-02f, +3.278834001e-02f, +2.700950789e-02f, +2.150126709e-02f, +1.644510957e-02f, +1.197684112e-02f, +8.182421794e-03f, +5.098046504e-03f, +2.714084862e-03f, +9.821661133e-04f, -1.755412632e-04f, -8.559259511e-04f, -1.164476647e-03f, -1.205730648e-03f, -1.075386869e-03f, -8.545821021e-04f, -6.065447794e-04f, -3.755657852e-04f, + +6.522907823e-06f, +7.617957255e-06f, +7.663019833e-06f, +6.075048267e-06f, +2.264573046e-06f, -4.296176977e-06f, -1.399874871e-05f, -2.702553133e-05f, -4.328729862e-05f, -6.237997497e-05f, -8.356813575e-05f, -1.058004694e-04f, -1.277592971e-04f, -1.479425855e-04f, -1.647731083e-04f, -1.767259657e-04f, -1.824629900e-04f, -1.809610208e-04f, -1.716208647e-04f, -1.543450521e-04f, -1.295751782e-04f, -9.828341550e-05f, -6.191730505e-05f, -2.230168514e-05f, +1.849394269e-05f, +5.831068052e-05f, +9.506381053e-05f, +1.268994749e-04f, +1.523299854e-04f, +1.703355517e-04f, +1.804237446e-04f, +1.826423998e-04f, +1.775464088e-04f, +1.661234121e-04f, +1.496872908e-04f, +1.297511522e-04f, +1.078929320e-04f, +8.562670900e-05f, +6.429140060e-05f, +4.496592050e-05f, +2.841648733e-05f, +1.507800476e-05f, +5.067743758e-06f, -1.773638826e-06f, -5.821084136e-06f, -7.592796692e-06f, -7.675507496e-06f, -6.655454364e-06f, + +4.867437620e-04f, +1.013747094e-03f, +1.728578244e-03f, +2.515231857e-03f, +3.148440148e-03f, +3.304152230e-03f, +2.603935031e-03f, +6.924024761e-04f, -2.662967162e-03f, -7.469398974e-03f, -1.342932480e-02f, -1.990951092e-02f, -2.597790257e-02f, -3.051453018e-02f, -3.238625676e-02f, -3.065843893e-02f, -2.480391455e-02f, -1.486476480e-02f, -1.527117065e-03f, +1.391629715e-02f, +2.971958762e-02f, +4.393278153e-02f, +5.470483430e-02f, +6.058541183e-02f, +6.076809826e-02f, +5.522768835e-02f, +4.472450010e-02f, +3.067485380e-02f, +1.491326273e-02f, -6.073245321e-04f, -1.412015839e-02f, -2.429854529e-02f, -3.041611367e-02f, -3.239164432e-02f, -3.072073739e-02f, -2.631842568e-02f, -2.031183202e-02f, -1.382741904e-02f, -7.812985500e-03f, -2.922289321e-03f, +5.263991772e-04f, +2.523202393e-03f, +3.289459215e-03f, +3.175944117e-03f, +2.562224724e-03f, +1.777418091e-03f, +1.053603053e-03f, +5.133593392e-04f, + -1.299099421e-05f, -1.964224932e-05f, -2.430355154e-05f, -2.371290417e-05f, -1.444985736e-05f, +6.084337856e-06f, +3.857214372e-05f, +8.085666129e-05f, +1.274995807e-04f, +1.700686873e-04f, +1.982596258e-04f, +2.017560275e-04f, +1.725210712e-04f, +1.070480740e-04f, +8.028822401e-06f, -1.150427340e-04f, -2.466264993e-04f, -3.672646271e-04f, -4.567788623e-04f, -4.979591725e-04f, -4.800045906e-04f, -4.009760422e-04f, -2.686903983e-04f, -9.979367328e-05f, +8.286778134e-05f, +2.540930173e-04f, +3.906382195e-04f, +4.751409672e-04f, +4.988888348e-04f, +4.629168670e-04f, +3.772787163e-04f, +2.587196197e-04f, +1.272981371e-04f, +2.688059979e-06f, -9.909305502e-05f, -1.679301801e-04f, -2.004998266e-04f, -1.997851162e-04f, -1.734887737e-04f, -1.318140456e-04f, -8.515499721e-05f, -4.217982515e-05f, -8.632439490e-06f, +1.303161231e-05f, +2.326259437e-05f, +2.452574511e-05f, +2.020969306e-05f, +1.362546371e-05f, + /* 1,18 (48) */ + -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f, + +6.477690047e-06f, +7.596710501e-06f, +7.683214852e-06f, +6.155328848e-06f, +2.422804631e-06f, -4.045170841e-06f, -1.364553606e-05f, -2.656823942e-05f, -4.273331820e-05f, -6.174694096e-05f, -8.288397896e-05f, -1.051024197e-04f, -1.270918263e-04f, -1.473543959e-04f, -1.643133904e-04f, -1.764402438e-04f, -1.823889449e-04f, -1.811247071e-04f, -1.720337218e-04f, -1.550020465e-04f, -1.304543135e-04f, -9.934671235e-05f, -6.311320721e-05f, -2.356870096e-05f, +1.722268318e-05f, +5.710236930e-05f, +9.398087530e-05f, +1.259949353e-04f, +1.516436772e-04f, +1.698915531e-04f, +1.802292123e-04f, +1.826878783e-04f, +1.778075273e-04f, +1.665637486e-04f, +1.502620772e-04f, +1.304114247e-04f, +1.085897106e-04f, +8.631481091e-05f, +6.493255712e-05f, +4.553096181e-05f, +2.888647360e-05f, +1.544430097e-05f, +5.331145428e-06f, -1.604532908e-06f, -5.731996914e-06f, -7.566115013e-06f, -7.692569891e-06f, -6.698551799e-06f, + +4.737527678e-04f, +9.941048444e-04f, +1.704274692e-03f, +2.491518953e-03f, +3.133990291e-03f, +3.310236568e-03f, +2.642507175e-03f, +7.732591374e-04f, -2.535467581e-03f, -7.299330287e-03f, -1.323106518e-02f, -1.970775489e-02f, -2.580538150e-02f, -3.040748210e-02f, -3.237822794e-02f, -3.077348167e-02f, -2.505054105e-02f, -1.523202942e-02f, -1.983895928e-03f, +1.341833798e-02f, +2.923958303e-02f, +4.353180549e-02f, +5.443614390e-02f, +6.048561815e-02f, +6.085096604e-02f, +5.548178137e-02f, +4.511513832e-02f, +3.114999476e-02f, +1.541215157e-02f, -1.444076651e-04f, -1.374287967e-02f, -2.403982567e-02f, -3.028881553e-02f, -3.238895626e-02f, -3.081983044e-02f, -2.648635586e-02f, -2.051233184e-02f, -1.402720415e-02f, -7.986474273e-03f, -3.054103367e-03f, +4.412441800e-04f, +2.481022568e-03f, +3.280826776e-03f, +3.188975729e-03f, +2.585487318e-03f, +1.801943836e-03f, +1.073812746e-03f, +5.269848029e-04f, + -1.278048359e-05f, -1.944923643e-05f, -2.421911742e-05f, -2.384580553e-05f, -1.490020064e-05f, +5.258764720e-06f, +3.738911081e-05f, +7.943260847e-05f, +1.260533915e-04f, +1.689001464e-04f, +1.977021306e-04f, +2.021098317e-04f, +1.739795362e-04f, +1.096333455e-04f, +1.155365566e-05f, -1.109741421e-04f, -2.425733656e-04f, -3.638645247e-04f, -4.546367993e-04f, -4.975320429e-04f, -4.815050153e-04f, -4.043170167e-04f, -2.734844944e-04f, -1.054093829e-04f, +7.720212654e-05f, +2.491576510e-04f, +3.870886467e-04f, +4.733993232e-04f, +4.990808307e-04f, +4.648653351e-04f, +3.805526914e-04f, +2.627264553e-04f, +1.313979444e-04f, +6.306474398e-06f, -9.637563473e-05f, -1.663280088e-04f, -2.000155457e-04f, -2.002436315e-04f, -1.745991863e-04f, -1.332431650e-04f, -8.659576347e-05f, -4.340151373e-05f, -9.505530872e-06f, +1.253627391e-05f, +2.309495914e-05f, +2.458907746e-05f, +2.039466990e-05f, +1.383773357e-05f, + /* 1,19 (48) */ + -3.493857651e-04f, -5.760345548e-04f, -8.239768076e-04f, -1.051255956e-03f, -1.196999621e-03f, -1.182175717e-03f, -9.126404473e-04f, -2.845707051e-04f, +8.078978082e-04f, +2.463290632e-03f, +4.762401517e-03f, +7.757824868e-03f, +1.146447595e-02f, +1.585217601e-02f, +2.084127438e-02f, +2.630205700e-02f, +3.205836840e-02f, +3.789548084e-02f, +4.357182196e-02f, +4.883376509e-02f, +5.343234143e-02f, +5.714049121e-02f, +5.976936179e-02f, +6.118220139e-02f, +6.130458616e-02f, +6.013003955e-02f, +5.772052307e-02f, +5.420175269e-02f, +4.975377555e-02f, +4.459767564e-02f, +3.897961971e-02f, +3.315367029e-02f, +2.736486182e-02f, +2.183395425e-02f, +1.674505894e-02f, +1.223700370e-02f, +8.398904437e-03f, +5.269988024e-03f, +2.843308820e-03f, +1.072662996e-03f, -1.182383022e-04f, -8.254036453e-04f, -1.154077757e-03f, -1.209108819e-03f, -1.086939950e-03f, -8.697410138e-04f, -6.219128568e-04f, -3.889197914e-04f, + +6.431978801e-06f, +7.574460766e-06f, +7.701834142e-06f, +6.233451705e-06f, +2.578353981e-06f, -3.797240619e-06f, -1.329559004e-05f, -2.611413971e-05f, -4.218214685e-05f, -6.111600674e-05f, -8.220090042e-05f, -1.044041619e-04f, -1.264226756e-04f, -1.467629763e-04f, -1.638489388e-04f, -1.761484629e-04f, -1.823078213e-04f, -1.812807091e-04f, -1.724387800e-04f, -1.556516572e-04f, -1.313270034e-04f, -1.004049721e-04f, -6.430585546e-05f, -2.483449136e-05f, +1.595052764e-05f, +5.589110862e-05f, +9.289315982e-05f, +1.250841413e-04f, +1.509500984e-04f, +1.694397852e-04f, +1.800269439e-04f, +1.827261540e-04f, +1.780624044e-04f, +1.669991291e-04f, +1.508333922e-04f, +1.310697774e-04f, +1.092860609e-04f, +8.700380586e-05f, +6.557567358e-05f, +4.609872289e-05f, +2.935961333e-05f, +1.581387101e-05f, +5.597667930e-06f, -1.432672729e-06f, -5.640664402e-06f, -7.537765705e-06f, -7.708542790e-06f, -6.741082046e-06f, + +4.609722842e-04f, +9.746556080e-04f, +1.680055575e-03f, +2.467673148e-03f, +3.119090090e-03f, +3.315495333e-03f, +2.679896285e-03f, +8.526917458e-04f, -2.409414189e-03f, -7.130430141e-03f, -1.303336304e-02f, -1.950564506e-02f, -2.563140196e-02f, -3.029784876e-02f, -3.236667428e-02f, -3.088445581e-02f, -2.529311442e-02f, -1.559589395e-02f, -2.438532727e-03f, +1.292080593e-02f, +2.875807801e-02f, +4.312748847e-02f, +5.416265940e-02f, +6.038020877e-02f, +6.092816816e-02f, +5.573093902e-02f, +4.550222697e-02f, +3.162339409e-02f, +1.591123240e-02f, +3.204576699e-04f, -1.336232698e-02f, -2.377709921e-02f, -3.015741759e-02f, -3.238264978e-02f, -3.091620608e-02f, -2.665268387e-02f, -2.071234739e-02f, -1.422744778e-02f, -8.161073460e-03f, -3.187346532e-03f, +3.546484166e-04f, +2.437621054e-03f, +3.271321245e-03f, +3.201512003e-03f, +2.608582277e-03f, +1.826532914e-03f, +1.094207416e-03f, +5.408225365e-04f, + -1.257055940e-05f, -1.925444200e-05f, -2.412967932e-05f, -2.397027294e-05f, -1.533943858e-05f, +4.445116563e-06f, +3.621603328e-05f, +7.801328021e-05f, +1.246036813e-04f, +1.677179014e-04f, +1.971206335e-04f, +2.024314911e-04f, +1.754021216e-04f, +1.121851058e-04f, +1.505410309e-05f, -1.069147467e-04f, -2.385102389e-04f, -3.604343844e-04f, -4.524474573e-04f, -4.970466386e-04f, -4.829448989e-04f, -4.076048624e-04f, -2.782416943e-04f, -1.110106893e-04f, +7.152591317e-05f, +2.441885755e-04f, +3.834879467e-04f, +4.715976586e-04f, +4.992135781e-04f, +4.667643167e-04f, +3.837936558e-04f, +2.667201318e-04f, +1.355041440e-04f, +9.947263949e-06f, -9.362568470e-05f, -1.646898946e-04f, -1.994981936e-04f, -2.006766703e-04f, -1.756942389e-04f, -1.346672613e-04f, -8.804014709e-05f, -4.463255849e-05f, -1.039044230e-05f, +1.202955281e-05f, +2.291839499e-05f, +2.464686208e-05f, +2.057740610e-05f, +1.405029109e-05f, + /* 1,20 (48) */ + -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f, + +6.385788534e-06f, +7.551225169e-06f, +7.718896060e-06f, +6.309434527e-06f, +2.731235893e-06f, -3.552376721e-06f, -1.294890841e-05f, -2.566323901e-05f, -4.163380147e-05f, -6.048719935e-05f, -8.151893637e-05f, -1.037057395e-04f, -1.257518931e-04f, -1.461683752e-04f, -1.633797983e-04f, -1.758506607e-04f, -1.822196454e-04f, -1.814290384e-04f, -1.728360349e-04f, -1.562938633e-04f, -1.321932110e-04f, -1.014581444e-04f, -6.549518960e-05f, -2.609899070e-05f, +1.467754219e-05f, +5.467696004e-05f, +9.180071650e-05f, +1.241671324e-04f, +1.502492729e-04f, +1.689802556e-04f, +1.798169304e-04f, +1.827572033e-04f, +1.783110046e-04f, +1.674295098e-04f, +1.514011878e-04f, +1.317261621e-04f, +1.099819384e-04f, +8.769365605e-05f, +6.622072111e-05f, +4.666918493e-05f, +2.983589784e-05f, +1.618671553e-05f, +5.867319628e-06f, -1.258044290e-06f, -5.547069277e-06f, -7.507730380e-06f, -7.723408718e-06f, -6.783030070e-06f, + +4.484017248e-04f, +9.554011660e-04f, +1.655925896e-03f, +2.443702875e-03f, +3.103750651e-03f, +3.319940450e-03f, +2.716112319e-03f, +9.307050260e-04f, -2.284810508e-03f, -6.962712239e-03f, -1.283624241e-02f, -1.930321357e-02f, -2.545599984e-02f, -3.018566365e-02f, -3.235162018e-02f, -3.099137055e-02f, -2.553162466e-02f, -1.595632833e-02f, -2.890980184e-03f, +1.242375929e-02f, +2.827513312e-02f, +4.271988361e-02f, +5.388441771e-02f, +6.026919808e-02f, +6.099969408e-02f, +5.597512760e-02f, +4.588571491e-02f, +3.209499175e-02f, +1.641044598e-02f, +7.872219866e-04f, -1.297853332e-02f, -2.351037908e-02f, -3.002191345e-02f, -3.237270252e-02f, -3.100983176e-02f, -2.681737377e-02f, -2.091184558e-02f, -1.442812445e-02f, -8.336767698e-03f, -3.322013793e-03f, +2.666082695e-04f, +2.392988496e-03f, +3.260930802e-03f, +3.213541556e-03f, +2.631500672e-03f, +1.851179776e-03f, +1.114784822e-03f, +5.548728275e-04f, + -1.236127806e-05f, -1.905795531e-05f, -2.403534541e-05f, -2.408640770e-05f, -1.576763225e-05f, +3.643405993e-06f, +3.505302122e-05f, +7.659888899e-05f, +1.231507447e-04f, +1.665222834e-04f, +1.965154358e-04f, +2.027212045e-04f, +1.767888582e-04f, +1.147031788e-04f, +1.852978049e-05f, -1.028650970e-04f, -2.344377501e-04f, -3.569748093e-04f, -4.502112968e-04f, -4.965031808e-04f, -4.843241664e-04f, -4.108392049e-04f, -2.829613790e-04f, -1.165968301e-04f, +6.583991611e-05f, +2.391864458e-04f, +3.798365454e-04f, +4.697361063e-04f, +4.992869089e-04f, +4.686133899e-04f, +3.870010247e-04f, +2.707000147e-04f, +1.396161639e-04f, +1.361000888e-05f, -9.084342132e-05f, -1.630158436e-04f, -1.989475989e-04f, -2.010839449e-04f, -1.767736006e-04f, -1.360860288e-04f, -8.948791782e-05f, -4.587282982e-05f, -1.128714424e-05f, +1.151139937e-05f, +2.273280550e-05f, +2.469898981e-05f, +2.075780740e-05f, +1.426307319e-05f, + /* 1,21 (48) */ + -3.365679977e-04f, -5.609088688e-04f, -8.085560774e-04f, -1.038713070e-03f, -1.191690031e-03f, -1.189525335e-03f, -9.388849457e-04f, -3.363480838e-04f, +7.240818599e-04f, +2.341687426e-03f, +4.598681680e-03f, +7.549714967e-03f, +1.121230138e-02f, +1.555924466e-02f, +2.051404564e-02f, +2.595005788e-02f, +3.169384093e-02f, +3.753277109e-02f, +4.322654714e-02f, +4.852181957e-02f, +5.316882122e-02f, +5.693862809e-02f, +5.963956075e-02f, +6.113126791e-02f, +6.133521423e-02f, +6.024060761e-02f, +5.790521695e-02f, +5.445100397e-02f, +5.005497492e-02f, +4.493609568e-02f, +3.933946359e-02f, +3.351915364e-02f, +2.772123523e-02f, +2.216838289e-02f, +1.704729352e-02f, +1.249979964e-02f, +8.618172436e-03f, +5.444685486e-03f, +2.975105214e-03f, +1.165430903e-03f, -5.904279106e-05f, -7.934030588e-04f, -1.142612770e-03f, -1.211799537e-03f, -1.098127684e-03f, -8.847865099e-04f, -6.373448083e-04f, -4.024439035e-04f, + +6.339133594e-06f, +7.527020764e-06f, +7.734418951e-06f, +6.383295056e-06f, +2.881465290e-06f, -3.310569361e-06f, -1.260548869e-05f, -2.521554387e-05f, -4.108829861e-05f, -5.986054554e-05f, -8.083812284e-05f, -1.030071957e-04f, -1.250795263e-04f, -1.455706410e-04f, -1.629060141e-04f, -1.755468747e-04f, -1.821244437e-04f, -1.815697075e-04f, -1.732254828e-04f, -1.569286442e-04f, -1.330529000e-04f, -1.025061794e-04f, -6.668114971e-05f, -2.736213345e-05f, +1.340379299e-05f, +5.345998535e-05f, +9.070359815e-05f, +1.232439486e-04f, +1.495412255e-04f, +1.685129721e-04f, +1.795991635e-04f, +1.827810030e-04f, +1.785532927e-04f, +1.678548470e-04f, +1.519654159e-04f, +1.323805306e-04f, +1.106772984e-04f, +8.838432342e-05f, +6.686767051e-05f, +4.724232877e-05f, +3.031531818e-05f, +1.656283491e-05f, +6.140108674e-06f, -1.080633738e-06f, -5.451194286e-06f, -7.475990650e-06f, -7.737150143e-06f, -6.824380746e-06f, + +4.360404467e-04f, +9.363432107e-04f, +1.631890550e-03f, +2.419616467e-03f, +3.087983019e-03f, +3.323583856e-03f, +2.751165340e-03f, +1.007303915e-03f, -2.161659764e-03f, -6.796189956e-03f, -1.263972698e-02f, -1.910049237e-02f, -2.527921098e-02f, -3.007096047e-02f, -3.233309040e-02f, -3.109423565e-02f, -2.576606241e-02f, -1.631330314e-02f, -3.341191481e-03f, +1.192725611e-02f, +2.779080895e-02f, +4.230904441e-02f, +5.360145633e-02f, +6.015260125e-02f, +6.106553399e-02f, +5.621431404e-02f, +4.626555146e-02f, +3.256472785e-02f, +1.690973288e-02f, +1.255835377e-03f, -1.259153230e-02f, -2.323967906e-02f, -2.988229728e-02f, -3.235909251e-02f, -3.110067518e-02f, -2.698038961e-02f, -2.111079318e-02f, -1.462920840e-02f, -8.513541299e-03f, -3.458099822e-03f, +1.771203517e-04f, +2.347115666e-03f, +3.249643658e-03f, +3.225052956e-03f, +2.654233478e-03f, +1.875878766e-03f, +1.135542630e-03f, +5.691359007e-04f, + -1.215269488e-05f, -1.885986474e-05f, -2.393622360e-05f, -2.419431183e-05f, -1.618484449e-05f, +2.853642879e-06f, +3.390018149e-05f, +7.518964427e-05f, +1.216948744e-04f, +1.653136230e-04f, +1.958868412e-04f, +2.029791747e-04f, +1.781397830e-04f, +1.171873950e-04f, +2.198030972e-05f, -9.882573812e-05f, -2.303565294e-04f, -3.534864055e-04f, -4.479287843e-04f, -4.959018989e-04f, -4.856427518e-04f, -4.140196788e-04f, -2.876429354e-04f, -1.221670459e-04f, +6.014491190e-05f, +2.341519224e-04f, +3.761348771e-04f, +4.678148086e-04f, +4.993006637e-04f, +4.704121395e-04f, +3.901742165e-04f, +2.746654690e-04f, +1.437334289e-04f, +1.729428370e-05f, -8.802906768e-05f, -1.613058679e-04f, -1.983635946e-04f, -2.014651700e-04f, -1.778369407e-04f, -1.374991601e-04f, -9.093884253e-05f, -4.712219483e-05f, -1.219560428e-05f, +1.098176596e-05f, +2.253809516e-05f, +2.474535144e-05f, +2.093577875e-05f, +1.447601573e-05f, + /* 1,22 (48) */ + -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f, + +6.292028226e-06f, +7.501864540e-06f, +7.748421147e-06f, +6.455051086e-06f, +3.029057220e-06f, -3.071808559e-06f, -1.226532812e-05f, -2.477106051e-05f, -4.054565455e-05f, -5.923607174e-05f, -8.015849554e-05f, -1.023085737e-04f, -1.244056229e-04f, -1.449698222e-04f, -1.624276316e-04f, -1.752371429e-04f, -1.820222430e-04f, -1.817027291e-04f, -1.736071204e-04f, -1.575559798e-04f, -1.339060344e-04f, -1.035490276e-04f, -6.786367609e-05f, -2.862385418e-05f, +1.212934627e-05f, +5.224024653e-05f, +8.960185788e-05f, +1.223146305e-04f, +1.488259813e-04f, +1.680379435e-04f, +1.793736353e-04f, +1.827975304e-04f, +1.787892338e-04f, +1.682750973e-04f, +1.525260286e-04f, +1.330328344e-04f, +1.113720959e-04f, +8.907576968e-05f, +6.751649231e-05f, +4.781813497e-05f, +3.079786504e-05f, +1.694222924e-05f, +6.416043006e-06f, -9.004273601e-07f, -5.353022246e-06f, -7.442528130e-06f, -7.749749481e-06f, -6.865118852e-06f, + +4.238877519e-04f, +9.174833459e-04f, +1.607954327e-03f, +2.395422155e-03f, +3.071798175e-03f, +3.326437498e-03f, +2.785065521e-03f, +1.082493559e-03f, -2.039964889e-03f, -6.630876333e-03f, -1.244384013e-02f, -1.889751319e-02f, -2.510107120e-02f, -2.995377308e-02f, -3.231111009e-02f, -3.119306139e-02f, -2.599641894e-02f, -1.666678955e-02f, -3.789120265e-03f, +1.143135421e-02f, +2.730516620e-02f, +4.189502473e-02f, +5.331381339e-02f, +6.003043421e-02f, +6.112567891e-02f, +5.644846596e-02f, +4.664168634e-02f, +3.303254266e-02f, +1.740903355e-02f, +1.726247516e-03f, -1.220135808e-02f, -2.296501360e-02f, -2.973856385e-02f, -3.234179823e-02f, -3.118870425e-02f, -2.714169548e-02f, -2.130915678e-02f, -1.483067357e-02f, -8.691378240e-03f, -3.595598982e-03f, +8.618150913e-05f, +2.299993471e-03f, +3.237448054e-03f, +3.236034722e-03f, +2.676771573e-03f, +1.900624117e-03f, +1.156478409e-03f, +5.836119165e-04f, + -1.194486404e-05f, -1.866025781e-05f, -2.383242151e-05f, -2.429408800e-05f, -1.659113991e-05f, +2.075834377e-06f, +3.275761770e-05f, +7.378575245e-05f, +1.202363612e-04f, +1.640922509e-04f, +1.952351551e-04f, +2.032056088e-04f, +1.794549389e-04f, +1.196375918e-04f, +2.540531878e-05f, -9.479721092e-05f, -2.262672056e-04f, -3.499697813e-04f, -4.456003923e-04f, -4.952430311e-04f, -4.869005993e-04f, -4.171459276e-04f, -2.922857573e-04f, -1.277205798e-04f, +5.444167862e-05f, +2.290856711e-04f, +3.723833847e-04f, +4.658339177e-04f, +4.992546924e-04f, +4.721601571e-04f, +3.933126532e-04f, +2.786158599e-04f, +1.478553601e-04f, +2.099965721e-05f, -8.518285353e-05f, -1.595599860e-04f, -1.977460188e-04f, -2.018200630e-04f, -1.788839288e-04f, -1.389063463e-04f, -9.239268525e-05f, -4.838051740e-05f, -1.311578707e-05f, +1.044060700e-05f, +2.233416943e-05f, +2.478583769e-05f, +2.111122436e-05f, +1.468905343e-05f, + /* 1,23 (48) */ + -3.239368359e-04f, -5.458799835e-04f, -7.930732373e-04f, -1.025874724e-03f, -1.185779509e-03f, -1.195907712e-03f, -9.637557625e-04f, -3.863346882e-04f, +6.424479067e-04f, +2.222590809e-03f, +4.437685062e-03f, +7.344399198e-03f, +1.096281623e-02f, +1.526870420e-02f, +2.018871199e-02f, +2.559927386e-02f, +3.132969425e-02f, +3.716949865e-02f, +4.287971454e-02f, +4.820733494e-02f, +5.290186229e-02f, +5.673257289e-02f, +5.950501592e-02f, +6.107528192e-02f, +6.136074737e-02f, +6.034630785e-02f, +5.808552240e-02f, +5.469656255e-02f, +5.035334212e-02f, +4.527264659e-02f, +3.969843638e-02f, +3.388473218e-02f, +2.807857776e-02f, +2.250451283e-02f, +1.735178496e-02f, +1.276521300e-02f, +8.840221830e-03f, +5.622145579e-03f, +3.109489377e-03f, +1.260491367e-03f, +2.070392152e-06f, -7.598979946e-04f, -1.130056618e-03f, -1.213780598e-03f, -1.108931901e-03f, -8.997050287e-04f, -6.528317079e-04f, -4.161334031e-04f, + +6.244486575e-06f, +7.475773419e-06f, +7.760920964e-06f, +6.524720458e-06f, +3.174026850e-06f, -2.836084140e-06f, -1.192842370e-05f, -2.432979486e-05f, -4.000588521e-05f, -5.861380406e-05f, -7.948008996e-05f, -1.016099164e-04f, -1.237302304e-04f, -1.443659673e-04f, -1.619446962e-04f, -1.749215037e-04f, -1.819130706e-04f, -1.818281164e-04f, -1.739809448e-04f, -1.581758507e-04f, -1.347525789e-04f, -1.045866398e-04f, -6.904270931e-05f, -2.988408757e-05f, +1.085426828e-05f, +5.101780578e-05f, +8.849554918e-05f, +1.213792189e-04f, +1.481035659e-04f, +1.675551786e-04f, +1.791403384e-04f, +1.828067631e-04f, +1.790187932e-04f, +1.686902173e-04f, +1.530829779e-04f, +1.336830254e-04f, +1.120662859e-04f, +8.976795629e-05f, +6.816715673e-05f, +4.839658372e-05f, +3.128352883e-05f, +1.732489835e-05f, +6.695130348e-06f, -7.174115923e-07f, -5.252536049e-06f, -7.407324442e-06f, -7.761189099e-06f, -6.905229076e-06f, + +4.119428878e-04f, +8.988230881e-04f, +1.584121905e-03f, +2.371128067e-03f, +3.055207035e-03f, +3.328513333e-03f, +2.817823139e-03f, +1.156279312e-03f, -1.919728528e-03f, -6.466784082e-03f, -1.224860498e-02f, -1.869430758e-02f, -2.492161626e-02f, -2.983413549e-02f, -3.228570477e-02f, -3.128785860e-02f, -2.622268614e-02f, -1.701675933e-02f, -4.234720657e-03f, +1.093611118e-02f, +2.681826560e-02f, +4.147787880e-02f, +5.302152764e-02f, +5.990271363e-02f, +6.118012058e-02f, +5.667755164e-02f, +4.701406972e-02f, +3.349837658e-02f, +1.790828824e-02f, +2.198407673e-03f, -1.180804543e-02f, -2.268639774e-02f, -2.959070849e-02f, -3.232079857e-02f, -3.127388711e-02f, -2.730125546e-02f, -2.150690279e-02f, -1.503249363e-02f, -8.870262169e-03f, -3.734505328e-03f, -6.211176122e-06f, +2.251612954e-03f, +3.224332267e-03f, +3.246475329e-03f, +2.699105742e-03f, +1.925409955e-03f, +1.177589633e-03f, +5.983009699e-04f, + -1.173783863e-05f, -1.845922109e-05f, -2.372404648e-05f, -2.438583951e-05f, -1.698658485e-05f, +1.309984952e-06f, +3.162543024e-05f, +7.238741685e-05f, +1.187754937e-04f, +1.628584972e-04f, +1.945606850e-04f, +2.034007180e-04f, +1.807343748e-04f, +1.220536131e-04f, +2.880444182e-05f, -9.078005214e-05f, -2.221704064e-04f, -3.464255475e-04f, -4.432265991e-04f, -4.945268237e-04f, -4.880976622e-04f, -4.202176034e-04f, -2.968892447e-04f, -1.332566780e-04f, +4.873099576e-05f, +2.239883633e-04f, +3.685825189e-04f, +4.637935950e-04f, +4.991488536e-04f, +4.738570412e-04f, +3.964157603e-04f, +2.825505523e-04f, +1.519813755e-04f, +2.472569254e-05f, -8.230501533e-05f, -1.577782226e-04f, -1.970947142e-04f, -2.021483440e-04f, -1.799142352e-04f, -1.403072766e-04f, -9.384920717e-05f, -4.964765813e-05f, -1.404765433e-05f, +9.887878991e-06f, +2.212093478e-05f, +2.482033930e-05f, +2.128404769e-05f, +1.490211996e-05f, + /* 1,24 (48) */ + -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f, + +6.196522682e-06f, +7.448764252e-06f, +7.771936700e-06f, +6.592321062e-06f, +3.316389466e-06f, -2.603385740e-06f, -1.159477218e-05f, -2.389175254e-05f, -3.946900620e-05f, -5.799376832e-05f, -7.880294129e-05f, -1.009112666e-04f, -1.230533962e-04f, -1.437591249e-04f, -1.614572536e-04f, -1.745999956e-04f, -1.817969543e-04f, -1.819458831e-04f, -1.743469537e-04f, -1.587882379e-04f, -1.355924986e-04f, -1.056189673e-04f, -7.021819019e-05f, -3.114276840e-05f, +9.578625365e-06f, +4.979272550e-05f, +8.738472583e-05f, +1.204377551e-04f, +1.473740055e-04f, +1.670646871e-04f, +1.788992659e-04f, +1.828086792e-04f, +1.792419368e-04f, +1.691001640e-04f, +1.536362162e-04f, +1.343310549e-04f, +1.127598233e-04f, +9.046084446e-05f, +6.881963368e-05f, +4.897765493e-05f, +3.177229965e-05f, +1.771084180e-05f, +6.977378204e-06f, -5.315730174e-07f, -5.149718660e-06f, -7.370361214e-06f, -7.771451312e-06f, -6.944696012e-06f, + +4.002050492e-04f, +8.803638670e-04f, +1.560397859e-03f, +2.346742228e-03f, +3.038220450e-03f, +3.329823318e-03f, +2.849448569e-03f, +1.228666729e-03f, -1.800953034e-03f, -6.303925585e-03f, -1.205404429e-02f, -1.849090686e-02f, -2.474088189e-02f, -2.971208187e-02f, -3.225690033e-02f, -3.137863865e-02f, -2.644485655e-02f, -1.736318488e-02f, -4.677947257e-03f, +1.044158436e-02f, +2.633016794e-02f, +4.105766120e-02f, +5.272463839e-02f, +5.976945695e-02f, +6.122885158e-02f, +5.690154000e-02f, +4.738265224e-02f, +3.396217017e-02f, +1.840743709e-02f, +2.672264714e-03f, -1.141162967e-02f, -2.240384718e-02f, -2.943872712e-02f, -3.229607288e-02f, -3.135619212e-02f, -2.745903369e-02f, -2.170399751e-02f, -1.523464198e-02f, -9.050176404e-03f, -3.874812605e-03f, -1.000603833e-04f, +2.201965296e-03f, +3.210284612e-03f, +3.256363208e-03f, +2.721226677e-03f, +1.950230294e-03f, +1.198873681e-03f, +6.132030899e-04f, + -1.153167060e-05f, -1.825684027e-05f, -2.361120550e-05f, -2.446967027e-05f, -1.737124731e-05f, +5.560964085e-07f, +3.050371628e-05f, +7.099483771e-05f, +1.173125582e-04f, +1.616126915e-04f, +1.938637399e-04f, +2.035647178e-04f, +1.819781453e-04f, +1.244353095e-04f, +3.217731919e-05f, -8.677479417e-05f, -2.180667583e-04f, -3.428543174e-04f, -4.408078890e-04f, -4.937535320e-04f, -4.892339038e-04f, -4.232343676e-04f, -3.014528043e-04f, -1.387745892e-04f, +4.301364407e-05f, +2.188606756e-04f, +3.647327390e-04f, +4.616940118e-04f, +4.989830154e-04f, +4.755023974e-04f, +3.994829673e-04f, +2.864689115e-04f, +1.561108897e-04f, +2.847194725e-05f, -7.939579618e-05f, -1.559606090e-04f, -1.964095286e-04f, -2.024497358e-04f, -1.809275301e-04f, -1.417016390e-04f, -9.530816669e-05f, -5.092347434e-05f, -1.499116485e-05f, +9.323540560e-06f, +2.189829870e-05f, +2.484874698e-05f, +2.145415145e-05f, +1.511514789e-05f, + /* 1,25 (48) */ + -3.114958267e-04f, -5.309554459e-04f, -7.775403796e-04f, -1.012757683e-03f, -1.179289092e-03f, -1.201347182e-03f, -9.872789584e-04f, -4.345562356e-04f, +5.629730153e-04f, +2.105983236e-03f, +4.279402031e-03f, +7.141878015e-03f, +1.071603260e-02f, +1.498057911e-02f, +1.986531004e-02f, +2.524975236e-02f, +3.096598422e-02f, +3.680572465e-02f, +4.253138664e-02f, +4.789037086e-02f, +5.263151721e-02f, +5.652236728e-02f, +5.936575502e-02f, +6.101425507e-02f, +6.138118026e-02f, +6.044711838e-02f, +5.826140268e-02f, +5.493837952e-02f, +5.064881970e-02f, +4.560726646e-02f, +4.005647599e-02f, +3.425034762e-02f, +2.843683849e-02f, +2.284230321e-02f, +1.765850416e-02f, +1.303322708e-02f, +9.065047940e-03f, +5.802374380e-03f, +3.246476168e-03f, +1.357865606e-03f, +6.512622063e-05f, -7.248622545e-04f, -1.116384110e-03f, -1.215029582e-03f, -1.119334155e-03f, -9.144827144e-04f, -6.683643483e-04f, -4.299833282e-04f, + +6.148150484e-06f, +7.420853824e-06f, +7.781486633e-06f, +6.657870832e-06f, +3.456160473e-06f, -2.373702808e-06f, -1.126437005e-05f, -2.345693889e-05f, -3.893503281e-05f, -5.737599002e-05f, -7.812708446e-05f, -1.002126668e-04f, -1.223751678e-04f, -1.431493437e-04f, -1.609653496e-04f, -1.742726574e-04f, -1.816739221e-04f, -1.820560435e-04f, -1.747051455e-04f, -1.593931230e-04f, -1.364257588e-04f, -1.066459616e-04f, -7.139005983e-05f, -3.239983159e-05f, +8.302483877e-06f, +4.856506828e-05f, +8.626944199e-05f, +1.194902810e-04f, +1.466373266e-04f, +1.665664791e-04f, +1.786504114e-04f, +1.828032572e-04f, +1.794586306e-04f, +1.695048947e-04f, +1.541856957e-04f, +1.349768747e-04f, +1.134526627e-04f, +9.115439517e-05f, +6.947389279e-05f, +4.956132816e-05f, +3.226416726e-05f, +1.810005886e-05f, +7.262793860e-06f, -3.428983692e-07f, -5.044553124e-06f, -7.331620083e-06f, -7.780518386e-06f, -6.983504168e-06f, + +3.886733786e-04f, +8.621070268e-04f, +1.536786653e-03f, +2.322272557e-03f, +3.020849203e-03f, +3.330379414e-03f, +2.879952286e-03f, +1.299661566e-03f, -1.683640476e-03f, -6.142312893e-03f, -1.186018055e-02f, -1.828734215e-02f, -2.455890374e-02f, -2.958764656e-02f, -3.222472301e-02f, -3.146541345e-02f, -2.666292331e-02f, -1.770603919e-02f, -5.118755146e-03f, +9.947830828e-03f, +2.584093403e-02f, +4.063442683e-02f, +5.242318559e-02f, +5.963068236e-02f, +6.127186522e-02f, +5.712040067e-02f, +4.774738498e-02f, +3.442386419e-02f, +1.890642011e-02f, +3.147767112e-03f, -1.101214670e-02f, -2.211737827e-02f, -2.928261623e-02f, -3.226760093e-02f, -3.143558792e-02f, -2.761499429e-02f, -2.190040704e-02f, -1.543709171e-02f, -9.231103934e-03f, -4.016514244e-03f, -1.953685500e-04f, +2.151041821e-03f, +3.195293448e-03f, +3.265686748e-03f, +2.743124976e-03f, +1.975079041e-03f, +1.220327832e-03f, +6.283182377e-04f, + -1.132641078e-05f, -1.805320008e-05f, -2.349400520e-05f, -2.454568474e-05f, -1.774519696e-05f, -1.858320897e-07f, +2.939256978e-05f, +6.960821217e-05f, +1.158478390e-04f, +1.603551633e-04f, +1.931446308e-04f, +2.036978274e-04f, +1.831863109e-04f, +1.267825385e-04f, +3.552359748e-05f, -8.278196499e-05f, -2.139568862e-04f, -3.392567061e-04f, -4.383447518e-04f, -4.929234191e-04f, -4.903092966e-04f, -4.261958904e-04f, -3.059758495e-04f, -1.442735657e-04f, +3.729040543e-05f, +2.137032898e-04f, +3.608345123e-04f, +4.595353487e-04f, +4.987570545e-04f, +4.770958382e-04f, +4.025137075e-04f, +2.903703028e-04f, +1.602433145e-04f, +3.223797337e-05f, -7.645544584e-05f, -1.541071826e-04f, -1.956903147e-04f, -2.027239640e-04f, -1.819234847e-04f, -1.430891199e-04f, -9.676931944e-05f, -5.220782014e-05f, -1.594627439e-05f, +8.747552469e-06f, +2.166616976e-05f, +2.487095151e-05f, +2.162143767e-05f, +1.532806871e-05f, + /* 1,26 (48) */ + -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f, + +6.099383813e-06f, +7.392058845e-06f, +7.789589021e-06f, +6.721387745e-06f, +3.593355386e-06f, -2.147024604e-06f, -1.093721356e-05f, -2.302535893e-05f, -3.840398002e-05f, -5.676049434e-05f, -7.745255413e-05f, -9.951415924e-05f, -1.216955923e-04f, -1.425366721e-04f, -1.604690300e-04f, -1.739395284e-04f, -1.815440025e-04f, -1.821586121e-04f, -1.750555188e-04f, -1.599904879e-04f, -1.372523257e-04f, -1.076675748e-04f, -7.255825958e-05f, -3.365521214e-05f, +7.025910221e-06f, +4.733489691e-05f, +8.514975212e-05f, +1.185368387e-04f, +1.458935566e-04f, +1.660605652e-04f, +1.783937689e-04f, +1.827904761e-04f, +1.796688410e-04f, +1.699043667e-04f, +1.547313687e-04f, +1.356204362e-04f, +1.141447587e-04f, +9.184856916e-05f, +7.012990339e-05f, +5.014758269e-05f, +3.275912115e-05f, +1.849254854e-05f, +7.551384381e-06f, -1.513745344e-07f, -4.937022566e-06f, -7.291082698e-06f, -7.788372543e-06f, -7.021637960e-06f, + +3.773469678e-04f, +8.440538267e-04f, +1.513292648e-03f, +2.297726873e-03f, +3.003104006e-03f, +3.330193582e-03f, +2.909344855e-03f, +1.369269778e-03f, -1.567792637e-03f, -5.981957730e-03f, -1.166703592e-02f, -1.808364432e-02f, -2.437571743e-02f, -2.946086403e-02f, -3.218919941e-02f, -3.154819541e-02f, -2.687688019e-02f, -1.804529590e-02f, -5.557099897e-03f, +9.454907409e-03f, +2.535062474e-02f, +4.020823094e-02f, +5.211720974e-02f, +5.948640879e-02f, +6.130915563e-02f, +5.733410396e-02f, +4.810821949e-02f, +3.488339953e-02f, +1.940517716e-02f, +3.624862950e-03f, -1.060963299e-02f, -2.182700797e-02f, -2.912237291e-02f, -3.223536296e-02f, -3.151204336e-02f, -2.776910148e-02f, -2.209609735e-02f, -1.563981567e-02f, -9.413027418e-03f, -4.159603364e-03f, -2.921378694e-04f, +2.098834001e-03f, +3.179347173e-03f, +3.274434301e-03f, +2.764791145e-03f, +1.999949993e-03f, +1.241949270e-03f, +6.436463064e-04f, + -1.112210891e-05f, -1.784838432e-05f, -2.337255185e-05f, -2.461398792e-05f, -1.810850509e-05f, -9.158039886e-07f, +2.829208151e-05f, +6.822773425e-05f, +1.143816183e-04f, +1.590862412e-04f, +1.924036704e-04f, +2.038002702e-04f, +1.843589381e-04f, +1.290951640e-04f, +3.884292954e-05f, -7.880208811e-05f, -2.098414137e-04f, -3.356333310e-04f, -4.358376830e-04f, -4.920367567e-04f, -4.913238229e-04f, -4.291018512e-04f, -3.104578006e-04f, -1.497528627e-04f, +3.156206276e-05f, +2.085168925e-04f, +3.568883141e-04f, +4.573177959e-04f, +4.984708574e-04f, +4.786369835e-04f, +4.055074182e-04f, +2.942540920e-04f, +1.643780583e-04f, +3.602331742e-05f, -7.348422069e-05f, -1.522179874e-04f, -1.949369302e-04f, -2.029707573e-04f, -1.829017706e-04f, -1.444694044e-04f, -9.823241829e-05f, -5.350054635e-05f, -1.691293576e-05f, +8.159877660e-06f, +2.142445762e-05f, +2.488684375e-05f, +2.178580768e-05f, +1.554081285e-05f, + /* 1,27 (48) */ + -2.992482924e-04f, -5.161425332e-04f, -7.619693040e-04f, -9.993784239e-04f, -1.172239576e-03f, -1.205867910e-03f, -1.009480542e-03f, -4.810385334e-04f, +4.856340025e-04f, +1.991846752e-03f, +4.123822392e-03f, +6.942151189e-03f, +1.047196184e-02f, +1.469489309e-02f, +1.954387566e-02f, +2.490154017e-02f, +3.060276630e-02f, +3.644151000e-02f, +4.218162598e-02f, +4.757098725e-02f, +5.235783912e-02f, +5.630805374e-02f, +5.922180670e-02f, +6.094820002e-02f, +6.139650865e-02f, +6.054301834e-02f, +5.843282187e-02f, +5.517640664e-02f, +5.094135058e-02f, +4.593989350e-02f, +4.041352017e-02f, +3.461594135e-02f, +2.879596596e-02f, +2.318171247e-02f, +1.796742122e-02f, +1.330382439e-02f, +9.292645361e-03f, +5.985377344e-03f, +3.386079964e-03f, +1.457574517e-03f, +1.301495090e-04f, -6.882696471e-04f, -1.101569931e-03f, -1.215523855e-03f, -1.129315731e-03f, -9.291054171e-04f, -6.839332393e-04f, -4.439884703e-04f, + +6.050236397e-06f, +7.362395954e-06f, +7.796262099e-06f, +6.782889817e-06f, +3.727989835e-06f, -1.923340206e-06f, -1.061329869e-05f, -2.259701741e-05f, -3.787586248e-05f, -5.614730615e-05f, -7.677938468e-05f, -9.881578617e-05f, -1.210147169e-04f, -1.419211588e-04f, -1.599683410e-04f, -1.736006478e-04f, -1.814072243e-04f, -1.822536042e-04f, -1.753980729e-04f, -1.605803153e-04f, -1.380721657e-04f, -1.086837592e-04f, -7.372273107e-05f, -3.490884522e-05f, +5.748970827e-06f, +4.610227435e-05f, +8.402571100e-05f, +1.175774709e-04f, +1.451427229e-04f, +1.655469566e-04f, +1.781293332e-04f, +1.827703153e-04f, +1.798725349e-04f, +1.702985375e-04f, +1.552731878e-04f, +1.362616909e-04f, +1.148360655e-04f, +9.254332692e-05f, +7.078763450e-05f, +5.073639743e-05f, +3.325715046e-05f, +1.888830955e-05f, +7.843156605e-06f, +4.301144525e-08f, -4.827110191e-06f, -7.248730722e-06f, -7.794995958e-06f, -7.059081716e-06f, + +3.662248589e-04f, +8.262054424e-04f, +1.489920096e-03f, +2.273112885e-03f, +2.984995501e-03f, +3.329277778e-03f, +2.937636937e-03f, +1.437497513e-03f, -1.453411019e-03f, -5.822871489e-03f, -1.147463225e-02f, -1.787984405e-02f, -2.419135849e-02f, -2.933176886e-02f, -3.215035648e-02f, -3.162699750e-02f, -2.708672161e-02f, -1.838092923e-02f, -5.992937580e-03f, +8.962870652e-03f, +2.485930091e-02f, +3.977912909e-02f, +5.180675194e-02f, +5.933665593e-02f, +6.134071769e-02f, +5.754262086e-02f, +4.846510781e-02f, +3.534071733e-02f, +1.990364802e-02f, +4.103499934e-03f, -1.020412557e-02f, -2.153275388e-02f, -2.895799486e-02f, -3.219933964e-02f, -3.158552758e-02f, -2.792131946e-02f, -2.229103428e-02f, -1.584278643e-02f, -9.595929189e-03f, -4.304072768e-03f, -3.903702877e-04f, +2.045333455e-03f, +3.162434237e-03f, +3.282594178e-03f, +2.786215603e-03f, +2.024836836e-03f, +1.263735077e-03f, +6.591871193e-04f, + -1.091881357e-05f, -1.764247584e-05f, -2.324695131e-05f, -2.467468530e-05f, -1.846124455e-05f, -1.633825320e-06f, +2.720233902e-05f, +6.685359483e-05f, +1.129141757e-04f, +1.578062534e-04f, +1.916411728e-04f, +2.038722735e-04f, +1.854960989e-04f, +1.313730568e-04f, +4.213497453e-05f, -7.483568249e-05f, -2.057209625e-04f, -3.319848116e-04f, -4.332871834e-04f, -4.910938247e-04f, -4.922774745e-04f, -4.319519384e-04f, -3.148980846e-04f, -1.552117387e-04f, +2.582939980e-05f, +2.033021755e-04f, +3.528946277e-04f, +4.550415531e-04f, +4.981243193e-04f, +4.801254603e-04f, +4.084635409e-04f, +2.981196454e-04f, +1.685145269e-04f, +3.982752051e-05f, -7.048238377e-05f, -1.502930739e-04f, -1.941492378e-04f, -2.031898472e-04f, -1.838620601e-04f, -1.458421761e-04f, -9.969721340e-05f, -5.480150053e-05f, -1.789109874e-05f, +7.560481282e-06f, +2.117307309e-05f, +2.489631464e-05f, +2.194716213e-05f, +1.575330966e-05f, + /* 1,28 (48) */ + -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f, + +6.000721856e-06f, +7.331881716e-06f, +7.801524077e-06f, +6.842395104e-06f, +3.860079559e-06f, -1.702638511e-06f, -1.029262119e-05f, -2.217191876e-05f, -3.735069452e-05f, -5.553645002e-05f, -7.610761022e-05f, -9.811758948e-05f, -1.203325886e-04f, -1.413028526e-04f, -1.594633288e-04f, -1.732560555e-04f, -1.812636169e-04f, -1.823410354e-04f, -1.757328077e-04f, -1.611625883e-04f, -1.388852458e-04f, -1.096944677e-04f, -7.488341620e-05f, -3.616066610e-05f, +4.471732158e-06f, +4.486726377e-05f, +8.289737375e-05f, +1.166122207e-04f, +1.443848538e-04f, +1.650256649e-04f, +1.778570993e-04f, +1.827427547e-04f, +1.800696793e-04f, +1.706873651e-04f, +1.558111055e-04f, +1.369005902e-04f, +1.155265373e-04f, +9.323862873e-05f, +7.144705488e-05f, +5.132775100e-05f, +3.375824403e-05f, +1.928734033e-05f, +8.138117147e-06f, +2.402723706e-07f, -4.714799292e-06f, -7.204545832e-06f, -7.800370763e-06f, -7.095819678e-06f, + +3.553060453e-04f, +8.085629665e-04f, +1.466673145e-03f, +2.248438199e-03f, +2.966534256e-03f, +3.327643953e-03f, +2.964839276e-03f, +1.504351108e-03f, -1.340496843e-03f, -5.665065235e-03f, -1.128299108e-02f, -1.767597177e-02f, -2.400586239e-02f, -2.920039581e-02f, -3.210822151e-02f, -3.170183318e-02f, -2.729244257e-02f, -1.871291404e-02f, -6.426224764e-03f, +8.471776828e-03f, +2.436702344e-02f, +3.934717715e-02f, +5.149185385e-02f, +5.918144419e-02f, +6.136654709e-02f, +5.774592303e-02f, +4.881800243e-02f, +3.579575888e-02f, +2.040177234e-02f, +4.583625394e-03f, -9.795662033e-03f, -2.123463423e-02f, -2.878948033e-02f, -3.215951212e-02f, -3.165600997e-02f, -2.807161254e-02f, -2.248518352e-02f, -1.604597628e-02f, -9.779791249e-03f, -4.449914944e-03f, -4.900675011e-04f, +1.990531954e-03f, +3.144543139e-03f, +3.290154659e-03f, +2.807388676e-03f, +2.049733151e-03f, +1.285682239e-03f, +6.749404290e-04f, + -1.071657227e-05f, -1.743555650e-05f, -2.311730902e-05f, -2.472788286e-05f, -1.880348977e-05f, -2.339904673e-06f, +2.612342670e-05f, +6.548598165e-05f, +1.114457889e-04f, +1.565155274e-04f, +1.908574537e-04f, +2.039140682e-04f, +1.865978710e-04f, +1.336160942e-04f, +4.539939795e-05f, -7.088326246e-05f, -2.015961528e-04f, -3.283117689e-04f, -4.306937594e-04f, -4.900949110e-04f, -4.931702526e-04f, -4.347458496e-04f, -3.192961356e-04f, -1.606494561e-04f, +2.009320106e-05f, +1.980598351e-04f, +3.488539443e-04f, +4.527068295e-04f, +4.977173448e-04f, +4.815609030e-04f, +4.113815210e-04f, +3.019663296e-04f, +1.726521230e-04f, +4.365011838e-05f, -6.745020468e-05f, -1.483324988e-04f, -1.933271055e-04f, -2.033809683e-04f, -1.848040261e-04f, -1.472071174e-04f, -1.011634523e-04f, -5.611052704e-05f, -1.888071007e-05f, +6.949330726e-06f, +2.091192815e-05f, +2.489925524e-05f, +2.210540102e-05f, +1.596548744e-05f, + /* 1,29 (48) */ + -2.871973341e-04f, -5.014482555e-04f, -7.463715178e-04f, -9.857531390e-04f, -1.164651507e-03f, -1.209493888e-03f, -1.030386462e-03f, -5.258074696e-04f, +4.104074455e-04f, +1.880162996e-03f, +3.970935397e-03f, +6.745217813e-03f, +1.023061454e-02f, +1.441166908e-02f, +1.922444399e-02f, +2.455468347e-02f, +3.024009546e-02f, +3.607691536e-02f, +4.183049510e-02f, +4.724924434e-02f, +5.208088171e-02f, +5.608967552e-02f, +5.907320056e-02f, +6.087713051e-02f, +6.140672936e-02f, +6.063398788e-02f, +5.859974496e-02f, +5.541059633e-02f, +5.123087815e-02f, +4.627046613e-02f, +4.076950660e-02f, +3.498145442e-02f, +2.915590817e-02f, +2.352269837e-02f, +1.827850552e-02f, +1.357698668e-02f, +9.523007964e-03f, +6.171159300e-03f, +3.528314653e-03f, +1.559638665e-03f, +1.971649035e-04f, -6.500939972e-04f, -1.085588658e-03f, -1.215240571e-03f, -1.138857640e-03f, -9.435586937e-04f, -6.995286060e-04f, -4.581433717e-04f, + +5.950853705e-06f, +7.300532620e-06f, +7.805393139e-06f, +6.899921698e-06f, +3.989640402e-06f, -1.484908233e-06f, -9.975176579e-06f, -2.175006713e-05f, -3.682849015e-05f, -5.492795017e-05f, -7.543726457e-05f, -9.741961088e-05f, -1.196492544e-04f, -1.406818019e-04f, -1.589540398e-04f, -1.729057912e-04f, -1.811132097e-04f, -1.824209217e-04f, -1.760597234e-04f, -1.617372905e-04f, -1.396915333e-04f, -1.106996535e-04f, -7.604025715e-05f, -3.741061019e-05f, +3.194260694e-06f, +4.362992850e-05f, +8.176479580e-05f, +1.156411315e-04f, +1.436199778e-04f, +1.644967024e-04f, +1.775770628e-04f, +1.827077745e-04f, +1.802602417e-04f, +1.710708076e-04f, +1.563450745e-04f, +1.375370856e-04f, +1.162161284e-04f, +9.393443463e-05f, +7.210813297e-05f, +5.192162170e-05f, +3.426239038e-05f, +1.968963904e-05f, +8.436272395e-06f, +4.404208828e-07f, -4.600073246e-06f, -7.158509723e-06f, -7.804479049e-06f, -7.131836001e-06f, + +3.445894731e-04f, +7.911274100e-04f, +1.443555836e-03f, +2.223710317e-03f, +2.947730766e-03f, +3.325304048e-03f, +2.990962703e-03f, +1.569837089e-03f, -1.229051054e-03f, -5.508549708e-03f, -1.109213363e-02f, -1.747205771e-02f, -2.381926452e-02f, -2.906677971e-02f, -3.206282211e-02f, -3.177271645e-02f, -2.749403872e-02f, -1.904122581e-02f, -6.856918523e-03f, +7.981681917e-03f, +2.387385319e-02f, +3.891243130e-02f, +5.117255772e-02f, +5.902079474e-02f, +6.138664029e-02f, +5.794398287e-02f, +4.916685638e-02f, +3.624846571e-02f, +2.089948969e-02f, +5.065186297e-03f, -9.384280512e-03f, -2.093266790e-02f, -2.861682821e-02f, -3.211586200e-02f, -3.172346017e-02f, -2.821994504e-02f, -2.267851063e-02f, -1.624935725e-02f, -9.964595275e-03f, -4.597122062e-03f, -5.912309534e-04f, +1.934421427e-03f, +3.125662429e-03f, +3.297103990e-03f, +2.828300604e-03f, +2.074632406e-03f, +1.307787641e-03f, +6.909059164e-04f, + -1.051543136e-05f, -1.722770722e-05f, -2.298372996e-05f, -2.477368699e-05f, -1.913531668e-05f, -3.034053170e-06f, +2.505542575e-05f, +6.412507928e-05f, +1.099767330e-04f, +1.552143899e-04f, +1.900528304e-04f, +2.039258891e-04f, +1.876643381e-04f, +1.358241603e-04f, +4.863587167e-05f, -6.694533766e-05f, -1.974676028e-04f, -3.246148259e-04f, -4.280579225e-04f, -4.890403118e-04f, -4.940021681e-04f, -4.374832914e-04f, -3.236513949e-04f, -1.660652804e-04f, +1.435425164e-05f, +1.927905726e-04f, +3.447667631e-04f, +4.503138436e-04f, +4.972498479e-04f, +4.829429533e-04f, +4.142608086e-04f, +3.057935123e-04f, +1.767902467e-04f, +4.749064148e-05f, -6.438795966e-05f, -1.463363255e-04f, -1.924704065e-04f, -2.035438583e-04f, -1.857273426e-04f, -1.485639094e-04f, -1.026308797e-04f, -5.742746693e-05f, -1.988171347e-05f, +6.326395649e-06f, +2.064093598e-05f, +2.489555680e-05f, +2.226042371e-05f, +1.617727343e-05f, + /* 1,30 (48) */ + -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f, + +5.900645350e-06f, +7.268365081e-06f, +7.807887439e-06f, +6.955487723e-06f, +4.116688316e-06f, -1.270137912e-06f, -9.660960103e-06f, -2.133146638e-05f, -3.630926307e-05f, -5.432183054e-05f, -7.476838129e-05f, -9.672189189e-05f, -1.189647611e-04f, -1.400580555e-04f, -1.584405205e-04f, -1.725498952e-04f, -1.809560329e-04f, -1.824932796e-04f, -1.763788209e-04f, -1.623044060e-04f, -1.404909963e-04f, -1.116992702e-04f, -7.719319639e-05f, -3.865861306e-05f, +1.916622938e-06f, +4.239033203e-05f, +8.062803289e-05f, +1.146642473e-04f, +1.428481242e-04f, +1.639600817e-04f, +1.772892198e-04f, +1.826653555e-04f, +1.804441899e-04f, +1.714488231e-04f, +1.568750475e-04f, +1.381711284e-04f, +1.169047926e-04f, +9.463070442e-05f, +7.277083693e-05f, +5.251798750e-05f, +3.476957772e-05f, +2.009520355e-05f, +8.737628506e-06f, +6.434694612e-07f, -4.482915520e-06f, -7.110604110e-06f, -7.807302866e-06f, -7.167114757e-06f, + +3.340740417e-04f, +7.738997028e-04f, +1.420572106e-03f, +2.198936630e-03f, +2.928595450e-03f, +3.322269995e-03f, +3.016018128e-03f, +1.633962169e-03f, -1.119074321e-03f, -5.353335318e-03f, -1.090208080e-02f, -1.726813182e-02f, -2.363160019e-02f, -2.893095555e-02f, -3.201418624e-02f, -3.183966178e-02f, -2.769150633e-02f, -1.936584064e-02f, -7.284976446e-03f, +7.492641605e-03f, +2.337985102e-02f, +3.847494801e-02f, +5.084890632e-02f, +5.885472945e-02f, +6.140099454e-02f, +5.813677344e-02f, +4.951162314e-02f, +3.669877956e-02f, +2.139673953e-02f, +5.548129250e-03f, -8.970019704e-03f, -2.062687439e-02f, -2.844003796e-02f, -3.206837136e-02f, -3.178784813e-02f, -2.836628136e-02f, -2.287098103e-02f, -1.645290111e-02f, -1.015032262e-02f, -4.745685971e-03f, -6.938618331e-04f, +1.876993960e-03f, +3.105780715e-03f, +3.303430386e-03f, +2.848941540e-03f, +2.099527963e-03f, +1.330048064e-03f, +7.070831898e-04f, + -1.031543611e-05f, -1.701900789e-05f, -2.284631865e-05f, -2.481220449e-05f, -1.945680269e-05f, -3.716284432e-06f, +2.399841424e-05f, +6.277106912e-05f, +1.085072808e-04f, +1.539031669e-04f, +1.892276213e-04f, +2.039079747e-04f, +1.886955890e-04f, +1.379971457e-04f, +5.184407396e-05f, -6.302241295e-05f, -1.933359288e-04f, -3.208946069e-04f, -4.253801896e-04f, -4.879303311e-04f, -4.947732413e-04f, -4.401639799e-04f, -3.279633107e-04f, -1.714584810e-04f, +8.613337121e-06f, +1.874950937e-04f, +3.406335909e-04f, +4.478628235e-04f, +4.967217519e-04f, +4.842712606e-04f, +4.171008580e-04f, +3.096005616e-04f, +1.809282955e-04f, +5.134861502e-05f, -6.129593148e-05f, -1.443046239e-04f, -1.915790189e-04f, -2.036782580e-04f, -1.866316842e-04f, -1.499122321e-04f, -1.040992379e-04f, -5.875215808e-05f, -2.089404958e-05f, +5.691648011e-06f, +2.036001099e-05f, +2.488511074e-05f, +2.241212896e-05f, +1.638859383e-05f, + /* 1,31 (48) */ + -2.753458351e-04f, -4.868793578e-04f, -7.307582372e-04f, -9.718977296e-04f, -1.156545178e-03f, -1.212248935e-03f, -1.050022599e-03f, -5.688890031e-04f, +3.372696922e-04f, +1.770913215e-03f, +3.820729751e-03f, +6.551076310e-03f, +9.992000524e-03f, +1.413092922e-02f, +1.890704943e-02f, +2.420922778e-02f, +2.987802621e-02f, +3.571200116e-02f, +4.147805655e-02f, +4.692520265e-02f, +5.180069918e-02f, +5.586727659e-02f, +5.891996710e-02f, +6.080106129e-02f, +6.141184024e-02f, +6.072000814e-02f, +5.876213779e-02f, +5.564090171e-02f, +5.151734626e-02f, +4.659892291e-02f, +4.112437288e-02f, +3.534682755e-02f, +2.951661261e-02f, +2.386521801e-02f, +1.859172564e-02f, +1.385269489e-02f, +9.756128885e-03f, +6.359724439e-03f, +3.673193623e-03f, +1.664078274e-03f, +2.661968716e-04f, -6.103091546e-04f, -1.068414757e-03f, -1.214156681e-03f, -1.147940629e-03f, -9.578278075e-04f, -7.151403879e-04f, -4.724423225e-04f, + +5.850110091e-06f, +7.235395433e-06f, +7.809025104e-06f, +7.009111338e-06f, +4.241239355e-06f, -1.058315911e-06f, -9.349966785e-06f, -2.091612006e-05f, -3.579302665e-05f, -5.371811474e-05f, -7.410099365e-05f, -9.602447380e-05f, -1.182791553e-04f, -1.394316620e-04f, -1.579228174e-04f, -1.721884081e-04f, -1.807921168e-04f, -1.825581262e-04f, -1.766901015e-04f, -1.628639195e-04f, -1.412836031e-04f, -1.126932717e-04f, -7.834217668e-05f, -3.990461040e-05f, +6.388853996e-07f, +4.114853805e-05f, +7.948714106e-05f, +1.136816124e-04f, +1.420693226e-04f, +1.634158161e-04f, +1.769935670e-04f, +1.826154788e-04f, +1.806214921e-04f, +1.718213704e-04f, +1.574009775e-04f, +1.388026701e-04f, +1.175924836e-04f, +9.532739769e-05f, +7.343513463e-05f, +5.311682607e-05f, +3.527979396e-05f, +2.050403146e-05f, +9.042191405e-06f, +8.494304210e-07f, -4.363309672e-06f, -7.060810728e-06f, -7.808824226e-06f, -7.201639933e-06f, + +3.237586056e-04f, +7.568806949e-04f, +1.397725787e-03f, +2.174124425e-03f, +2.909138647e-03f, +3.318553711e-03f, +3.040016543e-03f, +1.696733238e-03f, -1.010567040e-03f, -5.199432151e-03f, -1.071285317e-02f, -1.706422384e-02f, -2.344290460e-02f, -2.879295841e-02f, -3.196234216e-02f, -3.190268420e-02f, -2.788484225e-02f, -1.968673524e-02f, -7.710356635e-03f, +7.004711274e-03f, +2.288507778e-02f, +3.803478403e-02f, +5.052094301e-02f, +5.868327097e-02f, +6.140960788e-02f, +5.832426853e-02f, +4.985225673e-02f, +3.714664238e-02f, +2.189346129e-02f, +6.032400511e-03f, -8.552918846e-03f, -2.031727383e-02f, -2.825910966e-02f, -3.201702274e-02f, -3.184914406e-02f, -2.851058599e-02f, -2.306256005e-02f, -1.665657936e-02f, -1.033695430e-02f, -4.895598203e-03f, -7.979610710e-04f, +1.818241802e-03f, +3.084886666e-03f, +3.309122034e-03f, +2.869301551e-03f, +2.124413074e-03f, +1.352460193e-03f, +7.234717837e-04f, + -1.011663066e-05f, -1.680953745e-05f, -2.270517913e-05f, -2.484354255e-05f, -1.976802667e-05f, -4.386614560e-06f, +2.295246704e-05f, +6.142412938e-05f, +1.070377027e-04f, +1.525821837e-04f, +1.883821463e-04f, +2.038605671e-04f, +1.896917185e-04f, +1.401349478e-04f, +5.502368951e-05f, -5.911498836e-05f, -1.892017453e-04f, -3.171517381e-04f, -4.226610826e-04f, -4.867652811e-04f, -4.954835019e-04f, -4.427876402e-04f, -3.322313388e-04f, -1.768283313e-04f, +2.871243403e-06f, +1.821741084e-04f, +3.364549421e-04f, +4.453540068e-04f, +4.961329892e-04f, +4.855454817e-04f, +4.199011281e-04f, +3.133868468e-04f, +1.850656642e-04f, +5.522355901e-05f, -5.817440947e-05f, -1.422374703e-04f, -1.906528266e-04f, -2.037839118e-04f, -1.875167265e-04f, -1.512517643e-04f, -1.055682666e-04f, -6.008443510e-05f, -2.191765594e-05f, +5.045062098e-06f, +2.006906889e-05f, +2.486780869e-05f, +2.256041491e-05f, +1.659937380e-05f, + /* 2, 0 (48) */ + +2.604271951e-04f, +6.520713960e-04f, +1.184392264e-03f, +1.737066681e-03f, +2.100859845e-03f, +2.003596444e-03f, +1.168352244e-03f, -6.020526720e-04f, -3.329654867e-03f, -6.777842271e-03f, -1.040531144e-02f, -1.337949151e-02f, -1.466132590e-02f, -1.315819186e-02f, -7.924759808e-03f, +1.623190098e-03f, +1.552555605e-02f, +3.316834873e-02f, +5.328028472e-02f, +7.404900985e-02f, +9.334657971e-02f, +1.090303366e-01f, +1.192675993e-01f, +1.228249582e-01f, +1.192675993e-01f, +1.090303366e-01f, +9.334657971e-02f, +7.404900985e-02f, +5.328028472e-02f, +3.316834873e-02f, +1.552555605e-02f, +1.623190098e-03f, -7.924759808e-03f, -1.315819186e-02f, -1.466132590e-02f, -1.337949151e-02f, -1.040531144e-02f, -6.777842271e-03f, -3.329654867e-03f, -6.020526720e-04f, +1.168352244e-03f, +2.003596444e-03f, +2.100859845e-03f, +1.737066681e-03f, +1.184392264e-03f, +6.520713960e-04f, +2.604271951e-04f, +4.414624996e-05f, + -9.397733863e-06f, -1.475159068e-05f, -1.780699796e-05f, -1.570575921e-05f, -5.894492519e-06f, +1.287546454e-05f, +3.958040364e-05f, +7.028847262e-05f, +9.813493822e-05f, +1.140815919e-04f, +1.084565141e-04f, +7.306034295e-05f, +3.434800198e-06f, -9.922656802e-05f, -2.270449294e-04f, -3.656871562e-04f, -4.960023257e-04f, -5.968946951e-04f, -6.489612978e-04f, -6.382023119e-04f, -5.590356192e-04f, -4.159420831e-04f, -2.233226464e-04f, -3.510128802e-06f, +2.167329417e-04f, +4.105735155e-04f, +5.554809118e-04f, +6.367671050e-04f, +6.496292006e-04f, +5.993511841e-04f, +4.997098643e-04f, +3.699938620e-04f, +2.313033964e-04f, +1.028991279e-04f, -7.032857366e-07f, -7.141256319e-05f, -1.078360932e-04f, -1.142811527e-04f, -9.886406891e-05f, -7.124467603e-05f, -4.050800932e-05f, -1.360250026e-05f, +5.444930471e-06f, +1.552678732e-05f, +1.783443122e-05f, +1.489615403e-05f, +9.574142015e-06f, +4.266520574e-06f, + +7.781537535e-05f, -5.172646125e-04f, -1.673334699e-03f, -3.203343269e-03f, -4.525223175e-03f, -4.733635501e-03f, -2.892950492e-03f, +1.502882723e-03f, +8.068686861e-03f, +1.529267543e-02f, +2.072324747e-02f, +2.163579289e-02f, +1.603304991e-02f, +3.643522741e-03f, -1.349956937e-02f, -3.123170394e-02f, -4.427068528e-02f, -4.783283965e-02f, -3.933589198e-02f, -1.956599624e-02f, +7.183458326e-03f, +3.415533317e-02f, +5.408068209e-02f, +6.141247912e-02f, +5.408068209e-02f, +3.415533317e-02f, +7.183458326e-03f, -1.956599624e-02f, -3.933589198e-02f, -4.783283965e-02f, -4.427068528e-02f, -3.123170394e-02f, -1.349956937e-02f, +3.643522741e-03f, +1.603304991e-02f, +2.163579289e-02f, +2.072324747e-02f, +1.529267543e-02f, +8.068686861e-03f, +1.502882723e-03f, -2.892950492e-03f, -4.733635501e-03f, -4.525223175e-03f, -3.203343269e-03f, -1.673334699e-03f, -5.172646125e-04f, +7.781537535e-05f, +2.181178524e-04f, + +1.021445183e-05f, +2.711764488e-05f, +4.373606909e-05f, +4.870636224e-05f, +2.965876477e-05f, -2.020862008e-05f, -9.543065144e-05f, -1.750445952e-04f, -2.258666913e-04f, -2.129807855e-04f, -1.147623742e-04f, +6.321493412e-05f, +2.820361204e-04f, +4.757918698e-04f, +5.706234531e-04f, +5.111620793e-04f, +2.849053907e-04f, -6.564268988e-05f, -4.497141734e-04f, -7.537672688e-04f, -8.781008671e-04f, -7.718669222e-04f, -4.533676142e-04f, -7.335878262e-06f, +4.407740003e-04f, +7.648400958e-04f, +8.783629926e-04f, +7.607940572e-04f, +4.610216661e-04f, +7.770478446e-05f, -2.754656586e-04f, -5.065395392e-04f, -5.712966145e-04f, -4.806170152e-04f, -2.888598211e-04f, -6.972252126e-05f, +1.102912474e-04f, +2.112555732e-04f, +2.265914423e-04f, +1.772601301e-04f, +9.800087468e-05f, +2.224447147e-05f, -2.857587745e-05f, -4.853198241e-05f, -4.413533489e-05f, -2.769009656e-05f, -1.066792104e-05f, +3.030211128e-07f, + /* 2, 1 (48) */ + +2.510294612e-04f, +6.373198053e-04f, +1.166585266e-03f, +1.721360922e-03f, +2.094965353e-03f, +2.016471909e-03f, +1.207932647e-03f, -5.317641994e-04f, -3.231519929e-03f, -6.663760679e-03f, -1.029685493e-02f, -1.330643117e-02f, -1.465789110e-02f, -1.325741842e-02f, -8.151804737e-03f, +1.257502941e-03f, +1.502955372e-02f, +3.257145404e-02f, +5.263132342e-02f, +7.341080754e-02f, +9.278754409e-02f, +1.086143945e-01f, +1.190442767e-01f, +1.228214481e-01f, +1.194843323e-01f, +1.094409101e-01f, +9.390206062e-02f, +7.468577696e-02f, +5.392991392e-02f, +3.376769992e-02f, +1.602526591e-02f, +1.993183960e-03f, -7.693456411e-03f, -1.305529273e-02f, -1.466202918e-02f, -1.345090407e-02f, -1.051314753e-02f, -6.892123423e-03f, -3.428518936e-03f, -6.732973481e-04f, +1.127844235e-03f, +1.989993944e-03f, +2.106304776e-03f, +1.752593469e-03f, +1.202226696e-03f, +6.669675500e-04f, +2.700013371e-04f, +4.841277053e-05f, + -9.221479075e-06f, -1.460482609e-05f, -1.777450663e-05f, -1.587709547e-05f, -6.335117472e-06f, +1.215642107e-05f, +3.865695453e-05f, +6.932966021e-05f, +9.739424462e-05f, +1.138608472e-04f, +1.090475536e-04f, +7.467422635e-05f, +6.133495444e-06f, -9.557911602e-05f, -2.227974382e-04f, -3.613724853e-04f, -4.922659171e-04f, -5.943900778e-04f, -6.482313423e-04f, -6.395698761e-04f, -5.625270708e-04f, -4.212616238e-04f, -2.298854257e-04f, -1.052996006e-05f, +2.101170941e-04f, +4.051565071e-04f, +5.518632500e-04f, +6.352642376e-04f, +6.502347371e-04f, +6.017590106e-04f, +5.033878865e-04f, +3.742919618e-04f, +2.355723082e-04f, +1.065964465e-04f, +2.060909781e-06f, -6.973082794e-05f, -1.071860828e-04f, -1.144592400e-04f, -9.958133640e-05f, -7.219801774e-05f, -4.143960274e-05f, -1.433745413e-05f, +4.986422344e-06f, +1.534011438e-05f, +1.785671677e-05f, +1.503843121e-05f, +9.750642811e-06f, +4.414790764e-06f, + +8.802982718e-05f, -4.901469677e-04f, -1.629598630e-03f, -3.154636907e-03f, -4.495564410e-03f, -4.753844121e-03f, -2.988381144e-03f, +1.327838128e-03f, +7.842820170e-03f, +1.507969465e-02f, +2.060848510e-02f, +2.169900783e-02f, +1.631508603e-02f, +4.119314611e-03f, -1.292894591e-02f, -3.072054186e-02f, -4.398577989e-02f, -4.789848234e-02f, -3.978560615e-02f, -2.031976351e-02f, +6.305357459e-03f, +3.338346624e-02f, +5.362731448e-02f, +6.140514325e-02f, +5.452145609e-02f, +3.492017326e-02f, +8.061821318e-03f, -1.880520218e-02f, -3.887487031e-02f, -4.775513486e-02f, -4.454615094e-02f, -3.173824348e-02f, -1.407086598e-02f, +3.162905726e-03f, +1.574419009e-02f, +2.156607037e-02f, +2.083353872e-02f, +1.550393101e-02f, +8.295278303e-03f, +1.680142853e-03f, -2.794949618e-03f, -4.711391030e-03f, -4.553799053e-03f, -3.251875252e-03f, -1.717470034e-03f, -5.449547091e-04f, +6.714745431e-05f, +2.184208735e-04f, + +9.767473893e-06f, +2.654535421e-05f, +4.332554241e-05f, +4.885683791e-05f, +3.071051883e-05f, -1.819886387e-05f, -9.286579528e-05f, -1.728011389e-04f, -2.250786348e-04f, -2.146203664e-04f, -1.191527570e-04f, +5.674957623e-05f, +2.751886761e-04f, +4.708685948e-04f, +5.697959909e-04f, +5.156170440e-04f, +2.942196033e-04f, -5.361531476e-05f, -4.383273960e-04f, -7.465608329e-04f, -8.776076910e-04f, -7.786807920e-04f, -4.658332083e-04f, -2.200554834e-05f, +4.280558673e-04f, +7.576020354e-04f, +8.783935306e-04f, +7.676386936e-04f, +4.722463287e-04f, +8.979821280e-05f, -2.659025952e-04f, -5.017498821e-04f, -5.718143049e-04f, -4.853418550e-04f, -2.956574536e-04f, -7.627062286e-05f, +1.057400680e-04f, +2.094444104e-04f, +2.272519091e-04f, +1.794465983e-04f, +1.005755783e-04f, +2.430601068e-05f, -2.746179810e-05f, -4.833335192e-05f, -4.452293401e-05f, -2.826241838e-05f, -1.112777301e-05f, +7.525040422e-08f, + /* 2, 2 (48) */ + +2.418079821e-04f, +6.227149792e-04f, +1.148810760e-03f, +1.705483827e-03f, +2.088630235e-03f, +2.028628330e-03f, +1.246589602e-03f, -4.624345392e-04f, -3.134125684e-03f, -6.549899832e-03f, -1.018780737e-02f, -1.323175694e-02f, -1.465175760e-02f, -1.335299754e-02f, -8.374602175e-03f, +8.961304561e-04f, +1.453728781e-02f, +3.197706396e-02f, +5.198309208e-02f, +7.277123767e-02f, +9.222501702e-02f, +1.081931329e-01f, +1.188143913e-01f, +1.228109182e-01f, +1.196944494e-01f, +1.098460666e-01f, +9.445392387e-02f, +7.532104120e-02f, +5.458014866e-02f, +3.436945893e-02f, +1.652865380e-02f, +2.367475921e-03f, -7.457884103e-03f, -1.294869628e-02f, -1.465996827e-02f, -1.352063490e-02f, -1.062033362e-02f, -7.006582663e-03f, -3.528100272e-03f, -7.454953658e-04f, +1.086404632e-03f, +1.975656490e-03f, +2.111291198e-03f, +1.767933583e-03f, +1.220083412e-03f, +6.820059812e-04f, +2.797519799e-04f, +5.282756130e-05f, + -9.045437432e-06f, -1.445594466e-05f, -1.773704708e-05f, -1.604086273e-05f, -6.766816532e-06f, +1.144544108e-05f, +3.773782790e-05f, +6.836848933e-05f, +9.664228773e-05f, +1.136192096e-04f, +1.096094236e-04f, +7.625427805e-05f, +8.799239900e-06f, -9.195711480e-05f, -2.185614491e-04f, -3.570504884e-04f, -4.885012868e-04f, -5.918378714e-04f, -6.474396557e-04f, -6.408698258e-04f, -5.659549751e-04f, -4.265315589e-04f, -2.364205011e-04f, -1.754851234e-05f, +2.034758906e-04f, +3.996916520e-04f, +5.481829449e-04f, +6.336937015e-04f, +6.507776023e-04f, +6.041176459e-04f, +5.070357475e-04f, +3.785808125e-04f, +2.398511288e-04f, +1.103181681e-04f, +4.857641601e-06f, -6.801508365e-05f, -1.065062782e-04f, -1.146155658e-04f, -1.002864397e-04f, -7.314824287e-05f, -4.237501215e-05f, -1.508024918e-05f, +4.518961403e-06f, +1.514567628e-05f, +1.787376529e-05f, +1.517833682e-05f, +9.927174596e-06f, +4.564577659e-06f, + +9.779730107e-05f, -4.636016135e-04f, -1.586273087e-03f, -3.105780069e-03f, -4.464853891e-03f, -4.772042985e-03f, -3.081246939e-03f, +1.155036989e-03f, +7.617741535e-03f, +1.486507428e-02f, +2.048933234e-02f, +2.175575740e-02f, +1.659027470e-02f, +4.590183206e-03f, -1.235914992e-02f, -3.020492482e-02f, -4.369156029e-02f, -4.795209765e-02f, -4.022393355e-02f, -2.106632434e-02f, +5.427749768e-03f, +3.260478545e-02f, +5.316148127e-02f, +6.138313770e-02f, +5.494951196e-02f, +3.567777530e-02f, +8.940214849e-03f, -1.803756349e-02f, -3.840262399e-02f, -4.766533665e-02f, -4.481205354e-02f, -3.223999336e-02f, -1.464268029e-02f, +2.677563871e-03f, +1.544853263e-02f, +2.148979975e-02f, +2.093927879e-02f, +1.571337542e-02f, +8.522530212e-03f, +1.859589451e-03f, -2.694374039e-03f, -4.687085019e-03f, -4.581260851e-03f, -3.300208604e-03f, -1.761992968e-03f, -5.732171275e-04f, +5.601968130e-05f, +2.184961239e-04f, + +9.327090145e-06f, +2.597351020e-05f, +4.290415923e-05f, +4.898376114e-05f, +3.173121068e-05f, -1.621559433e-05f, -9.030718001e-05f, -1.705309043e-04f, -2.242282643e-04f, -2.161746624e-04f, -1.234617384e-04f, +5.032813447e-05f, +2.683198039e-04f, +4.658493838e-04f, +5.688154408e-04f, +5.199040306e-04f, +3.034061574e-04f, -4.162602116e-05f, -4.268648926e-04f, -7.391773030e-04f, -8.768840711e-04f, -7.852800500e-04f, -4.781673233e-04f, -3.666895974e-05f, +4.152167559e-04f, +7.501545301e-04f, +8.781920142e-04f, +7.742987235e-04f, +4.833846306e-04f, +1.019195666e-04f, -2.562184377e-04f, -4.967936220e-04f, -5.721753980e-04f, -4.899642325e-04f, -3.024266850e-04f, -8.285749660e-05f, +1.011095612e-04f, +2.075470058e-04f, +2.278471264e-04f, +1.816028521e-04f, +1.031538630e-04f, +2.639281442e-05f, -2.631648037e-05f, -4.811012979e-05f, -4.489845939e-05f, -2.883431423e-05f, -1.159389361e-05f, -1.598987474e-07f, + /* 2, 3 (48) */ + +2.327625447e-04f, +6.082590345e-04f, +1.131073713e-03f, +1.689442964e-03f, +2.081863419e-03f, +2.040073771e-03f, +1.284327430e-03f, -3.940660499e-04f, -3.037483396e-03f, -6.436280622e-03f, -1.007819795e-02f, -1.315550266e-02f, -1.464295836e-02f, -1.344495466e-02f, -8.593163625e-03f, +5.390799677e-04f, +1.404878652e-02f, +3.138522609e-02f, +5.133565242e-02f, +7.213036784e-02f, +9.165906204e-02f, +1.077666013e-01f, +1.185779707e-01f, +1.227933696e-01f, +1.198979252e-01f, +1.102457583e-01f, +9.500210682e-02f, +7.595473490e-02f, +5.523092626e-02f, +3.497357657e-02f, +1.703568955e-02f, +2.746056734e-03f, -7.218032974e-03f, -1.283837811e-02f, -1.465511063e-02f, -1.358864998e-02f, -1.072683989e-02f, -7.121198229e-03f, -3.628386712e-03f, -8.186436087e-04f, +1.044029620e-03f, +1.960576241e-03f, +2.115810160e-03f, +1.783079259e-03f, +1.237957178e-03f, +6.971843180e-04f, +2.896791545e-04f, +5.739213896e-05f, + -8.869667763e-06f, -1.430503026e-05f, -1.769470941e-05f, -1.619712886e-05f, -7.189603096e-06f, +1.074259293e-05f, +3.682318671e-05f, +6.740520824e-05f, +9.587936640e-05f, +1.133569712e-04f, +1.101423396e-04f, +7.780056820e-05f, +1.143190856e-05f, -8.836090079e-05f, -2.143374835e-04f, -3.527218023e-04f, -4.847090843e-04f, -5.892386203e-04f, -6.465865679e-04f, -6.421021986e-04f, -5.693190501e-04f, -4.317513181e-04f, -2.429270989e-04f, -2.456493322e-05f, +1.968101222e-04f, +3.941795518e-04f, +5.444403173e-04f, +6.320554984e-04f, +6.512574993e-04f, +6.064265671e-04f, +5.106528043e-04f, +3.828597697e-04f, +2.441393179e-04f, +1.140639309e-04f, +7.686758355e-06f, -6.626528240e-05f, -1.057964787e-04f, -1.147498435e-04f, -1.009790774e-04f, -7.409509441e-05f, -4.331406289e-05f, -1.583080551e-05f, +4.042543184e-06f, +1.494341021e-05f, +1.788548775e-05f, +1.531578494e-05f, +1.010367479e-05f, +4.715850413e-06f, + +1.071243912e-04f, -4.376281033e-04f, -1.543368928e-03f, -3.056796308e-03f, -4.433122681e-03f, -4.788258580e-03f, -3.171554119e-03f, +9.845060845e-04f, +7.393513271e-03f, +1.464889962e-02f, +2.036587060e-02f, +2.180608554e-02f, +1.685859451e-02f, +5.056032590e-03f, -1.179033448e-02f, -2.968502079e-02f, -4.338815413e-02f, -4.799372367e-02f, -4.065079844e-02f, -2.180550164e-02f, +4.550865697e-03f, +3.181950540e-02f, +5.268331394e-02f, +6.134646874e-02f, +5.536472871e-02f, +3.642792983e-02f, +9.818406863e-03f, -1.726326477e-02f, -3.791923935e-02f, -4.756341708e-02f, -4.506827197e-02f, -3.273678699e-02f, -1.521485568e-02f, +2.187599639e-03f, +1.514610595e-02f, +2.140694225e-02f, +2.104038835e-02f, +1.592092242e-02f, +8.750377339e-03f, +2.041192303e-03f, -2.591220176e-03f, -4.660692205e-03f, -4.607577331e-03f, -3.348318733e-03f, -1.806891427e-03f, -6.020514417e-04f, +4.442578769e-05f, +2.183362251e-04f, + +8.893397928e-06f, +2.540239313e-05f, +4.247232228e-05f, +4.908748870e-05f, +3.272092345e-05f, -1.425918711e-05f, -8.775566630e-05f, -1.682350316e-04f, -2.233165834e-04f, -2.176440466e-04f, -1.276886948e-04f, +4.395226739e-05f, +2.614318102e-04f, +4.607364475e-04f, +5.676830579e-04f, +5.240226921e-04f, +3.124629637e-04f, -2.967814651e-05f, -4.153302342e-04f, -7.316192808e-04f, -8.759306836e-04f, -7.916631086e-04f, -4.903665421e-04f, -5.132194230e-05f, +4.022602460e-04f, +7.424994357e-04f, +8.777580473e-04f, +7.807717433e-04f, +4.944330571e-04f, +1.140654159e-04f, -2.464154710e-04f, -4.916713289e-04f, -5.723788116e-04f, -4.944820104e-04f, -3.091651753e-04f, -8.948137306e-05f, +9.640048616e-05f, +2.055630957e-04f, +2.283761428e-04f, +1.837277423e-04f, +1.057348169e-04f, +2.850444351e-05f, -2.513989055e-05f, -4.786198073e-05f, -4.526150288e-05f, -2.940548286e-05f, -1.206616299e-05f, -4.024611317e-07f, + /* 2, 4 (48) */ + +2.238928769e-04f, +5.939540043e-04f, +1.113379003e-03f, +1.673245835e-03f, +2.074673816e-03f, +2.050816364e-03f, +1.321150617e-03f, -3.266608416e-04f, -2.941604030e-03f, -6.322923651e-03f, -9.968055609e-03f, -1.307770209e-02f, -1.463152645e-02f, -1.353331556e-02f, -8.807501108e-03f, +1.863581655e-04f, +1.356407744e-02f, +3.079598747e-02f, +5.068906585e-02f, +7.148826564e-02f, +9.108974299e-02f, +1.073348500e-01f, +1.183350437e-01f, +1.227688047e-01f, +1.200947354e-01f, +1.106399378e-01f, +9.554654713e-02f, +7.658679040e-02f, +5.588218376e-02f, +3.558000314e-02f, +1.754634235e-02f, +3.128916504e-03f, -6.973893657e-03f, -1.272431418e-02f, -1.464742387e-02f, -1.365491527e-02f, -1.083263637e-02f, -7.235948073e-03f, -3.729365789e-03f, -8.927387031e-04f, +1.000715557e-03f, +1.944745435e-03f, +2.119852703e-03f, +1.798022669e-03f, +1.255842665e-03f, +7.125001030e-04f, +2.997828293e-04f, +6.210798937e-05f, + -8.694227944e-06f, -1.415216617e-05f, -1.764758391e-05f, -1.634596290e-05f, -7.603492727e-06f, +1.004794213e-05f, +3.591319099e-05f, +6.644006295e-05f, +9.510577867e-05f, +1.130744256e-04f, +1.106465203e-04f, +7.931317237e-05f, +1.403138297e-05f, -8.479080402e-05f, -2.101260580e-04f, -3.483870618e-04f, -4.808899607e-04f, -5.865928741e-04f, -6.456724169e-04f, -6.432670421e-04f, -5.726190240e-04f, -4.369203387e-04f, -2.494044498e-04f, -3.157837062e-05f, +1.901205840e-04f, +3.886208156e-04f, +5.406356977e-04f, +6.303496402e-04f, +6.516741400e-04f, +6.086852563e-04f, +5.142384158e-04f, +3.871281868e-04f, +2.484363303e-04f, +1.178333665e-04f, +1.054810206e-05f, -6.448138195e-05f, -1.050564873e-04f, -1.148617881e-04f, -1.016589473e-04f, -7.503831325e-05f, -4.425657742e-05f, -1.658904033e-05f, +3.557165526e-06f, +1.473325471e-05f, +1.789179549e-05f, +1.545068921e-05f, +1.028007989e-05f, +4.868577177e-06f, + +1.160177891e-04f, -4.122257101e-04f, -1.500896606e-03f, -3.007708819e-03f, -4.400401757e-03f, -4.802517767e-03f, -3.259309785e-03f, +8.162710528e-04f, +7.170196687e-03f, +1.443125557e-02f, +2.023818191e-02f, +2.185003780e-02f, +1.712002632e-02f, +5.516769037e-03f, -1.122265142e-02f, -2.916099810e-02f, -4.307569117e-02f, -4.802340182e-02f, -4.106612868e-02f, -2.253712093e-02f, +3.674935013e-03f, +3.102784229e-02f, +5.219294740e-02f, +6.129514680e-02f, +5.576698896e-02f, +3.717042926e-02f, +1.069616491e-02f, -1.648249302e-02f, -3.742480630e-02f, -4.744935167e-02f, -4.531468744e-02f, -3.322845831e-02f, -1.578723449e-02f, +1.693117628e-03f, +1.483694077e-02f, +2.131746088e-02f, +2.113678884e-02f, +1.612648552e-02f, +8.978753482e-03f, +2.224920046e-03f, -2.485485359e-03f, -4.632187761e-03f, -4.632717222e-03f, -3.396180714e-03f, -1.852152930e-03f, -6.314569246e-04f, +3.235962470e-05f, +2.179337640e-04f, + +8.466489063e-06f, +2.483227790e-05f, +4.203043254e-05f, +4.916838214e-05f, +3.367975215e-05f, -1.233000201e-05f, -8.521210150e-05f, -1.659146577e-04f, -2.223446079e-04f, -2.190289187e-04f, -1.318330365e-04f, +3.762360484e-05f, +2.545269905e-04f, +4.555320128e-04f, +5.664001392e-04f, +5.279727365e-04f, +3.213879831e-04f, -1.777500250e-05f, -4.037270028e-04f, -7.238894151e-04f, -8.747482740e-04f, -7.978284485e-04f, -5.024274914e-04f, -6.596032919e-05f, +3.891899554e-04f, +7.346386734e-04f, +8.770913041e-04f, +7.870554015e-04f, +5.053881103e-04f, +1.262323105e-04f, -2.364960278e-04f, -4.863836286e-04f, -5.724235080e-04f, -4.988930718e-04f, -3.158705776e-04f, -9.614045620e-05f, +9.161363612e-05f, +2.034924447e-04f, +2.288380210e-04f, +1.858201188e-04f, +1.083175159e-04f, +3.064044285e-05f, -2.393200775e-05f, -4.758857544e-05f, -4.561165540e-05f, -2.997561797e-05f, -1.254445566e-05f, -6.524678118e-07f, + /* 2, 5 (48) */ + +2.151986490e-04f, +5.798018381e-04f, +1.095731419e-03f, +1.656899872e-03f, +2.067070323e-03f, +2.060864306e-03f, +1.357063808e-03f, -2.602207787e-04f, -2.846498251e-03f, -6.209849225e-03f, -9.857409088e-03f, -1.299838892e-02f, -1.461749507e-02f, -1.361810636e-02f, -9.017627166e-03f, -1.620288963e-04f, +1.308318748e-02f, +3.020939460e-02f, +5.004339344e-02f, +7.084499860e-02f, +9.051712397e-02f, +1.068979297e-01f, +1.180856392e-01f, +1.227372263e-01f, +1.202848560e-01f, +1.110285586e-01f, +9.608718283e-02f, +7.721714004e-02f, +5.653385790e-02f, +3.618868840e-02f, +1.806058077e-02f, +3.516044690e-03f, -6.725457326e-03f, -1.260648082e-02f, -1.463687577e-02f, -1.371939665e-02f, -1.093769286e-02f, -7.350809861e-03f, -3.831024737e-03f, -9.677770163e-04f, +9.564589793e-04f, +1.928156395e-03f, +2.123409868e-03f, +1.812755924e-03f, +1.273734461e-03f, +7.279507922e-04f, +3.100629092e-04f, +6.697656655e-05f, + -8.519174888e-06f, -1.399743514e-05f, -1.759576105e-05f, -1.648743506e-05f, -8.008503125e-06f, +9.361551378e-06f, +3.500799781e-05f, +6.547329714e-05f, +9.432182171e-05f, +1.127718672e-04f, +1.111221882e-04f, +8.079217154e-05f, +1.659755120e-05f, -8.124714801e-05f, -2.059276841e-04f, -3.440468994e-04f, -4.770445681e-04f, -5.839011872e-04f, -6.446975487e-04f, -6.443644139e-04f, -5.758546346e-04f, -4.420380662e-04f, -2.558517894e-04f, -3.858797298e-05f, +1.834080748e-04f, +3.830160601e-04f, +5.367694260e-04f, +6.285761486e-04f, +6.520272446e-04f, +6.108932017e-04f, +5.177919432e-04f, +3.913854162e-04f, +2.527416165e-04f, +1.216261004e-04f, +1.344150808e-05f, -6.266334577e-05f, -1.042861110e-04f, -1.149511162e-04f, -1.023257469e-04f, -7.597763824e-05f, -4.520237532e-05f, -1.735486795e-05f, +3.062828592e-06f, +1.451514970e-05f, +1.789260018e-05f, +1.558296283e-05f, +1.045632548e-05f, +5.022725094e-06f, + +1.244842782e-04f, -3.873934322e-04f, -1.458866173e-03f, -2.958540437e-03f, -4.366722005e-03f, -4.814847769e-03f, -3.344521887e-03f, +6.503563952e-04f, +6.947852079e-03f, +1.421222665e-02f, +2.010634887e-02f, +2.188766141e-02f, +1.737455331e-02f, +5.972301050e-03f, -1.065625128e-02f, -2.863302536e-02f, -4.275430318e-02f, -4.804117682e-02f, -4.146985568e-02f, -2.326101034e-02f, +2.800186739e-03f, +3.023001384e-02f, +5.169051991e-02f, +6.122918647e-02f, +5.615617891e-02f, +3.790506794e-02f, +1.157325621e-02f, -1.569543762e-02f, -3.691941819e-02f, -4.732311936e-02f, -4.555118347e-02f, -3.371484194e-02f, -1.635965800e-02f, +1.194224557e-03f, +1.452107019e-02f, +2.122132042e-02f, +2.122840247e-02f, +1.632997796e-02f, +9.207591503e-03f, +2.410740164e-03f, -2.377167844e-03f, -4.601547318e-03f, -4.656649229e-03f, -3.443769290e-03f, -1.897764586e-03f, -6.614325425e-04f, +1.981516904e-05f, +2.172812962e-04f, + +8.046449887e-06f, +2.426343398e-05f, +4.157888904e-05f, +4.922680759e-05f, +3.460780348e-05f, -1.042838306e-05f, -8.267731948e-05f, -1.635709156e-04f, -2.213133645e-04f, -2.203297043e-04f, -1.358942076e-04f, +3.134374756e-05f, +2.476076295e-04f, +4.502383222e-04f, +5.649680224e-04f, +5.317539276e-04f, +3.301792273e-04f, -5.919874154e-06f, -3.920587902e-04f, -7.159904009e-04f, -8.733376566e-04f, -8.037746187e-04f, -5.143468419e-04f, -8.057995834e-05f, +3.760095383e-04f, +7.265742297e-04f, +8.761915298e-04f, +7.931473988e-04f, +5.162463108e-04f, +1.384167806e-04f, -2.264624880e-04f, -4.809312030e-04f, -5.723084953e-04f, -5.031953214e-04f, -3.225405397e-04f, -1.028329237e-04f, +8.674983814e-05f, +2.013348463e-04f, +2.292318388e-04f, +1.878788303e-04f, +1.109010239e-04f, +3.280034141e-05f, -2.269282404e-05f, -4.728959078e-05f, -4.594850717e-05f, -3.054440828e-05f, -1.302864034e-05f, -9.099460397e-07f, + /* 2, 6 (48) */ + +2.066794741e-04f, +5.658044030e-04f, +1.078135658e-03f, +1.640412437e-03f, +2.059061820e-03f, +2.070225857e-03f, +1.392071805e-03f, -1.947474815e-04f, -2.752176430e-03f, -6.097077358e-03f, -9.746286900e-03f, -1.291759675e-02f, -1.460089752e-02f, -1.369935351e-02f, -9.223554850e-03f, -5.060757957e-04f, +1.260614291e-02f, +2.962549341e-02f, +4.939869589e-02f, +7.020063419e-02f, +8.994126933e-02f, +1.064558916e-01f, +1.178297874e-01f, +1.226986384e-01f, +1.204682640e-01f, +1.114115747e-01f, +9.662395226e-02f, +7.784571619e-02f, +5.718588514e-02f, +3.679958160e-02f, +1.857837271e-02f, +3.907430107e-03f, -6.472715710e-03f, -1.248485472e-02f, -1.462343426e-02f, -1.378205999e-02f, -1.104197897e-02f, -7.465760977e-03f, -3.933350484e-03f, -1.043754655e-03f, +9.112566040e-04f, +1.910801527e-03f, +2.126472697e-03f, +1.827271074e-03f, +1.291627061e-03f, +7.435337550e-04f, +3.205192346e-04f, +7.199929164e-05f, + -8.344564540e-06f, -1.384091928e-05f, -1.753933143e-05f, -1.662161663e-05f, -8.404654100e-06f, +8.683480529e-06f, +3.410776128e-05f, +6.450515218e-05f, +9.352779174e-05f, +1.124495919e-04f, +1.115695688e-04f, +8.223765199e-05f, +1.913030786e-05f, -7.773024984e-05f, -2.017428681e-04f, -3.397019451e-04f, -4.731735600e-04f, -5.811641189e-04f, -6.436623173e-04f, -6.453943812e-04f, -5.790256297e-04f, -4.471039543e-04f, -2.622683581e-04f, -4.559288931e-05f, +1.766733973e-04f, +3.773659094e-04f, +5.328418520e-04f, +6.267350554e-04f, +6.523165421e-04f, +6.130498973e-04f, +5.213127495e-04f, +3.956308083e-04f, +2.570546224e-04f, +1.254417521e-04f, +1.636680517e-05f, -6.081114311e-05f, -1.034851606e-04f, -1.150175463e-04f, -1.029791733e-04f, -7.691280619e-05f, -4.615127328e-05f, -1.812819973e-05f, +2.559534897e-06f, +1.428903649e-05f, +1.788781391e-05f, +1.571251857e-05f, +1.063234626e-05f, +5.178260298e-06f, + +1.325307281e-04f, -3.631299982e-04f, -1.417287284e-03f, -2.909313630e-03f, -4.332114202e-03f, -4.825276152e-03f, -3.427199206e-03f, +4.867854796e-04f, +6.726538715e-03f, +1.399189695e-02f, +1.997045467e-02f, +2.191900516e-02f, +1.762216094e-02f, +6.422539372e-03f, -1.009128326e-02f, -2.810127143e-02f, -4.242412396e-02f, -4.804709670e-02f, -4.186191447e-02f, -2.397700074e-02f, +1.926849082e-03f, +2.942623922e-02f, +5.117617307e-02f, +6.114860651e-02f, +5.653218845e-02f, +3.863164217e-02f, +1.244944774e-02f, -1.490229022e-02f, -3.640317188e-02f, -4.718470258e-02f, -4.577764596e-02f, -3.419577315e-02f, -1.693196650e-02f, +6.910292352e-04f, +1.419852965e-02f, +2.111848750e-02f, +2.131515231e-02f, +1.653131281e-02f, +9.436823341e-03f, +2.598618995e-03f, -2.266266820e-03f, -4.568746977e-03f, -4.679342053e-03f, -3.491058880e-03f, -1.943713093e-03f, -6.919769508e-04f, +6.786528698e-06f, +2.163713502e-04f, + +7.633361304e-06f, +2.369612532e-05f, +4.111808869e-05f, +4.926313550e-05f, +3.550519564e-05f, -8.554658539e-06f, -8.015214039e-05f, -1.612049344e-04f, -2.202238910e-04f, -2.215468551e-04f, -1.398716859e-04f, +2.511426691e-05f, +2.406760000e-04f, +4.448576322e-04f, +5.633880856e-04f, +5.353660836e-04f, +3.388347590e-04f, +5.883981206e-06f, -3.803291967e-04f, -7.079249784e-04f, -8.716997142e-04f, -8.095002376e-04f, -5.261213105e-04f, -9.517667379e-05f, +3.627226851e-04f, +7.183081557e-04f, +8.750585407e-04f, +7.990454901e-04f, +5.270041986e-04f, +1.506153382e-04f, -2.163172775e-04f, -4.753147901e-04f, -5.720328272e-04f, -5.073866860e-04f, -3.291727038e-04f, -1.095569277e-04f, +8.180995317e-05f, +1.990901227e-04f, +2.295566890e-04f, +1.899027257e-04f, +1.134843933e-04f, +3.498365227e-05f, -2.142234465e-05f, -4.696471002e-05f, -4.627164787e-05f, -3.111153756e-05f, -1.351858005e-05f, -1.174919173e-06f, + /* 2, 7 (48) */ + +1.983349096e-04f, +5.519634837e-04f, +1.060596327e-03f, +1.623790820e-03f, +2.050657166e-03f, +2.078909338e-03f, +1.426179567e-03f, -1.302423294e-04f, -2.658648638e-03f, -5.984627766e-03f, -9.634717331e-03f, -1.283535910e-02f, -1.458176721e-02f, -1.377708376e-02f, -9.425297718e-03f, -8.457777408e-04f, +1.213296935e-02f, +2.904432929e-02f, +4.875503357e-02f, +6.955523980e-02f, +8.936224371e-02f, +1.060087877e-01f, +1.175675191e-01f, +1.226530455e-01f, +1.206449374e-01f, +1.117889406e-01f, +9.715679411e-02f, +7.847245124e-02f, +5.783820168e-02f, +3.741263150e-02f, +1.909968546e-02f, +4.303060915e-03f, -6.215661087e-03f, -1.235941296e-02f, -1.460706746e-02f, -1.384287114e-02f, -1.114546413e-02f, -7.580778523e-03f, -4.036329657e-03f, -1.120667461e-03f, +8.651053307e-04f, +1.892673327e-03f, +2.129032232e-03f, +1.841560110e-03f, +1.309514875e-03f, +7.592462736e-04f, +3.311515809e-04f, +7.717755194e-05f, + -8.170451874e-06f, -1.368270014e-05f, -1.747838576e-05f, -1.674858004e-05f, -8.791967543e-06f, +8.013786642e-06f, +3.321263254e-05f, +6.353586705e-05f, +9.272398405e-05f, +1.121078964e-04f, +1.119888913e-04f, +8.364970531e-05f, +2.162955402e-05f, -7.424042003e-05f, -1.975721113e-04f, -3.353528265e-04f, -4.692775907e-04f, -5.783822332e-04f, -6.425670845e-04f, -6.463570208e-04f, -5.821317669e-04f, -4.521174649e-04f, -2.686534011e-04f, -5.259226943e-05f, +1.699173576e-04f, +3.716709945e-04f, +5.288533349e-04f, +6.248264024e-04f, +6.525417699e-04f, +6.151548427e-04f, +5.248002005e-04f, +3.998637126e-04f, +2.613747898e-04f, +1.292799344e-04f, +1.932381540e-05f, -5.892474902e-05f, -1.026534512e-04f, -1.150607986e-04f, -1.036189232e-04f, -7.784355196e-05f, -4.710308517e-05f, -1.890894410e-05f, +2.047289331e-06f, +1.405485785e-05f, +1.787734921e-05f, +1.583926880e-05f, +1.080807602e-05f, +5.335147914e-06f, + +1.401640894e-04f, -3.394338729e-04f, -1.376169196e-03f, -2.860050494e-03f, -4.296609006e-03f, -4.833830810e-03f, -3.507351347e-03f, +3.255805452e-04f, +6.506314824e-03f, +1.377035010e-02f, +1.983058298e-02f, +2.194411942e-02f, +1.786283694e-02f, +6.867397005e-03f, -9.527895176e-03f, -2.756590535e-02f, -4.208528920e-02f, -4.804121272e-02f, -4.224224367e-02f, -2.468492572e-02f, +1.055149368e-03f, +2.861673899e-02f, +5.065005176e-02f, +6.105342983e-02f, +5.689491114e-02f, +3.934995032e-02f, +1.332450628e-02f, -1.410324473e-02f, -3.587616768e-02f, -4.703408724e-02f, -4.599396324e-02f, -3.467108794e-02f, -1.750399933e-02f, +1.836425491e-04f, +1.386935695e-02f, +2.100893057e-02f, +2.139696226e-02f, +1.673040293e-02f, +9.666380030e-03f, +2.788521720e-03f, -2.152782426e-03f, -4.533763325e-03f, -4.700764398e-03f, -3.538023590e-03f, -1.989984741e-03f, -7.230884884e-04f, -6.732051356e-06f, +2.151964310e-04f, + +7.227298826e-06f, +2.313061035e-05f, +4.064842614e-05f, +4.927774042e-05f, +3.637205811e-05f, -6.709141053e-06f, -7.763737051e-05f, -1.588178385e-04f, -2.190772355e-04f, -2.226808477e-04f, -1.437649828e-04f, +1.893670441e-05f, +2.337343623e-04f, +4.393922133e-04f, +5.616617465e-04f, +5.388090779e-04f, +3.473526926e-04f, +1.763333493e-05f, -3.685418302e-04f, -6.996959320e-04f, -8.698353975e-04f, -8.150039925e-04f, -5.377476602e-04f, -1.097463270e-04f, +3.493331199e-04f, +7.098425667e-04f, +8.736922246e-04f, +8.047474842e-04f, +5.376583343e-04f, +1.628244780e-04f, -2.060628682e-04f, -4.695351836e-04f, -5.715956042e-04f, -5.114651158e-04f, -3.357647084e-04f, -1.163105947e-04f, +7.679487601e-05f, +1.967581254e-04f, +2.298116804e-04f, +1.918906538e-04f, +1.160666647e-04f, +3.718987259e-05f, -2.012058813e-05f, -4.661362310e-05f, -4.658066683e-05f, -3.167668481e-05f, -1.401413201e-05f, -1.447406595e-06f, + /* 2, 8 (48) */ + +1.901644577e-04f, +5.382807835e-04f, +1.043117941e-03f, +1.607042240e-03f, +2.041865198e-03f, +2.086923125e-03f, +1.459392199e-03f, -6.670646231e-05f, -2.565924654e-03f, -5.872519870e-03f, -9.522728440e-03f, -1.275170939e-02f, -1.456013766e-02f, -1.385132418e-02f, -9.622869830e-03f, -1.181130567e-03f, +1.166369176e-02f, +2.846594706e-02f, +4.811246649e-02f, +6.890888278e-02f, +8.878011194e-02f, +1.055566702e-01f, +1.172988657e-01f, +1.226004532e-01f, +1.208148548e-01f, +1.121606116e-01f, +9.768564744e-02f, +7.909727764e-02f, +5.849074345e-02f, +3.802778634e-02f, +1.962448566e-02f, +4.702924628e-03f, -5.954286298e-03f, -1.223013303e-02f, -1.458774364e-02f, -1.390179589e-02f, -1.124811758e-02f, -7.695839322e-03f, -4.139948580e-03f, -1.198511013e-03f, +8.180022455e-04f, +1.873764383e-03f, +2.131079521e-03f, +1.855614968e-03f, +1.327392224e-03f, +7.750855424e-04f, +3.419596569e-04f, +8.251269985e-05f, + -7.996890882e-06f, -1.352285859e-05f, -1.741301485e-05f, -1.686839873e-05f, -9.170467399e-06f, +7.352523987e-06f, +3.232275977e-05f, +6.256567834e-05f, +9.191069286e-05f, +1.117470784e-04f, +1.123803877e-04f, +8.502842828e-05f, +2.409519724e-05f, -7.077796261e-05f, -1.934159098e-04f, -3.310001687e-04f, -4.653573154e-04f, -5.755560987e-04f, -6.414122198e-04f, -6.472524196e-04f, -5.851728139e-04f, -4.570780681e-04f, -2.750061691e-04f, -5.958526404e-05f, +1.631407655e-04f, +3.659319540e-04f, +5.248042432e-04f, +6.228502412e-04f, +6.527026745e-04f, +6.172075439e-04f, +5.282536639e-04f, +4.040834770e-04f, +2.657015558e-04f, +1.331402544e-04f, +2.231235421e-05f, -5.700414440e-05f, -1.017908016e-04f, -1.150805950e-04f, -1.042446931e-04f, -7.876960845e-05f, -4.805762199e-05f, -1.969700654e-05f, +1.526099187e-06f, +1.381255800e-05f, +1.786111905e-05f, +1.596312552e-05f, +1.098344767e-05f, +5.493352053e-06f, + +1.473913882e-04f, -3.163032626e-04f, -1.335520770e-03f, -2.810772754e-03f, -4.260236948e-03f, -4.840539951e-03f, -3.584988717e-03f, +1.667627067e-04f, +6.287237588e-03f, +1.354766925e-02f, +1.968681800e-02f, +2.196305613e-02f, +1.809657130e-02f, +7.306789218e-03f, -8.966233429e-03f, -2.702709627e-02f, -4.173793651e-02f, -4.802357938e-02f, -4.261078550e-02f, -2.538462165e-02f, +1.853139707e-04f, +2.780173499e-02f, +5.011230410e-02f, +6.094368351e-02f, +5.724424426e-02f, +4.005979289e-02f, +1.419819851e-02f, -1.329849725e-02f, -3.533850934e-02f, -4.687126276e-02f, -4.620002611e-02f, -3.514062312e-02f, -1.807559493e-02f, -3.278225666e-04f, +1.353359224e-02f, +2.089261998e-02f, +2.147375714e-02f, +1.692716106e-02f, +9.896191711e-03f, +2.980412374e-03f, -2.036715762e-03f, -4.496573452e-03f, -4.720884986e-03f, -3.584637213e-03f, -2.036565407e-03f, -7.547651732e-04f, -2.074618336e-05f, +2.137490244e-04f, + +6.828332627e-06f, +2.256714189e-05f, +4.017029362e-05f, +4.927100079e-05f, +3.720853147e-05f, -4.892127566e-06f, -7.513380208e-05f, -1.564107476e-04f, -2.178744558e-04f, -2.237321840e-04f, -1.475736432e-04f, +1.281257153e-05f, +2.267849633e-04f, +4.338443485e-04f, +5.597904616e-04f, +5.420828385e-04f, +3.557311946e-04f, +2.932498800e-05f, -3.567003045e-04f, -6.913060890e-04f, -8.677457248e-04f, -8.202846407e-04f, -5.492227019e-04f, -1.242847781e-04f, +3.358446005e-04f, +7.011796411e-04f, +8.720925403e-04f, +8.102512456e-04f, +5.482053006e-04f, +1.750406785e-04f, -1.957017770e-04f, -4.635932335e-04f, -5.709959738e-04f, -5.154285844e-04f, -3.423141883e-04f, -1.230920268e-04f, +7.170553526e-05f, +1.943387355e-04f, +2.299959380e-04f, +1.938414640e-04f, +1.186468676e-04f, +3.941848368e-05f, -1.878758649e-05f, -4.623602683e-05f, -4.687515319e-05f, -3.223952423e-05f, -1.451514763e-05f, -1.727423627e-06f, + /* 2, 9 (48) */ + +1.821675668e-04f, +5.247579250e-04f, +1.025704926e-03f, +1.590173842e-03f, +2.032694731e-03f, +2.094275649e-03f, +1.491714959e-03f, -4.140783970e-06f, -2.474013961e-03f, -5.760772791e-03f, -9.410348052e-03f, -1.266668096e-02f, -1.453604246e-02f, -1.392210214e-02f, -9.816285739e-03f, -1.512130736e-03f, +1.119833444e-02f, +2.789039096e-02f, +4.747105427e-02f, +6.826163036e-02f, +8.819493912e-02f, +1.050995921e-01f, +1.170238595e-01f, +1.225408679e-01f, +1.209779955e-01f, +1.125265436e-01f, +9.821045169e-02f, +7.972012788e-02f, +5.914344613e-02f, +3.864499388e-02f, +2.015273933e-02f, +5.107008105e-03f, -5.688584742e-03f, -1.209699277e-02f, -1.456543129e-02f, -1.395880003e-02f, -1.134990838e-02f, -7.810919917e-03f, -4.244193273e-03f, -1.277280621e-03f, +7.699446236e-04f, +1.854067377e-03f, +2.132605620e-03f, +1.869427526e-03f, +1.345253343e-03f, +7.910486679e-04f, +3.529431046e-04f, +8.800605191e-05f, + -7.823934576e-06f, -1.336147488e-05f, -1.734330956e-05f, -1.698114718e-05f, -9.540179638e-06f, +6.699744060e-06f, +3.143828816e-05f, +6.159482021e-05f, +9.108821130e-05f, +1.113674365e-04f, +1.127442933e-04f, +8.637392289e-05f, +2.652715154e-05f, -6.734317504e-05f, -1.892747545e-04f, -3.266445939e-04f, -4.614133903e-04f, -5.726862885e-04f, -6.401981006e-04f, -6.480806737e-04f, -5.881485482e-04f, -4.619852426e-04f, -2.813259176e-04f, -6.657102488e-05f, +1.563444340e-04f, +3.601494334e-04f, +5.206949552e-04f, +6.208066337e-04f, +6.527990109e-04f, +6.192075126e-04f, +5.316725104e-04f, +4.082894485e-04f, +2.700343538e-04f, +1.370223128e-04f, +2.533223037e-05f, -5.504931606e-05f, -1.008970351e-04f, -1.150766596e-04f, -1.048561792e-04f, -7.969070668e-05f, -4.901469194e-05f, -2.049228958e-05f, +9.959741817e-07f, +1.356208269e-05f, +1.783903691e-05f, +1.608400036e-05f, +1.115839327e-05f, +5.652835814e-06f, + +1.542197209e-04f, -2.937361207e-04f, -1.295350476e-03f, -2.761501753e-03f, -4.223028416e-03f, -4.845432079e-03f, -3.660122519e-03f, +1.035195909e-05f, +6.069363132e-03f, +1.332393706e-02f, +1.953924435e-02f, +2.197586870e-02f, +1.832335626e-02f, +7.740633566e-03f, -8.406442968e-03f, -2.648501343e-02f, -4.138220531e-02f, -4.799425439e-02f, -4.296748580e-02f, -2.607592774e-02f, -6.824317540e-04f, +2.698145035e-02f, +4.956308140e-02f, +6.081939873e-02f, +5.758008886e-02f, +4.076097253e-02f, +1.507029105e-02f, -1.248824600e-02f, -3.479030404e-02f, -4.669622208e-02f, -4.639572788e-02f, -3.560421635e-02f, -1.864659090e-02f, -8.432511510e-04f, +1.319127805e-02f, +2.076952795e-02f, +2.154546268e-02f, +1.712149979e-02f, +1.012618765e-02f, +3.174253838e-03f, -1.918068894e-03f, -4.457154968e-03f, -4.739672573e-03f, -3.630873240e-03f, -2.083440561e-03f, -7.870046974e-04f, -3.526133099e-05f, +2.120216008e-04f, + +6.436527589e-06f, +2.200596715e-05f, +3.968408078e-05f, +4.924329868e-05f, +3.801476720e-05f, -3.103899478e-06f, -7.264221312e-05f, -1.539847759e-04f, -2.166166192e-04f, -2.247013900e-04f, -1.512972455e-04f, +6.743349257e-06f, +2.198300360e-04f, +4.282163328e-04f, +5.577757256e-04f, +5.451873476e-04f, +3.639684837e-04f, +4.095577201e-05f, -3.448082387e-04f, -6.827583192e-04f, -8.654317815e-04f, -8.253410091e-04f, -5.605432950e-04f, -1.387878976e-04f, +3.222609165e-04f, +6.923216202e-04f, +8.702595184e-04f, +8.155546947e-04f, +5.586417028e-04f, +1.872604035e-04f, -1.852365655e-04f, -4.574898456e-04f, -5.702331310e-04f, -5.192750907e-04f, -3.488187759e-04f, -1.298993015e-04f, +6.654289323e-05f, +1.918318640e-04f, +2.301086035e-04f, +1.957540069e-04f, +1.212240206e-04f, +4.166895100e-05f, -1.742338539e-05f, -4.583162515e-05f, -4.715469618e-05f, -3.279972542e-05f, -1.502147253e-05f, -2.014981454e-06f, + /* 2,10 (48) */ + +1.743436322e-04f, +5.113964501e-04f, +1.008361617e-03f, +1.573192694e-03f, +2.023154551e-03f, +2.100975393e-03f, +1.523153247e-03f, +5.745403624e-05f, -2.382925750e-03f, -5.649405355e-03f, -9.297603759e-03f, -1.258030704e-02f, -1.450951531e-02f, -1.398944532e-02f, -1.000556049e-02f, -1.838775330e-03f, +1.073692105e-02f, +2.731770467e-02f, +4.683085617e-02f, +6.761354969e-02f, +8.760679058e-02f, +1.046376069e-01f, +1.167425336e-01f, +1.224742969e-01f, +1.211343400e-01f, +1.128866930e-01f, +9.873114664e-02f, +8.034093452e-02f, +5.979624514e-02f, +3.926420140e-02f, +2.068441184e-02f, +5.515297553e-03f, -5.418550388e-03f, -1.195997046e-02f, -1.454009906e-02f, -1.401384935e-02f, -1.145080542e-02f, -7.925996577e-03f, -4.349049452e-03f, -1.356971328e-03f, +7.209299316e-04f, +1.833575087e-03f, +2.133601595e-03f, +1.882989609e-03f, +1.363092380e-03f, +8.071326683e-04f, +3.641014979e-04f, +9.365888772e-05f, + -7.651634979e-06f, -1.319862861e-05f, -1.726936079e-05f, -1.708690087e-05f, -9.901132222e-06f, +6.055495601e-06f, +3.055935993e-05f, +6.062352435e-05f, +9.025683137e-05f, +1.109692702e-04f, +1.130808466e-04f, +8.768629623e-05f, +2.892533735e-05f, -6.393634822e-05f, -1.851491307e-04f, -3.222867216e-04f, -4.574464721e-04f, -5.697733800e-04f, -6.389251117e-04f, -6.488418893e-04f, -5.910587572e-04f, -4.668384753e-04f, -2.876119077e-04f, -7.354870489e-05f, +1.495291793e-04f, +3.543240851e-04f, +5.165258583e-04f, +6.186956518e-04f, +6.528305431e-04f, +6.211542671e-04f, +5.350561130e-04f, +4.124809731e-04f, +2.743726128e-04f, +1.409257044e-04f, +2.838324597e-05f, -5.306025672e-05f, -9.997197899e-05f, -1.150487184e-04f, -1.054530775e-04f, -8.060657581e-05f, -4.997410040e-05f, -2.129469280e-05f, +4.569264820e-07f, +1.330337920e-05f, +1.781101677e-05f, +1.620180464e-05f, +1.133284398e-05f, +5.813561281e-06f, + +1.606562484e-04f, -2.717301535e-04f, -1.255666395e-03f, -2.712258454e-03f, -4.185013649e-03f, -4.848535978e-03f, -3.732764732e-03f, -1.436328168e-04f, +5.852746513e-03f, +1.309923567e-02f, +1.938794711e-02f, +2.198261205e-02f, +1.854318630e-02f, +8.168849899e-03f, -7.848667242e-03f, -2.593982609e-02f, -4.101823683e-02f, -4.795329862e-02f, -4.331229404e-02f, -2.675868606e-02f, -1.547863536e-03f, +2.615610935e-02f, +4.900253810e-02f, +6.068061083e-02f, +5.790234977e-02f, +4.145329415e-02f, +1.594055057e-02f, -1.167269131e-02f, -3.423166234e-02f, -4.650896168e-02f, -4.658096445e-02f, -3.606170620e-02f, -1.921682403e-02f, -1.362526242e-03f, +1.284245928e-02f, +2.063962865e-02f, +2.161200557e-02f, +1.731333166e-02f, +1.035629625e-02f, +3.370007845e-03f, -1.796844873e-03f, -4.415486017e-03f, -4.757095958e-03f, -3.676704865e-03f, -2.130595257e-03f, -8.198044229e-04f, -5.028280352e-05f, +2.100066193e-04f, + +6.051943364e-06f, +2.144732766e-05f, +3.919017456e-05f, +4.919501962e-05f, +3.879092743e-05f, -1.344722690e-06f, -7.016336728e-05f, -1.515410319e-04f, -2.153048015e-04f, -2.255890162e-04f, -1.549354012e-04f, +7.304878903e-07f, +2.128717986e-04f, +4.225104719e-04f, +5.556190707e-04f, +5.481226416e-04f, +3.720628316e-04f, +5.252255007e-05f, -3.328692552e-04f, -6.740555333e-04f, -8.628947198e-04f, -8.301719951e-04f, -5.717063486e-04f, -1.532515671e-04f, +3.085858884e-04f, +6.832708074e-04f, +8.681932613e-04f, +8.206558088e-04f, +5.689641709e-04f, +1.994801026e-04f, -1.746698386e-04f, -4.512259819e-04f, -5.693063191e-04f, -5.230026589e-04f, -3.552761018e-04f, -1.367304729e-04f, +6.130794585e-05f, +1.892374520e-04f, +2.301488361e-04f, +1.976271346e-04f, +1.237971315e-04f, +4.394072422e-05f, -1.602804428e-05f, -4.540012932e-05f, -4.741888520e-05f, -3.335695340e-05f, -1.553294649e-05f, -2.310087044e-06f, + /* 2,11 (48) */ + +1.666919973e-04f, +4.981978215e-04f, +9.910922559e-04f, +1.556105794e-03f, +2.013253419e-03f, +2.107030888e-03f, +1.553712607e-03f, +1.180775606e-04f, -2.292668918e-03f, -5.538436085e-03f, -9.184522912e-03f, -1.249262075e-02f, -1.448058997e-02f, -1.405338166e-02f, -1.019070962e-02f, -2.161062051e-03f, +1.027947458e-02f, +2.674793129e-02f, +4.619193106e-02f, +6.696470780e-02f, +8.701573182e-02f, +1.041707684e-01f, +1.164549217e-01f, +1.224007482e-01f, +1.212838692e-01f, +1.132410171e-01f, +9.924767250e-02f, +8.095963017e-02f, +6.044907568e-02f, +3.988535566e-02f, +2.121946795e-02f, +5.927778526e-03f, -5.144177775e-03f, -1.181904476e-02f, -1.451171581e-02f, -1.406690960e-02f, -1.155077740e-02f, -8.041045295e-03f, -4.454502530e-03f, -1.437577904e-03f, +6.709558312e-04f, +1.812280394e-03f, +2.134058521e-03f, +1.896292988e-03f, +1.380903397e-03f, +8.233344729e-04f, +3.754343418e-04f, +9.947244900e-05f, + -7.480043122e-06f, -1.303439868e-05f, -1.719125943e-05f, -1.718573622e-05f, -1.025335508e-05f, +5.419824611e-06f, +2.968611429e-05f, +5.965201997e-05f, +8.941684389e-05f, +1.105528795e-04f, +1.133902888e-04f, +8.896566043e-05f, +3.128968150e-05f, -6.055776647e-05f, -1.810395187e-04f, -3.179271685e-04f, -4.534572180e-04f, -5.668179551e-04f, -6.375936455e-04f, -6.495361818e-04f, -5.939032386e-04f, -4.716372619e-04f, -2.938634059e-04f, -8.051745830e-05f, +1.426958208e-04f, +3.484565686e-04f, +5.122973493e-04f, +6.165173774e-04f, +6.527970441e-04f, +6.230473317e-04f, +5.384038478e-04f, +4.166573956e-04f, +2.787157577e-04f, +1.448500178e-04f, +3.146519645e-05f, -5.103696510e-05f, -9.901546503e-05f, -1.149964995e-04f, -1.060350840e-04f, -8.151694320e-05f, -5.093564998e-05f, -2.210411281e-05f, -9.102927193e-08f, +1.303639635e-05f, +1.777697317e-05f, +1.631644935e-05f, +1.150673014e-05f, +5.975489525e-06f, + +1.667081918e-04f, -2.502828259e-04f, -1.216476221e-03f, -2.663063435e-03f, -4.146222722e-03f, -4.849880701e-03f, -3.802928100e-03f, -2.951738487e-04f, +5.637441712e-03f, +1.287364666e-02f, +1.923301171e-02f, +2.198334254e-02f, +1.875605810e-02f, +8.591360371e-03f, -7.293048172e-03f, -2.539170344e-02f, -4.064617400e-02f, -4.790077607e-02f, -4.364516329e-02f, -2.743274159e-02f, -2.410758255e-03f, +2.532593735e-02f, +4.843083175e-02f, +6.052735927e-02f, +5.821093566e-02f, +4.213656496e-02f, +1.680874383e-02f, -1.085203550e-02f, -3.366269817e-02f, -4.630948158e-02f, -4.675563429e-02f, -3.651293218e-02f, -1.978613035e-02f, -1.885528901e-03f, +1.248718318e-02f, +2.050289818e-02f, +2.167331351e-02f, +1.750256911e-02f, +1.058644509e-02f, +3.567634980e-03f, -1.673047742e-03f, -4.371545293e-03f, -4.773124002e-03f, -3.722104995e-03f, -2.178014142e-03f, -8.531613762e-04f, -6.581575001e-05f, +2.076965323e-04f, + +5.674634421e-06f, +2.089145928e-05f, +3.868895900e-05f, +4.912655230e-05f, +3.953718479e-05f, +3.851523159e-07f, -6.769801371e-05f, -1.490806182e-04f, -2.139400871e-04f, -2.263956365e-04f, -1.584877552e-04f, -5.224593305e-06f, +2.059124541e-04f, +4.167290819e-04f, +5.533220657e-04f, +5.508888108e-04f, +3.800125628e-04f, +6.402221775e-05f, -3.208869794e-04f, -6.652006819e-04f, -8.601357579e-04f, -8.347765667e-04f, -5.827088224e-04f, -1.676716814e-04f, +2.948233659e-04f, +6.740295675e-04f, +8.658939429e-04f, +8.255526230e-04f, +5.791693600e-04f, +2.116962129e-04f, -1.640042448e-04f, -4.448026599e-04f, -5.682148300e-04f, -5.266093397e-04f, -3.616837955e-04f, -1.435835716e-04f, +5.600172260e-05f, +1.865554712e-04f, +2.301158125e-04f, +1.994597013e-04f, +1.263651979e-04f, +4.623323722e-05f, -1.460163653e-05f, -4.494125820e-05f, -4.766731014e-05f, -3.391086871e-05f, -1.604940348e-05f, -2.612743069e-06f, + /* 2,12 (48) */ + +1.592119541e-04f, +4.851634228e-04f, +9.739009964e-04f, +1.538920057e-03f, +2.003000064e-03f, +2.112450713e-03f, +1.583398721e-03f, +1.777295806e-04f, -2.203252074e-03f, -5.427883205e-03f, -9.071132624e-03f, -1.240365508e-02f, -1.444930029e-02f, -1.411393943e-02f, -1.037174914e-02f, -2.478989220e-03f, +9.826017361e-03f, +2.618111333e-02f, +4.555433741e-02f, +6.631517162e-02f, +8.642182858e-02f, +1.036991311e-01f, +1.161610583e-01f, +1.223202308e-01f, +1.214265650e-01f, +1.135894736e-01f, +9.975996985e-02f, +8.157614755e-02f, +6.110187273e-02f, +4.050840299e-02f, +2.175787180e-02f, +6.344435922e-03f, -4.865462017e-03f, -1.167419474e-02f, -1.448025062e-02f, -1.411794657e-02f, -1.164979286e-02f, -8.156041794e-03f, -4.560537614e-03f, -1.519094847e-03f, +6.200201812e-04f, +1.790176281e-03f, +2.133967492e-03f, +1.909329384e-03f, +1.398680370e-03f, +8.396509222e-04f, +3.869410720e-04f, +1.054479385e-04f, + -7.309209040e-06f, -1.286886331e-05f, -1.710909637e-05f, -1.727773059e-05f, -1.059688009e-05f, +4.792774367e-06f, +2.881868748e-05f, +5.868053377e-05f, +8.856853840e-05f, +1.101185653e-04f, +1.136728644e-04f, +9.021213267e-05f, +3.362011720e-05f, -5.720770752e-05f, -1.769463931e-04f, -3.135665484e-04f, -4.494462858e-04f, -5.638205997e-04f, -6.362041019e-04f, -6.501636765e-04f, -5.966817999e-04f, -4.763811065e-04f, -3.000796842e-04f, -8.747644082e-05f, +1.358451806e-04f, +3.425475498e-04f, +5.080098345e-04f, +6.142719023e-04f, +6.526982959e-04f, +6.248862372e-04f, +5.417150934e-04f, +4.208180602e-04f, +2.830632097e-04f, +1.487948357e-04f, +3.457787058e-05f, -4.897944593e-05f, -9.802732920e-05f, -1.149197331e-04f, -1.066018947e-04f, -8.242153441e-05f, -5.189914050e-05f, -2.292044324e-05f, -6.478759438e-07f, +1.276108460e-05f, +1.773682123e-05f, +1.642784518e-05f, +1.167998123e-05f, +6.138580599e-06f, + +1.723828262e-04f, -2.293913666e-04f, -1.177787262e-03f, -2.613936882e-03f, -4.106685537e-03f, -4.849495549e-03f, -3.870626113e-03f, -4.442544670e-04f, +5.423501625e-03f, +1.264725102e-02f, +1.907452395e-02f, +2.197811794e-02f, +1.896197055e-02f, +9.008089453e-03f, -6.739726106e-03f, -2.484081463e-02f, -4.026616143e-02f, -4.783675385e-02f, -4.396605027e-02f, -2.809794228e-02f, -3.270894013e-03f, +2.449116078e-02f, +4.784812293e-02f, +6.035968758e-02f, +5.850575903e-02f, +4.281059452e-02f, +1.767463777e-02f, -1.002648288e-02f, -3.308352881e-02f, -4.609778536e-02f, -4.691963853e-02f, -3.695773484e-02f, -2.035434518e-02f, -2.412138240e-03f, +1.212549938e-02f, +2.035931460e-02f, +2.172931524e-02f, +1.768912458e-02f, +1.081656090e-02f, +3.767094681e-03f, -1.546682544e-03f, -4.325312056e-03f, -4.787725639e-03f, -3.767046253e-03f, -2.225681452e-03f, -8.870722450e-04f, -8.186515349e-05f, +2.050837892e-04f, + +5.304650110e-06f, +2.033859211e-05f, +3.818081515e-05f, +4.903828840e-05f, +4.025372215e-05f, +2.085490399e-06f, -6.524688689e-05f, -1.466046309e-04f, -2.125235683e-04f, -2.271218480e-04f, -1.619539854e-04f, -1.112050636e-05f, +1.989541894e-04f, +4.108744881e-04f, +5.508863156e-04f, +5.534859988e-04f, +3.878160556e-04f, +7.545170401e-05f, -3.088650378e-04f, -6.561967548e-04f, -8.571561795e-04f, -8.391537625e-04f, -5.935477276e-04f, -1.820441491e-04f, +2.809772275e-04f, +6.646003260e-04f, +8.633618090e-04f, +8.302432309e-04f, +5.892539518e-04f, +2.239051597e-04f, -1.532424745e-04f, -4.382209531e-04f, -5.669580047e-04f, -5.300932113e-04f, -3.680394865e-04f, -1.504566055e-04f, +5.062528636e-05f, +1.837859237e-04f, +2.300087278e-04f, +2.012505635e-04f, +1.289272071e-04f, +4.854590819e-05f, -1.314424960e-05f, -4.445473845e-05f, -4.789956147e-05f, -3.446112759e-05f, -1.657067159e-05f, -2.922947826e-06f, + /* 2,13 (48) */ + +1.519027451e-04f, +4.722945595e-04f, +9.567919001e-04f, +1.521642327e-03f, +1.992403184e-03f, +2.117243487e-03f, +1.612217409e-03f, +2.364101143e-04f, -2.114683536e-03f, -5.317764640e-03f, -8.957459759e-03f, -1.231344295e-02f, -1.441568017e-02f, -1.417114714e-02f, -1.054869554e-02f, -2.792555768e-03f, +9.376571075e-03f, +2.561729273e-02f, +4.491813331e-02f, +6.566500794e-02f, +8.582514678e-02f, +1.032227500e-01f, +1.158609786e-01f, +1.222327543e-01f, +1.215624102e-01f, +1.139320212e-01f, +1.002679797e-01f, +8.219041945e-02f, +6.175457102e-02f, +4.113328923e-02f, +2.229958689e-02f, +6.765253982e-03f, -4.582398808e-03f, -1.152539990e-02f, -1.444567275e-02f, -1.416692601e-02f, -1.174782019e-02f, -8.270961528e-03f, -4.667139508e-03f, -1.601516381e-03f, +5.681210407e-04f, +1.767255838e-03f, +2.133319616e-03f, +1.922090469e-03f, +1.416417191e-03f, +8.560787674e-04f, +3.986210532e-04f, +1.115865191e-04f, + -7.139181769e-06f, -1.270210001e-05f, -1.702296245e-05f, -1.736296222e-05f, -1.093174100e-05f, +4.174385444e-06f, +2.795721277e-05f, +5.770928988e-05f, +8.771220318e-05f, +1.096666292e-04f, +1.139288206e-04f, +9.142583506e-05f, +3.591658402e-05f, -5.388644247e-05f, -1.728702230e-04f, -3.092054717e-04f, -4.454143335e-04f, -5.607819037e-04f, -6.347568882e-04f, -6.507245079e-04f, -5.993942585e-04f, -4.810695220e-04f, -3.062600203e-04f, -9.442480972e-05f, +1.289780839e-04f, +3.365977016e-04f, +5.036637291e-04f, +6.119593288e-04f, +6.525340894e-04f, +6.266705210e-04f, +5.449892318e-04f, +4.249623105e-04f, +2.874143859e-04f, +1.527597348e-04f, +3.772105044e-05f, -4.688770998e-05f, -9.700741192e-05f, -1.148181517e-04f, -1.071532054e-04f, -8.332007332e-05f, -5.286436904e-05f, -2.374357475e-05f, -1.213593878e-06f, +1.247739601e-05f, +1.769047668e-05f, +1.653590257e-05f, +1.185252593e-05f, +6.302793544e-06f, + +1.776874763e-04f, -2.090527745e-04f, -1.139606446e-03f, -2.564898594e-03f, -4.066431815e-03f, -4.847410058e-03f, -3.935873000e-03f, -5.908590979e-04f, +5.210978056e-03f, +1.242012917e-02f, +1.891256997e-02f, +2.196699744e-02f, +1.916092474e-02f, +9.418963941e-03f, -6.188839790e-03f, -2.428732863e-02f, -3.987834538e-02f, -4.776130215e-02f, -4.427491531e-02f, -2.875413903e-02f, -4.128050193e-03f, +2.365200702e-02f, +4.725457520e-02f, +6.017764343e-02f, +5.878673626e-02f, +4.347519485e-02f, +1.853799958e-02f, -9.196239645e-03f, -3.249427486e-02f, -4.587388020e-02f, -4.707288101e-02f, -3.739595579e-02f, -2.092130319e-02f, -2.942231452e-03f, +1.175745989e-02f, +2.020885800e-02f, +2.177994052e-02f, +1.787291050e-02f, +1.104656963e-02f, +3.968345245e-03f, -1.417755337e-03f, -4.276766148e-03f, -4.800869888e-03f, -3.811500991e-03f, -2.273581014e-03f, -9.215333726e-04f, -9.843582508e-05f, +2.021608414e-04f, + +4.942034718e-06f, +1.978895051e-05f, +3.766612089e-05f, +4.893062236e-05f, +4.094073241e-05f, +3.756071670e-06f, -6.281070650e-05f, -1.441141591e-04f, -2.110563443e-04f, -2.277682708e-04f, -1.653338023e-04f, -1.695589485e-05f, +1.919991747e-04f, +4.049490240e-04f, +5.483134604e-04f, +5.559144026e-04f, +3.954717418e-04f, +8.680797206e-05f, -2.968070569e-04f, -6.470467794e-04f, -8.539573337e-04f, -8.433026921e-04f, -6.042201278e-04f, -1.963648945e-04f, +2.670513784e-04f, +6.549855683e-04f, +8.605971771e-04f, +8.347257851e-04f, +5.992146559e-04f, +2.361033579e-04f, -1.423872601e-04f, -4.314819906e-04f, -5.655352339e-04f, -5.334523797e-04f, -3.743408051e-04f, -1.573475604e-04f, +4.517973332e-05f, +1.809288428e-04f, +2.298267956e-04f, +2.029985807e-04f, +1.314821367e-04f, +5.087813966e-05f, -1.165598518e-05f, -4.394030475e-05f, -4.811523052e-05f, -3.500738196e-05f, -1.709657307e-05f, -3.240695165e-06f, + /* 2,14 (48) */ + +1.447635633e-04f, +4.595924595e-04f, +9.397689376e-04f, +1.504279365e-03f, +1.981471443e-03f, +2.121417873e-03f, +1.640174622e-03f, +2.941194042e-04f, -2.026971333e-03f, -5.208098011e-03f, -8.843530939e-03f, -1.222201712e-02f, -1.437976359e-02f, -1.422503358e-02f, -1.072156576e-02f, -3.101761240e-03f, +8.931156742e-03f, +2.505651083e-02f, +4.428337642e-02f, +6.501428343e-02f, +8.522575252e-02f, +1.027416805e-01f, +1.155547185e-01f, +1.221383295e-01f, +1.216913882e-01f, +1.142686189e-01f, +1.007716434e-01f, +8.280237878e-02f, +6.240710511e-02f, +4.175995975e-02f, +2.284457612e-02f, +7.190216292e-03f, -4.294984422e-03f, -1.137264017e-02f, -1.440795170e-02f, -1.421381372e-02f, -1.184482760e-02f, -8.385779679e-03f, -4.774292714e-03f, -1.684836455e-03f, +5.152566717e-04f, +1.743512263e-03f, +2.132106022e-03f, +1.934567865e-03f, +1.434107668e-03f, +8.726146700e-04f, +4.104735791e-04f, +1.178893127e-04f, + -6.970009343e-06f, -1.253418557e-05f, -1.693294841e-05f, -1.744151023e-05f, -1.125797349e-05f, +3.564695732e-06f, +2.710182039e-05f, +5.673850988e-05f, +8.684812514e-05f, +1.091973731e-04f, +1.141584072e-04f, +9.260689457e-05f, +3.817902783e-05f, -5.059423580e-05f, -1.688114720e-04f, -3.048445460e-04f, -4.413620194e-04f, -5.577024609e-04f, -6.332524186e-04f, -6.512188202e-04f, -6.020404421e-04f, -4.857020300e-04f, -3.124036978e-04f, -1.013617240e-04f, +1.220953584e-04f, +3.306077033e-04f, +4.992594577e-04f, +6.095797688e-04f, +6.523042246e-04f, +6.283997270e-04f, +5.482256479e-04f, +4.290894893e-04f, +2.917686997e-04f, +1.567442859e-04f, +4.089451147e-05f, -4.476177412e-05f, -9.595555809e-05f, -1.146914900e-04f, -1.076887123e-04f, -8.421228209e-05f, -5.383112996e-05f, -2.457339501e-05f, -1.788160879e-06f, +1.218528431e-05f, +1.763785591e-05f, +1.664053171e-05f, +1.202429206e-05f, +6.468086385e-06f, + +1.826295111e-04f, -1.892638240e-04f, -1.101940326e-03f, -2.515967971e-03f, -4.025491083e-03f, -4.843653987e-03f, -3.998683707e-03f, -7.349732570e-04f, +4.999921712e-03f, +1.219236090e-02f, +1.874723616e-02f, +2.195004154e-02f, +1.935292392e-02f, +9.823912965e-03f, -5.640526330e-03f, -2.373141423e-02f, -3.948287364e-02f, -4.767449418e-02f, -4.457172237e-02f, -2.940118581e-02f, -4.982007526e-03f, +2.280870433e-02f, +4.665035507e-02f, +5.998127854e-02f, +5.905378763e-02f, +4.413018042e-02f, +1.939859676e-02f, -8.361513860e-03f, -3.189506020e-02f, -4.563777685e-02f, -4.721526827e-02f, -3.782743778e-02f, -2.148683842e-02f, -3.475683831e-03f, +1.138311909e-02f, +2.005151044e-02f, +2.182512026e-02f, +1.805383935e-02f, +1.127639642e-02f, +4.171343825e-03f, -1.286273200e-03f, -4.225888008e-03f, -4.812525874e-03f, -3.855441296e-03f, -2.321696244e-03f, -9.565407545e-04f, -1.155323981e-04f, +1.989201462e-04f, + +4.586827532e-06f, +1.924275306e-05f, +3.714525083e-05f, +4.880395116e-05f, +4.159841831e-05f, +5.396691400e-06f, -6.039017732e-05f, -1.416102850e-04f, -2.095395216e-04f, -2.283355473e-04f, -1.686269495e-04f, -2.272943417e-05f, +1.850495629e-04f, +3.989550309e-04f, +5.456051746e-04f, +5.581742720e-04f, +4.029781075e-04f, +9.808802026e-05f, -2.847166625e-04f, -6.377538201e-04f, -8.505406338e-04f, -8.472225364e-04f, -6.147231401e-04f, -2.106298584e-04f, +2.530497498e-04f, +6.451878390e-04f, +8.576004368e-04f, +8.389984984e-04f, +6.090482106e-04f, +2.482872132e-04f, -1.314413747e-04f, -4.245869572e-04f, -5.639459584e-04f, -5.366849801e-04f, -3.805853830e-04f, -1.642544006e-04f, +3.966619283e-05f, +1.779842931e-04f, +2.295692488e-04f, +2.047026160e-04f, +1.340289548e-04f, +5.322931859e-05f, -1.013695931e-05f, -4.339770006e-05f, -4.831390965e-05f, -3.554927965e-05f, -1.762692433e-05f, -3.565974415e-06f, + /* 2,15 (48) */ + +1.377935540e-04f, +4.470582739e-04f, +9.228359892e-04f, +1.486837854e-03f, +1.970213469e-03f, +2.124982568e-03f, +1.667276442e-03f, +3.508579141e-04f, -1.940123208e-03f, -5.098900637e-03f, -8.729372531e-03f, -1.212941022e-02f, -1.434158456e-02f, -1.427562782e-02f, -1.089037723e-02f, -3.406605786e-03f, +8.489794722e-03f, +2.449880837e-02f, +4.365012400e-02f, +6.436306461e-02f, +8.462371208e-02f, +1.022559785e-01f, +1.152423148e-01f, +1.220369678e-01f, +1.218134836e-01f, +1.145992266e-01f, +1.012709029e-01f, +8.341195855e-02f, +6.305940934e-02f, +4.238835948e-02f, +2.339280177e-02f, +7.619305782e-03f, -4.003215722e-03f, -1.121589588e-02f, -1.436705718e-02f, -1.425857550e-02f, -1.194078316e-02f, -8.500471169e-03f, -4.881981426e-03f, -1.769048737e-03f, +4.614255417e-04f, +1.718938868e-03f, +2.130317861e-03f, +1.946753149e-03f, +1.451745524e-03f, +8.892552017e-04f, +4.224978712e-04f, +1.243573991e-04f, + -6.801738791e-06f, -1.236519602e-05f, -1.683914494e-05f, -1.751345456e-05f, -1.157561503e-05f, +2.963740453e-06f, +2.625263763e-05f, +5.576841276e-05f, +8.597658981e-05f, +1.087110996e-04f, +1.143618770e-04f, +9.375544306e-05f, +4.040740079e-05f, -4.733134538e-05f, -1.647705983e-04f, -3.004843754e-04f, -4.372900018e-04f, -5.545828692e-04f, -6.316911150e-04f, -6.516467669e-04f, -6.046201882e-04f, -4.902781610e-04f, -3.185100062e-04f, -1.082863446e-04f, +1.151978344e-04f, +3.245782408e-04f, +4.947974541e-04f, +6.071333445e-04f, +6.520085110e-04f, +6.300734059e-04f, +5.514237298e-04f, +4.331989390e-04f, +2.961255608e-04f, +1.607480540e-04f, +4.409802242e-05f, -4.260166134e-05f, -9.487161712e-05f, -1.145394853e-04f, -1.082081116e-04f, -8.509788127e-05f, -5.479921488e-05f, -2.540978874e-05f, -2.371552186e-06f, +1.188470494e-05f, +1.757887595e-05f, +1.674164258e-05f, +1.219520668e-05f, +6.634416134e-06f, + +1.872163386e-04f, -1.700210709e-04f, -1.064795075e-03f, -2.467164020e-03f, -3.983892664e-03f, -4.838257295e-03f, -4.059073884e-03f, -8.765835420e-04f, +4.790382190e-03f, +1.196402535e-02f, +1.857860921e-02f, +2.192731211e-02f, +1.953797348e-02f, +1.022286800e-02f, -5.094921155e-03f, -2.317323996e-02f, -3.907989553e-02f, -4.757640616e-02f, -4.485643903e-02f, -3.003893963e-02f, -5.832548160e-03f, +2.196148179e-02f, +4.603563193e-02f, +5.977064868e-02f, +5.930683738e-02f, +4.477536826e-02f, +2.025619720e-02f, -7.522515361e-03f, -3.128601199e-02f, -4.538948963e-02f, -4.734670964e-02f, -3.825202474e-02f, -2.205078438e-02f, -4.012368812e-03f, +1.100253371e-02f, +1.988725604e-02f, +2.186478645e-02f, +1.823182364e-02f, +1.150596567e-02f, +4.376046441e-03f, -1.152244245e-03f, -4.172658690e-03f, -4.822662833e-03f, -3.898838996e-03f, -2.370010154e-03f, -9.920900342e-04f, -1.331593225e-04f, +1.953541718e-04f, + +4.239062902e-06f, +1.870021254e-05f, +3.661857613e-05f, +4.865867407e-05f, +4.222699221e-05f, +7.007159918e-06f, -5.798598908e-05f, -1.390940832e-04f, -2.079742128e-04f, -2.288243418e-04f, -1.718332028e-04f, -2.843983174e-05f, +1.781074890e-04f, +3.928948564e-04f, +5.427631665e-04f, +5.602659095e-04f, +4.103336929e-04f, +1.092888830e-04f, -2.725974779e-04f, -6.283209769e-04f, -8.469075570e-04f, -8.509125476e-04f, -6.250539358e-04f, -2.248349998e-04f, +2.389762973e-04f, +6.352097412e-04f, +8.543720493e-04f, +8.430596442e-04f, +6.187513844e-04f, +2.604531230e-04f, -1.204076315e-04f, -4.175370929e-04f, -5.621896695e-04f, -5.397891773e-04f, -3.867708543e-04f, -1.711750692e-04f, +3.408582724e-05f, +1.749523706e-04f, +2.292353400e-04f, +2.063615363e-04f, +1.365666202e-04f, +5.559881639e-05f, -8.587302511e-06f, -4.282667583e-05f, -4.849519248e-05f, -3.608646442e-05f, -1.816153592e-05f, -3.898770305e-06f, + /* 2,16 (48) */ + +1.309918152e-04f, +4.346930779e-04f, +9.059968443e-04f, +1.469324400e-03f, +1.958637854e-03f, +2.127946309e-03f, +1.693529080e-03f, +4.066263268e-04f, -1.854146618e-03f, -4.990189538e-03f, -8.615010654e-03f, -1.203565478e-02f, -1.430117716e-02f, -1.432295916e-02f, -1.105514783e-02f, -3.707090161e-03f, +8.052504721e-03f, +2.394422550e-02f, +4.301843289e-02f, +6.371141785e-02f, +8.401909189e-02f, +1.017657003e-01f, +1.149238048e-01f, +1.219286814e-01f, +1.219286814e-01f, +1.149238048e-01f, +1.017657003e-01f, +8.401909189e-02f, +6.371141785e-02f, +4.301843289e-02f, +2.394422550e-02f, +8.052504721e-03f, -3.707090161e-03f, -1.105514783e-02f, -1.432295916e-02f, -1.430117716e-02f, -1.203565478e-02f, -8.615010654e-03f, -4.990189538e-03f, -1.854146618e-03f, +4.066263268e-04f, +1.693529080e-03f, +2.127946309e-03f, +1.958637854e-03f, +1.469324400e-03f, +9.059968443e-04f, +4.346930779e-04f, +1.309918152e-04f, + -6.634416134e-06f, -1.219520668e-05f, -1.674164258e-05f, -1.757887595e-05f, -1.188470494e-05f, +2.371552186e-06f, +2.540978874e-05f, +5.479921488e-05f, +8.509788127e-05f, +1.082081116e-04f, +1.145394853e-04f, +9.487161712e-05f, +4.260166134e-05f, -4.409802242e-05f, -1.607480540e-04f, -2.961255608e-04f, -4.331989390e-04f, -5.514237298e-04f, -6.300734059e-04f, -6.520085110e-04f, -6.071333445e-04f, -4.947974541e-04f, -3.245782408e-04f, -1.151978344e-04f, +1.082863446e-04f, +3.185100062e-04f, +4.902781610e-04f, +6.046201882e-04f, +6.516467669e-04f, +6.316911150e-04f, +5.545828692e-04f, +4.372900018e-04f, +3.004843754e-04f, +1.647705983e-04f, +4.733134538e-05f, -4.040740079e-05f, -9.375544306e-05f, -1.143618770e-04f, -1.087110996e-04f, -8.597658981e-05f, -5.576841276e-05f, -2.625263763e-05f, -2.963740453e-06f, +1.157561503e-05f, +1.751345456e-05f, +1.683914494e-05f, +1.236519602e-05f, +6.801738791e-06f, + +1.914554015e-04f, -1.513208584e-04f, -1.028176499e-03f, -2.418505346e-03f, -3.941665672e-03f, -4.831250135e-03f, -4.117059873e-03f, -1.015677625e-03f, +4.582407978e-03f, +1.173520101e-02f, +1.840677601e-02f, +2.189887228e-02f, +1.971608097e-02f, +1.061576285e-02f, -4.552157989e-03f, -2.261297405e-02f, -3.866956183e-02f, -4.746711727e-02f, -4.512903651e-02f, -3.066726061e-02f, -6.679455717e-03f, +2.111056924e-02f, +4.541057800e-02f, +5.954581368e-02f, +5.954581368e-02f, +4.541057800e-02f, +2.111056924e-02f, -6.679455717e-03f, -3.066726061e-02f, -4.512903651e-02f, -4.746711727e-02f, -3.866956183e-02f, -2.261297405e-02f, -4.552157989e-03f, +1.061576285e-02f, +1.971608097e-02f, +2.189887228e-02f, +1.840677601e-02f, +1.173520101e-02f, +4.582407978e-03f, -1.015677625e-03f, -4.117059873e-03f, -4.831250135e-03f, -3.941665672e-03f, -2.418505346e-03f, -1.028176499e-03f, -1.513208584e-04f, +1.914554015e-04f, + +3.898770305e-06f, +1.816153592e-05f, +3.608646442e-05f, +4.849519248e-05f, +4.282667583e-05f, +8.587302511e-06f, -5.559881639e-05f, -1.365666202e-04f, -2.063615363e-04f, -2.292353400e-04f, -1.749523706e-04f, -3.408582724e-05f, +1.711750692e-04f, +3.867708543e-04f, +5.397891773e-04f, +5.621896695e-04f, +4.175370929e-04f, +1.204076315e-04f, -2.604531230e-04f, -6.187513844e-04f, -8.430596442e-04f, -8.543720493e-04f, -6.352097412e-04f, -2.389762973e-04f, +2.248349998e-04f, +6.250539358e-04f, +8.509125476e-04f, +8.469075570e-04f, +6.283209769e-04f, +2.725974779e-04f, -1.092888830e-04f, -4.103336929e-04f, -5.602659095e-04f, -5.427631665e-04f, -3.928948564e-04f, -1.781074890e-04f, +2.843983174e-05f, +1.718332028e-04f, +2.288243418e-04f, +2.079742128e-04f, +1.390940832e-04f, +5.798598908e-05f, -7.007159918e-06f, -4.222699221e-05f, -4.865867407e-05f, -3.661857613e-05f, -1.870021254e-05f, -4.239062902e-06f, + /* 2,17 (48) */ + +1.243573991e-04f, +4.224978712e-04f, +8.892552017e-04f, +1.451745524e-03f, +1.946753149e-03f, +2.130317861e-03f, +1.718938868e-03f, +4.614255417e-04f, -1.769048737e-03f, -4.881981426e-03f, -8.500471169e-03f, -1.194078316e-02f, -1.425857550e-02f, -1.436705718e-02f, -1.121589588e-02f, -4.003215722e-03f, +7.619305782e-03f, +2.339280177e-02f, +4.238835948e-02f, +6.305940934e-02f, +8.341195855e-02f, +1.012709029e-01f, +1.145992266e-01f, +1.218134836e-01f, +1.220369678e-01f, +1.152423148e-01f, +1.022559785e-01f, +8.462371208e-02f, +6.436306461e-02f, +4.365012400e-02f, +2.449880837e-02f, +8.489794722e-03f, -3.406605786e-03f, -1.089037723e-02f, -1.427562782e-02f, -1.434158456e-02f, -1.212941022e-02f, -8.729372531e-03f, -5.098900637e-03f, -1.940123208e-03f, +3.508579141e-04f, +1.667276442e-03f, +2.124982568e-03f, +1.970213469e-03f, +1.486837854e-03f, +9.228359892e-04f, +4.470582739e-04f, +1.377935540e-04f, + -6.468086385e-06f, -1.202429206e-05f, -1.664053171e-05f, -1.763785591e-05f, -1.218528431e-05f, +1.788160879e-06f, +2.457339501e-05f, +5.383112996e-05f, +8.421228209e-05f, +1.076887123e-04f, +1.146914900e-04f, +9.595555809e-05f, +4.476177412e-05f, -4.089451147e-05f, -1.567442859e-04f, -2.917686997e-04f, -4.290894893e-04f, -5.482256479e-04f, -6.283997270e-04f, -6.523042246e-04f, -6.095797688e-04f, -4.992594577e-04f, -3.306077033e-04f, -1.220953584e-04f, +1.013617240e-04f, +3.124036978e-04f, +4.857020300e-04f, +6.020404421e-04f, +6.512188202e-04f, +6.332524186e-04f, +5.577024609e-04f, +4.413620194e-04f, +3.048445460e-04f, +1.688114720e-04f, +5.059423580e-05f, -3.817902783e-05f, -9.260689457e-05f, -1.141584072e-04f, -1.091973731e-04f, -8.684812514e-05f, -5.673850988e-05f, -2.710182039e-05f, -3.564695732e-06f, +1.125797349e-05f, +1.744151023e-05f, +1.693294841e-05f, +1.253418557e-05f, +6.970009343e-06f, + +1.953541718e-04f, -1.331593225e-04f, -9.920900342e-04f, -2.370010154e-03f, -3.898838996e-03f, -4.822662833e-03f, -4.172658690e-03f, -1.152244245e-03f, +4.376046441e-03f, +1.150596567e-02f, +1.823182364e-02f, +2.186478645e-02f, +1.988725604e-02f, +1.100253371e-02f, -4.012368812e-03f, -2.205078438e-02f, -3.825202474e-02f, -4.734670964e-02f, -4.538948963e-02f, -3.128601199e-02f, -7.522515361e-03f, +2.025619720e-02f, +4.477536826e-02f, +5.930683738e-02f, +5.977064868e-02f, +4.603563193e-02f, +2.196148179e-02f, -5.832548160e-03f, -3.003893963e-02f, -4.485643903e-02f, -4.757640616e-02f, -3.907989553e-02f, -2.317323996e-02f, -5.094921155e-03f, +1.022286800e-02f, +1.953797348e-02f, +2.192731211e-02f, +1.857860921e-02f, +1.196402535e-02f, +4.790382190e-03f, -8.765835420e-04f, -4.059073884e-03f, -4.838257295e-03f, -3.983892664e-03f, -2.467164020e-03f, -1.064795075e-03f, -1.700210709e-04f, +1.872163386e-04f, + +3.565974415e-06f, +1.762692433e-05f, +3.554927965e-05f, +4.831390965e-05f, +4.339770006e-05f, +1.013695931e-05f, -5.322931859e-05f, -1.340289548e-04f, -2.047026160e-04f, -2.295692488e-04f, -1.779842931e-04f, -3.966619283e-05f, +1.642544006e-04f, +3.805853830e-04f, +5.366849801e-04f, +5.639459584e-04f, +4.245869572e-04f, +1.314413747e-04f, -2.482872132e-04f, -6.090482106e-04f, -8.389984984e-04f, -8.576004368e-04f, -6.451878390e-04f, -2.530497498e-04f, +2.106298584e-04f, +6.147231401e-04f, +8.472225364e-04f, +8.505406338e-04f, +6.377538201e-04f, +2.847166625e-04f, -9.808802026e-05f, -4.029781075e-04f, -5.581742720e-04f, -5.456051746e-04f, -3.989550309e-04f, -1.850495629e-04f, +2.272943417e-05f, +1.686269495e-04f, +2.283355473e-04f, +2.095395216e-04f, +1.416102850e-04f, +6.039017732e-05f, -5.396691400e-06f, -4.159841831e-05f, -4.880395116e-05f, -3.714525083e-05f, -1.924275306e-05f, -4.586827532e-06f, + /* 2,18 (48) */ + +1.178893127e-04f, +4.104735791e-04f, +8.726146700e-04f, +1.434107668e-03f, +1.934567865e-03f, +2.132106022e-03f, +1.743512263e-03f, +5.152566717e-04f, -1.684836455e-03f, -4.774292714e-03f, -8.385779679e-03f, -1.184482760e-02f, -1.421381372e-02f, -1.440795170e-02f, -1.137264017e-02f, -4.294984422e-03f, +7.190216292e-03f, +2.284457612e-02f, +4.175995975e-02f, +6.240710511e-02f, +8.280237878e-02f, +1.007716434e-01f, +1.142686189e-01f, +1.216913882e-01f, +1.221383295e-01f, +1.155547185e-01f, +1.027416805e-01f, +8.522575252e-02f, +6.501428343e-02f, +4.428337642e-02f, +2.505651083e-02f, +8.931156742e-03f, -3.101761240e-03f, -1.072156576e-02f, -1.422503358e-02f, -1.437976359e-02f, -1.222201712e-02f, -8.843530939e-03f, -5.208098011e-03f, -2.026971333e-03f, +2.941194042e-04f, +1.640174622e-03f, +2.121417873e-03f, +1.981471443e-03f, +1.504279365e-03f, +9.397689376e-04f, +4.595924595e-04f, +1.447635633e-04f, + -6.302793544e-06f, -1.185252593e-05f, -1.653590257e-05f, -1.769047668e-05f, -1.247739601e-05f, +1.213593878e-06f, +2.374357475e-05f, +5.286436904e-05f, +8.332007332e-05f, +1.071532054e-04f, +1.148181517e-04f, +9.700741192e-05f, +4.688770998e-05f, -3.772105044e-05f, -1.527597348e-04f, -2.874143859e-04f, -4.249623105e-04f, -5.449892318e-04f, -6.266705210e-04f, -6.525340894e-04f, -6.119593288e-04f, -5.036637291e-04f, -3.365977016e-04f, -1.289780839e-04f, +9.442480972e-05f, +3.062600203e-04f, +4.810695220e-04f, +5.993942585e-04f, +6.507245079e-04f, +6.347568882e-04f, +5.607819037e-04f, +4.454143335e-04f, +3.092054717e-04f, +1.728702230e-04f, +5.388644247e-05f, -3.591658402e-05f, -9.142583506e-05f, -1.139288206e-04f, -1.096666292e-04f, -8.771220318e-05f, -5.770928988e-05f, -2.795721277e-05f, -4.174385444e-06f, +1.093174100e-05f, +1.736296222e-05f, +1.702296245e-05f, +1.270210001e-05f, +7.139181769e-06f, + +1.989201462e-04f, -1.155323981e-04f, -9.565407545e-04f, -2.321696244e-03f, -3.855441296e-03f, -4.812525874e-03f, -4.225888008e-03f, -1.286273200e-03f, +4.171343825e-03f, +1.127639642e-02f, +1.805383935e-02f, +2.182512026e-02f, +2.005151044e-02f, +1.138311909e-02f, -3.475683831e-03f, -2.148683842e-02f, -3.782743778e-02f, -4.721526827e-02f, -4.563777685e-02f, -3.189506020e-02f, -8.361513860e-03f, +1.939859676e-02f, +4.413018042e-02f, +5.905378763e-02f, +5.998127854e-02f, +4.665035507e-02f, +2.280870433e-02f, -4.982007526e-03f, -2.940118581e-02f, -4.457172237e-02f, -4.767449418e-02f, -3.948287364e-02f, -2.373141423e-02f, -5.640526330e-03f, +9.823912965e-03f, +1.935292392e-02f, +2.195004154e-02f, +1.874723616e-02f, +1.219236090e-02f, +4.999921712e-03f, -7.349732570e-04f, -3.998683707e-03f, -4.843653987e-03f, -4.025491083e-03f, -2.515967971e-03f, -1.101940326e-03f, -1.892638240e-04f, +1.826295111e-04f, + +3.240695165e-06f, +1.709657307e-05f, +3.500738196e-05f, +4.811523052e-05f, +4.394030475e-05f, +1.165598518e-05f, -5.087813966e-05f, -1.314821367e-04f, -2.029985807e-04f, -2.298267956e-04f, -1.809288428e-04f, -4.517973332e-05f, +1.573475604e-04f, +3.743408051e-04f, +5.334523797e-04f, +5.655352339e-04f, +4.314819906e-04f, +1.423872601e-04f, -2.361033579e-04f, -5.992146559e-04f, -8.347257851e-04f, -8.605971771e-04f, -6.549855683e-04f, -2.670513784e-04f, +1.963648945e-04f, +6.042201278e-04f, +8.433026921e-04f, +8.539573337e-04f, +6.470467794e-04f, +2.968070569e-04f, -8.680797206e-05f, -3.954717418e-04f, -5.559144026e-04f, -5.483134604e-04f, -4.049490240e-04f, -1.919991747e-04f, +1.695589485e-05f, +1.653338023e-04f, +2.277682708e-04f, +2.110563443e-04f, +1.441141591e-04f, +6.281070650e-05f, -3.756071670e-06f, -4.094073241e-05f, -4.893062236e-05f, -3.766612089e-05f, -1.978895051e-05f, -4.942034718e-06f, + /* 2,19 (48) */ + +1.115865191e-04f, +3.986210532e-04f, +8.560787674e-04f, +1.416417191e-03f, +1.922090469e-03f, +2.133319616e-03f, +1.767255838e-03f, +5.681210407e-04f, -1.601516381e-03f, -4.667139508e-03f, -8.270961528e-03f, -1.174782019e-02f, -1.416692601e-02f, -1.444567275e-02f, -1.152539990e-02f, -4.582398808e-03f, +6.765253982e-03f, +2.229958689e-02f, +4.113328923e-02f, +6.175457102e-02f, +8.219041945e-02f, +1.002679797e-01f, +1.139320212e-01f, +1.215624102e-01f, +1.222327543e-01f, +1.158609786e-01f, +1.032227500e-01f, +8.582514678e-02f, +6.566500794e-02f, +4.491813331e-02f, +2.561729273e-02f, +9.376571075e-03f, -2.792555768e-03f, -1.054869554e-02f, -1.417114714e-02f, -1.441568017e-02f, -1.231344295e-02f, -8.957459759e-03f, -5.317764640e-03f, -2.114683536e-03f, +2.364101143e-04f, +1.612217409e-03f, +2.117243487e-03f, +1.992403184e-03f, +1.521642327e-03f, +9.567919001e-04f, +4.722945595e-04f, +1.519027451e-04f, + -6.138580599e-06f, -1.167998123e-05f, -1.642784518e-05f, -1.773682123e-05f, -1.276108460e-05f, +6.478759438e-07f, +2.292044324e-05f, +5.189914050e-05f, +8.242153441e-05f, +1.066018947e-04f, +1.149197331e-04f, +9.802732920e-05f, +4.897944593e-05f, -3.457787058e-05f, -1.487948357e-04f, -2.830632097e-04f, -4.208180602e-04f, -5.417150934e-04f, -6.248862372e-04f, -6.526982959e-04f, -6.142719023e-04f, -5.080098345e-04f, -3.425475498e-04f, -1.358451806e-04f, +8.747644082e-05f, +3.000796842e-04f, +4.763811065e-04f, +5.966817999e-04f, +6.501636765e-04f, +6.362041019e-04f, +5.638205997e-04f, +4.494462858e-04f, +3.135665484e-04f, +1.769463931e-04f, +5.720770752e-05f, -3.362011720e-05f, -9.021213267e-05f, -1.136728644e-04f, -1.101185653e-04f, -8.856853840e-05f, -5.868053377e-05f, -2.881868748e-05f, -4.792774367e-06f, +1.059688009e-05f, +1.727773059e-05f, +1.710909637e-05f, +1.286886331e-05f, +7.309209040e-06f, + +2.021608414e-04f, -9.843582508e-05f, -9.215333726e-04f, -2.273581014e-03f, -3.811500991e-03f, -4.800869888e-03f, -4.276766148e-03f, -1.417755337e-03f, +3.968345245e-03f, +1.104656963e-02f, +1.787291050e-02f, +2.177994052e-02f, +2.020885800e-02f, +1.175745989e-02f, -2.942231452e-03f, -2.092130319e-02f, -3.739595579e-02f, -4.707288101e-02f, -4.587388020e-02f, -3.249427486e-02f, -9.196239645e-03f, +1.853799958e-02f, +4.347519485e-02f, +5.878673626e-02f, +6.017764343e-02f, +4.725457520e-02f, +2.365200702e-02f, -4.128050193e-03f, -2.875413903e-02f, -4.427491531e-02f, -4.776130215e-02f, -3.987834538e-02f, -2.428732863e-02f, -6.188839790e-03f, +9.418963941e-03f, +1.916092474e-02f, +2.196699744e-02f, +1.891256997e-02f, +1.242012917e-02f, +5.210978056e-03f, -5.908590979e-04f, -3.935873000e-03f, -4.847410058e-03f, -4.066431815e-03f, -2.564898594e-03f, -1.139606446e-03f, -2.090527745e-04f, +1.776874763e-04f, + +2.922947826e-06f, +1.657067159e-05f, +3.446112759e-05f, +4.789956147e-05f, +4.445473845e-05f, +1.314424960e-05f, -4.854590819e-05f, -1.289272071e-04f, -2.012505635e-04f, -2.300087278e-04f, -1.837859237e-04f, -5.062528636e-05f, +1.504566055e-04f, +3.680394865e-04f, +5.300932113e-04f, +5.669580047e-04f, +4.382209531e-04f, +1.532424745e-04f, -2.239051597e-04f, -5.892539518e-04f, -8.302432309e-04f, -8.633618090e-04f, -6.646003260e-04f, -2.809772275e-04f, +1.820441491e-04f, +5.935477276e-04f, +8.391537625e-04f, +8.571561795e-04f, +6.561967548e-04f, +3.088650378e-04f, -7.545170401e-05f, -3.878160556e-04f, -5.534859988e-04f, -5.508863156e-04f, -4.108744881e-04f, -1.989541894e-04f, +1.112050636e-05f, +1.619539854e-04f, +2.271218480e-04f, +2.125235683e-04f, +1.466046309e-04f, +6.524688689e-05f, -2.085490399e-06f, -4.025372215e-05f, -4.903828840e-05f, -3.818081515e-05f, -2.033859211e-05f, -5.304650110e-06f, + /* 2,20 (48) */ + +1.054479385e-04f, +3.869410720e-04f, +8.396509222e-04f, +1.398680370e-03f, +1.909329384e-03f, +2.133967492e-03f, +1.790176281e-03f, +6.200201812e-04f, -1.519094847e-03f, -4.560537614e-03f, -8.156041794e-03f, -1.164979286e-02f, -1.411794657e-02f, -1.448025062e-02f, -1.167419474e-02f, -4.865462017e-03f, +6.344435922e-03f, +2.175787180e-02f, +4.050840299e-02f, +6.110187273e-02f, +8.157614755e-02f, +9.975996985e-02f, +1.135894736e-01f, +1.214265650e-01f, +1.223202308e-01f, +1.161610583e-01f, +1.036991311e-01f, +8.642182858e-02f, +6.631517162e-02f, +4.555433741e-02f, +2.618111333e-02f, +9.826017361e-03f, -2.478989220e-03f, -1.037174914e-02f, -1.411393943e-02f, -1.444930029e-02f, -1.240365508e-02f, -9.071132624e-03f, -5.427883205e-03f, -2.203252074e-03f, +1.777295806e-04f, +1.583398721e-03f, +2.112450713e-03f, +2.003000064e-03f, +1.538920057e-03f, +9.739009964e-04f, +4.851634228e-04f, +1.592119541e-04f, + -5.975489525e-06f, -1.150673014e-05f, -1.631644935e-05f, -1.777697317e-05f, -1.303639635e-05f, +9.102927193e-08f, +2.210411281e-05f, +5.093564998e-05f, +8.151694320e-05f, +1.060350840e-04f, +1.149964995e-04f, +9.901546503e-05f, +5.103696510e-05f, -3.146519645e-05f, -1.448500178e-04f, -2.787157577e-04f, -4.166573956e-04f, -5.384038478e-04f, -6.230473317e-04f, -6.527970441e-04f, -6.165173774e-04f, -5.122973493e-04f, -3.484565686e-04f, -1.426958208e-04f, +8.051745830e-05f, +2.938634059e-04f, +4.716372619e-04f, +5.939032386e-04f, +6.495361818e-04f, +6.375936455e-04f, +5.668179551e-04f, +4.534572180e-04f, +3.179271685e-04f, +1.810395187e-04f, +6.055776647e-05f, -3.128968150e-05f, -8.896566043e-05f, -1.133902888e-04f, -1.105528795e-04f, -8.941684389e-05f, -5.965201997e-05f, -2.968611429e-05f, -5.419824611e-06f, +1.025335508e-05f, +1.718573622e-05f, +1.719125943e-05f, +1.303439868e-05f, +7.480043122e-06f, + +2.050837892e-04f, -8.186515349e-05f, -8.870722450e-04f, -2.225681452e-03f, -3.767046253e-03f, -4.787725639e-03f, -4.325312056e-03f, -1.546682544e-03f, +3.767094681e-03f, +1.081656090e-02f, +1.768912458e-02f, +2.172931524e-02f, +2.035931460e-02f, +1.212549938e-02f, -2.412138240e-03f, -2.035434518e-02f, -3.695773484e-02f, -4.691963853e-02f, -4.609778536e-02f, -3.308352881e-02f, -1.002648288e-02f, +1.767463777e-02f, +4.281059452e-02f, +5.850575903e-02f, +6.035968758e-02f, +4.784812293e-02f, +2.449116078e-02f, -3.270894013e-03f, -2.809794228e-02f, -4.396605027e-02f, -4.783675385e-02f, -4.026616143e-02f, -2.484081463e-02f, -6.739726106e-03f, +9.008089453e-03f, +1.896197055e-02f, +2.197811794e-02f, +1.907452395e-02f, +1.264725102e-02f, +5.423501625e-03f, -4.442544670e-04f, -3.870626113e-03f, -4.849495549e-03f, -4.106685537e-03f, -2.613936882e-03f, -1.177787262e-03f, -2.293913666e-04f, +1.723828262e-04f, + +2.612743069e-06f, +1.604940348e-05f, +3.391086871e-05f, +4.766731014e-05f, +4.494125820e-05f, +1.460163653e-05f, -4.623323722e-05f, -1.263651979e-04f, -1.994597013e-04f, -2.301158125e-04f, -1.865554712e-04f, -5.600172260e-05f, +1.435835716e-04f, +3.616837955e-04f, +5.266093397e-04f, +5.682148300e-04f, +4.448026599e-04f, +1.640042448e-04f, -2.116962129e-04f, -5.791693600e-04f, -8.255526230e-04f, -8.658939429e-04f, -6.740295675e-04f, -2.948233659e-04f, +1.676716814e-04f, +5.827088224e-04f, +8.347765667e-04f, +8.601357579e-04f, +6.652006819e-04f, +3.208869794e-04f, -6.402221775e-05f, -3.800125628e-04f, -5.508888108e-04f, -5.533220657e-04f, -4.167290819e-04f, -2.059124541e-04f, +5.224593305e-06f, +1.584877552e-04f, +2.263956365e-04f, +2.139400871e-04f, +1.490806182e-04f, +6.769801371e-05f, -3.851523159e-07f, -3.953718479e-05f, -4.912655230e-05f, -3.868895900e-05f, -2.089145928e-05f, -5.674634421e-06f, + /* 2,21 (48) */ + +9.947244900e-05f, +3.754343418e-04f, +8.233344729e-04f, +1.380903397e-03f, +1.896292988e-03f, +2.134058521e-03f, +1.812280394e-03f, +6.709558312e-04f, -1.437577904e-03f, -4.454502530e-03f, -8.041045295e-03f, -1.155077740e-02f, -1.406690960e-02f, -1.451171581e-02f, -1.181904476e-02f, -5.144177775e-03f, +5.927778526e-03f, +2.121946795e-02f, +3.988535566e-02f, +6.044907568e-02f, +8.095963017e-02f, +9.924767250e-02f, +1.132410171e-01f, +1.212838692e-01f, +1.224007482e-01f, +1.164549217e-01f, +1.041707684e-01f, +8.701573182e-02f, +6.696470780e-02f, +4.619193106e-02f, +2.674793129e-02f, +1.027947458e-02f, -2.161062051e-03f, -1.019070962e-02f, -1.405338166e-02f, -1.448058997e-02f, -1.249262075e-02f, -9.184522912e-03f, -5.538436085e-03f, -2.292668918e-03f, +1.180775606e-04f, +1.553712607e-03f, +2.107030888e-03f, +2.013253419e-03f, +1.556105794e-03f, +9.910922559e-04f, +4.981978215e-04f, +1.666919973e-04f, + -5.813561281e-06f, -1.133284398e-05f, -1.620180464e-05f, -1.781101677e-05f, -1.330337920e-05f, -4.569264820e-07f, +2.129469280e-05f, +4.997410040e-05f, +8.060657581e-05f, +1.054530775e-04f, +1.150487184e-04f, +9.997197899e-05f, +5.306025672e-05f, -2.838324597e-05f, -1.409257044e-04f, -2.743726128e-04f, -4.124809731e-04f, -5.350561130e-04f, -6.211542671e-04f, -6.528305431e-04f, -6.186956518e-04f, -5.165258583e-04f, -3.543240851e-04f, -1.495291793e-04f, +7.354870489e-05f, +2.876119077e-04f, +4.668384753e-04f, +5.910587572e-04f, +6.488418893e-04f, +6.389251117e-04f, +5.697733800e-04f, +4.574464721e-04f, +3.222867216e-04f, +1.851491307e-04f, +6.393634822e-05f, -2.892533735e-05f, -8.768629623e-05f, -1.130808466e-04f, -1.109692702e-04f, -9.025683137e-05f, -6.062352435e-05f, -3.055935993e-05f, -6.055495601e-06f, +9.901132222e-06f, +1.708690087e-05f, +1.726936079e-05f, +1.319862861e-05f, +7.651634979e-06f, + +2.076965323e-04f, -6.581575001e-05f, -8.531613762e-04f, -2.178014142e-03f, -3.722104995e-03f, -4.773124002e-03f, -4.371545293e-03f, -1.673047742e-03f, +3.567634980e-03f, +1.058644509e-02f, +1.750256911e-02f, +2.167331351e-02f, +2.050289818e-02f, +1.248718318e-02f, -1.885528901e-03f, -1.978613035e-02f, -3.651293218e-02f, -4.675563429e-02f, -4.630948158e-02f, -3.366269817e-02f, -1.085203550e-02f, +1.680874383e-02f, +4.213656496e-02f, +5.821093566e-02f, +6.052735927e-02f, +4.843083175e-02f, +2.532593735e-02f, -2.410758255e-03f, -2.743274159e-02f, -4.364516329e-02f, -4.790077607e-02f, -4.064617400e-02f, -2.539170344e-02f, -7.293048172e-03f, +8.591360371e-03f, +1.875605810e-02f, +2.198334254e-02f, +1.923301171e-02f, +1.287364666e-02f, +5.637441712e-03f, -2.951738487e-04f, -3.802928100e-03f, -4.849880701e-03f, -4.146222722e-03f, -2.663063435e-03f, -1.216476221e-03f, -2.502828259e-04f, +1.667081918e-04f, + +2.310087044e-06f, +1.553294649e-05f, +3.335695340e-05f, +4.741888520e-05f, +4.540012932e-05f, +1.602804428e-05f, -4.394072422e-05f, -1.237971315e-04f, -1.976271346e-04f, -2.301488361e-04f, -1.892374520e-04f, -6.130794585e-05f, +1.367304729e-04f, +3.552761018e-04f, +5.230026589e-04f, +5.693063191e-04f, +4.512259819e-04f, +1.746698386e-04f, -1.994801026e-04f, -5.689641709e-04f, -8.206558088e-04f, -8.681932613e-04f, -6.832708074e-04f, -3.085858884e-04f, +1.532515671e-04f, +5.717063486e-04f, +8.301719951e-04f, +8.628947198e-04f, +6.740555333e-04f, +3.328692552e-04f, -5.252255007e-05f, -3.720628316e-04f, -5.481226416e-04f, -5.556190707e-04f, -4.225104719e-04f, -2.128717986e-04f, -7.304878903e-07f, +1.549354012e-04f, +2.255890162e-04f, +2.153048015e-04f, +1.515410319e-04f, +7.016336728e-05f, +1.344722690e-06f, -3.879092743e-05f, -4.919501962e-05f, -3.919017456e-05f, -2.144732766e-05f, -6.051943364e-06f, + /* 2,22 (48) */ + +9.365888772e-05f, +3.641014979e-04f, +8.071326683e-04f, +1.363092380e-03f, +1.882989609e-03f, +2.133601595e-03f, +1.833575087e-03f, +7.209299316e-04f, -1.356971328e-03f, -4.349049452e-03f, -7.925996577e-03f, -1.145080542e-02f, -1.401384935e-02f, -1.454009906e-02f, -1.195997046e-02f, -5.418550388e-03f, +5.515297553e-03f, +2.068441184e-02f, +3.926420140e-02f, +5.979624514e-02f, +8.034093452e-02f, +9.873114664e-02f, +1.128866930e-01f, +1.211343400e-01f, +1.224742969e-01f, +1.167425336e-01f, +1.046376069e-01f, +8.760679058e-02f, +6.761354969e-02f, +4.683085617e-02f, +2.731770467e-02f, +1.073692105e-02f, -1.838775330e-03f, -1.000556049e-02f, -1.398944532e-02f, -1.450951531e-02f, -1.258030704e-02f, -9.297603759e-03f, -5.649405355e-03f, -2.382925750e-03f, +5.745403624e-05f, +1.523153247e-03f, +2.100975393e-03f, +2.023154551e-03f, +1.573192694e-03f, +1.008361617e-03f, +5.113964501e-04f, +1.743436322e-04f, + -5.652835814e-06f, -1.115839327e-05f, -1.608400036e-05f, -1.783903691e-05f, -1.356208269e-05f, -9.959741817e-07f, +2.049228958e-05f, +4.901469194e-05f, +7.969070668e-05f, +1.048561792e-04f, +1.150766596e-04f, +1.008970351e-04f, +5.504931606e-05f, -2.533223037e-05f, -1.370223128e-04f, -2.700343538e-04f, -4.082894485e-04f, -5.316725104e-04f, -6.192075126e-04f, -6.527990109e-04f, -6.208066337e-04f, -5.206949552e-04f, -3.601494334e-04f, -1.563444340e-04f, +6.657102488e-05f, +2.813259176e-04f, +4.619852426e-04f, +5.881485482e-04f, +6.480806737e-04f, +6.401981006e-04f, +5.726862885e-04f, +4.614133903e-04f, +3.266445939e-04f, +1.892747545e-04f, +6.734317504e-05f, -2.652715154e-05f, -8.637392289e-05f, -1.127442933e-04f, -1.113674365e-04f, -9.108821130e-05f, -6.159482021e-05f, -3.143828816e-05f, -6.699744060e-06f, +9.540179638e-06f, +1.698114718e-05f, +1.734330956e-05f, +1.336147488e-05f, +7.823934576e-06f, + +2.100066193e-04f, -5.028280352e-05f, -8.198044229e-04f, -2.130595257e-03f, -3.676704865e-03f, -4.757095958e-03f, -4.415486017e-03f, -1.796844873e-03f, +3.370007845e-03f, +1.035629625e-02f, +1.731333166e-02f, +2.161200557e-02f, +2.063962865e-02f, +1.284245928e-02f, -1.362526242e-03f, -1.921682403e-02f, -3.606170620e-02f, -4.658096445e-02f, -4.650896168e-02f, -3.423166234e-02f, -1.167269131e-02f, +1.594055057e-02f, +4.145329415e-02f, +5.790234977e-02f, +6.068061083e-02f, +4.900253810e-02f, +2.615610935e-02f, -1.547863536e-03f, -2.675868606e-02f, -4.331229404e-02f, -4.795329862e-02f, -4.101823683e-02f, -2.593982609e-02f, -7.848667242e-03f, +8.168849899e-03f, +1.854318630e-02f, +2.198261205e-02f, +1.938794711e-02f, +1.309923567e-02f, +5.852746513e-03f, -1.436328168e-04f, -3.732764732e-03f, -4.848535978e-03f, -4.185013649e-03f, -2.712258454e-03f, -1.255666395e-03f, -2.717301535e-04f, +1.606562484e-04f, + +2.014981454e-06f, +1.502147253e-05f, +3.279972542e-05f, +4.715469618e-05f, +4.583162515e-05f, +1.742338539e-05f, -4.166895100e-05f, -1.212240206e-04f, -1.957540069e-04f, -2.301086035e-04f, -1.918318640e-04f, -6.654289323e-05f, +1.298993015e-04f, +3.488187759e-04f, +5.192750907e-04f, +5.702331310e-04f, +4.574898456e-04f, +1.852365655e-04f, -1.872604035e-04f, -5.586417028e-04f, -8.155546947e-04f, -8.702595184e-04f, -6.923216202e-04f, -3.222609165e-04f, +1.387878976e-04f, +5.605432950e-04f, +8.253410091e-04f, +8.654317815e-04f, +6.827583192e-04f, +3.448082387e-04f, -4.095577201e-05f, -3.639684837e-04f, -5.451873476e-04f, -5.577757256e-04f, -4.282163328e-04f, -2.198300360e-04f, -6.743349257e-06f, +1.512972455e-04f, +2.247013900e-04f, +2.166166192e-04f, +1.539847759e-04f, +7.264221312e-05f, +3.103899478e-06f, -3.801476720e-05f, -4.924329868e-05f, -3.968408078e-05f, -2.200596715e-05f, -6.436527589e-06f, + /* 2,23 (48) */ + +8.800605191e-05f, +3.529431046e-04f, +7.910486679e-04f, +1.345253343e-03f, +1.869427526e-03f, +2.132605620e-03f, +1.854067377e-03f, +7.699446236e-04f, -1.277280621e-03f, -4.244193273e-03f, -7.810919917e-03f, -1.134990838e-02f, -1.395880003e-02f, -1.456543129e-02f, -1.209699277e-02f, -5.688584742e-03f, +5.107008105e-03f, +2.015273933e-02f, +3.864499388e-02f, +5.914344613e-02f, +7.972012788e-02f, +9.821045169e-02f, +1.125265436e-01f, +1.209779955e-01f, +1.225408679e-01f, +1.170238595e-01f, +1.050995921e-01f, +8.819493912e-02f, +6.826163036e-02f, +4.747105427e-02f, +2.789039096e-02f, +1.119833444e-02f, -1.512130736e-03f, -9.816285739e-03f, -1.392210214e-02f, -1.453604246e-02f, -1.266668096e-02f, -9.410348052e-03f, -5.760772791e-03f, -2.474013961e-03f, -4.140783970e-06f, +1.491714959e-03f, +2.094275649e-03f, +2.032694731e-03f, +1.590173842e-03f, +1.025704926e-03f, +5.247579250e-04f, +1.821675668e-04f, + -5.493352053e-06f, -1.098344767e-05f, -1.596312552e-05f, -1.786111905e-05f, -1.381255800e-05f, -1.526099187e-06f, +1.969700654e-05f, +4.805762199e-05f, +7.876960845e-05f, +1.042446931e-04f, +1.150805950e-04f, +1.017908016e-04f, +5.700414440e-05f, -2.231235421e-05f, -1.331402544e-04f, -2.657015558e-04f, -4.040834770e-04f, -5.282536639e-04f, -6.172075439e-04f, -6.527026745e-04f, -6.228502412e-04f, -5.248042432e-04f, -3.659319540e-04f, -1.631407655e-04f, +5.958526404e-05f, +2.750061691e-04f, +4.570780681e-04f, +5.851728139e-04f, +6.472524196e-04f, +6.414122198e-04f, +5.755560987e-04f, +4.653573154e-04f, +3.310001687e-04f, +1.934159098e-04f, +7.077796261e-05f, -2.409519724e-05f, -8.502842828e-05f, -1.123803877e-04f, -1.117470784e-04f, -9.191069286e-05f, -6.256567834e-05f, -3.232275977e-05f, -7.352523987e-06f, +9.170467399e-06f, +1.686839873e-05f, +1.741301485e-05f, +1.352285859e-05f, +7.996890882e-06f, + +2.120216008e-04f, -3.526133099e-05f, -7.870046974e-04f, -2.083440561e-03f, -3.630873240e-03f, -4.739672573e-03f, -4.457154968e-03f, -1.918068894e-03f, +3.174253838e-03f, +1.012618765e-02f, +1.712149979e-02f, +2.154546268e-02f, +2.076952795e-02f, +1.319127805e-02f, -8.432511510e-04f, -1.864659090e-02f, -3.560421635e-02f, -4.639572788e-02f, -4.669622208e-02f, -3.479030404e-02f, -1.248824600e-02f, +1.507029105e-02f, +4.076097253e-02f, +5.758008886e-02f, +6.081939873e-02f, +4.956308140e-02f, +2.698145035e-02f, -6.824317540e-04f, -2.607592774e-02f, -4.296748580e-02f, -4.799425439e-02f, -4.138220531e-02f, -2.648501343e-02f, -8.406442968e-03f, +7.740633566e-03f, +1.832335626e-02f, +2.197586870e-02f, +1.953924435e-02f, +1.332393706e-02f, +6.069363132e-03f, +1.035195909e-05f, -3.660122519e-03f, -4.845432079e-03f, -4.223028416e-03f, -2.761501753e-03f, -1.295350476e-03f, -2.937361207e-04f, +1.542197209e-04f, + +1.727423627e-06f, +1.451514763e-05f, +3.223952423e-05f, +4.687515319e-05f, +4.623602683e-05f, +1.878758649e-05f, -3.941848368e-05f, -1.186468676e-04f, -1.938414640e-04f, -2.299959380e-04f, -1.943387355e-04f, -7.170553526e-05f, +1.230920268e-04f, +3.423141883e-04f, +5.154285844e-04f, +5.709959738e-04f, +4.635932335e-04f, +1.957017770e-04f, -1.750406785e-04f, -5.482053006e-04f, -8.102512456e-04f, -8.720925403e-04f, -7.011796411e-04f, -3.358446005e-04f, +1.242847781e-04f, +5.492227019e-04f, +8.202846407e-04f, +8.677457248e-04f, +6.913060890e-04f, +3.567003045e-04f, -2.932498800e-05f, -3.557311946e-04f, -5.420828385e-04f, -5.597904616e-04f, -4.338443485e-04f, -2.267849633e-04f, -1.281257153e-05f, +1.475736432e-04f, +2.237321840e-04f, +2.178744558e-04f, +1.564107476e-04f, +7.513380208e-05f, +4.892127566e-06f, -3.720853147e-05f, -4.927100079e-05f, -4.017029362e-05f, -2.256714189e-05f, -6.828332627e-06f, + /* 2,24 (48) */ + +8.251269985e-05f, +3.419596569e-04f, +7.750855424e-04f, +1.327392224e-03f, +1.855614968e-03f, +2.131079521e-03f, +1.873764383e-03f, +8.180022455e-04f, -1.198511013e-03f, -4.139948580e-03f, -7.695839322e-03f, -1.124811758e-02f, -1.390179589e-02f, -1.458774364e-02f, -1.223013303e-02f, -5.954286298e-03f, +4.702924628e-03f, +1.962448566e-02f, +3.802778634e-02f, +5.849074345e-02f, +7.909727764e-02f, +9.768564744e-02f, +1.121606116e-01f, +1.208148548e-01f, +1.226004532e-01f, +1.172988657e-01f, +1.055566702e-01f, +8.878011194e-02f, +6.890888278e-02f, +4.811246649e-02f, +2.846594706e-02f, +1.166369176e-02f, -1.181130567e-03f, -9.622869830e-03f, -1.385132418e-02f, -1.456013766e-02f, -1.275170939e-02f, -9.522728440e-03f, -5.872519870e-03f, -2.565924654e-03f, -6.670646231e-05f, +1.459392199e-03f, +2.086923125e-03f, +2.041865198e-03f, +1.607042240e-03f, +1.043117941e-03f, +5.382807835e-04f, +1.901644577e-04f, + -5.335147914e-06f, -1.080807602e-05f, -1.583926880e-05f, -1.787734921e-05f, -1.405485785e-05f, -2.047289331e-06f, +1.890894410e-05f, +4.710308517e-05f, +7.784355196e-05f, +1.036189232e-04f, +1.150607986e-04f, +1.026534512e-04f, +5.892474902e-05f, -1.932381540e-05f, -1.292799344e-04f, -2.613747898e-04f, -3.998637126e-04f, -5.248002005e-04f, -6.151548427e-04f, -6.525417699e-04f, -6.248264024e-04f, -5.288533349e-04f, -3.716709945e-04f, -1.699173576e-04f, +5.259226943e-05f, +2.686534011e-04f, +4.521174649e-04f, +5.821317669e-04f, +6.463570208e-04f, +6.425670845e-04f, +5.783822332e-04f, +4.692775907e-04f, +3.353528265e-04f, +1.975721113e-04f, +7.424042003e-05f, -2.162955402e-05f, -8.364970531e-05f, -1.119888913e-04f, -1.121078964e-04f, -9.272398405e-05f, -6.353586705e-05f, -3.321263254e-05f, -8.013786642e-06f, +8.791967543e-06f, +1.674858004e-05f, +1.747838576e-05f, +1.368270014e-05f, +8.170451874e-06f, + +2.137490244e-04f, -2.074618336e-05f, -7.547651732e-04f, -2.036565407e-03f, -3.584637213e-03f, -4.720884986e-03f, -4.496573452e-03f, -2.036715762e-03f, +2.980412374e-03f, +9.896191711e-03f, +1.692716106e-02f, +2.147375714e-02f, +2.089261998e-02f, +1.353359224e-02f, -3.278225666e-04f, -1.807559493e-02f, -3.514062312e-02f, -4.620002611e-02f, -4.687126276e-02f, -3.533850934e-02f, -1.329849725e-02f, +1.419819851e-02f, +4.005979289e-02f, +5.724424426e-02f, +6.094368351e-02f, +5.011230410e-02f, +2.780173499e-02f, +1.853139707e-04f, -2.538462165e-02f, -4.261078550e-02f, -4.802357938e-02f, -4.173793651e-02f, -2.702709627e-02f, -8.966233429e-03f, +7.306789218e-03f, +1.809657130e-02f, +2.196305613e-02f, +1.968681800e-02f, +1.354766925e-02f, +6.287237588e-03f, +1.667627067e-04f, -3.584988717e-03f, -4.840539951e-03f, -4.260236948e-03f, -2.810772754e-03f, -1.335520770e-03f, -3.163032626e-04f, +1.473913882e-04f, + +1.447406595e-06f, +1.401413201e-05f, +3.167668481e-05f, +4.658066683e-05f, +4.661362310e-05f, +2.012058813e-05f, -3.718987259e-05f, -1.160666647e-04f, -1.918906538e-04f, -2.298116804e-04f, -1.967581254e-04f, -7.679487601e-05f, +1.163105947e-04f, +3.357647084e-04f, +5.114651158e-04f, +5.715956042e-04f, +4.695351836e-04f, +2.060628682e-04f, -1.628244780e-04f, -5.376583343e-04f, -8.047474842e-04f, -8.736922246e-04f, -7.098425667e-04f, -3.493331199e-04f, +1.097463270e-04f, +5.377476602e-04f, +8.150039925e-04f, +8.698353975e-04f, +6.996959320e-04f, +3.685418302e-04f, -1.763333493e-05f, -3.473526926e-04f, -5.388090779e-04f, -5.616617465e-04f, -4.393922133e-04f, -2.337343623e-04f, -1.893670441e-05f, +1.437649828e-04f, +2.226808477e-04f, +2.190772355e-04f, +1.588178385e-04f, +7.763737051e-05f, +6.709141053e-06f, -3.637205811e-05f, -4.927774042e-05f, -4.064842614e-05f, -2.313061035e-05f, -7.227298826e-06f, + /* 2,25 (48) */ + +7.717755194e-05f, +3.311515809e-04f, +7.592462736e-04f, +1.309514875e-03f, +1.841560110e-03f, +2.129032232e-03f, +1.892673327e-03f, +8.651053307e-04f, -1.120667461e-03f, -4.036329657e-03f, -7.580778523e-03f, -1.114546413e-02f, -1.384287114e-02f, -1.460706746e-02f, -1.235941296e-02f, -6.215661087e-03f, +4.303060915e-03f, +1.909968546e-02f, +3.741263150e-02f, +5.783820168e-02f, +7.847245124e-02f, +9.715679411e-02f, +1.117889406e-01f, +1.206449374e-01f, +1.226530455e-01f, +1.175675191e-01f, +1.060087877e-01f, +8.936224371e-02f, +6.955523980e-02f, +4.875503357e-02f, +2.904432929e-02f, +1.213296935e-02f, -8.457777408e-04f, -9.425297718e-03f, -1.377708376e-02f, -1.458176721e-02f, -1.283535910e-02f, -9.634717331e-03f, -5.984627766e-03f, -2.658648638e-03f, -1.302423294e-04f, +1.426179567e-03f, +2.078909338e-03f, +2.050657166e-03f, +1.623790820e-03f, +1.060596327e-03f, +5.519634837e-04f, +1.983349096e-04f, + -5.178260298e-06f, -1.063234626e-05f, -1.571251857e-05f, -1.788781391e-05f, -1.428903649e-05f, -2.559534897e-06f, +1.812819973e-05f, +4.615127328e-05f, +7.691280619e-05f, +1.029791733e-04f, +1.150175463e-04f, +1.034851606e-04f, +6.081114311e-05f, -1.636680517e-05f, -1.254417521e-04f, -2.570546224e-04f, -3.956308083e-04f, -5.213127495e-04f, -6.130498973e-04f, -6.523165421e-04f, -6.267350554e-04f, -5.328418520e-04f, -3.773659094e-04f, -1.766733973e-04f, +4.559288931e-05f, +2.622683581e-04f, +4.471039543e-04f, +5.790256297e-04f, +6.453943812e-04f, +6.436623173e-04f, +5.811641189e-04f, +4.731735600e-04f, +3.397019451e-04f, +2.017428681e-04f, +7.773024984e-05f, -1.913030786e-05f, -8.223765199e-05f, -1.115695688e-04f, -1.124495919e-04f, -9.352779174e-05f, -6.450515218e-05f, -3.410776128e-05f, -8.683480529e-06f, +8.404654100e-06f, +1.662161663e-05f, +1.753933143e-05f, +1.384091928e-05f, +8.344564540e-06f, + +2.151964310e-04f, -6.732051356e-06f, -7.230884884e-04f, -1.989984741e-03f, -3.538023590e-03f, -4.700764398e-03f, -4.533763325e-03f, -2.152782426e-03f, +2.788521720e-03f, +9.666380030e-03f, +1.673040293e-02f, +2.139696226e-02f, +2.100893057e-02f, +1.386935695e-02f, +1.836425491e-04f, -1.750399933e-02f, -3.467108794e-02f, -4.599396324e-02f, -4.703408724e-02f, -3.587616768e-02f, -1.410324473e-02f, +1.332450628e-02f, +3.934995032e-02f, +5.689491114e-02f, +6.105342983e-02f, +5.065005176e-02f, +2.861673899e-02f, +1.055149368e-03f, -2.468492572e-02f, -4.224224367e-02f, -4.804121272e-02f, -4.208528920e-02f, -2.756590535e-02f, -9.527895176e-03f, +6.867397005e-03f, +1.786283694e-02f, +2.194411942e-02f, +1.983058298e-02f, +1.377035010e-02f, +6.506314824e-03f, +3.255805452e-04f, -3.507351347e-03f, -4.833830810e-03f, -4.296609006e-03f, -2.860050494e-03f, -1.376169196e-03f, -3.394338729e-04f, +1.401640894e-04f, + +1.174919173e-06f, +1.351858005e-05f, +3.111153756e-05f, +4.627164787e-05f, +4.696471002e-05f, +2.142234465e-05f, -3.498365227e-05f, -1.134843933e-04f, -1.899027257e-04f, -2.295566890e-04f, -1.990901227e-04f, -8.180995317e-05f, +1.095569277e-04f, +3.291727038e-04f, +5.073866860e-04f, +5.720328272e-04f, +4.753147901e-04f, +2.163172775e-04f, -1.506153382e-04f, -5.270041986e-04f, -7.990454901e-04f, -8.750585407e-04f, -7.183081557e-04f, -3.627226851e-04f, +9.517667379e-05f, +5.261213105e-04f, +8.095002376e-04f, +8.716997142e-04f, +7.079249784e-04f, +3.803291967e-04f, -5.883981206e-06f, -3.388347590e-04f, -5.353660836e-04f, -5.633880856e-04f, -4.448576322e-04f, -2.406760000e-04f, -2.511426691e-05f, +1.398716859e-04f, +2.215468551e-04f, +2.202238910e-04f, +1.612049344e-04f, +8.015214039e-05f, +8.554658539e-06f, -3.550519564e-05f, -4.926313550e-05f, -4.111808869e-05f, -2.369612532e-05f, -7.633361304e-06f, + /* 2,26 (48) */ + +7.199929164e-05f, +3.205192346e-04f, +7.435337550e-04f, +1.291627061e-03f, +1.827271074e-03f, +2.126472697e-03f, +1.910801527e-03f, +9.112566040e-04f, -1.043754655e-03f, -3.933350484e-03f, -7.465760977e-03f, -1.104197897e-02f, -1.378205999e-02f, -1.462343426e-02f, -1.248485472e-02f, -6.472715710e-03f, +3.907430107e-03f, +1.857837271e-02f, +3.679958160e-02f, +5.718588514e-02f, +7.784571619e-02f, +9.662395226e-02f, +1.114115747e-01f, +1.204682640e-01f, +1.226986384e-01f, +1.178297874e-01f, +1.064558916e-01f, +8.994126933e-02f, +7.020063419e-02f, +4.939869589e-02f, +2.962549341e-02f, +1.260614291e-02f, -5.060757957e-04f, -9.223554850e-03f, -1.369935351e-02f, -1.460089752e-02f, -1.291759675e-02f, -9.746286900e-03f, -6.097077358e-03f, -2.752176430e-03f, -1.947474815e-04f, +1.392071805e-03f, +2.070225857e-03f, +2.059061820e-03f, +1.640412437e-03f, +1.078135658e-03f, +5.658044030e-04f, +2.066794741e-04f, + -5.022725094e-06f, -1.045632548e-05f, -1.558296283e-05f, -1.789260018e-05f, -1.451514970e-05f, -3.062828592e-06f, +1.735486795e-05f, +4.520237532e-05f, +7.597763824e-05f, +1.023257469e-04f, +1.149511162e-04f, +1.042861110e-04f, +6.266334577e-05f, -1.344150808e-05f, -1.216261004e-04f, -2.527416165e-04f, -3.913854162e-04f, -5.177919432e-04f, -6.108932017e-04f, -6.520272446e-04f, -6.285761486e-04f, -5.367694260e-04f, -3.830160601e-04f, -1.834080748e-04f, +3.858797298e-05f, +2.558517894e-04f, +4.420380662e-04f, +5.758546346e-04f, +6.443644139e-04f, +6.446975487e-04f, +5.839011872e-04f, +4.770445681e-04f, +3.440468994e-04f, +2.059276841e-04f, +8.124714801e-05f, -1.659755120e-05f, -8.079217154e-05f, -1.111221882e-04f, -1.127718672e-04f, -9.432182171e-05f, -6.547329714e-05f, -3.500799781e-05f, -9.361551378e-06f, +8.008503125e-06f, +1.648743506e-05f, +1.759576105e-05f, +1.399743514e-05f, +8.519174888e-06f, + +2.163713502e-04f, +6.786528698e-06f, -6.919769508e-04f, -1.943713093e-03f, -3.491058880e-03f, -4.679342053e-03f, -4.568746977e-03f, -2.266266820e-03f, +2.598618995e-03f, +9.436823341e-03f, +1.653131281e-02f, +2.131515231e-02f, +2.111848750e-02f, +1.419852965e-02f, +6.910292352e-04f, -1.693196650e-02f, -3.419577315e-02f, -4.577764596e-02f, -4.718470258e-02f, -3.640317188e-02f, -1.490229022e-02f, +1.244944774e-02f, +3.863164217e-02f, +5.653218845e-02f, +6.114860651e-02f, +5.117617307e-02f, +2.942623922e-02f, +1.926849082e-03f, -2.397700074e-02f, -4.186191447e-02f, -4.804709670e-02f, -4.242412396e-02f, -2.810127143e-02f, -1.009128326e-02f, +6.422539372e-03f, +1.762216094e-02f, +2.191900516e-02f, +1.997045467e-02f, +1.399189695e-02f, +6.726538715e-03f, +4.867854796e-04f, -3.427199206e-03f, -4.825276152e-03f, -4.332114202e-03f, -2.909313630e-03f, -1.417287284e-03f, -3.631299982e-04f, +1.325307281e-04f, + +9.099460397e-07f, +1.302864034e-05f, +3.054440828e-05f, +4.594850717e-05f, +4.728959078e-05f, +2.269282404e-05f, -3.280034141e-05f, -1.109010239e-04f, -1.878788303e-04f, -2.292318388e-04f, -2.013348463e-04f, -8.674983814e-05f, +1.028329237e-04f, +3.225405397e-04f, +5.031953214e-04f, +5.723084953e-04f, +4.809312030e-04f, +2.264624880e-04f, -1.384167806e-04f, -5.162463108e-04f, -7.931473988e-04f, -8.761915298e-04f, -7.265742297e-04f, -3.760095383e-04f, +8.057995834e-05f, +5.143468419e-04f, +8.037746187e-04f, +8.733376566e-04f, +7.159904009e-04f, +3.920587902e-04f, +5.919874154e-06f, -3.301792273e-04f, -5.317539276e-04f, -5.649680224e-04f, -4.502383222e-04f, -2.476076295e-04f, -3.134374756e-05f, +1.358942076e-04f, +2.203297043e-04f, +2.213133645e-04f, +1.635709156e-04f, +8.267731948e-05f, +1.042838306e-05f, -3.460780348e-05f, -4.922680759e-05f, -4.157888904e-05f, -2.426343398e-05f, -8.046449887e-06f, + /* 2,27 (48) */ + +6.697656655e-05f, +3.100629092e-04f, +7.279507922e-04f, +1.273734461e-03f, +1.812755924e-03f, +2.123409868e-03f, +1.928156395e-03f, +9.564589793e-04f, -9.677770163e-04f, -3.831024737e-03f, -7.350809861e-03f, -1.093769286e-02f, -1.371939665e-02f, -1.463687577e-02f, -1.260648082e-02f, -6.725457326e-03f, +3.516044690e-03f, +1.806058077e-02f, +3.618868840e-02f, +5.653385790e-02f, +7.721714004e-02f, +9.608718283e-02f, +1.110285586e-01f, +1.202848560e-01f, +1.227372263e-01f, +1.180856392e-01f, +1.068979297e-01f, +9.051712397e-02f, +7.084499860e-02f, +5.004339344e-02f, +3.020939460e-02f, +1.308318748e-02f, -1.620288963e-04f, -9.017627166e-03f, -1.361810636e-02f, -1.461749507e-02f, -1.299838892e-02f, -9.857409088e-03f, -6.209849225e-03f, -2.846498251e-03f, -2.602207787e-04f, +1.357063808e-03f, +2.060864306e-03f, +2.067070323e-03f, +1.656899872e-03f, +1.095731419e-03f, +5.798018381e-04f, +2.151986490e-04f, + -4.868577177e-06f, -1.028007989e-05f, -1.545068921e-05f, -1.789179549e-05f, -1.473325471e-05f, -3.557165526e-06f, +1.658904033e-05f, +4.425657742e-05f, +7.503831325e-05f, +1.016589473e-04f, +1.148617881e-04f, +1.050564873e-04f, +6.448138195e-05f, -1.054810206e-05f, -1.178333665e-04f, -2.484363303e-04f, -3.871281868e-04f, -5.142384158e-04f, -6.086852563e-04f, -6.516741400e-04f, -6.303496402e-04f, -5.406356977e-04f, -3.886208156e-04f, -1.901205840e-04f, +3.157837062e-05f, +2.494044498e-04f, +4.369203387e-04f, +5.726190240e-04f, +6.432670421e-04f, +6.456724169e-04f, +5.865928741e-04f, +4.808899607e-04f, +3.483870618e-04f, +2.101260580e-04f, +8.479080402e-05f, -1.403138297e-05f, -7.931317237e-05f, -1.106465203e-04f, -1.130744256e-04f, -9.510577867e-05f, -6.644006295e-05f, -3.591319099e-05f, -1.004794213e-05f, +7.603492727e-06f, +1.634596290e-05f, +1.764758391e-05f, +1.415216617e-05f, +8.694227944e-06f, + +2.172812962e-04f, +1.981516904e-05f, -6.614325425e-04f, -1.897764586e-03f, -3.443769290e-03f, -4.656649229e-03f, -4.601547318e-03f, -2.377167844e-03f, +2.410740164e-03f, +9.207591503e-03f, +1.632997796e-02f, +2.122840247e-02f, +2.122132042e-02f, +1.452107019e-02f, +1.194224557e-03f, -1.635965800e-02f, -3.371484194e-02f, -4.555118347e-02f, -4.732311936e-02f, -3.691941819e-02f, -1.569543762e-02f, +1.157325621e-02f, +3.790506794e-02f, +5.615617891e-02f, +6.122918647e-02f, +5.169051991e-02f, +3.023001384e-02f, +2.800186739e-03f, -2.326101034e-02f, -4.146985568e-02f, -4.804117682e-02f, -4.275430318e-02f, -2.863302536e-02f, -1.065625128e-02f, +5.972301050e-03f, +1.737455331e-02f, +2.188766141e-02f, +2.010634887e-02f, +1.421222665e-02f, +6.947852079e-03f, +6.503563952e-04f, -3.344521887e-03f, -4.814847769e-03f, -4.366722005e-03f, -2.958540437e-03f, -1.458866173e-03f, -3.873934322e-04f, +1.244842782e-04f, + +6.524678118e-07f, +1.254445566e-05f, +2.997561797e-05f, +4.561165540e-05f, +4.758857544e-05f, +2.393200775e-05f, -3.064044285e-05f, -1.083175159e-04f, -1.858201188e-04f, -2.288380210e-04f, -2.034924447e-04f, -9.161363612e-05f, +9.614045620e-05f, +3.158705776e-04f, +4.988930718e-04f, +5.724235080e-04f, +4.863836286e-04f, +2.364960278e-04f, -1.262323105e-04f, -5.053881103e-04f, -7.870554015e-04f, -8.770913041e-04f, -7.346386734e-04f, -3.891899554e-04f, +6.596032919e-05f, +5.024274914e-04f, +7.978284485e-04f, +8.747482740e-04f, +7.238894151e-04f, +4.037270028e-04f, +1.777500250e-05f, -3.213879831e-04f, -5.279727365e-04f, -5.664001392e-04f, -4.555320128e-04f, -2.545269905e-04f, -3.762360484e-05f, +1.318330365e-04f, +2.190289187e-04f, +2.223446079e-04f, +1.659146577e-04f, +8.521210150e-05f, +1.233000201e-05f, -3.367975215e-05f, -4.916838214e-05f, -4.203043254e-05f, -2.483227790e-05f, -8.466489063e-06f, + /* 2,28 (48) */ + +6.210798937e-05f, +2.997828293e-04f, +7.125001030e-04f, +1.255842665e-03f, +1.798022669e-03f, +2.119852703e-03f, +1.944745435e-03f, +1.000715557e-03f, -8.927387031e-04f, -3.729365789e-03f, -7.235948073e-03f, -1.083263637e-02f, -1.365491527e-02f, -1.464742387e-02f, -1.272431418e-02f, -6.973893657e-03f, +3.128916504e-03f, +1.754634235e-02f, +3.558000314e-02f, +5.588218376e-02f, +7.658679040e-02f, +9.554654713e-02f, +1.106399378e-01f, +1.200947354e-01f, +1.227688047e-01f, +1.183350437e-01f, +1.073348500e-01f, +9.108974299e-02f, +7.148826564e-02f, +5.068906585e-02f, +3.079598747e-02f, +1.356407744e-02f, +1.863581655e-04f, -8.807501108e-03f, -1.353331556e-02f, -1.463152645e-02f, -1.307770209e-02f, -9.968055609e-03f, -6.322923651e-03f, -2.941604030e-03f, -3.266608416e-04f, +1.321150617e-03f, +2.050816364e-03f, +2.074673816e-03f, +1.673245835e-03f, +1.113379003e-03f, +5.939540043e-04f, +2.238928769e-04f, + -4.715850413e-06f, -1.010367479e-05f, -1.531578494e-05f, -1.788548775e-05f, -1.494341021e-05f, -4.042543184e-06f, +1.583080551e-05f, +4.331406289e-05f, +7.409509441e-05f, +1.009790774e-04f, +1.147498435e-04f, +1.057964787e-04f, +6.626528240e-05f, -7.686758355e-06f, -1.140639309e-04f, -2.441393179e-04f, -3.828597697e-04f, -5.106528043e-04f, -6.064265671e-04f, -6.512574993e-04f, -6.320554984e-04f, -5.444403173e-04f, -3.941795518e-04f, -1.968101222e-04f, +2.456493322e-05f, +2.429270989e-04f, +4.317513181e-04f, +5.693190501e-04f, +6.421021986e-04f, +6.465865679e-04f, +5.892386203e-04f, +4.847090843e-04f, +3.527218023e-04f, +2.143374835e-04f, +8.836090079e-05f, -1.143190856e-05f, -7.780056820e-05f, -1.101423396e-04f, -1.133569712e-04f, -9.587936640e-05f, -6.740520824e-05f, -3.682318671e-05f, -1.074259293e-05f, +7.189603096e-06f, +1.619712886e-05f, +1.769470941e-05f, +1.430503026e-05f, +8.869667763e-06f, + +2.179337640e-04f, +3.235962470e-05f, -6.314569246e-04f, -1.852152930e-03f, -3.396180714e-03f, -4.632717222e-03f, -4.632187761e-03f, -2.485485359e-03f, +2.224920046e-03f, +8.978753482e-03f, +1.612648552e-02f, +2.113678884e-02f, +2.131746088e-02f, +1.483694077e-02f, +1.693117628e-03f, -1.578723449e-02f, -3.322845831e-02f, -4.531468744e-02f, -4.744935167e-02f, -3.742480630e-02f, -1.648249302e-02f, +1.069616491e-02f, +3.717042926e-02f, +5.576698896e-02f, +6.129514680e-02f, +5.219294740e-02f, +3.102784229e-02f, +3.674935013e-03f, -2.253712093e-02f, -4.106612868e-02f, -4.802340182e-02f, -4.307569117e-02f, -2.916099810e-02f, -1.122265142e-02f, +5.516769037e-03f, +1.712002632e-02f, +2.185003780e-02f, +2.023818191e-02f, +1.443125557e-02f, +7.170196687e-03f, +8.162710528e-04f, -3.259309785e-03f, -4.802517767e-03f, -4.400401757e-03f, -3.007708819e-03f, -1.500896606e-03f, -4.122257101e-04f, +1.160177891e-04f, + +4.024611317e-07f, +1.206616299e-05f, +2.940548286e-05f, +4.526150288e-05f, +4.786198073e-05f, +2.513989055e-05f, -2.850444351e-05f, -1.057348169e-04f, -1.837277423e-04f, -2.283761428e-04f, -2.055630957e-04f, -9.640048616e-05f, +8.948137306e-05f, +3.091651753e-04f, +4.944820104e-04f, +5.723788116e-04f, +4.916713289e-04f, +2.464154710e-04f, -1.140654159e-04f, -4.944330571e-04f, -7.807717433e-04f, -8.777580473e-04f, -7.424994357e-04f, -4.022602460e-04f, +5.132194230e-05f, +4.903665421e-04f, +7.916631086e-04f, +8.759306836e-04f, +7.316192808e-04f, +4.153302342e-04f, +2.967814651e-05f, -3.124629637e-04f, -5.240226921e-04f, -5.676830579e-04f, -4.607364475e-04f, -2.614318102e-04f, -4.395226739e-05f, +1.276886948e-04f, +2.176440466e-04f, +2.233165834e-04f, +1.682350316e-04f, +8.775566630e-05f, +1.425918711e-05f, -3.272092345e-05f, -4.908748870e-05f, -4.247232228e-05f, -2.540239313e-05f, -8.893397928e-06f, + /* 2,29 (48) */ + +5.739213896e-05f, +2.896791545e-04f, +6.971843180e-04f, +1.237957178e-03f, +1.783079259e-03f, +2.115810160e-03f, +1.960576241e-03f, +1.044029620e-03f, -8.186436087e-04f, -3.628386712e-03f, -7.121198229e-03f, -1.072683989e-02f, -1.358864998e-02f, -1.465511063e-02f, -1.283837811e-02f, -7.218032974e-03f, +2.746056734e-03f, +1.703568955e-02f, +3.497357657e-02f, +5.523092626e-02f, +7.595473490e-02f, +9.500210682e-02f, +1.102457583e-01f, +1.198979252e-01f, +1.227933696e-01f, +1.185779707e-01f, +1.077666013e-01f, +9.165906204e-02f, +7.213036784e-02f, +5.133565242e-02f, +3.138522609e-02f, +1.404878652e-02f, +5.390799677e-04f, -8.593163625e-03f, -1.344495466e-02f, -1.464295836e-02f, -1.315550266e-02f, -1.007819795e-02f, -6.436280622e-03f, -3.037483396e-03f, -3.940660499e-04f, +1.284327430e-03f, +2.040073771e-03f, +2.081863419e-03f, +1.689442964e-03f, +1.131073713e-03f, +6.082590345e-04f, +2.327625447e-04f, + -4.564577659e-06f, -9.927174596e-06f, -1.517833682e-05f, -1.787376529e-05f, -1.514567628e-05f, -4.518961403e-06f, +1.508024918e-05f, +4.237501215e-05f, +7.314824287e-05f, +1.002864397e-04f, +1.146155658e-04f, +1.065062782e-04f, +6.801508365e-05f, -4.857641601e-06f, -1.103181681e-04f, -2.398511288e-04f, -3.785808125e-04f, -5.070357475e-04f, -6.041176459e-04f, -6.507776023e-04f, -6.336937015e-04f, -5.481829449e-04f, -3.996916520e-04f, -2.034758906e-04f, +1.754851234e-05f, +2.364205011e-04f, +4.265315589e-04f, +5.659549751e-04f, +6.408698258e-04f, +6.474396557e-04f, +5.918378714e-04f, +4.885012868e-04f, +3.570504884e-04f, +2.185614491e-04f, +9.195711480e-05f, -8.799239900e-06f, -7.625427805e-05f, -1.096094236e-04f, -1.136192096e-04f, -9.664228773e-05f, -6.836848933e-05f, -3.773782790e-05f, -1.144544108e-05f, +6.766816532e-06f, +1.604086273e-05f, +1.773704708e-05f, +1.445594466e-05f, +9.045437432e-06f, + +2.183362251e-04f, +4.442578769e-05f, -6.020514417e-04f, -1.806891427e-03f, -3.348318733e-03f, -4.607577331e-03f, -4.660692205e-03f, -2.591220176e-03f, +2.041192303e-03f, +8.750377339e-03f, +1.592092242e-02f, +2.104038835e-02f, +2.140694225e-02f, +1.514610595e-02f, +2.187599639e-03f, -1.521485568e-02f, -3.273678699e-02f, -4.506827197e-02f, -4.756341708e-02f, -3.791923935e-02f, -1.726326477e-02f, +9.818406863e-03f, +3.642792983e-02f, +5.536472871e-02f, +6.134646874e-02f, +5.268331394e-02f, +3.181950540e-02f, +4.550865697e-03f, -2.180550164e-02f, -4.065079844e-02f, -4.799372367e-02f, -4.338815413e-02f, -2.968502079e-02f, -1.179033448e-02f, +5.056032590e-03f, +1.685859451e-02f, +2.180608554e-02f, +2.036587060e-02f, +1.464889962e-02f, +7.393513271e-03f, +9.845060845e-04f, -3.171554119e-03f, -4.788258580e-03f, -4.433122681e-03f, -3.056796308e-03f, -1.543368928e-03f, -4.376281033e-04f, +1.071243912e-04f, + +1.598987474e-07f, +1.159389361e-05f, +2.883431423e-05f, +4.489845939e-05f, +4.811012979e-05f, +2.631648037e-05f, -2.639281442e-05f, -1.031538630e-04f, -1.816028521e-04f, -2.278471264e-04f, -2.075470058e-04f, -1.011095612e-04f, +8.285749660e-05f, +3.024266850e-04f, +4.899642325e-04f, +5.721753980e-04f, +4.967936220e-04f, +2.562184377e-04f, -1.019195666e-04f, -4.833846306e-04f, -7.742987235e-04f, -8.781920142e-04f, -7.501545301e-04f, -4.152167559e-04f, +3.666895974e-05f, +4.781673233e-04f, +7.852800500e-04f, +8.768840711e-04f, +7.391773030e-04f, +4.268648926e-04f, +4.162602116e-05f, -3.034061574e-04f, -5.199040306e-04f, -5.688154408e-04f, -4.658493838e-04f, -2.683198039e-04f, -5.032813447e-05f, +1.234617384e-04f, +2.161746624e-04f, +2.242282643e-04f, +1.705309043e-04f, +9.030718001e-05f, +1.621559433e-05f, -3.173121068e-05f, -4.898376114e-05f, -4.290415923e-05f, -2.597351020e-05f, -9.327090145e-06f, + /* 2,30 (48) */ + +5.282756130e-05f, +2.797519799e-04f, +6.820059812e-04f, +1.220083412e-03f, +1.767933583e-03f, +2.111291198e-03f, +1.975656490e-03f, +1.086404632e-03f, -7.454953658e-04f, -3.528100272e-03f, -7.006582663e-03f, -1.062033362e-02f, -1.352063490e-02f, -1.465996827e-02f, -1.294869628e-02f, -7.457884103e-03f, +2.367475921e-03f, +1.652865380e-02f, +3.436945893e-02f, +5.458014866e-02f, +7.532104120e-02f, +9.445392387e-02f, +1.098460666e-01f, +1.196944494e-01f, +1.228109182e-01f, +1.188143913e-01f, +1.081931329e-01f, +9.222501702e-02f, +7.277123767e-02f, +5.198309208e-02f, +3.197706396e-02f, +1.453728781e-02f, +8.961304561e-04f, -8.374602175e-03f, -1.335299754e-02f, -1.465175760e-02f, -1.323175694e-02f, -1.018780737e-02f, -6.549899832e-03f, -3.134125684e-03f, -4.624345392e-04f, +1.246589602e-03f, +2.028628330e-03f, +2.088630235e-03f, +1.705483827e-03f, +1.148810760e-03f, +6.227149792e-04f, +2.418079821e-04f, + -4.414790764e-06f, -9.750642811e-06f, -1.503843121e-05f, -1.785671677e-05f, -1.534011438e-05f, -4.986422344e-06f, +1.433745413e-05f, +4.143960274e-05f, +7.219801774e-05f, +9.958133640e-05f, +1.144592400e-04f, +1.071860828e-04f, +6.973082794e-05f, -2.060909781e-06f, -1.065964465e-04f, -2.355723082e-04f, -3.742919618e-04f, -5.033878865e-04f, -6.017590106e-04f, -6.502347371e-04f, -6.352642376e-04f, -5.518632500e-04f, -4.051565071e-04f, -2.101170941e-04f, +1.052996006e-05f, +2.298854257e-04f, +4.212616238e-04f, +5.625270708e-04f, +6.395698761e-04f, +6.482313423e-04f, +5.943900778e-04f, +4.922659171e-04f, +3.613724853e-04f, +2.227974382e-04f, +9.557911602e-05f, -6.133495444e-06f, -7.467422635e-05f, -1.090475536e-04f, -1.138608472e-04f, -9.739424462e-05f, -6.932966021e-05f, -3.865695453e-05f, -1.215642107e-05f, +6.335117472e-06f, +1.587709547e-05f, +1.777450663e-05f, +1.460482609e-05f, +9.221479075e-06f, + +2.184961239e-04f, +5.601968130e-05f, -5.732171275e-04f, -1.761992968e-03f, -3.300208604e-03f, -4.581260851e-03f, -4.687085019e-03f, -2.694374039e-03f, +1.859589451e-03f, +8.522530212e-03f, +1.571337542e-02f, +2.093927879e-02f, +2.148979975e-02f, +1.544853263e-02f, +2.677563871e-03f, -1.464268029e-02f, -3.223999336e-02f, -4.481205354e-02f, -4.766533665e-02f, -3.840262399e-02f, -1.803756349e-02f, +8.940214849e-03f, +3.567777530e-02f, +5.494951196e-02f, +6.138313770e-02f, +5.316148127e-02f, +3.260478545e-02f, +5.427749768e-03f, -2.106632434e-02f, -4.022393355e-02f, -4.795209765e-02f, -4.369156029e-02f, -3.020492482e-02f, -1.235914992e-02f, +4.590183206e-03f, +1.659027470e-02f, +2.175575740e-02f, +2.048933234e-02f, +1.486507428e-02f, +7.617741535e-03f, +1.155036989e-03f, -3.081246939e-03f, -4.772042985e-03f, -4.464853891e-03f, -3.105780069e-03f, -1.586273087e-03f, -4.636016135e-04f, +9.779730107e-05f, + -7.525040422e-08f, +1.112777301e-05f, +2.826241838e-05f, +4.452293401e-05f, +4.833335192e-05f, +2.746179810e-05f, -2.430601068e-05f, -1.005755783e-04f, -1.794465983e-04f, -2.272519091e-04f, -2.094444104e-04f, -1.057400680e-04f, +7.627062286e-05f, +2.956574536e-04f, +4.853418550e-04f, +5.718143049e-04f, +5.017498821e-04f, +2.659025952e-04f, -8.979821280e-05f, -4.722463287e-04f, -7.676386936e-04f, -8.783935306e-04f, -7.576020354e-04f, -4.280558673e-04f, +2.200554834e-05f, +4.658332083e-04f, +7.786807920e-04f, +8.776076910e-04f, +7.465608329e-04f, +4.383273960e-04f, +5.361531476e-05f, -2.942196033e-04f, -5.156170440e-04f, -5.697959909e-04f, -4.708685948e-04f, -2.751886761e-04f, -5.674957623e-05f, +1.191527570e-04f, +2.146203664e-04f, +2.250786348e-04f, +1.728011389e-04f, +9.286579528e-05f, +1.819886387e-05f, -3.071051883e-05f, -4.885683791e-05f, -4.332554241e-05f, -2.654535421e-05f, -9.767473893e-06f, + /* 2,31 (48) */ + +4.841277053e-05f, +2.700013371e-04f, +6.669675500e-04f, +1.202226696e-03f, +1.752593469e-03f, +2.106304776e-03f, +1.989993944e-03f, +1.127844235e-03f, -6.732973481e-04f, -3.428518936e-03f, -6.892123423e-03f, -1.051314753e-02f, -1.345090407e-02f, -1.466202918e-02f, -1.305529273e-02f, -7.693456411e-03f, +1.993183960e-03f, +1.602526591e-02f, +3.376769992e-02f, +5.392991392e-02f, +7.468577696e-02f, +9.390206062e-02f, +1.094409101e-01f, +1.194843323e-01f, +1.228214481e-01f, +1.190442767e-01f, +1.086143945e-01f, +9.278754409e-02f, +7.341080754e-02f, +5.263132342e-02f, +3.257145404e-02f, +1.502955372e-02f, +1.257502941e-03f, -8.151804737e-03f, -1.325741842e-02f, -1.465789110e-02f, -1.330643117e-02f, -1.029685493e-02f, -6.663760679e-03f, -3.231519929e-03f, -5.317641994e-04f, +1.207932647e-03f, +2.016471909e-03f, +2.094965353e-03f, +1.721360922e-03f, +1.166585266e-03f, +6.373198053e-04f, +2.510294612e-04f, + -4.266520574e-06f, -9.574142015e-06f, -1.489615403e-05f, -1.783443122e-05f, -1.552678732e-05f, -5.444930471e-06f, +1.360250026e-05f, +4.050800932e-05f, +7.124467603e-05f, +9.886406891e-05f, +1.142811527e-04f, +1.078360932e-04f, +7.141256319e-05f, +7.032857366e-07f, -1.028991279e-04f, -2.313033964e-04f, -3.699938620e-04f, -4.997098643e-04f, -5.993511841e-04f, -6.496292006e-04f, -6.367671050e-04f, -5.554809118e-04f, -4.105735155e-04f, -2.167329417e-04f, +3.510128802e-06f, +2.233226464e-04f, +4.159420831e-04f, +5.590356192e-04f, +6.382023119e-04f, +6.489612978e-04f, +5.968946951e-04f, +4.960023257e-04f, +3.656871562e-04f, +2.270449294e-04f, +9.922656802e-05f, -3.434800198e-06f, -7.306034295e-05f, -1.084565141e-04f, -1.140815919e-04f, -9.813493822e-05f, -7.028847262e-05f, -3.958040364e-05f, -1.287546454e-05f, +5.894492519e-06f, +1.570575921e-05f, +1.780699796e-05f, +1.475159068e-05f, +9.397733863e-06f, + +2.184208735e-04f, +6.714745431e-05f, -5.449547091e-04f, -1.717470034e-03f, -3.251875252e-03f, -4.553799053e-03f, -4.711391030e-03f, -2.794949618e-03f, +1.680142853e-03f, +8.295278303e-03f, +1.550393101e-02f, +2.083353872e-02f, +2.156607037e-02f, +1.574419009e-02f, +3.162905726e-03f, -1.407086598e-02f, -3.173824348e-02f, -4.454615094e-02f, -4.775513486e-02f, -3.887487031e-02f, -1.880520218e-02f, +8.061821318e-03f, +3.492017326e-02f, +5.452145609e-02f, +6.140514325e-02f, +5.362731448e-02f, +3.338346624e-02f, +6.305357459e-03f, -2.031976351e-02f, -3.978560615e-02f, -4.789848234e-02f, -4.398577989e-02f, -3.072054186e-02f, -1.292894591e-02f, +4.119314611e-03f, +1.631508603e-02f, +2.169900783e-02f, +2.060848510e-02f, +1.507969465e-02f, +7.842820170e-03f, +1.327838128e-03f, -2.988381144e-03f, -4.753844121e-03f, -4.495564410e-03f, -3.154636907e-03f, -1.629598630e-03f, -4.901469677e-04f, +8.802982718e-05f, + -3.030211128e-07f, +1.066792104e-05f, +2.769009656e-05f, +4.413533489e-05f, +4.853198241e-05f, +2.857587745e-05f, -2.224447147e-05f, -9.800087468e-05f, -1.772601301e-04f, -2.265914423e-04f, -2.112555732e-04f, -1.102912474e-04f, +6.972252126e-05f, +2.888598211e-04f, +4.806170152e-04f, +5.712966145e-04f, +5.065395392e-04f, +2.754656586e-04f, -7.770478446e-05f, -4.610216661e-04f, -7.607940572e-04f, -8.783629926e-04f, -7.648400958e-04f, -4.407740003e-04f, +7.335878262e-06f, +4.533676142e-04f, +7.718669222e-04f, +8.781008671e-04f, +7.537672688e-04f, +4.497141734e-04f, +6.564268988e-05f, -2.849053907e-04f, -5.111620793e-04f, -5.706234531e-04f, -4.757918698e-04f, -2.820361204e-04f, -6.321493412e-05f, +1.147623742e-04f, +2.129807855e-04f, +2.258666913e-04f, +1.750445952e-04f, +9.543065144e-05f, +2.020862008e-05f, -2.965876477e-05f, -4.870636224e-05f, -4.373606909e-05f, -2.711764488e-05f, -1.021445183e-05f, + /* 3, 0 (48) */ + +3.382425704e-04f, +1.348067834e-04f, -4.889424346e-04f, -1.466276588e-03f, -2.424363330e-03f, -2.730039057e-03f, -1.724598248e-03f, +9.008300509e-04f, +4.739031994e-03f, +8.514833164e-03f, +1.031793603e-02f, +8.256301383e-03f, +1.371724009e-03f, -9.514669115e-03f, -2.142432917e-02f, -2.960851385e-02f, -2.874512923e-02f, -1.466449091e-02f, +1.394439274e-02f, +5.448301361e-02f, +1.005300380e-01f, +1.431856698e-01f, +1.733482814e-01f, +1.842374374e-01f, +1.733482814e-01f, +1.431856698e-01f, +1.005300380e-01f, +5.448301361e-02f, +1.394439274e-02f, -1.466449091e-02f, -2.874512923e-02f, -2.960851385e-02f, -2.142432917e-02f, -9.514669115e-03f, +1.371724009e-03f, +8.256301383e-03f, +1.031793603e-02f, +8.514833164e-03f, +4.739031994e-03f, +9.008300509e-04f, -1.724598248e-03f, -2.730039057e-03f, -2.424363330e-03f, -1.466276588e-03f, -4.889424346e-04f, +1.348067834e-04f, +3.382425704e-04f, +2.622641023e-04f, + +8.167179641e-07f, +1.236605420e-05f, +2.592907112e-05f, +3.300060303e-05f, +2.376427225e-05f, -7.333155539e-06f, -5.585024780e-05f, -1.047561226e-04f, -1.277317531e-04f, -9.889919355e-05f, -6.305860108e-06f, +1.362752771e-04f, +2.854709206e-04f, +3.765653018e-04f, +3.435785237e-04f, +1.454749231e-04f, -2.110969350e-04f, -6.625373850e-04f, -1.098675471e-03f, -1.391969581e-03f, -1.437136486e-03f, -1.187809005e-03f, -6.766902606e-04f, -1.084600706e-05f, +6.575069420e-04f, +1.175413611e-03f, +1.433843904e-03f, +1.397561162e-03f, +1.110650867e-03f, +6.770559685e-04f, +2.242442057e-04f, -1.365456772e-04f, -3.399932180e-04f, -3.777178872e-04f, -2.895631068e-04f, -1.411350845e-04f, +2.455154195e-06f, +9.697442048e-05f, +1.277273734e-04f, +1.060154541e-04f, +5.749286536e-05f, +8.641971212e-06f, -2.313094698e-05f, -3.300519509e-05f, -2.630090367e-05f, -1.279394254e-05f, -1.093779023e-06f, +4.569541687e-06f, + -7.823217465e-04f, -9.084685290e-04f, -9.527730581e-05f, +1.939581772e-03f, +4.521325238e-03f, +5.889778654e-03f, +3.972523948e-03f, -2.097746258e-03f, -1.059839761e-02f, -1.714075782e-02f, -1.654476645e-02f, -6.064599171e-03f, +1.185220802e-02f, +2.935028356e-02f, +3.641246564e-02f, +2.636698292e-02f, +6.586074871e-04f, -3.028063400e-02f, -5.133665227e-02f, -5.043564613e-02f, -2.556515975e-02f, +1.309926646e-02f, +4.764810534e-02f, +6.141247912e-02f, +4.764810534e-02f, +1.309926646e-02f, -2.556515975e-02f, -5.043564613e-02f, -5.133665227e-02f, -3.028063400e-02f, +6.586074871e-04f, +2.636698292e-02f, +3.641246564e-02f, +2.935028356e-02f, +1.185220802e-02f, -6.064599171e-03f, -1.654476645e-02f, -1.714075782e-02f, -1.059839761e-02f, -2.097746258e-03f, +3.972523948e-03f, +5.889778654e-03f, +4.521325238e-03f, +1.939581772e-03f, -9.527730581e-05f, -9.084685290e-04f, -7.823217465e-04f, -3.493719860e-04f, + +1.207582970e-05f, -7.181807980e-06f, -4.436800841e-05f, -7.843946816e-05f, -7.358044464e-05f, -2.500652728e-06f, +1.238811450e-04f, +2.431713521e-04f, +2.638049775e-04f, +1.207343630e-04f, -1.652856064e-04f, -4.682220434e-04f, -6.050322369e-04f, -4.385471672e-04f, +2.078504744e-05f, +5.833325336e-04f, +9.558098825e-04f, +8.968475170e-04f, +3.682537994e-04f, -4.129216663e-04f, -1.066580545e-03f, -1.246399629e-03f, -8.336386060e-04f, -1.403262768e-05f, +8.124734222e-04f, +1.242276557e-03f, +1.080734367e-03f, +4.373988820e-04f, -3.459355243e-04f, -8.869413989e-04f, -9.613405219e-04f, -5.994210138e-04f, -3.819750226e-05f, +4.280763606e-04f, +6.048271801e-04f, +4.759656788e-04f, +1.753901006e-04f, -1.135609871e-04f, -2.619740203e-04f, -2.457850786e-04f, -1.281625351e-04f, -8.067819448e-07f, +7.243049474e-05f, +7.907266217e-05f, +4.564423467e-05f, +8.126265744e-06f, -1.179589871e-05f, -1.279054036e-05f, + /* 3, 1 (48) */ + +3.390592884e-04f, +1.471728376e-04f, -4.630133635e-04f, -1.433275985e-03f, -2.400599057e-03f, -2.737372213e-03f, -1.780448496e-03f, +7.960739283e-04f, +4.611300241e-03f, +8.415933970e-03f, +1.031163017e-02f, +8.392576660e-03f, +1.657194930e-03f, -9.138103813e-03f, -2.108075065e-02f, -2.946303892e-02f, -2.895622617e-02f, -1.532702830e-02f, +1.284571727e-02f, +5.309104403e-02f, +9.909290155e-02f, +1.419978608e-01f, +1.726715912e-01f, +1.842265914e-01f, +1.740057884e-01f, +1.443610834e-01f, +1.019638819e-01f, +5.588057478e-02f, +1.505504361e-02f, -1.398743494e-02f, -2.852088503e-02f, -2.974505952e-02f, -2.176432239e-02f, -9.892387002e-03f, +1.082160902e-03f, +8.115166299e-03f, +1.032039119e-02f, +8.611807584e-03f, +4.866759367e-03f, +1.006845505e-03f, -1.667105383e-03f, -2.721397086e-03f, -2.447494277e-03f, -1.499281783e-03f, -5.152433383e-04f, +1.220128409e-04f, +3.371487914e-04f, +2.668336440e-04f, + +5.459948177e-07f, +1.194052812e-05f, +2.555103579e-05f, +3.297974244e-05f, +2.437540135e-05f, -6.042442799e-06f, -5.420884075e-05f, -1.034714787e-04f, -1.276843902e-04f, -1.007595192e-04f, -1.010520338e-05f, +1.314238026e-04f, +2.813221715e-04f, +3.752894788e-04f, +3.469985528e-04f, +1.542445587e-04f, -1.980463138e-04f, -6.480053926e-04f, -1.086558738e-03f, -1.386130709e-03f, -1.440134762e-03f, -1.199942416e-03f, -6.957186340e-04f, -3.253550840e-05f, +6.381729614e-04f, +1.162758543e-03f, +1.430256781e-03f, +1.402902931e-03f, +1.122481066e-03f, +6.915572233e-04f, +2.374852913e-04f, -1.274579203e-04f, -3.362419967e-04f, -3.787454085e-04f, -2.935965438e-04f, -1.460014508e-04f, -1.446014787e-06f, +9.498517043e-05f, +1.276705727e-04f, +1.072485805e-04f, +5.913597559e-05f, +9.968556543e-06f, -2.247537575e-05f, -3.299323754e-05f, -2.666621724e-05f, -1.322398717e-05f, -1.377130203e-06f, +4.490041168e-06f, + -7.702459168e-04f, -9.156503370e-04f, -1.396453142e-04f, +1.861142303e-03f, +4.447744793e-03f, +5.887278001e-03f, +4.096405093e-03f, -1.854574906e-03f, -1.033459263e-02f, -1.702002346e-02f, -1.671005206e-02f, -6.532821215e-03f, +1.124717579e-02f, +2.891173640e-02f, +3.643325068e-02f, +2.695031545e-02f, +1.614417370e-03f, -2.938378648e-02f, -5.096839847e-02f, -5.084856780e-02f, -2.663174030e-02f, +1.185286683e-02f, +4.681446674e-02f, +6.139844650e-02f, +4.846057877e-02f, +1.434154302e-02f, -2.448442539e-02f, -4.999824725e-02f, -5.168258780e-02f, -3.116757540e-02f, -3.027330347e-04f, +2.576756190e-02f, +3.637426813e-02f, +2.977835992e-02f, +1.245703520e-02f, -5.588633492e-03f, -1.636937635e-02f, -1.725431881e-02f, -1.086037163e-02f, -2.343531337e-03f, +3.844361413e-03f, +5.888971872e-03f, +4.593755732e-03f, +2.018654434e-03f, -4.963307114e-05f, -9.003422633e-04f, -7.941176452e-04f, -3.621625263e-04f, + +1.233653283e-05f, -6.256675746e-06f, -4.309016406e-05f, -7.776765626e-05f, -7.466243631e-05f, -5.749470101e-06f, +1.195956183e-04f, +2.404591937e-04f, +2.654686322e-04f, +1.277587669e-04f, -1.552029443e-04f, -4.603124626e-04f, -6.049282845e-04f, -4.487161370e-04f, +3.482797389e-06f, +5.670541940e-04f, +9.498402261e-04f, +9.062725306e-04f, +3.903108881e-04f, -3.883171580e-04f, -1.051944096e-03f, -1.249917253e-03f, -8.543876214e-04f, -4.209082247e-05f, +7.909024357e-04f, +1.237549266e-03f, +1.094397381e-03f, +4.617360196e-04f, -3.233665128e-04f, -8.765571829e-04f, -9.664270613e-04f, -6.153101469e-04f, -5.571174430e-05f, +4.173070169e-04f, +6.043106357e-04f, +4.835375958e-04f, +1.855110352e-04f, -1.062410242e-04f, -2.599747520e-04f, -2.482974822e-04f, -1.324370954e-04f, -4.171674522e-06f, +7.121214734e-05f, +7.966604217e-05f, +4.691785108e-05f, +9.089735452e-06f, -1.149649446e-05f, -1.295244630e-05f, + /* 3, 2 (48) */ + +3.396052832e-04f, +1.591133657e-04f, -4.374623277e-04f, -1.400296242e-03f, -2.376223656e-03f, -2.743414655e-03f, -1.834657337e-03f, +6.926024496e-04f, +4.483615851e-03f, +8.315174451e-03f, +1.030152497e-02f, +8.524000463e-03f, +1.938517101e-03f, -8.762814334e-03f, -2.073375210e-02f, -2.930879436e-02f, -2.915427248e-02f, -1.597503369e-02f, +1.175915853e-02f, +5.170491332e-02f, +9.765276679e-02f, +1.407979183e-01f, +1.719758725e-01f, +1.841940559e-01f, +1.746439613e-01f, +1.455238419e-01f, +1.033941387e-01f, +5.728347771e-02f, +1.617752467e-02f, -1.329587772e-02f, -2.828339973e-02f, -2.987251744e-02f, -2.210056439e-02f, -1.027113241e-02f, +7.885643586e-04f, +7.969164848e-03f, +1.031894517e-02f, +8.706792755e-03f, +4.994429940e-03f, +1.114094085e-03f, -1.607969408e-03f, -2.711428529e-03f, -2.469969652e-03f, -1.532275021e-03f, -5.419095556e-04f, +1.087888537e-04f, +3.357716612e-04f, +2.713236852e-04f, + +2.816527132e-07f, +1.151756553e-05f, +2.516711215e-05f, +3.294289841e-05f, +2.496439415e-05f, -4.770153257e-06f, -5.256935211e-05f, -1.021624150e-04f, -1.275859766e-04f, -1.025554528e-04f, -1.385231473e-05f, +1.265824125e-04f, +2.771190438e-04f, +3.738922690e-04f, +3.502539917e-04f, +1.628535423e-04f, -1.850951294e-04f, -6.334638925e-04f, -1.074304548e-03f, -1.380047129e-03f, -1.442839046e-03f, -1.211811609e-03f, -7.145878244e-04f, -5.421747208e-05f, +6.186926465e-04f, +1.149846182e-03f, +1.426374959e-03f, +1.407992425e-03f, +1.134162233e-03f, +7.060372125e-04f, +2.508173099e-04f, -1.182128095e-04f, -3.323242692e-04f, -3.796460644e-04f, -2.975690434e-04f, -1.508725802e-04f, -5.396717026e-06f, +9.293143999e-05f, +1.275606867e-04f, +1.084546092e-04f, +6.077885086e-05f, +1.131256524e-05f, -2.179751896e-05f, -3.296445351e-05f, -2.702469411e-05f, -1.365597741e-05f, -1.666719010e-06f, +4.404678912e-06f, + -7.579093840e-04f, -9.219070127e-04f, -1.827354783e-04f, +1.783374647e-03f, +4.373082357e-03f, +5.881528531e-03f, +4.216000711e-03f, -1.614115712e-03f, -1.006912400e-02f, -1.689226469e-02f, -1.686525500e-02f, -6.993133677e-03f, +1.064224750e-02f, +2.846302026e-02f, +3.643673348e-02f, +2.751736964e-02f, +2.564257596e-03f, -2.847751395e-02f, -5.057808759e-02f, -5.123688496e-02f, -2.768368439e-02f, +1.060294958e-02f, +4.596007912e-02f, +6.135635567e-02f, +4.925148120e-02f, +1.557909228e-02f, -2.339002800e-02f, -4.953651123e-02f, -5.200595431e-02f, -3.204413258e-02f, -1.269160096e-03f, +2.515225176e-02f, +3.631855639e-02f, +3.019566694e-02f, +1.306134584e-02f, -5.105095897e-03f, -1.618386532e-02f, -1.736055983e-02f, -1.112034638e-02f, -2.591828819e-03f, +3.711924318e-03f, +5.884800197e-03f, +4.664967880e-03f, +2.098320476e-03f, -2.715220056e-06f, -8.912525278e-04f, -8.056141397e-04f, -3.751149726e-04f, + +1.257826480e-05f, -5.351160797e-06f, -4.181167602e-05f, -7.705842929e-05f, -7.567694817e-05f, -8.938566172e-06f, +1.153086141e-04f, +2.376515187e-04f, +2.669660816e-04f, +1.346319256e-04f, -1.451474416e-04f, -4.522427527e-04f, -6.045179545e-04f, -4.585801599e-04f, -1.370094375e-05f, +5.505955327e-04f, +9.434368467e-04f, +9.152137016e-04f, +4.120965150e-04f, -3.635981751e-04f, -1.036833437e-03f, -1.252828523e-03f, -8.747103281e-04f, -7.012783938e-05f, +7.689362327e-04f, +1.232219304e-03f, +1.107561650e-03f, +4.859203331e-04f, -3.005573838e-04f, -8.656981442e-04f, -9.710646329e-04f, -6.309905005e-04f, -7.331924678e-05f, +4.062426254e-04f, +6.034802808e-04f, +4.909320686e-04f, +1.956429568e-04f, -9.877697198e-05f, -2.578062539e-04f, -2.507056983e-04f, -1.367021002e-04f, -7.592810238e-06f, +6.992500318e-05f, +8.021841976e-05f, +4.818784893e-05f, +1.007188154e-05f, -1.117738321e-05f, -1.310576536e-05f, + /* 3, 3 (48) */ + +3.398869359e-04f, +1.706309313e-04f, -4.122952156e-04f, -1.367353344e-03f, -2.351259262e-03f, -2.748184809e-03f, -1.887226689e-03f, +5.904400346e-04f, +4.356029874e-03f, +8.212618998e-03f, +1.028767266e-02f, +8.650582875e-03f, +2.215636145e-03f, -8.388922065e-03f, -2.038349811e-02f, -2.914594082e-02f, -2.933936761e-02f, -1.660849758e-02f, +1.068485398e-02f, +5.032486620e-02f, +9.620992774e-02f, +1.395861067e-01f, +1.712612847e-01f, +1.841398384e-01f, +1.752626540e-01f, +1.466736881e-01f, +1.048205137e-01f, +5.869147013e-02f, +1.731168690e-02f, -1.258984051e-02f, -2.803258242e-02f, -2.999073025e-02f, -2.243288866e-02f, -1.065077847e-02f, +4.909953152e-04f, +7.818292268e-03f, +1.031354846e-02f, +8.799724195e-03f, +5.121990627e-03f, +1.222548695e-03f, -1.547190557e-03f, -2.700115964e-03f, -2.491767171e-03f, -1.565239474e-03f, -5.689342497e-04f, +9.513287631e-05f, +3.341049422e-04f, +2.757283641e-04f, + +2.373016503e-08f, +1.109736287e-05f, +2.477761287e-05f, +3.289035984e-05f, +2.553132036e-05f, -3.516594185e-06f, -5.093247959e-05f, -1.008298234e-04f, -1.274372170e-04f, -1.042870754e-04f, -1.754635521e-05f, +1.217528356e-04f, +2.728637187e-04f, +3.723755467e-04f, +3.533455744e-04f, +1.713008898e-04f, -1.722461206e-04f, -6.189167668e-04f, -1.061916802e-03f, -1.373721479e-03f, -1.445249734e-03f, -1.223414427e-03f, -7.332936410e-04f, -7.588687551e-05f, +5.990703682e-04f, +1.136678987e-03f, +1.422198365e-03f, +1.412827242e-03f, +1.145690556e-03f, +7.204919830e-04f, +2.642373334e-04f, -1.088115592e-04f, -3.282394937e-04f, -3.804180795e-04f, -3.014784169e-04f, -1.557466555e-04f, -9.395992526e-06f, +9.081325215e-05f, +1.273970654e-04f, +1.096326479e-04f, +6.242075398e-05f, +1.267363801e-05f, -2.109734737e-05f, -3.291857052e-05f, -2.737601512e-05f, -1.408969792e-05f, -1.962488206e-06f, +4.313389282e-06f, + -7.453311192e-04f, -9.272581735e-04f, -2.245471543e-04f, +1.706316218e-03f, +4.297405409e-03f, +5.872589965e-03f, +4.331309326e-03f, -1.376464193e-03f, -9.802157915e-03f, -1.675763276e-02f, -1.701040245e-02f, -7.445376430e-03f, +1.003772955e-02f, +2.800444010e-02f, +3.642303254e-02f, +2.806796518e-02f, +3.507694442e-03f, -2.756230025e-02f, -5.016599107e-02f, -5.160048313e-02f, -2.872051783e-02f, +9.350121055e-03f, +4.508536879e-02f, +6.128622784e-02f, +5.002041744e-02f, +1.681131159e-02f, -2.228246635e-02f, -4.905059090e-02f, -5.230651169e-02f, -3.290983073e-02f, -2.240224729e-03f, +2.452126126e-02f, +3.624523714e-02f, +3.060190957e-02f, +1.366482612e-02f, -4.614163828e-03f, -1.598822236e-02f, -1.745933680e-02f, -1.137815263e-02f, -2.842534517e-03f, +3.575222217e-03f, +5.877207387e-03f, +4.734892883e-03f, +2.178538896e-03f, +4.547262888e-05f, -8.811806463e-04f, -8.167915229e-04f, -3.882207380e-04f, + +1.280129310e-05f, -4.465533215e-06f, -4.053350083e-05f, -7.631299584e-05f, -7.662449684e-05f, -1.206689233e-05f, +1.110227562e-04f, +2.347512644e-04f, +2.682985099e-04f, +1.413516791e-04f, -1.351243585e-04f, -4.440187700e-04f, -6.038040284e-04f, -4.681363162e-04f, -3.075798926e-05f, +5.339661313e-04f, +9.366052454e-04f, +9.236685619e-04f, +4.336005838e-04f, -3.387775609e-04f, -1.021257219e-03f, -1.255132848e-03f, -8.945968170e-04f, -9.812957267e-05f, +7.465856134e-04f, +1.226288538e-03f, +1.120219483e-03f, +5.099391233e-04f, -2.775189198e-04f, -8.543678256e-04f, -9.752485870e-04f, -6.464527035e-04f, -9.101137782e-05f, +3.948868638e-04f, +6.023339503e-04f, +4.981434225e-04f, +2.057803530e-04f, -9.117143940e-05f, -2.554676994e-04f, -2.530068907e-04f, -1.409547922e-04f, -1.106891903e-05f, +6.856870388e-05f, +8.072861528e-05f, +4.945320309e-05f, +1.107234635e-05f, -1.083834336e-05f, -1.325010149e-05f, + /* 3, 4 (48) */ + +3.399106661e-04f, +1.817282941e-04f, -3.875176027e-04f, -1.334462984e-03f, -2.325727942e-03f, -2.751701403e-03f, -1.938159169e-03f, +4.896102112e-04f, +4.228592657e-03f, +8.108331923e-03f, +1.027012630e-02f, +8.772335711e-03f, +2.488499864e-03f, -8.016546519e-03f, -2.003015253e-02f, -2.897463993e-02f, -2.951161373e-02f, -1.722741435e-02f, +9.622937179e-03f, +4.895114472e-02f, +9.476467801e-02f, +1.383626923e-01f, +1.705279911e-01f, +1.840639515e-01f, +1.758617243e-01f, +1.478103671e-01f, +1.062427120e-01f, +6.010429737e-02f, +1.845737746e-02f, -1.186934853e-02f, -2.776834509e-02f, -3.009954181e-02f, -2.276112815e-02f, -1.103119655e-02f, +1.895168983e-04f, +7.662545612e-03f, +1.030415246e-02f, +8.890537447e-03f, +5.249387692e-03f, +1.332181343e-03f, -1.484769803e-03f, -2.687442326e-03f, -2.512864519e-03f, -1.598158045e-03f, -5.963102648e-04f, +8.104317839e-05f, +3.321424540e-04f, +2.800417534e-04f, + -2.277388815e-07f, +1.068011173e-05f, +2.438284863e-05f, +3.282241924e-05f, +2.607625943e-05f, -2.282059878e-06f, -4.929891051e-05f, -9.947459474e-05f, -1.272388292e-04f, -1.059544931e-04f, -2.118651621e-05f, +1.169367772e-04f, +2.685583734e-04f, +3.707412088e-04f, +3.562740812e-04f, +1.795856748e-04f, -1.595019776e-04f, -6.043678766e-04f, -1.049399420e-03f, -1.367156457e-03f, -1.447367298e-03f, -1.234748787e-03f, -7.518319412e-04f, -9.753869981e-05f, +5.793105393e-04f, +1.123259489e-03f, +1.417727002e-03f, +1.417405042e-03f, +1.157062250e-03f, +7.349175668e-04f, +2.777423880e-04f, -9.925544176e-05f, -3.239871777e-04f, -3.810597053e-04f, -3.053224756e-04f, -1.606218381e-04f, -1.344285118e-05f, +8.863065662e-05f, +1.271790738e-04f, +1.107818055e-04f, +6.406093845e-05f, +1.405140252e-05f, -2.037484222e-05f, -3.285532073e-05f, -2.771985991e-05f, -1.452492876e-05f, -2.264375771e-06f, +4.216109366e-06f, + -7.325298261e-04f, -9.317237067e-04f, -2.650806551e-04f, +1.630003222e-03f, +4.220780912e-03f, +5.860523072e-03f, +4.442332082e-03f, -1.141712929e-03f, -9.533859405e-03f, -1.661628108e-02f, -1.714552680e-02f, -7.889395200e-03f, +9.433925520e-03f, +2.753630378e-02f, +3.639227455e-02f, +2.860193131e-02f, +4.444299688e-03f, -2.663863169e-02f, -4.973239049e-02f, -5.193926069e-02f, -2.974177505e-02f, +8.094988206e-03f, +4.419077197e-02f, +6.118809826e-02f, +5.076700305e-02f, +1.803760013e-02f, -2.116224687e-02f, -4.854065178e-02f, -5.258403061e-02f, -3.376419855e-02f, -3.215473316e-03f, +2.387480855e-02f, +3.615422576e-02f, +3.099679643e-02f, +1.426716007e-02f, -4.116020405e-03f, -1.578244201e-02f, -1.755050824e-02f, -1.163362033e-02f, -3.095541408e-03f, +3.434267425e-03f, +5.866138468e-03f, +4.803461587e-03f, +2.259267511e-03f, +9.492583196e-05f, -8.701082999e-04f, -8.276298662e-04f, -4.014708395e-04f, + +1.300589560e-05f, -3.600041585e-06f, -3.925657677e-05f, -7.553256929e-05f, -7.750563625e-05f, -1.513345528e-05f, +1.067406320e-04f, +2.317613882e-04f, +2.694671867e-04f, +1.479159801e-04f, -1.251388857e-04f, -4.356464065e-04f, -6.027894352e-04f, -4.773818773e-04f, -4.768027379e-05f, +5.171756103e-04f, +9.293511264e-04f, +9.316349126e-04f, +4.548131826e-04f, -3.138681769e-04f, -1.005224319e-03f, -1.256829962e-03f, -9.140374150e-04f, -1.260819359e-04f, +7.238615871e-04f, +1.219759154e-03f, +1.132363442e-03f, +5.337797449e-04f, -2.542620618e-04f, -8.425700365e-04f, -9.789744964e-04f, -6.616874512e-04f, -1.087794048e-04f, +3.832435974e-04f, +6.008696396e-04f, +5.051660376e-04f, +2.159176551e-04f, -8.342714677e-05f, -2.529583551e-04f, -2.551982542e-04f, -1.451923846e-04f, -1.459867564e-05f, +6.714293286e-05f, +8.119545879e-05f, +5.071287250e-05f, +1.209074997e-05f, -1.047916587e-05f, -1.338505782e-05f, + /* 3, 5 (48) */ + +3.396829272e-04f, +1.924084059e-04f, -3.631347541e-04f, -1.301640565e-03f, -2.299651682e-03f, -2.753983463e-03f, -1.987458079e-03f, +3.901356165e-04f, +4.101353828e-03f, +8.002377430e-03f, +1.024893978e-02f, +8.889272488e-03f, +2.757058237e-03f, -7.645805310e-03f, -1.967387845e-02f, -2.879505426e-02f, -2.967111571e-02f, -1.783178223e-02f, +8.573537759e-03f, +4.758398826e-02f, +9.331731071e-02f, +1.371279435e-01f, +1.697761591e-01f, +1.839664128e-01f, +1.764410349e-01f, +1.489336266e-01f, +1.076604390e-01f, +6.152170242e-02f, +1.961443971e-02f, -1.113443096e-02f, -2.749060270e-02f, -3.019879725e-02f, -2.308511533e-02f, -1.141225626e-02f, -1.158055773e-04f, +7.501923774e-03f, +1.029070961e-02f, +8.979168103e-03f, +5.376566766e-03f, +1.442963148e-03f, -1.420708864e-03f, -2.673390924e-03f, -2.533239361e-03f, -1.631013365e-03f, -6.240301247e-04f, +6.651824963e-05f, +3.298780782e-04f, +2.842578627e-04f, + -4.727250007e-07f, +1.026599884e-05f, +2.398312798e-05f, +3.273937254e-05f, +2.659930036e-05f, -1.066831678e-06f, -4.766932167e-05f, -9.809761845e-05f, -1.269915428e-04f, -1.075578371e-04f, -2.477201947e-05f, +1.121359191e-04f, +2.642051807e-04f, +3.689911742e-04f, +3.590403383e-04f, +1.877070282e-04f, -1.468653409e-04f, -5.898210613e-04f, -1.036756339e-03f, -1.360354815e-03f, -1.449192291e-03f, -1.245812685e-03f, -7.701986314e-04f, -1.191679313e-04f, +5.594176131e-04f, +1.109590290e-03f, +1.412960956e-03f, +1.421723547e-03f, +1.168273555e-03f, +7.493099823e-04f, +2.913294552e-04f, -8.954578688e-05f, -3.195668788e-04f, -3.815692209e-04f, -3.090990316e-04f, -1.654962695e-04f, -1.753627284e-05f, +8.638373006e-05f, +1.269060919e-04f, +1.119011921e-04f, +6.569864863e-05f, +1.544547346e-05f, -1.962999545e-05f, -3.277444107e-05f, -2.805590700e-05f, -1.496144545e-05f, -2.572314865e-06f, +4.112779054e-06f, + -7.195239305e-04f, -9.353237483e-04f, -3.043372319e-04f, +1.554470653e-03f, +4.143275275e-03f, +5.845389617e-03f, +4.549072714e-03f, -9.099515406e-04f, -9.264392218e-03f, -1.646836510e-02f, -1.727066569e-02f, -8.325041607e-03f, +8.831136085e-03f, +2.705892191e-02f, +3.634459427e-02f, +2.911910692e-02f, +5.373650814e-03f, -2.570699678e-02f, -4.927757730e-02f, -5.225312887e-02f, -3.074699937e-02f, +6.838158244e-03f, +4.327673456e-02f, +6.106201633e-02f, +5.149086464e-02f, +1.925735928e-02f, -2.002988343e-02f, -4.800687203e-02f, -5.283829268e-02f, -3.460676859e-02f, -4.194447812e-03f, +2.321312110e-02f, +3.604544636e-02f, +3.138004003e-02f, +1.486802971e-02f, -3.610854368e-03f, -1.556652435e-02f, -1.763393539e-02f, -1.188657869e-02f, -3.350739662e-03f, +3.289075041e-03f, +5.851539792e-03f, +4.870604520e-03f, +2.340462970e-03f, +1.456387045e-04f, -8.580175499e-04f, -8.381090321e-04f, -4.148558973e-04f, + +1.319236015e-05f, -2.754913188e-06f, -3.798182344e-05f, -7.471836679e-05f, -7.832095665e-05f, -1.813731700e-05f, +1.024647908e-04f, +2.286848653e-04f, +2.704734651e-04f, +1.543228943e-04f, -1.151961420e-04f, -4.271315862e-04f, -6.014772487e-04f, -4.863143052e-04f, -6.445985719e-05f, +5.002336227e-04f, +9.216803928e-04f, +9.391108251e-04f, +4.757245889e-04f, -2.888828959e-04f, -9.887438369e-04f, -1.257919916e-03f, -9.330226906e-04f, -1.539708695e-04f, +7.007753656e-04f, +1.212633655e-03f, +1.143986344e-03f, +5.574296133e-04f, -2.307979033e-04f, -8.303088519e-04f, -9.822381595e-04f, -6.766855115e-04f, -1.266144987e-04f, +3.713168784e-04f, +5.990855072e-04f, +5.119943527e-04f, +2.260492410e-04f, -7.554692499e-05f, -2.502775821e-04f, -2.572770162e-04f, -1.494120619e-04f, -1.818069976e-05f, +6.564741609e-05f, +8.161779110e-05f, +5.196580074e-05f, +1.312669022e-05f, -1.009965468e-05f, -1.351023705e-05f, + /* 3, 6 (48) */ + +3.392102022e-04f, +2.026744047e-04f, -3.391516261e-04f, -1.268901192e-03f, -2.273052382e-03f, -2.755050294e-03f, -2.035127401e-03f, +2.920379980e-04f, +3.974362285e-03f, +7.894819592e-03f, +1.022416777e-02f, +9.001408407e-03f, +3.021263418e-03f, -7.276814136e-03f, -1.931483811e-02f, -2.860734723e-02f, -2.981798105e-02f, -1.842160329e-02f, +7.536781420e-03f, +4.622363344e-02f, +9.186811842e-02f, +1.358821308e-01f, +1.690059605e-01f, +1.838472449e-01f, +1.770004525e-01f, +1.500432169e-01f, +1.090734000e-01f, +6.294342596e-02f, +2.078271327e-02f, -1.038512098e-02f, -2.719927325e-02f, -3.028834304e-02f, -2.340468221e-02f, -1.179382548e-02f, -4.249046089e-04f, +7.336427504e-03f, +1.027317334e-02f, +9.065551833e-03f, +5.503472858e-03f, +1.554864340e-03f, -1.355010216e-03f, -2.657945450e-03f, -2.552869356e-03f, -1.663787806e-03f, -6.520860317e-04f, +5.155680418e-05f, +3.273057633e-04f, +2.883706418e-04f, + -7.112032361e-07f, +9.855206040e-06f, +2.357875726e-05f, +3.264151887e-05f, +2.710054154e-05f, +1.288219903e-07f, -4.604437911e-05f, -9.669978219e-05f, -1.266960993e-04f, -1.090972631e-04f, -2.830211710e-05f, +1.073519189e-04f, +2.598063079e-04f, +3.671273824e-04f, +3.616452175e-04f, +1.956641385e-04f, -1.343388010e-04f, -5.752801377e-04f, -1.023991514e-03f, -1.353319360e-03f, -1.450725344e-03f, -1.256604192e-03f, -7.883896686e-04f, -1.407695631e-04f, +5.393960823e-04f, +1.095674065e-03f, +1.407900393e-03f, +1.425780546e-03f, +1.179320741e-03f, +7.636652355e-04f, +3.049954720e-04f, -7.968398176e-05f, -3.149782048e-04f, -3.819449340e-04f, -3.128058986e-04f, -1.703680708e-04f, -2.167520746e-05f, +8.407257635e-05f, +1.265775157e-04f, +1.129899195e-04f, +6.733312003e-05f, +1.685545253e-05f, -1.886280976e-05f, -3.267567353e-05f, -2.838383397e-05f, -1.539901900e-05f, -2.886233797e-06f, +4.003341125e-06f, + -7.063315703e-04f, -9.380786615e-04f, -3.423190553e-04f, +1.479752286e-03f, +4.064954319e-03f, +5.827252300e-03f, +4.651537505e-03f, -6.812666753e-04f, -8.993918753e-03f, -1.631404221e-02f, -1.738586183e-02f, -8.752173193e-03f, +8.229658837e-03f, +2.657260760e-02f, +3.628013442e-02f, +2.961934054e-02f, +6.295331207e-03f, -2.476788595e-02f, -4.880185272e-02f, -5.254201177e-02f, -3.173574321e-02f, +5.580238328e-03f, +4.234371187e-02f, +6.090804546e-02f, +5.219164000e-02f, +2.046999293e-02f, -1.888589709e-02f, -4.744944242e-02f, -5.306909058e-02f, -3.543707744e-02f, -5.176685972e-03f, +2.253643559e-02f, +3.591883186e-02f, +3.175135691e-02f, +1.546711522e-02f, -3.098860015e-03f, -1.534047511e-02f, -1.770948231e-02f, -1.213685627e-02f, -3.608016678e-03f, +3.139662979e-03f, +5.833359092e-03f, +4.936251936e-03f, +2.422080761e-03f, +1.976045052e-04f, -8.448908597e-04f, -8.482086868e-04f, -4.283661344e-04f, + +1.336098404e-05f, -1.930354200e-06f, -3.671014137e-05f, -7.387160839e-05f, -7.907108373e-05f, -2.107759459e-05f, +9.819774306e-05f, +2.255246866e-04f, +2.713187798e-04f, +1.605706006e-04f, -1.053011715e-04f, -4.184802618e-04f, -5.998706843e-04f, -4.949312534e-04f, -8.108892828e-05f, +4.831498493e-04f, +9.135991424e-04f, +9.460946405e-04f, +4.963252740e-04f, -2.638345942e-04f, -9.718250891e-04f, -1.258403080e-03f, -9.515434587e-04f, -1.817823486e-04f, +6.773383576e-04f, +1.204914861e-03f, +1.155081271e-03f, +5.808762122e-04f, -2.071376851e-04f, -8.175886110e-04f, -9.850356039e-04f, -6.914377299e-04f, -1.445077386e-04f, +3.591109445e-04f, +5.969798764e-04f, +5.186228688e-04f, +2.361694382e-04f, -6.753371491e-05f, -2.474248378e-04f, -2.592404393e-04f, -1.536109821e-04f, -2.181355622e-05f, +6.408192298e-05f, +8.199446477e-05f, +5.321091650e-05f, +1.417974247e-05f, -9.699627145e-06f, -1.362524182e-05f, + /* 3, 7 (48) */ + +3.384989990e-04f, +2.125296108e-04f, -3.155728688e-04f, -1.236259674e-03f, -2.245951840e-03f, -2.754921472e-03f, -2.081171780e-03f, +1.953382158e-04f, +3.847666186e-03f, +7.785722329e-03f, +1.019586565e-02f, +9.108760326e-03f, +3.281069726e-03f, -6.909686753e-03f, -1.895319289e-02f, -2.841168309e-02f, -2.995231985e-02f, -1.899688343e-02f, +6.512789906e-03f, +4.487031408e-02f, +9.041739307e-02f, +1.346255266e-01f, +1.682175708e-01f, +1.837064753e-01f, +1.775398486e-01f, +1.511388909e-01f, +1.104813004e-01f, +6.436920651e-02f, +2.196203401e-02f, -9.621455742e-03f, -2.689427778e-02f, -3.036802702e-02f, -2.371966041e-02f, -1.217577041e-02f, -7.377105075e-04f, +7.166059434e-03f, +1.025149813e-02f, +9.149624410e-03f, +5.630050374e-03f, +1.667854260e-03f, -1.287677096e-03f, -2.641089998e-03f, -2.571732166e-03f, -1.696463480e-03f, -6.804698657e-04f, +3.615778519e-05f, +3.244195295e-04f, +2.923739829e-04f, + -9.431530473e-07f, +9.447910213e-06f, +2.317004037e-05f, +3.252916038e-05f, +2.758009056e-05f, +1.304645589e-06f, -4.442473797e-05f, -9.528197147e-05f, -1.263532515e-04f, -1.105729513e-04f, -3.177609154e-05f, +1.025864097e-04f, +2.553639164e-04f, +3.651517933e-04f, +3.640896352e-04f, +2.034562514e-04f, -1.219248981e-04f, -5.607488983e-04f, -1.011108915e-03f, -1.346052953e-03f, -1.451967164e-03f, -1.267121457e-03f, -8.064010613e-04f, -1.623385964e-04f, +5.192504775e-04f, +1.081513561e-03f, +1.402545559e-03f, +1.429573887e-03f, +1.190200104e-03f, +7.779793207e-04f, +3.187373323e-04f, -6.967147102e-05f, -3.102208145e-04f, -3.821851813e-04f, -3.164408930e-04f, -1.752353437e-04f, -2.585857515e-05f, +8.169732682e-05f, +1.261927572e-04f, +1.140471018e-04f, +6.896357953e-05f, +1.828092849e-05f, -1.807329880e-05f, -3.255876525e-05f, -2.870331762e-05f, -1.583741601e-05f, -3.206055989e-06f, +3.887741319e-06f, + -6.929705863e-04f, -9.400090157e-04f, -3.790291967e-04f, +1.405880678e-03f, +3.985883235e-03f, +5.806174705e-03f, +4.749735248e-03f, -4.557419887e-04f, -8.722599973e-03f, -1.615347161e-02f, -1.749116300e-02f, -9.170653454e-03f, +7.629788152e-03f, +2.607767635e-02f, +3.619904549e-02f, +3.010249039e-02f, +7.208930350e-03f, -2.382179131e-02f, -4.830552744e-02f, -5.280584636e-02f, -3.270756830e-02f, +4.321835247e-03f, +4.139216841e-02f, +6.072626311e-02f, +5.286897836e-02f, +2.167490780e-02f, -1.773081582e-02f, -4.686856621e-02f, -5.327622826e-02f, -3.625466605e-02f, -6.161721576e-03f, +2.184499786e-02f, +3.577432412e-02f, +3.211046785e-02f, +1.606409509e-02f, -2.580237146e-03f, -1.510430567e-02f, -1.777701603e-02f, -1.238428111e-02f, -3.867257117e-03f, +2.986051997e-03f, +5.811545536e-03f, +5.000333859e-03f, +2.504075226e-03f, +2.508154217e-04f, -8.307111173e-04f, -8.579083139e-04f, -4.419913762e-04f, + +1.351207367e-05f, -1.126549914e-06f, -3.544241166e-05f, -7.299351605e-05f, -7.975667761e-05f, -2.395346008e-05f, +9.394195902e-05f, +2.222838567e-04f, +2.720046459e-04f, +1.666573908e-04f, -9.545894178e-05f, -4.096984102e-04f, -5.979730964e-04f, -5.032305666e-04f, -9.755980851e-05f, +4.659339923e-04f, +9.051136635e-04f, +9.525849697e-04f, +5.166059077e-04f, -2.387361456e-04f, -9.544776028e-04f, -1.258280144e-03f, -9.695907853e-04f, -2.095023907e-04f, +6.535621626e-04f, +1.196605909e-03f, +1.165641565e-03f, +6.041071003e-04f, -1.832927891e-04f, -8.044139162e-04f, -9.873630894e-04f, -7.059350357e-04f, -1.624501163e-04f, +3.466302178e-04f, +5.945512379e-04f, +5.250461533e-04f, +2.462725265e-04f, -5.939056664e-05f, -2.443996772e-04f, -2.610858231e-04f, -1.577862775e-04f, -2.549575523e-05f, +6.244626716e-05f, +8.232434518e-05f, +5.444713427e-05f, +1.524945968e-05f, -9.278914423e-06f, -1.372967500e-05f, + /* 3, 8 (48) */ + +3.375558459e-04f, +2.219775210e-04f, -2.924028285e-04f, -1.203730513e-03f, -2.218371750e-03f, -2.753616827e-03f, -2.125596518e-03f, +1.000562444e-04f, +3.721312934e-03f, +7.675149378e-03f, +1.016408956e-02f, +9.211346736e-03f, +3.536433642e-03f, -6.544534960e-03f, -1.858910326e-02f, -2.820822684e-02f, -3.007424475e-02f, -1.955763232e-02f, +5.501680991e-03f, +4.352426113e-02f, +8.896542591e-02f, +1.333584052e-01f, +1.674111697e-01f, +1.835441367e-01f, +1.780590990e-01f, +1.522204045e-01f, +1.118838460e-01f, +6.579878040e-02f, +2.315223411e-02f, -8.843476421e-03f, -2.657554044e-02f, -3.043769849e-02f, -2.402988123e-02f, -1.255795560e-02f, -1.054151401e-03f, +6.990824090e-03f, +1.022563956e-02f, +9.231321737e-03f, +5.756243131e-03f, +1.781901362e-03f, -1.218713516e-03f, -2.622809069e-03f, -2.589805465e-03f, -1.729022245e-03f, -7.091731833e-04f, +2.032036918e-05f, +3.212134736e-04f, +2.962617242e-04f, + -1.168558256e-06f, +9.044283303e-06f, +2.275727877e-05f, +3.240260206e-05f, +2.803806407e-05f, +2.460396421e-06f, -4.281104231e-05f, -9.384506926e-05f, -1.259637630e-04f, -1.119851055e-04f, -3.519325555e-05f, +9.784099981e-05f, +2.508801606e-04f, +3.630663859e-04f, +3.663745517e-04f, +2.110826698e-04f, -1.096261208e-04f, -5.462311107e-04f, -9.981125244e-04f, -1.338558509e-03f, -1.452918539e-03f, -1.277362709e-03f, -8.242288710e-04f, -1.838700421e-04f, +4.989853661e-04f, +1.067111595e-03f, +1.396896783e-03f, +1.433101487e-03f, +1.200907975e-03f, +7.922482224e-04f, +3.325518869e-04f, -5.950975647e-05f, -3.052944180e-04f, -3.822883300e-04f, -3.200018341e-04f, -1.800961712e-04f, -3.008526632e-05f, +7.925814052e-05f, +1.257512449e-04f, +1.150718556e-04f, +7.058924562e-05f, +1.972147714e-05f, -1.726148731e-05f, -3.242346883e-05f, -2.901403414e-05f, -1.627639872e-05f, -3.531699954e-06f, +3.765928427e-06f, + -6.794585126e-04f, -9.411355656e-04f, -4.144716084e-04f, +1.332887162e-03f, +3.906126557e-03f, +5.782221245e-03f, +4.843677207e-03f, -2.334581321e-04f, -8.450595327e-03f, -1.598681422e-02f, -1.758662195e-02f, -9.580351865e-03f, +7.031815056e-03f, +2.557444578e-02f, +3.610148568e-02f, +3.056842438e-02f, +8.114044013e-03f, -2.286920634e-02f, -4.778892153e-02f, -5.304458251e-02f, -3.366204590e-02f, +3.063555103e-03f, +4.042257762e-02f, +6.051676072e-02f, +5.352254052e-02f, +2.287151370e-02f, -1.656517425e-02f, -4.626445911e-02f, -5.345952105e-02f, -3.705907997e-02f, -7.149084665e-03f, +2.113906282e-02f, +3.561187401e-02f, +3.245709807e-02f, +1.665864633e-02f, -2.055190993e-03f, -1.485803315e-02f, -1.783640660e-02f, -1.262868078e-02f, -4.128342940e-03f, +2.828265719e-03f, +5.786049781e-03f, +5.062780126e-03f, +2.586399571e-03f, +3.052625560e-04f, -8.154616576e-04f, -8.671872283e-04f, -4.557210512e-04f, + +1.364594403e-05f, -3.436649713e-07f, -3.417949566e-05f, -7.208531271e-05f, -8.037843185e-05f, -2.676414031e-05f, +8.969986767e-05f, +2.189653917e-04f, +2.725326564e-04f, +1.725816699e-04f, -8.567434117e-05f, -4.007920296e-04f, -5.957879751e-04f, -5.112102807e-04f, -1.138649555e-04f, +4.485957701e-04f, +8.962304303e-04f, +9.585806927e-04f, +5.365573630e-04f, -2.136004132e-04f, -9.367111105e-04f, -1.257552114e-03f, -9.871559923e-04f, -2.371170630e-04f, +6.294585642e-04f, +1.187710250e-03f, +1.175660842e-03f, +6.271099183e-04f, -1.592747329e-04f, -7.907896309e-04f, -9.892171113e-04f, -7.201684470e-04f, -1.804325406e-04f, +3.338793035e-04f, +5.917982521e-04f, +5.312588432e-04f, +2.563527416e-04f, -5.112063874e-05f, -2.412017540e-04f, -2.628105067e-04f, -1.619350567e-04f, -2.922575262e-05f, +6.074030726e-05f, +8.260631152e-05f, +5.567335481e-05f, +1.633537227e-05f, -8.837361929e-06f, -1.382314016e-05f, + /* 3, 9 (48) */ + +3.363872877e-04f, +2.310218043e-04f, -2.696455497e-04f, -1.171327911e-03f, -2.190333686e-03f, -2.751156430e-03f, -2.168407560e-03f, +6.211175117e-06f, +3.595349171e-03f, +7.563164272e-03f, +1.012889630e-02f, +9.309187736e-03f, +3.787313803e-03f, -6.181468574e-03f, -1.822272871e-02f, -2.799714417e-02f, -3.018387087e-02f, -2.010386343e-02f, +4.503568467e-03f, +4.218570262e-02f, +8.751250737e-02f, +1.320810425e-01f, +1.665869409e-01f, +1.833602667e-01f, +1.785580844e-01f, +1.532875161e-01f, +1.132807427e-01f, +6.723188188e-02f, +2.435314209e-02f, -8.051228198e-03f, -2.624298856e-02f, -3.049720825e-02f, -2.433517564e-02f, -1.294024393e-02f, -1.374153235e-03f, +6.810727919e-03f, +1.019555429e-02f, +9.310579877e-03f, +5.881994376e-03f, +1.896973217e-03f, -1.148124270e-03f, -2.603087592e-03f, -2.607066952e-03f, -1.761445714e-03f, -7.381872174e-04f, +4.043970461e-06f, +3.176817736e-04f, +3.000276527e-04f, + -1.387406987e-06f, +8.644492266e-06f, +2.234077122e-05f, +3.226215150e-05f, +2.847458756e-05f, +3.595844583e-06f, -4.120392496e-05f, -9.238995567e-05f, -1.255284079e-04f, -1.133339535e-04f, -3.855295216e-05f, +9.311727215e-05f, +2.463571875e-04f, +3.608731577e-04f, +3.685009711e-04f, +2.185427537e-04f, -9.744490656e-05f, -5.317305164e-04f, -9.850063393e-04f, -1.330838993e-03f, -1.453580330e-03f, -1.287326252e-03f, -8.418692126e-04f, -2.053589224e-04f, +4.786053506e-04f, +1.052471054e-03f, +1.390954474e-03f, +1.436361328e-03f, +1.211440714e-03f, +8.064679161e-04f, +3.464359449e-04f, -4.920039709e-05f, -3.001987772e-04f, -3.822527779e-04f, -3.234865456e-04f, -1.849486176e-04f, -3.435414183e-05f, +7.675520442e-05f, +1.252524243e-04f, +1.160633002e-04f, +7.220932865e-05f, +2.117666142e-05f, -1.642741121e-05f, -3.226954245e-05f, -2.931565927e-05f, -1.671572506e-05f, -3.863079261e-06f, +3.637854360e-06f, + -6.658125686e-04f, -9.414792306e-04f, -4.486511040e-04f, +1.260801849e-03f, +3.825748126e-03f, +5.755457105e-03f, +4.933377074e-03f, -1.449274037e-05f, -8.178062671e-03f, -1.581423255e-02f, -1.767229629e-02f, -9.981143894e-03f, +6.436027081e-03f, +2.506323550e-02f, +3.598762072e-02f, +3.101702015e-02f, +9.010274443e-03f, -2.191062565e-02f, -4.725236417e-02f, -5.325818292e-02f, -3.459875701e-02f, +1.806002989e-03f, +3.943542163e-02f, +6.027964365e-02f, +5.415199909e-02f, +2.405922395e-02f, -1.538951341e-02f, -4.563734919e-02f, -5.361879579e-02f, -3.784986960e-02f, -8.138301776e-03f, +2.041889438e-02f, +3.543144146e-02f, +3.279097737e-02f, +1.725044458e-02f, -1.523932150e-03f, -1.460168041e-02f, -1.788752723e-02f, -1.286988254e-02f, -4.391153447e-03f, +2.666330662e-03f, +5.756824028e-03f, +5.123520433e-03f, +2.669005882e-03f, +3.609359108e-04f, -7.991262853e-04f, -8.760245903e-04f, -4.695441913e-04f, + +1.376291828e-05f, +4.181563958e-07f, -3.292223457e-05f, -7.114822141e-05f, -8.093707251e-05f, -2.950891663e-05f, +8.547385565e-05f, +2.155723173e-04f, +2.729044808e-04f, +1.783419554e-04f, -7.595217688e-05f, -3.917671351e-04f, -5.933189432e-04f, -5.188686224e-04f, -1.299969664e-04f, +4.311449117e-04f, +8.869560984e-04f, +9.640809589e-04f, +5.561707202e-04f, -1.884402431e-04f, -9.185355443e-04f, -1.256220314e-03f, -1.004230662e-03f, -2.646124904e-04f, +6.050395244e-04f, +1.178231646e-03f, +1.185132988e-03f, +6.498723961e-04f, -1.350951634e-04f, -7.767208785e-04f, -9.905944033e-04f, -7.341290765e-04f, -1.984458425e-04f, +3.208629886e-04f, +5.887197505e-04f, +5.372556494e-04f, +2.664042772e-04f, -4.272719737e-05f, -2.378308219e-04f, -2.644118708e-04f, -1.660544062e-04f, -3.300195016e-05f, +5.896394766e-05f, +8.283925787e-05f, +5.688846585e-05f, +1.743698814e-05f, -8.374829719e-06f, -1.390524188e-05f, + /* 3,10 (48) */ + +3.349998807e-04f, +2.396662965e-04f, -2.473047785e-04f, -1.139065760e-03f, -2.161859098e-03f, -2.747560586e-03f, -2.209611485e-03f, -8.617878055e-05f, +3.469820763e-03f, +7.449830319e-03f, +1.009034335e-02f, +9.402305008e-03f, +4.033670990e-03f, -5.820595416e-03f, -1.785422774e-02f, -2.777860141e-02f, -3.028131578e-02f, -2.063559395e-02f, +3.518562128e-03f, +4.085486363e-02f, +8.605892704e-02f, +1.307937162e-01f, +1.657450717e-01f, +1.831549078e-01f, +1.790366898e-01f, +1.543399871e-01f, +1.146716972e-01f, +6.866824321e-02f, +2.556458280e-02f, -7.244760282e-03f, -2.589655261e-02f, -3.054640865e-02f, -2.463537442e-02f, -1.332249670e-02f, -1.697639780e-03f, +6.625779301e-03f, +1.016120015e-02f, +9.387335081e-03f, +6.007246800e-03f, +2.013036517e-03f, -1.075914942e-03f, -2.581910930e-03f, -2.623494363e-03f, -1.793715256e-03f, -7.675028767e-04f, -1.267175460e-05f, +3.138186943e-04f, +3.036655070e-04f, + -1.599691615e-06f, +8.248699053e-06f, +2.192081377e-05f, +3.210811875e-05f, +2.888979521e-05f, +4.710772911e-06f, -3.960400736e-05f, -9.091750758e-05f, -1.250479701e-04f, -1.146197461e-04f, -4.185455463e-05f, +8.841678412e-05f, +2.417971359e-04f, +3.585741237e-04f, +3.704699399e-04f, +2.258359200e-04f, -8.538364049e-05f, -5.172508300e-04f, -9.717943669e-04f, -1.322897423e-03f, -1.453953477e-03f, -1.297010470e-03f, -8.593182563e-04f, -2.268002720e-04f, +4.581150677e-04f, +1.037594893e-03f, +1.384719120e-03f, +1.439351461e-03f, +1.221794714e-03f, +8.206343697e-04f, +3.603862744e-04f, -3.874500880e-05f, -2.949337063e-04f, -3.820769545e-04f, -3.268928558e-04f, -1.897907297e-04f, -3.866403314e-05f, +7.418873365e-05f, +1.246957586e-04f, +1.170205588e-04f, +7.382303112e-05f, +2.264603142e-05f, -1.557111780e-05f, -3.209675012e-05f, -2.960786843e-05f, -1.715514875e-05f, -4.200102517e-06f, +3.503474237e-06f, + -6.520496503e-04f, -9.410610742e-04f, -4.815733386e-04f, +1.189653627e-03f, +3.744811053e-03f, +5.725948188e-03f, +5.018850930e-03f, +2.010795769e-04f, -7.905158190e-03f, -1.563589059e-02f, -1.774824846e-02f, -1.037291103e-02f, +5.842708137e-03f, +2.454436688e-02f, +3.585762376e-02f, +3.144816507e-02f, +9.897230542e-03f, -2.094654469e-02f, -4.669619345e-02f, -5.344662316e-02f, -3.551729255e-02f, +5.497826750e-04f, +3.843119097e-02f, +6.001503116e-02f, +5.475703861e-02f, +2.523745560e-02f, -1.420438042e-02f, -4.498747679e-02f, -5.375389095e-02f, -3.862659048e-02f, -9.128896180e-03f, +1.968476530e-02f, +3.523299562e-02f, +3.311184036e-02f, +1.783916434e-02f, -9.866765005e-04f, -1.433527613e-02f, -1.793025443e-02f, -1.310771336e-02f, -4.655565318e-03f, +2.500276256e-03f, +5.723822078e-03f, +5.182484381e-03f, +2.751845140e-03f, +4.178243766e-04f, -7.816892972e-04f, -8.843994200e-04f, -4.834494332e-04f, + +1.386332733e-05f, +1.158790106e-06f, -3.167144923e-05f, -7.018346438e-05f, -8.143335712e-05f, -3.218712466e-05f, +8.126626625e-05f, +2.121076666e-04f, +2.731218630e-04f, +1.839368776e-04f, -6.629717269e-05f, -3.826297553e-04f, -5.905697532e-04f, -5.262040092e-04f, -1.459485814e-04f, +4.135911510e-04f, +8.772975004e-04f, +9.690851856e-04f, +5.754372713e-04f, -1.632684572e-04f, -8.999610301e-04f, -1.254286383e-03f, -1.020806642e-03f, -2.919748629e-04f, +5.803171765e-04f, +1.168174171e-03f, +1.194052169e-03f, +6.723823597e-04f, -1.107658511e-04f, -7.622130399e-04f, -9.914919407e-04f, -7.478081370e-04f, -2.164807795e-04f, +3.075862399e-04f, +5.853147382e-04f, +5.430313600e-04f, +2.764212891e-04f, -3.421361529e-05f, -2.342867362e-04f, -2.658873395e-04f, -1.701413919e-04f, -3.682269594e-05f, +5.711713924e-05f, +8.302209420e-05f, +5.809134268e-05f, +1.855379262e-05f, -7.891192903e-06f, -1.397558619e-05f, + /* 3,11 (48) */ + +3.334001891e-04f, +2.479149956e-04f, -2.253839647e-04f, -1.106957641e-03f, -2.132969303e-03f, -2.742849813e-03f, -2.249215493e-03f, -1.770962881e-04f, +3.344772793e-03f, +7.335210573e-03f, +1.004848879e-02f, +9.490721792e-03f, +4.275468126e-03f, -5.462021293e-03f, -1.748375780e-02f, -2.755276549e-02f, -3.036669942e-02f, -2.115284478e-02f, +2.546767761e-03f, +3.953196621e-02f, +8.460497356e-02f, +1.294967058e-01f, +1.648857534e-01f, +1.829281075e-01f, +1.794948048e-01f, +1.553775820e-01f, +1.160564163e-01f, +7.010759467e-02f, +2.678637751e-02f, -6.424125913e-03f, -2.553616634e-02f, -3.058515366e-02f, -2.493030813e-02f, -1.370457366e-02f, -2.024532636e-03f, +6.435988572e-03f, +1.012253612e-02f, +9.461523815e-03f, +6.131942559e-03f, +2.130057076e-03f, -1.002091911e-03f, -2.559264899e-03f, -2.639065481e-03f, -1.825812007e-03f, -7.971107451e-04f, -2.982690335e-05f, +3.096185918e-04f, +3.071689813e-04f, + -1.805408701e-06f, +7.857060596e-06f, +2.149769957e-05f, +3.194081607e-05f, +2.928382971e-05f, +5.804976927e-06f, -3.801189943e-05f, -8.942859827e-05f, -1.245232433e-04f, -1.158427570e-04f, -4.509746638e-05f, +8.374106713e-05f, +2.372021356e-04f, +3.561713154e-04f, +3.722825470e-04f, +2.329616422e-04f, -7.344465519e-05f, -5.027957374e-04f, -9.584806249e-04f, -1.314736864e-03f, -1.454038996e-03f, -1.306413829e-03f, -8.765722283e-04f, -2.481891397e-04f, +4.375191867e-04f, +1.022486136e-03f, +1.378191292e-03f, +1.442070000e-03f, +1.231966404e-03f, +8.347435446e-04f, +3.743996030e-04f, -2.814526430e-05f, -2.894990723e-04f, -3.817593219e-04f, -3.302185990e-04f, -1.946205367e-04f, -4.301374243e-05f, +7.155897168e-05f, +1.240807285e-04f, +1.179427581e-04f, +7.542954791e-05f, +2.412912441e-05f, -1.469266580e-05f, -3.190486185e-05f, -2.989033697e-05f, -1.759441937e-05f, -4.542673343e-06f, +3.362746456e-06f, + -6.381863229e-04f, -9.399022841e-04f, -5.132447878e-04f, +1.119470163e-03f, +3.663377696e-03f, +5.693761064e-03f, +5.100117196e-03f, +4.131872435e-04f, -7.632036327e-03f, -1.545195372e-02f, -1.781454564e-02f, -1.075554078e-02f, +5.252138384e-03f, +2.401816287e-02f, +3.571167518e-02f, +3.186175622e-02f, +1.077452804e-02f, -1.997745950e-02f, -4.612075618e-02f, -5.360989162e-02f, -3.641725358e-02f, -7.045037083e-04f, +3.741038433e-02f, +5.972305630e-02f, +5.533735579e-02f, +2.640562977e-02f, -1.301032825e-02f, -4.431509443e-02f, -5.386465680e-02f, -3.938880352e-02f, -1.012038812e-02f, +1.893695716e-02f, +3.501651484e-02f, +3.341942660e-02f, +1.842447907e-02f, -4.436451405e-04f, -1.405885484e-02f, -1.796446805e-02f, -1.334200010e-02f, -4.921452657e-03f, +2.330134864e-03f, +5.686999382e-03f, +5.239601520e-03f, +2.834867234e-03f, +4.759157193e-04f, -7.631355045e-04f, -8.922906129e-04f, -4.974250194e-04f, + +1.394750936e-05f, +1.878131958e-06f, -3.042793978e-05f, -6.919226211e-05f, -8.186807367e-05f, -3.479815397e-05f, +7.707939839e-05f, +2.085744781e-04f, +2.731866196e-04f, +1.893651790e-04f, -5.671396693e-05f, -3.733859286e-04f, -5.875442840e-04f, -5.332150490e-04f, -1.617126870e-04f, +3.959442215e-04f, +8.672616412e-04f, +9.735930579e-04f, +5.943485240e-04f, -1.380978459e-04f, -8.809978815e-04f, -1.251752275e-03f, -1.036876048e-03f, -3.191904429e-04f, +5.553038192e-04f, +1.157542210e-03f, +1.202412830e-03f, +6.946277381e-04f, -8.629868392e-05f, -7.472717518e-04f, -9.919069428e-04f, -7.611969468e-04f, -2.345280409e-04f, +2.940542028e-04f, +5.815823955e-04f, +5.485808445e-04f, +2.863978978e-04f, -2.558337091e-05f, -2.305694545e-04f, -2.672343829e-04f, -1.741930608e-04f, -4.068628472e-05f, +5.519988007e-05f, +8.315374743e-05f, +5.928084880e-05f, +1.968524855e-05f, -7.386342037e-06f, -1.403378090e-05f, + /* 3,12 (48) */ + +3.315947804e-04f, +2.557720562e-04f, -2.038862651e-04f, -1.075016825e-03f, -2.103685473e-03f, -2.737044836e-03f, -2.287227392e-03f, -2.665248864e-04f, +3.220249550e-03f, +7.219367816e-03f, +1.000339133e-02f, +9.574462859e-03f, +4.512670262e-03f, -5.105849977e-03f, -1.711147525e-02f, -2.731980385e-02f, -3.044014407e-02f, -2.165564052e-02f, +1.588287136e-03f, +3.821722934e-02f, +8.315093457e-02f, +1.281902919e-01f, +1.640091812e-01f, +1.826799183e-01f, +1.799323240e-01f, +1.564000682e-01f, +1.174346076e-01f, +7.154966467e-02f, +2.801834392e-02f, -5.589382368e-03f, -2.516176673e-02f, -3.061329892e-02f, -2.521980720e-02f, -1.408633298e-02f, -2.354751235e-03f, +6.241368035e-03f, +1.007952237e-02f, +9.533082787e-03f, +6.256023287e-03f, +2.247999834e-03f, -9.266623627e-04f, -2.535135775e-03f, -2.653758147e-03f, -1.857716868e-03f, -8.270010821e-04f, -4.742132272e-05f, +3.050759185e-04f, +3.105317277e-04f, + -2.004558929e-06f, +7.469728793e-06f, +2.107171878e-05f, +3.176055781e-05f, +2.965684206e-05f, +6.878264766e-06f, -3.642819940e-05f, -8.792409713e-05f, -1.239550299e-04f, -1.170032827e-04f, -4.828112092e-05f, +7.909162632e-05f, +2.325743066e-04f, +3.536667805e-04f, +3.739399226e-04f, +2.399194504e-04f, -6.163023022e-05f, -4.883688957e-04f, -9.450691397e-04f, -1.306360431e-03f, -1.453837979e-03f, -1.315534869e-03f, -8.936274118e-04f, -2.695205899e-04f, +4.168224081e-04f, +1.007147876e-03f, +1.371371643e-03f, +1.444515133e-03f, +1.241952248e-03f, +8.487913969e-04f, +3.884726189e-04f, -1.740289287e-05f, -2.838947950e-04f, -3.812983756e-04f, -3.334616159e-04f, -1.994360514e-04f, -4.740204284e-05f, +6.886619058e-05f, +1.234068331e-04f, +1.188290291e-04f, +7.702806658e-05f, +2.562546495e-05f, -1.379212554e-05f, -3.169365385e-05f, -3.016274024e-05f, -1.803328241e-05f, -4.890690353e-06f, +3.215632773e-06f, + -6.242388136e-04f, -9.380241521e-04f, -5.436727276e-04f, +1.050277901e-03f, +3.581509622e-03f, +5.658962910e-03f, +5.177196595e-03f, +6.217617216e-04f, -7.358849707e-03f, -1.526258854e-02f, -1.787125960e-02f, -1.112892671e-02f, +4.664594100e-03f, +2.348494782e-02f, +3.554996249e-02f, +3.225770044e-02f, +1.164178968e-02f, -1.900386645e-02f, -4.552640766e-02f, -5.374798947e-02f, -3.729825146e-02f, -1.956255983e-03f, +3.637350828e-02f, +5.940386586e-02f, +5.589265961e-02f, +2.756317198e-02f, -1.180791542e-02f, -4.362046669e-02f, -5.395095548e-02f, -4.013607527e-02f, -1.111229506e-02f, +1.817576022e-02f, +3.478198680e-02f, +3.371348080e-02f, +1.900606147e-02f, +1.049357040e-04f, -1.377245694e-02f, -1.799005142e-02f, -1.357256955e-02f, -5.188687040e-03f, +2.155941804e-03f, +5.646313098e-03f, +5.294801400e-03f, +2.918020982e-03f, +5.351965681e-04f, -7.434502560e-04f, -8.996769549e-04f, -5.114588003e-04f, + +1.401580941e-05f, +2.576097353e-06f, -2.919248539e-05f, -6.817583254e-05f, -8.224203962e-05f, -3.734144779e-05f, +7.291550570e-05f, +2.049757937e-04f, +2.731006376e-04f, +1.946257141e-04f, -4.720711048e-05f, -3.640416994e-04f, -5.842465376e-04f, -5.399005393e-04f, -1.772823189e-04f, +3.782138509e-04f, +8.568556929e-04f, +9.776045272e-04f, +6.128962056e-04f, -1.129411618e-04f, -8.616565938e-04f, -1.248620255e-03f, -1.052431269e-03f, -3.462455733e-04f, +5.300119093e-04f, +1.146340453e-03f, +1.210209701e-03f, +7.165965704e-04f, -6.170566071e-05f, -7.319029046e-04f, -9.918368755e-04f, -7.742869352e-04f, -2.525782520e-04f, +2.802721994e-04f, +5.775220799e-04f, +5.538990566e-04f, +2.963281919e-04f, -1.684004711e-05f, -2.266790381e-04f, -2.684505191e-04f, -1.782064426e-04f, -4.459095839e-05f, +5.321221614e-05f, +8.323316251e-05f, +6.045583661e-05f, +2.083079621e-05f, -6.860183518e-06f, -1.407943605e-05f, + /* 3,13 (48) */ + +3.295902214e-04f, +2.632417850e-04f, -1.828145464e-04f, -1.043256267e-03f, -2.074028631e-03f, -2.730166571e-03f, -2.323655591e-03f, -3.544489835e-04f, +3.096294520e-03f, +7.102364533e-03f, +9.955110207e-03f, +9.653554485e-03f, +4.745244568e-03f, -4.752183197e-03f, -1.673753533e-02f, -2.707988440e-02f, -3.050177430e-02f, -2.214400941e-02f, +6.432179961e-04f, +3.691086891e-02f, +8.169709659e-02f, +1.268747571e-01f, +1.631155538e-01f, +1.824103978e-01f, +1.803491464e-01f, +1.574072160e-01f, +1.188059793e-01f, +7.299417980e-02f, +2.926029617e-02f, -4.740590971e-03f, -2.477329412e-02f, -3.063070181e-02f, -2.550370200e-02f, -1.446763136e-02f, -2.688212851e-03f, +6.041931983e-03f, +1.003212033e-02f, +9.601948977e-03f, +6.379430120e-03f, +2.366828863e-03f, -8.496342961e-04f, -2.509510310e-03f, -2.667550273e-03f, -1.889410522e-03f, -8.571638223e-04f, -6.545460513e-05f, +3.001852281e-04f, +3.137473605e-04f, + -2.197147050e-06f, +7.086850493e-06f, +2.064315845e-05f, +3.156766014e-05f, +3.000899140e-05f, +7.930457114e-06f, -3.485349373e-05f, -8.640486925e-05f, -1.233441411e-04f, -1.181016416e-04f, -5.140498176e-05f, +7.446994021e-05f, +2.279157587e-04f, +3.510625815e-04f, +3.754432374e-04f, +2.467089309e-04f, -4.994259172e-05f, -4.739739316e-04f, -9.315639451e-04f, -1.297771287e-03f, -1.453351592e-03f, -1.324372214e-03f, -9.104801481e-04f, -2.907897042e-04f, +3.960294623e-04f, +9.915832698e-04f, +1.364260906e-03f, +1.446685114e-03f, +1.251748745e-03f, +8.627738789e-04f, +4.026019717e-04f, -6.519680158e-06f, -2.781208480e-04f, -3.806926450e-04f, -3.366197546e-04f, -2.042352704e-04f, -5.182767860e-05f, +6.611069114e-05f, +1.226735902e-04f, +1.196785074e-04f, +7.861776763e-05f, +2.713456492e-05f, -1.286957906e-05f, -3.146290874e-05f, -3.042475383e-05f, -1.847147940e-05f, -5.244047141e-06f, +3.062098378e-06f, + -6.102230042e-04f, -9.354480548e-04f, -5.728652130e-04f, +9.821020684e-04f, +3.499267583e-03f, +5.621621462e-03f, +5.250112100e-03f, +8.267375154e-04f, -7.085749070e-03f, -1.506796282e-02f, -1.791846671e-02f, -1.149296841e-02f, +4.080347563e-03f, +2.294504728e-02f, +3.537268017e-02f, +3.263591429e-02f, +1.249864538e-02f, -1.802626192e-02f, -4.491351145e-02f, -5.386093063e-02f, -3.815990806e-02f, -3.204876238e-03f, +3.532107701e-02f, +5.905762029e-02f, +5.642267152e-02f, +2.870951243e-02f, -1.059770572e-02f, -4.290387012e-02f, -5.401266115e-02f, -4.086797817e-02f, -1.210413194e-02f, +1.740147328e-02f, +3.452940855e-02f, +3.399375300e-02f, +1.958358355e-02f, +6.588347606e-04f, -1.347612875e-02f, -1.800689146e-02f, -1.379924859e-02f, -5.457137559e-03f, +1.977735361e-03f, +5.601722139e-03f, +5.348013616e-03f, +3.001254144e-03f, +5.956524047e-04f, -7.226194598e-04f, -9.065371384e-04f, -5.255382364e-04f, + +1.406857895e-05f, +3.252620996e-06f, -2.796584406e-05f, -6.713539017e-05f, -8.255610087e-05f, -3.981650256e-05f, +6.877679563e-05f, +2.013146568e-04f, +2.728658730e-04f, +1.997174486e-04f, -3.778106486e-05f, -3.546031149e-04f, -5.806806360e-04f, -5.462594666e-04f, -1.926506653e-04f, +3.604097550e-04f, +8.460869904e-04f, +9.811198106e-04f, +6.310722668e-04f, -8.781111195e-05f, -8.419478380e-04f, -1.244892900e-03f, -1.067464972e-03f, -3.731266840e-04f, +5.044540557e-04f, +1.134573895e-03f, +1.217437800e-03f, +7.382770122e-04f, -3.699888530e-05f, -7.161126399e-04f, -9.912794543e-04f, -7.870696480e-04f, -2.706219801e-04f, +2.662457264e-04f, +5.731333272e-04f, +5.589810390e-04f, +3.062062311e-04f, -7.987330131e-06f, -2.226156529e-04f, -2.695333162e-04f, -1.821785519e-04f, -4.853490644e-05f, +5.115424196e-05f, +8.325930343e-05f, +6.161514808e-05f, +2.198985344e-05f, -6.312639966e-06f, -1.411216429e-05f, + /* 3,14 (48) */ + +3.273930744e-04f, +2.703286355e-04f, -1.621713879e-04f, -1.011688607e-03f, -2.044019640e-03f, -2.722236114e-03f, -2.358509085e-03f, -4.408538528e-04f, +2.972950379e-03f, +6.984262892e-03f, +9.903705225e-03f, +9.728024426e-03f, +4.973160327e-03f, -4.401120615e-03f, -1.636209209e-02f, -2.683317547e-02f, -3.055171689e-02f, -2.261798335e-02f, -2.883459489e-04f, +3.561309763e-02f, +8.024374500e-02f, +1.255503848e-01f, +1.622050736e-01f, +1.821196081e-01f, +1.807451759e-01f, +1.583987993e-01f, +1.201702402e-01f, +7.444086492e-02f, +3.051204491e-02f, -3.877817092e-03f, -2.437069214e-02f, -3.063722149e-02f, -2.578182284e-02f, -1.484832400e-02f, -3.024832606e-03f, +5.837696713e-03f, +9.980292652e-03f, +9.668059669e-03f, +6.502103710e-03f, +2.486507371e-03f, -7.710165285e-04f, -2.482375745e-03f, -2.680419852e-03f, -1.920873431e-03f, -8.875885761e-04f, -8.392608453e-05f, +2.949411810e-04f, +3.168094589e-04f, + -2.383181810e-06f, +6.708567489e-06f, +2.021230241e-05f, +3.136244093e-05f, +3.034044483e-05f, +8.961387132e-06f, -3.328835692e-05f, -8.487177515e-05f, -1.226913964e-04f, -1.191381742e-04f, -5.446854234e-05f, +6.987746041e-05f, +2.232285908e-04f, +3.483607951e-04f, +3.767937026e-04f, +2.533297261e-04f, -3.838391195e-05f, -4.596144407e-04f, -9.179690811e-04f, -1.288972640e-03f, -1.452581076e-03f, -1.332924566e-03f, -9.271268379e-04f, -3.119915824e-04f, +3.751451082e-04f, +9.757955423e-04f, +1.356859895e-03f, +1.448578267e-03f, +1.261352435e-03f, +8.766869402e-04f, +4.167842732e-04f, +4.502532065e-06f, -2.721772587e-04f, -3.799406942e-04f, -3.396908715e-04f, -2.090161747e-04f, -5.628936525e-05f, +6.329280311e-05f, +1.218805365e-04f, +1.204903340e-04f, +8.019782480e-05f, +2.865592357e-05f, -1.192512019e-05f, -3.121241575e-05f, -3.067605374e-05f, -1.890874794e-05f, -5.602632266e-06f, +2.902111970e-06f, + -5.961544252e-04f, -9.321954338e-04f, -6.008310570e-04f, +9.149666782e-04f, +3.416711482e-03f, +5.581804959e-03f, +5.318888896e-03f, +1.028052172e-03f, -6.812883197e-03f, -1.486824537e-02f, -1.795624778e-02f, -1.184757153e-02f, +3.499666927e-03f, +2.239878781e-02f, +3.518002950e-02f, +3.299632404e-02f, +1.334473237e-02f, -1.704514211e-02f, -4.428243918e-02f, -5.394874174e-02f, -3.900185590e-02f, -4.449769137e-03f, +3.425361204e-02f, +5.868449360e-02f, +5.692712557e-02f, +2.984408633e-02f, -9.380267921e-03f, -4.216559311e-02f, -5.404966003e-02f, -4.158409081e-02f, -1.309541139e-02f, +1.661440363e-02f, +3.425878657e-02f, +3.425999873e-02f, +2.015671688e-02f, +1.217815800e-03f, -1.316992252e-02f, -1.801487879e-02f, -1.402186424e-02f, -5.726670876e-03f, +1.795556809e-03f, +5.553187233e-03f, +5.399167858e-03f, +3.084513448e-03f, +6.572675528e-04f, -7.006296063e-04f, -9.128497784e-04f, -5.396504007e-04f, + +1.410617540e-05f, +3.907656596e-06f, -2.674875237e-05f, -6.607214521e-05f, -8.281113071e-05f, -4.222286763e-05f, +6.466542856e-05f, +1.975941101e-04f, +2.724843481e-04f, +2.046394595e-04f, -2.844020036e-05f, -3.450762209e-04f, -5.768508178e-04f, -5.522910060e-04f, -2.078110696e-04f, +3.425416332e-04f, +8.349630263e-04f, +9.841393894e-04f, +6.488688858e-04f, -6.272035180e-05f, -8.218824541e-04f, -1.240573095e-03f, -1.081970105e-03f, -3.998203004e-04f, +4.786430117e-04f, +1.122247835e-03f, +1.224092438e-03f, +7.596573427e-04f, -1.219055996e-05f, -6.999073479e-04f, -9.902326461e-04f, -7.995367523e-04f, -2.886497384e-04f, +2.519804530e-04f, +5.684158539e-04f, +5.638219262e-04f, +3.160260501e-04f, +9.709917061e-07f, -2.183795704e-04f, -2.704803945e-04f, -1.861063893e-04f, -5.251626648e-05f, +4.902610125e-05f, +8.323115426e-05f, +6.275761546e-05f, +2.316181566e-05f, -5.743650604e-06f, -1.413158128e-05f, + /* 3,15 (48) */ + +3.250098926e-04f, +2.770372030e-04f, -1.419590855e-04f, -9.803261659e-04f, -2.013679195e-03f, -2.713274727e-03f, -2.391797442e-03f, -5.257256279e-04f, +2.850258983e-03f, +6.865124717e-03f, +9.849236683e-03f, +9.797901886e-03f, +5.196388918e-03f, -4.052759820e-03f, -1.598529839e-02f, -2.657984575e-02f, -3.059010081e-02f, -2.307759779e-02f, -1.206315030e-03f, +3.432412499e-02f, +7.879116392e-02f, +1.242174603e-01f, +1.612779468e-01f, +1.818076165e-01f, +1.811203210e-01f, +1.593745949e-01f, +1.215271001e-01f, +7.588944319e-02f, +3.177339735e-02f, -3.001130152e-03f, -2.395390787e-02f, -3.063271896e-02f, -2.605400010e-02f, -1.522826470e-02f, -3.364523477e-03f, +5.628680538e-03f, +9.924003287e-03f, +9.731352472e-03f, +6.623984247e-03f, +2.606997705e-03f, -6.908187037e-04f, -2.453719821e-03f, -2.692344972e-03f, -1.952085847e-03f, -9.182646299e-04f, -1.028348325e-04f, +2.893385487e-04f, +3.197115708e-04f, + -2.562675888e-06f, +6.335016514e-06f, +1.977943119e-05f, +3.114521951e-05f, +3.065137718e-05f, +9.970900371e-06f, -3.173335146e-05f, -8.332567041e-05f, -1.219976229e-04f, -1.201132422e-04f, -5.747132589e-05f, +6.531561133e-05f, +2.185148898e-04f, +3.455635110e-04f, +3.779925682e-04f, +2.597815341e-04f, -2.695630896e-05f, -4.452939862e-04f, -9.042885929e-04f, -1.279967744e-03f, -1.451527745e-03f, -1.341190709e-03f, -9.435639419e-04f, -3.331213445e-04f, +3.541741317e-04f, +9.597879820e-04f, +1.349169503e-03f, +1.450192989e-03f, +1.270759895e-03f, +8.905265289e-04f, +4.310160983e-04f, +1.566184617e-05f, -2.660641087e-04f, -3.790411232e-04f, -3.426728319e-04f, -2.137767305e-04f, -6.078578988e-05f, +6.041288532e-05f, +1.210272284e-04f, +1.212636550e-04f, +8.176740537e-05f, +3.018902766e-05f, -1.095885470e-05f, -3.094197089e-05f, -3.091631653e-05f, -1.934482185e-05f, -5.966329238e-06f, +2.735645829e-06f, + -5.820482498e-04f, -9.282877772e-04f, -6.275798094e-04f, +8.488945330e-04f, +3.333900351e-03f, +5.539582092e-03f, +5.383554324e-03f, +1.225646282e-03f, -6.540398849e-03f, -1.466360591e-02f, -1.798468798e-02f, -1.219264775e-02f, +2.922816109e-03f, +2.184649681e-02f, +3.497221844e-02f, +3.333886568e-02f, +1.417969539e-02f, -1.606100272e-02f, -4.363357030e-02f, -5.401146209e-02f, -3.982373835e-02f, -5.690342233e-03f, +3.317164193e-02f, +5.828467330e-02f, +5.740576858e-02f, +3.096633416e-02f, -8.156175483e-03f, -4.140593577e-02f, -5.406185059e-02f, -4.228399816e-02f, -1.408564404e-02f, +1.581486688e-02f, +3.397013683e-02f, +3.451197918e-02f, +2.072513273e-02f, +1.781637726e-03f, -1.285389647e-02f, -1.801390780e-02f, -1.424024381e-02f, -5.997151270e-03f, +1.609450420e-03f, +5.500670966e-03f, +5.448193960e-03f, +3.167744602e-03f, +7.200251683e-04f, -6.774677907e-04f, -9.185934290e-04f, -5.537819819e-04f, + +1.412896176e-05f, +4.541176552e-06f, -2.554192529e-05f, -6.498730276e-05f, -8.300802883e-05f, -4.456014472e-05f, +6.058351699e-05f, +1.938171938e-04f, +2.719581501e-04f, +2.093909339e-04f, -1.918879431e-05f, -3.354670587e-04f, -5.727614348e-04f, -5.579945201e-04f, -2.227570335e-04f, +3.246191624e-04f, +8.234914461e-04f, +9.866640079e-04f, +6.662784709e-04f, -3.768147783e-05f, -8.014714454e-04f, -1.235664035e-03f, -1.095939898e-03f, -4.263130497e-04f, +4.525916689e-04f, +1.109367871e-03f, +1.230169216e-03f, +7.807259716e-04f, +1.270702101e-05f, -6.832936650e-04f, -9.886946717e-04f, -8.116800428e-04f, -3.066519920e-04f, +2.374822193e-04f, +5.633695578e-04f, +5.684169483e-04f, +3.257816614e-04f, +1.003102933e-05f, -2.139711689e-04f, -2.712894287e-04f, -1.899869437e-04f, -5.653312481e-05f, +4.682798754e-05f, +8.314772024e-05f, +6.388206201e-05f, +2.434605598e-05f, -5.153171625e-06f, -1.413730612e-05f, + /* 3,16 (48) */ + +3.224472167e-04f, +2.833722195e-04f, -1.221796543e-04f, -9.491809464e-04f, -1.983027818e-03f, -2.703303827e-03f, -2.423530794e-03f, -6.090512983e-04f, +2.728261360e-03f, +6.745011475e-03f, +9.791765357e-03f, +9.863217497e-03f, +5.414903808e-03f, -3.707196309e-03f, -1.560730582e-02f, -2.632006421e-02f, -3.061705711e-02f, -2.352289177e-02f, -2.110603623e-03f, +3.304415724e-02f, +7.733963617e-02f, +1.228762696e-01f, +1.603343828e-01f, +1.814744951e-01f, +1.814744951e-01f, +1.603343828e-01f, +1.228762696e-01f, +7.733963617e-02f, +3.304415724e-02f, -2.110603623e-03f, -2.352289177e-02f, -3.061705711e-02f, -2.632006421e-02f, -1.560730582e-02f, -3.707196309e-03f, +5.414903808e-03f, +9.863217497e-03f, +9.791765357e-03f, +6.745011475e-03f, +2.728261360e-03f, -6.090512983e-04f, -2.423530794e-03f, -2.703303827e-03f, -1.983027818e-03f, -9.491809464e-04f, -1.221796543e-04f, +2.833722195e-04f, +3.224472167e-04f, + -2.735645829e-06f, +5.966329238e-06f, +1.934482185e-05f, +3.091631653e-05f, +3.094197089e-05f, +1.095885470e-05f, -3.018902766e-05f, -8.176740537e-05f, -1.212636550e-04f, -1.210272284e-04f, -6.041288532e-05f, +6.078578988e-05f, +2.137767305e-04f, +3.426728319e-04f, +3.790411232e-04f, +2.660641087e-04f, -1.566184617e-05f, -4.310160983e-04f, -8.905265289e-04f, -1.270759895e-03f, -1.450192989e-03f, -1.349169503e-03f, -9.597879820e-04f, -3.541741317e-04f, +3.331213445e-04f, +9.435639419e-04f, +1.341190709e-03f, +1.451527745e-03f, +1.279967744e-03f, +9.042885929e-04f, +4.452939862e-04f, +2.695630896e-05f, -2.597815341e-04f, -3.779925682e-04f, -3.455635110e-04f, -2.185148898e-04f, -6.531561133e-05f, +5.747132589e-05f, +1.201132422e-04f, +1.219976229e-04f, +8.332567041e-05f, +3.173335146e-05f, -9.970900371e-06f, -3.065137718e-05f, -3.114521951e-05f, -1.977943119e-05f, -6.335016514e-06f, +2.562675888e-06f, + -5.679192881e-04f, -9.237466006e-04f, -6.531217347e-04f, +7.839072303e-04f, +3.250892322e-03f, +5.495021947e-03f, +5.444137841e-03f, +1.419463476e-03f, -6.268440699e-03f, -1.445421498e-02f, -1.800387677e-02f, -1.252811481e-02f, +2.350054674e-03f, +2.128850229e-02f, +3.474946140e-02f, +3.366348484e-02f, +1.500318684e-02f, -1.507433871e-02f, -4.296729183e-02f, -5.404914357e-02f, -4.062520980e-02f, -6.926006268e-03f, +3.207570204e-02f, +5.785836025e-02f, +5.785836025e-02f, +3.207570204e-02f, -6.926006268e-03f, -4.062520980e-02f, -5.404914357e-02f, -4.296729183e-02f, -1.507433871e-02f, +1.500318684e-02f, +3.366348484e-02f, +3.474946140e-02f, +2.128850229e-02f, +2.350054674e-03f, -1.252811481e-02f, -1.800387677e-02f, -1.445421498e-02f, -6.268440699e-03f, +1.419463476e-03f, +5.444137841e-03f, +5.495021947e-03f, +3.250892322e-03f, +7.839072303e-04f, -6.531217347e-04f, -9.237466006e-04f, -5.679192881e-04f, + +1.413730612e-05f, +5.153171625e-06f, -2.434605598e-05f, -6.388206201e-05f, -8.314772024e-05f, -4.682798754e-05f, +5.653312481e-05f, +1.899869437e-04f, +2.712894287e-04f, +2.139711689e-04f, -1.003102933e-05f, -3.257816614e-04f, -5.684169483e-04f, -5.633695578e-04f, -2.374822193e-04f, +3.066519920e-04f, +8.116800428e-04f, +9.886946717e-04f, +6.832936650e-04f, -1.270702101e-05f, -7.807259716e-04f, -1.230169216e-03f, -1.109367871e-03f, -4.525916689e-04f, +4.263130497e-04f, +1.095939898e-03f, +1.235664035e-03f, +8.014714454e-04f, +3.768147783e-05f, -6.662784709e-04f, -9.866640079e-04f, -8.234914461e-04f, -3.246191624e-04f, +2.227570335e-04f, +5.579945201e-04f, +5.727614348e-04f, +3.354670587e-04f, +1.918879431e-05f, -2.093909339e-04f, -2.719581501e-04f, -1.938171938e-04f, -6.058351699e-05f, +4.456014472e-05f, +8.300802883e-05f, +6.498730276e-05f, +2.554192529e-05f, -4.541176552e-06f, -1.412896176e-05f, + /* 3,17 (48) */ + +3.197115708e-04f, +2.893385487e-04f, -1.028348325e-04f, -9.182646299e-04f, -1.952085847e-03f, -2.692344972e-03f, -2.453719821e-03f, -6.908187037e-04f, +2.606997705e-03f, +6.623984247e-03f, +9.731352472e-03f, +9.924003287e-03f, +5.628680538e-03f, -3.364523477e-03f, -1.522826470e-02f, -2.605400010e-02f, -3.063271896e-02f, -2.395390787e-02f, -3.001130152e-03f, +3.177339735e-02f, +7.588944319e-02f, +1.215271001e-01f, +1.593745949e-01f, +1.811203210e-01f, +1.818076165e-01f, +1.612779468e-01f, +1.242174603e-01f, +7.879116392e-02f, +3.432412499e-02f, -1.206315030e-03f, -2.307759779e-02f, -3.059010081e-02f, -2.657984575e-02f, -1.598529839e-02f, -4.052759820e-03f, +5.196388918e-03f, +9.797901886e-03f, +9.849236683e-03f, +6.865124717e-03f, +2.850258983e-03f, -5.257256279e-04f, -2.391797442e-03f, -2.713274727e-03f, -2.013679195e-03f, -9.803261659e-04f, -1.419590855e-04f, +2.770372030e-04f, +3.250098926e-04f, + -2.902111970e-06f, +5.602632266e-06f, +1.890874794e-05f, +3.067605374e-05f, +3.121241575e-05f, +1.192512019e-05f, -2.865592357e-05f, -8.019782480e-05f, -1.204903340e-04f, -1.218805365e-04f, -6.329280311e-05f, +5.628936525e-05f, +2.090161747e-04f, +3.396908715e-04f, +3.799406942e-04f, +2.721772587e-04f, -4.502532065e-06f, -4.167842732e-04f, -8.766869402e-04f, -1.261352435e-03f, -1.448578267e-03f, -1.356859895e-03f, -9.757955423e-04f, -3.751451082e-04f, +3.119915824e-04f, +9.271268379e-04f, +1.332924566e-03f, +1.452581076e-03f, +1.288972640e-03f, +9.179690811e-04f, +4.596144407e-04f, +3.838391195e-05f, -2.533297261e-04f, -3.767937026e-04f, -3.483607951e-04f, -2.232285908e-04f, -6.987746041e-05f, +5.446854234e-05f, +1.191381742e-04f, +1.226913964e-04f, +8.487177515e-05f, +3.328835692e-05f, -8.961387132e-06f, -3.034044483e-05f, -3.136244093e-05f, -2.021230241e-05f, -6.708567489e-06f, +2.383181810e-06f, + -5.537819819e-04f, -9.185934290e-04f, -6.774677907e-04f, +7.200251683e-04f, +3.167744602e-03f, +5.448193960e-03f, +5.500670966e-03f, +1.609450420e-03f, -5.997151270e-03f, -1.424024381e-02f, -1.801390780e-02f, -1.285389647e-02f, +1.781637726e-03f, +2.072513273e-02f, +3.451197918e-02f, +3.397013683e-02f, +1.581486688e-02f, -1.408564404e-02f, -4.228399816e-02f, -5.406185059e-02f, -4.140593577e-02f, -8.156175483e-03f, +3.096633416e-02f, +5.740576858e-02f, +5.828467330e-02f, +3.317164193e-02f, -5.690342233e-03f, -3.982373835e-02f, -5.401146209e-02f, -4.363357030e-02f, -1.606100272e-02f, +1.417969539e-02f, +3.333886568e-02f, +3.497221844e-02f, +2.184649681e-02f, +2.922816109e-03f, -1.219264775e-02f, -1.798468798e-02f, -1.466360591e-02f, -6.540398849e-03f, +1.225646282e-03f, +5.383554324e-03f, +5.539582092e-03f, +3.333900351e-03f, +8.488945330e-04f, -6.275798094e-04f, -9.282877772e-04f, -5.820482498e-04f, + +1.413158128e-05f, +5.743650604e-06f, -2.316181566e-05f, -6.275761546e-05f, -8.323115426e-05f, -4.902610125e-05f, +5.251626648e-05f, +1.861063893e-04f, +2.704803945e-04f, +2.183795704e-04f, -9.709917061e-07f, -3.160260501e-04f, -5.638219262e-04f, -5.684158539e-04f, -2.519804530e-04f, +2.886497384e-04f, +7.995367523e-04f, +9.902326461e-04f, +6.999073479e-04f, +1.219055996e-05f, -7.596573427e-04f, -1.224092438e-03f, -1.122247835e-03f, -4.786430117e-04f, +3.998203004e-04f, +1.081970105e-03f, +1.240573095e-03f, +8.218824541e-04f, +6.272035180e-05f, -6.488688858e-04f, -9.841393894e-04f, -8.349630263e-04f, -3.425416332e-04f, +2.078110696e-04f, +5.522910060e-04f, +5.768508178e-04f, +3.450762209e-04f, +2.844020036e-05f, -2.046394595e-04f, -2.724843481e-04f, -1.975941101e-04f, -6.466542856e-05f, +4.222286763e-05f, +8.281113071e-05f, +6.607214521e-05f, +2.674875237e-05f, -3.907656596e-06f, -1.410617540e-05f, + /* 3,18 (48) */ + +3.168094589e-04f, +2.949411810e-04f, -8.392608453e-05f, -8.875885761e-04f, -1.920873431e-03f, -2.680419852e-03f, -2.482375745e-03f, -7.710165285e-04f, +2.486507371e-03f, +6.502103710e-03f, +9.668059669e-03f, +9.980292652e-03f, +5.837696713e-03f, -3.024832606e-03f, -1.484832400e-02f, -2.578182284e-02f, -3.063722149e-02f, -2.437069214e-02f, -3.877817092e-03f, +3.051204491e-02f, +7.444086492e-02f, +1.201702402e-01f, +1.583987993e-01f, +1.807451759e-01f, +1.821196081e-01f, +1.622050736e-01f, +1.255503848e-01f, +8.024374500e-02f, +3.561309763e-02f, -2.883459489e-04f, -2.261798335e-02f, -3.055171689e-02f, -2.683317547e-02f, -1.636209209e-02f, -4.401120615e-03f, +4.973160327e-03f, +9.728024426e-03f, +9.903705225e-03f, +6.984262892e-03f, +2.972950379e-03f, -4.408538528e-04f, -2.358509085e-03f, -2.722236114e-03f, -2.044019640e-03f, -1.011688607e-03f, -1.621713879e-04f, +2.703286355e-04f, +3.273930744e-04f, + -3.062098378e-06f, +5.244047141e-06f, +1.847147940e-05f, +3.042475383e-05f, +3.146290874e-05f, +1.286957906e-05f, -2.713456492e-05f, -7.861776763e-05f, -1.196785074e-04f, -1.226735902e-04f, -6.611069114e-05f, +5.182767860e-05f, +2.042352704e-04f, +3.366197546e-04f, +3.806926450e-04f, +2.781208480e-04f, +6.519680158e-06f, -4.026019717e-04f, -8.627738789e-04f, -1.251748745e-03f, -1.446685114e-03f, -1.364260906e-03f, -9.915832698e-04f, -3.960294623e-04f, +2.907897042e-04f, +9.104801481e-04f, +1.324372214e-03f, +1.453351592e-03f, +1.297771287e-03f, +9.315639451e-04f, +4.739739316e-04f, +4.994259172e-05f, -2.467089309e-04f, -3.754432374e-04f, -3.510625815e-04f, -2.279157587e-04f, -7.446994021e-05f, +5.140498176e-05f, +1.181016416e-04f, +1.233441411e-04f, +8.640486925e-05f, +3.485349373e-05f, -7.930457114e-06f, -3.000899140e-05f, -3.156766014e-05f, -2.064315845e-05f, -7.086850493e-06f, +2.197147050e-06f, + -5.396504007e-04f, -9.128497784e-04f, -7.006296063e-04f, +6.572675528e-04f, +3.084513448e-03f, +5.399167858e-03f, +5.553187233e-03f, +1.795556809e-03f, -5.726670876e-03f, -1.402186424e-02f, -1.801487879e-02f, -1.316992252e-02f, +1.217815800e-03f, +2.015671688e-02f, +3.425999873e-02f, +3.425878657e-02f, +1.661440363e-02f, -1.309541139e-02f, -4.158409081e-02f, -5.404966003e-02f, -4.216559311e-02f, -9.380267921e-03f, +2.984408633e-02f, +5.692712557e-02f, +5.868449360e-02f, +3.425361204e-02f, -4.449769137e-03f, -3.900185590e-02f, -5.394874174e-02f, -4.428243918e-02f, -1.704514211e-02f, +1.334473237e-02f, +3.299632404e-02f, +3.518002950e-02f, +2.239878781e-02f, +3.499666927e-03f, -1.184757153e-02f, -1.795624778e-02f, -1.486824537e-02f, -6.812883197e-03f, +1.028052172e-03f, +5.318888896e-03f, +5.581804959e-03f, +3.416711482e-03f, +9.149666782e-04f, -6.008310570e-04f, -9.321954338e-04f, -5.961544252e-04f, + +1.411216429e-05f, +6.312639966e-06f, -2.198985344e-05f, -6.161514808e-05f, -8.325930343e-05f, -5.115424196e-05f, +4.853490644e-05f, +1.821785519e-04f, +2.695333162e-04f, +2.226156529e-04f, +7.987330131e-06f, -3.062062311e-04f, -5.589810390e-04f, -5.731333272e-04f, -2.662457264e-04f, +2.706219801e-04f, +7.870696480e-04f, +9.912794543e-04f, +7.161126399e-04f, +3.699888530e-05f, -7.382770122e-04f, -1.217437800e-03f, -1.134573895e-03f, -5.044540557e-04f, +3.731266840e-04f, +1.067464972e-03f, +1.244892900e-03f, +8.419478380e-04f, +8.781111195e-05f, -6.310722668e-04f, -9.811198106e-04f, -8.460869904e-04f, -3.604097550e-04f, +1.926506653e-04f, +5.462594666e-04f, +5.806806360e-04f, +3.546031149e-04f, +3.778106486e-05f, -1.997174486e-04f, -2.728658730e-04f, -2.013146568e-04f, -6.877679563e-05f, +3.981650256e-05f, +8.255610087e-05f, +6.713539017e-05f, +2.796584406e-05f, -3.252620996e-06f, -1.406857895e-05f, + /* 3,19 (48) */ + +3.137473605e-04f, +3.001852281e-04f, -6.545460513e-05f, -8.571638223e-04f, -1.889410522e-03f, -2.667550273e-03f, -2.509510310e-03f, -8.496342961e-04f, +2.366828863e-03f, +6.379430120e-03f, +9.601948977e-03f, +1.003212033e-02f, +6.041931983e-03f, -2.688212851e-03f, -1.446763136e-02f, -2.550370200e-02f, -3.063070181e-02f, -2.477329412e-02f, -4.740590971e-03f, +2.926029617e-02f, +7.299417980e-02f, +1.188059793e-01f, +1.574072160e-01f, +1.803491464e-01f, +1.824103978e-01f, +1.631155538e-01f, +1.268747571e-01f, +8.169709659e-02f, +3.691086891e-02f, +6.432179961e-04f, -2.214400941e-02f, -3.050177430e-02f, -2.707988440e-02f, -1.673753533e-02f, -4.752183197e-03f, +4.745244568e-03f, +9.653554485e-03f, +9.955110207e-03f, +7.102364533e-03f, +3.096294520e-03f, -3.544489835e-04f, -2.323655591e-03f, -2.730166571e-03f, -2.074028631e-03f, -1.043256267e-03f, -1.828145464e-04f, +2.632417850e-04f, +3.295902214e-04f, + -3.215632773e-06f, +4.890690353e-06f, +1.803328241e-05f, +3.016274024e-05f, +3.169365385e-05f, +1.379212554e-05f, -2.562546495e-05f, -7.702806658e-05f, -1.188290291e-04f, -1.234068331e-04f, -6.886619058e-05f, +4.740204284e-05f, +1.994360514e-04f, +3.334616159e-04f, +3.812983756e-04f, +2.838947950e-04f, +1.740289287e-05f, -3.884726189e-04f, -8.487913969e-04f, -1.241952248e-03f, -1.444515133e-03f, -1.371371643e-03f, -1.007147876e-03f, -4.168224081e-04f, +2.695205899e-04f, +8.936274118e-04f, +1.315534869e-03f, +1.453837979e-03f, +1.306360431e-03f, +9.450691397e-04f, +4.883688957e-04f, +6.163023022e-05f, -2.399194504e-04f, -3.739399226e-04f, -3.536667805e-04f, -2.325743066e-04f, -7.909162632e-05f, +4.828112092e-05f, +1.170032827e-04f, +1.239550299e-04f, +8.792409713e-05f, +3.642819940e-05f, -6.878264766e-06f, -2.965684206e-05f, -3.176055781e-05f, -2.107171878e-05f, -7.469728793e-06f, +2.004558929e-06f, + -5.255382364e-04f, -9.065371384e-04f, -7.226194598e-04f, +5.956524047e-04f, +3.001254144e-03f, +5.348013616e-03f, +5.601722139e-03f, +1.977735361e-03f, -5.457137559e-03f, -1.379924859e-02f, -1.800689146e-02f, -1.347612875e-02f, +6.588347606e-04f, +1.958358355e-02f, +3.399375300e-02f, +3.452940855e-02f, +1.740147328e-02f, -1.210413194e-02f, -4.086797817e-02f, -5.401266115e-02f, -4.290387012e-02f, -1.059770572e-02f, +2.870951243e-02f, +5.642267152e-02f, +5.905762029e-02f, +3.532107701e-02f, -3.204876238e-03f, -3.815990806e-02f, -5.386093063e-02f, -4.491351145e-02f, -1.802626192e-02f, +1.249864538e-02f, +3.263591429e-02f, +3.537268017e-02f, +2.294504728e-02f, +4.080347563e-03f, -1.149296841e-02f, -1.791846671e-02f, -1.506796282e-02f, -7.085749070e-03f, +8.267375154e-04f, +5.250112100e-03f, +5.621621462e-03f, +3.499267583e-03f, +9.821020684e-04f, -5.728652130e-04f, -9.354480548e-04f, -6.102230042e-04f, + +1.407943605e-05f, +6.860183518e-06f, -2.083079621e-05f, -6.045583661e-05f, -8.323316251e-05f, -5.321221614e-05f, +4.459095839e-05f, +1.782064426e-04f, +2.684505191e-04f, +2.266790381e-04f, +1.684004711e-05f, -2.963281919e-04f, -5.538990566e-04f, -5.775220799e-04f, -2.802721994e-04f, +2.525782520e-04f, +7.742869352e-04f, +9.918368755e-04f, +7.319029046e-04f, +6.170566071e-05f, -7.165965704e-04f, -1.210209701e-03f, -1.146340453e-03f, -5.300119093e-04f, +3.462455733e-04f, +1.052431269e-03f, +1.248620255e-03f, +8.616565938e-04f, +1.129411618e-04f, -6.128962056e-04f, -9.776045272e-04f, -8.568556929e-04f, -3.782138509e-04f, +1.772823189e-04f, +5.399005393e-04f, +5.842465376e-04f, +3.640416994e-04f, +4.720711048e-05f, -1.946257141e-04f, -2.731006376e-04f, -2.049757937e-04f, -7.291550570e-05f, +3.734144779e-05f, +8.224203962e-05f, +6.817583254e-05f, +2.919248539e-05f, -2.576097353e-06f, -1.401580941e-05f, + /* 3,20 (48) */ + +3.105317277e-04f, +3.050759185e-04f, -4.742132272e-05f, -8.270010821e-04f, -1.857716868e-03f, -2.653758147e-03f, -2.535135775e-03f, -9.266623627e-04f, +2.247999834e-03f, +6.256023287e-03f, +9.533082787e-03f, +1.007952237e-02f, +6.241368035e-03f, -2.354751235e-03f, -1.408633298e-02f, -2.521980720e-02f, -3.061329892e-02f, -2.516176673e-02f, -5.589382368e-03f, +2.801834392e-02f, +7.154966467e-02f, +1.174346076e-01f, +1.564000682e-01f, +1.799323240e-01f, +1.826799183e-01f, +1.640091812e-01f, +1.281902919e-01f, +8.315093457e-02f, +3.821722934e-02f, +1.588287136e-03f, -2.165564052e-02f, -3.044014407e-02f, -2.731980385e-02f, -1.711147525e-02f, -5.105849977e-03f, +4.512670262e-03f, +9.574462859e-03f, +1.000339133e-02f, +7.219367816e-03f, +3.220249550e-03f, -2.665248864e-04f, -2.287227392e-03f, -2.737044836e-03f, -2.103685473e-03f, -1.075016825e-03f, -2.038862651e-04f, +2.557720562e-04f, +3.315947804e-04f, + -3.362746456e-06f, +4.542673343e-06f, +1.759441937e-05f, +2.989033697e-05f, +3.190486185e-05f, +1.469266580e-05f, -2.412912441e-05f, -7.542954791e-05f, -1.179427581e-04f, -1.240807285e-04f, -7.155897168e-05f, +4.301374243e-05f, +1.946205367e-04f, +3.302185990e-04f, +3.817593219e-04f, +2.894990723e-04f, +2.814526430e-05f, -3.743996030e-04f, -8.347435446e-04f, -1.231966404e-03f, -1.442070000e-03f, -1.378191292e-03f, -1.022486136e-03f, -4.375191867e-04f, +2.481891397e-04f, +8.765722283e-04f, +1.306413829e-03f, +1.454038996e-03f, +1.314736864e-03f, +9.584806249e-04f, +5.027957374e-04f, +7.344465519e-05f, -2.329616422e-04f, -3.722825470e-04f, -3.561713154e-04f, -2.372021356e-04f, -8.374106713e-05f, +4.509746638e-05f, +1.158427570e-04f, +1.245232433e-04f, +8.942859827e-05f, +3.801189943e-05f, -5.804976927e-06f, -2.928382971e-05f, -3.194081607e-05f, -2.149769957e-05f, -7.857060596e-06f, +1.805408701e-06f, + -5.114588003e-04f, -8.996769549e-04f, -7.434502560e-04f, +5.351965681e-04f, +2.918020982e-03f, +5.294801400e-03f, +5.646313098e-03f, +2.155941804e-03f, -5.188687040e-03f, -1.357256955e-02f, -1.799005142e-02f, -1.377245694e-02f, +1.049357040e-04f, +1.900606147e-02f, +3.371348080e-02f, +3.478198680e-02f, +1.817576022e-02f, -1.111229506e-02f, -4.013607527e-02f, -5.395095548e-02f, -4.362046669e-02f, -1.180791542e-02f, +2.756317198e-02f, +5.589265961e-02f, +5.940386586e-02f, +3.637350828e-02f, -1.956255983e-03f, -3.729825146e-02f, -5.374798947e-02f, -4.552640766e-02f, -1.900386645e-02f, +1.164178968e-02f, +3.225770044e-02f, +3.554996249e-02f, +2.348494782e-02f, +4.664594100e-03f, -1.112892671e-02f, -1.787125960e-02f, -1.526258854e-02f, -7.358849707e-03f, +6.217617216e-04f, +5.177196595e-03f, +5.658962910e-03f, +3.581509622e-03f, +1.050277901e-03f, -5.436727276e-04f, -9.380241521e-04f, -6.242388136e-04f, + +1.403378090e-05f, +7.386342037e-06f, -1.968524855e-05f, -5.928084880e-05f, -8.315374743e-05f, -5.519988007e-05f, +4.068628472e-05f, +1.741930608e-04f, +2.672343829e-04f, +2.305694545e-04f, +2.558337091e-05f, -2.863978978e-04f, -5.485808445e-04f, -5.815823955e-04f, -2.940542028e-04f, +2.345280409e-04f, +7.611969468e-04f, +9.919069428e-04f, +7.472717518e-04f, +8.629868392e-05f, -6.946277381e-04f, -1.202412830e-03f, -1.157542210e-03f, -5.553038192e-04f, +3.191904429e-04f, +1.036876048e-03f, +1.251752275e-03f, +8.809978815e-04f, +1.380978459e-04f, -5.943485240e-04f, -9.735930579e-04f, -8.672616412e-04f, -3.959442215e-04f, +1.617126870e-04f, +5.332150490e-04f, +5.875442840e-04f, +3.733859286e-04f, +5.671396693e-05f, -1.893651790e-04f, -2.731866196e-04f, -2.085744781e-04f, -7.707939839e-05f, +3.479815397e-05f, +8.186807367e-05f, +6.919226211e-05f, +3.042793978e-05f, -1.878131958e-06f, -1.394750936e-05f, + /* 3,21 (48) */ + +3.071689813e-04f, +3.096185918e-04f, -2.982690335e-05f, -7.971107451e-04f, -1.825812007e-03f, -2.639065481e-03f, -2.559264899e-03f, -1.002091911e-03f, +2.130057076e-03f, +6.131942559e-03f, +9.461523815e-03f, +1.012253612e-02f, +6.435988572e-03f, -2.024532636e-03f, -1.370457366e-02f, -2.493030813e-02f, -3.058515366e-02f, -2.553616634e-02f, -6.424125913e-03f, +2.678637751e-02f, +7.010759467e-02f, +1.160564163e-01f, +1.553775820e-01f, +1.794948048e-01f, +1.829281075e-01f, +1.648857534e-01f, +1.294967058e-01f, +8.460497356e-02f, +3.953196621e-02f, +2.546767761e-03f, -2.115284478e-02f, -3.036669942e-02f, -2.755276549e-02f, -1.748375780e-02f, -5.462021293e-03f, +4.275468126e-03f, +9.490721792e-03f, +1.004848879e-02f, +7.335210573e-03f, +3.344772793e-03f, -1.770962881e-04f, -2.249215493e-03f, -2.742849813e-03f, -2.132969303e-03f, -1.106957641e-03f, -2.253839647e-04f, +2.479149956e-04f, +3.334001891e-04f, + -3.503474237e-06f, +4.200102517e-06f, +1.715514875e-05f, +2.960786843e-05f, +3.209675012e-05f, +1.557111780e-05f, -2.264603142e-05f, -7.382303112e-05f, -1.170205588e-04f, -1.246957586e-04f, -7.418873365e-05f, +3.866403314e-05f, +1.897907297e-04f, +3.268928558e-04f, +3.820769545e-04f, +2.949337063e-04f, +3.874500880e-05f, -3.603862744e-04f, -8.206343697e-04f, -1.221794714e-03f, -1.439351461e-03f, -1.384719120e-03f, -1.037594893e-03f, -4.581150677e-04f, +2.268002720e-04f, +8.593182563e-04f, +1.297010470e-03f, +1.453953477e-03f, +1.322897423e-03f, +9.717943669e-04f, +5.172508300e-04f, +8.538364049e-05f, -2.258359200e-04f, -3.704699399e-04f, -3.585741237e-04f, -2.417971359e-04f, -8.841678412e-05f, +4.185455463e-05f, +1.146197461e-04f, +1.250479701e-04f, +9.091750758e-05f, +3.960400736e-05f, -4.710772911e-06f, -2.888979521e-05f, -3.210811875e-05f, -2.192081377e-05f, -8.248699053e-06f, +1.599691615e-06f, + -4.974250194e-04f, -8.922906129e-04f, -7.631355045e-04f, +4.759157193e-04f, +2.834867234e-03f, +5.239601520e-03f, +5.686999382e-03f, +2.330134864e-03f, -4.921452657e-03f, -1.334200010e-02f, -1.796446805e-02f, -1.405885484e-02f, -4.436451405e-04f, +1.842447907e-02f, +3.341942660e-02f, +3.501651484e-02f, +1.893695716e-02f, -1.012038812e-02f, -3.938880352e-02f, -5.386465680e-02f, -4.431509443e-02f, -1.301032825e-02f, +2.640562977e-02f, +5.533735579e-02f, +5.972305630e-02f, +3.741038433e-02f, -7.045037083e-04f, -3.641725358e-02f, -5.360989162e-02f, -4.612075618e-02f, -1.997745950e-02f, +1.077452804e-02f, +3.186175622e-02f, +3.571167518e-02f, +2.401816287e-02f, +5.252138384e-03f, -1.075554078e-02f, -1.781454564e-02f, -1.545195372e-02f, -7.632036327e-03f, +4.131872435e-04f, +5.100117196e-03f, +5.693761064e-03f, +3.663377696e-03f, +1.119470163e-03f, -5.132447878e-04f, -9.399022841e-04f, -6.381863229e-04f, + +1.397558619e-05f, +7.891192903e-06f, -1.855379262e-05f, -5.809134268e-05f, -8.302209420e-05f, -5.711713924e-05f, +3.682269594e-05f, +1.701413919e-04f, +2.658873395e-04f, +2.342867362e-04f, +3.421361529e-05f, -2.764212891e-04f, -5.430313600e-04f, -5.853147382e-04f, -3.075862399e-04f, +2.164807795e-04f, +7.478081370e-04f, +9.914919407e-04f, +7.622130399e-04f, +1.107658511e-04f, -6.723823597e-04f, -1.194052169e-03f, -1.168174171e-03f, -5.803171765e-04f, +2.919748629e-04f, +1.020806642e-03f, +1.254286383e-03f, +8.999610301e-04f, +1.632684572e-04f, -5.754372713e-04f, -9.690851856e-04f, -8.772975004e-04f, -4.135911510e-04f, +1.459485814e-04f, +5.262040092e-04f, +5.905697532e-04f, +3.826297553e-04f, +6.629717269e-05f, -1.839368776e-04f, -2.731218630e-04f, -2.121076666e-04f, -8.126626625e-05f, +3.218712466e-05f, +8.143335712e-05f, +7.018346438e-05f, +3.167144923e-05f, -1.158790106e-06f, -1.386332733e-05f, + /* 3,22 (48) */ + +3.036655070e-04f, +3.138186943e-04f, -1.267175460e-05f, -7.675028767e-04f, -1.793715256e-03f, -2.623494363e-03f, -2.581910930e-03f, -1.075914942e-03f, +2.013036517e-03f, +6.007246800e-03f, +9.387335081e-03f, +1.016120015e-02f, +6.625779301e-03f, -1.697639780e-03f, -1.332249670e-02f, -2.463537442e-02f, -3.054640865e-02f, -2.589655261e-02f, -7.244760282e-03f, +2.556458280e-02f, +6.866824321e-02f, +1.146716972e-01f, +1.543399871e-01f, +1.790366898e-01f, +1.831549078e-01f, +1.657450717e-01f, +1.307937162e-01f, +8.605892704e-02f, +4.085486363e-02f, +3.518562128e-03f, -2.063559395e-02f, -3.028131578e-02f, -2.777860141e-02f, -1.785422774e-02f, -5.820595416e-03f, +4.033670990e-03f, +9.402305008e-03f, +1.009034335e-02f, +7.449830319e-03f, +3.469820763e-03f, -8.617878055e-05f, -2.209611485e-03f, -2.747560586e-03f, -2.161859098e-03f, -1.139065760e-03f, -2.473047785e-04f, +2.396662965e-04f, +3.349998807e-04f, + -3.637854360e-06f, +3.863079261e-06f, +1.671572506e-05f, +2.931565927e-05f, +3.226954245e-05f, +1.642741121e-05f, -2.117666142e-05f, -7.220932865e-05f, -1.160633002e-04f, -1.252524243e-04f, -7.675520442e-05f, +3.435414183e-05f, +1.849486176e-04f, +3.234865456e-04f, +3.822527779e-04f, +3.001987772e-04f, +4.920039709e-05f, -3.464359449e-04f, -8.064679161e-04f, -1.211440714e-03f, -1.436361328e-03f, -1.390954474e-03f, -1.052471054e-03f, -4.786053506e-04f, +2.053589224e-04f, +8.418692126e-04f, +1.287326252e-03f, +1.453580330e-03f, +1.330838993e-03f, +9.850063393e-04f, +5.317305164e-04f, +9.744490656e-05f, -2.185427537e-04f, -3.685009711e-04f, -3.608731577e-04f, -2.463571875e-04f, -9.311727215e-05f, +3.855295216e-05f, +1.133339535e-04f, +1.255284079e-04f, +9.238995567e-05f, +4.120392496e-05f, -3.595844583e-06f, -2.847458756e-05f, -3.226215150e-05f, -2.234077122e-05f, -8.644492266e-06f, +1.387406987e-06f, + -4.834494332e-04f, -8.843994200e-04f, -7.816892972e-04f, +4.178243766e-04f, +2.751845140e-03f, +5.182484381e-03f, +5.723822078e-03f, +2.500276256e-03f, -4.655565318e-03f, -1.310771336e-02f, -1.793025443e-02f, -1.433527613e-02f, -9.866765005e-04f, +1.783916434e-02f, +3.311184036e-02f, +3.523299562e-02f, +1.968476530e-02f, -9.128896180e-03f, -3.862659048e-02f, -5.375389095e-02f, -4.498747679e-02f, -1.420438042e-02f, +2.523745560e-02f, +5.475703861e-02f, +6.001503116e-02f, +3.843119097e-02f, +5.497826750e-04f, -3.551729255e-02f, -5.344662316e-02f, -4.669619345e-02f, -2.094654469e-02f, +9.897230542e-03f, +3.144816507e-02f, +3.585762376e-02f, +2.454436688e-02f, +5.842708137e-03f, -1.037291103e-02f, -1.774824846e-02f, -1.563589059e-02f, -7.905158190e-03f, +2.010795769e-04f, +5.018850930e-03f, +5.725948188e-03f, +3.744811053e-03f, +1.189653627e-03f, -4.815733386e-04f, -9.410610742e-04f, -6.520496503e-04f, + +1.390524188e-05f, +8.374829719e-06f, -1.743698814e-05f, -5.688846585e-05f, -8.283925787e-05f, -5.896394766e-05f, +3.300195016e-05f, +1.660544062e-04f, +2.644118708e-04f, +2.378308219e-04f, +4.272719737e-05f, -2.664042772e-04f, -5.372556494e-04f, -5.887197505e-04f, -3.208629886e-04f, +1.984458425e-04f, +7.341290765e-04f, +9.905944033e-04f, +7.767208785e-04f, +1.350951634e-04f, -6.498723961e-04f, -1.185132988e-03f, -1.178231646e-03f, -6.050395244e-04f, +2.646124904e-04f, +1.004230662e-03f, +1.256220314e-03f, +9.185355443e-04f, +1.884402431e-04f, -5.561707202e-04f, -9.640809589e-04f, -8.869560984e-04f, -4.311449117e-04f, +1.299969664e-04f, +5.188686224e-04f, +5.933189432e-04f, +3.917671351e-04f, +7.595217688e-05f, -1.783419554e-04f, -2.729044808e-04f, -2.155723173e-04f, -8.547385565e-05f, +2.950891663e-05f, +8.093707251e-05f, +7.114822141e-05f, +3.292223457e-05f, -4.181563958e-07f, -1.376291828e-05f, + /* 3,23 (48) */ + +3.000276527e-04f, +3.176817736e-04f, +4.043970461e-06f, -7.381872174e-04f, -1.761445714e-03f, -2.607066952e-03f, -2.603087592e-03f, -1.148124270e-03f, +1.896973217e-03f, +5.881994376e-03f, +9.310579877e-03f, +1.019555429e-02f, +6.810727919e-03f, -1.374153235e-03f, -1.294024393e-02f, -2.433517564e-02f, -3.049720825e-02f, -2.624298856e-02f, -8.051228198e-03f, +2.435314209e-02f, +6.723188188e-02f, +1.132807427e-01f, +1.532875161e-01f, +1.785580844e-01f, +1.833602667e-01f, +1.665869409e-01f, +1.320810425e-01f, +8.751250737e-02f, +4.218570262e-02f, +4.503568467e-03f, -2.010386343e-02f, -3.018387087e-02f, -2.799714417e-02f, -1.822272871e-02f, -6.181468574e-03f, +3.787313803e-03f, +9.309187736e-03f, +1.012889630e-02f, +7.563164272e-03f, +3.595349171e-03f, +6.211175117e-06f, -2.168407560e-03f, -2.751156430e-03f, -2.190333686e-03f, -1.171327911e-03f, -2.696455497e-04f, +2.310218043e-04f, +3.363872877e-04f, + -3.765928427e-06f, +3.531699954e-06f, +1.627639872e-05f, +2.901403414e-05f, +3.242346883e-05f, +1.726148731e-05f, -1.972147714e-05f, -7.058924562e-05f, -1.150718556e-04f, -1.257512449e-04f, -7.925814052e-05f, +3.008526632e-05f, +1.800961712e-04f, +3.200018341e-04f, +3.822883300e-04f, +3.052944180e-04f, +5.950975647e-05f, -3.325518869e-04f, -7.922482224e-04f, -1.200907975e-03f, -1.433101487e-03f, -1.396896783e-03f, -1.067111595e-03f, -4.989853661e-04f, +1.838700421e-04f, +8.242288710e-04f, +1.277362709e-03f, +1.452918539e-03f, +1.338558509e-03f, +9.981125244e-04f, +5.462311107e-04f, +1.096261208e-04f, -2.110826698e-04f, -3.663745517e-04f, -3.630663859e-04f, -2.508801606e-04f, -9.784099981e-05f, +3.519325555e-05f, +1.119851055e-04f, +1.259637630e-04f, +9.384506926e-05f, +4.281104231e-05f, -2.460396421e-06f, -2.803806407e-05f, -3.240260206e-05f, -2.275727877e-05f, -9.044283303e-06f, +1.168558256e-06f, + -4.695441913e-04f, -8.760245903e-04f, -7.991262853e-04f, +3.609359108e-04f, +2.669005882e-03f, +5.123520433e-03f, +5.756824028e-03f, +2.666330662e-03f, -4.391153447e-03f, -1.286988254e-02f, -1.788752723e-02f, -1.460168041e-02f, -1.523932150e-03f, +1.725044458e-02f, +3.279097737e-02f, +3.543144146e-02f, +2.041889438e-02f, -8.138301776e-03f, -3.784986960e-02f, -5.361879579e-02f, -4.563734919e-02f, -1.538951341e-02f, +2.405922395e-02f, +5.415199909e-02f, +6.027964365e-02f, +3.943542163e-02f, +1.806002989e-03f, -3.459875701e-02f, -5.325818292e-02f, -4.725236417e-02f, -2.191062565e-02f, +9.010274443e-03f, +3.101702015e-02f, +3.598762072e-02f, +2.506323550e-02f, +6.436027081e-03f, -9.981143894e-03f, -1.767229629e-02f, -1.581423255e-02f, -8.178062671e-03f, -1.449274037e-05f, +4.933377074e-03f, +5.755457105e-03f, +3.825748126e-03f, +1.260801849e-03f, -4.486511040e-04f, -9.414792306e-04f, -6.658125686e-04f, + +1.382314016e-05f, +8.837361929e-06f, -1.633537227e-05f, -5.567335481e-05f, -8.260631152e-05f, -6.074030726e-05f, +2.922575262e-05f, +1.619350567e-04f, +2.628105067e-04f, +2.412017540e-04f, +5.112063874e-05f, -2.563527416e-04f, -5.312588432e-04f, -5.917982521e-04f, -3.338793035e-04f, +1.804325406e-04f, +7.201684470e-04f, +9.892171113e-04f, +7.907896309e-04f, +1.592747329e-04f, -6.271099183e-04f, -1.175660842e-03f, -1.187710250e-03f, -6.294585642e-04f, +2.371170630e-04f, +9.871559923e-04f, +1.257552114e-03f, +9.367111105e-04f, +2.136004132e-04f, -5.365573630e-04f, -9.585806927e-04f, -8.962304303e-04f, -4.485957701e-04f, +1.138649555e-04f, +5.112102807e-04f, +5.957879751e-04f, +4.007920296e-04f, +8.567434117e-05f, -1.725816699e-04f, -2.725326564e-04f, -2.189653917e-04f, -8.969986767e-05f, +2.676414031e-05f, +8.037843185e-05f, +7.208531271e-05f, +3.417949566e-05f, +3.436649713e-07f, -1.364594403e-05f, + /* 3,24 (48) */ + +2.962617242e-04f, +3.212134736e-04f, +2.032036918e-05f, -7.091731833e-04f, -1.729022245e-03f, -2.589805465e-03f, -2.622809069e-03f, -1.218713516e-03f, +1.781901362e-03f, +5.756243131e-03f, +9.231321737e-03f, +1.022563956e-02f, +6.990824090e-03f, -1.054151401e-03f, -1.255795560e-02f, -2.402988123e-02f, -3.043769849e-02f, -2.657554044e-02f, -8.843476421e-03f, +2.315223411e-02f, +6.579878040e-02f, +1.118838460e-01f, +1.522204045e-01f, +1.780590990e-01f, +1.835441367e-01f, +1.674111697e-01f, +1.333584052e-01f, +8.896542591e-02f, +4.352426113e-02f, +5.501680991e-03f, -1.955763232e-02f, -3.007424475e-02f, -2.820822684e-02f, -1.858910326e-02f, -6.544534960e-03f, +3.536433642e-03f, +9.211346736e-03f, +1.016408956e-02f, +7.675149378e-03f, +3.721312934e-03f, +1.000562444e-04f, -2.125596518e-03f, -2.753616827e-03f, -2.218371750e-03f, -1.203730513e-03f, -2.924028285e-04f, +2.219775210e-04f, +3.375558459e-04f, + -3.887741319e-06f, +3.206055989e-06f, +1.583741601e-05f, +2.870331762e-05f, +3.255876525e-05f, +1.807329880e-05f, -1.828092849e-05f, -6.896357953e-05f, -1.140471018e-04f, -1.261927572e-04f, -8.169732682e-05f, +2.585857515e-05f, +1.752353437e-04f, +3.164408930e-04f, +3.821851813e-04f, +3.102208145e-04f, +6.967147102e-05f, -3.187373323e-04f, -7.779793207e-04f, -1.190200104e-03f, -1.429573887e-03f, -1.402545559e-03f, -1.081513561e-03f, -5.192504775e-04f, +1.623385964e-04f, +8.064010613e-04f, +1.267121457e-03f, +1.451967164e-03f, +1.346052953e-03f, +1.011108915e-03f, +5.607488983e-04f, +1.219248981e-04f, -2.034562514e-04f, -3.640896352e-04f, -3.651517933e-04f, -2.553639164e-04f, -1.025864097e-04f, +3.177609154e-05f, +1.105729513e-04f, +1.263532515e-04f, +9.528197147e-05f, +4.442473797e-05f, -1.304645589e-06f, -2.758009056e-05f, -3.252916038e-05f, -2.317004037e-05f, -9.447910213e-06f, +9.431530473e-07f, + -4.557210512e-04f, -8.671872283e-04f, -8.154616576e-04f, +3.052625560e-04f, +2.586399571e-03f, +5.062780126e-03f, +5.786049781e-03f, +2.828265719e-03f, -4.128342940e-03f, -1.262868078e-02f, -1.783640660e-02f, -1.485803315e-02f, -2.055190993e-03f, +1.665864633e-02f, +3.245709807e-02f, +3.561187401e-02f, +2.113906282e-02f, -7.149084665e-03f, -3.705907997e-02f, -5.345952105e-02f, -4.626445911e-02f, -1.656517425e-02f, +2.287151370e-02f, +5.352254052e-02f, +6.051676072e-02f, +4.042257762e-02f, +3.063555103e-03f, -3.366204590e-02f, -5.304458251e-02f, -4.778892153e-02f, -2.286920634e-02f, +8.114044013e-03f, +3.056842438e-02f, +3.610148568e-02f, +2.557444578e-02f, +7.031815056e-03f, -9.580351865e-03f, -1.758662195e-02f, -1.598681422e-02f, -8.450595327e-03f, -2.334581321e-04f, +4.843677207e-03f, +5.782221245e-03f, +3.906126557e-03f, +1.332887162e-03f, -4.144716084e-04f, -9.411355656e-04f, -6.794585126e-04f, + +1.372967500e-05f, +9.278914423e-06f, -1.524945968e-05f, -5.444713427e-05f, -8.232434518e-05f, -6.244626716e-05f, +2.549575523e-05f, +1.577862775e-04f, +2.610858231e-04f, +2.443996772e-04f, +5.939056664e-05f, -2.462725265e-04f, -5.250461533e-04f, -5.945512379e-04f, -3.466302178e-04f, +1.624501163e-04f, +7.059350357e-04f, +9.873630894e-04f, +8.044139162e-04f, +1.832927891e-04f, -6.041071003e-04f, -1.165641565e-03f, -1.196605909e-03f, -6.535621626e-04f, +2.095023907e-04f, +9.695907853e-04f, +1.258280144e-03f, +9.544776028e-04f, +2.387361456e-04f, -5.166059077e-04f, -9.525849697e-04f, -9.051136635e-04f, -4.659339923e-04f, +9.755980851e-05f, +5.032305666e-04f, +5.979730964e-04f, +4.096984102e-04f, +9.545894178e-05f, -1.666573908e-04f, -2.720046459e-04f, -2.222838567e-04f, -9.394195902e-05f, +2.395346008e-05f, +7.975667761e-05f, +7.299351605e-05f, +3.544241166e-05f, +1.126549914e-06f, -1.351207367e-05f, + /* 3,25 (48) */ + +2.923739829e-04f, +3.244195295e-04f, +3.615778519e-05f, -6.804698657e-04f, -1.696463480e-03f, -2.571732166e-03f, -2.641089998e-03f, -1.287677096e-03f, +1.667854260e-03f, +5.630050374e-03f, +9.149624410e-03f, +1.025149813e-02f, +7.166059434e-03f, -7.377105075e-04f, -1.217577041e-02f, -2.371966041e-02f, -3.036802702e-02f, -2.689427778e-02f, -9.621455742e-03f, +2.196203401e-02f, +6.436920651e-02f, +1.104813004e-01f, +1.511388909e-01f, +1.775398486e-01f, +1.837064753e-01f, +1.682175708e-01f, +1.346255266e-01f, +9.041739307e-02f, +4.487031408e-02f, +6.512789906e-03f, -1.899688343e-02f, -2.995231985e-02f, -2.841168309e-02f, -1.895319289e-02f, -6.909686753e-03f, +3.281069726e-03f, +9.108760326e-03f, +1.019586565e-02f, +7.785722329e-03f, +3.847666186e-03f, +1.953382158e-04f, -2.081171780e-03f, -2.754921472e-03f, -2.245951840e-03f, -1.236259674e-03f, -3.155728688e-04f, +2.125296108e-04f, +3.384989990e-04f, + -4.003341125e-06f, +2.886233797e-06f, +1.539901900e-05f, +2.838383397e-05f, +3.267567353e-05f, +1.886280976e-05f, -1.685545253e-05f, -6.733312003e-05f, -1.129899195e-04f, -1.265775157e-04f, -8.407257635e-05f, +2.167520746e-05f, +1.703680708e-04f, +3.128058986e-04f, +3.819449340e-04f, +3.149782048e-04f, +7.968398176e-05f, -3.049954720e-04f, -7.636652355e-04f, -1.179320741e-03f, -1.425780546e-03f, -1.407900393e-03f, -1.095674065e-03f, -5.393960823e-04f, +1.407695631e-04f, +7.883896686e-04f, +1.256604192e-03f, +1.450725344e-03f, +1.353319360e-03f, +1.023991514e-03f, +5.752801377e-04f, +1.343388010e-04f, -1.956641385e-04f, -3.616452175e-04f, -3.671273824e-04f, -2.598063079e-04f, -1.073519189e-04f, +2.830211710e-05f, +1.090972631e-04f, +1.266960993e-04f, +9.669978219e-05f, +4.604437911e-05f, -1.288219903e-07f, -2.710054154e-05f, -3.264151887e-05f, -2.357875726e-05f, -9.855206040e-06f, +7.112032361e-07f, + -4.419913762e-04f, -8.579083139e-04f, -8.307111173e-04f, +2.508154217e-04f, +2.504075226e-03f, +5.000333859e-03f, +5.811545536e-03f, +2.986051997e-03f, -3.867257117e-03f, -1.238428111e-02f, -1.777701603e-02f, -1.510430567e-02f, -2.580237146e-03f, +1.606409509e-02f, +3.211046785e-02f, +3.577432412e-02f, +2.184499786e-02f, -6.161721576e-03f, -3.625466605e-02f, -5.327622826e-02f, -4.686856621e-02f, -1.773081582e-02f, +2.167490780e-02f, +5.286897836e-02f, +6.072626311e-02f, +4.139216841e-02f, +4.321835247e-03f, -3.270756830e-02f, -5.280584636e-02f, -4.830552744e-02f, -2.382179131e-02f, +7.208930350e-03f, +3.010249039e-02f, +3.619904549e-02f, +2.607767635e-02f, +7.629788152e-03f, -9.170653454e-03f, -1.749116300e-02f, -1.615347161e-02f, -8.722599973e-03f, -4.557419887e-04f, +4.749735248e-03f, +5.806174705e-03f, +3.985883235e-03f, +1.405880678e-03f, -3.790291967e-04f, -9.400090157e-04f, -6.929705863e-04f, + +1.362524182e-05f, +9.699627145e-06f, -1.417974247e-05f, -5.321091650e-05f, -8.199446477e-05f, -6.408192298e-05f, +2.181355622e-05f, +1.536109821e-04f, +2.592404393e-04f, +2.474248378e-04f, +6.753371491e-05f, -2.361694382e-04f, -5.186228688e-04f, -5.969798764e-04f, -3.591109445e-04f, +1.445077386e-04f, +6.914377299e-04f, +9.850356039e-04f, +8.175886110e-04f, +2.071376851e-04f, -5.808762122e-04f, -1.155081271e-03f, -1.204914861e-03f, -6.773383576e-04f, +1.817823486e-04f, +9.515434587e-04f, +1.258403080e-03f, +9.718250891e-04f, +2.638345942e-04f, -4.963252740e-04f, -9.460946405e-04f, -9.135991424e-04f, -4.831498493e-04f, +8.108892828e-05f, +4.949312534e-04f, +5.998706843e-04f, +4.184802618e-04f, +1.053011715e-04f, -1.605706006e-04f, -2.713187798e-04f, -2.255246866e-04f, -9.819774306e-05f, +2.107759459e-05f, +7.907108373e-05f, +7.387160839e-05f, +3.671014137e-05f, +1.930354200e-06f, -1.336098404e-05f, + /* 3,26 (48) */ + +2.883706418e-04f, +3.273057633e-04f, +5.155680418e-05f, -6.520860317e-04f, -1.663787806e-03f, -2.552869356e-03f, -2.657945450e-03f, -1.355010216e-03f, +1.554864340e-03f, +5.503472858e-03f, +9.065551833e-03f, +1.027317334e-02f, +7.336427504e-03f, -4.249046089e-04f, -1.179382548e-02f, -2.340468221e-02f, -3.028834304e-02f, -2.719927325e-02f, -1.038512098e-02f, +2.078271327e-02f, +6.294342596e-02f, +1.090734000e-01f, +1.500432169e-01f, +1.770004525e-01f, +1.838472449e-01f, +1.690059605e-01f, +1.358821308e-01f, +9.186811842e-02f, +4.622363344e-02f, +7.536781420e-03f, -1.842160329e-02f, -2.981798105e-02f, -2.860734723e-02f, -1.931483811e-02f, -7.276814136e-03f, +3.021263418e-03f, +9.001408407e-03f, +1.022416777e-02f, +7.894819592e-03f, +3.974362285e-03f, +2.920379980e-04f, -2.035127401e-03f, -2.755050294e-03f, -2.273052382e-03f, -1.268901192e-03f, -3.391516261e-04f, +2.026744047e-04f, +3.392102022e-04f, + -4.112779054e-06f, +2.572314865e-06f, +1.496144545e-05f, +2.805590700e-05f, +3.277444107e-05f, +1.962999545e-05f, -1.544547346e-05f, -6.569864863e-05f, -1.119011921e-04f, -1.269060919e-04f, -8.638373006e-05f, +1.753627284e-05f, +1.654962695e-04f, +3.090990316e-04f, +3.815692209e-04f, +3.195668788e-04f, +8.954578688e-05f, -2.913294552e-04f, -7.493099823e-04f, -1.168273555e-03f, -1.421723547e-03f, -1.412960956e-03f, -1.109590290e-03f, -5.594176131e-04f, +1.191679313e-04f, +7.701986314e-04f, +1.245812685e-03f, +1.449192291e-03f, +1.360354815e-03f, +1.036756339e-03f, +5.898210613e-04f, +1.468653409e-04f, -1.877070282e-04f, -3.590403383e-04f, -3.689911742e-04f, -2.642051807e-04f, -1.121359191e-04f, +2.477201947e-05f, +1.075578371e-04f, +1.269915428e-04f, +9.809761845e-05f, +4.766932167e-05f, +1.066831678e-06f, -2.659930036e-05f, -3.273937254e-05f, -2.398312798e-05f, -1.026599884e-05f, +4.727250007e-07f, + -4.283661344e-04f, -8.482086868e-04f, -8.448908597e-04f, +1.976045052e-04f, +2.422080761e-03f, +4.936251936e-03f, +5.833359092e-03f, +3.139662979e-03f, -3.608016678e-03f, -1.213685627e-02f, -1.770948231e-02f, -1.534047511e-02f, -3.098860015e-03f, +1.546711522e-02f, +3.175135691e-02f, +3.591883186e-02f, +2.253643559e-02f, -5.176685972e-03f, -3.543707744e-02f, -5.306909058e-02f, -4.744944242e-02f, -1.888589709e-02f, +2.046999293e-02f, +5.219164000e-02f, +6.090804546e-02f, +4.234371187e-02f, +5.580238328e-03f, -3.173574321e-02f, -5.254201177e-02f, -4.880185272e-02f, -2.476788595e-02f, +6.295331207e-03f, +2.961934054e-02f, +3.628013442e-02f, +2.657260760e-02f, +8.229658837e-03f, -8.752173193e-03f, -1.738586183e-02f, -1.631404221e-02f, -8.993918753e-03f, -6.812666753e-04f, +4.651537505e-03f, +5.827252300e-03f, +4.064954319e-03f, +1.479752286e-03f, -3.423190553e-04f, -9.380786615e-04f, -7.063315703e-04f, + +1.351023705e-05f, +1.009965468e-05f, -1.312669022e-05f, -5.196580074e-05f, -8.161779110e-05f, -6.564741609e-05f, +1.818069976e-05f, +1.494120619e-04f, +2.572770162e-04f, +2.502775821e-04f, +7.554692499e-05f, -2.260492410e-04f, -5.119943527e-04f, -5.990855072e-04f, -3.713168784e-04f, +1.266144987e-04f, +6.766855115e-04f, +9.822381595e-04f, +8.303088519e-04f, +2.307979033e-04f, -5.574296133e-04f, -1.143986344e-03f, -1.212633655e-03f, -7.007753656e-04f, +1.539708695e-04f, +9.330226906e-04f, +1.257919916e-03f, +9.887438369e-04f, +2.888828959e-04f, -4.757245889e-04f, -9.391108251e-04f, -9.216803928e-04f, -5.002336227e-04f, +6.445985719e-05f, +4.863143052e-04f, +6.014772487e-04f, +4.271315862e-04f, +1.151961420e-04f, -1.543228943e-04f, -2.704734651e-04f, -2.286848653e-04f, -1.024647908e-04f, +1.813731700e-05f, +7.832095665e-05f, +7.471836679e-05f, +3.798182344e-05f, +2.754913188e-06f, -1.319236015e-05f, + /* 3,27 (48) */ + +2.842578627e-04f, +3.298780782e-04f, +6.651824963e-05f, -6.240301247e-04f, -1.631013365e-03f, -2.533239361e-03f, -2.673390924e-03f, -1.420708864e-03f, +1.442963148e-03f, +5.376566766e-03f, +8.979168103e-03f, +1.029070961e-02f, +7.501923774e-03f, -1.158055773e-04f, -1.141225626e-02f, -2.308511533e-02f, -3.019879725e-02f, -2.749060270e-02f, -1.113443096e-02f, +1.961443971e-02f, +6.152170242e-02f, +1.076604390e-01f, +1.489336266e-01f, +1.764410349e-01f, +1.839664128e-01f, +1.697761591e-01f, +1.371279435e-01f, +9.331731071e-02f, +4.758398826e-02f, +8.573537759e-03f, -1.783178223e-02f, -2.967111571e-02f, -2.879505426e-02f, -1.967387845e-02f, -7.645805310e-03f, +2.757058237e-03f, +8.889272488e-03f, +1.024893978e-02f, +8.002377430e-03f, +4.101353828e-03f, +3.901356165e-04f, -1.987458079e-03f, -2.753983463e-03f, -2.299651682e-03f, -1.301640565e-03f, -3.631347541e-04f, +1.924084059e-04f, +3.396829272e-04f, + -4.216109366e-06f, +2.264375771e-06f, +1.452492876e-05f, +2.771985991e-05f, +3.285532073e-05f, +2.037484222e-05f, -1.405140252e-05f, -6.406093845e-05f, -1.107818055e-04f, -1.271790738e-04f, -8.863065662e-05f, +1.344285118e-05f, +1.606218381e-04f, +3.053224756e-04f, +3.810597053e-04f, +3.239871777e-04f, +9.925544176e-05f, -2.777423880e-04f, -7.349175668e-04f, -1.157062250e-03f, -1.417405042e-03f, -1.417727002e-03f, -1.123259489e-03f, -5.793105393e-04f, +9.753869981e-05f, +7.518319412e-04f, +1.234748787e-03f, +1.447367298e-03f, +1.367156457e-03f, +1.049399420e-03f, +6.043678766e-04f, +1.595019776e-04f, -1.795856748e-04f, -3.562740812e-04f, -3.707412088e-04f, -2.685583734e-04f, -1.169367772e-04f, +2.118651621e-05f, +1.059544931e-04f, +1.272388292e-04f, +9.947459474e-05f, +4.929891051e-05f, +2.282059878e-06f, -2.607625943e-05f, -3.282241924e-05f, -2.438284863e-05f, -1.068011173e-05f, +2.277388815e-07f, + -4.148558973e-04f, -8.381090321e-04f, -8.580175499e-04f, +1.456387045e-04f, +2.340462970e-03f, +4.870604520e-03f, +5.851539792e-03f, +3.289075041e-03f, -3.350739662e-03f, -1.188657869e-02f, -1.763393539e-02f, -1.556652435e-02f, -3.610854368e-03f, +1.486802971e-02f, +3.138004003e-02f, +3.604544636e-02f, +2.321312110e-02f, -4.194447812e-03f, -3.460676859e-02f, -5.283829268e-02f, -4.800687203e-02f, -2.002988343e-02f, +1.925735928e-02f, +5.149086464e-02f, +6.106201633e-02f, +4.327673456e-02f, +6.838158244e-03f, -3.074699937e-02f, -5.225312887e-02f, -4.927757730e-02f, -2.570699678e-02f, +5.373650814e-03f, +2.911910692e-02f, +3.634459427e-02f, +2.705892191e-02f, +8.831136085e-03f, -8.325041607e-03f, -1.727066569e-02f, -1.646836510e-02f, -9.264392218e-03f, -9.099515406e-04f, +4.549072714e-03f, +5.845389617e-03f, +4.143275275e-03f, +1.554470653e-03f, -3.043372319e-04f, -9.353237483e-04f, -7.195239305e-04f, + +1.338505782e-05f, +1.047916587e-05f, -1.209074997e-05f, -5.071287250e-05f, -8.119545879e-05f, -6.714293286e-05f, +1.459867564e-05f, +1.451923846e-04f, +2.551982542e-04f, +2.529583551e-04f, +8.342714677e-05f, -2.159176551e-04f, -5.051660376e-04f, -6.008696396e-04f, -3.832435974e-04f, +1.087794048e-04f, +6.616874512e-04f, +9.789744964e-04f, +8.425700365e-04f, +2.542620618e-04f, -5.337797449e-04f, -1.132363442e-03f, -1.219759154e-03f, -7.238615871e-04f, +1.260819359e-04f, +9.140374150e-04f, +1.256829962e-03f, +1.005224319e-03f, +3.138681769e-04f, -4.548131826e-04f, -9.316349126e-04f, -9.293511264e-04f, -5.171756103e-04f, +4.768027379e-05f, +4.773818773e-04f, +6.027894352e-04f, +4.356464065e-04f, +1.251388857e-04f, -1.479159801e-04f, -2.694671867e-04f, -2.317613882e-04f, -1.067406320e-04f, +1.513345528e-05f, +7.750563625e-05f, +7.553256929e-05f, +3.925657677e-05f, +3.600041585e-06f, -1.300589560e-05f, + /* 3,28 (48) */ + +2.800417534e-04f, +3.321424540e-04f, +8.104317839e-05f, -5.963102648e-04f, -1.598158045e-03f, -2.512864519e-03f, -2.687442326e-03f, -1.484769803e-03f, +1.332181343e-03f, +5.249387692e-03f, +8.890537447e-03f, +1.030415246e-02f, +7.662545612e-03f, +1.895168983e-04f, -1.103119655e-02f, -2.276112815e-02f, -3.009954181e-02f, -2.776834509e-02f, -1.186934853e-02f, +1.845737746e-02f, +6.010429737e-02f, +1.062427120e-01f, +1.478103671e-01f, +1.758617243e-01f, +1.840639515e-01f, +1.705279911e-01f, +1.383626923e-01f, +9.476467801e-02f, +4.895114472e-02f, +9.622937179e-03f, -1.722741435e-02f, -2.951161373e-02f, -2.897463993e-02f, -2.003015253e-02f, -8.016546519e-03f, +2.488499864e-03f, +8.772335711e-03f, +1.027012630e-02f, +8.108331923e-03f, +4.228592657e-03f, +4.896102112e-04f, -1.938159169e-03f, -2.751701403e-03f, -2.325727942e-03f, -1.334462984e-03f, -3.875176027e-04f, +1.817282941e-04f, +3.399106661e-04f, + -4.313389282e-06f, +1.962488206e-06f, +1.408969792e-05f, +2.737601512e-05f, +3.291857052e-05f, +2.109734737e-05f, -1.267363801e-05f, -6.242075398e-05f, -1.096326479e-04f, -1.273970654e-04f, -9.081325215e-05f, +9.395992526e-06f, +1.557466555e-04f, +3.014784169e-04f, +3.804180795e-04f, +3.282394937e-04f, +1.088115592e-04f, -2.642373334e-04f, -7.204919830e-04f, -1.145690556e-03f, -1.412827242e-03f, -1.422198365e-03f, -1.136678987e-03f, -5.990703682e-04f, +7.588687551e-05f, +7.332936410e-04f, +1.223414427e-03f, +1.445249734e-03f, +1.373721479e-03f, +1.061916802e-03f, +6.189167668e-04f, +1.722461206e-04f, -1.713008898e-04f, -3.533455744e-04f, -3.723755467e-04f, -2.728637187e-04f, -1.217528356e-04f, +1.754635521e-05f, +1.042870754e-04f, +1.274372170e-04f, +1.008298234e-04f, +5.093247959e-05f, +3.516594185e-06f, -2.553132036e-05f, -3.289035984e-05f, -2.477761287e-05f, -1.109736287e-05f, -2.373016503e-08f, + -4.014708395e-04f, -8.276298662e-04f, -8.701082999e-04f, +9.492583196e-05f, +2.259267511e-03f, +4.803461587e-03f, +5.866138468e-03f, +3.434267425e-03f, -3.095541408e-03f, -1.163362033e-02f, -1.755050824e-02f, -1.578244201e-02f, -4.116020405e-03f, +1.426716007e-02f, +3.099679643e-02f, +3.615422576e-02f, +2.387480855e-02f, -3.215473316e-03f, -3.376419855e-02f, -5.258403061e-02f, -4.854065178e-02f, -2.116224687e-02f, +1.803760013e-02f, +5.076700305e-02f, +6.118809826e-02f, +4.419077197e-02f, +8.094988206e-03f, -2.974177505e-02f, -5.193926069e-02f, -4.973239049e-02f, -2.663863169e-02f, +4.444299688e-03f, +2.860193131e-02f, +3.639227455e-02f, +2.753630378e-02f, +9.433925520e-03f, -7.889395200e-03f, -1.714552680e-02f, -1.661628108e-02f, -9.533859405e-03f, -1.141712929e-03f, +4.442332082e-03f, +5.860523072e-03f, +4.220780912e-03f, +1.630003222e-03f, -2.650806551e-04f, -9.317237067e-04f, -7.325298261e-04f, + +1.325010149e-05f, +1.083834336e-05f, -1.107234635e-05f, -4.945320309e-05f, -8.072861528e-05f, -6.856870388e-05f, +1.106891903e-05f, +1.409547922e-04f, +2.530068907e-04f, +2.554676994e-04f, +9.117143940e-05f, -2.057803530e-04f, -4.981434225e-04f, -6.023339503e-04f, -3.948868638e-04f, +9.101137782e-05f, +6.464527035e-04f, +9.752485870e-04f, +8.543678256e-04f, +2.775189198e-04f, -5.099391233e-04f, -1.120219483e-03f, -1.226288538e-03f, -7.465856134e-04f, +9.812957267e-05f, +8.945968170e-04f, +1.255132848e-03f, +1.021257219e-03f, +3.387775609e-04f, -4.336005838e-04f, -9.236685619e-04f, -9.366052454e-04f, -5.339661313e-04f, +3.075798926e-05f, +4.681363162e-04f, +6.038040284e-04f, +4.440187700e-04f, +1.351243585e-04f, -1.413516791e-04f, -2.682985099e-04f, -2.347512644e-04f, -1.110227562e-04f, +1.206689233e-05f, +7.662449684e-05f, +7.631299584e-05f, +4.053350083e-05f, +4.465533215e-06f, -1.280129310e-05f, + /* 3,29 (48) */ + +2.757283641e-04f, +3.341049422e-04f, +9.513287631e-05f, -5.689342497e-04f, -1.565239474e-03f, -2.491767171e-03f, -2.700115964e-03f, -1.547190557e-03f, +1.222548695e-03f, +5.121990627e-03f, +8.799724195e-03f, +1.031354846e-02f, +7.818292268e-03f, +4.909953152e-04f, -1.065077847e-02f, -2.243288866e-02f, -2.999073025e-02f, -2.803258242e-02f, -1.258984051e-02f, +1.731168690e-02f, +5.869147013e-02f, +1.048205137e-01f, +1.466736881e-01f, +1.752626540e-01f, +1.841398384e-01f, +1.712612847e-01f, +1.395861067e-01f, +9.620992774e-02f, +5.032486620e-02f, +1.068485398e-02f, -1.660849758e-02f, -2.933936761e-02f, -2.914594082e-02f, -2.038349811e-02f, -8.388922065e-03f, +2.215636145e-03f, +8.650582875e-03f, +1.028767266e-02f, +8.212618998e-03f, +4.356029874e-03f, +5.904400346e-04f, -1.887226689e-03f, -2.748184809e-03f, -2.351259262e-03f, -1.367353344e-03f, -4.122952156e-04f, +1.706309313e-04f, +3.398869359e-04f, + -4.404678912e-06f, +1.666719010e-06f, +1.365597741e-05f, +2.702469411e-05f, +3.296445351e-05f, +2.179751896e-05f, -1.131256524e-05f, -6.077885086e-05f, -1.084546092e-04f, -1.275606867e-04f, -9.293143999e-05f, +5.396717026e-06f, +1.508725802e-04f, +2.975690434e-04f, +3.796460644e-04f, +3.323242692e-04f, +1.182128095e-04f, -2.508173099e-04f, -7.060372125e-04f, -1.134162233e-03f, -1.407992425e-03f, -1.426374959e-03f, -1.149846182e-03f, -6.186926465e-04f, +5.421747208e-05f, +7.145878244e-04f, +1.211811609e-03f, +1.442839046e-03f, +1.380047129e-03f, +1.074304548e-03f, +6.334638925e-04f, +1.850951294e-04f, -1.628535423e-04f, -3.502539917e-04f, -3.738922690e-04f, -2.771190438e-04f, -1.265824125e-04f, +1.385231473e-05f, +1.025554528e-04f, +1.275859766e-04f, +1.021624150e-04f, +5.256935211e-05f, +4.770153257e-06f, -2.496439415e-05f, -3.294289841e-05f, -2.516711215e-05f, -1.151756553e-05f, -2.816527132e-07f, + -3.882207380e-04f, -8.167915229e-04f, -8.811806463e-04f, +4.547262888e-05f, +2.178538896e-03f, +4.734892883e-03f, +5.877207387e-03f, +3.575222217e-03f, -2.842534517e-03f, -1.137815263e-02f, -1.745933680e-02f, -1.598822236e-02f, -4.614163828e-03f, +1.366482612e-02f, +3.060190957e-02f, +3.624523714e-02f, +2.452126126e-02f, -2.240224729e-03f, -3.290983073e-02f, -5.230651169e-02f, -4.905059090e-02f, -2.228246635e-02f, +1.681131159e-02f, +5.002041744e-02f, +6.128622784e-02f, +4.508536879e-02f, +9.350121055e-03f, -2.872051783e-02f, -5.160048313e-02f, -5.016599107e-02f, -2.756230025e-02f, +3.507694442e-03f, +2.806796518e-02f, +3.642303254e-02f, +2.800444010e-02f, +1.003772955e-02f, -7.445376430e-03f, -1.701040245e-02f, -1.675763276e-02f, -9.802157915e-03f, -1.376464193e-03f, +4.331309326e-03f, +5.872589965e-03f, +4.297405409e-03f, +1.706316218e-03f, -2.245471543e-04f, -9.272581735e-04f, -7.453311192e-04f, + +1.310576536e-05f, +1.117738321e-05f, -1.007188154e-05f, -4.818784893e-05f, -8.021841976e-05f, -6.992500318e-05f, +7.592810238e-06f, +1.367021002e-04f, +2.507056983e-04f, +2.578062539e-04f, +9.877697198e-05f, -1.956429568e-04f, -4.909320686e-04f, -6.034802808e-04f, -4.062426254e-04f, +7.331924678e-05f, +6.309905005e-04f, +9.710646329e-04f, +8.656981442e-04f, +3.005573838e-04f, -4.859203331e-04f, -1.107561650e-03f, -1.232219304e-03f, -7.689362327e-04f, +7.012783938e-05f, +8.747103281e-04f, +1.252828523e-03f, +1.036833437e-03f, +3.635981751e-04f, -4.120965150e-04f, -9.152137016e-04f, -9.434368467e-04f, -5.505955327e-04f, +1.370094375e-05f, +4.585801599e-04f, +6.045179545e-04f, +4.522427527e-04f, +1.451474416e-04f, -1.346319256e-04f, -2.669660816e-04f, -2.376515187e-04f, -1.153086141e-04f, +8.938566172e-06f, +7.567694817e-05f, +7.705842929e-05f, +4.181167602e-05f, +5.351160797e-06f, -1.257826480e-05f, + /* 3,30 (48) */ + +2.713236852e-04f, +3.357716612e-04f, +1.087888537e-04f, -5.419095556e-04f, -1.532275021e-03f, -2.469969652e-03f, -2.711428529e-03f, -1.607969408e-03f, +1.114094085e-03f, +4.994429940e-03f, +8.706792755e-03f, +1.031894517e-02f, +7.969164848e-03f, +7.885643586e-04f, -1.027113241e-02f, -2.210056439e-02f, -2.987251744e-02f, -2.828339973e-02f, -1.329587772e-02f, +1.617752467e-02f, +5.728347771e-02f, +1.033941387e-01f, +1.455238419e-01f, +1.746439613e-01f, +1.841940559e-01f, +1.719758725e-01f, +1.407979183e-01f, +9.765276679e-02f, +5.170491332e-02f, +1.175915853e-02f, -1.597503369e-02f, -2.915427248e-02f, -2.930879436e-02f, -2.073375210e-02f, -8.762814334e-03f, +1.938517101e-03f, +8.524000463e-03f, +1.030152497e-02f, +8.315174451e-03f, +4.483615851e-03f, +6.926024496e-04f, -1.834657337e-03f, -2.743414655e-03f, -2.376223656e-03f, -1.400296242e-03f, -4.374623277e-04f, +1.591133657e-04f, +3.396052832e-04f, + -4.490041168e-06f, +1.377130203e-06f, +1.322398717e-05f, +2.666621724e-05f, +3.299323754e-05f, +2.247537575e-05f, -9.968556543e-06f, -5.913597559e-05f, -1.072485805e-04f, -1.276705727e-04f, -9.498517043e-05f, +1.446014787e-06f, +1.460014508e-04f, +2.935965438e-04f, +3.787454085e-04f, +3.362419967e-04f, +1.274579203e-04f, -2.374852913e-04f, -6.915572233e-04f, -1.122481066e-03f, -1.402902931e-03f, -1.430256781e-03f, -1.162758543e-03f, -6.381729614e-04f, +3.253550840e-05f, +6.957186340e-04f, +1.199942416e-03f, +1.440134762e-03f, +1.386130709e-03f, +1.086558738e-03f, +6.480053926e-04f, +1.980463138e-04f, -1.542445587e-04f, -3.469985528e-04f, -3.752894788e-04f, -2.813221715e-04f, -1.314238026e-04f, +1.010520338e-05f, +1.007595192e-04f, +1.276843902e-04f, +1.034714787e-04f, +5.420884075e-05f, +6.042442799e-06f, -2.437540135e-05f, -3.297974244e-05f, -2.555103579e-05f, -1.194052812e-05f, -5.459948177e-07f, + -3.751149726e-04f, -8.056141397e-04f, -8.912525278e-04f, -2.715220056e-06f, +2.098320476e-03f, +4.664967880e-03f, +5.884800197e-03f, +3.711924318e-03f, -2.591828819e-03f, -1.112034638e-02f, -1.736055983e-02f, -1.618386532e-02f, -5.105095897e-03f, +1.306134584e-02f, +3.019566694e-02f, +3.631855639e-02f, +2.515225176e-02f, -1.269160096e-03f, -3.204413258e-02f, -5.200595431e-02f, -4.953651123e-02f, -2.339002800e-02f, +1.557909228e-02f, +4.925148120e-02f, +6.135635567e-02f, +4.596007912e-02f, +1.060294958e-02f, -2.768368439e-02f, -5.123688496e-02f, -5.057808759e-02f, -2.847751395e-02f, +2.564257596e-03f, +2.751736964e-02f, +3.643673348e-02f, +2.846302026e-02f, +1.064224750e-02f, -6.993133677e-03f, -1.686525500e-02f, -1.689226469e-02f, -1.006912400e-02f, -1.614115712e-03f, +4.216000711e-03f, +5.881528531e-03f, +4.373082357e-03f, +1.783374647e-03f, -1.827354783e-04f, -9.219070127e-04f, -7.579093840e-04f, + +1.295244630e-05f, +1.149649446e-05f, -9.089735452e-06f, -4.691785108e-05f, -7.966604217e-05f, -7.121214734e-05f, +4.171674522e-06f, +1.324370954e-04f, +2.482974822e-04f, +2.599747520e-04f, +1.062410242e-04f, -1.855110352e-04f, -4.835375958e-04f, -6.043106357e-04f, -4.173070169e-04f, +5.571174430e-05f, +6.153101469e-04f, +9.664270613e-04f, +8.765571829e-04f, +3.233665128e-04f, -4.617360196e-04f, -1.094397381e-03f, -1.237549266e-03f, -7.909024357e-04f, +4.209082247e-05f, +8.543876214e-04f, +1.249917253e-03f, +1.051944096e-03f, +3.883171580e-04f, -3.903108881e-04f, -9.062725306e-04f, -9.498402261e-04f, -5.670541940e-04f, -3.482797389e-06f, +4.487161370e-04f, +6.049282845e-04f, +4.603124626e-04f, +1.552029443e-04f, -1.277587669e-04f, -2.654686322e-04f, -2.404591937e-04f, -1.195956183e-04f, +5.749470101e-06f, +7.466243631e-05f, +7.776765626e-05f, +4.309016406e-05f, +6.256675746e-06f, -1.233653283e-05f, + /* 3,31 (48) */ + +2.668336440e-04f, +3.371487914e-04f, +1.220128409e-04f, -5.152433383e-04f, -1.499281783e-03f, -2.447494277e-03f, -2.721397086e-03f, -1.667105383e-03f, +1.006845505e-03f, +4.866759367e-03f, +8.611807584e-03f, +1.032039119e-02f, +8.115166299e-03f, +1.082160902e-03f, -9.892387002e-03f, -2.176432239e-02f, -2.974505952e-02f, -2.852088503e-02f, -1.398743494e-02f, +1.505504361e-02f, +5.588057478e-02f, +1.019638819e-01f, +1.443610834e-01f, +1.740057884e-01f, +1.842265914e-01f, +1.726715912e-01f, +1.419978608e-01f, +9.909290155e-02f, +5.309104403e-02f, +1.284571727e-02f, -1.532702830e-02f, -2.895622617e-02f, -2.946303892e-02f, -2.108075065e-02f, -9.138103813e-03f, +1.657194930e-03f, +8.392576660e-03f, +1.031163017e-02f, +8.415933970e-03f, +4.611300241e-03f, +7.960739283e-04f, -1.780448496e-03f, -2.737372213e-03f, -2.400599057e-03f, -1.433275985e-03f, -4.630133635e-04f, +1.471728376e-04f, +3.390592884e-04f, + -4.569541687e-06f, +1.093779023e-06f, +1.279394254e-05f, +2.630090367e-05f, +3.300519509e-05f, +2.313094698e-05f, -8.641971212e-06f, -5.749286536e-05f, -1.060154541e-04f, -1.277273734e-04f, -9.697442048e-05f, -2.455154195e-06f, +1.411350845e-04f, +2.895631068e-04f, +3.777178872e-04f, +3.399932180e-04f, +1.365456772e-04f, -2.242442057e-04f, -6.770559685e-04f, -1.110650867e-03f, -1.397561162e-03f, -1.433843904e-03f, -1.175413611e-03f, -6.575069420e-04f, +1.084600706e-05f, +6.766902606e-04f, +1.187809005e-03f, +1.437136486e-03f, +1.391969581e-03f, +1.098675471e-03f, +6.625373850e-04f, +2.110969350e-04f, -1.454749231e-04f, -3.435785237e-04f, -3.765653018e-04f, -2.854709206e-04f, -1.362752771e-04f, +6.305860108e-06f, +9.889919355e-05f, +1.277317531e-04f, +1.047561226e-04f, +5.585024780e-05f, +7.333155539e-06f, -2.376427225e-05f, -3.300060303e-05f, -2.592907112e-05f, -1.236605420e-05f, -8.167179641e-07f, + -3.621625263e-04f, -7.941176452e-04f, -9.003422633e-04f, -4.963307114e-05f, +2.018654434e-03f, +4.593755732e-03f, +5.888971872e-03f, +3.844361413e-03f, -2.343531337e-03f, -1.086037163e-02f, -1.725431881e-02f, -1.636937635e-02f, -5.588633492e-03f, +1.245703520e-02f, +2.977835992e-02f, +3.637426813e-02f, +2.576756190e-02f, -3.027330347e-04f, -3.116757540e-02f, -5.168258780e-02f, -4.999824725e-02f, -2.448442539e-02f, +1.434154302e-02f, +4.846057877e-02f, +6.139844650e-02f, +4.681446674e-02f, +1.185286683e-02f, -2.663174030e-02f, -5.084856780e-02f, -5.096839847e-02f, -2.938378648e-02f, +1.614417370e-03f, +2.695031545e-02f, +3.643325068e-02f, +2.891173640e-02f, +1.124717579e-02f, -6.532821215e-03f, -1.671005206e-02f, -1.702002346e-02f, -1.033459263e-02f, -1.854574906e-03f, +4.096405093e-03f, +5.887278001e-03f, +4.447744793e-03f, +1.861142303e-03f, -1.396453142e-04f, -9.156503370e-04f, -7.702459168e-04f, + +1.279054036e-05f, +1.179589871e-05f, -8.126265744e-06f, -4.564423467e-05f, -7.907266217e-05f, -7.243049474e-05f, +8.067819448e-07f, +1.281625351e-04f, +2.457850786e-04f, +2.619740203e-04f, +1.135609871e-04f, -1.753901006e-04f, -4.759656788e-04f, -6.048271801e-04f, -4.280763606e-04f, +3.819750226e-05f, +5.994210138e-04f, +9.613405219e-04f, +8.869413989e-04f, +3.459355243e-04f, -4.373988820e-04f, -1.080734367e-03f, -1.242276557e-03f, -8.124734222e-04f, +1.403262768e-05f, +8.336386060e-04f, +1.246399629e-03f, +1.066580545e-03f, +4.129216663e-04f, -3.682537994e-04f, -8.968475170e-04f, -9.558098825e-04f, -5.833325336e-04f, -2.078504744e-05f, +4.385471672e-04f, +6.050322369e-04f, +4.682220434e-04f, +1.652856064e-04f, -1.207343630e-04f, -2.638049775e-04f, -2.431713521e-04f, -1.238811450e-04f, +2.500652728e-06f, +7.358044464e-05f, +7.843946816e-05f, +4.436800841e-05f, +7.181807980e-06f, -1.207582970e-05f, + /* 4, 0 (48) */ + -4.440791761e-04f, -7.736617456e-04f, -5.842197404e-04f, +4.733051837e-04f, +2.096961908e-03f, +3.159739597e-03f, +2.247925700e-03f, -1.196916207e-03f, -5.859365612e-03f, -8.625924656e-03f, -6.226830420e-03f, +2.191702212e-03f, +1.322393203e-02f, +1.983561445e-02f, +1.498813646e-02f, -3.241530928e-03f, -2.808652174e-02f, -4.494512491e-02f, -3.739225953e-02f, +4.047367480e-03f, +7.496487828e-02f, +1.562849362e-01f, +2.209963868e-01f, +2.456499165e-01f, +2.209963868e-01f, +1.562849362e-01f, +7.496487828e-02f, +4.047367480e-03f, -3.739225953e-02f, -4.494512491e-02f, -2.808652174e-02f, -3.241530928e-03f, +1.498813646e-02f, +1.983561445e-02f, +1.322393203e-02f, +2.191702212e-03f, -6.226830420e-03f, -8.625924656e-03f, -5.859365612e-03f, -1.196916207e-03f, +2.247925700e-03f, +3.159739597e-03f, +2.096961908e-03f, +4.733051837e-04f, -5.842197404e-04f, -7.736617456e-04f, -4.440791761e-04f, -8.710788365e-05f, + +1.289254766e-05f, +5.184246216e-06f, -1.843893728e-05f, -4.543886514e-05f, -4.981617239e-05f, -9.833808267e-06f, +6.803089721e-05f, +1.384152296e-04f, +1.360732244e-04f, +2.183516949e-05f, -1.715914665e-04f, -3.319467664e-04f, -3.195613163e-04f, -6.198186541e-05f, +3.643635712e-04f, +7.288074567e-04f, +7.447129475e-04f, +2.343101320e-04f, -7.304216719e-04f, -1.804891247e-03f, -2.503717032e-03f, -2.434208634e-03f, -1.510328867e-03f, -2.487863475e-05f, +1.469980364e-03f, +2.417690168e-03f, +2.514578272e-03f, +1.834960044e-03f, +7.647153423e-04f, -2.098854303e-04f, -7.370963161e-04f, -7.359666910e-04f, -3.781907203e-04f, +5.035847333e-05f, +3.152640733e-04f, +3.348305944e-04f, +1.778452548e-04f, -1.658656658e-05f, -1.342466470e-04f, -1.397696245e-04f, -7.066966975e-05f, +7.835189267e-06f, +4.929954776e-05f, +4.606746708e-05f, +1.934333100e-05f, -4.667676794e-06f, -1.288967773e-05f, -8.220998674e-06f, + +3.469535659e-04f, +1.336667044e-03f, +1.790286751e-03f, +2.794767810e-04f, -3.303519821e-03f, -6.405731284e-03f, -4.976271198e-03f, +2.686342793e-03f, +1.248168983e-02f, +1.571582859e-02f, +5.946321108e-03f, -1.341789307e-02f, -2.845267002e-02f, -2.424163753e-02f, +1.494761300e-03f, +3.267286932e-02f, +4.455848173e-02f, +2.351503337e-02f, -1.915629477e-02f, -5.272885293e-02f, -4.998568337e-02f, -9.883103547e-03f, +3.944741130e-02f, +6.141247912e-02f, +3.944741130e-02f, -9.883103547e-03f, -4.998568337e-02f, -5.272885293e-02f, -1.915629477e-02f, +2.351503337e-02f, +4.455848173e-02f, +3.267286932e-02f, +1.494761300e-03f, -2.424163753e-02f, -2.845267002e-02f, -1.341789307e-02f, +5.946321108e-03f, +1.571582859e-02f, +1.248168983e-02f, +2.686342793e-03f, -4.976271198e-03f, -6.405731284e-03f, -3.303519821e-03f, +2.794767810e-04f, +1.790286751e-03f, +1.336667044e-03f, +3.469535659e-04f, -1.608870261e-04f, + -2.571773609e-05f, -3.050953535e-05f, +9.392727151e-06f, +8.433841439e-05f, +1.247277122e-04f, +4.822503056e-05f, -1.430114735e-04f, -3.094170965e-04f, -2.554768633e-04f, +8.152129225e-05f, +4.999795024e-04f, +6.290315529e-04f, +2.366593558e-04f, -4.941058242e-04f, -1.010568477e-03f, -8.041570547e-04f, +1.137522031e-04f, +1.110810779e-03f, +1.375457392e-03f, +5.907998826e-04f, -7.311358218e-04f, -1.591834473e-03f, -1.292881518e-03f, -2.296124824e-05f, +1.264336964e-03f, +1.601633554e-03f, +7.702899258e-04f, -5.529630450e-04f, -1.366287754e-03f, -1.133732786e-03f, -1.481780446e-04f, +7.843461819e-04f, +1.016717124e-03f, +5.168134989e-04f, -2.167432336e-04f, -6.249418104e-04f, -5.103339566e-04f, -9.510474086e-05f, +2.489011455e-04f, +3.119466899e-04f, +1.496270931e-04f, -4.360734750e-05f, -1.244160341e-04f, -8.660920381e-05f, -1.142115956e-05f, +3.003560201e-05f, +2.628081681e-05f, +6.143495962e-06f, + /* 4, 1 (48) */ + -4.311866284e-04f, -7.684774994e-04f, -6.026586777e-04f, +4.278663186e-04f, +2.047145736e-03f, +3.149905788e-03f, +2.315956597e-03f, -1.058500977e-03f, -5.723292387e-03f, -8.604089486e-03f, -6.398421886e-03f, +1.859755445e-03f, +1.290437072e-02f, +1.977363258e-02f, +1.535250003e-02f, -2.512723471e-03f, -2.734180880e-02f, -4.471081478e-02f, -3.812268121e-02f, +2.242476233e-03f, +7.246116125e-02f, +1.538507276e-01f, +2.194860579e-01f, +2.456250379e-01f, +2.224663671e-01f, +1.587026264e-01f, +7.747945655e-02f, +5.882327524e-03f, -3.662754419e-02f, -4.515501034e-02f, -2.882361806e-02f, -3.977497619e-03f, +1.460994574e-02f, +1.988597292e-02f, +1.353919611e-02f, +2.526532806e-03f, -6.048985165e-03f, -8.642511222e-03f, -5.993612259e-03f, -1.336685832e-03f, +2.177256030e-03f, +3.167574786e-03f, +2.146261456e-03f, +5.193726508e-04f, -5.648764094e-04f, -7.783294224e-04f, -4.569688538e-04f, -9.532888232e-05f, + +1.288252765e-05f, +5.683852374e-06f, -1.753912827e-05f, -4.478791382e-05f, -5.028703496e-05f, -1.179191290e-05f, +6.538677752e-05f, +1.369877151e-04f, +1.377842419e-04f, +2.699924766e-05f, -1.653081477e-04f, -3.288886600e-04f, -3.236061130e-04f, -7.342665820e-05f, +3.504813501e-04f, +7.212987527e-04f, +7.517939123e-04f, +2.582671380e-04f, -6.962478502e-04f, -1.774447867e-03f, -2.492078858e-03f, -2.449859669e-03f, -1.550106255e-03f, -7.462633087e-05f, +1.429075397e-03f, +2.400307809e-03f, +2.524654162e-03f, +1.864638951e-03f, +7.991145529e-04f, -1.849999595e-04f, -7.289417700e-04f, -7.427680672e-04f, -3.919537410e-04f, +3.856160836e-05f, +3.107140920e-04f, +3.375361450e-04f, +1.840650204e-04f, -1.125585379e-05f, -1.323041793e-04f, -1.410489017e-04f, -7.330111985e-05f, +5.796882022e-06f, +4.873677159e-05f, +4.667280462e-05f, +2.025163384e-05f, -4.134251716e-06f, -1.287362466e-05f, -8.462405133e-06f, + +3.212358298e-04f, +1.306157508e-03f, +1.799679478e-03f, +3.638151954e-04f, -3.178792109e-03f, -6.357506254e-03f, -5.119282672e-03f, +2.376925696e-03f, +1.222621297e-02f, +1.579734988e-02f, +6.446300611e-03f, -1.278886151e-02f, -2.821601066e-02f, -2.473574335e-02f, +4.841928232e-04f, +3.186871227e-02f, +4.467223393e-02f, +2.462584415e-02f, -1.778083738e-02f, -5.213805305e-02f, -5.071681919e-02f, -1.147493802e-02f, +3.815452979e-02f, +6.138951788e-02f, +4.071174827e-02f, -8.281469993e-03f, -4.921539345e-02f, -5.328181598e-02f, -2.052258252e-02f, +2.238130058e-02f, +4.441030368e-02f, +3.345721550e-02f, +2.511478425e-03f, -2.372482403e-02f, -2.866941325e-02f, -1.404283488e-02f, +5.435987152e-03f, +1.562072385e-02f, +1.273059098e-02f, +2.998289482e-03f, -4.826644105e-03f, -6.449338632e-03f, -3.427935855e-03f, +1.928675772e-04f, +1.778865592e-03f, +1.366702646e-03f, +3.732343827e-04f, -1.547435301e-04f, + -2.514036432e-05f, -3.093642097e-05f, +7.404259204e-06f, +8.203562472e-05f, +1.249178960e-04f, +5.271780462e-05f, -1.363776150e-04f, -3.066609371e-04f, -2.617518459e-04f, +6.803395823e-05f, +4.893309108e-04f, +6.325743770e-04f, +2.562102288e-04f, -4.711862525e-04f, -1.003667029e-03f, -8.232157439e-04f, +7.942130382e-05f, +1.087129161e-03f, +1.383526417e-03f, +6.280668059e-04f, -6.915044642e-04f, -1.580821894e-03f, -1.320407745e-03f, -6.886550882e-05f, +1.234796034e-03f, +1.610209589e-03f, +8.089345225e-04f, -5.145848785e-04f, -1.356020827e-03f, -1.155873363e-03f, -1.826714690e-04f, +7.637947150e-04f, +1.022102766e-03f, +5.392888856e-04f, -1.964753024e-04f, -6.203033410e-04f, -5.203823168e-04f, -1.087736719e-04f, +2.420266134e-04f, +3.142442435e-04f, +1.562180990e-04f, -3.886700897e-05f, -1.239808950e-04f, -8.884499839e-05f, -1.348826031e-05f, +2.951398656e-05f, +2.682848005e-05f, +6.706631824e-06f, + /* 4, 2 (48) */ + -4.183041008e-04f, -7.627936470e-04f, -6.201978060e-04f, +3.830784047e-04f, +1.996858701e-03f, +3.138113875e-03f, +2.381343374e-03f, -9.215132624e-04f, -5.585508145e-03f, -8.577090238e-03f, -6.563730034e-03f, +1.530866785e-03f, +1.258076460e-02f, +1.970020593e-02f, +1.570298138e-02f, -1.791424718e-03f, -2.659001489e-02f, -4.445254764e-02f, -3.881892906e-02f, +4.680283662e-04f, +6.996908239e-02f, +1.514008679e-01f, +2.179359516e-01f, +2.455504115e-01f, +2.238954425e-01f, +1.611029342e-01f, +8.000411071e-02f, +7.746966475e-03f, -3.582842964e-02f, -4.534001030e-02f, -2.955255983e-02f, -4.720265686e-03f, +1.421799200e-02f, +1.992453453e-02f, +1.384991020e-02f, +2.864068951e-03f, -5.864920145e-03f, -8.653767076e-03f, -6.125916438e-03f, -1.477734733e-03f, +2.103954910e-03f, +3.173371668e-03f, +2.194998227e-03f, +5.660454554e-04f, -5.446247756e-04f, -7.824636741e-04f, -4.698424785e-04f, -1.037912875e-04f, + +1.285991751e-05f, +6.166404737e-06f, -1.664456387e-05f, -4.411553088e-05f, -5.071255403e-05f, -1.370871943e-05f, +6.273926195e-05f, +1.354891037e-04f, +1.393801050e-04f, +3.207647279e-05f, -1.589997563e-04f, -3.256603402e-04f, -3.273989107e-04f, -8.468789089e-05f, +3.365530480e-04f, +7.134490749e-04f, +7.583417174e-04f, +2.817498091e-04f, -6.622080333e-04f, -1.743645304e-03f, -2.479672483e-03f, -2.464640132e-03f, -1.589298153e-03f, -1.243453115e-04f, +1.387628879e-03f, +2.382065486e-03f, +2.533936609e-03f, +1.893912758e-03f, +8.336048491e-04f, -1.596609317e-04f, -7.202473230e-04f, -7.492033100e-04f, -4.056435160e-04f, +2.659656099e-05f, +3.059112374e-04f, +3.400594884e-04f, +1.902462398e-04f, -5.845531987e-06f, -1.302455672e-04f, -1.422510891e-04f, -7.592324930e-05f, +3.719755005e-06f, +4.812748421e-05f, +4.725396625e-05f, +2.116315483e-05f, -3.584095864e-06f, -1.284410222e-05f, -8.701086450e-06f, + +2.960954655e-04f, +1.275221087e-03f, +1.807083737e-03f, +4.458508201e-04f, -3.053874213e-03f, -6.304788449e-03f, -5.255660287e-03f, +2.070264759e-03f, +1.196446112e-02f, +1.586538384e-02f, +6.935631522e-03f, -1.215628714e-02f, -2.795980043e-02f, -2.520692960e-02f, -5.194742057e-04f, +3.104549652e-02f, +4.475165524e-02f, +2.571297331e-02f, -1.639731096e-02f, -5.150998624e-02f, -5.140832366e-02f, -1.305575991e-02f, +3.683412204e-02f, +6.132065237e-02f, +4.194654430e-02f, -6.671260404e-03f, -4.840645892e-02f, -5.379640085e-02f, -2.187860335e-02f, +2.122542722e-02f, +4.422763222e-02f, +3.422101022e-02f, +3.533581191e-03f, -2.318553514e-02f, -2.886588855e-02f, -1.466313822e-02f, +4.915604835e-03f, +1.551195017e-02f, +1.297261759e-02f, +3.312533726e-03f, -4.670426006e-03f, -6.488205641e-03f, -3.551916750e-03f, +1.040225788e-04f, +1.765377331e-03f, +1.396216632e-03f, +4.000628628e-04f, -1.480368983e-04f, + -2.454981878e-05f, -3.131693383e-05f, +5.456981773e-06f, +7.970380656e-05f, +1.249886400e-04f, +5.708357236e-05f, -1.297318172e-04f, -3.036838206e-04f, -2.677244663e-04f, +5.465316782e-05f, +4.784002737e-04f, +6.355725464e-04f, +2.753828356e-04f, -4.480752018e-04f, -9.960235479e-04f, -8.415113541e-04f, +4.521248951e-05f, +1.062710289e-03f, +1.390492424e-03f, +6.647357780e-04f, -6.514284292e-04f, -1.568606346e-03f, -1.346894540e-03f, -1.147150770e-04f, +1.204281511e-03f, +1.617554017e-03f, +8.470377077e-04f, -4.756944942e-04f, -1.344660851e-03f, -1.177211241e-03f, -2.172049221e-04f, +7.425149321e-04f, +1.026715774e-03f, +5.615116392e-04f, -1.758694164e-04f, -6.151147960e-04f, -5.301127742e-04f, -1.225172574e-04f, +2.348554835e-04f, +3.163044258e-04f, +1.627780462e-04f, -3.400642472e-05f, -1.234204187e-04f, -9.104278358e-05f, -1.559266332e-05f, +2.894409669e-05f, +2.735959138e-05f, +7.280845023e-06f, + /* 4, 3 (48) */ + -4.054441832e-04f, -7.566272423e-04f, -6.368423699e-04f, +3.389628739e-04f, +1.946146147e-03f, +3.124405156e-03f, +2.444082636e-03f, -7.860241587e-04f, -5.446128040e-03f, -8.545013766e-03f, -6.722729790e-03f, +1.205206445e-03f, +1.225336569e-02f, +1.961551803e-02f, +1.603953443e-02f, -1.077975643e-03f, -2.583167317e-02f, -4.417079783e-02f, -3.948113709e-02f, -1.275616938e-03f, +6.748940991e-02f, +1.489362278e-01f, +2.163466535e-01f, +2.454260662e-01f, +2.252830714e-01f, +1.634849997e-01f, +8.253804732e-02f, +9.640879233e-03f, -3.499482479e-02f, -4.549967124e-02f, -3.027280715e-02f, -5.469468996e-03f, +1.381234848e-02f, +1.995113109e-02f, +1.415582144e-02f, +3.204128440e-03f, -5.674673905e-03f, -8.659612608e-03f, -6.256162005e-03f, -1.619985822e-03f, +2.028031661e-03f, +3.177091423e-03f, +2.243125712e-03f, +6.132994217e-04f, -5.234616208e-04f, -7.860477700e-04f, -4.826865807e-04f, -1.124923739e-04f, + +1.282502326e-05f, +6.631829657e-06f, -1.575588796e-05f, -4.342263601e-05f, -5.109317649e-05f, -1.558348651e-05f, +6.009027664e-05f, +1.339214410e-04f, +1.408612929e-04f, +3.706460373e-05f, -1.526707137e-04f, -3.222659344e-04f, -3.309403096e-04f, -9.576076956e-05f, +3.225875851e-04f, +7.052670211e-04f, +7.643591248e-04f, +3.047517951e-04f, -6.283162183e-04f, -1.712499040e-03f, -2.466506952e-03f, -2.478547275e-03f, -1.627890458e-03f, -1.740164482e-04f, +1.345655982e-03f, +2.362967526e-03f, +2.542417848e-03f, +1.922766365e-03f, +8.681716366e-04f, -1.338758426e-04f, -7.110112536e-04f, -7.552642627e-04f, -4.192508715e-04f, +1.446878429e-05f, +3.008555334e-04f, +3.423967670e-04f, +1.963843605e-04f, -3.581872455e-07f, -1.280706340e-04f, -1.433742428e-04f, -7.853403820e-05f, +1.604718976e-06f, +4.747135652e-05f, +4.781004476e-05f, +2.207718797e-05f, -3.017351572e-06f, -1.280083156e-05f, -8.936712204e-06f, + +2.715456467e-04f, +1.243904153e-03f, +1.812540719e-03f, +5.255546267e-04f, -2.928885573e-03f, -6.247704877e-03f, -5.385392104e-03f, +1.766580938e-03f, +1.169673666e-02f, +1.592003700e-02f, +7.414031795e-03f, -1.152071459e-02f, -2.768441760e-02f, -2.565500481e-02f, -1.515497754e-03f, +3.020398517e-02f, +4.479686773e-02f, +2.677568360e-02f, -1.500681854e-02f, -5.084525046e-02f, -5.205975209e-02f, -1.462436626e-02f, +3.548722750e-02f, +6.120593729e-02f, +4.315082581e-02f, -5.053706387e-03f, -4.755942122e-02f, -5.427209535e-02f, -2.322326420e-02f, +2.004821598e-02f, +4.401042729e-02f, +3.496352515e-02f, +4.560296965e-03f, -2.262402350e-02f, -2.904175797e-02f, -1.527825301e-02f, +4.385492061e-03f, +1.538943292e-02f, +1.320747308e-02f, +3.628838152e-03f, -4.507647960e-03f, -6.522212065e-03f, -3.675337169e-03f, +1.297979522e-05f, +1.749784668e-03f, +1.425160729e-03f, +4.274224541e-04f, -1.407560533e-04f, + -2.394720634e-05f, -3.165178783e-05f, +3.552050772e-06f, +7.734590613e-05f, +1.249420826e-04f, +6.132039239e-05f, -1.230802996e-04f, -3.004914841e-04f, -2.733933896e-04f, +4.138913951e-05f, +4.671998064e-04f, +6.380287732e-04f, +2.941645902e-04f, -4.247930999e-04f, -9.876493535e-04f, -8.590336898e-04f, +1.115266394e-05f, +1.037577029e-03f, +1.396353923e-03f, +7.007793324e-04f, -6.109405869e-04f, -1.555199324e-03f, -1.372321662e-03f, -1.604735422e-04f, +1.172816986e-03f, +1.623659271e-03f, +8.845679552e-04f, -4.363215056e-04f, -1.332212982e-03f, -1.197725728e-03f, -2.517506783e-04f, +7.205197926e-04f, +1.030547109e-03f, +5.834614779e-04f, -1.549398357e-04f, -6.093752927e-04f, -5.395136800e-04f, -1.363244821e-04f, +2.273902694e-04f, +3.181220543e-04f, +1.693004253e-04f, -2.902816071e-05f, -1.227328237e-04f, -9.319952775e-05f, -1.773293279e-05f, +2.832538384e-05f, +2.787300974e-05f, +7.865645190e-06f, + /* 4, 4 (48) */ + -3.926191600e-04f, -7.499954126e-04f, -6.525982578e-04f, +2.955402379e-04f, +1.895052970e-03f, +3.108821669e-03f, +2.504172913e-03f, -6.521027177e-04f, -5.305266748e-03f, -8.507949162e-03f, -6.875400504e-03f, +8.829405108e-04f, +1.192242538e-02f, +1.951975726e-02f, +1.636212202e-02f, -3.727086224e-04f, -2.506731404e-02f, -4.386604604e-02f, -4.010945331e-02f, -2.988115978e-03f, +6.502290296e-02f, +1.464576805e-01f, +2.147187630e-01f, +2.452520498e-01f, +2.266287274e-01f, +1.658479672e-01f, +8.508046517e-02f, +1.156364560e-02f, -3.412665315e-02f, -4.563354708e-02f, -3.098381841e-02f, -6.224733259e-03f, +1.339309761e-02f, +1.996559988e-02f, +1.445667697e-02f, +3.546525207e-03f, -5.478289544e-03f, -8.659970795e-03f, -6.384232639e-03f, -1.763360065e-03f, +1.949497623e-03f, +3.178696142e-03f, +2.290597068e-03f, +6.611094664e-04f, -5.013844328e-04f, -7.890651215e-04f, -4.954874122e-04f, -1.214290861e-04f, + +1.277815672e-05f, +7.080070146e-06f, -1.487372814e-05f, -4.271015005e-05f, -5.142937682e-05f, -1.741551516e-05f, +5.744172148e-05f, +1.322867935e-04f, +1.422283575e-04f, +4.196148700e-05f, -1.463254020e-04f, -3.187096293e-04f, -3.342310618e-04f, -1.066406684e-04f, +3.085938074e-04f, +6.967612850e-04f, +7.698491488e-04f, +3.272670360e-04f, -5.945862371e-04f, -1.681024634e-03f, -2.452591617e-03f, -2.491578750e-03f, -1.665869356e-03f, -2.236206357e-04f, +1.303172126e-03f, +2.343018643e-03f, +2.550090443e-03f, +1.951184787e-03f, +9.028001885e-04f, -1.076524697e-04f, -7.012321084e-04f, -7.609428930e-04f, -4.327665825e-04f, +2.183892139e-06f, +2.955471640e-04f, +3.445441995e-04f, +2.024748039e-04f, +5.203509853e-06f, -1.257792813e-04f, -1.444164487e-04f, -8.113144611e-05f, -5.472731236e-07f, +4.676809063e-05f, +4.834013806e-05f, +2.299301259e-05f, -2.434178788e-06f, -1.274354164e-05f, -9.168948451e-06f, + +2.475984404e-04f, +1.212252366e-03f, +1.816092770e-03f, +6.029005328e-04f, -2.803943490e-03f, -6.186384484e-03f, -5.508472404e-03f, +1.466089454e-03f, +1.142334327e-02f, +1.596142614e-02f, +7.881231602e-03f, -1.088268582e-02f, -2.739025301e-02f, -2.607979791e-02f, -2.503147107e-03f, +2.934495148e-02f, +4.480802039e-02f, +2.781326063e-02f, -1.361046461e-02f, -5.014447113e-02f, -5.267069267e-02f, -1.617956558e-02f, +3.411490584e-02f, +6.104546375e-02f, +4.432364280e-02f, -3.430047117e-03f, -4.667485326e-02f, -5.470841685e-02f, -2.455547718e-02f, +1.885049025e-02f, +4.375867662e-02f, +3.568404494e-02f, +5.590844074e-03f, -2.204056203e-02f, -2.919669781e-02f, -1.588762831e-02f, +3.845978381e-03f, +1.525310843e-02f, +1.343486335e-02f, +3.946960206e-03f, -4.338347535e-03f, -6.551240226e-03f, -3.798069993e-03f, -8.021973253e-05f, +1.732051735e-03f, +1.453486113e-03f, +4.552954639e-04f, -1.328904081e-04f, + -2.333362236e-05f, -3.194173417e-05f, +1.690552013e-06f, +7.496484133e-05f, +1.247804426e-04f, +6.542647888e-05f, -1.164291964e-04f, -2.970897857e-04f, -2.787575706e-04f, +2.825187413e-05f, +4.557418356e-04f, +6.399462117e-04f, +3.125433452e-04f, -4.013603659e-04f, -9.785563028e-04f, -8.757732603e-04f, -2.273152976e-05f, +1.011752738e-03f, +1.401110338e-03f, +7.361705945e-04f, -5.700740732e-04f, -1.540613279e-03f, -1.396669752e-03f, -2.061045701e-04f, +1.140426844e-03f, +1.628518790e-03f, +9.214941434e-04f, -3.964960053e-04f, -1.318683292e-03f, -1.217396724e-03f, -2.862808627e-04f, +6.978229305e-04f, +1.033588332e-03f, +6.051182020e-04f, -1.337012165e-04f, -6.030844187e-04f, -5.485735572e-04f, -1.501841507e-04f, +2.196337826e-04f, +3.196921023e-04f, +1.757786675e-04f, -2.393493880e-05f, -1.219164262e-04f, -9.531218521e-05f, -1.990756350e-05f, +2.765734466e-05f, +2.836758865e-05f, +8.460514288e-06f, + /* 4, 5 (48) */ + -3.798410033e-04f, -7.429153425e-04f, -6.674719860e-04f, +2.528300878e-04f, +1.843623593e-03f, +3.091406154e-03f, +2.561614635e-03f, -5.198159242e-04f, -5.163038390e-03f, -8.465987675e-03f, -7.021725906e-03f, +5.642308816e-04f, +1.158819432e-02f, +1.941311660e-02f, +1.667071582e-02f, +3.240526627e-04f, -2.429746489e-02f, -4.353877900e-02f, -4.070403955e-02f, -4.669140612e-03f, +6.257031134e-02f, +1.439661018e-01f, +2.130528937e-01f, +2.450284291e-01f, +2.279318995e-01f, +1.681909859e-01f, +8.763055561e-02f, +1.351483038e-02f, -3.322385297e-02f, -4.574119955e-02f, -3.168505052e-02f, -6.985676151e-03f, +1.296033103e-02f, +1.996778377e-02f, +1.475222413e-02f, +3.891069406e-03f, -5.275814740e-03f, -8.654767285e-03f, -6.510011921e-03f, -1.907776514e-03f, +1.868366177e-03f, +3.178148869e-03f, +2.337365159e-03f, +7.094496045e-04f, -4.783914202e-04f, -7.914993003e-04f, -5.082309539e-04f, -1.305980346e-04f, + +1.271963515e-05f, +7.511085657e-06f, -1.399869545e-05f, -4.197899425e-05f, -5.172165629e-05f, -1.920414868e-05f, +5.479546913e-05f, +1.305872469e-04f, +1.434819223e-04f, +4.676505722e-05f, -1.399681615e-04f, -3.149956671e-04f, -3.372720680e-04f, -1.173231310e-04f, +2.945804811e-04f, +6.879406509e-04f, +7.748150519e-04f, +3.492897638e-04f, -5.610317500e-04f, -1.649237711e-03f, -2.437936128e-03f, -2.503732601e-03f, -1.703221322e-03f, -2.731388008e-04f, +1.260192979e-03f, +2.322223945e-03f, +2.556947300e-03f, +1.979153161e-03f, +9.374756521e-04f, -8.099886954e-05f, -6.909087043e-04f, -7.662312983e-04f, -4.461813775e-04f, -1.025234248e-05f, +2.899864756e-04f, +3.464980832e-04f, +2.085129681e-04f, +1.083680508e-05f, -1.233714902e-04f, -1.453758241e-04f, -8.371341332e-05f, -2.735226303e-06f, +4.601742064e-05f, +4.884335002e-05f, +2.390989374e-05f, -1.834755230e-06f, -1.267196955e-05f, -9.397458000e-06f, + +2.242648180e-04f, +1.180310631e-03f, +1.817783322e-03f, +6.778653741e-04f, -2.679163048e-03f, -6.120958005e-03f, -5.624901600e-03f, +1.168999668e-03f, +1.114458570e-02f, +1.598967802e-02f, +8.336973437e-03f, -1.024273960e-02f, -2.707770966e-02f, -2.648115827e-02f, -3.481703410e-03f, +2.846917822e-02f, +4.478528886e-02f, +2.882501336e-02f, -1.220935428e-02f, -4.940830054e-02f, -5.324076675e-02f, -1.772017886e-02f, +3.271823609e-02f, +6.083935918e-02f, +4.546406964e-02f, -1.801528327e-03f, -4.575335912e-02f, -5.510491286e-02f, -2.587416048e-02f, +1.763309353e-02f, +4.347239575e-02f, +3.638186787e-02f, +6.624432406e-03f, -2.143544382e-02f, -2.933039902e-02f, -1.649071272e-02f, +3.297404824e-03f, +1.510292428e-02f, +1.365449713e-02f, +4.266652308e-03f, -4.162568867e-03f, -6.575175165e-03f, -3.919986419e-03f, -1.755319177e-04f, +1.712144172e-03f, +1.481143457e-03f, +4.836630525e-04f, -1.244298938e-04f, + -2.271014949e-05f, -3.218755973e-05f, -1.264986970e-07f, +7.256349920e-05f, +1.245060156e-04f, +6.940020102e-05f, -1.097845518e-04f, -2.934846979e-04f, -2.838162517e-04f, +1.525114812e-05f, +4.440387867e-04f, +6.413284520e-04f, +3.305073988e-04f, -3.777973932e-04f, -9.687567770e-04f, -8.917212832e-04f, -5.641373053e-05f, +9.852612407e-04f, +1.404762002e-03f, +7.708833030e-04f, -5.288622618e-04f, -1.524861610e-03f, -1.419920346e-03f, -2.515719334e-04f, +1.107136239e-03f, +1.632127022e-03f, +9.577855825e-04f, -3.562485408e-04f, -1.304078768e-03f, -1.236204745e-03f, -3.207674749e-04f, +6.744386457e-04f, +1.035831615e-03f, +6.264617115e-04f, -1.121686012e-04f, -5.962422370e-04f, -5.572811128e-04f, -1.640848971e-04f, +2.115891334e-04f, +3.210097061e-04f, +1.822061507e-04f, -1.872963638e-05f, -1.209696434e-04f, -9.737769918e-05f, -2.211498118e-05f, +2.693952258e-05f, +2.884217760e-05f, +9.064906686e-06f, + /* 4, 6 (48) */ + -3.671213681e-04f, -7.354042568e-04f, -6.814706814e-04f, +2.108510936e-04f, +1.791901937e-03f, +3.072202006e-03f, +2.616410104e-03f, -3.892286773e-04f, -5.019556468e-03f, -8.419222618e-03f, -7.161694067e-03f, +2.492352145e-04f, +1.125092225e-02f, +1.929579347e-02f, +1.696529630e-02f, +1.011993314e-03f, -2.352264984e-02f, -4.318948924e-02f, -4.126507130e-02f, -6.318378323e-03f, +6.013237521e-02f, +1.414623692e-01f, +2.113496723e-01f, +2.447552903e-01f, +2.291920925e-01f, +1.705132098e-01f, +9.018750292e-02f, +1.549398355e-02f, -3.228637731e-02f, -4.582219842e-02f, -3.237595922e-02f, -7.751907450e-03f, +1.251414965e-02f, +1.995753143e-02f, +1.504221061e-02f, +4.237567489e-03f, -5.067301772e-03f, -8.643930480e-03f, -6.633383411e-03f, -2.053152338e-03f, +1.784652763e-03f, +3.175413642e-03f, +2.383382579e-03f, +7.582929545e-04f, -4.544815265e-04f, -7.933340555e-04f, -5.209029234e-04f, -1.399954926e-04f, + +1.264978081e-05f, +7.924851840e-06f, -1.313138411e-05f, -4.123008952e-05f, -5.197054220e-05f, -2.094877260e-05f, +5.215336394e-05f, +1.288249044e-04f, +1.446226806e-04f, +5.147333744e-05f, -1.336032886e-04f, -3.111283429e-04f, -3.400643764e-04f, -1.278038710e-04f, +2.805562892e-04f, +6.788139878e-04f, +7.792603414e-04f, +3.708145029e-04f, -5.276662400e-04f, -1.617153954e-03f, -2.422550433e-03f, -2.515007272e-03f, -1.739933127e-03f, -3.225519117e-04f, +1.216734440e-03f, +2.300588926e-03f, +2.562981663e-03f, +2.006656758e-03f, +9.721830556e-04f, -5.392337557e-05f, -6.800401319e-04f, -7.711217117e-04f, -4.594859434e-04f, -2.283398945e-05f, +2.841739777e-04f, +3.482547981e-04f, +2.144942307e-04f, +1.653886144e-05f, -1.208473221e-04f, -1.462505197e-04f, -8.627786209e-05f, -4.958103691e-06f, +4.521911322e-05f, +4.931879124e-05f, +2.482708254e-05f, -1.219276524e-06f, -1.258586094e-05f, -9.621900691e-06f, + +2.015546685e-04f, +1.148123072e-03f, +1.817656823e-03f, +7.504288733e-04f, -2.554657032e-03f, -6.051557804e-03f, -5.734686152e-03f, +8.755149706e-04f, +1.086076945e-02f, +1.600492917e-02f, +8.781012224e-03f, -9.601411153e-03f, -2.674720226e-02f, -2.685895566e-02f, -4.450460187e-03f, +2.757745693e-02f, +4.472887513e-02f, +2.981027461e-02f, -1.080459227e-02f, -4.863741723e-02f, -5.376962901e-02f, -1.924504047e-02f, +3.129831574e-02f, +6.058778724e-02f, +4.657120588e-02f, -1.694013043e-04f, -4.479557353e-02f, -5.546116140e-02f, -2.717823924e-02f, +1.639688878e-02f, +4.315162828e-02f, +3.705630652e-02f, +7.660264021e-03f, -2.080898211e-02f, -2.944256762e-02f, -1.708695496e-02f, +2.740123711e-03f, +1.493883939e-02f, +1.386608626e-02f, +4.587662014e-03f, -3.980362717e-03f, -6.593904801e-03f, -4.040956062e-03f, -2.729096169e-04f, +1.690029190e-03f, +1.508082980e-03f, +5.125052301e-04f, -1.153649871e-04f, + -2.207785664e-05f, -3.239008541e-05f, -1.898155368e-06f, +7.014473331e-05f, +1.241211704e-04f, +7.324008229e-05f, -1.031523155e-04f, -2.896822997e-04f, -2.885689603e-04f, +2.396506984e-06f, +4.321031721e-04f, +6.421795125e-04f, +3.480455019e-04f, -3.541245312e-04f, -9.582636675e-04f, -9.068696886e-04f, -8.986788047e-05f, +9.581268104e-04f, +1.407310159e-03f, +8.048918298e-04f, -4.873387349e-04f, -1.507958646e-03f, -1.442055892e-03f, -2.968395419e-04f, +1.072971079e-03f, +1.634479434e-03f, +9.934120415e-04f, -3.156100896e-04f, -1.288407306e-03f, -1.254130937e-03f, -3.551824120e-04f, +6.503818960e-04f, +1.037269751e-03f, +6.474720252e-04f, -9.035740848e-05f, -5.888492894e-04f, -5.656252499e-04f, -1.780151924e-04f, +2.032597318e-04f, +3.220701710e-04f, +1.885762046e-04f, -1.341528578e-05f, -1.198909969e-04f, -9.939300496e-05f, -2.435354300e-05f, +2.617150928e-05f, +2.929562340e-05f, +9.678249260e-06f, + /* 4, 7 (48) */ + -3.544715873e-04f, -7.274794050e-04f, -6.946020655e-04f, +1.696210040e-04f, +1.739931395e-03f, +3.051253233e-03f, +2.668563468e-03f, -2.604037729e-04f, -4.874933787e-03f, -8.367749280e-03f, -7.295297356e-03f, -6.189312840e-05f, +1.091085788e-02f, +1.916798959e-02f, +1.724585259e-02f, +1.690807301e-03f, -2.274338950e-02f, -4.281867474e-02f, -4.179273754e-02f, -7.935532277e-03f, +5.770982478e-02f, +1.389473619e-01f, +2.096097392e-01f, +2.444327384e-01f, +2.304088269e-01f, +1.728137987e-01f, +9.275048458e-02f, +1.750064030e-02f, -3.131419426e-02f, -4.587612179e-02f, -3.305599935e-02f, -8.523029162e-03f, +1.205466371e-02f, +1.993469744e-02f, +1.532638459e-02f, +4.585822287e-03f, -4.852807542e-03f, -8.627391619e-03f, -6.754230733e-03f, -2.199402858e-03f, +1.698374901e-03f, +3.170455539e-03f, +2.428601693e-03f, +8.076117457e-04f, -4.296544439e-04f, -7.945533321e-04f, -5.334887844e-04f, -1.496173933e-04f, + +1.256892063e-05f, +8.321360299e-06f, -1.227237129e-05f, -4.046435566e-05f, -5.217658705e-05f, -2.264881449e-05f, +4.951722105e-05f, +1.270018852e-04f, +1.456513944e-04f, +5.608443952e-05f, -1.272350333e-04f, -3.071120005e-04f, -3.426091801e-04f, -1.380787733e-04f, +2.665298267e-04f, +6.693902437e-04f, +7.831887655e-04f, +3.918360714e-04f, -4.945030070e-04f, -1.584789098e-03f, -2.406444767e-03f, -2.525401601e-03f, -1.775991847e-03f, -3.718409871e-04f, +1.172812640e-03f, +2.278119471e-03f, +2.568187124e-03f, +2.033680987e-03f, +1.006907315e-03f, -2.643459550e-05f, -6.686257571e-04f, -7.756065067e-04f, -4.726709308e-04f, -3.555496353e-05f, +2.781103449e-04f, +3.498108096e-04f, +2.204139514e-04f, +2.230676018e-05f, -1.182069200e-04f, -1.470387212e-04f, -8.882269798e-05f, -7.214826744e-06f, +4.437296836e-05f, +4.976557993e-05f, +2.574381665e-05f, -5.879563279e-07f, -1.248497041e-05f, -9.841933680e-06f, + +1.794768119e-04f, +1.115732986e-03f, +1.815758668e-03f, +8.205736066e-04f, -2.430535862e-03f, -5.978317722e-03f, -5.837838467e-03f, +5.858326709e-04f, +1.057220049e-02f, +1.600732567e-02f, +9.213115396e-03f, -8.959231640e-03f, -2.639915676e-02f, -2.721308020e-02f, -5.408723854e-03f, +2.667058725e-02f, +4.463900725e-02f, +3.076840142e-02f, -9.397282114e-03f, -4.783252540e-02f, -5.425696774e-02f, -2.075299912e-02f, +2.985625985e-02f, +6.029094770e-02f, +4.764417696e-02f, +1.465078130e-03f, -4.380216149e-02f, -5.577677149e-02f, -2.846664655e-02f, +1.514275784e-02f, +4.279644587e-02f, +3.770668841e-02f, +8.697533773e-03f, -2.016151009e-02f, -2.953292503e-02f, -1.767580425e-02f, +2.174498461e-03f, +1.476082419e-02f, +1.406934599e-02f, +4.909732185e-03f, -3.791786512e-03f, -6.607320087e-03f, -4.160847059e-03f, -3.723026219e-04f, +1.665675647e-03f, +1.534254489e-03f, +5.418008535e-04f, -1.056867379e-04f, + -2.143779791e-05f, -3.255016448e-05f, -3.623541571e-06f, +6.771136134e-05f, +1.236283455e-04f, +7.694479968e-05f, -9.653833807e-05f, -2.856887703e-04f, -2.930155053e-04f, -1.030274097e-05f, +4.199475789e-04f, +6.425038326e-04f, +3.651468636e-04f, -3.303620685e-04f, -9.470903609e-04f, -9.212111215e-04f, -1.230682455e-04f, +9.303741423e-04f, +1.408756955e-03f, +8.381711999e-04f, -4.455372552e-04f, -1.489919637e-03f, -1.463059761e-03f, -3.418714729e-04f, +1.037957999e-03f, +1.635572511e-03f, +1.028343774e-03f, -2.746120345e-04f, -1.271677709e-03f, -1.271157102e-03f, -3.894974920e-04f, +6.256682876e-04f, +1.037896166e-03f, +6.681292984e-04f, -6.828342250e-05f, -5.809066006e-04f, -5.735950795e-04f, -1.919633541e-04f, +1.946492873e-04f, +3.228689785e-04f, +1.948821172e-04f, -7.995073534e-06f, -1.186791159e-04f, -1.013550330e-04f, -2.662153812e-05f, +2.535294614e-05f, +2.972677158e-05f, +1.029994154e-05f, + /* 4, 8 (48) */ + -3.419026667e-04f, -7.191580447e-04f, -7.068744368e-04f, +1.291566484e-04f, +1.687754808e-03f, +3.028604419e-03f, +2.718080689e-03f, -1.334018877e-04f, -4.729282393e-03f, -8.311664841e-03f, -7.422532389e-03f, -3.690051289e-04f, +1.056824870e-02f, +1.902991082e-02f, +1.751238242e-02f, +2.360197545e-03f, -2.196020074e-02f, -4.242683867e-02f, -4.228724054e-02f, -9.520321375e-03f, +5.530338001e-02f, +1.364219603e-01f, +2.078337474e-01f, +2.440608974e-01f, +2.315816396e-01f, +1.750919182e-01f, +9.531867170e-02f, +1.953432129e-02f, -3.030728694e-02f, -4.590255639e-02f, -3.372462511e-02f, -9.298635668e-03f, +1.158199278e-02f, +1.989914247e-02f, +1.560449493e-02f, +4.935633097e-03f, -4.632393590e-03f, -8.605084859e-03f, -6.872437653e-03f, -2.346441579e-03f, +1.609552203e-03f, +3.163240712e-03f, +2.472974661e-03f, +8.573773257e-04f, -4.039106273e-04f, -7.951412884e-04f, -5.459737548e-04f, -1.594593269e-04f, + +1.247738578e-05f, +8.700618332e-06f, -1.142221689e-05f, -3.968271065e-05f, -5.234036778e-05f, -2.430374389e-05f, +4.688882536e-05f, +1.251203224e-04f, +1.465688934e-04f, +6.059656432e-05f, -1.208675967e-04f, -3.029510298e-04f, -3.449078145e-04f, -1.481438948e-04f, +2.525095963e-04f, +6.596784399e-04f, +7.866043095e-04f, +4.123495821e-04f, -4.615551614e-04f, -1.552158922e-03f, -2.389629649e-03f, -2.534914823e-03f, -1.811384863e-03f, -4.209871051e-04f, +1.128443930e-03f, +2.254821845e-03f, +2.572557625e-03f, +2.060211405e-03f, +1.041633242e-03f, +1.458591480e-06f, -6.566652244e-04f, -7.796782035e-04f, -4.857269586e-04f, -4.840902647e-05f, +2.717964180e-04f, +3.511626720e-04f, +2.262674753e-04f, +2.813750178e-05f, -1.154505091e-04f, -1.477386512e-04f, -9.134581111e-05f, -9.504275476e-06f, +4.347881995e-05f, +5.018284270e-05f, +2.665932067e-05f, +5.897355422e-08f, -1.236906188e-05f, -1.005721173e-05f, + +1.580390140e-04f, +1.083182822e-03f, +1.812135126e-03f, +8.882849680e-04f, -2.306907516e-03f, -5.901372922e-03f, -5.934376806e-03f, +3.001439006e-04f, +1.027918498e-02f, +1.599702293e-02f, +9.633062975e-03f, -8.316727808e-03f, -2.603400990e-02f, -2.754344226e-02f, -6.355814215e-03f, +2.574937612e-02f, +4.451593900e-02f, +3.169877556e-02f, -7.988525159e-03f, -4.699435420e-02f, -5.470250500e-02f, -2.224291876e-02f, +2.839320009e-02f, +5.994907623e-02f, +4.868213496e-02f, +3.100650641e-03f, -4.277381772e-02f, -5.605138352e-02f, -2.973832426e-02f, +1.387160074e-02f, +4.240694837e-02f, +3.833235670e-02f, +9.735429939e-03f, -1.949338079e-02f, -2.960120845e-02f, -1.825671085e-02f, +1.600903381e-03f, +1.456886084e-02f, +1.426399528e-02f, +5.232601164e-03f, -3.596904395e-03f, -6.615315161e-03f, -4.279526175e-03f, -4.736576549e-04f, +1.639054109e-03f, +1.559607435e-03f, +5.715276251e-04f, -9.538679632e-05f, + -2.079101159e-05f, -3.266868091e-05f, -5.301850104e-06f, +6.526616266e-05f, +1.230300454e-04f, +8.051318266e-05f, -8.994836685e-05f, -2.815103813e-04f, -2.971559747e-04f, -2.283753055e-05f, +4.075846569e-04f, +6.423062653e-04f, +3.818011580e-04f, -3.065302152e-04f, -9.352507246e-04f, -9.347389443e-04f, -1.559894358e-04f, +9.020283335e-04f, +1.409105432e-03f, +8.706971109e-04f, -4.034917365e-04f, -1.470760737e-03f, -1.482916267e-03f, -3.866320012e-04f, +1.002124343e-03f, +1.635403767e-03f, +1.062551544e-03f, -2.332861382e-04f, -1.253899682e-03f, -1.287265709e-03f, -4.236844779e-04f, +6.003140652e-04f, +1.037704928e-03f, +6.884138412e-04f, -4.596278178e-05f, -5.724156817e-04f, -5.811799325e-04f, -2.059175552e-04f, +1.857618093e-04f, +3.234017925e-04f, +2.011171405e-04f, -2.472339476e-06f, -1.173327403e-04f, -1.032607123e-04f, -2.891718833e-05f, +2.448352570e-05f, +3.013446780e-05f, +1.092935588e-05f, + /* 4, 9 (48) */ + -3.294252809e-04f, -7.104574263e-04f, -7.182966537e-04f, +8.947393773e-05f, +1.635414440e-03f, +3.004300675e-03f, +2.764969514e-03f, -8.281565258e-06f, -4.582713499e-03f, -8.251068276e-03f, -7.543399986e-03f, -6.719561588e-04f, +1.022334088e-02f, +1.888176693e-02f, +1.776489202e-02f, +3.019875985e-03f, -2.117359643e-02f, -4.201448908e-02f, -4.274879570e-02f, -1.107248030e-02f, +5.291375036e-02f, +1.338870455e-01f, +2.060223625e-01f, +2.436399103e-01f, +2.327100835e-01f, +1.773467400e-01f, +9.789122933e-02f, +2.159453270e-02f, -2.926565370e-02f, -4.590109780e-02f, -3.438129033e-02f, -1.007831387e-02f, +1.109626582e-02f, +1.985073345e-02f, +1.587629135e-02f, +5.286795769e-03f, -4.406126115e-03f, -8.576947357e-03f, -6.987888162e-03f, -2.494180230e-03f, +1.518206392e-03f, +3.153736437e-03f, +2.516453481e-03f, +9.075601684e-04f, -3.772513066e-04f, -7.950823148e-04f, -5.583428167e-04f, -1.695165387e-04f, + +1.237551130e-05f, +9.062648661e-06f, -1.058146335e-05f, -3.888606991e-05f, -5.246248495e-05f, -2.591307205e-05f, +4.426993069e-05f, +1.231823616e-04f, +1.473760729e-04f, +6.500800187e-05f, -1.145051290e-04f, -2.986498630e-04f, -3.469617557e-04f, -1.579954647e-04f, +2.385040047e-04f, +6.496876654e-04f, +7.895111918e-04f, +4.323504425e-04f, -4.288356190e-04f, -1.519279236e-03f, -2.372115874e-03f, -2.543546566e-03f, -1.846099875e-03f, -4.699714128e-04f, +1.083644875e-03f, +2.230702699e-03f, +2.576087462e-03f, +2.086233724e-03f, +1.076345550e-03f, +2.974703766e-05f, -6.441584584e-04f, -7.833294736e-04f, -4.986446197e-04f, -6.138978928e-05f, +2.652332049e-04f, +3.523070318e-04f, +2.320501354e-04f, +3.402800705e-05f, -1.125783976e-04f, -1.483485705e-04f, -9.384507757e-05f, -1.182528874e-05f, +4.253653645e-05f, +5.056971542e-05f, +2.757280659e-05f, +7.212630777e-07f, -1.223790898e-05f, -1.026738752e-05f, + +1.372480024e-04f, +1.050514141e-03f, +1.806833276e-03f, +9.535511306e-04f, -2.183877471e-03f, -5.820859740e-03f, -6.024325172e-03f, +1.863351932e-05f, +9.982029006e-03f, +1.597418540e-02f, +1.004064763e-02f, -7.674421542e-03f, -2.565220874e-02f, -2.784997248e-02f, -7.291064940e-03f, +2.481463718e-02f, +4.435994957e-02f, +3.260080389e-02f, -6.579419727e-03f, -4.612365709e-02f, -5.510599674e-02f, -2.371367949e-02f, +2.691028382e-02f, +5.956244423e-02f, +4.968425930e-02f, +4.736054408e-03f, -4.171126617e-02f, -5.628466966e-02f, -3.099222394e-02f, +1.258433503e-02f, +4.198326390e-02f, +3.893267077e-02f, +1.077313487e-02f, -1.880496695e-02f, -2.964717124e-02f, -1.882912653e-02f, +1.019723449e-03f, +1.436294328e-02f, +1.444975709e-02f, +5.556002956e-03f, -3.395787254e-03f, -6.617787500e-03f, -4.396858915e-03f, -5.769183672e-04f, +1.610136921e-03f, +1.584090961e-03f, +6.016620929e-04f, -8.445744044e-05f, + -2.013851916e-05f, -3.274654767e-05f, -6.932342584e-06f, +6.281187603e-05f, +1.223288367e-04f, +8.394421207e-05f, -8.338804160e-05f, -2.771534900e-04f, -3.009907318e-04f, -3.519904534e-05f, +3.950271064e-04f, +6.415920685e-04f, +3.979985283e-04f, -2.826490864e-04f, -9.227590917e-04f, -9.474472378e-04f, -1.886064256e-04f, +8.731148588e-04f, +1.408359528e-03f, +9.024459511e-04f, -3.612362155e-04f, -1.450498990e-03f, -1.501610669e-03f, -4.310856293e-04f, +9.654981397e-04f, +1.633971743e-03f, +1.096006654e-03f, -1.916645172e-04f, -1.235083830e-03f, -1.302439913e-03f, -4.577151014e-04f, +5.743361015e-04f, +1.036690754e-03f, +7.083061374e-04f, -2.341196786e-05f, -5.633785327e-04f, -5.883693712e-04f, -2.198658333e-04f, +1.766016064e-04f, +3.236644660e-04f, +2.072744965e-04f, +3.149424362e-06f, -1.158507237e-04f, -1.051069733e-04f, -3.123864879e-05f, +2.356299303e-05f, +3.051755931e-05f, +1.156583771e-05f, + /* 4,10 (48) */ + -3.170497696e-04f, -7.013947777e-04f, -7.288781171e-04f, +5.058786781e-05f, +1.582951955e-03f, +2.978387603e-03f, +2.809239445e-03f, +1.149007964e-04f, -4.435337427e-03f, -8.186060275e-03f, -7.657905115e-03f, -9.706060217e-04f, +9.876379128e-03f, +1.872377146e-02f, +1.800339602e-02f, +3.669563650e-03f, -2.038408523e-02f, -4.158213864e-02f, -4.317763132e-02f, -1.259175953e-02f, +5.054163449e-02f, +1.313434989e-01f, +2.041762626e-01f, +2.431699389e-01f, +2.337937284e-01f, +1.795774427e-01f, +1.004673168e-01f, +2.368076642e-02f, -2.818930815e-02f, -4.587135076e-02f, -3.502544879e-02f, -1.086164335e-02f, +1.059762120e-02f, +1.978934366e-02f, +1.614152455e-02f, +5.639102801e-03f, -4.174075979e-03f, -8.542919350e-03f, -7.100466560e-03f, -2.642528801e-03f, +1.424361314e-03f, +3.141911148e-03f, +2.558990017e-03f, +9.581298838e-04f, -3.496785000e-04f, -7.943610518e-04f, -5.705807257e-04f, -1.797839262e-04f, + +1.226363572e-05f, +9.407489159e-06f, -9.750635465e-06f, -3.807534563e-05f, -5.254356191e-05f, -2.747635175e-05f, +4.166225889e-05f, +1.211901590e-04f, +1.480738929e-04f, +6.931713154e-05f, -1.081517273e-04f, -2.942129712e-04f, -3.487726173e-04f, -1.676298856e-04f, +2.245213585e-04f, +6.394270710e-04f, +7.919138599e-04f, +4.518343557e-04f, -3.963570956e-04f, -1.486165880e-03f, -2.353914507e-03f, -2.551296854e-03f, -1.880124898e-03f, -5.187751349e-04f, +1.038432244e-03f, +2.205769064e-03f, +2.578771288e-03f, +2.111733820e-03f, +1.111028863e-03f, +5.842132989e-05f, -6.311056663e-04f, -7.865531458e-04f, -5.114144858e-04f, -7.449071459e-05f, +2.584218823e-04f, +3.532406304e-04f, +2.377572560e-04f, +3.997511835e-05f, -1.095909776e-04f, -1.488667806e-04f, -9.631836077e-05f, -1.417666452e-05f, +4.154602144e-05f, +5.092534407e-05f, +2.848347424e-05f, +1.398643874e-06f, -1.209129542e-05f, -1.047211195e-05f, + +1.171094832e-04f, +1.017767593e-03f, +1.799900934e-03f, +1.016363007e-03f, -2.061548634e-03f, -5.736915528e-03f, -6.107713214e-03f, -2.585199707e-04f, +9.681038274e-03f, +1.593898636e-02f, +1.043567474e-02f, -7.032829474e-03f, -2.525421021e-02f, -2.813262157e-02f, -8.213824032e-03f, +2.386718994e-02f, +4.417134314e-02f, +3.347391875e-02f, -5.171060199e-03f, -4.522121114e-02f, -5.546723295e-02f, -2.516417848e-02f, +2.540867315e-02f, +5.913135860e-02f, +5.064975744e-02f, +6.370026151e-03f, -4.061525952e-02f, -5.647633418e-02f, -3.222730777e-02f, +1.128189512e-02f, +4.152554879e-02f, +3.950700687e-02f, +1.180982562e-02f, -1.809666081e-02f, -2.967058320e-02f, -1.939250507e-02f, +4.313540776e-04f, +1.414307745e-02f, +1.462635870e-02f, +5.879667422e-03f, -3.188512758e-03f, -6.614638076e-03f, -4.512709639e-03f, -6.820253404e-04f, +1.578898272e-03f, +1.607653954e-03f, +6.321796522e-04f, -7.289160273e-05f, + -1.948132439e-05f, -3.278470509e-05f, -8.514348974e-06f, +6.035119738e-05f, +1.215273449e-04f, +8.723701883e-05f, -7.686289059e-05f, -2.726245321e-04f, -3.045204117e-04f, -4.737872311e-05f, +3.822876665e-04f, +6.403668975e-04f, +4.137295927e-04f, -2.587386849e-04f, -9.096302455e-04f, -9.593308029e-04f, -2.208945727e-04f, +8.436595480e-04f, +1.406524065e-03f, +9.333948178e-04f, -3.188048226e-04f, -1.429152316e-03f, -1.519129192e-03f, -4.751971168e-04f, +9.281080801e-04f, +1.631276012e-03f, +1.128680965e-03f, -1.497796158e-04f, -1.215241647e-03f, -1.316663576e-03f, -4.915610870e-04f, +5.477518863e-04f, +1.034849023e-03f, +7.277868621e-04f, -6.477933725e-07f, -5.537976452e-04f, -5.951532014e-04f, -2.337961005e-04f, +1.671732861e-04f, +3.236530469e-04f, +2.133473835e-04f, +8.866574981e-06f, -1.142320367e-04f, -1.068907517e-04f, -3.358400885e-05f, +2.259114707e-05f, +3.087489644e-05f, +1.220870577e-05f, + /* 4,11 (48) */ + -3.047861339e-04f, -6.919872885e-04f, -7.386287525e-04f, +1.251252218e-05f, +1.530408393e-03f, +2.950911251e-03f, +2.850901704e-03f, +2.360909554e-04f, -4.287263534e-03f, -8.116743143e-03f, -7.766056842e-03f, -1.264818993e-03f, +9.527606511e-03f, +1.855614158e-02f, +1.822791738e-02f, +4.308990721e-03f, -1.959217137e-02f, -4.113030429e-02f, -4.357398842e-02f, -1.407792541e-02f, +4.818771998e-02f, +1.287922020e-01f, +2.022961377e-01f, +2.426511638e-01f, +2.348321606e-01f, +1.817832118e-01f, +1.030460881e-01f, +2.579250024e-02f, -2.707827929e-02f, -4.581292943e-02f, -3.565655446e-02f, -1.164819649e-02f, +1.008620671e-02f, +1.971485294e-02f, +1.639994644e-02f, +5.992343431e-03f, -3.936318723e-03f, -8.502944231e-03f, -7.210057537e-03f, -2.791395581e-03f, +1.328042954e-03f, +3.127734483e-03f, +2.600536039e-03f, +1.009055228e-03f, -3.211950258e-04f, -7.929624079e-04f, -5.826720211e-04f, -1.902560381e-04f, + +1.214210066e-05f, +9.735192555e-06f, -8.930240209e-06f, -3.725144604e-05f, -5.258424396e-05f, -2.899317705e-05f, +3.906749896e-05f, +1.191458798e-04f, +1.486633763e-04f, +7.352242204e-05f, -1.018114333e-04f, -2.896448614e-04f, -3.503421484e-04f, -1.770437336e-04f, +2.105698600e-04f, +6.289058638e-04f, +7.938169860e-04f, +4.707973205e-04f, -3.641321009e-04f, -1.452834710e-03f, -2.335036878e-03f, -2.558166103e-03f, -1.913448276e-03f, -5.673795826e-04f, +9.928230059e-04f, +2.180028346e-03f, +2.580604122e-03f, +2.136697738e-03f, +1.145667720e-03f, +8.747179280e-05f, -6.175073398e-04f, -7.893422111e-04f, -5.240271131e-04f, -8.770511911e-05f, +2.513637965e-04f, +3.539603077e-04f, +2.433841554e-04f, +4.597560078e-05f, -1.064887260e-04f, -1.492916248e-04f, -9.876351284e-05f, -1.655716031e-05f, +4.050721427e-05f, +5.124888558e-05f, +2.939051183e-05f, +2.090829182e-06f, -1.192901538e-05f, -1.067103444e-05f, + +9.762815885e-05f, +9.849828881e-04f, +1.791386585e-03f, +1.076714204e-03f, -1.940021289e-03f, -5.649678509e-03f, -6.184576105e-03f, -5.311445028e-04f, +9.376517862e-03f, +1.589160763e-02f, +1.081796240e-02f, -6.392462576e-03f, -2.484048062e-02f, -2.839136025e-02f, -9.123454277e-03f, +2.290785914e-02f, +4.395044857e-02f, +3.431757830e-02f, -3.764536134e-03f, -4.428781632e-02f, -5.578603777e-02f, -2.659333080e-02f, +2.388954396e-02f, +5.865616148e-02f, +5.157786552e-02f, +8.001302163e-03f, -3.948657856e-02f, -5.662611379e-02f, -3.344254942e-02f, +9.965231544e-03f, +4.103398771e-02f, +4.005475875e-02f, +1.284467464e-02f, -1.736887395e-02f, -2.967123100e-02f, -1.994630271e-02f, -1.637991238e-04f, +1.390928135e-02f, +1.479353198e-02f, +6.203320469e-03f, -2.975165374e-03f, -6.605771501e-03f, -4.626941676e-03f, -7.889160921e-04f, +1.545314263e-03f, +1.630245101e-03f, +6.630545487e-04f, -6.068289696e-05f, + -1.882041246e-05f, -3.278411916e-05f, -1.004726703e-05f, +5.788677766e-05f, +1.206282501e-04f, +9.039088257e-05f, -7.037832680e-05f, -2.679300144e-04f, -3.077459176e-04f, -5.936826082e-05f, +3.693791032e-04f, +6.386367957e-04f, +4.289854480e-04f, -2.348188846e-04f, -8.958794037e-04f, -9.703851603e-04f, -2.528296377e-04f, +8.136885621e-04f, +1.403604744e-03f, +9.635215340e-04f, -2.762317526e-04f, -1.406739489e-03f, -1.535459032e-03f, -5.189315099e-04f, +8.899834931e-04f, +1.627317182e-03f, +1.160546927e-03f, -1.076641795e-04f, -1.194385510e-03f, -1.329921279e-03f, -5.251941758e-04f, +5.205795147e-04f, +1.032175779e-03f, +7.468369003e-04f, +2.231261017e-05f, -5.436760041e-04f, -6.015214833e-04f, -2.476961529e-04f, +1.574817538e-04f, +3.233637847e-04f, +2.193289824e-04f, +1.467531985e-05f, -1.124757694e-04f, -1.086089913e-04f, -3.595129296e-05f, +2.156784201e-05f, +3.120533410e-05f, +1.285725242e-05f, + /* 4,12 (48) */ + -2.926440332e-04f, -6.822520959e-04f, -7.475589927e-04f, -2.473892386e-05f, +1.477824149e-03f, +2.921918074e-03f, +2.889969203e-03f, +3.552368352e-04f, -4.138600157e-03f, -8.043220721e-03f, -7.867868276e-03f, -1.554463854e-03f, +9.177264362e-03f, +1.837909784e-02f, +1.843848724e-02f, +4.937896585e-03f, -1.879835439e-02f, -4.065950696e-02f, -4.393812052e-02f, -1.553076012e-02f, +4.585268310e-02f, +1.262340359e-01f, +2.003826895e-01f, +2.420837842e-01f, +2.358249836e-01f, +1.839632402e-01f, +1.056266922e-01f, +2.792919798e-02f, -2.593261157e-02f, -4.572545764e-02f, -3.627406180e-02f, -1.243753870e-02f, +9.562179601e-03f, +1.962714782e-02f, +1.665131023e-02f, +6.346303739e-03f, -3.692934568e-03f, -8.456968631e-03f, -7.316546263e-03f, -2.940687206e-03f, +1.229279441e-03f, +3.111177323e-03f, +2.641043253e-03f, +1.060304113e-03f, -2.918045140e-04f, -7.908715787e-04f, -5.946010365e-04f, -2.009270726e-04f, + +1.201125048e-05f, +1.004582615e-05f, -8.120766612e-06f, -3.641527474e-05f, -5.258519756e-05f, -3.046318302e-05f, +3.648730630e-05f, +1.170516966e-04f, +1.491456078e-04f, +7.762243142e-05f, -9.548823139e-05f, -2.849500731e-04f, -3.516722310e-04f, -1.862337587e-04f, +1.966576036e-04f, +6.181333013e-04f, +7.952254626e-04f, +4.892356315e-04f, -3.321729341e-04f, -1.419301593e-03f, -2.315494573e-03f, -2.564155124e-03f, -1.946058681e-03f, -6.157661632e-04f, +9.468343174e-04f, +2.153488329e-03f, +2.581581344e-03f, +2.161111704e-03f, +1.180246587e-03f, +1.168884923e-04f, -6.033642566e-04f, -7.916898281e-04f, -5.364730471e-04f, -1.010261762e-04f, +2.440604639e-04f, +3.544630052e-04f, +2.489261490e-04f, +5.202614347e-05f, -1.032722050e-04f, -1.496214900e-04f, -1.011783760e-04f, -1.896549344e-05f, +3.942009059e-05f, +5.153950867e-05f, +3.029309637e-05f, +2.797513799e-06f, -1.175087387e-05f, -1.086380328e-05f, + +7.880774639e-05f, +9.521987690e-04f, +1.781339318e-03f, +1.134600982e-03f, -1.819393039e-03f, -5.559287626e-03f, -6.254954431e-03f, -7.990745172e-04f, +9.068771944e-03f, +1.583223937e-02f, +1.118734151e-02f, -5.753825781e-03f, -2.441149517e-02f, -2.862617914e-02f, -1.001933368e-02f, +2.193747398e-02f, +4.369761893e-02f, +3.513126686e-02f, -2.360931390e-03f, -4.332429479e-02f, -5.606226953e-02f, -2.800007029e-02f, +2.235408493e-02f, +5.813722997e-02f, +5.246784902e-02f, +9.628619345e-03f, -3.832603163e-02f, -5.673377797e-02f, -3.463693493e-02f, +8.635310265e-03f, +4.050879353e-02f, +4.057533827e-02f, +1.387685042e-02f, -1.662203705e-02f, -2.964891839e-02f, -2.048997872e-02f, -7.653206070e-04f, +1.366158520e-02f, +1.495101374e-02f, +6.526684254e-03f, -2.755836392e-03f, -6.591096181e-03f, -4.739417445e-03f, -8.975250834e-04f, +1.509362970e-03f, +1.651812943e-03f, +6.942598828e-04f, -4.782564454e-05f, + -1.815674907e-05f, -3.274577985e-05f, -1.153056169e-05f, +5.542122079e-05f, +1.196342840e-04f, +9.340523006e-05f, -6.393964423e-05f, -2.630765080e-04f, -3.106684165e-04f, -7.115961947e-05f, +3.563141973e-04f, +6.364081860e-04f, +4.437576740e-04f, -2.109094147e-04f, -8.815222021e-04f, -9.806065503e-04f, -2.843878024e-04f, +7.832283699e-04f, +1.399608137e-03f, +9.928046655e-04f, -2.335512367e-04f, -1.383280130e-03f, -1.550588370e-03f, -5.622541709e-04f, +8.511543217e-04f, +1.622096891e-03f, +1.191577599e-03f, -6.535122827e-05f, -1.172528677e-03f, -1.342198342e-03f, -5.585861505e-04f, +4.928376748e-04f, +1.028667743e-03f, +7.654373648e-04f, +4.545180504e-05f, -5.330170897e-04f, -6.074645433e-04f, -2.615536806e-04f, +1.475322116e-04f, +3.227931365e-04f, +2.252124631e-04f, +2.057171849e-05f, -1.105811345e-04f, -1.102586480e-04f, -3.833846165e-05f, +2.049298849e-05f, +3.150773327e-05f, +1.351074403e-05f, + /* 4,13 (48) */ + -2.806327827e-04f, -6.722062698e-04f, -7.556797593e-04f, -6.115419859e-05f, +1.425238952e-03f, +2.891454891e-03f, +2.926456509e-03f, +4.722885319e-04f, -3.989454550e-03f, -7.965598290e-03f, -7.963356507e-03f, -1.839413927e-03f, +8.825592131e-03f, +1.819286408e-02f, +1.863514484e-02f, +5.556029886e-03f, -1.800312893e-02f, -4.017027133e-02f, -4.427029345e-02f, -1.695006172e-02f, +4.353718853e-02f, +1.236698808e-01f, +1.984366308e-01f, +2.414680180e-01f, +2.367718179e-01f, +1.861167285e-01f, +1.082082735e-01f, +3.009030968e-02f, -2.475236498e-02f, -4.560856914e-02f, -3.687742605e-02f, -1.322922853e-02f, +9.025706554e-03f, +1.952612165e-02f, +1.689537070e-02f, +6.700766744e-03f, -3.444008419e-03f, -8.404942487e-03f, -7.419818468e-03f, -3.090308696e-03f, +1.128101065e-03f, +3.092211830e-03f, +2.680463344e-03f, +1.111843622e-03f, -2.615114176e-04f, -7.880740649e-04f, -6.063519103e-04f, -2.117908759e-04f, + +1.187143190e-05f, +1.033947149e-05f, -7.322685613e-06f, -3.556773003e-05f, -5.254710946e-05f, -3.188604545e-05f, +3.392330190e-05f, +1.149097875e-04f, +1.495217318e-04f, +8.161580702e-05f, -8.918604661e-05f, -2.801331747e-04f, -3.527648773e-04f, -1.951968851e-04f, +1.827925721e-04f, +6.071186859e-04f, +7.961443986e-04f, +5.071458790e-04f, -3.004916782e-04f, -1.385582399e-03f, -2.295299430e-03f, -2.569265114e-03f, -1.977945120e-03f, -6.639163882e-04f, +9.004835180e-04f, +2.126157165e-03f, +2.581698707e-03f, +2.184962126e-03f, +1.214749860e-03f, +1.466612390e-04f, -5.886774826e-04f, -7.935893281e-04f, -5.487428281e-04f, -1.144469186e-04f, +2.365135726e-04f, +3.547457686e-04f, +2.543785525e-04f, +5.812336101e-05f, -9.994206275e-05f, -1.498548087e-04f, -1.035607843e-04f, -2.140034152e-05f, +3.828466290e-05f, +5.179639469e-05f, +3.119039424e-05f, +3.518374039e-06f, -1.155668711e-05f, -1.105006591e-05f, + +6.065099732e-05f, +9.194529891e-04f, +1.769808756e-03f, +1.190022202e-03f, -1.699758755e-03f, -5.465882396e-03f, -6.318894076e-03f, -1.062151025e-03f, +8.758103528e-03f, +1.576107975e-02f, +1.154365571e-02f, -5.117417595e-03f, -2.396773750e-02f, -2.883708855e-02f, -1.090085588e-02f, +2.095686743e-02f, +4.341323113e-02f, +3.591449523e-02f, -9.613232535e-04f, -4.233149012e-02f, -5.629582076e-02f, -2.938335042e-02f, +2.080349656e-02f, +5.757497580e-02f, +5.331900334e-02f, +1.125071624e-02f, -3.713445403e-02f, -5.679912920e-02f, -3.580946361e-02f, +7.293111923e-03f, +3.995020738e-02f, +4.106817594e-02f, +1.490551817e-02f, -1.585659968e-02f, -2.960346658e-02f, -2.102299581e-02f, -1.372785150e-03f, +1.340003152e-02f, +1.509854595e-02f, +6.849477391e-03f, -2.530623929e-03f, -6.570524462e-03f, -4.849998580e-03f, -1.007783731e-03f, +1.471024509e-03f, +1.672305932e-03f, +7.257676160e-04f, -3.431490051e-05f, + -1.749127965e-05f, -3.267069945e-05f, -1.296376440e-05f, +5.295708166e-05f, +1.185482258e-04f, +9.627963359e-05f, -5.755201443e-05f, -2.580706410e-04f, -3.132893352e-04f, -8.274502853e-05f, +3.431057333e-04f, +6.336878614e-04f, +4.580383367e-04f, -1.870298427e-04f, -8.665746790e-04f, -9.899919317e-04f, -3.155456883e-04f, +7.523057237e-04f, +1.394541677e-03f, +1.021223537e-03f, -1.907975127e-04f, -1.358794677e-03f, -1.564506376e-03f, -6.051308071e-04f, +8.116510977e-04f, +1.615617815e-03f, +1.221746674e-03f, -2.287402917e-05f, -1.149685270e-03f, -1.353480834e-03f, -5.917088586e-04f, +4.645456348e-04f, +1.024322317e-03f, +7.835696146e-04f, +6.875206024e-05f, -5.218248785e-04f, -6.129729854e-04f, -2.753562781e-04f, +1.373301571e-04f, +3.219377725e-04f, +2.309909909e-04f, +2.655168425e-05f, -1.085474701e-04f, -1.118366926e-04f, -4.074341266e-05f, +1.936655489e-05f, +3.178096262e-05f, +1.416842128e-05f, + /* 4,14 (48) */ + -2.687613508e-04f, -6.618667983e-04f, -7.630024450e-04f, -9.672192862e-05f, +1.372691842e-03f, +2.859568845e-03f, +2.960379811e-03f, +5.871983194e-04f, -3.839932818e-03f, -7.883982483e-03f, -8.052542554e-03f, -2.119547102e-03f, +8.472827254e-03f, +1.799766720e-02f, +1.881793742e-02f, +6.163148572e-03f, -1.720698453e-02f, -3.966312545e-02f, -4.457078513e-02f, -1.833564411e-02f, +4.124188910e-02f, +1.211006157e-01f, +1.964586857e-01f, +2.408041017e-01f, +2.376723015e-01f, +1.882428856e-01f, +1.107899723e-01f, +3.227527181e-02f, -2.353761512e-02f, -4.546190791e-02f, -3.746610354e-02f, -1.402281786e-02f, +8.476963726e-03f, +1.941167473e-02f, +1.713188427e-02f, +7.055512513e-03f, -3.189629866e-03f, -8.346819126e-03f, -7.519760531e-03f, -3.240163505e-03f, +1.024540281e-03f, +3.070811488e-03f, +2.718748007e-03f, +1.163640017e-03f, -2.303210233e-04f, -7.845556909e-04f, -6.179085974e-04f, -2.228409418e-04f, + +1.172299359e-05f, +1.061622408e-05f, -6.536449958e-06f, -3.470970428e-05f, -5.247068588e-05f, -3.326148050e-05f, +3.137707163e-05f, +1.127223349e-04f, +1.497929516e-04f, +8.550128532e-05f, -8.290874270e-05f, -2.751987605e-04f, -3.536222271e-04f, -2.039302110e-04f, +1.689826330e-04f, +5.958713593e-04f, +7.965791143e-04f, +5.245249488e-04f, -2.691001954e-04f, -1.351692992e-03f, -2.274463530e-03f, -2.573497662e-03f, -2.009096942e-03f, -7.118118828e-04f, +8.537881199e-04f, +2.098043378e-03f, +2.580952332e-03f, +2.208235610e-03f, +1.249161875e-03f, +1.767795924e-04f, -5.734483729e-04f, -7.950342203e-04f, -5.608269972e-04f, -1.279602412e-04f, +2.287249824e-04f, +3.548057515e-04f, +2.597366849e-04f, +6.426379482e-05f, -9.649903394e-05f, -1.499900605e-04f, -1.059085645e-04f, -2.386034291e-05f, +3.710098106e-05f, +5.201873851e-05f, +3.208156172e-05f, +4.253067716e-06f, -1.134628287e-05f, -1.122946931e-05f, + +4.315971767e-05f, +8.867822897e-04f, +1.756844992e-03f, +1.242979284e-03f, -1.581210529e-03f, -5.369602763e-03f, -6.376446090e-03f, -1.320221666e-03f, +8.444814193e-03f, +1.567833472e-02f, +1.188676144e-02f, -4.483729733e-03f, -2.350969916e-02f, -2.902411839e-02f, -1.176743056e-02f, +1.996687550e-02f, +4.309768544e-02f, +3.666680095e-02f, +4.332184234e-04f, -4.131026659e-02f, -5.648661828e-02f, -3.074214510e-02f, +1.923899018e-02f, +5.696984499e-02f, +5.413065444e-02f, +1.286633405e-02f, -3.591270736e-02f, -5.682200323e-02f, -3.695914888e-02f, +5.939631090e-03f, +3.935849852e-02f, +4.153272158e-02f, +1.592984048e-02f, -1.507303007e-02f, -2.953471452e-02f, -2.154482068e-02f, -1.985758136e-03f, +1.312467524e-02f, +1.523587610e-02f, +7.171415163e-03f, -2.299632938e-03f, -6.543972778e-03f, -4.958546050e-03f, -1.119620424e-03f, +1.430281096e-03f, +1.691672486e-03f, +7.575485786e-04f, -2.014647924e-05f, + -1.682492863e-05f, -3.255991088e-05f, -1.434647234e-05f, +5.049686428e-05f, +1.173728985e-04f, +9.901380912e-05f, -5.122048314e-05f, -2.529190916e-04f, -3.156103559e-04f, -9.411699013e-05f, +3.297664872e-04f, +6.304829761e-04f, +4.718199911e-04f, -1.631995593e-04f, -8.510532580e-04f, -9.985389804e-04f, -3.462803737e-04f, +7.209476360e-04f, +1.388413650e-03f, +1.048758245e-03f, -1.480047969e-04f, -1.333304376e-03f, -1.577203222e-03f, -6.475274993e-04f, +7.715049169e-04f, +1.607883660e-03f, +1.251028504e-03f, +1.973393099e-05f, -1.125870273e-03f, -1.363755593e-03f, -6.245342378e-04f, +4.357232295e-04f, +1.019137592e-03f, +8.012152726e-04f, +9.219536492e-05f, -5.101038438e-04f, -6.180377019e-04f, -2.890914543e-04f, +1.268813810e-04f, +3.207945823e-04f, +2.366577331e-04f, +3.261098626e-05f, -1.063742421e-04f, -1.133401148e-04f, -4.316398208e-05f, +1.818856848e-05f, +3.202390001e-05f, +1.482949967e-05f, + /* 4,15 (48) */ + -2.570383573e-04f, -6.512505742e-04f, -7.695388949e-04f, -1.314316329e-04f, +1.320221156e-03f, +2.826307365e-03f, +2.991756882e-03f, +6.999206543e-04f, -3.690139866e-03f, -7.798481197e-03f, -8.135451297e-03f, -2.394745863e-03f, +8.119205027e-03f, +1.779373699e-02f, +1.898692005e-02f, +6.759019932e-03f, -1.641040541e-02f, -3.913860051e-02f, -4.483988533e-02f, -1.968733711e-02f, +3.896742557e-02f, +1.185271180e-01f, +1.944495887e-01f, +2.400922898e-01f, +2.385260896e-01f, +1.903409290e-01f, +1.133709246e-01f, +3.448350742e-02f, -2.228845324e-02f, -4.528512831e-02f, -3.803955191e-02f, -1.481785208e-02f, +7.916136729e-03f, +1.928371449e-02f, +1.736060925e-02f, +7.410318264e-03f, -2.929893182e-03f, -8.282555331e-03f, -7.616259565e-03f, -3.390153565e-03f, +9.186317160e-04f, +3.046951145e-03f, +2.755848988e-03f, +1.215658755e-03f, -1.982394616e-04f, -7.803026232e-04f, -6.292548803e-04f, -2.340704111e-04f, + +1.156628587e-05f, +1.087619307e-05f, -5.762494102e-06f, -3.384208325e-05f, -5.235665165e-05f, -3.458924435e-05f, +2.885016553e-05f, +1.104915233e-04f, +1.499605271e-04f, +8.927769176e-05f, -7.666012020e-05f, -2.701514474e-04f, -3.542465450e-04f, -2.124310090e-04f, +1.552355348e-04f, +5.844006965e-04f, +7.965351371e-04f, +5.413700217e-04f, -2.380101219e-04f, -1.317649222e-03f, -2.252999191e-03f, -2.576854743e-03f, -2.039503840e-03f, -7.594343941e-04f, +8.067658006e-04f, +2.069155853e-03f, +2.579338719e-03f, +2.230918960e-03f, +1.283466916e-03f, +2.072328639e-04f, -5.576785734e-04f, -7.960181966e-04f, -5.727161007e-04f, -1.415589039e-04f, +2.206967259e-04f, +3.546402178e-04f, +2.649958715e-04f, +7.044391465e-05f, -9.294394045e-05f, -1.500257737e-04f, -1.082195383e-04f, -2.634409715e-05f, +3.586913284e-05f, +5.220574935e-05f, +3.296574548e-05f, +5.001234134e-06f, -1.111950086e-05f, -1.140166030e-05f, + +2.633478904e-05f, +8.542223788e-04f, +1.742498519e-03f, +1.293476148e-03f, -1.463837631e-03f, -5.270588954e-03f, -6.427666573e-03f, -1.573140758e-03f, +8.129203837e-03f, +1.558421773e-02f, +1.221652793e-02f, -3.853246757e-03f, -2.303787917e-02f, -2.918731795e-02f, -1.261848382e-02f, +1.896833652e-02f, +4.275140507e-02f, +3.738774859e-02f, +1.821632073e-03f, -4.026150834e-02f, -5.663462307e-02f, -3.207544947e-02f, +1.766178696e-02f, +5.632231750e-02f, +5.490215935e-02f, +1.447421771e-02f, -3.466167885e-02f, -5.680226930e-02f, -3.808501915e-02f, +4.575875497e-03f, +3.873396428e-02f, +4.196844481e-02f, +1.694897807e-02f, -1.427181479e-02f, -2.944251916e-02f, -2.205492453e-02f, -2.603795838e-03f, +1.283558378e-02f, +1.536275749e-02f, +7.492209745e-03f, -2.062975205e-03f, -6.511361792e-03f, -5.064920292e-03f, -1.232960539e-03f, +1.387117114e-03f, +1.709861055e-03f, +7.895724787e-04f, -5.316979569e-06f, + -1.615859866e-05f, -3.241446603e-05f, -1.567834766e-05f, +4.804301997e-05f, +1.161111654e-04f, +1.016076144e-04f, -4.494996720e-05f, -2.476285808e-04f, -3.176334114e-04f, -1.052682830e-04f, +3.163092155e-04f, +6.268010350e-04f, +4.850956842e-04f, -1.394377625e-04f, -8.349747314e-04f, -1.006246087e-03f, -3.765694119e-04f, +6.891813548e-04f, +1.381233184e-03f, +1.075389676e-03f, -1.052072550e-04f, -1.306831259e-03f, -1.588670087e-03f, -6.894107303e-04f, +7.307474127e-04f, +1.598899162e-03f, +1.279398121e-03f, +6.243897335e-05f, -1.101099518e-03f, -1.373010239e-03f, -6.570343398e-04f, +4.063908467e-04f, +1.013112354e-03f, +8.183562434e-04f, +1.157634420e-04f, -4.978589565e-04f, -6.226498844e-04f, -3.027466434e-04f, +1.161919659e-04f, +3.193606803e-04f, +2.422058659e-04f, +3.874525151e-05f, -1.040610471e-04f, -1.147659265e-04f, -4.559794561e-05f, +1.695911659e-05f, +3.223543411e-05f, +1.549316995e-05f, + /* 4,16 (48) */ + -2.454720714e-04f, -6.403743812e-04f, -7.753013890e-04f, -1.652737161e-04f, +1.267864505e-03f, +2.791718120e-03f, +3.020607048e-03f, +8.104121777e-04f, -3.540179339e-03f, -7.709203505e-03f, -8.212111417e-03f, -2.664897310e-03f, +7.764958482e-03f, +1.758130598e-02f, +1.914215558e-02f, +7.343420628e-03f, -1.561387028e-02f, -3.859723048e-02f, -4.507789545e-02f, -2.100498633e-02f, +3.671442638e-02f, +1.159502633e-01f, +1.924100849e-01f, +2.393328554e-01f, +2.393328554e-01f, +1.924100849e-01f, +1.159502633e-01f, +3.671442638e-02f, -2.100498633e-02f, -4.507789545e-02f, -3.859723048e-02f, -1.561387028e-02f, +7.343420628e-03f, +1.914215558e-02f, +1.758130598e-02f, +7.764958482e-03f, -2.664897310e-03f, -8.212111417e-03f, -7.709203505e-03f, -3.540179339e-03f, +8.104121777e-04f, +3.020607048e-03f, +2.791718120e-03f, +1.267864505e-03f, -1.652737161e-04f, -7.753013890e-04f, -6.403743812e-04f, -2.454720714e-04f, + +1.140166030e-05f, +1.111950086e-05f, -5.001234134e-06f, -3.296574548e-05f, -5.220574935e-05f, -3.586913284e-05f, +2.634409715e-05f, +1.082195383e-04f, +1.500257737e-04f, +9.294394045e-05f, -7.044391465e-05f, -2.649958715e-04f, -3.546402178e-04f, -2.206967259e-04f, +1.415589039e-04f, +5.727161007e-04f, +7.960181966e-04f, +5.576785734e-04f, -2.072328639e-04f, -1.283466916e-03f, -2.230918960e-03f, -2.579338719e-03f, -2.069155853e-03f, -8.067658006e-04f, +7.594343941e-04f, +2.039503840e-03f, +2.576854743e-03f, +2.252999191e-03f, +1.317649222e-03f, +2.380101219e-04f, -5.413700217e-04f, -7.965351371e-04f, -5.844006965e-04f, -1.552355348e-04f, +2.124310090e-04f, +3.542465450e-04f, +2.701514474e-04f, +7.666012020e-05f, -8.927769176e-05f, -1.499605271e-04f, -1.104915233e-04f, -2.885016553e-05f, +3.458924435e-05f, +5.235665165e-05f, +3.384208325e-05f, +5.762494102e-06f, -1.087619307e-05f, -1.156628587e-05f, + +1.017619038e-05f, +8.218079128e-04f, +1.726820172e-03f, +1.341519168e-03f, -1.347726465e-03f, -5.168981339e-03f, -6.472616540e-03f, -1.820769339e-03f, +7.811570426e-03f, +1.547894945e-02f, +1.253283714e-02f, -3.226445722e-03f, -2.255278348e-02f, -2.932675571e-02f, -1.345345855e-02f, +1.796209043e-02f, +4.237483565e-02f, +3.807692994e-02f, +3.202865258e-03f, -3.918611867e-02f, -5.673983033e-02f, -3.338228073e-02f, +1.607311687e-02f, +5.563290677e-02f, +5.563290677e-02f, +1.607311687e-02f, -3.338228073e-02f, -5.673983033e-02f, -3.918611867e-02f, +3.202865258e-03f, +3.807692994e-02f, +4.237483565e-02f, +1.796209043e-02f, -1.345345855e-02f, -2.932675571e-02f, -2.255278348e-02f, -3.226445722e-03f, +1.253283714e-02f, +1.547894945e-02f, +7.811570426e-03f, -1.820769339e-03f, -6.472616540e-03f, -5.168981339e-03f, -1.347726465e-03f, +1.341519168e-03f, +1.726820172e-03f, +8.218079128e-04f, +1.017619038e-05f, + -1.549316995e-05f, -3.223543411e-05f, -1.695911659e-05f, +4.559794561e-05f, +1.147659265e-04f, +1.040610471e-04f, -3.874525151e-05f, -2.422058659e-04f, -3.193606803e-04f, -1.161919659e-04f, +3.027466434e-04f, +6.226498844e-04f, +4.978589565e-04f, -1.157634420e-04f, -8.183562434e-04f, -1.013112354e-03f, -4.063908467e-04f, +6.570343398e-04f, +1.373010239e-03f, +1.101099518e-03f, -6.243897335e-05f, -1.279398121e-03f, -1.598899162e-03f, -7.307474127e-04f, +6.894107303e-04f, +1.588670087e-03f, +1.306831259e-03f, +1.052072550e-04f, -1.075389676e-03f, -1.381233184e-03f, -6.891813548e-04f, +3.765694119e-04f, +1.006246087e-03f, +8.349747314e-04f, +1.394377625e-04f, -4.850956842e-04f, -6.268010350e-04f, -3.163092155e-04f, +1.052682830e-04f, +3.176334114e-04f, +2.476285808e-04f, +4.494996720e-05f, -1.016076144e-04f, -1.161111654e-04f, -4.804301997e-05f, +1.567834766e-05f, +3.241446603e-05f, +1.615859866e-05f, + /* 4,17 (48) */ + -2.340704111e-04f, -6.292548803e-04f, -7.803026232e-04f, -1.982394616e-04f, +1.215658755e-03f, +2.755848988e-03f, +3.046951145e-03f, +9.186317160e-04f, -3.390153565e-03f, -7.616259565e-03f, -8.282555331e-03f, -2.929893182e-03f, +7.410318264e-03f, +1.736060925e-02f, +1.928371449e-02f, +7.916136729e-03f, -1.481785208e-02f, -3.803955191e-02f, -4.528512831e-02f, -2.228845324e-02f, +3.448350742e-02f, +1.133709246e-01f, +1.903409290e-01f, +2.385260896e-01f, +2.400922898e-01f, +1.944495887e-01f, +1.185271180e-01f, +3.896742557e-02f, -1.968733711e-02f, -4.483988533e-02f, -3.913860051e-02f, -1.641040541e-02f, +6.759019932e-03f, +1.898692005e-02f, +1.779373699e-02f, +8.119205027e-03f, -2.394745863e-03f, -8.135451297e-03f, -7.798481197e-03f, -3.690139866e-03f, +6.999206543e-04f, +2.991756882e-03f, +2.826307365e-03f, +1.320221156e-03f, -1.314316329e-04f, -7.695388949e-04f, -6.512505742e-04f, -2.570383573e-04f, + +1.122946931e-05f, +1.134628287e-05f, -4.253067716e-06f, -3.208156172e-05f, -5.201873851e-05f, -3.710098106e-05f, +2.386034291e-05f, +1.059085645e-04f, +1.499900605e-04f, +9.649903394e-05f, -6.426379482e-05f, -2.597366849e-04f, -3.548057515e-04f, -2.287249824e-04f, +1.279602412e-04f, +5.608269972e-04f, +7.950342203e-04f, +5.734483729e-04f, -1.767795924e-04f, -1.249161875e-03f, -2.208235610e-03f, -2.580952332e-03f, -2.098043378e-03f, -8.537881199e-04f, +7.118118828e-04f, +2.009096942e-03f, +2.573497662e-03f, +2.274463530e-03f, +1.351692992e-03f, +2.691001954e-04f, -5.245249488e-04f, -7.965791143e-04f, -5.958713593e-04f, -1.689826330e-04f, +2.039302110e-04f, +3.536222271e-04f, +2.751987605e-04f, +8.290874270e-05f, -8.550128532e-05f, -1.497929516e-04f, -1.127223349e-04f, -3.137707163e-05f, +3.326148050e-05f, +5.247068588e-05f, +3.470970428e-05f, +6.536449958e-06f, -1.061622408e-05f, -1.172299359e-05f, + -5.316979569e-06f, +7.895724787e-04f, +1.709861055e-03f, +1.387117114e-03f, -1.232960539e-03f, -5.064920292e-03f, -6.511361792e-03f, -2.062975205e-03f, +7.492209745e-03f, +1.536275749e-02f, +1.283558378e-02f, -2.603795838e-03f, -2.205492453e-02f, -2.944251916e-02f, -1.427181479e-02f, +1.694897807e-02f, +4.196844481e-02f, +3.873396428e-02f, +4.575875497e-03f, -3.808501915e-02f, -5.680226930e-02f, -3.466167885e-02f, +1.447421771e-02f, +5.490215935e-02f, +5.632231750e-02f, +1.766178696e-02f, -3.207544947e-02f, -5.663462307e-02f, -4.026150834e-02f, +1.821632073e-03f, +3.738774859e-02f, +4.275140507e-02f, +1.896833652e-02f, -1.261848382e-02f, -2.918731795e-02f, -2.303787917e-02f, -3.853246757e-03f, +1.221652793e-02f, +1.558421773e-02f, +8.129203837e-03f, -1.573140758e-03f, -6.427666573e-03f, -5.270588954e-03f, -1.463837631e-03f, +1.293476148e-03f, +1.742498519e-03f, +8.542223788e-04f, +2.633478904e-05f, + -1.482949967e-05f, -3.202390001e-05f, -1.818856848e-05f, +4.316398208e-05f, +1.133401148e-04f, +1.063742421e-04f, -3.261098626e-05f, -2.366577331e-04f, -3.207945823e-04f, -1.268813810e-04f, +2.890914543e-04f, +6.180377019e-04f, +5.101038438e-04f, -9.219536492e-05f, -8.012152726e-04f, -1.019137592e-03f, -4.357232295e-04f, +6.245342378e-04f, +1.363755593e-03f, +1.125870273e-03f, -1.973393099e-05f, -1.251028504e-03f, -1.607883660e-03f, -7.715049169e-04f, +6.475274993e-04f, +1.577203222e-03f, +1.333304376e-03f, +1.480047969e-04f, -1.048758245e-03f, -1.388413650e-03f, -7.209476360e-04f, +3.462803737e-04f, +9.985389804e-04f, +8.510532580e-04f, +1.631995593e-04f, -4.718199911e-04f, -6.304829761e-04f, -3.297664872e-04f, +9.411699013e-05f, +3.156103559e-04f, +2.529190916e-04f, +5.122048314e-05f, -9.901380912e-05f, -1.173728985e-04f, -5.049686428e-05f, +1.434647234e-05f, +3.255991088e-05f, +1.682492863e-05f, + /* 4,18 (48) */ + -2.228409418e-04f, -6.179085974e-04f, -7.845556909e-04f, -2.303210233e-04f, +1.163640017e-03f, +2.718748007e-03f, +3.070811488e-03f, +1.024540281e-03f, -3.240163505e-03f, -7.519760531e-03f, -8.346819126e-03f, -3.189629866e-03f, +7.055512513e-03f, +1.713188427e-02f, +1.941167473e-02f, +8.476963726e-03f, -1.402281786e-02f, -3.746610354e-02f, -4.546190791e-02f, -2.353761512e-02f, +3.227527181e-02f, +1.107899723e-01f, +1.882428856e-01f, +2.376723015e-01f, +2.408041017e-01f, +1.964586857e-01f, +1.211006157e-01f, +4.124188910e-02f, -1.833564411e-02f, -4.457078513e-02f, -3.966312545e-02f, -1.720698453e-02f, +6.163148572e-03f, +1.881793742e-02f, +1.799766720e-02f, +8.472827254e-03f, -2.119547102e-03f, -8.052542554e-03f, -7.883982483e-03f, -3.839932818e-03f, +5.871983194e-04f, +2.960379811e-03f, +2.859568845e-03f, +1.372691842e-03f, -9.672192862e-05f, -7.630024450e-04f, -6.618667983e-04f, -2.687613508e-04f, + +1.105006591e-05f, +1.155668711e-05f, -3.518374039e-06f, -3.119039424e-05f, -5.179639469e-05f, -3.828466290e-05f, +2.140034152e-05f, +1.035607843e-04f, +1.498548087e-04f, +9.994206275e-05f, -5.812336101e-05f, -2.543785525e-04f, -3.547457686e-04f, -2.365135726e-04f, +1.144469186e-04f, +5.487428281e-04f, +7.935893281e-04f, +5.886774826e-04f, -1.466612390e-04f, -1.214749860e-03f, -2.184962126e-03f, -2.581698707e-03f, -2.126157165e-03f, -9.004835180e-04f, +6.639163882e-04f, +1.977945120e-03f, +2.569265114e-03f, +2.295299430e-03f, +1.385582399e-03f, +3.004916782e-04f, -5.071458790e-04f, -7.961443986e-04f, -6.071186859e-04f, -1.827925721e-04f, +1.951968851e-04f, +3.527648773e-04f, +2.801331747e-04f, +8.918604661e-05f, -8.161580702e-05f, -1.495217318e-04f, -1.149097875e-04f, -3.392330190e-05f, +3.188604545e-05f, +5.254710946e-05f, +3.556773003e-05f, +7.322685613e-06f, -1.033947149e-05f, -1.187143190e-05f, + -2.014647924e-05f, +7.575485786e-04f, +1.691672486e-03f, +1.430281096e-03f, -1.119620424e-03f, -4.958546050e-03f, -6.543972778e-03f, -2.299632938e-03f, +7.171415163e-03f, +1.523587610e-02f, +1.312467524e-02f, -1.985758136e-03f, -2.154482068e-02f, -2.953471452e-02f, -1.507303007e-02f, +1.592984048e-02f, +4.153272158e-02f, +3.935849852e-02f, +5.939631090e-03f, -3.695914888e-02f, -5.682200323e-02f, -3.591270736e-02f, +1.286633405e-02f, +5.413065444e-02f, +5.696984499e-02f, +1.923899018e-02f, -3.074214510e-02f, -5.648661828e-02f, -4.131026659e-02f, +4.332184234e-04f, +3.666680095e-02f, +4.309768544e-02f, +1.996687550e-02f, -1.176743056e-02f, -2.902411839e-02f, -2.350969916e-02f, -4.483729733e-03f, +1.188676144e-02f, +1.567833472e-02f, +8.444814193e-03f, -1.320221666e-03f, -6.376446090e-03f, -5.369602763e-03f, -1.581210529e-03f, +1.242979284e-03f, +1.756844992e-03f, +8.867822897e-04f, +4.315971767e-05f, + -1.416842128e-05f, -3.178096262e-05f, -1.936655489e-05f, +4.074341266e-05f, +1.118366926e-04f, +1.085474701e-04f, -2.655168425e-05f, -2.309909909e-04f, -3.219377725e-04f, -1.373301571e-04f, +2.753562781e-04f, +6.129729854e-04f, +5.218248785e-04f, -6.875206024e-05f, -7.835696146e-04f, -1.024322317e-03f, -4.645456348e-04f, +5.917088586e-04f, +1.353480834e-03f, +1.149685270e-03f, +2.287402917e-05f, -1.221746674e-03f, -1.615617815e-03f, -8.116510977e-04f, +6.051308071e-04f, +1.564506376e-03f, +1.358794677e-03f, +1.907975127e-04f, -1.021223537e-03f, -1.394541677e-03f, -7.523057237e-04f, +3.155456883e-04f, +9.899919317e-04f, +8.665746790e-04f, +1.870298427e-04f, -4.580383367e-04f, -6.336878614e-04f, -3.431057333e-04f, +8.274502853e-05f, +3.132893352e-04f, +2.580706410e-04f, +5.755201443e-05f, -9.627963359e-05f, -1.185482258e-04f, -5.295708166e-05f, +1.296376440e-05f, +3.267069945e-05f, +1.749127965e-05f, + /* 4,19 (48) */ + -2.117908759e-04f, -6.063519103e-04f, -7.880740649e-04f, -2.615114176e-04f, +1.111843622e-03f, +2.680463344e-03f, +3.092211830e-03f, +1.128101065e-03f, -3.090308696e-03f, -7.419818468e-03f, -8.404942487e-03f, -3.444008419e-03f, +6.700766744e-03f, +1.689537070e-02f, +1.952612165e-02f, +9.025706554e-03f, -1.322922853e-02f, -3.687742605e-02f, -4.560856914e-02f, -2.475236498e-02f, +3.009030968e-02f, +1.082082735e-01f, +1.861167285e-01f, +2.367718179e-01f, +2.414680180e-01f, +1.984366308e-01f, +1.236698808e-01f, +4.353718853e-02f, -1.695006172e-02f, -4.427029345e-02f, -4.017027133e-02f, -1.800312893e-02f, +5.556029886e-03f, +1.863514484e-02f, +1.819286408e-02f, +8.825592131e-03f, -1.839413927e-03f, -7.963356507e-03f, -7.965598290e-03f, -3.989454550e-03f, +4.722885319e-04f, +2.926456509e-03f, +2.891454891e-03f, +1.425238952e-03f, -6.115419859e-05f, -7.556797593e-04f, -6.722062698e-04f, -2.806327827e-04f, + +1.086380328e-05f, +1.175087387e-05f, -2.797513799e-06f, -3.029309637e-05f, -5.153950867e-05f, -3.942009059e-05f, +1.896549344e-05f, +1.011783760e-04f, +1.496214900e-04f, +1.032722050e-04f, -5.202614347e-05f, -2.489261490e-04f, -3.544630052e-04f, -2.440604639e-04f, +1.010261762e-04f, +5.364730471e-04f, +7.916898281e-04f, +6.033642566e-04f, -1.168884923e-04f, -1.180246587e-03f, -2.161111704e-03f, -2.581581344e-03f, -2.153488329e-03f, -9.468343174e-04f, +6.157661632e-04f, +1.946058681e-03f, +2.564155124e-03f, +2.315494573e-03f, +1.419301593e-03f, +3.321729341e-04f, -4.892356315e-04f, -7.952254626e-04f, -6.181333013e-04f, -1.966576036e-04f, +1.862337587e-04f, +3.516722310e-04f, +2.849500731e-04f, +9.548823139e-05f, -7.762243142e-05f, -1.491456078e-04f, -1.170516966e-04f, -3.648730630e-05f, +3.046318302e-05f, +5.258519756e-05f, +3.641527474e-05f, +8.120766612e-06f, -1.004582615e-05f, -1.201125048e-05f, + -3.431490051e-05f, +7.257676160e-04f, +1.672305932e-03f, +1.471024509e-03f, -1.007783731e-03f, -4.849998580e-03f, -6.570524462e-03f, -2.530623929e-03f, +6.849477391e-03f, +1.509854595e-02f, +1.340003152e-02f, -1.372785150e-03f, -2.102299581e-02f, -2.960346658e-02f, -1.585659968e-02f, +1.490551817e-02f, +4.106817594e-02f, +3.995020738e-02f, +7.293111923e-03f, -3.580946361e-02f, -5.679912920e-02f, -3.713445403e-02f, +1.125071624e-02f, +5.331900334e-02f, +5.757497580e-02f, +2.080349656e-02f, -2.938335042e-02f, -5.629582076e-02f, -4.233149012e-02f, -9.613232535e-04f, +3.591449523e-02f, +4.341323113e-02f, +2.095686743e-02f, -1.090085588e-02f, -2.883708855e-02f, -2.396773750e-02f, -5.117417595e-03f, +1.154365571e-02f, +1.576107975e-02f, +8.758103528e-03f, -1.062151025e-03f, -6.318894076e-03f, -5.465882396e-03f, -1.699758755e-03f, +1.190022202e-03f, +1.769808756e-03f, +9.194529891e-04f, +6.065099732e-05f, + -1.351074403e-05f, -3.150773327e-05f, -2.049298849e-05f, +3.833846165e-05f, +1.102586480e-04f, +1.105811345e-04f, -2.057171849e-05f, -2.252124631e-04f, -3.227931365e-04f, -1.475322116e-04f, +2.615536806e-04f, +6.074645433e-04f, +5.330170897e-04f, -4.545180504e-05f, -7.654373648e-04f, -1.028667743e-03f, -4.928376748e-04f, +5.585861505e-04f, +1.342198342e-03f, +1.172528677e-03f, +6.535122827e-05f, -1.191577599e-03f, -1.622096891e-03f, -8.511543217e-04f, +5.622541709e-04f, +1.550588370e-03f, +1.383280130e-03f, +2.335512367e-04f, -9.928046655e-04f, -1.399608137e-03f, -7.832283699e-04f, +2.843878024e-04f, +9.806065503e-04f, +8.815222021e-04f, +2.109094147e-04f, -4.437576740e-04f, -6.364081860e-04f, -3.563141973e-04f, +7.115961947e-05f, +3.106684165e-04f, +2.630765080e-04f, +6.393964423e-05f, -9.340523006e-05f, -1.196342840e-04f, -5.542122079e-05f, +1.153056169e-05f, +3.274577985e-05f, +1.815674907e-05f, + /* 4,20 (48) */ + -2.009270726e-04f, -5.946010365e-04f, -7.908715787e-04f, -2.918045140e-04f, +1.060304113e-03f, +2.641043253e-03f, +3.111177323e-03f, +1.229279441e-03f, -2.940687206e-03f, -7.316546263e-03f, -8.456968631e-03f, -3.692934568e-03f, +6.346303739e-03f, +1.665131023e-02f, +1.962714782e-02f, +9.562179601e-03f, -1.243753870e-02f, -3.627406180e-02f, -4.572545764e-02f, -2.593261157e-02f, +2.792919798e-02f, +1.056266922e-01f, +1.839632402e-01f, +2.358249836e-01f, +2.420837842e-01f, +2.003826895e-01f, +1.262340359e-01f, +4.585268310e-02f, -1.553076012e-02f, -4.393812052e-02f, -4.065950696e-02f, -1.879835439e-02f, +4.937896585e-03f, +1.843848724e-02f, +1.837909784e-02f, +9.177264362e-03f, -1.554463854e-03f, -7.867868276e-03f, -8.043220721e-03f, -4.138600157e-03f, +3.552368352e-04f, +2.889969203e-03f, +2.921918074e-03f, +1.477824149e-03f, -2.473892386e-05f, -7.475589927e-04f, -6.822520959e-04f, -2.926440332e-04f, + +1.067103444e-05f, +1.192901538e-05f, -2.090829182e-06f, -2.939051183e-05f, -5.124888558e-05f, -4.050721427e-05f, +1.655716031e-05f, +9.876351284e-05f, +1.492916248e-04f, +1.064887260e-04f, -4.597560078e-05f, -2.433841554e-04f, -3.539603077e-04f, -2.513637965e-04f, +8.770511911e-05f, +5.240271131e-04f, +7.893422111e-04f, +6.175073398e-04f, -8.747179280e-05f, -1.145667720e-03f, -2.136697738e-03f, -2.580604122e-03f, -2.180028346e-03f, -9.928230059e-04f, +5.673795826e-04f, +1.913448276e-03f, +2.558166103e-03f, +2.335036878e-03f, +1.452834710e-03f, +3.641321009e-04f, -4.707973205e-04f, -7.938169860e-04f, -6.289058638e-04f, -2.105698600e-04f, +1.770437336e-04f, +3.503421484e-04f, +2.896448614e-04f, +1.018114333e-04f, -7.352242204e-05f, -1.486633763e-04f, -1.191458798e-04f, -3.906749896e-05f, +2.899317705e-05f, +5.258424396e-05f, +3.725144604e-05f, +8.930240209e-06f, -9.735192555e-06f, -1.214210066e-05f, + -4.782564454e-05f, +6.942598828e-04f, +1.651812943e-03f, +1.509362970e-03f, -8.975250834e-04f, -4.739417445e-03f, -6.591096181e-03f, -2.755836392e-03f, +6.526684254e-03f, +1.495101374e-02f, +1.366158520e-02f, -7.653206070e-04f, -2.048997872e-02f, -2.964891839e-02f, -1.662203705e-02f, +1.387685042e-02f, +4.057533827e-02f, +4.050879353e-02f, +8.635310265e-03f, -3.463693493e-02f, -5.673377797e-02f, -3.832603163e-02f, +9.628619345e-03f, +5.246784902e-02f, +5.813722997e-02f, +2.235408493e-02f, -2.800007029e-02f, -5.606226953e-02f, -4.332429479e-02f, -2.360931390e-03f, +3.513126686e-02f, +4.369761893e-02f, +2.193747398e-02f, -1.001933368e-02f, -2.862617914e-02f, -2.441149517e-02f, -5.753825781e-03f, +1.118734151e-02f, +1.583223937e-02f, +9.068771944e-03f, -7.990745172e-04f, -6.254954431e-03f, -5.559287626e-03f, -1.819393039e-03f, +1.134600982e-03f, +1.781339318e-03f, +9.521987690e-04f, +7.880774639e-05f, + -1.285725242e-05f, -3.120533410e-05f, -2.156784201e-05f, +3.595129296e-05f, +1.086089913e-04f, +1.124757694e-04f, -1.467531985e-05f, -2.193289824e-04f, -3.233637847e-04f, -1.574817538e-04f, +2.476961529e-04f, +6.015214833e-04f, +5.436760041e-04f, -2.231261017e-05f, -7.468369003e-04f, -1.032175779e-03f, -5.205795147e-04f, +5.251941758e-04f, +1.329921279e-03f, +1.194385510e-03f, +1.076641795e-04f, -1.160546927e-03f, -1.627317182e-03f, -8.899834931e-04f, +5.189315099e-04f, +1.535459032e-03f, +1.406739489e-03f, +2.762317526e-04f, -9.635215340e-04f, -1.403604744e-03f, -8.136885621e-04f, +2.528296377e-04f, +9.703851603e-04f, +8.958794037e-04f, +2.348188846e-04f, -4.289854480e-04f, -6.386367957e-04f, -3.693791032e-04f, +5.936826082e-05f, +3.077459176e-04f, +2.679300144e-04f, +7.037832680e-05f, -9.039088257e-05f, -1.206282501e-04f, -5.788677766e-05f, +1.004726703e-05f, +3.278411916e-05f, +1.882041246e-05f, + /* 4,21 (48) */ + -1.902560381e-04f, -5.826720211e-04f, -7.929624079e-04f, -3.211950258e-04f, +1.009055228e-03f, +2.600536039e-03f, +3.127734483e-03f, +1.328042954e-03f, -2.791395581e-03f, -7.210057537e-03f, -8.502944231e-03f, -3.936318723e-03f, +5.992343431e-03f, +1.639994644e-02f, +1.971485294e-02f, +1.008620671e-02f, -1.164819649e-02f, -3.565655446e-02f, -4.581292943e-02f, -2.707827929e-02f, +2.579250024e-02f, +1.030460881e-01f, +1.817832118e-01f, +2.348321606e-01f, +2.426511638e-01f, +2.022961377e-01f, +1.287922020e-01f, +4.818771998e-02f, -1.407792541e-02f, -4.357398842e-02f, -4.113030429e-02f, -1.959217137e-02f, +4.308990721e-03f, +1.822791738e-02f, +1.855614158e-02f, +9.527606511e-03f, -1.264818993e-03f, -7.766056842e-03f, -8.116743143e-03f, -4.287263534e-03f, +2.360909554e-04f, +2.850901704e-03f, +2.950911251e-03f, +1.530408393e-03f, +1.251252218e-05f, -7.386287525e-04f, -6.919872885e-04f, -3.047861339e-04f, + +1.047211195e-05f, +1.209129542e-05f, -1.398643874e-06f, -2.848347424e-05f, -5.092534407e-05f, -4.154602144e-05f, +1.417666452e-05f, +9.631836077e-05f, +1.488667806e-04f, +1.095909776e-04f, -3.997511835e-05f, -2.377572560e-04f, -3.532406304e-04f, -2.584218823e-04f, +7.449071459e-05f, +5.114144858e-04f, +7.865531458e-04f, +6.311056663e-04f, -5.842132989e-05f, -1.111028863e-03f, -2.111733820e-03f, -2.578771288e-03f, -2.205769064e-03f, -1.038432244e-03f, +5.187751349e-04f, +1.880124898e-03f, +2.551296854e-03f, +2.353914507e-03f, +1.486165880e-03f, +3.963570956e-04f, -4.518343557e-04f, -7.919138599e-04f, -6.394270710e-04f, -2.245213585e-04f, +1.676298856e-04f, +3.487726173e-04f, +2.942129712e-04f, +1.081517273e-04f, -6.931713154e-05f, -1.480738929e-04f, -1.211901590e-04f, -4.166225889e-05f, +2.747635175e-05f, +5.254356191e-05f, +3.807534563e-05f, +9.750635465e-06f, -9.407489159e-06f, -1.226363572e-05f, + -6.068289696e-05f, +6.630545487e-04f, +1.630245101e-03f, +1.545314263e-03f, -7.889160921e-04f, -4.626941676e-03f, -6.605771501e-03f, -2.975165374e-03f, +6.203320469e-03f, +1.479353198e-02f, +1.390928135e-02f, -1.637991238e-04f, -1.994630271e-02f, -2.967123100e-02f, -1.736887395e-02f, +1.284467464e-02f, +4.005475875e-02f, +4.103398771e-02f, +9.965231544e-03f, -3.344254942e-02f, -5.662611379e-02f, -3.948657856e-02f, +8.001302163e-03f, +5.157786552e-02f, +5.865616148e-02f, +2.388954396e-02f, -2.659333080e-02f, -5.578603777e-02f, -4.428781632e-02f, -3.764536134e-03f, +3.431757830e-02f, +4.395044857e-02f, +2.290785914e-02f, -9.123454277e-03f, -2.839136025e-02f, -2.484048062e-02f, -6.392462576e-03f, +1.081796240e-02f, +1.589160763e-02f, +9.376517862e-03f, -5.311445028e-04f, -6.184576105e-03f, -5.649678509e-03f, -1.940021289e-03f, +1.076714204e-03f, +1.791386585e-03f, +9.849828881e-04f, +9.762815885e-05f, + -1.220870577e-05f, -3.087489644e-05f, -2.259114707e-05f, +3.358400885e-05f, +1.068907517e-04f, +1.142320367e-04f, -8.866574981e-06f, -2.133473835e-04f, -3.236530469e-04f, -1.671732861e-04f, +2.337961005e-04f, +5.951532014e-04f, +5.537976452e-04f, +6.477933725e-07f, -7.277868621e-04f, -1.034849023e-03f, -5.477518863e-04f, +4.915610870e-04f, +1.316663576e-03f, +1.215241647e-03f, +1.497796158e-04f, -1.128680965e-03f, -1.631276012e-03f, -9.281080801e-04f, +4.751971168e-04f, +1.519129192e-03f, +1.429152316e-03f, +3.188048226e-04f, -9.333948178e-04f, -1.406524065e-03f, -8.436595480e-04f, +2.208945727e-04f, +9.593308029e-04f, +9.096302455e-04f, +2.587386849e-04f, -4.137295927e-04f, -6.403668975e-04f, -3.822876665e-04f, +4.737872311e-05f, +3.045204117e-04f, +2.726245321e-04f, +7.686289059e-05f, -8.723701883e-05f, -1.215273449e-04f, -6.035119738e-05f, +8.514348974e-06f, +3.278470509e-05f, +1.948132439e-05f, + /* 4,22 (48) */ + -1.797839262e-04f, -5.705807257e-04f, -7.943610518e-04f, -3.496785000e-04f, +9.581298838e-04f, +2.558990017e-03f, +3.141911148e-03f, +1.424361314e-03f, -2.642528801e-03f, -7.100466560e-03f, -8.542919350e-03f, -4.174075979e-03f, +5.639102801e-03f, +1.614152455e-02f, +1.978934366e-02f, +1.059762120e-02f, -1.086164335e-02f, -3.502544879e-02f, -4.587135076e-02f, -2.818930815e-02f, +2.368076642e-02f, +1.004673168e-01f, +1.795774427e-01f, +2.337937284e-01f, +2.431699389e-01f, +2.041762626e-01f, +1.313434989e-01f, +5.054163449e-02f, -1.259175953e-02f, -4.317763132e-02f, -4.158213864e-02f, -2.038408523e-02f, +3.669563650e-03f, +1.800339602e-02f, +1.872377146e-02f, +9.876379128e-03f, -9.706060217e-04f, -7.657905115e-03f, -8.186060275e-03f, -4.435337427e-03f, +1.149007964e-04f, +2.809239445e-03f, +2.978387603e-03f, +1.582951955e-03f, +5.058786781e-05f, -7.288781171e-04f, -7.013947777e-04f, -3.170497696e-04f, + +1.026738752e-05f, +1.223790898e-05f, -7.212630777e-07f, -2.757280659e-05f, -5.056971542e-05f, -4.253653645e-05f, +1.182528874e-05f, +9.384507757e-05f, +1.483485705e-04f, +1.125783976e-04f, -3.402800705e-05f, -2.320501354e-04f, -3.523070318e-04f, -2.652332049e-04f, +6.138978928e-05f, +4.986446197e-04f, +7.833294736e-04f, +6.441584584e-04f, -2.974703766e-05f, -1.076345550e-03f, -2.086233724e-03f, -2.576087462e-03f, -2.230702699e-03f, -1.083644875e-03f, +4.699714128e-04f, +1.846099875e-03f, +2.543546566e-03f, +2.372115874e-03f, +1.519279236e-03f, +4.288356190e-04f, -4.323504425e-04f, -7.895111918e-04f, -6.496876654e-04f, -2.385040047e-04f, +1.579954647e-04f, +3.469617557e-04f, +2.986498630e-04f, +1.145051290e-04f, -6.500800187e-05f, -1.473760729e-04f, -1.231823616e-04f, -4.426993069e-05f, +2.591307205e-05f, +5.246248495e-05f, +3.888606991e-05f, +1.058146335e-05f, -9.062648661e-06f, -1.237551130e-05f, + -7.289160273e-05f, +6.321796522e-04f, +1.607653954e-03f, +1.578898272e-03f, -6.820253404e-04f, -4.512709639e-03f, -6.614638076e-03f, -3.188512758e-03f, +5.879667422e-03f, +1.462635870e-02f, +1.414307745e-02f, +4.313540776e-04f, -1.939250507e-02f, -2.967058320e-02f, -1.809666081e-02f, +1.180982562e-02f, +3.950700687e-02f, +4.152554879e-02f, +1.128189512e-02f, -3.222730777e-02f, -5.647633418e-02f, -4.061525952e-02f, +6.370026151e-03f, +5.064975744e-02f, +5.913135860e-02f, +2.540867315e-02f, -2.516417848e-02f, -5.546723295e-02f, -4.522121114e-02f, -5.171060199e-03f, +3.347391875e-02f, +4.417134314e-02f, +2.386718994e-02f, -8.213824032e-03f, -2.813262157e-02f, -2.525421021e-02f, -7.032829474e-03f, +1.043567474e-02f, +1.593898636e-02f, +9.681038274e-03f, -2.585199707e-04f, -6.107713214e-03f, -5.736915528e-03f, -2.061548634e-03f, +1.016363007e-03f, +1.799900934e-03f, +1.017767593e-03f, +1.171094832e-04f, + -1.156583771e-05f, -3.051755931e-05f, -2.356299303e-05f, +3.123864879e-05f, +1.051069733e-04f, +1.158507237e-04f, -3.149424362e-06f, -2.072744965e-04f, -3.236644660e-04f, -1.766016064e-04f, +2.198658333e-04f, +5.883693712e-04f, +5.633785327e-04f, +2.341196786e-05f, -7.083061374e-04f, -1.036690754e-03f, -5.743361015e-04f, +4.577151014e-04f, +1.302439913e-03f, +1.235083830e-03f, +1.916645172e-04f, -1.096006654e-03f, -1.633971743e-03f, -9.654981397e-04f, +4.310856293e-04f, +1.501610669e-03f, +1.450498990e-03f, +3.612362155e-04f, -9.024459511e-04f, -1.408359528e-03f, -8.731148588e-04f, +1.886064256e-04f, +9.474472378e-04f, +9.227590917e-04f, +2.826490864e-04f, -3.979985283e-04f, -6.415920685e-04f, -3.950271064e-04f, +3.519904534e-05f, +3.009907318e-04f, +2.771534900e-04f, +8.338804160e-05f, -8.394421207e-05f, -1.223288367e-04f, -6.281187603e-05f, +6.932342584e-06f, +3.274654767e-05f, +2.013851916e-05f, + /* 4,23 (48) */ + -1.695165387e-04f, -5.583428167e-04f, -7.950823148e-04f, -3.772513066e-04f, +9.075601684e-04f, +2.516453481e-03f, +3.153736437e-03f, +1.518206392e-03f, -2.494180230e-03f, -6.987888162e-03f, -8.576947357e-03f, -4.406126115e-03f, +5.286795769e-03f, +1.587629135e-02f, +1.985073345e-02f, +1.109626582e-02f, -1.007831387e-02f, -3.438129033e-02f, -4.590109780e-02f, -2.926565370e-02f, +2.159453270e-02f, +9.789122933e-02f, +1.773467400e-01f, +2.327100835e-01f, +2.436399103e-01f, +2.060223625e-01f, +1.338870455e-01f, +5.291375036e-02f, -1.107248030e-02f, -4.274879570e-02f, -4.201448908e-02f, -2.117359643e-02f, +3.019875985e-03f, +1.776489202e-02f, +1.888176693e-02f, +1.022334088e-02f, -6.719561588e-04f, -7.543399986e-03f, -8.251068276e-03f, -4.582713499e-03f, -8.281565258e-06f, +2.764969514e-03f, +3.004300675e-03f, +1.635414440e-03f, +8.947393773e-05f, -7.182966537e-04f, -7.104574263e-04f, -3.294252809e-04f, + +1.005721173e-05f, +1.236906188e-05f, -5.897355422e-08f, -2.665932067e-05f, -5.018284270e-05f, -4.347881995e-05f, +9.504275476e-06f, +9.134581111e-05f, +1.477386512e-04f, +1.154505091e-04f, -2.813750178e-05f, -2.262674753e-04f, -3.511626720e-04f, -2.717964180e-04f, +4.840902647e-05f, +4.857269586e-04f, +7.796782035e-04f, +6.566652244e-04f, -1.458591480e-06f, -1.041633242e-03f, -2.060211405e-03f, -2.572557625e-03f, -2.254821845e-03f, -1.128443930e-03f, +4.209871051e-04f, +1.811384863e-03f, +2.534914823e-03f, +2.389629649e-03f, +1.552158922e-03f, +4.615551614e-04f, -4.123495821e-04f, -7.866043095e-04f, -6.596784399e-04f, -2.525095963e-04f, +1.481438948e-04f, +3.449078145e-04f, +3.029510298e-04f, +1.208675967e-04f, -6.059656432e-05f, -1.465688934e-04f, -1.251203224e-04f, -4.688882536e-05f, +2.430374389e-05f, +5.234036778e-05f, +3.968271065e-05f, +1.142221689e-05f, -8.700618332e-06f, -1.247738578e-05f, + -8.445744044e-05f, +6.016620929e-04f, +1.584090961e-03f, +1.610136921e-03f, -5.769183672e-04f, -4.396858915e-03f, -6.617787500e-03f, -3.395787254e-03f, +5.556002956e-03f, +1.444975709e-02f, +1.436294328e-02f, +1.019723449e-03f, -1.882912653e-02f, -2.964717124e-02f, -1.880496695e-02f, +1.077313487e-02f, +3.893267077e-02f, +4.198326390e-02f, +1.258433503e-02f, -3.099222394e-02f, -5.628466966e-02f, -4.171126617e-02f, +4.736054408e-03f, +4.968425930e-02f, +5.956244423e-02f, +2.691028382e-02f, -2.371367949e-02f, -5.510599674e-02f, -4.612365709e-02f, -6.579419727e-03f, +3.260080389e-02f, +4.435994957e-02f, +2.481463718e-02f, -7.291064940e-03f, -2.784997248e-02f, -2.565220874e-02f, -7.674421542e-03f, +1.004064763e-02f, +1.597418540e-02f, +9.982029006e-03f, +1.863351932e-05f, -6.024325172e-03f, -5.820859740e-03f, -2.183877471e-03f, +9.535511306e-04f, +1.806833276e-03f, +1.050514141e-03f, +1.372480024e-04f, + -1.092935588e-05f, -3.013446780e-05f, -2.448352570e-05f, +2.891718833e-05f, +1.032607123e-04f, +1.173327403e-04f, +2.472339476e-06f, -2.011171405e-04f, -3.234017925e-04f, -1.857618093e-04f, +2.059175552e-04f, +5.811799325e-04f, +5.724156817e-04f, +4.596278178e-05f, -6.884138412e-04f, -1.037704928e-03f, -6.003140652e-04f, +4.236844779e-04f, +1.287265709e-03f, +1.253899682e-03f, +2.332861382e-04f, -1.062551544e-03f, -1.635403767e-03f, -1.002124343e-03f, +3.866320012e-04f, +1.482916267e-03f, +1.470760737e-03f, +4.034917365e-04f, -8.706971109e-04f, -1.409105432e-03f, -9.020283335e-04f, +1.559894358e-04f, +9.347389443e-04f, +9.352507246e-04f, +3.065302152e-04f, -3.818011580e-04f, -6.423062653e-04f, -4.075846569e-04f, +2.283753055e-05f, +2.971559747e-04f, +2.815103813e-04f, +8.994836685e-05f, -8.051318266e-05f, -1.230300454e-04f, -6.526616266e-05f, +5.301850104e-06f, +3.266868091e-05f, +2.079101159e-05f, + /* 4,24 (48) */ + -1.594593269e-04f, -5.459737548e-04f, -7.951412884e-04f, -4.039106273e-04f, +8.573773257e-04f, +2.472974661e-03f, +3.163240712e-03f, +1.609552203e-03f, -2.346441579e-03f, -6.872437653e-03f, -8.605084859e-03f, -4.632393590e-03f, +4.935633097e-03f, +1.560449493e-02f, +1.989914247e-02f, +1.158199278e-02f, -9.298635668e-03f, -3.372462511e-02f, -4.590255639e-02f, -3.030728694e-02f, +1.953432129e-02f, +9.531867170e-02f, +1.750919182e-01f, +2.315816396e-01f, +2.440608974e-01f, +2.078337474e-01f, +1.364219603e-01f, +5.530338001e-02f, -9.520321375e-03f, -4.228724054e-02f, -4.242683867e-02f, -2.196020074e-02f, +2.360197545e-03f, +1.751238242e-02f, +1.902991082e-02f, +1.056824870e-02f, -3.690051289e-04f, -7.422532389e-03f, -8.311664841e-03f, -4.729282393e-03f, -1.334018877e-04f, +2.718080689e-03f, +3.028604419e-03f, +1.687754808e-03f, +1.291566484e-04f, -7.068744368e-04f, -7.191580447e-04f, -3.419026667e-04f, + +9.841933680e-06f, +1.248497041e-05f, +5.879563279e-07f, -2.574381665e-05f, -4.976557993e-05f, -4.437296836e-05f, +7.214826744e-06f, +8.882269798e-05f, +1.470387212e-04f, +1.182069200e-04f, -2.230676018e-05f, -2.204139514e-04f, -3.498108096e-04f, -2.781103449e-04f, +3.555496353e-05f, +4.726709308e-04f, +7.756065067e-04f, +6.686257571e-04f, +2.643459550e-05f, -1.006907315e-03f, -2.033680987e-03f, -2.568187124e-03f, -2.278119471e-03f, -1.172812640e-03f, +3.718409871e-04f, +1.775991847e-03f, +2.525401601e-03f, +2.406444767e-03f, +1.584789098e-03f, +4.945030070e-04f, -3.918360714e-04f, -7.831887655e-04f, -6.693902437e-04f, -2.665298267e-04f, +1.380787733e-04f, +3.426091801e-04f, +3.071120005e-04f, +1.272350333e-04f, -5.608443952e-05f, -1.456513944e-04f, -1.270018852e-04f, -4.951722105e-05f, +2.264881449e-05f, +5.217658705e-05f, +4.046435566e-05f, +1.227237129e-05f, -8.321360299e-06f, -1.256892063e-05f, + -9.538679632e-05f, +5.715276251e-04f, +1.559607435e-03f, +1.639054109e-03f, -4.736576549e-04f, -4.279526175e-03f, -6.615315161e-03f, -3.596904395e-03f, +5.232601164e-03f, +1.426399528e-02f, +1.456886084e-02f, +1.600903381e-03f, -1.825671085e-02f, -2.960120845e-02f, -1.949338079e-02f, +9.735429939e-03f, +3.833235670e-02f, +4.240694837e-02f, +1.387160074e-02f, -2.973832426e-02f, -5.605138352e-02f, -4.277381772e-02f, +3.100650641e-03f, +4.868213496e-02f, +5.994907623e-02f, +2.839320009e-02f, -2.224291876e-02f, -5.470250500e-02f, -4.699435420e-02f, -7.988525159e-03f, +3.169877556e-02f, +4.451593900e-02f, +2.574937612e-02f, -6.355814215e-03f, -2.754344226e-02f, -2.603400990e-02f, -8.316727808e-03f, +9.633062975e-03f, +1.599702293e-02f, +1.027918498e-02f, +3.001439006e-04f, -5.934376806e-03f, -5.901372922e-03f, -2.306907516e-03f, +8.882849680e-04f, +1.812135126e-03f, +1.083182822e-03f, +1.580390140e-04f, + -1.029994154e-05f, -2.972677158e-05f, -2.535294614e-05f, +2.662153812e-05f, +1.013550330e-04f, +1.186791159e-04f, +7.995073534e-06f, -1.948821172e-04f, -3.228689785e-04f, -1.946492873e-04f, +1.919633541e-04f, +5.735950795e-04f, +5.809066006e-04f, +6.828342250e-05f, -6.681292984e-04f, -1.037896166e-03f, -6.256682876e-04f, +3.894974920e-04f, +1.271157102e-03f, +1.271677709e-03f, +2.746120345e-04f, -1.028343774e-03f, -1.635572511e-03f, -1.037957999e-03f, +3.418714729e-04f, +1.463059761e-03f, +1.489919637e-03f, +4.455372552e-04f, -8.381711999e-04f, -1.408756955e-03f, -9.303741423e-04f, +1.230682455e-04f, +9.212111215e-04f, +9.470903609e-04f, +3.303620685e-04f, -3.651468636e-04f, -6.425038326e-04f, -4.199475789e-04f, +1.030274097e-05f, +2.930155053e-04f, +2.856887703e-04f, +9.653833807e-05f, -7.694479968e-05f, -1.236283455e-04f, -6.771136134e-05f, +3.623541571e-06f, +3.255016448e-05f, +2.143779791e-05f, + /* 4,25 (48) */ + -1.496173933e-04f, -5.334887844e-04f, -7.945533321e-04f, -4.296544439e-04f, +8.076117457e-04f, +2.428601693e-03f, +3.170455539e-03f, +1.698374901e-03f, -2.199402858e-03f, -6.754230733e-03f, -8.627391619e-03f, -4.852807542e-03f, +4.585822287e-03f, +1.532638459e-02f, +1.993469744e-02f, +1.205466371e-02f, -8.523029162e-03f, -3.305599935e-02f, -4.587612179e-02f, -3.131419426e-02f, +1.750064030e-02f, +9.275048458e-02f, +1.728137987e-01f, +2.304088269e-01f, +2.444327384e-01f, +2.096097392e-01f, +1.389473619e-01f, +5.770982478e-02f, -7.935532277e-03f, -4.179273754e-02f, -4.281867474e-02f, -2.274338950e-02f, +1.690807301e-03f, +1.724585259e-02f, +1.916798959e-02f, +1.091085788e-02f, -6.189312840e-05f, -7.295297356e-03f, -8.367749280e-03f, -4.874933787e-03f, -2.604037729e-04f, +2.668563468e-03f, +3.051253233e-03f, +1.739931395e-03f, +1.696210040e-04f, -6.946020655e-04f, -7.274794050e-04f, -3.544715873e-04f, + +9.621900691e-06f, +1.258586094e-05f, +1.219276524e-06f, -2.482708254e-05f, -4.931879124e-05f, -4.521911322e-05f, +4.958103691e-06f, +8.627786209e-05f, +1.462505197e-04f, +1.208473221e-04f, -1.653886144e-05f, -2.144942307e-04f, -3.482547981e-04f, -2.841739777e-04f, +2.283398945e-05f, +4.594859434e-04f, +7.711217117e-04f, +6.800401319e-04f, +5.392337557e-05f, -9.721830556e-04f, -2.006656758e-03f, -2.562981663e-03f, -2.300588926e-03f, -1.216734440e-03f, +3.225519117e-04f, +1.739933127e-03f, +2.515007272e-03f, +2.422550433e-03f, +1.617153954e-03f, +5.276662400e-04f, -3.708145029e-04f, -7.792603414e-04f, -6.788139878e-04f, -2.805562892e-04f, +1.278038710e-04f, +3.400643764e-04f, +3.111283429e-04f, +1.336032886e-04f, -5.147333744e-05f, -1.446226806e-04f, -1.288249044e-04f, -5.215336394e-05f, +2.094877260e-05f, +5.197054220e-05f, +4.123008952e-05f, +1.313138411e-05f, -7.924851840e-06f, -1.264978081e-05f, + -1.056867379e-04f, +5.418008535e-04f, +1.534254489e-03f, +1.665675647e-03f, -3.723026219e-04f, -4.160847059e-03f, -6.607320087e-03f, -3.791786512e-03f, +4.909732185e-03f, +1.406934599e-02f, +1.476082419e-02f, +2.174498461e-03f, -1.767580425e-02f, -2.953292503e-02f, -2.016151009e-02f, +8.697533773e-03f, +3.770668841e-02f, +4.279644587e-02f, +1.514275784e-02f, -2.846664655e-02f, -5.577677149e-02f, -4.380216149e-02f, +1.465078130e-03f, +4.764417696e-02f, +6.029094770e-02f, +2.985625985e-02f, -2.075299912e-02f, -5.425696774e-02f, -4.783252540e-02f, -9.397282114e-03f, +3.076840142e-02f, +4.463900725e-02f, +2.667058725e-02f, -5.408723854e-03f, -2.721308020e-02f, -2.639915676e-02f, -8.959231640e-03f, +9.213115396e-03f, +1.600732567e-02f, +1.057220049e-02f, +5.858326709e-04f, -5.837838467e-03f, -5.978317722e-03f, -2.430535862e-03f, +8.205736066e-04f, +1.815758668e-03f, +1.115732986e-03f, +1.794768119e-04f, + -9.678249260e-06f, -2.929562340e-05f, -2.617150928e-05f, +2.435354300e-05f, +9.939300496e-05f, +1.198909969e-04f, +1.341528578e-05f, -1.885762046e-04f, -3.220701710e-04f, -2.032597318e-04f, +1.780151924e-04f, +5.656252499e-04f, +5.888492894e-04f, +9.035740848e-05f, -6.474720252e-04f, -1.037269751e-03f, -6.503818960e-04f, +3.551824120e-04f, +1.254130937e-03f, +1.288407306e-03f, +3.156100896e-04f, -9.934120415e-04f, -1.634479434e-03f, -1.072971079e-03f, +2.968395419e-04f, +1.442055892e-03f, +1.507958646e-03f, +4.873387349e-04f, -8.048918298e-04f, -1.407310159e-03f, -9.581268104e-04f, +8.986788047e-05f, +9.068696886e-04f, +9.582636675e-04f, +3.541245312e-04f, -3.480455019e-04f, -6.421795125e-04f, -4.321031721e-04f, -2.396506984e-06f, +2.885689603e-04f, +2.896822997e-04f, +1.031523155e-04f, -7.324008229e-05f, -1.241211704e-04f, -7.014473331e-05f, +1.898155368e-06f, +3.239008541e-05f, +2.207785664e-05f, + /* 4,26 (48) */ + -1.399954926e-04f, -5.209029234e-04f, -7.933340555e-04f, -4.544815265e-04f, +7.582929545e-04f, +2.383382579e-03f, +3.175413642e-03f, +1.784652763e-03f, -2.053152338e-03f, -6.633383411e-03f, -8.643930480e-03f, -5.067301772e-03f, +4.237567489e-03f, +1.504221061e-02f, +1.995753143e-02f, +1.251414965e-02f, -7.751907450e-03f, -3.237595922e-02f, -4.582219842e-02f, -3.228637731e-02f, +1.549398355e-02f, +9.018750292e-02f, +1.705132098e-01f, +2.291920925e-01f, +2.447552903e-01f, +2.113496723e-01f, +1.414623692e-01f, +6.013237521e-02f, -6.318378323e-03f, -4.126507130e-02f, -4.318948924e-02f, -2.352264984e-02f, +1.011993314e-03f, +1.696529630e-02f, +1.929579347e-02f, +1.125092225e-02f, +2.492352145e-04f, -7.161694067e-03f, -8.419222618e-03f, -5.019556468e-03f, -3.892286773e-04f, +2.616410104e-03f, +3.072202006e-03f, +1.791901937e-03f, +2.108510936e-04f, -6.814706814e-04f, -7.354042568e-04f, -3.671213681e-04f, + +9.397458000e-06f, +1.267196955e-05f, +1.834755230e-06f, -2.390989374e-05f, -4.884335002e-05f, -4.601742064e-05f, +2.735226303e-06f, +8.371341332e-05f, +1.453758241e-04f, +1.233714902e-04f, -1.083680508e-05f, -2.085129681e-04f, -3.464980832e-04f, -2.899864756e-04f, +1.025234248e-05f, +4.461813775e-04f, +7.662312983e-04f, +6.909087043e-04f, +8.099886954e-05f, -9.374756521e-04f, -1.979153161e-03f, -2.556947300e-03f, -2.322223945e-03f, -1.260192979e-03f, +2.731388008e-04f, +1.703221322e-03f, +2.503732601e-03f, +2.437936128e-03f, +1.649237711e-03f, +5.610317500e-04f, -3.492897638e-04f, -7.748150519e-04f, -6.879406509e-04f, -2.945804811e-04f, +1.173231310e-04f, +3.372720680e-04f, +3.149956671e-04f, +1.399681615e-04f, -4.676505722e-05f, -1.434819223e-04f, -1.305872469e-04f, -5.479546913e-05f, +1.920414868e-05f, +5.172165629e-05f, +4.197899425e-05f, +1.399869545e-05f, -7.511085657e-06f, -1.271963515e-05f, + -1.153649871e-04f, +5.125052301e-04f, +1.508082980e-03f, +1.690029190e-03f, -2.729096169e-04f, -4.040956062e-03f, -6.593904801e-03f, -3.980362717e-03f, +4.587662014e-03f, +1.386608626e-02f, +1.493883939e-02f, +2.740123711e-03f, -1.708695496e-02f, -2.944256762e-02f, -2.080898211e-02f, +7.660264021e-03f, +3.705630652e-02f, +4.315162828e-02f, +1.639688878e-02f, -2.717823924e-02f, -5.546116140e-02f, -4.479557353e-02f, -1.694013043e-04f, +4.657120588e-02f, +6.058778724e-02f, +3.129831574e-02f, -1.924504047e-02f, -5.376962901e-02f, -4.863741723e-02f, -1.080459227e-02f, +2.981027461e-02f, +4.472887513e-02f, +2.757745693e-02f, -4.450460187e-03f, -2.685895566e-02f, -2.674720226e-02f, -9.601411153e-03f, +8.781012224e-03f, +1.600492917e-02f, +1.086076945e-02f, +8.755149706e-04f, -5.734686152e-03f, -6.051557804e-03f, -2.554657032e-03f, +7.504288733e-04f, +1.817656823e-03f, +1.148123072e-03f, +2.015546685e-04f, + -9.064906686e-06f, -2.884217760e-05f, -2.693952258e-05f, +2.211498118e-05f, +9.737769918e-05f, +1.209696434e-04f, +1.872963638e-05f, -1.822061507e-04f, -3.210097061e-04f, -2.115891334e-04f, +1.640848971e-04f, +5.572811128e-04f, +5.962422370e-04f, +1.121686012e-04f, -6.264617115e-04f, -1.035831615e-03f, -6.744386457e-04f, +3.207674749e-04f, +1.236204745e-03f, +1.304078768e-03f, +3.562485408e-04f, -9.577855825e-04f, -1.632127022e-03f, -1.107136239e-03f, +2.515719334e-04f, +1.419920346e-03f, +1.524861610e-03f, +5.288622618e-04f, -7.708833030e-04f, -1.404762002e-03f, -9.852612407e-04f, +5.641373053e-05f, +8.917212832e-04f, +9.687567770e-04f, +3.777973932e-04f, -3.305073988e-04f, -6.413284520e-04f, -4.440387867e-04f, -1.525114812e-05f, +2.838162517e-04f, +2.934846979e-04f, +1.097845518e-04f, -6.940020102e-05f, -1.245060156e-04f, -7.256349920e-05f, +1.264986970e-07f, +3.218755973e-05f, +2.271014949e-05f, + /* 4,27 (48) */ + -1.305980346e-04f, -5.082309539e-04f, -7.914993003e-04f, -4.783914202e-04f, +7.094496045e-04f, +2.337365159e-03f, +3.178148869e-03f, +1.868366177e-03f, -1.907776514e-03f, -6.510011921e-03f, -8.654767285e-03f, -5.275814740e-03f, +3.891069406e-03f, +1.475222413e-02f, +1.996778377e-02f, +1.296033103e-02f, -6.985676151e-03f, -3.168505052e-02f, -4.574119955e-02f, -3.322385297e-02f, +1.351483038e-02f, +8.763055561e-02f, +1.681909859e-01f, +2.279318995e-01f, +2.450284291e-01f, +2.130528937e-01f, +1.439661018e-01f, +6.257031134e-02f, -4.669140612e-03f, -4.070403955e-02f, -4.353877900e-02f, -2.429746489e-02f, +3.240526627e-04f, +1.667071582e-02f, +1.941311660e-02f, +1.158819432e-02f, +5.642308816e-04f, -7.021725906e-03f, -8.465987675e-03f, -5.163038390e-03f, -5.198159242e-04f, +2.561614635e-03f, +3.091406154e-03f, +1.843623593e-03f, +2.528300878e-04f, -6.674719860e-04f, -7.429153425e-04f, -3.798410033e-04f, + +9.168948451e-06f, +1.274354164e-05f, +2.434178788e-06f, -2.299301259e-05f, -4.834013806e-05f, -4.676809063e-05f, +5.472731236e-07f, +8.113144611e-05f, +1.444164487e-04f, +1.257792813e-04f, -5.203509853e-06f, -2.024748039e-04f, -3.445441995e-04f, -2.955471640e-04f, -2.183892139e-06f, +4.327665825e-04f, +7.609428930e-04f, +7.012321084e-04f, +1.076524697e-04f, -9.028001885e-04f, -1.951184787e-03f, -2.550090443e-03f, -2.343018643e-03f, -1.303172126e-03f, +2.236206357e-04f, +1.665869356e-03f, +2.491578750e-03f, +2.452591617e-03f, +1.681024634e-03f, +5.945862371e-04f, -3.272670360e-04f, -7.698491488e-04f, -6.967612850e-04f, -3.085938074e-04f, +1.066406684e-04f, +3.342310618e-04f, +3.187096293e-04f, +1.463254020e-04f, -4.196148700e-05f, -1.422283575e-04f, -1.322867935e-04f, -5.744172148e-05f, +1.741551516e-05f, +5.142937682e-05f, +4.271015005e-05f, +1.487372814e-05f, -7.080070146e-06f, -1.277815672e-05f, + -1.244298938e-04f, +4.836630525e-04f, +1.481143457e-03f, +1.712144172e-03f, -1.755319177e-04f, -3.919986419e-03f, -6.575175165e-03f, -4.162568867e-03f, +4.266652308e-03f, +1.365449713e-02f, +1.510292428e-02f, +3.297404824e-03f, -1.649071272e-02f, -2.933039902e-02f, -2.143544382e-02f, +6.624432406e-03f, +3.638186787e-02f, +4.347239575e-02f, +1.763309353e-02f, -2.587416048e-02f, -5.510491286e-02f, -4.575335912e-02f, -1.801528327e-03f, +4.546406964e-02f, +6.083935918e-02f, +3.271823609e-02f, -1.772017886e-02f, -5.324076675e-02f, -4.940830054e-02f, -1.220935428e-02f, +2.882501336e-02f, +4.478528886e-02f, +2.846917822e-02f, -3.481703410e-03f, -2.648115827e-02f, -2.707770966e-02f, -1.024273960e-02f, +8.336973437e-03f, +1.598967802e-02f, +1.114458570e-02f, +1.168999668e-03f, -5.624901600e-03f, -6.120958005e-03f, -2.679163048e-03f, +6.778653741e-04f, +1.817783322e-03f, +1.180310631e-03f, +2.242648180e-04f, + -8.460514288e-06f, -2.836758865e-05f, -2.765734466e-05f, +1.990756350e-05f, +9.531218521e-05f, +1.219164262e-04f, +2.393493880e-05f, -1.757786675e-04f, -3.196921023e-04f, -2.196337826e-04f, +1.501841507e-04f, +5.485735572e-04f, +6.030844187e-04f, +1.337012165e-04f, -6.051182020e-04f, -1.033588332e-03f, -6.978229305e-04f, +2.862808627e-04f, +1.217396724e-03f, +1.318683292e-03f, +3.964960053e-04f, -9.214941434e-04f, -1.628518790e-03f, -1.140426844e-03f, +2.061045701e-04f, +1.396669752e-03f, +1.540613279e-03f, +5.700740732e-04f, -7.361705945e-04f, -1.401110338e-03f, -1.011752738e-03f, +2.273152976e-05f, +8.757732603e-04f, +9.785563028e-04f, +4.013603659e-04f, -3.125433452e-04f, -6.399462117e-04f, -4.557418356e-04f, -2.825187413e-05f, +2.787575706e-04f, +2.970897857e-04f, +1.164291964e-04f, -6.542647888e-05f, -1.247804426e-04f, -7.496484133e-05f, -1.690552013e-06f, +3.194173417e-05f, +2.333362236e-05f, + /* 4,28 (48) */ + -1.214290861e-04f, -4.954874122e-04f, -7.890651215e-04f, -5.013844328e-04f, +6.611094664e-04f, +2.290597068e-03f, +3.178696142e-03f, +1.949497623e-03f, -1.763360065e-03f, -6.384232639e-03f, -8.659970795e-03f, -5.478289544e-03f, +3.546525207e-03f, +1.445667697e-02f, +1.996559988e-02f, +1.339309761e-02f, -6.224733259e-03f, -3.098381841e-02f, -4.563354708e-02f, -3.412665315e-02f, +1.156364560e-02f, +8.508046517e-02f, +1.658479672e-01f, +2.266287274e-01f, +2.452520498e-01f, +2.147187630e-01f, +1.464576805e-01f, +6.502290296e-02f, -2.988115978e-03f, -4.010945331e-02f, -4.386604604e-02f, -2.506731404e-02f, -3.727086224e-04f, +1.636212202e-02f, +1.951975726e-02f, +1.192242538e-02f, +8.829405108e-04f, -6.875400504e-03f, -8.507949162e-03f, -5.305266748e-03f, -6.521027177e-04f, +2.504172913e-03f, +3.108821669e-03f, +1.895052970e-03f, +2.955402379e-04f, -6.525982578e-04f, -7.499954126e-04f, -3.926191600e-04f, + +8.936712204e-06f, +1.280083156e-05f, +3.017351572e-06f, -2.207718797e-05f, -4.781004476e-05f, -4.747135652e-05f, -1.604718976e-06f, +7.853403820e-05f, +1.433742428e-04f, +1.280706340e-04f, +3.581872455e-07f, -1.963843605e-04f, -3.423967670e-04f, -3.008555334e-04f, -1.446878429e-05f, +4.192508715e-04f, +7.552642627e-04f, +7.110112536e-04f, +1.338758426e-04f, -8.681716366e-04f, -1.922766365e-03f, -2.542417848e-03f, -2.362967526e-03f, -1.345655982e-03f, +1.740164482e-04f, +1.627890458e-03f, +2.478547275e-03f, +2.466506952e-03f, +1.712499040e-03f, +6.283162183e-04f, -3.047517951e-04f, -7.643591248e-04f, -7.052670211e-04f, -3.225875851e-04f, +9.576076956e-05f, +3.309403096e-04f, +3.222659344e-04f, +1.526707137e-04f, -3.706460373e-05f, -1.408612929e-04f, -1.339214410e-04f, -6.009027664e-05f, +1.558348651e-05f, +5.109317649e-05f, +4.342263601e-05f, +1.575588796e-05f, -6.631829657e-06f, -1.282502326e-05f, + -1.328904081e-04f, +4.552954639e-04f, +1.453486113e-03f, +1.732051735e-03f, -8.021973253e-05f, -3.798069993e-03f, -6.551240226e-03f, -4.338347535e-03f, +3.946960206e-03f, +1.343486335e-02f, +1.525310843e-02f, +3.845978381e-03f, -1.588762831e-02f, -2.919669781e-02f, -2.204056203e-02f, +5.590844074e-03f, +3.568404494e-02f, +4.375867662e-02f, +1.885049025e-02f, -2.455547718e-02f, -5.470841685e-02f, -4.667485326e-02f, -3.430047117e-03f, +4.432364280e-02f, +6.104546375e-02f, +3.411490584e-02f, -1.617956558e-02f, -5.267069267e-02f, -5.014447113e-02f, -1.361046461e-02f, +2.781326063e-02f, +4.480802039e-02f, +2.934495148e-02f, -2.503147107e-03f, -2.607979791e-02f, -2.739025301e-02f, -1.088268582e-02f, +7.881231602e-03f, +1.596142614e-02f, +1.142334327e-02f, +1.466089454e-03f, -5.508472404e-03f, -6.186384484e-03f, -2.803943490e-03f, +6.029005328e-04f, +1.816092770e-03f, +1.212252366e-03f, +2.475984404e-04f, + -7.865645190e-06f, -2.787300974e-05f, -2.832538384e-05f, +1.773293279e-05f, +9.319952775e-05f, +1.227328237e-04f, +2.902816071e-05f, -1.693004253e-04f, -3.181220543e-04f, -2.273902694e-04f, +1.363244821e-04f, +5.395136800e-04f, +6.093752927e-04f, +1.549398357e-04f, -5.834614779e-04f, -1.030547109e-03f, -7.205197926e-04f, +2.517506783e-04f, +1.197725728e-03f, +1.332212982e-03f, +4.363215056e-04f, -8.845679552e-04f, -1.623659271e-03f, -1.172816986e-03f, +1.604735422e-04f, +1.372321662e-03f, +1.555199324e-03f, +6.109405869e-04f, -7.007793324e-04f, -1.396353923e-03f, -1.037577029e-03f, -1.115266394e-05f, +8.590336898e-04f, +9.876493535e-04f, +4.247930999e-04f, -2.941645902e-04f, -6.380287732e-04f, -4.671998064e-04f, -4.138913951e-05f, +2.733933896e-04f, +3.004914841e-04f, +1.230802996e-04f, -6.132039239e-05f, -1.249420826e-04f, -7.734590613e-05f, -3.552050772e-06f, +3.165178783e-05f, +2.394720634e-05f, + /* 4,29 (48) */ + -1.124923739e-04f, -4.826865807e-04f, -7.860477700e-04f, -5.234616208e-04f, +6.132994217e-04f, +2.243125712e-03f, +3.177091423e-03f, +2.028031661e-03f, -1.619985822e-03f, -6.256162005e-03f, -8.659612608e-03f, -5.674673905e-03f, +3.204128440e-03f, +1.415582144e-02f, +1.995113109e-02f, +1.381234848e-02f, -5.469468996e-03f, -3.027280715e-02f, -4.549967124e-02f, -3.499482479e-02f, +9.640879233e-03f, +8.253804732e-02f, +1.634849997e-01f, +2.252830714e-01f, +2.454260662e-01f, +2.163466535e-01f, +1.489362278e-01f, +6.748940991e-02f, -1.275616938e-03f, -3.948113709e-02f, -4.417079783e-02f, -2.583167317e-02f, -1.077975643e-03f, +1.603953443e-02f, +1.961551803e-02f, +1.225336569e-02f, +1.205206445e-03f, -6.722729790e-03f, -8.545013766e-03f, -5.446128040e-03f, -7.860241587e-04f, +2.444082636e-03f, +3.124405156e-03f, +1.946146147e-03f, +3.389628739e-04f, -6.368423699e-04f, -7.566272423e-04f, -4.054441832e-04f, + +8.701086450e-06f, +1.284410222e-05f, +3.584095864e-06f, -2.116315483e-05f, -4.725396625e-05f, -4.812748421e-05f, -3.719755005e-06f, +7.592324930e-05f, +1.422510891e-04f, +1.302455672e-04f, +5.845531987e-06f, -1.902462398e-04f, -3.400594884e-04f, -3.059112374e-04f, -2.659656099e-05f, +4.056435160e-04f, +7.492033100e-04f, +7.202473230e-04f, +1.596609317e-04f, -8.336048491e-04f, -1.893912758e-03f, -2.533936609e-03f, -2.382065486e-03f, -1.387628879e-03f, +1.243453115e-04f, +1.589298153e-03f, +2.464640132e-03f, +2.479672483e-03f, +1.743645304e-03f, +6.622080333e-04f, -2.817498091e-04f, -7.583417174e-04f, -7.134490749e-04f, -3.365530480e-04f, +8.468789089e-05f, +3.273989107e-04f, +3.256603402e-04f, +1.589997563e-04f, -3.207647279e-05f, -1.393801050e-04f, -1.354891037e-04f, -6.273926195e-05f, +1.370871943e-05f, +5.071255403e-05f, +4.411553088e-05f, +1.664456387e-05f, -6.166404737e-06f, -1.285991751e-05f, + -1.407560533e-04f, +4.274224541e-04f, +1.425160729e-03f, +1.749784668e-03f, +1.297979522e-05f, -3.675337169e-03f, -6.522212065e-03f, -4.507647960e-03f, +3.628838152e-03f, +1.320747308e-02f, +1.538943292e-02f, +4.385492061e-03f, -1.527825301e-02f, -2.904175797e-02f, -2.262402350e-02f, +4.560296965e-03f, +3.496352515e-02f, +4.401042729e-02f, +2.004821598e-02f, -2.322326420e-02f, -5.427209535e-02f, -4.755942122e-02f, -5.053706387e-03f, +4.315082581e-02f, +6.120593729e-02f, +3.548722750e-02f, -1.462436626e-02f, -5.205975209e-02f, -5.084525046e-02f, -1.500681854e-02f, +2.677568360e-02f, +4.479686773e-02f, +3.020398517e-02f, -1.515497754e-03f, -2.565500481e-02f, -2.768441760e-02f, -1.152071459e-02f, +7.414031795e-03f, +1.592003700e-02f, +1.169673666e-02f, +1.766580938e-03f, -5.385392104e-03f, -6.247704877e-03f, -2.928885573e-03f, +5.255546267e-04f, +1.812540719e-03f, +1.243904153e-03f, +2.715456467e-04f, + -7.280845023e-06f, -2.735959138e-05f, -2.894409669e-05f, +1.559266332e-05f, +9.104278358e-05f, +1.234204187e-04f, +3.400642472e-05f, -1.627780462e-04f, -3.163044258e-04f, -2.348554835e-04f, +1.225172574e-04f, +5.301127742e-04f, +6.151147960e-04f, +1.758694164e-04f, -5.615116392e-04f, -1.026715774e-03f, -7.425149321e-04f, +2.172049221e-04f, +1.177211241e-03f, +1.344660851e-03f, +4.756944942e-04f, -8.470377077e-04f, -1.617554017e-03f, -1.204281511e-03f, +1.147150770e-04f, +1.346894540e-03f, +1.568606346e-03f, +6.514284292e-04f, -6.647357780e-04f, -1.390492424e-03f, -1.062710289e-03f, -4.521248951e-05f, +8.415113541e-04f, +9.960235479e-04f, +4.480752018e-04f, -2.753828356e-04f, -6.355725464e-04f, -4.784002737e-04f, -5.465316782e-05f, +2.677244663e-04f, +3.036838206e-04f, +1.297318172e-04f, -5.708357236e-05f, -1.249886400e-04f, -7.970380656e-05f, -5.456981773e-06f, +3.131693383e-05f, +2.454981878e-05f, + /* 4,30 (48) */ + -1.037912875e-04f, -4.698424785e-04f, -7.824636741e-04f, -5.446247756e-04f, +5.660454554e-04f, +2.194998227e-03f, +3.173371668e-03f, +2.103954910e-03f, -1.477734733e-03f, -6.125916438e-03f, -8.653767076e-03f, -5.864920145e-03f, +2.864068951e-03f, +1.384991020e-02f, +1.992453453e-02f, +1.421799200e-02f, -4.720265686e-03f, -2.955255983e-02f, -4.534001030e-02f, -3.582842964e-02f, +7.746966475e-03f, +8.000411071e-02f, +1.611029342e-01f, +2.238954425e-01f, +2.455504115e-01f, +2.179359516e-01f, +1.514008679e-01f, +6.996908239e-02f, +4.680283662e-04f, -3.881892906e-02f, -4.445254764e-02f, -2.659001489e-02f, -1.791424718e-03f, +1.570298138e-02f, +1.970020593e-02f, +1.258076460e-02f, +1.530866785e-03f, -6.563730034e-03f, -8.577090238e-03f, -5.585508145e-03f, -9.215132624e-04f, +2.381343374e-03f, +3.138113875e-03f, +1.996858701e-03f, +3.830784047e-04f, -6.201978060e-04f, -7.627936470e-04f, -4.183041008e-04f, + +8.462405133e-06f, +1.287362466e-05f, +4.134251716e-06f, -2.025163384e-05f, -4.667280462e-05f, -4.873677159e-05f, -5.796882022e-06f, +7.330111985e-05f, +1.410489017e-04f, +1.323041793e-04f, +1.125585379e-05f, -1.840650204e-04f, -3.375361450e-04f, -3.107140920e-04f, -3.856160836e-05f, +3.919537410e-04f, +7.427680672e-04f, +7.289417700e-04f, +1.849999595e-04f, -7.991145529e-04f, -1.864638951e-03f, -2.524654162e-03f, -2.400307809e-03f, -1.429075397e-03f, +7.462633087e-05f, +1.550106255e-03f, +2.449859669e-03f, +2.492078858e-03f, +1.774447867e-03f, +6.962478502e-04f, -2.582671380e-04f, -7.517939123e-04f, -7.212987527e-04f, -3.504813501e-04f, +7.342665820e-05f, +3.236061130e-04f, +3.288886600e-04f, +1.653081477e-04f, -2.699924766e-05f, -1.377842419e-04f, -1.369877151e-04f, -6.538677752e-05f, +1.179191290e-05f, +5.028703496e-05f, +4.478791382e-05f, +1.753912827e-05f, -5.683852374e-06f, -1.288252765e-05f, + -1.480368983e-04f, +4.000628628e-04f, +1.396216632e-03f, +1.765377331e-03f, +1.040225788e-04f, -3.551916750e-03f, -6.488205641e-03f, -4.670426006e-03f, +3.312533726e-03f, +1.297261759e-02f, +1.551195017e-02f, +4.915604835e-03f, -1.466313822e-02f, -2.886588855e-02f, -2.318553514e-02f, +3.533581191e-03f, +3.422101022e-02f, +4.422763222e-02f, +2.122542722e-02f, -2.187860335e-02f, -5.379640085e-02f, -4.840645892e-02f, -6.671260404e-03f, +4.194654430e-02f, +6.132065237e-02f, +3.683412204e-02f, -1.305575991e-02f, -5.140832366e-02f, -5.150998624e-02f, -1.639731096e-02f, +2.571297331e-02f, +4.475165524e-02f, +3.104549652e-02f, -5.194742057e-04f, -2.520692960e-02f, -2.795980043e-02f, -1.215628714e-02f, +6.935631522e-03f, +1.586538384e-02f, +1.196446112e-02f, +2.070264759e-03f, -5.255660287e-03f, -6.304788449e-03f, -3.053874213e-03f, +4.458508201e-04f, +1.807083737e-03f, +1.275221087e-03f, +2.960954655e-04f, + -6.706631824e-06f, -2.682848005e-05f, -2.951398656e-05f, +1.348826031e-05f, +8.884499839e-05f, +1.239808950e-04f, +3.886700897e-05f, -1.562180990e-04f, -3.142442435e-04f, -2.420266134e-04f, +1.087736719e-04f, +5.203823168e-04f, +6.203033410e-04f, +1.964753024e-04f, -5.392888856e-04f, -1.022102766e-03f, -7.637947150e-04f, +1.826714690e-04f, +1.155873363e-03f, +1.356020827e-03f, +5.145848785e-04f, -8.089345225e-04f, -1.610209589e-03f, -1.234796034e-03f, +6.886550882e-05f, +1.320407745e-03f, +1.580821894e-03f, +6.915044642e-04f, -6.280668059e-04f, -1.383526417e-03f, -1.087129161e-03f, -7.942130382e-05f, +8.232157439e-04f, +1.003667029e-03f, +4.711862525e-04f, -2.562102288e-04f, -6.325743770e-04f, -4.893309108e-04f, -6.803395823e-05f, +2.617518459e-04f, +3.066609371e-04f, +1.363776150e-04f, -5.271780462e-05f, -1.249178960e-04f, -8.203562472e-05f, -7.404259204e-06f, +3.093642097e-05f, +2.514036432e-05f, + /* 4,31 (48) */ + -9.532888232e-05f, -4.569688538e-04f, -7.783294224e-04f, -5.648764094e-04f, +5.193726508e-04f, +2.146261456e-03f, +3.167574786e-03f, +2.177256030e-03f, -1.336685832e-03f, -5.993612259e-03f, -8.642511222e-03f, -6.048985165e-03f, +2.526532806e-03f, +1.353919611e-02f, +1.988597292e-02f, +1.460994574e-02f, -3.977497619e-03f, -2.882361806e-02f, -4.515501034e-02f, -3.662754419e-02f, +5.882327524e-03f, +7.747945655e-02f, +1.587026264e-01f, +2.224663671e-01f, +2.456250379e-01f, +2.194860579e-01f, +1.538507276e-01f, +7.246116125e-02f, +2.242476233e-03f, -3.812268121e-02f, -4.471081478e-02f, -2.734180880e-02f, -2.512723471e-03f, +1.535250003e-02f, +1.977363258e-02f, +1.290437072e-02f, +1.859755445e-03f, -6.398421886e-03f, -8.604089486e-03f, -5.723292387e-03f, -1.058500977e-03f, +2.315956597e-03f, +3.149905788e-03f, +2.047145736e-03f, +4.278663186e-04f, -6.026586777e-04f, -7.684774994e-04f, -4.311866284e-04f, + +8.220998674e-06f, +1.288967773e-05f, +4.667676794e-06f, -1.934333100e-05f, -4.606746708e-05f, -4.929954776e-05f, -7.835189267e-06f, +7.066966975e-05f, +1.397696245e-04f, +1.342466470e-04f, +1.658656658e-05f, -1.778452548e-04f, -3.348305944e-04f, -3.152640733e-04f, -5.035847333e-05f, +3.781907203e-04f, +7.359666910e-04f, +7.370963161e-04f, +2.098854303e-04f, -7.647153423e-04f, -1.834960044e-03f, -2.514578272e-03f, -2.417690168e-03f, -1.469980364e-03f, +2.487863475e-05f, +1.510328867e-03f, +2.434208634e-03f, +2.503717032e-03f, +1.804891247e-03f, +7.304216719e-04f, -2.343101320e-04f, -7.447129475e-04f, -7.288074567e-04f, -3.643635712e-04f, +6.198186541e-05f, +3.195613163e-04f, +3.319467664e-04f, +1.715914665e-04f, -2.183516949e-05f, -1.360732244e-04f, -1.384152296e-04f, -6.803089721e-05f, +9.833808267e-06f, +4.981617239e-05f, +4.543886514e-05f, +1.843893728e-05f, -5.184246216e-06f, -1.289254766e-05f, + -1.547435301e-04f, +3.732343827e-04f, +1.366702646e-03f, +1.778865592e-03f, +1.928675772e-04f, -3.427935855e-03f, -6.449338632e-03f, -4.826644105e-03f, +2.998289482e-03f, +1.273059098e-02f, +1.562072385e-02f, +5.435987152e-03f, -1.404283488e-02f, -2.866941325e-02f, -2.372482403e-02f, +2.511478425e-03f, +3.345721550e-02f, +4.441030368e-02f, +2.238130058e-02f, -2.052258252e-02f, -5.328181598e-02f, -4.921539345e-02f, -8.281469993e-03f, +4.071174827e-02f, +6.138951788e-02f, +3.815452979e-02f, -1.147493802e-02f, -5.071681919e-02f, -5.213805305e-02f, -1.778083738e-02f, +2.462584415e-02f, +4.467223393e-02f, +3.186871227e-02f, +4.841928232e-04f, -2.473574335e-02f, -2.821601066e-02f, -1.278886151e-02f, +6.446300611e-03f, +1.579734988e-02f, +1.222621297e-02f, +2.376925696e-03f, -5.119282672e-03f, -6.357506254e-03f, -3.178792109e-03f, +3.638151954e-04f, +1.799679478e-03f, +1.306157508e-03f, +3.212358298e-04f, + -6.143495962e-06f, -2.628081681e-05f, -3.003560201e-05f, +1.142115956e-05f, +8.660920381e-05f, +1.244160341e-04f, +4.360734750e-05f, -1.496270931e-04f, -3.119466899e-04f, -2.489011455e-04f, +9.510474086e-05f, +5.103339566e-04f, +6.249418104e-04f, +2.167432336e-04f, -5.168134989e-04f, -1.016717124e-03f, -7.843461819e-04f, +1.481780446e-04f, +1.133732786e-03f, +1.366287754e-03f, +5.529630450e-04f, -7.702899258e-04f, -1.601633554e-03f, -1.264336964e-03f, +2.296124824e-05f, +1.292881518e-03f, +1.591834473e-03f, +7.311358218e-04f, -5.907998826e-04f, -1.375457392e-03f, -1.110810779e-03f, -1.137522031e-04f, +8.041570547e-04f, +1.010568477e-03f, +4.941058242e-04f, -2.366593558e-04f, -6.290315529e-04f, -4.999795024e-04f, -8.152129225e-05f, +2.554768633e-04f, +3.094170965e-04f, +1.430114735e-04f, -4.822503056e-05f, -1.247277122e-04f, -8.433841439e-05f, -9.392727151e-06f, +3.050953535e-05f, +2.571773609e-05f, + /* 5, 0 (48) */ + -9.712561017e-05f, +5.630052980e-04f, +1.206067011e-03f, +7.527819647e-04f, -1.206557913e-03f, -3.245991688e-03f, -2.728345499e-03f, +1.489426586e-03f, +6.622324221e-03f, +7.089903931e-03f, -2.805093114e-04f, -1.122619085e-02f, -1.522873798e-02f, -4.406023078e-03f, +1.648289776e-02f, +2.943133839e-02f, +1.647195998e-02f, -2.143009154e-02f, -5.654855430e-02f, -4.868148545e-02f, +2.497919491e-02f, +1.464018327e-01f, +2.604437981e-01f, +3.070623956e-01f, +2.604437981e-01f, +1.464018327e-01f, +2.497919491e-02f, -4.868148545e-02f, -5.654855430e-02f, -2.143009154e-02f, +1.647195998e-02f, +2.943133839e-02f, +1.648289776e-02f, -4.406023078e-03f, -1.522873798e-02f, -1.122619085e-02f, -2.805093114e-04f, +7.089903931e-03f, +6.622324221e-03f, +1.489426586e-03f, -2.728345499e-03f, -3.245991688e-03f, -1.206557913e-03f, +7.527819647e-04f, +1.206067011e-03f, +5.630052980e-04f, -9.712561017e-05f, -2.479949097e-04f, + -1.282518843e-05f, -2.532528913e-05f, -9.046210131e-06f, +3.889954925e-05f, +7.491153978e-05f, +3.839122229e-05f, -7.498057630e-05f, -1.710018670e-04f, -1.194036389e-04f, +1.033564617e-04f, +3.283880359e-04f, +2.970847865e-04f, -8.290196051e-05f, -5.560876896e-04f, -6.462049060e-04f, -7.534959806e-05f, +8.584651506e-04f, +1.345120911e-03f, +6.450357199e-04f, -1.214091364e-03f, -3.234852854e-03f, -4.026043107e-03f, -2.803210385e-03f, -4.783988299e-05f, +2.734317328e-03f, +4.019323722e-03f, +3.284868198e-03f, +1.281996999e-03f, -6.015724119e-04f, -1.343618217e-03f, -8.852743607e-04f, +4.837949091e-05f, +6.385264040e-04f, +5.671719722e-04f, +9.852083963e-05f, -2.901112160e-04f, -3.324887018e-04f, -1.116913074e-04f, +1.146544985e-04f, +1.721770654e-04f, +7.895742338e-05f, -3.577215824e-05f, -7.511648637e-05f, -4.054173673e-05f, +7.922171439e-06f, +2.536792522e-05f, +1.339113908e-05f, -2.077502712e-06f, + +5.939400487e-04f, -2.971519080e-04f, -2.102283883e-03f, -2.360885377e-03f, +1.198769271e-03f, +6.225411832e-03f, +5.885033052e-03f, -3.266913899e-03f, -1.360369760e-02f, -1.128997664e-02f, +6.959510654e-03f, +2.424665836e-02f, +1.796260386e-02f, -1.233743150e-02f, -3.690527276e-02f, -2.458115068e-02f, +1.881243249e-02f, +4.916511396e-02f, +2.951026661e-02f, -2.514630357e-02f, -5.812289420e-02f, -3.141212080e-02f, +2.978290985e-02f, +6.141247912e-02f, +2.978290985e-02f, -3.141212080e-02f, -5.812289420e-02f, -2.514630357e-02f, +2.951026661e-02f, +4.916511396e-02f, +1.881243249e-02f, -2.458115068e-02f, -3.690527276e-02f, -1.233743150e-02f, +1.796260386e-02f, +2.424665836e-02f, +6.959510654e-03f, -1.128997664e-02f, -1.360369760e-02f, -3.266913899e-03f, +5.885033052e-03f, +6.225411832e-03f, +1.198769271e-03f, -2.360885377e-03f, -2.102283883e-03f, -2.971519080e-04f, +5.939400487e-04f, +3.757269824e-04f, + +5.619091256e-06f, +4.877898058e-05f, +5.001166561e-05f, -4.580540148e-05f, -1.616706026e-04f, -1.138544649e-04f, +1.507196706e-04f, +3.732587375e-04f, +1.958668817e-04f, -3.489190265e-04f, -6.864866184e-04f, -2.710473447e-04f, +6.463035710e-04f, +1.064299823e-03f, +3.066330440e-04f, -1.011454792e-03f, -1.432111537e-03f, -2.770896161e-04f, +1.375500241e-03f, +1.699573653e-03f, +1.785591216e-04f, -1.650720551e-03f, -1.793723894e-03f, -3.412141537e-05f, +1.761957904e-03f, +1.688158924e-03f, -1.142151055e-04f, -1.676686855e-03f, -1.413748698e-03f, +2.233016724e-04f, +1.418809249e-03f, +1.045542951e-03f, -2.671187145e-04f, -1.058968687e-03f, -6.727082646e-04f, +2.459798275e-04f, +6.862098894e-04f, +3.664436410e-04f, -1.825774125e-04f, -3.750921654e-04f, -1.603876878e-04f, +1.083483004e-04f, +1.635764684e-04f, +4.996526961e-05f, -4.852002281e-05f, -4.990376237e-05f, -6.801361925e-06f, +1.364337518e-05f, + /* 5, 1 (48) */ + -1.099507986e-04f, +5.376800088e-04f, +1.197020801e-03f, +7.916815140e-04f, -1.131646373e-03f, -3.207600465e-03f, -2.803326075e-03f, +1.318424719e-03f, +6.502920583e-03f, +7.193260392e-03f, +4.787872449e-05f, -1.092910607e-02f, -1.531163994e-02f, -4.962110768e-03f, +1.583669286e-02f, +2.935598879e-02f, +1.733042513e-02f, -2.008497063e-02f, -5.590351858e-02f, -4.989557681e-02f, +2.174434206e-02f, +1.423757896e-01f, +2.576405877e-01f, +3.070145557e-01f, +2.631781154e-01f, +1.504211564e-01f, +2.826406311e-02f, -4.739948845e-02f, -5.715012672e-02f, -2.277370976e-02f, +1.558668562e-02f, +2.947971788e-02f, +1.712142417e-02f, -3.838851106e-03f, -1.513021714e-02f, -1.151630207e-02f, -6.129980132e-04f, +6.978212623e-03f, +6.736978720e-03f, +1.661603651e-03f, -2.649388075e-03f, -3.281763846e-03f, -1.281674399e-03f, +7.122402280e-04f, +1.213989182e-03f, +5.883732232e-04f, -8.373447109e-05f, -2.500724124e-04f, + -1.225783667e-05f, -2.525256859e-05f, -1.013486907e-05f, +3.724771090e-05f, +7.463086104e-05f, +4.092589172e-05f, -7.099083746e-05f, -1.696732221e-04f, -1.239676040e-04f, +9.503320589e-05f, +3.240227631e-04f, +3.036857170e-04f, -6.739588425e-05f, -5.446129107e-04f, -6.531856788e-04f, -1.019169912e-04f, +8.312152161e-04f, +1.345396299e-03f, +6.872785669e-04f, -1.146381061e-03f, -3.183583322e-03f, -4.030681563e-03f, -2.870514001e-03f, -1.434918397e-04f, +2.663871431e-03f, +4.010517398e-03f, +3.333588684e-03f, +1.350054072e-03f, -5.569062743e-04f, -1.340873323e-03f, -9.116132390e-04f, +2.102664783e-05f, +6.301490248e-04f, +5.778504940e-04f, +1.142387896e-04f, -2.827671959e-04f, -3.363172964e-04f, -1.200295256e-04f, +1.097224341e-04f, +1.731953418e-04f, +8.291697915e-05f, -3.307012695e-05f, -7.524412339e-05f, -4.217219376e-05f, +6.763373530e-06f, +2.537973484e-05f, +1.395485539e-05f, -1.755773309e-06f, + +5.995591399e-04f, -2.483729274e-04f, -2.052272217e-03f, -2.406690779e-03f, +1.037098668e-03f, +6.111557367e-03f, +6.035752723e-03f, -2.893655162e-03f, -1.340783072e-02f, -1.163889566e-02f, +6.273024036e-03f, +2.397561102e-02f, +1.860890744e-02f, -1.127313167e-02f, -3.659863972e-02f, -2.559260547e-02f, +1.738032095e-02f, +4.888802435e-02f, +3.088576685e-02f, -2.344672992e-02f, -5.794433508e-02f, -3.306284135e-02f, +2.798918595e-02f, +6.137835771e-02f, +3.154486775e-02f, -2.972396188e-02f, -5.823710931e-02f, -2.682299043e-02f, +2.809651791e-02f, +4.938841564e-02f, +2.023124174e-02f, -2.353560773e-02f, -3.717239147e-02f, -1.339640018e-02f, +1.728989560e-02f, +2.449263819e-02f, +7.645720544e-03f, -1.092353299e-02f, -1.378627501e-02f, -3.642006065e-03f, +5.724645364e-03f, +6.333760132e-03f, +1.362345739e-03f, -2.310920108e-03f, -2.150803906e-03f, -3.470556704e-04f, +5.871386867e-04f, +3.893703576e-04f, + +4.466594439e-06f, +4.761327908e-05f, +5.139596134e-05f, -4.167685723e-05f, -1.595939104e-04f, -1.191183543e-04f, +1.410228537e-04f, +3.709989590e-04f, +2.087436413e-04f, -3.311930698e-04f, -6.859527169e-04f, -2.955495186e-04f, +6.193841835e-04f, +1.068359147e-03f, +3.455152596e-04f, -9.764189553e-04f, -1.443705745e-03f, -3.303161911e-04f, +1.335830847e-03f, +1.720460254e-03f, +2.425559345e-04f, -1.611465173e-03f, -1.823431103e-03f, -1.023247407e-04f, +1.728168432e-03f, +1.723734218e-03f, -4.959784783e-05f, -1.651820586e-03f, -1.450526321e-03f, +1.690127679e-04f, +1.403805461e-03f, +1.078637439e-03f, -2.270146915e-04f, -1.052362092e-03f, -6.985620449e-04f, +2.203717640e-04f, +6.851140893e-04f, +3.837428672e-04f, -1.688864313e-04f, -3.764907428e-04f, -1.700139223e-04f, +1.026029163e-04f, +1.653056012e-04f, +5.415123641e-05f, -4.692069522e-05f, -5.098474714e-05f, -8.012240443e-06f, +1.355093038e-05f, + /* 5, 2 (48) */ + -1.222086353e-04f, +5.124274402e-04f, +1.186885931e-03f, +8.289292249e-04f, -1.057015512e-03f, -3.166674574e-03f, -2.874316912e-03f, +1.148751496e-03f, +6.378952979e-03f, +7.288293598e-03f, +3.719014876e-04f, -1.062542035e-02f, -1.537903583e-02f, -5.506723678e-03f, +1.518350718e-02f, +2.925407180e-02f, +1.816164035e-02f, -1.873957433e-02f, -5.521624002e-02f, -5.104195788e-02f, +1.856075873e-02f, +1.383451080e-01f, +2.547700737e-01f, +3.068710639e-01f, +2.658419868e-01f, +1.544316738e-01f, +3.159765179e-02f, -4.604943438e-02f, -5.770703299e-02f, -2.411458308e-02f, +1.467507238e-02f, +2.950074453e-02f, +1.775157319e-02f, -3.261000612e-03f, -1.501597835e-02f, -1.179906927e-02f, -9.493153096e-04f, +6.858183098e-03f, +6.846701154e-03f, +1.834798993e-03f, -2.566471096e-03f, -3.314833973e-03f, -1.356918523e-03f, +6.700680342e-04f, +1.220752556e-03f, +6.137529580e-04f, -6.977961571e-05f, -2.518281858e-04f, + -1.168990126e-05f, -2.515052909e-05f, -1.118758209e-05f, +3.558827568e-05f, +7.427608600e-05f, +4.337485293e-05f, -6.699255526e-05f, -1.681947169e-04f, -1.283443613e-04f, +8.672964061e-05f, +3.194005173e-04f, +3.099122062e-04f, -5.201607505e-05f, -5.327630927e-04f, -6.594704999e-04f, -1.280622791e-04f, +8.035542069e-04f, +1.344460098e-03f, +7.282843910e-04f, -1.078909526e-03f, -3.131100912e-03f, -4.033246478e-03f, -2.936192693e-03f, -2.390603885e-04f, +2.591910390e-03f, +3.999619503e-03f, +3.380974317e-03f, +1.418218264e-03f, -5.110560018e-04f, -1.336872173e-03f, -9.374522451e-04f, -6.688377871e-06f, +6.210722581e-04f, +5.881082002e-04f, +1.300418210e-04f, -2.750553076e-04f, -3.398665344e-04f, -1.283627894e-04f, +1.046099163e-04f, +1.740533367e-04f, +8.685479693e-05f, -3.028666972e-05f, -7.529293449e-05f, -4.378881732e-05f, +5.570491509e-06f, +2.536000083e-05f, +1.451548917e-05f, -1.420241427e-06f, + +6.040257344e-04f, -2.007596483e-04f, -2.000876256e-03f, -2.448367636e-03f, +8.775047576e-04f, +5.992439012e-03f, +6.176775576e-03f, -2.522656203e-03f, -1.319908707e-02f, -1.197008873e-02f, +5.587071319e-03f, +2.368006150e-02f, +1.922829162e-02f, -1.020477253e-02f, -3.625312446e-02f, -2.656902443e-02f, +1.593661521e-02f, +4.855770816e-02f, +3.222159770e-02f, -2.172626967e-02f, -5.770177914e-02f, -3.467430652e-02f, +2.616575485e-02f, +6.127603297e-02f, +3.327303618e-02f, -2.800022766e-02f, -5.828670715e-02f, -2.847481101e-02f, +2.664599159e-02f, +4.955742841e-02f, +2.163504720e-02f, -2.245697029e-02f, -3.739940617e-02f, -1.444876228e-02f, +1.659133356e-02f, +2.471300995e-02f, +8.330834633e-03f, -1.053979013e-02f, -1.395516144e-02f, -4.018496808e-03f, +5.554631442e-03f, +6.436363048e-03f, +1.527651340e-03f, -2.256768871e-03f, -2.197724601e-03f, -3.980404175e-04f, +5.791264463e-04f, +4.029212880e-04f, + +3.344956610e-06f, +4.640953171e-05f, +5.267340081e-05f, -3.758471417e-05f, -1.573524280e-04f, -1.241372887e-04f, +1.313100623e-04f, +3.683217620e-04f, +2.211971578e-04f, -3.132897930e-04f, -6.846175414e-04f, -3.194624803e-04f, +5.919866399e-04f, +1.071151816e-03f, +3.837239896e-04f, -9.404822960e-04f, -1.453587369e-03f, -3.829219223e-04f, +1.294791911e-03f, +1.739328359e-03f, +3.061321530e-04f, -1.570440944e-03f, -1.851046690e-03f, -1.704095971e-04f, +1.692393190e-03f, +1.757402499e-03f, +1.521820702e-05f, -1.624997983e-03f, -1.485784786e-03f, +1.142841741e-04f, +1.387108823e-03f, +1.110693183e-03f, -1.863643975e-04f, -1.044477917e-03f, -7.238290583e-04f, +1.942488568e-04f, +6.831917134e-04f, +4.007926665e-04f, -1.548057940e-04f, -3.774464191e-04f, -1.795852487e-04f, +9.662174551e-05f, +1.668522344e-04f, +5.835793373e-05f, -4.521350195e-05f, -5.201905875e-05f, -9.250480050e-06f, +1.342746520e-05f, + /* 5, 3 (48) */ + -1.338985365e-04f, +4.872769112e-04f, +1.175698349e-03f, +8.645175005e-04f, -9.827394263e-04f, -3.123299721e-03f, -2.941309468e-03f, +9.805567796e-04f, +6.250608617e-03f, +7.375023239e-03f, +6.913020049e-04f, -1.031550814e-02f, -1.543105190e-02f, -6.039486771e-03f, +1.452403668e-02f, +2.912600952e-02f, +1.896519456e-02f, -1.739511424e-02f, -5.448795563e-02f, -5.212086740e-02f, +1.542965782e-02f, +1.343118615e-01f, +2.518338810e-01f, +3.066320035e-01f, +2.684338972e-01f, +1.584312933e-01f, +3.497862611e-02f, -4.463121611e-02f, -5.821808899e-02f, -2.545145526e-02f, +1.373762014e-02f, +2.949405615e-02f, +1.837264545e-02f, -2.672892411e-03f, -1.488593653e-02f, -1.207412457e-02f, -1.289181844e-03f, +6.729820308e-03f, +6.951311070e-03f, +2.008852329e-03f, -2.479616299e-03f, -3.345120643e-03f, -1.432211457e-03f, +6.262792169e-04f, +1.226323047e-03f, +6.391129589e-04f, -5.526412654e-05f, -2.532484272e-04f, + -1.112218308e-05f, -2.501995817e-05f, -1.220383718e-05f, +3.392327012e-05f, +7.384890615e-05f, +4.573690588e-05f, -6.299002298e-05f, -1.665700430e-04f, -1.325320967e-04f, +7.845374324e-05f, +3.145290927e-04f, +3.157628388e-04f, -3.677571941e-05f, -5.205538694e-04f, -6.650617683e-04f, -1.537666687e-04f, +7.755117888e-04f, +1.342328824e-03f, +7.680377050e-04f, -1.011719708e-03f, -3.077447539e-03f, -4.033746599e-03f, -3.000212120e-03f, -3.344899904e-04f, +2.518472968e-03f, +3.986626796e-03f, +3.426985803e-03f, +1.486444859e-03f, -4.640413452e-04f, -1.331601571e-03f, -9.627619319e-04f, -3.474447002e-05f, +6.112962379e-04f, +5.979302622e-04f, +1.459156977e-04f, -2.669785256e-04f, -3.431293195e-04f, -1.366826693e-04f, +9.931963539e-05f, +1.747478114e-04f, +9.076638712e-05f, -2.742344173e-05f, -7.526146721e-05f, -4.538948299e-05f, +4.344255180e-06f, +2.530803227e-05f, +1.507217817e-05f, -1.071067014e-06f, + +6.073706910e-04f, -1.543501166e-04f, -1.948202855e-03f, -2.485952350e-03f, +7.201523296e-04f, +5.868301724e-03f, +6.308085639e-03f, -2.154334441e-03f, -1.297788992e-02f, -1.228337852e-02f, +4.902453778e-03f, +2.336059902e-02f, +1.982027826e-02f, -9.133620712e-03f, -3.586940047e-02f, -2.750950673e-02f, +1.448302784e-02f, +4.817478624e-02f, +3.351638961e-02f, -1.998694131e-02f, -5.739564699e-02f, -3.624474747e-02f, +2.431470816e-02f, +6.110562337e-02f, +3.496542937e-02f, -2.624282516e-02f, -5.827148895e-02f, -3.009980900e-02f, +2.516020681e-02f, +4.967171258e-02f, +2.302215602e-02f, -2.134627711e-02f, -3.758577056e-02f, -1.549324019e-02f, +1.586750450e-02f, +2.490725881e-02f, +9.014026346e-03f, -1.013899746e-02f, -1.410996723e-02f, -4.395943227e-03f, +5.375046193e-03f, +6.532984794e-03f, +1.694503575e-03f, -2.198410938e-03f, -2.242938103e-03f, -4.500594762e-04f, +5.698759662e-04f, +4.163487532e-04f, + +2.255182080e-06f, +4.517060431e-05f, +5.384462416e-05f, -3.353389702e-05f, -1.549523100e-04f, -1.289089615e-04f, +1.215939488e-04f, +3.652364931e-04f, +2.332175677e-04f, -2.952331641e-04f, -6.824913432e-04f, -3.427633103e-04f, +5.641477479e-04f, +1.072684480e-03f, +4.212189541e-04f, -9.036924671e-04f, -1.461753968e-03f, -4.348483358e-04f, +1.252436269e-03f, +1.756162112e-03f, +3.692150440e-04f, -1.527698035e-03f, -1.876540307e-03f, -2.382971639e-04f, +1.654672260e-03f, +1.789122022e-03f, +8.015822091e-05f, -1.596244569e-03f, -1.519477402e-03f, +5.917795491e-05f, +1.368730061e-03f, +1.141666093e-03f, -1.452122113e-04f, -1.035315582e-03f, -7.484738657e-04f, +1.676376893e-04f, +6.804362127e-04f, +4.175690386e-04f, -1.403480063e-04f, -3.779516098e-04f, -1.890884151e-04f, +9.040859955e-05f, +1.682107523e-04f, +6.257985583e-05f, -4.339842234e-05f, -5.300382693e-05f, -1.051475348e-05f, +1.327219129e-05f, + /* 5, 4 (48) */ + -1.450207196e-04f, +4.622569530e-04f, +1.163494512e-03f, +8.984407707e-04f, -9.088905201e-04f, -3.077562815e-03f, -3.004299491e-03f, +8.139867365e-04f, +6.118076521e-03f, +7.453476982e-03f, +1.005831098e-03f, -9.999745306e-03f, -1.546782762e-02f, -6.560040640e-03f, +1.385897491e-02f, +2.897224286e-02f, +1.974070635e-02f, -1.605278541e-02f, -5.371991792e-02f, -5.313258711e-02f, +1.235221028e-02f, +1.302781149e-01f, +2.488336689e-01f, +3.062975135e-01f, +2.709523702e-01f, +1.624179201e-01f, +3.840561191e-02f, -4.314477126e-02f, -5.868213034e-02f, -2.678305683e-02f, +1.277485821e-02f, +2.945931168e-02f, +1.898394169e-02f, -2.074962149e-03f, -1.474002084e-02f, -1.234110310e-02f, -1.632311164e-03f, +6.593137639e-03f, +7.050630706e-03f, +2.183600141e-03f, -2.388849912e-03f, -3.372544084e-03f, -1.507472925e-03f, +5.808897339e-04f, +1.230667302e-03f, +6.644209911e-04f, -4.019194836e-05f, -2.543194942e-04f, + -1.055546563e-05f, -2.486166402e-05f, -1.318317613e-05f, +3.225469128e-05f, +7.335106579e-05f, +4.801096373e-05f, -5.898747491e-05f, -1.648029922e-04f, -1.365292130e-04f, +7.021336113e-05f, +3.094164336e-04f, +3.212365825e-04f, -2.168771654e-05f, -5.080010344e-04f, -6.699624954e-04f, -1.790119753e-04f, +7.471176191e-04f, +1.339019774e-03f, +8.065241007e-04f, -9.448540396e-04f, -3.022665690e-03f, -4.032192029e-03f, -3.062539108e-03f, -4.297252058e-04f, +2.443598970e-03f, +3.971537433e-03f, +3.471584587e-03f, +1.554688781e-03f, -4.158831038e-04f, -1.325049194e-03f, -9.875129711e-04f, -6.311996246e-05f, +6.008217499e-04f, +6.073020941e-04f, +1.618459476e-04f, -2.585402193e-04f, -3.460987533e-04f, -1.449806409e-04f, +9.385450125e-05f, +1.752756536e-04f, +9.464722144e-05f, -2.448221192e-05f, -7.514833557e-05f, -4.697204714e-05f, +3.085449097e-06f, +2.522316587e-05f, +1.562404701e-05f, -7.084341628e-07f, + +6.096258730e-04f, -1.091795123e-04f, -1.894358231e-03f, -2.519486247e-03f, +5.652000196e-04f, +5.739392762e-03f, +6.429679587e-03f, -1.789097948e-03f, -1.274467235e-02f, -1.257861169e-02f, +4.219962434e-03f, +2.301783571e-02f, +2.038442601e-02f, -8.060936232e-03f, -3.544818151e-02f, -2.841319919e-02f, +1.302127387e-02f, +4.773993790e-02f, +3.476882588e-02f, -1.823077919e-02f, -5.702643195e-02f, -3.777244550e-02f, +2.243816785e-02f, +6.086732621e-02f, +3.662010163e-02f, -2.445370314e-02f, -5.819133072e-02f, -3.169605357e-02f, +2.364072940e-02f, +4.973089053e-02f, +2.439088608e-02f, -2.020461102e-02f, -3.773098278e-02f, -1.652855578e-02f, +1.511903063e-02f, +2.507489650e-02f, +9.694462559e-03f, -9.721428422e-03f, -1.425031524e-02f, -4.773894837e-03f, +5.185957778e-03f, +6.623393393e-03f, +1.862714327e-03f, -2.135831082e-03f, -2.286336525e-03f, -5.030633032e-04f, +5.593612128e-04f, +4.296209445e-04f, + +1.198194503e-06f, +4.389935025e-05f, +5.491041683e-05f, -2.952917350e-05f, -1.523998194e-04f, -1.334314370e-04f, +1.118869784e-04f, +3.617528960e-04f, +2.447956822e-04f, -2.770470667e-04f, -6.795852465e-04f, -3.654300590e-04f, +5.359045371e-04f, +1.072965264e-03f, +4.579610073e-04f, -8.660978565e-04f, -1.468205161e-03f, -4.860380252e-04f, +1.208818120e-03f, +1.770948110e-03f, +4.317326185e-04f, -1.483288570e-03f, -1.899884136e-03f, -3.059088574e-04f, +1.615048053e-03f, +1.818853291e-03f, +1.451470514e-04f, -1.565588232e-03f, -1.551559172e-03f, +3.756894563e-06f, +1.348681970e-03f, +1.171513123e-03f, -1.036034182e-04f, -1.024876061e-03f, -7.724614896e-04f, +1.405657006e-04f, +6.768420109e-04f, +4.340480528e-04f, -1.255262157e-04f, -3.779992129e-04f, -1.985100593e-04f, +8.396766904e-05f, +1.693757007e-04f, +6.681136497e-05f, -4.147559932e-05f, -5.393619212e-05f, -1.180365334e-05f, +1.308435842e-05f, + /* 5, 5 (48) */ + -1.555761852e-04f, +4.373952890e-04f, +1.150311336e-03f, +9.306954619e-04f, -8.355394543e-04f, -3.029551851e-03f, -3.063286966e-03f, +6.491837443e-04f, +5.981547307e-03f, +7.523690343e-03f, +1.315247531e-03f, -9.678508723e-03f, -1.548951534e-02f, -7.068041675e-03f, +1.318901241e-02f, +2.879323088e-02f, +2.048782397e-02f, -1.471376564e-02f, -5.291339382e-02f, -5.407744115e-02f, +9.329544592e-03f, +1.262459229e-01f, +2.457711298e-01f, +3.058677883e-01f, +2.733959691e-01f, +1.663894575e-01f, +4.187719650e-02f, -4.159008247e-02f, -5.909801344e-02f, -2.810810602e-02f, +1.178734524e-02f, +2.939619172e-02f, +1.958476344e-02f, -1.467660055e-03f, -1.457817489e-02f, -1.259964332e-02f, -1.978409917e-03f, +6.448156998e-03f, +7.144485207e-03f, +2.358875794e-03f, -2.294202691e-03f, -3.397026296e-03f, -1.582621260e-03f, +5.339176868e-04f, +1.233752751e-03f, +6.896441570e-04f, -2.456790136e-05f, -2.550279284e-04f, + -9.990514341e-06f, -2.467647407e-05f, -1.412519415e-05f, +3.058450494e-05f, +7.278435928e-05f, +5.019605233e-05f, -5.498908266e-05f, -1.628974510e-04f, -1.403343294e-04f, +6.201620534e-05f, +3.040706252e-04f, +3.263327849e-04f, -6.764669129e-06f, -4.951205242e-04f, -6.741762959e-04f, -2.037806323e-04f, +7.184013214e-04f, +1.334551005e-03f, +8.437302523e-04f, -8.783544077e-04f, -2.966798390e-03f, -4.028594211e-03f, -3.123141668e-03f, -5.247107342e-04f, +2.367329218e-03f, +3.954350967e-03f, +3.514732883e-03f, +1.622904620e-03f, -3.666031161e-04f, -1.317203614e-03f, -1.011676179e-03f, -9.179265262e-05f, +5.896502377e-04f, +6.162093691e-04f, +1.778178744e-04f, -2.497441538e-04f, -3.487681447e-04f, -1.532480920e-04f, +8.821764323e-05f, +1.756338820e-04f, +9.849273735e-05f, -2.146486268e-05f, -7.495222276e-05f, -4.853434916e-05f, +1.794912561e-06f, +2.510476735e-05f, +1.617020805e-05f, -3.325513140e-07f, + +6.108240676e-04f, -6.528016204e-05f, -1.839447814e-03f, -2.549015421e-03f, +4.128002002e-04f, +5.605961325e-03f, +6.541566566e-03f, -1.427345052e-03f, -1.249987667e-02f, -1.285565876e-02f, +3.540377188e-03f, +2.265240565e-02f, +2.092033054e-02f, -6.987970968e-03f, -3.499022051e-02f, -2.927929705e-02f, +1.155306871e-02f, +4.725389987e-02f, +3.597764400e-02f, -1.645983108e-02f, -5.659469933e-02f, -3.925573407e-02f, +2.053828372e-02f, +6.056141735e-02f, +3.823514968e-02f, -2.263484985e-02f, -5.804618367e-02f, -3.326164180e-02f, +2.208917023e-02f, +4.973464743e-02f, +2.573956805e-02f, -1.903309789e-02f, -3.783458619e-02f, -1.755343184e-02f, +1.434656914e-02f, +2.521546220e-02f, +1.037130457e-02f, -9.287380369e-03f, -1.437584146e-02f, -5.151894049e-03f, +4.987447719e-03f, +6.707361062e-03f, +2.032090028e-03f, -2.069019717e-03f, -2.327812125e-03f, -5.569994953e-04f, +5.475575594e-04f, +4.427053029e-04f, + +1.748371843e-07f, +4.259860619e-05f, +5.587170545e-05f, -2.557515028e-05f, -1.497013158e-04f, -1.377031470e-04f, +1.022014149e-04f, +3.578810928e-04f, +2.559229908e-04f, -2.587552704e-04f, -6.759112251e-04f, -3.874417647e-04f, +5.072942109e-04f, +1.072003745e-03f, +4.939121784e-04f, -8.277475240e-04f, -1.472942613e-03f, -5.364347167e-04f, +1.163992963e-03f, +1.783675417e-03f, +4.936137165e-04f, -1.437266567e-03f, -1.921052916e-03f, -3.731664260e-04f, +1.573565251e-03f, +1.846559109e-03f, +2.101093419e-04f, -1.533059196e-03f, -1.581986859e-03f, -5.191557569e-05f, +1.326979411e-03f, +1.200192326e-03f, -6.158416111e-05f, -1.013161888e-03f, -7.957574627e-04f, +1.130611588e-04f, +6.724045223e-04f, +4.502058804e-04f, -1.103542023e-04f, -3.775826245e-04f, -2.078367251e-04f, +7.730352398e-05f, +1.703417977e-04f, +7.104669728e-05f, -3.944534245e-05f, -5.481331037e-05f, -1.311569267e-05f, +1.286325678e-05f, + /* 5, 6 (48) */ + -1.655666996e-04f, +4.127188149e-04f, +1.136186142e-03f, +9.612799669e-04f, -7.627550950e-04f, -2.979355799e-03f, -3.118276048e-03f, +4.862862933e-04f, +5.841212978e-03f, +7.585706549e-03f, +1.619318156e-03f, -9.352175938e-03f, -1.549628001e-02f, -7.563162199e-03f, +1.251483612e-02f, +2.858945025e-02f, +2.120622529e-02f, -1.337921463e-02f, -5.206966357e-02f, -5.495579556e-02f, +6.362746202e-03f, +1.222173287e-01f, +2.426479881e-01f, +3.053430776e-01f, +2.757632984e-01f, +1.703438085e-01f, +4.539192938e-02f, -3.996717785e-02f, -5.946461656e-02f, -2.942530964e-02f, +1.077566906e-02f, +2.930439907e-02f, +2.017441367e-02f, -8.514506861e-04f, -1.440035701e-02f, -1.284938747e-02f, -2.327178061e-03f, +6.294908906e-03f, +7.232702850e-03f, +2.534509676e-03f, -2.195709953e-03f, -3.418491159e-03f, -1.657573483e-03f, +4.853833376e-04f, +1.235547664e-03f, +7.147489243e-04f, -8.397693308e-06f, -2.553604797e-04f, + -9.428075830e-06f, -2.446523357e-05f, -1.502953948e-05f, +2.891464378e-05f, +7.215062819e-05f, +5.229130969e-05f, -5.099895153e-05f, -1.608573953e-04f, -1.439462797e-04f, +5.386984442e-05f, +2.984998835e-04f, +3.310511696e-04f, +7.981125454e-06f, -4.819284022e-04f, -6.777073783e-04f, -2.280557008e-04f, +6.893924609e-04f, +1.328941313e-03f, +8.796439193e-04f, -8.122621241e-04f, -2.909889168e-03f, -4.022965919e-03f, -3.181989019e-03f, -6.193914536e-04f, +2.289705519e-03f, +3.935068360e-03f, +3.556393705e-03f, +1.691046668e-03f, -3.162242503e-04f, -1.308054313e-03f, -1.035222544e-03f, -1.207398156e-04f, +5.777838078e-04f, +6.246380358e-04f, +1.938165692e-04f, -2.405944913e-04f, -3.511310192e-04f, -1.614763310e-04f, +8.241240968e-05f, +1.758196513e-04f, +1.022983425e-04f, -1.837338947e-05f, -7.467188368e-05f, -5.007421371e-05f, +4.735395420e-07f, +2.495223275e-05f, +1.670976246e-05f, +5.634856882e-08f, + +6.109989047e-04f, -2.268155584e-05f, -1.783576109e-03f, -2.574590571e-03f, +2.630988845e-04f, +5.468258178e-03f, +6.643767981e-03f, -1.069463959e-03f, -1.224395368e-02f, -1.311441403e-02f, +2.864465963e-03f, +2.226496388e-02f, +2.142762475e-02f, -5.915967223e-03f, -3.449630833e-02f, -3.010704457e-02f, +1.008012610e-02f, +4.671746516e-02f, +3.714163696e-02f, -1.467615567e-02f, -5.610108561e-02f, -4.069300064e-02f, +1.861723080e-02f, +6.018825092e-02f, +3.980871493e-02f, -2.078829074e-02f, -5.783607433e-02f, -3.479470099e-02f, +2.050718337e-02f, +4.968273185e-02f, +2.706654746e-02f, -1.783290557e-02f, -3.789617035e-02f, -1.856659372e-02f, +1.355081168e-02f, +2.532852336e-02f, +1.104370909e-02f, -8.837174489e-03f, -1.448619566e-02f, -5.529476674e-03f, +4.779610994e-03f, +6.784664586e-03f, +2.202431825e-03f, -1.997973020e-03f, -2.367257467e-03f, -6.118128057e-04f, +5.344418668e-04f, +4.555685597e-04f, + -8.141264825e-07f, +4.127118779e-05f, +5.672955354e-05f, -2.167626924e-05f, -1.468632456e-04f, -1.417228871e-04f, +9.254930693e-05f, +3.536315659e-04f, +2.665916643e-04f, -2.403814012e-04f, -6.714820789e-04f, -4.087784712e-04f, +4.783540991e-04f, +1.069810928e-03f, +5.290357102e-04f, -7.886911375e-04f, -1.475970030e-03f, -5.859833326e-04f, +1.118017518e-03f, +1.794335564e-03f, +5.547880913e-04f, -1.389687861e-03f, -1.940023976e-03f, -4.399920438e-04f, +1.530270760e-03f, +1.872204622e-03f, +2.749696122e-04f, -1.498689992e-03f, -1.610719037e-03f, -1.077754521e-04f, +1.303639304e-03f, +1.227662917e-03f, -1.920138852e-05f, -1.000177170e-03f, -8.183278745e-04f, +8.515313225e-05f, +6.671201672e-04f, +4.660188261e-04f, -9.484636779e-05f, -3.766957546e-04f, -2.170548800e-04f, +7.042111331e-05f, +1.711039439e-04f, +7.527996901e-05f, -3.730813087e-05f, -5.563235826e-05f, -1.444930562e-05f, +1.260821934e-05f, + /* 5, 7 (48) */ + -1.749947754e-04f, +3.882535813e-04f, +1.121156602e-03f, +9.901946107e-04f, -6.906044669e-04f, -2.927064489e-03f, -3.169275000e-03f, +3.254288980e-04f, +5.697266698e-03f, +7.639576393e-03f, +1.917818040e-03f, -9.021124769e-03f, -1.548829888e-02f, -8.045090601e-03f, +1.183712874e-02f, +2.836139455e-02f, +2.189561775e-02f, -1.205027332e-02f, -5.119001965e-02f, -5.576805768e-02f, +3.452857034e-03f, +1.181943628e-01f, +2.394659991e-01f, +3.047236861e-01f, +2.780530039e-01f, +1.742788769e-01f, +4.894832309e-02f, -3.827613119e-02f, -5.978084081e-02f, -3.073336395e-02f, +9.740446513e-03f, +2.918365925e-02f, +2.075219748e-02f, -2.268126503e-04f, -1.420654044e-02f, -1.308998196e-02f, -2.678309081e-03f, +6.133432575e-03f, +7.315115260e-03f, +2.710329328e-03f, -2.093411611e-03f, -3.436864548e-03f, -1.732245367e-03f, +4.353091239e-04f, +1.236021203e-03f, +7.397011571e-04f, +8.312069153e-06f, -2.553041311e-04f, + -8.868877284e-06f, -2.422880418e-05f, -1.589591286e-05f, +2.724700567e-05f, +7.145175848e-05f, +5.429598519e-05f, -4.702111702e-05f, -1.586868851e-04f, -1.473641109e-04f, +4.578169855e-05f, +2.927125456e-04f, +3.353918321e-04f, +2.253768358e-05f, -4.684408418e-04f, -6.805605342e-04f, -2.518208778e-04f, +6.601205199e-04f, +1.322210214e-03f, +9.142539476e-04f, -7.466178985e-04f, -2.851982022e-03f, -4.015321239e-03f, -3.239051608e-03f, -7.137124599e-04f, +2.210770639e-03f, +3.913691982e-03f, +3.596530898e-03f, +1.759068952e-03f, -2.647703935e-04f, -1.297591698e-03f, -1.058123249e-03f, -1.499382191e-04f, +5.652252355e-04f, +6.325743348e-04f, +2.098269225e-04f, -2.310957910e-04f, -3.531811281e-04f, -1.696565939e-04f, +7.644236730e-05f, +1.758302573e-04f, +1.060594193e-04f, -1.520990028e-05f, -7.430614754e-05f, -5.158945309e-05f, -8.777214654e-07f, +2.476498981e-05f, +1.724180117e-05f, +4.580078570e-07f, + +6.101847783e-04f, +1.858963195e-05f, -1.726846555e-03f, -2.596266840e-03f, +1.162356389e-04f, +5.326535291e-03f, +6.736317288e-03f, -7.158323930e-04f, -1.197736201e-02f, -1.335479543e-02f, +2.192983884e-03f, +2.185618541e-02f, +2.190597885e-02f, -4.846156295e-03f, -3.396727262e-02f, -3.089573571e-02f, +8.604156065e-03f, +4.613148183e-02f, +3.825965448e-02f, -1.288182010e-02f, -5.554629752e-02f, -4.208268850e-02f, +1.667720682e-02f, +5.974825888e-02f, +4.133898570e-02f, -1.891608611e-02f, -5.756110472e-02f, -3.629339099e-02f, +1.889646434e-02f, +4.957495640e-02f, +2.837018677e-02f, -1.660524265e-02f, -3.791537174e-02f, -1.956677089e-02f, +1.273248380e-02f, +2.541367649e-02f, +1.171082926e-02f, -8.371155662e-03f, -1.458104203e-02f, -5.906172429e-03f, +4.562556114e-03f, +6.855085700e-03f, +2.373535769e-03f, -1.922693051e-03f, -2.404565598e-03f, -6.674451639e-04f, +5.199925611e-04f, +4.681767790e-04f, + -1.768012448e-06f, +3.991988566e-05f, +5.748515713e-05f, -1.783680397e-05f, -1.438921311e-04f, -1.454898128e-04f, +8.294247518e-05f, +3.490151391e-04f, +2.767945562e-04f, -2.219489135e-04f, -6.663114089e-04f, -4.294212432e-04f, +4.491216100e-04f, +1.066399226e-03f, +5.632960958e-04f, -7.489789079e-04f, -1.477293135e-03f, -6.346300523e-04f, +1.070949660e-03f, +1.802922556e-03f, +6.151864918e-04f, -1.340610040e-03f, -1.956777258e-03f, -5.063084046e-04f, +1.485213656e-03f, +1.895757366e-03f, +3.396523490e-04f, -1.462515425e-03f, -1.637716154e-03f, -1.637582340e-04f, +1.278680614e-03f, +1.253885324e-03f, +2.349719803e-05f, -9.859275928e-04f, -8.401394188e-04f, +5.687146046e-05f, +6.609863865e-04f, +4.814633604e-04f, -7.901772440e-05f, -3.753330419e-04f, -2.261509316e-04f, +6.332576399e-05f, +1.716572328e-04f, +7.950518296e-05f, -3.506461595e-05f, -5.639053797e-05f, -1.580284829e-05f, +1.231862419e-05f, + /* 5, 8 (48) */ + -1.838636527e-04f, +3.640247771e-04f, +1.105260690e-03f, +1.017441616e-03f, -6.191527084e-04f, -2.872768504e-03f, -3.216296117e-03f, +1.667420129e-04f, +5.549902587e-03f, +7.685358092e-03f, +2.210530586e-03f, -8.685732937e-03f, -1.546576120e-02f, -8.513531443e-03f, +1.115656820e-02f, +2.810957367e-02f, +2.255573827e-02f, -1.072806311e-02f, -5.027576570e-02f, -5.651467558e-02f, +6.008750117e-04f, +1.141790415e-01f, +2.362269475e-01f, +3.040099737e-01f, +2.802637745e-01f, +1.781925688e-01f, +5.254485398e-02f, -3.651706223e-02f, -6.004561120e-02f, -3.203095565e-02f, +8.682323264e-03f, +2.903372103e-02f, +2.131742272e-02f, +4.057616846e-04f, -1.399671352e-02f, -1.332107775e-02f, -3.031490209e-03f, +5.963775981e-03f, +7.391557627e-03f, +2.886159585e-03f, -1.987352192e-03f, -3.452074449e-03f, -1.806551514e-03f, +3.837196708e-04f, +1.235143482e-03f, +7.644661469e-04f, +2.555387032e-05f, -2.548461232e-04f, + -8.313625809e-06f, -2.396806258e-05f, -1.672406700e-05f, +2.558345201e-05f, +7.068967762e-05f, +5.620943877e-05f, -4.305954150e-05f, -1.563900589e-04f, -1.505870813e-04f, +3.775903377e-05f, +2.867170601e-04f, +3.393552354e-04f, +3.689334343e-05f, -4.546741100e-04f, -6.827411283e-04f, -2.750605043e-04f, +6.306148736e-04f, +1.314377916e-03f, +9.475502706e-04f, -6.814618109e-04f, -2.793121386e-03f, -4.005675560e-03f, -3.294301130e-03f, -8.076191064e-04f, +2.130568273e-03f, +3.890225612e-03f, +3.635109170e-03f, +1.826925267e-03f, -2.122664403e-04f, -1.285807117e-03f, -1.080349702e-03f, -1.793641383e-04f, +5.519779693e-04f, +6.400048148e-04f, +2.258336362e-04f, -2.212530097e-04f, -3.549124572e-04f, -1.777800534e-04f, +7.031130021e-05f, +1.756631414e-04f, +1.097713294e-04f, -1.197661495e-05f, -7.385392033e-05f, -5.307786957e-05f, -2.257867657e-06f, +2.454249926e-05f, +1.776540592e-05f, +8.721441469e-07f, + +6.084167658e-04f, +5.850951761e-05f, -1.669361398e-03f, -2.614103644e-03f, -2.765649223e-05f, +5.181045478e-03f, +6.819259763e-03f, -3.668172540e-04f, -1.170056746e-02f, -1.357674434e-02f, +1.526672475e-03f, +2.142676417e-02f, +2.235510046e-02f, -3.779757068e-03f, -3.340397652e-02f, -3.164471462e-02f, +7.126862931e-03f, +4.549685177e-02f, +3.933060414e-02f, -1.107889755e-02f, -5.493111103e-02f, -4.342329854e-02f, +1.472042957e-02f, +5.924195048e-02f, +4.282419935e-02f, -1.702032875e-02f, -5.722145237e-02f, -3.775590641e-02f, +1.725874818e-02f, +4.941119817e-02f, +2.964886738e-02f, -1.535135733e-02f, -3.789187454e-02f, -2.055269849e-02f, +1.189234439e-02f, +2.547054795e-02f, +1.237181565e-02f, -7.889692302e-03f, -1.466005975e-02f, -6.281505470e-03f, +4.336405182e-03f, +6.918411464e-03f, +2.545193002e-03f, -1.843187868e-03f, -2.439630214e-03f, -7.238357019e-04f, +5.041897128e-04f, +4.804954032e-04f, + -2.686215319e-06f, +3.854746139e-05f, +5.813984021e-05f, -1.406085667e-05f, -1.407945597e-04f, -1.490034349e-04f, +7.339249953e-05f, +3.440429587e-04f, +2.865252041e-04f, -2.034810611e-04f, -6.604135915e-04f, -4.493521809e-04f, +4.196341833e-04f, +1.061782430e-03f, +5.966591145e-04f, -7.086615254e-04f, -1.476919655e-03f, -6.823223727e-04f, +1.022848338e-03f, +1.809432872e-03f, +6.747407438e-04f, -1.290092373e-03f, -1.971295339e-03f, -5.720388143e-04f, +1.438445122e-03f, +1.917187310e-03f, +4.040820973e-04f, -1.424572536e-03f, -1.662940582e-03f, -2.197990000e-04f, +1.252124341e-03f, +1.278821250e-03f, +6.646319794e-05f, -9.704204222e-04f, -8.611594400e-04f, +2.824672336e-05f, +6.540016554e-04f, +4.965161516e-04f, -6.288388262e-05f, -3.734894680e-04f, -2.351112459e-04f, +5.602317951e-05f, +1.719969615e-04f, +8.371623530e-05f, -3.271562375e-05f, -5.708508235e-05f, -1.717459974e-05f, +1.199389677e-05f, + /* 5, 9 (48) */ + -1.921772785e-04f, +3.400567146e-04f, +1.088536623e-03f, +1.043025068e-03f, -5.484630308e-04f, -2.816559065e-03f, -3.259355658e-03f, +1.035195406e-05f, +5.399315506e-03f, +7.723117125e-03f, +2.497247646e-03f, -8.346377701e-03f, -1.542886786e-02f, -8.968205553e-03f, +1.047382708e-02f, +2.783451316e-02f, +2.318635314e-02f, -9.413685192e-03f, -4.932821543e-02f, -5.719613739e-02f, -2.192246374e-03f, +1.101733660e-01f, +2.329326463e-01f, +3.032023546e-01f, +2.823943428e-01f, +1.820827945e-01f, +5.617996315e-02f, -3.469013697e-02f, -6.025787764e-02f, -3.331676276e-02f, +7.601973562e-03f, +2.885435689e-02f, +2.186940069e-02f, +1.045766499e-03f, -1.377087989e-02f, -1.354233076e-02f, -3.386402666e-03f, +5.785995928e-03f, +7.461868927e-03f, +3.061822726e-03f, -1.877580862e-03f, -3.464051064e-03f, -1.880405434e-03f, +3.306418012e-04f, +1.232885614e-03f, +7.890086462e-04f, +4.331927624e-05f, -2.539739791e-04f, + -7.763007857e-06f, -2.368389901e-05f, -1.751380594e-05f, +2.392580611e-05f, +6.986635178e-05f, +5.803114002e-05f, -3.911811091e-05f, -1.539711284e-04f, -1.536146589e-04f, +2.980895653e-05f, +2.805219773e-04f, +3.429422056e-04f, +5.103677261e-05f, -4.406445511e-04f, -6.842550870e-04f, -2.977595724e-04f, +6.009047662e-04f, +1.305465301e-03f, +9.795239089e-04f, -6.168332849e-04f, -2.733352090e-03f, -3.994045556e-03f, -3.347710544e-03f, -9.010570422e-04f, +2.049143015e-03f, +3.864674442e-03f, +3.672094116e-03f, +1.894569207e-03f, -1.587382800e-04f, -1.272692875e-03f, -1.101873560e-03f, -2.089933721e-04f, +5.380461344e-04f, +6.469163482e-04f, +2.418212370e-04f, -2.110715010e-04f, -3.563192359e-04f, -1.858378263e-04f, +6.402320883e-05f, +1.753158955e-04f, +1.134294190e-04f, -8.675864377e-06f, -7.331418729e-05f, -5.453725787e-05f, -3.665842204e-06f, +2.428425610e-05f, +1.827965033e-05f, +1.298450182e-06f, + +6.057305505e-04f, +9.705697900e-05f, -1.611221558e-03f, -2.628164501e-03f, -1.684510519e-04f, +5.032042043e-03f, +6.892652262e-03f, -2.277429524e-05f, -1.141404225e-02f, -1.378022540e-02f, +8.662588835e-04f, +2.097741199e-02f, +2.277473465e-02f, -2.717974638e-03f, -3.280731741e-02f, -3.235337614e-02f, +5.649943275e-03f, +4.481452940e-02f, +4.035345248e-02f, -9.269464674e-03f, -5.425637028e-02f, -4.471339091e-02f, +1.274913423e-02f, +5.866991166e-02f, +4.426264447e-02f, -1.510314144e-02f, -5.681737027e-02f, -3.918047895e-02f, +1.559580760e-02f, +4.919139917e-02f, +3.090099172e-02f, -1.407253608e-02f, -3.782541135e-02f, -2.152311891e-02f, +1.103118495e-02f, +2.549879468e-02f, +1.302581730e-02f, -7.393176150e-03f, -1.472294363e-02f, -6.654994938e-03f, +4.101293936e-03f, +6.974434643e-03f, +2.717189964e-03f, -1.759471632e-03f, -2.472345838e-03f, -7.809207842e-04f, +4.870151131e-04f, +4.924893000e-04f, + -3.568207542e-06f, +3.715664369e-05f, +5.869505005e-05f, -1.035235536e-05f, -1.375771734e-04f, -1.522636143e-04f, +6.391070698e-05f, +3.387264748e-04f, +2.957778293e-04f, -1.850008703e-04f, -6.538037531e-04f, -4.685544326e-04f, +3.899292429e-04f, +1.055975683e-03f, +6.290918642e-04f, -6.677900939e-04f, -1.474859304e-03f, -7.290091656e-04f, +9.737735056e-04f, +1.813865457e-03f, +7.333838297e-04f, -1.238195732e-03f, -1.983563450e-03f, -6.371072837e-04f, +1.390018391e-03f, +1.936466895e-03f, +4.681835516e-04f, -1.384900566e-03f, -1.686356674e-03f, -2.758324854e-04f, +1.223993503e-03f, +1.302433720e-03f, +1.096475668e-04f, -9.536645096e-04f, -8.813559796e-04f, -6.897906872e-07f, +6.461654956e-04f, +5.111540984e-04f, -4.646103780e-05f, -3.711605712e-04f, -2.439221649e-04f, +4.851943780e-05f, +1.721186407e-04f, +8.790692255e-05f, -3.026215731e-05f, -5.771326009e-05f, -1.856276310e-05f, +1.163351217e-05f, + /* 5,10 (48) */ + -1.999402864e-04f, +3.163728156e-04f, +1.071022817e-03f, +1.066950874e-03f, -4.785966790e-04f, -2.758527925e-03f, -3.298473769e-03f, -1.436191744e-04f, +5.245700847e-03f, +7.752926082e-03f, +2.777769623e-03f, -8.003435496e-03f, -1.537783108e-02f, -9.408850104e-03f, +9.789571990e-03f, +2.753675359e-02f, +2.378725791e-02f, -8.108219891e-03f, -4.834869152e-02f, -5.781297067e-02f, -4.925598463e-03f, +1.061793204e-01f, +2.295849358e-01f, +3.023012975e-01f, +2.844434858e-01f, +1.859474689e-01f, +5.985205727e-02f, -3.279556776e-02f, -6.041661592e-02f, -3.458945564e-02f, +6.500100002e-03f, +2.864536352e-02f, +2.240744682e-02f, +1.692682847e-03f, -1.352905865e-02f, -1.375340227e-02f, -3.742721902e-03f, +5.600158101e-03f, +7.525892136e-03f, +3.237138622e-03f, -1.764151443e-03f, -3.472726928e-03f, -1.953719622e-03f, +2.761045433e-04f, +1.229219772e-03f, +8.132929023e-04f, +6.159892657e-05f, -2.526755289e-04f, + -7.217688677e-06f, -2.337721593e-05f, -1.826498444e-05f, +2.227585175e-05f, +6.898378297e-05f, +5.976066708e-05f, -3.520063170e-05f, -1.514343731e-04f, -1.564465189e-04f, +2.193840843e-05f, +2.741359392e-04f, +3.461539264e-04f, +6.495697539e-05f, -4.263685705e-04f, -6.851088870e-04f, -3.199037319e-04f, +5.710192872e-04f, +1.295493904e-03f, +1.010166969e-03f, -5.527710620e-04f, -2.672719330e-03f, -3.980449169e-03f, -3.399254090e-03f, -9.939722517e-04f, +1.966540324e-03f, +3.837045076e-03f, +3.707452254e-03f, +1.961954204e-03f, -1.042127838e-04f, -1.258242246e-03f, -1.122666753e-03f, -2.388012594e-04f, +5.234345368e-04f, +6.532961475e-04f, +2.577740890e-04f, -2.005570148e-04f, -3.573959454e-04f, -1.938209822e-04f, +5.758230847e-05f, +1.747862663e-04f, +1.170290228e-04f, -5.310089543e-06f, -7.268601529e-05f, -5.596540759e-05f, -5.100534608e-06f, +2.398979095e-05f, +1.878360102e-05f, +1.736593812e-06f, + +6.021623429e-04f, +1.342136227e-04f, -1.552526508e-03f, -2.638516856e-03f, -3.060282253e-04f, +4.879778429e-03f, +6.956562969e-03f, +3.159521796e-04f, -1.111826442e-02f, -1.396522627e-02f, +2.124551303e-04f, +2.050885756e-02f, +2.316466389e-02f, -1.661998956e-03f, -3.217822554e-02f, -3.302116624e-02f, +4.175083971e-03f, +4.408552023e-02f, +4.132722598e-02f, -7.455599217e-03f, -5.352298645e-02f, -4.595158665e-02f, +1.076557078e-02f, +5.803280438e-02f, +4.565266287e-02f, -1.316667454e-02f, -5.634918672e-02f, -4.056537951e-02f, +1.390945093e-02f, +4.891556668e-02f, +3.212498523e-02f, -1.277010236e-02f, -3.771576378e-02f, -2.247678342e-02f, +1.014982897e-02f, +2.549810488e-02f, +1.367198280e-02f, -6.882022052e-03f, -1.476940467e-02f, -7.026155510e-03f, +3.857371771e-03f, +7.022954081e-03f, +2.889308604e-03f, -1.671564710e-03f, -2.502607995e-03f, -8.386340443e-04f, +4.684523500e-04f, +5.041228121e-04f, + -4.413538483e-06f, +3.575012473e-05f, +5.915235252e-05f, -6.715051279e-06f, -1.342466589e-04f, -1.552705567e-04f, +5.450816010e-05f, +3.330774214e-04f, +3.045473361e-04f, -1.665311122e-04f, -6.464977422e-04f, -4.870122059e-04f, +3.600441509e-04f, +1.048995450e-03f, +6.605627939e-04f, -6.264160665e-04f, -1.471123755e-03f, -7.746407335e-04f, +9.237860406e-04f, +1.816221724e-03f, +7.910499668e-04f, -1.184982522e-03f, -1.993569491e-03f, -7.014386192e-04f, +1.339988683e-03f, +1.953571069e-03f, +5.318816467e-04f, -1.343540912e-03f, -1.707930808e-03f, -3.317931603e-04f, +1.194313118e-03f, +1.324687140e-03f, +1.530006729e-04f, -9.356702918e-04f, -9.006978220e-04f, -2.990611803e-05f, +6.374784862e-04f, +5.253543618e-04f, -2.976595604e-05f, -3.683424601e-04f, -2.525700247e-04f, +4.082098868e-05f, +1.720180044e-04f, +9.207094896e-05f, -2.770539860e-05f, -5.827238086e-05f, -1.996546693e-05f, +1.123699732e-05f, + /* 5,11 (48) */ + -2.071579750e-04f, +2.929955996e-04f, +1.052757832e-03f, +1.089226726e-03f, -4.096128960e-04f, -2.698767258e-03f, -3.333674401e-03f, -2.950535474e-04f, +5.089254328e-03f, +7.774864490e-03f, +3.051905562e-03f, -7.657281569e-03f, -1.531287411e-02f, -9.835218674e-03f, +9.104463103e-03f, +2.721684986e-02f, +2.435827719e-02f, -6.812725987e-03f, -4.733852455e-02f, -5.836574174e-02f, -7.598317793e-03f, +1.021988712e-01f, +2.261856817e-01f, +3.013073253e-01f, +2.864100261e-01f, +1.897845140e-01f, +6.355950952e-02f, -3.083361355e-02f, -6.052082871e-02f, -3.584769789e-02f, +5.377433249e-03f, +2.840656226e-02f, +2.293088136e-02f, +2.345978995e-03f, -1.327128456e-02f, -1.395395928e-02f, -4.100117847e-03f, +5.406337119e-03f, +7.583474445e-03f, +3.411924888e-03f, -1.647122420e-03f, -3.478037017e-03f, -2.026405637e-03f, +2.201391358e-04f, +1.224119238e-03f, +8.372826932e-04f, +8.038252759e-05f, -2.509389351e-04f, + -6.678311802e-06f, -2.304892660e-05f, -1.897750724e-05f, +2.063533162e-05f, +6.804400617e-05f, +6.139770552e-05f, -3.131082784e-05f, -1.487841346e-04f, -1.590825413e-04f, +1.415416122e-05f, +2.675676699e-04f, +3.489919343e-04f, +7.864329961e-05f, -4.118626183e-04f, -6.853095436e-04f, -3.414792965e-04f, +5.409873483e-04f, +1.284485883e-03f, +1.039472643e-03f, -4.893131757e-04f, -2.611268631e-03f, -3.964905593e-03f, -3.448907308e-03f, -1.086311093e-03f, +1.882806499e-03f, +3.807345528e-03f, +3.741151049e-03f, +2.029033559e-03f, -4.871779011e-05f, -1.242449486e-03f, -1.142701516e-03f, -2.687626964e-04f, +5.081486657e-04f, +6.591317812e-04f, +2.736764066e-04f, -1.897156964e-04f, -3.581373279e-04f, -2.017205521e-04f, +5.099302774e-05f, +1.740721600e-04f, +1.205654696e-04f, -1.881840462e-06f, -7.196855515e-05f, -5.736010574e-05f, -6.560781128e-06f, +2.365867119e-05f, +1.927631872e-05f, +2.186217979e-06f, + +5.977488045e-04f, +1.699637474e-04f, -1.493374155e-03f, -2.645231908e-03f, -4.402748842e-04f, +4.724507873e-03f, +7.011071129e-03f, +6.490296010e-04f, -1.081371709e-02f, -1.413175738e-02f, -4.340426119e-04f, +2.002184535e-02f, +2.352470804e-02f, -6.130035059e-04f, -3.151766275e-02f, -3.364758230e-02f, +2.703960216e-03f, +4.331087950e-02f, +4.225101202e-02f, -5.639377493e-03f, -5.273193649e-02f, -4.713656917e-02f, +8.772001286e-03f, +5.733136576e-02f, +4.699265155e-02f, -1.121310348e-02f, -5.581730507e-02f, -4.190892042e-02f, +1.220152012e-02f, +4.858377352e-02f, +3.331929834e-02f, -1.144541522e-02f, -3.756276311e-02f, -2.341245371e-02f, +9.249131144e-03f, +2.546819877e-02f, +1.430946128e-02f, -6.356667690e-03f, -1.479917063e-02f, -7.394497970e-03f, +3.604801746e-03f, +7.063775070e-03f, +3.061326609e-03f, -1.579493761e-03f, -2.530313393e-03f, -8.969064252e-04f, +4.484868831e-04f, +5.153598095e-04f, + -5.221833379e-06f, +3.433055652e-05f, +5.951342718e-05f, -3.152516786e-06f, -1.308097366e-04f, -1.580248070e-04f, +4.519564591e-05f, +3.271077973e-04f, +3.128293097e-04f, -1.480942770e-04f, -6.385121023e-04f, -5.047107781e-04f, +3.300161610e-04f, +1.040859489e-03f, +6.910417326e-04f, -5.845911801e-04f, -1.465726618e-03f, -8.191688640e-04f, +8.729476697e-04f, +1.816505538e-03f, +8.476746833e-04f, -1.130516597e-03f, -2.001304046e-03f, -7.649585135e-04f, +1.288413138e-03f, +1.968477322e-03f, +5.951016491e-04f, -1.300537084e-03f, -1.727631438e-03f, -3.876153077e-04f, +1.163110185e-03f, +1.345547346e-03f, +1.964723545e-04f, -9.164497890e-04f, -9.191545389e-04f, -5.936965397e-05f, +6.279422738e-04f, +5.390943982e-04f, -1.281595904e-05f, -3.650318258e-04f, -2.610411744e-04f, +3.293465062e-05f, +1.716910203e-04f, +9.620193407e-05f, -2.504671030e-05f, -5.875980060e-05f, -2.138076662e-05f, +1.080393312e-05f, + /* 5,12 (48) */ + -2.138362868e-04f, +2.699466730e-04f, +1.033780325e-03f, +1.109862058e-03f, -3.415688898e-04f, -2.637369552e-03f, -3.364985229e-03f, -4.438376820e-04f, +4.930171787e-03f, +7.789018652e-03f, +3.319473232e-03f, -7.308289635e-03f, -1.523423081e-02f, -1.024708129e-02f, +8.419153559e-03f, +2.687537056e-02f, +2.489926454e-02f, -5.528240104e-03f, -4.629905191e-02f, -5.885505491e-02f, -1.020958642e-02f, +9.823396566e-02f, +2.227367744e-01f, +3.002210142e-01f, +2.882928326e-01f, +1.935918595e-01f, +6.730066057e-02f, -2.880458000e-02f, -6.056954650e-02f, -3.709014737e-02f, +4.234731733e-03f, +2.813779957e-02f, +2.343903002e-02f, +3.005110776e-03f, -1.299760815e-02f, -1.414367498e-02f, -4.458255175e-03f, +5.204616567e-03f, +7.634467472e-03f, +3.585997048e-03f, -1.526556951e-03f, -3.479918858e-03f, -2.098374192e-03f, +1.627790300e-04f, +1.217558456e-03f, +8.609413644e-04f, +9.965884631e-05f, -2.487527171e-04f, + -6.145498583e-06f, -2.269995370e-05f, -1.965132830e-05f, +1.900594605e-05f, +6.704908649e-05f, +6.294204704e-05f, -2.745233794e-05f, -1.460248114e-04f, -1.615228087e-04f, +6.462811949e-06f, +2.608259660e-04f, +3.514581129e-04f, +9.208544302e-05f, -3.971431734e-04f, -6.848645985e-04f, -3.624732490e-04f, +5.108376602e-04f, +1.272464001e-03f, +1.067435203e-03f, -4.264969275e-04f, -2.549045810e-03f, -3.947435253e-03f, -3.496647051e-03f, -1.178020334e-03f, +1.797988639e-03f, +3.775585220e-03f, +3.773158943e-03f, +2.095760475e-03f, +7.717910193e-06f, -1.225309849e-03f, -1.161950407e-03f, -2.988521533e-04f, +4.921946958e-04f, +6.644111886e-04f, +2.895122690e-04f, -1.785540845e-04f, -3.585383943e-04f, -2.095275372e-04f, +4.426000660e-05f, +1.731716465e-04f, +1.240340870e-04f, +1.606225050e-06f, -7.116104395e-05f, -5.871913933e-05f, -8.045365282e-06f, +2.329050229e-05f, +1.975685940e-05f, +2.646940749e-06f, + +5.925269711e-04f, +2.042943039e-04f, -1.433860728e-03f, -2.648384424e-03f, -5.710846208e-04f, +4.566483066e-03f, +7.056266775e-03f, +9.761373983e-04f, -1.050088778e-02f, -1.427985166e-02f, -1.072554714e-03f, +1.951713457e-02f, +2.385472420e-02f, +4.278559834e-04f, -3.082662102e-02f, -3.423217348e-02f, +1.238233598e-03f, +4.249171064e-02f, +4.312395969e-02f, -3.822871955e-03f, -5.188426180e-02f, -4.826708576e-02f, +6.770697241e-03f, +5.656640725e-02f, +4.828106469e-02f, -9.244626154e-03f, -5.522220343e-02f, -4.320945751e-02f, +1.047388868e-02f, +4.819615821e-02f, +3.448240853e-02f, -1.009986787e-02f, -3.736629075e-02f, -2.432890350e-02f, +8.329976605e-03f, +2.540882911e-02f, +1.493740356e-02f, -5.817573292e-03f, -1.481198659e-02f, -7.759529796e-03f, +3.343760572e-03f, +7.096709720e-03f, +3.233017629e-03f, -1.483291827e-03f, -2.555360104e-03f, -9.556662258e-04f, +4.271061165e-04f, +5.261637426e-04f, + -5.992792188e-06f, +3.290054749e-05f, +5.978006238e-05f, +3.318566004e-07f, -1.272731508e-04f, -1.605272429e-04f, +3.598366537e-05f, +3.208298467e-04f, +3.206200138e-04f, -1.297125478e-04f, -6.298640435e-04f, -5.216365040e-04f, +2.998823734e-04f, +1.031586820e-03f, +7.204999172e-04f, -5.423673907e-04f, -1.458683414e-03f, -8.625468812e-04f, +8.213208904e-04f, +1.814723206e-03f, +9.031948932e-04f, -1.074863185e-03f, -2.006760386e-03f, -8.275936346e-04f, +1.235350750e-03f, +1.981165714e-03f, +6.577692475e-04f, -1.255934658e-03f, -1.745429140e-03f, -4.432331034e-04f, +1.130413656e-03f, +1.364981652e-03f, +2.400119783e-04f, -8.960166017e-04f, -9.366965344e-04f, -8.904718824e-05f, +6.175595806e-04f, +5.523519909e-04f, +4.371091988e-06f, -3.612259542e-04f, -2.693219942e-04f, +2.486760706e-05f, +1.711338991e-04f, +1.002934205e-04f, -2.228763733e-05f, -5.917292671e-05f, -2.280664602e-05f, +1.033395661e-05f, + /* 5,13 (48) */ + -2.199817854e-04f, +2.472467193e-04f, +1.014128997e-03f, +1.128868004e-03f, -2.745198034e-04f, -2.574427505e-03f, -3.392437567e-03f, -5.898624934e-04f, +4.768648978e-03f, +7.795481463e-03f, +3.580299198e-03f, -6.956831522e-03f, -1.514214537e-02f, -1.064422447e-02f, +7.734288960e-03f, +2.651289731e-02f, +2.541010220e-02f, -4.255776103e-03f, -4.523161671e-02f, -5.928155184e-02f, -1.275863223e-02f, +9.428653040e-02f, +2.192401273e-01f, +2.990429938e-01f, +2.900908213e-01f, +1.973674447e-01f, +7.107381951e-02f, -2.670881952e-02f, -6.056182859e-02f, -3.831545722e-02f, +3.072781326e-03f, +2.783894741e-02f, +2.393122472e-02f, +3.669521965e-03f, -1.270809588e-02f, -1.432222906e-02f, -4.816793569e-03f, +4.995089030e-03f, +7.678727479e-03f, +3.759168695e-03f, -1.402522864e-03f, -3.478312633e-03f, -2.169535236e-03f, +1.040598907e-04f, +1.209513091e-03f, +8.842318667e-04f, +1.194157057e-04f, -2.461057764e-04f, + -5.619847753e-06f, -2.233122796e-05f, -2.028645001e-05f, +1.738935163e-05f, +6.600111633e-05f, +6.439358814e-05f, -2.362871253e-05f, -1.431608535e-04f, -1.637676033e-04f, -1.129221506e-06f, +2.539196867e-04f, +3.535546868e-04f, +1.052734594e-04f, -3.822267278e-04f, -6.837821069e-04f, -3.828732458e-04f, +4.805987104e-04f, +1.259451603e-03f, +1.094049999e-03f, -3.643588626e-04f, -2.486096943e-03f, -3.928059791e-03f, -3.542451496e-03f, -1.269047195e-03f, +1.712134616e-03f, +3.741774980e-03f, +3.803445380e-03f, +2.162088097e-03f, +6.506458990e-05f, -1.206819595e-03f, -1.180386341e-03f, -3.290436934e-04f, +4.755794889e-04f, +6.691226960e-04f, +3.052656328e-04f, -1.670791099e-04f, -3.585944329e-04f, -2.172329171e-04f, +3.738809433e-05f, +1.720829637e-04f, +1.274302066e-04f, +5.151342728e-06f, -7.026280721e-05f, -6.004029793e-05f, -9.553018418e-06f, +2.288492893e-05f, +2.022427551e-05f, +3.118355367e-06f, + +5.865341789e-04f, +2.371948514e-04f, -1.374080666e-03f, -2.648052568e-03f, -6.983577715e-04f, +4.405955823e-03f, +7.092250441e-03f, +1.296967245e-03f, -1.018026776e-02f, -1.440956421e-02f, -1.702418758e-03f, +1.899549807e-02f, +2.415460658e-02f, +1.459442803e-03f, -3.010612110e-02f, -3.477454088e-02f, -2.204498169e-04f, +4.162916376e-02f, +4.394528058e-02f, -2.008148749e-03f, -5.098106691e-02f, -4.934194895e-02f, +4.763936855e-03f, +5.573881361e-02f, +4.951641544e-02f, -7.263460440e-03f, -5.456443418e-02f, -4.446539217e-02f, +8.728459539e-03f, +4.775292511e-02f, +3.561282219e-02f, -8.734886219e-03f, -3.712627877e-02f, -2.522492010e-02f, +7.393280071e-03f, +2.531978192e-02f, +1.555496314e-02f, -5.265221301e-03f, -1.480761550e-02f, -8.120755750e-03f, +3.074438578e-03f, +7.121577327e-03f, +3.404151528e-03f, -1.382998406e-03f, -2.577647741e-03f, -1.014839153e-03f, +4.042994704e-04f, +5.364976992e-04f, + -6.726188338e-06f, +3.146265921e-05f, +5.995415024e-05f, +3.734859764e-06f, -1.236436595e-04f, -1.627790681e-04f, +2.688242340e-05f, +3.142560394e-04f, +3.279163869e-04f, -1.114077755e-04f, -6.205714137e-04f, -5.377768232e-04f, +2.696796894e-04f, +1.021197686e-03f, +7.489100181e-04f, -4.997968082e-04f, -1.450011546e-03f, -9.047296952e-04f, +7.689688922e-04f, +1.810883461e-03f, +9.575489692e-04f, -1.018088808e-03f, -2.009934480e-03f, -8.892717136e-04f, +1.180862295e-03f, +1.991618904e-03f, +7.198106432e-04f, -1.209781226e-03f, -1.761296652e-03f, -4.985806950e-04f, +1.096254414e-03f, +1.382958902e-03f, +2.835684992e-04f, -8.743859052e-04f, -9.532950886e-04f, -1.189049414e-04f, +6.063342116e-04f, +5.651052827e-04f, +2.177681319e-05f, -3.569227371e-04f, -2.773989148e-04f, +1.662740206e-05f, +1.703431041e-04f, +1.043388822e-04f, -1.942990811e-05f, -5.950922336e-05f, -2.424101926e-05f, +9.826762982e-06f, + /* 5,14 (48) */ + -2.256016332e-04f, +2.249154914e-04f, +9.938425466e-04f, +1.146257356e-03f, -2.085186870e-04f, -2.510033917e-03f, -3.416066279e-03f, -7.330233469e-04f, +4.604881375e-03f, +7.794352242e-03f, +3.834218885e-03f, -6.603276835e-03f, -1.503687191e-02f, -1.102645119e-02f, +7.050506854e-03f, +2.613002407e-02f, +2.589070091e-02f, -2.996324500e-03f, -4.413756671e-02f, -5.964591070e-02f, -1.524472918e-02f, +9.035847061e-02f, +2.156976758e-01f, +2.977739466e-01f, +2.918029559e-01f, +2.011092197e-01f, +7.487726489e-02f, -2.454673142e-02f, -6.049676400e-02f, -3.952227682e-02f, +1.892394985e-03f, +2.750990372e-02f, +2.440680421e-02f, +4.338644661e-03f, -1.240283025e-02f, -1.448930817e-02f, -5.175388002e-03f, +4.777856113e-03f, +7.716115573e-03f, +3.931251658e-03f, -1.275092657e-03f, -3.473161290e-03f, -2.239798043e-03f, +4.401959277e-05f, +1.199960073e-03f, +9.071167956e-04f, +1.396399812e-04f, -2.429874210e-04f, + -5.101935035e-06f, -2.194368679e-05f, -2.088292230e-05f, +1.578716000e-05f, +6.490221258e-05f, +6.575232863e-05f, -1.984341151e-05f, -1.401967567e-04f, -1.658174043e-04f, -8.615704811e-06f, +2.468577445e-04f, +3.552842156e-04f, +1.181977641e-04f, -3.671297703e-04f, -6.820706251e-04f, -4.026676212e-04f, +4.502987406e-04f, +1.245472585e-03f, +1.119313455e-03f, -3.029347472e-04f, -2.422468327e-03f, -3.906802038e-03f, -3.586300165e-03f, -1.359339382e-03f, +1.625293037e-03f, +3.705927037e-03f, +3.831980836e-03f, +2.227969541e-03f, +1.232916022e-04f, -1.186976001e-03f, -1.197982611e-03f, -3.593109908e-04f, +4.583105953e-04f, +6.732550314e-04f, +3.209203473e-04f, -1.552980924e-04f, -3.583010170e-04f, -2.248276595e-04f, +3.038234710e-05f, +1.708045217e-04f, +1.307491686e-04f, +8.750643349e-06f, -6.927326105e-05f, -6.132137632e-05f, -1.108242036e-05f, +2.244163619e-05f, +2.067761714e-05f, +3.600030357e-06f, + +5.798079906e-04f, +2.686575106e-04f, -1.314126515e-03f, -2.644317708e-03f, -8.220014310e-04f, +4.243176755e-03f, +7.119132864e-03f, +1.611223284e-03f, -9.852351375e-03f, -1.452097198e-02f, -2.322990171e-03f, +1.845772125e-02f, +2.442428626e-02f, +2.480640490e-03f, -2.935721108e-02f, -3.527433768e-02f, -1.670461363e-03f, +4.072443406e-02f, +4.471424948e-02f, -1.972652877e-04f, -5.002351794e-02f, -5.036003776e-02f, +2.754002374e-03f, +5.484954190e-02f, +5.069727773e-02f, -5.271841536e-03f, -5.384462353e-02f, -4.567517339e-02f, +6.967162887e-03f, +4.725434442e-02f, +3.670907660e-02f, -7.351927317e-03f, -3.684271028e-02f, -2.609930601e-02f, +6.439984982e-03f, +2.520087698e-02f, +1.616129735e-02f, -4.700116019e-03f, -1.478583868e-02f, -8.477678487e-03f, +2.797039663e-03f, +7.138204729e-03f, +3.574494632e-03f, -1.278659524e-03f, -2.597077649e-03f, -1.074348376e-03f, +3.800584512e-04f, +5.463244622e-04f, + -7.421867367e-06f, +3.001940325e-05f, +6.003768156e-05f, +7.053467277e-06f, -1.199280247e-04f, -1.647818060e-04f, +1.790181941e-05f, +3.073990511e-04f, +3.347160378e-04f, -9.320145502e-05f, -6.106526693e-04f, -5.531202657e-04f, +2.394447676e-04f, +1.009713527e-03f, +7.762461630e-04f, -4.569316317e-04f, -1.439730266e-03f, -9.456738503e-04f, +7.159554776e-04f, +1.804997449e-03f, +1.010676813e-03f, -9.602611958e-04f, -2.010824996e-03f, -9.499216317e-04f, +1.125010260e-03f, +1.999822172e-03f, +7.811526405e-04f, -1.162126342e-03f, -1.775208914e-03f, -5.535922821e-04f, +1.060665243e-03f, +1.399449515e-03f, +3.270905203e-04f, -8.515744417e-04f, -9.689224002e-04f, -1.489086026e-04f, +5.942710605e-04f, +5.773328080e-04f, +3.938231595e-05f, -3.521206831e-04f, -2.852584363e-04f, +8.221935396e-06f, +1.693153605e-04f, +1.083317326e-04f, -1.647543552e-05f, -5.976621677e-05f, -2.568173259e-05f, +9.282107604e-06f, + /* 5,15 (48) */ + -2.307035682e-04f, +2.029718046e-04f, +9.729596243e-04f, +1.162044516e-03f, -1.436164744e-04f, -2.444281589e-03f, -3.435909691e-03f, -8.732201035e-04f, +4.439063971e-03f, +7.785736537e-03f, +4.081076629e-03f, -6.247992620e-03f, -1.491867414e-02f, -1.139358096e-02f, +6.368436228e-03f, +2.572735645e-02f, +2.634099965e-02f, -1.750851916e-03f, -4.301825325e-02f, -5.994884545e-02f, -1.766719750e-02f, +8.645166857e-02f, +2.121113757e-01f, +2.964146073e-01f, +2.934282489e-01f, +2.048151467e-01f, +7.870924573e-02f, -2.231876188e-02f, -6.037347239e-02f, -4.070925282e-02f, +6.944123742e-04f, +2.715059273e-02f, +2.486511480e-02f, +5.011899692e-03f, -1.208190990e-02f, -1.464460626e-02f, -5.533689019e-03f, +4.553028453e-03f, +7.746497920e-03f, +4.102056180e-03f, -1.144343489e-03f, -3.464410647e-03f, -2.309071304e-03f, -1.730178355e-05f, +1.188877652e-03f, +9.295584318e-04f, +1.603175984e-04f, -2.393873907e-04f, + -4.592312781e-06f, -2.153827296e-05f, -2.144084177e-05f, +1.420093672e-05f, +6.375451373e-05f, +6.701837009e-05f, -1.609980167e-05f, -1.371370575e-04f, -1.676728842e-04f, -1.599059122e-05f, +2.396490953e-04f, +3.566495875e-04f, +1.308491393e-04f, -3.518687715e-04f, -6.797391967e-04f, -4.218453906e-04f, +4.199657252e-04f, +1.230551377e-03f, +1.143223062e-03f, -2.422595454e-04f, -2.358206446e-03f, -3.883686002e-03f, -3.628173926e-03f, -1.448845124e-03f, +1.537513213e-03f, +3.668055015e-03f, +3.858736840e-03f, +2.293357934e-03f, +1.823673981e-04f, -1.165777375e-03f, -1.214712913e-03f, -3.896273500e-04f, +4.403962535e-04f, +6.767973395e-04f, +3.364601680e-04f, -1.432187388e-04f, -3.576540129e-04f, -2.323027288e-04f, +2.324802542e-05f, +1.693349066e-04f, +1.339863276e-04f, +1.240115436e-05f, -6.819191421e-05f, -6.256017717e-05f, -1.263220012e-05f, +2.196035072e-05f, +2.111593325e-05f, +4.091509657e-06f, + +5.723861232e-04f, +2.986769139e-04f, -1.254088834e-03f, -2.637264241e-03f, -9.419294558e-04f, +4.078394949e-03f, +7.137034683e-03f, +1.918622335e-03f, -9.517635337e-03f, -1.461417344e-02f, -2.933642841e-03f, +1.790460098e-02f, +2.466373103e-02f, +3.490354017e-03f, -2.858096492e-02f, -3.573126931e-02f, -3.110191630e-03f, +3.977876021e-02f, +4.543020495e-02f, +1.607732162e-03f, -4.901284113e-02f, -5.132029895e-02f, +7.431773778e-04f, +5.389962027e-02f, +5.182228799e-02f, -3.272019363e-03f, -5.306347089e-02f, -4.683729973e-02f, +5.191953973e-03f, +4.670075213e-02f, +3.776974184e-02f, -5.952477802e-03f, -3.651561975e-02f, -2.695088045e-02f, +5.471062582e-03f, +2.505196838e-02f, +1.675556841e-02f, -4.122783211e-03f, -1.474645637e-02f, -8.829799170e-03f, +2.511781227e-03f, +7.146426665e-03f, +3.743809993e-03f, -1.170327791e-03f, -2.613553085e-03f, -1.134114593e-03f, +3.543767186e-04f, +5.556065698e-04f, + -8.079745468e-06f, +2.857323814e-05f, +6.003274073e-05f, +1.028483838e-05f, -1.161330024e-04f, -1.665372915e-04f, +9.051438444e-06f, +3.002717441e-04f, +3.410172403e-04f, -7.511470104e-05f, -6.001268452e-04f, -5.676564557e-04f, +2.092139797e-04f, +9.971569364e-04f, +8.024839588e-04f, -4.138240856e-04f, -1.427860644e-03f, -9.853375695e-04f, +6.623449825e-04f, +1.797078701e-03f, +1.062519925e-03f, -9.014492054e-04f, -2.009433298e-03f, -1.009473505e-03f, +1.067858769e-03f, +2.005763443e-03f, +8.417227355e-04f, -1.113021470e-03f, -1.787143111e-03f, -6.082021965e-04f, +1.023680798e-03f, +1.414425528e-03f, +3.705263544e-04f, -8.276005109e-04f, -9.835516288e-04f, -1.790233679e-04f, +5.813761142e-04f, +5.890135245e-04f, +5.716822562e-05f, -3.468189271e-04f, -2.928871472e-04f, -3.405428706e-07f, +1.680476643e-04f, +1.122653332e-04f, -1.342631768e-05f, -5.994150050e-05f, -2.712656655e-05f, +8.699807951e-06f, + /* 5,16 (48) */ + -2.352958810e-04f, +1.814335316e-04f, +9.515187825e-04f, +1.176245452e-03f, -7.986196071e-05f, -2.377263219e-03f, -3.452009492e-03f, -1.010357161e-03f, +4.271391087e-03f, +7.769745946e-03f, +4.320725725e-03f, -5.891343032e-03f, -1.478782500e-02f, -1.174544974e-02f, +5.688697032e-03f, +2.530551106e-02f, +2.676096538e-02f, -5.203005390e-04f, -4.187503019e-02f, -6.019110499e-02f, -2.002540395e-02f, +8.256798257e-02f, +2.084832017e-01f, +2.949657621e-01f, +2.949657621e-01f, +2.084832017e-01f, +8.256798257e-02f, -2.002540395e-02f, -6.019110499e-02f, -4.187503019e-02f, -5.203005390e-04f, +2.676096538e-02f, +2.530551106e-02f, +5.688697032e-03f, -1.174544974e-02f, -1.478782500e-02f, -5.891343032e-03f, +4.320725725e-03f, +7.769745946e-03f, +4.271391087e-03f, -1.010357161e-03f, -3.452009492e-03f, -2.377263219e-03f, -7.986196071e-05f, +1.176245452e-03f, +9.515187825e-04f, +1.814335316e-04f, -2.352958810e-04f, + -4.091509657e-06f, -2.111593325e-05f, -2.196035072e-05f, +1.263220012e-05f, +6.256017717e-05f, +6.819191421e-05f, -1.240115436e-05f, -1.339863276e-04f, -1.693349066e-04f, -2.324802542e-05f, +2.323027288e-04f, +3.576540129e-04f, +1.432187388e-04f, -3.364601680e-04f, -6.767973395e-04f, -4.403962535e-04f, +3.896273500e-04f, +1.214712913e-03f, +1.165777375e-03f, -1.823673981e-04f, -2.293357934e-03f, -3.858736840e-03f, -3.668055015e-03f, -1.537513213e-03f, +1.448845124e-03f, +3.628173926e-03f, +3.883686002e-03f, +2.358206446e-03f, +2.422595454e-04f, -1.143223062e-03f, -1.230551377e-03f, -4.199657252e-04f, +4.218453906e-04f, +6.797391967e-04f, +3.518687715e-04f, -1.308491393e-04f, -3.566495875e-04f, -2.396490953e-04f, +1.599059122e-05f, +1.676728842e-04f, +1.371370575e-04f, +1.609980167e-05f, -6.701837009e-05f, -6.375451373e-05f, -1.420093672e-05f, +2.144084177e-05f, +2.153827296e-05f, +4.592312781e-06f, + +5.643063777e-04f, +3.272501520e-04f, -1.194056093e-03f, -2.626979402e-03f, -1.058062458e-03f, +3.911857657e-03f, +7.146086122e-03f, +2.218894080e-03f, -9.176618097e-03f, -1.468928814e-02f, -3.533769686e-03f, +1.733694452e-02f, +2.487294501e-02f, +4.487510953e-03f, -2.777848096e-02f, -3.614509340e-02f, -4.538052273e-03f, +3.879342264e-02f, +4.609254994e-02f, +3.404810862e-03f, -4.795032120e-02f, -5.222174816e-02f, -1.266255920e-03f, +5.289014676e-02f, +5.289014676e-02f, -1.266255920e-03f, -5.222174816e-02f, -4.795032120e-02f, +3.404810862e-03f, +4.609254994e-02f, +3.879342264e-02f, -4.538052273e-03f, -3.614509340e-02f, -2.777848096e-02f, +4.487510953e-03f, +2.487294501e-02f, +1.733694452e-02f, -3.533769686e-03f, -1.468928814e-02f, -9.176618097e-03f, +2.218894080e-03f, +7.146086122e-03f, +3.911857657e-03f, -1.058062458e-03f, -2.626979402e-03f, -1.194056093e-03f, +3.272501520e-04f, +5.643063777e-04f, + -8.699807951e-06f, +2.712656655e-05f, +5.994150050e-05f, +1.342631768e-05f, -1.122653332e-04f, -1.680476643e-04f, +3.405428706e-07f, +2.928871472e-04f, +3.468189271e-04f, -5.716822562e-05f, -5.890135245e-04f, -5.813761142e-04f, +1.790233679e-04f, +9.835516288e-04f, +8.276005109e-04f, -3.705263544e-04f, -1.414425528e-03f, -1.023680798e-03f, +6.082021965e-04f, +1.787143111e-03f, +1.113021470e-03f, -8.417227355e-04f, -2.005763443e-03f, -1.067858769e-03f, +1.009473505e-03f, +2.009433298e-03f, +9.014492054e-04f, -1.062519925e-03f, -1.797078701e-03f, -6.623449825e-04f, +9.853375695e-04f, +1.427860644e-03f, +4.138240856e-04f, -8.024839588e-04f, -9.971569364e-04f, -2.092139797e-04f, +5.676564557e-04f, +6.001268452e-04f, +7.511470104e-05f, -3.410172403e-04f, -3.002717441e-04f, -9.051438444e-06f, +1.665372915e-04f, +1.161330024e-04f, -1.028483838e-05f, -6.003274073e-05f, -2.857323814e-05f, +8.079745468e-06f, + /* 5,17 (48) */ + -2.393873907e-04f, +1.603175984e-04f, +9.295584318e-04f, +1.188877652e-03f, -1.730178355e-05f, -2.309071304e-03f, -3.464410647e-03f, -1.144343489e-03f, +4.102056180e-03f, +7.746497920e-03f, +4.553028453e-03f, -5.533689019e-03f, -1.464460626e-02f, -1.208190990e-02f, +5.011899692e-03f, +2.486511480e-02f, +2.715059273e-02f, +6.944123742e-04f, -4.070925282e-02f, -6.037347239e-02f, -2.231876188e-02f, +7.870924573e-02f, +2.048151467e-01f, +2.934282489e-01f, +2.964146073e-01f, +2.121113757e-01f, +8.645166857e-02f, -1.766719750e-02f, -5.994884545e-02f, -4.301825325e-02f, -1.750851916e-03f, +2.634099965e-02f, +2.572735645e-02f, +6.368436228e-03f, -1.139358096e-02f, -1.491867414e-02f, -6.247992620e-03f, +4.081076629e-03f, +7.785736537e-03f, +4.439063971e-03f, -8.732201035e-04f, -3.435909691e-03f, -2.444281589e-03f, -1.436164744e-04f, +1.162044516e-03f, +9.729596243e-04f, +2.029718046e-04f, -2.307035682e-04f, + -3.600030357e-06f, -2.067761714e-05f, -2.244163619e-05f, +1.108242036e-05f, +6.132137632e-05f, +6.927326105e-05f, -8.750643349e-06f, -1.307491686e-04f, -1.708045217e-04f, -3.038234710e-05f, +2.248276595e-04f, +3.583010170e-04f, +1.552980924e-04f, -3.209203473e-04f, -6.732550314e-04f, -4.583105953e-04f, +3.593109908e-04f, +1.197982611e-03f, +1.186976001e-03f, -1.232916022e-04f, -2.227969541e-03f, -3.831980836e-03f, -3.705927037e-03f, -1.625293037e-03f, +1.359339382e-03f, +3.586300165e-03f, +3.906802038e-03f, +2.422468327e-03f, +3.029347472e-04f, -1.119313455e-03f, -1.245472585e-03f, -4.502987406e-04f, +4.026676212e-04f, +6.820706251e-04f, +3.671297703e-04f, -1.181977641e-04f, -3.552842156e-04f, -2.468577445e-04f, +8.615704811e-06f, +1.658174043e-04f, +1.401967567e-04f, +1.984341151e-05f, -6.575232863e-05f, -6.490221258e-05f, -1.578716000e-05f, +2.088292230e-05f, +2.194368679e-05f, +5.101935035e-06f, + +5.556065698e-04f, +3.543767186e-04f, -1.134114593e-03f, -2.613553085e-03f, -1.170327791e-03f, +3.743809993e-03f, +7.146426665e-03f, +2.511781227e-03f, -8.829799170e-03f, -1.474645637e-02f, -4.122783211e-03f, +1.675556841e-02f, +2.505196838e-02f, +5.471062582e-03f, -2.695088045e-02f, -3.651561975e-02f, -5.952477802e-03f, +3.776974184e-02f, +4.670075213e-02f, +5.191953973e-03f, -4.683729973e-02f, -5.306347089e-02f, -3.272019363e-03f, +5.182228799e-02f, +5.389962027e-02f, +7.431773778e-04f, -5.132029895e-02f, -4.901284113e-02f, +1.607732162e-03f, +4.543020495e-02f, +3.977876021e-02f, -3.110191630e-03f, -3.573126931e-02f, -2.858096492e-02f, +3.490354017e-03f, +2.466373103e-02f, +1.790460098e-02f, -2.933642841e-03f, -1.461417344e-02f, -9.517635337e-03f, +1.918622335e-03f, +7.137034683e-03f, +4.078394949e-03f, -9.419294558e-04f, -2.637264241e-03f, -1.254088834e-03f, +2.986769139e-04f, +5.723861232e-04f, + -9.282107604e-06f, +2.568173259e-05f, +5.976621677e-05f, +1.647543552e-05f, -1.083317326e-04f, -1.693153605e-04f, -8.221935396e-06f, +2.852584363e-04f, +3.521206831e-04f, -3.938231595e-05f, -5.773328080e-04f, -5.942710605e-04f, +1.489086026e-04f, +9.689224002e-04f, +8.515744417e-04f, -3.270905203e-04f, -1.399449515e-03f, -1.060665243e-03f, +5.535922821e-04f, +1.775208914e-03f, +1.162126342e-03f, -7.811526405e-04f, -1.999822172e-03f, -1.125010260e-03f, +9.499216317e-04f, +2.010824996e-03f, +9.602611958e-04f, -1.010676813e-03f, -1.804997449e-03f, -7.159554776e-04f, +9.456738503e-04f, +1.439730266e-03f, +4.569316317e-04f, -7.762461630e-04f, -1.009713527e-03f, -2.394447676e-04f, +5.531202657e-04f, +6.106526693e-04f, +9.320145502e-05f, -3.347160378e-04f, -3.073990511e-04f, -1.790181941e-05f, +1.647818060e-04f, +1.199280247e-04f, -7.053467277e-06f, -6.003768156e-05f, -3.001940325e-05f, +7.421867367e-06f, + /* 5,18 (48) */ + -2.429874210e-04f, +1.396399812e-04f, +9.071167956e-04f, +1.199960073e-03f, +4.401959277e-05f, -2.239798043e-03f, -3.473161290e-03f, -1.275092657e-03f, +3.931251658e-03f, +7.716115573e-03f, +4.777856113e-03f, -5.175388002e-03f, -1.448930817e-02f, -1.240283025e-02f, +4.338644661e-03f, +2.440680421e-02f, +2.750990372e-02f, +1.892394985e-03f, -3.952227682e-02f, -6.049676400e-02f, -2.454673142e-02f, +7.487726489e-02f, +2.011092197e-01f, +2.918029559e-01f, +2.977739466e-01f, +2.156976758e-01f, +9.035847061e-02f, -1.524472918e-02f, -5.964591070e-02f, -4.413756671e-02f, -2.996324500e-03f, +2.589070091e-02f, +2.613002407e-02f, +7.050506854e-03f, -1.102645119e-02f, -1.503687191e-02f, -6.603276835e-03f, +3.834218885e-03f, +7.794352242e-03f, +4.604881375e-03f, -7.330233469e-04f, -3.416066279e-03f, -2.510033917e-03f, -2.085186870e-04f, +1.146257356e-03f, +9.938425466e-04f, +2.249154914e-04f, -2.256016332e-04f, + -3.118355367e-06f, -2.022427551e-05f, -2.288492893e-05f, +9.553018418e-06f, +6.004029793e-05f, +7.026280721e-05f, -5.151342728e-06f, -1.274302066e-04f, -1.720829637e-04f, -3.738809433e-05f, +2.172329171e-04f, +3.585944329e-04f, +1.670791099e-04f, -3.052656328e-04f, -6.691226960e-04f, -4.755794889e-04f, +3.290436934e-04f, +1.180386341e-03f, +1.206819595e-03f, -6.506458990e-05f, -2.162088097e-03f, -3.803445380e-03f, -3.741774980e-03f, -1.712134616e-03f, +1.269047195e-03f, +3.542451496e-03f, +3.928059791e-03f, +2.486096943e-03f, +3.643588626e-04f, -1.094049999e-03f, -1.259451603e-03f, -4.805987104e-04f, +3.828732458e-04f, +6.837821069e-04f, +3.822267278e-04f, -1.052734594e-04f, -3.535546868e-04f, -2.539196867e-04f, +1.129221506e-06f, +1.637676033e-04f, +1.431608535e-04f, +2.362871253e-05f, -6.439358814e-05f, -6.600111633e-05f, -1.738935163e-05f, +2.028645001e-05f, +2.233122796e-05f, +5.619847753e-06f, + +5.463244622e-04f, +3.800584512e-04f, -1.074348376e-03f, -2.597077649e-03f, -1.278659524e-03f, +3.574494632e-03f, +7.138204729e-03f, +2.797039663e-03f, -8.477678487e-03f, -1.478583868e-02f, -4.700116019e-03f, +1.616129735e-02f, +2.520087698e-02f, +6.439984982e-03f, -2.609930601e-02f, -3.684271028e-02f, -7.351927317e-03f, +3.670907660e-02f, +4.725434442e-02f, +6.967162887e-03f, -4.567517339e-02f, -5.384462353e-02f, -5.271841536e-03f, +5.069727773e-02f, +5.484954190e-02f, +2.754002374e-03f, -5.036003776e-02f, -5.002351794e-02f, -1.972652877e-04f, +4.471424948e-02f, +4.072443406e-02f, -1.670461363e-03f, -3.527433768e-02f, -2.935721108e-02f, +2.480640490e-03f, +2.442428626e-02f, +1.845772125e-02f, -2.322990171e-03f, -1.452097198e-02f, -9.852351375e-03f, +1.611223284e-03f, +7.119132864e-03f, +4.243176755e-03f, -8.220014310e-04f, -2.644317708e-03f, -1.314126515e-03f, +2.686575106e-04f, +5.798079906e-04f, + -9.826762982e-06f, +2.424101926e-05f, +5.950922336e-05f, +1.942990811e-05f, -1.043388822e-04f, -1.703431041e-04f, -1.662740206e-05f, +2.773989148e-04f, +3.569227371e-04f, -2.177681319e-05f, -5.651052827e-04f, -6.063342116e-04f, +1.189049414e-04f, +9.532950886e-04f, +8.743859052e-04f, -2.835684992e-04f, -1.382958902e-03f, -1.096254414e-03f, +4.985806950e-04f, +1.761296652e-03f, +1.209781226e-03f, -7.198106432e-04f, -1.991618904e-03f, -1.180862295e-03f, +8.892717136e-04f, +2.009934480e-03f, +1.018088808e-03f, -9.575489692e-04f, -1.810883461e-03f, -7.689688922e-04f, +9.047296952e-04f, +1.450011546e-03f, +4.997968082e-04f, -7.489100181e-04f, -1.021197686e-03f, -2.696796894e-04f, +5.377768232e-04f, +6.205714137e-04f, +1.114077755e-04f, -3.279163869e-04f, -3.142560394e-04f, -2.688242340e-05f, +1.627790681e-04f, +1.236436595e-04f, -3.734859764e-06f, -5.995415024e-05f, -3.146265921e-05f, +6.726188338e-06f, + /* 5,19 (48) */ + -2.461057764e-04f, +1.194157057e-04f, +8.842318667e-04f, +1.209513091e-03f, +1.040598907e-04f, -2.169535236e-03f, -3.478312633e-03f, -1.402522864e-03f, +3.759168695e-03f, +7.678727479e-03f, +4.995089030e-03f, -4.816793569e-03f, -1.432222906e-02f, -1.270809588e-02f, +3.669521965e-03f, +2.393122472e-02f, +2.783894741e-02f, +3.072781326e-03f, -3.831545722e-02f, -6.056182859e-02f, -2.670881952e-02f, +7.107381951e-02f, +1.973674447e-01f, +2.900908213e-01f, +2.990429938e-01f, +2.192401273e-01f, +9.428653040e-02f, -1.275863223e-02f, -5.928155184e-02f, -4.523161671e-02f, -4.255776103e-03f, +2.541010220e-02f, +2.651289731e-02f, +7.734288960e-03f, -1.064422447e-02f, -1.514214537e-02f, -6.956831522e-03f, +3.580299198e-03f, +7.795481463e-03f, +4.768648978e-03f, -5.898624934e-04f, -3.392437567e-03f, -2.574427505e-03f, -2.745198034e-04f, +1.128868004e-03f, +1.014128997e-03f, +2.472467193e-04f, -2.199817854e-04f, + -2.646940749e-06f, -1.975685940e-05f, -2.329050229e-05f, +8.045365282e-06f, +5.871913933e-05f, +7.116104395e-05f, -1.606225050e-06f, -1.240340870e-04f, -1.731716465e-04f, -4.426000660e-05f, +2.095275372e-04f, +3.585383943e-04f, +1.785540845e-04f, -2.895122690e-04f, -6.644111886e-04f, -4.921946958e-04f, +2.988521533e-04f, +1.161950407e-03f, +1.225309849e-03f, -7.717910193e-06f, -2.095760475e-03f, -3.773158943e-03f, -3.775585220e-03f, -1.797988639e-03f, +1.178020334e-03f, +3.496647051e-03f, +3.947435253e-03f, +2.549045810e-03f, +4.264969275e-04f, -1.067435203e-03f, -1.272464001e-03f, -5.108376602e-04f, +3.624732490e-04f, +6.848645985e-04f, +3.971431734e-04f, -9.208544302e-05f, -3.514581129e-04f, -2.608259660e-04f, -6.462811949e-06f, +1.615228087e-04f, +1.460248114e-04f, +2.745233794e-05f, -6.294204704e-05f, -6.704908649e-05f, -1.900594605e-05f, +1.965132830e-05f, +2.269995370e-05f, +6.145498583e-06f, + +5.364976992e-04f, +4.042994704e-04f, -1.014839153e-03f, -2.577647741e-03f, -1.382998406e-03f, +3.404151528e-03f, +7.121577327e-03f, +3.074438578e-03f, -8.120755750e-03f, -1.480761550e-02f, -5.265221301e-03f, +1.555496314e-02f, +2.531978192e-02f, +7.393280071e-03f, -2.522492010e-02f, -3.712627877e-02f, -8.734886219e-03f, +3.561282219e-02f, +4.775292511e-02f, +8.728459539e-03f, -4.446539217e-02f, -5.456443418e-02f, -7.263460440e-03f, +4.951641544e-02f, +5.573881361e-02f, +4.763936855e-03f, -4.934194895e-02f, -5.098106691e-02f, -2.008148749e-03f, +4.394528058e-02f, +4.162916376e-02f, -2.204498169e-04f, -3.477454088e-02f, -3.010612110e-02f, +1.459442803e-03f, +2.415460658e-02f, +1.899549807e-02f, -1.702418758e-03f, -1.440956421e-02f, -1.018026776e-02f, +1.296967245e-03f, +7.092250441e-03f, +4.405955823e-03f, -6.983577715e-04f, -2.648052568e-03f, -1.374080666e-03f, +2.371948514e-04f, +5.865341789e-04f, + -1.033395661e-05f, +2.280664602e-05f, +5.917292671e-05f, +2.228763733e-05f, -1.002934205e-04f, -1.711338991e-04f, -2.486760706e-05f, +2.693219942e-04f, +3.612259542e-04f, -4.371091988e-06f, -5.523519909e-04f, -6.175595806e-04f, +8.904718824e-05f, +9.366965344e-04f, +8.960166017e-04f, -2.400119783e-04f, -1.364981652e-03f, -1.130413656e-03f, +4.432331034e-04f, +1.745429140e-03f, +1.255934658e-03f, -6.577692475e-04f, -1.981165714e-03f, -1.235350750e-03f, +8.275936346e-04f, +2.006760386e-03f, +1.074863185e-03f, -9.031948932e-04f, -1.814723206e-03f, -8.213208904e-04f, +8.625468812e-04f, +1.458683414e-03f, +5.423673907e-04f, -7.204999172e-04f, -1.031586820e-03f, -2.998823734e-04f, +5.216365040e-04f, +6.298640435e-04f, +1.297125478e-04f, -3.206200138e-04f, -3.208298467e-04f, -3.598366537e-05f, +1.605272429e-04f, +1.272731508e-04f, -3.318566004e-07f, -5.978006238e-05f, -3.290054749e-05f, +5.992792188e-06f, + /* 5,20 (48) */ + -2.487527171e-04f, +9.965884631e-05f, +8.609413644e-04f, +1.217558456e-03f, +1.627790300e-04f, -2.098374192e-03f, -3.479918858e-03f, -1.526556951e-03f, +3.585997048e-03f, +7.634467472e-03f, +5.204616567e-03f, -4.458255175e-03f, -1.414367498e-02f, -1.299760815e-02f, +3.005110776e-03f, +2.343903002e-02f, +2.813779957e-02f, +4.234731733e-03f, -3.709014737e-02f, -6.056954650e-02f, -2.880458000e-02f, +6.730066057e-02f, +1.935918595e-01f, +2.882928326e-01f, +3.002210142e-01f, +2.227367744e-01f, +9.823396566e-02f, -1.020958642e-02f, -5.885505491e-02f, -4.629905191e-02f, -5.528240104e-03f, +2.489926454e-02f, +2.687537056e-02f, +8.419153559e-03f, -1.024708129e-02f, -1.523423081e-02f, -7.308289635e-03f, +3.319473232e-03f, +7.789018652e-03f, +4.930171787e-03f, -4.438376820e-04f, -3.364985229e-03f, -2.637369552e-03f, -3.415688898e-04f, +1.109862058e-03f, +1.033780325e-03f, +2.699466730e-04f, -2.138362868e-04f, + -2.186217979e-06f, -1.927631872e-05f, -2.365867119e-05f, +6.560781128e-06f, +5.736010574e-05f, +7.196855515e-05f, +1.881840462e-06f, -1.205654696e-04f, -1.740721600e-04f, -5.099302774e-05f, +2.017205521e-04f, +3.581373279e-04f, +1.897156964e-04f, -2.736764066e-04f, -6.591317812e-04f, -5.081486657e-04f, +2.687626964e-04f, +1.142701516e-03f, +1.242449486e-03f, +4.871779011e-05f, -2.029033559e-03f, -3.741151049e-03f, -3.807345528e-03f, -1.882806499e-03f, +1.086311093e-03f, +3.448907308e-03f, +3.964905593e-03f, +2.611268631e-03f, +4.893131757e-04f, -1.039472643e-03f, -1.284485883e-03f, -5.409873483e-04f, +3.414792965e-04f, +6.853095436e-04f, +4.118626183e-04f, -7.864329961e-05f, -3.489919343e-04f, -2.675676699e-04f, -1.415416122e-05f, +1.590825413e-04f, +1.487841346e-04f, +3.131082784e-05f, -6.139770552e-05f, -6.804400617e-05f, -2.063533162e-05f, +1.897750724e-05f, +2.304892660e-05f, +6.678311802e-06f, + +5.261637426e-04f, +4.271061165e-04f, -9.556662258e-04f, -2.555360104e-03f, -1.483291827e-03f, +3.233017629e-03f, +7.096709720e-03f, +3.343760572e-03f, -7.759529796e-03f, -1.481198659e-02f, -5.817573292e-03f, +1.493740356e-02f, +2.540882911e-02f, +8.329976605e-03f, -2.432890350e-02f, -3.736629075e-02f, -1.009986787e-02f, +3.448240853e-02f, +4.819615821e-02f, +1.047388868e-02f, -4.320945751e-02f, -5.522220343e-02f, -9.244626154e-03f, +4.828106469e-02f, +5.656640725e-02f, +6.770697241e-03f, -4.826708576e-02f, -5.188426180e-02f, -3.822871955e-03f, +4.312395969e-02f, +4.249171064e-02f, +1.238233598e-03f, -3.423217348e-02f, -3.082662102e-02f, +4.278559834e-04f, +2.385472420e-02f, +1.951713457e-02f, -1.072554714e-03f, -1.427985166e-02f, -1.050088778e-02f, +9.761373983e-04f, +7.056266775e-03f, +4.566483066e-03f, -5.710846208e-04f, -2.648384424e-03f, -1.433860728e-03f, +2.042943039e-04f, +5.925269711e-04f, + -1.080393312e-05f, +2.138076662e-05f, +5.875980060e-05f, +2.504671030e-05f, -9.620193407e-05f, -1.716910203e-04f, -3.293465062e-05f, +2.610411744e-04f, +3.650318258e-04f, +1.281595904e-05f, -5.390943982e-04f, -6.279422738e-04f, +5.936965397e-05f, +9.191545389e-04f, +9.164497890e-04f, -1.964723545e-04f, -1.345547346e-03f, -1.163110185e-03f, +3.876153077e-04f, +1.727631438e-03f, +1.300537084e-03f, -5.951016491e-04f, -1.968477322e-03f, -1.288413138e-03f, +7.649585135e-04f, +2.001304046e-03f, +1.130516597e-03f, -8.476746833e-04f, -1.816505538e-03f, -8.729476697e-04f, +8.191688640e-04f, +1.465726618e-03f, +5.845911801e-04f, -6.910417326e-04f, -1.040859489e-03f, -3.300161610e-04f, +5.047107781e-04f, +6.385121023e-04f, +1.480942770e-04f, -3.128293097e-04f, -3.271077973e-04f, -4.519564591e-05f, +1.580248070e-04f, +1.308097366e-04f, +3.152516786e-06f, -5.951342718e-05f, -3.433055652e-05f, +5.221833379e-06f, + /* 5,21 (48) */ + -2.509389351e-04f, +8.038252759e-05f, +8.372826932e-04f, +1.224119238e-03f, +2.201391358e-04f, -2.026405637e-03f, -3.478037017e-03f, -1.647122420e-03f, +3.411924888e-03f, +7.583474445e-03f, +5.406337119e-03f, -4.100117847e-03f, -1.395395928e-02f, -1.327128456e-02f, +2.345978995e-03f, +2.293088136e-02f, +2.840656226e-02f, +5.377433249e-03f, -3.584769789e-02f, -6.052082871e-02f, -3.083361355e-02f, +6.355950952e-02f, +1.897845140e-01f, +2.864100261e-01f, +3.013073253e-01f, +2.261856817e-01f, +1.021988712e-01f, -7.598317793e-03f, -5.836574174e-02f, -4.733852455e-02f, -6.812725987e-03f, +2.435827719e-02f, +2.721684986e-02f, +9.104463103e-03f, -9.835218674e-03f, -1.531287411e-02f, -7.657281569e-03f, +3.051905562e-03f, +7.774864490e-03f, +5.089254328e-03f, -2.950535474e-04f, -3.333674401e-03f, -2.698767258e-03f, -4.096128960e-04f, +1.089226726e-03f, +1.052757832e-03f, +2.929955996e-04f, -2.071579750e-04f, + -1.736593812e-06f, -1.878360102e-05f, -2.398979095e-05f, +5.100534608e-06f, +5.596540759e-05f, +7.268601529e-05f, +5.310089543e-06f, -1.170290228e-04f, -1.747862663e-04f, -5.758230847e-05f, +1.938209822e-04f, +3.573959454e-04f, +2.005570148e-04f, -2.577740890e-04f, -6.532961475e-04f, -5.234345368e-04f, +2.388012594e-04f, +1.122666753e-03f, +1.258242246e-03f, +1.042127838e-04f, -1.961954204e-03f, -3.707452254e-03f, -3.837045076e-03f, -1.966540324e-03f, +9.939722517e-04f, +3.399254090e-03f, +3.980449169e-03f, +2.672719330e-03f, +5.527710620e-04f, -1.010166969e-03f, -1.295493904e-03f, -5.710192872e-04f, +3.199037319e-04f, +6.851088870e-04f, +4.263685705e-04f, -6.495697539e-05f, -3.461539264e-04f, -2.741359392e-04f, -2.193840843e-05f, +1.564465189e-04f, +1.514343731e-04f, +3.520063170e-05f, -5.976066708e-05f, -6.898378297e-05f, -2.227585175e-05f, +1.826498444e-05f, +2.337721593e-05f, +7.217688677e-06f, + +5.153598095e-04f, +4.484868831e-04f, -8.969064252e-04f, -2.530313393e-03f, -1.579493761e-03f, +3.061326609e-03f, +7.063775070e-03f, +3.604801746e-03f, -7.394497970e-03f, -1.479917063e-02f, -6.356667690e-03f, +1.430946128e-02f, +2.546819877e-02f, +9.249131144e-03f, -2.341245371e-02f, -3.756276311e-02f, -1.144541522e-02f, +3.331929834e-02f, +4.858377352e-02f, +1.220152012e-02f, -4.190892042e-02f, -5.581730507e-02f, -1.121310348e-02f, +4.699265155e-02f, +5.733136576e-02f, +8.772001286e-03f, -4.713656917e-02f, -5.273193649e-02f, -5.639377493e-03f, +4.225101202e-02f, +4.331087950e-02f, +2.703960216e-03f, -3.364758230e-02f, -3.151766275e-02f, -6.130035059e-04f, +2.352470804e-02f, +2.002184535e-02f, -4.340426119e-04f, -1.413175738e-02f, -1.081371709e-02f, +6.490296010e-04f, +7.011071129e-03f, +4.724507873e-03f, -4.402748842e-04f, -2.645231908e-03f, -1.493374155e-03f, +1.699637474e-04f, +5.977488045e-04f, + -1.123699732e-05f, +1.996546693e-05f, +5.827238086e-05f, +2.770539860e-05f, -9.207094896e-05f, -1.720180044e-04f, -4.082098868e-05f, +2.525700247e-04f, +3.683424601e-04f, +2.976595604e-05f, -5.253543618e-04f, -6.374784862e-04f, +2.990611803e-05f, +9.006978220e-04f, +9.356702918e-04f, -1.530006729e-04f, -1.324687140e-03f, -1.194313118e-03f, +3.317931603e-04f, +1.707930808e-03f, +1.343540912e-03f, -5.318816467e-04f, -1.953571069e-03f, -1.339988683e-03f, +7.014386192e-04f, +1.993569491e-03f, +1.184982522e-03f, -7.910499668e-04f, -1.816221724e-03f, -9.237860406e-04f, +7.746407335e-04f, +1.471123755e-03f, +6.264160665e-04f, -6.605627939e-04f, -1.048995450e-03f, -3.600441509e-04f, +4.870122059e-04f, +6.464977422e-04f, +1.665311122e-04f, -3.045473361e-04f, -3.330774214e-04f, -5.450816010e-05f, +1.552705567e-04f, +1.342466589e-04f, +6.715051279e-06f, -5.915235252e-05f, -3.575012473e-05f, +4.413538483e-06f, + /* 5,22 (48) */ + -2.526755289e-04f, +6.159892657e-05f, +8.132929023e-04f, +1.229219772e-03f, +2.761045433e-04f, -1.953719622e-03f, -3.472726928e-03f, -1.764151443e-03f, +3.237138622e-03f, +7.525892136e-03f, +5.600158101e-03f, -3.742721902e-03f, -1.375340227e-02f, -1.352905865e-02f, +1.692682847e-03f, +2.240744682e-02f, +2.864536352e-02f, +6.500100002e-03f, -3.458945564e-02f, -6.041661592e-02f, -3.279556776e-02f, +5.985205727e-02f, +1.859474689e-01f, +2.844434858e-01f, +3.023012975e-01f, +2.295849358e-01f, +1.061793204e-01f, -4.925598463e-03f, -5.781297067e-02f, -4.834869152e-02f, -8.108219891e-03f, +2.378725791e-02f, +2.753675359e-02f, +9.789571990e-03f, -9.408850104e-03f, -1.537783108e-02f, -8.003435496e-03f, +2.777769623e-03f, +7.752926082e-03f, +5.245700847e-03f, -1.436191744e-04f, -3.298473769e-03f, -2.758527925e-03f, -4.785966790e-04f, +1.066950874e-03f, +1.071022817e-03f, +3.163728156e-04f, -1.999402864e-04f, + -1.298450182e-06f, -1.827965033e-05f, -2.428425610e-05f, +3.665842204e-06f, +5.453725787e-05f, +7.331418729e-05f, +8.675864377e-06f, -1.134294190e-04f, -1.753158955e-04f, -6.402320883e-05f, +1.858378263e-04f, +3.563192359e-04f, +2.110715010e-04f, -2.418212370e-04f, -6.469163482e-04f, -5.380461344e-04f, +2.089933721e-04f, +1.101873560e-03f, +1.272692875e-03f, +1.587382800e-04f, -1.894569207e-03f, -3.672094116e-03f, -3.864674442e-03f, -2.049143015e-03f, +9.010570422e-04f, +3.347710544e-03f, +3.994045556e-03f, +2.733352090e-03f, +6.168332849e-04f, -9.795239089e-04f, -1.305465301e-03f, -6.009047662e-04f, +2.977595724e-04f, +6.842550870e-04f, +4.406445511e-04f, -5.103677261e-05f, -3.429422056e-04f, -2.805219773e-04f, -2.980895653e-05f, +1.536146589e-04f, +1.539711284e-04f, +3.911811091e-05f, -5.803114002e-05f, -6.986635178e-05f, -2.392580611e-05f, +1.751380594e-05f, +2.368389901e-05f, +7.763007857e-06f, + +5.041228121e-04f, +4.684523500e-04f, -8.386340443e-04f, -2.502607995e-03f, -1.671564710e-03f, +2.889308604e-03f, +7.022954081e-03f, +3.857371771e-03f, -7.026155510e-03f, -1.476940467e-02f, -6.882022052e-03f, +1.367198280e-02f, +2.549810488e-02f, +1.014982897e-02f, -2.247678342e-02f, -3.771576378e-02f, -1.277010236e-02f, +3.212498523e-02f, +4.891556668e-02f, +1.390945093e-02f, -4.056537951e-02f, -5.634918672e-02f, -1.316667454e-02f, +4.565266287e-02f, +5.803280438e-02f, +1.076557078e-02f, -4.595158665e-02f, -5.352298645e-02f, -7.455599217e-03f, +4.132722598e-02f, +4.408552023e-02f, +4.175083971e-03f, -3.302116624e-02f, -3.217822554e-02f, -1.661998956e-03f, +2.316466389e-02f, +2.050885756e-02f, +2.124551303e-04f, -1.396522627e-02f, -1.111826442e-02f, +3.159521796e-04f, +6.956562969e-03f, +4.879778429e-03f, -3.060282253e-04f, -2.638516856e-03f, -1.552526508e-03f, +1.342136227e-04f, +6.021623429e-04f, + -1.163351217e-05f, +1.856276310e-05f, +5.771326009e-05f, +3.026215731e-05f, -8.790692255e-05f, -1.721186407e-04f, -4.851943780e-05f, +2.439221649e-04f, +3.711605712e-04f, +4.646103780e-05f, -5.111540984e-04f, -6.461654956e-04f, +6.897906872e-07f, +8.813559796e-04f, +9.536645096e-04f, -1.096475668e-04f, -1.302433720e-03f, -1.223993503e-03f, +2.758324854e-04f, +1.686356674e-03f, +1.384900566e-03f, -4.681835516e-04f, -1.936466895e-03f, -1.390018391e-03f, +6.371072837e-04f, +1.983563450e-03f, +1.238195732e-03f, -7.333838297e-04f, -1.813865457e-03f, -9.737735056e-04f, +7.290091656e-04f, +1.474859304e-03f, +6.677900939e-04f, -6.290918642e-04f, -1.055975683e-03f, -3.899292429e-04f, +4.685544326e-04f, +6.538037531e-04f, +1.850008703e-04f, -2.957778293e-04f, -3.387264748e-04f, -6.391070698e-05f, +1.522636143e-04f, +1.375771734e-04f, +1.035235536e-05f, -5.869505005e-05f, -3.715664369e-05f, +3.568207542e-06f, + /* 5,23 (48) */ + -2.539739791e-04f, +4.331927624e-05f, +7.890086462e-04f, +1.232885614e-03f, +3.306418012e-04f, -1.880405434e-03f, -3.464051064e-03f, -1.877580862e-03f, +3.061822726e-03f, +7.461868927e-03f, +5.785995928e-03f, -3.386402666e-03f, -1.354233076e-02f, -1.377087989e-02f, +1.045766499e-03f, +2.186940069e-02f, +2.885435689e-02f, +7.601973562e-03f, -3.331676276e-02f, -6.025787764e-02f, -3.469013697e-02f, +5.617996315e-02f, +1.820827945e-01f, +2.823943428e-01f, +3.032023546e-01f, +2.329326463e-01f, +1.101733660e-01f, -2.192246374e-03f, -5.719613739e-02f, -4.932821543e-02f, -9.413685192e-03f, +2.318635314e-02f, +2.783451316e-02f, +1.047382708e-02f, -8.968205553e-03f, -1.542886786e-02f, -8.346377701e-03f, +2.497247646e-03f, +7.723117125e-03f, +5.399315506e-03f, +1.035195406e-05f, -3.259355658e-03f, -2.816559065e-03f, -5.484630308e-04f, +1.043025068e-03f, +1.088536623e-03f, +3.400567146e-04f, -1.921772785e-04f, + -8.721441469e-07f, -1.776540592e-05f, -2.454249926e-05f, +2.257867657e-06f, +5.307786957e-05f, +7.385392033e-05f, +1.197661495e-05f, -1.097713294e-04f, -1.756631414e-04f, -7.031130021e-05f, +1.777800534e-04f, +3.549124572e-04f, +2.212530097e-04f, -2.258336362e-04f, -6.400048148e-04f, -5.519779693e-04f, +1.793641383e-04f, +1.080349702e-03f, +1.285807117e-03f, +2.122664403e-04f, -1.826925267e-03f, -3.635109170e-03f, -3.890225612e-03f, -2.130568273e-03f, +8.076191064e-04f, +3.294301130e-03f, +4.005675560e-03f, +2.793121386e-03f, +6.814618109e-04f, -9.475502706e-04f, -1.314377916e-03f, -6.306148736e-04f, +2.750605043e-04f, +6.827411283e-04f, +4.546741100e-04f, -3.689334343e-05f, -3.393552354e-04f, -2.867170601e-04f, -3.775903377e-05f, +1.505870813e-04f, +1.563900589e-04f, +4.305954150e-05f, -5.620943877e-05f, -7.068967762e-05f, -2.558345201e-05f, +1.672406700e-05f, +2.396806258e-05f, +8.313625809e-06f, + +4.924893000e-04f, +4.870151131e-04f, -7.809207842e-04f, -2.472345838e-03f, -1.759471632e-03f, +2.717189964e-03f, +6.974434643e-03f, +4.101293936e-03f, -6.654994938e-03f, -1.472294363e-02f, -7.393176150e-03f, +1.302581730e-02f, +2.549879468e-02f, +1.103118495e-02f, -2.152311891e-02f, -3.782541135e-02f, -1.407253608e-02f, +3.090099172e-02f, +4.919139917e-02f, +1.559580760e-02f, -3.918047895e-02f, -5.681737027e-02f, -1.510314144e-02f, +4.426264447e-02f, +5.866991166e-02f, +1.274913423e-02f, -4.471339091e-02f, -5.425637028e-02f, -9.269464674e-03f, +4.035345248e-02f, +4.481452940e-02f, +5.649943275e-03f, -3.235337614e-02f, -3.280731741e-02f, -2.717974638e-03f, +2.277473465e-02f, +2.097741199e-02f, +8.662588835e-04f, -1.378022540e-02f, -1.141404225e-02f, -2.277429524e-05f, +6.892652262e-03f, +5.032042043e-03f, -1.684510519e-04f, -2.628164501e-03f, -1.611221558e-03f, +9.705697900e-05f, +6.057305505e-04f, + -1.199389677e-05f, +1.717459974e-05f, +5.708508235e-05f, +3.271562375e-05f, -8.371623530e-05f, -1.719969615e-04f, -5.602317951e-05f, +2.351112459e-04f, +3.734894680e-04f, +6.288388262e-05f, -4.965161516e-04f, -6.540016554e-04f, -2.824672336e-05f, +8.611594400e-04f, +9.704204222e-04f, -6.646319794e-05f, -1.278821250e-03f, -1.252124341e-03f, +2.197990000e-04f, +1.662940582e-03f, +1.424572536e-03f, -4.040820973e-04f, -1.917187310e-03f, -1.438445122e-03f, +5.720388143e-04f, +1.971295339e-03f, +1.290092373e-03f, -6.747407438e-04f, -1.809432872e-03f, -1.022848338e-03f, +6.823223727e-04f, +1.476919655e-03f, +7.086615254e-04f, -5.966591145e-04f, -1.061782430e-03f, -4.196341833e-04f, +4.493521809e-04f, +6.604135915e-04f, +2.034810611e-04f, -2.865252041e-04f, -3.440429587e-04f, -7.339249953e-05f, +1.490034349e-04f, +1.407945597e-04f, +1.406085667e-05f, -5.813984021e-05f, -3.854746139e-05f, +2.686215319e-06f, + /* 5,24 (48) */ + -2.548461232e-04f, +2.555387032e-05f, +7.644661469e-04f, +1.235143482e-03f, +3.837196708e-04f, -1.806551514e-03f, -3.452074449e-03f, -1.987352192e-03f, +2.886159585e-03f, +7.391557627e-03f, +5.963775981e-03f, -3.031490209e-03f, -1.332107775e-02f, -1.399671352e-02f, +4.057616846e-04f, +2.131742272e-02f, +2.903372103e-02f, +8.682323264e-03f, -3.203095565e-02f, -6.004561120e-02f, -3.651706223e-02f, +5.254485398e-02f, +1.781925688e-01f, +2.802637745e-01f, +3.040099737e-01f, +2.362269475e-01f, +1.141790415e-01f, +6.008750117e-04f, -5.651467558e-02f, -5.027576570e-02f, -1.072806311e-02f, +2.255573827e-02f, +2.810957367e-02f, +1.115656820e-02f, -8.513531443e-03f, -1.546576120e-02f, -8.685732937e-03f, +2.210530586e-03f, +7.685358092e-03f, +5.549902587e-03f, +1.667420129e-04f, -3.216296117e-03f, -2.872768504e-03f, -6.191527084e-04f, +1.017441616e-03f, +1.105260690e-03f, +3.640247771e-04f, -1.838636527e-04f, + -4.580078570e-07f, -1.724180117e-05f, -2.476498981e-05f, +8.777214654e-07f, +5.158945309e-05f, +7.430614754e-05f, +1.520990028e-05f, -1.060594193e-04f, -1.758302573e-04f, -7.644236730e-05f, +1.696565939e-04f, +3.531811281e-04f, +2.310957910e-04f, -2.098269225e-04f, -6.325743348e-04f, -5.652252355e-04f, +1.499382191e-04f, +1.058123249e-03f, +1.297591698e-03f, +2.647703935e-04f, -1.759068952e-03f, -3.596530898e-03f, -3.913691982e-03f, -2.210770639e-03f, +7.137124599e-04f, +3.239051608e-03f, +4.015321239e-03f, +2.851982022e-03f, +7.466178985e-04f, -9.142539476e-04f, -1.322210214e-03f, -6.601205199e-04f, +2.518208778e-04f, +6.805605342e-04f, +4.684408418e-04f, -2.253768358e-05f, -3.353918321e-04f, -2.927125456e-04f, -4.578169855e-05f, +1.473641109e-04f, +1.586868851e-04f, +4.702111702e-05f, -5.429598519e-05f, -7.145175848e-05f, -2.724700567e-05f, +1.589591286e-05f, +2.422880418e-05f, +8.868877284e-06f, + +4.804954032e-04f, +5.041897128e-04f, -7.238357019e-04f, -2.439630214e-03f, -1.843187868e-03f, +2.545193002e-03f, +6.918411464e-03f, +4.336405182e-03f, -6.281505470e-03f, -1.466005975e-02f, -7.889692302e-03f, +1.237181565e-02f, +2.547054795e-02f, +1.189234439e-02f, -2.055269849e-02f, -3.789187454e-02f, -1.535135733e-02f, +2.964886738e-02f, +4.941119817e-02f, +1.725874818e-02f, -3.775590641e-02f, -5.722145237e-02f, -1.702032875e-02f, +4.282419935e-02f, +5.924195048e-02f, +1.472042957e-02f, -4.342329854e-02f, -5.493111103e-02f, -1.107889755e-02f, +3.933060414e-02f, +4.549685177e-02f, +7.126862931e-03f, -3.164471462e-02f, -3.340397652e-02f, -3.779757068e-03f, +2.235510046e-02f, +2.142676417e-02f, +1.526672475e-03f, -1.357674434e-02f, -1.170056746e-02f, -3.668172540e-04f, +6.819259763e-03f, +5.181045478e-03f, -2.765649223e-05f, -2.614103644e-03f, -1.669361398e-03f, +5.850951761e-05f, +6.084167658e-04f, + -1.231862419e-05f, +1.580284829e-05f, +5.639053797e-05f, +3.506461595e-05f, -7.950518296e-05f, -1.716572328e-04f, -6.332576399e-05f, +2.261509316e-04f, +3.753330419e-04f, +7.901772440e-05f, -4.814633604e-04f, -6.609863865e-04f, -5.687146046e-05f, +8.401394188e-04f, +9.859275928e-04f, -2.349719803e-05f, -1.253885324e-03f, -1.278680614e-03f, +1.637582340e-04f, +1.637716154e-03f, +1.462515425e-03f, -3.396523490e-04f, -1.895757366e-03f, -1.485213656e-03f, +5.063084046e-04f, +1.956777258e-03f, +1.340610040e-03f, -6.151864918e-04f, -1.802922556e-03f, -1.070949660e-03f, +6.346300523e-04f, +1.477293135e-03f, +7.489789079e-04f, -5.632960958e-04f, -1.066399226e-03f, -4.491216100e-04f, +4.294212432e-04f, +6.663114089e-04f, +2.219489135e-04f, -2.767945562e-04f, -3.490151391e-04f, -8.294247518e-05f, +1.454898128e-04f, +1.438921311e-04f, +1.783680397e-05f, -5.748515713e-05f, -3.991988566e-05f, +1.768012448e-06f, + /* 5,25 (48) */ + -2.553041311e-04f, +8.312069153e-06f, +7.397011571e-04f, +1.236021203e-03f, +4.353091239e-04f, -1.732245367e-03f, -3.436864548e-03f, -2.093411611e-03f, +2.710329328e-03f, +7.315115260e-03f, +6.133432575e-03f, -2.678309081e-03f, -1.308998196e-02f, -1.420654044e-02f, -2.268126503e-04f, +2.075219748e-02f, +2.918365925e-02f, +9.740446513e-03f, -3.073336395e-02f, -5.978084081e-02f, -3.827613119e-02f, +4.894832309e-02f, +1.742788769e-01f, +2.780530039e-01f, +3.047236861e-01f, +2.394659991e-01f, +1.181943628e-01f, +3.452857034e-03f, -5.576805768e-02f, -5.119001965e-02f, -1.205027332e-02f, +2.189561775e-02f, +2.836139455e-02f, +1.183712874e-02f, -8.045090601e-03f, -1.548829888e-02f, -9.021124769e-03f, +1.917818040e-03f, +7.639576393e-03f, +5.697266698e-03f, +3.254288980e-04f, -3.169275000e-03f, -2.927064489e-03f, -6.906044669e-04f, +9.901946107e-04f, +1.121156602e-03f, +3.882535813e-04f, -1.749947754e-04f, + -5.634856882e-08f, -1.670976246e-05f, -2.495223275e-05f, -4.735395420e-07f, +5.007421371e-05f, +7.467188368e-05f, +1.837338947e-05f, -1.022983425e-04f, -1.758196513e-04f, -8.241240968e-05f, +1.614763310e-04f, +3.511310192e-04f, +2.405944913e-04f, -1.938165692e-04f, -6.246380358e-04f, -5.777838078e-04f, +1.207398156e-04f, +1.035222544e-03f, +1.308054313e-03f, +3.162242503e-04f, -1.691046668e-03f, -3.556393705e-03f, -3.935068360e-03f, -2.289705519e-03f, +6.193914536e-04f, +3.181989019e-03f, +4.022965919e-03f, +2.909889168e-03f, +8.122621241e-04f, -8.796439193e-04f, -1.328941313e-03f, -6.893924609e-04f, +2.280557008e-04f, +6.777073783e-04f, +4.819284022e-04f, -7.981125454e-06f, -3.310511696e-04f, -2.984998835e-04f, -5.386984442e-05f, +1.439462797e-04f, +1.608573953e-04f, +5.099895153e-05f, -5.229130969e-05f, -7.215062819e-05f, -2.891464378e-05f, +1.502953948e-05f, +2.446523357e-05f, +9.428075830e-06f, + +4.681767790e-04f, +5.199925611e-04f, -6.674451639e-04f, -2.404565598e-03f, -1.922693051e-03f, +2.373535769e-03f, +6.855085700e-03f, +4.562556114e-03f, -5.906172429e-03f, -1.458104203e-02f, -8.371155662e-03f, +1.171082926e-02f, +2.541367649e-02f, +1.273248380e-02f, -1.956677089e-02f, -3.791537174e-02f, -1.660524265e-02f, +2.837018677e-02f, +4.957495640e-02f, +1.889646434e-02f, -3.629339099e-02f, -5.756110472e-02f, -1.891608611e-02f, +4.133898570e-02f, +5.974825888e-02f, +1.667720682e-02f, -4.208268850e-02f, -5.554629752e-02f, -1.288182010e-02f, +3.825965448e-02f, +4.613148183e-02f, +8.604156065e-03f, -3.089573571e-02f, -3.396727262e-02f, -4.846156295e-03f, +2.190597885e-02f, +2.185618541e-02f, +2.192983884e-03f, -1.335479543e-02f, -1.197736201e-02f, -7.158323930e-04f, +6.736317288e-03f, +5.326535291e-03f, +1.162356389e-04f, -2.596266840e-03f, -1.726846555e-03f, +1.858963195e-05f, +6.101847783e-04f, + -1.260821934e-05f, +1.444930562e-05f, +5.563235826e-05f, +3.730813087e-05f, -7.527996901e-05f, -1.711039439e-04f, -7.042111331e-05f, +2.170548800e-04f, +3.766957546e-04f, +9.484636779e-05f, -4.660188261e-04f, -6.671201672e-04f, -8.515313225e-05f, +8.183278745e-04f, +1.000177170e-03f, +1.920138852e-05f, -1.227662917e-03f, -1.303639304e-03f, +1.077754521e-04f, +1.610719037e-03f, +1.498689992e-03f, -2.749696122e-04f, -1.872204622e-03f, -1.530270760e-03f, +4.399920438e-04f, +1.940023976e-03f, +1.389687861e-03f, -5.547880913e-04f, -1.794335564e-03f, -1.118017518e-03f, +5.859833326e-04f, +1.475970030e-03f, +7.886911375e-04f, -5.290357102e-04f, -1.069810928e-03f, -4.783540991e-04f, +4.087784712e-04f, +6.714820789e-04f, +2.403814012e-04f, -2.665916643e-04f, -3.536315659e-04f, -9.254930693e-05f, +1.417228871e-04f, +1.468632456e-04f, +2.167626924e-05f, -5.672955354e-05f, -4.127118779e-05f, +8.141264825e-07f, + /* 5,26 (48) */ + -2.553604797e-04f, -8.397693308e-06f, +7.147489243e-04f, +1.235547664e-03f, +4.853833376e-04f, -1.657573483e-03f, -3.418491159e-03f, -2.195709953e-03f, +2.534509676e-03f, +7.232702850e-03f, +6.294908906e-03f, -2.327178061e-03f, -1.284938747e-02f, -1.440035701e-02f, -8.514506861e-04f, +2.017441367e-02f, +2.930439907e-02f, +1.077566906e-02f, -2.942530964e-02f, -5.946461656e-02f, -3.996717785e-02f, +4.539192938e-02f, +1.703438085e-01f, +2.757632984e-01f, +3.053430776e-01f, +2.426479881e-01f, +1.222173287e-01f, +6.362746202e-03f, -5.495579556e-02f, -5.206966357e-02f, -1.337921463e-02f, +2.120622529e-02f, +2.858945025e-02f, +1.251483612e-02f, -7.563162199e-03f, -1.549628001e-02f, -9.352175938e-03f, +1.619318156e-03f, +7.585706549e-03f, +5.841212978e-03f, +4.862862933e-04f, -3.118276048e-03f, -2.979355799e-03f, -7.627550950e-04f, +9.612799669e-04f, +1.136186142e-03f, +4.127188149e-04f, -1.655666996e-04f, + +3.325513140e-07f, -1.617020805e-05f, -2.510476735e-05f, -1.794912561e-06f, +4.853434916e-05f, +7.495222276e-05f, +2.146486268e-05f, -9.849273735e-05f, -1.756338820e-04f, -8.821764323e-05f, +1.532480920e-04f, +3.487681447e-04f, +2.497441538e-04f, -1.778178744e-04f, -6.162093691e-04f, -5.896502377e-04f, +9.179265262e-05f, +1.011676179e-03f, +1.317203614e-03f, +3.666031161e-04f, -1.622904620e-03f, -3.514732883e-03f, -3.954350967e-03f, -2.367329218e-03f, +5.247107342e-04f, +3.123141668e-03f, +4.028594211e-03f, +2.966798390e-03f, +8.783544077e-04f, -8.437302523e-04f, -1.334551005e-03f, -7.184013214e-04f, +2.037806323e-04f, +6.741762959e-04f, +4.951205242e-04f, +6.764669129e-06f, -3.263327849e-04f, -3.040706252e-04f, -6.201620534e-05f, +1.403343294e-04f, +1.628974510e-04f, +5.498908266e-05f, -5.019605233e-05f, -7.278435928e-05f, -3.058450494e-05f, +1.412519415e-05f, +2.467647407e-05f, +9.990514341e-06f, + +4.555685597e-04f, +5.344418668e-04f, -6.118128057e-04f, -2.367257467e-03f, -1.997973020e-03f, +2.202431825e-03f, +6.784664586e-03f, +4.779610994e-03f, -5.529476674e-03f, -1.448619566e-02f, -8.837174489e-03f, +1.104370909e-02f, +2.532852336e-02f, +1.355081168e-02f, -1.856659372e-02f, -3.789617035e-02f, -1.783290557e-02f, +2.706654746e-02f, +4.968273185e-02f, +2.050718337e-02f, -3.479470099e-02f, -5.783607433e-02f, -2.078829074e-02f, +3.980871493e-02f, +6.018825092e-02f, +1.861723080e-02f, -4.069300064e-02f, -5.610108561e-02f, -1.467615567e-02f, +3.714163696e-02f, +4.671746516e-02f, +1.008012610e-02f, -3.010704457e-02f, -3.449630833e-02f, -5.915967223e-03f, +2.142762475e-02f, +2.226496388e-02f, +2.864465963e-03f, -1.311441403e-02f, -1.224395368e-02f, -1.069463959e-03f, +6.643767981e-03f, +5.468258178e-03f, +2.630988845e-04f, -2.574590571e-03f, -1.783576109e-03f, -2.268155584e-05f, +6.109989047e-04f, + -1.286325678e-05f, +1.311569267e-05f, +5.481331037e-05f, +3.944534245e-05f, -7.104669728e-05f, -1.703417977e-04f, -7.730352398e-05f, +2.078367251e-04f, +3.775826245e-04f, +1.103542023e-04f, -4.502058804e-04f, -6.724045223e-04f, -1.130611588e-04f, +7.957574627e-04f, +1.013161888e-03f, +6.158416111e-05f, -1.200192326e-03f, -1.326979411e-03f, +5.191557569e-05f, +1.581986859e-03f, +1.533059196e-03f, -2.101093419e-04f, -1.846559109e-03f, -1.573565251e-03f, +3.731664260e-04f, +1.921052916e-03f, +1.437266567e-03f, -4.936137165e-04f, -1.783675417e-03f, -1.163992963e-03f, +5.364347167e-04f, +1.472942613e-03f, +8.277475240e-04f, -4.939121784e-04f, -1.072003745e-03f, -5.072942109e-04f, +3.874417647e-04f, +6.759112251e-04f, +2.587552704e-04f, -2.559229908e-04f, -3.578810928e-04f, -1.022014149e-04f, +1.377031470e-04f, +1.497013158e-04f, +2.557515028e-05f, -5.587170545e-05f, -4.259860619e-05f, -1.748371843e-07f, + /* 5,27 (48) */ + -2.550279284e-04f, -2.456790136e-05f, +6.896441570e-04f, +1.233752751e-03f, +5.339176868e-04f, -1.582621260e-03f, -3.397026296e-03f, -2.294202691e-03f, +2.358875794e-03f, +7.144485207e-03f, +6.448156998e-03f, -1.978409917e-03f, -1.259964332e-02f, -1.457817489e-02f, -1.467660055e-03f, +1.958476344e-02f, +2.939619172e-02f, +1.178734524e-02f, -2.810810602e-02f, -5.909801344e-02f, -4.159008247e-02f, +4.187719650e-02f, +1.663894575e-01f, +2.733959691e-01f, +3.058677883e-01f, +2.457711298e-01f, +1.262459229e-01f, +9.329544592e-03f, -5.407744115e-02f, -5.291339382e-02f, -1.471376564e-02f, +2.048782397e-02f, +2.879323088e-02f, +1.318901241e-02f, -7.068041675e-03f, -1.548951534e-02f, -9.678508723e-03f, +1.315247531e-03f, +7.523690343e-03f, +5.981547307e-03f, +6.491837443e-04f, -3.063286966e-03f, -3.029551851e-03f, -8.355394543e-04f, +9.306954619e-04f, +1.150311336e-03f, +4.373952890e-04f, -1.555761852e-04f, + +7.084341628e-07f, -1.562404701e-05f, -2.522316587e-05f, -3.085449097e-06f, +4.697204714e-05f, +7.514833557e-05f, +2.448221192e-05f, -9.464722144e-05f, -1.752756536e-04f, -9.385450125e-05f, +1.449806409e-04f, +3.460987533e-04f, +2.585402193e-04f, -1.618459476e-04f, -6.073020941e-04f, -6.008217499e-04f, +6.311996246e-05f, +9.875129711e-04f, +1.325049194e-03f, +4.158831038e-04f, -1.554688781e-03f, -3.471584587e-03f, -3.971537433e-03f, -2.443598970e-03f, +4.297252058e-04f, +3.062539108e-03f, +4.032192029e-03f, +3.022665690e-03f, +9.448540396e-04f, -8.065241007e-04f, -1.339019774e-03f, -7.471176191e-04f, +1.790119753e-04f, +6.699624954e-04f, +5.080010344e-04f, +2.168771654e-05f, -3.212365825e-04f, -3.094164336e-04f, -7.021336113e-05f, +1.365292130e-04f, +1.648029922e-04f, +5.898747491e-05f, -4.801096373e-05f, -7.335106579e-05f, -3.225469128e-05f, +1.318317613e-05f, +2.486166402e-05f, +1.055546563e-05f, + +4.427053029e-04f, +5.475575594e-04f, -5.569994953e-04f, -2.327812125e-03f, -2.069019717e-03f, +2.032090028e-03f, +6.707361062e-03f, +4.987447719e-03f, -5.151894049e-03f, -1.437584146e-02f, -9.287380369e-03f, +1.037130457e-02f, +2.521546220e-02f, +1.434656914e-02f, -1.755343184e-02f, -3.783458619e-02f, -1.903309789e-02f, +2.573956805e-02f, +4.973464743e-02f, +2.208917023e-02f, -3.326164180e-02f, -5.804618367e-02f, -2.263484985e-02f, +3.823514968e-02f, +6.056141735e-02f, +2.053828372e-02f, -3.925573407e-02f, -5.659469933e-02f, -1.645983108e-02f, +3.597764400e-02f, +4.725389987e-02f, +1.155306871e-02f, -2.927929705e-02f, -3.499022051e-02f, -6.987970968e-03f, +2.092033054e-02f, +2.265240565e-02f, +3.540377188e-03f, -1.285565876e-02f, -1.249987667e-02f, -1.427345052e-03f, +6.541566566e-03f, +5.605961325e-03f, +4.128002002e-04f, -2.549015421e-03f, -1.839447814e-03f, -6.528016204e-05f, +6.108240676e-04f, + -1.308435842e-05f, +1.180365334e-05f, +5.393619212e-05f, +4.147559932e-05f, -6.681136497e-05f, -1.693757007e-04f, -8.396766904e-05f, +1.985100593e-04f, +3.779992129e-04f, +1.255262157e-04f, -4.340480528e-04f, -6.768420109e-04f, -1.405657006e-04f, +7.724614896e-04f, +1.024876061e-03f, +1.036034182e-04f, -1.171513123e-03f, -1.348681970e-03f, -3.756894563e-06f, +1.551559172e-03f, +1.565588232e-03f, -1.451470514e-04f, -1.818853291e-03f, -1.615048053e-03f, +3.059088574e-04f, +1.899884136e-03f, +1.483288570e-03f, -4.317326185e-04f, -1.770948110e-03f, -1.208818120e-03f, +4.860380252e-04f, +1.468205161e-03f, +8.660978565e-04f, -4.579610073e-04f, -1.072965264e-03f, -5.359045371e-04f, +3.654300590e-04f, +6.795852465e-04f, +2.770470667e-04f, -2.447956822e-04f, -3.617528960e-04f, -1.118869784e-04f, +1.334314370e-04f, +1.523998194e-04f, +2.952917350e-05f, -5.491041683e-05f, -4.389935025e-05f, -1.198194503e-06f, + /* 5,28 (48) */ + -2.543194942e-04f, -4.019194836e-05f, +6.644209911e-04f, +1.230667302e-03f, +5.808897339e-04f, -1.507472925e-03f, -3.372544084e-03f, -2.388849912e-03f, +2.183600141e-03f, +7.050630706e-03f, +6.593137639e-03f, -1.632311164e-03f, -1.234110310e-02f, -1.474002084e-02f, -2.074962149e-03f, +1.898394169e-02f, +2.945931168e-02f, +1.277485821e-02f, -2.678305683e-02f, -5.868213034e-02f, -4.314477126e-02f, +3.840561191e-02f, +1.624179201e-01f, +2.709523702e-01f, +3.062975135e-01f, +2.488336689e-01f, +1.302781149e-01f, +1.235221028e-02f, -5.313258711e-02f, -5.371991792e-02f, -1.605278541e-02f, +1.974070635e-02f, +2.897224286e-02f, +1.385897491e-02f, -6.560040640e-03f, -1.546782762e-02f, -9.999745306e-03f, +1.005831098e-03f, +7.453476982e-03f, +6.118076521e-03f, +8.139867365e-04f, -3.004299491e-03f, -3.077562815e-03f, -9.088905201e-04f, +8.984407707e-04f, +1.163494512e-03f, +4.622569530e-04f, -1.450207196e-04f, + +1.071067014e-06f, -1.507217817e-05f, -2.530803227e-05f, -4.344255180e-06f, +4.538948299e-05f, +7.526146721e-05f, +2.742344173e-05f, -9.076638712e-05f, -1.747478114e-04f, -9.931963539e-05f, +1.366826693e-04f, +3.431293195e-04f, +2.669785256e-04f, -1.459156977e-04f, -5.979302622e-04f, -6.112962379e-04f, +3.474447002e-05f, +9.627619319e-04f, +1.331601571e-03f, +4.640413452e-04f, -1.486444859e-03f, -3.426985803e-03f, -3.986626796e-03f, -2.518472968e-03f, +3.344899904e-04f, +3.000212120e-03f, +4.033746599e-03f, +3.077447539e-03f, +1.011719708e-03f, -7.680377050e-04f, -1.342328824e-03f, -7.755117888e-04f, +1.537666687e-04f, +6.650617683e-04f, +5.205538694e-04f, +3.677571941e-05f, -3.157628388e-04f, -3.145290927e-04f, -7.845374324e-05f, +1.325320967e-04f, +1.665700430e-04f, +6.299002298e-05f, -4.573690588e-05f, -7.384890615e-05f, -3.392327012e-05f, +1.220383718e-05f, +2.501995817e-05f, +1.112218308e-05f, + +4.296209445e-04f, +5.593612128e-04f, -5.030633032e-04f, -2.286336525e-03f, -2.135831082e-03f, +1.862714327e-03f, +6.623393393e-03f, +5.185957778e-03f, -4.773894837e-03f, -1.425031524e-02f, -9.721428422e-03f, +9.694462559e-03f, +2.507489650e-02f, +1.511903063e-02f, -1.652855578e-02f, -3.773098278e-02f, -2.020461102e-02f, +2.439088608e-02f, +4.973089053e-02f, +2.364072940e-02f, -3.169605357e-02f, -5.819133072e-02f, -2.445370314e-02f, +3.662010163e-02f, +6.086732621e-02f, +2.243816785e-02f, -3.777244550e-02f, -5.702643195e-02f, -1.823077919e-02f, +3.476882588e-02f, +4.773993790e-02f, +1.302127387e-02f, -2.841319919e-02f, -3.544818151e-02f, -8.060936232e-03f, +2.038442601e-02f, +2.301783571e-02f, +4.219962434e-03f, -1.257861169e-02f, -1.274467235e-02f, -1.789097948e-03f, +6.429679587e-03f, +5.739392762e-03f, +5.652000196e-04f, -2.519486247e-03f, -1.894358231e-03f, -1.091795123e-04f, +6.096258730e-04f, + -1.327219129e-05f, +1.051475348e-05f, +5.300382693e-05f, +4.339842234e-05f, -6.257985583e-05f, -1.682107523e-04f, -9.040859955e-05f, +1.890884151e-04f, +3.779516098e-04f, +1.403480063e-04f, -4.175690386e-04f, -6.804362127e-04f, -1.676376893e-04f, +7.484738657e-04f, +1.035315582e-03f, +1.452122113e-04f, -1.141666093e-03f, -1.368730061e-03f, -5.917795491e-05f, +1.519477402e-03f, +1.596244569e-03f, -8.015822091e-05f, -1.789122022e-03f, -1.654672260e-03f, +2.382971639e-04f, +1.876540307e-03f, +1.527698035e-03f, -3.692150440e-04f, -1.756162112e-03f, -1.252436269e-03f, +4.348483358e-04f, +1.461753968e-03f, +9.036924671e-04f, -4.212189541e-04f, -1.072684480e-03f, -5.641477479e-04f, +3.427633103e-04f, +6.824913432e-04f, +2.952331641e-04f, -2.332175677e-04f, -3.652364931e-04f, -1.215939488e-04f, +1.289089615e-04f, +1.549523100e-04f, +3.353389702e-05f, -5.384462416e-05f, -4.517060431e-05f, -2.255182080e-06f, + /* 5,29 (48) */ + -2.532484272e-04f, -5.526412654e-05f, +6.391129589e-04f, +1.226323047e-03f, +6.262792169e-04f, -1.432211457e-03f, -3.345120643e-03f, -2.479616299e-03f, +2.008852329e-03f, +6.951311070e-03f, +6.729820308e-03f, -1.289181844e-03f, -1.207412457e-02f, -1.488593653e-02f, -2.672892411e-03f, +1.837264545e-02f, +2.949405615e-02f, +1.373762014e-02f, -2.545145526e-02f, -5.821808899e-02f, -4.463121611e-02f, +3.497862611e-02f, +1.584312933e-01f, +2.684338972e-01f, +3.066320035e-01f, +2.518338810e-01f, +1.343118615e-01f, +1.542965782e-02f, -5.212086740e-02f, -5.448795563e-02f, -1.739511424e-02f, +1.896519456e-02f, +2.912600952e-02f, +1.452403668e-02f, -6.039486771e-03f, -1.543105190e-02f, -1.031550814e-02f, +6.913020049e-04f, +7.375023239e-03f, +6.250608617e-03f, +9.805567796e-04f, -2.941309468e-03f, -3.123299721e-03f, -9.827394263e-04f, +8.645175005e-04f, +1.175698349e-03f, +4.872769112e-04f, -1.338985365e-04f, + +1.420241427e-06f, -1.451548917e-05f, -2.536000083e-05f, -5.570491509e-06f, +4.378881732e-05f, +7.529293449e-05f, +3.028666972e-05f, -8.685479693e-05f, -1.740533367e-04f, -1.046099163e-04f, +1.283627894e-04f, +3.398665344e-04f, +2.750553076e-04f, -1.300418210e-04f, -5.881082002e-04f, -6.210722581e-04f, +6.688377871e-06f, +9.374522451e-04f, +1.336872173e-03f, +5.110560018e-04f, -1.418218264e-03f, -3.380974317e-03f, -3.999619503e-03f, -2.591910390e-03f, +2.390603885e-04f, +2.936192693e-03f, +4.033246478e-03f, +3.131100912e-03f, +1.078909526e-03f, -7.282843910e-04f, -1.344460098e-03f, -8.035542069e-04f, +1.280622791e-04f, +6.594704999e-04f, +5.327630927e-04f, +5.201607505e-05f, -3.099122062e-04f, -3.194005173e-04f, -8.672964061e-05f, +1.283443613e-04f, +1.681947169e-04f, +6.699255526e-05f, -4.337485293e-05f, -7.427608600e-05f, -3.558827568e-05f, +1.118758209e-05f, +2.515052909e-05f, +1.168990126e-05f, + +4.163487532e-04f, +5.698759662e-04f, -4.500594762e-04f, -2.242938103e-03f, -2.198410938e-03f, +1.694503575e-03f, +6.532984794e-03f, +5.375046193e-03f, -4.395943227e-03f, -1.410996723e-02f, -1.013899746e-02f, +9.014026346e-03f, +2.490725881e-02f, +1.586750450e-02f, -1.549324019e-02f, -3.758577056e-02f, -2.134627711e-02f, +2.302215602e-02f, +4.967171258e-02f, +2.516020681e-02f, -3.009980900e-02f, -5.827148895e-02f, -2.624282516e-02f, +3.496542937e-02f, +6.110562337e-02f, +2.431470816e-02f, -3.624474747e-02f, -5.739564699e-02f, -1.998694131e-02f, +3.351638961e-02f, +4.817478624e-02f, +1.448302784e-02f, -2.750950673e-02f, -3.586940047e-02f, -9.133620712e-03f, +1.982027826e-02f, +2.336059902e-02f, +4.902453778e-03f, -1.228337852e-02f, -1.297788992e-02f, -2.154334441e-03f, +6.308085639e-03f, +5.868301724e-03f, +7.201523296e-04f, -2.485952350e-03f, -1.948202855e-03f, -1.543501166e-04f, +6.073706910e-04f, + -1.342746520e-05f, +9.250480050e-06f, +5.201905875e-05f, +4.521350195e-05f, -5.835793373e-05f, -1.668522344e-04f, -9.662174551e-05f, +1.795852487e-04f, +3.774464191e-04f, +1.548057940e-04f, -4.007926665e-04f, -6.831917134e-04f, -1.942488568e-04f, +7.238290583e-04f, +1.044477917e-03f, +1.863643975e-04f, -1.110693183e-03f, -1.387108823e-03f, -1.142841741e-04f, +1.485784786e-03f, +1.624997983e-03f, -1.521820702e-05f, -1.757402499e-03f, -1.692393190e-03f, +1.704095971e-04f, +1.851046690e-03f, +1.570440944e-03f, -3.061321530e-04f, -1.739328359e-03f, -1.294791911e-03f, +3.829219223e-04f, +1.453587369e-03f, +9.404822960e-04f, -3.837239896e-04f, -1.071151816e-03f, -5.919866399e-04f, +3.194624803e-04f, +6.846175414e-04f, +3.132897930e-04f, -2.211971578e-04f, -3.683217620e-04f, -1.313100623e-04f, +1.241372887e-04f, +1.573524280e-04f, +3.758471417e-05f, -5.267340081e-05f, -4.640953171e-05f, -3.344956610e-06f, + /* 5,30 (48) */ + -2.518281858e-04f, -6.977961571e-05f, +6.137529580e-04f, +1.220752556e-03f, +6.700680342e-04f, -1.356918523e-03f, -3.314833973e-03f, -2.566471096e-03f, +1.834798993e-03f, +6.846701154e-03f, +6.858183098e-03f, -9.493153096e-04f, -1.179906927e-02f, -1.501597835e-02f, -3.261000612e-03f, +1.775157319e-02f, +2.950074453e-02f, +1.467507238e-02f, -2.411458308e-02f, -5.770703299e-02f, -4.604943438e-02f, +3.159765179e-02f, +1.544316738e-01f, +2.658419868e-01f, +3.068710639e-01f, +2.547700737e-01f, +1.383451080e-01f, +1.856075873e-02f, -5.104195788e-02f, -5.521624002e-02f, -1.873957433e-02f, +1.816164035e-02f, +2.925407180e-02f, +1.518350718e-02f, -5.506723678e-03f, -1.537903583e-02f, -1.062542035e-02f, +3.719014876e-04f, +7.288293598e-03f, +6.378952979e-03f, +1.148751496e-03f, -2.874316912e-03f, -3.166674574e-03f, -1.057015512e-03f, +8.289292249e-04f, +1.186885931e-03f, +5.124274402e-04f, -1.222086353e-04f, + +1.755773309e-06f, -1.395485539e-05f, -2.537973484e-05f, -6.763373530e-06f, +4.217219376e-05f, +7.524412339e-05f, +3.307012695e-05f, -8.291697915e-05f, -1.731953418e-04f, -1.097224341e-04f, +1.200295256e-04f, +3.363172964e-04f, +2.827671959e-04f, -1.142387896e-04f, -5.778504940e-04f, -6.301490248e-04f, -2.102664783e-05f, +9.116132390e-04f, +1.340873323e-03f, +5.569062743e-04f, -1.350054072e-03f, -3.333588684e-03f, -4.010517398e-03f, -2.663871431e-03f, +1.434918397e-04f, +2.870514001e-03f, +4.030681563e-03f, +3.183583322e-03f, +1.146381061e-03f, -6.872785669e-04f, -1.345396299e-03f, -8.312152161e-04f, +1.019169912e-04f, +6.531856788e-04f, +5.446129107e-04f, +6.739588425e-05f, -3.036857170e-04f, -3.240227631e-04f, -9.503320589e-05f, +1.239676040e-04f, +1.696732221e-04f, +7.099083746e-05f, -4.092589172e-05f, -7.463086104e-05f, -3.724771090e-05f, +1.013486907e-05f, +2.525256859e-05f, +1.225783667e-05f, + +4.029212880e-04f, +5.791264463e-04f, -3.980404175e-04f, -2.197724601e-03f, -2.256768871e-03f, +1.527651340e-03f, +6.436363048e-03f, +5.554631442e-03f, -4.018496808e-03f, -1.395516144e-02f, -1.053979013e-02f, +8.330834633e-03f, +2.471300995e-02f, +1.659133356e-02f, -1.444876228e-02f, -3.739940617e-02f, -2.245697029e-02f, +2.163504720e-02f, +4.955742841e-02f, +2.664599159e-02f, -2.847481101e-02f, -5.828670715e-02f, -2.800022766e-02f, +3.327303618e-02f, +6.127603297e-02f, +2.616575485e-02f, -3.467430652e-02f, -5.770177914e-02f, -2.172626967e-02f, +3.222159770e-02f, +4.855770816e-02f, +1.593661521e-02f, -2.656902443e-02f, -3.625312446e-02f, -1.020477253e-02f, +1.922829162e-02f, +2.368006150e-02f, +5.587071319e-03f, -1.197008873e-02f, -1.319908707e-02f, -2.522656203e-03f, +6.176775576e-03f, +5.992439012e-03f, +8.775047576e-04f, -2.448367636e-03f, -2.000876256e-03f, -2.007596483e-04f, +6.040257344e-04f, + -1.355093038e-05f, +8.012240443e-06f, +5.098474714e-05f, +4.692069522e-05f, -5.415123641e-05f, -1.653056012e-04f, -1.026029163e-04f, +1.700139223e-04f, +3.764907428e-04f, +1.688864313e-04f, -3.837428672e-04f, -6.851140893e-04f, -2.203717640e-04f, +6.985620449e-04f, +1.052362092e-03f, +2.270146915e-04f, -1.078637439e-03f, -1.403805461e-03f, -1.690127679e-04f, +1.450526321e-03f, +1.651820586e-03f, +4.959784783e-05f, -1.723734218e-03f, -1.728168432e-03f, +1.023247407e-04f, +1.823431103e-03f, +1.611465173e-03f, -2.425559345e-04f, -1.720460254e-03f, -1.335830847e-03f, +3.303161911e-04f, +1.443705745e-03f, +9.764189553e-04f, -3.455152596e-04f, -1.068359147e-03f, -6.193841835e-04f, +2.955495186e-04f, +6.859527169e-04f, +3.311930698e-04f, -2.087436413e-04f, -3.709989590e-04f, -1.410228537e-04f, +1.191183543e-04f, +1.595939104e-04f, +4.167685723e-05f, -5.139596134e-05f, -4.761327908e-05f, -4.466594439e-06f, + /* 5,31 (48) */ + -2.500724124e-04f, -8.373447109e-05f, +5.883732232e-04f, +1.213989182e-03f, +7.122402280e-04f, -1.281674399e-03f, -3.281763846e-03f, -2.649388075e-03f, +1.661603651e-03f, +6.736978720e-03f, +6.978212623e-03f, -6.129980132e-04f, -1.151630207e-02f, -1.513021714e-02f, -3.838851106e-03f, +1.712142417e-02f, +2.947971788e-02f, +1.558668562e-02f, -2.277370976e-02f, -5.715012672e-02f, -4.739948845e-02f, +2.826406311e-02f, +1.504211564e-01f, +2.631781154e-01f, +3.070145557e-01f, +2.576405877e-01f, +1.423757896e-01f, +2.174434206e-02f, -4.989557681e-02f, -5.590351858e-02f, -2.008497063e-02f, +1.733042513e-02f, +2.935598879e-02f, +1.583669286e-02f, -4.962110768e-03f, -1.531163994e-02f, -1.092910607e-02f, +4.787872449e-05f, +7.193260392e-03f, +6.502920583e-03f, +1.318424719e-03f, -2.803326075e-03f, -3.207600465e-03f, -1.131646373e-03f, +7.916815140e-04f, +1.197020801e-03f, +5.376800088e-04f, -1.099507986e-04f, + +2.077502712e-06f, -1.339113908e-05f, -2.536792522e-05f, -7.922171439e-06f, +4.054173673e-05f, +7.511648637e-05f, +3.577215824e-05f, -7.895742338e-05f, -1.721770654e-04f, -1.146544985e-04f, +1.116913074e-04f, +3.324887018e-04f, +2.901112160e-04f, -9.852083963e-05f, -5.671719722e-04f, -6.385264040e-04f, -4.837949091e-05f, +8.852743607e-04f, +1.343618217e-03f, +6.015724119e-04f, -1.281996999e-03f, -3.284868198e-03f, -4.019323722e-03f, -2.734317328e-03f, +4.783988299e-05f, +2.803210385e-03f, +4.026043107e-03f, +3.234852854e-03f, +1.214091364e-03f, -6.450357199e-04f, -1.345120911e-03f, -8.584651506e-04f, +7.534959806e-05f, +6.462049060e-04f, +5.560876896e-04f, +8.290196051e-05f, -2.970847865e-04f, -3.283880359e-04f, -1.033564617e-04f, +1.194036389e-04f, +1.710018670e-04f, +7.498057630e-05f, -3.839122229e-05f, -7.491153978e-05f, -3.889954925e-05f, +9.046210131e-06f, +2.532528913e-05f, +1.282518843e-05f, + +3.893703576e-04f, +5.871386867e-04f, -3.470556704e-04f, -2.150803906e-03f, -2.310920108e-03f, +1.362345739e-03f, +6.333760132e-03f, +5.724645364e-03f, -3.642006065e-03f, -1.378627501e-02f, -1.092353299e-02f, +7.645720544e-03f, +2.449263819e-02f, +1.728989560e-02f, -1.339640018e-02f, -3.717239147e-02f, -2.353560773e-02f, +2.023124174e-02f, +4.938841564e-02f, +2.809651791e-02f, -2.682299043e-02f, -5.823710931e-02f, -2.972396188e-02f, +3.154486775e-02f, +6.137835771e-02f, +2.798918595e-02f, -3.306284135e-02f, -5.794433508e-02f, -2.344672992e-02f, +3.088576685e-02f, +4.888802435e-02f, +1.738032095e-02f, -2.559260547e-02f, -3.659863972e-02f, -1.127313167e-02f, +1.860890744e-02f, +2.397561102e-02f, +6.273024036e-03f, -1.163889566e-02f, -1.340783072e-02f, -2.893655162e-03f, +6.035752723e-03f, +6.111557367e-03f, +1.037098668e-03f, -2.406690779e-03f, -2.052272217e-03f, -2.483729274e-04f, +5.995591399e-04f, + -1.364337518e-05f, +6.801361925e-06f, +4.990376237e-05f, +4.852002281e-05f, -4.996526961e-05f, -1.635764684e-04f, -1.083483004e-04f, +1.603876878e-04f, +3.750921654e-04f, +1.825774125e-04f, -3.664436410e-04f, -6.862098894e-04f, -2.459798275e-04f, +6.727082646e-04f, +1.058968687e-03f, +2.671187145e-04f, -1.045542951e-03f, -1.418809249e-03f, -2.233016724e-04f, +1.413748698e-03f, +1.676686855e-03f, +1.142151055e-04f, -1.688158924e-03f, -1.761957904e-03f, +3.412141537e-05f, +1.793723894e-03f, +1.650720551e-03f, -1.785591216e-04f, -1.699573653e-03f, -1.375500241e-03f, +2.770896161e-04f, +1.432111537e-03f, +1.011454792e-03f, -3.066330440e-04f, -1.064299823e-03f, -6.463035710e-04f, +2.710473447e-04f, +6.864866184e-04f, +3.489190265e-04f, -1.958668817e-04f, -3.732587375e-04f, -1.507196706e-04f, +1.138544649e-04f, +1.616706026e-04f, +4.580540148e-05f, -5.001166561e-05f, -4.877898058e-05f, -5.619091256e-06f, + /* 6, 0 (48) */ + +4.968144385e-04f, +2.658533900e-04f, -8.962168723e-04f, -1.608103413e-03f, -7.788642489e-06f, +2.979420144e-03f, +3.156687553e-03f, -1.777487314e-03f, -6.981373376e-03f, -4.200072704e-03f, +6.679001343e-03f, +1.302046751e-02f, +2.733865881e-03f, -1.674345458e-02f, -2.042237500e-02f, +4.850187710e-03f, +3.528439247e-02f, +2.773502242e-02f, -2.703828769e-02f, -7.382778902e-02f, -3.314369929e-02f, +1.149897119e-01f, +2.902267079e-01f, +3.684748747e-01f, +2.902267079e-01f, +1.149897119e-01f, -3.314369929e-02f, -7.382778902e-02f, -2.703828769e-02f, +2.773502242e-02f, +3.528439247e-02f, +4.850187710e-03f, -2.042237500e-02f, -1.674345458e-02f, +2.733865881e-03f, +1.302046751e-02f, +6.679001343e-03f, -4.200072704e-03f, -6.981373376e-03f, -1.777487314e-03f, +3.156687553e-03f, +2.979420144e-03f, -7.788642489e-06f, -1.608103413e-03f, -8.962168723e-04f, +2.658533900e-04f, +4.968144385e-04f, +1.277320727e-04f, + -7.206097170e-06f, +2.345369145e-05f, +4.096545548e-05f, -6.905852224e-06f, -8.675906281e-05f, -7.546324261e-05f, +7.573909431e-05f, +2.022568705e-04f, +7.646324280e-05f, -2.455625648e-04f, -3.580985825e-04f, +2.603744181e-05f, +5.634016105e-04f, +5.082121336e-04f, -3.395718620e-04f, -1.086804390e-03f, -5.736463860e-04f, +1.068031294e-03f, +2.020535961e-03f, +4.854822889e-04f, -3.056293732e-03f, -5.676763658e-03f, -4.596934279e-03f, -8.196129835e-05f, +4.496275233e-03f, +5.707482646e-03f, +3.170653092e-03f, -3.946898559e-04f, -2.015321110e-03f, -1.120316544e-03f, +5.335348884e-04f, +1.093922442e-03f, +3.714076894e-04f, -4.917967149e-04f, -5.741874250e-04f, -4.413138857e-05f, +3.537211876e-04f, +2.547523335e-04f, -6.792291394e-05f, -2.029151000e-04f, -8.143026444e-05f, +7.257614213e-05f, +8.845998205e-05f, +9.423532883e-06f, -4.059785137e-05f, -2.453583715e-05f, +6.589777155e-06f, +1.156587247e-05f, + -4.968144385e-04f, -7.842817921e-04f, +8.994291019e-04f, +2.915640051e-03f, +8.438649895e-04f, -5.098406932e-03f, -6.009425829e-03f, +3.886651395e-03f, +1.308708603e-02f, +4.180565853e-03f, -1.651382305e-02f, -1.845487053e-02f, +9.460496445e-03f, +3.171517895e-02f, +1.017220246e-02f, -3.304107863e-02f, -3.524088677e-02f, +1.560130303e-02f, +5.143354543e-02f, +1.625027633e-02f, -4.622585189e-02f, -4.721341238e-02f, +1.858986948e-02f, +6.004110985e-02f, +1.858986948e-02f, -4.721341238e-02f, -4.622585189e-02f, +1.625027633e-02f, +5.143354543e-02f, +1.560130303e-02f, -3.524088677e-02f, -3.304107863e-02f, +1.017220246e-02f, +3.171517895e-02f, +9.460496445e-03f, -1.845487053e-02f, -1.651382305e-02f, +4.180565853e-03f, +1.308708603e-02f, +3.886651395e-03f, -6.009425829e-03f, -5.098406932e-03f, +8.438649895e-04f, +2.915640051e-03f, +8.994291019e-04f, -7.842817921e-04f, -6.202569526e-04f, -1.277320727e-04f, + +7.206097170e-06f, -1.905086070e-05f, -7.742340156e-05f, -2.244308745e-05f, +1.497789702e-04f, +1.680758405e-04f, -1.428957736e-04f, -4.031178103e-04f, -7.079960453e-05f, +5.796643399e-04f, +5.287520583e-04f, -4.584378263e-04f, -1.058776278e-03f, -1.168871057e-04f, +1.299923556e-03f, +1.022760899e-03f, -9.173623485e-04f, -1.822672317e-03f, -1.123708632e-04f, +1.992771091e-03f, +1.381254679e-03f, -1.285058184e-03f, -2.242170783e-03f, -4.645487730e-05f, +2.215111194e-03f, +1.360178459e-03f, -1.312782922e-03f, -2.024189074e-03f, +3.287736205e-05f, +1.807031638e-03f, +9.774392195e-04f, -9.777611267e-04f, -1.325464625e-03f, +6.806222398e-05f, +1.053802351e-03f, +4.924109527e-04f, -5.086829447e-04f, -5.938112090e-04f, +5.080677731e-05f, +4.032233109e-04f, +1.552090461e-04f, -1.629782250e-04f, -1.544976859e-04f, +1.804669126e-05f, +7.810303453e-05f, +2.113479253e-05f, -2.026107605e-05f, -1.156587247e-05f, + /* 6, 1 (48) */ + +4.896083413e-04f, +2.893070814e-04f, -8.552514168e-04f, -1.615009265e-03f, -9.454770530e-05f, +2.903956901e-03f, +3.232426648e-03f, -1.575230443e-03f, -6.904910133e-03f, -4.445635269e-03f, +6.320902760e-03f, +1.304650495e-02f, +3.297267492e-03f, -1.623524244e-02f, -2.076194686e-02f, +3.763383320e-03f, +3.471074609e-02f, +2.880305371e-02f, -2.501775173e-02f, -7.334230673e-02f, -3.619999302e-02f, +1.093129482e-01f, +2.856297736e-01f, +3.683929135e-01f, +2.947229831e-01f, +1.206971945e-01f, -2.997304620e-02f, -7.422247888e-02f, -2.905360880e-02f, +2.661470588e-02f, +3.581792736e-02f, +5.944110152e-03f, -2.005096731e-02f, -1.723525129e-02f, +2.159678456e-03f, +1.297633612e-02f, +7.032722530e-03f, -3.945320371e-03f, -7.049296290e-03f, -1.980402414e-03f, +3.075257289e-03f, +3.051996286e-03f, +8.067133956e-05f, -1.598679880e-03f, -9.368147236e-04f, +2.413175528e-04f, +5.034042156e-04f, +1.392979451e-04f, + -7.791242229e-06f, +2.236071049e-05f, +4.126109227e-05f, -4.429146330e-06f, -8.496304936e-05f, -7.819246260e-05f, +7.003201622e-05f, +2.013257369e-04f, +8.477603732e-05f, -2.361598639e-04f, -3.619299538e-04f, +8.136198435e-06f, +5.519882992e-04f, +5.237462362e-04f, -3.076704192e-04f, -1.078335946e-03f, -6.124905293e-04f, +1.015080108e-03f, +2.023109414e-03f, +5.740791932e-04f, -2.941027388e-03f, -5.642146737e-03f, -4.693945103e-03f, -2.458165803e-04f, +4.392039864e-03f, +5.734251616e-03f, +3.283990837e-03f, -3.017665142e-04f, -2.007432595e-03f, -1.171860555e-03f, +4.921922220e-04f, +1.099664087e-03f, +4.031343334e-04f, -4.745115978e-04f, -5.843232553e-04f, -6.239543190e-05f, +3.487967929e-04f, +2.637133416e-04f, -5.916399725e-05f, -2.032954010e-04f, -8.709694318e-05f, +6.953278931e-05f, +9.006147782e-05f, +1.197904264e-05f, -4.015732169e-05f, -2.560501230e-05f, +5.942614945e-06f, +1.179515707e-05f, + -4.896083413e-04f, -8.033326528e-04f, +8.220057003e-04f, +2.893196964e-03f, +9.936439597e-04f, -4.930331092e-03f, -6.152321602e-03f, +3.483533585e-03f, +1.301628643e-02f, +4.760230193e-03f, -1.598507100e-02f, -1.891330835e-02f, +8.401720167e-03f, +3.159829184e-02f, +1.147212602e-02f, -3.201831773e-02f, -3.615824912e-02f, +1.377863072e-02f, +5.132117457e-02f, +1.824304742e-02f, -4.484459721e-02f, -4.849847057e-02f, +1.634769870e-02f, +5.999465498e-02f, +2.080498068e-02f, -4.585323392e-02f, -4.753863481e-02f, +1.422608725e-02f, +5.146642279e-02f, +1.740833467e-02f, -3.426344755e-02f, -3.401883976e-02f, +8.846737837e-03f, +3.178324117e-02f, +1.051429880e-02f, -1.796245957e-02f, -1.702250600e-02f, +3.586754644e-03f, +1.313789281e-02f, +4.289874706e-03f, -5.854216783e-03f, -5.261385157e-03f, +6.893673036e-04f, +2.933686743e-03f, +9.775321364e-04f, -7.631469996e-04f, -6.405180286e-04f, -1.392979451e-04f, + +7.791242229e-06f, -1.699747862e-05f, -7.662225966e-05f, -2.669496967e-05f, +1.449047117e-04f, +1.727947999e-04f, -1.305561128e-04f, -4.023534357e-04f, -9.039874540e-05f, +5.647600865e-04f, +5.477436456e-04f, -4.240808264e-04f, -1.062018502e-03f, -1.651246880e-04f, +1.272510612e-03f, +1.065857194e-03f, -8.561708638e-04f, -1.835368929e-03f, -1.913789724e-04f, +1.958317289e-03f, +1.447398043e-03f, -1.208034611e-03f, -2.265687070e-03f, -1.392905295e-04f, +2.184548817e-03f, +1.433272568e-03f, -1.242086964e-03f, -2.052511654e-03f, -4.697585680e-05f, +1.788458344e-03f, +1.036298510e-03f, -9.309185690e-04f, -1.349078811e-03f, +1.872481803e-05f, +1.047088999e-03f, +5.259403172e-04f, -4.875573858e-04f, -6.071675411e-04f, +3.044856647e-05f, +4.026596693e-04f, +1.674741398e-04f, -1.575038342e-04f, -1.590490714e-04f, +1.351057922e-05f, +7.865658953e-05f, +2.324588111e-05f, -1.989502124e-05f, -1.179515707e-05f, + /* 6, 2 (48) */ + +4.818170991e-04f, +3.116677919e-04f, -8.139903245e-04f, -1.619438411e-03f, -1.795107547e-04f, +2.825764439e-03f, +3.302458664e-03f, -1.373904706e-03f, -6.820134096e-03f, -4.681795133e-03f, +5.958972806e-03f, +1.305464115e-02f, +3.849255791e-03f, -1.571149621e-02f, -2.106961728e-02f, +2.685047373e-03f, +3.409825556e-02f, +2.981813382e-02f, -2.299464232e-02f, -7.276822754e-02f, -3.914102041e-02f, +1.036708015e-01f, +2.809358285e-01f, +3.681470969e-01f, +2.991150230e-01f, +1.264314461e-01f, -2.668905536e-02f, -7.452424539e-02f, -3.106104140e-02f, +2.544284532e-02f, +3.631011958e-02f, +7.043774239e-03f, -1.964783298e-02f, -1.770976289e-02f, +1.575355201e-03f, +1.291394069e-02f, +7.381519323e-03f, -3.681607029e-03f, -7.108460287e-03f, -2.183697815e-03f, +2.988160346e-03f, +3.121529075e-03f, +1.707328174e-04f, -1.586700837e-03f, -9.769720453e-04f, +2.157125405e-04f, +5.093468306e-04f, +1.510931022e-04f, + -8.344944653e-06f, +2.125900262e-05f, +4.148581872e-05f, -1.996438486e-06f, -8.307634195e-05f, -8.076243575e-05f, +6.431750700e-05f, +2.001270451e-04f, +9.285279645e-05f, -2.265601524e-04f, -3.652170240e-04f, -9.550274047e-06f, +5.399705649e-04f, +5.383887230e-04f, -2.757465103e-04f, -1.068544575e-03f, -6.500331626e-04f, +9.615381760e-04f, +2.023076302e-03f, +6.604188335e-04f, -2.824968759e-03f, -5.603687422e-03f, -4.787239382e-03f, -4.094699856e-04f, +4.284303580e-03f, +5.757022002e-03f, +3.396192524e-03f, -2.067797193e-04f, -1.996840788e-03f, -1.222587999e-03f, +4.496565782e-04f, +1.104004805e-03f, +4.347078605e-04f, -4.563697166e-04f, -5.937872373e-04f, -8.080645084e-05f, +3.433251790e-04f, +2.724298771e-04f, -5.019587769e-05f, -2.033930824e-04f, -9.273045181e-05f, +6.633507579e-05f, +9.155929989e-05f, +1.456911640e-05f, -3.964301044e-05f, -2.665905792e-05f, +5.265009118e-06f, +1.200722377e-05f, + -4.818170991e-04f, -8.203301315e-04f, +7.453834406e-04f, +2.866501994e-03f, +1.138548671e-03f, -4.757536292e-03f, -6.282877715e-03f, +3.081180149e-03f, +1.292588768e-02f, +5.324990279e-03f, -1.543732735e-02f, -1.933738918e-02f, +7.339701665e-03f, +3.143316715e-02f, +1.274463663e-02f, -3.095246054e-02f, -3.701441998e-02f, +1.194326179e-02f, +5.112979559e-02f, +2.020136471e-02f, -4.339719917e-02f, -4.970650518e-02f, +1.408201163e-02f, +5.985536445e-02f, +2.298952949e-02f, -4.441996135e-02f, -4.878072178e-02f, +1.217357560e-02f, +5.141944693e-02f, +1.919679302e-02f, -3.322714904e-02f, -3.494975833e-02f, +7.497659026e-03f, +3.180196599e-02f, +1.156138780e-02f, -1.743651926e-02f, -1.751006338e-02f, +2.979587103e-03f, +1.316834138e-02f, +4.692534375e-03f, -5.686742643e-03f, -5.418888992e-03f, +5.303182322e-04f, +2.947197322e-03f, +1.056188726e-03f, -7.399011185e-04f, -6.604130498e-04f, -1.510931022e-04f, + +8.344944653e-06f, -1.497788212e-05f, -7.570430487e-05f, -3.079791745e-05f, +1.398867490e-04f, +1.771339313e-04f, -1.182115470e-04f, -4.009414406e-04f, -1.095769468e-04f, +5.491324766e-04f, +5.656386610e-04f, -3.893998840e-04f, -1.063539538e-03f, -2.127017604e-04f, +1.243283477e-03f, +1.106992809e-03f, -7.939689928e-04f, -1.845114860e-03f, -2.697772798e-04f, +1.920891995e-03f, +1.511112825e-03f, -1.129233506e-03f, -2.285625305e-03f, -2.319039960e-04f, +2.150529871e-03f, +1.504220745e-03f, -1.169274842e-03f, -2.077684101e-03f, -1.270620581e-04f, +1.766968726e-03f, +1.093838693e-03f, -8.822973255e-04f, -1.370713898e-03f, -3.104888631e-05f, +1.038631332e-03f, +5.589661769e-04f, -4.653984841e-04f, -6.197011272e-04f, +9.754288189e-06f, +4.014176345e-04f, +1.796689918e-04f, -1.516552664e-04f, -1.634214139e-04f, +8.839925616e-06f, +7.907963685e-05f, +2.538057954e-05f, -1.947093683e-05f, -1.200722377e-05f, + /* 6, 3 (48) */ + +4.734721544e-04f, +3.329267946e-04f, -7.725045058e-04f, -1.621434850e-03f, -2.625870966e-04f, +2.745002003e-03f, +3.366776171e-03f, -1.173777661e-03f, -6.727281299e-03f, -4.908355286e-03f, +5.593755782e-03f, +1.304509087e-02f, +4.389226356e-03f, -1.517310748e-02f, -2.134536379e-02f, +1.616502798e-03f, +3.344822240e-02f, +3.077967200e-02f, -2.097156602e-02f, -7.210780871e-02f, -4.196598917e-02f, +9.806711406e-02f, +2.761485891e-01f, +3.677376269e-01f, +3.033993266e-01f, +1.321884681e-01f, -2.329286284e-02f, -7.473102511e-02f, -3.305788219e-02f, +2.422025732e-02f, +3.675977616e-02f, +8.147779044e-03f, -1.921312512e-02f, -1.816613260e-02f, +9.815679637e-04f, +1.283313424e-02f, +7.724844502e-03f, -3.409177152e-03f, -7.158656165e-03f, -2.387090897e-03f, +2.895429894e-03f, +3.187864151e-03f, +2.622921173e-04f, -1.572131721e-03f, -1.016615056e-03f, +1.890534826e-04f, +5.146118397e-04f, +1.631003260e-04f, + -8.867001001e-06f, +2.015064614e-05f, +4.164078698e-05f, +3.893731059e-07f, -8.110340390e-05f, -8.317205561e-05f, +5.860392582e-05f, +1.986664501e-04f, +1.006854710e-04f, -2.167794209e-04f, -3.679622505e-04f, -2.700047156e-05f, +5.273720285e-04f, +5.521306107e-04f, -2.438428143e-04f, -1.057459136e-03f, -6.862421796e-04f, +9.074804882e-04f, +2.020473974e-03f, +7.444424040e-04f, -2.708232495e-03f, -5.561444633e-03f, -4.876752428e-03f, -5.727871543e-04f, +4.173145228e-03f, +5.775748818e-03f, +3.507144024e-03f, -1.097997096e-04f, -1.983518747e-03f, -1.272423616e-03f, +4.059681292e-04f, +1.106921623e-03f, +4.660840266e-04f, -4.373853199e-04f, -6.025581680e-04f, -9.934083637e-05f, +3.373068931e-04f, +2.808863692e-04f, -4.102837087e-05f, -2.032037984e-04f, -9.832202803e-05f, +6.298515782e-05f, +9.294928507e-05f, +1.719037284e-05f, -3.905416716e-05f, -2.769579466e-05f, +4.557424696e-06f, +1.220112428e-05f, + -4.734721544e-04f, -8.353080136e-04f, +6.696791358e-04f, +2.835704077e-03f, +1.278435420e-03f, -4.580402361e-03f, -6.401089262e-03f, +2.680238709e-03f, +1.281631074e-02f, +5.874122756e-03f, -1.487168869e-02f, -1.972678906e-02f, +6.276162127e-03f, +3.122046539e-02f, +1.398792011e-02f, -2.984546773e-02f, -3.780838897e-02f, +1.009814693e-02f, +5.086001831e-02f, +2.212225670e-02f, -4.188608634e-02f, -5.083573868e-02f, +1.179638632e-02f, +5.962346045e-02f, +2.514005936e-02f, -4.291574061e-02f, -4.994999662e-02f, +1.009589150e-02f, +5.129238488e-02f, +2.096376174e-02f, -3.213331035e-02f, -3.583205565e-02f, +6.126945128e-03f, +3.177091710e-02f, +1.260001913e-02f, -1.687755308e-02f, -1.797546187e-02f, +2.359885976e-03f, +1.317809567e-02f, +5.093952010e-03f, -5.507073651e-03f, -5.570544258e-03f, +3.668968183e-04f, +2.956037248e-03f, +1.135268363e-03f, -7.145205390e-04f, -6.798839867e-04f, -1.631003260e-04f, + +8.867001001e-06f, -1.299514687e-05f, -7.467434777e-05f, -3.474788864e-05f, +1.347369482e-04f, +1.810927613e-04f, -1.058832189e-04f, -3.988940296e-04f, -1.283080387e-04f, +5.328163443e-04f, +5.824201054e-04f, -3.544548708e-04f, -1.063352654e-03f, -2.595467868e-04f, +1.212302398e-03f, +1.146114099e-03f, -7.308620442e-04f, -1.851908327e-03f, -3.474428399e-04f, +1.880564154e-03f, +1.572302999e-03f, -1.048783316e-03f, -2.301956556e-03f, -3.241475586e-04f, +2.113106202e-03f, +1.572906527e-03f, -1.094458265e-03f, -2.099656640e-03f, -2.072536508e-04f, +1.742583914e-03f, +1.149959854e-03f, -8.319648170e-04f, -1.390320562e-03f, -8.118132958e-05f, +1.028427323e-03f, +5.914290376e-04f, -4.422313454e-04f, -6.313807691e-04f, -1.124576621e-05f, +3.994890047e-04f, +1.917713026e-04f, -1.454358454e-04f, -1.676030986e-04f, +4.040278685e-06f, +7.936789852e-05f, +2.753519081e-05f, -1.898771574e-05f, -1.220112428e-05f, + /* 6, 4 (48) */ + +4.646051534e-04f, +3.530774407e-04f, -7.308637188e-04f, -1.621045477e-03f, -3.436905005e-04f, +2.661829947e-03f, +3.425380097e-03f, -9.751112112e-04f, -6.626595828e-03f, -5.125134706e-03f, +5.225793532e-03f, +1.301809040e-02f, +4.916598384e-03f, -1.462097687e-02f, -2.158920660e-02f, +5.590436624e-04f, +3.276198022e-02f, +3.168715249e-02f, -1.895109204e-02f, -7.136336630e-02f, -4.467422166e-02f, +9.250566943e-02f, +2.712718367e-01f, +3.671648397e-01f, +3.075724718e-01f, +1.379642170e-01f, -1.978571881e-02f, -7.484082482e-02f, -3.504140093e-02f, +2.294783371e-02f, +3.716574429e-02f, +9.254700667e-03f, -1.874704109e-02f, -1.860351792e-02f, +3.790097958e-04f, +1.273379340e-02f, +8.062151396e-03f, -3.128290783e-03f, -7.199684535e-03f, -2.590294696e-03f, +2.797107866e-03f, +3.250849309e-03f, +3.552414023e-04f, -1.554941348e-03f, -1.055669223e-03f, +1.613576880e-04f, +5.191692644e-04f, +1.753014503e-04f, + -9.357271131e-06f, +1.903768623e-05f, +4.172724070e-05f, +2.725517788e-06f, -7.904875357e-05f, -8.542047327e-05f, +5.289950351e-05f, +1.969499038e-04f, +1.082664692e-04f, -2.068337056e-04f, -3.701688128e-04f, -4.419347652e-05f, +5.142168205e-04f, +5.649642299e-04f, -2.120014881e-04f, -1.045109832e-03f, -7.210875415e-04f, +8.529817484e-04f, +2.015342221e-03f, +8.260940707e-04f, -2.590933072e-03f, -5.515480599e-03f, -4.962423244e-03f, -7.356340633e-04f, +4.058647023e-03f, +5.790390724e-03f, +3.616731638e-03f, -1.089945062e-05f, -1.967442276e-03f, -1.321292299e-03f, +3.611689990e-04f, +1.108393160e-03f, +4.972183318e-04f, -4.175739665e-04f, -6.106155420e-04f, -1.179745186e-04f, +3.307432576e-04f, +2.890674119e-04f, -3.167171449e-05f, -2.027235592e-04f, -1.038628378e-04f, +5.948545712e-05f, +9.422736517e-05f, +1.983931782e-05f, -3.839015022e-05f, -2.871302625e-05f, +3.820393667e-06f, +1.237592426e-05f, + -4.646051534e-04f, -8.483031605e-04f, +5.950047880e-04f, +2.800956188e-03f, +1.413172369e-03f, -4.399309599e-03f, -6.506972481e-03f, +2.281344679e-03f, +1.268800270e-02f, +6.406939100e-03f, -1.428926858e-02f, -2.008124393e-02f, +5.212809473e-03f, +3.096091860e-02f, +1.520022250e-02f, -2.869935363e-02f, -3.853925102e-02f, +8.246238601e-03f, +5.051257547e-02f, +2.400282086e-02f, -4.031378334e-02f, -5.188452200e-02f, +9.494429766e-03f, +5.929931289e-02f, +2.725316557e-02f, -4.134283408e-02f, -5.104445488e-02f, +7.996234859e-03f, +5.108513123e-02f, +2.270634566e-02f, -3.098335049e-02f, -3.666402047e-02f, +4.736624566e-03f, +3.168973577e-02f, +1.362844645e-02f, -1.628612404e-02f, -1.841769321e-02f, +1.728505206e-03f, +1.316684990e-02f, +5.493441015e-03f, -5.315302348e-03f, -5.715980103e-03f, +1.992937197e-04f, +2.960077526e-03f, +1.214636261e-03f, -6.869853482e-04f, -6.988717024e-04f, -1.753014503e-04f, + +9.357271131e-06f, -1.105218590e-05f, -7.353730115e-05f, -3.854121934e-05f, +1.294671807e-04f, +1.846715044e-04f, -9.359189777e-05f, -3.962243230e-04f, -1.465669659e-04f, +5.158472603e-04f, +5.980730325e-04f, -3.193054982e-04f, -1.061473822e-03f, -3.055900125e-04f, +1.179630067e-03f, +1.183171051e-03f, -6.669562287e-04f, -1.855752352e-03f, -4.242543686e-04f, +1.837407206e-03f, +1.630876849e-03f, -9.668149639e-04f, -2.314657752e-03f, -4.158741060e-04f, +2.072335209e-03f, +1.639216953e-03f, -1.017752442e-03f, -2.118384554e-03f, -2.874223964e-04f, +1.715329861e-03f, +1.204563872e-03f, -7.799916939e-04f, -1.407852481e-03f, -1.315937390e-04f, +1.016477841e-03f, +6.232697581e-04f, -4.180830575e-04f, -6.421763456e-04f, -3.252037081e-05f, +3.968666565e-04f, +2.037585732e-04f, -1.388496268e-04f, -1.715826333e-04f, -8.824424543e-07f, +7.951726066e-05f, +2.970587195e-05f, -1.844435346e-05f, -1.237592426e-05f, + /* 6, 5 (48) */ + +4.552478823e-04f, +3.721151269e-04f, -6.891364781e-04f, -1.618319959e-03f, -4.227392541e-04f, +2.576409474e-03f, +3.478279600e-03f, -7.781613074e-04f, -6.518329359e-03f, -5.331968412e-03f, +4.855624719e-03f, +1.297389693e-02f, +5.430815205e-03f, -1.405601264e-02f, -2.180120809e-02f, -4.860661693e-04f, +3.204089267e-02f, +3.254013424e-02f, -1.693574982e-02f, -7.053727223e-02f, -4.726515474e-02f, +8.699018883e-02f, +2.663094135e-01f, +3.664292057e-01f, +3.116311188e-01f, +1.437546077e-01f, -1.616898718e-02f, -7.485172427e-02f, -3.700884321e-02f, +2.162654141e-02f, +3.752691329e-02f, +1.036309383e-02f, -1.824982276e-02f, -1.902109189e-02f, -2.316057463e-04f, +1.261581888e-02f, +8.392894653e-03f, -2.839223371e-03f, -7.231356250e-03f, -2.793018255e-03f, +2.693245028e-03f, +3.310334766e-03f, +4.494687675e-04f, -1.535102030e-03f, -1.094059373e-03f, +1.326446617e-04f, +5.229896581e-04f, +1.876773745e-04f, + -9.815677156e-06f, +1.792213212e-05f, +4.174651130e-05f, +5.009354660e-06f, -7.691695648e-05f, -8.750709462e-05f, +4.721233222e-05f, +1.949836418e-04f, +1.155886614e-04f, -1.967390650e-04f, -3.718405999e-04f, -6.110897977e-05f, +5.005295418e-04f, +5.768832206e-04f, -1.802641175e-04f, -1.031528156e-03f, -7.545412919e-04f, +7.981162878e-04f, +2.007723215e-03f, +9.053210094e-04f, -2.473184673e-03f, -5.465860778e-03f, -5.044194584e-03f, -8.978771603e-04f, +3.940894468e-03f, +5.800910076e-03f, +3.724842225e-03f, +8.984542406e-05f, -1.948589975e-03f, -1.369119190e-03f, +3.153032321e-04f, +1.108399673e-03f, +5.280660766e-04f, -3.969525186e-04f, -6.179395883e-04f, -1.366829950e-04f, +3.236363777e-04f, +2.969577884e-04f, -2.213655910e-05f, -2.019487425e-04f, -1.093439878e-04f, +5.583866130e-05f, +9.538957497e-05f, +2.251234812e-05f, -3.765042989e-05f, -2.970854302e-05f, +3.054515381e-06f, +1.253070546e-05f, + -4.552478823e-04f, -8.593553464e-04f, +5.214674869e-04f, +2.762414969e-03f, +1.542639549e-03f, -4.214638095e-03f, -6.600564379e-03f, +1.885120356e-03f, +1.254143573e-02f, +6.922786361e-03f, -1.369119555e-02f, -2.040054943e-02f, +4.151335652e-03f, +3.065532859e-02f, +1.637985257e-02f, -2.751618258e-02f, -3.920620725e-02f, +6.390486249e-03f, +5.008832111e-02f, +2.584022806e-02f, -3.868290649e-02f, -5.285133696e-02f, +7.179772015e-03f, +5.888343879e-02f, +2.932550077e-02f, -3.970361713e-02f, -5.206220732e-02f, +5.877850305e-03f, +5.079770883e-02f, +2.442167552e-02f, -2.977878662e-02f, -3.744401216e-02f, +3.328772085e-03f, +3.155814203e-02f, +1.464492429e-02f, -1.566285428e-02f, -1.883577627e-02f, +1.086328861e-03f, +1.313432953e-02f, +5.890307671e-03f, -5.111543775e-03f, -5.854829730e-03f, +2.771108642e-05f, +2.959195084e-03f, +1.294153522e-03f, -6.572794762e-04f, -7.173160559e-04f, -1.876773745e-04f, + +9.815677156e-06f, -9.151747540e-06f, -7.229816771e-05f, -4.217462308e-05f, +1.240893005e-04f, +1.878710499e-04f, -8.135794825e-05f, -3.929463207e-04f, -1.643298167e-04f, +4.982614622e-04f, +6.125845522e-04f, -2.840112181e-04f, -1.057921668e-03f, -3.507635665e-04f, +1.145331498e-03f, +1.218117339e-03f, -6.023584774e-04f, -1.856654741e-03f, -5.000924368e-04f, +1.791498952e-03f, +1.686747109e-03f, -8.834616194e-04f, -2.323711714e-03f, -5.069373762e-04f, +2.028279749e-03f, +1.703042750e-03f, -9.392758951e-04f, -2.133828266e-03f, -3.674396180e-04f, +1.685237321e-03f, +1.257554585e-03f, -7.264517373e-04f, -1.423266428e-03f, -1.822062518e-04f, +1.002786671e-03f, +6.544296547e-04f, -3.929826645e-04f, -6.520588780e-04f, -5.403740792e-05f, +3.935445733e-04f, +2.156081422e-04f, -1.319014032e-04f, -1.753486718e-04f, -5.921951639e-06f, +7.952378569e-05f, +3.188863867e-05f, -1.783995335e-05f, -1.253070546e-05f, + /* 6, 6 (48) */ + +4.454322052e-04f, +3.900372591e-04f, -6.473899668e-04f, -1.613310604e-03f, -4.996562106e-04f, +2.488902380e-03f, +3.525491932e-03f, -5.831776656e-04f, -6.402740698e-03f, -5.528707477e-03f, +4.483784119e-03f, +1.291278795e-02f, +5.931344747e-03f, -1.347912942e-02f, -2.198147221e-02f, -1.517594326e-03f, +3.128635138e-02f, +3.333825052e-02f, -1.492802661e-02f, -6.963195122e-02f, -4.973833941e-02f, +8.152432805e-02f, +2.612652189e-01f, +3.655313285e-01f, +3.155720133e-01f, +1.495555178e-01f, -1.244414495e-02f, -7.476187885e-02f, -3.895743318e-02f, +2.025742222e-02f, +3.784221652e-02f, +1.147149350e-02f, -1.772175668e-02f, -1.941804441e-02f, -8.495453346e-04f, +1.247913589e-02f, +8.716531031e-03f, -2.542265583e-03f, -7.253492809e-03f, -2.994966997e-03f, +2.583901040e-03f, +3.366173427e-03f, +5.448583425e-04f, -1.512589682e-03f, -1.131709803e-03f, +1.029361187e-04f, +5.260441735e-04f, +2.002080800e-04f, + -1.024220231e-05f, +1.680595422e-05f, +4.170001406e-05f, +7.238374544e-06f, -7.471261742e-05f, -8.943157738e-05f, +4.155035540e-05f, +1.927741706e-04f, +1.226453846e-04f, -1.865115568e-04f, -3.729821955e-04f, -7.772730152e-05f, +4.863352246e-04f, +5.878825260e-04f, -1.486716681e-04f, -1.016746838e-03f, -7.865775689e-04f, +7.429579806e-04f, +1.997661437e-03f, +9.820734400e-04f, -2.355101077e-03f, -5.412653779e-03f, -5.122012995e-03f, -1.059383497e-03f, +3.819976279e-03f, +5.807272982e-03f, +3.831363317e-03f, +1.923566759e-04f, -1.926943287e-03f, -1.415829765e-03f, +2.684167601e-04f, +1.106923101e-03f, +5.585824193e-04f, -3.755391344e-04f, -6.245113053e-04f, -1.554413590e-04f, +3.159891480e-04f, +3.045424952e-04f, -1.243395811e-05f, -2.008761034e-04f, -1.147565375e-04f, +5.204772384e-05f, +9.643206018e-05f, +2.520575530e-05f, -3.683459133e-05f, -3.068012551e-05f, +2.260456842e-06f, +1.266456791e-05f, + -4.454322052e-04f, -8.685070939e-04f, +4.491693191e-04f, +2.720240346e-03f, +1.666728850e-03f, -4.026767045e-03f, -6.681922327e-03f, +1.492174035e-03f, +1.237710592e-02f, +7.421047823e-03f, -1.307861100e-02f, -2.068456065e-02f, +3.093413984e-03f, +3.030456503e-02f, +1.752518407e-02f, -2.629806524e-02f, -3.980856572e-02f, +4.533831508e-03f, +4.958822867e-02f, +2.763172701e-02f, -3.699615939e-02f, -5.373479858e-02f, +4.856060301e-03f, +5.837650141e-02f, +3.135378052e-02f, -3.800057438e-02f, -5.300148322e-02f, +3.744022040e-03f, +5.043026921e-02f, +2.610691284e-02f, -2.852123204e-02f, -3.817046390e-02f, +1.905505657e-03f, +3.137593578e-02f, +1.564771096e-02f, -1.500842463e-02f, -1.922875894e-02f, +4.342699829e-04f, +1.308029212e-02f, +6.283852244e-03f, -4.895935633e-03f, -5.986731133e-03f, -1.476375854e-04f, +2.953273132e-03f, +1.373677308e-03f, -6.253908375e-04f, -7.351560092e-04f, -2.002080800e-04f, + +1.024220231e-05f, -7.296413674e-06f, -7.096202782e-05f, -4.564518926e-05f, +1.186151225e-04f, +1.906929491e-04f, -6.920130012e-05f, -3.890748647e-04f, -1.815738499e-04f, +4.800957835e-04f, +6.259438306e-04f, -2.486311244e-04f, -1.052717418e-03f, -3.950015605e-04f, +1.109473904e-03f, +1.250910379e-03f, -5.371762618e-04f, -1.854628048e-03f, -5.748396599e-04f, +1.742921408e-03f, +1.739831097e-03f, -7.988584839e-04f, -2.329107182e-03f, -5.971921956e-04f, +1.981008035e-03f, +1.764278523e-03f, -8.591502741e-04f, -2.145953423e-03f, -4.471764115e-04f, +1.652341818e-03f, +1.308837966e-03f, -6.714217553e-04f, -1.436522367e-03f, -2.329380412e-04f, +9.873605329e-04f, +6.848506056e-04f, -3.669611382e-04f, -6.610005937e-04f, -7.576391290e-05f, +3.895178720e-04f, +2.272972249e-04f, -1.245967078e-04f, -1.788900391e-04f, -1.107160032e-05f, +7.938372451e-05f, +3.407937034e-05f, -1.717373175e-05f, -1.266456791e-05f, + /* 6, 7 (48) */ + +4.351900028e-04f, +4.068432133e-04f, -6.056899527e-04f, -1.606072230e-03f, -5.743688280e-04f, +2.399470802e-03f, +3.567042288e-03f, -3.904034950e-04f, -6.280095313e-03f, -5.715219034e-03f, +4.110801924e-03f, +1.283506064e-02f, +6.417679971e-03f, -1.289124690e-02f, -2.213014388e-02f, -2.534341164e-03f, +3.049977381e-02f, +3.408120850e-02f, -1.293036517e-02f, -6.864987778e-02f, -5.209344049e-02f, +7.611167427e-02f, +2.561432059e-01f, +3.644719450e-01f, +3.193919896e-01f, +1.553627907e-01f, -8.612781634e-03f, -7.456952217e-02f, -4.088437647e-02f, +1.884159245e-02f, +3.811063328e-02f, +1.257841660e-02f, -1.716317426e-02f, -1.979358354e-02f, -1.474056640e-03f, +1.232369453e-02f, +9.032520179e-03f, -2.237723088e-03f, -7.265926767e-03f, -3.195843101e-03f, +2.469144503e-03f, +3.418221151e-03f, +6.412904027e-04f, -1.487383927e-03f, -1.168544394e-03f, +7.225599318e-05f, +5.283046303e-04f, +2.128726479e-04f, + -1.063688973e-05f, +1.569108148e-05f, +4.158924427e-05f, +9.410201707e-06f, -7.244037263e-05f, -9.119382763e-05f, +3.592135816e-05f, +1.903282540e-04f, +1.294304454e-04f, -1.761672149e-04f, -3.735988633e-04f, -9.402941106e-05f, +4.716592936e-04f, +5.979583844e-04f, -1.172644383e-04f, -1.000799786e-03f, -8.171726146e-04f, +6.875801614e-04f, +1.985203607e-03f, +1.056304658e-03f, -2.236795531e-03f, -5.355931279e-03f, -5.195828866e-03f, -1.220020865e-03f, +3.695984295e-03f, +5.809449348e-03f, +3.936183247e-03f, +2.965535273e-04f, -1.902486547e-03f, -1.461349932e-03f, +2.205573646e-04f, +1.103947105e-03f, +5.887224336e-04f, -3.533532580e-04f, -6.303124963e-04f, -1.742243306e-04f, +3.078052584e-04f, +3.118067665e-04f, -2.575357107e-06f, -1.995027847e-04f, -1.200915124e-04f, +4.811586372e-05f, +9.735108524e-05f, +2.791572988e-05f, -3.594233741e-05f, -3.162554815e-05f, +1.438952877e-06f, +1.277663204e-05f, + -4.351900028e-04f, -8.758035076e-04f, +3.782072913e-04f, +2.674595157e-03f, +1.785343972e-03f, -3.836074096e-03f, -6.751123627e-03f, +1.103099171e-03f, +1.219553207e-02f, +7.901143606e-03f, -1.245266717e-02f, -2.093319177e-02f, +2.040696565e-03f, +2.990956347e-02f, +1.863465797e-02f, -2.504715486e-02f, -4.034574199e-02f, +2.679203460e-03f, +4.901338901e-02f, +2.937464842e-02f, -3.525632829e-02f, -5.453365707e-02f, +2.526953119e-03f, +5.777930921e-02f, +3.333478856e-02f, -3.623629586e-02f, -5.386063349e-02f, +1.598068617e-03f, +4.998309280e-02f, +2.775925466e-02f, -2.721239407e-02f, -3.884188566e-02f, +4.689832901e-04f, +3.114299774e-02f, +1.663507149e-02f, -1.432357402e-02f, -1.959572007e-02f, -2.267306108e-04f, +1.300452821e-02f, +6.673370117e-03f, -4.668638408e-03f, -6.111327841e-03f, -3.265276245e-04f, +2.942201532e-03f, +1.453061032e-03f, -5.913114672e-04f, -7.523297410e-04f, -2.128726479e-04f, + +1.063688973e-05f, -5.488598499e-06f, -6.953402739e-05f, -4.895038091e-05f, +1.130564007e-04f, +1.931394007e-04f, -5.714141947e-05f, -3.846256007e-04f, -1.982775184e-04f, +4.613875835e-04f, +6.381420856e-04f, -2.132238567e-04f, -1.045884839e-03f, -4.382401831e-04f, +1.072126567e-03f, +1.281511380e-03f, -4.715174124e-04f, -1.849689529e-03f, -6.483808839e-04f, +1.691760662e-03f, +1.790050839e-03f, -7.131425620e-04f, -2.330838826e-03f, -6.864947182e-04f, +1.930593536e-03f, +1.822822929e-03f, -7.775001628e-04f, -2.154730967e-03f, -5.265038580e-04f, +1.616683612e-03f, +1.358322287e-03f, -6.149814725e-04f, -1.447583542e-03f, -2.837074452e-04f, +9.702090995e-04f, +7.144751560e-04f, -3.400513450e-04f, -6.689749892e-04f, -9.766612121e-05f, +3.847828278e-04f, +2.388029525e-04f, -1.169418174e-04f, -1.821957554e-04f, -1.632438305e-05f, +7.909352851e-05f, +3.627381541e-05f, -1.644502299e-05f, -1.277663204e-05f, + /* 6, 8 (48) */ + +4.245531131e-04f, +4.225342948e-04f, -5.641007085e-04f, -1.596662028e-03f, -6.468092006e-04f, +2.308276975e-03f, +3.602963646e-03f, -2.000752410e-04f, -6.150664868e-03f, -5.891386249e-03f, +3.737203061e-03f, +1.274103123e-02f, +6.889339265e-03f, -1.229328851e-02f, -2.224740832e-02f, -3.535140950e-03f, +2.968260120e-02f, +3.476878867e-02f, -1.094516156e-02f, -6.759357313e-02f, -5.433023602e-02f, +7.075574299e-02f, +2.509473770e-01f, +3.632519241e-01f, +3.230879739e-01f, +1.611722401e-01f, -4.676598387e-03f, -7.427296864e-02f, -4.278686302e-02f, +1.738024252e-02f, +3.833119065e-02f, +1.368236371e-02f, -1.657445183e-02f, -2.014693680e-02f, -2.104369136e-03f, +1.214947020e-02f, +9.340325437e-03f, -1.925916321e-03f, -7.268502124e-03f, -3.395345886e-03f, +2.349052990e-03f, +3.466337015e-03f, +7.386414879e-04f, -1.459468197e-03f, -1.204486732e-03f, +4.063044502e-05f, +5.297435832e-04f, +2.256492799e-04f, + -1.099984113e-05f, +1.457939881e-05f, +4.141577321e-05f, +1.152259533e-05f, -7.010488204e-05f, -9.279399612e-05f, +3.033295803e-05f, +1.876528999e-04f, +1.359381228e-04f, -1.657220273e-04f, -3.736965314e-04f, -1.099969455e-04f, +4.565275267e-04f, +6.071083201e-04f, -8.608201384e-05f, -9.837220297e-04f, -8.463047818e-04f, +6.320555428e-04f, +1.970398609e-03f, +1.127971061e-03f, -2.118380642e-03f, -5.295767933e-03f, -5.265596469e-03f, -1.379657921e-03f, +3.569013395e-03f, +5.807412922e-03f, +4.039191267e-03f, +4.023527308e-04f, -1.875207023e-03f, -1.505606117e-03f, +1.717746382e-04f, +1.099457111e-03f, +6.184411672e-04f, -3.304156074e-04f, -6.353258038e-04f, -1.930062863e-04f, +2.990891982e-04f, +3.187360982e-04f, +7.427417591e-06f, -1.978263266e-04f, -1.253399165e-04f, +4.404656456e-05f, +9.814304120e-05f, +3.063836572e-05f, -3.497349141e-05f, -3.254258310e-05f, +5.908061777e-07f, +1.286604092e-05f, + -4.245531131e-04f, -8.812921061e-04f, +3.086732639e-04f, +2.625644776e-03f, +1.898400373e-03f, -3.642934695e-03f, -6.808265047e-03f, +7.184735700e-04f, +1.199725455e-02f, +8.362531190e-03f, -1.181452508e-02f, -2.114641563e-02f, +9.948117267e-04f, +2.947132328e-02f, +1.970678454e-02f, -2.376564348e-02f, -4.081725940e-02f, +8.295139303e-04f, +4.836500812e-02f, +3.106640908e-02f, -3.346627745e-02f, -5.524679963e-02f, +1.961142931e-04f, +5.709281450e-02f, +3.526538209e-02f, -3.441347293e-02f, -5.463813366e-02f, -5.566623497e-04f, +4.945658894e-02f, +2.937593827e-02f, -2.585407178e-02f, -3.945686713e-02f, -9.786002519e-04f, +3.085929029e-02f, +1.760528059e-02f, -1.360909887e-02f, -1.993577142e-02f, -8.957056000e-04f, +1.290686209e-02f, +7.058152944e-03f, -4.429835456e-03f, -6.228269659e-03f, -5.087233799e-04f, +2.925877149e-03f, +1.532154561e-03f, -5.550376518e-04f, -7.687747640e-04f, -2.256492799e-04f, + +1.099984113e-05f, -3.730547622e-06f, -6.801936589e-05f, -5.208803166e-05f, +1.074248073e-04f, +1.952132355e-04f, -4.519728111e-05f, -3.796149388e-04f, -2.144204917e-04f, +4.421746762e-04f, +6.491725796e-04f, -1.778475050e-04f, -1.037450173e-03f, -4.804177901e-04f, +1.033360712e-03f, +1.309885380e-03f, -4.054899386e-04f, -1.841861095e-03f, -7.206033657e-04f, +1.638106717e-03f, +1.837333188e-03f, -6.264524348e-04f, -2.328907250e-03f, -7.747026606e-04f, +1.877114848e-03f, +1.878578852e-03f, -6.944528796e-04f, -2.160137196e-03f, -6.052932368e-04f, +1.578307649e-03f, +1.405918285e-03f, -5.572134148e-04f, -1.456416562e-03f, -3.344320979e-04f, +9.513450014e-04f, +7.432466222e-04f, -3.122880098e-04f, -6.759568904e-04f, -1.197095174e-04f, +3.793368971e-04f, +2.501024122e-04f, -1.089437530e-04f, -1.852550607e-04f, -2.167294376e-05f, +7.864986146e-05f, +3.846759729e-05f, -1.565328426e-05f, -1.286604092e-05f, + /* 6, 9 (48) */ + +4.135532720e-04f, +4.371136936e-04f, -5.226849353e-04f, -1.585139433e-03f, -7.169140826e-04f, +2.215482978e-03f, +3.633296604e-03f, -1.242234118e-05f, -6.014726745e-03f, -6.057108276e-03f, +3.363506529e-03f, +1.263103429e-02f, +7.345866792e-03f, -1.168618019e-02f, -2.233349033e-02f, -4.518862979e-03f, +2.883629642e-02f, +3.540084421e-02f, -8.974762953e-03f, -6.646560206e-02f, -5.644861666e-02f, +6.545997506e-02f, +2.456817806e-01f, +3.618722662e-01f, +3.266569873e-01f, +1.669796530e-01f, -6.374071197e-04f, -7.387061591e-02f, -4.466207004e-02f, +1.587463640e-02f, +3.850296528e-02f, +1.478182082e-02f, -1.595601066e-02f, -2.047735241e-02f, -2.739694940e-03f, +1.195646391e-02f, +9.639414635e-03f, -1.607180223e-03f, -7.261074707e-03f, -3.593172212e-03f, +2.223713074e-03f, +3.510383580e-03f, +8.367845291e-04f, -1.428829831e-03f, -1.239460223e-03f, +8.087861927e-06f, +5.303343893e-04f, +2.385153209e-04f, + -1.133121540e-05f, +1.347274469e-05f, +4.118124412e-05f, +1.357345076e-05f, -6.771082165e-05f, -9.423247423e-05f, +2.479259607e-05f, +1.847553464e-04f, +1.421631704e-04f, -1.551919137e-04f, -3.732817758e-04f, -1.256122270e-04f, +4.409660155e-04f, +6.153311316e-04f, -5.516322276e-05f, -9.655496663e-04f, -8.739545383e-04f, +5.764561357e-04f, +1.953297415e-03f, +1.197032172e-03f, -1.999968260e-03f, -5.232241289e-03f, -5.331273993e-03f, -1.538164326e-03f, +3.439161406e-03f, +5.801141337e-03f, +4.140277667e-03f, +5.096686415e-04f, -1.845094954e-03f, -1.548525361e-03f, +1.221199429e-04f, +1.093440348e-03f, +6.476937013e-04f, -3.067481615e-04f, -6.395347426e-04f, -2.117612916e-04f, +2.898462597e-04f, +3.253162721e-04f, +1.756217103e-05f, -1.958446757e-04f, -1.304927459e-04f, +3.984357343e-05f, +9.880445341e-05f, +3.336966467e-05f, -3.392799952e-05f, -3.342900398e-05f, -2.831127739e-07f, +1.293196236e-05f, + -4.135532720e-04f, -8.850226537e-04f, +2.406538980e-04f, +2.573556744e-03f, +2.005825180e-03f, -3.447721460e-03f, -6.853462328e-03f, +3.388586312e-04f, +1.178283406e-02f, +8.804705866e-03f, -1.116535250e-02f, -2.132426314e-02f, -4.263844613e-05f, +2.899090549e-02f, +2.074014525e-02f, -2.245575810e-02f, -4.122274934e-02f, -1.012347165e-03f, +4.764440476e-02f, +3.270451580e-02f, -3.162894426e-02f, -5.587325206e-02f, -2.132792957e-03f, +5.631811183e-02f, +3.714249694e-02f, -3.253489408e-02f, -5.533258654e-02f, -2.716799546e-03f, +4.885129570e-02f, +3.095424592e-02f, -2.444815350e-02f, -4.001408054e-02f, -2.435016814e-03f, +3.052485820e-02f, +1.855662560e-02f, -1.286585224e-02f, -2.024805943e-02f, -1.571662490e-03f, +1.278715257e-02f, +7.437489841e-03f, -4.179733044e-03f, -6.337213412e-03f, -6.939784406e-04f, +2.904204205e-03f, +1.610804422e-03f, -5.165700545e-04f, -7.844280482e-04f, -2.385153209e-04f, + +1.133121540e-05f, -2.024337558e-06f, -6.642328452e-05f, -5.505634216e-05f, +1.017319127e-04f, +1.969179001e-04f, -3.338734227e-05f, -3.740600133e-04f, -2.299836744e-04f, +4.224952597e-04f, +6.590306087e-04f, -1.425595170e-04f, -1.027442075e-03f, -5.214749907e-04f, +9.932493695e-04f, +1.336001281e-03f, -3.392018486e-04f, -1.831169253e-03f, -7.913969501e-04f, +1.582053332e-03f, +1.881609933e-03f, -5.389280292e-04f, -2.323318986e-03f, -8.616755363e-04f, +1.820655579e-03f, +1.931453568e-03f, -6.101382732e-04f, -2.162153822e-03f, -6.834162386e-04f, +1.537263510e-03f, +1.451539319e-03f, -4.982027884e-04f, -1.462991477e-03f, -3.850290623e-04f, +9.307838329e-04f, +7.711091956e-04f, -2.837076758e-04f, -6.819225126e-04f, -1.418588860e-04f, +3.731787393e-04f, +2.611726881e-04f, -1.006102801e-04f, -1.880574393e-04f, -2.710958291e-05f, +7.804961113e-05f, +4.065622061e-05f, -1.479810028e-05f, -1.293196236e-05f, + /* 6,10 (48) */ + +4.022220566e-04f, +4.505864383e-04f, -4.815036912e-04f, -1.571565982e-03f, -7.846249043e-04f, +2.121250504e-03f, +3.658089200e-03f, +1.723330052e-04f, -5.872563574e-03f, -6.212300190e-03f, +2.990224753e-03f, +1.250542206e-02f, +7.786832807e-03f, -1.107084906e-02f, -2.238865355e-02f, -5.484412646e-03f, +2.796234188e-02f, +3.597730034e-02f, -7.021465538e-03f, -6.526856989e-02f, -5.844858492e-02f, +6.022773377e-02f, +2.403505066e-01f, +3.603341019e-01f, +3.300961487e-01f, +1.727807943e-01f, +3.502870548e-03f, -7.336094727e-02f, -4.650716500e-02f, +1.432611104e-02f, +3.862508523e-02f, +1.587526117e-02f, -1.530831696e-02f, -2.078410057e-02f, -3.379229683e-03f, +1.174470262e-02f, +9.929260895e-03f, -1.281863951e-03f, -7.243512536e-03f, -3.789016888e-03f, +2.093220328e-03f, +3.550227153e-03f, +9.355889825e-04f, -1.395460166e-03f, -1.273388223e-03f, -2.534114206e-05f, +5.300512766e-04f, +2.514472832e-04f, + -1.163122716e-05f, +1.237290880e-05f, +4.088736808e-05f, +1.556080047e-05f, -6.526287593e-05f, -9.550988961e-05f, +1.930752840e-05f, +1.816430483e-04f, +1.481008172e-04f, -1.445927038e-04f, -3.723618031e-04f, -1.408582796e-04f, +4.250011263e-04f, +6.226268793e-04f, -2.454609306e-05f, -9.463197984e-04f, -9.001044679e-04f, +5.208531702e-04f, +1.933953010e-03f, +1.263450662e-03f, -1.881669363e-03f, -5.165431691e-03f, -5.392823581e-03f, -1.695410871e-03f, +3.306529007e-03f, +5.790616145e-03f, +4.239333900e-03f, +6.184132929e-04f, -1.812143592e-03f, -1.590035406e-03f, +7.164636522e-05f, +1.085885881e-03f, +6.764352098e-04f, -2.823741443e-04f, -6.429237330e-04f, -2.304631328e-04f, +2.800825408e-04f, +3.315333797e-04f, +2.781635243e-05f, -1.935561938e-04f, -1.355410019e-04f, +3.551089913e-05f, +9.933198915e-05f, +3.610554137e-05f, -3.280593321e-05f, -3.428258992e-05f, -1.181865908e-06f, +1.297359113e-05f, + -4.022220566e-04f, -8.870469913e-04f, +1.742306135e-04f, +2.518500402e-03f, +2.107557093e-03f, -3.250803560e-03f, -6.886849670e-03f, -3.520138210e-05f, +1.155285038e-02f, +9.227201126e-03f, -1.050632189e-02f, -2.146682265e-02f, -1.070080522e-03f, +2.846943050e-02f, +2.173339462e-02f, -2.111975682e-02f, -4.156195119e-02f, -2.843516418e-03f, +4.685300781e-02f, +3.428656913e-02f, -2.974733433e-02f, -5.641218009e-02f, -4.456111943e-03f, +5.545643630e-02f, +3.896315252e-02f, -3.060344051e-02f, -5.594272481e-02f, -4.878953368e-03f, +4.816787947e-02f, +3.249150943e-02f, -2.299661418e-02f, -4.051228333e-02f, -3.898008290e-03f, +3.013982913e-02f, +1.948740943e-02f, -1.209474305e-02f, -2.053176710e-02f, -2.253585003e-03f, +1.264529368e-02f, +7.810668581e-03f, -3.918560355e-03f, -6.437823692e-03f, -8.820358799e-04f, +2.877094622e-03f, +1.688854033e-03f, -4.759138339e-04f, -7.992261485e-04f, -2.514472832e-04f, + +1.163122716e-05f, -3.718756133e-07f, -6.475105451e-05f, -5.785387577e-05f, +9.598916518e-05f, +1.982574397e-04f, -2.172951773e-05f, -3.679786417e-04f, -2.449492238e-04f, +4.023878455e-04f, +6.677134881e-04f, -1.074166071e-04f, -1.015891543e-03f, -5.613547283e-04f, +9.518672422e-04f, +1.359831878e-03f, -2.727609708e-04f, -1.817645040e-03f, -8.606542412e-04f, +1.523697855e-03f, +1.922817896e-03f, -4.507103864e-04f, -2.314086478e-03f, -9.472748852e-04f, +1.761304204e-03f, +1.981358900e-03f, -5.246885145e-04f, -2.160768010e-03f, -7.607451793e-04f, +1.493605346e-03f, +1.495101536e-03f, -4.380373535e-04f, -1.467281854e-03f, -4.354149662e-04f, +9.085441513e-04f, +7.980080470e-04f, -2.543486610e-04f, -6.868495175e-04f, -1.640783646e-04f, +3.663082355e-04f, +2.719909026e-04f, -9.194990665e-05f, -1.905926445e-04f, -3.262626545e-05f, +7.728990083e-05f, +4.283507783e-05f, -1.387918782e-05f, -1.297359113e-05f, + /* 6,11 (48) */ + +3.905908294e-04f, +4.629593471e-04f, -4.406163231e-04f, -1.556005181e-03f, -8.498877802e-04f, +2.025740615e-03f, +3.677396728e-03f, +3.539760536e-04f, -5.724462757e-03f, -6.356892894e-03f, +2.617862950e-03f, +1.236456378e-02f, +8.211833933e-03f, -1.044822218e-02f, -2.241319965e-02f, -6.430732444e-03f, +2.706223741e-02f, +3.649815351e-02f, -5.087512528e-03f, -6.400511923e-02f, -6.033025428e-02f, +5.506230208e-02f, +2.349576830e-01f, +3.586386910e-01f, +3.334026777e-01f, +1.785714105e-01f, +7.742204448e-03f, -7.274253398e-02f, -4.831930859e-02f, +1.273607564e-02f, +3.869673159e-02f, +1.696114705e-02f, -1.463188175e-02f, -2.106647472e-02f, -4.022153416e-03f, +1.151423949e-02f, +1.020934344e-02f, -9.503305711e-04f, -7.215696183e-03f, -3.982573082e-03f, +1.957679326e-03f, +3.585738052e-03f, +1.034920972e-03f, -1.359354625e-03f, -1.306194156e-03f, -5.962373197e-05f, +5.288694107e-04f, +2.644208743e-04f, + -1.190014518e-05f, +1.128162992e-05f, +4.053591994e-05f, +1.748281484e-05f, -6.276573041e-05f, -9.662710150e-05f, +1.388481807e-05f, +1.783236627e-04f, +1.537467684e-04f, -1.339401158e-04f, -3.709444324e-04f, -1.557188438e-04f, +4.086594606e-04f, +6.289968711e-04f, +5.732189004e-06f, -9.260704767e-04f, -9.247392699e-04f, +4.653170186e-04f, +1.912420313e-03f, +1.327192362e-03f, -1.763593947e-03f, -5.095422190e-03f, -5.450211354e-03f, -1.851269606e-03f, +3.171219637e-03f, +5.775822850e-03f, +4.336252698e-03f, +7.284964753e-04f, -1.776349229e-03f, -1.630064794e-03f, +2.040866966e-05f, +1.076784649e-03f, +7.046210202e-04f, -2.573180078e-04f, -6.454781322e-04f, -2.490853503e-04f, +2.698049460e-04f, +3.373738461e-04f, +3.817706870e-05f, -1.909596659e-04f, -1.404757048e-04f, +3.105281016e-05f, +9.972246519e-05f, +3.884182833e-05f, -3.160749143e-05f, -3.510112941e-05f, -2.104447899e-06f, +1.299015110e-05f, + -3.905908294e-04f, -8.874188669e-04f, +1.094795590e-04f, +2.460646526e-03f, +2.203546258e-03f, -3.052546120e-03f, -6.908579188e-03f, -4.031800238e-04f, +1.130790116e-02f, +9.629588971e-03f, -9.838608406e-03f, -2.157423926e-02f, -2.085972064e-03f, +2.790807577e-02f, +2.268526186e-02f, -1.975992494e-02f, -4.183471216e-02f, -4.661161458e-03f, +4.599235357e-02f, +3.581026699e-02f, -2.782451643e-02f, -5.686289048e-02f, -6.770198421e-03f, +5.450916141e-02f, +4.072445673e-02f, -2.862208161e-02f, -5.646741332e-02f, -7.039721378e-03f, +4.740713429e-02f, +3.398511477e-02f, -2.150151264e-02f, -4.095032069e-02f, -5.365290145e-03f, +2.970441417e-02f, +2.039595358e-02f, -1.129673500e-02f, -2.078611577e-02f, -2.940434520e-03f, +1.248121532e-02f, +8.176976816e-03f, -3.646569453e-03f, -6.529773598e-03f, -1.072628524e-03f, +2.844468357e-03f, +1.766143934e-03f, -4.330787560e-04f, -8.131053364e-04f, -2.644208743e-04f, + +1.190014518e-05f, +1.225099856e-06f, -6.300796565e-05f, -6.047955359e-05f, +9.020787174e-05f, +1.992364803e-04f, -1.024115626e-05f, -3.613892836e-04f, -2.593005639e-04f, +3.818911886e-04f, +6.752205347e-04f, -7.247466745e-05f, -1.002831839e-03f, -6.000023574e-04f, +9.092905707e-04f, +1.381353880e-03f, -2.062747762e-04f, -1.801323952e-03f, -9.282707680e-04f, +1.463141052e-03f, +1.960899026e-03f, -3.619414277e-04f, -2.301228055e-03f, -1.031364501e-03f, +1.699153931e-03f, +2.028211372e-03f, -4.382378834e-04f, -2.155972421e-03f, -8.371532126e-04f, +1.447391809e-03f, +1.536524015e-03f, -3.768072929e-04f, -1.469264846e-03f, -4.855061388e-04f, +8.846474702e-04f, +8.238894287e-04f, -2.242510113e-04f, -6.907170695e-04f, -1.863314983e-04f, +3.587265066e-04f, +2.825342586e-04f, -8.297188020e-05f, -1.928507229e-04f, -3.821462953e-05f, +7.636810055e-05f, +4.499945636e-05f, -1.289640005e-05f, -1.299015110e-05f, + /* 6,12 (48) */ + +3.786906842e-04f, +4.742409770e-04f, -4.000804031e-04f, -1.538522367e-03f, -9.126535106e-04f, +1.929113513e-03f, +3.691281546e-03f, +5.322997163e-04f, -5.570715989e-03f, -6.490833009e-03f, +2.246918518e-03f, +1.220884494e-02f, +8.620493394e-03f, -9.819225309e-03f, -2.240746746e-02f, -7.356802921e-03f, +2.613749814e-02f, +3.696347053e-02f, -3.175092215e-03f, -6.267792687e-02f, -6.209384823e-02f, +4.996687989e-02f, +2.295074716e-01f, +3.567874214e-01f, +3.365738973e-01f, +1.843472333e-01f, +1.207845715e-02f, -7.201403750e-02f, -5.009565782e-02f, +1.110601084e-02f, +3.871714026e-02f, +1.803793170e-02f, -1.392726073e-02f, -2.132379272e-02f, -4.667631548e-03f, +1.126515414e-02f, +1.047914838e-02f, -6.129567250e-04f, -7.177519115e-03f, -4.173532748e-03f, +1.817203621e-03f, +3.616790862e-03f, +1.134643437e-03f, -1.320512797e-03f, -1.337801647e-03f, -9.472486139e-05f, +5.267649628e-04f, +2.774110254e-04f, + -1.213829077e-05f, +1.020059379e-05f, +4.012873408e-05f, +1.933780265e-05f, -6.022406427e-05f, -9.758519584e-05f, +8.531327437e-06f, +1.748050353e-04f, +1.590972051e-04f, -1.232497358e-04f, -3.690380776e-04f, -1.701783911e-04f, +3.919678164e-04f, +6.344436463e-04f, +3.563531872e-05f, -9.048406397e-04f, -9.478457543e-04f, +4.099171202e-04f, +1.888756093e-03f, +1.388226278e-03f, -1.645850917e-03f, -5.022298439e-03f, -5.503407437e-03f, -2.005613969e-03f, +3.033339389e-03f, +5.756750934e-03f, +4.430928190e-03f, +8.398258175e-04f, -1.737711230e-03f, -1.668542953e-03f, -3.153675092e-05f, +1.066129499e-03f, +7.322066741e-04f, -2.316054131e-04f, -6.471842655e-04f, -2.676012728e-04f, +2.590211863e-04f, +3.428244537e-04f, +4.863109859e-05f, -1.880543077e-04f, -1.452879072e-04f, +2.647383212e-05f, +9.997285517e-05f, +4.157428121e-05f, -3.033300262e-05f, -3.588242442e-05f, -3.049786624e-06f, +1.298089736e-05f, + -3.786906842e-04f, -8.861937670e-04f, +4.647159335e-05f, +2.400166972e-03f, +2.293754130e-03f, -2.853309640e-03f, -6.918820344e-03f, -7.645693074e-04f, +1.104860059e-02f, +1.001148016e-02f, -9.163387871e-03f, -2.164671393e-02f, -3.088803903e-03f, +2.730807342e-02f, +2.359455243e-02f, -1.837857106e-02f, -4.204098693e-02f, -6.462485410e-03f, +4.506408280e-02f, +3.727340804e-02f, -2.586361741e-02f, -5.722483191e-02f, -9.071426476e-03f, +5.347779691e-02f, +4.242361066e-02f, -2.659387024e-02f, -5.690565121e-02f, -9.195693798e-03f, +4.656998107e-02f, +3.543250658e-02f, -1.996498863e-02f, -4.132712798e-02f, -6.834554991e-03f, +2.921890803e-02f, +2.128060105e-02f, -1.047284557e-02f, -2.101036678e-02f, -3.631151590e-03f, +1.229488382e-02f, +8.535703323e-03f, -3.364035194e-03f, -6.612745479e-03f, -1.265479247e-03f, +2.806253727e-03f, +1.842512035e-03f, -3.880792997e-04f, -8.260017364e-04f, -2.774110254e-04f, + +1.213829077e-05f, +2.765018826e-06f, -6.119931503e-05f, -6.293264893e-05f, +8.439917964e-05f, +1.998602095e-04f, +1.060981472e-06f, -3.543109979e-04f, -2.730223974e-04f, +3.610442174e-04f, +6.815530458e-04f, -3.778868120e-05f, -9.882984193e-04f, -6.373657158e-04f, +8.655969926e-04f, +1.400547921e-03f, -1.398502021e-04f, -1.782245864e-03f, -9.941451458e-04f, +1.400486931e-03f, +1.995800483e-03f, -2.727637206e-04f, -2.284767897e-03f, -1.113810654e-03f, +1.634302546e-03f, +2.071932351e-03f, -3.509225522e-04f, -2.147765234e-03f, -9.125145432e-04f, +1.398685977e-03f, +1.575728923e-03f, -3.146050762e-04f, -1.468921251e-03f, -5.352187495e-04f, +8.591182488e-04f, +8.487007769e-04f, -1.934564494e-04f, -6.935058886e-04f, -2.085812962e-04f, +3.504359284e-04f, +2.927800816e-04f, -7.368618329e-05f, -1.948220386e-04f, -4.386599617e-05f, +7.528183798e-05f, +4.714454596e-05f, -1.184973062e-05f, -1.298089736e-05f, + /* 6,13 (48) */ + +3.665523935e-04f, +4.844415708e-04f, -3.599516690e-04f, -1.519184564e-03f, -9.728775749e-04f, +1.831528317e-03f, +3.699812874e-03f, +7.071047516e-04f, -5.411618784e-03f, -6.614082745e-03f, +1.877880440e-03f, +1.203866655e-02f, +9.012461210e-03f, -9.184781663e-03f, -2.237183214e-02f, -8.261643560e-03f, +2.518965239e-02f, +3.737338765e-02f, -1.286336122e-03f, -6.128970059e-02f, -6.373969915e-02f, +4.494458145e-02f, +2.240040642e-01f, +3.547818075e-01f, +3.396072367e-01f, +1.901039843e-01f, +1.650938534e-02f, -7.117421169e-02f, -5.183336905e-02f, +9.437467890e-03f, +3.868560351e-02f, +1.910406119e-02f, -1.319505405e-02f, -2.155539814e-02f, -5.314815813e-03f, +1.099755286e-02f, +1.073816957e-02f, -2.701322713e-04f, -7.128888016e-03f, -4.361587055e-03f, +1.671915714e-03f, +3.643264694e-03f, +1.234616292e-03f, -1.278938516e-03f, -1.368134650e-03f, -1.306072858e-04f, +5.237151761e-04f, +2.903919228e-04f, + -1.234603609e-05f, +9.131431252e-06f, +3.966770023e-05f, +2.112421139e-05f, -5.764254316e-05f, -9.838547999e-05f, +3.253710870e-06f, +1.710951859e-04f, +1.641487836e-04f, -1.125369970e-04f, -3.666517270e-04f, -1.842221365e-04f, +3.749531488e-04f, +6.389709586e-04f, +6.512791117e-05f, -8.826700539e-04f, -9.694128361e-04f, +3.547219075e-04f, +1.863018891e-03f, +1.446524599e-03f, -1.528547974e-03f, -4.946148599e-03f, -5.552385977e-03f, -2.158318909e-03f, +2.892996910e-03f, +5.733393884e-03f, +4.523256024e-03f, +9.523068714e-04f, -1.696232062e-03f, -1.705400290e-03f, -8.413192717e-05f, +1.053915209e-03f, +7.591479881e-04f, -2.052632092e-04f, -6.480294558e-04f, -2.859840513e-04f, +2.477397787e-04f, +3.478723656e-04f, +5.916490752e-05f, -1.848397734e-04f, -1.499687083e-04f, +2.177874479e-05f, +1.000802969e-04f, +4.429858431e-05f, -2.898292652e-05f, -3.662429443e-05f, -4.016743749e-06f, +1.294511835e-05f, + -3.665523935e-04f, -8.834287482e-04f, -1.472772168e-05f, +2.337234324e-03f, +2.378153310e-03f, -2.653449430e-03f, -6.917759363e-03f, -1.118880305e-03f, +1.077557820e-02f, +1.037252438e-02f, -8.481834825e-03f, -2.168450261e-02f, -4.077102323e-03f, +2.667070770e-02f, +2.446014943e-02f, -1.697802314e-02f, -4.218083714e-02f, -8.244731274e-03f, +4.406993765e-02f, +3.867389497e-02f, -2.386781692e-02f, -5.749759563e-02f, -1.135619437e-02f, +5.236398626e-02f, +4.405791320e-02f, -2.452193789e-02f, -5.725657376e-02f, -1.134345903e-02f, +4.565746653e-02f, +3.683119256e-02f, -1.838925970e-02f, -4.164173305e-02f, -8.303476242e-03f, +2.868368928e-02f, +2.213971930e-02f, -9.624144797e-03f, -2.120382323e-02f, -4.324657479e-03f, +1.208630252e-02f, +8.886139251e-03f, -3.071255113e-03f, -6.686431662e-03f, -1.460301286e-03f, +2.762387731e-03f, +1.917793873e-03f, -3.409347537e-04f, -8.378514670e-04f, -2.903919228e-04f, + +1.234603609e-05f, +4.246478632e-06f, -5.933039603e-05f, -6.521278117e-05f, +7.857405835e-05f, +2.001343575e-04f, +1.216074364e-05f, -3.467634009e-04f, -2.861007156e-04f, +3.398859639e-04f, +6.867142749e-04f, -3.412638687e-06f, -9.723288509e-04f, -6.733951917e-04f, +8.208654043e-04f, +1.417398567e-03f, -7.359347869e-05f, -1.760454940e-03f, -1.058179230e-03f, +1.335842558e-03f, +2.027474710e-03f, -1.833202433e-04f, -2.264735987e-03f, -1.194482311e-03f, +1.566852253e-03f, +2.112448184e-03f, -2.628803648e-04f, -2.136150166e-03f, -9.867046377e-04f, +1.347555264e-03f, +1.612641656e-03f, -2.515253188e-04f, -1.466235570e-03f, -5.844689476e-04f, +8.319838752e-04f, +8.723908122e-04f, -1.620083209e-04f, -6.951983024e-04f, -2.307902896e-04f, +3.414401451e-04f, +3.027058630e-04f, -6.410352750e-05f, -1.964972977e-04f, -4.957137964e-05f, +7.402900911e-05f, +4.926544663e-05f, -1.073931758e-05f, -1.294511835e-05f, + /* 6,14 (48) */ + +3.542063574e-04f, +4.935730020e-04f, -3.202839688e-04f, -1.498060353e-03f, -1.030520118e-03f, +1.733142837e-03f, +3.703066585e-03f, +8.781999375e-04f, -5.247470000e-03f, -6.726619742e-03f, +1.511228713e-03f, +1.185444441e-02f, +9.387414359e-03f, -8.545810704e-03f, -2.230670423e-02f, -9.144313614e-03f, +2.422023955e-02f, +3.772810956e-02f, +5.766827686e-04f, -5.984317599e-02f, -6.526824712e-02f, +3.999843285e-02f, +2.184516782e-01f, +3.526234885e-01f, +3.425002336e-01f, +1.958373782e-01f, +2.103264136e-02f, -7.022190482e-02f, -5.352960111e-02f, +7.732067600e-03f, +3.860147158e-02f, +2.015797640e-02f, -1.243590607e-02f, -2.176066135e-02f, -5.962845269e-03f, +1.071156881e-02f, +1.098590935e-02f, +7.774009424e-05f, -7.069723108e-03f, -4.546426829e-03f, +1.521947006e-03f, +3.665043439e-03f, +1.334696589e-03f, -1.234639931e-03f, -1.397117576e-03f, -1.672315802e-04f, +5.196984324e-04f, +3.033370412e-04f, + -1.252380240e-05f, +8.075716455e-06f, +3.915475926e-05f, +2.284062728e-05f, -5.502581215e-05f, -9.902947732e-05f, -1.941592106e-06f, +1.672022944e-04f, +1.688986336e-04f, -1.018171598e-04f, -3.637949248e-04f, -1.978360502e-04f, +3.576425317e-04f, +6.425837567e-04f, +9.417553793e-05f, -8.595992529e-04f, -9.894315259e-04f, +2.997987345e-04f, +1.835268932e-03f, +1.502062702e-03f, -1.411791514e-03f, -4.867063234e-03f, -5.597125161e-03f, -2.309261014e-03f, +2.750303297e-03f, +5.705749210e-03f, +4.613133477e-03f, +1.065843199e-03f, -1.651917312e-03f, -1.740568283e-03f, -1.373173676e-04f, +1.040138524e-03f, +7.854011156e-04f, -1.783194103e-04f, -6.480020529e-04f, -3.042066950e-04f, +2.359700435e-04f, +3.525051485e-04f, +6.976466306e-05f, -1.813161613e-04f, -1.545092677e-04f, +1.697257874e-05f, +1.000420994e-04f, +4.701035630e-05f, -2.755785588e-05f, -3.732458058e-05f, -5.004115458e-06f, +1.288213796e-05f, + -3.542063574e-04f, -8.791822696e-04f, -7.405811770e-05f, +2.272021542e-03f, +2.456727368e-03f, -2.453315073e-03f, -6.905598619e-03f, -1.465643706e-03f, +1.048947748e-02f, +1.071241034e-02f, -7.795120550e-03f, -2.168791525e-02f, -5.049431174e-03f, +2.599731251e-02f, +2.528101483e-02f, -1.556062457e-02f, -4.225443061e-02f, -1.000518621e-02f, +4.301175842e-02f, +4.000973753e-02f, -2.184034221e-02f, -5.768091587e-02f, -1.362093036e-02f, +5.116950395e-02f, +4.562476546e-02f, -2.240948970e-02f, -5.751945412e-02f, -1.347960920e-02f, +4.467076189e-02f, +3.817874782e-02f, -1.677661805e-02f, -4.189325837e-02f, -9.769711812e-03f, +2.809922033e-02f, +2.297170317e-02f, -8.751753984e-03f, -2.136583155e-02f, -5.019855781e-03f, +1.185551223e-02f, +9.227579396e-03f, -2.768549250e-03f, -6.750535189e-03f, -1.656798584e-03f, +2.712816351e-03f, +1.991822882e-03f, -2.916693071e-04f, -8.485907846e-04f, -3.033370412e-04f, + +1.252380240e-05f, +5.668242641e-06f, -5.740648749e-05f, -6.731990907e-05f, +7.274328220e-05f, +2.000651765e-04f, +2.304260649e-05f, -3.387666227e-04f, -2.985228050e-04f, +3.184554961e-04f, +6.907094046e-04f, +3.060054439e-05f, -9.549627299e-04f, -7.080437859e-04f, +7.751758193e-04f, +1.431894319e-03f, -7.609956241e-06f, -1.735999543e-03f, -1.120278267e-03f, +1.269317874e-03f, +2.055879498e-03f, -9.375414920e-05f, -2.241168059e-03f, -1.273251348e-03f, +1.496909514e-03f, +2.149690319e-03f, -1.742506136e-04f, -2.121136482e-03f, -1.059600435e-03f, +1.294071328e-03f, +1.647190982e-03f, -1.876646366e-04f, -1.461196060e-03f, -6.331730036e-04f, +8.032746449e-04f, +8.949096394e-04f, -1.299515369e-04f, -6.957782950e-04f, -2.529205913e-04f, +3.317440804e-04f, +3.122893028e-04f, -5.423534605e-05f, -1.978675716e-04f, -5.532149868e-05f, +7.260778855e-05f, +5.135717680e-05f, -9.565447060e-06f, -1.288213796e-05f, + /* 6,15 (48) */ + +3.416825550e-04f, +5.016487185e-04f, -2.811292096e-04f, -1.475219725e-03f, -1.085545930e-03f, +1.634113360e-03f, +3.701124993e-03f, +1.045402232e-03f, -5.078571367e-03f, -6.828436902e-03f, +1.147433788e-03f, +1.165660836e-02f, +9.745056891e-03f, -7.903226948e-03f, -2.221252869e-02f, -1.000391287e-02f, +2.323080802e-02f, +3.802790829e-02f, +2.411951701e-03f, -5.834111329e-02f, -6.668003863e-02f, +3.513136962e-02f, +2.128545531e-01f, +3.503142275e-01f, +3.452505369e-01f, +2.015431274e-01f, +2.564577484e-02f, -6.915606162e-02f, -5.518151842e-02f, +5.991499317e-03f, +3.846415422e-02f, +2.119811493e-02f, -1.165050495e-02f, -2.193898076e-02f, -6.610847322e-03f, +1.040736212e-02f, +1.122187939e-02f, +4.302452427e-04f, -6.999958445e-03f, -4.727742990e-03f, +1.367437738e-03f, +3.682016018e-03f, +1.434738688e-03f, -1.187629575e-03f, -1.424675432e-03f, -2.045561608e-04f, +5.146943169e-04f, +3.162191791e-04f, + -1.267205825e-05f, +7.034965172e-06f, +3.859189896e-05f, +2.448577510e-05f, -5.237848872e-05f, -9.951892142e-05f, -7.048363227e-06f, +1.631346866e-04f, +1.733443561e-04f, -9.110529226e-05f, -3.604777500e-04f, -2.110068681e-04f, +3.400631189e-04f, +6.452881649e-04f, +1.227447621e-04f, -8.356694761e-04f, -1.007894918e-03f, +2.452138071e-04f, +1.805568045e-03f, +1.554819155e-03f, -1.295686520e-03f, -4.785135208e-03f, -5.637607225e-03f, -2.458318630e-03f, +2.605371983e-03f, +5.673818458e-03f, +4.700459576e-03f, +1.180336464e-03f, -1.604775713e-03f, -1.773979571e-03f, -1.910321154e-04f, +1.024798178e-03f, +8.109226079e-04f, -1.508031714e-04f, -6.470914609e-04f, -3.222421066e-04f, +2.237221013e-04f, +3.567107958e-04f, +8.041625104e-05f, -1.774840205e-04f, -1.589008196e-04f, +1.206061149e-05f, +9.985575014e-05f, +4.970515603e-05f, -2.605851780e-05f, -3.798114978e-05f, -6.010633299e-06f, +1.279131761e-05f, + -3.416825550e-04f, -8.735140269e-04f, -1.314646052e-04f, +2.204701633e-03f, +2.529470650e-03f, -2.253249896e-03f, -6.882556012e-03f, -1.804410329e-03f, +1.019095468e-02f, +1.103086584e-02f, -7.104411146e-03f, -2.165731470e-02f, -6.004393903e-03f, +2.528926872e-02f, +2.605619065e-02f, -1.412873026e-02f, -4.226204057e-02f, -1.174118576e-02f, +4.189148016e-02f, +4.127905540e-02f, -1.978446272e-02f, -5.777467002e-02f, -1.586209842e-02f, +4.989625260e-02f, +4.712167497e-02f, -2.025979938e-02f, -5.769370474e-02f, -1.560074568e-02f, +4.361116146e-02f, +3.947281915e-02f, -1.512942707e-02f, -4.208092301e-02f, -1.123090787e-02f, +2.746604733e-02f, +2.377497782e-02f, -7.856844345e-03f, -2.149578308e-02f, -5.715634076e-03f, +1.160259164e-02f, +9.559323477e-03f, -2.456259947e-03f, -6.804770535e-03f, -1.854666155e-03f, +2.657494853e-03f, +2.064430670e-03f, -2.403121303e-04f, -8.581562317e-04f, -3.162191791e-04f, + +1.267205825e-05f, +7.029238600e-06f, -5.543284324e-05f, -6.925432346e-05f, +6.691741390e-05f, +1.996594200e-04f, +3.369169212e-05f, -3.303412642e-04f, -3.102772523e-04f, +2.967918487e-04f, +6.935455157e-04f, +6.419910584e-05f, -9.362415961e-04f, -7.412671690e-04f, +7.286092271e-04f, +1.444027608e-03f, +5.799606398e-05f, -1.708932137e-03f, -1.180351032e-03f, +1.201025502e-03f, +2.080978043e-03f, -4.208531243e-06f, -2.214105531e-03f, -1.349992761e-03f, +1.424584869e-03f, +2.183595432e-03f, -8.517381261e-05f, -2.102738992e-03f, -1.131080554e-03f, +1.238309972e-03f, +1.679309172e-03f, -1.231214967e-04f, -1.453794775e-03f, -6.812474507e-04f, +7.730237344e-04f, +9.162088455e-04f, -9.733251319e-05f, -6.952315542e-04f, -2.749339573e-04f, +3.213539468e-04f, +3.215083537e-04f, -4.409378486e-05f, -1.989243212e-04f, -6.110678857e-05f, +7.101663954e-05f, +5.341468188e-05f, -8.328556656e-06f, -1.279131761e-05f, + /* 6,16 (48) */ + +3.290104967e-04f, +5.086836836e-04f, -2.425373106e-04f, -1.450733950e-03f, -1.137924419e-03f, +1.534594438e-03f, +3.694076629e-03f, +1.208536918e-03f, -4.905227010e-03f, -6.919542194e-03f, +7.869560385e-04f, +1.144560149e-02f, +1.008512001e-02f, -7.257938783e-03f, -2.208978393e-02f, -1.083958234e-02f, +2.222291311e-02f, +3.827312210e-02f, +4.217519746e-03f, -5.678629413e-02f, -6.797572515e-02f, +3.034623441e-02f, +2.072169458e-01f, +3.478559089e-01f, +3.478559089e-01f, +2.072169458e-01f, +3.034623441e-02f, -6.797572515e-02f, -5.678629413e-02f, +4.217519746e-03f, +3.827312210e-02f, +2.222291311e-02f, -1.083958234e-02f, -2.208978393e-02f, -7.257938783e-03f, +1.008512001e-02f, +1.144560149e-02f, +7.869560385e-04f, -6.919542194e-03f, -4.905227010e-03f, +1.208536918e-03f, +3.694076629e-03f, +1.534594438e-03f, -1.137924419e-03f, -1.450733950e-03f, -2.425373106e-04f, +5.086836836e-04f, +3.290104967e-04f, + -1.279131761e-05f, +6.010633299e-06f, +3.798114978e-05f, +2.605851780e-05f, -4.970515603e-05f, -9.985575014e-05f, -1.206061149e-05f, +1.589008196e-04f, +1.774840205e-04f, -8.041625104e-05f, -3.567107958e-04f, -2.237221013e-04f, +3.222421066e-04f, +6.470914609e-04f, +1.508031714e-04f, -8.109226079e-04f, -1.024798178e-03f, +1.910321154e-04f, +1.773979571e-03f, +1.604775713e-03f, -1.180336464e-03f, -4.700459576e-03f, -5.673818458e-03f, -2.605371983e-03f, +2.458318630e-03f, +5.637607225e-03f, +4.785135208e-03f, +1.295686520e-03f, -1.554819155e-03f, -1.805568045e-03f, -2.452138071e-04f, +1.007894918e-03f, +8.356694761e-04f, -1.227447621e-04f, -6.452881649e-04f, -3.400631189e-04f, +2.110068681e-04f, +3.604777500e-04f, +9.110529226e-05f, -1.733443561e-04f, -1.631346866e-04f, +7.048363227e-06f, +9.951892142e-05f, +5.237848872e-05f, -2.448577510e-05f, -3.859189896e-05f, -7.034965172e-06f, +1.267205825e-05f, + -3.290104967e-04f, -8.664847883e-04f, -1.868974484e-04f, +2.135447310e-03f, +2.596388064e-03f, -2.053590476e-03f, -6.848864320e-03f, -2.134751593e-03f, +9.880677424e-03f, +1.132765769e-02f, -6.410865630e-03f, -2.159311560e-02f, -6.940635500e-03f, +2.454800155e-02f, +2.678479988e-02f, -1.268470265e-02f, -4.220404451e-02f, -1.345011789e-02f, +4.071112912e-02f, +4.248008090e-02f, -1.770348467e-02f, -5.777887855e-02f, -1.807620395e-02f, +4.854625984e-02f, +4.854625984e-02f, -1.807620395e-02f, -5.777887855e-02f, -1.770348467e-02f, +4.248008090e-02f, +4.071112912e-02f, -1.345011789e-02f, -4.220404451e-02f, -1.268470265e-02f, +2.678479988e-02f, +2.454800155e-02f, -6.940635500e-03f, -2.159311560e-02f, -6.410865630e-03f, +1.132765769e-02f, +9.880677424e-03f, -2.134751593e-03f, -6.848864320e-03f, -2.053590476e-03f, +2.596388064e-03f, +2.135447310e-03f, -1.868974484e-04f, -8.664847883e-04f, -3.290104967e-04f, + +1.279131761e-05f, +8.328556656e-06f, -5.341468188e-05f, -7.101663954e-05f, +6.110678857e-05f, +1.989243212e-04f, +4.409378486e-05f, -3.215083537e-04f, -3.213539468e-04f, +2.749339573e-04f, +6.952315542e-04f, +9.733251319e-05f, -9.162088455e-04f, -7.730237344e-04f, +6.812474507e-04f, +1.453794775e-03f, +1.231214967e-04f, -1.679309172e-03f, -1.238309972e-03f, +1.131080554e-03f, +2.102738992e-03f, +8.517381261e-05f, -2.183595432e-03f, -1.424584869e-03f, +1.349992761e-03f, +2.214105531e-03f, +4.208531243e-06f, -2.080978043e-03f, -1.201025502e-03f, +1.180351032e-03f, +1.708932137e-03f, -5.799606398e-05f, -1.444027608e-03f, -7.286092271e-04f, +7.412671690e-04f, +9.362415961e-04f, -6.419910584e-05f, -6.935455157e-04f, -2.967918487e-04f, +3.102772523e-04f, +3.303412642e-04f, -3.369169212e-05f, -1.996594200e-04f, -6.691741390e-05f, +6.925432346e-05f, +5.543284324e-05f, -7.029238600e-06f, -1.267205825e-05f, + /* 6,17 (48) */ + +3.162191791e-04f, +5.146943169e-04f, -2.045561608e-04f, -1.424675432e-03f, -1.187629575e-03f, +1.434738688e-03f, +3.682016018e-03f, +1.367437738e-03f, -4.727742990e-03f, -6.999958445e-03f, +4.302452427e-04f, +1.122187939e-02f, +1.040736212e-02f, -6.610847322e-03f, -2.193898076e-02f, -1.165050495e-02f, +2.119811493e-02f, +3.846415422e-02f, +5.991499317e-03f, -5.518151842e-02f, -6.915606162e-02f, +2.564577484e-02f, +2.015431274e-01f, +3.452505369e-01f, +3.503142275e-01f, +2.128545531e-01f, +3.513136962e-02f, -6.668003863e-02f, -5.834111329e-02f, +2.411951701e-03f, +3.802790829e-02f, +2.323080802e-02f, -1.000391287e-02f, -2.221252869e-02f, -7.903226948e-03f, +9.745056891e-03f, +1.165660836e-02f, +1.147433788e-03f, -6.828436902e-03f, -5.078571367e-03f, +1.045402232e-03f, +3.701124993e-03f, +1.634113360e-03f, -1.085545930e-03f, -1.475219725e-03f, -2.811292096e-04f, +5.016487185e-04f, +3.416825550e-04f, + -1.288213796e-05f, +5.004115458e-06f, +3.732458058e-05f, +2.755785588e-05f, -4.701035630e-05f, -1.000420994e-04f, -1.697257874e-05f, +1.545092677e-04f, +1.813161613e-04f, -6.976466306e-05f, -3.525051485e-04f, -2.359700435e-04f, +3.042066950e-04f, +6.480020529e-04f, +1.783194103e-04f, -7.854011156e-04f, -1.040138524e-03f, +1.373173676e-04f, +1.740568283e-03f, +1.651917312e-03f, -1.065843199e-03f, -4.613133477e-03f, -5.705749210e-03f, -2.750303297e-03f, +2.309261014e-03f, +5.597125161e-03f, +4.867063234e-03f, +1.411791514e-03f, -1.502062702e-03f, -1.835268932e-03f, -2.997987345e-04f, +9.894315259e-04f, +8.595992529e-04f, -9.417553793e-05f, -6.425837567e-04f, -3.576425317e-04f, +1.978360502e-04f, +3.637949248e-04f, +1.018171598e-04f, -1.688986336e-04f, -1.672022944e-04f, +1.941592106e-06f, +9.902947732e-05f, +5.502581215e-05f, -2.284062728e-05f, -3.915475926e-05f, -8.075716455e-06f, +1.252380240e-05f, + -3.162191791e-04f, -8.581562317e-04f, -2.403121303e-04f, +2.064430670e-03f, +2.657494853e-03f, -1.854666155e-03f, -6.804770535e-03f, -2.456259947e-03f, +9.559323477e-03f, +1.160259164e-02f, -5.715634076e-03f, -2.149578308e-02f, -7.856844345e-03f, +2.377497782e-02f, +2.746604733e-02f, -1.123090787e-02f, -4.208092301e-02f, -1.512942707e-02f, +3.947281915e-02f, +4.361116146e-02f, -1.560074568e-02f, -5.769370474e-02f, -2.025979938e-02f, +4.712167497e-02f, +4.989625260e-02f, -1.586209842e-02f, -5.777467002e-02f, -1.978446272e-02f, +4.127905540e-02f, +4.189148016e-02f, -1.174118576e-02f, -4.226204057e-02f, -1.412873026e-02f, +2.605619065e-02f, +2.528926872e-02f, -6.004393903e-03f, -2.165731470e-02f, -7.104411146e-03f, +1.103086584e-02f, +1.019095468e-02f, -1.804410329e-03f, -6.882556012e-03f, -2.253249896e-03f, +2.529470650e-03f, +2.204701633e-03f, -1.314646052e-04f, -8.735140269e-04f, -3.416825550e-04f, + +1.288213796e-05f, +9.565447060e-06f, -5.135717680e-05f, -7.260778855e-05f, +5.532149868e-05f, +1.978675716e-04f, +5.423534605e-05f, -3.122893028e-04f, -3.317440804e-04f, +2.529205913e-04f, +6.957782950e-04f, +1.299515369e-04f, -8.949096394e-04f, -8.032746449e-04f, +6.331730036e-04f, +1.461196060e-03f, +1.876646366e-04f, -1.647190982e-03f, -1.294071328e-03f, +1.059600435e-03f, +2.121136482e-03f, +1.742506136e-04f, -2.149690319e-03f, -1.496909514e-03f, +1.273251348e-03f, +2.241168059e-03f, +9.375414920e-05f, -2.055879498e-03f, -1.269317874e-03f, +1.120278267e-03f, +1.735999543e-03f, +7.609956241e-06f, -1.431894319e-03f, -7.751758193e-04f, +7.080437859e-04f, +9.549627299e-04f, -3.060054439e-05f, -6.907094046e-04f, -3.184554961e-04f, +2.985228050e-04f, +3.387666227e-04f, -2.304260649e-05f, -2.000651765e-04f, -7.274328220e-05f, +6.731990907e-05f, +5.740648749e-05f, -5.668242641e-06f, -1.252380240e-05f, + /* 6,18 (48) */ + +3.033370412e-04f, +5.196984324e-04f, -1.672315802e-04f, -1.397117576e-03f, -1.234639931e-03f, +1.334696589e-03f, +3.665043439e-03f, +1.521947006e-03f, -4.546426829e-03f, -7.069723108e-03f, +7.774009424e-05f, +1.098590935e-02f, +1.071156881e-02f, -5.962845269e-03f, -2.176066135e-02f, -1.243590607e-02f, +2.015797640e-02f, +3.860147158e-02f, +7.732067600e-03f, -5.352960111e-02f, -7.022190482e-02f, +2.103264136e-02f, +1.958373782e-01f, +3.425002336e-01f, +3.526234885e-01f, +2.184516782e-01f, +3.999843285e-02f, -6.526824712e-02f, -5.984317599e-02f, +5.766827686e-04f, +3.772810956e-02f, +2.422023955e-02f, -9.144313614e-03f, -2.230670423e-02f, -8.545810704e-03f, +9.387414359e-03f, +1.185444441e-02f, +1.511228713e-03f, -6.726619742e-03f, -5.247470000e-03f, +8.781999375e-04f, +3.703066585e-03f, +1.733142837e-03f, -1.030520118e-03f, -1.498060353e-03f, -3.202839688e-04f, +4.935730020e-04f, +3.542063574e-04f, + -1.294511835e-05f, +4.016743749e-06f, +3.662429443e-05f, +2.898292652e-05f, -4.429858431e-05f, -1.000802969e-04f, -2.177874479e-05f, +1.499687083e-04f, +1.848397734e-04f, -5.916490752e-05f, -3.478723656e-04f, -2.477397787e-04f, +2.859840513e-04f, +6.480294558e-04f, +2.052632092e-04f, -7.591479881e-04f, -1.053915209e-03f, +8.413192717e-05f, +1.705400290e-03f, +1.696232062e-03f, -9.523068714e-04f, -4.523256024e-03f, -5.733393884e-03f, -2.892996910e-03f, +2.158318909e-03f, +5.552385977e-03f, +4.946148599e-03f, +1.528547974e-03f, -1.446524599e-03f, -1.863018891e-03f, -3.547219075e-04f, +9.694128361e-04f, +8.826700539e-04f, -6.512791117e-05f, -6.389709586e-04f, -3.749531488e-04f, +1.842221365e-04f, +3.666517270e-04f, +1.125369970e-04f, -1.641487836e-04f, -1.710951859e-04f, -3.253710870e-06f, +9.838547999e-05f, +5.764254316e-05f, -2.112421139e-05f, -3.966770023e-05f, -9.131431252e-06f, +1.234603609e-05f, + -3.033370412e-04f, -8.485907846e-04f, -2.916693071e-04f, +1.991822882e-03f, +2.712816351e-03f, -1.656798584e-03f, -6.750535189e-03f, -2.768549250e-03f, +9.227579396e-03f, +1.185551223e-02f, -5.019855781e-03f, -2.136583155e-02f, -8.751753984e-03f, +2.297170317e-02f, +2.809922033e-02f, -9.769711812e-03f, -4.189325837e-02f, -1.677661805e-02f, +3.817874782e-02f, +4.467076189e-02f, -1.347960920e-02f, -5.751945412e-02f, -2.240948970e-02f, +4.562476546e-02f, +5.116950395e-02f, -1.362093036e-02f, -5.768091587e-02f, -2.184034221e-02f, +4.000973753e-02f, +4.301175842e-02f, -1.000518621e-02f, -4.225443061e-02f, -1.556062457e-02f, +2.528101483e-02f, +2.599731251e-02f, -5.049431174e-03f, -2.168791525e-02f, -7.795120550e-03f, +1.071241034e-02f, +1.048947748e-02f, -1.465643706e-03f, -6.905598619e-03f, -2.453315073e-03f, +2.456727368e-03f, +2.272021542e-03f, -7.405811770e-05f, -8.791822696e-04f, -3.542063574e-04f, + +1.294511835e-05f, +1.073931758e-05f, -4.926544663e-05f, -7.402900911e-05f, +4.957137964e-05f, +1.964972977e-04f, +6.410352750e-05f, -3.027058630e-04f, -3.414401451e-04f, +2.307902896e-04f, +6.951983024e-04f, +1.620083209e-04f, -8.723908122e-04f, -8.319838752e-04f, +5.844689476e-04f, +1.466235570e-03f, +2.515253188e-04f, -1.612641656e-03f, -1.347555264e-03f, +9.867046377e-04f, +2.136150166e-03f, +2.628803648e-04f, -2.112448184e-03f, -1.566852253e-03f, +1.194482311e-03f, +2.264735987e-03f, +1.833202433e-04f, -2.027474710e-03f, -1.335842558e-03f, +1.058179230e-03f, +1.760454940e-03f, +7.359347869e-05f, -1.417398567e-03f, -8.208654043e-04f, +6.733951917e-04f, +9.723288509e-04f, +3.412638687e-06f, -6.867142749e-04f, -3.398859639e-04f, +2.861007156e-04f, +3.467634009e-04f, -1.216074364e-05f, -2.001343575e-04f, -7.857405835e-05f, +6.521278117e-05f, +5.933039603e-05f, -4.246478632e-06f, -1.234603609e-05f, + /* 6,19 (48) */ + +2.903919228e-04f, +5.237151761e-04f, -1.306072858e-04f, -1.368134650e-03f, -1.278938516e-03f, +1.234616292e-03f, +3.643264694e-03f, +1.671915714e-03f, -4.361587055e-03f, -7.128888016e-03f, -2.701322713e-04f, +1.073816957e-02f, +1.099755286e-02f, -5.314815813e-03f, -2.155539814e-02f, -1.319505405e-02f, +1.910406119e-02f, +3.868560351e-02f, +9.437467890e-03f, -5.183336905e-02f, -7.117421169e-02f, +1.650938534e-02f, +1.901039843e-01f, +3.396072367e-01f, +3.547818075e-01f, +2.240040642e-01f, +4.494458145e-02f, -6.373969915e-02f, -6.128970059e-02f, -1.286336122e-03f, +3.737338765e-02f, +2.518965239e-02f, -8.261643560e-03f, -2.237183214e-02f, -9.184781663e-03f, +9.012461210e-03f, +1.203866655e-02f, +1.877880440e-03f, -6.614082745e-03f, -5.411618784e-03f, +7.071047516e-04f, +3.699812874e-03f, +1.831528317e-03f, -9.728775749e-04f, -1.519184564e-03f, -3.599516690e-04f, +4.844415708e-04f, +3.665523935e-04f, + -1.298089736e-05f, +3.049786624e-06f, +3.588242442e-05f, +3.033300262e-05f, -4.157428121e-05f, -9.997285517e-05f, -2.647383212e-05f, +1.452879072e-04f, +1.880543077e-04f, -4.863109859e-05f, -3.428244537e-04f, -2.590211863e-04f, +2.676012728e-04f, +6.471842655e-04f, +2.316054131e-04f, -7.322066741e-04f, -1.066129499e-03f, +3.153675092e-05f, +1.668542953e-03f, +1.737711230e-03f, -8.398258175e-04f, -4.430928190e-03f, -5.756750934e-03f, -3.033339389e-03f, +2.005613969e-03f, +5.503407437e-03f, +5.022298439e-03f, +1.645850917e-03f, -1.388226278e-03f, -1.888756093e-03f, -4.099171202e-04f, +9.478457543e-04f, +9.048406397e-04f, -3.563531872e-05f, -6.344436463e-04f, -3.919678164e-04f, +1.701783911e-04f, +3.690380776e-04f, +1.232497358e-04f, -1.590972051e-04f, -1.748050353e-04f, -8.531327437e-06f, +9.758519584e-05f, +6.022406427e-05f, -1.933780265e-05f, -4.012873408e-05f, -1.020059379e-05f, +1.213829077e-05f, + -2.903919228e-04f, -8.378514670e-04f, -3.409347537e-04f, +1.917793873e-03f, +2.762387731e-03f, -1.460301286e-03f, -6.686431662e-03f, -3.071255113e-03f, +8.886139251e-03f, +1.208630252e-02f, -4.324657479e-03f, -2.120382323e-02f, -9.624144797e-03f, +2.213971930e-02f, +2.868368928e-02f, -8.303476242e-03f, -4.164173305e-02f, -1.838925970e-02f, +3.683119256e-02f, +4.565746653e-02f, -1.134345903e-02f, -5.725657376e-02f, -2.452193789e-02f, +4.405791320e-02f, +5.236398626e-02f, -1.135619437e-02f, -5.749759563e-02f, -2.386781692e-02f, +3.867389497e-02f, +4.406993765e-02f, -8.244731274e-03f, -4.218083714e-02f, -1.697802314e-02f, +2.446014943e-02f, +2.667070770e-02f, -4.077102323e-03f, -2.168450261e-02f, -8.481834825e-03f, +1.037252438e-02f, +1.077557820e-02f, -1.118880305e-03f, -6.917759363e-03f, -2.653449430e-03f, +2.378153310e-03f, +2.337234324e-03f, -1.472772168e-05f, -8.834287482e-04f, -3.665523935e-04f, + +1.298089736e-05f, +1.184973062e-05f, -4.714454596e-05f, -7.528183798e-05f, +4.386599617e-05f, +1.948220386e-04f, +7.368618329e-05f, -2.927800816e-04f, -3.504359284e-04f, +2.085812962e-04f, +6.935058886e-04f, +1.934564494e-04f, -8.487007769e-04f, -8.591182488e-04f, +5.352187495e-04f, +1.468921251e-03f, +3.146050762e-04f, -1.575728923e-03f, -1.398685977e-03f, +9.125145432e-04f, +2.147765234e-03f, +3.509225522e-04f, -2.071932351e-03f, -1.634302546e-03f, +1.113810654e-03f, +2.284767897e-03f, +2.727637206e-04f, -1.995800483e-03f, -1.400486931e-03f, +9.941451458e-04f, +1.782245864e-03f, +1.398502021e-04f, -1.400547921e-03f, -8.655969926e-04f, +6.373657158e-04f, +9.882984193e-04f, +3.778868120e-05f, -6.815530458e-04f, -3.610442174e-04f, +2.730223974e-04f, +3.543109979e-04f, -1.060981472e-06f, -1.998602095e-04f, -8.439917964e-05f, +6.293264893e-05f, +6.119931503e-05f, -2.765018826e-06f, -1.213829077e-05f, + /* 6,20 (48) */ + +2.774110254e-04f, +5.267649628e-04f, -9.472486139e-05f, -1.337801647e-03f, -1.320512797e-03f, +1.134643437e-03f, +3.616790862e-03f, +1.817203621e-03f, -4.173532748e-03f, -7.177519115e-03f, -6.129567250e-04f, +1.047914838e-02f, +1.126515414e-02f, -4.667631548e-03f, -2.132379272e-02f, -1.392726073e-02f, +1.803793170e-02f, +3.871714026e-02f, +1.110601084e-02f, -5.009565782e-02f, -7.201403750e-02f, +1.207845715e-02f, +1.843472333e-01f, +3.365738973e-01f, +3.567874214e-01f, +2.295074716e-01f, +4.996687989e-02f, -6.209384823e-02f, -6.267792687e-02f, -3.175092215e-03f, +3.696347053e-02f, +2.613749814e-02f, -7.356802921e-03f, -2.240746746e-02f, -9.819225309e-03f, +8.620493394e-03f, +1.220884494e-02f, +2.246918518e-03f, -6.490833009e-03f, -5.570715989e-03f, +5.322997163e-04f, +3.691281546e-03f, +1.929113513e-03f, -9.126535106e-04f, -1.538522367e-03f, -4.000804031e-04f, +4.742409770e-04f, +3.786906842e-04f, + -1.299015110e-05f, +2.104447899e-06f, +3.510112941e-05f, +3.160749143e-05f, -3.884182833e-05f, -9.972246519e-05f, -3.105281016e-05f, +1.404757048e-04f, +1.909596659e-04f, -3.817706870e-05f, -3.373738461e-04f, -2.698049460e-04f, +2.490853503e-04f, +6.454781322e-04f, +2.573180078e-04f, -7.046210202e-04f, -1.076784649e-03f, -2.040866966e-05f, +1.630064794e-03f, +1.776349229e-03f, -7.284964753e-04f, -4.336252698e-03f, -5.775822850e-03f, -3.171219637e-03f, +1.851269606e-03f, +5.450211354e-03f, +5.095422190e-03f, +1.763593947e-03f, -1.327192362e-03f, -1.912420313e-03f, -4.653170186e-04f, +9.247392699e-04f, +9.260704767e-04f, -5.732189004e-06f, -6.289968711e-04f, -4.086594606e-04f, +1.557188438e-04f, +3.709444324e-04f, +1.339401158e-04f, -1.537467684e-04f, -1.783236627e-04f, -1.388481807e-05f, +9.662710150e-05f, +6.276573041e-05f, -1.748281484e-05f, -4.053591994e-05f, -1.128162992e-05f, +1.190014518e-05f, + -2.774110254e-04f, -8.260017364e-04f, -3.880792997e-04f, +1.842512035e-03f, +2.806253727e-03f, -1.265479247e-03f, -6.612745479e-03f, -3.364035194e-03f, +8.535703323e-03f, +1.229488382e-02f, -3.631151590e-03f, -2.101036678e-02f, -1.047284557e-02f, +2.128060105e-02f, +2.921890803e-02f, -6.834554991e-03f, -4.132712798e-02f, -1.996498863e-02f, +3.543250658e-02f, +4.656998107e-02f, -9.195693798e-03f, -5.690565121e-02f, -2.659387024e-02f, +4.242361066e-02f, +5.347779691e-02f, -9.071426476e-03f, -5.722483191e-02f, -2.586361741e-02f, +3.727340804e-02f, +4.506408280e-02f, -6.462485410e-03f, -4.204098693e-02f, -1.837857106e-02f, +2.359455243e-02f, +2.730807342e-02f, -3.088803903e-03f, -2.164671393e-02f, -9.163387871e-03f, +1.001148016e-02f, +1.104860059e-02f, -7.645693074e-04f, -6.918820344e-03f, -2.853309640e-03f, +2.293754130e-03f, +2.400166972e-03f, +4.647159335e-05f, -8.861937670e-04f, -3.786906842e-04f, + +1.299015110e-05f, +1.289640005e-05f, -4.499945636e-05f, -7.636810055e-05f, +3.821462953e-05f, +1.928507229e-04f, +8.297188020e-05f, -2.825342586e-04f, -3.587265066e-04f, +1.863314983e-04f, +6.907170695e-04f, +2.242510113e-04f, -8.238894287e-04f, -8.846474702e-04f, +4.855061388e-04f, +1.469264846e-03f, +3.768072929e-04f, -1.536524015e-03f, -1.447391809e-03f, +8.371532126e-04f, +2.155972421e-03f, +4.382378834e-04f, -2.028211372e-03f, -1.699153931e-03f, +1.031364501e-03f, +2.301228055e-03f, +3.619414277e-04f, -1.960899026e-03f, -1.463141052e-03f, +9.282707680e-04f, +1.801323952e-03f, +2.062747762e-04f, -1.381353880e-03f, -9.092905707e-04f, +6.000023574e-04f, +1.002831839e-03f, +7.247466745e-05f, -6.752205347e-04f, -3.818911886e-04f, +2.593005639e-04f, +3.613892836e-04f, +1.024115626e-05f, -1.992364803e-04f, -9.020787174e-05f, +6.047955359e-05f, +6.300796565e-05f, -1.225099856e-06f, -1.190014518e-05f, + /* 6,21 (48) */ + +2.644208743e-04f, +5.288694107e-04f, -5.962373197e-05f, -1.306194156e-03f, -1.359354625e-03f, +1.034920972e-03f, +3.585738052e-03f, +1.957679326e-03f, -3.982573082e-03f, -7.215696183e-03f, -9.503305711e-04f, +1.020934344e-02f, +1.151423949e-02f, -4.022153416e-03f, -2.106647472e-02f, -1.463188175e-02f, +1.696114705e-02f, +3.869673159e-02f, +1.273607564e-02f, -4.831930859e-02f, -7.274253398e-02f, +7.742204448e-03f, +1.785714105e-01f, +3.334026777e-01f, +3.586386910e-01f, +2.349576830e-01f, +5.506230208e-02f, -6.033025428e-02f, -6.400511923e-02f, -5.087512528e-03f, +3.649815351e-02f, +2.706223741e-02f, -6.430732444e-03f, -2.241319965e-02f, -1.044822218e-02f, +8.211833933e-03f, +1.236456378e-02f, +2.617862950e-03f, -6.356892894e-03f, -5.724462757e-03f, +3.539760536e-04f, +3.677396728e-03f, +2.025740615e-03f, -8.498877802e-04f, -1.556005181e-03f, -4.406163231e-04f, +4.629593471e-04f, +3.905908294e-04f, + -1.297359113e-05f, +1.181865908e-06f, +3.428258992e-05f, +3.280593321e-05f, -3.610554137e-05f, -9.933198915e-05f, -3.551089913e-05f, +1.355410019e-04f, +1.935561938e-04f, -2.781635243e-05f, -3.315333797e-04f, -2.800825408e-04f, +2.304631328e-04f, +6.429237330e-04f, +2.823741443e-04f, -6.764352098e-04f, -1.085885881e-03f, -7.164636522e-05f, +1.590035406e-03f, +1.812143592e-03f, -6.184132929e-04f, -4.239333900e-03f, -5.790616145e-03f, -3.306529007e-03f, +1.695410871e-03f, +5.392823581e-03f, +5.165431691e-03f, +1.881669363e-03f, -1.263450662e-03f, -1.933953010e-03f, -5.208531702e-04f, +9.001044679e-04f, +9.463197984e-04f, +2.454609306e-05f, -6.226268793e-04f, -4.250011263e-04f, +1.408582796e-04f, +3.723618031e-04f, +1.445927038e-04f, -1.481008172e-04f, -1.816430483e-04f, -1.930752840e-05f, +9.550988961e-05f, +6.526287593e-05f, -1.556080047e-05f, -4.088736808e-05f, -1.237290880e-05f, +1.163122716e-05f, + -2.644208743e-04f, -8.131053364e-04f, -4.330787560e-04f, +1.766143934e-03f, +2.844468357e-03f, -1.072628524e-03f, -6.529773598e-03f, -3.646569453e-03f, +8.176976816e-03f, +1.248121532e-02f, -2.940434520e-03f, -2.078611577e-02f, -1.129673500e-02f, +2.039595358e-02f, +2.970441417e-02f, -5.365290145e-03f, -4.095032069e-02f, -2.150151264e-02f, +3.398511477e-02f, +4.740713429e-02f, -7.039721378e-03f, -5.646741332e-02f, -2.862208161e-02f, +4.072445673e-02f, +5.450916141e-02f, -6.770198421e-03f, -5.686289048e-02f, -2.782451643e-02f, +3.581026699e-02f, +4.599235357e-02f, -4.661161458e-03f, -4.183471216e-02f, -1.975992494e-02f, +2.268526186e-02f, +2.790807577e-02f, -2.085972064e-03f, -2.157423926e-02f, -9.838608406e-03f, +9.629588971e-03f, +1.130790116e-02f, -4.031800238e-04f, -6.908579188e-03f, -3.052546120e-03f, +2.203546258e-03f, +2.460646526e-03f, +1.094795590e-04f, -8.874188669e-04f, -3.905908294e-04f, + +1.297359113e-05f, +1.387918782e-05f, -4.283507783e-05f, -7.728990083e-05f, +3.262626545e-05f, +1.905926445e-04f, +9.194990665e-05f, -2.719909026e-04f, -3.663082355e-04f, +1.640783646e-04f, +6.868495175e-04f, +2.543486610e-04f, -7.980080470e-04f, -9.085441513e-04f, +4.354149662e-04f, +1.467281854e-03f, +4.380373535e-04f, -1.495101536e-03f, -1.493605346e-03f, +7.607451793e-04f, +2.160768010e-03f, +5.246885145e-04f, -1.981358900e-03f, -1.761304204e-03f, +9.472748852e-04f, +2.314086478e-03f, +4.507103864e-04f, -1.922817896e-03f, -1.523697855e-03f, +8.606542412e-04f, +1.817645040e-03f, +2.727609708e-04f, -1.359831878e-03f, -9.518672422e-04f, +5.613547283e-04f, +1.015891543e-03f, +1.074166071e-04f, -6.677134881e-04f, -4.023878455e-04f, +2.449492238e-04f, +3.679786417e-04f, +2.172951773e-05f, -1.982574397e-04f, -9.598916518e-05f, +5.785387577e-05f, +6.475105451e-05f, +3.718756133e-07f, -1.163122716e-05f, + /* 6,22 (48) */ + +2.514472832e-04f, +5.300512766e-04f, -2.534114206e-05f, -1.273388223e-03f, -1.395460166e-03f, +9.355889825e-04f, +3.550227153e-03f, +2.093220328e-03f, -3.789016888e-03f, -7.243512536e-03f, -1.281863951e-03f, +9.929260895e-03f, +1.174470262e-02f, -3.379229683e-03f, -2.078410057e-02f, -1.530831696e-02f, +1.587526117e-02f, +3.862508523e-02f, +1.432611104e-02f, -4.650716500e-02f, -7.336094727e-02f, +3.502870548e-03f, +1.727807943e-01f, +3.300961487e-01f, +3.603341019e-01f, +2.403505066e-01f, +6.022773377e-02f, -5.844858492e-02f, -6.526856989e-02f, -7.021465538e-03f, +3.597730034e-02f, +2.796234188e-02f, -5.484412646e-03f, -2.238865355e-02f, -1.107084906e-02f, +7.786832807e-03f, +1.250542206e-02f, +2.990224753e-03f, -6.212300190e-03f, -5.872563574e-03f, +1.723330052e-04f, +3.658089200e-03f, +2.121250504e-03f, -7.846249043e-04f, -1.571565982e-03f, -4.815036912e-04f, +4.505864383e-04f, +4.022220566e-04f, + -1.293196236e-05f, +2.831127739e-07f, +3.342900398e-05f, +3.392799952e-05f, -3.336966467e-05f, -9.880445341e-05f, -3.984357343e-05f, +1.304927459e-04f, +1.958446757e-04f, -1.756217103e-05f, -3.253162721e-04f, -2.898462597e-04f, +2.117612916e-04f, +6.395347426e-04f, +3.067481615e-04f, -6.476937013e-04f, -1.093440348e-03f, -1.221199429e-04f, +1.548525361e-03f, +1.845094954e-03f, -5.096686415e-04f, -4.140277667e-03f, -5.801141337e-03f, -3.439161406e-03f, +1.538164326e-03f, +5.331273993e-03f, +5.232241289e-03f, +1.999968260e-03f, -1.197032172e-03f, -1.953297415e-03f, -5.764561357e-04f, +8.739545383e-04f, +9.655496663e-04f, +5.516322276e-05f, -6.153311316e-04f, -4.409660155e-04f, +1.256122270e-04f, +3.732817758e-04f, +1.551919137e-04f, -1.421631704e-04f, -1.847553464e-04f, -2.479259607e-05f, +9.423247423e-05f, +6.771082165e-05f, -1.357345076e-05f, -4.118124412e-05f, -1.347274469e-05f, +1.133121540e-05f, + -2.514472832e-04f, -7.992261485e-04f, -4.759138339e-04f, +1.688854033e-03f, +2.877094622e-03f, -8.820358799e-04f, -6.437823692e-03f, -3.918560355e-03f, +7.810668581e-03f, +1.264529368e-02f, -2.253585003e-03f, -2.053176710e-02f, -1.209474305e-02f, +1.948740943e-02f, +3.013982913e-02f, -3.898008290e-03f, -4.051228333e-02f, -2.299661418e-02f, +3.249150943e-02f, +4.816787947e-02f, -4.878953368e-03f, -5.594272481e-02f, -3.060344051e-02f, +3.896315252e-02f, +5.545643630e-02f, -4.456111943e-03f, -5.641218009e-02f, -2.974733433e-02f, +3.428656913e-02f, +4.685300781e-02f, -2.843516418e-03f, -4.156195119e-02f, -2.111975682e-02f, +2.173339462e-02f, +2.846943050e-02f, -1.070080522e-03f, -2.146682265e-02f, -1.050632189e-02f, +9.227201126e-03f, +1.155285038e-02f, -3.520138210e-05f, -6.886849670e-03f, -3.250803560e-03f, +2.107557093e-03f, +2.518500402e-03f, +1.742306135e-04f, -8.870469913e-04f, -4.022220566e-04f, + +1.293196236e-05f, +1.479810028e-05f, -4.065622061e-05f, -7.804961113e-05f, +2.710958291e-05f, +1.880574393e-04f, +1.006102801e-04f, -2.611726881e-04f, -3.731787393e-04f, +1.418588860e-04f, +6.819225126e-04f, +2.837076758e-04f, -7.711091956e-04f, -9.307838329e-04f, +3.850290623e-04f, +1.462991477e-03f, +4.982027884e-04f, -1.451539319e-03f, -1.537263510e-03f, +6.834162386e-04f, +2.162153822e-03f, +6.101382732e-04f, -1.931453568e-03f, -1.820655579e-03f, +8.616755363e-04f, +2.323318986e-03f, +5.389280292e-04f, -1.881609933e-03f, -1.582053332e-03f, +7.913969501e-04f, +1.831169253e-03f, +3.392018486e-04f, -1.336001281e-03f, -9.932493695e-04f, +5.214749907e-04f, +1.027442075e-03f, +1.425595170e-04f, -6.590306087e-04f, -4.224952597e-04f, +2.299836744e-04f, +3.740600133e-04f, +3.338734227e-05f, -1.969179001e-04f, -1.017319127e-04f, +5.505634216e-05f, +6.642328452e-05f, +2.024337558e-06f, -1.133121540e-05f, + /* 6,23 (48) */ + +2.385153209e-04f, +5.303343893e-04f, +8.087861927e-06f, -1.239460223e-03f, -1.428829831e-03f, +8.367845291e-04f, +3.510383580e-03f, +2.223713074e-03f, -3.593172212e-03f, -7.261074707e-03f, -1.607180223e-03f, +9.639414635e-03f, +1.195646391e-02f, -2.739694940e-03f, -2.047735241e-02f, -1.595601066e-02f, +1.478182082e-02f, +3.850296528e-02f, +1.587463640e-02f, -4.466207004e-02f, -7.387061591e-02f, -6.374071197e-04f, +1.669796530e-01f, +3.266569873e-01f, +3.618722662e-01f, +2.456817806e-01f, +6.545997506e-02f, -5.644861666e-02f, -6.646560206e-02f, -8.974762953e-03f, +3.540084421e-02f, +2.883629642e-02f, -4.518862979e-03f, -2.233349033e-02f, -1.168618019e-02f, +7.345866792e-03f, +1.263103429e-02f, +3.363506529e-03f, -6.057108276e-03f, -6.014726745e-03f, -1.242234118e-05f, +3.633296604e-03f, +2.215482978e-03f, -7.169140826e-04f, -1.585139433e-03f, -5.226849353e-04f, +4.371136936e-04f, +4.135532720e-04f, + -1.286604092e-05f, -5.908061777e-07f, +3.254258310e-05f, +3.497349141e-05f, -3.063836572e-05f, -9.814304120e-05f, -4.404656456e-05f, +1.253399165e-04f, +1.978263266e-04f, -7.427417591e-06f, -3.187360982e-04f, -2.990891982e-04f, +1.930062863e-04f, +6.353258038e-04f, +3.304156074e-04f, -6.184411672e-04f, -1.099457111e-03f, -1.717746382e-04f, +1.505606117e-03f, +1.875207023e-03f, -4.023527308e-04f, -4.039191267e-03f, -5.807412922e-03f, -3.569013395e-03f, +1.379657921e-03f, +5.265596469e-03f, +5.295767933e-03f, +2.118380642e-03f, -1.127971061e-03f, -1.970398609e-03f, -6.320555428e-04f, +8.463047818e-04f, +9.837220297e-04f, +8.608201384e-05f, -6.071083201e-04f, -4.565275267e-04f, +1.099969455e-04f, +3.736965314e-04f, +1.657220273e-04f, -1.359381228e-04f, -1.876528999e-04f, -3.033295803e-05f, +9.279399612e-05f, +7.010488204e-05f, -1.152259533e-05f, -4.141577321e-05f, -1.457939881e-05f, +1.099984113e-05f, + -2.385153209e-04f, -7.844280482e-04f, -5.165700545e-04f, +1.610804422e-03f, +2.904204205e-03f, -6.939784406e-04f, -6.337213412e-03f, -4.179733044e-03f, +7.437489841e-03f, +1.278715257e-02f, -1.571662490e-03f, -2.024805943e-02f, -1.286585224e-02f, +1.855662560e-02f, +3.052485820e-02f, -2.435016814e-03f, -4.001408054e-02f, -2.444815350e-02f, +3.095424592e-02f, +4.885129570e-02f, -2.716799546e-03f, -5.533258654e-02f, -3.253489408e-02f, +3.714249694e-02f, +5.631811183e-02f, -2.132792957e-03f, -5.587325206e-02f, -3.162894426e-02f, +3.270451580e-02f, +4.764440476e-02f, -1.012347165e-03f, -4.122274934e-02f, -2.245575810e-02f, +2.074014525e-02f, +2.899090549e-02f, -4.263844613e-05f, -2.132426314e-02f, -1.116535250e-02f, +8.804705866e-03f, +1.178283406e-02f, +3.388586312e-04f, -6.853462328e-03f, -3.447721460e-03f, +2.005825180e-03f, +2.573556744e-03f, +2.406538980e-04f, -8.850226537e-04f, -4.135532720e-04f, + +1.286604092e-05f, +1.565328426e-05f, -3.846759729e-05f, -7.864986146e-05f, +2.167294376e-05f, +1.852550607e-04f, +1.089437530e-04f, -2.501024122e-04f, -3.793368971e-04f, +1.197095174e-04f, +6.759568904e-04f, +3.122880098e-04f, -7.432466222e-04f, -9.513450014e-04f, +3.344320979e-04f, +1.456416562e-03f, +5.572134148e-04f, -1.405918285e-03f, -1.578307649e-03f, +6.052932368e-04f, +2.160137196e-03f, +6.944528796e-04f, -1.878578852e-03f, -1.877114848e-03f, +7.747026606e-04f, +2.328907250e-03f, +6.264524348e-04f, -1.837333188e-03f, -1.638106717e-03f, +7.206033657e-04f, +1.841861095e-03f, +4.054899386e-04f, -1.309885380e-03f, -1.033360712e-03f, +4.804177901e-04f, +1.037450173e-03f, +1.778475050e-04f, -6.491725796e-04f, -4.421746762e-04f, +2.144204917e-04f, +3.796149388e-04f, +4.519728111e-05f, -1.952132355e-04f, -1.074248073e-04f, +5.208803166e-05f, +6.801936589e-05f, +3.730547622e-06f, -1.099984113e-05f, + /* 6,24 (48) */ + +2.256492799e-04f, +5.297435832e-04f, +4.063044502e-05f, -1.204486732e-03f, -1.459468197e-03f, +7.386414879e-04f, +3.466337015e-03f, +2.349052990e-03f, -3.395345886e-03f, -7.268502124e-03f, -1.925916321e-03f, +9.340325437e-03f, +1.214947020e-02f, -2.104369136e-03f, -2.014693680e-02f, -1.657445183e-02f, +1.368236371e-02f, +3.833119065e-02f, +1.738024252e-02f, -4.278686302e-02f, -7.427296864e-02f, -4.676598387e-03f, +1.611722401e-01f, +3.230879739e-01f, +3.632519241e-01f, +2.509473770e-01f, +7.075574299e-02f, -5.433023602e-02f, -6.759357313e-02f, -1.094516156e-02f, +3.476878867e-02f, +2.968260120e-02f, -3.535140950e-03f, -2.224740832e-02f, -1.229328851e-02f, +6.889339265e-03f, +1.274103123e-02f, +3.737203061e-03f, -5.891386249e-03f, -6.150664868e-03f, -2.000752410e-04f, +3.602963646e-03f, +2.308276975e-03f, -6.468092006e-04f, -1.596662028e-03f, -5.641007085e-04f, +4.225342948e-04f, +4.245531131e-04f, + -1.277663204e-05f, -1.438952877e-06f, +3.162554815e-05f, +3.594233741e-05f, -2.791572988e-05f, -9.735108524e-05f, -4.811586372e-05f, +1.200915124e-04f, +1.995027847e-04f, +2.575357107e-06f, -3.118067665e-04f, -3.078052584e-04f, +1.742243306e-04f, +6.303124963e-04f, +3.533532580e-04f, -5.887224336e-04f, -1.103947105e-03f, -2.205573646e-04f, +1.461349932e-03f, +1.902486547e-03f, -2.965535273e-04f, -3.936183247e-03f, -5.809449348e-03f, -3.695984295e-03f, +1.220020865e-03f, +5.195828866e-03f, +5.355931279e-03f, +2.236795531e-03f, -1.056304658e-03f, -1.985203607e-03f, -6.875801614e-04f, +8.171726146e-04f, +1.000799786e-03f, +1.172644383e-04f, -5.979583844e-04f, -4.716592936e-04f, +9.402941106e-05f, +3.735988633e-04f, +1.761672149e-04f, -1.294304454e-04f, -1.903282540e-04f, -3.592135816e-05f, +9.119382763e-05f, +7.244037263e-05f, -9.410201707e-06f, -4.158924427e-05f, -1.569108148e-05f, +1.063688973e-05f, + -2.256492799e-04f, -7.687747640e-04f, -5.550376518e-04f, +1.532154561e-03f, +2.925877149e-03f, -5.087233799e-04f, -6.228269659e-03f, -4.429835456e-03f, +7.058152944e-03f, +1.290686209e-02f, -8.957056000e-04f, -1.993577142e-02f, -1.360909887e-02f, +1.760528059e-02f, +3.085929029e-02f, -9.786002519e-04f, -3.945686713e-02f, -2.585407178e-02f, +2.937593827e-02f, +4.945658894e-02f, -5.566623497e-04f, -5.463813366e-02f, -3.441347293e-02f, +3.526538209e-02f, +5.709281450e-02f, +1.961142931e-04f, -5.524679963e-02f, -3.346627745e-02f, +3.106640908e-02f, +4.836500812e-02f, +8.295139303e-04f, -4.081725940e-02f, -2.376564348e-02f, +1.970678454e-02f, +2.947132328e-02f, +9.948117267e-04f, -2.114641563e-02f, -1.181452508e-02f, +8.362531190e-03f, +1.199725455e-02f, +7.184735700e-04f, -6.808265047e-03f, -3.642934695e-03f, +1.898400373e-03f, +2.625644776e-03f, +3.086732639e-04f, -8.812921061e-04f, -4.245531131e-04f, + +1.277663204e-05f, +1.644502299e-05f, -3.627381541e-05f, -7.909352851e-05f, +1.632438305e-05f, +1.821957554e-04f, +1.169418174e-04f, -2.388029525e-04f, -3.847828278e-04f, +9.766612121e-05f, +6.689749892e-04f, +3.400513450e-04f, -7.144751560e-04f, -9.702090995e-04f, +2.837074452e-04f, +1.447583542e-03f, +6.149814725e-04f, -1.358322287e-03f, -1.616683612e-03f, +5.265038580e-04f, +2.154730967e-03f, +7.775001628e-04f, -1.822822929e-03f, -1.930593536e-03f, +6.864947182e-04f, +2.330838826e-03f, +7.131425620e-04f, -1.790050839e-03f, -1.691760662e-03f, +6.483808839e-04f, +1.849689529e-03f, +4.715174124e-04f, -1.281511380e-03f, -1.072126567e-03f, +4.382401831e-04f, +1.045884839e-03f, +2.132238567e-04f, -6.381420856e-04f, -4.613875835e-04f, +1.982775184e-04f, +3.846256007e-04f, +5.714141947e-05f, -1.931394007e-04f, -1.130564007e-04f, +4.895038091e-05f, +6.953402739e-05f, +5.488598499e-06f, -1.063688973e-05f, + /* 6,25 (48) */ + +2.128726479e-04f, +5.283046303e-04f, +7.225599318e-05f, -1.168544394e-03f, -1.487383927e-03f, +6.412904027e-04f, +3.418221151e-03f, +2.469144503e-03f, -3.195843101e-03f, -7.265926767e-03f, -2.237723088e-03f, +9.032520179e-03f, +1.232369453e-02f, -1.474056640e-03f, -1.979358354e-02f, -1.716317426e-02f, +1.257841660e-02f, +3.811063328e-02f, +1.884159245e-02f, -4.088437647e-02f, -7.456952217e-02f, -8.612781634e-03f, +1.553627907e-01f, +3.193919896e-01f, +3.644719450e-01f, +2.561432059e-01f, +7.611167427e-02f, -5.209344049e-02f, -6.864987778e-02f, -1.293036517e-02f, +3.408120850e-02f, +3.049977381e-02f, -2.534341164e-03f, -2.213014388e-02f, -1.289124690e-02f, +6.417679971e-03f, +1.283506064e-02f, +4.110801924e-03f, -5.715219034e-03f, -6.280095313e-03f, -3.904034950e-04f, +3.567042288e-03f, +2.399470802e-03f, -5.743688280e-04f, -1.606072230e-03f, -6.056899527e-04f, +4.068432133e-04f, +4.351900028e-04f, + -1.266456791e-05f, -2.260456842e-06f, +3.068012551e-05f, +3.683459133e-05f, -2.520575530e-05f, -9.643206018e-05f, -5.204772384e-05f, +1.147565375e-04f, +2.008761034e-04f, +1.243395811e-05f, -3.045424952e-04f, -3.159891480e-04f, +1.554413590e-04f, +6.245113053e-04f, +3.755391344e-04f, -5.585824193e-04f, -1.106923101e-03f, -2.684167601e-04f, +1.415829765e-03f, +1.926943287e-03f, -1.923566759e-04f, -3.831363317e-03f, -5.807272982e-03f, -3.819976279e-03f, +1.059383497e-03f, +5.122012995e-03f, +5.412653779e-03f, +2.355101077e-03f, -9.820734400e-04f, -1.997661437e-03f, -7.429579806e-04f, +7.865775689e-04f, +1.016746838e-03f, +1.486716681e-04f, -5.878825260e-04f, -4.863352246e-04f, +7.772730152e-05f, +3.729821955e-04f, +1.865115568e-04f, -1.226453846e-04f, -1.927741706e-04f, -4.155035540e-05f, +8.943157738e-05f, +7.471261742e-05f, -7.238374544e-06f, -4.170001406e-05f, -1.680595422e-05f, +1.024220231e-05f, + -2.128726479e-04f, -7.523297410e-04f, -5.913114672e-04f, +1.453061032e-03f, +2.942201532e-03f, -3.265276245e-04f, -6.111327841e-03f, -4.668638408e-03f, +6.673370117e-03f, +1.300452821e-02f, -2.267306108e-04f, -1.959572007e-02f, -1.432357402e-02f, +1.663507149e-02f, +3.114299774e-02f, +4.689832901e-04f, -3.884188566e-02f, -2.721239407e-02f, +2.775925466e-02f, +4.998309280e-02f, +1.598068617e-03f, -5.386063349e-02f, -3.623629586e-02f, +3.333478856e-02f, +5.777930921e-02f, +2.526953119e-03f, -5.453365707e-02f, -3.525632829e-02f, +2.937464842e-02f, +4.901338901e-02f, +2.679203460e-03f, -4.034574199e-02f, -2.504715486e-02f, +1.863465797e-02f, +2.990956347e-02f, +2.040696565e-03f, -2.093319177e-02f, -1.245266717e-02f, +7.901143606e-03f, +1.219553207e-02f, +1.103099171e-03f, -6.751123627e-03f, -3.836074096e-03f, +1.785343972e-03f, +2.674595157e-03f, +3.782072913e-04f, -8.758035076e-04f, -4.351900028e-04f, + +1.266456791e-05f, +1.717373175e-05f, -3.407937034e-05f, -7.938372451e-05f, +1.107160032e-05f, +1.788900391e-04f, +1.245967078e-04f, -2.272972249e-04f, -3.895178720e-04f, +7.576391290e-05f, +6.610005937e-04f, +3.669611382e-04f, -6.848506056e-04f, -9.873605329e-04f, +2.329380412e-04f, +1.436522367e-03f, +6.714217553e-04f, -1.308837966e-03f, -1.652341818e-03f, +4.471764115e-04f, +2.145953423e-03f, +8.591502741e-04f, -1.764278523e-03f, -1.981008035e-03f, +5.971921956e-04f, +2.329107182e-03f, +7.988584839e-04f, -1.739831097e-03f, -1.742921408e-03f, +5.748396599e-04f, +1.854628048e-03f, +5.371762618e-04f, -1.250910379e-03f, -1.109473904e-03f, +3.950015605e-04f, +1.052717418e-03f, +2.486311244e-04f, -6.259438306e-04f, -4.800957835e-04f, +1.815738499e-04f, +3.890748647e-04f, +6.920130012e-05f, -1.906929491e-04f, -1.186151225e-04f, +4.564518926e-05f, +7.096202782e-05f, +7.296413674e-06f, -1.024220231e-05f, + /* 6,26 (48) */ + +2.002080800e-04f, +5.260441735e-04f, +1.029361187e-04f, -1.131709803e-03f, -1.512589682e-03f, +5.448583425e-04f, +3.366173427e-03f, +2.583901040e-03f, -2.994966997e-03f, -7.253492809e-03f, -2.542265583e-03f, +8.716531031e-03f, +1.247913589e-02f, -8.495453346e-04f, -1.941804441e-02f, -1.772175668e-02f, +1.147149350e-02f, +3.784221652e-02f, +2.025742222e-02f, -3.895743318e-02f, -7.476187885e-02f, -1.244414495e-02f, +1.495555178e-01f, +3.155720133e-01f, +3.655313285e-01f, +2.612652189e-01f, +8.152432805e-02f, -4.973833941e-02f, -6.963195122e-02f, -1.492802661e-02f, +3.333825052e-02f, +3.128635138e-02f, -1.517594326e-03f, -2.198147221e-02f, -1.347912942e-02f, +5.931344747e-03f, +1.291278795e-02f, +4.483784119e-03f, -5.528707477e-03f, -6.402740698e-03f, -5.831776656e-04f, +3.525491932e-03f, +2.488902380e-03f, -4.996562106e-04f, -1.613310604e-03f, -6.473899668e-04f, +3.900372591e-04f, +4.454322052e-04f, + -1.253070546e-05f, -3.054515381e-06f, +2.970854302e-05f, +3.765042989e-05f, -2.251234812e-05f, -9.538957497e-05f, -5.583866130e-05f, +1.093439878e-04f, +2.019487425e-04f, +2.213655910e-05f, -2.969577884e-04f, -3.236363777e-04f, +1.366829950e-04f, +6.179395883e-04f, +3.969525186e-04f, -5.280660766e-04f, -1.108399673e-03f, -3.153032321e-04f, +1.369119190e-03f, +1.948589975e-03f, -8.984542406e-05f, -3.724842225e-03f, -5.800910076e-03f, -3.940894468e-03f, +8.978771603e-04f, +5.044194584e-03f, +5.465860778e-03f, +2.473184673e-03f, -9.053210094e-04f, -2.007723215e-03f, -7.981162878e-04f, +7.545412919e-04f, +1.031528156e-03f, +1.802641175e-04f, -5.768832206e-04f, -5.005295418e-04f, +6.110897977e-05f, +3.718405999e-04f, +1.967390650e-04f, -1.155886614e-04f, -1.949836418e-04f, -4.721233222e-05f, +8.750709462e-05f, +7.691695648e-05f, -5.009354660e-06f, -4.174651130e-05f, -1.792213212e-05f, +9.815677156e-06f, + -2.002080800e-04f, -7.351560092e-04f, -6.253908375e-04f, +1.373677308e-03f, +2.953273132e-03f, -1.476375854e-04f, -5.986731133e-03f, -4.895935633e-03f, +6.283852244e-03f, +1.308029212e-02f, +4.342699829e-04f, -1.922875894e-02f, -1.500842463e-02f, +1.564771096e-02f, +3.137593578e-02f, +1.905505657e-03f, -3.817046390e-02f, -2.852123204e-02f, +2.610691284e-02f, +5.043026921e-02f, +3.744022040e-03f, -5.300148322e-02f, -3.800057438e-02f, +3.135378052e-02f, +5.837650141e-02f, +4.856060301e-03f, -5.373479858e-02f, -3.699615939e-02f, +2.763172701e-02f, +4.958822867e-02f, +4.533831508e-03f, -3.980856572e-02f, -2.629806524e-02f, +1.752518407e-02f, +3.030456503e-02f, +3.093413984e-03f, -2.068456065e-02f, -1.307861100e-02f, +7.421047823e-03f, +1.237710592e-02f, +1.492174035e-03f, -6.681922327e-03f, -4.026767045e-03f, +1.666728850e-03f, +2.720240346e-03f, +4.491693191e-04f, -8.685070939e-04f, -4.454322052e-04f, + +1.253070546e-05f, +1.783995335e-05f, -3.188863867e-05f, -7.952378569e-05f, +5.921951639e-06f, +1.753486718e-04f, +1.319014032e-04f, -2.156081422e-04f, -3.935445733e-04f, +5.403740792e-05f, +6.520588780e-04f, +3.929826645e-04f, -6.544296547e-04f, -1.002786671e-03f, +1.822062518e-04f, +1.423266428e-03f, +7.264517373e-04f, -1.257554585e-03f, -1.685237321e-03f, +3.674396180e-04f, +2.133828266e-03f, +9.392758951e-04f, -1.703042750e-03f, -2.028279749e-03f, +5.069373762e-04f, +2.323711714e-03f, +8.834616194e-04f, -1.686747109e-03f, -1.791498952e-03f, +5.000924368e-04f, +1.856654741e-03f, +6.023584774e-04f, -1.218117339e-03f, -1.145331498e-03f, +3.507635665e-04f, +1.057921668e-03f, +2.840112181e-04f, -6.125845522e-04f, -4.982614622e-04f, +1.643298167e-04f, +3.929463207e-04f, +8.135794825e-05f, -1.878710499e-04f, -1.240893005e-04f, +4.217462308e-05f, +7.229816771e-05f, +9.151747540e-06f, -9.815677156e-06f, + /* 6,27 (48) */ + +1.876773745e-04f, +5.229896581e-04f, +1.326446617e-04f, -1.094059373e-03f, -1.535102030e-03f, +4.494687675e-04f, +3.310334766e-03f, +2.693245028e-03f, -2.793018255e-03f, -7.231356250e-03f, -2.839223371e-03f, +8.392894653e-03f, +1.261581888e-02f, -2.316057463e-04f, -1.902109189e-02f, -1.824982276e-02f, +1.036309383e-02f, +3.752691329e-02f, +2.162654141e-02f, -3.700884321e-02f, -7.485172427e-02f, -1.616898718e-02f, +1.437546077e-01f, +3.116311188e-01f, +3.664292057e-01f, +2.663094135e-01f, +8.699018883e-02f, -4.726515474e-02f, -7.053727223e-02f, -1.693574982e-02f, +3.254013424e-02f, +3.204089267e-02f, -4.860661693e-04f, -2.180120809e-02f, -1.405601264e-02f, +5.430815205e-03f, +1.297389693e-02f, +4.855624719e-03f, -5.331968412e-03f, -6.518329359e-03f, -7.781613074e-04f, +3.478279600e-03f, +2.576409474e-03f, -4.227392541e-04f, -1.618319959e-03f, -6.891364781e-04f, +3.721151269e-04f, +4.552478823e-04f, + -1.237592426e-05f, -3.820393667e-06f, +2.871302625e-05f, +3.839015022e-05f, -1.983931782e-05f, -9.422736517e-05f, -5.948545712e-05f, +1.038628378e-04f, +2.027235592e-04f, +3.167171449e-05f, -2.890674119e-04f, -3.307432576e-04f, +1.179745186e-04f, +6.106155420e-04f, +4.175739665e-04f, -4.972183318e-04f, -1.108393160e-03f, -3.611689990e-04f, +1.321292299e-03f, +1.967442276e-03f, +1.089945062e-05f, -3.616731638e-03f, -5.790390724e-03f, -4.058647023e-03f, +7.356340633e-04f, +4.962423244e-03f, +5.515480599e-03f, +2.590933072e-03f, -8.260940707e-04f, -2.015342221e-03f, -8.529817484e-04f, +7.210875415e-04f, +1.045109832e-03f, +2.120014881e-04f, -5.649642299e-04f, -5.142168205e-04f, +4.419347652e-05f, +3.701688128e-04f, +2.068337056e-04f, -1.082664692e-04f, -1.969499038e-04f, -5.289950351e-05f, +8.542047327e-05f, +7.904875357e-05f, -2.725517788e-06f, -4.172724070e-05f, -1.903768623e-05f, +9.357271131e-06f, + -1.876773745e-04f, -7.173160559e-04f, -6.572794762e-04f, +1.294153522e-03f, +2.959195084e-03f, +2.771108642e-05f, -5.854829730e-03f, -5.111543775e-03f, +5.890307671e-03f, +1.313432953e-02f, +1.086328861e-03f, -1.883577627e-02f, -1.566285428e-02f, +1.464492429e-02f, +3.155814203e-02f, +3.328772085e-03f, -3.744401216e-02f, -2.977878662e-02f, +2.442167552e-02f, +5.079770883e-02f, +5.877850305e-03f, -5.206220732e-02f, -3.970361713e-02f, +2.932550077e-02f, +5.888343879e-02f, +7.179772015e-03f, -5.285133696e-02f, -3.868290649e-02f, +2.584022806e-02f, +5.008832111e-02f, +6.390486249e-03f, -3.920620725e-02f, -2.751618258e-02f, +1.637985257e-02f, +3.065532859e-02f, +4.151335652e-03f, -2.040054943e-02f, -1.369119555e-02f, +6.922786361e-03f, +1.254143573e-02f, +1.885120356e-03f, -6.600564379e-03f, -4.214638095e-03f, +1.542639549e-03f, +2.762414969e-03f, +5.214674869e-04f, -8.593553464e-04f, -4.552478823e-04f, + +1.237592426e-05f, +1.844435346e-05f, -2.970587195e-05f, -7.951726066e-05f, +8.824424543e-07f, +1.715826333e-04f, +1.388496268e-04f, -2.037585732e-04f, -3.968666565e-04f, +3.252037081e-05f, +6.421763456e-04f, +4.180830575e-04f, -6.232697581e-04f, -1.016477841e-03f, +1.315937390e-04f, +1.407852481e-03f, +7.799916939e-04f, -1.204563872e-03f, -1.715329861e-03f, +2.874223964e-04f, +2.118384554e-03f, +1.017752442e-03f, -1.639216953e-03f, -2.072335209e-03f, +4.158741060e-04f, +2.314657752e-03f, +9.668149639e-04f, -1.630876849e-03f, -1.837407206e-03f, +4.242543686e-04f, +1.855752352e-03f, +6.669562287e-04f, -1.183171051e-03f, -1.179630067e-03f, +3.055900125e-04f, +1.061473822e-03f, +3.193054982e-04f, -5.980730325e-04f, -5.158472603e-04f, +1.465669659e-04f, +3.962243230e-04f, +9.359189777e-05f, -1.846715044e-04f, -1.294671807e-04f, +3.854121934e-05f, +7.353730115e-05f, +1.105218590e-05f, -9.357271131e-06f, + /* 6,28 (48) */ + +1.753014503e-04f, +5.191692644e-04f, +1.613576880e-04f, -1.055669223e-03f, -1.554941348e-03f, +3.552414023e-04f, +3.250849309e-03f, +2.797107866e-03f, -2.590294696e-03f, -7.199684535e-03f, -3.128290783e-03f, +8.062151396e-03f, +1.273379340e-02f, +3.790097958e-04f, -1.860351792e-02f, -1.874704109e-02f, +9.254700667e-03f, +3.716574429e-02f, +2.294783371e-02f, -3.504140093e-02f, -7.484082482e-02f, -1.978571881e-02f, +1.379642170e-01f, +3.075724718e-01f, +3.671648397e-01f, +2.712718367e-01f, +9.250566943e-02f, -4.467422166e-02f, -7.136336630e-02f, -1.895109204e-02f, +3.168715249e-02f, +3.276198022e-02f, +5.590436624e-04f, -2.158920660e-02f, -1.462097687e-02f, +4.916598384e-03f, +1.301809040e-02f, +5.225793532e-03f, -5.125134706e-03f, -6.626595828e-03f, -9.751112112e-04f, +3.425380097e-03f, +2.661829947e-03f, -3.436905005e-04f, -1.621045477e-03f, -7.308637188e-04f, +3.530774407e-04f, +4.646051534e-04f, + -1.220112428e-05f, -4.557424696e-06f, +2.769579466e-05f, +3.905416716e-05f, -1.719037284e-05f, -9.294928507e-05f, -6.298515782e-05f, +9.832202803e-05f, +2.032037984e-04f, +4.102837087e-05f, -2.808863692e-04f, -3.373068931e-04f, +9.934083637e-05f, +6.025581680e-04f, +4.373853199e-04f, -4.660840266e-04f, -1.106921623e-03f, -4.059681292e-04f, +1.272423616e-03f, +1.983518747e-03f, +1.097997096e-04f, -3.507144024e-03f, -5.775748818e-03f, -4.173145228e-03f, +5.727871543e-04f, +4.876752428e-03f, +5.561444633e-03f, +2.708232495e-03f, -7.444424040e-04f, -2.020473974e-03f, -9.074804882e-04f, +6.862421796e-04f, +1.057459136e-03f, +2.438428143e-04f, -5.521306107e-04f, -5.273720285e-04f, +2.700047156e-05f, +3.679622505e-04f, +2.167794209e-04f, -1.006854710e-04f, -1.986664501e-04f, -5.860392582e-05f, +8.317205561e-05f, +8.110340390e-05f, -3.893731059e-07f, -4.164078698e-05f, -2.015064614e-05f, +8.867001001e-06f, + -1.753014503e-04f, -6.988717024e-04f, -6.869853482e-04f, +1.214636261e-03f, +2.960077526e-03f, +1.992937197e-04f, -5.715980103e-03f, -5.315302348e-03f, +5.493441015e-03f, +1.316684990e-02f, +1.728505206e-03f, -1.841769321e-02f, -1.628612404e-02f, +1.362844645e-02f, +3.168973577e-02f, +4.736624566e-03f, -3.666402047e-02f, -3.098335049e-02f, +2.270634566e-02f, +5.108513123e-02f, +7.996234859e-03f, -5.104445488e-02f, -4.134283408e-02f, +2.725316557e-02f, +5.929931289e-02f, +9.494429766e-03f, -5.188452200e-02f, -4.031378334e-02f, +2.400282086e-02f, +5.051257547e-02f, +8.246238601e-03f, -3.853925102e-02f, -2.869935363e-02f, +1.520022250e-02f, +3.096091860e-02f, +5.212809473e-03f, -2.008124393e-02f, -1.428926858e-02f, +6.406939100e-03f, +1.268800270e-02f, +2.281344679e-03f, -6.506972481e-03f, -4.399309599e-03f, +1.413172369e-03f, +2.800956188e-03f, +5.950047880e-04f, -8.483031605e-04f, -4.646051534e-04f, + +1.220112428e-05f, +1.898771574e-05f, -2.753519081e-05f, -7.936789852e-05f, -4.040278685e-06f, +1.676030986e-04f, +1.454358454e-04f, -1.917713026e-04f, -3.994890047e-04f, +1.124576621e-05f, +6.313807691e-04f, +4.422313454e-04f, -5.914290376e-04f, -1.028427323e-03f, +8.118132958e-05f, +1.390320562e-03f, +8.319648170e-04f, -1.149959854e-03f, -1.742583914e-03f, +2.072536508e-04f, +2.099656640e-03f, +1.094458265e-03f, -1.572906527e-03f, -2.113106202e-03f, +3.241475586e-04f, +2.301956556e-03f, +1.048783316e-03f, -1.572302999e-03f, -1.880564154e-03f, +3.474428399e-04f, +1.851908327e-03f, +7.308620442e-04f, -1.146114099e-03f, -1.212302398e-03f, +2.595467868e-04f, +1.063352654e-03f, +3.544548708e-04f, -5.824201054e-04f, -5.328163443e-04f, +1.283080387e-04f, +3.988940296e-04f, +1.058832189e-04f, -1.810927613e-04f, -1.347369482e-04f, +3.474788864e-05f, +7.467434777e-05f, +1.299514687e-05f, -8.867001001e-06f, + /* 6,29 (48) */ + +1.631003260e-04f, +5.146118397e-04f, +1.890534826e-04f, -1.016615056e-03f, -1.572131721e-03f, +2.622921173e-04f, +3.187864151e-03f, +2.895429894e-03f, -2.387090897e-03f, -7.158656165e-03f, -3.409177152e-03f, +7.724844502e-03f, +1.283313424e-02f, +9.815679637e-04f, -1.816613260e-02f, -1.921312512e-02f, +8.147779044e-03f, +3.675977616e-02f, +2.422025732e-02f, -3.305788219e-02f, -7.473102511e-02f, -2.329286284e-02f, +1.321884681e-01f, +3.033993266e-01f, +3.677376269e-01f, +2.761485891e-01f, +9.806711406e-02f, -4.196598917e-02f, -7.210780871e-02f, -2.097156602e-02f, +3.077967200e-02f, +3.344822240e-02f, +1.616502798e-03f, -2.134536379e-02f, -1.517310748e-02f, +4.389226356e-03f, +1.304509087e-02f, +5.593755782e-03f, -4.908355286e-03f, -6.727281299e-03f, -1.173777661e-03f, +3.366776171e-03f, +2.745002003e-03f, -2.625870966e-04f, -1.621434850e-03f, -7.725045058e-04f, +3.329267946e-04f, +4.734721544e-04f, + -1.200722377e-05f, -5.265009118e-06f, +2.665905792e-05f, +3.964301044e-05f, -1.456911640e-05f, -9.155929989e-05f, -6.633507579e-05f, +9.273045181e-05f, +2.033930824e-04f, +5.019587769e-05f, -2.724298771e-04f, -3.433251790e-04f, +8.080645084e-05f, +5.937872373e-04f, +4.563697166e-04f, -4.347078605e-04f, -1.104004805e-03f, -4.496565782e-04f, +1.222587999e-03f, +1.996840788e-03f, +2.067797193e-04f, -3.396192524e-03f, -5.757022002e-03f, -4.284303580e-03f, +4.094699856e-04f, +4.787239382e-03f, +5.603687422e-03f, +2.824968759e-03f, -6.604188335e-04f, -2.023076302e-03f, -9.615381760e-04f, +6.500331626e-04f, +1.068544575e-03f, +2.757465103e-04f, -5.383887230e-04f, -5.399705649e-04f, +9.550274047e-06f, +3.652170240e-04f, +2.265601524e-04f, -9.285279645e-05f, -2.001270451e-04f, -6.431750700e-05f, +8.076243575e-05f, +8.307634195e-05f, +1.996438486e-06f, -4.148581872e-05f, -2.125900262e-05f, +8.344944653e-06f, + -1.631003260e-04f, -6.798839867e-04f, -7.145205390e-04f, +1.135268363e-03f, +2.956037248e-03f, +3.668968183e-04f, -5.570544258e-03f, -5.507073651e-03f, +5.093952010e-03f, +1.317809567e-02f, +2.359885976e-03f, -1.797546187e-02f, -1.687755308e-02f, +1.260001913e-02f, +3.177091710e-02f, +6.126945128e-03f, -3.583205565e-02f, -3.213331035e-02f, +2.096376174e-02f, +5.129238488e-02f, +1.009589150e-02f, -4.994999662e-02f, -4.291574061e-02f, +2.514005936e-02f, +5.962346045e-02f, +1.179638632e-02f, -5.083573868e-02f, -4.188608634e-02f, +2.212225670e-02f, +5.086001831e-02f, +1.009814693e-02f, -3.780838897e-02f, -2.984546773e-02f, +1.398792011e-02f, +3.122046539e-02f, +6.276162127e-03f, -1.972678906e-02f, -1.487168869e-02f, +5.874122756e-03f, +1.281631074e-02f, +2.680238709e-03f, -6.401089262e-03f, -4.580402361e-03f, +1.278435420e-03f, +2.835704077e-03f, +6.696791358e-04f, -8.353080136e-04f, -4.734721544e-04f, + +1.200722377e-05f, +1.947093683e-05f, -2.538057954e-05f, -7.907963685e-05f, -8.839925616e-06f, +1.634214139e-04f, +1.516552664e-04f, -1.796689918e-04f, -4.014176345e-04f, -9.754288189e-06f, +6.197011272e-04f, +4.653984841e-04f, -5.589661769e-04f, -1.038631332e-03f, +3.104888631e-05f, +1.370713898e-03f, +8.822973255e-04f, -1.093838693e-03f, -1.766968726e-03f, +1.270620581e-04f, +2.077684101e-03f, +1.169274842e-03f, -1.504220745e-03f, -2.150529871e-03f, +2.319039960e-04f, +2.285625305e-03f, +1.129233506e-03f, -1.511112825e-03f, -1.920891995e-03f, +2.697772798e-04f, +1.845114860e-03f, +7.939689928e-04f, -1.106992809e-03f, -1.243283477e-03f, +2.127017604e-04f, +1.063539538e-03f, +3.893998840e-04f, -5.656386610e-04f, -5.491324766e-04f, +1.095769468e-04f, +4.009414406e-04f, +1.182115470e-04f, -1.771339313e-04f, -1.398867490e-04f, +3.079791745e-05f, +7.570430487e-05f, +1.497788212e-05f, -8.344944653e-06f, + /* 6,30 (48) */ + +1.510931022e-04f, +5.093468306e-04f, +2.157125405e-04f, -9.769720453e-04f, -1.586700837e-03f, +1.707328174e-04f, +3.121529075e-03f, +2.988160346e-03f, -2.183697815e-03f, -7.108460287e-03f, -3.681607029e-03f, +7.381519323e-03f, +1.291394069e-02f, +1.575355201e-03f, -1.770976289e-02f, -1.964783298e-02f, +7.043774239e-03f, +3.631011958e-02f, +2.544284532e-02f, -3.106104140e-02f, -7.452424539e-02f, -2.668905536e-02f, +1.264314461e-01f, +2.991150230e-01f, +3.681470969e-01f, +2.809358285e-01f, +1.036708015e-01f, -3.914102041e-02f, -7.276822754e-02f, -2.299464232e-02f, +2.981813382e-02f, +3.409825556e-02f, +2.685047373e-03f, -2.106961728e-02f, -1.571149621e-02f, +3.849255791e-03f, +1.305464115e-02f, +5.958972806e-03f, -4.681795133e-03f, -6.820134096e-03f, -1.373904706e-03f, +3.302458664e-03f, +2.825764439e-03f, -1.795107547e-04f, -1.619438411e-03f, -8.139903245e-04f, +3.116677919e-04f, +4.818170991e-04f, + -1.179515707e-05f, -5.942614945e-06f, +2.560501230e-05f, +4.015732169e-05f, -1.197904264e-05f, -9.006147782e-05f, -6.953278931e-05f, +8.709694318e-05f, +2.032954010e-04f, +5.916399725e-05f, -2.637133416e-04f, -3.487967929e-04f, +6.239543190e-05f, +5.843232553e-04f, +4.745115978e-04f, -4.031343334e-04f, -1.099664087e-03f, -4.921922220e-04f, +1.171860555e-03f, +2.007432595e-03f, +3.017665142e-04f, -3.283990837e-03f, -5.734251616e-03f, -4.392039864e-03f, +2.458165803e-04f, +4.693945103e-03f, +5.642146737e-03f, +2.941027388e-03f, -5.740791932e-04f, -2.023109414e-03f, -1.015080108e-03f, +6.124905293e-04f, +1.078335946e-03f, +3.076704192e-04f, -5.237462362e-04f, -5.519882992e-04f, -8.136198435e-06f, +3.619299538e-04f, +2.361598639e-04f, -8.477603732e-05f, -2.013257369e-04f, -7.003201622e-05f, +7.819246260e-05f, +8.496304936e-05f, +4.429146330e-06f, -4.126109227e-05f, -2.236071049e-05f, +7.791242229e-06f, + -1.510931022e-04f, -6.604130498e-04f, -7.399011185e-04f, +1.056188726e-03f, +2.947197322e-03f, +5.303182322e-04f, -5.418888992e-03f, -5.686742643e-03f, +4.692534375e-03f, +1.316834138e-02f, +2.979587103e-03f, -1.751006338e-02f, -1.743651926e-02f, +1.156138780e-02f, +3.180196599e-02f, +7.497659026e-03f, -3.494975833e-02f, -3.322714904e-02f, +1.919679302e-02f, +5.141944693e-02f, +1.217357560e-02f, -4.878072178e-02f, -4.441996135e-02f, +2.298952949e-02f, +5.985536445e-02f, +1.408201163e-02f, -4.970650518e-02f, -4.339719917e-02f, +2.020136471e-02f, +5.112979559e-02f, +1.194326179e-02f, -3.701441998e-02f, -3.095246054e-02f, +1.274463663e-02f, +3.143316715e-02f, +7.339701665e-03f, -1.933738918e-02f, -1.543732735e-02f, +5.324990279e-03f, +1.292588768e-02f, +3.081180149e-03f, -6.282877715e-03f, -4.757536292e-03f, +1.138548671e-03f, +2.866501994e-03f, +7.453834406e-04f, -8.203301315e-04f, -4.818170991e-04f, + +1.179515707e-05f, +1.989502124e-05f, -2.324588111e-05f, -7.865658953e-05f, -1.351057922e-05f, +1.590490714e-04f, +1.575038342e-04f, -1.674741398e-04f, -4.026596693e-04f, -3.044856647e-05f, +6.071675411e-04f, +4.875573858e-04f, -5.259403172e-04f, -1.047088999e-03f, -1.872481803e-05f, +1.349078811e-03f, +9.309185690e-04f, -1.036298510e-03f, -1.788458344e-03f, +4.697585680e-05f, +2.052511654e-03f, +1.242086964e-03f, -1.433272568e-03f, -2.184548817e-03f, +1.392905295e-04f, +2.265687070e-03f, +1.208034611e-03f, -1.447398043e-03f, -1.958317289e-03f, +1.913789724e-04f, +1.835368929e-03f, +8.561708638e-04f, -1.065857194e-03f, -1.272510612e-03f, +1.651246880e-04f, +1.062018502e-03f, +4.240808264e-04f, -5.477436456e-04f, -5.647600865e-04f, +9.039874540e-05f, +4.023534357e-04f, +1.305561128e-04f, -1.727947999e-04f, -1.449047117e-04f, +2.669496967e-05f, +7.662225966e-05f, +1.699747862e-05f, -7.791242229e-06f, + /* 6,31 (48) */ + +1.392979451e-04f, +5.034042156e-04f, +2.413175528e-04f, -9.368147236e-04f, -1.598679880e-03f, +8.067133956e-05f, +3.051996286e-03f, +3.075257289e-03f, -1.980402414e-03f, -7.049296290e-03f, -3.945320371e-03f, +7.032722530e-03f, +1.297633612e-02f, +2.159678456e-03f, -1.723525129e-02f, -2.005096731e-02f, +5.944110152e-03f, +3.581792736e-02f, +2.661470588e-02f, -2.905360880e-02f, -7.422247888e-02f, -2.997304620e-02f, +1.206971945e-01f, +2.947229831e-01f, +3.683929135e-01f, +2.856297736e-01f, +1.093129482e-01f, -3.619999302e-02f, -7.334230673e-02f, -2.501775173e-02f, +2.880305371e-02f, +3.471074609e-02f, +3.763383320e-03f, -2.076194686e-02f, -1.623524244e-02f, +3.297267492e-03f, +1.304650495e-02f, +6.320902760e-03f, -4.445635269e-03f, -6.904910133e-03f, -1.575230443e-03f, +3.232426648e-03f, +2.903956901e-03f, -9.454770530e-05f, -1.615009265e-03f, -8.552514168e-04f, +2.893070814e-04f, +4.896083413e-04f, + -1.156587247e-05f, -6.589777155e-06f, +2.453583715e-05f, +4.059785137e-05f, -9.423532883e-06f, -8.845998205e-05f, -7.257614213e-05f, +8.143026444e-05f, +2.029151000e-04f, +6.792291394e-05f, -2.547523335e-04f, -3.537211876e-04f, +4.413138857e-05f, +5.741874250e-04f, +4.917967149e-04f, -3.714076894e-04f, -1.093922442e-03f, -5.335348884e-04f, +1.120316544e-03f, +2.015321110e-03f, +3.946898559e-04f, -3.170653092e-03f, -5.707482646e-03f, -4.496275233e-03f, +8.196129835e-05f, +4.596934279e-03f, +5.676763658e-03f, +3.056293732e-03f, -4.854822889e-04f, -2.020535961e-03f, -1.068031294e-03f, +5.736463860e-04f, +1.086804390e-03f, +3.395718620e-04f, -5.082121336e-04f, -5.634016105e-04f, -2.603744181e-05f, +3.580985825e-04f, +2.455625648e-04f, -7.646324280e-05f, -2.022568705e-04f, -7.573909431e-05f, +7.546324261e-05f, +8.675906281e-05f, +6.905852224e-06f, -4.096545548e-05f, -2.345369145e-05f, +7.206097170e-06f, + -1.392979451e-04f, -6.405180286e-04f, -7.631469996e-04f, +9.775321364e-04f, +2.933686743e-03f, +6.893673036e-04f, -5.261385157e-03f, -5.854216783e-03f, +4.289874706e-03f, +1.313789281e-02f, +3.586754644e-03f, -1.702250600e-02f, -1.796245957e-02f, +1.051429880e-02f, +3.178324117e-02f, +8.846737837e-03f, -3.401883976e-02f, -3.426344755e-02f, +1.740833467e-02f, +5.146642279e-02f, +1.422608725e-02f, -4.753863481e-02f, -4.585323392e-02f, +2.080498068e-02f, +5.999465498e-02f, +1.634769870e-02f, -4.849847057e-02f, -4.484459721e-02f, +1.824304742e-02f, +5.132117457e-02f, +1.377863072e-02f, -3.615824912e-02f, -3.201831773e-02f, +1.147212602e-02f, +3.159829184e-02f, +8.401720167e-03f, -1.891330835e-02f, -1.598507100e-02f, +4.760230193e-03f, +1.301628643e-02f, +3.483533585e-03f, -6.152321602e-03f, -4.930331092e-03f, +9.936439597e-04f, +2.893196964e-03f, +8.220057003e-04f, -8.033326528e-04f, -4.896083413e-04f, + +1.156587247e-05f, +2.026107605e-05f, -2.113479253e-05f, -7.810303453e-05f, -1.804669126e-05f, +1.544976859e-04f, +1.629782250e-04f, -1.552090461e-04f, -4.032233109e-04f, -5.080677731e-05f, +5.938112090e-04f, +5.086829447e-04f, -4.924109527e-04f, -1.053802351e-03f, -6.806222398e-05f, +1.325464625e-03f, +9.777611267e-04f, -9.774392195e-04f, -1.807031638e-03f, -3.287736205e-05f, +2.024189074e-03f, +1.312782922e-03f, -1.360178459e-03f, -2.215111194e-03f, +4.645487730e-05f, +2.242170783e-03f, +1.285058184e-03f, -1.381254679e-03f, -1.992771091e-03f, +1.123708632e-04f, +1.822672317e-03f, +9.173623485e-04f, -1.022760899e-03f, -1.299923556e-03f, +1.168871057e-04f, +1.058776278e-03f, +4.584378263e-04f, -5.287520583e-04f, -5.796643399e-04f, +7.079960453e-05f, +4.031178103e-04f, +1.428957736e-04f, -1.680758405e-04f, -1.497789702e-04f, +2.244308745e-05f, +7.742340156e-05f, +1.905086070e-05f, -7.206097170e-06f, + /* 7, 0 (48) */ + +0.000000000e+00f, -5.184284022e-04f, +3.212229602e-06f, +1.307536639e-03f, +8.360763470e-04f, -2.118986788e-03f, -2.852738276e-03f, +2.109164081e-03f, +6.105712658e-03f, -1.950685165e-05f, -9.834821711e-03f, -5.434403018e-03f, +1.219436233e-02f, +1.497172437e-02f, -1.025017254e-02f, -2.819089092e-02f, +4.350570367e-05f, +4.333632545e-02f, +2.439525774e-02f, -5.757751269e-02f, -7.936955118e-02f, +6.777629950e-02f, +3.088165774e-01f, +4.285159846e-01f, +3.088165774e-01f, +6.777629950e-02f, -7.936955118e-02f, -5.757751269e-02f, +2.439525774e-02f, +4.333632545e-02f, +4.350570367e-05f, -2.819089092e-02f, -1.025017254e-02f, +1.497172437e-02f, +1.219436233e-02f, -5.434403018e-03f, -9.834821711e-03f, -1.950685165e-05f, +6.105712658e-03f, +2.109164081e-03f, -2.852738276e-03f, -2.118986788e-03f, +8.360763470e-04f, +1.307536639e-03f, +3.212229602e-06f, -5.184284022e-04f, -1.234425141e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.402830756e-06f, -3.645794608e-05f, -2.934893968e-05f, +6.301990736e-05f, +9.261259788e-05f, -6.715667929e-05f, -2.008609397e-04f, +5.663638279e-06f, +3.341017752e-04f, +1.706534758e-04f, -4.324003844e-04f, -4.953746677e-04f, +3.913250279e-04f, +9.603516939e-04f, -6.404349089e-05f, -1.491008734e-03f, -7.546410229e-04f, +1.908165098e-03f, +2.478253380e-03f, -1.675039053e-03f, -6.961821842e-03f, -6.839105062e-03f, -1.284161757e-04f, +6.711386426e-03f, +7.067661105e-03f, +1.857870170e-03f, -2.418878930e-03f, -1.982443748e-03f, +6.867150942e-04f, +1.510974108e-03f, +1.161613155e-04f, -9.540569351e-04f, -4.237344909e-04f, +4.796149263e-04f, +4.482795641e-04f, -1.549617571e-04f, -3.390588754e-04f, -1.711613663e-05f, +2.003082109e-04f, +7.377878167e-05f, -9.040208288e-05f, -6.603770382e-05f, +2.747022415e-05f, +3.750518317e-05f, -3.401044618e-06f, -1.367129889e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.184284022e-04f, -3.212229602e-06f, -1.888597505e-03f, -1.236145466e-03f, +3.592023527e-03f, +4.047052782e-03f, -4.982450802e-03f, -8.918259580e-03f, +4.834186303e-03f, +1.556156622e-02f, -1.810767405e-03f, -2.277524083e-02f, -4.954253986e-03f, +2.859390823e-02f, +1.529315124e-02f, -3.084300852e-02f, -2.774230592e-02f, +2.793154400e-02f, +3.977726494e-02f, -1.956380632e-02f, -4.852880250e-02f, +7.038976371e-03f, +5.173229864e-02f, +7.038976371e-03f, -4.852880250e-02f, -1.956380632e-02f, +3.977726494e-02f, +2.793154400e-02f, -2.774230592e-02f, -3.084300852e-02f, +1.529315124e-02f, +2.859390823e-02f, -4.954253986e-03f, -2.277524083e-02f, -1.810767405e-03f, +1.556156622e-02f, +4.834186303e-03f, -8.918259580e-03f, -4.982450802e-03f, +4.047052782e-03f, +3.592023527e-03f, -1.236145466e-03f, -1.888597505e-03f, +7.853369693e-05f, +5.184284022e-04f, +1.234425141e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.402830756e-06f, +3.645794608e-05f, +4.990674596e-05f, -1.015072581e-04f, -1.466967147e-04f, +1.503045336e-04f, +3.210858882e-04f, -1.523377155e-04f, -5.718326359e-04f, +5.538729978e-05f, +8.642556210e-04f, +1.831321024e-04f, -1.130066542e-03f, -5.730390367e-04f, +1.282908753e-03f, +1.075471433e-03f, -1.246505957e-03f, -1.603675632e-03f, +9.852715527e-04f, +2.043673952e-03f, -5.241715658e-04f, -2.289024217e-03f, -5.221704922e-05f, +2.276646540e-03f, +6.230870902e-04f, -2.009071323e-03f, -1.068995934e-03f, +1.553665861e-03f, +1.308989800e-03f, -1.019137686e-03f, -1.322769487e-03f, +5.192197337e-04f, +1.150169523e-03f, -1.383111949e-04f, -8.701498844e-04f, -8.814437108e-05f, +5.697403375e-04f, +1.732332348e-04f, -3.161963751e-04f, -1.617501818e-04f, +1.422584669e-04f, +1.067364938e-04f, -4.720273898e-05f, -4.992298047e-05f, +3.401044618e-06f, +1.367129889e-05f, +0.000000000e+00f, + /* 7, 1 (48) */ + +0.000000000e+00f, -5.140255714e-04f, -3.324571648e-05f, +1.278187699e-03f, +8.990962544e-04f, -2.026374191e-03f, -2.919894955e-03f, +1.908303142e-03f, +6.111376296e-03f, +3.145949235e-04f, -9.664168235e-03f, -5.866803403e-03f, +1.169898766e-02f, +1.536304940e-02f, -9.289820844e-03f, -2.825493441e-02f, -1.447503031e-03f, +4.258168443e-02f, +2.630342283e-02f, -5.509925932e-02f, -8.104459023e-02f, +6.081447766e-02f, +3.019774723e-01f, +4.283875684e-01f, +3.155279638e-01f, +7.484396060e-02f, -7.751168101e-02f, -5.999639162e-02f, +2.241281399e-02f, +4.402304055e-02f, +1.554479812e-03f, -2.807472961e-02f, -1.120422947e-02f, +1.454798988e-02f, +1.267397725e-02f, -4.986123454e-03f, -9.989783468e-03f, -3.585657271e-04f, +6.088596521e-03f, +2.309472292e-03f, -2.778959494e-03f, -2.209388871e-03f, +7.700386432e-04f, +1.335006863e-03f, +4.071741277e-05f, -5.218294468e-04f, -1.371138130e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.363231868e-06f, -3.536116739e-05f, -3.112411600e-05f, +5.994166238e-05f, +9.460233729e-05f, -6.052409654e-05f, -2.010276988e-04f, -5.622708085e-06f, +3.286002227e-04f, +1.858136918e-04f, -4.159446280e-04f, -5.100302025e-04f, +3.586215482e-04f, +9.648401929e-04f, -1.247875202e-05f, -1.468661393e-03f, -8.202888207e-04f, +1.831730441e-03f, +2.532396482e-03f, -1.493629345e-03f, -6.850181348e-03f, -6.959632173e-03f, -3.851071098e-04f, +6.576588681e-03f, +7.167524184e-03f, +2.041903873e-03f, -2.354278168e-03f, -2.054408452e-03f, +6.165977888e-04f, +1.528490732e-03f, +1.687455178e-04f, -9.459444776e-04f, -4.557867798e-04f, +4.627657440e-04f, +4.635448853e-04f, -1.387605929e-04f, -3.434541995e-04f, -2.871543078e-05f, +1.993642683e-04f, +8.037719661e-05f, -8.797104486e-05f, -6.898759360e-05f, +2.548962186e-05f, +3.849926784e-05f, -2.359131188e-06f, -1.395240629e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.140255714e-04f, +3.324571648e-05f, -1.838690760e-03f, -1.337652724e-03f, +3.445326813e-03f, +4.197357316e-03f, -4.661364913e-03f, -9.070597296e-03f, +4.262353667e-03f, +1.561695352e-02f, -9.465117840e-04f, -2.259210873e-02f, -6.084320528e-03f, +2.802086920e-02f, +1.657605999e-02f, -2.976753709e-02f, -2.898881188e-02f, +2.632786837e-02f, +4.076253650e-02f, -1.752013237e-02f, -4.905297407e-02f, +4.749952153e-03f, +5.168008159e-02f, +9.315622911e-03f, -4.790571541e-02f, -2.157287765e-02f, +3.870826901e-02f, +2.948520986e-02f, -2.643331612e-02f, -3.186214621e-02f, +1.397038175e-02f, +2.911312797e-02f, -3.804084463e-03f, -2.291355203e-02f, -2.680917289e-03f, +1.547342185e-02f, +5.403926640e-03f, -8.745026346e-03f, -5.298647177e-03f, +3.885302601e-03f, +3.734281994e-03f, -1.129408972e-03f, -1.935800244e-03f, +2.861071646e-05f, +5.218294468e-04f, +1.371138130e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.363231868e-06f, +3.536116739e-05f, +5.242115229e-05f, -9.617976463e-05f, -1.507233495e-04f, +1.387530092e-04f, +3.252146092e-04f, -1.314375733e-04f, -5.727039945e-04f, +2.291445353e-05f, +8.566381906e-04f, +2.271364703e-04f, -1.107813740e-03f, -6.252668419e-04f, +1.240686479e-03f, +1.129274547e-03f, -1.181780527e-03f, -1.650202515e-03f, +8.998052987e-04f, +2.074017417e-03f, -4.243447843e-04f, -2.296715000e-03f, -1.565431243e-04f, +2.259603869e-03f, +7.208850167e-04f, -1.970271063e-03f, -1.150799020e-03f, +1.500263071e-03f, +1.369090876e-03f, -9.603762505e-04f, -1.360169373e-03f, +4.639097211e-04f, +1.168061624e-03f, -9.276064125e-05f, -8.742896207e-04f, -1.211189995e-04f, +5.664150925e-04f, +1.940785686e-04f, -3.105441002e-04f, -1.730623710e-04f, +1.374100914e-04f, +1.118528453e-04f, -4.431058451e-05f, -5.177662578e-05f, +2.359131188e-06f, +1.395240629e-05f, +0.000000000e+00f, + /* 7, 2 (48) */ + +0.000000000e+00f, -5.086623395e-04f, -6.860688387e-05f, +1.247063583e-03f, +9.590379168e-04f, -1.931771853e-03f, -2.980419051e-03f, +1.707275443e-03f, +6.105753588e-03f, +6.431951462e-04f, -9.478354543e-03f, -6.282748031e-03f, +1.118895746e-02f, +1.572167095e-02f, -8.324980651e-03f, -2.826741316e-02f, -2.916164424e-03f, +4.176139561e-02f, +2.813515328e-02f, -5.256686283e-02f, -8.253821958e-02f, +5.396429631e-02f, +2.950178402e-01f, +4.280024613e-01f, +3.221045525e-01f, +8.201148479e-02f, -7.546977714e-02f, -6.235066979e-02f, +2.035840554e-02f, +4.463963834e-02f, +3.082970544e-03f, -2.790598409e-02f, -1.215017395e-02f, +1.409220310e-02f, +1.313674300e-02f, -4.522578569e-03f, -1.012854406e-02f, -7.020199266e-04f, +6.059881091e-03f, +2.508836561e-03f, -2.698582297e-03f, -2.297359916e-03f, +7.010510496e-04f, +1.360496485e-03f, +7.921668061e-05f, -5.241885780e-04f, -1.510662193e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.281120501e-06f, -3.421848615e-05f, -3.279435594e-05f, +5.681040703e-05f, +9.637149550e-05f, -5.389403999e-05f, -2.008143956e-04f, -1.672415031e-05f, +3.225723242e-04f, +2.004216370e-04f, -3.989501581e-04f, -5.235689730e-04f, +3.256869626e-04f, +9.675369667e-04f, +3.844823356e-05f, -1.444002155e-03f, -8.835766843e-04f, +1.753299022e-03f, +2.581310828e-03f, -1.313855934e-03f, -6.732920928e-03f, -7.072864687e-03f, -6.413739816e-04f, +6.434833450e-03f, +7.261242746e-03f, +2.226917682e-03f, -2.284463820e-03f, -2.123902846e-03f, +5.443807266e-04f, +1.543495271e-03f, +2.217074795e-04f, -9.360060371e-04f, -4.874186029e-04f, +4.448440945e-04f, +4.781597261e-04f, -1.220733051e-04f, -3.472712501e-04f, -4.044158950e-05f, +1.980245521e-04f, +8.693853995e-05f, -8.532019059e-05f, -7.186211401e-05f, +2.340904202e-05f, +3.943662641e-05f, -1.278478377e-06f, -1.420592772e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.086623395e-04f, +6.860688387e-05f, -1.786269607e-03f, -1.433832489e-03f, +3.294603463e-03f, +4.336110325e-03f, -4.336150304e-03f, -9.202034869e-03f, +3.689649672e-03f, +1.563986797e-02f, -8.987359339e-05f, -2.236497226e-02f, -7.192134268e-03f, +2.739560235e-02f, +1.781674647e-02f, -2.863826254e-02f, -3.017059240e-02f, +2.467766585e-02f, +4.166234180e-02f, -1.544611496e-02f, -4.947731885e-02f, +2.453237153e-03f, +5.152353847e-02f, +1.157522678e-02f, -4.718483039e-02f, -2.354314871e-02f, +3.755746999e-02f, +3.098547293e-02f, -2.506422524e-02f, -3.282252246e-02f, +1.261021237e-02f, +2.957703769e-02f, -2.636022839e-03f, -2.300631267e-02f, -3.555206910e-03f, +1.535230285e-02f, +5.970341733e-03f, -8.550947777e-03f, -5.609191277e-03f, +3.712240230e-03f, +3.871692085e-03f, -1.017556127e-03f, -1.980110829e-03f, -2.316590932e-05f, +5.241885780e-04f, +1.510662193e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.281120501e-06f, +3.421848615e-05f, +5.474500924e-05f, -9.076854688e-05f, -1.543378622e-04f, +1.271229364e-04f, +3.285861621e-04f, -1.105777184e-04f, -5.723689113e-04f, -9.208901701e-06f, +8.473323064e-04f, +2.702399750e-04f, -1.083476215e-03f, -6.758064862e-04f, +1.196206297e-03f, +1.180449996e-03f, -1.114958710e-03f, -1.693164308e-03f, +8.127796729e-04f, +2.100049250e-03f, -3.238146663e-04f, -2.299706817e-03f, -2.605453583e-04f, +2.237927891e-03f, +8.173610248e-04f, -1.927343658e-03f, -1.230504856e-03f, +1.443564632e-03f, +1.426672350e-03f, -8.992957936e-04f, -1.395013665e-03f, +4.072137252e-04f, +1.183685991e-03f, -4.656973925e-05f, -8.766469271e-04f, -1.542432463e-04f, +5.618474442e-04f, +2.148275953e-04f, -3.041287796e-04f, -1.842133237e-04f, +1.321540652e-04f, +1.168416268e-04f, -4.123224846e-05f, -5.356478109e-05f, +1.278478377e-06f, +1.420592772e-05f, +0.000000000e+00f, + /* 7, 3 (48) */ + +0.000000000e+00f, -5.023812190e-04f, -1.028253700e-04f, +1.214269227e-03f, +1.015848324e-03f, -1.835400358e-03f, -3.034313091e-03f, +1.506461047e-03f, +6.089029438e-03f, +9.657674704e-04f, -9.277932906e-03f, -6.681698189e-03f, +1.066538848e-02f, +1.604735791e-02f, -7.357443684e-03f, -2.822896493e-02f, -4.360166579e-03f, +4.087781893e-02f, +2.988845230e-02f, -4.998555200e-02f, -8.385207551e-02f, +4.723137538e-02f, +2.879449755e-01f, +4.273610873e-01f, +3.285393859e-01f, +8.927272753e-02f, -7.324285945e-02f, -6.463513361e-02f, +1.823450269e-02f, +4.518401906e-02f, +4.626465814e-03f, -2.768427661e-02f, -1.308617999e-02f, +1.360478450e-02f, +1.358158709e-02f, -4.044418843e-03f, -1.025061737e-02f, -1.049291177e-03f, +6.019439501e-03f, +2.706861113e-03f, -2.611643757e-03f, -2.382680107e-03f, +6.291889356e-04f, +1.383905527e-03f, +1.186533070e-04f, -5.254670563e-04f, -1.652721470e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.155499268e-06f, -3.303356079e-05f, -3.435851553e-05f, +5.363354428e-05f, +9.792070572e-05f, -4.727929308e-05f, -2.002275795e-04f, -2.762256769e-05f, +3.160369234e-04f, +2.144578550e-04f, -3.814553423e-04f, -5.359806252e-04f, +2.925838239e-04f, +9.684595838e-04f, +8.865496331e-05f, -1.417104224e-03f, -9.444278384e-04f, +1.673031134e-03f, +2.625006558e-03f, -1.135929496e-03f, -6.610227950e-03f, -7.178708984e-03f, -8.969347129e-04f, +6.286251430e-03f, +7.348655345e-03f, +2.412685758e-03f, -2.209456350e-03f, -2.190772398e-03f, +4.701602984e-04f, +1.555927983e-03f, +2.749568061e-04f, -9.242365355e-04f, -5.185666495e-04f, +4.258691551e-04f, +4.920882012e-04f, -1.049244523e-04f, -3.504943998e-04f, -5.227413708e-05f, +1.962852063e-04f, +9.344927460e-05f, -8.245068760e-05f, -7.465381357e-05f, +2.123065152e-05f, +4.031373136e-05f, -1.606038524e-07f, -1.443029105e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.023812190e-04f, +1.028253700e-04f, -1.731524598e-03f, -1.524601036e-03f, +3.140265601e-03f, +4.463233262e-03f, -4.007564142e-03f, -9.312612588e-03f, +3.117280761e-03f, +1.563065907e-02f, +7.574587130e-04f, -2.209473228e-02f, -8.275610483e-03f, +2.671979587e-02f, +1.901295276e-02f, -2.745781254e-02f, -3.128555111e-02f, +2.298450154e-02f, +4.247512147e-02f, -1.334606571e-02f, -4.980113352e-02f, +1.535303363e-04f, +5.126299311e-02f, +1.381315467e-02f, -4.636746937e-02f, -2.547049237e-02f, +3.632696513e-02f, +3.242903756e-02f, -2.363755289e-02f, -3.372181825e-02f, +1.121519871e-02f, +2.998425141e-02f, -1.452336848e-03f, -2.305288241e-02f, -4.431853837e-03f, +1.519805960e-02f, +6.532189177e-03f, -8.336120182e-03f, -5.913320056e-03f, +3.528026906e-03f, +4.003846151e-03f, -9.007144999e-04f, -2.021343077e-03f, -7.673069041e-05f, +5.254670563e-04f, +1.652721470e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.155499268e-06f, +3.303356079e-05f, +5.687786299e-05f, -8.528801151e-05f, -1.575407020e-04f, +1.154413295e-04f, +3.312057915e-04f, -8.980231717e-05f, -5.708443107e-04f, -4.091902851e-05f, +8.363759240e-04f, +3.123610207e-04f, -1.057122928e-03f, -7.245656074e-04f, +1.149575910e-03f, +1.228906834e-03f, -1.046189401e-03f, -1.732486615e-03f, +7.243798566e-04f, +2.121726136e-03f, -2.227902696e-04f, -2.297997438e-03f, -3.640086191e-04f, +2.211660024e-03f, +9.123132502e-04f, -1.880368423e-03f, -1.307941340e-03f, +1.383675242e-03f, +1.481602044e-03f, -8.360105083e-04f, -1.427212413e-03f, +3.492402140e-04f, +1.196990134e-03f, +1.699807130e-07f, -8.771974561e-04f, -1.874480376e-04f, +5.560305404e-04f, +2.354337306e-04f, -2.969518419e-04f, -1.951751290e-04f, +1.264938699e-04f, +1.216881284e-04f, -3.797021669e-05f, -5.528070823e-05f, +1.606038524e-07f, +1.443029105e-05f, +0.000000000e+00f, + /* 7, 4 (48) */ + +0.000000000e+00f, -4.952257198e-04f, -1.358589308e-04f, +1.179910712e-03f, +1.069481868e-03f, -1.737479652e-03f, -3.081592384e-03f, +1.306233468e-03f, +6.061406870e-03f, +1.281804394e-03f, -9.063475051e-03f, -7.063153531e-03f, +1.012940786e-02f, +1.633994173e-02f, -6.388984100e-03f, -2.814030997e-02f, -5.777270803e-03f, +3.993339109e-02f, +3.156148343e-02f, -4.736054545e-02f, -8.498800501e-02f, +4.062114743e-02f, +2.807662665e-01f, +4.264641526e-01f, +3.348256374e-01f, +9.662138288e-02f, -7.083017370e-02f, -6.684458996e-02f, +1.604373029e-02f, +4.565417936e-02f, +6.182393798e-03f, -2.740931980e-02f, -1.401041652e-02f, +1.308621785e-02f, +1.400745625e-02f, -3.552330642e-03f, -1.035554182e-02f, -1.399785577e-03f, +5.967165364e-03f, +2.903146319e-03f, -2.518194483e-03f, -2.465130794e-03f, +5.545351220e-04f, +1.405136178e-03f, +1.589670384e-04f, -5.256276602e-04f, -1.797024380e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.985500330e-06f, -3.181006045e-05f, -3.581570155e-05f, +5.041842712e-05f, +9.925103113e-05f, -4.069239427e-05f, -1.992744192e-04f, -3.830049673e-05f, +3.090135547e-04f, +2.279042196e-04f, -3.634989747e-04f, -5.472570011e-04f, +2.593742174e-04f, +9.676285787e-04f, +1.380612193e-04f, -1.388043770e-03f, -1.002770603e-03f, +1.591087852e-03f, +2.663501277e-03f, -9.600562222e-04f, -6.482295563e-03f, -7.277080996e-03f, -1.151508169e-03f, +6.130982232e-03f, +7.429607677e-03f, +2.598979196e-03f, -2.129284004e-03f, -2.254864673e-03f, +3.940375622e-04f, +1.565732871e-03f, +3.284014664e-04f, -9.106341493e-04f, -5.491677055e-04f, +4.058622990e-04f, +5.052952394e-04f, -8.733979986e-05f, -3.531089337e-04f, -6.419208530e-05f, +1.941430972e-04f, +9.989573536e-05f, -7.936416972e-05f, -7.735526809e-05f, +1.895687537e-05f, +4.112711044e-05f, +9.928457007e-07f, -1.462395980e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.952257198e-04f, +1.358589308e-04f, -1.674646735e-03f, -1.609889047e-03f, +2.982724899e-03f, +4.578674591e-03f, -3.676358351e-03f, -9.402414905e-03f, +2.546436450e-03f, +1.558974004e-02f, +1.593834637e-03f, -2.178237126e-02f, -9.332733411e-03f, +2.599523026e-02f, +2.016252867e-02f, -2.622890571e-02f, -3.233174051e-02f, +2.125201493e-02f, +4.319950132e-02f, -1.122433957e-02f, -5.002392379e-02f, -2.144467102e-03f, +5.089898449e-02f, +1.602481470e-02f, -4.545515612e-02f, -2.735086079e-02f, +3.501902379e-02f, +3.381271281e-02f, -2.215595085e-02f, -3.455782876e-02f, +9.787986297e-03f, +3.033349163e-02f, -2.553467138e-04f, -2.305271243e-02f, -5.309051293e-03f, +1.501061156e-02f, +7.088219717e-03f, -8.100686451e-03f, -6.210271898e-03f, +3.332851777e-03f, +4.130340021e-03f, -7.790263715e-04f, -2.059313294e-03f, -1.320113986e-04f, +5.256276602e-04f, +1.797024380e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.985500330e-06f, +3.181006045e-05f, +5.881974410e-05f, -7.975240632e-05f, -1.603332576e-04f, +1.037348326e-04f, +3.330803253e-04f, -6.915470437e-05f, -5.681494757e-04f, -7.215383980e-05f, +8.238101248e-04f, +3.534208899e-04f, -1.028826526e-03f, -7.714563107e-04f, +1.100906835e-03f, +1.274560359e-03f, -9.756248546e-04f, -1.768102977e-03f, +6.347933102e-04f, +2.139013986e-03f, -1.214813444e-04f, -2.291594477e-03f, -4.667189164e-04f, +2.180851332e-03f, +1.005542717e-03f, -1.829433348e-03f, -1.382940602e-03f, +1.320706728e-03f, +1.533752739e-03f, -7.706398975e-04f, -1.456680690e-03f, +2.901011902e-04f, +1.207926078e-03f, +4.736493450e-05f, -8.759205059e-04f, -2.206633037e-04f, +5.489601822e-04f, +2.558500265e-04f, -2.890164525e-04f, -2.059198058e-04f, +1.204340034e-04f, +1.263776520e-04f, -3.452750106e-05f, -5.691766838e-05f, -9.928457007e-07f, +1.462395980e-05f, +0.000000000e+00f, + /* 7, 5 (48) */ + +0.000000000e+00f, -4.872402194e-04f, -1.676689913e-04f, +1.144095010e-03f, +1.119900295e-03f, -1.638228621e-03f, -3.122284779e-03f, +1.106959049e-03f, +6.023106374e-03f, +1.590817949e-03f, -8.835570832e-03f, -7.426652506e-03f, +9.582150857e-03f, +1.659931595e-02f, -5.421355521e-03f, -2.800224875e-02f, -7.165314573e-03f, +3.893062048e-02f, +3.315257128e-02f, -4.469704417e-02f, -8.594806123e-02f, +3.413885187e-02f, +2.734891855e-01f, +4.253126445e-01f, +3.409566196e-01f, +1.040509906e-01f, -6.823119450e-02f, -6.897387397e-02f, +1.378886562e-02f, +4.604821692e-02f, +7.748126668e-03f, -2.708091834e-02f, -1.492105067e-02f, +1.253705014e-02f, +1.441331855e-02f, -3.047035402e-03f, -1.044288162e-02f, -1.752894510e-03f, +5.902973279e-03f, +3.097289416e-03f, -2.418298747e-03f, -2.544494964e-03f, +4.771798539e-04f, +1.424093054e-03f, +2.000941488e-04f, -5.246348145e-04f, -1.943263978e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.770384584e-06f, -3.055165641e-05f, -3.716526842e-05f, +4.717234406e-05f, +1.003639553e-04f, -3.414561603e-05f, -1.979626789e-04f, -4.874115534e-05f, +3.015223972e-04f, +2.407439523e-04f, -3.451201979e-04f, -5.573921262e-04f, +2.261196541e-04f, +9.650673803e-04f, +1.865891824e-04f, -1.356899769e-03f, -1.058538454e-03f, +1.507630778e-03f, +2.696819961e-03f, -7.864375643e-04f, -6.349322397e-03f, -7.367906298e-03f, -1.404814536e-03f, +5.969174217e-03f, +7.503952826e-03f, +2.785566329e-03f, -2.043982842e-03f, -2.316029593e-03f, +3.161181312e-04f, +1.572857817e-03f, +3.819479360e-04f, -8.952003513e-04f, -5.791587704e-04f, +3.848470823e-04f, +5.177466597e-04f, -6.934628683e-05f, -3.551010896e-04f, -7.617396702e-05f, +1.915958308e-04f, +1.062641544e-04f, -7.606274189e-05f, -7.995909681e-05f, +1.659039649e-05f, +4.187335580e-05f, +2.180095653e-06f, -1.478543797e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.872402194e-04f, +1.676689913e-04f, -1.615826991e-03f, -1.689641453e-03f, +2.822391641e-03f, +4.682409424e-03f, -3.343278025e-03f, -9.471569609e-03f, +1.978286975e-03f, +1.551758620e-02f, +2.417644762e-03f, -2.142895037e-02f, -1.036155994e-02f, +2.522377395e-02f, +2.126343551e-02f, -2.495434535e-02f, -3.330736537e-02f, +1.948391195e-02f, +4.383429464e-02f, -9.085325584e-03f, -5.014540513e-02f, -4.436061579e-03f, +5.043226558e-02f, +1.820566603e-02f, -4.444961340e-02f, -2.918029414e-02f, +3.363608319e-02f, +3.513341953e-02f, -2.062219811e-02f, -3.532846866e-02f, +8.331305607e-03f, +3.062359282e-02f, +9.525793645e-04f, -2.300534749e-02f, -6.184971799e-03f, +1.478994826e-02f, +7.637179899e-03f, -7.844836425e-03f, -6.499288351e-03f, +3.126931971e-03f, +4.250774024e-03f, -6.526487195e-04f, -2.093840795e-03f, -1.889290670e-04f, +5.246348145e-04f, +1.943263978e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.770384584e-06f, +3.055165641e-05f, +6.057115596e-05f, -7.417578898e-05f, -1.627178350e-04f, +9.202966494e-05f, +3.342181337e-04f, -4.867729821e-05f, -5.643059740e-04f, -1.028530154e-04f, +8.096789935e-04f, +3.933438867e-04f, -9.986631499e-04f, -8.163953233e-04f, +1.050314142e-03f, +1.317332257e-03f, -9.034203447e-04f, -1.799954978e-03f, +5.442093688e-04f, +2.151887982e-03f, -2.009788815e-05f, -2.280515365e-03f, -5.684638544e-04f, +2.145562425e-03f, +1.096853765e-03f, -1.774634935e-03f, -1.455339376e-03f, +1.254777836e-03f, +1.583002471e-03f, -7.033085484e-04f, -1.483338804e-03f, +2.299119763e-04f, +1.216450505e-03f, +9.491966892e-05f, -8.727991044e-04f, -2.538181231e-04f, +5.406348675e-04f, +2.760292722e-04f, -2.803275333e-04f, -2.164193667e-04f, +1.139799881e-04f, +1.308955478e-04f, -3.090764417e-05f, -5.846894037e-05f, -2.180095653e-06f, +1.478543797e-05f, +0.000000000e+00f, + /* 7, 6 (48) */ + +0.000000000e+00f, -4.784698349e-04f, -1.982206477e-04f, +1.106929742e-03f, +1.167072639e-03f, -1.537864666e-03f, -3.156430395e-03f, +9.089963697e-04f, +5.974365218e-03f, +1.892340346e-03f, -8.594826879e-03f, -7.771772704e-03f, +9.024758730e-03f, +1.682543560e-02f, -4.456288141e-03f, -2.781565957e-02f, -8.522214343e-03f, +3.787208203e-02f, +3.466020206e-02f, -4.200022421e-02f, -8.673449879e-02f, +2.778952947e-02f, +2.661212792e-01f, +4.239078299e-01f, +3.469257938e-01f, +1.115549434e-01f, -6.544562817e-02f, -7.101785681e-02f, +1.147283603e-02f, +4.636433506e-02f, +9.320984485e-03f, -2.669897040e-02f, -1.581625102e-02f, +1.195789137e-02f, +1.479816563e-02f, -2.529288742e-03f, -1.051222790e-02f, -2.107995600e-03f, +5.826799312e-03f, +3.288885247e-03f, -2.312034593e-03f, -2.620557706e-03f, +3.972207571e-04f, +1.440683450e-03f, +2.419675046e-04f, -5.224547188e-04f, -2.091118358e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.509540550e-06f, -2.926201376e-05f, -3.840681472e-05f, +4.390250510e-05f, +1.012613717e-04f, -2.765094472e-05f, -1.963006941e-04f, -5.892846530e-05f, +2.935842267e-04f, +2.529616351e-04f, -3.263584260e-04f, -5.663821937e-04f, +1.928809655e-04f, +9.608022356e-04f, +2.341635411e-04f, -1.323753831e-03f, -1.111670068e-03f, +1.422821778e-03f, +2.724994848e-03f, -6.152699801e-04f, -6.211512263e-03f, -7.451120177e-03f, -1.656575693e-03f, +5.800984315e-03f, +7.571551505e-03f, +2.972213043e-03f, -1.953596747e-03f, -2.374119699e-03f, +2.365120531e-04f, +1.577254726e-03f, +4.355013456e-04f, -8.779399475e-04f, -6.084771756e-04f, +3.628492277e-04f, +5.294092466e-04f, -5.097199019e-05f, -3.564580986e-04f, -8.819787101e-05f, +1.886417687e-04f, +1.125406874e-04f, -7.254898397e-05f, -8.245797894e-05f, +1.413415498e-05f, +4.254913318e-05f, +3.399244831e-06f, -1.491327491e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.784698349e-04f, +1.982206477e-04f, -1.555255835e-03f, -1.763817242e-03f, +2.659673806e-03f, +4.774439089e-03f, -3.009059891e-03f, -9.520246907e-03f, +1.413981001e-03f, +1.541473318e-02f, +3.227323755e-03f, -2.103560649e-02f, -1.136022309e-02f, +2.440737863e-02f, +2.231374965e-02f, -2.363701309e-02f, -3.421078571e-02f, +1.768395697e-02f, +4.437850400e-02f, -6.933437601e-03f, -5.016550302e-02f, -6.716576944e-03f, +4.986380172e-02f, +2.035122845e-02f, -4.335275964e-02f, -3.095492907e-02f, +3.218074382e-02f, +3.638819737e-02f, -1.903919564e-02f, -3.603177721e-02f, +6.847966803e-03f, +3.085350479e-02f, +2.169029869e-03f, -2.291042782e-02f, -7.057770904e-03f, +1.453613013e-02f, +8.177814767e-03f, -7.568807152e-03f, -6.779615884e-03f, +2.910512605e-03f, +4.364754012e-03f, -5.217531717e-04f, -2.124748439e-03f, -2.473980074e-04f, +5.224547188e-04f, +2.091118358e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.509540550e-06f, +2.926201376e-05f, +6.213306230e-05f, -6.857199685e-05f, -1.646976352e-04f, +8.035156716e-05f, +3.346290863e-04f, -2.841151869e-05f, -5.593375809e-04f, -1.329581136e-04f, +7.940294904e-04f, +4.320574712e-04f, -9.667122445e-04f, -8.593041379e-04f, +9.979161819e-04f, +1.357150735e-03f, -8.297338200e-04f, -1.827992339e-03f, +4.528188339e-04f, +2.160332612e-03f, +8.115029959e-05f, -2.264787302e-03f, -6.690330814e-04f, +2.105863338e-03f, +1.186054466e-03f, -1.716078009e-03f, -1.524979356e-03f, +1.186014010e-03f, +1.629234820e-03f, -6.341458936e-04f, -1.507112506e-03f, +1.687909899e-04f, +1.222524883e-03f, +1.427370524e-04f, -8.678200852e-04f, -2.868408691e-04f, +5.310558291e-04f, +2.959240970e-04f, -2.708917795e-04f, -2.266458833e-04f, +1.071383779e-04f, +1.352272513e-04f, -2.711472282e-05f, -5.992783944e-05f, -3.399244831e-06f, +1.491327491e-05f, +0.000000000e+00f, + /* 7, 7 (48) */ + +0.000000000e+00f, -4.689602943e-04f, -2.274826614e-04f, +1.068522927e-03f, +1.210975144e-03f, -1.436603294e-03f, -3.184081339e-03f, +7.126956756e-04f, +5.915436753e-03f, +2.185924572e-03f, -8.341865244e-03f, -8.098131130e-03f, +8.458376537e-03f, +1.701831657e-02f, -3.495485906e-03f, -2.758149602e-02f, -9.845968173e-03f, +3.676041196e-02f, +3.608302384e-02f, -3.927522936e-02f, -8.734976877e-02f, +2.157801721e-02f, +2.586701590e-01f, +4.222512542e-01f, +3.527267781e-01f, +1.191264949e-01f, -6.247341513e-02f, -7.297145356e-02f, +9.098716328e-03f, +4.660084711e-02f, +1.089823921e-02f, -2.626346905e-02f, -1.669419097e-02f, +1.134941420e-02f, +1.516101486e-02f, -1.999879496e-03f, -1.056319989e-02f, -2.464453698e-03f, +5.738601441e-03f, +3.477527016e-03f, -2.199493906e-03f, -2.693106690e-03f, +3.147627782e-04f, +1.454817605e-03f, +2.845166378e-04f, -5.190554740e-04f, -2.240251107e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.020248298e-05f, -2.794478312e-05f, -3.954017920e-05f, +4.061602803e-05f, +1.019455730e-04f, -2.122006131e-05f, -1.942973467e-04f, -6.884707305e-05f, +2.852203686e-04f, +2.645432223e-04f, -3.072532678e-04f, -5.742255451e-04f, +1.597182014e-04f, +9.548621291e-04f, +2.807115945e-04f, -1.288690027e-03f, -1.162109368e-03f, +1.336822724e-03f, +2.748065320e-03f, -4.467446921e-04f, -6.069073841e-03f, -7.526667692e-03f, -1.906515583e-03f, +5.626577831e-03f, +7.632272277e-03f, +3.158683085e-03f, -1.858177439e-03f, -2.428990405e-03f, +1.553336802e-04f, +1.578879652e-03f, +4.889656325e-04f, -8.588611084e-04f, -6.370607032e-04f, +3.398966032e-04f, +5.402508255e-04f, -3.224608662e-05f, -3.571682227e-04f, -1.002414783e-04f, +1.852800431e-04f, +1.187114401e-04f, -6.882595364e-05f, -8.484467018e-05f, +1.159134683e-05f, +4.315119110e-05f, +4.648267252e-06f, -1.500607012e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.689602943e-04f, +2.274826614e-04f, -1.493122773e-03f, -1.832389239e-03f, +2.494976171e-03f, +4.854790656e-03f, -2.674430805e-03f, -9.548658426e-03f, +8.546434197e-04f, +1.528177507e-02f, +4.021353246e-03f, -2.060354902e-02f, -1.232693533e-02f, +2.354807449e-02f, +2.331166583e-02f, -2.227986236e-02f, -3.504051953e-02f, +1.585596463e-02f, +4.483132284e-02f, -4.773104989e-03f, -5.008435272e-02f, -8.981364246e-03f, +4.919476864e-02f, +2.245709179e-02f, -4.216670517e-02f, -3.267100708e-02f, +3.065576446e-02f, +3.757421138e-02f, -1.740996082e-02f, -3.666592310e-02f, +5.340854297e-03f, +3.102229578e-02f, +3.391554752e-03f, -2.276769077e-02f, -7.925590989e-03f, +1.424928927e-02f, +8.708870596e-03f, -7.272883055e-03f, -7.050507664e-03f, +2.683866721e-03f, +4.471892390e-03f, -3.865259204e-04f, -2.151863162e-03f, -3.073258468e-04f, +5.190554740e-04f, +2.240251107e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.020248298e-05f, +2.794478312e-05f, +6.350687369e-05f, -6.295461800e-05f, -1.662767285e-04f, +6.872575091e-05f, +3.343245057e-04f, -8.397709338e-06f, -5.532701980e-04f, -1.624126768e-04f, +7.769113186e-04f, +4.694923866e-04f, -9.330563568e-04f, -9.001091448e-04f, +9.438343146e-04f, +1.393950635e-03f, -7.547255546e-04f, -1.852172990e-03f, +3.608135648e-04f, +2.164341675e-03f, +1.820540613e-04f, -2.244447194e-03f, -7.682187358e-04f, +2.061833388e-03f, +1.272957041e-03f, -1.653875520e-03f, -1.591707552e-03f, +1.114547142e-03f, +1.672339179e-03f, -5.632859609e-04f, -1.527933181e-03f, +1.068595109e-04f, +1.226115595e-03f, +1.907184711e-04f, -8.609741559e-04f, -3.196593601e-04f, +5.202270671e-04f, +3.154870750e-04f, -2.607176712e-04f, -2.365715527e-04f, +9.991676201e-05f, +1.393583212e-04f, -2.315335024e-05f, -6.128773634e-05f, -4.648267252e-06f, +1.500607012e-05f, +0.000000000e+00f, + /* 7, 8 (48) */ + +0.000000000e+00f, -4.587578113e-04f, -2.554274445e-04f, +1.028982748e-03f, +1.251591172e-03f, -1.334657721e-03f, -3.205301401e-03f, +5.183983289e-04f, +5.846589680e-03f, +2.471144941e-03f, -8.077322022e-03f, -8.405384397e-03f, +7.884150992e-03f, +1.717803477e-02f, -2.540623776e-03f, -2.730078443e-02f, -1.113465820e-02f, +3.559830260e-02f, +3.741984656e-02f, -3.652716404e-02f, -8.779651347e-02f, +1.550894337e-02f, +2.511434913e-01f, +4.203447386e-01f, +3.583533560e-01f, +1.267587672e-01f, -5.931473204e-02f, -7.482963099e-02f, +6.669725923e-03f, +4.675618079e-02f, +1.247711886e-02f, -2.577450342e-02f, -1.755305208e-02f, +1.071235349e-02f, +1.550091146e-02f, -1.459628670e-03f, -1.059544598e-02f, -2.821621921e-03f, +5.638359962e-03f, +3.662807059e-03f, -2.080782465e-03f, -2.761932644e-03f, +2.299181080e-04f, +1.466408952e-03f, +3.276678289e-04f, -5.144072068e-04f, -2.390311808e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.084885119e-05f, -2.660359268e-05f, -4.056543633e-05f, +3.731992528e-05f, +1.024192393e-04f, -1.486432307e-05f, -1.919620389e-04f, -7.848236882e-05f, +2.764526489e-04f, +2.754760482e-04f, -2.878444504e-04f, -5.809226461e-04f, +1.266905299e-04f, +9.472786986e-04f, +3.261633500e-04f, -1.251794720e-03f, -1.209805552e-03f, +1.249795243e-03f, +2.766077777e-03f, -2.810474539e-04f, -5.922220368e-03f, -7.594503719e-03f, -2.154360581e-03f, +5.446128244e-03f, +7.685991774e-03f, +3.344738387e-03f, -1.757784465e-03f, -2.480500260e-03f, +7.270153211e-05f, +1.577692923e-03f, +5.422436965e-04f, -8.379753945e-04f, -6.648477053e-04f, +3.160191976e-04f, +5.502403358e-04f, -1.319881162e-05f, -3.572207922e-04f, -1.122820998e-04f, +1.815105706e-04f, +1.247624957e-04f, -6.489718843e-05f, -8.711201950e-05f, +8.965421965e-06f, +4.367637005e-05f, +5.925014199e-06f, -1.506247809e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.587578113e-04f, +2.554274445e-04f, -1.429615899e-03f, -1.895343857e-03f, +2.328699442e-03f, +4.923516407e-03f, -2.340106299e-03f, -9.557056136e-03f, +3.013732217e-04f, +1.511936239e-02f, +4.798264564e-03f, -2.013405663e-02f, -1.325999169e-02f, +2.264796534e-02f, +2.425550015e-02f, -2.088591172e-02f, -3.579524509e-02f, +1.400379164e-02f, +4.519213640e-02f, -2.608763314e-03f, -4.990229866e-02f, -1.122581144e-02f, +4.842654990e-02f, +2.451892518e-02f, -4.089374813e-02f, -3.432488260e-02f, +2.906405691e-02f, +3.868875852e-02f, -1.573762164e-02f, -3.722920906e-02f, +3.812921116e-03f, +3.112915529e-02f, +4.617670347e-03f, -2.257697230e-02f, -8.786565145e-03f, +1.392962991e-02f, +9.229097663e-03f, -6.957395980e-03f, -7.311225335e-03f, +2.447295169e-03f, +4.571809152e-03f, -2.471675992e-04f, -2.175016512e-03f, -3.686135832e-04f, +5.144072068e-04f, +2.390311808e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.084885119e-05f, +2.660359268e-05f, +6.469443335e-05f, -5.733696346e-05f, -1.674600283e-04f, +5.717684970e-05f, +3.333171188e-04f, +1.132493745e-05f, -5.461317680e-04f, -1.911623324e-04f, +7.583767867e-04f, +5.055827778e-04f, -8.977809330e-04f, -9.387417533e-04f, +8.881926267e-04f, +1.427673533e-03f, -6.785577956e-04f, -1.872463125e-03f, +2.683860678e-04f, +2.163918277e-03f, +2.824053234e-04f, -2.219541565e-03f, -8.658158848e-04f, +2.013561012e-03f, +1.357378262e-03f, -1.588148312e-03f, -1.655376630e-03f, +1.040515324e-03f, +1.712211021e-03f, -4.908671114e-04f, -1.545738034e-03f, +4.424144080e-05f, +1.227194049e-03f, +2.387640299e-04f, -8.522559589e-04f, -3.522010130e-04f, +5.081553750e-04f, +3.346708314e-04f, -2.498154825e-04f, -2.461687640e-04f, +9.232376686e-05f, +1.432744774e-04f, -1.902867683e-05f, -6.254207668e-05f, -5.925014199e-06f, +1.506247809e-05f, +0.000000000e+00f, + /* 7, 9 (48) */ + +0.000000000e+00f, -4.479089601e-04f, -2.820310372e-04f, +9.884173113e-04f, +1.288911098e-03f, -1.232238482e-03f, -3.220165724e-03f, +3.264362900e-04f, +5.768107311e-03f, +2.747597590e-03f, -7.801845974e-03f, -8.693228848e-03f, +7.303228346e-03f, +1.730472530e-02f, -1.593345078e-03f, -2.697462108e-02f, -1.238645292e-02f, +3.438849704e-02f, +3.866964181e-02f, -3.376108626e-02f, -8.807756092e-02f, +9.586722998e-03f, +2.435489876e-01f, +4.181903781e-01f, +3.637994842e-01f, +1.344447589e-01f, -5.596999366e-02f, -7.658741546e-02f, +4.189225664e-03f, +4.682888232e-02f, +1.405481179e-02f, -2.523225973e-02f, -1.839102747e-02f, +1.004750579e-02f, +1.581693066e-02f, -9.093883346e-04f, -1.060864479e-02f, -3.178842713e-03f, +5.526077863e-03f, +3.844317629e-03f, -1.956019970e-03f, -2.826829832e-03f, +1.428060885e-04f, +1.475374374e-03f, +3.713441989e-04f, -5.084821926e-04f, -2.540936589e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.144840713e-05f, -2.524204041e-05f, -4.148289141e-05f, +3.402109109e-05f, +1.026854258e-04f, -8.594746194e-06f, -1.893046668e-04f, -8.782050396e-05f, +2.673033459e-04f, +2.857488329e-04f, -2.681717440e-04f, -5.864760599e-04f, +9.385614083e-05f, +9.380861467e-04f, +3.704516143e-04f, -1.213156387e-03f, -1.254713117e-03f, +1.161900464e-03f, +2.779085504e-03f, -1.183583270e-04f, -5.771169318e-03f, -7.654592979e-03f, -2.399839862e-03f, +5.259816984e-03f, +7.732594905e-03f, +3.530139394e-03f, -1.652485180e-03f, -2.528511193e-03f, -1.126185069e-05f, +1.573659262e-03f, +5.952375593e-04f, -8.152977755e-04f, -6.917772238e-04f, +2.912490903e-04f, +5.593479040e-04f, +6.138583950e-06f, -3.566062405e-04f, -1.242967150e-04f, +1.773340635e-04f, +1.306799422e-04f, -6.076670666e-05f, -8.925298590e-05f, +6.260081759e-06f, +4.412161161e-05f, +7.227216627e-06f, -1.508121306e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.479089601e-04f, +2.820310372e-04f, -1.364921466e-03f, -1.952680821e-03f, +2.161239414e-03f, +4.980693256e-03f, -2.006789181e-03f, -9.545731198e-03f, -2.447585463e-04f, +1.492820006e-02f, +5.556641351e-03f, -1.962847385e-02f, -1.415777262e-02f, +2.170922359e-02f, +2.514369277e-02f, -1.945823819e-02f, -3.647380288e-02f, +1.213132852e-02f, +4.546052247e-02f, -4.448450370e-04f, -4.961989334e-02f, -1.344535300e-02f, +4.756073402e-02f, +2.653248619e-02f, -3.953636987e-02f, -3.591303092e-02f, +2.740868028e-02f, +3.972927384e-02f, -1.402541062e-02f, -3.772007617e-02f, +2.267183082e-03f, +3.117339673e-02f, +5.844864396e-03f, -2.233820827e-02f, -9.638821104e-03f, +1.357742889e-02f, +9.737253038e-03f, -6.622725149e-03f, -7.561040817e-03f, +2.201126405e-03f, +4.664132919e-03f, -1.038931219e-04f, -2.194045189e-03f, -4.311556598e-04f, +5.084821926e-04f, +2.540936589e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.144840713e-05f, +2.524204041e-05f, +6.569800200e-05f, -5.173204069e-05f, -1.682532630e-04f, +4.572887222e-05f, +3.316210050e-04f, +3.071845145e-05f, -5.379521862e-04f, -2.191548864e-04f, +7.384806670e-04f, +5.402663004e-04f, -8.609741092e-04f, -9.751384994e-04f, +8.311176495e-04f, +1.458267827e-03f, -6.013944085e-04f, -1.888837242e-03f, +1.757290856e-04f, +2.159074794e-03f, +3.819975348e-04f, -2.190126450e-03f, -9.616229592e-04f, +1.961143586e-03f, +1.439139845e-03f, -1.519024892e-03f, -1.715845240e-03f, +9.640625692e-04f, +1.748752148e-03f, -4.170317670e-04f, -1.560470263e-03f, -1.893694541e-05f, +1.225736781e-03f, +2.867727586e-04f, -8.416641236e-04f, -3.843929989e-04f, +4.948503601e-04f, +3.534281504e-04f, -2.381972856e-04f, -2.554101662e-04f, +8.436905505e-05f, +1.469616392e-04f, -1.474638968e-05f, -6.368440066e-05f, -7.227216627e-06f, +1.508121306e-05f, +0.000000000e+00f, + /* 7,10 (48) */ + +0.000000000e+00f, -4.364605530e-04f, -3.072730776e-04f, +9.469344199e-04f, +1.322932189e-03f, -1.129553056e-03f, -3.228760470e-03f, +1.371316231e-04f, +5.680286807e-03f, +3.014900936e-03f, -7.516097141e-03f, -8.961400592e-03f, +6.716752286e-03f, +1.739858144e-02f, -6.552589311e-04f, -2.660416947e-02f, -1.359960931e-02f, +3.313378393e-02f, +3.983154227e-02f, -3.098200076e-02f, -8.819591925e-02f, +3.815553680e-03f, +2.358943946e-01f, +4.157905382e-01f, +3.690593012e-01f, +1.421773538e-01f, -5.243985426e-02f, -7.823990064e-02f, +1.660714471e-03f, +4.681762047e-02f, +1.562847105e-02f, -2.463702217e-02f, -1.920632525e-02f, +9.355728563e-03f, +1.610817975e-02f, -3.500404306e-04f, -1.060250621e-02f, -3.535448954e-03f, +5.401781148e-03f, +4.021651693e-03f, -1.825340028e-03f, -2.887596539e-03f, +5.355310260e-05f, +1.481634456e-03f, +4.154658105e-04f, -5.012549759e-04f, -2.691748720e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.200103319e-05f, -2.386368643e-05f, -4.229307530e-05f, +3.072628925e-05f, +1.027475501e-04f, -2.421989333e-06f, -1.863355934e-04f, -9.684840658e-05f, +2.577951417e-04f, +2.953516851e-04f, -2.482748867e-04f, -5.908904165e-04f, +6.127215102e-05f, +9.273211492e-04f, +4.135120799e-04f, -1.172865439e-03f, -1.296791870e-03f, +1.073298769e-03f, +2.787148517e-03f, +4.114853267e-05f, -5.616142078e-03f, -7.706910059e-03f, -2.642685756e-03f, +5.067833211e-03f, +7.771975044e-03f, +3.714645386e-03f, -1.542354717e-03f, -2.572888771e-03f, -9.643006054e-05f, +1.566747901e-03f, +6.478485272e-04f, -7.908466446e-04f, -7.177891105e-04f, +2.656204183e-04f, +5.675449142e-04f, +2.573387983e-05f, -3.553161379e-04f, -1.362620122e-04f, +1.727520416e-04f, +1.364499007e-04f, -5.643900752e-05f, -9.126065537e-05f, +3.479275925e-06f, +4.448396762e-05f, +8.552487914e-06f, -1.506105373e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.364605530e-04f, +3.072730776e-04f, -1.299223464e-03f, -2.004412861e-03f, +1.992986151e-03f, +5.026422129e-03f, -1.675168176e-03f, -9.515012747e-03f, -7.827107325e-04f, +1.470904517e-02f, +6.295122018e-03f, -1.908820755e-02f, -1.501874673e-02f, +2.073408509e-02f, +2.597481042e-02f, -1.799997036e-02f, -3.707519729e-02f, +1.024249128e-02f, +4.563625156e-02f, +1.714229757e-03f, -4.923789580e-02f, -1.563547945e-02f, +4.659911106e-02f, +2.849362978e-02f, -3.809723002e-02f, -3.743205581e-02f, +2.569283504e-02f, +4.069333641e-02f, -1.227665847e-02f, -3.813710794e-02f, +7.067128194e-04f, +3.115445979e-02f, +7.070601177e-03f, -2.205143551e-02f, -1.048048523e-02f, +1.319303589e-02f, +1.023210340e-02f, -6.269296998e-03f, -7.799238103e-03f, +1.945716238e-03f, +4.748501974e-03f, +4.306851739e-05f, -2.208791579e-03f, -4.948400605e-04f, +5.012549759e-04f, +2.691748720e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.200103319e-05f, +2.386368643e-05f, +6.652024205e-05f, -4.615252836e-05f, -1.686629464e-04f, +3.440515789e-05f, +3.292515434e-04f, +4.974615180e-05f, -5.287632087e-04f, -2.463404129e-04f, +7.172800494e-04f, +5.734842225e-04f, -8.227264984e-04f, -1.009241144e-03f, +7.727380717e-04f, +1.485688805e-03f, -5.234005202e-04f, -1.901278162e-03f, +8.303518807e-05f, +2.149832828e-03f, +4.806261020e-04f, -2.156267264e-03f, -1.055442178e-03f, +1.904687222e-03f, +1.518068837e-03f, -1.446641169e-03f, -1.772978338e-03f, +8.853385352e-04f, +1.781870932e-03f, -3.419261273e-04f, -1.572079214e-03f, -8.254725443e-05f, +1.221725550e-03f, +3.346428214e-04f, -8.292013105e-04f, -4.161624012e-04f, +4.803244579e-04f, +3.717120835e-04f, -2.258769512e-04f, -2.642687365e-04f, +7.606332210e-05f, +1.504059649e-04f, -1.031271056e-05f, -6.470836289e-05f, -8.552487914e-06f, +1.506105373e-05f, +0.000000000e+00f, + /* 7,11 (48) */ + +0.000000000e+00f, -4.244595198e-04f, -3.311367641e-04f, +9.046413446e-04f, +1.353658478e-03f, -1.026805506e-03f, -3.231182459e-03f, -4.920397027e-05f, +5.583438400e-03f, +3.272696078e-03f, -7.220745456e-03f, -9.209675479e-03f, +6.125861869e-03f, +1.745985359e-02f, +2.720622181e-04f, -2.619065739e-02f, -1.477247475e-02f, +3.183699206e-02f, +4.090484104e-02f, -2.819485224e-02f, -8.815477071e-02f, -1.800588398e-03f, +2.281874846e-01f, +4.131478524e-01f, +3.741271344e-01f, +1.499493289e-01f, -4.872520888e-02f, -7.978225536e-02f, -9.121743007e-04f, +4.672119041e-02f, +1.719521895e-02f, -2.398917364e-02f, -1.999717189e-02f, +8.637939453e-03f, +1.637380016e-02f, +2.175044837e-04f, -1.057677233e-02f, -3.890765092e-03f, +5.265519135e-03f, +4.194403735e-03f, -1.688890127e-03f, -2.944035546e-03f, -3.770755277e-05f, +1.485113732e-03f, +4.599497782e-04f, -4.927024880e-04f, -2.842359257e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.250672977e-05f, -2.247204570e-05f, -4.299673875e-05f, +2.744214133e-05f, +1.026093788e-04f, +3.643661803e-06f, -1.830656208e-04f, -1.055537955e-04f, +2.479510728e-04f, +3.042761023e-04f, -2.281935112e-04f, -5.941723784e-04f, +2.899451371e-05f, +9.150227597e-04f, +4.552834036e-04f, -1.131014046e-03f, -1.336006934e-03f, +9.841495448e-04f, +2.790333414e-03f, +1.973050787e-04f, -5.457363617e-03f, -7.751439409e-03f, -2.882634107e-03f, +4.870373568e-03f, +7.804034221e-03f, +3.898014814e-03f, -1.427475945e-03f, -2.613502441e-03f, -1.826729847e-04f, +1.556932685e-03f, +6.999773566e-04f, -7.646438261e-04f, -7.428241466e-04f, +2.391693380e-04f, +5.748040784e-04f, +4.555393470e-05f, -3.533432234e-04f, -1.481544296e-04f, +1.677668407e-04f, +1.420585538e-04f, -5.191907005e-05f, -9.312825770e-05f, +6.271988012e-07f, +4.476060912e-05f, +9.898326944e-06f, -1.500084795e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.244595198e-04f, +3.311367641e-04f, -1.232703222e-03f, -2.050565390e-03f, +1.824323205e-03f, +5.060827286e-03f, -1.345916632e-03f, -9.465266595e-03f, -1.311473941e-03f, +1.446270476e-02f, +7.012402067e-03f, -1.851472333e-02f, -1.584147323e-02f, +1.972484395e-02f, +2.674754850e-02f, -1.651428156e-02f, -3.759859781e-02f, +8.341213115e-03f, +4.571928674e-02f, +3.864062585e-03f, -4.875726970e-02f, -1.779174672e-02f, +4.554366888e-02f, +3.039831700e-02f, -3.657916119e-02f, -3.887869698e-02f, +2.391985670e-02f, +4.157867495e-02f, -1.049478754e-02f, -3.847903407e-02f, -8.653663943e-04f, +3.107191253e-02f, +8.292326727e-03f, -2.171679269e-02f, -1.130968654e-02f, +1.277687349e-02f, +1.071242786e-02f, -5.897584915e-03f, -8.025115054e-03f, +1.681447502e-03f, +4.824565296e-03f, +1.934744823e-04f, -2.219104290e-03f, -5.595484234e-04f, +4.927024880e-04f, +2.842359257e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.250672977e-05f, +2.247204570e-05f, +6.716420108e-05f, -4.061075246e-05f, -1.686963471e-04f, +2.322833477e-05f, +3.262253562e-04f, +6.837271040e-05f, -5.185983570e-04f, -2.726713359e-04f, +6.948341928e-04f, +6.051815166e-04f, -7.831309738e-04f, -1.040996755e-03f, +7.131844500e-04f, +1.509898702e-03f, -4.447421613e-04f, -1.909777027e-03f, -9.503635785e-06f, +2.136223136e-03f, +5.780888186e-04f, -2.118038660e-03f, -1.147079970e-03f, +1.844306549e-03f, +1.593997990e-03f, -1.371140182e-03f, -1.826647489e-03f, +8.044982205e-04f, +1.811482537e-03f, -2.656998777e-04f, -1.580520533e-03f, -1.464592362e-04f, +1.215147420e-03f, +3.822717313e-04f, -8.148742466e-04f, -4.474363760e-04f, +4.645929399e-04f, +3.894760597e-04f, -2.128701444e-04f, -2.727178485e-04f, +6.741829055e-05f, +1.535938897e-04f, -5.734392500e-06f, -6.560775245e-05f, -9.898326944e-06f, +1.500084795e-05f, +0.000000000e+00f, + /* 7,12 (48) */ + +0.000000000e+00f, -4.119527900e-04f, -3.536088098e-04f, +8.616446058e-04f, +1.381100619e-03f, -9.241961269e-04f, -3.227538798e-03f, -2.322695911e-04f, +5.477884605e-03f, +3.520647150e-03f, -6.916469353e-03f, -9.437868990e-03f, +5.531689491e-03f, +1.748884811e-02f, +1.187084978e-03f, -2.573537398e-02f, -1.590348879e-02f, +3.050098512e-02f, +4.188899058e-02f, -2.540451883e-02f, -8.795746564e-02f, -7.257952015e-03f, +2.204360452e-01f, +4.102652183e-01f, +3.789975080e-01f, +1.577533631e-01f, -4.482719406e-02f, -8.120973130e-02f, -3.525676742e-03f, +4.653851743e-02f, +1.875215164e-02f, -2.328919628e-02f, -2.076181572e-02f, +7.895115306e-03f, +1.661296950e-02f, +7.923085621e-04f, -1.053121839e-02f, -4.244108315e-03f, +5.117364706e-03f, +4.362170575e-03f, -1.546831573e-03f, -2.995954616e-03f, -1.308358105e-04f, +1.485740930e-03f, +5.047103873e-04f, -4.828041611e-04f, -2.992367736e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.296561261e-05f, -2.107058095e-05f, -4.359484627e-05f, +2.417511538e-05f, +1.022750137e-04f, +9.592308909e-06f, -1.795059626e-04f, -1.139251923e-04f, +2.377944815e-04f, +3.125149683e-04f, -2.079670723e-04f, -5.963306029e-04f, -2.922069502e-06f, +9.012323114e-04f, +4.957072808e-04f, -1.087695956e-03f, -1.372328744e-03f, +8.946109473e-04f, +2.788713209e-03f, +3.499495666e-04f, -5.295062159e-03f, -7.788175333e-03f, -3.119424623e-03f, +4.667641934e-03f, +7.828683285e-03f, +4.080005638e-03f, -1.307939416e-03f, -2.650225773e-03f, -2.698569752e-04f, +1.544192172e-03f, +7.515244226e-04f, -7.367145768e-04f, -7.668241626e-04f, +2.119339833e-04f, +5.810995041e-04f, +6.556473697e-05f, -3.506814349e-04f, -1.599501977e-04f, +1.623816207e-04f, +1.474921745e-04f, -4.721235117e-05f, -9.484918346e-05f, -2.291714961e-06f, +4.494883537e-05f, +1.126212154e-05f, -1.489951724e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.119527900e-04f, +3.536088098e-04f, -1.165539020e-03f, -2.091176142e-03f, +1.655626858e-03f, +5.084055621e-03f, -1.019691276e-03f, -9.396893884e-03f, -1.830072298e-03f, +1.419003343e-02f, +7.707236260e-03f, -1.790954181e-02f, -1.662460420e-02f, +1.868384719e-02f, +2.746073294e-02f, -1.500438286e-02f, -3.804333997e-02f, +6.431436087e-03f, +4.570978311e-02f, +6.000285721e-03f, -4.817918088e-02f, -1.990978538e-02f, +4.439658891e-02f, +3.224262355e-02f, -3.498516320e-02f, -4.024983716e-02f, +2.209320921e-02f, +4.238317317e-02f, -8.683305000e-03f, -3.874473394e-02f, -2.445886927e-03f, +3.092545330e-02f, +9.507474147e-03f, -2.133452096e-02f, -1.212456078e-02f, +1.232943712e-02f, +1.117702080e-02f, -5.508108855e-03f, -8.237985198e-03f, +1.408729653e-03f, +4.891983586e-03f, +3.470683719e-04f, -2.224838682e-03f, -6.251561758e-04f, +4.828041611e-04f, +2.992367736e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.296561261e-05f, +2.107058095e-05f, +6.763329471e-05f, -3.511866381e-05f, -1.683614557e-04f, +1.222027980e-05f, +3.225602511e-04f, +8.656421125e-05f, -5.074928212e-04f, -2.981025057e-04f, +6.712043721e-04f, +6.353069426e-04f, -7.422824492e-04f, -1.070357785e-03f, +6.525889165e-04f, +1.530866736e-03f, -3.655859086e-04f, -1.914333292e-03f, -1.016963831e-04f, +2.118285537e-03f, +6.741862898e-04f, -2.075524354e-03f, -1.236347376e-03f, +1.780124475e-03f, +1.666766124e-03f, -1.292671811e-03f, -1.876731160e-03f, +7.217016570e-04f, +1.837509136e-03f, -1.885058871e-04f, -1.585756300e-03f, -2.105410514e-04f, +1.205994828e-03f, +4.295565671e-04f, -7.986937526e-04f, -4.781423133e-04f, +4.476739156e-04f, +4.066739952e-04f, -1.991943163e-04f, -2.807313413e-04f, +5.844670138e-05f, +1.565121654e-04f, -1.018715016e-06f, -6.637651307e-05f, -1.126212154e-05f, +1.489951724e-05f, +0.000000000e+00f, + /* 7,13 (48) */ + +0.000000000e+00f, -3.989871774e-04f, -3.746793907e-04f, +8.180497596e-04f, +1.405275735e-03f, -8.219211132e-04f, -3.217946489e-03f, -4.117755537e-04f, +5.363959413e-03f, +3.758441632e-03f, -6.603954385e-03f, -9.645836062e-03f, +4.935358888e-03f, +1.748592604e-02f, +2.088317289e-03f, -2.523966670e-02f, -1.699118475e-02f, +2.912865638e-02f, +4.278360153e-02f, -2.261580562e-02f, -8.760751607e-02f, -1.255301417e-02f, +2.126478698e-01f, +4.071457937e-01f, +3.836651499e-01f, +1.655820464e-01f, -4.074718842e-02f, -8.251767072e-02f, -6.175902515e-03f, +4.626866045e-02f, +2.029634381e-02f, -2.253767186e-02f, -2.149853030e-02f, +7.128291144e-03f, +1.682490349e-02f, +1.373408066e-03f, -1.046565366e-02f, -4.594789750e-03f, +4.957414508e-03f, +4.524552196e-03f, -1.399339399e-03f, -3.043166967e-03f, -2.256849939e-04f, +1.483449215e-03f, +5.496592227e-04f, -4.715420395e-04f, -3.141362909e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.337790988e-05f, -1.966269580e-05f, -4.408856978e-05f, +2.093151518e-05f, +1.017488775e-04f, +1.541445451e-05f, -1.756682150e-04f, -1.219519320e-04f, +2.273489669e-04f, +3.200625479e-04f, -1.876347751e-04f, -5.973757021e-04f, -3.442423318e-05f, +8.859933155e-04f, +5.347285126e-04f, -1.043006315e-03f, -1.405733032e-03f, +8.048396605e-04f, +2.782367157e-03f, +4.989267366e-04f, -5.129468842e-03f, -7.817121964e-03f, -3.352801220e-03f, +4.459849164e-03f, +7.845842068e-03f, +4.260375659e-03f, -1.183843295e-03f, -2.682936699e-03f, -3.578450253e-04f, +1.528509729e-03f, +8.023898903e-04f, -7.070875820e-04f, -7.897321568e-04f, +1.839544194e-04f, +5.864067609e-04f, +8.573145784e-05f, -3.473259368e-04f, -1.716253821e-04f, +1.566003717e-04f, +1.527371547e-04f, -4.232478271e-05f, -9.641700079e-05f, -5.272795322e-06f, +4.504608258e-05f, +1.264115220e-05f, -1.475606133e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.989871774e-04f, +3.746793907e-04f, -1.097905726e-03f, -2.126294806e-03f, +1.487265402e-03f, +5.096275901e-03f, -6.971310248e-04f, -9.310329673e-03f, -2.337565119e-03f, +1.389193092e-02f, +8.378440632e-03f, -1.727423487e-02f, -1.736688665e-02f, +1.761348941e-02f, +2.811332186e-02f, -1.347351612e-02f, -3.840892588e-02f, +4.517102796e-03f, +4.560808673e-02f, +8.118571258e-03f, -4.750499459e-02f, -2.198530973e-02f, +4.316024154e-02f, +3.402274802e-02f, -3.331839707e-02f, -4.154250897e-02f, +2.021647805e-02f, +4.310487483e-02f, -6.845795863e-03f, -3.893323983e-02f, -4.031643228e-03f, +3.071491225e-02f, +1.071346897e-02f, -2.090496439e-02f, -1.292325454e-02f, +1.185129480e-02f, +1.162469471e-02f, -5.101434860e-03f, -8.437179515e-03f, +1.127998312e-03f, +4.950430288e-03f, +5.035805373e-04f, -2.225857397e-03f, -6.915326889e-04f, +4.715420395e-04f, +3.141362909e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.337790988e-05f, +1.966269580e-05f, +6.793128886e-05f, -2.968781694e-05f, -1.676669522e-04f, +1.402081619e-06f, +3.182751618e-04f, +1.042882057e-04f, -4.954833594e-04f, -3.225912690e-04f, +6.464537228e-04f, +6.638131218e-04f, -7.002776567e-04f, -1.097282124e-03f, +5.910848864e-04f, +1.548569136e-03f, -2.860985280e-04f, -1.914954680e-03f, -1.933534389e-04f, +2.096068812e-03f, +7.687223488e-04f, -2.028816945e-03f, -1.323060455e-03f, +1.712271930e-03f, +1.736218473e-03f, -1.211392477e-03f, -1.923114997e-03f, +6.371135868e-04f, +1.859880104e-03f, -1.104998981e-04f, -1.587755150e-03f, -2.746595442e-04f, +1.194265648e-03f, +4.763941934e-04f, -7.806747605e-04f, -5.082080004e-04f, +4.295883275e-04f, +4.232604045e-04f, -1.848686923e-04f, -2.882835876e-04f, +4.916230295e-05f, +1.591478992e-04f, +3.826522264e-06f, -6.700876330e-05f, -1.264115220e-05f, +1.475606133e-05f, +0.000000000e+00f, + /* 7,14 (48) */ + +0.000000000e+00f, -3.856092675e-04f, -3.943420865e-04f, +7.739611898e-04f, +1.426207250e-03f, -7.201722357e-04f, -3.202532034e-03f, -5.874437687e-04f, +5.242007481e-03f, +3.985790599e-03f, -6.283891837e-03f, -9.833470837e-03f, +4.337983186e-03f, +1.745150180e-02f, +2.974310605e-03f, -2.470493819e-02f, -1.803419106e-02f, +2.772292335e-02f, +4.358844119e-02f, -1.983343846e-02f, -8.710858933e-02f, -1.768248302e-02f, +2.048307479e-01f, +4.037929925e-01f, +3.881249991e-01f, +1.734278885e-01f, -3.648681276e-02f, -8.370151401e-02f, -8.858839214e-03f, +4.591081542e-02f, +2.182485354e-02f, -2.173528197e-02f, -2.220561788e-02f, +6.338558987e-03f, +1.700885791e-02f, +1.959814827e-03f, -1.037992220e-02f, -4.942115687e-03f, +4.785789126e-03f, +4.681152568e-03f, -1.246602244e-03f, -3.085491750e-03f, -3.221019947e-04f, +1.478176420e-03f, +5.947053052e-04f, -4.589008873e-04f, -3.288923522e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.374395910e-05f, -1.825172823e-05f, -4.447928178e-05f, +1.771747005e-05f, +1.010356992e-04f, +2.110101439e-05f, -1.715643282e-04f, -1.296241714e-04f, +2.166383362e-04f, +3.269144798e-04f, -1.672355058e-04f, -5.973201982e-04f, -6.546002915e-05f, +8.693513573e-04f, +5.722950666e-04f, -9.970414821e-04f, -1.436200809e-03f, +7.149906656e-04f, +2.771380576e-03f, +6.440879846e-04f, -4.960817383e-03f, -7.838293220e-03f, -3.582512362e-03f, +4.247212811e-03f, +7.855439529e-03f, +4.438882863e-03f, -1.055293283e-03f, -2.711517747e-03f, -4.464969546e-04f, +1.509873614e-03f, +8.524738878e-04f, -6.757949444e-04f, -8.114924139e-04f, +1.552725920e-04f, +5.907029444e-04f, +1.060185066e-04f, -3.432731465e-04f, -1.831559283e-04f, +1.504279191e-04f, +1.577800351e-04f, -3.726276731e-05f, -9.782547217e-05f, -8.311142389e-06f, +4.504993268e-05f, +1.403259622e-05f, -1.456956252e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.856092675e-04f, +3.943420865e-04f, -1.029974437e-03f, -2.155982623e-03f, +1.319598450e-03f, +5.097677983e-03f, -3.788558631e-04f, -9.206041467e-03f, -2.833048479e-03f, +1.356933965e-02f, +9.024894355e-03f, -1.661042175e-02f, -1.806716431e-02f, +1.651620728e-02f, +2.870440675e-02f, -1.192494699e-02f, -3.869502441e-02f, +2.602148116e-03f, +4.541473329e-02f, +1.021464007e-02f, -4.673627224e-02f, -2.401412668e-02f, +4.183718108e-02f, +3.573501995e-02f, -3.158217860e-02f, -4.275390145e-02f, +1.829336305e-02f, +4.374198841e-02f, -4.985915759e-03f, -3.904373973e-02f, -5.619398378e-03f, +3.044025270e-02f, +1.190773462e-02f, -2.042857020e-02f, -1.370392930e-02f, +1.134308680e-02f, +1.205428304e-02f, -4.678174456e-03f, -8.622048207e-03f, +8.397147245e-04f, +4.999592591e-03f, +6.627284365e-04f, -2.222030875e-03f, -7.585414522e-04f, +4.589008873e-04f, +3.288923522e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.374395910e-05f, +1.825172823e-05f, +6.806228152e-05f, -2.432935045e-05f, -1.666221717e-04f, -9.205994243e-06f, +3.133900864e-04f, +1.215137638e-04f, -4.826081954e-04f, -3.460975324e-04f, +6.206470836e-04f, +6.906566020e-04f, -6.572149221e-04f, -1.121733156e-03f, +5.288067630e-04f, +1.562989149e-03f, -2.064466181e-04f, -1.911657141e-03f, -2.842869735e-04f, +2.069630568e-03f, +8.615044673e-04f, -1.978017705e-03f, -1.407040669e-03f, +1.640887595e-03f, +1.802207023e-03f, -1.127464817e-03f, -1.965692091e-03f, +5.509031291e-04f, +1.878532204e-03f, -3.184020880e-05f, -1.586492380e-03f, -3.386805202e-04f, +1.179963238e-03f, +5.226814836e-04f, -7.608363226e-04f, -5.375617856e-04f, +4.103599397e-04f, +4.391905107e-04f, -1.699142545e-04f, -2.953495630e-04f, +3.957983714e-05f, +1.614885928e-04f, +8.793007373e-06f, -6.749881676e-05f, -1.403259622e-05f, +1.456956252e-05f, +0.000000000e+00f, + /* 7,15 (48) */ + +0.000000000e+00f, -3.718653085e-04f, -4.125938147e-04f, +7.294819080e-04f, +1.443924720e-03f, -6.191365365e-04f, -3.181431020e-03f, -7.590080970e-04f, +5.112383309e-03f, +4.202428935e-03f, -5.956977357e-03f, -1.000070634e-02f, +3.740662988e-03f, +1.738604177e-02f, +3.843661962e-03f, -2.413264312e-02f, -1.903123255e-02f, +2.628672254e-02f, +4.430343186e-02f, -1.706205789e-02f, -8.646450135e-02f, -2.264330040e-02f, +1.969924546e-01f, +4.002104801e-01f, +3.923722119e-01f, +1.812833280e-01f, -3.204792990e-02f, -8.475680730e-02f, -1.157035696e-02f, +4.546431847e-02f, +2.333472715e-02f, -2.088280808e-02f, -2.288141282e-02f, +5.527066573e-03f, +1.716413050e-02f, +2.550517771e-03f, -1.027390369e-02f, -5.285388833e-03f, +4.602633198e-03f, +4.831580487e-03f, -1.088822209e-03f, -3.122754517e-03f, -4.199274669e-04f, +1.469865278e-03f, +6.397552379e-04f, -4.448682911e-04f, -3.434619147e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.406420377e-05f, -1.684094428e-05f, -4.476854836e-05f, +1.453892518e-05f, +1.001404985e-04f, +2.664332890e-05f, -1.672065776e-04f, -1.369328962e-04f, +2.056865565e-04f, +3.330677657e-04f, -1.468077623e-04f, -5.961784772e-04f, -9.597900412e-05f, +8.513539892e-04f, +6.083581318e-04f, -9.498988544e-04f, -1.463718330e-03f, +6.252170128e-04f, +2.755844657e-03f, +7.852915229e-04f, -4.789343739e-03f, -7.851712756e-03f, -3.808311390e-03f, +4.029956851e-03f, +7.857413890e-03f, +4.615285763e-03f, -9.224025289e-04f, -2.735856267e-03f, -5.356695997e-04f, +1.488277057e-03f, +9.016766817e-04f, -6.428721674e-04f, -8.320506221e-04f, +1.259322736e-04f, +5.939667389e-04f, +1.263895881e-04f, -3.385207585e-04f, -1.945177063e-04f, +1.438699263e-04f, +1.626075341e-04f, -3.203317336e-05f, -9.906857111e-05f, -1.140163254e-05f, +4.495812173e-05f, +1.543353210e-05f, -1.433918995e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.718653085e-04f, +4.125938147e-04f, -9.619121554e-04f, -2.180311973e-03f, +1.152976278e-03f, +5.088471988e-03f, -6.546577670e-05f, -9.084527704e-03f, -3.315656674e-03f, +1.322324212e-02f, +9.645541439e-03f, -1.591976515e-02f, -1.872437923e-02f, +1.539447413e-02f, +2.923321351e-02f, -1.036195784e-02f, -3.890147103e-02f, +6.904909747e-04f, +4.513044631e-02f, +1.228427064e-02f, -4.587476777e-02f, -2.599214438e-02f, +4.043014041e-02f, +3.737590755e-02f, -2.977997158e-02f, -4.388136626e-02f, +1.632767096e-02f, +4.429289154e-02f, -3.107383555e-03f, -3.907557994e-02f, -7.205890758e-03f, +3.010157218e-02f, +1.308769786e-02f, -1.990588871e-02f, -1.446476562e-02f, +1.080552502e-02f, +1.246464298e-02f, -4.238983945e-03f, -8.791962461e-03f, +5.443651615e-04f, +5.039172428e-03f, +8.242170293e-04f, -2.213237867e-03f, -8.260402690e-04f, +4.448682911e-04f, +3.434619147e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.406420377e-05f, +1.684094428e-05f, +6.803068410e-05f, -1.905396874e-05f, -1.652370684e-04f, -1.958453755e-05f, +3.079260246e-04f, +1.382115211e-04f, -4.689069142e-04f, -3.685838193e-04f, +5.938508359e-04f, +7.157979128e-04f, -6.131939395e-04f, -1.143679789e-03f, +4.658896441e-04f, +1.574117035e-03f, -1.267962571e-04f, -1.904464776e-03f, -3.743113350e-04f, +2.039037101e-03f, +9.523441555e-04f, -1.923236358e-03f, -1.488115258e-03f, +1.566117607e-03f, +1.864590837e-03f, -1.041057354e-03f, -2.004363224e-03f, +4.632434352e-04f, +1.893409753e-03f, +4.731265204e-05f, -1.581950044e-03f, -4.024690279e-04f, +1.163096477e-03f, +5.683155438e-04f, -7.392016120e-04f, -5.661327428e-04f, +3.900153209e-04f, +4.544203565e-04f, -1.543537211e-04f, -3.019049137e-04f, +2.971502298e-05f, +1.635221805e-04f, +1.387192530e-05f, -6.784120230e-05f, -1.543353210e-05f, +1.433918995e-05f, +0.000000000e+00f, + /* 7,16 (48) */ + +0.000000000e+00f, -3.578011047e-04f, -4.294347590e-04f, +6.847133596e-04f, +1.458463645e-03f, -5.189960380e-04f, -3.154787691e-03f, -9.262146746e-04f, +4.975450413e-03f, +4.408115492e-03f, -5.623909592e-03f, -1.014751411e-02f, +3.144484510e-03f, +1.729006277e-02f, +4.695015951e-03f, -2.352428499e-02f, -1.998113140e-02f, +2.482300421e-02f, +4.492864887e-02f, -1.430621323e-02f, -8.567920983e-02f, -2.743264414e-02f, +1.891407419e-01f, +3.964021687e-01f, +3.964021687e-01f, +1.891407419e-01f, -2.743264414e-02f, -8.567920983e-02f, -1.430621323e-02f, +4.492864887e-02f, +2.482300421e-02f, -1.998113140e-02f, -2.352428499e-02f, +4.695015951e-03f, +1.729006277e-02f, +3.144484510e-03f, -1.014751411e-02f, -5.623909592e-03f, +4.408115492e-03f, +4.975450413e-03f, -9.262146746e-04f, -3.154787691e-03f, -5.189960380e-04f, +1.458463645e-03f, +6.847133596e-04f, -4.294347590e-04f, -3.578011047e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.433918995e-05f, -1.543353210e-05f, -4.495812173e-05f, +1.140163254e-05f, +9.906857111e-05f, +3.203317336e-05f, -1.626075341e-04f, -1.438699263e-04f, +1.945177063e-04f, +3.385207585e-04f, -1.263895881e-04f, -5.939667389e-04f, -1.259322736e-04f, +8.320506221e-04f, +6.428721674e-04f, -9.016766817e-04f, -1.488277057e-03f, +5.356695997e-04f, +2.735856267e-03f, +9.224025289e-04f, -4.615285763e-03f, -7.857413890e-03f, -4.029956851e-03f, +3.808311390e-03f, +7.851712756e-03f, +4.789343739e-03f, -7.852915229e-04f, -2.755844657e-03f, -6.252170128e-04f, +1.463718330e-03f, +9.498988544e-04f, -6.083581318e-04f, -8.513539892e-04f, +9.597900412e-05f, +5.961784772e-04f, +1.468077623e-04f, -3.330677657e-04f, -2.056865565e-04f, +1.369328962e-04f, +1.672065776e-04f, -2.664332890e-05f, -1.001404985e-04f, -1.453892518e-05f, +4.476854836e-05f, +1.684094428e-05f, -1.406420377e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.578011047e-04f, +4.294347590e-04f, -8.938814713e-04f, -2.199365942e-03f, +9.877392098e-04f, +5.068887451e-03f, +2.424602479e-04f, -8.946316183e-03f, -3.784563588e-03f, +1.285465830e-02f, +1.023939227e-02f, -1.520396723e-02f, -1.933757317e-02f, +1.425079434e-02f, +2.969910316e-02f, -8.787840802e-03f, -3.902826729e-02f, -1.213973801e-03f, +4.475613498e-02f, +1.432330774e-02f, -4.492242362e-02f, -2.791538074e-02f, +3.894202515e-02f, +3.894202515e-02f, -2.791538074e-02f, -4.492242362e-02f, +1.432330774e-02f, +4.475613498e-02f, -1.213973801e-03f, -3.902826729e-02f, -8.787840802e-03f, +2.969910316e-02f, +1.425079434e-02f, -1.933757317e-02f, -1.520396723e-02f, +1.023939227e-02f, +1.285465830e-02f, -3.784563588e-03f, -8.946316183e-03f, +2.424602479e-04f, +5.068887451e-03f, +9.877392098e-04f, -2.199365942e-03f, -8.938814713e-04f, +4.294347590e-04f, +3.578011047e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.433918995e-05f, +1.543353210e-05f, +6.784120230e-05f, -1.387192530e-05f, -1.635221805e-04f, -2.971502298e-05f, +3.019049137e-04f, +1.543537211e-04f, -4.544203565e-04f, -3.900153209e-04f, +5.661327428e-04f, +7.392016120e-04f, -5.683155438e-04f, -1.163096477e-03f, +4.024690279e-04f, +1.581950044e-03f, -4.731265204e-05f, -1.893409753e-03f, -4.632434352e-04f, +2.004363224e-03f, +1.041057354e-03f, -1.864590837e-03f, -1.566117607e-03f, +1.488115258e-03f, +1.923236358e-03f, -9.523441555e-04f, -2.039037101e-03f, +3.743113350e-04f, +1.904464776e-03f, +1.267962571e-04f, -1.574117035e-03f, -4.658896441e-04f, +1.143679789e-03f, +6.131939395e-04f, -7.157979128e-04f, -5.938508359e-04f, +3.685838193e-04f, +4.689069142e-04f, -1.382115211e-04f, -3.079260246e-04f, +1.958453755e-05f, +1.652370684e-04f, +1.905396874e-05f, -6.803068410e-05f, -1.684094428e-05f, +1.406420377e-05f, +0.000000000e+00f, + /* 7,17 (48) */ + +0.000000000e+00f, -3.434619147e-04f, -4.448682911e-04f, +6.397552379e-04f, +1.469865278e-03f, -4.199274669e-04f, -3.122754517e-03f, -1.088822209e-03f, +4.831580487e-03f, +4.602633198e-03f, -5.285388833e-03f, -1.027390369e-02f, +2.550517771e-03f, +1.716413050e-02f, +5.527066573e-03f, -2.288141282e-02f, -2.088280808e-02f, +2.333472715e-02f, +4.546431847e-02f, -1.157035696e-02f, -8.475680730e-02f, -3.204792990e-02f, +1.812833280e-01f, +3.923722119e-01f, +4.002104801e-01f, +1.969924546e-01f, -2.264330040e-02f, -8.646450135e-02f, -1.706205789e-02f, +4.430343186e-02f, +2.628672254e-02f, -1.903123255e-02f, -2.413264312e-02f, +3.843661962e-03f, +1.738604177e-02f, +3.740662988e-03f, -1.000070634e-02f, -5.956977357e-03f, +4.202428935e-03f, +5.112383309e-03f, -7.590080970e-04f, -3.181431020e-03f, -6.191365365e-04f, +1.443924720e-03f, +7.294819080e-04f, -4.125938147e-04f, -3.718653085e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.456956252e-05f, -1.403259622e-05f, -4.504993268e-05f, +8.311142389e-06f, +9.782547217e-05f, +3.726276731e-05f, -1.577800351e-04f, -1.504279191e-04f, +1.831559283e-04f, +3.432731465e-04f, -1.060185066e-04f, -5.907029444e-04f, -1.552725920e-04f, +8.114924139e-04f, +6.757949444e-04f, -8.524738878e-04f, -1.509873614e-03f, +4.464969546e-04f, +2.711517747e-03f, +1.055293283e-03f, -4.438882863e-03f, -7.855439529e-03f, -4.247212811e-03f, +3.582512362e-03f, +7.838293220e-03f, +4.960817383e-03f, -6.440879846e-04f, -2.771380576e-03f, -7.149906656e-04f, +1.436200809e-03f, +9.970414821e-04f, -5.722950666e-04f, -8.693513573e-04f, +6.546002915e-05f, +5.973201982e-04f, +1.672355058e-04f, -3.269144798e-04f, -2.166383362e-04f, +1.296241714e-04f, +1.715643282e-04f, -2.110101439e-05f, -1.010356992e-04f, -1.771747005e-05f, +4.447928178e-05f, +1.825172823e-05f, -1.374395910e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.434619147e-04f, +4.448682911e-04f, -8.260402690e-04f, -2.213237867e-03f, +8.242170293e-04f, +5.039172428e-03f, +5.443651615e-04f, -8.791962461e-03f, -4.238983945e-03f, +1.246464298e-02f, +1.080552502e-02f, -1.446476562e-02f, -1.990588871e-02f, +1.308769786e-02f, +3.010157218e-02f, -7.205890758e-03f, -3.907557994e-02f, -3.107383555e-03f, +4.429289154e-02f, +1.632767096e-02f, -4.388136626e-02f, -2.977997158e-02f, +3.737590755e-02f, +4.043014041e-02f, -2.599214438e-02f, -4.587476777e-02f, +1.228427064e-02f, +4.513044631e-02f, +6.904909747e-04f, -3.890147103e-02f, -1.036195784e-02f, +2.923321351e-02f, +1.539447413e-02f, -1.872437923e-02f, -1.591976515e-02f, +9.645541439e-03f, +1.322324212e-02f, -3.315656674e-03f, -9.084527704e-03f, -6.546577670e-05f, +5.088471988e-03f, +1.152976278e-03f, -2.180311973e-03f, -9.619121554e-04f, +4.125938147e-04f, +3.718653085e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.456956252e-05f, +1.403259622e-05f, +6.749881676e-05f, -8.793007373e-06f, -1.614885928e-04f, -3.957983714e-05f, +2.953495630e-04f, +1.699142545e-04f, -4.391905107e-04f, -4.103599397e-04f, +5.375617856e-04f, +7.608363226e-04f, -5.226814836e-04f, -1.179963238e-03f, +3.386805202e-04f, +1.586492380e-03f, +3.184020880e-05f, -1.878532204e-03f, -5.509031291e-04f, +1.965692091e-03f, +1.127464817e-03f, -1.802207023e-03f, -1.640887595e-03f, +1.407040669e-03f, +1.978017705e-03f, -8.615044673e-04f, -2.069630568e-03f, +2.842869735e-04f, +1.911657141e-03f, +2.064466181e-04f, -1.562989149e-03f, -5.288067630e-04f, +1.121733156e-03f, +6.572149221e-04f, -6.906566020e-04f, -6.206470836e-04f, +3.460975324e-04f, +4.826081954e-04f, -1.215137638e-04f, -3.133900864e-04f, +9.205994243e-06f, +1.666221717e-04f, +2.432935045e-05f, -6.806228152e-05f, -1.825172823e-05f, +1.374395910e-05f, +0.000000000e+00f, + /* 7,18 (48) */ + +0.000000000e+00f, -3.288923522e-04f, -4.589008873e-04f, +5.947053052e-04f, +1.478176420e-03f, -3.221019947e-04f, -3.085491750e-03f, -1.246602244e-03f, +4.681152568e-03f, +4.785789126e-03f, -4.942115687e-03f, -1.037992220e-02f, +1.959814827e-03f, +1.700885791e-02f, +6.338558987e-03f, -2.220561788e-02f, -2.173528197e-02f, +2.182485354e-02f, +4.591081542e-02f, -8.858839214e-03f, -8.370151401e-02f, -3.648681276e-02f, +1.734278885e-01f, +3.881249991e-01f, +4.037929925e-01f, +2.048307479e-01f, -1.768248302e-02f, -8.710858933e-02f, -1.983343846e-02f, +4.358844119e-02f, +2.772292335e-02f, -1.803419106e-02f, -2.470493819e-02f, +2.974310605e-03f, +1.745150180e-02f, +4.337983186e-03f, -9.833470837e-03f, -6.283891837e-03f, +3.985790599e-03f, +5.242007481e-03f, -5.874437687e-04f, -3.202532034e-03f, -7.201722357e-04f, +1.426207250e-03f, +7.739611898e-04f, -3.943420865e-04f, -3.856092675e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.475606133e-05f, -1.264115220e-05f, -4.504608258e-05f, +5.272795322e-06f, +9.641700079e-05f, +4.232478271e-05f, -1.527371547e-04f, -1.566003717e-04f, +1.716253821e-04f, +3.473259368e-04f, -8.573145784e-05f, -5.864067609e-04f, -1.839544194e-04f, +7.897321568e-04f, +7.070875820e-04f, -8.023898903e-04f, -1.528509729e-03f, +3.578450253e-04f, +2.682936699e-03f, +1.183843295e-03f, -4.260375659e-03f, -7.845842068e-03f, -4.459849164e-03f, +3.352801220e-03f, +7.817121964e-03f, +5.129468842e-03f, -4.989267366e-04f, -2.782367157e-03f, -8.048396605e-04f, +1.405733032e-03f, +1.043006315e-03f, -5.347285126e-04f, -8.859933155e-04f, +3.442423318e-05f, +5.973757021e-04f, +1.876347751e-04f, -3.200625479e-04f, -2.273489669e-04f, +1.219519320e-04f, +1.756682150e-04f, -1.541445451e-05f, -1.017488775e-04f, -2.093151518e-05f, +4.408856978e-05f, +1.966269580e-05f, -1.337790988e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.288923522e-04f, +4.589008873e-04f, -7.585414522e-04f, -2.222030875e-03f, +6.627284365e-04f, +4.999592591e-03f, +8.397147245e-04f, -8.622048207e-03f, -4.678174456e-03f, +1.205428304e-02f, +1.134308680e-02f, -1.370392930e-02f, -2.042857020e-02f, +1.190773462e-02f, +3.044025270e-02f, -5.619398378e-03f, -3.904373973e-02f, -4.985915759e-03f, +4.374198841e-02f, +1.829336305e-02f, -4.275390145e-02f, -3.158217860e-02f, +3.573501995e-02f, +4.183718108e-02f, -2.401412668e-02f, -4.673627224e-02f, +1.021464007e-02f, +4.541473329e-02f, +2.602148116e-03f, -3.869502441e-02f, -1.192494699e-02f, +2.870440675e-02f, +1.651620728e-02f, -1.806716431e-02f, -1.661042175e-02f, +9.024894355e-03f, +1.356933965e-02f, -2.833048479e-03f, -9.206041467e-03f, -3.788558631e-04f, +5.097677983e-03f, +1.319598450e-03f, -2.155982623e-03f, -1.029974437e-03f, +3.943420865e-04f, +3.856092675e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.475606133e-05f, +1.264115220e-05f, +6.700876330e-05f, -3.826522264e-06f, -1.591478992e-04f, -4.916230295e-05f, +2.882835876e-04f, +1.848686923e-04f, -4.232604045e-04f, -4.295883275e-04f, +5.082080004e-04f, +7.806747605e-04f, -4.763941934e-04f, -1.194265648e-03f, +2.746595442e-04f, +1.587755150e-03f, +1.104998981e-04f, -1.859880104e-03f, -6.371135868e-04f, +1.923114997e-03f, +1.211392477e-03f, -1.736218473e-03f, -1.712271930e-03f, +1.323060455e-03f, +2.028816945e-03f, -7.687223488e-04f, -2.096068812e-03f, +1.933534389e-04f, +1.914954680e-03f, +2.860985280e-04f, -1.548569136e-03f, -5.910848864e-04f, +1.097282124e-03f, +7.002776567e-04f, -6.638131218e-04f, -6.464537228e-04f, +3.225912690e-04f, +4.954833594e-04f, -1.042882057e-04f, -3.182751618e-04f, -1.402081619e-06f, +1.676669522e-04f, +2.968781694e-05f, -6.793128886e-05f, -1.966269580e-05f, +1.337790988e-05f, +0.000000000e+00f, + /* 7,19 (48) */ + +0.000000000e+00f, -3.141362909e-04f, -4.715420395e-04f, +5.496592227e-04f, +1.483449215e-03f, -2.256849939e-04f, -3.043166967e-03f, -1.399339399e-03f, +4.524552196e-03f, +4.957414508e-03f, -4.594789750e-03f, -1.046565366e-02f, +1.373408066e-03f, +1.682490349e-02f, +7.128291144e-03f, -2.149853030e-02f, -2.253767186e-02f, +2.029634381e-02f, +4.626866045e-02f, -6.175902515e-03f, -8.251767072e-02f, -4.074718842e-02f, +1.655820464e-01f, +3.836651499e-01f, +4.071457937e-01f, +2.126478698e-01f, -1.255301417e-02f, -8.760751607e-02f, -2.261580562e-02f, +4.278360153e-02f, +2.912865638e-02f, -1.699118475e-02f, -2.523966670e-02f, +2.088317289e-03f, +1.748592604e-02f, +4.935358888e-03f, -9.645836062e-03f, -6.603954385e-03f, +3.758441632e-03f, +5.363959413e-03f, -4.117755537e-04f, -3.217946489e-03f, -8.219211132e-04f, +1.405275735e-03f, +8.180497596e-04f, -3.746793907e-04f, -3.989871774e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.489951724e-05f, -1.126212154e-05f, -4.494883537e-05f, +2.291714961e-06f, +9.484918346e-05f, +4.721235117e-05f, -1.474921745e-04f, -1.623816207e-04f, +1.599501977e-04f, +3.506814349e-04f, -6.556473697e-05f, -5.810995041e-04f, -2.119339833e-04f, +7.668241626e-04f, +7.367145768e-04f, -7.515244226e-04f, -1.544192172e-03f, +2.698569752e-04f, +2.650225773e-03f, +1.307939416e-03f, -4.080005638e-03f, -7.828683285e-03f, -4.667641934e-03f, +3.119424623e-03f, +7.788175333e-03f, +5.295062159e-03f, -3.499495666e-04f, -2.788713209e-03f, -8.946109473e-04f, +1.372328744e-03f, +1.087695956e-03f, -4.957072808e-04f, -9.012323114e-04f, +2.922069502e-06f, +5.963306029e-04f, +2.079670723e-04f, -3.125149683e-04f, -2.377944815e-04f, +1.139251923e-04f, +1.795059626e-04f, -9.592308909e-06f, -1.022750137e-04f, -2.417511538e-05f, +4.359484627e-05f, +2.107058095e-05f, -1.296561261e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.141362909e-04f, +4.715420395e-04f, -6.915326889e-04f, -2.225857397e-03f, +5.035805373e-04f, +4.950430288e-03f, +1.127998312e-03f, -8.437179515e-03f, -5.101434860e-03f, +1.162469471e-02f, +1.185129480e-02f, -1.292325454e-02f, -2.090496439e-02f, +1.071346897e-02f, +3.071491225e-02f, -4.031643228e-03f, -3.893323983e-02f, -6.845795863e-03f, +4.310487483e-02f, +2.021647805e-02f, -4.154250897e-02f, -3.331839707e-02f, +3.402274802e-02f, +4.316024154e-02f, -2.198530973e-02f, -4.750499459e-02f, +8.118571258e-03f, +4.560808673e-02f, +4.517102796e-03f, -3.840892588e-02f, -1.347351612e-02f, +2.811332186e-02f, +1.761348941e-02f, -1.736688665e-02f, -1.727423487e-02f, +8.378440632e-03f, +1.389193092e-02f, -2.337565119e-03f, -9.310329673e-03f, -6.971310248e-04f, +5.096275901e-03f, +1.487265402e-03f, -2.126294806e-03f, -1.097905726e-03f, +3.746793907e-04f, +3.989871774e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.489951724e-05f, +1.126212154e-05f, +6.637651307e-05f, +1.018715016e-06f, -1.565121654e-04f, -5.844670138e-05f, +2.807313413e-04f, +1.991943163e-04f, -4.066739952e-04f, -4.476739156e-04f, +4.781423133e-04f, +7.986937526e-04f, -4.295565671e-04f, -1.205994828e-03f, +2.105410514e-04f, +1.585756300e-03f, +1.885058871e-04f, -1.837509136e-03f, -7.217016570e-04f, +1.876731160e-03f, +1.292671811e-03f, -1.666766124e-03f, -1.780124475e-03f, +1.236347376e-03f, +2.075524354e-03f, -6.741862898e-04f, -2.118285537e-03f, +1.016963831e-04f, +1.914333292e-03f, +3.655859086e-04f, -1.530866736e-03f, -6.525889165e-04f, +1.070357785e-03f, +7.422824492e-04f, -6.353069426e-04f, -6.712043721e-04f, +2.981025057e-04f, +5.074928212e-04f, -8.656421125e-05f, -3.225602511e-04f, -1.222027980e-05f, +1.683614557e-04f, +3.511866381e-05f, -6.763329471e-05f, -2.107058095e-05f, +1.296561261e-05f, +0.000000000e+00f, + /* 7,20 (48) */ + +0.000000000e+00f, -2.992367736e-04f, -4.828041611e-04f, +5.047103873e-04f, +1.485740930e-03f, -1.308358105e-04f, -2.995954616e-03f, -1.546831573e-03f, +4.362170575e-03f, +5.117364706e-03f, -4.244108315e-03f, -1.053121839e-02f, +7.923085621e-04f, +1.661296950e-02f, +7.895115306e-03f, -2.076181572e-02f, -2.328919628e-02f, +1.875215164e-02f, +4.653851743e-02f, -3.525676742e-03f, -8.120973130e-02f, -4.482719406e-02f, +1.577533631e-01f, +3.789975080e-01f, +4.102652183e-01f, +2.204360452e-01f, -7.257952015e-03f, -8.795746564e-02f, -2.540451883e-02f, +4.188899058e-02f, +3.050098512e-02f, -1.590348879e-02f, -2.573537398e-02f, +1.187084978e-03f, +1.748884811e-02f, +5.531689491e-03f, -9.437868990e-03f, -6.916469353e-03f, +3.520647150e-03f, +5.477884605e-03f, -2.322695911e-04f, -3.227538798e-03f, -9.241961269e-04f, +1.381100619e-03f, +8.616446058e-04f, -3.536088098e-04f, -4.119527900e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.500084795e-05f, -9.898326944e-06f, -4.476060912e-05f, -6.271988012e-07f, +9.312825770e-05f, +5.191907005e-05f, -1.420585538e-04f, -1.677668407e-04f, +1.481544296e-04f, +3.533432234e-04f, -4.555393470e-05f, -5.748040784e-04f, -2.391693380e-04f, +7.428241466e-04f, +7.646438261e-04f, -6.999773566e-04f, -1.556932685e-03f, +1.826729847e-04f, +2.613502441e-03f, +1.427475945e-03f, -3.898014814e-03f, -7.804034221e-03f, -4.870373568e-03f, +2.882634107e-03f, +7.751439409e-03f, +5.457363617e-03f, -1.973050787e-04f, -2.790333414e-03f, -9.841495448e-04f, +1.336006934e-03f, +1.131014046e-03f, -4.552834036e-04f, -9.150227597e-04f, -2.899451371e-05f, +5.941723784e-04f, +2.281935112e-04f, -3.042761023e-04f, -2.479510728e-04f, +1.055537955e-04f, +1.830656208e-04f, -3.643661803e-06f, -1.026093788e-04f, -2.744214133e-05f, +4.299673875e-05f, +2.247204570e-05f, -1.250672977e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.992367736e-04f, +4.828041611e-04f, -6.251561758e-04f, -2.224838682e-03f, +3.470683719e-04f, +4.891983586e-03f, +1.408729653e-03f, -8.237985198e-03f, -5.508108855e-03f, +1.117702080e-02f, +1.232943712e-02f, -1.212456078e-02f, -2.133452096e-02f, +9.507474147e-03f, +3.092545330e-02f, -2.445886927e-03f, -3.874473394e-02f, -8.683305000e-03f, +4.238317317e-02f, +2.209320921e-02f, -4.024983716e-02f, -3.498516320e-02f, +3.224262355e-02f, +4.439658891e-02f, -1.990978538e-02f, -4.817918088e-02f, +6.000285721e-03f, +4.570978311e-02f, +6.431436087e-03f, -3.804333997e-02f, -1.500438286e-02f, +2.746073294e-02f, +1.868384719e-02f, -1.662460420e-02f, -1.790954181e-02f, +7.707236260e-03f, +1.419003343e-02f, -1.830072298e-03f, -9.396893884e-03f, -1.019691276e-03f, +5.084055621e-03f, +1.655626858e-03f, -2.091176142e-03f, -1.165539020e-03f, +3.536088098e-04f, +4.119527900e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.500084795e-05f, +9.898326944e-06f, +6.560775245e-05f, +5.734392500e-06f, -1.535938897e-04f, -6.741829055e-05f, +2.727178485e-04f, +2.128701444e-04f, -3.894760597e-04f, -4.645929399e-04f, +4.474363760e-04f, +8.148742466e-04f, -3.822717313e-04f, -1.215147420e-03f, +1.464592362e-04f, +1.580520533e-03f, +2.656998777e-04f, -1.811482537e-03f, -8.044982205e-04f, +1.826647489e-03f, +1.371140182e-03f, -1.593997990e-03f, -1.844306549e-03f, +1.147079970e-03f, +2.118038660e-03f, -5.780888186e-04f, -2.136223136e-03f, +9.503635785e-06f, +1.909777027e-03f, +4.447421613e-04f, -1.509898702e-03f, -7.131844500e-04f, +1.040996755e-03f, +7.831309738e-04f, -6.051815166e-04f, -6.948341928e-04f, +2.726713359e-04f, +5.185983570e-04f, -6.837271040e-05f, -3.262253562e-04f, -2.322833477e-05f, +1.686963471e-04f, +4.061075246e-05f, -6.716420108e-05f, -2.247204570e-05f, +1.250672977e-05f, +0.000000000e+00f, + /* 7,21 (48) */ + +0.000000000e+00f, -2.842359257e-04f, -4.927024880e-04f, +4.599497782e-04f, +1.485113732e-03f, -3.770755277e-05f, -2.944035546e-03f, -1.688890127e-03f, +4.194403735e-03f, +5.265519135e-03f, -3.890765092e-03f, -1.057677233e-02f, +2.175044837e-04f, +1.637380016e-02f, +8.637939453e-03f, -1.999717189e-02f, -2.398917364e-02f, +1.719521895e-02f, +4.672119041e-02f, -9.121743007e-04f, -7.978225536e-02f, -4.872520888e-02f, +1.499493289e-01f, +3.741271344e-01f, +4.131478524e-01f, +2.281874846e-01f, -1.800588398e-03f, -8.815477071e-02f, -2.819485224e-02f, +4.090484104e-02f, +3.183699206e-02f, -1.477247475e-02f, -2.619065739e-02f, +2.720622181e-04f, +1.745985359e-02f, +6.125861869e-03f, -9.209675479e-03f, -7.220745456e-03f, +3.272696078e-03f, +5.583438400e-03f, -4.920397027e-05f, -3.231182459e-03f, -1.026805506e-03f, +1.353658478e-03f, +9.046413446e-04f, -3.311367641e-04f, -4.244595198e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.506105373e-05f, -8.552487914e-06f, -4.448396762e-05f, -3.479275925e-06f, +9.126065537e-05f, +5.643900752e-05f, -1.364499007e-04f, -1.727520416e-04f, +1.362620122e-04f, +3.553161379e-04f, -2.573387983e-05f, -5.675449142e-04f, -2.656204183e-04f, +7.177891105e-04f, +7.908466446e-04f, -6.478485272e-04f, -1.566747901e-03f, +9.643006054e-05f, +2.572888771e-03f, +1.542354717e-03f, -3.714645386e-03f, -7.771975044e-03f, -5.067833211e-03f, +2.642685756e-03f, +7.706910059e-03f, +5.616142078e-03f, -4.114853267e-05f, -2.787148517e-03f, -1.073298769e-03f, +1.296791870e-03f, +1.172865439e-03f, -4.135120799e-04f, -9.273211492e-04f, -6.127215102e-05f, +5.908904165e-04f, +2.482748867e-04f, -2.953516851e-04f, -2.577951417e-04f, +9.684840658e-05f, +1.863355934e-04f, +2.421989333e-06f, -1.027475501e-04f, -3.072628925e-05f, +4.229307530e-05f, +2.386368643e-05f, -1.200103319e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.842359257e-04f, +4.927024880e-04f, -5.595484234e-04f, -2.219104290e-03f, +1.934744823e-04f, +4.824565296e-03f, +1.681447502e-03f, -8.025115054e-03f, -5.897584915e-03f, +1.071242786e-02f, +1.277687349e-02f, -1.130968654e-02f, -2.171679269e-02f, +8.292326727e-03f, +3.107191253e-02f, -8.653663943e-04f, -3.847903407e-02f, -1.049478754e-02f, +4.157867495e-02f, +2.391985670e-02f, -3.887869698e-02f, -3.657916119e-02f, +3.039831700e-02f, +4.554366888e-02f, -1.779174672e-02f, -4.875726970e-02f, +3.864062585e-03f, +4.571928674e-02f, +8.341213115e-03f, -3.759859781e-02f, -1.651428156e-02f, +2.674754850e-02f, +1.972484395e-02f, -1.584147323e-02f, -1.851472333e-02f, +7.012402067e-03f, +1.446270476e-02f, -1.311473941e-03f, -9.465266595e-03f, -1.345916632e-03f, +5.060827286e-03f, +1.824323205e-03f, -2.050565390e-03f, -1.232703222e-03f, +3.311367641e-04f, +4.244595198e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.506105373e-05f, +8.552487914e-06f, +6.470836289e-05f, +1.031271056e-05f, -1.504059649e-04f, -7.606332210e-05f, +2.642687365e-04f, +2.258769512e-04f, -3.717120835e-04f, -4.803244579e-04f, +4.161624012e-04f, +8.292013105e-04f, -3.346428214e-04f, -1.221725550e-03f, +8.254725443e-05f, +1.572079214e-03f, +3.419261273e-04f, -1.781870932e-03f, -8.853385352e-04f, +1.772978338e-03f, +1.446641169e-03f, -1.518068837e-03f, -1.904687222e-03f, +1.055442178e-03f, +2.156267264e-03f, -4.806261020e-04f, -2.149832828e-03f, -8.303518807e-05f, +1.901278162e-03f, +5.234005202e-04f, -1.485688805e-03f, -7.727380717e-04f, +1.009241144e-03f, +8.227264984e-04f, -5.734842225e-04f, -7.172800494e-04f, +2.463404129e-04f, +5.287632087e-04f, -4.974615180e-05f, -3.292515434e-04f, -3.440515789e-05f, +1.686629464e-04f, +4.615252836e-05f, -6.652024205e-05f, -2.386368643e-05f, +1.200103319e-05f, +0.000000000e+00f, + /* 7,22 (48) */ + +0.000000000e+00f, -2.691748720e-04f, -5.012549759e-04f, +4.154658105e-04f, +1.481634456e-03f, +5.355310260e-05f, -2.887596539e-03f, -1.825340028e-03f, +4.021651693e-03f, +5.401781148e-03f, -3.535448954e-03f, -1.060250621e-02f, -3.500404306e-04f, +1.610817975e-02f, +9.355728563e-03f, -1.920632525e-02f, -2.463702217e-02f, +1.562847105e-02f, +4.681762047e-02f, +1.660714471e-03f, -7.823990064e-02f, -5.243985426e-02f, +1.421773538e-01f, +3.690593012e-01f, +4.157905382e-01f, +2.358943946e-01f, +3.815553680e-03f, -8.819591925e-02f, -3.098200076e-02f, +3.983154227e-02f, +3.313378393e-02f, -1.359960931e-02f, -2.660416947e-02f, -6.552589311e-04f, +1.739858144e-02f, +6.716752286e-03f, -8.961400592e-03f, -7.516097141e-03f, +3.014900936e-03f, +5.680286807e-03f, +1.371316231e-04f, -3.228760470e-03f, -1.129553056e-03f, +1.322932189e-03f, +9.469344199e-04f, -3.072730776e-04f, -4.364605530e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.508121306e-05f, -7.227216627e-06f, -4.412161161e-05f, -6.260081759e-06f, +8.925298590e-05f, +6.076670666e-05f, -1.306799422e-04f, -1.773340635e-04f, +1.242967150e-04f, +3.566062405e-04f, -6.138583950e-06f, -5.593479040e-04f, -2.912490903e-04f, +6.917772238e-04f, +8.152977755e-04f, -5.952375593e-04f, -1.573659262e-03f, +1.126185069e-05f, +2.528511193e-03f, +1.652485180e-03f, -3.530139394e-03f, -7.732594905e-03f, -5.259816984e-03f, +2.399839862e-03f, +7.654592979e-03f, +5.771169318e-03f, +1.183583270e-04f, -2.779085504e-03f, -1.161900464e-03f, +1.254713117e-03f, +1.213156387e-03f, -3.704516143e-04f, -9.380861467e-04f, -9.385614083e-05f, +5.864760599e-04f, +2.681717440e-04f, -2.857488329e-04f, -2.673033459e-04f, +8.782050396e-05f, +1.893046668e-04f, +8.594746194e-06f, -1.026854258e-04f, -3.402109109e-05f, +4.148289141e-05f, +2.524204041e-05f, -1.144840713e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.691748720e-04f, +5.012549759e-04f, -4.948400605e-04f, -2.208791579e-03f, +4.306851739e-05f, +4.748501974e-03f, +1.945716238e-03f, -7.799238103e-03f, -6.269296998e-03f, +1.023210340e-02f, +1.319303589e-02f, -1.048048523e-02f, -2.205143551e-02f, +7.070601177e-03f, +3.115445979e-02f, +7.067128194e-04f, -3.813710794e-02f, -1.227665847e-02f, +4.069333641e-02f, +2.569283504e-02f, -3.743205581e-02f, -3.809723002e-02f, +2.849362978e-02f, +4.659911106e-02f, -1.563547945e-02f, -4.923789580e-02f, +1.714229757e-03f, +4.563625156e-02f, +1.024249128e-02f, -3.707519729e-02f, -1.799997036e-02f, +2.597481042e-02f, +2.073408509e-02f, -1.501874673e-02f, -1.908820755e-02f, +6.295122018e-03f, +1.470904517e-02f, -7.827107325e-04f, -9.515012747e-03f, -1.675168176e-03f, +5.026422129e-03f, +1.992986151e-03f, -2.004412861e-03f, -1.299223464e-03f, +3.072730776e-04f, +4.364605530e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.508121306e-05f, +7.227216627e-06f, +6.368440066e-05f, +1.474638968e-05f, -1.469616392e-04f, -8.436905505e-05f, +2.554101662e-04f, +2.381972856e-04f, -3.534281504e-04f, -4.948503601e-04f, +3.843929989e-04f, +8.416641236e-04f, -2.867727586e-04f, -1.225736781e-03f, +1.893694541e-05f, +1.560470263e-03f, +4.170317670e-04f, -1.748752148e-03f, -9.640625692e-04f, +1.715845240e-03f, +1.519024892e-03f, -1.439139845e-03f, -1.961143586e-03f, +9.616229592e-04f, +2.190126450e-03f, -3.819975348e-04f, -2.159074794e-03f, -1.757290856e-04f, +1.888837242e-03f, +6.013944085e-04f, -1.458267827e-03f, -8.311176495e-04f, +9.751384994e-04f, +8.609741092e-04f, -5.402663004e-04f, -7.384806670e-04f, +2.191548864e-04f, +5.379521862e-04f, -3.071845145e-05f, -3.316210050e-04f, -4.572887222e-05f, +1.682532630e-04f, +5.173204069e-05f, -6.569800200e-05f, -2.524204041e-05f, +1.144840713e-05f, +0.000000000e+00f, + /* 7,23 (48) */ + +0.000000000e+00f, -2.540936589e-04f, -5.084821926e-04f, +3.713441989e-04f, +1.475374374e-03f, +1.428060885e-04f, -2.826829832e-03f, -1.956019970e-03f, +3.844317629e-03f, +5.526077863e-03f, -3.178842713e-03f, -1.060864479e-02f, -9.093883346e-04f, +1.581693066e-02f, +1.004750579e-02f, -1.839102747e-02f, -2.523225973e-02f, +1.405481179e-02f, +4.682888232e-02f, +4.189225664e-03f, -7.658741546e-02f, -5.596999366e-02f, +1.344447589e-01f, +3.637994842e-01f, +4.181903781e-01f, +2.435489876e-01f, +9.586722998e-03f, -8.807756092e-02f, -3.376108626e-02f, +3.866964181e-02f, +3.438849704e-02f, -1.238645292e-02f, -2.697462108e-02f, -1.593345078e-03f, +1.730472530e-02f, +7.303228346e-03f, -8.693228848e-03f, -7.801845974e-03f, +2.747597590e-03f, +5.768107311e-03f, +3.264362900e-04f, -3.220165724e-03f, -1.232238482e-03f, +1.288911098e-03f, +9.884173113e-04f, -2.820310372e-04f, -4.479089601e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.506247809e-05f, -5.925014199e-06f, -4.367637005e-05f, -8.965421965e-06f, +8.711201950e-05f, +6.489718843e-05f, -1.247624957e-04f, -1.815105706e-04f, +1.122820998e-04f, +3.572207922e-04f, +1.319881162e-05f, -5.502403358e-04f, -3.160191976e-04f, +6.648477053e-04f, +8.379753945e-04f, -5.422436965e-04f, -1.577692923e-03f, -7.270153211e-05f, +2.480500260e-03f, +1.757784465e-03f, -3.344738387e-03f, -7.685991774e-03f, -5.446128244e-03f, +2.154360581e-03f, +7.594503719e-03f, +5.922220368e-03f, +2.810474539e-04f, -2.766077777e-03f, -1.249795243e-03f, +1.209805552e-03f, +1.251794720e-03f, -3.261633500e-04f, -9.472786986e-04f, -1.266905299e-04f, +5.809226461e-04f, +2.878444504e-04f, -2.754760482e-04f, -2.764526489e-04f, +7.848236882e-05f, +1.919620389e-04f, +1.486432307e-05f, -1.024192393e-04f, -3.731992528e-05f, +4.056543633e-05f, +2.660359268e-05f, -1.084885119e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.540936589e-04f, +5.084821926e-04f, -4.311556598e-04f, -2.194045189e-03f, -1.038931219e-04f, +4.664132919e-03f, +2.201126405e-03f, -7.561040817e-03f, -6.622725149e-03f, +9.737253038e-03f, +1.357742889e-02f, -9.638821104e-03f, -2.233820827e-02f, +5.844864396e-03f, +3.117339673e-02f, +2.267183082e-03f, -3.772007617e-02f, -1.402541062e-02f, +3.972927384e-02f, +2.740868028e-02f, -3.591303092e-02f, -3.953636987e-02f, +2.653248619e-02f, +4.756073402e-02f, -1.344535300e-02f, -4.961989334e-02f, -4.448450370e-04f, +4.546052247e-02f, +1.213132852e-02f, -3.647380288e-02f, -1.945823819e-02f, +2.514369277e-02f, +2.170922359e-02f, -1.415777262e-02f, -1.962847385e-02f, +5.556641351e-03f, +1.492820006e-02f, -2.447585463e-04f, -9.545731198e-03f, -2.006789181e-03f, +4.980693256e-03f, +2.161239414e-03f, -1.952680821e-03f, -1.364921466e-03f, +2.820310372e-04f, +4.479089601e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.506247809e-05f, +5.925014199e-06f, +6.254207668e-05f, +1.902867683e-05f, -1.432744774e-04f, -9.232376686e-05f, +2.461687640e-04f, +2.498154825e-04f, -3.346708314e-04f, -5.081553750e-04f, +3.522010130e-04f, +8.522559589e-04f, -2.387640299e-04f, -1.227194049e-03f, -4.424144080e-05f, +1.545738034e-03f, +4.908671114e-04f, -1.712211021e-03f, -1.040515324e-03f, +1.655376630e-03f, +1.588148312e-03f, -1.357378262e-03f, -2.013561012e-03f, +8.658158848e-04f, +2.219541565e-03f, -2.824053234e-04f, -2.163918277e-03f, -2.683860678e-04f, +1.872463125e-03f, +6.785577956e-04f, -1.427673533e-03f, -8.881926267e-04f, +9.387417533e-04f, +8.977809330e-04f, -5.055827778e-04f, -7.583767867e-04f, +1.911623324e-04f, +5.461317680e-04f, -1.132493745e-05f, -3.333171188e-04f, -5.717684970e-05f, +1.674600283e-04f, +5.733696346e-05f, -6.469443335e-05f, -2.660359268e-05f, +1.084885119e-05f, +0.000000000e+00f, + /* 7,24 (48) */ + +0.000000000e+00f, -2.390311808e-04f, -5.144072068e-04f, +3.276678289e-04f, +1.466408952e-03f, +2.299181080e-04f, -2.761932644e-03f, -2.080782465e-03f, +3.662807059e-03f, +5.638359962e-03f, -2.821621921e-03f, -1.059544598e-02f, -1.459628670e-03f, +1.550091146e-02f, +1.071235349e-02f, -1.755305208e-02f, -2.577450342e-02f, +1.247711886e-02f, +4.675618079e-02f, +6.669725923e-03f, -7.482963099e-02f, -5.931473204e-02f, +1.267587672e-01f, +3.583533560e-01f, +4.203447386e-01f, +2.511434913e-01f, +1.550894337e-02f, -8.779651347e-02f, -3.652716404e-02f, +3.741984656e-02f, +3.559830260e-02f, -1.113465820e-02f, -2.730078443e-02f, -2.540623776e-03f, +1.717803477e-02f, +7.884150992e-03f, -8.405384397e-03f, -8.077322022e-03f, +2.471144941e-03f, +5.846589680e-03f, +5.183983289e-04f, -3.205301401e-03f, -1.334657721e-03f, +1.251591172e-03f, +1.028982748e-03f, -2.554274445e-04f, -4.587578113e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.500607012e-05f, -4.648267252e-06f, -4.315119110e-05f, -1.159134683e-05f, +8.484467018e-05f, +6.882595364e-05f, -1.187114401e-04f, -1.852800431e-04f, +1.002414783e-04f, +3.571682227e-04f, +3.224608662e-05f, -5.402508255e-04f, -3.398966032e-04f, +6.370607032e-04f, +8.588611084e-04f, -4.889656325e-04f, -1.578879652e-03f, -1.553336802e-04f, +2.428990405e-03f, +1.858177439e-03f, -3.158683085e-03f, -7.632272277e-03f, -5.626577831e-03f, +1.906515583e-03f, +7.526667692e-03f, +6.069073841e-03f, +4.467446921e-04f, -2.748065320e-03f, -1.336822724e-03f, +1.162109368e-03f, +1.288690027e-03f, -2.807115945e-04f, -9.548621291e-04f, -1.597182014e-04f, +5.742255451e-04f, +3.072532678e-04f, -2.645432223e-04f, -2.852203686e-04f, +6.884707305e-05f, +1.942973467e-04f, +2.122006131e-05f, -1.019455730e-04f, -4.061602803e-05f, +3.954017920e-05f, +2.794478312e-05f, -1.020248298e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.390311808e-04f, +5.144072068e-04f, -3.686135832e-04f, -2.175016512e-03f, -2.471675992e-04f, +4.571809152e-03f, +2.447295169e-03f, -7.311225335e-03f, -6.957395980e-03f, +9.229097663e-03f, +1.392962991e-02f, -8.786565145e-03f, -2.257697230e-02f, +4.617670347e-03f, +3.112915529e-02f, +3.812921116e-03f, -3.722920906e-02f, -1.573762164e-02f, +3.868875852e-02f, +2.906405691e-02f, -3.432488260e-02f, -4.089374813e-02f, +2.451892518e-02f, +4.842654990e-02f, -1.122581144e-02f, -4.990229866e-02f, -2.608763314e-03f, +4.519213640e-02f, +1.400379164e-02f, -3.579524509e-02f, -2.088591172e-02f, +2.425550015e-02f, +2.264796534e-02f, -1.325999169e-02f, -2.013405663e-02f, +4.798264564e-03f, +1.511936239e-02f, +3.013732217e-04f, -9.557056136e-03f, -2.340106299e-03f, +4.923516407e-03f, +2.328699442e-03f, -1.895343857e-03f, -1.429615899e-03f, +2.554274445e-04f, +4.587578113e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.500607012e-05f, +4.648267252e-06f, +6.128773634e-05f, +2.315335024e-05f, -1.393583212e-04f, -9.991676201e-05f, +2.365715527e-04f, +2.607176712e-04f, -3.154870750e-04f, -5.202270671e-04f, +3.196593601e-04f, +8.609741559e-04f, -1.907184711e-04f, -1.226115595e-03f, -1.068595109e-04f, +1.527933181e-03f, +5.632859609e-04f, -1.672339179e-03f, -1.114547142e-03f, +1.591707552e-03f, +1.653875520e-03f, -1.272957041e-03f, -2.061833388e-03f, +7.682187358e-04f, +2.244447194e-03f, -1.820540613e-04f, -2.164341675e-03f, -3.608135648e-04f, +1.852172990e-03f, +7.547255546e-04f, -1.393950635e-03f, -9.438343146e-04f, +9.001091448e-04f, +9.330563568e-04f, -4.694923866e-04f, -7.769113186e-04f, +1.624126768e-04f, +5.532701980e-04f, +8.397709338e-06f, -3.343245057e-04f, -6.872575091e-05f, +1.662767285e-04f, +6.295461800e-05f, -6.350687369e-05f, -2.794478312e-05f, +1.020248298e-05f, +0.000000000e+00f, + /* 7,25 (48) */ + +0.000000000e+00f, -2.240251107e-04f, -5.190554740e-04f, +2.845166378e-04f, +1.454817605e-03f, +3.147627782e-04f, -2.693106690e-03f, -2.199493906e-03f, +3.477527016e-03f, +5.738601441e-03f, -2.464453698e-03f, -1.056319989e-02f, -1.999879496e-03f, +1.516101486e-02f, +1.134941420e-02f, -1.669419097e-02f, -2.626346905e-02f, +1.089823921e-02f, +4.660084711e-02f, +9.098716328e-03f, -7.297145356e-02f, -6.247341513e-02f, +1.191264949e-01f, +3.527267781e-01f, +4.222512542e-01f, +2.586701590e-01f, +2.157801721e-02f, -8.734976877e-02f, -3.927522936e-02f, +3.608302384e-02f, +3.676041196e-02f, -9.845968173e-03f, -2.758149602e-02f, -3.495485906e-03f, +1.701831657e-02f, +8.458376537e-03f, -8.098131130e-03f, -8.341865244e-03f, +2.185924572e-03f, +5.915436753e-03f, +7.126956756e-04f, -3.184081339e-03f, -1.436603294e-03f, +1.210975144e-03f, +1.068522927e-03f, -2.274826614e-04f, -4.689602943e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.491327491e-05f, -3.399244831e-06f, -4.254913318e-05f, -1.413415498e-05f, +8.245797894e-05f, +7.254898397e-05f, -1.125406874e-04f, -1.886417687e-04f, +8.819787101e-05f, +3.564580986e-04f, +5.097199019e-05f, -5.294092466e-04f, -3.628492277e-04f, +6.084771756e-04f, +8.779399475e-04f, -4.355013456e-04f, -1.577254726e-03f, -2.365120531e-04f, +2.374119699e-03f, +1.953596747e-03f, -2.972213043e-03f, -7.571551505e-03f, -5.800984315e-03f, +1.656575693e-03f, +7.451120177e-03f, +6.211512263e-03f, +6.152699801e-04f, -2.724994848e-03f, -1.422821778e-03f, +1.111670068e-03f, +1.323753831e-03f, -2.341635411e-04f, -9.608022356e-04f, -1.928809655e-04f, +5.663821937e-04f, +3.263584260e-04f, -2.529616351e-04f, -2.935842267e-04f, +5.892846530e-05f, +1.963006941e-04f, +2.765094472e-05f, -1.012613717e-04f, -4.390250510e-05f, +3.840681472e-05f, +2.926201376e-05f, -9.509540550e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.240251107e-04f, +5.190554740e-04f, -3.073258468e-04f, -2.151863162e-03f, -3.865259204e-04f, +4.471892390e-03f, +2.683866721e-03f, -7.050507664e-03f, -7.272883055e-03f, +8.708870596e-03f, +1.424928927e-02f, -7.925590989e-03f, -2.276769077e-02f, +3.391554752e-03f, +3.102229578e-02f, +5.340854297e-03f, -3.666592310e-02f, -1.740996082e-02f, +3.757421138e-02f, +3.065576446e-02f, -3.267100708e-02f, -4.216670517e-02f, +2.245709179e-02f, +4.919476864e-02f, -8.981364246e-03f, -5.008435272e-02f, -4.773104989e-03f, +4.483132284e-02f, +1.585596463e-02f, -3.504051953e-02f, -2.227986236e-02f, +2.331166583e-02f, +2.354807449e-02f, -1.232693533e-02f, -2.060354902e-02f, +4.021353246e-03f, +1.528177507e-02f, +8.546434197e-04f, -9.548658426e-03f, -2.674430805e-03f, +4.854790656e-03f, +2.494976171e-03f, -1.832389239e-03f, -1.493122773e-03f, +2.274826614e-04f, +4.689602943e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.491327491e-05f, +3.399244831e-06f, +5.992783944e-05f, +2.711472282e-05f, -1.352272513e-04f, -1.071383779e-04f, +2.266458833e-04f, +2.708917795e-04f, -2.959240970e-04f, -5.310558291e-04f, +2.868408691e-04f, +8.678200852e-04f, -1.427370524e-04f, -1.222524883e-03f, -1.687909899e-04f, +1.507112506e-03f, +6.341458936e-04f, -1.629234820e-03f, -1.186014010e-03f, +1.524979356e-03f, +1.716078009e-03f, -1.186054466e-03f, -2.105863338e-03f, +6.690330814e-04f, +2.264787302e-03f, -8.115029959e-05f, -2.160332612e-03f, -4.528188339e-04f, +1.827992339e-03f, +8.297338200e-04f, -1.357150735e-03f, -9.979161819e-04f, +8.593041379e-04f, +9.667122445e-04f, -4.320574712e-04f, -7.940294904e-04f, +1.329581136e-04f, +5.593375809e-04f, +2.841151869e-05f, -3.346290863e-04f, -8.035156716e-05f, +1.646976352e-04f, +6.857199685e-05f, -6.213306230e-05f, -2.926201376e-05f, +9.509540550e-06f, +0.000000000e+00f, + /* 7,26 (48) */ + +0.000000000e+00f, -2.091118358e-04f, -5.224547188e-04f, +2.419675046e-04f, +1.440683450e-03f, +3.972207571e-04f, -2.620557706e-03f, -2.312034593e-03f, +3.288885247e-03f, +5.826799312e-03f, -2.107995600e-03f, -1.051222790e-02f, -2.529288742e-03f, +1.479816563e-02f, +1.195789137e-02f, -1.581625102e-02f, -2.669897040e-02f, +9.320984485e-03f, +4.636433506e-02f, +1.147283603e-02f, -7.101785681e-02f, -6.544562817e-02f, +1.115549434e-01f, +3.469257938e-01f, +4.239078299e-01f, +2.661212792e-01f, +2.778952947e-02f, -8.673449879e-02f, -4.200022421e-02f, +3.466020206e-02f, +3.787208203e-02f, -8.522214343e-03f, -2.781565957e-02f, -4.456288141e-03f, +1.682543560e-02f, +9.024758730e-03f, -7.771772704e-03f, -8.594826879e-03f, +1.892340346e-03f, +5.974365218e-03f, +9.089963697e-04f, -3.156430395e-03f, -1.537864666e-03f, +1.167072639e-03f, +1.106929742e-03f, -1.982206477e-04f, -4.784698349e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.478543797e-05f, -2.180095653e-06f, -4.187335580e-05f, -1.659039649e-05f, +7.995909681e-05f, +7.606274189e-05f, -1.062641544e-04f, -1.915958308e-04f, +7.617396702e-05f, +3.551010896e-04f, +6.934628683e-05f, -5.177466597e-04f, -3.848470823e-04f, +5.791587704e-04f, +8.952003513e-04f, -3.819479360e-04f, -1.572857817e-03f, -3.161181312e-04f, +2.316029593e-03f, +2.043982842e-03f, -2.785566329e-03f, -7.503952826e-03f, -5.969174217e-03f, +1.404814536e-03f, +7.367906298e-03f, +6.349322397e-03f, +7.864375643e-04f, -2.696819961e-03f, -1.507630778e-03f, +1.058538454e-03f, +1.356899769e-03f, -1.865891824e-04f, -9.650673803e-04f, -2.261196541e-04f, +5.573921262e-04f, +3.451201979e-04f, -2.407439523e-04f, -3.015223972e-04f, +4.874115534e-05f, +1.979626789e-04f, +3.414561603e-05f, -1.003639553e-04f, -4.717234406e-05f, +3.716526842e-05f, +3.055165641e-05f, -8.770384584e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.091118358e-04f, +5.224547188e-04f, -2.473980074e-04f, -2.124748439e-03f, -5.217531717e-04f, +4.364754012e-03f, +2.910512605e-03f, -6.779615884e-03f, -7.568807152e-03f, +8.177814767e-03f, +1.453613013e-02f, -7.057770904e-03f, -2.291042782e-02f, +2.169029869e-03f, +3.085350479e-02f, +6.847966803e-03f, -3.603177721e-02f, -1.903919564e-02f, +3.638819737e-02f, +3.218074382e-02f, -3.095492907e-02f, -4.335275964e-02f, +2.035122845e-02f, +4.986380172e-02f, -6.716576944e-03f, -5.016550302e-02f, -6.933437601e-03f, +4.437850400e-02f, +1.768395697e-02f, -3.421078571e-02f, -2.363701309e-02f, +2.231374965e-02f, +2.440737863e-02f, -1.136022309e-02f, -2.103560649e-02f, +3.227323755e-03f, +1.541473318e-02f, +1.413981001e-03f, -9.520246907e-03f, -3.009059891e-03f, +4.774439089e-03f, +2.659673806e-03f, -1.763817242e-03f, -1.555255835e-03f, +1.982206477e-04f, +4.784698349e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.478543797e-05f, +2.180095653e-06f, +5.846894037e-05f, +3.090764417e-05f, -1.308955478e-04f, -1.139799881e-04f, +2.164193667e-04f, +2.803275333e-04f, -2.760292722e-04f, -5.406348675e-04f, +2.538181231e-04f, +8.727991044e-04f, -9.491966892e-05f, -1.216450505e-03f, -2.299119763e-04f, +1.483338804e-03f, +7.033085484e-04f, -1.583002471e-03f, -1.254777836e-03f, +1.455339376e-03f, +1.774634935e-03f, -1.096853765e-03f, -2.145562425e-03f, +5.684638544e-04f, +2.280515365e-03f, +2.009788815e-05f, -2.151887982e-03f, -5.442093688e-04f, +1.799954978e-03f, +9.034203447e-04f, -1.317332257e-03f, -1.050314142e-03f, +8.163953233e-04f, +9.986631499e-04f, -3.933438867e-04f, -8.096789935e-04f, +1.028530154e-04f, +5.643059740e-04f, +4.867729821e-05f, -3.342181337e-04f, -9.202966494e-05f, +1.627178350e-04f, +7.417578898e-05f, -6.057115596e-05f, -3.055165641e-05f, +8.770384584e-06f, +0.000000000e+00f, + /* 7,27 (48) */ + +0.000000000e+00f, -1.943263978e-04f, -5.246348145e-04f, +2.000941488e-04f, +1.424093054e-03f, +4.771798539e-04f, -2.544494964e-03f, -2.418298747e-03f, +3.097289416e-03f, +5.902973279e-03f, -1.752894510e-03f, -1.044288162e-02f, -3.047035402e-03f, +1.441331855e-02f, +1.253705014e-02f, -1.492105067e-02f, -2.708091834e-02f, +7.748126668e-03f, +4.604821692e-02f, +1.378886562e-02f, -6.897387397e-02f, -6.823119450e-02f, +1.040509906e-01f, +3.409566196e-01f, +4.253126445e-01f, +2.734891855e-01f, +3.413885187e-02f, -8.594806123e-02f, -4.469704417e-02f, +3.315257128e-02f, +3.893062048e-02f, -7.165314573e-03f, -2.800224875e-02f, -5.421355521e-03f, +1.659931595e-02f, +9.582150857e-03f, -7.426652506e-03f, -8.835570832e-03f, +1.590817949e-03f, +6.023106374e-03f, +1.106959049e-03f, -3.122284779e-03f, -1.638228621e-03f, +1.119900295e-03f, +1.144095010e-03f, -1.676689913e-04f, -4.872402194e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.462395980e-05f, -9.928457007e-07f, -4.112711044e-05f, -1.895687537e-05f, +7.735526809e-05f, +7.936416972e-05f, -9.989573536e-05f, -1.941430972e-04f, +6.419208530e-05f, +3.531089337e-04f, +8.733979986e-05f, -5.052952394e-04f, -4.058622990e-04f, +5.491677055e-04f, +9.106341493e-04f, -3.284014664e-04f, -1.565732871e-03f, -3.940375622e-04f, +2.254864673e-03f, +2.129284004e-03f, -2.598979196e-03f, -7.429607677e-03f, -6.130982232e-03f, +1.151508169e-03f, +7.277080996e-03f, +6.482295563e-03f, +9.600562222e-04f, -2.663501277e-03f, -1.591087852e-03f, +1.002770603e-03f, +1.388043770e-03f, -1.380612193e-04f, -9.676285787e-04f, -2.593742174e-04f, +5.472570011e-04f, +3.634989747e-04f, -2.279042196e-04f, -3.090135547e-04f, +3.830049673e-05f, +1.992744192e-04f, +4.069239427e-05f, -9.925103113e-05f, -5.041842712e-05f, +3.581570155e-05f, +3.181006045e-05f, -7.985500330e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.943263978e-04f, +5.246348145e-04f, -1.889290670e-04f, -2.093840795e-03f, -6.526487195e-04f, +4.250774024e-03f, +3.126931971e-03f, -6.499288351e-03f, -7.844836425e-03f, +7.637179899e-03f, +1.478994826e-02f, -6.184971799e-03f, -2.300534749e-02f, +9.525793645e-04f, +3.062359282e-02f, +8.331305607e-03f, -3.532846866e-02f, -2.062219811e-02f, +3.513341953e-02f, +3.363608319e-02f, -2.918029414e-02f, -4.444961340e-02f, +1.820566603e-02f, +5.043226558e-02f, -4.436061579e-03f, -5.014540513e-02f, -9.085325584e-03f, +4.383429464e-02f, +1.948391195e-02f, -3.330736537e-02f, -2.495434535e-02f, +2.126343551e-02f, +2.522377395e-02f, -1.036155994e-02f, -2.142895037e-02f, +2.417644762e-03f, +1.551758620e-02f, +1.978286975e-03f, -9.471569609e-03f, -3.343278025e-03f, +4.682409424e-03f, +2.822391641e-03f, -1.689641453e-03f, -1.615826991e-03f, +1.676689913e-04f, +4.872402194e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.462395980e-05f, +9.928457007e-07f, +5.691766838e-05f, +3.452750106e-05f, -1.263776520e-04f, -1.204340034e-04f, +2.059198058e-04f, +2.890164525e-04f, -2.558500265e-04f, -5.489601822e-04f, +2.206633037e-04f, +8.759205059e-04f, -4.736493450e-05f, -1.207926078e-03f, -2.901011902e-04f, +1.456680690e-03f, +7.706398975e-04f, -1.533752739e-03f, -1.320706728e-03f, +1.382940602e-03f, +1.829433348e-03f, -1.005542717e-03f, -2.180851332e-03f, +4.667189164e-04f, +2.291594477e-03f, +1.214813444e-04f, -2.139013986e-03f, -6.347933102e-04f, +1.768102977e-03f, +9.756248546e-04f, -1.274560359e-03f, -1.100906835e-03f, +7.714563107e-04f, +1.028826526e-03f, -3.534208899e-04f, -8.238101248e-04f, +7.215383980e-05f, +5.681494757e-04f, +6.915470437e-05f, -3.330803253e-04f, -1.037348326e-04f, +1.603332576e-04f, +7.975240632e-05f, -5.881974410e-05f, -3.181006045e-05f, +7.985500330e-06f, +0.000000000e+00f, + /* 7,28 (48) */ + +0.000000000e+00f, -1.797024380e-04f, -5.256276602e-04f, +1.589670384e-04f, +1.405136178e-03f, +5.545351220e-04f, -2.465130794e-03f, -2.518194483e-03f, +2.903146319e-03f, +5.967165364e-03f, -1.399785577e-03f, -1.035554182e-02f, -3.552330642e-03f, +1.400745625e-02f, +1.308621785e-02f, -1.401041652e-02f, -2.740931980e-02f, +6.182393798e-03f, +4.565417936e-02f, +1.604373029e-02f, -6.684458996e-02f, -7.083017370e-02f, +9.662138288e-02f, +3.348256374e-01f, +4.264641526e-01f, +2.807662665e-01f, +4.062114743e-02f, -8.498800501e-02f, -4.736054545e-02f, +3.156148343e-02f, +3.993339109e-02f, -5.777270803e-03f, -2.814030997e-02f, -6.388984100e-03f, +1.633994173e-02f, +1.012940786e-02f, -7.063153531e-03f, -9.063475051e-03f, +1.281804394e-03f, +6.061406870e-03f, +1.306233468e-03f, -3.081592384e-03f, -1.737479652e-03f, +1.069481868e-03f, +1.179910712e-03f, -1.358589308e-04f, -4.952257198e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.443029105e-05f, +1.606038524e-07f, -4.031373136e-05f, -2.123065152e-05f, +7.465381357e-05f, +8.245068760e-05f, -9.344927460e-05f, -1.962852063e-04f, +5.227413708e-05f, +3.504943998e-04f, +1.049244523e-04f, -4.920882012e-04f, -4.258691551e-04f, +5.185666495e-04f, +9.242365355e-04f, -2.749568061e-04f, -1.555927983e-03f, -4.701602984e-04f, +2.190772398e-03f, +2.209456350e-03f, -2.412685758e-03f, -7.348655345e-03f, -6.286251430e-03f, +8.969347129e-04f, +7.178708984e-03f, +6.610227950e-03f, +1.135929496e-03f, -2.625006558e-03f, -1.673031134e-03f, +9.444278384e-04f, +1.417104224e-03f, -8.865496331e-05f, -9.684595838e-04f, -2.925838239e-04f, +5.359806252e-04f, +3.814553423e-04f, -2.144578550e-04f, -3.160369234e-04f, +2.762256769e-05f, +2.002275795e-04f, +4.727929308e-05f, -9.792070572e-05f, -5.363354428e-05f, +3.435851553e-05f, +3.303356079e-05f, -7.155499268e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.797024380e-04f, +5.256276602e-04f, -1.320113986e-04f, -2.059313294e-03f, -7.790263715e-04f, +4.130340021e-03f, +3.332851777e-03f, -6.210271898e-03f, -8.100686451e-03f, +7.088219717e-03f, +1.501061156e-02f, -5.309051293e-03f, -2.305271243e-02f, -2.553467138e-04f, +3.033349163e-02f, +9.787986297e-03f, -3.455782876e-02f, -2.215595085e-02f, +3.381271281e-02f, +3.501902379e-02f, -2.735086079e-02f, -4.545515612e-02f, +1.602481470e-02f, +5.089898449e-02f, -2.144467102e-03f, -5.002392379e-02f, -1.122433957e-02f, +4.319950132e-02f, +2.125201493e-02f, -3.233174051e-02f, -2.622890571e-02f, +2.016252867e-02f, +2.599523026e-02f, -9.332733411e-03f, -2.178237126e-02f, +1.593834637e-03f, +1.558974004e-02f, +2.546436450e-03f, -9.402414905e-03f, -3.676358351e-03f, +4.578674591e-03f, +2.982724899e-03f, -1.609889047e-03f, -1.674646735e-03f, +1.358589308e-04f, +4.952257198e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.443029105e-05f, -1.606038524e-07f, +5.528070823e-05f, +3.797021669e-05f, -1.216881284e-04f, -1.264938699e-04f, +1.951751290e-04f, +2.969518419e-04f, -2.354337306e-04f, -5.560305404e-04f, +1.874480376e-04f, +8.771974561e-04f, -1.699807130e-07f, -1.196990134e-03f, -3.492402140e-04f, +1.427212413e-03f, +8.360105083e-04f, -1.481602044e-03f, -1.383675242e-03f, +1.307941340e-03f, +1.880368423e-03f, -9.123132502e-04f, -2.211660024e-03f, +3.640086191e-04f, +2.297997438e-03f, +2.227902696e-04f, -2.121726136e-03f, -7.243798566e-04f, +1.732486615e-03f, +1.046189401e-03f, -1.228906834e-03f, -1.149575910e-03f, +7.245656074e-04f, +1.057122928e-03f, -3.123610207e-04f, -8.363759240e-04f, +4.091902851e-05f, +5.708443107e-04f, +8.980231717e-05f, -3.312057915e-04f, -1.154413295e-04f, +1.575407020e-04f, +8.528801151e-05f, -5.687786299e-05f, -3.303356079e-05f, +7.155499268e-06f, +0.000000000e+00f, + /* 7,29 (48) */ + +0.000000000e+00f, -1.652721470e-04f, -5.254670563e-04f, +1.186533070e-04f, +1.383905527e-03f, +6.291889356e-04f, -2.382680107e-03f, -2.611643757e-03f, +2.706861113e-03f, +6.019439501e-03f, -1.049291177e-03f, -1.025061737e-02f, -4.044418843e-03f, +1.358158709e-02f, +1.360478450e-02f, -1.308617999e-02f, -2.768427661e-02f, +4.626465814e-03f, +4.518401906e-02f, +1.823450269e-02f, -6.463513361e-02f, -7.324285945e-02f, +8.927272753e-02f, +3.285393859e-01f, +4.273610873e-01f, +2.879449755e-01f, +4.723137538e-02f, -8.385207551e-02f, -4.998555200e-02f, +2.988845230e-02f, +4.087781893e-02f, -4.360166579e-03f, -2.822896493e-02f, -7.357443684e-03f, +1.604735791e-02f, +1.066538848e-02f, -6.681698189e-03f, -9.277932906e-03f, +9.657674704e-04f, +6.089029438e-03f, +1.506461047e-03f, -3.034313091e-03f, -1.835400358e-03f, +1.015848324e-03f, +1.214269227e-03f, -1.028253700e-04f, -5.023812190e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.420592772e-05f, +1.278478377e-06f, -3.943662641e-05f, -2.340904202e-05f, +7.186211401e-05f, +8.532019059e-05f, -8.693853995e-05f, -1.980245521e-04f, +4.044158950e-05f, +3.472712501e-04f, +1.220733051e-04f, -4.781597261e-04f, -4.448440945e-04f, +4.874186029e-04f, +9.360060371e-04f, -2.217074795e-04f, -1.543495271e-03f, -5.443807266e-04f, +2.123902846e-03f, +2.284463820e-03f, -2.226917682e-03f, -7.261242746e-03f, -6.434833450e-03f, +6.413739816e-04f, +7.072864687e-03f, +6.732920928e-03f, +1.313855934e-03f, -2.581310828e-03f, -1.753299022e-03f, +8.835766843e-04f, +1.444002155e-03f, -3.844823356e-05f, -9.675369667e-04f, -3.256869626e-04f, +5.235689730e-04f, +3.989501581e-04f, -2.004216370e-04f, -3.225723242e-04f, +1.672415031e-05f, +2.008143956e-04f, +5.389403999e-05f, -9.637149550e-05f, -5.681040703e-05f, +3.279435594e-05f, +3.421848615e-05f, -6.281120501e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.652721470e-04f, +5.254670563e-04f, -7.673069041e-05f, -2.021343077e-03f, -9.007144999e-04f, +4.003846151e-03f, +3.528026906e-03f, -5.913320056e-03f, -8.336120182e-03f, +6.532189177e-03f, +1.519805960e-02f, -4.431853837e-03f, -2.305288241e-02f, -1.452336848e-03f, +2.998425141e-02f, +1.121519871e-02f, -3.372181825e-02f, -2.363755289e-02f, +3.242903756e-02f, +3.632696513e-02f, -2.547049237e-02f, -4.636746937e-02f, +1.381315467e-02f, +5.126299311e-02f, +1.535303363e-04f, -4.980113352e-02f, -1.334606571e-02f, +4.247512147e-02f, +2.298450154e-02f, -3.128555111e-02f, -2.745781254e-02f, +1.901295276e-02f, +2.671979587e-02f, -8.275610483e-03f, -2.209473228e-02f, +7.574587130e-04f, +1.563065907e-02f, +3.117280761e-03f, -9.312612588e-03f, -4.007564142e-03f, +4.463233262e-03f, +3.140265601e-03f, -1.524601036e-03f, -1.731524598e-03f, +1.028253700e-04f, +5.023812190e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.420592772e-05f, -1.278478377e-06f, +5.356478109e-05f, +4.123224846e-05f, -1.168416268e-04f, -1.321540652e-04f, +1.842133237e-04f, +3.041287796e-04f, -2.148275953e-04f, -5.618474442e-04f, +1.542432463e-04f, +8.766469271e-04f, +4.656973925e-05f, -1.183685991e-03f, -4.072137252e-04f, +1.395013665e-03f, +8.992957936e-04f, -1.426672350e-03f, -1.443564632e-03f, +1.230504856e-03f, +1.927343658e-03f, -8.173610248e-04f, -2.237927891e-03f, +2.605453583e-04f, +2.299706817e-03f, +3.238146663e-04f, -2.100049250e-03f, -8.127796729e-04f, +1.693164308e-03f, +1.114958710e-03f, -1.180449996e-03f, -1.196206297e-03f, +6.758064862e-04f, +1.083476215e-03f, -2.702399750e-04f, -8.473323064e-04f, +9.208901701e-06f, +5.723689113e-04f, +1.105777184e-04f, -3.285861621e-04f, -1.271229364e-04f, +1.543378622e-04f, +9.076854688e-05f, -5.474500924e-05f, -3.421848615e-05f, +6.281120501e-06f, +0.000000000e+00f, + /* 7,30 (48) */ + +0.000000000e+00f, -1.510662193e-04f, -5.241885780e-04f, +7.921668061e-05f, +1.360496485e-03f, +7.010510496e-04f, -2.297359916e-03f, -2.698582297e-03f, +2.508836561e-03f, +6.059881091e-03f, -7.020199266e-04f, -1.012854406e-02f, -4.522578569e-03f, +1.313674300e-02f, +1.409220310e-02f, -1.215017395e-02f, -2.790598409e-02f, +3.082970544e-03f, +4.463963834e-02f, +2.035840554e-02f, -6.235066979e-02f, -7.546977714e-02f, +8.201148479e-02f, +3.221045525e-01f, +4.280024613e-01f, +2.950178402e-01f, +5.396429631e-02f, -8.253821958e-02f, -5.256686283e-02f, +2.813515328e-02f, +4.176139561e-02f, -2.916164424e-03f, -2.826741316e-02f, -8.324980651e-03f, +1.572167095e-02f, +1.118895746e-02f, -6.282748031e-03f, -9.478354543e-03f, +6.431951462e-04f, +6.105753588e-03f, +1.707275443e-03f, -2.980419051e-03f, -1.931771853e-03f, +9.590379168e-04f, +1.247063583e-03f, -6.860688387e-05f, -5.086623395e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.395240629e-05f, +2.359131188e-06f, -3.849926784e-05f, -2.548962186e-05f, +6.898759360e-05f, +8.797104486e-05f, -8.037719661e-05f, -1.993642683e-04f, +2.871543078e-05f, +3.434541995e-04f, +1.387605929e-04f, -4.635448853e-04f, -4.627657440e-04f, +4.557867798e-04f, +9.459444776e-04f, -1.687455178e-04f, -1.528490732e-03f, -6.165977888e-04f, +2.054408452e-03f, +2.354278168e-03f, -2.041903873e-03f, -7.167524184e-03f, -6.576588681e-03f, +3.851071098e-04f, +6.959632173e-03f, +6.850181348e-03f, +1.493629345e-03f, -2.532396482e-03f, -1.831730441e-03f, +8.202888207e-04f, +1.468661393e-03f, +1.247875202e-05f, -9.648401929e-04f, -3.586215482e-04f, +5.100302025e-04f, +4.159446280e-04f, -1.858136918e-04f, -3.286002227e-04f, +5.622708085e-06f, +2.010276988e-04f, +6.052409654e-05f, -9.460233729e-05f, -5.994166238e-05f, +3.112411600e-05f, +3.536116739e-05f, -5.363231868e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.510662193e-04f, +5.241885780e-04f, -2.316590932e-05f, -1.980110829e-03f, -1.017556127e-03f, +3.871692085e-03f, +3.712240230e-03f, -5.609191277e-03f, -8.550947777e-03f, +5.970341733e-03f, +1.535230285e-02f, -3.555206910e-03f, -2.300631267e-02f, -2.636022839e-03f, +2.957703769e-02f, +1.261021237e-02f, -3.282252246e-02f, -2.506422524e-02f, +3.098547293e-02f, +3.755746999e-02f, -2.354314871e-02f, -4.718483039e-02f, +1.157522678e-02f, +5.152353847e-02f, +2.453237153e-03f, -4.947731885e-02f, -1.544611496e-02f, +4.166234180e-02f, +2.467766585e-02f, -3.017059240e-02f, -2.863826254e-02f, +1.781674647e-02f, +2.739560235e-02f, -7.192134268e-03f, -2.236497226e-02f, -8.987359339e-05f, +1.563986797e-02f, +3.689649672e-03f, -9.202034869e-03f, -4.336150304e-03f, +4.336110325e-03f, +3.294603463e-03f, -1.433832489e-03f, -1.786269607e-03f, +6.860688387e-05f, +5.086623395e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.395240629e-05f, -2.359131188e-06f, +5.177662578e-05f, +4.431058451e-05f, -1.118528453e-04f, -1.374100914e-04f, +1.730623710e-04f, +3.105441002e-04f, -1.940785686e-04f, -5.664150925e-04f, +1.211189995e-04f, +8.742896207e-04f, +9.276064125e-05f, -1.168061624e-03f, -4.639097211e-04f, +1.360169373e-03f, +9.603762505e-04f, -1.369090876e-03f, -1.500263071e-03f, +1.150799020e-03f, +1.970271063e-03f, -7.208850167e-04f, -2.259603869e-03f, +1.565431243e-04f, +2.296715000e-03f, +4.243447843e-04f, -2.074017417e-03f, -8.998052987e-04f, +1.650202515e-03f, +1.181780527e-03f, -1.129274547e-03f, -1.240686479e-03f, +6.252668419e-04f, +1.107813740e-03f, -2.271364703e-04f, -8.566381906e-04f, -2.291445353e-05f, +5.727039945e-04f, +1.314375733e-04f, -3.252146092e-04f, -1.387530092e-04f, +1.507233495e-04f, +9.617976463e-05f, -5.242115229e-05f, -3.536116739e-05f, +5.363231868e-06f, +0.000000000e+00f, + /* 7,31 (48) */ + +0.000000000e+00f, -1.371138130e-04f, -5.218294468e-04f, +4.071741277e-05f, +1.335006863e-03f, +7.700386432e-04f, -2.209388871e-03f, -2.778959494e-03f, +2.309472292e-03f, +6.088596521e-03f, -3.585657271e-04f, -9.989783468e-03f, -4.986123454e-03f, +1.267397725e-02f, +1.454798988e-02f, -1.120422947e-02f, -2.807472961e-02f, +1.554479812e-03f, +4.402304055e-02f, +2.241281399e-02f, -5.999639162e-02f, -7.751168101e-02f, +7.484396060e-02f, +3.155279638e-01f, +4.283875684e-01f, +3.019774723e-01f, +6.081447766e-02f, -8.104459023e-02f, -5.509925932e-02f, +2.630342283e-02f, +4.258168443e-02f, -1.447503031e-03f, -2.825493441e-02f, -9.289820844e-03f, +1.536304940e-02f, +1.169898766e-02f, -5.866803403e-03f, -9.664168235e-03f, +3.145949235e-04f, +6.111376296e-03f, +1.908303142e-03f, -2.919894955e-03f, -2.026374191e-03f, +8.990962544e-04f, +1.278187699e-03f, -3.324571648e-05f, -5.140255714e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.367129889e-05f, +3.401044618e-06f, -3.750518317e-05f, -2.747022415e-05f, +6.603770382e-05f, +9.040208288e-05f, -7.377878167e-05f, -2.003082109e-04f, +1.711613663e-05f, +3.390588754e-04f, +1.549617571e-04f, -4.482795641e-04f, -4.796149263e-04f, +4.237344909e-04f, +9.540569351e-04f, -1.161613155e-04f, -1.510974108e-03f, -6.867150942e-04f, +1.982443748e-03f, +2.418878930e-03f, -1.857870170e-03f, -7.067661105e-03f, -6.711386426e-03f, +1.284161757e-04f, +6.839105062e-03f, +6.961821842e-03f, +1.675039053e-03f, -2.478253380e-03f, -1.908165098e-03f, +7.546410229e-04f, +1.491008734e-03f, +6.404349089e-05f, -9.603516939e-04f, -3.913250279e-04f, +4.953746677e-04f, +4.324003844e-04f, -1.706534758e-04f, -3.341017752e-04f, -5.663638279e-06f, +2.008609397e-04f, +6.715667929e-05f, -9.261259788e-05f, -6.301990736e-05f, +2.934893968e-05f, +3.645794608e-05f, -4.402830756e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.371138130e-04f, +5.218294468e-04f, +2.861071646e-05f, -1.935800244e-03f, -1.129408972e-03f, +3.734281994e-03f, +3.885302601e-03f, -5.298647177e-03f, -8.745026346e-03f, +5.403926640e-03f, +1.547342185e-02f, -2.680917289e-03f, -2.291355203e-02f, -3.804084463e-03f, +2.911312797e-02f, +1.397038175e-02f, -3.186214621e-02f, -2.643331612e-02f, +2.948520986e-02f, +3.870826901e-02f, -2.157287765e-02f, -4.790571541e-02f, +9.315622911e-03f, +5.168008159e-02f, +4.749952153e-03f, -4.905297407e-02f, -1.752013237e-02f, +4.076253650e-02f, +2.632786837e-02f, -2.898881188e-02f, -2.976753709e-02f, +1.657605999e-02f, +2.802086920e-02f, -6.084320528e-03f, -2.259210873e-02f, -9.465117840e-04f, +1.561695352e-02f, +4.262353667e-03f, -9.070597296e-03f, -4.661364913e-03f, +4.197357316e-03f, +3.445326813e-03f, -1.337652724e-03f, -1.838690760e-03f, +3.324571648e-05f, +5.140255714e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.367129889e-05f, -3.401044618e-06f, +4.992298047e-05f, +4.720273898e-05f, -1.067364938e-04f, -1.422584669e-04f, +1.617501818e-04f, +3.161963751e-04f, -1.732332348e-04f, -5.697403375e-04f, +8.814437108e-05f, +8.701498844e-04f, +1.383111949e-04f, -1.150169523e-03f, -5.192197337e-04f, +1.322769487e-03f, +1.019137686e-03f, -1.308989800e-03f, -1.553665861e-03f, +1.068995934e-03f, +2.009071323e-03f, -6.230870902e-04f, -2.276646540e-03f, +5.221704922e-05f, +2.289024217e-03f, +5.241715658e-04f, -2.043673952e-03f, -9.852715527e-04f, +1.603675632e-03f, +1.246505957e-03f, -1.075471433e-03f, -1.282908753e-03f, +5.730390367e-04f, +1.130066542e-03f, -1.831321024e-04f, -8.642556210e-04f, -5.538729978e-05f, +5.718326359e-04f, +1.523377155e-04f, -3.210858882e-04f, -1.503045336e-04f, +1.466967147e-04f, +1.015072581e-04f, -4.990674596e-05f, -3.645794608e-05f, +4.402830756e-06f, +0.000000000e+00f, + /* 8, 0 (44) */ + +0.000000000e+00f, -5.810608668e-04f, -4.000691189e-04f, +1.473036739e-03f, +1.194314507e-03f, -2.873286720e-03f, -2.812546922e-03f, +4.814679451e-03f, +5.726744505e-03f, -7.245170423e-03f, -1.058087851e-02f, +1.001747038e-02f, +1.834373570e-02f, -1.289773969e-02f, -3.079950282e-02f, +1.559401954e-02f, +5.232680174e-02f, -1.780024775e-02f, -9.893335750e-02f, +1.924749700e-02f, +3.158555538e-01f, +4.802482832e-01f, +3.158555538e-01f, +1.924749700e-02f, -9.893335750e-02f, -1.780024775e-02f, +5.232680174e-02f, +1.559401954e-02f, -3.079950282e-02f, -1.289773969e-02f, +1.834373570e-02f, +1.001747038e-02f, -1.058087851e-02f, -7.245170423e-03f, +5.726744505e-03f, +4.814679451e-03f, -2.812546922e-03f, -2.873286720e-03f, +1.194314507e-03f, +1.473036739e-03f, -4.000691189e-04f, -5.810608668e-04f, +8.174592653e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.055780628e-05f, -3.848735070e-05f, -5.408411680e-05f, +8.314785430e-05f, +1.202249485e-04f, -1.466740772e-04f, -2.377308607e-04f, +2.260407756e-04f, +4.318552366e-04f, -3.122425653e-04f, -7.387415145e-04f, +3.873126573e-04f, +1.218865262e-03f, -4.155373014e-04f, -2.001146980e-03f, +3.044894664e-04f, +3.463524932e-03f, +3.686348989e-04f, -7.485993408e-03f, -9.128129279e-03f, -1.806332249e-04f, +8.988032967e-03f, +7.690748195e-03f, -1.512011525e-04f, -3.487874864e-03f, -4.287778866e-04f, +1.995704894e-03f, +4.918364215e-04f, -1.206608172e-03f, -4.348372014e-04f, +7.264350323e-04f, +3.413037314e-04f, -4.218703204e-04f, -2.431061282e-04f, +2.306814620e-04f, +1.561170982e-04f, -1.158881642e-04f, -8.797140009e-05f, +5.185638397e-05f, +4.069879002e-05f, -1.973251484e-05f, -1.241779730e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.810608668e-04f, +4.000691189e-04f, -2.174762082e-03f, -1.369356920e-03f, +4.931706478e-03f, +2.614276448e-03f, -9.249493921e-03f, -4.085126069e-03f, +1.521344320e-02f, +5.480993556e-03f, -2.257913432e-02f, -6.427039238e-03f, +3.073327098e-02f, +6.578871207e-03f, -3.875145264e-02f, -5.735049828e-03f, +4.555317997e-02f, +3.918145659e-03f, -5.012182275e-02f, -1.392488435e-03f, +5.173229864e-02f, -1.392488435e-03f, -5.012182275e-02f, +3.918145659e-03f, +4.555317997e-02f, -5.735049828e-03f, -3.875145264e-02f, +6.578871207e-03f, +3.073327098e-02f, -6.427039238e-03f, -2.257913432e-02f, +5.480993556e-03f, +1.521344320e-02f, -4.085126069e-03f, -9.249493921e-03f, +2.614276448e-03f, +4.931706478e-03f, -1.369356920e-03f, -2.174762082e-03f, +5.133746463e-04f, +5.810608668e-04f, -8.174592653e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.055780628e-05f, +3.848735070e-05f, +7.767317955e-05f, -1.452272650e-04f, -1.550874398e-04f, +3.095240124e-04f, +2.539588194e-04f, -5.576059524e-04f, -3.584684405e-04f, +8.884770433e-04f, +4.455839699e-04f, -1.282216489e-03f, -4.906064529e-04f, +1.699715456e-03f, +4.743906180e-04f, -2.087962664e-03f, -3.898920508e-04f, +2.390160510e-03f, +2.456691656e-04f, -2.558217123e-03f, -6.486431433e-05f, +2.564123150e-03f, -1.202879539e-04f, -2.406829384e-03f, +2.767965642e-04f, +2.112517436e-03f, -3.794418868e-04f, -1.728177459e-03f, +4.167838078e-04f, +1.310459866e-03f, -3.928611841e-04f, -9.131253679e-04f, +3.243325880e-04f, +5.766242397e-04f, -2.343593103e-04f, -3.223784588e-04f, +1.455110959e-04f, +1.526349625e-04f, -7.405458027e-05f, -5.496512532e-05f, +1.973251484e-05f, +1.241779730e-05f, +0.000000000e+00f, + /* 8, 1 (44) */ + +0.000000000e+00f, -5.605030605e-04f, -4.385564696e-04f, +1.418952622e-03f, +1.277462361e-03f, -2.753061772e-03f, -2.959221000e-03f, +4.576948590e-03f, +5.952785281e-03f, -6.813315187e-03f, -1.089312107e-02f, +9.278728870e-03f, +1.873104835e-02f, -1.167887442e-02f, -3.121504012e-02f, +1.359287256e-02f, +5.263129120e-02f, -1.433672282e-02f, -9.856472261e-02f, +1.176150359e-02f, +3.067274245e-01f, +4.800676500e-01f, +3.248435867e-01f, +2.693824519e-02f, -9.908455866e-02f, -2.128812261e-02f, +5.189802385e-02f, +1.758972443e-02f, -3.030766640e-02f, -1.410434786e-02f, +1.790889849e-02f, +1.074390542e-02f, -1.023957477e-02f, -7.667040744e-03f, +5.483638377e-03f, +5.045360913e-03f, -2.656429824e-03f, -2.989174884e-03f, +1.106343107e-03f, +1.524893123e-03f, -3.593703289e-04f, -6.007933817e-04f, +6.932812923e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.129703629e-05f, -3.623810225e-05f, -5.612101223e-05f, +7.822891266e-05f, +1.241869104e-04f, -1.370602814e-04f, -2.441037719e-04f, +2.087281453e-04f, +4.406935626e-04f, -2.828937322e-04f, -7.491921922e-04f, +3.395733510e-04f, +1.228207727e-03f, -3.393868463e-04f, -2.002069348e-03f, +1.815279258e-04f, +3.432201781e-03f, +5.803880719e-04f, -7.274526133e-03f, -9.256347174e-03f, -5.416502342e-04f, +8.836192550e-03f, +7.888409201e-03f, +7.163281020e-05f, -3.505077189e-03f, -5.541453813e-04f, +1.985688665e-03f, +5.681144816e-04f, -1.191423856e-03f, -4.820347566e-04f, +7.122748442e-04f, +3.700051028e-04f, -4.107447354e-04f, -2.598795924e-04f, +2.229608930e-04f, +1.653631379e-04f, -1.111798319e-04f, -9.268517436e-05f, +4.943904653e-05f, +4.286525175e-05f, -1.882096265e-05f, -1.327735794e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.605030605e-04f, +4.385564696e-04f, -2.097088902e-03f, -1.514584185e-03f, +4.776619039e-03f, +2.923800461e-03f, -8.995535102e-03f, -4.642732022e-03f, +1.485497475e-02f, +6.369470600e-03f, -2.213355035e-02f, -7.709255728e-03f, +3.024266452e-02f, +8.278586662e-03f, -3.827706203e-02f, -7.823012491e-03f, +4.516328792e-02f, +6.308306169e-03f, -4.987615359e-02f, -3.950705558e-03f, +5.166743433e-02f, +1.171634715e-03f, -5.024211071e-02f, +1.511316275e-03f, +4.582997653e-02f, -3.622532391e-03f, -3.913089453e-02f, +4.850693747e-03f, +3.115005478e-02f, -5.116579372e-03f, -2.297199551e-02f, +4.567868188e-03f, +1.553777578e-02f, -3.508501830e-03f, -9.483853231e-03f, +2.291897989e-03f, +5.077217574e-03f, -1.216721958e-03f, -2.248816662e-03f, +4.584095210e-04f, +6.007933817e-04f, -6.932812923e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.129703629e-05f, +3.623810225e-05f, +8.096929242e-05f, -1.376061596e-04f, -1.640445681e-04f, +2.960972531e-04f, +2.725676232e-04f, -5.374266916e-04f, -3.912278939e-04f, +8.618392464e-04f, +4.966166449e-04f, -1.250960538e-03f, -5.625883596e-04f, +1.667127252e-03f, +5.675804767e-04f, -2.058226523e-03f, -5.015668458e-04f, +2.367477734e-03f, +3.701898939e-04f, -2.545828660e-03f, -1.944264780e-04f, +2.563525537e-03f, +5.633100092e-06f, -2.417424508e-03f, +1.625664531e-04f, +2.131802680e-03f, -2.829697519e-04f, -1.752411078e-03f, +3.412978666e-04f, +1.335589277e-03f, -3.385690670e-04f, -9.356957414e-04f, +2.888928305e-04f, +5.944132943e-04f, -2.138056599e-04f, -3.346144730e-04f, +1.353292048e-04f, +1.598027048e-04f, -7.011533139e-05f, -5.833250182e-05f, +1.882096265e-05f, +1.327735794e-05f, +0.000000000e+00f, + /* 8, 2 (44) */ + +0.000000000e+00f, -5.392060243e-04f, -4.747945719e-04f, +1.362831610e-03f, +1.355691274e-03f, -2.628874861e-03f, -3.096281281e-03f, +4.332844818e-03f, +6.161513426e-03f, -6.372621624e-03f, -1.117601480e-02f, +8.529536678e-03f, +1.907062170e-02f, -1.045066670e-02f, -3.155442696e-02f, +1.159080321e-02f, +5.281281913e-02f, -1.090452104e-02f, -9.798433453e-02f, +4.486977456e-03f, +2.974710773e-01f, +4.795259998e-01f, +3.336797793e-01f, +3.482665439e-02f, -9.901292585e-02f, -2.479319980e-02f, +5.134387847e-02f, +1.957541309e-02f, -2.973955191e-02f, -1.529577171e-02f, +1.742686374e-02f, +1.145618026e-02f, -9.869569671e-03f, -8.077785479e-03f, +5.223758785e-03f, +5.268321806e-03f, -2.491066686e-03f, -3.100354716e-03f, +1.013657932e-03f, +1.574332169e-03f, -3.165050772e-04f, -6.196143443e-04f, +5.605077129e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.195065330e-05f, -3.395813985e-05f, -5.796636668e-05f, +7.322889637e-05f, +1.277717665e-04f, -1.273018687e-04f, -2.497965870e-04f, +1.912127353e-04f, +4.483821483e-04f, -2.533289979e-04f, -7.577892523e-04f, +2.917304806e-04f, +1.234654531e-03f, -2.635521593e-04f, -1.998535394e-03f, +6.013471407e-05f, +3.394090501e-03f, +7.861933153e-04f, -7.056735594e-03f, -9.372571504e-03f, -9.019193399e-04f, +8.672761342e-03f, +8.078603771e-03f, +2.995740239e-04f, -3.514968676e-03f, -6.803382136e-04f, +1.971053077e-03f, +6.441994771e-04f, -1.173306186e-03f, -5.287923119e-04f, +6.962673879e-04f, +3.982743552e-04f, -3.984872011e-04f, -2.763165514e-04f, +2.145761941e-04f, +1.743860058e-04f, -1.061042274e-04f, -9.727478371e-05f, +4.683387456e-05f, +4.497951281e-05f, -1.782320644e-05f, -1.412815468e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.392060243e-04f, +4.747945719e-04f, -2.016119610e-03f, -1.652190345e-03f, +4.612574470e-03f, +3.219897714e-03f, -8.722967479e-03f, -5.180158713e-03f, +1.446374686e-02f, +7.231309846e-03f, -2.163693371e-02f, -8.960216265e-03f, +2.968007616e-02f, +9.945713914e-03f, -3.770948155e-02f, -9.881239015e-03f, +4.466172107e-02f, +8.675783903e-03f, -4.950596369e-02f, -6.496534218e-03f, +5.147300785e-02f, +3.735160252e-03f, -5.023647761e-02f, -9.061082325e-04f, +4.599254299e-02f, -1.490729711e-03f, -3.941386428e-02f, +3.098282669e-03f, +3.149135265e-02f, -3.780990095e-03f, -2.331056457e-02f, +3.632172447e-03f, +1.582666861e-02f, -2.914088535e-03f, -9.697658891e-03f, +1.957283516e-03f, +5.212546779e-03f, -1.056919253e-03f, -2.318931993e-03f, +4.000770192e-04f, +6.196143443e-04f, -5.605077129e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.195065330e-05f, +3.395813985e-05f, +8.394210187e-05f, -1.297982064e-04f, -1.723708327e-04f, +2.821450487e-04f, +2.901524419e-04f, -5.161568565e-04f, -4.225430608e-04f, +8.333047132e-04f, +5.458441169e-04f, -1.216800403e-03f, -6.325582952e-04f, +1.630525108e-03f, +6.587819237e-04f, -2.023410232e-03f, -6.115396462e-04f, +2.338856349e-03f, +4.935323277e-04f, -2.526995766e-03f, -3.234896838e-04f, +2.556419947e-03f, +1.317713624e-04f, -2.421901676e-03f, +4.749181134e-05f, +2.145743589e-03f, -1.852150214e-04f, -1.772324548e-03f, +2.643318554e-04f, +1.357510663e-03f, -2.828338165e-04f, -9.561042310e-04f, +2.522261286e-04f, +6.109072174e-04f, -1.923376664e-04f, -3.461868290e-04f, +1.245574544e-04f, +1.667040381e-04f, -6.585830902e-05f, -6.163946680e-05f, +1.782320644e-05f, +1.412815468e-05f, +0.000000000e+00f, + /* 8, 3 (44) */ + +0.000000000e+00f, -5.172553710e-04f, -5.087527117e-04f, +1.304865243e-03f, +1.428920170e-03f, -2.501103095e-03f, -3.223583150e-03f, +4.083048231e-03f, +6.352726162e-03f, -5.924239476e-03f, -1.142934380e-02f, +7.771747426e-03f, +1.936235218e-02f, -9.216012166e-03f, -3.181797912e-02f, +9.592267814e-03f, +5.287295384e-02f, -7.510430536e-03f, -9.719814122e-02f, -2.569758138e-03f, +2.880985058e-01f, +4.786240804e-01f, +3.423525406e-01f, +4.290525816e-02f, -9.871335182e-02f, -2.830816848e-02f, +5.066354025e-02f, +2.154646617e-02f, -2.909535244e-02f, -1.646907790e-02f, +1.689807143e-02f, +1.215244765e-02f, -9.471295316e-03f, -8.476272680e-03f, +4.947442234e-03f, +5.482898000e-03f, -2.316680681e-03f, -3.206458944e-03f, +9.163831487e-04f, +1.621166044e-03f, -2.715255644e-04f, -6.374375508e-04f, +4.192261661e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.251934746e-05f, -3.165446722e-05f, -5.961999631e-05f, +6.816203638e-05f, +1.309782120e-04f, -1.174248849e-04f, -2.548073873e-04f, +1.735388265e-04f, +4.549205816e-04f, -2.236196045e-04f, -7.645391042e-04f, +2.438939764e-04f, +1.238230873e-03f, -1.881973897e-04f, -1.990617239e-03f, -5.945548166e-05f, +3.349386414e-03f, +9.857966404e-04f, -6.833018219e-03f, -9.476706422e-03f, -1.260943332e-03f, +8.497911455e-03f, +8.260968595e-03f, +5.323173350e-04f, -3.517397689e-03f, -8.070971557e-04f, +1.951762343e-03f, +7.199174749e-04f, -1.152255607e-03f, -5.749963216e-04f, +6.784234845e-04f, +4.260391358e-04f, -3.851092549e-04f, -2.923724898e-04f, +2.055361406e-04f, +1.831595935e-04f, -1.006666355e-04f, -1.017258544e-04f, +4.404318231e-05f, +4.703431483e-05f, -1.673956517e-05f, -1.496697687e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.172553710e-04f, +5.087527117e-04f, -1.932177508e-03f, -1.781988551e-03f, +4.440203638e-03f, +3.502042762e-03f, -8.432815037e-03f, -5.696315570e-03f, +1.404120380e-02f, +8.064614559e-03f, -2.109108959e-02f, -1.017701667e-02f, +2.904751787e-02f, +1.157623902e-02f, -3.705069963e-02f, -1.190464925e-02f, +4.405018143e-02f, +1.101464025e-02f, -4.901243137e-02f, -9.023529984e-03f, +5.114951817e-02f, +6.291580199e-03f, -5.010470624e-02f, -3.328009908e-03f, +4.604003480e-02f, +6.550138773e-04f, -3.959907930e-02f, +1.325958121e-03f, +3.175568451e-02f, -2.423479432e-03f, -2.359339839e-02f, +2.676068216e-03f, +1.607889474e-02f, -2.303181318e-03f, -9.889996558e-03f, +1.611096687e-03f, +5.337104233e-03f, -8.902152149e-04f, -2.384790302e-03f, +3.384375524e-04f, +6.374375508e-04f, -4.192261661e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.251934746e-05f, +3.165446722e-05f, +8.659178844e-05f, -1.218299000e-04f, -1.800565991e-04f, +2.677148706e-04f, +3.066833210e-04f, -4.938687636e-04f, -4.523507860e-04f, +8.029701393e-04f, +5.931572319e-04f, -1.179851125e-03f, -7.003516420e-04f, +1.590031001e-03f, +7.477719213e-04f, -1.983627737e-03f, -7.195346339e-04f, +2.304386847e-03f, +6.153823148e-04f, -2.501773131e-03f, -4.517227478e-04f, +2.542818943e-03f, +2.578030512e-04f, -2.420232485e-03f, -6.813399060e-05f, +2.154278965e-03f, -8.642323395e-05f, -1.787836834e-03f, +1.860743392e-04f, +1.376137616e-03f, -2.257867632e-04f, -9.742717304e-04f, +2.144137544e-04f, +6.260426865e-04f, -1.699983012e-04f, -3.570513405e-04f, +1.132135465e-04f, +1.733126841e-04f, -6.128744519e-05f, -6.487345079e-05f, +1.673956517e-05f, +1.496697687e-05f, +0.000000000e+00f, + /* 8, 4 (44) */ + +0.000000000e+00f, -4.947360235e-04f, -5.404071790e-04f, +1.245245247e-03f, +1.497082207e-03f, -2.370124883e-03f, -3.341008035e-03f, +3.828240844e-03f, +6.526264988e-03f, -5.469318894e-03f, -1.165296341e-02f, +7.007208321e-03f, +1.960624616e-02f, -7.977781293e-03f, -3.200617651e-02f, +7.601650574e-03f, +5.281349836e-02f, -4.161044122e-03f, -9.621234458e-02f, -9.402776357e-03f, +2.786217994e-01f, +4.773631371e-01f, +3.508504521e-01f, +5.116622676e-02f, -9.818103449e-02f, -3.182556617e-02f, +4.985644310e-02f, +2.349822851e-02f, -2.837543496e-02f, -1.762133351e-02f, +1.632307510e-02f, +1.283087113e-02f, -9.045256180e-03f, -8.861381935e-03f, +4.655069744e-03f, +5.688434141e-03f, -2.133521087e-03f, -3.307125579e-03f, +8.146572943e-04f, +1.665209226e-03f, -2.244912495e-04f, -6.541771159e-04f, +2.695563973e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.300404255e-05f, -2.933397920e-05f, -6.108222644e-05f, +6.304243838e-05f, +1.338059061e-04f, -1.074552011e-04f, -2.591359210e-04f, +1.557503799e-04f, +4.603111501e-04f, -1.938361112e-04f, -7.694523085e-04f, +1.961722680e-04f, +1.238968054e-03f, -1.134834115e-04f, -1.978395458e-03f, -1.770151251e-04f, +3.298294587e-03f, +1.178957764e-03f, -6.603776907e-03f, -9.568675473e-03f, -1.618227086e-03f, +8.311833564e-03f, +8.435150394e-03f, +7.695458477e-04f, -3.512224607e-03f, -9.341579451e-04f, +1.927790301e-03f, +7.950929731e-04f, -1.128279224e-03f, -6.205329591e-04f, +6.587583729e-04f, +4.532272335e-04f, -3.706252664e-04f, -3.080031036e-04f, +1.958512485e-04f, +1.916579412e-04f, -9.487335522e-05f, -1.060240704e-04f, +4.106983364e-05f, +4.902238392e-05f, -1.557062569e-05f, -1.579055794e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.947360235e-04f, +5.404071790e-04f, -1.845585719e-03f, -1.903818451e-03f, +4.260147039e-03f, +3.769757633e-03f, -8.126131716e-03f, -6.190184334e-03f, +1.358885301e-02f, +8.867584699e-03f, -2.049793236e-02f, -1.135686779e-02f, +2.834716623e-02f, +1.316627002e-02f, -3.630292770e-02f, -1.388827698e-02f, +4.333064679e-02f, +1.331902710e-02f, -4.839704905e-02f, -1.152530311e-02f, +5.069779542e-02f, +8.834399142e-03f, -4.984690319e-02f, -5.748242393e-03f, +4.597190081e-02f, +2.809292843e-03f, -3.968550254e-02f, -4.618787135e-04f, +3.194175885e-02f, -1.047341816e-03f, -2.381918515e-02f, +1.701796486e-03f, +1.629330850e-02f, -1.677138632e-03f, -1.005999486e-02f, +1.254045347e-03f, +5.450317780e-03f, -7.169025308e-04f, -2.446077748e-03f, +2.735641016e-04f, +6.541771159e-04f, -2.695563973e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.300404255e-05f, +2.933397920e-05f, +8.891950538e-05f, -1.137275915e-04f, -1.870942350e-04f, +2.528546485e-04f, +3.221336618e-04f, -4.706364215e-04f, -4.805927579e-04f, +7.709358742e-04f, +6.384530061e-04f, -1.140234026e-03f, -7.658107828e-04f, +1.545776231e-03f, +8.343344836e-04f, -1.939005358e-03f, -8.252821801e-04f, +2.264174645e-03f, +7.354301793e-04f, -2.470231970e-03f, -5.787966648e-04f, +2.522751965e-03f, +3.834040852e-04f, -2.412404450e-03f, -1.840150670e-04f, +2.157361451e-03f, +1.315596484e-05f, -1.798877921e-03f, +1.067187602e-04f, +1.391391680e-03f, -1.675640669e-04f, -9.901242290e-04f, +1.755411240e-04f, +6.397591682e-04f, -1.468336382e-04f, -3.671650045e-04f, +1.013171845e-04f, +1.796026234e-04f, -5.640774150e-05f, -6.802174843e-05f, +1.557062569e-05f, +1.579055794e-05f, +0.000000000e+00f, + /* 8, 5 (44) */ + +0.000000000e+00f, -4.717319809e-04f, -5.697411582e-04f, +1.184163020e-03f, +1.560124645e-03f, -2.236318977e-03f, -3.448463236e-03f, +3.569104923e-03f, +6.682015368e-03f, -5.009007744e-03f, -1.184679952e-02f, +6.237756013e-03f, +1.980241843e-02f, -6.738813239e-03f, -3.211965993e-02f, +5.623255116e-03f, +5.263648323e-02f, -8.627495342e-04f, -9.503338681e-02f, -1.600655326e-02f, +2.690531239e-01f, +4.757449100e-01f, +3.591622856e-01f, +5.960137715e-02f, -9.741148864e-02f, -3.533779078e-02f, +4.892228515e-02f, +2.542601882e-02f, -2.758034199e-02f, -1.874961273e-02f, +1.570254214e-02f, +1.348962951e-02f, -8.592028947e-03f, -9.232007201e-03f, +4.347066640e-03f, +5.884285389e-03f, -1.941863146e-03f, -3.401998934e-03f, +7.086332239e-04f, +1.706279060e-03f, -1.754688656e-04f, -6.697477416e-04f, +1.116508179e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.340588755e-05f, -2.700344492e-05f, -6.235387979e-05f, +5.788404891e-05f, +1.362554549e-04f, -9.741845355e-05f, -2.627835768e-04f, +1.378909369e-04f, +4.645587956e-04f, -1.640482395e-04f, -7.725434958e-04f, +1.486720570e-04f, +1.236903324e-03f, -3.956751245e-05f, -1.961958798e-03f, -2.923242001e-04f, +3.241029330e-03f, +1.365450418e-03f, -6.369420286e-03f, -9.648421663e-03f, -1.973278391e-03f, +8.114736642e-03f, +8.600806591e-03f, +1.010931395e-03f, -3.499322218e-03f, -1.061251757e-03f, +1.899120603e-03f, +8.695492688e-04f, -1.101390868e-03f, -6.652883750e-04f, +6.372917343e-04f, +4.797667512e-04f, -3.550524448e-04f, -3.231644100e-04f, +1.855337779e-04f, +1.998553052e-04f, -8.873170256e-05f, -1.101552123e-04f, +3.791724618e-05f, +5.093645098e-05f, -1.431724768e-05f, -1.659558457e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.717319809e-04f, +5.697411582e-04f, -1.756666214e-03f, -2.017546043e-03f, +4.073052804e-03f, +4.022612281e-03f, -7.803998054e-03f, -6.660820755e-03f, +1.310826026e-02f, +9.638520573e-03f, -1.985947935e-02f, -1.249710182e-02f, +2.758135544e-02f, +1.471204625e-02f, -3.546859322e-02f, -1.582728234e-02f, +4.250536461e-02f, +1.558320174e-02f, -4.766161887e-02f, -1.399553509e-02f, +5.011899875e-02f, +1.135715111e-02f, -4.946349911e-02f, -8.160646843e-03f, +4.578788574e-02f, +4.966654293e-03f, -3.967234657e-02f, -2.260756634e-03f, +3.204847761e-02f, +3.440498641e-04f, -2.398674922e-02f, +7.116722567e-04f, +1.646884962e-02f, -1.037379463e-03f, -1.020682850e-02f, +8.868803424e-04f, +5.551634964e-03f, -5.372999074e-04f, -2.502485489e-03f, +2.055423531e-04f, +6.697477416e-04f, -1.116508179e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.340588755e-05f, +2.700344492e-05f, +9.092735126e-05f, -1.055174142e-04f, -1.934780934e-04f, +2.376126283e-04f, +3.364802418e-04f, -4.465353040e-04f, -5.072156049e-04f, +7.373056101e-04f, +6.816348387e-04f, -1.098076332e-03f, -8.287854638e-04f, +1.497901017e-03f, +9.182612062e-04f, -1.889681393e-03f, -9.285195307e-04f, +2.218339760e-03f, +8.533715254e-04f, -2.432459817e-03f, -7.043854709e-04f, +2.496265270e-03f, +5.082509356e-04f, -2.398421082e-03f, -2.998537883e-04f, +2.154957710e-03f, +1.132694617e-04f, -1.805389067e-03f, +2.646295790e-05f, +1.403202629e-03f, -1.083063974e-04f, -1.003593071e-03f, +1.356976152e-04f, +6.519991251e-04f, -1.228927735e-04f, -3.764861458e-04f, +8.889005515e-05f, +1.855481789e-04f, -5.122527963e-05f, -7.107155702e-05f, +1.431724768e-05f, +1.659558457e-05f, +0.000000000e+00f, + /* 8, 6 (44) */ + +0.000000000e+00f, -4.483260934e-04f, -5.967446031e-04f, +1.121809141e-03f, +1.618008694e-03f, -2.100063522e-03f, -3.545881689e-03f, +3.306321346e-03f, +6.819906305e-03f, -4.544448948e-03f, -1.201084776e-02f, +5.465212517e-03f, +1.995109049e-02f, -5.501909915e-03f, -3.215922744e-02f, +3.661296318e-03f, +5.234415903e-02f, +2.378279796e-03f, -9.366793640e-02f, -2.237597355e-02f, +2.594047022e-01f, +4.737716316e-01f, +3.672770223e-01f, +6.820218374e-02f, -9.640055725e-02f, -3.883711299e-02f, +4.786103340e-02f, +2.732513942e-02f, -2.671079272e-02f, -1.985100360e-02f, +1.503725377e-02f, +1.412692124e-02f, -8.112262196e-03f, -9.587059646e-03f, +4.023902230e-03f, +6.069819167e-03f, -1.742007841e-03f, -3.490730637e-03f, +5.984780117e-04f, +1.744196306e-03f, -1.245324146e-04f, -6.840649893e-04f, -5.430502781e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.372624758e-05f, -2.466949175e-05f, -6.343626354e-05f, +5.270062244e-05f, +1.383283922e-04f, -8.733998399e-05f, -2.657533541e-04f, +1.200035216e-04f, +4.676710644e-04f, -1.343247226e-04f, -7.738312790e-04f, +1.014980978e-04f, +1.232079723e-03f, +3.339690446e-05f, -1.941403888e-03f, -4.051705618e-04f, +3.177813682e-03f, +1.545062632e-03f, -6.130361963e-03f, -9.715907479e-03f, -2.325608775e-03f, +7.906847652e-03f, +8.757605971e-03f, +1.256135034e-03f, -3.478576103e-03f, -1.188105689e-03f, +1.865746873e-03f, +9.431088328e-04f, -1.071611160e-03f, -7.091489576e-04f, +6.140477072e-04f, +5.055862801e-04f, -3.384108386e-04f, -3.378128593e-04f, +1.745977306e-04f, +2.077262260e-04f, -8.225001081e-05f, -1.141051959e-04f, +3.458939389e-05f, +5.276927238e-05f, -1.298056784e-05f, -1.737870626e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.483260934e-04f, +5.967446031e-04f, -1.665738863e-03f, -2.123063457e-03f, +3.879574710e-03f, +4.260224910e-03f, -7.467517812e-03f, -7.107356059e-03f, +1.260104465e-02f, +1.037582618e-02f, -1.917784451e-02f, -1.359517815e-02f, +2.675256998e-02f, +1.620994727e-02f, -3.455033201e-02f, -1.771696373e-02f, +4.157684508e-02f, +1.780154150e-02f, -4.680824735e-02f, -1.642799490e-02f, +4.941461328e-02f, +1.385341638e-02f, -4.895524817e-02f, -1.055906793e-02f, +4.548803195e-02f, +7.121612003e-03f, -3.955907711e-02f, -4.066145701e-03f, +3.207494056e-02f, +1.747252493e-03f, -2.409505562e-02f, -2.919208143e-04f, +1.660454724e-02f, -3.853803383e-04f, -1.032972127e-02f, +5.103941965e-04f, +5.640525020e-03f, -3.517517285e-04f, -2.553710769e-03f, +1.344707961e-04f, +6.840649893e-04f, +5.430502781e-06f, +0.000000000e+00f, + +0.000000000e+00f, -2.372624758e-05f, +2.466949175e-05f, +9.261834034e-05f, -9.722521034e-05f, -1.992044890e-04f, +2.220372295e-04f, +3.497032258e-04f, -4.216421221e-04f, -5.321709771e-04f, +7.021860642e-04f, +7.226127060e-04f, -1.053510781e-03f, -8.891331350e-04f, +1.446554062e-03f, +9.993517718e-04f, -1.835805697e-03f, -1.028991470e-03f, +2.167016456e-03f, +9.689080262e-04f, -2.388560283e-03f, -8.281670986e-04f, +2.463421819e-03f, +6.320214768e-04f, -2.378301921e-03f, -4.153515593e-04f, +2.147048585e-03f, +2.136613268e-04f, -1.807323043e-03f, -5.449132512e-05f, +1.411508730e-03f, -4.815859980e-05f, -1.014615202e-03f, +9.497637221e-05f, +6.627082172e-04f, -9.822773494e-05f, -3.849745594e-04f, +7.595580378e-05f, +1.911241015e-04f, -4.574722876e-05f, -7.401001638e-05f, +1.298056784e-05f, +1.737870626e-05f, +0.000000000e+00f, + /* 8, 7 (44) */ + +0.000000000e+00f, -4.245998458e-04f, -6.214140948e-04f, +1.058372877e-03f, +1.670709316e-03f, -1.961735130e-03f, -3.633221673e-03f, +3.040567992e-03f, +6.939909826e-03f, -4.076777884e-03f, -1.214517248e-02f, +4.691381238e-03f, +2.005258858e-02f, -4.269830192e-03f, -3.212583053e-02f, +1.719892430e-03f, +5.193898847e-02f, +5.556093478e-03f, -9.212287376e-02f, -2.850633551e-02f, +2.496887948e-01f, +4.714460229e-01f, +3.751838699e-01f, +7.695978971e-02f, -9.514442221e-02f, -4.231568910e-02f, +4.667292771e-02f, +2.919088629e-02f, -2.576768389e-02f, -2.092261476e-02f, +1.432810481e-02f, +1.474096895e-02f, -7.606675916e-03f, -9.925470485e-03f, +3.686089371e-03f, +6.244416898e-03f, -1.534281615e-03f, -3.572980648e-03f, +4.843728157e-04f, +1.778785700e-03f, -7.176314224e-05f, -6.970455571e-04f, -2.280920904e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.396669449e-05f, -2.233858996e-05f, -6.433115545e-05f, +4.750568960e-05f, +1.400271590e-04f, -7.724478239e-05f, -2.680498294e-04f, +1.021305455e-04f, +4.696580509e-04f, -1.047331584e-04f, -7.733381554e-04f, +5.475298431e-05f, +1.224545909e-03f, +1.052606080e-04f, -1.916834922e-03f, -5.153502663e-04f, +3.108878884e-03f, +1.717596983e-03f, -5.887019779e-03f, -9.771114886e-03f, -2.674734318e-03f, +7.688411219e-03f, +8.905229318e-03f, +1.504807565e-03f, -3.449884991e-03f, -1.314443263e-03f, +1.827672860e-03f, +1.015593691e-03f, -1.038967548e-03f, -7.520015975e-04f, +5.890548917e-04f, +5.306150743e-04f, -3.207233305e-04f, -3.519054467e-04f, +1.630588444e-04f, +2.152455967e-04f, -7.543762803e-05f, -1.178601126e-04f, +3.109080837e-05f, +5.451365104e-05f, -1.156200341e-05f, -1.813654524e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.245998458e-04f, +6.214140948e-04f, -1.573120522e-03f, -2.220288667e-03f, +3.680370221e-03f, +4.482262139e-03f, -7.117814586e-03f, -7.528998181e-03f, +1.206887367e-02f, +1.107801225e-02f, -1.845523181e-02f, -1.464868893e-02f, +2.586343685e-02f, +1.765650133e-02f, -3.355098024e-02f, -1.955276943e-02f, +4.054785361e-02f, +1.996855796e-02f, -4.583933932e-02f, -1.881655519e-02f, +4.858644618e-02f, +1.631683820e-02f, -4.832322670e-02f, -1.293736985e-02f, +4.507268039e-02f, +9.268660589e-03f, -3.934541578e-02f, -5.873468744e-03f, +3.202044924e-02f, +3.158761223e-03f, -2.414321422e-02f, -1.306536016e-03f, +1.669952361e-02f, +2.773278789e-04f, -1.042794901e-02f, +1.254196371e-04f, +5.716480823e-03f, -1.606276271e-04f, -2.599457997e-03f, +6.046077973e-05f, +6.970455571e-04f, +2.280920904e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.396669449e-05f, +2.233858996e-05f, +9.399637063e-05f, -8.887646084e-05f, -2.042716706e-04f, +2.061769061e-04f, +3.617861668e-04f, -3.960345967e-04f, -5.554156132e-04f, +6.656866567e-04f, +7.613033350e-04f, -1.006675221e-03f, -9.467192680e-04f, +1.391892103e-03f, +1.077414432e-03f, -1.777539236e-03f, -1.126450964e-03f, +2.110352850e-03f, +1.081748194e-03f, -2.338652763e-03f, -9.498242216e-04f, +2.424301130e-03f, +7.543958355e-04f, -2.352082522e-03f, -5.302096033e-04f, +2.133629210e-03f, +3.140734770e-04f, -1.804644322e-03f, -1.359389520e-04f, +1.416256979e-03f, +1.273065514e-05f, -1.023133402e-03f, +5.347409763e-05f, +6.718354979e-04f, -7.289338143e-05f, -3.925916505e-04f, +6.254000361e-05f, +1.963056544e-04f, -3.998184953e-05f, -7.682424980e-05f, +1.156200341e-05f, +1.813654524e-05f, +0.000000000e+00f, + /* 8, 8 (44) */ + +0.000000000e+00f, -4.006331513e-04f, -6.437526848e-04f, +9.940417215e-04f, +1.718215006e-03f, -1.821707971e-03f, -3.710466456e-03f, +2.772518163e-03f, +7.042040372e-03f, -3.607119833e-03f, -1.224990564e-02f, +3.918043083e-03f, +2.010734157e-02f, -3.045284283e-03f, -3.202056993e-02f, -1.969424922e-04f, +5.142363821e-02f, +8.664972362e-03f, -9.040527678e-02f, -3.439335529e-02f, +2.399176799e-01f, +4.687712885e-01f, +3.828722811e-01f, +8.586501903e-02f, -9.363961465e-02f, -4.576557409e-02f, +4.535848444e-02f, +3.101855915e-02f, -2.475209020e-02f, -2.196158231e-02f, +1.357610321e-02f, +1.533002384e-02f, -7.076060841e-03f, -1.024619382e-02f, +3.334183924e-03f, +6.407475742e-03f, -1.319036018e-03f, -3.648418276e-03f, +3.665127031e-04f, +1.809876508e-03f, -1.724949120e-05f, -7.086075605e-04f, -4.094575428e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.412899703e-05f, -2.001703818e-05f, -6.504078892e-05f, +4.231252662e-05f, +1.413550798e-04f, -6.715743137e-05f, -2.696791191e-04f, +8.431371580e-05f, +4.705323363e-04f, -7.533986833e-05f, -7.710904031e-04f, +8.536945332e-06f, +1.214355977e-03f, +1.758788128e-04f, -1.888363348e-03f, -6.226678819e-04f, +3.034463845e-03f, +1.882870823e-03f, -5.639815044e-03f, -9.814045284e-03f, -3.020176466e-03f, +7.459689256e-03f, +9.043370036e-03f, +1.756590075e-03f, -3.413161095e-03f, -1.439984936e-03f, +1.784912553e-03f, +1.086825811e-03f, -1.003494338e-03f, -7.937339537e-04f, +5.623463434e-04f, +5.547832275e-04f, -3.020156231e-04f, -3.653998246e-04f, +1.509345828e-04f, +2.223887316e-04f, -6.830491191e-05f, -1.214062683e-04f, +2.742657843e-05f, +5.616245785e-05f, -1.006325487e-05f, -1.886570663e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.006331513e-04f, +6.437526848e-04f, -1.479124152e-03f, -2.309165128e-03f, +3.476098551e-03f, +4.688439045e-03f, -6.756028420e-03f, -7.925032778e-03f, +1.151345806e-02f, +1.174369890e-02f, -1.769392847e-02f, -1.565536415e-02f, +2.491671758e-02f, +1.904839344e-02f, -3.247356581e-02f, -2.133030867e-02f, +3.942140265e-02f, +2.207891081e-02f, -4.475759113e-02f, -2.115520795e-02f, +4.763662196e-02f, +1.874113933e-02f, -4.756883086e-02f, -1.528945237e-02f, +4.454247079e-02f, +1.140228980e-02f, -3.903134231e-02f, -7.678113066e-03f, +3.188451029e-02f, +4.575018202e-03f, -2.413048356e-02f, -2.329669418e-03f, +1.675299771e-02f, +9.491633768e-04f, -1.050084239e-02f, -2.671720134e-04f, +5.779020827e-03f, +3.567802731e-05f, -2.639439847e-03f, -1.636347006e-05f, +7.086075605e-04f, +4.094575428e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.412899703e-05f, +2.001703818e-05f, +9.506618998e-05f, -8.049621737e-05f, -2.086797875e-04f, +1.900800085e-04f, +3.727159975e-04f, -3.697912301e-04f, -5.769113925e-04f, +6.279191849e-04f, +7.976303570e-04f, -9.577121940e-04f, -1.001417649e-03f, +1.334079442e-03f, +1.152266461e-03f, -1.715053605e-03f, -1.220659775e-03f, +2.048510478e-03f, +1.191608132e-03f, -2.282872110e-03f, -1.069045087e-03f, +2.378999080e-03f, +8.750572352e-04f, -2.319814411e-03f, -6.441297486e-04f, +2.114709087e-03f, +4.142463470e-04f, -1.797329261e-03f, -2.176719137e-04f, +1.417403325e-03f, +7.420923400e-05f, -1.029096508e-03f, +1.129083210e-05f, +6.793336019e-04f, -4.694729371e-05f, -3.993005730e-04f, +4.867011854e-05f, +2.010686993e-04f, -3.393849481e-05f, -7.950140619e-05f, +1.006325487e-05f, +1.886570663e-05f, +0.000000000e+00f, + /* 8, 9 (44) */ + +0.000000000e+00f, -3.765041543e-04f, -6.637697230e-04f, +9.290009326e-04f, +1.760527533e-03f, -1.680352891e-03f, -3.777623887e-03f, +2.502839044e-03f, +7.126354088e-03f, -3.136587497e-03f, -1.232524551e-02f, +3.146952680e-03f, +2.011587851e-02f, -1.830928306e-03f, -3.184469111e-02f, -2.085305840e-03f, +5.080097032e-02f, +1.169943621e-02f, -8.852240596e-02f, -4.003317034e-02f, +2.301036346e-01f, +4.657511121e-01f, +3.903319704e-01f, +9.490838907e-02f, -9.188302457e-02f, -4.917873518e-02f, +4.391849951e-02f, +3.280347170e-02f, -2.366526438e-02f, -2.296507664e-02f, +1.278236926e-02f, +1.589237018e-02f, -6.521277614e-03f, -1.054820944e-02f, +2.968784100e-03f, +6.558410325e-03f, -1.096647286e-03f, -3.716723188e-03f, +2.451064348e-04f, +1.837303087e-03f, +3.891296665e-05f, -7.186708154e-04f, -5.981146091e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.421511060e-05f, -1.771094961e-05f, -6.556783713e-05f, +3.713412602e-05f, +1.423163382e-04f, -5.710205251e-05f, -2.706488403e-04f, +6.659394642e-05f, +4.703089230e-04f, -4.620975957e-05f, -7.671179684e-04f, -3.705235275e-05f, +1.201569264e-03f, +2.451114403e-04f, -1.856107526e-03f, -7.269367777e-04f, +2.954814590e-03f, +2.040716467e-03f, -5.389171783e-03f, -9.844719429e-03f, -3.361462821e-03f, +7.220960571e-03f, +9.171734749e-03f, +2.011114502e-03f, -3.368330420e-03f, -1.564448624e-03f, +1.737490298e-03f, +1.156627495e-03f, -9.652327035e-04f, -8.342347209e-04f, +5.339595571e-04f, +5.780218488e-04f, -2.823162196e-04f, -3.782544149e-04f, +1.382441196e-04f, +2.291314354e-04f, -6.086322209e-05f, -1.247302240e-04f, +2.360234839e-05f, +5.770865334e-05f, -8.486307925e-06f, -1.956278904e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.765041543e-04f, +6.637697230e-04f, -1.384057962e-03f, -2.389661345e-03f, +3.267418763e-03f, +4.878519054e-03f, -6.383312422e-03f, -8.294824008e-03f, +1.093654667e-02f, +1.237161809e-02f, -1.689629811e-02f, -1.661307635e-02f, +2.391529993e-02f, +2.038247288e-02f, -3.132129935e-02f, -2.304536227e-02f, +3.820074287e-02f, +2.412742129e-02f, -4.356598299e-02f, -2.343808006e-02f, +4.656757688e-02f, +2.112013841e-02f, -4.669377363e-02f, -1.760926678e-02f, +4.389834104e-02f, +1.351699889e-02f, -3.861709596e-02f, -9.475442327e-03f, +3.166683837e-02f, +5.992421528e-03f, -2.405627433e-02f, -3.358765927e-03f, +1.676428854e-02f, +1.628496979e-03f, -1.054778968e-02f, -6.664725864e-04f, +5.827690945e-03f, +2.367467266e-04f, -2.673378342e-03f, -9.586487626e-05f, +7.186708154e-04f, +5.981146091e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.421511060e-05f, +1.771094961e-05f, +9.583336027e-05f, -7.210903727e-05f, -2.124308514e-04f, +1.737946493e-04f, +3.824830127e-04f, -3.429910801e-04f, -5.966253717e-04f, +5.889974946e-04f, +8.315244415e-04f, -9.067685159e-04f, -1.053110646e-03f, +1.273287459e-03f, +1.223734587e-03f, -1.648530526e-03f, -1.311389056e-03f, +1.981663839e-03f, +1.298212264e-03f, -2.221368260e-03f, -1.185524330e-03f, +2.327627661e-03f, +9.936928337e-04f, -2.281564981e-03f, -7.568152173e-04f, +2.090312125e-03f, +5.139195696e-04f, -1.785366232e-03f, -2.994798621e-04f, +1.414912861e-03f, +1.361219172e-04f, -1.032459620e-03f, -3.147027837e-05f, +6.851589268e-04f, -2.044965488e-05f, -4.050663648e-04f, +3.437545963e-05f, +2.053897813e-04f, -2.762760690e-05f, -8.202870318e-05f, +8.486307925e-06f, +1.956278904e-05f, +0.000000000e+00f, + /* 8,10 (44) */ + +0.000000000e+00f, -3.522890437e-04f, -6.814806726e-04f, +8.634330955e-04f, +1.797661659e-03f, -1.538036552e-03f, -3.834725940e-03f, +2.232190203e-03f, +7.192948034e-03f, -2.666278574e-03f, -1.237145527e-02f, +2.379834711e-03f, +2.007882616e-02f, -6.293590427e-04f, -3.159957967e-02f, -3.941413366e-03f, +5.007403355e-02f, +1.465425080e-02f, -8.648168949e-02f, -4.542234212e-02f, +2.202589152e-01f, +4.623896493e-01f, +3.975529310e-01f, +1.040801238e-01f, -8.987191007e-02f, -5.254706560e-02f, +4.235405088e-02f, +3.454096200e-02f, -2.250863689e-02f, -2.393030935e-02f, +1.194813454e-02f, +1.642632974e-02f, -5.943255765e-03f, -1.083052566e-02f, +2.590529685e-03f, +6.696654445e-03f, -8.675158509e-04f, -3.777586410e-03f, +1.203762108e-04f, +1.860905435e-03f, +9.662161999e-05f, -7.271571233e-04f, -7.937424996e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.422716675e-05f, -1.542623912e-05f, -6.591539633e-05f, +3.198316856e-05f, +1.429159500e-04f, -4.710225478e-05f, -2.709680669e-04f, +4.901127214e-05f, +4.690051627e-04f, -1.740619401e-05f, -7.614543474e-04f, -8.191999454e-05f, +1.186250152e-03f, +3.128233666e-04f, -1.820192390e-03f, -8.279793927e-04f, +2.870183705e-03f, +2.190981361e-03f, -5.135515976e-03f, -9.863177323e-03f, -3.698127934e-03f, +6.972520433e-03f, +9.290043881e-03f, +2.268004217e-03f, -3.315333055e-03f, -1.687550236e-03f, +1.685440871e-03f, +1.224821774e-03f, -9.242306866e-04f, -8.733938990e-04f, +5.039364399e-04f, +6.002632396e-04f, -2.616563963e-04f, -3.904285214e-04f, +1.250083200e-04f, +2.354500713e-04f, -5.312490959e-05f, -1.278188358e-04f, +1.962431458e-05f, +5.914530952e-05f, -6.833434631e-06f, -2.022439527e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.522890437e-04f, +6.814806726e-04f, -1.288224602e-03f, -2.461770383e-03f, +3.054987912e-03f, +5.052313703e-03f, -6.000829409e-03f, -8.637815088e-03f, +1.033992130e-02f, +1.296061558e-02f, -1.606477367e-02f, -1.751984486e-02f, +2.286218928e-02f, +2.165576034e-02f, -3.009756476e-02f, -2.469389280e-02f, +3.688935382e-02f, +2.610908513e-02f, -4.226777073e-02f, -2.565944832e-02f, +4.538205255e-02f, +2.344776607e-02f, -4.570008079e-02f, -1.989083176e-02f, +4.314152582e-02f, +1.560731101e-02f, -3.810317639e-02f, -1.126080856e-02f, +3.136735851e-02f, +7.407334389e-03f, -2.392015241e-02f, -4.391225546e-03f, +1.673281826e-02f, +2.313655906e-03f, -1.056823934e-02f, -1.071538951e-03f, +5.862066405e-03f, +4.421365079e-04f, -2.701005949e-03f, -1.778935794e-04f, +7.271571233e-04f, +7.937424996e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.422716675e-05f, +1.542623912e-05f, +9.630421979e-05f, -6.373892123e-05f, -2.155286933e-04f, +1.573685710e-04f, +3.910808416e-04f, -3.157135344e-04f, -6.145298076e-04f, +5.490371495e-04f, +8.629234091e-04f, -8.539948454e-04f, -1.101689457e-03f, +1.209694110e-03f, +1.291655395e-03f, -1.578161324e-03f, -1.398419915e-03f, +1.909999891e-03f, +1.401294039e-03f, -2.154305823e-03f, -1.298963777e-03f, +2.270314702e-03f, +1.109994551e-03f, -2.237417363e-03f, -8.679714118e-04f, +2.060476642e-03f, +6.128326608e-04f, -1.768755735e-03f, -3.811506542e-04f, +1.408759996e-03f, +1.983107871e-04f, -1.033184287e-03f, -7.470322627e-05f, +6.892718057e-04f, +6.536878019e-06f, -4.098560803e-04f, +1.968713542e-05f, +2.092462143e-04f, -2.106071123e-05f, -8.439347096e-05f, +6.833434631e-06f, +2.022439527e-05f, +0.000000000e+00f, + /* 8,11 (44) */ + +0.000000000e+00f, -3.280618770e-04f, -6.969069117e-04f, +7.975176992e-04f, +1.829644827e-03f, -1.395120602e-03f, -3.881828194e-03f, +1.961222136e-03f, +7.241959306e-03f, -2.197273411e-03f, -1.238886146e-02f, +1.618380364e-03f, +1.999690617e-02f, +5.568911090e-04f, -3.128675631e-02f, -5.761605756e-03f, +4.924605415e-02f, +1.752443450e-02f, -8.429070813e-02f, -5.055785810e-02f, +2.103957378e-01f, +4.586915213e-01f, +4.045254514e-01f, +1.133701677e-01f, -8.760390585e-02f, -5.586239866e-02f, +4.066650065e-02f, +3.622640287e-02f, -2.128381512e-02f, -2.485454003e-02f, +1.107474064e-02f, +1.693026618e-02f, -5.342992525e-03f, -1.109218205e-02f, +2.200101163e-03f, +6.821662764e-03f, -6.320657796e-04f, -3.830711319e-03f, -7.442625010e-06f, +1.880529750e-03f, +1.557669295e-04f, -7.339905580e-04f, -9.959864522e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.416746233e-05f, -1.316861113e-05f, -6.608696828e-05f, +2.687199657e-05f, +1.431597354e-04f, -3.718108509e-05f, -2.706472842e-04f, +3.160476641e-05f, +4.666406816e-04f, +1.100913829e-05f, -7.541364601e-04f, -1.259739956e-04f, +1.168467854e-03f, +3.788846557e-04f, -1.780749095e-03f, -9.256274826e-04f, +2.780829778e-03f, +2.333528214e-03f, -4.879274799e-03f, -9.869478069e-03f, -4.029714077e-03f, +6.714680117e-03f, +9.398032212e-03f, +2.526874633e-03f, -3.254123434e-03f, -1.809004221e-03f, +1.628809553e-03f, +1.291232807e-03f, -8.805431766e-04f, -9.111030623e-04f, +4.723232733e-04f, +6.214410693e-04f, -2.400701682e-04f, -4.018824413e-04f, +1.112497165e-04f, +2.413216300e-04f, -4.510330362e-05f, -1.306592947e-04f, +1.549922050e-05f, +6.046563196e-05f, -5.107193698e-06f, -2.084714333e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.280618770e-04f, +6.969069117e-04f, -1.191920382e-03f, -2.525509304e-03f, +2.839459219e-03f, +5.209682274e-03f, -5.609748568e-03f, -8.953528623e-03f, +9.725391489e-03f, +1.350965273e-02f, -1.520185026e-02f, -1.837383971e-02f, +2.176049983e-02f, +2.286545445e-02f, -2.880590937e-02f, -2.627205412e-02f, +3.549093390e-02f, +2.801908502e-02f, -4.086647669e-02f, -2.781375414e-02f, +4.408308877e-02f, +2.571808077e-02f, -4.459008624e-02f, -2.212824912e-02f, +4.227355441e-02f, +1.766778765e-02f, -3.749034373e-02f, -1.302956429e-02f, +3.098620786e-02f, +8.816094385e-03f, -2.372184162e-02f, -5.424409833e-03f, +1.665811503e-02f, +3.002927711e-03f, -1.056170246e-02f, -1.481395032e-03f, +5.881753541e-03f, +6.513827222e-04f, -2.722066660e-03f, -2.622870504e-04f, +7.339905580e-04f, +9.959864522e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.416746233e-05f, +1.316861113e-05f, +9.648584411e-05f, -5.540925410e-05f, -2.179789158e-04f, +1.408490179e-04f, +3.985064122e-04f, -2.880380885e-04f, -6.306021650e-04f, +5.081550995e-04f, +8.917723239e-04f, -7.995452478e-04f, -1.147054322e-03f, +1.143483410e-03f, +1.355875694e-03f, -1.504146369e-03f, -1.481543950e-03f, +1.833717525e-03f, +1.500596614e-03f, -2.081863637e-03f, -1.409073225e-03f, +2.207203543e-03f, +1.223659887e-03f, -2.187470241e-03f, -9.773066992e-04f, +2.025255326e-03f, +7.107257092e-04f, -1.747510474e-03f, -4.624709043e-04f, +1.398928609e-03f, +2.606156279e-04f, -1.031238692e-03f, -1.182993974e-04f, +6.916366713e-04f, +3.394731136e-05f, -4.136389188e-04f, +4.637995848e-06f, +2.126161649e-04f, -1.425040657e-05f, -8.658319699e-05f, +5.107193698e-06f, +2.084714333e-05f, +0.000000000e+00f, + /* 8,12 (44) */ + +0.000000000e+00f, -3.038944146e-04f, -7.100755228e-04f, +7.314307309e-04f, +1.856516824e-03f, -1.251960867e-03f, -3.919009279e-03f, +1.690574852e-03f, +7.273564073e-03f, -1.730632730e-03f, -1.237785232e-02f, +8.642439036e-04f, +1.987093217e-02f, +1.725358962e-03f, -3.090787165e-02f, -7.542354851e-03f, +4.832042667e-02f, +2.030526428e-02f, -8.195717992e-02f, -5.543713289e-02f, +2.005262598e-01f, +4.546618072e-01f, +4.112401315e-01f, +1.227681999e-01f, -8.507703122e-02f, -5.911652209e-02f, +3.885749643e-02f, +3.785521243e-02f, -1.999258231e-02f, -2.573508321e-02f, +1.016363758e-02f, +1.740258945e-02f, -4.721551456e-03f, -1.133225222e-02f, +1.798218722e-03f, +6.932912481e-03f, -3.907441495e-04f, -3.875814623e-03f, -1.381019197e-04f, +1.896028970e-03f, +2.162325615e-04f, -7.390977517e-04f, -1.204457886e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.403844844e-05f, -1.094354843e-05f, -6.608644198e-05f, +2.181258871e-05f, +1.430542885e-04f, -2.736098108e-05f, -2.696983397e-04f, +1.441246259e-05f, +4.632372998e-04f, +3.897633968e-05f, -7.452045187e-04f, -1.691254733e-04f, +1.148296197e-03f, +4.431707792e-04f, -1.737914652e-03f, -1.019722344e-03f, +2.687016826e-03f, +2.468235104e-03f, -4.620875869e-03f, -9.863699687e-03f, -4.355771999e-03f, +6.447766409e-03f, +9.495449409e-03f, +2.787333827e-03f, -3.184670576e-03f, -1.928524116e-03f, +1.567652161e-03f, +1.355686285e-03f, -8.342318778e-04f, -9.472556282e-04f, +4.391706653e-04f, +6.414905504e-04f, -2.175942485e-04f, -4.125775763e-04f, +9.699248076e-05f, +2.467237975e-04f, -3.681269562e-05f, -1.332391668e-04f, +1.123435021e-05f, +6.166298190e-05f, -3.310429977e-06f, -2.142767771e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.038944146e-04f, +7.100755228e-04f, -1.095434538e-03f, -2.580918558e-03f, +2.621480303e-03f, +5.350531292e-03f, -5.211242156e-03f, -9.241566711e-03f, +9.094789324e-03f, +1.401780783e-02f, -1.431007794e-02f, -1.917338496e-02f, +2.061344550e-02f, +2.400893786e-02f, -2.745003367e-02f, -2.777620049e-02f, +3.400938995e-02f, +2.985280254e-02f, -3.936588008e-02f, -2.989561778e-02f, +4.267401554e-02f, +2.792528431e-02f, -4.336642635e-02f, -2.431571937e-02f, +4.129624771e-02f, +1.969304298e-02f, -3.677961802e-02f, -1.477707477e-02f, +3.052373695e-02f, +1.021502299e-02f, -2.346122599e-02f, -6.455648525e-03f, +1.653981564e-02f, +3.694564383e-03f, -1.052775515e-02f, -1.895033950e-03f, +5.886391536e-03f, +8.639988871e-04f, -2.736317066e-03f, -3.488702474e-04f, +7.390977517e-04f, +1.204457886e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.403844844e-05f, +1.094354843e-05f, +9.638600554e-05f, -4.714274876e-05f, -2.197888415e-04f, +1.242826112e-04f, +4.047599059e-04f, -2.600441250e-04f, -6.448251093e-04f, +4.664693497e-04f, +9.180235657e-04f, -7.435767528e-04f, -1.189114717e-03f, +1.074844904e-03f, +1.416252865e-03f, -1.426694509e-03f, -1.560563756e-03f, +1.753027009e-03f, +1.595873504e-03f, -2.004234274e-03f, -1.515571199e-03f, +2.138452665e-03f, +1.334392726e-03f, -2.131837634e-03f, -1.084533190e-03f, +1.984715161e-03f, +8.073400673e-04f, -1.721655398e-03f, -5.432265444e-04f, +1.385412165e-03f, +3.228743345e-04f, -1.026597802e-03f, -1.621478363e-04f, +6.922222111e-04f, +6.171446108e-05f, -4.163863488e-04f, -1.073742985e-05f, +2.154787367e-04f, -7.210351542e-06f, -8.858557120e-05f, +3.310429977e-06f, +2.142767771e-05f, +0.000000000e+00f, + /* 8,13 (44) */ + +0.000000000e+00f, -2.798559662e-04f, -7.210190713e-04f, +6.653442889e-04f, +1.878329412e-03f, -1.108906579e-03f, -3.946370260e-03f, +1.420876512e-03f, +7.287976535e-03f, -1.267395430e-03f, -1.233887598e-02f, +1.190393849e-04f, +1.970180670e-02f, +2.873655160e-03f, -3.046470087e-02f, -9.280269503e-03f, +4.730070433e-02f, +2.299228111e-02f, -7.948894481e-02f, -6.005800876e-02f, +1.906625601e-01f, +4.503060352e-01f, +4.176878979e-01f, +1.322636493e-01f, -8.228969739e-02f, -6.230119267e-02f, +3.692897231e-02f, +3.942286459e-02f, -1.863689602e-02f, -2.656931509e-02f, +9.216381950e-03f, +1.784176012e-02f, -4.080060906e-03f, -1.154984647e-02f, +1.385641146e-03f, +7.029904962e-03f, -1.440203520e-04f, -3.912627319e-03f, -2.713410865e-04f, +1.907263320e-03f, +2.778955434e-04f, -7.424081816e-04f, -1.418734663e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.384271908e-05f, -8.756301760e-06f, -6.591807472e-05f, +1.681653613e-05f, +1.426069468e-04f, -1.766372628e-05f, -2.681343925e-04f, -2.528721062e-06f, +4.588189477e-04f, +6.643741972e-05f, -7.347018899e-04f, -2.112888089e-04f, +1.125813399e-03f, +5.055628209e-04f, -1.691831560e-03f, -1.110115020e-03f, +2.589013718e-03f, +2.594995548e-03f, -4.360746493e-03f, -9.845938909e-03f, -4.675861675e-03f, +6.172121094e-03f, +9.582060540e-03f, +3.048983182e-03f, -3.106958292e-03f, -2.045823112e-03f, +1.502035079e-03f, +1.418009831e-03f, -7.853652598e-04f, -9.817471263e-04f, +4.045334914e-04f, +6.603486128e-04f, -1.942679996e-04f, -4.224765426e-04f, +8.226239070e-05f, +2.516350224e-04f, -2.826832053e-05f, -1.355464329e-04f, +6.837520235e-06f, +6.273089843e-05f, -1.446273059e-06f, -2.196268072e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.798559662e-04f, +7.210190713e-04f, -9.990485321e-04f, -2.628061307e-03f, +2.401691461e-03f, +5.474813903e-03f, -4.806482250e-03f, -9.501610836e-03f, +8.449964215e-03f, +1.448427718e-02f, -1.339205437e-02f, -1.991696171e-02f, +1.942433079e-02f, +2.508378276e-02f, -2.603378081e-02f, -2.920289500e-02f, +3.244882620e-02f, +3.160582955e-02f, -3.777000657e-02f, -3.189985205e-02f, +4.115844435e-02f, +3.006373698e-02f, -4.203203363e-02f, -2.644755700e-02f, +4.021171452e-02f, +2.167775814e-02f, -3.597227795e-02f, -1.649873017e-02f, +2.998051041e-02f, +1.160043516e-02f, -2.313835166e-02f, -7.482246328e-03f, +1.637766780e-02f, +4.386786594e-03f, -1.046604069e-02f, -2.311420299e-03f, +5.875654107e-03f, +1.079477624e-03f, -2.743527418e-03f, -4.374558186e-04f, +7.424081816e-04f, +1.418734663e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.384271908e-05f, +8.756301760e-06f, +9.601313121e-05f, -3.896139322e-05f, -2.209674568e-04f, +1.077152281e-04f, +4.098447046e-04f, -2.318106980e-04f, -6.571864865e-04f, +4.240986292e-04f, +9.416368807e-04f, -6.862489085e-04f, -1.227789521e-03f, +1.003973129e-03f, +1.472655172e-03f, -1.346022477e-03f, -1.635293398e-03f, +1.668149396e-03f, +1.686889213e-03f, -1.921623528e-03f, -1.618185689e-03f, +2.064235287e-03f, +1.441904120e-03f, -2.070648629e-03f, -1.189367509e-03f, +1.938937307e-03f, +9.024190434e-04f, -1.691227717e-03f, -6.232033897e-04f, +1.368213823e-03f, +3.849233317e-04f, -1.019243517e-03f, -2.061355206e-04f, +6.910015121e-04f, +8.976910722e-05f, -4.180722284e-04f, -2.640300149e-05f, +2.178140521e-04f, +4.475248966e-08f, -9.038853164e-05f, +1.446273059e-06f, +2.196268072e-05f, +0.000000000e+00f, + /* 8,14 (44) */ + +0.000000000e+00f, -2.560132471e-04f, -7.297753730e-04f, +5.994262142e-04f, +1.895145949e-03f, -9.662996318e-04f, -3.964033987e-03f, +1.152742120e-03f, +7.285447814e-03f, -8.085764820e-04f, -1.227243856e-02f, -6.156625050e-04f, +1.949051789e-02f, +3.999468559e-03f, -2.995913805e-02f, -1.097210106e-02f, +4.619058931e-02f, +2.558129482e-02f, -7.689394926e-02f, -6.441875526e-02f, +1.808166212e-01f, +4.456301736e-01f, +4.238600190e-01f, +1.418457099e-01f, -7.924071421e-02f, -6.540815096e-02f, +3.488314920e-02f, +4.092489967e-02f, -1.721888619e-02f, -2.735468035e-02f, +8.234634824e-03f, +1.824629361e-02f, -3.419712293e-03f, -1.174411447e-02f, +9.631646030e-04f, +7.112167352e-03f, +1.076146704e-04f, -3.940895639e-03f, -4.068875194e-04f, +1.914100841e-03f, +3.406264418e-04f, -7.438544547e-04f, -1.638361470e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.358299974e-05f, -6.611880398e-06f, -6.558647250e-05f, +1.189502014e-05f, +1.418257581e-04f, -8.110407545e-06f, -2.659698591e-04f, -1.918305259e-05f, +4.534115778e-04f, +9.333640378e-05f, -7.226749513e-04f, -2.523817992e-04f, +1.101101830e-03f, +5.659476670e-04f, -1.642647427e-03f, -1.196666476e-03f, +2.487093602e-03f, +2.713718553e-03f, -4.099312916e-03f, -9.816310925e-03f, -4.989553031e-03f, +5.888100406e-03f, +9.657646552e-03f, +3.311418047e-03f, -3.020985374e-03f, -2.160614618e-03f, +1.432035250e-03f, +1.478033405e-03f, -7.340184918e-04f, -1.014475465e-03f, +3.684708245e-04f, +6.779540756e-04f, -1.701333783e-04f, -4.315432790e-04f, +6.708679320e-05f, +2.560345824e-04f, -1.948633533e-05f, -1.375695279e-04f, +2.317069827e-06f, +6.366312058e-05f, +4.818649841e-07f, -2.244888408e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.560132471e-04f, +7.297753730e-04f, -9.030354009e-04f, -2.667022700e-03f, +2.180724004e-03f, +5.582529131e-03f, -4.396637545e-03f, -9.733421534e-03f, +7.792777728e-03f, +1.490837581e-02f, -1.245041749e-02f, -2.060321062e-02f, +1.819654127e-02f, +2.608775589e-02f, -2.456112564e-02f, -3.054891748e-02f, +3.081353280e-02f, +3.327397895e-02f, -3.608311736e-02f, -3.382147558e-02f, +3.954025866e-02f, +3.212797226e-02f, -4.059012951e-02f, -2.851820563e-02f, +3.902234701e-02f, +2.361669545e-02f, -3.506985891e-02f, -1.818995788e-02f, +2.935730702e-02f, +1.296864898e-02f, -2.275342833e-02f, -8.501489845e-03f, +1.617153228e-02f, +5.077788106e-03f, -1.037627158e-02f, -2.729492528e-03f, +5.849251105e-03f, +1.297291676e-03f, -2.743482666e-03f, -5.278443502e-04f, +7.438544547e-04f, +1.638361470e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.358299974e-05f, +6.611880398e-06f, +9.537626022e-05f, -3.088640110e-05f, -2.215253523e-04f, +9.119188536e-05f, +4.137673286e-04f, -2.034163201e-04f, -6.676792871e-04f, +3.811620628e-04f, +9.625794128e-04f, -6.277233333e-04f, -1.263007155e-03f, +9.310670614e-04f, +1.524962044e-03f, -1.262354277e-03f, -1.705558856e-03f, +1.579315914e-03f, +1.773419819e-03f, -1.834249851e-03f, -1.716654862e-03f, +1.984738917e-03f, +1.545913065e-03f, -2.004047085e-03f, -1.291531559e-03f, +1.888016951e-03f, +9.957085918e-04f, -1.656276876e-03f, -7.021877095e-04f, +1.347346503e-03f, +4.465980006e-04f, -1.009164789e-03f, -2.501476454e-04f, +6.879521958e-04f, +1.180401565e-04f, -4.186729204e-04f, -4.232104223e-05f, +2.196033337e-04f, +7.499182172e-06f, -9.198031050e-05f, -4.818649841e-07f, +2.244888408e-05f, +0.000000000e+00f, + /* 8,15 (44) */ + +0.000000000e+00f, -2.324302474e-04f, -7.363872534e-04f, +5.338397417e-04f, +1.907040969e-03f, -8.244738737e-04f, -3.972144394e-03f, +8.867722608e-04f, +7.266264762e-03f, -3.551649042e-04f, -1.217910216e-02f, -1.338337456e-03f, +1.923813609e-02f, +5.100570388e-03f, -2.939319038e-02f, -1.261474849e-02f, +4.499392283e-02f, +2.806838843e-02f, -7.418023071e-02f, -6.851806817e-02f, +1.710003103e-01f, +4.406406205e-01f, +4.297481194e-01f, +1.515033564e-01f, -7.592929617e-02f, -6.842913633e-02f, +3.272253458e-02f, +4.235693492e-02f, -1.574085279e-02f, -2.808869884e-02f, +7.220159360e-03f, +1.861476443e-02f, -2.741758217e-03f, -1.191424785e-02f, +5.316213240e-04f, +7.179254146e-03f, +3.636492528e-04f, -3.960381975e-03f, -5.444570472e-04f, +1.916417910e-03f, +4.042895624e-04f, -7.433725897e-04f, -1.862850311e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.326213574e-05f, -4.515043563e-06f, -6.509656988e-05f, +7.058791348e-06f, +1.407194469e-04f, +1.278624870e-06f, -2.632203577e-04f, -3.551605358e-05f, +4.470430736e-04f, +1.196194356e-04f, -7.091729436e-04f, -2.923257993e-04f, +1.074247776e-03f, +6.242181808e-04f, -1.590514587e-03f, -1.279247763e-03f, +2.381533322e-03f, +2.824328624e-03f, -3.836999584e-03f, -9.774949114e-03f, -5.296426649e-03f, +5.596074459e-03f, +9.722004727e-03f, +3.574228409e-03f, -2.926765753e-03f, -2.272612832e-03f, +1.357740153e-03f, +1.535589709e-03f, -6.802733621e-04f, -1.045341195e-03f, +3.310458549e-04f, +6.942478174e-04f, -1.452348731e-04f, -4.397431547e-04f, +5.149456241e-05f, +2.599026502e-04f, -1.048379485e-05f, -1.392973795e-04f, -2.318150385e-06f, +6.445360941e-05f, +2.470292752e-06f, -2.288308057e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.324302474e-04f, +7.363872534e-04f, -8.076591407e-04f, -2.697909101e-03f, +1.959198652e-03f, +5.673721017e-03f, -3.982870217e-03f, -9.936837854e-03f, +7.125098441e-03f, +1.528953787e-02f, -1.148783808e-02f, -2.123093395e-02f, +1.693353411e-02f, +2.701882295e-02f, -2.303616359e-02f, -3.181127175e-02f, +2.910797394e-02f, +3.485329486e-02f, -3.430969754e-02f, -3.565572543e-02f, +3.782360379e-02f, +3.411271118e-02f, -3.904421644e-02f, -3.052225271e-02f, +3.773081546e-02f, +2.550471240e-02f, -3.407415032e-02f, -1.984623476e-02f, +2.865511931e-02f, +1.431599548e-02f, -2.230683033e-02f, -9.510654634e-03f, +1.592138463e-02f, +5.765740302e-03f, -1.025823142e-02f, -3.148165448e-03f, +5.806930063e-03f, +1.516895010e-03f, -2.735983483e-03f, -6.198246607e-04f, +7.433725897e-04f, +1.862850311e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.326213574e-05f, +4.515043563e-06f, +9.448499971e-05f, -2.293816556e-05f, -2.214746593e-04f, +7.475662740e-05f, +4.165373671e-04f, -1.749387546e-04f, -6.763015984e-04f, +3.377788445e-04f, +9.808257139e-04f, -5.681632653e-04f, -1.294705690e-03f, +8.563295593e-04f, +1.573064329e-03f, -1.175920565e-03f, -1.771198429e-03f, +1.486767326e-03f, +1.855253545e-03f, -1.742343765e-03f, -1.810727743e-03f, +1.900164870e-03f, +1.646147245e-03f, -1.932191282e-03f, -1.390753267e-03f, +1.832063116e-03f, +1.086957999e-03f, -1.616864506e-03f, -7.799668001e-04f, +1.322832937e-03f, +5.077331119e-04f, -9.963577334e-04f, -2.940679154e-04f, +6.830565413e-04f, +1.464548128e-04f, -4.181674015e-04f, -5.845241879e-05f, +2.208289832e-04f, +1.513621662e-05f, -9.334948024e-05f, -2.470292752e-06f, +2.288308057e-05f, +0.000000000e+00f, + /* 8,16 (44) */ + +0.000000000e+00f, -2.091681116e-04f, -7.409022970e-04f, +4.687431718e-04f, +1.914099760e-03f, -6.837544268e-04f, -3.970865769e-03f, +6.235519031e-04f, +7.230748708e-03f, +9.187816936e-05f, -1.205948272e-02f, -2.047510400e-03f, +1.894581029e-02f, +6.174818164e-03f, -2.876897220e-02f, -1.420526308e-02f, +4.371467507e-02f, +3.044992175e-02f, -7.135590209e-02f, -7.235506776e-02f, +1.612253611e-01f, +4.353441939e-01f, +4.353441939e-01f, +1.612253611e-01f, -7.235506776e-02f, -7.135590209e-02f, +3.044992175e-02f, +4.371467507e-02f, -1.420526308e-02f, -2.876897220e-02f, +6.174818164e-03f, +1.894581029e-02f, -2.047510400e-03f, -1.205948272e-02f, +9.187816936e-05f, +7.230748708e-03f, +6.235519031e-04f, -3.970865769e-03f, -6.837544268e-04f, +1.914099760e-03f, +4.687431718e-04f, -7.409022970e-04f, -2.091681116e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.288308057e-05f, -2.470292752e-06f, -6.445360941e-05f, +2.318150385e-06f, +1.392973795e-04f, +1.048379485e-05f, -2.599026502e-04f, -5.149456241e-05f, +4.397431547e-04f, +1.452348731e-04f, -6.942478174e-04f, -3.310458549e-04f, +1.045341195e-03f, +6.802733621e-04f, -1.535589709e-03f, -1.357740153e-03f, +2.272612832e-03f, +2.926765753e-03f, -3.574228409e-03f, -9.722004727e-03f, -5.596074459e-03f, +5.296426649e-03f, +9.774949114e-03f, +3.836999584e-03f, -2.824328624e-03f, -2.381533322e-03f, +1.279247763e-03f, +1.590514587e-03f, -6.242181808e-04f, -1.074247776e-03f, +2.923257993e-04f, +7.091729436e-04f, -1.196194356e-04f, -4.470430736e-04f, +3.551605358e-05f, +2.632203577e-04f, -1.278624870e-06f, -1.407194469e-04f, -7.058791348e-06f, +6.509656988e-05f, +4.515043563e-06f, -2.326213574e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.091681116e-04f, +7.409022970e-04f, -7.131741410e-04f, -2.720847267e-03f, +1.737723993e-03f, +5.748477644e-03f, -3.566332849e-03f, -1.011177661e-02f, +6.448796843e-03f, +1.562731672e-02f, -1.050701237e-02f, -2.179909722e-02f, +1.563882842e-02f, +2.787515251e-02f, -2.146309926e-02f, -3.298719232e-02f, +2.733677551e-02f, +3.634006219e-02f, -3.245444399e-02f, -3.739806920e-02f, +3.601287605e-02f, +3.601287605e-02f, -3.739806920e-02f, -3.245444399e-02f, +3.634006219e-02f, +2.733677551e-02f, -3.298719232e-02f, -2.146309926e-02f, +2.787515251e-02f, +1.563882842e-02f, -2.179909722e-02f, -1.050701237e-02f, +1.562731672e-02f, +6.448796843e-03f, -1.011177661e-02f, -3.566332849e-03f, +5.748477644e-03f, +1.737723993e-03f, -2.720847267e-03f, -7.131741410e-04f, +7.409022970e-04f, +2.091681116e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.288308057e-05f, +2.470292752e-06f, +9.334948024e-05f, -1.513621662e-05f, -2.208289832e-04f, +5.845241879e-05f, +4.181674015e-04f, -1.464548128e-04f, -6.830565413e-04f, +2.940679154e-04f, +9.963577334e-04f, -5.077331119e-04f, -1.322832937e-03f, +7.799668001e-04f, +1.616864506e-03f, -1.086957999e-03f, -1.832063116e-03f, +1.390753267e-03f, +1.932191282e-03f, -1.646147245e-03f, -1.900164870e-03f, +1.810727743e-03f, +1.742343765e-03f, -1.855253545e-03f, -1.486767326e-03f, +1.771198429e-03f, +1.175920565e-03f, -1.573064329e-03f, -8.563295593e-04f, +1.294705690e-03f, +5.681632653e-04f, -9.808257139e-04f, -3.377788445e-04f, +6.763015984e-04f, +1.749387546e-04f, -4.165373671e-04f, -7.475662740e-05f, +2.214746593e-04f, +2.293816556e-05f, -9.448499971e-05f, -4.515043563e-06f, +2.326213574e-05f, +0.000000000e+00f, + /* 8,17 (44) */ + +0.000000000e+00f, -1.862850311e-04f, -7.433725897e-04f, +4.042895624e-04f, +1.916417910e-03f, -5.444570472e-04f, -3.960381975e-03f, +3.636492528e-04f, +7.179254146e-03f, +5.316213240e-04f, -1.191424785e-02f, -2.741758217e-03f, +1.861476443e-02f, +7.220159360e-03f, -2.808869884e-02f, -1.574085279e-02f, +4.235693492e-02f, +3.272253458e-02f, -6.842913633e-02f, -7.592929617e-02f, +1.515033564e-01f, +4.297481194e-01f, +4.406406205e-01f, +1.710003103e-01f, -6.851806817e-02f, -7.418023071e-02f, +2.806838843e-02f, +4.499392283e-02f, -1.261474849e-02f, -2.939319038e-02f, +5.100570388e-03f, +1.923813609e-02f, -1.338337456e-03f, -1.217910216e-02f, -3.551649042e-04f, +7.266264762e-03f, +8.867722608e-04f, -3.972144394e-03f, -8.244738737e-04f, +1.907040969e-03f, +5.338397417e-04f, -7.363872534e-04f, -2.324302474e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.244888408e-05f, -4.818649841e-07f, -6.366312058e-05f, -2.317069827e-06f, +1.375695279e-04f, +1.948633533e-05f, -2.560345824e-04f, -6.708679320e-05f, +4.315432790e-04f, +1.701333783e-04f, -6.779540756e-04f, -3.684708245e-04f, +1.014475465e-03f, +7.340184918e-04f, -1.478033405e-03f, -1.432035250e-03f, +2.160614618e-03f, +3.020985374e-03f, -3.311418047e-03f, -9.657646552e-03f, -5.888100406e-03f, +4.989553031e-03f, +9.816310925e-03f, +4.099312916e-03f, -2.713718553e-03f, -2.487093602e-03f, +1.196666476e-03f, +1.642647427e-03f, -5.659476670e-04f, -1.101101830e-03f, +2.523817992e-04f, +7.226749513e-04f, -9.333640378e-05f, -4.534115778e-04f, +1.918305259e-05f, +2.659698591e-04f, +8.110407545e-06f, -1.418257581e-04f, -1.189502014e-05f, +6.558647250e-05f, +6.611880398e-06f, -2.358299974e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.862850311e-04f, +7.433725897e-04f, -6.198246607e-04f, -2.735983483e-03f, +1.516895010e-03f, +5.806930063e-03f, -3.148165448e-03f, -1.025823142e-02f, +5.765740302e-03f, +1.592138463e-02f, -9.510654634e-03f, -2.230683033e-02f, +1.431599548e-02f, +2.865511931e-02f, -1.984623476e-02f, -3.407415032e-02f, +2.550471240e-02f, +3.773081546e-02f, -3.052225271e-02f, -3.904421644e-02f, +3.411271118e-02f, +3.782360379e-02f, -3.565572543e-02f, -3.430969754e-02f, +3.485329486e-02f, +2.910797394e-02f, -3.181127175e-02f, -2.303616359e-02f, +2.701882295e-02f, +1.693353411e-02f, -2.123093395e-02f, -1.148783808e-02f, +1.528953787e-02f, +7.125098441e-03f, -9.936837854e-03f, -3.982870217e-03f, +5.673721017e-03f, +1.959198652e-03f, -2.697909101e-03f, -8.076591407e-04f, +7.363872534e-04f, +2.324302474e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.244888408e-05f, +4.818649841e-07f, +9.198031050e-05f, -7.499182172e-06f, -2.196033337e-04f, +4.232104223e-05f, +4.186729204e-04f, -1.180401565e-04f, -6.879521958e-04f, +2.501476454e-04f, +1.009164789e-03f, -4.465980006e-04f, -1.347346503e-03f, +7.021877095e-04f, +1.656276876e-03f, -9.957085918e-04f, -1.888016951e-03f, +1.291531559e-03f, +2.004047085e-03f, -1.545913065e-03f, -1.984738917e-03f, +1.716654862e-03f, +1.834249851e-03f, -1.773419819e-03f, -1.579315914e-03f, +1.705558856e-03f, +1.262354277e-03f, -1.524962044e-03f, -9.310670614e-04f, +1.263007155e-03f, +6.277233333e-04f, -9.625794128e-04f, -3.811620628e-04f, +6.676792871e-04f, +2.034163201e-04f, -4.137673286e-04f, -9.119188536e-05f, +2.215253523e-04f, +3.088640110e-05f, -9.537626022e-05f, -6.611880398e-06f, +2.358299974e-05f, +0.000000000e+00f, + /* 8,18 (44) */ + +0.000000000e+00f, -1.638361470e-04f, -7.438544547e-04f, +3.406264418e-04f, +1.914100841e-03f, -4.068875194e-04f, -3.940895639e-03f, +1.076146704e-04f, +7.112167352e-03f, +9.631646030e-04f, -1.174411447e-02f, -3.419712293e-03f, +1.824629361e-02f, +8.234634824e-03f, -2.735468035e-02f, -1.721888619e-02f, +4.092489967e-02f, +3.488314920e-02f, -6.540815096e-02f, -7.924071421e-02f, +1.418457099e-01f, +4.238600190e-01f, +4.456301736e-01f, +1.808166212e-01f, -6.441875526e-02f, -7.689394926e-02f, +2.558129482e-02f, +4.619058931e-02f, -1.097210106e-02f, -2.995913805e-02f, +3.999468559e-03f, +1.949051789e-02f, -6.156625050e-04f, -1.227243856e-02f, -8.085764820e-04f, +7.285447814e-03f, +1.152742120e-03f, -3.964033987e-03f, -9.662996318e-04f, +1.895145949e-03f, +5.994262142e-04f, -7.297753730e-04f, -2.560132471e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.196268072e-05f, +1.446273059e-06f, -6.273089843e-05f, -6.837520235e-06f, +1.355464329e-04f, +2.826832053e-05f, -2.516350224e-04f, -8.226239070e-05f, +4.224765426e-04f, +1.942679996e-04f, -6.603486128e-04f, -4.045334914e-04f, +9.817471263e-04f, +7.853652598e-04f, -1.418009831e-03f, -1.502035079e-03f, +2.045823112e-03f, +3.106958292e-03f, -3.048983182e-03f, -9.582060540e-03f, -6.172121094e-03f, +4.675861675e-03f, +9.845938909e-03f, +4.360746493e-03f, -2.594995548e-03f, -2.589013718e-03f, +1.110115020e-03f, +1.691831560e-03f, -5.055628209e-04f, -1.125813399e-03f, +2.112888089e-04f, +7.347018899e-04f, -6.643741972e-05f, -4.588189477e-04f, +2.528721062e-06f, +2.681343925e-04f, +1.766372628e-05f, -1.426069468e-04f, -1.681653613e-05f, +6.591807472e-05f, +8.756301760e-06f, -2.384271908e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.638361470e-04f, +7.438544547e-04f, -5.278443502e-04f, -2.743482666e-03f, +1.297291676e-03f, +5.849251105e-03f, -2.729492528e-03f, -1.037627158e-02f, +5.077788106e-03f, +1.617153228e-02f, -8.501489845e-03f, -2.275342833e-02f, +1.296864898e-02f, +2.935730702e-02f, -1.818995788e-02f, -3.506985891e-02f, +2.361669545e-02f, +3.902234701e-02f, -2.851820563e-02f, -4.059012951e-02f, +3.212797226e-02f, +3.954025866e-02f, -3.382147558e-02f, -3.608311736e-02f, +3.327397895e-02f, +3.081353280e-02f, -3.054891748e-02f, -2.456112564e-02f, +2.608775589e-02f, +1.819654127e-02f, -2.060321062e-02f, -1.245041749e-02f, +1.490837581e-02f, +7.792777728e-03f, -9.733421534e-03f, -4.396637545e-03f, +5.582529131e-03f, +2.180724004e-03f, -2.667022700e-03f, -9.030354009e-04f, +7.297753730e-04f, +2.560132471e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.196268072e-05f, -1.446273059e-06f, +9.038853164e-05f, -4.475248966e-08f, -2.178140521e-04f, +2.640300149e-05f, +4.180722284e-04f, -8.976910722e-05f, -6.910015121e-04f, +2.061355206e-04f, +1.019243517e-03f, -3.849233317e-04f, -1.368213823e-03f, +6.232033897e-04f, +1.691227717e-03f, -9.024190434e-04f, -1.938937307e-03f, +1.189367509e-03f, +2.070648629e-03f, -1.441904120e-03f, -2.064235287e-03f, +1.618185689e-03f, +1.921623528e-03f, -1.686889213e-03f, -1.668149396e-03f, +1.635293398e-03f, +1.346022477e-03f, -1.472655172e-03f, -1.003973129e-03f, +1.227789521e-03f, +6.862489085e-04f, -9.416368807e-04f, -4.240986292e-04f, +6.571864865e-04f, +2.318106980e-04f, -4.098447046e-04f, -1.077152281e-04f, +2.209674568e-04f, +3.896139322e-05f, -9.601313121e-05f, -8.756301760e-06f, +2.384271908e-05f, +0.000000000e+00f, + /* 8,19 (44) */ + +0.000000000e+00f, -1.418734663e-04f, -7.424081816e-04f, +2.778955434e-04f, +1.907263320e-03f, -2.713410865e-04f, -3.912627319e-03f, -1.440203520e-04f, +7.029904962e-03f, +1.385641146e-03f, -1.154984647e-02f, -4.080060906e-03f, +1.784176012e-02f, +9.216381950e-03f, -2.656931509e-02f, -1.863689602e-02f, +3.942286459e-02f, +3.692897231e-02f, -6.230119267e-02f, -8.228969739e-02f, +1.322636493e-01f, +4.176878979e-01f, +4.503060352e-01f, +1.906625601e-01f, -6.005800876e-02f, -7.948894481e-02f, +2.299228111e-02f, +4.730070433e-02f, -9.280269503e-03f, -3.046470087e-02f, +2.873655160e-03f, +1.970180670e-02f, +1.190393849e-04f, -1.233887598e-02f, -1.267395430e-03f, +7.287976535e-03f, +1.420876512e-03f, -3.946370260e-03f, -1.108906579e-03f, +1.878329412e-03f, +6.653442889e-04f, -7.210190713e-04f, -2.798559662e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.142767771e-05f, +3.310429977e-06f, -6.166298190e-05f, -1.123435021e-05f, +1.332391668e-04f, +3.681269562e-05f, -2.467237975e-04f, -9.699248076e-05f, +4.125775763e-04f, +2.175942485e-04f, -6.414905504e-04f, -4.391706653e-04f, +9.472556282e-04f, +8.342318778e-04f, -1.355686285e-03f, -1.567652161e-03f, +1.928524116e-03f, +3.184670576e-03f, -2.787333827e-03f, -9.495449409e-03f, -6.447766409e-03f, +4.355771999e-03f, +9.863699687e-03f, +4.620875869e-03f, -2.468235104e-03f, -2.687016826e-03f, +1.019722344e-03f, +1.737914652e-03f, -4.431707792e-04f, -1.148296197e-03f, +1.691254733e-04f, +7.452045187e-04f, -3.897633968e-05f, -4.632372998e-04f, -1.441246259e-05f, +2.696983397e-04f, +2.736098108e-05f, -1.430542885e-04f, -2.181258871e-05f, +6.608644198e-05f, +1.094354843e-05f, -2.403844844e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.418734663e-04f, +7.424081816e-04f, -4.374558186e-04f, -2.743527418e-03f, +1.079477624e-03f, +5.875654107e-03f, -2.311420299e-03f, -1.046604069e-02f, +4.386786594e-03f, +1.637766780e-02f, -7.482246328e-03f, -2.313835166e-02f, +1.160043516e-02f, +2.998051041e-02f, -1.649873017e-02f, -3.597227795e-02f, +2.167775814e-02f, +4.021171452e-02f, -2.644755700e-02f, -4.203203363e-02f, +3.006373698e-02f, +4.115844435e-02f, -3.189985205e-02f, -3.777000657e-02f, +3.160582955e-02f, +3.244882620e-02f, -2.920289500e-02f, -2.603378081e-02f, +2.508378276e-02f, +1.942433079e-02f, -1.991696171e-02f, -1.339205437e-02f, +1.448427718e-02f, +8.449964215e-03f, -9.501610836e-03f, -4.806482250e-03f, +5.474813903e-03f, +2.401691461e-03f, -2.628061307e-03f, -9.990485321e-04f, +7.210190713e-04f, +2.798559662e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.142767771e-05f, -3.310429977e-06f, +8.858557120e-05f, +7.210351542e-06f, -2.154787367e-04f, +1.073742985e-05f, +4.163863488e-04f, -6.171446108e-05f, -6.922222111e-04f, +1.621478363e-04f, +1.026597802e-03f, -3.228743345e-04f, -1.385412165e-03f, +5.432265444e-04f, +1.721655398e-03f, -8.073400673e-04f, -1.984715161e-03f, +1.084533190e-03f, +2.131837634e-03f, -1.334392726e-03f, -2.138452665e-03f, +1.515571199e-03f, +2.004234274e-03f, -1.595873504e-03f, -1.753027009e-03f, +1.560563756e-03f, +1.426694509e-03f, -1.416252865e-03f, -1.074844904e-03f, +1.189114717e-03f, +7.435767528e-04f, -9.180235657e-04f, -4.664693497e-04f, +6.448251093e-04f, +2.600441250e-04f, -4.047599059e-04f, -1.242826112e-04f, +2.197888415e-04f, +4.714274876e-05f, -9.638600554e-05f, -1.094354843e-05f, +2.403844844e-05f, +0.000000000e+00f, + /* 8,20 (44) */ + +0.000000000e+00f, -1.204457886e-04f, -7.390977517e-04f, +2.162325615e-04f, +1.896028970e-03f, -1.381019197e-04f, -3.875814623e-03f, -3.907441495e-04f, +6.932912481e-03f, +1.798218722e-03f, -1.133225222e-02f, -4.721551456e-03f, +1.740258945e-02f, +1.016363758e-02f, -2.573508321e-02f, -1.999258231e-02f, +3.785521243e-02f, +3.885749643e-02f, -5.911652209e-02f, -8.507703122e-02f, +1.227681999e-01f, +4.112401315e-01f, +4.546618072e-01f, +2.005262598e-01f, -5.543713289e-02f, -8.195717992e-02f, +2.030526428e-02f, +4.832042667e-02f, -7.542354851e-03f, -3.090787165e-02f, +1.725358962e-03f, +1.987093217e-02f, +8.642439036e-04f, -1.237785232e-02f, -1.730632730e-03f, +7.273564073e-03f, +1.690574852e-03f, -3.919009279e-03f, -1.251960867e-03f, +1.856516824e-03f, +7.314307309e-04f, -7.100755228e-04f, -3.038944146e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.084714333e-05f, +5.107193698e-06f, -6.046563196e-05f, -1.549922050e-05f, +1.306592947e-04f, +4.510330362e-05f, -2.413216300e-04f, -1.112497165e-04f, +4.018824413e-04f, +2.400701682e-04f, -6.214410693e-04f, -4.723232733e-04f, +9.111030623e-04f, +8.805431766e-04f, -1.291232807e-03f, -1.628809553e-03f, +1.809004221e-03f, +3.254123434e-03f, -2.526874633e-03f, -9.398032212e-03f, -6.714680117e-03f, +4.029714077e-03f, +9.869478069e-03f, +4.879274799e-03f, -2.333528214e-03f, -2.780829778e-03f, +9.256274826e-04f, +1.780749095e-03f, -3.788846557e-04f, -1.168467854e-03f, +1.259739956e-04f, +7.541364601e-04f, -1.100913829e-05f, -4.666406816e-04f, -3.160476641e-05f, +2.706472842e-04f, +3.718108509e-05f, -1.431597354e-04f, -2.687199657e-05f, +6.608696828e-05f, +1.316861113e-05f, -2.416746233e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.204457886e-04f, +7.390977517e-04f, -3.488702474e-04f, -2.736317066e-03f, +8.639988871e-04f, +5.886391536e-03f, -1.895033950e-03f, -1.052775515e-02f, +3.694564383e-03f, +1.653981564e-02f, -6.455648525e-03f, -2.346122599e-02f, +1.021502299e-02f, +3.052373695e-02f, -1.477707477e-02f, -3.677961802e-02f, +1.969304298e-02f, +4.129624771e-02f, -2.431571937e-02f, -4.336642635e-02f, +2.792528431e-02f, +4.267401554e-02f, -2.989561778e-02f, -3.936588008e-02f, +2.985280254e-02f, +3.400938995e-02f, -2.777620049e-02f, -2.745003367e-02f, +2.400893786e-02f, +2.061344550e-02f, -1.917338496e-02f, -1.431007794e-02f, +1.401780783e-02f, +9.094789324e-03f, -9.241566711e-03f, -5.211242156e-03f, +5.350531292e-03f, +2.621480303e-03f, -2.580918558e-03f, -1.095434538e-03f, +7.100755228e-04f, +3.038944146e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.084714333e-05f, -5.107193698e-06f, +8.658319699e-05f, +1.425040657e-05f, -2.126161649e-04f, -4.637995848e-06f, +4.136389188e-04f, -3.394731136e-05f, -6.916366713e-04f, +1.182993974e-04f, +1.031238692e-03f, -2.606156279e-04f, -1.398928609e-03f, +4.624709043e-04f, +1.747510474e-03f, -7.107257092e-04f, -2.025255326e-03f, +9.773066992e-04f, +2.187470241e-03f, -1.223659887e-03f, -2.207203543e-03f, +1.409073225e-03f, +2.081863637e-03f, -1.500596614e-03f, -1.833717525e-03f, +1.481543950e-03f, +1.504146369e-03f, -1.355875694e-03f, -1.143483410e-03f, +1.147054322e-03f, +7.995452478e-04f, -8.917723239e-04f, -5.081550995e-04f, +6.306021650e-04f, +2.880380885e-04f, -3.985064122e-04f, -1.408490179e-04f, +2.179789158e-04f, +5.540925410e-05f, -9.648584411e-05f, -1.316861113e-05f, +2.416746233e-05f, +0.000000000e+00f, + /* 8,21 (44) */ + +0.000000000e+00f, -9.959864522e-05f, -7.339905580e-04f, +1.557669295e-04f, +1.880529750e-03f, -7.442625010e-06f, -3.830711319e-03f, -6.320657796e-04f, +6.821662764e-03f, +2.200101163e-03f, -1.109218205e-02f, -5.342992525e-03f, +1.693026618e-02f, +1.107474064e-02f, -2.485454003e-02f, -2.128381512e-02f, +3.622640287e-02f, +4.066650065e-02f, -5.586239866e-02f, -8.760390585e-02f, +1.133701677e-01f, +4.045254514e-01f, +4.586915213e-01f, +2.103957378e-01f, -5.055785810e-02f, -8.429070813e-02f, +1.752443450e-02f, +4.924605415e-02f, -5.761605756e-03f, -3.128675631e-02f, +5.568911090e-04f, +1.999690617e-02f, +1.618380364e-03f, -1.238886146e-02f, -2.197273411e-03f, +7.241959306e-03f, +1.961222136e-03f, -3.881828194e-03f, -1.395120602e-03f, +1.829644827e-03f, +7.975176992e-04f, -6.969069117e-04f, -3.280618770e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.022439527e-05f, +6.833434631e-06f, -5.914530952e-05f, -1.962431458e-05f, +1.278188358e-04f, +5.312490959e-05f, -2.354500713e-04f, -1.250083200e-04f, +3.904285214e-04f, +2.616563963e-04f, -6.002632396e-04f, -5.039364399e-04f, +8.733938990e-04f, +9.242306866e-04f, -1.224821774e-03f, -1.685440871e-03f, +1.687550236e-03f, +3.315333055e-03f, -2.268004217e-03f, -9.290043881e-03f, -6.972520433e-03f, +3.698127934e-03f, +9.863177323e-03f, +5.135515976e-03f, -2.190981361e-03f, -2.870183705e-03f, +8.279793927e-04f, +1.820192390e-03f, -3.128233666e-04f, -1.186250152e-03f, +8.191999454e-05f, +7.614543474e-04f, +1.740619401e-05f, -4.690051627e-04f, -4.901127214e-05f, +2.709680669e-04f, +4.710225478e-05f, -1.429159500e-04f, -3.198316856e-05f, +6.591539633e-05f, +1.542623912e-05f, -2.422716675e-05f, +0.000000000e+00f, + +0.000000000e+00f, +9.959864522e-05f, +7.339905580e-04f, -2.622870504e-04f, -2.722066660e-03f, +6.513827222e-04f, +5.881753541e-03f, -1.481395032e-03f, -1.056170246e-02f, +3.002927711e-03f, +1.665811503e-02f, -5.424409833e-03f, -2.372184162e-02f, +8.816094385e-03f, +3.098620786e-02f, -1.302956429e-02f, -3.749034373e-02f, +1.766778765e-02f, +4.227355441e-02f, -2.212824912e-02f, -4.459008624e-02f, +2.571808077e-02f, +4.408308877e-02f, -2.781375414e-02f, -4.086647669e-02f, +2.801908502e-02f, +3.549093390e-02f, -2.627205412e-02f, -2.880590937e-02f, +2.286545445e-02f, +2.176049983e-02f, -1.837383971e-02f, -1.520185026e-02f, +1.350965273e-02f, +9.725391489e-03f, -8.953528623e-03f, -5.609748568e-03f, +5.209682274e-03f, +2.839459219e-03f, -2.525509304e-03f, -1.191920382e-03f, +6.969069117e-04f, +3.280618770e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.022439527e-05f, -6.833434631e-06f, +8.439347096e-05f, +2.106071123e-05f, -2.092462143e-04f, -1.968713542e-05f, +4.098560803e-04f, -6.536878019e-06f, -6.892718057e-04f, +7.470322627e-05f, +1.033184287e-03f, -1.983107871e-04f, -1.408759996e-03f, +3.811506542e-04f, +1.768755735e-03f, -6.128326608e-04f, -2.060476642e-03f, +8.679714118e-04f, +2.237417363e-03f, -1.109994551e-03f, -2.270314702e-03f, +1.298963777e-03f, +2.154305823e-03f, -1.401294039e-03f, -1.909999891e-03f, +1.398419915e-03f, +1.578161324e-03f, -1.291655395e-03f, -1.209694110e-03f, +1.101689457e-03f, +8.539948454e-04f, -8.629234091e-04f, -5.490371495e-04f, +6.145298076e-04f, +3.157135344e-04f, -3.910808416e-04f, -1.573685710e-04f, +2.155286933e-04f, +6.373892123e-05f, -9.630421979e-05f, -1.542623912e-05f, +2.422716675e-05f, +0.000000000e+00f, + /* 8,22 (44) */ + +0.000000000e+00f, -7.937424996e-05f, -7.271571233e-04f, +9.662161999e-05f, +1.860905435e-03f, +1.203762108e-04f, -3.777586410e-03f, -8.675158509e-04f, +6.696654445e-03f, +2.590529685e-03f, -1.083052566e-02f, -5.943255765e-03f, +1.642632974e-02f, +1.194813454e-02f, -2.393030935e-02f, -2.250863689e-02f, +3.454096200e-02f, +4.235405088e-02f, -5.254706560e-02f, -8.987191007e-02f, +1.040801238e-01f, +3.975529310e-01f, +4.623896493e-01f, +2.202589152e-01f, -4.542234212e-02f, -8.648168949e-02f, +1.465425080e-02f, +5.007403355e-02f, -3.941413366e-03f, -3.159957967e-02f, -6.293590427e-04f, +2.007882616e-02f, +2.379834711e-03f, -1.237145527e-02f, -2.666278574e-03f, +7.192948034e-03f, +2.232190203e-03f, -3.834725940e-03f, -1.538036552e-03f, +1.797661659e-03f, +8.634330955e-04f, -6.814806726e-04f, -3.522890437e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.956278904e-05f, +8.486307925e-06f, -5.770865334e-05f, -2.360234839e-05f, +1.247302240e-04f, +6.086322209e-05f, -2.291314354e-04f, -1.382441196e-04f, +3.782544149e-04f, +2.823162196e-04f, -5.780218488e-04f, -5.339595571e-04f, +8.342347209e-04f, +9.652327035e-04f, -1.156627495e-03f, -1.737490298e-03f, +1.564448624e-03f, +3.368330420e-03f, -2.011114502e-03f, -9.171734749e-03f, -7.220960571e-03f, +3.361462821e-03f, +9.844719429e-03f, +5.389171783e-03f, -2.040716467e-03f, -2.954814590e-03f, +7.269367777e-04f, +1.856107526e-03f, -2.451114403e-04f, -1.201569264e-03f, +3.705235275e-05f, +7.671179684e-04f, +4.620975957e-05f, -4.703089230e-04f, -6.659394642e-05f, +2.706488403e-04f, +5.710205251e-05f, -1.423163382e-04f, -3.713412602e-05f, +6.556783713e-05f, +1.771094961e-05f, -2.421511060e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.937424996e-05f, +7.271571233e-04f, -1.778935794e-04f, -2.701005949e-03f, +4.421365079e-04f, +5.862066405e-03f, -1.071538951e-03f, -1.056823934e-02f, +2.313655906e-03f, +1.673281826e-02f, -4.391225546e-03f, -2.392015241e-02f, +7.407334389e-03f, +3.136735851e-02f, -1.126080856e-02f, -3.810317639e-02f, +1.560731101e-02f, +4.314152582e-02f, -1.989083176e-02f, -4.570008079e-02f, +2.344776607e-02f, +4.538205255e-02f, -2.565944832e-02f, -4.226777073e-02f, +2.610908513e-02f, +3.688935382e-02f, -2.469389280e-02f, -3.009756476e-02f, +2.165576034e-02f, +2.286218928e-02f, -1.751984486e-02f, -1.606477367e-02f, +1.296061558e-02f, +1.033992130e-02f, -8.637815088e-03f, -6.000829409e-03f, +5.052313703e-03f, +3.054987912e-03f, -2.461770383e-03f, -1.288224602e-03f, +6.814806726e-04f, +3.522890437e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.956278904e-05f, -8.486307925e-06f, +8.202870318e-05f, +2.762760690e-05f, -2.053897813e-04f, -3.437545963e-05f, +4.050663648e-04f, +2.044965488e-05f, -6.851589268e-04f, +3.147027837e-05f, +1.032459620e-03f, -1.361219172e-04f, -1.414912861e-03f, +2.994798621e-04f, +1.785366232e-03f, -5.139195696e-04f, -2.090312125e-03f, +7.568152173e-04f, +2.281564981e-03f, -9.936928337e-04f, -2.327627661e-03f, +1.185524330e-03f, +2.221368260e-03f, -1.298212264e-03f, -1.981663839e-03f, +1.311389056e-03f, +1.648530526e-03f, -1.223734587e-03f, -1.273287459e-03f, +1.053110646e-03f, +9.067685159e-04f, -8.315244415e-04f, -5.889974946e-04f, +5.966253717e-04f, +3.429910801e-04f, -3.824830127e-04f, -1.737946493e-04f, +2.124308514e-04f, +7.210903727e-05f, -9.583336027e-05f, -1.771094961e-05f, +2.421511060e-05f, +0.000000000e+00f, + /* 8,23 (44) */ + +0.000000000e+00f, -5.981146091e-05f, -7.186708154e-04f, +3.891296665e-05f, +1.837303087e-03f, +2.451064348e-04f, -3.716723188e-03f, -1.096647286e-03f, +6.558410325e-03f, +2.968784100e-03f, -1.054820944e-02f, -6.521277614e-03f, +1.589237018e-02f, +1.278236926e-02f, -2.296507664e-02f, -2.366526438e-02f, +3.280347170e-02f, +4.391849951e-02f, -4.917873518e-02f, -9.188302457e-02f, +9.490838907e-02f, +3.903319704e-01f, +4.657511121e-01f, +2.301036346e-01f, -4.003317034e-02f, -8.852240596e-02f, +1.169943621e-02f, +5.080097032e-02f, -2.085305840e-03f, -3.184469111e-02f, -1.830928306e-03f, +2.011587851e-02f, +3.146952680e-03f, -1.232524551e-02f, -3.136587497e-03f, +7.126354088e-03f, +2.502839044e-03f, -3.777623887e-03f, -1.680352891e-03f, +1.760527533e-03f, +9.290009326e-04f, -6.637697230e-04f, -3.765041543e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.886570663e-05f, +1.006325487e-05f, -5.616245785e-05f, -2.742657843e-05f, +1.214062683e-04f, +6.830491191e-05f, -2.223887316e-04f, -1.509345828e-04f, +3.653998246e-04f, +3.020156231e-04f, -5.547832275e-04f, -5.623463434e-04f, +7.937339537e-04f, +1.003494338e-03f, -1.086825811e-03f, -1.784912553e-03f, +1.439984936e-03f, +3.413161095e-03f, -1.756590075e-03f, -9.043370036e-03f, -7.459689256e-03f, +3.020176466e-03f, +9.814045284e-03f, +5.639815044e-03f, -1.882870823e-03f, -3.034463845e-03f, +6.226678819e-04f, +1.888363348e-03f, -1.758788128e-04f, -1.214355977e-03f, -8.536945332e-06f, +7.710904031e-04f, +7.533986833e-05f, -4.705323363e-04f, -8.431371580e-05f, +2.696791191e-04f, +6.715743137e-05f, -1.413550798e-04f, -4.231252662e-05f, +6.504078892e-05f, +2.001703818e-05f, -2.412899703e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.981146091e-05f, +7.186708154e-04f, -9.586487626e-05f, -2.673378342e-03f, +2.367467266e-04f, +5.827690945e-03f, -6.664725864e-04f, -1.054778968e-02f, +1.628496979e-03f, +1.676428854e-02f, -3.358765927e-03f, -2.405627433e-02f, +5.992421528e-03f, +3.166683837e-02f, -9.475442327e-03f, -3.861709596e-02f, +1.351699889e-02f, +4.389834104e-02f, -1.760926678e-02f, -4.669377363e-02f, +2.112013841e-02f, +4.656757688e-02f, -2.343808006e-02f, -4.356598299e-02f, +2.412742129e-02f, +3.820074287e-02f, -2.304536227e-02f, -3.132129935e-02f, +2.038247288e-02f, +2.391529993e-02f, -1.661307635e-02f, -1.689629811e-02f, +1.237161809e-02f, +1.093654667e-02f, -8.294824008e-03f, -6.383312422e-03f, +4.878519054e-03f, +3.267418763e-03f, -2.389661345e-03f, -1.384057962e-03f, +6.637697230e-04f, +3.765041543e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.886570663e-05f, -1.006325487e-05f, +7.950140619e-05f, +3.393849481e-05f, -2.010686993e-04f, -4.867011854e-05f, +3.993005730e-04f, +4.694729371e-05f, -6.793336019e-04f, -1.129083210e-05f, +1.029096508e-03f, -7.420923400e-05f, -1.417403325e-03f, +2.176719137e-04f, +1.797329261e-03f, -4.142463470e-04f, -2.114709087e-03f, +6.441297486e-04f, +2.319814411e-03f, -8.750572352e-04f, -2.378999080e-03f, +1.069045087e-03f, +2.282872110e-03f, -1.191608132e-03f, -2.048510478e-03f, +1.220659775e-03f, +1.715053605e-03f, -1.152266461e-03f, -1.334079442e-03f, +1.001417649e-03f, +9.577121940e-04f, -7.976303570e-04f, -6.279191849e-04f, +5.769113925e-04f, +3.697912301e-04f, -3.727159975e-04f, -1.900800085e-04f, +2.086797875e-04f, +8.049621737e-05f, -9.506618998e-05f, -2.001703818e-05f, +2.412899703e-05f, +0.000000000e+00f, + /* 8,24 (44) */ + +0.000000000e+00f, -4.094575428e-05f, -7.086075605e-04f, -1.724949120e-05f, +1.809876508e-03f, +3.665127031e-04f, -3.648418276e-03f, -1.319036018e-03f, +6.407475742e-03f, +3.334183924e-03f, -1.024619382e-02f, -7.076060841e-03f, +1.533002384e-02f, +1.357610321e-02f, -2.196158231e-02f, -2.475209020e-02f, +3.101855915e-02f, +4.535848444e-02f, -4.576557409e-02f, -9.363961465e-02f, +8.586501903e-02f, +3.828722811e-01f, +4.687712885e-01f, +2.399176799e-01f, -3.439335529e-02f, -9.040527678e-02f, +8.664972362e-03f, +5.142363821e-02f, -1.969424922e-04f, -3.202056993e-02f, -3.045284283e-03f, +2.010734157e-02f, +3.918043083e-03f, -1.224990564e-02f, -3.607119833e-03f, +7.042040372e-03f, +2.772518163e-03f, -3.710466456e-03f, -1.821707971e-03f, +1.718215006e-03f, +9.940417215e-04f, -6.437526848e-04f, -4.006331513e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.813654524e-05f, +1.156200341e-05f, -5.451365104e-05f, -3.109080837e-05f, +1.178601126e-04f, +7.543762803e-05f, -2.152455967e-04f, -1.630588444e-04f, +3.519054467e-04f, +3.207233305e-04f, -5.306150743e-04f, -5.890548917e-04f, +7.520015975e-04f, +1.038967548e-03f, -1.015593691e-03f, -1.827672860e-03f, +1.314443263e-03f, +3.449884991e-03f, -1.504807565e-03f, -8.905229318e-03f, -7.688411219e-03f, +2.674734318e-03f, +9.771114886e-03f, +5.887019779e-03f, -1.717596983e-03f, -3.108878884e-03f, +5.153502663e-04f, +1.916834922e-03f, -1.052606080e-04f, -1.224545909e-03f, -5.475298431e-05f, +7.733381554e-04f, +1.047331584e-04f, -4.696580509e-04f, -1.021305455e-04f, +2.680498294e-04f, +7.724478239e-05f, -1.400271590e-04f, -4.750568960e-05f, +6.433115545e-05f, +2.233858996e-05f, -2.396669449e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.094575428e-05f, +7.086075605e-04f, -1.636347006e-05f, -2.639439847e-03f, +3.567802731e-05f, +5.779020827e-03f, -2.671720134e-04f, -1.050084239e-02f, +9.491633768e-04f, +1.675299771e-02f, -2.329669418e-03f, -2.413048356e-02f, +4.575018202e-03f, +3.188451029e-02f, -7.678113066e-03f, -3.903134231e-02f, +1.140228980e-02f, +4.454247079e-02f, -1.528945237e-02f, -4.756883086e-02f, +1.874113933e-02f, +4.763662196e-02f, -2.115520795e-02f, -4.475759113e-02f, +2.207891081e-02f, +3.942140265e-02f, -2.133030867e-02f, -3.247356581e-02f, +1.904839344e-02f, +2.491671758e-02f, -1.565536415e-02f, -1.769392847e-02f, +1.174369890e-02f, +1.151345806e-02f, -7.925032778e-03f, -6.756028420e-03f, +4.688439045e-03f, +3.476098551e-03f, -2.309165128e-03f, -1.479124152e-03f, +6.437526848e-04f, +4.006331513e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.813654524e-05f, -1.156200341e-05f, +7.682424980e-05f, +3.998184953e-05f, -1.963056544e-04f, -6.254000361e-05f, +3.925916505e-04f, +7.289338143e-05f, -6.718354979e-04f, -5.347409763e-05f, +1.023133402e-03f, -1.273065514e-05f, -1.416256979e-03f, +1.359389520e-04f, +1.804644322e-03f, -3.140734770e-04f, -2.133629210e-03f, +5.302096033e-04f, +2.352082522e-03f, -7.543958355e-04f, -2.424301130e-03f, +9.498242216e-04f, +2.338652763e-03f, -1.081748194e-03f, -2.110352850e-03f, +1.126450964e-03f, +1.777539236e-03f, -1.077414432e-03f, -1.391892103e-03f, +9.467192680e-04f, +1.006675221e-03f, -7.613033350e-04f, -6.656866567e-04f, +5.554156132e-04f, +3.960345967e-04f, -3.617861668e-04f, -2.061769061e-04f, +2.042716706e-04f, +8.887646084e-05f, -9.399637063e-05f, -2.233858996e-05f, +2.396669449e-05f, +0.000000000e+00f, + /* 8,25 (44) */ + +0.000000000e+00f, -2.280920904e-05f, -6.970455571e-04f, -7.176314224e-05f, +1.778785700e-03f, +4.843728157e-04f, -3.572980648e-03f, -1.534281615e-03f, +6.244416898e-03f, +3.686089371e-03f, -9.925470485e-03f, -7.606675916e-03f, +1.474096895e-02f, +1.432810481e-02f, -2.092261476e-02f, -2.576768389e-02f, +2.919088629e-02f, +4.667292771e-02f, -4.231568910e-02f, -9.514442221e-02f, +7.695978971e-02f, +3.751838699e-01f, +4.714460229e-01f, +2.496887948e-01f, -2.850633551e-02f, -9.212287376e-02f, +5.556093478e-03f, +5.193898847e-02f, +1.719892430e-03f, -3.212583053e-02f, -4.269830192e-03f, +2.005258858e-02f, +4.691381238e-03f, -1.214517248e-02f, -4.076777884e-03f, +6.939909826e-03f, +3.040567992e-03f, -3.633221673e-03f, -1.961735130e-03f, +1.670709316e-03f, +1.058372877e-03f, -6.214140948e-04f, -4.245998458e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.737870626e-05f, +1.298056784e-05f, -5.276927238e-05f, -3.458939389e-05f, +1.141051959e-04f, +8.225001081e-05f, -2.077262260e-04f, -1.745977306e-04f, +3.378128593e-04f, +3.384108386e-04f, -5.055862801e-04f, -6.140477072e-04f, +7.091489576e-04f, +1.071611160e-03f, -9.431088328e-04f, -1.865746873e-03f, +1.188105689e-03f, +3.478576103e-03f, -1.256135034e-03f, -8.757605971e-03f, -7.906847652e-03f, +2.325608775e-03f, +9.715907479e-03f, +6.130361963e-03f, -1.545062632e-03f, -3.177813682e-03f, +4.051705618e-04f, +1.941403888e-03f, -3.339690446e-05f, -1.232079723e-03f, -1.014980978e-04f, +7.738312790e-04f, +1.343247226e-04f, -4.676710644e-04f, -1.200035216e-04f, +2.657533541e-04f, +8.733998399e-05f, -1.383283922e-04f, -5.270062244e-05f, +6.343626354e-05f, +2.466949175e-05f, -2.372624758e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.280920904e-05f, +6.970455571e-04f, +6.046077973e-05f, -2.599457997e-03f, -1.606276271e-04f, +5.716480823e-03f, +1.254196371e-04f, -1.042794901e-02f, +2.773278789e-04f, +1.669952361e-02f, -1.306536016e-03f, -2.414321422e-02f, +3.158761223e-03f, +3.202044924e-02f, -5.873468744e-03f, -3.934541578e-02f, +9.268660589e-03f, +4.507268039e-02f, -1.293736985e-02f, -4.832322670e-02f, +1.631683820e-02f, +4.858644618e-02f, -1.881655519e-02f, -4.583933932e-02f, +1.996855796e-02f, +4.054785361e-02f, -1.955276943e-02f, -3.355098024e-02f, +1.765650133e-02f, +2.586343685e-02f, -1.464868893e-02f, -1.845523181e-02f, +1.107801225e-02f, +1.206887367e-02f, -7.528998181e-03f, -7.117814586e-03f, +4.482262139e-03f, +3.680370221e-03f, -2.220288667e-03f, -1.573120522e-03f, +6.214140948e-04f, +4.245998458e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.737870626e-05f, -1.298056784e-05f, +7.401001638e-05f, +4.574722876e-05f, -1.911241015e-04f, -7.595580378e-05f, +3.849745594e-04f, +9.822773494e-05f, -6.627082172e-04f, -9.497637221e-05f, +1.014615202e-03f, +4.815859980e-05f, -1.411508730e-03f, +5.449132512e-05f, +1.807323043e-03f, -2.136613268e-04f, -2.147048585e-03f, +4.153515593e-04f, +2.378301921e-03f, -6.320214768e-04f, -2.463421819e-03f, +8.281670986e-04f, +2.388560283e-03f, -9.689080262e-04f, -2.167016456e-03f, +1.028991470e-03f, +1.835805697e-03f, -9.993517718e-04f, -1.446554062e-03f, +8.891331350e-04f, +1.053510781e-03f, -7.226127060e-04f, -7.021860642e-04f, +5.321709771e-04f, +4.216421221e-04f, -3.497032258e-04f, -2.220372295e-04f, +1.992044890e-04f, +9.722521034e-05f, -9.261834034e-05f, -2.466949175e-05f, +2.372624758e-05f, +0.000000000e+00f, + /* 8,26 (44) */ + +0.000000000e+00f, -5.430502781e-06f, -6.840649893e-04f, -1.245324146e-04f, +1.744196306e-03f, +5.984780117e-04f, -3.490730637e-03f, -1.742007841e-03f, +6.069819167e-03f, +4.023902230e-03f, -9.587059646e-03f, -8.112262196e-03f, +1.412692124e-02f, +1.503725377e-02f, -1.985100360e-02f, -2.671079272e-02f, +2.732513942e-02f, +4.786103340e-02f, -3.883711299e-02f, -9.640055725e-02f, +6.820218374e-02f, +3.672770223e-01f, +4.737716316e-01f, +2.594047022e-01f, -2.237597355e-02f, -9.366793640e-02f, +2.378279796e-03f, +5.234415903e-02f, +3.661296318e-03f, -3.215922744e-02f, -5.501909915e-03f, +1.995109049e-02f, +5.465212517e-03f, -1.201084776e-02f, -4.544448948e-03f, +6.819906305e-03f, +3.306321346e-03f, -3.545881689e-03f, -2.100063522e-03f, +1.618008694e-03f, +1.121809141e-03f, -5.967446031e-04f, -4.483260934e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.659558457e-05f, +1.431724768e-05f, -5.093645098e-05f, -3.791724618e-05f, +1.101552123e-04f, +8.873170256e-05f, -1.998553052e-04f, -1.855337779e-04f, +3.231644100e-04f, +3.550524448e-04f, -4.797667512e-04f, -6.372917343e-04f, +6.652883750e-04f, +1.101390868e-03f, -8.695492688e-04f, -1.899120603e-03f, +1.061251757e-03f, +3.499322218e-03f, -1.010931395e-03f, -8.600806591e-03f, -8.114736642e-03f, +1.973278391e-03f, +9.648421663e-03f, +6.369420286e-03f, -1.365450418e-03f, -3.241029330e-03f, +2.923242001e-04f, +1.961958798e-03f, +3.956751245e-05f, -1.236903324e-03f, -1.486720570e-04f, +7.725434958e-04f, +1.640482395e-04f, -4.645587956e-04f, -1.378909369e-04f, +2.627835768e-04f, +9.741845355e-05f, -1.362554549e-04f, -5.788404891e-05f, +6.235387979e-05f, +2.700344492e-05f, -2.340588755e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.430502781e-06f, +6.840649893e-04f, +1.344707961e-04f, -2.553710769e-03f, -3.517517285e-04f, +5.640525020e-03f, +5.103941965e-04f, -1.032972127e-02f, -3.853803383e-04f, +1.660454724e-02f, -2.919208143e-04f, -2.409505562e-02f, +1.747252493e-03f, +3.207494056e-02f, -4.066145701e-03f, -3.955907711e-02f, +7.121612003e-03f, +4.548803195e-02f, -1.055906793e-02f, -4.895524817e-02f, +1.385341638e-02f, +4.941461328e-02f, -1.642799490e-02f, -4.680824735e-02f, +1.780154150e-02f, +4.157684508e-02f, -1.771696373e-02f, -3.455033201e-02f, +1.620994727e-02f, +2.675256998e-02f, -1.359517815e-02f, -1.917784451e-02f, +1.037582618e-02f, +1.260104465e-02f, -7.107356059e-03f, -7.467517812e-03f, +4.260224910e-03f, +3.879574710e-03f, -2.123063457e-03f, -1.665738863e-03f, +5.967446031e-04f, +4.483260934e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.659558457e-05f, -1.431724768e-05f, +7.107155702e-05f, +5.122527963e-05f, -1.855481789e-04f, -8.889005515e-05f, +3.764861458e-04f, +1.228927735e-04f, -6.519991251e-04f, -1.356976152e-04f, +1.003593071e-03f, +1.083063974e-04f, -1.403202629e-03f, -2.646295790e-05f, +1.805389067e-03f, -1.132694617e-04f, -2.154957710e-03f, +2.998537883e-04f, +2.398421082e-03f, -5.082509356e-04f, -2.496265270e-03f, +7.043854709e-04f, +2.432459817e-03f, -8.533715254e-04f, -2.218339760e-03f, +9.285195307e-04f, +1.889681393e-03f, -9.182612062e-04f, -1.497901017e-03f, +8.287854638e-04f, +1.098076332e-03f, -6.816348387e-04f, -7.373056101e-04f, +5.072156049e-04f, +4.465353040e-04f, -3.364802418e-04f, -2.376126283e-04f, +1.934780934e-04f, +1.055174142e-04f, -9.092735126e-05f, -2.700344492e-05f, +2.340588755e-05f, +0.000000000e+00f, + /* 8,27 (44) */ + +0.000000000e+00f, +1.116508179e-05f, -6.697477416e-04f, -1.754688656e-04f, +1.706279060e-03f, +7.086332239e-04f, -3.401998934e-03f, -1.941863146e-03f, +5.884285389e-03f, +4.347066640e-03f, -9.232007201e-03f, -8.592028947e-03f, +1.348962951e-02f, +1.570254214e-02f, -1.874961273e-02f, -2.758034199e-02f, +2.542601882e-02f, +4.892228515e-02f, -3.533779078e-02f, -9.741148864e-02f, +5.960137715e-02f, +3.591622856e-01f, +4.757449100e-01f, +2.690531239e-01f, -1.600655326e-02f, -9.503338681e-02f, -8.627495342e-04f, +5.263648323e-02f, +5.623255116e-03f, -3.211965993e-02f, -6.738813239e-03f, +1.980241843e-02f, +6.237756013e-03f, -1.184679952e-02f, -5.009007744e-03f, +6.682015368e-03f, +3.569104923e-03f, -3.448463236e-03f, -2.236318977e-03f, +1.560124645e-03f, +1.184163020e-03f, -5.697411582e-04f, -4.717319809e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.579055794e-05f, +1.557062569e-05f, -4.902238392e-05f, -4.106983364e-05f, +1.060240704e-04f, +9.487335522e-05f, -1.916579412e-04f, -1.958512485e-04f, +3.080031036e-04f, +3.706252664e-04f, -4.532272335e-04f, -6.587583729e-04f, +6.205329591e-04f, +1.128279224e-03f, -7.950929731e-04f, -1.927790301e-03f, +9.341579451e-04f, +3.512224607e-03f, -7.695458477e-04f, -8.435150394e-03f, -8.311833564e-03f, +1.618227086e-03f, +9.568675473e-03f, +6.603776907e-03f, -1.178957764e-03f, -3.298294587e-03f, +1.770151251e-04f, +1.978395458e-03f, +1.134834115e-04f, -1.238968054e-03f, -1.961722680e-04f, +7.694523085e-04f, +1.938361112e-04f, -4.603111501e-04f, -1.557503799e-04f, +2.591359210e-04f, +1.074552011e-04f, -1.338059061e-04f, -6.304243838e-05f, +6.108222644e-05f, +2.933397920e-05f, -2.300404255e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.116508179e-05f, +6.697477416e-04f, +2.055423531e-04f, -2.502485489e-03f, -5.372999074e-04f, +5.551634964e-03f, +8.868803424e-04f, -1.020682850e-02f, -1.037379463e-03f, +1.646884962e-02f, +7.116722567e-04f, -2.398674922e-02f, +3.440498641e-04f, +3.204847761e-02f, -2.260756634e-03f, -3.967234657e-02f, +4.966654293e-03f, +4.578788574e-02f, -8.160646843e-03f, -4.946349911e-02f, +1.135715111e-02f, +5.011899875e-02f, -1.399553509e-02f, -4.766161887e-02f, +1.558320174e-02f, +4.250536461e-02f, -1.582728234e-02f, -3.546859322e-02f, +1.471204625e-02f, +2.758135544e-02f, -1.249710182e-02f, -1.985947935e-02f, +9.638520573e-03f, +1.310826026e-02f, -6.660820755e-03f, -7.803998054e-03f, +4.022612281e-03f, +4.073052804e-03f, -2.017546043e-03f, -1.756666214e-03f, +5.697411582e-04f, +4.717319809e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.579055794e-05f, -1.557062569e-05f, +6.802174843e-05f, +5.640774150e-05f, -1.796026234e-04f, -1.013171845e-04f, +3.671650045e-04f, +1.468336382e-04f, -6.397591682e-04f, -1.755411240e-04f, +9.901242290e-04f, +1.675640669e-04f, -1.391391680e-03f, -1.067187602e-04f, +1.798877921e-03f, -1.315596484e-05f, -2.157361451e-03f, +1.840150670e-04f, +2.412404450e-03f, -3.834040852e-04f, -2.522751965e-03f, +5.787966648e-04f, +2.470231970e-03f, -7.354301793e-04f, -2.264174645e-03f, +8.252821801e-04f, +1.939005358e-03f, -8.343344836e-04f, -1.545776231e-03f, +7.658107828e-04f, +1.140234026e-03f, -6.384530061e-04f, -7.709358742e-04f, +4.805927579e-04f, +4.706364215e-04f, -3.221336618e-04f, -2.528546485e-04f, +1.870942350e-04f, +1.137275915e-04f, -8.891950538e-05f, -2.933397920e-05f, +2.300404255e-05f, +0.000000000e+00f, + /* 8,28 (44) */ + +0.000000000e+00f, +2.695563973e-05f, -6.541771159e-04f, -2.244912495e-04f, +1.665209226e-03f, +8.146572943e-04f, -3.307125579e-03f, -2.133521087e-03f, +5.688434141e-03f, +4.655069744e-03f, -8.861381935e-03f, -9.045256180e-03f, +1.283087113e-02f, +1.632307510e-02f, -1.762133351e-02f, -2.837543496e-02f, +2.349822851e-02f, +4.985644310e-02f, -3.182556617e-02f, -9.818103449e-02f, +5.116622676e-02f, +3.508504521e-01f, +4.773631371e-01f, +2.786217994e-01f, -9.402776357e-03f, -9.621234458e-02f, -4.161044122e-03f, +5.281349836e-02f, +7.601650574e-03f, -3.200617651e-02f, -7.977781293e-03f, +1.960624616e-02f, +7.007208321e-03f, -1.165296341e-02f, -5.469318894e-03f, +6.526264988e-03f, +3.828240844e-03f, -3.341008035e-03f, -2.370124883e-03f, +1.497082207e-03f, +1.245245247e-03f, -5.404071790e-04f, -4.947360235e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.496697687e-05f, +1.673956517e-05f, -4.703431483e-05f, -4.404318231e-05f, +1.017258544e-04f, +1.006666355e-04f, -1.831595935e-04f, -2.055361406e-04f, +2.923724898e-04f, +3.851092549e-04f, -4.260391358e-04f, -6.784234845e-04f, +5.749963216e-04f, +1.152255607e-03f, -7.199174749e-04f, -1.951762343e-03f, +8.070971557e-04f, +3.517397689e-03f, -5.323173350e-04f, -8.260968595e-03f, -8.497911455e-03f, +1.260943332e-03f, +9.476706422e-03f, +6.833018219e-03f, -9.857966404e-04f, -3.349386414e-03f, +5.945548166e-05f, +1.990617239e-03f, +1.881973897e-04f, -1.238230873e-03f, -2.438939764e-04f, +7.645391042e-04f, +2.236196045e-04f, -4.549205816e-04f, -1.735388265e-04f, +2.548073873e-04f, +1.174248849e-04f, -1.309782120e-04f, -6.816203638e-05f, +5.961999631e-05f, +3.165446722e-05f, -2.251934746e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.695563973e-05f, +6.541771159e-04f, +2.735641016e-04f, -2.446077748e-03f, -7.169025308e-04f, +5.450317780e-03f, +1.254045347e-03f, -1.005999486e-02f, -1.677138632e-03f, +1.629330850e-02f, +1.701796486e-03f, -2.381918515e-02f, -1.047341816e-03f, +3.194175885e-02f, -4.618787135e-04f, -3.968550254e-02f, +2.809292843e-03f, +4.597190081e-02f, -5.748242393e-03f, -4.984690319e-02f, +8.834399142e-03f, +5.069779542e-02f, -1.152530311e-02f, -4.839704905e-02f, +1.331902710e-02f, +4.333064679e-02f, -1.388827698e-02f, -3.630292770e-02f, +1.316627002e-02f, +2.834716623e-02f, -1.135686779e-02f, -2.049793236e-02f, +8.867584699e-03f, +1.358885301e-02f, -6.190184334e-03f, -8.126131716e-03f, +3.769757633e-03f, +4.260147039e-03f, -1.903818451e-03f, -1.845585719e-03f, +5.404071790e-04f, +4.947360235e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.496697687e-05f, -1.673956517e-05f, +6.487345079e-05f, +6.128744519e-05f, -1.733126841e-04f, -1.132135465e-04f, +3.570513405e-04f, +1.699983012e-04f, -6.260426865e-04f, -2.144137544e-04f, +9.742717304e-04f, +2.257867632e-04f, -1.376137616e-03f, -1.860743392e-04f, +1.787836834e-03f, +8.642323395e-05f, -2.154278965e-03f, +6.813399060e-05f, +2.420232485e-03f, -2.578030512e-04f, -2.542818943e-03f, +4.517227478e-04f, +2.501773131e-03f, -6.153823148e-04f, -2.304386847e-03f, +7.195346339e-04f, +1.983627737e-03f, -7.477719213e-04f, -1.590031001e-03f, +7.003516420e-04f, +1.179851125e-03f, -5.931572319e-04f, -8.029701393e-04f, +4.523507860e-04f, +4.938687636e-04f, -3.066833210e-04f, -2.677148706e-04f, +1.800565991e-04f, +1.218299000e-04f, -8.659178844e-05f, -3.165446722e-05f, +2.251934746e-05f, +0.000000000e+00f, + /* 8,29 (44) */ + +0.000000000e+00f, +4.192261661e-05f, -6.374375508e-04f, -2.715255644e-04f, +1.621166044e-03f, +9.163831487e-04f, -3.206458944e-03f, -2.316680681e-03f, +5.482898000e-03f, +4.947442234e-03f, -8.476272680e-03f, -9.471295316e-03f, +1.215244765e-02f, +1.689807143e-02f, -1.646907790e-02f, -2.909535244e-02f, +2.154646617e-02f, +5.066354025e-02f, -2.830816848e-02f, -9.871335182e-02f, +4.290525816e-02f, +3.423525406e-01f, +4.786240804e-01f, +2.880985058e-01f, -2.569758138e-03f, -9.719814122e-02f, -7.510430536e-03f, +5.287295384e-02f, +9.592267814e-03f, -3.181797912e-02f, -9.216012166e-03f, +1.936235218e-02f, +7.771747426e-03f, -1.142934380e-02f, -5.924239476e-03f, +6.352726162e-03f, +4.083048231e-03f, -3.223583150e-03f, -2.501103095e-03f, +1.428920170e-03f, +1.304865243e-03f, -5.087527117e-04f, -5.172553710e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.412815468e-05f, +1.782320644e-05f, -4.497951281e-05f, -4.683387456e-05f, +9.727478371e-05f, +1.061042274e-04f, -1.743860058e-04f, -2.145761941e-04f, +2.763165514e-04f, +3.984872011e-04f, -3.982743552e-04f, -6.962673879e-04f, +5.287923119e-04f, +1.173306186e-03f, -6.441994771e-04f, -1.971053077e-03f, +6.803382136e-04f, +3.514968676e-03f, -2.995740239e-04f, -8.078603771e-03f, -8.672761342e-03f, +9.019193399e-04f, +9.372571504e-03f, +7.056735594e-03f, -7.861933153e-04f, -3.394090501e-03f, -6.013471407e-05f, +1.998535394e-03f, +2.635521593e-04f, -1.234654531e-03f, -2.917304806e-04f, +7.577892523e-04f, +2.533289979e-04f, -4.483821483e-04f, -1.912127353e-04f, +2.497965870e-04f, +1.273018687e-04f, -1.277717665e-04f, -7.322889637e-05f, +5.796636668e-05f, +3.395813985e-05f, -2.195065330e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.192261661e-05f, +6.374375508e-04f, +3.384375524e-04f, -2.384790302e-03f, -8.902152149e-04f, +5.337104233e-03f, +1.611096687e-03f, -9.889996558e-03f, -2.303181318e-03f, +1.607889474e-02f, +2.676068216e-03f, -2.359339839e-02f, -2.423479432e-03f, +3.175568451e-02f, +1.325958121e-03f, -3.959907930e-02f, +6.550138773e-04f, +4.604003480e-02f, -3.328009908e-03f, -5.010470624e-02f, +6.291580199e-03f, +5.114951817e-02f, -9.023529984e-03f, -4.901243137e-02f, +1.101464025e-02f, +4.405018143e-02f, -1.190464925e-02f, -3.705069963e-02f, +1.157623902e-02f, +2.904751787e-02f, -1.017701667e-02f, -2.109108959e-02f, +8.064614559e-03f, +1.404120380e-02f, -5.696315570e-03f, -8.432815037e-03f, +3.502042762e-03f, +4.440203638e-03f, -1.781988551e-03f, -1.932177508e-03f, +5.087527117e-04f, +5.172553710e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.412815468e-05f, -1.782320644e-05f, +6.163946680e-05f, +6.585830902e-05f, -1.667040381e-04f, -1.245574544e-04f, +3.461868290e-04f, +1.923376664e-04f, -6.109072174e-04f, -2.522261286e-04f, +9.561042310e-04f, +2.828338165e-04f, -1.357510663e-03f, -2.643318554e-04f, +1.772324548e-03f, +1.852150214e-04f, -2.145743589e-03f, -4.749181134e-05f, +2.421901676e-03f, -1.317713624e-04f, -2.556419947e-03f, +3.234896838e-04f, +2.526995766e-03f, -4.935323277e-04f, -2.338856349e-03f, +6.115396462e-04f, +2.023410232e-03f, -6.587819237e-04f, -1.630525108e-03f, +6.325582952e-04f, +1.216800403e-03f, -5.458441169e-04f, -8.333047132e-04f, +4.225430608e-04f, +5.161568565e-04f, -2.901524419e-04f, -2.821450487e-04f, +1.723708327e-04f, +1.297982064e-04f, -8.394210187e-05f, -3.395813985e-05f, +2.195065330e-05f, +0.000000000e+00f, + /* 8,30 (44) */ + +0.000000000e+00f, +5.605077129e-05f, -6.196143443e-04f, -3.165050772e-04f, +1.574332169e-03f, +1.013657932e-03f, -3.100354716e-03f, -2.491066686e-03f, +5.268321806e-03f, +5.223758785e-03f, -8.077785479e-03f, -9.869569671e-03f, +1.145618026e-02f, +1.742686374e-02f, -1.529577171e-02f, -2.973955191e-02f, +1.957541309e-02f, +5.134387847e-02f, -2.479319980e-02f, -9.901292585e-02f, +3.482665439e-02f, +3.336797793e-01f, +4.795259998e-01f, +2.974710773e-01f, +4.486977456e-03f, -9.798433453e-02f, -1.090452104e-02f, +5.281281913e-02f, +1.159080321e-02f, -3.155442696e-02f, -1.045066670e-02f, +1.907062170e-02f, +8.529536678e-03f, -1.117601480e-02f, -6.372621624e-03f, +6.161513426e-03f, +4.332844818e-03f, -3.096281281e-03f, -2.628874861e-03f, +1.355691274e-03f, +1.362831610e-03f, -4.747945719e-04f, -5.392060243e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.327735794e-05f, +1.882096265e-05f, -4.286525175e-05f, -4.943904653e-05f, +9.268517436e-05f, +1.111798319e-04f, -1.653631379e-04f, -2.229608930e-04f, +2.598795924e-04f, +4.107447354e-04f, -3.700051028e-04f, -7.122748442e-04f, +4.820347566e-04f, +1.191423856e-03f, -5.681144816e-04f, -1.985688665e-03f, +5.541453813e-04f, +3.505077189e-03f, -7.163281020e-05f, -7.888409201e-03f, -8.836192550e-03f, +5.416502342e-04f, +9.256347174e-03f, +7.274526133e-03f, -5.803880719e-04f, -3.432201781e-03f, -1.815279258e-04f, +2.002069348e-03f, +3.393868463e-04f, -1.228207727e-03f, -3.395733510e-04f, +7.491921922e-04f, +2.828937322e-04f, -4.406935626e-04f, -2.087281453e-04f, +2.441037719e-04f, +1.370602814e-04f, -1.241869104e-04f, -7.822891266e-05f, +5.612101223e-05f, +3.623810225e-05f, -2.129703629e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.605077129e-05f, +6.196143443e-04f, +4.000770192e-04f, -2.318931993e-03f, -1.056919253e-03f, +5.212546779e-03f, +1.957283516e-03f, -9.697658891e-03f, -2.914088535e-03f, +1.582666861e-02f, +3.632172447e-03f, -2.331056457e-02f, -3.780990095e-03f, +3.149135265e-02f, +3.098282669e-03f, -3.941386428e-02f, -1.490729711e-03f, +4.599254299e-02f, -9.061082325e-04f, -5.023647761e-02f, +3.735160252e-03f, +5.147300785e-02f, -6.496534218e-03f, -4.950596369e-02f, +8.675783903e-03f, +4.466172107e-02f, -9.881239015e-03f, -3.770948155e-02f, +9.945713914e-03f, +2.968007616e-02f, -8.960216265e-03f, -2.163693371e-02f, +7.231309846e-03f, +1.446374686e-02f, -5.180158713e-03f, -8.722967479e-03f, +3.219897714e-03f, +4.612574470e-03f, -1.652190345e-03f, -2.016119610e-03f, +4.747945719e-04f, +5.392060243e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.327735794e-05f, -1.882096265e-05f, +5.833250182e-05f, +7.011533139e-05f, -1.598027048e-04f, -1.353292048e-04f, +3.346144730e-04f, +2.138056599e-04f, -5.944132943e-04f, -2.888928305e-04f, +9.356957414e-04f, +3.385690670e-04f, -1.335589277e-03f, -3.412978666e-04f, +1.752411078e-03f, +2.829697519e-04f, -2.131802680e-03f, -1.625664531e-04f, +2.417424508e-03f, -5.633100092e-06f, -2.563525537e-03f, +1.944264780e-04f, +2.545828660e-03f, -3.701898939e-04f, -2.367477734e-03f, +5.015668458e-04f, +2.058226523e-03f, -5.675804767e-04f, -1.667127252e-03f, +5.625883596e-04f, +1.250960538e-03f, -4.966166449e-04f, -8.618392464e-04f, +3.912278939e-04f, +5.374266916e-04f, -2.725676232e-04f, -2.960972531e-04f, +1.640445681e-04f, +1.376061596e-04f, -8.096929242e-05f, -3.623810225e-05f, +2.129703629e-05f, +0.000000000e+00f, + /* 8,31 (44) */ + +0.000000000e+00f, +6.932812923e-05f, -6.007933817e-04f, -3.593703289e-04f, +1.524893123e-03f, +1.106343107e-03f, -2.989174884e-03f, -2.656429824e-03f, +5.045360913e-03f, +5.483638377e-03f, -7.667040744e-03f, -1.023957477e-02f, +1.074390542e-02f, +1.790889849e-02f, -1.410434786e-02f, -3.030766640e-02f, +1.758972443e-02f, +5.189802385e-02f, -2.128812261e-02f, -9.908455866e-02f, +2.693824519e-02f, +3.248435867e-01f, +4.800676500e-01f, +3.067274245e-01f, +1.176150359e-02f, -9.856472261e-02f, -1.433672282e-02f, +5.263129120e-02f, +1.359287256e-02f, -3.121504012e-02f, -1.167887442e-02f, +1.873104835e-02f, +9.278728870e-03f, -1.089312107e-02f, -6.813315187e-03f, +5.952785281e-03f, +4.576948590e-03f, -2.959221000e-03f, -2.753061772e-03f, +1.277462361e-03f, +1.418952622e-03f, -4.385564696e-04f, -5.605030605e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.241779730e-05f, +1.973251484e-05f, -4.069879002e-05f, -5.185638397e-05f, +8.797140009e-05f, +1.158881642e-04f, -1.561170982e-04f, -2.306814620e-04f, +2.431061282e-04f, +4.218703204e-04f, -3.413037314e-04f, -7.264350323e-04f, +4.348372014e-04f, +1.206608172e-03f, -4.918364215e-04f, -1.995704894e-03f, +4.287778866e-04f, +3.487874864e-03f, +1.512011525e-04f, -7.690748195e-03f, -8.988032967e-03f, +1.806332249e-04f, +9.128129279e-03f, +7.485993408e-03f, -3.686348989e-04f, -3.463524932e-03f, -3.044894664e-04f, +2.001146980e-03f, +4.155373014e-04f, -1.218865262e-03f, -3.873126573e-04f, +7.387415145e-04f, +3.122425653e-04f, -4.318552366e-04f, -2.260407756e-04f, +2.377308607e-04f, +1.466740772e-04f, -1.202249485e-04f, -8.314785430e-05f, +5.408411680e-05f, +3.848735070e-05f, -2.055780628e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.932812923e-05f, +6.007933817e-04f, +4.584095210e-04f, -2.248816662e-03f, -1.216721958e-03f, +5.077217574e-03f, +2.291897989e-03f, -9.483853231e-03f, -3.508501830e-03f, +1.553777578e-02f, +4.567868188e-03f, -2.297199551e-02f, -5.116579372e-03f, +3.115005478e-02f, +4.850693747e-03f, -3.913089453e-02f, -3.622532391e-03f, +4.582997653e-02f, +1.511316275e-03f, -5.024211071e-02f, +1.171634715e-03f, +5.166743433e-02f, -3.950705558e-03f, -4.987615359e-02f, +6.308306169e-03f, +4.516328792e-02f, -7.823012491e-03f, -3.827706203e-02f, +8.278586662e-03f, +3.024266452e-02f, -7.709255728e-03f, -2.213355035e-02f, +6.369470600e-03f, +1.485497475e-02f, -4.642732022e-03f, -8.995535102e-03f, +2.923800461e-03f, +4.776619039e-03f, -1.514584185e-03f, -2.097088902e-03f, +4.385564696e-04f, +5.605030605e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.241779730e-05f, -1.973251484e-05f, +5.496512532e-05f, +7.405458027e-05f, -1.526349625e-04f, -1.455110959e-04f, +3.223784588e-04f, +2.343593103e-04f, -5.766242397e-04f, -3.243325880e-04f, +9.131253679e-04f, +3.928611841e-04f, -1.310459866e-03f, -4.167838078e-04f, +1.728177459e-03f, +3.794418868e-04f, -2.112517436e-03f, -2.767965642e-04f, +2.406829384e-03f, +1.202879539e-04f, -2.564123150e-03f, +6.486431433e-05f, +2.558217123e-03f, -2.456691656e-04f, -2.390160510e-03f, +3.898920508e-04f, +2.087962664e-03f, -4.743906180e-04f, -1.699715456e-03f, +4.906064529e-04f, +1.282216489e-03f, -4.455839699e-04f, -8.884770433e-04f, +3.584684405e-04f, +5.576059524e-04f, -2.539588194e-04f, -3.095240124e-04f, +1.550874398e-04f, +1.452272650e-04f, -7.767317955e-05f, -3.848735070e-05f, +2.055780628e-05f, +0.000000000e+00f, + /* 9, 0 (40) */ + +0.000000000e+00f, -7.017253429e-04f, -1.750424134e-04f, +2.058419758e-03f, -1.982704743e-04f, -4.434814470e-03f, +1.641618436e-03f, +7.968272772e-03f, -5.099884949e-03f, -1.256166394e-02f, +1.191669646e-02f, +1.783553129e-02f, -2.422063161e-02f, -2.315743311e-02f, +4.659175191e-02f, +2.775293222e-02f, -9.501521185e-02f, -3.087432576e-02f, +3.144630653e-01f, +5.319805819e-01f, +3.144630653e-01f, -3.087432576e-02f, -9.501521185e-02f, +2.775293222e-02f, +4.659175191e-02f, -2.315743311e-02f, -2.422063161e-02f, +1.783553129e-02f, +1.191669646e-02f, -1.256166394e-02f, -5.099884949e-03f, +7.968272772e-03f, +1.641618436e-03f, -4.434814470e-03f, -1.982704743e-04f, +2.058419758e-03f, -1.750424134e-04f, -7.017253429e-04f, +1.133055274e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.358906275e-05f, -6.207941071e-05f, -3.486249123e-05f, +1.628499352e-04f, +1.622795872e-05f, -3.315651769e-04f, +7.338679611e-05f, +5.762344780e-04f, -2.931575445e-04f, -8.949038318e-04f, +7.282588089e-04f, +1.284178155e-03f, -1.526756362e-03f, -1.783473198e-03f, +3.073632881e-03f, +2.758795409e-03f, -7.240324242e-03f, -1.168634640e-02f, -2.454975392e-04f, +1.155215612e-02f, +7.570460241e-03f, -2.558030536e-03f, -3.211078300e-03f, +1.683739550e-03f, +1.616263007e-03f, -1.236341038e-03f, -7.898243641e-04f, +8.756226649e-04f, +3.335738481e-04f, -5.718216365e-04f, -9.753773237e-05f, +3.335181116e-04f, -3.677848260e-06f, -1.662613606e-04f, +2.962293171e-05f, +6.466356242e-05f, -2.219819630e-05f, -1.426633530e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.017253429e-04f, +1.750424134e-04f, -2.819252016e-03f, +1.317047024e-03f, +5.813065763e-03f, -5.638484823e-03f, -8.056056973e-03f, +1.356304760e-02f, +6.644294405e-03f, -2.362138728e-02f, +9.950267494e-04f, +3.194086253e-02f, -1.503480532e-02f, -3.374209658e-02f, +3.210410297e-02f, +2.603063562e-02f, -4.623861285e-02f, -9.813316511e-03f, +5.173229864e-02f, -9.813316511e-03f, -4.623861285e-02f, +2.603063562e-02f, +3.210410297e-02f, -3.374209658e-02f, -1.503480532e-02f, +3.194086253e-02f, +9.950267494e-04f, -2.362138728e-02f, +6.644294405e-03f, +1.356304760e-02f, -8.056056973e-03f, -5.638484823e-03f, +5.813065763e-03f, +1.317047024e-03f, -2.819252016e-03f, +8.373329469e-05f, +7.017253429e-04f, -1.133055274e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.358906275e-05f, +6.207941071e-05f, +2.894835191e-05f, -2.491776424e-04f, +9.111288168e-05f, +4.535489080e-04f, -4.195534187e-04f, -5.571422708e-04f, +9.581496479e-04f, +3.714972203e-04f, -1.555869431e-03f, +2.195481678e-04f, +1.936460947e-03f, -1.142211979e-03f, -1.832375687e-03f, +2.111638671e-03f, +1.154106075e-03f, -2.749369645e-03f, -7.898385675e-05f, +2.782464711e-03f, -1.015321536e-03f, -2.198575782e-03f, +1.742426403e-03f, +1.252483614e-03f, -1.904009142e-03f, -3.198737579e-04f, +1.568194600e-03f, -3.024963154e-04f, -9.914079357e-04f, +5.230583249e-04f, +4.520995028e-04f, -4.445270837e-04f, -1.118440529e-04f, +2.514351183e-04f, -2.038303472e-05f, -8.927911243e-05f, +2.219819630e-05f, +1.426633530e-05f, +0.000000000e+00f, + /* 9, 1 (40) */ + +0.000000000e+00f, -6.781362801e-04f, -2.371218241e-04f, +2.023557267e-03f, -3.542053911e-05f, -4.418586511e-03f, +1.310053259e-03f, +8.041659568e-03f, -4.523650471e-03f, -1.285482148e-02f, +1.102179262e-02f, +1.856379010e-02f, -2.293645346e-02f, -2.468418947e-02f, +4.480827871e-02f, +3.082656510e-02f, -9.225641644e-02f, -3.811465000e-02f, +3.027767189e-01f, +5.317350843e-01f, +3.260152214e-01f, -2.330386552e-02f, -9.757324238e-02f, +2.454185392e-02f, +4.827549146e-02f, -2.154117010e-02f, -2.545697265e-02f, +1.704570693e-02f, +1.279231912e-02f, -1.222809009e-02f, -5.671706586e-03f, +7.870735040e-03f, +1.975136548e-03f, -4.438492318e-03f, -3.645318349e-04f, +2.088042690e-03f, -1.103788509e-04f, -7.239235392e-04f, +9.903919207e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.484828019e-05f, -5.937724690e-05f, -3.985765772e-05f, +1.590369716e-04f, +2.846385128e-05f, -3.286985463e-04f, +4.946566872e-05f, +5.789455142e-04f, -2.525755473e-04f, -9.113871867e-04f, +6.656193674e-04f, +1.327740406e-03f, -1.434488871e-03f, -1.876698597e-03f, +2.930634935e-03f, +2.947865806e-03f, -6.904336239e-03f, -1.180217583e-02f, -7.360767122e-04f, +1.139971809e-02f, +7.894042301e-03f, -2.345791698e-03f, -3.342510736e-03f, +1.577657299e-03f, +1.702718913e-03f, -1.184296597e-03f, -8.501259890e-04f, +8.535545205e-04f, +3.737057772e-04f, -5.656906386e-04f, -1.218519049e-04f, +3.345337019e-04f, +9.155233045e-06f, -1.692513351e-04f, +2.414937287e-05f, +6.711753041e-05f, -2.067628486e-05f, -1.546725007e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.781362801e-04f, +2.371218241e-04f, -2.790303664e-03f, +1.067869382e-03f, +5.904178645e-03f, -5.184935915e-03f, -8.475610392e-03f, +1.300590533e-02f, +7.602444053e-03f, -2.324989006e-02f, -5.608426814e-04f, +3.216041070e-02f, -1.309834438e-02f, -3.488430856e-02f, +3.027172728e-02f, +2.814227429e-02f, -4.508450678e-02f, -1.256268616e-02f, +5.165331479e-02f, -7.030851800e-03f, -4.725393439e-02f, +2.383205984e-02f, +3.384652937e-02f, -3.248961297e-02f, -1.693881447e-02f, +3.162098877e-02f, +2.563221349e-03f, -2.392388360e-02f, +5.652886470e-03f, +1.408610593e-02f, -7.603957470e-03f, -6.083011907e-03f, +5.701221710e-03f, +1.568482143e-03f, -2.839635051e-03f, -5.545817737e-06f, +7.239235392e-04f, -9.903919207e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.484828019e-05f, +5.937724690e-05f, +3.716170056e-05f, -2.461543489e-04f, +7.053763744e-05f, +4.609517421e-04f, -3.862230372e-04f, -5.889763422e-04f, +9.223241014e-04f, +4.385649540e-04f, -1.538832243e-03f, +1.193812653e-04f, +1.962691735e-03f, -1.029049061e-03f, -1.916252486e-03f, +2.018479416e-03f, +1.289012509e-03f, -2.707823740e-03f, -2.367048336e-04f, +2.806996037e-03f, -8.730845232e-04f, -2.278997210e-03f, +1.646659396e-03f, +1.359500260e-03f, -1.865395081e-03f, -4.200416145e-04f, +1.575722699e-03f, -2.317611561e-04f, -1.021958948e-03f, +4.868021676e-04f, +4.837415165e-04f, -4.338856277e-04f, -1.326642441e-04f, +2.528998792e-04f, -1.148671485e-05f, -9.273332497e-05f, +2.067628486e-05f, +1.546725007e-05f, +0.000000000e+00f, + /* 9, 2 (40) */ + +0.000000000e+00f, -6.532880000e-04f, -2.964990710e-04f, +1.983699609e-03f, +1.236164325e-04f, -4.390122660e-03f, +9.813547128e-04f, +8.091125237e-03f, -3.944704957e-03f, -1.310739703e-02f, +1.011040544e-02f, +1.922940947e-02f, -2.160871305e-02f, -2.611867834e-02f, +4.293158011e-02f, +3.375720004e-02f, -8.930855063e-02f, -4.501898624e-02f, +2.909745431e-01f, +5.309990076e-01f, +3.374149395e-01f, -1.540982321e-02f, -9.991903408e-02f, +2.119934318e-02f, +4.985314876e-02f, -1.983845119e-02f, -2.664126924e-02f, +1.619558094e-02f, +1.364587364e-02f, -1.185438431e-02f, -6.237397224e-03f, +7.748883135e-03f, +2.309670250e-03f, -4.429337085e-03f, -5.337831700e-04f, +2.112192063e-03f, -4.326132053e-05f, -7.445998240e-04f, +8.357194200e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.597573519e-05f, -5.656931007e-05f, -4.459906621e-05f, +1.548431800e-04f, +4.035585483e-05f, -3.249441212e-04f, +2.583908748e-05f, +5.799757153e-04f, -2.119451354e-04f, -9.250699226e-04f, +6.020962355e-04f, +1.366972949e-03f, -1.339753471e-03f, -1.963275518e-03f, +2.782550855e-03f, +3.125049664e-03f, -6.563203266e-03f, -1.189956727e-02f, -1.225409024e-03f, +1.122918129e-02f, +8.210375133e-03f, -2.122327652e-03f, -3.467476865e-03f, +1.465405375e-03f, +1.785838056e-03f, -1.128125071e-03f, -9.089743302e-04f, +8.287183510e-04f, +4.134335714e-04f, -5.578298758e-04f, -1.462610725e-04f, +3.345906660e-04f, +2.223852773e-05f, -1.718008233e-04f, +1.845322694e-05f, +6.942925435e-05f, -1.902443446e-05f, -1.665995399e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.532880000e-04f, +2.964990710e-04f, -2.753141964e-03f, +8.217150332e-04f, +5.974716282e-03f, -4.723984173e-03f, -8.861833429e-03f, +1.241692899e-02f, +8.524768155e-03f, -2.281132511e-02f, -2.099674924e-03f, +3.227979197e-02f, -1.113565264e-02f, -3.591335762e-02f, +2.835547480e-02f, +3.016075371e-02f, -4.379549427e-02f, -1.527050990e-02f, +5.141660995e-02f, -4.223855762e-03f, -4.812701891e-02f, +2.155306263e-02f, +3.549318877e-02f, -3.113011271e-02f, -1.880420955e-02f, +3.120094716e-02f, +4.138944048e-03f, -2.415564475e-02f, +4.630927521e-03f, +1.457290810e-02f, -7.120215954e-03f, -6.516897535e-03f, +5.568557466e-03f, +1.821382022e-03f, -2.851121766e-03f, -9.827914271e-05f, +7.445998240e-04f, -8.357194200e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.597573519e-05f, +5.656931007e-05f, +4.500395056e-05f, -2.423941790e-04f, +5.018332352e-05f, +4.667416090e-04f, -3.522287850e-04f, -6.184912964e-04f, +8.840778467e-04f, +5.035089837e-04f, -1.517182323e-03f, +1.968637598e-05f, +1.982662889e-03f, -9.133656519e-04f, -1.993822389e-03f, +1.919410225e-03f, +1.419628401e-03f, -2.657966449e-03f, -3.936863883e-04f, +2.822877675e-03f, -7.278325354e-04f, -2.352629094e-03f, +1.545349051e-03f, +1.462906510e-03f, -1.820697626e-03f, -5.197332231e-04f, +1.578383327e-03f, -1.594984803e-04f, -1.049669748e-03f, +4.484597407e-04f, +5.143607579e-04f, -4.216293789e-04f, -1.535048423e-04f, +2.535472158e-04f, -2.282161354e-06f, -9.596697517e-05f, +1.902443446e-05f, +1.665995399e-05f, +0.000000000e+00f, + /* 9, 3 (40) */ + +0.000000000e+00f, -6.273122648e-04f, -3.530683810e-04f, +1.939100543e-03f, +2.784596125e-04f, -4.349766805e-03f, +6.564105917e-04f, +8.116964324e-03f, -3.364729242e-03f, -1.331934216e-02f, +9.185335516e-03f, +1.983150570e-02f, -2.024174010e-02f, -2.745843181e-02f, +4.096830459e-02f, +3.653975089e-02f, -8.618350097e-02f, -5.158218950e-02f, +2.790749758e-01f, +5.297735986e-01f, +3.486441208e-01f, -7.199448081e-03f, -1.020413617e-01f, +1.773186632e-02f, +5.131855413e-02f, -1.805261313e-02f, -2.776939432e-02f, +1.528660661e-02f, +1.447459199e-02f, -1.144095074e-02f, -6.795227100e-03f, +7.602622062e-03f, +2.644260916e-03f, -4.407098558e-03f, -7.055839932e-04f, +2.130645290e-03f, +2.616793381e-05f, -7.636242585e-04f, +6.691198800e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.697179213e-05f, -5.366786361e-05f, -4.907838704e-05f, +1.502899857e-04f, +5.187593367e-05f, -3.203299372e-04f, +2.569795609e-06f, +5.793505348e-04f, -1.713818723e-04f, -9.359571487e-04f, +5.378792310e-04f, +1.401833611e-03f, -1.242845318e-03f, -2.043083219e-03f, +2.629851781e-03f, +3.290183488e-03f, -6.217635905e-03f, -1.197847955e-02f, -1.712666080e-03f, +1.104073040e-02f, +8.518771646e-03f, -1.887915150e-03f, -3.585531680e-03f, +1.347181810e-03f, +1.865339109e-03f, -1.067919359e-03f, -9.661812678e-04f, +8.011412946e-04f, +4.526367213e-04f, -5.482325946e-04f, -1.706955005e-04f, +3.336701967e-04f, +3.553783943e-05f, -1.738917470e-04f, +1.254691095e-05f, +7.158682972e-05f, -1.724426288e-05f, -1.783913596e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.273122648e-04f, +3.530683810e-04f, -2.708138013e-03f, +5.793208542e-04f, +6.024899606e-03f, -4.257242564e-03f, -9.214062214e-03f, +1.179843769e-02f, +9.408846001e-03f, -2.230781612e-02f, -3.616857248e-03f, +3.229947834e-02f, -9.152989753e-03f, -3.682672327e-02f, +2.636165241e-02f, +3.208016393e-02f, -4.237586587e-02f, -1.792847634e-02f, +5.102292356e-02f, -1.400978088e-03f, -4.885485145e-02f, +1.920043354e-02f, +3.703853782e-02f, -2.966720620e-02f, -2.062490717e-02f, +3.068121394e-02f, +5.717327375e-03f, -2.431514323e-02f, +3.581257773e-03f, +1.502136784e-02f, -6.605855196e-03f, -6.938526914e-03f, +5.415052624e-03f, +2.074929238e-03f, -2.853403927e-03f, -1.942461179e-04f, +7.636242585e-04f, -6.691198800e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.697179213e-05f, +5.366786361e-05f, +5.245783240e-05f, -2.379279690e-04f, +3.011285216e-05f, +4.709297982e-04f, -3.176913299e-04f, -6.456264225e-04f, +8.435634077e-04f, +5.661476899e-04f, -1.491032742e-03f, -7.922725540e-05f, +1.996355930e-03f, -7.955384059e-04f, -2.064871998e-03f, +1.814760920e-03f, +1.545555799e-03f, -2.599963312e-03f, -5.494381966e-04f, +2.830050922e-03f, -5.800135591e-04f, -2.419218187e-03f, +1.438788586e-03f, +1.562356451e-03f, -1.770015613e-03f, -6.186289941e-04f, +1.576121102e-03f, -8.592225231e-05f, -1.074415005e-03f, +4.081250930e-04f, +5.438400155e-04f, -4.077687376e-04f, -1.742957362e-04f, +2.533547466e-04f, +7.206093704e-06f, -9.896008361e-05f, +1.724426288e-05f, +1.783913596e-05f, +0.000000000e+00f, + /* 9, 4 (40) */ + +0.000000000e+00f, -6.003404726e-04f, -4.067362447e-04f, +1.890022156e-03f, +4.287495982e-04f, -4.297890872e-03f, +3.360806545e-04f, +8.119534120e-03f, -2.785378707e-03f, -1.349072404e-02f, +8.249378367e-03f, +2.036938493e-02f, -1.883990649e-02f, -2.870127713e-02f, +3.892522138e-02f, +3.916960267e-02f, -8.289331748e-02f, -5.779982541e-02f, +2.670964963e-01f, +5.280609325e-01f, +3.596848512e-01f, +1.319323565e-03f, -1.039292769e-01f, +1.414633464e-02f, +5.266573594e-02f, -1.618727402e-02f, -2.883731368e-02f, +1.432042534e-02f, +1.527573329e-02f, -1.098831402e-02f, -7.343459695e-03f, +7.431926562e-03f, +2.977931112e-03f, -4.371560718e-03f, -8.794757402e-04f, +2.143192201e-03f, +9.775476354e-05f, -7.808685214e-04f, +4.907285204e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.783727893e-05f, -5.068515312e-05f, -5.328832891e-05f, +1.453994474e-04f, +6.299774079e-05f, -3.148860417e-04f, -2.028160784e-05f, +5.770997631e-04f, -1.309993024e-04f, -9.440617580e-04f, +4.731572712e-04f, +1.432292819e-03f, -1.144060974e-03f, -2.116020483e-03f, +2.473012407e-03f, +3.443132409e-03f, -5.868346728e-03f, -1.203890744e-02f, -2.197023751e-03f, +1.083458553e-02f, +8.818554479e-03f, -1.642858602e-03f, -3.696239674e-03f, +1.223203506e-03f, +1.940946266e-03f, -1.003784947e-03f, -1.021560463e-03f, +7.708587210e-04f, +4.911943059e-04f, -5.368969955e-04f, -1.950841424e-04f, +3.317560647e-04f, +4.901761035e-05f, -1.755070633e-04f, +6.443829298e-06f, +7.357855293e-05f, -1.533790785e-05f, -1.899936450e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.003404726e-04f, +4.067362447e-04f, -2.655680181e-03f, +3.413928852e-04f, +6.055012458e-03f, -3.786312766e-03f, -9.531753544e-03f, +1.115281127e-02f, +1.025240941e-02f, -2.174166843e-02f, -5.107889989e-03f, +3.222025109e-02f, -7.156633823e-03f, -3.762226168e-02f, +2.429678041e-02f, +3.389492485e-02f, -4.083031007e-02f, -2.052843966e-02f, +5.047348537e-02f, +1.429072834e-03f, -4.943486501e-02f, +1.678121535e-02f, +3.847732640e-02f, -2.810484974e-02f, -2.239492279e-02f, +3.006258494e-02f, +7.293448477e-03f, -2.440106548e-02f, +2.506842768e-03f, +1.542949293e-02f, -6.062015180e-03f, -7.346295651e-03f, +5.240756887e-03f, +2.328283984e-03f, -2.846197833e-03f, -2.932062015e-04f, +7.808685214e-04f, -4.907285204e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.783727893e-05f, +5.068515312e-05f, +5.950795440e-05f, -2.327882978e-04f, +1.038686813e-05f, +4.735327339e-04f, -2.827311737e-04f, -6.703296232e-04f, +8.009387080e-04f, +6.263088608e-04f, -1.460509853e-03f, -1.770554280e-04f, +2.003772433e-03f, -6.759485959e-04f, -2.129209512e-03f, +1.704877822e-03f, +1.666412475e-03f, -2.534005390e-03f, -7.034738605e-04f, +2.828484546e-03f, -4.300846601e-04f, -2.478532739e-03f, +1.327289183e-03f, +1.657514825e-03f, -1.713467675e-03f, -7.164092911e-04f, +1.568895977e-03f, -1.125303696e-05f, -1.096077505e-03f, +3.659001780e-04f, +5.720639893e-04f, -3.923197286e-04f, -1.949655339e-04f, +2.523025512e-04f, +1.695180326e-05f, -1.016930039e-04f, +1.533790785e-05f, +1.899936450e-05f, +0.000000000e+00f, + /* 9, 5 (40) */ + +0.000000000e+00f, -5.725031937e-04f, -4.574213978e-04f, +1.836733827e-03f, +5.741490457e-04f, -4.234893131e-03f, +2.119461283e-05f, +8.099252512e-03f, -2.208278944e-03f, -1.362172334e-02f, +7.305316609e-03f, +2.084254221e-02f, -1.740761367e-02f, -2.984533810e-02f, +3.680920089e-02f, +4.164261508e-02f, -7.945018507e-02f, -6.366817214e-02f, +2.550575888e-01f, +5.258639088e-01f, +3.705194367e-01f, +1.013787804e-02f, -1.055721355e-01f, +1.045009497e-02f, +5.388893945e-02f, -1.424632776e-02f, -2.984109862e-02f, +1.329886488e-02f, +1.604659201e-02f, -1.049711971e-02f, -7.880356690e-03f, +7.236842420e-03f, +3.309687177e-03f, -4.322543108e-03f, -1.054982803e-03f, +2.149636030e-03f, +1.713333165e-04f, -7.962064292e-04f, +3.007348754e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.857347147e-05f, -4.763336528e-05f, -5.722263853e-05f, +1.401941747e-04f, +7.369666498e-05f, -3.086443671e-04f, -4.265680927e-05f, +5.732573706e-04f, -9.090865714e-05f, -9.494042749e-04f, +4.081178602e-04f, +1.458333504e-03f, -1.043697592e-03f, -2.182005593e-03f, +2.312509799e-03f, +3.583790178e-03f, -5.516048760e-03f, -1.208088148e-02f, -2.677663862e-03f, +1.061100191e-02f, +9.109057526e-03f, -1.387489687e-03f, -3.799176006e-03f, +1.093705953e-03f, +2.012390064e-03f, -9.358397985e-04f, -1.074927910e-03f, +7.379142543e-04f, +5.289853368e-04f, -5.238263198e-04f, -2.193548295e-04f, +3.288347151e-04f, +6.264100433e-05f, -1.766308406e-04f, +1.583525942e-07f, +7.539296666e-05f, -1.330803346e-05f, -2.013510604e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.725031937e-04f, +4.574213978e-04f, -2.596172226e-03f, +1.086045874e-04f, +6.065399326e-03f, -3.312780032e-03f, -9.814484717e-03f, +1.048248165e-02f, +1.105334812e-02f, -2.111535957e-02f, -6.568399842e-03f, +3.204319566e-02f, -5.152861390e-03f, -3.829821027e-02f, +2.216757090e-02f, +3.559980268e-02f, -3.916389760e-02f, -2.306244505e-02f, +4.977001151e-02f, +4.257557380e-03f, -4.986494967e-02f, +1.430268261e-02f, +3.980461559e-02f, -2.644733492e-02f, -2.410839046e-02f, +2.934617565e-02f, +8.862344454e-03f, -2.441231852e-02f, +1.410765263e-03f, +1.579539311e-02f, -5.489951191e-03f, -7.738615380e-03f, +5.045791354e-03f, +2.580586535e-03f, -2.829246030e-03f, -3.948992054e-04f, +7.962064292e-04f, -3.007348754e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.857347147e-05f, +4.763336528e-05f, +6.614081253e-05f, -2.270093316e-04f, -8.936416261e-06f, +4.745718276e-04f, -2.474682509e-04f, -6.925574664e-04f, +7.563664866e-04f, +6.838301498e-04f, -1.425752763e-03f, -2.734999243e-04f, +2.004933884e-03f, -5.549808657e-04f, -2.186665243e-03f, +1.590122586e-03f, +1.781833104e-03f, -2.460308630e-03f, -8.553124615e-04f, +2.818174904e-03f, -2.785105402e-04f, -2.530363307e-03f, +1.211179078e-03f, +1.748058174e-03f, -1.651191985e-03f, -8.127554692e-04f, +1.556683522e-03f, +6.428265365e-05f, -1.114548639e-03f, +3.218946234e-04f, +5.989197119e-04f, -3.753040453e-04f, -2.154417879e-04f, +2.503732986e-04f, +2.692706094e-05f, -1.041465109e-04f, +1.330803346e-05f, +2.013510604e-05f, +0.000000000e+00f, + /* 9, 6 (40) */ + +0.000000000e+00f, -5.439297222e-04f, -5.050547631e-04f, +1.779511189e-03f, +7.143432204e-04f, -4.161196466e-03f, -2.874497542e-04f, +8.056595703e-03f, -1.635021573e-03f, -1.371263200e-02f, +6.355912334e-03f, +2.125066007e-02f, -1.594928017e-02f, -3.088903570e-02f, +3.462719530e-02f, +4.395512488e-02f, -7.586639489e-02f, -6.918422090e-02f, +2.429767073e-01f, +5.231862449e-01f, +3.811304387e-01f, +1.924693557e-02f, -1.069596252e-01f, +6.650918960e-03f, +5.498264540e-02f, -1.223393769e-02f, -3.077693842e-02f, +1.222393697e-02f, +1.678450626e-02f, -9.968134376e-03f, -8.404183010e-03f, +7.017487590e-03f, +3.638521892e-03f, -4.259902104e-03f, -1.231613644e-03f, +2.149794383e-03f, +2.467262831e-04f, -8.095144627e-04f, +9.938381493e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.918207680e-05f, -4.452458790e-05f, -6.087609675e-05f, +1.346972455e-04f, +8.394987165e-05f, -3.016386006e-04f, -6.449991268e-05f, +5.678613416e-04f, -5.121857295e-05f, -9.520126834e-04f, +3.429465880e-04f, +1.479950966e-03f, -9.420521158e-04f, -2.240976259e-03f, +2.148822212e-03f, +3.712079088e-03f, -5.161453937e-03f, -1.210446776e-02f, -3.153775873e-03f, +1.037026947e-02f, +9.389627448e-03f, -1.122166887e-03f, -3.893927662e-03f, +9.589428966e-04f, +2.079408200e-03f, -8.642142097e-04f, -1.126102485e-03f, +7.023597721e-04f, +5.658891074e-04f, -5.090289217e-04f, -2.434344664e-04f, +3.248953579e-04f, +7.636999562e-05f, -1.772483334e-04f, -6.294207036e-06f, +7.701890551e-05f, -1.115783486e-05f, -2.124074400e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.439297222e-04f, +5.050547631e-04f, -2.530031414e-03f, -1.184047442e-04f, +6.056462910e-03f, -2.838208205e-03f, -1.006195297e-02f, +9.789924182e-03f, +1.180971460e-02f, -2.043152942e-02f, -7.994152605e-03f, +3.176969573e-02f, -3.147927506e-03f, -3.885319114e-02f, +1.998090565e-02f, +3.718992526e-02f, -3.738206449e-02f, -2.552275368e-02f, +4.891469905e-02f, +7.075732284e-03f, -5.014346021e-02f, +1.177231930e-02f, +4.101579467e-02f, -2.469927675e-02f, -2.575958245e-02f, +2.853342018e-02f, +1.041902798e-02f, -2.434803587e-02f, +2.962166243e-04f, +1.611728773e-02f, -4.891031479e-03f, -8.113919425e-03f, +4.830349566e-03f, +2.830959834e-03f, -2.802318969e-03f, -4.990457162e-04f, +8.095144627e-04f, -9.938381493e-06f, +0.000000000e+00f, + +0.000000000e+00f, -2.918207680e-05f, +4.452458790e-05f, +7.234479279e-05f, -2.206266656e-04f, -2.780137444e-05f, +4.740733165e-04f, -2.120215373e-04f, -7.122752061e-04f, +7.100137044e-04f, +7.385594970e-04f, -1.386912755e-03f, -3.682694225e-04f, +1.999881476e-03f, -4.330219789e-04f, -2.237092061e-03f, +1.470870997e-03f, +1.891470399e-03f, -2.379113140e-03f, -1.004480095e-03f, +2.799145988e-03f, -1.257620654e-04f, -2.574523496e-03f, +1.090802571e-03f, +1.833675941e-03f, -1.583345947e-03f, -9.073509170e-04f, +1.539475140e-03f, +1.404530410e-04f, -1.129728864e-03f, +2.762254699e-04f, +6.242969676e-04f, -3.567490754e-04f, -2.356512299e-04f, +2.475523674e-04f, +3.710236442e-05f, -1.063018892e-04f, +1.115783486e-05f, +2.124074400e-05f, +0.000000000e+00f, + /* 9, 7 (40) */ + +0.000000000e+00f, -5.147476454e-04f, -5.495793510e-04f, +1.718635092e-03f, +8.490404659e-04f, -4.077246594e-03f, -5.890883548e-04f, +7.992095790e-03f, -1.067160232e-03f, -1.376385057e-02f, +5.403899651e-03f, +2.159360665e-02f, -1.446932920e-02f, -3.183108781e-02f, +3.238621904e-02f, +4.610394709e-02f, -7.215431580e-02f, -7.434567483e-02f, +2.308722396e-01f, +5.200324690e-01f, +3.915007081e-01f, +2.863656302e-02f, -1.080817921e-01f, +2.756991298e-03f, +5.594158830e-02f, -1.015452949e-02f, -3.164115263e-02f, +1.109783448e-02f, +1.748686604e-02f, -9.402245269e-03f, -8.913211932e-03f, +6.774053124e-03f, +3.963417250e-03f, -4.183532108e-03f, -1.408861977e-03f, +2.143500175e-03f, +3.237451886e-04f, -8.206722976e-04f, -1.130236251e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.966521518e-05f, -4.137077124e-05f, -6.424451154e-05f, +1.289321237e-04f, +9.373633740e-05f, -2.939040512e-04f, -8.575756238e-05f, +5.609534982e-04f, -1.203482045e-05f, -9.519222367e-04f, +2.778266412e-04f, +1.497152711e-03f, -8.394204909e-04f, -2.292889502e-03f, +1.982427921e-03f, +3.827949833e-03f, -4.805271585e-03f, -1.210976765e-02f, -3.624558540e-03f, +1.011271235e-02f, +9.659625154e-03f, -8.472749576e-04f, -3.980094595e-03f, +8.191859473e-04f, +2.141746337e-03f, -7.890506312e-04f, -1.174906500e-03f, +6.642553817e-04f, +6.017855469e-04f, -4.925183278e-04f, -2.672492328e-04f, +3.199300511e-04f, +9.016546299e-05f, -1.773460538e-04f, -1.289762441e-05f, +7.844554178e-05f, -8.891041164e-06f, -2.231059876e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.147476454e-04f, +5.495793510e-04f, -2.457686621e-03f, -3.390314097e-04f, +6.028661535e-03f, -2.364134888e-03f, -1.027397451e-02f, +9.077648976e-03f, +1.251972831e-02f, -1.969296993e-02f, -9.381065360e-03f, +3.140142631e-02f, -1.148046030e-03f, -3.928621312e-02f, +1.774381359e-02f, +3.866079626e-02f, -3.549059409e-02f, -2.790186682e-02f, +4.791021895e-02f, +9.874878272e-03f, -5.026922227e-02f, +9.197795807e-03f, +4.210659724e-02f, -2.286560080e-02f, -2.734292839e-02f, +2.762606927e-02f, +1.195850312e-02f, -2.420758283e-02f, -8.335122396e-04f, +1.639351320e-02f, -4.266734511e-03f, -8.470668501e-03f, +4.594698336e-03f, +3.078512201e-03f, -2.765216605e-03f, -6.053476054e-04f, +8.206722976e-04f, +1.130236251e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.966521518e-05f, +4.137077124e-05f, +7.811016640e-05f, -2.136771647e-04f, -4.615510668e-05f, +4.720680878e-04f, -1.765086660e-04f, -7.294567753e-04f, +6.620509438e-04f, +7.903555101e-04f, -1.344152686e-03f, -4.610803787e-04f, +1.988675834e-03f, -3.104595657e-04f, -2.280365757e-03f, +1.347511719e-03f, +1.994996168e-03f, -2.290682395e-03f, -1.150511382e-03f, +2.771449368e-03f, +2.768522710e-05f, -2.610850631e-03f, +9.665189953e-04f, +1.914071544e-03f, -1.510105810e-03f, -9.998821001e-04f, +1.517278249e-03f, +2.170217854e-04f, -1.141528149e-03f, +2.290168826e-04f, +6.480887084e-04f, -3.366879062e-04f, -2.555200118e-04f, +2.438279597e-04f, +4.744668640e-05f, -1.081410225e-04f, +8.891041164e-06f, +2.231059876e-05f, +0.000000000e+00f, + /* 9, 8 (40) */ + +0.000000000e+00f, -4.850824302e-04f, -5.909501222e-04f, +1.654390580e-03f, +9.779725896e-04f, -3.983510257e-03f, -8.829924060e-04f, +7.906338228e-03f, -5.062067334e-04f, -1.377588539e-02f, +4.451977414e-03f, +2.187143329e-02f, -1.297217649e-02f, -3.267050830e-02f, +3.009332954e-02f, +4.808637501e-02f, -6.832636597e-02f, -7.915094642e-02f, +2.187624719e-01f, +5.164079105e-01f, +4.016134205e-01f, +3.829618817e-02f, -1.089290670e-01f, -1.223103297e-03f, +5.676077424e-02f, -8.012783156e-03f, -3.243020326e-02f, +9.922927981e-03f, +1.815112142e-02f, -8.800459722e-03f, -9.405730259e-03f, +6.506803891e-03f, +4.283347301e-03f, -4.093366645e-03f, -1.586208031e-03f, +2.130602551e-03f, +4.021907304e-04f, -8.295633387e-04f, -3.361296126e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.002540106e-05f, -3.818369075e-05f, -6.732470766e-05f, +1.229225772e-04f, +1.030368784e-04f, -2.854775143e-04f, -1.063790562e-04f, +5.525793165e-04f, +2.653995388e-05f, -9.491752487e-04f, +2.129383280e-04f, +1.509958254e-03f, -7.360968874e-04f, -2.337721486e-03f, +1.813804071e-03f, +3.931381301e-03f, -4.448206912e-03f, -1.209691739e-02f, -4.089221553e-03f, +9.838688335e-03f, +9.918427271e-03f, -5.632243356e-04f, -4.057290844e-03f, +6.747241509e-04f, +2.199158900e-03f, -7.105034497e-04f, -1.221166251e-03f, +6.236693718e-04f, +6.365555774e-04f, -4.743132810e-04f, -2.907247910e-04f, +3.139337773e-04f, +1.039872891e-04f, -1.769118413e-04f, -1.963479337e-05f, +7.966243098e-05f, -6.511916378e-06f, -2.333894834e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.850824302e-04f, +5.909501222e-04f, -2.379576454e-03f, -5.527085745e-04f, +5.982506429e-03f, -1.892066800e-03f, -1.045048317e-02f, +8.348192201e-03f, +1.318177925e-02f, -1.890261442e-02f, -1.072521805e-02f, +3.094034593e-02f, +8.406298037e-04f, -3.959667268e-02f, +1.546344784e-02f, +4.000830798e-02f, -3.349559792e-02f, -3.019254921e-02f, +4.675970757e-02f, +1.264632764e-02f, -5.024153705e-02f, +6.586945176e-03f, +4.307311623e-02f, -2.095152926e-02f, -2.885303420e-02f, +2.662618717e-02f, +1.347578136e-02f, -2.399056104e-02f, -1.975040388e-03f, +1.662253008e-02f, -3.618645803e-03f, -8.807356407e-03f, +4.339178324e-03f, +3.322340161e-03f, -2.717769918e-03f, -7.134886279e-04f, +8.295633387e-04f, +3.361296126e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.002540106e-05f, +3.818369075e-05f, +8.342907803e-05f, -2.061988025e-04f, -6.394756893e-05f, +4.685914899e-04f, -1.410455555e-04f, -7.440847489e-04f, +6.126518040e-04f, +8.390878083e-04f, -1.297646345e-03f, -5.516578768e-04f, +1.971396687e-03f, -1.876808763e-04f, -2.316385335e-03f, +1.220445003e-03f, +2.092102327e-03f, -2.195302367e-03f, -1.292950954e-03f, +2.735164053e-03f, +1.813526412e-04f, -2.639206348e-03f, +8.387016222e-04f, +1.988963407e-03f, -1.431666225e-03f, -1.090039604e-03f, +1.490116400e-03f, +2.937487134e-04f, -1.149866382e-03f, +1.803998335e-04f, +6.701914660e-04f, -3.151593111e-04f, -2.749739539e-04f, +2.391912064e-04f, +5.792755312e-05f, -1.096464823e-04f, +6.511916378e-06f, +2.333894834e-05f, +0.000000000e+00f, + /* 9, 9 (40) */ + +0.000000000e+00f, -4.550570292e-04f, -6.291338129e-04f, +1.587065873e-03f, +1.100895167e-03f, -3.880473378e-03f, -1.168469920e-03f, +7.799959172e-03f, +4.637258314e-05f, -1.374934544e-02f, +3.502802165e-03f, +2.208437162e-02f, -1.146221824e-02f, -3.340660519e-02f, +2.775560805e-02f, +4.990017908e-02f, -6.439498467e-02f, -8.359915333e-02f, +2.066655545e-01f, +5.123186890e-01f, +4.114521088e-01f, +4.821461544e-02f, -1.094922914e-01f, -5.280394140e-03f, +5.743549839e-02f, -5.813624256e-03f, -3.314070671e-02f, +8.701761730e-03f, +1.877479079e-02f, -8.163904144e-03f, -9.880043540e-03f, +6.216079100e-03f, +4.597281078e-03f, -3.989379356e-03f, -1.763119873e-03f, +2.110967758e-03f, +4.818531614e-04f, -8.360752551e-04f, -5.695190960e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.026552314e-05f, -3.497491124e-05f, -7.011451321e-05f, +1.166925968e-04f, +1.118341724e-04f, -2.763971337e-04f, -1.263164487e-04f, +5.427877350e-04f, +6.440647307e-05f, -9.438208686e-04f, +1.484586174e-04f, +1.518398899e-03f, -6.323729384e-04f, -2.375467304e-03f, +1.643425534e-03f, +4.022380306e-03f, -4.090959519e-03f, -1.206608769e-02f, -4.546987151e-03f, +9.548588231e-03f, +1.016542758e-02f, -2.704504794e-04f, -4.125145637e-03f, +5.258635010e-04f, +2.251409867e-03f, -6.287387368e-04f, -1.264712566e-03f, +5.806781401e-04f, +6.700814743e-04f, -4.544377708e-04f, -3.137864980e-04f, +3.069045119e-04f, +1.177944647e-04f, -1.759349294e-04f, -2.648776246e-05f, +8.065955729e-05f, -4.025258508e-06f, -2.432004984e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.550570292e-04f, +6.291338129e-04f, -2.296147376e-03f, -7.589073770e-04f, +5.918558860e-03f, -1.423475310e-03f, -1.059152873e-02f, +7.604107452e-03f, +1.379443106e-02f, -1.806352661e-02f, -1.202286439e-02f, +3.038868806e-02f, +2.812026491e-03f, -3.978435356e-02f, +1.314706250e-02f, +4.122875298e-02f, -3.140349560e-02f, -3.238785158e-02f, +4.546675661e-02f, +1.538149169e-02f, -5.006018440e-02f, +3.947738828e-03f, +4.391181785e-02f, -1.896256585e-02f, -3.028470043e-02f, +2.553614756e-02f, +1.496589776e-02f, -2.369681233e-02f, -3.124906771e-03f, +1.680292992e-02f, -2.948454337e-03f, -9.122515718e-03f, +4.064204370e-03f, +3.561531368e-03f, -2.659842365e-03f, -8.231351102e-04f, +8.360752551e-04f, +5.695190960e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.026552314e-05f, +3.497491124e-05f, +8.829552714e-05f, -1.982304998e-04f, -8.113168891e-05f, +4.636831315e-04f, -1.057460482e-04f, -7.561502784e-04f, +5.619922933e-04f, +8.846373242e-04f, -1.247577785e-03f, -6.397364432e-04f, +1.948142476e-03f, -6.507154126e-05f, -2.345073229e-03f, +1.090081376e-03f, +2.182501822e-03f, -2.093280578e-03f, -1.431354905e-03f, +2.690396264e-03f, +3.347598469e-04f, -2.659477117e-03f, +7.077365253e-04f, +2.058085942e-03f, -1.348239735e-03f, -1.177519168e-03f, +1.458029351e-03f, +3.703905661e-04f, -1.154673760e-03f, +1.305117571e-04f, +6.905057570e-04f, -2.922077150e-04f, -2.939387987e-04f, +2.336362639e-04f, +6.851113018e-05f, -1.108016165e-04f, +4.025258508e-06f, +2.432004984e-05f, +0.000000000e+00f, + /* 9,10 (40) */ + +0.000000000e+00f, -4.247915060e-04f, -6.641087242e-04f, +1.516951359e-03f, +1.217587764e-03f, -3.768639206e-03f, -1.444867054e-03f, +7.673642723e-03f, +5.891603182e-04f, -1.368493896e-02f, +2.558981297e-03f, +2.223283024e-02f, -9.943819336e-03f, -3.403897813e-02f, +2.538014075e-02f, +5.154360462e-02f, -6.037260436e-02f, -8.769011285e-02f, +1.945994668e-01f, +5.077717018e-01f, +4.210006970e-01f, +5.838004303e-02f, -1.097627418e-01f, -9.405539777e-03f, +5.796136190e-02f, -3.562214389e-03f, -3.376944545e-02f, +7.437049164e-03f, +1.935546893e-02f, -7.493822670e-03f, -1.033448131e-02f, +5.902292602e-03f, +4.904185590e-03f, -3.871584891e-03f, -1.939054802e-03f, +2.084479995e-03f, +5.625127187e-04f, -8.401005136e-04f, -8.127195944e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.038882345e-05f, -3.175575267e-05f, -7.261274324e-05f, +1.102663162e-04f, +1.201127747e-04f, -2.667022623e-04f, -1.455246449e-04f, +5.316309555e-04f, +1.014690617e-04f, -9.359148400e-04f, +8.456069436e-05f, +1.522517476e-03f, -5.285369950e-04f, -2.406140717e-03f, +1.471763790e-03f, +4.100981252e-03f, -3.734221936e-03f, -1.201748315e-02f, -4.997091712e-03f, +9.242835135e-03f, +1.040003843e-02f, +3.058685352e-05f, -4.183304467e-03f, +3.729264058e-04f, +2.298273532e-03f, -5.439339613e-04f, -1.305381341e-03f, +5.353660973e-04f, +7.022472270e-04f, -4.329210476e-04f, -3.363596225e-04f, +2.988432843e-04f, +1.315451980e-04f, -1.744060091e-04f, -3.343777417e-05f, +8.142737847e-05f, -1.436396644e-06f, -2.524816144e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.247915060e-04f, +6.641087242e-04f, -2.207851849e-03f, -9.571378768e-04f, +5.837427171e-03f, -9.597921789e-04f, -1.069727478e-02f, +6.847957174e-03f, +1.435642335e-02f, -1.717888928e-02f, -1.327044218e-02f, +2.974895161e-02f, +4.760168967e-03f, -3.984942510e-02f, +1.080198927e-02f, +4.231883436e-02f, -2.922099377e-02f, -3.448113216e-02f, +4.403540171e-02f, +1.807188796e-02f, -4.972542456e-02f, +1.288261711e-03f, +4.461955438e-02f, -1.690447991e-02f, -3.163294016e-02f, +2.435862839e-02f, +1.642392712e-02f, -2.332642176e-02f, -4.279580531e-03f, +1.693344167e-02f, -2.257948580e-03f, -9.414723433e-03f, +3.770265571e-03f, +3.795167631e-03f, -2.591331235e-03f, -9.339367267e-04f, +8.401005136e-04f, +8.127195944e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.038882345e-05f, +3.175575267e-05f, +9.270534274e-05f, -1.898119631e-04f, -9.766346956e-05f, +4.573866696e-04f, -7.072156256e-05f, -7.656529984e-04f, +5.102502210e-04f, +9.268965660e-04f, -1.194140631e-03f, -7.250608239e-04f, +1.919029903e-03f, +5.698565503e-05f, -2.366375433e-03f, +9.568402833e-04f, +2.265929507e-03f, -1.984945093e-03f, -1.565292203e-03f, +2.637279115e-03f, +4.874264133e-04f, -2.671574675e-03f, +5.740213917e-04f, +2.121190497e-03f, -1.260056211e-03f, -1.262022715e-03f, +1.421073082e-03f, +4.467017651e-04f, -1.155891140e-03f, +7.949617923e-05f, +7.089364809e-04f, -2.678831402e-04f, -3.123404704e-04f, +2.271604025e-04f, +7.916231559e-05f, -1.115906368e-04f, +1.436396644e-06f, +2.524816144e-05f, +0.000000000e+00f, + /* 9,11 (40) */ + +0.000000000e+00f, -3.944026826e-04f, -6.958644769e-04f, +1.444338616e-03f, +1.327854080e-03f, -3.648526431e-03f, -1.711569316e-03f, +7.528118078e-03f, +1.120791274e-03f, -1.358346990e-02f, +1.623066457e-03f, +2.231739093e-02f, -8.421301860e-03f, -3.456751512e-02f, +2.297400003e-02f, +5.301536841e-02f, -5.627162311e-02f, -9.142433479e-02f, +1.825819837e-01f, +5.027746101e-01f, +4.302435322e-01f, +6.878008146e-02f, -1.097321550e-01f, -1.358884424e-02f, +5.833428830e-02f, -1.263940857e-03f, -3.431337941e-02f, +6.131667824e-03f, +1.989083503e-02f, -6.791575443e-03f, -1.076740236e-02f, +5.565932979e-03f, +5.203028875e-03f, -3.740039693e-03f, -2.113460811e-03f, +2.051042221e-03f, +6.439400972e-04f, -8.415369103e-04f, -1.065201209e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.039887583e-05f, -2.853725754e-05f, -7.481918043e-05f, +1.036679328e-04f, +1.278591280e-04f, -2.564333221e-04f, -1.639614834e-04f, +5.191642378e-04f, +1.376358638e-04f, -9.255192434e-04f, +2.141353182e-05f, +1.522368065e-03f, -4.248734012e-04f, -2.429773852e-03f, +1.299285828e-03f, +4.167245739e-03f, -3.378678185e-03f, -1.195134171e-02f, -5.438787302e-03f, +8.921883660e-03f, +1.062169210e-02f, +3.394043914e-04f, -4.231430134e-03f, +2.162511058e-04f, +2.339535262e-03f, -4.562776664e-04f, -1.343014081e-03f, +4.878255463e-04f, +7.329389011e-04f, -4.097976228e-04f, -3.583695657e-04f, +2.897542300e-04f, +1.451970278e-04f, -1.723172887e-04f, -4.046530777e-05f, +8.195687024e-05f, +1.248813931e-06f, -2.611756503e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.944026826e-04f, +6.958644769e-04f, -2.115146507e-03f, -1.146949840e-03f, +5.739763701e-03f, -5.024055093e-04f, -1.076799634e-02f, +6.082304175e-03f, +1.486667357e-02f, -1.625199272e-02f, -1.446458281e-02f, +2.902389079e-02f, +6.679198870e-03f, -3.979243945e-02f, +8.435613839e-03f, +4.327567464e-02f, -2.695506427e-02f, -3.646607725e-02f, +4.247010951e-02f, +2.070916707e-02f, -4.923799814e-02f, -1.383312964e-03f, +4.519357577e-02f, -1.478328941e-02f, -3.289299638e-02f, +2.309660568e-02f, +1.784500020e-02f, -2.287972000e-02f, -5.435471671e-03f, +1.701293785e-02f, -1.549012099e-03f, -9.682606573e-03f, +3.457925101e-03f, +4.022328034e-03f, -2.512168919e-03f, -1.045527363e-03f, +8.415369103e-04f, +1.065201209e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.039887583e-05f, +2.853725754e-05f, +9.665615182e-05f, -1.809835241e-04f, -1.135020794e-04f, +4.497495869e-04f, -3.608075842e-05f, -7.726009063e-04f, +4.576045913e-04f, +9.657698389e-04f, -1.137537353e-03f, -8.073867218e-04f, +1.884193427e-03f, +1.781119850e-04f, -2.380261573e-03f, +8.211487210e-04f, +2.342142925e-03f, -1.870643441e-03f, -1.694346065e-03f, +2.575972209e-03f, +6.388733453e-04f, -2.675436391e-03f, +4.379642943e-04f, +2.178046240e-03f, -1.167362215e-03f, -1.343259367e-03f, +1.379319762e-03f, +5.224351940e-04f, -1.153470363e-03f, +2.750232073e-05f, +7.253933090e-04f, -2.422411314e-04f, -3.301053375e-04f, +2.197640842e-04f, +8.984483985e-05f, -1.119987057e-04f, -1.248813931e-06f, +2.611756503e-05f, +0.000000000e+00f, + /* 9,12 (40) */ + +0.000000000e+00f, -3.640038068e-04f, -7.244017344e-04f, +1.369519436e-03f, +1.431522013e-03f, -3.520667303e-03f, -1.968002638e-03f, +7.364156595e-03f, +1.639955511e-03f, -1.344583404e-02f, +6.975472133e-04f, +2.233880447e-02f, -6.898933795e-03f, -3.499238852e-02f, +2.054422618e-02f, +5.431465423e-02f, -5.210437737e-02f, -9.480301297e-02f, +1.706306420e-01f, +4.973358228e-01f, +4.391654158e-01f, +7.940177356e-02f, -1.093927506e-01f, -1.782027438e-02f, +5.855053941e-02f, +1.075594405e-03f, -3.476965708e-02f, +4.788653743e-03f, +2.037866057e-02f, -6.058636542e-03f, -1.117719998e-02f, +5.207563414e-03f, +5.492783105e-03f, -3.594842665e-03f, -2.285778100e-03f, +2.010576913e-03f, +7.258969674e-04f, -8.402880963e-04f, -1.326376859e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.029956355e-05f, -2.533016005e-05f, -7.673455300e-05f, +9.692163009e-05f, +1.350615662e-04f, -2.456316624e-04f, -1.815878095e-04f, +5.054456894e-04f, +1.728190469e-04f, -9.127022261e-04f, -4.081851943e-05f, +1.518015683e-03f, -3.216617875e-04f, -2.446416853e-03f, +1.126453069e-03f, +4.221262112e-03f, -3.025002365e-03f, -1.186793396e-02f, -5.871343198e-03f, +8.586219074e-03f, +1.082984213e-02f, +6.554961931e-04f, -4.269203766e-03f, +5.619104480e-05f, +2.374992228e-03f, -3.659691126e-04f, -1.377458422e-03f, +4.381565367e-04f, +7.620449998e-04f, -3.851072520e-04f, -3.797420848e-04f, +2.796446348e-04f, +1.587069418e-04f, -1.696625512e-04f, -4.755012547e-05f, +8.223956993e-05f, +4.023998668e-06f, -2.692258929e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.640038068e-04f, +7.244017344e-04f, -2.018490355e-03f, -1.327933364e-03f, +5.626261622e-03f, -5.265592234e-05f, -1.080407710e-02f, +5.309703269e-03f, +1.532427816e-02f, -1.528622288e-02f, -1.560212016e-02f, +2.821650407e-02f, +8.563392298e-03f, -3.961432746e-02f, +6.055352266e-03f, +4.409682336e-02f, -2.461292134e-02f, -3.833672069e-02f, +4.077576344e-02f, +2.328513928e-02f, -4.859912480e-02f, -4.058749355e-03f, +4.563154007e-02f, -1.260524317e-02f, -3.406035859e-02f, +2.175334631e-02f, +1.922431996e-02f, -2.235728480e-02f, -6.588942035e-03f, +1.704044017e-02f, -8.236187902e-04f, -9.924847704e-03f, +3.127819764e-03f, +4.242092118e-03f, -2.422324079e-03f, -1.157526069e-03f, +8.402880963e-04f, +1.326376859e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.029956355e-05f, +2.533016005e-05f, +1.001473417e-04f, -1.717859800e-04f, -1.286099302e-04f, +4.408229601e-04f, -1.929217109e-06f, -7.770102152e-04f, +4.042349999e-04f, +1.001173424e-03f, -1.077978527e-03f, -8.864814924e-04f, +1.843784705e-03f, +2.979339676e-04f, -2.386724879e-03f, +6.834398429e-04f, +2.410923030e-03f, -1.750741478e-03f, -1.818115282e-03f, +2.506661150e-03f, +7.886246180e-04f, -2.671025537e-03f, +2.999824235e-04f, +2.228440998e-03f, -1.070420316e-03f, -1.420946441e-03f, +1.332857660e-03f, +5.973429932e-04f, -1.147374546e-03f, -2.531532391e-05f, +7.397910623e-04f, -2.153426602e-04f, -3.471604799e-04f, +2.114510313e-04f, +1.005213727e-04f, -1.120120209e-04f, -4.023998668e-06f, +2.692258929e-05f, +0.000000000e+00f, + /* 9,13 (40) */ + +0.000000000e+00f, -3.337042432e-04f, -7.497318944e-04f, +1.292784883e-03f, +1.528443643e-03f, -3.385605737e-03f, -2.213634301e-03f, +7.182568785e-03f, +2.145401201e-03f, -1.327301499e-02f, -2.151550127e-04f, +2.229798595e-02f, -5.380918111e-03f, -3.531405031e-02f, +1.809780933e-02f, +5.544110730e-02f, -4.788311526e-02f, -9.782801534e-02f, +1.587627080e-01f, +4.914644796e-01f, +4.477516349e-01f, +9.023161569e-02f, -1.087372544e-01f, -2.208947814e-02f, +5.860673045e-02f, +3.450586633e-03f, -3.513562619e-02f, +3.411195321e-03f, +2.081681711e-02f, -5.296591542e-03f, -1.156230723e-02f, +4.827821329e-03f, +5.772427739e-03f, -3.436135723e-03f, -2.455440651e-03f, +1.963026788e-03f, +8.081365373e-04f, -8.362640977e-04f, -1.595602752e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.009505649e-05f, -2.214485708e-05f, -7.836051003e-05f, +9.005150179e-05f, +1.417103121e-04f, -2.343394191e-04f, -1.983675388e-04f, +4.905360490e-04f, +2.069349908e-04f, -8.975377174e-04f, -1.019761223e-04f, +1.509535950e-03f, -2.191763885e-04f, -2.456137496e-03f, +9.537203194e-04f, +4.263144944e-03f, -2.673857280e-03f, -1.176756244e-02f, -6.294047364e-03f, +8.236356381e-03f, +1.102396466e-02f, +9.783345528e-04f, -4.296325801e-03f, -1.068858057e-04f, +2.404454123e-03f, -2.732178855e-04f, -1.408568650e-03f, +3.864666965e-04f, +7.894568231e-04f, -3.588949042e-04f, -4.004035202e-04f, +2.685249696e-04f, +1.720314979e-04f, -1.664372060e-04f, -5.467132202e-05f, +8.226761923e-05f, +6.882272725e-06f, -2.765763321e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.337042432e-04f, +7.497318944e-04f, -1.918343013e-03f, -1.499719344e-03f, +5.497651691e-03f, +3.881670377e-04f, -1.080600631e-02f, +4.532693054e-03f, +1.572851316e-02f, -1.428504945e-02f, -1.668009869e-02f, +2.733002257e-02f, +1.040717700e-02f, -3.931639349e-02f, +3.668627387e-03f, +4.478026320e-02f, -2.220199831e-02f, -4.008746217e-02f, +3.895764816e-02f, +2.579180043e-02f, -4.781050018e-02f, -6.729774892e-03f, +4.593152249e-02f, -1.037680218e-02f, -3.513077891e-02f, +2.033239987e-02f, +2.055717762e-02f, -2.175994181e-02f, -7.736316581e-03f, +1.701512485e-02f, -8.382772788e-05f, -1.014019036e-02f, +2.780659284e-03f, +4.453543149e-03f, -2.321802707e-03f, -1.269538090e-03f, +8.362640977e-04f, +1.595602752e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.009505649e-05f, +2.214485708e-05f, +1.031800165e-04f, -1.622604362e-04f, -1.429527411e-04f, +4.306612196e-04f, +3.163086284e-05f, -7.789051815e-04f, +3.503210368e-04f, +1.033035717e-03f, -1.015682073e-03f, -9.621247953e-04f, +1.797971976e-03f, +4.160845349e-04f, -2.385782103e-03f, +5.441515527e-04f, +2.472074827e-03f, -1.625622197e-03f, -1.936215494e-03f, +2.429556966e-03f, +9.362087048e-04f, -2.658331485e-03f, +1.605007859e-04f, +2.272182037e-03f, -9.695083428e-04f, -1.494810429e-03f, +1.281791000e-03f, +6.711773652e-04f, -1.137578335e-03f, -7.879743099e-05f, +7.520500784e-04f, -1.872540094e-04f, -3.634339578e-04f, +2.022282840e-04f, +1.111536367e-04f, -1.116178988e-04f, -6.882272725e-06f, +2.765763321e-05f, +0.000000000e+00f, + /* 9,14 (40) */ + +0.000000000e+00f, -3.036091867e-04f, -7.718767515e-04f, +1.214424373e-03f, +1.618495145e-03f, -3.243895425e-03f, -2.447973720e-03f, +6.984201246e-03f, +2.635937250e-03f, -1.306608000e-02f, -1.112692730e-03f, +2.219600982e-02f, -3.871382161e-03f, -3.553322670e-02f, +1.564167183e-02f, +5.639482762e-02f, -4.361997031e-02f, -1.005018726e-01f, +1.469951456e-01f, +4.851704322e-01f, +4.559879913e-01f, +1.012555804e-01f, -1.077589198e-01f, -2.638580394e-02f, +5.849984465e-02f, +5.855040756e-03f, -3.540884407e-02f, +2.002626671e-03f, +2.120328381e-02f, -4.507134719e-03f, -1.192120214e-02f, +4.427417809e-03f, +6.040952709e-03f, -3.264104226e-03f, -2.621877857e-03f, +1.908355466e-03f, +8.904041566e-04f, -8.293818249e-04f, -1.872179084e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.978978772e-05f, -1.899138096e-05f, -7.969959423e-05f, +8.308147782e-05f, +1.477974694e-04f, -2.225993727e-04f, -2.142677093e-04f, +4.744984666e-04f, +2.399044616e-04f, -8.801051325e-04f, -1.619053252e-04f, +1.497014728e-03f, -1.176853828e-04f, -2.459020753e-03f, +7.815347469e-04f, +4.293034467e-03f, -2.325893097e-03f, -1.165056078e-02f, -6.706207893e-03f, +7.872839323e-03f, +1.120355962e-02f, +1.307370962e-03f, -4.312516933e-03f, -2.725976668e-04f, +2.427743841e-03f, -1.782434709e-04f, -1.436206201e-03f, +3.328710381e-04f, +8.150688250e-04f, -3.312107135e-04f, -4.202810237e-04f, +2.564089168e-04f, +1.851269497e-04f, -1.626383379e-04f, -6.180737756e-05f, +8.203380579e-05f, +9.816251999e-06f, -2.831718992e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.036091867e-04f, +7.718767515e-04f, -1.815162996e-03f, -1.661979780e-03f, +5.354698950e-03f, +8.188282573e-04f, -1.077437545e-02f, +3.753787872e-03f, +1.607883420e-02f, -1.325201374e-02f, -1.769578076e-02f, +2.636789778e-02f, +1.220514898e-02f, -3.890030896e-02f, +1.282845284e-03f, +4.532441476e-02f, -1.972992349e-02f, -4.171308437e-02f, +3.702143267e-02f, +2.822135740e-02f, -4.687429148e-02f, -9.388106377e-03f, +4.609202328e-02f, -8.104620140e-03f, -3.610028725e-02f, +1.883758944e-02f, +2.183896862e-02f, -2.108876444e-02f, -8.873894916e-03f, +1.693632742e-02f, +6.682223505e-04f, -1.032744437e-02f, +2.417225326e-03f, +4.655771433e-03f, -2.210649070e-03f, -1.381155989e-03f, +8.293818249e-04f, +1.872179084e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.978978772e-05f, +1.899138096e-05f, +1.057569484e-04f, -1.524481502e-04f, -1.564995900e-04f, +4.193219023e-04f, +6.450095362e-05f, -7.783179074e-04f, +2.960416965e-04f, +1.061297325e-03f, -9.508724753e-04f, -1.034109200e-03f, +1.746939406e-03f, +5.322041701e-04f, -2.377473344e-03f, +4.037250874e-04f, +2.525427928e-03f, -1.495684471e-03f, -2.048280410e-03f, +2.344895453e-03f, +1.081160093e-03f, -2.637369813e-03f, +1.995087094e-05f, +2.309096785e-03f, -8.649185849e-04f, -1.564587960e-03f, +1.226239766e-03f, +7.436913879e-04f, -1.124068126e-03f, -1.327803143e-04f, +7.620965634e-04f, -1.580466366e-04f, -3.788550823e-04f, +1.921062474e-04f, +1.217025262e-04f, -1.108048548e-04f, -9.816251999e-06f, +2.831718992e-05f, +0.000000000e+00f, + /* 9,15 (40) */ + +0.000000000e+00f, -2.738193990e-04f, -7.908681325e-04f, +1.134724778e-03f, +1.701576622e-03f, -3.096097956e-03f, -2.670573093e-03f, +6.769933537e-03f, +3.110435716e-03f, -1.282617554e-02f, -1.992797863e-03f, +2.203410450e-02f, -2.374367433e-03f, -3.565091208e-02f, +1.318265108e-02f, +5.717636237e-02f, -3.932693585e-02f, -1.028277657e-01f, +1.353445848e-01f, +4.784642243e-01f, +4.638608306e-01f, +1.124591400e-01f, -1.064515489e-01f, -3.069832088e-02f, +5.822724698e-02f, +8.282784597e-03f, -3.558708755e-02f, +5.664204697e-04f, +2.153615484e-02f, -3.692065894e-03f, -1.225241285e-02f, +4.007136785e-03f, +6.297361626e-03f, -3.078977276e-03f, -2.784516195e-03f, +1.846548088e-03f, +9.724379623e-04f, -8.195655729e-04f, -2.155350983e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.938842983e-05f, -1.587937421e-05f, -8.075521240e-05f, +7.603525227e-05f, +1.533170094e-04f, -2.104548082e-04f, -2.292585248e-04f, +4.573982800e-04f, +2.716527702e-04f, -8.604890646e-04f, -2.204579139e-04f, +1.480547740e-03f, -1.745025803e-05f, -2.455168328e-03f, +6.103348932e-04f, +4.311095950e-03f, -1.981746038e-03f, -1.151729288e-02f, -7.107154392e-03f, +7.496239329e-03f, +1.136815197e-02f, +1.642037127e-03f, -4.317519020e-03f, -4.405497161e-04f, +2.444698152e-03f, -8.127479651e-05f, -1.460240162e-03f, +2.774917416e-04f, +8.387789667e-04f, -3.021099160e-04f, -4.393027885e-04f, +2.433133867e-04f, +1.979493752e-04f, -1.582647513e-04f, -6.893621365e-05f, +8.153160369e-05f, +1.281806624e-05f, -2.889587082e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.738193990e-04f, +7.908681325e-04f, -1.709406048e-03f, -1.814427930e-03f, +5.198199360e-03f, +1.238150160e-03f, -1.070987450e-02f, +2.975469965e-03f, +1.637487589e-02f, -1.219071641e-02f, -1.864665324e-02f, +2.533378858e-02f, +1.395208839e-02f, -3.836810479e-02f, -1.094628060e-03f, +4.572813984e-02f, -1.720449556e-02f, -4.320876884e-02f, +3.497315226e-02f, +3.056625285e-02f, -4.579313138e-02f, -1.202547619e-02f, +4.611197415e-02f, -5.795523355e-03f, -3.696520583e-02f, +1.727300148e-02f, +2.306520838e-02f, -2.034507306e-02f, -9.997963042e-03f, +1.680354711e-02f, +1.430318914e-03f, -1.048549101e-02f, +2.038370244e-03f, +4.847877681e-03f, -2.088946544e-03f, -1.491960844e-03f, +8.195655729e-04f, +2.155350983e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.938842983e-05f, +1.587937421e-05f, +1.078825232e-04f, -1.423903798e-04f, -1.692229526e-04f, +4.068653973e-04f, +9.658646901e-05f, -7.752881205e-04f, +2.415747975e-04f, +1.085911119e-03f, -8.837799877e-04f, -1.102240746e-03f, +1.690886375e-03f, +6.459420146e-04f, -2.361861807e-03f, +2.626035945e-04f, +2.570837034e-03f, -1.361341764e-03f, -2.153962968e-03f, +2.252936439e-03f, +1.223020782e-03f, -2.608182334e-03f, -1.212307080e-04f, +2.339033488e-03f, -7.569569405e-04f, -1.630026723e-03f, +1.166339449e-03f, +8.146398330e-04f, -1.106842251e-03f, -1.870964128e-04f, +7.698629303e-04f, -1.277970174e-04f, -3.933546868e-04f, +1.810987270e-04f, +1.321282337e-04f, -1.095626813e-04f, -1.281806624e-05f, +2.889587082e-05f, +0.000000000e+00f, + /* 9,16 (40) */ + +0.000000000e+00f, -2.444309692e-04f, -8.067475067e-04f, +1.053969566e-03f, +1.777611875e-03f, -2.942780946e-03f, -2.881027901e-03f, +6.540675012e-03f, +3.567833996e-03f, -1.255452277e-02f, -2.853286927e-03f, +2.181364659e-02f, -8.938196926e-04f, -3.566836234e-02f, +1.072748275e-02f, +5.778669726e-02f, -3.501583990e-02f, -1.048095118e-01f, +1.238272919e-01f, +4.713570699e-01f, +4.713570699e-01f, +1.238272919e-01f, -1.048095118e-01f, -3.501583990e-02f, +5.778669726e-02f, +1.072748275e-02f, -3.566836234e-02f, -8.938196926e-04f, +2.181364659e-02f, -2.853286927e-03f, -1.255452277e-02f, +3.567833996e-03f, +6.540675012e-03f, -2.881027901e-03f, -2.942780946e-03f, +1.777611875e-03f, +1.053969566e-03f, -8.067475067e-04f, -2.444309692e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.889587082e-05f, -1.281806624e-05f, -8.153160369e-05f, +6.893621365e-05f, +1.582647513e-04f, -1.979493752e-04f, -2.433133867e-04f, +4.393027885e-04f, +3.021099160e-04f, -8.387789667e-04f, -2.774917416e-04f, +1.460240162e-03f, +8.127479651e-05f, -2.444698152e-03f, +4.405497161e-04f, +4.317519020e-03f, -1.642037127e-03f, -1.136815197e-02f, -7.496239329e-03f, +7.107154392e-03f, +1.151729288e-02f, +1.981746038e-03f, -4.311095950e-03f, -6.103348932e-04f, +2.455168328e-03f, +1.745025803e-05f, -1.480547740e-03f, +2.204579139e-04f, +8.604890646e-04f, -2.716527702e-04f, -4.573982800e-04f, +2.292585248e-04f, +2.104548082e-04f, -1.533170094e-04f, -7.603525227e-05f, +8.075521240e-05f, +1.587937421e-05f, -2.938842983e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.444309692e-04f, +8.067475067e-04f, -1.601523525e-03f, -1.956818310e-03f, +5.028976408e-03f, +1.645015557e-03f, -1.061328803e-02f, +2.200181844e-03f, +1.661645069e-02f, -1.110480529e-02f, -1.953043322e-02f, +2.423154783e-02f, +1.564297476e-02f, -3.772216277e-02f, -3.456489867e-03f, +4.599074344e-02f, -1.463365852e-02f, -4.457011060e-02f, +3.281918929e-02f, +3.281918929e-02f, -4.457011060e-02f, -1.463365852e-02f, +4.599074344e-02f, -3.456489867e-03f, -3.772216277e-02f, +1.564297476e-02f, +2.423154783e-02f, -1.953043322e-02f, -1.110480529e-02f, +1.661645069e-02f, +2.200181844e-03f, -1.061328803e-02f, +1.645015557e-03f, +5.028976408e-03f, -1.956818310e-03f, -1.601523525e-03f, +8.067475067e-04f, +2.444309692e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.889587082e-05f, +1.281806624e-05f, +1.095626813e-04f, -1.321282337e-04f, -1.810987270e-04f, +3.933546868e-04f, +1.277970174e-04f, -7.698629303e-04f, +1.870964128e-04f, +1.106842251e-03f, -8.146398330e-04f, -1.166339449e-03f, +1.630026723e-03f, +7.569569405e-04f, -2.339033488e-03f, +1.212307080e-04f, +2.608182334e-03f, -1.223020782e-03f, -2.252936439e-03f, +2.153962968e-03f, +1.361341764e-03f, -2.570837034e-03f, -2.626035945e-04f, +2.361861807e-03f, -6.459420146e-04f, -1.690886375e-03f, +1.102240746e-03f, +8.837799877e-04f, -1.085911119e-03f, -2.415747975e-04f, +7.752881205e-04f, -9.658646901e-05f, -4.068653973e-04f, +1.692229526e-04f, +1.423903798e-04f, -1.078825232e-04f, -1.587937421e-05f, +2.938842983e-05f, +0.000000000e+00f, + /* 9,17 (40) */ + +0.000000000e+00f, -2.155350983e-04f, -8.195655729e-04f, +9.724379623e-04f, +1.846548088e-03f, -2.784516195e-03f, -3.078977276e-03f, +6.297361626e-03f, +4.007136785e-03f, -1.225241285e-02f, -3.692065894e-03f, +2.153615484e-02f, +5.664204697e-04f, -3.558708755e-02f, +8.282784597e-03f, +5.822724698e-02f, -3.069832088e-02f, -1.064515489e-01f, +1.124591400e-01f, +4.638608306e-01f, +4.784642243e-01f, +1.353445848e-01f, -1.028277657e-01f, -3.932693585e-02f, +5.717636237e-02f, +1.318265108e-02f, -3.565091208e-02f, -2.374367433e-03f, +2.203410450e-02f, -1.992797863e-03f, -1.282617554e-02f, +3.110435716e-03f, +6.769933537e-03f, -2.670573093e-03f, -3.096097956e-03f, +1.701576622e-03f, +1.134724778e-03f, -7.908681325e-04f, -2.738193990e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.831718992e-05f, -9.816251999e-06f, -8.203380579e-05f, +6.180737756e-05f, +1.626383379e-04f, -1.851269497e-04f, -2.564089168e-04f, +4.202810237e-04f, +3.312107135e-04f, -8.150688250e-04f, -3.328710381e-04f, +1.436206201e-03f, +1.782434709e-04f, -2.427743841e-03f, +2.725976668e-04f, +4.312516933e-03f, -1.307370962e-03f, -1.120355962e-02f, -7.872839323e-03f, +6.706207893e-03f, +1.165056078e-02f, +2.325893097e-03f, -4.293034467e-03f, -7.815347469e-04f, +2.459020753e-03f, +1.176853828e-04f, -1.497014728e-03f, +1.619053252e-04f, +8.801051325e-04f, -2.399044616e-04f, -4.744984666e-04f, +2.142677093e-04f, +2.225993727e-04f, -1.477974694e-04f, -8.308147782e-05f, +7.969959423e-05f, +1.899138096e-05f, -2.978978772e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.155350983e-04f, +8.195655729e-04f, -1.491960844e-03f, -2.088946544e-03f, +4.847877681e-03f, +2.038370244e-03f, -1.048549101e-02f, +1.430318914e-03f, +1.680354711e-02f, -9.997963042e-03f, -2.034507306e-02f, +2.306520838e-02f, +1.727300148e-02f, -3.696520583e-02f, -5.795523355e-03f, +4.611197415e-02f, -1.202547619e-02f, -4.579313138e-02f, +3.056625285e-02f, +3.497315226e-02f, -4.320876884e-02f, -1.720449556e-02f, +4.572813984e-02f, -1.094628060e-03f, -3.836810479e-02f, +1.395208839e-02f, +2.533378858e-02f, -1.864665324e-02f, -1.219071641e-02f, +1.637487589e-02f, +2.975469965e-03f, -1.070987450e-02f, +1.238150160e-03f, +5.198199360e-03f, -1.814427930e-03f, -1.709406048e-03f, +7.908681325e-04f, +2.738193990e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.831718992e-05f, +9.816251999e-06f, +1.108048548e-04f, -1.217025262e-04f, -1.921062474e-04f, +3.788550823e-04f, +1.580466366e-04f, -7.620965634e-04f, +1.327803143e-04f, +1.124068126e-03f, -7.436913879e-04f, -1.226239766e-03f, +1.564587960e-03f, +8.649185849e-04f, -2.309096785e-03f, -1.995087094e-05f, +2.637369813e-03f, -1.081160093e-03f, -2.344895453e-03f, +2.048280410e-03f, +1.495684471e-03f, -2.525427928e-03f, -4.037250874e-04f, +2.377473344e-03f, -5.322041701e-04f, -1.746939406e-03f, +1.034109200e-03f, +9.508724753e-04f, -1.061297325e-03f, -2.960416965e-04f, +7.783179074e-04f, -6.450095362e-05f, -4.193219023e-04f, +1.564995900e-04f, +1.524481502e-04f, -1.057569484e-04f, -1.899138096e-05f, +2.978978772e-05f, +0.000000000e+00f, + /* 9,18 (40) */ + +0.000000000e+00f, -1.872179084e-04f, -8.293818249e-04f, +8.904041566e-04f, +1.908355466e-03f, -2.621877857e-03f, -3.264104226e-03f, +6.040952709e-03f, +4.427417809e-03f, -1.192120214e-02f, -4.507134719e-03f, +2.120328381e-02f, +2.002626671e-03f, -3.540884407e-02f, +5.855040756e-03f, +5.849984465e-02f, -2.638580394e-02f, -1.077589198e-01f, +1.012555804e-01f, +4.559879913e-01f, +4.851704322e-01f, +1.469951456e-01f, -1.005018726e-01f, -4.361997031e-02f, +5.639482762e-02f, +1.564167183e-02f, -3.553322670e-02f, -3.871382161e-03f, +2.219600982e-02f, -1.112692730e-03f, -1.306608000e-02f, +2.635937250e-03f, +6.984201246e-03f, -2.447973720e-03f, -3.243895425e-03f, +1.618495145e-03f, +1.214424373e-03f, -7.718767515e-04f, -3.036091867e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.765763321e-05f, -6.882272725e-06f, -8.226761923e-05f, +5.467132202e-05f, +1.664372060e-04f, -1.720314979e-04f, -2.685249696e-04f, +4.004035202e-04f, +3.588949042e-04f, -7.894568231e-04f, -3.864666965e-04f, +1.408568650e-03f, +2.732178855e-04f, -2.404454123e-03f, +1.068858057e-04f, +4.296325801e-03f, -9.783345528e-04f, -1.102396466e-02f, -8.236356381e-03f, +6.294047364e-03f, +1.176756244e-02f, +2.673857280e-03f, -4.263144944e-03f, -9.537203194e-04f, +2.456137496e-03f, +2.191763885e-04f, -1.509535950e-03f, +1.019761223e-04f, +8.975377174e-04f, -2.069349908e-04f, -4.905360490e-04f, +1.983675388e-04f, +2.343394191e-04f, -1.417103121e-04f, -9.005150179e-05f, +7.836051003e-05f, +2.214485708e-05f, -3.009505649e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.872179084e-04f, +8.293818249e-04f, -1.381155989e-03f, -2.210649070e-03f, +4.655771433e-03f, +2.417225326e-03f, -1.032744437e-02f, +6.682223505e-04f, +1.693632742e-02f, -8.873894916e-03f, -2.108876444e-02f, +2.183896862e-02f, +1.883758944e-02f, -3.610028725e-02f, -8.104620140e-03f, +4.609202328e-02f, -9.388106377e-03f, -4.687429148e-02f, +2.822135740e-02f, +3.702143267e-02f, -4.171308437e-02f, -1.972992349e-02f, +4.532441476e-02f, +1.282845284e-03f, -3.890030896e-02f, +1.220514898e-02f, +2.636789778e-02f, -1.769578076e-02f, -1.325201374e-02f, +1.607883420e-02f, +3.753787872e-03f, -1.077437545e-02f, +8.188282573e-04f, +5.354698950e-03f, -1.661979780e-03f, -1.815162996e-03f, +7.718767515e-04f, +3.036091867e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.765763321e-05f, +6.882272725e-06f, +1.116178988e-04f, -1.111536367e-04f, -2.022282840e-04f, +3.634339578e-04f, +1.872540094e-04f, -7.520500784e-04f, +7.879743099e-05f, +1.137578335e-03f, -6.711773652e-04f, -1.281791000e-03f, +1.494810429e-03f, +9.695083428e-04f, -2.272182037e-03f, -1.605007859e-04f, +2.658331485e-03f, -9.362087048e-04f, -2.429556966e-03f, +1.936215494e-03f, +1.625622197e-03f, -2.472074827e-03f, -5.441515527e-04f, +2.385782103e-03f, -4.160845349e-04f, -1.797971976e-03f, +9.621247953e-04f, +1.015682073e-03f, -1.033035717e-03f, -3.503210368e-04f, +7.789051815e-04f, -3.163086284e-05f, -4.306612196e-04f, +1.429527411e-04f, +1.622604362e-04f, -1.031800165e-04f, -2.214485708e-05f, +3.009505649e-05f, +0.000000000e+00f, + /* 9,19 (40) */ + +0.000000000e+00f, -1.595602752e-04f, -8.362640977e-04f, +8.081365373e-04f, +1.963026788e-03f, -2.455440651e-03f, -3.436135723e-03f, +5.772427739e-03f, +4.827821329e-03f, -1.156230723e-02f, -5.296591542e-03f, +2.081681711e-02f, +3.411195321e-03f, -3.513562619e-02f, +3.450586633e-03f, +5.860673045e-02f, -2.208947814e-02f, -1.087372544e-01f, +9.023161569e-02f, +4.477516349e-01f, +4.914644796e-01f, +1.587627080e-01f, -9.782801534e-02f, -4.788311526e-02f, +5.544110730e-02f, +1.809780933e-02f, -3.531405031e-02f, -5.380918111e-03f, +2.229798595e-02f, -2.151550127e-04f, -1.327301499e-02f, +2.145401201e-03f, +7.182568785e-03f, -2.213634301e-03f, -3.385605737e-03f, +1.528443643e-03f, +1.292784883e-03f, -7.497318944e-04f, -3.337042432e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.692258929e-05f, -4.023998668e-06f, -8.223956993e-05f, +4.755012547e-05f, +1.696625512e-04f, -1.587069418e-04f, -2.796446348e-04f, +3.797420848e-04f, +3.851072520e-04f, -7.620449998e-04f, -4.381565367e-04f, +1.377458422e-03f, +3.659691126e-04f, -2.374992228e-03f, -5.619104480e-05f, +4.269203766e-03f, -6.554961931e-04f, -1.082984213e-02f, -8.586219074e-03f, +5.871343198e-03f, +1.186793396e-02f, +3.025002365e-03f, -4.221262112e-03f, -1.126453069e-03f, +2.446416853e-03f, +3.216617875e-04f, -1.518015683e-03f, +4.081851943e-05f, +9.127022261e-04f, -1.728190469e-04f, -5.054456894e-04f, +1.815878095e-04f, +2.456316624e-04f, -1.350615662e-04f, -9.692163009e-05f, +7.673455300e-05f, +2.533016005e-05f, -3.029956355e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.595602752e-04f, +8.362640977e-04f, -1.269538090e-03f, -2.321802707e-03f, +4.453543149e-03f, +2.780659284e-03f, -1.014019036e-02f, -8.382772788e-05f, +1.701512485e-02f, -7.736316581e-03f, -2.175994181e-02f, +2.055717762e-02f, +2.033239987e-02f, -3.513077891e-02f, -1.037680218e-02f, +4.593152249e-02f, -6.729774892e-03f, -4.781050018e-02f, +2.579180043e-02f, +3.895764816e-02f, -4.008746217e-02f, -2.220199831e-02f, +4.478026320e-02f, +3.668627387e-03f, -3.931639349e-02f, +1.040717700e-02f, +2.733002257e-02f, -1.668009869e-02f, -1.428504945e-02f, +1.572851316e-02f, +4.532693054e-03f, -1.080600631e-02f, +3.881670377e-04f, +5.497651691e-03f, -1.499719344e-03f, -1.918343013e-03f, +7.497318944e-04f, +3.337042432e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.692258929e-05f, +4.023998668e-06f, +1.120120209e-04f, -1.005213727e-04f, -2.114510313e-04f, +3.471604799e-04f, +2.153426602e-04f, -7.397910623e-04f, +2.531532391e-05f, +1.147374546e-03f, -5.973429932e-04f, -1.332857660e-03f, +1.420946441e-03f, +1.070420316e-03f, -2.228440998e-03f, -2.999824235e-04f, +2.671025537e-03f, -7.886246180e-04f, -2.506661150e-03f, +1.818115282e-03f, +1.750741478e-03f, -2.410923030e-03f, -6.834398429e-04f, +2.386724879e-03f, -2.979339676e-04f, -1.843784705e-03f, +8.864814924e-04f, +1.077978527e-03f, -1.001173424e-03f, -4.042349999e-04f, +7.770102152e-04f, +1.929217109e-06f, -4.408229601e-04f, +1.286099302e-04f, +1.717859800e-04f, -1.001473417e-04f, -2.533016005e-05f, +3.029956355e-05f, +0.000000000e+00f, + /* 9,20 (40) */ + +0.000000000e+00f, -1.326376859e-04f, -8.402880963e-04f, +7.258969674e-04f, +2.010576913e-03f, -2.285778100e-03f, -3.594842665e-03f, +5.492783105e-03f, +5.207563414e-03f, -1.117719998e-02f, -6.058636542e-03f, +2.037866057e-02f, +4.788653743e-03f, -3.476965708e-02f, +1.075594405e-03f, +5.855053941e-02f, -1.782027438e-02f, -1.093927506e-01f, +7.940177356e-02f, +4.391654158e-01f, +4.973358228e-01f, +1.706306420e-01f, -9.480301297e-02f, -5.210437737e-02f, +5.431465423e-02f, +2.054422618e-02f, -3.499238852e-02f, -6.898933795e-03f, +2.233880447e-02f, +6.975472133e-04f, -1.344583404e-02f, +1.639955511e-03f, +7.364156595e-03f, -1.968002638e-03f, -3.520667303e-03f, +1.431522013e-03f, +1.369519436e-03f, -7.244017344e-04f, -3.640038068e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.611756503e-05f, -1.248813931e-06f, -8.195687024e-05f, +4.046530777e-05f, +1.723172887e-04f, -1.451970278e-04f, -2.897542300e-04f, +3.583695657e-04f, +4.097976228e-04f, -7.329389011e-04f, -4.878255463e-04f, +1.343014081e-03f, +4.562776664e-04f, -2.339535262e-03f, -2.162511058e-04f, +4.231430134e-03f, -3.394043914e-04f, -1.062169210e-02f, -8.921883660e-03f, +5.438787302e-03f, +1.195134171e-02f, +3.378678185e-03f, -4.167245739e-03f, -1.299285828e-03f, +2.429773852e-03f, +4.248734012e-04f, -1.522368065e-03f, -2.141353182e-05f, +9.255192434e-04f, -1.376358638e-04f, -5.191642378e-04f, +1.639614834e-04f, +2.564333221e-04f, -1.278591280e-04f, -1.036679328e-04f, +7.481918043e-05f, +2.853725754e-05f, -3.039887583e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.326376859e-04f, +8.402880963e-04f, -1.157526069e-03f, -2.422324079e-03f, +4.242092118e-03f, +3.127819764e-03f, -9.924847704e-03f, -8.236187902e-04f, +1.704044017e-02f, -6.588942035e-03f, -2.235728480e-02f, +1.922431996e-02f, +2.175334631e-02f, -3.406035859e-02f, -1.260524317e-02f, +4.563154007e-02f, -4.058749355e-03f, -4.859912480e-02f, +2.328513928e-02f, +4.077576344e-02f, -3.833672069e-02f, -2.461292134e-02f, +4.409682336e-02f, +6.055352266e-03f, -3.961432746e-02f, +8.563392298e-03f, +2.821650407e-02f, -1.560212016e-02f, -1.528622288e-02f, +1.532427816e-02f, +5.309703269e-03f, -1.080407710e-02f, -5.265592234e-05f, +5.626261622e-03f, -1.327933364e-03f, -2.018490355e-03f, +7.244017344e-04f, +3.640038068e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.611756503e-05f, +1.248813931e-06f, +1.119987057e-04f, -8.984483985e-05f, -2.197640842e-04f, +3.301053375e-04f, +2.422411314e-04f, -7.253933090e-04f, -2.750232073e-05f, +1.153470363e-03f, -5.224351940e-04f, -1.379319762e-03f, +1.343259367e-03f, +1.167362215e-03f, -2.178046240e-03f, -4.379642943e-04f, +2.675436391e-03f, -6.388733453e-04f, -2.575972209e-03f, +1.694346065e-03f, +1.870643441e-03f, -2.342142925e-03f, -8.211487210e-04f, +2.380261573e-03f, -1.781119850e-04f, -1.884193427e-03f, +8.073867218e-04f, +1.137537353e-03f, -9.657698389e-04f, -4.576045913e-04f, +7.726009063e-04f, +3.608075842e-05f, -4.497495869e-04f, +1.135020794e-04f, +1.809835241e-04f, -9.665615182e-05f, -2.853725754e-05f, +3.039887583e-05f, +0.000000000e+00f, + /* 9,21 (40) */ + +0.000000000e+00f, -1.065201209e-04f, -8.415369103e-04f, +6.439400972e-04f, +2.051042221e-03f, -2.113460811e-03f, -3.740039693e-03f, +5.203028875e-03f, +5.565932979e-03f, -1.076740236e-02f, -6.791575443e-03f, +1.989083503e-02f, +6.131667824e-03f, -3.431337941e-02f, -1.263940857e-03f, +5.833428830e-02f, -1.358884424e-02f, -1.097321550e-01f, +6.878008146e-02f, +4.302435322e-01f, +5.027746101e-01f, +1.825819837e-01f, -9.142433479e-02f, -5.627162311e-02f, +5.301536841e-02f, +2.297400003e-02f, -3.456751512e-02f, -8.421301860e-03f, +2.231739093e-02f, +1.623066457e-03f, -1.358346990e-02f, +1.120791274e-03f, +7.528118078e-03f, -1.711569316e-03f, -3.648526431e-03f, +1.327854080e-03f, +1.444338616e-03f, -6.958644769e-04f, -3.944026826e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.524816144e-05f, +1.436396644e-06f, -8.142737847e-05f, +3.343777417e-05f, +1.744060091e-04f, -1.315451980e-04f, -2.988432843e-04f, +3.363596225e-04f, +4.329210476e-04f, -7.022472270e-04f, -5.353660973e-04f, +1.305381341e-03f, +5.439339613e-04f, -2.298273532e-03f, -3.729264058e-04f, +4.183304467e-03f, -3.058685352e-05f, -1.040003843e-02f, -9.242835135e-03f, +4.997091712e-03f, +1.201748315e-02f, +3.734221936e-03f, -4.100981252e-03f, -1.471763790e-03f, +2.406140717e-03f, +5.285369950e-04f, -1.522517476e-03f, -8.456069436e-05f, +9.359148400e-04f, -1.014690617e-04f, -5.316309555e-04f, +1.455246449e-04f, +2.667022623e-04f, -1.201127747e-04f, -1.102663162e-04f, +7.261274324e-05f, +3.175575267e-05f, -3.038882345e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.065201209e-04f, +8.415369103e-04f, -1.045527363e-03f, -2.512168919e-03f, +4.022328034e-03f, +3.457925101e-03f, -9.682606573e-03f, -1.549012099e-03f, +1.701293785e-02f, -5.435471671e-03f, -2.287972000e-02f, +1.784500020e-02f, +2.309660568e-02f, -3.289299638e-02f, -1.478328941e-02f, +4.519357577e-02f, -1.383312964e-03f, -4.923799814e-02f, +2.070916707e-02f, +4.247010951e-02f, -3.646607725e-02f, -2.695506427e-02f, +4.327567464e-02f, +8.435613839e-03f, -3.979243945e-02f, +6.679198870e-03f, +2.902389079e-02f, -1.446458281e-02f, -1.625199272e-02f, +1.486667357e-02f, +6.082304175e-03f, -1.076799634e-02f, -5.024055093e-04f, +5.739763701e-03f, -1.146949840e-03f, -2.115146507e-03f, +6.958644769e-04f, +3.944026826e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.524816144e-05f, -1.436396644e-06f, +1.115906368e-04f, -7.916231559e-05f, -2.271604025e-04f, +3.123404704e-04f, +2.678831402e-04f, -7.089364809e-04f, -7.949617923e-05f, +1.155891140e-03f, -4.467017651e-04f, -1.421073082e-03f, +1.262022715e-03f, +1.260056211e-03f, -2.121190497e-03f, -5.740213917e-04f, +2.671574675e-03f, -4.874264133e-04f, -2.637279115e-03f, +1.565292203e-03f, +1.984945093e-03f, -2.265929507e-03f, -9.568402833e-04f, +2.366375433e-03f, -5.698565503e-05f, -1.919029903e-03f, +7.250608239e-04f, +1.194140631e-03f, -9.268965660e-04f, -5.102502210e-04f, +7.656529984e-04f, +7.072156256e-05f, -4.573866696e-04f, +9.766346956e-05f, +1.898119631e-04f, -9.270534274e-05f, -3.175575267e-05f, +3.038882345e-05f, +0.000000000e+00f, + /* 9,22 (40) */ + +0.000000000e+00f, -8.127195944e-05f, -8.401005136e-04f, +5.625127187e-04f, +2.084479995e-03f, -1.939054802e-03f, -3.871584891e-03f, +4.904185590e-03f, +5.902292602e-03f, -1.033448131e-02f, -7.493822670e-03f, +1.935546893e-02f, +7.437049164e-03f, -3.376944545e-02f, -3.562214389e-03f, +5.796136190e-02f, -9.405539777e-03f, -1.097627418e-01f, +5.838004303e-02f, +4.210006970e-01f, +5.077717018e-01f, +1.945994668e-01f, -8.769011285e-02f, -6.037260436e-02f, +5.154360462e-02f, +2.538014075e-02f, -3.403897813e-02f, -9.943819336e-03f, +2.223283024e-02f, +2.558981297e-03f, -1.368493896e-02f, +5.891603182e-04f, +7.673642723e-03f, -1.444867054e-03f, -3.768639206e-03f, +1.217587764e-03f, +1.516951359e-03f, -6.641087242e-04f, -4.247915060e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.432004984e-05f, +4.025258508e-06f, -8.065955729e-05f, +2.648776246e-05f, +1.759349294e-04f, -1.177944647e-04f, -3.069045119e-04f, +3.137864980e-04f, +4.544377708e-04f, -6.700814743e-04f, -5.806781401e-04f, +1.264712566e-03f, +6.287387368e-04f, -2.251409867e-03f, -5.258635010e-04f, +4.125145637e-03f, +2.704504794e-04f, -1.016542758e-02f, -9.548588231e-03f, +4.546987151e-03f, +1.206608769e-02f, +4.090959519e-03f, -4.022380306e-03f, -1.643425534e-03f, +2.375467304e-03f, +6.323729384e-04f, -1.518398899e-03f, -1.484586174e-04f, +9.438208686e-04f, -6.440647307e-05f, -5.427877350e-04f, +1.263164487e-04f, +2.763971337e-04f, -1.118341724e-04f, -1.166925968e-04f, +7.011451321e-05f, +3.497491124e-05f, -3.026552314e-05f, +0.000000000e+00f, + +0.000000000e+00f, +8.127195944e-05f, +8.401005136e-04f, -9.339367267e-04f, -2.591331235e-03f, +3.795167631e-03f, +3.770265571e-03f, -9.414723433e-03f, -2.257948580e-03f, +1.693344167e-02f, -4.279580531e-03f, -2.332642176e-02f, +1.642392712e-02f, +2.435862839e-02f, -3.163294016e-02f, -1.690447991e-02f, +4.461955438e-02f, +1.288261711e-03f, -4.972542456e-02f, +1.807188796e-02f, +4.403540171e-02f, -3.448113216e-02f, -2.922099377e-02f, +4.231883436e-02f, +1.080198927e-02f, -3.984942510e-02f, +4.760168967e-03f, +2.974895161e-02f, -1.327044218e-02f, -1.717888928e-02f, +1.435642335e-02f, +6.847957174e-03f, -1.069727478e-02f, -9.597921789e-04f, +5.837427171e-03f, -9.571378768e-04f, -2.207851849e-03f, +6.641087242e-04f, +4.247915060e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.432004984e-05f, -4.025258508e-06f, +1.108016165e-04f, -6.851113018e-05f, -2.336362639e-04f, +2.939387987e-04f, +2.922077150e-04f, -6.905057570e-04f, -1.305117571e-04f, +1.154673760e-03f, -3.703905661e-04f, -1.458029351e-03f, +1.177519168e-03f, +1.348239735e-03f, -2.058085942e-03f, -7.077365253e-04f, +2.659477117e-03f, -3.347598469e-04f, -2.690396264e-03f, +1.431354905e-03f, +2.093280578e-03f, -2.182501822e-03f, -1.090081376e-03f, +2.345073229e-03f, +6.507154126e-05f, -1.948142476e-03f, +6.397364432e-04f, +1.247577785e-03f, -8.846373242e-04f, -5.619922933e-04f, +7.561502784e-04f, +1.057460482e-04f, -4.636831315e-04f, +8.113168891e-05f, +1.982304998e-04f, -8.829552714e-05f, -3.497491124e-05f, +3.026552314e-05f, +0.000000000e+00f, + /* 9,23 (40) */ + +0.000000000e+00f, -5.695190960e-05f, -8.360752551e-04f, +4.818531614e-04f, +2.110967758e-03f, -1.763119873e-03f, -3.989379356e-03f, +4.597281078e-03f, +6.216079100e-03f, -9.880043540e-03f, -8.163904144e-03f, +1.877479079e-02f, +8.701761730e-03f, -3.314070671e-02f, -5.813624256e-03f, +5.743549839e-02f, -5.280394140e-03f, -1.094922914e-01f, +4.821461544e-02f, +4.114521088e-01f, +5.123186890e-01f, +2.066655545e-01f, -8.359915333e-02f, -6.439498467e-02f, +4.990017908e-02f, +2.775560805e-02f, -3.340660519e-02f, -1.146221824e-02f, +2.208437162e-02f, +3.502802165e-03f, -1.374934544e-02f, +4.637258314e-05f, +7.799959172e-03f, -1.168469920e-03f, -3.880473378e-03f, +1.100895167e-03f, +1.587065873e-03f, -6.291338129e-04f, -4.550570292e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.333894834e-05f, +6.511916378e-06f, -7.966243098e-05f, +1.963479337e-05f, +1.769118413e-04f, -1.039872891e-04f, -3.139337773e-04f, +2.907247910e-04f, +4.743132810e-04f, -6.365555774e-04f, -6.236693718e-04f, +1.221166251e-03f, +7.105034497e-04f, -2.199158900e-03f, -6.747241509e-04f, +4.057290844e-03f, +5.632243356e-04f, -9.918427271e-03f, -9.838688335e-03f, +4.089221553e-03f, +1.209691739e-02f, +4.448206912e-03f, -3.931381301e-03f, -1.813804071e-03f, +2.337721486e-03f, +7.360968874e-04f, -1.509958254e-03f, -2.129383280e-04f, +9.491752487e-04f, -2.653995388e-05f, -5.525793165e-04f, +1.063790562e-04f, +2.854775143e-04f, -1.030368784e-04f, -1.229225772e-04f, +6.732470766e-05f, +3.818369075e-05f, -3.002540106e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.695190960e-05f, +8.360752551e-04f, -8.231351102e-04f, -2.659842365e-03f, +3.561531368e-03f, +4.064204370e-03f, -9.122515718e-03f, -2.948454337e-03f, +1.680292992e-02f, -3.124906771e-03f, -2.369681233e-02f, +1.496589776e-02f, +2.553614756e-02f, -3.028470043e-02f, -1.896256585e-02f, +4.391181785e-02f, +3.947738828e-03f, -5.006018440e-02f, +1.538149169e-02f, +4.546675661e-02f, -3.238785158e-02f, -3.140349560e-02f, +4.122875298e-02f, +1.314706250e-02f, -3.978435356e-02f, +2.812026491e-03f, +3.038868806e-02f, -1.202286439e-02f, -1.806352661e-02f, +1.379443106e-02f, +7.604107452e-03f, -1.059152873e-02f, -1.423475310e-03f, +5.918558860e-03f, -7.589073770e-04f, -2.296147376e-03f, +6.291338129e-04f, +4.550570292e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.333894834e-05f, -6.511916378e-06f, +1.096464823e-04f, -5.792755312e-05f, -2.391912064e-04f, +2.749739539e-04f, +3.151593111e-04f, -6.701914660e-04f, -1.803998335e-04f, +1.149866382e-03f, -2.937487134e-04f, -1.490116400e-03f, +1.090039604e-03f, +1.431666225e-03f, -1.988963407e-03f, -8.387016222e-04f, +2.639206348e-03f, -1.813526412e-04f, -2.735164053e-03f, +1.292950954e-03f, +2.195302367e-03f, -2.092102327e-03f, -1.220445003e-03f, +2.316385335e-03f, +1.876808763e-04f, -1.971396687e-03f, +5.516578768e-04f, +1.297646345e-03f, -8.390878083e-04f, -6.126518040e-04f, +7.440847489e-04f, +1.410455555e-04f, -4.685914899e-04f, +6.394756893e-05f, +2.061988025e-04f, -8.342907803e-05f, -3.818369075e-05f, +3.002540106e-05f, +0.000000000e+00f, + /* 9,24 (40) */ + +0.000000000e+00f, -3.361296126e-05f, -8.295633387e-04f, +4.021907304e-04f, +2.130602551e-03f, -1.586208031e-03f, -4.093366645e-03f, +4.283347301e-03f, +6.506803891e-03f, -9.405730259e-03f, -8.800459722e-03f, +1.815112142e-02f, +9.922927981e-03f, -3.243020326e-02f, -8.012783156e-03f, +5.676077424e-02f, -1.223103297e-03f, -1.089290670e-01f, +3.829618817e-02f, +4.016134205e-01f, +5.164079105e-01f, +2.187624719e-01f, -7.915094642e-02f, -6.832636597e-02f, +4.808637501e-02f, +3.009332954e-02f, -3.267050830e-02f, -1.297217649e-02f, +2.187143329e-02f, +4.451977414e-03f, -1.377588539e-02f, -5.062067334e-04f, +7.906338228e-03f, -8.829924060e-04f, -3.983510257e-03f, +9.779725896e-04f, +1.654390580e-03f, -5.909501222e-04f, -4.850824302e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.231059876e-05f, +8.891041164e-06f, -7.844554178e-05f, +1.289762441e-05f, +1.773460538e-04f, -9.016546299e-05f, -3.199300511e-04f, +2.672492328e-04f, +4.925183278e-04f, -6.017855469e-04f, -6.642553817e-04f, +1.174906500e-03f, +7.890506312e-04f, -2.141746337e-03f, -8.191859473e-04f, +3.980094595e-03f, +8.472749576e-04f, -9.659625154e-03f, -1.011271235e-02f, +3.624558540e-03f, +1.210976765e-02f, +4.805271585e-03f, -3.827949833e-03f, -1.982427921e-03f, +2.292889502e-03f, +8.394204909e-04f, -1.497152711e-03f, -2.778266412e-04f, +9.519222367e-04f, +1.203482045e-05f, -5.609534982e-04f, +8.575756238e-05f, +2.939040512e-04f, -9.373633740e-05f, -1.289321237e-04f, +6.424451154e-05f, +4.137077124e-05f, -2.966521518e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.361296126e-05f, +8.295633387e-04f, -7.134886279e-04f, -2.717769918e-03f, +3.322340161e-03f, +4.339178324e-03f, -8.807356407e-03f, -3.618645803e-03f, +1.662253008e-02f, -1.975040388e-03f, -2.399056104e-02f, +1.347578136e-02f, +2.662618717e-02f, -2.885303420e-02f, -2.095152926e-02f, +4.307311623e-02f, +6.586945176e-03f, -5.024153705e-02f, +1.264632764e-02f, +4.675970757e-02f, -3.019254921e-02f, -3.349559792e-02f, +4.000830798e-02f, +1.546344784e-02f, -3.959667268e-02f, +8.406298037e-04f, +3.094034593e-02f, -1.072521805e-02f, -1.890261442e-02f, +1.318177925e-02f, +8.348192201e-03f, -1.045048317e-02f, -1.892066800e-03f, +5.982506429e-03f, -5.527085745e-04f, -2.379576454e-03f, +5.909501222e-04f, +4.850824302e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.231059876e-05f, -8.891041164e-06f, +1.081410225e-04f, -4.744668640e-05f, -2.438279597e-04f, +2.555200118e-04f, +3.366879062e-04f, -6.480887084e-04f, -2.290168826e-04f, +1.141528149e-03f, -2.170217854e-04f, -1.517278249e-03f, +9.998821001e-04f, +1.510105810e-03f, -1.914071544e-03f, -9.665189953e-04f, +2.610850631e-03f, -2.768522710e-05f, -2.771449368e-03f, +1.150511382e-03f, +2.290682395e-03f, -1.994996168e-03f, -1.347511719e-03f, +2.280365757e-03f, +3.104595657e-04f, -1.988675834e-03f, +4.610803787e-04f, +1.344152686e-03f, -7.903555101e-04f, -6.620509438e-04f, +7.294567753e-04f, +1.765086660e-04f, -4.720680878e-04f, +4.615510668e-05f, +2.136771647e-04f, -7.811016640e-05f, -4.137077124e-05f, +2.966521518e-05f, +0.000000000e+00f, + /* 9,25 (40) */ + +0.000000000e+00f, -1.130236251e-05f, -8.206722976e-04f, +3.237451886e-04f, +2.143500175e-03f, -1.408861977e-03f, -4.183532108e-03f, +3.963417250e-03f, +6.774053124e-03f, -8.913211932e-03f, -9.402245269e-03f, +1.748686604e-02f, +1.109783448e-02f, -3.164115263e-02f, -1.015452949e-02f, +5.594158830e-02f, +2.756991298e-03f, -1.080817921e-01f, +2.863656302e-02f, +3.915007081e-01f, +5.200324690e-01f, +2.308722396e-01f, -7.434567483e-02f, -7.215431580e-02f, +4.610394709e-02f, +3.238621904e-02f, -3.183108781e-02f, -1.446932920e-02f, +2.159360665e-02f, +5.403899651e-03f, -1.376385057e-02f, -1.067160232e-03f, +7.992095790e-03f, -5.890883548e-04f, -4.077246594e-03f, +8.490404659e-04f, +1.718635092e-03f, -5.495793510e-04f, -5.147476454e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.124074400e-05f, +1.115783486e-05f, -7.701890551e-05f, +6.294207036e-06f, +1.772483334e-04f, -7.636999562e-05f, -3.248953579e-04f, +2.434344664e-04f, +5.090289217e-04f, -5.658891074e-04f, -7.023597721e-04f, +1.126102485e-03f, +8.642142097e-04f, -2.079408200e-03f, -9.589428966e-04f, +3.893927662e-03f, +1.122166887e-03f, -9.389627448e-03f, -1.037026947e-02f, +3.153775873e-03f, +1.210446776e-02f, +5.161453937e-03f, -3.712079088e-03f, -2.148822212e-03f, +2.240976259e-03f, +9.420521158e-04f, -1.479950966e-03f, -3.429465880e-04f, +9.520126834e-04f, +5.121857295e-05f, -5.678613416e-04f, +6.449991268e-05f, +3.016386006e-04f, -8.394987165e-05f, -1.346972455e-04f, +6.087609675e-05f, +4.452458790e-05f, -2.918207680e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.130236251e-05f, +8.206722976e-04f, -6.053476054e-04f, -2.765216605e-03f, +3.078512201e-03f, +4.594698336e-03f, -8.470668501e-03f, -4.266734511e-03f, +1.639351320e-02f, -8.335122396e-04f, -2.420758283e-02f, +1.195850312e-02f, +2.762606927e-02f, -2.734292839e-02f, -2.286560080e-02f, +4.210659724e-02f, +9.197795807e-03f, -5.026922227e-02f, +9.874878272e-03f, +4.791021895e-02f, -2.790186682e-02f, -3.549059409e-02f, +3.866079626e-02f, +1.774381359e-02f, -3.928621312e-02f, -1.148046030e-03f, +3.140142631e-02f, -9.381065360e-03f, -1.969296993e-02f, +1.251972831e-02f, +9.077648976e-03f, -1.027397451e-02f, -2.364134888e-03f, +6.028661535e-03f, -3.390314097e-04f, -2.457686621e-03f, +5.495793510e-04f, +5.147476454e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.124074400e-05f, -1.115783486e-05f, +1.063018892e-04f, -3.710236442e-05f, -2.475523674e-04f, +2.356512299e-04f, +3.567490754e-04f, -6.242969676e-04f, -2.762254699e-04f, +1.129728864e-03f, -1.404530410e-04f, -1.539475140e-03f, +9.073509170e-04f, +1.583345947e-03f, -1.833675941e-03f, -1.090802571e-03f, +2.574523496e-03f, +1.257620654e-04f, -2.799145988e-03f, +1.004480095e-03f, +2.379113140e-03f, -1.891470399e-03f, -1.470870997e-03f, +2.237092061e-03f, +4.330219789e-04f, -1.999881476e-03f, +3.682694225e-04f, +1.386912755e-03f, -7.385594970e-04f, -7.100137044e-04f, +7.122752061e-04f, +2.120215373e-04f, -4.740733165e-04f, +2.780137444e-05f, +2.206266656e-04f, -7.234479279e-05f, -4.452458790e-05f, +2.918207680e-05f, +0.000000000e+00f, + /* 9,26 (40) */ + +0.000000000e+00f, +9.938381493e-06f, -8.095144627e-04f, +2.467262831e-04f, +2.149794383e-03f, -1.231613644e-03f, -4.259902104e-03f, +3.638521892e-03f, +7.017487590e-03f, -8.404183010e-03f, -9.968134376e-03f, +1.678450626e-02f, +1.222393697e-02f, -3.077693842e-02f, -1.223393769e-02f, +5.498264540e-02f, +6.650918960e-03f, -1.069596252e-01f, +1.924693557e-02f, +3.811304387e-01f, +5.231862449e-01f, +2.429767073e-01f, -6.918422090e-02f, -7.586639489e-02f, +4.395512488e-02f, +3.462719530e-02f, -3.088903570e-02f, -1.594928017e-02f, +2.125066007e-02f, +6.355912334e-03f, -1.371263200e-02f, -1.635021573e-03f, +8.056595703e-03f, -2.874497542e-04f, -4.161196466e-03f, +7.143432204e-04f, +1.779511189e-03f, -5.050547631e-04f, -5.439297222e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.013510604e-05f, +1.330803346e-05f, -7.539296666e-05f, -1.583525942e-07f, +1.766308406e-04f, -6.264100433e-05f, -3.288347151e-04f, +2.193548295e-04f, +5.238263198e-04f, -5.289853368e-04f, -7.379142543e-04f, +1.074927910e-03f, +9.358397985e-04f, -2.012390064e-03f, -1.093705953e-03f, +3.799176006e-03f, +1.387489687e-03f, -9.109057526e-03f, -1.061100191e-02f, +2.677663862e-03f, +1.208088148e-02f, +5.516048760e-03f, -3.583790178e-03f, -2.312509799e-03f, +2.182005593e-03f, +1.043697592e-03f, -1.458333504e-03f, -4.081178602e-04f, +9.494042749e-04f, +9.090865714e-05f, -5.732573706e-04f, +4.265680927e-05f, +3.086443671e-04f, -7.369666498e-05f, -1.401941747e-04f, +5.722263853e-05f, +4.763336528e-05f, -2.857347147e-05f, +0.000000000e+00f, + +0.000000000e+00f, -9.938381493e-06f, +8.095144627e-04f, -4.990457162e-04f, -2.802318969e-03f, +2.830959834e-03f, +4.830349566e-03f, -8.113919425e-03f, -4.891031479e-03f, +1.611728773e-02f, +2.962166243e-04f, -2.434803587e-02f, +1.041902798e-02f, +2.853342018e-02f, -2.575958245e-02f, -2.469927675e-02f, +4.101579467e-02f, +1.177231930e-02f, -5.014346021e-02f, +7.075732284e-03f, +4.891469905e-02f, -2.552275368e-02f, -3.738206449e-02f, +3.718992526e-02f, +1.998090565e-02f, -3.885319114e-02f, -3.147927506e-03f, +3.176969573e-02f, -7.994152605e-03f, -2.043152942e-02f, +1.180971460e-02f, +9.789924182e-03f, -1.006195297e-02f, -2.838208205e-03f, +6.056462910e-03f, -1.184047442e-04f, -2.530031414e-03f, +5.050547631e-04f, +5.439297222e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.013510604e-05f, -1.330803346e-05f, +1.041465109e-04f, -2.692706094e-05f, -2.503732986e-04f, +2.154417879e-04f, +3.753040453e-04f, -5.989197119e-04f, -3.218946234e-04f, +1.114548639e-03f, -6.428265365e-05f, -1.556683522e-03f, +8.127554692e-04f, +1.651191985e-03f, -1.748058174e-03f, -1.211179078e-03f, +2.530363307e-03f, +2.785105402e-04f, -2.818174904e-03f, +8.553124615e-04f, +2.460308630e-03f, -1.781833104e-03f, -1.590122586e-03f, +2.186665243e-03f, +5.549808657e-04f, -2.004933884e-03f, +2.734999243e-04f, +1.425752763e-03f, -6.838301498e-04f, -7.563664866e-04f, +6.925574664e-04f, +2.474682509e-04f, -4.745718276e-04f, +8.936416261e-06f, +2.270093316e-04f, -6.614081253e-05f, -4.763336528e-05f, +2.857347147e-05f, +0.000000000e+00f, + /* 9,27 (40) */ + +0.000000000e+00f, +3.007348754e-05f, -7.962064292e-04f, +1.713333165e-04f, +2.149636030e-03f, -1.054982803e-03f, -4.322543108e-03f, +3.309687177e-03f, +7.236842420e-03f, -7.880356690e-03f, -1.049711971e-02f, +1.604659201e-02f, +1.329886488e-02f, -2.984109862e-02f, -1.424632776e-02f, +5.388893945e-02f, +1.045009497e-02f, -1.055721355e-01f, +1.013787804e-02f, +3.705194367e-01f, +5.258639088e-01f, +2.550575888e-01f, -6.366817214e-02f, -7.945018507e-02f, +4.164261508e-02f, +3.680920089e-02f, -2.984533810e-02f, -1.740761367e-02f, +2.084254221e-02f, +7.305316609e-03f, -1.362172334e-02f, -2.208278944e-03f, +8.099252512e-03f, +2.119461283e-05f, -4.234893131e-03f, +5.741490457e-04f, +1.836733827e-03f, -4.574213978e-04f, -5.725031937e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.899936450e-05f, +1.533790785e-05f, -7.357855293e-05f, -6.443829298e-06f, +1.755070633e-04f, -4.901761035e-05f, -3.317560647e-04f, +1.950841424e-04f, +5.368969955e-04f, -4.911943059e-04f, -7.708587210e-04f, +1.021560463e-03f, +1.003784947e-03f, -1.940946266e-03f, -1.223203506e-03f, +3.696239674e-03f, +1.642858602e-03f, -8.818554479e-03f, -1.083458553e-02f, +2.197023751e-03f, +1.203890744e-02f, +5.868346728e-03f, -3.443132409e-03f, -2.473012407e-03f, +2.116020483e-03f, +1.144060974e-03f, -1.432292819e-03f, -4.731572712e-04f, +9.440617580e-04f, +1.309993024e-04f, -5.770997631e-04f, +2.028160784e-05f, +3.148860417e-04f, -6.299774079e-05f, -1.453994474e-04f, +5.328832891e-05f, +5.068515312e-05f, -2.783727893e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.007348754e-05f, +7.962064292e-04f, -3.948992054e-04f, -2.829246030e-03f, +2.580586535e-03f, +5.045791354e-03f, -7.738615380e-03f, -5.489951191e-03f, +1.579539311e-02f, +1.410765263e-03f, -2.441231852e-02f, +8.862344454e-03f, +2.934617565e-02f, -2.410839046e-02f, -2.644733492e-02f, +3.980461559e-02f, +1.430268261e-02f, -4.986494967e-02f, +4.257557380e-03f, +4.977001151e-02f, -2.306244505e-02f, -3.916389760e-02f, +3.559980268e-02f, +2.216757090e-02f, -3.829821027e-02f, -5.152861390e-03f, +3.204319566e-02f, -6.568399842e-03f, -2.111535957e-02f, +1.105334812e-02f, +1.048248165e-02f, -9.814484717e-03f, -3.312780032e-03f, +6.065399326e-03f, +1.086045874e-04f, -2.596172226e-03f, +4.574213978e-04f, +5.725031937e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.899936450e-05f, -1.533790785e-05f, +1.016930039e-04f, -1.695180326e-05f, -2.523025512e-04f, +1.949655339e-04f, +3.923197286e-04f, -5.720639893e-04f, -3.659001780e-04f, +1.096077505e-03f, +1.125303696e-05f, -1.568895977e-03f, +7.164092911e-04f, +1.713467675e-03f, -1.657514825e-03f, -1.327289183e-03f, +2.478532739e-03f, +4.300846601e-04f, -2.828484546e-03f, +7.034738605e-04f, +2.534005390e-03f, -1.666412475e-03f, -1.704877822e-03f, +2.129209512e-03f, +6.759485959e-04f, -2.003772433e-03f, +1.770554280e-04f, +1.460509853e-03f, -6.263088608e-04f, -8.009387080e-04f, +6.703296232e-04f, +2.827311737e-04f, -4.735327339e-04f, -1.038686813e-05f, +2.327882978e-04f, -5.950795440e-05f, -5.068515312e-05f, +2.783727893e-05f, +0.000000000e+00f, + /* 9,28 (40) */ + +0.000000000e+00f, +4.907285204e-05f, -7.808685214e-04f, +9.775476354e-05f, +2.143192201e-03f, -8.794757402e-04f, -4.371560718e-03f, +2.977931112e-03f, +7.431926562e-03f, -7.343459695e-03f, -1.098831402e-02f, +1.527573329e-02f, +1.432042534e-02f, -2.883731368e-02f, -1.618727402e-02f, +5.266573594e-02f, +1.414633464e-02f, -1.039292769e-01f, +1.319323565e-03f, +3.596848512e-01f, +5.280609325e-01f, +2.670964963e-01f, -5.779982541e-02f, -8.289331748e-02f, +3.916960267e-02f, +3.892522138e-02f, -2.870127713e-02f, -1.883990649e-02f, +2.036938493e-02f, +8.249378367e-03f, -1.349072404e-02f, -2.785378707e-03f, +8.119534120e-03f, +3.360806545e-04f, -4.297890872e-03f, +4.287495982e-04f, +1.890022156e-03f, -4.067362447e-04f, -6.003404726e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.783913596e-05f, +1.724426288e-05f, -7.158682972e-05f, -1.254691095e-05f, +1.738917470e-04f, -3.553783943e-05f, -3.336701967e-04f, +1.706955005e-04f, +5.482325946e-04f, -4.526367213e-04f, -8.011412946e-04f, +9.661812678e-04f, +1.067919359e-03f, -1.865339109e-03f, -1.347181810e-03f, +3.585531680e-03f, +1.887915150e-03f, -8.518771646e-03f, -1.104073040e-02f, +1.712666080e-03f, +1.197847955e-02f, +6.217635905e-03f, -3.290183488e-03f, -2.629851781e-03f, +2.043083219e-03f, +1.242845318e-03f, -1.401833611e-03f, -5.378792310e-04f, +9.359571487e-04f, +1.713818723e-04f, -5.793505348e-04f, -2.569795609e-06f, +3.203299372e-04f, -5.187593367e-05f, -1.502899857e-04f, +4.907838704e-05f, +5.366786361e-05f, -2.697179213e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.907285204e-05f, +7.808685214e-04f, -2.932062015e-04f, -2.846197833e-03f, +2.328283984e-03f, +5.240756887e-03f, -7.346295651e-03f, -6.062015180e-03f, +1.542949293e-02f, +2.506842768e-03f, -2.440106548e-02f, +7.293448477e-03f, +3.006258494e-02f, -2.239492279e-02f, -2.810484974e-02f, +3.847732640e-02f, +1.678121535e-02f, -4.943486501e-02f, +1.429072834e-03f, +5.047348537e-02f, -2.052843966e-02f, -4.083031007e-02f, +3.389492485e-02f, +2.429678041e-02f, -3.762226168e-02f, -7.156633823e-03f, +3.222025109e-02f, -5.107889989e-03f, -2.174166843e-02f, +1.025240941e-02f, +1.115281127e-02f, -9.531753544e-03f, -3.786312766e-03f, +6.055012458e-03f, +3.413928852e-04f, -2.655680181e-03f, +4.067362447e-04f, +6.003404726e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.783913596e-05f, -1.724426288e-05f, +9.896008361e-05f, -7.206093704e-06f, -2.533547466e-04f, +1.742957362e-04f, +4.077687376e-04f, -5.438400155e-04f, -4.081250930e-04f, +1.074415005e-03f, +8.592225231e-05f, -1.576121102e-03f, +6.186289941e-04f, +1.770015613e-03f, -1.562356451e-03f, -1.438788586e-03f, +2.419218187e-03f, +5.800135591e-04f, -2.830050922e-03f, +5.494381966e-04f, +2.599963312e-03f, -1.545555799e-03f, -1.814760920e-03f, +2.064871998e-03f, +7.955384059e-04f, -1.996355930e-03f, +7.922725540e-05f, +1.491032742e-03f, -5.661476899e-04f, -8.435634077e-04f, +6.456264225e-04f, +3.176913299e-04f, -4.709297982e-04f, -3.011285216e-05f, +2.379279690e-04f, -5.245783240e-05f, -5.366786361e-05f, +2.697179213e-05f, +0.000000000e+00f, + /* 9,29 (40) */ + +0.000000000e+00f, +6.691198800e-05f, -7.636242585e-04f, +2.616793381e-05f, +2.130645290e-03f, -7.055839932e-04f, -4.407098558e-03f, +2.644260916e-03f, +7.602622062e-03f, -6.795227100e-03f, -1.144095074e-02f, +1.447459199e-02f, +1.528660661e-02f, -2.776939432e-02f, -1.805261313e-02f, +5.131855413e-02f, +1.773186632e-02f, -1.020413617e-01f, -7.199448081e-03f, +3.486441208e-01f, +5.297735986e-01f, +2.790749758e-01f, -5.158218950e-02f, -8.618350097e-02f, +3.653975089e-02f, +4.096830459e-02f, -2.745843181e-02f, -2.024174010e-02f, +1.983150570e-02f, +9.185335516e-03f, -1.331934216e-02f, -3.364729242e-03f, +8.116964324e-03f, +6.564105917e-04f, -4.349766805e-03f, +2.784596125e-04f, +1.939100543e-03f, -3.530683810e-04f, -6.273122648e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.665995399e-05f, +1.902443446e-05f, -6.942925435e-05f, -1.845322694e-05f, +1.718008233e-04f, -2.223852773e-05f, -3.345906660e-04f, +1.462610725e-04f, +5.578298758e-04f, -4.134335714e-04f, -8.287183510e-04f, +9.089743302e-04f, +1.128125071e-03f, -1.785838056e-03f, -1.465405375e-03f, +3.467476865e-03f, +2.122327652e-03f, -8.210375133e-03f, -1.122918129e-02f, +1.225409024e-03f, +1.189956727e-02f, +6.563203266e-03f, -3.125049664e-03f, -2.782550855e-03f, +1.963275518e-03f, +1.339753471e-03f, -1.366972949e-03f, -6.020962355e-04f, +9.250699226e-04f, +2.119451354e-04f, -5.799757153e-04f, -2.583908748e-05f, +3.249441212e-04f, -4.035585483e-05f, -1.548431800e-04f, +4.459906621e-05f, +5.656931007e-05f, -2.597573519e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.691198800e-05f, +7.636242585e-04f, -1.942461179e-04f, -2.853403927e-03f, +2.074929238e-03f, +5.415052624e-03f, -6.938526914e-03f, -6.605855196e-03f, +1.502136784e-02f, +3.581257773e-03f, -2.431514323e-02f, +5.717327375e-03f, +3.068121394e-02f, -2.062490717e-02f, -2.966720620e-02f, +3.703853782e-02f, +1.920043354e-02f, -4.885485145e-02f, -1.400978088e-03f, +5.102292356e-02f, -1.792847634e-02f, -4.237586587e-02f, +3.208016393e-02f, +2.636165241e-02f, -3.682672327e-02f, -9.152989753e-03f, +3.229947834e-02f, -3.616857248e-03f, -2.230781612e-02f, +9.408846001e-03f, +1.179843769e-02f, -9.214062214e-03f, -4.257242564e-03f, +6.024899606e-03f, +5.793208542e-04f, -2.708138013e-03f, +3.530683810e-04f, +6.273122648e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.665995399e-05f, -1.902443446e-05f, +9.596697517e-05f, +2.282161354e-06f, -2.535472158e-04f, +1.535048423e-04f, +4.216293789e-04f, -5.143607579e-04f, -4.484597407e-04f, +1.049669748e-03f, +1.594984803e-04f, -1.578383327e-03f, +5.197332231e-04f, +1.820697626e-03f, -1.462906510e-03f, -1.545349051e-03f, +2.352629094e-03f, +7.278325354e-04f, -2.822877675e-03f, +3.936863883e-04f, +2.657966449e-03f, -1.419628401e-03f, -1.919410225e-03f, +1.993822389e-03f, +9.133656519e-04f, -1.982662889e-03f, -1.968637598e-05f, +1.517182323e-03f, -5.035089837e-04f, -8.840778467e-04f, +6.184912964e-04f, +3.522287850e-04f, -4.667416090e-04f, -5.018332352e-05f, +2.423941790e-04f, -4.500395056e-05f, -5.656931007e-05f, +2.597573519e-05f, +0.000000000e+00f, + /* 9,30 (40) */ + +0.000000000e+00f, +8.357194200e-05f, -7.445998240e-04f, -4.326132053e-05f, +2.112192063e-03f, -5.337831700e-04f, -4.429337085e-03f, +2.309670250e-03f, +7.748883135e-03f, -6.237397224e-03f, -1.185438431e-02f, +1.364587364e-02f, +1.619558094e-02f, -2.664126924e-02f, -1.983845119e-02f, +4.985314876e-02f, +2.119934318e-02f, -9.991903408e-02f, -1.540982321e-02f, +3.374149395e-01f, +5.309990076e-01f, +2.909745431e-01f, -4.501898624e-02f, -8.930855063e-02f, +3.375720004e-02f, +4.293158011e-02f, -2.611867834e-02f, -2.160871305e-02f, +1.922940947e-02f, +1.011040544e-02f, -1.310739703e-02f, -3.944704957e-03f, +8.091125237e-03f, +9.813547128e-04f, -4.390122660e-03f, +1.236164325e-04f, +1.983699609e-03f, -2.964990710e-04f, -6.532880000e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.546725007e-05f, +2.067628486e-05f, -6.711753041e-05f, -2.414937287e-05f, +1.692513351e-04f, -9.155233045e-06f, -3.345337019e-04f, +1.218519049e-04f, +5.656906386e-04f, -3.737057772e-04f, -8.535545205e-04f, +8.501259890e-04f, +1.184296597e-03f, -1.702718913e-03f, -1.577657299e-03f, +3.342510736e-03f, +2.345791698e-03f, -7.894042301e-03f, -1.139971809e-02f, +7.360767122e-04f, +1.180217583e-02f, +6.904336239e-03f, -2.947865806e-03f, -2.930634935e-03f, +1.876698597e-03f, +1.434488871e-03f, -1.327740406e-03f, -6.656193674e-04f, +9.113871867e-04f, +2.525755473e-04f, -5.789455142e-04f, -4.946566872e-05f, +3.286985463e-04f, -2.846385128e-05f, -1.590369716e-04f, +3.985765772e-05f, +5.937724690e-05f, -2.484828019e-05f, +0.000000000e+00f, + +0.000000000e+00f, -8.357194200e-05f, +7.445998240e-04f, -9.827914271e-05f, -2.851121766e-03f, +1.821382022e-03f, +5.568557466e-03f, -6.516897535e-03f, -7.120215954e-03f, +1.457290810e-02f, +4.630927521e-03f, -2.415564475e-02f, +4.138944048e-03f, +3.120094716e-02f, -1.880420955e-02f, -3.113011271e-02f, +3.549318877e-02f, +2.155306263e-02f, -4.812701891e-02f, -4.223855762e-03f, +5.141660995e-02f, -1.527050990e-02f, -4.379549427e-02f, +3.016075371e-02f, +2.835547480e-02f, -3.591335762e-02f, -1.113565264e-02f, +3.227979197e-02f, -2.099674924e-03f, -2.281132511e-02f, +8.524768155e-03f, +1.241692899e-02f, -8.861833429e-03f, -4.723984173e-03f, +5.974716282e-03f, +8.217150332e-04f, -2.753141964e-03f, +2.964990710e-04f, +6.532880000e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.546725007e-05f, -2.067628486e-05f, +9.273332497e-05f, +1.148671485e-05f, -2.528998792e-04f, +1.326642441e-04f, +4.338856277e-04f, -4.837415165e-04f, -4.868021676e-04f, +1.021958948e-03f, +2.317611561e-04f, -1.575722699e-03f, +4.200416145e-04f, +1.865395081e-03f, -1.359500260e-03f, -1.646659396e-03f, +2.278997210e-03f, +8.730845232e-04f, -2.806996037e-03f, +2.367048336e-04f, +2.707823740e-03f, -1.289012509e-03f, -2.018479416e-03f, +1.916252486e-03f, +1.029049061e-03f, -1.962691735e-03f, -1.193812653e-04f, +1.538832243e-03f, -4.385649540e-04f, -9.223241014e-04f, +5.889763422e-04f, +3.862230372e-04f, -4.609517421e-04f, -7.053763744e-05f, +2.461543489e-04f, -3.716170056e-05f, -5.937724690e-05f, +2.484828019e-05f, +0.000000000e+00f, + /* 9,31 (40) */ + +0.000000000e+00f, +9.903919207e-05f, -7.239235392e-04f, -1.103788509e-04f, +2.088042690e-03f, -3.645318349e-04f, -4.438492318e-03f, +1.975136548e-03f, +7.870735040e-03f, -5.671706586e-03f, -1.222809009e-02f, +1.279231912e-02f, +1.704570693e-02f, -2.545697265e-02f, -2.154117010e-02f, +4.827549146e-02f, +2.454185392e-02f, -9.757324238e-02f, -2.330386552e-02f, +3.260152214e-01f, +5.317350843e-01f, +3.027767189e-01f, -3.811465000e-02f, -9.225641644e-02f, +3.082656510e-02f, +4.480827871e-02f, -2.468418947e-02f, -2.293645346e-02f, +1.856379010e-02f, +1.102179262e-02f, -1.285482148e-02f, -4.523650471e-03f, +8.041659568e-03f, +1.310053259e-03f, -4.418586511e-03f, -3.542053911e-05f, +2.023557267e-03f, -2.371218241e-04f, -6.781362801e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.426633530e-05f, +2.219819630e-05f, -6.466356242e-05f, -2.962293171e-05f, +1.662613606e-04f, +3.677848260e-06f, -3.335181116e-04f, +9.753773237e-05f, +5.718216365e-04f, -3.335738481e-04f, -8.756226649e-04f, +7.898243641e-04f, +1.236341038e-03f, -1.616263007e-03f, -1.683739550e-03f, +3.211078300e-03f, +2.558030536e-03f, -7.570460241e-03f, -1.155215612e-02f, +2.454975392e-04f, +1.168634640e-02f, +7.240324242e-03f, -2.758795409e-03f, -3.073632881e-03f, +1.783473198e-03f, +1.526756362e-03f, -1.284178155e-03f, -7.282588089e-04f, +8.949038318e-04f, +2.931575445e-04f, -5.762344780e-04f, -7.338679611e-05f, +3.315651769e-04f, -1.622795872e-05f, -1.628499352e-04f, +3.486249123e-05f, +6.207941071e-05f, -2.358906275e-05f, +0.000000000e+00f, + +0.000000000e+00f, -9.903919207e-05f, +7.239235392e-04f, -5.545817737e-06f, -2.839635051e-03f, +1.568482143e-03f, +5.701221710e-03f, -6.083011907e-03f, -7.603957470e-03f, +1.408610593e-02f, +5.652886470e-03f, -2.392388360e-02f, +2.563221349e-03f, +3.162098877e-02f, -1.693881447e-02f, -3.248961297e-02f, +3.384652937e-02f, +2.383205984e-02f, -4.725393439e-02f, -7.030851800e-03f, +5.165331479e-02f, -1.256268616e-02f, -4.508450678e-02f, +2.814227429e-02f, +3.027172728e-02f, -3.488430856e-02f, -1.309834438e-02f, +3.216041070e-02f, -5.608426814e-04f, -2.324989006e-02f, +7.602444053e-03f, +1.300590533e-02f, -8.475610392e-03f, -5.184935915e-03f, +5.904178645e-03f, +1.067869382e-03f, -2.790303664e-03f, +2.371218241e-04f, +6.781362801e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.426633530e-05f, -2.219819630e-05f, +8.927911243e-05f, +2.038303472e-05f, -2.514351183e-04f, +1.118440529e-04f, +4.445270837e-04f, -4.520995028e-04f, -5.230583249e-04f, +9.914079357e-04f, +3.024963154e-04f, -1.568194600e-03f, +3.198737579e-04f, +1.904009142e-03f, -1.252483614e-03f, -1.742426403e-03f, +2.198575782e-03f, +1.015321536e-03f, -2.782464711e-03f, +7.898385675e-05f, +2.749369645e-03f, -1.154106075e-03f, -2.111638671e-03f, +1.832375687e-03f, +1.142211979e-03f, -1.936460947e-03f, -2.195481678e-04f, +1.555869431e-03f, -3.714972203e-04f, -9.581496479e-04f, +5.571422708e-04f, +4.195534187e-04f, -4.535489080e-04f, -9.111288168e-05f, +2.491776424e-04f, -2.894835191e-05f, -6.207941071e-05f, +2.358906275e-05f, +0.000000000e+00f, + /* 10, 0 (36) */ + +0.000000000e+00f, -7.608322579e-04f, +1.118776550e-03f, +1.378251293e-03f, -3.996866387e-03f, -8.778420085e-05f, +8.463162654e-03f, -5.917369532e-03f, -1.170469082e-02f, +1.883055804e-02f, +7.720230922e-03f, -3.819223843e-02f, +1.284965533e-02f, +5.985703519e-02f, -6.898457622e-02f, -7.711293861e-02f, +3.046497488e-01f, +5.837128805e-01f, +3.046497488e-01f, -7.711293861e-02f, -6.898457622e-02f, +5.985703519e-02f, +1.284965533e-02f, -3.819223843e-02f, +7.720230922e-03f, +1.883055804e-02f, -1.170469082e-02f, -5.917369532e-03f, +8.463162654e-03f, -8.778420085e-05f, -3.996866387e-03f, +1.378251293e-03f, +1.118776550e-03f, -7.608322579e-04f, -9.130911868e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.914139316e-06f, -8.632770721e-05f, +1.073408404e-04f, +1.219837312e-04f, -3.461666226e-04f, +1.909220717e-05f, +6.649921034e-04f, -5.234066115e-04f, -8.276106219e-04f, +1.503726322e-03f, +4.097045852e-04f, -2.925685177e-03f, +1.241257195e-03f, +4.870434080e-03f, -6.086218167e-03f, -1.443571605e-02f, -3.244813960e-04f, +1.433462083e-02f, +6.555138706e-03f, -4.756606318e-03f, -1.468651897e-03f, +2.936223164e-03f, -2.877461347e-04f, -1.556214796e-03f, +7.783702355e-04f, +5.731263495e-04f, -6.578340876e-04f, -4.876331166e-05f, +3.545617704e-04f, -1.110089722e-04f, -1.155219012e-04f, +8.517375766e-05f, +9.239896990e-06f, -2.461555001e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.608322579e-04f, -1.118776550e-03f, -1.032757977e-03f, +5.537963620e-03f, -3.277985306e-03f, -8.278225430e-03f, +1.383882521e-02f, +1.771302895e-03f, -2.355345110e-02f, +1.719759611e-02f, +1.895372978e-02f, -3.796855404e-02f, +5.697284657e-03f, +4.123561278e-02f, -3.721413273e-02f, -1.801118074e-02f, +5.173229864e-02f, -1.801118074e-02f, -3.721413273e-02f, +4.123561278e-02f, +5.697284657e-03f, -3.796855404e-02f, +1.895372978e-02f, +1.719759611e-02f, -2.355345110e-02f, +1.771302895e-03f, +1.383882521e-02f, -8.278225430e-03f, -3.277985306e-03f, +5.537963620e-03f, -1.032757977e-03f, -1.549282673e-03f, +7.608322579e-04f, +9.130911868e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.914139316e-06f, +8.632770721e-05f, -1.783547172e-04f, -6.543241704e-05f, +4.910517381e-04f, -3.801515912e-04f, -5.372059098e-04f, +1.157186281e-03f, -1.982043651e-04f, -1.547251752e-03f, +1.594954770e-03f, +7.330013445e-04f, -2.601260275e-03f, +1.166260110e-03f, +2.082984900e-03f, -2.839630915e-03f, -9.467771006e-05f, +2.909566064e-03f, -1.952337783e-03f, -1.322643785e-03f, +2.595171601e-03f, -5.983288007e-04f, -1.679199776e-03f, +1.499902243e-03f, +2.884034970e-04f, -1.180697021e-03f, +4.941452697e-04f, +4.191009431e-04f, -4.896739099e-04f, +4.546527100e-05f, +1.883368647e-04f, -1.024473576e-04f, -9.239896990e-06f, +2.461555001e-05f, +0.000000000e+00f, + /* 10, 1 (36) */ + +0.000000000e+00f, -7.667463972e-04f, +1.032448843e-03f, +1.485592133e-03f, -3.874882656e-03f, -4.339508234e-04f, +8.482254862e-03f, -5.252377428e-03f, -1.222809744e-02f, +1.800294742e-02f, +9.223957244e-03f, -3.778253385e-02f, +9.923970151e-03f, +6.109829238e-02f, -6.411414215e-02f, -8.319915678e-02f, +2.902140328e-01f, +5.833883991e-01f, +3.189843696e-01f, -7.055779991e-02f, -7.374118254e-02f, +5.838838329e-02f, +1.578587849e-02f, -3.847998457e-02f, +6.164016126e-03f, +1.960892828e-02f, -1.113156447e-02f, -6.575203619e-03f, +8.414399343e-03f, +2.667775696e-04f, -4.107875360e-03f, +1.262729392e-03f, +1.203950308e-03f, -7.515923609e-04f, -1.159246687e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.695957155e-06f, -8.711737723e-05f, +9.900148872e-05f, +1.322531958e-04f, -3.367573684e-04f, -1.003082804e-05f, +6.697485541e-04f, -4.728222327e-04f, -8.732128755e-04f, +1.447121671e-03f, +5.282028638e-04f, -2.905747658e-03f, +1.014382450e-03f, +4.966345222e-03f, -5.615323730e-03f, -1.450999957e-02f, -9.727815458e-04f, +1.420671412e-02f, +7.020957778e-03f, -4.624788907e-03f, -1.695851340e-03f, +2.937157559e-03f, -1.626761686e-04f, -1.604338211e-03f, +7.255967097e-04f, +6.217933644e-04f, -6.482531711e-04f, -7.888847102e-05f, +3.618896117e-04f, -9.935192578e-05f, -1.235090111e-04f, +8.364854408e-05f, +1.266265802e-05f, -2.561579456e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.667463972e-04f, -1.032448843e-03f, -1.211112694e-03f, +5.472531203e-03f, -2.786933568e-03f, -8.658377021e-03f, +1.330161930e-02f, +2.928489176e-03f, -2.375165546e-02f, +1.565034436e-02f, +2.054868455e-02f, -3.723555270e-02f, +3.096024382e-03f, +4.240187289e-02f, -3.513114783e-02f, -2.085081165e-02f, +5.163762093e-02f, -1.510161467e-02f, -3.916647051e-02f, +3.991296900e-02f, +8.292456257e-03f, -3.856688284e-02f, +1.727453001e-02f, +1.869749835e-02f, -2.326504760e-02f, +5.906058744e-04f, +1.433297048e-02f, -7.859124487e-03f, -3.767659216e-03f, +5.583428891e-03f, -8.444211122e-04f, -1.651730030e-03f, +7.515923609e-04f, +1.159246687e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.695957155e-06f, +8.711737723e-05f, -1.679480372e-04f, -8.462796079e-05f, +4.905006326e-04f, -3.404933445e-04f, -5.775260078e-04f, +1.129665192e-03f, -1.083713075e-04f, -1.588342783e-03f, +1.505522069e-03f, +8.639878579e-04f, -2.597677261e-03f, +1.006217692e-03f, +2.205556864e-03f, -2.759282259e-03f, -2.836783930e-04f, +2.968811143e-03f, -1.814083871e-03f, -1.474765034e-03f, +2.579379779e-03f, -4.604535010e-04f, -1.757891766e-03f, +1.446409830e-03f, +3.786266502e-04f, -1.200049301e-03f, +4.484675188e-04f, +4.571734157e-04f, -4.863304728e-04f, +2.478992676e-05f, +1.978385212e-04f, -9.952780372e-05f, -1.266265802e-05f, +2.561579456e-05f, +0.000000000e+00f, + /* 10, 2 (36) */ + +0.000000000e+00f, -7.694423543e-04f, +9.453314657e-04f, +1.584593622e-03f, -3.742629460e-03f, -7.707081919e-04f, +8.472224034e-03f, -4.582628874e-03f, -1.270091967e-02f, +1.712973454e-02f, +1.067107892e-02f, -3.725433098e-02f, +7.018222492e-03f, +6.211267483e-02f, -5.914779692e-02f, -8.881448051e-02f, +2.757040332e-01f, +5.824156176e-01f, +3.331910838e-01f, -6.353684213e-02f, -7.836597145e-02f, +5.669253195e-02f, +1.872303605e-02f, -3.864266074e-02f, +4.559677915e-03f, +2.033452499e-02f, -1.050977111e-02f, -7.223456790e-03f, +8.335510872e-03f, +6.286671812e-04f, -4.207227285e-03f, +1.139220381e-03f, +1.287598852e-03f, -7.389297029e-04f, -1.415404632e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.048843568e-07f, -8.755099897e-05f, +9.053917835e-05f, +1.417974878e-04f, -3.263896975e-04f, -3.851558106e-05f, +6.721327113e-04f, -4.215609389e-04f, -9.150860880e-04f, +1.386659325e-03f, +6.429094186e-04f, -2.876641169e-03f, +7.887284655e-04f, +5.044459890e-03f, -5.143574865e-03f, -1.455753372e-02f, -1.619095412e-03f, +1.405205896e-02f, +7.482542598e-03f, -4.474956746e-03f, -1.922127813e-03f, +2.928311885e-03f, -3.485957021e-05f, -1.647858294e-03f, +6.694089971e-04f, +6.692198707e-04f, -6.362361767e-04f, -1.093701351e-04f, +3.680996854e-04f, -8.703871292e-05f, -1.312663145e-04f, +8.174639255e-05f, +1.617106558e-05f, -2.653772083e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.694423543e-04f, -9.453314657e-04f, -1.379060731e-03f, +5.387903242e-03f, -2.296432935e-03f, -8.998870366e-03f, +1.272409329e-02f, +4.058154368e-03f, -2.386002677e-02f, +1.406200157e-02f, +2.205420662e-02f, -3.637156484e-02f, +4.983471210e-04f, +4.340809058e-02f, -3.292559096e-02f, -2.361009391e-02f, +5.135394254e-02f, -1.213280353e-02f, -4.098055438e-02f, +3.843820396e-02f, +1.087183604e-02f, -3.902733634e-02f, +1.551663824e-02f, +2.014390818e-02f, -2.288642095e-02f, -6.094434262e-04f, +1.478143799e-02f, -7.401951071e-03f, -4.253989689e-03f, +5.608218818e-03f, -6.465825911e-04f, -1.751257834e-03f, +7.389297029e-04f, +1.415404632e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.048843568e-07f, +8.755099897e-05f, -1.571730812e-04f, -1.029932155e-04f, +4.880643032e-04f, -3.002939445e-04f, -6.149948290e-04f, +1.098295382e-03f, -1.924088598e-05f, -1.623084914e-03f, +1.411283666e-03f, +9.908224858e-04f, -2.584490563e-03f, +8.431315882e-04f, +2.319617192e-03f, -2.668835727e-03f, -4.716162238e-04f, +3.017129766e-03f, -1.668721691e-03f, -1.622033927e-03f, +2.553890217e-03f, -3.198743867e-04f, -1.830683648e-03f, +1.386915047e-03f, +4.685275682e-04f, -1.215109297e-03f, +4.003084851e-04f, +4.942014676e-04f, -4.809920841e-04f, +3.474341315e-06f, +2.068042874e-04f, -9.605047892e-05f, -1.617106558e-05f, +2.653772083e-05f, +0.000000000e+00f, + /* 10, 3 (36) */ + +0.000000000e+00f, -7.690374700e-04f, +8.577804668e-04f, +1.675132800e-03f, -3.600831973e-03f, -1.097097889e-03f, +8.433708453e-03f, -3.910496163e-03f, -1.312248061e-02f, +1.621464846e-02f, +1.205773824e-02f, -3.661142156e-02f, +4.141581323e-03f, +6.290140330e-02f, -5.410333703e-02f, -9.395805537e-02f, +2.611464995e-01f, +5.807965222e-01f, +3.472431427e-01f, -5.605429953e-02f, -8.284092820e-02f, +5.477040414e-02f, +2.165134794e-02f, -3.867752031e-02f, +2.911819621e-03f, +2.100393398e-02f, -9.840551239e-03f, -7.859692967e-03f, +8.226140737e-03f, +9.967668667e-04f, -4.294265998e-03f, +1.007954066e-03f, +1.369345244e-03f, -7.227586373e-04f, -1.680781841e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.379445362e-06f, -8.763798329e-05f, +8.198878583e-05f, +1.505998611e-04f, -3.151215343e-04f, -6.627588767e-05f, +6.721815354e-04f, -3.698094587e-04f, -9.531535107e-04f, +1.322606356e-03f, +7.535106118e-04f, -2.838621625e-03f, +5.649797821e-04f, +5.104944408e-03f, -4.672080105e-03f, -1.457844287e-02f, -2.262104276e-03f, +1.387078132e-02f, +7.938758087e-03f, -4.307133336e-03f, -2.146743094e-03f, +2.909538260e-03f, +9.532349545e-05f, -1.686548354e-03f, +6.099398339e-04f, +7.152190423e-04f, -6.217782838e-04f, -1.401075016e-04f, +3.731445150e-04f, -7.409854095e-05f, -1.387578968e-04f, +7.946299958e-05f, +1.975300466e-05f, -2.737325389e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.690374700e-04f, -8.577804668e-04f, -1.536233813e-03f, +5.284910027e-03f, -1.808368632e-03f, -9.299164310e-03f, +1.210909846e-02f, +5.156449751e-03f, -2.387926765e-02f, +1.243891666e-02f, +2.346549029e-02f, -3.538074236e-02f, -2.086143442e-03f, +4.425122217e-02f, -3.060597377e-02f, -2.627892964e-02f, +5.088232632e-02f, -9.115673763e-03f, -4.264927607e-02f, +3.681617003e-02f, +1.342572625e-02f, -3.934721073e-02f, +1.368595459e-02f, +2.153082323e-02f, -2.241789338e-02f, -1.824552723e-03f, +1.518174648e-02f, -6.907749604e-03f, -4.734981773e-03f, +5.611693159e-03f, -4.397783037e-04f, -1.847308313e-03f, +7.227586373e-04f, +1.680781841e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.379445362e-06f, +8.763798329e-05f, -1.460861484e-04f, -1.204743522e-04f, +4.837931722e-04f, -2.597202162e-04f, -6.495145785e-04f, +1.063251170e-03f, +6.885707847e-05f, -1.651412983e-03f, +1.312636598e-03f, +1.113058466e-03f, -2.561804269e-03f, +6.776258297e-04f, +2.424762866e-03f, -2.568644751e-03f, -6.577871599e-04f, +3.054326685e-03f, -1.516778097e-03f, -1.763876605e-03f, +2.518745368e-03f, -1.771042394e-04f, -1.897248067e-03f, +1.321583081e-03f, +5.577571095e-04f, -1.225758205e-03f, +3.498160386e-04f, +5.300186960e-04f, -4.736370068e-04f, -1.840916351e-05f, +2.151795872e-04f, -9.201197506e-05f, -1.975300466e-05f, +2.737325389e-05f, +0.000000000e+00f, + /* 10, 4 (36) */ + +0.000000000e+00f, -7.656580246e-04f, +7.701424835e-04f, +1.757121586e-03f, -3.450232112e-03f, -1.412219424e-03f, +8.367432565e-03f, -3.238314627e-03f, -1.349229007e-02f, +1.526149494e-02f, +1.338034460e-02f, -3.585791095e-02f, +1.302959698e-03f, +6.346638308e-02f, -4.899839262e-02f, -9.863013548e-02f, +2.465680566e-01f, +5.785344179e-01f, +3.611139240e-01f, -4.811554144e-02f, -8.714806153e-02f, +5.262366104e-02f, +2.456088620e-02f, -3.858219681e-02f, +1.225271268e-03f, +2.161387382e-02f, -9.125332197e-03f, -8.481471251e-03f, +8.086033235e-03f, +1.369911382e-03f, -4.368364539e-03f, +8.691961692e-04f, +1.448808244e-03f, -7.030056326e-04f, -1.954514380e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.219625487e-06f, -8.738885041e-05f, +7.338460892e-05f, +1.586466923e-04f, -3.030127815e-04f, -9.322986019e-05f, +6.699394056e-04f, -3.177528972e-04f, -9.873525818e-04f, +1.255237391e-03f, +8.597114582e-04f, -2.791969079e-03f, +3.438028954e-04f, +5.148010231e-03f, -4.201934253e-03f, -1.457291283e-02f, -2.900497611e-03f, +1.366307007e-02f, +8.388469819e-03f, -4.121391341e-03f, -2.368950490e-03f, +2.880718331e-03f, +2.274785910e-04f, -1.720194238e-03f, +5.473355139e-04f, +7.596056841e-04f, -6.048831993e-04f, -1.709968175e-04f, +3.769798469e-04f, -6.056366392e-05f, -1.459479235e-04f, +7.679548794e-05f, +2.339563256e-05f, -2.811445097e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.656580246e-04f, -7.701424835e-04f, -1.682319961e-03f, +5.164435675e-03f, -1.324575460e-03f, -9.558884527e-03f, +1.145958388e-02f, +6.219700920e-03f, -2.381041058e-02f, +1.078750368e-02f, +2.477812689e-02f, -3.426768389e-02f, -4.647947712e-03f, +4.492884800e-02f, -2.818121091e-02f, -2.884757439e-02f, +5.022453916e-02f, -6.061347078e-03f, -4.416605417e-02f, +3.505229343e-02f, +1.594447162e-02f, -3.952431497e-02f, +1.178870653e-02f, +2.285240631e-02f, -2.186013627e-02f, -3.050310928e-03f, +1.553156252e-02f, -6.377730908e-03f, -5.208618780e-03f, +5.593283996e-03f, -2.245987165e-04f, -1.939320288e-03f, +7.030056326e-04f, +1.954514380e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.219625487e-06f, +8.738885041e-05f, -1.347433312e-04f, -1.370225164e-04f, +4.777440308e-04f, -2.189374102e-04f, -6.810005888e-04f, +1.024718709e-03f, +1.556007156e-04f, -1.673287075e-03f, +1.209991291e-03f, +1.230269716e-03f, -2.529757947e-03f, +5.103309886e-04f, +2.520625783e-03f, -2.459099157e-03f, -8.414939287e-04f, +3.080248590e-03f, -1.358806323e-03f, -1.899737561e-03f, +2.474024768e-03f, -3.266778794e-05f, -1.957278847e-03f, +1.250603378e-03f, +6.459645926e-04f, -1.231892916e-03f, +2.971496820e-04f, +5.644605407e-04f, -4.642513548e-04f, -4.078411243e-05f, +2.229109352e-04f, -8.741141862e-05f, -2.339563256e-05f, +2.811445097e-05f, +0.000000000e+00f, + /* 10, 5 (36) */ + +0.000000000e+00f, -7.594383991e-04f, +6.827536331e-04f, +1.830506195e-03f, -3.291585419e-03f, -1.715232205e-03f, +8.274202705e-03f, -2.568375222e-03f, -1.381004296e-02f, +1.427414236e-02f, +1.463558199e-02f, -3.499819949e-02f, -1.489009381e-03f, +6.381018598e-02f, -4.385038239e-02f, -1.028320697e-01f, +2.319951438e-01f, +5.756339203e-01f, +3.747769941e-01f, -3.972707162e-02f, -9.126945287e-02f, +5.025471055e-02f, +2.744160453e-02f, -3.835471822e-02f, -4.949229710e-04f, +2.216120933e-02f, -8.365726513e-03f, -9.086354450e-03f, +7.915036418e-03f, +1.746891229e-03f, -4.428928203e-03f, +7.232482457e-04f, +1.525603732e-03f, -6.796100001e-04f, -2.235658889e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.918174004e-06f, -8.681515683e-05f, +6.476024872e-05f, +1.659274605e-04f, -2.901250602e-04f, -1.193000958e-04f, +6.654578295e-04f, -2.655741250e-04f, -1.017634902e-03f, +1.184833580e-03f, +9.612362918e-04f, -2.736986459e-03f, +1.258445563e-04f, +5.173912764e-03f, -3.734215656e-03f, -1.454119011e-02f, -3.532976323e-03f, +1.342917682e-02f, +8.830546986e-03f, -3.917852994e-03f, -2.587996928e-03f, +2.841764127e-03f, +3.611980788e-04f, -1.748595268e-03f, +4.817556115e-04f, +8.021969079e-04f, -5.855633017e-04f, -2.019316964e-04f, +3.795648824e-04f, -4.646933020e-05f, -1.528007835e-04f, +7.374245794e-05f, +2.708541354e-05f, -2.875354420e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.594383991e-04f, -6.827536331e-04f, -1.817063292e-03f, +5.027413158e-03f, -8.468314290e-04f, -9.777821937e-03f, +1.077858329e-02f, +7.244419629e-03f, -2.365480986e-02f, +9.114216603e-03f, +2.598811818e-02f, -3.303741417e-02f, -7.177705658e-03f, +4.543917899e-02f, -2.566058512e-02f, -3.130667354e-02f, +4.938304523e-02f, -2.981098487e-03f, -4.552486049e-02f, +3.315255587e-02f, +1.841849639e-02f, -3.955698276e-02f, +9.831427680e-03f, +2.410300969e-02f, -2.121417168e-02f, -4.282203844e-03f, +1.582871220e-02f, -5.813270367e-03f, -5.672870134e-03f, +5.552499883e-03f, -1.687781361e-06f, -2.026731707e-03f, +6.796100001e-04f, +2.235658889e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.918174004e-06f, +8.681515683e-05f, -1.232002731e-04f, -1.525939204e-04f, +4.699796753e-04f, -1.781085629e-04f, -7.093814518e-04f, +9.828950914e-04f, +2.406772698e-04f, -1.688692430e-03f, +1.103769857e-03f, +1.342052330e-03f, -2.488525914e-03f, +3.418817327e-04f, +2.606874067e-03f, -2.340623620e-03f, -1.022048699e-03f, +3.094784748e-03f, -1.195383927e-03f, -2.029081848e-03f, +2.419844927e-03f, +1.129002439e-04f, -2.010492361e-03f, +1.174189137e-03f, +7.327991633e-04f, -1.233426639e-03f, +2.424800867e-04f, +5.973649916e-04f, -4.528293106e-04f, -6.357011090e-05f, +2.299462057e-04f, -8.225054997e-05f, -2.708541354e-05f, +2.875354420e-05f, +0.000000000e+00f, + /* 10, 6 (36) */ + +0.000000000e+00f, -7.505202251e-04f, +5.959384762e-04f, +1.895266444e-03f, -3.125657959e-03f, -2.005357265e-03f, +8.154902609e-03f, -1.902917392e-03f, -1.407561709e-02f, +1.325650746e-02f, +1.582041557e-02f, -3.403696320e-02f, -4.225995840e-03f, +6.393603053e-02f, -3.867646963e-02f, -1.065662854e-01f, +2.174539537e-01f, +5.721009440e-01f, +3.882061709e-01f, -3.089652464e-02f, -9.518730587e-02f, +4.766671363e-02f, +3.028336865e-02f, -3.799352014e-02f, -2.243518239e-03f, +2.264296494e-02f, -7.563529605e-03f, -9.671917752e-03f, +7.713104721e-03f, +2.126456111e-03f, -4.475397533e-03f, +5.704474622e-04f, +1.599346190e-03f, -6.525245865e-04f, -2.523194331e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.146869604e-05f, -8.592942003e-05f, +5.614849721e-05f, +1.724347159e-04f, -2.765214500e-04f, -1.444138644e-04f, +6.587951315e-04f, -2.134531864e-04f, -1.043966167e-03f, +1.111681544e-03f, +1.057829360e-03f, -2.673998238e-03f, -8.826984939e-05f, +5.182950086e-03f, -3.269983539e-03f, -1.448358090e-02f, -4.158255968e-03f, +1.316941546e-02f, +9.263865382e-03f, -3.696690383e-03f, -2.803125091e-03f, +2.792618837e-03f, +4.960622527e-04f, -1.771565127e-03f, +4.133726548e-04f, +8.428128131e-04f, -5.638397564e-04f, -2.328034518e-04f, +3.808625011e-04f, -3.185371746e-05f, -1.592812343e-04f, +7.030403398e-05f, +3.080815738e-05f, -2.928298365e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.505202251e-04f, -5.959384762e-04f, -1.940263565e-03f, +4.874819238e-03f, -3.768517537e-04f, -9.955930500e-03f, +1.006920184e-02f, +8.227314721e-03f, -2.341413259e-02f, +7.425524173e-03f, +2.709188803e-02f, -3.169536184e-02f, -9.666231573e-03f, +4.578106072e-02f, -2.305371106e-02f, -3.364729716e-02f, +4.836099653e-02f, +1.136862607e-04f, -4.672024442e-02f, +3.112347402e-02f, +2.083834132e-02f, -3.944408252e-02f, +7.820935319e-03f, +2.527719883e-02f, -2.048137252e-02f, -5.515630483e-03f, +1.607119229e-02f, -5.215905376e-03f, -6.125699445e-03f, +5.488929773e-03f, +2.282584243e-04f, -2.108982257e-03f, +6.525245865e-04f, +2.523194331e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.146869604e-05f, +8.592942003e-05f, -1.115119337e-04f, -1.671499120e-04f, +4.605685252e-04f, -1.373938764e-04f, -7.345990946e-04f, +9.379874212e-04f, +3.237842138e-04f, -1.697639239e-03f, +9.944043599e-04f, +1.448025975e-03f, -2.438316371e-03f, +1.729143738e-04f, +2.683213238e-03f, -2.213675986e-03f, -1.198775712e-03f, +3.097867476e-03f, -1.027110630e-03f, -2.151397215e-03f, +2.356359075e-03f, +2.590571425e-04f, -2.056628820e-03f, +1.092576711e-03f, +8.179111777e-04f, -1.230289469e-03f, +1.859885772e-04f, +6.285732982e-04f, -4.393733119e-04f, -8.668310176e-05f, +2.362349022e-04f, -7.653379225e-05f, -3.080815738e-05f, +2.928298365e-05f, +0.000000000e+00f, + /* 10, 7 (36) */ + +0.000000000e+00f, -7.390515291e-04f, +5.100090562e-04f, +1.951414941e-03f, -2.953223243e-03f, -2.281878715e-03f, +8.010488745e-03f, -1.244122261e-03f, -1.428907027e-02f, +1.221254129e-02f, +1.693209711e-02f, -3.297913384e-02f, -6.899994078e-03f, +6.384776068e-02f, -3.349351954e-02f, -1.098362689e-01f, +2.029703728e-01f, +5.679426880e-01f, +4.013755864e-01f, -2.163265925e-02f, -9.888399625e-02f, +4.486358854e-02f, +3.307598749e-02f, -3.749745789e-02f, -4.015083365e-03f, +2.305633760e-02f, -6.720716792e-03f, -1.023575751e-02f, +7.480301269e-03f, +2.507318612e-03f, -4.507251251e-03f, +4.111662279e-04f, +1.669650224e-03f, -6.217164291e-04f, -2.816024168e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.386565486e-05f, -8.474504102e-05f, +4.758123071e-05f, +1.781640366e-04f, -2.622662284e-04f, -1.685032771e-04f, +6.500161234e-04f, -1.615667266e-04f, -1.066326044e-03f, +1.036072332e-03f, +1.149255343e-03f, -2.603349068e-03f, -2.979378363e-04f, +5.175461552e-03f, -2.810275417e-03f, -1.440045004e-02f, -4.775069922e-03f, +1.288416172e-02f, +9.687310381e-03f, -3.458125588e-03f, -3.013575599e-03f, +2.733257492e-03f, +6.316405263e-04f, -1.788932731e-03f, +3.423717487e-04f, +8.812771671e-04f, -5.397426018e-04f, -2.635014452e-04f, +3.808394755e-04f, -1.675785505e-05f, -1.653545488e-04f, +6.648190592e-05f, +3.454906199e-05f, -2.969548071e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.390515291e-04f, -5.100090562e-04f, -2.051775499e-03f, +4.707669326e-03f, +8.371677150e-05f, -1.009332438e-02f, +9.334602745e-03f, +9.165302142e-03f, -2.309034838e-02f, +5.727884933e-03f, +2.808629239e-02f, -3.024733587e-02f, -1.210454794e-02f, +4.595397510e-02f, -2.037049782e-02f, -3.586097315e-02f, +4.716222082e-02f, +3.211553737e-03f, -4.774735505e-02f, +2.897207681e-02f, +2.319470039e-02f, -3.918502537e-02f, +5.764306499e-03f, +2.636977554e-02f, -1.966346134e-02f, -6.745919952e-03f, +1.625718086e-02f, -4.587332077e-03f, -6.565072757e-03f, +5.402246671e-03f, +4.644933266e-04f, -2.185516049e-03f, +6.217164291e-04f, +2.816024168e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.386565486e-05f, +8.474504102e-05f, -9.973236345e-05f, -1.806570197e-04f, +4.495842258e-04f, -9.695012096e-05f, -7.566088004e-04f, +8.902118581e-04f, +4.046303101e-04f, -1.700162350e-03f, +8.823350607e-04f, +1.547835191e-03f, -2.379370406e-03f, +4.064419775e-06f, +2.749387231e-03f, -2.078745462e-03f, -1.371013874e-03f, +3.089472453e-03f, -8.546060723e-04f, -2.266196171e-03f, +2.283756763e-03f, +4.052542535e-04f, -2.095453481e-03f, +1.006024907e-03f, +9.009535962e-04f, -1.222428889e-03f, +1.278665634e-04f, +6.579306774e-04f, -4.238942074e-04f, -1.100356434e-04f, +2.417284259e-04f, -7.026830925e-05f, -3.454906199e-05f, +2.969548071e-05f, +0.000000000e+00f, + /* 10, 8 (36) */ + +0.000000000e+00f, -7.251858742e-04f, +4.252640152e-04f, +1.998996172e-03f, -2.775059206e-03f, -2.544144944e-03f, +7.841985467e-03f, -5.941061375e-04f, -1.445063700e-02f, +1.114621525e-02f, +1.796816944e-02f, -3.182987850e-02f, -9.503343145e-03f, +6.354982285e-02f, -2.831805799e-02f, -1.126465443e-01f, +1.885699227e-01f, +5.631676181e-01f, +4.142597481e-01f, -1.194534887e-02f, -1.023421218e-01f, +4.185001294e-02f, +3.580924498e-02f, -3.686581736e-02f, -5.804016097e-03f, +2.339870935e-02f, -5.839439625e-03f, -1.077550011e-02f, +7.216799824e-03f, +2.888158088e-03f, -4.524009106e-03f, +2.458116791e-04f, +1.736132130e-03f, -5.871673671e-04f, -3.112978975e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.610437038e-05f, -8.327622540e-05f, +3.908930945e-05f, +1.831139756e-04f, -2.474246117e-04f, -1.915054324e-04f, +6.391917579e-04f, -1.100874403e-04f, -1.084708017e-03f, +9.583003777e-04f, +1.235299800e-03f, -2.525402363e-03f, -5.025812648e-04f, +5.151826305e-03f, -2.356104585e-03f, -1.429221976e-02f, -5.382172507e-03f, +1.257385239e-02f, +1.009977991e-02f, -3.202430684e-03f, -3.218589221e-03f, +2.663687558e-03f, +7.674926758e-04f, -1.800543053e-03f, +2.689501487e-04f, +9.174180851e-04f, -5.133108049e-04f, -2.939134475e-04f, +3.794666750e-04f, -1.225533759e-06f, -1.709866648e-04f, +6.227936507e-05f, +3.829275975e-05f, -2.998405133e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.251858742e-04f, -4.252640152e-04f, -2.151507862e-03f, +4.527012306e-03f, +5.333009973e-04f, -1.019027450e-02f, +8.577993945e-03f, +1.005551400e-02f, -2.268571807e-02f, +4.027722584e-03f, +2.896862746e-02f, -2.869950068e-02f, -1.448391835e-02f, +4.595803951e-02f, -1.762111059e-02f, -3.793971861e-02f, +4.579120694e-02f, +6.301026190e-03f, -4.860196112e-02f, +2.670588063e-02f, +2.547845715e-02f, -3.877977112e-02f, +3.668853018e-03f, +2.737580044e-02f, -1.876250774e-02f, -7.968348841e-03f, +1.638504743e-02f, -3.929401400e-03f, -6.988966964e-03f, +5.292211027e-03f, +7.062217525e-04f, -2.255784358e-03f, +5.871673671e-04f, +3.112978975e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.610437038e-05f, +8.327622540e-05f, -8.791448778e-05f, -1.930869736e-04f, +4.371052354e-04f, -5.693006235e-05f, -7.753791751e-04f, +8.397926405e-04f, +4.829366141e-04f, -1.696320876e-03f, +7.680086419e-04f, +1.641150580e-03f, -2.311960884e-03f, -1.640358600e-04f, +2.805179267e-03f, -1.936350697e-03f, -1.538119278e-03f, +3.069618857e-03f, -6.785074790e-04f, -2.373017956e-03f, +2.202263322e-03f, +5.509390681e-04f, -2.126757767e-03f, +9.148141966e-04f, +9.815833829e-04f, -1.209810209e-03f, +6.831492326e-05f, +6.852870172e-04f, -4.064113792e-04f, -1.335372086e-04f, +2.463803425e-04f, -6.346405180e-05f, -3.829275975e-05f, +2.998405133e-05f, +0.000000000e+00f, + /* 10, 9 (36) */ + +0.000000000e+00f, -7.090815039e-04f, +3.419877898e-04f, +2.038085481e-03f, -2.591945231e-03f, -2.791569555e-03f, +7.650480035e-03f, +4.508562038e-05f, -1.456072444e-02f, +1.006150723e-02f, +1.892646982e-02f, -3.059457870e-02f, -1.202874551e-02f, +6.304724158e-02f, -2.316623169e-02f, -1.150026489e-01f, +1.742777030e-01f, +5.577854456e-01f, +4.268336005e-01f, -1.845568962e-03f, -1.055445525e-01f, +3.863142371e-02f, +3.847293254e-02f, -3.609832469e-02f, -7.604559150e-03f, +2.366765949e-02f, -4.922021540e-03f, -1.128881091e-02f, +6.922886377e-03f, +3.267624763e-03f, -4.525234640e-03f, +7.482501437e-05f, +1.798411495e-03f, -5.488746074e-04f, -3.412819488e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.818101394e-05f, -8.153790302e-05f, +3.070248344e-05f, +1.872859978e-04f, -2.320624969e-04f, -2.133625434e-04f, +6.263987663e-04f, -5.918354445e-05f, -1.099119168e-03f, +8.786624560e-04f, +1.315769538e-03f, -2.440538845e-03f, -7.016476946e-04f, +5.112461682e-03f, -1.908457696e-03f, -1.415936827e-02f, -5.978342056e-03f, +1.223898450e-02f, +1.050018743e-02f, -2.929927596e-03f, -3.417409112e-03f, +2.583949443e-03f, +9.031701321e-04f, -1.806257904e-03f, +1.933167852e-04f, +9.510687062e-04f, -4.845922862e-04f, -3.239260137e-04f, +3.767192590e-04f, +1.469679696e-05f, -1.761443340e-04f, +5.770133452e-05f, +4.202336772e-05f, -3.014205917e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.090815039e-04f, -3.419877898e-04f, -2.239422350e-03f, +4.333925333e-03f, +9.704062327e-04f, -1.024720456e-02f, +7.802614769e-03f, +1.089530664e-02f, -2.220278145e-02f, +2.331401707e-03f, +2.973663610e-02f, -2.705835010e-02f, -1.679587923e-02f, +4.579400365e-02f, -1.481593132e-02f, -3.987606931e-02f, +4.425308766e-02f, +9.370645047e-03f, -4.928046860e-02f, +2.433286268e-02f, +2.768072048e-02f, -3.822883205e-02f, +1.542095251e-03f, +2.829061464e-02f, -1.778092436e-02f, -9.178159050e-03f, +1.645336235e-02f, -3.244114383e-03f, -7.395378343e-03f, +5.158673819e-03f, +9.526020949e-04f, -2.319248410e-03f, +5.488746074e-04f, +3.412819488e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.818101394e-05f, +8.153790302e-05f, -7.610990162e-05f, -2.044167045e-04f, +4.232144021e-04f, -1.748191534e-05f, -7.908920603e-04f, +7.869610876e-04f, +5.584374170e-04f, -1.686197720e-03f, +6.518764250e-04f, +1.727669888e-03f, -2.236391213e-03f, -3.307598458e-04f, +2.850412561e-03f, -1.787037745e-03f, -1.699467671e-03f, +3.038369337e-03f, -4.994672567e-04f, -2.471430410e-03f, +2.112139179e-03f, +6.955573382e-04f, -2.150360292e-03f, +8.192458243e-04f, +1.059462904e-03f, -1.192416947e-03f, +7.543337918e-06f, +7.104975722e-04f, -3.869528322e-04f, -1.570945041e-04f, +2.501466451e-04f, -5.613379215e-05f, -4.202336772e-05f, +3.014205917e-05f, +0.000000000e+00f, + /* 10,10 (36) */ + +0.000000000e+00f, -6.909004899e-04f, +2.604498868e-04f, +2.068787965e-03f, -2.404659233e-03f, -3.023632052e-03f, +7.437117492e-03f, +6.714843867e-04f, -1.461990799e-02f, +8.962388064e-03f, +1.980513228e-02f, -2.927880916e-02f, -1.446928435e-02f, +6.234559389e-02f, -1.805377000e-02f, -1.169111066e-01f, +1.601183347e-01f, +5.518071035e-01f, +4.390725850e-01f, +8.654618468e-03f, -1.084744801e-01f, +3.521401460e-02f, +4.105688198e-02f, -3.519515455e-02f, -9.410817054e-03f, +2.386097628e-02f, -3.970952834e-03f, -1.177340320e-02f, +6.598960363e-03f, +3.644344022e-03f, -4.510537843e-03f, -1.013193196e-04f, +1.856112829e-03f, -5.068512397e-04f, -3.714240080e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.009259950e-05f, -7.954564686e-05f, +2.244930511e-05f, +1.906844073e-04f, -2.162462075e-04f, -2.340220430e-04f, +6.117192827e-04f, -9.018273929e-06f, -1.109579937e-03f, +7.974566525e-04f, +1.390492908e-03f, -2.349155062e-03f, -8.946116431e-04f, +5.057821535e-03f, -1.468292429e-03f, -1.400242824e-02f, -6.562383914e-03f, +1.188011425e-02f, +1.088746485e-02f, -2.640987822e-03f, -3.609283075e-03f, +2.494116903e-03f, +1.038217321e-03f, -1.805956677e-03f, +1.156917410e-04f, +9.820678624e-04f, -4.536439134e-04f, -3.534248684e-04f, +3.725768584e-04f, +3.096014414e-05f, -1.807952724e-04f, +5.275439348e-05f, +4.572454142e-05f, -3.016325832e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.909004899e-04f, -2.604498868e-04f, -2.315532252e-03f, +4.129508628e-03f, +1.393620635e-03f, -1.026468647e-02f, +7.011722709e-03f, +1.168226773e-02f, -2.164434404e-02f, +6.452039870e-04f, +3.038851252e-02f, -2.533068021e-02f, -1.903227045e-02f, +4.546324381e-02f, -1.196551876e-02f, -4.166310706e-02f, +4.255361999e-02f, +1.240901438e-02f, -4.977993586e-02f, +2.186143227e-02f, +2.979285965e-02f, -3.753327471e-02f, -6.082650413e-04f, +2.910986046e-02f, -1.672146145e-02f, -1.037057600e-02f, +1.646090569e-02f, -2.533616811e-03f, -7.782331176e-03f, +5.001579315e-03f, +1.202748740e-03f, -2.375382202e-03f, +5.068512397e-04f, +3.714240080e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.009259950e-05f, +7.954564686e-05f, -6.436867513e-05f, -2.146283198e-04f, +4.079985290e-04f, +2.125117424e-05f, -8.031423941e-04f, +7.319545879e-04f, +6.308811252e-04f, -1.669898998e-03f, +5.343925828e-04f, +1.807118973e-03f, -2.152994000e-03f, -4.954889467e-04f, +2.884950883e-03f, -1.631377929e-03f, -1.854456839e-03f, +2.995829819e-03f, -3.181505232e-04f, -2.561031746e-03f, +2.013679029e-03f, +8.385552114e-04f, -2.166107787e-03f, +7.196408316e-04f, +1.134261323e-03f, -1.170251128e-03f, -5.423041956e-05f, +7.334236496e-04f, -3.655552479e-04f, -1.806118080e-04f, +2.529860138e-04f, -4.829314578e-05f, -4.572454142e-05f, +3.016325832e-05f, +0.000000000e+00f, + /* 10,11 (36) */ + +0.000000000e+00f, -6.708078904e-04f, +1.809042399e-04f, +2.091237270e-03f, -2.213974826e-03f, -3.239878260e-03f, +7.203095449e-03f, +1.283203669e-03f, -1.462892626e-02f, +7.852808127e-03f, +2.060258893e-02f, -2.788831625e-02f, -1.681843941e-02f, +6.145098224e-02f, -1.299594847e-02f, -1.183793991e-01f, +1.461159065e-01f, +5.452447196e-01f, +4.509526992e-01f, +1.954208331e-02f, -1.111154679e-01f, +3.160473153e-02f, +4.355099889e-02f, -3.415693723e-02f, -1.121677373e-02f, +2.397666802e-02f, -2.988884971e-03f, -1.222704711e-02f, +6.245535495e-03f, +4.016920880e-03f, -4.479577698e-03f, -2.821145921e-04f, +1.908867223e-03f, -4.611266983e-04f, -4.015872663e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.183697139e-05f, -7.731559125e-05f, +1.435704857e-05f, +1.933162649e-04f, -2.000422418e-04f, -2.534366685e-04f, +5.952404552e-04f, +4.025059554e-05f, -1.116123821e-03f, +7.149813435e-04f, +1.459320026e-03f, -2.251661867e-03f, -1.080975745e-03f, +4.988394460e-03f, -1.036535260e-03f, -1.382198515e-02f, -7.133133367e-03f, +1.149785587e-02f, +1.126056544e-02f, -2.336032000e-03f, -3.793465839e-03f, +2.394297346e-03f, +1.172173047e-03f, -1.799537034e-03f, +3.630568119e-05f, +1.010260740e-03f, -4.205314624e-04f, -3.822953020e-04f, +3.670237433e-04f, +4.751309867e-05f, -1.849083097e-04f, +4.744679547e-05f, +4.937953208e-05f, -3.004183543e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.708078904e-04f, -1.809042399e-04f, -2.379900927e-03f, +3.914880308e-03f, +1.801619164e-03f, -1.024343530e-02f, +6.208580315e-03f, +1.241422232e-02f, -2.101346291e-02f, -1.024695011e-03f, +3.092290510e-02f, -2.352356124e-02f, -2.118526445e-02f, +4.496775486e-02f, -9.080567878e-03f, -4.329448498e-02f, +4.069916315e-02f, +1.540484420e-02f, -5.009808638e-02f, +1.930040052e-02f, +3.180653868e-02f, -3.669471950e-02f, -2.774372828e-03f, +2.982950130e-02f, -1.558720013e-02f, -1.154082712e-02f, +1.640667527e-02f, -1.800193161e-03f, -8.147886423e-03f, +4.820967507e-03f, +1.455734754e-03f, -2.423675348e-03f, +4.611266983e-04f, +4.015872663e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.183697139e-05f, +7.731559125e-05f, -5.273917113e-05f, -2.237090575e-04f, +3.915479326e-04f, +5.913161749e-05f, -8.121380210e-04f, +6.750155765e-04f, +7.000310732e-04f, -1.647553387e-03f, +4.160123580e-04f, +1.879252654e-03f, -2.062129603e-03f, -6.576149381e-04f, +2.908698956e-03f, -1.469965605e-03f, -2.002508902e-03f, +2.942149141e-03f, -1.352325835e-04f, -2.641452209e-03f, +1.907210877e-03f, +9.793813793e-04f, -2.173875921e-03f, +6.163389903e-04f, +1.205655978e-03f, -1.143333523e-03f, -1.167812386e-04f, +7.539332808e-04f, -3.422640026e-04f, -2.039913259e-04f, +2.548600675e-04f, -3.996058038e-05f, -4.937953208e-05f, +3.004183543e-05f, +0.000000000e+00f, + /* 10,12 (36) */ + +0.000000000e+00f, -6.489709190e-04f, +1.035886486e-04f, +2.105594318e-03f, -2.020658561e-03f, -3.439920502e-03f, +6.949658780e-03f, +1.878444125e-03f, -1.458867566e-02f, +6.736684306e-03f, +2.131757027e-02f, -2.642899623e-02f, -1.907010128e-02f, +6.037000650e-02f, -8.007554010e-03f, -1.194159343e-01f, +1.322939213e-01f, +5.381115862e-01f, +4.624505551e-01f, +3.080264876e-02f, -1.134514999e-01f, +2.781126569e-02f, +4.594529623e-02f, -3.298476419e-02f, -1.301631076e-02f, +2.401297370e-02f, -1.978624231e-03f, -1.264757858e-02f, +5.863240193e-03f, +4.383944623e-03f, -4.432064600e-03f, -4.670229017e-04f, +1.956314018e-03f, -4.117471662e-04f, -4.316291017e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.341278869e-05f, -7.486434995e-05f, +6.451635999e-06f, +1.951912976e-04f, -1.835170266e-04f, -2.715645258e-04f, +5.770540469e-04f, +8.847119811e-05f, -1.118797047e-03f, +6.315341909e-04f, +1.522122917e-03f, -2.148482886e-03f, -1.260271810e-03f, +4.904701955e-03f, -6.140793350e-04f, -1.361867544e-02f, -7.689458480e-03f, +1.109288022e-02f, +1.161846675e-02f, -2.015529344e-03f, -3.969221342e-03f, +2.284632042e-03f, +1.304571912e-03f, -1.786915553e-03f, -4.460076216e-05f, +1.035499530e-03f, -3.853295463e-04f, -4.104225760e-04f, +3.600489775e-04f, +6.430197459e-05f, -1.884535380e-04f, +4.178848004e-05f, +5.297124727e-05f, -2.977245098e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.489709190e-04f, -1.035886486e-04f, -2.432640098e-03f, +3.691171251e-03f, +2.193167096e-03f, -1.018430368e-02f, +5.396442294e-03f, +1.308923789e-02f, -2.031343184e-02f, -2.672248398e-03f, +3.133891746e-02f, -2.164430858e-02f, -2.324739405e-02f, +4.431013992e-02f, -6.171868922e-03f, -4.476445059e-02f, +3.869665425e-02f, +1.834699334e-02f, -5.023331897e-02f, +1.665894831e-02f, +3.371374956e-02f, -3.571533812e-02f, -4.948248749e-03f, +3.044584029e-02f, -1.438154415e-02f, -1.268416065e-02f, +1.628989403e-02f, -1.046259880e-03f, -8.490150426e-03f, +4.616976181e-03f, +1.710594821e-03f, -2.463635928e-03f, +4.117471662e-04f, +4.316291017e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.341278869e-05f, +7.486434995e-05f, -4.126787494e-05f, -2.316512189e-04f, +3.739559945e-04f, +9.602783878e-05f, -8.178994521e-04f, +6.163905061e-04f, +7.656662674e-04f, -1.619311390e-03f, +2.971902916e-04f, +1.943855444e-03f, -1.964184579e-03f, -8.165422488e-04f, +2.921602689e-03f, -1.303415851e-03f, -2.143072522e-03f, +2.877518520e-03f, +4.860364050e-05f, -2.712355611e-03f, +1.793094934e-03f, +1.117489228e-03f, -2.173570016e-03f, +5.096976529e-04f, +1.273333749e-03f, -1.111703812e-03f, -1.798774665e-04f, +7.719018766e-04f, -3.171331497e-04f, -2.271335633e-04f, +2.557336104e-04f, -3.115741146e-05f, -5.297124727e-05f, +2.977245098e-05f, +0.000000000e+00f, + /* 10,13 (36) */ + +0.000000000e+00f, -6.255581303e-04f, +2.872429870e-05f, +2.112045954e-03f, -1.825467263e-03f, -3.623437528e-03f, +6.678094254e-03f, +2.455498171e-03f, -1.450020447e-02f, +5.617887259e-03f, +2.194910446e-02f, -2.490687331e-02f, -2.121858417e-02f, +5.910973469e-02f, -3.102852055e-03f, -1.200300136e-01f, +1.186752459e-01f, +5.304221278e-01f, +4.735434353e-01f, +4.242111551e-02f, -1.154670293e-01f, +2.384204435e-02f, +4.822992828e-02f, -3.168019227e-02f, -1.480322632e-02f, +2.396837294e-02f, -9.431247010e-04f, -1.303290812e-02f, +5.452817617e-03f, +4.743993601e-03f, -4.367762625e-03f, -6.554764398e-04f, +1.998102498e-03f, -3.587759189e-04f, -4.614015527e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.481950651e-05f, -7.220893438e-05f, -1.242428974e-06f, +1.963218005e-04f, -1.667366759e-04f, -2.883691325e-04f, +5.572560277e-04f, +1.354979999e-04f, -1.117658196e-03f, +5.474111549e-04f, +1.578795588e-03f, -2.040052961e-03f, -1.432061784e-03f, +4.807296497e-03f, -2.017824537e-04f, -1.339318463e-02f, -8.230262858e-03f, +1.066591335e-02f, +1.196017336e-02f, -1.679996932e-03f, -4.135825015e-03f, +2.165296231e-03f, +1.434945780e-03f, -1.768028315e-03f, -1.267776495e-04f, +1.057644062e-03f, -3.481215116e-04f, -4.376923352e-04f, +3.516465582e-04f, +8.127096016e-05f, -1.914024599e-04f, +3.579107793e-05f, +5.648231466e-05f, -2.935027957e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.255581303e-04f, -2.872429870e-05f, -2.473907973e-03f, +3.459520032e-03f, +2.567123091e-03f, -1.008827584e-02f, +4.578542842e-03f, +1.370562840e-02f, -1.954776557e-02f, -4.291559788e-03f, +3.163610775e-02f, -1.970045314e-02f, -2.521157863e-02f, +4.349359768e-02f, -3.250266233e-03f, -4.606786644e-02f, +3.655358173e-02f, +2.122451186e-02f, -5.018471533e-02f, +1.394659270e-02f, +3.550684449e-02f, -3.459784889e-02f, -7.121818765e-03f, +3.095553794e-02f, -1.310821040e-02f, -1.379586446e-02f, +1.611001656e-02f, -2.743580035e-04f, -8.807283576e-03f, +4.389842617e-03f, +1.966328432e-03f, -2.494793340e-03f, +3.587759189e-04f, +4.614015527e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.481950651e-05f, +7.220893438e-05f, -2.999923690e-05f, -2.384520814e-04f, +3.553187094e-04f, +1.318146992e-04f, -8.204595783e-04f, +5.563288172e-04f, +8.275820591e-04f, -1.585344515e-03f, +1.783784702e-04f, +2.000742161e-03f, -1.859570048e-03f, -9.716901891e-04f, +2.923649260e-03f, -1.132362069e-03f, -2.275625000e-03f, +2.802170855e-03f, +2.326702145e-04f, -2.773440751e-03f, +1.671722392e-03f, +1.252338987e-03f, -2.165125655e-03f, +4.000905217e-04f, +1.336992400e-03f, -1.075420669e-03f, -2.432817430e-04f, +7.872128629e-04f, -2.902253637e-04f, -2.499377138e-04f, +2.555748688e-04f, -2.190778440e-05f, -5.648231466e-05f, +2.935027957e-05f, +0.000000000e+00f, + /* 10,14 (36) */ + +0.000000000e+00f, -6.007386238e-04f, -4.348463569e-05f, +2.110803525e-03f, -1.629145463e-03f, -3.790174204e-03f, +6.389725122e-03f, +3.012754199e-03f, -1.436470647e-02f, +4.500229063e-03f, +2.249651562e-02f, -2.332807772e-02f, -2.325863713e-02f, +5.767767291e-02f, +1.704444442e-03f, -1.202317961e-01f, +1.052820612e-01f, +5.221918649e-01f, +4.842093487e-01f, +5.438128888e-02f, -1.171470262e-01f, +1.970621933e-02f, +5.039522451e-02f, -3.024524649e-02f, -1.657125463e-02f, +2.384159529e-02f, +1.145193607e-04f, -1.338102963e-02f, +5.015125282e-03f, +5.095640159e-03f, -4.286491665e-03f, -8.468788996e-04f, +2.033893576e-03f, -3.022936042e-04f, -4.907518323e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.605735419e-05f, -6.936667235e-05f, -8.702120614e-06f, +1.967225296e-04f, -1.497667557e-04f, -3.038194408e-04f, +5.359461581e-04f, +1.811921923e-04f, -1.112777800e-03f, +4.629055282e-04f, +1.629254024e-03f, -1.926816583e-03f, -1.595938597e-03f, +4.696759554e-03f, +1.995348309e-04f, -1.314624525e-02f, -8.754488303e-03f, +1.021773478e-02f, +1.228471971e-02f, -1.329998851e-03f, -4.292566062e-03f, +2.036499118e-03f, +1.562825257e-03f, -1.742831430e-03f, -2.099664357e-04f, +1.076562426e-03f, -3.089993010e-04f, -4.639910278e-04f, +3.418155397e-04f, +9.836228015e-05f, -1.937281326e-04f, +2.946790943e-05f, +5.989514869e-05f, -2.877104896e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.007386238e-04f, +4.348463569e-05f, -2.503907210e-03f, +3.221067951e-03f, +2.922441800e-03f, -9.956461145e-03f, +3.758083264e-03f, +1.426195722e-02f, -1.872018351e-02f, -5.876904303e-03f, +3.181448622e-02f, -1.769971098e-02f, -2.707114868e-02f, +4.252190749e-02f, -3.266169733e-04f, -4.720022851e-02f, +3.427795673e-02f, +2.402668272e-02f, -4.995204511e-02f, +1.117315195e-02f, +3.717856689e-02f, -3.334550991e-02f, -9.286944420e-03f, +3.135562846e-02f, -1.177121800e-02f, -1.487128513e-02f, +1.586673482e-02f, +5.128548594e-04f, -9.097508940e-03f, +4.139904904e-03f, +2.221903300e-03f, -2.516701124e-03f, +3.022936042e-04f, +4.907518323e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.605735419e-05f, +6.936667235e-05f, -1.897552822e-05f, -2.441137911e-04f, +3.357342316e-04f, +1.663738859e-04f, -8.198633372e-04f, +4.950819092e-04f, +8.855907438e-04f, -1.545844387e-03f, +6.002479865e-05f, +2.049758416e-03f, -1.748719956e-03f, -1.122495110e-03f, +2.914867028e-03f, -9.574535272e-04f, -2.399674268e-03f, +2.716379876e-03f, +4.162768226e-04f, -2.824442691e-03f, +1.543514070e-03f, +1.383399859e-03f, -2.148509167e-03f, +2.879063420e-04f, +1.396341886e-03f, -1.034561779e-03f, -3.067518688e-04f, +7.997582934e-04f, -2.616118483e-04f, -2.723020604e-04f, +2.543557191e-04f, -1.223864264e-05f, -5.989514869e-05f, +2.877104896e-05f, +0.000000000e+00f, + /* 10,15 (36) */ + +0.000000000e+00f, -5.746812696e-04f, -1.128513080e-04f, +2.102101405e-03f, -1.432422933e-03f, -3.939940960e-03f, +6.085905681e-03f, +3.548700357e-03f, -1.418351427e-02f, +3.387451263e-03f, +2.295942115e-02f, -2.169882370e-02f, -2.518545371e-02f, +5.608173431e-02f, +6.401203997e-03f, -1.200322613e-01f, +9.213581598e-02f, +5.134373766e-01f, +4.944270835e-01f, +6.666600858e-02f, -1.184770251e-01f, +1.541365327e-02f, +5.243172362e-02f, -2.868242124e-02f, -1.831408606e-02f, +2.363162885e-02f, +1.191081787e-03f, -1.369002894e-02f, +4.551134254e-03f, +5.437455699e-03f, -4.188129385e-03f, -1.040607032e-03f, +2.063361486e-03f, -2.423984556e-04f, -5.195228812e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.712731076e-05f, -6.635512750e-05f, -1.590594318e-05f, +1.964105891e-04f, -1.326720558e-04f, -3.178898405e-04f, +5.132275677e-04f, +2.254220541e-04f, -1.104237902e-03f, +3.783069945e-04f, +1.673436117e-03f, -1.809226314e-03f, -1.751526913e-03f, +4.573699545e-03f, +5.890909962e-04f, -1.287863464e-02f, -9.261117360e-03f, +9.749175768e-03f, +1.259117275e-02f, -9.661452078e-04f, -4.438749728e-03f, +1.898483772e-03f, +1.687741212e-03f, -1.711301519e-03f, -2.939007135e-04f, +1.092131575e-03f, -2.680632841e-04f, -4.892063288e-04f, +3.305601419e-04f, +1.155163692e-04f, -1.954053116e-04f, +2.283397571e-05f, +6.319202002e-05f, -2.803107764e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.746812696e-04f, +1.128513080e-04f, -2.522882738e-03f, +2.976954160e-03f, +3.258176032e-03f, -9.790087259e-03f, +2.938219927e-03f, +1.475703912e-02f, -1.783459277e-02f, -7.422748691e-03f, +3.187451102e-02f, -1.564995256e-02f, -2.881986863e-02f, +4.139941238e-02f, +2.588250055e-03f, -4.815768204e-02f, +3.187828246e-02f, +2.674306260e-02f, -4.953576829e-02f, +8.348709260e-03f, +3.872208096e-02f, -3.196211005e-02f, -1.143545359e-02f, +3.164353480e-02f, -1.037487612e-02f, -1.590584691e-02f, +1.555998295e-02f, +1.312613153e-03f, -9.359120788e-03f, +3.867602843e-03f, +2.476259020e-03f, -2.528939767e-03f, +2.423984556e-04f, +5.195228812e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.712731076e-05f, +6.635512750e-05f, -8.236710362e-06f, -2.486432361e-04f, +3.153024208e-04f, +1.995942661e-04f, -8.161673367e-04f, +4.329021186e-04f, +9.395220870e-04f, -1.501021790e-03f, -5.742869633e-05f, +2.090780974e-03f, -1.632089278e-03f, -1.268412490e-03f, +2.895325297e-03f, -7.793528412e-04f, -2.514760751e-03f, +2.620459116e-03f, +5.987334116e-04f, -2.865133908e-03f, +1.408918930e-03f, +1.510152137e-03f, -2.123718000e-03f, +1.735475238e-04f, +1.451105637e-03f, -9.892237732e-04f, -3.700417080e-04f, +8.094394370e-04f, -2.313722053e-04f, -2.941243906e-04f, +2.520519038e-04f, -2.179681792e-06f, -6.319202002e-05f, +2.803107764e-05f, +0.000000000e+00f, + /* 10,16 (36) */ + +0.000000000e+00f, -5.475539589e-04f, -1.792064355e-04f, +2.086195461e-03f, -1.236012344e-03f, -4.072613016e-03f, +5.768015841e-03f, +4.061927925e-03f, -1.395809222e-02f, +2.283213361e-03f, +2.333772814e-02f, -2.002538758e-02f, -2.699468003e-02f, +5.433020740e-02f, +1.097490354e-02f, -1.194431703e-01f, +7.925718134e-02f, +5.041762592e-01f, +5.041762592e-01f, +7.925718134e-02f, -1.194431703e-01f, +1.097490354e-02f, +5.433020740e-02f, -2.699468003e-02f, -2.002538758e-02f, +2.333772814e-02f, +2.283213361e-03f, -1.395809222e-02f, +4.061927925e-03f, +5.768015841e-03f, -4.072613016e-03f, -1.236012344e-03f, +2.086195461e-03f, -1.792064355e-04f, -5.475539589e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.803107764e-05f, -6.319202002e-05f, -2.283397571e-05f, +1.954053116e-04f, -1.155163692e-04f, -3.305601419e-04f, +4.892063288e-04f, +2.680632841e-04f, -1.092131575e-03f, +2.939007135e-04f, +1.711301519e-03f, -1.687741212e-03f, -1.898483772e-03f, +4.438749728e-03f, +9.661452078e-04f, -1.259117275e-02f, -9.749175768e-03f, +9.261117360e-03f, +1.287863464e-02f, -5.890909962e-04f, -4.573699545e-03f, +1.751526913e-03f, +1.809226314e-03f, -1.673436117e-03f, -3.783069945e-04f, +1.104237902e-03f, -2.254220541e-04f, -5.132275677e-04f, +3.178898405e-04f, +1.326720558e-04f, -1.964105891e-04f, +1.590594318e-05f, +6.635512750e-05f, -2.712731076e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.475539589e-04f, +1.792064355e-04f, -2.531119449e-03f, +2.728310923e-03f, +3.573478453e-03f, -9.590492993e-03f, +2.122052590e-03f, +1.518994124e-02f, -1.689507068e-02f, -8.923770481e-03f, +3.181708233e-02f, -1.355917159e-02f, -3.045195791e-02f, +4.013099989e-02f, +5.483575352e-03f, -4.893703488e-02f, +2.936352171e-02f, +2.936352171e-02f, -4.893703488e-02f, +5.483575352e-03f, +4.013099989e-02f, -3.045195791e-02f, -1.355917159e-02f, +3.181708233e-02f, -8.923770481e-03f, -1.689507068e-02f, +1.518994124e-02f, +2.122052590e-03f, -9.590492993e-03f, +3.573478453e-03f, +2.728310923e-03f, -2.531119449e-03f, +1.792064355e-04f, +5.475539589e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.803107764e-05f, +6.319202002e-05f, +2.179681792e-06f, -2.520519038e-04f, +2.941243906e-04f, +2.313722053e-04f, -8.094394370e-04f, +3.700417080e-04f, +9.892237732e-04f, -1.451105637e-03f, -1.735475238e-04f, +2.123718000e-03f, -1.510152137e-03f, -1.408918930e-03f, +2.865133908e-03f, -5.987334116e-04f, -2.620459116e-03f, +2.514760751e-03f, +7.793528412e-04f, -2.895325297e-03f, +1.268412490e-03f, +1.632089278e-03f, -2.090780974e-03f, +5.742869633e-05f, +1.501021790e-03f, -9.395220870e-04f, -4.329021186e-04f, +8.161673367e-04f, -1.995942661e-04f, -3.153024208e-04f, +2.486432361e-04f, +8.236710362e-06f, -6.635512750e-05f, +2.712731076e-05f, +0.000000000e+00f, + /* 10,17 (36) */ + +0.000000000e+00f, -5.195228812e-04f, -2.423984556e-04f, +2.063361486e-03f, -1.040607032e-03f, -4.188129385e-03f, +5.437455699e-03f, +4.551134254e-03f, -1.369002894e-02f, +1.191081787e-03f, +2.363162885e-02f, -1.831408606e-02f, -2.868242124e-02f, +5.243172362e-02f, +1.541365327e-02f, -1.184770251e-01f, +6.666600858e-02f, +4.944270835e-01f, +5.134373766e-01f, +9.213581598e-02f, -1.200322613e-01f, +6.401203997e-03f, +5.608173431e-02f, -2.518545371e-02f, -2.169882370e-02f, +2.295942115e-02f, +3.387451263e-03f, -1.418351427e-02f, +3.548700357e-03f, +6.085905681e-03f, -3.939940960e-03f, -1.432422933e-03f, +2.102101405e-03f, -1.128513080e-04f, -5.746812696e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.877104896e-05f, -5.989514869e-05f, -2.946790943e-05f, +1.937281326e-04f, -9.836228015e-05f, -3.418155397e-04f, +4.639910278e-04f, +3.089993010e-04f, -1.076562426e-03f, +2.099664357e-04f, +1.742831430e-03f, -1.562825257e-03f, -2.036499118e-03f, +4.292566062e-03f, +1.329998851e-03f, -1.228471971e-02f, -1.021773478e-02f, +8.754488303e-03f, +1.314624525e-02f, -1.995348309e-04f, -4.696759554e-03f, +1.595938597e-03f, +1.926816583e-03f, -1.629254024e-03f, -4.629055282e-04f, +1.112777800e-03f, -1.811921923e-04f, -5.359461581e-04f, +3.038194408e-04f, +1.497667557e-04f, -1.967225296e-04f, +8.702120614e-06f, +6.936667235e-05f, -2.605735419e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.195228812e-04f, +2.423984556e-04f, -2.528939767e-03f, +2.476259020e-03f, +3.867602843e-03f, -9.359120788e-03f, +1.312613153e-03f, +1.555998295e-02f, -1.590584691e-02f, -1.037487612e-02f, +3.164353480e-02f, -1.143545359e-02f, -3.196211005e-02f, +3.872208096e-02f, +8.348709260e-03f, -4.953576829e-02f, +2.674306260e-02f, +3.187828246e-02f, -4.815768204e-02f, +2.588250055e-03f, +4.139941238e-02f, -2.881986863e-02f, -1.564995256e-02f, +3.187451102e-02f, -7.422748691e-03f, -1.783459277e-02f, +1.475703912e-02f, +2.938219927e-03f, -9.790087259e-03f, +3.258176032e-03f, +2.976954160e-03f, -2.522882738e-03f, +1.128513080e-04f, +5.746812696e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.877104896e-05f, +5.989514869e-05f, +1.223864264e-05f, -2.543557191e-04f, +2.723020604e-04f, +2.616118483e-04f, -7.997582934e-04f, +3.067518688e-04f, +1.034561779e-03f, -1.396341886e-03f, -2.879063420e-04f, +2.148509167e-03f, -1.383399859e-03f, -1.543514070e-03f, +2.824442691e-03f, -4.162768226e-04f, -2.716379876e-03f, +2.399674268e-03f, +9.574535272e-04f, -2.914867028e-03f, +1.122495110e-03f, +1.748719956e-03f, -2.049758416e-03f, -6.002479865e-05f, +1.545844387e-03f, -8.855907438e-04f, -4.950819092e-04f, +8.198633372e-04f, -1.663738859e-04f, -3.357342316e-04f, +2.441137911e-04f, +1.897552822e-05f, -6.936667235e-05f, +2.605735419e-05f, +0.000000000e+00f, + /* 10,18 (36) */ + +0.000000000e+00f, -4.907518323e-04f, -3.022936042e-04f, +2.033893576e-03f, -8.468788996e-04f, -4.286491665e-03f, +5.095640159e-03f, +5.015125282e-03f, -1.338102963e-02f, +1.145193607e-04f, +2.384159529e-02f, -1.657125463e-02f, -3.024524649e-02f, +5.039522451e-02f, +1.970621933e-02f, -1.171470262e-01f, +5.438128888e-02f, +4.842093487e-01f, +5.221918649e-01f, +1.052820612e-01f, -1.202317961e-01f, +1.704444442e-03f, +5.767767291e-02f, -2.325863713e-02f, -2.332807772e-02f, +2.249651562e-02f, +4.500229063e-03f, -1.436470647e-02f, +3.012754199e-03f, +6.389725122e-03f, -3.790174204e-03f, -1.629145463e-03f, +2.110803525e-03f, -4.348463569e-05f, -6.007386238e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.935027957e-05f, -5.648231466e-05f, -3.579107793e-05f, +1.914024599e-04f, -8.127096016e-05f, -3.516465582e-04f, +4.376923352e-04f, +3.481215116e-04f, -1.057644062e-03f, +1.267776495e-04f, +1.768028315e-03f, -1.434945780e-03f, -2.165296231e-03f, +4.135825015e-03f, +1.679996932e-03f, -1.196017336e-02f, -1.066591335e-02f, +8.230262858e-03f, +1.339318463e-02f, +2.017824537e-04f, -4.807296497e-03f, +1.432061784e-03f, +2.040052961e-03f, -1.578795588e-03f, -5.474111549e-04f, +1.117658196e-03f, -1.354979999e-04f, -5.572560277e-04f, +2.883691325e-04f, +1.667366759e-04f, -1.963218005e-04f, +1.242428974e-06f, +7.220893438e-05f, -2.481950651e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.907518323e-04f, +3.022936042e-04f, -2.516701124e-03f, +2.221903300e-03f, +4.139904904e-03f, -9.097508940e-03f, +5.128548594e-04f, +1.586673482e-02f, -1.487128513e-02f, -1.177121800e-02f, +3.135562846e-02f, -9.286944420e-03f, -3.334550991e-02f, +3.717856689e-02f, +1.117315195e-02f, -4.995204511e-02f, +2.402668272e-02f, +3.427795673e-02f, -4.720022851e-02f, -3.266169733e-04f, +4.252190749e-02f, -2.707114868e-02f, -1.769971098e-02f, +3.181448622e-02f, -5.876904303e-03f, -1.872018351e-02f, +1.426195722e-02f, +3.758083264e-03f, -9.956461145e-03f, +2.922441800e-03f, +3.221067951e-03f, -2.503907210e-03f, +4.348463569e-05f, +6.007386238e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.935027957e-05f, +5.648231466e-05f, +2.190778440e-05f, -2.555748688e-04f, +2.499377138e-04f, +2.902253637e-04f, -7.872128629e-04f, +2.432817430e-04f, +1.075420669e-03f, -1.336992400e-03f, -4.000905217e-04f, +2.165125655e-03f, -1.252338987e-03f, -1.671722392e-03f, +2.773440751e-03f, -2.326702145e-04f, -2.802170855e-03f, +2.275625000e-03f, +1.132362069e-03f, -2.923649260e-03f, +9.716901891e-04f, +1.859570048e-03f, -2.000742161e-03f, -1.783784702e-04f, +1.585344515e-03f, -8.275820591e-04f, -5.563288172e-04f, +8.204595783e-04f, -1.318146992e-04f, -3.553187094e-04f, +2.384520814e-04f, +2.999923690e-05f, -7.220893438e-05f, +2.481950651e-05f, +0.000000000e+00f, + /* 10,19 (36) */ + +0.000000000e+00f, -4.614015527e-04f, -3.587759189e-04f, +1.998102498e-03f, -6.554764398e-04f, -4.367762625e-03f, +4.743993601e-03f, +5.452817617e-03f, -1.303290812e-02f, -9.431247010e-04f, +2.396837294e-02f, -1.480322632e-02f, -3.168019227e-02f, +4.822992828e-02f, +2.384204435e-02f, -1.154670293e-01f, +4.242111551e-02f, +4.735434353e-01f, +5.304221278e-01f, +1.186752459e-01f, -1.200300136e-01f, -3.102852055e-03f, +5.910973469e-02f, -2.121858417e-02f, -2.490687331e-02f, +2.194910446e-02f, +5.617887259e-03f, -1.450020447e-02f, +2.455498171e-03f, +6.678094254e-03f, -3.623437528e-03f, -1.825467263e-03f, +2.112045954e-03f, +2.872429870e-05f, -6.255581303e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.977245098e-05f, -5.297124727e-05f, -4.178848004e-05f, +1.884535380e-04f, -6.430197459e-05f, -3.600489775e-04f, +4.104225760e-04f, +3.853295463e-04f, -1.035499530e-03f, +4.460076216e-05f, +1.786915553e-03f, -1.304571912e-03f, -2.284632042e-03f, +3.969221342e-03f, +2.015529344e-03f, -1.161846675e-02f, -1.109288022e-02f, +7.689458480e-03f, +1.361867544e-02f, +6.140793350e-04f, -4.904701955e-03f, +1.260271810e-03f, +2.148482886e-03f, -1.522122917e-03f, -6.315341909e-04f, +1.118797047e-03f, -8.847119811e-05f, -5.770540469e-04f, +2.715645258e-04f, +1.835170266e-04f, -1.951912976e-04f, -6.451635999e-06f, +7.486434995e-05f, -2.341278869e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.614015527e-04f, +3.587759189e-04f, -2.494793340e-03f, +1.966328432e-03f, +4.389842617e-03f, -8.807283576e-03f, -2.743580035e-04f, +1.611001656e-02f, -1.379586446e-02f, -1.310821040e-02f, +3.095553794e-02f, -7.121818765e-03f, -3.459784889e-02f, +3.550684449e-02f, +1.394659270e-02f, -5.018471533e-02f, +2.122451186e-02f, +3.655358173e-02f, -4.606786644e-02f, -3.250266233e-03f, +4.349359768e-02f, -2.521157863e-02f, -1.970045314e-02f, +3.163610775e-02f, -4.291559788e-03f, -1.954776557e-02f, +1.370562840e-02f, +4.578542842e-03f, -1.008827584e-02f, +2.567123091e-03f, +3.459520032e-03f, -2.473907973e-03f, -2.872429870e-05f, +6.255581303e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.977245098e-05f, +5.297124727e-05f, +3.115741146e-05f, -2.557336104e-04f, +2.271335633e-04f, +3.171331497e-04f, -7.719018766e-04f, +1.798774665e-04f, +1.111703812e-03f, -1.273333749e-03f, -5.096976529e-04f, +2.173570016e-03f, -1.117489228e-03f, -1.793094934e-03f, +2.712355611e-03f, -4.860364050e-05f, -2.877518520e-03f, +2.143072522e-03f, +1.303415851e-03f, -2.921602689e-03f, +8.165422488e-04f, +1.964184579e-03f, -1.943855444e-03f, -2.971902916e-04f, +1.619311390e-03f, -7.656662674e-04f, -6.163905061e-04f, +8.178994521e-04f, -9.602783878e-05f, -3.739559945e-04f, +2.316512189e-04f, +4.126787494e-05f, -7.486434995e-05f, +2.341278869e-05f, +0.000000000e+00f, + /* 10,20 (36) */ + +0.000000000e+00f, -4.316291017e-04f, -4.117471662e-04f, +1.956314018e-03f, -4.670229017e-04f, -4.432064600e-03f, +4.383944623e-03f, +5.863240193e-03f, -1.264757858e-02f, -1.978624231e-03f, +2.401297370e-02f, -1.301631076e-02f, -3.298476419e-02f, +4.594529623e-02f, +2.781126569e-02f, -1.134514999e-01f, +3.080264876e-02f, +4.624505551e-01f, +5.381115862e-01f, +1.322939213e-01f, -1.194159343e-01f, -8.007554010e-03f, +6.037000650e-02f, -1.907010128e-02f, -2.642899623e-02f, +2.131757027e-02f, +6.736684306e-03f, -1.458867566e-02f, +1.878444125e-03f, +6.949658780e-03f, -3.439920502e-03f, -2.020658561e-03f, +2.105594318e-03f, +1.035886486e-04f, -6.489709190e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.004183543e-05f, -4.937953208e-05f, -4.744679547e-05f, +1.849083097e-04f, -4.751309867e-05f, -3.670237433e-04f, +3.822953020e-04f, +4.205314624e-04f, -1.010260740e-03f, -3.630568119e-05f, +1.799537034e-03f, -1.172173047e-03f, -2.394297346e-03f, +3.793465839e-03f, +2.336032000e-03f, -1.126056544e-02f, -1.149785587e-02f, +7.133133367e-03f, +1.382198515e-02f, +1.036535260e-03f, -4.988394460e-03f, +1.080975745e-03f, +2.251661867e-03f, -1.459320026e-03f, -7.149813435e-04f, +1.116123821e-03f, -4.025059554e-05f, -5.952404552e-04f, +2.534366685e-04f, +2.000422418e-04f, -1.933162649e-04f, -1.435704857e-05f, +7.731559125e-05f, -2.183697139e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.316291017e-04f, +4.117471662e-04f, -2.463635928e-03f, +1.710594821e-03f, +4.616976181e-03f, -8.490150426e-03f, -1.046259880e-03f, +1.628989403e-02f, -1.268416065e-02f, -1.438154415e-02f, +3.044584029e-02f, -4.948248749e-03f, -3.571533812e-02f, +3.371374956e-02f, +1.665894831e-02f, -5.023331897e-02f, +1.834699334e-02f, +3.869665425e-02f, -4.476445059e-02f, -6.171868922e-03f, +4.431013992e-02f, -2.324739405e-02f, -2.164430858e-02f, +3.133891746e-02f, -2.672248398e-03f, -2.031343184e-02f, +1.308923789e-02f, +5.396442294e-03f, -1.018430368e-02f, +2.193167096e-03f, +3.691171251e-03f, -2.432640098e-03f, -1.035886486e-04f, +6.489709190e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.004183543e-05f, +4.937953208e-05f, +3.996058038e-05f, -2.548600675e-04f, +2.039913259e-04f, +3.422640026e-04f, -7.539332808e-04f, +1.167812386e-04f, +1.143333523e-03f, -1.205655978e-03f, -6.163389903e-04f, +2.173875921e-03f, -9.793813793e-04f, -1.907210877e-03f, +2.641452209e-03f, +1.352325835e-04f, -2.942149141e-03f, +2.002508902e-03f, +1.469965605e-03f, -2.908698956e-03f, +6.576149381e-04f, +2.062129603e-03f, -1.879252654e-03f, -4.160123580e-04f, +1.647553387e-03f, -7.000310732e-04f, -6.750155765e-04f, +8.121380210e-04f, -5.913161749e-05f, -3.915479326e-04f, +2.237090575e-04f, +5.273917113e-05f, -7.731559125e-05f, +2.183697139e-05f, +0.000000000e+00f, + /* 10,21 (36) */ + +0.000000000e+00f, -4.015872663e-04f, -4.611266983e-04f, +1.908867223e-03f, -2.821145921e-04f, -4.479577698e-03f, +4.016920880e-03f, +6.245535495e-03f, -1.222704711e-02f, -2.988884971e-03f, +2.397666802e-02f, -1.121677373e-02f, -3.415693723e-02f, +4.355099889e-02f, +3.160473153e-02f, -1.111154679e-01f, +1.954208331e-02f, +4.509526992e-01f, +5.452447196e-01f, +1.461159065e-01f, -1.183793991e-01f, -1.299594847e-02f, +6.145098224e-02f, -1.681843941e-02f, -2.788831625e-02f, +2.060258893e-02f, +7.852808127e-03f, -1.462892626e-02f, +1.283203669e-03f, +7.203095449e-03f, -3.239878260e-03f, -2.213974826e-03f, +2.091237270e-03f, +1.809042399e-04f, -6.708078904e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.016325832e-05f, -4.572454142e-05f, -5.275439348e-05f, +1.807952724e-04f, -3.096014414e-05f, -3.725768584e-04f, +3.534248684e-04f, +4.536439134e-04f, -9.820678624e-04f, -1.156917410e-04f, +1.805956677e-03f, -1.038217321e-03f, -2.494116903e-03f, +3.609283075e-03f, +2.640987822e-03f, -1.088746485e-02f, -1.188011425e-02f, +6.562383914e-03f, +1.400242824e-02f, +1.468292429e-03f, -5.057821535e-03f, +8.946116431e-04f, +2.349155062e-03f, -1.390492908e-03f, -7.974566525e-04f, +1.109579937e-03f, +9.018273929e-06f, -6.117192827e-04f, +2.340220430e-04f, +2.162462075e-04f, -1.906844073e-04f, -2.244930511e-05f, +7.954564686e-05f, -2.009259950e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.015872663e-04f, +4.611266983e-04f, -2.423675348e-03f, +1.455734754e-03f, +4.820967507e-03f, -8.147886423e-03f, -1.800193161e-03f, +1.640667527e-02f, -1.154082712e-02f, -1.558720013e-02f, +2.982950130e-02f, -2.774372828e-03f, -3.669471950e-02f, +3.180653868e-02f, +1.930040052e-02f, -5.009808638e-02f, +1.540484420e-02f, +4.069916315e-02f, -4.329448498e-02f, -9.080567878e-03f, +4.496775486e-02f, -2.118526445e-02f, -2.352356124e-02f, +3.092290510e-02f, -1.024695011e-03f, -2.101346291e-02f, +1.241422232e-02f, +6.208580315e-03f, -1.024343530e-02f, +1.801619164e-03f, +3.914880308e-03f, -2.379900927e-03f, -1.809042399e-04f, +6.708078904e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.016325832e-05f, +4.572454142e-05f, +4.829314578e-05f, -2.529860138e-04f, +1.806118080e-04f, +3.655552479e-04f, -7.334236496e-04f, +5.423041956e-05f, +1.170251128e-03f, -1.134261323e-03f, -7.196408316e-04f, +2.166107787e-03f, -8.385552114e-04f, -2.013679029e-03f, +2.561031746e-03f, +3.181505232e-04f, -2.995829819e-03f, +1.854456839e-03f, +1.631377929e-03f, -2.884950883e-03f, +4.954889467e-04f, +2.152994000e-03f, -1.807118973e-03f, -5.343925828e-04f, +1.669898998e-03f, -6.308811252e-04f, -7.319545879e-04f, +8.031423941e-04f, -2.125117424e-05f, -4.079985290e-04f, +2.146283198e-04f, +6.436867513e-05f, -7.954564686e-05f, +2.009259950e-05f, +0.000000000e+00f, + /* 10,22 (36) */ + +0.000000000e+00f, -3.714240080e-04f, -5.068512397e-04f, +1.856112829e-03f, -1.013193196e-04f, -4.510537843e-03f, +3.644344022e-03f, +6.598960363e-03f, -1.177340320e-02f, -3.970952834e-03f, +2.386097628e-02f, -9.410817054e-03f, -3.519515455e-02f, +4.105688198e-02f, +3.521401460e-02f, -1.084744801e-01f, +8.654618468e-03f, +4.390725850e-01f, +5.518071035e-01f, +1.601183347e-01f, -1.169111066e-01f, -1.805377000e-02f, +6.234559389e-02f, -1.446928435e-02f, -2.927880916e-02f, +1.980513228e-02f, +8.962388064e-03f, -1.461990799e-02f, +6.714843867e-04f, +7.437117492e-03f, -3.023632052e-03f, -2.404659233e-03f, +2.068787965e-03f, +2.604498868e-04f, -6.909004899e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.014205917e-05f, -4.202336772e-05f, -5.770133452e-05f, +1.761443340e-04f, -1.469679696e-05f, -3.767192590e-04f, +3.239260137e-04f, +4.845922862e-04f, -9.510687062e-04f, -1.933167852e-04f, +1.806257904e-03f, -9.031701321e-04f, -2.583949443e-03f, +3.417409112e-03f, +2.929927596e-03f, -1.050018743e-02f, -1.223898450e-02f, +5.978342056e-03f, +1.415936827e-02f, +1.908457696e-03f, -5.112461682e-03f, +7.016476946e-04f, +2.440538845e-03f, -1.315769538e-03f, -8.786624560e-04f, +1.099119168e-03f, +5.918354445e-05f, -6.263987663e-04f, +2.133625434e-04f, +2.320624969e-04f, -1.872859978e-04f, -3.070248344e-05f, +8.153790302e-05f, -1.818101394e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.714240080e-04f, +5.068512397e-04f, -2.375382202e-03f, +1.202748740e-03f, +5.001579315e-03f, -7.782331176e-03f, -2.533616811e-03f, +1.646090569e-02f, -1.037057600e-02f, -1.672146145e-02f, +2.910986046e-02f, -6.082650413e-04f, -3.753327471e-02f, +2.979285965e-02f, +2.186143227e-02f, -4.977993586e-02f, +1.240901438e-02f, +4.255361999e-02f, -4.166310706e-02f, -1.196551876e-02f, +4.546324381e-02f, -1.903227045e-02f, -2.533068021e-02f, +3.038851252e-02f, +6.452039870e-04f, -2.164434404e-02f, +1.168226773e-02f, +7.011722709e-03f, -1.026468647e-02f, +1.393620635e-03f, +4.129508628e-03f, -2.315532252e-03f, -2.604498868e-04f, +6.909004899e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.014205917e-05f, +4.202336772e-05f, +5.613379215e-05f, -2.501466451e-04f, +1.570945041e-04f, +3.869528322e-04f, -7.104975722e-04f, -7.543337918e-06f, +1.192416947e-03f, -1.059462904e-03f, -8.192458243e-04f, +2.150360292e-03f, -6.955573382e-04f, -2.112139179e-03f, +2.471430410e-03f, +4.994672567e-04f, -3.038369337e-03f, +1.699467671e-03f, +1.787037745e-03f, -2.850412561e-03f, +3.307598458e-04f, +2.236391213e-03f, -1.727669888e-03f, -6.518764250e-04f, +1.686197720e-03f, -5.584374170e-04f, -7.869610876e-04f, +7.908920603e-04f, +1.748191534e-05f, -4.232144021e-04f, +2.044167045e-04f, +7.610990162e-05f, -8.153790302e-05f, +1.818101394e-05f, +0.000000000e+00f, + /* 10,23 (36) */ + +0.000000000e+00f, -3.412819488e-04f, -5.488746074e-04f, +1.798411495e-03f, +7.482501437e-05f, -4.525234640e-03f, +3.267624763e-03f, +6.922886377e-03f, -1.128881091e-02f, -4.922021540e-03f, +2.366765949e-02f, -7.604559150e-03f, -3.609832469e-02f, +3.847293254e-02f, +3.863142371e-02f, -1.055445525e-01f, -1.845568962e-03f, +4.268336005e-01f, +5.577854456e-01f, +1.742777030e-01f, -1.150026489e-01f, -2.316623169e-02f, +6.304724158e-02f, -1.202874551e-02f, -3.059457870e-02f, +1.892646982e-02f, +1.006150723e-02f, -1.456072444e-02f, +4.508562038e-05f, +7.650480035e-03f, -2.791569555e-03f, -2.591945231e-03f, +2.038085481e-03f, +3.419877898e-04f, -7.090815039e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.998405133e-05f, -3.829275975e-05f, -6.227936507e-05f, +1.709866648e-04f, +1.225533759e-06f, -3.794666750e-04f, +2.939134475e-04f, +5.133108049e-04f, -9.174180851e-04f, -2.689501487e-04f, +1.800543053e-03f, -7.674926758e-04f, -2.663687558e-03f, +3.218589221e-03f, +3.202430684e-03f, -1.009977991e-02f, -1.257385239e-02f, +5.382172507e-03f, +1.429221976e-02f, +2.356104585e-03f, -5.151826305e-03f, +5.025812648e-04f, +2.525402363e-03f, -1.235299800e-03f, -9.583003777e-04f, +1.084708017e-03f, +1.100874403e-04f, -6.391917579e-04f, +1.915054324e-04f, +2.474246117e-04f, -1.831139756e-04f, -3.908930945e-05f, +8.327622540e-05f, -1.610437038e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.412819488e-04f, +5.488746074e-04f, -2.319248410e-03f, +9.526020949e-04f, +5.158673819e-03f, -7.395378343e-03f, -3.244114383e-03f, +1.645336235e-02f, -9.178159050e-03f, -1.778092436e-02f, +2.829061464e-02f, +1.542095251e-03f, -3.822883205e-02f, +2.768072048e-02f, +2.433286268e-02f, -4.928046860e-02f, +9.370645047e-03f, +4.425308766e-02f, -3.987606931e-02f, -1.481593132e-02f, +4.579400365e-02f, -1.679587923e-02f, -2.705835010e-02f, +2.973663610e-02f, +2.331401707e-03f, -2.220278145e-02f, +1.089530664e-02f, +7.802614769e-03f, -1.024720456e-02f, +9.704062327e-04f, +4.333925333e-03f, -2.239422350e-03f, -3.419877898e-04f, +7.090815039e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.998405133e-05f, +3.829275975e-05f, +6.346405180e-05f, -2.463803425e-04f, +1.335372086e-04f, +4.064113792e-04f, -6.852870172e-04f, -6.831492326e-05f, +1.209810209e-03f, -9.815833829e-04f, -9.148141966e-04f, +2.126757767e-03f, -5.509390681e-04f, -2.202263322e-03f, +2.373017956e-03f, +6.785074790e-04f, -3.069618857e-03f, +1.538119278e-03f, +1.936350697e-03f, -2.805179267e-03f, +1.640358600e-04f, +2.311960884e-03f, -1.641150580e-03f, -7.680086419e-04f, +1.696320876e-03f, -4.829366141e-04f, -8.397926405e-04f, +7.753791751e-04f, +5.693006235e-05f, -4.371052354e-04f, +1.930869736e-04f, +8.791448778e-05f, -8.327622540e-05f, +1.610437038e-05f, +0.000000000e+00f, + /* 10,24 (36) */ + +0.000000000e+00f, -3.112978975e-04f, -5.871673671e-04f, +1.736132130e-03f, +2.458116791e-04f, -4.524009106e-03f, +2.888158088e-03f, +7.216799824e-03f, -1.077550011e-02f, -5.839439625e-03f, +2.339870935e-02f, -5.804016097e-03f, -3.686581736e-02f, +3.580924498e-02f, +4.185001294e-02f, -1.023421218e-01f, -1.194534887e-02f, +4.142597481e-01f, +5.631676181e-01f, +1.885699227e-01f, -1.126465443e-01f, -2.831805799e-02f, +6.354982285e-02f, -9.503343145e-03f, -3.182987850e-02f, +1.796816944e-02f, +1.114621525e-02f, -1.445063700e-02f, -5.941061375e-04f, +7.841985467e-03f, -2.544144944e-03f, -2.775059206e-03f, +1.998996172e-03f, +4.252640152e-04f, -7.251858742e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.969548071e-05f, -3.454906199e-05f, -6.648190592e-05f, +1.653545488e-04f, +1.675785505e-05f, -3.808394755e-04f, +2.635014452e-04f, +5.397426018e-04f, -8.812771671e-04f, -3.423717487e-04f, +1.788932731e-03f, -6.316405263e-04f, -2.733257492e-03f, +3.013575599e-03f, +3.458125588e-03f, -9.687310381e-03f, -1.288416172e-02f, +4.775069922e-03f, +1.440045004e-02f, +2.810275417e-03f, -5.175461552e-03f, +2.979378363e-04f, +2.603349068e-03f, -1.149255343e-03f, -1.036072332e-03f, +1.066326044e-03f, +1.615667266e-04f, -6.500161234e-04f, +1.685032771e-04f, +2.622662284e-04f, -1.781640366e-04f, -4.758123071e-05f, +8.474504102e-05f, -1.386565486e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.112978975e-04f, +5.871673671e-04f, -2.255784358e-03f, +7.062217525e-04f, +5.292211027e-03f, -6.988966964e-03f, -3.929401400e-03f, +1.638504743e-02f, -7.968348841e-03f, -1.876250774e-02f, +2.737580044e-02f, +3.668853018e-03f, -3.877977112e-02f, +2.547845715e-02f, +2.670588063e-02f, -4.860196112e-02f, +6.301026190e-03f, +4.579120694e-02f, -3.793971861e-02f, -1.762111059e-02f, +4.595803951e-02f, -1.448391835e-02f, -2.869950068e-02f, +2.896862746e-02f, +4.027722584e-03f, -2.268571807e-02f, +1.005551400e-02f, +8.577993945e-03f, -1.019027450e-02f, +5.333009973e-04f, +4.527012306e-03f, -2.151507862e-03f, -4.252640152e-04f, +7.251858742e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.969548071e-05f, +3.454906199e-05f, +7.026830925e-05f, -2.417284259e-04f, +1.100356434e-04f, +4.238942074e-04f, -6.579306774e-04f, -1.278665634e-04f, +1.222428889e-03f, -9.009535962e-04f, -1.006024907e-03f, +2.095453481e-03f, -4.052542535e-04f, -2.283756763e-03f, +2.266196171e-03f, +8.546060723e-04f, -3.089472453e-03f, +1.371013874e-03f, +2.078745462e-03f, -2.749387231e-03f, -4.064419775e-06f, +2.379370406e-03f, -1.547835191e-03f, -8.823350607e-04f, +1.700162350e-03f, -4.046303101e-04f, -8.902118581e-04f, +7.566088004e-04f, +9.695012096e-05f, -4.495842258e-04f, +1.806570197e-04f, +9.973236345e-05f, -8.474504102e-05f, +1.386565486e-05f, +0.000000000e+00f, + /* 10,25 (36) */ + +0.000000000e+00f, -2.816024168e-04f, -6.217164291e-04f, +1.669650224e-03f, +4.111662279e-04f, -4.507251251e-03f, +2.507318612e-03f, +7.480301269e-03f, -1.023575751e-02f, -6.720716792e-03f, +2.305633760e-02f, -4.015083365e-03f, -3.749745789e-02f, +3.307598749e-02f, +4.486358854e-02f, -9.888399625e-02f, -2.163265925e-02f, +4.013755864e-01f, +5.679426880e-01f, +2.029703728e-01f, -1.098362689e-01f, -3.349351954e-02f, +6.384776068e-02f, -6.899994078e-03f, -3.297913384e-02f, +1.693209711e-02f, +1.221254129e-02f, -1.428907027e-02f, -1.244122261e-03f, +8.010488745e-03f, -2.281878715e-03f, -2.953223243e-03f, +1.951414941e-03f, +5.100090562e-04f, -7.390515291e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.928298365e-05f, -3.080815738e-05f, -7.030403398e-05f, +1.592812343e-04f, +3.185371746e-05f, -3.808625011e-04f, +2.328034518e-04f, +5.638397564e-04f, -8.428128131e-04f, -4.133726548e-04f, +1.771565127e-03f, -4.960622527e-04f, -2.792618837e-03f, +2.803125091e-03f, +3.696690383e-03f, -9.263865382e-03f, -1.316941546e-02f, +4.158255968e-03f, +1.448358090e-02f, +3.269983539e-03f, -5.182950086e-03f, +8.826984939e-05f, +2.673998238e-03f, -1.057829360e-03f, -1.111681544e-03f, +1.043966167e-03f, +2.134531864e-04f, -6.587951315e-04f, +1.444138644e-04f, +2.765214500e-04f, -1.724347159e-04f, -5.614849721e-05f, +8.592942003e-05f, -1.146869604e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.816024168e-04f, +6.217164291e-04f, -2.185516049e-03f, +4.644933266e-04f, +5.402246671e-03f, -6.565072757e-03f, -4.587332077e-03f, +1.625718086e-02f, -6.745919952e-03f, -1.966346134e-02f, +2.636977554e-02f, +5.764306499e-03f, -3.918502537e-02f, +2.319470039e-02f, +2.897207681e-02f, -4.774735505e-02f, +3.211553737e-03f, +4.716222082e-02f, -3.586097315e-02f, -2.037049782e-02f, +4.595397510e-02f, -1.210454794e-02f, -3.024733587e-02f, +2.808629239e-02f, +5.727884933e-03f, -2.309034838e-02f, +9.165302142e-03f, +9.334602745e-03f, -1.009332438e-02f, +8.371677150e-05f, +4.707669326e-03f, -2.051775499e-03f, -5.100090562e-04f, +7.390515291e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.928298365e-05f, +3.080815738e-05f, +7.653379225e-05f, -2.362349022e-04f, +8.668310176e-05f, +4.393733119e-04f, -6.285732982e-04f, -1.859885772e-04f, +1.230289469e-03f, -8.179111777e-04f, -1.092576711e-03f, +2.056628820e-03f, -2.590571425e-04f, -2.356359075e-03f, +2.151397215e-03f, +1.027110630e-03f, -3.097867476e-03f, +1.198775712e-03f, +2.213675986e-03f, -2.683213238e-03f, -1.729143738e-04f, +2.438316371e-03f, -1.448025975e-03f, -9.944043599e-04f, +1.697639239e-03f, -3.237842138e-04f, -9.379874212e-04f, +7.345990946e-04f, +1.373938764e-04f, -4.605685252e-04f, +1.671499120e-04f, +1.115119337e-04f, -8.592942003e-05f, +1.146869604e-05f, +0.000000000e+00f, + /* 10,26 (36) */ + +0.000000000e+00f, -2.523194331e-04f, -6.525245865e-04f, +1.599346190e-03f, +5.704474622e-04f, -4.475397533e-03f, +2.126456111e-03f, +7.713104721e-03f, -9.671917752e-03f, -7.563529605e-03f, +2.264296494e-02f, -2.243518239e-03f, -3.799352014e-02f, +3.028336865e-02f, +4.766671363e-02f, -9.518730587e-02f, -3.089652464e-02f, +3.882061709e-01f, +5.721009440e-01f, +2.174539537e-01f, -1.065662854e-01f, -3.867646963e-02f, +6.393603053e-02f, -4.225995840e-03f, -3.403696320e-02f, +1.582041557e-02f, +1.325650746e-02f, -1.407561709e-02f, -1.902917392e-03f, +8.154902609e-03f, -2.005357265e-03f, -3.125657959e-03f, +1.895266444e-03f, +5.959384762e-04f, -7.505202251e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.875354420e-05f, -2.708541354e-05f, -7.374245794e-05f, +1.528007835e-04f, +4.646933020e-05f, -3.795648824e-04f, +2.019316964e-04f, +5.855633017e-04f, -8.021969079e-04f, -4.817556115e-04f, +1.748595268e-03f, -3.611980788e-04f, -2.841764127e-03f, +2.587996928e-03f, +3.917852994e-03f, -8.830546986e-03f, -1.342917682e-02f, +3.532976323e-03f, +1.454119011e-02f, +3.734215656e-03f, -5.173912764e-03f, -1.258445563e-04f, +2.736986459e-03f, -9.612362918e-04f, -1.184833580e-03f, +1.017634902e-03f, +2.655741250e-04f, -6.654578295e-04f, +1.193000958e-04f, +2.901250602e-04f, -1.659274605e-04f, -6.476024872e-05f, +8.681515683e-05f, -8.918174004e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.523194331e-04f, +6.525245865e-04f, -2.108982257e-03f, +2.282584243e-04f, +5.488929773e-03f, -6.125699445e-03f, -5.215905376e-03f, +1.607119229e-02f, -5.515630483e-03f, -2.048137252e-02f, +2.527719883e-02f, +7.820935319e-03f, -3.944408252e-02f, +2.083834132e-02f, +3.112347402e-02f, -4.672024442e-02f, +1.136862607e-04f, +4.836099653e-02f, -3.364729716e-02f, -2.305371106e-02f, +4.578106072e-02f, -9.666231573e-03f, -3.169536184e-02f, +2.709188803e-02f, +7.425524173e-03f, -2.341413259e-02f, +8.227314721e-03f, +1.006920184e-02f, -9.955930500e-03f, -3.768517537e-04f, +4.874819238e-03f, -1.940263565e-03f, -5.959384762e-04f, +7.505202251e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.875354420e-05f, +2.708541354e-05f, +8.225054997e-05f, -2.299462057e-04f, +6.357011090e-05f, +4.528293106e-04f, -5.973649916e-04f, -2.424800867e-04f, +1.233426639e-03f, -7.327991633e-04f, -1.174189137e-03f, +2.010492361e-03f, -1.129002439e-04f, -2.419844927e-03f, +2.029081848e-03f, +1.195383927e-03f, -3.094784748e-03f, +1.022048699e-03f, +2.340623620e-03f, -2.606874067e-03f, -3.418817327e-04f, +2.488525914e-03f, -1.342052330e-03f, -1.103769857e-03f, +1.688692430e-03f, -2.406772698e-04f, -9.828950914e-04f, +7.093814518e-04f, +1.781085629e-04f, -4.699796753e-04f, +1.525939204e-04f, +1.232002731e-04f, -8.681515683e-05f, +8.918174004e-06f, +0.000000000e+00f, + /* 10,27 (36) */ + +0.000000000e+00f, -2.235658889e-04f, -6.796100001e-04f, +1.525603732e-03f, +7.232482457e-04f, -4.428928203e-03f, +1.746891229e-03f, +7.915036418e-03f, -9.086354450e-03f, -8.365726513e-03f, +2.216120933e-02f, -4.949229710e-04f, -3.835471822e-02f, +2.744160453e-02f, +5.025471055e-02f, -9.126945287e-02f, -3.972707162e-02f, +3.747769941e-01f, +5.756339203e-01f, +2.319951438e-01f, -1.028320697e-01f, -4.385038239e-02f, +6.381018598e-02f, -1.489009381e-03f, -3.499819949e-02f, +1.463558199e-02f, +1.427414236e-02f, -1.381004296e-02f, -2.568375222e-03f, +8.274202705e-03f, -1.715232205e-03f, -3.291585419e-03f, +1.830506195e-03f, +6.827536331e-04f, -7.594383991e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.811445097e-05f, -2.339563256e-05f, -7.679548794e-05f, +1.459479235e-04f, +6.056366392e-05f, -3.769798469e-04f, +1.709968175e-04f, +6.048831993e-04f, -7.596056841e-04f, -5.473355139e-04f, +1.720194238e-03f, -2.274785910e-04f, -2.880718331e-03f, +2.368950490e-03f, +4.121391341e-03f, -8.388469819e-03f, -1.366307007e-02f, +2.900497611e-03f, +1.457291283e-02f, +4.201934253e-03f, -5.148010231e-03f, -3.438028954e-04f, +2.791969079e-03f, -8.597114582e-04f, -1.255237391e-03f, +9.873525818e-04f, +3.177528972e-04f, -6.699394056e-04f, +9.322986019e-05f, +3.030127815e-04f, -1.586466923e-04f, -7.338460892e-05f, +8.738885041e-05f, -6.219625487e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.235658889e-04f, +6.796100001e-04f, -2.026731707e-03f, -1.687781361e-06f, +5.552499883e-03f, -5.672870134e-03f, -5.813270367e-03f, +1.582871220e-02f, -4.282203844e-03f, -2.121417168e-02f, +2.410300969e-02f, +9.831427680e-03f, -3.955698276e-02f, +1.841849639e-02f, +3.315255587e-02f, -4.552486049e-02f, -2.981098487e-03f, +4.938304523e-02f, -3.130667354e-02f, -2.566058512e-02f, +4.543917899e-02f, -7.177705658e-03f, -3.303741417e-02f, +2.598811818e-02f, +9.114216603e-03f, -2.365480986e-02f, +7.244419629e-03f, +1.077858329e-02f, -9.777821937e-03f, -8.468314290e-04f, +5.027413158e-03f, -1.817063292e-03f, -6.827536331e-04f, +7.594383991e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.811445097e-05f, +2.339563256e-05f, +8.741141862e-05f, -2.229109352e-04f, +4.078411243e-05f, +4.642513548e-04f, -5.644605407e-04f, -2.971496820e-04f, +1.231892916e-03f, -6.459645926e-04f, -1.250603378e-03f, +1.957278847e-03f, +3.266778794e-05f, -2.474024768e-03f, +1.899737561e-03f, +1.358806323e-03f, -3.080248590e-03f, +8.414939287e-04f, +2.459099157e-03f, -2.520625783e-03f, -5.103309886e-04f, +2.529757947e-03f, -1.230269716e-03f, -1.209991291e-03f, +1.673287075e-03f, -1.556007156e-04f, -1.024718709e-03f, +6.810005888e-04f, +2.189374102e-04f, -4.777440308e-04f, +1.370225164e-04f, +1.347433312e-04f, -8.738885041e-05f, +6.219625487e-06f, +0.000000000e+00f, + /* 10,28 (36) */ + +0.000000000e+00f, -1.954514380e-04f, -7.030056326e-04f, +1.448808244e-03f, +8.691961692e-04f, -4.368364539e-03f, +1.369911382e-03f, +8.086033235e-03f, -8.481471251e-03f, -9.125332197e-03f, +2.161387382e-02f, +1.225271268e-03f, -3.858219681e-02f, +2.456088620e-02f, +5.262366104e-02f, -8.714806153e-02f, -4.811554144e-02f, +3.611139240e-01f, +5.785344179e-01f, +2.465680566e-01f, -9.863013548e-02f, -4.899839262e-02f, +6.346638308e-02f, +1.302959698e-03f, -3.585791095e-02f, +1.338034460e-02f, +1.526149494e-02f, -1.349229007e-02f, -3.238314627e-03f, +8.367432565e-03f, -1.412219424e-03f, -3.450232112e-03f, +1.757121586e-03f, +7.701424835e-04f, -7.656580246e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.737325389e-05f, -1.975300466e-05f, -7.946299958e-05f, +1.387578968e-04f, +7.409854095e-05f, -3.731445150e-04f, +1.401075016e-04f, +6.217782838e-04f, -7.152190423e-04f, -6.099398339e-04f, +1.686548354e-03f, -9.532349545e-05f, -2.909538260e-03f, +2.146743094e-03f, +4.307133336e-03f, -7.938758087e-03f, -1.387078132e-02f, +2.262104276e-03f, +1.457844287e-02f, +4.672080105e-03f, -5.104944408e-03f, -5.649797821e-04f, +2.838621625e-03f, -7.535106118e-04f, -1.322606356e-03f, +9.531535107e-04f, +3.698094587e-04f, -6.721815354e-04f, +6.627588767e-05f, +3.151215343e-04f, -1.505998611e-04f, -8.198878583e-05f, +8.763798329e-05f, -3.379445362e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.954514380e-04f, +7.030056326e-04f, -1.939320288e-03f, -2.245987165e-04f, +5.593283996e-03f, -5.208618780e-03f, -6.377730908e-03f, +1.553156252e-02f, -3.050310928e-03f, -2.186013627e-02f, +2.285240631e-02f, +1.178870653e-02f, -3.952431497e-02f, +1.594447162e-02f, +3.505229343e-02f, -4.416605417e-02f, -6.061347078e-03f, +5.022453916e-02f, -2.884757439e-02f, -2.818121091e-02f, +4.492884800e-02f, -4.647947712e-03f, -3.426768389e-02f, +2.477812689e-02f, +1.078750368e-02f, -2.381041058e-02f, +6.219700920e-03f, +1.145958388e-02f, -9.558884527e-03f, -1.324575460e-03f, +5.164435675e-03f, -1.682319961e-03f, -7.701424835e-04f, +7.656580246e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.737325389e-05f, +1.975300466e-05f, +9.201197506e-05f, -2.151795872e-04f, +1.840916351e-05f, +4.736370068e-04f, -5.300186960e-04f, -3.498160386e-04f, +1.225758205e-03f, -5.577571095e-04f, -1.321583081e-03f, +1.897248067e-03f, +1.771042394e-04f, -2.518745368e-03f, +1.763876605e-03f, +1.516778097e-03f, -3.054326685e-03f, +6.577871599e-04f, +2.568644751e-03f, -2.424762866e-03f, -6.776258297e-04f, +2.561804269e-03f, -1.113058466e-03f, -1.312636598e-03f, +1.651412983e-03f, -6.885707847e-05f, -1.063251170e-03f, +6.495145785e-04f, +2.597202162e-04f, -4.837931722e-04f, +1.204743522e-04f, +1.460861484e-04f, -8.763798329e-05f, +3.379445362e-06f, +0.000000000e+00f, + /* 10,29 (36) */ + +0.000000000e+00f, -1.680781841e-04f, -7.227586373e-04f, +1.369345244e-03f, +1.007954066e-03f, -4.294265998e-03f, +9.967668667e-04f, +8.226140737e-03f, -7.859692967e-03f, -9.840551239e-03f, +2.100393398e-02f, +2.911819621e-03f, -3.867752031e-02f, +2.165134794e-02f, +5.477040414e-02f, -8.284092820e-02f, -5.605429953e-02f, +3.472431427e-01f, +5.807965222e-01f, +2.611464995e-01f, -9.395805537e-02f, -5.410333703e-02f, +6.290140330e-02f, +4.141581323e-03f, -3.661142156e-02f, +1.205773824e-02f, +1.621464846e-02f, -1.312248061e-02f, -3.910496163e-03f, +8.433708453e-03f, -1.097097889e-03f, -3.600831973e-03f, +1.675132800e-03f, +8.577804668e-04f, -7.690374700e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.653772083e-05f, -1.617106558e-05f, -8.174639255e-05f, +1.312663145e-04f, +8.703871292e-05f, -3.680996854e-04f, +1.093701351e-04f, +6.362361767e-04f, -6.692198707e-04f, -6.694089971e-04f, +1.647858294e-03f, +3.485957021e-05f, -2.928311885e-03f, +1.922127813e-03f, +4.474956746e-03f, -7.482542598e-03f, -1.405205896e-02f, +1.619095412e-03f, +1.455753372e-02f, +5.143574865e-03f, -5.044459890e-03f, -7.887284655e-04f, +2.876641169e-03f, -6.429094186e-04f, -1.386659325e-03f, +9.150860880e-04f, +4.215609389e-04f, -6.721327113e-04f, +3.851558106e-05f, +3.263896975e-04f, -1.417974878e-04f, -9.053917835e-05f, +8.755099897e-05f, -4.048843568e-07f, +0.000000000e+00f, + +0.000000000e+00f, +1.680781841e-04f, +7.227586373e-04f, -1.847308313e-03f, -4.397783037e-04f, +5.611693159e-03f, -4.734981773e-03f, -6.907749604e-03f, +1.518174648e-02f, -1.824552723e-03f, -2.241789338e-02f, +2.153082323e-02f, +1.368595459e-02f, -3.934721073e-02f, +1.342572625e-02f, +3.681617003e-02f, -4.264927607e-02f, -9.115673763e-03f, +5.088232632e-02f, -2.627892964e-02f, -3.060597377e-02f, +4.425122217e-02f, -2.086143442e-03f, -3.538074236e-02f, +2.346549029e-02f, +1.243891666e-02f, -2.387926765e-02f, +5.156449751e-03f, +1.210909846e-02f, -9.299164310e-03f, -1.808368632e-03f, +5.284910027e-03f, -1.536233813e-03f, -8.577804668e-04f, +7.690374700e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.653772083e-05f, +1.617106558e-05f, +9.605047892e-05f, -2.068042874e-04f, -3.474341315e-06f, +4.809920841e-04f, -4.942014676e-04f, -4.003084851e-04f, +1.215109297e-03f, -4.685275682e-04f, -1.386915047e-03f, +1.830683648e-03f, +3.198743867e-04f, -2.553890217e-03f, +1.622033927e-03f, +1.668721691e-03f, -3.017129766e-03f, +4.716162238e-04f, +2.668835727e-03f, -2.319617192e-03f, -8.431315882e-04f, +2.584490563e-03f, -9.908224858e-04f, -1.411283666e-03f, +1.623084914e-03f, +1.924088598e-05f, -1.098295382e-03f, +6.149948290e-04f, +3.002939445e-04f, -4.880643032e-04f, +1.029932155e-04f, +1.571730812e-04f, -8.755099897e-05f, +4.048843568e-07f, +0.000000000e+00f, + /* 10,30 (36) */ + +0.000000000e+00f, -1.415404632e-04f, -7.389297029e-04f, +1.287598852e-03f, +1.139220381e-03f, -4.207227285e-03f, +6.286671812e-04f, +8.335510872e-03f, -7.223456790e-03f, -1.050977111e-02f, +2.033452499e-02f, +4.559677915e-03f, -3.864266074e-02f, +1.872303605e-02f, +5.669253195e-02f, -7.836597145e-02f, -6.353684213e-02f, +3.331910838e-01f, +5.824156176e-01f, +2.757040332e-01f, -8.881448051e-02f, -5.914779692e-02f, +6.211267483e-02f, +7.018222492e-03f, -3.725433098e-02f, +1.067107892e-02f, +1.712973454e-02f, -1.270091967e-02f, -4.582628874e-03f, +8.472224034e-03f, -7.707081919e-04f, -3.742629460e-03f, +1.584593622e-03f, +9.453314657e-04f, -7.694423543e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.561579456e-05f, -1.266265802e-05f, -8.364854408e-05f, +1.235090111e-04f, +9.935192578e-05f, -3.618896117e-04f, +7.888847102e-05f, +6.482531711e-04f, -6.217933644e-04f, -7.255967097e-04f, +1.604338211e-03f, +1.626761686e-04f, -2.937157559e-03f, +1.695851340e-03f, +4.624788907e-03f, -7.020957778e-03f, -1.420671412e-02f, +9.727815458e-04f, +1.450999957e-02f, +5.615323730e-03f, -4.966345222e-03f, -1.014382450e-03f, +2.905747658e-03f, -5.282028638e-04f, -1.447121671e-03f, +8.732128755e-04f, +4.728222327e-04f, -6.697485541e-04f, +1.003082804e-05f, +3.367573684e-04f, -1.322531958e-04f, -9.900148872e-05f, +8.711737723e-05f, +2.695957155e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.415404632e-04f, +7.389297029e-04f, -1.751257834e-03f, -6.465825911e-04f, +5.608218818e-03f, -4.253989689e-03f, -7.401951071e-03f, +1.478143799e-02f, -6.094434262e-04f, -2.288642095e-02f, +2.014390818e-02f, +1.551663824e-02f, -3.902733634e-02f, +1.087183604e-02f, +3.843820396e-02f, -4.098055438e-02f, -1.213280353e-02f, +5.135394254e-02f, -2.361009391e-02f, -3.292559096e-02f, +4.340809058e-02f, +4.983471210e-04f, -3.637156484e-02f, +2.205420662e-02f, +1.406200157e-02f, -2.386002677e-02f, +4.058154368e-03f, +1.272409329e-02f, -8.998870366e-03f, -2.296432935e-03f, +5.387903242e-03f, -1.379060731e-03f, -9.453314657e-04f, +7.694423543e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.561579456e-05f, +1.266265802e-05f, +9.952780372e-05f, -1.978385212e-04f, -2.478992676e-05f, +4.863304728e-04f, -4.571734157e-04f, -4.484675188e-04f, +1.200049301e-03f, -3.786266502e-04f, -1.446409830e-03f, +1.757891766e-03f, +4.604535010e-04f, -2.579379779e-03f, +1.474765034e-03f, +1.814083871e-03f, -2.968811143e-03f, +2.836783930e-04f, +2.759282259e-03f, -2.205556864e-03f, -1.006217692e-03f, +2.597677261e-03f, -8.639878579e-04f, -1.505522069e-03f, +1.588342783e-03f, +1.083713075e-04f, -1.129665192e-03f, +5.775260078e-04f, +3.404933445e-04f, -4.905006326e-04f, +8.462796079e-05f, +1.679480372e-04f, -8.711737723e-05f, -2.695957155e-06f, +0.000000000e+00f, + /* 10,31 (36) */ + +0.000000000e+00f, -1.159246687e-04f, -7.515923609e-04f, +1.203950308e-03f, +1.262729392e-03f, -4.107875360e-03f, +2.667775696e-04f, +8.414399343e-03f, -6.575203619e-03f, -1.113156447e-02f, +1.960892828e-02f, +6.164016126e-03f, -3.847998457e-02f, +1.578587849e-02f, +5.838838329e-02f, -7.374118254e-02f, -7.055779991e-02f, +3.189843696e-01f, +5.833883991e-01f, +2.902140328e-01f, -8.319915678e-02f, -6.411414215e-02f, +6.109829238e-02f, +9.923970151e-03f, -3.778253385e-02f, +9.223957244e-03f, +1.800294742e-02f, -1.222809744e-02f, -5.252377428e-03f, +8.482254862e-03f, -4.339508234e-04f, -3.874882656e-03f, +1.485592133e-03f, +1.032448843e-03f, -7.667463972e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.461555001e-05f, -9.239896990e-06f, -8.517375766e-05f, +1.155219012e-04f, +1.110089722e-04f, -3.545617704e-04f, +4.876331166e-05f, +6.578340876e-04f, -5.731263495e-04f, -7.783702355e-04f, +1.556214796e-03f, +2.877461347e-04f, -2.936223164e-03f, +1.468651897e-03f, +4.756606318e-03f, -6.555138706e-03f, -1.433462083e-02f, +3.244813960e-04f, +1.443571605e-02f, +6.086218167e-03f, -4.870434080e-03f, -1.241257195e-03f, +2.925685177e-03f, -4.097045852e-04f, -1.503726322e-03f, +8.276106219e-04f, +5.234066115e-04f, -6.649921034e-04f, -1.909220717e-05f, +3.461666226e-04f, -1.219837312e-04f, -1.073408404e-04f, +8.632770721e-05f, +5.914139316e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.159246687e-04f, +7.515923609e-04f, -1.651730030e-03f, -8.444211122e-04f, +5.583428891e-03f, -3.767659216e-03f, -7.859124487e-03f, +1.433297048e-02f, +5.906058744e-04f, -2.326504760e-02f, +1.869749835e-02f, +1.727453001e-02f, -3.856688284e-02f, +8.292456257e-03f, +3.991296900e-02f, -3.916647051e-02f, -1.510161467e-02f, +5.163762093e-02f, -2.085081165e-02f, -3.513114783e-02f, +4.240187289e-02f, +3.096024382e-03f, -3.723555270e-02f, +2.054868455e-02f, +1.565034436e-02f, -2.375165546e-02f, +2.928489176e-03f, +1.330161930e-02f, -8.658377021e-03f, -2.786933568e-03f, +5.472531203e-03f, -1.211112694e-03f, -1.032448843e-03f, +7.667463972e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.461555001e-05f, +9.239896990e-06f, +1.024473576e-04f, -1.883368647e-04f, -4.546527100e-05f, +4.896739099e-04f, -4.191009431e-04f, -4.941452697e-04f, +1.180697021e-03f, -2.884034970e-04f, -1.499902243e-03f, +1.679199776e-03f, +5.983288007e-04f, -2.595171601e-03f, +1.322643785e-03f, +1.952337783e-03f, -2.909566064e-03f, +9.467771006e-05f, +2.839630915e-03f, -2.082984900e-03f, -1.166260110e-03f, +2.601260275e-03f, -7.330013445e-04f, -1.594954770e-03f, +1.547251752e-03f, +1.982043651e-04f, -1.157186281e-03f, +5.372059098e-04f, +3.801515912e-04f, -4.910517381e-04f, +6.543241704e-05f, +1.783547172e-04f, -8.632770721e-05f, -5.914139316e-06f, +0.000000000e+00f, + /* 11, 0 (32) */ + +0.000000000e+00f, +3.454933159e-04f, +1.541097233e-03f, -3.365769507e-03f, +1.849372243e-04f, +7.921455674e-03f, -9.933387929e-03f, -4.722893055e-03f, +2.491782703e-02f, -1.923850865e-02f, -2.511889872e-02f, +6.555431985e-02f, -2.774896345e-02f, -1.143270713e-01f, +2.866385681e-01f, +6.354451792e-01f, +2.866385681e-01f, -1.143270713e-01f, -2.774896345e-02f, +6.555431985e-02f, -2.511889872e-02f, -1.923850865e-02f, +2.491782703e-02f, -4.722893055e-03f, -9.933387929e-03f, +7.921455674e-03f, +1.849372243e-04f, -3.365769507e-03f, +1.541097233e-03f, +3.454933159e-04f, -4.305061225e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.101387684e-05f, +5.655131412e-05f, +1.448851155e-04f, -3.610593840e-04f, +1.277861936e-04f, +6.337796691e-04f, -1.025814987e-03f, -4.352543003e-05f, +2.004659355e-03f, -2.192683832e-03f, -1.360003080e-03f, +6.036694190e-03f, -4.003233266e-03f, -1.727534696e-02f, -4.191591060e-04f, +1.724418689e-02f, +4.602800923e-03f, -6.079250102e-03f, +1.126519703e-03f, +2.337894363e-03f, -1.966945911e-03f, -5.631255252e-05f, +1.066773732e-03f, -6.075706714e-04f, -1.636888179e-04f, +3.703376314e-04f, -1.351121395e-04f, -6.554370115e-05f, +7.281496347e-05f, -1.727359999e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.454933159e-04f, -1.287417451e-03f, +5.082890229e-03f, -4.452826306e-03f, -5.152110347e-03f, +1.588482173e-02f, -1.131295515e-02f, -1.199676363e-02f, +3.147222030e-02f, -1.942348993e-02f, -1.990214054e-02f, +4.584722208e-02f, -2.506967236e-02f, -2.523864421e-02f, +5.173229864e-02f, -2.523864421e-02f, -2.506967236e-02f, +4.584722208e-02f, -1.990214054e-02f, -1.942348993e-02f, +3.147222030e-02f, -1.199676363e-02f, -1.131295515e-02f, +1.588482173e-02f, -5.152110347e-03f, -4.452826306e-03f, +5.082890229e-03f, -1.287417451e-03f, -7.762310022e-04f, +4.305061225e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.101387684e-05f, -1.418209216e-04f, -6.562212109e-05f, +4.928895181e-04f, -6.050820446e-04f, -1.179125761e-04f, +1.239577499e-03f, -1.396234898e-03f, -1.564208422e-04f, +2.155328008e-03f, -2.269433978e-03f, -1.561627150e-04f, +2.839407163e-03f, -2.815838079e-03f, -1.107507574e-04f, +2.928700180e-03f, -2.741319471e-03f, -4.020126626e-05f, +2.370842601e-03f, -2.090262312e-03f, +2.150884940e-05f, +1.466738437e-03f, -1.209113201e-03f, +4.975225277e-05f, +6.412573280e-04f, -4.853095666e-04f, +4.385512737e-05f, +1.537652081e-04f, -1.002695547e-04f, +1.727359999e-05f, +0.000000000e+00f, + /* 11, 1 (32) */ + +0.000000000e+00f, +2.744794391e-04f, +1.597648547e-03f, -3.220884391e-03f, -1.761221597e-04f, +8.049241867e-03f, -9.299608260e-03f, -5.748708042e-03f, +2.487430160e-02f, -1.723384929e-02f, -2.731158255e-02f, +6.419431677e-02f, -2.171226926e-02f, -1.183303046e-01f, +2.693632211e-01f, +6.350260201e-01f, +3.038827550e-01f, -1.097242704e-01f, -3.382821355e-02f, +6.668083955e-02f, -2.278100435e-02f, -2.120545456e-02f, +2.486151448e-02f, -3.656119323e-03f, -1.054095860e-02f, +7.757766856e-03f, +5.552748558e-04f, -3.500881646e-03f, +1.475553532e-03f, +4.183082794e-04f, -4.477797225e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.894654851e-05f, +4.762523496e-05f, +1.537432642e-04f, -3.505241726e-04f, +9.222254628e-05f, +6.568429598e-04f, -9.815841830e-04f, -1.412211116e-04f, +2.033724933e-03f, -2.041759800e-03f, -1.583294811e-03f, +5.972562914e-03f, -3.409766865e-03f, -1.726928183e-02f, -1.256459939e-03f, +1.717552527e-02f, +5.206873907e-03f, -6.099553942e-03f, +8.835284387e-04f, +2.476704058e-03f, -1.920567935e-03f, -1.579283810e-04f, +1.104223360e-03f, -5.782559362e-04f, -1.997856523e-04f, +3.782849447e-04f, -1.244408611e-04f, -7.456199901e-05f, +7.432951012e-05f, -1.587925964e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.744794391e-04f, -1.429238372e-03f, +5.017268108e-03f, -3.959936788e-03f, -5.757192392e-03f, +1.576690915e-02f, -1.007337765e-02f, -1.339299853e-02f, +3.131579945e-02f, -1.726816192e-02f, -2.217157452e-02f, +4.569105936e-02f, -2.223026519e-02f, -2.805448229e-02f, +5.162154789e-02f, -2.230994403e-02f, -2.781099183e-02f, +4.580702081e-02f, -1.753129794e-02f, -2.151375224e-02f, +3.149372914e-02f, -1.053002519e-02f, -1.252206835e-02f, +1.593457398e-02f, -4.510853019e-03f, -4.938135872e-03f, +5.126745357e-03f, -1.133652243e-03f, -8.765005569e-04f, +4.477797225e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.894654851e-05f, -1.296007205e-04f, -8.643911408e-05f, +4.980291667e-04f, -5.669451485e-04f, -1.843390432e-04f, +1.264126917e-03f, -1.320520896e-03f, -2.892181057e-04f, +2.210463330e-03f, -2.158870932e-03f, -3.508593867e-04f, +2.924870034e-03f, -2.690969630e-03f, -3.317666361e-04f, +3.029040832e-03f, -2.630996745e-03f, -2.373751464e-04f, +2.462586420e-03f, -2.015469923e-03f, -1.149374980e-04f, +1.531648112e-03f, -1.172783428e-03f, -1.985905989e-05f, +6.752609872e-04f, -4.752661866e-04f, +2.121927248e-05f, +1.653604951e-04f, -1.007616128e-04f, +1.587925964e-05f, +0.000000000e+00f, + /* 11, 2 (32) */ + +0.000000000e+00f, +2.055328905e-04f, +1.645273782e-03f, -3.067141127e-03f, -5.266463322e-04f, +8.141464414e-03f, -8.642765300e-03f, -6.730292225e-03f, +2.473308049e-02f, -1.520012436e-02f, -2.935334235e-02f, +6.261102195e-02f, -1.573970634e-02f, -1.217400715e-01f, +2.520939393e-01f, +6.337695601e-01f, +3.210582802e-01f, -1.045173965e-01f, -3.992776749e-02f, +6.756436799e-02f, -2.030430029e-02f, -2.312602249e-02f, +2.470358610e-02f, -2.551895963e-03f, -1.111921454e-02f, +7.557981204e-03f, +9.335598005e-04f, -3.625322507e-03f, +1.400991533e-03f, +4.926377895e-04f, -4.636589821e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.663390283e-05f, +3.880427232e-05f, +1.616746057e-04f, -3.388095256e-04f, +5.713788228e-05f, +6.767344434e-04f, -9.343269739e-04f, -2.364255892e-04f, +2.054193084e-03f, -1.885818684e-03f, -1.795762098e-03f, +5.887591478e-03f, -2.823957673e-03f, -1.722636945e-02f, -2.090711636e-03f, +1.706918873e-02f, +5.813820907e-03f, -6.096990672e-03f, +6.317624037e-04f, +2.608437499e-03f, -1.865543218e-03f, -2.609432477e-04f, +1.137936565e-03f, -5.458894262e-04f, -2.359276916e-04f, +3.848313325e-04f, -1.128923987e-04f, -8.356437160e-05f, +7.553797284e-05f, -1.430408636e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.055328905e-04f, -1.558839093e-03f, +4.930828994e-03f, -3.461907621e-03f, -6.324137540e-03f, +1.558257011e-02f, -8.809250736e-03f, -1.471351943e-02f, +3.102658135e-02f, -1.505769859e-02f, -2.433044545e-02f, +4.534019998e-02f, -1.930539516e-02f, -3.074545192e-02f, +5.128978125e-02f, -1.928090320e-02f, -3.044198857e-02f, +4.556964567e-02f, -1.506871152e-02f, -2.352922217e-02f, +3.137879165e-02f, -8.998377082e-03f, -1.369485178e-02f, +1.591471492e-02f, -3.835592032e-03f, -5.413402059e-03f, +5.147964629e-03f, -9.682917474e-04f, -9.772621697e-04f, +4.636589821e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.663390283e-05f, -1.171768659e-04f, -1.062318554e-04f, +5.007627948e-04f, -5.270616700e-04f, -2.487615761e-04f, +1.282739667e-03f, -1.239998590e-03f, -4.193357355e-04f, +2.255510631e-03f, -2.039701187e-03f, -5.430429681e-04f, +2.997375566e-03f, -2.554662325e-03f, -5.513277849e-04f, +3.116399721e-03f, -2.508884473e-03f, -4.344936997e-04f, +2.544194950e-03f, -1.931200014e-03f, -2.523248602e-04f, +1.590601295e-03f, -1.130665368e-03f, -9.062683597e-05f, +7.068891457e-04f, -4.627477756e-04f, -2.197657769e-06f, +1.765332510e-04f, -1.006917880e-04f, +1.430408636e-05f, +0.000000000e+00f, + /* 11, 3 (32) */ + +0.000000000e+00f, +1.388989877e-04f, +1.684078054e-03f, -2.905466521e-03f, -8.654558578e-04f, +8.198602296e-03f, -7.966030856e-03f, -7.664619199e-03f, +2.449665490e-02f, -1.314593127e-02f, -3.123916103e-02f, +6.081525986e-02f, -9.852114863e-03f, -1.245640291e-01f, +2.348675698e-01f, +6.316788485e-01f, +3.381274690e-01f, -9.870357560e-02f, -4.602475816e-02f, +6.819613039e-02f, -1.769586280e-02f, -2.499156571e-02f, +2.444264285e-02f, -1.413959398e-03f, -1.166510396e-02f, +7.322053512e-03f, +1.318391133e-03f, -3.738214906e-03f, +1.317427161e-03f, +5.681757623e-04f, -4.779630685e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.409736252e-05f, +3.012550886e-05f, +1.686716379e-04f, -3.259961039e-04f, +2.266695685e-05f, +6.934417111e-04f, -8.842964323e-04f, -3.288066269e-04f, +2.066147209e-03f, -1.725563159e-03f, -1.996824487e-03f, +5.782570238e-03f, -2.247317239e-03f, -1.714708762e-02f, -2.919891436e-03f, +1.692510800e-02f, +6.421979990e-03f, -6.071009941e-03f, +3.720022736e-04f, +2.732434021e-03f, -1.801924571e-03f, -3.649652725e-04f, +1.167696943e-03f, -5.105391625e-04f, -2.719622451e-04f, +3.899111944e-04f, -1.004924917e-04f, -9.250770446e-05f, +7.642169036e-05f, -1.254897547e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.388989877e-04f, -1.676015959e-03f, +4.824597139e-03f, -2.961144826e-03f, -6.851199210e-03f, +1.533380853e-02f, -7.526511069e-03f, -1.595351802e-02f, +3.060724561e-02f, -1.280218796e-02f, -2.637014664e-02f, +4.479715701e-02f, -1.630801959e-02f, -3.330011425e-02f, +5.073845346e-02f, -1.616450348e-02f, -3.295087304e-02f, +4.513515197e-02f, -1.252451657e-02f, -2.546042218e-02f, +3.112646679e-02f, -7.407775787e-03f, -1.482551715e-02f, +1.582408808e-02f, -3.128702886e-03f, -5.876149835e-03f, +5.145766972e-03f, -7.917584964e-04f, -1.077953958e-03f, +4.779630685e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.409736252e-05f, -1.046204324e-04f, -1.249331840e-04f, +5.011354274e-04f, -4.856505384e-04f, -3.109239366e-04f, +1.295421288e-03f, -1.155086836e-03f, -5.462267062e-04f, +2.290358631e-03f, -1.912507091e-03f, -7.318830510e-04f, +3.056649812e-03f, -2.407533414e-03f, -7.684716360e-04f, +3.190373477e-03f, -2.375482011e-03f, -6.306877531e-04f, +2.615239996e-03f, -1.837746491e-03f, -3.900495221e-04f, +1.643258051e-03f, -1.082864033e-03f, -1.622460947e-04f, +7.359451690e-04f, -4.477545695e-04f, -2.630151461e-05f, +1.872098875e-04f, -1.000372204e-04f, +1.254897547e-05f, +0.000000000e+00f, + /* 11, 4 (32) */ + +0.000000000e+00f, +7.480162519e-05f, +1.714203563e-03f, -2.736794883e-03f, -1.191451962e-03f, +8.221269253e-03f, -7.272589145e-03f, -8.548915631e-03f, +2.416784827e-02f, -1.107978407e-02f, -3.296472419e-02f, +5.881843537e-02f, -4.069544625e-03f, -1.268113464e-01f, +2.177204822e-01f, +6.287589571e-01f, +3.550525770e-01f, -9.228159561e-02f, -5.209576810e-02f, +6.856813267e-02f, -1.496342877e-02f, -2.679349028e-02f, +2.407767758e-02f, -2.462624541e-04f, -1.217564313e-02f, +7.050091267e-03f, +1.708302327e-03f, -3.838707398e-03f, +1.224919457e-03f, +6.445974527e-04f, -4.905120440e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.135872231e-05f, +2.162417585e-05f, +1.747312493e-04f, -3.121672704e-04f, -1.106118323e-05f, +7.069658116e-04f, -8.317518661e-04f, -4.180496835e-04f, +2.069702749e-03f, -1.561699363e-03f, -2.185955052e-03f, +5.658341220e-03f, -1.681308471e-03f, -1.703201199e-02f, -3.741991540e-03f, +1.674331867e-02f, +7.029663496e-03f, -6.021128903e-03f, +1.050742777e-04f, +2.848050543e-03f, -1.729800256e-03f, -4.695908602e-04f, +1.193300107e-03f, -4.722872316e-04f, -3.077335173e-04f, +3.934637232e-04f, -8.727150786e-05f, -1.013477763e-04f, +7.696301166e-05f, -1.061593068e-05f, +0.000000000e+00f, + +0.000000000e+00f, -7.480162519e-05f, -1.780636391e-03f, +4.699663955e-03f, -2.460009399e-03f, -7.336849749e-03f, +1.502288459e-02f, -6.231089781e-03f, -1.710860485e-02f, +3.006101891e-02f, -1.051182933e-02f, -2.828265373e-02f, +4.406527396e-02f, -1.325136978e-02f, -3.570764766e-02f, +4.996998183e-02f, -1.297413000e-02f, -3.532635506e-02f, +4.450446421e-02f, -9.909276578e-03f, -2.729816867e-02f, +3.073641726e-02f, -5.764517736e-03f, -1.590838118e-02f, +1.566184199e-02f, -2.392757717e-03f, -6.323904404e-03f, +5.119465457e-03f, -6.045486089e-04f, -1.177991178e-03f, +4.905120440e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.135872231e-05f, -9.200096162e-05f, -1.424831887e-04f, +4.992023741e-04f, -4.429334640e-04f, -3.705846943e-04f, +1.302204225e-03f, -1.066219067e-03f, -6.693641742e-04f, +2.314942528e-03f, -1.777902771e-03f, -9.165682554e-04f, +3.102478442e-03f, -2.250247059e-03f, -9.822464652e-04f, +3.250617563e-03f, -2.231340502e-03f, -8.250880908e-04f, +2.675337866e-03f, -1.735447020e-03f, -5.275000579e-04f, +1.689302989e-03f, -1.029512157e-03f, -2.344026744e-04f, +7.622407565e-04f, -4.302989061e-04f, -5.099210984e-05f, +1.973171607e-04f, -9.877768243e-05f, +1.061593068e-05f, +0.000000000e+00f, + /* 11, 5 (32) */ + +0.000000000e+00f, +1.344290287e-05f, +1.735827739e-03f, -2.562063634e-03f, -1.503619232e-03f, +8.210208070e-03f, -6.565623334e-03f, -9.380667497e-03f, +2.374979859e-02f, -9.010081316e-03f, -3.452642355e-02f, +5.663248032e-02f, +1.588796594e-03f, -1.284926549e-01f, +2.006884702e-01f, +6.250169655e-01f, +3.717958956e-01f, -8.525193212e-02f, -5.811689701e-02f, +6.867320694e-02f, -1.211537823e-02f, -2.852329054e-02f, +2.360808672e-02f, +9.470376524e-04f, -1.264793036e-02f, +6.742357750e-03f, +2.101766051e-03f, -3.925978906e-03f, +1.123571680e-03f, +7.215604643e-04f, -5.011279746e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.844002441e-05f, +1.333354016e-05f, +1.798546151e-04f, -2.974086587e-04f, -4.392362233e-05f, +7.173209664e-04f, -7.769576327e-04f, -5.038588502e-04f, +2.065006149e-03f, -1.394934129e-03f, -2.362681358e-03f, +5.515794497e-03f, -1.127341589e-03f, -1.688181373e-02f, -4.555025022e-03f, +1.652396156e-02f, +7.635163059e-03f, -5.946934842e-03f, -1.681520007e-04f, +2.954664371e-03f, -1.649294283e-03f, -5.744061304e-04f, +1.214554775e-03f, -4.312297312e-04f, -3.430832150e-04f, +3.954332952e-04f, -7.326442817e-05f, -1.100394411e-04f, +7.714542216e-05f, -8.508092032e-06f, +0.000000000e+00f, + +0.000000000e+00f, -1.344290287e-05f, -1.872637353e-03f, +4.557180766e-03f, -1.960807025e-03f, -7.779783213e-03f, +1.465229990e-02f, -4.928885556e-03f, -1.817482392e-02f, +2.939165473e-02f, -8.196886804e-03f, -3.006055650e-02f, +4.314870570e-02f, -1.014889134e-02f, -3.795789472e-02f, +4.898773536e-02f, -9.723512442e-03f, -3.755769556e-02f, +4.367937612e-02f, -7.233938712e-03f, -2.903361569e-02f, +3.020891721e-02f, -4.075214748e-03f, -1.693789334e-02f, +1.542743931e-02f, -1.630516961e-03f, -6.754203310e-03f, +5.068473347e-03f, -4.072314483e-04f, -1.276768860e-03f, +5.011279746e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.844002441e-05f, -7.938613329e-05f, -1.588293267e-04f, +4.950287292e-04f, -3.991338273e-04f, -4.275181090e-04f, +1.303147295e-03f, -9.738411283e-04f, -7.882436644e-04f, +2.329243902e-03f, -1.636531151e-03f, -1.096309781e-03f, +3.134707495e-03f, -2.083511266e-03f, -1.191715659e-03f, +3.296847912e-03f, -2.077060559e-03f, -1.016829376e-03f, +2.724151392e-03f, -1.624681845e-03f, -6.640600564e-04f, +1.728447016e-03f, -9.707699758e-04f, -3.067745716e-04f, +7.855970127e-04f, -4.104054317e-04f, -7.616357881e-05f, +2.067825811e-04f, -9.689578485e-05f, +8.508092032e-06f, +0.000000000e+00f, + /* 11, 6 (32) */ + +0.000000000e+00f, -4.499712153e-05f, +1.749161279e-03f, -2.382209019e-03f, -1.801027891e-03f, +8.166284447e-03f, -5.848302367e-03f, -1.015762513e-02f, +2.324593974e-02f, -6.945075168e-03f, -3.592135768e-02f, +5.426979896e-02f, +7.104591091e-03f, -1.296199964e-01f, +1.838066565e-01f, +6.204619405e-01f, +3.883198572e-01f, -7.761676906e-02f, -6.406383185e-02f, +6.850505494e-02f, -9.160713861e-03f, -3.017258482e-02f, +2.303368059e-02f, +2.161592427e-03f, -1.307916009e-02f, +6.399274535e-03f, +2.497199346e-03f, -3.999243334e-03f, +1.013532239e-03f, +7.987058865e-04f, -5.096360667e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.536343650e-05f, +5.284803911e-06f, +1.840470753e-04f, -2.818077408e-04f, -7.580396313e-05f, +7.245342347e-04f, -7.201819531e-04f, -5.859576958e-04f, +2.052233720e-03f, -1.225972263e-03f, -2.526586220e-03f, +5.355864460e-03f, -5.867703010e-04f, -1.669725689e-02f, -5.357031680e-03f, +1.626728294e-02f, +8.236754752e-03f, -5.848087598e-03f, -4.467660161e-04f, +3.051675980e-03f, -1.560566567e-03f, -6.789884160e-04f, +1.231283832e-03f, -3.874766561e-04f, -3.778511793e-04f, +3.957698464e-04f, -5.851081077e-05f, -1.185368192e-04f, +7.695366797e-05f, -6.229758273e-06f, +0.000000000e+00f, + +0.000000000e+00f, +4.499712153e-05f, -1.952023486e-03f, +4.398351440e-03f, -1.465778295e-03f, -8.178917040e-03f, +1.422478179e-02f, -3.625738261e-03f, -1.914866505e-02f, +2.860341107e-02f, -5.867642902e-03f, -3.169708765e-02f, +4.205239592e-02f, -7.014183843e-03f, -4.004140599e-02f, +4.779601970e-02f, -6.426664530e-03f, -3.963475612e-02f, +4.266254675e-02f, -4.509787320e-03f, -3.065829754e-02f, +2.954485715e-02f, -2.346767732e-03f, -1.790866331e-02f, +1.512066474e-02f, -8.449199480e-04f, -7.164608742e-03f, +4.992309768e-03f, -2.004488672e-04f, -1.373664645e-03f, +5.096360667e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.536343650e-05f, -6.684145543e-05f, -1.739265019e-04f, +4.886888339e-04f, -3.544755813e-04f, -4.815149239e-04f, +1.298335032e-03f, -8.784090850e-04f, -9.023851319e-04f, +2.333290406e-03f, -1.489060860e-03f, -1.270344836e-03f, +3.153243872e-03f, -1.908074638e-03f, -1.395961915e-03f, +3.328842288e-03f, -1.913289705e-03f, -1.205054076e-03f, +2.761391756e-03f, -1.505872406e-03f, -7.991108973e-04f, +1.760428988e-03f, -9.068248614e-04f, -3.790333387e-04f, +8.058454924e-04f, -3.881112511e-04f, -1.017047819e-04f, +2.155348307e-04f, -9.437717204e-05f, +6.229758273e-06f, +0.000000000e+00f, + /* 11, 7 (32) */ + +0.000000000e+00f, -1.003605580e-04f, +1.754446083e-03f, -2.198161944e-03f, -2.082835632e-03f, +8.090480484e-03f, -5.123768133e-03f, -1.087780708e-02f, +2.265998204e-02f, -4.892841448e-03f, -3.714732995e-02f, +5.174321274e-02f, +1.246045555e-02f, -1.302067667e-01f, +1.671093996e-01f, +6.151049088e-01f, +4.045871401e-01f, -6.938001431e-02f, -6.991191945e-02f, +6.805828893e-02f, -6.109037881e-03f, -3.173315139e-02f, +2.235469217e-02f, +3.392876260e-03f, -1.346663674e-02f, +6.021423355e-03f, +2.892969192e-03f, -4.057754145e-03f, +8.949954200e-04f, +8.756595545e-04f, -5.158658249e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.215113274e-05f, -2.492983095e-06f, +1.873179974e-04f, -2.654533980e-04f, -1.065926770e-04f, +7.286451315e-04f, -6.616957344e-04f, -6.640900180e-04f, +2.031590404e-03f, -1.055513877e-03f, -2.677308242e-03f, +5.179525972e-03f, -6.088818554e-05f, -1.647919551e-02f, -6.146083796e-03f, +1.597363417e-02f, +8.832704308e-03f, -5.724321760e-03f, -7.298188369e-04f, +3.138511745e-03f, -1.463812955e-03f, -7.829078243e-04f, +1.243325345e-03f, -3.411517215e-04f, -4.118760385e-04f, +3.944292323e-04f, -4.305473184e-05f, -1.267934984e-04f, +7.637387715e-05f, -3.786403335e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.003605580e-04f, -2.018864941e-03f, +4.224424938e-03f, -9.770894616e-04f, -8.533392621e-03f, +1.374326687e-02f, -2.327403229e-03f, -2.002707413e-02f, +2.770102594e-02f, -3.534352496e-03f, -3.318614851e-02f, +4.078205108e-02f, -3.860939971e-03f, -4.194948063e-02f, +4.640005779e-02f, -3.097822242e-03f, -4.154804582e-02f, +4.145749267e-02f, -1.748395563e-03f, -3.216416994e-02f, +2.874574625e-02f, -5.863387437e-04f, -1.881548818e-02f, +1.474163140e-02f, -3.907445562e-05f, -7.552719993e-03f, +4.890604986e-03f, +1.508596358e-05f, -1.468041817e-03f, +5.158658249e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.215113274e-05f, -5.442997476e-05f, -1.877371019e-04f, +4.802657043e-04f, -3.091821714e-04f, -5.323830676e-04f, +1.287876920e-03f, -7.803870073e-04f, -1.011334890e-03f, +2.327155243e-03f, -1.336183052e-03f, -1.437939937e-03f, +3.158055539e-03f, -1.724722939e-03f, -1.594091349e-03f, +3.346441362e-03f, -1.740719604e-03f, -1.388916364e-03f, +2.786820098e-03f, -1.379479749e-03f, -9.320345641e-04f, +1.785017248e-03f, -8.378908291e-04f, -4.508455358e-04f, +8.228292131e-04f, -3.634660170e-04f, -1.274997434e-04f, +2.235041847e-04f, -9.121070548e-05f, +3.786403335e-06f, +0.000000000e+00f, + /* 11, 8 (32) */ + +0.000000000e+00f, -1.525116908e-04f, +1.751953100e-03f, -2.010843946e-03f, -2.348289030e-03f, +7.983887807e-03f, -4.395123001e-03f, -1.153950282e-02f, +2.199589203e-02f, -2.861251044e-03f, -3.820284382e-02f, +4.906590450e-02f, +1.763998152e-02f, -1.302676549e-01f, +1.506302041e-01f, +6.089588250e-01f, +4.205607743e-01f, -6.054731000e-02f, -7.563624121e-02f, +6.732847009e-02f, -2.970526136e-03f, -3.319696434e-02f, +2.157178435e-02f, +4.636201605e-03f, -1.380778847e-02f, +5.609547317e-03f, +3.287398424e-03f, -4.100808877e-03f, +7.682019216e-04f, +9.520334316e-04f, -5.196522283e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.882517833e-05f, -9.972998001e-06f, +1.896806238e-04f, -2.484354947e-04f, -1.361874172e-04f, +7.297052001e-04f, -6.017714024e-04f, -7.380204988e-04f, +2.003308442e-03f, -8.842517829e-04f, -2.814542149e-03f, +4.987790445e-03f, +4.490746814e-04f, -1.622857046e-02f, -6.920291785e-03f, +1.564347125e-02f, +9.421272433e-03f, -5.575448640e-03f, -1.016325899e-03f, +3.214626626e-03f, -1.359265091e-03f, -8.857288567e-04f, +1.250533532e-03f, -2.923921239e-04f, -4.449958816e-04f, +3.913735697e-04f, -2.694470422e-05f, -1.347627424e-04f, +7.539367768e-05f, -1.184686737e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.525116908e-04f, -2.073294916e-03f, +4.036687836e-03f, -4.968237572e-04f, -8.842574792e-03f, +1.321088380e-02f, -1.039526309e-03f, -2.080746114e-02f, +2.668969105e-02f, -1.207197253e-03f, -3.452233157e-02f, +3.934411115e-02f, -7.028844317e-04f, -4.367420357e-02f, +4.480596644e-02f, +2.486191205e-04f, -4.328876543e-02f, +4.006857631e-02f, +1.038424535e-03f, -3.354364969e-02f, +2.781371169e-02f, +1.198678504e-03f, -1.965337901e-02f, +1.429078587e-02f, +7.837547575e-04f, -7.916186010e-03f, +4.763105243e-03f, +2.385901483e-04f, -1.559252523e-03f, +5.196522283e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.882517833e-05f, -4.221200833e-05f, -2.002309966e-04f, +4.698504283e-04f, -2.634754778e-04f, -5.799482627e-04f, +1.271906527e-03f, -6.802447451e-04f, -1.114667396e-03f, +2.310956446e-03f, -1.178608129e-03f, -1.598394050e-03f, +3.149171460e-03f, -1.534275501e-03f, -1.785237499e-03f, +3.349549514e-03f, -1.560083072e-03f, -1.567585990e-03f, +2.800248911e-03f, -1.246002744e-03f, -1.062216482e-03f, +1.802011045e-03f, -7.642079094e-04f, -5.218742281e-04f, +8.364036307e-04f, -3.365319592e-04f, -1.534281255e-04f, +2.306229360e-04f, -8.738863370e-05f, +1.184686737e-06f, +0.000000000e+00f, + /* 11, 9 (32) */ + +0.000000000e+00f, -2.013368691e-04f, +1.741980102e-03f, -1.821163323e-03f, -2.596724524e-03f, +7.847700390e-03f, -3.665417801e-03f, -1.214127422e-02f, +2.125787153e-02f, -8.579426022e-04f, -3.908709561e-02f, +4.625136235e-02f, +2.262777197e-02f, -1.298185802e-01f, +1.344016336e-01f, +6.020385332e-01f, +4.362042455e-01f, -5.112603756e-02f, -8.121168985e-02f, +6.631214419e-02f, +2.441004899e-04f, -3.455622943e-02f, +2.068605549e-02f, +5.886735136e-03f, -1.410018059e-02f, +5.164551435e-03f, +3.678771994e-03f, -4.127753581e-03f, +6.334391792e-04f, +1.027427109e-03f, -5.208369150e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.540741818e-05f, -1.713070666e-05f, +1.911519052e-04f, -2.308444587e-04f, -1.644932940e-04f, +7.277775432e-04f, -5.406817511e-04f, -8.075352641e-04f, +1.967645963e-03f, -7.128689572e-04f, -2.938038908e-03f, +4.781701836e-03f, +9.419548641e-04f, -1.594640601e-02f, -7.677809727e-03f, +1.527735383e-02f, +1.000072017e-02f, -5.401358006e-03f, -1.305269933e-03f, +3.279506782e-03f, -1.247190160e-03f, -9.870120801e-04f, +1.252779690e-03f, -2.413482406e-04f, -4.770489483e-04f, +3.865715585e-04f, -1.023357321e-05f, -1.423977072e-04f, +7.400231112e-05f, +1.567542367e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.013368691e-04f, -2.115506924e-03f, +3.836456839e-03f, -2.697332892e-05f, -9.106050270e-03f, +1.263093554e-02f, +2.323802171e-04f, -2.148770588e-02f, +2.557502365e-02f, +1.103759193e-03f, -3.570093969e-02f, +3.774571710e-02f, +2.446287029e-03f, -4.520847907e-02f, +4.302072894e-02f, +3.598168635e-03f, -4.484884850e-02f, +3.850099032e-02f, +3.838673446e-03f, -3.478965244e-02f, +2.675149521e-02f, +3.000689549e-03f, -2.041758691e-02f, +1.376891164e-02f, +1.620158388e-03f, -8.252717969e-03f, +4.609677117e-03f, +4.692130843e-04f, -1.646641156e-03f, +5.208369150e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.540741818e-05f, -3.024489743e-05f, -2.113854967e-04f, +4.575415349e-04f, -2.175747863e-04f, -6.240545397e-04f, +1.250580530e-03f, -5.784557033e-04f, -1.211986895e-03f, +2.284855957e-03f, -1.017062415e-03f, -1.751041576e-03f, +3.126681251e-03f, -1.337581486e-03f, -1.968565202e-03f, +3.338135339e-03f, -1.372150902e-03f, -1.740252096e-03f, +2.801543206e-03f, -1.105976113e-03f, -1.189048365e-03f, +1.811241825e-03f, -6.860413896e-04f, -5.917805257e-04f, +8.464375711e-04f, -3.073838501e-04f, -1.793657373e-04f, +2.368258200e-04f, -8.290674739e-05f, -1.567542367e-06f, +0.000000000e+00f, + /* 11,10 (32) */ + +0.000000000e+00f, -2.467442873e-04f, +1.724849395e-03f, -1.630011418e-03f, -2.827568983e-03f, +7.683207096e-03f, -2.937640258e-03f, -1.268195597e-02f, +2.045033626e-02f, +1.109703361e-03f, -3.979996456e-02f, +4.331332344e-02f, +2.740947380e-02f, -1.288766254e-01f, +1.184552276e-01f, +5.943607235e-01f, +4.514815994e-01f, -4.112531739e-02f, -8.661304785e-02f, +6.500687426e-02f, +3.523607271e-03f, -3.580341959e-02f, +1.969904341e-02f, +7.139514826e-03f, -1.434152883e-02f, +4.687502487e-03f, +4.065343553e-03f, -4.137987154e-03f, +4.910414720e-04f, +1.101429420e-03f, -5.192693727e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.191937002e-05f, -2.394391249e-05f, +1.917523215e-04f, -2.127708687e-04f, -1.914231114e-04f, +7.229363140e-04f, -4.786988118e-04f, -8.724423452e-04f, +1.924885491e-03f, -5.420360887e-04f, -3.047605643e-03f, +4.562332588e-03f, +1.416658454e-03f, -1.563380617e-02f, -8.416840753e-03f, +1.487594407e-02f, +1.056931432e-02f, -5.202019568e-03f, -1.595604045e-03f, +3.332672114e-03f, -1.127890466e-03f, -1.086315845e-03f, +1.249953064e-03f, -1.881832653e-04f, -5.078743329e-04f, +3.799987812e-04f, +7.021610511e-06f, -1.496516639e-04f, +7.219074135e-05f, +4.461247698e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.467442873e-04f, -2.145751822e-03f, +3.625071342e-03f, +4.305682060e-04f, -9.323625057e-03f, +1.200688100e-02f, +1.482960747e-03f, -2.206616159e-02f, +2.436303675e-02f, +3.388615151e-03f, -3.671800211e-02f, +3.599467552e-02f, +5.572968280e-03f, -4.654606055e-02f, +4.105216374e-02f, +6.936303974e-03f, -4.622099940e-02f, +3.676073822e-02f, +6.640216652e-03f, -3.589562855e-02f, +2.556244684e-02f, +4.811931374e-03f, -2.110362830e-02f, +1.317713111e-02f, +2.466595959e-03f, -8.560101819e-03f, +4.430311380e-03f, +7.060389043e-04f, -1.729547904e-03f, +5.192693727e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.191937002e-05f, -1.858278450e-05f, -2.211852757e-04f, +4.434443410e-04f, -1.716957904e-04f, -6.645646552e-04f, +1.224077651e-03f, -4.754946277e-04f, -1.302928899e-03f, +2.249058511e-03f, -8.522847680e-04f, -1.895255156e-03f, +3.090734556e-03f, -1.135516017e-03f, -2.143274330e-03f, +3.312231865e-03f, -1.177728500e-03f, -1.906126961e-03f, +2.790621447e-03f, -9.599682835e-04f, -1.311931067e-03f, +1.812574388e-03f, -6.036809243e-04f, -6.602251554e-04f, +8.528141140e-04f, -2.761089073e-04f, -2.051850750e-04f, +2.420504378e-04f, -7.776451838e-05f, -4.461247698e-06f, +0.000000000e+00f, + /* 11,11 (32) */ + +0.000000000e+00f, -2.886636573e-04f, +1.700905483e-03f, -1.438259096e-03f, -3.040339852e-03f, +7.491783984e-03f, -2.214703944e-03f, -1.316065478e-02f, +1.957789392e-02f, +3.034588851e-03f, -4.034200065e-02f, +4.026571780e-02f, +3.197180639e-02f, -1.274599669e-01f, +1.028214215e-01f, +5.859438828e-01f, +4.663575434e-01f, -3.055600307e-02f, -9.181506742e-02f, +6.341127021e-02f, +6.856279386e-03f, -3.693131006e-02f, +1.861272757e-02f, +8.389467890e-03f, -1.452971210e-02f, +4.179628154e-03f, +4.445342334e-03f, -4.130965543e-03f, +3.413898082e-04f, +1.173620162e-03f, -5.148081250e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.838212256e-05f, -3.039279260e-05f, +1.915056908e-04f, -1.943050510e-04f, -2.168975658e-04f, +7.152661720e-04f, -4.160927482e-04f, -9.325720438e-04f, +1.875332384e-03f, -3.724092127e-04f, -3.143105347e-03f, +4.330779522e-03f, +1.872163695e-03f, -1.529195075e-02f, -9.135642269e-03f, +1.444000501e-02f, +1.112533286e-02f, -4.977484209e-03f, -1.886254962e-03f, +3.373678725e-03f, -1.001702874e-03f, -1.183198043e-03f, +1.241961659e-03f, -1.330727827e-04f, -5.373127009e-04f, +3.716379788e-04f, +2.475974066e-05f, -1.564782272e-04f, +6.995175781e-05f, +7.486215084e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.886636573e-04f, -2.164334606e-03f, +3.403886067e-03f, +8.740125470e-04f, -9.495320847e-03f, +1.134231634e-02f, +2.707038398e-03f, -2.254165622e-02f, +2.306010786e-02f, +5.637673661e-03f, -3.757028688e-02f, +3.409942037e-02f, +8.663702835e-03f, -4.768157657e-02f, +3.890888941e-02f, +1.024853584e-02f, -4.739872790e-02f, +3.485461126e-02f, +9.430838100e-03f, -3.685559683e-02f, +2.425051577e-02f, +6.624505763e-03f, -2.170730923e-02f, +1.251690596e-02f, +3.319410073e-03f, -8.836210727e-03f, +4.225126305e-03f, +9.480893421e-04f, -1.807312422e-03f, +5.148081250e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.838212256e-05f, -7.276413694e-06f, -2.296222555e-04f, +4.276702774e-04f, -1.260496305e-04f, -7.013604142e-04f, +1.192597501e-03f, -3.718354120e-04f, -1.387161515e-03f, +2.203810330e-03f, -6.850231627e-04f, -2.030448288e-03f, +3.041540159e-03f, -9.289761989e-04f, -2.308603358e-03f, +3.271936477e-03f, -9.776523587e-04f, -2.064449652e-03f, +2.767456242e-03f, -8.085790630e-04f, -1.430277407e-03f, +1.805907898e-03f, -5.174395197e-04f, -7.268700597e-04f, +8.554314227e-04f, -2.428066312e-04f, -2.307558929e-04f, +2.462376742e-04f, -7.196522133e-05f, -7.486215084e-06f, +0.000000000e+00f, + /* 11,12 (32) */ + +0.000000000e+00f, -3.270457799e-04f, +1.670512690e-03f, -1.246753405e-03f, -3.234644903e-03f, +7.274886419e-03f, -1.499437772e-03f, -1.357674753e-02f, +1.864532187e-02f, +4.909921236e-03f, -4.071440986e-02f, +3.712261245e-02f, +3.630258591e-02f, -1.255878032e-01f, +8.752947072e-02f, +5.768082405e-01f, +4.807975485e-01f, -1.943067021e-02f, -9.679255163e-02f, +6.152501525e-02f, +1.022995811e-02f, -3.793301293e-02f, +1.742952952e-02f, +9.631429549e-03f, -1.466278488e-02f, +3.642315453e-03f, +4.816980313e-03f, -4.106205803e-03f, +1.849115809e-04f, +1.243571920e-03f, -5.073219099e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.481623894e-05f, -3.645992124e-05f, +1.904389678e-04f, -1.755366871e-04f, -2.408454052e-04f, +7.048617042e-04f, -3.531307794e-04f, -9.877771993e-04f, +1.819313209e-03f, -2.046274417e-04f, -3.224456389e-03f, +4.088159706e-03f, +2.307523354e-03f, -1.492209129e-02f, -9.832531001e-03f, +1.397039874e-02f, +1.166707039e-02f, -4.727884956e-03f, -2.176126409e-03f, +3.402121271e-03f, -8.689981039e-04f, -1.277217900e-03f, +1.228732987e-03f, -7.620428164e-05f, -5.652070128e-04f, +3.614793007e-04f, +4.291582785e-05f, -1.628315887e-04f, +6.728007231e-05f, +1.063106857e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.270457799e-04f, -2.171611020e-03f, +3.174263811e-03f, +1.301682824e-03f, -9.621370478e-03f, +1.064095593e-02f, +3.899635899e-03f, -2.291349163e-02f, +2.167294634e-02f, +7.841483992e-03f, -3.825531004e-02f, +3.206897208e-02f, +1.170524299e-02f, -4.861055277e-02f, +3.660028605e-02f, +1.352047232e-02f, -4.837638026e-02f, +3.279016161e-02f, +1.219829434e-02f, -3.766417590e-02f, +2.282023837e-02f, +8.430413660e-03f, -2.222474875e-02f, +1.179003590e-02f, +4.174841496e-03f, -9.079017358e-03f, +3.994370412e-03f, +1.194327016e-03f, -1.879277644e-03f, +5.073219099e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.481623894e-05f, +3.627044358e-06f, -2.366954563e-04f, +4.103362001e-04f, -8.084197358e-05f, -7.343428956e-04f, +1.156359346e-03f, -2.679489359e-04f, -1.464386609e-03f, +2.149397652e-03f, -5.160312554e-04f, -2.156077746e-03f, +2.979364830e-03f, -7.188770533e-04f, -2.463832767e-03f, +3.217410555e-03f, -7.727863800e-04f, -2.214489575e-03f, +2.732074795e-03f, -6.524371545e-04f, -1.543514979e-03f, +1.791176744e-03f, -4.276523932e-04f, -7.913800148e-04f, +8.542035150e-04f, -2.075885776e-04f, -2.559458012e-04f, +2.493321100e-04f, -6.551603683e-05f, -1.063106857e-05f, +0.000000000e+00f, + /* 11,13 (32) */ + +0.000000000e+00f, -3.618620188e-04f, +1.634052769e-03f, -1.056314437e-03f, -3.410181590e-03f, +7.034041013e-03f, -7.945760677e-04f, -1.392987831e-02f, +1.765754468e-02f, +6.729234444e-03f, -4.091903731e-02f, +3.389815606e-02f, +4.039074562e-02f, -1.232802799e-01f, +7.260737943e-02f, +5.669757095e-01f, +4.947679472e-01f, -7.763599815e-03f, -1.015204366e-01f, +5.934888884e-02f, +1.363207938e-02f, -3.880201104e-02f, +1.615231162e-02f, +1.086016254e-02f, -1.473898916e-02f, +3.077108440e-03f, +5.178459613e-03f, -4.063289975e-03f, +2.207999221e-05f, +1.310851992e-03f, -4.966908413e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.124166587e-05f, -4.213028094e-05f, +1.885820335e-04f, -1.565544333e-04f, -2.632035506e-04f, +6.918268172e-04f, -2.900761367e-04f, -1.037933360e-03f, +1.757174058e-03f, -3.931079982e-05f, -3.291631831e-03f, +3.835606308e-03f, +2.721866806e-03f, -1.452554670e-02f, -1.050588786e-02f, +1.346808420e-02f, +1.219284358e-02f, -4.453437683e-03f, -2.464102623e-03f, +3.417635218e-03f, -7.301798757e-04f, -1.367937793e-03f, +1.210214751e-03f, -1.777660704e-05f, -5.914032546e-04f, +3.495205277e-04f, +6.142119444e-05f, -1.686667536e-04f, +6.417240898e-05f, +1.388329353e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.618620188e-04f, -2.167983976e-03f, +2.937568355e-03f, +1.712019025e-03f, -9.702212451e-03f, +9.906613032e-03f, +5.055995245e-03f, -2.318144056e-02f, +2.020855973e-02f, +9.990881644e-03f, -3.877134130e-02f, +2.991289433e-02f, +1.468460782e-02f, -4.932942982e-02f, +3.413645328e-02f, +1.673788287e-02f, -4.914916664e-02f, +3.057567203e-02f, +1.493036914e-02f, -3.831661305e-02f, +2.127672339e-02f, +1.022159040e-02f, -2.265240114e-02f, +1.099865588e-02f, +5.029045011e-03f, -9.286605935e-03f, +3.738424611e-03f, +1.443659126e-03f, -1.944793680e-03f, +4.966908413e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.124166587e-05f, +1.408414334e-05f, -2.424108144e-04f, +3.915636883e-04f, -3.627213688e-05f, -7.634325823e-04f, +1.115600795e-03f, -1.643009442e-04f, -1.534340794e-03f, +2.086145071e-03f, -3.460649457e-04f, -2.271645788e-03f, +2.904531903e-03f, -5.061473728e-04f, -2.608288242e-03f, +3.148878810e-03f, -5.640180608e-04f, -2.355549894e-03f, +2.684559105e-03f, -4.921975209e-04f, -1.651088905e-03f, +1.768351253e-03f, -3.346757134e-04f, -8.534242601e-04f, +8.490609702e-04f, -1.705780658e-04f, -2.806208902e-04f, +2.512824241e-04f, -5.842813484e-05f, -1.388329353e-05f, +0.000000000e+00f, + /* 11,14 (32) */ + +0.000000000e+00f, -3.931036847e-04f, +1.591922488e-03f, -8.677324040e-04f, -3.566736023e-03f, +6.770837463e-03f, -1.027492505e-04f, -1.421995445e-02f, +1.661961131e-02f, +8.486408502e-03f, -4.095834811e-02f, +3.060652423e-02f, +4.422635193e-02f, -1.205584131e-01f, +5.808183272e-02f, +5.564698216e-01f, +5.082360314e-01f, +4.429243765e-03f, -1.059738743e-01f, +5.688478622e-02f, +1.704971460e-02f, -3.953219091e-02f, +1.478437383e-02f, +1.207037729e-02f, -1.475676577e-02f, +2.485705186e-03f, +5.527980141e-03f, -4.001868780e-03f, -1.465867614e-04f, +1.375024401e-03f, -4.828075478e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.767764884e-05f, -4.739126146e-05f, +1.859674759e-04f, -1.374455549e-04f, -2.839171791e-04f, +6.762741015e-04f, -2.271870567e-04f, -1.082938859e-03f, +1.689278822e-03f, +1.229418331e-04f, -3.344658553e-03f, +3.574264444e-03f, +3.114401859e-03f, -1.410369877e-02f, -1.115416257e-02f, +1.293411465e-02f, +1.270099653e-02f, -4.154441542e-03f, -2.749051993e-03f, +3.419898977e-03f, -5.856839105e-04f, -1.454925088e-03f, +1.186375451e-03f, +4.200064683e-05f, -6.157511698e-04f, +3.357672655e-04f, +8.020369137e-05f, -1.739397803e-04f, +6.062758652e-05f, +1.722926679e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.931036847e-04f, -2.153899832e-03f, +2.695157541e-03f, +2.103582713e-03f, -9.738484588e-03f, +9.143180449e-03f, +6.171596040e-03f, -2.334574151e-02f, +1.867421894e-02f, +1.207702671e-02f, -3.911740624e-02f, +2.764124854e-02f, +1.758913973e-02f, -4.983557720e-02f, +3.152816504e-02f, +1.988676168e-02f, -4.971318470e-02f, +2.822012214e-02f, +1.761492824e-02f, -3.880881057e-02f, +1.962563448e-02f, +1.198994166e-02f, -2.298707685e-02f, +1.014523162e-02f, +5.878105981e-03f, -9.457184001e-03f, +3.457803721e-03f, +1.694941550e-03f, -2.003221815e-03f, +4.828075478e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.767764884e-05f, +2.405528726e-05f, -2.467809675e-04f, +3.714783352e-04f, +7.467739994e-06f, -7.885693971e-04f, +1.070576424e-03f, -6.134997616e-05f, -1.596796259e-03f, +2.014413729e-03f, -1.758789525e-04f, -2.376702145e-03f, +2.817419619e-03f, -2.917255273e-04f, -2.741343672e-03f, +3.066628344e-03f, -3.522545645e-04f, -2.486970825e-03f, +2.625045922e-03f, -3.285386074e-04f, -1.752464547e-03f, +1.737438236e-03f, -2.388852243e-04f, -9.126781313e-04f, +8.399515688e-04f, -1.319098211e-04f, -3.046463754e-04f, +2.520417849e-04f, -5.071673752e-05f, -1.722926679e-05f, +0.000000000e+00f, + /* 11,15 (32) */ + +0.000000000e+00f, -4.207813335e-04f, +1.544531227e-03f, -6.817649281e-04f, -3.704181578e-03f, +6.486920284e-03f, +5.735248510e-04f, -1.444714150e-02f, +1.553667246e-02f, +1.017568732e-02f, -4.083540627e-02f, +2.726186568e-02f, +4.780061637e-02f, -1.174440112e-01f, +4.397813395e-02f, +5.453156591e-01f, +5.211701461e-01f, +1.713024030e-02f, -1.101283158e-01f, +5.413573422e-02f, +2.046961358e-02f, -4.011787482e-02f, +1.332944874e-02f, +1.325675274e-02f, -1.471476512e-02f, +1.869954016e-03f, +5.863747407e-03f, -3.921665089e-03f, -3.205265417e-04f, +1.435651987e-03f, -4.655782810e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.414265355e-05f, -5.223264705e-05f, +1.826303650e-04f, -1.182955744e-04f, -3.029397690e-04f, +6.583241727e-04f, -1.647158146e-04f, -1.122714796e-03f, +1.616007420e-03f, +2.815546607e-04f, -3.383616192e-03f, +3.305287055e-03f, +3.484416293e-03f, -1.365798748e-02f, -1.177587811e-02f, +1.236963488e-02f, +1.318990617e-02f, -3.831279116e-03f, -3.029830798e-03f, +3.408635909e-03f, -4.359767877e-04f, -1.537753995e-03f, +1.157204923e-03f, +1.029078014e-04f, -6.381049921e-04f, +3.202331082e-04f, +9.918793658e-05f, -1.786080213e-04f, +5.664659220e-05f, +2.065429392e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.207813335e-04f, -2.129844545e-03f, +2.448376573e-03f, +2.475061048e-03f, -9.731016848e-03f, +8.354611052e-03f, +7.242172463e-03f, -2.340709148e-02f, +1.707742268e-02f, +1.409144044e-02f, -3.929328519e-02f, +2.526454640e-02f, +2.040655935e-02f, -5.012730272e-02f, +2.878682137e-02f, +2.295339003e-02f, -5.006543927e-02f, +2.573315131e-02f, +2.023997416e-02f, -3.913734918e-02f, +1.787316994e-02f, +1.372737989e-02f, -2.322596208e-02f, +9.232553493e-03f, +6.718057550e-03f, -9.589093822e-03f, +3.153157345e-03f, +1.946983335e-03f, -2.053938553e-03f, +4.655782810e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.414265355e-05f, +3.350483173e-05f, -2.498250112e-04f, +3.502090341e-04f, +5.019347232e-05f, -8.097126439e-04f, +1.021556339e-03f, +4.045464573e-05f, -1.651561414e-03f, +1.934599351e-03f, -6.223419220e-06f, -2.470845787e-03f, +2.718459209e-03f, -7.655523313e-05f, -2.862423931e-03f, +2.971007414e-03f, -1.384186910e-04f, -2.608132755e-03f, +2.553726448e-03f, -1.621594355e-04f, -1.847130142e-03f, +1.698481370e-03f, -1.406747584e-04f, -9.688246898e-04f, +8.268408584e-04f, -9.172955338e-05f, -3.278872634e-04f, +2.515682268e-04f, -4.240116050e-05f, -2.065429392e-05f, +0.000000000e+00f, + /* 11,16 (32) */ + +0.000000000e+00f, -4.449239871e-04f, +1.492298580e-03f, -4.991345630e-04f, -3.822477153e-03f, +6.183980515e-03f, +1.231849024e-03f, -1.461185732e-02f, +1.441395766e-02f, +1.179169475e-02f, -4.055385161e-02f, +2.387824949e-02f, +5.110590343e-02f, -1.139595949e-01f, +3.032014646e-02f, +5.335397809e-01f, +5.335397809e-01f, +3.032014646e-02f, -1.139595949e-01f, +5.110590343e-02f, +2.387824949e-02f, -4.055385161e-02f, +1.179169475e-02f, +1.441395766e-02f, -1.461185732e-02f, +1.231849024e-03f, +6.183980515e-03f, -3.822477153e-03f, -4.991345630e-04f, +1.492298580e-03f, -4.449239871e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.065429392e-05f, -5.664659220e-05f, +1.786080213e-04f, -9.918793658e-05f, -3.202331082e-04f, +6.381049921e-04f, -1.029078014e-04f, -1.157204923e-03f, +1.537753995e-03f, +4.359767877e-04f, -3.408635909e-03f, +3.029830798e-03f, +3.831279116e-03f, -1.318990617e-02f, -1.236963488e-02f, +1.177587811e-02f, +1.365798748e-02f, -3.484416293e-03f, -3.305287055e-03f, +3.383616192e-03f, -2.815546607e-04f, -1.616007420e-03f, +1.122714796e-03f, +1.647158146e-04f, -6.583241727e-04f, +3.029397690e-04f, +1.182955744e-04f, -1.826303650e-04f, +5.223264705e-05f, +2.414265355e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.449239871e-04f, -2.096339713e-03f, +2.198551562e-03f, +2.825270082e-03f, -9.680823376e-03f, +7.544898408e-03f, +8.263728803e-03f, -2.336663684e-02f, +1.542586126e-02f, +1.602603979e-02f, -3.929950861e-02f, +2.279370061e-02f, +2.312501856e-02f, -5.020385796e-02f, +2.592439744e-02f, +2.592439744e-02f, -5.020385796e-02f, +2.312501856e-02f, +2.279370061e-02f, -3.929950861e-02f, +1.602603979e-02f, +1.542586126e-02f, -2.336663684e-02f, +8.263728803e-03f, +7.544898408e-03f, -9.680823376e-03f, +2.825270082e-03f, +2.198551562e-03f, -2.096339713e-03f, +4.449239871e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.065429392e-05f, +4.240116050e-05f, -2.515682268e-04f, +3.278872634e-04f, +9.172955338e-05f, -8.268408584e-04f, +9.688246898e-04f, +1.406747584e-04f, -1.698481370e-03f, +1.847130142e-03f, +1.621594355e-04f, -2.553726448e-03f, +2.608132755e-03f, +1.384186910e-04f, -2.971007414e-03f, +2.862423931e-03f, +7.655523313e-05f, -2.718459209e-03f, +2.470845787e-03f, +6.223419220e-06f, -1.934599351e-03f, +1.651561414e-03f, -4.045464573e-05f, -1.021556339e-03f, +8.097126439e-04f, -5.019347232e-05f, -3.502090341e-04f, +2.498250112e-04f, -3.350483173e-05f, -2.414265355e-05f, +0.000000000e+00f, + /* 11,17 (32) */ + +0.000000000e+00f, -4.655782810e-04f, +1.435651987e-03f, -3.205265417e-04f, -3.921665089e-03f, +5.863747407e-03f, +1.869954016e-03f, -1.471476512e-02f, +1.325675274e-02f, +1.332944874e-02f, -4.011787482e-02f, +2.046961358e-02f, +5.413573422e-02f, -1.101283158e-01f, +1.713024030e-02f, +5.211701461e-01f, +5.453156591e-01f, +4.397813395e-02f, -1.174440112e-01f, +4.780061637e-02f, +2.726186568e-02f, -4.083540627e-02f, +1.017568732e-02f, +1.553667246e-02f, -1.444714150e-02f, +5.735248510e-04f, +6.486920284e-03f, -3.704181578e-03f, -6.817649281e-04f, +1.544531227e-03f, -4.207813335e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.722926679e-05f, -6.062758652e-05f, +1.739397803e-04f, -8.020369137e-05f, -3.357672655e-04f, +6.157511698e-04f, -4.200064683e-05f, -1.186375451e-03f, +1.454925088e-03f, +5.856839105e-04f, -3.419898977e-03f, +2.749051993e-03f, +4.154441542e-03f, -1.270099653e-02f, -1.293411465e-02f, +1.115416257e-02f, +1.410369877e-02f, -3.114401859e-03f, -3.574264444e-03f, +3.344658553e-03f, -1.229418331e-04f, -1.689278822e-03f, +1.082938859e-03f, +2.271870567e-04f, -6.762741015e-04f, +2.839171791e-04f, +1.374455549e-04f, -1.859674759e-04f, +4.739126146e-05f, +2.767764884e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.655782810e-04f, -2.053938553e-03f, +1.946983335e-03f, +3.153157345e-03f, -9.589093822e-03f, +6.718057550e-03f, +9.232553493e-03f, -2.322596208e-02f, +1.372737989e-02f, +1.787316994e-02f, -3.913734918e-02f, +2.023997416e-02f, +2.573315131e-02f, -5.006543927e-02f, +2.295339003e-02f, +2.878682137e-02f, -5.012730272e-02f, +2.040655935e-02f, +2.526454640e-02f, -3.929328519e-02f, +1.409144044e-02f, +1.707742268e-02f, -2.340709148e-02f, +7.242172463e-03f, +8.354611052e-03f, -9.731016848e-03f, +2.475061048e-03f, +2.448376573e-03f, -2.129844545e-03f, +4.207813335e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.722926679e-05f, +5.071673752e-05f, -2.520417849e-04f, +3.046463754e-04f, +1.319098211e-04f, -8.399515688e-04f, +9.126781313e-04f, +2.388852243e-04f, -1.737438236e-03f, +1.752464547e-03f, +3.285386074e-04f, -2.625045922e-03f, +2.486970825e-03f, +3.522545645e-04f, -3.066628344e-03f, +2.741343672e-03f, +2.917255273e-04f, -2.817419619e-03f, +2.376702145e-03f, +1.758789525e-04f, -2.014413729e-03f, +1.596796259e-03f, +6.134997616e-05f, -1.070576424e-03f, +7.885693971e-04f, -7.467739994e-06f, -3.714783352e-04f, +2.467809675e-04f, -2.405528726e-05f, -2.767764884e-05f, +0.000000000e+00f, + /* 11,18 (32) */ + +0.000000000e+00f, -4.828075478e-04f, +1.375024401e-03f, -1.465867614e-04f, -4.001868780e-03f, +5.527980141e-03f, +2.485705186e-03f, -1.475676577e-02f, +1.207037729e-02f, +1.478437383e-02f, -3.953219091e-02f, +1.704971460e-02f, +5.688478622e-02f, -1.059738743e-01f, +4.429243765e-03f, +5.082360314e-01f, +5.564698216e-01f, +5.808183272e-02f, -1.205584131e-01f, +4.422635193e-02f, +3.060652423e-02f, -4.095834811e-02f, +8.486408502e-03f, +1.661961131e-02f, -1.421995445e-02f, -1.027492505e-04f, +6.770837463e-03f, -3.566736023e-03f, -8.677324040e-04f, +1.591922488e-03f, -3.931036847e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.388329353e-05f, -6.417240898e-05f, +1.686667536e-04f, -6.142119444e-05f, -3.495205277e-04f, +5.914032546e-04f, +1.777660704e-05f, -1.210214751e-03f, +1.367937793e-03f, +7.301798757e-04f, -3.417635218e-03f, +2.464102623e-03f, +4.453437683e-03f, -1.219284358e-02f, -1.346808420e-02f, +1.050588786e-02f, +1.452554670e-02f, -2.721866806e-03f, -3.835606308e-03f, +3.291631831e-03f, +3.931079982e-05f, -1.757174058e-03f, +1.037933360e-03f, +2.900761367e-04f, -6.918268172e-04f, +2.632035506e-04f, +1.565544333e-04f, -1.885820335e-04f, +4.213028094e-05f, +3.124166587e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.828075478e-04f, -2.003221815e-03f, +1.694941550e-03f, +3.457803721e-03f, -9.457184001e-03f, +5.878105981e-03f, +1.014523162e-02f, -2.298707685e-02f, +1.198994166e-02f, +1.962563448e-02f, -3.880881057e-02f, +1.761492824e-02f, +2.822012214e-02f, -4.971318470e-02f, +1.988676168e-02f, +3.152816504e-02f, -4.983557720e-02f, +1.758913973e-02f, +2.764124854e-02f, -3.911740624e-02f, +1.207702671e-02f, +1.867421894e-02f, -2.334574151e-02f, +6.171596040e-03f, +9.143180449e-03f, -9.738484588e-03f, +2.103582713e-03f, +2.695157541e-03f, -2.153899832e-03f, +3.931036847e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.388329353e-05f, +5.842813484e-05f, -2.512824241e-04f, +2.806208902e-04f, +1.705780658e-04f, -8.490609702e-04f, +8.534242601e-04f, +3.346757134e-04f, -1.768351253e-03f, +1.651088905e-03f, +4.921975209e-04f, -2.684559105e-03f, +2.355549894e-03f, +5.640180608e-04f, -3.148878810e-03f, +2.608288242e-03f, +5.061473728e-04f, -2.904531903e-03f, +2.271645788e-03f, +3.460649457e-04f, -2.086145071e-03f, +1.534340794e-03f, +1.643009442e-04f, -1.115600795e-03f, +7.634325823e-04f, +3.627213688e-05f, -3.915636883e-04f, +2.424108144e-04f, -1.408414334e-05f, -3.124166587e-05f, +0.000000000e+00f, + /* 11,19 (32) */ + +0.000000000e+00f, -4.966908413e-04f, +1.310851992e-03f, +2.207999221e-05f, -4.063289975e-03f, +5.178459613e-03f, +3.077108440e-03f, -1.473898916e-02f, +1.086016254e-02f, +1.615231162e-02f, -3.880201104e-02f, +1.363207938e-02f, +5.934888884e-02f, -1.015204366e-01f, -7.763599815e-03f, +4.947679472e-01f, +5.669757095e-01f, +7.260737943e-02f, -1.232802799e-01f, +4.039074562e-02f, +3.389815606e-02f, -4.091903731e-02f, +6.729234444e-03f, +1.765754468e-02f, -1.392987831e-02f, -7.945760677e-04f, +7.034041013e-03f, -3.410181590e-03f, -1.056314437e-03f, +1.634052769e-03f, -3.618620188e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.063106857e-05f, -6.728007231e-05f, +1.628315887e-04f, -4.291582785e-05f, -3.614793007e-04f, +5.652070128e-04f, +7.620428164e-05f, -1.228732987e-03f, +1.277217900e-03f, +8.689981039e-04f, -3.402121271e-03f, +2.176126409e-03f, +4.727884956e-03f, -1.166707039e-02f, -1.397039874e-02f, +9.832531001e-03f, +1.492209129e-02f, -2.307523354e-03f, -4.088159706e-03f, +3.224456389e-03f, +2.046274417e-04f, -1.819313209e-03f, +9.877771993e-04f, +3.531307794e-04f, -7.048617042e-04f, +2.408454052e-04f, +1.755366871e-04f, -1.904389678e-04f, +3.645992124e-05f, +3.481623894e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.966908413e-04f, -1.944793680e-03f, +1.443659126e-03f, +3.738424611e-03f, -9.286605935e-03f, +5.029045011e-03f, +1.099865588e-02f, -2.265240114e-02f, +1.022159040e-02f, +2.127672339e-02f, -3.831661305e-02f, +1.493036914e-02f, +3.057567203e-02f, -4.914916664e-02f, +1.673788287e-02f, +3.413645328e-02f, -4.932942982e-02f, +1.468460782e-02f, +2.991289433e-02f, -3.877134130e-02f, +9.990881644e-03f, +2.020855973e-02f, -2.318144056e-02f, +5.055995245e-03f, +9.906613032e-03f, -9.702212451e-03f, +1.712019025e-03f, +2.937568355e-03f, -2.167983976e-03f, +3.618620188e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.063106857e-05f, +6.551603683e-05f, -2.493321100e-04f, +2.559458012e-04f, +2.075885776e-04f, -8.542035150e-04f, +7.913800148e-04f, +4.276523932e-04f, -1.791176744e-03f, +1.543514979e-03f, +6.524371545e-04f, -2.732074795e-03f, +2.214489575e-03f, +7.727863800e-04f, -3.217410555e-03f, +2.463832767e-03f, +7.188770533e-04f, -2.979364830e-03f, +2.156077746e-03f, +5.160312554e-04f, -2.149397652e-03f, +1.464386609e-03f, +2.679489359e-04f, -1.156359346e-03f, +7.343428956e-04f, +8.084197358e-05f, -4.103362001e-04f, +2.366954563e-04f, -3.627044358e-06f, -3.481623894e-05f, +0.000000000e+00f, + /* 11,20 (32) */ + +0.000000000e+00f, -5.073219099e-04f, +1.243571920e-03f, +1.849115809e-04f, -4.106205803e-03f, +4.816980313e-03f, +3.642315453e-03f, -1.466278488e-02f, +9.631429549e-03f, +1.742952952e-02f, -3.793301293e-02f, +1.022995811e-02f, +6.152501525e-02f, -9.679255163e-02f, -1.943067021e-02f, +4.807975485e-01f, +5.768082405e-01f, +8.752947072e-02f, -1.255878032e-01f, +3.630258591e-02f, +3.712261245e-02f, -4.071440986e-02f, +4.909921236e-03f, +1.864532187e-02f, -1.357674753e-02f, -1.499437772e-03f, +7.274886419e-03f, -3.234644903e-03f, -1.246753405e-03f, +1.670512690e-03f, -3.270457799e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.486215084e-06f, -6.995175781e-05f, +1.564782272e-04f, -2.475974066e-05f, -3.716379788e-04f, +5.373127009e-04f, +1.330727827e-04f, -1.241961659e-03f, +1.183198043e-03f, +1.001702874e-03f, -3.373678725e-03f, +1.886254962e-03f, +4.977484209e-03f, -1.112533286e-02f, -1.444000501e-02f, +9.135642269e-03f, +1.529195075e-02f, -1.872163695e-03f, -4.330779522e-03f, +3.143105347e-03f, +3.724092127e-04f, -1.875332384e-03f, +9.325720438e-04f, +4.160927482e-04f, -7.152661720e-04f, +2.168975658e-04f, +1.943050510e-04f, -1.915056908e-04f, +3.039279260e-05f, +3.838212256e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.073219099e-04f, -1.879277644e-03f, +1.194327016e-03f, +3.994370412e-03f, -9.079017358e-03f, +4.174841496e-03f, +1.179003590e-02f, -2.222474875e-02f, +8.430413660e-03f, +2.282023837e-02f, -3.766417590e-02f, +1.219829434e-02f, +3.279016161e-02f, -4.837638026e-02f, +1.352047232e-02f, +3.660028605e-02f, -4.861055277e-02f, +1.170524299e-02f, +3.206897208e-02f, -3.825531004e-02f, +7.841483992e-03f, +2.167294634e-02f, -2.291349163e-02f, +3.899635899e-03f, +1.064095593e-02f, -9.621370478e-03f, +1.301682824e-03f, +3.174263811e-03f, -2.171611020e-03f, +3.270457799e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.486215084e-06f, +7.196522133e-05f, -2.462376742e-04f, +2.307558929e-04f, +2.428066312e-04f, -8.554314227e-04f, +7.268700597e-04f, +5.174395197e-04f, -1.805907898e-03f, +1.430277407e-03f, +8.085790630e-04f, -2.767456242e-03f, +2.064449652e-03f, +9.776523587e-04f, -3.271936477e-03f, +2.308603358e-03f, +9.289761989e-04f, -3.041540159e-03f, +2.030448288e-03f, +6.850231627e-04f, -2.203810330e-03f, +1.387161515e-03f, +3.718354120e-04f, -1.192597501e-03f, +7.013604142e-04f, +1.260496305e-04f, -4.276702774e-04f, +2.296222555e-04f, +7.276413694e-06f, -3.838212256e-05f, +0.000000000e+00f, + /* 11,21 (32) */ + +0.000000000e+00f, -5.148081250e-04f, +1.173620162e-03f, +3.413898082e-04f, -4.130965543e-03f, +4.445342334e-03f, +4.179628154e-03f, -1.452971210e-02f, +8.389467890e-03f, +1.861272757e-02f, -3.693131006e-02f, +6.856279386e-03f, +6.341127021e-02f, -9.181506742e-02f, -3.055600307e-02f, +4.663575434e-01f, +5.859438828e-01f, +1.028214215e-01f, -1.274599669e-01f, +3.197180639e-02f, +4.026571780e-02f, -4.034200065e-02f, +3.034588851e-03f, +1.957789392e-02f, -1.316065478e-02f, -2.214703944e-03f, +7.491783984e-03f, -3.040339852e-03f, -1.438259096e-03f, +1.700905483e-03f, -2.886636573e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.461247698e-06f, -7.219074135e-05f, +1.496516639e-04f, -7.021610511e-06f, -3.799987812e-04f, +5.078743329e-04f, +1.881832653e-04f, -1.249953064e-03f, +1.086315845e-03f, +1.127890466e-03f, -3.332672114e-03f, +1.595604045e-03f, +5.202019568e-03f, -1.056931432e-02f, -1.487594407e-02f, +8.416840753e-03f, +1.563380617e-02f, -1.416658454e-03f, -4.562332588e-03f, +3.047605643e-03f, +5.420360887e-04f, -1.924885491e-03f, +8.724423452e-04f, +4.786988118e-04f, -7.229363140e-04f, +1.914231114e-04f, +2.127708687e-04f, -1.917523215e-04f, +2.394391249e-05f, +4.191937002e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.148081250e-04f, -1.807312422e-03f, +9.480893421e-04f, +4.225126305e-03f, -8.836210727e-03f, +3.319410073e-03f, +1.251690596e-02f, -2.170730923e-02f, +6.624505763e-03f, +2.425051577e-02f, -3.685559683e-02f, +9.430838100e-03f, +3.485461126e-02f, -4.739872790e-02f, +1.024853584e-02f, +3.890888941e-02f, -4.768157657e-02f, +8.663702835e-03f, +3.409942037e-02f, -3.757028688e-02f, +5.637673661e-03f, +2.306010786e-02f, -2.254165622e-02f, +2.707038398e-03f, +1.134231634e-02f, -9.495320847e-03f, +8.740125470e-04f, +3.403886067e-03f, -2.164334606e-03f, +2.886636573e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.461247698e-06f, +7.776451838e-05f, -2.420504378e-04f, +2.051850750e-04f, +2.761089073e-04f, -8.528141140e-04f, +6.602251554e-04f, +6.036809243e-04f, -1.812574388e-03f, +1.311931067e-03f, +9.599682835e-04f, -2.790621447e-03f, +1.906126961e-03f, +1.177728500e-03f, -3.312231865e-03f, +2.143274330e-03f, +1.135516017e-03f, -3.090734556e-03f, +1.895255156e-03f, +8.522847680e-04f, -2.249058511e-03f, +1.302928899e-03f, +4.754946277e-04f, -1.224077651e-03f, +6.645646552e-04f, +1.716957904e-04f, -4.434443410e-04f, +2.211852757e-04f, +1.858278450e-05f, -4.191937002e-05f, +0.000000000e+00f, + /* 11,22 (32) */ + +0.000000000e+00f, -5.192693727e-04f, +1.101429420e-03f, +4.910414720e-04f, -4.137987154e-03f, +4.065343553e-03f, +4.687502487e-03f, -1.434152883e-02f, +7.139514826e-03f, +1.969904341e-02f, -3.580341959e-02f, +3.523607271e-03f, +6.500687426e-02f, -8.661304785e-02f, -4.112531739e-02f, +4.514815994e-01f, +5.943607235e-01f, +1.184552276e-01f, -1.288766254e-01f, +2.740947380e-02f, +4.331332344e-02f, -3.979996456e-02f, +1.109703361e-03f, +2.045033626e-02f, -1.268195597e-02f, -2.937640258e-03f, +7.683207096e-03f, -2.827568983e-03f, -1.630011418e-03f, +1.724849395e-03f, -2.467442873e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.567542367e-06f, -7.400231112e-05f, +1.423977072e-04f, +1.023357321e-05f, -3.865715585e-04f, +4.770489483e-04f, +2.413482406e-04f, -1.252779690e-03f, +9.870120801e-04f, +1.247190160e-03f, -3.279506782e-03f, +1.305269933e-03f, +5.401358006e-03f, -1.000072017e-02f, -1.527735383e-02f, +7.677809727e-03f, +1.594640601e-02f, -9.419548641e-04f, -4.781701836e-03f, +2.938038908e-03f, +7.128689572e-04f, -1.967645963e-03f, +8.075352641e-04f, +5.406817511e-04f, -7.277775432e-04f, +1.644932940e-04f, +2.308444587e-04f, -1.911519052e-04f, +1.713070666e-05f, +4.540741818e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.192693727e-04f, -1.729547904e-03f, +7.060389043e-04f, +4.430311380e-03f, -8.560101819e-03f, +2.466595959e-03f, +1.317713111e-02f, -2.110362830e-02f, +4.811931374e-03f, +2.556244684e-02f, -3.589562855e-02f, +6.640216652e-03f, +3.676073822e-02f, -4.622099940e-02f, +6.936303974e-03f, +4.105216374e-02f, -4.654606055e-02f, +5.572968280e-03f, +3.599467552e-02f, -3.671800211e-02f, +3.388615151e-03f, +2.436303675e-02f, -2.206616159e-02f, +1.482960747e-03f, +1.200688100e-02f, -9.323625057e-03f, +4.305682060e-04f, +3.625071342e-03f, -2.145751822e-03f, +2.467442873e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.567542367e-06f, +8.290674739e-05f, -2.368258200e-04f, +1.793657373e-04f, +3.073838501e-04f, -8.464375711e-04f, +5.917805257e-04f, +6.860413896e-04f, -1.811241825e-03f, +1.189048365e-03f, +1.105976113e-03f, -2.801543206e-03f, +1.740252096e-03f, +1.372150902e-03f, -3.338135339e-03f, +1.968565202e-03f, +1.337581486e-03f, -3.126681251e-03f, +1.751041576e-03f, +1.017062415e-03f, -2.284855957e-03f, +1.211986895e-03f, +5.784557033e-04f, -1.250580530e-03f, +6.240545397e-04f, +2.175747863e-04f, -4.575415349e-04f, +2.113854967e-04f, +3.024489743e-05f, -4.540741818e-05f, +0.000000000e+00f, + /* 11,23 (32) */ + +0.000000000e+00f, -5.208369150e-04f, +1.027427109e-03f, +6.334391792e-04f, -4.127753581e-03f, +3.678771994e-03f, +5.164551435e-03f, -1.410018059e-02f, +5.886735136e-03f, +2.068605549e-02f, -3.455622943e-02f, +2.441004899e-04f, +6.631214419e-02f, -8.121168985e-02f, -5.112603756e-02f, +4.362042455e-01f, +6.020385332e-01f, +1.344016336e-01f, -1.298185802e-01f, +2.262777197e-02f, +4.625136235e-02f, -3.908709561e-02f, -8.579426022e-04f, +2.125787153e-02f, -1.214127422e-02f, -3.665417801e-03f, +7.847700390e-03f, -2.596724524e-03f, -1.821163323e-03f, +1.741980102e-03f, -2.013368691e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.184686737e-06f, -7.539367768e-05f, +1.347627424e-04f, +2.694470422e-05f, -3.913735697e-04f, +4.449958816e-04f, +2.923921239e-04f, -1.250533532e-03f, +8.857288567e-04f, +1.359265091e-03f, -3.214626626e-03f, +1.016325899e-03f, +5.575448640e-03f, -9.421272433e-03f, -1.564347125e-02f, +6.920291785e-03f, +1.622857046e-02f, -4.490746814e-04f, -4.987790445e-03f, +2.814542149e-03f, +8.842517829e-04f, -2.003308442e-03f, +7.380204988e-04f, +6.017714024e-04f, -7.297052001e-04f, +1.361874172e-04f, +2.484354947e-04f, -1.896806238e-04f, +9.972998001e-06f, +4.882517833e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.208369150e-04f, -1.646641156e-03f, +4.692130843e-04f, +4.609677117e-03f, -8.252717969e-03f, +1.620158388e-03f, +1.376891164e-02f, -2.041758691e-02f, +3.000689549e-03f, +2.675149521e-02f, -3.478965244e-02f, +3.838673446e-03f, +3.850099032e-02f, -4.484884850e-02f, +3.598168635e-03f, +4.302072894e-02f, -4.520847907e-02f, +2.446287029e-03f, +3.774571710e-02f, -3.570093969e-02f, +1.103759193e-03f, +2.557502365e-02f, -2.148770588e-02f, +2.323802171e-04f, +1.263093554e-02f, -9.106050270e-03f, -2.697332892e-05f, +3.836456839e-03f, -2.115506924e-03f, +2.013368691e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.184686737e-06f, +8.738863370e-05f, -2.306229360e-04f, +1.534281255e-04f, +3.365319592e-04f, -8.364036307e-04f, +5.218742281e-04f, +7.642079094e-04f, -1.802011045e-03f, +1.062216482e-03f, +1.246002744e-03f, -2.800248911e-03f, +1.567585990e-03f, +1.560083072e-03f, -3.349549514e-03f, +1.785237499e-03f, +1.534275501e-03f, -3.149171460e-03f, +1.598394050e-03f, +1.178608129e-03f, -2.310956446e-03f, +1.114667396e-03f, +6.802447451e-04f, -1.271906527e-03f, +5.799482627e-04f, +2.634754778e-04f, -4.698504283e-04f, +2.002309966e-04f, +4.221200833e-05f, -4.882517833e-05f, +0.000000000e+00f, + /* 11,24 (32) */ + +0.000000000e+00f, -5.196522283e-04f, +9.520334316e-04f, +7.682019216e-04f, -4.100808877e-03f, +3.287398424e-03f, +5.609547317e-03f, -1.380778847e-02f, +4.636201605e-03f, +2.157178435e-02f, -3.319696434e-02f, -2.970526136e-03f, +6.732847009e-02f, -7.563624121e-02f, -6.054731000e-02f, +4.205607743e-01f, +6.089588250e-01f, +1.506302041e-01f, -1.302676549e-01f, +1.763998152e-02f, +4.906590450e-02f, -3.820284382e-02f, -2.861251044e-03f, +2.199589203e-02f, -1.153950282e-02f, -4.395123001e-03f, +7.983887807e-03f, -2.348289030e-03f, -2.010843946e-03f, +1.751953100e-03f, -1.525116908e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.786403335e-06f, -7.637387715e-05f, +1.267934984e-04f, +4.305473184e-05f, -3.944292323e-04f, +4.118760385e-04f, +3.411517215e-04f, -1.243325345e-03f, +7.829078243e-04f, +1.463812955e-03f, -3.138511745e-03f, +7.298188369e-04f, +5.724321760e-03f, -8.832704308e-03f, -1.597363417e-02f, +6.146083796e-03f, +1.647919551e-02f, +6.088818554e-05f, -5.179525972e-03f, +2.677308242e-03f, +1.055513877e-03f, -2.031590404e-03f, +6.640900180e-04f, +6.616957344e-04f, -7.286451315e-04f, +1.065926770e-04f, +2.654533980e-04f, -1.873179974e-04f, +2.492983095e-06f, +5.215113274e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.196522283e-04f, -1.559252523e-03f, +2.385901483e-04f, +4.763105243e-03f, -7.916186010e-03f, +7.837547575e-04f, +1.429078587e-02f, -1.965337901e-02f, +1.198678504e-03f, +2.781371169e-02f, -3.354364969e-02f, +1.038424535e-03f, +4.006857631e-02f, -4.328876543e-02f, +2.486191205e-04f, +4.480596644e-02f, -4.367420357e-02f, -7.028844317e-04f, +3.934411115e-02f, -3.452233157e-02f, -1.207197253e-03f, +2.668969105e-02f, -2.080746114e-02f, -1.039526309e-03f, +1.321088380e-02f, -8.842574792e-03f, -4.968237572e-04f, +4.036687836e-03f, -2.073294916e-03f, +1.525116908e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.786403335e-06f, +9.121070548e-05f, -2.235041847e-04f, +1.274997434e-04f, +3.634660170e-04f, -8.228292131e-04f, +4.508455358e-04f, +8.378908291e-04f, -1.785017248e-03f, +9.320345641e-04f, +1.379479749e-03f, -2.786820098e-03f, +1.388916364e-03f, +1.740719604e-03f, -3.346441362e-03f, +1.594091349e-03f, +1.724722939e-03f, -3.158055539e-03f, +1.437939937e-03f, +1.336183052e-03f, -2.327155243e-03f, +1.011334890e-03f, +7.803870073e-04f, -1.287876920e-03f, +5.323830676e-04f, +3.091821714e-04f, -4.802657043e-04f, +1.877371019e-04f, +5.442997476e-05f, -5.215113274e-05f, +0.000000000e+00f, + /* 11,25 (32) */ + +0.000000000e+00f, -5.158658249e-04f, +8.756595545e-04f, +8.949954200e-04f, -4.057754145e-03f, +2.892969192e-03f, +6.021423355e-03f, -1.346663674e-02f, +3.392876260e-03f, +2.235469217e-02f, -3.173315139e-02f, -6.109037881e-03f, +6.805828893e-02f, -6.991191945e-02f, -6.938001431e-02f, +4.045871401e-01f, +6.151049088e-01f, +1.671093996e-01f, -1.302067667e-01f, +1.246045555e-02f, +5.174321274e-02f, -3.714732995e-02f, -4.892841448e-03f, +2.265998204e-02f, -1.087780708e-02f, -5.123768133e-03f, +8.090480484e-03f, -2.082835632e-03f, -2.198161944e-03f, +1.754446083e-03f, -1.003605580e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.229758273e-06f, -7.695366797e-05f, +1.185368192e-04f, +5.851081077e-05f, -3.957698464e-04f, +3.778511793e-04f, +3.874766561e-04f, -1.231283832e-03f, +6.789884160e-04f, +1.560566567e-03f, -3.051675980e-03f, +4.467660161e-04f, +5.848087598e-03f, -8.236754752e-03f, -1.626728294e-02f, +5.357031680e-03f, +1.669725689e-02f, +5.867703010e-04f, -5.355864460e-03f, +2.526586220e-03f, +1.225972263e-03f, -2.052233720e-03f, +5.859576958e-04f, +7.201819531e-04f, -7.245342347e-04f, +7.580396313e-05f, +2.818077408e-04f, -1.840470753e-04f, -5.284803911e-06f, +5.536343650e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.158658249e-04f, -1.468041817e-03f, +1.508596358e-05f, +4.890604986e-03f, -7.552719993e-03f, -3.907445562e-05f, +1.474163140e-02f, -1.881548818e-02f, -5.863387437e-04f, +2.874574625e-02f, -3.216416994e-02f, -1.748395563e-03f, +4.145749267e-02f, -4.154804582e-02f, -3.097822242e-03f, +4.640005779e-02f, -4.194948063e-02f, -3.860939971e-03f, +4.078205108e-02f, -3.318614851e-02f, -3.534352496e-03f, +2.770102594e-02f, -2.002707413e-02f, -2.327403229e-03f, +1.374326687e-02f, -8.533392621e-03f, -9.770894616e-04f, +4.224424938e-03f, -2.018864941e-03f, +1.003605580e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.229758273e-06f, +9.437717204e-05f, -2.155348307e-04f, +1.017047819e-04f, +3.881112511e-04f, -8.058454924e-04f, +3.790333387e-04f, +9.068248614e-04f, -1.760428988e-03f, +7.991108973e-04f, +1.505872406e-03f, -2.761391756e-03f, +1.205054076e-03f, +1.913289705e-03f, -3.328842288e-03f, +1.395961915e-03f, +1.908074638e-03f, -3.153243872e-03f, +1.270344836e-03f, +1.489060860e-03f, -2.333290406e-03f, +9.023851319e-04f, +8.784090850e-04f, -1.298335032e-03f, +4.815149239e-04f, +3.544755813e-04f, -4.886888339e-04f, +1.739265019e-04f, +6.684145543e-05f, -5.536343650e-05f, +0.000000000e+00f, + /* 11,26 (32) */ + +0.000000000e+00f, -5.096360667e-04f, +7.987058865e-04f, +1.013532239e-03f, -3.999243334e-03f, +2.497199346e-03f, +6.399274535e-03f, -1.307916009e-02f, +2.161592427e-03f, +2.303368059e-02f, -3.017258482e-02f, -9.160713861e-03f, +6.850505494e-02f, -6.406383185e-02f, -7.761676906e-02f, +3.883198572e-01f, +6.204619405e-01f, +1.838066565e-01f, -1.296199964e-01f, +7.104591091e-03f, +5.426979896e-02f, -3.592135768e-02f, -6.945075168e-03f, +2.324593974e-02f, -1.015762513e-02f, -5.848302367e-03f, +8.166284447e-03f, -1.801027891e-03f, -2.382209019e-03f, +1.749161279e-03f, -4.499712153e-05f, +0.000000000e+00f, + +0.000000000e+00f, +8.508092032e-06f, -7.714542216e-05f, +1.100394411e-04f, +7.326442817e-05f, -3.954332952e-04f, +3.430832150e-04f, +4.312297312e-04f, -1.214554775e-03f, +5.744061304e-04f, +1.649294283e-03f, -2.954664371e-03f, +1.681520007e-04f, +5.946934842e-03f, -7.635163059e-03f, -1.652396156e-02f, +4.555025022e-03f, +1.688181373e-02f, +1.127341589e-03f, -5.515794497e-03f, +2.362681358e-03f, +1.394934129e-03f, -2.065006149e-03f, +5.038588502e-04f, +7.769576327e-04f, -7.173209664e-04f, +4.392362233e-05f, +2.974086587e-04f, -1.798546151e-04f, -1.333354016e-05f, +5.844002441e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.096360667e-04f, -1.373664645e-03f, -2.004488672e-04f, +4.992309768e-03f, -7.164608742e-03f, -8.449199480e-04f, +1.512066474e-02f, -1.790866331e-02f, -2.346767732e-03f, +2.954485715e-02f, -3.065829754e-02f, -4.509787320e-03f, +4.266254675e-02f, -3.963475612e-02f, -6.426664530e-03f, +4.779601970e-02f, -4.004140599e-02f, -7.014183843e-03f, +4.205239592e-02f, -3.169708765e-02f, -5.867642902e-03f, +2.860341107e-02f, -1.914866505e-02f, -3.625738261e-03f, +1.422478179e-02f, -8.178917040e-03f, -1.465778295e-03f, +4.398351440e-03f, -1.952023486e-03f, +4.499712153e-05f, +0.000000000e+00f, + +0.000000000e+00f, -8.508092032e-06f, +9.689578485e-05f, -2.067825811e-04f, +7.616357881e-05f, +4.104054317e-04f, -7.855970127e-04f, +3.067745716e-04f, +9.707699758e-04f, -1.728447016e-03f, +6.640600564e-04f, +1.624681845e-03f, -2.724151392e-03f, +1.016829376e-03f, +2.077060559e-03f, -3.296847912e-03f, +1.191715659e-03f, +2.083511266e-03f, -3.134707495e-03f, +1.096309781e-03f, +1.636531151e-03f, -2.329243902e-03f, +7.882436644e-04f, +9.738411283e-04f, -1.303147295e-03f, +4.275181090e-04f, +3.991338273e-04f, -4.950287292e-04f, +1.588293267e-04f, +7.938613329e-05f, -5.844002441e-05f, +0.000000000e+00f, + /* 11,27 (32) */ + +0.000000000e+00f, -5.011279746e-04f, +7.215604643e-04f, +1.123571680e-03f, -3.925978906e-03f, +2.101766051e-03f, +6.742357750e-03f, -1.264793036e-02f, +9.470376524e-04f, +2.360808672e-02f, -2.852329054e-02f, -1.211537823e-02f, +6.867320694e-02f, -5.811689701e-02f, -8.525193212e-02f, +3.717958956e-01f, +6.250169655e-01f, +2.006884702e-01f, -1.284926549e-01f, +1.588796594e-03f, +5.663248032e-02f, -3.452642355e-02f, -9.010081316e-03f, +2.374979859e-02f, -9.380667497e-03f, -6.565623334e-03f, +8.210208070e-03f, -1.503619232e-03f, -2.562063634e-03f, +1.735827739e-03f, +1.344290287e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.061593068e-05f, -7.696301166e-05f, +1.013477763e-04f, +8.727150786e-05f, -3.934637232e-04f, +3.077335173e-04f, +4.722872316e-04f, -1.193300107e-03f, +4.695908602e-04f, +1.729800256e-03f, -2.848050543e-03f, -1.050742777e-04f, +6.021128903e-03f, -7.029663496e-03f, -1.674331867e-02f, +3.741991540e-03f, +1.703201199e-02f, +1.681308471e-03f, -5.658341220e-03f, +2.185955052e-03f, +1.561699363e-03f, -2.069702749e-03f, +4.180496835e-04f, +8.317518661e-04f, -7.069658116e-04f, +1.106118323e-05f, +3.121672704e-04f, -1.747312493e-04f, -2.162417585e-05f, +6.135872231e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.011279746e-04f, -1.276768860e-03f, -4.072314483e-04f, +5.068473347e-03f, -6.754203310e-03f, -1.630516961e-03f, +1.542743931e-02f, -1.693789334e-02f, -4.075214748e-03f, +3.020891721e-02f, -2.903361569e-02f, -7.233938712e-03f, +4.367937612e-02f, -3.755769556e-02f, -9.723512442e-03f, +4.898773536e-02f, -3.795789472e-02f, -1.014889134e-02f, +4.314870570e-02f, -3.006055650e-02f, -8.196886804e-03f, +2.939165473e-02f, -1.817482392e-02f, -4.928885556e-03f, +1.465229990e-02f, -7.779783213e-03f, -1.960807025e-03f, +4.557180766e-03f, -1.872637353e-03f, -1.344290287e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.061593068e-05f, +9.877768243e-05f, -1.973171607e-04f, +5.099210984e-05f, +4.302989061e-04f, -7.622407565e-04f, +2.344026744e-04f, +1.029512157e-03f, -1.689302989e-03f, +5.275000579e-04f, +1.735447020e-03f, -2.675337866e-03f, +8.250880908e-04f, +2.231340502e-03f, -3.250617563e-03f, +9.822464652e-04f, +2.250247059e-03f, -3.102478442e-03f, +9.165682554e-04f, +1.777902771e-03f, -2.314942528e-03f, +6.693641742e-04f, +1.066219067e-03f, -1.302204225e-03f, +3.705846943e-04f, +4.429334640e-04f, -4.992023741e-04f, +1.424831887e-04f, +9.200096162e-05f, -6.135872231e-05f, +0.000000000e+00f, + /* 11,28 (32) */ + +0.000000000e+00f, -4.905120440e-04f, +6.445974527e-04f, +1.224919457e-03f, -3.838707398e-03f, +1.708302327e-03f, +7.050091267e-03f, -1.217564313e-02f, -2.462624541e-04f, +2.407767758e-02f, -2.679349028e-02f, -1.496342877e-02f, +6.856813267e-02f, -5.209576810e-02f, -9.228159561e-02f, +3.550525770e-01f, +6.287589571e-01f, +2.177204822e-01f, -1.268113464e-01f, -4.069544625e-03f, +5.881843537e-02f, -3.296472419e-02f, -1.107978407e-02f, +2.416784827e-02f, -8.548915631e-03f, -7.272589145e-03f, +8.221269253e-03f, -1.191451962e-03f, -2.736794883e-03f, +1.714203563e-03f, +7.480162519e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.254897547e-05f, -7.642169036e-05f, +9.250770446e-05f, +1.004924917e-04f, -3.899111944e-04f, +2.719622451e-04f, +5.105391625e-04f, -1.167696943e-03f, +3.649652725e-04f, +1.801924571e-03f, -2.732434021e-03f, -3.720022736e-04f, +6.071009941e-03f, -6.421979990e-03f, -1.692510800e-02f, +2.919891436e-03f, +1.714708762e-02f, +2.247317239e-03f, -5.782570238e-03f, +1.996824487e-03f, +1.725563159e-03f, -2.066147209e-03f, +3.288066269e-04f, +8.842964323e-04f, -6.934417111e-04f, -2.266695685e-05f, +3.259961039e-04f, -1.686716379e-04f, -3.012550886e-05f, +6.409736252e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.905120440e-04f, -1.177991178e-03f, -6.045486089e-04f, +5.119465457e-03f, -6.323904404e-03f, -2.392757717e-03f, +1.566184199e-02f, -1.590838118e-02f, -5.764517736e-03f, +3.073641726e-02f, -2.729816867e-02f, -9.909276578e-03f, +4.450446421e-02f, -3.532635506e-02f, -1.297413000e-02f, +4.996998183e-02f, -3.570764766e-02f, -1.325136978e-02f, +4.406527396e-02f, -2.828265373e-02f, -1.051182933e-02f, +3.006101891e-02f, -1.710860485e-02f, -6.231089781e-03f, +1.502288459e-02f, -7.336849749e-03f, -2.460009399e-03f, +4.699663955e-03f, -1.780636391e-03f, -7.480162519e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.254897547e-05f, +1.000372204e-04f, -1.872098875e-04f, +2.630151461e-05f, +4.477545695e-04f, -7.359451690e-04f, +1.622460947e-04f, +1.082864033e-03f, -1.643258051e-03f, +3.900495221e-04f, +1.837746491e-03f, -2.615239996e-03f, +6.306877531e-04f, +2.375482011e-03f, -3.190373477e-03f, +7.684716360e-04f, +2.407533414e-03f, -3.056649812e-03f, +7.318830510e-04f, +1.912507091e-03f, -2.290358631e-03f, +5.462267062e-04f, +1.155086836e-03f, -1.295421288e-03f, +3.109239366e-04f, +4.856505384e-04f, -5.011354274e-04f, +1.249331840e-04f, +1.046204324e-04f, -6.409736252e-05f, +0.000000000e+00f, + /* 11,29 (32) */ + +0.000000000e+00f, -4.779630685e-04f, +5.681757623e-04f, +1.317427161e-03f, -3.738214906e-03f, +1.318391133e-03f, +7.322053512e-03f, -1.166510396e-02f, -1.413959398e-03f, +2.444264285e-02f, -2.499156571e-02f, -1.769586280e-02f, +6.819613039e-02f, -4.602475816e-02f, -9.870357560e-02f, +3.381274690e-01f, +6.316788485e-01f, +2.348675698e-01f, -1.245640291e-01f, -9.852114863e-03f, +6.081525986e-02f, -3.123916103e-02f, -1.314593127e-02f, +2.449665490e-02f, -7.664619199e-03f, -7.966030856e-03f, +8.198602296e-03f, -8.654558578e-04f, -2.905466521e-03f, +1.684078054e-03f, +1.388989877e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.430408636e-05f, -7.553797284e-05f, +8.356437160e-05f, +1.128923987e-04f, -3.848313325e-04f, +2.359276916e-04f, +5.458894262e-04f, -1.137936565e-03f, +2.609432477e-04f, +1.865543218e-03f, -2.608437499e-03f, -6.317624037e-04f, +6.096990672e-03f, -5.813820907e-03f, -1.706918873e-02f, +2.090711636e-03f, +1.722636945e-02f, +2.823957673e-03f, -5.887591478e-03f, +1.795762098e-03f, +1.885818684e-03f, -2.054193084e-03f, +2.364255892e-04f, +9.343269739e-04f, -6.767344434e-04f, -5.713788228e-05f, +3.388095256e-04f, -1.616746057e-04f, -3.880427232e-05f, +6.663390283e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.779630685e-04f, -1.077953958e-03f, -7.917584964e-04f, +5.145766972e-03f, -5.876149835e-03f, -3.128702886e-03f, +1.582408808e-02f, -1.482551715e-02f, -7.407775787e-03f, +3.112646679e-02f, -2.546042218e-02f, -1.252451657e-02f, +4.513515197e-02f, -3.295087304e-02f, -1.616450348e-02f, +5.073845346e-02f, -3.330011425e-02f, -1.630801959e-02f, +4.479715701e-02f, -2.637014664e-02f, -1.280218796e-02f, +3.060724561e-02f, -1.595351802e-02f, -7.526511069e-03f, +1.533380853e-02f, -6.851199210e-03f, -2.961144826e-03f, +4.824597139e-03f, -1.676015959e-03f, -1.388989877e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.430408636e-05f, +1.006917880e-04f, -1.765332510e-04f, +2.197657769e-06f, +4.627477756e-04f, -7.068891457e-04f, +9.062683597e-05f, +1.130665368e-03f, -1.590601295e-03f, +2.523248602e-04f, +1.931200014e-03f, -2.544194950e-03f, +4.344936997e-04f, +2.508884473e-03f, -3.116399721e-03f, +5.513277849e-04f, +2.554662325e-03f, -2.997375566e-03f, +5.430429681e-04f, +2.039701187e-03f, -2.255510631e-03f, +4.193357355e-04f, +1.239998590e-03f, -1.282739667e-03f, +2.487615761e-04f, +5.270616700e-04f, -5.007627948e-04f, +1.062318554e-04f, +1.171768659e-04f, -6.663390283e-05f, +0.000000000e+00f, + /* 11,30 (32) */ + +0.000000000e+00f, -4.636589821e-04f, +4.926377895e-04f, +1.400991533e-03f, -3.625322507e-03f, +9.335598005e-04f, +7.557981204e-03f, -1.111921454e-02f, -2.551895963e-03f, +2.470358610e-02f, -2.312602249e-02f, -2.030430029e-02f, +6.756436799e-02f, -3.992776749e-02f, -1.045173965e-01f, +3.210582802e-01f, +6.337695601e-01f, +2.520939393e-01f, -1.217400715e-01f, -1.573970634e-02f, +6.261102195e-02f, -2.935334235e-02f, -1.520012436e-02f, +2.473308049e-02f, -6.730292225e-03f, -8.642765300e-03f, +8.141464414e-03f, -5.266463322e-04f, -3.067141127e-03f, +1.645273782e-03f, +2.055328905e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.587925964e-05f, -7.432951012e-05f, +7.456199901e-05f, +1.244408611e-04f, -3.782849447e-04f, +1.997856523e-04f, +5.782559362e-04f, -1.104223360e-03f, +1.579283810e-04f, +1.920567935e-03f, -2.476704058e-03f, -8.835284387e-04f, +6.099553942e-03f, -5.206873907e-03f, -1.717552527e-02f, +1.256459939e-03f, +1.726928183e-02f, +3.409766865e-03f, -5.972562914e-03f, +1.583294811e-03f, +2.041759800e-03f, -2.033724933e-03f, +1.412211116e-04f, +9.815841830e-04f, -6.568429598e-04f, -9.222254628e-05f, +3.505241726e-04f, -1.537432642e-04f, -4.762523496e-05f, +6.894654851e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.636589821e-04f, -9.772621697e-04f, -9.682917474e-04f, +5.147964629e-03f, -5.413402059e-03f, -3.835592032e-03f, +1.591471492e-02f, -1.369485178e-02f, -8.998377082e-03f, +3.137879165e-02f, -2.352922217e-02f, -1.506871152e-02f, +4.556964567e-02f, -3.044198857e-02f, -1.928090320e-02f, +5.128978125e-02f, -3.074545192e-02f, -1.930539516e-02f, +4.534019998e-02f, -2.433044545e-02f, -1.505769859e-02f, +3.102658135e-02f, -1.471351943e-02f, -8.809250736e-03f, +1.558257011e-02f, -6.324137540e-03f, -3.461907621e-03f, +4.930828994e-03f, -1.558839093e-03f, -2.055328905e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.587925964e-05f, +1.007616128e-04f, -1.653604951e-04f, -2.121927248e-05f, +4.752661866e-04f, -6.752609872e-04f, +1.985905989e-05f, +1.172783428e-03f, -1.531648112e-03f, +1.149374980e-04f, +2.015469923e-03f, -2.462586420e-03f, +2.373751464e-04f, +2.630996745e-03f, -3.029040832e-03f, +3.317666361e-04f, +2.690969630e-03f, -2.924870034e-03f, +3.508593867e-04f, +2.158870932e-03f, -2.210463330e-03f, +2.892181057e-04f, +1.320520896e-03f, -1.264126917e-03f, +1.843390432e-04f, +5.669451485e-04f, -4.980291667e-04f, +8.643911408e-05f, +1.296007205e-04f, -6.894654851e-05f, +0.000000000e+00f, + /* 11,31 (32) */ + +0.000000000e+00f, -4.477797225e-04f, +4.183082794e-04f, +1.475553532e-03f, -3.500881646e-03f, +5.552748558e-04f, +7.757766856e-03f, -1.054095860e-02f, -3.656119323e-03f, +2.486151448e-02f, -2.120545456e-02f, -2.278100435e-02f, +6.668083955e-02f, -3.382821355e-02f, -1.097242704e-01f, +3.038827550e-01f, +6.350260201e-01f, +2.693632211e-01f, -1.183303046e-01f, -2.171226926e-02f, +6.419431677e-02f, -2.731158255e-02f, -1.723384929e-02f, +2.487430160e-02f, -5.748708042e-03f, -9.299608260e-03f, +8.049241867e-03f, -1.761221597e-04f, -3.220884391e-03f, +1.597648547e-03f, +2.744794391e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.727359999e-05f, -7.281496347e-05f, +6.554370115e-05f, +1.351121395e-04f, -3.703376314e-04f, +1.636888179e-04f, +6.075706714e-04f, -1.066773732e-03f, +5.631255252e-05f, +1.966945911e-03f, -2.337894363e-03f, -1.126519703e-03f, +6.079250102e-03f, -4.602800923e-03f, -1.724418689e-02f, +4.191591060e-04f, +1.727534696e-02f, +4.003233266e-03f, -6.036694190e-03f, +1.360003080e-03f, +2.192683832e-03f, -2.004659355e-03f, +4.352543003e-05f, +1.025814987e-03f, -6.337796691e-04f, -1.277861936e-04f, +3.610593840e-04f, -1.448851155e-04f, -5.655131412e-05f, +7.101387684e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.477797225e-04f, -8.765005569e-04f, -1.133652243e-03f, +5.126745357e-03f, -4.938135872e-03f, -4.510853019e-03f, +1.593457398e-02f, -1.252206835e-02f, -1.053002519e-02f, +3.149372914e-02f, -2.151375224e-02f, -1.753129794e-02f, +4.580702081e-02f, -2.781099183e-02f, -2.230994403e-02f, +5.162154789e-02f, -2.805448229e-02f, -2.223026519e-02f, +4.569105936e-02f, -2.217157452e-02f, -1.726816192e-02f, +3.131579945e-02f, -1.339299853e-02f, -1.007337765e-02f, +1.576690915e-02f, -5.757192392e-03f, -3.959936788e-03f, +5.017268108e-03f, -1.429238372e-03f, -2.744794391e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.727359999e-05f, +1.002695547e-04f, -1.537652081e-04f, -4.385512737e-05f, +4.853095666e-04f, -6.412573280e-04f, -4.975225277e-05f, +1.209113201e-03f, -1.466738437e-03f, -2.150884940e-05f, +2.090262312e-03f, -2.370842601e-03f, +4.020126626e-05f, +2.741319471e-03f, -2.928700180e-03f, +1.107507574e-04f, +2.815838079e-03f, -2.839407163e-03f, +1.561627150e-04f, +2.269433978e-03f, -2.155328008e-03f, +1.564208422e-04f, +1.396234898e-03f, -1.239577499e-03f, +1.179125761e-04f, +6.050820446e-04f, -4.928895181e-04f, +6.562212109e-05f, +1.418209216e-04f, -7.101387684e-05f, +0.000000000e+00f, + /* 12, 0 (28) */ + +2.536797823e-04f, +1.717120723e-03f, -4.267889081e-03f, +2.769345327e-03f, +5.951433797e-03f, -1.603584821e-02f, +1.292106340e-02f, +1.223371165e-02f, -4.454238865e-02f, +4.565217930e-02f, +1.809825863e-02f, -1.393967437e-01f, +2.613999239e-01f, +6.871774778e-01f, +2.613999239e-01f, -1.393967437e-01f, +1.809825863e-02f, +4.565217930e-02f, -4.454238865e-02f, +1.223371165e-02f, +1.292106340e-02f, -1.603584821e-02f, +5.951433797e-03f, +2.769345327e-03f, -4.267889081e-03f, +1.717120723e-03f, +2.536797823e-04f, -4.307376863e-04f, + -8.526960746e-05f, +7.926299444e-05f, +1.318301341e-04f, -4.772958510e-04f, +5.158670931e-04f, +2.137625121e-04f, -1.439760328e-03f, +1.848238513e-03f, -3.735582438e-05f, -3.629437058e-03f, +5.880531475e-03f, -1.163826103e-03f, -2.009118504e-02f, -5.299098635e-04f, +2.017288707e-02f, +1.861481453e-03f, -6.119451369e-03f, +3.497362304e-03f, +2.476320516e-04f, -1.945437062e-03f, +1.410425884e-03f, -1.423394688e-04f, -5.578184186e-04f, +4.775685101e-04f, -1.149719352e-04f, -9.125701215e-05f, +8.822150698e-05f, -2.745459118e-05f, + -2.536797823e-04f, -1.150482282e-03f, +5.406716708e-03f, -7.717177369e-03f, +1.823839110e-03f, +1.228216497e-02f, -2.346784071e-02f, +1.698003719e-02f, +9.330273566e-03f, -3.702545451e-02f, +4.007418410e-02f, -9.979930894e-03f, -3.212484989e-02f, +5.173229864e-02f, -3.212484989e-02f, -9.979930894e-03f, +4.007418410e-02f, -3.702545451e-02f, +9.330273566e-03f, +1.698003719e-02f, -2.346784071e-02f, +1.228216497e-02f, +1.823839110e-03f, -7.717177369e-03f, +5.406716708e-03f, -1.150482282e-03f, -7.255512597e-04f, +4.307376863e-04f, + +8.526960746e-05f, -1.854904982e-04f, +3.237785643e-05f, +4.455277979e-04f, -9.335634383e-04f, +7.835579473e-04f, +3.394120637e-04f, -1.815168006e-03f, +2.293903971e-03f, -8.991337447e-04f, -1.663773246e-03f, +3.389161541e-03f, -2.669210172e-03f, -1.289232061e-04f, +2.834582782e-03f, -3.352244024e-03f, +1.472695063e-03f, +1.092228303e-03f, -2.364105091e-03f, +1.751821072e-03f, -2.249406299e-04f, -8.609019613e-04f, +9.443600182e-04f, -4.163629789e-04f, -6.280130302e-05f, +1.995966708e-04f, -1.186846730e-04f, +2.745459118e-05f, + /* 12, 1 (28) */ + +1.684101748e-04f, +1.796383717e-03f, -4.136058947e-03f, +2.292049476e-03f, +6.467300890e-03f, -1.582208569e-02f, +1.148130307e-02f, +1.408195016e-02f, -4.457974447e-02f, +4.202274224e-02f, +2.397879011e-02f, -1.405605698e-01f, +2.413087388e-01f, +6.866475680e-01f, +2.815728109e-01f, -1.375352622e-01f, +1.197880726e-02f, +4.914954161e-02f, -4.429475660e-02f, +1.028827459e-02f, +1.433148928e-02f, -1.617818768e-02f, +5.393615378e-03f, +3.246913837e-03f, -4.382861017e-03f, +1.625863710e-03f, +3.419012893e-04f, -4.581922775e-04f, + -8.197548550e-05f, +6.730415010e-05f, +1.475049942e-04f, -4.747226022e-04f, +4.725039166e-04f, +2.825427336e-04f, -1.461742008e-03f, +1.744506828e-03f, +1.687035297e-04f, -3.742165744e-03f, +5.621703527e-03f, -4.848968310e-04f, -1.996025146e-02f, -1.588226575e-03f, +2.020456610e-02f, +2.575877161e-03f, -6.336929088e-03f, +3.346114859e-03f, +4.612341352e-04f, -2.035505433e-03f, +1.373719731e-03f, -6.856006816e-05f, -5.981149961e-04f, +4.754753349e-04f, -9.698124191e-05f, -1.032215887e-04f, +9.079849612e-05f, -2.643210268e-05f, + -1.684101748e-04f, -1.335972780e-03f, +5.439094564e-03f, -7.271649571e-03f, +8.902756715e-04f, +1.306572292e-02f, -2.312842865e-02f, +1.516486918e-02f, +1.162417754e-02f, -3.792458825e-02f, +3.841041086e-02f, -6.590769352e-03f, -3.479406006e-02f, +5.160337544e-02f, -2.929026710e-02f, -1.333217492e-02f, +4.154687917e-02f, -3.593322620e-02f, +6.966168475e-03f, +1.873185826e-02f, -2.369278134e-02f, +1.142126301e-02f, +2.768199128e-03f, -8.133540348e-03f, +5.343915405e-03f, -9.508856112e-04f, -8.442359327e-04f, +4.581922775e-04f, + +8.197548550e-05f, -1.708411199e-04f, +2.693099346e-06f, +4.716071764e-04f, -9.181381898e-04f, +7.035481900e-04f, +4.504588533e-04f, -1.868519948e-03f, +2.212789912e-03f, -7.030032145e-04f, -1.845359890e-03f, +3.408857351e-03f, -2.490700469e-03f, -3.861118649e-04f, +2.985948991e-03f, -3.298229076e-03f, +1.273052197e-03f, +1.281268207e-03f, -2.422921794e-03f, +1.678687701e-03f, -1.075964685e-04f, -9.351215115e-04f, +9.503729501e-04f, -3.841981137e-04f, -9.381007205e-05f, +2.130536507e-04f, -1.198041350e-04f, +2.643210268e-05f, + /* 12, 2 (28) */ + +8.643468934e-05f, +1.863687867e-03f, -3.988553953e-03f, +1.817326873e-03f, +6.939804807e-03f, -1.553954296e-02f, +1.001956106e-02f, +1.582645699e-02f, -4.441104094e-02f, +3.828057650e-02f, +2.960049363e-02f, -1.410454666e-01f, +2.213484874e-01f, +6.850593414e-01f, +3.017773770e-01f, -1.349593851e-01f, +5.641878176e-03f, +5.249565646e-02f, -4.383352246e-02f, +8.252769153e-03f, +1.570520902e-02f, -1.624674774e-02f, +4.795500382e-03f, +3.722389172e-03f, -4.479842259e-03f, +1.522642122e-03f, +4.326997854e-04f, -4.846243802e-04f, + -7.837259355e-05f, +5.544275033e-05f, +1.619532692e-04f, -4.699237877e-04f, +4.279728673e-04f, +3.484126929e-04f, -1.476424179e-03f, +1.634857349e-03f, +3.696919477e-04f, -3.835463284e-03f, +5.344548510e-03f, +1.734178923e-04f, -1.978103177e-02f, -2.642039421e-03f, +2.018558845e-02f, +3.304936433e-03f, -6.531484372e-03f, +3.175957353e-03f, +6.772374843e-04f, -2.117868078e-03f, +1.329658048e-03f, +7.271196806e-06f, -6.365162621e-04f, +4.709614541e-04f, -7.791644304e-05f, -1.150900565e-04f, +9.296887939e-05f, -2.515381512e-05f, + -8.643468934e-05f, -1.506813900e-03f, +5.441787664e-03f, -6.800042395e-03f, -2.786251825e-05f, +1.376927111e-02f, -2.267796980e-02f, +1.329634923e-02f, +1.383696745e-02f, -3.862759146e-02f, +3.656505097e-02f, -3.181912001e-03f, -3.728476053e-02f, +5.121726357e-02f, -2.630431811e-02f, -1.663040399e-02f, +4.281993136e-02f, -3.465195799e-02f, +4.543246681e-03f, +2.041054596e-02f, -2.380037781e-02f, +1.048614150e-02f, +3.718572078e-03f, -8.517738462e-03f, +5.250105333e-03f, -7.378319605e-04f, -9.640400678e-04f, +4.846243802e-04f, + +7.837259355e-05f, -1.557543963e-04f, -2.610804149e-05f, +4.945347714e-04f, -8.982611748e-04f, +6.213378295e-04f, +5.575549909e-04f, -1.911723046e-03f, +2.121286551e-03f, -5.048633795e-04f, -2.016582388e-03f, +3.411296493e-03f, -2.299989110e-03f, -6.413306954e-04f, +3.122510283e-03f, -3.227329962e-03f, +1.065821184e-03f, +1.465248192e-03f, -2.469937770e-03f, +1.596030675e-03f, +1.204521806e-05f, -1.005766924e-03f, +9.514704756e-04f, -3.491375938e-04f, -1.252430481e-04f, +2.257559918e-04f, -1.201746071e-04f, +2.515381512e-05f, + /* 12, 3 (28) */ + +8.062095791e-06f, +1.919130618e-03f, -3.826600684e-03f, +1.347403086e-03f, +7.367777674e-03f, -1.519113027e-02f, +8.543136885e-03f, +1.746131434e-02f, -4.404134900e-02f, +3.444511322e-02f, +3.494504214e-02f, -1.408720487e-01f, +2.015674556e-01f, +6.824173020e-01f, +3.219629655e-01f, -1.316544486e-01f, -8.896061963e-04f, +5.567161382e-02f, -4.315628498e-02f, +6.134901075e-03f, +1.703486706e-02f, -1.623947655e-02f, +4.158984120e-03f, +4.193350626e-03f, -4.557758702e-03f, +1.407552065e-03f, +5.256686648e-04f, -5.097781953e-04f, + -7.449492353e-05f, +4.373845388e-05f, +1.751393235e-04f, -4.629835816e-04f, +3.825177745e-04f, +4.111248556e-04f, -1.483893463e-03f, +1.519920503e-03f, +5.647954722e-04f, -3.909331578e-03f, +5.050687187e-03f, +8.093325730e-04f, -1.955462103e-02f, -3.688363072e-03f, +2.011548148e-02f, +4.046497979e-03f, -6.701697695e-03f, +2.987242269e-03f, +8.946875297e-04f, -2.191974093e-03f, +1.278292778e-03f, +8.483291066e-05f, -6.727852572e-04f, +4.639829239e-04f, -5.784337511e-05f, -1.267940064e-04f, +9.470218299e-05f, -2.361553000e-05f, + -8.062095791e-06f, -1.662568296e-03f, +5.415679622e-03f, -6.305507623e-03f, -9.261236930e-04f, +1.439060894e-02f, -2.212041481e-02f, +1.138462619e-02f, +1.595825400e-02f, -3.913245484e-02f, +3.454846858e-02f, +2.293844911e-04f, -3.958474964e-02f, +5.057593288e-02f, -2.318180783e-02f, -1.985773396e-02f, +4.388575255e-02f, -3.318670980e-02f, +2.073308911e-03f, +2.200657664e-02f, -2.378833259e-02f, +9.480374572e-03f, +4.670042554e-03f, -8.866876055e-03f, +5.124862285e-03f, -5.120759688e-04f, -1.084214675e-03f, +5.097781953e-04f, + +7.449492353e-05f, -1.403354128e-04f, -5.388970461e-05f, +5.142632352e-04f, -8.741298214e-04f, +5.373958055e-04f, +6.602028232e-04f, -1.944678327e-03f, +2.019966433e-03f, -3.057434476e-04f, -2.176626640e-03f, +3.396533172e-03f, -2.098072660e-03f, -8.932778993e-04f, +3.243543226e-03f, -3.139848145e-03f, +8.520233772e-04f, +1.643181823e-03f, -2.504794604e-03f, +1.504166230e-03f, +1.333887276e-04f, -1.072400192e-03f, +9.475452486e-04f, -3.113046415e-04f, -1.569321239e-04f, +2.375994722e-04f, -1.197612733e-04f, +2.361553000e-05f, + /* 12, 4 (28) */ + -6.643282774e-05f, +1.962869071e-03f, -3.651461360e-03f, +8.844195042e-04f, +7.750295448e-03f, -1.478000541e-02f, +7.059243422e-03f, +1.898123484e-02f, -4.347655352e-02f, +3.053578164e-02f, +3.999572933e-02f, -1.400627162e-01f, +1.820128346e-01f, +6.787289389e-01f, +3.420784470e-01f, -1.276079507e-01f, -7.591303891e-03f, +5.865885609e-02f, -4.226159745e-02f, +3.942926982e-03f, +1.831315984e-02f, -1.615464364e-02f, +3.486198863e-03f, +4.657333550e-03f, -4.615602077e-03f, +1.280758059e-03f, +6.203708478e-04f, -5.333937253e-04f, + -7.037678577e-05f, +3.224806064e-05f, +1.870351037e-04f, -4.539946472e-04f, +3.363811173e-04f, +4.704523592e-04f, -1.484268751e-03f, +1.400338575e-03f, +7.532431649e-04f, -3.963857823e-03f, +4.741772964e-03f, +1.421169971e-03f, -1.928225905e-02f, -4.724238005e-03f, +1.999393623e-02f, +4.798322993e-03f, -6.846216993e-03f, +2.780412143e-03f, +1.112603523e-03f, -2.257300314e-03f, +1.219712128e-03f, +1.637879495e-04f, -7.066899060e-04f, +4.545072392e-04f, -3.683518294e-05f, -1.382636177e-04f, +9.596938431e-05f, -2.181467077e-05f, + +6.643282774e-05f, -1.802903709e-03f, +5.361789918e-03f, -5.791244388e-03f, -1.800253514e-03f, +1.492800474e-02f, -2.146021198e-02f, +9.439947860e-03f, +1.797822043e-02f, -3.943819829e-02f, +3.237184194e-02f, +3.625917663e-03f, -4.168282230e-02f, +4.968265498e-02f, -1.993826460e-02f, -2.299758210e-02f, +4.473777593e-02f, -3.154352798e-02f, -4.314856932e-04f, +2.351074287e-02f, -2.365494387e-02f, +8.407974380e-03f, +5.617587802e-03f, -9.178180697e-03f, +4.967930161e-03f, -2.744764966e-04f, -1.203975948e-03f, +5.333937253e-04f, + +7.037678577e-05f, -1.246878551e-04f, -8.052564960e-05f, +5.307640527e-04f, -8.459605991e-04f, +4.521922591e-04f, +7.579353121e-04f, -1.967341574e-03f, +1.909447527e-03f, -1.066697545e-04f, -2.324740980e-03f, +3.364710146e-03f, -1.886003496e-03f, -1.140668745e-03f, +3.348403385e-03f, -3.036172011e-03f, +6.327198303e-04f, +1.814106837e-03f, -2.527194232e-03f, +1.403462982e-03f, +2.558207948e-04f, -1.134597567e-03f, +9.385154098e-04f, -2.708410303e-04f, -1.887030176e-04f, +2.484817892e-04f, -1.185333513e-04f, +2.181467077e-05f, + /* 12, 5 (28) */ + -1.368096135e-04f, +1.995117132e-03f, -3.464426257e-03f, +4.304248570e-04f, +8.086676566e-03f, -1.430955305e-02f, +5.574974672e-03f, +2.038157341e-02f, -4.272331036e-02f, +2.657192382e-02f, +4.473750230e-02f, -1.386415462e-01f, +1.627305755e-01f, +6.740047009e-01f, +3.620723832e-01f, -1.228096277e-01f, -1.443752088e-02f, +6.143926823e-02f, -4.114899392e-02f, +1.685626668e-03f, +1.953287197e-02f, -1.599085569e-02f, +2.779508957e-03f, +5.111840789e-03f, -4.652437260e-03f, +1.142494441e-03f, +7.163402321e-04f, -5.552083961e-04f, + -6.605259312e-05f, +2.102528838e-05f, +1.976200705e-04f, -4.430574496e-04f, +2.898028574e-04f, +5.261896628e-04f, -1.477699978e-03f, +1.276762484e-03f, +9.343097736e-04f, -3.999212509e-03f, +4.419484716e-03f, +2.007365906e-03f, -1.896532500e-02f, -5.746740681e-03f, +1.982080948e-02f, +5.558102500e-03f, -6.963764219e-03f, +2.555999392e-03f, +1.329982526e-03f, -2.313354339e-03f, +1.154040886e-03f, +2.437847990e-04f, -7.380043028e-04f, +4.425137977e-04f, -1.497213655e-05f, -1.494280070e-04f, +9.674314000e-05f, -1.975036269e-05f, + +1.368096135e-04f, -1.927591564e-03f, +5.281264268e-03f, -5.260480335e-03f, -2.646214113e-03f, +1.538019700e-02f, -2.070227667e-02f, +7.472606287e-03f, +1.988766796e-02f, -3.954486805e-02f, +3.004710096e-02f, +6.990627809e-03f, -4.356882579e-02f, +4.854198623e-02f, -1.658986122e-02f, -2.603375411e-02f, +4.537049576e-02f, -2.972942114e-02f, -2.958679925e-03f, +2.491420585e-02f, -2.339912307e-02f, +7.273376813e-03f, +6.556103212e-03f, -9.449021727e-03f, +4.779227143e-03f, -2.599470746e-05f, -1.322509300e-03f, +5.552083961e-04f, + +6.605259312e-05f, -1.089134097e-04f, -1.058997420e-04f, +5.440272734e-04f, -8.139874555e-04f, +3.661959696e-04f, +8.503180963e-04f, -1.979722913e-03f, +1.790389534e-03f, +9.133959482e-05f, -2.460239749e-03f, +3.316057636e-03f, -1.664884210e-03f, -1.382242268e-03f, +3.436528816e-03f, -2.916775147e-03f, +4.090059313e-04f, +1.977090400e-03f, -2.536901083e-03f, +1.294340562e-03f, +3.787136644e-04f, -1.191952126e-03f, +9.243255382e-04f, -2.279066910e-04f, -2.203761488e-04f, +2.583032615e-04f, -1.164644421e-04f, +1.975036269e-05f, + /* 12, 6 (28) */ + -2.028622066e-04f, +2.016142420e-03f, -3.266806186e-03f, -1.263259257e-05f, +8.376479423e-03f, -1.378336339e-02f, +4.097274693e-03f, +2.165833590e-02f, -4.178900058e-02f, +2.257271131e-02f, +4.915698701e-02f, -1.366341803e-01f, +1.437652505e-01f, +6.682579602e-01f, +3.818931927e-01f, -1.172515252e-01f, -2.140128510e-02f, +6.399526762e-02f, -3.981901140e-02f, -6.277276711e-04f, +2.068691286e-02f, -1.574707089e-02f, +2.041504654e-03f, +5.554354587e-03f, -4.667409396e-03f, +9.930664343e-04f, +8.130833721e-04f, -5.749587588e-04f, + -6.155665152e-05f, +1.012057341e-05f, +2.068810931e-04f, -4.302795444e-04f, +2.430193108e-04f, +5.781530785e-04f, -1.464366781e-03f, +1.149848588e-03f, +1.107318143e-03f, -4.015647081e-03f, +4.085519624e-03f, +2.566473571e-03f, -1.860533153e-02f, -6.752993596e-03f, +1.959612522e-02f, +6.323465047e-03f, -7.053141674e-03f, +2.314625740e-03f, +1.545803574e-03f, -2.359677465e-03f, +1.081440572e-03f, +3.244589710e-04f, -7.665099949e-04f, +4.279943131e-04f, +7.658595322e-06f, -1.602155927e-04f, +9.699801152e-05f, -1.742350407e-05f, + +2.028622066e-04f, -2.036504974e-03f, +5.175364526e-03f, -4.716453062e-03f, -3.460201569e-03f, +1.574639297e-02f, -1.985195857e-02f, +5.492883374e-03f, +2.167805749e-02f, -3.945352845e-02f, +2.758686121e-02f, +1.030668545e-02f, -4.523371000e-02f, +4.715974396e-02f, -1.315333240e-02f, -2.895052926e-02f, +4.577950169e-02f, -2.775233074e-02f, -5.495581009e-03f, +2.620854641e-02f, -2.302040941e-02f, +6.081424687e-03f, +7.480428750e-03f, -9.676928418e-03f, +4.558850994e-03f, +2.323085540e-04f, -1.438973742e-03f, +5.749587588e-04f, + +6.155665152e-05f, -9.311119447e-05f, -1.299063660e-04f, +5.540611438e-04f, -7.784601854e-04f, +2.798718401e-04f, +9.369513494e-04f, -1.981886117e-03f, +1.663490005e-03f, +2.872800010e-04f, -2.582506499e-03f, +3.250891791e-03f, -1.435861754e-03f, -1.616767842e-03f, +3.507443127e-03f, -2.782214148e-03f, +1.820058337e-04f, +2.131234238e-03f, -2.533743915e-03f, +1.177267952e-03f, +5.014282841e-04f, -1.244076270e-03f, +9.049474690e-04f, -1.826792043e-04f, -2.517675669e-04f, +2.669675349e-04f, -1.135328592e-04f, +1.742350407e-05f, + /* 12, 7 (28) */ + -2.644188582e-04f, +2.026262994e-03f, -3.059925093e-03f, -4.429121370e-04f, +8.619498734e-03f, -1.320521031e-02f, +2.632907913e-03f, +2.280818449e-02f, -4.068168244e-02f, +1.855706423e-02f, +5.324250664e-02f, -1.340677067e-01f, +1.251599190e-01f, +6.615049666e-01f, +4.014893179e-01f, -1.109280601e-01f, -2.845442678e-02f, +6.630989336e-02f, -3.827320782e-02f, -2.987405136e-03f, +2.176835343e-02f, -1.542261192e-02f, +1.274994659e-03f, +5.982348900e-03f, -4.659750801e-03f, +8.328508416e-04f, +9.100813836e-04f, -5.923822628e-04f, + -5.692295785e-05f, -4.191045679e-07f, +2.148123063e-04f, -4.157748484e-04f, +1.962620639e-04f, +6.261811852e-04f, -1.444477025e-03f, +1.020255514e-03f, +1.271641366e-03f, -4.013491294e-03f, +3.741586035e-03f, +3.097167353e-03f, -1.820391845e-02f, -7.740175145e-03f, +1.932007553e-02f, +7.091984704e-03f, -7.113238123e-03f, +2.057001262e-03f, +1.759031996e-03f, -2.395847519e-03f, +1.002109424e-03f, +4.054345159e-04f, -7.919972572e-04f, +4.109531747e-04f, +3.096321530e-05f, -1.705544752e-04f, +9.671068632e-05f, -1.483682833e-05f, + +2.644188582e-04f, -2.129616169e-03f, +5.045458160e-03f, -4.162391918e-03f, -4.238661754e-03f, +1.602626481e-02f, -1.891500722e-02f, +3.510997257e-03f, +2.334154750e-02f, -3.916624845e-02f, +2.500435471e-02f, +1.355757724e-02f, -4.666957176e-02f, +4.554297612e-02f, -9.645889277e-03f, -3.173274341e-02f, +4.596150752e-02f, -2.562109651e-02f, -8.029324923e-03f, +2.738581436e-02f, -2.251898112e-02f, +4.837348417e-03f, +8.385376219e-03f, -9.859607622e-03f, +4.307083428e-03f, +4.992760890e-04f, -1.552506601e-03f, +5.923822628e-04f, + +5.692295785e-05f, -7.737722171e-05f, -1.524507642e-04f, +5.608916427e-04f, -7.396427412e-04f, +1.936784465e-04f, +1.017471423e-03f, -1.973947623e-03f, +1.529480302e-03f, +4.801655327e-04f, -2.690996815e-03f, +3.169612698e-03f, -1.200121368e-03f, -1.843051590e-03f, +3.560758106e-03f, -2.633125982e-03f, -4.713329735e-05f, +2.275679629e-03f, -2.517617312e-03f, +1.052761539e-03f, +6.233176040e-04f, -1.290604166e-03f, +8.803809735e-04f, -1.353531788e-04f, -2.826899302e-04f, +2.743822870e-04f, -1.097219377e-04f, +1.483682833e-05f, + /* 12, 8 (28) */ + -3.213418160e-04f, +2.025843889e-03f, -2.845112787e-03f, -8.586869854e-04f, +8.815760798e-03f, -1.257902913e-02f, +1.188430887e-03f, +2.382844000e-02f, -3.941004108e-02f, +1.454357293e-02f, +5.698409267e-02f, -1.309705394e-01f, +1.069560005e-01f, +6.537647915e-01f, +4.208093934e-01f, -1.038360754e-01f, -3.556766490e-02f, +6.836689462e-02f, -3.651417583e-02f, -5.383252654e-03f, +2.277046285e-02f, -1.501717740e-02f, +4.829974021e-04f, +6.393302074e-03f, -4.628787586e-03f, +6.622963664e-04f, +1.006792070e-03f, -6.072190912e-04f, + -5.218500633e-05f, -1.055037285e-05f, +2.214149336e-04f, -3.996628950e-04f, +1.497569375e-04f, +6.701351241e-04f, -1.418265244e-03f, +8.886410456e-04f, +1.426704663e-03f, -3.993150278e-03f, +3.389396395e-03f, +3.598246142e-03f, -1.776284596e-02f, -8.705529283e-03f, +1.899302076e-02f, +7.861189361e-03f, -7.143034629e-03f, +1.783923012e-03f, +1.968623882e-03f, -2.421481573e-03f, +9.162821881e-04f, +4.863256222e-04f, -8.142663520e-04f, +3.914077491e-04f, +5.484161054e-05f, -1.803728297e-04f, +9.586019359e-05f, -1.199495602e-05f, + +3.213418160e-04f, -2.206993390e-03f, +4.893007396e-03f, -3.601500275e-03f, -4.978304495e-03f, +1.621994326e-02f, -1.789753580e-02f, +1.537049634e-03f, +2.487102780e-02f, -3.868608292e-02f, +2.231335790e-02f, +1.672718993e-02f, -4.786969313e-02f, +4.369992453e-02f, -6.085131171e-03f, -3.436586939e-02f, +4.591437422e-02f, -2.334541688e-02f, -1.054694224e-02f, +2.843857590e-02f, -2.189566352e-02f, +3.546744251e-03f, +9.265757193e-03f, -9.994960801e-03f, +4.024393497e-03f, +7.736583760e-04f, -1.662228538e-03f, +6.072190912e-04f, + +5.218500633e-05f, -6.180389510e-05f, -1.734493045e-04f, +5.645619254e-04f, -6.978114977e-04f, +1.080656606e-04f, +1.091552273e-03f, -1.956075280e-03f, +1.389121404e-03f, +6.690339518e-04f, -2.785240741e-03f, +3.072701960e-03f, -9.588803138e-04f, -2.059942603e-03f, +3.596175871e-03f, -2.470224928e-03f, -2.772471895e-04f, +2.409612213e-03f, -2.488482851e-03f, +9.213828945e-04f, +7.437299621e-04f, -1.331194103e-03f, +8.506542926e-04f, -8.613951762e-05f, -3.129535284e-04f, +2.804599254e-04f, -1.050203171e-04f, +1.199495602e-05f, + /* 12, 9 (28) */ + -3.735268223e-04f, +2.015293516e-03f, -2.623697853e-03f, -1.258349880e-03f, +8.965517735e-03f, -1.190889400e-02f, -2.298343566e-04f, +2.471708105e-02f, -3.798333641e-02f, +1.055042265e-02f, +6.037348907e-02f, -1.273722932e-01f, +8.919315458e-02f, +6.450592622e-01f, +4.398024142e-01f, -9.597488606e-02f, -4.271069953e-02f, +7.015081764e-02f, -3.454555195e-02f, -7.804734227e-03f, +2.368674504e-02f, -1.453085178e-02f, -3.312689499e-04f, +6.784709823e-03f, -4.573945975e-03f, +4.819235367e-04f, +1.102652264e-03f, -6.192140472e-04f, + -4.737560409e-05f, -2.023359148e-05f, +2.266970762e-04f, -3.820680803e-04f, +1.037230035e-04f, +7.098987788e-04f, -1.385990967e-03f, +7.556590677e-04f, +1.571987000e-03f, -3.955101323e-03f, +3.030660260e-03f, +4.068636115e-03f, -1.728398750e-02f, -9.646374929e-03f, +1.861548917e-02f, +8.628569271e-03f, -7.141610102e-03f, +1.496273273e-03f, +2.173530669e-03f, -2.436238526e-03f, +8.242297451e-04f, +5.667383000e-04f, -8.331287663e-04f, +3.693886228e-04f, +7.918770840e-05f, -1.895993105e-04f, +9.442811283e-05f, -8.904436267e-06f, + +3.735268223e-04f, -2.268797285e-03f, +4.719558091e-03f, -3.036938350e-03f, -5.676115993e-03f, +1.632800892e-02f, -1.680598353e-02f, -4.190256462e-04f, +2.626014920e-02f, -3.801704897e-02f, +1.952811716e-02f, +1.979989189e-02f, -4.882857344e-02f, +4.163998193e-02f, -2.488955300e-03f, -3.683609432e-02f, +4.563712703e-02f, -2.093580466e-02f, -1.303542509e-02f, +2.935995880e-02f, -2.115193356e-02f, +2.215550148e-03f, +1.011641149e-02f, -1.008110032e-02f, +3.711439969e-03f, +1.054118301e-03f, -1.767248856e-03f, +6.192140472e-04f, + +4.737560409e-05f, -4.647954436e-05f, -1.928296731e-04f, +5.651316816e-04f, -6.532534799e-04f, +2.347236056e-05f, +1.158906659e-03f, -1.928486842e-03f, +1.243199610e-03f, +8.529515726e-04f, -2.864844789e-03f, +2.960719855e-03f, -7.133814587e-04f, -2.266338921e-03f, +3.613490558e-03f, -2.294299080e-03f, -5.071604885e-04f, +2.532266599e-03f, -2.446369913e-03f, +7.837362753e-04f, +8.620125415e-04f, -1.365530751e-03f, +8.158245201e-04f, -3.526457500e-05f, -3.423673458e-04f, +2.851182762e-04f, -9.942219887e-05f, +8.904436267e-06f, + /* 12,10 (28) */ + -4.209024264e-04f, +1.995059925e-03f, -2.397000777e-03f, -1.640417961e-03f, +9.069240739e-03f, -1.119899522e-02f, -1.615825324e-03f, +2.547274011e-02f, -3.641134941e-02f, +6.595321331e-03f, +6.340414933e-02f, -1.233036571e-01f, +7.190916708e-02f, +6.354128872e-01f, +4.584179034e-01f, -8.734631679e-02f, -4.985230963e-02f, +7.164709091e-02f, -3.237202128e-02f, -1.024097275e-02f, +2.451097478e-02f, -1.396411348e-02f, -1.164397716e-03f, +7.154098446e-03f, -4.494758267e-03f, +2.923242262e-04f, +1.197080376e-03f, -6.281184835e-04f, + -4.252669699e-05f, -2.943295419e-05f, +2.306734722e-04f, -3.631189019e-04f, +5.837165877e-05f, +7.453788393e-04f, -1.347936973e-03f, +6.219565921e-04f, +1.707022422e-03f, -3.899890411e-03f, +2.667077432e-03f, +4.507393009e-03f, -1.676932219e-02f, -1.056011508e-02f, +1.818817593e-02f, +9.391585822e-03f, -7.108146529e-03f, +1.195017402e-03f, +2.372703831e-03f, -2.439821533e-03f, +7.262585434e-04f, +6.462721396e-04f, -8.484084206e-04f, +3.449397811e-04f, +1.038898739e-04f, -1.981634645e-04f, +9.239877388e-05f, -5.573777025e-06f, + +4.209024264e-04f, -2.315276830e-03f, +4.526728418e-03f, -2.471806669e-03f, -6.329369473e-03f, +1.635148128e-02f, -1.564707687e-02f, -2.347512488e-03f, +2.750334881e-02f, -3.716409739e-02f, +1.666327237e-02f, +2.276061175e-02f, -4.954195490e-02f, +3.937364301e-02f, +1.124535258e-03f, -3.913039340e-02f, +4.512996655e-02f, -1.840353806e-02f, -1.548179500e-02f, +3.014369507e-02f, -2.028992102e-02f, +8.500193977e-04f, +1.093223601e-02f, -1.011636489e-02f, +3.369072623e-03f, +1.339236578e-03f, -1.866671054e-03f, +6.281184835e-04f, + +4.252669699e-05f, -3.148799859e-05f, -2.105309957e-04f, +5.626764120e-04f, -6.062645651e-04f, -5.967576009e-05f, +1.219287120e-03f, -1.891448198e-03f, +1.092522140e-03f, +1.031017933e-03f, -2.929493549e-03f, +2.834302082e-03f, -4.648867336e-04f, -2.461193263e-03f, +3.612589519e-03f, -2.106206468e-03f, -7.356928729e-04f, +2.642930742e-03f, -2.391376140e-03f, +6.404658755e-04f, +9.775148784e-04f, -1.393327309e-03f, +7.759778291e-04f, +1.703079537e-05f, -3.707401563e-04f, +2.882812579e-04f, -9.292757299e-05f, +5.573777025e-06f, + /* 12,11 (28) */ + -4.634291234e-04f, +1.965626971e-03f, -2.166327305e-03f, -2.003536863e-03f, +9.127612398e-03f, -1.045361638e-02f, -2.963762297e-03f, +2.609469671e-02f, -3.470432699e-02f, +2.695430920e-03f, +6.607122676e-02f, -1.187962641e-01f, +5.513984490e-02f, +6.248527722e-01f, +4.766060793e-01f, -7.795473097e-02f, -5.696045616e-02f, +7.284210831e-02f, -2.999931745e-02f, -1.268079429e-02f, +2.523723333e-02f, -1.331784134e-02f, -2.012806137e-03f, +7.499038227e-03f, -4.390868393e-03f, +9.416076170e-05f, +1.289479150e-03f, -6.336922605e-04f, + -3.766920629e-05f, -3.811656467e-05f, +2.333652264e-04f, -3.429471964e-04f, +1.390575777e-05f, +7.765047531e-04f, -1.304407456e-03f, +4.881708689e-04f, +1.831401118e-03f, -3.828128510e-03f, +2.300331234e-03f, +4.913703855e-03f, -1.622092695e-02f, -1.144424563e-02f, +1.771194149e-02f, +1.014768050e-02f, -7.041933861e-03f, +8.812012801e-04f, +2.565099662e-03f, -2.431980281e-03f, +6.227098544e-04f, +7.245221393e-04f, -8.599428424e-04f, +3.181187218e-04f, +1.288313475e-04f, -2.059961522e-04f, +8.975944697e-05f, -2.013463527e-06f, + +4.634291234e-04f, -2.346764828e-03f, +4.316197423e-03f, -1.909130257e-03f, -6.935634038e-03f, +1.629180552e-02f, -1.442778975e-02f, -4.238960687e-03f, +2.859587095e-02f, -3.613307946e-02f, +1.373377882e-02f, +2.559491383e-02f, -5.000684163e-02f, +3.691244974e-02f, +4.737124778e-03f, -4.123659986e-02f, +4.439427367e-02f, -1.576060732e-02f, -1.787317114e-02f, +3.078416095e-02f, -1.931240614e-02f, -5.433079116e-04f, +1.170821383e-02f, -1.009933410e-02f, +2.998332467e-03f, +1.627517835e-03f, -1.959598627e-03f, +6.336922605e-04f, + +3.766920629e-05f, -1.690820033e-05f, -2.265038872e-04f, +5.572866306e-04f, -5.571476709e-04f, -1.409682746e-04f, +1.272486715e-03f, -1.845271380e-03f, +9.379126719e-04f, +1.202370254e-03f, -2.978950855e-03f, +2.694156138e-03f, -2.146705087e-04f, -2.643518461e-03f, +3.593454033e-03f, -1.906870778e-03f, -9.616652248e-04f, +2.740950072e-03f, -2.323667529e-03f, +4.922528271e-04f, +1.089592404e-03f, -1.414327532e-03f, +7.312295386e-04f, +7.049229540e-05f, -3.978816489e-04f, +2.898795343e-04f, -8.554241336e-05f, +2.013463527e-06f, + /* 12,12 (28) */ + -5.010983297e-04f, +1.927510406e-03f, -1.932962079e-03f, -2.346484059e-03f, +9.141518155e-03f, -9.677111632e-03f, -4.268169753e-03f, +2.658286758e-02f, -3.287292587e-02f, -1.132697590e-03f, +6.837155799e-02f, -1.138825602e-01f, +3.891891795e-02f, +6.134085265e-01f, +4.943180208e-01f, -6.780705047e-02f, -6.400239002e-02f, +7.372330959e-02f, -2.743421778e-02f, -1.511277457e-02f, +2.585994318e-02f, -1.259331920e-02f, -2.872748979e-03f, +7.817156949e-03f, -4.262037045e-03f, -1.118353905e-04f, +1.379238597e-03f, -6.357057240e-04f, + -3.283287688e-05f, -4.625648846e-05f, +2.347995131e-04f, -3.216873788e-04f, -2.948119133e-05f, +8.032285666e-04f, -1.255726135e-03f, +3.549265999e-04f, +1.944770211e-03f, -3.740487645e-03f, +1.932081960e-03f, +5.286888184e-03f, -1.564096834e-02f, -1.229636377e-02f, +1.718780930e-02f, +1.089428401e-02f, -6.942374530e-03f, +5.559483860e-04f, +2.749684116e-03f, -2.412513083e-03f, +5.139588436e-04f, +8.010805940e-04f, -8.675842964e-04f, +2.889965021e-04f, +1.538907230e-04f, -2.130299734e-04f, +8.650052123e-05f, +1.764035475e-06f, + +5.010983297e-04f, -2.363673029e-03f, +4.089693535e-03f, -1.351843626e-03f, -7.492781709e-03f, +1.615083724e-02f, -1.315530303e-02f, -6.084232066e-03f, +2.953378363e-02f, -3.493070921e-02f, +1.075482796e-02f, +2.828906997e-02f, -5.022151214e-02f, +3.426893128e-02f, +8.330578811e-03f, -4.314347064e-02f, +4.343260845e-02f, -1.301965725e-02f, -2.019683867e-02f, +3.127641377e-02f, -1.822281373e-02f, -1.957635444e-03f, +1.243944337e-02f, -1.002884180e-02f, +2.600450818e-03f, +1.917397370e-03f, -2.045141041e-03f, +6.357057240e-04f, + +3.283287688e-05f, -2.813861650e-06f, -2.407104306e-04f, +5.490669975e-04f, -5.062109379e-04f, -2.200119860e-04f, +1.318339542e-03f, -1.790312330e-03f, +7.802068301e-04f, +1.366187658e-03f, -3.013060547e-03f, +2.541057314e-03f, +3.598708343e-05f, -2.812392575e-03f, +3.556159520e-03f, -1.697276728e-03f, -1.183905825e-03f, +2.825731336e-03f, -2.243478158e-03f, +3.398119693e-04f, +1.197610003e-03f, -1.428307611e-03f, +6.817240173e-04f, +1.248533379e-04f, -4.236035727e-04f, +2.898511448e-04f, -7.727883873e-05f, -1.764035475e-06f, + /* 12,13 (28) */ + -5.339312066e-04f, +1.881253918e-03f, -1.698162565e-03f, -2.668171438e-03f, +9.112036964e-03f, -8.873883065e-03f, -5.523895888e-03f, +2.693779418e-02f, -3.092815566e-02f, -4.873185235e-03f, +7.030363995e-02f, -1.085956721e-01f, +2.327794960e-02f, +6.011121628e-01f, +5.115058301e-01f, -5.691276645e-02f, -7.094476455e-02f, +7.427925798e-02f, -2.468453367e-02f, -1.752528765e-02f, +2.637390203e-02f, -1.179223861e-02f, -3.740333276e-03f, +8.106153451e-03f, -4.108146322e-03f, -3.248653639e-04f, +1.465739118e-03f, -6.339416885e-04f, + -2.804613760e-05f, -5.382878091e-05f, +2.350092550e-04f, -2.994756875e-04f, -7.160576514e-05f, +8.255246579e-04f, -1.202234304e-03f, +2.228332636e-04f, +2.046834271e-03f, -3.637696777e-03f, +1.563960519e-03f, +5.626398709e-03f, -1.503169408e-02f, -1.311417610e-02f, +1.661696301e-02f, +1.162882552e-02f, -6.808987577e-03f, +2.204564815e-04f, +2.925437697e-03f, -2.381268781e-03f, +4.004134605e-04f, +8.755390372e-04f, -8.712008671e-04f, +2.576577157e-04f, +1.789424619e-04f, -2.191996958e-04f, +8.261567046e-05f, +5.744274138e-06f, + +5.339312066e-04f, -2.366486890e-03f, +3.848983105e-03f, -8.027766284e-04f, -7.998992647e-03f, +1.593082526e-02f, -1.183696349e-02f, -7.874544396e-03f, +3.031399046e-02f, -3.356452155e-02f, +7.741767417e-03f, +3.083012728e-02f, -5.018552506e-02f, +3.145653871e-02f, +1.188673833e-02f, -4.484074737e-02f, +4.224870262e-02f, -1.019392592e-02f, -2.244031683e-02f, +3.161622574e-02f, -1.702520373e-02f, -3.385943055e-03f, +1.312116739e-02f, -9.903988465e-03f, +2.176847245e-03f, +2.207248515e-03f, -2.122419880e-03f, +6.339416885e-04f, + +2.804613760e-05f, +1.072683668e-05f, -2.531240887e-04f, +5.381353907e-04f, -4.537659197e-04f, -2.964327627e-04f, +1.356721015e-03f, -1.726968476e-03f, +6.202476605e-04f, +1.521695141e-03f, -3.031746785e-03f, +2.375844364e-03f, +2.858068374e-04f, -2.966963659e-03f, +3.500875260e-03f, -1.478465097e-03f, -1.401256537e-03f, +2.896746143e-03f, -2.151109553e-03f, +1.838884019e-04f, +1.300945557e-03f, -1.435077914e-03f, +6.276344208e-04f, +1.798362973e-04f, -4.477208986e-04f, +2.881421043e-04f, -6.815523746e-05f, -5.744274138e-06f, + /* 12,14 (28) */ + -5.619773442e-04f, +1.827425137e-03f, -1.463153310e-03f, -2.967647125e-03f, +9.040431199e-03f, -8.048358407e-03f, -6.726130192e-03f, +2.716062744e-02f, -2.888132139e-02f, -8.510882012e-03f, +7.186760047e-02f, -1.029692733e-01f, +8.246255527e-03f, +5.879979867e-01f, +5.281227931e-01f, -4.528394094e-02f, -7.775375213e-02f, +7.449971446e-02f, -2.175909597e-02f, -1.990655643e-02f, +2.677431549e-02f, -1.091669957e-02f, -4.611534143e-03f, +8.363811167e-03f, -3.929203860e-03f, -5.440650596e-04f, +1.548354789e-03f, -6.281974144e-04f, + -2.333597420e-05f, -6.081349163e-05f, +2.340327803e-04f, -2.764494391e-04f, -1.122952956e-04f, +8.433893668e-04f, -1.144288835e-03f, +9.248256318e-05f, +2.137355562e-03f, -3.520537505e-03f, +1.197562299e-03f, +5.931821479e-03f, -1.439542430e-02f, -1.389550624e-02f, +1.600074300e-02f, +1.234874197e-02f, -6.641412367e-03f, -1.240060706e-04f, +3.091360370e-03f, -2.338148458e-03f, +2.825131478e-04f, +9.474902263e-04f, -8.706774845e-04f, +2.242003990e-04f, +2.038574445e-04f, -2.244426840e-04f, +7.810200457e-05f, +9.910848994e-06f, + +5.619773442e-04f, -2.355760054e-03f, +3.595859016e-03f, -2.646412378e-04f, -8.452758567e-03f, +1.563439249e-02f, -1.048024248e-02f, -9.601512872e-03f, +3.093423812e-02f, -3.204282641e-02f, +4.710020632e-03f, +3.320597165e-02f, -4.989971822e-02f, +2.848957505e-02f, +1.538761359e-02f, -4.631921247e-02f, +4.084744609e-02f, -7.297179773e-03f, -2.459142638e-02f, +3.180011415e-02f, -1.572425817e-02f, -4.821020969e-03f, +1.374880181e-02f, -9.724152168e-03f, +1.729126347e-03f, +2.495390619e-03f, -2.190575117e-03f, +6.281974144e-04f, + +2.333597420e-05f, +2.365150215e-05f, -2.637295487e-04f, +5.246219214e-04f, -4.001257885e-04f, -3.698772374e-04f, +1.387547919e-03f, -1.655676099e-03f, +4.588811080e-04f, +1.668167263e-03f, -3.035013953e-03f, +2.199414847e-03f, +5.335171447e-04f, -3.106454162e-03f, +3.427863615e-03f, -1.251527446e-03f, -1.612578952e-03f, +2.953534189e-03f, -2.046929674e-03f, +2.525383672e-05f, +1.398993480e-03f, -1.434484554e-03f, +5.691622630e-04f, +2.351538494e-04f, -4.700529895e-04f, +2.847069707e-04f, -5.819635425e-05f, -9.910848994e-06f, + /* 12,15 (28) */ + -5.853133184e-04f, +1.766611645e-03f, -1.229120530e-03f, -3.244096564e-03f, +8.928135903e-03f, -7.204969040e-03f, -7.870419028e-03f, +2.725311000e-02f, -2.674396583e-02f, -1.203141952e-02f, +7.306516277e-02f, -9.703745187e-02f, -6.149168775e-03f, +5.741024804e-01f, +5.441235361e-01f, -3.293519897e-02f, -8.439516450e-02f, +7.437570839e-02f, -1.866773560e-02f, -2.224470489e-02f, +2.705682863e-02f, -9.969209342e-03f, -5.482211627e-03f, +8.588011566e-03f, -3.725346416e-03f, -7.685077437e-04f, +1.626456793e-03f, -6.182865654e-04f, + -1.872781532e-05f, -6.719464614e-05f, +2.319134597e-04f, -2.527462967e-04f, -1.513884712e-04f, +8.568405247e-04f, -1.082260150e-03f, -3.555399392e-05f, +2.216154012e-03f, -3.389839611e-03f, +8.344412680e-04f, +6.202875502e-03f, -1.373454272e-02f, -1.463830204e-02f, +1.534064230e-02f, +1.305148748e-02f, -6.439411871e-03f, -4.761043494e-04f, +3.246476473e-03f, -2.283106929e-03f, +1.607273743e-04f, +1.016530165e-03f, -8.659168884e-04f, +1.887358662e-04f, +2.285035548e-04f, -2.286993269e-04f, +7.296020547e-05f, +1.424543170e-05f, + +5.853133184e-04f, -2.332108551e-03f, +3.332129467e-03f, +2.599806836e-04f, -8.852884355e-03f, +1.526451526e-02f, -9.092694559e-03f, -1.125718897e-02f, +3.139311923e-02f, -3.037465914e-02f, +1.675006678e-03f, +3.540538649e-02f, -4.936620107e-02f, +2.538312089e-02f, +1.881547721e-02f, -4.757073991e-02f, +3.923486713e-02f, -4.343645584e-03f, -2.663835605e-02f, +3.182536798e-02f, -1.432526469e-02f, -6.255505523e-03f, +1.431796407e-02f, -9.488998318e-03f, +1.259073357e-03f, +2.780097590e-03f, -2.248771471e-03f, +6.182865654e-04f, + +1.872781532e-05f, +3.590374314e-05f, -2.725225037e-04f, +5.086679019e-04f, -3.456035669e-04f, -4.400143631e-04f, +1.410778245e-03f, -1.576907531e-03f, +2.969515247e-04f, +1.804931542e-03f, -3.022946128e-03f, +2.012720185e-03f, +7.778606065e-04f, -3.230164922e-03f, +3.337478759e-03f, -1.017600555e-03f, -1.816760456e-03f, +2.995706134e-03f, -1.931371550e-03f, -1.352972326e-04f, +1.491168190e-03f, -1.426410791e-03f, +5.065368193e-04f, +2.905103963e-04f, -4.904247717e-04f, +2.795093741e-04f, -4.743333710e-05f, -1.424543170e-05f, + /* 12,16 (28) */ + -6.040411337e-04f, +1.699416999e-03f, -9.972070705e-04f, -3.496842861e-03f, +8.776747432e-03f, -6.348128516e-03f, -8.952679177e-03f, +2.721755601e-02f, -2.452781182e-02f, -1.542125913e-02f, +7.389960404e-02f, -9.083457637e-02f, -1.988371149e-02f, +5.594641784e-01f, +5.594641784e-01f, -1.988371149e-02f, -9.083457637e-02f, +7.389960404e-02f, -1.542125913e-02f, -2.452781182e-02f, +2.721755601e-02f, -8.952679177e-03f, -6.348128516e-03f, +8.776747432e-03f, -3.496842861e-03f, -9.972070705e-04f, +1.699416999e-03f, -6.040411337e-04f, + -1.424543170e-05f, -7.296020547e-05f, +2.286993269e-04f, -2.285035548e-04f, -1.887358662e-04f, +8.659168884e-04f, -1.016530165e-03f, -1.607273743e-04f, +2.283106929e-03f, -3.246476473e-03f, +4.761043494e-04f, +6.439411871e-03f, -1.305148748e-02f, -1.534064230e-02f, +1.463830204e-02f, +1.373454272e-02f, -6.202875502e-03f, -8.344412680e-04f, +3.389839611e-03f, -2.216154012e-03f, +3.555399392e-05f, +1.082260150e-03f, -8.568405247e-04f, +1.513884712e-04f, +2.527462967e-04f, -2.319134597e-04f, +6.719464614e-05f, +1.872781532e-05f, + +6.040411337e-04f, -2.296204808e-03f, +3.059606964e-03f, +7.686485855e-04f, -9.198487922e-03f, +1.482450089e-02f, -7.681916313e-03f, -1.283409650e-02f, +3.169007075e-02f, -2.856972760e-02f, -1.347939449e-03f, +3.741810668e-02f, -4.858834047e-02f, +2.215295597e-02f, +2.215295597e-02f, -4.858834047e-02f, +3.741810668e-02f, -1.347939449e-03f, -2.856972760e-02f, +3.169007075e-02f, -1.283409650e-02f, -7.681916313e-03f, +1.482450089e-02f, -9.198487922e-03f, +7.686485855e-04f, +3.059606964e-03f, -2.296204808e-03f, +6.040411337e-04f, + +1.424543170e-05f, +4.743333710e-05f, -2.795093741e-04f, +4.904247717e-04f, -2.905103963e-04f, -5.065368193e-04f, +1.426410791e-03f, -1.491168190e-03f, +1.352972326e-04f, +1.931371550e-03f, -2.995706134e-03f, +1.816760456e-03f, +1.017600555e-03f, -3.337478759e-03f, +3.230164922e-03f, -7.778606065e-04f, -2.012720185e-03f, +3.022946128e-03f, -1.804931542e-03f, -2.969515247e-04f, +1.576907531e-03f, -1.410778245e-03f, +4.400143631e-04f, +3.456035669e-04f, -5.086679019e-04f, +2.725225037e-04f, -3.590374314e-05f, -1.872781532e-05f, + /* 12,17 (28) */ + -6.182865654e-04f, +1.626456793e-03f, -7.685077437e-04f, -3.725346416e-03f, +8.588011566e-03f, -5.482211627e-03f, -9.969209342e-03f, +2.705682863e-02f, -2.224470489e-02f, -1.866773560e-02f, +7.437570839e-02f, -8.439516450e-02f, -3.293519897e-02f, +5.441235361e-01f, +5.741024804e-01f, -6.149168775e-03f, -9.703745187e-02f, +7.306516277e-02f, -1.203141952e-02f, -2.674396583e-02f, +2.725311000e-02f, -7.870419028e-03f, -7.204969040e-03f, +8.928135903e-03f, -3.244096564e-03f, -1.229120530e-03f, +1.766611645e-03f, -5.853133184e-04f, + -9.910848994e-06f, -7.810200457e-05f, +2.244426840e-04f, -2.038574445e-04f, -2.242003990e-04f, +8.706774845e-04f, -9.474902263e-04f, -2.825131478e-04f, +2.338148458e-03f, -3.091360370e-03f, +1.240060706e-04f, +6.641412367e-03f, -1.234874197e-02f, -1.600074300e-02f, +1.389550624e-02f, +1.439542430e-02f, -5.931821479e-03f, -1.197562299e-03f, +3.520537505e-03f, -2.137355562e-03f, -9.248256318e-05f, +1.144288835e-03f, -8.433893668e-04f, +1.122952956e-04f, +2.764494391e-04f, -2.340327803e-04f, +6.081349163e-05f, +2.333597420e-05f, + +6.182865654e-04f, -2.248771471e-03f, +2.780097590e-03f, +1.259073357e-03f, -9.488998318e-03f, +1.431796407e-02f, -6.255505523e-03f, -1.432526469e-02f, +3.182536798e-02f, -2.663835605e-02f, -4.343645584e-03f, +3.923486713e-02f, -4.757073991e-02f, +1.881547721e-02f, +2.538312089e-02f, -4.936620107e-02f, +3.540538649e-02f, +1.675006678e-03f, -3.037465914e-02f, +3.139311923e-02f, -1.125718897e-02f, -9.092694559e-03f, +1.526451526e-02f, -8.852884355e-03f, +2.599806836e-04f, +3.332129467e-03f, -2.332108551e-03f, +5.853133184e-04f, + +9.910848994e-06f, +5.819635425e-05f, -2.847069707e-04f, +4.700529895e-04f, -2.351538494e-04f, -5.691622630e-04f, +1.434484554e-03f, -1.398993480e-03f, -2.525383672e-05f, +2.046929674e-03f, -2.953534189e-03f, +1.612578952e-03f, +1.251527446e-03f, -3.427863615e-03f, +3.106454162e-03f, -5.335171447e-04f, -2.199414847e-03f, +3.035013953e-03f, -1.668167263e-03f, -4.588811080e-04f, +1.655676099e-03f, -1.387547919e-03f, +3.698772374e-04f, +4.001257885e-04f, -5.246219214e-04f, +2.637295487e-04f, -2.365150215e-05f, -2.333597420e-05f, + /* 12,18 (28) */ + -6.281974144e-04f, +1.548354789e-03f, -5.440650596e-04f, -3.929203860e-03f, +8.363811167e-03f, -4.611534143e-03f, -1.091669957e-02f, +2.677431549e-02f, -1.990655643e-02f, -2.175909597e-02f, +7.449971446e-02f, -7.775375213e-02f, -4.528394094e-02f, +5.281227931e-01f, +5.879979867e-01f, +8.246255527e-03f, -1.029692733e-01f, +7.186760047e-02f, -8.510882012e-03f, -2.888132139e-02f, +2.716062744e-02f, -6.726130192e-03f, -8.048358407e-03f, +9.040431199e-03f, -2.967647125e-03f, -1.463153310e-03f, +1.827425137e-03f, -5.619773442e-04f, + -5.744274138e-06f, -8.261567046e-05f, +2.191996958e-04f, -1.789424619e-04f, -2.576577157e-04f, +8.712008671e-04f, -8.755390372e-04f, -4.004134605e-04f, +2.381268781e-03f, -2.925437697e-03f, -2.204564815e-04f, +6.808987577e-03f, -1.162882552e-02f, -1.661696301e-02f, +1.311417610e-02f, +1.503169408e-02f, -5.626398709e-03f, -1.563960519e-03f, +3.637696777e-03f, -2.046834271e-03f, -2.228332636e-04f, +1.202234304e-03f, -8.255246579e-04f, +7.160576514e-05f, +2.994756875e-04f, -2.350092550e-04f, +5.382878091e-05f, +2.804613760e-05f, + +6.281974144e-04f, -2.190575117e-03f, +2.495390619e-03f, +1.729126347e-03f, -9.724152168e-03f, +1.374880181e-02f, -4.821020969e-03f, -1.572425817e-02f, +3.180011415e-02f, -2.459142638e-02f, -7.297179773e-03f, +4.084744609e-02f, -4.631921247e-02f, +1.538761359e-02f, +2.848957505e-02f, -4.989971822e-02f, +3.320597165e-02f, +4.710020632e-03f, -3.204282641e-02f, +3.093423812e-02f, -9.601512872e-03f, -1.048024248e-02f, +1.563439249e-02f, -8.452758567e-03f, -2.646412378e-04f, +3.595859016e-03f, -2.355760054e-03f, +5.619773442e-04f, + +5.744274138e-06f, +6.815523746e-05f, -2.881421043e-04f, +4.477208986e-04f, -1.798362973e-04f, -6.276344208e-04f, +1.435077914e-03f, -1.300945557e-03f, -1.838884019e-04f, +2.151109553e-03f, -2.896746143e-03f, +1.401256537e-03f, +1.478465097e-03f, -3.500875260e-03f, +2.966963659e-03f, -2.858068374e-04f, -2.375844364e-03f, +3.031746785e-03f, -1.521695141e-03f, -6.202476605e-04f, +1.726968476e-03f, -1.356721015e-03f, +2.964327627e-04f, +4.537659197e-04f, -5.381353907e-04f, +2.531240887e-04f, -1.072683668e-05f, -2.804613760e-05f, + /* 12,19 (28) */ + -6.339416885e-04f, +1.465739118e-03f, -3.248653639e-04f, -4.108146322e-03f, +8.106153451e-03f, -3.740333276e-03f, -1.179223861e-02f, +2.637390203e-02f, -1.752528765e-02f, -2.468453367e-02f, +7.427925798e-02f, -7.094476455e-02f, -5.691276645e-02f, +5.115058301e-01f, +6.011121628e-01f, +2.327794960e-02f, -1.085956721e-01f, +7.030363995e-02f, -4.873185235e-03f, -3.092815566e-02f, +2.693779418e-02f, -5.523895888e-03f, -8.873883065e-03f, +9.112036964e-03f, -2.668171438e-03f, -1.698162565e-03f, +1.881253918e-03f, -5.339312066e-04f, + -1.764035475e-06f, -8.650052123e-05f, +2.130299734e-04f, -1.538907230e-04f, -2.889965021e-04f, +8.675842964e-04f, -8.010805940e-04f, -5.139588436e-04f, +2.412513083e-03f, -2.749684116e-03f, -5.559483860e-04f, +6.942374530e-03f, -1.089428401e-02f, -1.718780930e-02f, +1.229636377e-02f, +1.564096834e-02f, -5.286888184e-03f, -1.932081960e-03f, +3.740487645e-03f, -1.944770211e-03f, -3.549265999e-04f, +1.255726135e-03f, -8.032285666e-04f, +2.948119133e-05f, +3.216873788e-04f, -2.347995131e-04f, +4.625648846e-05f, +3.283287688e-05f, + +6.339416885e-04f, -2.122419880e-03f, +2.207248515e-03f, +2.176847245e-03f, -9.903988465e-03f, +1.312116739e-02f, -3.385943055e-03f, -1.702520373e-02f, +3.161622574e-02f, -2.244031683e-02f, -1.019392592e-02f, +4.224870262e-02f, -4.484074737e-02f, +1.188673833e-02f, +3.145653871e-02f, -5.018552506e-02f, +3.083012728e-02f, +7.741767417e-03f, -3.356452155e-02f, +3.031399046e-02f, -7.874544396e-03f, -1.183696349e-02f, +1.593082526e-02f, -7.998992647e-03f, -8.027766284e-04f, +3.848983105e-03f, -2.366486890e-03f, +5.339312066e-04f, + +1.764035475e-06f, +7.727883873e-05f, -2.898511448e-04f, +4.236035727e-04f, -1.248533379e-04f, -6.817240173e-04f, +1.428307611e-03f, -1.197610003e-03f, -3.398119693e-04f, +2.243478158e-03f, -2.825731336e-03f, +1.183905825e-03f, +1.697276728e-03f, -3.556159520e-03f, +2.812392575e-03f, -3.598708343e-05f, -2.541057314e-03f, +3.013060547e-03f, -1.366187658e-03f, -7.802068301e-04f, +1.790312330e-03f, -1.318339542e-03f, +2.200119860e-04f, +5.062109379e-04f, -5.490669975e-04f, +2.407104306e-04f, +2.813861650e-06f, -3.283287688e-05f, + /* 12,20 (28) */ + -6.357057240e-04f, +1.379238597e-03f, -1.118353905e-04f, -4.262037045e-03f, +7.817156949e-03f, -2.872748979e-03f, -1.259331920e-02f, +2.585994318e-02f, -1.511277457e-02f, -2.743421778e-02f, +7.372330959e-02f, -6.400239002e-02f, -6.780705047e-02f, +4.943180208e-01f, +6.134085265e-01f, +3.891891795e-02f, -1.138825602e-01f, +6.837155799e-02f, -1.132697590e-03f, -3.287292587e-02f, +2.658286758e-02f, -4.268169753e-03f, -9.677111632e-03f, +9.141518155e-03f, -2.346484059e-03f, -1.932962079e-03f, +1.927510406e-03f, -5.010983297e-04f, + +2.013463527e-06f, -8.975944697e-05f, +2.059961522e-04f, -1.288313475e-04f, -3.181187218e-04f, +8.599428424e-04f, -7.245221393e-04f, -6.227098544e-04f, +2.431980281e-03f, -2.565099662e-03f, -8.812012801e-04f, +7.041933861e-03f, -1.014768050e-02f, -1.771194149e-02f, +1.144424563e-02f, +1.622092695e-02f, -4.913703855e-03f, -2.300331234e-03f, +3.828128510e-03f, -1.831401118e-03f, -4.881708689e-04f, +1.304407456e-03f, -7.765047531e-04f, -1.390575777e-05f, +3.429471964e-04f, -2.333652264e-04f, +3.811656467e-05f, +3.766920629e-05f, + +6.357057240e-04f, -2.045141041e-03f, +1.917397370e-03f, +2.600450818e-03f, -1.002884180e-02f, +1.243944337e-02f, -1.957635444e-03f, -1.822281373e-02f, +3.127641377e-02f, -2.019683867e-02f, -1.301965725e-02f, +4.343260845e-02f, -4.314347064e-02f, +8.330578811e-03f, +3.426893128e-02f, -5.022151214e-02f, +2.828906997e-02f, +1.075482796e-02f, -3.493070921e-02f, +2.953378363e-02f, -6.084232066e-03f, -1.315530303e-02f, +1.615083724e-02f, -7.492781709e-03f, -1.351843626e-03f, +4.089693535e-03f, -2.363673029e-03f, +5.010983297e-04f, + -2.013463527e-06f, +8.554241336e-05f, -2.898795343e-04f, +3.978816489e-04f, -7.049229540e-05f, -7.312295386e-04f, +1.414327532e-03f, -1.089592404e-03f, -4.922528271e-04f, +2.323667529e-03f, -2.740950072e-03f, +9.616652248e-04f, +1.906870778e-03f, -3.593454033e-03f, +2.643518461e-03f, +2.146705087e-04f, -2.694156138e-03f, +2.978950855e-03f, -1.202370254e-03f, -9.379126719e-04f, +1.845271380e-03f, -1.272486715e-03f, +1.409682746e-04f, +5.571476709e-04f, -5.572866306e-04f, +2.265038872e-04f, +1.690820033e-05f, -3.766920629e-05f, + /* 12,21 (28) */ + -6.336922605e-04f, +1.289479150e-03f, +9.416076170e-05f, -4.390868393e-03f, +7.499038227e-03f, -2.012806137e-03f, -1.331784134e-02f, +2.523723333e-02f, -1.268079429e-02f, -2.999931745e-02f, +7.284210831e-02f, -5.696045616e-02f, -7.795473097e-02f, +4.766060793e-01f, +6.248527722e-01f, +5.513984490e-02f, -1.187962641e-01f, +6.607122676e-02f, +2.695430920e-03f, -3.470432699e-02f, +2.609469671e-02f, -2.963762297e-03f, -1.045361638e-02f, +9.127612398e-03f, -2.003536863e-03f, -2.166327305e-03f, +1.965626971e-03f, -4.634291234e-04f, + +5.573777025e-06f, -9.239877388e-05f, +1.981634645e-04f, -1.038898739e-04f, -3.449397811e-04f, +8.484084206e-04f, -6.462721396e-04f, -7.262585434e-04f, +2.439821533e-03f, -2.372703831e-03f, -1.195017402e-03f, +7.108146529e-03f, -9.391585822e-03f, -1.818817593e-02f, +1.056011508e-02f, +1.676932219e-02f, -4.507393009e-03f, -2.667077432e-03f, +3.899890411e-03f, -1.707022422e-03f, -6.219565921e-04f, +1.347936973e-03f, -7.453788393e-04f, -5.837165877e-05f, +3.631189019e-04f, -2.306734722e-04f, +2.943295419e-05f, +4.252669699e-05f, + +6.336922605e-04f, -1.959598627e-03f, +1.627517835e-03f, +2.998332467e-03f, -1.009933410e-02f, +1.170821383e-02f, -5.433079116e-04f, -1.931240614e-02f, +3.078416095e-02f, -1.787317114e-02f, -1.576060732e-02f, +4.439427367e-02f, -4.123659986e-02f, +4.737124778e-03f, +3.691244974e-02f, -5.000684163e-02f, +2.559491383e-02f, +1.373377882e-02f, -3.613307946e-02f, +2.859587095e-02f, -4.238960687e-03f, -1.442778975e-02f, +1.629180552e-02f, -6.935634038e-03f, -1.909130257e-03f, +4.316197423e-03f, -2.346764828e-03f, +4.634291234e-04f, + -5.573777025e-06f, +9.292757299e-05f, -2.882812579e-04f, +3.707401563e-04f, -1.703079537e-05f, -7.759778291e-04f, +1.393327309e-03f, -9.775148784e-04f, -6.404658755e-04f, +2.391376140e-03f, -2.642930742e-03f, +7.356928729e-04f, +2.106206468e-03f, -3.612589519e-03f, +2.461193263e-03f, +4.648867336e-04f, -2.834302082e-03f, +2.929493549e-03f, -1.031017933e-03f, -1.092522140e-03f, +1.891448198e-03f, -1.219287120e-03f, +5.967576009e-05f, +6.062645651e-04f, -5.626764120e-04f, +2.105309957e-04f, +3.148799859e-05f, -4.252669699e-05f, + /* 12,22 (28) */ + -6.281184835e-04f, +1.197080376e-03f, +2.923242262e-04f, -4.494758267e-03f, +7.154098446e-03f, -1.164397716e-03f, -1.396411348e-02f, +2.451097478e-02f, -1.024097275e-02f, -3.237202128e-02f, +7.164709091e-02f, -4.985230963e-02f, -8.734631679e-02f, +4.584179034e-01f, +6.354128872e-01f, +7.190916708e-02f, -1.233036571e-01f, +6.340414933e-02f, +6.595321331e-03f, -3.641134941e-02f, +2.547274011e-02f, -1.615825324e-03f, -1.119899522e-02f, +9.069240739e-03f, -1.640417961e-03f, -2.397000777e-03f, +1.995059925e-03f, -4.209024264e-04f, + +8.904436267e-06f, -9.442811283e-05f, +1.895993105e-04f, -7.918770840e-05f, -3.693886228e-04f, +8.331287663e-04f, -5.667383000e-04f, -8.242297451e-04f, +2.436238526e-03f, -2.173530669e-03f, -1.496273273e-03f, +7.141610102e-03f, -8.628569271e-03f, -1.861548917e-02f, +9.646374929e-03f, +1.728398750e-02f, -4.068636115e-03f, -3.030660260e-03f, +3.955101323e-03f, -1.571987000e-03f, -7.556590677e-04f, +1.385990967e-03f, -7.098987788e-04f, -1.037230035e-04f, +3.820680803e-04f, -2.266970762e-04f, +2.023359148e-05f, +4.737560409e-05f, + +6.281184835e-04f, -1.866671054e-03f, +1.339236578e-03f, +3.369072623e-03f, -1.011636489e-02f, +1.093223601e-02f, +8.500193977e-04f, -2.028992102e-02f, +3.014369507e-02f, -1.548179500e-02f, -1.840353806e-02f, +4.512996655e-02f, -3.913039340e-02f, +1.124535258e-03f, +3.937364301e-02f, -4.954195490e-02f, +2.276061175e-02f, +1.666327237e-02f, -3.716409739e-02f, +2.750334881e-02f, -2.347512488e-03f, -1.564707687e-02f, +1.635148128e-02f, -6.329369473e-03f, -2.471806669e-03f, +4.526728418e-03f, -2.315276830e-03f, +4.209024264e-04f, + -8.904436267e-06f, +9.942219887e-05f, -2.851182762e-04f, +3.423673458e-04f, +3.526457500e-05f, -8.158245201e-04f, +1.365530751e-03f, -8.620125415e-04f, -7.837362753e-04f, +2.446369913e-03f, -2.532266599e-03f, +5.071604885e-04f, +2.294299080e-03f, -3.613490558e-03f, +2.266338921e-03f, +7.133814587e-04f, -2.960719855e-03f, +2.864844789e-03f, -8.529515726e-04f, -1.243199610e-03f, +1.928486842e-03f, -1.158906659e-03f, -2.347236056e-05f, +6.532534799e-04f, -5.651316816e-04f, +1.928296731e-04f, +4.647954436e-05f, -4.737560409e-05f, + /* 12,23 (28) */ + -6.192140472e-04f, +1.102652264e-03f, +4.819235367e-04f, -4.573945975e-03f, +6.784709823e-03f, -3.312689499e-04f, -1.453085178e-02f, +2.368674504e-02f, -7.804734227e-03f, -3.454555195e-02f, +7.015081764e-02f, -4.271069953e-02f, -9.597488606e-02f, +4.398024142e-01f, +6.450592622e-01f, +8.919315458e-02f, -1.273722932e-01f, +6.037348907e-02f, +1.055042265e-02f, -3.798333641e-02f, +2.471708105e-02f, -2.298343566e-04f, -1.190889400e-02f, +8.965517735e-03f, -1.258349880e-03f, -2.623697853e-03f, +2.015293516e-03f, -3.735268223e-04f, + +1.199495602e-05f, -9.586019359e-05f, +1.803728297e-04f, -5.484161054e-05f, -3.914077491e-04f, +8.142663520e-04f, -4.863256222e-04f, -9.162821881e-04f, +2.421481573e-03f, -1.968623882e-03f, -1.783923012e-03f, +7.143034629e-03f, -7.861189361e-03f, -1.899302076e-02f, +8.705529283e-03f, +1.776284596e-02f, -3.598246142e-03f, -3.389396395e-03f, +3.993150278e-03f, -1.426704663e-03f, -8.886410456e-04f, +1.418265244e-03f, -6.701351241e-04f, -1.497569375e-04f, +3.996628950e-04f, -2.214149336e-04f, +1.055037285e-05f, +5.218500633e-05f, + +6.192140472e-04f, -1.767248856e-03f, +1.054118301e-03f, +3.711439969e-03f, -1.008110032e-02f, +1.011641149e-02f, +2.215550148e-03f, -2.115193356e-02f, +2.935995880e-02f, -1.303542509e-02f, -2.093580466e-02f, +4.563712703e-02f, -3.683609432e-02f, -2.488955300e-03f, +4.163998193e-02f, -4.882857344e-02f, +1.979989189e-02f, +1.952811716e-02f, -3.801704897e-02f, +2.626014920e-02f, -4.190256462e-04f, -1.680598353e-02f, +1.632800892e-02f, -5.676115993e-03f, -3.036938350e-03f, +4.719558091e-03f, -2.268797285e-03f, +3.735268223e-04f, + -1.199495602e-05f, +1.050203171e-04f, -2.804599254e-04f, +3.129535284e-04f, +8.613951762e-05f, -8.506542926e-04f, +1.331194103e-03f, -7.437299621e-04f, -9.213828945e-04f, +2.488482851e-03f, -2.409612213e-03f, +2.772471895e-04f, +2.470224928e-03f, -3.596175871e-03f, +2.059942603e-03f, +9.588803138e-04f, -3.072701960e-03f, +2.785240741e-03f, -6.690339518e-04f, -1.389121404e-03f, +1.956075280e-03f, -1.091552273e-03f, -1.080656606e-04f, +6.978114977e-04f, -5.645619254e-04f, +1.734493045e-04f, +6.180389510e-05f, -5.218500633e-05f, + /* 12,24 (28) */ + -6.072190912e-04f, +1.006792070e-03f, +6.622963664e-04f, -4.628787586e-03f, +6.393302074e-03f, +4.829974021e-04f, -1.501717740e-02f, +2.277046285e-02f, -5.383252654e-03f, -3.651417583e-02f, +6.836689462e-02f, -3.556766490e-02f, -1.038360754e-01f, +4.208093934e-01f, +6.537647915e-01f, +1.069560005e-01f, -1.309705394e-01f, +5.698409267e-02f, +1.454357293e-02f, -3.941004108e-02f, +2.382844000e-02f, +1.188430887e-03f, -1.257902913e-02f, +8.815760798e-03f, -8.586869854e-04f, -2.845112787e-03f, +2.025843889e-03f, -3.213418160e-04f, + +1.483682833e-05f, -9.671068632e-05f, +1.705544752e-04f, -3.096321530e-05f, -4.109531747e-04f, +7.919972572e-04f, -4.054345159e-04f, -1.002109424e-03f, +2.395847519e-03f, -1.759031996e-03f, -2.057001262e-03f, +7.113238123e-03f, -7.091984704e-03f, -1.932007553e-02f, +7.740175145e-03f, +1.820391845e-02f, -3.097167353e-03f, -3.741586035e-03f, +4.013491294e-03f, -1.271641366e-03f, -1.020255514e-03f, +1.444477025e-03f, -6.261811852e-04f, -1.962620639e-04f, +4.157748484e-04f, -2.148123063e-04f, +4.191045679e-07f, +5.692295785e-05f, + +6.072190912e-04f, -1.662228538e-03f, +7.736583760e-04f, +4.024393497e-03f, -9.994960801e-03f, +9.265757193e-03f, +3.546744251e-03f, -2.189566352e-02f, +2.843857590e-02f, -1.054694224e-02f, -2.334541688e-02f, +4.591437422e-02f, -3.436586939e-02f, -6.085131171e-03f, +4.369992453e-02f, -4.786969313e-02f, +1.672718993e-02f, +2.231335790e-02f, -3.868608292e-02f, +2.487102780e-02f, +1.537049634e-03f, -1.789753580e-02f, +1.621994326e-02f, -4.978304495e-03f, -3.601500275e-03f, +4.893007396e-03f, -2.206993390e-03f, +3.213418160e-04f, + -1.483682833e-05f, +1.097219377e-04f, -2.743822870e-04f, +2.826899302e-04f, +1.353531788e-04f, -8.803809735e-04f, +1.290604166e-03f, -6.233176040e-04f, -1.052761539e-03f, +2.517617312e-03f, -2.275679629e-03f, +4.713329735e-05f, +2.633125982e-03f, -3.560758106e-03f, +1.843051590e-03f, +1.200121368e-03f, -3.169612698e-03f, +2.690996815e-03f, -4.801655327e-04f, -1.529480302e-03f, +1.973947623e-03f, -1.017471423e-03f, -1.936784465e-04f, +7.396427412e-04f, -5.608916427e-04f, +1.524507642e-04f, +7.737722171e-05f, -5.692295785e-05f, + /* 12,25 (28) */ + -5.923822628e-04f, +9.100813836e-04f, +8.328508416e-04f, -4.659750801e-03f, +5.982348900e-03f, +1.274994659e-03f, -1.542261192e-02f, +2.176835343e-02f, -2.987405136e-03f, -3.827320782e-02f, +6.630989336e-02f, -2.845442678e-02f, -1.109280601e-01f, +4.014893179e-01f, +6.615049666e-01f, +1.251599190e-01f, -1.340677067e-01f, +5.324250664e-02f, +1.855706423e-02f, -4.068168244e-02f, +2.280818449e-02f, +2.632907913e-03f, -1.320521031e-02f, +8.619498734e-03f, -4.429121370e-04f, -3.059925093e-03f, +2.026262994e-03f, -2.644188582e-04f, + +1.742350407e-05f, -9.699801152e-05f, +1.602155927e-04f, -7.658595322e-06f, -4.279943131e-04f, +7.665099949e-04f, -3.244589710e-04f, -1.081440572e-03f, +2.359677465e-03f, -1.545803574e-03f, -2.314625740e-03f, +7.053141674e-03f, -6.323465047e-03f, -1.959612522e-02f, +6.752993596e-03f, +1.860533153e-02f, -2.566473571e-03f, -4.085519624e-03f, +4.015647081e-03f, -1.107318143e-03f, -1.149848588e-03f, +1.464366781e-03f, -5.781530785e-04f, -2.430193108e-04f, +4.302795444e-04f, -2.068810931e-04f, -1.012057341e-05f, +6.155665152e-05f, + +5.923822628e-04f, -1.552506601e-03f, +4.992760890e-04f, +4.307083428e-03f, -9.859607622e-03f, +8.385376219e-03f, +4.837348417e-03f, -2.251898112e-02f, +2.738581436e-02f, -8.029324923e-03f, -2.562109651e-02f, +4.596150752e-02f, -3.173274341e-02f, -9.645889277e-03f, +4.554297612e-02f, -4.666957176e-02f, +1.355757724e-02f, +2.500435471e-02f, -3.916624845e-02f, +2.334154750e-02f, +3.510997257e-03f, -1.891500722e-02f, +1.602626481e-02f, -4.238661754e-03f, -4.162391918e-03f, +5.045458160e-03f, -2.129616169e-03f, +2.644188582e-04f, + -1.742350407e-05f, +1.135328592e-04f, -2.669675349e-04f, +2.517675669e-04f, +1.826792043e-04f, -9.049474690e-04f, +1.244076270e-03f, -5.014282841e-04f, -1.177267952e-03f, +2.533743915e-03f, -2.131234238e-03f, -1.820058337e-04f, +2.782214148e-03f, -3.507443127e-03f, +1.616767842e-03f, +1.435861754e-03f, -3.250891791e-03f, +2.582506499e-03f, -2.872800010e-04f, -1.663490005e-03f, +1.981886117e-03f, -9.369513494e-04f, -2.798718401e-04f, +7.784601854e-04f, -5.540611438e-04f, +1.299063660e-04f, +9.311119447e-05f, -6.155665152e-05f, + /* 12,26 (28) */ + -5.749587588e-04f, +8.130833721e-04f, +9.930664343e-04f, -4.667409396e-03f, +5.554354587e-03f, +2.041504654e-03f, -1.574707089e-02f, +2.068691286e-02f, -6.277276711e-04f, -3.981901140e-02f, +6.399526762e-02f, -2.140128510e-02f, -1.172515252e-01f, +3.818931927e-01f, +6.682579602e-01f, +1.437652505e-01f, -1.366341803e-01f, +4.915698701e-02f, +2.257271131e-02f, -4.178900058e-02f, +2.165833590e-02f, +4.097274693e-03f, -1.378336339e-02f, +8.376479423e-03f, -1.263259257e-05f, -3.266806186e-03f, +2.016142420e-03f, -2.028622066e-04f, + +1.975036269e-05f, -9.674314000e-05f, +1.494280070e-04f, +1.497213655e-05f, -4.425137977e-04f, +7.380043028e-04f, -2.437847990e-04f, -1.154040886e-03f, +2.313354339e-03f, -1.329982526e-03f, -2.555999392e-03f, +6.963764219e-03f, -5.558102500e-03f, -1.982080948e-02f, +5.746740681e-03f, +1.896532500e-02f, -2.007365906e-03f, -4.419484716e-03f, +3.999212509e-03f, -9.343097736e-04f, -1.276762484e-03f, +1.477699978e-03f, -5.261896628e-04f, -2.898028574e-04f, +4.430574496e-04f, -1.976200705e-04f, -2.102528838e-05f, +6.605259312e-05f, + +5.749587588e-04f, -1.438973742e-03f, +2.323085540e-04f, +4.558850994e-03f, -9.676928418e-03f, +7.480428750e-03f, +6.081424687e-03f, -2.302040941e-02f, +2.620854641e-02f, -5.495581009e-03f, -2.775233074e-02f, +4.577950169e-02f, -2.895052926e-02f, -1.315333240e-02f, +4.715974396e-02f, -4.523371000e-02f, +1.030668545e-02f, +2.758686121e-02f, -3.945352845e-02f, +2.167805749e-02f, +5.492883374e-03f, -1.985195857e-02f, +1.574639297e-02f, -3.460201569e-03f, -4.716453062e-03f, +5.175364526e-03f, -2.036504974e-03f, +2.028622066e-04f, + -1.975036269e-05f, +1.164644421e-04f, -2.583032615e-04f, +2.203761488e-04f, +2.279066910e-04f, -9.243255382e-04f, +1.191952126e-03f, -3.787136644e-04f, -1.294340562e-03f, +2.536901083e-03f, -1.977090400e-03f, -4.090059313e-04f, +2.916775147e-03f, -3.436528816e-03f, +1.382242268e-03f, +1.664884210e-03f, -3.316057636e-03f, +2.460239749e-03f, -9.133959482e-05f, -1.790389534e-03f, +1.979722913e-03f, -8.503180963e-04f, -3.661959696e-04f, +8.139874555e-04f, -5.440272734e-04f, +1.058997420e-04f, +1.089134097e-04f, -6.605259312e-05f, + /* 12,27 (28) */ + -5.552083961e-04f, +7.163402321e-04f, +1.142494441e-03f, -4.652437260e-03f, +5.111840789e-03f, +2.779508957e-03f, -1.599085569e-02f, +1.953287197e-02f, +1.685626668e-03f, -4.114899392e-02f, +6.143926823e-02f, -1.443752088e-02f, -1.228096277e-01f, +3.620723832e-01f, +6.740047009e-01f, +1.627305755e-01f, -1.386415462e-01f, +4.473750230e-02f, +2.657192382e-02f, -4.272331036e-02f, +2.038157341e-02f, +5.574974672e-03f, -1.430955305e-02f, +8.086676566e-03f, +4.304248570e-04f, -3.464426257e-03f, +1.995117132e-03f, -1.368096135e-04f, + +2.181467077e-05f, -9.596938431e-05f, +1.382636177e-04f, +3.683518294e-05f, -4.545072392e-04f, +7.066899060e-04f, -1.637879495e-04f, -1.219712128e-03f, +2.257300314e-03f, -1.112603523e-03f, -2.780412143e-03f, +6.846216993e-03f, -4.798322993e-03f, -1.999393623e-02f, +4.724238005e-03f, +1.928225905e-02f, -1.421169971e-03f, -4.741772964e-03f, +3.963857823e-03f, -7.532431649e-04f, -1.400338575e-03f, +1.484268751e-03f, -4.704523592e-04f, -3.363811173e-04f, +4.539946472e-04f, -1.870351037e-04f, -3.224806064e-05f, +7.037678577e-05f, + +5.552083961e-04f, -1.322509300e-03f, -2.599470746e-05f, +4.779227143e-03f, -9.449021727e-03f, +6.556103212e-03f, +7.273376813e-03f, -2.339912307e-02f, +2.491420585e-02f, -2.958679925e-03f, -2.972942114e-02f, +4.537049576e-02f, -2.603375411e-02f, -1.658986122e-02f, +4.854198623e-02f, -4.356882579e-02f, +6.990627809e-03f, +3.004710096e-02f, -3.954486805e-02f, +1.988766796e-02f, +7.472606287e-03f, -2.070227667e-02f, +1.538019700e-02f, -2.646214113e-03f, -5.260480335e-03f, +5.281264268e-03f, -1.927591564e-03f, +1.368096135e-04f, + -2.181467077e-05f, +1.185333513e-04f, -2.484817892e-04f, +1.887030176e-04f, +2.708410303e-04f, -9.385154098e-04f, +1.134597567e-03f, -2.558207948e-04f, -1.403462982e-03f, +2.527194232e-03f, -1.814106837e-03f, -6.327198303e-04f, +3.036172011e-03f, -3.348403385e-03f, +1.140668745e-03f, +1.886003496e-03f, -3.364710146e-03f, +2.324740980e-03f, +1.066697545e-04f, -1.909447527e-03f, +1.967341574e-03f, -7.579353121e-04f, -4.521922591e-04f, +8.459605991e-04f, -5.307640527e-04f, +8.052564960e-05f, +1.246878551e-04f, -7.037678577e-05f, + /* 12,28 (28) */ + -5.333937253e-04f, +6.203708478e-04f, +1.280758059e-03f, -4.615602077e-03f, +4.657333550e-03f, +3.486198863e-03f, -1.615464364e-02f, +1.831315984e-02f, +3.942926982e-03f, -4.226159745e-02f, +5.865885609e-02f, -7.591303891e-03f, -1.276079507e-01f, +3.420784470e-01f, +6.787289389e-01f, +1.820128346e-01f, -1.400627162e-01f, +3.999572933e-02f, +3.053578164e-02f, -4.347655352e-02f, +1.898123484e-02f, +7.059243422e-03f, -1.478000541e-02f, +7.750295448e-03f, +8.844195042e-04f, -3.651461360e-03f, +1.962869071e-03f, -6.643282774e-05f, + +2.361553000e-05f, -9.470218299e-05f, +1.267940064e-04f, +5.784337511e-05f, -4.639829239e-04f, +6.727852572e-04f, -8.483291066e-05f, -1.278292778e-03f, +2.191974093e-03f, -8.946875297e-04f, -2.987242269e-03f, +6.701697695e-03f, -4.046497979e-03f, -2.011548148e-02f, +3.688363072e-03f, +1.955462103e-02f, -8.093325730e-04f, -5.050687187e-03f, +3.909331578e-03f, -5.647954722e-04f, -1.519920503e-03f, +1.483893463e-03f, -4.111248556e-04f, -3.825177745e-04f, +4.629835816e-04f, -1.751393235e-04f, -4.373845388e-05f, +7.449492353e-05f, + +5.333937253e-04f, -1.203975948e-03f, -2.744764966e-04f, +4.967930161e-03f, -9.178180697e-03f, +5.617587802e-03f, +8.407974380e-03f, -2.365494387e-02f, +2.351074287e-02f, -4.314856932e-04f, -3.154352798e-02f, +4.473777593e-02f, -2.299758210e-02f, -1.993826460e-02f, +4.968265498e-02f, -4.168282230e-02f, +3.625917663e-03f, +3.237184194e-02f, -3.943819829e-02f, +1.797822043e-02f, +9.439947860e-03f, -2.146021198e-02f, +1.492800474e-02f, -1.800253514e-03f, -5.791244388e-03f, +5.361789918e-03f, -1.802903709e-03f, +6.643282774e-05f, + -2.361553000e-05f, +1.197612733e-04f, -2.375994722e-04f, +1.569321239e-04f, +3.113046415e-04f, -9.475452486e-04f, +1.072400192e-03f, -1.333887276e-04f, -1.504166230e-03f, +2.504794604e-03f, -1.643181823e-03f, -8.520233772e-04f, +3.139848145e-03f, -3.243543226e-03f, +8.932778993e-04f, +2.098072660e-03f, -3.396533172e-03f, +2.176626640e-03f, +3.057434476e-04f, -2.019966433e-03f, +1.944678327e-03f, -6.602028232e-04f, -5.373958055e-04f, +8.741298214e-04f, -5.142632352e-04f, +5.388970461e-05f, +1.403354128e-04f, -7.449492353e-05f, + /* 12,29 (28) */ + -5.097781953e-04f, +5.256686648e-04f, +1.407552065e-03f, -4.557758702e-03f, +4.193350626e-03f, +4.158984120e-03f, -1.623947655e-02f, +1.703486706e-02f, +6.134901075e-03f, -4.315628498e-02f, +5.567161382e-02f, -8.896061963e-04f, -1.316544486e-01f, +3.219629655e-01f, +6.824173020e-01f, +2.015674556e-01f, -1.408720487e-01f, +3.494504214e-02f, +3.444511322e-02f, -4.404134900e-02f, +1.746131434e-02f, +8.543136885e-03f, -1.519113027e-02f, +7.367777674e-03f, +1.347403086e-03f, -3.826600684e-03f, +1.919130618e-03f, +8.062095791e-06f, + +2.515381512e-05f, -9.296887939e-05f, +1.150900565e-04f, +7.791644304e-05f, -4.709614541e-04f, +6.365162621e-04f, -7.271196806e-06f, -1.329658048e-03f, +2.117868078e-03f, -6.772374843e-04f, -3.175957353e-03f, +6.531484372e-03f, -3.304936433e-03f, -2.018558845e-02f, +2.642039421e-03f, +1.978103177e-02f, -1.734178923e-04f, -5.344548510e-03f, +3.835463284e-03f, -3.696919477e-04f, -1.634857349e-03f, +1.476424179e-03f, -3.484126929e-04f, -4.279728673e-04f, +4.699237877e-04f, -1.619532692e-04f, -5.544275033e-05f, +7.837259355e-05f, + +5.097781953e-04f, -1.084214675e-03f, -5.120759688e-04f, +5.124862285e-03f, -8.866876055e-03f, +4.670042554e-03f, +9.480374572e-03f, -2.378833259e-02f, +2.200657664e-02f, +2.073308911e-03f, -3.318670980e-02f, +4.388575255e-02f, -1.985773396e-02f, -2.318180783e-02f, +5.057593288e-02f, -3.958474964e-02f, +2.293844911e-04f, +3.454846858e-02f, -3.913245484e-02f, +1.595825400e-02f, +1.138462619e-02f, -2.212041481e-02f, +1.439060894e-02f, -9.261236930e-04f, -6.305507623e-03f, +5.415679622e-03f, -1.662568296e-03f, -8.062095791e-06f, + -2.515381512e-05f, +1.201746071e-04f, -2.257559918e-04f, +1.252430481e-04f, +3.491375938e-04f, -9.514704756e-04f, +1.005766924e-03f, -1.204521806e-05f, -1.596030675e-03f, +2.469937770e-03f, -1.465248192e-03f, -1.065821184e-03f, +3.227329962e-03f, -3.122510283e-03f, +6.413306954e-04f, +2.299989110e-03f, -3.411296493e-03f, +2.016582388e-03f, +5.048633795e-04f, -2.121286551e-03f, +1.911723046e-03f, -5.575549909e-04f, -6.213378295e-04f, +8.982611748e-04f, -4.945347714e-04f, +2.610804149e-05f, +1.557543963e-04f, -7.837259355e-05f, + /* 12,30 (28) */ + -4.846243802e-04f, +4.326997854e-04f, +1.522642122e-03f, -4.479842259e-03f, +3.722389172e-03f, +4.795500382e-03f, -1.624674774e-02f, +1.570520902e-02f, +8.252769153e-03f, -4.383352246e-02f, +5.249565646e-02f, +5.641878176e-03f, -1.349593851e-01f, +3.017773770e-01f, +6.850593414e-01f, +2.213484874e-01f, -1.410454666e-01f, +2.960049363e-02f, +3.828057650e-02f, -4.441104094e-02f, +1.582645699e-02f, +1.001956106e-02f, -1.553954296e-02f, +6.939804807e-03f, +1.817326873e-03f, -3.988553953e-03f, +1.863687867e-03f, +8.643468934e-05f, + +2.643210268e-05f, -9.079849612e-05f, +1.032215887e-04f, +9.698124191e-05f, -4.754753349e-04f, +5.981149961e-04f, +6.856006816e-05f, -1.373719731e-03f, +2.035505433e-03f, -4.612341352e-04f, -3.346114859e-03f, +6.336929088e-03f, -2.575877161e-03f, -2.020456610e-02f, +1.588226575e-03f, +1.996025146e-02f, +4.848968310e-04f, -5.621703527e-03f, +3.742165744e-03f, -1.687035297e-04f, -1.744506828e-03f, +1.461742008e-03f, -2.825427336e-04f, -4.725039166e-04f, +4.747226022e-04f, -1.475049942e-04f, -6.730415010e-05f, +8.197548550e-05f, + +4.846243802e-04f, -9.640400678e-04f, -7.378319605e-04f, +5.250105333e-03f, -8.517738462e-03f, +3.718572078e-03f, +1.048614150e-02f, -2.380037781e-02f, +2.041054596e-02f, +4.543246681e-03f, -3.465195799e-02f, +4.281993136e-02f, -1.663040399e-02f, -2.630431811e-02f, +5.121726357e-02f, -3.728476053e-02f, -3.181912001e-03f, +3.656505097e-02f, -3.862759146e-02f, +1.383696745e-02f, +1.329634923e-02f, -2.267796980e-02f, +1.376927111e-02f, -2.786251825e-05f, -6.800042395e-03f, +5.441787664e-03f, -1.506813900e-03f, -8.643468934e-05f, + -2.643210268e-05f, +1.198041350e-04f, -2.130536507e-04f, +9.381007205e-05f, +3.841981137e-04f, -9.503729501e-04f, +9.351215115e-04f, +1.075964685e-04f, -1.678687701e-03f, +2.422921794e-03f, -1.281268207e-03f, -1.273052197e-03f, +3.298229076e-03f, -2.985948991e-03f, +3.861118649e-04f, +2.490700469e-03f, -3.408857351e-03f, +1.845359890e-03f, +7.030032145e-04f, -2.212789912e-03f, +1.868519948e-03f, -4.504588533e-04f, -7.035481900e-04f, +9.181381898e-04f, -4.716071764e-04f, -2.693099346e-06f, +1.708411199e-04f, -8.197548550e-05f, + /* 12,31 (28) */ + -4.581922775e-04f, +3.419012893e-04f, +1.625863710e-03f, -4.382861017e-03f, +3.246913837e-03f, +5.393615378e-03f, -1.617818768e-02f, +1.433148928e-02f, +1.028827459e-02f, -4.429475660e-02f, +4.914954161e-02f, +1.197880726e-02f, -1.375352622e-01f, +2.815728109e-01f, +6.866475680e-01f, +2.413087388e-01f, -1.405605698e-01f, +2.397879011e-02f, +4.202274224e-02f, -4.457974447e-02f, +1.408195016e-02f, +1.148130307e-02f, -1.582208569e-02f, +6.467300890e-03f, +2.292049476e-03f, -4.136058947e-03f, +1.796383717e-03f, +1.684101748e-04f, + +2.745459118e-05f, -8.822150698e-05f, +9.125701215e-05f, +1.149719352e-04f, -4.775685101e-04f, +5.578184186e-04f, +1.423394688e-04f, -1.410425884e-03f, +1.945437062e-03f, -2.476320516e-04f, -3.497362304e-03f, +6.119451369e-03f, -1.861481453e-03f, -2.017288707e-02f, +5.299098635e-04f, +2.009118504e-02f, +1.163826103e-03f, -5.880531475e-03f, +3.629437058e-03f, +3.735582438e-05f, -1.848238513e-03f, +1.439760328e-03f, -2.137625121e-04f, -5.158670931e-04f, +4.772958510e-04f, -1.318301341e-04f, -7.926299444e-05f, +8.526960746e-05f, + +4.581922775e-04f, -8.442359327e-04f, -9.508856112e-04f, +5.343915405e-03f, -8.133540348e-03f, +2.768199128e-03f, +1.142126301e-02f, -2.369278134e-02f, +1.873185826e-02f, +6.966168475e-03f, -3.593322620e-02f, +4.154687917e-02f, -1.333217492e-02f, -2.929026710e-02f, +5.160337544e-02f, -3.479406006e-02f, -6.590769352e-03f, +3.841041086e-02f, -3.792458825e-02f, +1.162417754e-02f, +1.516486918e-02f, -2.312842865e-02f, +1.306572292e-02f, +8.902756715e-04f, -7.271649571e-03f, +5.439094564e-03f, -1.335972780e-03f, -1.684101748e-04f, + -2.745459118e-05f, +1.186846730e-04f, -1.995966708e-04f, +6.280130302e-05f, +4.163629789e-04f, -9.443600182e-04f, +8.609019613e-04f, +2.249406299e-04f, -1.751821072e-03f, +2.364105091e-03f, -1.092228303e-03f, -1.472695063e-03f, +3.352244024e-03f, -2.834582782e-03f, +1.289232061e-04f, +2.669210172e-03f, -3.389161541e-03f, +1.663773246e-03f, +8.991337447e-04f, -2.293903971e-03f, +1.815168006e-03f, -3.394120637e-04f, -7.835579473e-04f, +9.335634383e-04f, -4.455277979e-04f, -3.237785643e-05f, +1.854904982e-04f, -8.526960746e-05f, + /* 13, 0 (28) */ + +0.000000000e+00f, +5.666384406e-04f, +1.138827626e-03f, -4.947832042e-03f, +7.775272907e-03f, -3.753683238e-03f, -1.054677731e-02f, +2.921374884e-02f, -3.521211508e-02f, +8.626724797e-03f, +5.817244274e-02f, -1.493766746e-01f, +2.292750740e-01f, +7.389097765e-01f, +2.292750740e-01f, -1.493766746e-01f, +5.817244274e-02f, +8.626724797e-03f, -3.521211508e-02f, +2.921374884e-02f, -1.054677731e-02f, -3.753683238e-03f, +7.775272907e-03f, -4.947832042e-03f, +1.138827626e-03f, +5.666384406e-04f, -4.718714774e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.062275038e-04f, +1.642079905e-04f, -3.176805304e-05f, -4.176963452e-04f, +9.973204594e-04f, -1.100348265e-03f, +3.307050691e-05f, +2.256548147e-03f, -4.528570802e-03f, +4.216758229e-03f, +2.225335438e-03f, -2.276039521e-02f, -6.588330695e-04f, +2.300746985e-02f, -1.490762572e-03f, -4.646756306e-03f, +4.589590608e-03f, -2.116473039e-03f, -1.936159896e-04f, +1.185485254e-03f, -1.003241430e-03f, +3.865415996e-04f, +6.120553119e-05f, -1.777732382e-04f, +1.083396587e-04f, -3.046316603e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.666384406e-04f, +1.805043397e-04f, +3.931653329e-03f, -1.009328495e-02f, +1.316547915e-02f, -6.922639574e-03f, -9.865401789e-03f, +2.934697745e-02f, -3.767009023e-02f, +2.481811038e-02f, +6.027636000e-03f, -3.812597854e-02f, +5.173229864e-02f, -3.812597854e-02f, +6.027636000e-03f, +2.481811038e-02f, -3.767009023e-02f, +2.934697745e-02f, -9.865401789e-03f, -6.922639574e-03f, +1.316547915e-02f, -1.009328495e-02f, +3.931653329e-03f, +1.805043397e-04f, -1.107043555e-03f, +4.718714774e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.062275038e-04f, -2.751890125e-04f, +3.110093128e-04f, +1.456841193e-06f, -7.291662721e-04f, +1.537349632e-03f, -1.761654064e-03f, +8.667499304e-04f, +1.005892713e-03f, -2.900749650e-03f, +3.574934381e-03f, -2.385474553e-03f, -1.485956862e-04f, +2.610021763e-03f, -3.625468615e-03f, +2.776824637e-03f, -7.966397787e-04f, -1.047919596e-03f, +1.845275877e-03f, -1.523971638e-03f, +6.663274538e-04f, +5.985853526e-05f, -3.457286673e-04f, +2.854839571e-04f, -1.291115539e-04f, +3.046316603e-05f, +0.000000000e+00f, + /* 13, 1 (28) */ + +0.000000000e+00f, +4.604109368e-04f, +1.303035617e-03f, -4.979600095e-03f, +7.357576562e-03f, -2.756362779e-03f, -1.164712558e-02f, +2.924681934e-02f, -3.295556694e-02f, +4.098153994e-03f, +6.238920097e-02f, -1.471513392e-01f, +2.065146788e-01f, +7.382509434e-01f, +2.522825438e-01f, -1.508674372e-01f, +5.352568643e-02f, +1.321631540e-02f, -3.732858812e-02f, +2.902013285e-02f, -9.361292059e-03f, -4.756924668e-03f, +8.161814506e-03f, -4.886626511e-03f, +9.610543883e-04f, +6.749780993e-04f, -5.023346435e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.035369698e-04f, +1.501980935e-04f, -3.115425745e-06f, -4.456342732e-04f, +9.860909236e-04f, -1.011283154e-03f, -1.240131204e-04f, +2.381493442e-03f, -4.445168958e-03f, +3.776343637e-03f, +2.923960520e-03f, -2.245095193e-02f, -1.974338440e-03f, +2.319051509e-02f, -7.223519144e-04f, -5.063876891e-03f, +4.627383065e-03f, -1.961687659e-03f, -3.568177317e-04f, +1.266123263e-03f, -1.003681580e-03f, +3.522579540e-04f, +9.127722124e-05f, -1.907913140e-04f, +1.098320620e-04f, -2.900563891e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.604109368e-04f, -9.468467279e-05f, +4.242662642e-03f, -1.009182811e-02f, +1.243631287e-02f, -5.385289943e-03f, -1.162705585e-02f, +3.021372738e-02f, -3.666419751e-02f, +2.191736073e-02f, +9.602570382e-03f, -4.051145310e-02f, +5.158370296e-02f, -3.551595678e-02f, +2.402167386e-03f, +2.759493502e-02f, -3.846673000e-02f, +2.829905785e-02f, -8.020125912e-03f, -8.446611213e-03f, +1.383180660e-02f, -1.003342641e-02f, +3.585924662e-03f, +4.659882969e-04f, -1.236155109e-03f, +5.023346435e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.035369698e-04f, -2.634750820e-04f, +2.754144351e-04f, +6.121449438e-05f, -7.863339812e-04f, +1.541411923e-03f, -1.668892457e-03f, +6.826111404e-04f, +1.207398695e-03f, -3.006986120e-03f, +3.503856533e-03f, -2.147565162e-03f, -4.449132663e-04f, +2.819855678e-03f, -3.655071878e-03f, +2.635828651e-03f, -5.808159810e-04f, -1.225000850e-03f, +1.919122492e-03f, -1.501198175e-03f, +5.980893329e-04f, +1.223808529e-04f, -3.793169380e-04f, +2.942351695e-04f, -1.273206692e-04f, +2.900563891e-05f, +0.000000000e+00f, + /* 13, 2 (28) */ + +0.000000000e+00f, +3.568739670e-04f, +1.453233711e-03f, -4.982715521e-03f, +6.911942288e-03f, -1.770271855e-03f, -1.265840873e-02f, +2.912280622e-02f, -3.057407349e-02f, -3.470149638e-04f, +6.616554460e-02f, -1.442273786e-01f, +1.840637268e-01f, +7.362766049e-01f, +2.754730589e-01f, -1.515897891e-01f, +4.846180954e-02f, +1.784369847e-02f, -3.929027578e-02f, +2.866331511e-02f, -8.095168796e-03f, -5.760606248e-03f, +8.514072460e-03f, -4.795349290e-03f, +7.702630743e-04f, +7.848101613e-04f, -5.313402824e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.003116459e-04f, +1.358452277e-04f, +2.461098367e-05f, -4.702883075e-04f, +9.697505223e-04f, -9.188691881e-04f, -2.768656977e-04f, +2.490978499e-03f, -4.340326664e-03f, +3.327966122e-03f, +3.584714385e-03f, -2.208102088e-02f, -3.283370116e-03f, +2.330809873e-02f, +7.760647110e-05f, -5.465663188e-03f, +4.641205545e-03f, -1.792700286e-03f, -5.218374028e-04f, +1.341703266e-03f, -9.984957275e-04f, +3.149542135e-04f, +1.218238603e-04f, -2.031594912e-04f, +1.106659353e-04f, -2.720572775e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.568739670e-04f, -3.581597548e-04f, +4.518077077e-03f, -1.003061361e-02f, +1.164997889e-02f, -3.843878019e-03f, -1.329594831e-02f, +3.089633852e-02f, -3.545679882e-02f, +1.891037461e-02f, +1.310642691e-02f, -4.265901826e-02f, +5.113878969e-02f, -3.269610110e-02f, -1.252904492e-03f, +3.023076367e-02f, -3.904754599e-02f, +2.707405700e-02f, -6.101003420e-03f, -9.947809388e-03f, +1.442989593e-02f, -9.911045560e-03f, +3.206607724e-03f, +7.602234664e-04f, -1.363475778e-03f, +5.313402824e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.003116459e-04f, -2.504725758e-04f, +2.391981328e-04f, +1.190818207e-04f, -8.375993150e-04f, +1.536293796e-03f, -1.567672895e-03f, +4.966277806e-04f, +1.400038251e-03f, -3.095025844e-03f, +3.412742929e-03f, -1.897721222e-03f, -7.386147236e-04f, +3.013710000e-03f, -3.663480167e-03f, +2.478485587e-03f, -3.596473381e-04f, -1.396886603e-03f, +1.982609517e-03f, -1.469006405e-03f, +5.247633121e-04f, +1.857430367e-04f, -4.115188110e-04f, +3.013246526e-04f, -1.244593717e-04f, +2.720572775e-05f, +0.000000000e+00f, + /* 13, 3 (28) */ + +0.000000000e+00f, +2.565623210e-04f, +1.589078938e-03f, -4.958104537e-03f, +6.441653981e-03f, -8.005213327e-04f, -1.357727792e-02f, +2.884594052e-02f, -2.808309500e-02f, -4.687341628e-03f, +6.949351073e-02f, -1.406426642e-01f, +1.619827059e-01f, +7.329932348e-01f, +2.987811577e-01f, -1.515121826e-01f, +4.299614635e-02f, +2.248490402e-02f, -4.108297607e-02f, +2.814147771e-02f, -6.753465530e-03f, -6.759101975e-03f, +8.829026674e-03f, -4.673525430e-03f, +5.671035832e-04f, +8.954760966e-04f, -5.585460101e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.659695896e-05f, +1.212496189e-04f, +5.127965363e-05f, -4.916120469e-04f, +9.485206610e-04f, -8.236906398e-04f, -4.247578241e-04f, +2.584761905e-03f, -4.215075025e-03f, +2.874060547e-03f, +4.205865745e-03f, -2.165269369e-02f, -4.581640972e-03f, +2.335902471e-02f, +9.066498346e-04f, -5.849674317e-03f, +4.630424092e-03f, -1.610107075e-03f, -6.878078633e-04f, +1.411681506e-03f, -9.875672809e-04f, +2.747599914e-04f, +1.526782824e-04f, -2.147754990e-04f, +1.108054658e-04f, -2.505909028e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.565623210e-04f, -6.086323306e-04f, +4.757275210e-03f, -9.911531792e-03f, +1.081237958e-02f, -2.307584223e-03f, -1.486362120e-02f, +3.139296630e-02f, -3.405676057e-02f, +1.581534877e-02f, +1.651916984e-02f, -4.455673948e-02f, +5.040017497e-02f, -2.968239110e-02f, -4.916384659e-03f, +3.270924926e-02f, -3.940719332e-02f, +2.567717040e-02f, -4.118393903e-03f, -1.141681579e-02f, +1.495465924e-02f, -9.725302524e-03f, +2.795088913e-03f, +1.061548119e-03f, -1.487935150e-03f, +5.585460101e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.659695896e-05f, -2.363164738e-04f, +2.026113880e-04f, +1.747461205e-04f, -8.827722149e-04f, +1.522184299e-03f, -1.458718841e-03f, +3.099227758e-04f, +1.582754796e-03f, -3.164472353e-03f, +3.302218369e-03f, -1.637438139e-03f, -1.027973458e-03f, +3.190411044e-03f, -3.650554938e-03f, +2.305621944e-03f, -1.344027528e-04f, -1.562488909e-03f, +2.035207894e-03f, -1.427431506e-03f, +4.466991721e-04f, +2.495637551e-04f, -4.420809697e-04f, +3.066422271e-04f, -1.205020512e-04f, +2.505909028e-05f, +0.000000000e+00f, + /* 13, 4 (28) */ + +0.000000000e+00f, +1.599653621e-04f, +1.710328557e-03f, -4.906824884e-03f, +5.950041934e-03f, +1.479993283e-04f, -1.440096856e-02f, +2.842118270e-02f, -2.549833309e-02f, -8.902416653e-03f, +7.236757127e-02f, -1.364367985e-01f, +1.403300123e-01f, +7.284115939e-01f, +3.221401824e-01f, -1.506055328e-01f, +3.714647203e-02f, +2.711532811e-02f, -4.269308314e-02f, +2.745366985e-02f, -5.341784024e-03f, -7.746669256e-03f, +9.103786665e-03f, -4.520847147e-03f, +3.523280842e-04f, +1.006281562e-03f, -5.836051004e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.243979450e-05f, +1.065094541e-04f, +7.676940549e-05f, -5.095794818e-04f, +9.226446183e-04f, -7.263334385e-04f, -5.670029988e-04f, +2.662690692e-03f, -4.070527577e-03f, +2.417031984e-03f, +4.785880117e-03f, -2.116826255e-02f, -5.864906750e-03f, +2.334233961e-02f, +1.762150982e-03f, -6.213497163e-03f, +4.594518981e-03f, -1.414590709e-03f, -8.538373316e-04f, +1.475532923e-03f, -9.708096177e-04f, +2.318255039e-04f, +1.836662090e-04f, -2.255382006e-04f, +1.102181715e-04f, -2.256396701e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.599653621e-04f, -8.449488044e-04f, +4.959886598e-03f, -9.736785672e-03f, +9.929607362e-03f, -7.853999246e-04f, -1.632234004e-02f, +3.170288907e-02f, -3.247400577e-02f, +1.265087641e-02f, +1.982138821e-02f, -4.619417762e-02f, +4.937220151e-02f, -2.649198006e-02f, -8.566939598e-03f, +3.501487120e-02f, -3.954159608e-02f, +2.411468149e-02f, -2.083186010e-03f, -1.284424730e-02f, +1.540135842e-02f, -9.475738768e-03f, +2.353007943e-03f, +1.368190346e-03f, -1.608437201e-03f, +5.836051004e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.243979450e-05f, -2.211452307e-04f, +1.659004742e-04f, +2.279161552e-04f, -9.217042209e-04f, +1.499324190e-03f, -1.342790380e-03f, +1.236106114e-04f, +1.754560479e-03f, -3.215042567e-03f, +3.173020325e-03f, -1.368269953e-03f, -1.311288979e-03f, +3.348884988e-03f, -3.616284452e-03f, +2.118162462e-03f, +9.361335813e-05f, -1.720745848e-03f, +2.076447930e-03f, -1.376567395e-03f, +3.642835795e-04f, +3.134495968e-04f, -4.707538773e-04f, +3.100865742e-04f, -1.154306656e-04f, +2.256396701e-05f, +0.000000000e+00f, + /* 13, 5 (28) */ + +0.000000000e+00f, +6.752556758e-05f, +1.816838011e-03f, -4.830055478e-03f, +5.440462452e-03f, +1.070643947e-03f, -1.512730200e-02f, +2.785417970e-02f, -2.283564240e-02f, -1.297294423e-02f, +7.478460326e-02f, -1.316509184e-01f, +1.191617497e-01f, +7.225466871e-01f, +3.454825220e-01f, -1.488433818e-01f, +3.093297487e-02f, +3.170984709e-02f, -4.410767385e-02f, +2.659983252e-02f, -3.866251101e-03f, -8.717478874e-03f, +9.335612169e-03f, -4.337180938e-03f, +1.267898836e-04f, +1.116499734e-03f, -6.061690674e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.788812129e-05f, +9.172032850e-05f, +1.009698238e-04f, -5.241845982e-04f, +8.923856324e-04f, -6.273818821e-04f, -7.029604286e-04f, +2.724699307e-03f, -3.907872914e-03f, +1.959244968e-03f, +5.323423542e-03f, -2.063020921e-02f, -7.128982949e-03f, +2.325733829e-02f, +2.641327353e-03f, -6.554758287e-03f, +4.533089791e-03f, -1.206918557e-03f, -1.019013777e-03f, +1.532754550e-03f, -9.481673272e-04f, +1.863212354e-04f, +2.146071067e-04f, -2.353482853e-04f, +1.088752545e-04f, -1.972130207e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.752556758e-05f, -1.066094035e-03f, +5.125787072e-03f, -9.508869516e-03f, +9.007903141e-03f, +7.139242659e-04f, -1.766513042e-02f, +3.182649968e-02f, -3.071944529e-02f, +9.435833847e-03f, +2.299440854e-02f, -4.756244757e-02f, +4.806091253e-02f, -2.314309507e-02f, -1.218322405e-02f, +3.713303366e-02f, -3.944798272e-02f, +2.239393564e-02f, -6.738080122e-06f, -1.422081469e-02f, +1.576564200e-02f, -9.162289172e-03f, +1.882254066e-03f, +1.678276920e-03f, -1.723867867e-03f, +6.061690674e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.788812129e-05f, -2.050996884e-04f, +1.293054374e-04f, +2.783235296e-04f, -9.542885906e-04f, +1.468003595e-03f, -1.220679060e-03f, -6.120935012e-05f, +1.914541550e-03f, -3.246567767e-03f, +3.025994011e-03f, -1.091819867e-03f, -1.586897125e-03f, +3.488164527e-03f, -3.560784353e-03f, +1.917125117e-03f, +3.230687144e-04f, -1.870628335e-03f, +2.105923006e-03f, -1.316567093e-03f, +2.779383284e-04f, +3.769973760e-04f, -4.972935788e-04f, +3.115662449e-04f, -1.092351538e-04f, +1.972130207e-05f, +0.000000000e+00f, + /* 13, 6 (28) */ + +0.000000000e+00f, -2.036255371e-05f, +1.908558340e-03f, -4.729085655e-03f, +4.916277854e-03f, +1.963029579e-03f, -1.575468388e-02f, +2.715121927e-02f, -2.011094309e-02f, -1.688081714e-02f, +7.674384822e-02f, -1.263274948e-01f, +9.853154051e-02f, +7.154177042e-01f, +3.687398603e-01f, -1.462020544e-01f, +2.437821658e-02f, +3.624293688e-02f, -4.531459241e-02f, +2.558081874e-02f, -2.333496551e-03f, -9.665646201e-03f, +9.521933405e-03f, -4.122573832e-03f, -1.085584017e-04f, +1.225374988e-03f, -6.258903695e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.299062107e-05f, +7.697472709e-05f, +1.237815994e-04f, -5.354408745e-04f, +8.580249187e-04f, -5.274154314e-04f, -8.320375289e-04f, +2.770808149e-03f, -3.728367080e-03f, +1.503013125e-03f, +5.817365362e-03f, -2.004119328e-02f, -8.369761437e-03f, +2.310356835e-02f, +3.541250899e-03f, -6.871135840e-03f, +4.445859978e-03f, -9.879403409e-04f, -1.182409513e-03f, +1.582868856e-03f, -9.196172989e-04f, +1.384374741e-04f, +2.453151088e-04f, -2.441089716e-04f, +1.067519422e-04f, -1.653484773e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.036255371e-05f, -1.271193724e-03f, +5.255092509e-03f, -9.230545987e-03f, +8.053614551e-03f, +2.181927861e-03f, -1.888580949e-02f, +3.176529033e-02f, -2.880490374e-02f, +6.189266080e-03f, +2.602040255e-02f, -4.865426744e-02f, +4.647401540e-02f, -1.965493054e-02f, -1.574400840e-02f, +3.905015878e-02f, -3.912491400e-02f, +2.052330731e-02f, +2.099184926e-03f, -1.553738179e-02f, +1.604358032e-02f, -8.785291796e-03f, +1.384960487e-03f, +1.989843165e-03f, -1.833103021e-03f, +6.258903695e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.299062107e-05f, -1.883220027e-04f, +9.305865870e-05f, +3.257238936e-04f, -9.804601475e-04f, +1.428559377e-03f, -1.093202598e-03f, -2.434593859e-04f, +2.061863229e-03f, -3.258993846e-03f, +2.862086821e-03f, -8.097304951e-04f, -1.853180061e-03f, +3.607394893e-03f, -3.484297476e-03f, +1.703615528e-03f, +5.526110575e-04f, -2.011146789e-03f, +2.123292941e-03f, -1.247642724e-03f, +1.881183206e-04f, +4.397965535e-04f, -5.214635108e-04f, +3.110006277e-04f, -1.019138003e-04f, +1.653484773e-05f, +0.000000000e+00f, + /* 13, 7 (28) */ + +0.000000000e+00f, -1.033531748e-04f, +1.985533067e-03f, -4.605304055e-03f, +4.380836980e-03f, +2.821054498e-03f, -1.628209931e-02f, +2.631918174e-02f, -1.734013494e-02f, -2.060918422e-02f, +7.824686135e-02f, -1.205101295e-01f, +7.849034723e-02f, +7.070479427e-01f, +3.918434286e-01f, -1.426608035e-01f, +1.750708074e-02f, +4.068879686e-02f, -4.630253275e-02f, +2.439840923e-02f, -7.506276950e-04f, -1.058526350e-02f, +9.660370879e-03f, -3.877258723e-03f, -3.526673733e-04f, +1.332126931e-03f, -6.424252172e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.779632627e-05f, +6.236154208e-05f, +1.451167943e-04f, -5.433806772e-04f, +8.198596317e-04f, -4.270056022e-04f, -9.536921084e-04f, +2.801121667e-03f, -3.533325761e-03f, +1.050589220e-03f, +6.266780051e-03f, -1.940403981e-02f, -9.583226735e-03f, +2.288083364e-02f, +4.458858722e-03f, -7.160371421e-03f, +4.332680891e-03f, -7.585853157e-04f, -1.343085979e-03f, +1.625427028e-03f, -8.851696499e-04f, +8.838371623e-05f, +2.755999959e-04f, -2.517267148e-04f, +1.038278118e-04f, -1.301125136e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.033531748e-04f, -1.459515726e-03f, +5.348151168e-03f, -8.904822093e-03f, +7.073154403e-03f, +3.610487237e-03f, -1.997901208e-02f, +3.152183095e-02f, -2.674304051e-02f, +2.930272234e-03f, +2.888248937e-02f, -4.946399793e-02f, +4.462083534e-02f, -1.604753565e-02f, -1.922830588e-02f, +4.075377431e-02f, -3.857230295e-02f, +1.851216052e-02f, +4.222477867e-03f, -1.678502451e-02f, +1.623169864e-02f, -8.345495242e-03f, +8.634969759e-04f, +2.300843793e-03f, -1.935016821e-03f, +6.424252172e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.779632627e-05f, -1.709545933e-04f, +5.738350604e-05f, +3.698979596e-04f, -1.000194868e-03f, +1.381372273e-03f, -9.611995013e-04f, -4.220897246e-04f, +2.195774053e-03f, -3.252380873e-03f, +2.682342166e-03f, -5.236738917e-04f, -2.108575985e-03f, +3.705839200e-03f, -3.387192871e-03f, +1.478820780e-03f, +7.808762236e-04f, -2.141357629e-03f, +2.128286983e-03f, -1.170065125e-03f, +9.530929370e-05f, +5.014317596e-04f, -5.430363062e-04f, +3.083208650e-04f, -9.347354665e-05f, +1.301125136e-05f, +0.000000000e+00f, + /* 13, 8 (28) */ + +0.000000000e+00f, -1.811495010e-04f, +2.047894609e-03f, -4.460187261e-03f, +3.837456302e-03f, +3.640914129e-03f, -1.670910491e-02f, +2.536548964e-02f, -1.453901327e-02f, -2.414250999e-02f, +7.929745057e-02f, -1.142433494e-01f, +5.908630741e-02f, +6.974647160e-01f, +4.147242623e-01f, -1.382019448e-01f, +1.034670932e-02f, +4.502147775e-02f, -4.706111806e-02f, +2.305532325e-02f, +8.747993327e-04f, -1.147043315e-02f, +9.748754595e-03f, -3.601658727e-03f, -6.043940881e-04f, +1.435954742e-03f, -6.554364686e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.235426794e-05f, +4.796562905e-05f, +1.648990303e-04f, -5.480545602e-04f, +7.782007847e-04f, -3.267129711e-04f, -1.067434235e-03f, +2.815826067e-03f, -3.324116326e-03f, +6.041556545e-04f, +6.670948102e-03f, -1.872172627e-02f, -1.076547189e-02f, +2.258919663e-02f, +5.390964434e-03f, -7.420281819e-03f, +4.193535225e-03f, -5.198589686e-04f, -1.500098679e-03f, +1.660012150e-03f, -8.448684804e-04f, +3.638794055e-05f, +3.052682314e-04f, -2.581119179e-04f, +1.000870956e-04f, -9.160123521e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.811495010e-04f, -1.630470320e-03f, +5.405534674e-03f, -8.534924134e-03f, +6.072959535e-03f, +4.991859510e-03f, -2.094021158e-02f, +3.109974122e-02f, -2.454726646e-02f, -3.221086391e-04f, +3.156483154e-02f, -4.998767183e-02f, +4.251225936e-02f, -1.234169645e-02f, -2.261549875e-02f, +4.223259509e-02f, -3.779142672e-02f, +1.637080289e-02f, +6.350764850e-03f, -1.795508964e-02f, +1.632700794e-02f, -7.844063483e-03f, +3.204606698e-04f, +2.609164658e-03f, -2.028490368e-03f, +6.554364686e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.235426794e-05f, -1.531391213e-04f, +2.249308205e-05f, +4.106523320e-04f, -1.013509211e-03f, +1.326863789e-03f, -8.255236372e-04f, -5.960846152e-04f, +2.315609666e-03f, -3.226901958e-03f, +2.487892755e-03f, -2.353414328e-04f, -2.351588503e-03f, +3.782883076e-03f, -3.269964059e-03f, +1.244002728e-03f, +1.006496356e-03f, -2.260369555e-03f, +2.120706396e-03f, -1.084163094e-03f, +2.530729057e-08f, +5.614854043e-04f, -5.617955815e-04f, +3.034707119e-04f, -8.393024523e-05f, +9.160123521e-06f, +0.000000000e+00f, + /* 13, 9 (28) */ + +0.000000000e+00f, -2.535037690e-04f, +2.095860238e-03f, -4.295288231e-03f, +3.289401742e-03f, +4.419114914e-03f, -1.703581789e-02f, +2.429805540e-02f, -1.172318721e-02f, -2.746662631e-02f, +7.990160622e-02f, -1.075724013e-01f, +4.036458114e-02f, +6.866992441e-01f, +4.373134589e-01f, -1.328109804e-01f, +2.926427504e-03f, +4.921501297e-02f, -4.758097703e-02f, +2.155522457e-02f, +2.534811483e-03f, -1.231530163e-02f, +9.785142535e-03f, -3.296390495e-03f, -8.625060060e-04f, +1.536041838e-03f, -6.645965921e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.671313584e-05f, +3.386740310e-05f, +1.830636012e-04f, -5.495304764e-04f, +7.333711394e-04f, -2.270843085e-04f, -1.172827774e-03f, +2.815186610e-03f, -3.102149750e-03f, +1.658154710e-04f, +7.029355970e-03f, -1.799736896e-02f, -1.191271385e-02f, +2.222897973e-02f, +6.334270191e-03f, -7.648770591e-03f, +4.028539872e-03f, -2.728392444e-04f, -1.652502250e-03f, +1.686242287e-03f, -7.987924505e-04f, -1.730424620e-05f, +3.341240478e-04f, -2.631796374e-04f, +9.551896573e-05f, -4.994086038e-06f, +0.000000000e+00f, + +0.000000000e+00f, +2.535037690e-04f, -1.783609441e-03f, +5.428027756e-03f, -8.124271802e-03f, +5.059450324e-03f, +6.318723299e-03f, -2.176573522e-02f, +3.050365661e-02f, -2.223165679e-02f, -3.549010597e-03f, +3.405272429e-02f, -5.022301326e-02f, +4.016067085e-02f, -8.558813371e-03f, -2.588546281e-02f, +4.347659782e-02f, -3.678493037e-02f, +1.411043333e-02f, +8.471471246e-03f, -1.903925273e-02f, +1.632703325e-02f, -7.282578078e-03f, -2.413349117e-04f, +2.912635370e-03f, -2.112420613e-03f, +6.645965921e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.671313584e-05f, -1.350155042e-04f, -1.141092508e-05f, +4.478201486e-04f, -1.020459203e-03f, +1.265492895e-03f, -6.870387704e-04f, -7.644681184e-04f, +2.420796052e-03f, -3.182841430e-03f, +2.279953364e-03f, +5.356640114e-05f, -2.580795591e-03f, +3.838038569e-03f, -3.133226515e-03f, +1.000490782e-03f, +1.228108205e-03f, -2.367349560e-03f, +2.100426641e-03f, -9.903222390e-04f, -9.719400026e-05f, +6.195403585e-04f, -5.775376941e-04f, +2.964073290e-04f, -7.330885302e-05f, +4.994086038e-06f, +0.000000000e+00f, + /* 13,10 (28) */ + +0.000000000e+00f, -3.202169048e-04f, +2.129727641e-03f, -4.112224629e-03f, +2.739871266e-03f, +5.152486053e-03f, -1.726290219e-02f, +2.312522763e-02f, -8.908000598e-03f, -3.056877606e-02f, +8.006742169e-02f, -1.005430454e-01f, +2.236721218e-02f, +6.747865303e-01f, +4.595424386e-01f, -1.264767102e-01f, -4.722343086e-03f, +5.324355284e-02f, -4.785381628e-02f, +1.990272232e-02f, +4.221053770e-03f, -1.311409408e-02f, +9.767838289e-03f, -2.962266448e-03f, -1.125685643e-03f, +1.631560804e-03f, -6.695906781e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.092095278e-05f, +2.014247655e-05f, +1.995575102e-04f, -5.478929063e-04f, +6.857030792e-04f, -1.286498533e-04f, -1.269491606e-03f, +2.799544562e-03f, -2.868872478e-03f, -2.624161167e-04f, +7.341695092e-03f, -1.723420892e-02f, -1.302130835e-02f, +2.180076545e-02f, +7.285379355e-03f, -7.843839402e-03f, +3.837948144e-03f, -1.867230928e-05f, -1.799355657e-03f, +1.703773422e-03f, -7.470551697e-04f, -7.243059156e-05f, +3.619705764e-04f, -2.668502825e-04f, +9.011779337e-05f, -5.287991014e-07f, +0.000000000e+00f, + +0.000000000e+00f, +3.202169048e-04f, -1.918624945e-03f, +5.416616831e-03f, -7.676451653e-03f, +4.038991121e-03f, +7.584216193e-03f, -2.245277399e-02f, +2.973918849e-02f, -1.981086074e-02f, -6.731852026e-03f, +3.633267766e-02f, -5.016944686e-02f, +3.757987526e-02f, -4.720774802e-03f, -2.901868932e-02f, +4.447708860e-02f, -3.555682216e-02f, +1.174308377e-02f, +1.057189789e-02f, -2.002957497e-02f, +1.622983925e-02f, -6.663037720e-03f, -8.188726058e-04f, +3.209042699e-03f, -2.185729466e-03f, +6.695906781e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.092095278e-05f, -1.167209713e-04f, -4.413928298e-05f, +4.812615323e-04f, -1.021139287e-03f, +1.197752534e-03f, -5.466131227e-04f, -9.263095869e-04f, +2.510852177e-03f, -3.120592361e-03f, +2.059813144e-03f, +3.413502696e-04f, -2.794858104e-03f, +3.870947275e-03f, -2.977714405e-03f, +7.496742596e-04f, +1.444361468e-03f, -2.461528657e-03f, +2.067399110e-03f, -8.889834667e-04f, -1.957863712e-04f, +6.751826899e-04f, -5.900734556e-04f, +2.871020006e-04f, -6.164356066e-05f, +5.287991014e-07f, +0.000000000e+00f, + /* 13,11 (28) */ + +0.000000000e+00f, -3.811378576e-04f, +2.149870118e-03f, -3.912667119e-03f, +2.191978359e-03f, +5.838189133e-03f, -1.739155205e-02f, +2.185573602e-02f, -6.108456036e-03f, -3.343764854e-02f, +7.980500558e-02f, -9.320135027e-02f, +5.133003264e-03f, +6.617652219e-01f, +4.813432041e-01f, -1.191913308e-01f, -1.256618249e-02f, +5.708150099e-02f, -4.787248859e-02f, +1.810336666e-02f, +5.924827191e-03f, -1.386114925e-02f, +9.695407698e-03f, -2.600295871e-03f, -1.392535926e-03f, +1.721678597e-03f, -6.701194772e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.502476499e-05f, +6.861339264e-06f, +2.143394342e-04f, -5.432419131e-04f, +6.355364786e-04f, -3.192074028e-05f, -1.357100511e-03f, +2.769313790e-03f, -2.625758256e-03f, -6.786196215e-04f, +7.607859993e-03f, -1.643559746e-02f, -1.408776409e-02f, +2.130539552e-02f, +8.240809724e-03f, -8.003599086e-03f, +3.622151352e-03f, +2.414321334e-04f, -1.939727454e-03f, +1.712302259e-03f, -6.898053928e-04f, -1.287133037e-04f, +3.886110172e-04f, -2.690503014e-04f, +8.388338212e-05f, +4.217033608e-06f, +0.000000000e+00f, + +0.000000000e+00f, +3.811378576e-04f, -2.035345916e-03f, +5.372477548e-03f, -7.195190121e-03f, +3.017851834e-03f, +8.781968727e-03f, -2.299938711e-02f, +2.881287890e-02f, -1.730000856e-02f, -9.852444387e-03f, +3.839249080e-02f, -4.982809659e-02f, +3.478501716e-02f, -8.498275266e-04f, -3.199640373e-02f, +4.522676286e-02f, -3.411246069e-02f, +9.281555115e-03f, +1.263929700e-02f, -2.091855844e-02f, +1.603405287e-02f, -5.987855030e-03f, -1.408946061e-03f, +3.496144699e-03f, -2.247373027e-03f, +6.701194772e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.502476499e-05f, -9.838916744e-05f, -7.551614377e-05f, +5.108638555e-04f, -1.015680944e-03f, +1.124165980e-03f, -4.051139781e-04f, -1.080728805e-03f, +2.585392041e-03f, -3.040653435e-03f, +1.828827500e-03f, +6.263221827e-04f, -2.992527783e-03f, +3.881382693e-03f, -2.804276585e-03f, +4.929943112e-04f, +1.653927111e-03f, -2.542207253e-03f, +2.021652407e-03f, -7.806410820e-04f, -2.951700879e-04f, +7.280044372e-04f, -5.992297896e-04f, +2.755407731e-04f, -4.897785481e-05f, -4.217033608e-06f, +0.000000000e+00f, + /* 13,12 (28) */ + +0.000000000e+00f, -4.361626226e-04f, +2.156731457e-03f, -3.698327685e-03f, +1.648736446e-03f, +6.473725611e-03f, -1.742347279e-02f, +2.049863551e-02f, -3.339142246e-03f, -3.606340680e-02f, +7.912638596e-02f, -8.559349027e-02f, -1.130259419e-02f, +6.476774578e-01f, +5.026485996e-01f, -1.109505211e-01f, -2.056978157e-02f, +6.070365234e-02f, -4.763105645e-02f, +1.616363921e-02f, +7.637129450e-03f, -1.455095464e-02f, +9.566694394e-03f, -2.211684854e-03f, -1.661586227e-03f, +1.805561979e-03f, -6.659024436e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.907035011e-05f, -5.910917565e-06f, +2.273796187e-04f, -5.356921292e-04f, +5.832165806e-04f, +6.261340719e-05f, -1.435385730e-03f, +2.724977041e-03f, -2.374299987e-03f, -1.080978587e-03f, +7.827945498e-03f, -1.560498126e-02f, -1.510875634e-02f, +2.074396882e-02f, +9.197007285e-03f, -8.126280355e-03f, +3.381679722e-03f, +5.062059580e-04f, -2.072701113e-03f, +1.711568846e-03f, -6.272270173e-04f, -1.858602791e-04f, +4.138498401e-04f, -2.697128497e-04f, +7.682117141e-05f, +9.221682500e-06f, +0.000000000e+00f, + +0.000000000e+00f, +4.361626226e-04f, -2.133735084e-03f, +5.296961404e-03f, -6.684326265e-03f, +2.002170890e-03f, +9.906134708e-03f, -2.340450109e-02f, +2.773215010e-02f, -1.471461652e-02f, -1.289309782e-02f, +4.022131830e-02f, -4.920177441e-02f, +3.179248938e-02f, +3.031555166e-03f, -3.480068031e-02f, +4.571975717e-02f, -3.245853358e-02f, +6.739347862e-03f, +1.466094940e-02f, -2.169919952e-02f, +1.573888279e-02f, -5.259850593e-03f, -2.008175851e-03f, +3.771685472e-03f, -2.296350881e-03f, +6.659024436e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.907035011e-05f, -8.014930969e-05f, -1.053798567e-04f, +5.365418178e-04f, -1.004251109e-03f, +1.045283064e-03f, -2.634023677e-04f, -1.226900757e-03f, +2.644126133e-03f, -2.943625195e-03f, +1.588409622e-03f, +9.068156165e-04f, -3.172654692e-03f, +3.869251777e-03f, -2.613871884e-03f, +2.319354898e-04f, +1.855505632e-03f, -2.608760156e-03f, +1.963293167e-03f, -6.658405276e-04f, -3.947473151e-04f, +7.776064029e-04f, -6.048513199e-04f, +2.617250043e-04f, -3.536451091e-05f, -9.221682500e-06f, +0.000000000e+00f, + /* 13,13 (28) */ + +0.000000000e+00f, -4.852329727e-04f, +2.150820539e-03f, -3.470948066e-03f, +1.113044317e-03f, +7.056942192e-03f, -1.736085938e-02f, +1.906324978e-02f, -6.141652052e-04f, -3.843770678e-02f, +7.804540737e-02f, -7.776554478e-02f, -2.690757545e-02f, +6.325687015e-01f, +5.233925684e-01f, -1.017535138e-01f, -2.869606193e-02f, +6.408533206e-02f, -4.712485049e-02f, +1.409093809e-02f, +9.348698296e-03f, -1.517818166e-02f, +9.380834115e-03f, -1.797835014e-03f, -1.931299077e-03f, +1.882383151e-03f, -6.566807611e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.310194423e-05f, -1.811483376e-05f, +2.386597032e-04f, -5.253716848e-04f, +5.290918952e-04f, +1.544867102e-04f, -1.504135213e-03f, +2.667081932e-03f, -2.116001636e-03f, -1.467786266e-03f, +8.002243073e-03f, -1.474588724e-02f, -1.608113976e-02f, +2.011783827e-02f, +1.015036042e-02f, -8.210244114e-03f, +3.117202625e-03f, +7.743281446e-04f, -2.197380379e-03f, +1.701359018e-03f, -5.595388767e-04f, -2.435664463e-04f, +4.374940129e-04f, -2.687784368e-04f, +6.894240855e-05f, +1.446043300e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.852329727e-04f, -2.213884393e-03f, +5.191581547e-03f, -6.147784448e-03f, +9.979197807e-04f, +1.095141777e-02f, -2.366790346e-02f, +2.650524934e-02f, -1.207049039e-02f, -1.583672302e-02f, +4.180972792e-02f, -4.829495879e-02f, +2.861983468e-02f, +6.900806943e-03f, -3.741455220e-02f, +4.595169266e-02f, -3.060302795e-02f, +4.130587706e-03f, +1.662424257e-02f, -2.236504005e-02f, +1.534413547e-02f, -4.482244190e-03f, -2.613027171e-03f, +4.033410477e-03f, -2.331715392e-03f, +6.566807611e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.310194423e-05f, -6.212540086e-05f, -1.335836619e-04f, +5.582373432e-04f, -9.870503886e-04f, +9.616762905e-04f, -1.223278700e-04f, -1.364060002e-03f, +2.686862273e-03f, -2.830205698e-03f, +1.340021692e-03f, +1.181195470e-03f, -3.334194069e-03f, +3.834595678e-03f, -2.407563701e-03f, -3.198299301e-05f, +2.047835198e-03f, -2.660641164e-03f, +1.892506392e-03f, -5.451757631e-04f, -4.939076073e-04f, +8.236009485e-04f, -6.068018773e-04f, +2.456718199e-04f, -2.086551444e-05f, -1.446043300e-05f, +0.000000000e+00f, + /* 13,14 (28) */ + +0.000000000e+00f, -5.283349169e-04f, +2.132705706e-03f, -3.232288363e-03f, +5.876726322e-04f, +7.586034087e-03f, -1.720637267e-02f, +1.755911457e-02f, +2.052916726e-03f, -4.055370842e-02f, +7.657762110e-02f, -6.976330170e-02f, -4.165346269e-02f, +6.164875617e-01f, +5.435104067e-01f, -9.160315340e-02f, -3.690630604e-02f, +6.720253469e-02f, -4.635052235e-02f, +1.189355772e-02f, +1.105005731e-02f, -1.573772054e-02f, +9.137267669e-03f, -1.360341001e-03f, -2.200077514e-03f, +1.951325559e-03f, -6.422203281e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.716198948e-05f, -2.969676839e-05f, +2.481724823e-04f, -5.124210841e-04f, +4.735121294e-04f, +2.432590839e-04f, -1.563193536e-03f, +2.596236670e-03f, -1.852370242e-03f, -1.837451654e-03f, +8.131236325e-03f, -1.386190716e-02f, -1.700196040e-02f, +1.942860661e-02f, +1.109721452e-02f, -8.253991319e-03f, +2.829528118e-03f, +1.044430696e-03f, -2.312894621e-03f, +1.681506628e-03f, -4.869943274e-04f, -3.015152215e-04f, +4.593542484e-04f, -2.661955450e-04f, +6.026428672e-05f, +1.990565033e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.283349169e-04f, -2.276009794e-03f, +5.057997886e-03f, -5.589547104e-03f, +1.086939211e-05f, +1.191309406e-02f, -2.379023133e-02f, +2.514118934e-02f, -9.383628118e-03f, -1.866692872e-02f, +4.314974961e-02f, -4.711376332e-02f, +2.528564062e-02f, +1.073540262e-02f, -3.982211590e-02f, +4.591970966e-02f, -2.855519275e-02f, +1.469946542e-03f, +1.851674896e-02f, -2.291021581e-02f, +1.485022786e-02f, -3.658643241e-03f, -3.219829048e-03f, +4.279082297e-03f, -2.352580907e-03f, +6.422203281e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.716198948e-05f, -4.443550510e-05f, -1.599962633e-04f, +5.759192987e-04f, -9.643110950e-04f, +8.739368830e-04f, +1.727644546e-05f, -1.491504628e-03f, +2.713505857e-03f, -2.701185600e-03f, +1.085165839e-03f, +1.447867802e-03f, -3.476212519e-03f, +3.777589673e-03f, -2.186513949e-03f, -2.972162719e-04f, +2.229699619e-03f, -2.697387220e-03f, +1.809555298e-03f, -4.192862961e-04f, -5.920315597e-04f, +8.656147719e-04f, -6.049659126e-04f, +2.274144693e-04f, -5.551909276e-06f, -1.990565033e-05f, +0.000000000e+00f, + /* 13,15 (28) */ + +0.000000000e+00f, -5.654969064e-04f, +2.103008937e-03f, -2.984115881e-03f, +7.525154808e-05f, +8.059546216e-03f, -1.696311359e-02f, +1.599592103e-02f, +4.649153396e-03f, -4.240607866e-02f, +7.474016945e-02f, -6.163206538e-02f, -5.551536985e-02f, +5.994856013e-01f, +5.629390133e-01f, -8.050593888e-02f, -4.516029736e-02f, +7.003206280e-02f, -4.530609165e-02f, +9.580663094e-03f, +1.273156394e-02f, -1.622471486e-02f, +8.835752447e-03f, -9.009867525e-04f, -2.466273059e-03f, +2.011589846e-03f, -6.223146778e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.129090300e-05f, -4.060904399e-05f, +2.559216052e-04f, -4.969920381e-04f, +4.168261616e-04f, +3.285180955e-04f, -1.612461525e-03f, +2.513105536e-03f, -1.584908069e-03f, -2.188504860e-03f, +8.215595687e-03f, -1.295668211e-02f, -1.786846696e-02f, +1.867812106e-02f, +1.203388692e-02f, -8.256172327e-03f, +2.519601785e-03f, +1.315104923e-03f, -2.418404162e-03f, +1.651895564e-03f, -4.098806258e-04f, -3.593800691e-04f, +4.792462625e-04f, -2.619212169e-04f, +5.081004726e-05f, +2.552686838e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.654969064e-04f, -2.320445299e-03f, +4.898001622e-03f, -5.013627806e-03f, -9.534417029e-04f, +1.278703095e-02f, -2.377295488e-02f, +2.364968471e-02f, -6.670122261e-03f, -2.136811432e-02f, +4.423491545e-02f, -4.566589552e-02f, +2.180942810e-02f, +1.451299229e-02f, -4.200862985e-02f, +4.562249339e-02f, -2.632549313e-02f, -1.227440678e-03f, +2.032630426e-02f, -2.332950210e-02f, +1.425819630e-02f, -2.793028469e-03f, -3.824794961e-03f, +4.506496766e-03f, -2.358132816e-03f, +6.223146778e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.129090300e-05f, -2.719108854e-05f, -1.845022801e-04f, +5.895830417e-04f, -9.362951180e-04f, +7.826707763e-04f, +1.545988993e-04f, -1.608599772e-03f, +2.724059500e-03f, -2.557442720e-03f, +8.253749009e-04f, +1.705289295e-03f, -3.597893528e-03f, +3.698542274e-03f, -1.951976374e-03f, -5.622030383e-04f, +2.399936099e-03f, -2.718622083e-03f, +1.714780679e-03f, -2.888538808e-04f, -6.884945826e-04f, +9.032916486e-04f, -5.992498030e-04f, +2.070025762e-04f, +1.049642806e-05f, -2.552686838e-05f, +0.000000000e+00f, + /* 13,16 (28) */ + +0.000000000e+00f, -5.967878094e-04f, +2.062399893e-03f, -2.728194276e-03f, -4.217404900e-04f, +8.476372378e-03f, -1.663459549e-02f, +1.438345951e-02f, +7.162258932e-03f, -4.399098673e-02f, +7.255166459e-02f, -5.341646969e-02f, -6.847205196e-02f, +5.816171343e-01f, +5.816171343e-01f, -6.847205196e-02f, -5.341646969e-02f, +7.255166459e-02f, -4.399098673e-02f, +7.162258932e-03f, +1.438345951e-02f, -1.663459549e-02f, +8.476372378e-03f, -4.217404900e-04f, -2.728194276e-03f, +2.062399893e-03f, -5.967878094e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.552686838e-05f, -5.081004726e-05f, +2.619212169e-04f, -4.792462625e-04f, +3.593800691e-04f, +4.098806258e-04f, -1.651895564e-03f, +2.418404162e-03f, -1.315104923e-03f, -2.519601785e-03f, +8.256172327e-03f, -1.203388692e-02f, -1.867812106e-02f, +1.786846696e-02f, +1.295668211e-02f, -8.215595687e-03f, +2.188504860e-03f, +1.584908069e-03f, -2.513105536e-03f, +1.612461525e-03f, -3.285180955e-04f, -4.168261616e-04f, +4.969920381e-04f, -2.559216052e-04f, +4.060904399e-05f, +3.129090300e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.967878094e-04f, -2.347636388e-03f, +4.713499342e-03f, -4.424044764e-03f, -1.889736821e-03f, +1.356970172e-02f, -2.361835599e-02f, +2.204108494e-02f, -3.946062761e-03f, -2.392555703e-02f, +4.506029035e-02f, -4.396060622e-02f, +1.821153457e-02f, +1.821153457e-02f, -4.396060622e-02f, +4.506029035e-02f, -2.392555703e-02f, -3.946062761e-03f, +2.204108494e-02f, -2.361835599e-02f, +1.356970172e-02f, -1.889736821e-03f, -4.424044764e-03f, +4.713499342e-03f, -2.347636388e-03f, +5.967878094e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.552686838e-05f, -1.049642806e-05f, -2.070025762e-04f, +5.992498030e-04f, -9.032916486e-04f, +6.884945826e-04f, +2.888538808e-04f, -1.714780679e-03f, +2.718622083e-03f, -2.399936099e-03f, +5.622030383e-04f, +1.951976374e-03f, -3.698542274e-03f, +3.597893528e-03f, -1.705289295e-03f, -8.253749009e-04f, +2.557442720e-03f, -2.724059500e-03f, +1.608599772e-03f, -1.545988993e-04f, -7.826707763e-04f, +9.362951180e-04f, -5.895830417e-04f, +1.845022801e-04f, +2.719108854e-05f, -3.129090300e-05f, +0.000000000e+00f, + /* 13,17 (28) */ + +0.000000000e+00f, -6.223146778e-04f, +2.011589846e-03f, -2.466273059e-03f, -9.009867525e-04f, +8.835752447e-03f, -1.622471486e-02f, +1.273156394e-02f, +9.580663094e-03f, -4.530609165e-02f, +7.003206280e-02f, -4.516029736e-02f, -8.050593888e-02f, +5.629390133e-01f, +5.994856013e-01f, -5.551536985e-02f, -6.163206538e-02f, +7.474016945e-02f, -4.240607866e-02f, +4.649153396e-03f, +1.599592103e-02f, -1.696311359e-02f, +8.059546216e-03f, +7.525154808e-05f, -2.984115881e-03f, +2.103008937e-03f, -5.654969064e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.990565033e-05f, -6.026428672e-05f, +2.661955450e-04f, -4.593542484e-04f, +3.015152215e-04f, +4.869943274e-04f, -1.681506628e-03f, +2.312894621e-03f, -1.044430696e-03f, -2.829528118e-03f, +8.253991319e-03f, -1.109721452e-02f, -1.942860661e-02f, +1.700196040e-02f, +1.386190716e-02f, -8.131236325e-03f, +1.837451654e-03f, +1.852370242e-03f, -2.596236670e-03f, +1.563193536e-03f, -2.432590839e-04f, -4.735121294e-04f, +5.124210841e-04f, -2.481724823e-04f, +2.969676839e-05f, +3.716198948e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.223146778e-04f, -2.358132816e-03f, +4.506496766e-03f, -3.824794961e-03f, -2.793028469e-03f, +1.425819630e-02f, -2.332950210e-02f, +2.032630426e-02f, -1.227440678e-03f, -2.632549313e-02f, +4.562249339e-02f, -4.200862985e-02f, +1.451299229e-02f, +2.180942810e-02f, -4.566589552e-02f, +4.423491545e-02f, -2.136811432e-02f, -6.670122261e-03f, +2.364968471e-02f, -2.377295488e-02f, +1.278703095e-02f, -9.534417029e-04f, -5.013627806e-03f, +4.898001622e-03f, -2.320445299e-03f, +5.654969064e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.990565033e-05f, +5.551909276e-06f, -2.274144693e-04f, +6.049659126e-04f, -8.656147719e-04f, +5.920315597e-04f, +4.192862961e-04f, -1.809555298e-03f, +2.697387220e-03f, -2.229699619e-03f, +2.972162719e-04f, +2.186513949e-03f, -3.777589673e-03f, +3.476212519e-03f, -1.447867802e-03f, -1.085165839e-03f, +2.701185600e-03f, -2.713505857e-03f, +1.491504628e-03f, -1.727644546e-05f, -8.739368830e-04f, +9.643110950e-04f, -5.759192987e-04f, +1.599962633e-04f, +4.443550510e-05f, -3.716198948e-05f, +0.000000000e+00f, + /* 13,18 (28) */ + +0.000000000e+00f, -6.422203281e-04f, +1.951325559e-03f, -2.200077514e-03f, -1.360341001e-03f, +9.137267669e-03f, -1.573772054e-02f, +1.105005731e-02f, +1.189355772e-02f, -4.635052235e-02f, +6.720253469e-02f, -3.690630604e-02f, -9.160315340e-02f, +5.435104067e-01f, +6.164875617e-01f, -4.165346269e-02f, -6.976330170e-02f, +7.657762110e-02f, -4.055370842e-02f, +2.052916726e-03f, +1.755911457e-02f, -1.720637267e-02f, +7.586034087e-03f, +5.876726322e-04f, -3.232288363e-03f, +2.132705706e-03f, -5.283349169e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.446043300e-05f, -6.894240855e-05f, +2.687784368e-04f, -4.374940129e-04f, +2.435664463e-04f, +5.595388767e-04f, -1.701359018e-03f, +2.197380379e-03f, -7.743281446e-04f, -3.117202625e-03f, +8.210244114e-03f, -1.015036042e-02f, -2.011783827e-02f, +1.608113976e-02f, +1.474588724e-02f, -8.002243073e-03f, +1.467786266e-03f, +2.116001636e-03f, -2.667081932e-03f, +1.504135213e-03f, -1.544867102e-04f, -5.290918952e-04f, +5.253716848e-04f, -2.386597032e-04f, +1.811483376e-05f, +4.310194423e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.422203281e-04f, -2.352580907e-03f, +4.279082297e-03f, -3.219829048e-03f, -3.658643241e-03f, +1.485022786e-02f, -2.291021581e-02f, +1.851674896e-02f, +1.469946542e-03f, -2.855519275e-02f, +4.591970966e-02f, -3.982211590e-02f, +1.073540262e-02f, +2.528564062e-02f, -4.711376332e-02f, +4.314974961e-02f, -1.866692872e-02f, -9.383628118e-03f, +2.514118934e-02f, -2.379023133e-02f, +1.191309406e-02f, +1.086939211e-05f, -5.589547104e-03f, +5.057997886e-03f, -2.276009794e-03f, +5.283349169e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.446043300e-05f, +2.086551444e-05f, -2.456718199e-04f, +6.068018773e-04f, -8.236009485e-04f, +4.939076073e-04f, +5.451757631e-04f, -1.892506392e-03f, +2.660641164e-03f, -2.047835198e-03f, +3.198299301e-05f, +2.407563701e-03f, -3.834595678e-03f, +3.334194069e-03f, -1.181195470e-03f, -1.340021692e-03f, +2.830205698e-03f, -2.686862273e-03f, +1.364060002e-03f, +1.223278700e-04f, -9.616762905e-04f, +9.870503886e-04f, -5.582373432e-04f, +1.335836619e-04f, +6.212540086e-05f, -4.310194423e-05f, +0.000000000e+00f, + /* 13,19 (28) */ + +0.000000000e+00f, -6.566807611e-04f, +1.882383151e-03f, -1.931299077e-03f, -1.797835014e-03f, +9.380834115e-03f, -1.517818166e-02f, +9.348698296e-03f, +1.409093809e-02f, -4.712485049e-02f, +6.408533206e-02f, -2.869606193e-02f, -1.017535138e-01f, +5.233925684e-01f, +6.325687015e-01f, -2.690757545e-02f, -7.776554478e-02f, +7.804540737e-02f, -3.843770678e-02f, -6.141652052e-04f, +1.906324978e-02f, -1.736085938e-02f, +7.056942192e-03f, +1.113044317e-03f, -3.470948066e-03f, +2.150820539e-03f, -4.852329727e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.221682500e-06f, -7.682117141e-05f, +2.697128497e-04f, -4.138498401e-04f, +1.858602791e-04f, +6.272270173e-04f, -1.711568846e-03f, +2.072701113e-03f, -5.062059580e-04f, -3.381679722e-03f, +8.126280355e-03f, -9.197007285e-03f, -2.074396882e-02f, +1.510875634e-02f, +1.560498126e-02f, -7.827945498e-03f, +1.080978587e-03f, +2.374299987e-03f, -2.724977041e-03f, +1.435385730e-03f, -6.261340719e-05f, -5.832165806e-04f, +5.356921292e-04f, -2.273796187e-04f, +5.910917565e-06f, +4.907035011e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.566807611e-04f, -2.331715392e-03f, +4.033410477e-03f, -2.613027171e-03f, -4.482244190e-03f, +1.534413547e-02f, -2.236504005e-02f, +1.662424257e-02f, +4.130587706e-03f, -3.060302795e-02f, +4.595169266e-02f, -3.741455220e-02f, +6.900806943e-03f, +2.861983468e-02f, -4.829495879e-02f, +4.180972792e-02f, -1.583672302e-02f, -1.207049039e-02f, +2.650524934e-02f, -2.366790346e-02f, +1.095141777e-02f, +9.979197807e-04f, -6.147784448e-03f, +5.191581547e-03f, -2.213884393e-03f, +4.852329727e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.221682500e-06f, +3.536451091e-05f, -2.617250043e-04f, +6.048513199e-04f, -7.776064029e-04f, +3.947473151e-04f, +6.658405276e-04f, -1.963293167e-03f, +2.608760156e-03f, -1.855505632e-03f, -2.319354898e-04f, +2.613871884e-03f, -3.869251777e-03f, +3.172654692e-03f, -9.068156165e-04f, -1.588409622e-03f, +2.943625195e-03f, -2.644126133e-03f, +1.226900757e-03f, +2.634023677e-04f, -1.045283064e-03f, +1.004251109e-03f, -5.365418178e-04f, +1.053798567e-04f, +8.014930969e-05f, -4.907035011e-05f, +0.000000000e+00f, + /* 13,20 (28) */ + +0.000000000e+00f, -6.659024436e-04f, +1.805561979e-03f, -1.661586227e-03f, -2.211684854e-03f, +9.566694394e-03f, -1.455095464e-02f, +7.637129450e-03f, +1.616363921e-02f, -4.763105645e-02f, +6.070365234e-02f, -2.056978157e-02f, -1.109505211e-01f, +5.026485996e-01f, +6.476774578e-01f, -1.130259419e-02f, -8.559349027e-02f, +7.912638596e-02f, -3.606340680e-02f, -3.339142246e-03f, +2.049863551e-02f, -1.742347279e-02f, +6.473725611e-03f, +1.648736446e-03f, -3.698327685e-03f, +2.156731457e-03f, -4.361626226e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.217033608e-06f, -8.388338212e-05f, +2.690503014e-04f, -3.886110172e-04f, +1.287133037e-04f, +6.898053928e-04f, -1.712302259e-03f, +1.939727454e-03f, -2.414321334e-04f, -3.622151352e-03f, +8.003599086e-03f, -8.240809724e-03f, -2.130539552e-02f, +1.408776409e-02f, +1.643559746e-02f, -7.607859993e-03f, +6.786196215e-04f, +2.625758256e-03f, -2.769313790e-03f, +1.357100511e-03f, +3.192074028e-05f, -6.355364786e-04f, +5.432419131e-04f, -2.143394342e-04f, -6.861339264e-06f, +5.502476499e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.659024436e-04f, -2.296350881e-03f, +3.771685472e-03f, -2.008175851e-03f, -5.259850593e-03f, +1.573888279e-02f, -2.169919952e-02f, +1.466094940e-02f, +6.739347862e-03f, -3.245853358e-02f, +4.571975717e-02f, -3.480068031e-02f, +3.031555166e-03f, +3.179248938e-02f, -4.920177441e-02f, +4.022131830e-02f, -1.289309782e-02f, -1.471461652e-02f, +2.773215010e-02f, -2.340450109e-02f, +9.906134708e-03f, +2.002170890e-03f, -6.684326265e-03f, +5.296961404e-03f, -2.133735084e-03f, +4.361626226e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.217033608e-06f, +4.897785481e-05f, -2.755407731e-04f, +5.992297896e-04f, -7.280044372e-04f, +2.951700879e-04f, +7.806410820e-04f, -2.021652407e-03f, +2.542207253e-03f, -1.653927111e-03f, -4.929943112e-04f, +2.804276585e-03f, -3.881382693e-03f, +2.992527783e-03f, -6.263221827e-04f, -1.828827500e-03f, +3.040653435e-03f, -2.585392041e-03f, +1.080728805e-03f, +4.051139781e-04f, -1.124165980e-03f, +1.015680944e-03f, -5.108638555e-04f, +7.551614377e-05f, +9.838916744e-05f, -5.502476499e-05f, +0.000000000e+00f, + /* 13,21 (28) */ + +0.000000000e+00f, -6.701194772e-04f, +1.721678597e-03f, -1.392535926e-03f, -2.600295871e-03f, +9.695407698e-03f, -1.386114925e-02f, +5.924827191e-03f, +1.810336666e-02f, -4.787248859e-02f, +5.708150099e-02f, -1.256618249e-02f, -1.191913308e-01f, +4.813432041e-01f, +6.617652219e-01f, +5.133003264e-03f, -9.320135027e-02f, +7.980500558e-02f, -3.343764854e-02f, -6.108456036e-03f, +2.185573602e-02f, -1.739155205e-02f, +5.838189133e-03f, +2.191978359e-03f, -3.912667119e-03f, +2.149870118e-03f, -3.811378576e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.287991014e-07f, -9.011779337e-05f, +2.668502825e-04f, -3.619705764e-04f, +7.243059156e-05f, +7.470551697e-04f, -1.703773422e-03f, +1.799355657e-03f, +1.867230928e-05f, -3.837948144e-03f, +7.843839402e-03f, -7.285379355e-03f, -2.180076545e-02f, +1.302130835e-02f, +1.723420892e-02f, -7.341695092e-03f, +2.624161167e-04f, +2.868872478e-03f, -2.799544562e-03f, +1.269491606e-03f, +1.286498533e-04f, -6.857030792e-04f, +5.478929063e-04f, -1.995575102e-04f, -2.014247655e-05f, +6.092095278e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.701194772e-04f, -2.247373027e-03f, +3.496144699e-03f, -1.408946061e-03f, -5.987855030e-03f, +1.603405287e-02f, -2.091855844e-02f, +1.263929700e-02f, +9.281555115e-03f, -3.411246069e-02f, +4.522676286e-02f, -3.199640373e-02f, -8.498275266e-04f, +3.478501716e-02f, -4.982809659e-02f, +3.839249080e-02f, -9.852444387e-03f, -1.730000856e-02f, +2.881287890e-02f, -2.299938711e-02f, +8.781968727e-03f, +3.017851834e-03f, -7.195190121e-03f, +5.372477548e-03f, -2.035345916e-03f, +3.811378576e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.287991014e-07f, +6.164356066e-05f, -2.871020006e-04f, +5.900734556e-04f, -6.751826899e-04f, +1.957863712e-04f, +8.889834667e-04f, -2.067399110e-03f, +2.461528657e-03f, -1.444361468e-03f, -7.496742596e-04f, +2.977714405e-03f, -3.870947275e-03f, +2.794858104e-03f, -3.413502696e-04f, -2.059813144e-03f, +3.120592361e-03f, -2.510852177e-03f, +9.263095869e-04f, +5.466131227e-04f, -1.197752534e-03f, +1.021139287e-03f, -4.812615323e-04f, +4.413928298e-05f, +1.167209713e-04f, -6.092095278e-05f, +0.000000000e+00f, + /* 13,22 (28) */ + +0.000000000e+00f, -6.695906781e-04f, +1.631560804e-03f, -1.125685643e-03f, -2.962266448e-03f, +9.767838289e-03f, -1.311409408e-02f, +4.221053770e-03f, +1.990272232e-02f, -4.785381628e-02f, +5.324355284e-02f, -4.722343086e-03f, -1.264767102e-01f, +4.595424386e-01f, +6.747865303e-01f, +2.236721218e-02f, -1.005430454e-01f, +8.006742169e-02f, -3.056877606e-02f, -8.908000598e-03f, +2.312522763e-02f, -1.726290219e-02f, +5.152486053e-03f, +2.739871266e-03f, -4.112224629e-03f, +2.129727641e-03f, -3.202169048e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.994086038e-06f, -9.551896573e-05f, +2.631796374e-04f, -3.341240478e-04f, +1.730424620e-05f, +7.987924505e-04f, -1.686242287e-03f, +1.652502250e-03f, +2.728392444e-04f, -4.028539872e-03f, +7.648770591e-03f, -6.334270191e-03f, -2.222897973e-02f, +1.191271385e-02f, +1.799736896e-02f, -7.029355970e-03f, -1.658154710e-04f, +3.102149750e-03f, -2.815186610e-03f, +1.172827774e-03f, +2.270843085e-04f, -7.333711394e-04f, +5.495304764e-04f, -1.830636012e-04f, -3.386740310e-05f, +6.671313584e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.695906781e-04f, -2.185729466e-03f, +3.209042699e-03f, -8.188726058e-04f, -6.663037720e-03f, +1.622983925e-02f, -2.002957497e-02f, +1.057189789e-02f, +1.174308377e-02f, -3.555682216e-02f, +4.447708860e-02f, -2.901868932e-02f, -4.720774802e-03f, +3.757987526e-02f, -5.016944686e-02f, +3.633267766e-02f, -6.731852026e-03f, -1.981086074e-02f, +2.973918849e-02f, -2.245277399e-02f, +7.584216193e-03f, +4.038991121e-03f, -7.676451653e-03f, +5.416616831e-03f, -1.918624945e-03f, +3.202169048e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.994086038e-06f, +7.330885302e-05f, -2.964073290e-04f, +5.775376941e-04f, -6.195403585e-04f, +9.719400026e-05f, +9.903222390e-04f, -2.100426641e-03f, +2.367349560e-03f, -1.228108205e-03f, -1.000490782e-03f, +3.133226515e-03f, -3.838038569e-03f, +2.580795591e-03f, -5.356640114e-05f, -2.279953364e-03f, +3.182841430e-03f, -2.420796052e-03f, +7.644681184e-04f, +6.870387704e-04f, -1.265492895e-03f, +1.020459203e-03f, -4.478201486e-04f, +1.141092508e-05f, +1.350155042e-04f, -6.671313584e-05f, +0.000000000e+00f, + /* 13,23 (28) */ + +0.000000000e+00f, -6.645965921e-04f, +1.536041838e-03f, -8.625060060e-04f, -3.296390495e-03f, +9.785142535e-03f, -1.231530163e-02f, +2.534811483e-03f, +2.155522457e-02f, -4.758097703e-02f, +4.921501297e-02f, +2.926427504e-03f, -1.328109804e-01f, +4.373134589e-01f, +6.866992441e-01f, +4.036458114e-02f, -1.075724013e-01f, +7.990160622e-02f, -2.746662631e-02f, -1.172318721e-02f, +2.429805540e-02f, -1.703581789e-02f, +4.419114914e-03f, +3.289401742e-03f, -4.295288231e-03f, +2.095860238e-03f, -2.535037690e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.160123521e-06f, -1.000870956e-04f, +2.581119179e-04f, -3.052682314e-04f, -3.638794055e-05f, +8.448684804e-04f, -1.660012150e-03f, +1.500098679e-03f, +5.198589686e-04f, -4.193535225e-03f, +7.420281819e-03f, -5.390964434e-03f, -2.258919663e-02f, +1.076547189e-02f, +1.872172627e-02f, -6.670948102e-03f, -6.041556545e-04f, +3.324116326e-03f, -2.815826067e-03f, +1.067434235e-03f, +3.267129711e-04f, -7.782007847e-04f, +5.480545602e-04f, -1.648990303e-04f, -4.796562905e-05f, +7.235426794e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.645965921e-04f, -2.112420613e-03f, +2.912635370e-03f, -2.413349117e-04f, -7.282578078e-03f, +1.632703325e-02f, -1.903925273e-02f, +8.471471246e-03f, +1.411043333e-02f, -3.678493037e-02f, +4.347659782e-02f, -2.588546281e-02f, -8.558813371e-03f, +4.016067085e-02f, -5.022301326e-02f, +3.405272429e-02f, -3.549010597e-03f, -2.223165679e-02f, +3.050365661e-02f, -2.176573522e-02f, +6.318723299e-03f, +5.059450324e-03f, -8.124271802e-03f, +5.428027756e-03f, -1.783609441e-03f, +2.535037690e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.160123521e-06f, +8.393024523e-05f, -3.034707119e-04f, +5.617955815e-04f, -5.614854043e-04f, -2.530729057e-08f, +1.084163094e-03f, -2.120706396e-03f, +2.260369555e-03f, -1.006496356e-03f, -1.244002728e-03f, +3.269964059e-03f, -3.782883076e-03f, +2.351588503e-03f, +2.353414328e-04f, -2.487892755e-03f, +3.226901958e-03f, -2.315609666e-03f, +5.960846152e-04f, +8.255236372e-04f, -1.326863789e-03f, +1.013509211e-03f, -4.106523320e-04f, -2.249308205e-05f, +1.531391213e-04f, -7.235426794e-05f, +0.000000000e+00f, + /* 13,24 (28) */ + +0.000000000e+00f, -6.554364686e-04f, +1.435954742e-03f, -6.043940881e-04f, -3.601658727e-03f, +9.748754595e-03f, -1.147043315e-02f, +8.747993327e-04f, +2.305532325e-02f, -4.706111806e-02f, +4.502147775e-02f, +1.034670932e-02f, -1.382019448e-01f, +4.147242623e-01f, +6.974647160e-01f, +5.908630741e-02f, -1.142433494e-01f, +7.929745057e-02f, -2.414250999e-02f, -1.453901327e-02f, +2.536548964e-02f, -1.670910491e-02f, +3.640914129e-03f, +3.837456302e-03f, -4.460187261e-03f, +2.047894609e-03f, -1.811495010e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.301125136e-05f, -1.038278118e-04f, +2.517267148e-04f, -2.755999959e-04f, -8.838371623e-05f, +8.851696499e-04f, -1.625427028e-03f, +1.343085979e-03f, +7.585853157e-04f, -4.332680891e-03f, +7.160371421e-03f, -4.458858722e-03f, -2.288083364e-02f, +9.583226735e-03f, +1.940403981e-02f, -6.266780051e-03f, -1.050589220e-03f, +3.533325761e-03f, -2.801121667e-03f, +9.536921084e-04f, +4.270056022e-04f, -8.198596317e-04f, +5.433806772e-04f, -1.451167943e-04f, -6.236154208e-05f, +7.779632627e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.554364686e-04f, -2.028490368e-03f, +2.609164658e-03f, +3.204606698e-04f, -7.844063483e-03f, +1.632700794e-02f, -1.795508964e-02f, +6.350764850e-03f, +1.637080289e-02f, -3.779142672e-02f, +4.223259509e-02f, -2.261549875e-02f, -1.234169645e-02f, +4.251225936e-02f, -4.998767183e-02f, +3.156483154e-02f, -3.221086391e-04f, -2.454726646e-02f, +3.109974122e-02f, -2.094021158e-02f, +4.991859510e-03f, +6.072959535e-03f, -8.534924134e-03f, +5.405534674e-03f, -1.630470320e-03f, +1.811495010e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.301125136e-05f, +9.347354665e-05f, -3.083208650e-04f, +5.430363062e-04f, -5.014317596e-04f, -9.530929370e-05f, +1.170065125e-03f, -2.128286983e-03f, +2.141357629e-03f, -7.808762236e-04f, -1.478820780e-03f, +3.387192871e-03f, -3.705839200e-03f, +2.108575985e-03f, +5.236738917e-04f, -2.682342166e-03f, +3.252380873e-03f, -2.195774053e-03f, +4.220897246e-04f, +9.611995013e-04f, -1.381372273e-03f, +1.000194868e-03f, -3.698979596e-04f, -5.738350604e-05f, +1.709545933e-04f, -7.779632627e-05f, +0.000000000e+00f, + /* 13,25 (28) */ + +0.000000000e+00f, -6.424252172e-04f, +1.332126931e-03f, -3.526673733e-04f, -3.877258723e-03f, +9.660370879e-03f, -1.058526350e-02f, -7.506276950e-04f, +2.439840923e-02f, -4.630253275e-02f, +4.068879686e-02f, +1.750708074e-02f, -1.426608035e-01f, +3.918434286e-01f, +7.070479427e-01f, +7.849034723e-02f, -1.205101295e-01f, +7.824686135e-02f, -2.060918422e-02f, -1.734013494e-02f, +2.631918174e-02f, -1.628209931e-02f, +2.821054498e-03f, +4.380836980e-03f, -4.605304055e-03f, +1.985533067e-03f, -1.033531748e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.653484773e-05f, -1.067519422e-04f, +2.441089716e-04f, -2.453151088e-04f, -1.384374741e-04f, +9.196172989e-04f, -1.582868856e-03f, +1.182409513e-03f, +9.879403409e-04f, -4.445859978e-03f, +6.871135840e-03f, -3.541250899e-03f, -2.310356835e-02f, +8.369761437e-03f, +2.004119328e-02f, -5.817365362e-03f, -1.503013125e-03f, +3.728367080e-03f, -2.770808149e-03f, +8.320375289e-04f, +5.274154314e-04f, -8.580249187e-04f, +5.354408745e-04f, -1.237815994e-04f, -7.697472709e-05f, +8.299062107e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.424252172e-04f, -1.935016821e-03f, +2.300843793e-03f, +8.634969759e-04f, -8.345495242e-03f, +1.623169864e-02f, -1.678502451e-02f, +4.222477867e-03f, +1.851216052e-02f, -3.857230295e-02f, +4.075377431e-02f, -1.922830588e-02f, -1.604753565e-02f, +4.462083534e-02f, -4.946399793e-02f, +2.888248937e-02f, +2.930272234e-03f, -2.674304051e-02f, +3.152183095e-02f, -1.997901208e-02f, +3.610487237e-03f, +7.073154403e-03f, -8.904822093e-03f, +5.348151168e-03f, -1.459515726e-03f, +1.033531748e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.653484773e-05f, +1.019138003e-04f, -3.110006277e-04f, +5.214635108e-04f, -4.397965535e-04f, -1.881183206e-04f, +1.247642724e-03f, -2.123292941e-03f, +2.011146789e-03f, -5.526110575e-04f, -1.703615528e-03f, +3.484297476e-03f, -3.607394893e-03f, +1.853180061e-03f, +8.097304951e-04f, -2.862086821e-03f, +3.258993846e-03f, -2.061863229e-03f, +2.434593859e-04f, +1.093202598e-03f, -1.428559377e-03f, +9.804601475e-04f, -3.257238936e-04f, -9.305865870e-05f, +1.883220027e-04f, -8.299062107e-05f, +0.000000000e+00f, + /* 13,26 (28) */ + +0.000000000e+00f, -6.258903695e-04f, +1.225374988e-03f, -1.085584017e-04f, -4.122573832e-03f, +9.521933405e-03f, -9.665646201e-03f, -2.333496551e-03f, +2.558081874e-02f, -4.531459241e-02f, +3.624293688e-02f, +2.437821658e-02f, -1.462020544e-01f, +3.687398603e-01f, +7.154177042e-01f, +9.853154051e-02f, -1.263274948e-01f, +7.674384822e-02f, -1.688081714e-02f, -2.011094309e-02f, +2.715121927e-02f, -1.575468388e-02f, +1.963029579e-03f, +4.916277854e-03f, -4.729085655e-03f, +1.908558340e-03f, -2.036255371e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.972130207e-05f, -1.088752545e-04f, +2.353482853e-04f, -2.146071067e-04f, -1.863212354e-04f, +9.481673272e-04f, -1.532754550e-03f, +1.019013777e-03f, +1.206918557e-03f, -4.533089791e-03f, +6.554758287e-03f, -2.641327353e-03f, -2.325733829e-02f, +7.128982949e-03f, +2.063020921e-02f, -5.323423542e-03f, -1.959244968e-03f, +3.907872914e-03f, -2.724699307e-03f, +7.029604286e-04f, +6.273818821e-04f, -8.923856324e-04f, +5.241845982e-04f, -1.009698238e-04f, -9.172032850e-05f, +8.788812129e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.258903695e-04f, -1.833103021e-03f, +1.989843165e-03f, +1.384960487e-03f, -8.785291796e-03f, +1.604358032e-02f, -1.553738179e-02f, +2.099184926e-03f, +2.052330731e-02f, -3.912491400e-02f, +3.905015878e-02f, -1.574400840e-02f, -1.965493054e-02f, +4.647401540e-02f, -4.865426744e-02f, +2.602040255e-02f, +6.189266080e-03f, -2.880490374e-02f, +3.176529033e-02f, -1.888580949e-02f, +2.181927861e-03f, +8.053614551e-03f, -9.230545987e-03f, +5.255092509e-03f, -1.271193724e-03f, +2.036255371e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.972130207e-05f, +1.092351538e-04f, -3.115662449e-04f, +4.972935788e-04f, -3.769973760e-04f, -2.779383284e-04f, +1.316567093e-03f, -2.105923006e-03f, +1.870628335e-03f, -3.230687144e-04f, -1.917125117e-03f, +3.560784353e-03f, -3.488164527e-03f, +1.586897125e-03f, +1.091819867e-03f, -3.025994011e-03f, +3.246567767e-03f, -1.914541550e-03f, +6.120935012e-05f, +1.220679060e-03f, -1.468003595e-03f, +9.542885906e-04f, -2.783235296e-04f, -1.293054374e-04f, +2.050996884e-04f, -8.788812129e-05f, +0.000000000e+00f, + /* 13,27 (28) */ + +0.000000000e+00f, -6.061690674e-04f, +1.116499734e-03f, +1.267898836e-04f, -4.337180938e-03f, +9.335612169e-03f, -8.717478874e-03f, -3.866251101e-03f, +2.659983252e-02f, -4.410767385e-02f, +3.170984709e-02f, +3.093297487e-02f, -1.488433818e-01f, +3.454825220e-01f, +7.225466871e-01f, +1.191617497e-01f, -1.316509184e-01f, +7.478460326e-02f, -1.297294423e-02f, -2.283564240e-02f, +2.785417970e-02f, -1.512730200e-02f, +1.070643947e-03f, +5.440462452e-03f, -4.830055478e-03f, +1.816838011e-03f, +6.752556758e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.256396701e-05f, -1.102181715e-04f, +2.255382006e-04f, -1.836662090e-04f, -2.318255039e-04f, +9.708096177e-04f, -1.475532923e-03f, +8.538373316e-04f, +1.414590709e-03f, -4.594518981e-03f, +6.213497163e-03f, -1.762150982e-03f, -2.334233961e-02f, +5.864906750e-03f, +2.116826255e-02f, -4.785880117e-03f, -2.417031984e-03f, +4.070527577e-03f, -2.662690692e-03f, +5.670029988e-04f, +7.263334385e-04f, -9.226446183e-04f, +5.095794818e-04f, -7.676940549e-05f, -1.065094541e-04f, +9.243979450e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.061690674e-04f, -1.723867867e-03f, +1.678276920e-03f, +1.882254066e-03f, -9.162289172e-03f, +1.576564200e-02f, -1.422081469e-02f, -6.738080122e-06f, +2.239393564e-02f, -3.944798272e-02f, +3.713303366e-02f, -1.218322405e-02f, -2.314309507e-02f, +4.806091253e-02f, -4.756244757e-02f, +2.299440854e-02f, +9.435833847e-03f, -3.071944529e-02f, +3.182649968e-02f, -1.766513042e-02f, +7.139242659e-04f, +9.007903141e-03f, -9.508869516e-03f, +5.125787072e-03f, -1.066094035e-03f, -6.752556758e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.256396701e-05f, +1.154306656e-04f, -3.100865742e-04f, +4.707538773e-04f, -3.134495968e-04f, -3.642835795e-04f, +1.376567395e-03f, -2.076447930e-03f, +1.720745848e-03f, -9.361335813e-05f, -2.118162462e-03f, +3.616284452e-03f, -3.348884988e-03f, +1.311288979e-03f, +1.368269953e-03f, -3.173020325e-03f, +3.215042567e-03f, -1.754560479e-03f, -1.236106114e-04f, +1.342790380e-03f, -1.499324190e-03f, +9.217042209e-04f, -2.279161552e-04f, -1.659004742e-04f, +2.211452307e-04f, -9.243979450e-05f, +0.000000000e+00f, + /* 13,28 (28) */ + +0.000000000e+00f, -5.836051004e-04f, +1.006281562e-03f, +3.523280842e-04f, -4.520847147e-03f, +9.103786665e-03f, -7.746669256e-03f, -5.341784024e-03f, +2.745366985e-02f, -4.269308314e-02f, +2.711532811e-02f, +3.714647203e-02f, -1.506055328e-01f, +3.221401824e-01f, +7.284115939e-01f, +1.403300123e-01f, -1.364367985e-01f, +7.236757127e-02f, -8.902416653e-03f, -2.549833309e-02f, +2.842118270e-02f, -1.440096856e-02f, +1.479993283e-04f, +5.950041934e-03f, -4.906824884e-03f, +1.710328557e-03f, +1.599653621e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.505909028e-05f, -1.108054658e-04f, +2.147754990e-04f, -1.526782824e-04f, -2.747599914e-04f, +9.875672809e-04f, -1.411681506e-03f, +6.878078633e-04f, +1.610107075e-03f, -4.630424092e-03f, +5.849674317e-03f, -9.066498346e-04f, -2.335902471e-02f, +4.581640972e-03f, +2.165269369e-02f, -4.205865745e-03f, -2.874060547e-03f, +4.215075025e-03f, -2.584761905e-03f, +4.247578241e-04f, +8.236906398e-04f, -9.485206610e-04f, +4.916120469e-04f, -5.127965363e-05f, -1.212496189e-04f, +9.659695896e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.836051004e-04f, -1.608437201e-03f, +1.368190346e-03f, +2.353007943e-03f, -9.475738768e-03f, +1.540135842e-02f, -1.284424730e-02f, -2.083186010e-03f, +2.411468149e-02f, -3.954159608e-02f, +3.501487120e-02f, -8.566939598e-03f, -2.649198006e-02f, +4.937220151e-02f, -4.619417762e-02f, +1.982138821e-02f, +1.265087641e-02f, -3.247400577e-02f, +3.170288907e-02f, -1.632234004e-02f, -7.853999246e-04f, +9.929607362e-03f, -9.736785672e-03f, +4.959886598e-03f, -8.449488044e-04f, -1.599653621e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.505909028e-05f, +1.205020512e-04f, -3.066422271e-04f, +4.420809697e-04f, -2.495637551e-04f, -4.466991721e-04f, +1.427431506e-03f, -2.035207894e-03f, +1.562488909e-03f, +1.344027528e-04f, -2.305621944e-03f, +3.650554938e-03f, -3.190411044e-03f, +1.027973458e-03f, +1.637438139e-03f, -3.302218369e-03f, +3.164472353e-03f, -1.582754796e-03f, -3.099227758e-04f, +1.458718841e-03f, -1.522184299e-03f, +8.827722149e-04f, -1.747461205e-04f, -2.026113880e-04f, +2.363164738e-04f, -9.659695896e-05f, +0.000000000e+00f, + /* 13,29 (28) */ + +0.000000000e+00f, -5.585460101e-04f, +8.954760966e-04f, +5.671035832e-04f, -4.673525430e-03f, +8.829026674e-03f, -6.759101975e-03f, -6.753465530e-03f, +2.814147771e-02f, -4.108297607e-02f, +2.248490402e-02f, +4.299614635e-02f, -1.515121826e-01f, +2.987811577e-01f, +7.329932348e-01f, +1.619827059e-01f, -1.406426642e-01f, +6.949351073e-02f, -4.687341628e-03f, -2.808309500e-02f, +2.884594052e-02f, -1.357727792e-02f, -8.005213327e-04f, +6.441653981e-03f, -4.958104537e-03f, +1.589078938e-03f, +2.565623210e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.720572775e-05f, -1.106659353e-04f, +2.031594912e-04f, -1.218238603e-04f, -3.149542135e-04f, +9.984957275e-04f, -1.341703266e-03f, +5.218374028e-04f, +1.792700286e-03f, -4.641205545e-03f, +5.465663188e-03f, -7.760647110e-05f, -2.330809873e-02f, +3.283370116e-03f, +2.208102088e-02f, -3.584714385e-03f, -3.327966122e-03f, +4.340326664e-03f, -2.490978499e-03f, +2.768656977e-04f, +9.188691881e-04f, -9.697505223e-04f, +4.702883075e-04f, -2.461098367e-05f, -1.358452277e-04f, +1.003116459e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.585460101e-04f, -1.487935150e-03f, +1.061548119e-03f, +2.795088913e-03f, -9.725302524e-03f, +1.495465924e-02f, -1.141681579e-02f, -4.118393903e-03f, +2.567717040e-02f, -3.940719332e-02f, +3.270924926e-02f, -4.916384659e-03f, -2.968239110e-02f, +5.040017497e-02f, -4.455673948e-02f, +1.651916984e-02f, +1.581534877e-02f, -3.405676057e-02f, +3.139296630e-02f, -1.486362120e-02f, -2.307584223e-03f, +1.081237958e-02f, -9.911531792e-03f, +4.757275210e-03f, -6.086323306e-04f, -2.565623210e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.720572775e-05f, +1.244593717e-04f, -3.013246526e-04f, +4.115188110e-04f, -1.857430367e-04f, -5.247633121e-04f, +1.469006405e-03f, -1.982609517e-03f, +1.396886603e-03f, +3.596473381e-04f, -2.478485587e-03f, +3.663480167e-03f, -3.013710000e-03f, +7.386147236e-04f, +1.897721222e-03f, -3.412742929e-03f, +3.095025844e-03f, -1.400038251e-03f, -4.966277806e-04f, +1.567672895e-03f, -1.536293796e-03f, +8.375993150e-04f, -1.190818207e-04f, -2.391981328e-04f, +2.504725758e-04f, -1.003116459e-04f, +0.000000000e+00f, + /* 13,30 (28) */ + +0.000000000e+00f, -5.313402824e-04f, +7.848101613e-04f, +7.702630743e-04f, -4.795349290e-03f, +8.514072460e-03f, -5.760606248e-03f, -8.095168796e-03f, +2.866331511e-02f, -3.929027578e-02f, +1.784369847e-02f, +4.846180954e-02f, -1.515897891e-01f, +2.754730589e-01f, +7.362766049e-01f, +1.840637268e-01f, -1.442273786e-01f, +6.616554460e-02f, -3.470149638e-04f, -3.057407349e-02f, +2.912280622e-02f, -1.265840873e-02f, -1.770271855e-03f, +6.911942288e-03f, -4.982715521e-03f, +1.453233711e-03f, +3.568739670e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.900563891e-05f, -1.098320620e-04f, +1.907913140e-04f, -9.127722124e-05f, -3.522579540e-04f, +1.003681580e-03f, -1.266123263e-03f, +3.568177317e-04f, +1.961687659e-03f, -4.627383065e-03f, +5.063876891e-03f, +7.223519144e-04f, -2.319051509e-02f, +1.974338440e-03f, +2.245095193e-02f, -2.923960520e-03f, -3.776343637e-03f, +4.445168958e-03f, -2.381493442e-03f, +1.240131204e-04f, +1.011283154e-03f, -9.860909236e-04f, +4.456342732e-04f, +3.115425745e-06f, -1.501980935e-04f, +1.035369698e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.313402824e-04f, -1.363475778e-03f, +7.602234664e-04f, +3.206607724e-03f, -9.911045560e-03f, +1.442989593e-02f, -9.947809388e-03f, -6.101003420e-03f, +2.707405700e-02f, -3.904754599e-02f, +3.023076367e-02f, -1.252904492e-03f, -3.269610110e-02f, +5.113878969e-02f, -4.265901826e-02f, +1.310642691e-02f, +1.891037461e-02f, -3.545679882e-02f, +3.089633852e-02f, -1.329594831e-02f, -3.843878019e-03f, +1.164997889e-02f, -1.003061361e-02f, +4.518077077e-03f, -3.581597548e-04f, -3.568739670e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.900563891e-05f, +1.273206692e-04f, -2.942351695e-04f, +3.793169380e-04f, -1.223808529e-04f, -5.980893329e-04f, +1.501198175e-03f, -1.919122492e-03f, +1.225000850e-03f, +5.808159810e-04f, -2.635828651e-03f, +3.655071878e-03f, -2.819855678e-03f, +4.449132663e-04f, +2.147565162e-03f, -3.503856533e-03f, +3.006986120e-03f, -1.207398695e-03f, -6.826111404e-04f, +1.668892457e-03f, -1.541411923e-03f, +7.863339812e-04f, -6.121449438e-05f, -2.754144351e-04f, +2.634750820e-04f, -1.035369698e-04f, +0.000000000e+00f, + /* 13,31 (28) */ + +0.000000000e+00f, -5.023346435e-04f, +6.749780993e-04f, +9.610543883e-04f, -4.886626511e-03f, +8.161814506e-03f, -4.756924668e-03f, -9.361292059e-03f, +2.902013285e-02f, -3.732858812e-02f, +1.321631540e-02f, +5.352568643e-02f, -1.508674372e-01f, +2.522825438e-01f, +7.382509434e-01f, +2.065146788e-01f, -1.471513392e-01f, +6.238920097e-02f, +4.098153994e-03f, -3.295556694e-02f, +2.924681934e-02f, -1.164712558e-02f, -2.756362779e-03f, +7.357576562e-03f, -4.979600095e-03f, +1.303035617e-03f, +4.604109368e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.046316603e-05f, -1.083396587e-04f, +1.777732382e-04f, -6.120553119e-05f, -3.865415996e-04f, +1.003241430e-03f, -1.185485254e-03f, +1.936159896e-04f, +2.116473039e-03f, -4.589590608e-03f, +4.646756306e-03f, +1.490762572e-03f, -2.300746985e-02f, +6.588330695e-04f, +2.276039521e-02f, -2.225335438e-03f, -4.216758229e-03f, +4.528570802e-03f, -2.256548147e-03f, -3.307050691e-05f, +1.100348265e-03f, -9.973204594e-04f, +4.176963452e-04f, +3.176805304e-05f, -1.642079905e-04f, +1.062275038e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.023346435e-04f, -1.236155109e-03f, +4.659882969e-04f, +3.585924662e-03f, -1.003342641e-02f, +1.383180660e-02f, -8.446611213e-03f, -8.020125912e-03f, +2.829905785e-02f, -3.846673000e-02f, +2.759493502e-02f, +2.402167386e-03f, -3.551595678e-02f, +5.158370296e-02f, -4.051145310e-02f, +9.602570382e-03f, +2.191736073e-02f, -3.666419751e-02f, +3.021372738e-02f, -1.162705585e-02f, -5.385289943e-03f, +1.243631287e-02f, -1.009182811e-02f, +4.242662642e-03f, -9.468467279e-05f, -4.604109368e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.046316603e-05f, +1.291115539e-04f, -2.854839571e-04f, +3.457286673e-04f, -5.985853526e-05f, -6.663274538e-04f, +1.523971638e-03f, -1.845275877e-03f, +1.047919596e-03f, +7.966397787e-04f, -2.776824637e-03f, +3.625468615e-03f, -2.610021763e-03f, +1.485956862e-04f, +2.385474553e-03f, -3.574934381e-03f, +2.900749650e-03f, -1.005892713e-03f, -8.667499304e-04f, +1.761654064e-03f, -1.537349632e-03f, +7.291662721e-04f, -1.456841193e-06f, -3.110093128e-04f, +2.751890125e-04f, -1.062275038e-04f, +0.000000000e+00f, + /* 14, 0 (24) */ + +1.319331966e-03f, -1.016178713e-03f, -2.318012042e-03f, +9.411795907e-03f, -1.746941689e-02f, +1.934834705e-02f, -5.865137636e-03f, -2.904336543e-02f, +8.299055312e-02f, -1.433490386e-01f, +1.911490954e-01f, +7.906420751e-01f, +1.911490954e-01f, -1.433490386e-01f, +8.299055312e-02f, -2.904336543e-02f, -5.865137636e-03f, +1.934834705e-02f, -1.746941689e-02f, +9.411795907e-03f, -2.318012042e-03f, -1.016178713e-03f, +1.319331966e-03f, -5.404051147e-04f, + -1.109810220e-04f, +2.792412597e-04f, -4.162395040e-04f, +2.681541873e-04f, +4.370013667e-04f, -1.728583557e-03f, +3.123298077e-03f, -3.522678090e-03f, +1.316008579e-03f, +5.800269820e-03f, -2.514586977e-02f, -8.074287558e-04f, +2.561749162e-02f, -5.116231187e-03f, -1.869931669e-03f, +3.792950829e-03f, -3.164392635e-03f, +1.651659887e-03f, -3.384863843e-04f, -3.369139762e-04f, +4.464001348e-04f, -2.845231361e-04f, +1.077107189e-04f, -2.077189525e-05f, + -2.521351164e-03f, +4.422857262e-03f, -3.985881589e-03f, -1.343441160e-03f, +1.186209570e-02f, -2.390185965e-02f, +3.059439799e-02f, -2.544922973e-02f, +6.875499987e-03f, +1.945720767e-02f, -4.255924117e-02f, +5.173229864e-02f, -4.255924117e-02f, +1.945720767e-02f, +6.875499987e-03f, -2.544922973e-02f, +3.059439799e-02f, -2.390185965e-02f, +1.186209570e-02f, -1.343441160e-03f, -3.985881589e-03f, +4.422857262e-03f, -2.521351164e-03f, +7.211855688e-04f, + +6.072659436e-05f, -2.953826578e-04f, +6.820156149e-04f, -1.031097358e-03f, +1.015681388e-03f, -3.561531937e-04f, -9.391669774e-04f, +2.450877999e-03f, -3.477318114e-03f, +3.391189819e-03f, -2.025202753e-03f, -1.670709024e-04f, +2.305298307e-03f, -3.533554494e-03f, +3.458047368e-03f, -2.309355224e-03f, +7.508119949e-04f, +5.194413529e-04f, -1.114678443e-03f, +1.065259737e-03f, -6.753204994e-04f, +2.755057020e-04f, -4.485014415e-05f, -1.577677262e-05f, + /* 14, 1 (24) */ + +1.208350944e-03f, -7.369374536e-04f, -2.734251546e-03f, +9.679950095e-03f, -1.703241552e-02f, +1.761976349e-02f, -2.741839559e-03f, -3.256604352e-02f, +8.430656170e-02f, -1.375487688e-01f, +1.660032257e-01f, +7.898346463e-01f, +2.167665871e-01f, -1.484652698e-01f, +8.112062145e-02f, -2.525041460e-02f, -9.029530272e-03f, +2.100000693e-02f, -1.780790327e-02f, +9.074881931e-03f, -1.871611907e-03f, -1.300701849e-03f, +1.427042685e-03f, -5.611770099e-04f, + -1.132769885e-04f, +2.722990093e-04f, -3.844197788e-04f, +1.997569424e-04f, +5.301287691e-04f, -1.792905577e-03f, +3.064104582e-03f, -3.237770263e-03f, +7.693575179e-04f, +6.427817053e-03f, -2.459851709e-02f, -2.419251706e-03f, +2.601037077e-02f, -4.377423792e-03f, -2.428048240e-03f, +4.046567084e-03f, -3.186688509e-03f, +1.562304760e-03f, -2.350749122e-04f, -4.055922468e-04f, +4.746388069e-04f, -2.880397168e-04f, +1.034438555e-04f, -1.748860713e-05f, + -2.460624570e-03f, +4.127474604e-03f, -3.303865974e-03f, -2.374538518e-03f, +1.287777709e-02f, -2.425801284e-02f, +2.965523102e-02f, -2.299835173e-02f, +3.398181873e-03f, +2.284839749e-02f, -4.458444392e-02f, +5.156522774e-02f, -4.025394286e-02f, +1.592365318e-02f, +1.033354735e-02f, -2.775858495e-02f, +3.134520999e-02f, -2.338241830e-02f, +1.074741726e-02f, -2.781814231e-04f, -4.661202089e-03f, +4.698362964e-03f, -2.566201308e-03f, +7.054087962e-04f, + +7.538821808e-05f, -3.124533545e-04f, +6.838558830e-04f, -9.908186807e-04f, +9.118528457e-04f, -1.930888630e-04f, -1.118978483e-03f, +2.574973750e-03f, -3.473737270e-03f, +3.227370804e-03f, -1.732556364e-03f, -5.001090489e-04f, +2.570960486e-03f, -3.653419413e-03f, +3.415889335e-03f, -2.151181767e-03f, +5.550744497e-04f, +6.818471861e-04f, -1.208069693e-03f, +1.092922874e-03f, -6.636794493e-04f, +2.528726818e-04f, -2.783507069e-05f, -2.381418972e-05f, + /* 14, 2 (24) */ + +1.095073956e-03f, -4.646384443e-04f, -3.118671324e-03f, +9.879707037e-03f, -1.650228675e-02f, +1.582685791e-02f, +3.222650227e-04f, -3.580381378e-02f, +8.507591921e-02f, -1.311209517e-01f, +1.414047086e-01f, +7.874153946e-01f, +2.427769578e-01f, -1.528426936e-01f, +7.869257321e-02f, -2.120384752e-02f, -1.221621878e-02f, +2.256231169e-02f, -1.804297818e-02f, +8.669289684e-03f, -1.396973100e-03f, -1.588741566e-03f, +1.530486541e-03f, -5.786656170e-04f, + -1.146273481e-04f, +2.638091165e-04f, -3.512064868e-04f, +1.321512073e-04f, +6.174246080e-04f, -1.844538592e-03f, +2.987606279e-03f, -2.940288413e-03f, +2.329402775e-04f, +6.997457314e-03f, -2.397874210e-02f, -4.021984840e-03f, +2.632180873e-02f, -3.585873696e-03f, -2.987177601e-03f, +4.281558207e-03f, -3.189586889e-03f, +1.460772114e-03f, -1.273031399e-04f, -4.737324154e-04f, +5.006972502e-04f, -2.896949507e-04f, +9.816516147e-05f, -1.379343640e-05f, + -2.385236352e-03f, +3.815021250e-03f, -2.620010092e-03f, -3.365357199e-03f, +1.378962994e-02f, -2.445110171e-02f, +2.853625253e-02f, -2.042337798e-02f, -7.555539715e-05f, +2.607576830e-02f, -4.631700029e-02f, +5.106511869e-02f, -3.768298238e-02f, +1.227023377e-02f, +1.374943669e-02f, -2.990976672e-02f, +3.190028444e-02f, -2.270057111e-02f, +9.539347567e-03f, +8.147414509e-04f, -5.324881538e-03f, +4.951235646e-03f, -2.594036379e-03f, +6.815946065e-04f, + +8.877170376e-05f, -3.266902341e-04f, +6.809646889e-04f, -9.448407337e-04f, +8.039859160e-04f, -3.133612787e-05f, -1.289157457e-03f, +2.680990491e-03f, -3.447493111e-03f, +3.043281239e-03f, -1.429321052e-03f, -8.298436705e-04f, +2.820399027e-03f, -3.749885259e-03f, +3.350962203e-03f, -1.977254177e-03f, +3.531799680e-04f, +8.422536019e-04f, -1.295105441e-03f, +1.113741447e-03f, -6.470352143e-04f, +2.275567523e-04f, -9.770303819e-06f, -3.218395171e-05f, + /* 14, 3 (24) */ + +9.804466076e-04f, -2.008293278e-04f, -3.469877811e-03f, +1.001185824e-02f, -1.588486214e-02f, +1.398231932e-02f, +3.309871302e-03f, -3.874410219e-02f, +8.530885949e-02f, -1.241234944e-01f, +1.174259665e-01f, +7.833934098e-01f, +2.690987666e-01f, -1.564285673e-01f, +7.570539561e-02f, -1.692228931e-02f, -1.540580567e-02f, +2.402308381e-02f, -1.817028132e-02f, +8.195557269e-03f, -8.962758497e-04f, -1.878436517e-03f, +1.628651702e-03f, -5.924590534e-04f, + -1.150668549e-04f, +2.538910417e-04f, -3.168659264e-04f, +6.574844617e-05f, +6.984936588e-04f, -1.883476665e-03f, +2.894684681e-03f, -2.632320229e-03f, -2.904118058e-04f, +7.508084114e-03f, -2.329013183e-02f, -5.609614430e-03f, +2.654943575e-02f, -2.743905104e-03f, -3.544052373e-03f, +4.496021339e-03f, -3.172595983e-03f, +1.347400030e-03f, -1.575000056e-05f, -5.408681089e-04f, +5.243237464e-04f, -2.894026873e-04f, +9.186672811e-05f, -9.696585427e-06f, + -2.296464648e-03f, +3.488331016e-03f, -1.939045403e-03f, -4.310197933e-03f, +1.459361585e-02f, -2.448243784e-02f, +2.724709508e-02f, -1.774238748e-02f, -3.523048508e-03f, +2.911904954e-02f, -4.774632134e-02f, +5.023527502e-02f, -3.486258335e-02f, +8.520348508e-03f, +1.710039889e-02f, -3.188702089e-02f, +3.225346441e-02f, -2.185831751e-02f, +8.244242126e-03f, +1.928482897e-03f, -5.971916752e-03f, +5.178792398e-03f, -2.603806683e-03f, +6.494106547e-04f, + +1.008266842e-04f, -3.380878856e-04f, +6.734959762e-04f, -8.936109333e-04f, +6.928866110e-04f, +1.280428443e-04f, -1.448693266e-03f, +2.768403831e-03f, -3.398924148e-03f, +2.840234656e-03f, -1.117524677e-03f, -1.154097198e-03f, +3.051928256e-03f, -3.822205572e-03f, +3.263538301e-03f, -1.788584202e-03f, +1.464112060e-04f, +9.995402078e-04f, -1.375066372e-03f, +1.127411078e-03f, -6.253657010e-04f, +1.996541794e-04f, +9.242779774e-06f, -4.082166865e-05f, + /* 14, 4 (24) */ + +8.653797527e-04f, +5.306171384e-05f, -3.786743738e-03f, +1.007760669e-02f, -1.518636848e-02f, +1.209884266e-02f, +6.204555983e-03f, -4.137642242e-02f, +8.501844769e-02f, -1.166154103e-01f, +9.413583464e-02f, +7.777837954e-01f, +2.956482023e-01f, -1.591724724e-01f, +7.216134324e-02f, -1.242626797e-02f, -1.857840165e-02f, +2.537048384e-02f, -1.818603132e-02f, +7.654689160e-03f, -3.719521032e-04f, -2.167839204e-03f, +1.720518430e-03f, -6.021556389e-04f, + -1.146357766e-04f, +2.426698797e-04f, -2.816633266e-04f, +9.403973572e-07f, +7.729907520e-04f, -1.909793379e-03f, +2.786301303e-03f, -2.315967098e-03f, -7.980105833e-04f, +7.958900442e-03f, -2.253653250e-02f, -7.176195729e-03f, +2.669122460e-02f, -1.854133470e-03f, -4.095334701e-03f, +4.688132339e-03f, -3.135336557e-03f, +1.222610598e-03f, +9.896552842e-05f, -6.065260382e-04f, +5.452751006e-04f, -2.870876684e-04f, +8.454837357e-05f, -5.212494168e-06f, + -2.195637964e-03f, +3.150243130e-03f, -1.265549426e-03f, -5.203808866e-03f, +1.528650246e-02f, -2.435439499e-02f, +2.579840181e-02f, -1.497398365e-02f, -6.921972656e-03f, +3.195928419e-02f, -4.886384601e-02f, +4.908117782e-02f, -3.181065509e-02f, +4.698142935e-03f, +2.036393719e-02f, -3.367560509e-02f, +3.239987561e-02f, -2.085877730e-02f, +6.869175755e-03f, +3.055893975e-03f, -6.597282453e-03f, +5.378446577e-03f, -2.594563903e-03f, +6.085889861e-04f, + +1.115156796e-04f, -3.466623980e-04f, +6.616323241e-04f, -8.376032387e-04f, +5.793680015e-04f, +2.840184150e-04f, -1.596659646e-03f, +2.836819321e-03f, -3.328515775e-03f, +2.619664849e-03f, -7.992472087e-04f, -1.470729056e-03f, +3.263978705e-03f, -3.869792487e-03f, +3.154043298e-03f, -1.586292933e-03f, -6.390032318e-05f, +1.152591083e-03f, -1.447269204e-03f, +1.133671437e-03f, -5.986850604e-04f, +1.692843111e-04f, +2.909075206e-05f, -4.965723057e-05f, + /* 14, 5 (24) */ + +7.507439760e-04f, +2.957315935e-04f, -4.068407064e-03f, +1.007854709e-02f, -1.441337773e-02f, +1.018904928e-02f, +8.990857287e-03f, -4.369238952e-02f, +8.422043710e-02f, -1.086565098e-01f, +7.159930214e-02f, +7.706075996e-01f, +3.223394269e-01f, -1.610266058e-01f, +6.806600853e-02f, -7.738135630e-03f, -2.171373821e-02f, +2.659309444e-02f, -1.808706580e-02f, +7.048163122e-03f, +1.733229974e-04f, -2.454926873e-03f, +1.805066804e-03f, -6.073681330e-04f, + -1.133793599e-04f, +2.302752612e-04f, -2.458610686e-04f, -6.190295822e-05f, +8.406217126e-04f, -1.923639489e-03f, +2.663489957e-03f, -1.993331364e-03f, -1.287322799e-03f, +8.349417553e-03f, -2.172202907e-02f, -8.715880075e-03f, +2.674550282e-02f, -9.194569997e-04f, -4.637633170e-03f, +4.856158506e-03f, -3.077546892e-03f, +1.086909229e-03f, +2.161874566e-04f, -6.702289988e-04f, +5.633186114e-04f, -2.826864722e-04f, +7.621795958e-05f, -3.598993315e-07f, + -2.084122284e-03f, +2.803580732e-03f, -6.039171023e-04f, -6.041412105e-03f, +1.586587046e-02f, -2.407037658e-02f, +2.420174217e-02f, -1.213716433e-02f, -1.025048843e-02f, +3.457894904e-02f, -4.966309322e-02f, +4.761044877e-02f, -2.854667639e-02f, +8.283504485e-04f, +2.351798049e-02f, -3.526189803e-02f, +3.233597529e-02f, -1.970618622e-02f, +5.421906550e-03f, +4.189565412e-03f, -7.195967514e-03f, +5.547730888e-03f, -2.565473151e-03f, +5.589317555e-04f, + +1.208139352e-04f, -3.524505644e-04f, +6.455828591e-04f, -7.773141998e-04f, +4.642444154e-04f, +4.356000735e-04f, -1.732219990e-03f, +2.885973877e-03f, -3.236895933e-03f, +2.383115619e-03f, -4.766065657e-04f, -1.777650099e-03f, +3.455107960e-03f, -3.892221410e-03f, +3.023054335e-03f, -1.371604137e-03f, -2.763828580e-04f, +1.300302629e-03f, -1.511072182e-03f, +1.132309081e-03f, -5.670445273e-04f, +1.365893649e-04f, +4.964864533e-05f, -5.861523986e-05f, + /* 14, 6 (24) */ + +6.373646162e-04f, +5.260068547e-04f, -4.314268133e-03f, +1.001664413e-02f, -1.357275602e-02f, +8.265409788e-03f, +1.165434724e-02f, -4.568572089e-02f, +8.293311430e-02f, -1.003070923e-01f, +4.987727307e-02f, +7.618917196e-01f, +3.490849297e-01f, -1.619460628e-01f, +6.342837536e-02f, -2.881977125e-03f, -2.479128510e-02f, +2.768000367e-02f, -1.787087834e-02f, +6.377934123e-03f, +7.366416088e-04f, -2.737613345e-03f, +1.881284763e-03f, -6.077280324e-04f, + -1.113472756e-04f, +2.168402581e-04f, -2.097169809e-04f, -1.224352289e-04f, +9.011439452e-04f, -1.925240126e-03f, +2.527348763e-03f, -1.666503851e-03f, -1.755980721e-03f, +8.679452183e-03f, -2.085092377e-02f, -1.022294150e-02f, +2.671096324e-02f, +5.695342327e-05f, -5.167520313e-03f, +4.998471035e-03f, -2.999087130e-03f, +9.408834287e-04f, +3.352261326e-04f, -7.314989783e-04f, +5.782340276e-04f, -2.761484020e-04f, +6.689165615e-05f, +4.838141895e-06f, + -1.963308349e-03f, +2.451130168e-03f, +4.166575678e-05f, -6.818726304e-03f, +1.633011488e-02f, -2.363477650e-02f, +2.246952217e-02f, -9.251190455e-03f, -1.348738436e-02f, +3.696206466e-02f, -5.013969979e-02f, +4.583279867e-02f, -2.509156843e-02f, -3.063870962e-03f, +2.654103483e-02f, -3.663350216e-02f, +3.205959243e-02f, -1.840588359e-02f, +3.910834368e-03f, +5.321874493e-03f, -7.763012041e-03f, +5.684320253e-03f, -2.515824506e-03f, +5.003165157e-04f, + +1.287091577e-04f, -3.555089494e-04f, +6.255810230e-04f, -7.132589257e-04f, +3.483257320e-04f, +5.818426652e-04f, -1.854631957e-03f, +2.915736295e-03f, -3.124829834e-03f, +2.132229819e-03f, -1.517442280e-04f, -2.072836700e-03f, +3.624010666e-03f, -3.889234602e-03f, +2.871297113e-03f, -1.145836820e-03f, -4.896333793e-04f, +1.441591452e-03f, -1.565880356e-03f, +1.123160010e-03f, -5.305330013e-04f, +1.017340271e-04f, +7.078057912e-05f, -6.761550920e-05f, + /* 14, 7 (24) */ + +5.260173405e-04f, +7.428471128e-04f, -4.523985114e-03f, +9.894208901e-03f, -1.267161207e-02f, +6.340169661e-03f, +1.418169601e-02f, -4.735222474e-02f, +8.117713358e-02f, -9.162764011e-02f, +2.902634929e-02f, +7.516687781e-01f, +3.757958930e-01f, -1.618891094e-01f, +5.826085505e-02f, +2.116493911e-03f, -2.779037223e-02f, +2.862088709e-02f, -1.753565221e-02f, +5.646435145e-03f, +1.314875636e-03f, -3.013761747e-03f, +1.948176420e-03f, -6.028898905e-04f, + -1.085930512e-04f, +2.025003003e-04f, -1.734827176e-04f, -1.803352363e-04f, +9.543666704e-04f, -1.914891610e-03f, +2.379031943e-03f, -1.337551709e-03f, -2.201791654e-03f, +8.949122217e-03f, -1.992771371e-02f, -1.169180272e-02f, +2.658667284e-02f, +1.071665851e-03f, -5.681550640e-03f, +5.113557114e-03f, -2.899942945e-03f, +7.852010034e-04f, +4.553619025e-04f, -7.898603562e-04f, +5.898154758e-04f, -2.674363103e-04f, +5.659415013e-05f, +1.035426515e-05f, + -1.834599191e-03f, +2.095621218e-03f, +6.672467798e-04f, -7.531985230e-03f, +1.667844061e-02f, -2.305293384e-02f, +2.061489022e-02f, -6.335454160e-03f, -1.661221420e-02f, +3.909429448e-02f, -5.029144402e-02f, +4.375996197e-02f, -2.146755776e-02f, -6.953105564e-03f, +2.941233194e-02f, -3.777933898e-02f, +3.156995905e-02f, -1.696429214e-02f, +2.344954013e-03f, +6.445034503e-03f, -8.293545042e-03f, +5.786054280e-03f, -2.445043927e-03f, +4.327010065e-04f, + +1.352011563e-04f, -3.559128289e-04f, +6.018822153e-04f, -6.459670054e-04f, +2.324118098e-04f, +7.218522101e-04f, -1.963251366e-03f, +2.926106845e-03f, -2.993213777e-03f, +1.868737768e-03f, +1.731892704e-04f, -2.354344383e-03f, +3.769527611e-03f, -3.860743623e-03f, +2.699641926e-03f, -9.103970605e-04f, -7.022269222e-04f, +1.575402208e-03f, -1.611150635e-03f, +1.106111916e-03f, -4.892773558e-04f, +6.490486429e-05f, +9.234050077e-05f, -7.657362257e-05f, + /* 14, 8 (24) */ + +4.174242894e-04f, +9.453474131e-04f, -4.697467831e-03f, +9.713873664e-03f, -1.171724540e-02f, +4.425278052e-03f, +1.656072795e-02f, -4.868977645e-02f, +7.897534193e-02f, -8.267851789e-02f, +9.098635588e-03f, +7.399769753e-01f, +4.023825658e-01f, -1.608174436e-01f, +5.257930441e-02f, +7.230051025e-03f, -3.069031518e-02f, +2.940608810e-02f, -1.708029030e-02f, +4.856574789e-03f, +1.904691112e-03f, -3.281198057e-03f, +2.004770570e-03f, -5.925356253e-04f, + -1.051734923e-04f, +1.873921124e-04f, -1.374022283e-04f, -2.353084264e-04f, +1.000150818e-03f, -1.892957872e-03f, +2.219741452e-03f, -1.008506660e-03f, -2.622746303e-03f, +9.158840857e-03f, -1.895706771e-02f, -1.311706039e-02f, +2.637207971e-02f, +2.121000375e-03f, -6.176279091e-03f, +5.200031581e-03f, -2.780228523e-03f, +6.206077173e-04f, +5.758490567e-04f, -8.448431731e-04f, +5.978733449e-04f, -2.565273500e-04f, +4.535879398e-05f, +1.615685041e-05f, + -1.699398035e-03f, +1.739708389e-03f, +1.269128995e-03f, -8.177952236e-03f, +1.691085242e-02f, -2.233108163e-02f, +1.865163885e-02f, -3.409347315e-03f, -1.960542797e-02f, +4.096303225e-02f, -5.011825475e-02f, +4.140561758e-02f, -1.769803015e-02f, -1.081384919e-02f, +3.211197387e-02f, -3.868973605e-02f, +3.086773213e-02f, -1.538888993e-02f, +7.338033779e-04f, +7.551146419e-03f, -8.782822398e-03f, +5.850959145e-03f, -2.352703426e-03f, +3.561273839e-04f, + +1.403013936e-04f, -3.537550158e-04f, +5.747613325e-04f, -5.759784120e-04f, +1.172870872e-04f, +8.547912761e-04f, -2.057535372e-03f, +2.917215977e-03f, -2.843068118e-03f, +1.594445136e-03f, +4.960488752e-04f, -2.620320914e-03f, +3.890653830e-03f, -3.806830639e-03f, +2.509098689e-03f, -6.667691739e-04f, -9.127261488e-04f, +1.700715370e-03f, -1.646396540e-03f, +1.081106097e-03f, -4.434424702e-04f, +2.630954309e-05f, +1.141730368e-04f, -8.540155631e-05f, + /* 14, 9 (24) */ + +3.122507971e-04f, +1.132739526e-03f, -4.834870060e-03f, +9.478565238e-03f, -1.071709459e-02f, +2.532320180e-03f, +1.878046940e-02f, -4.969828311e-02f, +7.635259563e-02f, -7.351967704e-02f, -9.858432118e-03f, +7.268599150e-01f, +4.287546455e-01f, -1.586964432e-01f, +4.640302532e-02f, +1.243008261e-02f, -3.347054370e-02f, +3.002669581e-02f, -1.650444125e-02f, +4.011731615e-03f, +2.502564457e-03f, -3.537725407e-03f, +2.050129364e-03f, -5.763787749e-04f, + -1.011481011e-04f, +1.716526762e-04f, -1.017103278e-04f, -2.870880641e-04f, +1.038408586e-03f, -1.859866545e-03f, +2.050718492e-03f, -6.813536977e-04f, -3.017025959e-03f, +9.309309334e-03f, -1.794380256e-02f, -1.449350944e-02f, +2.606701830e-02f, +3.201043676e-03f, -6.648279809e-03f, +5.256648077e-03f, -2.640188805e-03f, +4.479243906e-04f, +6.959200476e-04f, -8.959864508e-04f, +6.022361123e-04f, -2.434136463e-04f, +3.322769159e-05f, +2.221011272e-05f, + -1.559096642e-03f, +1.385953374e-03f, +1.843890328e-03f, -8.753930648e-03f, +1.702813951e-02f, -2.147629035e-02f, +1.659410348e-02f, -4.921313377e-04f, -2.244849609e-02f, +4.255747738e-02f, -4.962220587e-02f, +3.878529667e-02f, -1.380737632e-02f, -1.462067983e-02f, +3.462107255e-02f, -3.935650522e-02f, +2.995500598e-02f, -1.368817456e-02f, -9.125931621e-04f, +8.632252516e-03f, -9.226264868e-03f, +5.877268688e-03f, -2.238530389e-03f, +2.707258276e-04f, + +1.440324538e-04f, -3.491445827e-04f, +5.445102245e-04f, -5.038394200e-04f, +3.715389702e-06f, +9.798838764e-04f, -2.137044893e-03f, +2.889322133e-03f, -2.675529434e-03f, +1.311220361e-03f, +8.147094686e-04f, -2.869018752e-03f, +3.986545674e-03f, -3.727748556e-03f, +2.300810958e-03f, -4.165062520e-04f, -1.119691115e-03f, +1.816554846e-03f, -1.671192645e-03f, +1.048139023e-03f, -3.932309743e-04f, -1.382413722e-05f, +1.361144515e-04f, -9.400835658e-05f, + /* 14,10 (24) */ + +2.111026960e-04f, +1.304392202e-03f, -4.936580387e-03f, +9.191477174e-03f, -9.678686000e-03f, +6.724536350e-04f, +2.083118789e-02f, -5.037963680e-02f, +7.333556967e-02f, -6.421036770e-02f, -2.780223467e-02f, +7.123664055e-01f, +4.548216638e-01f, -1.554953995e-01f, +3.975474551e-02f, +1.768673068e-02f, -3.611073250e-02f, +3.047462021e-02f, -1.580852120e-02f, +3.115745165e-03f, +3.104800569e-03f, -3.781139053e-03f, +2.083357055e-03f, -5.541686622e-04f, + -9.657849472e-05f, +1.554182272e-04f, -6.663137401e-05f, -3.354362079e-04f, +1.069102680e-03f, -1.816104729e-03f, +1.873234975e-03f, -3.580203010e-04f, -3.383008478e-03f, +9.401508235e-03f, -1.689285865e-02f, -1.581616645e-02f, +2.567171273e-02f, +4.307664950e-03f, -7.094165142e-03f, +5.282309611e-03f, -2.480200967e-03f, +2.680434521e-04f, +8.147899551e-04f, -9.428415409e-04f, +6.027520984e-04f, -2.281028792e-04f, +2.025171812e-05f, +2.847423271e-05f, + -1.415064188e-03f, +1.036808791e-03f, +2.388400552e-03f, -9.257770068e-03f, +1.703185490e-02f, -2.049640647e-02f, +1.445705859e-02f, +2.397190796e-03f, -2.512402553e-02f, +4.386869774e-02f, -4.880749640e-02f, +3.591627792e-02f, -9.820830647e-03f, -1.834842838e-02f, +3.692188351e-02f, -3.977301147e-02f, +2.883531487e-02f, -1.187161971e-02f, -2.583785807e-03f, +9.680391539e-03f, -9.619495843e-03f, +5.863444550e-03f, -2.102415937e-03f, +1.767174710e-04f, + +1.464274351e-04f, -3.422054965e-04f, +5.114350897e-04f, -4.300985664e-04f, -1.075650209e-04f, +1.096419862e-03f, -2.201446298e-03f, +2.842808709e-03f, -2.491841960e-03f, +1.020981714e-03f, +1.127080149e-03f, -3.098806785e-03f, +4.056526781e-03f, -3.623919993e-03f, +2.076049007e-03f, -1.612201476e-04f, -1.321689166e-03f, +1.921995399e-03f, -1.685178648e-03f, +1.007263527e-03f, -3.388827038e-04f, -5.524939917e-05f, +1.579937073e-04f, -1.023008687e-04f, + /* 14,11 (24) */ + +1.145242013e-04f, +1.459810429e-03f, -5.003211761e-03f, +8.856040966e-03f, -8.609583320e-03f, -1.143651094e-03f, +2.270442287e-02f, -5.073765710e-02f, +6.995256119e-02f, -5.480885947e-02f, -4.469509332e-02f, +6.965502391e-01f, +4.804933765e-01f, -1.511877346e-01f, +3.266058037e-02f, +2.296904029e-02f, -3.859093347e-02f, +3.074266366e-02f, -1.499373124e-02f, +2.172903624e-03f, +3.707552668e-03f, -4.009241933e-03f, +2.103608773e-03f, -5.256944295e-04f, + -9.152782818e-05f, +1.388232904e-04f, -3.237805763e-05f, -3.801444652e-04f, +1.092245240e-03f, -1.762214489e-03f, +1.688584985e-03f, -4.036621525e-05f, -3.719273057e-03f, +9.436687493e-03f, -1.580927528e-02f, -1.708029187e-02f, +2.518677821e-02f, +5.436533139e-03f, -7.510604775e-03f, +5.276078463e-03f, -2.300775120e-03f, +8.192495242e-05f, +9.316611769e-04f, -9.849754807e-04f, +5.992911335e-04f, -2.106187724e-04f, +6.490471674e-06f, +3.490552730e-05f, + -1.268636753e-03f, +6.946032943e-04f, +2.899835642e-03f, -9.687868634e-03f, +1.692428988e-02f, -1.939998661e-02f, +1.225561229e-02f, +5.239999505e-03f, -2.761586749e-02f, +4.488967946e-02f, -4.768041625e-02f, +3.281747113e-02f, -5.764303866e-03f, -2.197234838e-02f, +3.899793252e-02f, -3.993423162e-02f, +2.751362570e-02f, -9.949624316e-03f, -4.268964456e-03f, +1.068765507e-02f, -9.958378547e-03f, +5.808195151e-03f, -1.944422230e-03f, +7.441660232e-05f, + +1.475292730e-04f, -3.330751757e-04f, +4.758538301e-04f, -3.553026834e-04f, -2.158461251e-04f, +1.203758788e-03f, -2.250512333e-03f, +2.778180183e-03f, -2.293348343e-03f, +7.256840816e-04f, +1.431118242e-03f, -3.308181264e-03f, +4.100092922e-03f, -3.495935082e-03f, +1.836201983e-03f, +9.742903542e-05f, -1.517304894e-03f, +2.016169816e-03f, -1.688063052e-03f, +9.585896065e-04f, -2.806738620e-04f, -9.770182332e-05f, +1.796336222e-04f, -1.101845135e-04f, + /* 14,12 (24) */ + +2.299637308e-05f, +1.598633719e-03f, -5.035589819e-03f, +8.475896501e-03f, -7.517338080e-03f, -2.905865583e-03f, +2.439300785e-02f, -5.077802332e-02f, +6.623328813e-02f, -4.537217197e-02f, -6.050436860e-02f, +6.794699472e-01f, +5.056801548e-01f, -1.457512014e-01f, +2.514997559e-02f, +2.824511876e-02f, -4.089170859e-02f, +3.082458861e-02f, -1.406207007e-02f, +1.187928143e-03f, +4.306843801e-03f, -4.219860705e-03f, +2.110099245e-03f, -4.907889022e-04f, + -8.606022726e-05f, +1.219997620e-04f, +8.496885806e-07f, -4.210345284e-04f, +1.107896472e-03f, -1.698788098e-03f, +1.498076284e-03f, +2.698261458e-04f, -4.024603782e-03f, +9.416355120e-03f, -1.469816564e-02f, -1.828141104e-02f, +2.461322060e-02f, +6.583135401e-03f, -7.894344865e-03f, +5.237185354e-03f, -2.102554198e-03f, -1.094079461e-04f, +1.045728319e-03f, -1.021974332e-03f, +5.917461238e-04f, -1.910014798e-04f, -7.987845379e-06f, +4.145666050e-05f, + -1.121107480e-03f, +3.615281186e-04f, +3.375689472e-03f, -1.004317132e-02f, +1.670844375e-02f, -1.819622782e-02f, +1.000509996e-02f, +8.018179688e-03f, -2.990921583e-02f, +4.561536354e-02f, -4.624929801e-02f, +2.950928987e-02f, -1.664210943e-03f, -2.546828346e-02f, +4.083413450e-02f, -3.983680258e-02f, +2.599632081e-02f, -7.933454500e-03f, -5.957027508e-03f, +1.164624467e-02f, -1.023905241e-02f, +5.710493328e-03f, -1.764788608e-03f, -3.576791121e-05f, + +1.473900032e-04f, -3.219029865e-04f, +4.380933868e-04f, -2.799930313e-04f, -3.204545227e-04f, +1.301333230e-03f, -2.284122307e-03f, +2.696057453e-03f, -2.081479798e-03f, +4.273055697e-04f, +1.724842931e-03f, -3.495775858e-03f, +4.116915678e-03f, -3.344548116e-03f, +1.582769199e-03f, +3.577438748e-04f, -1.705150082e-03f, +2.098275761e-03f, -1.679626412e-03f, +9.022848323e-04f, -2.189158879e-04f, -1.409008609e-04f, +2.008521162e-04f, -1.175641055e-04f, + /* 14,13 (24) */ + -6.306385418e-05f, +1.720633481e-03f, -5.034740130e-03f, +8.054861973e-03f, -6.409441608e-03f, -4.604653681e-03f, +2.589108414e-02f, -5.050819717e-02f, +6.220868435e-02f, -3.595581685e-02f, -7.520253424e-02f, +6.611885362e-01f, +5.302933753e-01f, -1.391680660e-01f, +1.725563073e-02f, +3.348230411e-02f, -4.299426279e-02f, +3.071518066e-02f, -1.301634175e-02f, +1.659538106e-04f, +4.898589925e-03f, -4.410862185e-03f, +2.102111400e-03f, -4.493322417e-04f, + -8.024023462e-05f, +1.050760413e-04f, +3.286565838e-05f, -4.579584934e-04f, +1.116163001e-03f, -1.626463083e-03f, +1.303021930e-03f, +5.708606370e-04f, -4.297991963e-03f, +9.342264766e-03f, -1.356469177e-02f, -1.941533383e-02f, +2.395243395e-02f, +7.742796720e-03f, -8.242227107e-03f, +5.165037823e-03f, -1.886313019e-03f, -3.048739871e-04f, +1.156183255e-03f, -1.053446484e-03f, +5.800345022e-04f, -1.693078644e-04f, -2.310661682e-05f, +4.807689410e-05f, + -9.737174764e-04f, +3.962513207e-05f, +3.813782859e-03f, -1.032316435e-02f, +1.638798923e-02f, -1.689489459e-02f, +7.720977648e-03f, +1.071423714e-02f, -3.199069563e-02f, +4.604266911e-02f, -4.452445508e-02f, +2.601351401e-02f, +2.452704734e-03f, -2.881283157e-02f, +4.241690370e-02f, -3.947905871e-02f, +2.429117072e-02f, -5.835178738e-03f, -7.636653920e-03f, +1.254852950e-02f, -1.045796830e-02f, +5.569592467e-03f, -1.563936492e-03f, -1.533320167e-04f, + +1.460699732e-04f, -3.088486900e-04f, +3.984870780e-04f, -2.047015564e-04f, -4.207554827e-04f, +1.388651543e-03f, -2.302261536e-03f, +2.597172415e-03f, -1.857745728e-03f, +1.278340169e-04f, +2.006348441e-03f, -3.660370767e-03f, +4.106844915e-03f, -3.170673062e-03f, +1.317350612e-03f, +6.180009141e-04f, -1.883873571e-03f, +2.167582275e-03f, -1.659724122e-03f, +8.385743370e-04f, -1.539540334e-04f, -1.845515153e-04f, +2.214635405e-04f, -1.243447058e-04f, + /* 14,14 (24) */ + -1.433040888e-04f, +1.825709523e-03f, -5.001874472e-03f, +7.596903479e-03f, -5.293278608e-03f, -6.231116763e-03f, +2.719410607e-02f, -4.993733654e-02f, +5.791069239e-02f, -2.661355209e-02f, -8.876722601e-02f, +6.417732023e-01f, +5.542458093e-01f, -1.314252693e-01f, +9.013403621e-03f, +3.864734193e-02f, -4.488057581e-02f, +3.041030668e-02f, -1.186015849e-02f, -8.874926734e-04f, +5.478624427e-03f, -4.580170049e-03f, +2.079004783e-03f, -4.012553476e-04f, + -7.413227349e-05f, +8.817621892e-05f, +6.349821460e-05f, -4.907989656e-04f, +1.117195967e-03f, -1.545917090e-03f, +1.104732041e-03f, +8.611356149e-04f, -4.538637254e-03f, +9.216402165e-03f, -1.241403936e-02f, -2.047817292e-02f, +2.320619628e-02f, +8.910700572e-03f, -8.551207591e-03f, +5.059227737e-03f, -1.652956524e-03f, -5.033393235e-04f, +1.262220332e-03f, -1.079025887e-03f, +5.640995504e-04f, -1.456116643e-04f, -3.878107569e-05f, +5.471237745e-05f, + -8.276475031e-04f, -2.692235579e-04f, +4.212269937e-03f, -1.052786591e-02f, +1.596723375e-02f, -1.550624305e-02f, +5.418716112e-03f, +1.331140956e-02f, -3.384844136e-02f, +4.617050312e-02f, -4.251810664e-02f, +2.235314324e-02f, +6.559549650e-03f, -3.198350464e-02f, +4.373425431e-02f, -3.886105779e-02f, +2.240729715e-02f, -3.667596463e-03f, -9.296378042e-03f, +1.338710384e-02f, -1.061192233e-02f, +5.385040952e-03f, -1.342472951e-03f, -2.776767224e-04f, + +1.436370082e-04f, -2.940808542e-04f, +3.573719583e-04f, -1.299473008e-04f, -5.161566428e-04f, +1.465300038e-03f, -2.305020054e-03f, +2.482361840e-03f, -1.623722889e-03f, -1.707464846e-04f, +2.273816657e-03f, -3.800900831e-03f, +4.069910059e-03f, -2.975377965e-03f, +1.041636557e-03f, +8.764622216e-04f, -2.052170979e-03f, +2.223435850e-03f, -1.628288718e-03f, +7.677403885e-04f, -8.616565247e-05f, -2.283461846e-04f, +2.412800790e-04f, -1.304325046e-04f, + /* 14,15 (24) */ + -2.174363623e-04f, +1.913885742e-03f, -4.938376257e-03f, +7.106104514e-03f, -4.176082641e-03f, -7.777033854e-03f, +2.829883811e-02f, -4.907620092e-02f, +5.337205513e-02f, -1.739714992e-02f, -1.011812654e-01f, +6.212950294e-01f, +5.774520056e-01f, -1.225145687e-01f, +4.621960300e-04f, +4.370656967e-02f, -4.653353233e-02f, +2.990696735e-02f, -1.059793816e-02f, -1.966518561e-03f, +6.042723978e-03f, -4.725781713e-03f, +2.040223707e-03f, -3.465429701e-04f, + -6.780013253e-05f, +7.141932505e-05f, +9.259100364e-05f, -5.194689564e-04f, +1.111188872e-03f, -1.457862625e-03f, +9.045057638e-04f, +1.139151431e-03f, -4.745947579e-03f, +9.040970588e-03f, -1.125139282e-02f, -2.146636049e-02f, +2.237666333e-02f, +1.008191055e-02f, -8.818375365e-03f, +4.919537884e-03f, -1.403517159e-03f, -7.036234824e-04f, +1.363041684e-03f, -1.098375208e-03f, +5.439115795e-04f, -1.200035405e-04f, -5.491864062e-05f, +6.130647532e-05f, + -6.840104950e-04f, -5.633044121e-04f, +4.569641895e-03f, -1.065781321e-02f, +1.545107710e-02f, -1.404094301e-02f, +3.113696059e-03f, +1.579377140e-02f, -3.547216424e-02f, +4.599975664e-02f, -4.024428998e-02f, +1.855224241e-02f, +1.062945971e-02f, -3.495888260e-02f, +4.477589087e-02f, -3.798459557e-02f, +2.035512617e-02f, -1.444160614e-03f, -1.092466676e-02f, +1.415484423e-02f, -1.069808798e-02f, +5.156694767e-03f, -1.101192872e-03f, -4.081092270e-04f, + +1.401655427e-04f, -2.777752460e-04f, +3.150862197e-04f, -5.623298575e-05f, -6.061113373e-04f, +1.530944592e-03f, -2.292590622e-03f, +2.352560583e-03f, -1.381044183e-03f, -4.664689709e-04f, +2.525529115e-03f, -3.916462572e-03f, +4.006320132e-03f, -2.759878268e-03f, +7.573967986e-04f, +1.131387145e-03f, -2.208794194e-03f, +2.265266050e-03f, -1.585331660e-03f, +6.901215371e-04f, -1.595820921e-05f, -2.719666525e-04f, +2.601132140e-04f, -1.357357253e-04f, + /* 14,16 (24) */ + -2.852364948e-04f, +1.985305067e-03f, -4.845785254e-03f, +6.586635557e-03f, -3.064893769e-03f, -9.234896479e-03f, +2.920334387e-02f, -4.793704949e-02f, +4.862610755e-02f, -8.356179335e-03f, -1.124326582e-01f, +5.998286689e-01f, +5.998286689e-01f, -1.124326582e-01f, -8.356179335e-03f, +4.862610755e-02f, -4.793704949e-02f, +2.920334387e-02f, -9.234896479e-03f, -3.064893769e-03f, +6.586635557e-03f, -4.845785254e-03f, +1.985305067e-03f, -2.852364948e-04f, + -6.130647532e-05f, +5.491864062e-05f, +1.200035405e-04f, -5.439115795e-04f, +1.098375208e-03f, -1.363041684e-03f, +7.036234824e-04f, +1.403517159e-03f, -4.919537884e-03f, +8.818375365e-03f, -1.008191055e-02f, -2.237666333e-02f, +2.146636049e-02f, +1.125139282e-02f, -9.040970588e-03f, +4.745947579e-03f, -1.139151431e-03f, -9.045057638e-04f, +1.457862625e-03f, -1.111188872e-03f, +5.194689564e-04f, -9.259100364e-05f, -7.141932505e-05f, +6.780013253e-05f, + -5.438449523e-04f, -8.410796581e-04f, +4.884728115e-03f, -1.071404619e-02f, +1.484496577e-02f, -1.250999842e-02f, +8.211054363e-04f, +1.814633198e-02f, -3.685320843e-02f, +4.553328767e-02f, -3.771876087e-02f, +1.463577984e-02f, +1.463577984e-02f, -3.771876087e-02f, +4.553328767e-02f, -3.685320843e-02f, +1.814633198e-02f, +8.211054363e-04f, -1.250999842e-02f, +1.484496577e-02f, -1.071404619e-02f, +4.884728115e-03f, -8.410796581e-04f, -5.438449523e-04f, + +1.357357253e-04f, -2.601132140e-04f, +2.719666525e-04f, +1.595820921e-05f, -6.901215371e-04f, +1.585331660e-03f, -2.265266050e-03f, +2.208794194e-03f, -1.131387145e-03f, -7.573967986e-04f, +2.759878268e-03f, -4.006320132e-03f, +3.916462572e-03f, -2.525529115e-03f, +4.664689709e-04f, +1.381044183e-03f, -2.352560583e-03f, +2.292590622e-03f, -1.530944592e-03f, +6.061113373e-04f, +5.623298575e-05f, -3.150862197e-04f, +2.777752460e-04f, -1.401655427e-04f, + /* 14,17 (24) */ + -3.465429701e-04f, +2.040223707e-03f, -4.725781713e-03f, +6.042723978e-03f, -1.966518561e-03f, -1.059793816e-02f, +2.990696735e-02f, -4.653353233e-02f, +4.370656967e-02f, +4.621960300e-04f, -1.225145687e-01f, +5.774520056e-01f, +6.212950294e-01f, -1.011812654e-01f, -1.739714992e-02f, +5.337205513e-02f, -4.907620092e-02f, +2.829883811e-02f, -7.777033854e-03f, -4.176082641e-03f, +7.106104514e-03f, -4.938376257e-03f, +1.913885742e-03f, -2.174363623e-04f, + -5.471237745e-05f, +3.878107569e-05f, +1.456116643e-04f, -5.640995504e-04f, +1.079025887e-03f, -1.262220332e-03f, +5.033393235e-04f, +1.652956524e-03f, -5.059227737e-03f, +8.551207591e-03f, -8.910700572e-03f, -2.320619628e-02f, +2.047817292e-02f, +1.241403936e-02f, -9.216402165e-03f, +4.538637254e-03f, -8.611356149e-04f, -1.104732041e-03f, +1.545917090e-03f, -1.117195967e-03f, +4.907989656e-04f, -6.349821460e-05f, -8.817621892e-05f, +7.413227349e-05f, + -4.081092270e-04f, -1.101192872e-03f, +5.156694767e-03f, -1.069808798e-02f, +1.415484423e-02f, -1.092466676e-02f, -1.444160614e-03f, +2.035512617e-02f, -3.798459557e-02f, +4.477589087e-02f, -3.495888260e-02f, +1.062945971e-02f, +1.855224241e-02f, -4.024428998e-02f, +4.599975664e-02f, -3.547216424e-02f, +1.579377140e-02f, +3.113696059e-03f, -1.404094301e-02f, +1.545107710e-02f, -1.065781321e-02f, +4.569641895e-03f, -5.633044121e-04f, -6.840104950e-04f, + +1.304325046e-04f, -2.412800790e-04f, +2.283461846e-04f, +8.616565247e-05f, -7.677403885e-04f, +1.628288718e-03f, -2.223435850e-03f, +2.052170979e-03f, -8.764622216e-04f, -1.041636557e-03f, +2.975377965e-03f, -4.069910059e-03f, +3.800900831e-03f, -2.273816657e-03f, +1.707464846e-04f, +1.623722889e-03f, -2.482361840e-03f, +2.305020054e-03f, -1.465300038e-03f, +5.161566428e-04f, +1.299473008e-04f, -3.573719583e-04f, +2.940808542e-04f, -1.436370082e-04f, + /* 14,18 (24) */ + -4.012553476e-04f, +2.079004783e-03f, -4.580170049e-03f, +5.478624427e-03f, -8.874926734e-04f, -1.186015849e-02f, +3.041030668e-02f, -4.488057581e-02f, +3.864734193e-02f, +9.013403621e-03f, -1.314252693e-01f, +5.542458093e-01f, +6.417732023e-01f, -8.876722601e-02f, -2.661355209e-02f, +5.791069239e-02f, -4.993733654e-02f, +2.719410607e-02f, -6.231116763e-03f, -5.293278608e-03f, +7.596903479e-03f, -5.001874472e-03f, +1.825709523e-03f, -1.433040888e-04f, + -4.807689410e-05f, +2.310661682e-05f, +1.693078644e-04f, -5.800345022e-04f, +1.053446484e-03f, -1.156183255e-03f, +3.048739871e-04f, +1.886313019e-03f, -5.165037823e-03f, +8.242227107e-03f, -7.742796720e-03f, -2.395243395e-02f, +1.941533383e-02f, +1.356469177e-02f, -9.342264766e-03f, +4.297991963e-03f, -5.708606370e-04f, -1.303021930e-03f, +1.626463083e-03f, -1.116163001e-03f, +4.579584934e-04f, -3.286565838e-05f, -1.050760413e-04f, +8.024023462e-05f, + -2.776767224e-04f, -1.342472951e-03f, +5.385040952e-03f, -1.061192233e-02f, +1.338710384e-02f, -9.296378042e-03f, -3.667596463e-03f, +2.240729715e-02f, -3.886105779e-02f, +4.373425431e-02f, -3.198350464e-02f, +6.559549650e-03f, +2.235314324e-02f, -4.251810664e-02f, +4.617050312e-02f, -3.384844136e-02f, +1.331140956e-02f, +5.418716112e-03f, -1.550624305e-02f, +1.596723375e-02f, -1.052786591e-02f, +4.212269937e-03f, -2.692235579e-04f, -8.276475031e-04f, + +1.243447058e-04f, -2.214635405e-04f, +1.845515153e-04f, +1.539540334e-04f, -8.385743370e-04f, +1.659724122e-03f, -2.167582275e-03f, +1.883873571e-03f, -6.180009141e-04f, -1.317350612e-03f, +3.170673062e-03f, -4.106844915e-03f, +3.660370767e-03f, -2.006348441e-03f, -1.278340169e-04f, +1.857745728e-03f, -2.597172415e-03f, +2.302261536e-03f, -1.388651543e-03f, +4.207554827e-04f, +2.047015564e-04f, -3.984870780e-04f, +3.088486900e-04f, -1.460699732e-04f, + /* 14,19 (24) */ + -4.493322417e-04f, +2.102111400e-03f, -4.410862185e-03f, +4.898589925e-03f, +1.659538106e-04f, -1.301634175e-02f, +3.071518066e-02f, -4.299426279e-02f, +3.348230411e-02f, +1.725563073e-02f, -1.391680660e-01f, +5.302933753e-01f, +6.611885362e-01f, -7.520253424e-02f, -3.595581685e-02f, +6.220868435e-02f, -5.050819717e-02f, +2.589108414e-02f, -4.604653681e-03f, -6.409441608e-03f, +8.054861973e-03f, -5.034740130e-03f, +1.720633481e-03f, -6.306385418e-05f, + -4.145666050e-05f, +7.987845379e-06f, +1.910014798e-04f, -5.917461238e-04f, +1.021974332e-03f, -1.045728319e-03f, +1.094079461e-04f, +2.102554198e-03f, -5.237185354e-03f, +7.894344865e-03f, -6.583135401e-03f, -2.461322060e-02f, +1.828141104e-02f, +1.469816564e-02f, -9.416355120e-03f, +4.024603782e-03f, -2.698261458e-04f, -1.498076284e-03f, +1.698788098e-03f, -1.107896472e-03f, +4.210345284e-04f, -8.496885806e-07f, -1.219997620e-04f, +8.606022726e-05f, + -1.533320167e-04f, -1.563936492e-03f, +5.569592467e-03f, -1.045796830e-02f, +1.254852950e-02f, -7.636653920e-03f, -5.835178738e-03f, +2.429117072e-02f, -3.947905871e-02f, +4.241690370e-02f, -2.881283157e-02f, +2.452704734e-03f, +2.601351401e-02f, -4.452445508e-02f, +4.604266911e-02f, -3.199069563e-02f, +1.071423714e-02f, +7.720977648e-03f, -1.689489459e-02f, +1.638798923e-02f, -1.032316435e-02f, +3.813782859e-03f, +3.962513207e-05f, -9.737174764e-04f, + +1.175641055e-04f, -2.008521162e-04f, +1.409008609e-04f, +2.189158879e-04f, -9.022848323e-04f, +1.679626412e-03f, -2.098275761e-03f, +1.705150082e-03f, -3.577438748e-04f, -1.582769199e-03f, +3.344548116e-03f, -4.116915678e-03f, +3.495775858e-03f, -1.724842931e-03f, -4.273055697e-04f, +2.081479798e-03f, -2.696057453e-03f, +2.284122307e-03f, -1.301333230e-03f, +3.204545227e-04f, +2.799930313e-04f, -4.380933868e-04f, +3.219029865e-04f, -1.473900032e-04f, + /* 14,20 (24) */ + -4.907889022e-04f, +2.110099245e-03f, -4.219860705e-03f, +4.306843801e-03f, +1.187928143e-03f, -1.406207007e-02f, +3.082458861e-02f, -4.089170859e-02f, +2.824511876e-02f, +2.514997559e-02f, -1.457512014e-01f, +5.056801548e-01f, +6.794699472e-01f, -6.050436860e-02f, -4.537217197e-02f, +6.623328813e-02f, -5.077802332e-02f, +2.439300785e-02f, -2.905865583e-03f, -7.517338080e-03f, +8.475896501e-03f, -5.035589819e-03f, +1.598633719e-03f, +2.299637308e-05f, + -3.490552730e-05f, -6.490471674e-06f, +2.106187724e-04f, -5.992911335e-04f, +9.849754807e-04f, -9.316611769e-04f, -8.192495242e-05f, +2.300775120e-03f, -5.276078463e-03f, +7.510604775e-03f, -5.436533139e-03f, -2.518677821e-02f, +1.708029187e-02f, +1.580927528e-02f, -9.436687493e-03f, +3.719273057e-03f, +4.036621525e-05f, -1.688584985e-03f, +1.762214489e-03f, -1.092245240e-03f, +3.801444652e-04f, +3.237805763e-05f, -1.388232904e-04f, +9.152782818e-05f, + -3.576791121e-05f, -1.764788608e-03f, +5.710493328e-03f, -1.023905241e-02f, +1.164624467e-02f, -5.957027508e-03f, -7.933454500e-03f, +2.599632081e-02f, -3.983680258e-02f, +4.083413450e-02f, -2.546828346e-02f, -1.664210943e-03f, +2.950928987e-02f, -4.624929801e-02f, +4.561536354e-02f, -2.990921583e-02f, +8.018179688e-03f, +1.000509996e-02f, -1.819622782e-02f, +1.670844375e-02f, -1.004317132e-02f, +3.375689472e-03f, +3.615281186e-04f, -1.121107480e-03f, + +1.101845135e-04f, -1.796336222e-04f, +9.770182332e-05f, +2.806738620e-04f, -9.585896065e-04f, +1.688063052e-03f, -2.016169816e-03f, +1.517304894e-03f, -9.742903542e-05f, -1.836201983e-03f, +3.495935082e-03f, -4.100092922e-03f, +3.308181264e-03f, -1.431118242e-03f, -7.256840816e-04f, +2.293348343e-03f, -2.778180183e-03f, +2.250512333e-03f, -1.203758788e-03f, +2.158461251e-04f, +3.553026834e-04f, -4.758538301e-04f, +3.330751757e-04f, -1.475292730e-04f, + /* 14,21 (24) */ + -5.256944295e-04f, +2.103608773e-03f, -4.009241933e-03f, +3.707552668e-03f, +2.172903624e-03f, -1.499373124e-02f, +3.074266366e-02f, -3.859093347e-02f, +2.296904029e-02f, +3.266058037e-02f, -1.511877346e-01f, +4.804933765e-01f, +6.965502391e-01f, -4.469509332e-02f, -5.480885947e-02f, +6.995256119e-02f, -5.073765710e-02f, +2.270442287e-02f, -1.143651094e-03f, -8.609583320e-03f, +8.856040966e-03f, -5.003211761e-03f, +1.459810429e-03f, +1.145242013e-04f, + -2.847423271e-05f, -2.025171812e-05f, +2.281028792e-04f, -6.027520984e-04f, +9.428415409e-04f, -8.147899551e-04f, -2.680434521e-04f, +2.480200967e-03f, -5.282309611e-03f, +7.094165142e-03f, -4.307664950e-03f, -2.567171273e-02f, +1.581616645e-02f, +1.689285865e-02f, -9.401508235e-03f, +3.383008478e-03f, +3.580203010e-04f, -1.873234975e-03f, +1.816104729e-03f, -1.069102680e-03f, +3.354362079e-04f, +6.663137401e-05f, -1.554182272e-04f, +9.657849472e-05f, + +7.441660232e-05f, -1.944422230e-03f, +5.808195151e-03f, -9.958378547e-03f, +1.068765507e-02f, -4.268964456e-03f, -9.949624316e-03f, +2.751362570e-02f, -3.993423162e-02f, +3.899793252e-02f, -2.197234838e-02f, -5.764303866e-03f, +3.281747113e-02f, -4.768041625e-02f, +4.488967946e-02f, -2.761586749e-02f, +5.239999505e-03f, +1.225561229e-02f, -1.939998661e-02f, +1.692428988e-02f, -9.687868634e-03f, +2.899835642e-03f, +6.946032943e-04f, -1.268636753e-03f, + +1.023008687e-04f, -1.579937073e-04f, +5.524939917e-05f, +3.388827038e-04f, -1.007263527e-03f, +1.685178648e-03f, -1.921995399e-03f, +1.321689166e-03f, +1.612201476e-04f, -2.076049007e-03f, +3.623919993e-03f, -4.056526781e-03f, +3.098806785e-03f, -1.127080149e-03f, -1.020981714e-03f, +2.491841960e-03f, -2.842808709e-03f, +2.201446298e-03f, -1.096419862e-03f, +1.075650209e-04f, +4.300985664e-04f, -5.114350897e-04f, +3.422054965e-04f, -1.464274351e-04f, + /* 14,22 (24) */ + -5.541686622e-04f, +2.083357055e-03f, -3.781139053e-03f, +3.104800569e-03f, +3.115745165e-03f, -1.580852120e-02f, +3.047462021e-02f, -3.611073250e-02f, +1.768673068e-02f, +3.975474551e-02f, -1.554953995e-01f, +4.548216638e-01f, +7.123664055e-01f, -2.780223467e-02f, -6.421036770e-02f, +7.333556967e-02f, -5.037963680e-02f, +2.083118789e-02f, +6.724536350e-04f, -9.678686000e-03f, +9.191477174e-03f, -4.936580387e-03f, +1.304392202e-03f, +2.111026960e-04f, + -2.221011272e-05f, -3.322769159e-05f, +2.434136463e-04f, -6.022361123e-04f, +8.959864508e-04f, -6.959200476e-04f, -4.479243906e-04f, +2.640188805e-03f, -5.256648077e-03f, +6.648279809e-03f, -3.201043676e-03f, -2.606701830e-02f, +1.449350944e-02f, +1.794380256e-02f, -9.309309334e-03f, +3.017025959e-03f, +6.813536977e-04f, -2.050718492e-03f, +1.859866545e-03f, -1.038408586e-03f, +2.870880641e-04f, +1.017103278e-04f, -1.716526762e-04f, +1.011481011e-04f, + +1.767174710e-04f, -2.102415937e-03f, +5.863444550e-03f, -9.619495843e-03f, +9.680391539e-03f, -2.583785807e-03f, -1.187161971e-02f, +2.883531487e-02f, -3.977301147e-02f, +3.692188351e-02f, -1.834842838e-02f, -9.820830647e-03f, +3.591627792e-02f, -4.880749640e-02f, +4.386869774e-02f, -2.512402553e-02f, +2.397190796e-03f, +1.445705859e-02f, -2.049640647e-02f, +1.703185490e-02f, -9.257770068e-03f, +2.388400552e-03f, +1.036808791e-03f, -1.415064188e-03f, + +9.400835658e-05f, -1.361144515e-04f, +1.382413722e-05f, +3.932309743e-04f, -1.048139023e-03f, +1.671192645e-03f, -1.816554846e-03f, +1.119691115e-03f, +4.165062520e-04f, -2.300810958e-03f, +3.727748556e-03f, -3.986545674e-03f, +2.869018752e-03f, -8.147094686e-04f, -1.311220361e-03f, +2.675529434e-03f, -2.889322133e-03f, +2.137044893e-03f, -9.798838764e-04f, -3.715389702e-06f, +5.038394200e-04f, -5.445102245e-04f, +3.491445827e-04f, -1.440324538e-04f, + /* 14,23 (24) */ + -5.763787749e-04f, +2.050129364e-03f, -3.537725407e-03f, +2.502564457e-03f, +4.011731615e-03f, -1.650444125e-02f, +3.002669581e-02f, -3.347054370e-02f, +1.243008261e-02f, +4.640302532e-02f, -1.586964432e-01f, +4.287546455e-01f, +7.268599150e-01f, -9.858432118e-03f, -7.351967704e-02f, +7.635259563e-02f, -4.969828311e-02f, +1.878046940e-02f, +2.532320180e-03f, -1.071709459e-02f, +9.478565238e-03f, -4.834870060e-03f, +1.132739526e-03f, +3.122507971e-04f, + -1.615685041e-05f, -4.535879398e-05f, +2.565273500e-04f, -5.978733449e-04f, +8.448431731e-04f, -5.758490567e-04f, -6.206077173e-04f, +2.780228523e-03f, -5.200031581e-03f, +6.176279091e-03f, -2.121000375e-03f, -2.637207971e-02f, +1.311706039e-02f, +1.895706771e-02f, -9.158840857e-03f, +2.622746303e-03f, +1.008506660e-03f, -2.219741452e-03f, +1.892957872e-03f, -1.000150818e-03f, +2.353084264e-04f, +1.374022283e-04f, -1.873921124e-04f, +1.051734923e-04f, + +2.707258276e-04f, -2.238530389e-03f, +5.877268688e-03f, -9.226264868e-03f, +8.632252516e-03f, -9.125931621e-04f, -1.368817456e-02f, +2.995500598e-02f, -3.935650522e-02f, +3.462107255e-02f, -1.462067983e-02f, -1.380737632e-02f, +3.878529667e-02f, -4.962220587e-02f, +4.255747738e-02f, -2.244849609e-02f, -4.921313377e-04f, +1.659410348e-02f, -2.147629035e-02f, +1.702813951e-02f, -8.753930648e-03f, +1.843890328e-03f, +1.385953374e-03f, -1.559096642e-03f, + +8.540155631e-05f, -1.141730368e-04f, -2.630954309e-05f, +4.434424702e-04f, -1.081106097e-03f, +1.646396540e-03f, -1.700715370e-03f, +9.127261488e-04f, +6.667691739e-04f, -2.509098689e-03f, +3.806830639e-03f, -3.890653830e-03f, +2.620320914e-03f, -4.960488752e-04f, -1.594445136e-03f, +2.843068118e-03f, -2.917215977e-03f, +2.057535372e-03f, -8.547912761e-04f, -1.172870872e-04f, +5.759784120e-04f, -5.747613325e-04f, +3.537550158e-04f, -1.403013936e-04f, + /* 14,24 (24) */ + -5.925356253e-04f, +2.004770570e-03f, -3.281198057e-03f, +1.904691112e-03f, +4.856574789e-03f, -1.708029030e-02f, +2.940608810e-02f, -3.069031518e-02f, +7.230051025e-03f, +5.257930441e-02f, -1.608174436e-01f, +4.023825658e-01f, +7.399769753e-01f, +9.098635588e-03f, -8.267851789e-02f, +7.897534193e-02f, -4.868977645e-02f, +1.656072795e-02f, +4.425278052e-03f, -1.171724540e-02f, +9.713873664e-03f, -4.697467831e-03f, +9.453474131e-04f, +4.174242894e-04f, + -1.035426515e-05f, -5.659415013e-05f, +2.674363103e-04f, -5.898154758e-04f, +7.898603562e-04f, -4.553619025e-04f, -7.852010034e-04f, +2.899942945e-03f, -5.113557114e-03f, +5.681550640e-03f, -1.071665851e-03f, -2.658667284e-02f, +1.169180272e-02f, +1.992771371e-02f, -8.949122217e-03f, +2.201791654e-03f, +1.337551709e-03f, -2.379031943e-03f, +1.914891610e-03f, -9.543666704e-04f, +1.803352363e-04f, +1.734827176e-04f, -2.025003003e-04f, +1.085930512e-04f, + +3.561273839e-04f, -2.352703426e-03f, +5.850959145e-03f, -8.782822398e-03f, +7.551146419e-03f, +7.338033779e-04f, -1.538888993e-02f, +3.086773213e-02f, -3.868973605e-02f, +3.211197387e-02f, -1.081384919e-02f, -1.769803015e-02f, +4.140561758e-02f, -5.011825475e-02f, +4.096303225e-02f, -1.960542797e-02f, -3.409347315e-03f, +1.865163885e-02f, -2.233108163e-02f, +1.691085242e-02f, -8.177952236e-03f, +1.269128995e-03f, +1.739708389e-03f, -1.699398035e-03f, + +7.657362257e-05f, -9.234050077e-05f, -6.490486429e-05f, +4.892773558e-04f, -1.106111916e-03f, +1.611150635e-03f, -1.575402208e-03f, +7.022269222e-04f, +9.103970605e-04f, -2.699641926e-03f, +3.860743623e-03f, -3.769527611e-03f, +2.354344383e-03f, -1.731892704e-04f, -1.868737768e-03f, +2.993213777e-03f, -2.926106845e-03f, +1.963251366e-03f, -7.218522101e-04f, -2.324118098e-04f, +6.459670054e-04f, -6.018822153e-04f, +3.559128289e-04f, -1.352011563e-04f, + /* 14,25 (24) */ + -6.028898905e-04f, +1.948176420e-03f, -3.013761747e-03f, +1.314875636e-03f, +5.646435145e-03f, -1.753565221e-02f, +2.862088709e-02f, -2.779037223e-02f, +2.116493911e-03f, +5.826085505e-02f, -1.618891094e-01f, +3.757958930e-01f, +7.516687781e-01f, +2.902634929e-02f, -9.162764011e-02f, +8.117713358e-02f, -4.735222474e-02f, +1.418169601e-02f, +6.340169661e-03f, -1.267161207e-02f, +9.894208901e-03f, -4.523985114e-03f, +7.428471128e-04f, +5.260173405e-04f, + -4.838141895e-06f, -6.689165615e-05f, +2.761484020e-04f, -5.782340276e-04f, +7.314989783e-04f, -3.352261326e-04f, -9.408834287e-04f, +2.999087130e-03f, -4.998471035e-03f, +5.167520313e-03f, -5.695342327e-05f, -2.671096324e-02f, +1.022294150e-02f, +2.085092377e-02f, -8.679452183e-03f, +1.755980721e-03f, +1.666503851e-03f, -2.527348763e-03f, +1.925240126e-03f, -9.011439452e-04f, +1.224352289e-04f, +2.097169809e-04f, -2.168402581e-04f, +1.113472756e-04f, + +4.327010065e-04f, -2.445043927e-03f, +5.786054280e-03f, -8.293545042e-03f, +6.445034503e-03f, +2.344954013e-03f, -1.696429214e-02f, +3.156995905e-02f, -3.777933898e-02f, +2.941233194e-02f, -6.953105564e-03f, -2.146755776e-02f, +4.375996197e-02f, -5.029144402e-02f, +3.909429448e-02f, -1.661221420e-02f, -6.335454160e-03f, +2.061489022e-02f, -2.305293384e-02f, +1.667844061e-02f, -7.531985230e-03f, +6.672467798e-04f, +2.095621218e-03f, -1.834599191e-03f, + +6.761550920e-05f, -7.078057912e-05f, -1.017340271e-04f, +5.305330013e-04f, -1.123160010e-03f, +1.565880356e-03f, -1.441591452e-03f, +4.896333793e-04f, +1.145836820e-03f, -2.871297113e-03f, +3.889234602e-03f, -3.624010666e-03f, +2.072836700e-03f, +1.517442280e-04f, -2.132229819e-03f, +3.124829834e-03f, -2.915736295e-03f, +1.854631957e-03f, -5.818426652e-04f, -3.483257320e-04f, +7.132589257e-04f, -6.255810230e-04f, +3.555089494e-04f, -1.287091577e-04f, + /* 14,26 (24) */ + -6.077280324e-04f, +1.881284763e-03f, -2.737613345e-03f, +7.366416088e-04f, +6.377934123e-03f, -1.787087834e-02f, +2.768000367e-02f, -2.479128510e-02f, -2.881977125e-03f, +6.342837536e-02f, -1.619460628e-01f, +3.490849297e-01f, +7.618917196e-01f, +4.987727307e-02f, -1.003070923e-01f, +8.293311430e-02f, -4.568572089e-02f, +1.165434724e-02f, +8.265409788e-03f, -1.357275602e-02f, +1.001664413e-02f, -4.314268133e-03f, +5.260068547e-04f, +6.373646162e-04f, + +3.598993315e-07f, -7.621795958e-05f, +2.826864722e-04f, -5.633186114e-04f, +6.702289988e-04f, -2.161874566e-04f, -1.086909229e-03f, +3.077546892e-03f, -4.856158506e-03f, +4.637633170e-03f, +9.194569997e-04f, -2.674550282e-02f, +8.715880075e-03f, +2.172202907e-02f, -8.349417553e-03f, +1.287322799e-03f, +1.993331364e-03f, -2.663489957e-03f, +1.923639489e-03f, -8.406217126e-04f, +6.190295822e-05f, +2.458610686e-04f, -2.302752612e-04f, +1.133793599e-04f, + +5.003165157e-04f, -2.515824506e-03f, +5.684320253e-03f, -7.763012041e-03f, +5.321874493e-03f, +3.910834368e-03f, -1.840588359e-02f, +3.205959243e-02f, -3.663350216e-02f, +2.654103483e-02f, -3.063870962e-03f, -2.509156843e-02f, +4.583279867e-02f, -5.013969979e-02f, +3.696206466e-02f, -1.348738436e-02f, -9.251190455e-03f, +2.246952217e-02f, -2.363477650e-02f, +1.633011488e-02f, -6.818726304e-03f, +4.166575678e-05f, +2.451130168e-03f, -1.963308349e-03f, + +5.861523986e-05f, -4.964864533e-05f, -1.365893649e-04f, +5.670445273e-04f, -1.132309081e-03f, +1.511072182e-03f, -1.300302629e-03f, +2.763828580e-04f, +1.371604137e-03f, -3.023054335e-03f, +3.892221410e-03f, -3.455107960e-03f, +1.777650099e-03f, +4.766065657e-04f, -2.383115619e-03f, +3.236895933e-03f, -2.885973877e-03f, +1.732219990e-03f, -4.356000735e-04f, -4.642444154e-04f, +7.773141998e-04f, -6.455828591e-04f, +3.524505644e-04f, -1.208139352e-04f, + /* 14,27 (24) */ + -6.073681330e-04f, +1.805066804e-03f, -2.454926873e-03f, +1.733229974e-04f, +7.048163122e-03f, -1.808706580e-02f, +2.659309444e-02f, -2.171373821e-02f, -7.738135630e-03f, +6.806600853e-02f, -1.610266058e-01f, +3.223394269e-01f, +7.706075996e-01f, +7.159930214e-02f, -1.086565098e-01f, +8.422043710e-02f, -4.369238952e-02f, +8.990857287e-03f, +1.018904928e-02f, -1.441337773e-02f, +1.007854709e-02f, -4.068407064e-03f, +2.957315935e-04f, +7.507439760e-04f, + +5.212494168e-06f, -8.454837357e-05f, +2.870876684e-04f, -5.452751006e-04f, +6.065260382e-04f, -9.896552842e-05f, -1.222610598e-03f, +3.135336557e-03f, -4.688132339e-03f, +4.095334701e-03f, +1.854133470e-03f, -2.669122460e-02f, +7.176195729e-03f, +2.253653250e-02f, -7.958900442e-03f, +7.980105833e-04f, +2.315967098e-03f, -2.786301303e-03f, +1.909793379e-03f, -7.729907520e-04f, -9.403973572e-07f, +2.816633266e-04f, -2.426698797e-04f, +1.146357766e-04f, + +5.589317555e-04f, -2.565473151e-03f, +5.547730888e-03f, -7.195967514e-03f, +4.189565412e-03f, +5.421906550e-03f, -1.970618622e-02f, +3.233597529e-02f, -3.526189803e-02f, +2.351798049e-02f, +8.283504485e-04f, -2.854667639e-02f, +4.761044877e-02f, -4.966309322e-02f, +3.457894904e-02f, -1.025048843e-02f, -1.213716433e-02f, +2.420174217e-02f, -2.407037658e-02f, +1.586587046e-02f, -6.041412105e-03f, -6.039171023e-04f, +2.803580732e-03f, -2.084122284e-03f, + +4.965723057e-05f, -2.909075206e-05f, -1.692843111e-04f, +5.986850604e-04f, -1.133671437e-03f, +1.447269204e-03f, -1.152591083e-03f, +6.390032318e-05f, +1.586292933e-03f, -3.154043298e-03f, +3.869792487e-03f, -3.263978705e-03f, +1.470729056e-03f, +7.992472087e-04f, -2.619664849e-03f, +3.328515775e-03f, -2.836819321e-03f, +1.596659646e-03f, -2.840184150e-04f, -5.793680015e-04f, +8.376032387e-04f, -6.616323241e-04f, +3.466623980e-04f, -1.115156796e-04f, + /* 14,28 (24) */ + -6.021556389e-04f, +1.720518430e-03f, -2.167839204e-03f, -3.719521032e-04f, +7.654689160e-03f, -1.818603132e-02f, +2.537048384e-02f, -1.857840165e-02f, -1.242626797e-02f, +7.216134324e-02f, -1.591724724e-01f, +2.956482023e-01f, +7.777837954e-01f, +9.413583464e-02f, -1.166154103e-01f, +8.501844769e-02f, -4.137642242e-02f, +6.204555983e-03f, +1.209884266e-02f, -1.518636848e-02f, +1.007760669e-02f, -3.786743738e-03f, +5.306171384e-05f, +8.653797527e-04f, + +9.696585427e-06f, -9.186672811e-05f, +2.894026873e-04f, -5.243237464e-04f, +5.408681089e-04f, +1.575000056e-05f, -1.347400030e-03f, +3.172595983e-03f, -4.496021339e-03f, +3.544052373e-03f, +2.743905104e-03f, -2.654943575e-02f, +5.609614430e-03f, +2.329013183e-02f, -7.508084114e-03f, +2.904118058e-04f, +2.632320229e-03f, -2.894684681e-03f, +1.883476665e-03f, -6.984936588e-04f, -6.574844617e-05f, +3.168659264e-04f, -2.538910417e-04f, +1.150668549e-04f, + +6.085889861e-04f, -2.594563903e-03f, +5.378446577e-03f, -6.597282453e-03f, +3.055893975e-03f, +6.869175755e-03f, -2.085877730e-02f, +3.239987561e-02f, -3.367560509e-02f, +2.036393719e-02f, +4.698142935e-03f, -3.181065509e-02f, +4.908117782e-02f, -4.886384601e-02f, +3.195928419e-02f, -6.921972656e-03f, -1.497398365e-02f, +2.579840181e-02f, -2.435439499e-02f, +1.528650246e-02f, -5.203808866e-03f, -1.265549426e-03f, +3.150243130e-03f, -2.195637964e-03f, + +4.082166865e-05f, -9.242779774e-06f, -1.996541794e-04f, +6.253657010e-04f, -1.127411078e-03f, +1.375066372e-03f, -9.995402078e-04f, -1.464112060e-04f, +1.788584202e-03f, -3.263538301e-03f, +3.822205572e-03f, -3.051928256e-03f, +1.154097198e-03f, +1.117524677e-03f, -2.840234656e-03f, +3.398924148e-03f, -2.768403831e-03f, +1.448693266e-03f, -1.280428443e-04f, -6.928866110e-04f, +8.936109333e-04f, -6.734959762e-04f, +3.380878856e-04f, -1.008266842e-04f, + /* 14,29 (24) */ + -5.924590534e-04f, +1.628651702e-03f, -1.878436517e-03f, -8.962758497e-04f, +8.195557269e-03f, -1.817028132e-02f, +2.402308381e-02f, -1.540580567e-02f, -1.692228931e-02f, +7.570539561e-02f, -1.564285673e-01f, +2.690987666e-01f, +7.833934098e-01f, +1.174259665e-01f, -1.241234944e-01f, +8.530885949e-02f, -3.874410219e-02f, +3.309871302e-03f, +1.398231932e-02f, -1.588486214e-02f, +1.001185824e-02f, -3.469877811e-03f, -2.008293278e-04f, +9.804466076e-04f, + +1.379343640e-05f, -9.816516147e-05f, +2.896949507e-04f, -5.006972502e-04f, +4.737324154e-04f, +1.273031399e-04f, -1.460772114e-03f, +3.189586889e-03f, -4.281558207e-03f, +2.987177601e-03f, +3.585873696e-03f, -2.632180873e-02f, +4.021984840e-03f, +2.397874210e-02f, -6.997457314e-03f, -2.329402775e-04f, +2.940288413e-03f, -2.987606279e-03f, +1.844538592e-03f, -6.174246080e-04f, -1.321512073e-04f, +3.512064868e-04f, -2.638091165e-04f, +1.146273481e-04f, + +6.494106547e-04f, -2.603806683e-03f, +5.178792398e-03f, -5.971916752e-03f, +1.928482897e-03f, +8.244242126e-03f, -2.185831751e-02f, +3.225346441e-02f, -3.188702089e-02f, +1.710039889e-02f, +8.520348508e-03f, -3.486258335e-02f, +5.023527502e-02f, -4.774632134e-02f, +2.911904954e-02f, -3.523048508e-03f, -1.774238748e-02f, +2.724709508e-02f, -2.448243784e-02f, +1.459361585e-02f, -4.310197933e-03f, -1.939045403e-03f, +3.488331016e-03f, -2.296464648e-03f, + +3.218395171e-05f, +9.770303819e-06f, -2.275567523e-04f, +6.470352143e-04f, -1.113741447e-03f, +1.295105441e-03f, -8.422536019e-04f, -3.531799680e-04f, +1.977254177e-03f, -3.350962203e-03f, +3.749885259e-03f, -2.820399027e-03f, +8.298436705e-04f, +1.429321052e-03f, -3.043281239e-03f, +3.447493111e-03f, -2.680990491e-03f, +1.289157457e-03f, +3.133612787e-05f, -8.039859160e-04f, +9.448407337e-04f, -6.809646889e-04f, +3.266902341e-04f, -8.877170376e-05f, + /* 14,30 (24) */ + -5.786656170e-04f, +1.530486541e-03f, -1.588741566e-03f, -1.396973100e-03f, +8.669289684e-03f, -1.804297818e-02f, +2.256231169e-02f, -1.221621878e-02f, -2.120384752e-02f, +7.869257321e-02f, -1.528426936e-01f, +2.427769578e-01f, +7.874153946e-01f, +1.414047086e-01f, -1.311209517e-01f, +8.507591921e-02f, -3.580381378e-02f, +3.222650227e-04f, +1.582685791e-02f, -1.650228675e-02f, +9.879707037e-03f, -3.118671324e-03f, -4.646384443e-04f, +1.095073956e-03f, + +1.748860713e-05f, -1.034438555e-04f, +2.880397168e-04f, -4.746388069e-04f, +4.055922468e-04f, +2.350749122e-04f, -1.562304760e-03f, +3.186688509e-03f, -4.046567084e-03f, +2.428048240e-03f, +4.377423792e-03f, -2.601037077e-02f, +2.419251706e-03f, +2.459851709e-02f, -6.427817053e-03f, -7.693575179e-04f, +3.237770263e-03f, -3.064104582e-03f, +1.792905577e-03f, -5.301287691e-04f, -1.997569424e-04f, +3.844197788e-04f, -2.722990093e-04f, +1.132769885e-04f, + +6.815946065e-04f, -2.594036379e-03f, +4.951235646e-03f, -5.324881538e-03f, +8.147414509e-04f, +9.539347567e-03f, -2.270057111e-02f, +3.190028444e-02f, -2.990976672e-02f, +1.374943669e-02f, +1.227023377e-02f, -3.768298238e-02f, +5.106511869e-02f, -4.631700029e-02f, +2.607576830e-02f, -7.555539715e-05f, -2.042337798e-02f, +2.853625253e-02f, -2.445110171e-02f, +1.378962994e-02f, -3.365357199e-03f, -2.620010092e-03f, +3.815021250e-03f, -2.385236352e-03f, + +2.381418972e-05f, +2.783507069e-05f, -2.528726818e-04f, +6.636794493e-04f, -1.092922874e-03f, +1.208069693e-03f, -6.818471861e-04f, -5.550744497e-04f, +2.151181767e-03f, -3.415889335e-03f, +3.653419413e-03f, -2.570960486e-03f, +5.001090489e-04f, +1.732556364e-03f, -3.227370804e-03f, +3.473737270e-03f, -2.574973750e-03f, +1.118978483e-03f, +1.930888630e-04f, -9.118528457e-04f, +9.908186807e-04f, -6.838558830e-04f, +3.124533545e-04f, -7.538821808e-05f, + /* 14,31 (24) */ + -5.611770099e-04f, +1.427042685e-03f, -1.300701849e-03f, -1.871611907e-03f, +9.074881931e-03f, -1.780790327e-02f, +2.100000693e-02f, -9.029530272e-03f, -2.525041460e-02f, +8.112062145e-02f, -1.484652698e-01f, +2.167665871e-01f, +7.898346463e-01f, +1.660032257e-01f, -1.375487688e-01f, +8.430656170e-02f, -3.256604352e-02f, -2.741839559e-03f, +1.761976349e-02f, -1.703241552e-02f, +9.679950095e-03f, -2.734251546e-03f, -7.369374536e-04f, +1.208350944e-03f, + +2.077189525e-05f, -1.077107189e-04f, +2.845231361e-04f, -4.464001348e-04f, +3.369139762e-04f, +3.384863843e-04f, -1.651659887e-03f, +3.164392635e-03f, -3.792950829e-03f, +1.869931669e-03f, +5.116231187e-03f, -2.561749162e-02f, +8.074287558e-04f, +2.514586977e-02f, -5.800269820e-03f, -1.316008579e-03f, +3.522678090e-03f, -3.123298077e-03f, +1.728583557e-03f, -4.370013667e-04f, -2.681541873e-04f, +4.162395040e-04f, -2.792412597e-04f, +1.109810220e-04f, + +7.054087962e-04f, -2.566201308e-03f, +4.698362964e-03f, -4.661202089e-03f, -2.781814231e-04f, +1.074741726e-02f, -2.338241830e-02f, +3.134520999e-02f, -2.775858495e-02f, +1.033354735e-02f, +1.592365318e-02f, -4.025394286e-02f, +5.156522774e-02f, -4.458444392e-02f, +2.284839749e-02f, +3.398181873e-03f, -2.299835173e-02f, +2.965523102e-02f, -2.425801284e-02f, +1.287777709e-02f, -2.374538518e-03f, -3.303865974e-03f, +4.127474604e-03f, -2.460624570e-03f, + +1.577677262e-05f, +4.485014415e-05f, -2.755057020e-04f, +6.753204994e-04f, -1.065259737e-03f, +1.114678443e-03f, -5.194413529e-04f, -7.508119949e-04f, +2.309355224e-03f, -3.458047368e-03f, +3.533554494e-03f, -2.305298307e-03f, +1.670709024e-04f, +2.025202753e-03f, -3.391189819e-03f, +3.477318114e-03f, -2.450877999e-03f, +9.391669774e-04f, +3.561531937e-04f, -1.015681388e-03f, +1.031097358e-03f, -6.820156149e-04f, +2.953826578e-04f, -6.072659436e-05f, + /* 15, 0 (24) */ + -1.202019198e-03f, +3.406678548e-03f, -6.303893631e-03f, +8.068354747e-03f, -5.607321184e-03f, -4.553512604e-03f, +2.472926036e-02f, -5.449259515e-02f, +8.986605310e-02f, -1.238918309e-01f, +1.485898543e-01f, +8.423743737e-01f, +1.485898543e-01f, -1.238918309e-01f, +8.986605310e-02f, -5.449259515e-02f, +2.472926036e-02f, -4.553512604e-03f, -5.607321184e-03f, +8.068354747e-03f, -6.303893631e-03f, +3.406678548e-03f, -1.202019198e-03f, +1.807804541e-04f, + -5.025442764e-05f, -1.614139800e-05f, +2.657761109e-04f, -7.629431710e-04f, +1.452682754e-03f, -2.084736750e-03f, +2.184131100e-03f, -1.071800091e-03f, -2.161309535e-03f, +9.191459639e-03f, -2.717107252e-02f, -9.744996581e-04f, +2.792278992e-02f, -8.649785680e-03f, +1.588115699e-03f, +1.483595605e-03f, -2.413580640e-03f, +2.171101240e-03f, -1.453164827e-03f, +7.283457605e-04f, -2.289203645e-04f, -9.017434138e-06f, +6.286057477e-05f, -3.654866787e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 1 (24) */ + -1.252273626e-03f, +3.390537150e-03f, -6.038117520e-03f, +7.305411576e-03f, -4.154638430e-03f, -6.638249354e-03f, +2.691339146e-02f, -5.556439525e-02f, +8.770474357e-02f, -1.147003713e-01f, +1.214187817e-01f, +8.413998741e-01f, +1.765126442e-01f, -1.325416166e-01f, +9.145416880e-02f, -5.300899955e-02f, +2.231567972e-02f, -2.382411364e-03f, -7.060486011e-03f, +8.796700508e-03f, -6.532813995e-03f, +3.397661114e-03f, -1.139158623e-03f, +1.442317863e-04f, + -3.788877044e-05f, -4.015434516e-05f, +2.994361041e-04f, -7.910617383e-04f, +1.441981615e-03f, -1.985994440e-03f, +1.945126099e-03f, -6.627965124e-04f, -2.704379752e-03f, +9.655187857e-03f, -2.633107346e-02f, -2.919360755e-03f, +2.858133125e-02f, -8.030843205e-03f, +9.878410953e-04f, +1.895385317e-03f, -2.631614059e-03f, +2.244151946e-03f, -1.443144605e-03f, +6.873306272e-04f, -1.890406424e-04f, -3.516703503e-05f, +7.560878485e-05f, -4.130279685e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 2 (24) */ + -1.290162396e-03f, +3.350382805e-03f, -5.738681416e-03f, +6.514349838e-03f, -2.712656815e-03f, -8.624243794e-03f, +2.885851756e-02f, -5.622719176e-02f, +8.500036382e-02f, -1.050451834e-01f, +9.508770829e-02f, +8.384805133e-01f, +2.050939754e-01f, -1.405724598e-01f, +9.244200990e-02f, -5.111361423e-02f, +1.968406566e-02f, -1.382594172e-04f, -8.503630616e-03f, +9.484031135e-03f, -6.721854638e-03f, +3.362494079e-03f, -1.063549838e-03f, +1.029289894e-04f, + -2.585564436e-05f, -6.288111760e-05f, +3.297582021e-04f, -8.126895264e-04f, +1.421410524e-03f, -1.875874720e-03f, +1.698448823e-03f, -2.592979215e-04f, -3.214552834e-03f, +1.004073855e-02f, -2.540806315e-02f, -4.851828510e-03f, +2.914220776e-02f, -7.335758955e-03f, +3.637846014e-04f, +2.304304030e-03f, -2.836406921e-03f, +2.303025716e-03f, -1.422408581e-03f, +6.400090311e-04f, -1.463379642e-04f, -6.213819845e-05f, +8.839485766e-05f, -4.597738811e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 3 (24) */ + -1.316018040e-03f, +3.287501688e-03f, -5.408923214e-03f, +5.701660312e-03f, -1.291246291e-03f, -1.050011851e-02f, +3.055696638e-02f, -5.648648968e-02f, +8.178581098e-02f, -9.500444487e-02f, +6.967964513e-02f, +8.336286848e-01f, +2.342361832e-01f, -1.479082188e-01f, +9.280579450e-02f, -4.880931020e-02f, +1.684765874e-02f, +2.164766298e-03f, -9.926039197e-03f, +1.012404017e-02f, -6.868192602e-03f, +3.300355881e-03f, -9.751549807e-04f, +5.695160131e-05f, + -1.424017073e-05f, -8.419684397e-05f, +3.566300498e-04f, -8.278624872e-04f, +1.391380270e-03f, -1.755433820e-03f, +1.445991415e-03f, +1.360836023e-04f, -3.689335954e-03f, +1.034831877e-02f, -2.440765651e-02f, -6.763711628e-03f, +2.960136401e-02f, -6.566110676e-03f, -2.805140717e-04f, +2.707437138e-03f, -3.026184777e-03f, +2.346940238e-03f, -1.390816372e-03f, +5.865429688e-04f, -1.010419546e-04f, -8.974850794e-05f, +1.011095079e-04f, -5.051825408e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 4 (24) */ + -1.330258211e-03f, +3.203304844e-03f, -5.052293164e-03f, +4.873797825e-03f, +1.001339790e-04f, -1.225555233e-02f, +3.200295779e-02f, -5.635040608e-02f, +7.809647503e-02f, -8.465612610e-02f, +4.527198863e-02f, +8.268649732e-01f, +2.638375472e-01f, -1.544743294e-01f, +9.252528043e-02f, -4.610187306e-02f, +1.382147396e-02f, +4.511706537e-03f, -1.131685557e-02f, +1.071058314e-02f, -6.969234557e-03f, +3.210607373e-03f, -8.740454728e-04f, +6.433347233e-06f, + -3.120097083e-06f, -1.039925183e-04f, +3.799689975e-04f, -8.366628414e-04f, +1.352358753e-03f, -1.625774964e-03f, +1.189641658e-03f, +5.208522228e-04f, -4.126526358e-03f, +1.057856529e-02f, -2.333577971e-02f, -8.646924785e-03f, +2.995520331e-02f, -5.723925957e-03f, -9.412914033e-04f, +3.101839406e-03f, -3.199236880e-03f, +2.375201681e-03f, -1.348303676e-03f, +5.271453987e-04f, -5.340995977e-05f, -1.178033572e-04f, +1.136391256e-04f, -5.486972474e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 5 (24) */ + -1.333378308e-03f, +3.099312325e-03f, -4.672324167e-03f, +4.037134983e-03f, +1.452492732e-03f, -1.388132730e-02f, +3.319259945e-02f, -5.582955385e-02f, +7.396994867e-02f, -7.407756081e-02f, +2.193620892e-02f, +8.182180484e-01f, +2.937927505e-01f, -1.601982554e-01f, +9.158398903e-02f, -4.300003366e-02f, +1.062223708e-02f, +6.886908217e-03f, -1.266515925e-02f, +1.123772853e-02f, -7.022644516e-03f, +3.092804016e-03f, -7.604063471e-04f, -4.843637750e-05f, + +7.434575292e-06f, -1.221753032e-04f, +3.997217905e-04f, -8.392171580e-04f, +1.304866128e-03f, -1.488039415e-03f, +9.312699668e-04f, +8.926425127e-04f, -4.524218732e-03f, +1.073253317e-02f, -2.219863564e-02f, -1.049353017e-02f, +3.020061078e-02f, -4.811678410e-03f, -1.614578835e-03f, +3.484554368e-03f, -3.353929750e-03f, +2.387211858e-03f, -1.294884725e-03f, +4.620800823e-04f, -3.725915954e-06f, -1.460971073e-04f, +1.258666049e-04f, -5.897513919e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 6 (24) */ + -1.325943733e-03f, +2.977137022e-03f, -4.272602376e-03f, +3.197917825e-03f, +2.757358860e-03f, -1.536936671e-02f, +3.412386942e-02f, -5.493691134e-02f, +6.944572994e-02f, -6.334502763e-02f, -2.624267216e-04f, +8.077245182e-01f, +3.239933613e-01f, -1.650099338e-01f, +8.996941019e-02f, -3.951547929e-02f, +7.268307330e-03f, +9.274120075e-03f, -1.396004397e-02f, +1.169980862e-02f, -7.026370432e-03f, +2.946706908e-03f, -6.345397422e-04f, -1.074115167e-04f, + +1.736188206e-05f, -1.386686913e-04f, +4.158640421e-04f, -8.356941546e-04f, +1.249469677e-03f, -1.343397461e-03f, +6.727168057e-04f, +1.249232444e-03f, -4.880810555e-03f, +1.081168200e-02f, -2.100266800e-02f, -1.229577820e-02f, +3.033497391e-02f, -3.832281179e-03f, -2.296223200e-03f, +3.852634216e-03f, -3.488720509e-03f, +2.382474880e-03f, -1.230654223e-03f, +3.916610318e-04f, +4.770102634e-05f, -1.744143749e-04f, +1.376722353e-04f, -6.277736731e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 7 (24) */ + -1.308581851e-03f, +2.838468331e-03f, -3.856738334e-03f, +2.362223671e-03f, +4.006828538e-03f, -1.671276418e-02f, +3.479658622e-02f, -5.368767890e-02f, +6.456491939e-02f, -5.253334563e-02f, -2.126509472e-02f, +7.954287400e-01f, +3.543283352e-01f, -1.688422150e-01f, +8.767318699e-02f, -3.566284507e-02f, +3.779586821e-03f, +1.165659496e-02f, -1.519069819e-02f, +1.209146965e-02f, -6.978669406e-03f, +2.772292533e-03f, -4.968675070e-04f, -1.701888840e-04f, + +2.660810510e-05f, -1.534125286e-04f, +4.283994976e-04f, -8.263022417e-04f, +1.186778480e-03f, -1.193039400e-03f, +4.157805768e-04f, +1.588555137e-03f, -5.195005431e-03f, +1.081785999e-02f, -1.975452443e-02f, -1.404614710e-02f, +3.035620045e-02f, -2.789077773e-03f, -2.981908714e-03f, +4.203160054e-03f, -3.602169867e-03f, +2.360603211e-03f, -1.155788732e-03f, +3.162515595e-04f, +1.005381200e-04f, -2.025314460e-04f, +1.489346509e-04f, -6.621935742e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 8 (24) */ + -1.281973746e-03f, +2.685055802e-03f, -3.428338836e-03f, +1.535921429e-03f, +5.193607018e-03f, -1.790580358e-02f, +3.521236680e-02f, -5.209912376e-02f, +5.936991395e-02f, -4.171548565e-02f, -4.101961916e-02f, +7.813825929e-01f, +3.846845357e-01f, -1.716312928e-01f, +8.469127828e-02f, -3.145968502e-02f, +1.774169543e-04f, +1.401719817e-02f, -1.634648693e-02f, +1.240772121e-02f, -6.878131286e-03f, +2.569761087e-03f, -3.479328561e-04f, -2.364082414e-04f, + +3.512790129e-05f, -1.663629034e-04f, +4.373591042e-04f, -8.112868384e-04f, +1.117437905e-03f, -1.038166596e-03f, +1.622060800e-04f, +1.908709318e-03f, -5.465814421e-03f, +1.075328599e-02f, -1.846101883e-02f, -1.573738130e-02f, +3.026273354e-02f, -1.685830264e-03f, -3.667180403e-03f, +4.533262407e-03f, -3.692954672e-03f, +2.321323088e-03f, -1.070547483e-03f, +2.362629239e-04f, +1.544308747e-04f, -2.302178069e-04f, +1.595318308e-04f, -6.924470590e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 9 (24) */ + -1.246845844e-03f, +2.518692899e-03f, -2.990979732e-03f, +7.246345905e-04f, +6.311044923e-03f, -1.894397017e-02f, +3.537457288e-02f, -5.019041444e-02f, +5.390409953e-02f, -3.096219965e-02f, -5.948063799e-02f, +7.656452116e-01f, +4.149472692e-01f, -1.733171230e-01f, +8.102409787e-02f, -2.692642261e-02f, -3.515537718e-03f, +1.633852125e-02f, -1.741703441e-02f, +1.264398413e-02f, -6.723700411e-03f, +2.339543281e-03f, -1.884010252e-04f, -3.056529473e-04f, + +4.288435272e-05f, -1.774919066e-04f, +4.427998967e-04f, -7.909274841e-04f, +1.042123976e-03f, -8.799826682e-04f, -8.632640165e-05f, +2.207968436e-03f, -5.692555393e-03f, +1.062052969e-02f, -1.712909309e-02f, -1.736252819e-02f, +3.005356397e-02f, -5.267048802e-04f, -4.347468851e-03f, +4.840141825e-03f, -3.759879919e-03f, +2.264479237e-03f, -9.752725974e-04f, +1.521525726e-04f, +2.090051380e-04f, -2.572377835e-04f, +1.693421431e-04f, -7.179824386e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,10 (24) */ + -1.203961492e-03f, +2.341200992e-03f, -2.548179835e-03f, -6.629289359e-05f, +7.353168899e-03f, -1.982395284e-02f, +3.528824648e-02f, -4.798244601e-02f, +4.821154414e-02f, -2.034166996e-02f, -7.660973108e-02f, +7.482826834e-01f, +4.450008332e-01f, -1.738438279e-01f, +7.667662902e-02f, -2.208628079e-02f, -7.275417637e-03f, +1.860300049e-02f, -1.839230701e-02f, +1.279613670e-02f, -6.514695273e-03f, +2.082305497e-03f, -1.905888210e-05f, -3.774511912e-04f, + +4.984894042e-05f, -1.867872693e-04f, +4.448037157e-04f, -7.655347742e-04f, +9.615376594e-04f, -7.196848669e-04f, -3.282113230e-04f, +2.484788408e-03f, -5.874850438e-03f, +1.042248995e-02f, -1.576577850e-02f, -1.891497324e-02f, +2.972823951e-02f, +6.837449566e-04f, -5.018116136e-03f, +5.121089464e-03f, -3.801890133e-03f, +2.190038851e-03f, -8.703886933e-04f, +6.442198589e-05f, +2.638693945e-04f, -2.833522783e-04f, +1.782454255e-04f, -7.382663597e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,11 (24) */ + -1.154112551e-03f, +2.154413723e-03f, -2.103376120e-03f, -8.318276678e-04f, +8.314706558e-03f, -2.054363771e-02f, +3.496003516e-02f, -4.549765760e-02f, +4.233669370e-02f, -9.919180010e-03f, -9.237550958e-02f, +7.293677102e-01f, +4.747290727e-01f, -1.731600829e-01f, +7.165851289e-02f, -1.696519132e-02f, -1.107730777e-02f, +2.079303934e-02f, -1.926269570e-02f, +1.286055869e-02f, -6.250825879e-03f, +1.798953219e-03f, +1.591865434e-04f, -4.512778272e-04f, + +5.600144477e-05f, -1.942518852e-04f, +4.434757725e-04f, -7.354471486e-04f, +8.763991151e-04f, -5.584557005e-04f, -5.619273484e-04f, +2.737813968e-03f, -6.012621400e-03f, +1.016237157e-02f, -1.437815703e-02f, -2.038847314e-02f, +2.928687114e-02f, +1.940598057e-03f, -5.674402791e-03f, +5.373507498e-03f, -3.818080014e-03f, +2.098094768e-03f, -7.564018756e-04f, -2.638587422e-05f, +3.186172715e-04f, -3.083205957e-04f, +1.861240939e-04f, -7.527898623e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,12 (24) */ + -1.098111107e-03f, +1.960161838e-03f, -1.659900347e-03f, -1.567274816e-03f, +9.191105673e-03f, -2.110209341e-02f, +3.439810781e-02f, -4.275984363e-02f, +3.632407230e-02f, +2.431915639e-04f, -1.067536666e-01f, +7.089792371e-01f, +5.040159438e-01f, -1.712194849e-01f, +6.598411010e-02f, -1.159168383e-02f, -1.489538778e-02f, +2.289113411e-02f, -2.001909758e-02f, +1.283417282e-02f, -5.932208607e-03f, +1.490632623e-03f, +3.453106372e-04f, -5.265568134e-04f, + +6.132977598e-05f, -1.999032245e-04f, +4.389430753e-04f, -7.010275597e-04f, +7.874419488e-04f, -3.974548674e-04f, -7.860460238e-04f, +2.965883599e-03f, -6.106083580e-03f, +9.843660690e-03f, -1.297332271e-02f, -2.177718689e-02f, +2.873013627e-02f, +3.238587285e-03f, -6.311575666e-03f, +5.594929228e-03f, -3.807704280e-03f, +1.988867815e-03f, -6.338980935e-04f, -1.196895001e-04f, +3.728302359e-04f, -3.319023407e-04f, +1.928642709e-04f, -7.610744498e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,13 (24) */ + -1.036781331e-03f, +1.760258613e-03f, -1.220957272e-03f, -2.268302376e-03f, +9.978547622e-03f, -2.149954827e-02f, +3.361206178e-02f, -3.979396003e-02f, +3.021798872e-02f, +1.008685225e-02f, -1.197269893e-01f, +6.872020502e-01f, +5.327460801e-01f, -1.679808976e-01f, +5.967253443e-02f, -5.996754598e-03f, -1.870309206e-02f, +2.488000193e-02f, -2.065299567e-02f, +1.271448332e-02f, -5.559378371e-03f, +1.158730282e-03f, +5.381749081e-04f, -6.026642584e-04f, + +6.582973861e-05f, -2.037726487e-04f, +4.313527363e-04f, -6.626600498e-04f, +6.954075180e-04f, -2.378115399e-04f, -9.992396061e-04f, +3.168033052e-03f, -6.155737691e-03f, +9.470098782e-03f, -1.155834333e-02f, -2.307570460e-02f, +2.805927887e-02f, +4.572123658e-03f, -6.924876495e-03f, +5.783038737e-03f, -3.770186591e-03f, +1.862708288e-03f, -5.035408677e-04f, -2.148721470e-04f, +4.260804688e-04f, -3.538593798e-04f, +1.983569237e-04f, -7.626781165e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,14 (24) */ + -9.709515919e-04f, +1.556485965e-03f, -7.896045356e-04f, -2.930962426e-03f, +1.067395514e-02f, -2.173735981e-02f, +3.261282218e-02f, -3.662592698e-02f, +2.406225103e-02f, +1.955695104e-02f, -1.312853327e-01f, +6.641263456e-01f, +5.608053590e-01f, -1.634087739e-01f, +5.274765793e-02f, -2.137158612e-04f, -2.247327865e-02f, +2.674271021e-02f, -2.115653654e-02f, +1.249961117e-02f, -5.133297903e-03f, +8.048709026e-04f, +7.365318318e-04f, -6.789320700e-04f, + +6.950473468e-05f, -2.059046353e-04f, +4.208701729e-04f, -6.207462663e-04f, +6.010393240e-04f, -8.061705216e-05f, -1.200288012e-03f, +3.343497455e-03f, -6.162360143e-03f, +9.045655680e-03f, -1.014022270e-02f, -2.427907375e-02f, +2.727610634e-02f, +5.935322607e-03f, -7.509571034e-03f, +5.935689959e-03f, -3.705127503e-03f, +1.720096526e-03f, -3.660683860e-04f, -3.112854986e-04f, +4.779338980e-04f, -3.739578488e-04f, +2.024990033e-04f, -7.572012713e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,15 (24) */ + -9.014468573e-04f, +1.350581329e-03f, -3.687343626e-04f, -3.551708692e-03f, +1.127499446e-02f, -2.181797687e-02f, +3.141253417e-02f, -3.328242953e-02f, +1.789989089e-02f, +2.860260672e-02f, -1.414255554e-01f, +6.398472718e-01f, +5.880814653e-01f, -1.574734513e-01f, +4.523808690e-02f, +5.721974098e-03f, -2.617840616e-02f, +2.846280674e-02f, -2.152260492e-02f, +1.218832567e-02f, -4.655364005e-03f, +4.309130538e-04f, +9.390308351e-04f, -7.546521972e-04f, + +7.236541015e-05f, -2.063559209e-04f, +4.076772234e-04f, -5.757019422e-04f, +5.050775346e-04f, +7.308196697e-05f, -1.388084859e-03f, +3.491712014e-03f, -6.126991762e-03f, +8.574501617e-03f, -8.725863701e-03f, -2.538282306e-02f, +2.638298346e-02f, +7.322032278e-03f, -8.060978567e-03f, +6.050925029e-03f, -3.612311354e-03f, +1.561642568e-03f, -2.222899766e-04f, -4.082536713e-04f, +5.279533703e-04f, -3.919701930e-04f, +2.051945734e-04f, -7.442924996e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,16 (24) */ + -8.290814471e-04f, +1.144225408e-03f, +3.894286075e-05f, -4.127410634e-03f, +1.178007200e-02f, -2.174489490e-02f, +3.002444931e-02f, -2.979071751e-02f, +1.177289913e-02f, +3.717710833e-02f, -1.501514191e-01f, +6.144644488e-01f, +6.144644488e-01f, -1.501514191e-01f, +3.717710833e-02f, +1.177289913e-02f, -2.979071751e-02f, +3.002444931e-02f, -2.174489490e-02f, +1.178007200e-02f, -4.127410634e-03f, +3.894286075e-05f, +1.144225408e-03f, -8.290814471e-04f, + +7.442924996e-05f, -2.051945734e-04f, +3.919701930e-04f, -5.279533703e-04f, +4.082536713e-04f, +2.222899766e-04f, -1.561642568e-03f, +3.612311354e-03f, -6.050925029e-03f, +8.060978567e-03f, -7.322032278e-03f, -2.638298346e-02f, +2.538282306e-02f, +8.725863701e-03f, -8.574501617e-03f, +6.126991762e-03f, -3.491712014e-03f, +1.388084859e-03f, -7.308196697e-05f, -5.050775346e-04f, +5.757019422e-04f, -4.076772234e-04f, +2.063559209e-04f, -7.236541015e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,17 (24) */ + -7.546521972e-04f, +9.390308351e-04f, +4.309130538e-04f, -4.655364005e-03f, +1.218832567e-02f, -2.152260492e-02f, +2.846280674e-02f, -2.617840616e-02f, +5.721974098e-03f, +4.523808690e-02f, -1.574734513e-01f, +5.880814653e-01f, +6.398472718e-01f, -1.414255554e-01f, +2.860260672e-02f, +1.789989089e-02f, -3.328242953e-02f, +3.141253417e-02f, -2.181797687e-02f, +1.127499446e-02f, -3.551708692e-03f, -3.687343626e-04f, +1.350581329e-03f, -9.014468573e-04f, + +7.572012713e-05f, -2.024990033e-04f, +3.739578488e-04f, -4.779338980e-04f, +3.112854986e-04f, +3.660683860e-04f, -1.720096526e-03f, +3.705127503e-03f, -5.935689959e-03f, +7.509571034e-03f, -5.935322607e-03f, -2.727610634e-02f, +2.427907375e-02f, +1.014022270e-02f, -9.045655680e-03f, +6.162360143e-03f, -3.343497455e-03f, +1.200288012e-03f, +8.061705216e-05f, -6.010393240e-04f, +6.207462663e-04f, -4.208701729e-04f, +2.059046353e-04f, -6.950473468e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,18 (24) */ + -6.789320700e-04f, +7.365318318e-04f, +8.048709026e-04f, -5.133297903e-03f, +1.249961117e-02f, -2.115653654e-02f, +2.674271021e-02f, -2.247327865e-02f, -2.137158612e-04f, +5.274765793e-02f, -1.634087739e-01f, +5.608053590e-01f, +6.641263456e-01f, -1.312853327e-01f, +1.955695104e-02f, +2.406225103e-02f, -3.662592698e-02f, +3.261282218e-02f, -2.173735981e-02f, +1.067395514e-02f, -2.930962426e-03f, -7.896045356e-04f, +1.556485965e-03f, -9.709515919e-04f, + +7.626781165e-05f, -1.983569237e-04f, +3.538593798e-04f, -4.260804688e-04f, +2.148721470e-04f, +5.035408677e-04f, -1.862708288e-03f, +3.770186591e-03f, -5.783038737e-03f, +6.924876495e-03f, -4.572123658e-03f, -2.805927887e-02f, +2.307570460e-02f, +1.155834333e-02f, -9.470098782e-03f, +6.155737691e-03f, -3.168033052e-03f, +9.992396061e-04f, +2.378115399e-04f, -6.954075180e-04f, +6.626600498e-04f, -4.313527363e-04f, +2.037726487e-04f, -6.582973861e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,19 (24) */ + -6.026642584e-04f, +5.381749081e-04f, +1.158730282e-03f, -5.559378371e-03f, +1.271448332e-02f, -2.065299567e-02f, +2.488000193e-02f, -1.870309206e-02f, -5.996754598e-03f, +5.967253443e-02f, -1.679808976e-01f, +5.327460801e-01f, +6.872020502e-01f, -1.197269893e-01f, +1.008685225e-02f, +3.021798872e-02f, -3.979396003e-02f, +3.361206178e-02f, -2.149954827e-02f, +9.978547622e-03f, -2.268302376e-03f, -1.220957272e-03f, +1.760258613e-03f, -1.036781331e-03f, + +7.610744498e-05f, -1.928642709e-04f, +3.319023407e-04f, -3.728302359e-04f, +1.196895001e-04f, +6.338980935e-04f, -1.988867815e-03f, +3.807704280e-03f, -5.594929228e-03f, +6.311575666e-03f, -3.238587285e-03f, -2.873013627e-02f, +2.177718689e-02f, +1.297332271e-02f, -9.843660690e-03f, +6.106083580e-03f, -2.965883599e-03f, +7.860460238e-04f, +3.974548674e-04f, -7.874419488e-04f, +7.010275597e-04f, -4.389430753e-04f, +1.999032245e-04f, -6.132977598e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,20 (24) */ + -5.265568134e-04f, +3.453106372e-04f, +1.490632623e-03f, -5.932208607e-03f, +1.283417282e-02f, -2.001909758e-02f, +2.289113411e-02f, -1.489538778e-02f, -1.159168383e-02f, +6.598411010e-02f, -1.712194849e-01f, +5.040159438e-01f, +7.089792371e-01f, -1.067536666e-01f, +2.431915639e-04f, +3.632407230e-02f, -4.275984363e-02f, +3.439810781e-02f, -2.110209341e-02f, +9.191105673e-03f, -1.567274816e-03f, -1.659900347e-03f, +1.960161838e-03f, -1.098111107e-03f, + +7.527898623e-05f, -1.861240939e-04f, +3.083205957e-04f, -3.186172715e-04f, +2.638587422e-05f, +7.564018756e-04f, -2.098094768e-03f, +3.818080014e-03f, -5.373507498e-03f, +5.674402791e-03f, -1.940598057e-03f, -2.928687114e-02f, +2.038847314e-02f, +1.437815703e-02f, -1.016237157e-02f, +6.012621400e-03f, -2.737813968e-03f, +5.619273484e-04f, +5.584557005e-04f, -8.763991151e-04f, +7.354471486e-04f, -4.434757725e-04f, +1.942518852e-04f, -5.600144477e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,21 (24) */ + -4.512778272e-04f, +1.591865434e-04f, +1.798953219e-03f, -6.250825879e-03f, +1.286055869e-02f, -1.926269570e-02f, +2.079303934e-02f, -1.107730777e-02f, -1.696519132e-02f, +7.165851289e-02f, -1.731600829e-01f, +4.747290727e-01f, +7.293677102e-01f, -9.237550958e-02f, -9.919180010e-03f, +4.233669370e-02f, -4.549765760e-02f, +3.496003516e-02f, -2.054363771e-02f, +8.314706558e-03f, -8.318276678e-04f, -2.103376120e-03f, +2.154413723e-03f, -1.154112551e-03f, + +7.382663597e-05f, -1.782454255e-04f, +2.833522783e-04f, -2.638693945e-04f, -6.442198589e-05f, +8.703886933e-04f, -2.190038851e-03f, +3.801890133e-03f, -5.121089464e-03f, +5.018116136e-03f, -6.837449566e-04f, -2.972823951e-02f, +1.891497324e-02f, +1.576577850e-02f, -1.042248995e-02f, +5.874850438e-03f, -2.484788408e-03f, +3.282113230e-04f, +7.196848669e-04f, -9.615376594e-04f, +7.655347742e-04f, -4.448037157e-04f, +1.867872693e-04f, -4.984894042e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,22 (24) */ + -3.774511912e-04f, -1.905888210e-05f, +2.082305497e-03f, -6.514695273e-03f, +1.279613670e-02f, -1.839230701e-02f, +1.860300049e-02f, -7.275417637e-03f, -2.208628079e-02f, +7.667662902e-02f, -1.738438279e-01f, +4.450008332e-01f, +7.482826834e-01f, -7.660973108e-02f, -2.034166996e-02f, +4.821154414e-02f, -4.798244601e-02f, +3.528824648e-02f, -1.982395284e-02f, +7.353168899e-03f, -6.629289359e-05f, -2.548179835e-03f, +2.341200992e-03f, -1.203961492e-03f, + +7.179824386e-05f, -1.693421431e-04f, +2.572377835e-04f, -2.090051380e-04f, -1.521525726e-04f, +9.752725974e-04f, -2.264479237e-03f, +3.759879919e-03f, -4.840141825e-03f, +4.347468851e-03f, +5.267048802e-04f, -3.005356397e-02f, +1.736252819e-02f, +1.712909309e-02f, -1.062052969e-02f, +5.692555393e-03f, -2.207968436e-03f, +8.632640165e-05f, +8.799826682e-04f, -1.042123976e-03f, +7.909274841e-04f, -4.427998967e-04f, +1.774919066e-04f, -4.288435272e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,23 (24) */ + -3.056529473e-04f, -1.884010252e-04f, +2.339543281e-03f, -6.723700411e-03f, +1.264398413e-02f, -1.741703441e-02f, +1.633852125e-02f, -3.515537718e-03f, -2.692642261e-02f, +8.102409787e-02f, -1.733171230e-01f, +4.149472692e-01f, +7.656452116e-01f, -5.948063799e-02f, -3.096219965e-02f, +5.390409953e-02f, -5.019041444e-02f, +3.537457288e-02f, -1.894397017e-02f, +6.311044923e-03f, +7.246345905e-04f, -2.990979732e-03f, +2.518692899e-03f, -1.246845844e-03f, + +6.924470590e-05f, -1.595318308e-04f, +2.302178069e-04f, -1.544308747e-04f, -2.362629239e-04f, +1.070547483e-03f, -2.321323088e-03f, +3.692954672e-03f, -4.533262407e-03f, +3.667180403e-03f, +1.685830264e-03f, -3.026273354e-02f, +1.573738130e-02f, +1.846101883e-02f, -1.075328599e-02f, +5.465814421e-03f, -1.908709318e-03f, -1.622060800e-04f, +1.038166596e-03f, -1.117437905e-03f, +8.112868384e-04f, -4.373591042e-04f, +1.663629034e-04f, -3.512790129e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,24 (24) */ + -2.364082414e-04f, -3.479328561e-04f, +2.569761087e-03f, -6.878131286e-03f, +1.240772121e-02f, -1.634648693e-02f, +1.401719817e-02f, +1.774169543e-04f, -3.145968502e-02f, +8.469127828e-02f, -1.716312928e-01f, +3.846845357e-01f, +7.813825929e-01f, -4.101961916e-02f, -4.171548565e-02f, +5.936991395e-02f, -5.209912376e-02f, +3.521236680e-02f, -1.790580358e-02f, +5.193607018e-03f, +1.535921429e-03f, -3.428338836e-03f, +2.685055802e-03f, -1.281973746e-03f, + +6.621935742e-05f, -1.489346509e-04f, +2.025314460e-04f, -1.005381200e-04f, -3.162515595e-04f, +1.155788732e-03f, -2.360603211e-03f, +3.602169867e-03f, -4.203160054e-03f, +2.981908714e-03f, +2.789077773e-03f, -3.035620045e-02f, +1.404614710e-02f, +1.975452443e-02f, -1.081785999e-02f, +5.195005431e-03f, -1.588555137e-03f, -4.157805768e-04f, +1.193039400e-03f, -1.186778480e-03f, +8.263022417e-04f, -4.283994976e-04f, +1.534125286e-04f, -2.660810510e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,25 (24) */ + -1.701888840e-04f, -4.968675070e-04f, +2.772292533e-03f, -6.978669406e-03f, +1.209146965e-02f, -1.519069819e-02f, +1.165659496e-02f, +3.779586821e-03f, -3.566284507e-02f, +8.767318699e-02f, -1.688422150e-01f, +3.543283352e-01f, +7.954287400e-01f, -2.126509472e-02f, -5.253334563e-02f, +6.456491939e-02f, -5.368767890e-02f, +3.479658622e-02f, -1.671276418e-02f, +4.006828538e-03f, +2.362223671e-03f, -3.856738334e-03f, +2.838468331e-03f, -1.308581851e-03f, + +6.277736731e-05f, -1.376722353e-04f, +1.744143749e-04f, -4.770102634e-05f, -3.916610318e-04f, +1.230654223e-03f, -2.382474880e-03f, +3.488720509e-03f, -3.852634216e-03f, +2.296223200e-03f, +3.832281179e-03f, -3.033497391e-02f, +1.229577820e-02f, +2.100266800e-02f, -1.081168200e-02f, +4.880810555e-03f, -1.249232444e-03f, -6.727168057e-04f, +1.343397461e-03f, -1.249469677e-03f, +8.356941546e-04f, -4.158640421e-04f, +1.386686913e-04f, -1.736188206e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,26 (24) */ + -1.074115167e-04f, -6.345397422e-04f, +2.946706908e-03f, -7.026370432e-03f, +1.169980862e-02f, -1.396004397e-02f, +9.274120075e-03f, +7.268307330e-03f, -3.951547929e-02f, +8.996941019e-02f, -1.650099338e-01f, +3.239933613e-01f, +8.077245182e-01f, -2.624267216e-04f, -6.334502763e-02f, +6.944572994e-02f, -5.493691134e-02f, +3.412386942e-02f, -1.536936671e-02f, +2.757358860e-03f, +3.197917825e-03f, -4.272602376e-03f, +2.977137022e-03f, -1.325943733e-03f, + +5.897513919e-05f, -1.258666049e-04f, +1.460971073e-04f, +3.725915954e-06f, -4.620800823e-04f, +1.294884725e-03f, -2.387211858e-03f, +3.353929750e-03f, -3.484554368e-03f, +1.614578835e-03f, +4.811678410e-03f, -3.020061078e-02f, +1.049353017e-02f, +2.219863564e-02f, -1.073253317e-02f, +4.524218732e-03f, -8.926425127e-04f, -9.312699668e-04f, +1.488039415e-03f, -1.304866128e-03f, +8.392171580e-04f, -3.997217905e-04f, +1.221753032e-04f, -7.434575292e-06f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,27 (24) */ + -4.843637750e-05f, -7.604063471e-04f, +3.092804016e-03f, -7.022644516e-03f, +1.123772853e-02f, -1.266515925e-02f, +6.886908217e-03f, +1.062223708e-02f, -4.300003366e-02f, +9.158398903e-02f, -1.601982554e-01f, +2.937927505e-01f, +8.182180484e-01f, +2.193620892e-02f, -7.407756081e-02f, +7.396994867e-02f, -5.582955385e-02f, +3.319259945e-02f, -1.388132730e-02f, +1.452492732e-03f, +4.037134983e-03f, -4.672324167e-03f, +3.099312325e-03f, -1.333378308e-03f, + +5.486972474e-05f, -1.136391256e-04f, +1.178033572e-04f, +5.340995977e-05f, -5.271453987e-04f, +1.348303676e-03f, -2.375201681e-03f, +3.199236880e-03f, -3.101839406e-03f, +9.412914033e-04f, +5.723925957e-03f, -2.995520331e-02f, +8.646924785e-03f, +2.333577971e-02f, -1.057856529e-02f, +4.126526358e-03f, -5.208522228e-04f, -1.189641658e-03f, +1.625774964e-03f, -1.352358753e-03f, +8.366628414e-04f, -3.799689975e-04f, +1.039925183e-04f, +3.120097083e-06f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,28 (24) */ + +6.433347233e-06f, -8.740454728e-04f, +3.210607373e-03f, -6.969234557e-03f, +1.071058314e-02f, -1.131685557e-02f, +4.511706537e-03f, +1.382147396e-02f, -4.610187306e-02f, +9.252528043e-02f, -1.544743294e-01f, +2.638375472e-01f, +8.268649732e-01f, +4.527198863e-02f, -8.465612610e-02f, +7.809647503e-02f, -5.635040608e-02f, +3.200295779e-02f, -1.225555233e-02f, +1.001339790e-04f, +4.873797825e-03f, -5.052293164e-03f, +3.203304844e-03f, -1.330258211e-03f, + +5.051825408e-05f, -1.011095079e-04f, +8.974850794e-05f, +1.010419546e-04f, -5.865429688e-04f, +1.390816372e-03f, -2.346940238e-03f, +3.026184777e-03f, -2.707437138e-03f, +2.805140717e-04f, +6.566110676e-03f, -2.960136401e-02f, +6.763711628e-03f, +2.440765651e-02f, -1.034831877e-02f, +3.689335954e-03f, -1.360836023e-04f, -1.445991415e-03f, +1.755433820e-03f, -1.391380270e-03f, +8.278624872e-04f, -3.566300498e-04f, +8.419684397e-05f, +1.424017073e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,29 (24) */ + +5.695160131e-05f, -9.751549807e-04f, +3.300355881e-03f, -6.868192602e-03f, +1.012404017e-02f, -9.926039197e-03f, +2.164766298e-03f, +1.684765874e-02f, -4.880931020e-02f, +9.280579450e-02f, -1.479082188e-01f, +2.342361832e-01f, +8.336286848e-01f, +6.967964513e-02f, -9.500444487e-02f, +8.178581098e-02f, -5.648648968e-02f, +3.055696638e-02f, -1.050011851e-02f, -1.291246291e-03f, +5.701660312e-03f, -5.408923214e-03f, +3.287501688e-03f, -1.316018040e-03f, + +4.597738811e-05f, -8.839485766e-05f, +6.213819845e-05f, +1.463379642e-04f, -6.400090311e-04f, +1.422408581e-03f, -2.303025716e-03f, +2.836406921e-03f, -2.304304030e-03f, -3.637846014e-04f, +7.335758955e-03f, -2.914220776e-02f, +4.851828510e-03f, +2.540806315e-02f, -1.004073855e-02f, +3.214552834e-03f, +2.592979215e-04f, -1.698448823e-03f, +1.875874720e-03f, -1.421410524e-03f, +8.126895264e-04f, -3.297582021e-04f, +6.288111760e-05f, +2.585564436e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,30 (24) */ + +1.029289894e-04f, -1.063549838e-03f, +3.362494079e-03f, -6.721854638e-03f, +9.484031135e-03f, -8.503630616e-03f, -1.382594172e-04f, +1.968406566e-02f, -5.111361423e-02f, +9.244200990e-02f, -1.405724598e-01f, +2.050939754e-01f, +8.384805133e-01f, +9.508770829e-02f, -1.050451834e-01f, +8.500036382e-02f, -5.622719176e-02f, +2.885851756e-02f, -8.624243794e-03f, -2.712656815e-03f, +6.514349838e-03f, -5.738681416e-03f, +3.350382805e-03f, -1.290162396e-03f, + +4.130279685e-05f, -7.560878485e-05f, +3.516703503e-05f, +1.890406424e-04f, -6.873306272e-04f, +1.443144605e-03f, -2.244151946e-03f, +2.631614059e-03f, -1.895385317e-03f, -9.878410953e-04f, +8.030843205e-03f, -2.858133125e-02f, +2.919360755e-03f, +2.633107346e-02f, -9.655187857e-03f, +2.704379752e-03f, +6.627965124e-04f, -1.945126099e-03f, +1.985994440e-03f, -1.441981615e-03f, +7.910617383e-04f, -2.994361041e-04f, +4.015434516e-05f, +3.788877044e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,31 (24) */ + +1.442317863e-04f, -1.139158623e-03f, +3.397661114e-03f, -6.532813995e-03f, +8.796700508e-03f, -7.060486011e-03f, -2.382411364e-03f, +2.231567972e-02f, -5.300899955e-02f, +9.145416880e-02f, -1.325416166e-01f, +1.765126442e-01f, +8.413998741e-01f, +1.214187817e-01f, -1.147003713e-01f, +8.770474357e-02f, -5.556439525e-02f, +2.691339146e-02f, -6.638249354e-03f, -4.154638430e-03f, +7.305411576e-03f, -6.038117520e-03f, +3.390537150e-03f, -1.252273626e-03f, + +3.654866787e-05f, -6.286057477e-05f, +9.017434138e-06f, +2.289203645e-04f, -7.283457605e-04f, +1.453164827e-03f, -2.171101240e-03f, +2.413580640e-03f, -1.483595605e-03f, -1.588115699e-03f, +8.649785680e-03f, -2.792278992e-02f, +9.744996581e-04f, +2.717107252e-02f, -9.191459639e-03f, +2.161309535e-03f, +1.071800091e-03f, -2.184131100e-03f, +2.084736750e-03f, -1.452682754e-03f, +7.629431710e-04f, -2.657761109e-04f, +1.614139800e-05f, +5.025442764e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +}; +constexpr BSincTable bsinc24 = { /* scaleBase */ 7.881281313e-02f, /* scaleRange */ 1.085555698e+00f, - /* m */ { 48, 48, 48, 48, 48, 48, 48, 48, 44, 40, 36, 32, 28, 28, 24, 24 }, - /* filterOffset */ { 0, 3072, 6144, 9216, 12288, 15360, 18432, 21504, 24576, 27392, 29952, 32256, 34304, 36096, 37888, 39424 }, - - /* Tab (40960 entries) */ { - /* 0, 0 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.436875469e-05f, +1.561612709e-05f, +1.417141484e-05f, +8.846225192e-06f, -1.492899882e-06f, -1.777981991e-05f, -4.059923501e-05f, -7.004937168e-05f, -1.056348136e-04f, -1.462059716e-04f, -1.899581021e-04f, -2.344972762e-04f, -2.769737986e-04f, -3.142760250e-04f, -3.432701935e-04f, -3.610656819e-04f, -3.652808343e-04f, -3.542827868e-04f, -3.273758978e-04f, -2.849174469e-04f, -2.283458597e-04f, -1.601151740e-04f, -8.353887009e-05f, -2.555508337e-06f, +7.856322346e-05f, +1.555353731e-04f, +2.243925418e-04f, +2.817745994e-04f, +3.251683254e-04f, +3.530689224e-04f, +3.650514058e-04f, +3.617481497e-04f, +3.447383033e-04f, +3.163633379e-04f, +2.794897176e-04f, +2.372439164e-04f, +1.927463657e-04f, +1.488693749e-04f, +1.080399453e-04f, +7.210228972e-05f, +4.224758644e-05f, +1.901092689e-05f, +2.328453823e-06f, -8.357927672e-06f, -1.396459906e-05f, -1.561691254e-05f, -1.450376051e-05f, -1.175075544e-05f, - /* 0, 1 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.422765568e-05f, +1.560484981e-05f, +1.436305556e-05f, +9.314872538e-06f, -6.806932534e-07f, -1.657438954e-05f, -3.897697936e-05f, -6.802063440e-05f, -1.032493727e-04f, -1.435551879e-04f, -1.871730634e-04f, -2.317426657e-04f, -2.744376758e-04f, -3.121561799e-04f, -3.417581727e-04f, -3.603299209e-04f, -3.654505292e-04f, -3.554341621e-04f, -3.295223672e-04f, -2.880048316e-04f, -2.322533521e-04f, -1.646621696e-04f, -8.849719227e-05f, -7.665992852e-06f, +7.357127629e-05f, +1.509236733e-04f, +2.203941213e-04f, +2.785767791e-04f, +3.228998788e-04f, +3.517925311e-04f, +3.647619571e-04f, +3.623768266e-04f, +3.461618466e-04f, +3.184173686e-04f, +2.819846545e-04f, +2.399818431e-04f, +1.955372004e-04f, +1.515448748e-04f, +1.104644002e-04f, +7.417918467e-05f, +4.392198589e-05f, +2.026779777e-05f, +3.187546744e-06f, -7.849719961e-06f, -1.374231680e-05f, -1.560691722e-05f, -1.463241434e-05f, -1.195157556e-05f, - /* 0, 2 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.408071968e-05f, +1.558336850e-05f, +1.453981342e-05f, +9.764132757e-06f, +1.083630892e-07f, -1.539454099e-05f, -3.738085809e-05f, -6.601627161e-05f, -1.008839801e-04f, -1.409175379e-04f, -1.843918961e-04f, -2.289808241e-04f, -2.718821271e-04f, -3.100045565e-04f, -3.402029042e-04f, -3.595413759e-04f, -3.655607915e-04f, -3.565231022e-04f, -3.316075217e-04f, -2.910362794e-04f, -2.361143096e-04f, -1.691754631e-04f, -9.343717126e-05f, -1.277488105e-05f, +6.856405736e-05f, +1.462809907e-04f, +2.163513340e-04f, +2.753244915e-04f, +3.205708032e-04f, +3.504535917e-04f, +3.644122164e-04f, +3.629512268e-04f, +3.475401762e-04f, +3.204373710e-04f, +2.844578309e-04f, +2.427103092e-04f, +1.983299454e-04f, +1.542319388e-04f, +1.129078005e-04f, +7.627984250e-05f, +4.562237634e-05f, +2.155051224e-05f, +4.070364810e-06f, -7.321345221e-06f, -1.350427756e-05f, -1.558585112e-05f, -1.475445480e-05f, -1.214962021e-05f, - /* 0, 3 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.392820018e-05f, +1.555196970e-05f, +1.470198130e-05f, +1.019427178e-05f, +8.744713867e-07f, -1.424017206e-05f, -3.581090067e-05f, -6.403646691e-05f, -9.853898309e-05f, -1.382935265e-04f, -1.816152396e-04f, -2.262124861e-04f, -2.693079297e-04f, -3.078219119e-04f, -3.386050587e-04f, -3.587005674e-04f, -3.656119364e-04f, -3.575496773e-04f, -3.336311662e-04f, -2.940113321e-04f, -2.399280361e-04f, -1.736541678e-04f, -9.835779378e-05f, -1.788110924e-05f, +6.354259999e-05f, +1.416082500e-04f, +2.122649289e-04f, +2.720182574e-04f, +3.181813609e-04f, +3.490520992e-04f, +3.640019265e-04f, +3.634708763e-04f, +3.488726530e-04f, +3.224226032e-04f, +2.869084686e-04f, +2.454285640e-04f, +2.011239334e-04f, +1.569300258e-04f, +1.153697583e-04f, +7.840403901e-05f, +4.734869143e-05f, +2.285914223e-05f, +4.977088548e-06f, -6.772549939e-06f, -1.325019189e-05f, -1.555342333e-05f, -1.486961808e-05f, -1.234467317e-05f, - /* 0, 4 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.377034793e-05f, +1.551093858e-05f, +1.484985257e-05f, +1.060555829e-05f, +1.617838952e-06f, -1.311117335e-05f, -3.426712759e-05f, -6.208139387e-05f, -9.621471868e-05f, -1.356836490e-04f, -1.788437260e-04f, -2.234383818e-04f, -2.667158598e-04f, -3.056090065e-04f, -3.369653145e-04f, -3.578080270e-04f, -3.656042935e-04f, -3.585139737e-04f, -3.355931220e-04f, -2.969295472e-04f, -2.436938494e-04f, -1.780974071e-04f, -1.032580523e-04f, -2.298361455e-05f, +5.850794175e-05f, +1.369063854e-04f, +2.081356675e-04f, +2.686586134e-04f, +3.157318305e-04f, +3.475880652e-04f, +3.635308455e-04f, +3.639353135e-04f, +3.501586466e-04f, +3.243723279e-04f, +2.893357895e-04f, +2.481358533e-04f, +2.039184901e-04f, +1.596385855e-04f, +1.178498758e-04f, +8.055153976e-05f, +4.910085537e-05f, +2.419375182e-05f, +5.907892698e-06f, -6.203084070e-06f, -1.297977154e-05f, -1.550934211e-05f, -1.497763796e-05f, -1.253651480e-05f, - /* 0, 5 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.360741082e-05f, +1.546055886e-05f, +1.498372103e-05f, +1.099826356e-05f, +2.338678028e-06f, -1.200742830e-05f, -3.274955044e-05f, -6.015121602e-05f, -9.391151370e-05f, -1.330883916e-04f, -1.760779795e-04f, -2.206592368e-04f, -2.641066927e-04f, -3.033666037e-04f, -3.352843568e-04f, -3.568642973e-04f, -3.655382063e-04f, -3.594160939e-04f, -3.374932277e-04f, -2.997904985e-04f, -2.474110810e-04f, -1.825043147e-04f, -1.081369454e-04f, -2.808133519e-05f, +5.346112415e-05f, +1.321763393e-04f, +2.039643239e-04f, +2.652461110e-04f, +3.132225075e-04f, +3.460615178e-04f, +3.629987460e-04f, +3.643440891e-04f, +3.513975353e-04f, +3.262858124e-04f, +2.917390162e-04f, +2.508314194e-04f, +2.067129352e-04f, +1.623570592e-04f, +1.203477449e-04f, +8.272210008e-05f, +5.087878289e-05f, +2.555439710e-05f, +6.862946083e-06f, -5.612701183e-06f, -1.269272958e-05f, -1.545331501e-05f, -1.507824593e-05f, -1.272492213e-05f, - /* 0, 6 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.343963384e-05f, +1.540111268e-05f, +1.510388072e-05f, +1.137266132e-05f, +3.037205637e-06f, -1.092881336e-05f, -3.125817198e-05f, -5.824608692e-05f, -9.162968470e-05f, -1.305082307e-04f, -1.733186168e-04f, -2.178757715e-04f, -2.614812022e-04f, -3.010954694e-04f, -3.335628777e-04f, -3.558699317e-04f, -3.654140322e-04f, -3.602561561e-04f, -3.393313383e-04f, -3.025937756e-04f, -2.510790765e-04f, -1.868740351e-04f, -1.129934779e-04f, -3.317321082e-05f, +4.840319232e-05f, +1.274190627e-04f, +1.997516844e-04f, +2.617813169e-04f, +3.106537038e-04f, +3.444725018e-04f, +3.624054162e-04f, +3.646967662e-04f, +3.525887067e-04f, +3.281623292e-04f, +2.941173722e-04f, +2.535145019e-04f, +2.095065816e-04f, +1.650848794e-04f, +1.228629477e-04f, +8.491546506e-05f, +5.268237913e-05f, +2.694112611e-05f, +7.842411460e-06f, -5.001158613e-06f, -1.238878055e-05f, -1.538504899e-05f, -1.517117127e-05f, -1.290966885e-05f, - /* 0, 7 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.326725904e-05f, +1.533288052e-05f, +1.521062582e-05f, +1.172902759e-05f, +3.713643442e-06f, -9.875198106e-06f, -2.979298624e-05f, -5.636615021e-05f, -8.936953796e-05f, -1.279436332e-04f, -1.705662467e-04f, -2.150887015e-04f, -2.588401603e-04f, -2.987963721e-04f, -3.318015757e-04f, -3.548254937e-04f, -3.652321423e-04f, -3.610342947e-04f, -3.411073257e-04f, -3.053389846e-04f, -2.546971958e-04f, -1.912057239e-04f, -1.178266614e-04f, -3.825818285e-05f, +4.333519473e-05f, +1.226355145e-04f, +1.954985477e-04f, +2.582648130e-04f, +3.080257478e-04f, +3.428210784e-04f, +3.617506595e-04f, +3.649929210e-04f, +3.537315574e-04f, +3.300011559e-04f, +2.964700822e-04f, +2.561843375e-04f, +2.122987367e-04f, +1.678214700e-04f, +1.253950564e-04f, +8.713136950e-05f, +5.451153963e-05f, +2.835397865e-05f, +8.846445392e-06f, -4.368217600e-06f, -1.206764059e-05f, -1.530425055e-05f, -1.525614110e-05f, -1.309052541e-05f, - /* 0, 8 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.309052541e-05f, +1.525614110e-05f, +1.530425055e-05f, +1.206764059e-05f, +4.368217600e-06f, -8.846445392e-06f, -2.835397865e-05f, -5.451153963e-05f, -8.713136950e-05f, -1.253950564e-04f, -1.678214700e-04f, -2.122987367e-04f, -2.561843375e-04f, -2.964700822e-04f, -3.300011559e-04f, -3.537315574e-04f, -3.649929210e-04f, -3.617506595e-04f, -3.428210784e-04f, -3.080257478e-04f, -2.582648130e-04f, -1.954985477e-04f, -1.226355145e-04f, -4.333519473e-05f, +3.825818285e-05f, +1.178266614e-04f, +1.912057239e-04f, +2.546971958e-04f, +3.053389846e-04f, +3.411073257e-04f, +3.610342947e-04f, +3.652321423e-04f, +3.548254937e-04f, +3.318015757e-04f, +2.987963721e-04f, +2.588401603e-04f, +2.150887015e-04f, +1.705662467e-04f, +1.279436332e-04f, +8.936953796e-05f, +5.636615021e-05f, +2.979298624e-05f, +9.875198106e-06f, -3.713643442e-06f, -1.172902759e-05f, -1.521062582e-05f, -1.533288052e-05f, -1.326725904e-05f, - /* 0, 9 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.290966885e-05f, +1.517117127e-05f, +1.538504899e-05f, +1.238878055e-05f, +5.001158613e-06f, -7.842411460e-06f, -2.694112611e-05f, -5.268237913e-05f, -8.491546506e-05f, -1.228629477e-04f, -1.650848794e-04f, -2.095065816e-04f, -2.535145019e-04f, -2.941173722e-04f, -3.281623292e-04f, -3.525887067e-04f, -3.646967662e-04f, -3.624054162e-04f, -3.444725018e-04f, -3.106537038e-04f, -2.617813169e-04f, -1.997516844e-04f, -1.274190627e-04f, -4.840319232e-05f, +3.317321082e-05f, +1.129934779e-04f, +1.868740351e-04f, +2.510790765e-04f, +3.025937756e-04f, +3.393313383e-04f, +3.602561561e-04f, +3.654140322e-04f, +3.558699317e-04f, +3.335628777e-04f, +3.010954694e-04f, +2.614812022e-04f, +2.178757715e-04f, +1.733186168e-04f, +1.305082307e-04f, +9.162968470e-05f, +5.824608692e-05f, +3.125817198e-05f, +1.092881336e-05f, -3.037205637e-06f, -1.137266132e-05f, -1.510388072e-05f, -1.540111268e-05f, -1.343963384e-05f, - /* 0,10 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.272492213e-05f, +1.507824593e-05f, +1.545331501e-05f, +1.269272958e-05f, +5.612701183e-06f, -6.862946083e-06f, -2.555439710e-05f, -5.087878289e-05f, -8.272210008e-05f, -1.203477449e-04f, -1.623570592e-04f, -2.067129352e-04f, -2.508314194e-04f, -2.917390162e-04f, -3.262858124e-04f, -3.513975353e-04f, -3.643440891e-04f, -3.629987460e-04f, -3.460615178e-04f, -3.132225075e-04f, -2.652461110e-04f, -2.039643239e-04f, -1.321763393e-04f, -5.346112415e-05f, +2.808133519e-05f, +1.081369454e-04f, +1.825043147e-04f, +2.474110810e-04f, +2.997904985e-04f, +3.374932277e-04f, +3.594160939e-04f, +3.655382063e-04f, +3.568642973e-04f, +3.352843568e-04f, +3.033666037e-04f, +2.641066927e-04f, +2.206592368e-04f, +1.760779795e-04f, +1.330883916e-04f, +9.391151370e-05f, +6.015121602e-05f, +3.274955044e-05f, +1.200742830e-05f, -2.338678028e-06f, -1.099826356e-05f, -1.498372103e-05f, -1.546055886e-05f, -1.360741082e-05f, - /* 0,11 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.253651480e-05f, +1.497763796e-05f, +1.550934211e-05f, +1.297977154e-05f, +6.203084070e-06f, -5.907892698e-06f, -2.419375182e-05f, -4.910085537e-05f, -8.055153976e-05f, -1.178498758e-04f, -1.596385855e-04f, -2.039184901e-04f, -2.481358533e-04f, -2.893357895e-04f, -3.243723279e-04f, -3.501586466e-04f, -3.639353135e-04f, -3.635308455e-04f, -3.475880652e-04f, -3.157318305e-04f, -2.686586134e-04f, -2.081356675e-04f, -1.369063854e-04f, -5.850794175e-05f, +2.298361455e-05f, +1.032580523e-04f, +1.780974071e-04f, +2.436938494e-04f, +2.969295472e-04f, +3.355931220e-04f, +3.585139737e-04f, +3.656042935e-04f, +3.578080270e-04f, +3.369653145e-04f, +3.056090065e-04f, +2.667158598e-04f, +2.234383818e-04f, +1.788437260e-04f, +1.356836490e-04f, +9.621471868e-05f, +6.208139387e-05f, +3.426712759e-05f, +1.311117335e-05f, -1.617838952e-06f, -1.060555829e-05f, -1.484985257e-05f, -1.551093858e-05f, -1.377034793e-05f, - /* 0,12 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.234467317e-05f, +1.486961808e-05f, +1.555342333e-05f, +1.325019189e-05f, +6.772549939e-06f, -4.977088548e-06f, -2.285914223e-05f, -4.734869143e-05f, -7.840403901e-05f, -1.153697583e-04f, -1.569300258e-04f, -2.011239334e-04f, -2.454285640e-04f, -2.869084686e-04f, -3.224226032e-04f, -3.488726530e-04f, -3.634708763e-04f, -3.640019265e-04f, -3.490520992e-04f, -3.181813609e-04f, -2.720182574e-04f, -2.122649289e-04f, -1.416082500e-04f, -6.354259999e-05f, +1.788110924e-05f, +9.835779378e-05f, +1.736541678e-04f, +2.399280361e-04f, +2.940113321e-04f, +3.336311662e-04f, +3.575496773e-04f, +3.656119364e-04f, +3.587005674e-04f, +3.386050587e-04f, +3.078219119e-04f, +2.693079297e-04f, +2.262124861e-04f, +1.816152396e-04f, +1.382935265e-04f, +9.853898309e-05f, +6.403646691e-05f, +3.581090067e-05f, +1.424017206e-05f, -8.744713867e-07f, -1.019427178e-05f, -1.470198130e-05f, -1.555196970e-05f, -1.392820018e-05f, - /* 0,13 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.214962021e-05f, +1.475445480e-05f, +1.558585112e-05f, +1.350427756e-05f, +7.321345221e-06f, -4.070364810e-06f, -2.155051224e-05f, -4.562237634e-05f, -7.627984250e-05f, -1.129078005e-04f, -1.542319388e-04f, -1.983299454e-04f, -2.427103092e-04f, -2.844578309e-04f, -3.204373710e-04f, -3.475401762e-04f, -3.629512268e-04f, -3.644122164e-04f, -3.504535917e-04f, -3.205708032e-04f, -2.753244915e-04f, -2.163513340e-04f, -1.462809907e-04f, -6.856405736e-05f, +1.277488105e-05f, +9.343717126e-05f, +1.691754631e-04f, +2.361143096e-04f, +2.910362794e-04f, +3.316075217e-04f, +3.565231022e-04f, +3.655607915e-04f, +3.595413759e-04f, +3.402029042e-04f, +3.100045565e-04f, +2.718821271e-04f, +2.289808241e-04f, +1.843918961e-04f, +1.409175379e-04f, +1.008839801e-04f, +6.601627161e-05f, +3.738085809e-05f, +1.539454099e-05f, -1.083630892e-07f, -9.764132757e-06f, -1.453981342e-05f, -1.558336850e-05f, -1.408071968e-05f, - /* 0,14 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.195157556e-05f, +1.463241434e-05f, +1.560691722e-05f, +1.374231680e-05f, +7.849719961e-06f, -3.187546744e-06f, -2.026779777e-05f, -4.392198589e-05f, -7.417918467e-05f, -1.104644002e-04f, -1.515448748e-04f, -1.955372004e-04f, -2.399818431e-04f, -2.819846545e-04f, -3.184173686e-04f, -3.461618466e-04f, -3.623768266e-04f, -3.647619571e-04f, -3.517925311e-04f, -3.228998788e-04f, -2.785767791e-04f, -2.203941213e-04f, -1.509236733e-04f, -7.357127629e-05f, +7.665992852e-06f, +8.849719227e-05f, +1.646621696e-04f, +2.322533521e-04f, +2.880048316e-04f, +3.295223672e-04f, +3.554341621e-04f, +3.654505292e-04f, +3.603299209e-04f, +3.417581727e-04f, +3.121561799e-04f, +2.744376758e-04f, +2.317426657e-04f, +1.871730634e-04f, +1.435551879e-04f, +1.032493727e-04f, +6.802063440e-05f, +3.897697936e-05f, +1.657438954e-05f, +6.806932534e-07f, -9.314872538e-06f, -1.436305556e-05f, -1.560484981e-05f, -1.422765568e-05f, - /* 0,15 (48) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.175075544e-05f, +1.450376051e-05f, +1.561691254e-05f, +1.396459906e-05f, +8.357927672e-06f, -2.328453823e-06f, -1.901092689e-05f, -4.224758644e-05f, -7.210228972e-05f, -1.080399453e-04f, -1.488693749e-04f, -1.927463657e-04f, -2.372439164e-04f, -2.794897176e-04f, -3.163633379e-04f, -3.447383033e-04f, -3.617481497e-04f, -3.650514058e-04f, -3.530689224e-04f, -3.251683254e-04f, -2.817745994e-04f, -2.243925418e-04f, -1.555353731e-04f, -7.856322346e-05f, +2.555508337e-06f, +8.353887009e-05f, +1.601151740e-04f, +2.283458597e-04f, +2.849174469e-04f, +3.273758978e-04f, +3.542827868e-04f, +3.652808343e-04f, +3.610656819e-04f, +3.432701935e-04f, +3.142760250e-04f, +2.769737986e-04f, +2.344972762e-04f, +1.899581021e-04f, +1.462059716e-04f, +1.056348136e-04f, +7.004937168e-05f, +4.059923501e-05f, +1.777981991e-05f, +1.492899882e-06f, -8.846225192e-06f, -1.417141484e-05f, -1.561612709e-05f, -1.436875469e-05f, - /* 1, 0 (48) */ - -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f, - +7.400711575e-04f, +1.375020608e-03f, +2.149280883e-03f, +2.889370620e-03f, +3.314167096e-03f, +3.062969010e-03f, +1.758157367e-03f, -9.035293376e-04f, -5.046849967e-03f, -1.052447103e-02f, -1.686036328e-02f, -2.325321288e-02f, -2.865282346e-02f, -3.190731847e-02f, -3.196179918e-02f, -2.807404400e-02f, -2.000388698e-02f, -8.133017718e-03f, +6.517945993e-03f, +2.238959427e-02f, +3.759199639e-02f, +5.018871167e-02f, +5.850644264e-02f, +6.141247912e-02f, +5.850644264e-02f, +5.018871167e-02f, +3.759199639e-02f, +2.238959427e-02f, +6.517945993e-03f, -8.133017718e-03f, -2.000388698e-02f, -2.807404400e-02f, -3.196179918e-02f, -3.190731847e-02f, -2.865282346e-02f, -2.325321288e-02f, -1.686036328e-02f, -1.052447103e-02f, -5.046849967e-03f, -9.035293376e-04f, +1.758157367e-03f, +3.062969010e-03f, +3.314167096e-03f, +2.889370620e-03f, +2.149280883e-03f, +1.375020608e-03f, +7.400711575e-04f, +3.136419749e-04f, - +1.436875469e-05f, +1.561612709e-05f, +1.417141484e-05f, +8.846225192e-06f, -1.492899882e-06f, -1.777981991e-05f, -4.059923501e-05f, -7.004937168e-05f, -1.056348136e-04f, -1.462059716e-04f, -1.899581021e-04f, -2.344972762e-04f, -2.769737986e-04f, -3.142760250e-04f, -3.432701935e-04f, -3.610656819e-04f, -3.652808343e-04f, -3.542827868e-04f, -3.273758978e-04f, -2.849174469e-04f, -2.283458597e-04f, -1.601151740e-04f, -8.353887009e-05f, -2.555508337e-06f, +7.856322346e-05f, +1.555353731e-04f, +2.243925418e-04f, +2.817745994e-04f, +3.251683254e-04f, +3.530689224e-04f, +3.650514058e-04f, +3.617481497e-04f, +3.447383033e-04f, +3.163633379e-04f, +2.794897176e-04f, +2.372439164e-04f, +1.927463657e-04f, +1.488693749e-04f, +1.080399453e-04f, +7.210228972e-05f, +4.224758644e-05f, +1.901092689e-05f, +2.328453823e-06f, -8.357927672e-06f, -1.396459906e-05f, -1.561691254e-05f, -1.450376051e-05f, -1.175075544e-05f, - -3.298796763e-05f, -4.497254386e-05f, -4.975291943e-05f, -4.042907987e-05f, -1.073671011e-05f, +4.281170552e-05f, +1.188365932e-04f, +2.096675045e-04f, +3.011639964e-04f, +3.741484107e-04f, +4.074621699e-04f, +3.822318455e-04f, +2.865420942e-04f, +1.194703409e-04f, -1.065721740e-04f, -3.659939596e-04f, -6.229874085e-04f, -8.370019861e-04f, -9.698167423e-04f, -9.928547411e-04f, -8.932168303e-04f, -6.770885329e-04f, -3.696692020e-04f, -1.148458052e-05f, +3.482868123e-04f, +6.601946496e-04f, +8.829516200e-04f, +9.902567432e-04f, +9.746956122e-04f, +8.480412722e-04f, +6.380463451e-04f, +3.825376741e-04f, +1.221374013e-04f, -1.068677635e-04f, -2.781320935e-04f, -3.783873075e-04f, -4.077685417e-04f, -3.776097676e-04f, -3.064853506e-04f, -2.155449835e-04f, -1.241951985e-04f, -4.695088128e-05f, +8.102898992e-06f, +3.922482936e-05f, +4.965574704e-05f, +4.555149778e-05f, +3.382854534e-05f, +2.043206678e-05f, - /* 1, 1 (48) */ - -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f, - +7.070831898e-04f, +1.330048064e-03f, +2.099527963e-03f, +2.848941540e-03f, +3.303430386e-03f, +3.105780715e-03f, +1.876993960e-03f, -6.938618331e-04f, -4.745685971e-03f, -1.015032262e-02f, -1.645290111e-02f, -2.287098103e-02f, -2.836628136e-02f, -3.178784813e-02f, -3.206837136e-02f, -2.844003796e-02f, -2.062687439e-02f, -8.970019704e-03f, +5.548129250e-03f, +2.139673953e-02f, +3.669877956e-02f, +4.951162314e-02f, +5.813677344e-02f, +6.140099454e-02f, +5.885472945e-02f, +5.084890632e-02f, +3.847494801e-02f, +2.337985102e-02f, +7.492641605e-03f, -7.284976446e-03f, -1.936584064e-02f, -2.769150633e-02f, -3.183966178e-02f, -3.201418624e-02f, -2.893095555e-02f, -2.363160019e-02f, -1.726813182e-02f, -1.090208080e-02f, -5.353335318e-03f, -1.119074321e-03f, +1.633962169e-03f, +3.016018128e-03f, +3.322269995e-03f, +2.928595450e-03f, +2.198936630e-03f, +1.420572106e-03f, +7.738997028e-04f, +3.340740417e-04f, - +1.422765568e-05f, +1.560484981e-05f, +1.436305556e-05f, +9.314872538e-06f, -6.806932534e-07f, -1.657438954e-05f, -3.897697936e-05f, -6.802063440e-05f, -1.032493727e-04f, -1.435551879e-04f, -1.871730634e-04f, -2.317426657e-04f, -2.744376758e-04f, -3.121561799e-04f, -3.417581727e-04f, -3.603299209e-04f, -3.654505292e-04f, -3.554341621e-04f, -3.295223672e-04f, -2.880048316e-04f, -2.322533521e-04f, -1.646621696e-04f, -8.849719227e-05f, -7.665992852e-06f, +7.357127629e-05f, +1.509236733e-04f, +2.203941213e-04f, +2.785767791e-04f, +3.228998788e-04f, +3.517925311e-04f, +3.647619571e-04f, +3.623768266e-04f, +3.461618466e-04f, +3.184173686e-04f, +2.819846545e-04f, +2.399818431e-04f, +1.955372004e-04f, +1.515448748e-04f, +1.104644002e-04f, +7.417918467e-05f, +4.392198589e-05f, +2.026779777e-05f, +3.187546744e-06f, -7.849719961e-06f, -1.374231680e-05f, -1.560691722e-05f, -1.463241434e-05f, -1.195157556e-05f, - -3.214276087e-05f, -4.436582473e-05f, -4.979481204e-05f, -4.155286413e-05f, -1.327572638e-05f, +3.876242354e-05f, +1.135379940e-04f, +2.037943320e-04f, +2.957710268e-04f, +3.705313687e-04f, +4.069248265e-04f, +3.857975120e-04f, +2.946688243e-04f, +1.318381643e-04f, -9.114075986e-05f, -3.494423697e-04f, -6.077598419e-04f, -8.256423296e-04f, -9.645038563e-04f, -9.949671927e-04f, -9.030206730e-04f, -6.936207075e-04f, -3.908504078e-04f, -3.444745270e-05f, +3.267147364e-04f, +6.429475305e-04f, +8.722291410e-04f, +9.871724207e-04f, +9.791352228e-04f, +8.587516819e-04f, +6.529265948e-04f, +3.990637556e-04f, +1.378286001e-04f, -9.403526962e-05f, -2.694402545e-04f, -3.742622091e-04f, -4.078399572e-04f, -3.809102841e-04f, -3.117299173e-04f, -2.214225220e-04f, -1.296110609e-04f, -5.117885245e-05f, +5.373957843e-06f, +3.793880645e-05f, +4.950156984e-05f, +4.610103897e-05f, +3.466326372e-05f, +2.123200363e-05f, - /* 1, 2 (48) */ - -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f, - +6.749404290e-04f, +1.285682239e-03f, +2.049733151e-03f, +2.807388676e-03f, +3.290154659e-03f, +3.144543139e-03f, +1.990531954e-03f, -4.900675011e-04f, -4.449914944e-03f, -9.779791249e-03f, -1.604597628e-02f, -2.248518352e-02f, -2.807161254e-02f, -3.165600997e-02f, -3.215951212e-02f, -2.878948033e-02f, -2.123463423e-02f, -9.795662033e-03f, +4.583625394e-03f, +2.040177234e-02f, +3.579575888e-02f, +4.881800243e-02f, +5.774592303e-02f, +6.136654709e-02f, +5.918144419e-02f, +5.149185385e-02f, +3.934717715e-02f, +2.436702344e-02f, +8.471776828e-03f, -6.426224764e-03f, -1.871291404e-02f, -2.729244257e-02f, -3.170183318e-02f, -3.210822151e-02f, -2.920039581e-02f, -2.400586239e-02f, -1.767597177e-02f, -1.128299108e-02f, -5.665065235e-03f, -1.340496843e-03f, +1.504351108e-03f, +2.964839276e-03f, +3.327643953e-03f, +2.966534256e-03f, +2.248438199e-03f, +1.466673145e-03f, +8.085629665e-04f, +3.553060453e-04f, - +1.408071968e-05f, +1.558336850e-05f, +1.453981342e-05f, +9.764132757e-06f, +1.083630892e-07f, -1.539454099e-05f, -3.738085809e-05f, -6.601627161e-05f, -1.008839801e-04f, -1.409175379e-04f, -1.843918961e-04f, -2.289808241e-04f, -2.718821271e-04f, -3.100045565e-04f, -3.402029042e-04f, -3.595413759e-04f, -3.655607915e-04f, -3.565231022e-04f, -3.316075217e-04f, -2.910362794e-04f, -2.361143096e-04f, -1.691754631e-04f, -9.343717126e-05f, -1.277488105e-05f, +6.856405736e-05f, +1.462809907e-04f, +2.163513340e-04f, +2.753244915e-04f, +3.205708032e-04f, +3.504535917e-04f, +3.644122164e-04f, +3.629512268e-04f, +3.475401762e-04f, +3.204373710e-04f, +2.844578309e-04f, +2.427103092e-04f, +1.983299454e-04f, +1.542319388e-04f, +1.129078005e-04f, +7.627984250e-05f, +4.562237634e-05f, +2.155051224e-05f, +4.070364810e-06f, -7.321345221e-06f, -1.350427756e-05f, -1.558585112e-05f, -1.475445480e-05f, -1.214962021e-05f, - -3.129412251e-05f, -4.373296981e-05f, -4.978315839e-05f, -4.259753072e-05f, -1.572035894e-05f, +3.480403449e-05f, +1.083020469e-04f, +1.979296317e-04f, +2.903115805e-04f, +3.667638307e-04f, +4.061606045e-04f, +3.890861680e-04f, +3.025110613e-04f, +1.439666045e-04f, -7.585083792e-05f, -3.328925852e-04f, -5.923737374e-04f, -8.139709591e-04f, -9.587624439e-04f, -9.965951766e-04f, -9.123593490e-04f, -7.097829418e-04f, -4.118190680e-04f, -5.739146255e-05f, +3.049646014e-04f, +6.253558851e-04f, +8.610537897e-04f, +9.836012974e-04f, +9.831305814e-04f, +8.691248663e-04f, +6.676181426e-04f, +4.155623762e-04f, +1.536377706e-04f, -8.097790407e-05f, -2.604682208e-04f, -3.698550369e-04f, -4.076725437e-04f, -3.840448432e-04f, -3.168924946e-04f, -2.272957940e-04f, -1.350813291e-04f, -5.549442053e-05f, +2.549629309e-06f, +3.656974964e-05f, +4.928867322e-05f, +4.661950316e-05f, +3.549086016e-05f, +2.204092248e-05f, - /* 1, 3 (48) */ - -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f, - +6.436463064e-04f, +1.241949270e-03f, +1.999949993e-03f, +2.764791145e-03f, +3.274434301e-03f, +3.179347173e-03f, +2.098834001e-03f, -2.921378694e-04f, -4.159603364e-03f, -9.413027418e-03f, -1.563981567e-02f, -2.209609735e-02f, -2.776910148e-02f, -3.151204336e-02f, -3.223536296e-02f, -2.912237291e-02f, -2.182700797e-02f, -1.060963299e-02f, +3.624862950e-03f, +1.940517716e-02f, +3.488339953e-02f, +4.810821949e-02f, +5.733410396e-02f, +6.130915563e-02f, +5.948640879e-02f, +5.211720974e-02f, +4.020823094e-02f, +2.535062474e-02f, +9.454907409e-03f, -5.557099897e-03f, -1.804529590e-02f, -2.687688019e-02f, -3.154819541e-02f, -3.218919941e-02f, -2.946086403e-02f, -2.437571743e-02f, -1.808364432e-02f, -1.166703592e-02f, -5.981957730e-03f, -1.567792637e-03f, +1.369269778e-03f, +2.909344855e-03f, +3.330193582e-03f, +3.003104006e-03f, +2.297726873e-03f, +1.513292648e-03f, +8.440538267e-04f, +3.773469678e-04f, - +1.392820018e-05f, +1.555196970e-05f, +1.470198130e-05f, +1.019427178e-05f, +8.744713867e-07f, -1.424017206e-05f, -3.581090067e-05f, -6.403646691e-05f, -9.853898309e-05f, -1.382935265e-04f, -1.816152396e-04f, -2.262124861e-04f, -2.693079297e-04f, -3.078219119e-04f, -3.386050587e-04f, -3.587005674e-04f, -3.656119364e-04f, -3.575496773e-04f, -3.336311662e-04f, -2.940113321e-04f, -2.399280361e-04f, -1.736541678e-04f, -9.835779378e-05f, -1.788110924e-05f, +6.354259999e-05f, +1.416082500e-04f, +2.122649289e-04f, +2.720182574e-04f, +3.181813609e-04f, +3.490520992e-04f, +3.640019265e-04f, +3.634708763e-04f, +3.488726530e-04f, +3.224226032e-04f, +2.869084686e-04f, +2.454285640e-04f, +2.011239334e-04f, +1.569300258e-04f, +1.153697583e-04f, +7.840403901e-05f, +4.734869143e-05f, +2.285914223e-05f, +4.977088548e-06f, -6.772549939e-06f, -1.325019189e-05f, -1.555342333e-05f, -1.486961808e-05f, -1.234467317e-05f, - -3.044321659e-05f, -4.307558912e-05f, -4.971969849e-05f, -4.356446846e-05f, -1.807109303e-05f, +3.093743924e-05f, +1.031312945e-04f, +1.920774861e-04f, +2.847907589e-04f, +3.628510148e-04f, +4.051736998e-04f, +3.920998434e-04f, +3.100677915e-04f, +1.558512420e-04f, -6.070992062e-05f, -3.163542042e-04f, -5.768392143e-04f, -8.019966748e-04f, -9.525982357e-04f, -9.977400699e-04f, -9.212293605e-04f, -7.255672513e-04f, -4.325639655e-04f, -8.030404950e-05f, +2.830481549e-04f, +6.074286538e-04f, +8.494302580e-04f, +9.795432004e-04f, +9.866769511e-04f, +8.791526409e-04f, +6.821110234e-04f, +4.320236446e-04f, +1.695567592e-04f, -6.770091667e-05f, -2.512178480e-04f, -3.651644562e-04f, -4.072625452e-04f, -3.870083707e-04f, -3.219678548e-04f, -2.331603972e-04f, -1.406030499e-04f, -5.989628606e-05f, -3.702643188e-07f, +3.511644428e-05f, +4.901535501e-05f, +4.710521070e-05f, +3.631004035e-05f, +2.285808138e-05f, - /* 1, 4 (48) */ - -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f, - +6.132030899e-04f, +1.198873681e-03f, +1.950230294e-03f, +2.721226677e-03f, +3.256363208e-03f, +3.210284612e-03f, +2.201965296e-03f, -1.000603833e-04f, -3.874812605e-03f, -9.050176404e-03f, -1.523464198e-02f, -2.170399751e-02f, -2.745903369e-02f, -3.135619212e-02f, -3.229607288e-02f, -2.943872712e-02f, -2.240384718e-02f, -1.141162967e-02f, +2.672264714e-03f, +1.840743709e-02f, +3.396217017e-02f, +4.738265224e-02f, +5.690154000e-02f, +6.122885158e-02f, +5.976945695e-02f, +5.272463839e-02f, +4.105766120e-02f, +2.633016794e-02f, +1.044158436e-02f, -4.677947257e-03f, -1.736318488e-02f, -2.644485655e-02f, -3.137863865e-02f, -3.225690033e-02f, -2.971208187e-02f, -2.474088189e-02f, -1.849090686e-02f, -1.205404429e-02f, -6.303925585e-03f, -1.800953034e-03f, +1.228666729e-03f, +2.849448569e-03f, +3.329823318e-03f, +3.038220450e-03f, +2.346742228e-03f, +1.560397859e-03f, +8.803638670e-04f, +4.002050492e-04f, - +1.377034793e-05f, +1.551093858e-05f, +1.484985257e-05f, +1.060555829e-05f, +1.617838952e-06f, -1.311117335e-05f, -3.426712759e-05f, -6.208139387e-05f, -9.621471868e-05f, -1.356836490e-04f, -1.788437260e-04f, -2.234383818e-04f, -2.667158598e-04f, -3.056090065e-04f, -3.369653145e-04f, -3.578080270e-04f, -3.656042935e-04f, -3.585139737e-04f, -3.355931220e-04f, -2.969295472e-04f, -2.436938494e-04f, -1.780974071e-04f, -1.032580523e-04f, -2.298361455e-05f, +5.850794175e-05f, +1.369063854e-04f, +2.081356675e-04f, +2.686586134e-04f, +3.157318305e-04f, +3.475880652e-04f, +3.635308455e-04f, +3.639353135e-04f, +3.501586466e-04f, +3.243723279e-04f, +2.893357895e-04f, +2.481358533e-04f, +2.039184901e-04f, +1.596385855e-04f, +1.178498758e-04f, +8.055153976e-05f, +4.910085537e-05f, +2.419375182e-05f, +5.907892698e-06f, -6.203084070e-06f, -1.297977154e-05f, -1.550934211e-05f, -1.497763796e-05f, -1.253651480e-05f, - -2.959117339e-05f, -4.239527205e-05f, -4.960617699e-05f, -4.445510421e-05f, -2.032848599e-05f, +2.716344140e-05f, +9.802817553e-05f, +1.862418924e-04f, +2.792136228e-04f, +3.587981640e-04f, +4.039684070e-04f, +3.948407330e-04f, +3.173382086e-04f, +1.674878689e-04f, -4.572534974e-05f, -2.998367356e-04f, -5.611664122e-04f, -7.897284134e-04f, -9.460171984e-04f, -9.984035460e-04f, -9.296275127e-04f, -7.409659036e-04f, -4.530740344e-04f, -1.031726744e-04f, +2.609772578e-04f, +5.891750020e-04f, +8.373635309e-04f, +9.749982615e-04f, +9.897698548e-04f, +8.888269914e-04f, +6.963953288e-04f, +4.484376120e-04f, +1.855772631e-04f, -5.420976061e-05f, -2.416912049e-04f, -3.601893137e-04f, -4.066063268e-04f, -3.897958401e-04f, -3.269507481e-04f, -2.390118549e-04f, -1.461731693e-04f, -6.438304794e-05f, -3.385819329e-06f, +3.357772476e-05f, +4.867992751e-05f, +4.755646799e-05f, +3.711947890e-05f, +2.368270267e-05f, - /* 1, 5 (48) */ - -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f, - +5.836119165e-04f, +1.156478409e-03f, +1.900624117e-03f, +2.676771573e-03f, +3.236034722e-03f, +3.237448054e-03f, +2.299993471e-03f, +8.618150913e-05f, -3.595598982e-03f, -8.691378240e-03f, -1.483067357e-02f, -2.130915678e-02f, -2.714169548e-02f, -3.118870425e-02f, -3.234179823e-02f, -2.973856385e-02f, -2.296501360e-02f, -1.220135808e-02f, +1.726247516e-03f, +1.740903355e-02f, +3.303254266e-02f, +4.664168634e-02f, +5.644846596e-02f, +6.112567891e-02f, +6.003043421e-02f, +5.331381339e-02f, +4.189502473e-02f, +2.730516620e-02f, +1.143135421e-02f, -3.789120265e-03f, -1.666678955e-02f, -2.599641894e-02f, -3.119306139e-02f, -3.231111009e-02f, -2.995377308e-02f, -2.510107120e-02f, -1.889751319e-02f, -1.244384013e-02f, -6.630876333e-03f, -2.039964889e-03f, +1.082493559e-03f, +2.785065521e-03f, +3.326437498e-03f, +3.071798175e-03f, +2.395422155e-03f, +1.607954327e-03f, +9.174833459e-04f, +4.238877519e-04f, - +1.360741082e-05f, +1.546055886e-05f, +1.498372103e-05f, +1.099826356e-05f, +2.338678028e-06f, -1.200742830e-05f, -3.274955044e-05f, -6.015121602e-05f, -9.391151370e-05f, -1.330883916e-04f, -1.760779795e-04f, -2.206592368e-04f, -2.641066927e-04f, -3.033666037e-04f, -3.352843568e-04f, -3.568642973e-04f, -3.655382063e-04f, -3.594160939e-04f, -3.374932277e-04f, -2.997904985e-04f, -2.474110810e-04f, -1.825043147e-04f, -1.081369454e-04f, -2.808133519e-05f, +5.346112415e-05f, +1.321763393e-04f, +2.039643239e-04f, +2.652461110e-04f, +3.132225075e-04f, +3.460615178e-04f, +3.629987460e-04f, +3.643440891e-04f, +3.513975353e-04f, +3.262858124e-04f, +2.917390162e-04f, +2.508314194e-04f, +2.067129352e-04f, +1.623570592e-04f, +1.203477449e-04f, +8.272210008e-05f, +5.087878289e-05f, +2.555439710e-05f, +6.862946083e-06f, -5.612701183e-06f, -1.269272958e-05f, -1.545331501e-05f, -1.507824593e-05f, -1.272492213e-05f, - -2.873908892e-05f, -4.169358615e-05f, -4.944434125e-05f, -4.527090066e-05f, -2.249316533e-05f, +2.348274851e-05f, +9.299502465e-05f, +1.804267603e-04f, +2.735851890e-04f, +3.546105412e-04f, +4.025491149e-04f, +3.973111934e-04f, +3.243217116e-04f, +1.788724890e-04f, -3.090429259e-05f, -2.833495928e-04f, -5.453654837e-04f, -7.771752413e-04f, -9.390255295e-04f, -9.985875726e-04f, -9.375509149e-04f, -7.559714225e-04f, -4.733383682e-04f, -1.259848280e-04f, +2.387638760e-04f, +5.706043144e-04f, +8.248588837e-04f, +9.699669182e-04f, +9.924050797e-04f, +8.981400810e-04f, +7.104612148e-04f, +4.647942795e-04f, +2.016908352e-04f, -4.051009021e-05f, -2.318905738e-04f, -3.549286412e-04f, -4.057003792e-04f, -3.924022771e-04f, -3.318359064e-04f, -2.448456191e-04f, -1.517885333e-04f, -6.895320271e-05f, -6.497048873e-06f, +3.195247673e-05f, +4.828071952e-05f, +4.797156900e-05f, +3.791782005e-05f, +2.451397293e-05f, - /* 1, 6 (48) */ - -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f, - +5.548728275e-04f, +1.114784822e-03f, +1.851179776e-03f, +2.631500672e-03f, +3.213541556e-03f, +3.260930802e-03f, +2.392988496e-03f, +2.666082695e-04f, -3.322013793e-03f, -8.336767698e-03f, -1.442812445e-02f, -2.091184558e-02f, -2.681737377e-02f, -3.100983176e-02f, -3.237270252e-02f, -3.002191345e-02f, -2.351037908e-02f, -1.297853332e-02f, +7.872219866e-04f, +1.641044598e-02f, +3.209499175e-02f, +4.588571491e-02f, +5.597512760e-02f, +6.099969408e-02f, +6.026919808e-02f, +5.388441771e-02f, +4.271988361e-02f, +2.827513312e-02f, +1.242375929e-02f, -2.890980184e-03f, -1.595632833e-02f, -2.553162466e-02f, -3.099137055e-02f, -3.235162018e-02f, -3.018566365e-02f, -2.545599984e-02f, -1.930321357e-02f, -1.283624241e-02f, -6.962712239e-03f, -2.284810508e-03f, +9.307050260e-04f, +2.716112319e-03f, +3.319940450e-03f, +3.103750651e-03f, +2.443702875e-03f, +1.655925896e-03f, +9.554011660e-04f, +4.484017248e-04f, - +1.343963384e-05f, +1.540111268e-05f, +1.510388072e-05f, +1.137266132e-05f, +3.037205637e-06f, -1.092881336e-05f, -3.125817198e-05f, -5.824608692e-05f, -9.162968470e-05f, -1.305082307e-04f, -1.733186168e-04f, -2.178757715e-04f, -2.614812022e-04f, -3.010954694e-04f, -3.335628777e-04f, -3.558699317e-04f, -3.654140322e-04f, -3.602561561e-04f, -3.393313383e-04f, -3.025937756e-04f, -2.510790765e-04f, -1.868740351e-04f, -1.129934779e-04f, -3.317321082e-05f, +4.840319232e-05f, +1.274190627e-04f, +1.997516844e-04f, +2.617813169e-04f, +3.106537038e-04f, +3.444725018e-04f, +3.624054162e-04f, +3.646967662e-04f, +3.525887067e-04f, +3.281623292e-04f, +2.941173722e-04f, +2.535145019e-04f, +2.095065816e-04f, +1.650848794e-04f, +1.228629477e-04f, +8.491546506e-05f, +5.268237913e-05f, +2.694112611e-05f, +7.842411460e-06f, -5.001158613e-06f, -1.238878055e-05f, -1.538504899e-05f, -1.517117127e-05f, -1.290966885e-05f, - -2.788802465e-05f, -4.097207601e-05f, -4.923593954e-05f, -4.601335413e-05f, -2.456582673e-05f, +1.989597317e-05f, +8.803407223e-05f, +1.746359106e-04f, +2.679104263e-04f, +3.502934252e-04f, +4.009203018e-04f, +3.995137393e-04f, +3.310179034e-04f, +1.900013194e-04f, -1.625373835e-05f, -2.669020884e-04f, -5.294465871e-04f, -7.643463472e-04f, -9.316296518e-04f, -9.982944087e-04f, -9.449969818e-04f, -7.705765934e-04f, -4.933462266e-04f, -1.487280397e-04f, +2.164200722e-04f, +5.517261887e-04f, +8.119218791e-04f, +9.644499142e-04f, +9.945786815e-04f, +9.070842565e-04f, +7.242989091e-04f, +4.810836044e-04f, +2.178888888e-04f, -2.660775875e-05f, -2.218184512e-04f, -3.493816578e-04f, -4.045413228e-04f, -3.948227641e-04f, -3.366180478e-04f, -2.506570728e-04f, -1.574458887e-04f, -7.360514409e-05f, -9.703881282e-06f, +3.023963922e-05f, +4.781607847e-05f, +4.834879674e-05f, +3.870367843e-05f, +2.535104299e-05f, - /* 1, 7 (48) */ - -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f, - +5.269848029e-04f, +1.073812746e-03f, +1.801943836e-03f, +2.585487318e-03f, +3.188975729e-03f, +3.280826776e-03f, +2.481022568e-03f, +4.412441800e-04f, -3.054103367e-03f, -7.986474273e-03f, -1.402720415e-02f, -2.051233184e-02f, -2.648635586e-02f, -3.081983044e-02f, -3.238895626e-02f, -3.028881553e-02f, -2.403982567e-02f, -1.374287967e-02f, -1.444076651e-04f, +1.541215157e-02f, +3.114999476e-02f, +4.511513832e-02f, +5.548178137e-02f, +6.085096604e-02f, +6.048561815e-02f, +5.443614390e-02f, +4.353180549e-02f, +2.923958303e-02f, +1.341833798e-02f, -1.983895928e-03f, -1.523202942e-02f, -2.505054105e-02f, -3.077348167e-02f, -3.237822794e-02f, -3.040748210e-02f, -2.580538150e-02f, -1.970775489e-02f, -1.323106518e-02f, -7.299330287e-03f, -2.535467581e-03f, +7.732591374e-04f, +2.642507175e-03f, +3.310236568e-03f, +3.133990291e-03f, +2.491518953e-03f, +1.704274692e-03f, +9.941048444e-04f, +4.737527678e-04f, - +1.326725904e-05f, +1.533288052e-05f, +1.521062582e-05f, +1.172902759e-05f, +3.713643442e-06f, -9.875198106e-06f, -2.979298624e-05f, -5.636615021e-05f, -8.936953796e-05f, -1.279436332e-04f, -1.705662467e-04f, -2.150887015e-04f, -2.588401603e-04f, -2.987963721e-04f, -3.318015757e-04f, -3.548254937e-04f, -3.652321423e-04f, -3.610342947e-04f, -3.411073257e-04f, -3.053389846e-04f, -2.546971958e-04f, -1.912057239e-04f, -1.178266614e-04f, -3.825818285e-05f, +4.333519473e-05f, +1.226355145e-04f, +1.954985477e-04f, +2.582648130e-04f, +3.080257478e-04f, +3.428210784e-04f, +3.617506595e-04f, +3.649929210e-04f, +3.537315574e-04f, +3.300011559e-04f, +2.964700822e-04f, +2.561843375e-04f, +2.122987367e-04f, +1.678214700e-04f, +1.253950564e-04f, +8.713136950e-05f, +5.451153963e-05f, +2.835397865e-05f, +8.846445392e-06f, -4.368217600e-06f, -1.206764059e-05f, -1.530425055e-05f, -1.525614110e-05f, -1.309052541e-05f, - -2.703900717e-05f, -4.023226211e-05f, -4.898271918e-05f, -4.668399238e-05f, -2.654723195e-05f, +1.640363429e-05f, +8.314744426e-05f, +1.688730729e-04f, +2.621942529e-04f, +3.458521059e-04f, +3.990865308e-04f, +4.014510391e-04f, +3.374265890e-04f, +2.008707909e-04f, -1.780494609e-06f, -2.505034276e-04f, -5.134198790e-04f, -7.512510354e-04f, -9.238362079e-04f, -9.975266025e-04f, -9.519634345e-04f, -7.847744671e-04f, -5.130870425e-04f, -1.713898858e-04f, +1.939579981e-04f, +5.325504297e-04f, +7.985583642e-04f, +9.584483003e-04f, +9.962869878e-04f, +9.156520545e-04f, +7.378987183e-04f, +4.972955074e-04f, +2.341627031e-04f, -1.250881596e-05f, -2.114775483e-04f, -3.435477730e-04f, -4.031259119e-04f, -3.970524453e-04f, -3.412918803e-04f, -2.564415329e-04f, -1.631418845e-04f, -7.833716240e-05f, -1.300615846e-05f, +2.843820685e-05f, +4.728437245e-05f, +4.868642484e-05f, +3.947563984e-05f, +2.619302792e-05f, - /* 1, 8 (48) */ - -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f, - +4.999457957e-04f, +1.033580484e-03f, +1.752961117e-03f, +2.538803326e-03f, +3.162428497e-03f, +3.297230410e-03f, +2.564170012e-03f, +6.101172529e-04f, -2.791909114e-03f, -7.640622167e-03f, -1.362811762e-02f, -2.011088080e-02f, -2.614892927e-02f, -3.061895965e-02f, -3.239073675e-02f, -3.053931896e-02f, -2.455324555e-02f, -1.449413070e-02f, -1.068243873e-03f, +1.441462496e-02f, +3.019803133e-02f, +4.433036385e-02f, +5.496869433e-02f, +6.067957615e-02f, +6.067957615e-02f, +5.496869433e-02f, +4.433036385e-02f, +3.019803133e-02f, +1.441462496e-02f, -1.068243873e-03f, -1.449413070e-02f, -2.455324555e-02f, -3.053931896e-02f, -3.239073675e-02f, -3.061895965e-02f, -2.614892927e-02f, -2.011088080e-02f, -1.362811762e-02f, -7.640622167e-03f, -2.791909114e-03f, +6.101172529e-04f, +2.564170012e-03f, +3.297230410e-03f, +3.162428497e-03f, +2.538803326e-03f, +1.752961117e-03f, +1.033580484e-03f, +4.999457957e-04f, - +1.309052541e-05f, +1.525614110e-05f, +1.530425055e-05f, +1.206764059e-05f, +4.368217600e-06f, -8.846445392e-06f, -2.835397865e-05f, -5.451153963e-05f, -8.713136950e-05f, -1.253950564e-04f, -1.678214700e-04f, -2.122987367e-04f, -2.561843375e-04f, -2.964700822e-04f, -3.300011559e-04f, -3.537315574e-04f, -3.649929210e-04f, -3.617506595e-04f, -3.428210784e-04f, -3.080257478e-04f, -2.582648130e-04f, -1.954985477e-04f, -1.226355145e-04f, -4.333519473e-05f, +3.825818285e-05f, +1.178266614e-04f, +1.912057239e-04f, +2.546971958e-04f, +3.053389846e-04f, +3.411073257e-04f, +3.610342947e-04f, +3.652321423e-04f, +3.548254937e-04f, +3.318015757e-04f, +2.987963721e-04f, +2.588401603e-04f, +2.150887015e-04f, +1.705662467e-04f, +1.279436332e-04f, +8.936953796e-05f, +5.636615021e-05f, +2.979298624e-05f, +9.875198106e-06f, -3.713643442e-06f, -1.172902759e-05f, -1.521062582e-05f, -1.533288052e-05f, -1.326725904e-05f, - -2.619302792e-05f, -3.947563984e-05f, -4.868642484e-05f, -4.728437245e-05f, -2.843820685e-05f, +1.300615846e-05f, +7.833716240e-05f, +1.631418845e-04f, +2.564415329e-04f, +3.412918803e-04f, +3.970524453e-04f, +4.031259119e-04f, +3.435477730e-04f, +2.114775483e-04f, +1.250881596e-05f, -2.341627031e-04f, -4.972955074e-04f, -7.378987183e-04f, -9.156520545e-04f, -9.962869878e-04f, -9.584483003e-04f, -7.985583642e-04f, -5.325504297e-04f, -1.939579981e-04f, +1.713898858e-04f, +5.130870425e-04f, +7.847744671e-04f, +9.519634345e-04f, +9.975266025e-04f, +9.238362079e-04f, +7.512510354e-04f, +5.134198790e-04f, +2.505034276e-04f, +1.780494609e-06f, -2.008707909e-04f, -3.374265890e-04f, -4.014510391e-04f, -3.990865308e-04f, -3.458521059e-04f, -2.621942529e-04f, -1.688730729e-04f, -8.314744426e-05f, -1.640363429e-05f, +2.654723195e-05f, +4.668399238e-05f, +4.898271918e-05f, +4.023226211e-05f, +2.703900717e-05f, - /* 1, 9 (48) */ - -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f, - +4.737527678e-04f, +9.941048444e-04f, +1.704274692e-03f, +2.491518953e-03f, +3.133990291e-03f, +3.310236568e-03f, +2.642507175e-03f, +7.732591374e-04f, -2.535467581e-03f, -7.299330287e-03f, -1.323106518e-02f, -1.970775489e-02f, -2.580538150e-02f, -3.040748210e-02f, -3.237822794e-02f, -3.077348167e-02f, -2.505054105e-02f, -1.523202942e-02f, -1.983895928e-03f, +1.341833798e-02f, +2.923958303e-02f, +4.353180549e-02f, +5.443614390e-02f, +6.048561815e-02f, +6.085096604e-02f, +5.548178137e-02f, +4.511513832e-02f, +3.114999476e-02f, +1.541215157e-02f, -1.444076651e-04f, -1.374287967e-02f, -2.403982567e-02f, -3.028881553e-02f, -3.238895626e-02f, -3.081983044e-02f, -2.648635586e-02f, -2.051233184e-02f, -1.402720415e-02f, -7.986474273e-03f, -3.054103367e-03f, +4.412441800e-04f, +2.481022568e-03f, +3.280826776e-03f, +3.188975729e-03f, +2.585487318e-03f, +1.801943836e-03f, +1.073812746e-03f, +5.269848029e-04f, - +1.290966885e-05f, +1.517117127e-05f, +1.538504899e-05f, +1.238878055e-05f, +5.001158613e-06f, -7.842411460e-06f, -2.694112611e-05f, -5.268237913e-05f, -8.491546506e-05f, -1.228629477e-04f, -1.650848794e-04f, -2.095065816e-04f, -2.535145019e-04f, -2.941173722e-04f, -3.281623292e-04f, -3.525887067e-04f, -3.646967662e-04f, -3.624054162e-04f, -3.444725018e-04f, -3.106537038e-04f, -2.617813169e-04f, -1.997516844e-04f, -1.274190627e-04f, -4.840319232e-05f, +3.317321082e-05f, +1.129934779e-04f, +1.868740351e-04f, +2.510790765e-04f, +3.025937756e-04f, +3.393313383e-04f, +3.602561561e-04f, +3.654140322e-04f, +3.558699317e-04f, +3.335628777e-04f, +3.010954694e-04f, +2.614812022e-04f, +2.178757715e-04f, +1.733186168e-04f, +1.305082307e-04f, +9.162968470e-05f, +5.824608692e-05f, +3.125817198e-05f, +1.092881336e-05f, -3.037205637e-06f, -1.137266132e-05f, -1.510388072e-05f, -1.540111268e-05f, -1.343963384e-05f, - -2.535104299e-05f, -3.870367843e-05f, -4.834879674e-05f, -4.781607847e-05f, -3.023963922e-05f, +9.703881282e-06f, +7.360514409e-05f, +1.574458887e-04f, +2.506570728e-04f, +3.366180478e-04f, +3.948227641e-04f, +4.045413228e-04f, +3.493816578e-04f, +2.218184512e-04f, +2.660775875e-05f, -2.178888888e-04f, -4.810836044e-04f, -7.242989091e-04f, -9.070842565e-04f, -9.945786815e-04f, -9.644499142e-04f, -8.119218791e-04f, -5.517261887e-04f, -2.164200722e-04f, +1.487280397e-04f, +4.933462266e-04f, +7.705765934e-04f, +9.449969818e-04f, +9.982944087e-04f, +9.316296518e-04f, +7.643463472e-04f, +5.294465871e-04f, +2.669020884e-04f, +1.625373835e-05f, -1.900013194e-04f, -3.310179034e-04f, -3.995137393e-04f, -4.009203018e-04f, -3.502934252e-04f, -2.679104263e-04f, -1.746359106e-04f, -8.803407223e-05f, -1.989597317e-05f, +2.456582673e-05f, +4.601335413e-05f, +4.923593954e-05f, +4.097207601e-05f, +2.788802465e-05f, - /* 1,10 (48) */ - -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f, - +4.484017248e-04f, +9.554011660e-04f, +1.655925896e-03f, +2.443702875e-03f, +3.103750651e-03f, +3.319940450e-03f, +2.716112319e-03f, +9.307050260e-04f, -2.284810508e-03f, -6.962712239e-03f, -1.283624241e-02f, -1.930321357e-02f, -2.545599984e-02f, -3.018566365e-02f, -3.235162018e-02f, -3.099137055e-02f, -2.553162466e-02f, -1.595632833e-02f, -2.890980184e-03f, +1.242375929e-02f, +2.827513312e-02f, +4.271988361e-02f, +5.388441771e-02f, +6.026919808e-02f, +6.099969408e-02f, +5.597512760e-02f, +4.588571491e-02f, +3.209499175e-02f, +1.641044598e-02f, +7.872219866e-04f, -1.297853332e-02f, -2.351037908e-02f, -3.002191345e-02f, -3.237270252e-02f, -3.100983176e-02f, -2.681737377e-02f, -2.091184558e-02f, -1.442812445e-02f, -8.336767698e-03f, -3.322013793e-03f, +2.666082695e-04f, +2.392988496e-03f, +3.260930802e-03f, +3.213541556e-03f, +2.631500672e-03f, +1.851179776e-03f, +1.114784822e-03f, +5.548728275e-04f, - +1.272492213e-05f, +1.507824593e-05f, +1.545331501e-05f, +1.269272958e-05f, +5.612701183e-06f, -6.862946083e-06f, -2.555439710e-05f, -5.087878289e-05f, -8.272210008e-05f, -1.203477449e-04f, -1.623570592e-04f, -2.067129352e-04f, -2.508314194e-04f, -2.917390162e-04f, -3.262858124e-04f, -3.513975353e-04f, -3.643440891e-04f, -3.629987460e-04f, -3.460615178e-04f, -3.132225075e-04f, -2.652461110e-04f, -2.039643239e-04f, -1.321763393e-04f, -5.346112415e-05f, +2.808133519e-05f, +1.081369454e-04f, +1.825043147e-04f, +2.474110810e-04f, +2.997904985e-04f, +3.374932277e-04f, +3.594160939e-04f, +3.655382063e-04f, +3.568642973e-04f, +3.352843568e-04f, +3.033666037e-04f, +2.641066927e-04f, +2.206592368e-04f, +1.760779795e-04f, +1.330883916e-04f, +9.391151370e-05f, +6.015121602e-05f, +3.274955044e-05f, +1.200742830e-05f, -2.338678028e-06f, -1.099826356e-05f, -1.498372103e-05f, -1.546055886e-05f, -1.360741082e-05f, - -2.451397293e-05f, -3.791782005e-05f, -4.797156900e-05f, -4.828071952e-05f, -3.195247673e-05f, +6.497048873e-06f, +6.895320271e-05f, +1.517885333e-04f, +2.448456191e-04f, +3.318359064e-04f, +3.924022771e-04f, +4.057003792e-04f, +3.549286412e-04f, +2.318905738e-04f, +4.051009021e-05f, -2.016908352e-04f, -4.647942795e-04f, -7.104612148e-04f, -8.981400810e-04f, -9.924050797e-04f, -9.699669182e-04f, -8.248588837e-04f, -5.706043144e-04f, -2.387638760e-04f, +1.259848280e-04f, +4.733383682e-04f, +7.559714225e-04f, +9.375509149e-04f, +9.985875726e-04f, +9.390255295e-04f, +7.771752413e-04f, +5.453654837e-04f, +2.833495928e-04f, +3.090429259e-05f, -1.788724890e-04f, -3.243217116e-04f, -3.973111934e-04f, -4.025491149e-04f, -3.546105412e-04f, -2.735851890e-04f, -1.804267603e-04f, -9.299502465e-05f, -2.348274851e-05f, +2.249316533e-05f, +4.527090066e-05f, +4.944434125e-05f, +4.169358615e-05f, +2.873908892e-05f, - /* 1,11 (48) */ - -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f, - +4.238877519e-04f, +9.174833459e-04f, +1.607954327e-03f, +2.395422155e-03f, +3.071798175e-03f, +3.326437498e-03f, +2.785065521e-03f, +1.082493559e-03f, -2.039964889e-03f, -6.630876333e-03f, -1.244384013e-02f, -1.889751319e-02f, -2.510107120e-02f, -2.995377308e-02f, -3.231111009e-02f, -3.119306139e-02f, -2.599641894e-02f, -1.666678955e-02f, -3.789120265e-03f, +1.143135421e-02f, +2.730516620e-02f, +4.189502473e-02f, +5.331381339e-02f, +6.003043421e-02f, +6.112567891e-02f, +5.644846596e-02f, +4.664168634e-02f, +3.303254266e-02f, +1.740903355e-02f, +1.726247516e-03f, -1.220135808e-02f, -2.296501360e-02f, -2.973856385e-02f, -3.234179823e-02f, -3.118870425e-02f, -2.714169548e-02f, -2.130915678e-02f, -1.483067357e-02f, -8.691378240e-03f, -3.595598982e-03f, +8.618150913e-05f, +2.299993471e-03f, +3.237448054e-03f, +3.236034722e-03f, +2.676771573e-03f, +1.900624117e-03f, +1.156478409e-03f, +5.836119165e-04f, - +1.253651480e-05f, +1.497763796e-05f, +1.550934211e-05f, +1.297977154e-05f, +6.203084070e-06f, -5.907892698e-06f, -2.419375182e-05f, -4.910085537e-05f, -8.055153976e-05f, -1.178498758e-04f, -1.596385855e-04f, -2.039184901e-04f, -2.481358533e-04f, -2.893357895e-04f, -3.243723279e-04f, -3.501586466e-04f, -3.639353135e-04f, -3.635308455e-04f, -3.475880652e-04f, -3.157318305e-04f, -2.686586134e-04f, -2.081356675e-04f, -1.369063854e-04f, -5.850794175e-05f, +2.298361455e-05f, +1.032580523e-04f, +1.780974071e-04f, +2.436938494e-04f, +2.969295472e-04f, +3.355931220e-04f, +3.585139737e-04f, +3.656042935e-04f, +3.578080270e-04f, +3.369653145e-04f, +3.056090065e-04f, +2.667158598e-04f, +2.234383818e-04f, +1.788437260e-04f, +1.356836490e-04f, +9.621471868e-05f, +6.208139387e-05f, +3.426712759e-05f, +1.311117335e-05f, -1.617838952e-06f, -1.060555829e-05f, -1.484985257e-05f, -1.551093858e-05f, -1.377034793e-05f, - -2.368270267e-05f, -3.711947890e-05f, -4.755646799e-05f, -4.867992751e-05f, -3.357772476e-05f, +3.385819329e-06f, +6.438304794e-05f, +1.461731693e-04f, +2.390118549e-04f, +3.269507481e-04f, +3.897958401e-04f, +4.066063268e-04f, +3.601893137e-04f, +2.416912049e-04f, +5.420976061e-05f, -1.855772631e-04f, -4.484376120e-04f, -6.963953288e-04f, -8.888269914e-04f, -9.897698548e-04f, -9.749982615e-04f, -8.373635309e-04f, -5.891750020e-04f, -2.609772578e-04f, +1.031726744e-04f, +4.530740344e-04f, +7.409659036e-04f, +9.296275127e-04f, +9.984035460e-04f, +9.460171984e-04f, +7.897284134e-04f, +5.611664122e-04f, +2.998367356e-04f, +4.572534974e-05f, -1.674878689e-04f, -3.173382086e-04f, -3.948407330e-04f, -4.039684070e-04f, -3.587981640e-04f, -2.792136228e-04f, -1.862418924e-04f, -9.802817553e-05f, -2.716344140e-05f, +2.032848599e-05f, +4.445510421e-05f, +4.960617699e-05f, +4.239527205e-05f, +2.959117339e-05f, - /* 1,12 (48) */ - -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f, - +4.002050492e-04f, +8.803638670e-04f, +1.560397859e-03f, +2.346742228e-03f, +3.038220450e-03f, +3.329823318e-03f, +2.849448569e-03f, +1.228666729e-03f, -1.800953034e-03f, -6.303925585e-03f, -1.205404429e-02f, -1.849090686e-02f, -2.474088189e-02f, -2.971208187e-02f, -3.225690033e-02f, -3.137863865e-02f, -2.644485655e-02f, -1.736318488e-02f, -4.677947257e-03f, +1.044158436e-02f, +2.633016794e-02f, +4.105766120e-02f, +5.272463839e-02f, +5.976945695e-02f, +6.122885158e-02f, +5.690154000e-02f, +4.738265224e-02f, +3.396217017e-02f, +1.840743709e-02f, +2.672264714e-03f, -1.141162967e-02f, -2.240384718e-02f, -2.943872712e-02f, -3.229607288e-02f, -3.135619212e-02f, -2.745903369e-02f, -2.170399751e-02f, -1.523464198e-02f, -9.050176404e-03f, -3.874812605e-03f, -1.000603833e-04f, +2.201965296e-03f, +3.210284612e-03f, +3.256363208e-03f, +2.721226677e-03f, +1.950230294e-03f, +1.198873681e-03f, +6.132030899e-04f, - +1.234467317e-05f, +1.486961808e-05f, +1.555342333e-05f, +1.325019189e-05f, +6.772549939e-06f, -4.977088548e-06f, -2.285914223e-05f, -4.734869143e-05f, -7.840403901e-05f, -1.153697583e-04f, -1.569300258e-04f, -2.011239334e-04f, -2.454285640e-04f, -2.869084686e-04f, -3.224226032e-04f, -3.488726530e-04f, -3.634708763e-04f, -3.640019265e-04f, -3.490520992e-04f, -3.181813609e-04f, -2.720182574e-04f, -2.122649289e-04f, -1.416082500e-04f, -6.354259999e-05f, +1.788110924e-05f, +9.835779378e-05f, +1.736541678e-04f, +2.399280361e-04f, +2.940113321e-04f, +3.336311662e-04f, +3.575496773e-04f, +3.656119364e-04f, +3.587005674e-04f, +3.386050587e-04f, +3.078219119e-04f, +2.693079297e-04f, +2.262124861e-04f, +1.816152396e-04f, +1.382935265e-04f, +9.853898309e-05f, +6.403646691e-05f, +3.581090067e-05f, +1.424017206e-05f, -8.744713867e-07f, -1.019427178e-05f, -1.470198130e-05f, -1.555196970e-05f, -1.392820018e-05f, - -2.285808138e-05f, -3.631004035e-05f, -4.710521070e-05f, -4.901535501e-05f, -3.511644428e-05f, +3.702643188e-07f, +5.989628606e-05f, +1.406030499e-04f, +2.331603972e-04f, +3.219678548e-04f, +3.870083707e-04f, +4.072625452e-04f, +3.651644562e-04f, +2.512178480e-04f, +6.770091667e-05f, -1.695567592e-04f, -4.320236446e-04f, -6.821110234e-04f, -8.791526409e-04f, -9.866769511e-04f, -9.795432004e-04f, -8.494302580e-04f, -6.074286538e-04f, -2.830481549e-04f, +8.030404950e-05f, +4.325639655e-04f, +7.255672513e-04f, +9.212293605e-04f, +9.977400699e-04f, +9.525982357e-04f, +8.019966748e-04f, +5.768392143e-04f, +3.163542042e-04f, +6.070992062e-05f, -1.558512420e-04f, -3.100677915e-04f, -3.920998434e-04f, -4.051736998e-04f, -3.628510148e-04f, -2.847907589e-04f, -1.920774861e-04f, -1.031312945e-04f, -3.093743924e-05f, +1.807109303e-05f, +4.356446846e-05f, +4.971969849e-05f, +4.307558912e-05f, +3.044321659e-05f, - /* 1,13 (48) */ - -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f, - +3.773469678e-04f, +8.440538267e-04f, +1.513292648e-03f, +2.297726873e-03f, +3.003104006e-03f, +3.330193582e-03f, +2.909344855e-03f, +1.369269778e-03f, -1.567792637e-03f, -5.981957730e-03f, -1.166703592e-02f, -1.808364432e-02f, -2.437571743e-02f, -2.946086403e-02f, -3.218919941e-02f, -3.154819541e-02f, -2.687688019e-02f, -1.804529590e-02f, -5.557099897e-03f, +9.454907409e-03f, +2.535062474e-02f, +4.020823094e-02f, +5.211720974e-02f, +5.948640879e-02f, +6.130915563e-02f, +5.733410396e-02f, +4.810821949e-02f, +3.488339953e-02f, +1.940517716e-02f, +3.624862950e-03f, -1.060963299e-02f, -2.182700797e-02f, -2.912237291e-02f, -3.223536296e-02f, -3.151204336e-02f, -2.776910148e-02f, -2.209609735e-02f, -1.563981567e-02f, -9.413027418e-03f, -4.159603364e-03f, -2.921378694e-04f, +2.098834001e-03f, +3.179347173e-03f, +3.274434301e-03f, +2.764791145e-03f, +1.999949993e-03f, +1.241949270e-03f, +6.436463064e-04f, - +1.214962021e-05f, +1.475445480e-05f, +1.558585112e-05f, +1.350427756e-05f, +7.321345221e-06f, -4.070364810e-06f, -2.155051224e-05f, -4.562237634e-05f, -7.627984250e-05f, -1.129078005e-04f, -1.542319388e-04f, -1.983299454e-04f, -2.427103092e-04f, -2.844578309e-04f, -3.204373710e-04f, -3.475401762e-04f, -3.629512268e-04f, -3.644122164e-04f, -3.504535917e-04f, -3.205708032e-04f, -2.753244915e-04f, -2.163513340e-04f, -1.462809907e-04f, -6.856405736e-05f, +1.277488105e-05f, +9.343717126e-05f, +1.691754631e-04f, +2.361143096e-04f, +2.910362794e-04f, +3.316075217e-04f, +3.565231022e-04f, +3.655607915e-04f, +3.595413759e-04f, +3.402029042e-04f, +3.100045565e-04f, +2.718821271e-04f, +2.289808241e-04f, +1.843918961e-04f, +1.409175379e-04f, +1.008839801e-04f, +6.601627161e-05f, +3.738085809e-05f, +1.539454099e-05f, -1.083630892e-07f, -9.764132757e-06f, -1.453981342e-05f, -1.558336850e-05f, -1.408071968e-05f, - -2.204092248e-05f, -3.549086016e-05f, -4.661950316e-05f, -4.928867322e-05f, -3.656974964e-05f, -2.549629309e-06f, +5.549442053e-05f, +1.350813291e-04f, +2.272957940e-04f, +3.168924946e-04f, +3.840448432e-04f, +4.076725437e-04f, +3.698550369e-04f, +2.604682208e-04f, +8.097790407e-05f, -1.536377706e-04f, -4.155623762e-04f, -6.676181426e-04f, -8.691248663e-04f, -9.831305814e-04f, -9.836012974e-04f, -8.610537897e-04f, -6.253558851e-04f, -3.049646014e-04f, +5.739146255e-05f, +4.118190680e-04f, +7.097829418e-04f, +9.123593490e-04f, +9.965951766e-04f, +9.587624439e-04f, +8.139709591e-04f, +5.923737374e-04f, +3.328925852e-04f, +7.585083792e-05f, -1.439666045e-04f, -3.025110613e-04f, -3.890861680e-04f, -4.061606045e-04f, -3.667638307e-04f, -2.903115805e-04f, -1.979296317e-04f, -1.083020469e-04f, -3.480403449e-05f, +1.572035894e-05f, +4.259753072e-05f, +4.978315839e-05f, +4.373296981e-05f, +3.129412251e-05f, - /* 1,14 (48) */ - -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f, - +3.553060453e-04f, +8.085629665e-04f, +1.466673145e-03f, +2.248438199e-03f, +2.966534256e-03f, +3.327643953e-03f, +2.964839276e-03f, +1.504351108e-03f, -1.340496843e-03f, -5.665065235e-03f, -1.128299108e-02f, -1.767597177e-02f, -2.400586239e-02f, -2.920039581e-02f, -3.210822151e-02f, -3.170183318e-02f, -2.729244257e-02f, -1.871291404e-02f, -6.426224764e-03f, +8.471776828e-03f, +2.436702344e-02f, +3.934717715e-02f, +5.149185385e-02f, +5.918144419e-02f, +6.136654709e-02f, +5.774592303e-02f, +4.881800243e-02f, +3.579575888e-02f, +2.040177234e-02f, +4.583625394e-03f, -9.795662033e-03f, -2.123463423e-02f, -2.878948033e-02f, -3.215951212e-02f, -3.165600997e-02f, -2.807161254e-02f, -2.248518352e-02f, -1.604597628e-02f, -9.779791249e-03f, -4.449914944e-03f, -4.900675011e-04f, +1.990531954e-03f, +3.144543139e-03f, +3.290154659e-03f, +2.807388676e-03f, +2.049733151e-03f, +1.285682239e-03f, +6.749404290e-04f, - +1.195157556e-05f, +1.463241434e-05f, +1.560691722e-05f, +1.374231680e-05f, +7.849719961e-06f, -3.187546744e-06f, -2.026779777e-05f, -4.392198589e-05f, -7.417918467e-05f, -1.104644002e-04f, -1.515448748e-04f, -1.955372004e-04f, -2.399818431e-04f, -2.819846545e-04f, -3.184173686e-04f, -3.461618466e-04f, -3.623768266e-04f, -3.647619571e-04f, -3.517925311e-04f, -3.228998788e-04f, -2.785767791e-04f, -2.203941213e-04f, -1.509236733e-04f, -7.357127629e-05f, +7.665992852e-06f, +8.849719227e-05f, +1.646621696e-04f, +2.322533521e-04f, +2.880048316e-04f, +3.295223672e-04f, +3.554341621e-04f, +3.654505292e-04f, +3.603299209e-04f, +3.417581727e-04f, +3.121561799e-04f, +2.744376758e-04f, +2.317426657e-04f, +1.871730634e-04f, +1.435551879e-04f, +1.032493727e-04f, +6.802063440e-05f, +3.897697936e-05f, +1.657438954e-05f, +6.806932534e-07f, -9.314872538e-06f, -1.436305556e-05f, -1.560484981e-05f, -1.422765568e-05f, - -2.123200363e-05f, -3.466326372e-05f, -4.610103897e-05f, -4.950156984e-05f, -3.793880645e-05f, -5.373957843e-06f, +5.117885245e-05f, +1.296110609e-04f, +2.214225220e-04f, +3.117299173e-04f, +3.809102841e-04f, +4.078399572e-04f, +3.742622091e-04f, +2.694402545e-04f, +9.403526962e-05f, -1.378286001e-04f, -3.990637556e-04f, -6.529265948e-04f, -8.587516819e-04f, -9.791352228e-04f, -9.871724207e-04f, -8.722291410e-04f, -6.429475305e-04f, -3.267147364e-04f, +3.444745270e-05f, +3.908504078e-04f, +6.936207075e-04f, +9.030206730e-04f, +9.949671927e-04f, +9.645038563e-04f, +8.256423296e-04f, +6.077598419e-04f, +3.494423697e-04f, +9.114075986e-05f, -1.318381643e-04f, -2.946688243e-04f, -3.857975120e-04f, -4.069248265e-04f, -3.705313687e-04f, -2.957710268e-04f, -2.037943320e-04f, -1.135379940e-04f, -3.876242354e-05f, +1.327572638e-05f, +4.155286413e-05f, +4.979481204e-05f, +4.436582473e-05f, +3.214276087e-05f, - /* 1,15 (48) */ - -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f, - +3.340740417e-04f, +7.738997028e-04f, +1.420572106e-03f, +2.198936630e-03f, +2.928595450e-03f, +3.322269995e-03f, +3.016018128e-03f, +1.633962169e-03f, -1.119074321e-03f, -5.353335318e-03f, -1.090208080e-02f, -1.726813182e-02f, -2.363160019e-02f, -2.893095555e-02f, -3.201418624e-02f, -3.183966178e-02f, -2.769150633e-02f, -1.936584064e-02f, -7.284976446e-03f, +7.492641605e-03f, +2.337985102e-02f, +3.847494801e-02f, +5.084890632e-02f, +5.885472945e-02f, +6.140099454e-02f, +5.813677344e-02f, +4.951162314e-02f, +3.669877956e-02f, +2.139673953e-02f, +5.548129250e-03f, -8.970019704e-03f, -2.062687439e-02f, -2.844003796e-02f, -3.206837136e-02f, -3.178784813e-02f, -2.836628136e-02f, -2.287098103e-02f, -1.645290111e-02f, -1.015032262e-02f, -4.745685971e-03f, -6.938618331e-04f, +1.876993960e-03f, +3.105780715e-03f, +3.303430386e-03f, +2.848941540e-03f, +2.099527963e-03f, +1.330048064e-03f, +7.070831898e-04f, - +1.175075544e-05f, +1.450376051e-05f, +1.561691254e-05f, +1.396459906e-05f, +8.357927672e-06f, -2.328453823e-06f, -1.901092689e-05f, -4.224758644e-05f, -7.210228972e-05f, -1.080399453e-04f, -1.488693749e-04f, -1.927463657e-04f, -2.372439164e-04f, -2.794897176e-04f, -3.163633379e-04f, -3.447383033e-04f, -3.617481497e-04f, -3.650514058e-04f, -3.530689224e-04f, -3.251683254e-04f, -2.817745994e-04f, -2.243925418e-04f, -1.555353731e-04f, -7.856322346e-05f, +2.555508337e-06f, +8.353887009e-05f, +1.601151740e-04f, +2.283458597e-04f, +2.849174469e-04f, +3.273758978e-04f, +3.542827868e-04f, +3.652808343e-04f, +3.610656819e-04f, +3.432701935e-04f, +3.142760250e-04f, +2.769737986e-04f, +2.344972762e-04f, +1.899581021e-04f, +1.462059716e-04f, +1.056348136e-04f, +7.004937168e-05f, +4.059923501e-05f, +1.777981991e-05f, +1.492899882e-06f, -8.846225192e-06f, -1.417141484e-05f, -1.561612709e-05f, -1.436875469e-05f, - -2.043206678e-05f, -3.382854534e-05f, -4.555149778e-05f, -4.965574704e-05f, -3.922482936e-05f, -8.102898992e-06f, +4.695088128e-05f, +1.241951985e-04f, +2.155449835e-04f, +3.064853506e-04f, +3.776097676e-04f, +4.077685417e-04f, +3.783873075e-04f, +2.781320935e-04f, +1.068677635e-04f, -1.221374013e-04f, -3.825376741e-04f, -6.380463451e-04f, -8.480412722e-04f, -9.746956122e-04f, -9.902567432e-04f, -8.829516200e-04f, -6.601946496e-04f, -3.482868123e-04f, +1.148458052e-05f, +3.696692020e-04f, +6.770885329e-04f, +8.932168303e-04f, +9.928547411e-04f, +9.698167423e-04f, +8.370019861e-04f, +6.229874085e-04f, +3.659939596e-04f, +1.065721740e-04f, -1.194703409e-04f, -2.865420942e-04f, -3.822318455e-04f, -4.074621699e-04f, -3.741484107e-04f, -3.011639964e-04f, -2.096675045e-04f, -1.188365932e-04f, -4.281170552e-05f, +1.073671011e-05f, +4.042907987e-05f, +4.975291943e-05f, +4.497254386e-05f, +3.298796763e-05f, - /* 2, 0 (48) */ - +2.604271951e-04f, +6.520713960e-04f, +1.184392264e-03f, +1.737066681e-03f, +2.100859845e-03f, +2.003596444e-03f, +1.168352244e-03f, -6.020526720e-04f, -3.329654867e-03f, -6.777842271e-03f, -1.040531144e-02f, -1.337949151e-02f, -1.466132590e-02f, -1.315819186e-02f, -7.924759808e-03f, +1.623190098e-03f, +1.552555605e-02f, +3.316834873e-02f, +5.328028472e-02f, +7.404900985e-02f, +9.334657971e-02f, +1.090303366e-01f, +1.192675993e-01f, +1.228249582e-01f, +1.192675993e-01f, +1.090303366e-01f, +9.334657971e-02f, +7.404900985e-02f, +5.328028472e-02f, +3.316834873e-02f, +1.552555605e-02f, +1.623190098e-03f, -7.924759808e-03f, -1.315819186e-02f, -1.466132590e-02f, -1.337949151e-02f, -1.040531144e-02f, -6.777842271e-03f, -3.329654867e-03f, -6.020526720e-04f, +1.168352244e-03f, +2.003596444e-03f, +2.100859845e-03f, +1.737066681e-03f, +1.184392264e-03f, +6.520713960e-04f, +2.604271951e-04f, +4.414624996e-05f, - +7.781537535e-05f, -5.172646125e-04f, -1.673334699e-03f, -3.203343269e-03f, -4.525223175e-03f, -4.733635501e-03f, -2.892950492e-03f, +1.502882723e-03f, +8.068686861e-03f, +1.529267543e-02f, +2.072324747e-02f, +2.163579289e-02f, +1.603304991e-02f, +3.643522741e-03f, -1.349956937e-02f, -3.123170394e-02f, -4.427068528e-02f, -4.783283965e-02f, -3.933589198e-02f, -1.956599624e-02f, +7.183458326e-03f, +3.415533317e-02f, +5.408068209e-02f, +6.141247912e-02f, +5.408068209e-02f, +3.415533317e-02f, +7.183458326e-03f, -1.956599624e-02f, -3.933589198e-02f, -4.783283965e-02f, -4.427068528e-02f, -3.123170394e-02f, -1.349956937e-02f, +3.643522741e-03f, +1.603304991e-02f, +2.163579289e-02f, +2.072324747e-02f, +1.529267543e-02f, +8.068686861e-03f, +1.502882723e-03f, -2.892950492e-03f, -4.733635501e-03f, -4.525223175e-03f, -3.203343269e-03f, -1.673334699e-03f, -5.172646125e-04f, +7.781537535e-05f, +2.181178524e-04f, - -1.861921294e-05f, -2.935641677e-05f, -3.558150459e-05f, -3.158285468e-05f, -1.222960999e-05f, +2.503188561e-05f, +7.823735817e-05f, +1.396181328e-04f, +1.955291828e-04f, +2.279424392e-04f, +2.175040677e-04f, +1.477345693e-04f, +9.568295641e-06f, -1.948056840e-04f, -4.498423675e-04f, -7.270596416e-04f, -9.882682428e-04f, -1.191284773e-03f, -1.297192640e-03f, -1.277772188e-03f, -1.121562690e-03f, -8.372037069e-04f, -4.532080721e-04f, -1.404008886e-05f, +4.268500357e-04f, +8.157300226e-04f, +1.107344162e-03f, +1.272031343e-03f, +1.299863938e-03f, +1.201110195e-03f, +1.003097751e-03f, +7.442858238e-04f, +4.668757046e-04f, +2.094955744e-04f, +1.357624045e-06f, -1.411433911e-04f, -2.150221760e-04f, -2.287403927e-04f, -1.984454053e-04f, -1.434426938e-04f, -8.194761206e-05f, -2.793995439e-05f, +1.043135282e-05f, +3.086690169e-05f, +3.569114798e-05f, +2.993458524e-05f, +1.932478483e-05f, +8.681311338e-06f, - +1.998192572e-05f, +5.366299909e-05f, +8.706161150e-05f, +9.756320015e-05f, +6.036928359e-05f, -3.840748395e-05f, -1.882964467e-04f, -3.478457341e-04f, -4.509453262e-04f, -4.276011519e-04f, -2.339151312e-04f, +1.199645104e-04f, +5.572247964e-04f, +9.466604647e-04f, +1.140419444e-03f, +1.026779123e-03f, +5.791249940e-04f, -1.192580046e-04f, -8.880415694e-04f, -1.500328102e-03f, -1.755708558e-03f, -1.550547714e-03f, -9.192008225e-04f, -2.934142660e-05f, +8.688298676e-04f, +1.522442131e-03f, +1.756756523e-03f, +1.528432751e-03f, +9.332679948e-04f, +1.675029973e-04f, -5.413682538e-04f, -1.008289421e-03f, -1.143110919e-03f, -9.659588702e-04f, -5.845172747e-04f, -1.459931441e-04f, +2.160313154e-04f, +4.206999836e-04f, +4.538433513e-04f, +3.567067284e-04f, +1.985764530e-04f, +4.655048215e-05f, -5.603767555e-05f, -9.686533432e-05f, -8.865826890e-05f, -5.595251495e-05f, -2.179569405e-05f, +3.782715170e-07f, - /* 2, 1 (48) */ - +2.418079821e-04f, +6.227149792e-04f, +1.148810760e-03f, +1.705483827e-03f, +2.088630235e-03f, +2.028628330e-03f, +1.246589602e-03f, -4.624345392e-04f, -3.134125684e-03f, -6.549899832e-03f, -1.018780737e-02f, -1.323175694e-02f, -1.465175760e-02f, -1.335299754e-02f, -8.374602175e-03f, +8.961304561e-04f, +1.453728781e-02f, +3.197706396e-02f, +5.198309208e-02f, +7.277123767e-02f, +9.222501702e-02f, +1.081931329e-01f, +1.188143913e-01f, +1.228109182e-01f, +1.196944494e-01f, +1.098460666e-01f, +9.445392387e-02f, +7.532104120e-02f, +5.458014866e-02f, +3.436945893e-02f, +1.652865380e-02f, +2.367475921e-03f, -7.457884103e-03f, -1.294869628e-02f, -1.465996827e-02f, -1.352063490e-02f, -1.062033362e-02f, -7.006582663e-03f, -3.528100272e-03f, -7.454953658e-04f, +1.086404632e-03f, +1.975656490e-03f, +2.111291198e-03f, +1.767933583e-03f, +1.220083412e-03f, +6.820059812e-04f, +2.797519799e-04f, +5.282756130e-05f, - +9.779730107e-05f, -4.636016135e-04f, -1.586273087e-03f, -3.105780069e-03f, -4.464853891e-03f, -4.772042985e-03f, -3.081246939e-03f, +1.155036989e-03f, +7.617741535e-03f, +1.486507428e-02f, +2.048933234e-02f, +2.175575740e-02f, +1.659027470e-02f, +4.590183206e-03f, -1.235914992e-02f, -3.020492482e-02f, -4.369156029e-02f, -4.795209765e-02f, -4.022393355e-02f, -2.106632434e-02f, +5.427749768e-03f, +3.260478545e-02f, +5.316148127e-02f, +6.138313770e-02f, +5.494951196e-02f, +3.567777530e-02f, +8.940214849e-03f, -1.803756349e-02f, -3.840262399e-02f, -4.766533665e-02f, -4.481205354e-02f, -3.223999336e-02f, -1.464268029e-02f, +2.677563871e-03f, +1.544853263e-02f, +2.148979975e-02f, +2.093927879e-02f, +1.571337542e-02f, +8.522530212e-03f, +1.859589451e-03f, -2.694374039e-03f, -4.687085019e-03f, -4.581260851e-03f, -3.300208604e-03f, -1.761992968e-03f, -5.732171275e-04f, +5.601968130e-05f, +2.184961239e-04f, - -1.791510520e-05f, -2.876097492e-05f, -3.543175649e-05f, -3.223799159e-05f, -1.395641963e-05f, +2.218803400e-05f, +7.456101461e-05f, +1.357736976e-04f, +1.925216541e-04f, +2.269761809e-04f, +2.197517632e-04f, +1.540548463e-04f, +2.023114846e-05f, -1.803180156e-04f, -4.328989326e-04f, -7.097722906e-04f, -9.732103711e-04f, -1.181076492e-03f, -1.294026224e-03f, -1.282972024e-03f, -1.135274025e-03f, -8.582828770e-04f, -4.793476000e-04f, -4.211344555e-05f, +4.002860127e-04f, +7.938712038e-04f, +1.092623262e-03f, +1.265749200e-03f, +1.302035102e-03f, +1.210544213e-03f, +1.017688552e-03f, +7.614405822e-04f, +4.839904468e-04f, +2.243820990e-04f, +1.254439996e-05f, -1.342803661e-04f, -2.123027569e-04f, -2.293654093e-04f, -2.012655171e-04f, -1.472433373e-04f, -8.568907504e-05f, -3.091105468e-05f, +8.561504587e-06f, +3.008908649e-05f, +3.575925304e-05f, +3.049412176e-05f, +2.003084938e-05f, +9.280428073e-06f, - +1.822048807e-05f, +5.137590333e-05f, +8.537648151e-05f, +9.807124983e-05f, +6.445213413e-05f, -3.047478144e-05f, -1.780628463e-04f, -3.387659360e-04f, -4.475448477e-04f, -4.338187090e-04f, -2.511504331e-04f, +9.428040187e-05f, +5.297516141e-04f, +9.265858312e-04f, +1.136498499e-03f, +1.043926723e-03f, +6.158691211e-04f, -7.130416767e-05f, -8.421951268e-04f, -1.470796584e-03f, -1.752814755e-03f, -1.576943159e-03f, -9.685338654e-04f, -8.799090204e-05f, +8.174770020e-04f, +1.492653966e-03f, +1.755950062e-03f, +1.555070467e-03f, +9.778176877e-04f, +2.159849825e-04f, -5.026339086e-04f, -9.884649509e-04f, -1.144554210e-03f, -9.844462429e-04f, -6.115918602e-04f, -1.723388697e-04f, +1.975100473e-04f, +4.131101015e-04f, +4.562232692e-04f, +3.653305944e-04f, +2.088886799e-04f, +5.489725793e-05f, -5.145637092e-05f, -9.597211052e-05f, -9.015996227e-05f, -5.823979708e-05f, -2.366005660e-05f, -5.623598792e-07f, - /* 2, 2 (48) */ - +2.238928769e-04f, +5.939540043e-04f, +1.113379003e-03f, +1.673245835e-03f, +2.074673816e-03f, +2.050816364e-03f, +1.321150617e-03f, -3.266608416e-04f, -2.941604030e-03f, -6.322923651e-03f, -9.968055609e-03f, -1.307770209e-02f, -1.463152645e-02f, -1.353331556e-02f, -8.807501108e-03f, +1.863581655e-04f, +1.356407744e-02f, +3.079598747e-02f, +5.068906585e-02f, +7.148826564e-02f, +9.108974299e-02f, +1.073348500e-01f, +1.183350437e-01f, +1.227688047e-01f, +1.200947354e-01f, +1.106399378e-01f, +9.554654713e-02f, +7.658679040e-02f, +5.588218376e-02f, +3.558000314e-02f, +1.754634235e-02f, +3.128916504e-03f, -6.973893657e-03f, -1.272431418e-02f, -1.464742387e-02f, -1.365491527e-02f, -1.083263637e-02f, -7.235948073e-03f, -3.729365789e-03f, -8.927387031e-04f, +1.000715557e-03f, +1.944745435e-03f, +2.119852703e-03f, +1.798022669e-03f, +1.255842665e-03f, +7.125001030e-04f, +2.997828293e-04f, +6.210798937e-05f, - +1.160177891e-04f, -4.122257101e-04f, -1.500896606e-03f, -3.007708819e-03f, -4.400401757e-03f, -4.802517767e-03f, -3.259309785e-03f, +8.162710528e-04f, +7.170196687e-03f, +1.443125557e-02f, +2.023818191e-02f, +2.185003780e-02f, +1.712002632e-02f, +5.516769037e-03f, -1.122265142e-02f, -2.916099810e-02f, -4.307569117e-02f, -4.802340182e-02f, -4.106612868e-02f, -2.253712093e-02f, +3.674935013e-03f, +3.102784229e-02f, +5.219294740e-02f, +6.129514680e-02f, +5.576698896e-02f, +3.717042926e-02f, +1.069616491e-02f, -1.648249302e-02f, -3.742480630e-02f, -4.744935167e-02f, -4.531468744e-02f, -3.322845831e-02f, -1.578723449e-02f, +1.693117628e-03f, +1.483694077e-02f, +2.131746088e-02f, +2.113678884e-02f, +1.612648552e-02f, +8.978753482e-03f, +2.224920046e-03f, -2.485485359e-03f, -4.632187761e-03f, -4.632717222e-03f, -3.396180714e-03f, -1.852152930e-03f, -6.314569246e-04f, +3.235962470e-05f, +2.179337640e-04f, - -1.721340283e-05f, -2.814960131e-05f, -3.524334497e-05f, -3.283339796e-05f, -1.561199585e-05f, +1.940949351e-05f, +7.092118880e-05f, +1.319133601e-04f, +1.894276004e-04f, +2.258462928e-04f, +2.217687085e-04f, +1.601053439e-04f, +3.062893417e-05f, -1.660379520e-04f, -4.160537421e-04f, -6.924339611e-04f, -9.579345288e-04f, -1.170494061e-03f, -1.290369966e-03f, -1.287631456e-03f, -1.148473659e-03f, -8.789584049e-04f, -5.052562393e-04f, -7.016634360e-05f, +3.735286588e-04f, +7.716368758e-04f, +1.077405124e-03f, +1.258925789e-03f, +1.303701385e-03f, +1.219578458e-03f, +1.032030359e-03f, +7.785136030e-04f, +5.011779468e-04f, +2.394594669e-04f, +2.398961014e-05f, -1.271447277e-04f, -2.093425983e-04f, -2.298129043e-04f, -2.039846941e-04f, -1.510159515e-04f, -8.945895274e-05f, -3.394390829e-05f, +6.619994119e-06f, +2.924840441e-05f, +3.578439566e-05f, +3.103365204e-05f, +2.073640537e-05f, +9.891302271e-06f, - +1.651293895e-05f, +4.909571189e-05f, +8.360932158e-05f, +9.839518974e-05f, +6.828755564e-05f, -2.275838507e-05f, -1.678894210e-04f, -3.294855733e-04f, -4.436579724e-04f, -4.393586230e-04f, -2.677272441e-04f, +6.896735240e-05f, +5.021346199e-04f, +9.057703350e-04f, +1.131368162e-03f, +1.059726664e-03f, +6.515672104e-04f, -2.369487665e-05f, -7.957857930e-04f, -1.439879816e-03f, -1.748085931e-03f, -1.601603067e-03f, -1.016774333e-03f, -1.465402875e-04f, +7.651994937e-04f, +1.461212903e-03f, +1.753282834e-03f, +1.580202800e-03f, +1.021634421e-03f, +2.646490911e-04f, -4.629585158e-04f, -9.673148316e-04f, -1.144732003e-03f, -1.002088393e-03f, -6.384111173e-04f, -1.989733799e-04f, +1.783634743e-04f, +4.048272910e-04f, +4.580698598e-04f, +3.736989491e-04f, +2.192185398e-04f, +6.344078426e-05f, -4.662483179e-05f, -9.487816622e-05f, -9.156016257e-05f, -6.052002625e-05f, -2.557309600e-05f, -1.562413851e-06f, - /* 2, 3 (48) */ - +2.066794741e-04f, +5.658044030e-04f, +1.078135658e-03f, +1.640412437e-03f, +2.059061820e-03f, +2.070225857e-03f, +1.392071805e-03f, -1.947474815e-04f, -2.752176430e-03f, -6.097077358e-03f, -9.746286900e-03f, -1.291759675e-02f, -1.460089752e-02f, -1.369935351e-02f, -9.223554850e-03f, -5.060757957e-04f, +1.260614291e-02f, +2.962549341e-02f, +4.939869589e-02f, +7.020063419e-02f, +8.994126933e-02f, +1.064558916e-01f, +1.178297874e-01f, +1.226986384e-01f, +1.204682640e-01f, +1.114115747e-01f, +9.662395226e-02f, +7.784571619e-02f, +5.718588514e-02f, +3.679958160e-02f, +1.857837271e-02f, +3.907430107e-03f, -6.472715710e-03f, -1.248485472e-02f, -1.462343426e-02f, -1.378205999e-02f, -1.104197897e-02f, -7.465760977e-03f, -3.933350484e-03f, -1.043754655e-03f, +9.112566040e-04f, +1.910801527e-03f, +2.126472697e-03f, +1.827271074e-03f, +1.291627061e-03f, +7.435337550e-04f, +3.205192346e-04f, +7.199929164e-05f, - +1.325307281e-04f, -3.631299982e-04f, -1.417287284e-03f, -2.909313630e-03f, -4.332114202e-03f, -4.825276152e-03f, -3.427199206e-03f, +4.867854796e-04f, +6.726538715e-03f, +1.399189695e-02f, +1.997045467e-02f, +2.191900516e-02f, +1.762216094e-02f, +6.422539372e-03f, -1.009128326e-02f, -2.810127143e-02f, -4.242412396e-02f, -4.804709670e-02f, -4.186191447e-02f, -2.397700074e-02f, +1.926849082e-03f, +2.942623922e-02f, +5.117617307e-02f, +6.114860651e-02f, +5.653218845e-02f, +3.863164217e-02f, +1.244944774e-02f, -1.490229022e-02f, -3.640317188e-02f, -4.718470258e-02f, -4.577764596e-02f, -3.419577315e-02f, -1.693196650e-02f, +6.910292352e-04f, +1.419852965e-02f, +2.111848750e-02f, +2.131515231e-02f, +1.653131281e-02f, +9.436823341e-03f, +2.598618995e-03f, -2.266266820e-03f, -4.568746977e-03f, -4.679342053e-03f, -3.491058880e-03f, -1.943713093e-03f, -6.919769508e-04f, +6.786528698e-06f, +2.163713502e-04f, - -1.651501641e-05f, -2.752361942e-05f, -3.501771719e-05f, -3.337019667e-05f, -1.719662164e-05f, +1.669726717e-05f, +6.732039382e-05f, +1.280410192e-04f, +1.862517758e-04f, +2.245574884e-04f, +2.235584601e-04f, +1.658873573e-04f, +4.075986188e-05f, -1.519706699e-04f, -3.993149794e-04f, -6.750547716e-04f, -9.424511507e-04f, -1.159546352e-03f, -1.286229402e-03f, -1.291751402e-03f, -1.161157397e-03f, -8.992214192e-04f, -5.309217592e-04f, -9.818515874e-05f, +3.465907549e-04f, +7.490369039e-04f, +1.061695187e-03f, +1.251561458e-03f, +1.304858312e-03f, +1.228204740e-03f, +1.046112950e-03f, +7.954945209e-04f, +5.184294122e-04f, +2.547216865e-04f, +3.569062057e-05f, -1.197358921e-04f, -2.061386118e-04f, -2.300783449e-04f, -2.065980965e-04f, -1.547563581e-04f, -9.325435845e-05f, -3.703714383e-05f, +4.606824229e-06f, +2.834389434e-05f, +3.576516312e-05f, +3.155178736e-05f, +2.144042228e-05f, +1.051340821e-05f, - +1.486066013e-05f, +4.682673567e-05f, +8.176651482e-05f, +9.854087592e-05f, +7.187725374e-05f, -1.526379959e-05f, -1.577895109e-04f, -3.200227729e-04f, -4.393011265e-04f, -4.442277028e-04f, -2.836366688e-04f, +4.405097132e-05f, +4.744103624e-04f, +8.842498455e-04f, +1.125049832e-03f, +1.074175161e-03f, +6.861874516e-04f, +2.351731614e-05f, -7.488710269e-04f, -1.407620910e-03f, -1.741535112e-03f, -1.624504230e-03f, -1.063868971e-03f, -2.049230008e-04f, +7.120558050e-04f, +1.428150722e-03f, +1.748750765e-03f, +1.603792974e-03f, +1.064662533e-03f, +3.134398161e-04f, -4.223801457e-04f, -9.448499737e-04f, -1.143628431e-03f, -1.018851802e-03f, -6.649374122e-04f, -2.258675223e-04f, +1.586048292e-04f, +3.958482481e-04f, +4.593683694e-04f, +3.817933795e-04f, +2.295510580e-04f, +7.217352485e-05f, -4.154293279e-05f, -9.357833311e-05f, -9.285231470e-05f, -6.278822237e-05f, -2.753271206e-05f, -2.622325768e-06f, - /* 2, 4 (48) */ - +1.901644577e-04f, +5.382807835e-04f, +1.043117941e-03f, +1.607042240e-03f, +2.041865198e-03f, +2.086923125e-03f, +1.459392199e-03f, -6.670646231e-05f, -2.565924654e-03f, -5.872519870e-03f, -9.522728440e-03f, -1.275170939e-02f, -1.456013766e-02f, -1.385132418e-02f, -9.622869830e-03f, -1.181130567e-03f, +1.166369176e-02f, +2.846594706e-02f, +4.811246649e-02f, +6.890888278e-02f, +8.878011194e-02f, +1.055566702e-01f, +1.172988657e-01f, +1.226004532e-01f, +1.208148548e-01f, +1.121606116e-01f, +9.768564744e-02f, +7.909727764e-02f, +5.849074345e-02f, +3.802778634e-02f, +1.962448566e-02f, +4.702924628e-03f, -5.954286298e-03f, -1.223013303e-02f, -1.458774364e-02f, -1.390179589e-02f, -1.124811758e-02f, -7.695839322e-03f, -4.139948580e-03f, -1.198511013e-03f, +8.180022455e-04f, +1.873764383e-03f, +2.131079521e-03f, +1.855614968e-03f, +1.327392224e-03f, +7.750855424e-04f, +3.419596569e-04f, +8.251269985e-05f, - +1.473913882e-04f, -3.163032626e-04f, -1.335520770e-03f, -2.810772754e-03f, -4.260236948e-03f, -4.840539951e-03f, -3.584988717e-03f, +1.667627067e-04f, +6.287237588e-03f, +1.354766925e-02f, +1.968681800e-02f, +2.196305613e-02f, +1.809657130e-02f, +7.306789218e-03f, -8.966233429e-03f, -2.702709627e-02f, -4.173793651e-02f, -4.802357938e-02f, -4.261078550e-02f, -2.538462165e-02f, +1.853139707e-04f, +2.780173499e-02f, +5.011230410e-02f, +6.094368351e-02f, +5.724424426e-02f, +4.005979289e-02f, +1.419819851e-02f, -1.329849725e-02f, -3.533850934e-02f, -4.687126276e-02f, -4.620002611e-02f, -3.514062312e-02f, -1.807559493e-02f, -3.278225666e-04f, +1.353359224e-02f, +2.089261998e-02f, +2.147375714e-02f, +1.692716106e-02f, +9.896191711e-03f, +2.980412374e-03f, -2.036715762e-03f, -4.496573452e-03f, -4.720884986e-03f, -3.584637213e-03f, -2.036565407e-03f, -7.547651732e-04f, -2.074618336e-05f, +2.137490244e-04f, - -1.582082546e-05f, -2.688433347e-05f, -3.475632442e-05f, -3.384954591e-05f, -1.871064704e-05f, +1.405226805e-05f, +6.376104794e-05f, +1.241604985e-04f, +1.829989042e-04f, +2.231145150e-04f, +2.251246810e-04f, +1.714023512e-04f, +5.062234878e-05f, -1.381211376e-04f, -3.826906643e-04f, -6.576447625e-04f, -9.267707057e-04f, -1.148242387e-03f, -1.281610320e-03f, -1.295333093e-03f, -1.173321362e-03f, -9.190633106e-04f, -5.563320867e-04f, -1.261562889e-04f, +3.194851996e-04f, +7.260813874e-04f, +1.045499198e-03f, +1.243656875e-03f, +1.305501685e-03f, +1.236415057e-03f, +1.059926174e-03f, +8.123729255e-04f, +5.357359097e-04f, +2.701625673e-04f, +4.764458457e-05f, -1.120534605e-04f, -2.026878366e-04f, -2.301572546e-04f, -2.091008723e-04f, -1.584603151e-04f, -9.707231393e-05f, -4.018929612e-05f, +2.522073369e-06f, +2.737464070e-05f, +3.570015596e-05f, +3.204712588e-05f, +2.214184094e-05f, +1.114618787e-05f, - +1.326486022e-05f, +4.457310904e-05f, +7.985437440e-05f, +9.851429947e-05f, +7.522329867e-05f, -7.996027043e-06f, -1.477760152e-04f, -3.103955235e-04f, -4.344910750e-04f, -4.484335740e-04f, -2.988708887e-04f, +1.955592078e-05f, +4.466149993e-04f, +8.620606813e-04f, +1.117566187e-03f, +1.087270186e-03f, +7.196996783e-04f, +7.028076002e-05f, -7.015085432e-04f, -1.374064408e-03f, -1.733177506e-03f, -1.645625650e-03f, -1.109765997e-03f, -2.630726757e-04f, +6.581055171e-04f, +1.393501261e-03f, +1.742352059e-03f, +1.625805940e-03f, +1.106847003e-03f, +3.623010820e-04f, -3.809383425e-04f, -9.210830791e-04f, -1.141229105e-03f, -1.034703675e-03f, -6.911329643e-04f, -2.529913283e-04f, +1.382484285e-04f, +3.861705995e-04f, +4.601045415e-04f, +3.895954709e-04f, +2.398708882e-04f, +8.108743468e-05f, -3.621097189e-05f, -9.206765198e-05f, -9.402984937e-05f, -6.503924966e-05f, -2.953662015e-05f, -3.742405081e-06f, - /* 2, 5 (48) */ - +1.743436322e-04f, +5.113964501e-04f, +1.008361617e-03f, +1.573192694e-03f, +2.023154551e-03f, +2.100975393e-03f, +1.523153247e-03f, +5.745403624e-05f, -2.382925750e-03f, -5.649405355e-03f, -9.297603759e-03f, -1.258030704e-02f, -1.450951531e-02f, -1.398944532e-02f, -1.000556049e-02f, -1.838775330e-03f, +1.073692105e-02f, +2.731770467e-02f, +4.683085617e-02f, +6.761354969e-02f, +8.760679058e-02f, +1.046376069e-01f, +1.167425336e-01f, +1.224742969e-01f, +1.211343400e-01f, +1.128866930e-01f, +9.873114664e-02f, +8.034093452e-02f, +5.979624514e-02f, +3.926420140e-02f, +2.068441184e-02f, +5.515297553e-03f, -5.418550388e-03f, -1.195997046e-02f, -1.454009906e-02f, -1.401384935e-02f, -1.145080542e-02f, -7.925996577e-03f, -4.349049452e-03f, -1.356971328e-03f, +7.209299316e-04f, +1.833575087e-03f, +2.133601595e-03f, +1.882989609e-03f, +1.363092380e-03f, +8.071326683e-04f, +3.641014979e-04f, +9.365888772e-05f, - +1.606562484e-04f, -2.717301535e-04f, -1.255666395e-03f, -2.712258454e-03f, -4.185013649e-03f, -4.848535978e-03f, -3.732764732e-03f, -1.436328168e-04f, +5.852746513e-03f, +1.309923567e-02f, +1.938794711e-02f, +2.198261205e-02f, +1.854318630e-02f, +8.168849899e-03f, -7.848667242e-03f, -2.593982609e-02f, -4.101823683e-02f, -4.795329862e-02f, -4.331229404e-02f, -2.675868606e-02f, -1.547863536e-03f, +2.615610935e-02f, +4.900253810e-02f, +6.068061083e-02f, +5.790234977e-02f, +4.145329415e-02f, +1.594055057e-02f, -1.167269131e-02f, -3.423166234e-02f, -4.650896168e-02f, -4.658096445e-02f, -3.606170620e-02f, -1.921682403e-02f, -1.362526242e-03f, +1.284245928e-02f, +2.063962865e-02f, +2.161200557e-02f, +1.731333166e-02f, +1.035629625e-02f, +3.370007845e-03f, -1.796844873e-03f, -4.415486017e-03f, -4.757095958e-03f, -3.676704865e-03f, -2.130595257e-03f, -8.198044229e-04f, -5.028280352e-05f, +2.100066193e-04f, - -1.513167810e-05f, -2.623302729e-05f, -3.446062022e-05f, -3.427263710e-05f, -2.015448731e-05f, +1.147532021e-05f, +6.024547421e-05f, +1.202755443e-04f, +1.796736753e-04f, +2.215221496e-04f, +2.264711354e-04f, +1.766519567e-04f, +6.021501885e-05f, -1.244941147e-04f, -3.661886494e-04f, -6.402138901e-04f, -9.109036901e-04f, -1.136591335e-03f, -1.276518757e-03f, -1.298378071e-03f, -1.184961996e-03f, -9.384757372e-04f, -5.814753136e-04f, -1.540661632e-04f, +2.922250001e-04f, +7.027806537e-04f, +1.028823208e-03f, +1.235213029e-03f, +1.305627587e-03f, +1.244201599e-03f, +1.073459961e-03f, +8.291383686e-04f, +5.530883705e-04f, +2.857757222e-04f, +5.984844242e-05f, -1.040972218e-04f, -1.989874440e-04f, -2.300452179e-04f, -2.114881615e-04f, -1.621235190e-04f, -1.009097504e-04f, -4.339880561e-05f, +3.658972101e-07f, +2.633977555e-05f, +3.558798994e-05f, +3.251825399e-05f, +2.283957411e-05f, +1.178905081e-05f, - +1.172657779e-05f, +4.233878694e-05f, +7.787913356e-05f, +9.832157191e-05f, +7.832811222e-05f, -9.595703742e-07f, -1.378613810e-04f, -3.006216502e-04f, -4.292448886e-04f, -4.519846527e-04f, -3.134231564e-04f, -4.494105415e-06f, +4.187842527e-04f, +8.392395538e-04f, +1.108941136e-03f, +1.099011452e-03f, +7.520753944e-04f, +1.165447678e-04f, -6.537562347e-04f, -1.339256215e-03f, -1.723030478e-03f, -1.664948562e-03f, -1.154415171e-03f, -3.209232485e-04f, +6.034092543e-04f, +1.357300375e-03f, +1.734087204e-03f, +1.646208432e-03f, +1.148133531e-03f, +4.111763155e-04f, -3.386740834e-04f, -8.960286417e-04f, -1.137521149e-03f, -1.049611999e-03f, -7.169598973e-04f, -2.803140446e-04f, +1.173096685e-04f, +3.757929232e-04f, +4.602646486e-04f, +3.970868359e-04f, +2.501623294e-04f, +9.017396144e-05f, -3.062968081e-05f, -9.034138753e-05f, -9.508619534e-05f, -6.726782211e-05f, -3.158234997e-05f, -4.922830113e-06f, - /* 2, 6 (48) */ - +1.592119541e-04f, +4.851634228e-04f, +9.739009964e-04f, +1.538920057e-03f, +2.003000064e-03f, +2.112450713e-03f, +1.583398721e-03f, +1.777295806e-04f, -2.203252074e-03f, -5.427883205e-03f, -9.071132624e-03f, -1.240365508e-02f, -1.444930029e-02f, -1.411393943e-02f, -1.037174914e-02f, -2.478989220e-03f, +9.826017361e-03f, +2.618111333e-02f, +4.555433741e-02f, +6.631517162e-02f, +8.642182858e-02f, +1.036991311e-01f, +1.161610583e-01f, +1.223202308e-01f, +1.214265650e-01f, +1.135894736e-01f, +9.975996985e-02f, +8.157614755e-02f, +6.110187273e-02f, +4.050840299e-02f, +2.175787180e-02f, +6.344435922e-03f, -4.865462017e-03f, -1.167419474e-02f, -1.448025062e-02f, -1.411794657e-02f, -1.164979286e-02f, -8.156041794e-03f, -4.560537614e-03f, -1.519094847e-03f, +6.200201812e-04f, +1.790176281e-03f, +2.133967492e-03f, +1.909329384e-03f, +1.398680370e-03f, +8.396509222e-04f, +3.869410720e-04f, +1.054479385e-04f, - +1.723828262e-04f, -2.293913666e-04f, -1.177787262e-03f, -2.613936882e-03f, -4.106685537e-03f, -4.849495549e-03f, -3.870626113e-03f, -4.442544670e-04f, +5.423501625e-03f, +1.264725102e-02f, +1.907452395e-02f, +2.197811794e-02f, +1.896197055e-02f, +9.008089453e-03f, -6.739726106e-03f, -2.484081463e-02f, -4.026616143e-02f, -4.783675385e-02f, -4.396605027e-02f, -2.809794228e-02f, -3.270894013e-03f, +2.449116078e-02f, +4.784812293e-02f, +6.035968758e-02f, +5.850575903e-02f, +4.281059452e-02f, +1.767463777e-02f, -1.002648288e-02f, -3.308352881e-02f, -4.609778536e-02f, -4.691963853e-02f, -3.695773484e-02f, -2.035434518e-02f, -2.412138240e-03f, +1.212549938e-02f, +2.035931460e-02f, +2.172931524e-02f, +1.768912458e-02f, +1.081656090e-02f, +3.767094681e-03f, -1.546682544e-03f, -4.325312056e-03f, -4.787725639e-03f, -3.767046253e-03f, -2.225681452e-03f, -8.870722450e-04f, -8.186515349e-05f, +2.050837892e-04f, - -1.444839081e-05f, -2.557096333e-05f, -3.413205882e-05f, -3.464069281e-05f, -2.152862109e-05f, +8.967159811e-06f, +5.677590025e-05f, +1.163898236e-04f, +1.762807416e-04f, +2.197851945e-04f, +2.276016850e-04f, +1.816379677e-04f, +6.953670123e-05f, -1.110941500e-04f, -3.498166160e-04f, -6.227720201e-04f, -8.948606193e-04f, -1.124602503e-03f, -1.270960990e-03f, -1.300888184e-03f, -1.196076058e-03f, -9.574506285e-04f, -6.063397045e-04f, -1.819012505e-04f, +2.648232645e-04f, +6.791452514e-04f, +1.011673564e-03f, +1.226231231e-03f, +1.305232385e-03f, +1.251556758e-03f, +1.086704325e-03f, +8.457803707e-04f, +5.704775955e-04f, +3.015545704e-04f, +7.229892102e-05f, -9.586715591e-05f, -1.950347411e-04f, -2.297378848e-04f, -2.137551001e-04f, -1.657416077e-04f, -1.047635095e-04f, -4.666401798e-05f, -1.861469822e-06f, +2.523848061e-05f, +3.542729791e-05f, +3.296374774e-05f, +2.353250716e-05f, +1.244137414e-05f, - +1.024668483e-05f, +4.012754261e-05f, +7.584693604e-05f, +9.796891076e-05f, +8.119445455e-05f, +5.841562069e-06f, -1.280575934e-04f, -2.907187900e-04f, -4.235799126e-04f, -4.548901188e-04f, -3.272877877e-04f, -2.807640121e-05f, +3.909533641e-04f, +8.158235121e-04f, +1.099199776e-03f, +1.109400401e-03f, +7.832877974e-04f, +1.622596761e-04f, -6.056720947e-04f, -1.303243534e-03f, -1.711113513e-03f, -1.682456455e-03f, -1.197767855e-03f, -3.784090436e-04f, +5.480286059e-04f, +1.319585894e-03f, +1.723958986e-03f, +1.664969016e-03f, +1.188468608e-03f, +4.600085176e-04f, -2.956297347e-04f, -8.697029437e-04f, -1.132493239e-03f, -1.063545591e-03f, -7.423802916e-04f, -3.078041660e-04f, +9.580501968e-05f, +3.647147665e-04f, +4.598355234e-04f, +4.042491442e-04f, +2.604093438e-04f, +9.942404785e-05f, -2.480023478e-05f, -8.839504320e-05f, -9.601479198e-05f, -6.946850955e-05f, -3.366724465e-05f, -6.163642991e-06f, - /* 2, 7 (48) */ - +1.447635633e-04f, +4.595924595e-04f, +9.397689376e-04f, +1.504279365e-03f, +1.981471443e-03f, +2.121417873e-03f, +1.640174622e-03f, +2.941194042e-04f, -2.026971333e-03f, -5.208098011e-03f, -8.843530939e-03f, -1.222201712e-02f, -1.437976359e-02f, -1.422503358e-02f, -1.072156576e-02f, -3.101761240e-03f, +8.931156742e-03f, +2.505651083e-02f, +4.428337642e-02f, +6.501428343e-02f, +8.522575252e-02f, +1.027416805e-01f, +1.155547185e-01f, +1.221383295e-01f, +1.216913882e-01f, +1.142686189e-01f, +1.007716434e-01f, +8.280237878e-02f, +6.240710511e-02f, +4.175995975e-02f, +2.284457612e-02f, +7.190216292e-03f, -4.294984422e-03f, -1.137264017e-02f, -1.440795170e-02f, -1.421381372e-02f, -1.184482760e-02f, -8.385779679e-03f, -4.774292714e-03f, -1.684836455e-03f, +5.152566717e-04f, +1.743512263e-03f, +2.132106022e-03f, +1.934567865e-03f, +1.434107668e-03f, +8.726146700e-04f, +4.104735791e-04f, +1.178893127e-04f, - +1.826295111e-04f, -1.892638240e-04f, -1.101940326e-03f, -2.515967971e-03f, -4.025491083e-03f, -4.843653987e-03f, -3.998683707e-03f, -7.349732570e-04f, +4.999921712e-03f, +1.219236090e-02f, +1.874723616e-02f, +2.195004154e-02f, +1.935292392e-02f, +9.823912965e-03f, -5.640526330e-03f, -2.373141423e-02f, -3.948287364e-02f, -4.767449418e-02f, -4.457172237e-02f, -2.940118581e-02f, -4.982007526e-03f, +2.280870433e-02f, +4.665035507e-02f, +5.998127854e-02f, +5.905378763e-02f, +4.413018042e-02f, +1.939859676e-02f, -8.361513860e-03f, -3.189506020e-02f, -4.563777685e-02f, -4.721526827e-02f, -3.782743778e-02f, -2.148683842e-02f, -3.475683831e-03f, +1.138311909e-02f, +2.005151044e-02f, +2.182512026e-02f, +1.805383935e-02f, +1.127639642e-02f, +4.171343825e-03f, -1.286273200e-03f, -4.225888008e-03f, -4.812525874e-03f, -3.855441296e-03f, -2.321696244e-03f, -9.565407545e-04f, -1.155323981e-04f, +1.989201462e-04f, - -1.377174813e-05f, -2.489938159e-05f, -3.377209336e-05f, -3.495496479e-05f, -2.283358851e-05f, +6.528436185e-06f, +5.335445802e-05f, +1.125069226e-04f, +1.728247150e-04f, +2.179084727e-04f, +2.285202841e-04f, +1.863623376e-04f, +7.858642862e-05f, -9.792558119e-05f, -3.335820703e-04f, -6.053289213e-04f, -8.786520212e-04f, -1.112285330e-03f, -1.264943534e-03f, -1.302865587e-03f, -1.206660630e-03f, -9.759801910e-04f, -6.309137040e-04f, -2.096480687e-04f, +2.372931928e-04f, +6.551859441e-04f, +9.940569119e-04f, +1.216713113e-03f, +1.304312736e-03f, +1.258473133e-03f, +1.099649378e-03f, +8.622884283e-04f, +5.878942605e-04f, +3.174923399e-04f, +8.499253389e-05f, -8.736343546e-05f, -1.908271752e-04f, -2.292309753e-04f, -2.158968239e-04f, -1.693101634e-04f, -1.086303448e-04f, -4.998318375e-05f, -4.159713064e-06f, +2.406998925e-05f, +3.521673185e-05f, +3.338217428e-05f, +2.421949874e-05f, +1.310250252e-05f, - +8.825890435e-06f, +3.794296559e-05f, +7.376382695e-05f, +9.746262523e-05f, +8.382541052e-05f, +1.240385132e-05f, -1.183761664e-04f, -2.807043682e-04f, -4.175137344e-04f, -4.571598891e-04f, -3.404601524e-04f, -5.116926590e-05f, +3.631570519e-04f, +7.918498873e-04f, +1.088368341e-03f, +1.118440182e-03f, +8.133118003e-04f, +2.073769032e-04f, -5.573141404e-04f, -1.266074797e-03f, -1.697448191e-03f, -1.698135084e-03f, -1.239777076e-03f, -4.354648582e-04f, +4.920260470e-04f, +1.280397580e-03f, +1.711972486e-03f, +1.682058143e-03f, +1.227799595e-03f, +5.087403362e-04f, -2.518490062e-04f, -8.421240501e-04f, -1.126135628e-03f, -1.076474157e-03f, -7.673562372e-04f, -3.354294698e-04f, +7.375202007e-05f, +3.529366637e-04f, +4.588045889e-04f, +4.110641523e-04f, +2.705955750e-04f, +1.088281350e-04f, -1.872426182e-05f, -8.622437589e-05f, -9.680910213e-05f, -7.163574407e-05f, -3.578846024e-05f, -7.464744720e-06f, - /* 2, 8 (48) */ - +1.309918152e-04f, +4.346930779e-04f, +9.059968443e-04f, +1.469324400e-03f, +1.958637854e-03f, +2.127946309e-03f, +1.693529080e-03f, +4.066263268e-04f, -1.854146618e-03f, -4.990189538e-03f, -8.615010654e-03f, -1.203565478e-02f, -1.430117716e-02f, -1.432295916e-02f, -1.105514783e-02f, -3.707090161e-03f, +8.052504721e-03f, +2.394422550e-02f, +4.301843289e-02f, +6.371141785e-02f, +8.401909189e-02f, +1.017657003e-01f, +1.149238048e-01f, +1.219286814e-01f, +1.219286814e-01f, +1.149238048e-01f, +1.017657003e-01f, +8.401909189e-02f, +6.371141785e-02f, +4.301843289e-02f, +2.394422550e-02f, +8.052504721e-03f, -3.707090161e-03f, -1.105514783e-02f, -1.432295916e-02f, -1.430117716e-02f, -1.203565478e-02f, -8.615010654e-03f, -4.990189538e-03f, -1.854146618e-03f, +4.066263268e-04f, +1.693529080e-03f, +2.127946309e-03f, +1.958637854e-03f, +1.469324400e-03f, +9.059968443e-04f, +4.346930779e-04f, +1.309918152e-04f, - +1.914554015e-04f, -1.513208584e-04f, -1.028176499e-03f, -2.418505346e-03f, -3.941665672e-03f, -4.831250135e-03f, -4.117059873e-03f, -1.015677625e-03f, +4.582407978e-03f, +1.173520101e-02f, +1.840677601e-02f, +2.189887228e-02f, +1.971608097e-02f, +1.061576285e-02f, -4.552157989e-03f, -2.261297405e-02f, -3.866956183e-02f, -4.746711727e-02f, -4.512903651e-02f, -3.066726061e-02f, -6.679455717e-03f, +2.111056924e-02f, +4.541057800e-02f, +5.954581368e-02f, +5.954581368e-02f, +4.541057800e-02f, +2.111056924e-02f, -6.679455717e-03f, -3.066726061e-02f, -4.512903651e-02f, -4.746711727e-02f, -3.866956183e-02f, -2.261297405e-02f, -4.552157989e-03f, +1.061576285e-02f, +1.971608097e-02f, +2.189887228e-02f, +1.840677601e-02f, +1.173520101e-02f, +4.582407978e-03f, -1.015677625e-03f, -4.117059873e-03f, -4.831250135e-03f, -3.941665672e-03f, -2.418505346e-03f, -1.028176499e-03f, -1.513208584e-04f, +1.914554015e-04f, - -1.310250252e-05f, -2.421949874e-05f, -3.338217428e-05f, -3.521673185e-05f, -2.406998925e-05f, +4.159713064e-06f, +4.998318375e-05f, +1.086303448e-04f, +1.693101634e-04f, +2.158968239e-04f, +2.292309753e-04f, +1.908271752e-04f, +8.736343546e-05f, -8.499253389e-05f, -3.174923399e-04f, -5.878942605e-04f, -8.622884283e-04f, -1.099649378e-03f, -1.258473133e-03f, -1.304312736e-03f, -1.216713113e-03f, -9.940569119e-04f, -6.551859441e-04f, -2.372931928e-04f, +2.096480687e-04f, +6.309137040e-04f, +9.759801910e-04f, +1.206660630e-03f, +1.302865587e-03f, +1.264943534e-03f, +1.112285330e-03f, +8.786520212e-04f, +6.053289213e-04f, +3.335820703e-04f, +9.792558119e-05f, -7.858642862e-05f, -1.863623376e-04f, -2.285202841e-04f, -2.179084727e-04f, -1.728247150e-04f, -1.125069226e-04f, -5.335445802e-05f, -6.528436185e-06f, +2.283358851e-05f, +3.495496479e-05f, +3.377209336e-05f, +2.489938159e-05f, +1.377174813e-05f, - +7.464744720e-06f, +3.578846024e-05f, +7.163574407e-05f, +9.680910213e-05f, +8.622437589e-05f, +1.872426182e-05f, -1.088281350e-04f, -2.705955750e-04f, -4.110641523e-04f, -4.588045889e-04f, -3.529366637e-04f, -7.375202007e-05f, +3.354294698e-04f, +7.673562372e-04f, +1.076474157e-03f, +1.126135628e-03f, +8.421240501e-04f, +2.518490062e-04f, -5.087403362e-04f, -1.227799595e-03f, -1.682058143e-03f, -1.711972486e-03f, -1.280397580e-03f, -4.920260470e-04f, +4.354648582e-04f, +1.239777076e-03f, +1.698135084e-03f, +1.697448191e-03f, +1.266074797e-03f, +5.573141404e-04f, -2.073769032e-04f, -8.133118003e-04f, -1.118440182e-03f, -1.088368341e-03f, -7.918498873e-04f, -3.631570519e-04f, +5.116926590e-05f, +3.404601524e-04f, +4.571598891e-04f, +4.175137344e-04f, +2.807043682e-04f, +1.183761664e-04f, -1.240385132e-05f, -8.382541052e-05f, -9.746262523e-05f, -7.376382695e-05f, -3.794296559e-05f, -8.825890435e-06f, - /* 2, 9 (48) */ - +1.178893127e-04f, +4.104735791e-04f, +8.726146700e-04f, +1.434107668e-03f, +1.934567865e-03f, +2.132106022e-03f, +1.743512263e-03f, +5.152566717e-04f, -1.684836455e-03f, -4.774292714e-03f, -8.385779679e-03f, -1.184482760e-02f, -1.421381372e-02f, -1.440795170e-02f, -1.137264017e-02f, -4.294984422e-03f, +7.190216292e-03f, +2.284457612e-02f, +4.175995975e-02f, +6.240710511e-02f, +8.280237878e-02f, +1.007716434e-01f, +1.142686189e-01f, +1.216913882e-01f, +1.221383295e-01f, +1.155547185e-01f, +1.027416805e-01f, +8.522575252e-02f, +6.501428343e-02f, +4.428337642e-02f, +2.505651083e-02f, +8.931156742e-03f, -3.101761240e-03f, -1.072156576e-02f, -1.422503358e-02f, -1.437976359e-02f, -1.222201712e-02f, -8.843530939e-03f, -5.208098011e-03f, -2.026971333e-03f, +2.941194042e-04f, +1.640174622e-03f, +2.121417873e-03f, +1.981471443e-03f, +1.504279365e-03f, +9.397689376e-04f, +4.595924595e-04f, +1.447635633e-04f, - +1.989201462e-04f, -1.155323981e-04f, -9.565407545e-04f, -2.321696244e-03f, -3.855441296e-03f, -4.812525874e-03f, -4.225888008e-03f, -1.286273200e-03f, +4.171343825e-03f, +1.127639642e-02f, +1.805383935e-02f, +2.182512026e-02f, +2.005151044e-02f, +1.138311909e-02f, -3.475683831e-03f, -2.148683842e-02f, -3.782743778e-02f, -4.721526827e-02f, -4.563777685e-02f, -3.189506020e-02f, -8.361513860e-03f, +1.939859676e-02f, +4.413018042e-02f, +5.905378763e-02f, +5.998127854e-02f, +4.665035507e-02f, +2.280870433e-02f, -4.982007526e-03f, -2.940118581e-02f, -4.457172237e-02f, -4.767449418e-02f, -3.948287364e-02f, -2.373141423e-02f, -5.640526330e-03f, +9.823912965e-03f, +1.935292392e-02f, +2.195004154e-02f, +1.874723616e-02f, +1.219236090e-02f, +4.999921712e-03f, -7.349732570e-04f, -3.998683707e-03f, -4.843653987e-03f, -4.025491083e-03f, -2.515967971e-03f, -1.101940326e-03f, -1.892638240e-04f, +1.826295111e-04f, - -1.244137414e-05f, -2.353250716e-05f, -3.296374774e-05f, -3.542729791e-05f, -2.523848061e-05f, +1.861469822e-06f, +4.666401798e-05f, +1.047635095e-04f, +1.657416077e-04f, +2.137551001e-04f, +2.297378848e-04f, +1.950347411e-04f, +9.586715591e-05f, -7.229892102e-05f, -3.015545704e-04f, -5.704775955e-04f, -8.457803707e-04f, -1.086704325e-03f, -1.251556758e-03f, -1.305232385e-03f, -1.226231231e-03f, -1.011673564e-03f, -6.791452514e-04f, -2.648232645e-04f, +1.819012505e-04f, +6.063397045e-04f, +9.574506285e-04f, +1.196076058e-03f, +1.300888184e-03f, +1.270960990e-03f, +1.124602503e-03f, +8.948606193e-04f, +6.227720201e-04f, +3.498166160e-04f, +1.110941500e-04f, -6.953670123e-05f, -1.816379677e-04f, -2.276016850e-04f, -2.197851945e-04f, -1.762807416e-04f, -1.163898236e-04f, -5.677590025e-05f, -8.967159811e-06f, +2.152862109e-05f, +3.464069281e-05f, +3.413205882e-05f, +2.557096333e-05f, +1.444839081e-05f, - +6.163642991e-06f, +3.366724465e-05f, +6.946850955e-05f, +9.601479198e-05f, +8.839504320e-05f, +2.480023478e-05f, -9.942404785e-05f, -2.604093438e-04f, -4.042491442e-04f, -4.598355234e-04f, -3.647147665e-04f, -9.580501968e-05f, +3.078041660e-04f, +7.423802916e-04f, +1.063545591e-03f, +1.132493239e-03f, +8.697029437e-04f, +2.956297347e-04f, -4.600085176e-04f, -1.188468608e-03f, -1.664969016e-03f, -1.723958986e-03f, -1.319585894e-03f, -5.480286059e-04f, +3.784090436e-04f, +1.197767855e-03f, +1.682456455e-03f, +1.711113513e-03f, +1.303243534e-03f, +6.056720947e-04f, -1.622596761e-04f, -7.832877974e-04f, -1.109400401e-03f, -1.099199776e-03f, -8.158235121e-04f, -3.909533641e-04f, +2.807640121e-05f, +3.272877877e-04f, +4.548901188e-04f, +4.235799126e-04f, +2.907187900e-04f, +1.280575934e-04f, -5.841562069e-06f, -8.119445455e-05f, -9.796891076e-05f, -7.584693604e-05f, -4.012754261e-05f, -1.024668483e-05f, - /* 2,10 (48) */ - +1.054479385e-04f, +3.869410720e-04f, +8.396509222e-04f, +1.398680370e-03f, +1.909329384e-03f, +2.133967492e-03f, +1.790176281e-03f, +6.200201812e-04f, -1.519094847e-03f, -4.560537614e-03f, -8.156041794e-03f, -1.164979286e-02f, -1.411794657e-02f, -1.448025062e-02f, -1.167419474e-02f, -4.865462017e-03f, +6.344435922e-03f, +2.175787180e-02f, +4.050840299e-02f, +6.110187273e-02f, +8.157614755e-02f, +9.975996985e-02f, +1.135894736e-01f, +1.214265650e-01f, +1.223202308e-01f, +1.161610583e-01f, +1.036991311e-01f, +8.642182858e-02f, +6.631517162e-02f, +4.555433741e-02f, +2.618111333e-02f, +9.826017361e-03f, -2.478989220e-03f, -1.037174914e-02f, -1.411393943e-02f, -1.444930029e-02f, -1.240365508e-02f, -9.071132624e-03f, -5.427883205e-03f, -2.203252074e-03f, +1.777295806e-04f, +1.583398721e-03f, +2.112450713e-03f, +2.003000064e-03f, +1.538920057e-03f, +9.739009964e-04f, +4.851634228e-04f, +1.592119541e-04f, - +2.050837892e-04f, -8.186515349e-05f, -8.870722450e-04f, -2.225681452e-03f, -3.767046253e-03f, -4.787725639e-03f, -4.325312056e-03f, -1.546682544e-03f, +3.767094681e-03f, +1.081656090e-02f, +1.768912458e-02f, +2.172931524e-02f, +2.035931460e-02f, +1.212549938e-02f, -2.412138240e-03f, -2.035434518e-02f, -3.695773484e-02f, -4.691963853e-02f, -4.609778536e-02f, -3.308352881e-02f, -1.002648288e-02f, +1.767463777e-02f, +4.281059452e-02f, +5.850575903e-02f, +6.035968758e-02f, +4.784812293e-02f, +2.449116078e-02f, -3.270894013e-03f, -2.809794228e-02f, -4.396605027e-02f, -4.783675385e-02f, -4.026616143e-02f, -2.484081463e-02f, -6.739726106e-03f, +9.008089453e-03f, +1.896197055e-02f, +2.197811794e-02f, +1.907452395e-02f, +1.264725102e-02f, +5.423501625e-03f, -4.442544670e-04f, -3.870626113e-03f, -4.849495549e-03f, -4.106685537e-03f, -2.613936882e-03f, -1.177787262e-03f, -2.293913666e-04f, +1.723828262e-04f, - -1.178905081e-05f, -2.283957411e-05f, -3.251825399e-05f, -3.558798994e-05f, -2.633977555e-05f, -3.658972101e-07f, +4.339880561e-05f, +1.009097504e-04f, +1.621235190e-04f, +2.114881615e-04f, +2.300452179e-04f, +1.989874440e-04f, +1.040972218e-04f, -5.984844242e-05f, -2.857757222e-04f, -5.530883705e-04f, -8.291383686e-04f, -1.073459961e-03f, -1.244201599e-03f, -1.305627587e-03f, -1.235213029e-03f, -1.028823208e-03f, -7.027806537e-04f, -2.922250001e-04f, +1.540661632e-04f, +5.814753136e-04f, +9.384757372e-04f, +1.184961996e-03f, +1.298378071e-03f, +1.276518757e-03f, +1.136591335e-03f, +9.109036901e-04f, +6.402138901e-04f, +3.661886494e-04f, +1.244941147e-04f, -6.021501885e-05f, -1.766519567e-04f, -2.264711354e-04f, -2.215221496e-04f, -1.796736753e-04f, -1.202755443e-04f, -6.024547421e-05f, -1.147532021e-05f, +2.015448731e-05f, +3.427263710e-05f, +3.446062022e-05f, +2.623302729e-05f, +1.513167810e-05f, - +4.922830113e-06f, +3.158234997e-05f, +6.726782211e-05f, +9.508619534e-05f, +9.034138753e-05f, +3.062968081e-05f, -9.017396144e-05f, -2.501623294e-04f, -3.970868359e-04f, -4.602646486e-04f, -3.757929232e-04f, -1.173096685e-04f, +2.803140446e-04f, +7.169598973e-04f, +1.049611999e-03f, +1.137521149e-03f, +8.960286417e-04f, +3.386740834e-04f, -4.111763155e-04f, -1.148133531e-03f, -1.646208432e-03f, -1.734087204e-03f, -1.357300375e-03f, -6.034092543e-04f, +3.209232485e-04f, +1.154415171e-03f, +1.664948562e-03f, +1.723030478e-03f, +1.339256215e-03f, +6.537562347e-04f, -1.165447678e-04f, -7.520753944e-04f, -1.099011452e-03f, -1.108941136e-03f, -8.392395538e-04f, -4.187842527e-04f, +4.494105415e-06f, +3.134231564e-04f, +4.519846527e-04f, +4.292448886e-04f, +3.006216502e-04f, +1.378613810e-04f, +9.595703742e-07f, -7.832811222e-05f, -9.832157191e-05f, -7.787913356e-05f, -4.233878694e-05f, -1.172657779e-05f, - /* 2,11 (48) */ - +9.365888772e-05f, +3.641014979e-04f, +8.071326683e-04f, +1.363092380e-03f, +1.882989609e-03f, +2.133601595e-03f, +1.833575087e-03f, +7.209299316e-04f, -1.356971328e-03f, -4.349049452e-03f, -7.925996577e-03f, -1.145080542e-02f, -1.401384935e-02f, -1.454009906e-02f, -1.195997046e-02f, -5.418550388e-03f, +5.515297553e-03f, +2.068441184e-02f, +3.926420140e-02f, +5.979624514e-02f, +8.034093452e-02f, +9.873114664e-02f, +1.128866930e-01f, +1.211343400e-01f, +1.224742969e-01f, +1.167425336e-01f, +1.046376069e-01f, +8.760679058e-02f, +6.761354969e-02f, +4.683085617e-02f, +2.731770467e-02f, +1.073692105e-02f, -1.838775330e-03f, -1.000556049e-02f, -1.398944532e-02f, -1.450951531e-02f, -1.258030704e-02f, -9.297603759e-03f, -5.649405355e-03f, -2.382925750e-03f, +5.745403624e-05f, +1.523153247e-03f, +2.100975393e-03f, +2.023154551e-03f, +1.573192694e-03f, +1.008361617e-03f, +5.113964501e-04f, +1.743436322e-04f, - +2.100066193e-04f, -5.028280352e-05f, -8.198044229e-04f, -2.130595257e-03f, -3.676704865e-03f, -4.757095958e-03f, -4.415486017e-03f, -1.796844873e-03f, +3.370007845e-03f, +1.035629625e-02f, +1.731333166e-02f, +2.161200557e-02f, +2.063962865e-02f, +1.284245928e-02f, -1.362526242e-03f, -1.921682403e-02f, -3.606170620e-02f, -4.658096445e-02f, -4.650896168e-02f, -3.423166234e-02f, -1.167269131e-02f, +1.594055057e-02f, +4.145329415e-02f, +5.790234977e-02f, +6.068061083e-02f, +4.900253810e-02f, +2.615610935e-02f, -1.547863536e-03f, -2.675868606e-02f, -4.331229404e-02f, -4.795329862e-02f, -4.101823683e-02f, -2.593982609e-02f, -7.848667242e-03f, +8.168849899e-03f, +1.854318630e-02f, +2.198261205e-02f, +1.938794711e-02f, +1.309923567e-02f, +5.852746513e-03f, -1.436328168e-04f, -3.732764732e-03f, -4.848535978e-03f, -4.185013649e-03f, -2.712258454e-03f, -1.255666395e-03f, -2.717301535e-04f, +1.606562484e-04f, - -1.114618787e-05f, -2.214184094e-05f, -3.204712588e-05f, -3.570015596e-05f, -2.737464070e-05f, -2.522073369e-06f, +4.018929612e-05f, +9.707231393e-05f, +1.584603151e-04f, +2.091008723e-04f, +2.301572546e-04f, +2.026878366e-04f, +1.120534605e-04f, -4.764458457e-05f, -2.701625673e-04f, -5.357359097e-04f, -8.123729255e-04f, -1.059926174e-03f, -1.236415057e-03f, -1.305501685e-03f, -1.243656875e-03f, -1.045499198e-03f, -7.260813874e-04f, -3.194851996e-04f, +1.261562889e-04f, +5.563320867e-04f, +9.190633106e-04f, +1.173321362e-03f, +1.295333093e-03f, +1.281610320e-03f, +1.148242387e-03f, +9.267707057e-04f, +6.576447625e-04f, +3.826906643e-04f, +1.381211376e-04f, -5.062234878e-05f, -1.714023512e-04f, -2.251246810e-04f, -2.231145150e-04f, -1.829989042e-04f, -1.241604985e-04f, -6.376104794e-05f, -1.405226805e-05f, +1.871064704e-05f, +3.384954591e-05f, +3.475632442e-05f, +2.688433347e-05f, +1.582082546e-05f, - +3.742405081e-06f, +2.953662015e-05f, +6.503924966e-05f, +9.402984937e-05f, +9.206765198e-05f, +3.621097189e-05f, -8.108743468e-05f, -2.398708882e-04f, -3.895954709e-04f, -4.601045415e-04f, -3.861705995e-04f, -1.382484285e-04f, +2.529913283e-04f, +6.911329643e-04f, +1.034703675e-03f, +1.141229105e-03f, +9.210830791e-04f, +3.809383425e-04f, -3.623010820e-04f, -1.106847003e-03f, -1.625805940e-03f, -1.742352059e-03f, -1.393501261e-03f, -6.581055171e-04f, +2.630726757e-04f, +1.109765997e-03f, +1.645625650e-03f, +1.733177506e-03f, +1.374064408e-03f, +7.015085432e-04f, -7.028076002e-05f, -7.196996783e-04f, -1.087270186e-03f, -1.117566187e-03f, -8.620606813e-04f, -4.466149993e-04f, -1.955592078e-05f, +2.988708887e-04f, +4.484335740e-04f, +4.344910750e-04f, +3.103955235e-04f, +1.477760152e-04f, +7.996027043e-06f, -7.522329867e-05f, -9.851429947e-05f, -7.985437440e-05f, -4.457310904e-05f, -1.326486022e-05f, - /* 2,12 (48) */ - +8.251269985e-05f, +3.419596569e-04f, +7.750855424e-04f, +1.327392224e-03f, +1.855614968e-03f, +2.131079521e-03f, +1.873764383e-03f, +8.180022455e-04f, -1.198511013e-03f, -4.139948580e-03f, -7.695839322e-03f, -1.124811758e-02f, -1.390179589e-02f, -1.458774364e-02f, -1.223013303e-02f, -5.954286298e-03f, +4.702924628e-03f, +1.962448566e-02f, +3.802778634e-02f, +5.849074345e-02f, +7.909727764e-02f, +9.768564744e-02f, +1.121606116e-01f, +1.208148548e-01f, +1.226004532e-01f, +1.172988657e-01f, +1.055566702e-01f, +8.878011194e-02f, +6.890888278e-02f, +4.811246649e-02f, +2.846594706e-02f, +1.166369176e-02f, -1.181130567e-03f, -9.622869830e-03f, -1.385132418e-02f, -1.456013766e-02f, -1.275170939e-02f, -9.522728440e-03f, -5.872519870e-03f, -2.565924654e-03f, -6.670646231e-05f, +1.459392199e-03f, +2.086923125e-03f, +2.041865198e-03f, +1.607042240e-03f, +1.043117941e-03f, +5.382807835e-04f, +1.901644577e-04f, - +2.137490244e-04f, -2.074618336e-05f, -7.547651732e-04f, -2.036565407e-03f, -3.584637213e-03f, -4.720884986e-03f, -4.496573452e-03f, -2.036715762e-03f, +2.980412374e-03f, +9.896191711e-03f, +1.692716106e-02f, +2.147375714e-02f, +2.089261998e-02f, +1.353359224e-02f, -3.278225666e-04f, -1.807559493e-02f, -3.514062312e-02f, -4.620002611e-02f, -4.687126276e-02f, -3.533850934e-02f, -1.329849725e-02f, +1.419819851e-02f, +4.005979289e-02f, +5.724424426e-02f, +6.094368351e-02f, +5.011230410e-02f, +2.780173499e-02f, +1.853139707e-04f, -2.538462165e-02f, -4.261078550e-02f, -4.802357938e-02f, -4.173793651e-02f, -2.702709627e-02f, -8.966233429e-03f, +7.306789218e-03f, +1.809657130e-02f, +2.196305613e-02f, +1.968681800e-02f, +1.354766925e-02f, +6.287237588e-03f, +1.667627067e-04f, -3.584988717e-03f, -4.840539951e-03f, -4.260236948e-03f, -2.810772754e-03f, -1.335520770e-03f, -3.163032626e-04f, +1.473913882e-04f, - -1.051340821e-05f, -2.144042228e-05f, -3.155178736e-05f, -3.576516312e-05f, -2.834389434e-05f, -4.606824229e-06f, +3.703714383e-05f, +9.325435845e-05f, +1.547563581e-04f, +2.065980965e-04f, +2.300783449e-04f, +2.061386118e-04f, +1.197358921e-04f, -3.569062057e-05f, -2.547216865e-04f, -5.184294122e-04f, -7.954945209e-04f, -1.046112950e-03f, -1.228204740e-03f, -1.304858312e-03f, -1.251561458e-03f, -1.061695187e-03f, -7.490369039e-04f, -3.465907549e-04f, +9.818515874e-05f, +5.309217592e-04f, +8.992214192e-04f, +1.161157397e-03f, +1.291751402e-03f, +1.286229402e-03f, +1.159546352e-03f, +9.424511507e-04f, +6.750547716e-04f, +3.993149794e-04f, +1.519706699e-04f, -4.075986188e-05f, -1.658873573e-04f, -2.235584601e-04f, -2.245574884e-04f, -1.862517758e-04f, -1.280410192e-04f, -6.732039382e-05f, -1.669726717e-05f, +1.719662164e-05f, +3.337019667e-05f, +3.501771719e-05f, +2.752361942e-05f, +1.651501641e-05f, - +2.622325768e-06f, +2.753271206e-05f, +6.278822237e-05f, +9.285231470e-05f, +9.357833311e-05f, +4.154293279e-05f, -7.217352485e-05f, -2.295510580e-04f, -3.817933795e-04f, -4.593683694e-04f, -3.958482481e-04f, -1.586048292e-04f, +2.258675223e-04f, +6.649374122e-04f, +1.018851802e-03f, +1.143628431e-03f, +9.448499737e-04f, +4.223801457e-04f, -3.134398161e-04f, -1.064662533e-03f, -1.603792974e-03f, -1.748750765e-03f, -1.428150722e-03f, -7.120558050e-04f, +2.049230008e-04f, +1.063868971e-03f, +1.624504230e-03f, +1.741535112e-03f, +1.407620910e-03f, +7.488710269e-04f, -2.351731614e-05f, -6.861874516e-04f, -1.074175161e-03f, -1.125049832e-03f, -8.842498455e-04f, -4.744103624e-04f, -4.405097132e-05f, +2.836366688e-04f, +4.442277028e-04f, +4.393011265e-04f, +3.200227729e-04f, +1.577895109e-04f, +1.526379959e-05f, -7.187725374e-05f, -9.854087592e-05f, -8.176651482e-05f, -4.682673567e-05f, -1.486066013e-05f, - /* 2,13 (48) */ - +7.199929164e-05f, +3.205192346e-04f, +7.435337550e-04f, +1.291627061e-03f, +1.827271074e-03f, +2.126472697e-03f, +1.910801527e-03f, +9.112566040e-04f, -1.043754655e-03f, -3.933350484e-03f, -7.465760977e-03f, -1.104197897e-02f, -1.378205999e-02f, -1.462343426e-02f, -1.248485472e-02f, -6.472715710e-03f, +3.907430107e-03f, +1.857837271e-02f, +3.679958160e-02f, +5.718588514e-02f, +7.784571619e-02f, +9.662395226e-02f, +1.114115747e-01f, +1.204682640e-01f, +1.226986384e-01f, +1.178297874e-01f, +1.064558916e-01f, +8.994126933e-02f, +7.020063419e-02f, +4.939869589e-02f, +2.962549341e-02f, +1.260614291e-02f, -5.060757957e-04f, -9.223554850e-03f, -1.369935351e-02f, -1.460089752e-02f, -1.291759675e-02f, -9.746286900e-03f, -6.097077358e-03f, -2.752176430e-03f, -1.947474815e-04f, +1.392071805e-03f, +2.070225857e-03f, +2.059061820e-03f, +1.640412437e-03f, +1.078135658e-03f, +5.658044030e-04f, +2.066794741e-04f, - +2.163713502e-04f, +6.786528698e-06f, -6.919769508e-04f, -1.943713093e-03f, -3.491058880e-03f, -4.679342053e-03f, -4.568746977e-03f, -2.266266820e-03f, +2.598618995e-03f, +9.436823341e-03f, +1.653131281e-02f, +2.131515231e-02f, +2.111848750e-02f, +1.419852965e-02f, +6.910292352e-04f, -1.693196650e-02f, -3.419577315e-02f, -4.577764596e-02f, -4.718470258e-02f, -3.640317188e-02f, -1.490229022e-02f, +1.244944774e-02f, +3.863164217e-02f, +5.653218845e-02f, +6.114860651e-02f, +5.117617307e-02f, +2.942623922e-02f, +1.926849082e-03f, -2.397700074e-02f, -4.186191447e-02f, -4.804709670e-02f, -4.242412396e-02f, -2.810127143e-02f, -1.009128326e-02f, +6.422539372e-03f, +1.762216094e-02f, +2.191900516e-02f, +1.997045467e-02f, +1.399189695e-02f, +6.726538715e-03f, +4.867854796e-04f, -3.427199206e-03f, -4.825276152e-03f, -4.332114202e-03f, -2.909313630e-03f, -1.417287284e-03f, -3.631299982e-04f, +1.325307281e-04f, - -9.891302271e-06f, -2.073640537e-05f, -3.103365204e-05f, -3.578439566e-05f, -2.924840441e-05f, -6.619994119e-06f, +3.394390829e-05f, +8.945895274e-05f, +1.510159515e-04f, +2.039846941e-04f, +2.298129043e-04f, +2.093425983e-04f, +1.271447277e-04f, -2.398961014e-05f, -2.394594669e-04f, -5.011779468e-04f, -7.785136030e-04f, -1.032030359e-03f, -1.219578458e-03f, -1.303701385e-03f, -1.258925789e-03f, -1.077405124e-03f, -7.716368758e-04f, -3.735286588e-04f, +7.016634360e-05f, +5.052562393e-04f, +8.789584049e-04f, +1.148473659e-03f, +1.287631456e-03f, +1.290369966e-03f, +1.170494061e-03f, +9.579345288e-04f, +6.924339611e-04f, +4.160537421e-04f, +1.660379520e-04f, -3.062893417e-05f, -1.601053439e-04f, -2.217687085e-04f, -2.258462928e-04f, -1.894276004e-04f, -1.319133601e-04f, -7.092118880e-05f, -1.940949351e-05f, +1.561199585e-05f, +3.283339796e-05f, +3.524334497e-05f, +2.814960131e-05f, +1.721340283e-05f, - +1.562413851e-06f, +2.557309600e-05f, +6.052002625e-05f, +9.156016257e-05f, +9.487816622e-05f, +4.662483179e-05f, -6.344078426e-05f, -2.192185398e-04f, -3.736989491e-04f, -4.580698598e-04f, -4.048272910e-04f, -1.783634743e-04f, +1.989733799e-04f, +6.384111173e-04f, +1.002088393e-03f, +1.144732003e-03f, +9.673148316e-04f, +4.629585158e-04f, -2.646490911e-04f, -1.021634421e-03f, -1.580202800e-03f, -1.753282834e-03f, -1.461212903e-03f, -7.651994937e-04f, +1.465402875e-04f, +1.016774333e-03f, +1.601603067e-03f, +1.748085931e-03f, +1.439879816e-03f, +7.957857930e-04f, +2.369487665e-05f, -6.515672104e-04f, -1.059726664e-03f, -1.131368162e-03f, -9.057703350e-04f, -5.021346199e-04f, -6.896735240e-05f, +2.677272441e-04f, +4.393586230e-04f, +4.436579724e-04f, +3.294855733e-04f, +1.678894210e-04f, +2.275838507e-05f, -6.828755564e-05f, -9.839518974e-05f, -8.360932158e-05f, -4.909571189e-05f, -1.651293895e-05f, - /* 2,14 (48) */ - +6.210798937e-05f, +2.997828293e-04f, +7.125001030e-04f, +1.255842665e-03f, +1.798022669e-03f, +2.119852703e-03f, +1.944745435e-03f, +1.000715557e-03f, -8.927387031e-04f, -3.729365789e-03f, -7.235948073e-03f, -1.083263637e-02f, -1.365491527e-02f, -1.464742387e-02f, -1.272431418e-02f, -6.973893657e-03f, +3.128916504e-03f, +1.754634235e-02f, +3.558000314e-02f, +5.588218376e-02f, +7.658679040e-02f, +9.554654713e-02f, +1.106399378e-01f, +1.200947354e-01f, +1.227688047e-01f, +1.183350437e-01f, +1.073348500e-01f, +9.108974299e-02f, +7.148826564e-02f, +5.068906585e-02f, +3.079598747e-02f, +1.356407744e-02f, +1.863581655e-04f, -8.807501108e-03f, -1.353331556e-02f, -1.463152645e-02f, -1.307770209e-02f, -9.968055609e-03f, -6.322923651e-03f, -2.941604030e-03f, -3.266608416e-04f, +1.321150617e-03f, +2.050816364e-03f, +2.074673816e-03f, +1.673245835e-03f, +1.113379003e-03f, +5.939540043e-04f, +2.238928769e-04f, - +2.179337640e-04f, +3.235962470e-05f, -6.314569246e-04f, -1.852152930e-03f, -3.396180714e-03f, -4.632717222e-03f, -4.632187761e-03f, -2.485485359e-03f, +2.224920046e-03f, +8.978753482e-03f, +1.612648552e-02f, +2.113678884e-02f, +2.131746088e-02f, +1.483694077e-02f, +1.693117628e-03f, -1.578723449e-02f, -3.322845831e-02f, -4.531468744e-02f, -4.744935167e-02f, -3.742480630e-02f, -1.648249302e-02f, +1.069616491e-02f, +3.717042926e-02f, +5.576698896e-02f, +6.129514680e-02f, +5.219294740e-02f, +3.102784229e-02f, +3.674935013e-03f, -2.253712093e-02f, -4.106612868e-02f, -4.802340182e-02f, -4.307569117e-02f, -2.916099810e-02f, -1.122265142e-02f, +5.516769037e-03f, +1.712002632e-02f, +2.185003780e-02f, +2.023818191e-02f, +1.443125557e-02f, +7.170196687e-03f, +8.162710528e-04f, -3.259309785e-03f, -4.802517767e-03f, -4.400401757e-03f, -3.007708819e-03f, -1.500896606e-03f, -4.122257101e-04f, +1.160177891e-04f, - -9.280428073e-06f, -2.003084938e-05f, -3.049412176e-05f, -3.575925304e-05f, -3.008908649e-05f, -8.561504587e-06f, +3.091105468e-05f, +8.568907504e-05f, +1.472433373e-04f, +2.012655171e-04f, +2.293654093e-04f, +2.123027569e-04f, +1.342803661e-04f, -1.254439996e-05f, -2.243820990e-04f, -4.839904468e-04f, -7.614405822e-04f, -1.017688552e-03f, -1.210544213e-03f, -1.302035102e-03f, -1.265749200e-03f, -1.092623262e-03f, -7.938712038e-04f, -4.002860127e-04f, +4.211344555e-05f, +4.793476000e-04f, +8.582828770e-04f, +1.135274025e-03f, +1.282972024e-03f, +1.294026224e-03f, +1.181076492e-03f, +9.732103711e-04f, +7.097722906e-04f, +4.328989326e-04f, +1.803180156e-04f, -2.023114846e-05f, -1.540548463e-04f, -2.197517632e-04f, -2.269761809e-04f, -1.925216541e-04f, -1.357736976e-04f, -7.456101461e-05f, -2.218803400e-05f, +1.395641963e-05f, +3.223799159e-05f, +3.543175649e-05f, +2.876097492e-05f, +1.791510520e-05f, - +5.623598792e-07f, +2.366005660e-05f, +5.823979708e-05f, +9.015996227e-05f, +9.597211052e-05f, +5.145637092e-05f, -5.489725793e-05f, -2.088886799e-04f, -3.653305944e-04f, -4.562232692e-04f, -4.131101015e-04f, -1.975100473e-04f, +1.723388697e-04f, +6.115918602e-04f, +9.844462429e-04f, +1.144554210e-03f, +9.884649509e-04f, +5.026339086e-04f, -2.159849825e-04f, -9.778176877e-04f, -1.555070467e-03f, -1.755950062e-03f, -1.492653966e-03f, -8.174770020e-04f, +8.799090204e-05f, +9.685338654e-04f, +1.576943159e-03f, +1.752814755e-03f, +1.470796584e-03f, +8.421951268e-04f, +7.130416767e-05f, -6.158691211e-04f, -1.043926723e-03f, -1.136498499e-03f, -9.265858312e-04f, -5.297516141e-04f, -9.428040187e-05f, +2.511504331e-04f, +4.338187090e-04f, +4.475448477e-04f, +3.387659360e-04f, +1.780628463e-04f, +3.047478144e-05f, -6.445213413e-05f, -9.807124983e-05f, -8.537648151e-05f, -5.137590333e-05f, -1.822048807e-05f, - /* 2,15 (48) */ - +5.282756130e-05f, +2.797519799e-04f, +6.820059812e-04f, +1.220083412e-03f, +1.767933583e-03f, +2.111291198e-03f, +1.975656490e-03f, +1.086404632e-03f, -7.454953658e-04f, -3.528100272e-03f, -7.006582663e-03f, -1.062033362e-02f, -1.352063490e-02f, -1.465996827e-02f, -1.294869628e-02f, -7.457884103e-03f, +2.367475921e-03f, +1.652865380e-02f, +3.436945893e-02f, +5.458014866e-02f, +7.532104120e-02f, +9.445392387e-02f, +1.098460666e-01f, +1.196944494e-01f, +1.228109182e-01f, +1.188143913e-01f, +1.081931329e-01f, +9.222501702e-02f, +7.277123767e-02f, +5.198309208e-02f, +3.197706396e-02f, +1.453728781e-02f, +8.961304561e-04f, -8.374602175e-03f, -1.335299754e-02f, -1.465175760e-02f, -1.323175694e-02f, -1.018780737e-02f, -6.549899832e-03f, -3.134125684e-03f, -4.624345392e-04f, +1.246589602e-03f, +2.028628330e-03f, +2.088630235e-03f, +1.705483827e-03f, +1.148810760e-03f, +6.227149792e-04f, +2.418079821e-04f, - +2.184961239e-04f, +5.601968130e-05f, -5.732171275e-04f, -1.761992968e-03f, -3.300208604e-03f, -4.581260851e-03f, -4.687085019e-03f, -2.694374039e-03f, +1.859589451e-03f, +8.522530212e-03f, +1.571337542e-02f, +2.093927879e-02f, +2.148979975e-02f, +1.544853263e-02f, +2.677563871e-03f, -1.464268029e-02f, -3.223999336e-02f, -4.481205354e-02f, -4.766533665e-02f, -3.840262399e-02f, -1.803756349e-02f, +8.940214849e-03f, +3.567777530e-02f, +5.494951196e-02f, +6.138313770e-02f, +5.316148127e-02f, +3.260478545e-02f, +5.427749768e-03f, -2.106632434e-02f, -4.022393355e-02f, -4.795209765e-02f, -4.369156029e-02f, -3.020492482e-02f, -1.235914992e-02f, +4.590183206e-03f, +1.659027470e-02f, +2.175575740e-02f, +2.048933234e-02f, +1.486507428e-02f, +7.617741535e-03f, +1.155036989e-03f, -3.081246939e-03f, -4.772042985e-03f, -4.464853891e-03f, -3.105780069e-03f, -1.586273087e-03f, -4.636016135e-04f, +9.779730107e-05f, - -8.681311338e-06f, -1.932478483e-05f, -2.993458524e-05f, -3.569114798e-05f, -3.086690169e-05f, -1.043135282e-05f, +2.793995439e-05f, +8.194761206e-05f, +1.434426938e-04f, +1.984454053e-04f, +2.287403927e-04f, +2.150221760e-04f, +1.411433911e-04f, -1.357624045e-06f, -2.094955744e-04f, -4.668757046e-04f, -7.442858238e-04f, -1.003097751e-03f, -1.201110195e-03f, -1.299863938e-03f, -1.272031343e-03f, -1.107344162e-03f, -8.157300226e-04f, -4.268500357e-04f, +1.404008886e-05f, +4.532080721e-04f, +8.372037069e-04f, +1.121562690e-03f, +1.277772188e-03f, +1.297192640e-03f, +1.191284773e-03f, +9.882682428e-04f, +7.270596416e-04f, +4.498423675e-04f, +1.948056840e-04f, -9.568295641e-06f, -1.477345693e-04f, -2.175040677e-04f, -2.279424392e-04f, -1.955291828e-04f, -1.396181328e-04f, -7.823735817e-05f, -2.503188561e-05f, +1.222960999e-05f, +3.158285468e-05f, +3.558150459e-05f, +2.935641677e-05f, +1.861921294e-05f, - -3.782715170e-07f, +2.179569405e-05f, +5.595251495e-05f, +8.865826890e-05f, +9.686533432e-05f, +5.603767555e-05f, -4.655048215e-05f, -1.985764530e-04f, -3.567067284e-04f, -4.538433513e-04f, -4.206999836e-04f, -2.160313154e-04f, +1.459931441e-04f, +5.845172747e-04f, +9.659588702e-04f, +1.143110919e-03f, +1.008289421e-03f, +5.413682538e-04f, -1.675029973e-04f, -9.332679948e-04f, -1.528432751e-03f, -1.756756523e-03f, -1.522442131e-03f, -8.688298676e-04f, +2.934142660e-05f, +9.192008225e-04f, +1.550547714e-03f, +1.755708558e-03f, +1.500328102e-03f, +8.880415694e-04f, +1.192580046e-04f, -5.791249940e-04f, -1.026779123e-03f, -1.140419444e-03f, -9.466604647e-04f, -5.572247964e-04f, -1.199645104e-04f, +2.339151312e-04f, +4.276011519e-04f, +4.509453262e-04f, +3.478457341e-04f, +1.882964467e-04f, +3.840748395e-05f, -6.036928359e-05f, -9.756320015e-05f, -8.706161150e-05f, -5.366299909e-05f, -1.998192572e-05f, - /* 3, 0 (48) */ - +3.382425704e-04f, +1.348067834e-04f, -4.889424346e-04f, -1.466276588e-03f, -2.424363330e-03f, -2.730039057e-03f, -1.724598248e-03f, +9.008300509e-04f, +4.739031994e-03f, +8.514833164e-03f, +1.031793603e-02f, +8.256301383e-03f, +1.371724009e-03f, -9.514669115e-03f, -2.142432917e-02f, -2.960851385e-02f, -2.874512923e-02f, -1.466449091e-02f, +1.394439274e-02f, +5.448301361e-02f, +1.005300380e-01f, +1.431856698e-01f, +1.733482814e-01f, +1.842374374e-01f, +1.733482814e-01f, +1.431856698e-01f, +1.005300380e-01f, +5.448301361e-02f, +1.394439274e-02f, -1.466449091e-02f, -2.874512923e-02f, -2.960851385e-02f, -2.142432917e-02f, -9.514669115e-03f, +1.371724009e-03f, +8.256301383e-03f, +1.031793603e-02f, +8.514833164e-03f, +4.739031994e-03f, +9.008300509e-04f, -1.724598248e-03f, -2.730039057e-03f, -2.424363330e-03f, -1.466276588e-03f, -4.889424346e-04f, +1.348067834e-04f, +3.382425704e-04f, +2.622641023e-04f, - -7.823217465e-04f, -9.084685290e-04f, -9.527730581e-05f, +1.939581772e-03f, +4.521325238e-03f, +5.889778654e-03f, +3.972523948e-03f, -2.097746258e-03f, -1.059839761e-02f, -1.714075782e-02f, -1.654476645e-02f, -6.064599171e-03f, +1.185220802e-02f, +2.935028356e-02f, +3.641246564e-02f, +2.636698292e-02f, +6.586074871e-04f, -3.028063400e-02f, -5.133665227e-02f, -5.043564613e-02f, -2.556515975e-02f, +1.309926646e-02f, +4.764810534e-02f, +6.141247912e-02f, +4.764810534e-02f, +1.309926646e-02f, -2.556515975e-02f, -5.043564613e-02f, -5.133665227e-02f, -3.028063400e-02f, +6.586074871e-04f, +2.636698292e-02f, +3.641246564e-02f, +2.935028356e-02f, +1.185220802e-02f, -6.064599171e-03f, -1.654476645e-02f, -1.714075782e-02f, -1.059839761e-02f, -2.097746258e-03f, +3.972523948e-03f, +5.889778654e-03f, +4.521325238e-03f, +1.939581772e-03f, -9.527730581e-05f, -9.084685290e-04f, -7.823217465e-04f, -3.493719860e-04f, - +1.362712782e-06f, +2.430658232e-05f, +5.148010691e-05f, +6.598034546e-05f, +4.813967360e-05f, -1.337559834e-05f, -1.100590885e-04f, -2.082276012e-04f, -2.554161433e-04f, -1.996587127e-04f, -1.641106349e-05f, +2.676990797e-04f, +5.667930921e-04f, +7.518547806e-04f, +6.905770765e-04f, +2.997194817e-04f, -4.091432488e-04f, -1.310542778e-03f, -2.185234209e-03f, -2.778100290e-03f, -2.877271248e-03f, -2.387751421e-03f, -1.372408895e-03f, -4.338151546e-05f, +1.295679903e-03f, +2.338172154e-03f, +2.864100685e-03f, +2.800464093e-03f, +2.233131932e-03f, +1.368613192e-03f, +4.617294971e-04f, -2.640035975e-04f, -6.762352148e-04f, -7.564632958e-04f, -5.831596506e-04f, -2.871365353e-04f, +1.009139408e-06f, +1.919595909e-04f, +2.553979460e-04f, +2.132640346e-04f, +1.166288410e-04f, +1.861052776e-05f, -4.560632273e-05f, -6.599843263e-05f, -5.296712092e-05f, -2.601792971e-05f, -2.470909225e-06f, +9.059582855e-06f, - +2.441236253e-05f, -1.343848373e-05f, -8.745817246e-05f, -1.562071244e-04f, -1.482428810e-04f, -8.250122829e-06f, +2.434767633e-04f, +4.836305458e-04f, +5.292736097e-04f, +2.484931299e-04f, -3.204885507e-04f, -9.285345060e-04f, -1.209960521e-03f, -8.872633042e-04f, +2.426784483e-05f, +1.150386728e-03f, +1.905650109e-03f, +1.803120048e-03f, +7.585646875e-04f, -8.012388243e-04f, -2.118524642e-03f, -2.496316882e-03f, -1.688026227e-03f, -5.612345016e-05f, +1.603375858e-03f, +2.479825823e-03f, +2.175131749e-03f, +8.991349016e-04f, -6.693020372e-04f, -1.763498582e-03f, -1.927767583e-03f, -1.214731161e-03f, -9.390924656e-05f, +8.453833775e-04f, +1.209137816e-03f, +9.595032747e-04f, +3.609011358e-04f, -2.198020113e-04f, -5.219487723e-04f, -4.940825608e-04f, -2.605996306e-04f, -4.978456466e-06f, +1.436426421e-04f, +1.587387043e-04f, +9.256208576e-05f, +1.721600120e-05f, -2.329239317e-05f, -2.574298666e-05f, - /* 3, 1 (48) */ - +3.396052832e-04f, +1.591133657e-04f, -4.374623277e-04f, -1.400296242e-03f, -2.376223656e-03f, -2.743414655e-03f, -1.834657337e-03f, +6.926024496e-04f, +4.483615851e-03f, +8.315174451e-03f, +1.030152497e-02f, +8.524000463e-03f, +1.938517101e-03f, -8.762814334e-03f, -2.073375210e-02f, -2.930879436e-02f, -2.915427248e-02f, -1.597503369e-02f, +1.175915853e-02f, +5.170491332e-02f, +9.765276679e-02f, +1.407979183e-01f, +1.719758725e-01f, +1.841940559e-01f, +1.746439613e-01f, +1.455238419e-01f, +1.033941387e-01f, +5.728347771e-02f, +1.617752467e-02f, -1.329587772e-02f, -2.828339973e-02f, -2.987251744e-02f, -2.210056439e-02f, -1.027113241e-02f, +7.885643586e-04f, +7.969164848e-03f, +1.031894517e-02f, +8.706792755e-03f, +4.994429940e-03f, +1.114094085e-03f, -1.607969408e-03f, -2.711428529e-03f, -2.469969652e-03f, -1.532275021e-03f, -5.419095556e-04f, +1.087888537e-04f, +3.357716612e-04f, +2.713236852e-04f, - -7.579093840e-04f, -9.219070127e-04f, -1.827354783e-04f, +1.783374647e-03f, +4.373082357e-03f, +5.881528531e-03f, +4.216000711e-03f, -1.614115712e-03f, -1.006912400e-02f, -1.689226469e-02f, -1.686525500e-02f, -6.993133677e-03f, +1.064224750e-02f, +2.846302026e-02f, +3.643673348e-02f, +2.751736964e-02f, +2.564257596e-03f, -2.847751395e-02f, -5.057808759e-02f, -5.123688496e-02f, -2.768368439e-02f, +1.060294958e-02f, +4.596007912e-02f, +6.135635567e-02f, +4.925148120e-02f, +1.557909228e-02f, -2.339002800e-02f, -4.953651123e-02f, -5.200595431e-02f, -3.204413258e-02f, -1.269160096e-03f, +2.515225176e-02f, +3.631855639e-02f, +3.019566694e-02f, +1.306134584e-02f, -5.105095897e-03f, -1.618386532e-02f, -1.736055983e-02f, -1.112034638e-02f, -2.591828819e-03f, +3.711924318e-03f, +5.884800197e-03f, +4.664967880e-03f, +2.098320476e-03f, -2.715220056e-06f, -8.912525278e-04f, -8.056141397e-04f, -3.751149726e-04f, - +3.053828783e-07f, +2.261492841e-05f, +4.994472502e-05f, +6.583325824e-05f, +5.049571450e-05f, -8.286747443e-06f, -1.035018317e-04f, -2.029922384e-04f, -2.550231936e-04f, -2.068425282e-04f, -3.139866995e-05f, +2.483352481e-04f, +5.499827626e-04f, +7.462678156e-04f, +7.035995661e-04f, +3.341544321e-04f, -3.573412500e-04f, -1.252380659e-03f, -2.136221350e-03f, -2.753768608e-03f, -2.888088780e-03f, -2.435226036e-03f, -1.447881465e-03f, -1.301043476e-04f, +1.217763015e-03f, +2.286525170e-03f, +2.848573324e-03f, +2.820819667e-03f, +2.279852789e-03f, +1.426529195e-03f, +5.150546432e-04f, -2.270243687e-04f, -6.605637628e-04f, -7.600641439e-04f, -5.990474603e-04f, -3.066192357e-04f, -1.479270955e-05f, +1.837446921e-04f, +2.549577521e-04f, +2.180872571e-04f, +1.231996048e-04f, +2.398620325e-05f, -4.289486633e-05f, -6.588302403e-05f, -5.440070923e-05f, -2.774567533e-05f, -3.629207216e-06f, +8.718068193e-06f, - +2.537955790e-05f, -9.816694012e-06f, -8.234517685e-05f, -1.533714251e-04f, -1.523014450e-04f, -2.100545850e-05f, +2.263313703e-04f, +4.724027832e-04f, +5.352645915e-04f, +2.759836047e-04f, -2.802718001e-04f, -8.962615228e-04f, -1.208321983e-03f, -9.267164761e-04f, -4.445893301e-05f, +1.084561664e-03f, +1.880042092e-03f, +1.838882264e-03f, +8.456970987e-04f, -7.023757360e-04f, -2.058090656e-03f, -2.507961371e-03f, -1.769307145e-03f, -1.682574121e-04f, +1.515521846e-03f, +2.458507842e-03f, +2.227781133e-03f, +9.958594564e-04f, -5.780763036e-04f, -1.720065970e-03f, -1.946313220e-03f, -1.277443204e-03f, -1.643306246e-04f, +8.011294892e-04f, +1.205814231e-03f, +9.890754911e-04f, +4.014233099e-04f, -1.899484114e-04f, -5.132739533e-04f, -5.037125890e-04f, -2.776568924e-04f, -1.866172927e-05f, +1.384937071e-04f, +1.609470350e-04f, +9.764105202e-05f, +2.114422789e-05f, -2.201572656e-05f, -2.635586685e-05f, - /* 3, 2 (48) */ - +3.399106661e-04f, +1.817282941e-04f, -3.875176027e-04f, -1.334462984e-03f, -2.325727942e-03f, -2.751701403e-03f, -1.938159169e-03f, +4.896102112e-04f, +4.228592657e-03f, +8.108331923e-03f, +1.027012630e-02f, +8.772335711e-03f, +2.488499864e-03f, -8.016546519e-03f, -2.003015253e-02f, -2.897463993e-02f, -2.951161373e-02f, -1.722741435e-02f, +9.622937179e-03f, +4.895114472e-02f, +9.476467801e-02f, +1.383626923e-01f, +1.705279911e-01f, +1.840639515e-01f, +1.758617243e-01f, +1.478103671e-01f, +1.062427120e-01f, +6.010429737e-02f, +1.845737746e-02f, -1.186934853e-02f, -2.776834509e-02f, -3.009954181e-02f, -2.276112815e-02f, -1.103119655e-02f, +1.895168983e-04f, +7.662545612e-03f, +1.030415246e-02f, +8.890537447e-03f, +5.249387692e-03f, +1.332181343e-03f, -1.484769803e-03f, -2.687442326e-03f, -2.512864519e-03f, -1.598158045e-03f, -5.963102648e-04f, +8.104317839e-05f, +3.321424540e-04f, +2.800417534e-04f, - -7.325298261e-04f, -9.317237067e-04f, -2.650806551e-04f, +1.630003222e-03f, +4.220780912e-03f, +5.860523072e-03f, +4.442332082e-03f, -1.141712929e-03f, -9.533859405e-03f, -1.661628108e-02f, -1.714552680e-02f, -7.889395200e-03f, +9.433925520e-03f, +2.753630378e-02f, +3.639227455e-02f, +2.860193131e-02f, +4.444299688e-03f, -2.663863169e-02f, -4.973239049e-02f, -5.193926069e-02f, -2.974177505e-02f, +8.094988206e-03f, +4.419077197e-02f, +6.118809826e-02f, +5.076700305e-02f, +1.803760013e-02f, -2.116224687e-02f, -4.854065178e-02f, -5.258403061e-02f, -3.376419855e-02f, -3.215473316e-03f, +2.387480855e-02f, +3.615422576e-02f, +3.099679643e-02f, +1.426716007e-02f, -4.116020405e-03f, -1.578244201e-02f, -1.755050824e-02f, -1.163362033e-02f, -3.095541408e-03f, +3.434267425e-03f, +5.866138468e-03f, +4.803461587e-03f, +2.259267511e-03f, +9.492583196e-05f, -8.701082999e-04f, -8.276298662e-04f, -4.014708395e-04f, - -7.004638822e-07f, +2.094611058e-05f, +4.836597661e-05f, +6.556179178e-05f, +5.267555978e-05f, -3.348891556e-06f, -9.696823219e-05f, -1.975722132e-04f, -2.542303720e-04f, -2.135123302e-04f, -4.595853568e-05f, +2.290726963e-04f, +5.327635541e-04f, +7.397323830e-04f, +7.153144195e-04f, +3.672927030e-04f, -3.063673185e-04f, -1.194188938e-03f, -2.086155759e-03f, -2.727511272e-03f, -2.896559589e-03f, -2.480561472e-03f, -1.522030573e-03f, -2.167066311e-04f, +1.138728152e-03f, +2.232849779e-03f, +2.830687958e-03f, +2.839128589e-03f, +2.325335806e-03f, +1.484227549e-03f, +5.690718432e-04f, -1.888012286e-04f, -6.435540565e-04f, -7.626289262e-04f, -6.144215072e-04f, -3.261181077e-04f, -3.097912402e-05f, +1.750143867e-04f, +2.540851657e-04f, +2.226829976e-04f, +1.297595871e-04f, +2.949687597e-05f, -4.000483767e-05f, -6.562976180e-05f, -5.577576691e-05f, -2.948637421e-05f, -4.836690636e-06f, +8.328888420e-06f, - +2.619825575e-05f, -6.354954773e-06f, -7.723840020e-05f, -1.502509361e-04f, -1.558265929e-04f, -3.327077228e-05f, +2.092054228e-04f, +4.604462536e-04f, +5.399406518e-04f, +3.022388744e-04f, -2.403350278e-04f, -8.627779927e-04f, -1.204266684e-03f, -9.636961824e-04f, -1.121401310e-04f, +1.017409233e-03f, +1.851031519e-03f, +1.870745738e-03f, +9.305377716e-04f, -6.027510728e-04f, -1.993968156e-03f, -2.514749879e-03f, -1.847060106e-03f, -2.800528054e-04f, +1.424636953e-03f, +2.432392809e-03f, +2.276349786e-03f, +1.091209358e-03f, -4.850599651e-04f, -1.672878888e-03f, -1.961212656e-03f, -1.338372963e-03f, -2.353939035e-04f, +7.545604759e-04f, +1.199955147e-03f, +1.017160390e-03f, +4.419668961e-04f, -1.589740718e-04f, -5.032359372e-04f, -5.124752704e-04f, -2.946044465e-04f, -3.277937540e-05f, +1.327903489e-04f, +1.628132499e-04f, +1.026786732e-04f, +2.521744019e-05f, -2.057882056e-05f, -2.689529487e-05f, - /* 3, 3 (48) */ - +3.392102022e-04f, +2.026744047e-04f, -3.391516261e-04f, -1.268901192e-03f, -2.273052382e-03f, -2.755050294e-03f, -2.035127401e-03f, +2.920379980e-04f, +3.974362285e-03f, +7.894819592e-03f, +1.022416777e-02f, +9.001408407e-03f, +3.021263418e-03f, -7.276814136e-03f, -1.931483811e-02f, -2.860734723e-02f, -2.981798105e-02f, -1.842160329e-02f, +7.536781420e-03f, +4.622363344e-02f, +9.186811842e-02f, +1.358821308e-01f, +1.690059605e-01f, +1.838472449e-01f, +1.770004525e-01f, +1.500432169e-01f, +1.090734000e-01f, +6.294342596e-02f, +2.078271327e-02f, -1.038512098e-02f, -2.719927325e-02f, -3.028834304e-02f, -2.340468221e-02f, -1.179382548e-02f, -4.249046089e-04f, +7.336427504e-03f, +1.027317334e-02f, +9.065551833e-03f, +5.503472858e-03f, +1.554864340e-03f, -1.355010216e-03f, -2.657945450e-03f, -2.552869356e-03f, -1.663787806e-03f, -6.520860317e-04f, +5.155680418e-05f, +3.273057633e-04f, +2.883706418e-04f, - -7.063315703e-04f, -9.380786615e-04f, -3.423190553e-04f, +1.479752286e-03f, +4.064954319e-03f, +5.827252300e-03f, +4.651537505e-03f, -6.812666753e-04f, -8.993918753e-03f, -1.631404221e-02f, -1.738586183e-02f, -8.752173193e-03f, +8.229658837e-03f, +2.657260760e-02f, +3.628013442e-02f, +2.961934054e-02f, +6.295331207e-03f, -2.476788595e-02f, -4.880185272e-02f, -5.254201177e-02f, -3.173574321e-02f, +5.580238328e-03f, +4.234371187e-02f, +6.090804546e-02f, +5.219164000e-02f, +2.046999293e-02f, -1.888589709e-02f, -4.744944242e-02f, -5.306909058e-02f, -3.543707744e-02f, -5.176685972e-03f, +2.253643559e-02f, +3.591883186e-02f, +3.175135691e-02f, +1.546711522e-02f, -3.098860015e-03f, -1.534047511e-02f, -1.770948231e-02f, -1.213685627e-02f, -3.608016678e-03f, +3.139662979e-03f, +5.833359092e-03f, +4.936251936e-03f, +2.422080761e-03f, +1.976045052e-04f, -8.448908597e-04f, -8.482086868e-04f, -4.283661344e-04f, - -1.654356283e-06f, +1.930311625e-05f, +4.674879763e-05f, +6.517067925e-05f, +5.468063210e-05f, +1.433467579e-06f, -9.046911708e-05f, -1.919817537e-04f, -2.530493507e-04f, -2.196702144e-04f, -6.007820864e-05f, +2.099383286e-04f, +5.151702243e-04f, +7.322791757e-04f, +7.257348527e-04f, +3.991203899e-04f, -2.562636991e-04f, -1.136029036e-03f, -2.035100429e-03f, -2.699372312e-03f, -2.902692508e-03f, -2.523725649e-03f, -1.594790730e-03f, -3.031081595e-04f, +1.058646560e-03f, +2.177187626e-03f, +2.810445952e-03f, +2.855354432e-03f, +2.369520845e-03f, +1.541644556e-03f, +6.237328043e-04f, -1.493554528e-04f, -6.251990193e-04f, -7.641301153e-04f, -6.292467916e-04f, -3.456034145e-04f, -4.753378261e-05f, +1.657699032e-04f, +2.527702729e-04f, +2.270370214e-04f, +1.362966996e-04f, +3.513638102e-05f, -3.693610856e-05f, -6.523443877e-05f, -5.708715158e-05f, -3.123643501e-05f, -6.092289786e-06f, +7.891082444e-06f, - +2.687305772e-05f, -3.056904113e-06f, -7.215255303e-05f, -1.468651244e-04f, -1.588277613e-04f, -4.503105467e-05f, +1.921397021e-04f, +4.478085433e-04f, +5.433234257e-04f, +3.272279914e-04f, -2.007601133e-04f, -8.281786720e-04f, -1.197843781e-03f, -9.981618200e-04f, -1.786487368e-04f, +9.490838417e-04f, +1.818712806e-03f, +1.898679610e-03f, +1.012931182e-03f, -5.025707398e-04f, -1.926302692e-03f, -2.516683224e-03f, -1.921134244e-03f, -3.912847393e-04f, +1.330900520e-03f, +2.401520771e-03f, +2.320722836e-03f, +1.184983313e-03f, -3.904304742e-04f, -1.622002527e-03f, -1.972398693e-03f, -1.397372766e-03f, -3.069578549e-04f, +7.057411623e-04f, +1.191531114e-03f, +1.043669022e-03f, +4.824419647e-04f, -1.269242815e-04f, -4.918245151e-04f, -5.203262624e-04f, -3.113972596e-04f, -4.730931145e-05f, +1.265281901e-04f, +1.643188099e-04f, +1.076580508e-04f, +2.942920216e-05f, -1.897854157e-05f, -2.735491682e-05f, - /* 3, 4 (48) */ - +3.375558459e-04f, +2.219775210e-04f, -2.924028285e-04f, -1.203730513e-03f, -2.218371750e-03f, -2.753616827e-03f, -2.125596518e-03f, +1.000562444e-04f, +3.721312934e-03f, +7.675149378e-03f, +1.016408956e-02f, +9.211346736e-03f, +3.536433642e-03f, -6.544534960e-03f, -1.858910326e-02f, -2.820822684e-02f, -3.007424475e-02f, -1.955763232e-02f, +5.501680991e-03f, +4.352426113e-02f, +8.896542591e-02f, +1.333584052e-01f, +1.674111697e-01f, +1.835441367e-01f, +1.780590990e-01f, +1.522204045e-01f, +1.118838460e-01f, +6.579878040e-02f, +2.315223411e-02f, -8.843476421e-03f, -2.657554044e-02f, -3.043769849e-02f, -2.402988123e-02f, -1.255795560e-02f, -1.054151401e-03f, +6.990824090e-03f, +1.022563956e-02f, +9.231321737e-03f, +5.756243131e-03f, +1.781901362e-03f, -1.218713516e-03f, -2.622809069e-03f, -2.589805465e-03f, -1.729022245e-03f, -7.091731833e-04f, +2.032036918e-05f, +3.212134736e-04f, +2.962617242e-04f, - -6.794585126e-04f, -9.411355656e-04f, -4.144716084e-04f, +1.332887162e-03f, +3.906126557e-03f, +5.782221245e-03f, +4.843677207e-03f, -2.334581321e-04f, -8.450595327e-03f, -1.598681422e-02f, -1.758662195e-02f, -9.580351865e-03f, +7.031815056e-03f, +2.557444578e-02f, +3.610148568e-02f, +3.056842438e-02f, +8.114044013e-03f, -2.286920634e-02f, -4.778892153e-02f, -5.304458251e-02f, -3.366204590e-02f, +3.063555103e-03f, +4.042257762e-02f, +6.051676072e-02f, +5.352254052e-02f, +2.287151370e-02f, -1.656517425e-02f, -4.626445911e-02f, -5.345952105e-02f, -3.705907997e-02f, -7.149084665e-03f, +2.113906282e-02f, +3.561187401e-02f, +3.245709807e-02f, +1.665864633e-02f, -2.055190993e-03f, -1.485803315e-02f, -1.783640660e-02f, -1.262868078e-02f, -4.128342940e-03f, +2.828265719e-03f, +5.786049781e-03f, +5.062780126e-03f, +2.586399571e-03f, +3.052625560e-04f, -8.154616576e-04f, -8.671872283e-04f, -4.557210512e-04f, - -2.555965243e-06f, +1.768877557e-05f, +4.509804999e-05f, +6.466475356e-05f, +5.651265163e-05f, +6.056241004e-06f, -8.401496727e-05f, -1.862350249e-04f, -2.514921708e-04f, -2.253190591e-04f, -7.374620772e-05f, +1.909582720e-04f, +4.972373481e-04f, +7.239395436e-04f, +7.348755228e-04f, +4.296254235e-04f, -2.070710274e-04f, -1.077961627e-03f, -1.983118864e-03f, -2.669397502e-03f, -2.906498868e-03f, -2.564688960e-03f, -1.666098084e-03f, -3.892289646e-04f, +9.775907166e-04f, +2.119582649e-03f, +2.787851257e-03f, +2.869462815e-03f, +2.412348689e-03f, +1.598716139e-03f, +6.789878318e-04f, -1.087101536e-04f, -6.054931951e-04f, -7.645411078e-04f, -6.434883797e-04f, -3.650447888e-04f, -6.443940815e-05f, +1.560133449e-04f, +2.510036692e-04f, +2.311351558e-04f, +1.427985743e-04f, +4.089813856e-05f, -3.368889852e-05f, -6.469301128e-05f, -5.832969341e-05f, -3.299212377e-05f, -7.394779215e-06f, +7.403782787e-06f, - +2.740886232e-05f, +7.449142443e-08f, -6.710173023e-05f, -1.432335341e-04f, -1.613155044e-04f, -5.627305695e-05f, +1.751737233e-04f, +4.345377090e-04f, +5.454371371e-04f, +3.509236252e-04f, -1.616265181e-04f, -7.925591648e-04f, -1.189106918e-03f, -1.030078903e-03f, -2.438619218e-04f, +8.797406818e-04f, +1.783186529e-03f, +1.922661652e-03f, +1.092728083e-03f, -4.020406563e-04f, -1.855246655e-03f, -2.513772428e-03f, -1.991386654e-03f, -5.017295534e-04f, +1.234498089e-03f, +2.365941895e-03f, +2.360793830e-03f, +1.276982314e-03f, -2.943698963e-04f, -1.567510509e-03f, -1.979811515e-03f, -1.454297523e-03f, -3.788783831e-04f, +6.547422921e-04f, +1.180518003e-03f, +1.068514493e-03f, +5.227570188e-04f, -9.384783611e-05f, -4.790325759e-04f, -5.272223775e-04f, -3.279894630e-04f, -6.222770278e-05f, +1.197042549e-04f, +1.654455694e-04f, +1.125618207e-04f, +3.377236041e-05f, -1.721219165e-05f, -2.772838204e-05f, - /* 3, 5 (48) */ - +3.349998807e-04f, +2.396662965e-04f, -2.473047785e-04f, -1.139065760e-03f, -2.161859098e-03f, -2.747560586e-03f, -2.209611485e-03f, -8.617878055e-05f, +3.469820763e-03f, +7.449830319e-03f, +1.009034335e-02f, +9.402305008e-03f, +4.033670990e-03f, -5.820595416e-03f, -1.785422774e-02f, -2.777860141e-02f, -3.028131578e-02f, -2.063559395e-02f, +3.518562128e-03f, +4.085486363e-02f, +8.605892704e-02f, +1.307937162e-01f, +1.657450717e-01f, +1.831549078e-01f, +1.790366898e-01f, +1.543399871e-01f, +1.146716972e-01f, +6.866824321e-02f, +2.556458280e-02f, -7.244760282e-03f, -2.589655261e-02f, -3.054640865e-02f, -2.463537442e-02f, -1.332249670e-02f, -1.697639780e-03f, +6.625779301e-03f, +1.016120015e-02f, +9.387335081e-03f, +6.007246800e-03f, +2.013036517e-03f, -1.075914942e-03f, -2.581910930e-03f, -2.623494363e-03f, -1.793715256e-03f, -7.675028767e-04f, -1.267175460e-05f, +3.138186943e-04f, +3.036655070e-04f, - -6.520496503e-04f, -9.410610742e-04f, -4.815733386e-04f, +1.189653627e-03f, +3.744811053e-03f, +5.725948188e-03f, +5.018850930e-03f, +2.010795769e-04f, -7.905158190e-03f, -1.563589059e-02f, -1.774824846e-02f, -1.037291103e-02f, +5.842708137e-03f, +2.454436688e-02f, +3.585762376e-02f, +3.144816507e-02f, +9.897230542e-03f, -2.094654469e-02f, -4.669619345e-02f, -5.344662316e-02f, -3.551729255e-02f, +5.497826750e-04f, +3.843119097e-02f, +6.001503116e-02f, +5.475703861e-02f, +2.523745560e-02f, -1.420438042e-02f, -4.498747679e-02f, -5.375389095e-02f, -3.862659048e-02f, -9.128896180e-03f, +1.968476530e-02f, +3.523299562e-02f, +3.311184036e-02f, +1.783916434e-02f, -9.866765005e-04f, -1.433527613e-02f, -1.793025443e-02f, -1.310771336e-02f, -4.655565318e-03f, +2.500276256e-03f, +5.723822078e-03f, +5.182484381e-03f, +2.751845140e-03f, +4.178243766e-04f, -7.816892972e-04f, -8.843994200e-04f, -4.834494332e-04f, - -3.405100316e-06f, +1.610575965e-05f, +4.341851334e-05f, +6.404893482e-05f, +5.817362492e-05f, +1.051574984e-05f, -7.761590678e-05f, -1.803461058e-04f, -2.495712134e-04f, -2.304625031e-04f, -8.695202101e-05f, +1.721578512e-04f, +4.789992715e-04f, +7.147454391e-04f, +7.427524870e-04f, +4.587975622e-04f, -1.588282957e-04f, -1.020046567e-03f, -1.930274992e-03f, -2.637634286e-03f, -2.907992474e-03f, -2.603424299e-03f, -1.735890485e-03f, -4.749894117e-04f, +8.956342544e-04f, +2.060081029e-03f, +2.762910412e-03f, +2.881421461e-03f, +2.453761118e-03f, +1.655377914e-03f, +7.347858775e-04f, -6.689027310e-05f, -5.844327786e-04f, -7.638362764e-04f, -6.571114549e-04f, -3.844112664e-04f, -8.167777557e-05f, +1.457477053e-04f, +2.487764871e-04f, +2.349633169e-04f, +1.492525790e-04f, +4.677515583e-05f, -3.026378360e-05f, -6.400161198e-05f, -5.949820540e-05f, -3.474956812e-05f, -8.742775860e-06f, +6.866220693e-06f, - +2.781083669e-05f, +3.036922064e-06f, -6.209938901e-05f, -1.393757265e-04f, -1.633014308e-04f, -6.698527863e-05f, +1.583456646e-04f, +4.206821447e-04f, +5.463084825e-04f, +3.733020566e-04f, -1.230111396e-04f, -7.560156839e-04f, -1.178114037e-03f, -1.059419058e-03f, -3.076612684e-04f, +8.095353725e-04f, +1.744559142e-03f, +1.942678244e-03f, +1.169785795e-03f, -3.013663031e-04f, -1.780958912e-03f, -2.506038658e-03f, -2.057682689e-03f, -6.111653058e-04f, +1.135620996e-03f, +2.325716381e-03f, +2.396464998e-03f, +1.367010098e-03f, -1.970645351e-04f, -1.509484792e-03f, -1.983398884e-03f, -1.509005084e-03f, -4.510088204e-04f, +6.016404427e-04f, +1.166897134e-03f, +1.091612204e-03f, +5.628191870e-04f, -5.979698620e-05f, -4.648561908e-04f, -5.331217223e-04f, -3.443344526e-04f, -7.750898066e-05f, +1.123170193e-04f, +1.661758416e-04f, +1.173721915e-04f, +3.823904117e-05f, -1.527753494e-05f, -2.800936709e-05f, - /* 3, 6 (48) */ - +3.315947804e-04f, +2.557720562e-04f, -2.038862651e-04f, -1.075016825e-03f, -2.103685473e-03f, -2.737044836e-03f, -2.287227392e-03f, -2.665248864e-04f, +3.220249550e-03f, +7.219367816e-03f, +1.000339133e-02f, +9.574462859e-03f, +4.512670262e-03f, -5.105849977e-03f, -1.711147525e-02f, -2.731980385e-02f, -3.044014407e-02f, -2.165564052e-02f, +1.588287136e-03f, +3.821722934e-02f, +8.315093457e-02f, +1.281902919e-01f, +1.640091812e-01f, +1.826799183e-01f, +1.799323240e-01f, +1.564000682e-01f, +1.174346076e-01f, +7.154966467e-02f, +2.801834392e-02f, -5.589382368e-03f, -2.516176673e-02f, -3.061329892e-02f, -2.521980720e-02f, -1.408633298e-02f, -2.354751235e-03f, +6.241368035e-03f, +1.007952237e-02f, +9.533082787e-03f, +6.256023287e-03f, +2.247999834e-03f, -9.266623627e-04f, -2.535135775e-03f, -2.653758147e-03f, -1.857716868e-03f, -8.270010821e-04f, -4.742132272e-05f, +3.050759185e-04f, +3.105317277e-04f, - -6.242388136e-04f, -9.380241521e-04f, -5.436727276e-04f, +1.050277901e-03f, +3.581509622e-03f, +5.658962910e-03f, +5.177196595e-03f, +6.217617216e-04f, -7.358849707e-03f, -1.526258854e-02f, -1.787125960e-02f, -1.112892671e-02f, +4.664594100e-03f, +2.348494782e-02f, +3.554996249e-02f, +3.225770044e-02f, +1.164178968e-02f, -1.900386645e-02f, -4.552640766e-02f, -5.374798947e-02f, -3.729825146e-02f, -1.956255983e-03f, +3.637350828e-02f, +5.940386586e-02f, +5.589265961e-02f, +2.756317198e-02f, -1.180791542e-02f, -4.362046669e-02f, -5.395095548e-02f, -4.013607527e-02f, -1.111229506e-02f, +1.817576022e-02f, +3.478198680e-02f, +3.371348080e-02f, +1.900606147e-02f, +1.049357040e-04f, -1.377245694e-02f, -1.799005142e-02f, -1.357256955e-02f, -5.188687040e-03f, +2.155941804e-03f, +5.646313098e-03f, +5.294801400e-03f, +2.918020982e-03f, +5.351965681e-04f, -7.434502560e-04f, -8.996769549e-04f, -5.114588003e-04f, - -4.201705979e-06f, +1.455657929e-05f, +4.171487722e-05f, +6.332821795e-05f, +5.966583346e-05f, +1.480872188e-05f, -7.128169313e-05f, -1.743289664e-04f, -2.472991710e-04f, -2.351049243e-04f, -9.968610268e-05f, +1.535615665e-04f, +4.604900653e-04f, +7.047293621e-04f, +7.493831600e-04f, +4.866283813e-04f, -1.115728219e-04f, -9.623428273e-04f, -1.876633085e-03f, -2.604131718e-03f, -2.907189572e-03f, -2.639907083e-03f, -1.804107560e-03f, -5.603102941e-04f, +8.128518704e-04f, +1.998731146e-03f, +2.735632550e-03f, +2.891200247e-03f, +2.493700993e-03f, +1.711565276e-03f, +7.910745906e-04f, -2.392257303e-05f, -5.620156431e-04f, -7.619910206e-04f, -6.700813706e-04f, -4.036713219e-04f, -9.922972144e-05f, +1.349768817e-04f, +2.460804233e-04f, +2.385075365e-04f, +1.556458342e-04f, +5.276002987e-05f, -2.666170461e-05f, -6.315656259e-05f, -6.058749407e-05f, -3.650476181e-05f, -1.013473749e-05f, +6.277731151e-06f, - +2.808438836e-05f, +5.828718348e-06f, -5.715832945e-05f, -1.353112227e-04f, -1.647981405e-04f, -7.715795035e-05f, +1.416923013e-04f, +4.062904505e-04f, +5.459665106e-04f, +3.943431627e-04f, -8.498817533e-05f, -7.186448143e-04f, -1.164927174e-03f, -1.086160006e-03f, -3.699329842e-04f, +7.386236059e-04f, +1.702942683e-03f, +1.958724338e-03f, +1.243968472e-03f, -2.007522737e-04f, -1.703604432e-03f, -2.493513154e-03f, -2.119896241e-03f, -7.193722573e-04f, +1.034465965e-03f, +2.280914348e-03f, +2.427647501e-03f, +1.454873583e-03f, -9.870454600e-05f, -1.448015545e-03f, -1.983116330e-03f, -1.561356583e-03f, -5.232002321e-04f, +5.465179258e-04f, +1.150655407e-03f, +1.112880096e-03f, +6.025344230e-04f, -2.482737724e-05f, -4.492946910e-04f, -5.379838352e-04f, -3.603849945e-04f, -9.312586483e-05f, +1.043664581e-04f, +1.664924659e-04f, +1.220709847e-04f, +4.282064965e-05f, -1.317282348e-05f, -2.819160034e-05f, - /* 3, 7 (48) */ - +3.273930744e-04f, +2.703286355e-04f, -1.621713879e-04f, -1.011688607e-03f, -2.044019640e-03f, -2.722236114e-03f, -2.358509085e-03f, -4.408538528e-04f, +2.972950379e-03f, +6.984262892e-03f, +9.903705225e-03f, +9.728024426e-03f, +4.973160327e-03f, -4.401120615e-03f, -1.636209209e-02f, -2.683317547e-02f, -3.055171689e-02f, -2.261798335e-02f, -2.883459489e-04f, +3.561309763e-02f, +8.024374500e-02f, +1.255503848e-01f, +1.622050736e-01f, +1.821196081e-01f, +1.807451759e-01f, +1.583987993e-01f, +1.201702402e-01f, +7.444086492e-02f, +3.051204491e-02f, -3.877817092e-03f, -2.437069214e-02f, -3.063722149e-02f, -2.578182284e-02f, -1.484832400e-02f, -3.024832606e-03f, +5.837696713e-03f, +9.980292652e-03f, +9.668059669e-03f, +6.502103710e-03f, +2.486507371e-03f, -7.710165285e-04f, -2.482375745e-03f, -2.680419852e-03f, -1.920873431e-03f, -8.875885761e-04f, -8.392608453e-05f, +2.949411810e-04f, +3.168094589e-04f, - -5.961544252e-04f, -9.321954338e-04f, -6.008310570e-04f, +9.149666782e-04f, +3.416711482e-03f, +5.581804959e-03f, +5.318888896e-03f, +1.028052172e-03f, -6.812883197e-03f, -1.486824537e-02f, -1.795624778e-02f, -1.184757153e-02f, +3.499666927e-03f, +2.239878781e-02f, +3.518002950e-02f, +3.299632404e-02f, +1.334473237e-02f, -1.704514211e-02f, -4.428243918e-02f, -5.394874174e-02f, -3.900185590e-02f, -4.449769137e-03f, +3.425361204e-02f, +5.868449360e-02f, +5.692712557e-02f, +2.984408633e-02f, -9.380267921e-03f, -4.216559311e-02f, -5.404966003e-02f, -4.158409081e-02f, -1.309541139e-02f, +1.661440363e-02f, +3.425878657e-02f, +3.425999873e-02f, +2.015671688e-02f, +1.217815800e-03f, -1.316992252e-02f, -1.801487879e-02f, -1.402186424e-02f, -5.726670876e-03f, +1.795556809e-03f, +5.553187233e-03f, +5.399167858e-03f, +3.084513448e-03f, +6.572675528e-04f, -7.006296063e-04f, -9.128497784e-04f, -5.396504007e-04f, - -4.945857699e-06f, +1.304358400e-05f, +3.999173360e-05f, +6.250766044e-05f, +6.099182201e-05f, +1.893228750e-05f, -6.502170838e-05f, -1.681974456e-04f, -2.446890194e-04f, -2.392514164e-04f, -1.119398682e-04f, +1.351930717e-04f, +4.417434806e-04f, +6.939243061e-04f, +7.547862708e-04f, +5.131112602e-04f, -6.534022092e-05f, -9.049084268e-04f, -1.822257674e-03f, -2.568940384e-03f, -2.904108821e-03f, -2.674115275e-03f, -1.870690780e-03f, -6.451129269e-04f, +7.293192398e-04f, +1.935583524e-03f, +2.706029398e-03f, +2.898771256e-03f, +2.532112331e-03f, +1.767213469e-03f, +8.478003715e-04f, +2.016437824e-05f, -5.382413675e-04f, -7.589818174e-04f, -6.823637033e-04f, -4.227929053e-04f, -1.170751551e-04f, +1.237056884e-04f, +2.429077650e-04f, +2.417539890e-04f, +1.619652302e-04f, +5.884495123e-05f, -2.288397489e-05f, -6.215438664e-05f, -6.159237027e-05f, -3.825356979e-05f, -1.156896150e-05f, +5.637757799e-06f, - +2.823513717e-05f, +8.448833148e-06f, -5.229067766e-05f, -1.310594480e-04f, -1.658191595e-04f, -8.678301235e-05f, +1.252489455e-04f, +3.914113038e-04f, +5.444424981e-04f, +4.140303935e-04f, -4.762899468e-05f, -6.805432797e-04f, -1.149612253e-03f, -1.110285526e-03f, -4.305681031e-04f, +6.671607956e-04f, +1.658454472e-03f, +1.970803397e-03f, +1.315147357e-03f, -1.004018296e-04f, -1.623353899e-03f, -2.476237130e-03f, -2.177910002e-03f, -8.261333500e-04f, +9.312346806e-04f, +2.231615706e-03f, +2.454261653e-03f, +1.540383314e-03f, +5.164610520e-07f, -1.383201013e-03f, -1.978927318e-03f, -1.611216795e-03f, -5.953017304e-04f, +4.894626724e-04f, +1.131785412e-03f, +1.132238874e-03f, +6.418077115e-04f, +1.100202104e-05f, -4.323507393e-04f, -5.417698232e-04f, -3.760933330e-04f, -1.090493913e-04f, +9.585408879e-05f, +1.663788745e-04f, +1.266396775e-04f, +4.750787164e-05f, -1.089682223e-05f, -2.826888741e-05f, - /* 3, 8 (48) */ - +3.224472167e-04f, +2.833722195e-04f, -1.221796543e-04f, -9.491809464e-04f, -1.983027818e-03f, -2.703303827e-03f, -2.423530794e-03f, -6.090512983e-04f, +2.728261360e-03f, +6.745011475e-03f, +9.791765357e-03f, +9.863217497e-03f, +5.414903808e-03f, -3.707196309e-03f, -1.560730582e-02f, -2.632006421e-02f, -3.061705711e-02f, -2.352289177e-02f, -2.110603623e-03f, +3.304415724e-02f, +7.733963617e-02f, +1.228762696e-01f, +1.603343828e-01f, +1.814744951e-01f, +1.814744951e-01f, +1.603343828e-01f, +1.228762696e-01f, +7.733963617e-02f, +3.304415724e-02f, -2.110603623e-03f, -2.352289177e-02f, -3.061705711e-02f, -2.632006421e-02f, -1.560730582e-02f, -3.707196309e-03f, +5.414903808e-03f, +9.863217497e-03f, +9.791765357e-03f, +6.745011475e-03f, +2.728261360e-03f, -6.090512983e-04f, -2.423530794e-03f, -2.703303827e-03f, -1.983027818e-03f, -9.491809464e-04f, -1.221796543e-04f, +2.833722195e-04f, +3.224472167e-04f, - -5.679192881e-04f, -9.237466006e-04f, -6.531217347e-04f, +7.839072303e-04f, +3.250892322e-03f, +5.495021947e-03f, +5.444137841e-03f, +1.419463476e-03f, -6.268440699e-03f, -1.445421498e-02f, -1.800387677e-02f, -1.252811481e-02f, +2.350054674e-03f, +2.128850229e-02f, +3.474946140e-02f, +3.366348484e-02f, +1.500318684e-02f, -1.507433871e-02f, -4.296729183e-02f, -5.404914357e-02f, -4.062520980e-02f, -6.926006268e-03f, +3.207570204e-02f, +5.785836025e-02f, +5.785836025e-02f, +3.207570204e-02f, -6.926006268e-03f, -4.062520980e-02f, -5.404914357e-02f, -4.296729183e-02f, -1.507433871e-02f, +1.500318684e-02f, +3.366348484e-02f, +3.474946140e-02f, +2.128850229e-02f, +2.350054674e-03f, -1.252811481e-02f, -1.800387677e-02f, -1.445421498e-02f, -6.268440699e-03f, +1.419463476e-03f, +5.444137841e-03f, +5.495021947e-03f, +3.250892322e-03f, +7.839072303e-04f, -6.531217347e-04f, -9.237466006e-04f, -5.679192881e-04f, - -5.637757799e-06f, +1.156896150e-05f, +3.825356979e-05f, +6.159237027e-05f, +6.215438664e-05f, +2.288397489e-05f, -5.884495123e-05f, -1.619652302e-04f, -2.417539890e-04f, -2.429077650e-04f, -1.237056884e-04f, +1.170751551e-04f, +4.227929053e-04f, +6.823637033e-04f, +7.589818174e-04f, +5.382413675e-04f, -2.016437824e-05f, -8.478003715e-04f, -1.767213469e-03f, -2.532112331e-03f, -2.898771256e-03f, -2.706029398e-03f, -1.935583524e-03f, -7.293192398e-04f, +6.451129269e-04f, +1.870690780e-03f, +2.674115275e-03f, +2.904108821e-03f, +2.568940384e-03f, +1.822257674e-03f, +9.049084268e-04f, +6.534022092e-05f, -5.131112602e-04f, -7.547862708e-04f, -6.939243061e-04f, -4.417434806e-04f, -1.351930717e-04f, +1.119398682e-04f, +2.392514164e-04f, +2.446890194e-04f, +1.681974456e-04f, +6.502170838e-05f, -1.893228750e-05f, -6.099182201e-05f, -6.250766044e-05f, -3.999173360e-05f, -1.304358400e-05f, +4.945857699e-06f, - +2.826888741e-05f, +1.089682223e-05f, -4.750787164e-05f, -1.266396775e-04f, -1.663788745e-04f, -9.585408879e-05f, +1.090493913e-04f, +3.760933330e-04f, +5.417698232e-04f, +4.323507393e-04f, -1.100202104e-05f, -6.418077115e-04f, -1.132238874e-03f, -1.131785412e-03f, -4.894626724e-04f, +5.953017304e-04f, +1.611216795e-03f, +1.978927318e-03f, +1.383201013e-03f, -5.164610520e-07f, -1.540383314e-03f, -2.454261653e-03f, -2.231615706e-03f, -9.312346806e-04f, +8.261333500e-04f, +2.177910002e-03f, +2.476237130e-03f, +1.623353899e-03f, +1.004018296e-04f, -1.315147357e-03f, -1.970803397e-03f, -1.658454472e-03f, -6.671607956e-04f, +4.305681031e-04f, +1.110285526e-03f, +1.149612253e-03f, +6.805432797e-04f, +4.762899468e-05f, -4.140303935e-04f, -5.444424981e-04f, -3.914113038e-04f, -1.252489455e-04f, +8.678301235e-05f, +1.658191595e-04f, +1.310594480e-04f, +5.229067766e-05f, -8.448833148e-06f, -2.823513717e-05f, - /* 3, 9 (48) */ - +3.168094589e-04f, +2.949411810e-04f, -8.392608453e-05f, -8.875885761e-04f, -1.920873431e-03f, -2.680419852e-03f, -2.482375745e-03f, -7.710165285e-04f, +2.486507371e-03f, +6.502103710e-03f, +9.668059669e-03f, +9.980292652e-03f, +5.837696713e-03f, -3.024832606e-03f, -1.484832400e-02f, -2.578182284e-02f, -3.063722149e-02f, -2.437069214e-02f, -3.877817092e-03f, +3.051204491e-02f, +7.444086492e-02f, +1.201702402e-01f, +1.583987993e-01f, +1.807451759e-01f, +1.821196081e-01f, +1.622050736e-01f, +1.255503848e-01f, +8.024374500e-02f, +3.561309763e-02f, -2.883459489e-04f, -2.261798335e-02f, -3.055171689e-02f, -2.683317547e-02f, -1.636209209e-02f, -4.401120615e-03f, +4.973160327e-03f, +9.728024426e-03f, +9.903705225e-03f, +6.984262892e-03f, +2.972950379e-03f, -4.408538528e-04f, -2.358509085e-03f, -2.722236114e-03f, -2.044019640e-03f, -1.011688607e-03f, -1.621713879e-04f, +2.703286355e-04f, +3.273930744e-04f, - -5.396504007e-04f, -9.128497784e-04f, -7.006296063e-04f, +6.572675528e-04f, +3.084513448e-03f, +5.399167858e-03f, +5.553187233e-03f, +1.795556809e-03f, -5.726670876e-03f, -1.402186424e-02f, -1.801487879e-02f, -1.316992252e-02f, +1.217815800e-03f, +2.015671688e-02f, +3.425999873e-02f, +3.425878657e-02f, +1.661440363e-02f, -1.309541139e-02f, -4.158409081e-02f, -5.404966003e-02f, -4.216559311e-02f, -9.380267921e-03f, +2.984408633e-02f, +5.692712557e-02f, +5.868449360e-02f, +3.425361204e-02f, -4.449769137e-03f, -3.900185590e-02f, -5.394874174e-02f, -4.428243918e-02f, -1.704514211e-02f, +1.334473237e-02f, +3.299632404e-02f, +3.518002950e-02f, +2.239878781e-02f, +3.499666927e-03f, -1.184757153e-02f, -1.795624778e-02f, -1.486824537e-02f, -6.812883197e-03f, +1.028052172e-03f, +5.318888896e-03f, +5.581804959e-03f, +3.416711482e-03f, +9.149666782e-04f, -6.008310570e-04f, -9.321954338e-04f, -5.961544252e-04f, - -6.277731151e-06f, +1.013473749e-05f, +3.650476181e-05f, +6.058749407e-05f, +6.315656259e-05f, +2.666170461e-05f, -5.276002987e-05f, -1.556458342e-04f, -2.385075365e-04f, -2.460804233e-04f, -1.349768817e-04f, +9.922972144e-05f, +4.036713219e-04f, +6.700813706e-04f, +7.619910206e-04f, +5.620156431e-04f, +2.392257303e-05f, -7.910745906e-04f, -1.711565276e-03f, -2.493700993e-03f, -2.891200247e-03f, -2.735632550e-03f, -1.998731146e-03f, -8.128518704e-04f, +5.603102941e-04f, +1.804107560e-03f, +2.639907083e-03f, +2.907189572e-03f, +2.604131718e-03f, +1.876633085e-03f, +9.623428273e-04f, +1.115728219e-04f, -4.866283813e-04f, -7.493831600e-04f, -7.047293621e-04f, -4.604900653e-04f, -1.535615665e-04f, +9.968610268e-05f, +2.351049243e-04f, +2.472991710e-04f, +1.743289664e-04f, +7.128169313e-05f, -1.480872188e-05f, -5.966583346e-05f, -6.332821795e-05f, -4.171487722e-05f, -1.455657929e-05f, +4.201705979e-06f, - +2.819160034e-05f, +1.317282348e-05f, -4.282064965e-05f, -1.220709847e-04f, -1.664924659e-04f, -1.043664581e-04f, +9.312586483e-05f, +3.603849945e-04f, +5.379838352e-04f, +4.492946910e-04f, +2.482737724e-05f, -6.025344230e-04f, -1.112880096e-03f, -1.150655407e-03f, -5.465179258e-04f, +5.232002321e-04f, +1.561356583e-03f, +1.983116330e-03f, +1.448015545e-03f, +9.870454600e-05f, -1.454873583e-03f, -2.427647501e-03f, -2.280914348e-03f, -1.034465965e-03f, +7.193722573e-04f, +2.119896241e-03f, +2.493513154e-03f, +1.703604432e-03f, +2.007522737e-04f, -1.243968472e-03f, -1.958724338e-03f, -1.702942683e-03f, -7.386236059e-04f, +3.699329842e-04f, +1.086160006e-03f, +1.164927174e-03f, +7.186448143e-04f, +8.498817533e-05f, -3.943431627e-04f, -5.459665106e-04f, -4.062904505e-04f, -1.416923013e-04f, +7.715795035e-05f, +1.647981405e-04f, +1.353112227e-04f, +5.715832945e-05f, -5.828718348e-06f, -2.808438836e-05f, - /* 3,10 (48) */ - +3.105317277e-04f, +3.050759185e-04f, -4.742132272e-05f, -8.270010821e-04f, -1.857716868e-03f, -2.653758147e-03f, -2.535135775e-03f, -9.266623627e-04f, +2.247999834e-03f, +6.256023287e-03f, +9.533082787e-03f, +1.007952237e-02f, +6.241368035e-03f, -2.354751235e-03f, -1.408633298e-02f, -2.521980720e-02f, -3.061329892e-02f, -2.516176673e-02f, -5.589382368e-03f, +2.801834392e-02f, +7.154966467e-02f, +1.174346076e-01f, +1.564000682e-01f, +1.799323240e-01f, +1.826799183e-01f, +1.640091812e-01f, +1.281902919e-01f, +8.315093457e-02f, +3.821722934e-02f, +1.588287136e-03f, -2.165564052e-02f, -3.044014407e-02f, -2.731980385e-02f, -1.711147525e-02f, -5.105849977e-03f, +4.512670262e-03f, +9.574462859e-03f, +1.000339133e-02f, +7.219367816e-03f, +3.220249550e-03f, -2.665248864e-04f, -2.287227392e-03f, -2.737044836e-03f, -2.103685473e-03f, -1.075016825e-03f, -2.038862651e-04f, +2.557720562e-04f, +3.315947804e-04f, - -5.114588003e-04f, -8.996769549e-04f, -7.434502560e-04f, +5.351965681e-04f, +2.918020982e-03f, +5.294801400e-03f, +5.646313098e-03f, +2.155941804e-03f, -5.188687040e-03f, -1.357256955e-02f, -1.799005142e-02f, -1.377245694e-02f, +1.049357040e-04f, +1.900606147e-02f, +3.371348080e-02f, +3.478198680e-02f, +1.817576022e-02f, -1.111229506e-02f, -4.013607527e-02f, -5.395095548e-02f, -4.362046669e-02f, -1.180791542e-02f, +2.756317198e-02f, +5.589265961e-02f, +5.940386586e-02f, +3.637350828e-02f, -1.956255983e-03f, -3.729825146e-02f, -5.374798947e-02f, -4.552640766e-02f, -1.900386645e-02f, +1.164178968e-02f, +3.225770044e-02f, +3.554996249e-02f, +2.348494782e-02f, +4.664594100e-03f, -1.112892671e-02f, -1.787125960e-02f, -1.526258854e-02f, -7.358849707e-03f, +6.217617216e-04f, +5.177196595e-03f, +5.658962910e-03f, +3.581509622e-03f, +1.050277901e-03f, -5.436727276e-04f, -9.380241521e-04f, -6.242388136e-04f, - -6.866220693e-06f, +8.742775860e-06f, +3.474956812e-05f, +5.949820540e-05f, +6.400161198e-05f, +3.026378360e-05f, -4.677515583e-05f, -1.492525790e-04f, -2.349633169e-04f, -2.487764871e-04f, -1.457477053e-04f, +8.167777557e-05f, +3.844112664e-04f, +6.571114549e-04f, +7.638362764e-04f, +5.844327786e-04f, +6.689027310e-05f, -7.347858775e-04f, -1.655377914e-03f, -2.453761118e-03f, -2.881421461e-03f, -2.762910412e-03f, -2.060081029e-03f, -8.956342544e-04f, +4.749894117e-04f, +1.735890485e-03f, +2.603424299e-03f, +2.907992474e-03f, +2.637634286e-03f, +1.930274992e-03f, +1.020046567e-03f, +1.588282957e-04f, -4.587975622e-04f, -7.427524870e-04f, -7.147454391e-04f, -4.789992715e-04f, -1.721578512e-04f, +8.695202101e-05f, +2.304625031e-04f, +2.495712134e-04f, +1.803461058e-04f, +7.761590678e-05f, -1.051574984e-05f, -5.817362492e-05f, -6.404893482e-05f, -4.341851334e-05f, -1.610575965e-05f, +3.405100316e-06f, - +2.800936709e-05f, +1.527753494e-05f, -3.823904117e-05f, -1.173721915e-04f, -1.661758416e-04f, -1.123170193e-04f, +7.750898066e-05f, +3.443344526e-04f, +5.331217223e-04f, +4.648561908e-04f, +5.979698620e-05f, -5.628191870e-04f, -1.091612204e-03f, -1.166897134e-03f, -6.016404427e-04f, +4.510088204e-04f, +1.509005084e-03f, +1.983398884e-03f, +1.509484792e-03f, +1.970645351e-04f, -1.367010098e-03f, -2.396464998e-03f, -2.325716381e-03f, -1.135620996e-03f, +6.111653058e-04f, +2.057682689e-03f, +2.506038658e-03f, +1.780958912e-03f, +3.013663031e-04f, -1.169785795e-03f, -1.942678244e-03f, -1.744559142e-03f, -8.095353725e-04f, +3.076612684e-04f, +1.059419058e-03f, +1.178114037e-03f, +7.560156839e-04f, +1.230111396e-04f, -3.733020566e-04f, -5.463084825e-04f, -4.206821447e-04f, -1.583456646e-04f, +6.698527863e-05f, +1.633014308e-04f, +1.393757265e-04f, +6.209938901e-05f, -3.036922064e-06f, -2.781083669e-05f, - /* 3,11 (48) */ - +3.036655070e-04f, +3.138186943e-04f, -1.267175460e-05f, -7.675028767e-04f, -1.793715256e-03f, -2.623494363e-03f, -2.581910930e-03f, -1.075914942e-03f, +2.013036517e-03f, +6.007246800e-03f, +9.387335081e-03f, +1.016120015e-02f, +6.625779301e-03f, -1.697639780e-03f, -1.332249670e-02f, -2.463537442e-02f, -3.054640865e-02f, -2.589655261e-02f, -7.244760282e-03f, +2.556458280e-02f, +6.866824321e-02f, +1.146716972e-01f, +1.543399871e-01f, +1.790366898e-01f, +1.831549078e-01f, +1.657450717e-01f, +1.307937162e-01f, +8.605892704e-02f, +4.085486363e-02f, +3.518562128e-03f, -2.063559395e-02f, -3.028131578e-02f, -2.777860141e-02f, -1.785422774e-02f, -5.820595416e-03f, +4.033670990e-03f, +9.402305008e-03f, +1.009034335e-02f, +7.449830319e-03f, +3.469820763e-03f, -8.617878055e-05f, -2.209611485e-03f, -2.747560586e-03f, -2.161859098e-03f, -1.139065760e-03f, -2.473047785e-04f, +2.396662965e-04f, +3.349998807e-04f, - -4.834494332e-04f, -8.843994200e-04f, -7.816892972e-04f, +4.178243766e-04f, +2.751845140e-03f, +5.182484381e-03f, +5.723822078e-03f, +2.500276256e-03f, -4.655565318e-03f, -1.310771336e-02f, -1.793025443e-02f, -1.433527613e-02f, -9.866765005e-04f, +1.783916434e-02f, +3.311184036e-02f, +3.523299562e-02f, +1.968476530e-02f, -9.128896180e-03f, -3.862659048e-02f, -5.375389095e-02f, -4.498747679e-02f, -1.420438042e-02f, +2.523745560e-02f, +5.475703861e-02f, +6.001503116e-02f, +3.843119097e-02f, +5.497826750e-04f, -3.551729255e-02f, -5.344662316e-02f, -4.669619345e-02f, -2.094654469e-02f, +9.897230542e-03f, +3.144816507e-02f, +3.585762376e-02f, +2.454436688e-02f, +5.842708137e-03f, -1.037291103e-02f, -1.774824846e-02f, -1.563589059e-02f, -7.905158190e-03f, +2.010795769e-04f, +5.018850930e-03f, +5.725948188e-03f, +3.744811053e-03f, +1.189653627e-03f, -4.815733386e-04f, -9.410610742e-04f, -6.520496503e-04f, - -7.403782787e-06f, +7.394779215e-06f, +3.299212377e-05f, +5.832969341e-05f, +6.469301128e-05f, +3.368889852e-05f, -4.089813856e-05f, -1.427985743e-04f, -2.311351558e-04f, -2.510036692e-04f, -1.560133449e-04f, +6.443940815e-05f, +3.650447888e-04f, +6.434883797e-04f, +7.645411078e-04f, +6.054931951e-04f, +1.087101536e-04f, -6.789878318e-04f, -1.598716139e-03f, -2.412348689e-03f, -2.869462815e-03f, -2.787851257e-03f, -2.119582649e-03f, -9.775907166e-04f, +3.892289646e-04f, +1.666098084e-03f, +2.564688960e-03f, +2.906498868e-03f, +2.669397502e-03f, +1.983118864e-03f, +1.077961627e-03f, +2.070710274e-04f, -4.296254235e-04f, -7.348755228e-04f, -7.239395436e-04f, -4.972373481e-04f, -1.909582720e-04f, +7.374620772e-05f, +2.253190591e-04f, +2.514921708e-04f, +1.862350249e-04f, +8.401496727e-05f, -6.056241004e-06f, -5.651265163e-05f, -6.466475356e-05f, -4.509804999e-05f, -1.768877557e-05f, +2.555965243e-06f, - +2.772838204e-05f, +1.721219165e-05f, -3.377236041e-05f, -1.125618207e-04f, -1.654455694e-04f, -1.197042549e-04f, +6.222770278e-05f, +3.279894630e-04f, +5.272223775e-04f, +4.790325759e-04f, +9.384783611e-05f, -5.227570188e-04f, -1.068514493e-03f, -1.180518003e-03f, -6.547422921e-04f, +3.788783831e-04f, +1.454297523e-03f, +1.979811515e-03f, +1.567510509e-03f, +2.943698963e-04f, -1.276982314e-03f, -2.360793830e-03f, -2.365941895e-03f, -1.234498089e-03f, +5.017295534e-04f, +1.991386654e-03f, +2.513772428e-03f, +1.855246655e-03f, +4.020406563e-04f, -1.092728083e-03f, -1.922661652e-03f, -1.783186529e-03f, -8.797406818e-04f, +2.438619218e-04f, +1.030078903e-03f, +1.189106918e-03f, +7.925591648e-04f, +1.616265181e-04f, -3.509236252e-04f, -5.454371371e-04f, -4.345377090e-04f, -1.751737233e-04f, +5.627305695e-05f, +1.613155044e-04f, +1.432335341e-04f, +6.710173023e-05f, -7.449142443e-08f, -2.740886232e-05f, - /* 3,12 (48) */ - +2.962617242e-04f, +3.212134736e-04f, +2.032036918e-05f, -7.091731833e-04f, -1.729022245e-03f, -2.589805465e-03f, -2.622809069e-03f, -1.218713516e-03f, +1.781901362e-03f, +5.756243131e-03f, +9.231321737e-03f, +1.022563956e-02f, +6.990824090e-03f, -1.054151401e-03f, -1.255795560e-02f, -2.402988123e-02f, -3.043769849e-02f, -2.657554044e-02f, -8.843476421e-03f, +2.315223411e-02f, +6.579878040e-02f, +1.118838460e-01f, +1.522204045e-01f, +1.780590990e-01f, +1.835441367e-01f, +1.674111697e-01f, +1.333584052e-01f, +8.896542591e-02f, +4.352426113e-02f, +5.501680991e-03f, -1.955763232e-02f, -3.007424475e-02f, -2.820822684e-02f, -1.858910326e-02f, -6.544534960e-03f, +3.536433642e-03f, +9.211346736e-03f, +1.016408956e-02f, +7.675149378e-03f, +3.721312934e-03f, +1.000562444e-04f, -2.125596518e-03f, -2.753616827e-03f, -2.218371750e-03f, -1.203730513e-03f, -2.924028285e-04f, +2.219775210e-04f, +3.375558459e-04f, - -4.557210512e-04f, -8.671872283e-04f, -8.154616576e-04f, +3.052625560e-04f, +2.586399571e-03f, +5.062780126e-03f, +5.786049781e-03f, +2.828265719e-03f, -4.128342940e-03f, -1.262868078e-02f, -1.783640660e-02f, -1.485803315e-02f, -2.055190993e-03f, +1.665864633e-02f, +3.245709807e-02f, +3.561187401e-02f, +2.113906282e-02f, -7.149084665e-03f, -3.705907997e-02f, -5.345952105e-02f, -4.626445911e-02f, -1.656517425e-02f, +2.287151370e-02f, +5.352254052e-02f, +6.051676072e-02f, +4.042257762e-02f, +3.063555103e-03f, -3.366204590e-02f, -5.304458251e-02f, -4.778892153e-02f, -2.286920634e-02f, +8.114044013e-03f, +3.056842438e-02f, +3.610148568e-02f, +2.557444578e-02f, +7.031815056e-03f, -9.580351865e-03f, -1.758662195e-02f, -1.598681422e-02f, -8.450595327e-03f, -2.334581321e-04f, +4.843677207e-03f, +5.782221245e-03f, +3.906126557e-03f, +1.332887162e-03f, -4.144716084e-04f, -9.411355656e-04f, -6.794585126e-04f, - -7.891082444e-06f, +6.092289786e-06f, +3.123643501e-05f, +5.708715158e-05f, +6.523443877e-05f, +3.693610856e-05f, -3.513638102e-05f, -1.362966996e-04f, -2.270370214e-04f, -2.527702729e-04f, -1.657699032e-04f, +4.753378261e-05f, +3.456034145e-04f, +6.292467916e-04f, +7.641301153e-04f, +6.251990193e-04f, +1.493554528e-04f, -6.237328043e-04f, -1.541644556e-03f, -2.369520845e-03f, -2.855354432e-03f, -2.810445952e-03f, -2.177187626e-03f, -1.058646560e-03f, +3.031081595e-04f, +1.594790730e-03f, +2.523725649e-03f, +2.902692508e-03f, +2.699372312e-03f, +2.035100429e-03f, +1.136029036e-03f, +2.562636991e-04f, -3.991203899e-04f, -7.257348527e-04f, -7.322791757e-04f, -5.151702243e-04f, -2.099383286e-04f, +6.007820864e-05f, +2.196702144e-04f, +2.530493507e-04f, +1.919817537e-04f, +9.046911708e-05f, -1.433467579e-06f, -5.468063210e-05f, -6.517067925e-05f, -4.674879763e-05f, -1.930311625e-05f, +1.654356283e-06f, - +2.735491682e-05f, +1.897854157e-05f, -2.942920216e-05f, -1.076580508e-04f, -1.643188099e-04f, -1.265281901e-04f, +4.730931145e-05f, +3.113972596e-04f, +5.203262624e-04f, +4.918245151e-04f, +1.269242815e-04f, -4.824419647e-04f, -1.043669022e-03f, -1.191531114e-03f, -7.057411623e-04f, +3.069578549e-04f, +1.397372766e-03f, +1.972398693e-03f, +1.622002527e-03f, +3.904304742e-04f, -1.184983313e-03f, -2.320722836e-03f, -2.401520771e-03f, -1.330900520e-03f, +3.912847393e-04f, +1.921134244e-03f, +2.516683224e-03f, +1.926302692e-03f, +5.025707398e-04f, -1.012931182e-03f, -1.898679610e-03f, -1.818712806e-03f, -9.490838417e-04f, +1.786487368e-04f, +9.981618200e-04f, +1.197843781e-03f, +8.281786720e-04f, +2.007601133e-04f, -3.272279914e-04f, -5.433234257e-04f, -4.478085433e-04f, -1.921397021e-04f, +4.503105467e-05f, +1.588277613e-04f, +1.468651244e-04f, +7.215255303e-05f, +3.056904113e-06f, -2.687305772e-05f, - /* 3,13 (48) */ - +2.883706418e-04f, +3.273057633e-04f, +5.155680418e-05f, -6.520860317e-04f, -1.663787806e-03f, -2.552869356e-03f, -2.657945450e-03f, -1.355010216e-03f, +1.554864340e-03f, +5.503472858e-03f, +9.065551833e-03f, +1.027317334e-02f, +7.336427504e-03f, -4.249046089e-04f, -1.179382548e-02f, -2.340468221e-02f, -3.028834304e-02f, -2.719927325e-02f, -1.038512098e-02f, +2.078271327e-02f, +6.294342596e-02f, +1.090734000e-01f, +1.500432169e-01f, +1.770004525e-01f, +1.838472449e-01f, +1.690059605e-01f, +1.358821308e-01f, +9.186811842e-02f, +4.622363344e-02f, +7.536781420e-03f, -1.842160329e-02f, -2.981798105e-02f, -2.860734723e-02f, -1.931483811e-02f, -7.276814136e-03f, +3.021263418e-03f, +9.001408407e-03f, +1.022416777e-02f, +7.894819592e-03f, +3.974362285e-03f, +2.920379980e-04f, -2.035127401e-03f, -2.755050294e-03f, -2.273052382e-03f, -1.268901192e-03f, -3.391516261e-04f, +2.026744047e-04f, +3.392102022e-04f, - -4.283661344e-04f, -8.482086868e-04f, -8.448908597e-04f, +1.976045052e-04f, +2.422080761e-03f, +4.936251936e-03f, +5.833359092e-03f, +3.139662979e-03f, -3.608016678e-03f, -1.213685627e-02f, -1.770948231e-02f, -1.534047511e-02f, -3.098860015e-03f, +1.546711522e-02f, +3.175135691e-02f, +3.591883186e-02f, +2.253643559e-02f, -5.176685972e-03f, -3.543707744e-02f, -5.306909058e-02f, -4.744944242e-02f, -1.888589709e-02f, +2.046999293e-02f, +5.219164000e-02f, +6.090804546e-02f, +4.234371187e-02f, +5.580238328e-03f, -3.173574321e-02f, -5.254201177e-02f, -4.880185272e-02f, -2.476788595e-02f, +6.295331207e-03f, +2.961934054e-02f, +3.628013442e-02f, +2.657260760e-02f, +8.229658837e-03f, -8.752173193e-03f, -1.738586183e-02f, -1.631404221e-02f, -8.993918753e-03f, -6.812666753e-04f, +4.651537505e-03f, +5.827252300e-03f, +4.064954319e-03f, +1.479752286e-03f, -3.423190553e-04f, -9.380786615e-04f, -7.063315703e-04f, - -8.328888420e-06f, +4.836690636e-06f, +2.948637421e-05f, +5.577576691e-05f, +6.562976180e-05f, +4.000483767e-05f, -2.949687597e-05f, -1.297595871e-04f, -2.226829976e-04f, -2.540851657e-04f, -1.750143867e-04f, +3.097912402e-05f, +3.261181077e-04f, +6.144215072e-04f, +7.626289262e-04f, +6.435540565e-04f, +1.888012286e-04f, -5.690718432e-04f, -1.484227549e-03f, -2.325335806e-03f, -2.839128589e-03f, -2.830687958e-03f, -2.232849779e-03f, -1.138728152e-03f, +2.167066311e-04f, +1.522030573e-03f, +2.480561472e-03f, +2.896559589e-03f, +2.727511272e-03f, +2.086155759e-03f, +1.194188938e-03f, +3.063673185e-04f, -3.672927030e-04f, -7.153144195e-04f, -7.397323830e-04f, -5.327635541e-04f, -2.290726963e-04f, +4.595853568e-05f, +2.135123302e-04f, +2.542303720e-04f, +1.975722132e-04f, +9.696823219e-05f, +3.348891556e-06f, -5.267555978e-05f, -6.556179178e-05f, -4.836597661e-05f, -2.094611058e-05f, +7.004638822e-07f, - +2.689529487e-05f, +2.057882056e-05f, -2.521744019e-05f, -1.026786732e-04f, -1.628132499e-04f, -1.327903489e-04f, +3.277937540e-05f, +2.946044465e-04f, +5.124752704e-04f, +5.032359372e-04f, +1.589740718e-04f, -4.419668961e-04f, -1.017160390e-03f, -1.199955147e-03f, -7.545604759e-04f, +2.353939035e-04f, +1.338372963e-03f, +1.961212656e-03f, +1.672878888e-03f, +4.850599651e-04f, -1.091209358e-03f, -2.276349786e-03f, -2.432392809e-03f, -1.424636953e-03f, +2.800528054e-04f, +1.847060106e-03f, +2.514749879e-03f, +1.993968156e-03f, +6.027510728e-04f, -9.305377716e-04f, -1.870745738e-03f, -1.851031519e-03f, -1.017409233e-03f, +1.121401310e-04f, +9.636961824e-04f, +1.204266684e-03f, +8.627779927e-04f, +2.403350278e-04f, -3.022388744e-04f, -5.399406518e-04f, -4.604462536e-04f, -2.092054228e-04f, +3.327077228e-05f, +1.558265929e-04f, +1.502509361e-04f, +7.723840020e-05f, +6.354954773e-06f, -2.619825575e-05f, - /* 3,14 (48) */ - +2.800417534e-04f, +3.321424540e-04f, +8.104317839e-05f, -5.963102648e-04f, -1.598158045e-03f, -2.512864519e-03f, -2.687442326e-03f, -1.484769803e-03f, +1.332181343e-03f, +5.249387692e-03f, +8.890537447e-03f, +1.030415246e-02f, +7.662545612e-03f, +1.895168983e-04f, -1.103119655e-02f, -2.276112815e-02f, -3.009954181e-02f, -2.776834509e-02f, -1.186934853e-02f, +1.845737746e-02f, +6.010429737e-02f, +1.062427120e-01f, +1.478103671e-01f, +1.758617243e-01f, +1.840639515e-01f, +1.705279911e-01f, +1.383626923e-01f, +9.476467801e-02f, +4.895114472e-02f, +9.622937179e-03f, -1.722741435e-02f, -2.951161373e-02f, -2.897463993e-02f, -2.003015253e-02f, -8.016546519e-03f, +2.488499864e-03f, +8.772335711e-03f, +1.027012630e-02f, +8.108331923e-03f, +4.228592657e-03f, +4.896102112e-04f, -1.938159169e-03f, -2.751701403e-03f, -2.325727942e-03f, -1.334462984e-03f, -3.875176027e-04f, +1.817282941e-04f, +3.399106661e-04f, - -4.014708395e-04f, -8.276298662e-04f, -8.701082999e-04f, +9.492583196e-05f, +2.259267511e-03f, +4.803461587e-03f, +5.866138468e-03f, +3.434267425e-03f, -3.095541408e-03f, -1.163362033e-02f, -1.755050824e-02f, -1.578244201e-02f, -4.116020405e-03f, +1.426716007e-02f, +3.099679643e-02f, +3.615422576e-02f, +2.387480855e-02f, -3.215473316e-03f, -3.376419855e-02f, -5.258403061e-02f, -4.854065178e-02f, -2.116224687e-02f, +1.803760013e-02f, +5.076700305e-02f, +6.118809826e-02f, +4.419077197e-02f, +8.094988206e-03f, -2.974177505e-02f, -5.193926069e-02f, -4.973239049e-02f, -2.663863169e-02f, +4.444299688e-03f, +2.860193131e-02f, +3.639227455e-02f, +2.753630378e-02f, +9.433925520e-03f, -7.889395200e-03f, -1.714552680e-02f, -1.661628108e-02f, -9.533859405e-03f, -1.141712929e-03f, +4.442332082e-03f, +5.860523072e-03f, +4.220780912e-03f, +1.630003222e-03f, -2.650806551e-04f, -9.317237067e-04f, -7.325298261e-04f, - -8.718068193e-06f, +3.629207216e-06f, +2.774567533e-05f, +5.440070923e-05f, +6.588302403e-05f, +4.289486633e-05f, -2.398620325e-05f, -1.231996048e-04f, -2.180872571e-04f, -2.549577521e-04f, -1.837446921e-04f, +1.479270955e-05f, +3.066192357e-04f, +5.990474603e-04f, +7.600641439e-04f, +6.605637628e-04f, +2.270243687e-04f, -5.150546432e-04f, -1.426529195e-03f, -2.279852789e-03f, -2.820819667e-03f, -2.848573324e-03f, -2.286525170e-03f, -1.217763015e-03f, +1.301043476e-04f, +1.447881465e-03f, +2.435226036e-03f, +2.888088780e-03f, +2.753768608e-03f, +2.136221350e-03f, +1.252380659e-03f, +3.573412500e-04f, -3.341544321e-04f, -7.035995661e-04f, -7.462678156e-04f, -5.499827626e-04f, -2.483352481e-04f, +3.139866995e-05f, +2.068425282e-04f, +2.550231936e-04f, +2.029922384e-04f, +1.035018317e-04f, +8.286747443e-06f, -5.049571450e-05f, -6.583325824e-05f, -4.994472502e-05f, -2.261492841e-05f, -3.053828783e-07f, - +2.635586685e-05f, +2.201572656e-05f, -2.114422789e-05f, -9.764105202e-05f, -1.609470350e-04f, -1.384937071e-04f, +1.866172927e-05f, +2.776568924e-04f, +5.037125890e-04f, +5.132739533e-04f, +1.899484114e-04f, -4.014233099e-04f, -9.890754911e-04f, -1.205814231e-03f, -8.011294892e-04f, +1.643306246e-04f, +1.277443204e-03f, +1.946313220e-03f, +1.720065970e-03f, +5.780763036e-04f, -9.958594564e-04f, -2.227781133e-03f, -2.458507842e-03f, -1.515521846e-03f, +1.682574121e-04f, +1.769307145e-03f, +2.507961371e-03f, +2.058090656e-03f, +7.023757360e-04f, -8.456970987e-04f, -1.838882264e-03f, -1.880042092e-03f, -1.084561664e-03f, +4.445893301e-05f, +9.267164761e-04f, +1.208321983e-03f, +8.962615228e-04f, +2.802718001e-04f, -2.759836047e-04f, -5.352645915e-04f, -4.724027832e-04f, -2.263313703e-04f, +2.100545850e-05f, +1.523014450e-04f, +1.533714251e-04f, +8.234517685e-05f, +9.816694012e-06f, -2.537955790e-05f, - /* 3,15 (48) */ - +2.713236852e-04f, +3.357716612e-04f, +1.087888537e-04f, -5.419095556e-04f, -1.532275021e-03f, -2.469969652e-03f, -2.711428529e-03f, -1.607969408e-03f, +1.114094085e-03f, +4.994429940e-03f, +8.706792755e-03f, +1.031894517e-02f, +7.969164848e-03f, +7.885643586e-04f, -1.027113241e-02f, -2.210056439e-02f, -2.987251744e-02f, -2.828339973e-02f, -1.329587772e-02f, +1.617752467e-02f, +5.728347771e-02f, +1.033941387e-01f, +1.455238419e-01f, +1.746439613e-01f, +1.841940559e-01f, +1.719758725e-01f, +1.407979183e-01f, +9.765276679e-02f, +5.170491332e-02f, +1.175915853e-02f, -1.597503369e-02f, -2.915427248e-02f, -2.930879436e-02f, -2.073375210e-02f, -8.762814334e-03f, +1.938517101e-03f, +8.524000463e-03f, +1.030152497e-02f, +8.315174451e-03f, +4.483615851e-03f, +6.926024496e-04f, -1.834657337e-03f, -2.743414655e-03f, -2.376223656e-03f, -1.400296242e-03f, -4.374623277e-04f, +1.591133657e-04f, +3.396052832e-04f, - -3.751149726e-04f, -8.056141397e-04f, -8.912525278e-04f, -2.715220056e-06f, +2.098320476e-03f, +4.664967880e-03f, +5.884800197e-03f, +3.711924318e-03f, -2.591828819e-03f, -1.112034638e-02f, -1.736055983e-02f, -1.618386532e-02f, -5.105095897e-03f, +1.306134584e-02f, +3.019566694e-02f, +3.631855639e-02f, +2.515225176e-02f, -1.269160096e-03f, -3.204413258e-02f, -5.200595431e-02f, -4.953651123e-02f, -2.339002800e-02f, +1.557909228e-02f, +4.925148120e-02f, +6.135635567e-02f, +4.596007912e-02f, +1.060294958e-02f, -2.768368439e-02f, -5.123688496e-02f, -5.057808759e-02f, -2.847751395e-02f, +2.564257596e-03f, +2.751736964e-02f, +3.643673348e-02f, +2.846302026e-02f, +1.064224750e-02f, -6.993133677e-03f, -1.686525500e-02f, -1.689226469e-02f, -1.006912400e-02f, -1.614115712e-03f, +4.216000711e-03f, +5.881528531e-03f, +4.373082357e-03f, +1.783374647e-03f, -1.827354783e-04f, -9.219070127e-04f, -7.579093840e-04f, - -9.059582855e-06f, +2.470909225e-06f, +2.601792971e-05f, +5.296712092e-05f, +6.599843263e-05f, +4.560632273e-05f, -1.861052776e-05f, -1.166288410e-04f, -2.132640346e-04f, -2.553979460e-04f, -1.919595909e-04f, -1.009139408e-06f, +2.871365353e-04f, +5.831596506e-04f, +7.564632958e-04f, +6.762352148e-04f, +2.640035975e-04f, -4.617294971e-04f, -1.368613192e-03f, -2.233131932e-03f, -2.800464093e-03f, -2.864100685e-03f, -2.338172154e-03f, -1.295679903e-03f, +4.338151546e-05f, +1.372408895e-03f, +2.387751421e-03f, +2.877271248e-03f, +2.778100290e-03f, +2.185234209e-03f, +1.310542778e-03f, +4.091432488e-04f, -2.997194817e-04f, -6.905770765e-04f, -7.518547806e-04f, -5.667930921e-04f, -2.676990797e-04f, +1.641106349e-05f, +1.996587127e-04f, +2.554161433e-04f, +2.082276012e-04f, +1.100590885e-04f, +1.337559834e-05f, -4.813967360e-05f, -6.598034546e-05f, -5.148010691e-05f, -2.430658232e-05f, -1.362712782e-06f, - +2.574298666e-05f, +2.329239317e-05f, -1.721600120e-05f, -9.256208576e-05f, -1.587387043e-04f, -1.436426421e-04f, +4.978456466e-06f, +2.605996306e-04f, +4.940825608e-04f, +5.219487723e-04f, +2.198020113e-04f, -3.609011358e-04f, -9.595032747e-04f, -1.209137816e-03f, -8.453833775e-04f, +9.390924656e-05f, +1.214731161e-03f, +1.927767583e-03f, +1.763498582e-03f, +6.693020372e-04f, -8.991349016e-04f, -2.175131749e-03f, -2.479825823e-03f, -1.603375858e-03f, +5.612345016e-05f, +1.688026227e-03f, +2.496316882e-03f, +2.118524642e-03f, +8.012388243e-04f, -7.585646875e-04f, -1.803120048e-03f, -1.905650109e-03f, -1.150386728e-03f, -2.426784483e-05f, +8.872633042e-04f, +1.209960521e-03f, +9.285345060e-04f, +3.204885507e-04f, -2.484931299e-04f, -5.292736097e-04f, -4.836305458e-04f, -2.434767633e-04f, +8.250122829e-06f, +1.482428810e-04f, +1.562071244e-04f, +8.745817246e-05f, +1.343848373e-05f, -2.441236253e-05f, - /* 4, 0 (48) */ - -4.440791761e-04f, -7.736617456e-04f, -5.842197404e-04f, +4.733051837e-04f, +2.096961908e-03f, +3.159739597e-03f, +2.247925700e-03f, -1.196916207e-03f, -5.859365612e-03f, -8.625924656e-03f, -6.226830420e-03f, +2.191702212e-03f, +1.322393203e-02f, +1.983561445e-02f, +1.498813646e-02f, -3.241530928e-03f, -2.808652174e-02f, -4.494512491e-02f, -3.739225953e-02f, +4.047367480e-03f, +7.496487828e-02f, +1.562849362e-01f, +2.209963868e-01f, +2.456499165e-01f, +2.209963868e-01f, +1.562849362e-01f, +7.496487828e-02f, +4.047367480e-03f, -3.739225953e-02f, -4.494512491e-02f, -2.808652174e-02f, -3.241530928e-03f, +1.498813646e-02f, +1.983561445e-02f, +1.322393203e-02f, +2.191702212e-03f, -6.226830420e-03f, -8.625924656e-03f, -5.859365612e-03f, -1.196916207e-03f, +2.247925700e-03f, +3.159739597e-03f, +2.096961908e-03f, +4.733051837e-04f, -5.842197404e-04f, -7.736617456e-04f, -4.440791761e-04f, -8.710788365e-05f, - +3.469535659e-04f, +1.336667044e-03f, +1.790286751e-03f, +2.794767810e-04f, -3.303519821e-03f, -6.405731284e-03f, -4.976271198e-03f, +2.686342793e-03f, +1.248168983e-02f, +1.571582859e-02f, +5.946321108e-03f, -1.341789307e-02f, -2.845267002e-02f, -2.424163753e-02f, +1.494761300e-03f, +3.267286932e-02f, +4.455848173e-02f, +2.351503337e-02f, -1.915629477e-02f, -5.272885293e-02f, -4.998568337e-02f, -9.883103547e-03f, +3.944741130e-02f, +6.141247912e-02f, +3.944741130e-02f, -9.883103547e-03f, -4.998568337e-02f, -5.272885293e-02f, -1.915629477e-02f, +2.351503337e-02f, +4.455848173e-02f, +3.267286932e-02f, +1.494761300e-03f, -2.424163753e-02f, -2.845267002e-02f, -1.341789307e-02f, +5.946321108e-03f, +1.571582859e-02f, +1.248168983e-02f, +2.686342793e-03f, -4.976271198e-03f, -6.405731284e-03f, -3.303519821e-03f, +2.794767810e-04f, +1.790286751e-03f, +1.336667044e-03f, +3.469535659e-04f, -1.608870261e-04f, - +2.577507531e-05f, +1.086809859e-05f, -3.597806555e-05f, -9.022677896e-05f, -1.001032074e-04f, -2.162572117e-05f, +1.334176747e-04f, +2.754029446e-04f, +2.738574663e-04f, +4.883441716e-05f, -3.368996142e-04f, -6.608354264e-04f, -6.431674293e-04f, -1.354085236e-04f, +7.148449213e-04f, +1.450106209e-03f, +1.496506860e-03f, +4.925772700e-04f, -1.426669522e-03f, -3.579339114e-03f, -4.995795890e-03f, -4.884068303e-03f, -3.060435122e-03f, -9.950496562e-05f, +2.899055761e-03f, +4.817997977e-03f, +5.039232434e-03f, +3.699598995e-03f, +1.563829895e-03f, -3.948853898e-04f, -1.466038086e-03f, -1.478734758e-03f, -7.701444613e-04f, +8.892008168e-05f, +6.259781652e-04f, +6.723667394e-04f, +3.619102752e-04f, -2.784242037e-05f, -2.665508263e-04f, -2.808185262e-04f, -1.439707896e-04f, +1.363207129e-05f, +9.803631935e-05f, +9.274027171e-05f, +3.959496484e-05f, -8.801928510e-06f, -2.576330239e-05f, -1.668340381e-05f, - -5.085810041e-05f, -6.144595631e-05f, +1.679698635e-05f, +1.663740391e-04f, +2.496456082e-04f, +1.009428352e-04f, -2.793890885e-04f, -6.160780337e-04f, -5.172287092e-04f, +1.495552505e-04f, +9.893104132e-04f, +1.261605930e-03f, +4.928695846e-04f, -9.652920767e-04f, -2.014235506e-03f, -1.627372799e-03f, +1.931735069e-04f, +2.197939940e-03f, +2.758983809e-03f, +1.218866689e-03f, -1.422640286e-03f, -3.172656367e-03f, -2.613289263e-03f, -9.182675706e-05f, +2.499132998e-03f, +3.211843143e-03f, +1.579224448e-03f, -1.067547924e-03f, -2.722308581e-03f, -2.289606150e-03f, -3.308495136e-04f, +1.548140897e-03f, +2.038819890e-03f, +1.056102385e-03f, -4.132185360e-04f, -1.245245151e-03f, -1.030716273e-03f, -2.038784127e-04f, +4.909277589e-04f, +6.261909334e-04f, +3.058451921e-04f, -8.247435647e-05f, -2.483969291e-04f, -1.754542022e-04f, -2.490941987e-05f, +5.954958857e-05f, +5.310929686e-05f, +1.285012779e-05f, - /* 4, 1 (48) */ - -4.183041008e-04f, -7.627936470e-04f, -6.201978060e-04f, +3.830784047e-04f, +1.996858701e-03f, +3.138113875e-03f, +2.381343374e-03f, -9.215132624e-04f, -5.585508145e-03f, -8.577090238e-03f, -6.563730034e-03f, +1.530866785e-03f, +1.258076460e-02f, +1.970020593e-02f, +1.570298138e-02f, -1.791424718e-03f, -2.659001489e-02f, -4.445254764e-02f, -3.881892906e-02f, +4.680283662e-04f, +6.996908239e-02f, +1.514008679e-01f, +2.179359516e-01f, +2.455504115e-01f, +2.238954425e-01f, +1.611029342e-01f, +8.000411071e-02f, +7.746966475e-03f, -3.582842964e-02f, -4.534001030e-02f, -2.955255983e-02f, -4.720265686e-03f, +1.421799200e-02f, +1.992453453e-02f, +1.384991020e-02f, +2.864068951e-03f, -5.864920145e-03f, -8.653767076e-03f, -6.125916438e-03f, -1.477734733e-03f, +2.103954910e-03f, +3.173371668e-03f, +2.194998227e-03f, +5.660454554e-04f, -5.446247756e-04f, -7.824636741e-04f, -4.698424785e-04f, -1.037912875e-04f, - +2.960954655e-04f, +1.275221087e-03f, +1.807083737e-03f, +4.458508201e-04f, -3.053874213e-03f, -6.304788449e-03f, -5.255660287e-03f, +2.070264759e-03f, +1.196446112e-02f, +1.586538384e-02f, +6.935631522e-03f, -1.215628714e-02f, -2.795980043e-02f, -2.520692960e-02f, -5.194742057e-04f, +3.104549652e-02f, +4.475165524e-02f, +2.571297331e-02f, -1.639731096e-02f, -5.150998624e-02f, -5.140832366e-02f, -1.305575991e-02f, +3.683412204e-02f, +6.132065237e-02f, +4.194654430e-02f, -6.671260404e-03f, -4.840645892e-02f, -5.379640085e-02f, -2.187860335e-02f, +2.122542722e-02f, +4.422763222e-02f, +3.422101022e-02f, +3.533581191e-03f, -2.318553514e-02f, -2.886588855e-02f, -1.466313822e-02f, +4.915604835e-03f, +1.551195017e-02f, +1.297261759e-02f, +3.312533726e-03f, -4.670426006e-03f, -6.488205641e-03f, -3.551916750e-03f, +1.040225788e-04f, +1.765377331e-03f, +1.396216632e-03f, +4.000628628e-04f, -1.480368983e-04f, - +2.568494077e-05f, +1.279823439e-05f, -3.240045182e-05f, -8.753816689e-05f, -1.018057305e-04f, -2.929220594e-05f, +1.228295386e-04f, +2.694105448e-04f, +2.802413978e-04f, +6.914107652e-05f, -3.116704700e-04f, -6.479262746e-04f, -6.583392203e-04f, -1.804486605e-04f, +6.591406331e-04f, +1.418716096e-03f, +1.522700842e-03f, +5.865016042e-04f, -1.290524252e-03f, -3.456144344e-03f, -4.946179436e-03f, -4.943187407e-03f, -3.217188611e-03f, -2.983617596e-04f, +2.733284861e-03f, +4.745033012e-03f, +5.076354457e-03f, +3.816679123e-03f, +1.701776486e-03f, -2.935367743e-04f, -1.431258577e-03f, -1.504467573e-03f, -8.248943874e-04f, +4.106534528e-05f, +6.067667708e-04f, +6.824562554e-04f, +3.866306003e-04f, -6.203719232e-06f, -2.583162013e-04f, -2.856253319e-04f, -1.544572875e-04f, +5.324473980e-06f, +9.559884073e-05f, +9.506401101e-05f, +4.324034279e-05f, -6.601447436e-06f, -2.564493378e-05f, -1.763779865e-05f, - -4.849702512e-05f, -6.296872165e-05f, +9.009032545e-06f, +1.570497127e-04f, +2.499307227e-04f, +1.184039648e-04f, -2.528121168e-04f, -6.041753047e-04f, -5.411178559e-04f, +9.604230733e-05f, +9.456000801e-04f, +1.273601320e-03f, +5.695474258e-04f, -8.728683017e-04f, -1.983672901e-03f, -1.700545044e-03f, +5.636515345e-05f, +2.100287318e-03f, +2.786846348e-03f, +1.365515110e-03f, -1.262369016e-03f, -3.123805670e-03f, -2.719216202e-03f, -2.751886192e-04f, +2.377098497e-03f, +3.241213287e-03f, +1.731605663e-03f, -9.120159997e-04f, -2.676873833e-03f, -2.374936970e-03f, -4.689556004e-04f, +1.463034725e-03f, +2.057262883e-03f, +1.144973117e-03f, -3.308092521e-04f, -1.224490089e-03f, -1.069626454e-03f, -2.588417395e-04f, +4.622457530e-04f, +6.344264800e-04f, +3.320784716e-04f, -6.303458543e-05f, -2.461532424e-04f, -1.842423113e-04f, -3.332559610e-05f, +5.726948053e-05f, +5.523260112e-05f, +1.514649021e-05f, - /* 4, 2 (48) */ - -3.926191600e-04f, -7.499954126e-04f, -6.525982578e-04f, +2.955402379e-04f, +1.895052970e-03f, +3.108821669e-03f, +2.504172913e-03f, -6.521027177e-04f, -5.305266748e-03f, -8.507949162e-03f, -6.875400504e-03f, +8.829405108e-04f, +1.192242538e-02f, +1.951975726e-02f, +1.636212202e-02f, -3.727086224e-04f, -2.506731404e-02f, -4.386604604e-02f, -4.010945331e-02f, -2.988115978e-03f, +6.502290296e-02f, +1.464576805e-01f, +2.147187630e-01f, +2.452520498e-01f, +2.266287274e-01f, +1.658479672e-01f, +8.508046517e-02f, +1.156364560e-02f, -3.412665315e-02f, -4.563354708e-02f, -3.098381841e-02f, -6.224733259e-03f, +1.339309761e-02f, +1.996559988e-02f, +1.445667697e-02f, +3.546525207e-03f, -5.478289544e-03f, -8.659970795e-03f, -6.384232639e-03f, -1.763360065e-03f, +1.949497623e-03f, +3.178696142e-03f, +2.290597068e-03f, +6.611094664e-04f, -5.013844328e-04f, -7.890651215e-04f, -4.954874122e-04f, -1.214290861e-04f, - +2.475984404e-04f, +1.212252366e-03f, +1.816092770e-03f, +6.029005328e-04f, -2.803943490e-03f, -6.186384484e-03f, -5.508472404e-03f, +1.466089454e-03f, +1.142334327e-02f, +1.596142614e-02f, +7.881231602e-03f, -1.088268582e-02f, -2.739025301e-02f, -2.607979791e-02f, -2.503147107e-03f, +2.934495148e-02f, +4.480802039e-02f, +2.781326063e-02f, -1.361046461e-02f, -5.014447113e-02f, -5.267069267e-02f, -1.617956558e-02f, +3.411490584e-02f, +6.104546375e-02f, +4.432364280e-02f, -3.430047117e-03f, -4.667485326e-02f, -5.470841685e-02f, -2.455547718e-02f, +1.885049025e-02f, +4.375867662e-02f, +3.568404494e-02f, +5.590844074e-03f, -2.204056203e-02f, -2.919669781e-02f, -1.588762831e-02f, +3.845978381e-03f, +1.525310843e-02f, +1.343486335e-02f, +3.946960206e-03f, -4.338347535e-03f, -6.551240226e-03f, -3.798069993e-03f, -8.021973253e-05f, +1.732051735e-03f, +1.453486113e-03f, +4.552954639e-04f, -1.328904081e-04f, - +2.549779187e-05f, +1.459115580e-05f, -2.887242359e-05f, -8.468914430e-05f, -1.031510331e-04f, -3.661966384e-05f, +1.122371906e-04f, +2.628740404e-04f, +2.857102798e-04f, +8.872654422e-05f, -2.862935634e-04f, -6.337052964e-04f, -6.715031297e-04f, -2.239637995e-04f, +6.031742885e-04f, +1.384701936e-03f, +1.544664201e-03f, +6.765567998e-04f, -1.155617987e-03f, -3.330262345e-03f, -4.890527745e-03f, -4.995311351e-03f, -3.369090678e-03f, -4.967594365e-04f, +2.563365105e-03f, +4.665242587e-03f, +5.107037743e-03f, +3.930337947e-03f, +1.840275841e-03f, -1.886513393e-04f, -1.392140813e-03f, -1.527174191e-03f, -8.789479600e-04f, -8.068450342e-06f, +5.855336396e-04f, +6.910422827e-04f, +4.109877721e-04f, +1.604031493e-05f, -2.491507715e-04f, -2.897922728e-04f, -1.648448594e-04f, -3.282499426e-06f, +9.278551127e-05f, +9.718348809e-05f, +4.690290633e-05f, -4.268934018e-06f, -2.541551119e-05f, -1.856640645e-05f, - -4.604377184e-05f, -6.412929389e-05f, +1.564053316e-06f, +1.475283405e-04f, +2.492864582e-04f, +1.348266799e-04f, -2.262137482e-04f, -5.905744836e-04f, -5.625738223e-04f, +4.350302225e-05f, +8.997806223e-04f, +1.281274664e-03f, +6.430507441e-04f, -7.791577591e-04f, -1.947313080e-03f, -1.767494544e-03f, -7.914526029e-05f, +1.997013978e-03f, +2.805872340e-03f, +1.507053898e-03f, -1.098936335e-03f, -3.065474889e-03f, -2.816590098e-03f, -4.576765036e-04f, +2.247563083e-03f, +3.260645812e-03f, +1.879279726e-03f, -7.527445461e-04f, -2.622762061e-03f, -2.453601469e-03f, -6.070483377e-04f, +1.372261576e-03f, +2.069419948e-03f, +1.231579914e-03f, -2.458698177e-04f, -1.199326656e-03f, -1.105854670e-03f, -3.142690478e-04f, +4.312229160e-04f, +6.407018084e-04f, +3.579848182e-04f, -4.266457517e-05f, -2.428860696e-04f, -1.926898844e-04f, -4.202254467e-05f, +5.459686724e-05f, +5.720976625e-05f, +1.752542097e-05f, - /* 4, 3 (48) */ - -3.671213681e-04f, -7.354042568e-04f, -6.814706814e-04f, +2.108510936e-04f, +1.791901937e-03f, +3.072202006e-03f, +2.616410104e-03f, -3.892286773e-04f, -5.019556468e-03f, -8.419222618e-03f, -7.161694067e-03f, +2.492352145e-04f, +1.125092225e-02f, +1.929579347e-02f, +1.696529630e-02f, +1.011993314e-03f, -2.352264984e-02f, -4.318948924e-02f, -4.126507130e-02f, -6.318378323e-03f, +6.013237521e-02f, +1.414623692e-01f, +2.113496723e-01f, +2.447552903e-01f, +2.291920925e-01f, +1.705132098e-01f, +9.018750292e-02f, +1.549398355e-02f, -3.228637731e-02f, -4.582219842e-02f, -3.237595922e-02f, -7.751907450e-03f, +1.251414965e-02f, +1.995753143e-02f, +1.504221061e-02f, +4.237567489e-03f, -5.067301772e-03f, -8.643930480e-03f, -6.633383411e-03f, -2.053152338e-03f, +1.784652763e-03f, +3.175413642e-03f, +2.383382579e-03f, +7.582929545e-04f, -4.544815265e-04f, -7.933340555e-04f, -5.209029234e-04f, -1.399954926e-04f, - +2.015546685e-04f, +1.148123072e-03f, +1.817656823e-03f, +7.504288733e-04f, -2.554657032e-03f, -6.051557804e-03f, -5.734686152e-03f, +8.755149706e-04f, +1.086076945e-02f, +1.600492917e-02f, +8.781012224e-03f, -9.601411153e-03f, -2.674720226e-02f, -2.685895566e-02f, -4.450460187e-03f, +2.757745693e-02f, +4.472887513e-02f, +2.981027461e-02f, -1.080459227e-02f, -4.863741723e-02f, -5.376962901e-02f, -1.924504047e-02f, +3.129831574e-02f, +6.058778724e-02f, +4.657120588e-02f, -1.694013043e-04f, -4.479557353e-02f, -5.546116140e-02f, -2.717823924e-02f, +1.639688878e-02f, +4.315162828e-02f, +3.705630652e-02f, +7.660264021e-03f, -2.080898211e-02f, -2.944256762e-02f, -1.708695496e-02f, +2.740123711e-03f, +1.493883939e-02f, +1.386608626e-02f, +4.587662014e-03f, -3.980362717e-03f, -6.593904801e-03f, -4.040956062e-03f, -2.729096169e-04f, +1.690029190e-03f, +1.508082980e-03f, +5.125052301e-04f, -1.153649871e-04f, - +2.521870143e-05f, +1.624621214e-05f, -2.540375540e-05f, -8.169444519e-05f, -1.041471292e-04f, -4.359758709e-05f, +1.016705850e-04f, +2.558267896e-04f, +2.902740750e-04f, +1.075577770e-04f, -2.608383219e-04f, -6.182403434e-04f, -6.826735565e-04f, -2.658826444e-04f, +5.470861159e-04f, +1.348204232e-03f, +1.562449107e-03f, +7.626505743e-04f, -1.022169247e-03f, -3.201943052e-03f, -4.828995200e-03f, -5.040408874e-03f, -3.515924974e-03f, -6.943928988e-04f, +2.389547080e-03f, +4.578708397e-03f, +5.131168788e-03f, +4.040337745e-03f, +1.979090371e-03f, -8.035797108e-05f, -1.348665889e-03f, -1.546728218e-03f, -9.321568742e-04f, -5.838895299e-05f, +5.622843227e-04f, +6.980656076e-04f, +4.349081821e-04f, +3.884562163e-05f, -2.390542422e-04f, -2.932892410e-04f, -1.751005601e-04f, -1.217293043e-05f, +8.959208158e-05f, +9.908437117e-05f, +5.057089919e-05f, -1.807232852e-06f, -2.507083135e-05f, -1.946383437e-05f, - -4.351565455e-05f, -6.494024989e-05f, -5.521696940e-06f, +1.378560946e-04f, +2.477495159e-04f, +1.501848820e-04f, -1.996906535e-04f, -5.753710700e-04f, -5.815844655e-04f, -7.906233985e-06f, +8.520507510e-04f, +1.284683345e-03f, +7.131923655e-04f, -6.844865997e-04f, -1.905354028e-03f, -1.828080810e-03f, -2.129361260e-04f, +1.888500953e-03f, +2.816067114e-03f, +1.643063030e-03f, -9.328759901e-04f, -2.997878283e-03f, -2.905115653e-03f, -6.387110148e-04f, +2.110929078e-03f, +3.270051945e-03f, +2.021755815e-03f, -5.902221241e-04f, -2.560085015e-03f, -2.525288040e-03f, -7.446799040e-04f, +1.276050184e-03f, +2.075165918e-03f, +1.315601324e-03f, -1.586408310e-04f, -1.169755890e-03f, -1.139220329e-03f, -3.699785465e-04f, +3.979090191e-04f, +6.449391495e-04f, +3.834583218e-04f, -2.141035931e-05f, -2.385701128e-04f, -2.007480380e-04f, -5.097508111e-05f, +5.152445542e-05f, +5.902239499e-05f, +1.997819080e-05f, - /* 4, 4 (48) */ - -3.419026667e-04f, -7.191580447e-04f, -7.068744368e-04f, +1.291566484e-04f, +1.687754808e-03f, +3.028604419e-03f, +2.718080689e-03f, -1.334018877e-04f, -4.729282393e-03f, -8.311664841e-03f, -7.422532389e-03f, -3.690051289e-04f, +1.056824870e-02f, +1.902991082e-02f, +1.751238242e-02f, +2.360197545e-03f, -2.196020074e-02f, -4.242683867e-02f, -4.228724054e-02f, -9.520321375e-03f, +5.530338001e-02f, +1.364219603e-01f, +2.078337474e-01f, +2.440608974e-01f, +2.315816396e-01f, +1.750919182e-01f, +9.531867170e-02f, +1.953432129e-02f, -3.030728694e-02f, -4.590255639e-02f, -3.372462511e-02f, -9.298635668e-03f, +1.158199278e-02f, +1.989914247e-02f, +1.560449493e-02f, +4.935633097e-03f, -4.632393590e-03f, -8.605084859e-03f, -6.872437653e-03f, -2.346441579e-03f, +1.609552203e-03f, +3.163240712e-03f, +2.472974661e-03f, +8.573773257e-04f, -4.039106273e-04f, -7.951412884e-04f, -5.459737548e-04f, -1.594593269e-04f, - +1.580390140e-04f, +1.083182822e-03f, +1.812135126e-03f, +8.882849680e-04f, -2.306907516e-03f, -5.901372922e-03f, -5.934376806e-03f, +3.001439006e-04f, +1.027918498e-02f, +1.599702293e-02f, +9.633062975e-03f, -8.316727808e-03f, -2.603400990e-02f, -2.754344226e-02f, -6.355814215e-03f, +2.574937612e-02f, +4.451593900e-02f, +3.169877556e-02f, -7.988525159e-03f, -4.699435420e-02f, -5.470250500e-02f, -2.224291876e-02f, +2.839320009e-02f, +5.994907623e-02f, +4.868213496e-02f, +3.100650641e-03f, -4.277381772e-02f, -5.605138352e-02f, -2.973832426e-02f, +1.387160074e-02f, +4.240694837e-02f, +3.833235670e-02f, +9.735429939e-03f, -1.949338079e-02f, -2.960120845e-02f, -1.825671085e-02f, +1.600903381e-03f, +1.456886084e-02f, +1.426399528e-02f, +5.232601164e-03f, -3.596904395e-03f, -6.615315161e-03f, -4.279526175e-03f, -4.736576549e-04f, +1.639054109e-03f, +1.559607435e-03f, +5.715276251e-04f, -9.538679632e-05f, - +2.485289707e-05f, +1.776326699e-05f, -2.200368024e-05f, -7.856878056e-05f, -1.048028527e-04f, -5.021681594e-05f, +9.115875605e-05f, +2.483026841e-04f, +2.939449663e-04f, +1.256045662e-04f, -2.353727258e-04f, -6.016008928e-04f, -6.918695702e-04f, -3.061393594e-04f, +4.910136010e-04f, +1.309366105e-03f, +1.576115501e-03f, +8.447000245e-04f, -8.903907804e-04f, -3.071438158e-03f, -4.761745523e-03f, -5.078461389e-03f, -3.657484738e-03f, -8.909585180e-04f, +2.212088805e-03f, +4.485524544e-03f, +5.148645087e-03f, +4.146445129e-03f, +2.117978792e-03f, +3.120562914e-05f, -1.300823683e-03f, -1.563007677e-03f, -9.843715783e-04f, -1.097988158e-04f, +5.370296229e-04f, +7.034697038e-04f, +4.583176107e-04f, +6.216550883e-05f, -2.280289067e-04f, -2.960872217e-04f, -1.851908887e-04f, -2.132956422e-05f, +8.601535640e-05f, +1.007525581e-04f, +5.423212726e-05f, +7.802366320e-07f, -2.460697086e-05f, -2.032459926e-05f, - -4.092953074e-05f, -6.541522858e-05f, -1.223419269e-05f, +1.280780387e-04f, +2.453588821e-04f, +1.644573947e-04f, -1.733364085e-04f, -5.586638714e-04f, -5.981467065e-04f, -5.803657589e-05f, +8.026117632e-04f, +1.283898334e-03f, +7.797996862e-04f, -5.891793017e-04f, -1.858009816e-03f, -1.882186182e-03f, -3.445958614e-04f, +1.775143192e-03f, +2.817464960e-03f, +1.773143062e-03f, -7.647279520e-04f, -2.921259728e-03f, -2.984526936e-03f, -8.177176306e-04f, +1.967622483e-03f, +3.269375510e-03f, +2.158558199e-03f, -4.249506554e-04f, -2.488983513e-03f, -2.589705622e-03f, -8.813995793e-04f, +1.174650167e-03f, +2.074395682e-03f, +1.396719979e-03f, -6.937474964e-05f, -1.135794214e-03f, -1.169549304e-03f, -4.257833885e-04f, +3.623634157e-04f, +6.470662585e-04f, +4.083916371e-04f, +6.770848861e-07f, -2.331834640e-04f, -2.083676856e-04f, -6.015583712e-05f, +4.804651873e-05f, +6.065202711e-05f, +2.249519359e-05f, - /* 4, 5 (48) */ - -3.170497696e-04f, -7.013947777e-04f, -7.288781171e-04f, +5.058786781e-05f, +1.582951955e-03f, +2.978387603e-03f, +2.809239445e-03f, +1.149007964e-04f, -4.435337427e-03f, -8.186060275e-03f, -7.657905115e-03f, -9.706060217e-04f, +9.876379128e-03f, +1.872377146e-02f, +1.800339602e-02f, +3.669563650e-03f, -2.038408523e-02f, -4.158213864e-02f, -4.317763132e-02f, -1.259175953e-02f, +5.054163449e-02f, +1.313434989e-01f, +2.041762626e-01f, +2.431699389e-01f, +2.337937284e-01f, +1.795774427e-01f, +1.004673168e-01f, +2.368076642e-02f, -2.818930815e-02f, -4.587135076e-02f, -3.502544879e-02f, -1.086164335e-02f, +1.059762120e-02f, +1.978934366e-02f, +1.614152455e-02f, +5.639102801e-03f, -4.174075979e-03f, -8.542919350e-03f, -7.100466560e-03f, -2.642528801e-03f, +1.424361314e-03f, +3.141911148e-03f, +2.558990017e-03f, +9.581298838e-04f, -3.496785000e-04f, -7.943610518e-04f, -5.705807257e-04f, -1.797839262e-04f, - +1.171094832e-04f, +1.017767593e-03f, +1.799900934e-03f, +1.016363007e-03f, -2.061548634e-03f, -5.736915528e-03f, -6.107713214e-03f, -2.585199707e-04f, +9.681038274e-03f, +1.593898636e-02f, +1.043567474e-02f, -7.032829474e-03f, -2.525421021e-02f, -2.813262157e-02f, -8.213824032e-03f, +2.386718994e-02f, +4.417134314e-02f, +3.347391875e-02f, -5.171060199e-03f, -4.522121114e-02f, -5.546723295e-02f, -2.516417848e-02f, +2.540867315e-02f, +5.913135860e-02f, +5.064975744e-02f, +6.370026151e-03f, -4.061525952e-02f, -5.647633418e-02f, -3.222730777e-02f, +1.128189512e-02f, +4.152554879e-02f, +3.950700687e-02f, +1.180982562e-02f, -1.809666081e-02f, -2.967058320e-02f, -1.939250507e-02f, +4.313540776e-04f, +1.414307745e-02f, +1.462635870e-02f, +5.879667422e-03f, -3.188512758e-03f, -6.614638076e-03f, -4.512709639e-03f, -6.820253404e-04f, +1.578898272e-03f, +1.607653954e-03f, +6.321796522e-04f, -7.289160273e-05f, - +2.440573637e-05f, +1.914268171e-05f, -1.868087567e-05f, -7.532679167e-05f, -1.051278059e-04f, -5.646952880e-05f, +8.072975785e-05f, +2.403360389e-04f, +2.967372692e-04f, +1.428395536e-04f, -2.099631606e-04f, -5.838578326e-04f, -6.991147656e-04f, -3.446736192e-04f, +4.350912186e-04f, +1.268332935e-03f, +1.585730846e-03f, +9.226316762e-04f, -7.604891965e-04f, -2.939000589e-03f, -4.688951385e-03f, -5.109462957e-03f, -3.793573174e-03f, -1.086154718e-03f, +2.031255250e-03f, +4.385797410e-03f, +5.159375410e-03f, +4.248431559e-03f, +2.256696583e-03f, +1.458931227e-04f, -1.248613006e-03f, -1.575895357e-03f, -1.035441599e-03f, -1.621958337e-04f, +5.097856788e-04f, +7.072009381e-04f, +4.811414114e-04f, +8.595071913e-05f, -2.160797036e-04f, -2.981584054e-04f, -1.950818736e-04f, -3.073382484e-05f, +8.205323572e-05f, +1.021742297e-04f, +5.787398607e-05f, +3.489473056e-06f, -2.402031080e-05f, -2.114314640e-05f, - -3.830173685e-05f, -6.556882424e-05f, -1.856161600e-05f, +1.182379750e-04f, +2.421555950e-04f, +1.776279014e-04f, -1.472412174e-04f, -5.405545465e-04f, -6.122663293e-04f, -1.067469839e-04f, +7.516667697e-04f, +1.279003693e-03f, +8.427150406e-04f, -4.935575695e-04f, -1.805509649e-03f, -1.929715963e-03f, -4.737242104e-04f, +1.657348110e-03f, +2.810128809e-03f, +1.896916352e-03f, -5.950365752e-04f, -2.835891805e-03f, -3.054588224e-03f, -9.941286267e-04f, +1.818091573e-03f, +3.258593194e-03f, +2.289227892e-03f, -2.574437953e-04f, -2.409627157e-03f, -2.646584855e-03f, -1.016755263e-03f, +1.068331401e-03f, +2.067024802e-03f, +1.474623762e-03f, +2.166481680e-05f, -1.097473649e-03f, -1.196674685e-03f, -4.814922535e-04f, +3.246550398e-04f, +6.470168316e-04f, +4.326763660e-04f, +2.354189483e-05f, -2.267078061e-04f, -2.154997430e-04f, -6.953530181e-05f, +4.415898908e-05f, +6.208023054e-05f, +2.506595819e-05f, - /* 4, 6 (48) */ - -2.926440332e-04f, -6.822520959e-04f, -7.475589927e-04f, -2.473892386e-05f, +1.477824149e-03f, +2.921918074e-03f, +2.889969203e-03f, +3.552368352e-04f, -4.138600157e-03f, -8.043220721e-03f, -7.867868276e-03f, -1.554463854e-03f, +9.177264362e-03f, +1.837909784e-02f, +1.843848724e-02f, +4.937896585e-03f, -1.879835439e-02f, -4.065950696e-02f, -4.393812052e-02f, -1.553076012e-02f, +4.585268310e-02f, +1.262340359e-01f, +2.003826895e-01f, +2.420837842e-01f, +2.358249836e-01f, +1.839632402e-01f, +1.056266922e-01f, +2.792919798e-02f, -2.593261157e-02f, -4.572545764e-02f, -3.627406180e-02f, -1.243753870e-02f, +9.562179601e-03f, +1.962714782e-02f, +1.665131023e-02f, +6.346303739e-03f, -3.692934568e-03f, -8.456968631e-03f, -7.316546263e-03f, -2.940687206e-03f, +1.229279441e-03f, +3.111177323e-03f, +2.641043253e-03f, +1.060304113e-03f, -2.918045140e-04f, -7.908715787e-04f, -5.946010365e-04f, -2.009270726e-04f, - +7.880774639e-05f, +9.521987690e-04f, +1.781339318e-03f, +1.134600982e-03f, -1.819393039e-03f, -5.559287626e-03f, -6.254954431e-03f, -7.990745172e-04f, +9.068771944e-03f, +1.583223937e-02f, +1.118734151e-02f, -5.753825781e-03f, -2.441149517e-02f, -2.862617914e-02f, -1.001933368e-02f, +2.193747398e-02f, +4.369761893e-02f, +3.513126686e-02f, -2.360931390e-03f, -4.332429479e-02f, -5.606226953e-02f, -2.800007029e-02f, +2.235408493e-02f, +5.813722997e-02f, +5.246784902e-02f, +9.628619345e-03f, -3.832603163e-02f, -5.673377797e-02f, -3.463693493e-02f, +8.635310265e-03f, +4.050879353e-02f, +4.057533827e-02f, +1.387685042e-02f, -1.662203705e-02f, -2.964891839e-02f, -2.048997872e-02f, -7.653206070e-04f, +1.366158520e-02f, +1.495101374e-02f, +6.526684254e-03f, -2.755836392e-03f, -6.591096181e-03f, -4.739417445e-03f, -8.975250834e-04f, +1.509362970e-03f, +1.651812943e-03f, +6.942598828e-04f, -4.782564454e-05f, - +2.388268238e-05f, +2.038529763e-05f, -1.544345222e-05f, -7.198300477e-05f, -1.051323070e-04f, -6.234922847e-05f, +7.041060820e-05f, +2.319614842e-04f, +2.986673396e-04f, +1.592382384e-04f, -1.846742780e-04f, -5.650832478e-04f, -7.044371083e-04f, -3.814306438e-04f, +3.794501758e-04f, +1.225251987e-03f, +1.591369861e-03f, +9.963815105e-04f, -6.326646124e-04f, -2.804883992e-03f, -4.610794003e-03f, -5.133420237e-03f, -3.924003801e-03f, -1.279682551e-03f, +1.847317835e-03f, +4.279645494e-03f, +5.163280051e-03f, +4.346073830e-03f, +2.394996447e-03f, +2.635497313e-04f, -1.192041739e-03f, -1.585279156e-03f, -1.085215875e-03f, -2.154730948e-04f, +4.805740365e-04f, +7.092087738e-04f, +5.033047016e-04f, +1.101495045e-04f, -2.032142678e-04f, -2.994762987e-04f, -2.047391603e-04f, -4.036583496e-05f, +7.770475349e-05f, +1.033359034e-04f, +6.148349062e-05f, +6.315887839e-06f, -2.330756098e-05f, -2.191386919e-05f, - -3.564802872e-05f, -6.541647930e-05f, -2.449432609e-05f, +1.083783024e-04f, +2.381825098e-04f, +1.896848636e-04f, -1.214916587e-04f, -5.211471490e-04f, -6.239577516e-04f, -1.539046480e-04f, +6.994199307e-04f, +1.270096047e-03f, +9.017960107e-04f, -3.979392574e-04f, -1.748096881e-03f, -1.970598482e-03f, -5.999334907e-04f, +1.535534094e-03f, +2.794149814e-03f, +2.014028202e-03f, -4.243487494e-04f, -2.742074807e-03f, -3.115094746e-03f, -1.167384978e-03f, +1.662805419e-03f, +3.237714706e-03f, +2.413324272e-03f, -8.822525744e-05f, -2.322213947e-03f, -2.695679175e-03f, -1.150295009e-03f, +9.573833096e-04f, +2.052990060e-03f, +1.549006979e-03f, +1.142038653e-04f, -1.054841968e-03f, -1.220437529e-03f, -5.369099587e-04f, +2.848623687e-04f, +6.447309089e-04f, +4.562034539e-04f, +4.712340274e-05f, -2.191286046e-04f, -2.220953406e-04f, -7.908187432e-05f, +3.985954338e-05f, +6.328869589e-05f, +2.767916530e-05f, - /* 4, 7 (48) */ - -2.687613508e-04f, -6.618667983e-04f, -7.630024450e-04f, -9.672192862e-05f, +1.372691842e-03f, +2.859568845e-03f, +2.960379811e-03f, +5.871983194e-04f, -3.839932818e-03f, -7.883982483e-03f, -8.052542554e-03f, -2.119547102e-03f, +8.472827254e-03f, +1.799766720e-02f, +1.881793742e-02f, +6.163148572e-03f, -1.720698453e-02f, -3.966312545e-02f, -4.457078513e-02f, -1.833564411e-02f, +4.124188910e-02f, +1.211006157e-01f, +1.964586857e-01f, +2.408041017e-01f, +2.376723015e-01f, +1.882428856e-01f, +1.107899723e-01f, +3.227527181e-02f, -2.353761512e-02f, -4.546190791e-02f, -3.746610354e-02f, -1.402281786e-02f, +8.476963726e-03f, +1.941167473e-02f, +1.713188427e-02f, +7.055512513e-03f, -3.189629866e-03f, -8.346819126e-03f, -7.519760531e-03f, -3.240163505e-03f, +1.024540281e-03f, +3.070811488e-03f, +2.718748007e-03f, +1.163640017e-03f, -2.303210233e-04f, -7.845556909e-04f, -6.179085974e-04f, -2.228409418e-04f, - +4.315971767e-05f, +8.867822897e-04f, +1.756844992e-03f, +1.242979284e-03f, -1.581210529e-03f, -5.369602763e-03f, -6.376446090e-03f, -1.320221666e-03f, +8.444814193e-03f, +1.567833472e-02f, +1.188676144e-02f, -4.483729733e-03f, -2.350969916e-02f, -2.902411839e-02f, -1.176743056e-02f, +1.996687550e-02f, +4.309768544e-02f, +3.666680095e-02f, +4.332184234e-04f, -4.131026659e-02f, -5.648661828e-02f, -3.074214510e-02f, +1.923899018e-02f, +5.696984499e-02f, +5.413065444e-02f, +1.286633405e-02f, -3.591270736e-02f, -5.682200323e-02f, -3.695914888e-02f, +5.939631090e-03f, +3.935849852e-02f, +4.153272158e-02f, +1.592984048e-02f, -1.507303007e-02f, -2.953471452e-02f, -2.154482068e-02f, -1.985758136e-03f, +1.312467524e-02f, +1.523587610e-02f, +7.171415163e-03f, -2.299632938e-03f, -6.543972778e-03f, -4.958546050e-03f, -1.119620424e-03f, +1.430281096e-03f, +1.691672486e-03f, +7.575485786e-04f, -2.014647924e-05f, - +2.328927947e-05f, +2.149241715e-05f, -1.229894406e-05f, -6.855178752e-05f, -1.048273375e-04f, -6.785072484e-05f, +6.022723717e-05f, +2.232138583e-04f, +2.997534787e-04f, +1.747789771e-04f, -1.595688629e-04f, -5.453502079e-04f, -7.078687720e-04f, -4.163612200e-04f, +3.242181677e-04f, +1.180272056e-03f, +1.593114251e-03f, +1.065894971e-03f, -5.071103173e-04f, -2.669342214e-03f, -4.527462721e-03f, -5.150352405e-03f, -4.048600782e-03f, -1.471246277e-03f, +1.660553920e-03f, +4.167199231e-03f, +5.160291051e-03f, +4.439154570e-03f, +2.532628792e-03f, +3.840124563e-04f, -1.131126946e-03f, -1.591052417e-03f, -1.133543098e-03f, -2.695191451e-04f, +4.494217083e-04f, +7.094459692e-04f, +5.247325564e-04f, +1.347077095e-04f, -1.894429744e-04f, -3.000158343e-04f, -2.141281029e-04f, -5.020444006e-05f, +7.297011391e-05f, +1.042244879e-04f, +6.504730720e-05f, +9.254301850e-06f, -2.246578373e-05f, -2.263112961e-05f, - -3.298352728e-05f, -6.497437691e-05f, -3.002482001e-05f, +9.853988425e-05f, +2.334840638e-04f, +2.006214236e-04f, -9.617045035e-05f, -5.005476724e-04f, -6.332437672e-04f, -1.993852731e-04f, +6.460757027e-04f, +1.257284011e-03f, +9.569156754e-04f, -3.026373218e-04f, -1.686027989e-03f, -2.004785068e-03f, -7.228497856e-04f, +1.410128991e-03f, +2.769646834e-03f, +2.124147921e-03f, -2.532120519e-04f, -2.640135635e-03f, -3.165873309e-03f, -1.336938230e-03f, +1.502252330e-03f, +3.206782822e-03f, +2.530426625e-03f, +8.217290435e-05f, -2.226969791e-03f, -2.736765832e-03f, -1.281568578e-03f, +8.421140762e-04f, +2.032249947e-03f, +1.619571516e-03f, +2.079588070e-04f, -1.007962800e-03f, -1.240687586e-03f, -5.918380977e-04f, +2.430733469e-04f, +6.401552626e-04f, +4.788635990e-04f, +7.135623777e-05f, -2.104352892e-04f, -2.281060413e-04f, -8.876192768e-05f, +3.514768506e-05f, +6.425933412e-05f, +3.032266962e-05f, - /* 4, 8 (48) */ - -2.454720714e-04f, -6.403743812e-04f, -7.753013890e-04f, -1.652737161e-04f, +1.267864505e-03f, +2.791718120e-03f, +3.020607048e-03f, +8.104121777e-04f, -3.540179339e-03f, -7.709203505e-03f, -8.212111417e-03f, -2.664897310e-03f, +7.764958482e-03f, +1.758130598e-02f, +1.914215558e-02f, +7.343420628e-03f, -1.561387028e-02f, -3.859723048e-02f, -4.507789545e-02f, -2.100498633e-02f, +3.671442638e-02f, +1.159502633e-01f, +1.924100849e-01f, +2.393328554e-01f, +2.393328554e-01f, +1.924100849e-01f, +1.159502633e-01f, +3.671442638e-02f, -2.100498633e-02f, -4.507789545e-02f, -3.859723048e-02f, -1.561387028e-02f, +7.343420628e-03f, +1.914215558e-02f, +1.758130598e-02f, +7.764958482e-03f, -2.664897310e-03f, -8.212111417e-03f, -7.709203505e-03f, -3.540179339e-03f, +8.104121777e-04f, +3.020607048e-03f, +2.791718120e-03f, +1.267864505e-03f, -1.652737161e-04f, -7.753013890e-04f, -6.403743812e-04f, -2.454720714e-04f, - +1.017619038e-05f, +8.218079128e-04f, +1.726820172e-03f, +1.341519168e-03f, -1.347726465e-03f, -5.168981339e-03f, -6.472616540e-03f, -1.820769339e-03f, +7.811570426e-03f, +1.547894945e-02f, +1.253283714e-02f, -3.226445722e-03f, -2.255278348e-02f, -2.932675571e-02f, -1.345345855e-02f, +1.796209043e-02f, +4.237483565e-02f, +3.807692994e-02f, +3.202865258e-03f, -3.918611867e-02f, -5.673983033e-02f, -3.338228073e-02f, +1.607311687e-02f, +5.563290677e-02f, +5.563290677e-02f, +1.607311687e-02f, -3.338228073e-02f, -5.673983033e-02f, -3.918611867e-02f, +3.202865258e-03f, +3.807692994e-02f, +4.237483565e-02f, +1.796209043e-02f, -1.345345855e-02f, -2.932675571e-02f, -2.255278348e-02f, -3.226445722e-03f, +1.253283714e-02f, +1.547894945e-02f, +7.811570426e-03f, -1.820769339e-03f, -6.472616540e-03f, -5.168981339e-03f, -1.347726465e-03f, +1.341519168e-03f, +1.726820172e-03f, +8.218079128e-04f, +1.017619038e-05f, - +2.263112961e-05f, +2.246578373e-05f, -9.254301850e-06f, -6.504730720e-05f, -1.042244879e-04f, -7.297011391e-05f, +5.020444006e-05f, +2.141281029e-04f, +3.000158343e-04f, +1.894429744e-04f, -1.347077095e-04f, -5.247325564e-04f, -7.094459692e-04f, -4.494217083e-04f, +2.695191451e-04f, +1.133543098e-03f, +1.591052417e-03f, +1.131126946e-03f, -3.840124563e-04f, -2.532628792e-03f, -4.439154570e-03f, -5.160291051e-03f, -4.167199231e-03f, -1.660553920e-03f, +1.471246277e-03f, +4.048600782e-03f, +5.150352405e-03f, +4.527462721e-03f, +2.669342214e-03f, +5.071103173e-04f, -1.065894971e-03f, -1.593114251e-03f, -1.180272056e-03f, -3.242181677e-04f, +4.163612200e-04f, +7.078687720e-04f, +5.453502079e-04f, +1.595688629e-04f, -1.747789771e-04f, -2.997534787e-04f, -2.232138583e-04f, -6.022723717e-05f, +6.785072484e-05f, +1.048273375e-04f, +6.855178752e-05f, +1.229894406e-05f, -2.149241715e-05f, -2.328927947e-05f, - -3.032266962e-05f, -6.425933412e-05f, -3.514768506e-05f, +8.876192768e-05f, +2.281060413e-04f, +2.104352892e-04f, -7.135623777e-05f, -4.788635990e-04f, -6.401552626e-04f, -2.430733469e-04f, +5.918380977e-04f, +1.240687586e-03f, +1.007962800e-03f, -2.079588070e-04f, -1.619571516e-03f, -2.032249947e-03f, -8.421140762e-04f, +1.281568578e-03f, +2.736765832e-03f, +2.226969791e-03f, -8.217290435e-05f, -2.530426625e-03f, -3.206782822e-03f, -1.502252330e-03f, +1.336938230e-03f, +3.165873309e-03f, +2.640135635e-03f, +2.532120519e-04f, -2.124147921e-03f, -2.769646834e-03f, -1.410128991e-03f, +7.228497856e-04f, +2.004785068e-03f, +1.686027989e-03f, +3.026373218e-04f, -9.569156754e-04f, -1.257284011e-03f, -6.460757027e-04f, +1.993852731e-04f, +6.332437672e-04f, +5.005476724e-04f, +9.617045035e-05f, -2.006214236e-04f, -2.334840638e-04f, -9.853988425e-05f, +3.002482001e-05f, +6.497437691e-05f, +3.298352728e-05f, - /* 4, 9 (48) */ - -2.228409418e-04f, -6.179085974e-04f, -7.845556909e-04f, -2.303210233e-04f, +1.163640017e-03f, +2.718748007e-03f, +3.070811488e-03f, +1.024540281e-03f, -3.240163505e-03f, -7.519760531e-03f, -8.346819126e-03f, -3.189629866e-03f, +7.055512513e-03f, +1.713188427e-02f, +1.941167473e-02f, +8.476963726e-03f, -1.402281786e-02f, -3.746610354e-02f, -4.546190791e-02f, -2.353761512e-02f, +3.227527181e-02f, +1.107899723e-01f, +1.882428856e-01f, +2.376723015e-01f, +2.408041017e-01f, +1.964586857e-01f, +1.211006157e-01f, +4.124188910e-02f, -1.833564411e-02f, -4.457078513e-02f, -3.966312545e-02f, -1.720698453e-02f, +6.163148572e-03f, +1.881793742e-02f, +1.799766720e-02f, +8.472827254e-03f, -2.119547102e-03f, -8.052542554e-03f, -7.883982483e-03f, -3.839932818e-03f, +5.871983194e-04f, +2.960379811e-03f, +2.859568845e-03f, +1.372691842e-03f, -9.672192862e-05f, -7.630024450e-04f, -6.618667983e-04f, -2.687613508e-04f, - -2.014647924e-05f, +7.575485786e-04f, +1.691672486e-03f, +1.430281096e-03f, -1.119620424e-03f, -4.958546050e-03f, -6.543972778e-03f, -2.299632938e-03f, +7.171415163e-03f, +1.523587610e-02f, +1.312467524e-02f, -1.985758136e-03f, -2.154482068e-02f, -2.953471452e-02f, -1.507303007e-02f, +1.592984048e-02f, +4.153272158e-02f, +3.935849852e-02f, +5.939631090e-03f, -3.695914888e-02f, -5.682200323e-02f, -3.591270736e-02f, +1.286633405e-02f, +5.413065444e-02f, +5.696984499e-02f, +1.923899018e-02f, -3.074214510e-02f, -5.648661828e-02f, -4.131026659e-02f, +4.332184234e-04f, +3.666680095e-02f, +4.309768544e-02f, +1.996687550e-02f, -1.176743056e-02f, -2.902411839e-02f, -2.350969916e-02f, -4.483729733e-03f, +1.188676144e-02f, +1.567833472e-02f, +8.444814193e-03f, -1.320221666e-03f, -6.376446090e-03f, -5.369602763e-03f, -1.581210529e-03f, +1.242979284e-03f, +1.756844992e-03f, +8.867822897e-04f, +4.315971767e-05f, - +2.191386919e-05f, +2.330756098e-05f, -6.315887839e-06f, -6.148349062e-05f, -1.033359034e-04f, -7.770475349e-05f, +4.036583496e-05f, +2.047391603e-04f, +2.994762987e-04f, +2.032142678e-04f, -1.101495045e-04f, -5.033047016e-04f, -7.092087738e-04f, -4.805740365e-04f, +2.154730948e-04f, +1.085215875e-03f, +1.585279156e-03f, +1.192041739e-03f, -2.635497313e-04f, -2.394996447e-03f, -4.346073830e-03f, -5.163280051e-03f, -4.279645494e-03f, -1.847317835e-03f, +1.279682551e-03f, +3.924003801e-03f, +5.133420237e-03f, +4.610794003e-03f, +2.804883992e-03f, +6.326646124e-04f, -9.963815105e-04f, -1.591369861e-03f, -1.225251987e-03f, -3.794501758e-04f, +3.814306438e-04f, +7.044371083e-04f, +5.650832478e-04f, +1.846742780e-04f, -1.592382384e-04f, -2.986673396e-04f, -2.319614842e-04f, -7.041060820e-05f, +6.234922847e-05f, +1.051323070e-04f, +7.198300477e-05f, +1.544345222e-05f, -2.038529763e-05f, -2.388268238e-05f, - -2.767916530e-05f, -6.328869589e-05f, -3.985954338e-05f, +7.908187432e-05f, +2.220953406e-04f, +2.191286046e-04f, -4.712340274e-05f, -4.562034539e-04f, -6.447309089e-04f, -2.848623687e-04f, +5.369099587e-04f, +1.220437529e-03f, +1.054841968e-03f, -1.142038653e-04f, -1.549006979e-03f, -2.052990060e-03f, -9.573833096e-04f, +1.150295009e-03f, +2.695679175e-03f, +2.322213947e-03f, +8.822525744e-05f, -2.413324272e-03f, -3.237714706e-03f, -1.662805419e-03f, +1.167384978e-03f, +3.115094746e-03f, +2.742074807e-03f, +4.243487494e-04f, -2.014028202e-03f, -2.794149814e-03f, -1.535534094e-03f, +5.999334907e-04f, +1.970598482e-03f, +1.748096881e-03f, +3.979392574e-04f, -9.017960107e-04f, -1.270096047e-03f, -6.994199307e-04f, +1.539046480e-04f, +6.239577516e-04f, +5.211471490e-04f, +1.214916587e-04f, -1.896848636e-04f, -2.381825098e-04f, -1.083783024e-04f, +2.449432609e-05f, +6.541647930e-05f, +3.564802872e-05f, - /* 4,10 (48) */ - -2.009270726e-04f, -5.946010365e-04f, -7.908715787e-04f, -2.918045140e-04f, +1.060304113e-03f, +2.641043253e-03f, +3.111177323e-03f, +1.229279441e-03f, -2.940687206e-03f, -7.316546263e-03f, -8.456968631e-03f, -3.692934568e-03f, +6.346303739e-03f, +1.665131023e-02f, +1.962714782e-02f, +9.562179601e-03f, -1.243753870e-02f, -3.627406180e-02f, -4.572545764e-02f, -2.593261157e-02f, +2.792919798e-02f, +1.056266922e-01f, +1.839632402e-01f, +2.358249836e-01f, +2.420837842e-01f, +2.003826895e-01f, +1.262340359e-01f, +4.585268310e-02f, -1.553076012e-02f, -4.393812052e-02f, -4.065950696e-02f, -1.879835439e-02f, +4.937896585e-03f, +1.843848724e-02f, +1.837909784e-02f, +9.177264362e-03f, -1.554463854e-03f, -7.867868276e-03f, -8.043220721e-03f, -4.138600157e-03f, +3.552368352e-04f, +2.889969203e-03f, +2.921918074e-03f, +1.477824149e-03f, -2.473892386e-05f, -7.475589927e-04f, -6.822520959e-04f, -2.926440332e-04f, - -4.782564454e-05f, +6.942598828e-04f, +1.651812943e-03f, +1.509362970e-03f, -8.975250834e-04f, -4.739417445e-03f, -6.591096181e-03f, -2.755836392e-03f, +6.526684254e-03f, +1.495101374e-02f, +1.366158520e-02f, -7.653206070e-04f, -2.048997872e-02f, -2.964891839e-02f, -1.662203705e-02f, +1.387685042e-02f, +4.057533827e-02f, +4.050879353e-02f, +8.635310265e-03f, -3.463693493e-02f, -5.673377797e-02f, -3.832603163e-02f, +9.628619345e-03f, +5.246784902e-02f, +5.813722997e-02f, +2.235408493e-02f, -2.800007029e-02f, -5.606226953e-02f, -4.332429479e-02f, -2.360931390e-03f, +3.513126686e-02f, +4.369761893e-02f, +2.193747398e-02f, -1.001933368e-02f, -2.862617914e-02f, -2.441149517e-02f, -5.753825781e-03f, +1.118734151e-02f, +1.583223937e-02f, +9.068771944e-03f, -7.990745172e-04f, -6.254954431e-03f, -5.559287626e-03f, -1.819393039e-03f, +1.134600982e-03f, +1.781339318e-03f, +9.521987690e-04f, +7.880774639e-05f, - +2.114314640e-05f, +2.402031080e-05f, -3.489473056e-06f, -5.787398607e-05f, -1.021742297e-04f, -8.205323572e-05f, +3.073382484e-05f, +1.950818736e-04f, +2.981584054e-04f, +2.160797036e-04f, -8.595071913e-05f, -4.811414114e-04f, -7.072009381e-04f, -5.097856788e-04f, +1.621958337e-04f, +1.035441599e-03f, +1.575895357e-03f, +1.248613006e-03f, -1.458931227e-04f, -2.256696583e-03f, -4.248431559e-03f, -5.159375410e-03f, -4.385797410e-03f, -2.031255250e-03f, +1.086154718e-03f, +3.793573174e-03f, +5.109462957e-03f, +4.688951385e-03f, +2.939000589e-03f, +7.604891965e-04f, -9.226316762e-04f, -1.585730846e-03f, -1.268332935e-03f, -4.350912186e-04f, +3.446736192e-04f, +6.991147656e-04f, +5.838578326e-04f, +2.099631606e-04f, -1.428395536e-04f, -2.967372692e-04f, -2.403360389e-04f, -8.072975785e-05f, +5.646952880e-05f, +1.051278059e-04f, +7.532679167e-05f, +1.868087567e-05f, -1.914268171e-05f, -2.440573637e-05f, - -2.506595819e-05f, -6.208023054e-05f, -4.415898908e-05f, +6.953530181e-05f, +2.154997430e-04f, +2.267078061e-04f, -2.354189483e-05f, -4.326763660e-04f, -6.470168316e-04f, -3.246550398e-04f, +4.814922535e-04f, +1.196674685e-03f, +1.097473649e-03f, -2.166481680e-05f, -1.474623762e-03f, -2.067024802e-03f, -1.068331401e-03f, +1.016755263e-03f, +2.646584855e-03f, +2.409627157e-03f, +2.574437953e-04f, -2.289227892e-03f, -3.258593194e-03f, -1.818091573e-03f, +9.941286267e-04f, +3.054588224e-03f, +2.835891805e-03f, +5.950365752e-04f, -1.896916352e-03f, -2.810128809e-03f, -1.657348110e-03f, +4.737242104e-04f, +1.929715963e-03f, +1.805509649e-03f, +4.935575695e-04f, -8.427150406e-04f, -1.279003693e-03f, -7.516667697e-04f, +1.067469839e-04f, +6.122663293e-04f, +5.405545465e-04f, +1.472412174e-04f, -1.776279014e-04f, -2.421555950e-04f, -1.182379750e-04f, +1.856161600e-05f, +6.556882424e-05f, +3.830173685e-05f, - /* 4,11 (48) */ - -1.797839262e-04f, -5.705807257e-04f, -7.943610518e-04f, -3.496785000e-04f, +9.581298838e-04f, +2.558990017e-03f, +3.141911148e-03f, +1.424361314e-03f, -2.642528801e-03f, -7.100466560e-03f, -8.542919350e-03f, -4.174075979e-03f, +5.639102801e-03f, +1.614152455e-02f, +1.978934366e-02f, +1.059762120e-02f, -1.086164335e-02f, -3.502544879e-02f, -4.587135076e-02f, -2.818930815e-02f, +2.368076642e-02f, +1.004673168e-01f, +1.795774427e-01f, +2.337937284e-01f, +2.431699389e-01f, +2.041762626e-01f, +1.313434989e-01f, +5.054163449e-02f, -1.259175953e-02f, -4.317763132e-02f, -4.158213864e-02f, -2.038408523e-02f, +3.669563650e-03f, +1.800339602e-02f, +1.872377146e-02f, +9.876379128e-03f, -9.706060217e-04f, -7.657905115e-03f, -8.186060275e-03f, -4.435337427e-03f, +1.149007964e-04f, +2.809239445e-03f, +2.978387603e-03f, +1.582951955e-03f, +5.058786781e-05f, -7.288781171e-04f, -7.013947777e-04f, -3.170497696e-04f, - -7.289160273e-05f, +6.321796522e-04f, +1.607653954e-03f, +1.578898272e-03f, -6.820253404e-04f, -4.512709639e-03f, -6.614638076e-03f, -3.188512758e-03f, +5.879667422e-03f, +1.462635870e-02f, +1.414307745e-02f, +4.313540776e-04f, -1.939250507e-02f, -2.967058320e-02f, -1.809666081e-02f, +1.180982562e-02f, +3.950700687e-02f, +4.152554879e-02f, +1.128189512e-02f, -3.222730777e-02f, -5.647633418e-02f, -4.061525952e-02f, +6.370026151e-03f, +5.064975744e-02f, +5.913135860e-02f, +2.540867315e-02f, -2.516417848e-02f, -5.546723295e-02f, -4.522121114e-02f, -5.171060199e-03f, +3.347391875e-02f, +4.417134314e-02f, +2.386718994e-02f, -8.213824032e-03f, -2.813262157e-02f, -2.525421021e-02f, -7.032829474e-03f, +1.043567474e-02f, +1.593898636e-02f, +9.681038274e-03f, -2.585199707e-04f, -6.107713214e-03f, -5.736915528e-03f, -2.061548634e-03f, +1.016363007e-03f, +1.799900934e-03f, +1.017767593e-03f, +1.171094832e-04f, - +2.032459926e-05f, +2.460697086e-05f, -7.802366320e-07f, -5.423212726e-05f, -1.007525581e-04f, -8.601535640e-05f, +2.132956422e-05f, +1.851908887e-04f, +2.960872217e-04f, +2.280289067e-04f, -6.216550883e-05f, -4.583176107e-04f, -7.034697038e-04f, -5.370296229e-04f, +1.097988158e-04f, +9.843715783e-04f, +1.563007677e-03f, +1.300823683e-03f, -3.120562914e-05f, -2.117978792e-03f, -4.146445129e-03f, -5.148645087e-03f, -4.485524544e-03f, -2.212088805e-03f, +8.909585180e-04f, +3.657484738e-03f, +5.078461389e-03f, +4.761745523e-03f, +3.071438158e-03f, +8.903907804e-04f, -8.447000245e-04f, -1.576115501e-03f, -1.309366105e-03f, -4.910136010e-04f, +3.061393594e-04f, +6.918695702e-04f, +6.016008928e-04f, +2.353727258e-04f, -1.256045662e-04f, -2.939449663e-04f, -2.483026841e-04f, -9.115875605e-05f, +5.021681594e-05f, +1.048028527e-04f, +7.856878056e-05f, +2.200368024e-05f, -1.776326699e-05f, -2.485289707e-05f, - -2.249519359e-05f, -6.065202711e-05f, -4.804651873e-05f, +6.015583712e-05f, +2.083676856e-04f, +2.331834640e-04f, -6.770848861e-07f, -4.083916371e-04f, -6.470662585e-04f, -3.623634157e-04f, +4.257833885e-04f, +1.169549304e-03f, +1.135794214e-03f, +6.937474964e-05f, -1.396719979e-03f, -2.074395682e-03f, -1.174650167e-03f, +8.813995793e-04f, +2.589705622e-03f, +2.488983513e-03f, +4.249506554e-04f, -2.158558199e-03f, -3.269375510e-03f, -1.967622483e-03f, +8.177176306e-04f, +2.984526936e-03f, +2.921259728e-03f, +7.647279520e-04f, -1.773143062e-03f, -2.817464960e-03f, -1.775143192e-03f, +3.445958614e-04f, +1.882186182e-03f, +1.858009816e-03f, +5.891793017e-04f, -7.797996862e-04f, -1.283898334e-03f, -8.026117632e-04f, +5.803657589e-05f, +5.981467065e-04f, +5.586638714e-04f, +1.733364085e-04f, -1.644573947e-04f, -2.453588821e-04f, -1.280780387e-04f, +1.223419269e-05f, +6.541522858e-05f, +4.092953074e-05f, - /* 4,12 (48) */ - -1.594593269e-04f, -5.459737548e-04f, -7.951412884e-04f, -4.039106273e-04f, +8.573773257e-04f, +2.472974661e-03f, +3.163240712e-03f, +1.609552203e-03f, -2.346441579e-03f, -6.872437653e-03f, -8.605084859e-03f, -4.632393590e-03f, +4.935633097e-03f, +1.560449493e-02f, +1.989914247e-02f, +1.158199278e-02f, -9.298635668e-03f, -3.372462511e-02f, -4.590255639e-02f, -3.030728694e-02f, +1.953432129e-02f, +9.531867170e-02f, +1.750919182e-01f, +2.315816396e-01f, +2.440608974e-01f, +2.078337474e-01f, +1.364219603e-01f, +5.530338001e-02f, -9.520321375e-03f, -4.228724054e-02f, -4.242683867e-02f, -2.196020074e-02f, +2.360197545e-03f, +1.751238242e-02f, +1.902991082e-02f, +1.056824870e-02f, -3.690051289e-04f, -7.422532389e-03f, -8.311664841e-03f, -4.729282393e-03f, -1.334018877e-04f, +2.718080689e-03f, +3.028604419e-03f, +1.687754808e-03f, +1.291566484e-04f, -7.068744368e-04f, -7.191580447e-04f, -3.419026667e-04f, - -9.538679632e-05f, +5.715276251e-04f, +1.559607435e-03f, +1.639054109e-03f, -4.736576549e-04f, -4.279526175e-03f, -6.615315161e-03f, -3.596904395e-03f, +5.232601164e-03f, +1.426399528e-02f, +1.456886084e-02f, +1.600903381e-03f, -1.825671085e-02f, -2.960120845e-02f, -1.949338079e-02f, +9.735429939e-03f, +3.833235670e-02f, +4.240694837e-02f, +1.387160074e-02f, -2.973832426e-02f, -5.605138352e-02f, -4.277381772e-02f, +3.100650641e-03f, +4.868213496e-02f, +5.994907623e-02f, +2.839320009e-02f, -2.224291876e-02f, -5.470250500e-02f, -4.699435420e-02f, -7.988525159e-03f, +3.169877556e-02f, +4.451593900e-02f, +2.574937612e-02f, -6.355814215e-03f, -2.754344226e-02f, -2.603400990e-02f, -8.316727808e-03f, +9.633062975e-03f, +1.599702293e-02f, +1.027918498e-02f, +3.001439006e-04f, -5.934376806e-03f, -5.901372922e-03f, -2.306907516e-03f, +8.882849680e-04f, +1.812135126e-03f, +1.083182822e-03f, +1.580390140e-04f, - +1.946383437e-05f, +2.507083135e-05f, +1.807232852e-06f, -5.057089919e-05f, -9.908437117e-05f, -8.959208158e-05f, +1.217293043e-05f, +1.751005601e-04f, +2.932892410e-04f, +2.390542422e-04f, -3.884562163e-05f, -4.349081821e-04f, -6.980656076e-04f, -5.622843227e-04f, +5.838895299e-05f, +9.321568742e-04f, +1.546728218e-03f, +1.348665889e-03f, +8.035797108e-05f, -1.979090371e-03f, -4.040337745e-03f, -5.131168788e-03f, -4.578708397e-03f, -2.389547080e-03f, +6.943928988e-04f, +3.515924974e-03f, +5.040408874e-03f, +4.828995200e-03f, +3.201943052e-03f, +1.022169247e-03f, -7.626505743e-04f, -1.562449107e-03f, -1.348204232e-03f, -5.470861159e-04f, +2.658826444e-04f, +6.826735565e-04f, +6.182403434e-04f, +2.608383219e-04f, -1.075577770e-04f, -2.902740750e-04f, -2.558267896e-04f, -1.016705850e-04f, +4.359758709e-05f, +1.041471292e-04f, +8.169444519e-05f, +2.540375540e-05f, -1.624621214e-05f, -2.521870143e-05f, - -1.997819080e-05f, -5.902239499e-05f, -5.152445542e-05f, +5.097508111e-05f, +2.007480380e-04f, +2.385701128e-04f, +2.141035931e-05f, -3.834583218e-04f, -6.449391495e-04f, -3.979090191e-04f, +3.699785465e-04f, +1.139220329e-03f, +1.169755890e-03f, +1.586408310e-04f, -1.315601324e-03f, -2.075165918e-03f, -1.276050184e-03f, +7.446799040e-04f, +2.525288040e-03f, +2.560085015e-03f, +5.902221241e-04f, -2.021755815e-03f, -3.270051945e-03f, -2.110929078e-03f, +6.387110148e-04f, +2.905115653e-03f, +2.997878283e-03f, +9.328759901e-04f, -1.643063030e-03f, -2.816067114e-03f, -1.888500953e-03f, +2.129361260e-04f, +1.828080810e-03f, +1.905354028e-03f, +6.844865997e-04f, -7.131923655e-04f, -1.284683345e-03f, -8.520507510e-04f, +7.906233985e-06f, +5.815844655e-04f, +5.753710700e-04f, +1.996906535e-04f, -1.501848820e-04f, -2.477495159e-04f, -1.378560946e-04f, +5.521696940e-06f, +6.494024989e-05f, +4.351565455e-05f, - /* 4,13 (48) */ - -1.399954926e-04f, -5.209029234e-04f, -7.933340555e-04f, -4.544815265e-04f, +7.582929545e-04f, +2.383382579e-03f, +3.175413642e-03f, +1.784652763e-03f, -2.053152338e-03f, -6.633383411e-03f, -8.643930480e-03f, -5.067301772e-03f, +4.237567489e-03f, +1.504221061e-02f, +1.995753143e-02f, +1.251414965e-02f, -7.751907450e-03f, -3.237595922e-02f, -4.582219842e-02f, -3.228637731e-02f, +1.549398355e-02f, +9.018750292e-02f, +1.705132098e-01f, +2.291920925e-01f, +2.447552903e-01f, +2.113496723e-01f, +1.414623692e-01f, +6.013237521e-02f, -6.318378323e-03f, -4.126507130e-02f, -4.318948924e-02f, -2.352264984e-02f, +1.011993314e-03f, +1.696529630e-02f, +1.929579347e-02f, +1.125092225e-02f, +2.492352145e-04f, -7.161694067e-03f, -8.419222618e-03f, -5.019556468e-03f, -3.892286773e-04f, +2.616410104e-03f, +3.072202006e-03f, +1.791901937e-03f, +2.108510936e-04f, -6.814706814e-04f, -7.354042568e-04f, -3.671213681e-04f, - -1.153649871e-04f, +5.125052301e-04f, +1.508082980e-03f, +1.690029190e-03f, -2.729096169e-04f, -4.040956062e-03f, -6.593904801e-03f, -3.980362717e-03f, +4.587662014e-03f, +1.386608626e-02f, +1.493883939e-02f, +2.740123711e-03f, -1.708695496e-02f, -2.944256762e-02f, -2.080898211e-02f, +7.660264021e-03f, +3.705630652e-02f, +4.315162828e-02f, +1.639688878e-02f, -2.717823924e-02f, -5.546116140e-02f, -4.479557353e-02f, -1.694013043e-04f, +4.657120588e-02f, +6.058778724e-02f, +3.129831574e-02f, -1.924504047e-02f, -5.376962901e-02f, -4.863741723e-02f, -1.080459227e-02f, +2.981027461e-02f, +4.472887513e-02f, +2.757745693e-02f, -4.450460187e-03f, -2.685895566e-02f, -2.674720226e-02f, -9.601411153e-03f, +8.781012224e-03f, +1.600492917e-02f, +1.086076945e-02f, +8.755149706e-04f, -5.734686152e-03f, -6.051557804e-03f, -2.554657032e-03f, +7.504288733e-04f, +1.817656823e-03f, +1.148123072e-03f, +2.015546685e-04f, - +1.856640645e-05f, +2.541551119e-05f, +4.268934018e-06f, -4.690290633e-05f, -9.718348809e-05f, -9.278551127e-05f, +3.282499426e-06f, +1.648448594e-04f, +2.897922728e-04f, +2.491507715e-04f, -1.604031493e-05f, -4.109877721e-04f, -6.910422827e-04f, -5.855336396e-04f, +8.068450342e-06f, +8.789479600e-04f, +1.527174191e-03f, +1.392140813e-03f, +1.886513393e-04f, -1.840275841e-03f, -3.930337947e-03f, -5.107037743e-03f, -4.665242587e-03f, -2.563365105e-03f, +4.967594365e-04f, +3.369090678e-03f, +4.995311351e-03f, +4.890527745e-03f, +3.330262345e-03f, +1.155617987e-03f, -6.765567998e-04f, -1.544664201e-03f, -1.384701936e-03f, -6.031742885e-04f, +2.239637995e-04f, +6.715031297e-04f, +6.337052964e-04f, +2.862935634e-04f, -8.872654422e-05f, -2.857102798e-04f, -2.628740404e-04f, -1.122371906e-04f, +3.661966384e-05f, +1.031510331e-04f, +8.468914430e-05f, +2.887242359e-05f, -1.459115580e-05f, -2.549779187e-05f, - -1.752542097e-05f, -5.720976625e-05f, -5.459686724e-05f, +4.202254467e-05f, +1.926898844e-04f, +2.428860696e-04f, +4.266457517e-05f, -3.579848182e-04f, -6.407018084e-04f, -4.312229160e-04f, +3.142690478e-04f, +1.105854670e-03f, +1.199326656e-03f, +2.458698177e-04f, -1.231579914e-03f, -2.069419948e-03f, -1.372261576e-03f, +6.070483377e-04f, +2.453601469e-03f, +2.622762061e-03f, +7.527445461e-04f, -1.879279726e-03f, -3.260645812e-03f, -2.247563083e-03f, +4.576765036e-04f, +2.816590098e-03f, +3.065474889e-03f, +1.098936335e-03f, -1.507053898e-03f, -2.805872340e-03f, -1.997013978e-03f, +7.914526029e-05f, +1.767494544e-03f, +1.947313080e-03f, +7.791577591e-04f, -6.430507441e-04f, -1.281274664e-03f, -8.997806223e-04f, -4.350302225e-05f, +5.625738223e-04f, +5.905744836e-04f, +2.262137482e-04f, -1.348266799e-04f, -2.492864582e-04f, -1.475283405e-04f, -1.564053316e-06f, +6.412929389e-05f, +4.604377184e-05f, - /* 4,14 (48) */ - -1.214290861e-04f, -4.954874122e-04f, -7.890651215e-04f, -5.013844328e-04f, +6.611094664e-04f, +2.290597068e-03f, +3.178696142e-03f, +1.949497623e-03f, -1.763360065e-03f, -6.384232639e-03f, -8.659970795e-03f, -5.478289544e-03f, +3.546525207e-03f, +1.445667697e-02f, +1.996559988e-02f, +1.339309761e-02f, -6.224733259e-03f, -3.098381841e-02f, -4.563354708e-02f, -3.412665315e-02f, +1.156364560e-02f, +8.508046517e-02f, +1.658479672e-01f, +2.266287274e-01f, +2.452520498e-01f, +2.147187630e-01f, +1.464576805e-01f, +6.502290296e-02f, -2.988115978e-03f, -4.010945331e-02f, -4.386604604e-02f, -2.506731404e-02f, -3.727086224e-04f, +1.636212202e-02f, +1.951975726e-02f, +1.192242538e-02f, +8.829405108e-04f, -6.875400504e-03f, -8.507949162e-03f, -5.305266748e-03f, -6.521027177e-04f, +2.504172913e-03f, +3.108821669e-03f, +1.895052970e-03f, +2.955402379e-04f, -6.525982578e-04f, -7.499954126e-04f, -3.926191600e-04f, - -1.328904081e-04f, +4.552954639e-04f, +1.453486113e-03f, +1.732051735e-03f, -8.021973253e-05f, -3.798069993e-03f, -6.551240226e-03f, -4.338347535e-03f, +3.946960206e-03f, +1.343486335e-02f, +1.525310843e-02f, +3.845978381e-03f, -1.588762831e-02f, -2.919669781e-02f, -2.204056203e-02f, +5.590844074e-03f, +3.568404494e-02f, +4.375867662e-02f, +1.885049025e-02f, -2.455547718e-02f, -5.470841685e-02f, -4.667485326e-02f, -3.430047117e-03f, +4.432364280e-02f, +6.104546375e-02f, +3.411490584e-02f, -1.617956558e-02f, -5.267069267e-02f, -5.014447113e-02f, -1.361046461e-02f, +2.781326063e-02f, +4.480802039e-02f, +2.934495148e-02f, -2.503147107e-03f, -2.607979791e-02f, -2.739025301e-02f, -1.088268582e-02f, +7.881231602e-03f, +1.596142614e-02f, +1.142334327e-02f, +1.466089454e-03f, -5.508472404e-03f, -6.186384484e-03f, -2.803943490e-03f, +6.029005328e-04f, +1.816092770e-03f, +1.212252366e-03f, +2.475984404e-04f, - +1.763779865e-05f, +2.564493378e-05f, +6.601447436e-06f, -4.324034279e-05f, -9.506401101e-05f, -9.559884073e-05f, -5.324473980e-06f, +1.544572875e-04f, +2.856253319e-04f, +2.583162013e-04f, +6.203719232e-06f, -3.866306003e-04f, -6.824562554e-04f, -6.067667708e-04f, -4.106534528e-05f, +8.248943874e-04f, +1.504467573e-03f, +1.431258577e-03f, +2.935367743e-04f, -1.701776486e-03f, -3.816679123e-03f, -5.076354457e-03f, -4.745033012e-03f, -2.733284861e-03f, +2.983617596e-04f, +3.217188611e-03f, +4.943187407e-03f, +4.946179436e-03f, +3.456144344e-03f, +1.290524252e-03f, -5.865016042e-04f, -1.522700842e-03f, -1.418716096e-03f, -6.591406331e-04f, +1.804486605e-04f, +6.583392203e-04f, +6.479262746e-04f, +3.116704700e-04f, -6.914107652e-05f, -2.802413978e-04f, -2.694105448e-04f, -1.228295386e-04f, +2.929220594e-05f, +1.018057305e-04f, +8.753816689e-05f, +3.240045182e-05f, -1.279823439e-05f, -2.568494077e-05f, - -1.514649021e-05f, -5.523260112e-05f, -5.726948053e-05f, +3.332559610e-05f, +1.842423113e-04f, +2.461532424e-04f, +6.303458543e-05f, -3.320784716e-04f, -6.344264800e-04f, -4.622457530e-04f, +2.588417395e-04f, +1.069626454e-03f, +1.224490089e-03f, +3.308092521e-04f, -1.144973117e-03f, -2.057262883e-03f, -1.463034725e-03f, +4.689556004e-04f, +2.374936970e-03f, +2.676873833e-03f, +9.120159997e-04f, -1.731605663e-03f, -3.241213287e-03f, -2.377098497e-03f, +2.751886192e-04f, +2.719216202e-03f, +3.123805670e-03f, +1.262369016e-03f, -1.365515110e-03f, -2.786846348e-03f, -2.100287318e-03f, -5.636515345e-05f, +1.700545044e-03f, +1.983672901e-03f, +8.728683017e-04f, -5.695474258e-04f, -1.273601320e-03f, -9.456000801e-04f, -9.604230733e-05f, +5.411178559e-04f, +6.041753047e-04f, +2.528121168e-04f, -1.184039648e-04f, -2.499307227e-04f, -1.570497127e-04f, -9.009032545e-06f, +6.296872165e-05f, +4.849702512e-05f, - /* 4,15 (48) */ - -1.037912875e-04f, -4.698424785e-04f, -7.824636741e-04f, -5.446247756e-04f, +5.660454554e-04f, +2.194998227e-03f, +3.173371668e-03f, +2.103954910e-03f, -1.477734733e-03f, -6.125916438e-03f, -8.653767076e-03f, -5.864920145e-03f, +2.864068951e-03f, +1.384991020e-02f, +1.992453453e-02f, +1.421799200e-02f, -4.720265686e-03f, -2.955255983e-02f, -4.534001030e-02f, -3.582842964e-02f, +7.746966475e-03f, +8.000411071e-02f, +1.611029342e-01f, +2.238954425e-01f, +2.455504115e-01f, +2.179359516e-01f, +1.514008679e-01f, +6.996908239e-02f, +4.680283662e-04f, -3.881892906e-02f, -4.445254764e-02f, -2.659001489e-02f, -1.791424718e-03f, +1.570298138e-02f, +1.970020593e-02f, +1.258076460e-02f, +1.530866785e-03f, -6.563730034e-03f, -8.577090238e-03f, -5.585508145e-03f, -9.215132624e-04f, +2.381343374e-03f, +3.138113875e-03f, +1.996858701e-03f, +3.830784047e-04f, -6.201978060e-04f, -7.627936470e-04f, -4.183041008e-04f, - -1.480368983e-04f, +4.000628628e-04f, +1.396216632e-03f, +1.765377331e-03f, +1.040225788e-04f, -3.551916750e-03f, -6.488205641e-03f, -4.670426006e-03f, +3.312533726e-03f, +1.297261759e-02f, +1.551195017e-02f, +4.915604835e-03f, -1.466313822e-02f, -2.886588855e-02f, -2.318553514e-02f, +3.533581191e-03f, +3.422101022e-02f, +4.422763222e-02f, +2.122542722e-02f, -2.187860335e-02f, -5.379640085e-02f, -4.840645892e-02f, -6.671260404e-03f, +4.194654430e-02f, +6.132065237e-02f, +3.683412204e-02f, -1.305575991e-02f, -5.140832366e-02f, -5.150998624e-02f, -1.639731096e-02f, +2.571297331e-02f, +4.475165524e-02f, +3.104549652e-02f, -5.194742057e-04f, -2.520692960e-02f, -2.795980043e-02f, -1.215628714e-02f, +6.935631522e-03f, +1.586538384e-02f, +1.196446112e-02f, +2.070264759e-03f, -5.255660287e-03f, -6.304788449e-03f, -3.053874213e-03f, +4.458508201e-04f, +1.807083737e-03f, +1.275221087e-03f, +2.960954655e-04f, - +1.668340381e-05f, +2.576330239e-05f, +8.801928510e-06f, -3.959496484e-05f, -9.274027171e-05f, -9.803631935e-05f, -1.363207129e-05f, +1.439707896e-04f, +2.808185262e-04f, +2.665508263e-04f, +2.784242037e-05f, -3.619102752e-04f, -6.723667394e-04f, -6.259781652e-04f, -8.892008168e-05f, +7.701444613e-04f, +1.478734758e-03f, +1.466038086e-03f, +3.948853898e-04f, -1.563829895e-03f, -3.699598995e-03f, -5.039232434e-03f, -4.817997977e-03f, -2.899055761e-03f, +9.950496562e-05f, +3.060435122e-03f, +4.884068303e-03f, +4.995795890e-03f, +3.579339114e-03f, +1.426669522e-03f, -4.925772700e-04f, -1.496506860e-03f, -1.450106209e-03f, -7.148449213e-04f, +1.354085236e-04f, +6.431674293e-04f, +6.608354264e-04f, +3.368996142e-04f, -4.883441716e-05f, -2.738574663e-04f, -2.754029446e-04f, -1.334176747e-04f, +2.162572117e-05f, +1.001032074e-04f, +9.022677896e-05f, +3.597806555e-05f, -1.086809859e-05f, -2.577507531e-05f, - -1.285012779e-05f, -5.310929686e-05f, -5.954958857e-05f, +2.490941987e-05f, +1.754542022e-04f, +2.483969291e-04f, +8.247435647e-05f, -3.058451921e-04f, -6.261909334e-04f, -4.909277589e-04f, +2.038784127e-04f, +1.030716273e-03f, +1.245245151e-03f, +4.132185360e-04f, -1.056102385e-03f, -2.038819890e-03f, -1.548140897e-03f, +3.308495136e-04f, +2.289606150e-03f, +2.722308581e-03f, +1.067547924e-03f, -1.579224448e-03f, -3.211843143e-03f, -2.499132998e-03f, +9.182675706e-05f, +2.613289263e-03f, +3.172656367e-03f, +1.422640286e-03f, -1.218866689e-03f, -2.758983809e-03f, -2.197939940e-03f, -1.931735069e-04f, +1.627372799e-03f, +2.014235506e-03f, +9.652920767e-04f, -4.928695846e-04f, -1.261605930e-03f, -9.893104132e-04f, -1.495552505e-04f, +5.172287092e-04f, +6.160780337e-04f, +2.793890885e-04f, -1.009428352e-04f, -2.496456082e-04f, -1.663740391e-04f, -1.679698635e-05f, +6.144595631e-05f, +5.085810041e-05f, - /* 5, 0 (48) */ - -9.712561017e-05f, +5.630052980e-04f, +1.206067011e-03f, +7.527819647e-04f, -1.206557913e-03f, -3.245991688e-03f, -2.728345499e-03f, +1.489426586e-03f, +6.622324221e-03f, +7.089903931e-03f, -2.805093114e-04f, -1.122619085e-02f, -1.522873798e-02f, -4.406023078e-03f, +1.648289776e-02f, +2.943133839e-02f, +1.647195998e-02f, -2.143009154e-02f, -5.654855430e-02f, -4.868148545e-02f, +2.497919491e-02f, +1.464018327e-01f, +2.604437981e-01f, +3.070623956e-01f, +2.604437981e-01f, +1.464018327e-01f, +2.497919491e-02f, -4.868148545e-02f, -5.654855430e-02f, -2.143009154e-02f, +1.647195998e-02f, +2.943133839e-02f, +1.648289776e-02f, -4.406023078e-03f, -1.522873798e-02f, -1.122619085e-02f, -2.805093114e-04f, +7.089903931e-03f, +6.622324221e-03f, +1.489426586e-03f, -2.728345499e-03f, -3.245991688e-03f, -1.206557913e-03f, +7.527819647e-04f, +1.206067011e-03f, +5.630052980e-04f, -9.712561017e-05f, -2.479949097e-04f, - +5.939400487e-04f, -2.971519080e-04f, -2.102283883e-03f, -2.360885377e-03f, +1.198769271e-03f, +6.225411832e-03f, +5.885033052e-03f, -3.266913899e-03f, -1.360369760e-02f, -1.128997664e-02f, +6.959510654e-03f, +2.424665836e-02f, +1.796260386e-02f, -1.233743150e-02f, -3.690527276e-02f, -2.458115068e-02f, +1.881243249e-02f, +4.916511396e-02f, +2.951026661e-02f, -2.514630357e-02f, -5.812289420e-02f, -3.141212080e-02f, +2.978290985e-02f, +6.141247912e-02f, +2.978290985e-02f, -3.141212080e-02f, -5.812289420e-02f, -2.514630357e-02f, +2.951026661e-02f, +4.916511396e-02f, +1.881243249e-02f, -2.458115068e-02f, -3.690527276e-02f, -1.233743150e-02f, +1.796260386e-02f, +2.424665836e-02f, +6.959510654e-03f, -1.128997664e-02f, -1.360369760e-02f, -3.266913899e-03f, +5.885033052e-03f, +6.225411832e-03f, +1.198769271e-03f, -2.360885377e-03f, -2.102283883e-03f, -2.971519080e-04f, +5.939400487e-04f, +3.757269824e-04f, - -2.508302509e-05f, -5.057785772e-05f, -1.918107920e-05f, +7.614726015e-05f, +1.495424008e-04f, +7.931711402e-05f, -1.459714138e-04f, -3.406750891e-04f, -2.433712429e-04f, +1.983896676e-04f, +6.524107990e-04f, +6.007705035e-04f, -1.502978448e-04f, -1.100700600e-03f, -1.299390585e-03f, -1.772665892e-04f, +1.689680367e-03f, +2.690517210e-03f, +1.332314287e-03f, -2.360472425e-03f, -6.418436176e-03f, -8.056724670e-03f, -5.673724385e-03f, -1.913317227e-04f, +5.398188759e-03f, +8.029841120e-03f, +6.618456882e-03f, +2.632051071e-03f, -1.158478686e-03f, -2.684491539e-03f, -1.796887600e-03f, +6.940613874e-05f, +1.268675429e-03f, +1.145022466e-03f, +2.127596292e-04f, -5.728784120e-04f, -6.688059981e-04f, -2.317208331e-04f, +2.243769326e-04f, +3.453724072e-04f, +1.618744025e-04f, -6.884228518e-05f, -1.503606098e-04f, -8.271393049e-05f, +1.468554497e-05f, +5.074766006e-05f, +2.734599447e-05f, -3.833276021e-06f, - +1.008568569e-05f, +9.639225967e-05f, +1.014076270e-04f, -8.748225870e-05f, -3.212645130e-04f, -2.329728192e-04f, +2.917425243e-04f, +7.442576965e-04f, +4.046105230e-04f, -6.801120963e-04f, -1.372439335e-03f, -5.665968633e-04f, +1.265687754e-03f, +2.132658970e-03f, +6.521483036e-04f, -1.987873747e-03f, -2.875817282e-03f, -6.074058072e-04f, +2.711331088e-03f, +3.420033908e-03f, +4.211150561e-04f, -3.262185724e-03f, -3.617154996e-03f, -1.364461560e-04f, +3.490126337e-03f, +3.411893142e-03f, -1.638129533e-04f, -3.328507442e-03f, -2.864275019e-03f, +3.923144403e-04f, +2.822614710e-03f, +2.124180390e-03f, -4.941334060e-04f, -2.111330779e-03f, -1.371270310e-03f, +4.663515915e-04f, +1.371323979e-03f, +7.501865082e-04f, -3.514638438e-04f, -7.515829083e-04f, -3.304016101e-04f, +2.109512166e-04f, +3.288820696e-04f, +1.041165060e-04f, -9.544071803e-05f, -1.008885095e-04f, -1.481360237e-05f, +2.719430556e-05f, - /* 5, 1 (48) */ - -1.222086353e-04f, +5.124274402e-04f, +1.186885931e-03f, +8.289292249e-04f, -1.057015512e-03f, -3.166674574e-03f, -2.874316912e-03f, +1.148751496e-03f, +6.378952979e-03f, +7.288293598e-03f, +3.719014876e-04f, -1.062542035e-02f, -1.537903583e-02f, -5.506723678e-03f, +1.518350718e-02f, +2.925407180e-02f, +1.816164035e-02f, -1.873957433e-02f, -5.521624002e-02f, -5.104195788e-02f, +1.856075873e-02f, +1.383451080e-01f, +2.547700737e-01f, +3.068710639e-01f, +2.658419868e-01f, +1.544316738e-01f, +3.159765179e-02f, -4.604943438e-02f, -5.770703299e-02f, -2.411458308e-02f, +1.467507238e-02f, +2.950074453e-02f, +1.775157319e-02f, -3.261000612e-03f, -1.501597835e-02f, -1.179906927e-02f, -9.493153096e-04f, +6.858183098e-03f, +6.846701154e-03f, +1.834798993e-03f, -2.566471096e-03f, -3.314833973e-03f, -1.356918523e-03f, +6.700680342e-04f, +1.220752556e-03f, +6.137529580e-04f, -6.977961571e-05f, -2.518281858e-04f, - +6.040257344e-04f, -2.007596483e-04f, -2.000876256e-03f, -2.448367636e-03f, +8.775047576e-04f, +5.992439012e-03f, +6.176775576e-03f, -2.522656203e-03f, -1.319908707e-02f, -1.197008873e-02f, +5.587071319e-03f, +2.368006150e-02f, +1.922829162e-02f, -1.020477253e-02f, -3.625312446e-02f, -2.656902443e-02f, +1.593661521e-02f, +4.855770816e-02f, +3.222159770e-02f, -2.172626967e-02f, -5.770177914e-02f, -3.467430652e-02f, +2.616575485e-02f, +6.127603297e-02f, +3.327303618e-02f, -2.800022766e-02f, -5.828670715e-02f, -2.847481101e-02f, +2.664599159e-02f, +4.955742841e-02f, +2.163504720e-02f, -2.245697029e-02f, -3.739940617e-02f, -1.444876228e-02f, +1.659133356e-02f, +2.471300995e-02f, +8.330834633e-03f, -1.053979013e-02f, -1.395516144e-02f, -4.018496808e-03f, +5.554631442e-03f, +6.436363048e-03f, +1.527651340e-03f, -2.256768871e-03f, -2.197724601e-03f, -3.980404175e-04f, +5.791264463e-04f, +4.029212880e-04f, - -2.281208434e-05f, -5.017048726e-05f, -2.339141928e-05f, +6.951154581e-05f, +1.481249922e-04f, +8.911175882e-05f, -1.299825782e-04f, -3.347647599e-04f, -2.608764580e-04f, +1.651833839e-04f, +6.339296100e-04f, +6.256750450e-04f, -8.879179446e-05f, -1.053316962e-03f, -1.324532268e-03f, -2.818289479e-04f, +1.579065996e-03f, +2.686788922e-03f, +1.496322096e-03f, -2.090629234e-03f, -6.208548452e-03f, -8.066993076e-03f, -5.936404813e-03f, -5.735503789e-04f, +5.110383358e-03f, +7.986246299e-03f, +6.807960120e-03f, +2.904663123e-03f, -9.750973470e-04f, -2.668473744e-03f, -1.900214177e-03f, -4.143284789e-05f, +1.232368496e-03f, +1.186038462e-03f, +2.759575187e-04f, -5.420338332e-04f, -6.829958540e-04f, -2.650454587e-04f, +2.039295517e-04f, +3.488011481e-04f, +1.776211840e-04f, -5.771011145e-05f, -1.505544017e-04f, -8.917830032e-05f, +9.914746689e-06f, +5.066803309e-05f, +2.958766734e-05f, -2.491308441e-06f, - +5.600138690e-06f, +9.158013602e-05f, +1.065180250e-04f, -7.111861119e-05f, -3.123047380e-04f, -2.530462502e-04f, +2.529040111e-04f, +7.335582551e-04f, +4.544147255e-04f, -6.085229571e-04f, -1.367108885e-03f, -6.622257906e-04f, +1.156134388e-03f, +2.143836296e-03f, +8.049429437e-04f, -1.844174763e-03f, -2.915341338e-03f, -8.177702581e-04f, +2.547228180e-03f, +3.495490471e-03f, +6.753471971e-04f, -3.098138979e-03f, -3.727586997e-03f, -4.087067610e-04f, +3.347065450e-03f, +3.546524520e-03f, +9.537642794e-05f, -3.221242552e-03f, -3.005262188e-03f, +1.734621290e-04f, +2.755838884e-03f, +2.252359276e-03f, -3.315766088e-04f, -2.079793499e-03f, -1.472302924e-03f, +3.618865460e-04f, +1.363627926e-03f, +8.183617051e-04f, -2.951538003e-04f, -7.553980289e-04f, -3.686736639e-04f, +1.870303451e-04f, +3.350629867e-04f, +1.209377896e-04f, -8.861192429e-05f, -1.050228857e-04f, -1.976523353e-05f, +2.669965649e-05f, - /* 5, 2 (48) */ - -1.450207196e-04f, +4.622569530e-04f, +1.163494512e-03f, +8.984407707e-04f, -9.088905201e-04f, -3.077562815e-03f, -3.004299491e-03f, +8.139867365e-04f, +6.118076521e-03f, +7.453476982e-03f, +1.005831098e-03f, -9.999745306e-03f, -1.546782762e-02f, -6.560040640e-03f, +1.385897491e-02f, +2.897224286e-02f, +1.974070635e-02f, -1.605278541e-02f, -5.371991792e-02f, -5.313258711e-02f, +1.235221028e-02f, +1.302781149e-01f, +2.488336689e-01f, +3.062975135e-01f, +2.709523702e-01f, +1.624179201e-01f, +3.840561191e-02f, -4.314477126e-02f, -5.868213034e-02f, -2.678305683e-02f, +1.277485821e-02f, +2.945931168e-02f, +1.898394169e-02f, -2.074962149e-03f, -1.474002084e-02f, -1.234110310e-02f, -1.632311164e-03f, +6.593137639e-03f, +7.050630706e-03f, +2.183600141e-03f, -2.388849912e-03f, -3.372544084e-03f, -1.507472925e-03f, +5.808897339e-04f, +1.230667302e-03f, +6.644209911e-04f, -4.019194836e-05f, -2.543194942e-04f, - +6.096258730e-04f, -1.091795123e-04f, -1.894358231e-03f, -2.519486247e-03f, +5.652000196e-04f, +5.739392762e-03f, +6.429679587e-03f, -1.789097948e-03f, -1.274467235e-02f, -1.257861169e-02f, +4.219962434e-03f, +2.301783571e-02f, +2.038442601e-02f, -8.060936232e-03f, -3.544818151e-02f, -2.841319919e-02f, +1.302127387e-02f, +4.773993790e-02f, +3.476882588e-02f, -1.823077919e-02f, -5.702643195e-02f, -3.777244550e-02f, +2.243816785e-02f, +6.086732621e-02f, +3.662010163e-02f, -2.445370314e-02f, -5.819133072e-02f, -3.169605357e-02f, +2.364072940e-02f, +4.973089053e-02f, +2.439088608e-02f, -2.020461102e-02f, -3.773098278e-02f, -1.652855578e-02f, +1.511903063e-02f, +2.507489650e-02f, +9.694462559e-03f, -9.721428422e-03f, -1.425031524e-02f, -4.773894837e-03f, +5.185957778e-03f, +6.623393393e-03f, +1.862714327e-03f, -2.135831082e-03f, -2.286336525e-03f, -5.030633032e-04f, +5.593612128e-04f, +4.296209445e-04f, - -2.054597997e-05f, -4.953813809e-05f, -2.730837028e-05f, +6.283919623e-05f, +1.461354251e-04f, +9.820701606e-05f, -1.139765576e-04f, -3.277004432e-04f, -2.768635425e-04f, +1.322295665e-04f, +6.134870589e-04f, +6.475693674e-04f, -2.845238567e-05f, -1.003121559e-03f, -1.344138791e-03f, -3.827926075e-04f, +1.465518940e-03f, +2.673570778e-03f, +1.650254353e-03f, -1.823208447e-03f, -5.989464080e-03f, -8.060786240e-03f, -6.185680776e-03f, -9.544359400e-04f, +4.810928188e-03f, +7.925888400e-03f, +6.986317469e-03f, +3.177593401e-03f, -7.824862200e-04f, -2.642252808e-03f, -1.999189150e-03f, -1.549126151e-04f, +1.190471988e-03f, +1.223511463e-03f, +3.396638220e-04f, -5.082843731e-04f, -6.948668979e-04f, -2.982287329e-04f, +1.820721445e-04f, +3.509095356e-04f, +1.931399588e-04f, -4.594707460e-05f, -1.501005583e-04f, -9.550639630e-05f, +4.880361657e-06f, +5.032793323e-05f, +3.179425506e-05f, -1.040985477e-06f, - +1.373031687e-06f, +8.649795645e-05f, +1.107821223e-04f, -5.510432378e-05f, -3.021011351e-04f, -2.711345839e-04f, +2.140883933e-04f, +7.196339889e-04f, +5.007186730e-04f, -5.358023371e-04f, -1.355496472e-03f, -7.528718237e-04f, +1.043198748e-03f, +2.144969009e-03f, +9.518731857e-04f, -1.693845381e-03f, -2.941147774e-03f, -1.022472742e-03f, +2.372811083e-03f, +3.554623527e-03f, +9.253463350e-04f, -2.920555137e-03f, -3.820937052e-03f, -6.790752835e-04f, +3.188613303e-03f, +3.665412401e-03f, +3.552563934e-04f, -3.098647428e-03f, -3.133546031e-03f, -4.815868112e-05f, +2.675661381e-03f, +2.371705449e-03f, -1.651875793e-04f, -2.038037948e-03f, -1.568218952e-03f, +2.536268595e-04f, +1.349246533e-03f, +8.842539332e-04f, -2.358804181e-04f, -7.555818373e-04f, -4.063467844e-04f, +1.612711930e-04f, +3.397174985e-04f, +1.378580622e-04f, -8.092094178e-05f, -1.087495025e-04f, -2.491934601e-05f, +2.594761520e-05f, - /* 5, 3 (48) */ - -1.655666996e-04f, +4.127188149e-04f, +1.136186142e-03f, +9.612799669e-04f, -7.627550950e-04f, -2.979355799e-03f, -3.118276048e-03f, +4.862862933e-04f, +5.841212978e-03f, +7.585706549e-03f, +1.619318156e-03f, -9.352175938e-03f, -1.549628001e-02f, -7.563162199e-03f, +1.251483612e-02f, +2.858945025e-02f, +2.120622529e-02f, -1.337921463e-02f, -5.206966357e-02f, -5.495579556e-02f, +6.362746202e-03f, +1.222173287e-01f, +2.426479881e-01f, +3.053430776e-01f, +2.757632984e-01f, +1.703438085e-01f, +4.539192938e-02f, -3.996717785e-02f, -5.946461656e-02f, -2.942530964e-02f, +1.077566906e-02f, +2.930439907e-02f, +2.017441367e-02f, -8.514506861e-04f, -1.440035701e-02f, -1.284938747e-02f, -2.327178061e-03f, +6.294908906e-03f, +7.232702850e-03f, +2.534509676e-03f, -2.195709953e-03f, -3.418491159e-03f, -1.657573483e-03f, +4.853833376e-04f, +1.235547664e-03f, +7.147489243e-04f, -8.397693308e-06f, -2.553604797e-04f, - +6.109989047e-04f, -2.268155584e-05f, -1.783576109e-03f, -2.574590571e-03f, +2.630988845e-04f, +5.468258178e-03f, +6.643767981e-03f, -1.069463959e-03f, -1.224395368e-02f, -1.311441403e-02f, +2.864465963e-03f, +2.226496388e-02f, +2.142762475e-02f, -5.915967223e-03f, -3.449630833e-02f, -3.010704457e-02f, +1.008012610e-02f, +4.671746516e-02f, +3.714163696e-02f, -1.467615567e-02f, -5.610108561e-02f, -4.069300064e-02f, +1.861723080e-02f, +6.018825092e-02f, +3.980871493e-02f, -2.078829074e-02f, -5.783607433e-02f, -3.479470099e-02f, +2.050718337e-02f, +4.968273185e-02f, +2.706654746e-02f, -1.783290557e-02f, -3.789617035e-02f, -1.856659372e-02f, +1.355081168e-02f, +2.532852336e-02f, +1.104370909e-02f, -8.837174489e-03f, -1.448619566e-02f, -5.529476674e-03f, +4.779610994e-03f, +6.784664586e-03f, +2.202431825e-03f, -1.997973020e-03f, -2.367257467e-03f, -6.118128057e-04f, +5.344418668e-04f, +4.555685597e-04f, - -1.829695311e-05f, -4.869403775e-05f, -3.092545234e-05f, +5.616164946e-05f, +1.436023867e-04f, +1.065872949e-04f, -9.802006855e-05f, -3.195442804e-04f, -2.913103906e-04f, +9.965154298e-05f, +5.912124291e-04f, +6.664430018e-04f, +3.051880904e-05f, -9.503692440e-04f, -1.358267912e-03f, -4.798765786e-04f, +1.349512981e-03f, +2.651151527e-03f, +1.793897867e-03f, -1.558880023e-03f, -5.761871190e-03f, -8.038287157e-03f, -6.421040627e-03f, -1.333103914e-03f, +4.500476158e-03f, +7.848760342e-03f, +7.152924603e-03f, +3.450115621e-03f, -5.809946439e-04f, -2.605646011e-03f, -2.093345793e-03f, -2.706780347e-04f, +1.143009043e-03f, +1.257212371e-03f, +4.036434917e-04f, -4.716902823e-04f, -7.043121473e-04f, -3.311329249e-04f, +1.588547770e-04f, +3.516499085e-04f, +2.083577617e-04f, -3.358328975e-05f, -1.489780312e-04f, -1.016636668e-04f, -4.041819234e-07f, +4.971722257e-05f, +3.395156363e-05f, +5.143564259e-07f, - -2.582138931e-06f, +8.119107346e-05f, +1.142147107e-04f, -3.951307321e-05f, -2.907553767e-04f, -2.872126999e-04f, +1.754917821e-04f, +7.026467049e-04f, +5.433862206e-04f, -4.623303147e-04f, -1.337793488e-03f, -8.381997143e-04f, +9.274757092e-04f, +2.136210154e-03f, +1.092331806e-03f, -1.537670045e-03f, -2.953263164e-03f, -1.220613385e-03f, +2.188967178e-03f, +3.597258120e-03f, +1.169974583e-03f, -2.730297901e-03f, -3.896801234e-03f, -9.463004484e-04f, +3.015484417e-03f, +3.767961988e-03f, +6.146219611e-04f, -2.961205417e-03f, -3.248435191e-03f, -2.715336861e-04f, +2.582319918e-03f, +2.481548241e-03f, +4.295809510e-06f, -1.986104763e-03f, -1.658467293e-03f, +1.420245927e-04f, +1.328106554e-03f, +9.474821865e-04f, -1.738640922e-04f, -7.520287966e-04f, -4.432058116e-04f, +1.337468773e-04f, +3.427611766e-04f, +1.547851520e-04f, -7.237274682e-05f, -1.120228962e-04f, -3.025215391e-05f, +2.492684353e-05f, - /* 5, 4 (48) */ - -1.838636527e-04f, +3.640247771e-04f, +1.105260690e-03f, +1.017441616e-03f, -6.191527084e-04f, -2.872768504e-03f, -3.216296117e-03f, +1.667420129e-04f, +5.549902587e-03f, +7.685358092e-03f, +2.210530586e-03f, -8.685732937e-03f, -1.546576120e-02f, -8.513531443e-03f, +1.115656820e-02f, +2.810957367e-02f, +2.255573827e-02f, -1.072806311e-02f, -5.027576570e-02f, -5.651467558e-02f, +6.008750117e-04f, +1.141790415e-01f, +2.362269475e-01f, +3.040099737e-01f, +2.802637745e-01f, +1.781925688e-01f, +5.254485398e-02f, -3.651706223e-02f, -6.004561120e-02f, -3.203095565e-02f, +8.682323264e-03f, +2.903372103e-02f, +2.131742272e-02f, +4.057616846e-04f, -1.399671352e-02f, -1.332107775e-02f, -3.031490209e-03f, +5.963775981e-03f, +7.391557627e-03f, +2.886159585e-03f, -1.987352192e-03f, -3.452074449e-03f, -1.806551514e-03f, +3.837196708e-04f, +1.235143482e-03f, +7.644661469e-04f, +2.555387032e-05f, -2.548461232e-04f, - +6.084167658e-04f, +5.850951761e-05f, -1.669361398e-03f, -2.614103644e-03f, -2.765649223e-05f, +5.181045478e-03f, +6.819259763e-03f, -3.668172540e-04f, -1.170056746e-02f, -1.357674434e-02f, +1.526672475e-03f, +2.142676417e-02f, +2.235510046e-02f, -3.779757068e-03f, -3.340397652e-02f, -3.164471462e-02f, +7.126862931e-03f, +4.549685177e-02f, +3.933060414e-02f, -1.107889755e-02f, -5.493111103e-02f, -4.342329854e-02f, +1.472042957e-02f, +5.924195048e-02f, +4.282419935e-02f, -1.702032875e-02f, -5.722145237e-02f, -3.775590641e-02f, +1.725874818e-02f, +4.941119817e-02f, +2.964886738e-02f, -1.535135733e-02f, -3.789187454e-02f, -2.055269849e-02f, +1.189234439e-02f, +2.547054795e-02f, +1.237181565e-02f, -7.889692302e-03f, -1.466005975e-02f, -6.281505470e-03f, +4.336405182e-03f, +6.918411464e-03f, +2.545193002e-03f, -1.843187868e-03f, -2.439630214e-03f, -7.238357019e-04f, +5.041897128e-04f, +4.804954032e-04f, - -1.607663367e-05f, -4.765196158e-05f, -3.423787293e-05f, +4.950925812e-05f, +1.405560294e-04f, +1.142405788e-04f, -8.217765240e-05f, -3.103611873e-04f, -3.042017402e-04f, +6.756799030e-05f, +5.672390375e-04f, +6.822974410e-04f, +8.793011604e-05f, -8.953186611e-04f, -1.366996215e-03f, -5.728200767e-04f, +1.231519640e-03f, +2.619843217e-03f, +1.927074180e-03f, -1.298295096e-03f, -5.526473475e-03f, -7.999721116e-03f, -6.642011674e-03f, -1.708676149e-03f, +4.179711288e-03f, +7.754900054e-03f, +7.307203285e-03f, +3.721494474e-03f, -3.710047202e-04f, -2.558499992e-03f, -2.182223262e-03f, -3.883575103e-04f, +1.090024104e-03f, +1.286921163e-03f, +4.676548732e-04f, -4.323245107e-04f, -7.112316931e-04f, -3.636178797e-04f, +1.343345090e-04f, +3.509790369e-04f, +2.232007484e-04f, -2.065247933e-05f, -1.471681076e-04f, -1.076151274e-04f, -5.923709862e-06f, +4.882675536e-05f, +3.604505625e-05f, +2.170594329e-06f, - -6.254422861e-06f, +7.570410508e-05f, +1.168348903e-04f, -2.441321203e-05f, -2.783717331e-04f, -3.012670491e-04f, +1.373032065e-04f, +6.827694336e-04f, +5.823030335e-04f, -3.884819314e-04f, -1.314217345e-03f, -9.179066134e-04f, +8.095634262e-04f, +2.117758113e-03f, +1.225750979e-03f, -1.376451619e-03f, -2.951778960e-03f, -1.411331538e-03f, +1.996621844e-03f, +3.623298329e-03f, +1.408124574e-03f, -2.528288105e-03f, -3.954858788e-03f, -1.209146098e-03f, +2.828463513e-03f, +3.853654204e-03f, +8.722656489e-04f, -2.809473102e-03f, -3.349297257e-03f, -4.956314854e-04f, +2.476117843e-03f, +2.581254969e-03f, +1.761107648e-04f, -1.924084932e-03f, -1.742515420e-03f, +2.755693267e-05f, +1.300167151e-03f, +1.007670250e-03f, -1.093449204e-04f, -7.446500392e-04f, -4.790334108e-04f, +1.045426173e-04f, +3.441156022e-04f, +1.716231578e-04f, -6.297778107e-05f, -1.147983424e-04f, -3.573736284e-05f, +2.362740894e-05f, - /* 5, 5 (48) */ - -1.999402864e-04f, +3.163728156e-04f, +1.071022817e-03f, +1.066950874e-03f, -4.785966790e-04f, -2.758527925e-03f, -3.298473769e-03f, -1.436191744e-04f, +5.245700847e-03f, +7.752926082e-03f, +2.777769623e-03f, -8.003435496e-03f, -1.537783108e-02f, -9.408850104e-03f, +9.789571990e-03f, +2.753675359e-02f, +2.378725791e-02f, -8.108219891e-03f, -4.834869152e-02f, -5.781297067e-02f, -4.925598463e-03f, +1.061793204e-01f, +2.295849358e-01f, +3.023012975e-01f, +2.844434858e-01f, +1.859474689e-01f, +5.985205727e-02f, -3.279556776e-02f, -6.041661592e-02f, -3.458945564e-02f, +6.500100002e-03f, +2.864536352e-02f, +2.240744682e-02f, +1.692682847e-03f, -1.352905865e-02f, -1.375340227e-02f, -3.742721902e-03f, +5.600158101e-03f, +7.525892136e-03f, +3.237138622e-03f, -1.764151443e-03f, -3.472726928e-03f, -1.953719622e-03f, +2.761045433e-04f, +1.229219772e-03f, +8.132929023e-04f, +6.159892657e-05f, -2.526755289e-04f, - +6.021623429e-04f, +1.342136227e-04f, -1.552526508e-03f, -2.638516856e-03f, -3.060282253e-04f, +4.879778429e-03f, +6.956562969e-03f, +3.159521796e-04f, -1.111826442e-02f, -1.396522627e-02f, +2.124551303e-04f, +2.050885756e-02f, +2.316466389e-02f, -1.661998956e-03f, -3.217822554e-02f, -3.302116624e-02f, +4.175083971e-03f, +4.408552023e-02f, +4.132722598e-02f, -7.455599217e-03f, -5.352298645e-02f, -4.595158665e-02f, +1.076557078e-02f, +5.803280438e-02f, +4.565266287e-02f, -1.316667454e-02f, -5.634918672e-02f, -4.056537951e-02f, +1.390945093e-02f, +4.891556668e-02f, +3.212498523e-02f, -1.277010236e-02f, -3.771576378e-02f, -2.247678342e-02f, +1.014982897e-02f, +2.549810488e-02f, +1.367198280e-02f, -6.882022052e-03f, -1.476940467e-02f, -7.026155510e-03f, +3.857371771e-03f, +7.022954081e-03f, +2.889308604e-03f, -1.671564710e-03f, -2.502607995e-03f, -8.386340443e-04f, +4.684523500e-04f, +5.041228121e-04f, - -1.389600048e-05f, -4.642614253e-05f, -3.724249168e-05f, +4.291118337e-05f, +1.370277891e-04f, +1.211583726e-04f, -6.651145955e-05f, -3.002185076e-04f, -3.155290602e-04f, +3.609256965e-05f, +5.417036090e-04f, +6.951458607e-04f, +1.436002750e-04f, -8.382311887e-04f, -1.370418431e-03f, -6.613830285e-04f, +1.112006636e-03f, +2.579979786e-03f, +2.049639612e-03f, -1.042084238e-03f, -5.283987960e-03f, -7.945354762e-03f, -6.848161398e-03f, -2.080283344e-03f, +3.849346823e-03f, +7.644390604e-03f, +7.448603302e-03f, +3.990987763e-03f, -1.529305739e-04f, -2.500691732e-03f, -2.265368269e-03f, -5.075639558e-04f, +1.031583203e-03f, +1.312427929e-03f, +5.314504956e-04f, -3.902727112e-04f, -7.155332732e-04f, -3.955415343e-04f, +1.085753362e-04f, +3.488584262e-04f, +2.375944924e-04f, -7.191930005e-06f, -1.446545704e-04f, -1.133255133e-04f, -1.166131574e-05f, +4.764846214e-05f, +3.805991974e-05f, +3.922811791e-06f, - -9.635371862e-06f, +7.008068125e-05f, +1.186657797e-04f, -9.867568066e-06f, -2.650563955e-04f, -3.132953637e-04f, +9.970380601e-05f, +6.601852187e-04f, +6.173766457e-04f, -3.146253892e-04f, -1.285009845e-03f, -9.917229840e-04f, +6.900603119e-04f, +2.089854939e-03f, +1.351604527e-03f, -1.211007247e-03f, -2.936850373e-03f, -1.593809598e-03f, +1.796733710e-03f, +3.632727262e-03f, +1.638724650e-03f, -2.315499119e-03f, -3.994873537e-03f, -1.466397133e-03f, +2.628401821e-03f, +3.922048391e-03f, +1.126983296e-03f, -2.644077995e-03f, -3.435562247e-03f, -7.194084680e-04f, +2.357423304e-03f, +2.670234486e-03f, +3.494730274e-04f, -1.852120081e-03f, -1.819852361e-03f, -8.927577200e-05f, +1.265420760e-03f, +1.064448760e-03f, -4.258191508e-05f, -7.333742859e-04f, -5.136111991e-04f, +7.375563930e-05f, +3.437090248e-04f, +1.882728830e-04f, -5.275210890e-05f, -1.170321815e-04f, -4.134623355e-05f, +2.204093044e-05f, - /* 5, 6 (48) */ - -2.138362868e-04f, +2.699466730e-04f, +1.033780325e-03f, +1.109862058e-03f, -3.415688898e-04f, -2.637369552e-03f, -3.364985229e-03f, -4.438376820e-04f, +4.930171787e-03f, +7.789018652e-03f, +3.319473232e-03f, -7.308289635e-03f, -1.523423081e-02f, -1.024708129e-02f, +8.419153559e-03f, +2.687537056e-02f, +2.489926454e-02f, -5.528240104e-03f, -4.629905191e-02f, -5.885505491e-02f, -1.020958642e-02f, +9.823396566e-02f, +2.227367744e-01f, +3.002210142e-01f, +2.882928326e-01f, +1.935918595e-01f, +6.730066057e-02f, -2.880458000e-02f, -6.056954650e-02f, -3.709014737e-02f, +4.234731733e-03f, +2.813779957e-02f, +2.343903002e-02f, +3.005110776e-03f, -1.299760815e-02f, -1.414367498e-02f, -4.458255175e-03f, +5.204616567e-03f, +7.634467472e-03f, +3.585997048e-03f, -1.526556951e-03f, -3.479918858e-03f, -2.098374192e-03f, +1.627790300e-04f, +1.217558456e-03f, +8.609413644e-04f, +9.965884631e-05f, -2.487527171e-04f, - +5.925269711e-04f, +2.042943039e-04f, -1.433860728e-03f, -2.648384424e-03f, -5.710846208e-04f, +4.566483066e-03f, +7.056266775e-03f, +9.761373983e-04f, -1.050088778e-02f, -1.427985166e-02f, -1.072554714e-03f, +1.951713457e-02f, +2.385472420e-02f, +4.278559834e-04f, -3.082662102e-02f, -3.423217348e-02f, +1.238233598e-03f, +4.249171064e-02f, +4.312395969e-02f, -3.822871955e-03f, -5.188426180e-02f, -4.826708576e-02f, +6.770697241e-03f, +5.656640725e-02f, +4.828106469e-02f, -9.244626154e-03f, -5.522220343e-02f, -4.320945751e-02f, +1.047388868e-02f, +4.819615821e-02f, +3.448240853e-02f, -1.009986787e-02f, -3.736629075e-02f, -2.432890350e-02f, +8.329976605e-03f, +2.540882911e-02f, +1.493740356e-02f, -5.817573292e-03f, -1.481198659e-02f, -7.759529796e-03f, +3.343760572e-03f, +7.096709720e-03f, +3.233017629e-03f, -1.483291827e-03f, -2.555360104e-03f, -9.556662258e-04f, +4.271061165e-04f, +5.261637426e-04f, - -1.176534634e-05f, -4.503118166e-05f, -3.993777832e-05f, +3.639529768e-05f, +1.330502028e-04f, +1.273356352e-04f, -5.108105047e-05f, -2.891856649e-04f, -3.252904120e-04f, +5.333590443e-06f, +5.147456527e-04f, +7.050127996e-04f, +1.973589024e-04f, -7.793699012e-04f, -1.368646705e-03f, -7.453464948e-04f, +9.914363706e-04f, +2.531915604e-03f, +2.161485201e-03f, -7.908557901e-04f, -5.035142753e-03f, -7.875495044e-03f, -7.039098547e-03f, -2.447067529e-03f, +3.510123255e-03f, +7.517360200e-03f, +7.576604323e-03f, +4.257848572e-03f, +7.278250009e-05f, -2.432129444e-03f, -2.342336748e-03f, -6.278958467e-04f, +9.677741847e-04f, +1.333533885e-03f, +5.947779018e-04f, -3.456331944e-04f, -7.171328272e-04f, -4.267604542e-04f, +8.164810093e-05f, +3.452546102e-04f, +2.514642936e-04f, +6.757567778e-06f, -1.414238512e-04f, -1.187594373e-04f, -1.759838370e-05f, +4.617543122e-05f, +3.998113491e-05f, +5.765296115e-06f, - -1.271898053e-05f, +6.436320670e-05f, +1.197342126e-04f, +4.066716365e-06f, -2.509168103e-04f, -3.233063110e-04f, +6.286608877e-05f, +6.350858861e-04f, +6.485364007e-04f, -2.411203233e-04f, -1.250435457e-03f, -1.059413327e-03f, +5.695620628e-04f, +2.052784506e-03f, +1.469409935e-03f, -1.042164199e-03f, -2.908694961e-03f, -1.767276576e-03f, +1.590289783e-03f, +3.625606667e-03f, +1.860743862e-03f, -2.092951993e-03f, -4.016694866e-03f, -1.716865348e-03f, +2.416213044e-03f, +3.972784618e-03f, +1.377579891e-03f, -2.465715883e-03f, -3.506725792e-03f, -9.418137984e-04f, +2.226668070e-03f, +2.747940555e-03f, +5.235804775e-04f, -1.770402507e-03f, -1.889991623e-03f, -2.079521297e-04f, +1.223893792e-03f, +1.117457274e-03f, +2.614790518e-05f, -7.181486913e-04f, -5.467209090e-04f, +4.149500913e-05f, +3.414770032e-04f, +2.046323028e-04f, -4.171754544e-05f, -1.186821501e-04f, -4.704766528e-05f, +2.016071959e-05f, - /* 5, 7 (48) */ - -2.256016332e-04f, +2.249154914e-04f, +9.938425466e-04f, +1.146257356e-03f, -2.085186870e-04f, -2.510033917e-03f, -3.416066279e-03f, -7.330233469e-04f, +4.604881375e-03f, +7.794352242e-03f, +3.834218885e-03f, -6.603276835e-03f, -1.503687191e-02f, -1.102645119e-02f, +7.050506854e-03f, +2.613002407e-02f, +2.589070091e-02f, -2.996324500e-03f, -4.413756671e-02f, -5.964591070e-02f, -1.524472918e-02f, +9.035847061e-02f, +2.156976758e-01f, +2.977739466e-01f, +2.918029559e-01f, +2.011092197e-01f, +7.487726489e-02f, -2.454673142e-02f, -6.049676400e-02f, -3.952227682e-02f, +1.892394985e-03f, +2.750990372e-02f, +2.440680421e-02f, +4.338644661e-03f, -1.240283025e-02f, -1.448930817e-02f, -5.175388002e-03f, +4.777856113e-03f, +7.716115573e-03f, +3.931251658e-03f, -1.275092657e-03f, -3.473161290e-03f, -2.239798043e-03f, +4.401959277e-05f, +1.199960073e-03f, +9.071167956e-04f, +1.396399812e-04f, -2.429874210e-04f, - +5.798079906e-04f, +2.686575106e-04f, -1.314126515e-03f, -2.644317708e-03f, -8.220014310e-04f, +4.243176755e-03f, +7.119132864e-03f, +1.611223284e-03f, -9.852351375e-03f, -1.452097198e-02f, -2.322990171e-03f, +1.845772125e-02f, +2.442428626e-02f, +2.480640490e-03f, -2.935721108e-02f, -3.527433768e-02f, -1.670461363e-03f, +4.072443406e-02f, +4.471424948e-02f, -1.972652877e-04f, -5.002351794e-02f, -5.036003776e-02f, +2.754002374e-03f, +5.484954190e-02f, +5.069727773e-02f, -5.271841536e-03f, -5.384462353e-02f, -4.567517339e-02f, +6.967162887e-03f, +4.725434442e-02f, +3.670907660e-02f, -7.351927317e-03f, -3.684271028e-02f, -2.609930601e-02f, +6.439984982e-03f, +2.520087698e-02f, +1.616129735e-02f, -4.700116019e-03f, -1.478583868e-02f, -8.477678487e-03f, +2.797039663e-03f, +7.138204729e-03f, +3.574494632e-03f, -1.278659524e-03f, -2.597077649e-03f, -1.074348376e-03f, +3.800584512e-04f, +5.463244622e-04f, - -9.694247817e-06f, -4.348195976e-05f, -4.232376407e-05f, +2.998809673e-05f, +1.286567263e-04f, +1.327706987e-04f, -3.594321318e-05f, -2.773338142e-04f, -3.334902885e-04f, -2.460629603e-05f, +4.865068398e-04f, +7.119338031e-04f, +2.490469033e-04f, -7.189985418e-04f, -1.361809822e-03f, -8.245130117e-04f, +8.702644658e-04f, +2.476023961e-03f, +2.262536517e-03f, -5.451942925e-04f, -4.780674772e-03f, -7.790488041e-03f, -7.214474091e-03f, -2.808184507e-03f, +3.162806250e-03f, +7.373982052e-03f, +7.690717676e-03f, +4.521327475e-03f, +3.056590003e-04f, -2.352753376e-03f, -2.412695524e-03f, -7.489383407e-04f, +8.987068488e-04f, +1.350052371e-03f, +6.573805153e-04f, -2.985168311e-04f, -7.159550299e-04f, -4.571303882e-04f, +5.363037253e-05f, +3.401394283e-04f, +2.647354962e-04f, +2.115179771e-05f, -1.374651753e-04f, -1.238815535e-04f, -2.371462048e-05f, +4.440198691e-05f, +4.179355039e-05f, +7.691540014e-06f, - -1.550161284e-05f, +5.859264138e-05f, +1.200704223e-04f, +1.733830566e-05f, -2.360610272e-04f, -3.313190975e-04f, +2.695325785e-05f, +6.076707952e-04f, +6.757332781e-04f, -1.683161561e-04f, -1.210779515e-03f, -1.120776721e-03f, +4.486587473e-04f, +2.006870463e-03f, +1.578730122e-03f, -8.707557173e-04f, -2.867590910e-03f, -1.931011420e-03f, +1.378300460e-03f, +3.602076150e-03f, +2.073196738e-03f, -1.861710401e-03f, -4.020258295e-03f, -1.959395137e-03f, +2.192869030e-03f, +4.005585615e-03f, +1.622875376e-03f, -2.275147812e-03f, -3.562352025e-03f, -1.161794479e-03f, +2.084346041e-03f, +2.813875044e-03f, +6.976168748e-04f, -1.679174953e-03f, -1.952474029e-03f, -3.279319705e-04f, +1.175647175e-03f, +1.166346332e-03f, +9.655054157e-05f, -6.989396102e-04f, -5.781455835e-04f, +7.881392525e-06f, +3.373630248e-04f, +2.205970658e-04f, -2.990175319e-05f, -1.197077173e-04f, -5.280829914e-05f, +1.798191556e-05f, - /* 5, 8 (48) */ - -2.352958810e-04f, +1.814335316e-04f, +9.515187825e-04f, +1.176245452e-03f, -7.986196071e-05f, -2.377263219e-03f, -3.452009492e-03f, -1.010357161e-03f, +4.271391087e-03f, +7.769745946e-03f, +4.320725725e-03f, -5.891343032e-03f, -1.478782500e-02f, -1.174544974e-02f, +5.688697032e-03f, +2.530551106e-02f, +2.676096538e-02f, -5.203005390e-04f, -4.187503019e-02f, -6.019110499e-02f, -2.002540395e-02f, +8.256798257e-02f, +2.084832017e-01f, +2.949657621e-01f, +2.949657621e-01f, +2.084832017e-01f, +8.256798257e-02f, -2.002540395e-02f, -6.019110499e-02f, -4.187503019e-02f, -5.203005390e-04f, +2.676096538e-02f, +2.530551106e-02f, +5.688697032e-03f, -1.174544974e-02f, -1.478782500e-02f, -5.891343032e-03f, +4.320725725e-03f, +7.769745946e-03f, +4.271391087e-03f, -1.010357161e-03f, -3.452009492e-03f, -2.377263219e-03f, -7.986196071e-05f, +1.176245452e-03f, +9.515187825e-04f, +1.814335316e-04f, -2.352958810e-04f, - +5.643063777e-04f, +3.272501520e-04f, -1.194056093e-03f, -2.626979402e-03f, -1.058062458e-03f, +3.911857657e-03f, +7.146086122e-03f, +2.218894080e-03f, -9.176618097e-03f, -1.468928814e-02f, -3.533769686e-03f, +1.733694452e-02f, +2.487294501e-02f, +4.487510953e-03f, -2.777848096e-02f, -3.614509340e-02f, -4.538052273e-03f, +3.879342264e-02f, +4.609254994e-02f, +3.404810862e-03f, -4.795032120e-02f, -5.222174816e-02f, -1.266255920e-03f, +5.289014676e-02f, +5.289014676e-02f, -1.266255920e-03f, -5.222174816e-02f, -4.795032120e-02f, +3.404810862e-03f, +4.609254994e-02f, +3.879342264e-02f, -4.538052273e-03f, -3.614509340e-02f, -2.777848096e-02f, +4.487510953e-03f, +2.487294501e-02f, +1.733694452e-02f, -3.533769686e-03f, -1.468928814e-02f, -9.176618097e-03f, +2.218894080e-03f, +7.146086122e-03f, +3.911857657e-03f, -1.058062458e-03f, -2.626979402e-03f, -1.194056093e-03f, +3.272501520e-04f, +5.643063777e-04f, - -7.691540014e-06f, -4.179355039e-05f, -4.440198691e-05f, +2.371462048e-05f, +1.238815535e-04f, +1.374651753e-04f, -2.115179771e-05f, -2.647354962e-04f, -3.401394283e-04f, -5.363037253e-05f, +4.571303882e-04f, +7.159550299e-04f, +2.985168311e-04f, -6.573805153e-04f, -1.350052371e-03f, -8.987068488e-04f, +7.489383407e-04f, +2.412695524e-03f, +2.352753376e-03f, -3.056590003e-04f, -4.521327475e-03f, -7.690717676e-03f, -7.373982052e-03f, -3.162806250e-03f, +2.808184507e-03f, +7.214474091e-03f, +7.790488041e-03f, +4.780674772e-03f, +5.451942925e-04f, -2.262536517e-03f, -2.476023961e-03f, -8.702644658e-04f, +8.245130117e-04f, +1.361809822e-03f, +7.189985418e-04f, -2.490469033e-04f, -7.119338031e-04f, -4.865068398e-04f, +2.460629603e-05f, +3.334902885e-04f, +2.773338142e-04f, +3.594321318e-05f, -1.327706987e-04f, -1.286567263e-04f, -2.998809673e-05f, +4.232376407e-05f, +4.348195976e-05f, +9.694247817e-06f, - -1.798191556e-05f, +5.280829914e-05f, +1.197077173e-04f, +2.990175319e-05f, -2.205970658e-04f, -3.373630248e-04f, -7.881392525e-06f, +5.781455835e-04f, +6.989396102e-04f, -9.655054157e-05f, -1.166346332e-03f, -1.175647175e-03f, +3.279319705e-04f, +1.952474029e-03f, +1.679174953e-03f, -6.976168748e-04f, -2.813875044e-03f, -2.084346041e-03f, +1.161794479e-03f, +3.562352025e-03f, +2.275147812e-03f, -1.622875376e-03f, -4.005585615e-03f, -2.192869030e-03f, +1.959395137e-03f, +4.020258295e-03f, +1.861710401e-03f, -2.073196738e-03f, -3.602076150e-03f, -1.378300460e-03f, +1.931011420e-03f, +2.867590910e-03f, +8.707557173e-04f, -1.578730122e-03f, -2.006870463e-03f, -4.486587473e-04f, +1.120776721e-03f, +1.210779515e-03f, +1.683161561e-04f, -6.757332781e-04f, -6.076707952e-04f, -2.695325785e-05f, +3.313190975e-04f, +2.360610272e-04f, -1.733830566e-05f, -1.200704223e-04f, -5.859264138e-05f, +1.550161284e-05f, - /* 5, 9 (48) */ - -2.429874210e-04f, +1.396399812e-04f, +9.071167956e-04f, +1.199960073e-03f, +4.401959277e-05f, -2.239798043e-03f, -3.473161290e-03f, -1.275092657e-03f, +3.931251658e-03f, +7.716115573e-03f, +4.777856113e-03f, -5.175388002e-03f, -1.448930817e-02f, -1.240283025e-02f, +4.338644661e-03f, +2.440680421e-02f, +2.750990372e-02f, +1.892394985e-03f, -3.952227682e-02f, -6.049676400e-02f, -2.454673142e-02f, +7.487726489e-02f, +2.011092197e-01f, +2.918029559e-01f, +2.977739466e-01f, +2.156976758e-01f, +9.035847061e-02f, -1.524472918e-02f, -5.964591070e-02f, -4.413756671e-02f, -2.996324500e-03f, +2.589070091e-02f, +2.613002407e-02f, +7.050506854e-03f, -1.102645119e-02f, -1.503687191e-02f, -6.603276835e-03f, +3.834218885e-03f, +7.794352242e-03f, +4.604881375e-03f, -7.330233469e-04f, -3.416066279e-03f, -2.510033917e-03f, -2.085186870e-04f, +1.146257356e-03f, +9.938425466e-04f, +2.249154914e-04f, -2.256016332e-04f, - +5.463244622e-04f, +3.800584512e-04f, -1.074348376e-03f, -2.597077649e-03f, -1.278659524e-03f, +3.574494632e-03f, +7.138204729e-03f, +2.797039663e-03f, -8.477678487e-03f, -1.478583868e-02f, -4.700116019e-03f, +1.616129735e-02f, +2.520087698e-02f, +6.439984982e-03f, -2.609930601e-02f, -3.684271028e-02f, -7.351927317e-03f, +3.670907660e-02f, +4.725434442e-02f, +6.967162887e-03f, -4.567517339e-02f, -5.384462353e-02f, -5.271841536e-03f, +5.069727773e-02f, +5.484954190e-02f, +2.754002374e-03f, -5.036003776e-02f, -5.002351794e-02f, -1.972652877e-04f, +4.471424948e-02f, +4.072443406e-02f, -1.670461363e-03f, -3.527433768e-02f, -2.935721108e-02f, +2.480640490e-03f, +2.442428626e-02f, +1.845772125e-02f, -2.322990171e-03f, -1.452097198e-02f, -9.852351375e-03f, +1.611223284e-03f, +7.119132864e-03f, +4.243176755e-03f, -8.220014310e-04f, -2.644317708e-03f, -1.314126515e-03f, +2.686575106e-04f, +5.798079906e-04f, - -5.765296115e-06f, -3.998113491e-05f, -4.617543122e-05f, +1.759838370e-05f, +1.187594373e-04f, +1.414238512e-04f, -6.757567778e-06f, -2.514642936e-04f, -3.452546102e-04f, -8.164810093e-05f, +4.267604542e-04f, +7.171328272e-04f, +3.456331944e-04f, -5.947779018e-04f, -1.333533885e-03f, -9.677741847e-04f, +6.278958467e-04f, +2.342336748e-03f, +2.432129444e-03f, -7.278250009e-05f, -4.257848572e-03f, -7.576604323e-03f, -7.517360200e-03f, -3.510123255e-03f, +2.447067529e-03f, +7.039098547e-03f, +7.875495044e-03f, +5.035142753e-03f, +7.908557901e-04f, -2.161485201e-03f, -2.531915604e-03f, -9.914363706e-04f, +7.453464948e-04f, +1.368646705e-03f, +7.793699012e-04f, -1.973589024e-04f, -7.050127996e-04f, -5.147456527e-04f, -5.333590443e-06f, +3.252904120e-04f, +2.891856649e-04f, +5.108105047e-05f, -1.273356352e-04f, -1.330502028e-04f, -3.639529768e-05f, +3.993777832e-05f, +4.503118166e-05f, +1.176534634e-05f, - -2.016071959e-05f, +4.704766528e-05f, +1.186821501e-04f, +4.171754544e-05f, -2.046323028e-04f, -3.414770032e-04f, -4.149500913e-05f, +5.467209090e-04f, +7.181486913e-04f, -2.614790518e-05f, -1.117457274e-03f, -1.223893792e-03f, +2.079521297e-04f, +1.889991623e-03f, +1.770402507e-03f, -5.235804775e-04f, -2.747940555e-03f, -2.226668070e-03f, +9.418137984e-04f, +3.506725792e-03f, +2.465715883e-03f, -1.377579891e-03f, -3.972784618e-03f, -2.416213044e-03f, +1.716865348e-03f, +4.016694866e-03f, +2.092951993e-03f, -1.860743862e-03f, -3.625606667e-03f, -1.590289783e-03f, +1.767276576e-03f, +2.908694961e-03f, +1.042164199e-03f, -1.469409935e-03f, -2.052784506e-03f, -5.695620628e-04f, +1.059413327e-03f, +1.250435457e-03f, +2.411203233e-04f, -6.485364007e-04f, -6.350858861e-04f, -6.286608877e-05f, +3.233063110e-04f, +2.509168103e-04f, -4.066716365e-06f, -1.197342126e-04f, -6.436320670e-05f, +1.271898053e-05f, - /* 5,10 (48) */ - -2.487527171e-04f, +9.965884631e-05f, +8.609413644e-04f, +1.217558456e-03f, +1.627790300e-04f, -2.098374192e-03f, -3.479918858e-03f, -1.526556951e-03f, +3.585997048e-03f, +7.634467472e-03f, +5.204616567e-03f, -4.458255175e-03f, -1.414367498e-02f, -1.299760815e-02f, +3.005110776e-03f, +2.343903002e-02f, +2.813779957e-02f, +4.234731733e-03f, -3.709014737e-02f, -6.056954650e-02f, -2.880458000e-02f, +6.730066057e-02f, +1.935918595e-01f, +2.882928326e-01f, +3.002210142e-01f, +2.227367744e-01f, +9.823396566e-02f, -1.020958642e-02f, -5.885505491e-02f, -4.629905191e-02f, -5.528240104e-03f, +2.489926454e-02f, +2.687537056e-02f, +8.419153559e-03f, -1.024708129e-02f, -1.523423081e-02f, -7.308289635e-03f, +3.319473232e-03f, +7.789018652e-03f, +4.930171787e-03f, -4.438376820e-04f, -3.364985229e-03f, -2.637369552e-03f, -3.415688898e-04f, +1.109862058e-03f, +1.033780325e-03f, +2.699466730e-04f, -2.138362868e-04f, - +5.261637426e-04f, +4.271061165e-04f, -9.556662258e-04f, -2.555360104e-03f, -1.483291827e-03f, +3.233017629e-03f, +7.096709720e-03f, +3.343760572e-03f, -7.759529796e-03f, -1.481198659e-02f, -5.817573292e-03f, +1.493740356e-02f, +2.540882911e-02f, +8.329976605e-03f, -2.432890350e-02f, -3.736629075e-02f, -1.009986787e-02f, +3.448240853e-02f, +4.819615821e-02f, +1.047388868e-02f, -4.320945751e-02f, -5.522220343e-02f, -9.244626154e-03f, +4.828106469e-02f, +5.656640725e-02f, +6.770697241e-03f, -4.826708576e-02f, -5.188426180e-02f, -3.822871955e-03f, +4.312395969e-02f, +4.249171064e-02f, +1.238233598e-03f, -3.423217348e-02f, -3.082662102e-02f, +4.278559834e-04f, +2.385472420e-02f, +1.951713457e-02f, -1.072554714e-03f, -1.427985166e-02f, -1.050088778e-02f, +9.761373983e-04f, +7.056266775e-03f, +4.566483066e-03f, -5.710846208e-04f, -2.648384424e-03f, -1.433860728e-03f, +2.042943039e-04f, +5.925269711e-04f, - -3.922811791e-06f, -3.805991974e-05f, -4.764846214e-05f, +1.166131574e-05f, +1.133255133e-04f, +1.446545704e-04f, +7.191930005e-06f, -2.375944924e-04f, -3.488584262e-04f, -1.085753362e-04f, +3.955415343e-04f, +7.155332732e-04f, +3.902727112e-04f, -5.314504956e-04f, -1.312427929e-03f, -1.031583203e-03f, +5.075639558e-04f, +2.265368269e-03f, +2.500691732e-03f, +1.529305739e-04f, -3.990987763e-03f, -7.448603302e-03f, -7.644390604e-03f, -3.849346823e-03f, +2.080283344e-03f, +6.848161398e-03f, +7.945354762e-03f, +5.283987960e-03f, +1.042084238e-03f, -2.049639612e-03f, -2.579979786e-03f, -1.112006636e-03f, +6.613830285e-04f, +1.370418431e-03f, +8.382311887e-04f, -1.436002750e-04f, -6.951458607e-04f, -5.417036090e-04f, -3.609256965e-05f, +3.155290602e-04f, +3.002185076e-04f, +6.651145955e-05f, -1.211583726e-04f, -1.370277891e-04f, -4.291118337e-05f, +3.724249168e-05f, +4.642614253e-05f, +1.389600048e-05f, - -2.204093044e-05f, +4.134623355e-05f, +1.170321815e-04f, +5.275210890e-05f, -1.882728830e-04f, -3.437090248e-04f, -7.375563930e-05f, +5.136111991e-04f, +7.333742859e-04f, +4.258191508e-05f, -1.064448760e-03f, -1.265420760e-03f, +8.927577200e-05f, +1.819852361e-03f, +1.852120081e-03f, -3.494730274e-04f, -2.670234486e-03f, -2.357423304e-03f, +7.194084680e-04f, +3.435562247e-03f, +2.644077995e-03f, -1.126983296e-03f, -3.922048391e-03f, -2.628401821e-03f, +1.466397133e-03f, +3.994873537e-03f, +2.315499119e-03f, -1.638724650e-03f, -3.632727262e-03f, -1.796733710e-03f, +1.593809598e-03f, +2.936850373e-03f, +1.211007247e-03f, -1.351604527e-03f, -2.089854939e-03f, -6.900603119e-04f, +9.917229840e-04f, +1.285009845e-03f, +3.146253892e-04f, -6.173766457e-04f, -6.601852187e-04f, -9.970380601e-05f, +3.132953637e-04f, +2.650563955e-04f, +9.867568066e-06f, -1.186657797e-04f, -7.008068125e-05f, +9.635371862e-06f, - /* 5,11 (48) */ - -2.526755289e-04f, +6.159892657e-05f, +8.132929023e-04f, +1.229219772e-03f, +2.761045433e-04f, -1.953719622e-03f, -3.472726928e-03f, -1.764151443e-03f, +3.237138622e-03f, +7.525892136e-03f, +5.600158101e-03f, -3.742721902e-03f, -1.375340227e-02f, -1.352905865e-02f, +1.692682847e-03f, +2.240744682e-02f, +2.864536352e-02f, +6.500100002e-03f, -3.458945564e-02f, -6.041661592e-02f, -3.279556776e-02f, +5.985205727e-02f, +1.859474689e-01f, +2.844434858e-01f, +3.023012975e-01f, +2.295849358e-01f, +1.061793204e-01f, -4.925598463e-03f, -5.781297067e-02f, -4.834869152e-02f, -8.108219891e-03f, +2.378725791e-02f, +2.753675359e-02f, +9.789571990e-03f, -9.408850104e-03f, -1.537783108e-02f, -8.003435496e-03f, +2.777769623e-03f, +7.752926082e-03f, +5.245700847e-03f, -1.436191744e-04f, -3.298473769e-03f, -2.758527925e-03f, -4.785966790e-04f, +1.066950874e-03f, +1.071022817e-03f, +3.163728156e-04f, -1.999402864e-04f, - +5.041228121e-04f, +4.684523500e-04f, -8.386340443e-04f, -2.502607995e-03f, -1.671564710e-03f, +2.889308604e-03f, +7.022954081e-03f, +3.857371771e-03f, -7.026155510e-03f, -1.476940467e-02f, -6.882022052e-03f, +1.367198280e-02f, +2.549810488e-02f, +1.014982897e-02f, -2.247678342e-02f, -3.771576378e-02f, -1.277010236e-02f, +3.212498523e-02f, +4.891556668e-02f, +1.390945093e-02f, -4.056537951e-02f, -5.634918672e-02f, -1.316667454e-02f, +4.565266287e-02f, +5.803280438e-02f, +1.076557078e-02f, -4.595158665e-02f, -5.352298645e-02f, -7.455599217e-03f, +4.132722598e-02f, +4.408552023e-02f, +4.175083971e-03f, -3.302116624e-02f, -3.217822554e-02f, -1.661998956e-03f, +2.316466389e-02f, +2.050885756e-02f, +2.124551303e-04f, -1.396522627e-02f, -1.111826442e-02f, +3.159521796e-04f, +6.956562969e-03f, +4.879778429e-03f, -3.060282253e-04f, -2.638516856e-03f, -1.552526508e-03f, +1.342136227e-04f, +6.021623429e-04f, - -2.170594329e-06f, -3.604505625e-05f, -4.882675536e-05f, +5.923709862e-06f, +1.076151274e-04f, +1.471681076e-04f, +2.065247933e-05f, -2.232007484e-04f, -3.509790369e-04f, -1.343345090e-04f, +3.636178797e-04f, +7.112316931e-04f, +4.323245107e-04f, -4.676548732e-04f, -1.286921163e-03f, -1.090024104e-03f, +3.883575103e-04f, +2.182223262e-03f, +2.558499992e-03f, +3.710047202e-04f, -3.721494474e-03f, -7.307203285e-03f, -7.754900054e-03f, -4.179711288e-03f, +1.708676149e-03f, +6.642011674e-03f, +7.999721116e-03f, +5.526473475e-03f, +1.298295096e-03f, -1.927074180e-03f, -2.619843217e-03f, -1.231519640e-03f, +5.728200767e-04f, +1.366996215e-03f, +8.953186611e-04f, -8.793011604e-05f, -6.822974410e-04f, -5.672390375e-04f, -6.756799030e-05f, +3.042017402e-04f, +3.103611873e-04f, +8.217765240e-05f, -1.142405788e-04f, -1.405560294e-04f, -4.950925812e-05f, +3.423787293e-05f, +4.765196158e-05f, +1.607663367e-05f, - -2.362740894e-05f, +3.573736284e-05f, +1.147983424e-04f, +6.297778107e-05f, -1.716231578e-04f, -3.441156022e-04f, -1.045426173e-04f, +4.790334108e-04f, +7.446500392e-04f, +1.093449204e-04f, -1.007670250e-03f, -1.300167151e-03f, -2.755693267e-05f, +1.742515420e-03f, +1.924084932e-03f, -1.761107648e-04f, -2.581254969e-03f, -2.476117843e-03f, +4.956314854e-04f, +3.349297257e-03f, +2.809473102e-03f, -8.722656489e-04f, -3.853654204e-03f, -2.828463513e-03f, +1.209146098e-03f, +3.954858788e-03f, +2.528288105e-03f, -1.408124574e-03f, -3.623298329e-03f, -1.996621844e-03f, +1.411331538e-03f, +2.951778960e-03f, +1.376451619e-03f, -1.225750979e-03f, -2.117758113e-03f, -8.095634262e-04f, +9.179066134e-04f, +1.314217345e-03f, +3.884819314e-04f, -5.823030335e-04f, -6.827694336e-04f, -1.373032065e-04f, +3.012670491e-04f, +2.783717331e-04f, +2.441321203e-05f, -1.168348903e-04f, -7.570410508e-05f, +6.254422861e-06f, - /* 5,12 (48) */ - -2.548461232e-04f, +2.555387032e-05f, +7.644661469e-04f, +1.235143482e-03f, +3.837196708e-04f, -1.806551514e-03f, -3.452074449e-03f, -1.987352192e-03f, +2.886159585e-03f, +7.391557627e-03f, +5.963775981e-03f, -3.031490209e-03f, -1.332107775e-02f, -1.399671352e-02f, +4.057616846e-04f, +2.131742272e-02f, +2.903372103e-02f, +8.682323264e-03f, -3.203095565e-02f, -6.004561120e-02f, -3.651706223e-02f, +5.254485398e-02f, +1.781925688e-01f, +2.802637745e-01f, +3.040099737e-01f, +2.362269475e-01f, +1.141790415e-01f, +6.008750117e-04f, -5.651467558e-02f, -5.027576570e-02f, -1.072806311e-02f, +2.255573827e-02f, +2.810957367e-02f, +1.115656820e-02f, -8.513531443e-03f, -1.546576120e-02f, -8.685732937e-03f, +2.210530586e-03f, +7.685358092e-03f, +5.549902587e-03f, +1.667420129e-04f, -3.216296117e-03f, -2.872768504e-03f, -6.191527084e-04f, +1.017441616e-03f, +1.105260690e-03f, +3.640247771e-04f, -1.838636527e-04f, - +4.804954032e-04f, +5.041897128e-04f, -7.238357019e-04f, -2.439630214e-03f, -1.843187868e-03f, +2.545193002e-03f, +6.918411464e-03f, +4.336405182e-03f, -6.281505470e-03f, -1.466005975e-02f, -7.889692302e-03f, +1.237181565e-02f, +2.547054795e-02f, +1.189234439e-02f, -2.055269849e-02f, -3.789187454e-02f, -1.535135733e-02f, +2.964886738e-02f, +4.941119817e-02f, +1.725874818e-02f, -3.775590641e-02f, -5.722145237e-02f, -1.702032875e-02f, +4.282419935e-02f, +5.924195048e-02f, +1.472042957e-02f, -4.342329854e-02f, -5.493111103e-02f, -1.107889755e-02f, +3.933060414e-02f, +4.549685177e-02f, +7.126862931e-03f, -3.164471462e-02f, -3.340397652e-02f, -3.779757068e-03f, +2.235510046e-02f, +2.142676417e-02f, +1.526672475e-03f, -1.357674434e-02f, -1.170056746e-02f, -3.668172540e-04f, +6.819259763e-03f, +5.181045478e-03f, -2.765649223e-05f, -2.614103644e-03f, -1.669361398e-03f, +5.850951761e-05f, +6.084167658e-04f, - -5.143564259e-07f, -3.395156363e-05f, -4.971722257e-05f, +4.041819234e-07f, +1.016636668e-04f, +1.489780312e-04f, +3.358328975e-05f, -2.083577617e-04f, -3.516499085e-04f, -1.588547770e-04f, +3.311329249e-04f, +7.043121473e-04f, +4.716902823e-04f, -4.036434917e-04f, -1.257212371e-03f, -1.143009043e-03f, +2.706780347e-04f, +2.093345793e-03f, +2.605646011e-03f, +5.809946439e-04f, -3.450115621e-03f, -7.152924603e-03f, -7.848760342e-03f, -4.500476158e-03f, +1.333103914e-03f, +6.421040627e-03f, +8.038287157e-03f, +5.761871190e-03f, +1.558880023e-03f, -1.793897867e-03f, -2.651151527e-03f, -1.349512981e-03f, +4.798765786e-04f, +1.358267912e-03f, +9.503692440e-04f, -3.051880904e-05f, -6.664430018e-04f, -5.912124291e-04f, -9.965154298e-05f, +2.913103906e-04f, +3.195442804e-04f, +9.802006855e-05f, -1.065872949e-04f, -1.436023867e-04f, -5.616164946e-05f, +3.092545234e-05f, +4.869403775e-05f, +1.829695311e-05f, - -2.492684353e-05f, +3.025215391e-05f, +1.120228962e-04f, +7.237274682e-05f, -1.547851520e-04f, -3.427611766e-04f, -1.337468773e-04f, +4.432058116e-04f, +7.520287966e-04f, +1.738640922e-04f, -9.474821865e-04f, -1.328106554e-03f, -1.420245927e-04f, +1.658467293e-03f, +1.986104763e-03f, -4.295809510e-06f, -2.481548241e-03f, -2.582319918e-03f, +2.715336861e-04f, +3.248435191e-03f, +2.961205417e-03f, -6.146219611e-04f, -3.767961988e-03f, -3.015484417e-03f, +9.463004484e-04f, +3.896801234e-03f, +2.730297901e-03f, -1.169974583e-03f, -3.597258120e-03f, -2.188967178e-03f, +1.220613385e-03f, +2.953263164e-03f, +1.537670045e-03f, -1.092331806e-03f, -2.136210154e-03f, -9.274757092e-04f, +8.381997143e-04f, +1.337793488e-03f, +4.623303147e-04f, -5.433862206e-04f, -7.026467049e-04f, -1.754917821e-04f, +2.872126999e-04f, +2.907553767e-04f, +3.951307321e-05f, -1.142147107e-04f, -8.119107346e-05f, +2.582138931e-06f, - /* 5,13 (48) */ - -2.553604797e-04f, -8.397693308e-06f, +7.147489243e-04f, +1.235547664e-03f, +4.853833376e-04f, -1.657573483e-03f, -3.418491159e-03f, -2.195709953e-03f, +2.534509676e-03f, +7.232702850e-03f, +6.294908906e-03f, -2.327178061e-03f, -1.284938747e-02f, -1.440035701e-02f, -8.514506861e-04f, +2.017441367e-02f, +2.930439907e-02f, +1.077566906e-02f, -2.942530964e-02f, -5.946461656e-02f, -3.996717785e-02f, +4.539192938e-02f, +1.703438085e-01f, +2.757632984e-01f, +3.053430776e-01f, +2.426479881e-01f, +1.222173287e-01f, +6.362746202e-03f, -5.495579556e-02f, -5.206966357e-02f, -1.337921463e-02f, +2.120622529e-02f, +2.858945025e-02f, +1.251483612e-02f, -7.563162199e-03f, -1.549628001e-02f, -9.352175938e-03f, +1.619318156e-03f, +7.585706549e-03f, +5.841212978e-03f, +4.862862933e-04f, -3.118276048e-03f, -2.979355799e-03f, -7.627550950e-04f, +9.612799669e-04f, +1.136186142e-03f, +4.127188149e-04f, -1.655666996e-04f, - +4.555685597e-04f, +5.344418668e-04f, -6.118128057e-04f, -2.367257467e-03f, -1.997973020e-03f, +2.202431825e-03f, +6.784664586e-03f, +4.779610994e-03f, -5.529476674e-03f, -1.448619566e-02f, -8.837174489e-03f, +1.104370909e-02f, +2.532852336e-02f, +1.355081168e-02f, -1.856659372e-02f, -3.789617035e-02f, -1.783290557e-02f, +2.706654746e-02f, +4.968273185e-02f, +2.050718337e-02f, -3.479470099e-02f, -5.783607433e-02f, -2.078829074e-02f, +3.980871493e-02f, +6.018825092e-02f, +1.861723080e-02f, -4.069300064e-02f, -5.610108561e-02f, -1.467615567e-02f, +3.714163696e-02f, +4.671746516e-02f, +1.008012610e-02f, -3.010704457e-02f, -3.449630833e-02f, -5.915967223e-03f, +2.142762475e-02f, +2.226496388e-02f, +2.864465963e-03f, -1.311441403e-02f, -1.224395368e-02f, -1.069463959e-03f, +6.643767981e-03f, +5.468258178e-03f, +2.630988845e-04f, -2.574590571e-03f, -1.783576109e-03f, -2.268155584e-05f, +6.109989047e-04f, - +1.040985477e-06f, -3.179425506e-05f, -5.032793323e-05f, -4.880361657e-06f, +9.550639630e-05f, +1.501005583e-04f, +4.594707460e-05f, -1.931399588e-04f, -3.509095356e-04f, -1.820721445e-04f, +2.982287329e-04f, +6.948668979e-04f, +5.082843731e-04f, -3.396638220e-04f, -1.223511463e-03f, -1.190471988e-03f, +1.549126151e-04f, +1.999189150e-03f, +2.642252808e-03f, +7.824862200e-04f, -3.177593401e-03f, -6.986317469e-03f, -7.925888400e-03f, -4.810928188e-03f, +9.544359400e-04f, +6.185680776e-03f, +8.060786240e-03f, +5.989464080e-03f, +1.823208447e-03f, -1.650254353e-03f, -2.673570778e-03f, -1.465518940e-03f, +3.827926075e-04f, +1.344138791e-03f, +1.003121559e-03f, +2.845238567e-05f, -6.475693674e-04f, -6.134870589e-04f, -1.322295665e-04f, +2.768635425e-04f, +3.277004432e-04f, +1.139765576e-04f, -9.820701606e-05f, -1.461354251e-04f, -6.283919623e-05f, +2.730837028e-05f, +4.953813809e-05f, +2.054597997e-05f, - -2.594761520e-05f, +2.491934601e-05f, +1.087495025e-04f, +8.092094178e-05f, -1.378580622e-04f, -3.397174985e-04f, -1.612711930e-04f, +4.063467844e-04f, +7.555818373e-04f, +2.358804181e-04f, -8.842539332e-04f, -1.349246533e-03f, -2.536268595e-04f, +1.568218952e-03f, +2.038037948e-03f, +1.651875793e-04f, -2.371705449e-03f, -2.675661381e-03f, +4.815868112e-05f, +3.133546031e-03f, +3.098647428e-03f, -3.552563934e-04f, -3.665412401e-03f, -3.188613303e-03f, +6.790752835e-04f, +3.820937052e-03f, +2.920555137e-03f, -9.253463350e-04f, -3.554623527e-03f, -2.372811083e-03f, +1.022472742e-03f, +2.941147774e-03f, +1.693845381e-03f, -9.518731857e-04f, -2.144969009e-03f, -1.043198748e-03f, +7.528718237e-04f, +1.355496472e-03f, +5.358023371e-04f, -5.007186730e-04f, -7.196339889e-04f, -2.140883933e-04f, +2.711345839e-04f, +3.021011351e-04f, +5.510432378e-05f, -1.107821223e-04f, -8.649795645e-05f, -1.373031687e-06f, - /* 5,14 (48) */ - -2.543194942e-04f, -4.019194836e-05f, +6.644209911e-04f, +1.230667302e-03f, +5.808897339e-04f, -1.507472925e-03f, -3.372544084e-03f, -2.388849912e-03f, +2.183600141e-03f, +7.050630706e-03f, +6.593137639e-03f, -1.632311164e-03f, -1.234110310e-02f, -1.474002084e-02f, -2.074962149e-03f, +1.898394169e-02f, +2.945931168e-02f, +1.277485821e-02f, -2.678305683e-02f, -5.868213034e-02f, -4.314477126e-02f, +3.840561191e-02f, +1.624179201e-01f, +2.709523702e-01f, +3.062975135e-01f, +2.488336689e-01f, +1.302781149e-01f, +1.235221028e-02f, -5.313258711e-02f, -5.371991792e-02f, -1.605278541e-02f, +1.974070635e-02f, +2.897224286e-02f, +1.385897491e-02f, -6.560040640e-03f, -1.546782762e-02f, -9.999745306e-03f, +1.005831098e-03f, +7.453476982e-03f, +6.118076521e-03f, +8.139867365e-04f, -3.004299491e-03f, -3.077562815e-03f, -9.088905201e-04f, +8.984407707e-04f, +1.163494512e-03f, +4.622569530e-04f, -1.450207196e-04f, - +4.296209445e-04f, +5.593612128e-04f, -5.030633032e-04f, -2.286336525e-03f, -2.135831082e-03f, +1.862714327e-03f, +6.623393393e-03f, +5.185957778e-03f, -4.773894837e-03f, -1.425031524e-02f, -9.721428422e-03f, +9.694462559e-03f, +2.507489650e-02f, +1.511903063e-02f, -1.652855578e-02f, -3.773098278e-02f, -2.020461102e-02f, +2.439088608e-02f, +4.973089053e-02f, +2.364072940e-02f, -3.169605357e-02f, -5.819133072e-02f, -2.445370314e-02f, +3.662010163e-02f, +6.086732621e-02f, +2.243816785e-02f, -3.777244550e-02f, -5.702643195e-02f, -1.823077919e-02f, +3.476882588e-02f, +4.773993790e-02f, +1.302127387e-02f, -2.841319919e-02f, -3.544818151e-02f, -8.060936232e-03f, +2.038442601e-02f, +2.301783571e-02f, +4.219962434e-03f, -1.257861169e-02f, -1.274467235e-02f, -1.789097948e-03f, +6.429679587e-03f, +5.739392762e-03f, +5.652000196e-04f, -2.519486247e-03f, -1.894358231e-03f, -1.091795123e-04f, +6.096258730e-04f, - +2.491308441e-06f, -2.958766734e-05f, -5.066803309e-05f, -9.914746689e-06f, +8.917830032e-05f, +1.505544017e-04f, +5.771011145e-05f, -1.776211840e-04f, -3.488011481e-04f, -2.039295517e-04f, +2.650454587e-04f, +6.829958540e-04f, +5.420338332e-04f, -2.759575187e-04f, -1.186038462e-03f, -1.232368496e-03f, +4.143284789e-05f, +1.900214177e-03f, +2.668473744e-03f, +9.750973470e-04f, -2.904663123e-03f, -6.807960120e-03f, -7.986246299e-03f, -5.110383358e-03f, +5.735503789e-04f, +5.936404813e-03f, +8.066993076e-03f, +6.208548452e-03f, +2.090629234e-03f, -1.496322096e-03f, -2.686788922e-03f, -1.579065996e-03f, +2.818289479e-04f, +1.324532268e-03f, +1.053316962e-03f, +8.879179446e-05f, -6.256750450e-04f, -6.339296100e-04f, -1.651833839e-04f, +2.608764580e-04f, +3.347647599e-04f, +1.299825782e-04f, -8.911175882e-05f, -1.481249922e-04f, -6.951154581e-05f, +2.339141928e-05f, +5.017048726e-05f, +2.281208434e-05f, - -2.669965649e-05f, +1.976523353e-05f, +1.050228857e-04f, +8.861192429e-05f, -1.209377896e-04f, -3.350629867e-04f, -1.870303451e-04f, +3.686736639e-04f, +7.553980289e-04f, +2.951538003e-04f, -8.183617051e-04f, -1.363627926e-03f, -3.618865460e-04f, +1.472302924e-03f, +2.079793499e-03f, +3.315766088e-04f, -2.252359276e-03f, -2.755838884e-03f, -1.734621290e-04f, +3.005262188e-03f, +3.221242552e-03f, -9.537642794e-05f, -3.546524520e-03f, -3.347065450e-03f, +4.087067610e-04f, +3.727586997e-03f, +3.098138979e-03f, -6.753471971e-04f, -3.495490471e-03f, -2.547228180e-03f, +8.177702581e-04f, +2.915341338e-03f, +1.844174763e-03f, -8.049429437e-04f, -2.143836296e-03f, -1.156134388e-03f, +6.622257906e-04f, +1.367108885e-03f, +6.085229571e-04f, -4.544147255e-04f, -7.335582551e-04f, -2.529040111e-04f, +2.530462502e-04f, +3.123047380e-04f, +7.111861119e-05f, -1.065180250e-04f, -9.158013602e-05f, -5.600138690e-06f, - /* 5,15 (48) */ - -2.518281858e-04f, -6.977961571e-05f, +6.137529580e-04f, +1.220752556e-03f, +6.700680342e-04f, -1.356918523e-03f, -3.314833973e-03f, -2.566471096e-03f, +1.834798993e-03f, +6.846701154e-03f, +6.858183098e-03f, -9.493153096e-04f, -1.179906927e-02f, -1.501597835e-02f, -3.261000612e-03f, +1.775157319e-02f, +2.950074453e-02f, +1.467507238e-02f, -2.411458308e-02f, -5.770703299e-02f, -4.604943438e-02f, +3.159765179e-02f, +1.544316738e-01f, +2.658419868e-01f, +3.068710639e-01f, +2.547700737e-01f, +1.383451080e-01f, +1.856075873e-02f, -5.104195788e-02f, -5.521624002e-02f, -1.873957433e-02f, +1.816164035e-02f, +2.925407180e-02f, +1.518350718e-02f, -5.506723678e-03f, -1.537903583e-02f, -1.062542035e-02f, +3.719014876e-04f, +7.288293598e-03f, +6.378952979e-03f, +1.148751496e-03f, -2.874316912e-03f, -3.166674574e-03f, -1.057015512e-03f, +8.289292249e-04f, +1.186885931e-03f, +5.124274402e-04f, -1.222086353e-04f, - +4.029212880e-04f, +5.791264463e-04f, -3.980404175e-04f, -2.197724601e-03f, -2.256768871e-03f, +1.527651340e-03f, +6.436363048e-03f, +5.554631442e-03f, -4.018496808e-03f, -1.395516144e-02f, -1.053979013e-02f, +8.330834633e-03f, +2.471300995e-02f, +1.659133356e-02f, -1.444876228e-02f, -3.739940617e-02f, -2.245697029e-02f, +2.163504720e-02f, +4.955742841e-02f, +2.664599159e-02f, -2.847481101e-02f, -5.828670715e-02f, -2.800022766e-02f, +3.327303618e-02f, +6.127603297e-02f, +2.616575485e-02f, -3.467430652e-02f, -5.770177914e-02f, -2.172626967e-02f, +3.222159770e-02f, +4.855770816e-02f, +1.593661521e-02f, -2.656902443e-02f, -3.625312446e-02f, -1.020477253e-02f, +1.922829162e-02f, +2.368006150e-02f, +5.587071319e-03f, -1.197008873e-02f, -1.319908707e-02f, -2.522656203e-03f, +6.176775576e-03f, +5.992439012e-03f, +8.775047576e-04f, -2.448367636e-03f, -2.000876256e-03f, -2.007596483e-04f, +6.040257344e-04f, - +3.833276021e-06f, -2.734599447e-05f, -5.074766006e-05f, -1.468554497e-05f, +8.271393049e-05f, +1.503606098e-04f, +6.884228518e-05f, -1.618744025e-04f, -3.453724072e-04f, -2.243769326e-04f, +2.317208331e-04f, +6.688059981e-04f, +5.728784120e-04f, -2.127596292e-04f, -1.145022466e-03f, -1.268675429e-03f, -6.940613874e-05f, +1.796887600e-03f, +2.684491539e-03f, +1.158478686e-03f, -2.632051071e-03f, -6.618456882e-03f, -8.029841120e-03f, -5.398188759e-03f, +1.913317227e-04f, +5.673724385e-03f, +8.056724670e-03f, +6.418436176e-03f, +2.360472425e-03f, -1.332314287e-03f, -2.690517210e-03f, -1.689680367e-03f, +1.772665892e-04f, +1.299390585e-03f, +1.100700600e-03f, +1.502978448e-04f, -6.007705035e-04f, -6.524107990e-04f, -1.983896676e-04f, +2.433712429e-04f, +3.406750891e-04f, +1.459714138e-04f, -7.931711402e-05f, -1.495424008e-04f, -7.614726015e-05f, +1.918107920e-05f, +5.057785772e-05f, +2.508302509e-05f, - -2.719430556e-05f, +1.481360237e-05f, +1.008885095e-04f, +9.544071803e-05f, -1.041165060e-04f, -3.288820696e-04f, -2.109512166e-04f, +3.304016101e-04f, +7.515829083e-04f, +3.514638438e-04f, -7.501865082e-04f, -1.371323979e-03f, -4.663515915e-04f, +1.371270310e-03f, +2.111330779e-03f, +4.941334060e-04f, -2.124180390e-03f, -2.822614710e-03f, -3.923144403e-04f, +2.864275019e-03f, +3.328507442e-03f, +1.638129533e-04f, -3.411893142e-03f, -3.490126337e-03f, +1.364461560e-04f, +3.617154996e-03f, +3.262185724e-03f, -4.211150561e-04f, -3.420033908e-03f, -2.711331088e-03f, +6.074058072e-04f, +2.875817282e-03f, +1.987873747e-03f, -6.521483036e-04f, -2.132658970e-03f, -1.265687754e-03f, +5.665968633e-04f, +1.372439335e-03f, +6.801120963e-04f, -4.046105230e-04f, -7.442576965e-04f, -2.917425243e-04f, +2.329728192e-04f, +3.212645130e-04f, +8.748225870e-05f, -1.014076270e-04f, -9.639225967e-05f, -1.008568569e-05f, - /* 6, 0 (48) */ - +4.968144385e-04f, +2.658533900e-04f, -8.962168723e-04f, -1.608103413e-03f, -7.788642489e-06f, +2.979420144e-03f, +3.156687553e-03f, -1.777487314e-03f, -6.981373376e-03f, -4.200072704e-03f, +6.679001343e-03f, +1.302046751e-02f, +2.733865881e-03f, -1.674345458e-02f, -2.042237500e-02f, +4.850187710e-03f, +3.528439247e-02f, +2.773502242e-02f, -2.703828769e-02f, -7.382778902e-02f, -3.314369929e-02f, +1.149897119e-01f, +2.902267079e-01f, +3.684748747e-01f, +2.902267079e-01f, +1.149897119e-01f, -3.314369929e-02f, -7.382778902e-02f, -2.703828769e-02f, +2.773502242e-02f, +3.528439247e-02f, +4.850187710e-03f, -2.042237500e-02f, -1.674345458e-02f, +2.733865881e-03f, +1.302046751e-02f, +6.679001343e-03f, -4.200072704e-03f, -6.981373376e-03f, -1.777487314e-03f, +3.156687553e-03f, +2.979420144e-03f, -7.788642489e-06f, -1.608103413e-03f, -8.962168723e-04f, +2.658533900e-04f, +4.968144385e-04f, +1.277320727e-04f, - -4.968144385e-04f, -7.842817921e-04f, +8.994291019e-04f, +2.915640051e-03f, +8.438649895e-04f, -5.098406932e-03f, -6.009425829e-03f, +3.886651395e-03f, +1.308708603e-02f, +4.180565853e-03f, -1.651382305e-02f, -1.845487053e-02f, +9.460496445e-03f, +3.171517895e-02f, +1.017220246e-02f, -3.304107863e-02f, -3.524088677e-02f, +1.560130303e-02f, +5.143354543e-02f, +1.625027633e-02f, -4.622585189e-02f, -4.721341238e-02f, +1.858986948e-02f, +6.004110985e-02f, +1.858986948e-02f, -4.721341238e-02f, -4.622585189e-02f, +1.625027633e-02f, +5.143354543e-02f, +1.560130303e-02f, -3.524088677e-02f, -3.304107863e-02f, +1.017220246e-02f, +3.171517895e-02f, +9.460496445e-03f, -1.845487053e-02f, -1.651382305e-02f, +4.180565853e-03f, +1.308708603e-02f, +3.886651395e-03f, -6.009425829e-03f, -5.098406932e-03f, +8.438649895e-04f, +2.915640051e-03f, +8.994291019e-04f, -7.842817921e-04f, -6.202569526e-04f, -1.277320727e-04f, - -1.499733940e-05f, +4.581440195e-05f, +8.222654775e-05f, -1.133499855e-05f, -1.717221122e-04f, -1.536557052e-04f, +1.457711105e-04f, +4.035826075e-04f, +1.612392801e-04f, -4.817224287e-04f, -7.200285364e-04f, +3.417364024e-05f, +1.115389910e-03f, +1.031958370e-03f, -6.472422812e-04f, -2.165140336e-03f, -1.186136915e-03f, +2.083111403e-03f, +4.043645375e-03f, +1.059561482e-03f, -5.997321120e-03f, -1.131891039e-02f, -9.290879382e-03f, -3.277778787e-04f, +8.888315096e-03f, +1.144173426e-02f, +6.454643929e-03f, -6.964563701e-04f, -4.022753705e-03f, -2.292177099e-03f, +1.025727110e-03f, +2.193586529e-03f, +7.745420228e-04f, -9.663083127e-04f, -1.158510680e-03f, -1.065268205e-04f, +7.025179806e-04f, +5.184656751e-04f, -1.270869112e-04f, -4.062105010e-04f, -1.685272076e-04f, +1.421089314e-04f, +1.785214599e-04f, +2.140257552e-05f, -8.075517306e-05f, -5.014084945e-05f, +1.253239210e-05f, +2.336102954e-05f, - +1.499733940e-05f, -3.604833932e-05f, -1.540456612e-04f, -4.913805713e-05f, +2.946836819e-04f, +3.408706404e-04f, -2.734518864e-04f, -8.054712459e-04f, -1.611983499e-04f, +1.144424426e-03f, +1.076495704e-03f, -8.825186526e-04f, -2.120794780e-03f, -2.820117937e-04f, +2.572434168e-03f, +2.088618093e-03f, -1.773533212e-03f, -3.658041246e-03f, -3.037498356e-04f, +3.951088380e-03f, +2.828652722e-03f, -2.493092796e-03f, -4.507857853e-03f, -1.857454068e-04f, +4.399660011e-03f, +2.793451027e-03f, -2.554869886e-03f, -4.076700728e-03f, -1.409849475e-05f, +3.595489982e-03f, +2.013737730e-03f, -1.908679696e-03f, -2.674543436e-03f, +8.678704201e-05f, +2.100891351e-03f, +1.018351270e-03f, -9.962403305e-04f, -1.200978750e-03f, +8.125534378e-05f, +8.058829803e-04f, +3.226831859e-04f, -3.204820592e-04f, -3.135467573e-04f, +3.155727048e-05f, +1.567596241e-04f, +4.438067365e-05f, -4.015609728e-05f, -2.336102954e-05f, - /* 6, 1 (48) */ - +4.818170991e-04f, +3.116677919e-04f, -8.139903245e-04f, -1.619438411e-03f, -1.795107547e-04f, +2.825764439e-03f, +3.302458664e-03f, -1.373904706e-03f, -6.820134096e-03f, -4.681795133e-03f, +5.958972806e-03f, +1.305464115e-02f, +3.849255791e-03f, -1.571149621e-02f, -2.106961728e-02f, +2.685047373e-03f, +3.409825556e-02f, +2.981813382e-02f, -2.299464232e-02f, -7.276822754e-02f, -3.914102041e-02f, +1.036708015e-01f, +2.809358285e-01f, +3.681470969e-01f, +2.991150230e-01f, +1.264314461e-01f, -2.668905536e-02f, -7.452424539e-02f, -3.106104140e-02f, +2.544284532e-02f, +3.631011958e-02f, +7.043774239e-03f, -1.964783298e-02f, -1.770976289e-02f, +1.575355201e-03f, +1.291394069e-02f, +7.381519323e-03f, -3.681607029e-03f, -7.108460287e-03f, -2.183697815e-03f, +2.988160346e-03f, +3.121529075e-03f, +1.707328174e-04f, -1.586700837e-03f, -9.769720453e-04f, +2.157125405e-04f, +5.093468306e-04f, +1.510931022e-04f, - -4.818170991e-04f, -8.203301315e-04f, +7.453834406e-04f, +2.866501994e-03f, +1.138548671e-03f, -4.757536292e-03f, -6.282877715e-03f, +3.081180149e-03f, +1.292588768e-02f, +5.324990279e-03f, -1.543732735e-02f, -1.933738918e-02f, +7.339701665e-03f, +3.143316715e-02f, +1.274463663e-02f, -3.095246054e-02f, -3.701441998e-02f, +1.194326179e-02f, +5.112979559e-02f, +2.020136471e-02f, -4.339719917e-02f, -4.970650518e-02f, +1.408201163e-02f, +5.985536445e-02f, +2.298952949e-02f, -4.441996135e-02f, -4.878072178e-02f, +1.217357560e-02f, +5.141944693e-02f, +1.919679302e-02f, -3.322714904e-02f, -3.494975833e-02f, +7.497659026e-03f, +3.180196599e-02f, +1.156138780e-02f, -1.743651926e-02f, -1.751006338e-02f, +2.979587103e-03f, +1.316834138e-02f, +4.692534375e-03f, -5.686742643e-03f, -5.418888992e-03f, +5.303182322e-04f, +2.947197322e-03f, +1.056188726e-03f, -7.399011185e-04f, -6.604130498e-04f, -1.510931022e-04f, - -1.721194565e-05f, +4.140964876e-05f, +8.312660570e-05f, -1.607065380e-06f, -1.641797458e-04f, -1.639344914e-04f, +1.229214328e-04f, +3.987934951e-04f, +1.935382675e-04f, -4.433395733e-04f, -7.331792745e-04f, -3.655074561e-05f, +1.067342593e-03f, +1.090519334e-03f, -5.195893246e-04f, -2.126003711e-03f, -1.336275342e-03f, +1.869018664e-03f, +4.043550276e-03f, +1.404861238e-03f, -5.533201255e-03f, -1.116513206e-02f, -9.663991810e-03f, -9.822571399e-04f, +8.457448808e-03f, +1.153277082e-02f, +6.903336548e-03f, -3.165794289e-04f, -3.980359535e-03f, -2.495011615e-03f, +8.556247074e-04f, +2.210926428e-03f, +9.007918871e-04f, -8.937550365e-04f, -1.196345405e-03f, -1.801472872e-04f, +6.806320721e-04f, +5.533162464e-04f, -9.122424856e-05f, -4.065968808e-04f, -1.910524798e-04f, +1.293202336e-04f, +1.845085850e-04f, +3.175948924e-05f, -7.869717760e-05f, -5.435485258e-05f, +9.822433814e-06f, +2.420834805e-05f, - +1.721194565e-05f, -2.797302899e-05f, -1.503786526e-04f, -6.554580609e-05f, +2.746236972e-04f, +3.582266926e-04f, -2.240947659e-04f, -7.998354702e-04f, -2.378849854e-04f, +1.081948821e-03f, +1.148058766e-03f, -7.438547548e-04f, -2.126892192e-03f, -4.722485472e-04f, +2.455585875e-03f, +2.253106908e-03f, -1.524831037e-03f, -3.697023187e-03f, -6.172201198e-04f, +3.801456149e-03f, +3.083415824e-03f, -2.178016822e-03f, -4.587581862e-03f, -5.560515546e-04f, +4.263636073e-03f, +3.077127272e-03f, -2.263733107e-03f, -4.177340741e-03f, -3.343157089e-04f, +3.509552640e-03f, +2.243798546e-03f, -1.714262142e-03f, -2.761034460e-03f, -1.122302159e-04f, +2.067058655e-03f, +1.150395214e-03f, -9.076298295e-04f, -1.251081896e-03f, -1.491478018e-06f, +8.009066393e-04f, +3.714402944e-04f, -2.970911118e-04f, -3.310245125e-04f, +1.288020430e-05f, +1.584475354e-04f, +5.291577035e-05f, -3.845865258e-05f, -2.420834805e-05f, - /* 6, 2 (48) */ - +4.646051534e-04f, +3.530774407e-04f, -7.308637188e-04f, -1.621045477e-03f, -3.436905005e-04f, +2.661829947e-03f, +3.425380097e-03f, -9.751112112e-04f, -6.626595828e-03f, -5.125134706e-03f, +5.225793532e-03f, +1.301809040e-02f, +4.916598384e-03f, -1.462097687e-02f, -2.158920660e-02f, +5.590436624e-04f, +3.276198022e-02f, +3.168715249e-02f, -1.895109204e-02f, -7.136336630e-02f, -4.467422166e-02f, +9.250566943e-02f, +2.712718367e-01f, +3.671648397e-01f, +3.075724718e-01f, +1.379642170e-01f, -1.978571881e-02f, -7.484082482e-02f, -3.504140093e-02f, +2.294783371e-02f, +3.716574429e-02f, +9.254700667e-03f, -1.874704109e-02f, -1.860351792e-02f, +3.790097958e-04f, +1.273379340e-02f, +8.062151396e-03f, -3.128290783e-03f, -7.199684535e-03f, -2.590294696e-03f, +2.797107866e-03f, +3.250849309e-03f, +3.552414023e-04f, -1.554941348e-03f, -1.055669223e-03f, +1.613576880e-04f, +5.191692644e-04f, +1.753014503e-04f, - -4.646051534e-04f, -8.483031605e-04f, +5.950047880e-04f, +2.800956188e-03f, +1.413172369e-03f, -4.399309599e-03f, -6.506972481e-03f, +2.281344679e-03f, +1.268800270e-02f, +6.406939100e-03f, -1.428926858e-02f, -2.008124393e-02f, +5.212809473e-03f, +3.096091860e-02f, +1.520022250e-02f, -2.869935363e-02f, -3.853925102e-02f, +8.246238601e-03f, +5.051257547e-02f, +2.400282086e-02f, -4.031378334e-02f, -5.188452200e-02f, +9.494429766e-03f, +5.929931289e-02f, +2.725316557e-02f, -4.134283408e-02f, -5.104445488e-02f, +7.996234859e-03f, +5.108513123e-02f, +2.270634566e-02f, -3.098335049e-02f, -3.666402047e-02f, +4.736624566e-03f, +3.168973577e-02f, +1.362844645e-02f, -1.628612404e-02f, -1.841769321e-02f, +1.728505206e-03f, +1.316684990e-02f, +5.493441015e-03f, -5.315302348e-03f, -5.715980103e-03f, +1.992937197e-04f, +2.960077526e-03f, +1.214636261e-03f, -6.869853482e-04f, -6.988717024e-04f, -1.753014503e-04f, - -1.917294829e-05f, +3.695981836e-05f, +8.347375200e-05f, +7.734872448e-06f, -1.559657101e-04f, -1.729275679e-04f, +1.001118357e-04f, +3.919335456e-04f, +2.238551306e-04f, -4.035727706e-04f, -7.420094127e-04f, -1.053024563e-04f, +1.014746362e-03f, +1.141847450e-03f, -3.922656056e-04f, -2.076637988e-03f, -1.475628833e-03f, +1.651098036e-03f, +4.023065436e-03f, +1.731415080e-03f, -5.064117745e-03f, -1.098134138e-02f, -1.000661783e-02f, -1.633511224e-03f, +7.999541491e-03f, +1.159130080e-02f, +7.341573863e-03f, +7.894597345e-05f, -3.916032251e-03f, -2.690411489e-03f, +6.764722311e-04f, +2.216792834e-03f, +1.025284408e-03f, -8.145264851e-04f, -1.228555130e-03f, -2.546575136e-04f, +6.543796353e-04f, +5.860252003e-04f, -5.380827359e-05f, -4.046723017e-04f, -2.132068256e-04f, +1.153241184e-04f, +1.896169401e-04f, +4.235166595e-05f, -7.604058012e-05f, -5.842156927e-05f, +6.874909048e-06f, +2.490662972e-05f, - +1.917294829e-05f, -2.020393344e-05f, -1.458354689e-04f, -8.071584242e-05f, +2.535564812e-04f, +3.725425543e-04f, -1.749498460e-04f, -7.891706437e-04f, -3.108967826e-04f, +1.014108723e-03f, +1.210657585e-03f, -6.033167163e-04f, -2.119395490e-03f, -6.563535789e-04f, +2.324961565e-03f, +2.401288390e-03f, -1.269314706e-03f, -3.712407093e-03f, -9.243468054e-04f, +3.628906158e-03f, +3.317623958e-03f, -1.850276583e-03f, -4.638369466e-03f, -9.228114822e-04f, +4.100614958e-03f, +3.342259702e-03f, -1.957028337e-03f, -4.252212819e-03f, -6.548620144e-04f, +3.400567182e-03f, +2.462118457e-03f, -1.506443431e-03f, -2.831118909e-03f, -3.137999908e-04f, +2.019264512e-03f, +1.277699413e-03f, -8.110657220e-04f, -1.294235224e-03f, -8.655777873e-05f, +7.904112298e-04f, +4.193667154e-04f, -2.707510300e-04f, -3.469313050e-04f, -6.804394093e-06f, +1.590410464e-04f, +6.159451063e-05f, -3.628430681e-05f, -2.490662972e-05f, - /* 6, 3 (48) */ - +4.454322052e-04f, +3.900372591e-04f, -6.473899668e-04f, -1.613310604e-03f, -4.996562106e-04f, +2.488902380e-03f, +3.525491932e-03f, -5.831776656e-04f, -6.402740698e-03f, -5.528707477e-03f, +4.483784119e-03f, +1.291278795e-02f, +5.931344747e-03f, -1.347912942e-02f, -2.198147221e-02f, -1.517594326e-03f, +3.128635138e-02f, +3.333825052e-02f, -1.492802661e-02f, -6.963195122e-02f, -4.973833941e-02f, +8.152432805e-02f, +2.612652189e-01f, +3.655313285e-01f, +3.155720133e-01f, +1.495555178e-01f, -1.244414495e-02f, -7.476187885e-02f, -3.895743318e-02f, +2.025742222e-02f, +3.784221652e-02f, +1.147149350e-02f, -1.772175668e-02f, -1.941804441e-02f, -8.495453346e-04f, +1.247913589e-02f, +8.716531031e-03f, -2.542265583e-03f, -7.253492809e-03f, -2.994966997e-03f, +2.583901040e-03f, +3.366173427e-03f, +5.448583425e-04f, -1.512589682e-03f, -1.131709803e-03f, +1.029361187e-04f, +5.260441735e-04f, +2.002080800e-04f, - -4.454322052e-04f, -8.685070939e-04f, +4.491693191e-04f, +2.720240346e-03f, +1.666728850e-03f, -4.026767045e-03f, -6.681922327e-03f, +1.492174035e-03f, +1.237710592e-02f, +7.421047823e-03f, -1.307861100e-02f, -2.068456065e-02f, +3.093413984e-03f, +3.030456503e-02f, +1.752518407e-02f, -2.629806524e-02f, -3.980856572e-02f, +4.533831508e-03f, +4.958822867e-02f, +2.763172701e-02f, -3.699615939e-02f, -5.373479858e-02f, +4.856060301e-03f, +5.837650141e-02f, +3.135378052e-02f, -3.800057438e-02f, -5.300148322e-02f, +3.744022040e-03f, +5.043026921e-02f, +2.610691284e-02f, -2.852123204e-02f, -3.817046390e-02f, +1.905505657e-03f, +3.137593578e-02f, +1.564771096e-02f, -1.500842463e-02f, -1.922875894e-02f, +4.342699829e-04f, +1.308029212e-02f, +6.283852244e-03f, -4.895935633e-03f, -5.986731133e-03f, -1.476375854e-04f, +2.953273132e-03f, +1.373677308e-03f, -6.253908375e-04f, -7.351560092e-04f, -2.002080800e-04f, - -2.087909205e-05f, +3.249703570e-05f, +8.328925833e-05f, +1.664857625e-05f, -1.471529901e-04f, -1.806254050e-04f, +7.747171356e-05f, +3.831024246e-04f, +2.520758300e-04f, -3.626787717e-04f, -7.465810587e-04f, -1.717567126e-04f, +9.579945182e-04f, +1.185840910e-03f, -2.659361064e-04f, -2.017546624e-03f, -1.603750184e-03f, +1.430538142e-03f, +3.982865045e-03f, +2.038378098e-03f, -4.591896607e-03f, -1.076858506e-02f, -1.031784186e-02f, -2.279404362e-03f, +7.515960575e-03f, +1.161672233e-02f, +7.767546564e-03f, +4.889102033e-04f, -3.829429834e-03f, -2.877179697e-03f, +4.889741247e-04f, +2.210870206e-03f, +1.147304853e-03f, -7.288923924e-04f, -1.254823802e-03f, -3.296656896e-04f, +6.237944064e-04f, +6.163492617e-04f, -1.500931522e-05f, -4.003788880e-04f, -2.348480499e-04f, +1.001635876e-04f, +1.937831454e-04f, +5.312148518e-05f, -7.277692874e-05f, -6.230567366e-05f, +3.699409719e-06f, +2.544119995e-05f, - +2.087909205e-05f, -1.278501217e-05f, -1.404960552e-04f, -9.459557017e-05f, +2.316715232e-04f, +3.838323497e-04f, -1.263427196e-04f, -7.737004654e-04f, -3.798513683e-04f, +9.414833671e-04f, +1.264085916e-03f, -4.618549811e-04f, -2.098602257e-03f, -8.332417435e-04f, +2.181600471e-03f, +2.532421760e-03f, -1.008693674e-03f, -3.704317578e-03f, -1.223220544e-03f, +3.434682070e-03f, +3.529881935e-03f, -1.512001046e-03f, -4.659946008e-03f, -1.283686914e-03f, +3.911601571e-03f, +3.587101452e-03f, -1.636650437e-03f, -4.300684389e-03f, -9.736802695e-04f, +3.269025430e-03f, +2.667160254e-03f, -1.286403228e-03f, -2.884105909e-03f, -5.166454864e-04f, +1.957569632e-03f, +1.399325762e-03f, -7.070124832e-04f, -1.329975583e-03f, -1.734300341e-04f, +7.743006998e-04f, +4.661001774e-04f, -2.415385252e-04f, -3.610857945e-04f, -2.739598337e-05f, +1.584772530e-04f, +7.035318574e-05f, -3.361875474e-05f, -2.544119995e-05f, - /* 6, 4 (48) */ - +4.245531131e-04f, +4.225342948e-04f, -5.641007085e-04f, -1.596662028e-03f, -6.468092006e-04f, +2.308276975e-03f, +3.602963646e-03f, -2.000752410e-04f, -6.150664868e-03f, -5.891386249e-03f, +3.737203061e-03f, +1.274103123e-02f, +6.889339265e-03f, -1.229328851e-02f, -2.224740832e-02f, -3.535140950e-03f, +2.968260120e-02f, +3.476878867e-02f, -1.094516156e-02f, -6.759357313e-02f, -5.433023602e-02f, +7.075574299e-02f, +2.509473770e-01f, +3.632519241e-01f, +3.230879739e-01f, +1.611722401e-01f, -4.676598387e-03f, -7.427296864e-02f, -4.278686302e-02f, +1.738024252e-02f, +3.833119065e-02f, +1.368236371e-02f, -1.657445183e-02f, -2.014693680e-02f, -2.104369136e-03f, +1.214947020e-02f, +9.340325437e-03f, -1.925916321e-03f, -7.268502124e-03f, -3.395345886e-03f, +2.349052990e-03f, +3.466337015e-03f, +7.386414879e-04f, -1.459468197e-03f, -1.204486732e-03f, +4.063044502e-05f, +5.297435832e-04f, +2.256492799e-04f, - -4.245531131e-04f, -8.812921061e-04f, +3.086732639e-04f, +2.625644776e-03f, +1.898400373e-03f, -3.642934695e-03f, -6.808265047e-03f, +7.184735700e-04f, +1.199725455e-02f, +8.362531190e-03f, -1.181452508e-02f, -2.114641563e-02f, +9.948117267e-04f, +2.947132328e-02f, +1.970678454e-02f, -2.376564348e-02f, -4.081725940e-02f, +8.295139303e-04f, +4.836500812e-02f, +3.106640908e-02f, -3.346627745e-02f, -5.524679963e-02f, +1.961142931e-04f, +5.709281450e-02f, +3.526538209e-02f, -3.441347293e-02f, -5.463813366e-02f, -5.566623497e-04f, +4.945658894e-02f, +2.937593827e-02f, -2.585407178e-02f, -3.945686713e-02f, -9.786002519e-04f, +3.085929029e-02f, +1.760528059e-02f, -1.360909887e-02f, -1.993577142e-02f, -8.957056000e-04f, +1.290686209e-02f, +7.058152944e-03f, -4.429835456e-03f, -6.228269659e-03f, -5.087233799e-04f, +2.925877149e-03f, +1.532154561e-03f, -5.550376518e-04f, -7.687747640e-04f, -2.256492799e-04f, - -2.233105653e-05f, +2.805214350e-05f, +8.259701733e-05f, +2.509604609e-05f, -1.378157037e-04f, -1.870264704e-04f, +5.512555411e-05f, +3.724082463e-04f, +2.781012933e-04f, -3.209139411e-04f, -7.469783072e-04f, -2.356091725e-04f, +8.974935422e-04f, +1.222439452e-03f, -1.412452366e-04f, -1.949271696e-03f, -1.720259320e-03f, +1.208511679e-03f, +3.923696023e-03f, +2.325003233e-03f, -4.118348902e-03f, -1.052800922e-02f, -1.059687046e-02f, -2.917822246e-03f, +7.008174801e-03f, +1.160855426e-02f, +8.179468934e-03f, +9.120213723e-04f, -3.720301977e-03f, -3.054131478e-03f, +2.938945811e-04f, +2.192897459e-03f, +1.266134869e-03f, -6.371637688e-04f, -1.274860546e-03f, -4.047675780e-04f, +5.889354579e-04f, +6.440523703e-04f, +2.498958862e-05f, -3.936710023e-04f, -2.558326624e-04f, +8.389013798e-05f, +1.969474946e-04f, +6.400803040e-05f, -6.890149093e-05f, -6.597158708e-05f, +3.076934037e-07f, +2.579800327e-05f, - +2.233105653e-05f, -5.754885180e-06f, -1.344426504e-04f, -1.071443738e-04f, +2.091567200e-04f, +3.921311355e-04f, -7.858462338e-05f, -7.536749521e-04f, -4.444041660e-04f, +8.646699359e-04f, +1.308203188e-03f, -3.204070220e-04f, -2.064892248e-03f, -1.001892781e-03f, +2.026610082e-03f, +2.645886660e-03f, -7.446917873e-04f, -3.673030348e-03f, -1.512000316e-03f, +3.220160048e-03f, +3.718943121e-03f, -1.165380464e-03f, -4.652226236e-03f, -1.636378197e-03f, +3.697770427e-03f, +3.810032420e-03f, -1.304591153e-03f, -4.322291018e-03f, -1.288709475e-03f, +3.115571159e-03f, +2.857457604e-03f, -1.055416203e-03f, -2.919408038e-03f, -7.194611602e-04f, +1.882128834e-03f, +1.514355818e-03f, -5.959956855e-04f, -1.357879403e-03f, -2.615684034e-04f, +7.525156364e-04f, +5.112751002e-04f, -2.095540331e-04f, -3.733125000e-04f, -4.878252667e-05f, +1.566994726e-04f, +7.912381790e-05f, -3.045138455e-05f, -2.579800327e-05f, - /* 6, 5 (48) */ - +4.022220566e-04f, +4.505864383e-04f, -4.815036912e-04f, -1.571565982e-03f, -7.846249043e-04f, +2.121250504e-03f, +3.658089200e-03f, +1.723330052e-04f, -5.872563574e-03f, -6.212300190e-03f, +2.990224753e-03f, +1.250542206e-02f, +7.786832807e-03f, -1.107084906e-02f, -2.238865355e-02f, -5.484412646e-03f, +2.796234188e-02f, +3.597730034e-02f, -7.021465538e-03f, -6.526856989e-02f, -5.844858492e-02f, +6.022773377e-02f, +2.403505066e-01f, +3.603341019e-01f, +3.300961487e-01f, +1.727807943e-01f, +3.502870548e-03f, -7.336094727e-02f, -4.650716500e-02f, +1.432611104e-02f, +3.862508523e-02f, +1.587526117e-02f, -1.530831696e-02f, -2.078410057e-02f, -3.379229683e-03f, +1.174470262e-02f, +9.929260895e-03f, -1.281863951e-03f, -7.243512536e-03f, -3.789016888e-03f, +2.093220328e-03f, +3.550227153e-03f, +9.355889825e-04f, -1.395460166e-03f, -1.273388223e-03f, -2.534114206e-05f, +5.300512766e-04f, +2.514472832e-04f, - -4.022220566e-04f, -8.870469913e-04f, +1.742306135e-04f, +2.518500402e-03f, +2.107557093e-03f, -3.250803560e-03f, -6.886849670e-03f, -3.520138210e-05f, +1.155285038e-02f, +9.227201126e-03f, -1.050632189e-02f, -2.146682265e-02f, -1.070080522e-03f, +2.846943050e-02f, +2.173339462e-02f, -2.111975682e-02f, -4.156195119e-02f, -2.843516418e-03f, +4.685300781e-02f, +3.428656913e-02f, -2.974733433e-02f, -5.641218009e-02f, -4.456111943e-03f, +5.545643630e-02f, +3.896315252e-02f, -3.060344051e-02f, -5.594272481e-02f, -4.878953368e-03f, +4.816787947e-02f, +3.249150943e-02f, -2.299661418e-02f, -4.051228333e-02f, -3.898008290e-03f, +3.013982913e-02f, +1.948740943e-02f, -1.209474305e-02f, -2.053176710e-02f, -2.253585003e-03f, +1.264529368e-02f, +7.810668581e-03f, -3.918560355e-03f, -6.437823692e-03f, -8.820358799e-04f, +2.877094622e-03f, +1.688854033e-03f, -4.759138339e-04f, -7.992261485e-04f, -2.514472832e-04f, - -2.353137234e-05f, +2.365453872e-05f, +8.142328803e-05f, +3.304361531e-05f, -1.280286063e-04f, -1.921369911e-04f, +3.319234646e-05f, +3.599667111e-04f, +3.018475856e-04f, -2.785328196e-04f, -7.433062355e-04f, -2.965771233e-04f, +8.336605869e-04f, +1.251623750e-03f, -1.881390406e-05f, -1.872390275e-03f, -1.824843738e-03f, +9.861701888e-04f, +3.846373323e-03f, +2.590643025e-03f, -3.645263310e-03f, -1.026085388e-02f, -1.084303494e-02f, -3.546680477e-03f, +6.477748644e-03f, +1.156643899e-02f, +8.575586598e-03f, +1.346909768e-03f, -3.588492821e-03f, -3.220100200e-03f, +9.205503488e-05f, +2.162670530e-03f, +1.381056230e-03f, -5.396921521e-04f, -1.288401865e-03f, -4.795484832e-04f, +5.498874868e-04f, +6.689072257e-04f, +6.599342113e-05f, -3.845158597e-04f, -2.760167067e-04f, +6.656370929e-05f, +1.990544543e-04f, +7.494736970e-05f, -6.441342463e-05f, -6.938371933e-05f, -3.286313808e-06f, +2.596374223e-05f, - +2.353137234e-05f, +8.532242424e-07f, -1.277590202e-04f, -1.183334294e-04f, +1.861970369e-04f, +3.974939200e-04f, -3.197067399e-05f, -7.293679253e-04f, -5.042497876e-04f, +7.842790341e-04f, +1.342934023e-03f, -1.798912746e-04f, -2.018723382e-03f, -1.161357086e-03f, +1.861157813e-03f, +2.741185758e-03f, -4.790357470e-04f, -3.618968992e-03f, -1.788925009e-03f, +2.986838906e-03f, +3.883716922e-03f, -8.126518140e-04f, -4.615314533e-03f, -1.978639386e-03f, +3.460458135e-03f, +4.009570271e-03f, -9.629263980e-04f, -4.316740431e-03f, -1.597898392e-03f, +2.940997155e-03f, +3.031625551e-03f, -8.148446463e-04f, -2.936546701e-03f, -9.209211050e-04f, +1.793191621e-03f, +1.621897476e-03f, -4.785996723e-04f, -1.377566587e-03f, -3.504098630e-04f, +7.250347421e-04f, +5.545251612e-04f, -1.749217869e-04f, -3.834433674e-04f, -7.084089497e-05f, +1.536580014e-04f, +8.783453419e-05f, -2.677558788e-05f, -2.596374223e-05f, - /* 6, 6 (48) */ - +3.786906842e-04f, +4.742409770e-04f, -4.000804031e-04f, -1.538522367e-03f, -9.126535106e-04f, +1.929113513e-03f, +3.691281546e-03f, +5.322997163e-04f, -5.570715989e-03f, -6.490833009e-03f, +2.246918518e-03f, +1.220884494e-02f, +8.620493394e-03f, -9.819225309e-03f, -2.240746746e-02f, -7.356802921e-03f, +2.613749814e-02f, +3.696347053e-02f, -3.175092215e-03f, -6.267792687e-02f, -6.209384823e-02f, +4.996687989e-02f, +2.295074716e-01f, +3.567874214e-01f, +3.365738973e-01f, +1.843472333e-01f, +1.207845715e-02f, -7.201403750e-02f, -5.009565782e-02f, +1.110601084e-02f, +3.871714026e-02f, +1.803793170e-02f, -1.392726073e-02f, -2.132379272e-02f, -4.667631548e-03f, +1.126515414e-02f, +1.047914838e-02f, -6.129567250e-04f, -7.177519115e-03f, -4.173532748e-03f, +1.817203621e-03f, +3.616790862e-03f, +1.134643437e-03f, -1.320512797e-03f, -1.337801647e-03f, -9.472486139e-05f, +5.267649628e-04f, +2.774110254e-04f, - -3.786906842e-04f, -8.861937670e-04f, +4.647159335e-05f, +2.400166972e-03f, +2.293754130e-03f, -2.853309640e-03f, -6.918820344e-03f, -7.645693074e-04f, +1.104860059e-02f, +1.001148016e-02f, -9.163387871e-03f, -2.164671393e-02f, -3.088803903e-03f, +2.730807342e-02f, +2.359455243e-02f, -1.837857106e-02f, -4.204098693e-02f, -6.462485410e-03f, +4.506408280e-02f, +3.727340804e-02f, -2.586361741e-02f, -5.722483191e-02f, -9.071426476e-03f, +5.347779691e-02f, +4.242361066e-02f, -2.659387024e-02f, -5.690565121e-02f, -9.195693798e-03f, +4.656998107e-02f, +3.543250658e-02f, -1.996498863e-02f, -4.132712798e-02f, -6.834554991e-03f, +2.921890803e-02f, +2.128060105e-02f, -1.047284557e-02f, -2.101036678e-02f, -3.631151590e-03f, +1.229488382e-02f, +8.535703323e-03f, -3.364035194e-03f, -6.612745479e-03f, -1.265479247e-03f, +2.806253727e-03f, +1.842512035e-03f, -3.880792997e-04f, -8.260017364e-04f, -2.774110254e-04f, - -2.448432686e-05f, +1.933202504e-05f, +7.979643430e-05f, +4.046201405e-05f, -1.178666074e-04f, -1.959706758e-04f, +1.178503831e-05f, +3.459002212e-04f, +3.232459887e-04f, -2.357867328e-04f, -7.356898046e-04f, -3.544005275e-04f, +7.669209652e-04f, +1.273414605e-03f, +1.007632299e-04f, -1.787510694e-03f, -1.917258590e-03f, +7.646390276e-04f, +3.751774984e-03f, +2.834750877e-03f, -3.174398890e-03f, -9.968447037e-03f, -1.105579341e-02f, -4.163932878e-03f, +5.926336299e-03f, +1.149014482e-02f, +8.954184214e-03f, +1.792132689e-03f, -3.433943292e-03f, -3.373943242e-03f, -1.156686781e-04f, +2.120044708e-03f, +1.491354662e-03f, -4.368686223e-04f, -1.295213721e-03f, -5.535853241e-04f, +5.067609651e-04f, +6.906968193e-04f, +1.077960061e-04f, -3.728940811e-04f, -2.952566154e-04f, +4.825257690e-05f, +2.000531521e-04f, +8.587286552e-05f, -5.931592914e-05f, -7.250671886e-05f, -7.066530373e-06f, +2.592601571e-05f, - +2.448432686e-05f, +7.011497458e-06f, -1.205297111e-04f, -1.281454301e-04f, +1.629732380e-04f, +3.999945670e-04f, +1.322172512e-05f, -7.010743988e-04f, -5.591231130e-04f, +7.009301813e-04f, +1.368267321e-03f, -4.120131989e-05f, -1.960627270e-03f, -1.310760908e-03f, +1.686462397e-03f, +2.817946487e-03f, -2.134436808e-04f, -3.542700803e-03f, -2.052324376e-03f, +2.736329489e-03f, +4.023275194e-03f, -4.560839640e-04f, -4.549503884e-03f, -2.308292966e-03f, +3.201154799e-03f, +4.184380535e-03f, -6.138029170e-04f, -4.283915400e-03f, -1.899219181e-03f, +2.746241242e-03f, +3.188370580e-03f, -5.661303949e-04f, -2.935156821e-03f, -1.119687697e-03f, +1.691102124e-03f, +1.721091589e-03f, -3.554647702e-04f, -1.388704191e-03f, -4.393715858e-04f, +6.918760735e-04f, +5.954859446e-04f, -1.377897108e-04f, -3.913193363e-04f, -9.343737580e-05f, +1.493108471e-04f, +9.640999259e-05f, -2.258904820e-05f, -2.592601571e-05f, - /* 6, 7 (48) */ - +3.542063574e-04f, +4.935730020e-04f, -3.202839688e-04f, -1.498060353e-03f, -1.030520118e-03f, +1.733142837e-03f, +3.703066585e-03f, +8.781999375e-04f, -5.247470000e-03f, -6.726619742e-03f, +1.511228713e-03f, +1.185444441e-02f, +9.387414359e-03f, -8.545810704e-03f, -2.230670423e-02f, -9.144313614e-03f, +2.422023955e-02f, +3.772810956e-02f, +5.766827686e-04f, -5.984317599e-02f, -6.526824712e-02f, +3.999843285e-02f, +2.184516782e-01f, +3.526234885e-01f, +3.425002336e-01f, +1.958373782e-01f, +2.103264136e-02f, -7.022190482e-02f, -5.352960111e-02f, +7.732067600e-03f, +3.860147158e-02f, +2.015797640e-02f, -1.243590607e-02f, -2.176066135e-02f, -5.962845269e-03f, +1.071156881e-02f, +1.098590935e-02f, +7.774009424e-05f, -7.069723108e-03f, -4.546426829e-03f, +1.521947006e-03f, +3.665043439e-03f, +1.334696589e-03f, -1.234639931e-03f, -1.397117576e-03f, -1.672315802e-04f, +5.196984324e-04f, +3.033370412e-04f, - -3.542063574e-04f, -8.791822696e-04f, -7.405811770e-05f, +2.272021542e-03f, +2.456727368e-03f, -2.453315073e-03f, -6.905598619e-03f, -1.465643706e-03f, +1.048947748e-02f, +1.071241034e-02f, -7.795120550e-03f, -2.168791525e-02f, -5.049431174e-03f, +2.599731251e-02f, +2.528101483e-02f, -1.556062457e-02f, -4.225443061e-02f, -1.000518621e-02f, +4.301175842e-02f, +4.000973753e-02f, -2.184034221e-02f, -5.768091587e-02f, -1.362093036e-02f, +5.116950395e-02f, +4.562476546e-02f, -2.240948970e-02f, -5.751945412e-02f, -1.347960920e-02f, +4.467076189e-02f, +3.817874782e-02f, -1.677661805e-02f, -4.189325837e-02f, -9.769711812e-03f, +2.809922033e-02f, +2.297170317e-02f, -8.751753984e-03f, -2.136583155e-02f, -5.019855781e-03f, +1.185551223e-02f, +9.227579396e-03f, -2.768549250e-03f, -6.750535189e-03f, -1.656798584e-03f, +2.712816351e-03f, +1.991822882e-03f, -2.916693071e-04f, -8.485907846e-04f, -3.033370412e-04f, - -2.519586065e-05f, +1.511068163e-05f, +7.774665823e-05f, +4.732640238e-05f, -1.074043009e-04f, -1.985483987e-04f, -8.989955332e-06f, +3.303369810e-04f, +3.422429896e-04f, -1.929224521e-04f, -7.242726748e-04f, -4.088429183e-04f, +6.977056506e-04f, +1.287871922e-03f, +2.169203000e-04f, -1.695268729e-03f, -1.997326444e-03f, +5.450125416e-04f, +3.640836977e-03f, +3.056881857e-03f, -2.707478034e-03f, -9.652198442e-03f, -1.123473239e-02f, -4.767579644e-03f, +5.355675280e-03f, +1.137956767e-02f, +9.313593052e-03f, +2.246179663e-03f, -3.256693025e-03f, -3.514547854e-03f, -3.283494830e-04f, +2.064936703e-03f, +1.596323724e-03f, -3.291225817e-04f, -1.295093514e-03f, -6.264488016e-04f, +4.596921448e-04f, +7.092159442e-04f, +1.501809141e-04f, -3.588001819e-04f, -3.134100873e-04f, +2.903319024e-05f, +1.998978496e-04f, +9.671551233e-05f, -5.361637368e-05f, -7.530573035e-05f, -1.101474876e-05f, +2.567345557e-05f, - +2.519586065e-05f, +1.269748124e-05f, -1.128393307e-04f, -1.365742325e-04f, +1.396606961e-04f, +3.997245964e-04f, +5.673429862e-05f, -6.691078869e-04f, -6.088000572e-04f, +6.152473448e-04f, +1.384254920e-03f, +9.479965023e-05f, -1.891204326e-03f, -1.449310955e-03f, +1.503785046e-03f, +2.875921927e-03f, +5.038610774e-05f, -3.444931680e-03f, -2.300629299e-03f, +2.470343376e-03f, +4.136857541e-03f, -9.796268044e-05f, -4.455273590e-03f, -2.623244109e-03f, +2.921494382e-03f, +4.333285752e-03f, -2.594244262e-04f, -4.223875475e-03f, -2.190680989e-03f, +2.532381300e-03f, +3.326500154e-03f, -3.107861333e-04f, -2.914990835e-03f, -1.314420454e-03f, +1.576298379e-03f, +1.811118485e-03f, -2.272840501e-04f, -1.391009849e-03f, -5.278545486e-04f, +6.530980272e-04f, +6.337976565e-04f, -9.832913091e-05f, -3.967918929e-04f, -1.164282873e-04f, +1.436244281e-04f, +1.047718587e-04f, -1.789400372e-05f, -2.567345557e-05f, - /* 6, 8 (48) */ - +3.290104967e-04f, +5.086836836e-04f, -2.425373106e-04f, -1.450733950e-03f, -1.137924419e-03f, +1.534594438e-03f, +3.694076629e-03f, +1.208536918e-03f, -4.905227010e-03f, -6.919542194e-03f, +7.869560385e-04f, +1.144560149e-02f, +1.008512001e-02f, -7.257938783e-03f, -2.208978393e-02f, -1.083958234e-02f, +2.222291311e-02f, +3.827312210e-02f, +4.217519746e-03f, -5.678629413e-02f, -6.797572515e-02f, +3.034623441e-02f, +2.072169458e-01f, +3.478559089e-01f, +3.478559089e-01f, +2.072169458e-01f, +3.034623441e-02f, -6.797572515e-02f, -5.678629413e-02f, +4.217519746e-03f, +3.827312210e-02f, +2.222291311e-02f, -1.083958234e-02f, -2.208978393e-02f, -7.257938783e-03f, +1.008512001e-02f, +1.144560149e-02f, +7.869560385e-04f, -6.919542194e-03f, -4.905227010e-03f, +1.208536918e-03f, +3.694076629e-03f, +1.534594438e-03f, -1.137924419e-03f, -1.450733950e-03f, -2.425373106e-04f, +5.086836836e-04f, +3.290104967e-04f, - -3.290104967e-04f, -8.664847883e-04f, -1.868974484e-04f, +2.135447310e-03f, +2.596388064e-03f, -2.053590476e-03f, -6.848864320e-03f, -2.134751593e-03f, +9.880677424e-03f, +1.132765769e-02f, -6.410865630e-03f, -2.159311560e-02f, -6.940635500e-03f, +2.454800155e-02f, +2.678479988e-02f, -1.268470265e-02f, -4.220404451e-02f, -1.345011789e-02f, +4.071112912e-02f, +4.248008090e-02f, -1.770348467e-02f, -5.777887855e-02f, -1.807620395e-02f, +4.854625984e-02f, +4.854625984e-02f, -1.807620395e-02f, -5.777887855e-02f, -1.770348467e-02f, +4.248008090e-02f, +4.071112912e-02f, -1.345011789e-02f, -4.220404451e-02f, -1.268470265e-02f, +2.678479988e-02f, +2.454800155e-02f, -6.940635500e-03f, -2.159311560e-02f, -6.410865630e-03f, +1.132765769e-02f, +9.880677424e-03f, -2.134751593e-03f, -6.848864320e-03f, -2.053590476e-03f, +2.596388064e-03f, +2.135447310e-03f, -1.868974484e-04f, -8.664847883e-04f, -3.290104967e-04f, - -2.567345557e-05f, +1.101474876e-05f, +7.530573035e-05f, +5.361637368e-05f, -9.671551233e-05f, -1.998978496e-04f, -2.903319024e-05f, +3.134100873e-04f, +3.588001819e-04f, -1.501809141e-04f, -7.092159442e-04f, -4.596921448e-04f, +6.264488016e-04f, +1.295093514e-03f, +3.291225817e-04f, -1.596323724e-03f, -2.064936703e-03f, +3.283494830e-04f, +3.514547854e-03f, +3.256693025e-03f, -2.246179663e-03f, -9.313593052e-03f, -1.137956767e-02f, -5.355675280e-03f, +4.767579644e-03f, +1.123473239e-02f, +9.652198442e-03f, +2.707478034e-03f, -3.056881857e-03f, -3.640836977e-03f, -5.450125416e-04f, +1.997326444e-03f, +1.695268729e-03f, -2.169203000e-04f, -1.287871922e-03f, -6.977056506e-04f, +4.088429183e-04f, +7.242726748e-04f, +1.929224521e-04f, -3.422429896e-04f, -3.303369810e-04f, +8.989955332e-06f, +1.985483987e-04f, +1.074043009e-04f, -4.732640238e-05f, -7.774665823e-05f, -1.511068163e-05f, +2.519586065e-05f, - +2.567345557e-05f, +1.789400372e-05f, -1.047718587e-04f, -1.436244281e-04f, +1.164282873e-04f, +3.967918929e-04f, +9.832913091e-05f, -6.337976565e-04f, -6.530980272e-04f, +5.278545486e-04f, +1.391009849e-03f, +2.272840501e-04f, -1.811118485e-03f, -1.576298379e-03f, +1.314420454e-03f, +2.914990835e-03f, +3.107861333e-04f, -3.326500154e-03f, -2.532381300e-03f, +2.190680989e-03f, +4.223875475e-03f, +2.594244262e-04f, -4.333285752e-03f, -2.921494382e-03f, +2.623244109e-03f, +4.455273590e-03f, +9.796268044e-05f, -4.136857541e-03f, -2.470343376e-03f, +2.300629299e-03f, +3.444931680e-03f, -5.038610774e-05f, -2.875921927e-03f, -1.503785046e-03f, +1.449310955e-03f, +1.891204326e-03f, -9.479965023e-05f, -1.384254920e-03f, -6.152473448e-04f, +6.088000572e-04f, +6.691078869e-04f, -5.673429862e-05f, -3.997245964e-04f, -1.396606961e-04f, +1.365742325e-04f, +1.128393307e-04f, -1.269748124e-05f, -2.519586065e-05f, - /* 6, 9 (48) */ - +3.033370412e-04f, +5.196984324e-04f, -1.672315802e-04f, -1.397117576e-03f, -1.234639931e-03f, +1.334696589e-03f, +3.665043439e-03f, +1.521947006e-03f, -4.546426829e-03f, -7.069723108e-03f, +7.774009424e-05f, +1.098590935e-02f, +1.071156881e-02f, -5.962845269e-03f, -2.176066135e-02f, -1.243590607e-02f, +2.015797640e-02f, +3.860147158e-02f, +7.732067600e-03f, -5.352960111e-02f, -7.022190482e-02f, +2.103264136e-02f, +1.958373782e-01f, +3.425002336e-01f, +3.526234885e-01f, +2.184516782e-01f, +3.999843285e-02f, -6.526824712e-02f, -5.984317599e-02f, +5.766827686e-04f, +3.772810956e-02f, +2.422023955e-02f, -9.144313614e-03f, -2.230670423e-02f, -8.545810704e-03f, +9.387414359e-03f, +1.185444441e-02f, +1.511228713e-03f, -6.726619742e-03f, -5.247470000e-03f, +8.781999375e-04f, +3.703066585e-03f, +1.733142837e-03f, -1.030520118e-03f, -1.498060353e-03f, -3.202839688e-04f, +4.935730020e-04f, +3.542063574e-04f, - -3.033370412e-04f, -8.485907846e-04f, -2.916693071e-04f, +1.991822882e-03f, +2.712816351e-03f, -1.656798584e-03f, -6.750535189e-03f, -2.768549250e-03f, +9.227579396e-03f, +1.185551223e-02f, -5.019855781e-03f, -2.136583155e-02f, -8.751753984e-03f, +2.297170317e-02f, +2.809922033e-02f, -9.769711812e-03f, -4.189325837e-02f, -1.677661805e-02f, +3.817874782e-02f, +4.467076189e-02f, -1.347960920e-02f, -5.751945412e-02f, -2.240948970e-02f, +4.562476546e-02f, +5.116950395e-02f, -1.362093036e-02f, -5.768091587e-02f, -2.184034221e-02f, +4.000973753e-02f, +4.301175842e-02f, -1.000518621e-02f, -4.225443061e-02f, -1.556062457e-02f, +2.528101483e-02f, +2.599731251e-02f, -5.049431174e-03f, -2.168791525e-02f, -7.795120550e-03f, +1.071241034e-02f, +1.048947748e-02f, -1.465643706e-03f, -6.905598619e-03f, -2.453315073e-03f, +2.456727368e-03f, +2.272021542e-03f, -7.405811770e-05f, -8.791822696e-04f, -3.542063574e-04f, - -2.592601571e-05f, +7.066530373e-06f, +7.250671886e-05f, +5.931592914e-05f, -8.587286552e-05f, -2.000531521e-04f, -4.825257690e-05f, +2.952566154e-04f, +3.728940811e-04f, -1.077960061e-04f, -6.906968193e-04f, -5.067609651e-04f, +5.535853241e-04f, +1.295213721e-03f, +4.368686223e-04f, -1.491354662e-03f, -2.120044708e-03f, +1.156686781e-04f, +3.373943242e-03f, +3.433943292e-03f, -1.792132689e-03f, -8.954184214e-03f, -1.149014482e-02f, -5.926336299e-03f, +4.163932878e-03f, +1.105579341e-02f, +9.968447037e-03f, +3.174398890e-03f, -2.834750877e-03f, -3.751774984e-03f, -7.646390276e-04f, +1.917258590e-03f, +1.787510694e-03f, -1.007632299e-04f, -1.273414605e-03f, -7.669209652e-04f, +3.544005275e-04f, +7.356898046e-04f, +2.357867328e-04f, -3.232459887e-04f, -3.459002212e-04f, -1.178503831e-05f, +1.959706758e-04f, +1.178666074e-04f, -4.046201405e-05f, -7.979643430e-05f, -1.933202504e-05f, +2.448432686e-05f, - +2.592601571e-05f, +2.258904820e-05f, -9.640999259e-05f, -1.493108471e-04f, +9.343737580e-05f, +3.913193363e-04f, +1.377897108e-04f, -5.954859446e-04f, -6.918760735e-04f, +4.393715858e-04f, +1.388704191e-03f, +3.554647702e-04f, -1.721091589e-03f, -1.691102124e-03f, +1.119687697e-03f, +2.935156821e-03f, +5.661303949e-04f, -3.188370580e-03f, -2.746241242e-03f, +1.899219181e-03f, +4.283915400e-03f, +6.138029170e-04f, -4.184380535e-03f, -3.201154799e-03f, +2.308292966e-03f, +4.549503884e-03f, +4.560839640e-04f, -4.023275194e-03f, -2.736329489e-03f, +2.052324376e-03f, +3.542700803e-03f, +2.134436808e-04f, -2.817946487e-03f, -1.686462397e-03f, +1.310760908e-03f, +1.960627270e-03f, +4.120131989e-05f, -1.368267321e-03f, -7.009301813e-04f, +5.591231130e-04f, +7.010743988e-04f, -1.322172512e-05f, -3.999945670e-04f, -1.629732380e-04f, +1.281454301e-04f, +1.205297111e-04f, -7.011497458e-06f, -2.448432686e-05f, - /* 6,10 (48) */ - +2.774110254e-04f, +5.267649628e-04f, -9.472486139e-05f, -1.337801647e-03f, -1.320512797e-03f, +1.134643437e-03f, +3.616790862e-03f, +1.817203621e-03f, -4.173532748e-03f, -7.177519115e-03f, -6.129567250e-04f, +1.047914838e-02f, +1.126515414e-02f, -4.667631548e-03f, -2.132379272e-02f, -1.392726073e-02f, +1.803793170e-02f, +3.871714026e-02f, +1.110601084e-02f, -5.009565782e-02f, -7.201403750e-02f, +1.207845715e-02f, +1.843472333e-01f, +3.365738973e-01f, +3.567874214e-01f, +2.295074716e-01f, +4.996687989e-02f, -6.209384823e-02f, -6.267792687e-02f, -3.175092215e-03f, +3.696347053e-02f, +2.613749814e-02f, -7.356802921e-03f, -2.240746746e-02f, -9.819225309e-03f, +8.620493394e-03f, +1.220884494e-02f, +2.246918518e-03f, -6.490833009e-03f, -5.570715989e-03f, +5.322997163e-04f, +3.691281546e-03f, +1.929113513e-03f, -9.126535106e-04f, -1.538522367e-03f, -4.000804031e-04f, +4.742409770e-04f, +3.786906842e-04f, - -2.774110254e-04f, -8.260017364e-04f, -3.880792997e-04f, +1.842512035e-03f, +2.806253727e-03f, -1.265479247e-03f, -6.612745479e-03f, -3.364035194e-03f, +8.535703323e-03f, +1.229488382e-02f, -3.631151590e-03f, -2.101036678e-02f, -1.047284557e-02f, +2.128060105e-02f, +2.921890803e-02f, -6.834554991e-03f, -4.132712798e-02f, -1.996498863e-02f, +3.543250658e-02f, +4.656998107e-02f, -9.195693798e-03f, -5.690565121e-02f, -2.659387024e-02f, +4.242361066e-02f, +5.347779691e-02f, -9.071426476e-03f, -5.722483191e-02f, -2.586361741e-02f, +3.727340804e-02f, +4.506408280e-02f, -6.462485410e-03f, -4.204098693e-02f, -1.837857106e-02f, +2.359455243e-02f, +2.730807342e-02f, -3.088803903e-03f, -2.164671393e-02f, -9.163387871e-03f, +1.001148016e-02f, +1.104860059e-02f, -7.645693074e-04f, -6.918820344e-03f, -2.853309640e-03f, +2.293754130e-03f, +2.400166972e-03f, +4.647159335e-05f, -8.861937670e-04f, -3.786906842e-04f, - -2.596374223e-05f, +3.286313808e-06f, +6.938371933e-05f, +6.441342463e-05f, -7.494736970e-05f, -1.990544543e-04f, -6.656370929e-05f, +2.760167067e-04f, +3.845158597e-04f, -6.599342113e-05f, -6.689072257e-04f, -5.498874868e-04f, +4.795484832e-04f, +1.288401865e-03f, +5.396921521e-04f, -1.381056230e-03f, -2.162670530e-03f, -9.205503488e-05f, +3.220100200e-03f, +3.588492821e-03f, -1.346909768e-03f, -8.575586598e-03f, -1.156643899e-02f, -6.477748644e-03f, +3.546680477e-03f, +1.084303494e-02f, +1.026085388e-02f, +3.645263310e-03f, -2.590643025e-03f, -3.846373323e-03f, -9.861701888e-04f, +1.824843738e-03f, +1.872390275e-03f, +1.881390406e-05f, -1.251623750e-03f, -8.336605869e-04f, +2.965771233e-04f, +7.433062355e-04f, +2.785328196e-04f, -3.018475856e-04f, -3.599667111e-04f, -3.319234646e-05f, +1.921369911e-04f, +1.280286063e-04f, -3.304361531e-05f, -8.142328803e-05f, -2.365453872e-05f, +2.353137234e-05f, - +2.596374223e-05f, +2.677558788e-05f, -8.783453419e-05f, -1.536580014e-04f, +7.084089497e-05f, +3.834433674e-04f, +1.749217869e-04f, -5.545251612e-04f, -7.250347421e-04f, +3.504098630e-04f, +1.377566587e-03f, +4.785996723e-04f, -1.621897476e-03f, -1.793191621e-03f, +9.209211050e-04f, +2.936546701e-03f, +8.148446463e-04f, -3.031625551e-03f, -2.940997155e-03f, +1.597898392e-03f, +4.316740431e-03f, +9.629263980e-04f, -4.009570271e-03f, -3.460458135e-03f, +1.978639386e-03f, +4.615314533e-03f, +8.126518140e-04f, -3.883716922e-03f, -2.986838906e-03f, +1.788925009e-03f, +3.618968992e-03f, +4.790357470e-04f, -2.741185758e-03f, -1.861157813e-03f, +1.161357086e-03f, +2.018723382e-03f, +1.798912746e-04f, -1.342934023e-03f, -7.842790341e-04f, +5.042497876e-04f, +7.293679253e-04f, +3.197067399e-05f, -3.974939200e-04f, -1.861970369e-04f, +1.183334294e-04f, +1.277590202e-04f, -8.532242424e-07f, -2.353137234e-05f, - /* 6,11 (48) */ - +2.514472832e-04f, +5.300512766e-04f, -2.534114206e-05f, -1.273388223e-03f, -1.395460166e-03f, +9.355889825e-04f, +3.550227153e-03f, +2.093220328e-03f, -3.789016888e-03f, -7.243512536e-03f, -1.281863951e-03f, +9.929260895e-03f, +1.174470262e-02f, -3.379229683e-03f, -2.078410057e-02f, -1.530831696e-02f, +1.587526117e-02f, +3.862508523e-02f, +1.432611104e-02f, -4.650716500e-02f, -7.336094727e-02f, +3.502870548e-03f, +1.727807943e-01f, +3.300961487e-01f, +3.603341019e-01f, +2.403505066e-01f, +6.022773377e-02f, -5.844858492e-02f, -6.526856989e-02f, -7.021465538e-03f, +3.597730034e-02f, +2.796234188e-02f, -5.484412646e-03f, -2.238865355e-02f, -1.107084906e-02f, +7.786832807e-03f, +1.250542206e-02f, +2.990224753e-03f, -6.212300190e-03f, -5.872563574e-03f, +1.723330052e-04f, +3.658089200e-03f, +2.121250504e-03f, -7.846249043e-04f, -1.571565982e-03f, -4.815036912e-04f, +4.505864383e-04f, +4.022220566e-04f, - -2.514472832e-04f, -7.992261485e-04f, -4.759138339e-04f, +1.688854033e-03f, +2.877094622e-03f, -8.820358799e-04f, -6.437823692e-03f, -3.918560355e-03f, +7.810668581e-03f, +1.264529368e-02f, -2.253585003e-03f, -2.053176710e-02f, -1.209474305e-02f, +1.948740943e-02f, +3.013982913e-02f, -3.898008290e-03f, -4.051228333e-02f, -2.299661418e-02f, +3.249150943e-02f, +4.816787947e-02f, -4.878953368e-03f, -5.594272481e-02f, -3.060344051e-02f, +3.896315252e-02f, +5.545643630e-02f, -4.456111943e-03f, -5.641218009e-02f, -2.974733433e-02f, +3.428656913e-02f, +4.685300781e-02f, -2.843516418e-03f, -4.156195119e-02f, -2.111975682e-02f, +2.173339462e-02f, +2.846943050e-02f, -1.070080522e-03f, -2.146682265e-02f, -1.050632189e-02f, +9.227201126e-03f, +1.155285038e-02f, -3.520138210e-05f, -6.886849670e-03f, -3.250803560e-03f, +2.107557093e-03f, +2.518500402e-03f, +1.742306135e-04f, -8.870469913e-04f, -4.022220566e-04f, - -2.579800327e-05f, -3.076934037e-07f, +6.597158708e-05f, +6.890149093e-05f, -6.400803040e-05f, -1.969474946e-04f, -8.389013798e-05f, +2.558326624e-04f, +3.936710023e-04f, -2.498958862e-05f, -6.440523703e-04f, -5.889354579e-04f, +4.047675780e-04f, +1.274860546e-03f, +6.371637688e-04f, -1.266134869e-03f, -2.192897459e-03f, -2.938945811e-04f, +3.054131478e-03f, +3.720301977e-03f, -9.120213723e-04f, -8.179468934e-03f, -1.160855426e-02f, -7.008174801e-03f, +2.917822246e-03f, +1.059687046e-02f, +1.052800922e-02f, +4.118348902e-03f, -2.325003233e-03f, -3.923696023e-03f, -1.208511679e-03f, +1.720259320e-03f, +1.949271696e-03f, +1.412452366e-04f, -1.222439452e-03f, -8.974935422e-04f, +2.356091725e-04f, +7.469783072e-04f, +3.209139411e-04f, -2.781012933e-04f, -3.724082463e-04f, -5.512555411e-05f, +1.870264704e-04f, +1.378157037e-04f, -2.509604609e-05f, -8.259701733e-05f, -2.805214350e-05f, +2.233105653e-05f, - +2.579800327e-05f, +3.045138455e-05f, -7.912381790e-05f, -1.566994726e-04f, +4.878252667e-05f, +3.733125000e-04f, +2.095540331e-04f, -5.112751002e-04f, -7.525156364e-04f, +2.615684034e-04f, +1.357879403e-03f, +5.959956855e-04f, -1.514355818e-03f, -1.882128834e-03f, +7.194611602e-04f, +2.919408038e-03f, +1.055416203e-03f, -2.857457604e-03f, -3.115571159e-03f, +1.288709475e-03f, +4.322291018e-03f, +1.304591153e-03f, -3.810032420e-03f, -3.697770427e-03f, +1.636378197e-03f, +4.652226236e-03f, +1.165380464e-03f, -3.718943121e-03f, -3.220160048e-03f, +1.512000316e-03f, +3.673030348e-03f, +7.446917873e-04f, -2.645886660e-03f, -2.026610082e-03f, +1.001892781e-03f, +2.064892248e-03f, +3.204070220e-04f, -1.308203188e-03f, -8.646699359e-04f, +4.444041660e-04f, +7.536749521e-04f, +7.858462338e-05f, -3.921311355e-04f, -2.091567200e-04f, +1.071443738e-04f, +1.344426504e-04f, +5.754885180e-06f, -2.233105653e-05f, - /* 6,12 (48) */ - +2.256492799e-04f, +5.297435832e-04f, +4.063044502e-05f, -1.204486732e-03f, -1.459468197e-03f, +7.386414879e-04f, +3.466337015e-03f, +2.349052990e-03f, -3.395345886e-03f, -7.268502124e-03f, -1.925916321e-03f, +9.340325437e-03f, +1.214947020e-02f, -2.104369136e-03f, -2.014693680e-02f, -1.657445183e-02f, +1.368236371e-02f, +3.833119065e-02f, +1.738024252e-02f, -4.278686302e-02f, -7.427296864e-02f, -4.676598387e-03f, +1.611722401e-01f, +3.230879739e-01f, +3.632519241e-01f, +2.509473770e-01f, +7.075574299e-02f, -5.433023602e-02f, -6.759357313e-02f, -1.094516156e-02f, +3.476878867e-02f, +2.968260120e-02f, -3.535140950e-03f, -2.224740832e-02f, -1.229328851e-02f, +6.889339265e-03f, +1.274103123e-02f, +3.737203061e-03f, -5.891386249e-03f, -6.150664868e-03f, -2.000752410e-04f, +3.602963646e-03f, +2.308276975e-03f, -6.468092006e-04f, -1.596662028e-03f, -5.641007085e-04f, +4.225342948e-04f, +4.245531131e-04f, - -2.256492799e-04f, -7.687747640e-04f, -5.550376518e-04f, +1.532154561e-03f, +2.925877149e-03f, -5.087233799e-04f, -6.228269659e-03f, -4.429835456e-03f, +7.058152944e-03f, +1.290686209e-02f, -8.957056000e-04f, -1.993577142e-02f, -1.360909887e-02f, +1.760528059e-02f, +3.085929029e-02f, -9.786002519e-04f, -3.945686713e-02f, -2.585407178e-02f, +2.937593827e-02f, +4.945658894e-02f, -5.566623497e-04f, -5.463813366e-02f, -3.441347293e-02f, +3.526538209e-02f, +5.709281450e-02f, +1.961142931e-04f, -5.524679963e-02f, -3.346627745e-02f, +3.106640908e-02f, +4.836500812e-02f, +8.295139303e-04f, -4.081725940e-02f, -2.376564348e-02f, +1.970678454e-02f, +2.947132328e-02f, +9.948117267e-04f, -2.114641563e-02f, -1.181452508e-02f, +8.362531190e-03f, +1.199725455e-02f, +7.184735700e-04f, -6.808265047e-03f, -3.642934695e-03f, +1.898400373e-03f, +2.625644776e-03f, +3.086732639e-04f, -8.812921061e-04f, -4.245531131e-04f, - -2.544119995e-05f, -3.699409719e-06f, +6.230567366e-05f, +7.277692874e-05f, -5.312148518e-05f, -1.937831454e-04f, -1.001635876e-04f, +2.348480499e-04f, +4.003788880e-04f, +1.500931522e-05f, -6.163492617e-04f, -6.237944064e-04f, +3.296656896e-04f, +1.254823802e-03f, +7.288923924e-04f, -1.147304853e-03f, -2.210870206e-03f, -4.889741247e-04f, +2.877179697e-03f, +3.829429834e-03f, -4.889102033e-04f, -7.767546564e-03f, -1.161672233e-02f, -7.515960575e-03f, +2.279404362e-03f, +1.031784186e-02f, +1.076858506e-02f, +4.591896607e-03f, -2.038378098e-03f, -3.982865045e-03f, -1.430538142e-03f, +1.603750184e-03f, +2.017546624e-03f, +2.659361064e-04f, -1.185840910e-03f, -9.579945182e-04f, +1.717567126e-04f, +7.465810587e-04f, +3.626787717e-04f, -2.520758300e-04f, -3.831024246e-04f, -7.747171356e-05f, +1.806254050e-04f, +1.471529901e-04f, -1.664857625e-05f, -8.328925833e-05f, -3.249703570e-05f, +2.087909205e-05f, - +2.544119995e-05f, +3.361875474e-05f, -7.035318574e-05f, -1.584772530e-04f, +2.739598337e-05f, +3.610857945e-04f, +2.415385252e-04f, -4.661001774e-04f, -7.743006998e-04f, +1.734300341e-04f, +1.329975583e-03f, +7.070124832e-04f, -1.399325762e-03f, -1.957569632e-03f, +5.166454864e-04f, +2.884105909e-03f, +1.286403228e-03f, -2.667160254e-03f, -3.269025430e-03f, +9.736802695e-04f, +4.300684389e-03f, +1.636650437e-03f, -3.587101452e-03f, -3.911601571e-03f, +1.283686914e-03f, +4.659946008e-03f, +1.512001046e-03f, -3.529881935e-03f, -3.434682070e-03f, +1.223220544e-03f, +3.704317578e-03f, +1.008693674e-03f, -2.532421760e-03f, -2.181600471e-03f, +8.332417435e-04f, +2.098602257e-03f, +4.618549811e-04f, -1.264085916e-03f, -9.414833671e-04f, +3.798513683e-04f, +7.737004654e-04f, +1.263427196e-04f, -3.838323497e-04f, -2.316715232e-04f, +9.459557017e-05f, +1.404960552e-04f, +1.278501217e-05f, -2.087909205e-05f, - /* 6,13 (48) */ - +2.002080800e-04f, +5.260441735e-04f, +1.029361187e-04f, -1.131709803e-03f, -1.512589682e-03f, +5.448583425e-04f, +3.366173427e-03f, +2.583901040e-03f, -2.994966997e-03f, -7.253492809e-03f, -2.542265583e-03f, +8.716531031e-03f, +1.247913589e-02f, -8.495453346e-04f, -1.941804441e-02f, -1.772175668e-02f, +1.147149350e-02f, +3.784221652e-02f, +2.025742222e-02f, -3.895743318e-02f, -7.476187885e-02f, -1.244414495e-02f, +1.495555178e-01f, +3.155720133e-01f, +3.655313285e-01f, +2.612652189e-01f, +8.152432805e-02f, -4.973833941e-02f, -6.963195122e-02f, -1.492802661e-02f, +3.333825052e-02f, +3.128635138e-02f, -1.517594326e-03f, -2.198147221e-02f, -1.347912942e-02f, +5.931344747e-03f, +1.291278795e-02f, +4.483784119e-03f, -5.528707477e-03f, -6.402740698e-03f, -5.831776656e-04f, +3.525491932e-03f, +2.488902380e-03f, -4.996562106e-04f, -1.613310604e-03f, -6.473899668e-04f, +3.900372591e-04f, +4.454322052e-04f, - -2.002080800e-04f, -7.351560092e-04f, -6.253908375e-04f, +1.373677308e-03f, +2.953273132e-03f, -1.476375854e-04f, -5.986731133e-03f, -4.895935633e-03f, +6.283852244e-03f, +1.308029212e-02f, +4.342699829e-04f, -1.922875894e-02f, -1.500842463e-02f, +1.564771096e-02f, +3.137593578e-02f, +1.905505657e-03f, -3.817046390e-02f, -2.852123204e-02f, +2.610691284e-02f, +5.043026921e-02f, +3.744022040e-03f, -5.300148322e-02f, -3.800057438e-02f, +3.135378052e-02f, +5.837650141e-02f, +4.856060301e-03f, -5.373479858e-02f, -3.699615939e-02f, +2.763172701e-02f, +4.958822867e-02f, +4.533831508e-03f, -3.980856572e-02f, -2.629806524e-02f, +1.752518407e-02f, +3.030456503e-02f, +3.093413984e-03f, -2.068456065e-02f, -1.307861100e-02f, +7.421047823e-03f, +1.237710592e-02f, +1.492174035e-03f, -6.681922327e-03f, -4.026767045e-03f, +1.666728850e-03f, +2.720240346e-03f, +4.491693191e-04f, -8.685070939e-04f, -4.454322052e-04f, - -2.490662972e-05f, -6.874909048e-06f, +5.842156927e-05f, +7.604058012e-05f, -4.235166595e-05f, -1.896169401e-04f, -1.153241184e-04f, +2.132068256e-04f, +4.046723017e-04f, +5.380827359e-05f, -5.860252003e-04f, -6.543796353e-04f, +2.546575136e-04f, +1.228555130e-03f, +8.145264851e-04f, -1.025284408e-03f, -2.216792834e-03f, -6.764722311e-04f, +2.690411489e-03f, +3.916032251e-03f, -7.894597345e-05f, -7.341573863e-03f, -1.159130080e-02f, -7.999541491e-03f, +1.633511224e-03f, +1.000661783e-02f, +1.098134138e-02f, +5.064117745e-03f, -1.731415080e-03f, -4.023065436e-03f, -1.651098036e-03f, +1.475628833e-03f, +2.076637988e-03f, +3.922656056e-04f, -1.141847450e-03f, -1.014746362e-03f, +1.053024563e-04f, +7.420094127e-04f, +4.035727706e-04f, -2.238551306e-04f, -3.919335456e-04f, -1.001118357e-04f, +1.729275679e-04f, +1.559657101e-04f, -7.734872448e-06f, -8.347375200e-05f, -3.695981836e-05f, +1.917294829e-05f, - +2.490662972e-05f, +3.628430681e-05f, -6.159451063e-05f, -1.590410464e-04f, +6.804394093e-06f, +3.469313050e-04f, +2.707510300e-04f, -4.193667154e-04f, -7.904112298e-04f, +8.655777873e-05f, +1.294235224e-03f, +8.110657220e-04f, -1.277699413e-03f, -2.019264512e-03f, +3.137999908e-04f, +2.831118909e-03f, +1.506443431e-03f, -2.462118457e-03f, -3.400567182e-03f, +6.548620144e-04f, +4.252212819e-03f, +1.957028337e-03f, -3.342259702e-03f, -4.100614958e-03f, +9.228114822e-04f, +4.638369466e-03f, +1.850276583e-03f, -3.317623958e-03f, -3.628906158e-03f, +9.243468054e-04f, +3.712407093e-03f, +1.269314706e-03f, -2.401288390e-03f, -2.324961565e-03f, +6.563535789e-04f, +2.119395490e-03f, +6.033167163e-04f, -1.210657585e-03f, -1.014108723e-03f, +3.108967826e-04f, +7.891706437e-04f, +1.749498460e-04f, -3.725425543e-04f, -2.535564812e-04f, +8.071584242e-05f, +1.458354689e-04f, +2.020393344e-05f, -1.917294829e-05f, - /* 6,14 (48) */ - +1.753014503e-04f, +5.191692644e-04f, +1.613576880e-04f, -1.055669223e-03f, -1.554941348e-03f, +3.552414023e-04f, +3.250849309e-03f, +2.797107866e-03f, -2.590294696e-03f, -7.199684535e-03f, -3.128290783e-03f, +8.062151396e-03f, +1.273379340e-02f, +3.790097958e-04f, -1.860351792e-02f, -1.874704109e-02f, +9.254700667e-03f, +3.716574429e-02f, +2.294783371e-02f, -3.504140093e-02f, -7.484082482e-02f, -1.978571881e-02f, +1.379642170e-01f, +3.075724718e-01f, +3.671648397e-01f, +2.712718367e-01f, +9.250566943e-02f, -4.467422166e-02f, -7.136336630e-02f, -1.895109204e-02f, +3.168715249e-02f, +3.276198022e-02f, +5.590436624e-04f, -2.158920660e-02f, -1.462097687e-02f, +4.916598384e-03f, +1.301809040e-02f, +5.225793532e-03f, -5.125134706e-03f, -6.626595828e-03f, -9.751112112e-04f, +3.425380097e-03f, +2.661829947e-03f, -3.436905005e-04f, -1.621045477e-03f, -7.308637188e-04f, +3.530774407e-04f, +4.646051534e-04f, - -1.753014503e-04f, -6.988717024e-04f, -6.869853482e-04f, +1.214636261e-03f, +2.960077526e-03f, +1.992937197e-04f, -5.715980103e-03f, -5.315302348e-03f, +5.493441015e-03f, +1.316684990e-02f, +1.728505206e-03f, -1.841769321e-02f, -1.628612404e-02f, +1.362844645e-02f, +3.168973577e-02f, +4.736624566e-03f, -3.666402047e-02f, -3.098335049e-02f, +2.270634566e-02f, +5.108513123e-02f, +7.996234859e-03f, -5.104445488e-02f, -4.134283408e-02f, +2.725316557e-02f, +5.929931289e-02f, +9.494429766e-03f, -5.188452200e-02f, -4.031378334e-02f, +2.400282086e-02f, +5.051257547e-02f, +8.246238601e-03f, -3.853925102e-02f, -2.869935363e-02f, +1.520022250e-02f, +3.096091860e-02f, +5.212809473e-03f, -2.008124393e-02f, -1.428926858e-02f, +6.406939100e-03f, +1.268800270e-02f, +2.281344679e-03f, -6.506972481e-03f, -4.399309599e-03f, +1.413172369e-03f, +2.800956188e-03f, +5.950047880e-04f, -8.483031605e-04f, -4.646051534e-04f, - -2.420834805e-05f, -9.822433814e-06f, +5.435485258e-05f, +7.869717760e-05f, -3.175948924e-05f, -1.845085850e-04f, -1.293202336e-04f, +1.910524798e-04f, +4.065968808e-04f, +9.122424856e-05f, -5.533162464e-04f, -6.806320721e-04f, +1.801472872e-04f, +1.196345405e-03f, +8.937550365e-04f, -9.007918871e-04f, -2.210926428e-03f, -8.556247074e-04f, +2.495011615e-03f, +3.980359535e-03f, +3.165794289e-04f, -6.903336548e-03f, -1.153277082e-02f, -8.457448808e-03f, +9.822571399e-04f, +9.663991810e-03f, +1.116513206e-02f, +5.533201255e-03f, -1.404861238e-03f, -4.043550276e-03f, -1.869018664e-03f, +1.336275342e-03f, +2.126003711e-03f, +5.195893246e-04f, -1.090519334e-03f, -1.067342593e-03f, +3.655074561e-05f, +7.331792745e-04f, +4.433395733e-04f, -1.935382675e-04f, -3.987934951e-04f, -1.229214328e-04f, +1.639344914e-04f, +1.641797458e-04f, +1.607065380e-06f, -8.312660570e-05f, -4.140964876e-05f, +1.721194565e-05f, - +2.420834805e-05f, +3.845865258e-05f, -5.291577035e-05f, -1.584475354e-04f, -1.288020430e-05f, +3.310245125e-04f, +2.970911118e-04f, -3.714402944e-04f, -8.009066393e-04f, +1.491478018e-06f, +1.251081896e-03f, +9.076298295e-04f, -1.150395214e-03f, -2.067058655e-03f, +1.122302159e-04f, +2.761034460e-03f, +1.714262142e-03f, -2.243798546e-03f, -3.509552640e-03f, +3.343157089e-04f, +4.177340741e-03f, +2.263733107e-03f, -3.077127272e-03f, -4.263636073e-03f, +5.560515546e-04f, +4.587581862e-03f, +2.178016822e-03f, -3.083415824e-03f, -3.801456149e-03f, +6.172201198e-04f, +3.697023187e-03f, +1.524831037e-03f, -2.253106908e-03f, -2.455585875e-03f, +4.722485472e-04f, +2.126892192e-03f, +7.438547548e-04f, -1.148058766e-03f, -1.081948821e-03f, +2.378849854e-04f, +7.998354702e-04f, +2.240947659e-04f, -3.582266926e-04f, -2.746236972e-04f, +6.554580609e-05f, +1.503786526e-04f, +2.797302899e-05f, -1.721194565e-05f, - /* 6,15 (48) */ - +1.510931022e-04f, +5.093468306e-04f, +2.157125405e-04f, -9.769720453e-04f, -1.586700837e-03f, +1.707328174e-04f, +3.121529075e-03f, +2.988160346e-03f, -2.183697815e-03f, -7.108460287e-03f, -3.681607029e-03f, +7.381519323e-03f, +1.291394069e-02f, +1.575355201e-03f, -1.770976289e-02f, -1.964783298e-02f, +7.043774239e-03f, +3.631011958e-02f, +2.544284532e-02f, -3.106104140e-02f, -7.452424539e-02f, -2.668905536e-02f, +1.264314461e-01f, +2.991150230e-01f, +3.681470969e-01f, +2.809358285e-01f, +1.036708015e-01f, -3.914102041e-02f, -7.276822754e-02f, -2.299464232e-02f, +2.981813382e-02f, +3.409825556e-02f, +2.685047373e-03f, -2.106961728e-02f, -1.571149621e-02f, +3.849255791e-03f, +1.305464115e-02f, +5.958972806e-03f, -4.681795133e-03f, -6.820134096e-03f, -1.373904706e-03f, +3.302458664e-03f, +2.825764439e-03f, -1.795107547e-04f, -1.619438411e-03f, -8.139903245e-04f, +3.116677919e-04f, +4.818170991e-04f, - -1.510931022e-04f, -6.604130498e-04f, -7.399011185e-04f, +1.056188726e-03f, +2.947197322e-03f, +5.303182322e-04f, -5.418888992e-03f, -5.686742643e-03f, +4.692534375e-03f, +1.316834138e-02f, +2.979587103e-03f, -1.751006338e-02f, -1.743651926e-02f, +1.156138780e-02f, +3.180196599e-02f, +7.497659026e-03f, -3.494975833e-02f, -3.322714904e-02f, +1.919679302e-02f, +5.141944693e-02f, +1.217357560e-02f, -4.878072178e-02f, -4.441996135e-02f, +2.298952949e-02f, +5.985536445e-02f, +1.408201163e-02f, -4.970650518e-02f, -4.339719917e-02f, +2.020136471e-02f, +5.112979559e-02f, +1.194326179e-02f, -3.701441998e-02f, -3.095246054e-02f, +1.274463663e-02f, +3.143316715e-02f, +7.339701665e-03f, -1.933738918e-02f, -1.543732735e-02f, +5.324990279e-03f, +1.292588768e-02f, +3.081180149e-03f, -6.282877715e-03f, -4.757536292e-03f, +1.138548671e-03f, +2.866501994e-03f, +7.453834406e-04f, -8.203301315e-04f, -4.818170991e-04f, - -2.336102954e-05f, -1.253239210e-05f, +5.014084945e-05f, +8.075517306e-05f, -2.140257552e-05f, -1.785214599e-04f, -1.421089314e-04f, +1.685272076e-04f, +4.062105010e-04f, +1.270869112e-04f, -5.184656751e-04f, -7.025179806e-04f, +1.065268205e-04f, +1.158510680e-03f, +9.663083127e-04f, -7.745420228e-04f, -2.193586529e-03f, -1.025727110e-03f, +2.292177099e-03f, +4.022753705e-03f, +6.964563701e-04f, -6.454643929e-03f, -1.144173426e-02f, -8.888315096e-03f, +3.277778787e-04f, +9.290879382e-03f, +1.131891039e-02f, +5.997321120e-03f, -1.059561482e-03f, -4.043645375e-03f, -2.083111403e-03f, +1.186136915e-03f, +2.165140336e-03f, +6.472422812e-04f, -1.031958370e-03f, -1.115389910e-03f, -3.417364024e-05f, +7.200285364e-04f, +4.817224287e-04f, -1.612392801e-04f, -4.035826075e-04f, -1.457711105e-04f, +1.536557052e-04f, +1.717221122e-04f, +1.133499855e-05f, -8.222654775e-05f, -4.581440195e-05f, +1.499733940e-05f, - +2.336102954e-05f, +4.015609728e-05f, -4.438067365e-05f, -1.567596241e-04f, -3.155727048e-05f, +3.135467573e-04f, +3.204820592e-04f, -3.226831859e-04f, -8.058829803e-04f, -8.125534378e-05f, +1.200978750e-03f, +9.962403305e-04f, -1.018351270e-03f, -2.100891351e-03f, -8.678704201e-05f, +2.674543436e-03f, +1.908679696e-03f, -2.013737730e-03f, -3.595489982e-03f, +1.409849475e-05f, +4.076700728e-03f, +2.554869886e-03f, -2.793451027e-03f, -4.399660011e-03f, +1.857454068e-04f, +4.507857853e-03f, +2.493092796e-03f, -2.828652722e-03f, -3.951088380e-03f, +3.037498356e-04f, +3.658041246e-03f, +1.773533212e-03f, -2.088618093e-03f, -2.572434168e-03f, +2.820117937e-04f, +2.120794780e-03f, +8.825186526e-04f, -1.076495704e-03f, -1.144424426e-03f, +1.611983499e-04f, +8.054712459e-04f, +2.734518864e-04f, -3.408706404e-04f, -2.946836819e-04f, +4.913805713e-05f, +1.540456612e-04f, +3.604833932e-05f, -1.499733940e-05f, - /* 7, 0 (48) */ - +0.000000000e+00f, -5.184284022e-04f, +3.212229602e-06f, +1.307536639e-03f, +8.360763470e-04f, -2.118986788e-03f, -2.852738276e-03f, +2.109164081e-03f, +6.105712658e-03f, -1.950685165e-05f, -9.834821711e-03f, -5.434403018e-03f, +1.219436233e-02f, +1.497172437e-02f, -1.025017254e-02f, -2.819089092e-02f, +4.350570367e-05f, +4.333632545e-02f, +2.439525774e-02f, -5.757751269e-02f, -7.936955118e-02f, +6.777629950e-02f, +3.088165774e-01f, +4.285159846e-01f, +3.088165774e-01f, +6.777629950e-02f, -7.936955118e-02f, -5.757751269e-02f, +2.439525774e-02f, +4.333632545e-02f, +4.350570367e-05f, -2.819089092e-02f, -1.025017254e-02f, +1.497172437e-02f, +1.219436233e-02f, -5.434403018e-03f, -9.834821711e-03f, -1.950685165e-05f, +6.105712658e-03f, +2.109164081e-03f, -2.852738276e-03f, -2.118986788e-03f, +8.360763470e-04f, +1.307536639e-03f, +3.212229602e-06f, -5.184284022e-04f, -1.234425141e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.184284022e-04f, -3.212229602e-06f, -1.888597505e-03f, -1.236145466e-03f, +3.592023527e-03f, +4.047052782e-03f, -4.982450802e-03f, -8.918259580e-03f, +4.834186303e-03f, +1.556156622e-02f, -1.810767405e-03f, -2.277524083e-02f, -4.954253986e-03f, +2.859390823e-02f, +1.529315124e-02f, -3.084300852e-02f, -2.774230592e-02f, +2.793154400e-02f, +3.977726494e-02f, -1.956380632e-02f, -4.852880250e-02f, +7.038976371e-03f, +5.173229864e-02f, +7.038976371e-03f, -4.852880250e-02f, -1.956380632e-02f, +3.977726494e-02f, +2.793154400e-02f, -2.774230592e-02f, -3.084300852e-02f, +1.529315124e-02f, +2.859390823e-02f, -4.954253986e-03f, -2.277524083e-02f, -1.810767405e-03f, +1.556156622e-02f, +4.834186303e-03f, -8.918259580e-03f, -4.982450802e-03f, +4.047052782e-03f, +3.592023527e-03f, -1.236145466e-03f, -1.888597505e-03f, +7.853369693e-05f, +5.184284022e-04f, +1.234425141e-04f, +0.000000000e+00f, - +0.000000000e+00f, +9.766062624e-06f, -7.181911347e-05f, -6.047305568e-05f, +1.229615697e-04f, +1.872149352e-04f, -1.276807758e-04f, -4.018886385e-04f, +4.093019403e-08f, +6.627019978e-04f, +3.564671675e-04f, -8.483450124e-04f, -1.005404870e-03f, +7.499465761e-04f, +1.925191887e-03f, -7.652224290e-05f, -2.959670128e-03f, -1.574929844e-03f, +3.739895539e-03f, +5.010649862e-03f, -3.168668398e-03f, -1.381200319e-02f, -1.379873723e-02f, -5.135232855e-04f, +1.328797511e-02f, +1.423518529e-02f, +3.899774043e-03f, -4.773157098e-03f, -4.036852200e-03f, +1.303312883e-03f, +3.039464840e-03f, +2.849068333e-04f, -1.900001413e-03f, -8.795212707e-04f, +9.423806704e-04f, +9.118244494e-04f, -2.937223500e-04f, -6.825130750e-04f, -4.583156740e-05f, +3.996724792e-04f, +1.541559783e-04f, -1.783731277e-04f, -1.350252974e-04f, +5.295984601e-05f, +7.600445101e-05f, -5.760175807e-06f, -2.762370518e-05f, +0.000000000e+00f, - +0.000000000e+00f, -9.766062624e-06f, +7.181911347e-05f, +1.023278982e-04f, -1.976870227e-04f, -2.974200642e-04f, +2.890575428e-04f, +6.463004974e-04f, -2.837752888e-04f, -1.144536630e-03f, +7.830175331e-05f, +1.720893812e-03f, +4.102685728e-04f, -2.237880283e-03f, -1.198305879e-03f, +2.523595232e-03f, +2.204745980e-03f, -2.428286484e-03f, -3.253878147e-03f, +1.885076851e-03f, +4.117691368e-03f, -9.485163500e-04f, -4.585739218e-03f, -2.087601736e-04f, +4.536250409e-03f, +1.343972107e-03f, -3.979342386e-03f, -2.219794955e-03f, +3.053928932e-03f, +2.678080675e-03f, -1.979513937e-03f, -2.682938861e-03f, +9.831294547e-04f, +2.318231147e-03f, -2.310718362e-04f, -1.744439505e-03f, -2.092633706e-04f, +1.136155430e-03f, +3.673118035e-04f, -6.267404753e-04f, -3.348125527e-04f, +2.796685582e-04f, +2.185893392e-04f, -9.151332350e-05f, -1.016996062e-04f, +5.760175807e-06f, +2.762370518e-05f, +0.000000000e+00f, - /* 7, 1 (48) */ - +0.000000000e+00f, -5.086623395e-04f, -6.860688387e-05f, +1.247063583e-03f, +9.590379168e-04f, -1.931771853e-03f, -2.980419051e-03f, +1.707275443e-03f, +6.105753588e-03f, +6.431951462e-04f, -9.478354543e-03f, -6.282748031e-03f, +1.118895746e-02f, +1.572167095e-02f, -8.324980651e-03f, -2.826741316e-02f, -2.916164424e-03f, +4.176139561e-02f, +2.813515328e-02f, -5.256686283e-02f, -8.253821958e-02f, +5.396429631e-02f, +2.950178402e-01f, +4.280024613e-01f, +3.221045525e-01f, +8.201148479e-02f, -7.546977714e-02f, -6.235066979e-02f, +2.035840554e-02f, +4.463963834e-02f, +3.082970544e-03f, -2.790598409e-02f, -1.215017395e-02f, +1.409220310e-02f, +1.313674300e-02f, -4.522578569e-03f, -1.012854406e-02f, -7.020199266e-04f, +6.059881091e-03f, +2.508836561e-03f, -2.698582297e-03f, -2.297359916e-03f, +7.010510496e-04f, +1.360496485e-03f, +7.921668061e-05f, -5.241885780e-04f, -1.510662193e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.086623395e-04f, +6.860688387e-05f, -1.786269607e-03f, -1.433832489e-03f, +3.294603463e-03f, +4.336110325e-03f, -4.336150304e-03f, -9.202034869e-03f, +3.689649672e-03f, +1.563986797e-02f, -8.987359339e-05f, -2.236497226e-02f, -7.192134268e-03f, +2.739560235e-02f, +1.781674647e-02f, -2.863826254e-02f, -3.017059240e-02f, +2.467766585e-02f, +4.166234180e-02f, -1.544611496e-02f, -4.947731885e-02f, +2.453237153e-03f, +5.152353847e-02f, +1.157522678e-02f, -4.718483039e-02f, -2.354314871e-02f, +3.755746999e-02f, +3.098547293e-02f, -2.506422524e-02f, -3.282252246e-02f, +1.261021237e-02f, +2.957703769e-02f, -2.636022839e-03f, -2.300631267e-02f, -3.555206910e-03f, +1.535230285e-02f, +5.970341733e-03f, -8.550947777e-03f, -5.609191277e-03f, +3.712240230e-03f, +3.871692085e-03f, -1.017556127e-03f, -1.980110829e-03f, -2.316590932e-05f, +5.241885780e-04f, +1.510662193e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.343661977e-05f, -6.725204694e-05f, -6.715287147e-05f, +1.104439513e-04f, +1.942922012e-04f, -1.011733331e-04f, -4.010419751e-04f, -4.434671800e-05f, +6.386092476e-04f, +4.148794920e-04f, -7.804055004e-04f, -1.059549598e-03f, +6.182707865e-04f, +1.935996551e-03f, +1.271031969e-04f, -2.861106379e-03f, -1.828004523e-03f, +3.426330156e-03f, +5.206317386e-03f, -2.449785430e-03f, -1.334314888e-02f, -1.425157367e-02f, -1.538308694e-03f, +1.272108488e-02f, +1.460989809e-02f, +4.639603441e-03f, -4.493920170e-03f, -4.314675244e-03f, +1.014541025e-03f, +3.099423254e-03f, +4.966642856e-04f, -1.860242573e-03f, -1.005985252e-03f, +8.707132496e-04f, +9.702479273e-04f, -2.269977574e-04f, -6.977656499e-04f, -9.271572658e-05f, +3.943097584e-04f, +1.803878146e-04f, -1.677708782e-04f, -1.465159276e-04f, +4.463969354e-05f, +7.975035777e-05f, -1.439082229e-06f, -2.863621876e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.343661977e-05f, +6.725204694e-05f, +1.116228722e-04f, -1.760565584e-04f, -3.118785642e-04f, +2.425642658e-04f, +6.597919536e-04f, -2.003800356e-04f, -1.143213222e-03f, -5.012793022e-05f, +1.683708230e-03f, +5.826009958e-04f, -2.140599143e-03f, -1.400372094e-03f, +2.345782207e-03f, +2.409356830e-03f, -2.161148111e-03f, -3.425650924e-03f, +1.537159529e-03f, +4.221775386e-03f, -5.466049358e-04f, -4.597704255e-03f, -6.245539774e-04f, +4.449587916e-03f, +1.729674275e-03f, -3.807712082e-03f, -2.538446195e-03f, +2.827239875e-03f, +2.908274395e-03f, -1.735306302e-03f, -2.822226078e-03f, +7.564539392e-04f, +2.380676125e-03f, -4.639975854e-05f, -1.753844383e-03f, -3.416912839e-04f, +1.117877985e-03f, +4.502613259e-04f, -6.010806214e-04f, -3.793884526e-04f, +2.586479351e-04f, +2.385297552e-04f, -7.920246515e-05f, -1.088454893e-04f, +1.439082229e-06f, +2.863621876e-05f, +0.000000000e+00f, - /* 7, 2 (48) */ - +0.000000000e+00f, -4.952257198e-04f, -1.358589308e-04f, +1.179910712e-03f, +1.069481868e-03f, -1.737479652e-03f, -3.081592384e-03f, +1.306233468e-03f, +6.061406870e-03f, +1.281804394e-03f, -9.063475051e-03f, -7.063153531e-03f, +1.012940786e-02f, +1.633994173e-02f, -6.388984100e-03f, -2.814030997e-02f, -5.777270803e-03f, +3.993339109e-02f, +3.156148343e-02f, -4.736054545e-02f, -8.498800501e-02f, +4.062114743e-02f, +2.807662665e-01f, +4.264641526e-01f, +3.348256374e-01f, +9.662138288e-02f, -7.083017370e-02f, -6.684458996e-02f, +1.604373029e-02f, +4.565417936e-02f, +6.182393798e-03f, -2.740931980e-02f, -1.401041652e-02f, +1.308621785e-02f, +1.400745625e-02f, -3.552330642e-03f, -1.035554182e-02f, -1.399785577e-03f, +5.967165364e-03f, +2.903146319e-03f, -2.518194483e-03f, -2.465130794e-03f, +5.545351220e-04f, +1.405136178e-03f, +1.589670384e-04f, -5.256276602e-04f, -1.797024380e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.952257198e-04f, +1.358589308e-04f, -1.674646735e-03f, -1.609889047e-03f, +2.982724899e-03f, +4.578674591e-03f, -3.676358351e-03f, -9.402414905e-03f, +2.546436450e-03f, +1.558974004e-02f, +1.593834637e-03f, -2.178237126e-02f, -9.332733411e-03f, +2.599523026e-02f, +2.016252867e-02f, -2.622890571e-02f, -3.233174051e-02f, +2.125201493e-02f, +4.319950132e-02f, -1.122433957e-02f, -5.002392379e-02f, -2.144467102e-03f, +5.089898449e-02f, +1.602481470e-02f, -4.545515612e-02f, -2.735086079e-02f, +3.501902379e-02f, +3.381271281e-02f, -2.215595085e-02f, -3.455782876e-02f, +9.787986297e-03f, +3.033349163e-02f, -2.553467138e-04f, -2.305271243e-02f, -5.309051293e-03f, +1.501061156e-02f, +7.088219717e-03f, -8.100686451e-03f, -6.210271898e-03f, +3.332851777e-03f, +4.130340021e-03f, -7.790263715e-04f, -2.059313294e-03f, -1.320113986e-04f, +5.256276602e-04f, +1.797024380e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.675588491e-05f, -6.236171686e-05f, -7.298096997e-05f, +9.759077119e-05f, +1.996149864e-04f, -7.483801030e-05f, -3.972370981e-04f, -8.704165206e-05f, +6.105359519e-04f, +4.686481720e-04f, -7.086191726e-04f, -1.104649127e-03f, +4.854938715e-04f, +1.932695959e-03f, +3.246504017e-04f, -2.744943539e-03f, -2.061309057e-03f, +3.098718631e-03f, +5.360321239e-03f, -1.746493787e-03f, -1.283161796e-02f, -1.464498729e-02f, -2.556322706e-03f, +1.210015645e-02f, +1.493356050e-02f, +5.384545525e-03f, -4.173266846e-03f, -4.570894266e-03f, +7.101556934e-04f, +3.138590688e-03f, +7.103494024e-04f, -1.805834501e-03f, -1.128326476e-03f, +7.907093813e-04f, +1.023041899e-03f, -1.566860867e-04f, -7.082100232e-04f, -1.403660523e-04f, +3.857389280e-04f, +2.061598898e-04f, -1.554269116e-04f, -1.573143649e-04f, +3.554727186e-05f, +8.300046623e-05f, +3.172941354e-06f, -2.940939777e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.675588491e-05f, +6.236171686e-05f, +1.193909001e-04f, -1.539281953e-04f, -3.230510926e-04f, +1.957644976e-04f, +6.672984590e-04f, -1.178320026e-04f, -1.132455450e-03f, -1.750068552e-04f, +1.633489118e-03f, +7.467647766e-04f, -2.027489676e-03f, -1.587851634e-03f, +2.151220976e-03f, +2.591892616e-03f, -1.879045199e-03f, -3.568057956e-03f, +1.179002679e-03f, +4.290901969e-03f, -1.415792325e-04f, -4.572109842e-03f, -1.035182771e-03f, +4.326413757e-03f, +2.102396482e-03f, -3.604068283e-03f, -2.838279978e-03f, +2.575484564e-03f, +3.116755210e-03f, -1.473948446e-03f, -2.940019494e-03f, +5.200131665e-04f, +2.424376583e-03f, +1.422846034e-04f, -1.748719610e-03f, -4.744814268e-04f, +1.089595050e-03f, +5.318792988e-04f, -5.693439858e-04f, -4.223391725e-04f, +2.344139914e-04f, +2.572731998e-04f, -6.543514523e-05f, -1.153866087e-04f, -3.172941354e-06f, +2.940939777e-05f, +0.000000000e+00f, - /* 7, 3 (48) */ - +0.000000000e+00f, -4.784698349e-04f, -1.982206477e-04f, +1.106929742e-03f, +1.167072639e-03f, -1.537864666e-03f, -3.156430395e-03f, +9.089963697e-04f, +5.974365218e-03f, +1.892340346e-03f, -8.594826879e-03f, -7.771772704e-03f, +9.024758730e-03f, +1.682543560e-02f, -4.456288141e-03f, -2.781565957e-02f, -8.522214343e-03f, +3.787208203e-02f, +3.466020206e-02f, -4.200022421e-02f, -8.673449879e-02f, +2.778952947e-02f, +2.661212792e-01f, +4.239078299e-01f, +3.469257938e-01f, +1.115549434e-01f, -6.544562817e-02f, -7.101785681e-02f, +1.147283603e-02f, +4.636433506e-02f, +9.320984485e-03f, -2.669897040e-02f, -1.581625102e-02f, +1.195789137e-02f, +1.479816563e-02f, -2.529288742e-03f, -1.051222790e-02f, -2.107995600e-03f, +5.826799312e-03f, +3.288885247e-03f, -2.312034593e-03f, -2.620557706e-03f, +3.972207571e-04f, +1.440683450e-03f, +2.419675046e-04f, -5.224547188e-04f, -2.091118358e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.784698349e-04f, +1.982206477e-04f, -1.555255835e-03f, -1.763817242e-03f, +2.659673806e-03f, +4.774439089e-03f, -3.009059891e-03f, -9.520246907e-03f, +1.413981001e-03f, +1.541473318e-02f, +3.227323755e-03f, -2.103560649e-02f, -1.136022309e-02f, +2.440737863e-02f, +2.231374965e-02f, -2.363701309e-02f, -3.421078571e-02f, +1.768395697e-02f, +4.437850400e-02f, -6.933437601e-03f, -5.016550302e-02f, -6.716576944e-03f, +4.986380172e-02f, +2.035122845e-02f, -4.335275964e-02f, -3.095492907e-02f, +3.218074382e-02f, +3.638819737e-02f, -1.903919564e-02f, -3.603177721e-02f, +6.847966803e-03f, +3.085350479e-02f, +2.169029869e-03f, -2.291042782e-02f, -7.057770904e-03f, +1.453613013e-02f, +8.177814767e-03f, -7.568807152e-03f, -6.779615884e-03f, +2.910512605e-03f, +4.364754012e-03f, -5.217531717e-04f, -2.124748439e-03f, -2.473980074e-04f, +5.224547188e-04f, +2.091118358e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.971202353e-05f, -5.720679688e-05f, -7.794699392e-05f, +8.451853313e-05f, +2.032069447e-04f, -4.887100603e-05f, -3.905980408e-04f, -1.277755383e-04f, +5.788045953e-04f, +5.175048575e-04f, -6.336116937e-04f, -1.140607739e-03f, +3.525991669e-04f, +1.915664365e-03f, +5.148751356e-04f, -2.612443858e-03f, -2.273779436e-03f, +2.759644501e-03f, +5.473060168e-03f, -1.062014672e-03f, -1.228058610e-02f, -1.497778787e-02f, -3.563091276e-03f, +1.142756215e-02f, +1.520382378e-02f, +6.130896128e-03f, -3.811774186e-03f, -4.803110104e-03f, +3.918457334e-04f, +3.156134378e-03f, +9.244669781e-04f, -1.736801056e-03f, -1.245537879e-03f, +7.027458309e-04f, +1.069660072e-03f, -8.321807681e-05f, -7.136263213e-04f, -1.884393493e-04f, +3.739218118e-04f, +2.312521275e-04f, -1.413749376e-04f, -1.673026491e-04f, +2.572550181e-05f, +8.570032428e-05f, +8.047512082e-06f, -2.991934502e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.971202353e-05f, +5.720679688e-05f, +1.256399360e-04f, -1.315266148e-04f, -3.309743637e-04f, +1.490773181e-04f, +6.689535921e-04f, -3.680922803e-05f, -1.112607779e-03f, -2.953707904e-04f, +1.570940809e-03f, +9.015498578e-04f, -1.899768601e-03f, -1.759413283e-03f, +1.941750497e-03f, +2.751101370e-03f, -1.584459375e-03f, -3.680165329e-03f, +8.136323987e-04f, +4.324674288e-03f, +2.632043609e-04f, -4.509234495e-03f, -1.437251817e-03f, +4.167696725e-03f, +2.459011507e-03f, -3.369953529e-03f, -3.116686908e-03f, +2.300561152e-03f, +3.301574000e-03f, -1.197431855e-03f, -3.035045686e-03f, +2.756505008e-04f, +2.448640478e-03f, +3.334555235e-04f, -1.728794241e-03f, -6.065002292e-04f, +1.051282896e-03f, +6.114111721e-04f, -5.316094506e-04f, -4.632174361e-04f, +2.070551399e-04f, +2.745855725e-04f, -5.026807306e-05f, -1.212155758e-04f, -8.047512082e-06f, +2.991934502e-05f, +0.000000000e+00f, - /* 7, 4 (48) */ - +0.000000000e+00f, -4.587578113e-04f, -2.554274445e-04f, +1.028982748e-03f, +1.251591172e-03f, -1.334657721e-03f, -3.205301401e-03f, +5.183983289e-04f, +5.846589680e-03f, +2.471144941e-03f, -8.077322022e-03f, -8.405384397e-03f, +7.884150992e-03f, +1.717803477e-02f, -2.540623776e-03f, -2.730078443e-02f, -1.113465820e-02f, +3.559830260e-02f, +3.741984656e-02f, -3.652716404e-02f, -8.779651347e-02f, +1.550894337e-02f, +2.511434913e-01f, +4.203447386e-01f, +3.583533560e-01f, +1.267587672e-01f, -5.931473204e-02f, -7.482963099e-02f, +6.669725923e-03f, +4.675618079e-02f, +1.247711886e-02f, -2.577450342e-02f, -1.755305208e-02f, +1.071235349e-02f, +1.550091146e-02f, -1.459628670e-03f, -1.059544598e-02f, -2.821621921e-03f, +5.638359962e-03f, +3.662807059e-03f, -2.080782465e-03f, -2.761932644e-03f, +2.299181080e-04f, +1.466408952e-03f, +3.276678289e-04f, -5.144072068e-04f, -2.390311808e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.587578113e-04f, +2.554274445e-04f, -1.429615899e-03f, -1.895343857e-03f, +2.328699442e-03f, +4.923516407e-03f, -2.340106299e-03f, -9.557056136e-03f, +3.013732217e-04f, +1.511936239e-02f, +4.798264564e-03f, -2.013405663e-02f, -1.325999169e-02f, +2.264796534e-02f, +2.425550015e-02f, -2.088591172e-02f, -3.579524509e-02f, +1.400379164e-02f, +4.519213640e-02f, -2.608763314e-03f, -4.990229866e-02f, -1.122581144e-02f, +4.842654990e-02f, +2.451892518e-02f, -4.089374813e-02f, -3.432488260e-02f, +2.906405691e-02f, +3.868875852e-02f, -1.573762164e-02f, -3.722920906e-02f, +3.812921116e-03f, +3.112915529e-02f, +4.617670347e-03f, -2.257697230e-02f, -8.786565145e-03f, +1.392962991e-02f, +9.229097663e-03f, -6.957395980e-03f, -7.311225335e-03f, +2.447295169e-03f, +4.571809152e-03f, -2.471675992e-04f, -2.175016512e-03f, -3.686135832e-04f, +5.144072068e-04f, +2.390311808e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.229725832e-05f, -5.184563309e-05f, -8.204832773e-05f, +7.134101637e-05f, +2.051046652e-04f, -2.345906927e-05f, -3.812667058e-04f, -1.663028728e-04f, +5.437559948e-04f, +5.612248810e-04f, -5.560161944e-04f, -1.167398706e-03f, +2.205466708e-04f, +1.885364845e-03f, +6.966149643e-04f, -2.464951107e-03f, -2.464518670e-03f, +2.411695707e-03f, +5.545163282e-03f, -3.994057809e-04f, -1.169338969e-02f, -1.524909670e-02f, -4.554200443e-03f, +1.070594523e-02f, +1.541858668e-02f, +6.874877781e-03f, -3.410269646e-03f, -5.009011453e-03f, +6.143968142e-05f, +3.151352185e-03f, +1.137481256e-03f, -1.653273170e-03f, -1.356624929e-03f, +6.072682878e-04f, +1.109588240e-03f, -7.060227675e-06f, -7.138270327e-04f, -2.365788148e-04f, +3.588446341e-04f, +2.554424378e-04f, -1.256638951e-04f, -1.763650054e-04f, +1.522550372e-05f, +8.779798166e-05f, +1.315223083e-05f, -3.014369114e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.229725832e-05f, +5.184563309e-05f, +1.303924354e-04f, -1.090690042e-04f, -3.357132912e-04f, +1.029057219e-04f, +6.649381238e-04f, +4.204338890e-05f, -1.084083954e-03f, -4.103172188e-04f, +1.496857454e-03f, +1.045849078e-03f, -1.758755042e-03f, -1.913880253e-03f, +1.719310276e-03f, +2.885941360e-03f, -1.279952204e-03f, -3.761300367e-03f, +4.441151534e-04f, +4.322993071e-03f, +6.644028583e-04f, -4.409668015e-03f, -1.827438844e-03f, +3.974704598e-03f, +2.796518107e-03f, -3.107173204e-03f, -3.371221869e-03f, +2.004577893e-03f, +3.460963170e-03f, -9.078988784e-04f, -3.106208297e-03f, +2.530449539e-05f, +2.452930830e-03f, +5.255367885e-04f, -1.693920083e-03f, -7.365940119e-04f, +1.003005735e-03f, +6.880989818e-04f, -4.880127681e-04f, -5.015789302e-04f, +1.766928219e-04f, +2.902361166e-04f, -3.377506652e-05f, -1.262264773e-04f, -1.315223083e-05f, +3.014369114e-05f, +0.000000000e+00f, - /* 7, 5 (48) */ - +0.000000000e+00f, -4.364605530e-04f, -3.072730776e-04f, +9.469344199e-04f, +1.322932189e-03f, -1.129553056e-03f, -3.228760470e-03f, +1.371316231e-04f, +5.680286807e-03f, +3.014900936e-03f, -7.516097141e-03f, -8.961400592e-03f, +6.716752286e-03f, +1.739858144e-02f, -6.552589311e-04f, -2.660416947e-02f, -1.359960931e-02f, +3.313378393e-02f, +3.983154227e-02f, -3.098200076e-02f, -8.819591925e-02f, +3.815553680e-03f, +2.358943946e-01f, +4.157905382e-01f, +3.690593012e-01f, +1.421773538e-01f, -5.243985426e-02f, -7.823990064e-02f, +1.660714471e-03f, +4.681762047e-02f, +1.562847105e-02f, -2.463702217e-02f, -1.920632525e-02f, +9.355728563e-03f, +1.610817975e-02f, -3.500404306e-04f, -1.060250621e-02f, -3.535448954e-03f, +5.401781148e-03f, +4.021651693e-03f, -1.825340028e-03f, -2.887596539e-03f, +5.355310260e-05f, +1.481634456e-03f, +4.154658105e-04f, -5.012549759e-04f, -2.691748720e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.364605530e-04f, +3.072730776e-04f, -1.299223464e-03f, -2.004412861e-03f, +1.992986151e-03f, +5.026422129e-03f, -1.675168176e-03f, -9.515012747e-03f, -7.827107325e-04f, +1.470904517e-02f, +6.295122018e-03f, -1.908820755e-02f, -1.501874673e-02f, +2.073408509e-02f, +2.597481042e-02f, -1.799997036e-02f, -3.707519729e-02f, +1.024249128e-02f, +4.563625156e-02f, +1.714229757e-03f, -4.923789580e-02f, -1.563547945e-02f, +4.659911106e-02f, +2.849362978e-02f, -3.809723002e-02f, -3.743205581e-02f, +2.569283504e-02f, +4.069333641e-02f, -1.227665847e-02f, -3.813710794e-02f, +7.067128194e-04f, +3.115445979e-02f, +7.070601177e-03f, -2.205143551e-02f, -1.048048523e-02f, +1.319303589e-02f, +1.023210340e-02f, -6.269296998e-03f, -7.799238103e-03f, +1.945716238e-03f, +4.748501974e-03f, +4.306851739e-05f, -2.208791579e-03f, -4.948400605e-04f, +5.012549759e-04f, +2.691748720e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.450776296e-05f, -4.633573213e-05f, -8.528981405e-05f, +5.816843057e-05f, +2.053569289e-04f, +1.221672470e-06f, -3.694012142e-04f, -2.024022021e-04f, +5.057462146e-04f, +5.996277874e-04f, -4.764683979e-04f, -1.185062795e-03f, +9.026666474e-05f, +1.842343909e-03f, +8.687954834e-04f, -2.303879485e-03f, -2.632798804e-03f, +2.057448314e-03f, +5.577481931e-03f, +2.384536114e-04f, -1.107350569e-02f, -1.545834947e-02f, -5.525319863e-03f, +9.938206779e-03f, +1.557600927e-02f, +7.612660200e-03f, -2.969830662e-03f, -5.186391212e-03f, -2.791030453e-04f, +3.123680586e-03f, +1.347825884e-03f, -1.555490471e-03f, -1.460613257e-03f, +5.047897562e-04f, +1.142348993e-03f, +7.128781453e-05f, -7.086593613e-04f, -2.844164418e-04f, +3.405188824e-04f, +2.785084545e-04f, -1.083580776e-04f, -1.843889131e-04f, +4.106474726e-06f, +8.924457674e-05f, +1.845081486e-05f, -3.006190168e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.450776296e-05f, +4.633573213e-05f, +1.336844431e-04f, -8.676328082e-05f, -3.373592935e-04f, +5.763349266e-05f, +6.554768997e-04f, +1.181188622e-04f, -1.047361566e-03f, -5.190117488e-04f, +1.412114242e-03f, +1.178665739e-03f, -1.605857472e-03f, -2.050237899e-03f, +1.485922522e-03f, +2.995587507e-03f, -9.681426814e-04f, -3.811055189e-03f, +7.353155228e-05f, +4.286055964e-03f, +1.058714921e-03f, -4.274305924e-03f, -2.202522148e-03f, +3.748993771e-03f, +3.112066827e-03f, -2.817781351e-03f, -3.599625827e-03f, +1.689836756e-03f, +3.593353469e-03f, -6.076260051e-04f, -3.152599747e-03f, -2.290064906e-04f, +2.436872970e-03f, +7.169145526e-04f, -1.644075557e-03f, -8.635987773e-04f, +9.449173978e-04f, +7.611881432e-04f, -4.387470956e-04f, -5.369865850e-04f, +1.434816127e-04f, +3.039998545e-04f, -1.604710306e-05f, -1.303161153e-04f, -1.845081486e-05f, +3.006190168e-05f, +0.000000000e+00f, - /* 7, 6 (48) */ - +0.000000000e+00f, -4.119527900e-04f, -3.536088098e-04f, +8.616446058e-04f, +1.381100619e-03f, -9.241961269e-04f, -3.227538798e-03f, -2.322695911e-04f, +5.477884605e-03f, +3.520647150e-03f, -6.916469353e-03f, -9.437868990e-03f, +5.531689491e-03f, +1.748884811e-02f, +1.187084978e-03f, -2.573537398e-02f, -1.590348879e-02f, +3.050098512e-02f, +4.188899058e-02f, -2.540451883e-02f, -8.795746564e-02f, -7.257952015e-03f, +2.204360452e-01f, +4.102652183e-01f, +3.789975080e-01f, +1.577533631e-01f, -4.482719406e-02f, -8.120973130e-02f, -3.525676742e-03f, +4.653851743e-02f, +1.875215164e-02f, -2.328919628e-02f, -2.076181572e-02f, +7.895115306e-03f, +1.661296950e-02f, +7.923085621e-04f, -1.053121839e-02f, -4.244108315e-03f, +5.117364706e-03f, +4.362170575e-03f, -1.546831573e-03f, -2.995954616e-03f, -1.308358105e-04f, +1.485740930e-03f, +5.047103873e-04f, -4.828041611e-04f, -2.992367736e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.119527900e-04f, +3.536088098e-04f, -1.165539020e-03f, -2.091176142e-03f, +1.655626858e-03f, +5.084055621e-03f, -1.019691276e-03f, -9.396893884e-03f, -1.830072298e-03f, +1.419003343e-02f, +7.707236260e-03f, -1.790954181e-02f, -1.662460420e-02f, +1.868384719e-02f, +2.746073294e-02f, -1.500438286e-02f, -3.804333997e-02f, +6.431436087e-03f, +4.570978311e-02f, +6.000285721e-03f, -4.817918088e-02f, -1.990978538e-02f, +4.439658891e-02f, +3.224262355e-02f, -3.498516320e-02f, -4.024983716e-02f, +2.209320921e-02f, +4.238317317e-02f, -8.683305000e-03f, -3.874473394e-02f, -2.445886927e-03f, +3.092545330e-02f, +9.507474147e-03f, -2.133452096e-02f, -1.212456078e-02f, +1.232943712e-02f, +1.117702080e-02f, -5.508108855e-03f, -8.237985198e-03f, +1.408729653e-03f, +4.891983586e-03f, +3.470683719e-04f, -2.224838682e-03f, -6.251561758e-04f, +4.828041611e-04f, +2.992367736e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.634352250e-05f, -4.073327675e-05f, -8.768341605e-05f, +4.510663056e-05f, +2.040238912e-04f, +2.500676342e-05f, -3.551741776e-04f, -2.358771244e-04f, +4.651434485e-04f, +6.325775162e-04f, -3.956018474e-04f, -1.193706305e-03f, -3.734630268e-05f, +1.787225627e-03f, +1.030435793e-03f, -2.130702271e-03f, -2.778061776e-03f, +1.699450608e-03f, +5.571080366e-03f, +8.488763033e-04f, -1.042453100e-02f, -1.560529730e-02f, -6.472225843e-03f, +9.127491098e-03f, +1.567452535e-02f, +8.340381297e-03f, -2.491782711e-03f, -5.333162472e-03f, -6.277020005e-04f, +3.072701901e-03f, +1.553914313e-03f, -1.443802159e-03f, -1.556556319e-03f, +3.958884027e-04f, +1.167506265e-03f, +1.512961948e-04f, -6.980073717e-04f, -3.315755797e-04f, +3.189819924e-04f, +3.002293292e-04f, -8.953713388e-05f, -1.912661842e-04f, -7.564510283e-06f, +8.999491795e-05f, +2.390327373e-05f, -2.965557857e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.634352250e-05f, +4.073327675e-05f, +1.355645836e-04f, -6.480648075e-05f, -3.360284079e-04f, +1.362236142e-05f, +6.408354129e-04f, +1.908524170e-04f, -1.002976181e-03f, -6.206937747e-04f, +1.317658095e-03f, +1.299120064e-03f, -1.442560106e-03f, -2.167639909e-03f, +1.243673803e-03f, +3.079435871e-03f, -6.516844366e-04f, -3.829287972e-03f, -2.950498220e-04f, +4.214354349e-03f, +1.442908639e-03f, -4.104341299e-03f, -2.559407831e-03f, +3.492396405e-03f, +3.402984597e-03f, -2.504064289e-03f, -3.799846157e-03f, +1.358815244e-03f, +3.697389241e-03f, -2.990057852e-04f, -3.173511451e-03f, -4.852005956e-04f, +2.400260476e-03f, +9.059507605e-04f, -1.579368513e-03f, -9.863503137e-04f, +8.772622431e-04f, +8.299343997e-04f, -3.840630086e-04f, -5.690149289e-04f, +1.076090043e-04f, +3.156600646e-04f, +2.807807247e-06f, -1.333852764e-04f, -2.390327373e-05f, +2.965557857e-05f, +0.000000000e+00f, - /* 7, 7 (48) */ - +0.000000000e+00f, -3.856092675e-04f, -3.943420865e-04f, +7.739611898e-04f, +1.426207250e-03f, -7.201722357e-04f, -3.202532034e-03f, -5.874437687e-04f, +5.242007481e-03f, +3.985790599e-03f, -6.283891837e-03f, -9.833470837e-03f, +4.337983186e-03f, +1.745150180e-02f, +2.974310605e-03f, -2.470493819e-02f, -1.803419106e-02f, +2.772292335e-02f, +4.358844119e-02f, -1.983343846e-02f, -8.710858933e-02f, -1.768248302e-02f, +2.048307479e-01f, +4.037929925e-01f, +3.881249991e-01f, +1.734278885e-01f, -3.648681276e-02f, -8.370151401e-02f, -8.858839214e-03f, +4.591081542e-02f, +2.182485354e-02f, -2.173528197e-02f, -2.220561788e-02f, +6.338558987e-03f, +1.700885791e-02f, +1.959814827e-03f, -1.037992220e-02f, -4.942115687e-03f, +4.785789126e-03f, +4.681152568e-03f, -1.246602244e-03f, -3.085491750e-03f, -3.221019947e-04f, +1.478176420e-03f, +5.947053052e-04f, -4.589008873e-04f, -3.288923522e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.856092675e-04f, +3.943420865e-04f, -1.029974437e-03f, -2.155982623e-03f, +1.319598450e-03f, +5.097677983e-03f, -3.788558631e-04f, -9.206041467e-03f, -2.833048479e-03f, +1.356933965e-02f, +9.024894355e-03f, -1.661042175e-02f, -1.806716431e-02f, +1.651620728e-02f, +2.870440675e-02f, -1.192494699e-02f, -3.869502441e-02f, +2.602148116e-03f, +4.541473329e-02f, +1.021464007e-02f, -4.673627224e-02f, -2.401412668e-02f, +4.183718108e-02f, +3.573501995e-02f, -3.158217860e-02f, -4.275390145e-02f, +1.829336305e-02f, +4.374198841e-02f, -4.985915759e-03f, -3.904373973e-02f, -5.619398378e-03f, +3.044025270e-02f, +1.190773462e-02f, -2.042857020e-02f, -1.370392930e-02f, +1.134308680e-02f, +1.205428304e-02f, -4.678174456e-03f, -8.622048207e-03f, +8.397147245e-04f, +4.999592591e-03f, +6.627284365e-04f, -2.222030875e-03f, -7.585414522e-04f, +4.589008873e-04f, +3.288923522e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.780816287e-05f, -3.509267250e-05f, -8.924783014e-05f, +3.225639524e-05f, +2.011761977e-04f, +4.774434328e-05f, -3.387709059e-04f, -2.665570676e-04f, +4.223248927e-04f, +6.599822455e-04f, -3.140432681e-04f, -1.193498675e-03f, -1.614390333e-04f, +1.720705346e-03f, +1.180653198e-03f, -1.946940336e-03f, -2.899919139e-03f, +1.340207678e-03f, +5.527225233e-03f, +1.429379508e-03f, -9.750161122e-03f, -1.569000598e-02f, -7.390823752e-03f, +8.277169662e-03f, +1.571285342e-02f, +9.054168626e-03f, -1.977695812e-03f, -5.447374015e-03f, -9.821665543e-04f, +2.998150671e-03f, +1.754150570e-03f, -1.318667112e-03f, -1.643543036e-03f, +2.812048656e-04f, +1.184669683e-03f, +2.324080947e-04f, -6.817939050e-04f, -3.776736345e-04f, +2.942978454e-04f, +3.203875692e-04f, -6.929594067e-05f, -1.968940433e-04f, -1.971277493e-05f, +9.000805441e-05f, +2.946612832e-05f, -2.890875247e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.780816287e-05f, +3.509267250e-05f, +1.360929656e-04f, -4.338331920e-05f, -3.318592401e-04f, -2.879053179e-05f, +6.213161109e-04f, +2.597252849e-04f, -9.515151096e-04f, -7.146813517e-04f, +1.214497919e-03f, +1.406454515e-03f, -1.270408862e-03f, -2.265412945e-03f, +9.946964071e-04f, +3.137106184e-03f, -3.332428752e-04f, -3.816121917e-03f, -6.585983085e-04f, +4.108667669e-03f, +1.813848623e-03f, -3.901254063e-03f, -2.895155927e-03f, +3.207005202e-03f, +3.666797860e-03f, -2.168522171e-03f, -3.970055315e-03f, +1.014146564e-03f, +3.771941957e-03f, +1.547244324e-05f, -3.168442424e-03f, -7.411495481e-04f, +2.343059715e-03f, +1.090997027e-03f, -1.500037935e-03f, -1.103694528e-03f, +8.003752606e-04f, +8.936108672e-04f, -3.242679756e-04f, -5.972544766e-04f, +6.929486011e-05f, +3.250107733e-04f, +2.266493267e-05f, -1.353400191e-04f, -2.946612832e-05f, +2.890875247e-05f, +0.000000000e+00f, - /* 7, 8 (48) */ - +0.000000000e+00f, -3.578011047e-04f, -4.294347590e-04f, +6.847133596e-04f, +1.458463645e-03f, -5.189960380e-04f, -3.154787691e-03f, -9.262146746e-04f, +4.975450413e-03f, +4.408115492e-03f, -5.623909592e-03f, -1.014751411e-02f, +3.144484510e-03f, +1.729006277e-02f, +4.695015951e-03f, -2.352428499e-02f, -1.998113140e-02f, +2.482300421e-02f, +4.492864887e-02f, -1.430621323e-02f, -8.567920983e-02f, -2.743264414e-02f, +1.891407419e-01f, +3.964021687e-01f, +3.964021687e-01f, +1.891407419e-01f, -2.743264414e-02f, -8.567920983e-02f, -1.430621323e-02f, +4.492864887e-02f, +2.482300421e-02f, -1.998113140e-02f, -2.352428499e-02f, +4.695015951e-03f, +1.729006277e-02f, +3.144484510e-03f, -1.014751411e-02f, -5.623909592e-03f, +4.408115492e-03f, +4.975450413e-03f, -9.262146746e-04f, -3.154787691e-03f, -5.189960380e-04f, +1.458463645e-03f, +6.847133596e-04f, -4.294347590e-04f, -3.578011047e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.578011047e-04f, +4.294347590e-04f, -8.938814713e-04f, -2.199365942e-03f, +9.877392098e-04f, +5.068887451e-03f, +2.424602479e-04f, -8.946316183e-03f, -3.784563588e-03f, +1.285465830e-02f, +1.023939227e-02f, -1.520396723e-02f, -1.933757317e-02f, +1.425079434e-02f, +2.969910316e-02f, -8.787840802e-03f, -3.902826729e-02f, -1.213973801e-03f, +4.475613498e-02f, +1.432330774e-02f, -4.492242362e-02f, -2.791538074e-02f, +3.894202515e-02f, +3.894202515e-02f, -2.791538074e-02f, -4.492242362e-02f, +1.432330774e-02f, +4.475613498e-02f, -1.213973801e-03f, -3.902826729e-02f, -8.787840802e-03f, +2.969910316e-02f, +1.425079434e-02f, -1.933757317e-02f, -1.520396723e-02f, +1.023939227e-02f, +1.285465830e-02f, -3.784563588e-03f, -8.946316183e-03f, +2.424602479e-04f, +5.068887451e-03f, +9.877392098e-04f, -2.199365942e-03f, -8.938814713e-04f, +4.294347590e-04f, +3.578011047e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.890875247e-05f, -2.946612832e-05f, -9.000805441e-05f, +1.971277493e-05f, +1.968940433e-04f, +6.929594067e-05f, -3.203875692e-04f, -2.942978454e-04f, +3.776736345e-04f, +6.817939050e-04f, -2.324080947e-04f, -1.184669683e-03f, -2.812048656e-04f, +1.643543036e-03f, +1.318667112e-03f, -1.754150570e-03f, -2.998150671e-03f, +9.821665543e-04f, +5.447374015e-03f, +1.977695812e-03f, -9.054168626e-03f, -1.571285342e-02f, -8.277169662e-03f, +7.390823752e-03f, +1.569000598e-02f, +9.750161122e-03f, -1.429379508e-03f, -5.527225233e-03f, -1.340207678e-03f, +2.899919139e-03f, +1.946940336e-03f, -1.180653198e-03f, -1.720705346e-03f, +1.614390333e-04f, +1.193498675e-03f, +3.140432681e-04f, -6.599822455e-04f, -4.223248927e-04f, +2.665570676e-04f, +3.387709059e-04f, -4.774434328e-05f, -2.011761977e-04f, -3.225639524e-05f, +8.924783014e-05f, +3.509267250e-05f, -2.780816287e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.890875247e-05f, +2.946612832e-05f, +1.353400191e-04f, -2.266493267e-05f, -3.250107733e-04f, -6.929486011e-05f, +5.972544766e-04f, +3.242679756e-04f, -8.936108672e-04f, -8.003752606e-04f, +1.103694528e-03f, +1.500037935e-03f, -1.090997027e-03f, -2.343059715e-03f, +7.411495481e-04f, +3.168442424e-03f, -1.547244324e-05f, -3.771941957e-03f, -1.014146564e-03f, +3.970055315e-03f, +2.168522171e-03f, -3.666797860e-03f, -3.207005202e-03f, +2.895155927e-03f, +3.901254063e-03f, -1.813848623e-03f, -4.108667669e-03f, +6.585983085e-04f, +3.816121917e-03f, +3.332428752e-04f, -3.137106184e-03f, -9.946964071e-04f, +2.265412945e-03f, +1.270408862e-03f, -1.406454515e-03f, -1.214497919e-03f, +7.146813517e-04f, +9.515151096e-04f, -2.597252849e-04f, -6.213161109e-04f, +2.879053179e-05f, +3.318592401e-04f, +4.338331920e-05f, -1.360929656e-04f, -3.509267250e-05f, +2.780816287e-05f, +0.000000000e+00f, - /* 7, 9 (48) */ - +0.000000000e+00f, -3.288923522e-04f, -4.589008873e-04f, +5.947053052e-04f, +1.478176420e-03f, -3.221019947e-04f, -3.085491750e-03f, -1.246602244e-03f, +4.681152568e-03f, +4.785789126e-03f, -4.942115687e-03f, -1.037992220e-02f, +1.959814827e-03f, +1.700885791e-02f, +6.338558987e-03f, -2.220561788e-02f, -2.173528197e-02f, +2.182485354e-02f, +4.591081542e-02f, -8.858839214e-03f, -8.370151401e-02f, -3.648681276e-02f, +1.734278885e-01f, +3.881249991e-01f, +4.037929925e-01f, +2.048307479e-01f, -1.768248302e-02f, -8.710858933e-02f, -1.983343846e-02f, +4.358844119e-02f, +2.772292335e-02f, -1.803419106e-02f, -2.470493819e-02f, +2.974310605e-03f, +1.745150180e-02f, +4.337983186e-03f, -9.833470837e-03f, -6.283891837e-03f, +3.985790599e-03f, +5.242007481e-03f, -5.874437687e-04f, -3.202532034e-03f, -7.201722357e-04f, +1.426207250e-03f, +7.739611898e-04f, -3.943420865e-04f, -3.856092675e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.288923522e-04f, +4.589008873e-04f, -7.585414522e-04f, -2.222030875e-03f, +6.627284365e-04f, +4.999592591e-03f, +8.397147245e-04f, -8.622048207e-03f, -4.678174456e-03f, +1.205428304e-02f, +1.134308680e-02f, -1.370392930e-02f, -2.042857020e-02f, +1.190773462e-02f, +3.044025270e-02f, -5.619398378e-03f, -3.904373973e-02f, -4.985915759e-03f, +4.374198841e-02f, +1.829336305e-02f, -4.275390145e-02f, -3.158217860e-02f, +3.573501995e-02f, +4.183718108e-02f, -2.401412668e-02f, -4.673627224e-02f, +1.021464007e-02f, +4.541473329e-02f, +2.602148116e-03f, -3.869502441e-02f, -1.192494699e-02f, +2.870440675e-02f, +1.651620728e-02f, -1.806716431e-02f, -1.661042175e-02f, +9.024894355e-03f, +1.356933965e-02f, -2.833048479e-03f, -9.206041467e-03f, -3.788558631e-04f, +5.097677983e-03f, +1.319598450e-03f, -2.155982623e-03f, -1.029974437e-03f, +3.943420865e-04f, +3.856092675e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.965557857e-05f, -2.390327373e-05f, -8.999491795e-05f, +7.564510283e-06f, +1.912661842e-04f, +8.953713388e-05f, -3.002293292e-04f, -3.189819924e-04f, +3.315755797e-04f, +6.980073717e-04f, -1.512961948e-04f, -1.167506265e-03f, -3.958884027e-04f, +1.556556319e-03f, +1.443802159e-03f, -1.553914313e-03f, -3.072701901e-03f, +6.277020005e-04f, +5.333162472e-03f, +2.491782711e-03f, -8.340381297e-03f, -1.567452535e-02f, -9.127491098e-03f, +6.472225843e-03f, +1.560529730e-02f, +1.042453100e-02f, -8.488763033e-04f, -5.571080366e-03f, -1.699450608e-03f, +2.778061776e-03f, +2.130702271e-03f, -1.030435793e-03f, -1.787225627e-03f, +3.734630268e-05f, +1.193706305e-03f, +3.956018474e-04f, -6.325775162e-04f, -4.651434485e-04f, +2.358771244e-04f, +3.551741776e-04f, -2.500676342e-05f, -2.040238912e-04f, -4.510663056e-05f, +8.768341605e-05f, +4.073327675e-05f, -2.634352250e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.965557857e-05f, +2.390327373e-05f, +1.333852764e-04f, -2.807807247e-06f, -3.156600646e-04f, -1.076090043e-04f, +5.690149289e-04f, +3.840630086e-04f, -8.299343997e-04f, -8.772622431e-04f, +9.863503137e-04f, +1.579368513e-03f, -9.059507605e-04f, -2.400260476e-03f, +4.852005956e-04f, +3.173511451e-03f, +2.990057852e-04f, -3.697389241e-03f, -1.358815244e-03f, +3.799846157e-03f, +2.504064289e-03f, -3.402984597e-03f, -3.492396405e-03f, +2.559407831e-03f, +4.104341299e-03f, -1.442908639e-03f, -4.214354349e-03f, +2.950498220e-04f, +3.829287972e-03f, +6.516844366e-04f, -3.079435871e-03f, -1.243673803e-03f, +2.167639909e-03f, +1.442560106e-03f, -1.299120064e-03f, -1.317658095e-03f, +6.206937747e-04f, +1.002976181e-03f, -1.908524170e-04f, -6.408354129e-04f, -1.362236142e-05f, +3.360284079e-04f, +6.480648075e-05f, -1.355645836e-04f, -4.073327675e-05f, +2.634352250e-05f, +0.000000000e+00f, - /* 7,10 (48) */ - +0.000000000e+00f, -2.992367736e-04f, -4.828041611e-04f, +5.047103873e-04f, +1.485740930e-03f, -1.308358105e-04f, -2.995954616e-03f, -1.546831573e-03f, +4.362170575e-03f, +5.117364706e-03f, -4.244108315e-03f, -1.053121839e-02f, +7.923085621e-04f, +1.661296950e-02f, +7.895115306e-03f, -2.076181572e-02f, -2.328919628e-02f, +1.875215164e-02f, +4.653851743e-02f, -3.525676742e-03f, -8.120973130e-02f, -4.482719406e-02f, +1.577533631e-01f, +3.789975080e-01f, +4.102652183e-01f, +2.204360452e-01f, -7.257952015e-03f, -8.795746564e-02f, -2.540451883e-02f, +4.188899058e-02f, +3.050098512e-02f, -1.590348879e-02f, -2.573537398e-02f, +1.187084978e-03f, +1.748884811e-02f, +5.531689491e-03f, -9.437868990e-03f, -6.916469353e-03f, +3.520647150e-03f, +5.477884605e-03f, -2.322695911e-04f, -3.227538798e-03f, -9.241961269e-04f, +1.381100619e-03f, +8.616446058e-04f, -3.536088098e-04f, -4.119527900e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.992367736e-04f, +4.828041611e-04f, -6.251561758e-04f, -2.224838682e-03f, +3.470683719e-04f, +4.891983586e-03f, +1.408729653e-03f, -8.237985198e-03f, -5.508108855e-03f, +1.117702080e-02f, +1.232943712e-02f, -1.212456078e-02f, -2.133452096e-02f, +9.507474147e-03f, +3.092545330e-02f, -2.445886927e-03f, -3.874473394e-02f, -8.683305000e-03f, +4.238317317e-02f, +2.209320921e-02f, -4.024983716e-02f, -3.498516320e-02f, +3.224262355e-02f, +4.439658891e-02f, -1.990978538e-02f, -4.817918088e-02f, +6.000285721e-03f, +4.570978311e-02f, +6.431436087e-03f, -3.804333997e-02f, -1.500438286e-02f, +2.746073294e-02f, +1.868384719e-02f, -1.662460420e-02f, -1.790954181e-02f, +7.707236260e-03f, +1.419003343e-02f, -1.830072298e-03f, -9.396893884e-03f, -1.019691276e-03f, +5.084055621e-03f, +1.655626858e-03f, -2.091176142e-03f, -1.165539020e-03f, +3.536088098e-04f, +4.119527900e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.006190168e-05f, -1.845081486e-05f, -8.924457674e-05f, -4.106474726e-06f, +1.843889131e-04f, +1.083580776e-04f, -2.785084545e-04f, -3.405188824e-04f, +2.844164418e-04f, +7.086593613e-04f, -7.128781453e-05f, -1.142348993e-03f, -5.047897562e-04f, +1.460613257e-03f, +1.555490471e-03f, -1.347825884e-03f, -3.123680586e-03f, +2.791030453e-04f, +5.186391212e-03f, +2.969830662e-03f, -7.612660200e-03f, -1.557600927e-02f, -9.938206779e-03f, +5.525319863e-03f, +1.545834947e-02f, +1.107350569e-02f, -2.384536114e-04f, -5.577481931e-03f, -2.057448314e-03f, +2.632798804e-03f, +2.303879485e-03f, -8.687954834e-04f, -1.842343909e-03f, -9.026666474e-05f, +1.185062795e-03f, +4.764683979e-04f, -5.996277874e-04f, -5.057462146e-04f, +2.024022021e-04f, +3.694012142e-04f, -1.221672470e-06f, -2.053569289e-04f, -5.816843057e-05f, +8.528981405e-05f, +4.633573213e-05f, -2.450776296e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.006190168e-05f, +1.845081486e-05f, +1.303161153e-04f, +1.604710306e-05f, -3.039998545e-04f, -1.434816127e-04f, +5.369865850e-04f, +4.387470956e-04f, -7.611881432e-04f, -9.449173978e-04f, +8.635987773e-04f, +1.644075557e-03f, -7.169145526e-04f, -2.436872970e-03f, +2.290064906e-04f, +3.152599747e-03f, +6.076260051e-04f, -3.593353469e-03f, -1.689836756e-03f, +3.599625827e-03f, +2.817781351e-03f, -3.112066827e-03f, -3.748993771e-03f, +2.202522148e-03f, +4.274305924e-03f, -1.058714921e-03f, -4.286055964e-03f, -7.353155228e-05f, +3.811055189e-03f, +9.681426814e-04f, -2.995587507e-03f, -1.485922522e-03f, +2.050237899e-03f, +1.605857472e-03f, -1.178665739e-03f, -1.412114242e-03f, +5.190117488e-04f, +1.047361566e-03f, -1.181188622e-04f, -6.554768997e-04f, -5.763349266e-05f, +3.373592935e-04f, +8.676328082e-05f, -1.336844431e-04f, -4.633573213e-05f, +2.450776296e-05f, +0.000000000e+00f, - /* 7,11 (48) */ - +0.000000000e+00f, -2.691748720e-04f, -5.012549759e-04f, +4.154658105e-04f, +1.481634456e-03f, +5.355310260e-05f, -2.887596539e-03f, -1.825340028e-03f, +4.021651693e-03f, +5.401781148e-03f, -3.535448954e-03f, -1.060250621e-02f, -3.500404306e-04f, +1.610817975e-02f, +9.355728563e-03f, -1.920632525e-02f, -2.463702217e-02f, +1.562847105e-02f, +4.681762047e-02f, +1.660714471e-03f, -7.823990064e-02f, -5.243985426e-02f, +1.421773538e-01f, +3.690593012e-01f, +4.157905382e-01f, +2.358943946e-01f, +3.815553680e-03f, -8.819591925e-02f, -3.098200076e-02f, +3.983154227e-02f, +3.313378393e-02f, -1.359960931e-02f, -2.660416947e-02f, -6.552589311e-04f, +1.739858144e-02f, +6.716752286e-03f, -8.961400592e-03f, -7.516097141e-03f, +3.014900936e-03f, +5.680286807e-03f, +1.371316231e-04f, -3.228760470e-03f, -1.129553056e-03f, +1.322932189e-03f, +9.469344199e-04f, -3.072730776e-04f, -4.364605530e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.691748720e-04f, +5.012549759e-04f, -4.948400605e-04f, -2.208791579e-03f, +4.306851739e-05f, +4.748501974e-03f, +1.945716238e-03f, -7.799238103e-03f, -6.269296998e-03f, +1.023210340e-02f, +1.319303589e-02f, -1.048048523e-02f, -2.205143551e-02f, +7.070601177e-03f, +3.115445979e-02f, +7.067128194e-04f, -3.813710794e-02f, -1.227665847e-02f, +4.069333641e-02f, +2.569283504e-02f, -3.743205581e-02f, -3.809723002e-02f, +2.849362978e-02f, +4.659911106e-02f, -1.563547945e-02f, -4.923789580e-02f, +1.714229757e-03f, +4.563625156e-02f, +1.024249128e-02f, -3.707519729e-02f, -1.799997036e-02f, +2.597481042e-02f, +2.073408509e-02f, -1.501874673e-02f, -1.908820755e-02f, +6.295122018e-03f, +1.470904517e-02f, -7.827107325e-04f, -9.515012747e-03f, -1.675168176e-03f, +5.026422129e-03f, +1.992986151e-03f, -2.004412861e-03f, -1.299223464e-03f, +3.072730776e-04f, +4.364605530e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.014369114e-05f, -1.315223083e-05f, -8.779798166e-05f, -1.522550372e-05f, +1.763650054e-04f, +1.256638951e-04f, -2.554424378e-04f, -3.588446341e-04f, +2.365788148e-04f, +7.138270327e-04f, +7.060227675e-06f, -1.109588240e-03f, -6.072682878e-04f, +1.356624929e-03f, +1.653273170e-03f, -1.137481256e-03f, -3.151352185e-03f, -6.143968142e-05f, +5.009011453e-03f, +3.410269646e-03f, -6.874877781e-03f, -1.541858668e-02f, -1.070594523e-02f, +4.554200443e-03f, +1.524909670e-02f, +1.169338969e-02f, +3.994057809e-04f, -5.545163282e-03f, -2.411695707e-03f, +2.464518670e-03f, +2.464951107e-03f, -6.966149643e-04f, -1.885364845e-03f, -2.205466708e-04f, +1.167398706e-03f, +5.560161944e-04f, -5.612248810e-04f, -5.437559948e-04f, +1.663028728e-04f, +3.812667058e-04f, +2.345906927e-05f, -2.051046652e-04f, -7.134101637e-05f, +8.204832773e-05f, +5.184563309e-05f, -2.229725832e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.014369114e-05f, +1.315223083e-05f, +1.262264773e-04f, +3.377506652e-05f, -2.902361166e-04f, -1.766928219e-04f, +5.015789302e-04f, +4.880127681e-04f, -6.880989818e-04f, -1.003005735e-03f, +7.365940119e-04f, +1.693920083e-03f, -5.255367885e-04f, -2.452930830e-03f, -2.530449539e-05f, +3.106208297e-03f, +9.078988784e-04f, -3.460963170e-03f, -2.004577893e-03f, +3.371221869e-03f, +3.107173204e-03f, -2.796518107e-03f, -3.974704598e-03f, +1.827438844e-03f, +4.409668015e-03f, -6.644028583e-04f, -4.322993071e-03f, -4.441151534e-04f, +3.761300367e-03f, +1.279952204e-03f, -2.885941360e-03f, -1.719310276e-03f, +1.913880253e-03f, +1.758755042e-03f, -1.045849078e-03f, -1.496857454e-03f, +4.103172188e-04f, +1.084083954e-03f, -4.204338890e-05f, -6.649381238e-04f, -1.029057219e-04f, +3.357132912e-04f, +1.090690042e-04f, -1.303924354e-04f, -5.184563309e-05f, +2.229725832e-05f, +0.000000000e+00f, - /* 7,12 (48) */ - +0.000000000e+00f, -2.390311808e-04f, -5.144072068e-04f, +3.276678289e-04f, +1.466408952e-03f, +2.299181080e-04f, -2.761932644e-03f, -2.080782465e-03f, +3.662807059e-03f, +5.638359962e-03f, -2.821621921e-03f, -1.059544598e-02f, -1.459628670e-03f, +1.550091146e-02f, +1.071235349e-02f, -1.755305208e-02f, -2.577450342e-02f, +1.247711886e-02f, +4.675618079e-02f, +6.669725923e-03f, -7.482963099e-02f, -5.931473204e-02f, +1.267587672e-01f, +3.583533560e-01f, +4.203447386e-01f, +2.511434913e-01f, +1.550894337e-02f, -8.779651347e-02f, -3.652716404e-02f, +3.741984656e-02f, +3.559830260e-02f, -1.113465820e-02f, -2.730078443e-02f, -2.540623776e-03f, +1.717803477e-02f, +7.884150992e-03f, -8.405384397e-03f, -8.077322022e-03f, +2.471144941e-03f, +5.846589680e-03f, +5.183983289e-04f, -3.205301401e-03f, -1.334657721e-03f, +1.251591172e-03f, +1.028982748e-03f, -2.554274445e-04f, -4.587578113e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.390311808e-04f, +5.144072068e-04f, -3.686135832e-04f, -2.175016512e-03f, -2.471675992e-04f, +4.571809152e-03f, +2.447295169e-03f, -7.311225335e-03f, -6.957395980e-03f, +9.229097663e-03f, +1.392962991e-02f, -8.786565145e-03f, -2.257697230e-02f, +4.617670347e-03f, +3.112915529e-02f, +3.812921116e-03f, -3.722920906e-02f, -1.573762164e-02f, +3.868875852e-02f, +2.906405691e-02f, -3.432488260e-02f, -4.089374813e-02f, +2.451892518e-02f, +4.842654990e-02f, -1.122581144e-02f, -4.990229866e-02f, -2.608763314e-03f, +4.519213640e-02f, +1.400379164e-02f, -3.579524509e-02f, -2.088591172e-02f, +2.425550015e-02f, +2.264796534e-02f, -1.325999169e-02f, -2.013405663e-02f, +4.798264564e-03f, +1.511936239e-02f, +3.013732217e-04f, -9.557056136e-03f, -2.340106299e-03f, +4.923516407e-03f, +2.328699442e-03f, -1.895343857e-03f, -1.429615899e-03f, +2.554274445e-04f, +4.587578113e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.991934502e-05f, -8.047512082e-06f, -8.570032428e-05f, -2.572550181e-05f, +1.673026491e-04f, +1.413749376e-04f, -2.312521275e-04f, -3.739218118e-04f, +1.884393493e-04f, +7.136263213e-04f, +8.321807681e-05f, -1.069660072e-03f, -7.027458309e-04f, +1.245537879e-03f, +1.736801056e-03f, -9.244669781e-04f, -3.156134378e-03f, -3.918457334e-04f, +4.803110104e-03f, +3.811774186e-03f, -6.130896128e-03f, -1.520382378e-02f, -1.142756215e-02f, +3.563091276e-03f, +1.497778787e-02f, +1.228058610e-02f, +1.062014672e-03f, -5.473060168e-03f, -2.759644501e-03f, +2.273779436e-03f, +2.612443858e-03f, -5.148751356e-04f, -1.915664365e-03f, -3.525991669e-04f, +1.140607739e-03f, +6.336116937e-04f, -5.175048575e-04f, -5.788045953e-04f, +1.277755383e-04f, +3.905980408e-04f, +4.887100603e-05f, -2.032069447e-04f, -8.451853313e-05f, +7.794699392e-05f, +5.720679688e-05f, -1.971202353e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.991934502e-05f, +8.047512082e-06f, +1.212155758e-04f, +5.026807306e-05f, -2.745855725e-04f, -2.070551399e-04f, +4.632174361e-04f, +5.316094506e-04f, -6.114111721e-04f, -1.051282896e-03f, +6.065002292e-04f, +1.728794241e-03f, -3.334555235e-04f, -2.448640478e-03f, -2.756505008e-04f, +3.035045686e-03f, +1.197431855e-03f, -3.301574000e-03f, -2.300561152e-03f, +3.116686908e-03f, +3.369953529e-03f, -2.459011507e-03f, -4.167696725e-03f, +1.437251817e-03f, +4.509234495e-03f, -2.632043609e-04f, -4.324674288e-03f, -8.136323987e-04f, +3.680165329e-03f, +1.584459375e-03f, -2.751101370e-03f, -1.941750497e-03f, +1.759413283e-03f, +1.899768601e-03f, -9.015498578e-04f, -1.570940809e-03f, +2.953707904e-04f, +1.112607779e-03f, +3.680922803e-05f, -6.689535921e-04f, -1.490773181e-04f, +3.309743637e-04f, +1.315266148e-04f, -1.256399360e-04f, -5.720679688e-05f, +1.971202353e-05f, +0.000000000e+00f, - /* 7,13 (48) */ - +0.000000000e+00f, -2.091118358e-04f, -5.224547188e-04f, +2.419675046e-04f, +1.440683450e-03f, +3.972207571e-04f, -2.620557706e-03f, -2.312034593e-03f, +3.288885247e-03f, +5.826799312e-03f, -2.107995600e-03f, -1.051222790e-02f, -2.529288742e-03f, +1.479816563e-02f, +1.195789137e-02f, -1.581625102e-02f, -2.669897040e-02f, +9.320984485e-03f, +4.636433506e-02f, +1.147283603e-02f, -7.101785681e-02f, -6.544562817e-02f, +1.115549434e-01f, +3.469257938e-01f, +4.239078299e-01f, +2.661212792e-01f, +2.778952947e-02f, -8.673449879e-02f, -4.200022421e-02f, +3.466020206e-02f, +3.787208203e-02f, -8.522214343e-03f, -2.781565957e-02f, -4.456288141e-03f, +1.682543560e-02f, +9.024758730e-03f, -7.771772704e-03f, -8.594826879e-03f, +1.892340346e-03f, +5.974365218e-03f, +9.089963697e-04f, -3.156430395e-03f, -1.537864666e-03f, +1.167072639e-03f, +1.106929742e-03f, -1.982206477e-04f, -4.784698349e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.091118358e-04f, +5.224547188e-04f, -2.473980074e-04f, -2.124748439e-03f, -5.217531717e-04f, +4.364754012e-03f, +2.910512605e-03f, -6.779615884e-03f, -7.568807152e-03f, +8.177814767e-03f, +1.453613013e-02f, -7.057770904e-03f, -2.291042782e-02f, +2.169029869e-03f, +3.085350479e-02f, +6.847966803e-03f, -3.603177721e-02f, -1.903919564e-02f, +3.638819737e-02f, +3.218074382e-02f, -3.095492907e-02f, -4.335275964e-02f, +2.035122845e-02f, +4.986380172e-02f, -6.716576944e-03f, -5.016550302e-02f, -6.933437601e-03f, +4.437850400e-02f, +1.768395697e-02f, -3.421078571e-02f, -2.363701309e-02f, +2.231374965e-02f, +2.440737863e-02f, -1.136022309e-02f, -2.103560649e-02f, +3.227323755e-03f, +1.541473318e-02f, +1.413981001e-03f, -9.520246907e-03f, -3.009059891e-03f, +4.774439089e-03f, +2.659673806e-03f, -1.763817242e-03f, -1.555255835e-03f, +1.982206477e-04f, +4.784698349e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.940939777e-05f, -3.172941354e-06f, -8.300046623e-05f, -3.554727186e-05f, +1.573143649e-04f, +1.554269116e-04f, -2.061598898e-04f, -3.857389280e-04f, +1.403660523e-04f, +7.082100232e-04f, +1.566860867e-04f, -1.023041899e-03f, -7.907093813e-04f, +1.128326476e-03f, +1.805834501e-03f, -7.103494024e-04f, -3.138590688e-03f, -7.101556934e-04f, +4.570894266e-03f, +4.173266846e-03f, -5.384545525e-03f, -1.493356050e-02f, -1.210015645e-02f, +2.556322706e-03f, +1.464498729e-02f, +1.283161796e-02f, +1.746493787e-03f, -5.360321239e-03f, -3.098718631e-03f, +2.061309057e-03f, +2.744943539e-03f, -3.246504017e-04f, -1.932695959e-03f, -4.854938715e-04f, +1.104649127e-03f, +7.086191726e-04f, -4.686481720e-04f, -6.105359519e-04f, +8.704165206e-05f, +3.972370981e-04f, +7.483801030e-05f, -1.996149864e-04f, -9.759077119e-05f, +7.298096997e-05f, +6.236171686e-05f, -1.675588491e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.940939777e-05f, +3.172941354e-06f, +1.153866087e-04f, +6.543514523e-05f, -2.572731998e-04f, -2.344139914e-04f, +4.223391725e-04f, +5.693439858e-04f, -5.318792988e-04f, -1.089595050e-03f, +4.744814268e-04f, +1.748719610e-03f, -1.422846034e-04f, -2.424376583e-03f, -5.200131665e-04f, +2.940019494e-03f, +1.473948446e-03f, -3.116755210e-03f, -2.575484564e-03f, +2.838279978e-03f, +3.604068283e-03f, -2.102396482e-03f, -4.326413757e-03f, +1.035182771e-03f, +4.572109842e-03f, +1.415792325e-04f, -4.290901969e-03f, -1.179002679e-03f, +3.568057956e-03f, +1.879045199e-03f, -2.591892616e-03f, -2.151220976e-03f, +1.587851634e-03f, +2.027489676e-03f, -7.467647766e-04f, -1.633489118e-03f, +1.750068552e-04f, +1.132455450e-03f, +1.178320026e-04f, -6.672984590e-04f, -1.957644976e-04f, +3.230510926e-04f, +1.539281953e-04f, -1.193909001e-04f, -6.236171686e-05f, +1.675588491e-05f, +0.000000000e+00f, - /* 7,14 (48) */ - +0.000000000e+00f, -1.797024380e-04f, -5.256276602e-04f, +1.589670384e-04f, +1.405136178e-03f, +5.545351220e-04f, -2.465130794e-03f, -2.518194483e-03f, +2.903146319e-03f, +5.967165364e-03f, -1.399785577e-03f, -1.035554182e-02f, -3.552330642e-03f, +1.400745625e-02f, +1.308621785e-02f, -1.401041652e-02f, -2.740931980e-02f, +6.182393798e-03f, +4.565417936e-02f, +1.604373029e-02f, -6.684458996e-02f, -7.083017370e-02f, +9.662138288e-02f, +3.348256374e-01f, +4.264641526e-01f, +2.807662665e-01f, +4.062114743e-02f, -8.498800501e-02f, -4.736054545e-02f, +3.156148343e-02f, +3.993339109e-02f, -5.777270803e-03f, -2.814030997e-02f, -6.388984100e-03f, +1.633994173e-02f, +1.012940786e-02f, -7.063153531e-03f, -9.063475051e-03f, +1.281804394e-03f, +6.061406870e-03f, +1.306233468e-03f, -3.081592384e-03f, -1.737479652e-03f, +1.069481868e-03f, +1.179910712e-03f, -1.358589308e-04f, -4.952257198e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.797024380e-04f, +5.256276602e-04f, -1.320113986e-04f, -2.059313294e-03f, -7.790263715e-04f, +4.130340021e-03f, +3.332851777e-03f, -6.210271898e-03f, -8.100686451e-03f, +7.088219717e-03f, +1.501061156e-02f, -5.309051293e-03f, -2.305271243e-02f, -2.553467138e-04f, +3.033349163e-02f, +9.787986297e-03f, -3.455782876e-02f, -2.215595085e-02f, +3.381271281e-02f, +3.501902379e-02f, -2.735086079e-02f, -4.545515612e-02f, +1.602481470e-02f, +5.089898449e-02f, -2.144467102e-03f, -5.002392379e-02f, -1.122433957e-02f, +4.319950132e-02f, +2.125201493e-02f, -3.233174051e-02f, -2.622890571e-02f, +2.016252867e-02f, +2.599523026e-02f, -9.332733411e-03f, -2.178237126e-02f, +1.593834637e-03f, +1.558974004e-02f, +2.546436450e-03f, -9.402414905e-03f, -3.676358351e-03f, +4.578674591e-03f, +2.982724899e-03f, -1.609889047e-03f, -1.674646735e-03f, +1.358589308e-04f, +4.952257198e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.863621876e-05f, +1.439082229e-06f, -7.975035777e-05f, -4.463969354e-05f, +1.465159276e-04f, +1.677708782e-04f, -1.803878146e-04f, -3.943097584e-04f, +9.271572658e-05f, +6.977656499e-04f, +2.269977574e-04f, -9.702479273e-04f, -8.707132496e-04f, +1.005985252e-03f, +1.860242573e-03f, -4.966642856e-04f, -3.099423254e-03f, -1.014541025e-03f, +4.314675244e-03f, +4.493920170e-03f, -4.639603441e-03f, -1.460989809e-02f, -1.272108488e-02f, +1.538308694e-03f, +1.425157367e-02f, +1.334314888e-02f, +2.449785430e-03f, -5.206317386e-03f, -3.426330156e-03f, +1.828004523e-03f, +2.861106379e-03f, -1.271031969e-04f, -1.935996551e-03f, -6.182707865e-04f, +1.059549598e-03f, +7.804055004e-04f, -4.148794920e-04f, -6.386092476e-04f, +4.434671800e-05f, +4.010419751e-04f, +1.011733331e-04f, -1.942922012e-04f, -1.104439513e-04f, +6.715287147e-05f, +6.725204694e-05f, -1.343661977e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.863621876e-05f, -1.439082229e-06f, +1.088454893e-04f, +7.920246515e-05f, -2.385297552e-04f, -2.586479351e-04f, +3.793884526e-04f, +6.010806214e-04f, -4.502613259e-04f, -1.117877985e-03f, +3.416912839e-04f, +1.753844383e-03f, +4.639975854e-05f, -2.380676125e-03f, -7.564539392e-04f, +2.822226078e-03f, +1.735306302e-03f, -2.908274395e-03f, -2.827239875e-03f, +2.538446195e-03f, +3.807712082e-03f, -1.729674275e-03f, -4.449587916e-03f, +6.245539774e-04f, +4.597704255e-03f, +5.466049358e-04f, -4.221775386e-03f, -1.537159529e-03f, +3.425650924e-03f, +2.161148111e-03f, -2.409356830e-03f, -2.345782207e-03f, +1.400372094e-03f, +2.140599143e-03f, -5.826009958e-04f, -1.683708230e-03f, +5.012793022e-05f, +1.143213222e-03f, +2.003800356e-04f, -6.597919536e-04f, -2.425642658e-04f, +3.118785642e-04f, +1.760565584e-04f, -1.116228722e-04f, -6.725204694e-05f, +1.343661977e-05f, +0.000000000e+00f, - /* 7,15 (48) */ - +0.000000000e+00f, -1.510662193e-04f, -5.241885780e-04f, +7.921668061e-05f, +1.360496485e-03f, +7.010510496e-04f, -2.297359916e-03f, -2.698582297e-03f, +2.508836561e-03f, +6.059881091e-03f, -7.020199266e-04f, -1.012854406e-02f, -4.522578569e-03f, +1.313674300e-02f, +1.409220310e-02f, -1.215017395e-02f, -2.790598409e-02f, +3.082970544e-03f, +4.463963834e-02f, +2.035840554e-02f, -6.235066979e-02f, -7.546977714e-02f, +8.201148479e-02f, +3.221045525e-01f, +4.280024613e-01f, +2.950178402e-01f, +5.396429631e-02f, -8.253821958e-02f, -5.256686283e-02f, +2.813515328e-02f, +4.176139561e-02f, -2.916164424e-03f, -2.826741316e-02f, -8.324980651e-03f, +1.572167095e-02f, +1.118895746e-02f, -6.282748031e-03f, -9.478354543e-03f, +6.431951462e-04f, +6.105753588e-03f, +1.707275443e-03f, -2.980419051e-03f, -1.931771853e-03f, +9.590379168e-04f, +1.247063583e-03f, -6.860688387e-05f, -5.086623395e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.510662193e-04f, +5.241885780e-04f, -2.316590932e-05f, -1.980110829e-03f, -1.017556127e-03f, +3.871692085e-03f, +3.712240230e-03f, -5.609191277e-03f, -8.550947777e-03f, +5.970341733e-03f, +1.535230285e-02f, -3.555206910e-03f, -2.300631267e-02f, -2.636022839e-03f, +2.957703769e-02f, +1.261021237e-02f, -3.282252246e-02f, -2.506422524e-02f, +3.098547293e-02f, +3.755746999e-02f, -2.354314871e-02f, -4.718483039e-02f, +1.157522678e-02f, +5.152353847e-02f, +2.453237153e-03f, -4.947731885e-02f, -1.544611496e-02f, +4.166234180e-02f, +2.467766585e-02f, -3.017059240e-02f, -2.863826254e-02f, +1.781674647e-02f, +2.739560235e-02f, -7.192134268e-03f, -2.236497226e-02f, -8.987359339e-05f, +1.563986797e-02f, +3.689649672e-03f, -9.202034869e-03f, -4.336150304e-03f, +4.336110325e-03f, +3.294603463e-03f, -1.433832489e-03f, -1.786269607e-03f, +6.860688387e-05f, +5.086623395e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.762370518e-05f, +5.760175807e-06f, -7.600445101e-05f, -5.295984601e-05f, +1.350252974e-04f, +1.783731277e-04f, -1.541559783e-04f, -3.996724792e-04f, +4.583156740e-05f, +6.825130750e-04f, +2.937223500e-04f, -9.118244494e-04f, -9.423806704e-04f, +8.795212707e-04f, +1.900001413e-03f, -2.849068333e-04f, -3.039464840e-03f, -1.303312883e-03f, +4.036852200e-03f, +4.773157098e-03f, -3.899774043e-03f, -1.423518529e-02f, -1.328797511e-02f, +5.135232855e-04f, +1.379873723e-02f, +1.381200319e-02f, +3.168668398e-03f, -5.010649862e-03f, -3.739895539e-03f, +1.574929844e-03f, +2.959670128e-03f, +7.652224290e-05f, -1.925191887e-03f, -7.499465761e-04f, +1.005404870e-03f, +8.483450124e-04f, -3.564671675e-04f, -6.627019978e-04f, -4.093019403e-08f, +4.018886385e-04f, +1.276807758e-04f, -1.872149352e-04f, -1.229615697e-04f, +6.047305568e-05f, +7.181911347e-05f, -9.766062624e-06f, +0.000000000e+00f, - +0.000000000e+00f, -2.762370518e-05f, -5.760175807e-06f, +1.016996062e-04f, +9.151332350e-05f, -2.185893392e-04f, -2.796685582e-04f, +3.348125527e-04f, +6.267404753e-04f, -3.673118035e-04f, -1.136155430e-03f, +2.092633706e-04f, +1.744439505e-03f, +2.310718362e-04f, -2.318231147e-03f, -9.831294547e-04f, +2.682938861e-03f, +1.979513937e-03f, -2.678080675e-03f, -3.053928932e-03f, +2.219794955e-03f, +3.979342386e-03f, -1.343972107e-03f, -4.536250409e-03f, +2.087601736e-04f, +4.585739218e-03f, +9.485163500e-04f, -4.117691368e-03f, -1.885076851e-03f, +3.253878147e-03f, +2.428286484e-03f, -2.204745980e-03f, -2.523595232e-03f, +1.198305879e-03f, +2.237880283e-03f, -4.102685728e-04f, -1.720893812e-03f, -7.830175331e-05f, +1.144536630e-03f, +2.837752888e-04f, -6.463004974e-04f, -2.890575428e-04f, +2.974200642e-04f, +1.976870227e-04f, -1.023278982e-04f, -7.181911347e-05f, +9.766062624e-06f, +0.000000000e+00f, - /* 8, 0 (44) */ - +0.000000000e+00f, -5.810608668e-04f, -4.000691189e-04f, +1.473036739e-03f, +1.194314507e-03f, -2.873286720e-03f, -2.812546922e-03f, +4.814679451e-03f, +5.726744505e-03f, -7.245170423e-03f, -1.058087851e-02f, +1.001747038e-02f, +1.834373570e-02f, -1.289773969e-02f, -3.079950282e-02f, +1.559401954e-02f, +5.232680174e-02f, -1.780024775e-02f, -9.893335750e-02f, +1.924749700e-02f, +3.158555538e-01f, +4.802482832e-01f, +3.158555538e-01f, +1.924749700e-02f, -9.893335750e-02f, -1.780024775e-02f, +5.232680174e-02f, +1.559401954e-02f, -3.079950282e-02f, -1.289773969e-02f, +1.834373570e-02f, +1.001747038e-02f, -1.058087851e-02f, -7.245170423e-03f, +5.726744505e-03f, +4.814679451e-03f, -2.812546922e-03f, -2.873286720e-03f, +1.194314507e-03f, +1.473036739e-03f, -4.000691189e-04f, -5.810608668e-04f, +8.174592653e-05f, +0.000000000e+00f, - +0.000000000e+00f, +5.810608668e-04f, +4.000691189e-04f, -2.174762082e-03f, -1.369356920e-03f, +4.931706478e-03f, +2.614276448e-03f, -9.249493921e-03f, -4.085126069e-03f, +1.521344320e-02f, +5.480993556e-03f, -2.257913432e-02f, -6.427039238e-03f, +3.073327098e-02f, +6.578871207e-03f, -3.875145264e-02f, -5.735049828e-03f, +4.555317997e-02f, +3.918145659e-03f, -5.012182275e-02f, -1.392488435e-03f, +5.173229864e-02f, -1.392488435e-03f, -5.012182275e-02f, +3.918145659e-03f, +4.555317997e-02f, -5.735049828e-03f, -3.875145264e-02f, +6.578871207e-03f, +3.073327098e-02f, -6.427039238e-03f, -2.257913432e-02f, +5.480993556e-03f, +1.521344320e-02f, -4.085126069e-03f, -9.249493921e-03f, +2.614276448e-03f, +4.931706478e-03f, -1.369356920e-03f, -2.174762082e-03f, +5.133746463e-04f, +5.810608668e-04f, -8.174592653e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.185484257e-05f, -7.472545295e-05f, -1.102051290e-04f, +1.613767670e-04f, +2.444118589e-04f, -2.837343586e-04f, -4.818346326e-04f, +4.347689209e-04f, +8.725487992e-04f, -5.951362975e-04f, -1.487933707e-03f, +7.268860082e-04f, +2.447072989e-03f, -7.549241477e-04f, -4.003216328e-03f, +4.860173922e-04f, +6.895726713e-03f, +9.490229708e-04f, -1.476051954e-02f, -1.838447645e-02f, -7.222834590e-04f, +1.782422552e-02f, +1.557915740e-02f, -7.956834231e-05f, -6.992952053e-03f, -9.829232678e-04f, +3.981393558e-03f, +1.059950903e-03f, -2.398032028e-03f, -9.168719580e-04f, +1.438709876e-03f, +7.113088342e-04f, -8.326150558e-04f, -5.029857206e-04f, +4.536423550e-04f, +3.214802361e-04f, -2.270679961e-04f, -1.806565744e-04f, +1.012954305e-04f, +8.356404177e-05f, -3.855347749e-05f, -2.569515524e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.185484257e-05f, +7.472545295e-05f, +1.586424720e-04f, -2.828334246e-04f, -3.191320079e-04f, +6.056212654e-04f, +5.265264426e-04f, -1.095032644e-03f, -7.496963344e-04f, +1.750316290e-03f, +9.422006148e-04f, -2.533177027e-03f, -1.053194813e-03f, +3.366842708e-03f, +1.041971095e-03f, -4.146189187e-03f, -8.914588966e-04f, +4.757638244e-03f, +6.158590596e-04f, -5.104045782e-03f, -2.592907924e-04f, +5.127648687e-03f, -1.146548538e-04f, -4.824253892e-03f, +4.393630174e-04f, +4.244320116e-03f, -6.624116387e-04f, -3.480588537e-03f, +7.580816744e-04f, +2.646049143e-03f, -7.314302511e-04f, -1.848821109e-03f, +6.132254185e-04f, +1.171037534e-03f, -4.481649702e-04f, -6.569929318e-04f, +2.808403007e-04f, +3.124376673e-04f, -1.441699117e-04f, -1.132976271e-04f, +3.855347749e-05f, +2.569515524e-05f, +0.000000000e+00f, - /* 8, 1 (44) */ - +0.000000000e+00f, -5.392060243e-04f, -4.747945719e-04f, +1.362831610e-03f, +1.355691274e-03f, -2.628874861e-03f, -3.096281281e-03f, +4.332844818e-03f, +6.161513426e-03f, -6.372621624e-03f, -1.117601480e-02f, +8.529536678e-03f, +1.907062170e-02f, -1.045066670e-02f, -3.155442696e-02f, +1.159080321e-02f, +5.281281913e-02f, -1.090452104e-02f, -9.798433453e-02f, +4.486977456e-03f, +2.974710773e-01f, +4.795259998e-01f, +3.336797793e-01f, +3.482665439e-02f, -9.901292585e-02f, -2.479319980e-02f, +5.134387847e-02f, +1.957541309e-02f, -2.973955191e-02f, -1.529577171e-02f, +1.742686374e-02f, +1.145618026e-02f, -9.869569671e-03f, -8.077785479e-03f, +5.223758785e-03f, +5.268321806e-03f, -2.491066686e-03f, -3.100354716e-03f, +1.013657932e-03f, +1.574332169e-03f, -3.165050772e-04f, -6.196143443e-04f, +5.605077129e-05f, +0.000000000e+00f, - +0.000000000e+00f, +5.392060243e-04f, +4.747945719e-04f, -2.016119610e-03f, -1.652190345e-03f, +4.612574470e-03f, +3.219897714e-03f, -8.722967479e-03f, -5.180158713e-03f, +1.446374686e-02f, +7.231309846e-03f, -2.163693371e-02f, -8.960216265e-03f, +2.968007616e-02f, +9.945713914e-03f, -3.770948155e-02f, -9.881239015e-03f, +4.466172107e-02f, +8.675783903e-03f, -4.950596369e-02f, -6.496534218e-03f, +5.147300785e-02f, +3.735160252e-03f, -5.023647761e-02f, -9.061082325e-04f, +4.599254299e-02f, -1.490729711e-03f, -3.941386428e-02f, +3.098282669e-03f, +3.149135265e-02f, -3.780990095e-03f, -2.331056457e-02f, +3.632172447e-03f, +1.582666861e-02f, -2.914088535e-03f, -9.697658891e-03f, +1.957283516e-03f, +5.212546779e-03f, -1.056919253e-03f, -2.318931993e-03f, +4.000770192e-04f, +6.196143443e-04f, -5.605077129e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.447000076e-05f, -6.561260708e-05f, -1.175863630e-04f, +1.413909328e-04f, +2.587499785e-04f, -2.447267536e-04f, -5.046039744e-04f, +3.647515618e-04f, +9.033027300e-04f, -4.769486025e-04f, -1.522328357e-03f, +5.356244570e-04f, +2.472885404e-03f, -4.517495490e-04f, -3.989152634e-03f, +6.792324100e-07f, +6.743476916e-03f, +1.771989956e-03f, -1.388975381e-02f, -1.884927793e-02f, -2.162862672e-03f, +1.717067280e-02f, +1.633957237e-02f, +8.318913589e-04f, -7.032366365e-03f, -1.487435369e-03f, +3.922815420e-03f, +1.364116952e-03f, -2.325561793e-03f, -1.103788633e-03f, +1.374690872e-03f, +8.243134910e-04f, -7.835964559e-04f, -5.686890412e-04f, +4.201123347e-04f, +3.575455993e-04f, -2.067708630e-04f, -1.990006381e-04f, +9.087705687e-05f, +9.201382764e-05f, -3.456277161e-05f, -2.909513156e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.447000076e-05f, +6.561260708e-05f, +1.705338903e-04f, -2.516281064e-04f, -3.524274318e-04f, +5.498599193e-04f, +5.968357629e-04f, -1.010025620e-03f, -8.748938469e-04f, +1.636274853e-03f, +1.139001349e-03f, -2.396651528e-03f, -1.332909937e-03f, +3.220556109e-03f, +1.406553845e-03f, -4.007037969e-03f, -1.331074280e-03f, +4.643243197e-03f, +1.108914643e-03f, -5.028768897e-03f, -7.752124316e-04f, +5.099238890e-03f, +3.895744136e-04f, -4.842134161e-03f, -2.064217926e-05f, +4.300022554e-03f, -2.716382553e-04f, -3.560161383e-03f, +4.504061946e-04f, +2.733648279e-03f, -5.086205797e-04f, -1.930375961e-03f, +4.666398829e-04f, +1.236949904e-03f, -3.623359676e-04f, -7.032381695e-04f, +2.377710009e-04f, +3.400167222e-04f, -1.271457542e-04f, -1.265129176e-04f, +3.456277161e-05f, +2.909513156e-05f, +0.000000000e+00f, - /* 8, 2 (44) */ - +0.000000000e+00f, -4.947360235e-04f, -5.404071790e-04f, +1.245245247e-03f, +1.497082207e-03f, -2.370124883e-03f, -3.341008035e-03f, +3.828240844e-03f, +6.526264988e-03f, -5.469318894e-03f, -1.165296341e-02f, +7.007208321e-03f, +1.960624616e-02f, -7.977781293e-03f, -3.200617651e-02f, +7.601650574e-03f, +5.281349836e-02f, -4.161044122e-03f, -9.621234458e-02f, -9.402776357e-03f, +2.786217994e-01f, +4.773631371e-01f, +3.508504521e-01f, +5.116622676e-02f, -9.818103449e-02f, -3.182556617e-02f, +4.985644310e-02f, +2.349822851e-02f, -2.837543496e-02f, -1.762133351e-02f, +1.632307510e-02f, +1.283087113e-02f, -9.045256180e-03f, -8.861381935e-03f, +4.655069744e-03f, +5.688434141e-03f, -2.133521087e-03f, -3.307125579e-03f, +8.146572943e-04f, +1.665209226e-03f, -2.244912495e-04f, -6.541771159e-04f, +2.695563973e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.947360235e-04f, +5.404071790e-04f, -1.845585719e-03f, -1.903818451e-03f, +4.260147039e-03f, +3.769757633e-03f, -8.126131716e-03f, -6.190184334e-03f, +1.358885301e-02f, +8.867584699e-03f, -2.049793236e-02f, -1.135686779e-02f, +2.834716623e-02f, +1.316627002e-02f, -3.630292770e-02f, -1.388827698e-02f, +4.333064679e-02f, +1.331902710e-02f, -4.839704905e-02f, -1.152530311e-02f, +5.069779542e-02f, +8.834399142e-03f, -4.984690319e-02f, -5.748242393e-03f, +4.597190081e-02f, +2.809292843e-03f, -3.968550254e-02f, -4.618787135e-04f, +3.194175885e-02f, -1.047341816e-03f, -2.381918515e-02f, +1.701796486e-03f, +1.629330850e-02f, -1.677138632e-03f, -1.005999486e-02f, +1.254045347e-03f, +5.450317780e-03f, -7.169025308e-04f, -2.446077748e-03f, +2.735641016e-04f, +6.541771159e-04f, -2.695563973e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.640993010e-05f, -5.633742412e-05f, -1.234361062e-04f, +1.209264873e-04f, +2.700613610e-04f, -2.048736546e-04f, -5.219194978e-04f, +2.936413168e-04f, +9.248699457e-04f, -3.578843506e-04f, -1.541995804e-03f, +3.448443249e-04f, +2.475871378e-03f, -1.530509239e-04f, -3.940354256e-03f, -4.693393252e-04f, +6.539323918e-03f, +2.544408182e-03f, -1.297319719e-02f, -1.921709714e-02f, -3.591505477e-03f, +1.642657021e-02f, +1.703595698e-02f, +1.780477243e-03f, -7.011546824e-03f, -1.995409702e-03f, +3.826910903e-03f, +1.664642242e-03f, -2.229670092e-03f, -1.285821334e-03f, +1.296050107e-03f, +9.329939847e-04f, -7.256777112e-04f, -6.311675135e-04f, +3.813850264e-04f, +3.915132464e-04f, -1.836050578e-04f, -2.161792827e-04f, +7.898707982e-05f, +9.995883490e-05f, -2.988787338e-05f, -3.238614251e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.640993010e-05f, +5.633742412e-05f, +1.798468566e-04f, -2.192450057e-04f, -3.805723284e-04f, +4.904672768e-04f, +6.586139036e-04f, -9.171717255e-04f, -9.878083628e-04f, +1.508241484e-03f, +1.320087845e-03f, -2.238310358e-03f, -1.594596247e-03f, +3.043677248e-03f, +1.752595690e-03f, -3.828686751e-03f, -1.753801711e-03f, +4.482514405e-03f, +1.588801705e-03f, -4.902691787e-03f, -1.283182136e-03f, +5.019017235e-03f, +8.916550208e-04f, -4.810825532e-03f, -4.838688553e-04f, +4.312319161e-03f, +1.264254265e-04f, -3.604266988e-03f, +1.331817181e-04f, +2.794594309e-03f, -2.758704644e-04f, -1.993717300e-03f, +3.112387393e-04f, +1.291758293e-03f, -2.697264117e-04f, -7.436511503e-04f, +1.902072397e-04f, +3.651508023e-04f, -1.076330211e-04f, -1.390933055e-04f, +2.988787338e-05f, +3.238614251e-05f, +0.000000000e+00f, - /* 8, 3 (44) */ - +0.000000000e+00f, -4.483260934e-04f, -5.967446031e-04f, +1.121809141e-03f, +1.618008694e-03f, -2.100063522e-03f, -3.545881689e-03f, +3.306321346e-03f, +6.819906305e-03f, -4.544448948e-03f, -1.201084776e-02f, +5.465212517e-03f, +1.995109049e-02f, -5.501909915e-03f, -3.215922744e-02f, +3.661296318e-03f, +5.234415903e-02f, +2.378279796e-03f, -9.366793640e-02f, -2.237597355e-02f, +2.594047022e-01f, +4.737716316e-01f, +3.672770223e-01f, +6.820218374e-02f, -9.640055725e-02f, -3.883711299e-02f, +4.786103340e-02f, +2.732513942e-02f, -2.671079272e-02f, -1.985100360e-02f, +1.503725377e-02f, +1.412692124e-02f, -8.112262196e-03f, -9.587059646e-03f, +4.023902230e-03f, +6.069819167e-03f, -1.742007841e-03f, -3.490730637e-03f, +5.984780117e-04f, +1.744196306e-03f, -1.245324146e-04f, -6.840649893e-04f, -5.430502781e-06f, +0.000000000e+00f, - +0.000000000e+00f, +4.483260934e-04f, +5.967446031e-04f, -1.665738863e-03f, -2.123063457e-03f, +3.879574710e-03f, +4.260224910e-03f, -7.467517812e-03f, -7.107356059e-03f, +1.260104465e-02f, +1.037582618e-02f, -1.917784451e-02f, -1.359517815e-02f, +2.675256998e-02f, +1.620994727e-02f, -3.455033201e-02f, -1.771696373e-02f, +4.157684508e-02f, +1.780154150e-02f, -4.680824735e-02f, -1.642799490e-02f, +4.941461328e-02f, +1.385341638e-02f, -4.895524817e-02f, -1.055906793e-02f, +4.548803195e-02f, +7.121612003e-03f, -3.955907711e-02f, -4.066145701e-03f, +3.207494056e-02f, +1.747252493e-03f, -2.409505562e-02f, -2.919208143e-04f, +1.660454724e-02f, -3.853803383e-04f, -1.032972127e-02f, +5.103941965e-04f, +5.640525020e-03f, -3.517517285e-04f, -2.553710769e-03f, +1.344707961e-04f, +6.840649893e-04f, +5.430502781e-06f, +0.000000000e+00f, - +0.000000000e+00f, +4.769294207e-05f, -4.700808171e-05f, -1.277674190e-04f, +1.002063120e-04f, +2.783555512e-04f, -1.645847664e-04f, -5.338031835e-04f, +2.221340670e-04f, +9.373291153e-04f, -2.390578810e-04f, -1.547169434e-03f, +1.562510821e-04f, +2.456625632e-03f, +1.386575125e-04f, -3.858238810e-03f, -9.205208281e-04f, +6.286692566e-03f, +3.262659615e-03f, -1.201738174e-02f, -1.948702236e-02f, -5.000343093e-03f, +1.559525887e-02f, +1.766283529e-02f, +2.760942598e-03f, -6.928461094e-03f, -2.502548952e-03f, +3.693419733e-03f, +1.958702524e-03f, -2.110578708e-03f, -1.461150555e-03f, +1.203102599e-03f, +1.036201354e-03f, -6.591341691e-04f, -6.897183060e-04f, +3.376565750e-04f, +4.229718227e-04f, -1.576876388e-04f, -2.319653085e-04f, +6.568020226e-05f, +1.072829234e-04f, -2.454257125e-05f, -3.551525150e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.769294207e-05f, +4.700808171e-05f, +1.866147110e-04f, -1.861016712e-04f, -4.034761595e-04f, +4.282141356e-04f, +7.114893926e-04f, -8.176767188e-04f, -1.087586590e-03f, +1.367872721e-03f, +1.483916041e-03f, -2.060186002e-03f, -1.835852403e-03f, +2.838446164e-03f, +2.076766203e-03f, -3.613344933e-03f, -2.155442434e-03f, +4.277369306e-03f, +2.050656220e-03f, -4.727213046e-03f, -1.777991320e-03f, +4.887722949e-03f, +1.386417312e-03f, -4.730384443e-03f, -9.455611626e-04f, +4.280677796e-03f, +5.277348038e-04f, -3.611967365e-03f, -1.904302771e-04f, +2.827765709e-03f, -3.542794466e-05f, -2.037748604e-03f, +1.484504698e-04f, +1.334543715e-03f, -1.711211164e-04f, -7.775662099e-04f, +1.384958074e-04f, +3.874297558e-04f, -8.572907829e-05f, -1.508342662e-04f, +2.454257125e-05f, +3.551525150e-05f, +0.000000000e+00f, - /* 8, 4 (44) */ - +0.000000000e+00f, -4.006331513e-04f, -6.437526848e-04f, +9.940417215e-04f, +1.718215006e-03f, -1.821707971e-03f, -3.710466456e-03f, +2.772518163e-03f, +7.042040372e-03f, -3.607119833e-03f, -1.224990564e-02f, +3.918043083e-03f, +2.010734157e-02f, -3.045284283e-03f, -3.202056993e-02f, -1.969424922e-04f, +5.142363821e-02f, +8.664972362e-03f, -9.040527678e-02f, -3.439335529e-02f, +2.399176799e-01f, +4.687712885e-01f, +3.828722811e-01f, +8.586501903e-02f, -9.363961465e-02f, -4.576557409e-02f, +4.535848444e-02f, +3.101855915e-02f, -2.475209020e-02f, -2.196158231e-02f, +1.357610321e-02f, +1.533002384e-02f, -7.076060841e-03f, -1.024619382e-02f, +3.334183924e-03f, +6.407475742e-03f, -1.319036018e-03f, -3.648418276e-03f, +3.665127031e-04f, +1.809876508e-03f, -1.724949120e-05f, -7.086075605e-04f, -4.094575428e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.006331513e-04f, +6.437526848e-04f, -1.479124152e-03f, -2.309165128e-03f, +3.476098551e-03f, +4.688439045e-03f, -6.756028420e-03f, -7.925032778e-03f, +1.151345806e-02f, +1.174369890e-02f, -1.769392847e-02f, -1.565536415e-02f, +2.491671758e-02f, +1.904839344e-02f, -3.247356581e-02f, -2.133030867e-02f, +3.942140265e-02f, +2.207891081e-02f, -4.475759113e-02f, -2.115520795e-02f, +4.763662196e-02f, +1.874113933e-02f, -4.756883086e-02f, -1.528945237e-02f, +4.454247079e-02f, +1.140228980e-02f, -3.903134231e-02f, -7.678113066e-03f, +3.188451029e-02f, +4.575018202e-03f, -2.413048356e-02f, -2.329669418e-03f, +1.675299771e-02f, +9.491633768e-04f, -1.050084239e-02f, -2.671720134e-04f, +5.779020827e-03f, +3.567802731e-05f, -2.639439847e-03f, -1.636347006e-05f, +7.086075605e-04f, +4.094575428e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.834410762e-05f, -3.772798779e-05f, -1.306086261e-04f, +7.944665265e-05f, +2.836714180e-04f, -1.242594839e-04f, -5.403279595e-04f, +1.509076622e-04f, +9.408412593e-04f, -1.215496279e-04f, -1.538208371e-03f, -2.851540742e-05f, +2.415925241e-03f, +4.209902531e-04f, -3.744470874e-03f, -1.349604660e-03f, +5.989278435e-03f, +3.923587290e-03f, -1.102898683e-02f, -1.965876471e-02f, -6.381639287e-03f, +1.468064983e-02f, +1.821510479e-02f, +3.767704577e-03f, -6.781491515e-03f, -3.004433560e-03f, +3.522402851e-03f, +2.243453307e-03f, -1.968727041e-03f, -1.627968675e-03f, +1.096305901e-03f, +1.132805076e-03f, -5.843318427e-04f, -7.436542395e-04f, +2.891787024e-04f, +4.515201670e-04f, -1.291681340e-04f, -2.461364923e-04f, +5.102892682e-05f, +1.138711112e-04f, -1.854956279e-05f, -3.842849568e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.834410762e-05f, +3.772798779e-05f, +1.908995503e-04f, -1.526052546e-04f, -4.211106389e-04f, +3.638746578e-04f, +7.551990102e-04f, -7.127823102e-04f, -1.173536764e-03f, +1.216916679e-03f, +1.629154798e-03f, -1.864480710e-03f, -2.054528295e-03f, +2.607366901e-03f, +2.376001048e-03f, -3.363584131e-03f, -2.532048830e-03f, +4.030174318e-03f, +2.489820397e-03f, -4.504240370e-03f, -2.254569416e-03f, +4.706626740e-03f, +1.868750069e-03f, -4.601379392e-03f, -1.400944966e-03f, +4.205021212e-03f, +9.281659166e-04f, -3.582695493e-03f, -5.171517757e-04f, +2.832316186e-03f, +2.103311512e-04f, -2.061556128e-03f, -2.017944628e-05f, +1.364492529e-03f, -6.739694859e-05f, -8.043669378e-04f, +8.304557818e-05f, +4.064584806e-04f, -6.156610171e-05f, -1.615301094e-04f, +1.854956279e-05f, +3.842849568e-05f, +0.000000000e+00f, - /* 8, 5 (44) */ - +0.000000000e+00f, -3.522890437e-04f, -6.814806726e-04f, +8.634330955e-04f, +1.797661659e-03f, -1.538036552e-03f, -3.834725940e-03f, +2.232190203e-03f, +7.192948034e-03f, -2.666278574e-03f, -1.237145527e-02f, +2.379834711e-03f, +2.007882616e-02f, -6.293590427e-04f, -3.159957967e-02f, -3.941413366e-03f, +5.007403355e-02f, +1.465425080e-02f, -8.648168949e-02f, -4.542234212e-02f, +2.202589152e-01f, +4.623896493e-01f, +3.975529310e-01f, +1.040801238e-01f, -8.987191007e-02f, -5.254706560e-02f, +4.235405088e-02f, +3.454096200e-02f, -2.250863689e-02f, -2.393030935e-02f, +1.194813454e-02f, +1.642632974e-02f, -5.943255765e-03f, -1.083052566e-02f, +2.590529685e-03f, +6.696654445e-03f, -8.675158509e-04f, -3.777586410e-03f, +1.203762108e-04f, +1.860905435e-03f, +9.662161999e-05f, -7.271571233e-04f, -7.937424996e-05f, +0.000000000e+00f, - +0.000000000e+00f, +3.522890437e-04f, +6.814806726e-04f, -1.288224602e-03f, -2.461770383e-03f, +3.054987912e-03f, +5.052313703e-03f, -6.000829409e-03f, -8.637815088e-03f, +1.033992130e-02f, +1.296061558e-02f, -1.606477367e-02f, -1.751984486e-02f, +2.286218928e-02f, +2.165576034e-02f, -3.009756476e-02f, -2.469389280e-02f, +3.688935382e-02f, +2.610908513e-02f, -4.226777073e-02f, -2.565944832e-02f, +4.538205255e-02f, +2.344776607e-02f, -4.570008079e-02f, -1.989083176e-02f, +4.314152582e-02f, +1.560731101e-02f, -3.810317639e-02f, -1.126080856e-02f, +3.136735851e-02f, +7.407334389e-03f, -2.392015241e-02f, -4.391225546e-03f, +1.673281826e-02f, +2.313655906e-03f, -1.056823934e-02f, -1.071538951e-03f, +5.862066405e-03f, +4.421365079e-04f, -2.701005949e-03f, -1.778935794e-04f, +7.271571233e-04f, +7.937424996e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.839462908e-05f, -2.859485025e-05f, -1.320023646e-04f, +5.885516513e-05f, +2.860756854e-04f, -8.428333986e-05f, -5.416153511e-04f, +8.061603855e-05f, +9.356458443e-04f, -6.397055724e-06f, -1.515590808e-03f, -2.078939901e-04f, +2.354718005e-03f, +6.917080224e-04f, -3.600941485e-03f, -1.753606875e-03f, +5.651013484e-03f, +4.524509575e-03f, -1.001479077e-02f, -1.973265539e-02f, -7.727842011e-03f, +1.368720055e-02f, +1.868807609e-02f, +4.794878850e-03f, -6.569456489e-03f, -3.496554457e-03f, +3.314250424e-03f, +2.516054581e-03f, -1.804773863e-03f, -1.784496961e-03f, +9.762597131e-04f, +1.221704309e-03f, -5.017265645e-04f, -7.923109627e-04f, +2.362580365e-04f, +4.767717013e-04f, -9.822821321e-05f, -2.584781305e-04f, +3.512353509e-05f, +1.196109415e-04f, -1.194062833e-05f, -4.107153860e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.839462908e-05f, +2.859485025e-05f, +1.927900639e-04f, -1.191481753e-04f, -4.335076091e-04f, +2.982175889e-04f, +7.895872538e-04f, -6.037516229e-04f, -1.245131973e-03f, +1.057192249e-03f, +1.754695733e-03f, -1.653540093e-03f, -2.248743779e-03f, +2.353177519e-03f, +2.647531089e-03f, -3.082307693e-03f, -2.879963865e-03f, +3.743717416e-03f, +2.901890653e-03f, -4.236169460e-03f, -2.708037002e-03f, +4.477518245e-03f, +2.333654438e-03f, -4.424887605e-03f, -1.845278111e-03f, +4.085731968e-03f, +1.323558370e-03f, -3.516266209e-03f, -8.436215584e-04f, +2.807688605e-03f, +4.589264150e-04f, -2.064422979e-03f, -1.930026237e-04f, +1.380908477e-03f, +4.048418938e-05f, -8.234949991e-04f, +2.432513126e-05f, +4.218623792e-04f, -3.531111780e-05f, -1.709766679e-04f, +1.194062833e-05f, +4.107153860e-05f, +0.000000000e+00f, - /* 8, 6 (44) */ - +0.000000000e+00f, -3.038944146e-04f, -7.100755228e-04f, +7.314307309e-04f, +1.856516824e-03f, -1.251960867e-03f, -3.919009279e-03f, +1.690574852e-03f, +7.273564073e-03f, -1.730632730e-03f, -1.237785232e-02f, +8.642439036e-04f, +1.987093217e-02f, +1.725358962e-03f, -3.090787165e-02f, -7.542354851e-03f, +4.832042667e-02f, +2.030526428e-02f, -8.195717992e-02f, -5.543713289e-02f, +2.005262598e-01f, +4.546618072e-01f, +4.112401315e-01f, +1.227681999e-01f, -8.507703122e-02f, -5.911652209e-02f, +3.885749643e-02f, +3.785521243e-02f, -1.999258231e-02f, -2.573508321e-02f, +1.016363758e-02f, +1.740258945e-02f, -4.721551456e-03f, -1.133225222e-02f, +1.798218722e-03f, +6.932912481e-03f, -3.907441495e-04f, -3.875814623e-03f, -1.381019197e-04f, +1.896028970e-03f, +2.162325615e-04f, -7.390977517e-04f, -1.204457886e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.038944146e-04f, +7.100755228e-04f, -1.095434538e-03f, -2.580918558e-03f, +2.621480303e-03f, +5.350531292e-03f, -5.211242156e-03f, -9.241566711e-03f, +9.094789324e-03f, +1.401780783e-02f, -1.431007794e-02f, -1.917338496e-02f, +2.061344550e-02f, +2.400893786e-02f, -2.745003367e-02f, -2.777620049e-02f, +3.400938995e-02f, +2.985280254e-02f, -3.936588008e-02f, -2.989561778e-02f, +4.267401554e-02f, +2.792528431e-02f, -4.336642635e-02f, -2.431571937e-02f, +4.129624771e-02f, +1.969304298e-02f, -3.677961802e-02f, -1.477707477e-02f, +3.052373695e-02f, +1.021502299e-02f, -2.346122599e-02f, -6.455648525e-03f, +1.653981564e-02f, +3.694564383e-03f, -1.052775515e-02f, -1.895033950e-03f, +5.886391536e-03f, +8.639988871e-04f, -2.736317066e-03f, -3.488702474e-04f, +7.390977517e-04f, +1.204457886e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.788116752e-05f, -1.969985019e-05f, -1.320045167e-04f, +3.862912484e-05f, +2.856612353e-04f, -4.502470736e-05f, -5.378327322e-04f, +1.188374152e-05f, +9.220562475e-04f, +1.054137594e-04f, -1.479906409e-03f, -3.804142822e-04f, +2.274109596e-03f, +9.487336002e-04f, -3.429746212e-03f, -2.129837364e-03f, +5.276030544e-03f, +5.063230652e-03f, -8.981622363e-03f, -1.970963860e-02f, -9.031633674e-03f, +1.261988750e-02f, +1.907750995e-02f, +5.836317008e-03f, -6.291628868e-03f, -3.974347229e-03f, +3.069687240e-03f, +2.773696116e-03f, -1.619597138e-03f, -1.929002754e-03f, +8.437041567e-04f, +1.301839163e-03f, -4.118622482e-04f, -8.350541189e-04f, +1.792548715e-04f, +4.983588199e-04f, -6.508101615e-05f, -2.687855997e-04f, +1.807187045e-05f, +1.243938803e-04f, -4.756703036e-06f, -4.339035843e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.788116752e-05f, +1.969985019e-05f, +1.923991367e-04f, -8.610414198e-05f, -4.407562983e-04f, +2.319978392e-04f, +8.146046105e-04f, -4.918548230e-04f, -1.302011596e-03f, +8.905679790e-04f, +1.859660446e-03f, -1.429825661e-03f, -2.416904238e-03f, +2.078818033e-03f, +2.888908036e-03f, -2.772716986e-03f, -3.195857155e-03f, +3.421176404e-03f, +3.282762717e-03f, -3.925857803e-03f, -3.133756888e-03f, +4.202687952e-03f, +2.776296846e-03f, -4.202486263e-03f, -2.273900699e-03f, +3.923652468e-03f, +1.709759111e-03f, -3.412883114e-03f, -1.166429934e-03f, +2.753625988e-03f, +7.077976662e-04f, -2.045841319e-03f, -3.682833568e-04f, +1.383223723e-03f, +1.514835683e-04f, -8.344585772e-04f, -3.714043133e-05f, +4.332927888e-04f, -7.165599053e-06f, -1.789741028e-04f, +4.756703036e-06f, +4.339035843e-05f, +0.000000000e+00f, - /* 8, 7 (44) */ - +0.000000000e+00f, -2.560132471e-04f, -7.297753730e-04f, +5.994262142e-04f, +1.895145949e-03f, -9.662996318e-04f, -3.964033987e-03f, +1.152742120e-03f, +7.285447814e-03f, -8.085764820e-04f, -1.227243856e-02f, -6.156625050e-04f, +1.949051789e-02f, +3.999468559e-03f, -2.995913805e-02f, -1.097210106e-02f, +4.619058931e-02f, +2.558129482e-02f, -7.689394926e-02f, -6.441875526e-02f, +1.808166212e-01f, +4.456301736e-01f, +4.238600190e-01f, +1.418457099e-01f, -7.924071421e-02f, -6.540815096e-02f, +3.488314920e-02f, +4.092489967e-02f, -1.721888619e-02f, -2.735468035e-02f, +8.234634824e-03f, +1.824629361e-02f, -3.419712293e-03f, -1.174411447e-02f, +9.631646030e-04f, +7.112167352e-03f, +1.076146704e-04f, -3.940895639e-03f, -4.068875194e-04f, +1.914100841e-03f, +3.406264418e-04f, -7.438544547e-04f, -1.638361470e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.560132471e-04f, +7.297753730e-04f, -9.030354009e-04f, -2.667022700e-03f, +2.180724004e-03f, +5.582529131e-03f, -4.396637545e-03f, -9.733421534e-03f, +7.792777728e-03f, +1.490837581e-02f, -1.245041749e-02f, -2.060321062e-02f, +1.819654127e-02f, +2.608775589e-02f, -2.456112564e-02f, -3.054891748e-02f, +3.081353280e-02f, +3.327397895e-02f, -3.608311736e-02f, -3.382147558e-02f, +3.954025866e-02f, +3.212797226e-02f, -4.059012951e-02f, -2.851820563e-02f, +3.902234701e-02f, +2.361669545e-02f, -3.506985891e-02f, -1.818995788e-02f, +2.935730702e-02f, +1.296864898e-02f, -2.275342833e-02f, -8.501489845e-03f, +1.617153228e-02f, +5.077788106e-03f, -1.037627158e-02f, -2.729492528e-03f, +5.849251105e-03f, +1.297291676e-03f, -2.743482666e-03f, -5.278443502e-04f, +7.438544547e-04f, +1.638361470e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.684513548e-05f, -1.112692396e-05f, -1.306830424e-04f, +1.895381149e-05f, +2.825452050e-04f, -6.831782675e-06f, -5.291902169e-04f, -5.469910617e-05f, +9.004546514e-04f, +2.129558393e-04f, -1.431847895e-03f, -5.447075985e-04f, +2.175349606e-03f, +1.190165848e-03f, -3.233162014e-03f, -2.475914239e-03f, +4.868626925e-03f, +5.538047177e-03f, -7.936312500e-03f, -1.959126004e-02f, -1.028597968e-02f, +1.148417486e-02f, +1.937965128e-02f, +6.885646455e-03f, -5.947751127e-03f, -4.433227450e-03f, +2.789775403e-03f, +3.013623114e-03f, -1.414291854e-03f, -2.059816660e-03f, +6.995166794e-04f, +1.372201893e-03f, -3.153682513e-04f, -8.712864337e-04f, +1.185813556e-04f, +5.159372326e-04f, -2.997013018e-05f, -2.768669074e-04f, -1.080557890e-09f, +1.281167300e-04f, +2.952157736e-06f, -4.533196465e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.684513548e-05f, +1.112692396e-05f, +1.898612599e-04f, -5.382456666e-05f, -4.430000117e-04f, +1.659485128e-04f, +8.303046957e-04f, -3.783550747e-04f, -1.343980885e-03f, +7.189409073e-04f, +1.943405127e-03f, -1.195886599e-03f, -2.557712845e-03f, +1.787396621e-03f, +3.098026373e-03f, -2.438274842e-03f, -3.476757284e-03f, +3.066083240e-03f, +3.628673365e-03f, -3.576593616e-03f, -3.527382605e-03f, +3.884903787e-03f, +3.192060310e-03f, -3.936238367e-03f, -2.682284826e-03f, +3.720080067e-03f, +2.082666591e-03f, -3.273141382e-03f, -1.482154510e-03f, +2.670179440e-03f, +9.543311124e-04f, -2.005522523e-03f, -5.442155608e-04f, +1.371008737e-03f, +2.644949693e-04f, -8.368403219e-04f, -1.007734610e-04f, +4.404323169e-04f, +2.263539879e-05f, -1.853297907e-04f, -2.952157736e-06f, +4.533196465e-05f, +0.000000000e+00f, - /* 8, 8 (44) */ - +0.000000000e+00f, -2.091681116e-04f, -7.409022970e-04f, +4.687431718e-04f, +1.914099760e-03f, -6.837544268e-04f, -3.970865769e-03f, +6.235519031e-04f, +7.230748708e-03f, +9.187816936e-05f, -1.205948272e-02f, -2.047510400e-03f, +1.894581029e-02f, +6.174818164e-03f, -2.876897220e-02f, -1.420526308e-02f, +4.371467507e-02f, +3.044992175e-02f, -7.135590209e-02f, -7.235506776e-02f, +1.612253611e-01f, +4.353441939e-01f, +4.353441939e-01f, +1.612253611e-01f, -7.235506776e-02f, -7.135590209e-02f, +3.044992175e-02f, +4.371467507e-02f, -1.420526308e-02f, -2.876897220e-02f, +6.174818164e-03f, +1.894581029e-02f, -2.047510400e-03f, -1.205948272e-02f, +9.187816936e-05f, +7.230748708e-03f, +6.235519031e-04f, -3.970865769e-03f, -6.837544268e-04f, +1.914099760e-03f, +4.687431718e-04f, -7.409022970e-04f, -2.091681116e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.091681116e-04f, +7.409022970e-04f, -7.131741410e-04f, -2.720847267e-03f, +1.737723993e-03f, +5.748477644e-03f, -3.566332849e-03f, -1.011177661e-02f, +6.448796843e-03f, +1.562731672e-02f, -1.050701237e-02f, -2.179909722e-02f, +1.563882842e-02f, +2.787515251e-02f, -2.146309926e-02f, -3.298719232e-02f, +2.733677551e-02f, +3.634006219e-02f, -3.245444399e-02f, -3.739806920e-02f, +3.601287605e-02f, +3.601287605e-02f, -3.739806920e-02f, -3.245444399e-02f, +3.634006219e-02f, +2.733677551e-02f, -3.298719232e-02f, -2.146309926e-02f, +2.787515251e-02f, +1.563882842e-02f, -2.179909722e-02f, -1.050701237e-02f, +1.562731672e-02f, +6.448796843e-03f, -1.011177661e-02f, -3.566332849e-03f, +5.748477644e-03f, +1.737723993e-03f, -2.720847267e-03f, -7.131741410e-04f, +7.409022970e-04f, +2.091681116e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.533196465e-05f, -2.952157736e-06f, -1.281167300e-04f, +1.080557890e-09f, +2.768669074e-04f, +2.997013018e-05f, -5.159372326e-04f, -1.185813556e-04f, +8.712864337e-04f, +3.153682513e-04f, -1.372201893e-03f, -6.995166794e-04f, +2.059816660e-03f, +1.414291854e-03f, -3.013623114e-03f, -2.789775403e-03f, +4.433227450e-03f, +5.947751127e-03f, -6.885646455e-03f, -1.937965128e-02f, -1.148417486e-02f, +1.028597968e-02f, +1.959126004e-02f, +7.936312500e-03f, -5.538047177e-03f, -4.868626925e-03f, +2.475914239e-03f, +3.233162014e-03f, -1.190165848e-03f, -2.175349606e-03f, +5.447075985e-04f, +1.431847895e-03f, -2.129558393e-04f, -9.004546514e-04f, +5.469910617e-05f, +5.291902169e-04f, +6.831782675e-06f, -2.825452050e-04f, -1.895381149e-05f, +1.306830424e-04f, +1.112692396e-05f, -4.684513548e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.533196465e-05f, +2.952157736e-06f, +1.853297907e-04f, -2.263539879e-05f, -4.404323169e-04f, +1.007734610e-04f, +8.368403219e-04f, -2.644949693e-04f, -1.371008737e-03f, +5.442155608e-04f, +2.005522523e-03f, -9.543311124e-04f, -2.670179440e-03f, +1.482154510e-03f, +3.273141382e-03f, -2.082666591e-03f, -3.720080067e-03f, +2.682284826e-03f, +3.936238367e-03f, -3.192060310e-03f, -3.884903787e-03f, +3.527382605e-03f, +3.576593616e-03f, -3.628673365e-03f, -3.066083240e-03f, +3.476757284e-03f, +2.438274842e-03f, -3.098026373e-03f, -1.787396621e-03f, +2.557712845e-03f, +1.195886599e-03f, -1.943405127e-03f, -7.189409073e-04f, +1.343980885e-03f, +3.783550747e-04f, -8.303046957e-04f, -1.659485128e-04f, +4.430000117e-04f, +5.382456666e-05f, -1.898612599e-04f, -1.112692396e-05f, +4.684513548e-05f, +0.000000000e+00f, - /* 8, 9 (44) */ - +0.000000000e+00f, -1.638361470e-04f, -7.438544547e-04f, +3.406264418e-04f, +1.914100841e-03f, -4.068875194e-04f, -3.940895639e-03f, +1.076146704e-04f, +7.112167352e-03f, +9.631646030e-04f, -1.174411447e-02f, -3.419712293e-03f, +1.824629361e-02f, +8.234634824e-03f, -2.735468035e-02f, -1.721888619e-02f, +4.092489967e-02f, +3.488314920e-02f, -6.540815096e-02f, -7.924071421e-02f, +1.418457099e-01f, +4.238600190e-01f, +4.456301736e-01f, +1.808166212e-01f, -6.441875526e-02f, -7.689394926e-02f, +2.558129482e-02f, +4.619058931e-02f, -1.097210106e-02f, -2.995913805e-02f, +3.999468559e-03f, +1.949051789e-02f, -6.156625050e-04f, -1.227243856e-02f, -8.085764820e-04f, +7.285447814e-03f, +1.152742120e-03f, -3.964033987e-03f, -9.662996318e-04f, +1.895145949e-03f, +5.994262142e-04f, -7.297753730e-04f, -2.560132471e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.638361470e-04f, +7.438544547e-04f, -5.278443502e-04f, -2.743482666e-03f, +1.297291676e-03f, +5.849251105e-03f, -2.729492528e-03f, -1.037627158e-02f, +5.077788106e-03f, +1.617153228e-02f, -8.501489845e-03f, -2.275342833e-02f, +1.296864898e-02f, +2.935730702e-02f, -1.818995788e-02f, -3.506985891e-02f, +2.361669545e-02f, +3.902234701e-02f, -2.851820563e-02f, -4.059012951e-02f, +3.212797226e-02f, +3.954025866e-02f, -3.382147558e-02f, -3.608311736e-02f, +3.327397895e-02f, +3.081353280e-02f, -3.054891748e-02f, -2.456112564e-02f, +2.608775589e-02f, +1.819654127e-02f, -2.060321062e-02f, -1.245041749e-02f, +1.490837581e-02f, +7.792777728e-03f, -9.733421534e-03f, -4.396637545e-03f, +5.582529131e-03f, +2.180724004e-03f, -2.667022700e-03f, -9.030354009e-04f, +7.297753730e-04f, +2.560132471e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.339035843e-05f, +4.756703036e-06f, -1.243938803e-04f, -1.807187045e-05f, +2.687855997e-04f, +6.508101615e-05f, -4.983588199e-04f, -1.792548715e-04f, +8.350541189e-04f, +4.118622482e-04f, -1.301839163e-03f, -8.437041567e-04f, +1.929002754e-03f, +1.619597138e-03f, -2.773696116e-03f, -3.069687240e-03f, +3.974347229e-03f, +6.291628868e-03f, -5.836317008e-03f, -1.907750995e-02f, -1.261988750e-02f, +9.031633674e-03f, +1.970963860e-02f, +8.981622363e-03f, -5.063230652e-03f, -5.276030544e-03f, +2.129837364e-03f, +3.429746212e-03f, -9.487336002e-04f, -2.274109596e-03f, +3.804142822e-04f, +1.479906409e-03f, -1.054137594e-04f, -9.220562475e-04f, -1.188374152e-05f, +5.378327322e-04f, +4.502470736e-05f, -2.856612353e-04f, -3.862912484e-05f, +1.320045167e-04f, +1.969985019e-05f, -4.788116752e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.339035843e-05f, -4.756703036e-06f, +1.789741028e-04f, +7.165599053e-06f, -4.332927888e-04f, +3.714043133e-05f, +8.344585772e-04f, -1.514835683e-04f, -1.383223723e-03f, +3.682833568e-04f, +2.045841319e-03f, -7.077976662e-04f, -2.753625988e-03f, +1.166429934e-03f, +3.412883114e-03f, -1.709759111e-03f, -3.923652468e-03f, +2.273900699e-03f, +4.202486263e-03f, -2.776296846e-03f, -4.202687952e-03f, +3.133756888e-03f, +3.925857803e-03f, -3.282762717e-03f, -3.421176404e-03f, +3.195857155e-03f, +2.772716986e-03f, -2.888908036e-03f, -2.078818033e-03f, +2.416904238e-03f, +1.429825661e-03f, -1.859660446e-03f, -8.905679790e-04f, +1.302011596e-03f, +4.918548230e-04f, -8.146046105e-04f, -2.319978392e-04f, +4.407562983e-04f, +8.610414198e-05f, -1.923991367e-04f, -1.969985019e-05f, +4.788116752e-05f, +0.000000000e+00f, - /* 8,10 (44) */ - +0.000000000e+00f, -1.204457886e-04f, -7.390977517e-04f, +2.162325615e-04f, +1.896028970e-03f, -1.381019197e-04f, -3.875814623e-03f, -3.907441495e-04f, +6.932912481e-03f, +1.798218722e-03f, -1.133225222e-02f, -4.721551456e-03f, +1.740258945e-02f, +1.016363758e-02f, -2.573508321e-02f, -1.999258231e-02f, +3.785521243e-02f, +3.885749643e-02f, -5.911652209e-02f, -8.507703122e-02f, +1.227681999e-01f, +4.112401315e-01f, +4.546618072e-01f, +2.005262598e-01f, -5.543713289e-02f, -8.195717992e-02f, +2.030526428e-02f, +4.832042667e-02f, -7.542354851e-03f, -3.090787165e-02f, +1.725358962e-03f, +1.987093217e-02f, +8.642439036e-04f, -1.237785232e-02f, -1.730632730e-03f, +7.273564073e-03f, +1.690574852e-03f, -3.919009279e-03f, -1.251960867e-03f, +1.856516824e-03f, +7.314307309e-04f, -7.100755228e-04f, -3.038944146e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.204457886e-04f, +7.390977517e-04f, -3.488702474e-04f, -2.736317066e-03f, +8.639988871e-04f, +5.886391536e-03f, -1.895033950e-03f, -1.052775515e-02f, +3.694564383e-03f, +1.653981564e-02f, -6.455648525e-03f, -2.346122599e-02f, +1.021502299e-02f, +3.052373695e-02f, -1.477707477e-02f, -3.677961802e-02f, +1.969304298e-02f, +4.129624771e-02f, -2.431571937e-02f, -4.336642635e-02f, +2.792528431e-02f, +4.267401554e-02f, -2.989561778e-02f, -3.936588008e-02f, +2.985280254e-02f, +3.400938995e-02f, -2.777620049e-02f, -2.745003367e-02f, +2.400893786e-02f, +2.061344550e-02f, -1.917338496e-02f, -1.431007794e-02f, +1.401780783e-02f, +9.094789324e-03f, -9.241566711e-03f, -5.211242156e-03f, +5.350531292e-03f, +2.621480303e-03f, -2.580918558e-03f, -1.095434538e-03f, +7.100755228e-04f, +3.038944146e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.107153860e-05f, +1.194062833e-05f, -1.196109415e-04f, -3.512353509e-05f, +2.584781305e-04f, +9.822821321e-05f, -4.767717013e-04f, -2.362580365e-04f, +7.923109627e-04f, +5.017265645e-04f, -1.221704309e-03f, -9.762597131e-04f, +1.784496961e-03f, +1.804773863e-03f, -2.516054581e-03f, -3.314250424e-03f, +3.496554457e-03f, +6.569456489e-03f, -4.794878850e-03f, -1.868807609e-02f, -1.368720055e-02f, +7.727842011e-03f, +1.973265539e-02f, +1.001479077e-02f, -4.524509575e-03f, -5.651013484e-03f, +1.753606875e-03f, +3.600941485e-03f, -6.917080224e-04f, -2.354718005e-03f, +2.078939901e-04f, +1.515590808e-03f, +6.397055724e-06f, -9.356458443e-04f, -8.061603855e-05f, +5.416153511e-04f, +8.428333986e-05f, -2.860756854e-04f, -5.885516513e-05f, +1.320023646e-04f, +2.859485025e-05f, -4.839462908e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.107153860e-05f, -1.194062833e-05f, +1.709766679e-04f, +3.531111780e-05f, -4.218623792e-04f, -2.432513126e-05f, +8.234949991e-04f, -4.048418938e-05f, -1.380908477e-03f, +1.930026237e-04f, +2.064422979e-03f, -4.589264150e-04f, -2.807688605e-03f, +8.436215584e-04f, +3.516266209e-03f, -1.323558370e-03f, -4.085731968e-03f, +1.845278111e-03f, +4.424887605e-03f, -2.333654438e-03f, -4.477518245e-03f, +2.708037002e-03f, +4.236169460e-03f, -2.901890653e-03f, -3.743717416e-03f, +2.879963865e-03f, +3.082307693e-03f, -2.647531089e-03f, -2.353177519e-03f, +2.248743779e-03f, +1.653540093e-03f, -1.754695733e-03f, -1.057192249e-03f, +1.245131973e-03f, +6.037516229e-04f, -7.895872538e-04f, -2.982175889e-04f, +4.335076091e-04f, +1.191481753e-04f, -1.927900639e-04f, -2.859485025e-05f, +4.839462908e-05f, +0.000000000e+00f, - /* 8,11 (44) */ - +0.000000000e+00f, -7.937424996e-05f, -7.271571233e-04f, +9.662161999e-05f, +1.860905435e-03f, +1.203762108e-04f, -3.777586410e-03f, -8.675158509e-04f, +6.696654445e-03f, +2.590529685e-03f, -1.083052566e-02f, -5.943255765e-03f, +1.642632974e-02f, +1.194813454e-02f, -2.393030935e-02f, -2.250863689e-02f, +3.454096200e-02f, +4.235405088e-02f, -5.254706560e-02f, -8.987191007e-02f, +1.040801238e-01f, +3.975529310e-01f, +4.623896493e-01f, +2.202589152e-01f, -4.542234212e-02f, -8.648168949e-02f, +1.465425080e-02f, +5.007403355e-02f, -3.941413366e-03f, -3.159957967e-02f, -6.293590427e-04f, +2.007882616e-02f, +2.379834711e-03f, -1.237145527e-02f, -2.666278574e-03f, +7.192948034e-03f, +2.232190203e-03f, -3.834725940e-03f, -1.538036552e-03f, +1.797661659e-03f, +8.634330955e-04f, -6.814806726e-04f, -3.522890437e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.937424996e-05f, +7.271571233e-04f, -1.778935794e-04f, -2.701005949e-03f, +4.421365079e-04f, +5.862066405e-03f, -1.071538951e-03f, -1.056823934e-02f, +2.313655906e-03f, +1.673281826e-02f, -4.391225546e-03f, -2.392015241e-02f, +7.407334389e-03f, +3.136735851e-02f, -1.126080856e-02f, -3.810317639e-02f, +1.560731101e-02f, +4.314152582e-02f, -1.989083176e-02f, -4.570008079e-02f, +2.344776607e-02f, +4.538205255e-02f, -2.565944832e-02f, -4.226777073e-02f, +2.610908513e-02f, +3.688935382e-02f, -2.469389280e-02f, -3.009756476e-02f, +2.165576034e-02f, +2.286218928e-02f, -1.751984486e-02f, -1.606477367e-02f, +1.296061558e-02f, +1.033992130e-02f, -8.637815088e-03f, -6.000829409e-03f, +5.052313703e-03f, +3.054987912e-03f, -2.461770383e-03f, -1.288224602e-03f, +6.814806726e-04f, +3.522890437e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.842849568e-05f, +1.854956279e-05f, -1.138711112e-04f, -5.102892682e-05f, +2.461364923e-04f, +1.291681340e-04f, -4.515201670e-04f, -2.891787024e-04f, +7.436542395e-04f, +5.843318427e-04f, -1.132805076e-03f, -1.096305901e-03f, +1.627968675e-03f, +1.968727041e-03f, -2.243453307e-03f, -3.522402851e-03f, +3.004433560e-03f, +6.781491515e-03f, -3.767704577e-03f, -1.821510479e-02f, -1.468064983e-02f, +6.381639287e-03f, +1.965876471e-02f, +1.102898683e-02f, -3.923587290e-03f, -5.989278435e-03f, +1.349604660e-03f, +3.744470874e-03f, -4.209902531e-04f, -2.415925241e-03f, +2.851540742e-05f, +1.538208371e-03f, +1.215496279e-04f, -9.408412593e-04f, -1.509076622e-04f, +5.403279595e-04f, +1.242594839e-04f, -2.836714180e-04f, -7.944665265e-05f, +1.306086261e-04f, +3.772798779e-05f, -4.834410762e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.842849568e-05f, -1.854956279e-05f, +1.615301094e-04f, +6.156610171e-05f, -4.064584806e-04f, -8.304557818e-05f, +8.043669378e-04f, +6.739694859e-05f, -1.364492529e-03f, +2.017944628e-05f, +2.061556128e-03f, -2.103311512e-04f, -2.832316186e-03f, +5.171517757e-04f, +3.582695493e-03f, -9.281659166e-04f, -4.205021212e-03f, +1.400944966e-03f, +4.601379392e-03f, -1.868750069e-03f, -4.706626740e-03f, +2.254569416e-03f, +4.504240370e-03f, -2.489820397e-03f, -4.030174318e-03f, +2.532048830e-03f, +3.363584131e-03f, -2.376001048e-03f, -2.607366901e-03f, +2.054528295e-03f, +1.864480710e-03f, -1.629154798e-03f, -1.216916679e-03f, +1.173536764e-03f, +7.127823102e-04f, -7.551990102e-04f, -3.638746578e-04f, +4.211106389e-04f, +1.526052546e-04f, -1.908995503e-04f, -3.772798779e-05f, +4.834410762e-05f, +0.000000000e+00f, - /* 8,12 (44) */ - +0.000000000e+00f, -4.094575428e-05f, -7.086075605e-04f, -1.724949120e-05f, +1.809876508e-03f, +3.665127031e-04f, -3.648418276e-03f, -1.319036018e-03f, +6.407475742e-03f, +3.334183924e-03f, -1.024619382e-02f, -7.076060841e-03f, +1.533002384e-02f, +1.357610321e-02f, -2.196158231e-02f, -2.475209020e-02f, +3.101855915e-02f, +4.535848444e-02f, -4.576557409e-02f, -9.363961465e-02f, +8.586501903e-02f, +3.828722811e-01f, +4.687712885e-01f, +2.399176799e-01f, -3.439335529e-02f, -9.040527678e-02f, +8.664972362e-03f, +5.142363821e-02f, -1.969424922e-04f, -3.202056993e-02f, -3.045284283e-03f, +2.010734157e-02f, +3.918043083e-03f, -1.224990564e-02f, -3.607119833e-03f, +7.042040372e-03f, +2.772518163e-03f, -3.710466456e-03f, -1.821707971e-03f, +1.718215006e-03f, +9.940417215e-04f, -6.437526848e-04f, -4.006331513e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.094575428e-05f, +7.086075605e-04f, -1.636347006e-05f, -2.639439847e-03f, +3.567802731e-05f, +5.779020827e-03f, -2.671720134e-04f, -1.050084239e-02f, +9.491633768e-04f, +1.675299771e-02f, -2.329669418e-03f, -2.413048356e-02f, +4.575018202e-03f, +3.188451029e-02f, -7.678113066e-03f, -3.903134231e-02f, +1.140228980e-02f, +4.454247079e-02f, -1.528945237e-02f, -4.756883086e-02f, +1.874113933e-02f, +4.763662196e-02f, -2.115520795e-02f, -4.475759113e-02f, +2.207891081e-02f, +3.942140265e-02f, -2.133030867e-02f, -3.247356581e-02f, +1.904839344e-02f, +2.491671758e-02f, -1.565536415e-02f, -1.769392847e-02f, +1.174369890e-02f, +1.151345806e-02f, -7.925032778e-03f, -6.756028420e-03f, +4.688439045e-03f, +3.476098551e-03f, -2.309165128e-03f, -1.479124152e-03f, +6.437526848e-04f, +4.006331513e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.551525150e-05f, +2.454257125e-05f, -1.072829234e-04f, -6.568020226e-05f, +2.319653085e-04f, +1.576876388e-04f, -4.229718227e-04f, -3.376565750e-04f, +6.897183060e-04f, +6.591341691e-04f, -1.036201354e-03f, -1.203102599e-03f, +1.461150555e-03f, +2.110578708e-03f, -1.958702524e-03f, -3.693419733e-03f, +2.502548952e-03f, +6.928461094e-03f, -2.760942598e-03f, -1.766283529e-02f, -1.559525887e-02f, +5.000343093e-03f, +1.948702236e-02f, +1.201738174e-02f, -3.262659615e-03f, -6.286692566e-03f, +9.205208281e-04f, +3.858238810e-03f, -1.386575125e-04f, -2.456625632e-03f, -1.562510821e-04f, +1.547169434e-03f, +2.390578810e-04f, -9.373291153e-04f, -2.221340670e-04f, +5.338031835e-04f, +1.645847664e-04f, -2.783555512e-04f, -1.002063120e-04f, +1.277674190e-04f, +4.700808171e-05f, -4.769294207e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.551525150e-05f, -2.454257125e-05f, +1.508342662e-04f, +8.572907829e-05f, -3.874297558e-04f, -1.384958074e-04f, +7.775662099e-04f, +1.711211164e-04f, -1.334543715e-03f, -1.484504698e-04f, +2.037748604e-03f, +3.542794466e-05f, -2.827765709e-03f, +1.904302771e-04f, +3.611967365e-03f, -5.277348038e-04f, -4.280677796e-03f, +9.455611626e-04f, +4.730384443e-03f, -1.386417312e-03f, -4.887722949e-03f, +1.777991320e-03f, +4.727213046e-03f, -2.050656220e-03f, -4.277369306e-03f, +2.155442434e-03f, +3.613344933e-03f, -2.076766203e-03f, -2.838446164e-03f, +1.835852403e-03f, +2.060186002e-03f, -1.483916041e-03f, -1.367872721e-03f, +1.087586590e-03f, +8.176767188e-04f, -7.114893926e-04f, -4.282141356e-04f, +4.034761595e-04f, +1.861016712e-04f, -1.866147110e-04f, -4.700808171e-05f, +4.769294207e-05f, +0.000000000e+00f, - /* 8,13 (44) */ - +0.000000000e+00f, -5.430502781e-06f, -6.840649893e-04f, -1.245324146e-04f, +1.744196306e-03f, +5.984780117e-04f, -3.490730637e-03f, -1.742007841e-03f, +6.069819167e-03f, +4.023902230e-03f, -9.587059646e-03f, -8.112262196e-03f, +1.412692124e-02f, +1.503725377e-02f, -1.985100360e-02f, -2.671079272e-02f, +2.732513942e-02f, +4.786103340e-02f, -3.883711299e-02f, -9.640055725e-02f, +6.820218374e-02f, +3.672770223e-01f, +4.737716316e-01f, +2.594047022e-01f, -2.237597355e-02f, -9.366793640e-02f, +2.378279796e-03f, +5.234415903e-02f, +3.661296318e-03f, -3.215922744e-02f, -5.501909915e-03f, +1.995109049e-02f, +5.465212517e-03f, -1.201084776e-02f, -4.544448948e-03f, +6.819906305e-03f, +3.306321346e-03f, -3.545881689e-03f, -2.100063522e-03f, +1.618008694e-03f, +1.121809141e-03f, -5.967446031e-04f, -4.483260934e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.430502781e-06f, +6.840649893e-04f, +1.344707961e-04f, -2.553710769e-03f, -3.517517285e-04f, +5.640525020e-03f, +5.103941965e-04f, -1.032972127e-02f, -3.853803383e-04f, +1.660454724e-02f, -2.919208143e-04f, -2.409505562e-02f, +1.747252493e-03f, +3.207494056e-02f, -4.066145701e-03f, -3.955907711e-02f, +7.121612003e-03f, +4.548803195e-02f, -1.055906793e-02f, -4.895524817e-02f, +1.385341638e-02f, +4.941461328e-02f, -1.642799490e-02f, -4.680824735e-02f, +1.780154150e-02f, +4.157684508e-02f, -1.771696373e-02f, -3.455033201e-02f, +1.620994727e-02f, +2.675256998e-02f, -1.359517815e-02f, -1.917784451e-02f, +1.037582618e-02f, +1.260104465e-02f, -7.107356059e-03f, -7.467517812e-03f, +4.260224910e-03f, +3.879574710e-03f, -2.123063457e-03f, -1.665738863e-03f, +5.967446031e-04f, +4.483260934e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.238614251e-05f, +2.988787338e-05f, -9.995883490e-05f, -7.898707982e-05f, +2.161792827e-04f, +1.836050578e-04f, -3.915132464e-04f, -3.813850264e-04f, +6.311675135e-04f, +7.256777112e-04f, -9.329939847e-04f, -1.296050107e-03f, +1.285821334e-03f, +2.229670092e-03f, -1.664642242e-03f, -3.826910903e-03f, +1.995409702e-03f, +7.011546824e-03f, -1.780477243e-03f, -1.703595698e-02f, -1.642657021e-02f, +3.591505477e-03f, +1.921709714e-02f, +1.297319719e-02f, -2.544408182e-03f, -6.539323918e-03f, +4.693393252e-04f, +3.940354256e-03f, +1.530509239e-04f, -2.475871378e-03f, -3.448443249e-04f, +1.541995804e-03f, +3.578843506e-04f, -9.248699457e-04f, -2.936413168e-04f, +5.219194978e-04f, +2.048736546e-04f, -2.700613610e-04f, -1.209264873e-04f, +1.234361062e-04f, +5.633742412e-05f, -4.640993010e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.238614251e-05f, -2.988787338e-05f, +1.390933055e-04f, +1.076330211e-04f, -3.651508023e-04f, -1.902072397e-04f, +7.436511503e-04f, +2.697264117e-04f, -1.291758293e-03f, -3.112387393e-04f, +1.993717300e-03f, +2.758704644e-04f, -2.794594309e-03f, -1.331817181e-04f, +3.604266988e-03f, -1.264254265e-04f, -4.312319161e-03f, +4.838688553e-04f, +4.810825532e-03f, -8.916550208e-04f, -5.019017235e-03f, +1.283182136e-03f, +4.902691787e-03f, -1.588801705e-03f, -4.482514405e-03f, +1.753801711e-03f, +3.828686751e-03f, -1.752595690e-03f, -3.043677248e-03f, +1.594596247e-03f, +2.238310358e-03f, -1.320087845e-03f, -1.508241484e-03f, +9.878083628e-04f, +9.171717255e-04f, -6.586139036e-04f, -4.904672768e-04f, +3.805723284e-04f, +2.192450057e-04f, -1.798468566e-04f, -5.633742412e-05f, +4.640993010e-05f, +0.000000000e+00f, - /* 8,14 (44) */ - +0.000000000e+00f, +2.695563973e-05f, -6.541771159e-04f, -2.244912495e-04f, +1.665209226e-03f, +8.146572943e-04f, -3.307125579e-03f, -2.133521087e-03f, +5.688434141e-03f, +4.655069744e-03f, -8.861381935e-03f, -9.045256180e-03f, +1.283087113e-02f, +1.632307510e-02f, -1.762133351e-02f, -2.837543496e-02f, +2.349822851e-02f, +4.985644310e-02f, -3.182556617e-02f, -9.818103449e-02f, +5.116622676e-02f, +3.508504521e-01f, +4.773631371e-01f, +2.786217994e-01f, -9.402776357e-03f, -9.621234458e-02f, -4.161044122e-03f, +5.281349836e-02f, +7.601650574e-03f, -3.200617651e-02f, -7.977781293e-03f, +1.960624616e-02f, +7.007208321e-03f, -1.165296341e-02f, -5.469318894e-03f, +6.526264988e-03f, +3.828240844e-03f, -3.341008035e-03f, -2.370124883e-03f, +1.497082207e-03f, +1.245245247e-03f, -5.404071790e-04f, -4.947360235e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.695563973e-05f, +6.541771159e-04f, +2.735641016e-04f, -2.446077748e-03f, -7.169025308e-04f, +5.450317780e-03f, +1.254045347e-03f, -1.005999486e-02f, -1.677138632e-03f, +1.629330850e-02f, +1.701796486e-03f, -2.381918515e-02f, -1.047341816e-03f, +3.194175885e-02f, -4.618787135e-04f, -3.968550254e-02f, +2.809292843e-03f, +4.597190081e-02f, -5.748242393e-03f, -4.984690319e-02f, +8.834399142e-03f, +5.069779542e-02f, -1.152530311e-02f, -4.839704905e-02f, +1.331902710e-02f, +4.333064679e-02f, -1.388827698e-02f, -3.630292770e-02f, +1.316627002e-02f, +2.834716623e-02f, -1.135686779e-02f, -2.049793236e-02f, +8.867584699e-03f, +1.358885301e-02f, -6.190184334e-03f, -8.126131716e-03f, +3.769757633e-03f, +4.260147039e-03f, -1.903818451e-03f, -1.845585719e-03f, +5.404071790e-04f, +4.947360235e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.909513156e-05f, +3.456277161e-05f, -9.201382764e-05f, -9.087705687e-05f, +1.990006381e-04f, +2.067708630e-04f, -3.575455993e-04f, -4.201123347e-04f, +5.686890412e-04f, +7.835964559e-04f, -8.243134910e-04f, -1.374690872e-03f, +1.103788633e-03f, +2.325561793e-03f, -1.364116952e-03f, -3.922815420e-03f, +1.487435369e-03f, +7.032366365e-03f, -8.318913589e-04f, -1.633957237e-02f, -1.717067280e-02f, +2.162862672e-03f, +1.884927793e-02f, +1.388975381e-02f, -1.771989956e-03f, -6.743476916e-03f, -6.792324100e-07f, +3.989152634e-03f, +4.517495490e-04f, -2.472885404e-03f, -5.356244570e-04f, +1.522328357e-03f, +4.769486025e-04f, -9.033027300e-04f, -3.647515618e-04f, +5.046039744e-04f, +2.447267536e-04f, -2.587499785e-04f, -1.413909328e-04f, +1.175863630e-04f, +6.561260708e-05f, -4.447000076e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.909513156e-05f, -3.456277161e-05f, +1.265129176e-04f, +1.271457542e-04f, -3.400167222e-04f, -2.377710009e-04f, +7.032381695e-04f, +3.623359676e-04f, -1.236949904e-03f, -4.666398829e-04f, +1.930375961e-03f, +5.086205797e-04f, -2.733648279e-03f, -4.504061946e-04f, +3.560161383e-03f, +2.716382553e-04f, -4.300022554e-03f, +2.064217926e-05f, +4.842134161e-03f, -3.895744136e-04f, -5.099238890e-03f, +7.752124316e-04f, +5.028768897e-03f, -1.108914643e-03f, -4.643243197e-03f, +1.331074280e-03f, +4.007037969e-03f, -1.406553845e-03f, -3.220556109e-03f, +1.332909937e-03f, +2.396651528e-03f, -1.139001349e-03f, -1.636274853e-03f, +8.748938469e-04f, +1.010025620e-03f, -5.968357629e-04f, -5.498599193e-04f, +3.524274318e-04f, +2.516281064e-04f, -1.705338903e-04f, -6.561260708e-05f, +4.447000076e-05f, +0.000000000e+00f, - /* 8,15 (44) */ - +0.000000000e+00f, +5.605077129e-05f, -6.196143443e-04f, -3.165050772e-04f, +1.574332169e-03f, +1.013657932e-03f, -3.100354716e-03f, -2.491066686e-03f, +5.268321806e-03f, +5.223758785e-03f, -8.077785479e-03f, -9.869569671e-03f, +1.145618026e-02f, +1.742686374e-02f, -1.529577171e-02f, -2.973955191e-02f, +1.957541309e-02f, +5.134387847e-02f, -2.479319980e-02f, -9.901292585e-02f, +3.482665439e-02f, +3.336797793e-01f, +4.795259998e-01f, +2.974710773e-01f, +4.486977456e-03f, -9.798433453e-02f, -1.090452104e-02f, +5.281281913e-02f, +1.159080321e-02f, -3.155442696e-02f, -1.045066670e-02f, +1.907062170e-02f, +8.529536678e-03f, -1.117601480e-02f, -6.372621624e-03f, +6.161513426e-03f, +4.332844818e-03f, -3.096281281e-03f, -2.628874861e-03f, +1.355691274e-03f, +1.362831610e-03f, -4.747945719e-04f, -5.392060243e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.605077129e-05f, +6.196143443e-04f, +4.000770192e-04f, -2.318931993e-03f, -1.056919253e-03f, +5.212546779e-03f, +1.957283516e-03f, -9.697658891e-03f, -2.914088535e-03f, +1.582666861e-02f, +3.632172447e-03f, -2.331056457e-02f, -3.780990095e-03f, +3.149135265e-02f, +3.098282669e-03f, -3.941386428e-02f, -1.490729711e-03f, +4.599254299e-02f, -9.061082325e-04f, -5.023647761e-02f, +3.735160252e-03f, +5.147300785e-02f, -6.496534218e-03f, -4.950596369e-02f, +8.675783903e-03f, +4.466172107e-02f, -9.881239015e-03f, -3.770948155e-02f, +9.945713914e-03f, +2.968007616e-02f, -8.960216265e-03f, -2.163693371e-02f, +7.231309846e-03f, +1.446374686e-02f, -5.180158713e-03f, -8.722967479e-03f, +3.219897714e-03f, +4.612574470e-03f, -1.652190345e-03f, -2.016119610e-03f, +4.747945719e-04f, +5.392060243e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.569515524e-05f, +3.855347749e-05f, -8.356404177e-05f, -1.012954305e-04f, +1.806565744e-04f, +2.270679961e-04f, -3.214802361e-04f, -4.536423550e-04f, +5.029857206e-04f, +8.326150558e-04f, -7.113088342e-04f, -1.438709876e-03f, +9.168719580e-04f, +2.398032028e-03f, -1.059950903e-03f, -3.981393558e-03f, +9.829232678e-04f, +6.992952053e-03f, +7.956834231e-05f, -1.557915740e-02f, -1.782422552e-02f, +7.222834590e-04f, +1.838447645e-02f, +1.476051954e-02f, -9.490229708e-04f, -6.895726713e-03f, -4.860173922e-04f, +4.003216328e-03f, +7.549241477e-04f, -2.447072989e-03f, -7.268860082e-04f, +1.487933707e-03f, +5.951362975e-04f, -8.725487992e-04f, -4.347689209e-04f, +4.818346326e-04f, +2.837343586e-04f, -2.444118589e-04f, -1.613767670e-04f, +1.102051290e-04f, +7.472545295e-05f, -4.185484257e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.569515524e-05f, -3.855347749e-05f, +1.132976271e-04f, +1.441699117e-04f, -3.124376673e-04f, -2.808403007e-04f, +6.569929318e-04f, +4.481649702e-04f, -1.171037534e-03f, -6.132254185e-04f, +1.848821109e-03f, +7.314302511e-04f, -2.646049143e-03f, -7.580816744e-04f, +3.480588537e-03f, +6.624116387e-04f, -4.244320116e-03f, -4.393630174e-04f, +4.824253892e-03f, +1.146548538e-04f, -5.127648687e-03f, +2.592907924e-04f, +5.104045782e-03f, -6.158590596e-04f, -4.757638244e-03f, +8.914588966e-04f, +4.146189187e-03f, -1.041971095e-03f, -3.366842708e-03f, +1.053194813e-03f, +2.533177027e-03f, -9.422006148e-04f, -1.750316290e-03f, +7.496963344e-04f, +1.095032644e-03f, -5.265264426e-04f, -6.056212654e-04f, +3.191320079e-04f, +2.828334246e-04f, -1.586424720e-04f, -7.472545295e-05f, +4.185484257e-05f, +0.000000000e+00f, - /* 9, 0 (40) */ - +0.000000000e+00f, -7.017253429e-04f, -1.750424134e-04f, +2.058419758e-03f, -1.982704743e-04f, -4.434814470e-03f, +1.641618436e-03f, +7.968272772e-03f, -5.099884949e-03f, -1.256166394e-02f, +1.191669646e-02f, +1.783553129e-02f, -2.422063161e-02f, -2.315743311e-02f, +4.659175191e-02f, +2.775293222e-02f, -9.501521185e-02f, -3.087432576e-02f, +3.144630653e-01f, +5.319805819e-01f, +3.144630653e-01f, -3.087432576e-02f, -9.501521185e-02f, +2.775293222e-02f, +4.659175191e-02f, -2.315743311e-02f, -2.422063161e-02f, +1.783553129e-02f, +1.191669646e-02f, -1.256166394e-02f, -5.099884949e-03f, +7.968272772e-03f, +1.641618436e-03f, -4.434814470e-03f, -1.982704743e-04f, +2.058419758e-03f, -1.750424134e-04f, -7.017253429e-04f, +1.133055274e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.017253429e-04f, +1.750424134e-04f, -2.819252016e-03f, +1.317047024e-03f, +5.813065763e-03f, -5.638484823e-03f, -8.056056973e-03f, +1.356304760e-02f, +6.644294405e-03f, -2.362138728e-02f, +9.950267494e-04f, +3.194086253e-02f, -1.503480532e-02f, -3.374209658e-02f, +3.210410297e-02f, +2.603063562e-02f, -4.623861285e-02f, -9.813316511e-03f, +5.173229864e-02f, -9.813316511e-03f, -4.623861285e-02f, +2.603063562e-02f, +3.210410297e-02f, -3.374209658e-02f, -1.503480532e-02f, +3.194086253e-02f, +9.950267494e-04f, -2.362138728e-02f, +6.644294405e-03f, +1.356304760e-02f, -8.056056973e-03f, -5.638484823e-03f, +5.813065763e-03f, +1.317047024e-03f, -2.819252016e-03f, +8.373329469e-05f, +7.017253429e-04f, -1.133055274e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.843734294e-05f, -1.214566576e-04f, -7.472014895e-05f, +3.218869068e-04f, +4.469181001e-05f, -6.602637232e-04f, +1.228524648e-04f, +1.155179992e-03f, -5.457330918e-04f, -1.806291018e-03f, +1.393878176e-03f, +2.611918560e-03f, -2.961245233e-03f, -3.660171795e-03f, +6.004267817e-03f, +5.706661215e-03f, -1.414466048e-02f, -2.348852223e-02f, -9.815742514e-04f, +2.295187420e-02f, +1.546450254e-02f, -4.903822234e-03f, -6.553589036e-03f, +3.261396848e-03f, +3.318981920e-03f, -2.420637634e-03f, -1.639950353e-03f, +1.729177185e-03f, +7.072796253e-04f, -1.137512275e-03f, -2.193896372e-04f, +6.680518135e-04f, +5.477384785e-06f, -3.355126957e-04f, +5.377230458e-05f, +1.317810928e-04f, -4.287448115e-05f, -2.973358537e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.843734294e-05f, +1.214566576e-04f, +6.611005247e-05f, -4.953319912e-04f, +1.616505191e-04f, +9.145006501e-04f, -8.057764558e-04f, -1.146118613e-03f, +1.880473749e-03f, +8.100621742e-04f, -3.094701674e-03f, +3.389294331e-04f, +3.899152682e-03f, -2.171261040e-03f, -3.748628172e-03f, +4.130118087e-03f, +2.443118584e-03f, -5.457193385e-03f, -3.156886903e-04f, +5.589460748e-03f, -1.888406059e-03f, -4.477572991e-03f, +3.389085798e-03f, +2.611983874e-03f, -3.769404223e-03f, -7.399153723e-04f, +3.143917298e-03f, -5.342574714e-04f, -2.013366884e-03f, +1.009860492e-03f, +9.358410193e-04f, -8.784127114e-04f, -2.445082970e-04f, +5.043349974e-04f, -3.186974957e-05f, -1.820124374e-04f, +4.287448115e-05f, +2.973358537e-05f, +0.000000000e+00f, - /* 9, 1 (40) */ - +0.000000000e+00f, -6.532880000e-04f, -2.964990710e-04f, +1.983699609e-03f, +1.236164325e-04f, -4.390122660e-03f, +9.813547128e-04f, +8.091125237e-03f, -3.944704957e-03f, -1.310739703e-02f, +1.011040544e-02f, +1.922940947e-02f, -2.160871305e-02f, -2.611867834e-02f, +4.293158011e-02f, +3.375720004e-02f, -8.930855063e-02f, -4.501898624e-02f, +2.909745431e-01f, +5.309990076e-01f, +3.374149395e-01f, -1.540982321e-02f, -9.991903408e-02f, +2.119934318e-02f, +4.985314876e-02f, -1.983845119e-02f, -2.664126924e-02f, +1.619558094e-02f, +1.364587364e-02f, -1.185438431e-02f, -6.237397224e-03f, +7.748883135e-03f, +2.309670250e-03f, -4.429337085e-03f, -5.337831700e-04f, +2.112192063e-03f, -4.326132053e-05f, -7.445998240e-04f, +8.357194200e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.532880000e-04f, +2.964990710e-04f, -2.753141964e-03f, +8.217150332e-04f, +5.974716282e-03f, -4.723984173e-03f, -8.861833429e-03f, +1.241692899e-02f, +8.524768155e-03f, -2.281132511e-02f, -2.099674924e-03f, +3.227979197e-02f, -1.113565264e-02f, -3.591335762e-02f, +2.835547480e-02f, +3.016075371e-02f, -4.379549427e-02f, -1.527050990e-02f, +5.141660995e-02f, -4.223855762e-03f, -4.812701891e-02f, +2.155306263e-02f, +3.549318877e-02f, -3.113011271e-02f, -1.880420955e-02f, +3.120094716e-02f, +4.138944048e-03f, -2.415564475e-02f, +4.630927521e-03f, +1.457290810e-02f, -7.120215954e-03f, -6.516897535e-03f, +5.568557466e-03f, +1.821382022e-03f, -2.851121766e-03f, -9.827914271e-05f, +7.445998240e-04f, -8.357194200e-05f, +0.000000000e+00f, - +0.000000000e+00f, +5.294752732e-05f, -1.102371737e-04f, -9.367745324e-05f, +3.051331657e-04f, +9.223178851e-05f, -6.452740583e-04f, +2.840888309e-05f, +1.159326250e-03f, -3.833270077e-04f, -1.861027071e-03f, +1.139975466e-03f, +2.768806560e-03f, -2.582598789e-03f, -4.006358736e-03f, +5.412402635e-03f, +6.415233152e-03f, -1.278083917e-02f, -2.387804682e-02f, -2.938075104e-03f, +2.226991169e-02f, +1.672914678e-02f, -4.010242802e-03f, -7.053008544e-03f, +2.812587184e-03f, +3.651177164e-03f, -2.196044431e-03f, -1.875155598e-03f, +1.629859646e-03f, +8.660702928e-04f, -1.106062470e-03f, -3.169565730e-04f, +6.682608626e-04f, +5.777636716e-05f, -3.456925702e-04f, +3.100013789e-05f, +1.410160841e-04f, -3.626869734e-05f, -3.449908995e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.294752732e-05f, +1.102371737e-04f, +9.746178296e-05f, -4.803221480e-04f, +8.029617568e-05f, +9.376714072e-04f, -6.699201149e-04f, -1.264117719e-03f, +1.727641254e-03f, +1.069656674e-03f, -3.008215065e-03f, -5.954087941e-05f, +3.979018819e-03f, -1.708904058e-03f, -4.058694388e-03f, +3.734171146e-03f, +2.965184200e-03f, -5.257929761e-03f, -9.431245850e-04f, +5.652928597e-03f, -1.307846094e-03f, -4.771847280e-03f, +2.984137637e-03f, +3.025262961e-03f, -3.590713239e-03f, -1.138362217e-03f, +3.154504429e-03f, -2.454207327e-04f, -2.124084753e-03f, +8.565848337e-04f, +1.058200773e-03f, -8.293981165e-04f, -3.278005785e-04f, +5.069019624e-04f, +4.923932350e-06f, -1.949270588e-04f, +3.626869734e-05f, +3.449908995e-05f, +0.000000000e+00f, - /* 9, 2 (40) */ - +0.000000000e+00f, -6.003404726e-04f, -4.067362447e-04f, +1.890022156e-03f, +4.287495982e-04f, -4.297890872e-03f, +3.360806545e-04f, +8.119534120e-03f, -2.785378707e-03f, -1.349072404e-02f, +8.249378367e-03f, +2.036938493e-02f, -1.883990649e-02f, -2.870127713e-02f, +3.892522138e-02f, +3.916960267e-02f, -8.289331748e-02f, -5.779982541e-02f, +2.670964963e-01f, +5.280609325e-01f, +3.596848512e-01f, +1.319323565e-03f, -1.039292769e-01f, +1.414633464e-02f, +5.266573594e-02f, -1.618727402e-02f, -2.883731368e-02f, +1.432042534e-02f, +1.527573329e-02f, -1.098831402e-02f, -7.343459695e-03f, +7.431926562e-03f, +2.977931112e-03f, -4.371560718e-03f, -8.794757402e-04f, +2.143192201e-03f, +9.775476354e-05f, -7.808685214e-04f, +4.907285204e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.003404726e-04f, +4.067362447e-04f, -2.655680181e-03f, +3.413928852e-04f, +6.055012458e-03f, -3.786312766e-03f, -9.531753544e-03f, +1.115281127e-02f, +1.025240941e-02f, -2.174166843e-02f, -5.107889989e-03f, +3.222025109e-02f, -7.156633823e-03f, -3.762226168e-02f, +2.429678041e-02f, +3.389492485e-02f, -4.083031007e-02f, -2.052843966e-02f, +5.047348537e-02f, +1.429072834e-03f, -4.943486501e-02f, +1.678121535e-02f, +3.847732640e-02f, -2.810484974e-02f, -2.239492279e-02f, +3.006258494e-02f, +7.293448477e-03f, -2.440106548e-02f, +2.506842768e-03f, +1.542949293e-02f, -6.062015180e-03f, -7.346295651e-03f, +5.240756887e-03f, +2.328283984e-03f, -2.846197833e-03f, -2.932062015e-04f, +7.808685214e-04f, -4.907285204e-05f, +0.000000000e+00f, - +0.000000000e+00f, +5.641075041e-05f, -9.831851840e-05f, -1.105109674e-04f, +2.855936222e-04f, +1.366944058e-04f, -6.235304087e-04f, -6.293841711e-05f, +1.150357134e-03f, -2.219079595e-04f, -1.893466033e-03f, +8.812751314e-04f, +2.890626324e-03f, -2.187758567e-03f, -4.298026076e-03f, +4.785522207e-03f, +7.026922587e-03f, -1.138439549e-02f, -2.411978892e-02f, -4.874687612e-03f, +2.144558744e-02f, +1.792761201e-02f, -3.030348290e-03f, -7.495415680e-03f, +2.316909459e-03f, +3.953336330e-03f, -1.939624746e-03f, -2.096488373e-03f, +1.508772975e-03f, +1.020179643e-03f, -1.060723315e-03f, -4.144389719e-04f, +6.605907798e-04f, +1.116586147e-04f, -3.521379039e-04f, +6.602181892e-06f, +1.489715196e-04f, -2.864594131e-05f, -3.913447055e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.641075041e-05f, +9.831851840e-05f, +1.256487669e-04f, -4.597976294e-04f, +1.450451870e-06f, +9.481045615e-04f, -5.301994246e-04f, -1.362887090e-03f, +1.557305195e-03f, +1.310139011e-03f, -2.886262616e-03f, -4.505553522e-04f, +4.008706317e-03f, -1.230929462e-03f, -4.315874755e-03f, +3.295000408e-03f, +3.448245579e-03f, -4.994314020e-03f, -1.558786322e-03f, +5.646659450e-03f, -7.085952003e-04f, -5.008896046e-03f, +2.538468262e-03f, +3.405572999e-03f, -3.364659660e-03f, -1.529164760e-03f, +3.125579499e-03f, +5.302961668e-05f, -2.210626144e-03f, +6.877948014e-04f, +1.170983701e-03f, -7.676237739e-04f, -4.104073217e-04f, +5.026758498e-04f, +4.387886421e-05f, -2.058395148e-04f, +2.864594131e-05f, +3.913447055e-05f, +0.000000000e+00f, - /* 9, 3 (40) */ - +0.000000000e+00f, -5.439297222e-04f, -5.050547631e-04f, +1.779511189e-03f, +7.143432204e-04f, -4.161196466e-03f, -2.874497542e-04f, +8.056595703e-03f, -1.635021573e-03f, -1.371263200e-02f, +6.355912334e-03f, +2.125066007e-02f, -1.594928017e-02f, -3.088903570e-02f, +3.462719530e-02f, +4.395512488e-02f, -7.586639489e-02f, -6.918422090e-02f, +2.429767073e-01f, +5.231862449e-01f, +3.811304387e-01f, +1.924693557e-02f, -1.069596252e-01f, +6.650918960e-03f, +5.498264540e-02f, -1.223393769e-02f, -3.077693842e-02f, +1.222393697e-02f, +1.678450626e-02f, -9.968134376e-03f, -8.404183010e-03f, +7.017487590e-03f, +3.638521892e-03f, -4.259902104e-03f, -1.231613644e-03f, +2.149794383e-03f, +2.467262831e-04f, -8.095144627e-04f, +9.938381493e-06f, +0.000000000e+00f, - +0.000000000e+00f, +5.439297222e-04f, +5.050547631e-04f, -2.530031414e-03f, -1.184047442e-04f, +6.056462910e-03f, -2.838208205e-03f, -1.006195297e-02f, +9.789924182e-03f, +1.180971460e-02f, -2.043152942e-02f, -7.994152605e-03f, +3.176969573e-02f, -3.147927506e-03f, -3.885319114e-02f, +1.998090565e-02f, +3.718992526e-02f, -3.738206449e-02f, -2.552275368e-02f, +4.891469905e-02f, +7.075732284e-03f, -5.014346021e-02f, +1.177231930e-02f, +4.101579467e-02f, -2.469927675e-02f, -2.575958245e-02f, +2.853342018e-02f, +1.041902798e-02f, -2.434803587e-02f, +2.962166243e-04f, +1.611728773e-02f, -4.891031479e-03f, -8.113919425e-03f, +4.830349566e-03f, +2.830959834e-03f, -2.802318969e-03f, -4.990457162e-04f, +8.095144627e-04f, -9.938381493e-06f, +0.000000000e+00f, - +0.000000000e+00f, +5.884729198e-05f, -8.589535914e-05f, -1.251206083e-04f, +2.636293693e-04f, +1.776862090e-04f, -5.955426518e-04f, -1.502574751e-04f, +1.128814840e-03f, -6.325339340e-05f, -1.903934920e-03f, +6.207732291e-04f, +2.977103677e-03f, -1.781472607e-03f, -4.533865761e-03f, +4.131250132e-03f, +7.540028922e-03f, -9.966725522e-03f, -2.421423541e-02f, -6.778334413e-03f, +2.048298182e-02f, +1.904925260e-02f, -1.969441845e-03f, -7.874022257e-03f, +1.778128844e-03f, +4.221154537e-03f, -1.653264841e-03f, -2.301008985e-03f, +1.366615154e-03f, +1.167674654e-03f, -1.001547249e-03f, -5.106836993e-04f, +6.448254091e-04f, +1.665354586e-04f, -3.545943872e-04f, -1.919183145e-05f, +1.554644473e-04f, -2.004887603e-05f, -4.355134276e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.884729198e-05f, +8.589535914e-05f, +1.504549592e-04f, -4.343038303e-04f, -7.395648112e-05f, +9.461414043e-04f, -3.885302033e-04f, -1.441731981e-03f, +1.372064648e-03f, +1.528915007e-03f, -2.731065440e-03f, -8.293498011e-04f, +3.988557310e-03f, -7.434815445e-04f, -4.517457818e-03f, +2.818382716e-03f, +3.886466567e-03f, -4.669795535e-03f, -2.154991477e-03f, +5.570595356e-03f, -9.807683830e-05f, -5.185374127e-03f, +2.057321567e-03f, +3.747747485e-03f, -3.093451758e-03f, -1.907233017e-03f, +3.056753389e-03f, +3.574748264e-04f, -2.271257013e-03f, +5.052423525e-04f, +1.272385676e-03f, -6.934369816e-04f, -4.911712416e-04f, +4.913803271e-04f, +8.454905082e-05f, -2.144429117e-04f, +2.004887603e-05f, +4.355134276e-05f, +0.000000000e+00f, - /* 9, 4 (40) */ - +0.000000000e+00f, -4.850824302e-04f, -5.909501222e-04f, +1.654390580e-03f, +9.779725896e-04f, -3.983510257e-03f, -8.829924060e-04f, +7.906338228e-03f, -5.062067334e-04f, -1.377588539e-02f, +4.451977414e-03f, +2.187143329e-02f, -1.297217649e-02f, -3.267050830e-02f, +3.009332954e-02f, +4.808637501e-02f, -6.832636597e-02f, -7.915094642e-02f, +2.187624719e-01f, +5.164079105e-01f, +4.016134205e-01f, +3.829618817e-02f, -1.089290670e-01f, -1.223103297e-03f, +5.676077424e-02f, -8.012783156e-03f, -3.243020326e-02f, +9.922927981e-03f, +1.815112142e-02f, -8.800459722e-03f, -9.405730259e-03f, +6.506803891e-03f, +4.283347301e-03f, -4.093366645e-03f, -1.586208031e-03f, +2.130602551e-03f, +4.021907304e-04f, -8.295633387e-04f, -3.361296126e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.850824302e-04f, +5.909501222e-04f, -2.379576454e-03f, -5.527085745e-04f, +5.982506429e-03f, -1.892066800e-03f, -1.045048317e-02f, +8.348192201e-03f, +1.318177925e-02f, -1.890261442e-02f, -1.072521805e-02f, +3.094034593e-02f, +8.406298037e-04f, -3.959667268e-02f, +1.546344784e-02f, +4.000830798e-02f, -3.349559792e-02f, -3.019254921e-02f, +4.675970757e-02f, +1.264632764e-02f, -5.024153705e-02f, +6.586945176e-03f, +4.307311623e-02f, -2.095152926e-02f, -2.885303420e-02f, +2.662618717e-02f, +1.347578136e-02f, -2.399056104e-02f, -1.975040388e-03f, +1.662253008e-02f, -3.618645803e-03f, -8.807356407e-03f, +4.339178324e-03f, +3.322340161e-03f, -2.717769918e-03f, -7.134886279e-04f, +8.295633387e-04f, +3.361296126e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.029092420e-05f, -7.315860199e-05f, -1.374392209e-04f, +2.396151739e-04f, +2.148710507e-04f, -5.618746480e-04f, -2.326955049e-04f, +1.095367052e-03f, +9.094642695e-05f, -1.892996117e-03f, +3.613969454e-04f, +3.028357154e-03f, -1.368469826e-03f, -4.713188790e-03f, +3.457229605e-03f, +7.953761608e-03f, -8.539166431e-03f, -2.416300508e-02f, -8.636208704e-03f, +1.938727657e-02f, +2.008385485e-02f, -8.336748150e-04f, -8.182436481e-03f, +1.200587652e-03f, +4.450568768e-03f, -1.339242186e-03f, -2.485878817e-03f, +1.204347512e-03f, +1.306637052e-03f, -9.287510517e-04f, -6.045112890e-04f, +6.208382892e-04f, +2.217817538e-04f, -3.528467708e-04f, -4.612255583e-05f, +1.603219883e-04f, -1.053717489e-05f, -4.765899818e-05f, +0.000000000e+00f, - +0.000000000e+00f, -6.029092420e-05f, +7.315860199e-05f, +1.717246052e-04f, -4.044293024e-04f, -1.450792578e-04f, +9.322746214e-04f, -2.467916037e-04f, -1.500235027e-03f, +1.174644097e-03f, +1.723725133e-03f, -2.545224130e-03f, -1.191394320e-03f, +3.919539164e-03f, -2.527524175e-04f, -4.661458564e-03f, +2.310526380e-03f, +4.274604149e-03f, -4.288582946e-03f, -2.724305859e-03f, +5.425560317e-03f, +5.161124881e-04f, -5.298683465e-03f, +1.546438148e-03f, +4.047049349e-03f, -2.779905960e-03f, -2.267558771e-03f, +2.948145751e-03f, +6.641392795e-04f, -2.304540143e-03f, +3.109115906e-04f, +1.360697223e-03f, -6.073670260e-04f, -5.689127526e-04f, +4.728274703e-04f, +1.264386833e-04f, -2.204480988e-04f, +1.053717489e-05f, +4.765899818e-05f, +0.000000000e+00f, - /* 9, 5 (40) */ - +0.000000000e+00f, -4.247915060e-04f, -6.641087242e-04f, +1.516951359e-03f, +1.217587764e-03f, -3.768639206e-03f, -1.444867054e-03f, +7.673642723e-03f, +5.891603182e-04f, -1.368493896e-02f, +2.558981297e-03f, +2.223283024e-02f, -9.943819336e-03f, -3.403897813e-02f, +2.538014075e-02f, +5.154360462e-02f, -6.037260436e-02f, -8.769011285e-02f, +1.945994668e-01f, +5.077717018e-01f, +4.210006970e-01f, +5.838004303e-02f, -1.097627418e-01f, -9.405539777e-03f, +5.796136190e-02f, -3.562214389e-03f, -3.376944545e-02f, +7.437049164e-03f, +1.935546893e-02f, -7.493822670e-03f, -1.033448131e-02f, +5.902292602e-03f, +4.904185590e-03f, -3.871584891e-03f, -1.939054802e-03f, +2.084479995e-03f, +5.625127187e-04f, -8.401005136e-04f, -8.127195944e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.247915060e-04f, +6.641087242e-04f, -2.207851849e-03f, -9.571378768e-04f, +5.837427171e-03f, -9.597921789e-04f, -1.069727478e-02f, +6.847957174e-03f, +1.435642335e-02f, -1.717888928e-02f, -1.327044218e-02f, +2.974895161e-02f, +4.760168967e-03f, -3.984942510e-02f, +1.080198927e-02f, +4.231883436e-02f, -2.922099377e-02f, -3.448113216e-02f, +4.403540171e-02f, +1.807188796e-02f, -4.972542456e-02f, +1.288261711e-03f, +4.461955438e-02f, -1.690447991e-02f, -3.163294016e-02f, +2.435862839e-02f, +1.642392712e-02f, -2.332642176e-02f, -4.279580531e-03f, +1.693344167e-02f, -2.257948580e-03f, -9.414723433e-03f, +3.770265571e-03f, +3.795167631e-03f, -2.591331235e-03f, -9.339367267e-04f, +8.401005136e-04f, +8.127195944e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.078769928e-05f, -6.029301021e-05f, -1.474319237e-04f, +2.139342490e-04f, +2.479719027e-04f, -5.231355844e-04f, -3.094861283e-04f, +1.050795193e-03f, +2.391049255e-04f, -1.861434083e-03f, +1.059742262e-04f, +3.044885542e-03f, -9.534103962e-04f, -4.835914568e-03f, +2.771049618e-03f, +8.268226991e-03f, -7.112900121e-03f, -2.396882485e-02f, -1.043587901e-02f, +1.816471880e-02f, +2.102173053e-02f, +3.699912449e-04f, -8.414734600e-03f, +5.891775115e-04f, +4.637808794e-03f, -1.000211628e-03f, -2.648395422e-03f, +1.023191644e-03f, +1.435186128e-03f, -8.427186704e-04f, -6.947291882e-04f, +5.885975143e-04f, +2.767422258e-04f, -3.467232978e-04f, -7.390308195e-05f, +1.633842487e-04f, -1.875827134e-07f, -5.136572648e-05f, +0.000000000e+00f, - +0.000000000e+00f, -6.078769928e-05f, +6.029301021e-05f, +1.893614946e-04f, -3.707954872e-04f, -2.111655490e-04f, +9.071362565e-04f, -1.068023210e-04f, -1.538253905e-03f, +9.678548124e-04f, +1.892666405e-03f, -2.331677985e-03f, -1.532447546e-03f, +3.803223330e-03f, +2.350976400e-04f, -4.746637006e-03f, +1.777989004e-03f, +4.608072432e-03f, -3.855588534e-03f, -3.259638268e-03f, +5.213251324e-03f, +1.126299759e-03f, -5.347011066e-03f, +1.011985686e-03f, +4.299236737e-03f, -2.427418426e-03f, -2.605282082e-03f, +2.800392844e-03f, +9.691369591e-04f, -2.309361504e-03f, +1.069985000e-04f, +1.434329790e-03f, -5.101242715e-04f, -6.424458079e-04f, +4.469244867e-04f, +1.690071554e-04f, -2.235893425e-04f, +1.875827134e-07f, +5.136572648e-05f, +0.000000000e+00f, - /* 9, 6 (40) */ - +0.000000000e+00f, -3.640038068e-04f, -7.244017344e-04f, +1.369519436e-03f, +1.431522013e-03f, -3.520667303e-03f, -1.968002638e-03f, +7.364156595e-03f, +1.639955511e-03f, -1.344583404e-02f, +6.975472133e-04f, +2.233880447e-02f, -6.898933795e-03f, -3.499238852e-02f, +2.054422618e-02f, +5.431465423e-02f, -5.210437737e-02f, -9.480301297e-02f, +1.706306420e-01f, +4.973358228e-01f, +4.391654158e-01f, +7.940177356e-02f, -1.093927506e-01f, -1.782027438e-02f, +5.855053941e-02f, +1.075594405e-03f, -3.476965708e-02f, +4.788653743e-03f, +2.037866057e-02f, -6.058636542e-03f, -1.117719998e-02f, +5.207563414e-03f, +5.492783105e-03f, -3.594842665e-03f, -2.285778100e-03f, +2.010576913e-03f, +7.258969674e-04f, -8.402880963e-04f, -1.326376859e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.640038068e-04f, +7.244017344e-04f, -2.018490355e-03f, -1.327933364e-03f, +5.626261622e-03f, -5.265592234e-05f, -1.080407710e-02f, +5.309703269e-03f, +1.532427816e-02f, -1.528622288e-02f, -1.560212016e-02f, +2.821650407e-02f, +8.563392298e-03f, -3.961432746e-02f, +6.055352266e-03f, +4.409682336e-02f, -2.461292134e-02f, -3.833672069e-02f, +4.077576344e-02f, +2.328513928e-02f, -4.859912480e-02f, -4.058749355e-03f, +4.563154007e-02f, -1.260524317e-02f, -3.406035859e-02f, +2.175334631e-02f, +1.922431996e-02f, -2.235728480e-02f, -6.588942035e-03f, +1.704044017e-02f, -8.236187902e-04f, -9.924847704e-03f, +3.127819764e-03f, +4.242092118e-03f, -2.422324079e-03f, -1.157526069e-03f, +8.402880963e-04f, +1.326376859e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.039462004e-05f, -4.747501713e-05f, -1.550950630e-04f, +1.869731319e-04f, +2.767718783e-04f, -4.799710815e-04f, -3.799553483e-04f, +9.959817384e-04f, +3.797540378e-04f, -1.810239943e-03f, -1.427946417e-04f, +3.027551634e-03f, -5.408381760e-04f, -4.902554350e-03f, +2.080173389e-03f, +8.484407056e-03f, -5.698859645e-03f, -2.363549640e-02f, -1.216539056e-02f, +1.682257546e-02f, +2.185380679e-02f, +1.633830746e-03f, -8.565529567e-03f, -5.069476091e-05f, +4.779446351e-03f, -6.391869980e-04f, -2.786027072e-03f, +8.246232333e-04f, +1.551501823e-03f, -7.440021563e-04f, -7.801456050e-04f, +5.481696044e-04f, +3.307384398e-04f, -3.360997572e-04f, -1.022214475e-04f, +1.645071892e-04f, +1.090627139e-05f, -5.458022250e-05f, +0.000000000e+00f, - +0.000000000e+00f, -6.039462004e-05f, +4.747501713e-05f, +2.033273582e-04f, -3.340464162e-04f, -2.715626713e-04f, +8.714841796e-04f, +2.970164573e-05f, -1.555915397e-03f, +7.545560368e-04f, +2.034209142e-03f, -2.093660601e-03f, -1.848606288e-03f, +3.641756681e-03f, +7.140185025e-04f, -4.772506982e-03f, +1.227591396e-03f, +4.882997857e-03f, -3.376363675e-03f, -3.754330776e-03f, +4.936218116e-03f, +1.724833323e-03f, -5.329357022e-03f, +4.604832095e-04f, +4.500623034e-03f, -2.039928659e-03f, -2.915756870e-03f, +2.614648660e-03f, +1.268520358e-03f, -2.284952881e-03f, -1.041127549e-04f, +1.491841141e-03f, -4.025966696e-04f, -7.105944377e-04f, +4.136793152e-04f, +2.116750094e-04f, -2.236299197e-04f, -1.090627139e-05f, +5.458022250e-05f, +0.000000000e+00f, - /* 9, 7 (40) */ - +0.000000000e+00f, -3.036091867e-04f, -7.718767515e-04f, +1.214424373e-03f, +1.618495145e-03f, -3.243895425e-03f, -2.447973720e-03f, +6.984201246e-03f, +2.635937250e-03f, -1.306608000e-02f, -1.112692730e-03f, +2.219600982e-02f, -3.871382161e-03f, -3.553322670e-02f, +1.564167183e-02f, +5.639482762e-02f, -4.361997031e-02f, -1.005018726e-01f, +1.469951456e-01f, +4.851704322e-01f, +4.559879913e-01f, +1.012555804e-01f, -1.077589198e-01f, -2.638580394e-02f, +5.849984465e-02f, +5.855040756e-03f, -3.540884407e-02f, +2.002626671e-03f, +2.120328381e-02f, -4.507134719e-03f, -1.192120214e-02f, +4.427417809e-03f, +6.040952709e-03f, -3.264104226e-03f, -2.621877857e-03f, +1.908355466e-03f, +8.904041566e-04f, -8.293818249e-04f, -1.872179084e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.036091867e-04f, +7.718767515e-04f, -1.815162996e-03f, -1.661979780e-03f, +5.354698950e-03f, +8.188282573e-04f, -1.077437545e-02f, +3.753787872e-03f, +1.607883420e-02f, -1.325201374e-02f, -1.769578076e-02f, +2.636789778e-02f, +1.220514898e-02f, -3.890030896e-02f, +1.282845284e-03f, +4.532441476e-02f, -1.972992349e-02f, -4.171308437e-02f, +3.702143267e-02f, +2.822135740e-02f, -4.687429148e-02f, -9.388106377e-03f, +4.609202328e-02f, -8.104620140e-03f, -3.610028725e-02f, +1.883758944e-02f, +2.183896862e-02f, -2.108876444e-02f, -8.873894916e-03f, +1.693632742e-02f, +6.682223505e-04f, -1.032744437e-02f, +2.417225326e-03f, +4.655771433e-03f, -2.210649070e-03f, -1.381155989e-03f, +8.293818249e-04f, +1.872179084e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.917821755e-05f, -3.487075517e-05f, -1.604548066e-04f, +1.591167301e-04f, +3.011144788e-04f, -4.330541809e-04f, -4.435262341e-04f, +9.318967466e-04f, +5.115572318e-04f, -1.740594197e-03f, -3.823632391e-04f, +2.977562468e-03f, -1.351356408e-04f, -4.914189081e-03f, +1.391869640e-03f, +8.604130417e-03f, -4.307639135e-03f, -2.316785366e-02f, -1.381336228e-02f, +1.536907865e-02f, +2.257171159e-02f, +2.949408088e-03f, -8.630035953e-03f, -7.131473829e-04f, +4.872441994e-03f, -2.595182674e-04f, -2.896446364e-03f, +6.103627797e-04f, +1.653847792e-03f, -6.333206296e-04f, -8.595838121e-04f, +4.997223034e-04f, +3.830763249e-04f, -3.209030892e-04f, -1.307435912e-04f, +1.635654095e-04f, +2.263431824e-05f, -5.721306075e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.917821755e-05f, +3.487075517e-05f, +2.136394716e-04f, -2.948385299e-04f, -3.257225426e-04f, +8.261872995e-04f, +1.610874226e-04f, -1.553606028e-03f, +5.376164940e-04f, +2.147208443e-03f, -1.834652463e-03f, -2.136349946e-03f, +3.437825781e-03f, +1.178146185e-03f, -4.739335150e-03f, +6.663286819e-04f, +5.096264962e-03f, -2.857026236e-03f, -4.202243378e-03f, +4.597831892e-03f, +2.304180875e-03f, -5.245552147e-03f, -1.012798371e-04f, +4.648130273e-03f, -1.621875525e-03f, -3.194614682e-03f, +2.392579214e-03f, +1.558331221e-03f, -2.230910377e-03f, -3.198767271e-04f, +1.531959494e-03f, -2.858436540e-04f, -7.722097691e-04f, +3.732049744e-04f, +2.538307599e-04f, -2.203675361e-04f, -2.263431824e-05f, +5.721306075e-05f, +0.000000000e+00f, - /* 9, 8 (40) */ - +0.000000000e+00f, -2.444309692e-04f, -8.067475067e-04f, +1.053969566e-03f, +1.777611875e-03f, -2.942780946e-03f, -2.881027901e-03f, +6.540675012e-03f, +3.567833996e-03f, -1.255452277e-02f, -2.853286927e-03f, +2.181364659e-02f, -8.938196926e-04f, -3.566836234e-02f, +1.072748275e-02f, +5.778669726e-02f, -3.501583990e-02f, -1.048095118e-01f, +1.238272919e-01f, +4.713570699e-01f, +4.713570699e-01f, +1.238272919e-01f, -1.048095118e-01f, -3.501583990e-02f, +5.778669726e-02f, +1.072748275e-02f, -3.566836234e-02f, -8.938196926e-04f, +2.181364659e-02f, -2.853286927e-03f, -1.255452277e-02f, +3.567833996e-03f, +6.540675012e-03f, -2.881027901e-03f, -2.942780946e-03f, +1.777611875e-03f, +1.053969566e-03f, -8.067475067e-04f, -2.444309692e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.444309692e-04f, +8.067475067e-04f, -1.601523525e-03f, -1.956818310e-03f, +5.028976408e-03f, +1.645015557e-03f, -1.061328803e-02f, +2.200181844e-03f, +1.661645069e-02f, -1.110480529e-02f, -1.953043322e-02f, +2.423154783e-02f, +1.564297476e-02f, -3.772216277e-02f, -3.456489867e-03f, +4.599074344e-02f, -1.463365852e-02f, -4.457011060e-02f, +3.281918929e-02f, +3.281918929e-02f, -4.457011060e-02f, -1.463365852e-02f, +4.599074344e-02f, -3.456489867e-03f, -3.772216277e-02f, +1.564297476e-02f, +2.423154783e-02f, -1.953043322e-02f, -1.110480529e-02f, +1.661645069e-02f, +2.200181844e-03f, -1.061328803e-02f, +1.645015557e-03f, +5.028976408e-03f, -1.956818310e-03f, -1.601523525e-03f, +8.067475067e-04f, +2.444309692e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.721306075e-05f, -2.263431824e-05f, -1.635654095e-04f, +1.307435912e-04f, +3.209030892e-04f, -3.830763249e-04f, -4.997223034e-04f, +8.595838121e-04f, +6.333206296e-04f, -1.653847792e-03f, -6.103627797e-04f, +2.896446364e-03f, +2.595182674e-04f, -4.872441994e-03f, +7.131473829e-04f, +8.630035953e-03f, -2.949408088e-03f, -2.257171159e-02f, -1.536907865e-02f, +1.381336228e-02f, +2.316785366e-02f, +4.307639135e-03f, -8.604130417e-03f, -1.391869640e-03f, +4.914189081e-03f, +1.351356408e-04f, -2.977562468e-03f, +3.823632391e-04f, +1.740594197e-03f, -5.115572318e-04f, -9.318967466e-04f, +4.435262341e-04f, +4.330541809e-04f, -3.011144788e-04f, -1.591167301e-04f, +1.604548066e-04f, +3.487075517e-05f, -5.917821755e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.721306075e-05f, +2.263431824e-05f, +2.203675361e-04f, -2.538307599e-04f, -3.732049744e-04f, +7.722097691e-04f, +2.858436540e-04f, -1.531959494e-03f, +3.198767271e-04f, +2.230910377e-03f, -1.558331221e-03f, -2.392579214e-03f, +3.194614682e-03f, +1.621875525e-03f, -4.648130273e-03f, +1.012798371e-04f, +5.245552147e-03f, -2.304180875e-03f, -4.597831892e-03f, +4.202243378e-03f, +2.857026236e-03f, -5.096264962e-03f, -6.663286819e-04f, +4.739335150e-03f, -1.178146185e-03f, -3.437825781e-03f, +2.136349946e-03f, +1.834652463e-03f, -2.147208443e-03f, -5.376164940e-04f, +1.553606028e-03f, -1.610874226e-04f, -8.261872995e-04f, +3.257225426e-04f, +2.948385299e-04f, -2.136394716e-04f, -3.487075517e-05f, +5.917821755e-05f, +0.000000000e+00f, - /* 9, 9 (40) */ - +0.000000000e+00f, -1.872179084e-04f, -8.293818249e-04f, +8.904041566e-04f, +1.908355466e-03f, -2.621877857e-03f, -3.264104226e-03f, +6.040952709e-03f, +4.427417809e-03f, -1.192120214e-02f, -4.507134719e-03f, +2.120328381e-02f, +2.002626671e-03f, -3.540884407e-02f, +5.855040756e-03f, +5.849984465e-02f, -2.638580394e-02f, -1.077589198e-01f, +1.012555804e-01f, +4.559879913e-01f, +4.851704322e-01f, +1.469951456e-01f, -1.005018726e-01f, -4.361997031e-02f, +5.639482762e-02f, +1.564167183e-02f, -3.553322670e-02f, -3.871382161e-03f, +2.219600982e-02f, -1.112692730e-03f, -1.306608000e-02f, +2.635937250e-03f, +6.984201246e-03f, -2.447973720e-03f, -3.243895425e-03f, +1.618495145e-03f, +1.214424373e-03f, -7.718767515e-04f, -3.036091867e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.872179084e-04f, +8.293818249e-04f, -1.381155989e-03f, -2.210649070e-03f, +4.655771433e-03f, +2.417225326e-03f, -1.032744437e-02f, +6.682223505e-04f, +1.693632742e-02f, -8.873894916e-03f, -2.108876444e-02f, +2.183896862e-02f, +1.883758944e-02f, -3.610028725e-02f, -8.104620140e-03f, +4.609202328e-02f, -9.388106377e-03f, -4.687429148e-02f, +2.822135740e-02f, +3.702143267e-02f, -4.171308437e-02f, -1.972992349e-02f, +4.532441476e-02f, +1.282845284e-03f, -3.890030896e-02f, +1.220514898e-02f, +2.636789778e-02f, -1.769578076e-02f, -1.325201374e-02f, +1.607883420e-02f, +3.753787872e-03f, -1.077437545e-02f, +8.188282573e-04f, +5.354698950e-03f, -1.661979780e-03f, -1.815162996e-03f, +7.718767515e-04f, +3.036091867e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.458022250e-05f, -1.090627139e-05f, -1.645071892e-04f, +1.022214475e-04f, +3.360997572e-04f, -3.307384398e-04f, -5.481696044e-04f, +7.801456050e-04f, +7.440021563e-04f, -1.551501823e-03f, -8.246232333e-04f, +2.786027072e-03f, +6.391869980e-04f, -4.779446351e-03f, +5.069476091e-05f, +8.565529567e-03f, -1.633830746e-03f, -2.185380679e-02f, -1.682257546e-02f, +1.216539056e-02f, +2.363549640e-02f, +5.698859645e-03f, -8.484407056e-03f, -2.080173389e-03f, +4.902554350e-03f, +5.408381760e-04f, -3.027551634e-03f, +1.427946417e-04f, +1.810239943e-03f, -3.797540378e-04f, -9.959817384e-04f, +3.799553483e-04f, +4.799710815e-04f, -2.767718783e-04f, -1.869731319e-04f, +1.550950630e-04f, +4.747501713e-05f, -6.039462004e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.458022250e-05f, +1.090627139e-05f, +2.236299197e-04f, -2.116750094e-04f, -4.136793152e-04f, +7.105944377e-04f, +4.025966696e-04f, -1.491841141e-03f, +1.041127549e-04f, +2.284952881e-03f, -1.268520358e-03f, -2.614648660e-03f, +2.915756870e-03f, +2.039928659e-03f, -4.500623034e-03f, -4.604832095e-04f, +5.329357022e-03f, -1.724833323e-03f, -4.936218116e-03f, +3.754330776e-03f, +3.376363675e-03f, -4.882997857e-03f, -1.227591396e-03f, +4.772506982e-03f, -7.140185025e-04f, -3.641756681e-03f, +1.848606288e-03f, +2.093660601e-03f, -2.034209142e-03f, -7.545560368e-04f, +1.555915397e-03f, -2.970164573e-05f, -8.714841796e-04f, +2.715626713e-04f, +3.340464162e-04f, -2.033273582e-04f, -4.747501713e-05f, +6.039462004e-05f, +0.000000000e+00f, - /* 9,10 (40) */ - +0.000000000e+00f, -1.326376859e-04f, -8.402880963e-04f, +7.258969674e-04f, +2.010576913e-03f, -2.285778100e-03f, -3.594842665e-03f, +5.492783105e-03f, +5.207563414e-03f, -1.117719998e-02f, -6.058636542e-03f, +2.037866057e-02f, +4.788653743e-03f, -3.476965708e-02f, +1.075594405e-03f, +5.855053941e-02f, -1.782027438e-02f, -1.093927506e-01f, +7.940177356e-02f, +4.391654158e-01f, +4.973358228e-01f, +1.706306420e-01f, -9.480301297e-02f, -5.210437737e-02f, +5.431465423e-02f, +2.054422618e-02f, -3.499238852e-02f, -6.898933795e-03f, +2.233880447e-02f, +6.975472133e-04f, -1.344583404e-02f, +1.639955511e-03f, +7.364156595e-03f, -1.968002638e-03f, -3.520667303e-03f, +1.431522013e-03f, +1.369519436e-03f, -7.244017344e-04f, -3.640038068e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.326376859e-04f, +8.402880963e-04f, -1.157526069e-03f, -2.422324079e-03f, +4.242092118e-03f, +3.127819764e-03f, -9.924847704e-03f, -8.236187902e-04f, +1.704044017e-02f, -6.588942035e-03f, -2.235728480e-02f, +1.922431996e-02f, +2.175334631e-02f, -3.406035859e-02f, -1.260524317e-02f, +4.563154007e-02f, -4.058749355e-03f, -4.859912480e-02f, +2.328513928e-02f, +4.077576344e-02f, -3.833672069e-02f, -2.461292134e-02f, +4.409682336e-02f, +6.055352266e-03f, -3.961432746e-02f, +8.563392298e-03f, +2.821650407e-02f, -1.560212016e-02f, -1.528622288e-02f, +1.532427816e-02f, +5.309703269e-03f, -1.080407710e-02f, -5.265592234e-05f, +5.626261622e-03f, -1.327933364e-03f, -2.018490355e-03f, +7.244017344e-04f, +3.640038068e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.136572648e-05f, +1.875827134e-07f, -1.633842487e-04f, +7.390308195e-05f, +3.467232978e-04f, -2.767422258e-04f, -5.885975143e-04f, +6.947291882e-04f, +8.427186704e-04f, -1.435186128e-03f, -1.023191644e-03f, +2.648395422e-03f, +1.000211628e-03f, -4.637808794e-03f, -5.891775115e-04f, +8.414734600e-03f, -3.699912449e-04f, -2.102173053e-02f, -1.816471880e-02f, +1.043587901e-02f, +2.396882485e-02f, +7.112900121e-03f, -8.268226991e-03f, -2.771049618e-03f, +4.835914568e-03f, +9.534103962e-04f, -3.044885542e-03f, -1.059742262e-04f, +1.861434083e-03f, -2.391049255e-04f, -1.050795193e-03f, +3.094861283e-04f, +5.231355844e-04f, -2.479719027e-04f, -2.139342490e-04f, +1.474319237e-04f, +6.029301021e-05f, -6.078769928e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.136572648e-05f, -1.875827134e-07f, +2.235893425e-04f, -1.690071554e-04f, -4.469244867e-04f, +6.424458079e-04f, +5.101242715e-04f, -1.434329790e-03f, -1.069985000e-04f, +2.309361504e-03f, -9.691369591e-04f, -2.800392844e-03f, +2.605282082e-03f, +2.427418426e-03f, -4.299236737e-03f, -1.011985686e-03f, +5.347011066e-03f, -1.126299759e-03f, -5.213251324e-03f, +3.259638268e-03f, +3.855588534e-03f, -4.608072432e-03f, -1.777989004e-03f, +4.746637006e-03f, -2.350976400e-04f, -3.803223330e-03f, +1.532447546e-03f, +2.331677985e-03f, -1.892666405e-03f, -9.678548124e-04f, +1.538253905e-03f, +1.068023210e-04f, -9.071362565e-04f, +2.111655490e-04f, +3.707954872e-04f, -1.893614946e-04f, -6.029301021e-05f, +6.078769928e-05f, +0.000000000e+00f, - /* 9,11 (40) */ - +0.000000000e+00f, -8.127195944e-05f, -8.401005136e-04f, +5.625127187e-04f, +2.084479995e-03f, -1.939054802e-03f, -3.871584891e-03f, +4.904185590e-03f, +5.902292602e-03f, -1.033448131e-02f, -7.493822670e-03f, +1.935546893e-02f, +7.437049164e-03f, -3.376944545e-02f, -3.562214389e-03f, +5.796136190e-02f, -9.405539777e-03f, -1.097627418e-01f, +5.838004303e-02f, +4.210006970e-01f, +5.077717018e-01f, +1.945994668e-01f, -8.769011285e-02f, -6.037260436e-02f, +5.154360462e-02f, +2.538014075e-02f, -3.403897813e-02f, -9.943819336e-03f, +2.223283024e-02f, +2.558981297e-03f, -1.368493896e-02f, +5.891603182e-04f, +7.673642723e-03f, -1.444867054e-03f, -3.768639206e-03f, +1.217587764e-03f, +1.516951359e-03f, -6.641087242e-04f, -4.247915060e-04f, +0.000000000e+00f, - +0.000000000e+00f, +8.127195944e-05f, +8.401005136e-04f, -9.339367267e-04f, -2.591331235e-03f, +3.795167631e-03f, +3.770265571e-03f, -9.414723433e-03f, -2.257948580e-03f, +1.693344167e-02f, -4.279580531e-03f, -2.332642176e-02f, +1.642392712e-02f, +2.435862839e-02f, -3.163294016e-02f, -1.690447991e-02f, +4.461955438e-02f, +1.288261711e-03f, -4.972542456e-02f, +1.807188796e-02f, +4.403540171e-02f, -3.448113216e-02f, -2.922099377e-02f, +4.231883436e-02f, +1.080198927e-02f, -3.984942510e-02f, +4.760168967e-03f, +2.974895161e-02f, -1.327044218e-02f, -1.717888928e-02f, +1.435642335e-02f, +6.847957174e-03f, -1.069727478e-02f, -9.597921789e-04f, +5.837427171e-03f, -9.571378768e-04f, -2.207851849e-03f, +6.641087242e-04f, +4.247915060e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.765899818e-05f, +1.053717489e-05f, -1.603219883e-04f, +4.612255583e-05f, +3.528467708e-04f, -2.217817538e-04f, -6.208382892e-04f, +6.045112890e-04f, +9.287510517e-04f, -1.306637052e-03f, -1.204347512e-03f, +2.485878817e-03f, +1.339242186e-03f, -4.450568768e-03f, -1.200587652e-03f, +8.182436481e-03f, +8.336748150e-04f, -2.008385485e-02f, -1.938727657e-02f, +8.636208704e-03f, +2.416300508e-02f, +8.539166431e-03f, -7.953761608e-03f, -3.457229605e-03f, +4.713188790e-03f, +1.368469826e-03f, -3.028357154e-03f, -3.613969454e-04f, +1.892996117e-03f, -9.094642695e-05f, -1.095367052e-03f, +2.326955049e-04f, +5.618746480e-04f, -2.148710507e-04f, -2.396151739e-04f, +1.374392209e-04f, +7.315860199e-05f, -6.029092420e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.765899818e-05f, -1.053717489e-05f, +2.204480988e-04f, -1.264386833e-04f, -4.728274703e-04f, +5.689127526e-04f, +6.073670260e-04f, -1.360697223e-03f, -3.109115906e-04f, +2.304540143e-03f, -6.641392795e-04f, -2.948145751e-03f, +2.267558771e-03f, +2.779905960e-03f, -4.047049349e-03f, -1.546438148e-03f, +5.298683465e-03f, -5.161124881e-04f, -5.425560317e-03f, +2.724305859e-03f, +4.288582946e-03f, -4.274604149e-03f, -2.310526380e-03f, +4.661458564e-03f, +2.527524175e-04f, -3.919539164e-03f, +1.191394320e-03f, +2.545224130e-03f, -1.723725133e-03f, -1.174644097e-03f, +1.500235027e-03f, +2.467916037e-04f, -9.322746214e-04f, +1.450792578e-04f, +4.044293024e-04f, -1.717246052e-04f, -7.315860199e-05f, +6.029092420e-05f, +0.000000000e+00f, - /* 9,12 (40) */ - +0.000000000e+00f, -3.361296126e-05f, -8.295633387e-04f, +4.021907304e-04f, +2.130602551e-03f, -1.586208031e-03f, -4.093366645e-03f, +4.283347301e-03f, +6.506803891e-03f, -9.405730259e-03f, -8.800459722e-03f, +1.815112142e-02f, +9.922927981e-03f, -3.243020326e-02f, -8.012783156e-03f, +5.676077424e-02f, -1.223103297e-03f, -1.089290670e-01f, +3.829618817e-02f, +4.016134205e-01f, +5.164079105e-01f, +2.187624719e-01f, -7.915094642e-02f, -6.832636597e-02f, +4.808637501e-02f, +3.009332954e-02f, -3.267050830e-02f, -1.297217649e-02f, +2.187143329e-02f, +4.451977414e-03f, -1.377588539e-02f, -5.062067334e-04f, +7.906338228e-03f, -8.829924060e-04f, -3.983510257e-03f, +9.779725896e-04f, +1.654390580e-03f, -5.909501222e-04f, -4.850824302e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.361296126e-05f, +8.295633387e-04f, -7.134886279e-04f, -2.717769918e-03f, +3.322340161e-03f, +4.339178324e-03f, -8.807356407e-03f, -3.618645803e-03f, +1.662253008e-02f, -1.975040388e-03f, -2.399056104e-02f, +1.347578136e-02f, +2.662618717e-02f, -2.885303420e-02f, -2.095152926e-02f, +4.307311623e-02f, +6.586945176e-03f, -5.024153705e-02f, +1.264632764e-02f, +4.675970757e-02f, -3.019254921e-02f, -3.349559792e-02f, +4.000830798e-02f, +1.546344784e-02f, -3.959667268e-02f, +8.406298037e-04f, +3.094034593e-02f, -1.072521805e-02f, -1.890261442e-02f, +1.318177925e-02f, +8.348192201e-03f, -1.045048317e-02f, -1.892066800e-03f, +5.982506429e-03f, -5.527085745e-04f, -2.379576454e-03f, +5.909501222e-04f, +4.850824302e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.355134276e-05f, +2.004887603e-05f, -1.554644473e-04f, +1.919183145e-05f, +3.545943872e-04f, -1.665354586e-04f, -6.448254091e-04f, +5.106836993e-04f, +1.001547249e-03f, -1.167674654e-03f, -1.366615154e-03f, +2.301008985e-03f, +1.653264841e-03f, -4.221154537e-03f, -1.778128844e-03f, +7.874022257e-03f, +1.969441845e-03f, -1.904925260e-02f, -2.048298182e-02f, +6.778334413e-03f, +2.421423541e-02f, +9.966725522e-03f, -7.540028922e-03f, -4.131250132e-03f, +4.533865761e-03f, +1.781472607e-03f, -2.977103677e-03f, -6.207732291e-04f, +1.903934920e-03f, +6.325339340e-05f, -1.128814840e-03f, +1.502574751e-04f, +5.955426518e-04f, -1.776862090e-04f, -2.636293693e-04f, +1.251206083e-04f, +8.589535914e-05f, -5.884729198e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.355134276e-05f, -2.004887603e-05f, +2.144429117e-04f, -8.454905082e-05f, -4.913803271e-04f, +4.911712416e-04f, +6.934369816e-04f, -1.272385676e-03f, -5.052423525e-04f, +2.271257013e-03f, -3.574748264e-04f, -3.056753389e-03f, +1.907233017e-03f, +3.093451758e-03f, -3.747747485e-03f, -2.057321567e-03f, +5.185374127e-03f, +9.807683830e-05f, -5.570595356e-03f, +2.154991477e-03f, +4.669795535e-03f, -3.886466567e-03f, -2.818382716e-03f, +4.517457818e-03f, +7.434815445e-04f, -3.988557310e-03f, +8.293498011e-04f, +2.731065440e-03f, -1.528915007e-03f, -1.372064648e-03f, +1.441731981e-03f, +3.885302033e-04f, -9.461414043e-04f, +7.395648112e-05f, +4.343038303e-04f, -1.504549592e-04f, -8.589535914e-05f, +5.884729198e-05f, +0.000000000e+00f, - /* 9,13 (40) */ - +0.000000000e+00f, +9.938381493e-06f, -8.095144627e-04f, +2.467262831e-04f, +2.149794383e-03f, -1.231613644e-03f, -4.259902104e-03f, +3.638521892e-03f, +7.017487590e-03f, -8.404183010e-03f, -9.968134376e-03f, +1.678450626e-02f, +1.222393697e-02f, -3.077693842e-02f, -1.223393769e-02f, +5.498264540e-02f, +6.650918960e-03f, -1.069596252e-01f, +1.924693557e-02f, +3.811304387e-01f, +5.231862449e-01f, +2.429767073e-01f, -6.918422090e-02f, -7.586639489e-02f, +4.395512488e-02f, +3.462719530e-02f, -3.088903570e-02f, -1.594928017e-02f, +2.125066007e-02f, +6.355912334e-03f, -1.371263200e-02f, -1.635021573e-03f, +8.056595703e-03f, -2.874497542e-04f, -4.161196466e-03f, +7.143432204e-04f, +1.779511189e-03f, -5.050547631e-04f, -5.439297222e-04f, +0.000000000e+00f, - +0.000000000e+00f, -9.938381493e-06f, +8.095144627e-04f, -4.990457162e-04f, -2.802318969e-03f, +2.830959834e-03f, +4.830349566e-03f, -8.113919425e-03f, -4.891031479e-03f, +1.611728773e-02f, +2.962166243e-04f, -2.434803587e-02f, +1.041902798e-02f, +2.853342018e-02f, -2.575958245e-02f, -2.469927675e-02f, +4.101579467e-02f, +1.177231930e-02f, -5.014346021e-02f, +7.075732284e-03f, +4.891469905e-02f, -2.552275368e-02f, -3.738206449e-02f, +3.718992526e-02f, +1.998090565e-02f, -3.885319114e-02f, -3.147927506e-03f, +3.176969573e-02f, -7.994152605e-03f, -2.043152942e-02f, +1.180971460e-02f, +9.789924182e-03f, -1.006195297e-02f, -2.838208205e-03f, +6.056462910e-03f, -1.184047442e-04f, -2.530031414e-03f, +5.050547631e-04f, +5.439297222e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.913447055e-05f, +2.864594131e-05f, -1.489715196e-04f, -6.602181892e-06f, +3.521379039e-04f, -1.116586147e-04f, -6.605907798e-04f, +4.144389719e-04f, +1.060723315e-03f, -1.020179643e-03f, -1.508772975e-03f, +2.096488373e-03f, +1.939624746e-03f, -3.953336330e-03f, -2.316909459e-03f, +7.495415680e-03f, +3.030348290e-03f, -1.792761201e-02f, -2.144558744e-02f, +4.874687612e-03f, +2.411978892e-02f, +1.138439549e-02f, -7.026922587e-03f, -4.785522207e-03f, +4.298026076e-03f, +2.187758567e-03f, -2.890626324e-03f, -8.812751314e-04f, +1.893466033e-03f, +2.219079595e-04f, -1.150357134e-03f, +6.293841711e-05f, +6.235304087e-04f, -1.366944058e-04f, -2.855936222e-04f, +1.105109674e-04f, +9.831851840e-05f, -5.641075041e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.913447055e-05f, -2.864594131e-05f, +2.058395148e-04f, -4.387886421e-05f, -5.026758498e-04f, +4.104073217e-04f, +7.676237739e-04f, -1.170983701e-03f, -6.877948014e-04f, +2.210626144e-03f, -5.302961668e-05f, -3.125579499e-03f, +1.529164760e-03f, +3.364659660e-03f, -3.405572999e-03f, -2.538468262e-03f, +5.008896046e-03f, +7.085952003e-04f, -5.646659450e-03f, +1.558786322e-03f, +4.994314020e-03f, -3.448245579e-03f, -3.295000408e-03f, +4.315874755e-03f, +1.230929462e-03f, -4.008706317e-03f, +4.505553522e-04f, +2.886262616e-03f, -1.310139011e-03f, -1.557305195e-03f, +1.362887090e-03f, +5.301994246e-04f, -9.481045615e-04f, -1.450451870e-06f, +4.597976294e-04f, -1.256487669e-04f, -9.831851840e-05f, +5.641075041e-05f, +0.000000000e+00f, - /* 9,14 (40) */ - +0.000000000e+00f, +4.907285204e-05f, -7.808685214e-04f, +9.775476354e-05f, +2.143192201e-03f, -8.794757402e-04f, -4.371560718e-03f, +2.977931112e-03f, +7.431926562e-03f, -7.343459695e-03f, -1.098831402e-02f, +1.527573329e-02f, +1.432042534e-02f, -2.883731368e-02f, -1.618727402e-02f, +5.266573594e-02f, +1.414633464e-02f, -1.039292769e-01f, +1.319323565e-03f, +3.596848512e-01f, +5.280609325e-01f, +2.670964963e-01f, -5.779982541e-02f, -8.289331748e-02f, +3.916960267e-02f, +3.892522138e-02f, -2.870127713e-02f, -1.883990649e-02f, +2.036938493e-02f, +8.249378367e-03f, -1.349072404e-02f, -2.785378707e-03f, +8.119534120e-03f, +3.360806545e-04f, -4.297890872e-03f, +4.287495982e-04f, +1.890022156e-03f, -4.067362447e-04f, -6.003404726e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.907285204e-05f, +7.808685214e-04f, -2.932062015e-04f, -2.846197833e-03f, +2.328283984e-03f, +5.240756887e-03f, -7.346295651e-03f, -6.062015180e-03f, +1.542949293e-02f, +2.506842768e-03f, -2.440106548e-02f, +7.293448477e-03f, +3.006258494e-02f, -2.239492279e-02f, -2.810484974e-02f, +3.847732640e-02f, +1.678121535e-02f, -4.943486501e-02f, +1.429072834e-03f, +5.047348537e-02f, -2.052843966e-02f, -4.083031007e-02f, +3.389492485e-02f, +2.429678041e-02f, -3.762226168e-02f, -7.156633823e-03f, +3.222025109e-02f, -5.107889989e-03f, -2.174166843e-02f, +1.025240941e-02f, +1.115281127e-02f, -9.531753544e-03f, -3.786312766e-03f, +6.055012458e-03f, +3.413928852e-04f, -2.655680181e-03f, +4.067362447e-04f, +6.003404726e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.449908995e-05f, +3.626869734e-05f, -1.410160841e-04f, -3.100013789e-05f, +3.456925702e-04f, -5.777636716e-05f, -6.682608626e-04f, +3.169565730e-04f, +1.106062470e-03f, -8.660702928e-04f, -1.629859646e-03f, +1.875155598e-03f, +2.196044431e-03f, -3.651177164e-03f, -2.812587184e-03f, +7.053008544e-03f, +4.010242802e-03f, -1.672914678e-02f, -2.226991169e-02f, +2.938075104e-03f, +2.387804682e-02f, +1.278083917e-02f, -6.415233152e-03f, -5.412402635e-03f, +4.006358736e-03f, +2.582598789e-03f, -2.768806560e-03f, -1.139975466e-03f, +1.861027071e-03f, +3.833270077e-04f, -1.159326250e-03f, -2.840888309e-05f, +6.452740583e-04f, -9.223178851e-05f, -3.051331657e-04f, +9.367745324e-05f, +1.102371737e-04f, -5.294752732e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.449908995e-05f, -3.626869734e-05f, +1.949270588e-04f, -4.923932350e-06f, -5.069019624e-04f, +3.278005785e-04f, +8.293981165e-04f, -1.058200773e-03f, -8.565848337e-04f, +2.124084753e-03f, +2.454207327e-04f, -3.154504429e-03f, +1.138362217e-03f, +3.590713239e-03f, -3.025262961e-03f, -2.984137637e-03f, +4.771847280e-03f, +1.307846094e-03f, -5.652928597e-03f, +9.431245850e-04f, +5.257929761e-03f, -2.965184200e-03f, -3.734171146e-03f, +4.058694388e-03f, +1.708904058e-03f, -3.979018819e-03f, +5.954087941e-05f, +3.008215065e-03f, -1.069656674e-03f, -1.727641254e-03f, +1.264117719e-03f, +6.699201149e-04f, -9.376714072e-04f, -8.029617568e-05f, +4.803221480e-04f, -9.746178296e-05f, -1.102371737e-04f, +5.294752732e-05f, +0.000000000e+00f, - /* 9,15 (40) */ - +0.000000000e+00f, +8.357194200e-05f, -7.445998240e-04f, -4.326132053e-05f, +2.112192063e-03f, -5.337831700e-04f, -4.429337085e-03f, +2.309670250e-03f, +7.748883135e-03f, -6.237397224e-03f, -1.185438431e-02f, +1.364587364e-02f, +1.619558094e-02f, -2.664126924e-02f, -1.983845119e-02f, +4.985314876e-02f, +2.119934318e-02f, -9.991903408e-02f, -1.540982321e-02f, +3.374149395e-01f, +5.309990076e-01f, +2.909745431e-01f, -4.501898624e-02f, -8.930855063e-02f, +3.375720004e-02f, +4.293158011e-02f, -2.611867834e-02f, -2.160871305e-02f, +1.922940947e-02f, +1.011040544e-02f, -1.310739703e-02f, -3.944704957e-03f, +8.091125237e-03f, +9.813547128e-04f, -4.390122660e-03f, +1.236164325e-04f, +1.983699609e-03f, -2.964990710e-04f, -6.532880000e-04f, +0.000000000e+00f, - +0.000000000e+00f, -8.357194200e-05f, +7.445998240e-04f, -9.827914271e-05f, -2.851121766e-03f, +1.821382022e-03f, +5.568557466e-03f, -6.516897535e-03f, -7.120215954e-03f, +1.457290810e-02f, +4.630927521e-03f, -2.415564475e-02f, +4.138944048e-03f, +3.120094716e-02f, -1.880420955e-02f, -3.113011271e-02f, +3.549318877e-02f, +2.155306263e-02f, -4.812701891e-02f, -4.223855762e-03f, +5.141660995e-02f, -1.527050990e-02f, -4.379549427e-02f, +3.016075371e-02f, +2.835547480e-02f, -3.591335762e-02f, -1.113565264e-02f, +3.227979197e-02f, -2.099674924e-03f, -2.281132511e-02f, +8.524768155e-03f, +1.241692899e-02f, -8.861833429e-03f, -4.723984173e-03f, +5.974716282e-03f, +8.217150332e-04f, -2.753141964e-03f, +2.964990710e-04f, +6.532880000e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.973358537e-05f, +4.287448115e-05f, -1.317810928e-04f, -5.377230458e-05f, +3.355126957e-04f, -5.477384785e-06f, -6.680518135e-04f, +2.193896372e-04f, +1.137512275e-03f, -7.072796253e-04f, -1.729177185e-03f, +1.639950353e-03f, +2.420637634e-03f, -3.318981920e-03f, -3.261396848e-03f, +6.553589036e-03f, +4.903822234e-03f, -1.546450254e-02f, -2.295187420e-02f, +9.815742514e-04f, +2.348852223e-02f, +1.414466048e-02f, -5.706661215e-03f, -6.004267817e-03f, +3.660171795e-03f, +2.961245233e-03f, -2.611918560e-03f, -1.393878176e-03f, +1.806291018e-03f, +5.457330918e-04f, -1.155179992e-03f, -1.228524648e-04f, +6.602637232e-04f, -4.469181001e-05f, -3.218869068e-04f, +7.472014895e-05f, +1.214566576e-04f, -4.843734294e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.973358537e-05f, -4.287448115e-05f, +1.820124374e-04f, +3.186974957e-05f, -5.043349974e-04f, +2.445082970e-04f, +8.784127114e-04f, -9.358410193e-04f, -1.009860492e-03f, +2.013366884e-03f, +5.342574714e-04f, -3.143917298e-03f, +7.399153723e-04f, +3.769404223e-03f, -2.611983874e-03f, -3.389085798e-03f, +4.477572991e-03f, +1.888406059e-03f, -5.589460748e-03f, +3.156886903e-04f, +5.457193385e-03f, -2.443118584e-03f, -4.130118087e-03f, +3.748628172e-03f, +2.171261040e-03f, -3.899152682e-03f, -3.389294331e-04f, +3.094701674e-03f, -8.100621742e-04f, -1.880473749e-03f, +1.146118613e-03f, +8.057764558e-04f, -9.145006501e-04f, -1.616505191e-04f, +4.953319912e-04f, -6.611005247e-05f, -1.214566576e-04f, +4.843734294e-05f, +0.000000000e+00f, - /* 10, 0 (36) */ - +0.000000000e+00f, -7.608322579e-04f, +1.118776550e-03f, +1.378251293e-03f, -3.996866387e-03f, -8.778420085e-05f, +8.463162654e-03f, -5.917369532e-03f, -1.170469082e-02f, +1.883055804e-02f, +7.720230922e-03f, -3.819223843e-02f, +1.284965533e-02f, +5.985703519e-02f, -6.898457622e-02f, -7.711293861e-02f, +3.046497488e-01f, +5.837128805e-01f, +3.046497488e-01f, -7.711293861e-02f, -6.898457622e-02f, +5.985703519e-02f, +1.284965533e-02f, -3.819223843e-02f, +7.720230922e-03f, +1.883055804e-02f, -1.170469082e-02f, -5.917369532e-03f, +8.463162654e-03f, -8.778420085e-05f, -3.996866387e-03f, +1.378251293e-03f, +1.118776550e-03f, -7.608322579e-04f, -9.130911868e-05f, +0.000000000e+00f, - +0.000000000e+00f, +7.608322579e-04f, -1.118776550e-03f, -1.032757977e-03f, +5.537963620e-03f, -3.277985306e-03f, -8.278225430e-03f, +1.383882521e-02f, +1.771302895e-03f, -2.355345110e-02f, +1.719759611e-02f, +1.895372978e-02f, -3.796855404e-02f, +5.697284657e-03f, +4.123561278e-02f, -3.721413273e-02f, -1.801118074e-02f, +5.173229864e-02f, -1.801118074e-02f, -3.721413273e-02f, +4.123561278e-02f, +5.697284657e-03f, -3.796855404e-02f, +1.895372978e-02f, +1.719759611e-02f, -2.355345110e-02f, +1.771302895e-03f, +1.383882521e-02f, -8.278225430e-03f, -3.277985306e-03f, +5.537963620e-03f, -1.032757977e-03f, -1.549282673e-03f, +7.608322579e-04f, +9.130911868e-05f, +0.000000000e+00f, - +0.000000000e+00f, -8.610096471e-06f, -1.734450844e-04f, +2.063423291e-04f, +2.542369269e-04f, -6.829239910e-04f, +9.061379130e-06f, +1.334740657e-03f, -9.962288442e-04f, -1.700823497e-03f, +2.950847993e-03f, +9.379074490e-04f, -5.831432835e-03f, +2.255639644e-03f, +9.836779302e-03f, -1.170154190e-02f, -2.894571562e-02f, -1.297262942e-03f, +2.854133495e-02f, +1.357609648e-02f, -9.381395225e-03f, -3.164503237e-03f, +5.873380723e-03f, -4.504223033e-04f, -3.160553007e-03f, +1.503966945e-03f, +1.194919714e-03f, -1.306087259e-03f, -1.276517827e-04f, +7.164513821e-04f, -2.103608979e-04f, -2.390309122e-04f, +1.688223017e-04f, +2.190255501e-05f, -5.023134456e-05f, +0.000000000e+00f, - +0.000000000e+00f, +8.610096471e-06f, +1.734450844e-04f, -3.463027545e-04f, -1.500603778e-04f, +9.815523707e-04f, -7.206449357e-04f, -1.114731918e-03f, +2.286851473e-03f, -3.065756726e-04f, -3.135594535e-03f, +3.100476839e-03f, +1.596989202e-03f, -5.198937536e-03f, +2.172477802e-03f, +4.288541765e-03f, -5.598913174e-03f, -3.783561031e-04f, +5.878377207e-03f, -3.766421654e-03f, -2.797408819e-03f, +5.174551379e-03f, -1.058782302e-03f, -3.437091543e-03f, +2.946312073e-03f, +6.670301471e-04f, -2.380746322e-03f, +9.426127885e-04f, +8.762743588e-04f, -9.760043827e-04f, +7.025519776e-05f, +3.861753858e-04f, -2.019751614e-04f, -2.190255501e-05f, +5.023134456e-05f, +0.000000000e+00f, - /* 10, 1 (36) */ - +0.000000000e+00f, -7.694423543e-04f, +9.453314657e-04f, +1.584593622e-03f, -3.742629460e-03f, -7.707081919e-04f, +8.472224034e-03f, -4.582628874e-03f, -1.270091967e-02f, +1.712973454e-02f, +1.067107892e-02f, -3.725433098e-02f, +7.018222492e-03f, +6.211267483e-02f, -5.914779692e-02f, -8.881448051e-02f, +2.757040332e-01f, +5.824156176e-01f, +3.331910838e-01f, -6.353684213e-02f, -7.836597145e-02f, +5.669253195e-02f, +1.872303605e-02f, -3.864266074e-02f, +4.559677915e-03f, +2.033452499e-02f, -1.050977111e-02f, -7.223456790e-03f, +8.335510872e-03f, +6.286671812e-04f, -4.207227285e-03f, +1.139220381e-03f, +1.287598852e-03f, -7.389297029e-04f, -1.415404632e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.694423543e-04f, -9.453314657e-04f, -1.379060731e-03f, +5.387903242e-03f, -2.296432935e-03f, -8.998870366e-03f, +1.272409329e-02f, +4.058154368e-03f, -2.386002677e-02f, +1.406200157e-02f, +2.205420662e-02f, -3.637156484e-02f, +4.983471210e-04f, +4.340809058e-02f, -3.292559096e-02f, -2.361009391e-02f, +5.135394254e-02f, -1.213280353e-02f, -4.098055438e-02f, +3.843820396e-02f, +1.087183604e-02f, -3.902733634e-02f, +1.551663824e-02f, +2.014390818e-02f, -2.288642095e-02f, -6.094434262e-04f, +1.478143799e-02f, -7.401951071e-03f, -4.253989689e-03f, +5.608218818e-03f, -6.465825911e-04f, -1.751257834e-03f, +7.389297029e-04f, +1.415404632e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.784329719e-06f, -1.751889823e-04f, +1.725279642e-04f, +2.923973489e-04f, -6.415112318e-04f, -1.047914687e-04f, +1.344314247e-03f, -7.913703976e-04f, -1.868239599e-03f, +2.709265681e-03f, +1.396420030e-03f, -5.715262794e-03f, +1.353708248e-03f, +1.014940430e-02f, -9.815654971e-03f, -2.913597658e-02f, -3.881199688e-03f, +2.792284028e-02f, +1.542130069e-02f, -8.782090082e-03f, -4.068870907e-03f, +5.837850146e-03f, +6.046392525e-05f, -3.334406648e-03f, +1.279348831e-03f, +1.384438913e-03f, -1.258014460e-03f, -2.494776366e-04f, +7.412442005e-04f, -1.611372539e-04f, -2.700242113e-04f, +1.612093921e-04f, +3.592407024e-05f, -5.391097472e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.784329719e-06f, +1.751889823e-04f, -3.032592295e-04f, -2.234675677e-04f, +9.718574754e-04f, -5.600141608e-04f, -1.264509408e-03f, +2.161546552e-03f, +4.961619248e-05f, -3.274497897e-03f, +2.723920263e-03f, +2.103880952e-03f, -5.146294832e-03f, +1.520757418e-03f, +4.744380058e-03f, -5.237480478e-03f, -1.129403384e-03f, +6.071456451e-03f, -3.185499788e-03f, -3.385910532e-03f, +5.072635585e-03f, -4.969786261e-04f, -3.727931714e-03f, +2.708498128e-03f, +1.026284678e-03f, -2.440867502e-03f, +7.501245237e-04f, +1.024220164e-03f, -9.546290909e-04f, -1.493482220e-05f, +4.219838745e-04f, -1.880624540e-04f, -3.592407024e-05f, +5.391097472e-05f, +0.000000000e+00f, - /* 10, 2 (36) */ - +0.000000000e+00f, -7.656580246e-04f, +7.701424835e-04f, +1.757121586e-03f, -3.450232112e-03f, -1.412219424e-03f, +8.367432565e-03f, -3.238314627e-03f, -1.349229007e-02f, +1.526149494e-02f, +1.338034460e-02f, -3.585791095e-02f, +1.302959698e-03f, +6.346638308e-02f, -4.899839262e-02f, -9.863013548e-02f, +2.465680566e-01f, +5.785344179e-01f, +3.611139240e-01f, -4.811554144e-02f, -8.714806153e-02f, +5.262366104e-02f, +2.456088620e-02f, -3.858219681e-02f, +1.225271268e-03f, +2.161387382e-02f, -9.125332197e-03f, -8.481471251e-03f, +8.086033235e-03f, +1.369911382e-03f, -4.368364539e-03f, +8.691961692e-04f, +1.448808244e-03f, -7.030056326e-04f, -1.954514380e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.656580246e-04f, -7.701424835e-04f, -1.682319961e-03f, +5.164435675e-03f, -1.324575460e-03f, -9.558884527e-03f, +1.145958388e-02f, +6.219700920e-03f, -2.381041058e-02f, +1.078750368e-02f, +2.477812689e-02f, -3.426768389e-02f, -4.647947712e-03f, +4.492884800e-02f, -2.818121091e-02f, -2.884757439e-02f, +5.022453916e-02f, -6.061347078e-03f, -4.416605417e-02f, +3.505229343e-02f, +1.594447162e-02f, -3.952431497e-02f, +1.178870653e-02f, +2.285240631e-02f, -2.186013627e-02f, -3.050310928e-03f, +1.553156252e-02f, -6.377730908e-03f, -5.208618780e-03f, +5.593283996e-03f, -2.245987165e-04f, -1.939320288e-03f, +7.030056326e-04f, +1.954514380e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.513779949e-05f, -1.742040072e-04f, +1.381448576e-04f, +3.245741528e-04f, -5.931378417e-04f, -2.125299559e-04f, +1.335397235e-03f, -5.833270222e-04f, -2.004987484e-03f, +2.440070971e-03f, +1.820947750e-03f, -5.528955538e-03f, +4.696474517e-04f, +1.032192300e-02f, -7.936149909e-03f, -2.911410294e-02f, -6.433473934e-03f, +2.709224689e-02f, +1.721901681e-02f, -8.039244336e-03f, -4.956947418e-03f, +5.722482458e-03f, +5.886766699e-04f, -3.468789506e-03f, +1.029091125e-03f, +1.561802592e-03f, -1.190446501e-03f, -3.729285139e-04f, +7.565447293e-04f, -1.070329941e-04f, -2.987487070e-04f, +1.505379459e-04f, +5.048104610e-05f, -5.686799517e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.513779949e-05f, +1.742040072e-04f, -2.579436044e-04f, -2.896164368e-04f, +9.477237061e-04f, -3.970459732e-04f, -1.390382041e-03f, +2.007613800e-03f, +3.962779854e-04f, -3.361979505e-03f, +2.313761148e-03f, +2.572322046e-03f, -5.018283861e-03f, +8.522127213e-04f, +5.127499849e-03f, -4.799722777e-03f, -1.863542627e-03f, +6.175033338e-03f, -2.554190250e-03f, -3.928819409e-03f, +4.893869695e-03f, +8.023245599e-05f, -3.967771208e-03f, +2.424792516e-03f, +1.378763756e-03f, -2.465319555e-03f, +5.396297686e-04f, +1.161825532e-03f, -9.170806654e-04f, -1.043542233e-04f, +4.528571409e-04f, -1.696619686e-04f, -5.048104610e-05f, +5.686799517e-05f, +0.000000000e+00f, - /* 10, 3 (36) */ - +0.000000000e+00f, -7.505202251e-04f, +5.959384762e-04f, +1.895266444e-03f, -3.125657959e-03f, -2.005357265e-03f, +8.154902609e-03f, -1.902917392e-03f, -1.407561709e-02f, +1.325650746e-02f, +1.582041557e-02f, -3.403696320e-02f, -4.225995840e-03f, +6.393603053e-02f, -3.867646963e-02f, -1.065662854e-01f, +2.174539537e-01f, +5.721009440e-01f, +3.882061709e-01f, -3.089652464e-02f, -9.518730587e-02f, +4.766671363e-02f, +3.028336865e-02f, -3.799352014e-02f, -2.243518239e-03f, +2.264296494e-02f, -7.563529605e-03f, -9.671917752e-03f, +7.713104721e-03f, +2.126456111e-03f, -4.475397533e-03f, +5.704474622e-04f, +1.599346190e-03f, -6.525245865e-04f, -2.523194331e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.505202251e-04f, -5.959384762e-04f, -1.940263565e-03f, +4.874819238e-03f, -3.768517537e-04f, -9.955930500e-03f, +1.006920184e-02f, +8.227314721e-03f, -2.341413259e-02f, +7.425524173e-03f, +2.709188803e-02f, -3.169536184e-02f, -9.666231573e-03f, +4.578106072e-02f, -2.305371106e-02f, -3.364729716e-02f, +4.836099653e-02f, +1.136862607e-04f, -4.672024442e-02f, +3.112347402e-02f, +2.083834132e-02f, -3.944408252e-02f, +7.820935319e-03f, +2.527719883e-02f, -2.048137252e-02f, -5.515630483e-03f, +1.607119229e-02f, -5.215905376e-03f, -6.125699445e-03f, +5.488929773e-03f, +2.282584243e-04f, -2.108982257e-03f, +6.525245865e-04f, +2.523194331e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.533435089e-05f, -1.706744610e-04f, +1.037297279e-04f, +3.505987525e-04f, -5.387876784e-04f, -3.129171415e-04f, +1.308811255e-03f, -3.750199130e-04f, -2.110292211e-03f, +2.147753875e-03f, +2.207084703e-03f, -5.277347306e-03f, -3.862076857e-04f, +1.035841164e-02f, -6.080258955e-03f, -2.888403095e-02f, -8.933325890e-03f, +2.605357718e-02f, +1.895117576e-02f, -7.154815972e-03f, -5.816700690e-03f, +5.525876329e-03f, +1.127702779e-03f, -3.560497858e-03f, +7.557444035e-04f, +1.724089980e-03f, -1.103582358e-03f, -4.963048970e-04f, +7.617019767e-04f, -4.861157251e-05f, -3.246357830e-04f, +1.367859399e-04f, +6.535721937e-05f, -5.897846436e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.533435089e-05f, +1.706744610e-04f, -2.112442972e-04f, -3.478069317e-04f, +9.101527510e-04f, -2.343439974e-04f, -1.491207895e-03f, +1.828199279e-03f, +7.284145239e-04f, -3.397801589e-03f, +1.876739421e-03f, +2.995861166e-03f, -4.817686777e-03f, +1.769787936e-04f, +5.432600469e-03f, -4.292421448e-03f, -2.569789586e-03f, +6.187339930e-03f, -1.881716702e-03f, -4.417593386e-03f, +4.640115837e-03f, +6.643113960e-04f, -4.152082301e-03f, +2.098601618e-03f, +1.718864774e-03f, -2.452718358e-03f, +3.138551405e-04f, +1.286503976e-03f, -8.632675193e-04f, -1.967187451e-04f, +4.779633281e-04f, -1.468021015e-04f, -6.535721937e-05f, +5.897846436e-05f, +0.000000000e+00f, - /* 10, 4 (36) */ - +0.000000000e+00f, -7.251858742e-04f, +4.252640152e-04f, +1.998996172e-03f, -2.775059206e-03f, -2.544144944e-03f, +7.841985467e-03f, -5.941061375e-04f, -1.445063700e-02f, +1.114621525e-02f, +1.796816944e-02f, -3.182987850e-02f, -9.503343145e-03f, +6.354982285e-02f, -2.831805799e-02f, -1.126465443e-01f, +1.885699227e-01f, +5.631676181e-01f, +4.142597481e-01f, -1.194534887e-02f, -1.023421218e-01f, +4.185001294e-02f, +3.580924498e-02f, -3.686581736e-02f, -5.804016097e-03f, +2.339870935e-02f, -5.839439625e-03f, -1.077550011e-02f, +7.216799824e-03f, +2.888158088e-03f, -4.524009106e-03f, +2.458116791e-04f, +1.736132130e-03f, -5.871673671e-04f, -3.112978975e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.251858742e-04f, -4.252640152e-04f, -2.151507862e-03f, +4.527012306e-03f, +5.333009973e-04f, -1.019027450e-02f, +8.577993945e-03f, +1.005551400e-02f, -2.268571807e-02f, +4.027722584e-03f, +2.896862746e-02f, -2.869950068e-02f, -1.448391835e-02f, +4.595803951e-02f, -1.762111059e-02f, -3.793971861e-02f, +4.579120694e-02f, +6.301026190e-03f, -4.860196112e-02f, +2.670588063e-02f, +2.547845715e-02f, -3.877977112e-02f, +3.668853018e-03f, +2.737580044e-02f, -1.876250774e-02f, -7.968348841e-03f, +1.638504743e-02f, -3.929401400e-03f, -6.988966964e-03f, +5.292211027e-03f, +7.062217525e-04f, -2.255784358e-03f, +5.871673671e-04f, +3.112978975e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.428538431e-05f, -1.648141284e-04f, +6.979179289e-05f, +3.703999734e-04f, -4.794871086e-04f, -4.048679758e-04f, +1.265590524e-03f, -1.692709848e-04f, -2.183827185e-03f, +1.836962834e-03f, +2.551069338e-03f, -4.965941208e-03f, -1.204228959e-03f, +1.026428799e-02f, -4.264562282e-03f, -2.845158803e-02f, -1.136051456e-02f, +2.481283688e-02f, +2.059996734e-02f, -6.132358280e-03f, -6.635998333e-03f, +5.247637001e-03f, +1.670662808e-03f, -3.606800958e-03f, +4.622669339e-04f, +1.868486791e-03f, -9.979030911e-04f, -6.178394611e-04f, +7.561859339e-04f, +1.347126320e-05f, -3.471309988e-04f, +1.199806996e-04f, +8.031612747e-05f, -6.012611049e-05f, +0.000000000e+00f, - +0.000000000e+00f, -3.428538431e-05f, +1.648141284e-04f, -1.640243894e-04f, -3.975036781e-04f, +8.603196375e-04f, -7.441197769e-05f, -1.566271235e-03f, +1.626753728e-03f, +1.041374031e-03f, -3.382518597e-03f, +1.419885067e-03f, +3.368820468e-03f, -4.548352097e-03f, -4.947957059e-04f, +5.655591827e-03f, -3.723388442e-03f, -3.237586949e-03f, +6.107988193e-03f, -1.177974736e-03f, -4.844448366e-03f, +4.314402501e-03f, +1.246496406e-03f, -4.277118059e-03f, +1.734060021e-03f, +2.041046287e-03f, -2.402227156e-03f, +7.585826118e-05f, +1.395784589e-03f, -7.933642114e-04f, -2.906317128e-04f, +4.965269876e-04f, -1.195978440e-04f, -8.031612747e-05f, +6.012611049e-05f, +0.000000000e+00f, - /* 10, 5 (36) */ - +0.000000000e+00f, -6.909004899e-04f, +2.604498868e-04f, +2.068787965e-03f, -2.404659233e-03f, -3.023632052e-03f, +7.437117492e-03f, +6.714843867e-04f, -1.461990799e-02f, +8.962388064e-03f, +1.980513228e-02f, -2.927880916e-02f, -1.446928435e-02f, +6.234559389e-02f, -1.805377000e-02f, -1.169111066e-01f, +1.601183347e-01f, +5.518071035e-01f, +4.390725850e-01f, +8.654618468e-03f, -1.084744801e-01f, +3.521401460e-02f, +4.105688198e-02f, -3.519515455e-02f, -9.410817054e-03f, +2.386097628e-02f, -3.970952834e-03f, -1.177340320e-02f, +6.598960363e-03f, +3.644344022e-03f, -4.510537843e-03f, -1.013193196e-04f, +1.856112829e-03f, -5.068512397e-04f, -3.714240080e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.909004899e-04f, -2.604498868e-04f, -2.315532252e-03f, +4.129508628e-03f, +1.393620635e-03f, -1.026468647e-02f, +7.011722709e-03f, +1.168226773e-02f, -2.164434404e-02f, +6.452039870e-04f, +3.038851252e-02f, -2.533068021e-02f, -1.903227045e-02f, +4.546324381e-02f, -1.196551876e-02f, -4.166310706e-02f, +4.255361999e-02f, +1.240901438e-02f, -4.977993586e-02f, +2.186143227e-02f, +2.979285965e-02f, -3.753327471e-02f, -6.082650413e-04f, +2.910986046e-02f, -1.672146145e-02f, -1.037057600e-02f, +1.646090569e-02f, -2.533616811e-03f, -7.782331176e-03f, +5.001579315e-03f, +1.202748740e-03f, -2.375382202e-03f, +5.068512397e-04f, +3.714240080e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.192957089e-05f, -1.568612381e-04f, +3.680635368e-05f, +3.840006722e-04f, -4.162884493e-04f, -4.874587115e-04f, +1.206959738e-03f, +3.123232161e-05f, -2.225703758e-03f, +1.512437996e-03f, +2.849812934e-03f, -4.600816928e-03f, -1.975587388e-03f, +1.004621600e-02f, -2.504827690e-03f, -2.782441339e-02f, -1.369551728e-02f, +2.337797012e-02f, +2.214803029e-02f, -4.977019822e-03f, -7.402748914e-03f, +4.888414249e-03f, +2.210390368e-03f, -3.605493710e-03f, +1.519974222e-04f, +1.992328603e-03f, -8.741753758e-04f, -7.357201704e-04f, +7.396006017e-04f, +7.847324282e-05f, -3.657035821e-04f, +1.002011889e-04f, +9.510407349e-05f, -6.020509376e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.192957089e-05f, +1.568612381e-04f, -1.171078463e-04f, -4.383373773e-04f, +7.995464616e-04f, +8.038279173e-05f, -1.615280415e-03f, +1.406970164e-03f, +1.330912198e-03f, -3.317452385e-03f, +9.504049408e-04f, +3.686371627e-03f, -4.215123603e-03f, -1.153103885e-03f, +5.793649839e-03f, -3.101343533e-03f, -3.856965741e-03f, +5.937978961e-03f, -4.533831067e-04f, -5.202483955e-03f, +3.920889906e-03f, +1.817936591e-03f, -4.339983708e-03f, +1.335979822e-03f, +2.339917301e-03f, -2.313584651e-03f, -1.710116581e-04f, +1.487356930e-03f, -7.078192505e-04f, -3.846031339e-04f, +5.078460812e-04f, -8.825372617e-05f, -9.510407349e-05f, +6.020509376e-05f, +0.000000000e+00f, - /* 10, 6 (36) */ - +0.000000000e+00f, -6.489709190e-04f, +1.035886486e-04f, +2.105594318e-03f, -2.020658561e-03f, -3.439920502e-03f, +6.949658780e-03f, +1.878444125e-03f, -1.458867566e-02f, +6.736684306e-03f, +2.131757027e-02f, -2.642899623e-02f, -1.907010128e-02f, +6.037000650e-02f, -8.007554010e-03f, -1.194159343e-01f, +1.322939213e-01f, +5.381115862e-01f, +4.624505551e-01f, +3.080264876e-02f, -1.134514999e-01f, +2.781126569e-02f, +4.594529623e-02f, -3.298476419e-02f, -1.301631076e-02f, +2.401297370e-02f, -1.978624231e-03f, -1.264757858e-02f, +5.863240193e-03f, +4.383944623e-03f, -4.432064600e-03f, -4.670229017e-04f, +1.956314018e-03f, -4.117471662e-04f, -4.316291017e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.489709190e-04f, -1.035886486e-04f, -2.432640098e-03f, +3.691171251e-03f, +2.193167096e-03f, -1.018430368e-02f, +5.396442294e-03f, +1.308923789e-02f, -2.031343184e-02f, -2.672248398e-03f, +3.133891746e-02f, -2.164430858e-02f, -2.324739405e-02f, +4.431013992e-02f, -6.171868922e-03f, -4.476445059e-02f, +3.869665425e-02f, +1.834699334e-02f, -5.023331897e-02f, +1.665894831e-02f, +3.371374956e-02f, -3.571533812e-02f, -4.948248749e-03f, +3.044584029e-02f, -1.438154415e-02f, -1.268416065e-02f, +1.628989403e-02f, -1.046259880e-03f, -8.490150426e-03f, +4.616976181e-03f, +1.710594821e-03f, -2.463635928e-03f, +4.117471662e-04f, +4.316291017e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.823229520e-05f, -1.470732843e-04f, +5.209207025e-06f, +3.915130981e-04f, -3.502537026e-04f, -5.599336583e-04f, +1.134310075e-03f, +2.239691981e-04f, -2.236455243e-03f, +1.178945346e-03f, +3.100918505e-03f, -4.188535847e-03f, -2.692333594e-03f, +9.711998452e-03f, -8.158617887e-04f, -2.701186007e-02f, -1.591972134e-02f, +2.175879357e-02f, +2.357864012e-02f, -3.695526276e-03f, -8.105046358e-03f, +4.449928273e-03f, +2.739517692e-03f, -3.554943868e-03f, -1.713784116e-04f, +2.093143592e-03f, -7.334510579e-04f, -8.481149112e-04f, +7.116955357e-04f, +1.455729348e-04f, -3.798559979e-04f, +7.757955797e-05f, +1.094535619e-04f, -5.912273056e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.823229520e-05f, +1.470732843e-04f, -7.126711184e-05f, -4.701033003e-04f, +7.292747038e-04f, +2.278425380e-04f, -1.638359030e-03f, +1.172719323e-03f, +1.593248327e-03f, -3.204655905e-03f, +4.755687618e-04f, +3.944597606e-03f, -3.823754627e-03f, -1.788232438e-03f, +5.845251949e-03f, -2.435777920e-03f, -4.418697522e-03f, +5.679689375e-03f, +2.812738550e-04f, -5.485796362e-03f, +3.464817326e-03f, +2.369828215e-03f, -4.338695672e-03f, +9.097881746e-04f, +2.610326149e-03f, -2.187124480e-03f, -4.231592095e-04f, +1.559114740e-03f, -6.073585134e-04f, -4.770712771e-04f, +5.113084792e-04f, -5.306519586e-05f, -1.094535619e-04f, +5.912273056e-05f, +0.000000000e+00f, - /* 10, 7 (36) */ - +0.000000000e+00f, -6.007386238e-04f, -4.348463569e-05f, +2.110803525e-03f, -1.629145463e-03f, -3.790174204e-03f, +6.389725122e-03f, +3.012754199e-03f, -1.436470647e-02f, +4.500229063e-03f, +2.249651562e-02f, -2.332807772e-02f, -2.325863713e-02f, +5.767767291e-02f, +1.704444442e-03f, -1.202317961e-01f, +1.052820612e-01f, +5.221918649e-01f, +4.842093487e-01f, +5.438128888e-02f, -1.171470262e-01f, +1.970621933e-02f, +5.039522451e-02f, -3.024524649e-02f, -1.657125463e-02f, +2.384159529e-02f, +1.145193607e-04f, -1.338102963e-02f, +5.015125282e-03f, +5.095640159e-03f, -4.286491665e-03f, -8.468788996e-04f, +2.033893576e-03f, -3.022936042e-04f, -4.907518323e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.007386238e-04f, +4.348463569e-05f, -2.503907210e-03f, +3.221067951e-03f, +2.922441800e-03f, -9.956461145e-03f, +3.758083264e-03f, +1.426195722e-02f, -1.872018351e-02f, -5.876904303e-03f, +3.181448622e-02f, -1.769971098e-02f, -2.707114868e-02f, +4.252190749e-02f, -3.266169733e-04f, -4.720022851e-02f, +3.427795673e-02f, +2.402668272e-02f, -4.995204511e-02f, +1.117315195e-02f, +3.717856689e-02f, -3.334550991e-02f, -9.286944420e-03f, +3.135562846e-02f, -1.177121800e-02f, -1.487128513e-02f, +1.586673482e-02f, +5.128548594e-04f, -9.097508940e-03f, +4.139904904e-03f, +2.221903300e-03f, -2.516701124e-03f, +3.022936042e-04f, +4.907518323e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.318466494e-05f, -1.357217998e-04f, -2.460806380e-05f, +3.931331187e-04f, -2.824388115e-04f, -6.217092813e-04f, +1.049173726e-03f, +4.066142464e-04f, -2.217015702e-03f, +8.412125227e-04f, +3.302690140e-03f, -3.736042896e-03f, -3.347465510e-03f, +9.270459099e-03f, +7.886258271e-04f, -2.602487989e-02f, -1.801560566e-02f, +1.996691054e-02f, +2.487589246e-02f, -2.296144059e-03f, -8.731315790e-03f, +3.934982890e-03f, +3.250566468e-03f, -3.454132949e-03f, -5.038671492e-04f, +2.168694001e-03f, -5.770625852e-04f, -9.531973567e-04f, +6.723756816e-04f, +2.138786494e-04f, -3.891334442e-04f, +5.230188514e-05f, +1.230871687e-04f, -5.680212660e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.318466494e-05f, +1.357217998e-04f, -2.721223859e-05f, -4.927570272e-04f, +6.510366524e-04f, +3.659681520e-04f, -1.636030674e-03f, +9.279840278e-04f, +1.825112831e-03f, -3.046866177e-03f, +2.596102324e-06f, +4.140539390e-03f, -3.380809234e-03f, -2.390907600e-03f, +5.810192325e-03f, -1.736806368e-03f, -4.914435019e-03f, +5.336838992e-03f, +1.015010234e-03f, -5.689576599e-03f, +2.952433000e-03f, +2.893551996e-03f, -4.272227167e-03f, +4.614538658e-04f, +2.847447523e-03f, -2.023785552e-03f, -6.767935767e-04f, +1.609197730e-03f, -4.929840536e-04f, -5.664264510e-04f, +5.064076230e-04f, -1.441832443e-05f, -1.230871687e-04f, +5.680212660e-05f, +0.000000000e+00f, - /* 10, 8 (36) */ - +0.000000000e+00f, -5.475539589e-04f, -1.792064355e-04f, +2.086195461e-03f, -1.236012344e-03f, -4.072613016e-03f, +5.768015841e-03f, +4.061927925e-03f, -1.395809222e-02f, +2.283213361e-03f, +2.333772814e-02f, -2.002538758e-02f, -2.699468003e-02f, +5.433020740e-02f, +1.097490354e-02f, -1.194431703e-01f, +7.925718134e-02f, +5.041762592e-01f, +5.041762592e-01f, +7.925718134e-02f, -1.194431703e-01f, +1.097490354e-02f, +5.433020740e-02f, -2.699468003e-02f, -2.002538758e-02f, +2.333772814e-02f, +2.283213361e-03f, -1.395809222e-02f, +4.061927925e-03f, +5.768015841e-03f, -4.072613016e-03f, -1.236012344e-03f, +2.086195461e-03f, -1.792064355e-04f, -5.475539589e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.475539589e-04f, +1.792064355e-04f, -2.531119449e-03f, +2.728310923e-03f, +3.573478453e-03f, -9.590492993e-03f, +2.122052590e-03f, +1.518994124e-02f, -1.689507068e-02f, -8.923770481e-03f, +3.181708233e-02f, -1.355917159e-02f, -3.045195791e-02f, +4.013099989e-02f, +5.483575352e-03f, -4.893703488e-02f, +2.936352171e-02f, +2.936352171e-02f, -4.893703488e-02f, +5.483575352e-03f, +4.013099989e-02f, -3.045195791e-02f, -1.355917159e-02f, +3.181708233e-02f, -8.923770481e-03f, -1.689507068e-02f, +1.518994124e-02f, +2.122052590e-03f, -9.590492993e-03f, +3.573478453e-03f, +2.728310923e-03f, -2.531119449e-03f, +1.792064355e-04f, +5.475539589e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.680212660e-05f, -1.230871687e-04f, -5.230188514e-05f, +3.891334442e-04f, -2.138786494e-04f, -6.723756816e-04f, +9.531973567e-04f, +5.770625852e-04f, -2.168694001e-03f, +5.038671492e-04f, +3.454132949e-03f, -3.250566468e-03f, -3.934982890e-03f, +8.731315790e-03f, +2.296144059e-03f, -2.487589246e-02f, -1.996691054e-02f, +1.801560566e-02f, +2.602487989e-02f, -7.886258271e-04f, -9.270459099e-03f, +3.347465510e-03f, +3.736042896e-03f, -3.302690140e-03f, -8.412125227e-04f, +2.217015702e-03f, -4.066142464e-04f, -1.049173726e-03f, +6.217092813e-04f, +2.824388115e-04f, -3.931331187e-04f, +2.460806380e-05f, +1.357217998e-04f, -5.318466494e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.680212660e-05f, +1.230871687e-04f, +1.441832443e-05f, -5.064076230e-04f, +5.664264510e-04f, +4.929840536e-04f, -1.609197730e-03f, +6.767935767e-04f, +2.023785552e-03f, -2.847447523e-03f, -4.614538658e-04f, +4.272227167e-03f, -2.893551996e-03f, -2.952433000e-03f, +5.689576599e-03f, -1.015010234e-03f, -5.336838992e-03f, +4.914435019e-03f, +1.736806368e-03f, -5.810192325e-03f, +2.390907600e-03f, +3.380809234e-03f, -4.140539390e-03f, -2.596102324e-06f, +3.046866177e-03f, -1.825112831e-03f, -9.279840278e-04f, +1.636030674e-03f, -3.659681520e-04f, -6.510366524e-04f, +4.927570272e-04f, +2.721223859e-05f, -1.357217998e-04f, +5.318466494e-05f, +0.000000000e+00f, - /* 10, 9 (36) */ - +0.000000000e+00f, -4.907518323e-04f, -3.022936042e-04f, +2.033893576e-03f, -8.468788996e-04f, -4.286491665e-03f, +5.095640159e-03f, +5.015125282e-03f, -1.338102963e-02f, +1.145193607e-04f, +2.384159529e-02f, -1.657125463e-02f, -3.024524649e-02f, +5.039522451e-02f, +1.970621933e-02f, -1.171470262e-01f, +5.438128888e-02f, +4.842093487e-01f, +5.221918649e-01f, +1.052820612e-01f, -1.202317961e-01f, +1.704444442e-03f, +5.767767291e-02f, -2.325863713e-02f, -2.332807772e-02f, +2.249651562e-02f, +4.500229063e-03f, -1.436470647e-02f, +3.012754199e-03f, +6.389725122e-03f, -3.790174204e-03f, -1.629145463e-03f, +2.110803525e-03f, -4.348463569e-05f, -6.007386238e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.907518323e-04f, +3.022936042e-04f, -2.516701124e-03f, +2.221903300e-03f, +4.139904904e-03f, -9.097508940e-03f, +5.128548594e-04f, +1.586673482e-02f, -1.487128513e-02f, -1.177121800e-02f, +3.135562846e-02f, -9.286944420e-03f, -3.334550991e-02f, +3.717856689e-02f, +1.117315195e-02f, -4.995204511e-02f, +2.402668272e-02f, +3.427795673e-02f, -4.720022851e-02f, -3.266169733e-04f, +4.252190749e-02f, -2.707114868e-02f, -1.769971098e-02f, +3.181448622e-02f, -5.876904303e-03f, -1.872018351e-02f, +1.426195722e-02f, +3.758083264e-03f, -9.956461145e-03f, +2.922441800e-03f, +3.221067951e-03f, -2.503907210e-03f, +4.348463569e-05f, +6.007386238e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.912273056e-05f, -1.094535619e-04f, -7.757955797e-05f, +3.798559979e-04f, -1.455729348e-04f, -7.116955357e-04f, +8.481149112e-04f, +7.334510579e-04f, -2.093143592e-03f, +1.713784116e-04f, +3.554943868e-03f, -2.739517692e-03f, -4.449928273e-03f, +8.105046358e-03f, +3.695526276e-03f, -2.357864012e-02f, -2.175879357e-02f, +1.591972134e-02f, +2.701186007e-02f, +8.158617887e-04f, -9.711998452e-03f, +2.692333594e-03f, +4.188535847e-03f, -3.100918505e-03f, -1.178945346e-03f, +2.236455243e-03f, -2.239691981e-04f, -1.134310075e-03f, +5.599336583e-04f, +3.502537026e-04f, -3.915130981e-04f, -5.209207025e-06f, +1.470732843e-04f, -4.823229520e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.912273056e-05f, +1.094535619e-04f, +5.306519586e-05f, -5.113084792e-04f, +4.770712771e-04f, +6.073585134e-04f, -1.559114740e-03f, +4.231592095e-04f, +2.187124480e-03f, -2.610326149e-03f, -9.097881746e-04f, +4.338695672e-03f, -2.369828215e-03f, -3.464817326e-03f, +5.485796362e-03f, -2.812738550e-04f, -5.679689375e-03f, +4.418697522e-03f, +2.435777920e-03f, -5.845251949e-03f, +1.788232438e-03f, +3.823754627e-03f, -3.944597606e-03f, -4.755687618e-04f, +3.204655905e-03f, -1.593248327e-03f, -1.172719323e-03f, +1.638359030e-03f, -2.278425380e-04f, -7.292747038e-04f, +4.701033003e-04f, +7.126711184e-05f, -1.470732843e-04f, +4.823229520e-05f, +0.000000000e+00f, - /* 10,10 (36) */ - +0.000000000e+00f, -4.316291017e-04f, -4.117471662e-04f, +1.956314018e-03f, -4.670229017e-04f, -4.432064600e-03f, +4.383944623e-03f, +5.863240193e-03f, -1.264757858e-02f, -1.978624231e-03f, +2.401297370e-02f, -1.301631076e-02f, -3.298476419e-02f, +4.594529623e-02f, +2.781126569e-02f, -1.134514999e-01f, +3.080264876e-02f, +4.624505551e-01f, +5.381115862e-01f, +1.322939213e-01f, -1.194159343e-01f, -8.007554010e-03f, +6.037000650e-02f, -1.907010128e-02f, -2.642899623e-02f, +2.131757027e-02f, +6.736684306e-03f, -1.458867566e-02f, +1.878444125e-03f, +6.949658780e-03f, -3.439920502e-03f, -2.020658561e-03f, +2.105594318e-03f, +1.035886486e-04f, -6.489709190e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.316291017e-04f, +4.117471662e-04f, -2.463635928e-03f, +1.710594821e-03f, +4.616976181e-03f, -8.490150426e-03f, -1.046259880e-03f, +1.628989403e-02f, -1.268416065e-02f, -1.438154415e-02f, +3.044584029e-02f, -4.948248749e-03f, -3.571533812e-02f, +3.371374956e-02f, +1.665894831e-02f, -5.023331897e-02f, +1.834699334e-02f, +3.869665425e-02f, -4.476445059e-02f, -6.171868922e-03f, +4.431013992e-02f, -2.324739405e-02f, -2.164430858e-02f, +3.133891746e-02f, -2.672248398e-03f, -2.031343184e-02f, +1.308923789e-02f, +5.396442294e-03f, -1.018430368e-02f, +2.193167096e-03f, +3.691171251e-03f, -2.432640098e-03f, -1.035886486e-04f, +6.489709190e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.020509376e-05f, -9.510407349e-05f, -1.002011889e-04f, +3.657035821e-04f, -7.847324282e-05f, -7.396006017e-04f, +7.357201704e-04f, +8.741753758e-04f, -1.992328603e-03f, -1.519974222e-04f, +3.605493710e-03f, -2.210390368e-03f, -4.888414249e-03f, +7.402748914e-03f, +4.977019822e-03f, -2.214803029e-02f, -2.337797012e-02f, +1.369551728e-02f, +2.782441339e-02f, +2.504827690e-03f, -1.004621600e-02f, +1.975587388e-03f, +4.600816928e-03f, -2.849812934e-03f, -1.512437996e-03f, +2.225703758e-03f, -3.123232161e-05f, -1.206959738e-03f, +4.874587115e-04f, +4.162884493e-04f, -3.840006722e-04f, -3.680635368e-05f, +1.568612381e-04f, -4.192957089e-05f, +0.000000000e+00f, - +0.000000000e+00f, -6.020509376e-05f, +9.510407349e-05f, +8.825372617e-05f, -5.078460812e-04f, +3.846031339e-04f, +7.078192505e-04f, -1.487356930e-03f, +1.710116581e-04f, +2.313584651e-03f, -2.339917301e-03f, -1.335979822e-03f, +4.339983708e-03f, -1.817936591e-03f, -3.920889906e-03f, +5.202483955e-03f, +4.533831067e-04f, -5.937978961e-03f, +3.856965741e-03f, +3.101343533e-03f, -5.793649839e-03f, +1.153103885e-03f, +4.215123603e-03f, -3.686371627e-03f, -9.504049408e-04f, +3.317452385e-03f, -1.330912198e-03f, -1.406970164e-03f, +1.615280415e-03f, -8.038279173e-05f, -7.995464616e-04f, +4.383373773e-04f, +1.171078463e-04f, -1.568612381e-04f, +4.192957089e-05f, +0.000000000e+00f, - /* 10,11 (36) */ - +0.000000000e+00f, -3.714240080e-04f, -5.068512397e-04f, +1.856112829e-03f, -1.013193196e-04f, -4.510537843e-03f, +3.644344022e-03f, +6.598960363e-03f, -1.177340320e-02f, -3.970952834e-03f, +2.386097628e-02f, -9.410817054e-03f, -3.519515455e-02f, +4.105688198e-02f, +3.521401460e-02f, -1.084744801e-01f, +8.654618468e-03f, +4.390725850e-01f, +5.518071035e-01f, +1.601183347e-01f, -1.169111066e-01f, -1.805377000e-02f, +6.234559389e-02f, -1.446928435e-02f, -2.927880916e-02f, +1.980513228e-02f, +8.962388064e-03f, -1.461990799e-02f, +6.714843867e-04f, +7.437117492e-03f, -3.023632052e-03f, -2.404659233e-03f, +2.068787965e-03f, +2.604498868e-04f, -6.909004899e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.714240080e-04f, +5.068512397e-04f, -2.375382202e-03f, +1.202748740e-03f, +5.001579315e-03f, -7.782331176e-03f, -2.533616811e-03f, +1.646090569e-02f, -1.037057600e-02f, -1.672146145e-02f, +2.910986046e-02f, -6.082650413e-04f, -3.753327471e-02f, +2.979285965e-02f, +2.186143227e-02f, -4.977993586e-02f, +1.240901438e-02f, +4.255361999e-02f, -4.166310706e-02f, -1.196551876e-02f, +4.546324381e-02f, -1.903227045e-02f, -2.533068021e-02f, +3.038851252e-02f, +6.452039870e-04f, -2.164434404e-02f, +1.168226773e-02f, +7.011722709e-03f, -1.026468647e-02f, +1.393620635e-03f, +4.129508628e-03f, -2.315532252e-03f, -2.604498868e-04f, +6.909004899e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.012611049e-05f, -8.031612747e-05f, -1.199806996e-04f, +3.471309988e-04f, -1.347126320e-05f, -7.561859339e-04f, +6.178394611e-04f, +9.979030911e-04f, -1.868486791e-03f, -4.622669339e-04f, +3.606800958e-03f, -1.670662808e-03f, -5.247637001e-03f, +6.635998333e-03f, +6.132358280e-03f, -2.059996734e-02f, -2.481283688e-02f, +1.136051456e-02f, +2.845158803e-02f, +4.264562282e-03f, -1.026428799e-02f, +1.204228959e-03f, +4.965941208e-03f, -2.551069338e-03f, -1.836962834e-03f, +2.183827185e-03f, +1.692709848e-04f, -1.265590524e-03f, +4.048679758e-04f, +4.794871086e-04f, -3.703999734e-04f, -6.979179289e-05f, +1.648141284e-04f, -3.428538431e-05f, +0.000000000e+00f, - +0.000000000e+00f, -6.012611049e-05f, +8.031612747e-05f, +1.195978440e-04f, -4.965269876e-04f, +2.906317128e-04f, +7.933642114e-04f, -1.395784589e-03f, -7.585826118e-05f, +2.402227156e-03f, -2.041046287e-03f, -1.734060021e-03f, +4.277118059e-03f, -1.246496406e-03f, -4.314402501e-03f, +4.844448366e-03f, +1.177974736e-03f, -6.107988193e-03f, +3.237586949e-03f, +3.723388442e-03f, -5.655591827e-03f, +4.947957059e-04f, +4.548352097e-03f, -3.368820468e-03f, -1.419885067e-03f, +3.382518597e-03f, -1.041374031e-03f, -1.626753728e-03f, +1.566271235e-03f, +7.441197769e-05f, -8.603196375e-04f, +3.975036781e-04f, +1.640243894e-04f, -1.648141284e-04f, +3.428538431e-05f, +0.000000000e+00f, - /* 10,12 (36) */ - +0.000000000e+00f, -3.112978975e-04f, -5.871673671e-04f, +1.736132130e-03f, +2.458116791e-04f, -4.524009106e-03f, +2.888158088e-03f, +7.216799824e-03f, -1.077550011e-02f, -5.839439625e-03f, +2.339870935e-02f, -5.804016097e-03f, -3.686581736e-02f, +3.580924498e-02f, +4.185001294e-02f, -1.023421218e-01f, -1.194534887e-02f, +4.142597481e-01f, +5.631676181e-01f, +1.885699227e-01f, -1.126465443e-01f, -2.831805799e-02f, +6.354982285e-02f, -9.503343145e-03f, -3.182987850e-02f, +1.796816944e-02f, +1.114621525e-02f, -1.445063700e-02f, -5.941061375e-04f, +7.841985467e-03f, -2.544144944e-03f, -2.775059206e-03f, +1.998996172e-03f, +4.252640152e-04f, -7.251858742e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.112978975e-04f, +5.871673671e-04f, -2.255784358e-03f, +7.062217525e-04f, +5.292211027e-03f, -6.988966964e-03f, -3.929401400e-03f, +1.638504743e-02f, -7.968348841e-03f, -1.876250774e-02f, +2.737580044e-02f, +3.668853018e-03f, -3.877977112e-02f, +2.547845715e-02f, +2.670588063e-02f, -4.860196112e-02f, +6.301026190e-03f, +4.579120694e-02f, -3.793971861e-02f, -1.762111059e-02f, +4.595803951e-02f, -1.448391835e-02f, -2.869950068e-02f, +2.896862746e-02f, +4.027722584e-03f, -2.268571807e-02f, +1.005551400e-02f, +8.577993945e-03f, -1.019027450e-02f, +5.333009973e-04f, +4.527012306e-03f, -2.151507862e-03f, -4.252640152e-04f, +7.251858742e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.897846436e-05f, -6.535721937e-05f, -1.367859399e-04f, +3.246357830e-04f, +4.861157251e-05f, -7.617019767e-04f, +4.963048970e-04f, +1.103582358e-03f, -1.724089980e-03f, -7.557444035e-04f, +3.560497858e-03f, -1.127702779e-03f, -5.525876329e-03f, +5.816700690e-03f, +7.154815972e-03f, -1.895117576e-02f, -2.605357718e-02f, +8.933325890e-03f, +2.888403095e-02f, +6.080258955e-03f, -1.035841164e-02f, +3.862076857e-04f, +5.277347306e-03f, -2.207084703e-03f, -2.147753875e-03f, +2.110292211e-03f, +3.750199130e-04f, -1.308811255e-03f, +3.129171415e-04f, +5.387876784e-04f, -3.505987525e-04f, -1.037297279e-04f, +1.706744610e-04f, -2.533435089e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.897846436e-05f, +6.535721937e-05f, +1.468021015e-04f, -4.779633281e-04f, +1.967187451e-04f, +8.632675193e-04f, -1.286503976e-03f, -3.138551405e-04f, +2.452718358e-03f, -1.718864774e-03f, -2.098601618e-03f, +4.152082301e-03f, -6.643113960e-04f, -4.640115837e-03f, +4.417593386e-03f, +1.881716702e-03f, -6.187339930e-03f, +2.569789586e-03f, +4.292421448e-03f, -5.432600469e-03f, -1.769787936e-04f, +4.817686777e-03f, -2.995861166e-03f, -1.876739421e-03f, +3.397801589e-03f, -7.284145239e-04f, -1.828199279e-03f, +1.491207895e-03f, +2.343439974e-04f, -9.101527510e-04f, +3.478069317e-04f, +2.112442972e-04f, -1.706744610e-04f, +2.533435089e-05f, +0.000000000e+00f, - /* 10,13 (36) */ - +0.000000000e+00f, -2.523194331e-04f, -6.525245865e-04f, +1.599346190e-03f, +5.704474622e-04f, -4.475397533e-03f, +2.126456111e-03f, +7.713104721e-03f, -9.671917752e-03f, -7.563529605e-03f, +2.264296494e-02f, -2.243518239e-03f, -3.799352014e-02f, +3.028336865e-02f, +4.766671363e-02f, -9.518730587e-02f, -3.089652464e-02f, +3.882061709e-01f, +5.721009440e-01f, +2.174539537e-01f, -1.065662854e-01f, -3.867646963e-02f, +6.393603053e-02f, -4.225995840e-03f, -3.403696320e-02f, +1.582041557e-02f, +1.325650746e-02f, -1.407561709e-02f, -1.902917392e-03f, +8.154902609e-03f, -2.005357265e-03f, -3.125657959e-03f, +1.895266444e-03f, +5.959384762e-04f, -7.505202251e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.523194331e-04f, +6.525245865e-04f, -2.108982257e-03f, +2.282584243e-04f, +5.488929773e-03f, -6.125699445e-03f, -5.215905376e-03f, +1.607119229e-02f, -5.515630483e-03f, -2.048137252e-02f, +2.527719883e-02f, +7.820935319e-03f, -3.944408252e-02f, +2.083834132e-02f, +3.112347402e-02f, -4.672024442e-02f, +1.136862607e-04f, +4.836099653e-02f, -3.364729716e-02f, -2.305371106e-02f, +4.578106072e-02f, -9.666231573e-03f, -3.169536184e-02f, +2.709188803e-02f, +7.425524173e-03f, -2.341413259e-02f, +8.227314721e-03f, +1.006920184e-02f, -9.955930500e-03f, -3.768517537e-04f, +4.874819238e-03f, -1.940263565e-03f, -5.959384762e-04f, +7.505202251e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.686799517e-05f, -5.048104610e-05f, -1.505379459e-04f, +2.987487070e-04f, +1.070329941e-04f, -7.565447293e-04f, +3.729285139e-04f, +1.190446501e-03f, -1.561802592e-03f, -1.029091125e-03f, +3.468789506e-03f, -5.886766699e-04f, -5.722482458e-03f, +4.956947418e-03f, +8.039244336e-03f, -1.721901681e-02f, -2.709224689e-02f, +6.433473934e-03f, +2.911410294e-02f, +7.936149909e-03f, -1.032192300e-02f, -4.696474517e-04f, +5.528955538e-03f, -1.820947750e-03f, -2.440070971e-03f, +2.004987484e-03f, +5.833270222e-04f, -1.335397235e-03f, +2.125299559e-04f, +5.931378417e-04f, -3.245741528e-04f, -1.381448576e-04f, +1.742040072e-04f, -1.513779949e-05f, +0.000000000e+00f, - +0.000000000e+00f, -5.686799517e-05f, +5.048104610e-05f, +1.696619686e-04f, -4.528571409e-04f, +1.043542233e-04f, +9.170806654e-04f, -1.161825532e-03f, -5.396297686e-04f, +2.465319555e-03f, -1.378763756e-03f, -2.424792516e-03f, +3.967771208e-03f, -8.023245599e-05f, -4.893869695e-03f, +3.928819409e-03f, +2.554190250e-03f, -6.175033338e-03f, +1.863542627e-03f, +4.799722777e-03f, -5.127499849e-03f, -8.522127213e-04f, +5.018283861e-03f, -2.572322046e-03f, -2.313761148e-03f, +3.361979505e-03f, -3.962779854e-04f, -2.007613800e-03f, +1.390382041e-03f, +3.970459732e-04f, -9.477237061e-04f, +2.896164368e-04f, +2.579436044e-04f, -1.742040072e-04f, +1.513779949e-05f, +0.000000000e+00f, - /* 10,14 (36) */ - +0.000000000e+00f, -1.954514380e-04f, -7.030056326e-04f, +1.448808244e-03f, +8.691961692e-04f, -4.368364539e-03f, +1.369911382e-03f, +8.086033235e-03f, -8.481471251e-03f, -9.125332197e-03f, +2.161387382e-02f, +1.225271268e-03f, -3.858219681e-02f, +2.456088620e-02f, +5.262366104e-02f, -8.714806153e-02f, -4.811554144e-02f, +3.611139240e-01f, +5.785344179e-01f, +2.465680566e-01f, -9.863013548e-02f, -4.899839262e-02f, +6.346638308e-02f, +1.302959698e-03f, -3.585791095e-02f, +1.338034460e-02f, +1.526149494e-02f, -1.349229007e-02f, -3.238314627e-03f, +8.367432565e-03f, -1.412219424e-03f, -3.450232112e-03f, +1.757121586e-03f, +7.701424835e-04f, -7.656580246e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.954514380e-04f, +7.030056326e-04f, -1.939320288e-03f, -2.245987165e-04f, +5.593283996e-03f, -5.208618780e-03f, -6.377730908e-03f, +1.553156252e-02f, -3.050310928e-03f, -2.186013627e-02f, +2.285240631e-02f, +1.178870653e-02f, -3.952431497e-02f, +1.594447162e-02f, +3.505229343e-02f, -4.416605417e-02f, -6.061347078e-03f, +5.022453916e-02f, -2.884757439e-02f, -2.818121091e-02f, +4.492884800e-02f, -4.647947712e-03f, -3.426768389e-02f, +2.477812689e-02f, +1.078750368e-02f, -2.381041058e-02f, +6.219700920e-03f, +1.145958388e-02f, -9.558884527e-03f, -1.324575460e-03f, +5.164435675e-03f, -1.682319961e-03f, -7.701424835e-04f, +7.656580246e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.391097472e-05f, -3.592407024e-05f, -1.612093921e-04f, +2.700242113e-04f, +1.611372539e-04f, -7.412442005e-04f, +2.494776366e-04f, +1.258014460e-03f, -1.384438913e-03f, -1.279348831e-03f, +3.334406648e-03f, -6.046392525e-05f, -5.837850146e-03f, +4.068870907e-03f, +8.782090082e-03f, -1.542130069e-02f, -2.792284028e-02f, +3.881199688e-03f, +2.913597658e-02f, +9.815654971e-03f, -1.014940430e-02f, -1.353708248e-03f, +5.715262794e-03f, -1.396420030e-03f, -2.709265681e-03f, +1.868239599e-03f, +7.913703976e-04f, -1.344314247e-03f, +1.047914687e-04f, +6.415112318e-04f, -2.923973489e-04f, -1.725279642e-04f, +1.751889823e-04f, -3.784329719e-06f, +0.000000000e+00f, - +0.000000000e+00f, -5.391097472e-05f, +3.592407024e-05f, +1.880624540e-04f, -4.219838745e-04f, +1.493482220e-05f, +9.546290909e-04f, -1.024220164e-03f, -7.501245237e-04f, +2.440867502e-03f, -1.026284678e-03f, -2.708498128e-03f, +3.727931714e-03f, +4.969786261e-04f, -5.072635585e-03f, +3.385910532e-03f, +3.185499788e-03f, -6.071456451e-03f, +1.129403384e-03f, +5.237480478e-03f, -4.744380058e-03f, -1.520757418e-03f, +5.146294832e-03f, -2.103880952e-03f, -2.723920263e-03f, +3.274497897e-03f, -4.961619248e-05f, -2.161546552e-03f, +1.264509408e-03f, +5.600141608e-04f, -9.718574754e-04f, +2.234675677e-04f, +3.032592295e-04f, -1.751889823e-04f, +3.784329719e-06f, +0.000000000e+00f, - /* 10,15 (36) */ - +0.000000000e+00f, -1.415404632e-04f, -7.389297029e-04f, +1.287598852e-03f, +1.139220381e-03f, -4.207227285e-03f, +6.286671812e-04f, +8.335510872e-03f, -7.223456790e-03f, -1.050977111e-02f, +2.033452499e-02f, +4.559677915e-03f, -3.864266074e-02f, +1.872303605e-02f, +5.669253195e-02f, -7.836597145e-02f, -6.353684213e-02f, +3.331910838e-01f, +5.824156176e-01f, +2.757040332e-01f, -8.881448051e-02f, -5.914779692e-02f, +6.211267483e-02f, +7.018222492e-03f, -3.725433098e-02f, +1.067107892e-02f, +1.712973454e-02f, -1.270091967e-02f, -4.582628874e-03f, +8.472224034e-03f, -7.707081919e-04f, -3.742629460e-03f, +1.584593622e-03f, +9.453314657e-04f, -7.694423543e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.415404632e-04f, +7.389297029e-04f, -1.751257834e-03f, -6.465825911e-04f, +5.608218818e-03f, -4.253989689e-03f, -7.401951071e-03f, +1.478143799e-02f, -6.094434262e-04f, -2.288642095e-02f, +2.014390818e-02f, +1.551663824e-02f, -3.902733634e-02f, +1.087183604e-02f, +3.843820396e-02f, -4.098055438e-02f, -1.213280353e-02f, +5.135394254e-02f, -2.361009391e-02f, -3.292559096e-02f, +4.340809058e-02f, +4.983471210e-04f, -3.637156484e-02f, +2.205420662e-02f, +1.406200157e-02f, -2.386002677e-02f, +4.058154368e-03f, +1.272409329e-02f, -8.998870366e-03f, -2.296432935e-03f, +5.387903242e-03f, -1.379060731e-03f, -9.453314657e-04f, +7.694423543e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.023134456e-05f, -2.190255501e-05f, -1.688223017e-04f, +2.390309122e-04f, +2.103608979e-04f, -7.164513821e-04f, +1.276517827e-04f, +1.306087259e-03f, -1.194919714e-03f, -1.503966945e-03f, +3.160553007e-03f, +4.504223033e-04f, -5.873380723e-03f, +3.164503237e-03f, +9.381395225e-03f, -1.357609648e-02f, -2.854133495e-02f, +1.297262942e-03f, +2.894571562e-02f, +1.170154190e-02f, -9.836779302e-03f, -2.255639644e-03f, +5.831432835e-03f, -9.379074490e-04f, -2.950847993e-03f, +1.700823497e-03f, +9.962288442e-04f, -1.334740657e-03f, -9.061379130e-06f, +6.829239910e-04f, -2.542369269e-04f, -2.063423291e-04f, +1.734450844e-04f, +8.610096471e-06f, +0.000000000e+00f, - +0.000000000e+00f, -5.023134456e-05f, +2.190255501e-05f, +2.019751614e-04f, -3.861753858e-04f, -7.025519776e-05f, +9.760043827e-04f, -8.762743588e-04f, -9.426127885e-04f, +2.380746322e-03f, -6.670301471e-04f, -2.946312073e-03f, +3.437091543e-03f, +1.058782302e-03f, -5.174551379e-03f, +2.797408819e-03f, +3.766421654e-03f, -5.878377207e-03f, +3.783561031e-04f, +5.598913174e-03f, -4.288541765e-03f, -2.172477802e-03f, +5.198937536e-03f, -1.596989202e-03f, -3.100476839e-03f, +3.135594535e-03f, +3.065756726e-04f, -2.286851473e-03f, +1.114731918e-03f, +7.206449357e-04f, -9.815523707e-04f, +1.500603778e-04f, +3.463027545e-04f, -1.734450844e-04f, -8.610096471e-06f, +0.000000000e+00f, - /* 11, 0 (32) */ - +0.000000000e+00f, +3.454933159e-04f, +1.541097233e-03f, -3.365769507e-03f, +1.849372243e-04f, +7.921455674e-03f, -9.933387929e-03f, -4.722893055e-03f, +2.491782703e-02f, -1.923850865e-02f, -2.511889872e-02f, +6.555431985e-02f, -2.774896345e-02f, -1.143270713e-01f, +2.866385681e-01f, +6.354451792e-01f, +2.866385681e-01f, -1.143270713e-01f, -2.774896345e-02f, +6.555431985e-02f, -2.511889872e-02f, -1.923850865e-02f, +2.491782703e-02f, -4.722893055e-03f, -9.933387929e-03f, +7.921455674e-03f, +1.849372243e-04f, -3.365769507e-03f, +1.541097233e-03f, +3.454933159e-04f, -4.305061225e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.454933159e-04f, -1.287417451e-03f, +5.082890229e-03f, -4.452826306e-03f, -5.152110347e-03f, +1.588482173e-02f, -1.131295515e-02f, -1.199676363e-02f, +3.147222030e-02f, -1.942348993e-02f, -1.990214054e-02f, +4.584722208e-02f, -2.506967236e-02f, -2.523864421e-02f, +5.173229864e-02f, -2.523864421e-02f, -2.506967236e-02f, +4.584722208e-02f, -1.990214054e-02f, -1.942348993e-02f, +3.147222030e-02f, -1.199676363e-02f, -1.131295515e-02f, +1.588482173e-02f, -5.152110347e-03f, -4.452826306e-03f, +5.082890229e-03f, -1.287417451e-03f, -7.762310022e-04f, +4.305061225e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.399604254e-04f, +1.041765491e-04f, +2.986283797e-04f, -7.115835566e-04f, +2.200087399e-04f, +1.290622629e-03f, -2.007399170e-03f, -1.847465416e-04f, +4.038384288e-03f, -4.234443633e-03f, -2.943297891e-03f, +1.200925710e-02f, -7.413000132e-03f, -3.454462879e-02f, -1.675619045e-03f, +3.441971216e-02f, +9.809674830e-03f, -1.217880404e-02f, +2.010048142e-03f, +4.814598421e-03f, -3.887513846e-03f, -2.142409335e-04f, +2.170997092e-03f, -1.185826608e-03f, -3.634744702e-04f, +7.486225761e-04f, -2.595530007e-04f, -1.401057002e-04f, +1.471444736e-04f, -3.315285962e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.399604254e-04f, -2.714216420e-04f, -1.520612352e-04f, +9.909186848e-04f, -1.172027193e-03f, -3.022516193e-04f, +2.503704416e-03f, -2.716755794e-03f, -4.456389479e-04f, +4.365791338e-03f, -4.428304910e-03f, -5.070221017e-04f, +5.764277198e-03f, -5.506807710e-03f, -4.425173936e-04f, +5.957741012e-03f, -5.372316216e-03f, -2.775764127e-04f, +4.833429021e-03f, -4.105732234e-03f, -9.342864861e-05f, +2.998386549e-03f, -2.381896629e-03f, +2.989319289e-05f, +1.316518315e-03f, -9.605757532e-04f, +6.507439985e-05f, +3.191257033e-04f, -2.010311674e-04f, +3.315285962e-05f, +0.000000000e+00f, - /* 11, 1 (32) */ - +0.000000000e+00f, +2.055328905e-04f, +1.645273782e-03f, -3.067141127e-03f, -5.266463322e-04f, +8.141464414e-03f, -8.642765300e-03f, -6.730292225e-03f, +2.473308049e-02f, -1.520012436e-02f, -2.935334235e-02f, +6.261102195e-02f, -1.573970634e-02f, -1.217400715e-01f, +2.520939393e-01f, +6.337695601e-01f, +3.210582802e-01f, -1.045173965e-01f, -3.992776749e-02f, +6.756436799e-02f, -2.030430029e-02f, -2.312602249e-02f, +2.470358610e-02f, -2.551895963e-03f, -1.111921454e-02f, +7.557981204e-03f, +9.335598005e-04f, -3.625322507e-03f, +1.400991533e-03f, +4.926377895e-04f, -4.636589821e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.055328905e-04f, -1.558839093e-03f, +4.930828994e-03f, -3.461907621e-03f, -6.324137540e-03f, +1.558257011e-02f, -8.809250736e-03f, -1.471351943e-02f, +3.102658135e-02f, -1.505769859e-02f, -2.433044545e-02f, +4.534019998e-02f, -1.930539516e-02f, -3.074545192e-02f, +5.128978125e-02f, -1.928090320e-02f, -3.044198857e-02f, +4.556964567e-02f, -1.506871152e-02f, -2.352922217e-02f, +3.137879165e-02f, -8.998377082e-03f, -1.369485178e-02f, +1.591471492e-02f, -3.835592032e-03f, -5.413402059e-03f, +5.147964629e-03f, -9.682917474e-04f, -9.772621697e-04f, +4.636589821e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.307312654e-04f, +6.892978118e-05f, +3.303462436e-04f, -6.648056295e-04f, +7.980483913e-05f, +1.370176154e-03f, -1.818623406e-03f, -5.652322161e-04f, +4.120340294e-03f, -3.611381843e-03f, -3.792586585e-03f, +1.167016172e-02f, -5.071274913e-03f, -3.437345706e-02f, -5.010603072e-03f, +3.399429673e-02f, +1.223580090e-02f, -1.216800061e-02f, +1.003764677e-03f, +5.340871520e-03f, -3.667467789e-03f, -6.259085202e-04f, +2.305633509e-03f, -1.056428589e-03f, -5.078899367e-04f, +7.747425269e-04f, -2.133848905e-04f, -1.760720761e-04f, +1.519596632e-04f, -2.685306184e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.307312654e-04f, -2.217972983e-04f, -2.311650394e-04f, +1.001898222e-03f, -1.012712208e-03f, -5.596855127e-04f, +2.578160955e-03f, -2.395085426e-03f, -9.655624416e-04f, +4.545869262e-03f, -3.952208277e-03f, -1.274926019e-03f, +6.054025378e-03f, -4.962195739e-03f, -1.319799421e-03f, +6.306773198e-03f, -4.884366485e-03f, -1.065181453e-03f, +5.159434945e-03f, -3.768946506e-03f, -6.423743823e-04f, +3.233859346e-03f, -2.213529401e-03f, -2.528729306e-04f, +1.442834315e-03f, -9.105023451e-04f, -2.849917238e-05f, +3.637431385e-04f, -2.007290083e-04f, +2.685306184e-05f, +0.000000000e+00f, - /* 11, 2 (32) */ - +0.000000000e+00f, +7.480162519e-05f, +1.714203563e-03f, -2.736794883e-03f, -1.191451962e-03f, +8.221269253e-03f, -7.272589145e-03f, -8.548915631e-03f, +2.416784827e-02f, -1.107978407e-02f, -3.296472419e-02f, +5.881843537e-02f, -4.069544625e-03f, -1.268113464e-01f, +2.177204822e-01f, +6.287589571e-01f, +3.550525770e-01f, -9.228159561e-02f, -5.209576810e-02f, +6.856813267e-02f, -1.496342877e-02f, -2.679349028e-02f, +2.407767758e-02f, -2.462624541e-04f, -1.217564313e-02f, +7.050091267e-03f, +1.708302327e-03f, -3.838707398e-03f, +1.224919457e-03f, +6.445974527e-04f, -4.905120440e-04f, +0.000000000e+00f, - +0.000000000e+00f, -7.480162519e-05f, -1.780636391e-03f, +4.699663955e-03f, -2.460009399e-03f, -7.336849749e-03f, +1.502288459e-02f, -6.231089781e-03f, -1.710860485e-02f, +3.006101891e-02f, -1.051182933e-02f, -2.828265373e-02f, +4.406527396e-02f, -1.325136978e-02f, -3.570764766e-02f, +4.996998183e-02f, -1.297413000e-02f, -3.532635506e-02f, +4.450446421e-02f, -9.909276578e-03f, -2.729816867e-02f, +3.073641726e-02f, -5.764517736e-03f, -1.590838118e-02f, +1.566184199e-02f, -2.392757717e-03f, -6.323904404e-03f, +5.119465457e-03f, -6.045486089e-04f, -1.177991178e-03f, +4.905120440e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.197987467e-04f, +3.495771602e-05f, +3.545858643e-04f, -6.095759291e-04f, -5.498480556e-05f, +1.424286778e-03f, -1.608709499e-03f, -9.219085338e-04f, +4.134708898e-03f, -2.956633492e-03f, -4.548636410e-03f, +1.117413572e-02f, -2.808650060e-03f, -3.391382572e-02f, -8.297016562e-03f, +3.326728023e-02f, +1.466482656e-02f, -1.196806374e-02f, -6.307772297e-05f, +5.802714914e-03f, -3.379094539e-03f, -1.043996991e-03f, +2.407854881e-03f, -9.035169628e-04f, -6.508167323e-04f, +7.888970184e-04f, -1.605359360e-04f, -2.113872174e-04f, +1.541084338e-04f, -1.912402271e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.197987467e-04f, -1.713870949e-04f, -3.013125153e-04f, +9.942311033e-04f, -8.420672912e-04f, -7.981028032e-04f, +2.605351521e-03f, -2.040060195e-03f, -1.457607839e-03f, +4.644186430e-03f, -3.414433922e-03f, -2.012878036e-03f, +6.237185937e-03f, -4.333758325e-03f, -2.173962125e-03f, +6.547465475e-03f, -4.308401061e-03f, -1.841917467e-03f, +5.399489258e-03f, -3.360128864e-03f, -1.191560114e-03f, +3.417750004e-03f, -2.000282133e-03f, -5.411772459e-04f, +1.547837769e-03f, -8.407043378e-04f, -1.271556887e-04f, +4.040997418e-04f, -1.956734673e-04f, +1.912402271e-05f, +0.000000000e+00f, - /* 11, 3 (32) */ - +0.000000000e+00f, -4.499712153e-05f, +1.749161279e-03f, -2.382209019e-03f, -1.801027891e-03f, +8.166284447e-03f, -5.848302367e-03f, -1.015762513e-02f, +2.324593974e-02f, -6.945075168e-03f, -3.592135768e-02f, +5.426979896e-02f, +7.104591091e-03f, -1.296199964e-01f, +1.838066565e-01f, +6.204619405e-01f, +3.883198572e-01f, -7.761676906e-02f, -6.406383185e-02f, +6.850505494e-02f, -9.160713861e-03f, -3.017258482e-02f, +2.303368059e-02f, +2.161592427e-03f, -1.307916009e-02f, +6.399274535e-03f, +2.497199346e-03f, -3.999243334e-03f, +1.013532239e-03f, +7.987058865e-04f, -5.096360667e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.499712153e-05f, -1.952023486e-03f, +4.398351440e-03f, -1.465778295e-03f, -8.178917040e-03f, +1.422478179e-02f, -3.625738261e-03f, -1.914866505e-02f, +2.860341107e-02f, -5.867642902e-03f, -3.169708765e-02f, +4.205239592e-02f, -7.014183843e-03f, -4.004140599e-02f, +4.779601970e-02f, -6.426664530e-03f, -3.963475612e-02f, +4.266254675e-02f, -4.509787320e-03f, -3.065829754e-02f, +2.954485715e-02f, -2.346767732e-03f, -1.790866331e-02f, +1.512066474e-02f, -8.449199480e-04f, -7.164608742e-03f, +4.992309768e-03f, -2.004488672e-04f, -1.373664645e-03f, +5.096360667e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.075145692e-04f, +2.791820816e-06f, +3.713650726e-04f, -5.472611389e-04f, -1.823966401e-04f, +1.453179366e-03f, -1.381877687e-03f, -1.250047714e-03f, +4.083824124e-03f, -2.281486140e-03f, -5.203894462e-03f, +1.053539043e-02f, -6.476584866e-04f, -3.317645239e-02f, -1.150311548e-02f, +3.224091711e-02f, +1.706945906e-02f, -1.157240936e-02f, -1.176584853e-03f, +6.190187725e-03f, -3.024379522e-03f, -1.461896240e-03f, +2.474609177e-03f, -7.286283776e-04f, -7.897272177e-04f, +7.901990787e-04f, -1.015655426e-04f, -2.453303176e-04f, +1.533275451e-04f, -1.001616161e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.075145692e-04f, -1.212714302e-04f, -3.616636038e-04f, +9.689545383e-04f, -6.636577527e-04f, -1.013897991e-03f, +2.586211951e-03f, -1.658796092e-03f, -1.913720021e-03f, +4.660445649e-03f, -2.825243912e-03f, -2.708284773e-03f, +6.311299411e-03f, -3.632797577e-03f, -2.990053264e-03f, +6.675283650e-03f, -3.654009310e-03f, -2.593970440e-03f, +5.548211855e-03f, -2.885352155e-03f, -1.731145461e-03f, +3.545446236e-03f, -1.744715690e-03f, -8.298788745e-04f, +1.628674706e-03f, -7.515772681e-04f, -2.292045253e-04f, +4.390390155e-04f, -1.855878775e-04f, +1.001616161e-05f, +0.000000000e+00f, - /* 11, 4 (32) */ - +0.000000000e+00f, -1.525116908e-04f, +1.751953100e-03f, -2.010843946e-03f, -2.348289030e-03f, +7.983887807e-03f, -4.395123001e-03f, -1.153950282e-02f, +2.199589203e-02f, -2.861251044e-03f, -3.820284382e-02f, +4.906590450e-02f, +1.763998152e-02f, -1.302676549e-01f, +1.506302041e-01f, +6.089588250e-01f, +4.205607743e-01f, -6.054731000e-02f, -7.563624121e-02f, +6.732847009e-02f, -2.970526136e-03f, -3.319696434e-02f, +2.157178435e-02f, +4.636201605e-03f, -1.380778847e-02f, +5.609547317e-03f, +3.287398424e-03f, -4.100808877e-03f, +7.682019216e-04f, +9.520334316e-04f, -5.196522283e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.525116908e-04f, -2.073294916e-03f, +4.036687836e-03f, -4.968237572e-04f, -8.842574792e-03f, +1.321088380e-02f, -1.039526309e-03f, -2.080746114e-02f, +2.668969105e-02f, -1.207197253e-03f, -3.452233157e-02f, +3.934411115e-02f, -7.028844317e-04f, -4.367420357e-02f, +4.480596644e-02f, +2.486191205e-04f, -4.328876543e-02f, +4.006857631e-02f, +1.038424535e-03f, -3.354364969e-02f, +2.781371169e-02f, +1.198678504e-03f, -1.965337901e-02f, +1.429078587e-02f, +7.837547575e-04f, -7.916186010e-03f, +4.763105243e-03f, +2.385901483e-04f, -1.559252523e-03f, +5.196522283e-04f, +0.000000000e+00f, - +0.000000000e+00f, -9.423259651e-05f, -2.710370466e-05f, +3.808325289e-04f, -4.792799535e-04f, -3.006807112e-04f, +1.457482743e-03f, -1.142453153e-03f, -1.545555763e-03f, +3.970954405e-03f, -1.597120740e-03f, -5.752581056e-03f, +9.769492281e-03f, +1.391029546e-03f, -3.217497647e-02f, -1.459810151e-02f, +3.092082508e-02f, +1.942199261e-02f, -1.097680665e-02f, -2.321595832e-03f, +6.494133407e-03f, -2.606455251e-03f, -1.872740937e-03f, +2.503313221e-03f, -5.337403646e-04f, -9.220448299e-04f, +7.779451282e-04f, -3.717827743e-05f, -2.771604496e-04f, +1.493959888e-04f, +3.828556293e-07f, +0.000000000e+00f, - +0.000000000e+00f, +9.423259651e-05f, -7.245690575e-05f, -4.116164933e-04f, +9.273919632e-04f, -4.810502642e-04f, -1.204002802e-03f, +2.522487056e-03f, -1.258700448e-03f, -2.326654291e-03f, +4.595812404e-03f, -2.195670544e-03f, -3.349435626e-03f, +6.275852711e-03f, -2.871856988e-03f, -3.753802700e-03f, +6.687684854e-03f, -2.932233975e-03f, -3.307838086e-03f, +5.601792117e-03f, -2.351978856e-03f, -2.251264847e-03f, +3.613252870e-03f, -1.450249299e-03f, -1.113654754e-03f, +1.682841202e-03f, -6.439158093e-04f, -3.327938628e-04f, +4.674487560e-04f, -1.702953811e-04f, -3.828556293e-07f, +0.000000000e+00f, - /* 11, 5 (32) */ - +0.000000000e+00f, -2.467442873e-04f, +1.724849395e-03f, -1.630011418e-03f, -2.827568983e-03f, +7.683207096e-03f, -2.937640258e-03f, -1.268195597e-02f, +2.045033626e-02f, +1.109703361e-03f, -3.979996456e-02f, +4.331332344e-02f, +2.740947380e-02f, -1.288766254e-01f, +1.184552276e-01f, +5.943607235e-01f, +4.514815994e-01f, -4.112531739e-02f, -8.661304785e-02f, +6.500687426e-02f, +3.523607271e-03f, -3.580341959e-02f, +1.969904341e-02f, +7.139514826e-03f, -1.434152883e-02f, +4.687502487e-03f, +4.065343553e-03f, -4.137987154e-03f, +4.910414720e-04f, +1.101429420e-03f, -5.192693727e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.467442873e-04f, -2.145751822e-03f, +3.625071342e-03f, +4.305682060e-04f, -9.323625057e-03f, +1.200688100e-02f, +1.482960747e-03f, -2.206616159e-02f, +2.436303675e-02f, +3.388615151e-03f, -3.671800211e-02f, +3.599467552e-02f, +5.572968280e-03f, -4.654606055e-02f, +4.105216374e-02f, +6.936303974e-03f, -4.622099940e-02f, +3.676073822e-02f, +6.640216652e-03f, -3.589562855e-02f, +2.556244684e-02f, +4.811931374e-03f, -2.110362830e-02f, +1.317713111e-02f, +2.466595959e-03f, -8.560101819e-03f, +4.430311380e-03f, +7.060389043e-04f, -1.729547904e-03f, +5.192693727e-04f, +0.000000000e+00f, - +0.000000000e+00f, -8.030149258e-05f, -5.433670509e-05f, +3.832580123e-04f, -4.070759198e-04f, -4.083206773e-04f, +1.438202486e-03f, -8.947915600e-04f, -1.805014389e-03f, +3.800217875e-03f, -9.144453014e-04f, -6.190710991e-03f, +8.893112110e-03f, +3.288822149e-03f, -3.092575692e-02f, -1.755248302e-02f, +2.931594908e-02f, +2.169464718e-02f, -1.017950378e-02f, -3.481859008e-03f, +6.706350839e-03f, -2.129593340e-03f, -2.269513888e-03f, +2.491914723e-03f, -3.212560480e-04f, -1.045187034e-03f, +7.516367599e-04f, +3.178135117e-05f, -3.061298911e-04f, +1.421424992e-04f, +1.194746278e-05f, +0.000000000e+00f, - +0.000000000e+00f, +8.030149258e-05f, -2.585919819e-05f, -4.508075312e-04f, +8.711146184e-04f, -2.977454210e-04f, -1.365925069e-03f, +2.416675152e-03f, -8.473300397e-04f, -2.690090414e-03f, +4.452868841e-03f, -1.537307931e-03f, -3.925703444e-03f, +6.132274715e-03f, -2.064492216e-03f, -4.451877688e-03f, +6.584168342e-03f, -2.155380859e-03f, -3.970576614e-03f, +5.558077690e-03f, -1.768547346e-03f, -2.742208475e-03f, +3.618482286e-03f, -1.121120444e-03f, -1.387095215e-03f, +1.708245537e-03f, -5.189155386e-04f, -4.359409679e-04f, +4.882881120e-04f, -1.497297397e-04f, -1.194746278e-05f, +0.000000000e+00f, - /* 11, 6 (32) */ - +0.000000000e+00f, -3.270457799e-04f, +1.670512690e-03f, -1.246753405e-03f, -3.234644903e-03f, +7.274886419e-03f, -1.499437772e-03f, -1.357674753e-02f, +1.864532187e-02f, +4.909921236e-03f, -4.071440986e-02f, +3.712261245e-02f, +3.630258591e-02f, -1.255878032e-01f, +8.752947072e-02f, +5.768082405e-01f, +4.807975485e-01f, -1.943067021e-02f, -9.679255163e-02f, +6.152501525e-02f, +1.022995811e-02f, -3.793301293e-02f, +1.742952952e-02f, +9.631429549e-03f, -1.466278488e-02f, +3.642315453e-03f, +4.816980313e-03f, -4.106205803e-03f, +1.849115809e-04f, +1.243571920e-03f, -5.073219099e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.270457799e-04f, -2.171611020e-03f, +3.174263811e-03f, +1.301682824e-03f, -9.621370478e-03f, +1.064095593e-02f, +3.899635899e-03f, -2.291349163e-02f, +2.167294634e-02f, +7.841483992e-03f, -3.825531004e-02f, +3.206897208e-02f, +1.170524299e-02f, -4.861055277e-02f, +3.660028605e-02f, +1.352047232e-02f, -4.837638026e-02f, +3.279016161e-02f, +1.219829434e-02f, -3.766417590e-02f, +2.282023837e-02f, +8.430413660e-03f, -2.222474875e-02f, +1.179003590e-02f, +4.174841496e-03f, -9.079017358e-03f, +3.994370412e-03f, +1.194327016e-03f, -1.879277644e-03f, +5.073219099e-04f, +0.000000000e+00f, - +0.000000000e+00f, -6.605790481e-05f, -7.859020218e-05f, +3.790210013e-04f, -3.320911204e-04f, -5.040489558e-04f, +1.396688521e-03f, -6.432069161e-04f, -2.025710559e-03f, +3.576487267e-03f, -2.439382415e-04f, -6.516088221e-03f, +7.923766014e-03f, +5.029390160e-03f, -2.944763799e-02f, -2.033841886e-02f, +2.743848295e-02f, +2.385991397e-02f, -9.181322639e-03f, -4.640229032e-03f, +6.819756489e-03f, -1.599177980e-03f, -2.645155693e-03f, +2.438947738e-03f, -9.398088869e-05f, -1.156610267e-03f, +7.109998284e-04f, +1.043370223e-04f, -3.314983423e-04f, +1.314524813e-04f, +2.451436211e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.605790481e-05f, +1.771118770e-05f, -4.791062706e-04f, +8.018998884e-04f, -1.171141105e-04f, -1.497775478e-03f, +2.271960141e-03f, -4.322498801e-04f, -2.998727403e-03f, +4.235542723e-03f, -8.620962011e-04f, -4.427723534e-03f, +5.883896733e-03f, -1.225024426e-03f, -5.072121008e-03f, +6.366289365e-03f, -1.336804441e-03f, -4.570039469e-03f, +5.416633899e-03f, -1.144634675e-03f, -3.194603884e-03f, +3.559527997e-03f, -7.623281066e-04f, -1.644804275e-03f, +1.703264485e-03f, -3.781666435e-04f, -5.365666914e-04f, +5.006145340e-04f, -1.239441717e-04f, -2.451436211e-05f, +0.000000000e+00f, - /* 11, 7 (32) */ - +0.000000000e+00f, -3.931036847e-04f, +1.591922488e-03f, -8.677324040e-04f, -3.566736023e-03f, +6.770837463e-03f, -1.027492505e-04f, -1.421995445e-02f, +1.661961131e-02f, +8.486408502e-03f, -4.095834811e-02f, +3.060652423e-02f, +4.422635193e-02f, -1.205584131e-01f, +5.808183272e-02f, +5.564698216e-01f, +5.082360314e-01f, +4.429243765e-03f, -1.059738743e-01f, +5.688478622e-02f, +1.704971460e-02f, -3.953219091e-02f, +1.478437383e-02f, +1.207037729e-02f, -1.475676577e-02f, +2.485705186e-03f, +5.527980141e-03f, -4.001868780e-03f, -1.465867614e-04f, +1.375024401e-03f, -4.828075478e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.931036847e-04f, -2.153899832e-03f, +2.695157541e-03f, +2.103582713e-03f, -9.738484588e-03f, +9.143180449e-03f, +6.171596040e-03f, -2.334574151e-02f, +1.867421894e-02f, +1.207702671e-02f, -3.911740624e-02f, +2.764124854e-02f, +1.758913973e-02f, -4.983557720e-02f, +3.152816504e-02f, +1.988676168e-02f, -4.971318470e-02f, +2.822012214e-02f, +1.761492824e-02f, -3.880881057e-02f, +1.962563448e-02f, +1.198994166e-02f, -2.298707685e-02f, +1.014523162e-02f, +5.878105981e-03f, -9.457184001e-03f, +3.457803721e-03f, +1.694941550e-03f, -2.003221815e-03f, +4.828075478e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.182030238e-05f, -9.962390851e-05f, +3.685978409e-04f, -2.557411293e-04f, -5.868569481e-04f, +1.334598274e-03f, -3.919028713e-04f, -2.205653655e-03f, +3.305286243e-03f, +4.044964937e-04f, -6.728274744e-03f, +6.879551499e-03f, +6.598818152e-03f, -2.776168626e-02f, -2.293004068e-02f, +2.530374954e-02f, +2.589090270e-02f, -7.985720658e-03f, -5.778882790e-03f, +6.828534886e-03f, -1.021660698e-03f, -2.992679084e-03f, +2.343580374e-03f, +1.449084482e-04f, -1.253856162e-03f, +6.560003737e-04f, +1.793916280e-04f, -3.525478016e-04f, +1.172741787e-04f, +3.788356071e-05f, +0.000000000e+00f, - +0.000000000e+00f, +5.182030238e-05f, +5.756011899e-05f, -4.966059787e-04f, +7.216873692e-04f, +5.766121231e-05f, -1.598282041e-03f, +2.092132763e-03f, -2.089533043e-05f, -3.248357673e-03f, +3.949013080e-03f, -1.821023717e-04f, -4.847547932e-03f, +5.535878828e-03f, -3.682807604e-04f, -5.603767603e-03f, +6.037635758e-03f, -4.906732555e-04f, -5.095103581e-03f, +5.178772370e-03f, -4.906980429e-04f, -3.599594689e-03f, +3.435919606e-03f, -3.795599826e-04f, -1.881502821e-03f, +1.666792427e-03f, -2.236393745e-04f, -6.325336388e-04f, +5.036100117e-04f, -9.311789802e-05f, -3.788356071e-05f, +0.000000000e+00f, - /* 11, 8 (32) */ - +0.000000000e+00f, -4.449239871e-04f, +1.492298580e-03f, -4.991345630e-04f, -3.822477153e-03f, +6.183980515e-03f, +1.231849024e-03f, -1.461185732e-02f, +1.441395766e-02f, +1.179169475e-02f, -4.055385161e-02f, +2.387824949e-02f, +5.110590343e-02f, -1.139595949e-01f, +3.032014646e-02f, +5.335397809e-01f, +5.335397809e-01f, +3.032014646e-02f, -1.139595949e-01f, +5.110590343e-02f, +2.387824949e-02f, -4.055385161e-02f, +1.179169475e-02f, +1.441395766e-02f, -1.461185732e-02f, +1.231849024e-03f, +6.183980515e-03f, -3.822477153e-03f, -4.991345630e-04f, +1.492298580e-03f, -4.449239871e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.449239871e-04f, -2.096339713e-03f, +2.198551562e-03f, +2.825270082e-03f, -9.680823376e-03f, +7.544898408e-03f, +8.263728803e-03f, -2.336663684e-02f, +1.542586126e-02f, +1.602603979e-02f, -3.929950861e-02f, +2.279370061e-02f, +2.312501856e-02f, -5.020385796e-02f, +2.592439744e-02f, +2.592439744e-02f, -5.020385796e-02f, +2.312501856e-02f, +2.279370061e-02f, -3.929950861e-02f, +1.602603979e-02f, +1.542586126e-02f, -2.336663684e-02f, +8.263728803e-03f, +7.544898408e-03f, -9.680823376e-03f, +2.825270082e-03f, +2.198551562e-03f, -2.096339713e-03f, +4.449239871e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.788356071e-05f, -1.172741787e-04f, +3.525478016e-04f, -1.793916280e-04f, -6.560003737e-04f, +1.253856162e-03f, -1.449084482e-04f, -2.343580374e-03f, +2.992679084e-03f, +1.021660698e-03f, -6.828534886e-03f, +5.778882790e-03f, +7.985720658e-03f, -2.589090270e-02f, -2.530374954e-02f, +2.293004068e-02f, +2.776168626e-02f, -6.598818152e-03f, -6.879551499e-03f, +6.728274744e-03f, -4.044964937e-04f, -3.305286243e-03f, +2.205653655e-03f, +3.919028713e-04f, -1.334598274e-03f, +5.868569481e-04f, +2.557411293e-04f, -3.685978409e-04f, +9.962390851e-05f, +5.182030238e-05f, +0.000000000e+00f, - +0.000000000e+00f, +3.788356071e-05f, +9.311789802e-05f, -5.036100117e-04f, +6.325336388e-04f, +2.236393745e-04f, -1.666792427e-03f, +1.881502821e-03f, +3.795599826e-04f, -3.435919606e-03f, +3.599594689e-03f, +4.906980429e-04f, -5.178772370e-03f, +5.095103581e-03f, +4.906732555e-04f, -6.037635758e-03f, +5.603767603e-03f, +3.682807604e-04f, -5.535878828e-03f, +4.847547932e-03f, +1.821023717e-04f, -3.949013080e-03f, +3.248357673e-03f, +2.089533043e-05f, -2.092132763e-03f, +1.598282041e-03f, -5.766121231e-05f, -7.216873692e-04f, +4.966059787e-04f, -5.756011899e-05f, -5.182030238e-05f, +0.000000000e+00f, - /* 11, 9 (32) */ - +0.000000000e+00f, -4.828075478e-04f, +1.375024401e-03f, -1.465867614e-04f, -4.001868780e-03f, +5.527980141e-03f, +2.485705186e-03f, -1.475676577e-02f, +1.207037729e-02f, +1.478437383e-02f, -3.953219091e-02f, +1.704971460e-02f, +5.688478622e-02f, -1.059738743e-01f, +4.429243765e-03f, +5.082360314e-01f, +5.564698216e-01f, +5.808183272e-02f, -1.205584131e-01f, +4.422635193e-02f, +3.060652423e-02f, -4.095834811e-02f, +8.486408502e-03f, +1.661961131e-02f, -1.421995445e-02f, -1.027492505e-04f, +6.770837463e-03f, -3.566736023e-03f, -8.677324040e-04f, +1.591922488e-03f, -3.931036847e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.828075478e-04f, -2.003221815e-03f, +1.694941550e-03f, +3.457803721e-03f, -9.457184001e-03f, +5.878105981e-03f, +1.014523162e-02f, -2.298707685e-02f, +1.198994166e-02f, +1.962563448e-02f, -3.880881057e-02f, +1.761492824e-02f, +2.822012214e-02f, -4.971318470e-02f, +1.988676168e-02f, +3.152816504e-02f, -4.983557720e-02f, +1.758913973e-02f, +2.764124854e-02f, -3.911740624e-02f, +1.207702671e-02f, +1.867421894e-02f, -2.334574151e-02f, +6.171596040e-03f, +9.143180449e-03f, -9.738484588e-03f, +2.103582713e-03f, +2.695157541e-03f, -2.153899832e-03f, +3.931036847e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.451436211e-05f, -1.314524813e-04f, +3.314983423e-04f, -1.043370223e-04f, -7.109998284e-04f, +1.156610267e-03f, +9.398088869e-05f, -2.438947738e-03f, +2.645155693e-03f, +1.599177980e-03f, -6.819756489e-03f, +4.640229032e-03f, +9.181322639e-03f, -2.385991397e-02f, -2.743848295e-02f, +2.033841886e-02f, +2.944763799e-02f, -5.029390160e-03f, -7.923766014e-03f, +6.516088221e-03f, +2.439382415e-04f, -3.576487267e-03f, +2.025710559e-03f, +6.432069161e-04f, -1.396688521e-03f, +5.040489558e-04f, +3.320911204e-04f, -3.790210013e-04f, +7.859020218e-05f, +6.605790481e-05f, +0.000000000e+00f, - +0.000000000e+00f, +2.451436211e-05f, +1.239441717e-04f, -5.006145340e-04f, +5.365666914e-04f, +3.781666435e-04f, -1.703264485e-03f, +1.644804275e-03f, +7.623281066e-04f, -3.559527997e-03f, +3.194603884e-03f, +1.144634675e-03f, -5.416633899e-03f, +4.570039469e-03f, +1.336804441e-03f, -6.366289365e-03f, +5.072121008e-03f, +1.225024426e-03f, -5.883896733e-03f, +4.427723534e-03f, +8.620962011e-04f, -4.235542723e-03f, +2.998727403e-03f, +4.322498801e-04f, -2.271960141e-03f, +1.497775478e-03f, +1.171141105e-04f, -8.018998884e-04f, +4.791062706e-04f, -1.771118770e-05f, -6.605790481e-05f, +0.000000000e+00f, - /* 11,10 (32) */ - +0.000000000e+00f, -5.073219099e-04f, +1.243571920e-03f, +1.849115809e-04f, -4.106205803e-03f, +4.816980313e-03f, +3.642315453e-03f, -1.466278488e-02f, +9.631429549e-03f, +1.742952952e-02f, -3.793301293e-02f, +1.022995811e-02f, +6.152501525e-02f, -9.679255163e-02f, -1.943067021e-02f, +4.807975485e-01f, +5.768082405e-01f, +8.752947072e-02f, -1.255878032e-01f, +3.630258591e-02f, +3.712261245e-02f, -4.071440986e-02f, +4.909921236e-03f, +1.864532187e-02f, -1.357674753e-02f, -1.499437772e-03f, +7.274886419e-03f, -3.234644903e-03f, -1.246753405e-03f, +1.670512690e-03f, -3.270457799e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.073219099e-04f, -1.879277644e-03f, +1.194327016e-03f, +3.994370412e-03f, -9.079017358e-03f, +4.174841496e-03f, +1.179003590e-02f, -2.222474875e-02f, +8.430413660e-03f, +2.282023837e-02f, -3.766417590e-02f, +1.219829434e-02f, +3.279016161e-02f, -4.837638026e-02f, +1.352047232e-02f, +3.660028605e-02f, -4.861055277e-02f, +1.170524299e-02f, +3.206897208e-02f, -3.825531004e-02f, +7.841483992e-03f, +2.167294634e-02f, -2.291349163e-02f, +3.899635899e-03f, +1.064095593e-02f, -9.621370478e-03f, +1.301682824e-03f, +3.174263811e-03f, -2.171611020e-03f, +3.270457799e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.194746278e-05f, -1.421424992e-04f, +3.061298911e-04f, -3.178135117e-05f, -7.516367599e-04f, +1.045187034e-03f, +3.212560480e-04f, -2.491914723e-03f, +2.269513888e-03f, +2.129593340e-03f, -6.706350839e-03f, +3.481859008e-03f, +1.017950378e-02f, -2.169464718e-02f, -2.931594908e-02f, +1.755248302e-02f, +3.092575692e-02f, -3.288822149e-03f, -8.893112110e-03f, +6.190710991e-03f, +9.144453014e-04f, -3.800217875e-03f, +1.805014389e-03f, +8.947915600e-04f, -1.438202486e-03f, +4.083206773e-04f, +4.070759198e-04f, -3.832580123e-04f, +5.433670509e-05f, +8.030149258e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.194746278e-05f, +1.497297397e-04f, -4.882881120e-04f, +4.359409679e-04f, +5.189155386e-04f, -1.708245537e-03f, +1.387095215e-03f, +1.121120444e-03f, -3.618482286e-03f, +2.742208475e-03f, +1.768547346e-03f, -5.558077690e-03f, +3.970576614e-03f, +2.155380859e-03f, -6.584168342e-03f, +4.451877688e-03f, +2.064492216e-03f, -6.132274715e-03f, +3.925703444e-03f, +1.537307931e-03f, -4.452868841e-03f, +2.690090414e-03f, +8.473300397e-04f, -2.416675152e-03f, +1.365925069e-03f, +2.977454210e-04f, -8.711146184e-04f, +4.508075312e-04f, +2.585919819e-05f, -8.030149258e-05f, +0.000000000e+00f, - /* 11,11 (32) */ - +0.000000000e+00f, -5.192693727e-04f, +1.101429420e-03f, +4.910414720e-04f, -4.137987154e-03f, +4.065343553e-03f, +4.687502487e-03f, -1.434152883e-02f, +7.139514826e-03f, +1.969904341e-02f, -3.580341959e-02f, +3.523607271e-03f, +6.500687426e-02f, -8.661304785e-02f, -4.112531739e-02f, +4.514815994e-01f, +5.943607235e-01f, +1.184552276e-01f, -1.288766254e-01f, +2.740947380e-02f, +4.331332344e-02f, -3.979996456e-02f, +1.109703361e-03f, +2.045033626e-02f, -1.268195597e-02f, -2.937640258e-03f, +7.683207096e-03f, -2.827568983e-03f, -1.630011418e-03f, +1.724849395e-03f, -2.467442873e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.192693727e-04f, -1.729547904e-03f, +7.060389043e-04f, +4.430311380e-03f, -8.560101819e-03f, +2.466595959e-03f, +1.317713111e-02f, -2.110362830e-02f, +4.811931374e-03f, +2.556244684e-02f, -3.589562855e-02f, +6.640216652e-03f, +3.676073822e-02f, -4.622099940e-02f, +6.936303974e-03f, +4.105216374e-02f, -4.654606055e-02f, +5.572968280e-03f, +3.599467552e-02f, -3.671800211e-02f, +3.388615151e-03f, +2.436303675e-02f, -2.206616159e-02f, +1.482960747e-03f, +1.200688100e-02f, -9.323625057e-03f, +4.305682060e-04f, +3.625071342e-03f, -2.145751822e-03f, +2.467442873e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.828556293e-07f, -1.493959888e-04f, +2.771604496e-04f, +3.717827743e-05f, -7.779451282e-04f, +9.220448299e-04f, +5.337403646e-04f, -2.503313221e-03f, +1.872740937e-03f, +2.606455251e-03f, -6.494133407e-03f, +2.321595832e-03f, +1.097680665e-02f, -1.942199261e-02f, -3.092082508e-02f, +1.459810151e-02f, +3.217497647e-02f, -1.391029546e-03f, -9.769492281e-03f, +5.752581056e-03f, +1.597120740e-03f, -3.970954405e-03f, +1.545555763e-03f, +1.142453153e-03f, -1.457482743e-03f, +3.006807112e-04f, +4.792799535e-04f, -3.808325289e-04f, +2.710370466e-05f, +9.423259651e-05f, +0.000000000e+00f, - +0.000000000e+00f, +3.828556293e-07f, +1.702953811e-04f, -4.674487560e-04f, +3.327938628e-04f, +6.439158093e-04f, -1.682841202e-03f, +1.113654754e-03f, +1.450249299e-03f, -3.613252870e-03f, +2.251264847e-03f, +2.351978856e-03f, -5.601792117e-03f, +3.307838086e-03f, +2.932233975e-03f, -6.687684854e-03f, +3.753802700e-03f, +2.871856988e-03f, -6.275852711e-03f, +3.349435626e-03f, +2.195670544e-03f, -4.595812404e-03f, +2.326654291e-03f, +1.258700448e-03f, -2.522487056e-03f, +1.204002802e-03f, +4.810502642e-04f, -9.273919632e-04f, +4.116164933e-04f, +7.245690575e-05f, -9.423259651e-05f, +0.000000000e+00f, - /* 11,12 (32) */ - +0.000000000e+00f, -5.196522283e-04f, +9.520334316e-04f, +7.682019216e-04f, -4.100808877e-03f, +3.287398424e-03f, +5.609547317e-03f, -1.380778847e-02f, +4.636201605e-03f, +2.157178435e-02f, -3.319696434e-02f, -2.970526136e-03f, +6.732847009e-02f, -7.563624121e-02f, -6.054731000e-02f, +4.205607743e-01f, +6.089588250e-01f, +1.506302041e-01f, -1.302676549e-01f, +1.763998152e-02f, +4.906590450e-02f, -3.820284382e-02f, -2.861251044e-03f, +2.199589203e-02f, -1.153950282e-02f, -4.395123001e-03f, +7.983887807e-03f, -2.348289030e-03f, -2.010843946e-03f, +1.751953100e-03f, -1.525116908e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.196522283e-04f, -1.559252523e-03f, +2.385901483e-04f, +4.763105243e-03f, -7.916186010e-03f, +7.837547575e-04f, +1.429078587e-02f, -1.965337901e-02f, +1.198678504e-03f, +2.781371169e-02f, -3.354364969e-02f, +1.038424535e-03f, +4.006857631e-02f, -4.328876543e-02f, +2.486191205e-04f, +4.480596644e-02f, -4.367420357e-02f, -7.028844317e-04f, +3.934411115e-02f, -3.452233157e-02f, -1.207197253e-03f, +2.668969105e-02f, -2.080746114e-02f, -1.039526309e-03f, +1.321088380e-02f, -8.842574792e-03f, -4.968237572e-04f, +4.036687836e-03f, -2.073294916e-03f, +1.525116908e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.001616161e-05f, -1.533275451e-04f, +2.453303176e-04f, +1.015655426e-04f, -7.901990787e-04f, +7.897272177e-04f, +7.286283776e-04f, -2.474609177e-03f, +1.461896240e-03f, +3.024379522e-03f, -6.190187725e-03f, +1.176584853e-03f, +1.157240936e-02f, -1.706945906e-02f, -3.224091711e-02f, +1.150311548e-02f, +3.317645239e-02f, +6.476584866e-04f, -1.053539043e-02f, +5.203894462e-03f, +2.281486140e-03f, -4.083824124e-03f, +1.250047714e-03f, +1.381877687e-03f, -1.453179366e-03f, +1.823966401e-04f, +5.472611389e-04f, -3.713650726e-04f, -2.791820816e-06f, +1.075145692e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.001616161e-05f, +1.855878775e-04f, -4.390390155e-04f, +2.292045253e-04f, +7.515772681e-04f, -1.628674706e-03f, +8.298788745e-04f, +1.744715690e-03f, -3.545446236e-03f, +1.731145461e-03f, +2.885352155e-03f, -5.548211855e-03f, +2.593970440e-03f, +3.654009310e-03f, -6.675283650e-03f, +2.990053264e-03f, +3.632797577e-03f, -6.311299411e-03f, +2.708284773e-03f, +2.825243912e-03f, -4.660445649e-03f, +1.913720021e-03f, +1.658796092e-03f, -2.586211951e-03f, +1.013897991e-03f, +6.636577527e-04f, -9.689545383e-04f, +3.616636038e-04f, +1.212714302e-04f, -1.075145692e-04f, +0.000000000e+00f, - /* 11,13 (32) */ - +0.000000000e+00f, -5.096360667e-04f, +7.987058865e-04f, +1.013532239e-03f, -3.999243334e-03f, +2.497199346e-03f, +6.399274535e-03f, -1.307916009e-02f, +2.161592427e-03f, +2.303368059e-02f, -3.017258482e-02f, -9.160713861e-03f, +6.850505494e-02f, -6.406383185e-02f, -7.761676906e-02f, +3.883198572e-01f, +6.204619405e-01f, +1.838066565e-01f, -1.296199964e-01f, +7.104591091e-03f, +5.426979896e-02f, -3.592135768e-02f, -6.945075168e-03f, +2.324593974e-02f, -1.015762513e-02f, -5.848302367e-03f, +8.166284447e-03f, -1.801027891e-03f, -2.382209019e-03f, +1.749161279e-03f, -4.499712153e-05f, +0.000000000e+00f, - +0.000000000e+00f, +5.096360667e-04f, -1.373664645e-03f, -2.004488672e-04f, +4.992309768e-03f, -7.164608742e-03f, -8.449199480e-04f, +1.512066474e-02f, -1.790866331e-02f, -2.346767732e-03f, +2.954485715e-02f, -3.065829754e-02f, -4.509787320e-03f, +4.266254675e-02f, -3.963475612e-02f, -6.426664530e-03f, +4.779601970e-02f, -4.004140599e-02f, -7.014183843e-03f, +4.205239592e-02f, -3.169708765e-02f, -5.867642902e-03f, +2.860341107e-02f, -1.914866505e-02f, -3.625738261e-03f, +1.422478179e-02f, -8.178917040e-03f, -1.465778295e-03f, +4.398351440e-03f, -1.952023486e-03f, +4.499712153e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.912402271e-05f, -1.541084338e-04f, +2.113872174e-04f, +1.605359360e-04f, -7.888970184e-04f, +6.508167323e-04f, +9.035169628e-04f, -2.407854881e-03f, +1.043996991e-03f, +3.379094539e-03f, -5.802714914e-03f, +6.307772297e-05f, +1.196806374e-02f, -1.466482656e-02f, -3.326728023e-02f, +8.297016562e-03f, +3.391382572e-02f, +2.808650060e-03f, -1.117413572e-02f, +4.548636410e-03f, +2.956633492e-03f, -4.134708898e-03f, +9.219085338e-04f, +1.608709499e-03f, -1.424286778e-03f, +5.498480556e-05f, +6.095759291e-04f, -3.545858643e-04f, -3.495771602e-05f, +1.197987467e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.912402271e-05f, +1.956734673e-04f, -4.040997418e-04f, +1.271556887e-04f, +8.407043378e-04f, -1.547837769e-03f, +5.411772459e-04f, +2.000282133e-03f, -3.417750004e-03f, +1.191560114e-03f, +3.360128864e-03f, -5.399489258e-03f, +1.841917467e-03f, +4.308401061e-03f, -6.547465475e-03f, +2.173962125e-03f, +4.333758325e-03f, -6.237185937e-03f, +2.012878036e-03f, +3.414433922e-03f, -4.644186430e-03f, +1.457607839e-03f, +2.040060195e-03f, -2.605351521e-03f, +7.981028032e-04f, +8.420672912e-04f, -9.942311033e-04f, +3.013125153e-04f, +1.713870949e-04f, -1.197987467e-04f, +0.000000000e+00f, - /* 11,14 (32) */ - +0.000000000e+00f, -4.905120440e-04f, +6.445974527e-04f, +1.224919457e-03f, -3.838707398e-03f, +1.708302327e-03f, +7.050091267e-03f, -1.217564313e-02f, -2.462624541e-04f, +2.407767758e-02f, -2.679349028e-02f, -1.496342877e-02f, +6.856813267e-02f, -5.209576810e-02f, -9.228159561e-02f, +3.550525770e-01f, +6.287589571e-01f, +2.177204822e-01f, -1.268113464e-01f, -4.069544625e-03f, +5.881843537e-02f, -3.296472419e-02f, -1.107978407e-02f, +2.416784827e-02f, -8.548915631e-03f, -7.272589145e-03f, +8.221269253e-03f, -1.191451962e-03f, -2.736794883e-03f, +1.714203563e-03f, +7.480162519e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.905120440e-04f, -1.177991178e-03f, -6.045486089e-04f, +5.119465457e-03f, -6.323904404e-03f, -2.392757717e-03f, +1.566184199e-02f, -1.590838118e-02f, -5.764517736e-03f, +3.073641726e-02f, -2.729816867e-02f, -9.909276578e-03f, +4.450446421e-02f, -3.532635506e-02f, -1.297413000e-02f, +4.996998183e-02f, -3.570764766e-02f, -1.325136978e-02f, +4.406527396e-02f, -2.828265373e-02f, -1.051182933e-02f, +3.006101891e-02f, -1.710860485e-02f, -6.231089781e-03f, +1.502288459e-02f, -7.336849749e-03f, -2.460009399e-03f, +4.699663955e-03f, -1.780636391e-03f, -7.480162519e-05f, +0.000000000e+00f, - +0.000000000e+00f, +2.685306184e-05f, -1.519596632e-04f, +1.760720761e-04f, +2.133848905e-04f, -7.747425269e-04f, +5.078899367e-04f, +1.056428589e-03f, -2.305633509e-03f, +6.259085202e-04f, +3.667467789e-03f, -5.340871520e-03f, -1.003764677e-03f, +1.216800061e-02f, -1.223580090e-02f, -3.399429673e-02f, +5.010603072e-03f, +3.437345706e-02f, +5.071274913e-03f, -1.167016172e-02f, +3.792586585e-03f, +3.611381843e-03f, -4.120340294e-03f, +5.652322161e-04f, +1.818623406e-03f, -1.370176154e-03f, -7.980483913e-05f, +6.648056295e-04f, -3.303462436e-04f, -6.892978118e-05f, +1.307312654e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.685306184e-05f, +2.007290083e-04f, -3.637431385e-04f, +2.849917238e-05f, +9.105023451e-04f, -1.442834315e-03f, +2.528729306e-04f, +2.213529401e-03f, -3.233859346e-03f, +6.423743823e-04f, +3.768946506e-03f, -5.159434945e-03f, +1.065181453e-03f, +4.884366485e-03f, -6.306773198e-03f, +1.319799421e-03f, +4.962195739e-03f, -6.054025378e-03f, +1.274926019e-03f, +3.952208277e-03f, -4.545869262e-03f, +9.655624416e-04f, +2.395085426e-03f, -2.578160955e-03f, +5.596855127e-04f, +1.012712208e-03f, -1.001898222e-03f, +2.311650394e-04f, +2.217972983e-04f, -1.307312654e-04f, +0.000000000e+00f, - /* 11,15 (32) */ - +0.000000000e+00f, -4.636589821e-04f, +4.926377895e-04f, +1.400991533e-03f, -3.625322507e-03f, +9.335598005e-04f, +7.557981204e-03f, -1.111921454e-02f, -2.551895963e-03f, +2.470358610e-02f, -2.312602249e-02f, -2.030430029e-02f, +6.756436799e-02f, -3.992776749e-02f, -1.045173965e-01f, +3.210582802e-01f, +6.337695601e-01f, +2.520939393e-01f, -1.217400715e-01f, -1.573970634e-02f, +6.261102195e-02f, -2.935334235e-02f, -1.520012436e-02f, +2.473308049e-02f, -6.730292225e-03f, -8.642765300e-03f, +8.141464414e-03f, -5.266463322e-04f, -3.067141127e-03f, +1.645273782e-03f, +2.055328905e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.636589821e-04f, -9.772621697e-04f, -9.682917474e-04f, +5.147964629e-03f, -5.413402059e-03f, -3.835592032e-03f, +1.591471492e-02f, -1.369485178e-02f, -8.998377082e-03f, +3.137879165e-02f, -2.352922217e-02f, -1.506871152e-02f, +4.556964567e-02f, -3.044198857e-02f, -1.928090320e-02f, +5.128978125e-02f, -3.074545192e-02f, -1.930539516e-02f, +4.534019998e-02f, -2.433044545e-02f, -1.505769859e-02f, +3.102658135e-02f, -1.471351943e-02f, -8.809250736e-03f, +1.558257011e-02f, -6.324137540e-03f, -3.461907621e-03f, +4.930828994e-03f, -1.558839093e-03f, -2.055328905e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.315285962e-05f, -1.471444736e-04f, +1.401057002e-04f, +2.595530007e-04f, -7.486225761e-04f, +3.634744702e-04f, +1.185826608e-03f, -2.170997092e-03f, +2.142409335e-04f, +3.887513846e-03f, -4.814598421e-03f, -2.010048142e-03f, +1.217880404e-02f, -9.809674830e-03f, -3.441971216e-02f, +1.675619045e-03f, +3.454462879e-02f, +7.413000132e-03f, -1.200925710e-02f, +2.943297891e-03f, +4.234443633e-03f, -4.038384288e-03f, +1.847465416e-04f, +2.007399170e-03f, -1.290622629e-03f, -2.200087399e-04f, +7.115835566e-04f, -2.986283797e-04f, -1.041765491e-04f, +1.399604254e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.315285962e-05f, +2.010311674e-04f, -3.191257033e-04f, -6.507439985e-05f, +9.605757532e-04f, -1.316518315e-03f, -2.989319289e-05f, +2.381896629e-03f, -2.998386549e-03f, +9.342864861e-05f, +4.105732234e-03f, -4.833429021e-03f, +2.775764127e-04f, +5.372316216e-03f, -5.957741012e-03f, +4.425173936e-04f, +5.506807710e-03f, -5.764277198e-03f, +5.070221017e-04f, +4.428304910e-03f, -4.365791338e-03f, +4.456389479e-04f, +2.716755794e-03f, -2.503704416e-03f, +3.022516193e-04f, +1.172027193e-03f, -9.909186848e-04f, +1.520612352e-04f, +2.714216420e-04f, -1.399604254e-04f, +0.000000000e+00f, - /* 12, 0 (28) */ - +2.536797823e-04f, +1.717120723e-03f, -4.267889081e-03f, +2.769345327e-03f, +5.951433797e-03f, -1.603584821e-02f, +1.292106340e-02f, +1.223371165e-02f, -4.454238865e-02f, +4.565217930e-02f, +1.809825863e-02f, -1.393967437e-01f, +2.613999239e-01f, +6.871774778e-01f, +2.613999239e-01f, -1.393967437e-01f, +1.809825863e-02f, +4.565217930e-02f, -4.454238865e-02f, +1.223371165e-02f, +1.292106340e-02f, -1.603584821e-02f, +5.951433797e-03f, +2.769345327e-03f, -4.267889081e-03f, +1.717120723e-03f, +2.536797823e-04f, -4.307376863e-04f, - -2.536797823e-04f, -1.150482282e-03f, +5.406716708e-03f, -7.717177369e-03f, +1.823839110e-03f, +1.228216497e-02f, -2.346784071e-02f, +1.698003719e-02f, +9.330273566e-03f, -3.702545451e-02f, +4.007418410e-02f, -9.979930894e-03f, -3.212484989e-02f, +5.173229864e-02f, -3.212484989e-02f, -9.979930894e-03f, +4.007418410e-02f, -3.702545451e-02f, +9.330273566e-03f, +1.698003719e-02f, -2.346784071e-02f, +1.228216497e-02f, +1.823839110e-03f, -7.717177369e-03f, +5.406716708e-03f, -1.150482282e-03f, -7.255512597e-04f, +4.307376863e-04f, - -1.672450930e-04f, +1.465671445e-04f, +2.793351282e-04f, -9.520184531e-04f, +9.883710096e-04f, +4.963052456e-04f, -2.901502336e-03f, +3.592745340e-03f, +1.313477054e-04f, -7.371602801e-03f, +1.150223500e-02f, -1.648722934e-03f, -4.005143650e-02f, -2.118136438e-03f, +4.037745317e-02f, +4.437358614e-03f, -1.245638046e-02f, +6.843477163e-03f, +7.088661868e-04f, -3.980942495e-03f, +2.784145616e-03f, -2.108995370e-04f, -1.155933415e-03f, +9.530438450e-04f, -2.119531771e-04f, -1.944786008e-04f, +1.790200031e-04f, -5.388669386e-05f, - +1.672450930e-04f, -3.563316182e-04f, +3.507095578e-05f, +9.171349744e-04f, -1.851701628e-03f, +1.487106137e-03f, +7.898709170e-04f, -3.683687954e-03f, +4.506693883e-03f, -1.602136959e-03f, -3.509133136e-03f, +6.798018892e-03f, -5.159910641e-03f, -5.150350710e-04f, +5.820531774e-03f, -6.650473100e-03f, +2.745747260e-03f, +2.373496510e-03f, -4.787026885e-03f, +3.430508774e-03f, -3.325370984e-04f, -1.796023473e-03f, +1.894732968e-03f, -8.005610926e-04f, -1.566113751e-04f, +4.126503215e-04f, -2.384888080e-04f, +5.388669386e-05f, - /* 12, 1 (28) */ - +8.643468934e-05f, +1.863687867e-03f, -3.988553953e-03f, +1.817326873e-03f, +6.939804807e-03f, -1.553954296e-02f, +1.001956106e-02f, +1.582645699e-02f, -4.441104094e-02f, +3.828057650e-02f, +2.960049363e-02f, -1.410454666e-01f, +2.213484874e-01f, +6.850593414e-01f, +3.017773770e-01f, -1.349593851e-01f, +5.641878176e-03f, +5.249565646e-02f, -4.383352246e-02f, +8.252769153e-03f, +1.570520902e-02f, -1.624674774e-02f, +4.795500382e-03f, +3.722389172e-03f, -4.479842259e-03f, +1.522642122e-03f, +4.326997854e-04f, -4.846243802e-04f, - -8.643468934e-05f, -1.506813900e-03f, +5.441787664e-03f, -6.800042395e-03f, -2.786251825e-05f, +1.376927111e-02f, -2.267796980e-02f, +1.329634923e-02f, +1.383696745e-02f, -3.862759146e-02f, +3.656505097e-02f, -3.181912001e-03f, -3.728476053e-02f, +5.121726357e-02f, -2.630431811e-02f, -1.663040399e-02f, +4.281993136e-02f, -3.465195799e-02f, +4.543246681e-03f, +2.041054596e-02f, -2.380037781e-02f, +1.048614150e-02f, +3.718572078e-03f, -8.517738462e-03f, +5.250105333e-03f, -7.378319605e-04f, -9.640400678e-04f, +4.846243802e-04f, - -1.528675171e-04f, +9.918120421e-05f, +3.370925927e-04f, -9.329073693e-04f, +8.104906417e-04f, +7.595375484e-04f, -2.960317642e-03f, +3.154777852e-03f, +9.344874199e-04f, -7.744794862e-03f, +1.039523570e-02f, +9.827504653e-04f, -3.933565280e-02f, -6.330402493e-03f, +4.030106993e-02f, +7.351434413e-03f, -1.323318207e-02f, +6.163199623e-03f, +1.571925014e-03f, -4.309842171e-03f, +2.607950826e-03f, +9.210410746e-05f, -1.309301519e-03f, +9.349443780e-04f, -1.357598181e-04f, -2.418840628e-04f, +1.876710624e-04f, -4.876934512e-05f, - +1.528675171e-04f, -2.960898091e-04f, -7.999774610e-05f, +1.008798007e-03f, -1.772390996e-03f, +1.158733635e-03f, +1.217757814e-03f, -3.856401374e-03f, +4.141252984e-03f, -8.106068270e-04f, -4.193209028e-03f, +6.807829665e-03f, -4.398061769e-03f, -1.534608595e-03f, +6.366053508e-03f, -6.367178107e-03f, +1.917844561e-03f, +3.108430015e-03f, -4.974732374e-03f, +3.100196905e-03f, +1.454339456e-04f, -2.078167116e-03f, +1.899015724e-03f, -6.604422352e-04f, -2.821751720e-04f, +4.633554639e-04f, -2.399358804e-04f, +4.876934512e-05f, - /* 12, 2 (28) */ - -6.643282774e-05f, +1.962869071e-03f, -3.651461360e-03f, +8.844195042e-04f, +7.750295448e-03f, -1.478000541e-02f, +7.059243422e-03f, +1.898123484e-02f, -4.347655352e-02f, +3.053578164e-02f, +3.999572933e-02f, -1.400627162e-01f, +1.820128346e-01f, +6.787289389e-01f, +3.420784470e-01f, -1.276079507e-01f, -7.591303891e-03f, +5.865885609e-02f, -4.226159745e-02f, +3.942926982e-03f, +1.831315984e-02f, -1.615464364e-02f, +3.486198863e-03f, +4.657333550e-03f, -4.615602077e-03f, +1.280758059e-03f, +6.203708478e-04f, -5.333937253e-04f, - +6.643282774e-05f, -1.802903709e-03f, +5.361789918e-03f, -5.791244388e-03f, -1.800253514e-03f, +1.492800474e-02f, -2.146021198e-02f, +9.439947860e-03f, +1.797822043e-02f, -3.943819829e-02f, +3.237184194e-02f, +3.625917663e-03f, -4.168282230e-02f, +4.968265498e-02f, -1.993826460e-02f, -2.299758210e-02f, +4.473777593e-02f, -3.154352798e-02f, -4.314856932e-04f, +2.351074287e-02f, -2.365494387e-02f, +8.407974380e-03f, +5.617587802e-03f, -9.178180697e-03f, +4.967930161e-03f, -2.744764966e-04f, -1.203975948e-03f, +5.333937253e-04f, - -1.364293789e-04f, +5.327334902e-05f, +3.846551742e-04f, -8.970520968e-04f, +6.261839747e-04f, +9.966420220e-04f, -2.961968729e-03f, +2.677101059e-03f, +1.687552938e-03f, -7.963070332e-03f, +9.161257681e-03f, +3.428535877e-03f, -3.824758405e-02f, -1.047097869e-02f, +3.981474570e-02f, +1.035642549e-02f, -1.380998121e-02f, +5.336411535e-03f, +2.442586050e-03f, -4.570654653e-03f, +2.373753014e-03f, +4.075727485e-04f, -1.444694209e-03f, +8.970210369e-04f, -5.180731948e-05f, -2.876916247e-04f, +1.927125243e-04f, -4.156503346e-05f, - +1.364293789e-04f, -2.336012648e-04f, -1.864253916e-04f, +1.074791326e-03f, -1.659948055e-03f, +8.183882287e-04f, +1.608253408e-03f, -3.947064486e-03f, +3.699837061e-03f, -1.533015969e-05f, -4.784980729e-03f, +6.680767782e-03f, -3.550887706e-03f, -2.522911013e-03f, +6.784932201e-03f, -5.952947159e-03f, +1.041725762e-03f, +3.791197237e-03f, -5.064095315e-03f, +2.697803545e-03f, +6.345344592e-04f, -2.326549693e-03f, +1.862840948e-03f, -4.987477213e-04f, -4.090791664e-04f, +5.067850506e-04f, -2.349977934e-04f, +4.156503346e-05f, - /* 12, 3 (28) */ - -2.028622066e-04f, +2.016142420e-03f, -3.266806186e-03f, -1.263259257e-05f, +8.376479423e-03f, -1.378336339e-02f, +4.097274693e-03f, +2.165833590e-02f, -4.178900058e-02f, +2.257271131e-02f, +4.915698701e-02f, -1.366341803e-01f, +1.437652505e-01f, +6.682579602e-01f, +3.818931927e-01f, -1.172515252e-01f, -2.140128510e-02f, +6.399526762e-02f, -3.981901140e-02f, -6.277276711e-04f, +2.068691286e-02f, -1.574707089e-02f, +2.041504654e-03f, +5.554354587e-03f, -4.667409396e-03f, +9.930664343e-04f, +8.130833721e-04f, -5.749587588e-04f, - +2.028622066e-04f, -2.036504974e-03f, +5.175364526e-03f, -4.716453062e-03f, -3.460201569e-03f, +1.574639297e-02f, -1.985195857e-02f, +5.492883374e-03f, +2.167805749e-02f, -3.945352845e-02f, +2.758686121e-02f, +1.030668545e-02f, -4.523371000e-02f, +4.715974396e-02f, -1.315333240e-02f, -2.895052926e-02f, +4.577950169e-02f, -2.775233074e-02f, -5.495581009e-03f, +2.620854641e-02f, -2.302040941e-02f, +6.081424687e-03f, +7.480428750e-03f, -9.676928418e-03f, +4.558850994e-03f, +2.323085540e-04f, -1.438973742e-03f, +5.749587588e-04f, - -1.184796094e-04f, +9.701468837e-06f, +4.216933994e-04f, -8.460543928e-04f, +4.392813748e-04f, +1.204334264e-03f, -2.908843806e-03f, +2.170104102e-03f, +2.378959509e-03f, -8.029138375e-03f, +7.827105658e-03f, +5.663640924e-03f, -3.680924997e-02f, -1.449316874e-02f, +3.891620076e-02f, +1.341544975e-02f, -1.416637980e-02f, +4.371627002e-03f, +3.304835570e-03f, -4.755524983e-03f, +2.083549996e-03f, +7.298934870e-04f, -1.558507252e-03f, +8.389474878e-04f, +3.862181063e-05f, -3.307700679e-04f, +1.937086978e-04f, -3.226033240e-05f, - +1.184796094e-04f, -1.704884162e-04f, -2.823571302e-04f, +1.114952786e-03f, -1.518102927e-03f, +4.735502866e-04f, +1.954422772e-03f, -3.955833740e-03f, +3.192970307e-03f, +7.674455337e-04f, -5.273503314e-03f, +6.420504488e-03f, -2.635983122e-03f, -3.459819432e-03f, +7.068201233e-03f, -5.415340130e-03f, +1.348725363e-04f, +4.406913867e-03f, -5.051361226e-03f, +2.230029491e-03f, +1.124745888e-03f, -2.534680436e-03f, +1.785328442e-03f, -3.180323831e-04f, -5.344574970e-04f, +5.413498220e-04f, -2.232547969e-04f, +3.226033240e-05f, - /* 12, 4 (28) */ - -3.213418160e-04f, +2.025843889e-03f, -2.845112787e-03f, -8.586869854e-04f, +8.815760798e-03f, -1.257902913e-02f, +1.188430887e-03f, +2.382844000e-02f, -3.941004108e-02f, +1.454357293e-02f, +5.698409267e-02f, -1.309705394e-01f, +1.069560005e-01f, +6.537647915e-01f, +4.208093934e-01f, -1.038360754e-01f, -3.556766490e-02f, +6.836689462e-02f, -3.651417583e-02f, -5.383252654e-03f, +2.277046285e-02f, -1.501717740e-02f, +4.829974021e-04f, +6.393302074e-03f, -4.628787586e-03f, +6.622963664e-04f, +1.006792070e-03f, -6.072190912e-04f, - +3.213418160e-04f, -2.206993390e-03f, +4.893007396e-03f, -3.601500275e-03f, -4.978304495e-03f, +1.621994326e-02f, -1.789753580e-02f, +1.537049634e-03f, +2.487102780e-02f, -3.868608292e-02f, +2.231335790e-02f, +1.672718993e-02f, -4.786969313e-02f, +4.369992453e-02f, -6.085131171e-03f, -3.436586939e-02f, +4.591437422e-02f, -2.334541688e-02f, -1.054694224e-02f, +2.843857590e-02f, -2.189566352e-02f, +3.546744251e-03f, +9.265757193e-03f, -9.994960801e-03f, +4.024393497e-03f, +7.736583760e-04f, -1.662228538e-03f, +6.072190912e-04f, - -9.956061041e-05f, -3.078396433e-05f, +4.481120097e-04f, -7.817309753e-04f, +2.534799409e-04f, +1.380033903e-03f, -2.804256211e-03f, +1.644300113e-03f, +2.998691664e-03f, -7.948251601e-03f, +6.420056655e-03f, +7.666882257e-03f, -3.504683346e-02f, -1.835190421e-02f, +3.760850993e-02f, +1.648975863e-02f, -1.428464473e-02f, +3.280196285e-03f, +4.142154551e-03f, -4.857720099e-03f, +1.740511933e-03f, +1.053063922e-03f, -1.647395118e-03f, +7.607963719e-04f, +1.340293189e-04f, -3.699721402e-04f, +1.902883064e-04f, -2.089939228e-05f, - +9.956061041e-05f, -1.082834395e-04f, -3.662789776e-04f, +1.129693607e-03f, -1.351064978e-03f, +1.315380212e-04f, +2.250458932e-03f, -3.884562122e-03f, +2.632321013e-03f, +1.521985524e-03f, -5.650085530e-03f, +6.033421815e-03f, -1.672261772e-03f, -4.326281524e-03f, +7.209666429e-03f, -4.764524008e-03f, -7.844076779e-04f, +4.941878812e-03f, -4.934852764e-03f, +1.705119170e-03f, +1.605742504e-03f, -2.696724853e-03f, +1.666478813e-03f, -1.214040926e-04f, -6.553208742e-04f, +5.655782016e-04f, -2.044425160e-04f, +2.089939228e-05f, - /* 12, 5 (28) */ - -4.209024264e-04f, +1.995059925e-03f, -2.397000777e-03f, -1.640417961e-03f, +9.069240739e-03f, -1.119899522e-02f, -1.615825324e-03f, +2.547274011e-02f, -3.641134941e-02f, +6.595321331e-03f, +6.340414933e-02f, -1.233036571e-01f, +7.190916708e-02f, +6.354128872e-01f, +4.584179034e-01f, -8.734631679e-02f, -4.985230963e-02f, +7.164709091e-02f, -3.237202128e-02f, -1.024097275e-02f, +2.451097478e-02f, -1.396411348e-02f, -1.164397716e-03f, +7.154098446e-03f, -4.494758267e-03f, +2.923242262e-04f, +1.197080376e-03f, -6.281184835e-04f, - +4.209024264e-04f, -2.315276830e-03f, +4.526728418e-03f, -2.471806669e-03f, -6.329369473e-03f, +1.635148128e-02f, -1.564707687e-02f, -2.347512488e-03f, +2.750334881e-02f, -3.716409739e-02f, +1.666327237e-02f, +2.276061175e-02f, -4.954195490e-02f, +3.937364301e-02f, +1.124535258e-03f, -3.913039340e-02f, +4.512996655e-02f, -1.840353806e-02f, -1.548179500e-02f, +3.014369507e-02f, -2.028992102e-02f, +8.500193977e-04f, +1.093223601e-02f, -1.011636489e-02f, +3.369072623e-03f, +1.339236578e-03f, -1.866671054e-03f, +6.281184835e-04f, - -8.019590328e-05f, -6.754951886e-05f, +4.640386987e-04f, -7.060660982e-04f, +7.227741654e-05f, +1.521883592e-03f, -2.652344429e-03f, +1.110127461e-03f, +3.538423540e-03f, -7.728018921e-03f, +4.967408666e-03f, +9.421096864e-03f, -3.299024913e-02f, -2.200436071e-02f, +3.590011742e-02f, +1.953926632e-02f, -1.415008039e-02f, +2.076218682e-03f, +4.937803493e-03f, -4.871801814e-03f, +1.348968398e-03f, +1.370794279e-03f, -1.708351263e-03f, +6.630585029e-04f, +2.327212214e-04f, -4.041596167e-04f, +1.821582209e-04f, -7.587240552e-06f, - +8.019590328e-05f, -4.839619892e-05f, -4.370348828e-04f, +1.119963043e-03f, -1.163412236e-03f, -2.006440347e-04f, +2.491773835e-03f, -3.736719578e-03f, +2.030434812e-03f, +2.233388187e-03f, -5.908444404e-03f, +5.528458220e-03f, -6.795572423e-04f, -5.104711725e-03f, +7.206043552e-03f, -4.013077245e-03f, -1.697358098e-03f, +5.383880813e-03f, -4.715043669e-03f, +1.132718703e-03f, +2.067107283e-03f, -2.807654841e-03f, +1.507207368e-03f, +8.752309076e-05f, -7.686218053e-04f, +5.781607922e-04f, -1.784699863e-04f, +7.587240552e-06f, - /* 12, 6 (28) */ - -5.010983297e-04f, +1.927510406e-03f, -1.932962079e-03f, -2.346484059e-03f, +9.141518155e-03f, -9.677111632e-03f, -4.268169753e-03f, +2.658286758e-02f, -3.287292587e-02f, -1.132697590e-03f, +6.837155799e-02f, -1.138825602e-01f, +3.891891795e-02f, +6.134085265e-01f, +4.943180208e-01f, -6.780705047e-02f, -6.400239002e-02f, +7.372330959e-02f, -2.743421778e-02f, -1.511277457e-02f, +2.585994318e-02f, -1.259331920e-02f, -2.872748979e-03f, +7.817156949e-03f, -4.262037045e-03f, -1.118353905e-04f, +1.379238597e-03f, -6.357057240e-04f, - +5.010983297e-04f, -2.363673029e-03f, +4.089693535e-03f, -1.351843626e-03f, -7.492781709e-03f, +1.615083724e-02f, -1.315530303e-02f, -6.084232066e-03f, +2.953378363e-02f, -3.493070921e-02f, +1.075482796e-02f, +2.828906997e-02f, -5.022151214e-02f, +3.426893128e-02f, +8.330578811e-03f, -4.314347064e-02f, +4.343260845e-02f, -1.301965725e-02f, -2.019683867e-02f, +3.127641377e-02f, -1.822281373e-02f, -1.957635444e-03f, +1.243944337e-02f, -1.002884180e-02f, +2.600450818e-03f, +1.917397370e-03f, -2.045141041e-03f, +6.357057240e-04f, - -6.087901448e-05f, -1.000852694e-04f, +4.698087680e-04f, -6.211630663e-04f, -1.010869565e-04f, +1.628753225e-03f, -2.457960440e-03f, +5.777598635e-04f, +3.991604482e-03f, -7.378184422e-03f, +3.496042480e-03f, +1.091328689e-02f, -3.067266242e-02f, -2.541053987e-02f, +3.380477231e-02f, +2.252310953e-02f, -1.375136211e-02f, +7.764048675e-04f, +5.675121813e-03f, -4.793781863e-03f, +9.143723041e-04f, +1.676619631e-03f, -1.738785164e-03f, +5.466542178e-04f, +3.328331849e-04f, -4.322296692e-04f, +1.691161917e-04f, +7.508309613e-06f, - +6.087901448e-05f, +7.912975028e-06f, -4.938345194e-04f, +1.087202388e-03f, -9.599768576e-04f, -5.164447487e-04f, +2.675060557e-03f, -3.517280806e-03f, +1.400454491e-03f, +2.887882799e-03f, -6.044807332e-03f, +4.916901678e-03f, +3.217939208e-04f, -5.779356234e-03f, +7.057034781e-03f, -3.175741825e-03f, -2.585162361e-03f, +5.722477479e-03f, -4.394587711e-03f, +5.237003713e-04f, +2.498555560e-03f, -2.863385525e-03f, +1.309358438e-03f, +3.046896352e-04f, -8.713244713e-04f, +5.779932491e-04f, -1.454340762e-04f, -7.508309613e-06f, - /* 12, 7 (28) */ - -5.619773442e-04f, +1.827425137e-03f, -1.463153310e-03f, -2.967647125e-03f, +9.040431199e-03f, -8.048358407e-03f, -6.726130192e-03f, +2.716062744e-02f, -2.888132139e-02f, -8.510882012e-03f, +7.186760047e-02f, -1.029692733e-01f, +8.246255527e-03f, +5.879979867e-01f, +5.281227931e-01f, -4.528394094e-02f, -7.775375213e-02f, +7.449971446e-02f, -2.175909597e-02f, -1.990655643e-02f, +2.677431549e-02f, -1.091669957e-02f, -4.611534143e-03f, +8.363811167e-03f, -3.929203860e-03f, -5.440650596e-04f, +1.548354789e-03f, -6.281974144e-04f, - +5.619773442e-04f, -2.355760054e-03f, +3.595859016e-03f, -2.646412378e-04f, -8.452758567e-03f, +1.563439249e-02f, -1.048024248e-02f, -9.601512872e-03f, +3.093423812e-02f, -3.204282641e-02f, +4.710020632e-03f, +3.320597165e-02f, -4.989971822e-02f, +2.848957505e-02f, +1.538761359e-02f, -4.631921247e-02f, +4.084744609e-02f, -7.297179773e-03f, -2.459142638e-02f, +3.180011415e-02f, -1.572425817e-02f, -4.821020969e-03f, +1.374880181e-02f, -9.724152168e-03f, +1.729126347e-03f, +2.495390619e-03f, -2.190575117e-03f, +6.281974144e-04f, - -4.206378952e-05f, -1.280081378e-04f, +4.659462400e-04f, -5.291957358e-04f, -2.636837668e-04f, +1.700229892e-03f, -2.226548985e-03f, +5.692856926e-05f, +4.353509573e-03f, -6.910377116e-03f, +2.032003567e-03f, +1.213469698e-02f, -2.812996702e-02f, -2.853380828e-02f, +3.134138529e-02f, +2.540022944e-02f, -1.308082424e-02f, -6.001104200e-04f, +6.337836843e-03f, -4.621255387e-03f, +4.432405220e-04f, +1.964020391e-03f, -1.736594373e-03f, +4.129362652e-04f, +4.323609993e-04f, -4.531420109e-04f, +1.510622100e-04f, +2.415628070e-05f, - +4.206378952e-05f, +5.955524529e-05f, -5.362520523e-04f, +1.033289823e-03f, -7.457293554e-04f, -8.098916005e-04f, +2.798326164e-03f, -3.232583630e-03f, +7.558326327e-04f, +3.473098805e-03f, -6.057960081e-03f, +4.212135032e-03f, +1.311377751e-03f, -6.336619084e-03f, +6.765342374e-03f, -2.269128000e-03f, -3.429339408e-03f, +5.949240323e-03f, -3.978301224e-03f, -1.100433959e-04f, +2.890161670e-03f, -2.860895344e-03f, +1.075699082e-03f, +5.256642457e-04f, -9.604777611e-04f, +5.642163449e-04f, -1.056296913e-04f, -2.415628070e-05f, - /* 12, 8 (28) */ - -6.040411337e-04f, +1.699416999e-03f, -9.972070705e-04f, -3.496842861e-03f, +8.776747432e-03f, -6.348128516e-03f, -8.952679177e-03f, +2.721755601e-02f, -2.452781182e-02f, -1.542125913e-02f, +7.389960404e-02f, -9.083457637e-02f, -1.988371149e-02f, +5.594641784e-01f, +5.594641784e-01f, -1.988371149e-02f, -9.083457637e-02f, +7.389960404e-02f, -1.542125913e-02f, -2.452781182e-02f, +2.721755601e-02f, -8.952679177e-03f, -6.348128516e-03f, +8.776747432e-03f, -3.496842861e-03f, -9.972070705e-04f, +1.699416999e-03f, -6.040411337e-04f, - +6.040411337e-04f, -2.296204808e-03f, +3.059606964e-03f, +7.686485855e-04f, -9.198487922e-03f, +1.482450089e-02f, -7.681916313e-03f, -1.283409650e-02f, +3.169007075e-02f, -2.856972760e-02f, -1.347939449e-03f, +3.741810668e-02f, -4.858834047e-02f, +2.215295597e-02f, +2.215295597e-02f, -4.858834047e-02f, +3.741810668e-02f, -1.347939449e-03f, -2.856972760e-02f, +3.169007075e-02f, -1.283409650e-02f, -7.681916313e-03f, +1.482450089e-02f, -9.198487922e-03f, +7.686485855e-04f, +3.059606964e-03f, -2.296204808e-03f, +6.040411337e-04f, - -2.415628070e-05f, -1.510622100e-04f, +4.531420109e-04f, -4.323609993e-04f, -4.129362652e-04f, +1.736594373e-03f, -1.964020391e-03f, -4.432405220e-04f, +4.621255387e-03f, -6.337836843e-03f, +6.001104200e-04f, +1.308082424e-02f, -2.540022944e-02f, -3.134138529e-02f, +2.853380828e-02f, +2.812996702e-02f, -1.213469698e-02f, -2.032003567e-03f, +6.910377116e-03f, -4.353509573e-03f, -5.692856926e-05f, +2.226548985e-03f, -1.700229892e-03f, +2.636837668e-04f, +5.291957358e-04f, -4.659462400e-04f, +1.280081378e-04f, +4.206378952e-05f, - +2.415628070e-05f, +1.056296913e-04f, -5.642163449e-04f, +9.604777611e-04f, -5.256642457e-04f, -1.075699082e-03f, +2.860895344e-03f, -2.890161670e-03f, +1.100433959e-04f, +3.978301224e-03f, -5.949240323e-03f, +3.429339408e-03f, +2.269128000e-03f, -6.765342374e-03f, +6.336619084e-03f, -1.311377751e-03f, -4.212135032e-03f, +6.057960081e-03f, -3.473098805e-03f, -7.558326327e-04f, +3.232583630e-03f, -2.798326164e-03f, +8.098916005e-04f, +7.457293554e-04f, -1.033289823e-03f, +5.362520523e-04f, -5.955524529e-05f, -4.206378952e-05f, - /* 12, 9 (28) */ - -6.281974144e-04f, +1.548354789e-03f, -5.440650596e-04f, -3.929203860e-03f, +8.363811167e-03f, -4.611534143e-03f, -1.091669957e-02f, +2.677431549e-02f, -1.990655643e-02f, -2.175909597e-02f, +7.449971446e-02f, -7.775375213e-02f, -4.528394094e-02f, +5.281227931e-01f, +5.879979867e-01f, +8.246255527e-03f, -1.029692733e-01f, +7.186760047e-02f, -8.510882012e-03f, -2.888132139e-02f, +2.716062744e-02f, -6.726130192e-03f, -8.048358407e-03f, +9.040431199e-03f, -2.967647125e-03f, -1.463153310e-03f, +1.827425137e-03f, -5.619773442e-04f, - +6.281974144e-04f, -2.190575117e-03f, +2.495390619e-03f, +1.729126347e-03f, -9.724152168e-03f, +1.374880181e-02f, -4.821020969e-03f, -1.572425817e-02f, +3.180011415e-02f, -2.459142638e-02f, -7.297179773e-03f, +4.084744609e-02f, -4.631921247e-02f, +1.538761359e-02f, +2.848957505e-02f, -4.989971822e-02f, +3.320597165e-02f, +4.710020632e-03f, -3.204282641e-02f, +3.093423812e-02f, -9.601512872e-03f, -1.048024248e-02f, +1.563439249e-02f, -8.452758567e-03f, -2.646412378e-04f, +3.595859016e-03f, -2.355760054e-03f, +5.619773442e-04f, - -7.508309613e-06f, -1.691161917e-04f, +4.322296692e-04f, -3.328331849e-04f, -5.466542178e-04f, +1.738785164e-03f, -1.676619631e-03f, -9.143723041e-04f, +4.793781863e-03f, -5.675121813e-03f, -7.764048675e-04f, +1.375136211e-02f, -2.252310953e-02f, -3.380477231e-02f, +2.541053987e-02f, +3.067266242e-02f, -1.091328689e-02f, -3.496042480e-03f, +7.378184422e-03f, -3.991604482e-03f, -5.777598635e-04f, +2.457960440e-03f, -1.628753225e-03f, +1.010869565e-04f, +6.211630663e-04f, -4.698087680e-04f, +1.000852694e-04f, +6.087901448e-05f, - +7.508309613e-06f, +1.454340762e-04f, -5.779932491e-04f, +8.713244713e-04f, -3.046896352e-04f, -1.309358438e-03f, +2.863385525e-03f, -2.498555560e-03f, -5.237003713e-04f, +4.394587711e-03f, -5.722477479e-03f, +2.585162361e-03f, +3.175741825e-03f, -7.057034781e-03f, +5.779356234e-03f, -3.217939208e-04f, -4.916901678e-03f, +6.044807332e-03f, -2.887882799e-03f, -1.400454491e-03f, +3.517280806e-03f, -2.675060557e-03f, +5.164447487e-04f, +9.599768576e-04f, -1.087202388e-03f, +4.938345194e-04f, -7.912975028e-06f, -6.087901448e-05f, - /* 12,10 (28) */ - -6.357057240e-04f, +1.379238597e-03f, -1.118353905e-04f, -4.262037045e-03f, +7.817156949e-03f, -2.872748979e-03f, -1.259331920e-02f, +2.585994318e-02f, -1.511277457e-02f, -2.743421778e-02f, +7.372330959e-02f, -6.400239002e-02f, -6.780705047e-02f, +4.943180208e-01f, +6.134085265e-01f, +3.891891795e-02f, -1.138825602e-01f, +6.837155799e-02f, -1.132697590e-03f, -3.287292587e-02f, +2.658286758e-02f, -4.268169753e-03f, -9.677111632e-03f, +9.141518155e-03f, -2.346484059e-03f, -1.932962079e-03f, +1.927510406e-03f, -5.010983297e-04f, - +6.357057240e-04f, -2.045141041e-03f, +1.917397370e-03f, +2.600450818e-03f, -1.002884180e-02f, +1.243944337e-02f, -1.957635444e-03f, -1.822281373e-02f, +3.127641377e-02f, -2.019683867e-02f, -1.301965725e-02f, +4.343260845e-02f, -4.314347064e-02f, +8.330578811e-03f, +3.426893128e-02f, -5.022151214e-02f, +2.828906997e-02f, +1.075482796e-02f, -3.493070921e-02f, +2.953378363e-02f, -6.084232066e-03f, -1.315530303e-02f, +1.615083724e-02f, -7.492781709e-03f, -1.351843626e-03f, +4.089693535e-03f, -2.363673029e-03f, +5.010983297e-04f, - +7.587240552e-06f, -1.821582209e-04f, +4.041596167e-04f, -2.327212214e-04f, -6.630585029e-04f, +1.708351263e-03f, -1.370794279e-03f, -1.348968398e-03f, +4.871801814e-03f, -4.937803493e-03f, -2.076218682e-03f, +1.415008039e-02f, -1.953926632e-02f, -3.590011742e-02f, +2.200436071e-02f, +3.299024913e-02f, -9.421096864e-03f, -4.967408666e-03f, +7.728018921e-03f, -3.538423540e-03f, -1.110127461e-03f, +2.652344429e-03f, -1.521883592e-03f, -7.227741654e-05f, +7.060660982e-04f, -4.640386987e-04f, +6.754951886e-05f, +8.019590328e-05f, - -7.587240552e-06f, +1.784699863e-04f, -5.781607922e-04f, +7.686218053e-04f, -8.752309076e-05f, -1.507207368e-03f, +2.807654841e-03f, -2.067107283e-03f, -1.132718703e-03f, +4.715043669e-03f, -5.383880813e-03f, +1.697358098e-03f, +4.013077245e-03f, -7.206043552e-03f, +5.104711725e-03f, +6.795572423e-04f, -5.528458220e-03f, +5.908444404e-03f, -2.233388187e-03f, -2.030434812e-03f, +3.736719578e-03f, -2.491773835e-03f, +2.006440347e-04f, +1.163412236e-03f, -1.119963043e-03f, +4.370348828e-04f, +4.839619892e-05f, -8.019590328e-05f, - /* 12,11 (28) */ - -6.281184835e-04f, +1.197080376e-03f, +2.923242262e-04f, -4.494758267e-03f, +7.154098446e-03f, -1.164397716e-03f, -1.396411348e-02f, +2.451097478e-02f, -1.024097275e-02f, -3.237202128e-02f, +7.164709091e-02f, -4.985230963e-02f, -8.734631679e-02f, +4.584179034e-01f, +6.354128872e-01f, +7.190916708e-02f, -1.233036571e-01f, +6.340414933e-02f, +6.595321331e-03f, -3.641134941e-02f, +2.547274011e-02f, -1.615825324e-03f, -1.119899522e-02f, +9.069240739e-03f, -1.640417961e-03f, -2.397000777e-03f, +1.995059925e-03f, -4.209024264e-04f, - +6.281184835e-04f, -1.866671054e-03f, +1.339236578e-03f, +3.369072623e-03f, -1.011636489e-02f, +1.093223601e-02f, +8.500193977e-04f, -2.028992102e-02f, +3.014369507e-02f, -1.548179500e-02f, -1.840353806e-02f, +4.512996655e-02f, -3.913039340e-02f, +1.124535258e-03f, +3.937364301e-02f, -4.954195490e-02f, +2.276061175e-02f, +1.666327237e-02f, -3.716409739e-02f, +2.750334881e-02f, -2.347512488e-03f, -1.564707687e-02f, +1.635148128e-02f, -6.329369473e-03f, -2.471806669e-03f, +4.526728418e-03f, -2.315276830e-03f, +4.209024264e-04f, - +2.089939228e-05f, -1.902883064e-04f, +3.699721402e-04f, -1.340293189e-04f, -7.607963719e-04f, +1.647395118e-03f, -1.053063922e-03f, -1.740511933e-03f, +4.857720099e-03f, -4.142154551e-03f, -3.280196285e-03f, +1.428464473e-02f, -1.648975863e-02f, -3.760850993e-02f, +1.835190421e-02f, +3.504683346e-02f, -7.666882257e-03f, -6.420056655e-03f, +7.948251601e-03f, -2.998691664e-03f, -1.644300113e-03f, +2.804256211e-03f, -1.380033903e-03f, -2.534799409e-04f, +7.817309753e-04f, -4.481120097e-04f, +3.078396433e-05f, +9.956061041e-05f, - -2.089939228e-05f, +2.044425160e-04f, -5.655782016e-04f, +6.553208742e-04f, +1.214040926e-04f, -1.666478813e-03f, +2.696724853e-03f, -1.605742504e-03f, -1.705119170e-03f, +4.934852764e-03f, -4.941878812e-03f, +7.844076779e-04f, +4.764524008e-03f, -7.209666429e-03f, +4.326281524e-03f, +1.672261772e-03f, -6.033421815e-03f, +5.650085530e-03f, -1.521985524e-03f, -2.632321013e-03f, +3.884562122e-03f, -2.250458932e-03f, -1.315380212e-04f, +1.351064978e-03f, -1.129693607e-03f, +3.662789776e-04f, +1.082834395e-04f, -9.956061041e-05f, - /* 12,12 (28) */ - -6.072190912e-04f, +1.006792070e-03f, +6.622963664e-04f, -4.628787586e-03f, +6.393302074e-03f, +4.829974021e-04f, -1.501717740e-02f, +2.277046285e-02f, -5.383252654e-03f, -3.651417583e-02f, +6.836689462e-02f, -3.556766490e-02f, -1.038360754e-01f, +4.208093934e-01f, +6.537647915e-01f, +1.069560005e-01f, -1.309705394e-01f, +5.698409267e-02f, +1.454357293e-02f, -3.941004108e-02f, +2.382844000e-02f, +1.188430887e-03f, -1.257902913e-02f, +8.815760798e-03f, -8.586869854e-04f, -2.845112787e-03f, +2.025843889e-03f, -3.213418160e-04f, - +6.072190912e-04f, -1.662228538e-03f, +7.736583760e-04f, +4.024393497e-03f, -9.994960801e-03f, +9.265757193e-03f, +3.546744251e-03f, -2.189566352e-02f, +2.843857590e-02f, -1.054694224e-02f, -2.334541688e-02f, +4.591437422e-02f, -3.436586939e-02f, -6.085131171e-03f, +4.369992453e-02f, -4.786969313e-02f, +1.672718993e-02f, +2.231335790e-02f, -3.868608292e-02f, +2.487102780e-02f, +1.537049634e-03f, -1.789753580e-02f, +1.621994326e-02f, -4.978304495e-03f, -3.601500275e-03f, +4.893007396e-03f, -2.206993390e-03f, +3.213418160e-04f, - +3.226033240e-05f, -1.937086978e-04f, +3.307700679e-04f, -3.862181063e-05f, -8.389474878e-04f, +1.558507252e-03f, -7.298934870e-04f, -2.083549996e-03f, +4.755524983e-03f, -3.304835570e-03f, -4.371627002e-03f, +1.416637980e-02f, -1.341544975e-02f, -3.891620076e-02f, +1.449316874e-02f, +3.680924997e-02f, -5.663640924e-03f, -7.827105658e-03f, +8.029138375e-03f, -2.378959509e-03f, -2.170104102e-03f, +2.908843806e-03f, -1.204334264e-03f, -4.392813748e-04f, +8.460543928e-04f, -4.216933994e-04f, -9.701468837e-06f, +1.184796094e-04f, - -3.226033240e-05f, +2.232547969e-04f, -5.413498220e-04f, +5.344574970e-04f, +3.180323831e-04f, -1.785328442e-03f, +2.534680436e-03f, -1.124745888e-03f, -2.230029491e-03f, +5.051361226e-03f, -4.406913867e-03f, -1.348725363e-04f, +5.415340130e-03f, -7.068201233e-03f, +3.459819432e-03f, +2.635983122e-03f, -6.420504488e-03f, +5.273503314e-03f, -7.674455337e-04f, -3.192970307e-03f, +3.955833740e-03f, -1.954422772e-03f, -4.735502866e-04f, +1.518102927e-03f, -1.114952786e-03f, +2.823571302e-04f, +1.704884162e-04f, -1.184796094e-04f, - /* 12,13 (28) */ - -5.749587588e-04f, +8.130833721e-04f, +9.930664343e-04f, -4.667409396e-03f, +5.554354587e-03f, +2.041504654e-03f, -1.574707089e-02f, +2.068691286e-02f, -6.277276711e-04f, -3.981901140e-02f, +6.399526762e-02f, -2.140128510e-02f, -1.172515252e-01f, +3.818931927e-01f, +6.682579602e-01f, +1.437652505e-01f, -1.366341803e-01f, +4.915698701e-02f, +2.257271131e-02f, -4.178900058e-02f, +2.165833590e-02f, +4.097274693e-03f, -1.378336339e-02f, +8.376479423e-03f, -1.263259257e-05f, -3.266806186e-03f, +2.016142420e-03f, -2.028622066e-04f, - +5.749587588e-04f, -1.438973742e-03f, +2.323085540e-04f, +4.558850994e-03f, -9.676928418e-03f, +7.480428750e-03f, +6.081424687e-03f, -2.302040941e-02f, +2.620854641e-02f, -5.495581009e-03f, -2.775233074e-02f, +4.577950169e-02f, -2.895052926e-02f, -1.315333240e-02f, +4.715974396e-02f, -4.523371000e-02f, +1.030668545e-02f, +2.758686121e-02f, -3.945352845e-02f, +2.167805749e-02f, +5.492883374e-03f, -1.985195857e-02f, +1.574639297e-02f, -3.460201569e-03f, -4.716453062e-03f, +5.175364526e-03f, -2.036504974e-03f, +2.028622066e-04f, - +4.156503346e-05f, -1.927125243e-04f, +2.876916247e-04f, +5.180731948e-05f, -8.970210369e-04f, +1.444694209e-03f, -4.075727485e-04f, -2.373753014e-03f, +4.570654653e-03f, -2.442586050e-03f, -5.336411535e-03f, +1.380998121e-02f, -1.035642549e-02f, -3.981474570e-02f, +1.047097869e-02f, +3.824758405e-02f, -3.428535877e-03f, -9.161257681e-03f, +7.963070332e-03f, -1.687552938e-03f, -2.677101059e-03f, +2.961968729e-03f, -9.966420220e-04f, -6.261839747e-04f, +8.970520968e-04f, -3.846551742e-04f, -5.327334902e-05f, +1.364293789e-04f, - -4.156503346e-05f, +2.349977934e-04f, -5.067850506e-04f, +4.090791664e-04f, +4.987477213e-04f, -1.862840948e-03f, +2.326549693e-03f, -6.345344592e-04f, -2.697803545e-03f, +5.064095315e-03f, -3.791197237e-03f, -1.041725762e-03f, +5.952947159e-03f, -6.784932201e-03f, +2.522911013e-03f, +3.550887706e-03f, -6.680767782e-03f, +4.784980729e-03f, +1.533015969e-05f, -3.699837061e-03f, +3.947064486e-03f, -1.608253408e-03f, -8.183882287e-04f, +1.659948055e-03f, -1.074791326e-03f, +1.864253916e-04f, +2.336012648e-04f, -1.364293789e-04f, - /* 12,14 (28) */ - -5.333937253e-04f, +6.203708478e-04f, +1.280758059e-03f, -4.615602077e-03f, +4.657333550e-03f, +3.486198863e-03f, -1.615464364e-02f, +1.831315984e-02f, +3.942926982e-03f, -4.226159745e-02f, +5.865885609e-02f, -7.591303891e-03f, -1.276079507e-01f, +3.420784470e-01f, +6.787289389e-01f, +1.820128346e-01f, -1.400627162e-01f, +3.999572933e-02f, +3.053578164e-02f, -4.347655352e-02f, +1.898123484e-02f, +7.059243422e-03f, -1.478000541e-02f, +7.750295448e-03f, +8.844195042e-04f, -3.651461360e-03f, +1.962869071e-03f, -6.643282774e-05f, - +5.333937253e-04f, -1.203975948e-03f, -2.744764966e-04f, +4.967930161e-03f, -9.178180697e-03f, +5.617587802e-03f, +8.407974380e-03f, -2.365494387e-02f, +2.351074287e-02f, -4.314856932e-04f, -3.154352798e-02f, +4.473777593e-02f, -2.299758210e-02f, -1.993826460e-02f, +4.968265498e-02f, -4.168282230e-02f, +3.625917663e-03f, +3.237184194e-02f, -3.943819829e-02f, +1.797822043e-02f, +9.439947860e-03f, -2.146021198e-02f, +1.492800474e-02f, -1.800253514e-03f, -5.791244388e-03f, +5.361789918e-03f, -1.802903709e-03f, +6.643282774e-05f, - +4.876934512e-05f, -1.876710624e-04f, +2.418840628e-04f, +1.357598181e-04f, -9.349443780e-04f, +1.309301519e-03f, -9.210410746e-05f, -2.607950826e-03f, +4.309842171e-03f, -1.571925014e-03f, -6.163199623e-03f, +1.323318207e-02f, -7.351434413e-03f, -4.030106993e-02f, +6.330402493e-03f, +3.933565280e-02f, -9.827504653e-04f, -1.039523570e-02f, +7.744794862e-03f, -9.344874199e-04f, -3.154777852e-03f, +2.960317642e-03f, -7.595375484e-04f, -8.104906417e-04f, +9.329073693e-04f, -3.370925927e-04f, -9.918120421e-05f, +1.528675171e-04f, - -4.876934512e-05f, +2.399358804e-04f, -4.633554639e-04f, +2.821751720e-04f, +6.604422352e-04f, -1.899015724e-03f, +2.078167116e-03f, -1.454339456e-04f, -3.100196905e-03f, +4.974732374e-03f, -3.108430015e-03f, -1.917844561e-03f, +6.367178107e-03f, -6.366053508e-03f, +1.534608595e-03f, +4.398061769e-03f, -6.807829665e-03f, +4.193209028e-03f, +8.106068270e-04f, -4.141252984e-03f, +3.856401374e-03f, -1.217757814e-03f, -1.158733635e-03f, +1.772390996e-03f, -1.008798007e-03f, +7.999774610e-05f, +2.960898091e-04f, -1.528675171e-04f, - /* 12,15 (28) */ - -4.846243802e-04f, +4.326997854e-04f, +1.522642122e-03f, -4.479842259e-03f, +3.722389172e-03f, +4.795500382e-03f, -1.624674774e-02f, +1.570520902e-02f, +8.252769153e-03f, -4.383352246e-02f, +5.249565646e-02f, +5.641878176e-03f, -1.349593851e-01f, +3.017773770e-01f, +6.850593414e-01f, +2.213484874e-01f, -1.410454666e-01f, +2.960049363e-02f, +3.828057650e-02f, -4.441104094e-02f, +1.582645699e-02f, +1.001956106e-02f, -1.553954296e-02f, +6.939804807e-03f, +1.817326873e-03f, -3.988553953e-03f, +1.863687867e-03f, +8.643468934e-05f, - +4.846243802e-04f, -9.640400678e-04f, -7.378319605e-04f, +5.250105333e-03f, -8.517738462e-03f, +3.718572078e-03f, +1.048614150e-02f, -2.380037781e-02f, +2.041054596e-02f, +4.543246681e-03f, -3.465195799e-02f, +4.281993136e-02f, -1.663040399e-02f, -2.630431811e-02f, +5.121726357e-02f, -3.728476053e-02f, -3.181912001e-03f, +3.656505097e-02f, -3.862759146e-02f, +1.383696745e-02f, +1.329634923e-02f, -2.267796980e-02f, +1.376927111e-02f, -2.786251825e-05f, -6.800042395e-03f, +5.441787664e-03f, -1.506813900e-03f, -8.643468934e-05f, - +5.388669386e-05f, -1.790200031e-04f, +1.944786008e-04f, +2.119531771e-04f, -9.530438450e-04f, +1.155933415e-03f, +2.108995370e-04f, -2.784145616e-03f, +3.980942495e-03f, -7.088661868e-04f, -6.843477163e-03f, +1.245638046e-02f, -4.437358614e-03f, -4.037745317e-02f, +2.118136438e-03f, +4.005143650e-02f, +1.648722934e-03f, -1.150223500e-02f, +7.371602801e-03f, -1.313477054e-04f, -3.592745340e-03f, +2.901502336e-03f, -4.963052456e-04f, -9.883710096e-04f, +9.520184531e-04f, -2.793351282e-04f, -1.465671445e-04f, +1.672450930e-04f, - -5.388669386e-05f, +2.384888080e-04f, -4.126503215e-04f, +1.566113751e-04f, +8.005610926e-04f, -1.894732968e-03f, +1.796023473e-03f, +3.325370984e-04f, -3.430508774e-03f, +4.787026885e-03f, -2.373496510e-03f, -2.745747260e-03f, +6.650473100e-03f, -5.820531774e-03f, +5.150350710e-04f, +5.159910641e-03f, -6.798018892e-03f, +3.509133136e-03f, +1.602136959e-03f, -4.506693883e-03f, +3.683687954e-03f, -7.898709170e-04f, -1.487106137e-03f, +1.851701628e-03f, -9.171349744e-04f, -3.507095578e-05f, +3.563316182e-04f, -1.672450930e-04f, - /* 13, 0 (28) */ - +0.000000000e+00f, +5.666384406e-04f, +1.138827626e-03f, -4.947832042e-03f, +7.775272907e-03f, -3.753683238e-03f, -1.054677731e-02f, +2.921374884e-02f, -3.521211508e-02f, +8.626724797e-03f, +5.817244274e-02f, -1.493766746e-01f, +2.292750740e-01f, +7.389097765e-01f, +2.292750740e-01f, -1.493766746e-01f, +5.817244274e-02f, +8.626724797e-03f, -3.521211508e-02f, +2.921374884e-02f, -1.054677731e-02f, -3.753683238e-03f, +7.775272907e-03f, -4.947832042e-03f, +1.138827626e-03f, +5.666384406e-04f, -4.718714774e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.666384406e-04f, +1.805043397e-04f, +3.931653329e-03f, -1.009328495e-02f, +1.316547915e-02f, -6.922639574e-03f, -9.865401789e-03f, +2.934697745e-02f, -3.767009023e-02f, +2.481811038e-02f, +6.027636000e-03f, -3.812597854e-02f, +5.173229864e-02f, -3.812597854e-02f, +6.027636000e-03f, +2.481811038e-02f, -3.767009023e-02f, +2.934697745e-02f, -9.865401789e-03f, -6.922639574e-03f, +1.316547915e-02f, -1.009328495e-02f, +3.931653329e-03f, +1.805043397e-04f, -1.107043555e-03f, +4.718714774e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.097644736e-04f, +3.144060840e-04f, -3.488347878e-05f, -8.633306184e-04f, +1.983411383e-03f, -2.111631419e-03f, -9.094261349e-05f, +4.638041588e-03f, -8.973739761e-03f, +7.993101867e-03f, +5.149295958e-03f, -4.521134714e-02f, -2.633171509e-03f, +4.619798494e-02f, -2.213114486e-03f, -9.710633196e-03f, +9.216973673e-03f, -4.078160698e-03f, -5.504337213e-04f, +2.451608517e-03f, -2.006923010e-03f, +7.387995536e-04f, +1.524827524e-04f, -3.685645521e-04f, +2.181717207e-04f, -5.946880494e-05f, +0.000000000e+00f, - +0.000000000e+00f, +2.097644736e-04f, -5.386640945e-04f, +5.864237478e-04f, +6.267133557e-05f, -1.515500253e-03f, +3.078761555e-03f, -3.430546520e-03f, +1.549361071e-03f, +2.213291408e-03f, -5.907735770e-03f, +7.078790914e-03f, -4.533039716e-03f, -5.935089525e-04f, +5.429877442e-03f, -7.280540492e-03f, +5.412653288e-03f, -1.377455760e-03f, -2.272920446e-03f, +3.764398369e-03f, -3.025169814e-03f, +1.264416787e-03f, +1.822393881e-04f, -7.250456053e-04f, +5.797191266e-04f, -2.564322231e-04f, +5.946880494e-05f, +0.000000000e+00f, - /* 13, 1 (28) */ - +0.000000000e+00f, +3.568739670e-04f, +1.453233711e-03f, -4.982715521e-03f, +6.911942288e-03f, -1.770271855e-03f, -1.265840873e-02f, +2.912280622e-02f, -3.057407349e-02f, -3.470149638e-04f, +6.616554460e-02f, -1.442273786e-01f, +1.840637268e-01f, +7.362766049e-01f, +2.754730589e-01f, -1.515897891e-01f, +4.846180954e-02f, +1.784369847e-02f, -3.929027578e-02f, +2.866331511e-02f, -8.095168796e-03f, -5.760606248e-03f, +8.514072460e-03f, -4.795349290e-03f, +7.702630743e-04f, +7.848101613e-04f, -5.313402824e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.568739670e-04f, -3.581597548e-04f, +4.518077077e-03f, -1.003061361e-02f, +1.164997889e-02f, -3.843878019e-03f, -1.329594831e-02f, +3.089633852e-02f, -3.545679882e-02f, +1.891037461e-02f, +1.310642691e-02f, -4.265901826e-02f, +5.113878969e-02f, -3.269610110e-02f, -1.252904492e-03f, +3.023076367e-02f, -3.904754599e-02f, +2.707405700e-02f, -6.101003420e-03f, -9.947809388e-03f, +1.442989593e-02f, -9.911045560e-03f, +3.206607724e-03f, +7.602234664e-04f, -1.363475778e-03f, +5.313402824e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.969086049e-04f, +2.570948466e-04f, +7.589063730e-05f, -9.619003544e-04f, +1.918271183e-03f, -1.742559828e-03f, -7.016235217e-04f, +5.075740404e-03f, -8.555401689e-03f, +6.202026669e-03f, +7.790580130e-03f, -4.373371457e-02f, -7.865011088e-03f, +4.666712344e-02f, +9.842563057e-04f, -1.131533751e-02f, +9.271629637e-03f, -3.402807360e-03f, -1.209645266e-03f, +2.753384771e-03f, -1.986063008e-03f, +5.897142049e-04f, +2.745021427e-04f, -4.179349901e-04f, +2.214714011e-04f, -5.226481803e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.969086049e-04f, -4.867890496e-04f, +4.418095209e-04f, +2.938279412e-04f, -1.720371530e-03f, +3.058478095e-03f, -3.026391735e-03f, +8.065505564e-04f, +2.982793047e-03f, -6.259498197e-03f, +6.714961298e-03f, -3.535159361e-03f, -1.766588182e-03f, +6.204121044e-03f, -7.314035106e-03f, +4.784107531e-03f, -4.940500910e-04f, -2.959375512e-03f, +4.017817410e-03f, -2.896437912e-03f, +9.714624842e-04f, +4.353067917e-04f, -8.535997808e-04f, +6.079668797e-04f, -2.449614229e-04f, +5.226481803e-05f, +0.000000000e+00f, - /* 13, 2 (28) */ - +0.000000000e+00f, +1.599653621e-04f, +1.710328557e-03f, -4.906824884e-03f, +5.950041934e-03f, +1.479993283e-04f, -1.440096856e-02f, +2.842118270e-02f, -2.549833309e-02f, -8.902416653e-03f, +7.236757127e-02f, -1.364367985e-01f, +1.403300123e-01f, +7.284115939e-01f, +3.221401824e-01f, -1.506055328e-01f, +3.714647203e-02f, +2.711532811e-02f, -4.269308314e-02f, +2.745366985e-02f, -5.341784024e-03f, -7.746669256e-03f, +9.103786665e-03f, -4.520847147e-03f, +3.523280842e-04f, +1.006281562e-03f, -5.836051004e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.599653621e-04f, -8.449488044e-04f, +4.959886598e-03f, -9.736785672e-03f, +9.929607362e-03f, -7.853999246e-04f, -1.632234004e-02f, +3.170288907e-02f, -3.247400577e-02f, +1.265087641e-02f, +1.982138821e-02f, -4.619417762e-02f, +4.937220151e-02f, -2.649198006e-02f, -8.566939598e-03f, +3.501487120e-02f, -3.954159608e-02f, +2.411468149e-02f, -2.083186010e-03f, -1.284424730e-02f, +1.540135842e-02f, -9.475738768e-03f, +2.353007943e-03f, +1.368190346e-03f, -1.608437201e-03f, +5.836051004e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.803279158e-04f, +1.982297826e-04f, +1.777392293e-04f, -1.033764080e-03f, +1.815030251e-03f, -1.353715321e-03f, -1.269963427e-03f, +5.387389999e-03f, -7.978400491e-03f, +4.376276951e-03f, +1.010930366e-02f, -4.179847175e-02f, -1.299388970e-02f, +4.659967790e-02f, +4.403478335e-03f, -1.276825545e-02f, +9.127608772e-03f, -2.621509266e-03f, -1.872851108e-03f, +3.008287473e-03f, -1.918976945e-03f, +4.181467393e-04f, +3.982733156e-04f, -4.608864859e-04f, +2.190934259e-04f, -4.228526908e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.803279158e-04f, -4.262449191e-04f, +2.952059116e-04f, +5.062396848e-04f, -1.875992812e-03f, +2.967327785e-03f, -2.563469441e-03f, +6.240126125e-05f, +3.669102029e-03f, -6.461610334e-03f, +6.199014336e-03f, -2.460089821e-03f, -2.898186105e-03f, +6.837049515e-03f, -7.177068805e-03f, +4.035287579e-03f, +4.166820726e-04f, -3.591374182e-03f, +4.182370935e-03f, -2.693134488e-03f, +6.422219079e-04f, +6.904469727e-04f, -9.680474561e-04f, +6.216528191e-04f, -2.246658194e-04f, +4.228526908e-05f, +0.000000000e+00f, - /* 13, 3 (28) */ - +0.000000000e+00f, -2.036255371e-05f, +1.908558340e-03f, -4.729085655e-03f, +4.916277854e-03f, +1.963029579e-03f, -1.575468388e-02f, +2.715121927e-02f, -2.011094309e-02f, -1.688081714e-02f, +7.674384822e-02f, -1.263274948e-01f, +9.853154051e-02f, +7.154177042e-01f, +3.687398603e-01f, -1.462020544e-01f, +2.437821658e-02f, +3.624293688e-02f, -4.531459241e-02f, +2.558081874e-02f, -2.333496551e-03f, -9.665646201e-03f, +9.521933405e-03f, -4.122573832e-03f, -1.085584017e-04f, +1.225374988e-03f, -6.258903695e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.036255371e-05f, -1.271193724e-03f, +5.255092509e-03f, -9.230545987e-03f, +8.053614551e-03f, +2.181927861e-03f, -1.888580949e-02f, +3.176529033e-02f, -2.880490374e-02f, +6.189266080e-03f, +2.602040255e-02f, -4.865426744e-02f, +4.647401540e-02f, -1.965493054e-02f, -1.574400840e-02f, +3.905015878e-02f, -3.912491400e-02f, +2.052330731e-02f, +2.099184926e-03f, -1.553738179e-02f, +1.604358032e-02f, -8.785291796e-03f, +1.384960487e-03f, +1.989843165e-03f, -1.833103021e-03f, +6.258903695e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.607869473e-04f, +1.393362692e-04f, +2.688983937e-04f, -1.078821552e-03f, +1.677884550e-03f, -9.544210337e-04f, -1.785729637e-03f, +5.571929816e-03f, -7.261692841e-03f, +2.553602345e-03f, +1.208414541e-02f, -3.944523309e-02f, -1.795298817e-02f, +4.598440199e-02f, +8.000109621e-03f, -1.403150726e-02f, +8.778540869e-03f, -1.746525657e-03f, -2.525495492e-03f, +3.208295884e-03f, -1.804786949e-03f, +2.268211904e-04f, +5.209151047e-04f, -4.958356864e-04f, +2.105797540e-04f, -2.954609909e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.607869473e-04f, -3.592765960e-04f, +1.504421647e-04f, +6.956218532e-04f, -1.980655016e-03f, +2.809931649e-03f, -2.054402099e-03f, -6.655491105e-04f, +4.257637282e-03f, -6.511374719e-03f, +5.544428988e-03f, -1.333404387e-03f, -3.961756046e-03f, +7.313234093e-03f, -6.871490347e-03f, +3.182436308e-03f, +1.333487281e-03f, -4.152504418e-03f, +4.251579924e-03f, -2.417707849e-03f, +2.834276143e-04f, +9.412283131e-04f, -1.064499817e-03f, +6.193214927e-04f, -1.953873470e-04f, +2.954609909e-05f, +0.000000000e+00f, - /* 13, 4 (28) */ - +0.000000000e+00f, -1.811495010e-04f, +2.047894609e-03f, -4.460187261e-03f, +3.837456302e-03f, +3.640914129e-03f, -1.670910491e-02f, +2.536548964e-02f, -1.453901327e-02f, -2.414250999e-02f, +7.929745057e-02f, -1.142433494e-01f, +5.908630741e-02f, +6.974647160e-01f, +4.147242623e-01f, -1.382019448e-01f, +1.034670932e-02f, +4.502147775e-02f, -4.706111806e-02f, +2.305532325e-02f, +8.747993327e-04f, -1.147043315e-02f, +9.748754595e-03f, -3.601658727e-03f, -6.043940881e-04f, +1.435954742e-03f, -6.554364686e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.811495010e-04f, -1.630470320e-03f, +5.405534674e-03f, -8.534924134e-03f, +6.072959535e-03f, +4.991859510e-03f, -2.094021158e-02f, +3.109974122e-02f, -2.454726646e-02f, -3.221086391e-04f, +3.156483154e-02f, -4.998767183e-02f, +4.251225936e-02f, -1.234169645e-02f, -2.261549875e-02f, +4.223259509e-02f, -3.779142672e-02f, +1.637080289e-02f, +6.350764850e-03f, -1.795508964e-02f, +1.632700794e-02f, -7.844063483e-03f, +3.204606698e-04f, +2.609164658e-03f, -2.028490368e-03f, +6.554364686e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.390674038e-04f, +8.183303216e-05f, +3.479626316e-04f, -1.097585037e-03f, +1.511571924e-03f, -5.537972797e-04f, -2.240262009e-03f, +5.631012677e-03f, -6.426266076e-03f, +7.699711255e-04f, +1.370030407e-02f, -3.671909523e-02f, -2.267818574e-02f, +4.481817636e-02f, +1.172523462e-02f, -1.506905241e-02f, +8.222075097e-03f, -7.926982130e-04f, -3.152600929e-03f, +3.346254437e-03f, -1.643660931e-03f, +1.908369435e-05f, +6.393922793e-04f, -5.212915553e-04f, +1.956060614e-04f, -1.415420956e-05f, +0.000000000e+00f, - +0.000000000e+00f, +1.390674038e-04f, -2.881546255e-04f, +1.108215697e-05f, +8.584724805e-04f, -2.033968415e-03f, +2.592356683e-03f, -1.512562408e-03f, -1.360552734e-03f, +4.736405719e-03f, -6.409743387e-03f, +4.767846119e-03f, -1.817750317e-04f, -4.932384095e-03f, +7.620921646e-03f, -6.403190573e-03f, +2.244493509e-03f, +2.234604561e-03f, -4.627719115e-03f, +4.221133037e-03f, -2.074485332e-03f, -9.716869297e-05f, +1.181025763e-03f, -1.139333276e-03f, +5.998780408e-04f, -1.572390982e-04f, +1.415420956e-05f, +0.000000000e+00f, - /* 13, 5 (28) */ - +0.000000000e+00f, -3.202169048e-04f, +2.129727641e-03f, -4.112224629e-03f, +2.739871266e-03f, +5.152486053e-03f, -1.726290219e-02f, +2.312522763e-02f, -8.908000598e-03f, -3.056877606e-02f, +8.006742169e-02f, -1.005430454e-01f, +2.236721218e-02f, +6.747865303e-01f, +4.595424386e-01f, -1.264767102e-01f, -4.722343086e-03f, +5.324355284e-02f, -4.785381628e-02f, +1.990272232e-02f, +4.221053770e-03f, -1.311409408e-02f, +9.767838289e-03f, -2.962266448e-03f, -1.125685643e-03f, +1.631560804e-03f, -6.695906781e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.202169048e-04f, -1.918624945e-03f, +5.416616831e-03f, -7.676451653e-03f, +4.038991121e-03f, +7.584216193e-03f, -2.245277399e-02f, +2.973918849e-02f, -1.981086074e-02f, -6.731852026e-03f, +3.633267766e-02f, -5.016944686e-02f, +3.757987526e-02f, -4.720774802e-03f, -2.901868932e-02f, +4.447708860e-02f, -3.555682216e-02f, +1.174308377e-02f, +1.057189789e-02f, -2.002957497e-02f, +1.622983925e-02f, -6.663037720e-03f, -8.188726058e-04f, +3.209042699e-03f, -2.185729466e-03f, +6.695906781e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.159457178e-04f, +2.700381581e-05f, +4.138969444e-04f, -1.091134819e-03f, +1.321239558e-03f, -1.605705936e-04f, -2.626592117e-03f, +5.568858352e-03f, -5.494630734e-03f, -9.410357382e-04f, +1.494955508e-02f, -3.366980638e-02f, -2.710907243e-02f, +4.310616097e-02f, +1.552618908e-02f, -1.584743849e-02f, +7.460099495e-03f, +2.227598241e-04f, -3.739083112e-03f, +3.416075681e-03f, -1.436860562e-03f, -2.011438953e-04f, +7.505815936e-04f, -5.359005839e-04f, +1.740011755e-04f, +3.688234506e-06f, +0.000000000e+00f, - +0.000000000e+00f, +1.159457178e-04f, -2.151101387e-04f, -1.196554268e-04f, +9.921253878e-04f, -2.036820231e-03f, +2.321918514e-03f, -9.517271008e-04f, -2.007038392e-03f, +5.096244218e-03f, -6.161245796e-03f, +3.888640644e-03f, +9.676724522e-04f, -5.787385887e-03f, +7.752329968e-03f, -5.781990990e-03f, +1.242668571e-03f, +3.098288579e-03f, -5.003735911e-03f, +4.089051516e-03f, -1.669624549e-03f, -4.909564591e-04f, +1.403187127e-03f, -1.189303245e-03f, +5.626427737e-04f, -1.106214155e-04f, -3.688234506e-06f, +0.000000000e+00f, - /* 13, 6 (28) */ - +0.000000000e+00f, -4.361626226e-04f, +2.156731457e-03f, -3.698327685e-03f, +1.648736446e-03f, +6.473725611e-03f, -1.742347279e-02f, +2.049863551e-02f, -3.339142246e-03f, -3.606340680e-02f, +7.912638596e-02f, -8.559349027e-02f, -1.130259419e-02f, +6.476774578e-01f, +5.026485996e-01f, -1.109505211e-01f, -2.056978157e-02f, +6.070365234e-02f, -4.763105645e-02f, +1.616363921e-02f, +7.637129450e-03f, -1.455095464e-02f, +9.566694394e-03f, -2.211684854e-03f, -1.661586227e-03f, +1.805561979e-03f, -6.659024436e-04f, +0.000000000e+00f, - +0.000000000e+00f, +4.361626226e-04f, -2.133735084e-03f, +5.296961404e-03f, -6.684326265e-03f, +2.002170890e-03f, +9.906134708e-03f, -2.340450109e-02f, +2.773215010e-02f, -1.471461652e-02f, -1.289309782e-02f, +4.022131830e-02f, -4.920177441e-02f, +3.179248938e-02f, +3.031555166e-03f, -3.480068031e-02f, +4.571975717e-02f, -3.245853358e-02f, +6.739347862e-03f, +1.466094940e-02f, -2.169919952e-02f, +1.573888279e-02f, -5.259850593e-03f, -2.008175851e-03f, +3.771685472e-03f, -2.296350881e-03f, +6.659024436e-04f, +0.000000000e+00f, - +0.000000000e+00f, -9.217229433e-05f, -2.402575133e-05f, +4.660393219e-04f, -1.061063814e-03f, +1.112308476e-03f, +2.171001174e-04f, -2.939520943e-03f, +5.392058972e-03f, -4.490301623e-03f, -2.548764852e-03f, +1.583018857e-02f, -3.035086850e-02f, -3.118989610e-02f, +4.086180709e-02f, +1.934736771e-02f, -1.633652447e-02f, +6.498882346e-03f, +1.280534103e-03f, -4.270081492e-03f, +3.412927864e-03f, -1.186765894e-03f, -4.294267254e-04f, +8.513438530e-04f, -5.384912864e-04f, +1.457635800e-04f, +2.368211550e-05f, +0.000000000e+00f, - +0.000000000e+00f, +9.217229433e-05f, -1.422747106e-04f, -2.389635186e-04f, +1.094779161e-03f, -1.991301498e-03f, +2.006959355e-03f, -3.857302377e-04f, -2.590960759e-03f, +5.330988405e-03f, -5.773830893e-03f, +2.928431315e-03f, +2.088011086e-03f, -6.506848761e-03f, +7.703847455e-03f, -5.021435586e-03f, +1.999524968e-04f, +3.903340830e-03f, -5.269401320e-03f, +3.855799559e-03f, -1.211016291e-03f, -8.886549225e-04f, +1.601207351e-03f, -1.211653197e-03f, +5.073968242e-04f, -5.623002535e-05f, -2.368211550e-05f, +0.000000000e+00f, - /* 13, 7 (28) */ - +0.000000000e+00f, -5.283349169e-04f, +2.132705706e-03f, -3.232288363e-03f, +5.876726322e-04f, +7.586034087e-03f, -1.720637267e-02f, +1.755911457e-02f, +2.052916726e-03f, -4.055370842e-02f, +7.657762110e-02f, -6.976330170e-02f, -4.165346269e-02f, +6.164875617e-01f, +5.435104067e-01f, -9.160315340e-02f, -3.690630604e-02f, +6.720253469e-02f, -4.635052235e-02f, +1.189355772e-02f, +1.105005731e-02f, -1.573772054e-02f, +9.137267669e-03f, -1.360341001e-03f, -2.200077514e-03f, +1.951325559e-03f, -6.422203281e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.283349169e-04f, -2.276009794e-03f, +5.057997886e-03f, -5.589547104e-03f, +1.086939211e-05f, +1.191309406e-02f, -2.379023133e-02f, +2.514118934e-02f, -9.383628118e-03f, -1.866692872e-02f, +4.314974961e-02f, -4.711376332e-02f, +2.528564062e-02f, +1.073540262e-02f, -3.982211590e-02f, +4.591970966e-02f, -2.855519275e-02f, +1.469946542e-03f, +1.851674896e-02f, -2.291021581e-02f, +1.485022786e-02f, -3.658643241e-03f, -3.219829048e-03f, +4.279082297e-03f, -2.352580907e-03f, +6.422203281e-04f, +0.000000000e+00f, - +0.000000000e+00f, -6.845289247e-05f, -7.030581238e-05f, +5.040940874e-04f, -1.009413122e-03f, +8.903382910e-04f, +5.717771793e-04f, -3.175655060e-03f, +5.109342206e-03f, -3.437278311e-03f, -4.025956514e-03f, +1.634683201e-02f, -2.681858927e-02f, -3.487042737e-02f, +3.810672767e-02f, +2.313110144e-02f, -1.651016365e-02f, +5.349129903e-03f, +2.359535620e-03f, -4.731298783e-03f, +3.333402192e-03f, -8.968749533e-04f, -6.608952906e-04f, +9.386005109e-04f, -5.281167619e-04f, +1.110743340e-04f, +4.543251870e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.845289247e-05f, -7.162659364e-05f, -3.444985434e-04f, +1.165502340e-03f, -1.900606213e-03f, +1.656607659e-03f, +1.718753448e-04f, -3.100104401e-03f, +5.437565358e-03f, -5.258628319e-03f, +1.910540740e-03f, +3.153157097e-03f, -7.074106047e-03f, +7.476131947e-03f, -4.138490324e-03f, -8.594193102e-04f, +4.629635718e-03f, -5.416009303e-03f, +3.524335977e-03f, -7.081401769e-04f, -1.280526142e-03f, +1.768906421e-03f, -1.204215716e-03f, +4.344170456e-04f, +4.944518787e-06f, -4.543251870e-05f, +0.000000000e+00f, - /* 13, 8 (28) */ - +0.000000000e+00f, -5.967878094e-04f, +2.062399893e-03f, -2.728194276e-03f, -4.217404900e-04f, +8.476372378e-03f, -1.663459549e-02f, +1.438345951e-02f, +7.162258932e-03f, -4.399098673e-02f, +7.255166459e-02f, -5.341646969e-02f, -6.847205196e-02f, +5.816171343e-01f, +5.816171343e-01f, -6.847205196e-02f, -5.341646969e-02f, +7.255166459e-02f, -4.399098673e-02f, +7.162258932e-03f, +1.438345951e-02f, -1.663459549e-02f, +8.476372378e-03f, -4.217404900e-04f, -2.728194276e-03f, +2.062399893e-03f, -5.967878094e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.967878094e-04f, -2.347636388e-03f, +4.713499342e-03f, -4.424044764e-03f, -1.889736821e-03f, +1.356970172e-02f, -2.361835599e-02f, +2.204108494e-02f, -3.946062761e-03f, -2.392555703e-02f, +4.506029035e-02f, -4.396060622e-02f, +1.821153457e-02f, +1.821153457e-02f, -4.396060622e-02f, +4.506029035e-02f, -2.392555703e-02f, -3.946062761e-03f, +2.204108494e-02f, -2.361835599e-02f, +1.356970172e-02f, -1.889736821e-03f, -4.424044764e-03f, +4.713499342e-03f, -2.347636388e-03f, +5.967878094e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.543251870e-05f, -1.110743340e-04f, +5.281167619e-04f, -9.386005109e-04f, +6.608952906e-04f, +8.968749533e-04f, -3.333402192e-03f, +4.731298783e-03f, -2.359535620e-03f, -5.349129903e-03f, +1.651016365e-02f, -2.313110144e-02f, -3.810672767e-02f, +3.487042737e-02f, +2.681858927e-02f, -1.634683201e-02f, +4.025956514e-03f, +3.437278311e-03f, -5.109342206e-03f, +3.175655060e-03f, -5.717771793e-04f, -8.903382910e-04f, +1.009413122e-03f, -5.040940874e-04f, +7.030581238e-05f, +6.845289247e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.543251870e-05f, -4.944518787e-06f, -4.344170456e-04f, +1.204215716e-03f, -1.768906421e-03f, +1.280526142e-03f, +7.081401769e-04f, -3.524335977e-03f, +5.416009303e-03f, -4.629635718e-03f, +8.594193102e-04f, +4.138490324e-03f, -7.476131947e-03f, +7.074106047e-03f, -3.153157097e-03f, -1.910540740e-03f, +5.258628319e-03f, -5.437565358e-03f, +3.100104401e-03f, -1.718753448e-04f, -1.656607659e-03f, +1.900606213e-03f, -1.165502340e-03f, +3.444985434e-04f, +7.162659364e-05f, -6.845289247e-05f, +0.000000000e+00f, - /* 13, 9 (28) */ - +0.000000000e+00f, -6.422203281e-04f, +1.951325559e-03f, -2.200077514e-03f, -1.360341001e-03f, +9.137267669e-03f, -1.573772054e-02f, +1.105005731e-02f, +1.189355772e-02f, -4.635052235e-02f, +6.720253469e-02f, -3.690630604e-02f, -9.160315340e-02f, +5.435104067e-01f, +6.164875617e-01f, -4.165346269e-02f, -6.976330170e-02f, +7.657762110e-02f, -4.055370842e-02f, +2.052916726e-03f, +1.755911457e-02f, -1.720637267e-02f, +7.586034087e-03f, +5.876726322e-04f, -3.232288363e-03f, +2.132705706e-03f, -5.283349169e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.422203281e-04f, -2.352580907e-03f, +4.279082297e-03f, -3.219829048e-03f, -3.658643241e-03f, +1.485022786e-02f, -2.291021581e-02f, +1.851674896e-02f, +1.469946542e-03f, -2.855519275e-02f, +4.591970966e-02f, -3.982211590e-02f, +1.073540262e-02f, +2.528564062e-02f, -4.711376332e-02f, +4.314974961e-02f, -1.866692872e-02f, -9.383628118e-03f, +2.514118934e-02f, -2.379023133e-02f, +1.191309406e-02f, +1.086939211e-05f, -5.589547104e-03f, +5.057997886e-03f, -2.276009794e-03f, +5.283349169e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.368211550e-05f, -1.457635800e-04f, +5.384912864e-04f, -8.513438530e-04f, +4.294267254e-04f, +1.186765894e-03f, -3.412927864e-03f, +4.270081492e-03f, -1.280534103e-03f, -6.498882346e-03f, +1.633652447e-02f, -1.934736771e-02f, -4.086180709e-02f, +3.118989610e-02f, +3.035086850e-02f, -1.583018857e-02f, +2.548764852e-03f, +4.490301623e-03f, -5.392058972e-03f, +2.939520943e-03f, -2.171001174e-04f, -1.112308476e-03f, +1.061063814e-03f, -4.660393219e-04f, +2.402575133e-05f, +9.217229433e-05f, +0.000000000e+00f, - +0.000000000e+00f, +2.368211550e-05f, +5.623002535e-05f, -5.073968242e-04f, +1.211653197e-03f, -1.601207351e-03f, +8.886549225e-04f, +1.211016291e-03f, -3.855799559e-03f, +5.269401320e-03f, -3.903340830e-03f, -1.999524968e-04f, +5.021435586e-03f, -7.703847455e-03f, +6.506848761e-03f, -2.088011086e-03f, -2.928431315e-03f, +5.773830893e-03f, -5.330988405e-03f, +2.590960759e-03f, +3.857302377e-04f, -2.006959355e-03f, +1.991301498e-03f, -1.094779161e-03f, +2.389635186e-04f, +1.422747106e-04f, -9.217229433e-05f, +0.000000000e+00f, - /* 13,10 (28) */ - +0.000000000e+00f, -6.659024436e-04f, +1.805561979e-03f, -1.661586227e-03f, -2.211684854e-03f, +9.566694394e-03f, -1.455095464e-02f, +7.637129450e-03f, +1.616363921e-02f, -4.763105645e-02f, +6.070365234e-02f, -2.056978157e-02f, -1.109505211e-01f, +5.026485996e-01f, +6.476774578e-01f, -1.130259419e-02f, -8.559349027e-02f, +7.912638596e-02f, -3.606340680e-02f, -3.339142246e-03f, +2.049863551e-02f, -1.742347279e-02f, +6.473725611e-03f, +1.648736446e-03f, -3.698327685e-03f, +2.156731457e-03f, -4.361626226e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.659024436e-04f, -2.296350881e-03f, +3.771685472e-03f, -2.008175851e-03f, -5.259850593e-03f, +1.573888279e-02f, -2.169919952e-02f, +1.466094940e-02f, +6.739347862e-03f, -3.245853358e-02f, +4.571975717e-02f, -3.480068031e-02f, +3.031555166e-03f, +3.179248938e-02f, -4.920177441e-02f, +4.022131830e-02f, -1.289309782e-02f, -1.471461652e-02f, +2.773215010e-02f, -2.340450109e-02f, +9.906134708e-03f, +2.002170890e-03f, -6.684326265e-03f, +5.296961404e-03f, -2.133735084e-03f, +4.361626226e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.688234506e-06f, -1.740011755e-04f, +5.359005839e-04f, -7.505815936e-04f, +2.011438953e-04f, +1.436860562e-03f, -3.416075681e-03f, +3.739083112e-03f, -2.227598241e-04f, -7.460099495e-03f, +1.584743849e-02f, -1.552618908e-02f, -4.310616097e-02f, +2.710907243e-02f, +3.366980638e-02f, -1.494955508e-02f, +9.410357382e-04f, +5.494630734e-03f, -5.568858352e-03f, +2.626592117e-03f, +1.605705936e-04f, -1.321239558e-03f, +1.091134819e-03f, -4.138969444e-04f, -2.700381581e-05f, +1.159457178e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.688234506e-06f, +1.106214155e-04f, -5.626427737e-04f, +1.189303245e-03f, -1.403187127e-03f, +4.909564591e-04f, +1.669624549e-03f, -4.089051516e-03f, +5.003735911e-03f, -3.098288579e-03f, -1.242668571e-03f, +5.781990990e-03f, -7.752329968e-03f, +5.787385887e-03f, -9.676724522e-04f, -3.888640644e-03f, +6.161245796e-03f, -5.096244218e-03f, +2.007038392e-03f, +9.517271008e-04f, -2.321918514e-03f, +2.036820231e-03f, -9.921253878e-04f, +1.196554268e-04f, +2.151101387e-04f, -1.159457178e-04f, +0.000000000e+00f, - /* 13,11 (28) */ - +0.000000000e+00f, -6.695906781e-04f, +1.631560804e-03f, -1.125685643e-03f, -2.962266448e-03f, +9.767838289e-03f, -1.311409408e-02f, +4.221053770e-03f, +1.990272232e-02f, -4.785381628e-02f, +5.324355284e-02f, -4.722343086e-03f, -1.264767102e-01f, +4.595424386e-01f, +6.747865303e-01f, +2.236721218e-02f, -1.005430454e-01f, +8.006742169e-02f, -3.056877606e-02f, -8.908000598e-03f, +2.312522763e-02f, -1.726290219e-02f, +5.152486053e-03f, +2.739871266e-03f, -4.112224629e-03f, +2.129727641e-03f, -3.202169048e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.695906781e-04f, -2.185729466e-03f, +3.209042699e-03f, -8.188726058e-04f, -6.663037720e-03f, +1.622983925e-02f, -2.002957497e-02f, +1.057189789e-02f, +1.174308377e-02f, -3.555682216e-02f, +4.447708860e-02f, -2.901868932e-02f, -4.720774802e-03f, +3.757987526e-02f, -5.016944686e-02f, +3.633267766e-02f, -6.731852026e-03f, -1.981086074e-02f, +2.973918849e-02f, -2.245277399e-02f, +7.584216193e-03f, +4.038991121e-03f, -7.676451653e-03f, +5.416616831e-03f, -1.918624945e-03f, +3.202169048e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.415420956e-05f, -1.956060614e-04f, +5.212915553e-04f, -6.393922793e-04f, -1.908369435e-05f, +1.643660931e-03f, -3.346254437e-03f, +3.152600929e-03f, +7.926982130e-04f, -8.222075097e-03f, +1.506905241e-02f, -1.172523462e-02f, -4.481817636e-02f, +2.267818574e-02f, +3.671909523e-02f, -1.370030407e-02f, -7.699711255e-04f, +6.426266076e-03f, -5.631012677e-03f, +2.240262009e-03f, +5.537972797e-04f, -1.511571924e-03f, +1.097585037e-03f, -3.479626316e-04f, -8.183303216e-05f, +1.390674038e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.415420956e-05f, +1.572390982e-04f, -5.998780408e-04f, +1.139333276e-03f, -1.181025763e-03f, +9.716869297e-05f, +2.074485332e-03f, -4.221133037e-03f, +4.627719115e-03f, -2.234604561e-03f, -2.244493509e-03f, +6.403190573e-03f, -7.620921646e-03f, +4.932384095e-03f, +1.817750317e-04f, -4.767846119e-03f, +6.409743387e-03f, -4.736405719e-03f, +1.360552734e-03f, +1.512562408e-03f, -2.592356683e-03f, +2.033968415e-03f, -8.584724805e-04f, -1.108215697e-05f, +2.881546255e-04f, -1.390674038e-04f, +0.000000000e+00f, - /* 13,12 (28) */ - +0.000000000e+00f, -6.554364686e-04f, +1.435954742e-03f, -6.043940881e-04f, -3.601658727e-03f, +9.748754595e-03f, -1.147043315e-02f, +8.747993327e-04f, +2.305532325e-02f, -4.706111806e-02f, +4.502147775e-02f, +1.034670932e-02f, -1.382019448e-01f, +4.147242623e-01f, +6.974647160e-01f, +5.908630741e-02f, -1.142433494e-01f, +7.929745057e-02f, -2.414250999e-02f, -1.453901327e-02f, +2.536548964e-02f, -1.670910491e-02f, +3.640914129e-03f, +3.837456302e-03f, -4.460187261e-03f, +2.047894609e-03f, -1.811495010e-04f, +0.000000000e+00f, - +0.000000000e+00f, +6.554364686e-04f, -2.028490368e-03f, +2.609164658e-03f, +3.204606698e-04f, -7.844063483e-03f, +1.632700794e-02f, -1.795508964e-02f, +6.350764850e-03f, +1.637080289e-02f, -3.779142672e-02f, +4.223259509e-02f, -2.261549875e-02f, -1.234169645e-02f, +4.251225936e-02f, -4.998767183e-02f, +3.156483154e-02f, -3.221086391e-04f, -2.454726646e-02f, +3.109974122e-02f, -2.094021158e-02f, +4.991859510e-03f, +6.072959535e-03f, -8.534924134e-03f, +5.405534674e-03f, -1.630470320e-03f, +1.811495010e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.954609909e-05f, -2.105797540e-04f, +4.958356864e-04f, -5.209151047e-04f, -2.268211904e-04f, +1.804786949e-03f, -3.208295884e-03f, +2.525495492e-03f, +1.746525657e-03f, -8.778540869e-03f, +1.403150726e-02f, -8.000109621e-03f, -4.598440199e-02f, +1.795298817e-02f, +3.944523309e-02f, -1.208414541e-02f, -2.553602345e-03f, +7.261692841e-03f, -5.571929816e-03f, +1.785729637e-03f, +9.544210337e-04f, -1.677884550e-03f, +1.078821552e-03f, -2.688983937e-04f, -1.393362692e-04f, +1.607869473e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.954609909e-05f, +1.953873470e-04f, -6.193214927e-04f, +1.064499817e-03f, -9.412283131e-04f, -2.834276143e-04f, +2.417707849e-03f, -4.251579924e-03f, +4.152504418e-03f, -1.333487281e-03f, -3.182436308e-03f, +6.871490347e-03f, -7.313234093e-03f, +3.961756046e-03f, +1.333404387e-03f, -5.544428988e-03f, +6.511374719e-03f, -4.257637282e-03f, +6.655491105e-04f, +2.054402099e-03f, -2.809931649e-03f, +1.980655016e-03f, -6.956218532e-04f, -1.504421647e-04f, +3.592765960e-04f, -1.607869473e-04f, +0.000000000e+00f, - /* 13,13 (28) */ - +0.000000000e+00f, -6.258903695e-04f, +1.225374988e-03f, -1.085584017e-04f, -4.122573832e-03f, +9.521933405e-03f, -9.665646201e-03f, -2.333496551e-03f, +2.558081874e-02f, -4.531459241e-02f, +3.624293688e-02f, +2.437821658e-02f, -1.462020544e-01f, +3.687398603e-01f, +7.154177042e-01f, +9.853154051e-02f, -1.263274948e-01f, +7.674384822e-02f, -1.688081714e-02f, -2.011094309e-02f, +2.715121927e-02f, -1.575468388e-02f, +1.963029579e-03f, +4.916277854e-03f, -4.729085655e-03f, +1.908558340e-03f, -2.036255371e-05f, +0.000000000e+00f, - +0.000000000e+00f, +6.258903695e-04f, -1.833103021e-03f, +1.989843165e-03f, +1.384960487e-03f, -8.785291796e-03f, +1.604358032e-02f, -1.553738179e-02f, +2.099184926e-03f, +2.052330731e-02f, -3.912491400e-02f, +3.905015878e-02f, -1.574400840e-02f, -1.965493054e-02f, +4.647401540e-02f, -4.865426744e-02f, +2.602040255e-02f, +6.189266080e-03f, -2.880490374e-02f, +3.176529033e-02f, -1.888580949e-02f, +2.181927861e-03f, +8.053614551e-03f, -9.230545987e-03f, +5.255092509e-03f, -1.271193724e-03f, +2.036255371e-05f, +0.000000000e+00f, - +0.000000000e+00f, +4.228526908e-05f, -2.190934259e-04f, +4.608864859e-04f, -3.982733156e-04f, -4.181467393e-04f, +1.918976945e-03f, -3.008287473e-03f, +1.872851108e-03f, +2.621509266e-03f, -9.127608772e-03f, +1.276825545e-02f, -4.403478335e-03f, -4.659967790e-02f, +1.299388970e-02f, +4.179847175e-02f, -1.010930366e-02f, -4.376276951e-03f, +7.978400491e-03f, -5.387389999e-03f, +1.269963427e-03f, +1.353715321e-03f, -1.815030251e-03f, +1.033764080e-03f, -1.777392293e-04f, -1.982297826e-04f, +1.803279158e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.228526908e-05f, +2.246658194e-04f, -6.216528191e-04f, +9.680474561e-04f, -6.904469727e-04f, -6.422219079e-04f, +2.693134488e-03f, -4.182370935e-03f, +3.591374182e-03f, -4.166820726e-04f, -4.035287579e-03f, +7.177068805e-03f, -6.837049515e-03f, +2.898186105e-03f, +2.460089821e-03f, -6.199014336e-03f, +6.461610334e-03f, -3.669102029e-03f, -6.240126125e-05f, +2.563469441e-03f, -2.967327785e-03f, +1.875992812e-03f, -5.062396848e-04f, -2.952059116e-04f, +4.262449191e-04f, -1.803279158e-04f, +0.000000000e+00f, - /* 13,14 (28) */ - +0.000000000e+00f, -5.836051004e-04f, +1.006281562e-03f, +3.523280842e-04f, -4.520847147e-03f, +9.103786665e-03f, -7.746669256e-03f, -5.341784024e-03f, +2.745366985e-02f, -4.269308314e-02f, +2.711532811e-02f, +3.714647203e-02f, -1.506055328e-01f, +3.221401824e-01f, +7.284115939e-01f, +1.403300123e-01f, -1.364367985e-01f, +7.236757127e-02f, -8.902416653e-03f, -2.549833309e-02f, +2.842118270e-02f, -1.440096856e-02f, +1.479993283e-04f, +5.950041934e-03f, -4.906824884e-03f, +1.710328557e-03f, +1.599653621e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.836051004e-04f, -1.608437201e-03f, +1.368190346e-03f, +2.353007943e-03f, -9.475738768e-03f, +1.540135842e-02f, -1.284424730e-02f, -2.083186010e-03f, +2.411468149e-02f, -3.954159608e-02f, +3.501487120e-02f, -8.566939598e-03f, -2.649198006e-02f, +4.937220151e-02f, -4.619417762e-02f, +1.982138821e-02f, +1.265087641e-02f, -3.247400577e-02f, +3.170288907e-02f, -1.632234004e-02f, -7.853999246e-04f, +9.929607362e-03f, -9.736785672e-03f, +4.959886598e-03f, -8.449488044e-04f, -1.599653621e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.226481803e-05f, -2.214714011e-04f, +4.179349901e-04f, -2.745021427e-04f, -5.897142049e-04f, +1.986063008e-03f, -2.753384771e-03f, +1.209645266e-03f, +3.402807360e-03f, -9.271629637e-03f, +1.131533751e-02f, -9.842563057e-04f, -4.666712344e-02f, +7.865011088e-03f, +4.373371457e-02f, -7.790580130e-03f, -6.202026669e-03f, +8.555401689e-03f, -5.075740404e-03f, +7.016235217e-04f, +1.742559828e-03f, -1.918271183e-03f, +9.619003544e-04f, -7.589063730e-05f, -2.570948466e-04f, +1.969086049e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.226481803e-05f, +2.449614229e-04f, -6.079668797e-04f, +8.535997808e-04f, -4.353067917e-04f, -9.714624842e-04f, +2.896437912e-03f, -4.017817410e-03f, +2.959375512e-03f, +4.940500910e-04f, -4.784107531e-03f, +7.314035106e-03f, -6.204121044e-03f, +1.766588182e-03f, +3.535159361e-03f, -6.714961298e-03f, +6.259498197e-03f, -2.982793047e-03f, -8.065505564e-04f, +3.026391735e-03f, -3.058478095e-03f, +1.720371530e-03f, -2.938279412e-04f, -4.418095209e-04f, +4.867890496e-04f, -1.969086049e-04f, +0.000000000e+00f, - /* 13,15 (28) */ - +0.000000000e+00f, -5.313402824e-04f, +7.848101613e-04f, +7.702630743e-04f, -4.795349290e-03f, +8.514072460e-03f, -5.760606248e-03f, -8.095168796e-03f, +2.866331511e-02f, -3.929027578e-02f, +1.784369847e-02f, +4.846180954e-02f, -1.515897891e-01f, +2.754730589e-01f, +7.362766049e-01f, +1.840637268e-01f, -1.442273786e-01f, +6.616554460e-02f, -3.470149638e-04f, -3.057407349e-02f, +2.912280622e-02f, -1.265840873e-02f, -1.770271855e-03f, +6.911942288e-03f, -4.982715521e-03f, +1.453233711e-03f, +3.568739670e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.313402824e-04f, -1.363475778e-03f, +7.602234664e-04f, +3.206607724e-03f, -9.911045560e-03f, +1.442989593e-02f, -9.947809388e-03f, -6.101003420e-03f, +2.707405700e-02f, -3.904754599e-02f, +3.023076367e-02f, -1.252904492e-03f, -3.269610110e-02f, +5.113878969e-02f, -4.265901826e-02f, +1.310642691e-02f, +1.891037461e-02f, -3.545679882e-02f, +3.089633852e-02f, -1.329594831e-02f, -3.843878019e-03f, +1.164997889e-02f, -1.003061361e-02f, +4.518077077e-03f, -3.581597548e-04f, -3.568739670e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.946880494e-05f, -2.181717207e-04f, +3.685645521e-04f, -1.524827524e-04f, -7.387995536e-04f, +2.006923010e-03f, -2.451608517e-03f, +5.504337213e-04f, +4.078160698e-03f, -9.216973673e-03f, +9.710633196e-03f, +2.213114486e-03f, -4.619798494e-02f, +2.633171509e-03f, +4.521134714e-02f, -5.149295958e-03f, -7.993101867e-03f, +8.973739761e-03f, -4.638041588e-03f, +9.094261349e-05f, +2.111631419e-03f, -1.983411383e-03f, +8.633306184e-04f, +3.488347878e-05f, -3.144060840e-04f, +2.097644736e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.946880494e-05f, +2.564322231e-04f, -5.797191266e-04f, +7.250456053e-04f, -1.822393881e-04f, -1.264416787e-03f, +3.025169814e-03f, -3.764398369e-03f, +2.272920446e-03f, +1.377455760e-03f, -5.412653288e-03f, +7.280540492e-03f, -5.429877442e-03f, +5.935089525e-04f, +4.533039716e-03f, -7.078790914e-03f, +5.907735770e-03f, -2.213291408e-03f, -1.549361071e-03f, +3.430546520e-03f, -3.078761555e-03f, +1.515500253e-03f, -6.267133557e-05f, -5.864237478e-04f, +5.386640945e-04f, -2.097644736e-04f, +0.000000000e+00f, - /* 14, 0 (24) */ - +1.319331966e-03f, -1.016178713e-03f, -2.318012042e-03f, +9.411795907e-03f, -1.746941689e-02f, +1.934834705e-02f, -5.865137636e-03f, -2.904336543e-02f, +8.299055312e-02f, -1.433490386e-01f, +1.911490954e-01f, +7.906420751e-01f, +1.911490954e-01f, -1.433490386e-01f, +8.299055312e-02f, -2.904336543e-02f, -5.865137636e-03f, +1.934834705e-02f, -1.746941689e-02f, +9.411795907e-03f, -2.318012042e-03f, -1.016178713e-03f, +1.319331966e-03f, -5.404051147e-04f, - -2.521351164e-03f, +4.422857262e-03f, -3.985881589e-03f, -1.343441160e-03f, +1.186209570e-02f, -2.390185965e-02f, +3.059439799e-02f, -2.544922973e-02f, +6.875499987e-03f, +1.945720767e-02f, -4.255924117e-02f, +5.173229864e-02f, -4.255924117e-02f, +1.945720767e-02f, +6.875499987e-03f, -2.544922973e-02f, +3.059439799e-02f, -2.390185965e-02f, +1.186209570e-02f, -1.343441160e-03f, -3.985881589e-03f, +4.422857262e-03f, -2.521351164e-03f, +7.211855688e-04f, - -2.242580105e-04f, +5.515402691e-04f, -8.006592829e-04f, +4.679111297e-04f, +9.671301358e-04f, -3.521489134e-03f, +6.187402659e-03f, -6.760448353e-03f, +2.085366097e-03f, +1.222808687e-02f, -4.974438686e-02f, -3.226680462e-03f, +5.162786239e-02f, -9.493654979e-03f, -4.297979908e-03f, +7.839517914e-03f, -6.351081144e-03f, +3.213964647e-03f, -5.735612965e-04f, -7.425062231e-04f, +9.210389417e-04f, -5.725628529e-04f, +2.111545745e-04f, -3.826050238e-05f, - +1.361148124e-04f, -6.078360122e-04f, +1.365871498e-03f, -2.021916039e-03f, +1.927534233e-03f, -5.492420567e-04f, -2.058145461e-03f, +5.025851749e-03f, -6.951055384e-03f, +6.618560623e-03f, -3.757759117e-03f, -6.671799512e-04f, +4.876258793e-03f, -7.186973906e-03f, +6.873936703e-03f, -4.460536991e-03f, +1.305886445e-03f, +1.201288539e-03f, -2.322748136e-03f, +2.158182611e-03f, -1.338999949e-03f, +5.283783837e-04f, -7.268521485e-05f, -3.959096234e-05f, - /* 14, 1 (24) */ - +1.095073956e-03f, -4.646384443e-04f, -3.118671324e-03f, +9.879707037e-03f, -1.650228675e-02f, +1.582685791e-02f, +3.222650227e-04f, -3.580381378e-02f, +8.507591921e-02f, -1.311209517e-01f, +1.414047086e-01f, +7.874153946e-01f, +2.427769578e-01f, -1.528426936e-01f, +7.869257321e-02f, -2.120384752e-02f, -1.221621878e-02f, +2.256231169e-02f, -1.804297818e-02f, +8.669289684e-03f, -1.396973100e-03f, -1.588741566e-03f, +1.530486541e-03f, -5.786656170e-04f, - -2.385236352e-03f, +3.815021250e-03f, -2.620010092e-03f, -3.365357199e-03f, +1.378962994e-02f, -2.445110171e-02f, +2.853625253e-02f, -2.042337798e-02f, -7.555539715e-05f, +2.607576830e-02f, -4.631700029e-02f, +5.106511869e-02f, -3.768298238e-02f, +1.227023377e-02f, +1.374943669e-02f, -2.990976672e-02f, +3.190028444e-02f, -2.270057111e-02f, +9.539347567e-03f, +8.147414509e-04f, -5.324881538e-03f, +4.951235646e-03f, -2.594036379e-03f, +6.815946065e-04f, - -2.296942030e-04f, +5.177001582e-04f, -6.680724132e-04f, +1.978996535e-04f, +1.315918267e-03f, -3.728015257e-03f, +5.882290961e-03f, -5.572608642e-03f, -5.747152836e-05f, +1.450554143e-02f, -4.726887393e-02f, -9.631599269e-03f, +5.287124448e-02f, -6.329778800e-03f, -6.531229974e-03f, +8.777579547e-03f, -6.362182872e-03f, +2.808172144e-03f, -1.430531405e-04f, -1.014600524e-03f, +1.025020997e-03f, -5.790976380e-04f, +1.900318896e-04f, -2.349002182e-05f, - +1.895983879e-04f, -6.647781197e-04f, +1.354460665e-03f, -1.838451667e-03f, +1.496872527e-03f, +9.670671648e-05f, -2.737850722e-03f, +5.449394323e-03f, -6.846417259e-03f, +5.883515895e-03f, -2.546845728e-03f, -1.983940869e-03f, +5.872327283e-03f, -7.572090831e-03f, +6.614500504e-03f, -3.765838378e-03f, +4.995911740e-04f, +1.841793810e-03f, -2.670171812e-03f, +2.241152524e-03f, -1.272400915e-03f, +4.272109316e-04f, -5.275240448e-07f, -7.300562037e-05f, - /* 14, 2 (24) */ - +8.653797527e-04f, +5.306171384e-05f, -3.786743738e-03f, +1.007760669e-02f, -1.518636848e-02f, +1.209884266e-02f, +6.204555983e-03f, -4.137642242e-02f, +8.501844769e-02f, -1.166154103e-01f, +9.413583464e-02f, +7.777837954e-01f, +2.956482023e-01f, -1.591724724e-01f, +7.216134324e-02f, -1.242626797e-02f, -1.857840165e-02f, +2.537048384e-02f, -1.818603132e-02f, +7.654689160e-03f, -3.719521032e-04f, -2.167839204e-03f, +1.720518430e-03f, -6.021556389e-04f, - -2.195637964e-03f, +3.150243130e-03f, -1.265549426e-03f, -5.203808866e-03f, +1.528650246e-02f, -2.435439499e-02f, +2.579840181e-02f, -1.497398365e-02f, -6.921972656e-03f, +3.195928419e-02f, -4.886384601e-02f, +4.908117782e-02f, -3.181065509e-02f, +4.698142935e-03f, +2.036393719e-02f, -3.367560509e-02f, +3.239987561e-02f, -2.085877730e-02f, +6.869175755e-03f, +3.055893975e-03f, -6.597282453e-03f, +5.378446577e-03f, -2.594563903e-03f, +6.085889861e-04f, - -2.280151365e-04f, +4.729451409e-04f, -5.275243952e-04f, -6.096256087e-05f, +1.613612465e-03f, -3.833432868e-03f, +5.449791260e-03f, -4.309298463e-03f, -2.085333382e-03f, +1.630831799e-02f, -4.425856157e-02f, -1.589207580e-02f, +5.343672742e-02f, -2.773590470e-03f, -8.732967871e-03f, +9.544290844e-03f, -6.212883448e-03f, +2.309519827e-03f, +3.151529850e-04f, -1.276755037e-03f, +1.108593712e-03f, -5.697741405e-04f, +1.607663332e-04f, -5.572393499e-06f, - +2.323296147e-04f, -6.991129623e-04f, +1.307215183e-03f, -1.614917439e-03f, +1.043612417e-03f, +7.196184886e-04f, -3.328879636e-03f, +5.722793198e-03f, -6.565411707e-03f, +5.002780468e-03f, -1.275853774e-03f, -3.248379155e-03f, +6.719086665e-03f, -7.762013897e-03f, +6.177097633e-03f, -2.957897070e-03f, -3.402831812e-04f, +2.452893712e-03f, -2.958341386e-03f, +2.265980518e-03f, -1.165729588e-03f, +3.058736760e-04f, +7.873939740e-05f, -1.082724704e-04f, - /* 14, 3 (24) */ - +6.373646162e-04f, +5.260068547e-04f, -4.314268133e-03f, +1.001664413e-02f, -1.357275602e-02f, +8.265409788e-03f, +1.165434724e-02f, -4.568572089e-02f, +8.293311430e-02f, -1.003070923e-01f, +4.987727307e-02f, +7.618917196e-01f, +3.490849297e-01f, -1.619460628e-01f, +6.342837536e-02f, -2.881977125e-03f, -2.479128510e-02f, +2.768000367e-02f, -1.787087834e-02f, +6.377934123e-03f, +7.366416088e-04f, -2.737613345e-03f, +1.881284763e-03f, -6.077280324e-04f, - -1.963308349e-03f, +2.451130168e-03f, +4.166575678e-05f, -6.818726304e-03f, +1.633011488e-02f, -2.363477650e-02f, +2.246952217e-02f, -9.251190455e-03f, -1.348738436e-02f, +3.696206466e-02f, -5.013969979e-02f, +4.583279867e-02f, -2.509156843e-02f, -3.063870962e-03f, +2.654103483e-02f, -3.663350216e-02f, +3.205959243e-02f, -1.840588359e-02f, +3.910834368e-03f, +5.321874493e-03f, -7.763012041e-03f, +5.684320253e-03f, -2.515824506e-03f, +5.003165157e-04f, - -2.199403268e-04f, +4.193405584e-04f, -3.831996986e-04f, -3.027704652e-04f, +1.855510616e-03f, -3.840131736e-03f, +4.906380705e-03f, -3.004055559e-03f, -3.957772375e-03f, +1.762857440e-02f, -4.077863748e-02f, -2.191474422e-02f, +5.329763608e-02f, +1.128619274e-03f, -1.084907095e-02f, +1.011202815e-02f, -5.899030074e-03f, +1.726084432e-03f, +7.905880352e-04f, -1.521359334e-03f, +1.168049503e-03f, -5.435847123e-04f, +1.234858063e-04f, +1.519240704e-05f, - +2.639103140e-04f, -7.114217783e-04f, +1.227463238e-03f, -1.359225931e-03f, +5.807375418e-04f, +1.303694875e-03f, -3.817883323e-03f, +5.841843140e-03f, -6.118043611e-03f, +4.000967587e-03f, +2.144504233e-05f, -4.427181083e-03f, +7.393538277e-03f, -7.749978225e-03f, +5.570939039e-03f, -2.056233880e-03f, -1.191860302e-03f, +3.016993660e-03f, -3.177030991e-03f, +2.229271926e-03f, -1.019810357e-03f, +1.666388914e-04f, +1.631210799e-04f, -1.441891318e-04f, - /* 14, 4 (24) */ - +4.174242894e-04f, +9.453474131e-04f, -4.697467831e-03f, +9.713873664e-03f, -1.171724540e-02f, +4.425278052e-03f, +1.656072795e-02f, -4.868977645e-02f, +7.897534193e-02f, -8.267851789e-02f, +9.098635588e-03f, +7.399769753e-01f, +4.023825658e-01f, -1.608174436e-01f, +5.257930441e-02f, +7.230051025e-03f, -3.069031518e-02f, +2.940608810e-02f, -1.708029030e-02f, +4.856574789e-03f, +1.904691112e-03f, -3.281198057e-03f, +2.004770570e-03f, -5.925356253e-04f, - -1.699398035e-03f, +1.739708389e-03f, +1.269128995e-03f, -8.177952236e-03f, +1.691085242e-02f, -2.233108163e-02f, +1.865163885e-02f, -3.409347315e-03f, -1.960542797e-02f, +4.096303225e-02f, -5.011825475e-02f, +4.140561758e-02f, -1.769803015e-02f, -1.081384919e-02f, +3.211197387e-02f, -3.868973605e-02f, +3.086773213e-02f, -1.538888993e-02f, +7.338033779e-04f, +7.551146419e-03f, -8.782822398e-03f, +5.850959145e-03f, -2.352703426e-03f, +3.561273839e-04f, - -2.063215934e-04f, +3.590447885e-04f, -2.391125561e-04f, -5.223964905e-04f, +2.038559404e-03f, -3.752824417e-03f, +4.270459943e-03f, -1.689860357e-03f, -5.639772262e-03f, +1.846815019e-02f, -3.690087026e-02f, -2.761056983e-02f, +5.243909801e-02f, +5.322044051e-03f, -1.282455890e-02f, +1.045667966e-02f, -5.420417328e-03f, +1.068532108e-03f, +1.271769104e-03f, -1.740829624e-03f, +1.200109457e-03f, -4.999409963e-04f, +7.858648557e-05f, +3.836696312e-05f, - +2.843338474e-04f, -7.028995985e-04f, +1.119271557e-03f, -1.079817832e-03f, +1.210024769e-04f, +1.834675153e-03f, -4.194580265e-03f, +5.806538111e-03f, -5.518597552e-03f, +2.905665496e-03f, +1.310758344e-03f, -5.489339666e-03f, +7.877199504e-03f, -7.534579195e-03f, +4.809909646e-03f, -1.083275426e-03f, -2.032417264e-03f, +3.517270216e-03f, -3.317589185e-03f, +2.129245120e-03f, -8.366734445e-04f, +1.248540587e-05f, +2.502874884e-04f, -1.794099129e-04f, - /* 14, 5 (24) */ - +2.111026960e-04f, +1.304392202e-03f, -4.936580387e-03f, +9.191477174e-03f, -9.678686000e-03f, +6.724536350e-04f, +2.083118789e-02f, -5.037963680e-02f, +7.333556967e-02f, -6.421036770e-02f, -2.780223467e-02f, +7.123664055e-01f, +4.548216638e-01f, -1.554953995e-01f, +3.975474551e-02f, +1.768673068e-02f, -3.611073250e-02f, +3.047462021e-02f, -1.580852120e-02f, +3.115745165e-03f, +3.104800569e-03f, -3.781139053e-03f, +2.083357055e-03f, -5.541686622e-04f, - -1.415064188e-03f, +1.036808791e-03f, +2.388400552e-03f, -9.257770068e-03f, +1.703185490e-02f, -2.049640647e-02f, +1.445705859e-02f, +2.397190796e-03f, -2.512402553e-02f, +4.386869774e-02f, -4.880749640e-02f, +3.591627792e-02f, -9.820830647e-03f, -1.834842838e-02f, +3.692188351e-02f, -3.977301147e-02f, +2.883531487e-02f, -1.187161971e-02f, -2.583785807e-03f, +9.680391539e-03f, -9.619495843e-03f, +5.863444550e-03f, -2.102415937e-03f, +1.767174710e-04f, - -1.881063229e-04f, +2.942415176e-04f, -9.900943164e-05f, -7.155806731e-04f, +2.161347921e-03f, -3.578319218e-03f, +3.561819960e-03f, -3.983865162e-04f, -7.102281534e-03f, +1.883819573e-02f, -3.270213392e-02f, -3.289645832e-02f, +5.085849094e-02f, +9.744198089e-03f, -1.460476992e-02f, +1.055838807e-02f, -4.780976087e-03f, +3.499684045e-04f, +1.746451132e-03f, -1.927817022e-03f, +1.202043232e-03f, -4.387216515e-04f, +2.674218979e-05f, +6.337976002e-05f, - +2.939567081e-04f, -6.752806722e-04f, +9.872889198e-04f, -7.854012498e-04f, -3.234111461e-04f, +2.300178650e-03f, -4.451958631e-03f, +5.620988892e-03f, -4.785190304e-03f, +1.746665795e-03f, +2.558198391e-03f, -6.406988049e-03f, +8.156619703e-03f, -7.119855075e-03f, +3.912250990e-03f, -6.379111213e-05f, -2.838994060e-03f, +3.938165215e-03f, -3.373241701e-03f, +1.965853133e-03f, -6.195565658e-04f, -1.529512225e-04f, +3.376273295e-04f, -2.124853822e-04f, - /* 14, 6 (24) */ - +2.299637308e-05f, +1.598633719e-03f, -5.035589819e-03f, +8.475896501e-03f, -7.517338080e-03f, -2.905865583e-03f, +2.439300785e-02f, -5.077802332e-02f, +6.623328813e-02f, -4.537217197e-02f, -6.050436860e-02f, +6.794699472e-01f, +5.056801548e-01f, -1.457512014e-01f, +2.514997559e-02f, +2.824511876e-02f, -4.089170859e-02f, +3.082458861e-02f, -1.406207007e-02f, +1.187928143e-03f, +4.306843801e-03f, -4.219860705e-03f, +2.110099245e-03f, -4.907889022e-04f, - -1.121107480e-03f, +3.615281186e-04f, +3.375689472e-03f, -1.004317132e-02f, +1.670844375e-02f, -1.819622782e-02f, +1.000509996e-02f, +8.018179688e-03f, -2.990921583e-02f, +4.561536354e-02f, -4.624929801e-02f, +2.950928987e-02f, -1.664210943e-03f, -2.546828346e-02f, +4.083413450e-02f, -3.983680258e-02f, +2.599632081e-02f, -7.933454500e-03f, -5.957027508e-03f, +1.164624467e-02f, -1.023905241e-02f, +5.710493328e-03f, -1.764788608e-03f, -3.576791121e-05f, - -1.663004619e-04f, +2.270758033e-04f, +3.371534696e-05f, -8.789930218e-04f, +2.224059472e-03f, -3.325251180e-03f, +2.801098213e-03f, +8.406867828e-04f, -8.322595745e-03f, +1.875861989e-02f, -2.826285741e-02f, -3.769674486e-02f, +4.856565455e-02f, +1.432593212e-02f, -1.613657197e-02f, +1.040222318e-02f, -3.988867217e-03f, -4.142819333e-04f, +2.201911573e-03f, -2.075420816e-03f, +1.171780626e-03f, -3.603093442e-04f, -3.109446220e-05f, +8.953355461e-05f, - +2.934599765e-04f, -6.307516765e-04f, +8.365804647e-04f, -4.846945877e-04f, -7.412100054e-04f, +2.689984773e-03f, -4.586383843e-03f, +5.293229868e-03f, -3.939225526e-03f, +5.551395866e-04f, +3.731191371e-03f, -7.156146625e-03f, +8.223760593e-03f, -6.515221178e-03f, +2.900119811e-03f, +9.757447888e-04f, -3.589023653e-03f, +4.265858037e-03f, -3.339350534e-03f, +1.740859169e-03f, -3.728699214e-04f, -3.254523762e-04f, +4.223156568e-04f, -2.419088112e-04f, - /* 14, 7 (24) */ - -1.433040888e-04f, +1.825709523e-03f, -5.001874472e-03f, +7.596903479e-03f, -5.293278608e-03f, -6.231116763e-03f, +2.719410607e-02f, -4.993733654e-02f, +5.791069239e-02f, -2.661355209e-02f, -8.876722601e-02f, +6.417732023e-01f, +5.542458093e-01f, -1.314252693e-01f, +9.013403621e-03f, +3.864734193e-02f, -4.488057581e-02f, +3.041030668e-02f, -1.186015849e-02f, -8.874926734e-04f, +5.478624427e-03f, -4.580170049e-03f, +2.079004783e-03f, -4.012553476e-04f, - -8.276475031e-04f, -2.692235579e-04f, +4.212269937e-03f, -1.052786591e-02f, +1.596723375e-02f, -1.550624305e-02f, +5.418716112e-03f, +1.331140956e-02f, -3.384844136e-02f, +4.617050312e-02f, -4.251810664e-02f, +2.235314324e-02f, +6.559549650e-03f, -3.198350464e-02f, +4.373425431e-02f, -3.886105779e-02f, +2.240729715e-02f, -3.667596463e-03f, -9.296378042e-03f, +1.338710384e-02f, -1.061192233e-02f, +5.385040952e-03f, -1.342472951e-03f, -2.776767224e-04f, - -1.419324060e-04f, +1.595955440e-04f, +1.560892182e-04f, -1.010267922e-03f, +2.228384839e-03f, -3.003779716e-03f, +2.009237805e-03f, +2.000287046e-03f, -9.284584834e-03f, +1.825737275e-02f, -2.366543217e-02f, -4.194453342e-02f, +4.558285961e-02f, +1.899261112e-02f, -1.736958296e-02f, +9.978765621e-03f, -3.056473684e-03f, -1.206962806e-03f, +2.625262015e-03f, -2.177401096e-03f, +1.108011130e-03f, -2.656152047e-04f, -9.369971631e-05f, +1.160188528e-04f, - +2.838025508e-04f, -5.718561002e-04f, +6.724581781e-04f, -1.861802865e-04f, -1.122267980e-03f, +2.996244631e-03f, -4.597610676e-03f, +4.834922423e-03f, -3.004767072e-03f, -6.372154555e-04f, +4.799345772e-03f, -7.717363403e-03f, +8.076230191e-03f, -5.735256233e-03f, +1.799033355e-03f, +2.007849367e-03f, -4.260965174e-03f, +4.488701900e-03f, -3.213620378e-03f, +1.457861926e-03f, -1.021238617e-04f, -5.003128371e-04f, +5.013932930e-04f, -2.661682299e-04f, - /* 14, 8 (24) */ - -2.852364948e-04f, +1.985305067e-03f, -4.845785254e-03f, +6.586635557e-03f, -3.064893769e-03f, -9.234896479e-03f, +2.920334387e-02f, -4.793704949e-02f, +4.862610755e-02f, -8.356179335e-03f, -1.124326582e-01f, +5.998286689e-01f, +5.998286689e-01f, -1.124326582e-01f, -8.356179335e-03f, +4.862610755e-02f, -4.793704949e-02f, +2.920334387e-02f, -9.234896479e-03f, -3.064893769e-03f, +6.586635557e-03f, -4.845785254e-03f, +1.985305067e-03f, -2.852364948e-04f, - -5.438449523e-04f, -8.410796581e-04f, +4.884728115e-03f, -1.071404619e-02f, +1.484496577e-02f, -1.250999842e-02f, +8.211054363e-04f, +1.814633198e-02f, -3.685320843e-02f, +4.553328767e-02f, -3.771876087e-02f, +1.463577984e-02f, +1.463577984e-02f, -3.771876087e-02f, +4.553328767e-02f, -3.685320843e-02f, +1.814633198e-02f, +8.211054363e-04f, -1.250999842e-02f, +1.484496577e-02f, -1.071404619e-02f, +4.884728115e-03f, -8.410796581e-04f, -5.438449523e-04f, - -1.160188528e-04f, +9.369971631e-05f, +2.656152047e-04f, -1.108011130e-03f, +2.177401096e-03f, -2.625262015e-03f, +1.206962806e-03f, +3.056473684e-03f, -9.978765621e-03f, +1.736958296e-02f, -1.899261112e-02f, -4.558285961e-02f, +4.194453342e-02f, +2.366543217e-02f, -1.825737275e-02f, +9.284584834e-03f, -2.000287046e-03f, -2.009237805e-03f, +3.003779716e-03f, -2.228384839e-03f, +1.010267922e-03f, -1.560892182e-04f, -1.595955440e-04f, +1.419324060e-04f, - +2.661682299e-04f, -5.013932930e-04f, +5.003128371e-04f, +1.021238617e-04f, -1.457861926e-03f, +3.213620378e-03f, -4.488701900e-03f, +4.260965174e-03f, -2.007849367e-03f, -1.799033355e-03f, +5.735256233e-03f, -8.076230191e-03f, +7.717363403e-03f, -4.799345772e-03f, +6.372154555e-04f, +3.004767072e-03f, -4.834922423e-03f, +4.597610676e-03f, -2.996244631e-03f, +1.122267980e-03f, +1.861802865e-04f, -6.724581781e-04f, +5.718561002e-04f, -2.838025508e-04f, - /* 14, 9 (24) */ - -4.012553476e-04f, +2.079004783e-03f, -4.580170049e-03f, +5.478624427e-03f, -8.874926734e-04f, -1.186015849e-02f, +3.041030668e-02f, -4.488057581e-02f, +3.864734193e-02f, +9.013403621e-03f, -1.314252693e-01f, +5.542458093e-01f, +6.417732023e-01f, -8.876722601e-02f, -2.661355209e-02f, +5.791069239e-02f, -4.993733654e-02f, +2.719410607e-02f, -6.231116763e-03f, -5.293278608e-03f, +7.596903479e-03f, -5.001874472e-03f, +1.825709523e-03f, -1.433040888e-04f, - -2.776767224e-04f, -1.342472951e-03f, +5.385040952e-03f, -1.061192233e-02f, +1.338710384e-02f, -9.296378042e-03f, -3.667596463e-03f, +2.240729715e-02f, -3.886105779e-02f, +4.373425431e-02f, -3.198350464e-02f, +6.559549650e-03f, +2.235314324e-02f, -4.251810664e-02f, +4.617050312e-02f, -3.384844136e-02f, +1.331140956e-02f, +5.418716112e-03f, -1.550624305e-02f, +1.596723375e-02f, -1.052786591e-02f, +4.212269937e-03f, -2.692235579e-04f, -8.276475031e-04f, - -8.953355461e-05f, +3.109446220e-05f, +3.603093442e-04f, -1.171780626e-03f, +2.075420816e-03f, -2.201911573e-03f, +4.142819333e-04f, +3.988867217e-03f, -1.040222318e-02f, +1.613657197e-02f, -1.432593212e-02f, -4.856565455e-02f, +3.769674486e-02f, +2.826285741e-02f, -1.875861989e-02f, +8.322595745e-03f, -8.406867828e-04f, -2.801098213e-03f, +3.325251180e-03f, -2.224059472e-03f, +8.789930218e-04f, -3.371534696e-05f, -2.270758033e-04f, +1.663004619e-04f, - +2.419088112e-04f, -4.223156568e-04f, +3.254523762e-04f, +3.728699214e-04f, -1.740859169e-03f, +3.339350534e-03f, -4.265858037e-03f, +3.589023653e-03f, -9.757447888e-04f, -2.900119811e-03f, +6.515221178e-03f, -8.223760593e-03f, +7.156146625e-03f, -3.731191371e-03f, -5.551395866e-04f, +3.939225526e-03f, -5.293229868e-03f, +4.586383843e-03f, -2.689984773e-03f, +7.412100054e-04f, +4.846945877e-04f, -8.365804647e-04f, +6.307516765e-04f, -2.934599765e-04f, - /* 14,10 (24) */ - -4.907889022e-04f, +2.110099245e-03f, -4.219860705e-03f, +4.306843801e-03f, +1.187928143e-03f, -1.406207007e-02f, +3.082458861e-02f, -4.089170859e-02f, +2.824511876e-02f, +2.514997559e-02f, -1.457512014e-01f, +5.056801548e-01f, +6.794699472e-01f, -6.050436860e-02f, -4.537217197e-02f, +6.623328813e-02f, -5.077802332e-02f, +2.439300785e-02f, -2.905865583e-03f, -7.517338080e-03f, +8.475896501e-03f, -5.035589819e-03f, +1.598633719e-03f, +2.299637308e-05f, - -3.576791121e-05f, -1.764788608e-03f, +5.710493328e-03f, -1.023905241e-02f, +1.164624467e-02f, -5.957027508e-03f, -7.933454500e-03f, +2.599632081e-02f, -3.983680258e-02f, +4.083413450e-02f, -2.546828346e-02f, -1.664210943e-03f, +2.950928987e-02f, -4.624929801e-02f, +4.561536354e-02f, -2.990921583e-02f, +8.018179688e-03f, +1.000509996e-02f, -1.819622782e-02f, +1.670844375e-02f, -1.004317132e-02f, +3.375689472e-03f, +3.615281186e-04f, -1.121107480e-03f, - -6.337976002e-05f, -2.674218979e-05f, +4.387216515e-04f, -1.202043232e-03f, +1.927817022e-03f, -1.746451132e-03f, -3.499684045e-04f, +4.780976087e-03f, -1.055838807e-02f, +1.460476992e-02f, -9.744198089e-03f, -5.085849094e-02f, +3.289645832e-02f, +3.270213392e-02f, -1.883819573e-02f, +7.102281534e-03f, +3.983865162e-04f, -3.561819960e-03f, +3.578319218e-03f, -2.161347921e-03f, +7.155806731e-04f, +9.900943164e-05f, -2.942415176e-04f, +1.881063229e-04f, - +2.124853822e-04f, -3.376273295e-04f, +1.529512225e-04f, +6.195565658e-04f, -1.965853133e-03f, +3.373241701e-03f, -3.938165215e-03f, +2.838994060e-03f, +6.379111213e-05f, -3.912250990e-03f, +7.119855075e-03f, -8.156619703e-03f, +6.406988049e-03f, -2.558198391e-03f, -1.746665795e-03f, +4.785190304e-03f, -5.620988892e-03f, +4.451958631e-03f, -2.300178650e-03f, +3.234111461e-04f, +7.854012498e-04f, -9.872889198e-04f, +6.752806722e-04f, -2.939567081e-04f, - /* 14,11 (24) */ - -5.541686622e-04f, +2.083357055e-03f, -3.781139053e-03f, +3.104800569e-03f, +3.115745165e-03f, -1.580852120e-02f, +3.047462021e-02f, -3.611073250e-02f, +1.768673068e-02f, +3.975474551e-02f, -1.554953995e-01f, +4.548216638e-01f, +7.123664055e-01f, -2.780223467e-02f, -6.421036770e-02f, +7.333556967e-02f, -5.037963680e-02f, +2.083118789e-02f, +6.724536350e-04f, -9.678686000e-03f, +9.191477174e-03f, -4.936580387e-03f, +1.304392202e-03f, +2.111026960e-04f, - +1.767174710e-04f, -2.102415937e-03f, +5.863444550e-03f, -9.619495843e-03f, +9.680391539e-03f, -2.583785807e-03f, -1.187161971e-02f, +2.883531487e-02f, -3.977301147e-02f, +3.692188351e-02f, -1.834842838e-02f, -9.820830647e-03f, +3.591627792e-02f, -4.880749640e-02f, +4.386869774e-02f, -2.512402553e-02f, +2.397190796e-03f, +1.445705859e-02f, -2.049640647e-02f, +1.703185490e-02f, -9.257770068e-03f, +2.388400552e-03f, +1.036808791e-03f, -1.415064188e-03f, - -3.836696312e-05f, -7.858648557e-05f, +4.999409963e-04f, -1.200109457e-03f, +1.740829624e-03f, -1.271769104e-03f, -1.068532108e-03f, +5.420417328e-03f, -1.045667966e-02f, +1.282455890e-02f, -5.322044051e-03f, -5.243909801e-02f, +2.761056983e-02f, +3.690087026e-02f, -1.846815019e-02f, +5.639772262e-03f, +1.689860357e-03f, -4.270459943e-03f, +3.752824417e-03f, -2.038559404e-03f, +5.223964905e-04f, +2.391125561e-04f, -3.590447885e-04f, +2.063215934e-04f, - +1.794099129e-04f, -2.502874884e-04f, -1.248540587e-05f, +8.366734445e-04f, -2.129245120e-03f, +3.317589185e-03f, -3.517270216e-03f, +2.032417264e-03f, +1.083275426e-03f, -4.809909646e-03f, +7.534579195e-03f, -7.877199504e-03f, +5.489339666e-03f, -1.310758344e-03f, -2.905665496e-03f, +5.518597552e-03f, -5.806538111e-03f, +4.194580265e-03f, -1.834675153e-03f, -1.210024769e-04f, +1.079817832e-03f, -1.119271557e-03f, +7.028995985e-04f, -2.843338474e-04f, - /* 14,12 (24) */ - -5.925356253e-04f, +2.004770570e-03f, -3.281198057e-03f, +1.904691112e-03f, +4.856574789e-03f, -1.708029030e-02f, +2.940608810e-02f, -3.069031518e-02f, +7.230051025e-03f, +5.257930441e-02f, -1.608174436e-01f, +4.023825658e-01f, +7.399769753e-01f, +9.098635588e-03f, -8.267851789e-02f, +7.897534193e-02f, -4.868977645e-02f, +1.656072795e-02f, +4.425278052e-03f, -1.171724540e-02f, +9.713873664e-03f, -4.697467831e-03f, +9.453474131e-04f, +4.174242894e-04f, - +3.561273839e-04f, -2.352703426e-03f, +5.850959145e-03f, -8.782822398e-03f, +7.551146419e-03f, +7.338033779e-04f, -1.538888993e-02f, +3.086773213e-02f, -3.868973605e-02f, +3.211197387e-02f, -1.081384919e-02f, -1.769803015e-02f, +4.140561758e-02f, -5.011825475e-02f, +4.096303225e-02f, -1.960542797e-02f, -3.409347315e-03f, +1.865163885e-02f, -2.233108163e-02f, +1.691085242e-02f, -8.177952236e-03f, +1.269128995e-03f, +1.739708389e-03f, -1.699398035e-03f, - -1.519240704e-05f, -1.234858063e-04f, +5.435847123e-04f, -1.168049503e-03f, +1.521359334e-03f, -7.905880352e-04f, -1.726084432e-03f, +5.899030074e-03f, -1.011202815e-02f, +1.084907095e-02f, -1.128619274e-03f, -5.329763608e-02f, +2.191474422e-02f, +4.077863748e-02f, -1.762857440e-02f, +3.957772375e-03f, +3.004055559e-03f, -4.906380705e-03f, +3.840131736e-03f, -1.855510616e-03f, +3.027704652e-04f, +3.831996986e-04f, -4.193405584e-04f, +2.199403268e-04f, - +1.441891318e-04f, -1.631210799e-04f, -1.666388914e-04f, +1.019810357e-03f, -2.229271926e-03f, +3.177030991e-03f, -3.016993660e-03f, +1.191860302e-03f, +2.056233880e-03f, -5.570939039e-03f, +7.749978225e-03f, -7.393538277e-03f, +4.427181083e-03f, -2.144504233e-05f, -4.000967587e-03f, +6.118043611e-03f, -5.841843140e-03f, +3.817883323e-03f, -1.303694875e-03f, -5.807375418e-04f, +1.359225931e-03f, -1.227463238e-03f, +7.114217783e-04f, -2.639103140e-04f, - /* 14,13 (24) */ - -6.077280324e-04f, +1.881284763e-03f, -2.737613345e-03f, +7.366416088e-04f, +6.377934123e-03f, -1.787087834e-02f, +2.768000367e-02f, -2.479128510e-02f, -2.881977125e-03f, +6.342837536e-02f, -1.619460628e-01f, +3.490849297e-01f, +7.618917196e-01f, +4.987727307e-02f, -1.003070923e-01f, +8.293311430e-02f, -4.568572089e-02f, +1.165434724e-02f, +8.265409788e-03f, -1.357275602e-02f, +1.001664413e-02f, -4.314268133e-03f, +5.260068547e-04f, +6.373646162e-04f, - +5.003165157e-04f, -2.515824506e-03f, +5.684320253e-03f, -7.763012041e-03f, +5.321874493e-03f, +3.910834368e-03f, -1.840588359e-02f, +3.205959243e-02f, -3.663350216e-02f, +2.654103483e-02f, -3.063870962e-03f, -2.509156843e-02f, +4.583279867e-02f, -5.013969979e-02f, +3.696206466e-02f, -1.348738436e-02f, -9.251190455e-03f, +2.246952217e-02f, -2.363477650e-02f, +1.633011488e-02f, -6.818726304e-03f, +4.166575678e-05f, +2.451130168e-03f, -1.963308349e-03f, - +5.572393499e-06f, -1.607663332e-04f, +5.697741405e-04f, -1.108593712e-03f, +1.276755037e-03f, -3.151529850e-04f, -2.309519827e-03f, +6.212883448e-03f, -9.544290844e-03f, +8.732967871e-03f, +2.773590470e-03f, -5.343672742e-02f, +1.589207580e-02f, +4.425856157e-02f, -1.630831799e-02f, +2.085333382e-03f, +4.309298463e-03f, -5.449791260e-03f, +3.833432868e-03f, -1.613612465e-03f, +6.096256087e-05f, +5.275243952e-04f, -4.729451409e-04f, +2.280151365e-04f, - +1.082724704e-04f, -7.873939740e-05f, -3.058736760e-04f, +1.165729588e-03f, -2.265980518e-03f, +2.958341386e-03f, -2.452893712e-03f, +3.402831812e-04f, +2.957897070e-03f, -6.177097633e-03f, +7.762013897e-03f, -6.719086665e-03f, +3.248379155e-03f, +1.275853774e-03f, -5.002780468e-03f, +6.565411707e-03f, -5.722793198e-03f, +3.328879636e-03f, -7.196184886e-04f, -1.043612417e-03f, +1.614917439e-03f, -1.307215183e-03f, +6.991129623e-04f, -2.323296147e-04f, - /* 14,14 (24) */ - -6.021556389e-04f, +1.720518430e-03f, -2.167839204e-03f, -3.719521032e-04f, +7.654689160e-03f, -1.818603132e-02f, +2.537048384e-02f, -1.857840165e-02f, -1.242626797e-02f, +7.216134324e-02f, -1.591724724e-01f, +2.956482023e-01f, +7.777837954e-01f, +9.413583464e-02f, -1.166154103e-01f, +8.501844769e-02f, -4.137642242e-02f, +6.204555983e-03f, +1.209884266e-02f, -1.518636848e-02f, +1.007760669e-02f, -3.786743738e-03f, +5.306171384e-05f, +8.653797527e-04f, - +6.085889861e-04f, -2.594563903e-03f, +5.378446577e-03f, -6.597282453e-03f, +3.055893975e-03f, +6.869175755e-03f, -2.085877730e-02f, +3.239987561e-02f, -3.367560509e-02f, +2.036393719e-02f, +4.698142935e-03f, -3.181065509e-02f, +4.908117782e-02f, -4.886384601e-02f, +3.195928419e-02f, -6.921972656e-03f, -1.497398365e-02f, +2.579840181e-02f, -2.435439499e-02f, +1.528650246e-02f, -5.203808866e-03f, -1.265549426e-03f, +3.150243130e-03f, -2.195637964e-03f, - +2.349002182e-05f, -1.900318896e-04f, +5.790976380e-04f, -1.025020997e-03f, +1.014600524e-03f, +1.430531405e-04f, -2.808172144e-03f, +6.362182872e-03f, -8.777579547e-03f, +6.531229974e-03f, +6.329778800e-03f, -5.287124448e-02f, +9.631599269e-03f, +4.726887393e-02f, -1.450554143e-02f, +5.747152836e-05f, +5.572608642e-03f, -5.882290961e-03f, +3.728015257e-03f, -1.315918267e-03f, -1.978996535e-04f, +6.680724132e-04f, -5.177001582e-04f, +2.296942030e-04f, - +7.300562037e-05f, +5.275240448e-07f, -4.272109316e-04f, +1.272400915e-03f, -2.241152524e-03f, +2.670171812e-03f, -1.841793810e-03f, -4.995911740e-04f, +3.765838378e-03f, -6.614500504e-03f, +7.572090831e-03f, -5.872327283e-03f, +1.983940869e-03f, +2.546845728e-03f, -5.883515895e-03f, +6.846417259e-03f, -5.449394323e-03f, +2.737850722e-03f, -9.670671648e-05f, -1.496872527e-03f, +1.838451667e-03f, -1.354460665e-03f, +6.647781197e-04f, -1.895983879e-04f, - /* 14,15 (24) */ - -5.786656170e-04f, +1.530486541e-03f, -1.588741566e-03f, -1.396973100e-03f, +8.669289684e-03f, -1.804297818e-02f, +2.256231169e-02f, -1.221621878e-02f, -2.120384752e-02f, +7.869257321e-02f, -1.528426936e-01f, +2.427769578e-01f, +7.874153946e-01f, +1.414047086e-01f, -1.311209517e-01f, +8.507591921e-02f, -3.580381378e-02f, +3.222650227e-04f, +1.582685791e-02f, -1.650228675e-02f, +9.879707037e-03f, -3.118671324e-03f, -4.646384443e-04f, +1.095073956e-03f, - +6.815946065e-04f, -2.594036379e-03f, +4.951235646e-03f, -5.324881538e-03f, +8.147414509e-04f, +9.539347567e-03f, -2.270057111e-02f, +3.190028444e-02f, -2.990976672e-02f, +1.374943669e-02f, +1.227023377e-02f, -3.768298238e-02f, +5.106511869e-02f, -4.631700029e-02f, +2.607576830e-02f, -7.555539715e-05f, -2.042337798e-02f, +2.853625253e-02f, -2.445110171e-02f, +1.378962994e-02f, -3.365357199e-03f, -2.620010092e-03f, +3.815021250e-03f, -2.385236352e-03f, - +3.826050238e-05f, -2.111545745e-04f, +5.725628529e-04f, -9.210389417e-04f, +7.425062231e-04f, +5.735612965e-04f, -3.213964647e-03f, +6.351081144e-03f, -7.839517914e-03f, +4.297979908e-03f, +9.493654979e-03f, -5.162786239e-02f, +3.226680462e-03f, +4.974438686e-02f, -1.222808687e-02f, -2.085366097e-03f, +6.760448353e-03f, -6.187402659e-03f, +3.521489134e-03f, -9.671301358e-04f, -4.679111297e-04f, +8.006592829e-04f, -5.515402691e-04f, +2.242580105e-04f, - +3.959096234e-05f, +7.268521485e-05f, -5.283783837e-04f, +1.338999949e-03f, -2.158182611e-03f, +2.322748136e-03f, -1.201288539e-03f, -1.305886445e-03f, +4.460536991e-03f, -6.873936703e-03f, +7.186973906e-03f, -4.876258793e-03f, +6.671799512e-04f, +3.757759117e-03f, -6.618560623e-03f, +6.951055384e-03f, -5.025851749e-03f, +2.058145461e-03f, +5.492420567e-04f, -1.927534233e-03f, +2.021916039e-03f, -1.365871498e-03f, +6.078360122e-04f, -1.361148124e-04f, - /* 15, 0 (24) */ - -1.202019198e-03f, +3.406678548e-03f, -6.303893631e-03f, +8.068354747e-03f, -5.607321184e-03f, -4.553512604e-03f, +2.472926036e-02f, -5.449259515e-02f, +8.986605310e-02f, -1.238918309e-01f, +1.485898543e-01f, +8.423743737e-01f, +1.485898543e-01f, -1.238918309e-01f, +8.986605310e-02f, -5.449259515e-02f, +2.472926036e-02f, -4.553512604e-03f, -5.607321184e-03f, +8.068354747e-03f, -6.303893631e-03f, +3.406678548e-03f, -1.202019198e-03f, +1.807804541e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -8.814319808e-05f, -5.629574316e-05f, +5.652122150e-04f, -1.554004909e-03f, +2.894664369e-03f, -4.070731190e-03f, +4.129257199e-03f, -1.734596604e-03f, -4.865689287e-03f, +1.884664750e-02f, -5.350214598e-02f, -3.893860413e-03f, +5.650412118e-02f, -1.668062888e-02f, +2.575956794e-03f, +3.378980922e-03f, -5.045194700e-03f, +4.415253187e-03f, -2.896309433e-03f, +1.415676388e-03f, -4.179610069e-04f, -4.418446917e-05f, +1.384693596e-04f, -7.785146472e-05f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 1 (24) */ - -1.290162396e-03f, +3.350382805e-03f, -5.738681416e-03f, +6.514349838e-03f, -2.712656815e-03f, -8.624243794e-03f, +2.885851756e-02f, -5.622719176e-02f, +8.500036382e-02f, -1.050451834e-01f, +9.508770829e-02f, +8.384805133e-01f, +2.050939754e-01f, -1.405724598e-01f, +9.244200990e-02f, -5.111361423e-02f, +1.968406566e-02f, -1.382594172e-04f, -8.503630616e-03f, +9.484031135e-03f, -6.721854638e-03f, +3.362494079e-03f, -1.063549838e-03f, +1.029289894e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.009581509e-05f, -1.470779616e-04f, +6.863882519e-04f, -1.640552014e-03f, +2.812790794e-03f, -3.631308541e-03f, +3.144440238e-03f, -1.232143192e-04f, -6.903888787e-03f, +2.038905732e-02f, -4.981571966e-02f, -1.161554014e-02f, +5.874357177e-02f, -1.390186963e-02f, +8.327052965e-05f, +5.011741168e-03f, -5.862591698e-03f, +4.649965954e-03f, -2.813224953e-03f, +1.226552000e-03f, -2.473799188e-04f, -1.518867064e-04f, +1.895043655e-04f, -9.649564219e-05f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 2 (24) */ - -1.330258211e-03f, +3.203304844e-03f, -5.052293164e-03f, +4.873797825e-03f, +1.001339790e-04f, -1.225555233e-02f, +3.200295779e-02f, -5.635040608e-02f, +7.809647503e-02f, -8.465612610e-02f, +4.527198863e-02f, +8.268649732e-01f, +2.638375472e-01f, -1.544743294e-01f, +9.252528043e-02f, -4.610187306e-02f, +1.382147396e-02f, +4.511706537e-03f, -1.131685557e-02f, +1.071058314e-02f, -6.969234557e-03f, +3.210607373e-03f, -8.740454728e-04f, +6.433347233e-06f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.314478209e-06f, -2.261678214e-04f, +7.796907880e-04f, -1.675879999e-03f, +2.657224881e-03f, -3.113814380e-03f, +2.120911624e-03f, +1.413494736e-03f, -8.650745090e-03f, +2.131109846e-02f, -4.553441535e-02f, -1.914045496e-02f, +6.015581409e-02f, -1.053560437e-02f, -2.555870238e-03f, +6.586393774e-03f, -6.553166629e-03f, +4.762413539e-03f, -2.643188401e-03f, +9.892254810e-04f, -5.713587572e-05f, -2.639004645e-04f, +2.395057305e-04f, -1.138448639e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 3 (24) */ - -1.325943733e-03f, +2.977137022e-03f, -4.272602376e-03f, +3.197917825e-03f, +2.757358860e-03f, -1.536936671e-02f, +3.412386942e-02f, -5.493691134e-02f, +6.944572994e-02f, -6.334502763e-02f, -2.624267216e-04f, +8.077245182e-01f, +3.239933613e-01f, -1.650099338e-01f, +8.996941019e-02f, -3.951547929e-02f, +7.268307330e-03f, +9.274120075e-03f, -1.396004397e-02f, +1.169980862e-02f, -7.026370432e-03f, +2.946706908e-03f, -6.345397422e-04f, -1.074115167e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.396998716e-05f, -2.920812198e-04f, +8.442635397e-04f, -1.661996396e-03f, +2.436248157e-03f, -2.536436861e-03f, +1.088497382e-03f, +2.837787581e-03f, -1.007581599e-02f, +2.162954199e-02f, -4.075719244e-02f, -2.634192530e-02f, +6.069117436e-02f, -6.621358951e-03f, -5.278131914e-03f, +8.055794269e-03f, -7.090890376e-03f, +4.743078092e-03f, -2.386442955e-03f, +7.079125913e-04f, +1.482391463e-04f, -3.769458208e-04f, +2.866068862e-04f, -1.289967247e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 4 (24) */ - -1.281973746e-03f, +2.685055802e-03f, -3.428338836e-03f, +1.535921429e-03f, +5.193607018e-03f, -1.790580358e-02f, +3.521236680e-02f, -5.209912376e-02f, +5.936991395e-02f, -4.171548565e-02f, -4.101961916e-02f, +7.813825929e-01f, +3.846845357e-01f, -1.716312928e-01f, +8.469127828e-02f, -3.145968502e-02f, +1.774169543e-04f, +1.401719817e-02f, -1.634648693e-02f, +1.240772121e-02f, -6.878131286e-03f, +2.569761087e-03f, -3.479328561e-04f, -2.364082414e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +7.801225401e-05f, -3.438548100e-04f, +8.801590009e-04f, -1.602214322e-03f, +2.159561881e-03f, -1.918149264e-03f, +7.587967839e-05f, +4.116677753e-03f, -1.115836981e-02f, +2.137381569e-02f, -3.559011192e-02f, -3.309990950e-02f, +6.031629751e-02f, -2.212535144e-03f, -8.014649254e-03f, +9.373404232e-03f, -7.452834591e-03f, +4.585802324e-03f, -2.045820081e-03f, +3.884154965e-04f, +3.634360127e-04f, -4.874555904e-04f, +3.288739740e-04f, -1.410429498e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 5 (24) */ - -1.203961492e-03f, +2.341200992e-03f, -2.548179835e-03f, -6.629289359e-05f, +7.353168899e-03f, -1.982395284e-02f, +3.528824648e-02f, -4.798244601e-02f, +4.821154414e-02f, -2.034166996e-02f, -7.660973108e-02f, +7.482826834e-01f, +4.450008332e-01f, -1.738438279e-01f, +7.667662902e-02f, -2.208628079e-02f, -7.275417637e-03f, +1.860300049e-02f, -1.839230701e-02f, +1.279613670e-02f, -6.514695273e-03f, +2.082305497e-03f, -1.905888210e-05f, -3.774511912e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.058503852e-04f, -3.810391546e-04f, +8.882794882e-04f, -1.500981923e-03f, +1.837936775e-03f, -1.278140567e-03f, -8.901386714e-04f, +5.222602376e-03f, -1.188747184e-02f, +2.058486152e-02f, -3.014393553e-02f, -3.930344637e-02f, +5.901511065e-02f, +2.624343014e-03f, -1.069251893e-02f, +1.049459696e-02f, -7.619970147e-03f, +4.288133619e-03f, -1.626790569e-03f, +3.803611168e-05f, +5.824866660e-04f, -5.916728740e-04f, +3.643695193e-04f, -1.491056222e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 6 (24) */ - -1.098111107e-03f, +1.960161838e-03f, -1.659900347e-03f, -1.567274816e-03f, +9.191105673e-03f, -2.110209341e-02f, +3.439810781e-02f, -4.275984363e-02f, +3.632407230e-02f, +2.431915639e-04f, -1.067536666e-01f, +7.089792371e-01f, +5.040159438e-01f, -1.712194849e-01f, +6.598411010e-02f, -1.159168383e-02f, -1.489538778e-02f, +2.289113411e-02f, -2.001909758e-02f, +1.283417282e-02f, -5.932208607e-03f, +1.490632623e-03f, +3.453106372e-04f, -5.265568134e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.271595146e-04f, -4.036758732e-04f, +8.702958117e-04f, -1.363687610e-03f, +1.482849467e-03f, -6.352664072e-04f, -1.785285630e-03f, +6.133916651e-03f, -1.226182127e-02f, +1.931375947e-02f, -2.453166604e-02f, -4.485289149e-02f, +5.678941514e-02f, +7.810710943e-03f, -1.323645216e-02f, +1.137796797e-02f, -7.577890870e-03f, +3.851576103e-03f, -1.137438961e-03f, -3.345616471e-04f, +7.989107046e-04f, -6.857617204e-04f, +3.912211946e-04f, -1.523752566e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 7 (24) */ - -9.709515919e-04f, +1.556485965e-03f, -7.896045356e-04f, -2.930962426e-03f, +1.067395514e-02f, -2.173735981e-02f, +3.261282218e-02f, -3.662592698e-02f, +2.406225103e-02f, +1.955695104e-02f, -1.312853327e-01f, +6.641263456e-01f, +5.608053590e-01f, -1.634087739e-01f, +5.274765793e-02f, -2.137158612e-04f, -2.247327865e-02f, +2.674271021e-02f, -2.115653654e-02f, +1.249961117e-02f, -5.133297903e-03f, +8.048709026e-04f, +7.365318318e-04f, -6.789320700e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.418701448e-04f, -4.122605562e-04f, +8.285473963e-04f, -1.196448209e-03f, +1.106116859e-03f, -7.535085183e-06f, -2.588372871e-03f, +6.835209469e-03f, -1.228935191e-02f, +1.762015730e-02f, -1.886608640e-02f, -4.966189682e-02f, +5.365908981e-02f, +1.325735489e-02f, -1.557054960e-02f, +1.198661499e-02f, -7.317438857e-03f, +3.281739094e-03f, -5.883583626e-04f, -7.195391699e-04f, +1.005887268e-03f, -7.659280418e-04f, +4.076935767e-04f, -1.501493771e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 8 (24) */ - -8.290814471e-04f, +1.144225408e-03f, +3.894286075e-05f, -4.127410634e-03f, +1.178007200e-02f, -2.174489490e-02f, +3.002444931e-02f, -2.979071751e-02f, +1.177289913e-02f, +3.717710833e-02f, -1.501514191e-01f, +6.144644488e-01f, +6.144644488e-01f, -1.501514191e-01f, +3.717710833e-02f, +1.177289913e-02f, -2.979071751e-02f, +3.002444931e-02f, -2.174489490e-02f, +1.178007200e-02f, -4.127410634e-03f, +3.894286075e-05f, +1.144225408e-03f, -8.290814471e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.501493771e-04f, -4.076935767e-04f, +7.659280418e-04f, -1.005887268e-03f, +7.195391699e-04f, +5.883583626e-04f, -3.281739094e-03f, +7.317438857e-03f, -1.198661499e-02f, +1.557054960e-02f, -1.325735489e-02f, -5.365908981e-02f, +4.966189682e-02f, +1.886608640e-02f, -1.762015730e-02f, +1.228935191e-02f, -6.835209469e-03f, +2.588372871e-03f, +7.535085183e-06f, -1.106116859e-03f, +1.196448209e-03f, -8.285473963e-04f, +4.122605562e-04f, -1.418701448e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 9 (24) */ - -6.789320700e-04f, +7.365318318e-04f, +8.048709026e-04f, -5.133297903e-03f, +1.249961117e-02f, -2.115653654e-02f, +2.674271021e-02f, -2.247327865e-02f, -2.137158612e-04f, +5.274765793e-02f, -1.634087739e-01f, +5.608053590e-01f, +6.641263456e-01f, -1.312853327e-01f, +1.955695104e-02f, +2.406225103e-02f, -3.662592698e-02f, +3.261282218e-02f, -2.173735981e-02f, +1.067395514e-02f, -2.930962426e-03f, -7.896045356e-04f, +1.556485965e-03f, -9.709515919e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.523752566e-04f, -3.912211946e-04f, +6.857617204e-04f, -7.989107046e-04f, +3.345616471e-04f, +1.137438961e-03f, -3.851576103e-03f, +7.577890870e-03f, -1.137796797e-02f, +1.323645216e-02f, -7.810710943e-03f, -5.678941514e-02f, +4.485289149e-02f, +2.453166604e-02f, -1.931375947e-02f, +1.226182127e-02f, -6.133916651e-03f, +1.785285630e-03f, +6.352664072e-04f, -1.482849467e-03f, +1.363687610e-03f, -8.702958117e-04f, +4.036758732e-04f, -1.271595146e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,10 (24) */ - -5.265568134e-04f, +3.453106372e-04f, +1.490632623e-03f, -5.932208607e-03f, +1.283417282e-02f, -2.001909758e-02f, +2.289113411e-02f, -1.489538778e-02f, -1.159168383e-02f, +6.598411010e-02f, -1.712194849e-01f, +5.040159438e-01f, +7.089792371e-01f, -1.067536666e-01f, +2.431915639e-04f, +3.632407230e-02f, -4.275984363e-02f, +3.439810781e-02f, -2.110209341e-02f, +9.191105673e-03f, -1.567274816e-03f, -1.659900347e-03f, +1.960161838e-03f, -1.098111107e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.491056222e-04f, -3.643695193e-04f, +5.916728740e-04f, -5.824866660e-04f, -3.803611168e-05f, +1.626790569e-03f, -4.288133619e-03f, +7.619970147e-03f, -1.049459696e-02f, +1.069251893e-02f, -2.624343014e-03f, -5.901511065e-02f, +3.930344637e-02f, +3.014393553e-02f, -2.058486152e-02f, +1.188747184e-02f, -5.222602376e-03f, +8.901386714e-04f, +1.278140567e-03f, -1.837936775e-03f, +1.500981923e-03f, -8.882794882e-04f, +3.810391546e-04f, -1.058503852e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,11 (24) */ - -3.774511912e-04f, -1.905888210e-05f, +2.082305497e-03f, -6.514695273e-03f, +1.279613670e-02f, -1.839230701e-02f, +1.860300049e-02f, -7.275417637e-03f, -2.208628079e-02f, +7.667662902e-02f, -1.738438279e-01f, +4.450008332e-01f, +7.482826834e-01f, -7.660973108e-02f, -2.034166996e-02f, +4.821154414e-02f, -4.798244601e-02f, +3.528824648e-02f, -1.982395284e-02f, +7.353168899e-03f, -6.629289359e-05f, -2.548179835e-03f, +2.341200992e-03f, -1.203961492e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.410429498e-04f, -3.288739740e-04f, +4.874555904e-04f, -3.634360127e-04f, -3.884154965e-04f, +2.045820081e-03f, -4.585802324e-03f, +7.452834591e-03f, -9.373404232e-03f, +8.014649254e-03f, +2.212535144e-03f, -6.031629751e-02f, +3.309990950e-02f, +3.559011192e-02f, -2.137381569e-02f, +1.115836981e-02f, -4.116677753e-03f, -7.587967839e-05f, +1.918149264e-03f, -2.159561881e-03f, +1.602214322e-03f, -8.801590009e-04f, +3.438548100e-04f, -7.801225401e-05f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,12 (24) */ - -2.364082414e-04f, -3.479328561e-04f, +2.569761087e-03f, -6.878131286e-03f, +1.240772121e-02f, -1.634648693e-02f, +1.401719817e-02f, +1.774169543e-04f, -3.145968502e-02f, +8.469127828e-02f, -1.716312928e-01f, +3.846845357e-01f, +7.813825929e-01f, -4.101961916e-02f, -4.171548565e-02f, +5.936991395e-02f, -5.209912376e-02f, +3.521236680e-02f, -1.790580358e-02f, +5.193607018e-03f, +1.535921429e-03f, -3.428338836e-03f, +2.685055802e-03f, -1.281973746e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.289967247e-04f, -2.866068862e-04f, +3.769458208e-04f, -1.482391463e-04f, -7.079125913e-04f, +2.386442955e-03f, -4.743078092e-03f, +7.090890376e-03f, -8.055794269e-03f, +5.278131914e-03f, +6.621358951e-03f, -6.069117436e-02f, +2.634192530e-02f, +4.075719244e-02f, -2.162954199e-02f, +1.007581599e-02f, -2.837787581e-03f, -1.088497382e-03f, +2.536436861e-03f, -2.436248157e-03f, +1.661996396e-03f, -8.442635397e-04f, +2.920812198e-04f, -4.396998716e-05f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,13 (24) */ - -1.074115167e-04f, -6.345397422e-04f, +2.946706908e-03f, -7.026370432e-03f, +1.169980862e-02f, -1.396004397e-02f, +9.274120075e-03f, +7.268307330e-03f, -3.951547929e-02f, +8.996941019e-02f, -1.650099338e-01f, +3.239933613e-01f, +8.077245182e-01f, -2.624267216e-04f, -6.334502763e-02f, +6.944572994e-02f, -5.493691134e-02f, +3.412386942e-02f, -1.536936671e-02f, +2.757358860e-03f, +3.197917825e-03f, -4.272602376e-03f, +2.977137022e-03f, -1.325943733e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.138448639e-04f, -2.395057305e-04f, +2.639004645e-04f, +5.713587572e-05f, -9.892254810e-04f, +2.643188401e-03f, -4.762413539e-03f, +6.553166629e-03f, -6.586393774e-03f, +2.555870238e-03f, +1.053560437e-02f, -6.015581409e-02f, +1.914045496e-02f, +4.553441535e-02f, -2.131109846e-02f, +8.650745090e-03f, -1.413494736e-03f, -2.120911624e-03f, +3.113814380e-03f, -2.657224881e-03f, +1.675879999e-03f, -7.796907880e-04f, +2.261678214e-04f, -4.314478209e-06f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,14 (24) */ - +6.433347233e-06f, -8.740454728e-04f, +3.210607373e-03f, -6.969234557e-03f, +1.071058314e-02f, -1.131685557e-02f, +4.511706537e-03f, +1.382147396e-02f, -4.610187306e-02f, +9.252528043e-02f, -1.544743294e-01f, +2.638375472e-01f, +8.268649732e-01f, +4.527198863e-02f, -8.465612610e-02f, +7.809647503e-02f, -5.635040608e-02f, +3.200295779e-02f, -1.225555233e-02f, +1.001339790e-04f, +4.873797825e-03f, -5.052293164e-03f, +3.203304844e-03f, -1.330258211e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +9.649564219e-05f, -1.895043655e-04f, +1.518867064e-04f, +2.473799188e-04f, -1.226552000e-03f, +2.813224953e-03f, -4.649965954e-03f, +5.862591698e-03f, -5.011741168e-03f, -8.327052965e-05f, +1.390186963e-02f, -5.874357177e-02f, +1.161554014e-02f, +4.981571966e-02f, -2.038905732e-02f, +6.903888787e-03f, +1.232143192e-04f, -3.144440238e-03f, +3.631308541e-03f, -2.812790794e-03f, +1.640552014e-03f, -6.863882519e-04f, +1.470779616e-04f, +4.009581509e-05f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,15 (24) */ - +1.029289894e-04f, -1.063549838e-03f, +3.362494079e-03f, -6.721854638e-03f, +9.484031135e-03f, -8.503630616e-03f, -1.382594172e-04f, +1.968406566e-02f, -5.111361423e-02f, +9.244200990e-02f, -1.405724598e-01f, +2.050939754e-01f, +8.384805133e-01f, +9.508770829e-02f, -1.050451834e-01f, +8.500036382e-02f, -5.622719176e-02f, +2.885851756e-02f, -8.624243794e-03f, -2.712656815e-03f, +6.514349838e-03f, -5.738681416e-03f, +3.350382805e-03f, -1.290162396e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +7.785146472e-05f, -1.384693596e-04f, +4.418446917e-05f, +4.179610069e-04f, -1.415676388e-03f, +2.896309433e-03f, -4.415253187e-03f, +5.045194700e-03f, -3.378980922e-03f, -2.575956794e-03f, +1.668062888e-02f, -5.650412118e-02f, +3.893860413e-03f, +5.350214598e-02f, -1.884664750e-02f, +4.865689287e-03f, +1.734596604e-03f, -4.129257199e-03f, +4.070731190e-03f, -2.894664369e-03f, +1.554004909e-03f, -5.652122150e-04f, +5.629574316e-05f, +8.814319808e-05f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - } + /* m */ { 48u, 48u, 48u, 48u, 48u, 48u, 48u, 48u, 44u, 40u, 36u, 32u, 28u, 28u, 24u, 24u }, + /* filterOffset */ { 0u, 6144u, 12288u, 18432u, 24576u, 30720u, 36864u, 43008u, 49152u, 54784u, 59904u, 64512u, 68608u, 72192u, 75776u, 78848u }, + bsinc24_tab }; -/* This 11th order filter has a rejection of -40dB, yielding a transition width - * of ~0.203 (normalized frequency). Order increases when downsampling to a +/* This 11th order filter has a rejection of -60dB, yielding a transition width + * of ~0.330 (normalized frequency). Order increases when downsampling to a * limit of one octave, after which the quality of the filter (transition * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound - * after downsampling by ~3.30 octaves. + * after downsampling by ~2.60 octaves. */ -const BSincTable bsinc12 = { - /* scaleBase */ 1.014703785e-01f, /* scaleRange */ 1.112929364e+00f, - /* m */ { 24, 24, 24, 24, 24, 24, 24, 24, 20, 20, 16, 16, 16, 12, 12, 12 }, - /* filterOffset */ { 0, 1536, 3072, 4608, 6144, 7680, 9216, 10752, 12288, 13568, 14848, 15872, 16896, 17920, 18688, 19456 }, - - /* Tab (20224 entries) */ { - /* 0, 0 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +5.699079163e-03f, +9.391619165e-03f, +1.412003132e-02f, +1.978780700e-02f, +2.618766558e-02f, +3.300962293e-02f, +3.986250151e-02f, +4.630710150e-02f, +5.189752414e-02f, +5.622583743e-02f, +5.896461470e-02f, +5.990197477e-02f, +5.896461470e-02f, +5.622583743e-02f, +5.189752414e-02f, +4.630710150e-02f, +3.986250151e-02f, +3.300962293e-02f, +2.618766558e-02f, +1.978780700e-02f, +1.412003132e-02f, +9.391619165e-03f, +5.699079163e-03f, +3.033414355e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.960749141e-04f, -2.615442299e-04f, -3.246064176e-04f, -3.783813704e-04f, -4.160394191e-04f, -4.316573727e-04f, -4.210258335e-04f, -3.822915174e-04f, -3.163364871e-04f, -2.268299826e-04f, -1.199331400e-04f, -3.685685399e-06f, +1.128507582e-04f, +2.205828625e-04f, +3.113799387e-04f, +3.789424838e-04f, +4.194333165e-04f, +4.317940913e-04f, +4.177150854e-04f, +3.812749648e-04f, +3.283123126e-04f, +2.656253207e-04f, +2.001152905e-04f, +1.379910952e-04f, - /* 0, 1 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +5.503004249e-03f, +9.130074935e-03f, +1.379542491e-02f, +1.940942563e-02f, +2.577162616e-02f, +3.257796556e-02f, +3.944147567e-02f, +4.592480998e-02f, +5.158118765e-02f, +5.599900745e-02f, +5.884468156e-02f, +5.989828908e-02f, +5.907746546e-02f, +5.644642030e-02f, +5.220890408e-02f, +4.668604398e-02f, +4.028193482e-02f, +3.344141702e-02f, +2.660538066e-02f, +2.016908197e-02f, +1.444834364e-02f, +9.657244486e-03f, +5.899194453e-03f, +3.171405450e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.920495797e-04f, -2.574539829e-04f, -3.208642311e-04f, -3.754245234e-04f, -4.142770958e-04f, -4.314173415e-04f, -4.225076726e-04f, -3.855333010e-04f, -3.212002155e-04f, -2.330085517e-04f, -1.269786586e-04f, -1.105591687e-05f, +1.057336668e-04f, +2.142689858e-04f, +3.063318181e-04f, +3.754867850e-04f, +4.177300107e-04f, +4.318267432e-04f, +4.193028253e-04f, +3.841037044e-04f, +3.319801912e-04f, +2.696956158e-04f, +2.041693330e-04f, +1.416741607e-04f, - /* 0, 2 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +5.310954669e-03f, +8.872620952e-03f, +1.347456067e-02f, +1.903400111e-02f, +2.535734906e-02f, +3.214654822e-02f, +3.901896800e-02f, +4.553927668e-02f, +5.125998744e-02f, +5.576599890e-02f, +5.871770290e-02f, +5.988723317e-02f, +5.918319912e-02f, +5.666068928e-02f, +5.251523590e-02f, +4.706153077e-02f, +4.069966483e-02f, +3.387324377e-02f, +2.702468349e-02f, +2.055318567e-02f, +1.478032383e-02f, +9.926940101e-03f, +6.103363786e-03f, +3.313079611e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.880406414e-04f, -2.533562076e-04f, -3.170874784e-04f, -3.724060396e-04f, -4.124294112e-04f, -4.310747882e-04f, -4.238789874e-04f, -3.886672932e-04f, -3.259699149e-04f, -2.391168051e-04f, -1.339851768e-04f, -1.842273085e-05f, +9.858403415e-05f, +2.078901751e-04f, +3.011934115e-04f, +3.719250490e-04f, +4.159158478e-04f, +4.317546116e-04f, +4.208013970e-04f, +3.868660020e-04f, +3.356083300e-04f, +2.737534645e-04f, +2.082356450e-04f, +1.453890870e-04f, - /* 0, 3 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +5.122914028e-03f, +8.619264745e-03f, +1.315747320e-02f, +1.866159507e-02f, +2.494491965e-02f, +3.171547343e-02f, +3.859508901e-02f, +4.515060939e-02f, +5.093401752e-02f, +5.552688209e-02f, +5.858371772e-02f, +5.986881044e-02f, +5.928178316e-02f, +5.686857946e-02f, +5.281642931e-02f, +4.743345582e-02f, +4.111558068e-02f, +3.430499838e-02f, +2.744548489e-02f, +2.094005167e-02f, +1.511593216e-02f, +1.020069357e-02f, +6.311599431e-03f, +3.458468698e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.840494321e-04f, -2.492525195e-04f, -3.132778847e-04f, -3.693275483e-04f, -4.104976870e-04f, -4.306305397e-04f, -4.251399738e-04f, -3.916929963e-04f, -3.306444157e-04f, -2.451530077e-04f, -1.409505737e-04f, -2.578385067e-05f, +9.140404286e-05f, +2.014482809e-04f, +2.959660430e-04f, +3.682579471e-04f, +4.139908027e-04f, +4.315770173e-04f, +4.222095865e-04f, +3.895602860e-04f, +3.391950078e-04f, +2.777972061e-04f, +2.123128096e-04f, +1.491348359e-04f, - /* 0, 4 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.938864596e-03f, +8.370012225e-03f, +1.284419531e-02f, +1.829226752e-02f, +2.453442196e-02f, +3.128484289e-02f, +3.816994904e-02f, +4.475891639e-02f, +5.060337311e-02f, +5.528172909e-02f, +5.844276715e-02f, +5.984302658e-02f, +5.937318720e-02f, +5.707002774e-02f, +5.311239535e-02f, +4.780171377e-02f, +4.152957148e-02f, +3.473657539e-02f, +2.786769447e-02f, +2.132961196e-02f, +1.545512716e-02f, +1.047849077e-02f, +6.523912241e-03f, +3.607603534e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.800772619e-04f, -2.451445209e-04f, -3.094371743e-04f, -3.661906908e-04f, -4.084832700e-04f, -4.300854583e-04f, -4.262908700e-04f, -3.946099562e-04f, -3.352225880e-04f, -2.511154556e-04f, -1.478727465e-04f, -3.313700212e-05f, +8.419588858e-05f, +1.949451810e-04f, +2.906510740e-04f, +3.644861934e-04f, +4.119548933e-04f, +4.312933190e-04f, +4.235262086e-04f, +3.921850012e-04f, +3.427385065e-04f, +2.818251702e-04f, +2.163993902e-04f, +1.529103426e-04f, - /* 0, 5 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.758787334e-03f, +8.124867704e-03f, +1.253475814e-02f, +1.792607683e-02f, +2.412593869e-02f, +3.085475743e-02f, +3.774365817e-02f, +4.436430644e-02f, +5.026815052e-02f, +5.503061363e-02f, +5.829489440e-02f, +5.980988958e-02f, +5.945738309e-02f, +5.726497292e-02f, +5.340304642e-02f, +4.816619996e-02f, +4.194152638e-02f, +3.516786871e-02f, +2.829122068e-02f, +2.172179696e-02f, +1.579786567e-02f, +1.076031594e-02f, +6.740311631e-03f, +3.760513876e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.761254183e-04f, -2.410338005e-04f, -3.055670693e-04f, -3.629971201e-04f, -4.063875313e-04f, -4.294404412e-04f, -4.273319557e-04f, -3.974177623e-04f, -3.397033418e-04f, -2.570024759e-04f, -1.547496110e-04f, -4.047991444e-05f, +7.696177919e-05f, +1.883827791e-04f, +2.852499031e-04f, +3.606105449e-04f, +4.098081809e-04f, +4.309029143e-04f, +4.247501074e-04f, +3.947386096e-04f, +3.462371119e-04f, +2.858356777e-04f, +2.204939308e-04f, +1.567145163e-04f, - /* 0, 6 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.582661915e-03f, +7.883833904e-03f, +1.222919107e-02f, +1.756307971e-02f, +2.371955116e-02f, +3.042531699e-02f, +3.731632621e-02f, +4.396688867e-02f, +4.992844718e-02f, +5.477361115e-02f, +5.814014479e-02f, +5.976940967e-02f, +5.953434487e-02f, +5.745335570e-02f, +5.368829633e-02f, +4.852681050e-02f, +4.235133456e-02f, +3.559877163e-02f, +2.871597079e-02f, +2.211653557e-02f, +1.614410278e-02f, +1.104615162e-02f, +6.960805562e-03f, +3.917228392e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.721951657e-04f, -2.369219327e-04f, -3.016692895e-04f, -3.597484994e-04f, -4.042118656e-04f, -4.286964203e-04f, -4.282635524e-04f, -4.001160478e-04f, -3.440856280e-04f, -2.628124281e-04f, -1.615791025e-04f, -4.781032135e-05f, +6.970393379e-05f, +1.817630045e-04f, +2.797639649e-04f, +3.566318012e-04f, +4.075507701e-04f, +4.304052395e-04f, +4.258801573e-04f, +3.972195913e-04f, +3.496891145e-04f, +2.898270411e-04f, +2.245949568e-04f, +1.605462403e-04f, - /* 0, 7 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.410466750e-03f, +7.646911971e-03f, +1.192752178e-02f, +1.720333121e-02f, +2.331533930e-02f, +2.999662057e-02f, +3.688806266e-02f, +4.356677263e-02f, +4.958436155e-02f, +5.451079873e-02f, +5.797856569e-02f, +5.972159935e-02f, +5.960404880e-02f, +5.763511870e-02f, +5.396806029e-02f, +4.888344231e-02f, +4.275888533e-02f, +3.602917687e-02f, +2.914185094e-02f, +2.251375516e-02f, +1.649379190e-02f, +1.133597866e-02f, +7.185400519e-03f, +4.077774633e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.682877448e-04f, -2.328104765e-04f, -2.977455511e-04f, -3.564465022e-04f, -4.019576904e-04f, -4.278543613e-04f, -4.290860228e-04f, -4.027044898e-04f, -3.483684379e-04f, -2.685437043e-04f, -1.683591769e-04f, -5.512596196e-05f, +6.242458181e-05f, +1.750878111e-04f, +2.741947301e-04f, +3.525508042e-04f, +4.051828091e-04f, +4.297997704e-04f, +4.269152631e-04f, +3.996264454e-04f, +3.530928104e-04f, +2.937975659e-04f, +2.287009755e-04f, +1.644043723e-04f, - /* 0, 8 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.242179005e-03f, +7.414101494e-03f, +1.162977623e-02f, +1.684688471e-02f, +2.291338161e-02f, +2.956876621e-02f, +3.645897664e-02f, +4.316406814e-02f, +4.923599311e-02f, +5.424225502e-02f, +5.781020651e-02f, +5.966647338e-02f, +5.966647338e-02f, +5.781020651e-02f, +5.424225502e-02f, +4.923599311e-02f, +4.316406814e-02f, +3.645897664e-02f, +2.956876621e-02f, +2.291338161e-02f, +1.684688471e-02f, +1.162977623e-02f, +7.414101494e-03f, +4.242179005e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.644043723e-04f, -2.287009755e-04f, -2.937975659e-04f, -3.530928104e-04f, -3.996264454e-04f, -4.269152631e-04f, -4.297997704e-04f, -4.051828091e-04f, -3.525508042e-04f, -2.741947301e-04f, -1.750878111e-04f, -6.242458181e-05f, +5.512596196e-05f, +1.683591769e-04f, +2.685437043e-04f, +3.483684379e-04f, +4.027044898e-04f, +4.290860228e-04f, +4.278543613e-04f, +4.019576904e-04f, +3.564465022e-04f, +2.977455511e-04f, +2.328104765e-04f, +1.682877448e-04f, - /* 0, 9 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +4.077774633e-03f, +7.185400519e-03f, +1.133597866e-02f, +1.649379190e-02f, +2.251375516e-02f, +2.914185094e-02f, +3.602917687e-02f, +4.275888533e-02f, +4.888344231e-02f, +5.396806029e-02f, +5.763511870e-02f, +5.960404880e-02f, +5.972159935e-02f, +5.797856569e-02f, +5.451079873e-02f, +4.958436155e-02f, +4.356677263e-02f, +3.688806266e-02f, +2.999662057e-02f, +2.331533930e-02f, +1.720333121e-02f, +1.192752178e-02f, +7.646911971e-03f, +4.410466750e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.605462403e-04f, -2.245949568e-04f, -2.898270411e-04f, -3.496891145e-04f, -3.972195913e-04f, -4.258801573e-04f, -4.304052395e-04f, -4.075507701e-04f, -3.566318012e-04f, -2.797639649e-04f, -1.817630045e-04f, -6.970393379e-05f, +4.781032135e-05f, +1.615791025e-04f, +2.628124281e-04f, +3.440856280e-04f, +4.001160478e-04f, +4.282635524e-04f, +4.286964203e-04f, +4.042118656e-04f, +3.597484994e-04f, +3.016692895e-04f, +2.369219327e-04f, +1.721951657e-04f, - /* 0,10 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +3.917228392e-03f, +6.960805562e-03f, +1.104615162e-02f, +1.614410278e-02f, +2.211653557e-02f, +2.871597079e-02f, +3.559877163e-02f, +4.235133456e-02f, +4.852681050e-02f, +5.368829633e-02f, +5.745335570e-02f, +5.953434487e-02f, +5.976940967e-02f, +5.814014479e-02f, +5.477361115e-02f, +4.992844718e-02f, +4.396688867e-02f, +3.731632621e-02f, +3.042531699e-02f, +2.371955116e-02f, +1.756307971e-02f, +1.222919107e-02f, +7.883833904e-03f, +4.582661915e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.567145163e-04f, -2.204939308e-04f, -2.858356777e-04f, -3.462371119e-04f, -3.947386096e-04f, -4.247501074e-04f, -4.309029143e-04f, -4.098081809e-04f, -3.606105449e-04f, -2.852499031e-04f, -1.883827791e-04f, -7.696177919e-05f, +4.047991444e-05f, +1.547496110e-04f, +2.570024759e-04f, +3.397033418e-04f, +3.974177623e-04f, +4.273319557e-04f, +4.294404412e-04f, +4.063875313e-04f, +3.629971201e-04f, +3.055670693e-04f, +2.410338005e-04f, +1.761254183e-04f, - /* 0,11 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +3.760513876e-03f, +6.740311631e-03f, +1.076031594e-02f, +1.579786567e-02f, +2.172179696e-02f, +2.829122068e-02f, +3.516786871e-02f, +4.194152638e-02f, +4.816619996e-02f, +5.340304642e-02f, +5.726497292e-02f, +5.945738309e-02f, +5.980988958e-02f, +5.829489440e-02f, +5.503061363e-02f, +5.026815052e-02f, +4.436430644e-02f, +3.774365817e-02f, +3.085475743e-02f, +2.412593869e-02f, +1.792607683e-02f, +1.253475814e-02f, +8.124867704e-03f, +4.758787334e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.529103426e-04f, -2.163993902e-04f, -2.818251702e-04f, -3.427385065e-04f, -3.921850012e-04f, -4.235262086e-04f, -4.312933190e-04f, -4.119548933e-04f, -3.644861934e-04f, -2.906510740e-04f, -1.949451810e-04f, -8.419588858e-05f, +3.313700212e-05f, +1.478727465e-04f, +2.511154556e-04f, +3.352225880e-04f, +3.946099562e-04f, +4.262908700e-04f, +4.300854583e-04f, +4.084832700e-04f, +3.661906908e-04f, +3.094371743e-04f, +2.451445209e-04f, +1.800772619e-04f, - /* 0,12 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +3.607603534e-03f, +6.523912241e-03f, +1.047849077e-02f, +1.545512716e-02f, +2.132961196e-02f, +2.786769447e-02f, +3.473657539e-02f, +4.152957148e-02f, +4.780171377e-02f, +5.311239535e-02f, +5.707002774e-02f, +5.937318720e-02f, +5.984302658e-02f, +5.844276715e-02f, +5.528172909e-02f, +5.060337311e-02f, +4.475891639e-02f, +3.816994904e-02f, +3.128484289e-02f, +2.453442196e-02f, +1.829226752e-02f, +1.284419531e-02f, +8.370012225e-03f, +4.938864596e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.491348359e-04f, -2.123128096e-04f, -2.777972061e-04f, -3.391950078e-04f, -3.895602860e-04f, -4.222095865e-04f, -4.315770173e-04f, -4.139908027e-04f, -3.682579471e-04f, -2.959660430e-04f, -2.014482809e-04f, -9.140404286e-05f, +2.578385067e-05f, +1.409505737e-04f, +2.451530077e-04f, +3.306444157e-04f, +3.916929963e-04f, +4.251399738e-04f, +4.306305397e-04f, +4.104976870e-04f, +3.693275483e-04f, +3.132778847e-04f, +2.492525195e-04f, +1.840494321e-04f, - /* 0,13 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +3.458468698e-03f, +6.311599431e-03f, +1.020069357e-02f, +1.511593216e-02f, +2.094005167e-02f, +2.744548489e-02f, +3.430499838e-02f, +4.111558068e-02f, +4.743345582e-02f, +5.281642931e-02f, +5.686857946e-02f, +5.928178316e-02f, +5.986881044e-02f, +5.858371772e-02f, +5.552688209e-02f, +5.093401752e-02f, +4.515060939e-02f, +3.859508901e-02f, +3.171547343e-02f, +2.494491965e-02f, +1.866159507e-02f, +1.315747320e-02f, +8.619264745e-03f, +5.122914028e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.453890870e-04f, -2.082356450e-04f, -2.737534645e-04f, -3.356083300e-04f, -3.868660020e-04f, -4.208013970e-04f, -4.317546116e-04f, -4.159158478e-04f, -3.719250490e-04f, -3.011934115e-04f, -2.078901751e-04f, -9.858403415e-05f, +1.842273085e-05f, +1.339851768e-04f, +2.391168051e-04f, +3.259699149e-04f, +3.886672932e-04f, +4.238789874e-04f, +4.310747882e-04f, +4.124294112e-04f, +3.724060396e-04f, +3.170874784e-04f, +2.533562076e-04f, +1.880406414e-04f, - /* 0,14 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +3.313079611e-03f, +6.103363786e-03f, +9.926940101e-03f, +1.478032383e-02f, +2.055318567e-02f, +2.702468349e-02f, +3.387324377e-02f, +4.069966483e-02f, +4.706153077e-02f, +5.251523590e-02f, +5.666068928e-02f, +5.918319912e-02f, +5.988723317e-02f, +5.871770290e-02f, +5.576599890e-02f, +5.125998744e-02f, +4.553927668e-02f, +3.901896800e-02f, +3.214654822e-02f, +2.535734906e-02f, +1.903400111e-02f, +1.347456067e-02f, +8.872620952e-03f, +5.310954669e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.416741607e-04f, -2.041693330e-04f, -2.696956158e-04f, -3.319801912e-04f, -3.841037044e-04f, -4.193028253e-04f, -4.318267432e-04f, -4.177300107e-04f, -3.754867850e-04f, -3.063318181e-04f, -2.142689858e-04f, -1.057336668e-04f, +1.105591687e-05f, +1.269786586e-04f, +2.330085517e-04f, +3.212002155e-04f, +3.855333010e-04f, +4.225076726e-04f, +4.314173415e-04f, +4.142770958e-04f, +3.754245234e-04f, +3.208642311e-04f, +2.574539829e-04f, +1.920495797e-04f, - /* 0,15 (24) */ - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +3.171405450e-03f, +5.899194453e-03f, +9.657244486e-03f, +1.444834364e-02f, +2.016908197e-02f, +2.660538066e-02f, +3.344141702e-02f, +4.028193482e-02f, +4.668604398e-02f, +5.220890408e-02f, +5.644642030e-02f, +5.907746546e-02f, +5.989828908e-02f, +5.884468156e-02f, +5.599900745e-02f, +5.158118765e-02f, +4.592480998e-02f, +3.944147567e-02f, +3.257796556e-02f, +2.577162616e-02f, +1.940942563e-02f, +1.379542491e-02f, +9.130074935e-03f, +5.503004249e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.379910952e-04f, -2.001152905e-04f, -2.656253207e-04f, -3.283123126e-04f, -3.812749648e-04f, -4.177150854e-04f, -4.317940913e-04f, -4.194333165e-04f, -3.789424838e-04f, -3.113799387e-04f, -2.205828625e-04f, -1.128507582e-04f, +3.685685399e-06f, +1.199331400e-04f, +2.268299826e-04f, +3.163364871e-04f, +3.822915174e-04f, +4.210258335e-04f, +4.316573727e-04f, +4.160394191e-04f, +3.783813704e-04f, +3.246064176e-04f, +2.615442299e-04f, +1.960749141e-04f, - /* 1, 0 (24) */ - +5.699079163e-03f, +9.391619165e-03f, +1.412003132e-02f, +1.978780700e-02f, +2.618766558e-02f, +3.300962293e-02f, +3.986250151e-02f, +4.630710150e-02f, +5.189752414e-02f, +5.622583743e-02f, +5.896461470e-02f, +5.990197477e-02f, +5.896461470e-02f, +5.622583743e-02f, +5.189752414e-02f, +4.630710150e-02f, +3.986250151e-02f, +3.300962293e-02f, +2.618766558e-02f, +1.978780700e-02f, +1.412003132e-02f, +9.391619165e-03f, +5.699079163e-03f, +3.033414355e-03f, - -1.115631698e-02f, -1.514091868e-02f, -1.758178327e-02f, -1.720553350e-02f, -1.305312300e-02f, -4.789667122e-03f, +7.097937791e-03f, +2.128379168e-02f, +3.579087813e-02f, +4.835456220e-02f, +5.688256345e-02f, +5.990197477e-02f, +5.688256345e-02f, +4.835456220e-02f, +3.579087813e-02f, +2.128379168e-02f, +7.097937791e-03f, -4.789667122e-03f, -1.305312300e-02f, -1.720553350e-02f, -1.758178327e-02f, -1.514091868e-02f, -1.115631698e-02f, -6.883255437e-03f, - -1.960749141e-04f, -2.615442299e-04f, -3.246064176e-04f, -3.783813704e-04f, -4.160394191e-04f, -4.316573727e-04f, -4.210258335e-04f, -3.822915174e-04f, -3.163364871e-04f, -2.268299826e-04f, -1.199331400e-04f, -3.685685399e-06f, +1.128507582e-04f, +2.205828625e-04f, +3.113799387e-04f, +3.789424838e-04f, +4.194333165e-04f, +4.317940913e-04f, +4.177150854e-04f, +3.812749648e-04f, +3.283123126e-04f, +2.656253207e-04f, +2.001152905e-04f, +1.379910952e-04f, - +2.705482644e-04f, +2.175833157e-04f, +8.236166666e-05f, -1.267651157e-04f, -3.803727076e-04f, -6.320839735e-04f, -8.279297007e-04f, -9.188817989e-04f, -8.733813231e-04f, -6.864407641e-04f, -3.826490473e-04f, -1.197181021e-05f, +3.608162026e-04f, +6.704699924e-04f, +8.657334732e-04f, +9.202342634e-04f, +8.371263083e-04f, +6.465221071e-04f, +3.967060483e-04f, +1.417231279e-04f, -7.125445421e-05f, -2.115618514e-04f, -2.695204175e-04f, -2.551871856e-04f, - /* 1, 1 (24) */ - +5.503004249e-03f, +9.130074935e-03f, +1.379542491e-02f, +1.940942563e-02f, +2.577162616e-02f, +3.257796556e-02f, +3.944147567e-02f, +4.592480998e-02f, +5.158118765e-02f, +5.599900745e-02f, +5.884468156e-02f, +5.989828908e-02f, +5.907746546e-02f, +5.644642030e-02f, +5.220890408e-02f, +4.668604398e-02f, +4.028193482e-02f, +3.344141702e-02f, +2.660538066e-02f, +2.016908197e-02f, +1.444834364e-02f, +9.657244486e-03f, +5.899194453e-03f, +3.171405450e-03f, - -1.088576871e-02f, -1.492333537e-02f, -1.749942161e-02f, -1.733229861e-02f, -1.343349571e-02f, -5.421751096e-03f, +6.270008090e-03f, +2.036490988e-02f, +3.491749681e-02f, +4.766812144e-02f, +5.649991440e-02f, +5.989000296e-02f, +5.724337965e-02f, +4.902503219e-02f, +3.665661161e-02f, +2.220402594e-02f, +7.935064099e-03f, -4.143145015e-03f, -1.265641695e-02f, -1.706381037e-02f, -1.765303773e-02f, -1.535248053e-02f, -1.142583740e-02f, -7.138442622e-03f, - -1.920495797e-04f, -2.574539829e-04f, -3.208642311e-04f, -3.754245234e-04f, -4.142770958e-04f, -4.314173415e-04f, -4.225076726e-04f, -3.855333010e-04f, -3.212002155e-04f, -2.330085517e-04f, -1.269786586e-04f, -1.105591687e-05f, +1.057336668e-04f, +2.142689858e-04f, +3.063318181e-04f, +3.754867850e-04f, +4.177300107e-04f, +4.318267432e-04f, +4.193028253e-04f, +3.841037044e-04f, +3.319801912e-04f, +2.696956158e-04f, +2.041693330e-04f, +1.416741607e-04f, - +2.712938608e-04f, +2.232769411e-04f, +9.317309612e-05f, -1.119865916e-04f, -3.640345662e-04f, -6.174260146e-04f, -8.183175346e-04f, -9.169874259e-04f, -8.804667570e-04f, -7.019465696e-04f, -4.042156479e-04f, -3.590702749e-05f, +3.387320427e-04f, +6.540440323e-04f, +8.575258695e-04f, +9.210401721e-04f, +8.458969541e-04f, +6.607270683e-04f, +4.130215719e-04f, +1.568508104e-04f, -5.985630987e-05f, -2.052121014e-04f, -2.682055987e-04f, -2.577951457e-04f, - /* 1, 2 (24) */ - +5.310954669e-03f, +8.872620952e-03f, +1.347456067e-02f, +1.903400111e-02f, +2.535734906e-02f, +3.214654822e-02f, +3.901896800e-02f, +4.553927668e-02f, +5.125998744e-02f, +5.576599890e-02f, +5.871770290e-02f, +5.988723317e-02f, +5.918319912e-02f, +5.666068928e-02f, +5.251523590e-02f, +4.706153077e-02f, +4.069966483e-02f, +3.387324377e-02f, +2.702468349e-02f, +2.055318567e-02f, +1.478032383e-02f, +9.926940101e-03f, +6.103363786e-03f, +3.313079611e-03f, - -1.061447485e-02f, -1.470005842e-02f, -1.740624851e-02f, -1.744428520e-02f, -1.379753027e-02f, -6.039177110e-03f, +5.451690556e-03f, +1.944792245e-02f, +3.403703005e-02f, +4.696617487e-02f, +5.609569875e-02f, +5.985409593e-02f, +5.758211169e-02f, +4.967907622e-02f, +3.751413748e-02f, +2.312506611e-02f, +8.780961054e-03f, -3.482417947e-03f, -1.224339538e-02f, -1.690695956e-02f, -1.771289404e-02f, -1.555769263e-02f, -1.169404300e-02f, -7.396237768e-03f, - -1.880406414e-04f, -2.533562076e-04f, -3.170874784e-04f, -3.724060396e-04f, -4.124294112e-04f, -4.310747882e-04f, -4.238789874e-04f, -3.886672932e-04f, -3.259699149e-04f, -2.391168051e-04f, -1.339851768e-04f, -1.842273085e-05f, +9.858403415e-05f, +2.078901751e-04f, +3.011934115e-04f, +3.719250490e-04f, +4.159158478e-04f, +4.317546116e-04f, +4.208013970e-04f, +3.868660020e-04f, +3.356083300e-04f, +2.737534645e-04f, +2.082356450e-04f, +1.453890870e-04f, - +2.717621372e-04f, +2.286434837e-04f, +1.036842282e-04f, -9.739710104e-05f, -3.477045164e-04f, -6.025616528e-04f, -8.083004890e-04f, -9.145562136e-04f, -8.869875835e-04f, -7.169780354e-04f, -4.255013118e-04f, -5.981704284e-05f, +3.164117194e-04f, +6.371730579e-04f, +8.487616438e-04f, +9.212953056e-04f, +8.542315214e-04f, +6.746855984e-04f, +4.293061488e-04f, +1.721380793e-04f, -4.817242024e-05f, -1.985339325e-04f, -2.665993037e-04f, -2.602051597e-04f, - /* 1, 3 (24) */ - +5.122914028e-03f, +8.619264745e-03f, +1.315747320e-02f, +1.866159507e-02f, +2.494491965e-02f, +3.171547343e-02f, +3.859508901e-02f, +4.515060939e-02f, +5.093401752e-02f, +5.552688209e-02f, +5.858371772e-02f, +5.986881044e-02f, +5.928178316e-02f, +5.686857946e-02f, +5.281642931e-02f, +4.743345582e-02f, +4.111558068e-02f, +3.430499838e-02f, +2.744548489e-02f, +2.094005167e-02f, +1.511593216e-02f, +1.020069357e-02f, +6.311599431e-03f, +3.458468698e-03f, - -1.034271272e-02f, -1.447141494e-02f, -1.730256428e-02f, -1.754168230e-02f, -1.414523479e-02f, -6.641738763e-03f, +4.643390067e-03f, +1.853336624e-02f, +3.315004247e-02f, +4.624919683e-02f, +5.567019744e-02f, +5.979427889e-02f, +5.789852341e-02f, +5.031624928e-02f, +3.836289912e-02f, +2.404636142e-02f, +9.635192575e-03f, -2.807732349e-03f, -1.181408923e-02f, -1.673482148e-02f, -1.776106646e-02f, -1.575622657e-02f, -1.196064230e-02f, -7.656442928e-03f, - -1.840494321e-04f, -2.492525195e-04f, -3.132778847e-04f, -3.693275483e-04f, -4.104976870e-04f, -4.306305397e-04f, -4.251399738e-04f, -3.916929963e-04f, -3.306444157e-04f, -2.451530077e-04f, -1.409505737e-04f, -2.578385067e-05f, +9.140404286e-05f, +2.014482809e-04f, +2.959660430e-04f, +3.682579471e-04f, +4.139908027e-04f, +4.315770173e-04f, +4.222095865e-04f, +3.895602860e-04f, +3.391950078e-04f, +2.777972061e-04f, +2.123128096e-04f, +1.491348359e-04f, - +2.719582255e-04f, +2.336840048e-04f, +1.138908863e-04f, -8.300591000e-05f, -3.313953148e-04f, -5.875043727e-04f, -7.978895069e-04f, -9.115936458e-04f, -8.929420818e-04f, -7.315261995e-04f, -4.464915949e-04f, -8.368507996e-05f, +2.938705940e-04f, +6.198676315e-04f, +8.394443961e-04f, +9.209958781e-04f, +8.621201918e-04f, +6.883845401e-04f, +4.455465481e-04f, +1.875745925e-04f, -3.620830577e-05f, -1.915275290e-04f, -2.646972525e-04f, -2.624103371e-04f, - /* 1, 4 (24) */ - +4.938864596e-03f, +8.370012225e-03f, +1.284419531e-02f, +1.829226752e-02f, +2.453442196e-02f, +3.128484289e-02f, +3.816994904e-02f, +4.475891639e-02f, +5.060337311e-02f, +5.528172909e-02f, +5.844276715e-02f, +5.984302658e-02f, +5.937318720e-02f, +5.707002774e-02f, +5.311239535e-02f, +4.780171377e-02f, +4.152957148e-02f, +3.473657539e-02f, +2.786769447e-02f, +2.132961196e-02f, +1.545512716e-02f, +1.047849077e-02f, +6.523912241e-03f, +3.607603534e-03f, - -1.007075449e-02f, -1.423773094e-02f, -1.718867340e-02f, -1.762468821e-02f, -1.447663011e-02f, -7.229243136e-03f, +3.845500560e-03f, +1.762177259e-02f, +3.225710039e-02f, +4.551767063e-02f, +5.522370585e-02f, +5.971059381e-02f, +5.819239401e-02f, +5.093611691e-02f, +3.920234351e-02f, +2.496735730e-02f, +1.049731277e-02f, -2.119347808e-03f, -1.136854268e-02f, -1.654724689e-02f, -1.779727476e-02f, -1.594775410e-02f, -1.222533955e-02f, -7.918853265e-03f, - -1.800772619e-04f, -2.451445209e-04f, -3.094371743e-04f, -3.661906908e-04f, -4.084832700e-04f, -4.300854583e-04f, -4.262908700e-04f, -3.946099562e-04f, -3.352225880e-04f, -2.511154556e-04f, -1.478727465e-04f, -3.313700212e-05f, +8.419588858e-05f, +1.949451810e-04f, +2.906510740e-04f, +3.644861934e-04f, +4.119548933e-04f, +4.312933190e-04f, +4.235262086e-04f, +3.921850012e-04f, +3.427385065e-04f, +2.818251702e-04f, +2.163993902e-04f, +1.529103426e-04f, - +2.718874504e-04f, +2.383998657e-04f, +1.237892318e-04f, -6.882199867e-05f, -3.151195712e-04f, -5.722677081e-04f, -7.870957839e-04f, -9.081056146e-04f, -8.983290016e-04f, -7.455825185e-04f, -4.671723146e-04f, -1.074944000e-04f, +2.711242241e-04f, +6.021386948e-04f, +8.295781937e-04f, +9.201385428e-04f, +8.695534551e-04f, +7.018108507e-04f, +4.617294493e-04f, +2.031497574e-04f, -2.396981877e-05f, -1.841933961e-04f, -2.624953972e-04f, -2.644038865e-04f, - /* 1, 5 (24) */ - +4.758787334e-03f, +8.124867704e-03f, +1.253475814e-02f, +1.792607683e-02f, +2.412593869e-02f, +3.085475743e-02f, +3.774365817e-02f, +4.436430644e-02f, +5.026815052e-02f, +5.503061363e-02f, +5.829489440e-02f, +5.980988958e-02f, +5.945738309e-02f, +5.726497292e-02f, +5.340304642e-02f, +4.816619996e-02f, +4.194152638e-02f, +3.516786871e-02f, +2.829122068e-02f, +2.172179696e-02f, +1.579786567e-02f, +1.076031594e-02f, +6.740311631e-03f, +3.760513876e-03f, - -9.798867041e-03f, -1.399933107e-02f, -1.706488416e-02f, -1.769351021e-02f, -1.479174968e-02f, -7.801510844e-03f, +3.058404776e-03f, +1.671366698e-02f, +3.135877139e-02f, +4.477208811e-02f, +5.475653353e-02f, +5.960309941e-02f, +5.846351823e-02f, +5.153825561e-02f, +4.003192171e-02f, +2.588749584e-02f, +1.136686622e-02f, -1.417536958e-03f, -1.090681323e-02f, -1.634409713e-02f, -1.782124458e-02f, -1.613194749e-02f, -1.248783495e-02f, -8.183257151e-03f, - -1.761254183e-04f, -2.410338005e-04f, -3.055670693e-04f, -3.629971201e-04f, -4.063875313e-04f, -4.294404412e-04f, -4.273319557e-04f, -3.974177623e-04f, -3.397033418e-04f, -2.570024759e-04f, -1.547496110e-04f, -4.047991444e-05f, +7.696177919e-05f, +1.883827791e-04f, +2.852499031e-04f, +3.606105449e-04f, +4.098081809e-04f, +4.309029143e-04f, +4.247501074e-04f, +3.947386096e-04f, +3.462371119e-04f, +2.858356777e-04f, +2.204939308e-04f, +1.567145163e-04f, - +2.715553220e-04f, +2.427927233e-04f, +1.333757646e-04f, -5.485405554e-05f, -2.988897381e-04f, -5.568652287e-04f, -7.759307559e-04f, -9.040984124e-04f, -9.031475626e-04f, -7.591388741e-04f, -4.875295623e-04f, -1.312283164e-04f, +2.481883498e-04f, +5.839975600e-04f, +8.191675683e-04f, +9.187203972e-04f, +8.765221205e-04f, +7.149516148e-04f, +4.778414546e-04f, +2.188527386e-04f, -1.146314106e-05f, -1.765323633e-04f, -2.599899292e-04f, -2.661791237e-04f, - /* 1, 6 (24) */ - +4.582661915e-03f, +7.883833904e-03f, +1.222919107e-02f, +1.756307971e-02f, +2.371955116e-02f, +3.042531699e-02f, +3.731632621e-02f, +4.396688867e-02f, +4.992844718e-02f, +5.477361115e-02f, +5.814014479e-02f, +5.976940967e-02f, +5.953434487e-02f, +5.745335570e-02f, +5.368829633e-02f, +4.852681050e-02f, +4.235133456e-02f, +3.559877163e-02f, +2.871597079e-02f, +2.211653557e-02f, +1.614410278e-02f, +1.104615162e-02f, +6.960805562e-03f, +3.917228392e-03f, - -9.527311719e-03f, -1.375653835e-02f, -1.693150840e-02f, -1.774836427e-02f, -1.509063942e-02f, -8.358376073e-03f, +2.282474020e-03f, +1.580956857e-02f, +3.045562382e-02f, +4.401294924e-02f, +5.426900397e-02f, +5.947187109e-02f, +5.871170658e-02f, +5.212225317e-02f, +4.085108928e-02f, +2.680621624e-02f, +1.224338834e-02f, -7.025853429e-04f, -1.042897178e-02f, -1.612524439e-02f, -1.783270772e-02f, -1.630847986e-02f, -1.274782488e-02f, -8.449436275e-03f, - -1.721951657e-04f, -2.369219327e-04f, -3.016692895e-04f, -3.597484994e-04f, -4.042118656e-04f, -4.286964203e-04f, -4.282635524e-04f, -4.001160478e-04f, -3.440856280e-04f, -2.628124281e-04f, -1.615791025e-04f, -4.781032135e-05f, +6.970393379e-05f, +1.817630045e-04f, +2.797639649e-04f, +3.566318012e-04f, +4.075507701e-04f, +4.304052395e-04f, +4.258801573e-04f, +3.972195913e-04f, +3.496891145e-04f, +2.898270411e-04f, +2.245949568e-04f, +1.605462403e-04f, - +2.709675269e-04f, +2.468645241e-04f, +1.426473226e-04f, -4.111047175e-05f, -2.827181000e-04f, -5.413105277e-04f, -7.644060876e-04f, -8.995787250e-04f, -9.073974534e-04f, -7.721875796e-04f, -5.075497148e-04f, -1.548702100e-04f, +2.250788795e-04f, +5.654559003e-04f, +8.082175138e-04f, +9.167389877e-04f, +8.830173267e-04f, +7.277940577e-04f, +4.938691005e-04f, +2.346724664e-04f, +1.305218783e-06f, -1.685455871e-04f, -2.571772862e-04f, -2.677294810e-04f, - /* 1, 7 (24) */ - +4.410466750e-03f, +7.646911971e-03f, +1.192752178e-02f, +1.720333121e-02f, +2.331533930e-02f, +2.999662057e-02f, +3.688806266e-02f, +4.356677263e-02f, +4.958436155e-02f, +5.451079873e-02f, +5.797856569e-02f, +5.972159935e-02f, +5.960404880e-02f, +5.763511870e-02f, +5.396806029e-02f, +4.888344231e-02f, +4.275888533e-02f, +3.602917687e-02f, +2.914185094e-02f, +2.251375516e-02f, +1.649379190e-02f, +1.133597866e-02f, +7.185400519e-03f, +4.077774633e-03f, - -9.256344192e-03f, -1.350967382e-02f, -1.678886108e-02f, -1.778947474e-02f, -1.537335752e-02f, -8.899686600e-03f, +1.518067933e-03f, +1.490998984e-02f, +2.954822637e-02f, +4.324076166e-02f, +5.376145426e-02f, +5.931700088e-02f, +5.893678546e-02f, +5.268770907e-02f, +4.165930679e-02f, +2.772295523e-02f, +1.312640567e-02f, +2.520871482e-05f, -9.935102679e-03f, -1.589057192e-02f, -1.783140250e-02f, -1.647702544e-02f, -1.300500216e-02f, -8.717165756e-03f, - -1.682877448e-04f, -2.328104765e-04f, -2.977455511e-04f, -3.564465022e-04f, -4.019576904e-04f, -4.278543613e-04f, -4.290860228e-04f, -4.027044898e-04f, -3.483684379e-04f, -2.685437043e-04f, -1.683591769e-04f, -5.512596196e-05f, +6.242458181e-05f, +1.750878111e-04f, +2.741947301e-04f, +3.525508042e-04f, +4.051828091e-04f, +4.297997704e-04f, +4.269152631e-04f, +3.996264454e-04f, +3.530928104e-04f, +2.937975659e-04f, +2.287009755e-04f, +1.644043723e-04f, - +2.701299199e-04f, +2.506174995e-04f, +1.516010816e-04f, -2.759933578e-05f, -2.666167631e-04f, -5.256172082e-04f, -7.525336599e-04f, -8.945536224e-04f, -9.110788299e-04f, -7.847213850e-04f, -5.272194464e-04f, -1.784035434e-04f, +2.018118763e-04f, +5.465257405e-04f, +7.967334832e-04f, +9.141923133e-04f, +8.890305516e-04f, +7.403255578e-04f, +5.097988707e-04f, +2.505976453e-04f, +1.432842854e-05f, -1.602345538e-04f, -2.540541594e-04f, -2.690485160e-04f, - /* 1, 8 (24) */ - +4.242179005e-03f, +7.414101494e-03f, +1.162977623e-02f, +1.684688471e-02f, +2.291338161e-02f, +2.956876621e-02f, +3.645897664e-02f, +4.316406814e-02f, +4.923599311e-02f, +5.424225502e-02f, +5.781020651e-02f, +5.966647338e-02f, +5.966647338e-02f, +5.781020651e-02f, +5.424225502e-02f, +4.923599311e-02f, +4.316406814e-02f, +3.645897664e-02f, +2.956876621e-02f, +2.291338161e-02f, +1.684688471e-02f, +1.162977623e-02f, +7.414101494e-03f, +4.242179005e-03f, - -8.986214272e-03f, -1.325905632e-02f, -1.663726000e-02f, -1.781707408e-02f, -1.563997428e-02f, -9.425303809e-03f, +7.655342726e-04f, +1.401543622e-02f, +2.863714754e-02f, +4.245604027e-02f, +5.323423481e-02f, +5.913859734e-02f, +5.913859734e-02f, +5.323423481e-02f, +4.245604027e-02f, +2.863714754e-02f, +1.401543622e-02f, +7.655342726e-04f, -9.425303809e-03f, -1.563997428e-02f, -1.781707408e-02f, -1.663726000e-02f, -1.325905632e-02f, -8.986214272e-03f, - -1.644043723e-04f, -2.287009755e-04f, -2.937975659e-04f, -3.530928104e-04f, -3.996264454e-04f, -4.269152631e-04f, -4.297997704e-04f, -4.051828091e-04f, -3.525508042e-04f, -2.741947301e-04f, -1.750878111e-04f, -6.242458181e-05f, +5.512596196e-05f, +1.683591769e-04f, +2.685437043e-04f, +3.483684379e-04f, +4.027044898e-04f, +4.290860228e-04f, +4.278543613e-04f, +4.019576904e-04f, +3.564465022e-04f, +2.977455511e-04f, +2.328104765e-04f, +1.682877448e-04f, - +2.690485160e-04f, +2.540541594e-04f, +1.602345538e-04f, -1.432842854e-05f, -2.505976453e-04f, -5.097988707e-04f, -7.403255578e-04f, -8.890305516e-04f, -9.141923133e-04f, -7.967334832e-04f, -5.465257405e-04f, -2.018118763e-04f, +1.784035434e-04f, +5.272194464e-04f, +7.847213850e-04f, +9.110788299e-04f, +8.945536224e-04f, +7.525336599e-04f, +5.256172082e-04f, +2.666167631e-04f, +2.759933578e-05f, -1.516010816e-04f, -2.506174995e-04f, -2.701299199e-04f, - /* 1, 9 (24) */ - +4.077774633e-03f, +7.185400519e-03f, +1.133597866e-02f, +1.649379190e-02f, +2.251375516e-02f, +2.914185094e-02f, +3.602917687e-02f, +4.275888533e-02f, +4.888344231e-02f, +5.396806029e-02f, +5.763511870e-02f, +5.960404880e-02f, +5.972159935e-02f, +5.797856569e-02f, +5.451079873e-02f, +4.958436155e-02f, +4.356677263e-02f, +3.688806266e-02f, +2.999662057e-02f, +2.331533930e-02f, +1.720333121e-02f, +1.192752178e-02f, +7.646911971e-03f, +4.410466750e-03f, - -8.717165756e-03f, -1.300500216e-02f, -1.647702544e-02f, -1.783140250e-02f, -1.589057192e-02f, -9.935102679e-03f, +2.520871482e-05f, +1.312640567e-02f, +2.772295523e-02f, +4.165930679e-02f, +5.268770907e-02f, +5.893678546e-02f, +5.931700088e-02f, +5.376145426e-02f, +4.324076166e-02f, +2.954822637e-02f, +1.490998984e-02f, +1.518067933e-03f, -8.899686600e-03f, -1.537335752e-02f, -1.778947474e-02f, -1.678886108e-02f, -1.350967382e-02f, -9.256344192e-03f, - -1.605462403e-04f, -2.245949568e-04f, -2.898270411e-04f, -3.496891145e-04f, -3.972195913e-04f, -4.258801573e-04f, -4.304052395e-04f, -4.075507701e-04f, -3.566318012e-04f, -2.797639649e-04f, -1.817630045e-04f, -6.970393379e-05f, +4.781032135e-05f, +1.615791025e-04f, +2.628124281e-04f, +3.440856280e-04f, +4.001160478e-04f, +4.282635524e-04f, +4.286964203e-04f, +4.042118656e-04f, +3.597484994e-04f, +3.016692895e-04f, +2.369219327e-04f, +1.721951657e-04f, - +2.677294810e-04f, +2.571772862e-04f, +1.685455871e-04f, -1.305218783e-06f, -2.346724664e-04f, -4.938691005e-04f, -7.277940577e-04f, -8.830173267e-04f, -9.167389877e-04f, -8.082175138e-04f, -5.654559003e-04f, -2.250788795e-04f, +1.548702100e-04f, +5.075497148e-04f, +7.721875796e-04f, +9.073974534e-04f, +8.995787250e-04f, +7.644060876e-04f, +5.413105277e-04f, +2.827181000e-04f, +4.111047175e-05f, -1.426473226e-04f, -2.468645241e-04f, -2.709675269e-04f, - /* 1,10 (24) */ - +3.917228392e-03f, +6.960805562e-03f, +1.104615162e-02f, +1.614410278e-02f, +2.211653557e-02f, +2.871597079e-02f, +3.559877163e-02f, +4.235133456e-02f, +4.852681050e-02f, +5.368829633e-02f, +5.745335570e-02f, +5.953434487e-02f, +5.976940967e-02f, +5.814014479e-02f, +5.477361115e-02f, +4.992844718e-02f, +4.396688867e-02f, +3.731632621e-02f, +3.042531699e-02f, +2.371955116e-02f, +1.756307971e-02f, +1.222919107e-02f, +7.883833904e-03f, +4.582661915e-03f, - -8.449436275e-03f, -1.274782488e-02f, -1.630847986e-02f, -1.783270772e-02f, -1.612524439e-02f, -1.042897178e-02f, -7.025853429e-04f, +1.224338834e-02f, +2.680621624e-02f, +4.085108928e-02f, +5.212225317e-02f, +5.871170658e-02f, +5.947187109e-02f, +5.426900397e-02f, +4.401294924e-02f, +3.045562382e-02f, +1.580956857e-02f, +2.282474020e-03f, -8.358376073e-03f, -1.509063942e-02f, -1.774836427e-02f, -1.693150840e-02f, -1.375653835e-02f, -9.527311719e-03f, - -1.567145163e-04f, -2.204939308e-04f, -2.858356777e-04f, -3.462371119e-04f, -3.947386096e-04f, -4.247501074e-04f, -4.309029143e-04f, -4.098081809e-04f, -3.606105449e-04f, -2.852499031e-04f, -1.883827791e-04f, -7.696177919e-05f, +4.047991444e-05f, +1.547496110e-04f, +2.570024759e-04f, +3.397033418e-04f, +3.974177623e-04f, +4.273319557e-04f, +4.294404412e-04f, +4.063875313e-04f, +3.629971201e-04f, +3.055670693e-04f, +2.410338005e-04f, +1.761254183e-04f, - +2.661791237e-04f, +2.599899292e-04f, +1.765323633e-04f, +1.146314106e-05f, -2.188527386e-04f, -4.778414546e-04f, -7.149516148e-04f, -8.765221205e-04f, -9.187203972e-04f, -8.191675683e-04f, -5.839975600e-04f, -2.481883498e-04f, +1.312283164e-04f, +4.875295623e-04f, +7.591388741e-04f, +9.031475626e-04f, +9.040984124e-04f, +7.759307559e-04f, +5.568652287e-04f, +2.988897381e-04f, +5.485405554e-05f, -1.333757646e-04f, -2.427927233e-04f, -2.715553220e-04f, - /* 1,11 (24) */ - +3.760513876e-03f, +6.740311631e-03f, +1.076031594e-02f, +1.579786567e-02f, +2.172179696e-02f, +2.829122068e-02f, +3.516786871e-02f, +4.194152638e-02f, +4.816619996e-02f, +5.340304642e-02f, +5.726497292e-02f, +5.945738309e-02f, +5.980988958e-02f, +5.829489440e-02f, +5.503061363e-02f, +5.026815052e-02f, +4.436430644e-02f, +3.774365817e-02f, +3.085475743e-02f, +2.412593869e-02f, +1.792607683e-02f, +1.253475814e-02f, +8.124867704e-03f, +4.758787334e-03f, - -8.183257151e-03f, -1.248783495e-02f, -1.613194749e-02f, -1.782124458e-02f, -1.634409713e-02f, -1.090681323e-02f, -1.417536958e-03f, +1.136686622e-02f, +2.588749584e-02f, +4.003192171e-02f, +5.153825561e-02f, +5.846351823e-02f, +5.960309941e-02f, +5.475653353e-02f, +4.477208811e-02f, +3.135877139e-02f, +1.671366698e-02f, +3.058404776e-03f, -7.801510844e-03f, -1.479174968e-02f, -1.769351021e-02f, -1.706488416e-02f, -1.399933107e-02f, -9.798867041e-03f, - -1.529103426e-04f, -2.163993902e-04f, -2.818251702e-04f, -3.427385065e-04f, -3.921850012e-04f, -4.235262086e-04f, -4.312933190e-04f, -4.119548933e-04f, -3.644861934e-04f, -2.906510740e-04f, -1.949451810e-04f, -8.419588858e-05f, +3.313700212e-05f, +1.478727465e-04f, +2.511154556e-04f, +3.352225880e-04f, +3.946099562e-04f, +4.262908700e-04f, +4.300854583e-04f, +4.084832700e-04f, +3.661906908e-04f, +3.094371743e-04f, +2.451445209e-04f, +1.800772619e-04f, - +2.644038865e-04f, +2.624953972e-04f, +1.841933961e-04f, +2.396981877e-05f, -2.031497574e-04f, -4.617294493e-04f, -7.018108507e-04f, -8.695534551e-04f, -9.201385428e-04f, -8.295781937e-04f, -6.021386948e-04f, -2.711242241e-04f, +1.074944000e-04f, +4.671723146e-04f, +7.455825185e-04f, +8.983290016e-04f, +9.081056146e-04f, +7.870957839e-04f, +5.722677081e-04f, +3.151195712e-04f, +6.882199867e-05f, -1.237892318e-04f, -2.383998657e-04f, -2.718874504e-04f, - /* 1,12 (24) */ - +3.607603534e-03f, +6.523912241e-03f, +1.047849077e-02f, +1.545512716e-02f, +2.132961196e-02f, +2.786769447e-02f, +3.473657539e-02f, +4.152957148e-02f, +4.780171377e-02f, +5.311239535e-02f, +5.707002774e-02f, +5.937318720e-02f, +5.984302658e-02f, +5.844276715e-02f, +5.528172909e-02f, +5.060337311e-02f, +4.475891639e-02f, +3.816994904e-02f, +3.128484289e-02f, +2.453442196e-02f, +1.829226752e-02f, +1.284419531e-02f, +8.370012225e-03f, +4.938864596e-03f, - -7.918853265e-03f, -1.222533955e-02f, -1.594775410e-02f, -1.779727476e-02f, -1.654724689e-02f, -1.136854268e-02f, -2.119347808e-03f, +1.049731277e-02f, +2.496735730e-02f, +3.920234351e-02f, +5.093611691e-02f, +5.819239401e-02f, +5.971059381e-02f, +5.522370585e-02f, +4.551767063e-02f, +3.225710039e-02f, +1.762177259e-02f, +3.845500560e-03f, -7.229243136e-03f, -1.447663011e-02f, -1.762468821e-02f, -1.718867340e-02f, -1.423773094e-02f, -1.007075449e-02f, - -1.491348359e-04f, -2.123128096e-04f, -2.777972061e-04f, -3.391950078e-04f, -3.895602860e-04f, -4.222095865e-04f, -4.315770173e-04f, -4.139908027e-04f, -3.682579471e-04f, -2.959660430e-04f, -2.014482809e-04f, -9.140404286e-05f, +2.578385067e-05f, +1.409505737e-04f, +2.451530077e-04f, +3.306444157e-04f, +3.916929963e-04f, +4.251399738e-04f, +4.306305397e-04f, +4.104976870e-04f, +3.693275483e-04f, +3.132778847e-04f, +2.492525195e-04f, +1.840494321e-04f, - +2.624103371e-04f, +2.646972525e-04f, +1.915275290e-04f, +3.620830577e-05f, -1.875745925e-04f, -4.455465481e-04f, -6.883845401e-04f, -8.621201918e-04f, -9.209958781e-04f, -8.394443961e-04f, -6.198676315e-04f, -2.938705940e-04f, +8.368507996e-05f, +4.464915949e-04f, +7.315261995e-04f, +8.929420818e-04f, +9.115936458e-04f, +7.978895069e-04f, +5.875043727e-04f, +3.313953148e-04f, +8.300591000e-05f, -1.138908863e-04f, -2.336840048e-04f, -2.719582255e-04f, - /* 1,13 (24) */ - +3.458468698e-03f, +6.311599431e-03f, +1.020069357e-02f, +1.511593216e-02f, +2.094005167e-02f, +2.744548489e-02f, +3.430499838e-02f, +4.111558068e-02f, +4.743345582e-02f, +5.281642931e-02f, +5.686857946e-02f, +5.928178316e-02f, +5.986881044e-02f, +5.858371772e-02f, +5.552688209e-02f, +5.093401752e-02f, +4.515060939e-02f, +3.859508901e-02f, +3.171547343e-02f, +2.494491965e-02f, +1.866159507e-02f, +1.315747320e-02f, +8.619264745e-03f, +5.122914028e-03f, - -7.656442928e-03f, -1.196064230e-02f, -1.575622657e-02f, -1.776106646e-02f, -1.673482148e-02f, -1.181408923e-02f, -2.807732349e-03f, +9.635192575e-03f, +2.404636142e-02f, +3.836289912e-02f, +5.031624928e-02f, +5.789852341e-02f, +5.979427889e-02f, +5.567019744e-02f, +4.624919683e-02f, +3.315004247e-02f, +1.853336624e-02f, +4.643390067e-03f, -6.641738763e-03f, -1.414523479e-02f, -1.754168230e-02f, -1.730256428e-02f, -1.447141494e-02f, -1.034271272e-02f, - -1.453890870e-04f, -2.082356450e-04f, -2.737534645e-04f, -3.356083300e-04f, -3.868660020e-04f, -4.208013970e-04f, -4.317546116e-04f, -4.159158478e-04f, -3.719250490e-04f, -3.011934115e-04f, -2.078901751e-04f, -9.858403415e-05f, +1.842273085e-05f, +1.339851768e-04f, +2.391168051e-04f, +3.259699149e-04f, +3.886672932e-04f, +4.238789874e-04f, +4.310747882e-04f, +4.124294112e-04f, +3.724060396e-04f, +3.170874784e-04f, +2.533562076e-04f, +1.880406414e-04f, - +2.602051597e-04f, +2.665993037e-04f, +1.985339325e-04f, +4.817242024e-05f, -1.721380793e-04f, -4.293061488e-04f, -6.746855984e-04f, -8.542315214e-04f, -9.212953056e-04f, -8.487616438e-04f, -6.371730579e-04f, -3.164117194e-04f, +5.981704284e-05f, +4.255013118e-04f, +7.169780354e-04f, +8.869875835e-04f, +9.145562136e-04f, +8.083004890e-04f, +6.025616528e-04f, +3.477045164e-04f, +9.739710104e-05f, -1.036842282e-04f, -2.286434837e-04f, -2.717621372e-04f, - /* 1,14 (24) */ - +3.313079611e-03f, +6.103363786e-03f, +9.926940101e-03f, +1.478032383e-02f, +2.055318567e-02f, +2.702468349e-02f, +3.387324377e-02f, +4.069966483e-02f, +4.706153077e-02f, +5.251523590e-02f, +5.666068928e-02f, +5.918319912e-02f, +5.988723317e-02f, +5.871770290e-02f, +5.576599890e-02f, +5.125998744e-02f, +4.553927668e-02f, +3.901896800e-02f, +3.214654822e-02f, +2.535734906e-02f, +1.903400111e-02f, +1.347456067e-02f, +8.872620952e-03f, +5.310954669e-03f, - -7.396237768e-03f, -1.169404300e-02f, -1.555769263e-02f, -1.771289404e-02f, -1.690695956e-02f, -1.224339538e-02f, -3.482417947e-03f, +8.780961054e-03f, +2.312506611e-02f, +3.751413748e-02f, +4.967907622e-02f, +5.758211169e-02f, +5.985409593e-02f, +5.609569875e-02f, +4.696617487e-02f, +3.403703005e-02f, +1.944792245e-02f, +5.451690556e-03f, -6.039177110e-03f, -1.379753027e-02f, -1.744428520e-02f, -1.740624851e-02f, -1.470005842e-02f, -1.061447485e-02f, - -1.416741607e-04f, -2.041693330e-04f, -2.696956158e-04f, -3.319801912e-04f, -3.841037044e-04f, -4.193028253e-04f, -4.318267432e-04f, -4.177300107e-04f, -3.754867850e-04f, -3.063318181e-04f, -2.142689858e-04f, -1.057336668e-04f, +1.105591687e-05f, +1.269786586e-04f, +2.330085517e-04f, +3.212002155e-04f, +3.855333010e-04f, +4.225076726e-04f, +4.314173415e-04f, +4.142770958e-04f, +3.754245234e-04f, +3.208642311e-04f, +2.574539829e-04f, +1.920495797e-04f, - +2.577951457e-04f, +2.682055987e-04f, +2.052121014e-04f, +5.985630987e-05f, -1.568508104e-04f, -4.130215719e-04f, -6.607270683e-04f, -8.458969541e-04f, -9.210401721e-04f, -8.575258695e-04f, -6.540440323e-04f, -3.387320427e-04f, +3.590702749e-05f, +4.042156479e-04f, +7.019465696e-04f, +8.804667570e-04f, +9.169874259e-04f, +8.183175346e-04f, +6.174260146e-04f, +3.640345662e-04f, +1.119865916e-04f, -9.317309612e-05f, -2.232769411e-04f, -2.712938608e-04f, - /* 1,15 (24) */ - +3.171405450e-03f, +5.899194453e-03f, +9.657244486e-03f, +1.444834364e-02f, +2.016908197e-02f, +2.660538066e-02f, +3.344141702e-02f, +4.028193482e-02f, +4.668604398e-02f, +5.220890408e-02f, +5.644642030e-02f, +5.907746546e-02f, +5.989828908e-02f, +5.884468156e-02f, +5.599900745e-02f, +5.158118765e-02f, +4.592480998e-02f, +3.944147567e-02f, +3.257796556e-02f, +2.577162616e-02f, +1.940942563e-02f, +1.379542491e-02f, +9.130074935e-03f, +5.503004249e-03f, - -7.138442622e-03f, -1.142583740e-02f, -1.535248053e-02f, -1.765303773e-02f, -1.706381037e-02f, -1.265641695e-02f, -4.143145015e-03f, +7.935064099e-03f, +2.220402594e-02f, +3.665661161e-02f, +4.902503219e-02f, +5.724337965e-02f, +5.989000296e-02f, +5.649991440e-02f, +4.766812144e-02f, +3.491749681e-02f, +2.036490988e-02f, +6.270008090e-03f, -5.421751096e-03f, -1.343349571e-02f, -1.733229861e-02f, -1.749942161e-02f, -1.492333537e-02f, -1.088576871e-02f, - -1.379910952e-04f, -2.001152905e-04f, -2.656253207e-04f, -3.283123126e-04f, -3.812749648e-04f, -4.177150854e-04f, -4.317940913e-04f, -4.194333165e-04f, -3.789424838e-04f, -3.113799387e-04f, -2.205828625e-04f, -1.128507582e-04f, +3.685685399e-06f, +1.199331400e-04f, +2.268299826e-04f, +3.163364871e-04f, +3.822915174e-04f, +4.210258335e-04f, +4.316573727e-04f, +4.160394191e-04f, +3.783813704e-04f, +3.246064176e-04f, +2.615442299e-04f, +1.960749141e-04f, - +2.551871856e-04f, +2.695204175e-04f, +2.115618514e-04f, +7.125445421e-05f, -1.417231279e-04f, -3.967060483e-04f, -6.465221071e-04f, -8.371263083e-04f, -9.202342634e-04f, -8.657334732e-04f, -6.704699924e-04f, -3.608162026e-04f, +1.197181021e-05f, +3.826490473e-04f, +6.864407641e-04f, +8.733813231e-04f, +9.188817989e-04f, +8.279297007e-04f, +6.320839735e-04f, +3.803727076e-04f, +1.267651157e-04f, -8.236166666e-05f, -2.175833157e-04f, -2.705482644e-04f, - /* 2, 0 (24) */ - -5.457237816e-03f, -5.749299516e-03f, -3.461751951e-03f, +2.582273506e-03f, +1.313454258e-02f, +2.821995581e-02f, +4.696043930e-02f, +6.759089318e-02f, +8.768840227e-02f, +1.045803996e-01f, +1.158471781e-01f, +1.198039495e-01f, +1.158471781e-01f, +1.045803996e-01f, +8.768840227e-02f, +6.759089318e-02f, +4.696043930e-02f, +2.821995581e-02f, +1.313454258e-02f, +2.582273506e-03f, -3.461751951e-03f, -5.749299516e-03f, -5.457237816e-03f, -3.849841082e-03f, - +4.983817699e-03f, -1.227513667e-04f, -9.809575408e-03f, -2.203309842e-02f, -3.273451869e-02f, -3.710431359e-02f, -3.150070121e-02f, -1.524079756e-02f, +8.576361107e-03f, +3.371394239e-02f, +5.279197856e-02f, +5.990197477e-02f, +5.279197856e-02f, +3.371394239e-02f, +8.576361107e-03f, -1.524079756e-02f, -3.150070121e-02f, -3.710431359e-02f, -3.273451869e-02f, -2.203309842e-02f, -9.809575408e-03f, -1.227513667e-04f, +4.983817699e-03f, +5.702431282e-03f, - +7.447335023e-05f, -4.396091421e-05f, -2.422447510e-04f, -5.051464861e-04f, -7.964121267e-04f, -1.063741346e-03f, -1.248955534e-03f, -1.301173316e-03f, -1.189717810e-03f, -9.132707466e-04f, -5.025821872e-04f, -1.565749561e-05f, +4.736669608e-04f, +8.910528549e-04f, +1.177113412e-03f, +1.299176747e-03f, +1.256559625e-03f, +1.078316198e-03f, +8.144211337e-04f, +5.229980927e-04f, +2.570578584e-04f, +5.406346933e-05f, -6.940512698e-05f, -1.171960904e-04f, - +1.610944214e-04f, +4.619052037e-04f, +7.126502117e-04f, +7.688324450e-04f, +5.316250007e-04f, +6.905729617e-06f, -6.740237072e-04f, -1.288481522e-03f, -1.602915254e-03f, -1.468219911e-03f, -8.881672048e-04f, -2.854291356e-05f, +8.401694814e-04f, +1.444053089e-03f, +1.608473031e-03f, +1.319082469e-03f, +7.169441422e-04f, +3.305666933e-05f, -5.065084646e-04f, -7.631614087e-04f, -7.232615691e-04f, -4.805646748e-04f, -1.787500512e-04f, +5.547479234e-05f, - /* 2, 1 (24) */ - -5.382764466e-03f, -5.793260431e-03f, -3.703996702e-03f, +2.077127020e-03f, +1.233813045e-02f, +2.715621446e-02f, +4.571148376e-02f, +6.628971986e-02f, +8.649868446e-02f, +1.036671289e-01f, +1.153445960e-01f, +1.197882920e-01f, +1.163208451e-01f, +1.054714525e-01f, +8.886551568e-02f, +6.889006993e-02f, +4.821699892e-02f, +2.929827201e-02f, +1.394896371e-02f, +3.105271599e-03f, -3.204694092e-03f, -5.695236047e-03f, -5.526642943e-03f, -3.967037172e-03f, - +5.144912120e-03f, +3.391538370e-04f, -9.096925196e-03f, -2.126426598e-02f, -3.220289369e-02f, -3.709740786e-02f, -3.217472492e-02f, -1.652927908e-02f, +6.973445853e-03f, +3.224572248e-02f, +5.190381135e-02f, +5.987343185e-02f, +5.363214804e-02f, +3.515799548e-02f, +1.018483414e-02f, -1.392171509e-02f, -3.078375707e-02f, -3.707125692e-02f, -3.324102715e-02f, -2.279625983e-02f, -1.053283698e-02f, -6.033160415e-04f, +4.805067648e-03f, +5.757906075e-03f, - +7.924428113e-05f, -3.417704185e-05f, -2.276911350e-04f, -4.874111149e-04f, -7.783116620e-04f, -1.048843356e-03f, -1.240825207e-03f, -1.302520727e-03f, -1.201666972e-03f, -9.349551213e-04f, -5.311943066e-04f, -4.696294436e-05f, +4.444657095e-04f, +8.683130181e-04f, +1.163857688e-03f, +1.296526957e-03f, +1.263626965e-03f, +1.092553812e-03f, +8.323243973e-04f, +5.409545148e-04f, +2.721238813e-04f, +6.448351439e-05f, -6.403626576e-05f, -1.161209850e-04f, - +1.437495025e-04f, +4.430579567e-04f, +7.012637304e-04f, +7.733217142e-04f, +5.555752224e-04f, +4.622611733e-05f, -6.308478599e-04f, -1.256679994e-03f, -1.595550745e-03f, -1.490591427e-03f, -9.350368534e-04f, -8.559205927e-05f, +7.911031327e-04f, +1.418114570e-03f, +1.612204906e-03f, +1.348431235e-03f, +7.595474433e-04f, +7.361331520e-05f, -4.802437219e-04f, -7.562953008e-04f, -7.330641614e-04f, -4.989997239e-04f, -1.966919200e-04f, +4.440305368e-05f, - /* 2, 2 (24) */ - -5.303520185e-03f, -5.827437472e-03f, -3.931687837e-03f, +1.589715905e-03f, +1.155981879e-02f, +2.610737111e-02f, +4.447065856e-02f, +6.498719914e-02f, +8.529701749e-02f, +1.027321738e-01f, +1.148134017e-01f, +1.197413291e-01f, +1.167653108e-01f, +1.063397655e-01f, +9.002937337e-02f, +7.018659688e-02f, +4.948062589e-02f, +3.039082582e-02f, +1.478128811e-02f, +3.646226113e-03f, -2.932570211e-03f, -5.630752533e-03f, -5.590679209e-03f, -4.083158157e-03f, - +5.288661623e-03f, +7.822117937e-04f, -8.395661465e-03f, -2.049094426e-02f, -3.164731846e-02f, -3.705118174e-02f, -3.280557278e-02f, -1.778595908e-02f, +5.377895108e-03f, +3.075513105e-02f, +5.096877450e-02f, +5.978783980e-02f, +5.442325117e-02f, +3.657611005e-02f, +1.179703904e-02f, -1.257328386e-02f, -3.002420963e-02f, -3.699764360e-02f, -3.372127087e-02f, -2.355255513e-02f, -1.126590114e-02f, -1.102315765e-03f, +4.608375728e-03f, +5.802309129e-03f, - +8.372149579e-05f, -2.471272391e-05f, -2.134032501e-04f, -4.698031407e-04f, -7.601339276e-04f, -1.033636441e-03f, -1.232179476e-03f, -1.303223507e-03f, -1.212957498e-03f, -9.560948405e-04f, -5.594864885e-04f, -7.823977369e-05f, +4.149957535e-04f, +8.450632330e-04f, +1.149955055e-03f, +1.293220355e-03f, +1.270147369e-03f, +1.106440210e-03f, +8.501075458e-04f, +5.590040813e-04f, +2.874359097e-04f, +7.521953202e-05f, -5.836365872e-05f, -1.148160727e-04f, - +1.267386733e-04f, +4.240592003e-04f, +6.891364809e-04f, +7.766442229e-04f, +5.783430865e-04f, +8.485825299e-05f, -5.874781133e-04f, -1.223730844e-03f, -1.586401168e-03f, -1.511146685e-03f, -9.807206967e-04f, -1.425312172e-04f, +7.410292380e-04f, +1.390430588e-03f, +1.614094247e-03f, +1.376477675e-03f, +8.017717782e-04f, +1.147149834e-04f, -4.528509384e-04f, -7.482225637e-04f, -7.420251329e-04f, -5.171733863e-04f, -2.148944892e-04f, +3.280060770e-05f, - /* 2, 3 (24) */ - -5.219798689e-03f, -5.852150196e-03f, -4.145091087e-03f, +1.119912764e-03f, +1.079968486e-02f, +2.507373467e-02f, +4.323847908e-02f, +6.368397563e-02f, +8.408405999e-02f, +1.017760789e-01f, +1.142539152e-01f, +1.196630893e-01f, +1.171803066e-01f, +1.071848287e-01f, +9.117932843e-02f, +7.147981724e-02f, +5.075077326e-02f, +3.149726603e-02f, +1.563139565e-02f, +4.205230195e-03f, -2.645134301e-03f, -5.555533001e-03f, -5.649042868e-03f, -4.197974230e-03f, - +5.415400296e-03f, +1.206270994e-03f, -7.706524985e-03f, -1.971430004e-02f, -3.106897538e-02f, -3.696632349e-02f, -3.339305089e-02f, -1.900968992e-02f, +3.791493940e-03f, +2.924398436e-02f, +4.998805380e-02f, +5.964530858e-02f, +5.516428041e-02f, +3.796654063e-02f, +1.341113329e-02f, -1.119680618e-02f, -2.922243785e-02f, -3.688292862e-02f, -3.417412181e-02f, -2.430077770e-02f, -1.200792627e-02f, -1.619489152e-03f, +4.393481238e-03f, +5.835109736e-03f, - +8.790879338e-05f, -1.556851470e-05f, -1.993869984e-04f, -4.523334583e-04f, -7.418930018e-04f, -1.018134912e-03f, -1.223029481e-03f, -1.303286642e-03f, -1.223586498e-03f, -9.766792073e-04f, -5.874421685e-04f, -1.094689306e-04f, +3.852746369e-04f, +8.213159125e-04f, +1.135410439e-03f, +1.289253825e-03f, +1.276110995e-03f, +1.119961557e-03f, +8.677561346e-04f, +5.771348786e-04f, +3.029867020e-04f, +8.626967713e-05f, -5.238444285e-05f, -1.132755013e-04f, - +1.100841935e-04f, +4.049447613e-04f, +6.763034625e-04f, +7.788166310e-04f, +5.999146171e-04f, +1.227574793e-04f, -5.439756757e-04f, -1.189688301e-03f, -1.575490638e-03f, -1.529867409e-03f, -1.025162808e-03f, -1.992872499e-04f, +6.900104146e-04f, +1.361029974e-03f, +1.614126997e-03f, +1.403173181e-03f, +8.435553022e-04f, +1.563110555e-04f, -4.243523280e-04f, -7.389334301e-04f, -7.501124831e-04f, -5.350484419e-04f, -2.333311836e-04f, +2.067529037e-05f, - /* 2, 4 (24) */ - -5.131889896e-03f, -5.867718711e-03f, -4.344478085e-03f, +6.675793059e-04f, +1.005779186e-02f, +2.405559975e-02f, +4.201544960e-02f, +6.238068899e-02f, +8.286047349e-02f, +1.007993997e-01f, +1.136664730e-01f, +1.195536204e-01f, +1.175655812e-01f, +1.080061447e-01f, +9.231473886e-02f, +7.276907106e-02f, +5.202688425e-02f, +3.261722759e-02f, +1.649915179e-02f, +4.782365073e-03f, -2.342147599e-03f, -5.469263323e-03f, -5.701427310e-03f, -4.311249731e-03f, - +5.525484490e-03f, +1.611215755e-03f, -7.030221522e-03f, -1.893548341e-02f, -3.046906076e-02f, -3.684356601e-02f, -3.393702657e-02f, -2.019937822e-02f, +2.216003302e-03f, +2.771411696e-02f, +4.896289099e-02f, +5.944602133e-02f, +5.585429082e-02f, +3.932757061e-02f, +1.502526029e-02f, -9.793633001e-03f, -2.837888255e-02f, -3.672661756e-02f, -3.459847414e-02f, -2.503971113e-02f, -1.275803875e-02f, -2.154537594e-03f, +4.160150055e-03f, +5.855785027e-03f, - +9.181018856e-05f, -6.744655180e-06f, -1.856479425e-04f, -4.350126895e-04f, -7.236028412e-04f, -1.002353166e-03f, -1.213386654e-03f, -1.302715571e-03f, -1.233551590e-03f, -9.966979741e-04f, -6.150450611e-04f, -1.406314021e-04f, +3.553201127e-04f, +7.970838758e-04f, +1.120229268e-03f, +1.284624736e-03f, +1.281508348e-03f, +1.133104170e-03f, +8.852556579e-04f, +5.953347587e-04f, +3.187686877e-04f, +9.763177411e-05f, -4.609600695e-05f, -1.114935439e-04f, - +9.380718275e-05f, +3.857499684e-04f, +6.628002469e-04f, +7.798572015e-04f, +6.202779047e-04f, +1.598807795e-04f, -5.004013551e-04f, -1.154607768e-03f, -1.562845666e-03f, -1.546738023e-03f, -1.068309149e-03f, -2.557873015e-04f, +6.381107241e-04f, +1.329944115e-03f, +1.612291711e-03f, +1.428470775e-03f, +8.848362575e-04f, +1.983495881e-04f, -3.947721387e-04f, -7.284199629e-04f, -7.572951362e-04f, -5.525874792e-04f, -2.519744239e-04f, +8.036155108e-06f, - /* 2, 5 (24) */ - -5.040079707e-03f, -5.874463366e-03f, -4.530126028e-03f, +2.325666164e-04f, +9.334189017e-03f, +2.305324659e-02f, +4.080206294e-02f, +6.107797342e-02f, +8.162692190e-02f, +9.980270174e-02f, +1.130514279e-01f, +1.194129890e-01f, +1.179209013e-01f, +1.088032285e-01f, +9.343496813e-02f, +7.405369580e-02f, +5.330839260e-02f, +3.375033176e-02f, +1.738440745e-02f, +5.377699832e-03f, -2.023378911e-03f, -5.371631549e-03f, -5.747523317e-03f, -4.422743275e-03f, - +5.619291672e-03f, +1.996965724e-03f, -6.367421275e-03f, -1.815562621e-02f, -2.984878286e-02f, -3.668368523e-02f, -3.443742792e-02f, -2.135398599e-02f, +6.531576364e-04f, +2.616737893e-02f, +4.789458185e-02f, +5.919023403e-02f, +5.649240155e-02f, +4.065751472e-02f, +1.663755200e-02f, -8.365162226e-03f, -2.749404629e-02f, -3.652826797e-02f, -3.499324628e-02f, -2.576813109e-02f, -1.351533389e-02f, -2.707125073e-03f, +3.908175631e-03f, +5.863821182e-03f, - +9.542990372e-05f, +1.758922717e-06f, -1.721913048e-04f, -4.178511756e-04f, -7.052772694e-04f, -9.863056699e-04f, -1.203262712e-03f, -1.301516175e-03f, -1.242850904e-03f, -1.016141350e-03f, -6.422791733e-04f, -1.717082308e-04f, +3.251501290e-04f, +7.723803390e-04f, +1.104417471e-03f, +1.279330942e-03f, +1.286330301e-03f, +1.145854529e-03f, +9.025915620e-04f, +6.135913483e-04f, +3.347739708e-04f, +1.093033143e-04f, -3.949599835e-05f, -1.094646074e-04f, - +7.792760007e-05f, +3.665095964e-04f, +6.486629068e-04f, +7.797857477e-04f, +6.394231019e-04f, +1.961868304e-04f, -4.568154653e-04f, -1.118545727e-03f, -1.548495109e-03f, -1.561745660e-03f, -1.110107646e-03f, -3.119589095e-04f, +5.853955751e-04f, +1.297206916e-03f, +1.608579579e-03f, +1.452325189e-03f, +9.255530727e-04f, +2.407773855e-04f, -3.641366350e-04f, -7.166760930e-04f, -7.635430099e-04f, -5.697529608e-04f, -2.707956610e-04f, -5.106521924e-06f, - /* 2, 6 (24) */ - -4.944649803e-03f, -5.872704443e-03f, -4.702317332e-03f, -1.852845592e-04f, +8.628911748e-03f, +2.206694092e-02f, +3.959880023e-02f, +5.977645724e-02f, +8.038407100e-02f, +9.878656039e-02f, +1.124091488e-01f, +1.192412808e-01f, +1.182460515e-01f, +1.095756089e-01f, +9.453938560e-02f, +7.533302674e-02f, +5.459472290e-02f, +3.489618629e-02f, +1.828699901e-02f, +5.991291180e-03f, -1.688604941e-03f, -5.262328235e-03f, -5.787019316e-03f, -4.532207882e-03f, - +5.697219272e-03f, +2.363475320e-03f, -5.718758368e-03f, -1.737584046e-02f, -2.920935975e-02f, -3.648749840e-02f, -3.489424339e-02f, -2.247253172e-02f, -8.953374729e-04f, +2.460563327e-02f, +4.678447420e-02f, +5.887827512e-02f, +5.707779712e-02f, +4.195472164e-02f, +1.824613158e-02f, -6.912837038e-03f, -2.656849322e-02f, -3.628749059e-02f, -3.535738291e-02f, -2.648480718e-02f, -1.427887690e-02f, -3.276878034e-03f, +3.637379970e-03f, +5.858714660e-03f, - +9.877236116e-05f, +9.942591461e-06f, -1.590219669e-04f, -4.008589712e-04f, -6.869299656e-04f, -9.700069480e-04f, -1.192669640e-03f, -1.299694773e-03f, -1.251483081e-03f, -1.035000008e-03f, -6.691288173e-04f, -2.026805313e-04f, +2.947828133e-04f, +7.472189048e-04f, +1.087981479e-03f, +1.273370789e-03f, +1.290568097e-03f, +1.158199297e-03f, +9.197492578e-04f, +6.318920578e-04f, +3.509943333e-04f, +1.212814540e-04f, -3.258232942e-05f, -1.071832408e-04f, - +6.246422727e-05f, +3.472578112e-04f, +6.339279443e-04f, +7.786235782e-04f, +6.573424148e-04f, +2.316360532e-04f, -4.132777339e-04f, -1.081559642e-03f, -1.532470114e-03f, -1.574880176e-03f, -1.150508270e-03f, -3.677301159e-04f, +5.319316244e-04f, +1.262854755e-03f, +1.602984462e-03f, +1.474692948e-03f, +9.656444630e-04f, +2.835400742e-04f, -3.324740767e-04f, -7.036976533e-04f, -7.688270825e-04f, -5.865072905e-04f, -2.897654137e-04f, -1.874123877e-05f, - /* 2, 7 (24) */ - -4.845877442e-03f, -5.862761852e-03f, -4.861339299e-03f, -5.861435304e-04f, +7.941981782e-03f, +2.109693397e-02f, +3.840613059e-02f, +5.847676247e-02f, +7.913258792e-02f, +9.775156039e-02f, +1.117400199e-01f, +1.190386002e-01f, +1.185408343e-01f, +1.103228278e-01f, +9.562736708e-02f, +7.660639753e-02f, +5.588529100e-02f, +3.605438558e-02f, +1.920674827e-02f, +6.623183238e-03f, -1.337610607e-03f, -5.141046781e-03f, -5.819601645e-03f, -4.639391123e-03f, - +5.759683500e-03f, +2.710733131e-03f, -5.084830424e-03f, -1.659721688e-02f, -2.855201734e-02f, -3.625586234e-02f, -3.530752112e-02f, -2.355409136e-02f, -2.427807587e-03f, +2.303075310e-02f, +4.563396593e-02f, +5.851054500e-02f, +5.760972875e-02f, +4.321757639e-02f, +1.984911604e-02f, -5.438144089e-03f, -2.560284875e-02f, -3.600395051e-02f, -3.568985699e-02f, -2.718850484e-02f, -1.504770398e-02f, -3.863385324e-03f, +3.347614556e-03f, +5.839973421e-03f, - +1.018421751e-04f, +1.780702306e-05f, -1.461444695e-04f, -3.840458379e-04f, -6.685744535e-04f, -9.534715695e-04f, -1.181619683e-03f, -1.297258112e-03f, -1.259447268e-03f, -1.053265089e-03f, -6.955786233e-04f, -2.335295054e-04f, +2.642364581e-04f, +7.216135516e-04f, +1.070928213e-03f, +1.266743117e-03f, +1.294213361e-03f, +1.170125328e-03f, +9.367141338e-04f, +6.502240907e-04f, +3.674212390e-04f, +1.335630122e-04f, -2.535318391e-05f, -1.046441437e-04f, - +4.743465426e-05f, +3.280281174e-04f, +6.186322196e-04f, +7.763934401e-04f, +6.740300923e-04f, +2.661906593e-04f, -3.698472109e-04f, -1.043707865e-03f, -1.514804050e-03f, -1.586134153e-03f, -1.189463108e-03f, -4.230295777e-04f, +4.777866761e-04f, +1.226926429e-03f, +1.595502904e-03f, +1.495532453e-03f, +1.005049531e-03f, +3.265821805e-04f, -2.998146942e-04f, -6.894824103e-04f, -7.731194598e-04f, -6.028128803e-04f, -3.088533075e-04f, -3.285526714e-05f, - /* 2, 8 (24) */ - -4.744035267e-03f, -5.844954829e-03f, -5.007483769e-03f, -9.701893683e-04f, +7.273407329e-03f, +2.014346240e-02f, +3.722451091e-02f, +5.717950436e-02f, +7.787314065e-02f, +9.669829530e-02f, +1.110444413e-01f, +1.188050707e-01f, +1.188050707e-01f, +1.110444413e-01f, +9.669829530e-02f, +7.787314065e-02f, +5.717950436e-02f, +3.722451091e-02f, +2.014346240e-02f, +7.273407329e-03f, -9.701893683e-04f, -5.007483769e-03f, -5.844954829e-03f, -4.744035267e-03f, - +5.807118154e-03f, +3.038761249e-03f, -4.466198204e-03f, -1.582082344e-02f, -2.787798725e-02f, -3.598967168e-02f, -3.567736833e-02f, -2.459779922e-02f, -3.942611637e-03f, +2.144461894e-02f, +4.444450282e-02f, +5.808751542e-02f, +5.808751542e-02f, +4.444450282e-02f, +2.144461894e-02f, -3.942611637e-03f, -2.459779922e-02f, -3.567736833e-02f, -3.598967168e-02f, -2.787798725e-02f, -1.582082344e-02f, -4.466198204e-03f, +3.038761249e-03f, +5.807118154e-03f, - +1.046441437e-04f, +2.535318391e-05f, -1.335630122e-04f, -3.674212390e-04f, -6.502240907e-04f, -9.367141338e-04f, -1.170125328e-03f, -1.294213361e-03f, -1.266743117e-03f, -1.070928213e-03f, -7.216135516e-04f, -2.642364581e-04f, +2.335295054e-04f, +6.955786233e-04f, +1.053265089e-03f, +1.259447268e-03f, +1.297258112e-03f, +1.181619683e-03f, +9.534715695e-04f, +6.685744535e-04f, +3.840458379e-04f, +1.461444695e-04f, -1.780702306e-05f, -1.018421751e-04f, - +3.285526714e-05f, +3.088533075e-04f, +6.028128803e-04f, +7.731194598e-04f, +6.894824103e-04f, +2.998146942e-04f, -3.265821805e-04f, -1.005049531e-03f, -1.495532453e-03f, -1.595502904e-03f, -1.226926429e-03f, -4.777866761e-04f, +4.230295777e-04f, +1.189463108e-03f, +1.586134153e-03f, +1.514804050e-03f, +1.043707865e-03f, +3.698472109e-04f, -2.661906593e-04f, -6.740300923e-04f, -7.763934401e-04f, -6.186322196e-04f, -3.280281174e-04f, -4.743465426e-05f, - /* 2, 9 (24) */ - -4.639391123e-03f, -5.819601645e-03f, -5.141046781e-03f, -1.337610607e-03f, +6.623183238e-03f, +1.920674827e-02f, +3.605438558e-02f, +5.588529100e-02f, +7.660639753e-02f, +9.562736708e-02f, +1.103228278e-01f, +1.185408343e-01f, +1.190386002e-01f, +1.117400199e-01f, +9.775156039e-02f, +7.913258792e-02f, +5.847676247e-02f, +3.840613059e-02f, +2.109693397e-02f, +7.941981782e-03f, -5.861435304e-04f, -4.861339299e-03f, -5.862761852e-03f, -4.845877442e-03f, - +5.839973421e-03f, +3.347614556e-03f, -3.863385324e-03f, -1.504770398e-02f, -2.718850484e-02f, -3.568985699e-02f, -3.600395051e-02f, -2.560284875e-02f, -5.438144089e-03f, +1.984911604e-02f, +4.321757639e-02f, +5.760972875e-02f, +5.851054500e-02f, +4.563396593e-02f, +2.303075310e-02f, -2.427807587e-03f, -2.355409136e-02f, -3.530752112e-02f, -3.625586234e-02f, -2.855201734e-02f, -1.659721688e-02f, -5.084830424e-03f, +2.710733131e-03f, +5.759683500e-03f, - +1.071832408e-04f, +3.258232942e-05f, -1.212814540e-04f, -3.509943333e-04f, -6.318920578e-04f, -9.197492578e-04f, -1.158199297e-03f, -1.290568097e-03f, -1.273370789e-03f, -1.087981479e-03f, -7.472189048e-04f, -2.947828133e-04f, +2.026805313e-04f, +6.691288173e-04f, +1.035000008e-03f, +1.251483081e-03f, +1.299694773e-03f, +1.192669640e-03f, +9.700069480e-04f, +6.869299656e-04f, +4.008589712e-04f, +1.590219669e-04f, -9.942591461e-06f, -9.877236116e-05f, - +1.874123877e-05f, +2.897654137e-04f, +5.865072905e-04f, +7.688270825e-04f, +7.036976533e-04f, +3.324740767e-04f, -2.835400742e-04f, -9.656444630e-04f, -1.474692948e-03f, -1.602984462e-03f, -1.262854755e-03f, -5.319316244e-04f, +3.677301159e-04f, +1.150508270e-03f, +1.574880176e-03f, +1.532470114e-03f, +1.081559642e-03f, +4.132777339e-04f, -2.316360532e-04f, -6.573424148e-04f, -7.786235782e-04f, -6.339279443e-04f, -3.472578112e-04f, -6.246422727e-05f, - /* 2,10 (24) */ - -4.532207882e-03f, -5.787019316e-03f, -5.262328235e-03f, -1.688604941e-03f, +5.991291180e-03f, +1.828699901e-02f, +3.489618629e-02f, +5.459472290e-02f, +7.533302674e-02f, +9.453938560e-02f, +1.095756089e-01f, +1.182460515e-01f, +1.192412808e-01f, +1.124091488e-01f, +9.878656039e-02f, +8.038407100e-02f, +5.977645724e-02f, +3.959880023e-02f, +2.206694092e-02f, +8.628911748e-03f, -1.852845592e-04f, -4.702317332e-03f, -5.872704443e-03f, -4.944649803e-03f, - +5.858714660e-03f, +3.637379970e-03f, -3.276878034e-03f, -1.427887690e-02f, -2.648480718e-02f, -3.535738291e-02f, -3.628749059e-02f, -2.656849322e-02f, -6.912837038e-03f, +1.824613158e-02f, +4.195472164e-02f, +5.707779712e-02f, +5.887827512e-02f, +4.678447420e-02f, +2.460563327e-02f, -8.953374729e-04f, -2.247253172e-02f, -3.489424339e-02f, -3.648749840e-02f, -2.920935975e-02f, -1.737584046e-02f, -5.718758368e-03f, +2.363475320e-03f, +5.697219272e-03f, - +1.094646074e-04f, +3.949599835e-05f, -1.093033143e-04f, -3.347739708e-04f, -6.135913483e-04f, -9.025915620e-04f, -1.145854529e-03f, -1.286330301e-03f, -1.279330942e-03f, -1.104417471e-03f, -7.723803390e-04f, -3.251501290e-04f, +1.717082308e-04f, +6.422791733e-04f, +1.016141350e-03f, +1.242850904e-03f, +1.301516175e-03f, +1.203262712e-03f, +9.863056699e-04f, +7.052772694e-04f, +4.178511756e-04f, +1.721913048e-04f, -1.758922717e-06f, -9.542990372e-05f, - +5.106521924e-06f, +2.707956610e-04f, +5.697529608e-04f, +7.635430099e-04f, +7.166760930e-04f, +3.641366350e-04f, -2.407773855e-04f, -9.255530727e-04f, -1.452325189e-03f, -1.608579579e-03f, -1.297206916e-03f, -5.853955751e-04f, +3.119589095e-04f, +1.110107646e-03f, +1.561745660e-03f, +1.548495109e-03f, +1.118545727e-03f, +4.568154653e-04f, -1.961868304e-04f, -6.394231019e-04f, -7.797857477e-04f, -6.486629068e-04f, -3.665095964e-04f, -7.792760007e-05f, - /* 2,11 (24) */ - -4.422743275e-03f, -5.747523317e-03f, -5.371631549e-03f, -2.023378911e-03f, +5.377699832e-03f, +1.738440745e-02f, +3.375033176e-02f, +5.330839260e-02f, +7.405369580e-02f, +9.343496813e-02f, +1.088032285e-01f, +1.179209013e-01f, +1.194129890e-01f, +1.130514279e-01f, +9.980270174e-02f, +8.162692190e-02f, +6.107797342e-02f, +4.080206294e-02f, +2.305324659e-02f, +9.334189017e-03f, +2.325666164e-04f, -4.530126028e-03f, -5.874463366e-03f, -5.040079707e-03f, - +5.863821182e-03f, +3.908175631e-03f, -2.707125073e-03f, -1.351533389e-02f, -2.576813109e-02f, -3.499324628e-02f, -3.652826797e-02f, -2.749404629e-02f, -8.365162226e-03f, +1.663755200e-02f, +4.065751472e-02f, +5.649240155e-02f, +5.919023403e-02f, +4.789458185e-02f, +2.616737893e-02f, +6.531576364e-04f, -2.135398599e-02f, -3.443742792e-02f, -3.668368523e-02f, -2.984878286e-02f, -1.815562621e-02f, -6.367421275e-03f, +1.996965724e-03f, +5.619291672e-03f, - +1.114935439e-04f, +4.609600695e-05f, -9.763177411e-05f, -3.187686877e-04f, -5.953347587e-04f, -8.852556579e-04f, -1.133104170e-03f, -1.281508348e-03f, -1.284624736e-03f, -1.120229268e-03f, -7.970838758e-04f, -3.553201127e-04f, +1.406314021e-04f, +6.150450611e-04f, +9.966979741e-04f, +1.233551590e-03f, +1.302715571e-03f, +1.213386654e-03f, +1.002353166e-03f, +7.236028412e-04f, +4.350126895e-04f, +1.856479425e-04f, +6.744655180e-06f, -9.181018856e-05f, - -8.036155108e-06f, +2.519744239e-04f, +5.525874792e-04f, +7.572951362e-04f, +7.284199629e-04f, +3.947721387e-04f, -1.983495881e-04f, -8.848362575e-04f, -1.428470775e-03f, -1.612291711e-03f, -1.329944115e-03f, -6.381107241e-04f, +2.557873015e-04f, +1.068309149e-03f, +1.546738023e-03f, +1.562845666e-03f, +1.154607768e-03f, +5.004013551e-04f, -1.598807795e-04f, -6.202779047e-04f, -7.798572015e-04f, -6.628002469e-04f, -3.857499684e-04f, -9.380718275e-05f, - /* 2,12 (24) */ - -4.311249731e-03f, -5.701427310e-03f, -5.469263323e-03f, -2.342147599e-03f, +4.782365073e-03f, +1.649915179e-02f, +3.261722759e-02f, +5.202688425e-02f, +7.276907106e-02f, +9.231473886e-02f, +1.080061447e-01f, +1.175655812e-01f, +1.195536204e-01f, +1.136664730e-01f, +1.007993997e-01f, +8.286047349e-02f, +6.238068899e-02f, +4.201544960e-02f, +2.405559975e-02f, +1.005779186e-02f, +6.675793059e-04f, -4.344478085e-03f, -5.867718711e-03f, -5.131889896e-03f, - +5.855785027e-03f, +4.160150055e-03f, -2.154537594e-03f, -1.275803875e-02f, -2.503971113e-02f, -3.459847414e-02f, -3.672661756e-02f, -2.837888255e-02f, -9.793633001e-03f, +1.502526029e-02f, +3.932757061e-02f, +5.585429082e-02f, +5.944602133e-02f, +4.896289099e-02f, +2.771411696e-02f, +2.216003302e-03f, -2.019937822e-02f, -3.393702657e-02f, -3.684356601e-02f, -3.046906076e-02f, -1.893548341e-02f, -7.030221522e-03f, +1.611215755e-03f, +5.525484490e-03f, - +1.132755013e-04f, +5.238444285e-05f, -8.626967713e-05f, -3.029867020e-04f, -5.771348786e-04f, -8.677561346e-04f, -1.119961557e-03f, -1.276110995e-03f, -1.289253825e-03f, -1.135410439e-03f, -8.213159125e-04f, -3.852746369e-04f, +1.094689306e-04f, +5.874421685e-04f, +9.766792073e-04f, +1.223586498e-03f, +1.303286642e-03f, +1.223029481e-03f, +1.018134912e-03f, +7.418930018e-04f, +4.523334583e-04f, +1.993869984e-04f, +1.556851470e-05f, -8.790879338e-05f, - -2.067529037e-05f, +2.333311836e-04f, +5.350484419e-04f, +7.501124831e-04f, +7.389334301e-04f, +4.243523280e-04f, -1.563110555e-04f, -8.435553022e-04f, -1.403173181e-03f, -1.614126997e-03f, -1.361029974e-03f, -6.900104146e-04f, +1.992872499e-04f, +1.025162808e-03f, +1.529867409e-03f, +1.575490638e-03f, +1.189688301e-03f, +5.439756757e-04f, -1.227574793e-04f, -5.999146171e-04f, -7.788166310e-04f, -6.763034625e-04f, -4.049447613e-04f, -1.100841935e-04f, - /* 2,13 (24) */ - -4.197974230e-03f, -5.649042868e-03f, -5.555533001e-03f, -2.645134301e-03f, +4.205230195e-03f, +1.563139565e-02f, +3.149726603e-02f, +5.075077326e-02f, +7.147981724e-02f, +9.117932843e-02f, +1.071848287e-01f, +1.171803066e-01f, +1.196630893e-01f, +1.142539152e-01f, +1.017760789e-01f, +8.408405999e-02f, +6.368397563e-02f, +4.323847908e-02f, +2.507373467e-02f, +1.079968486e-02f, +1.119912764e-03f, -4.145091087e-03f, -5.852150196e-03f, -5.219798689e-03f, - +5.835109736e-03f, +4.393481238e-03f, -1.619489152e-03f, -1.200792627e-02f, -2.430077770e-02f, -3.417412181e-02f, -3.688292862e-02f, -2.922243785e-02f, -1.119680618e-02f, +1.341113329e-02f, +3.796654063e-02f, +5.516428041e-02f, +5.964530858e-02f, +4.998805380e-02f, +2.924398436e-02f, +3.791493940e-03f, -1.900968992e-02f, -3.339305089e-02f, -3.696632349e-02f, -3.106897538e-02f, -1.971430004e-02f, -7.706524985e-03f, +1.206270994e-03f, +5.415400296e-03f, - +1.148160727e-04f, +5.836365872e-05f, -7.521953202e-05f, -2.874359097e-04f, -5.590040813e-04f, -8.501075458e-04f, -1.106440210e-03f, -1.270147369e-03f, -1.293220355e-03f, -1.149955055e-03f, -8.450632330e-04f, -4.149957535e-04f, +7.823977369e-05f, +5.594864885e-04f, +9.560948405e-04f, +1.212957498e-03f, +1.303223507e-03f, +1.232179476e-03f, +1.033636441e-03f, +7.601339276e-04f, +4.698031407e-04f, +2.134032501e-04f, +2.471272391e-05f, -8.372149579e-05f, - -3.280060770e-05f, +2.148944892e-04f, +5.171733863e-04f, +7.420251329e-04f, +7.482225637e-04f, +4.528509384e-04f, -1.147149834e-04f, -8.017717782e-04f, -1.376477675e-03f, -1.614094247e-03f, -1.390430588e-03f, -7.410292380e-04f, +1.425312172e-04f, +9.807206967e-04f, +1.511146685e-03f, +1.586401168e-03f, +1.223730844e-03f, +5.874781133e-04f, -8.485825299e-05f, -5.783430865e-04f, -7.766442229e-04f, -6.891364809e-04f, -4.240592003e-04f, -1.267386733e-04f, - /* 2,14 (24) */ - -4.083158157e-03f, -5.590679209e-03f, -5.630752533e-03f, -2.932570211e-03f, +3.646226113e-03f, +1.478128811e-02f, +3.039082582e-02f, +4.948062589e-02f, +7.018659688e-02f, +9.002937337e-02f, +1.063397655e-01f, +1.167653108e-01f, +1.197413291e-01f, +1.148134017e-01f, +1.027321738e-01f, +8.529701749e-02f, +6.498719914e-02f, +4.447065856e-02f, +2.610737111e-02f, +1.155981879e-02f, +1.589715905e-03f, -3.931687837e-03f, -5.827437472e-03f, -5.303520185e-03f, - +5.802309129e-03f, +4.608375728e-03f, -1.102315765e-03f, -1.126590114e-02f, -2.355255513e-02f, -3.372127087e-02f, -3.699764360e-02f, -3.002420963e-02f, -1.257328386e-02f, +1.179703904e-02f, +3.657611005e-02f, +5.442325117e-02f, +5.978783980e-02f, +5.096877450e-02f, +3.075513105e-02f, +5.377895108e-03f, -1.778595908e-02f, -3.280557278e-02f, -3.705118174e-02f, -3.164731846e-02f, -2.049094426e-02f, -8.395661465e-03f, +7.822117937e-04f, +5.288661623e-03f, - +1.161209850e-04f, +6.403626576e-05f, -6.448351439e-05f, -2.721238813e-04f, -5.409545148e-04f, -8.323243973e-04f, -1.092553812e-03f, -1.263626965e-03f, -1.296526957e-03f, -1.163857688e-03f, -8.683130181e-04f, -4.444657095e-04f, +4.696294436e-05f, +5.311943066e-04f, +9.349551213e-04f, +1.201666972e-03f, +1.302520727e-03f, +1.240825207e-03f, +1.048843356e-03f, +7.783116620e-04f, +4.874111149e-04f, +2.276911350e-04f, +3.417704185e-05f, -7.924428113e-05f, - -4.440305368e-05f, +1.966919200e-04f, +4.989997239e-04f, +7.330641614e-04f, +7.562953008e-04f, +4.802437219e-04f, -7.361331520e-05f, -7.595474433e-04f, -1.348431235e-03f, -1.612204906e-03f, -1.418114570e-03f, -7.911031327e-04f, +8.559205927e-05f, +9.350368534e-04f, +1.490591427e-03f, +1.595550745e-03f, +1.256679994e-03f, +6.308478599e-04f, -4.622611733e-05f, -5.555752224e-04f, -7.733217142e-04f, -7.012637304e-04f, -4.430579567e-04f, -1.437495025e-04f, - /* 2,15 (24) */ - -3.967037172e-03f, -5.526642943e-03f, -5.695236047e-03f, -3.204694092e-03f, +3.105271599e-03f, +1.394896371e-02f, +2.929827201e-02f, +4.821699892e-02f, +6.889006993e-02f, +8.886551568e-02f, +1.054714525e-01f, +1.163208451e-01f, +1.197882920e-01f, +1.153445960e-01f, +1.036671289e-01f, +8.649868446e-02f, +6.628971986e-02f, +4.571148376e-02f, +2.715621446e-02f, +1.233813045e-02f, +2.077127020e-03f, -3.703996702e-03f, -5.793260431e-03f, -5.382764466e-03f, - +5.757906075e-03f, +4.805067648e-03f, -6.033160415e-04f, -1.053283698e-02f, -2.279625983e-02f, -3.324102715e-02f, -3.707125692e-02f, -3.078375707e-02f, -1.392171509e-02f, +1.018483414e-02f, +3.515799548e-02f, +5.363214804e-02f, +5.987343185e-02f, +5.190381135e-02f, +3.224572248e-02f, +6.973445853e-03f, -1.652927908e-02f, -3.217472492e-02f, -3.709740786e-02f, -3.220289369e-02f, -2.126426598e-02f, -9.096925196e-03f, +3.391538370e-04f, +5.144912120e-03f, - +1.171960904e-04f, +6.940512698e-05f, -5.406346933e-05f, -2.570578584e-04f, -5.229980927e-04f, -8.144211337e-04f, -1.078316198e-03f, -1.256559625e-03f, -1.299176747e-03f, -1.177113412e-03f, -8.910528549e-04f, -4.736669608e-04f, +1.565749561e-05f, +5.025821872e-04f, +9.132707466e-04f, +1.189717810e-03f, +1.301173316e-03f, +1.248955534e-03f, +1.063741346e-03f, +7.964121267e-04f, +5.051464861e-04f, +2.422447510e-04f, +4.396091421e-05f, -7.447335023e-05f, - -5.547479234e-05f, +1.787500512e-04f, +4.805646748e-04f, +7.232615691e-04f, +7.631614087e-04f, +5.065084646e-04f, -3.305666933e-05f, -7.169441422e-04f, -1.319082469e-03f, -1.608473031e-03f, -1.444053089e-03f, -8.401694814e-04f, +2.854291356e-05f, +8.881672048e-04f, +1.468219911e-03f, +1.602915254e-03f, +1.288481522e-03f, +6.740237072e-04f, -6.905729617e-06f, -5.316250007e-04f, -7.688324450e-04f, -7.126502117e-04f, -4.619052037e-04f, -1.610944214e-04f, - /* 3, 0 (24) */ - -4.734201172e-04f, -5.872050883e-03f, -1.327132736e-02f, -1.945082492e-02f, -1.959997611e-02f, -8.884357777e-03f, +1.545973808e-02f, +5.235009562e-02f, +9.626476338e-02f, +1.382943420e-01f, +1.686391567e-01f, +1.797059243e-01f, +1.686391567e-01f, +1.382943420e-01f, +9.626476338e-02f, +5.235009562e-02f, +1.545973808e-02f, -8.884357777e-03f, -1.959997611e-02f, -1.945082492e-02f, -1.327132736e-02f, -5.872050883e-03f, -4.734201172e-04f, +1.852590201e-03f, - +6.383988391e-03f, +1.521606380e-02f, +1.998675788e-02f, +1.433025347e-02f, -3.365023479e-03f, -2.693084335e-02f, -4.420767028e-02f, -4.352960466e-02f, -2.129987080e-02f, +1.435357571e-02f, +4.683729932e-02f, +5.990197477e-02f, +4.683729932e-02f, +1.435357571e-02f, -2.129987080e-02f, -4.352960466e-02f, -4.420767028e-02f, -2.693084335e-02f, -3.365023479e-03f, +1.433025347e-02f, +1.998675788e-02f, +1.521606380e-02f, +6.383988391e-03f, -3.539537444e-04f, - +2.355677716e-04f, +4.179442895e-04f, +4.704054608e-04f, +2.636859589e-04f, -2.647871259e-04f, -1.056835617e-03f, -1.922979241e-03f, -2.589654838e-03f, -2.792633064e-03f, -2.381490657e-03f, -1.390749392e-03f, -4.420040917e-05f, +1.313836442e-03f, +2.335105944e-03f, +2.785586443e-03f, +2.618259216e-03f, +1.973503767e-03f, +1.111372868e-03f, +3.079126691e-04f, -2.401633161e-04f, -4.662037107e-04f, -4.265012055e-04f, -2.481551782e-04f, -6.172129803e-05f, - -5.307162707e-04f, -5.079300130e-04f, -4.486124072e-05f, +7.264197738e-04f, +1.381428286e-03f, +1.429080757e-03f, +6.481239362e-04f, -6.943321844e-04f, -1.923558464e-03f, -2.327398621e-03f, -1.597787307e-03f, -5.339670306e-05f, +1.518583567e-03f, +2.314926423e-03f, +1.979009750e-03f, +7.826531639e-04f, -5.751864623e-04f, -1.404413140e-03f, -1.406533530e-03f, -7.762001769e-04f, +2.500611640e-06f, +4.922146246e-04f, +5.402355369e-04f, +2.899658374e-04f, - /* 3, 1 (24) */ - -2.378523456e-04f, -5.454106594e-03f, -1.280092190e-02f, -1.918713896e-02f, -1.986476324e-02f, -9.941193394e-03f, +1.353675884e-02f, +4.976044078e-02f, +9.347213031e-02f, +1.359128514e-01f, +1.672484073e-01f, +1.796617239e-01f, +1.699529931e-01f, +1.406294480e-01f, +9.905034982e-02f, +5.496835484e-02f, +1.743324185e-02f, -7.772984909e-03f, -1.929206344e-02f, -1.969098823e-02f, -1.373753107e-02f, -6.298552089e-03f, -7.215752954e-04f, +1.790868903e-03f, - +5.853272120e-03f, +1.470813379e-02f, +1.994189664e-02f, +1.505667324e-02f, -1.983595193e-03f, -2.550176259e-02f, -4.355954634e-02f, -4.422393685e-02f, -2.322342926e-02f, +1.202617709e-02f, +4.523951201e-02f, +5.984857807e-02f, +4.835588289e-02f, +1.666850214e-02f, -1.932086105e-02f, -4.274695150e-02f, -4.478285674e-02f, -2.833525649e-02f, -4.771557009e-03f, +1.355405329e-02f, +1.998925849e-02f, +1.570827843e-02f, +6.924223928e-03f, -6.398790701e-05f, - +2.229937837e-04f, +4.088809149e-04f, +4.735725955e-04f, +2.859105993e-04f, -2.227364395e-04f, -1.002617239e-03f, -1.871673067e-03f, -2.559200721e-03f, -2.797217717e-03f, -2.425546548e-03f, -1.466231160e-03f, -1.325550036e-04f, +1.235568842e-03f, +2.286427588e-03f, +2.776062594e-03f, +2.644958192e-03f, +2.023174408e-03f, +1.166167127e-03f, +3.520806754e-04f, -2.153407861e-04f, -4.609402801e-04f, -4.345162095e-04f, -2.607281858e-04f, -7.171793133e-05f, - -5.200556115e-04f, -5.218232591e-04f, -8.591185626e-05f, +6.762124622e-04f, +1.353857631e-03f, +1.450338834e-03f, +7.187217155e-04f, -6.055847117e-04f, -1.864741531e-03f, -2.335221636e-03f, -1.673642119e-03f, -1.600766433e-04f, +1.436191554e-03f, +2.297809027e-03f, +2.030950215e-03f, +8.703490222e-04f, -5.000433397e-04f, -1.376339999e-03f, -1.429068254e-03f, -8.254212634e-04f, -4.109231554e-05f, +4.746690398e-04f, +5.485484257e-04f, +3.092517675e-04f, - /* 3, 2 (24) */ - -1.485856194e-05f, -5.045225679e-03f, -1.232734930e-02f, -1.890122836e-02f, -2.008749968e-02f, -1.094381063e-02f, +1.166508578e-02f, +4.720124006e-02f, +9.067491260e-02f, +1.334873048e-01f, +1.657821762e-01f, +1.795291689e-01f, +1.711885620e-01f, +1.429158756e-01f, +1.018264124e-01f, +5.761331303e-02f, +1.945641626e-02f, -6.606817783e-03f, -1.893998277e-02f, -1.990632902e-02f, -1.419847135e-02f, -6.733068298e-03f, -9.823034812e-04f, +1.719150971e-03f, - +5.333216509e-03f, +1.418631053e-02f, +1.985598479e-02f, +1.573288570e-02f, -6.297375625e-04f, -2.405142376e-02f, -4.284082463e-02f, -4.482952156e-02f, -2.508817080e-02f, +9.690955455e-03f, +4.356586989e-02f, +5.968850142e-02f, +4.979207444e-02f, +1.896631116e-02f, -1.728991084e-02f, -4.187660248e-02f, -4.528290008e-02f, -2.971159648e-02f, -6.200625263e-03f, +1.272863203e-02f, +1.994816618e-02f, +1.618294747e-02f, +7.472772354e-03f, +2.452638605e-04f, - +2.104601690e-04f, +3.993464764e-04f, +4.757332307e-04f, +3.068410823e-04f, -1.817908411e-04f, -9.487781880e-04f, -1.819657590e-03f, -2.526954351e-03f, -2.799358667e-03f, -2.467241525e-03f, -1.540207185e-03f, -2.207709909e-04f, +1.156024991e-03f, +2.235493821e-03f, +2.764049302e-03f, +2.669698029e-03f, +2.071919147e-03f, +1.221155193e-03f, +3.972566074e-04f, -1.892184824e-04f, -4.545892232e-04f, -4.419538543e-04f, -2.732581479e-04f, -8.201546497e-05f, - -5.083202561e-04f, -5.339073330e-04f, -1.255798718e-04f, +6.257092953e-04f, +1.323931112e-03f, +1.468191662e-03f, +7.868528144e-04f, -5.166085836e-04f, -1.802710912e-03f, -2.338402133e-03f, -1.745995343e-03f, -2.664164598e-04f, +1.350779544e-03f, +2.276061109e-03f, +2.079241865e-03f, +9.572208293e-04f, -4.228354067e-04f, -1.344873748e-03f, -1.448932127e-03f, -8.739496088e-04f, -8.583482063e-05f, +4.552902447e-04f, +5.555919034e-04f, +3.283795848e-04f, - /* 3, 3 (24) */ - +1.956016071e-04f, -4.645879202e-03f, -1.185161607e-02f, -1.859438728e-02f, -2.026929052e-02f, -1.189258882e-02f, +9.845428186e-03f, +4.467428571e-02f, +8.787555393e-02f, +1.310200633e-01f, +1.642419690e-01f, +1.793083979e-01f, +1.723445870e-01f, +1.451513694e-01f, +1.045904617e-01f, +6.028301106e-02f, +2.152833541e-02f, -5.385662589e-03f, -1.854272616e-02f, -2.009554750e-02f, -1.465306057e-02f, -7.175022152e-03f, -1.255561629e-03f, +1.637135506e-03f, - +4.824896253e-03f, +1.365240320e-02f, +1.973040491e-02f, +1.635859500e-02f, +6.941935492e-04f, -2.258323209e-02f, -4.205397181e-02f, -4.534613014e-02f, -2.689088171e-02f, +7.352553322e-03f, +4.181987455e-02f, +5.942208496e-02f, +5.114285398e-02f, +2.124237227e-02f, -1.521066897e-02f, -4.091938165e-02f, -4.570573549e-02f, -3.105647023e-02f, -7.649557389e-03f, +1.185468242e-02f, +1.986233136e-02f, +1.663823771e-02f, +8.028364257e-03f, +5.736434452e-04f, - +1.979929869e-04f, +3.893762465e-04f, +4.769164640e-04f, +3.264831727e-04f, -1.419783847e-04f, -8.953774331e-04f, -1.767005156e-03f, -2.492974943e-03f, -2.799077135e-03f, -2.506546616e-03f, -1.612604977e-03f, -3.087561805e-04f, +1.075285051e-03f, +2.182345887e-03f, +2.749537436e-03f, +2.692427006e-03f, +2.119666297e-03f, +1.276272613e-03f, +4.434038066e-04f, -1.617985515e-04f, -4.471257811e-04f, -4.487787648e-04f, -2.857156265e-04f, -9.260021088e-05f, - -4.955783754e-04f, -5.441999838e-04f, -1.637979372e-04f, +5.750396416e-04f, +1.291762365e-03f, +1.482651727e-03f, +8.523975536e-04f, -4.276003658e-04f, -1.737624939e-03f, -2.336957375e-03f, -1.814702668e-03f, -3.721903161e-04f, +1.262523044e-03f, +2.249708036e-03f, +2.123754270e-03f, +1.043069845e-03f, -3.437100063e-04f, -1.310035268e-03f, -1.466029931e-03f, -9.216511183e-04f, -1.316393194e-04f, +4.340803772e-04f, +5.613051227e-04f, +3.472813090e-04f, - /* 3, 4 (24) */ - +3.935945940e-04f, -4.256502956e-03f, -1.137469961e-02f, -1.826790410e-02f, -2.041126890e-02f, -1.278796625e-02f, +8.078423030e-03f, +4.218131077e-02f, +8.507647679e-02f, +1.285135167e-01f, +1.626293640e-01f, +1.789996417e-01f, +1.734198720e-01f, +1.473337153e-01f, +1.073399992e-01f, +6.297543806e-02f, +2.364800170e-02f, -4.109389976e-03f, -1.809932235e-02f, -2.025734605e-02f, -1.510018635e-02f, -7.623800917e-03f, -1.541277256e-03f, +1.544535295e-03f, - +4.329317877e-03f, +1.310820321e-02f, +1.956660698e-02f, +1.693363464e-02f, +1.985955914e-03f, -2.110058037e-02f, -4.120157426e-02f, -4.577373051e-02f, -2.862850665e-02f, +5.015595947e-03f, +4.000517188e-02f, +5.904989465e-02f, +5.240537703e-02f, +2.349208031e-02f, -1.308691470e-02f, -3.987631180e-02f, -4.604944549e-02f, -3.236650550e-02f, -9.115587320e-03f, +1.093303130e-02f, +1.973069204e-02f, +1.707231809e-02f, +8.589669380e-03f, +9.209247542e-04f, - +1.856173713e-04f, +3.790053132e-04f, +4.771523044e-04f, +3.448445120e-04f, -1.033249365e-04f, -8.424723868e-04f, -1.713788009e-03f, -2.457323339e-03f, -2.796397255e-03f, -2.543435997e-03f, -1.683354210e-03f, -3.964187036e-04f, +9.934308368e-04f, +2.127027991e-03f, +2.732520978e-03f, +2.713095511e-03f, +2.166344606e-03f, +1.331453758e-03f, +4.904835192e-04f, -1.330852042e-04f, -4.385264485e-04f, -4.549557051e-04f, -2.980704308e-04f, -1.034573888e-04f, - -4.818993757e-04f, -5.527235910e-04f, -2.005040300e-04f, +5.243308648e-04f, +1.257468758e-03f, +1.493739576e-03f, +9.152437854e-04f, -3.387548764e-04f, -1.669647890e-03f, -2.330915132e-03f, -1.879628459e-03f, -4.771737415e-04f, +1.171604375e-03f, +2.218785848e-03f, +2.164364927e-03f, +1.127698014e-03f, -2.628206788e-04f, -1.271853952e-03f, -1.480271883e-03f, -9.683913798e-04f, -1.784135208e-04f, +4.110468253e-04f, +5.656296573e-04f, +3.658877748e-04f, - /* 3, 5 (24) */ - +5.792119653e-04f, -3.877497643e-03f, -1.089754730e-02f, -1.792305959e-02f, -2.051459384e-02f, -1.363043864e-02f, +6.364635021e-03f, +3.972398743e-02f, +8.228007954e-02f, +1.259700807e-01f, +1.609460098e-01f, +1.786032230e-01f, +1.744133029e-01f, +1.494607432e-01f, +1.100725201e-01f, +6.568853357e-02f, +2.581434631e-02f, -2.777936218e-03f, -1.760883883e-02f, -2.039043126e-02f, -1.553871280e-02f, -8.078756622e-03f, -1.839347686e-03f, +1.441077907e-03f, - +3.847418502e-03f, +1.255547962e-02f, +1.936610295e-02f, +1.745796550e-02f, +3.243424672e-03f, -1.960684079e-02f, -4.028633047e-02f, -4.611248539e-02f, -3.029815454e-02f, +2.684680815e-03f, +3.812554342e-02f, +5.857272090e-02f, +5.357698140e-02f, +2.571086615e-02f, -1.092254977e-02f, -3.874861379e-02f, -4.631226617e-02f, -3.363835945e-02f, -1.059585920e-02f, +9.964639919e-03f, +1.955227852e-02f, +1.748336492e-02f, +9.155299037e-03f, +1.286812529e-03f, - +1.733575038e-04f, +3.682685191e-04f, +4.764716021e-04f, +3.619345721e-04f, -6.585416757e-05f, -7.901188395e-04f, -1.660078177e-03f, -2.420061901e-03f, -2.791346014e-03f, -2.577887010e-03f, -1.752386819e-03f, -4.836671403e-04f, +9.105457041e-04f, +2.069587256e-03f, +2.712997051e-03f, +2.731656131e-03f, +2.211883374e-03f, +1.386631915e-03f, +5.384549270e-04f, -1.030847447e-04f, -4.287690391e-04f, -4.604496465e-04f, -3.102916594e-04f, -1.145711293e-04f, - -4.673536613e-04f, -5.595050055e-04f, -2.356415290e-04f, +4.737080132e-04f, +1.221171030e-03f, +1.501483663e-03f, +9.752870969e-04f, -2.502647183e-04f, -1.598949545e-03f, -2.320313567e-03f, -1.940646067e-03f, -5.811441735e-04f, +1.078212250e-03f, +2.183341206e-03f, +2.200959607e-03f, +1.210908463e-03f, -1.803268347e-04f, -1.230367738e-03f, -1.491573948e-03f, -1.014036023e-03f, -2.260605998e-04f, +3.862023112e-04f, +5.685097329e-04f, +3.841288250e-04f, - /* 3, 6 (24) */ - +7.525694691e-04f, -3.509229123e-03f, -1.042107570e-02f, -1.756112502e-02f, -2.058044801e-02f, -1.442055748e-02f, +4.704556844e-03f, +3.730392553e-02f, +7.948873353e-02f, +1.233921937e-01f, +1.591936230e-01f, +1.781195559e-01f, +1.753238486e-01f, +1.515303305e-01f, +1.127855172e-01f, +6.842018971e-02f, +2.802622968e-02f, -1.391304304e-03f, -1.707038391e-02f, -2.049351600e-02f, -1.596748184e-02f, -8.539206269e-03f, -2.149639346e-03f, +1.326506777e-03f, - +3.380064841e-03f, +1.199597462e-02f, +1.913046142e-02f, +1.793167352e-02f, +4.464595702e-03f, -1.810535713e-02f, -3.931104338e-02f, -4.636275010e-02f, -3.189710408e-02f, +3.643672483e-04f, +3.618489736e-02f, +5.799157673e-02f, +5.465519365e-02f, +2.789420736e-02f, -8.721590167e-03f, -3.753770533e-02f, -4.649259301e-02f, -3.486872719e-02f, -1.208743315e-02f, +8.950603896e-03f, +1.932621792e-02f, +1.786956723e-02f, +9.723808770e-03f, +1.670941354e-03f, - +1.612365884e-04f, +3.572004027e-04f, +4.749059774e-04f, +3.777646071e-04f, -2.958755077e-05f, -7.383708949e-04f, -1.605947374e-03f, -2.381254415e-03f, -2.783953195e-03f, -2.609880183e-03f, -1.819637087e-03f, -5.704106472e-04f, +8.267144377e-04f, +2.010073659e-03f, +2.690965941e-03f, +2.748063737e-03f, +2.256212560e-03f, +1.441739371e-03f, +5.872751810e-04f, -7.180559553e-05f, -4.178327492e-04f, -4.652258365e-04f, -3.223477431e-04f, -1.259244795e-04f, - -4.520123982e-04f, -5.645753791e-04f, -2.691592719e-04f, +4.232935213e-04f, +1.182992926e-03f, +1.505920182e-03f, +1.032430991e-03f, -1.623198217e-04f, -1.525704742e-03f, -2.305201100e-03f, -1.997638108e-03f, -6.838814930e-04f, +9.825413188e-04f, +2.143431320e-03f, +2.233432674e-03f, +1.292505997e-03f, -9.639341054e-05f, -1.185623103e-03f, -1.499858136e-03f, -1.058451081e-03f, -2.744793865e-04f, +3.595649614e-04f, +5.698924546e-04f, +4.019335106e-04f, - /* 3, 7 (24) */ - +9.138060575e-04f, -3.152028721e-03f, -9.946169723e-03f, -1.718336041e-02f, -2.061003556e-02f, -1.515892837e-02f, +3.098609470e-03f, +3.492267111e-02f, +7.670478033e-02f, +1.207823135e-01f, +1.573739859e-01f, +1.775491452e-01f, +1.761505630e-01f, +1.535404042e-01f, +1.154764831e-01f, +7.116825344e-02f, +3.028244224e-02f, +5.043506755e-05f, -1.648310872e-02f, -2.056532160e-02f, -1.638531459e-02f, -9.004432105e-03f, -2.471987089e-03f, +1.200582298e-03f, - +2.928052442e-03f, +1.143139924e-02f, +1.886130215e-02f, +1.835496704e-02f, +5.647588627e-03f, -1.659943695e-02f, -3.827861238e-02f, -4.652506993e-02f, -3.342280882e-02f, -1.940833852e-03f, +3.418725925e-02f, +5.730769524e-02f, +5.563773497e-02f, +3.003763868e-02f, -6.488157493e-03f, -3.624519933e-02f, -4.658898642e-02f, -3.605435029e-02f, -1.358729129e-02f, +7.892152815e-03f, +1.905173853e-02f, +1.822913219e-02f, +1.029370122e-02f, +2.072874865e-03f, - +1.492768294e-04f, +3.458351405e-04f, +4.724877501e-04f, +3.923476022e-04f, +5.455638806e-06f, -6.872809102e-04f, -1.551466894e-03f, -2.340965977e-03f, -2.774251318e-03f, -2.639399243e-03f, -1.885041731e-03f, -6.565590831e-04f, +7.420231342e-04f, +1.948539981e-03f, +2.666431117e-03f, +2.762275570e-03f, +2.299262891e-03f, +1.496707509e-03f, +6.368994396e-04f, -3.925831957e-05f, -4.056982208e-04f, -4.692498681e-04f, -3.342064914e-04f, -1.374994109e-04f, - -4.359472801e-04f, -5.679699851e-04f, -3.010115957e-04f, +3.732069218e-04f, +1.143060823e-03f, +1.507092867e-03f, +1.086587045e-03f, -7.510699606e-05f, -1.450092909e-03f, -2.285636241e-03f, -2.050496729e-03f, -7.851685550e-04f, +8.847917105e-04f, +2.099123840e-03f, +2.261687400e-03f, +1.372297596e-03f, -1.119050572e-05f, -1.137675046e-03f, -1.505052791e-03f, -1.101503364e-03f, -3.235645709e-04f, +3.311583615e-04f, +5.697280296e-04f, +4.192302976e-04f, - /* 3, 8 (24) */ - +1.063082887e-03f, -2.806193580e-03f, -9.473681973e-03f, -1.679101281e-02f, -2.060457992e-02f, -1.584620928e-02f, +1.547142576e-03f, +3.258170513e-02f, +7.393052901e-02f, +1.181429142e-01f, +1.554889441e-01f, +1.768925861e-01f, +1.768925861e-01f, +1.554889441e-01f, +1.181429142e-01f, +7.393052901e-02f, +3.258170513e-02f, +1.547142576e-03f, -1.584620928e-02f, -2.060457992e-02f, -1.679101281e-02f, -9.473681973e-03f, -2.806193580e-03f, +1.063082887e-03f, - +2.492105162e-03f, +1.086342925e-02f, +1.856029055e-02f, +1.872817396e-02f, +6.790649451e-03f, -1.509234408e-02f, -3.719202534e-02f, -4.660017692e-02f, -3.487290173e-02f, -4.226470093e-03f, +3.213676252e-02f, +5.652252668e-02f, +5.652252668e-02f, +3.213676252e-02f, -4.226470093e-03f, -3.487290173e-02f, -4.660017692e-02f, -3.719202534e-02f, -1.509234408e-02f, +6.790649451e-03f, +1.872817396e-02f, +1.856029055e-02f, +1.086342925e-02f, +2.492105162e-03f, - +1.374994109e-04f, +3.342064914e-04f, +4.692498681e-04f, +4.056982208e-04f, +3.925831957e-05f, -6.368994396e-04f, -1.496707509e-03f, -2.299262891e-03f, -2.762275570e-03f, -2.666431117e-03f, -1.948539981e-03f, -7.420231342e-04f, +6.565590831e-04f, +1.885041731e-03f, +2.639399243e-03f, +2.774251318e-03f, +2.340965977e-03f, +1.551466894e-03f, +6.872809102e-04f, -5.455638806e-06f, -3.923476022e-04f, -4.724877501e-04f, -3.458351405e-04f, -1.492768294e-04f, - -4.192302976e-04f, -5.697280296e-04f, -3.311583615e-04f, +3.235645709e-04f, +1.101503364e-03f, +1.505052791e-03f, +1.137675046e-03f, +1.119050572e-05f, -1.372297596e-03f, -2.261687400e-03f, -2.099123840e-03f, -8.847917105e-04f, +7.851685550e-04f, +2.050496729e-03f, +2.285636241e-03f, +1.450092909e-03f, +7.510699606e-05f, -1.086587045e-03f, -1.507092867e-03f, -1.143060823e-03f, -3.732069218e-04f, +3.010115957e-04f, +5.679699851e-04f, +4.359472801e-04f, - /* 3, 9 (24) */ - +1.200582298e-03f, -2.471987089e-03f, -9.004432105e-03f, -1.638531459e-02f, -2.056532160e-02f, -1.648310872e-02f, +5.043506755e-05f, +3.028244224e-02f, +7.116825344e-02f, +1.154764831e-01f, +1.535404042e-01f, +1.761505630e-01f, +1.775491452e-01f, +1.573739859e-01f, +1.207823135e-01f, +7.670478033e-02f, +3.492267111e-02f, +3.098609470e-03f, -1.515892837e-02f, -2.061003556e-02f, -1.718336041e-02f, -9.946169723e-03f, -3.152028721e-03f, +9.138060575e-04f, - +2.072874865e-03f, +1.029370122e-02f, +1.822913219e-02f, +1.905173853e-02f, +7.892152815e-03f, -1.358729129e-02f, -3.605435029e-02f, -4.658898642e-02f, -3.624519933e-02f, -6.488157493e-03f, +3.003763868e-02f, +5.563773497e-02f, +5.730769524e-02f, +3.418725925e-02f, -1.940833852e-03f, -3.342280882e-02f, -4.652506993e-02f, -3.827861238e-02f, -1.659943695e-02f, +5.647588627e-03f, +1.835496704e-02f, +1.886130215e-02f, +1.143139924e-02f, +2.928052442e-03f, - +1.259244795e-04f, +3.223477431e-04f, +4.652258365e-04f, +4.178327492e-04f, +7.180559553e-05f, -5.872751810e-04f, -1.441739371e-03f, -2.256212560e-03f, -2.748063737e-03f, -2.690965941e-03f, -2.010073659e-03f, -8.267144377e-04f, +5.704106472e-04f, +1.819637087e-03f, +2.609880183e-03f, +2.783953195e-03f, +2.381254415e-03f, +1.605947374e-03f, +7.383708949e-04f, +2.958755077e-05f, -3.777646071e-04f, -4.749059774e-04f, -3.572004027e-04f, -1.612365884e-04f, - -4.019335106e-04f, -5.698924546e-04f, -3.595649614e-04f, +2.744793865e-04f, +1.058451081e-03f, +1.499858136e-03f, +1.185623103e-03f, +9.639341054e-05f, -1.292505997e-03f, -2.233432674e-03f, -2.143431320e-03f, -9.825413188e-04f, +6.838814930e-04f, +1.997638108e-03f, +2.305201100e-03f, +1.525704742e-03f, +1.623198217e-04f, -1.032430991e-03f, -1.505920182e-03f, -1.182992926e-03f, -4.232935213e-04f, +2.691592719e-04f, +5.645753791e-04f, +4.520123982e-04f, - /* 3,10 (24) */ - +1.326506777e-03f, -2.149639346e-03f, -8.539206269e-03f, -1.596748184e-02f, -2.049351600e-02f, -1.707038391e-02f, -1.391304304e-03f, +2.802622968e-02f, +6.842018971e-02f, +1.127855172e-01f, +1.515303305e-01f, +1.753238486e-01f, +1.781195559e-01f, +1.591936230e-01f, +1.233921937e-01f, +7.948873353e-02f, +3.730392553e-02f, +4.704556844e-03f, -1.442055748e-02f, -2.058044801e-02f, -1.756112502e-02f, -1.042107570e-02f, -3.509229123e-03f, +7.525694691e-04f, - +1.670941354e-03f, +9.723808770e-03f, +1.786956723e-02f, +1.932621792e-02f, +8.950603896e-03f, -1.208743315e-02f, -3.486872719e-02f, -4.649259301e-02f, -3.753770533e-02f, -8.721590167e-03f, +2.789420736e-02f, +5.465519365e-02f, +5.799157673e-02f, +3.618489736e-02f, +3.643672483e-04f, -3.189710408e-02f, -4.636275010e-02f, -3.931104338e-02f, -1.810535713e-02f, +4.464595702e-03f, +1.793167352e-02f, +1.913046142e-02f, +1.199597462e-02f, +3.380064841e-03f, - +1.145711293e-04f, +3.102916594e-04f, +4.604496465e-04f, +4.287690391e-04f, +1.030847447e-04f, -5.384549270e-04f, -1.386631915e-03f, -2.211883374e-03f, -2.731656131e-03f, -2.712997051e-03f, -2.069587256e-03f, -9.105457041e-04f, +4.836671403e-04f, +1.752386819e-03f, +2.577887010e-03f, +2.791346014e-03f, +2.420061901e-03f, +1.660078177e-03f, +7.901188395e-04f, +6.585416757e-05f, -3.619345721e-04f, -4.764716021e-04f, -3.682685191e-04f, -1.733575038e-04f, - -3.841288250e-04f, -5.685097329e-04f, -3.862023112e-04f, +2.260605998e-04f, +1.014036023e-03f, +1.491573948e-03f, +1.230367738e-03f, +1.803268347e-04f, -1.210908463e-03f, -2.200959607e-03f, -2.183341206e-03f, -1.078212250e-03f, +5.811441735e-04f, +1.940646067e-03f, +2.320313567e-03f, +1.598949545e-03f, +2.502647183e-04f, -9.752870969e-04f, -1.501483663e-03f, -1.221171030e-03f, -4.737080132e-04f, +2.356415290e-04f, +5.595050055e-04f, +4.673536613e-04f, - /* 3,11 (24) */ - +1.441077907e-03f, -1.839347686e-03f, -8.078756622e-03f, -1.553871280e-02f, -2.039043126e-02f, -1.760883883e-02f, -2.777936218e-03f, +2.581434631e-02f, +6.568853357e-02f, +1.100725201e-01f, +1.494607432e-01f, +1.744133029e-01f, +1.786032230e-01f, +1.609460098e-01f, +1.259700807e-01f, +8.228007954e-02f, +3.972398743e-02f, +6.364635021e-03f, -1.363043864e-02f, -2.051459384e-02f, -1.792305959e-02f, -1.089754730e-02f, -3.877497643e-03f, +5.792119653e-04f, - +1.286812529e-03f, +9.155299037e-03f, +1.748336492e-02f, +1.955227852e-02f, +9.964639919e-03f, -1.059585920e-02f, -3.363835945e-02f, -4.631226617e-02f, -3.874861379e-02f, -1.092254977e-02f, +2.571086615e-02f, +5.357698140e-02f, +5.857272090e-02f, +3.812554342e-02f, +2.684680815e-03f, -3.029815454e-02f, -4.611248539e-02f, -4.028633047e-02f, -1.960684079e-02f, +3.243424672e-03f, +1.745796550e-02f, +1.936610295e-02f, +1.255547962e-02f, +3.847418502e-03f, - +1.034573888e-04f, +2.980704308e-04f, +4.549557051e-04f, +4.385264485e-04f, +1.330852042e-04f, -4.904835192e-04f, -1.331453758e-03f, -2.166344606e-03f, -2.713095511e-03f, -2.732520978e-03f, -2.127027991e-03f, -9.934308368e-04f, +3.964187036e-04f, +1.683354210e-03f, +2.543435997e-03f, +2.796397255e-03f, +2.457323339e-03f, +1.713788009e-03f, +8.424723868e-04f, +1.033249365e-04f, -3.448445120e-04f, -4.771523044e-04f, -3.790053132e-04f, -1.856173713e-04f, - -3.658877748e-04f, -5.656296573e-04f, -4.110468253e-04f, +1.784135208e-04f, +9.683913798e-04f, +1.480271883e-03f, +1.271853952e-03f, +2.628206788e-04f, -1.127698014e-03f, -2.164364927e-03f, -2.218785848e-03f, -1.171604375e-03f, +4.771737415e-04f, +1.879628459e-03f, +2.330915132e-03f, +1.669647890e-03f, +3.387548764e-04f, -9.152437854e-04f, -1.493739576e-03f, -1.257468758e-03f, -5.243308648e-04f, +2.005040300e-04f, +5.527235910e-04f, +4.818993757e-04f, - /* 3,12 (24) */ - +1.544535295e-03f, -1.541277256e-03f, -7.623800917e-03f, -1.510018635e-02f, -2.025734605e-02f, -1.809932235e-02f, -4.109389976e-03f, +2.364800170e-02f, +6.297543806e-02f, +1.073399992e-01f, +1.473337153e-01f, +1.734198720e-01f, +1.789996417e-01f, +1.626293640e-01f, +1.285135167e-01f, +8.507647679e-02f, +4.218131077e-02f, +8.078423030e-03f, -1.278796625e-02f, -2.041126890e-02f, -1.826790410e-02f, -1.137469961e-02f, -4.256502956e-03f, +3.935945940e-04f, - +9.209247542e-04f, +8.589669380e-03f, +1.707231809e-02f, +1.973069204e-02f, +1.093303130e-02f, -9.115587320e-03f, -3.236650550e-02f, -4.604944549e-02f, -3.987631180e-02f, -1.308691470e-02f, +2.349208031e-02f, +5.240537703e-02f, +5.904989465e-02f, +4.000517188e-02f, +5.015595947e-03f, -2.862850665e-02f, -4.577373051e-02f, -4.120157426e-02f, -2.110058037e-02f, +1.985955914e-03f, +1.693363464e-02f, +1.956660698e-02f, +1.310820321e-02f, +4.329317877e-03f, - +9.260021088e-05f, +2.857156265e-04f, +4.487787648e-04f, +4.471257811e-04f, +1.617985515e-04f, -4.434038066e-04f, -1.276272613e-03f, -2.119666297e-03f, -2.692427006e-03f, -2.749537436e-03f, -2.182345887e-03f, -1.075285051e-03f, +3.087561805e-04f, +1.612604977e-03f, +2.506546616e-03f, +2.799077135e-03f, +2.492974943e-03f, +1.767005156e-03f, +8.953774331e-04f, +1.419783847e-04f, -3.264831727e-04f, -4.769164640e-04f, -3.893762465e-04f, -1.979929869e-04f, - -3.472813090e-04f, -5.613051227e-04f, -4.340803772e-04f, +1.316393194e-04f, +9.216511183e-04f, +1.466029931e-03f, +1.310035268e-03f, +3.437100063e-04f, -1.043069845e-03f, -2.123754270e-03f, -2.249708036e-03f, -1.262523044e-03f, +3.721903161e-04f, +1.814702668e-03f, +2.336957375e-03f, +1.737624939e-03f, +4.276003658e-04f, -8.523975536e-04f, -1.482651727e-03f, -1.291762365e-03f, -5.750396416e-04f, +1.637979372e-04f, +5.441999838e-04f, +4.955783754e-04f, - /* 3,13 (24) */ - +1.637135506e-03f, -1.255561629e-03f, -7.175022152e-03f, -1.465306057e-02f, -2.009554750e-02f, -1.854272616e-02f, -5.385662589e-03f, +2.152833541e-02f, +6.028301106e-02f, +1.045904617e-01f, +1.451513694e-01f, +1.723445870e-01f, +1.793083979e-01f, +1.642419690e-01f, +1.310200633e-01f, +8.787555393e-02f, +4.467428571e-02f, +9.845428186e-03f, -1.189258882e-02f, -2.026929052e-02f, -1.859438728e-02f, -1.185161607e-02f, -4.645879202e-03f, +1.956016071e-04f, - +5.736434452e-04f, +8.028364257e-03f, +1.663823771e-02f, +1.986233136e-02f, +1.185468242e-02f, -7.649557389e-03f, -3.105647023e-02f, -4.570573549e-02f, -4.091938165e-02f, -1.521066897e-02f, +2.124237227e-02f, +5.114285398e-02f, +5.942208496e-02f, +4.181987455e-02f, +7.352553322e-03f, -2.689088171e-02f, -4.534613014e-02f, -4.205397181e-02f, -2.258323209e-02f, +6.941935492e-04f, +1.635859500e-02f, +1.973040491e-02f, +1.365240320e-02f, +4.824896253e-03f, - +8.201546497e-05f, +2.732581479e-04f, +4.419538543e-04f, +4.545892232e-04f, +1.892184824e-04f, -3.972566074e-04f, -1.221155193e-03f, -2.071919147e-03f, -2.669698029e-03f, -2.764049302e-03f, -2.235493821e-03f, -1.156024991e-03f, +2.207709909e-04f, +1.540207185e-03f, +2.467241525e-03f, +2.799358667e-03f, +2.526954351e-03f, +1.819657590e-03f, +9.487781880e-04f, +1.817908411e-04f, -3.068410823e-04f, -4.757332307e-04f, -3.993464764e-04f, -2.104601690e-04f, - -3.283795848e-04f, -5.555919034e-04f, -4.552902447e-04f, +8.583482063e-05f, +8.739496088e-04f, +1.448932127e-03f, +1.344873748e-03f, +4.228354067e-04f, -9.572208293e-04f, -2.079241865e-03f, -2.276061109e-03f, -1.350779544e-03f, +2.664164598e-04f, +1.745995343e-03f, +2.338402133e-03f, +1.802710912e-03f, +5.166085836e-04f, -7.868528144e-04f, -1.468191662e-03f, -1.323931112e-03f, -6.257092953e-04f, +1.255798718e-04f, +5.339073330e-04f, +5.083202561e-04f, - /* 3,14 (24) */ - +1.719150971e-03f, -9.823034812e-04f, -6.733068298e-03f, -1.419847135e-02f, -1.990632902e-02f, -1.893998277e-02f, -6.606817783e-03f, +1.945641626e-02f, +5.761331303e-02f, +1.018264124e-01f, +1.429158756e-01f, +1.711885620e-01f, +1.795291689e-01f, +1.657821762e-01f, +1.334873048e-01f, +9.067491260e-02f, +4.720124006e-02f, +1.166508578e-02f, -1.094381063e-02f, -2.008749968e-02f, -1.890122836e-02f, -1.232734930e-02f, -5.045225679e-03f, -1.485856194e-05f, - +2.452638605e-04f, +7.472772354e-03f, +1.618294747e-02f, +1.994816618e-02f, +1.272863203e-02f, -6.200625263e-03f, -2.971159648e-02f, -4.528290008e-02f, -4.187660248e-02f, -1.728991084e-02f, +1.896631116e-02f, +4.979207444e-02f, +5.968850142e-02f, +4.356586989e-02f, +9.690955455e-03f, -2.508817080e-02f, -4.482952156e-02f, -4.284082463e-02f, -2.405142376e-02f, -6.297375625e-04f, +1.573288570e-02f, +1.985598479e-02f, +1.418631053e-02f, +5.333216509e-03f, - +7.171793133e-05f, +2.607281858e-04f, +4.345162095e-04f, +4.609402801e-04f, +2.153407861e-04f, -3.520806754e-04f, -1.166167127e-03f, -2.023174408e-03f, -2.644958192e-03f, -2.776062594e-03f, -2.286427588e-03f, -1.235568842e-03f, +1.325550036e-04f, +1.466231160e-03f, +2.425546548e-03f, +2.797217717e-03f, +2.559200721e-03f, +1.871673067e-03f, +1.002617239e-03f, +2.227364395e-04f, -2.859105993e-04f, -4.735725955e-04f, -4.088809149e-04f, -2.229937837e-04f, - -3.092517675e-04f, -5.485484257e-04f, -4.746690398e-04f, +4.109231554e-05f, +8.254212634e-04f, +1.429068254e-03f, +1.376339999e-03f, +5.000433397e-04f, -8.703490222e-04f, -2.030950215e-03f, -2.297809027e-03f, -1.436191554e-03f, +1.600766433e-04f, +1.673642119e-03f, +2.335221636e-03f, +1.864741531e-03f, +6.055847117e-04f, -7.187217155e-04f, -1.450338834e-03f, -1.353857631e-03f, -6.762124622e-04f, +8.591185626e-05f, +5.218232591e-04f, +5.200556115e-04f, - /* 3,15 (24) */ - +1.790868903e-03f, -7.215752954e-04f, -6.298552089e-03f, -1.373753107e-02f, -1.969098823e-02f, -1.929206344e-02f, -7.772984909e-03f, +1.743324185e-02f, +5.496835484e-02f, +9.905034982e-02f, +1.406294480e-01f, +1.699529931e-01f, +1.796617239e-01f, +1.672484073e-01f, +1.359128514e-01f, +9.347213031e-02f, +4.976044078e-02f, +1.353675884e-02f, -9.941193394e-03f, -1.986476324e-02f, -1.918713896e-02f, -1.280092190e-02f, -5.454106594e-03f, -2.378523456e-04f, - -6.398790701e-05f, +6.924223928e-03f, +1.570827843e-02f, +1.998925849e-02f, +1.355405329e-02f, -4.771557009e-03f, -2.833525649e-02f, -4.478285674e-02f, -4.274695150e-02f, -1.932086105e-02f, +1.666850214e-02f, +4.835588289e-02f, +5.984857807e-02f, +4.523951201e-02f, +1.202617709e-02f, -2.322342926e-02f, -4.422393685e-02f, -4.355954634e-02f, -2.550176259e-02f, -1.983595193e-03f, +1.505667324e-02f, +1.994189664e-02f, +1.470813379e-02f, +5.853272120e-03f, - +6.172129803e-05f, +2.481551782e-04f, +4.265012055e-04f, +4.662037107e-04f, +2.401633161e-04f, -3.079126691e-04f, -1.111372868e-03f, -1.973503767e-03f, -2.618259216e-03f, -2.785586443e-03f, -2.335105944e-03f, -1.313836442e-03f, +4.420040917e-05f, +1.390749392e-03f, +2.381490657e-03f, +2.792633064e-03f, +2.589654838e-03f, +1.922979241e-03f, +1.056835617e-03f, +2.647871259e-04f, -2.636859589e-04f, -4.704054608e-04f, -4.179442895e-04f, -2.355677716e-04f, - -2.899658374e-04f, -5.402355369e-04f, -4.922146246e-04f, -2.500611640e-06f, +7.762001769e-04f, +1.406533530e-03f, +1.404413140e-03f, +5.751864623e-04f, -7.826531639e-04f, -1.979009750e-03f, -2.314926423e-03f, -1.518583567e-03f, +5.339670306e-05f, +1.597787307e-03f, +2.327398621e-03f, +1.923558464e-03f, +6.943321844e-04f, -6.481239362e-04f, -1.429080757e-03f, -1.381428286e-03f, -7.264197738e-04f, +4.486124072e-05f, +5.079300130e-04f, +5.307162707e-04f, - /* 4, 0 (24) */ - +5.910568274e-03f, +9.344012921e-03f, +6.715430524e-03f, -5.120571451e-03f, -2.296499959e-02f, -3.581520112e-02f, -2.874793219e-02f, +8.820490956e-03f, +7.496489258e-02f, +1.526479177e-01f, +2.154764560e-01f, +2.396078991e-01f, +2.154764560e-01f, +1.526479177e-01f, +7.496489258e-02f, +8.820490956e-03f, -2.874793219e-02f, -3.581520112e-02f, -2.296499959e-02f, -5.120571451e-03f, +6.715430524e-03f, +9.344012921e-03f, +5.910568274e-03f, +1.498636456e-03f, - -1.109690051e-02f, -9.192118277e-03f, +4.909501427e-03f, +2.390317093e-02f, +3.104677588e-02f, +1.408111182e-02f, -2.057860987e-02f, -4.829599839e-02f, -4.456558545e-02f, -7.016204252e-03f, +3.922878654e-02f, +5.990197477e-02f, +3.922878654e-02f, -7.016204252e-03f, -4.456558545e-02f, -4.829599839e-02f, -2.057860987e-02f, +1.408111182e-02f, +3.104677588e-02f, +2.390317093e-02f, +4.909501427e-03f, -9.192118277e-03f, -1.109690051e-02f, -5.253212842e-03f, - -2.951484991e-04f, -8.998572355e-05f, +4.255442201e-04f, +9.901057327e-04f, +1.116641160e-03f, +3.722451400e-04f, -1.274855305e-03f, -3.283987023e-03f, -4.716191528e-03f, -4.708889279e-03f, -2.988536699e-03f, -9.759711223e-05f, +2.832420010e-03f, +4.650032366e-03f, +4.764596193e-03f, +3.400912380e-03f, +1.398317305e-03f, -2.930402722e-04f, -1.098620861e-03f, -1.016363493e-03f, -4.637030991e-04f, +6.571341915e-05f, +2.920803586e-04f, +2.282445394e-04f, - +2.266093497e-04f, -4.797135611e-04f, -1.166867229e-03f, -1.027593860e-03f, +2.064743435e-04f, +1.758635466e-03f, +2.269131010e-03f, +9.906663742e-04f, -1.352215341e-03f, -2.966279869e-03f, -2.456219733e-03f, -8.652974051e-05f, +2.349601620e-03f, +3.003693677e-03f, +1.494439848e-03f, -8.598194762e-04f, -2.242182210e-03f, -1.834582014e-03f, -3.074334988e-04f, +9.798976511e-04f, +1.189646801e-03f, +5.316786300e-04f, -1.951059247e-04f, -4.246522513e-04f, - /* 4, 1 (24) */ - +5.615419775e-03f, +9.254027197e-03f, +7.140974744e-03f, -4.130465718e-03f, -2.184835843e-02f, -3.544295598e-02f, -3.002278750e-02f, +5.536503933e-03f, +7.024870105e-02f, +1.479390285e-01f, +2.124879193e-01f, +2.395103020e-01f, +2.183088760e-01f, +1.572979501e-01f, +7.972948877e-02f, +1.222140334e-02f, -2.734961489e-02f, -3.610824139e-02f, -2.406362045e-02f, -6.136934944e-03f, +6.251727425e-03f, +9.409726340e-03f, +6.202648633e-03f, +1.726880996e-03f, - -1.087029116e-02f, -9.671831838e-03f, +3.742634198e-03f, +2.287557707e-02f, +3.125325023e-02f, +1.583974728e-02f, -1.830947886e-02f, -4.730533201e-02f, -4.591780079e-02f, -9.982484121e-03f, +3.677256680e-02f, +5.981544503e-02f, +4.157838816e-02f, -4.012510575e-03f, -4.307114560e-02f, -4.915581786e-02f, -2.282079208e-02f, +1.224652980e-02f, +3.073934238e-02f, +2.488306858e-02f, +6.099148229e-03f, -8.660439647e-03f, -1.129200643e-02f, -5.677865093e-03f, - -2.970618278e-04f, -1.129423443e-04f, +3.876607392e-04f, +9.621230615e-04f, +1.131121191e-03f, +4.477215948e-04f, -1.152951352e-03f, -3.164785433e-03f, -4.661959248e-03f, -4.760768184e-03f, -3.139873279e-03f, -2.926316469e-04f, +2.671760396e-03f, +4.584236615e-03f, +4.807012809e-03f, +3.515307214e-03f, +1.523131068e-03f, -2.101728727e-04f, -1.076987578e-03f, -1.040762049e-03f, -5.020325956e-04f, +4.015283030e-05f, +2.878202400e-04f, +2.375338361e-04f, - +2.558786752e-04f, -4.277888735e-04f, -1.140670631e-03f, -1.070625390e-03f, +1.069857010e-04f, +1.678405860e-03f, +2.288550536e-03f, +1.116953835e-03f, -1.207005506e-03f, -2.919959996e-03f, -2.555009560e-03f, -2.593092511e-04f, +2.235480908e-03f, +3.032033182e-03f, +1.633187849e-03f, -7.247999891e-04f, -2.207693370e-03f, -1.905912608e-03f, -4.095350395e-04f, +9.276022135e-04f, +1.208828944e-03f, +5.834744348e-04f, -1.614262971e-04f, -4.267160150e-04f, - /* 4, 2 (24) */ - +5.318357947e-03f, +9.141084853e-03f, +7.528635483e-03f, -3.168342657e-03f, -2.071723724e-02f, -3.499523439e-02f, -3.117573885e-02f, +2.371718500e-03f, +6.558674180e-02f, +1.431782603e-01f, +2.093480460e-01f, +2.392176703e-01f, +2.209806364e-01f, +1.618821867e-01f, +8.453650158e-02f, +1.573671055e-02f, -2.582648382e-02f, -3.631841427e-02f, -2.514060803e-02f, -7.177696994e-03f, +5.749694829e-03f, +9.449879170e-03f, +6.490468873e-03f, +1.964414832e-03f, - -1.061441248e-02f, -1.009962071e-02f, +2.601963567e-03f, +2.180495168e-02f, +3.136023593e-02f, +1.751815314e-02f, -1.602092833e-02f, -4.618837818e-02f, -4.712480630e-02f, -1.290244412e-02f, +3.421755724e-02f, +5.955613578e-02f, +4.381386906e-02f, -9.804773931e-04f, -4.143795775e-02f, -4.988061785e-02f, -2.502848545e-02f, +1.034061719e-02f, +3.032980734e-02f, +2.581067080e-02f, +7.307977172e-03f, -8.076965213e-03f, -1.145343273e-02f, -6.104581108e-03f, - -2.978600871e-04f, -1.345608566e-04f, +3.501533590e-04f, +9.325503775e-04f, +1.142140271e-03f, +5.194134739e-04f, -1.032804775e-03f, -3.043562935e-03f, -4.602069579e-03f, -4.805643658e-03f, -3.286202528e-03f, -4.871874507e-04f, +2.506804536e-03f, +4.511554930e-03f, +4.843291167e-03f, +3.626918859e-03f, +1.649083741e-03f, -1.237185549e-04f, -1.051675519e-03f, -1.063168091e-03f, -5.404240438e-04f, +1.333639036e-05f, +2.823337555e-04f, +2.463641198e-04f, - +2.828673928e-04f, -3.761084583e-04f, -1.111246460e-03f, -1.108945667e-03f, +9.284478218e-06f, +1.594236343e-03f, +2.300477815e-03f, +1.238314598e-03f, -1.059308148e-03f, -2.864931819e-03f, -2.645672812e-03f, -4.312498432e-04f, +2.114209588e-03f, +3.051160400e-03f, +1.767976602e-03f, -5.860131168e-04f, -2.165680325e-03f, -1.972306011e-03f, -5.124407003e-04f, +8.707919742e-04f, +1.224243239e-03f, +6.348863357e-04f, -1.256397887e-04f, -4.268311281e-04f, - /* 4, 3 (24) */ - +5.020497860e-03f, +9.006523996e-03f, +7.878788842e-03f, -2.235792279e-03f, -1.957509697e-02f, -3.447582091e-02f, -3.220854363e-02f, -6.718444343e-04f, +6.098467222e-02f, +1.383726166e-01f, +2.060618435e-01f, +2.387304829e-01f, +2.234874410e-01f, +1.663937416e-01f, +8.937979275e-02f, +1.936362941e-02f, -2.417740008e-02f, -3.644213282e-02f, -2.619228355e-02f, -8.240865085e-03f, +5.209270785e-03f, +9.463215561e-03f, +6.772802628e-03f, +2.210778952e-03f, - -1.033154509e-02f, -1.047572917e-02f, +1.490717107e-03f, +2.069600601e-02f, +3.136952040e-02f, +1.911238949e-02f, -1.372045051e-02f, -4.495006358e-02f, -4.818411445e-02f, -1.576737594e-02f, +3.157188443e-02f, +5.912488593e-02f, +4.592807865e-02f, +2.070683007e-03f, -3.966998115e-02f, -5.046663097e-02f, -2.719416578e-02f, +8.368311183e-03f, +2.981736664e-02f, +2.668146277e-02f, +8.532220411e-03f, -7.442078877e-03f, -1.157907252e-02f, -6.531412236e-03f, - -2.975853885e-04f, -1.548237372e-04f, +3.131185268e-04f, +9.015228143e-04f, +1.149783980e-03f, +5.872742939e-04f, -9.146076028e-04f, -2.920575309e-03f, -4.536702075e-03f, -4.843503992e-03f, -3.427307645e-03f, -6.809464965e-04f, +2.337808095e-03f, +4.432053922e-03f, +4.873291706e-03f, +3.735496851e-03f, +1.775956290e-03f, -3.376265471e-05f, -1.022626124e-03f, -1.083449670e-03f, -5.787651005e-04f, -1.469838763e-05f, +2.755894962e-04f, +2.546810981e-04f, - +3.075402963e-04f, -3.248697309e-04f, -1.078792266e-03f, -1.142526828e-03f, -8.632466115e-05f, +1.506478905e-03f, +2.304975695e-03f, +1.354402136e-03f, -9.096258639e-04f, -2.801421778e-03f, -2.727939590e-03f, -6.017955435e-04f, +1.986164759e-03f, +3.060968227e-03f, +1.898333598e-03f, -4.438811070e-04f, -2.116185752e-03f, -2.033454008e-03f, -6.158032162e-04f, +8.095703561e-04f, +1.235730167e-03f, +6.856954984e-04f, -8.782713262e-05f, -4.249196111e-04f, - /* 4, 4 (24) */ - +4.722912471e-03f, +8.851700259e-03f, +8.191907369e-03f, -1.334269465e-03f, -1.842531299e-02f, -3.388854662e-02f, -3.312315123e-02f, -3.592419744e-03f, +5.644797015e-02f, +1.335291126e-01f, +2.026345359e-01f, +2.380495364e-01f, +2.258252491e-01f, +1.708257956e-01f, +9.425308445e-02f, +2.309912626e-02f, -2.240144379e-02f, -3.647589548e-02f, -2.721490967e-02f, -9.324314755e-03f, +4.630505685e-03f, +9.448517173e-03f, +7.048392124e-03f, +2.465460050e-03f, - -1.002400480e-02f, -1.080059890e-02f, +4.119248402e-04f, +1.955347919e-02f, +3.128319574e-02f, +2.061886839e-02f, -1.141547482e-02f, -4.359566145e-02f, -4.909374031e-02f, -1.856879772e-02f, +2.884394484e-02f, +5.852309039e-02f, +4.791424341e-02f, +5.131651235e-03f, -3.777164755e-02f, -5.091051208e-02f, -2.931035153e-02f, +6.334857175e-03f, +2.920156343e-02f, +2.749103313e-02f, +9.767950579e-03f, -6.756383379e-03f, -1.166689965e-02f, -6.956331847e-03f, - -2.962820044e-04f, -1.737182778e-04f, +2.766482744e-04f, +8.691753767e-04f, +1.154143821e-03f, +6.512671889e-04f, -7.985442235e-04f, -2.796078215e-03f, -4.466045145e-03f, -4.874351128e-03f, -3.562982669e-03f, -8.735924451e-04f, +2.165035212e-03f, +4.345813839e-03f, +4.896885906e-03f, +3.840793525e-03f, +1.903523927e-03f, +5.959980534e-05f, -9.897883643e-04f, -1.101476584e-03f, -6.169399693e-04f, -4.390887979e-05f, +2.675592264e-04f, +2.624303860e-04f, - +3.298733464e-04f, -2.742629533e-04f, -1.043512724e-03f, -1.171359473e-03f, -1.795502555e-04f, +1.415492934e-03f, +2.302132318e-03f, +1.464891720e-03f, -7.584642122e-04f, -2.729684053e-03f, -2.801569278e-03f, -7.703953239e-04f, +1.851747335e-03f, +3.061380951e-03f, +2.023798326e-03f, -2.988418656e-04f, -2.059279315e-03f, -2.089062742e-03f, -7.192675144e-04f, +7.440597219e-04f, +1.243141989e-03f, +7.356797266e-04f, -4.808040719e-05f, -4.209105440e-04f, - /* 4, 5 (24) */ - +4.426630467e-03f, +8.677981981e-03f, +8.468555643e-03f, -4.650940882e-04f, -1.727116917e-02f, -3.323727943e-02f, -3.392169545e-02f, -6.388497959e-03f, +5.198192500e-02f, +1.286547615e-01f, +1.990715532e-01f, +2.371759439e-01f, +2.279902843e-01f, +1.751716094e-01f, +9.914997036e-02f, +2.693991978e-02f, -2.049791986e-02f, -3.641629567e-02f, -2.820469804e-02f, -1.042579134e-02f, +4.013565716e-03f, +9.404608293e-03f, +7.315951351e-03f, +2.727890436e-03f, - -9.694131449e-03f, -1.107486185e-02f, -6.315878842e-04f, +1.838211971e-02f, +3.110364549e-02f, +2.203436132e-02f, -9.113342497e-03f, -4.213076973e-02f, -4.985220452e-02f, -2.129848177e-02f, +2.604237556e-02f, +5.775269507e-02f, +4.976599075e-02f, +8.193032186e-03f, -3.574784923e-02f, -5.120935394e-02f, -3.136963085e-02f, +4.245794433e-03f, +2.848229591e-02f, +2.823509285e-02f, +1.101109257e-02f, -6.020703652e-03f, -1.171498006e-02f, -7.377242391e-03f, - -2.939961575e-04f, -1.912364864e-04f, +2.408300730e-04f, +8.356425853e-04f, +1.155316863e-03f, +7.113648240e-04f, -6.847910800e-04f, -2.670326620e-03f, -4.390295559e-03f, -4.898200576e-03f, -3.693032886e-03f, -1.064811314e-03f, +1.988757954e-03f, +4.252928462e-03f, +4.913956657e-03f, +3.942564594e-03f, +2.031556539e-03f, +1.562641763e-04f, -9.531190211e-04f, -1.117120767e-03f, -6.548296388e-04f, -7.424733524e-05f, +2.582180735e-04f, +2.695576957e-04f, - +3.498534893e-04f, -2.244706013e-04f, -1.005618652e-03f, -1.195452352e-03f, -2.701149383e-04f, +1.321643778e-03f, +2.292060497e-03f, +1.569481383e-03f, -6.063298797e-04f, -2.649999522e-03f, -2.866351311e-03f, -9.365050536e-04f, +1.711380664e-03f, +3.052354649e-03f, +2.143924008e-03f, -1.513474996e-04f, -1.995057703e-03f, -2.138854013e-03f, -8.224719531e-04f, +6.744012400e-04f, +1.246343594e-03f, +7.846143283e-04f, -6.502917124e-06f, -4.147405942e-04f, - /* 4, 6 (24) */ - +4.132634310e-03f, +8.486745495e-03f, +8.709385716e-03f, +3.705484971e-04f, -1.611585230e-02f, -3.252591461e-02f, -3.460648653e-02f, -9.058824578e-03f, +4.759162944e-02f, +1.237565609e-01f, +1.953785203e-01f, +2.361111326e-01f, +2.299790422e-01f, +1.794245379e-01f, +1.040639270e-01f, +3.088248438e-02f, -1.846636332e-02f, -3.626003150e-02f, -2.915781706e-02f, -1.154291211e-02f, +3.358736077e-03f, +9.330360958e-03f, +7.574169424e-03f, +2.997448131e-03f, - -9.344277959e-03f, -1.129933246e-02f, -1.637206536e-03f, +1.718666736e-02f, +3.083353055e-02f, +2.335600510e-02f, -6.821282000e-03f, -4.056128834e-02f, -5.045853440e-02f, -2.394848129e-02f, +2.317602425e-02f, +5.681619001e-02f, +5.147737141e-02f, +1.124538683e-02f, -3.360392522e-02f, -5.136070144e-02f, -3.336468855e-02f, +2.106940420e-03f, +2.765982396e-02f, +2.890949409e-02f, +1.225743616e-02f, -5.236089324e-03f, -1.172148298e-02f, -7.791982986e-03f, - -2.907758097e-04f, -2.073749764e-04f, +2.057467055e-04f, +8.010581284e-04f, +1.153405375e-03f, +7.675492868e-04f, -5.735163829e-04f, -2.543574237e-03f, -4.309657937e-03f, -4.915081283e-03f, -3.817275195e-03f, -1.254292140e-03f, +1.809255757e-03f, +4.153504979e-03f, +4.924398615e-03f, +4.040569734e-03f, +2.159819149e-03f, +2.561162685e-04f, -9.125829546e-04f, -1.130256677e-03f, -6.923121357e-04f, -1.056608750e-04f, +2.475447115e-04f, +2.760090310e-04f, - +3.674784300e-04f, -1.756667778e-04f, -9.653260198e-04f, -1.214831985e-03f, -3.577562621e-04f, +1.225301290e-03f, +2.274897005e-03f, +1.667892799e-03f, -4.537288554e-04f, -2.562674624e-03f, -2.922105845e-03f, -1.099589424e-03f, +1.565509063e-03f, +3.033877471e-03f, +2.258279288e-03f, -1.862795885e-06f, -1.923644569e-03f, -2.182566527e-03f, -9.250496052e-04f, +6.007546715e-04f, +1.245213312e-03f, +8.322730096e-04f, +3.679097804e-05f, -4.063545219e-04f, - /* 4, 7 (24) */ - +3.841858500e-03f, +8.279370519e-03f, +8.915132422e-03f, +1.171606625e-03f, -1.496244693e-02f, -3.175836532e-02f, -3.518000291e-02f, -1.160239881e-02f, +4.328197151e-02f, +1.188414796e-01f, +1.915612451e-01f, +2.348568405e-01f, +2.317882980e-01f, +1.835780428e-01f, +1.089883256e-01f, +3.492305411e-02f, -1.630654417e-02f, -3.600391523e-02f, -3.007040001e-02f, -1.267316878e-02f, +2.666423941e-03f, +9.224700083e-03f, +7.821714136e-03f, +3.273457162e-03f, - -8.976799529e-03f, -1.147499923e-02f, -2.602532556e-03f, +1.597183538e-02f, +3.047577429e-02f, +2.458130639e-02f, -4.546384995e-03f, -3.889339554e-02f, -5.091226326e-02f, -2.651115591e-02f, +2.025391841e-02f, +5.571660059e-02f, +5.304288047e-02f, +1.427926431e-02f, -3.134564593e-02f, -5.136256424e-02f, -3.528833312e-02f, -7.562610744e-05f, +2.673477435e-02f, +2.951024876e-02f, +1.350264947e-02f, -4.403816314e-03f, -1.168469200e-02f, -8.198337507e-03f, - -2.866704507e-04f, -2.221348446e-04f, +1.714761543e-04f, +7.655545239e-04f, +1.148516462e-03f, +8.198119566e-04f, -4.648798487e-04f, -2.416072973e-03f, -4.224344227e-03f, -4.925035484e-03f, -3.935538460e-03f, -1.441727638e-03f, +1.626814845e-03f, +4.047663820e-03f, +4.928118518e-03f, +4.134573166e-03f, +2.288072386e-03f, +3.590324632e-04f, -8.681533514e-04f, -1.140761684e-03f, -7.292627917e-04f, -1.380915066e-04f, +2.355215382e-04f, +2.817308867e-04f, - +3.827563625e-04f, -1.280166756e-04f, -9.228549643e-04f, -1.229542213e-03f, -4.422274506e-04f, +1.126838381e-03f, +2.250801790e-03f, +1.759872062e-03f, -3.011646206e-04f, -2.468040139e-03f, -2.968684302e-03f, -1.259123840e-03f, +1.414596274e-03f, +3.005969800e-03f, +2.366449877e-03f, +1.491363604e-04f, -1.845190363e-03f, -2.219957098e-03f, -1.026629580e-03f, +5.232980778e-04f, +1.239643690e-03f, +8.784287942e-04f, +8.167608907e-05f, -3.957056594e-04f, - /* 4, 8 (24) */ - +3.555188049e-03f, +8.057235674e-03f, +9.086608576e-03f, +1.937161149e-03f, -1.381393047e-02f, -3.093855336e-02f, -3.564488276e-02f, -1.401847179e-02f, +3.905762728e-02f, +1.139164441e-01f, +1.876257067e-01f, +2.334151128e-01f, +2.334151128e-01f, +1.876257067e-01f, +1.139164441e-01f, +3.905762728e-02f, -1.401847179e-02f, -3.564488276e-02f, -3.093855336e-02f, -1.381393047e-02f, +1.937161149e-03f, +9.086608576e-03f, +8.057235674e-03f, +3.555188049e-03f, - -8.594043167e-03f, -1.160301591e-02f, -3.525387520e-03f, +1.474229316e-02f, +3.003354684e-02f, +2.570814477e-02f, -2.295583205e-03f, -3.713352348e-02f, -5.121342788e-02f, -2.897919605e-02f, +1.728523411e-02f, +5.445747675e-02f, +5.445747675e-02f, +1.728523411e-02f, -2.897919605e-02f, -5.121342788e-02f, -3.713352348e-02f, -2.295583205e-03f, +2.570814477e-02f, +3.003354684e-02f, +1.474229316e-02f, -3.525387520e-03f, -1.160301591e-02f, -8.594043167e-03f, - -2.817308867e-04f, -2.355215382e-04f, +1.380915066e-04f, +7.292627917e-04f, +1.140761684e-03f, +8.681533514e-04f, -3.590324632e-04f, -2.288072386e-03f, -4.134573166e-03f, -4.928118518e-03f, -4.047663820e-03f, -1.626814845e-03f, +1.441727638e-03f, +3.935538460e-03f, +4.925035484e-03f, +4.224344227e-03f, +2.416072973e-03f, +4.648798487e-04f, -8.198119566e-04f, -1.148516462e-03f, -7.655545239e-04f, -1.714761543e-04f, +2.221348446e-04f, +2.866704507e-04f, - +3.957056594e-04f, -8.167608907e-05f, -8.784287942e-04f, -1.239643690e-03f, -5.232980778e-04f, +1.026629580e-03f, +2.219957098e-03f, +1.845190363e-03f, -1.491363604e-04f, -2.366449877e-03f, -3.005969800e-03f, -1.414596274e-03f, +1.259123840e-03f, +2.968684302e-03f, +2.468040139e-03f, +3.011646206e-04f, -1.759872062e-03f, -2.250801790e-03f, -1.126838381e-03f, +4.422274506e-04f, +1.229542213e-03f, +9.228549643e-04f, +1.280166756e-04f, -3.827563625e-04f, - /* 4, 9 (24) */ - +3.273457162e-03f, +7.821714136e-03f, +9.224700083e-03f, +2.666423941e-03f, -1.267316878e-02f, -3.007040001e-02f, -3.600391523e-02f, -1.630654417e-02f, +3.492305411e-02f, +1.089883256e-01f, +1.835780428e-01f, +2.317882980e-01f, +2.348568405e-01f, +1.915612451e-01f, +1.188414796e-01f, +4.328197151e-02f, -1.160239881e-02f, -3.518000291e-02f, -3.175836532e-02f, -1.496244693e-02f, +1.171606625e-03f, +8.915132422e-03f, +8.279370519e-03f, +3.841858500e-03f, - -8.198337507e-03f, -1.168469200e-02f, -4.403816314e-03f, +1.350264947e-02f, +2.951024876e-02f, +2.673477435e-02f, -7.562610744e-05f, -3.528833312e-02f, -5.136256424e-02f, -3.134564593e-02f, +1.427926431e-02f, +5.304288047e-02f, +5.571660059e-02f, +2.025391841e-02f, -2.651115591e-02f, -5.091226326e-02f, -3.889339554e-02f, -4.546384995e-03f, +2.458130639e-02f, +3.047577429e-02f, +1.597183538e-02f, -2.602532556e-03f, -1.147499923e-02f, -8.976799529e-03f, - -2.760090310e-04f, -2.475447115e-04f, +1.056608750e-04f, +6.923121357e-04f, +1.130256677e-03f, +9.125829546e-04f, -2.561162685e-04f, -2.159819149e-03f, -4.040569734e-03f, -4.924398615e-03f, -4.153504979e-03f, -1.809255757e-03f, +1.254292140e-03f, +3.817275195e-03f, +4.915081283e-03f, +4.309657937e-03f, +2.543574237e-03f, +5.735163829e-04f, -7.675492868e-04f, -1.153405375e-03f, -8.010581284e-04f, -2.057467055e-04f, +2.073749764e-04f, +2.907758097e-04f, - +4.063545219e-04f, -3.679097804e-05f, -8.322730096e-04f, -1.245213312e-03f, -6.007546715e-04f, +9.250496052e-04f, +2.182566527e-03f, +1.923644569e-03f, +1.862795885e-06f, -2.258279288e-03f, -3.033877471e-03f, -1.565509063e-03f, +1.099589424e-03f, +2.922105845e-03f, +2.562674624e-03f, +4.537288554e-04f, -1.667892799e-03f, -2.274897005e-03f, -1.225301290e-03f, +3.577562621e-04f, +1.214831985e-03f, +9.653260198e-04f, +1.756667778e-04f, -3.674784300e-04f, - /* 4,10 (24) */ - +2.997448131e-03f, +7.574169424e-03f, +9.330360958e-03f, +3.358736077e-03f, -1.154291211e-02f, -2.915781706e-02f, -3.626003150e-02f, -1.846636332e-02f, +3.088248438e-02f, +1.040639270e-01f, +1.794245379e-01f, +2.299790422e-01f, +2.361111326e-01f, +1.953785203e-01f, +1.237565609e-01f, +4.759162944e-02f, -9.058824578e-03f, -3.460648653e-02f, -3.252591461e-02f, -1.611585230e-02f, +3.705484971e-04f, +8.709385716e-03f, +8.486745495e-03f, +4.132634310e-03f, - -7.791982986e-03f, -1.172148298e-02f, -5.236089324e-03f, +1.225743616e-02f, +2.890949409e-02f, +2.765982396e-02f, +2.106940420e-03f, -3.336468855e-02f, -5.136070144e-02f, -3.360392522e-02f, +1.124538683e-02f, +5.147737141e-02f, +5.681619001e-02f, +2.317602425e-02f, -2.394848129e-02f, -5.045853440e-02f, -4.056128834e-02f, -6.821282000e-03f, +2.335600510e-02f, +3.083353055e-02f, +1.718666736e-02f, -1.637206536e-03f, -1.129933246e-02f, -9.344277959e-03f, - -2.695576957e-04f, -2.582180735e-04f, +7.424733524e-05f, +6.548296388e-04f, +1.117120767e-03f, +9.531190211e-04f, -1.562641763e-04f, -2.031556539e-03f, -3.942564594e-03f, -4.913956657e-03f, -4.252928462e-03f, -1.988757954e-03f, +1.064811314e-03f, +3.693032886e-03f, +4.898200576e-03f, +4.390295559e-03f, +2.670326620e-03f, +6.847910800e-04f, -7.113648240e-04f, -1.155316863e-03f, -8.356425853e-04f, -2.408300730e-04f, +1.912364864e-04f, +2.939961575e-04f, - +4.147405942e-04f, +6.502917124e-06f, -7.846143283e-04f, -1.246343594e-03f, -6.744012400e-04f, +8.224719531e-04f, +2.138854013e-03f, +1.995057703e-03f, +1.513474996e-04f, -2.143924008e-03f, -3.052354649e-03f, -1.711380664e-03f, +9.365050536e-04f, +2.866351311e-03f, +2.649999522e-03f, +6.063298797e-04f, -1.569481383e-03f, -2.292060497e-03f, -1.321643778e-03f, +2.701149383e-04f, +1.195452352e-03f, +1.005618652e-03f, +2.244706013e-04f, -3.498534893e-04f, - /* 4,11 (24) */ - +2.727890436e-03f, +7.315951351e-03f, +9.404608293e-03f, +4.013565716e-03f, -1.042579134e-02f, -2.820469804e-02f, -3.641629567e-02f, -2.049791986e-02f, +2.693991978e-02f, +9.914997036e-02f, +1.751716094e-01f, +2.279902843e-01f, +2.371759439e-01f, +1.990715532e-01f, +1.286547615e-01f, +5.198192500e-02f, -6.388497959e-03f, -3.392169545e-02f, -3.323727943e-02f, -1.727116917e-02f, -4.650940882e-04f, +8.468555643e-03f, +8.677981981e-03f, +4.426630467e-03f, - -7.377242391e-03f, -1.171498006e-02f, -6.020703652e-03f, +1.101109257e-02f, +2.823509285e-02f, +2.848229591e-02f, +4.245794433e-03f, -3.136963085e-02f, -5.120935394e-02f, -3.574784923e-02f, +8.193032186e-03f, +4.976599075e-02f, +5.775269507e-02f, +2.604237556e-02f, -2.129848177e-02f, -4.985220452e-02f, -4.213076973e-02f, -9.113342497e-03f, +2.203436132e-02f, +3.110364549e-02f, +1.838211971e-02f, -6.315878842e-04f, -1.107486185e-02f, -9.694131449e-03f, - -2.624303860e-04f, -2.675592264e-04f, +4.390887979e-05f, +6.169399693e-04f, +1.101476584e-03f, +9.897883643e-04f, -5.959980534e-05f, -1.903523927e-03f, -3.840793525e-03f, -4.896885906e-03f, -4.345813839e-03f, -2.165035212e-03f, +8.735924451e-04f, +3.562982669e-03f, +4.874351128e-03f, +4.466045145e-03f, +2.796078215e-03f, +7.985442235e-04f, -6.512671889e-04f, -1.154143821e-03f, -8.691753767e-04f, -2.766482744e-04f, +1.737182778e-04f, +2.962820044e-04f, - +4.209105440e-04f, +4.808040719e-05f, -7.356797266e-04f, -1.243141989e-03f, -7.440597219e-04f, +7.192675144e-04f, +2.089062742e-03f, +2.059279315e-03f, +2.988418656e-04f, -2.023798326e-03f, -3.061380951e-03f, -1.851747335e-03f, +7.703953239e-04f, +2.801569278e-03f, +2.729684053e-03f, +7.584642122e-04f, -1.464891720e-03f, -2.302132318e-03f, -1.415492934e-03f, +1.795502555e-04f, +1.171359473e-03f, +1.043512724e-03f, +2.742629533e-04f, -3.298733464e-04f, - /* 4,12 (24) */ - +2.465460050e-03f, +7.048392124e-03f, +9.448517173e-03f, +4.630505685e-03f, -9.324314755e-03f, -2.721490967e-02f, -3.647589548e-02f, -2.240144379e-02f, +2.309912626e-02f, +9.425308445e-02f, +1.708257956e-01f, +2.258252491e-01f, +2.380495364e-01f, +2.026345359e-01f, +1.335291126e-01f, +5.644797015e-02f, -3.592419744e-03f, -3.312315123e-02f, -3.388854662e-02f, -1.842531299e-02f, -1.334269465e-03f, +8.191907369e-03f, +8.851700259e-03f, +4.722912471e-03f, - -6.956331847e-03f, -1.166689965e-02f, -6.756383379e-03f, +9.767950579e-03f, +2.749103313e-02f, +2.920156343e-02f, +6.334857175e-03f, -2.931035153e-02f, -5.091051208e-02f, -3.777164755e-02f, +5.131651235e-03f, +4.791424341e-02f, +5.852309039e-02f, +2.884394484e-02f, -1.856879772e-02f, -4.909374031e-02f, -4.359566145e-02f, -1.141547482e-02f, +2.061886839e-02f, +3.128319574e-02f, +1.955347919e-02f, +4.119248402e-04f, -1.080059890e-02f, -1.002400480e-02f, - -2.546810981e-04f, -2.755894962e-04f, +1.469838763e-05f, +5.787651005e-04f, +1.083449670e-03f, +1.022626124e-03f, +3.376265471e-05f, -1.775956290e-03f, -3.735496851e-03f, -4.873291706e-03f, -4.432053922e-03f, -2.337808095e-03f, +6.809464965e-04f, +3.427307645e-03f, +4.843503992e-03f, +4.536702075e-03f, +2.920575309e-03f, +9.146076028e-04f, -5.872742939e-04f, -1.149783980e-03f, -9.015228143e-04f, -3.131185268e-04f, +1.548237372e-04f, +2.975853885e-04f, - +4.249196111e-04f, +8.782713262e-05f, -6.856954984e-04f, -1.235730167e-03f, -8.095703561e-04f, +6.158032162e-04f, +2.033454008e-03f, +2.116185752e-03f, +4.438811070e-04f, -1.898333598e-03f, -3.060968227e-03f, -1.986164759e-03f, +6.017955435e-04f, +2.727939590e-03f, +2.801421778e-03f, +9.096258639e-04f, -1.354402136e-03f, -2.304975695e-03f, -1.506478905e-03f, +8.632466115e-05f, +1.142526828e-03f, +1.078792266e-03f, +3.248697309e-04f, -3.075402963e-04f, - /* 4,13 (24) */ - +2.210778952e-03f, +6.772802628e-03f, +9.463215561e-03f, +5.209270785e-03f, -8.240865085e-03f, -2.619228355e-02f, -3.644213282e-02f, -2.417740008e-02f, +1.936362941e-02f, +8.937979275e-02f, +1.663937416e-01f, +2.234874410e-01f, +2.387304829e-01f, +2.060618435e-01f, +1.383726166e-01f, +6.098467222e-02f, -6.718444343e-04f, -3.220854363e-02f, -3.447582091e-02f, -1.957509697e-02f, -2.235792279e-03f, +7.878788842e-03f, +9.006523996e-03f, +5.020497860e-03f, - -6.531412236e-03f, -1.157907252e-02f, -7.442078877e-03f, +8.532220411e-03f, +2.668146277e-02f, +2.981736664e-02f, +8.368311183e-03f, -2.719416578e-02f, -5.046663097e-02f, -3.966998115e-02f, +2.070683007e-03f, +4.592807865e-02f, +5.912488593e-02f, +3.157188443e-02f, -1.576737594e-02f, -4.818411445e-02f, -4.495006358e-02f, -1.372045051e-02f, +1.911238949e-02f, +3.136952040e-02f, +2.069600601e-02f, +1.490717107e-03f, -1.047572917e-02f, -1.033154509e-02f, - -2.463641198e-04f, -2.823337555e-04f, -1.333639036e-05f, +5.404240438e-04f, +1.063168091e-03f, +1.051675519e-03f, +1.237185549e-04f, -1.649083741e-03f, -3.626918859e-03f, -4.843291167e-03f, -4.511554930e-03f, -2.506804536e-03f, +4.871874507e-04f, +3.286202528e-03f, +4.805643658e-03f, +4.602069579e-03f, +3.043562935e-03f, +1.032804775e-03f, -5.194134739e-04f, -1.142140271e-03f, -9.325503775e-04f, -3.501533590e-04f, +1.345608566e-04f, +2.978600871e-04f, - +4.268311281e-04f, +1.256397887e-04f, -6.348863357e-04f, -1.224243239e-03f, -8.707919742e-04f, +5.124407003e-04f, +1.972306011e-03f, +2.165680325e-03f, +5.860131168e-04f, -1.767976602e-03f, -3.051160400e-03f, -2.114209588e-03f, +4.312498432e-04f, +2.645672812e-03f, +2.864931819e-03f, +1.059308148e-03f, -1.238314598e-03f, -2.300477815e-03f, -1.594236343e-03f, -9.284478218e-06f, +1.108945667e-03f, +1.111246460e-03f, +3.761084583e-04f, -2.828673928e-04f, - /* 4,14 (24) */ - +1.964414832e-03f, +6.490468873e-03f, +9.449879170e-03f, +5.749694829e-03f, -7.177696994e-03f, -2.514060803e-02f, -3.631841427e-02f, -2.582648382e-02f, +1.573671055e-02f, +8.453650158e-02f, +1.618821867e-01f, +2.209806364e-01f, +2.392176703e-01f, +2.093480460e-01f, +1.431782603e-01f, +6.558674180e-02f, +2.371718500e-03f, -3.117573885e-02f, -3.499523439e-02f, -2.071723724e-02f, -3.168342657e-03f, +7.528635483e-03f, +9.141084853e-03f, +5.318357947e-03f, - -6.104581108e-03f, -1.145343273e-02f, -8.076965213e-03f, +7.307977172e-03f, +2.581067080e-02f, +3.032980734e-02f, +1.034061719e-02f, -2.502848545e-02f, -4.988061785e-02f, -4.143795775e-02f, -9.804773931e-04f, +4.381386906e-02f, +5.955613578e-02f, +3.421755724e-02f, -1.290244412e-02f, -4.712480630e-02f, -4.618837818e-02f, -1.602092833e-02f, +1.751815314e-02f, +3.136023593e-02f, +2.180495168e-02f, +2.601963567e-03f, -1.009962071e-02f, -1.061441248e-02f, - -2.375338361e-04f, -2.878202400e-04f, -4.015283030e-05f, +5.020325956e-04f, +1.040762049e-03f, +1.076987578e-03f, +2.101728727e-04f, -1.523131068e-03f, -3.515307214e-03f, -4.807012809e-03f, -4.584236615e-03f, -2.671760396e-03f, +2.926316469e-04f, +3.139873279e-03f, +4.760768184e-03f, +4.661959248e-03f, +3.164785433e-03f, +1.152951352e-03f, -4.477215948e-04f, -1.131121191e-03f, -9.621230615e-04f, -3.876607392e-04f, +1.129423443e-04f, +2.970618278e-04f, - +4.267160150e-04f, +1.614262971e-04f, -5.834744348e-04f, -1.208828944e-03f, -9.276022135e-04f, +4.095350395e-04f, +1.905912608e-03f, +2.207693370e-03f, +7.247999891e-04f, -1.633187849e-03f, -3.032033182e-03f, -2.235480908e-03f, +2.593092511e-04f, +2.555009560e-03f, +2.919959996e-03f, +1.207005506e-03f, -1.116953835e-03f, -2.288550536e-03f, -1.678405860e-03f, -1.069857010e-04f, +1.070625390e-03f, +1.140670631e-03f, +4.277888735e-04f, -2.558786752e-04f, - /* 4,15 (24) */ - +1.726880996e-03f, +6.202648633e-03f, +9.409726340e-03f, +6.251727425e-03f, -6.136934944e-03f, -2.406362045e-02f, -3.610824139e-02f, -2.734961489e-02f, +1.222140334e-02f, +7.972948877e-02f, +1.572979501e-01f, +2.183088760e-01f, +2.395103020e-01f, +2.124879193e-01f, +1.479390285e-01f, +7.024870105e-02f, +5.536503933e-03f, -3.002278750e-02f, -3.544295598e-02f, -2.184835843e-02f, -4.130465718e-03f, +7.140974744e-03f, +9.254027197e-03f, +5.615419775e-03f, - -5.677865093e-03f, -1.129200643e-02f, -8.660439647e-03f, +6.099148229e-03f, +2.488306858e-02f, +3.073934238e-02f, +1.224652980e-02f, -2.282079208e-02f, -4.915581786e-02f, -4.307114560e-02f, -4.012510575e-03f, +4.157838816e-02f, +5.981544503e-02f, +3.677256680e-02f, -9.982484121e-03f, -4.591780079e-02f, -4.730533201e-02f, -1.830947886e-02f, +1.583974728e-02f, +3.125325023e-02f, +2.287557707e-02f, +3.742634198e-03f, -9.671831838e-03f, -1.087029116e-02f, - -2.282445394e-04f, -2.920803586e-04f, -6.571341915e-05f, +4.637030991e-04f, +1.016363493e-03f, +1.098620861e-03f, +2.930402722e-04f, -1.398317305e-03f, -3.400912380e-03f, -4.764596193e-03f, -4.650032366e-03f, -2.832420010e-03f, +9.759711223e-05f, +2.988536699e-03f, +4.708889279e-03f, +4.716191528e-03f, +3.283987023e-03f, +1.274855305e-03f, -3.722451400e-04f, -1.116641160e-03f, -9.901057327e-04f, -4.255442201e-04f, +8.998572355e-05f, +2.951484991e-04f, - +4.246522513e-04f, +1.951059247e-04f, -5.316786300e-04f, -1.189646801e-03f, -9.798976511e-04f, +3.074334988e-04f, +1.834582014e-03f, +2.242182210e-03f, +8.598194762e-04f, -1.494439848e-03f, -3.003693677e-03f, -2.349601620e-03f, +8.652974051e-05f, +2.456219733e-03f, +2.966279869e-03f, +1.352215341e-03f, -9.906663742e-04f, -2.269131010e-03f, -1.758635466e-03f, -2.064743435e-04f, +1.027593860e-03f, +1.166867229e-03f, +4.797135611e-04f, -2.266093497e-04f, - /* 5, 0 (24) */ - -5.186332235e-03f, +1.518946434e-04f, +1.162493195e-02f, +1.878259948e-02f, +8.081776293e-03f, -2.173408931e-02f, -4.932654206e-02f, -3.947550743e-02f, +3.039930713e-02f, +1.456317135e-01f, +2.547052426e-01f, +2.995098738e-01f, +2.547052426e-01f, +1.456317135e-01f, +3.039930713e-02f, -3.947550743e-02f, -4.932654206e-02f, -2.173408931e-02f, +8.081776293e-03f, +1.878259948e-02f, +1.162493195e-02f, +1.518946434e-04f, -5.186332235e-03f, -3.754576386e-03f, - +4.242013348e-03f, -9.588893426e-03f, -2.119040083e-02f, -1.121093231e-02f, +1.893667489e-02f, +3.896879828e-02f, +1.996482241e-02f, -2.696432742e-02f, -5.400015650e-02f, -2.740375830e-02f, +3.023509818e-02f, +5.990197477e-02f, +3.023509818e-02f, -2.740375830e-02f, -5.400015650e-02f, -2.696432742e-02f, +1.996482241e-02f, +3.896879828e-02f, +1.893667489e-02f, -1.121093231e-02f, -2.119040083e-02f, -9.588893426e-03f, +4.242013348e-03f, +7.021039821e-03f, - -6.853914940e-05f, -5.696992846e-04f, -7.413230094e-04f, -3.748812743e-05f, +1.323115503e-03f, +2.130880606e-03f, +9.942757047e-04f, -2.293320649e-03f, -6.068406868e-03f, -7.675169148e-03f, -5.444756432e-03f, -1.841268527e-04f, +5.182021629e-03f, +7.653726044e-03f, +6.259036041e-03f, +2.541092904e-03f, -8.438649054e-04f, -2.127622286e-03f, -1.406054360e-03f, -3.646584188e-05f, +7.259437023e-04f, +5.973920492e-04f, +9.697443390e-05f, -1.964077119e-04f, - +5.374915272e-04f, +1.017778343e-03f, +2.436272238e-04f, -1.397678832e-03f, -1.990629293e-03f, -2.634004448e-04f, +2.374588747e-03f, +2.905843317e-03f, +2.220752786e-04f, -3.102308260e-03f, -3.394742513e-03f, -1.279374424e-04f, +3.274975965e-03f, +3.237786595e-03f, +9.010092975e-06f, -2.823196934e-03f, -2.498183523e-03f, +9.573325739e-05f, +1.951245075e-03f, +1.487925287e-03f, -1.516704686e-04f, -1.012001821e-03f, -5.873543182e-04f, +1.452572160e-04f, - /* 5, 1 (24) */ - -5.254871384e-03f, -4.178046412e-04f, +1.088360894e-02f, +1.874511135e-02f, +9.404891796e-03f, -1.960320870e-02f, -4.833226636e-02f, -4.176882808e-02f, +2.433090026e-02f, +1.379565443e-01f, +2.492604861e-01f, +2.993257470e-01f, +2.598872642e-01f, +1.532854395e-01f, +3.665834317e-02f, -3.693441453e-02f, -5.017040697e-02f, -2.386171159e-02f, +6.675721933e-03f, +1.874613364e-02f, +1.235087565e-02f, +7.492866926e-04f, -5.089357801e-03f, -3.950984098e-03f, - +4.779504875e-03f, -8.571115083e-03f, -2.094677361e-02f, -1.260861114e-02f, +1.694604560e-02f, +3.870539783e-02f, +2.233941116e-02f, -2.405848410e-02f, -5.377808122e-02f, -3.050606656e-02f, +2.684035567e-02f, +5.977403733e-02f, +3.351007415e-02f, -2.416597170e-02f, -5.399114641e-02f, -2.978752435e-02f, +1.746663889e-02f, +3.906453154e-02f, +2.088791997e-02f, -9.723007024e-03f, -2.134207130e-02f, -1.060089525e-02f, +3.654659030e-03f, +7.166297037e-03f, - -4.118315267e-05f, -5.407312178e-04f, -7.530098918e-04f, -1.085023281e-04f, +1.238106892e-03f, +2.126127454e-03f, +1.135599185e-03f, -2.047831598e-03f, -5.868964755e-03f, -7.680728180e-03f, -5.694882839e-03f, -5.519408980e-04f, +4.907241304e-03f, +7.616269797e-03f, +6.440200658e-03f, +2.790507225e-03f, -6.845623020e-04f, -2.116085481e-03f, -1.486522618e-03f, -1.131598359e-04f, +7.067963479e-04f, +6.236272651e-04f, +1.263939429e-04f, -1.891821789e-04f, - +4.868326252e-04f, +1.018121641e-03f, +3.315723436e-04f, -1.303129426e-03f, -2.019914373e-03f, -4.268501547e-04f, +2.242057320e-03f, +2.974500897e-03f, +4.502080806e-04f, -2.953783155e-03f, -3.499075769e-03f, -3.832212247e-04f, +3.140289727e-03f, +3.359518155e-03f, +2.419900705e-04f, -2.726798420e-03f, -2.612125139e-03f, -7.540916074e-05f, +1.901747710e-03f, +1.573302243e-03f, -5.607367513e-05f, -1.000641246e-03f, -6.360907922e-04f, +1.119438402e-04f, - /* 5, 2 (24) */ - -5.296054537e-03f, -9.585358590e-04f, +1.013059905e-02f, +1.863660902e-02f, +1.064299869e-02f, -1.747708125e-02f, -4.719666718e-02f, -4.381665968e-02f, +1.846193550e-02f, +1.302758162e-01f, +2.435656033e-01f, +2.987738061e-01f, +2.647945055e-01f, +1.609017093e-01f, +4.309854382e-02f, -3.414390730e-02f, -5.085496927e-02f, -2.597779707e-02f, +5.189199315e-03f, +1.863297380e-02f, +1.305767200e-02f, +1.372913958e-03f, -4.962963858e-03f, -4.140166276e-03f, - +5.266337501e-03f, -7.552993442e-03f, -2.061520126e-02f, -1.391174057e-02f, +1.492613123e-02f, +3.827854768e-02f, +2.458146848e-02f, -2.108398320e-02f, -5.332787314e-02f, -3.345984971e-02f, +2.334127990e-02f, +5.939081610e-02f, +3.665036387e-02f, -2.080645355e-02f, -5.374915634e-02f, -3.251432277e-02f, +1.485451375e-02f, +3.898912237e-02f, +2.278966768e-02f, -8.149704780e-03f, -2.139814497e-02f, -1.160153649e-02f, +3.018568238e-03f, +7.278240878e-03f, - -1.499269425e-05f, -5.106693149e-04f, -7.610931012e-04f, -1.763952895e-04f, +1.151424749e-03f, +2.113649817e-03f, +1.267673040e-03f, -1.805248337e-03f, -5.661377727e-03f, -7.670575477e-03f, -5.931875340e-03f, -9.184372939e-04f, +4.621014124e-03f, +7.562715330e-03f, +6.611267769e-03f, +3.040905742e-03f, -5.165965845e-04f, -2.096024566e-03f, -1.564116219e-03f, -1.923761170e-04f, +6.838191950e-04f, +6.482227261e-04f, +1.566939668e-04f, -1.804670083e-04f, - +4.357017427e-04f, +1.013208586e-03f, +4.151652822e-04f, -1.204853345e-03f, -2.039165191e-03f, -5.853729931e-04f, +2.101340124e-03f, +3.029003320e-03f, +6.743527600e-04f, -2.792970240e-03f, -3.587537314e-03f, -6.367346213e-04f, +2.991270227e-03f, +3.466865657e-03f, +4.757894207e-04f, -2.616954258e-03f, -2.715735564e-03f, -2.492550854e-04f, +1.842175043e-03f, +1.653256174e-03f, +4.276187297e-05f, -9.835734075e-04f, -6.833665337e-04f, +7.610423209e-05f, - /* 5, 3 (24) */ - -5.311047231e-03f, -1.469205174e-03f, +9.369505949e-03f, +1.846021373e-02f, +1.179442344e-02f, -1.536343143e-02f, -4.592899414e-02f, -4.562190802e-02f, +1.280055778e-02f, +1.226052407e-01f, +2.376337280e-01f, +2.978553688e-01f, +2.694155196e-01f, +1.684644246e-01f, +4.970981159e-02f, -3.110300156e-02f, -5.137156586e-02f, -2.807382164e-02f, +3.625083096e-03f, +1.844059768e-02f, +1.374149120e-02f, +2.021136684e-03f, -4.806269891e-03f, -4.320633285e-03f, - +5.702039243e-03f, -6.539784856e-03f, -2.020003598e-02f, -1.511659391e-02f, +1.288696603e-02f, +3.769317469e-02f, +2.668280860e-02f, -1.805497988e-02f, -5.265352038e-02f, -3.625281995e-02f, +1.975374259e-02f, +5.875408148e-02f, +3.964163410e-02f, -1.733958789e-02f, -5.327336691e-02f, -3.513127703e-02f, +1.213877818e-02f, +3.873986729e-02f, +2.463184272e-02f, -6.496448606e-03f, -2.135538310e-02f, -1.258510990e-02f, +2.335201704e-03f, +7.354345110e-03f, - +9.954907849e-06f, -4.796934681e-04f, -7.656737396e-04f, -2.410040137e-04f, +1.063459319e-03f, +2.093753199e-03f, +1.390368093e-03f, -1.566173173e-03f, -5.446327939e-03f, -7.644925770e-03f, -6.155247235e-03f, -1.282742040e-03f, +4.323972854e-03f, +7.493022150e-03f, +6.771625305e-03f, +3.291615744e-03f, -3.402294621e-04f, -2.067216663e-03f, -1.638429341e-03f, -2.738793138e-04f, +6.569650669e-04f, +6.709971107e-04f, +1.877623636e-04f, -1.702385130e-04f, - +3.844151532e-04f, +1.003240387e-03f, +4.940977046e-04f, -1.103433293e-03f, -2.048496253e-03f, -7.382955736e-04f, +1.953218183e-03f, +3.069254691e-03f, +8.935011650e-04f, -2.620683371e-03f, -3.659765892e-03f, -8.873071002e-04f, +2.828573971e-03f, +3.559258001e-03f, +7.093209057e-04f, -2.494039861e-03f, -2.808379188e-03f, -4.250068959e-04f, +1.772617490e-03f, +1.727249866e-03f, +1.444067703e-04f, -9.607041710e-04f, -7.288448583e-04f, +3.786197773e-05f, - /* 5, 4 (24) */ - -5.301092324e-03f, -1.948898642e-03f, +8.603832209e-03f, +1.821920972e-02f, +1.285788276e-02f, -1.326967823e-02f, -4.453862604e-02f, -4.718808119e-02f, +7.354229837e-03f, +1.149603149e-01f, +2.314784807e-01f, +2.965726268e-01f, +2.737394925e-01f, +1.759574468e-01f, +5.648143690e-02f, -2.781138582e-02f, -5.171179532e-02f, -3.014103830e-02f, +1.986653755e-03f, +1.816671837e-02f, +1.439845626e-02f, +2.692133794e-03f, -4.618507528e-03f, -4.490871798e-03f, - +6.086454396e-03f, -5.536544469e-03f, -1.970593828e-02f, -1.622002721e-02f, +1.083846978e-02f, +3.695487911e-02f, +2.863602678e-02f, -1.498572519e-02f, -5.176001921e-02f, -3.887350333e-02f, +1.609397669e-02f, +5.786677438e-02f, +4.247020807e-02f, -1.378032989e-02f, -5.256404601e-02f, -3.762531689e-02f, +9.330398994e-03f, +3.831486039e-02f, +2.640446021e-02f, -4.769198741e-03f, -2.121097633e-02f, -1.354581407e-02f, +1.606356846e-03f, +7.392207087e-03f, - +3.359134204e-05f, -4.479812312e-04f, -7.668644500e-04f, -3.021840960e-04f, +9.745935658e-04f, +2.066760123e-03f, +1.503588095e-03f, -1.331186495e-03f, -5.224509357e-03f, -7.604035182e-03f, -6.364551947e-03f, -1.643987769e-03f, +4.016782547e-03f, +7.407194790e-03f, +6.920684232e-03f, +3.541951659e-03f, -1.557553883e-04f, -2.029462937e-03f, -1.709055879e-03f, -3.574168621e-04f, +6.262020199e-04f, +6.917708468e-04f, +2.194788192e-04f, -1.584801580e-04f, - +3.332795848e-04f, +9.884407955e-04f, +5.680944390e-04f, -9.994551411e-04f, -2.048070203e-03f, -8.849834373e-04f, +1.798498320e-03f, +3.095229353e-03f, +1.106677360e-03f, -2.437786994e-03f, -3.715478990e-03f, -1.133782663e-03f, +2.652924440e-03f, +3.636193412e-03f, +9.414906444e-04f, -2.358498330e-03f, -2.889466587e-03f, -6.018448430e-04f, +1.693218472e-03f, +1.794765679e-03f, +2.484052497e-04f, -9.319697936e-04f, -7.721888174e-04f, -2.639140442e-06f, - /* 5, 5 (24) */ - -5.267500982e-03f, -2.396879873e-03f, +7.836967759e-03f, +1.791702563e-02f, +1.383247632e-02f, -1.120291811e-02f, -4.303503795e-02f, -4.851926768e-02f, +2.129720480e-03f, +1.073562797e-01f, +2.251139288e-01f, +2.949286390e-01f, +2.777562750e-01f, +1.833646416e-01f, +6.340212113e-02f, -2.426943416e-02f, -5.186755071e-02f, -3.217050124e-02f, +2.775978765e-04f, +1.780930151e-02f, +1.502465828e-02f, +3.383904641e-03f, -4.399028709e-03f, -4.649351956e-03f, - +6.419733981e-03f, -4.548103674e-03f, -1.913784384e-02f, -1.721948235e-02f, +8.790399578e-03f, +3.606989567e-02f, +3.043452510e-02f, -1.189049584e-02f, -5.065334185e-02f, -4.131129032e-02f, +1.237849770e-02f, +5.673299172e-02f, +4.512313251e-02f, -1.014413648e-02f, -5.162255536e-02f, -3.998381522e-02f, +6.440932407e-03f, +3.771301555e-02f, +2.809767868e-02f, -2.974433062e-03f, -2.096257108e-02f, -1.447778387e-02f, +8.341680284e-04f, +7.389567947e-03f, - +5.585733180e-05f, -4.157070877e-04f, -7.647885786e-04f, -3.598097665e-04f, +8.852019243e-04f, +2.033008602e-03f, +1.607269417e-03f, -1.100845237e-03f, -4.996625439e-03f, -7.548200098e-03f, -6.559384197e-03f, -2.001316367e-03f, +3.700138618e-03f, +7.305283111e-03f, +7.057880665e-03f, +3.791217094e-03f, +3.649883589e-05f, -1.982589837e-03f, -1.775590974e-03f, -4.427195273e-04f, +5.915139548e-04f, +7.103669930e-04f, +2.517151564e-04f, -1.451828985e-04f, - +2.825906333e-04f, +9.690542132e-04f, +6.369142213e-04f, -8.935047057e-04f, -2.038096100e-03f, -1.024843725e-03f, +1.638008733e-03f, +3.106971295e-03f, +1.312942243e-03f, -2.245191588e-03f, -3.754474007e-03f, -1.375025553e-03f, +2.465108642e-03f, +3.697242238e-03f, +1.171203543e-03f, -2.210838844e-03f, -2.958458089e-03f, -7.789309878e-04f, +1.604174580e-03f, +1.855308757e-03f, +3.542771309e-04f, -8.973380884e-04f, -8.130632555e-04f, -4.523544693e-05f, - /* 5, 6 (24) */ - -5.211643650e-03f, -2.812586961e-03f, +7.072179181e-03f, +1.755721586e-02f, +1.471767825e-02f, -9.169909503e-03f, -4.142776853e-02f, -4.962011292e-02f, -2.866904959e-03f, +9.980807962e-02f, +2.185545446e-01f, +2.929273226e-01f, +2.814564136e-01f, +1.906699247e-01f, +7.046000180e-02f, -2.047821706e-02f, -5.183105187e-02f, -3.415309108e-02f, -1.497993098e-03f, +1.736658198e-02f, +1.561617224e-02f, +4.094271634e-03f, -4.147313552e-03f, -4.794534854e-03f, - +6.702324615e-03f, -3.579049461e-03f, -1.850092962e-02f, -1.811298705e-02f, +6.752303478e-03f, +3.504505195e-02f, +3.207253384e-02f, -8.783524544e-03f, -4.934039961e-02f, -4.355648191e-02f, +8.624023698e-03f, +5.535796616e-02f, +4.758824115e-02f, -6.446894241e-03f, -5.045135182e-02f, -4.219465407e-02f, +3.482474317e-03f, +3.693408456e-02f, +2.970185326e-02f, -1.119124305e-03f, -2.060829395e-02f, -1.537512195e-02f, +2.110477292e-05f, +7.344332500e-03f, - +7.670262023e-05f, -3.830417542e-04f, -7.595793143e-04f, -4.137738564e-04f, +7.956491128e-04f, +1.992850577e-03f, +1.701380622e-03f, -8.756814373e-04f, -4.763386793e-03f, -7.477755907e-03f, -6.739381041e-03f, -2.353881564e-03f, +3.374764820e-03f, +7.187382450e-03f, +7.182677903e-03f, +4.038706938e-03f, +2.361745800e-04f, -1.926450259e-03f, -1.837632560e-03f, -5.295020055e-04f, +5.529011764e-04f, +7.266121346e-04f, +2.843356895e-04f, -1.303454908e-04f, - +2.326312842e-04f, +9.453437237e-04f, +7.003502290e-04f, -7.861645888e-04f, -2.018827472e-03f, -1.157327590e-03f, +1.472594509e-03f, +3.104593217e-03f, +1.511397935e-03f, -2.043848905e-03f, -3.776629019e-03f, -1.609925854e-03f, +2.265973321e-03f, +3.742049389e-03f, +1.397368767e-03f, -2.051634698e-03f, -3.014867117e-03f, -9.554132892e-04f, +1.505735444e-03f, +1.908410172e-03f, +4.615199501e-04f, -8.568094310e-04f, -8.511369096e-04f, -8.974381342e-05f, - /* 5, 7 (24) */ - -5.134941029e-03f, -3.195628715e-03f, +6.312599866e-03f, +1.714344200e-02f, +1.551332736e-02f, -7.177058927e-03f, -3.972638791e-02f, -5.049579436e-02f, -7.630291751e-03f, +9.233032372e-02f, +2.118151635e-01f, +2.905734411e-01f, +2.848311785e-01f, +1.978573071e-01f, +7.764267970e-02f, -1.643951013e-02f, -5.159487729e-02f, -3.607954133e-02f, -3.335625657e-03f, +1.683707998e-02f, +1.616907341e-02f, +4.820883769e-03f, -3.862977863e-03f, -4.924880345e-03f, - +6.934955899e-03f, -2.633705737e-03f, -1.780057939e-02f, -1.889915164e-02f, +4.733476006e-03f, +3.388772436e-02f, +3.354512835e-02f, -5.678931327e-03f, -4.782900168e-02f, -4.560033081e-02f, +4.847394679e-03f, +5.374804031e-02f, +4.985421448e-02f, -2.704844852e-03f, -4.905398305e-02f, -4.424628876e-02f, +4.676072000e-04f, +3.597867127e-02f, +3.120758871e-02f, +7.892858666e-04f, -2.014677400e-02f, -1.623193138e-02f, -8.300321367e-04f, +7.254588687e-03f, - +9.608591183e-05f, -3.501515202e-04f, -7.513788099e-04f, -4.639876892e-04f, +7.062890113e-04f, +1.946650338e-03f, +1.785921941e-03f, -6.562009107e-04f, -4.525508848e-03f, -7.393075623e-03f, -6.904222762e-03f, -2.700851479e-03f, +3.041411119e-03f, +7.053633621e-03f, +7.294568394e-03f, +4.283709527e-03f, +4.428820227e-04f, -1.860924634e-03f, -1.894782932e-03f, -6.174636061e-04f, +5.103808984e-04f, +7.403372875e-04f, +3.171976273e-04f, -1.139747727e-04f, - +1.836705515e-04f, +9.175890628e-04f, +7.582304082e-04f, -6.780110980e-04f, -1.990560162e-03f, -1.281932341e-03f, +1.303113105e-03f, +3.088275241e-03f, +1.701191931e-03f, -1.834747021e-03f, -3.781903129e-03f, -1.837404960e-03f, +2.056420874e-03f, +3.770336402e-03f, +1.618905221e-03f, -1.881520982e-03f, -3.058263286e-03f, -1.130429823e-03f, +1.398203313e-03f, +1.953629977e-03f, +5.696112611e-04f, -8.104175945e-04f, -8.860845375e-04f, -1.359622363e-04f, - /* 5, 8 (24) */ - -5.038855118e-03f, -3.545780235e-03f, +5.561221056e-03f, +1.667945431e-02f, +1.621961637e-02f, -5.230408589e-03f, -3.794046597e-02f, -5.115199527e-02f, -1.215580060e-02f, +8.493724809e-02f, +2.049109408e-01f, +2.878725896e-01f, +2.878725896e-01f, +2.049109408e-01f, +8.493724809e-02f, -1.215580060e-02f, -5.115199527e-02f, -3.794046597e-02f, -5.230408589e-03f, +1.621961637e-02f, +1.667945431e-02f, +5.561221056e-03f, -3.545780235e-03f, -5.038855118e-03f, - +7.118626450e-03f, -1.716116674e-03f, -1.704234898e-02f, -1.957716274e-02f, +2.742915844e-03f, +3.260579202e-02f, +3.484824145e-02f, -2.590656086e-03f, -4.612780975e-02f, -4.743507783e-02f, +1.065491550e-03f, +5.191063535e-02f, +5.191063535e-02f, +1.065491550e-03f, -4.743507783e-02f, -4.612780975e-02f, -2.590656086e-03f, +3.484824145e-02f, +3.260579202e-02f, +2.742915844e-03f, -1.957716274e-02f, -1.704234898e-02f, -1.716116674e-03f, +7.118626450e-03f, - +1.139747727e-04f, -3.171976273e-04f, -7.403372875e-04f, -5.103808984e-04f, +6.174636061e-04f, +1.894782932e-03f, +1.860924634e-03f, -4.428820227e-04f, -4.283709527e-03f, -7.294568394e-03f, -7.053633621e-03f, -3.041411119e-03f, +2.700851479e-03f, +6.904222762e-03f, +7.393075623e-03f, +4.525508848e-03f, +6.562009107e-04f, -1.785921941e-03f, -1.946650338e-03f, -7.062890113e-04f, +4.639876892e-04f, +7.513788099e-04f, +3.501515202e-04f, -9.608591183e-05f, - +1.359622363e-04f, +8.860845375e-04f, +8.104175945e-04f, -5.696112611e-04f, -1.953629977e-03f, -1.398203313e-03f, +1.130429823e-03f, +3.058263286e-03f, +1.881520982e-03f, -1.618905221e-03f, -3.770336402e-03f, -2.056420874e-03f, +1.837404960e-03f, +3.781903129e-03f, +1.834747021e-03f, -1.701191931e-03f, -3.088275241e-03f, -1.303113105e-03f, +1.281932341e-03f, +1.990560162e-03f, +6.780110980e-04f, -7.582304082e-04f, -9.175890628e-04f, -1.836705515e-04f, - /* 5, 9 (24) */ - -4.924880345e-03f, -3.862977863e-03f, +4.820883769e-03f, +1.616907341e-02f, +1.683707998e-02f, -3.335625657e-03f, -3.607954133e-02f, -5.159487729e-02f, -1.643951013e-02f, +7.764267970e-02f, +1.978573071e-01f, +2.848311785e-01f, +2.905734411e-01f, +2.118151635e-01f, +9.233032372e-02f, -7.630291751e-03f, -5.049579436e-02f, -3.972638791e-02f, -7.177058927e-03f, +1.551332736e-02f, +1.714344200e-02f, +6.312599866e-03f, -3.195628715e-03f, -5.134941029e-03f, - +7.254588687e-03f, -8.300321367e-04f, -1.623193138e-02f, -2.014677400e-02f, +7.892858666e-04f, +3.120758871e-02f, +3.597867127e-02f, +4.676072000e-04f, -4.424628876e-02f, -4.905398305e-02f, -2.704844852e-03f, +4.985421448e-02f, +5.374804031e-02f, +4.847394679e-03f, -4.560033081e-02f, -4.782900168e-02f, -5.678931327e-03f, +3.354512835e-02f, +3.388772436e-02f, +4.733476006e-03f, -1.889915164e-02f, -1.780057939e-02f, -2.633705737e-03f, +6.934955899e-03f, - +1.303454908e-04f, -2.843356895e-04f, -7.266121346e-04f, -5.529011764e-04f, +5.295020055e-04f, +1.837632560e-03f, +1.926450259e-03f, -2.361745800e-04f, -4.038706938e-03f, -7.182677903e-03f, -7.187382450e-03f, -3.374764820e-03f, +2.353881564e-03f, +6.739381041e-03f, +7.477755907e-03f, +4.763386793e-03f, +8.756814373e-04f, -1.701380622e-03f, -1.992850577e-03f, -7.956491128e-04f, +4.137738564e-04f, +7.595793143e-04f, +3.830417542e-04f, -7.670262023e-05f, - +8.974381342e-05f, +8.511369096e-04f, +8.568094310e-04f, -4.615199501e-04f, -1.908410172e-03f, -1.505735444e-03f, +9.554132892e-04f, +3.014867117e-03f, +2.051634698e-03f, -1.397368767e-03f, -3.742049389e-03f, -2.265973321e-03f, +1.609925854e-03f, +3.776629019e-03f, +2.043848905e-03f, -1.511397935e-03f, -3.104593217e-03f, -1.472594509e-03f, +1.157327590e-03f, +2.018827472e-03f, +7.861645888e-04f, -7.003502290e-04f, -9.453437237e-04f, -2.326312842e-04f, - /* 5,10 (24) */ - -4.794534854e-03f, -4.147313552e-03f, +4.094271634e-03f, +1.561617224e-02f, +1.736658198e-02f, -1.497993098e-03f, -3.415309108e-02f, -5.183105187e-02f, -2.047821706e-02f, +7.046000180e-02f, +1.906699247e-01f, +2.814564136e-01f, +2.929273226e-01f, +2.185545446e-01f, +9.980807962e-02f, -2.866904959e-03f, -4.962011292e-02f, -4.142776853e-02f, -9.169909503e-03f, +1.471767825e-02f, +1.755721586e-02f, +7.072179181e-03f, -2.812586961e-03f, -5.211643650e-03f, - +7.344332500e-03f, +2.110477292e-05f, -1.537512195e-02f, -2.060829395e-02f, -1.119124305e-03f, +2.970185326e-02f, +3.693408456e-02f, +3.482474317e-03f, -4.219465407e-02f, -5.045135182e-02f, -6.446894241e-03f, +4.758824115e-02f, +5.535796616e-02f, +8.624023698e-03f, -4.355648191e-02f, -4.934039961e-02f, -8.783524544e-03f, +3.207253384e-02f, +3.504505195e-02f, +6.752303478e-03f, -1.811298705e-02f, -1.850092962e-02f, -3.579049461e-03f, +6.702324615e-03f, - +1.451828985e-04f, -2.517151564e-04f, -7.103669930e-04f, -5.915139548e-04f, +4.427195273e-04f, +1.775590974e-03f, +1.982589837e-03f, -3.649883589e-05f, -3.791217094e-03f, -7.057880665e-03f, -7.305283111e-03f, -3.700138618e-03f, +2.001316367e-03f, +6.559384197e-03f, +7.548200098e-03f, +4.996625439e-03f, +1.100845237e-03f, -1.607269417e-03f, -2.033008602e-03f, -8.852019243e-04f, +3.598097665e-04f, +7.647885786e-04f, +4.157070877e-04f, -5.585733180e-05f, - +4.523544693e-05f, +8.130632555e-04f, +8.973380884e-04f, -3.542771309e-04f, -1.855308757e-03f, -1.604174580e-03f, +7.789309878e-04f, +2.958458089e-03f, +2.210838844e-03f, -1.171203543e-03f, -3.697242238e-03f, -2.465108642e-03f, +1.375025553e-03f, +3.754474007e-03f, +2.245191588e-03f, -1.312942243e-03f, -3.106971295e-03f, -1.638008733e-03f, +1.024843725e-03f, +2.038096100e-03f, +8.935047057e-04f, -6.369142213e-04f, -9.690542132e-04f, -2.825906333e-04f, - /* 5,11 (24) */ - -4.649351956e-03f, -4.399028709e-03f, +3.383904641e-03f, +1.502465828e-02f, +1.780930151e-02f, +2.775978765e-04f, -3.217050124e-02f, -5.186755071e-02f, -2.426943416e-02f, +6.340212113e-02f, +1.833646416e-01f, +2.777562750e-01f, +2.949286390e-01f, +2.251139288e-01f, +1.073562797e-01f, +2.129720480e-03f, -4.851926768e-02f, -4.303503795e-02f, -1.120291811e-02f, +1.383247632e-02f, +1.791702563e-02f, +7.836967759e-03f, -2.396879873e-03f, -5.267500982e-03f, - +7.389567947e-03f, +8.341680284e-04f, -1.447778387e-02f, -2.096257108e-02f, -2.974433062e-03f, +2.809767868e-02f, +3.771301555e-02f, +6.440932407e-03f, -3.998381522e-02f, -5.162255536e-02f, -1.014413648e-02f, +4.512313251e-02f, +5.673299172e-02f, +1.237849770e-02f, -4.131129032e-02f, -5.065334185e-02f, -1.189049584e-02f, +3.043452510e-02f, +3.606989567e-02f, +8.790399578e-03f, -1.721948235e-02f, -1.913784384e-02f, -4.548103674e-03f, +6.419733981e-03f, - +1.584801580e-04f, -2.194788192e-04f, -6.917708468e-04f, -6.262020199e-04f, +3.574168621e-04f, +1.709055879e-03f, +2.029462937e-03f, +1.557553883e-04f, -3.541951659e-03f, -6.920684232e-03f, -7.407194790e-03f, -4.016782547e-03f, +1.643987769e-03f, +6.364551947e-03f, +7.604035182e-03f, +5.224509357e-03f, +1.331186495e-03f, -1.503588095e-03f, -2.066760123e-03f, -9.745935658e-04f, +3.021840960e-04f, +7.668644500e-04f, +4.479812312e-04f, -3.359134204e-05f, - +2.639140442e-06f, +7.721888174e-04f, +9.319697936e-04f, -2.484052497e-04f, -1.794765679e-03f, -1.693218472e-03f, +6.018448430e-04f, +2.889466587e-03f, +2.358498330e-03f, -9.414906444e-04f, -3.636193412e-03f, -2.652924440e-03f, +1.133782663e-03f, +3.715478990e-03f, +2.437786994e-03f, -1.106677360e-03f, -3.095229353e-03f, -1.798498320e-03f, +8.849834373e-04f, +2.048070203e-03f, +9.994551411e-04f, -5.680944390e-04f, -9.884407955e-04f, -3.332795848e-04f, - /* 5,12 (24) */ - -4.490871798e-03f, -4.618507528e-03f, +2.692133794e-03f, +1.439845626e-02f, +1.816671837e-02f, +1.986653755e-03f, -3.014103830e-02f, -5.171179532e-02f, -2.781138582e-02f, +5.648143690e-02f, +1.759574468e-01f, +2.737394925e-01f, +2.965726268e-01f, +2.314784807e-01f, +1.149603149e-01f, +7.354229837e-03f, -4.718808119e-02f, -4.453862604e-02f, -1.326967823e-02f, +1.285788276e-02f, +1.821920972e-02f, +8.603832209e-03f, -1.948898642e-03f, -5.301092324e-03f, - +7.392207087e-03f, +1.606356846e-03f, -1.354581407e-02f, -2.121097633e-02f, -4.769198741e-03f, +2.640446021e-02f, +3.831486039e-02f, +9.330398994e-03f, -3.762531689e-02f, -5.256404601e-02f, -1.378032989e-02f, +4.247020807e-02f, +5.786677438e-02f, +1.609397669e-02f, -3.887350333e-02f, -5.176001921e-02f, -1.498572519e-02f, +2.863602678e-02f, +3.695487911e-02f, +1.083846978e-02f, -1.622002721e-02f, -1.970593828e-02f, -5.536544469e-03f, +6.086454396e-03f, - +1.702385130e-04f, -1.877623636e-04f, -6.709971107e-04f, -6.569650669e-04f, +2.738793138e-04f, +1.638429341e-03f, +2.067216663e-03f, +3.402294621e-04f, -3.291615744e-03f, -6.771625305e-03f, -7.493022150e-03f, -4.323972854e-03f, +1.282742040e-03f, +6.155247235e-03f, +7.644925770e-03f, +5.446327939e-03f, +1.566173173e-03f, -1.390368093e-03f, -2.093753199e-03f, -1.063459319e-03f, +2.410040137e-04f, +7.656737396e-04f, +4.796934681e-04f, -9.954907849e-06f, - -3.786197773e-05f, +7.288448583e-04f, +9.607041710e-04f, -1.444067703e-04f, -1.727249866e-03f, -1.772617490e-03f, +4.250068959e-04f, +2.808379188e-03f, +2.494039861e-03f, -7.093209057e-04f, -3.559258001e-03f, -2.828573971e-03f, +8.873071002e-04f, +3.659765892e-03f, +2.620683371e-03f, -8.935011650e-04f, -3.069254691e-03f, -1.953218183e-03f, +7.382955736e-04f, +2.048496253e-03f, +1.103433293e-03f, -4.940977046e-04f, -1.003240387e-03f, -3.844151532e-04f, - /* 5,13 (24) */ - -4.320633285e-03f, -4.806269891e-03f, +2.021136684e-03f, +1.374149120e-02f, +1.844059768e-02f, +3.625083096e-03f, -2.807382164e-02f, -5.137156586e-02f, -3.110300156e-02f, +4.970981159e-02f, +1.684644246e-01f, +2.694155196e-01f, +2.978553688e-01f, +2.376337280e-01f, +1.226052407e-01f, +1.280055778e-02f, -4.562190802e-02f, -4.592899414e-02f, -1.536343143e-02f, +1.179442344e-02f, +1.846021373e-02f, +9.369505949e-03f, -1.469205174e-03f, -5.311047231e-03f, - +7.354345110e-03f, +2.335201704e-03f, -1.258510990e-02f, -2.135538310e-02f, -6.496448606e-03f, +2.463184272e-02f, +3.873986729e-02f, +1.213877818e-02f, -3.513127703e-02f, -5.327336691e-02f, -1.733958789e-02f, +3.964163410e-02f, +5.875408148e-02f, +1.975374259e-02f, -3.625281995e-02f, -5.265352038e-02f, -1.805497988e-02f, +2.668280860e-02f, +3.769317469e-02f, +1.288696603e-02f, -1.511659391e-02f, -2.020003598e-02f, -6.539784856e-03f, +5.702039243e-03f, - +1.804670083e-04f, -1.566939668e-04f, -6.482227261e-04f, -6.838191950e-04f, +1.923761170e-04f, +1.564116219e-03f, +2.096024566e-03f, +5.165965845e-04f, -3.040905742e-03f, -6.611267769e-03f, -7.562715330e-03f, -4.621014124e-03f, +9.184372939e-04f, +5.931875340e-03f, +7.670575477e-03f, +5.661377727e-03f, +1.805248337e-03f, -1.267673040e-03f, -2.113649817e-03f, -1.151424749e-03f, +1.763952895e-04f, +7.610931012e-04f, +5.106693149e-04f, +1.499269425e-05f, - -7.610423209e-05f, +6.833665337e-04f, +9.835734075e-04f, -4.276187297e-05f, -1.653256174e-03f, -1.842175043e-03f, +2.492550854e-04f, +2.715735564e-03f, +2.616954258e-03f, -4.757894207e-04f, -3.466865657e-03f, -2.991270227e-03f, +6.367346213e-04f, +3.587537314e-03f, +2.792970240e-03f, -6.743527600e-04f, -3.029003320e-03f, -2.101340124e-03f, +5.853729931e-04f, +2.039165191e-03f, +1.204853345e-03f, -4.151652822e-04f, -1.013208586e-03f, -4.357017427e-04f, - /* 5,14 (24) */ - -4.140166276e-03f, -4.962963858e-03f, +1.372913958e-03f, +1.305767200e-02f, +1.863297380e-02f, +5.189199315e-03f, -2.597779707e-02f, -5.085496927e-02f, -3.414390730e-02f, +4.309854382e-02f, +1.609017093e-01f, +2.647945055e-01f, +2.987738061e-01f, +2.435656033e-01f, +1.302758162e-01f, +1.846193550e-02f, -4.381665968e-02f, -4.719666718e-02f, -1.747708125e-02f, +1.064299869e-02f, +1.863660902e-02f, +1.013059905e-02f, -9.585358590e-04f, -5.296054537e-03f, - +7.278240878e-03f, +3.018568238e-03f, -1.160153649e-02f, -2.139814497e-02f, -8.149704780e-03f, +2.278966768e-02f, +3.898912237e-02f, +1.485451375e-02f, -3.251432277e-02f, -5.374915634e-02f, -2.080645355e-02f, +3.665036387e-02f, +5.939081610e-02f, +2.334127990e-02f, -3.345984971e-02f, -5.332787314e-02f, -2.108398320e-02f, +2.458146848e-02f, +3.827854768e-02f, +1.492613123e-02f, -1.391174057e-02f, -2.061520126e-02f, -7.552993442e-03f, +5.266337501e-03f, - +1.891821789e-04f, -1.263939429e-04f, -6.236272651e-04f, -7.067963479e-04f, +1.131598359e-04f, +1.486522618e-03f, +2.116085481e-03f, +6.845623020e-04f, -2.790507225e-03f, -6.440200658e-03f, -7.616269797e-03f, -4.907241304e-03f, +5.519408980e-04f, +5.694882839e-03f, +7.680728180e-03f, +5.868964755e-03f, +2.047831598e-03f, -1.135599185e-03f, -2.126127454e-03f, -1.238106892e-03f, +1.085023281e-04f, +7.530098918e-04f, +5.407312178e-04f, +4.118315267e-05f, - -1.119438402e-04f, +6.360907922e-04f, +1.000641246e-03f, +5.607367513e-05f, -1.573302243e-03f, -1.901747710e-03f, +7.540916074e-05f, +2.612125139e-03f, +2.726798420e-03f, -2.419900705e-04f, -3.359518155e-03f, -3.140289727e-03f, +3.832212247e-04f, +3.499075769e-03f, +2.953783155e-03f, -4.502080806e-04f, -2.974500897e-03f, -2.242057320e-03f, +4.268501547e-04f, +2.019914373e-03f, +1.303129426e-03f, -3.315723436e-04f, -1.018121641e-03f, -4.868326252e-04f, - /* 5,15 (24) */ - -3.950984098e-03f, -5.089357801e-03f, +7.492866926e-04f, +1.235087565e-02f, +1.874613364e-02f, +6.675721933e-03f, -2.386171159e-02f, -5.017040697e-02f, -3.693441453e-02f, +3.665834317e-02f, +1.532854395e-01f, +2.598872642e-01f, +2.993257470e-01f, +2.492604861e-01f, +1.379565443e-01f, +2.433090026e-02f, -4.176882808e-02f, -4.833226636e-02f, -1.960320870e-02f, +9.404891796e-03f, +1.874511135e-02f, +1.088360894e-02f, -4.178046412e-04f, -5.254871384e-03f, - +7.166297037e-03f, +3.654659030e-03f, -1.060089525e-02f, -2.134207130e-02f, -9.723007024e-03f, +2.088791997e-02f, +3.906453154e-02f, +1.746663889e-02f, -2.978752435e-02f, -5.399114641e-02f, -2.416597170e-02f, +3.351007415e-02f, +5.977403733e-02f, +2.684035567e-02f, -3.050606656e-02f, -5.377808122e-02f, -2.405848410e-02f, +2.233941116e-02f, +3.870539783e-02f, +1.694604560e-02f, -1.260861114e-02f, -2.094677361e-02f, -8.571115083e-03f, +4.779504875e-03f, - +1.964077119e-04f, -9.697443390e-05f, -5.973920492e-04f, -7.259437023e-04f, +3.646584188e-05f, +1.406054360e-03f, +2.127622286e-03f, +8.438649054e-04f, -2.541092904e-03f, -6.259036041e-03f, -7.653726044e-03f, -5.182021629e-03f, +1.841268527e-04f, +5.444756432e-03f, +7.675169148e-03f, +6.068406868e-03f, +2.293320649e-03f, -9.942757047e-04f, -2.130880606e-03f, -1.323115503e-03f, +3.748812743e-05f, +7.413230094e-04f, +5.696992846e-04f, +6.853914940e-05f, - -1.452572160e-04f, +5.873543182e-04f, +1.012001821e-03f, +1.516704686e-04f, -1.487925287e-03f, -1.951245075e-03f, -9.573325739e-05f, +2.498183523e-03f, +2.823196934e-03f, -9.010092975e-06f, -3.237786595e-03f, -3.274975965e-03f, +1.279374424e-04f, +3.394742513e-03f, +3.102308260e-03f, -2.220752786e-04f, -2.905843317e-03f, -2.374588747e-03f, +2.634004448e-04f, +1.990629293e-03f, +1.397678832e-03f, -2.436272238e-04f, -1.017778343e-03f, -5.374915272e-04f, - /* 6, 0 (24) */ - -9.443188869e-04f, -9.436998782e-03f, -9.565468880e-03f, +7.571667169e-03f, +2.701845118e-02f, +1.723470897e-02f, -2.936171966e-02f, -6.643983485e-02f, -2.360084937e-02f, +1.182279552e-01f, +2.849403407e-01f, +3.594118486e-01f, +2.849403407e-01f, +1.182279552e-01f, -2.360084937e-02f, -6.643983485e-02f, -2.936171966e-02f, +1.723470897e-02f, +2.701845118e-02f, +7.571667169e-03f, -9.565468880e-03f, -9.436998782e-03f, -9.443188869e-04f, +3.266463436e-03f, - +9.443188869e-04f, +1.280596256e-02f, +1.051077168e-03f, -2.198035832e-02f, -1.993238995e-02f, +1.659489883e-02f, +4.037674484e-02f, +8.960064052e-03f, -4.280330062e-02f, -4.102451787e-02f, +1.852929662e-02f, +5.568401311e-02f, +1.852929662e-02f, -4.102451787e-02f, -4.280330062e-02f, +8.960064052e-03f, +4.037674484e-02f, +1.659489883e-02f, -1.993238995e-02f, -2.198035832e-02f, +1.051077168e-03f, +1.280596256e-02f, +5.134169749e-03f, -3.266463436e-03f, - +4.689523778e-04f, +4.480790583e-04f, -4.976957856e-04f, -1.435166959e-03f, -6.675137897e-04f, +1.867480161e-03f, +3.368864452e-03f, +6.125226686e-04f, -5.846331590e-03f, -1.077747741e-02f, -8.839498946e-03f, -3.120642952e-04f, +8.456997594e-03f, +1.089151264e-02f, +6.268046134e-03f, -2.821040306e-04f, -3.342048428e-03f, -2.031889028e-03f, +5.451907148e-04f, +1.451459445e-03f, +5.742732337e-04f, -4.146097723e-04f, -4.903798843e-04f, -5.115049594e-05f, - -4.689523778e-04f, -4.227197977e-05f, +1.361609930e-03f, +1.087593793e-03f, -1.354652652e-03f, -2.582317601e-03f, +7.593408284e-06f, +3.335003672e-03f, +2.283427491e-03f, -2.324348697e-03f, -4.046850226e-03f, -1.663399353e-04f, +3.948113578e-03f, +2.584849287e-03f, -2.046402663e-03f, -3.431446366e-03f, -2.546153717e-04f, +2.531961778e-03f, +1.513057151e-03f, -9.797168079e-04f, -1.418296556e-03f, -4.419126328e-05f, +7.132215359e-04f, +5.115049594e-05f, - /* 6, 1 (24) */ - -4.753665091e-04f, -8.988919724e-03f, -1.006316467e-02f, +6.136500210e-03f, +2.635093739e-02f, +1.910218913e-02f, -2.599285520e-02f, -6.582731218e-02f, -2.944718096e-02f, +1.074504778e-01f, +2.761008418e-01f, +3.590997843e-01f, +2.933973383e-01f, +1.291194678e-01f, -1.733280324e-02f, -6.672193888e-02f, -3.270376808e-02f, +1.520281994e-02f, +2.756364190e-02f, +9.023126614e-03f, -8.991195646e-03f, -9.851608555e-03f, -1.434698771e-03f, +3.215312940e-03f, - +4.753665091e-04f, +1.276369058e-02f, +2.412687098e-03f, -2.089276453e-02f, -2.128704260e-02f, +1.401258123e-02f, +4.038433825e-02f, +1.229506772e-02f, -4.051987313e-02f, -4.334886656e-02f, +1.448244640e-02f, +5.551767318e-02f, +2.247741020e-02f, -3.843966858e-02f, -4.484970329e-02f, +5.528617686e-03f, +4.012212947e-02f, +1.912686061e-02f, -1.841933280e-02f, -2.296007513e-02f, -3.672193874e-04f, +1.276177130e-02f, +5.847391285e-03f, -3.215312940e-03f, - +4.456494725e-04f, +4.773904234e-04f, -4.214375482e-04f, -1.411631754e-03f, -7.818074808e-04f, +1.699277300e-03f, +3.377656505e-03f, +9.266692994e-04f, -5.418756674e-03f, -1.063451134e-02f, -9.193958608e-03f, -9.351621227e-04f, +8.047531031e-03f, +1.097578795e-02f, +6.682190728e-03f, +6.370880484e-05f, -3.296687441e-03f, -2.191494642e-03f, +4.152250918e-04f, +1.460142407e-03f, +6.507226728e-04f, -3.770139812e-04f, -5.096968493e-04f, -7.723833868e-05f, - -4.456494725e-04f, -1.249700912e-04f, +1.297655864e-03f, +1.185350537e-03f, -1.191293312e-03f, -2.615423134e-03f, -2.356121632e-04f, +3.219058461e-03f, +2.504202414e-03f, -2.051090559e-03f, -4.120371452e-03f, -4.979644176e-04f, +3.824717377e-03f, +2.830855480e-03f, -1.794508537e-03f, -3.507530360e-03f, -5.038930094e-04f, +2.464367746e-03f, +1.665319635e-03f, -8.621996611e-04f, -1.467073881e-03f, -1.338987788e-04f, +7.100536365e-04f, +7.723833868e-05f, - /* 6, 2 (24) */ - -2.971703658e-05f, -8.511529301e-03f, -1.048460221e-02f, +4.724868456e-03f, +2.556912991e-02f, +2.080146643e-02f, -2.261519870e-02f, -6.490064288e-02f, -3.486593764e-02f, +9.681596644e-02f, +2.669068832e-01f, +3.581646222e-01f, +3.014448694e-01f, +1.400952558e-01f, -1.065061251e-02f, -6.665823007e-02f, -3.600045553e-02f, +1.301132530e-02f, +2.797886699e-02f, +1.048326902e-02f, -8.340472973e-03f, -1.022862254e-02f, -1.944395621e-03f, +3.138074601e-03f, - +2.971703658e-05f, +1.263872049e-02f, +3.710342963e-03f, -1.970741399e-02f, -2.247833591e-02f, +1.139715810e-02f, +4.014872608e-02f, +1.551412618e-02f, -3.801567072e-02f, -4.539995712e-02f, +1.036207495e-02f, +5.501970876e-02f, +2.630212758e-02f, -3.560881310e-02f, -4.664421182e-02f, +2.021087326e-03f, +3.961823646e-02f, +2.159122835e-02f, -1.675401316e-02f, -2.382227479e-02f, -1.834293269e-03f, +1.262787252e-02f, +6.557444921e-03f, -3.138074601e-03f, - +4.207090484e-04f, +5.025392707e-04f, -3.459278189e-04f, -1.381248634e-03f, -8.877404424e-04f, +1.528276824e-03f, +3.369013164e-03f, +1.223754983e-03f, -4.987024967e-03f, -1.046354572e-02f, -9.519412653e-03f, -1.555171915e-03f, +7.612284351e-03f, +1.102958099e-02f, +7.087057190e-03f, +4.239514835e-04f, -3.232332149e-03f, -2.345279652e-03f, +2.780588239e-04f, +1.460880057e-03f, +7.265810680e-04f, -3.353506814e-04f, -5.266725668e-04f, -1.043627762e-04f, - -4.207090484e-04f, -2.034277110e-04f, +1.227110830e-03f, +1.272589899e-03f, -1.024175495e-03f, -2.631382834e-03f, -4.734884070e-04f, +3.084585875e-03f, +2.707464954e-03f, -1.766885327e-03f, -4.168287358e-03f, -8.264297989e-04f, +3.677380173e-03f, +3.060716126e-03f, -1.529235425e-03f, -3.562525570e-03f, -7.538279918e-04f, +2.379665972e-03f, +1.810270836e-03f, -7.356037323e-04f, -1.507340486e-03f, -2.262870104e-04f, +7.010865730e-04f, +1.043627762e-04f, - /* 6, 3 (24) */ - +3.909920118e-04f, -8.008990030e-03f, -1.083053003e-02f, +3.343619821e-03f, +2.468138947e-02f, +2.232974326e-02f, -1.924618554e-02f, -6.367688790e-02f, -3.985296260e-02f, +8.635242072e-02f, +2.573874705e-01f, +3.566094503e-01f, +3.090571537e-01f, +1.511248368e-01f, -3.563555321e-03f, -6.623427859e-02f, -3.923278767e-02f, +1.066604565e-02f, +2.825692581e-02f, +1.194414908e-02f, -7.613891905e-03f, -1.056397322e-02f, -2.471068187e-03f, +3.033711825e-03f, - -3.909920118e-04f, +1.243529278e-02f, +4.937453793e-03f, -1.843482409e-02f, -2.350251141e-02f, +8.765775262e-03f, +3.967523768e-02f, +1.859871206e-02f, -3.530820576e-02f, -4.716684245e-02f, +6.193787588e-03f, +5.419327896e-02f, +2.997950775e-02f, -3.254809697e-02f, -4.817344725e-02f, -1.541438244e-03f, +3.886440847e-02f, +2.397089433e-02f, -1.494374233e-02f, -2.455787852e-02f, -3.341633754e-03f, +1.240158551e-02f, +7.258531494e-03f, -3.033711825e-03f, - +3.943700611e-04f, +5.235469186e-04f, -2.715760351e-04f, -1.344437307e-03f, -9.850369344e-04f, +1.355457625e-03f, +3.343586276e-03f, +1.503081518e-03f, -4.552826774e-03f, -1.026560914e-02f, -9.815013127e-03f, -2.170049140e-03f, +7.152546825e-03f, +1.105228015e-02f, +7.480946210e-03f, +7.975758828e-04f, -3.148608650e-03f, -2.492223559e-03f, +1.341881493e-04f, +1.453370552e-03f, +8.013718372e-04f, -2.897070603e-04f, -5.410824947e-04f, -1.323765352e-04f, - -3.943700611e-04f, -2.772173487e-04f, +1.150679967e-03f, +1.348998650e-03f, -8.544961206e-04f, -2.630415027e-03f, -7.045798734e-04f, +2.932672115e-03f, +2.892078306e-03f, -1.473604520e-03f, -4.190376164e-03f, -1.149653509e-03f, +3.506978773e-03f, +3.272877333e-03f, -1.252174097e-03f, -3.595834350e-03f, -1.002794943e-03f, +2.278106348e-03f, +1.946768151e-03f, -6.005694260e-04f, -1.538541034e-03f, -3.207529261e-04f, +6.861465987e-04f, +1.323765352e-04f, - /* 6, 4 (24) */ - +7.853620729e-04f, -7.485443112e-03f, -1.110210607e-02f, +1.999182515e-03f, +2.369635254e-02f, +2.368520088e-02f, -1.590259926e-02f, -6.217380638e-02f, -4.440578938e-02f, +7.608681158e-02f, +2.475724574e-01f, +3.544394011e-01f, +3.162097005e-01f, +1.621771169e-01f, +3.917390889e-03f, -6.543670271e-02f, -4.238139633e-02f, +8.173822091e-03f, +2.839111396e-02f, +1.339751963e-02f, -6.812520068e-03f, -1.085368028e-02f, -3.012150682e-03f, +2.901335290e-03f, - -7.853620729e-04f, +1.215807543e-02f, +6.088133760e-03f, -1.708582544e-02f, -2.435700753e-02f, +6.135360235e-03f, +3.897065780e-02f, +2.153138417e-02f, -3.241612746e-02f, -4.864044697e-02f, +2.003411424e-03f, +5.304362545e-02f, +3.348648653e-02f, -2.927521964e-02f, -4.942562134e-02f, -5.137272594e-03f, +3.786161352e-02f, +2.624900067e-02f, -1.299697418e-02f, -2.515844795e-02f, -4.880174789e-03f, +1.208083258e-02f, +7.944678093e-03f, -2.901335290e-03f, - +3.668709269e-04f, +5.404595643e-04f, -1.987700110e-04f, -1.301639237e-03f, -1.073476637e-03f, +1.181776686e-03f, +3.302086415e-03f, +1.764042857e-03f, -4.117831997e-03f, -1.004182218e-02f, -1.008003094e-02f, -2.777770432e-03f, +6.669706987e-03f, +1.104338820e-02f, +7.862174877e-03f, +1.183453329e-03f, -3.045221976e-03f, -2.631307780e-03f, -1.583740675e-05f, +1.437348816e-03f, +8.746072696e-04f, -2.401989468e-04f, -5.527099981e-04f, -1.611192984e-04f, - -3.668709269e-04f, -3.459613134e-04f, +1.069091052e-03f, +1.414347823e-03f, -6.834441848e-04f, -2.612848491e-03f, -9.274977734e-04f, +2.764505845e-03f, +3.057037956e-03f, -1.173167834e-03f, -4.186585198e-03f, -1.465588051e-03f, +3.314542726e-03f, +3.465893416e-03f, -9.650057653e-04f, -3.606996957e-03f, -1.249152335e-03f, +2.160058380e-03f, +2.073704357e-03f, -4.578132493e-04f, -1.560171705e-03f, -4.166576427e-04f, +6.651030470e-04f, +1.611192984e-04f, - /* 6, 5 (24) */ - +1.152233000e-03f, -6.944983547e-03f, -1.130087608e-02f, +6.975432775e-04f, +2.262287590e-02f, +2.486697757e-02f, -1.260051284e-02f, -6.040976352e-02f, -4.852362137e-02f, +6.604498940e-02f, +2.374924265e-01f, +3.516616307e-01f, +3.228794075e-01f, +1.732205051e-01f, +1.177956577e-02f, -6.425324938e-02f, -4.542661830e-02f, +5.542514312e-03f, +2.837527656e-02f, +1.483486845e-02f, -5.937912799e-03f, -1.109387922e-02f, -3.564860680e-03f, +2.740215991e-03f, - -1.152233000e-03f, +1.181211412e-02f, +7.157224812e-03f, -1.567147762e-02f, -2.504045171e-02f, +3.522511744e-03f, +3.804316003e-02f, +2.429589002e-02f, -2.935908950e-02f, -4.981361480e-02f, -2.183173774e-03f, +5.157803740e-02f, +3.680102925e-02f, -2.580932622e-02f, -5.039062711e-02f, -8.744269551e-03f, +3.661246119e-02f, +2.840905905e-02f, -1.092326982e-02f, -2.561626120e-02f, -6.440346494e-03f, +1.166417494e-02f, +8.609781140e-03f, -2.740215991e-03f, - +3.384479650e-04f, +5.533471255e-04f, -1.278743573e-04f, -1.253314472e-03f, -1.152894176e-03f, +1.008164877e-03f, +3.245278149e-03f, +2.006126058e-03f, -3.683683195e-03f, -9.793391686e-03f, -1.031385820e-02f, -3.376341920e-03f, +6.165247259e-03f, +1.100252535e-02f, +8.229084209e-03f, +1.580378250e-03f, -2.921959254e-03f, -2.761520825e-03f, -1.714163939e-04f, +1.412589230e-03f, +9.457910857e-04f, -1.869710954e-04f, -5.613480991e-04f, -1.904183455e-04f, - -3.384479650e-04f, -4.093331982e-04f, +9.830884486e-04f, +1.468492415e-03f, -5.121924999e-04f, -2.579118290e-03f, -1.140928566e-03f, +2.581368987e-03f, +3.201477334e-03f, -8.675299851e-04f, -4.157030724e-03f, -1.772234684e-03f, +3.101247748e-03f, +3.638437143e-03f, -6.694913730e-04f, -3.595696109e-03f, -1.491253623e-03f, +2.026010514e-03f, +2.190016218e-03f, -3.081242579e-04f, -1.571785345e-03f, -5.133304347e-04f, +6.378708070e-04f, +1.904183455e-04f, - /* 6, 6 (24) */ - +1.490680965e-03f, -6.391636422e-03f, -1.142875044e-02f, -5.557711946e-04f, +2.146998172e-02f, +2.587514245e-02f, -9.355234695e-03f, -5.840363747e-02f, -5.220730457e-02f, +5.625159772e-02f, +2.271785683e-01f, +3.482852888e-01f, +3.290446548e-01f, +1.842230305e-01f, +2.000864997e-02f, -6.267287113e-02f, -4.834857755e-02f, +2.780993487e-03f, +2.820386016e-02f, +1.624745768e-02f, -4.992121713e-03f, -1.128085032e-02f, -4.126208779e-03f, +2.549797646e-03f, - -1.490680965e-03f, +1.140278092e-02f, +8.140313261e-03f, -1.420298520e-02f, -2.555264421e-02f, +9.433934541e-04f, +3.690223147e-02f, +2.687725901e-02f, -2.615761217e-02f, -5.068114479e-02f, -6.340204498e-03f, +4.980580271e-02f, +3.990227700e-02f, -2.217088908e-02f, -5.106011848e-02f, -1.233996566e-02f, +3.512120757e-02f, +3.043506957e-02f, -8.733253600e-03f, -2.592438545e-02f, -8.012131839e-03f, +1.115084451e-02f, +9.247651947e-03f, -2.549797646e-03f, - +3.093339044e-04f, +5.623019695e-04f, -5.922908536e-05f, -1.199938445e-03f, -1.223178360e-03f, +8.355229870e-04f, +3.173975131e-03f, +2.228911780e-03f, -3.251988858e-03f, -9.521604813e-03f, -1.051601006e-02f, -3.963807418e-03f, +5.640738141e-03f, +1.092943184e-02f, +8.580046670e-03f, +1.987072240e-03f, -2.778692537e-03f, -2.881863548e-03f, -3.318971155e-04f, +1.378908166e-03f, +1.014421126e-03f, -1.301972964e-04f, -5.668012201e-04f, -2.200893043e-04f, - -3.093339044e-04f, -4.670589181e-04f, +8.934270684e-04f, +1.511370483e-03f, -3.418897025e-04f, -2.529760927e-03f, -1.343641901e-03f, +2.384626953e-03f, +3.324672468e-03f, -5.586673905e-04f, -4.101996605e-03f, -2.067656769e-03f, +2.868408124e-03f, +3.789309220e-03f, -3.674602494e-04f, -3.561760585e-03f, -1.727458567e-03f, +1.876568606e-03f, +2.294692934e-03f, -1.523598840e-04f, -1.572996310e-03f, -6.100731019e-04f, +6.044124905e-04f, +2.200893043e-04f, - /* 6, 7 (24) */ - +1.800014869e-03f, -5.829334452e-03f, -1.148797952e-02f, -1.755709640e-03f, +2.024680336e-02f, +2.671066543e-02f, -6.181259565e-03f, -5.617472569e-02f, -5.545929343e-02f, +4.672999290e-02f, +2.166625582e-01f, +3.443214814e-01f, +3.346853929e-01f, +1.951524623e-01f, +2.858869664e-02f, -6.068579889e-02f, -5.112727009e-02f, -1.008700610e-04f, +2.787196305e-02f, +1.762636584e-02f, -3.977700586e-03f, -1.141104762e-02f, -4.693009999e-03f, +2.329708342e-03f, - -1.800014869e-03f, +1.093572200e-02f, +9.033740329e-03f, -1.269161472e-02f, -2.589453391e-02f, -1.586367473e-03f, +3.555858956e-02f, +2.926188596e-02f, -2.283293970e-02f, -5.123981218e-02f, -1.044220110e-02f, +4.773814595e-02f, +4.277068512e-02f, -1.838157986e-02f, -5.142757873e-02f, -1.590172625e-02f, +3.339374900e-02f, +3.231163817e-02f, -6.438560666e-03f, -2.607674534e-02f, -9.585128149e-03f, +1.054077141e-02f, +9.852064438e-03f, -2.329708342e-03f, - +2.797564633e-04f, +5.674375425e-04f, +6.851598321e-06f, -1.141998787e-03f, -1.284271150e-03f, +6.647179963e-04f, +3.089035046e-03f, +2.432074331e-03f, -2.824316917e-03f, -9.227822644e-03f, -1.068612589e-02f, -4.538256439e-03f, +5.097831993e-03f, +1.082397002e-02f, +8.913473616e-03f, +2.402188545e-03f, -2.615381263e-03f, -2.991354457e-03f, -4.965796190e-04f, +1.336166371e-03f, +1.079992159e-03f, -7.008030702e-05f, -5.688869102e-04f, -2.499370090e-04f, - -2.797564633e-04f, -5.189173045e-04f, +8.008664045e-04f, +1.543001633e-03f, -1.736525899e-04f, -2.465408847e-03f, -1.534497869e-03f, +2.175718408e-03f, +3.426045613e-03f, -2.485647717e-04f, -4.021931833e-03f, -2.349992672e-03f, +2.617468151e-03f, +3.917446923e-03f, -6.079821749e-05f, -3.505167843e-03f, -1.956144632e-03f, +1.712453521e-03f, +2.386784346e-03f, +8.558833165e-06f, -1.563484939e-03f, -7.061646718e-04f, +5.647402610e-04f, +2.499370090e-04f, - /* 6, 8 (24) */ - +2.079771333e-03f, -5.261896910e-03f, -1.148112792e-02f, -2.897708427e-03f, +1.896253221e-02f, +2.737538343e-02f, -3.092224518e-03f, -5.374265135e-02f, -5.828361034e-02f, +3.750217026e-02f, +2.059764323e-01f, +3.397832249e-01f, +3.397832249e-01f, +2.059764323e-01f, +3.750217026e-02f, -5.828361034e-02f, -5.374265135e-02f, -3.092224518e-03f, +2.737538343e-02f, +1.896253221e-02f, -2.897708427e-03f, -1.148112792e-02f, -5.261896910e-03f, +2.079771333e-03f, - -2.079771333e-03f, +1.041680470e-02f, +9.834606734e-03f, -1.114861309e-02f, -2.606818650e-02f, -4.051776320e-03f, +3.402409170e-02f, +3.143760437e-02f, -1.940689409e-02f, -5.148837695e-02f, -1.446413294e-02f, +4.538815327e-02f, +4.538815327e-02f, -1.446413294e-02f, -5.148837695e-02f, -1.940689409e-02f, +3.143760437e-02f, +3.402409170e-02f, -4.051776320e-03f, -2.606818650e-02f, -1.114861309e-02f, +9.834606734e-03f, +1.041680470e-02f, -2.079771333e-03f, - +2.499370090e-04f, +5.688869102e-04f, +7.008030702e-05f, -1.079992159e-03f, -1.336166371e-03f, +4.965796190e-04f, +2.991354457e-03f, +2.615381263e-03f, -2.402188545e-03f, -8.913473616e-03f, -1.082397002e-02f, -5.097831993e-03f, +4.538256439e-03f, +1.068612589e-02f, +9.227822644e-03f, +2.824316917e-03f, -2.432074331e-03f, -3.089035046e-03f, -6.647179963e-04f, +1.284271150e-03f, +1.141998787e-03f, -6.851598321e-06f, -5.674375425e-04f, -2.797564633e-04f, - -2.499370090e-04f, -5.647402610e-04f, +7.061646718e-04f, +1.563484939e-03f, -8.558833165e-06f, -2.386784346e-03f, -1.712453521e-03f, +1.956144632e-03f, +3.505167843e-03f, +6.079821749e-05f, -3.917446923e-03f, -2.617468151e-03f, +2.349992672e-03f, +4.021931833e-03f, +2.485647717e-04f, -3.426045613e-03f, -2.175718408e-03f, +1.534497869e-03f, +2.465408847e-03f, +1.736525899e-04f, -1.543001633e-03f, -8.008664045e-04f, +5.189173045e-04f, +2.797564633e-04f, - /* 6, 9 (24) */ - +2.329708342e-03f, -4.693009999e-03f, -1.141104762e-02f, -3.977700586e-03f, +1.762636584e-02f, +2.787196305e-02f, -1.008700610e-04f, -5.112727009e-02f, -6.068579889e-02f, +2.858869664e-02f, +1.951524623e-01f, +3.346853929e-01f, +3.443214814e-01f, +2.166625582e-01f, +4.672999290e-02f, -5.545929343e-02f, -5.617472569e-02f, -6.181259565e-03f, +2.671066543e-02f, +2.024680336e-02f, -1.755709640e-03f, -1.148797952e-02f, -5.829334452e-03f, +1.800014869e-03f, - -2.329708342e-03f, +9.852064438e-03f, +1.054077141e-02f, -9.585128149e-03f, -2.607674534e-02f, -6.438560666e-03f, +3.231163817e-02f, +3.339374900e-02f, -1.590172625e-02f, -5.142757873e-02f, -1.838157986e-02f, +4.277068512e-02f, +4.773814595e-02f, -1.044220110e-02f, -5.123981218e-02f, -2.283293970e-02f, +2.926188596e-02f, +3.555858956e-02f, -1.586367473e-03f, -2.589453391e-02f, -1.269161472e-02f, +9.033740329e-03f, +1.093572200e-02f, -1.800014869e-03f, - +2.200893043e-04f, +5.668012201e-04f, +1.301972964e-04f, -1.014421126e-03f, -1.378908166e-03f, +3.318971155e-04f, +2.881863548e-03f, +2.778692537e-03f, -1.987072240e-03f, -8.580046670e-03f, -1.092943184e-02f, -5.640738141e-03f, +3.963807418e-03f, +1.051601006e-02f, +9.521604813e-03f, +3.251988858e-03f, -2.228911780e-03f, -3.173975131e-03f, -8.355229870e-04f, +1.223178360e-03f, +1.199938445e-03f, +5.922908536e-05f, -5.623019695e-04f, -3.093339044e-04f, - -2.200893043e-04f, -6.044124905e-04f, +6.100731019e-04f, +1.572996310e-03f, +1.523598840e-04f, -2.294692934e-03f, -1.876568606e-03f, +1.727458567e-03f, +3.561760585e-03f, +3.674602494e-04f, -3.789309220e-03f, -2.868408124e-03f, +2.067656769e-03f, +4.101996605e-03f, +5.586673905e-04f, -3.324672468e-03f, -2.384626953e-03f, +1.343641901e-03f, +2.529760927e-03f, +3.418897025e-04f, -1.511370483e-03f, -8.934270684e-04f, +4.670589181e-04f, +3.093339044e-04f, - /* 6,10 (24) */ - +2.549797646e-03f, -4.126208779e-03f, -1.128085032e-02f, -4.992121713e-03f, +1.624745768e-02f, +2.820386016e-02f, +2.780993487e-03f, -4.834857755e-02f, -6.267287113e-02f, +2.000864997e-02f, +1.842230305e-01f, +3.290446548e-01f, +3.482852888e-01f, +2.271785683e-01f, +5.625159772e-02f, -5.220730457e-02f, -5.840363747e-02f, -9.355234695e-03f, +2.587514245e-02f, +2.146998172e-02f, -5.557711946e-04f, -1.142875044e-02f, -6.391636422e-03f, +1.490680965e-03f, - -2.549797646e-03f, +9.247651947e-03f, +1.115084451e-02f, -8.012131839e-03f, -2.592438545e-02f, -8.733253600e-03f, +3.043506957e-02f, +3.512120757e-02f, -1.233996566e-02f, -5.106011848e-02f, -2.217088908e-02f, +3.990227700e-02f, +4.980580271e-02f, -6.340204498e-03f, -5.068114479e-02f, -2.615761217e-02f, +2.687725901e-02f, +3.690223147e-02f, +9.433934541e-04f, -2.555264421e-02f, -1.420298520e-02f, +8.140313261e-03f, +1.140278092e-02f, -1.490680965e-03f, - +1.904183455e-04f, +5.613480991e-04f, +1.869710954e-04f, -9.457910857e-04f, -1.412589230e-03f, +1.714163939e-04f, +2.761520825e-03f, +2.921959254e-03f, -1.580378250e-03f, -8.229084209e-03f, -1.100252535e-02f, -6.165247259e-03f, +3.376341920e-03f, +1.031385820e-02f, +9.793391686e-03f, +3.683683195e-03f, -2.006126058e-03f, -3.245278149e-03f, -1.008164877e-03f, +1.152894176e-03f, +1.253314472e-03f, +1.278743573e-04f, -5.533471255e-04f, -3.384479650e-04f, - -1.904183455e-04f, -6.378708070e-04f, +5.133304347e-04f, +1.571785345e-03f, +3.081242579e-04f, -2.190016218e-03f, -2.026010514e-03f, +1.491253623e-03f, +3.595696109e-03f, +6.694913730e-04f, -3.638437143e-03f, -3.101247748e-03f, +1.772234684e-03f, +4.157030724e-03f, +8.675299851e-04f, -3.201477334e-03f, -2.581368987e-03f, +1.140928566e-03f, +2.579118290e-03f, +5.121924999e-04f, -1.468492415e-03f, -9.830884486e-04f, +4.093331982e-04f, +3.384479650e-04f, - /* 6,11 (24) */ - +2.740215991e-03f, -3.564860680e-03f, -1.109387922e-02f, -5.937912799e-03f, +1.483486845e-02f, +2.837527656e-02f, +5.542514312e-03f, -4.542661830e-02f, -6.425324938e-02f, +1.177956577e-02f, +1.732205051e-01f, +3.228794075e-01f, +3.516616307e-01f, +2.374924265e-01f, +6.604498940e-02f, -4.852362137e-02f, -6.040976352e-02f, -1.260051284e-02f, +2.486697757e-02f, +2.262287590e-02f, +6.975432775e-04f, -1.130087608e-02f, -6.944983547e-03f, +1.152233000e-03f, - -2.740215991e-03f, +8.609781140e-03f, +1.166417494e-02f, -6.440346494e-03f, -2.561626120e-02f, -1.092326982e-02f, +2.840905905e-02f, +3.661246119e-02f, -8.744269551e-03f, -5.039062711e-02f, -2.580932622e-02f, +3.680102925e-02f, +5.157803740e-02f, -2.183173774e-03f, -4.981361480e-02f, -2.935908950e-02f, +2.429589002e-02f, +3.804316003e-02f, +3.522511744e-03f, -2.504045171e-02f, -1.567147762e-02f, +7.157224812e-03f, +1.181211412e-02f, -1.152233000e-03f, - +1.611192984e-04f, +5.527099981e-04f, +2.401989468e-04f, -8.746072696e-04f, -1.437348816e-03f, +1.583740675e-05f, +2.631307780e-03f, +3.045221976e-03f, -1.183453329e-03f, -7.862174877e-03f, -1.104338820e-02f, -6.669706987e-03f, +2.777770432e-03f, +1.008003094e-02f, +1.004182218e-02f, +4.117831997e-03f, -1.764042857e-03f, -3.302086415e-03f, -1.181776686e-03f, +1.073476637e-03f, +1.301639237e-03f, +1.987700110e-04f, -5.404595643e-04f, -3.668709269e-04f, - -1.611192984e-04f, -6.651030470e-04f, +4.166576427e-04f, +1.560171705e-03f, +4.578132493e-04f, -2.073704357e-03f, -2.160058380e-03f, +1.249152335e-03f, +3.606996957e-03f, +9.650057653e-04f, -3.465893416e-03f, -3.314542726e-03f, +1.465588051e-03f, +4.186585198e-03f, +1.173167834e-03f, -3.057037956e-03f, -2.764505845e-03f, +9.274977734e-04f, +2.612848491e-03f, +6.834441848e-04f, -1.414347823e-03f, -1.069091052e-03f, +3.459613134e-04f, +3.668709269e-04f, - /* 6,12 (24) */ - +2.901335290e-03f, -3.012150682e-03f, -1.085368028e-02f, -6.812520068e-03f, +1.339751963e-02f, +2.839111396e-02f, +8.173822091e-03f, -4.238139633e-02f, -6.543670271e-02f, +3.917390889e-03f, +1.621771169e-01f, +3.162097005e-01f, +3.544394011e-01f, +2.475724574e-01f, +7.608681158e-02f, -4.440578938e-02f, -6.217380638e-02f, -1.590259926e-02f, +2.368520088e-02f, +2.369635254e-02f, +1.999182515e-03f, -1.110210607e-02f, -7.485443112e-03f, +7.853620729e-04f, - -2.901335290e-03f, +7.944678093e-03f, +1.208083258e-02f, -4.880174789e-03f, -2.515844795e-02f, -1.299697418e-02f, +2.624900067e-02f, +3.786161352e-02f, -5.137272594e-03f, -4.942562134e-02f, -2.927521964e-02f, +3.348648653e-02f, +5.304362545e-02f, +2.003411424e-03f, -4.864044697e-02f, -3.241612746e-02f, +2.153138417e-02f, +3.897065780e-02f, +6.135360235e-03f, -2.435700753e-02f, -1.708582544e-02f, +6.088133760e-03f, +1.215807543e-02f, -7.853620729e-04f, - +1.323765352e-04f, +5.410824947e-04f, +2.897070603e-04f, -8.013718372e-04f, -1.453370552e-03f, -1.341881493e-04f, +2.492223559e-03f, +3.148608650e-03f, -7.975758828e-04f, -7.480946210e-03f, -1.105228015e-02f, -7.152546825e-03f, +2.170049140e-03f, +9.815013127e-03f, +1.026560914e-02f, +4.552826774e-03f, -1.503081518e-03f, -3.343586276e-03f, -1.355457625e-03f, +9.850369344e-04f, +1.344437307e-03f, +2.715760351e-04f, -5.235469186e-04f, -3.943700611e-04f, - -1.323765352e-04f, -6.861465987e-04f, +3.207529261e-04f, +1.538541034e-03f, +6.005694260e-04f, -1.946768151e-03f, -2.278106348e-03f, +1.002794943e-03f, +3.595834350e-03f, +1.252174097e-03f, -3.272877333e-03f, -3.506978773e-03f, +1.149653509e-03f, +4.190376164e-03f, +1.473604520e-03f, -2.892078306e-03f, -2.932672115e-03f, +7.045798734e-04f, +2.630415027e-03f, +8.544961206e-04f, -1.348998650e-03f, -1.150679967e-03f, +2.772173487e-04f, +3.943700611e-04f, - /* 6,13 (24) */ - +3.033711825e-03f, -2.471068187e-03f, -1.056397322e-02f, -7.613891905e-03f, +1.194414908e-02f, +2.825692581e-02f, +1.066604565e-02f, -3.923278767e-02f, -6.623427859e-02f, -3.563555321e-03f, +1.511248368e-01f, +3.090571537e-01f, +3.566094503e-01f, +2.573874705e-01f, +8.635242072e-02f, -3.985296260e-02f, -6.367688790e-02f, -1.924618554e-02f, +2.232974326e-02f, +2.468138947e-02f, +3.343619821e-03f, -1.083053003e-02f, -8.008990030e-03f, +3.909920118e-04f, - -3.033711825e-03f, +7.258531494e-03f, +1.240158551e-02f, -3.341633754e-03f, -2.455787852e-02f, -1.494374233e-02f, +2.397089433e-02f, +3.886440847e-02f, -1.541438244e-03f, -4.817344725e-02f, -3.254809697e-02f, +2.997950775e-02f, +5.419327896e-02f, +6.193787588e-03f, -4.716684245e-02f, -3.530820576e-02f, +1.859871206e-02f, +3.967523768e-02f, +8.765775262e-03f, -2.350251141e-02f, -1.843482409e-02f, +4.937453793e-03f, +1.243529278e-02f, -3.909920118e-04f, - +1.043627762e-04f, +5.266725668e-04f, +3.353506814e-04f, -7.265810680e-04f, -1.460880057e-03f, -2.780588239e-04f, +2.345279652e-03f, +3.232332149e-03f, -4.239514835e-04f, -7.087057190e-03f, -1.102958099e-02f, -7.612284351e-03f, +1.555171915e-03f, +9.519412653e-03f, +1.046354572e-02f, +4.987024967e-03f, -1.223754983e-03f, -3.369013164e-03f, -1.528276824e-03f, +8.877404424e-04f, +1.381248634e-03f, +3.459278189e-04f, -5.025392707e-04f, -4.207090484e-04f, - -1.043627762e-04f, -7.010865730e-04f, +2.262870104e-04f, +1.507340486e-03f, +7.356037323e-04f, -1.810270836e-03f, -2.379665972e-03f, +7.538279918e-04f, +3.562525570e-03f, +1.529235425e-03f, -3.060716126e-03f, -3.677380173e-03f, +8.264297989e-04f, +4.168287358e-03f, +1.766885327e-03f, -2.707464954e-03f, -3.084585875e-03f, +4.734884070e-04f, +2.631382834e-03f, +1.024175495e-03f, -1.272589899e-03f, -1.227110830e-03f, +2.034277110e-04f, +4.207090484e-04f, - /* 6,14 (24) */ - +3.138074601e-03f, -1.944395621e-03f, -1.022862254e-02f, -8.340472973e-03f, +1.048326902e-02f, +2.797886699e-02f, +1.301132530e-02f, -3.600045553e-02f, -6.665823007e-02f, -1.065061251e-02f, +1.400952558e-01f, +3.014448694e-01f, +3.581646222e-01f, +2.669068832e-01f, +9.681596644e-02f, -3.486593764e-02f, -6.490064288e-02f, -2.261519870e-02f, +2.080146643e-02f, +2.556912991e-02f, +4.724868456e-03f, -1.048460221e-02f, -8.511529301e-03f, -2.971703658e-05f, - -3.138074601e-03f, +6.557444921e-03f, +1.262787252e-02f, -1.834293269e-03f, -2.382227479e-02f, -1.675401316e-02f, +2.159122835e-02f, +3.961823646e-02f, +2.021087326e-03f, -4.664421182e-02f, -3.560881310e-02f, +2.630212758e-02f, +5.501970876e-02f, +1.036207495e-02f, -4.539995712e-02f, -3.801567072e-02f, +1.551412618e-02f, +4.014872608e-02f, +1.139715810e-02f, -2.247833591e-02f, -1.970741399e-02f, +3.710342963e-03f, +1.263872049e-02f, +2.971703658e-05f, - +7.723833868e-05f, +5.096968493e-04f, +3.770139812e-04f, -6.507226728e-04f, -1.460142407e-03f, -4.152250918e-04f, +2.191494642e-03f, +3.296687441e-03f, -6.370880484e-05f, -6.682190728e-03f, -1.097578795e-02f, -8.047531031e-03f, +9.351621227e-04f, +9.193958608e-03f, +1.063451134e-02f, +5.418756674e-03f, -9.266692994e-04f, -3.377656505e-03f, -1.699277300e-03f, +7.818074808e-04f, +1.411631754e-03f, +4.214375482e-04f, -4.773904234e-04f, -4.456494725e-04f, - -7.723833868e-05f, -7.100536365e-04f, +1.338987788e-04f, +1.467073881e-03f, +8.621996611e-04f, -1.665319635e-03f, -2.464367746e-03f, +5.038930094e-04f, +3.507530360e-03f, +1.794508537e-03f, -2.830855480e-03f, -3.824717377e-03f, +4.979644176e-04f, +4.120371452e-03f, +2.051090559e-03f, -2.504202414e-03f, -3.219058461e-03f, +2.356121632e-04f, +2.615423134e-03f, +1.191293312e-03f, -1.185350537e-03f, -1.297655864e-03f, +1.249700912e-04f, +4.456494725e-04f, - /* 6,15 (24) */ - +3.215312940e-03f, -1.434698771e-03f, -9.851608555e-03f, -8.991195646e-03f, +9.023126614e-03f, +2.756364190e-02f, +1.520281994e-02f, -3.270376808e-02f, -6.672193888e-02f, -1.733280324e-02f, +1.291194678e-01f, +2.933973383e-01f, +3.590997843e-01f, +2.761008418e-01f, +1.074504778e-01f, -2.944718096e-02f, -6.582731218e-02f, -2.599285520e-02f, +1.910218913e-02f, +2.635093739e-02f, +6.136500210e-03f, -1.006316467e-02f, -8.988919724e-03f, -4.753665091e-04f, - -3.215312940e-03f, +5.847391285e-03f, +1.276177130e-02f, -3.672193874e-04f, -2.296007513e-02f, -1.841933280e-02f, +1.912686061e-02f, +4.012212947e-02f, +5.528617686e-03f, -4.484970329e-02f, -3.843966858e-02f, +2.247741020e-02f, +5.551767318e-02f, +1.448244640e-02f, -4.334886656e-02f, -4.051987313e-02f, +1.229506772e-02f, +4.038433825e-02f, +1.401258123e-02f, -2.128704260e-02f, -2.089276453e-02f, +2.412687098e-03f, +1.276369058e-02f, +4.753665091e-04f, - +5.115049594e-05f, +4.903798843e-04f, +4.146097723e-04f, -5.742732337e-04f, -1.451459445e-03f, -5.451907148e-04f, +2.031889028e-03f, +3.342048428e-03f, +2.821040306e-04f, -6.268046134e-03f, -1.089151264e-02f, -8.456997594e-03f, +3.120642952e-04f, +8.839498946e-03f, +1.077747741e-02f, +5.846331590e-03f, -6.125226686e-04f, -3.368864452e-03f, -1.867480161e-03f, +6.675137897e-04f, +1.435166959e-03f, +4.976957856e-04f, -4.480790583e-04f, -4.689523778e-04f, - -5.115049594e-05f, -7.132215359e-04f, +4.419126328e-05f, +1.418296556e-03f, +9.797168079e-04f, -1.513057151e-03f, -2.531961778e-03f, +2.546153717e-04f, +3.431446366e-03f, +2.046402663e-03f, -2.584849287e-03f, -3.948113578e-03f, +1.663399353e-04f, +4.046850226e-03f, +2.324348697e-03f, -2.283427491e-03f, -3.335003672e-03f, -7.593408284e-06f, +2.582317601e-03f, +1.354652652e-03f, -1.087593793e-03f, -1.361609930e-03f, +4.227197977e-05f, +4.689523778e-04f, - /* 7, 0 (24) */ - +0.000000000e+00f, +3.368963781e-03f, -8.514391712e-03f, -1.440869115e-02f, +7.086061236e-03f, +3.382960780e-02f, +1.101502518e-02f, -5.747977080e-02f, -6.640415000e-02f, +7.720343731e-02f, +3.034696374e-01f, +4.150958617e-01f, +3.034696374e-01f, +7.720343731e-02f, -6.640415000e-02f, -5.747977080e-02f, +1.101502518e-02f, +3.382960780e-02f, +7.086061236e-03f, -1.440869115e-02f, -8.514391712e-03f, +3.368963781e-03f, +4.189850862e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.368963781e-03f, +1.274692210e-02f, +3.334236296e-03f, -2.139023534e-02f, -1.414272265e-02f, +2.554679251e-02f, +2.914249065e-02f, -2.111397115e-02f, -4.242771499e-02f, +8.213018281e-03f, +4.774542267e-02f, +8.213018281e-03f, -4.242771499e-02f, -2.111397115e-02f, +2.914249065e-02f, +2.554679251e-02f, -1.414272265e-02f, -2.139023534e-02f, +3.334236296e-03f, +1.274692210e-02f, +9.628265126e-04f, -4.189850862e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.058070785e-04f, +8.639141446e-04f, -3.475731664e-04f, -2.022166441e-03f, -7.148374391e-04f, +3.376457860e-03f, +3.947526340e-03f, -3.562904099e-03f, -1.310182610e-02f, -1.288634917e-02f, -4.784042305e-04f, +1.240511117e-02f, +1.347636193e-02f, +4.221643471e-03f, -3.713550397e-03f, -3.596663800e-03f, +5.000727499e-04f, +2.058247866e-03f, +4.717426375e-04f, -8.440233219e-04f, -4.588010355e-04f, +2.228416515e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.058070785e-04f, -3.696152939e-04f, +1.419218793e-03f, +1.079723663e-03f, -1.882894487e-03f, -2.189743774e-03f, +1.799639412e-03f, +3.351308669e-03f, -1.035746467e-03f, -4.077984126e-03f, -1.840353029e-04f, +4.028584887e-03f, +1.372033154e-03f, -3.222411416e-03f, -2.054760965e-03f, +2.028487580e-03f, +2.041307870e-03f, -9.360930950e-04f, -1.499007371e-03f, +2.735279885e-04f, +8.003349149e-04f, -2.228416515e-04f, +0.000000000e+00f, - /* 7, 1 (24) */ - +0.000000000e+00f, +3.774770859e-03f, -7.650477567e-03f, -1.475626432e-02f, +5.063894795e-03f, +3.311477036e-02f, +1.439148304e-02f, -5.353224446e-02f, -6.996705410e-02f, +6.410161121e-02f, +2.905832882e-01f, +4.146174575e-01f, +3.158747485e-01f, +9.067979924e-02f, -6.218250653e-02f, -6.119332119e-02f, +7.418361383e-03f, +3.432968055e-02f, +9.144309102e-03f, -1.393694851e-02f, -9.358415034e-03f, +2.910162745e-03f, +4.412692514e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.774770859e-03f, +1.237730680e-02f, +4.753455089e-03f, -2.031051168e-02f, -1.602561714e-02f, +2.335704874e-02f, +3.094213007e-02f, -1.776266248e-02f, -4.346346146e-02f, +4.135034155e-03f, +4.756138736e-02f, +1.224160317e-02f, -4.105568184e-02f, -2.433638256e-02f, +2.708772969e-02f, +2.757528009e-02f, -1.210141478e-02f, -2.232632844e-02f, +1.835228925e-03f, +1.302045009e-02f, +1.763161428e-03f, -4.412692514e-03f, +0.000000000e+00f, - +0.000000000e+00f, +3.524203322e-04f, +8.762183159e-04f, -2.262812169e-04f, -1.973100792e-03f, -9.161458347e-04f, +3.142044342e-03f, +4.145727760e-03f, -2.914554260e-03f, -1.268560189e-02f, -1.331433006e-02f, -1.433126540e-03f, +1.187224841e-02f, +1.380664343e-02f, +4.887682191e-03f, -3.443821555e-03f, -3.800580450e-03f, +2.728731042e-04f, +2.080544726e-03f, +5.979427464e-04f, -8.163512084e-04f, -5.109127599e-04f, +2.003567872e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.524203322e-04f, -4.585070492e-04f, +1.329942076e-03f, +1.210431863e-03f, -1.712690410e-03f, -2.330445955e-03f, +1.533741589e-03f, +3.452235550e-03f, -6.935637465e-04f, -4.094929294e-03f, -5.506092781e-04f, +3.947028441e-03f, +1.699630006e-03f, -3.066326715e-03f, -2.296833118e-03f, +1.847679418e-03f, +2.186310520e-03f, -7.804671935e-04f, -1.568275856e-03f, +1.709022891e-04f, +8.295522149e-04f, -2.003567872e-04f, +0.000000000e+00f, - /* 7, 2 (24) */ - +0.000000000e+00f, +4.127191192e-03f, -6.774259251e-03f, -1.498254553e-02f, +3.090794002e-03f, +3.219862453e-02f, +1.753352739e-02f, -4.938651670e-02f, -7.288160836e-02f, +5.141600931e-02f, +2.772689581e-01f, +4.131843309e-01f, +3.277469969e-01f, +1.044864427e-01f, -5.729482433e-02f, -6.463714275e-02f, +3.617780933e-03f, +3.460255366e-02f, +1.122485383e-02f, -1.333900577e-02f, -1.017476624e-02f, +2.399249985e-03f, +4.613049301e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.127191192e-03f, +1.191879975e-02f, +6.083397165e-03f, -1.910007982e-02f, -1.773830755e-02f, +2.102660278e-02f, +3.247587166e-02f, -1.431042693e-02f, -4.415702520e-02f, +4.010486123e-05f, +4.701077808e-02f, +1.618863161e-02f, -3.935605183e-02f, -2.740270928e-02f, +2.479089657e-02f, +2.942295951e-02f, -9.915104261e-03f, -2.310679563e-02f, +2.669530690e-04f, +1.319135237e-02f, +2.592713642e-03f, -4.613049301e-03f, +0.000000000e+00f, - +0.000000000e+00f, +2.991115597e-04f, +8.811830113e-04f, -1.086587356e-04f, -1.911915938e-03f, -1.103106010e-03f, +2.895524757e-03f, +4.308340858e-03f, -2.279560013e-03f, -1.223043104e-02f, -1.368770001e-02f, -2.381601714e-03f, +1.128966452e-02f, +1.409029711e-02f, +5.557821765e-03f, -3.138574086e-03f, -3.986160141e-03f, +3.438631993e-05f, +2.088329659e-03f, +7.252763246e-04f, -7.807594176e-04f, -5.616376918e-04f, +1.744140062e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.991115597e-04f, -5.396365250e-04f, +1.232266753e-03f, +1.327427733e-03f, -1.532385244e-03f, -2.449784125e-03f, +1.259402165e-03f, +3.524651173e-03f, -3.483101673e-04f, -4.079394877e-03f, -9.127061273e-04f, +3.833881268e-03f, +2.015798799e-03f, -2.884074954e-03f, -2.523664948e-03f, +1.648507487e-03f, +2.316367984e-03f, -6.139045822e-04f, -1.626061328e-03f, +6.248191900e-05f, +8.518685200e-04f, -1.744140062e-04f, +0.000000000e+00f, - /* 7, 3 (24) */ - +0.000000000e+00f, +4.426302751e-03f, -5.893076240e-03f, -1.509120427e-02f, +1.178878065e-03f, +3.109551852e-02f, +2.042905214e-02f, -4.507817584e-02f, -7.516116837e-02f, +3.918557827e-02f, +2.635812581e-01f, +4.108027292e-01f, +3.390366615e-01f, +1.185767398e-01f, -5.173700257e-02f, -6.777571684e-02f, -3.683792076e-04f, +3.463693998e-02f, +1.331318349e-02f, -1.261372944e-02f, -1.095552566e-02f, +1.837612294e-03f, +4.787463307e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.426302751e-03f, +1.137916323e-02f, +7.315663918e-03f, -1.777265208e-02f, -1.927069279e-02f, +1.857681866e-02f, +3.373527382e-02f, -1.078577575e-02f, -4.450533537e-02f, -4.039290015e-03f, +4.609807196e-02f, +2.002251288e-02f, -3.734025303e-02f, -3.028678423e-02f, +2.226723162e-02f, +3.107146700e-02f, -7.598736276e-03f, -2.372070021e-02f, -1.359108259e-03f, +1.325383429e-02f, +3.444582163e-03f, -4.787463307e-03f, +0.000000000e+00f, - +0.000000000e+00f, +2.463295698e-04f, +8.791039320e-04f, +4.561343438e-06f, -1.839533055e-03f, -1.274957402e-03f, +2.639006402e-03f, +4.435753633e-03f, -1.660748468e-03f, -1.173921366e-02f, -1.400538929e-02f, -3.319702649e-03f, +1.065952560e-02f, +1.432515748e-02f, +6.228772114e-03f, -2.798258467e-03f, -4.151403594e-03f, -2.141172104e-04f, +2.080956301e-03f, +8.528011259e-04f, -7.371691971e-04f, -6.104599864e-04f, +1.450641040e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.463295698e-04f, -6.125302830e-04f, +1.127328211e-03f, +1.430062494e-03f, -1.343721795e-03f, -2.547144415e-03f, +9.789963650e-04f, +3.568259095e-03f, -2.817935595e-06f, -4.031626058e-03f, -1.267383541e-03f, +3.689975385e-03f, +2.317880747e-03f, -2.676907281e-03f, -2.733167914e-03f, +1.432338467e-03f, +2.430046906e-03f, -4.375886207e-04f, -1.671480945e-03f, -5.090767384e-05f, +8.667547216e-04f, -1.450641040e-04f, +0.000000000e+00f, - /* 7, 4 (24) */ - +0.000000000e+00f, +4.672632321e-03f, -5.013972308e-03f, -1.508664293e-02f, -6.606549905e-04f, +2.982056112e-02f, +2.306805854e-02f, -4.064242221e-02f, -7.682191684e-02f, +2.744636461e-02f, +2.495758688e-01f, +4.074830266e-01f, +3.496961871e-01f, +1.329018973e-01f, -4.550823045e-02f, -7.057397530e-02f, -4.519782801e-03f, +3.442282277e-02f, +1.539413979e-02f, -1.176092832e-02f, -1.169269486e-02f, +1.227152307e-03f, +4.932527411e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.672632321e-03f, +1.076663295e-02f, +8.442992129e-03f, -1.634258959e-02f, -2.061441459e-02f, +1.602967424e-02f, +3.471427019e-02f, -7.217516658e-03f, -4.450815331e-02f, -8.070916073e-03f, +4.483068842e-02f, +2.371248826e-02f, -3.502237229e-02f, -3.296369151e-02f, +1.953406371e-02f, +3.250380546e-02f, -5.168689370e-03f, -2.415828883e-02f, -3.030589203e-03f, +1.320292662e-02f, +4.311336884e-03f, -4.932527411e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.944982509e-04f, +8.703210413e-04f, +1.127085856e-04f, -1.756920822e-03f, -1.431071805e-03f, +2.374588642e-03f, +4.528548702e-03f, -1.060794041e-03f, -1.121499001e-02f, -1.426661613e-02f, -4.243358483e-03f, +9.984249714e-03f, +1.450928162e-02f, +6.897169111e-03f, -2.423543627e-03f, -4.294374310e-03f, -4.712494000e-04f, +2.057866950e-03f, +9.795355672e-04f, -6.855644358e-04f, -6.568565895e-04f, +1.123930488e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.944982509e-04f, -6.768100371e-04f, +1.016295809e-03f, +1.517831245e-03f, -1.148479505e-03f, -2.622111362e-03f, +6.949188872e-04f, +3.583007554e-03f, +3.400979684e-04f, -3.952135722e-03f, -1.611762473e-03f, +3.516401923e-03f, +2.603319785e-03f, -2.446296790e-03f, -2.923375346e-03f, +1.200708124e-03f, +2.526029878e-03f, -2.528192328e-04f, -1.703742488e-03f, -1.683651158e-04f, +8.737393824e-04f, -1.123930488e-04f, +0.000000000e+00f, - /* 7, 5 (24) */ - +0.000000000e+00f, +4.867130572e-03f, -4.143651267e-03f, -1.497393434e-02f, -2.417575813e-03f, +2.838948931e-02f, +2.544264719e-02f, -3.611387350e-02f, -7.788271088e-02f, +1.623137460e-02f, +2.353092527e-01f, +4.032396681e-01f, +3.596804368e-01f, +1.474111789e-01f, -3.861106134e-02f, -7.299751893e-02f, -8.814157112e-03f, +3.395157337e-02f, +1.745200674e-02f, -1.078139275e-02f, -1.237825929e-02f, +5.702957177e-04f, +5.044920460e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.867130572e-03f, +1.008982291e-02f, +9.459287938e-03f, -1.482475834e-02f, -2.176289409e-02f, +1.340756288e-02f, +3.540918907e-02f, -3.634509104e-03f, -4.416805534e-02f, -1.202305180e-02f, +4.321892594e-02f, +2.722889019e-02f, -3.241905250e-02f, -3.540998830e-02f, +1.661068836e-02f, +3.370451359e-02f, -2.642659492e-03f, -2.441110807e-02f, -4.734331692e-03f, +1.303456150e-02f, +5.185076267e-03f, -5.044920460e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.440139274e-04f, +8.552140913e-04f, +2.151779427e-04f, -1.665086676e-03f, -1.570953412e-03f, +2.104349583e-03f, +4.587495045e-03f, -4.822058615e-04f, -1.066092167e-02f, -1.447088893e-02f, -5.148576604e-03f, +9.266495007e-03f, +1.464096249e-02f, +7.559592836e-03f, -2.015317859e-03f, -4.413212876e-03f, -7.355103107e-04f, +2.018599824e-03f, +1.104464972e-03f, -6.259942598e-04f, -7.003015301e-04f, +7.652270795e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.440139274e-04f, -7.321935201e-04f, +9.003609504e-04f, +1.590374270e-03f, -9.484578618e-04f, -2.674468361e-03f, +4.095628935e-04f, +3.569087553e-03f, +6.776637482e-04f, -3.841699129e-03f, -1.943051662e-03f, +3.314502437e-03f, +2.869685084e-03f, -2.193927679e-03f, -3.092461066e-03f, +9.553102464e-04f, +2.603129478e-03f, -6.100346450e-05f, -1.722154264e-03f, -2.889198270e-04f, +8.724155707e-04f, -7.652270795e-05f, +0.000000000e+00f, - /* 7, 6 (24) */ - +0.000000000e+00f, +5.011144499e-03f, -3.288437175e-03f, -1.475875640e-02f, -4.082662488e-03f, +2.681853590e-02f, +2.754699677e-02f, -3.152637846e-02f, -7.836491674e-02f, +5.570452929e-03f, +2.208383638e-01f, +3.980910915e-01f, +3.689469318e-01f, +1.620521414e-01f, -3.105146851e-02f, -7.501283679e-02f, -1.322736999e-02f, +3.321606306e-02f, +1.947060656e-02f, -9.676927777e-03f, -1.300425355e-02f, -1.300058124e-04f, +5.121443168e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.011144499e-03f, +9.357629389e-03f, +1.035964889e-02f, -1.323438407e-02f, -2.271135195e-02f, +1.073309452e-02f, +3.581875197e-02f, -6.542155103e-05f, -4.349039159e-02f, -1.586475092e-02f, +4.127587428e-02f, +3.054339262e-02f, -2.954936742e-02f, -3.760391598e-02f, +1.351822730e-02f, +3.465982383e-02f, -3.953001425e-05f, -2.447211153e-02f, -6.456485956e-03f, +1.274564168e-02f, +6.057491837e-03f, -5.121443168e-03f, +0.000000000e+00f, - +0.000000000e+00f, +9.524305139e-05f, +8.341979830e-04f, +3.114320377e-04f, -1.565068062e-03f, -1.694237940e-03f, +1.830333230e-03f, +4.613538733e-03f, +7.268361020e-05f, -1.008027220e-02f, -1.461800666e-02f, -6.031464187e-03f, +8.509146265e-03f, +1.471874106e-02f, +8.212586420e-03f, -1.574688345e-03f, -4.506151104e-03f, -1.005294942e-03f, +1.962795819e-03f, +1.226548282e-03f, -5.585751831e-04f, -7.402703983e-04f, +3.761127040e-05f, +0.000000000e+00f, - +0.000000000e+00f, -9.524305139e-05f, -7.784943694e-04f, +7.807252416e-04f, +1.647476959e-03f, -7.454599207e-04f, -2.704196331e-03f, +1.252992712e-04f, +3.526928831e-03f, +1.007170238e-03f, -3.701346318e-03f, -2.258571363e-03f, +3.085858002e-03f, +3.114692572e-03f, -1.921682455e-03f, -3.238756954e-03f, +6.979839933e-04f, +2.660301357e-03f, +1.363551587e-04f, -1.726134270e-03f, -4.115396161e-04f, +8.624472161e-04f, -3.761127040e-05f, +0.000000000e+00f, - /* 7, 7 (24) */ - +0.000000000e+00f, +5.106387551e-03f, -2.454239192e-03f, -1.444732436e-02f, -5.647730551e-03f, +2.512429796e-02f, +2.937733000e-02f, -2.691283973e-02f, -7.829223313e-02f, -4.509819274e-03f, +2.062203571e-01f, +3.920596273e-01f, +3.774560781e-01f, +1.767708824e-01f, -2.283888209e-02f, -7.658752513e-02f, -1.773352109e-02f, +3.221076811e-02f, +2.143340238e-02f, -8.450379495e-03f, -1.356282874e-02f, -8.702762106e-04f, +5.159054438e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.106387551e-03f, +8.579135019e-03f, +1.114037413e-02f, -1.158690712e-02f, -2.345681187e-02f, +8.028898189e-03f, +3.594405124e-02f, +3.461507280e-03f, -4.248322135e-02f, -1.956609724e-02f, +3.901730292e-02f, +3.362925062e-02f, -2.643467484e-02f, -3.952559844e-02f, +1.027947034e-02f, +3.535780783e-02f, +2.620771343e-03f, -2.433575637e-02f, -8.182620225e-03f, +1.233410206e-02f, +6.919939053e-03f, -5.159054438e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.852023803e-05f, +8.077180029e-04f, +4.010028457e-04f, -1.457923740e-03f, -1.800690851e-03f, +1.554537177e-03f, +4.607792738e-03f, +6.017286961e-04f, -9.476387416e-03f, -1.470805772e-02f, -6.888249110e-03f, +7.715300143e-03f, +1.474141695e-02f, +8.852675398e-03f, -1.102979298e-03f, -4.571525895e-03f, -1.278900936e-03f, +1.890204727e-03f, +1.344725204e-03f, -4.834927791e-04f, -7.762449788e-04f, -4.146649272e-06f, +0.000000000e+00f, - +0.000000000e+00f, -4.852023803e-05f, -8.156210585e-04f, +6.585888380e-04f, +1.689068377e-03f, -5.412761007e-04f, -2.711470621e-03f, -1.555436517e-04f, +3.457193766e-03f, +1.325995630e-03f, -3.532352321e-03f, -2.555776095e-03f, +2.832276198e-03f, +3.336225280e-03f, -1.631627287e-03f, -3.360769299e-03f, +4.306997585e-04f, +2.696656225e-03f, +3.376683985e-04f, -1.715218512e-03f, -5.351390935e-04f, +8.435749075e-04f, +4.146649272e-06f, +0.000000000e+00f, - /* 7, 8 (24) */ - +0.000000000e+00f, +5.154907789e-03f, -1.646521189e-03f, -1.404632151e-02f, -7.105654291e-03f, +2.332360711e-02f, +3.093186718e-02f, -2.230504699e-02f, -7.769050443e-02f, -1.398620669e-02f, +1.915122994e-01f, +3.851713782e-01f, +3.851713782e-01f, +1.915122994e-01f, -1.398620669e-02f, -7.769050443e-02f, -2.230504699e-02f, +3.093186718e-02f, +2.332360711e-02f, -7.105654291e-03f, -1.404632151e-02f, -1.646521189e-03f, +5.154907789e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.154907789e-03f, +7.763513961e-03f, +1.179896297e-02f, -9.897838738e-03f, -2.399808797e-02f, +5.317427568e-03f, +3.578850759e-02f, +6.918701045e-03f, -4.115722572e-02f, -2.309844956e-02f, +3.646152682e-02f, +3.646152682e-02f, -2.309844956e-02f, -4.115722572e-02f, +6.918701045e-03f, +3.578850759e-02f, +5.317427568e-03f, -2.399808797e-02f, -9.897838738e-03f, +1.179896297e-02f, +7.763513961e-03f, -5.154907789e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.146649272e-06f, +7.762449788e-04f, +4.834927791e-04f, -1.344725204e-03f, -1.890204727e-03f, +1.278900936e-03f, +4.571525895e-03f, +1.102979298e-03f, -8.852675398e-03f, -1.474141695e-02f, -7.715300143e-03f, +6.888249110e-03f, +1.470805772e-02f, +9.476387416e-03f, -6.017286961e-04f, -4.607792738e-03f, -1.554537177e-03f, +1.800690851e-03f, +1.457923740e-03f, -4.010028457e-04f, -8.077180029e-04f, -4.852023803e-05f, +0.000000000e+00f, - +0.000000000e+00f, -4.146649272e-06f, -8.435749075e-04f, +5.351390935e-04f, +1.715218512e-03f, -3.376683985e-04f, -2.696656225e-03f, -4.306997585e-04f, +3.360769299e-03f, +1.631627287e-03f, -3.336225280e-03f, -2.832276198e-03f, +2.555776095e-03f, +3.532352321e-03f, -1.325995630e-03f, -3.457193766e-03f, +1.555436517e-04f, +2.711470621e-03f, +5.412761007e-04f, -1.689068377e-03f, -6.585888380e-04f, +8.156210585e-04f, +4.852023803e-05f, +0.000000000e+00f, - /* 7, 9 (24) */ - +0.000000000e+00f, +5.159054438e-03f, -8.702762106e-04f, -1.356282874e-02f, -8.450379495e-03f, +2.143340238e-02f, +3.221076811e-02f, -1.773352109e-02f, -7.658752513e-02f, -2.283888209e-02f, +1.767708824e-01f, +3.774560781e-01f, +3.920596273e-01f, +2.062203571e-01f, -4.509819274e-03f, -7.829223313e-02f, -2.691283973e-02f, +2.937733000e-02f, +2.512429796e-02f, -5.647730551e-03f, -1.444732436e-02f, -2.454239192e-03f, +5.106387551e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.159054438e-03f, +6.919939053e-03f, +1.233410206e-02f, -8.182620225e-03f, -2.433575637e-02f, +2.620771343e-03f, +3.535780783e-02f, +1.027947034e-02f, -3.952559844e-02f, -2.643467484e-02f, +3.362925062e-02f, +3.901730292e-02f, -1.956609724e-02f, -4.248322135e-02f, +3.461507280e-03f, +3.594405124e-02f, +8.028898189e-03f, -2.345681187e-02f, -1.158690712e-02f, +1.114037413e-02f, +8.579135019e-03f, -5.106387551e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.761127040e-05f, +7.402703983e-04f, +5.585751831e-04f, -1.226548282e-03f, -1.962795819e-03f, +1.005294942e-03f, +4.506151104e-03f, +1.574688345e-03f, -8.212586420e-03f, -1.471874106e-02f, -8.509146265e-03f, +6.031464187e-03f, +1.461800666e-02f, +1.008027220e-02f, -7.268361020e-05f, -4.613538733e-03f, -1.830333230e-03f, +1.694237940e-03f, +1.565068062e-03f, -3.114320377e-04f, -8.341979830e-04f, -9.524305139e-05f, +0.000000000e+00f, - +0.000000000e+00f, +3.761127040e-05f, -8.624472161e-04f, +4.115396161e-04f, +1.726134270e-03f, -1.363551587e-04f, -2.660301357e-03f, -6.979839933e-04f, +3.238756954e-03f, +1.921682455e-03f, -3.114692572e-03f, -3.085858002e-03f, +2.258571363e-03f, +3.701346318e-03f, -1.007170238e-03f, -3.526928831e-03f, -1.252992712e-04f, +2.704196331e-03f, +7.454599207e-04f, -1.647476959e-03f, -7.807252416e-04f, +7.784943694e-04f, +9.524305139e-05f, +0.000000000e+00f, - /* 7,10 (24) */ - +0.000000000e+00f, +5.121443168e-03f, -1.300058124e-04f, -1.300425355e-02f, -9.676927777e-03f, +1.947060656e-02f, +3.321606306e-02f, -1.322736999e-02f, -7.501283679e-02f, -3.105146851e-02f, +1.620521414e-01f, +3.689469318e-01f, +3.980910915e-01f, +2.208383638e-01f, +5.570452929e-03f, -7.836491674e-02f, -3.152637846e-02f, +2.754699677e-02f, +2.681853590e-02f, -4.082662488e-03f, -1.475875640e-02f, -3.288437175e-03f, +5.011144499e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.121443168e-03f, +6.057491837e-03f, +1.274564168e-02f, -6.456485956e-03f, -2.447211153e-02f, -3.953001425e-05f, +3.465982383e-02f, +1.351822730e-02f, -3.760391598e-02f, -2.954936742e-02f, +3.054339262e-02f, +4.127587428e-02f, -1.586475092e-02f, -4.349039159e-02f, -6.542155103e-05f, +3.581875197e-02f, +1.073309452e-02f, -2.271135195e-02f, -1.323438407e-02f, +1.035964889e-02f, +9.357629389e-03f, -5.011144499e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.652270795e-05f, +7.003015301e-04f, +6.259942598e-04f, -1.104464972e-03f, -2.018599824e-03f, +7.355103107e-04f, +4.413212876e-03f, +2.015317859e-03f, -7.559592836e-03f, -1.464096249e-02f, -9.266495007e-03f, +5.148576604e-03f, +1.447088893e-02f, +1.066092167e-02f, +4.822058615e-04f, -4.587495045e-03f, -2.104349583e-03f, +1.570953412e-03f, +1.665086676e-03f, -2.151779427e-04f, -8.552140913e-04f, -1.440139274e-04f, +0.000000000e+00f, - +0.000000000e+00f, +7.652270795e-05f, -8.724155707e-04f, +2.889198270e-04f, +1.722154264e-03f, +6.100346450e-05f, -2.603129478e-03f, -9.553102464e-04f, +3.092461066e-03f, +2.193927679e-03f, -2.869685084e-03f, -3.314502437e-03f, +1.943051662e-03f, +3.841699129e-03f, -6.776637482e-04f, -3.569087553e-03f, -4.095628935e-04f, +2.674468361e-03f, +9.484578618e-04f, -1.590374270e-03f, -9.003609504e-04f, +7.321935201e-04f, +1.440139274e-04f, +0.000000000e+00f, - /* 7,11 (24) */ - +0.000000000e+00f, +5.044920460e-03f, +5.702957177e-04f, -1.237825929e-02f, -1.078139275e-02f, +1.745200674e-02f, +3.395157337e-02f, -8.814157112e-03f, -7.299751893e-02f, -3.861106134e-02f, +1.474111789e-01f, +3.596804368e-01f, +4.032396681e-01f, +2.353092527e-01f, +1.623137460e-02f, -7.788271088e-02f, -3.611387350e-02f, +2.544264719e-02f, +2.838948931e-02f, -2.417575813e-03f, -1.497393434e-02f, -4.143651267e-03f, +4.867130572e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.044920460e-03f, +5.185076267e-03f, +1.303456150e-02f, -4.734331692e-03f, -2.441110807e-02f, -2.642659492e-03f, +3.370451359e-02f, +1.661068836e-02f, -3.540998830e-02f, -3.241905250e-02f, +2.722889019e-02f, +4.321892594e-02f, -1.202305180e-02f, -4.416805534e-02f, -3.634509104e-03f, +3.540918907e-02f, +1.340756288e-02f, -2.176289409e-02f, -1.482475834e-02f, +9.459287938e-03f, +1.008982291e-02f, -4.867130572e-03f, +0.000000000e+00f, - +0.000000000e+00f, -1.123930488e-04f, +6.568565895e-04f, +6.855644358e-04f, -9.795355672e-04f, -2.057866950e-03f, +4.712494000e-04f, +4.294374310e-03f, +2.423543627e-03f, -6.897169111e-03f, -1.450928162e-02f, -9.984249714e-03f, +4.243358483e-03f, +1.426661613e-02f, +1.121499001e-02f, +1.060794041e-03f, -4.528548702e-03f, -2.374588642e-03f, +1.431071805e-03f, +1.756920822e-03f, -1.127085856e-04f, -8.703210413e-04f, -1.944982509e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.123930488e-04f, -8.737393824e-04f, +1.683651158e-04f, +1.703742488e-03f, +2.528192328e-04f, -2.526029878e-03f, -1.200708124e-03f, +2.923375346e-03f, +2.446296790e-03f, -2.603319785e-03f, -3.516401923e-03f, +1.611762473e-03f, +3.952135722e-03f, -3.400979684e-04f, -3.583007554e-03f, -6.949188872e-04f, +2.622111362e-03f, +1.148479505e-03f, -1.517831245e-03f, -1.016295809e-03f, +6.768100371e-04f, +1.944982509e-04f, +0.000000000e+00f, - /* 7,12 (24) */ - +0.000000000e+00f, +4.932527411e-03f, +1.227152307e-03f, -1.169269486e-02f, -1.176092832e-02f, +1.539413979e-02f, +3.442282277e-02f, -4.519782801e-03f, -7.057397530e-02f, -4.550823045e-02f, +1.329018973e-01f, +3.496961871e-01f, +4.074830266e-01f, +2.495758688e-01f, +2.744636461e-02f, -7.682191684e-02f, -4.064242221e-02f, +2.306805854e-02f, +2.982056112e-02f, -6.606549905e-04f, -1.508664293e-02f, -5.013972308e-03f, +4.672632321e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.932527411e-03f, +4.311336884e-03f, +1.320292662e-02f, -3.030589203e-03f, -2.415828883e-02f, -5.168689370e-03f, +3.250380546e-02f, +1.953406371e-02f, -3.296369151e-02f, -3.502237229e-02f, +2.371248826e-02f, +4.483068842e-02f, -8.070916073e-03f, -4.450815331e-02f, -7.217516658e-03f, +3.471427019e-02f, +1.602967424e-02f, -2.061441459e-02f, -1.634258959e-02f, +8.442992129e-03f, +1.076663295e-02f, -4.672632321e-03f, +0.000000000e+00f, - +0.000000000e+00f, -1.450641040e-04f, +6.104599864e-04f, +7.371691971e-04f, -8.528011259e-04f, -2.080956301e-03f, +2.141172104e-04f, +4.151403594e-03f, +2.798258467e-03f, -6.228772114e-03f, -1.432515748e-02f, -1.065952560e-02f, +3.319702649e-03f, +1.400538929e-02f, +1.173921366e-02f, +1.660748468e-03f, -4.435753633e-03f, -2.639006402e-03f, +1.274957402e-03f, +1.839533055e-03f, -4.561343438e-06f, -8.791039320e-04f, -2.463295698e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.450641040e-04f, -8.667547216e-04f, +5.090767384e-05f, +1.671480945e-03f, +4.375886207e-04f, -2.430046906e-03f, -1.432338467e-03f, +2.733167914e-03f, +2.676907281e-03f, -2.317880747e-03f, -3.689975385e-03f, +1.267383541e-03f, +4.031626058e-03f, +2.817935595e-06f, -3.568259095e-03f, -9.789963650e-04f, +2.547144415e-03f, +1.343721795e-03f, -1.430062494e-03f, -1.127328211e-03f, +6.125302830e-04f, +2.463295698e-04f, +0.000000000e+00f, - /* 7,13 (24) */ - +0.000000000e+00f, +4.787463307e-03f, +1.837612294e-03f, -1.095552566e-02f, -1.261372944e-02f, +1.331318349e-02f, +3.463693998e-02f, -3.683792076e-04f, -6.777571684e-02f, -5.173700257e-02f, +1.185767398e-01f, +3.390366615e-01f, +4.108027292e-01f, +2.635812581e-01f, +3.918557827e-02f, -7.516116837e-02f, -4.507817584e-02f, +2.042905214e-02f, +3.109551852e-02f, +1.178878065e-03f, -1.509120427e-02f, -5.893076240e-03f, +4.426302751e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.787463307e-03f, +3.444582163e-03f, +1.325383429e-02f, -1.359108259e-03f, -2.372070021e-02f, -7.598736276e-03f, +3.107146700e-02f, +2.226723162e-02f, -3.028678423e-02f, -3.734025303e-02f, +2.002251288e-02f, +4.609807196e-02f, -4.039290015e-03f, -4.450533537e-02f, -1.078577575e-02f, +3.373527382e-02f, +1.857681866e-02f, -1.927069279e-02f, -1.777265208e-02f, +7.315663918e-03f, +1.137916323e-02f, -4.426302751e-03f, +0.000000000e+00f, - +0.000000000e+00f, -1.744140062e-04f, +5.616376918e-04f, +7.807594176e-04f, -7.252763246e-04f, -2.088329659e-03f, -3.438631993e-05f, +3.986160141e-03f, +3.138574086e-03f, -5.557821765e-03f, -1.409029711e-02f, -1.128966452e-02f, +2.381601714e-03f, +1.368770001e-02f, +1.223043104e-02f, +2.279560013e-03f, -4.308340858e-03f, -2.895524757e-03f, +1.103106010e-03f, +1.911915938e-03f, +1.086587356e-04f, -8.811830113e-04f, -2.991115597e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.744140062e-04f, -8.518685200e-04f, -6.248191900e-05f, +1.626061328e-03f, +6.139045822e-04f, -2.316367984e-03f, -1.648507487e-03f, +2.523664948e-03f, +2.884074954e-03f, -2.015798799e-03f, -3.833881268e-03f, +9.127061273e-04f, +4.079394877e-03f, +3.483101673e-04f, -3.524651173e-03f, -1.259402165e-03f, +2.449784125e-03f, +1.532385244e-03f, -1.327427733e-03f, -1.232266753e-03f, +5.396365250e-04f, +2.991115597e-04f, +0.000000000e+00f, - /* 7,14 (24) */ - +0.000000000e+00f, +4.613049301e-03f, +2.399249985e-03f, -1.017476624e-02f, -1.333900577e-02f, +1.122485383e-02f, +3.460255366e-02f, +3.617780933e-03f, -6.463714275e-02f, -5.729482433e-02f, +1.044864427e-01f, +3.277469969e-01f, +4.131843309e-01f, +2.772689581e-01f, +5.141600931e-02f, -7.288160836e-02f, -4.938651670e-02f, +1.753352739e-02f, +3.219862453e-02f, +3.090794002e-03f, -1.498254553e-02f, -6.774259251e-03f, +4.127191192e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.613049301e-03f, +2.592713642e-03f, +1.319135237e-02f, +2.669530690e-04f, -2.310679563e-02f, -9.915104261e-03f, +2.942295951e-02f, +2.479089657e-02f, -2.740270928e-02f, -3.935605183e-02f, +1.618863161e-02f, +4.701077808e-02f, +4.010486123e-05f, -4.415702520e-02f, -1.431042693e-02f, +3.247587166e-02f, +2.102660278e-02f, -1.773830755e-02f, -1.910007982e-02f, +6.083397165e-03f, +1.191879975e-02f, -4.127191192e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.003567872e-04f, +5.109127599e-04f, +8.163512084e-04f, -5.979427464e-04f, -2.080544726e-03f, -2.728731042e-04f, +3.800580450e-03f, +3.443821555e-03f, -4.887682191e-03f, -1.380664343e-02f, -1.187224841e-02f, +1.433126540e-03f, +1.331433006e-02f, +1.268560189e-02f, +2.914554260e-03f, -4.145727760e-03f, -3.142044342e-03f, +9.161458347e-04f, +1.973100792e-03f, +2.262812169e-04f, -8.762183159e-04f, -3.524203322e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.003567872e-04f, -8.295522149e-04f, -1.709022891e-04f, +1.568275856e-03f, +7.804671935e-04f, -2.186310520e-03f, -1.847679418e-03f, +2.296833118e-03f, +3.066326715e-03f, -1.699630006e-03f, -3.947028441e-03f, +5.506092781e-04f, +4.094929294e-03f, +6.935637465e-04f, -3.452235550e-03f, -1.533741589e-03f, +2.330445955e-03f, +1.712690410e-03f, -1.210431863e-03f, -1.329942076e-03f, +4.585070492e-04f, +3.524203322e-04f, +0.000000000e+00f, - /* 7,15 (24) */ - +0.000000000e+00f, +4.412692514e-03f, +2.910162745e-03f, -9.358415034e-03f, -1.393694851e-02f, +9.144309102e-03f, +3.432968055e-02f, +7.418361383e-03f, -6.119332119e-02f, -6.218250653e-02f, +9.067979924e-02f, +3.158747485e-01f, +4.146174575e-01f, +2.905832882e-01f, +6.410161121e-02f, -6.996705410e-02f, -5.353224446e-02f, +1.439148304e-02f, +3.311477036e-02f, +5.063894795e-03f, -1.475626432e-02f, -7.650477567e-03f, +3.774770859e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.412692514e-03f, +1.763161428e-03f, +1.302045009e-02f, +1.835228925e-03f, -2.232632844e-02f, -1.210141478e-02f, +2.757528009e-02f, +2.708772969e-02f, -2.433638256e-02f, -4.105568184e-02f, +1.224160317e-02f, +4.756138736e-02f, +4.135034155e-03f, -4.346346146e-02f, -1.776266248e-02f, +3.094213007e-02f, +2.335704874e-02f, -1.602561714e-02f, -2.031051168e-02f, +4.753455089e-03f, +1.237730680e-02f, -3.774770859e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.228416515e-04f, +4.588010355e-04f, +8.440233219e-04f, -4.717426375e-04f, -2.058247866e-03f, -5.000727499e-04f, +3.596663800e-03f, +3.713550397e-03f, -4.221643471e-03f, -1.347636193e-02f, -1.240511117e-02f, +4.784042305e-04f, +1.288634917e-02f, +1.310182610e-02f, +3.562904099e-03f, -3.947526340e-03f, -3.376457860e-03f, +7.148374391e-04f, +2.022166441e-03f, +3.475731664e-04f, -8.639141446e-04f, -4.058070785e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.228416515e-04f, -8.003349149e-04f, -2.735279885e-04f, +1.499007371e-03f, +9.360930950e-04f, -2.041307870e-03f, -2.028487580e-03f, +2.054760965e-03f, +3.222411416e-03f, -1.372033154e-03f, -4.028584887e-03f, +1.840353029e-04f, +4.077984126e-03f, +1.035746467e-03f, -3.351308669e-03f, -1.799639412e-03f, +2.189743774e-03f, +1.882894487e-03f, -1.079723663e-03f, -1.419218793e-03f, +3.696152939e-04f, +4.058070785e-04f, +0.000000000e+00f, - /* 8, 0 (20) */ - +4.232530385e-03f, -1.107445485e-02f, -1.430417411e-02f, +1.968688515e-02f, +3.656181770e-02f, -2.833728014e-02f, -8.751812114e-02f, +3.477572232e-02f, +3.116826556e-01f, +4.628412844e-01f, +3.116826556e-01f, +3.477572232e-02f, -8.751812114e-02f, -2.833728014e-02f, +3.656181770e-02f, +1.968688515e-02f, -1.430417411e-02f, -1.107445485e-02f, +4.232530385e-03f, +4.331790294e-03f, - -4.232530385e-03f, +1.371036132e-02f, -2.107151343e-03f, -2.492818050e-02f, +2.775785172e-03f, +3.622176182e-02f, -2.346340648e-03f, -4.463231996e-02f, +9.160844319e-04f, +4.774542267e-02f, +9.160844319e-04f, -4.463231996e-02f, -2.346340648e-03f, +3.622176182e-02f, +2.775785172e-03f, -2.492818050e-02f, -2.107151343e-03f, +1.371036132e-02f, +7.679719629e-04f, -4.331790294e-03f, - +4.942988507e-04f, +1.071645627e-03f, -9.424427779e-04f, -2.597731926e-03f, +1.186714087e-03f, +5.747165752e-03f, -2.115954295e-04f, -1.413757257e-02f, -1.696433330e-02f, -6.624395334e-04f, +1.643369606e-02f, +1.484839508e-02f, +9.992320544e-04f, -5.768311362e-03f, -1.568176220e-03f, +2.541380620e-03f, +1.122154771e-03f, -1.027264733e-03f, -5.704953334e-04f, +3.415338794e-04f, - -4.942988507e-04f, -2.436400721e-04f, +1.885885873e-03f, +2.359866487e-04f, -2.997607234e-03f, -2.308187490e-04f, +3.969785406e-03f, +2.323344870e-04f, -4.541971466e-03f, -2.272916666e-04f, +4.552059213e-03f, +1.938510128e-04f, -3.998338864e-03f, -1.182078953e-04f, +3.039732580e-03f, +8.177305509e-06f, -1.934277966e-03f, +1.057490789e-04f, +9.438317895e-04f, -3.415338794e-04f, - /* 8, 1 (20) */ - +4.726829236e-03f, -1.000280923e-02f, -1.524661688e-02f, +1.708915323e-02f, +3.774853178e-02f, -2.259011439e-02f, -8.772971657e-02f, +2.063814975e-02f, +2.947183224e-01f, +4.621788449e-01f, +3.281163517e-01f, +4.962411740e-02f, -8.651888909e-02f, -3.410559150e-02f, +3.499364147e-02f, +2.222826577e-02f, -1.318201934e-02f, -1.210171959e-02f, +3.662035052e-03f, +4.673324173e-03f, - -4.726829236e-03f, +1.346672125e-02f, -2.212654702e-04f, -2.469219385e-02f, -2.218220622e-04f, +3.599094307e-02f, +1.623444758e-03f, -4.439998547e-02f, -3.625887034e-03f, +4.751813100e-02f, +5.468143645e-03f, -4.443846894e-02f, -6.344679512e-03f, +3.610355393e-02f, +5.815517752e-03f, -2.492000319e-02f, -4.041429309e-03f, +1.381611040e-02f, +1.711803752e-03f, -4.673324173e-03f, - +4.177112667e-04f, +1.103660859e-03f, -7.626689300e-04f, -2.628836244e-03f, +8.115983865e-04f, +5.679469349e-03f, +5.376812897e-04f, -1.337916564e-02f, -1.740925935e-02f, -1.983735818e-03f, +1.581927685e-02f, +1.550627344e-02f, +1.821355477e-03f, -5.740654674e-03f, -1.952901032e-03f, +2.459183624e-03f, +1.300077533e-03f, -9.703331099e-04f, -6.454489193e-04f, +3.186394550e-04f, - -4.177112667e-04f, -3.730686962e-04f, +1.819407190e-03f, +4.710015288e-04f, -2.926444716e-03f, -5.716057562e-04f, +3.902616591e-03f, +6.527285219e-04f, -4.487557259e-03f, -6.795955332e-04f, +4.517545568e-03f, +6.215611338e-04f, -3.987518887e-03f, -4.720017220e-04f, +3.051758490e-03f, +2.590992107e-04f, -1.963452251e-03f, -3.931042588e-05f, +9.808922698e-04f, -3.186394550e-04f, - /* 8, 2 (20) */ - +5.144540503e-03f, -8.899148369e-03f, -1.600928581e-02f, +1.446031698e-02f, +3.856013017e-02f, -1.691064504e-02f, -8.719203528e-02f, +7.258984110e-03f, +2.773090630e-01f, +4.601951090e-01f, +3.439356286e-01f, +6.513039084e-02f, -8.469753361e-02f, -3.984624618e-02f, +3.304074044e-02f, +2.468744940e-02f, -1.188194180e-02f, -1.307205270e-02f, +3.016586133e-03f, +4.991963628e-03f, - -5.144540503e-03f, +1.309365256e-02f, +1.598141720e-03f, -2.422119232e-02f, -3.148266778e-03f, +3.541933732e-02f, +5.526061349e-03f, -4.374725695e-02f, -8.113444292e-03f, +4.683853547e-02f, +9.985689213e-03f, -4.381690781e-02f, -1.033219840e-02f, +3.563155220e-02f, +8.867276242e-03f, -2.466090398e-02f, -6.004881559e-03f, +1.377679998e-02f, +2.692696022e-03f, -4.991963628e-03f, - +3.415464863e-04f, +1.123608017e-03f, -5.844882044e-04f, -2.635491254e-03f, +4.457406325e-04f, +5.567743023e-03f, +1.245091159e-03f, -1.257874121e-02f, -1.776709489e-02f, -3.294307841e-03f, +1.512354579e-02f, +1.610609591e-02f, +2.673746811e-03f, -5.662239035e-03f, -2.337652654e-03f, +2.350754304e-03f, +1.474425077e-03f, -9.007850030e-04f, -7.182774986e-04f, +2.902308282e-04f, - -3.415464863e-04f, -4.928842361e-04f, +1.736141823e-03f, +6.946336616e-04f, -2.827593855e-03f, -9.008208921e-04f, +3.797981338e-03f, +1.063156485e-03f, -4.389545543e-03f, -1.125084945e-03f, +4.438614138e-03f, +1.046481376e-03f, -3.936970650e-03f, -8.269856589e-04f, +3.032926427e-03f, +5.142539520e-04f, -1.972464090e-03f, -1.901127300e-04f, +1.007774411e-03f, -2.902308282e-04f, - /* 8, 3 (20) */ - +5.486086989e-03f, -7.775540352e-03f, -1.659377402e-02f, +1.182482573e-02f, +3.900587080e-02f, -1.134290202e-02f, -8.594694412e-02f, -5.319757101e-03f, +2.595419681e-01f, +4.569008012e-01f, +3.590591744e-01f, +8.123648675e-02f, -8.202378680e-02f, -4.550848521e-02f, +3.070308779e-02f, +2.703820370e-02f, -1.040751673e-02f, -1.397283770e-02f, +2.298308634e-03f, +5.282194456e-03f, - -5.486086989e-03f, +1.260076832e-02f, +3.334283543e-03f, -2.352655866e-02f, -5.975860633e-03f, +3.451851642e-02f, +9.324042687e-03f, -4.268410046e-02f, -1.250298984e-02f, +4.571345052e-02f, +1.442430335e-02f, -4.277042643e-02f, -1.426916905e-02f, +3.480456655e-02f, +1.190020267e-02f, -2.414665003e-02f, -7.977345649e-03f, +1.358668725e-02f, +3.700470433e-03f, -5.282194456e-03f, - +2.665736490e-04f, +1.131889554e-03f, -4.094705608e-04f, -2.618679197e-03f, +9.186198754e-05f, +5.414749998e-03f, +1.907510627e-03f, -1.174203160e-02f, -1.803701535e-02f, -4.587086190e-03f, +1.434950098e-02f, +1.664303823e-02f, +3.551864832e-03f, -5.531426381e-03f, -2.719065127e-03f, +2.215929696e-03f, +1.643367680e-03f, -8.186798190e-04f, -7.880768710e-04f, +2.562947352e-04f, - -2.665736490e-04f, -6.020883660e-04f, +1.637538942e-03f, +9.048280058e-04f, -2.702670008e-03f, -1.215305720e-03f, +3.657402910e-03f, +1.459579288e-03f, -4.249109906e-03f, -1.559296489e-03f, +4.315906681e-03f, +1.464294980e-03f, -3.846750697e-03f, -1.179515272e-03f, +2.982795618e-03f, +7.710079281e-04f, -1.960571555e-03f, -3.451135083e-04f, +1.023673450e-03f, -2.562947352e-04f, - /* 8, 4 (20) */ - +5.752660638e-03f, -6.643650798e-03f, -1.700324458e-02f, +9.206146531e-03f, +3.909773279e-02f, -5.928152020e-03f, -8.403943349e-02f, -1.706178870e-02f, +2.415049528e-01f, +4.523137150e-01f, +3.734086753e-01f, +9.787952498e-02f, -7.847192197e-02f, -5.103991159e-02f, +2.798402266e-02f, +2.925413340e-02f, -8.764149045e-03f, -1.479151752e-02f, +1.510231763e-03f, +5.538489191e-03f, - -5.752660638e-03f, +1.199867995e-02f, +4.971822485e-03f, -2.262173065e-02f, -8.678530641e-03f, +3.330321070e-02f, +1.298144560e-02f, -4.122452117e-02f, -1.675209974e-02f, +4.415415403e-02f, +1.874021003e-02f, -4.130613145e-02f, -1.811591975e-02f, +3.362505127e-02f, +1.488299829e-02f, -2.337564210e-02f, -9.937917204e-03f, +1.324157374e-02f, +4.724143883e-03f, -5.538489191e-03f, - +1.935110042e-04f, +1.129004395e-03f, -2.390895771e-04f, -2.579551310e-03f, -2.475227204e-04f, +5.223467590e-03f, +2.522213513e-03f, -1.087489204e-02f, -1.821875186e-02f, -5.855120957e-03f, +1.350065164e-02f, +1.711260140e-02f, +4.450872321e-03f, -5.346918973e-03f, -3.093666186e-03f, +2.054780478e-03f, +1.805047718e-03f, -7.242069211e-04f, -8.539295515e-04f, +2.168827929e-04f, - -1.935110042e-04f, -6.998422929e-04f, +1.525176311e-03f, +1.099726856e-03f, -2.553532414e-03f, -1.512106800e-03f, +3.482758529e-03f, +1.838134873e-03f, -4.067854459e-03f, -1.977885169e-03f, +4.150517779e-03f, +1.870728646e-03f, -3.717330658e-03f, -1.525917272e-03f, +2.901253756e-03f, +1.026646345e-03f, -1.927249547e-03f, -5.026649039e-04f, +1.027892703e-03f, -2.168827929e-04f, - /* 8, 5 (20) */ - +5.946171642e-03f, -5.514646403e-03f, -1.724233416e-02f, +6.626595221e-03f, +3.885021007e-02f, -7.046844307e-04f, -8.151721998e-02f, -2.793668074e-02f, +2.232862009e-01f, +4.464585940e-01f, +3.869093270e-01f, +1.149921264e-01f, -7.402104965e-02f, -5.638683057e-02f, +2.489035648e-02f, +3.130891387e-02f, -6.959101328e-03f, -1.551572444e-02f, +6.563022117e-04f, +5.755371984e-03f, - -5.946171642e-03f, +1.129883766e-02f, +6.496998796e-03f, -2.152200380e-02f, -1.123206305e-02f, +3.179110390e-02f, +1.646420413e-02f, -3.938638630e-02f, -2.081995420e-02f, +4.217626886e-02f, +2.289072781e-02f, -3.943540281e-02f, -2.183325040e-02f, +3.209913400e-02f, +1.778425204e-02f, -2.234899576e-02f, -1.186516675e-02f, +1.273890883e-02f, +5.752036586e-03f, -5.755371984e-03f, - +1.230205712e-04f, +1.115538893e-03f, -7.471240596e-05f, -2.519411274e-03f, -5.701187780e-04f, +4.997057938e-03f, +3.086881692e-03f, -9.983257923e-03f, -1.831258806e-02f, -7.091628267e-03f, +1.258099744e-02f, +1.751064758e-02f, +5.365665157e-03f, -5.107778925e-03f, -3.457902630e-03f, +1.867619167e-03f, +1.957596360e-03f, -6.176892922e-04f, -9.149140868e-04f, +1.721140407e-04f, - -1.230205712e-04f, -7.854717648e-04f, +1.400738631e-03f, +1.277685904e-03f, -2.382259241e-03f, -1.788504203e-03f, +3.276255373e-03f, +2.195177521e-03f, -3.847795161e-03f, -2.376669961e-03f, +3.943984633e-03f, +2.261598070e-03f, -3.549596463e-03f, -1.862528860e-03f, +2.788524193e-03f, +1.278402014e-03f, -1.872201692e-03f, -6.610323088e-04f, +1.019856264e-03f, -1.721140407e-04f, - /* 8, 6 (20) */ - +6.069192214e-03f, -4.399107510e-03f, -1.731704656e-02f, +4.107183947e-03f, +3.828009129e-02f, +4.292373508e-03f, -7.843033829e-02f, -3.791993866e-02f, +2.049736128e-01f, +4.393669658e-01f, +3.994903244e-01f, +1.325027740e-01f, -6.865538449e-02f, -6.149460949e-02f, +2.143245385e-02f, +3.317653304e-02f, -5.001504968e-03f, -1.613341373e-02f, -2.586118751e-04f, +5.927486025e-03f, - -6.069192214e-03f, +1.051336590e-02f, +7.897737427e-03f, -2.024431789e-02f, -1.361432230e-02f, +3.000259970e-02f, +1.974045950e-02f, -3.719120878e-02f, -2.466774936e-02f, +3.979959890e-02f, +2.683471244e-02f, -3.717380474e-02f, -2.538284687e-02f, +3.023660514e-02f, +2.057277624e-02f, -2.107059374e-02f, -1.373736844e-02f, +1.207787653e-02f, +6.771892850e-03f, -5.927486025e-03f, - +5.570361358e-05f, +1.092157279e-03f, +8.240889726e-05f, -2.439697861e-03f, -8.738631007e-04f, +4.738838004e-03f, +3.599612441e-03f, -9.073101965e-03f, -1.831935298e-02f, -8.290035550e-03f, +1.159500427e-02f, +1.783343363e-02f, +6.290903966e-03f, -4.813445299e-03f, -3.808167111e-03f, +1.655006415e-03f, +2.099150977e-03f, -4.995859877e-04f, -9.701147992e-04f, +1.221768178e-04f, - -5.570361358e-05f, -8.584699379e-04f, +1.265995183e-03f, +1.437287524e-03f, -2.191120659e-03f, -2.042037039e-03f, +3.040403273e-03f, +2.527314523e-03f, -3.591336800e-03f, -2.751677569e-03f, +3.698272068e-03f, +2.632852796e-03f, -3.344843039e-03f, -2.185737471e-03f, +2.645169480e-03f, +1.523485340e-03f, -1.795369830e-03f, -8.184126778e-04f, +9.991205384e-04f, -1.221768178e-04f, - /* 8, 7 (20) */ - +6.124895827e-03f, -3.306950231e-03f, -1.723463767e-02f, +1.667486087e-03f, +3.740622819e-02f, +9.031211512e-03f, -7.483072585e-02f, -4.699304063e-02f, +1.866542599e-01f, +4.310769302e-01f, +4.110853287e-01f, +1.503362076e-01f, -6.236448052e-02f, -6.630805479e-02f, +1.762428674e-02f, +3.483153946e-02f, -2.902353991e-03f, -1.663299972e-02f, -1.228726674e-03f, +6.049662843e-03f, - -6.124895827e-03f, +9.654895957e-03f, +9.163732609e-03f, -1.880703037e-02f, -1.580544296e-02f, +2.796056266e-02f, +2.278086277e-02f, -3.466389426e-02f, -2.825908616e-02f, +3.704792133e-02f, +3.053298451e-02f, -3.454095194e-02f, -2.872768991e-02f, +2.805086767e-02f, +2.321794572e-02f, -1.954710840e-02f, -1.553273827e-02f, +1.125946385e-02f, +7.771013389e-03f, -6.049662843e-03f, - -7.903055656e-06f, +1.059591684e-03f, +2.311446369e-04f, -2.341966952e-03f, -1.156933444e-03f, +4.452249087e-03f, +4.058922462e-03f, -8.150391786e-03f, -1.824041005e-02f, -9.444025205e-03f, +1.054757634e-02f, +1.807764223e-02f, +7.221048111e-03f, -4.463748597e-03f, -4.140826137e-03f, +1.417755289e-03f, +2.227873126e-03f, -3.704933080e-04f, -1.018631873e-03f, +6.732992868e-05f, - +7.903055656e-06f, -9.184981212e-04f, +1.122777048e-03f, +1.577351182e-03f, -1.982550260e-03f, -2.270525783e-03f, +2.777984421e-03f, +2.831439858e-03f, -3.301245901e-03f, -3.099183915e-03f, +3.415752908e-03f, +2.980619881e-03f, -3.104764493e-03f, -2.492020480e-03f, +2.472091164e-03f, +1.759115187e-03f, -1.696940912e-03f, -9.729541903e-04f, +9.653844472e-04f, -6.732992868e-05f, - /* 8, 8 (20) */ - +6.116992771e-03f, -2.247358547e-03f, -1.700349303e-02f, -6.744808652e-04f, +3.624929475e-02f, +1.348346060e-02f, -7.077180339e-02f, -5.514343241e-02f, +1.684138498e-01f, +4.216329050e-01f, +4.216329050e-01f, +1.684138498e-01f, -5.514343241e-02f, -7.077180339e-02f, +1.348346060e-02f, +3.624929475e-02f, -6.744808652e-04f, -1.700349303e-02f, -2.247358547e-03f, +6.116992771e-03f, - -6.116992771e-03f, +8.736397836e-03f, +1.028650966e-02f, -1.722967919e-02f, -1.778799322e-02f, +2.569003688e-02f, +2.555884719e-02f, -3.183245440e-02f, -3.156033206e-02f, +3.394873742e-02f, +3.394873742e-02f, -3.156033206e-02f, -3.183245440e-02f, +2.555884719e-02f, +2.569003688e-02f, -1.778799322e-02f, -1.722967919e-02f, +1.028650966e-02f, +8.736397836e-03f, -6.116992771e-03f, - -6.732992868e-05f, +1.018631873e-03f, +3.704933080e-04f, -2.227873126e-03f, -1.417755289e-03f, +4.140826137e-03f, +4.463748597e-03f, -7.221048111e-03f, -1.807764223e-02f, -1.054757634e-02f, +9.444025205e-03f, +1.824041005e-02f, +8.150391786e-03f, -4.058922462e-03f, -4.452249087e-03f, +1.156933444e-03f, +2.341966952e-03f, -2.311446369e-04f, -1.059591684e-03f, +7.903055656e-06f, - +6.732992868e-05f, -9.653844472e-04f, +9.729541903e-04f, +1.696940912e-03f, -1.759115187e-03f, -2.472091164e-03f, +2.492020480e-03f, +3.104764493e-03f, -2.980619881e-03f, -3.415752908e-03f, +3.099183915e-03f, +3.301245901e-03f, -2.831439858e-03f, -2.777984421e-03f, +2.270525783e-03f, +1.982550260e-03f, -1.577351182e-03f, -1.122777048e-03f, +9.184981212e-04f, -7.903055656e-06f, - /* 8, 9 (20) */ - +6.049662843e-03f, -1.228726674e-03f, -1.663299972e-02f, -2.902353991e-03f, +3.483153946e-02f, +1.762428674e-02f, -6.630805479e-02f, -6.236448052e-02f, +1.503362076e-01f, +4.110853287e-01f, +4.310769302e-01f, +1.866542599e-01f, -4.699304063e-02f, -7.483072585e-02f, +9.031211512e-03f, +3.740622819e-02f, +1.667486087e-03f, -1.723463767e-02f, -3.306950231e-03f, +6.124895827e-03f, - -6.049662843e-03f, +7.771013389e-03f, +1.125946385e-02f, -1.553273827e-02f, -1.954710840e-02f, +2.321794572e-02f, +2.805086767e-02f, -2.872768991e-02f, -3.454095194e-02f, +3.053298451e-02f, +3.704792133e-02f, -2.825908616e-02f, -3.466389426e-02f, +2.278086277e-02f, +2.796056266e-02f, -1.580544296e-02f, -1.880703037e-02f, +9.163732609e-03f, +9.654895957e-03f, -6.124895827e-03f, - -1.221768178e-04f, +9.701147992e-04f, +4.995859877e-04f, -2.099150977e-03f, -1.655006415e-03f, +3.808167111e-03f, +4.813445299e-03f, -6.290903966e-03f, -1.783343363e-02f, -1.159500427e-02f, +8.290035550e-03f, +1.831935298e-02f, +9.073101965e-03f, -3.599612441e-03f, -4.738838004e-03f, +8.738631007e-04f, +2.439697861e-03f, -8.240889726e-05f, -1.092157279e-03f, -5.570361358e-05f, - +1.221768178e-04f, -9.991205384e-04f, +8.184126778e-04f, +1.795369830e-03f, -1.523485340e-03f, -2.645169480e-03f, +2.185737471e-03f, +3.344843039e-03f, -2.632852796e-03f, -3.698272068e-03f, +2.751677569e-03f, +3.591336800e-03f, -2.527314523e-03f, -3.040403273e-03f, +2.042037039e-03f, +2.191120659e-03f, -1.437287524e-03f, -1.265995183e-03f, +8.584699379e-04f, +5.570361358e-05f, - /* 8,10 (20) */ - +5.927486025e-03f, -2.586118751e-04f, -1.613341373e-02f, -5.001504968e-03f, +3.317653304e-02f, +2.143245385e-02f, -6.149460949e-02f, -6.865538449e-02f, +1.325027740e-01f, +3.994903244e-01f, +4.393669658e-01f, +2.049736128e-01f, -3.791993866e-02f, -7.843033829e-02f, +4.292373508e-03f, +3.828009129e-02f, +4.107183947e-03f, -1.731704656e-02f, -4.399107510e-03f, +6.069192214e-03f, - -5.927486025e-03f, +6.771892850e-03f, +1.207787653e-02f, -1.373736844e-02f, -2.107059374e-02f, +2.057277624e-02f, +3.023660514e-02f, -2.538284687e-02f, -3.717380474e-02f, +2.683471244e-02f, +3.979959890e-02f, -2.466774936e-02f, -3.719120878e-02f, +1.974045950e-02f, +3.000259970e-02f, -1.361432230e-02f, -2.024431789e-02f, +7.897737427e-03f, +1.051336590e-02f, -6.069192214e-03f, - -1.721140407e-04f, +9.149140868e-04f, +6.176892922e-04f, -1.957596360e-03f, -1.867619167e-03f, +3.457902630e-03f, +5.107778925e-03f, -5.365665157e-03f, -1.751064758e-02f, -1.258099744e-02f, +7.091628267e-03f, +1.831258806e-02f, +9.983257923e-03f, -3.086881692e-03f, -4.997057938e-03f, +5.701187780e-04f, +2.519411274e-03f, +7.471240596e-05f, -1.115538893e-03f, -1.230205712e-04f, - +1.721140407e-04f, -1.019856264e-03f, +6.610323088e-04f, +1.872201692e-03f, -1.278402014e-03f, -2.788524193e-03f, +1.862528860e-03f, +3.549596463e-03f, -2.261598070e-03f, -3.943984633e-03f, +2.376669961e-03f, +3.847795161e-03f, -2.195177521e-03f, -3.276255373e-03f, +1.788504203e-03f, +2.382259241e-03f, -1.277685904e-03f, -1.400738631e-03f, +7.854717648e-04f, +1.230205712e-04f, - /* 8,11 (20) */ - +5.755371984e-03f, +6.563022117e-04f, -1.551572444e-02f, -6.959101328e-03f, +3.130891387e-02f, +2.489035648e-02f, -5.638683057e-02f, -7.402104965e-02f, +1.149921264e-01f, +3.869093270e-01f, +4.464585940e-01f, +2.232862009e-01f, -2.793668074e-02f, -8.151721998e-02f, -7.046844307e-04f, +3.885021007e-02f, +6.626595221e-03f, -1.724233416e-02f, -5.514646403e-03f, +5.946171642e-03f, - -5.755371984e-03f, +5.752036586e-03f, +1.273890883e-02f, -1.186516675e-02f, -2.234899576e-02f, +1.778425204e-02f, +3.209913400e-02f, -2.183325040e-02f, -3.943540281e-02f, +2.289072781e-02f, +4.217626886e-02f, -2.081995420e-02f, -3.938638630e-02f, +1.646420413e-02f, +3.179110390e-02f, -1.123206305e-02f, -2.152200380e-02f, +6.496998796e-03f, +1.129883766e-02f, -5.946171642e-03f, - -2.168827929e-04f, +8.539295515e-04f, +7.242069211e-04f, -1.805047718e-03f, -2.054780478e-03f, +3.093666186e-03f, +5.346918973e-03f, -4.450872321e-03f, -1.711260140e-02f, -1.350065164e-02f, +5.855120957e-03f, +1.821875186e-02f, +1.087489204e-02f, -2.522213513e-03f, -5.223467590e-03f, +2.475227204e-04f, +2.579551310e-03f, +2.390895771e-04f, -1.129004395e-03f, -1.935110042e-04f, - +2.168827929e-04f, -1.027892703e-03f, +5.026649039e-04f, +1.927249547e-03f, -1.026646345e-03f, -2.901253756e-03f, +1.525917272e-03f, +3.717330658e-03f, -1.870728646e-03f, -4.150517779e-03f, +1.977885169e-03f, +4.067854459e-03f, -1.838134873e-03f, -3.482758529e-03f, +1.512106800e-03f, +2.553532414e-03f, -1.099726856e-03f, -1.525176311e-03f, +6.998422929e-04f, +1.935110042e-04f, - /* 8,12 (20) */ - +5.538489191e-03f, +1.510231763e-03f, -1.479151752e-02f, -8.764149045e-03f, +2.925413340e-02f, +2.798402266e-02f, -5.103991159e-02f, -7.847192197e-02f, +9.787952498e-02f, +3.734086753e-01f, +4.523137150e-01f, +2.415049528e-01f, -1.706178870e-02f, -8.403943349e-02f, -5.928152020e-03f, +3.909773279e-02f, +9.206146531e-03f, -1.700324458e-02f, -6.643650798e-03f, +5.752660638e-03f, - -5.538489191e-03f, +4.724143883e-03f, +1.324157374e-02f, -9.937917204e-03f, -2.337564210e-02f, +1.488299829e-02f, +3.362505127e-02f, -1.811591975e-02f, -4.130613145e-02f, +1.874021003e-02f, +4.415415403e-02f, -1.675209974e-02f, -4.122452117e-02f, +1.298144560e-02f, +3.330321070e-02f, -8.678530641e-03f, -2.262173065e-02f, +4.971822485e-03f, +1.199867995e-02f, -5.752660638e-03f, - -2.562947352e-04f, +7.880768710e-04f, +8.186798190e-04f, -1.643367680e-03f, -2.215929696e-03f, +2.719065127e-03f, +5.531426381e-03f, -3.551864832e-03f, -1.664303823e-02f, -1.434950098e-02f, +4.587086190e-03f, +1.803701535e-02f, +1.174203160e-02f, -1.907510627e-03f, -5.414749998e-03f, -9.186198754e-05f, +2.618679197e-03f, +4.094705608e-04f, -1.131889554e-03f, -2.665736490e-04f, - +2.562947352e-04f, -1.023673450e-03f, +3.451135083e-04f, +1.960571555e-03f, -7.710079281e-04f, -2.982795618e-03f, +1.179515272e-03f, +3.846750697e-03f, -1.464294980e-03f, -4.315906681e-03f, +1.559296489e-03f, +4.249109906e-03f, -1.459579288e-03f, -3.657402910e-03f, +1.215305720e-03f, +2.702670008e-03f, -9.048280058e-04f, -1.637538942e-03f, +6.020883660e-04f, +2.665736490e-04f, - /* 8,13 (20) */ - +5.282194456e-03f, +2.298308634e-03f, -1.397283770e-02f, -1.040751673e-02f, +2.703820370e-02f, +3.070308779e-02f, -4.550848521e-02f, -8.202378680e-02f, +8.123648675e-02f, +3.590591744e-01f, +4.569008012e-01f, +2.595419681e-01f, -5.319757101e-03f, -8.594694412e-02f, -1.134290202e-02f, +3.900587080e-02f, +1.182482573e-02f, -1.659377402e-02f, -7.775540352e-03f, +5.486086989e-03f, - -5.282194456e-03f, +3.700470433e-03f, +1.358668725e-02f, -7.977345649e-03f, -2.414665003e-02f, +1.190020267e-02f, +3.480456655e-02f, -1.426916905e-02f, -4.277042643e-02f, +1.442430335e-02f, +4.571345052e-02f, -1.250298984e-02f, -4.268410046e-02f, +9.324042687e-03f, +3.451851642e-02f, -5.975860633e-03f, -2.352655866e-02f, +3.334283543e-03f, +1.260076832e-02f, -5.486086989e-03f, - -2.902308282e-04f, +7.182774986e-04f, +9.007850030e-04f, -1.474425077e-03f, -2.350754304e-03f, +2.337652654e-03f, +5.662239035e-03f, -2.673746811e-03f, -1.610609591e-02f, -1.512354579e-02f, +3.294307841e-03f, +1.776709489e-02f, +1.257874121e-02f, -1.245091159e-03f, -5.567743023e-03f, -4.457406325e-04f, +2.635491254e-03f, +5.844882044e-04f, -1.123608017e-03f, -3.415464863e-04f, - +2.902308282e-04f, -1.007774411e-03f, +1.901127300e-04f, +1.972464090e-03f, -5.142539520e-04f, -3.032926427e-03f, +8.269856589e-04f, +3.936970650e-03f, -1.046481376e-03f, -4.438614138e-03f, +1.125084945e-03f, +4.389545543e-03f, -1.063156485e-03f, -3.797981338e-03f, +9.008208921e-04f, +2.827593855e-03f, -6.946336616e-04f, -1.736141823e-03f, +4.928842361e-04f, +3.415464863e-04f, - /* 8,14 (20) */ - +4.991963628e-03f, +3.016586133e-03f, -1.307205270e-02f, -1.188194180e-02f, +2.468744940e-02f, +3.304074044e-02f, -3.984624618e-02f, -8.469753361e-02f, +6.513039084e-02f, +3.439356286e-01f, +4.601951090e-01f, +2.773090630e-01f, +7.258984110e-03f, -8.719203528e-02f, -1.691064504e-02f, +3.856013017e-02f, +1.446031698e-02f, -1.600928581e-02f, -8.899148369e-03f, +5.144540503e-03f, - -4.991963628e-03f, +2.692696022e-03f, +1.377679998e-02f, -6.004881559e-03f, -2.466090398e-02f, +8.867276242e-03f, +3.563155220e-02f, -1.033219840e-02f, -4.381690781e-02f, +9.985689213e-03f, +4.683853547e-02f, -8.113444292e-03f, -4.374725695e-02f, +5.526061349e-03f, +3.541933732e-02f, -3.148266778e-03f, -2.422119232e-02f, +1.598141720e-03f, +1.309365256e-02f, -5.144540503e-03f, - -3.186394550e-04f, +6.454489193e-04f, +9.703331099e-04f, -1.300077533e-03f, -2.459183624e-03f, +1.952901032e-03f, +5.740654674e-03f, -1.821355477e-03f, -1.550627344e-02f, -1.581927685e-02f, +1.983735818e-03f, +1.740925935e-02f, +1.337916564e-02f, -5.376812897e-04f, -5.679469349e-03f, -8.115983865e-04f, +2.628836244e-03f, +7.626689300e-04f, -1.103660859e-03f, -4.177112667e-04f, - +3.186394550e-04f, -9.808922698e-04f, +3.931042588e-05f, +1.963452251e-03f, -2.590992107e-04f, -3.051758490e-03f, +4.720017220e-04f, +3.987518887e-03f, -6.215611338e-04f, -4.517545568e-03f, +6.795955332e-04f, +4.487557259e-03f, -6.527285219e-04f, -3.902616591e-03f, +5.716057562e-04f, +2.926444716e-03f, -4.710015288e-04f, -1.819407190e-03f, +3.730686962e-04f, +4.177112667e-04f, - /* 8,15 (20) */ - +4.673324173e-03f, +3.662035052e-03f, -1.210171959e-02f, -1.318201934e-02f, +2.222826577e-02f, +3.499364147e-02f, -3.410559150e-02f, -8.651888909e-02f, +4.962411740e-02f, +3.281163517e-01f, +4.621788449e-01f, +2.947183224e-01f, +2.063814975e-02f, -8.772971657e-02f, -2.259011439e-02f, +3.774853178e-02f, +1.708915323e-02f, -1.524661688e-02f, -1.000280923e-02f, +4.726829236e-03f, - -4.673324173e-03f, +1.711803752e-03f, +1.381611040e-02f, -4.041429309e-03f, -2.492000319e-02f, +5.815517752e-03f, +3.610355393e-02f, -6.344679512e-03f, -4.443846894e-02f, +5.468143645e-03f, +4.751813100e-02f, -3.625887034e-03f, -4.439998547e-02f, +1.623444758e-03f, +3.599094307e-02f, -2.218220622e-04f, -2.469219385e-02f, -2.212654702e-04f, +1.346672125e-02f, -4.726829236e-03f, - -3.415338794e-04f, +5.704953334e-04f, +1.027264733e-03f, -1.122154771e-03f, -2.541380620e-03f, +1.568176220e-03f, +5.768311362e-03f, -9.992320544e-04f, -1.484839508e-02f, -1.643369606e-02f, +6.624395334e-04f, +1.696433330e-02f, +1.413757257e-02f, +2.115954295e-04f, -5.747165752e-03f, -1.186714087e-03f, +2.597731926e-03f, +9.424427779e-04f, -1.071645627e-03f, -4.942988507e-04f, - +3.415338794e-04f, -9.438317895e-04f, -1.057490789e-04f, +1.934277966e-03f, -8.177305509e-06f, -3.039732580e-03f, +1.182078953e-04f, +3.998338864e-03f, -1.938510128e-04f, -4.552059213e-03f, +2.272916666e-04f, +4.541971466e-03f, -2.323344870e-04f, -3.969785406e-03f, +2.308187490e-04f, +2.997607234e-03f, -2.359866487e-04f, -1.885885873e-03f, +2.436400721e-04f, +4.942988507e-04f, - /* 9, 0 (20) */ - +0.000000000e+00f, +2.635906469e-03f, -1.641132545e-02f, -5.241295346e-03f, +3.933760287e-02f, +7.884481680e-03f, -8.986446179e-02f, -9.856597633e-03f, +3.125987401e-01f, +5.105867071e-01f, +3.125987401e-01f, -9.856597633e-03f, -8.986446179e-02f, +7.884481680e-03f, +3.933760287e-02f, -5.241295346e-03f, -1.641132545e-02f, +2.635906469e-03f, +5.000502348e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.635906469e-03f, +1.297417288e-02f, -1.377345074e-02f, -1.814528753e-02f, +2.876335645e-02f, +1.617791594e-02f, -4.228291414e-02f, -6.498996734e-03f, +4.774542267e-02f, -6.498996734e-03f, -4.228291414e-02f, +1.617791594e-02f, +2.876335645e-02f, -1.814528753e-02f, -1.377345074e-02f, +1.297417288e-02f, +3.219177626e-03f, -5.000502348e-03f, +0.000000000e+00f, - +0.000000000e+00f, +8.280055545e-04f, +9.434430947e-04f, -2.361745277e-03f, -1.810893147e-03f, +5.516347003e-03f, +3.758189977e-03f, -1.390523808e-02f, -2.150630476e-02f, -8.897312000e-04f, +2.098575527e-02f, +1.504224609e-02f, -2.999106809e-03f, -5.886519257e-03f, +1.471556360e-03f, +2.549557925e-03f, -8.121231947e-04f, -9.215156544e-04f, +3.733364561e-04f, +0.000000000e+00f, - +0.000000000e+00f, -8.280055545e-04f, +4.295677572e-04f, +2.057058918e-03f, -1.856206199e-03f, -2.410304642e-03f, +3.611587590e-03f, +1.750164905e-03f, -4.876204970e-03f, -2.762035904e-04f, +4.976482491e-03f, -1.274298436e-03f, -3.859973064e-03f, +2.120067944e-03f, +2.131677941e-03f, -1.962028272e-03f, -6.222456531e-04f, +1.127315114e-03f, -3.733364561e-04f, +0.000000000e+00f, - /* 9, 1 (20) */ - +0.000000000e+00f, +3.463912023e-03f, -1.546788235e-02f, -7.603040623e-03f, +3.752670972e-02f, +1.340082868e-02f, -8.610627181e-02f, -2.376183572e-02f, +2.910924353e-01f, +5.096969759e-01f, +3.335844954e-01f, +5.185648460e-03f, -9.286356860e-02f, +1.997962422e-03f, +4.080915923e-02f, -2.691737420e-03f, -1.722344864e-02f, +1.714390814e-03f, +5.373838804e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.463912023e-03f, +1.340374064e-02f, -1.171639183e-02f, -2.000149373e-02f, +2.635305181e-02f, +1.978950353e-02f, -4.053274923e-02f, -1.137520170e-02f, +4.746921908e-02f, -1.522514243e-03f, -4.355721257e-02f, +1.231794287e-02f, +3.088342440e-02f, -1.601360959e-02f, -1.573547902e-02f, +1.235192723e-02f, +4.346492740e-03f, -5.373838804e-03f, +0.000000000e+00f, - +0.000000000e+00f, +7.305921628e-04f, +1.056738260e-03f, -2.157834716e-03f, -2.114846329e-03f, +5.107863593e-03f, +4.440297880e-03f, -1.272643712e-02f, -2.189681661e-02f, -2.663331352e-03f, +2.033682242e-02f, +1.612783457e-02f, -2.166163411e-03f, -6.212656396e-03f, +1.098857458e-03f, +2.718282835e-03f, -6.633747179e-04f, -1.009643536e-03f, +3.354433505e-04f, +0.000000000e+00f, - +0.000000000e+00f, -7.305921628e-04f, +2.395794696e-04f, +2.122816887e-03f, -1.565493906e-03f, -2.665309927e-03f, +3.323834225e-03f, +2.200402671e-03f, -4.718546511e-03f, -8.252435984e-04f, +5.017877922e-03f, -7.784232553e-04f, -4.065308942e-03f, +1.797565315e-03f, +2.387924851e-03f, -1.838033290e-03f, -8.149825415e-04f, +1.136438274e-03f, -3.354433505e-04f, +0.000000000e+00f, - /* 9, 2 (20) */ - +0.000000000e+00f, +4.194504186e-03f, -1.441114409e-02f, -9.760875338e-03f, +3.541186339e-02f, +1.850869228e-02f, -8.166597393e-02f, -3.648827284e-02f, +2.691956187e-01f, +5.070336445e-01f, +3.539213178e-01f, +2.131348303e-02f, -9.502973201e-02f, -4.214693973e-03f, +4.190801668e-02f, +2.654541458e-05f, -1.788682336e-02f, +7.047472786e-04f, +5.709282155e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.194504186e-03f, +1.364332011e-02f, -9.593574938e-03f, -2.156698764e-02f, +2.368774188e-02f, +2.311333775e-02f, -3.833234656e-02f, -1.609374821e-02f, +4.664397548e-02f, +3.495363680e-03f, -4.433563583e-02f, +8.252633930e-03f, +3.268098971e-02f, -1.362568474e-02f, -1.757351231e-02f, +1.153694468e-02f, +5.482931014e-03f, -5.709282155e-03f, +0.000000000e+00f, - +0.000000000e+00f, +6.307237808e-04f, +1.151653619e-03f, -1.940857592e-03f, -2.381853223e-03f, +4.666922131e-03f, +5.043072497e-03f, -1.151558473e-02f, -2.215664043e-02f, -4.419392787e-03f, +1.956215993e-02f, +1.715257729e-02f, -1.263223839e-03f, -6.489224694e-03f, +6.952737737e-04f, +2.865008256e-03f, -4.980390126e-04f, -1.090897733e-03f, +2.894969124e-04f, +0.000000000e+00f, - +0.000000000e+00f, -6.307237808e-04f, +5.477977168e-05f, +2.159396002e-03f, -1.263627068e-03f, -2.882624820e-03f, +3.000839505e-03f, +2.619764897e-03f, -4.505717359e-03f, -1.364225086e-03f, +4.999621530e-03f, -2.684631592e-04f, -4.224412441e-03f, +1.446238415e-03f, +2.621121064e-03f, -1.685791457e-03f, -1.005050600e-03f, +1.129034862e-03f, -2.894969124e-04f, +0.000000000e+00f, - /* 9, 3 (20) */ - +0.000000000e+00f, +4.825227967e-03f, -1.325949048e-02f, -1.170173293e-02f, +3.303001017e-02f, +2.317561441e-02f, -7.662290143e-02f, -4.800385756e-02f, +2.470389783e-01f, +5.026142517e-01f, +3.734834777e-01f, +3.846606032e-02f, -9.629295585e-02f, -1.070391867e-02f, +4.260329046e-02f, +2.891553671e-03f, -1.838486237e-02f, -3.861504544e-04f, +5.998779067e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.825227967e-03f, +1.369809988e-02f, -7.434178936e-03f, -2.283061470e-02f, +2.080511706e-02f, +2.611417726e-02f, -3.571258166e-02f, -2.059946557e-02f, +4.527975039e-02f, +8.494985209e-03f, -4.460409899e-02f, +4.028221489e-03f, +3.412722813e-02f, -1.100456367e-02f, -1.925930376e-02f, +1.053189408e-02f, +6.611965876e-03f, -5.998779067e-03f, +0.000000000e+00f, - +0.000000000e+00f, +5.298011884e-04f, +1.228068381e-03f, -1.713851191e-03f, -2.610808021e-03f, +4.199444278e-03f, +5.564913537e-03f, -1.028245231e-02f, -2.228612525e-02f, -6.146382679e-03f, +1.866540766e-02f, +1.810733321e-02f, -2.948858647e-04f, -6.710941652e-03f, +2.637304911e-04f, +2.986937624e-03f, -3.172038752e-04f, -1.163793327e-03f, +2.355965789e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.298011884e-04f, -1.224955005e-04f, +2.167279834e-03f, -9.547365390e-04f, -3.060319886e-03f, +2.647115524e-03f, +3.003441779e-03f, -4.240605369e-03f, -1.886585124e-03f, +4.921687844e-03f, +2.494281672e-04f, -4.334647802e-03f, +1.069967792e-03f, +2.827654824e-03f, -1.506430686e-03f, -1.189661705e-03f, +1.104425485e-03f, -2.355965789e-04f, +0.000000000e+00f, - /* 9, 4 (20) */ - +0.000000000e+00f, +5.355029155e-03f, -1.203142209e-02f, -1.341558412e-02f, +3.041920215e-02f, +2.737505868e-02f, -7.105798790e-02f, -5.828630987e-02f, +2.247528530e-01f, +4.964678690e-01f, +3.921488854e-01f, +5.657339353e-02f, -9.658784171e-02f, -1.741486032e-02f, +4.286702095e-02f, +5.878491295e-03f, -1.870206625e-02f, -1.549943782e-03f, +6.234375646e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.355029155e-03f, +1.357560438e-02f, -5.266899102e-03f, -2.378535124e-02f, +1.774479718e-02f, +2.876129278e-02f, -3.270913988e-02f, -2.484007094e-02f, +4.339316527e-02f, +1.341667305e-02f, -4.435467082e-02f, -3.064263128e-04f, +3.519719592e-02f, -8.176908850e-03f, -2.076573445e-02f, +9.342232379e-03f, +7.716391361e-03f, -6.234375646e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.291621016e-04f, +1.286086734e-03f, -1.479824454e-03f, -2.801055134e-03f, +3.711360789e-03f, +6.004972042e-03f, -9.036757168e-03f, -2.228660632e-02f, -7.833006125e-03f, +1.765116942e-02f, +1.898333005e-02f, +7.335416634e-04f, -6.872836245e-03f, -1.924124300e-04f, +3.081426823e-03f, -1.222018290e-04f, -1.226871825e-03f, +1.739631518e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.291621016e-04f, -2.901018646e-04f, +2.147324128e-03f, -6.429417401e-04f, -3.197010802e-03f, +2.267496324e-03f, +3.347118162e-03f, -3.926735838e-03f, -2.385972924e-03f, +4.784798814e-03f, +7.689446821e-04f, -4.393967678e-03f, +6.730290238e-04f, +3.004182371e-03f, -1.301484781e-03f, -1.366006331e-03f, +1.062167007e-03f, -1.739631518e-04f, +0.000000000e+00f, - /* 9, 5 (20) */ - +0.000000000e+00f, +5.784191257e-03f, -1.074533536e-02f, -1.489540857e-02f, +2.761814701e-02f, +3.108641947e-02f, -6.505301586e-02f, -6.732306704e-02f, +2.024662467e-01f, +4.886348629e-01f, +4.098000548e-01f, +7.555672358e-02f, -9.585430005e-02f, -2.428769656e-02f, +4.267460852e-02f, +8.959918118e-03f, -1.882426808e-02f, -2.776815607e-03f, +6.408338798e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.784191257e-03f, +1.328550251e-02f, -3.119574974e-03f, -2.442829298e-02f, +1.454778638e-02f, +3.102878910e-02f, -2.936202172e-02f, -2.876680678e-02f, +4.100719234e-02f, +1.820147187e-02f, -4.358572614e-02f, -4.700393991e-03f, +3.587022494e-02f, -5.172726479e-03f, -2.206721923e-02f, +7.976226047e-03f, +8.778558367e-03f, -6.408338798e-03f, +0.000000000e+00f, - +0.000000000e+00f, +3.300671283e-04f, +1.326026225e-03f, -1.241725370e-03f, -2.952378019e-03f, +3.208553736e-03f, +6.363137065e-03f, -7.788080402e-03f, -2.216038322e-02f, -9.468298227e-03f, +1.652498208e-02f, +1.977224565e-02f, +1.816068694e-03f, -6.970307785e-03f, -6.693784373e-04f, +3.146021181e-03f, +8.539466769e-05f, -1.278721601e-03f, +1.049421773e-04f, +0.000000000e+00f, - +0.000000000e+00f, -3.300671283e-04f, -4.461107716e-04f, +2.100734464e-03f, -3.322957519e-04f, -3.291866356e-03f, +1.867070858e-03f, +3.647024165e-03f, -3.568223206e-03f, -2.856330728e-03f, +4.590417198e-03f, +1.283708117e-03f, -4.400947177e-03f, +2.600427944e-04f, +3.147679232e-03f, -1.072882990e-03f, -1.531293906e-03f, +1.002068095e-03f, -1.049421773e-04f, +0.000000000e+00f, - /* 9, 6 (20) */ - +0.000000000e+00f, +6.114258385e-03f, -9.419309136e-03f, -1.613713394e-02f, +2.466576899e-02f, +3.429497321e-02f, -5.868987879e-02f, -7.511114744e-02f, +1.803058635e-01f, +4.791665647e-01f, +4.263250369e-01f, +9.532896923e-02f, -9.403823136e-02f, -3.125800435e-02f, +4.200523008e-02f, +1.210593930e-02f, -1.873887341e-02f, -4.055537208e-03f, +6.513280975e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.114258385e-03f, +1.283939174e-02f, -1.018840510e-03f, -2.476058873e-02f, +1.125592002e-02f, +3.289585996e-02f, -2.571499756e-02f, -3.233502999e-02f, +3.815086161e-02f, +2.279188906e-02f, -4.230201802e-02f, -9.101341168e-03f, +3.613026774e-02f, -2.025047247e-03f, -2.314010222e-02f, +6.444932142e-03f, +9.780626462e-03f, -6.513280975e-03f, +0.000000000e+00f, - +0.000000000e+00f, +2.336873413e-04f, +1.348404080e-03f, -1.002410337e-03f, -3.064983760e-03f, +2.696800965e-03f, +6.640015713e-03f, -6.545787442e-03f, -2.191068978e-02f, -1.104171312e-02f, +1.529327634e-02f, +2.046628643e-02f, +2.946060927e-03f, -6.999182770e-03f, -1.162997631e-03f, +3.178491755e-03f, +3.037811469e-04f, -1.317998666e-03f, +2.900573920e-05f, +0.000000000e+00f, - +0.000000000e+00f, -2.336873413e-04f, -5.888302927e-04f, +2.029039572e-03f, -2.673251534e-05f, -3.344608893e-03f, +1.451113486e-03f, +3.899978195e-03f, -3.169715323e-03f, -3.291970818e-03f, +4.340730249e-03f, +1.787349647e-03f, -4.354810013e-03f, -1.640804861e-04f, +3.255488151e-03f, -8.229336740e-04f, -1.682794066e-03f, +9.242013737e-04f, -2.900573920e-05f, +0.000000000e+00f, - /* 9, 7 (20) */ - +0.000000000e+00f, +6.347945727e-03f, -8.070905056e-03f, -1.713954428e-02f, +2.160078523e-02f, +3.699177417e-02f, -5.204986308e-02f, -8.165693488e-02f, +1.583951737e-01f, +4.681248516e-01f, +4.416183132e-01f, +1.157952557e-01f, -9.109217043e-02f, -3.825718712e-02f, +4.084223245e-02f, +1.528443105e-02f, -1.843509226e-02f, -5.373535873e-03f, +6.542286714e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.347945727e-03f, +1.225056145e-02f, +1.010199063e-03f, -2.478732125e-02f, +7.911311127e-03f, +3.434697345e-02f, -2.181501936e-02f, -3.550474531e-02f, +3.485889080e-02f, +2.713261931e-02f, -4.051466837e-02f, -1.345615118e-02f, +3.596618725e-02f, +1.230440904e-03f, -2.396303589e-02f, +4.762138076e-03f, +1.070482784e-02f, -6.542286714e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.410935625e-04f, +1.353921685e-03f, -7.646157698e-04f, -3.139483704e-03f, +2.181723304e-03f, +6.836906882e-03f, -5.318951928e-03f, -2.154165595e-02f, -1.254320912e-02f, +1.396332925e-02f, +2.105826211e-02f, +4.116283618e-03f, -6.955769077e-03f, -1.668734972e-03f, +3.176870476e-03f, +5.309322132e-04f, -1.343447498e-03f, -5.324742539e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.410935625e-04f, -7.168217129e-04f, +1.934060794e-03f, +2.699831670e-04f, -3.355507321e-03f, +1.025012954e-03f, +4.103421853e-03f, -2.736331043e-03f, -3.687647608e-03f, +4.038623874e-03f, +2.273592021e-03f, -4.255446328e-03f, -5.942008484e-04f, +3.325362902e-03f, -5.543021881e-04f, -1.817878219e-03f, +8.289118991e-04f, +5.324742539e-05f, +0.000000000e+00f, - /* 9, 8 (20) */ - +0.000000000e+00f, +6.489039289e-03f, -6.716983371e-03f, -1.790416005e-02f, +1.846130153e-02f, +3.917349748e-02f, -4.521295620e-02f, -8.697588681e-02f, +1.368535178e-01f, +4.555816424e-01f, +4.555816424e-01f, +1.368535178e-01f, -8.697588681e-02f, -4.521295620e-02f, +3.917349748e-02f, +1.846130153e-02f, -1.790416005e-02f, -6.716983371e-03f, +6.489039289e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.489039289e-03f, +1.153373973e-02f, +2.944259857e-03f, -2.451733808e-02f, +4.555803806e-03f, +3.537198640e-02f, -1.771159751e-02f, -3.824107635e-02f, +3.117124319e-02f, +3.117124319e-02f, -3.824107635e-02f, -1.771159751e-02f, +3.537198640e-02f, +4.555803806e-03f, -2.451733808e-02f, +2.944259857e-03f, +1.153373973e-02f, -6.489039289e-03f, +0.000000000e+00f, - +0.000000000e+00f, +5.324742539e-05f, +1.343447498e-03f, -5.309322132e-04f, -3.176870476e-03f, +1.668734972e-03f, +6.955769077e-03f, -4.116283618e-03f, -2.105826211e-02f, -1.396332925e-02f, +1.254320912e-02f, +2.154165595e-02f, +5.318951928e-03f, -6.836906882e-03f, -2.181723304e-03f, +3.139483704e-03f, +7.646157698e-04f, -1.353921685e-03f, -1.410935625e-04f, +0.000000000e+00f, - +0.000000000e+00f, -5.324742539e-05f, -8.289118991e-04f, +1.817878219e-03f, +5.543021881e-04f, -3.325362902e-03f, +5.942008484e-04f, +4.255446328e-03f, -2.273592021e-03f, -4.038623874e-03f, +3.687647608e-03f, +2.736331043e-03f, -4.103421853e-03f, -1.025012954e-03f, +3.355507321e-03f, -2.699831670e-04f, -1.934060794e-03f, +7.168217129e-04f, +1.410935625e-04f, +0.000000000e+00f, - /* 9, 9 (20) */ - +0.000000000e+00f, +6.542286714e-03f, -5.373535873e-03f, -1.843509226e-02f, +1.528443105e-02f, +4.084223245e-02f, -3.825718712e-02f, -9.109217043e-02f, +1.157952557e-01f, +4.416183132e-01f, +4.681248516e-01f, +1.583951737e-01f, -8.165693488e-02f, -5.204986308e-02f, +3.699177417e-02f, +2.160078523e-02f, -1.713954428e-02f, -8.070905056e-03f, +6.347945727e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.542286714e-03f, +1.070482784e-02f, +4.762138076e-03f, -2.396303589e-02f, +1.230440904e-03f, +3.596618725e-02f, -1.345615118e-02f, -4.051466837e-02f, +2.713261931e-02f, +3.485889080e-02f, -3.550474531e-02f, -2.181501936e-02f, +3.434697345e-02f, +7.911311127e-03f, -2.478732125e-02f, +1.010199063e-03f, +1.225056145e-02f, -6.347945727e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.900573920e-05f, +1.317998666e-03f, -3.037811469e-04f, -3.178491755e-03f, +1.162997631e-03f, +6.999182770e-03f, -2.946060927e-03f, -2.046628643e-02f, -1.529327634e-02f, +1.104171312e-02f, +2.191068978e-02f, +6.545787442e-03f, -6.640015713e-03f, -2.696800965e-03f, +3.064983760e-03f, +1.002410337e-03f, -1.348404080e-03f, -2.336873413e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.900573920e-05f, -9.242013737e-04f, +1.682794066e-03f, +8.229336740e-04f, -3.255488151e-03f, +1.640804861e-04f, +4.354810013e-03f, -1.787349647e-03f, -4.340730249e-03f, +3.291970818e-03f, +3.169715323e-03f, -3.899978195e-03f, -1.451113486e-03f, +3.344608893e-03f, +2.673251534e-05f, -2.029039572e-03f, +5.888302927e-04f, +2.336873413e-04f, +0.000000000e+00f, - /* 9,10 (20) */ - +0.000000000e+00f, +6.513280975e-03f, -4.055537208e-03f, -1.873887341e-02f, +1.210593930e-02f, +4.200523008e-02f, -3.125800435e-02f, -9.403823136e-02f, +9.532896923e-02f, +4.263250369e-01f, +4.791665647e-01f, +1.803058635e-01f, -7.511114744e-02f, -5.868987879e-02f, +3.429497321e-02f, +2.466576899e-02f, -1.613713394e-02f, -9.419309136e-03f, +6.114258385e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.513280975e-03f, +9.780626462e-03f, +6.444932142e-03f, -2.314010222e-02f, -2.025047247e-03f, +3.613026774e-02f, -9.101341168e-03f, -4.230201802e-02f, +2.279188906e-02f, +3.815086161e-02f, -3.233502999e-02f, -2.571499756e-02f, +3.289585996e-02f, +1.125592002e-02f, -2.476058873e-02f, -1.018840510e-03f, +1.283939174e-02f, -6.114258385e-03f, +0.000000000e+00f, - +0.000000000e+00f, -1.049421773e-04f, +1.278721601e-03f, -8.539466769e-05f, -3.146021181e-03f, +6.693784373e-04f, +6.970307785e-03f, -1.816068694e-03f, -1.977224565e-02f, -1.652498208e-02f, +9.468298227e-03f, +2.216038322e-02f, +7.788080402e-03f, -6.363137065e-03f, -3.208553736e-03f, +2.952378019e-03f, +1.241725370e-03f, -1.326026225e-03f, -3.300671283e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.049421773e-04f, -1.002068095e-03f, +1.531293906e-03f, +1.072882990e-03f, -3.147679232e-03f, -2.600427944e-04f, +4.400947177e-03f, -1.283708117e-03f, -4.590417198e-03f, +2.856330728e-03f, +3.568223206e-03f, -3.647024165e-03f, -1.867070858e-03f, +3.291866356e-03f, +3.322957519e-04f, -2.100734464e-03f, +4.461107716e-04f, +3.300671283e-04f, +0.000000000e+00f, - /* 9,11 (20) */ - +0.000000000e+00f, +6.408338798e-03f, -2.776815607e-03f, -1.882426808e-02f, +8.959918118e-03f, +4.267460852e-02f, -2.428769656e-02f, -9.585430005e-02f, +7.555672358e-02f, +4.098000548e-01f, +4.886348629e-01f, +2.024662467e-01f, -6.732306704e-02f, -6.505301586e-02f, +3.108641947e-02f, +2.761814701e-02f, -1.489540857e-02f, -1.074533536e-02f, +5.784191257e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.408338798e-03f, +8.778558367e-03f, +7.976226047e-03f, -2.206721923e-02f, -5.172726479e-03f, +3.587022494e-02f, -4.700393991e-03f, -4.358572614e-02f, +1.820147187e-02f, +4.100719234e-02f, -2.876680678e-02f, -2.936202172e-02f, +3.102878910e-02f, +1.454778638e-02f, -2.442829298e-02f, -3.119574974e-03f, +1.328550251e-02f, -5.784191257e-03f, +0.000000000e+00f, - +0.000000000e+00f, -1.739631518e-04f, +1.226871825e-03f, +1.222018290e-04f, -3.081426823e-03f, +1.924124300e-04f, +6.872836245e-03f, -7.335416634e-04f, -1.898333005e-02f, -1.765116942e-02f, +7.833006125e-03f, +2.228660632e-02f, +9.036757168e-03f, -6.004972042e-03f, -3.711360789e-03f, +2.801055134e-03f, +1.479824454e-03f, -1.286086734e-03f, -4.291621016e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.739631518e-04f, -1.062167007e-03f, +1.366006331e-03f, +1.301484781e-03f, -3.004182371e-03f, -6.730290238e-04f, +4.393967678e-03f, -7.689446821e-04f, -4.784798814e-03f, +2.385972924e-03f, +3.926735838e-03f, -3.347118162e-03f, -2.267496324e-03f, +3.197010802e-03f, +6.429417401e-04f, -2.147324128e-03f, +2.901018646e-04f, +4.291621016e-04f, +0.000000000e+00f, - /* 9,12 (20) */ - +0.000000000e+00f, +6.234375646e-03f, -1.549943782e-03f, -1.870206625e-02f, +5.878491295e-03f, +4.286702095e-02f, -1.741486032e-02f, -9.658784171e-02f, +5.657339353e-02f, +3.921488854e-01f, +4.964678690e-01f, +2.247528530e-01f, -5.828630987e-02f, -7.105798790e-02f, +2.737505868e-02f, +3.041920215e-02f, -1.341558412e-02f, -1.203142209e-02f, +5.355029155e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.234375646e-03f, +7.716391361e-03f, +9.342232379e-03f, -2.076573445e-02f, -8.176908850e-03f, +3.519719592e-02f, -3.064263128e-04f, -4.435467082e-02f, +1.341667305e-02f, +4.339316527e-02f, -2.484007094e-02f, -3.270913988e-02f, +2.876129278e-02f, +1.774479718e-02f, -2.378535124e-02f, -5.266899102e-03f, +1.357560438e-02f, -5.355029155e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.355965789e-04f, +1.163793327e-03f, +3.172038752e-04f, -2.986937624e-03f, -2.637304911e-04f, +6.710941652e-03f, +2.948858647e-04f, -1.810733321e-02f, -1.866540766e-02f, +6.146382679e-03f, +2.228612525e-02f, +1.028245231e-02f, -5.564913537e-03f, -4.199444278e-03f, +2.610808021e-03f, +1.713851191e-03f, -1.228068381e-03f, -5.298011884e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.355965789e-04f, -1.104425485e-03f, +1.189661705e-03f, +1.506430686e-03f, -2.827654824e-03f, -1.069967792e-03f, +4.334647802e-03f, -2.494281672e-04f, -4.921687844e-03f, +1.886585124e-03f, +4.240605369e-03f, -3.003441779e-03f, -2.647115524e-03f, +3.060319886e-03f, +9.547365390e-04f, -2.167279834e-03f, +1.224955005e-04f, +5.298011884e-04f, +0.000000000e+00f, - /* 9,13 (20) */ - +0.000000000e+00f, +5.998779067e-03f, -3.861504544e-04f, -1.838486237e-02f, +2.891553671e-03f, +4.260329046e-02f, -1.070391867e-02f, -9.629295585e-02f, +3.846606032e-02f, +3.734834777e-01f, +5.026142517e-01f, +2.470389783e-01f, -4.800385756e-02f, -7.662290143e-02f, +2.317561441e-02f, +3.303001017e-02f, -1.170173293e-02f, -1.325949048e-02f, +4.825227967e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.998779067e-03f, +6.611965876e-03f, +1.053189408e-02f, -1.925930376e-02f, -1.100456367e-02f, +3.412722813e-02f, +4.028221489e-03f, -4.460409899e-02f, +8.494985209e-03f, +4.527975039e-02f, -2.059946557e-02f, -3.571258166e-02f, +2.611417726e-02f, +2.080511706e-02f, -2.283061470e-02f, -7.434178936e-03f, +1.369809988e-02f, -4.825227967e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.894969124e-04f, +1.090897733e-03f, +4.980390126e-04f, -2.865008256e-03f, -6.952737737e-04f, +6.489224694e-03f, +1.263223839e-03f, -1.715257729e-02f, -1.956215993e-02f, +4.419392787e-03f, +2.215664043e-02f, +1.151558473e-02f, -5.043072497e-03f, -4.666922131e-03f, +2.381853223e-03f, +1.940857592e-03f, -1.151653619e-03f, -6.307237808e-04f, +0.000000000e+00f, - +0.000000000e+00f, +2.894969124e-04f, -1.129034862e-03f, +1.005050600e-03f, +1.685791457e-03f, -2.621121064e-03f, -1.446238415e-03f, +4.224412441e-03f, +2.684631592e-04f, -4.999621530e-03f, +1.364225086e-03f, +4.505717359e-03f, -2.619764897e-03f, -3.000839505e-03f, +2.882624820e-03f, +1.263627068e-03f, -2.159396002e-03f, -5.477977168e-05f, +6.307237808e-04f, +0.000000000e+00f, - /* 9,14 (20) */ - +0.000000000e+00f, +5.709282155e-03f, +7.047472786e-04f, -1.788682336e-02f, +2.654541458e-05f, +4.190801668e-02f, -4.214693973e-03f, -9.502973201e-02f, +2.131348303e-02f, +3.539213178e-01f, +5.070336445e-01f, +2.691956187e-01f, -3.648827284e-02f, -8.166597393e-02f, +1.850869228e-02f, +3.541186339e-02f, -9.760875338e-03f, -1.441114409e-02f, +4.194504186e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.709282155e-03f, +5.482931014e-03f, +1.153694468e-02f, -1.757351231e-02f, -1.362568474e-02f, +3.268098971e-02f, +8.252633930e-03f, -4.433563583e-02f, +3.495363680e-03f, +4.664397548e-02f, -1.609374821e-02f, -3.833234656e-02f, +2.311333775e-02f, +2.368774188e-02f, -2.156698764e-02f, -9.593574938e-03f, +1.364332011e-02f, -4.194504186e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.354433505e-04f, +1.009643536e-03f, +6.633747179e-04f, -2.718282835e-03f, -1.098857458e-03f, +6.212656396e-03f, +2.166163411e-03f, -1.612783457e-02f, -2.033682242e-02f, +2.663331352e-03f, +2.189681661e-02f, +1.272643712e-02f, -4.440297880e-03f, -5.107863593e-03f, +2.114846329e-03f, +2.157834716e-03f, -1.056738260e-03f, -7.305921628e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.354433505e-04f, -1.136438274e-03f, +8.149825415e-04f, +1.838033290e-03f, -2.387924851e-03f, -1.797565315e-03f, +4.065308942e-03f, +7.784232553e-04f, -5.017877922e-03f, +8.252435984e-04f, +4.718546511e-03f, -2.200402671e-03f, -3.323834225e-03f, +2.665309927e-03f, +1.565493906e-03f, -2.122816887e-03f, -2.395794696e-04f, +7.305921628e-04f, +0.000000000e+00f, - /* 9,15 (20) */ - +0.000000000e+00f, +5.373838804e-03f, +1.714390814e-03f, -1.722344864e-02f, -2.691737420e-03f, +4.080915923e-02f, +1.997962422e-03f, -9.286356860e-02f, +5.185648460e-03f, +3.335844954e-01f, +5.096969759e-01f, +2.910924353e-01f, -2.376183572e-02f, -8.610627181e-02f, +1.340082868e-02f, +3.752670972e-02f, -7.603040623e-03f, -1.546788235e-02f, +3.463912023e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.373838804e-03f, +4.346492740e-03f, +1.235192723e-02f, -1.573547902e-02f, -1.601360959e-02f, +3.088342440e-02f, +1.231794287e-02f, -4.355721257e-02f, -1.522514243e-03f, +4.746921908e-02f, -1.137520170e-02f, -4.053274923e-02f, +1.978950353e-02f, +2.635305181e-02f, -2.000149373e-02f, -1.171639183e-02f, +1.340374064e-02f, -3.463912023e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.733364561e-04f, +9.215156544e-04f, +8.121231947e-04f, -2.549557925e-03f, -1.471556360e-03f, +5.886519257e-03f, +2.999106809e-03f, -1.504224609e-02f, -2.098575527e-02f, +8.897312000e-04f, +2.150630476e-02f, +1.390523808e-02f, -3.758189977e-03f, -5.516347003e-03f, +1.810893147e-03f, +2.361745277e-03f, -9.434430947e-04f, -8.280055545e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.733364561e-04f, -1.127315114e-03f, +6.222456531e-04f, +1.962028272e-03f, -2.131677941e-03f, -2.120067944e-03f, +3.859973064e-03f, +1.274298436e-03f, -4.976482491e-03f, +2.762035904e-04f, +4.876204970e-03f, -1.750164905e-03f, -3.611587590e-03f, +2.410304642e-03f, +1.856206199e-03f, -2.057058918e-03f, -4.295677572e-04f, +8.280055545e-04f, +0.000000000e+00f, - /* 10, 0 (16) */ - -3.437152571e-03f, -1.901474609e-02f, +2.119231534e-02f, +3.664783813e-02f, -7.368654585e-02f, -5.213951177e-02f, +3.060997433e-01f, +5.583321297e-01f, +3.060997433e-01f, -5.213951177e-02f, -7.368654585e-02f, +3.664783813e-02f, +2.119231534e-02f, -1.901474609e-02f, -3.437152571e-03f, +5.855084095e-03f, - +3.437152571e-03f, +5.279848880e-03f, -2.388172578e-02f, +1.041424938e-02f, +2.992755760e-02f, -3.533425551e-02f, -1.391753772e-02f, +4.774542267e-02f, -1.391753772e-02f, -3.533425551e-02f, +2.992755760e-02f, +1.041424938e-02f, -2.388172578e-02f, +5.279848880e-03f, +8.082097966e-03f, -5.855084095e-03f, - +1.373010852e-03f, -3.046863589e-04f, -3.667099347e-03f, +3.106042361e-03f, +7.369777567e-03f, -1.215507318e-02f, -2.638250973e-02f, -1.165934790e-03f, +2.596223776e-02f, +1.376794766e-02f, -6.859079874e-03f, -3.766451313e-03f, +3.603234301e-03f, +5.875296536e-04f, -1.434368848e-03f, +2.057994592e-04f, - -1.373010852e-03f, +1.697714826e-03f, +5.634281965e-04f, -3.618378046e-03f, +2.156512678e-03f, +3.337640081e-03f, -5.034212769e-03f, -3.319322640e-04f, +5.260798186e-03f, -2.883316118e-03f, -2.627443187e-03f, +3.569445935e-03f, -2.257579891e-04f, -1.867299721e-03f, +1.071180540e-03f, -2.057994592e-04f, - /* 10, 1 (16) */ - -2.064141719e-03f, -1.931943245e-02f, +1.752521599e-02f, +3.975388049e-02f, -6.631676829e-02f, -6.429458495e-02f, +2.797172336e-01f, +5.571661949e-01f, +3.320619811e-01f, -3.837156411e-02f, -8.054562573e-02f, +3.288138682e-02f, +2.479554964e-02f, -1.842721644e-02f, -4.871521418e-03f, +6.060883554e-03f, - +2.064141719e-03f, +6.977563706e-03f, -2.331829758e-02f, +6.795871333e-03f, +3.208407028e-02f, -3.199661543e-02f, -1.895175049e-02f, +4.741349040e-02f, -8.656739535e-03f, -3.821757163e-02f, +2.730011442e-02f, +1.398369531e-02f, -2.410748377e-02f, +3.412549158e-03f, +9.153278505e-03f, -6.060883554e-03f, - +1.296317730e-03f, -3.501782856e-05f, -3.680340235e-03f, +2.442553666e-03f, +7.764132105e-03f, -1.052603445e-02f, -2.661536312e-02f, -3.488574950e-03f, +2.535470034e-02f, +1.534941132e-02f, -6.231472352e-03f, -4.415091081e-03f, +3.486782309e-03f, +8.802495447e-04f, -1.478357259e-03f, +1.267947382e-04f, - -1.296317730e-03f, +1.508861724e-03f, +8.808218865e-04f, -3.612910995e-03f, +1.663514904e-03f, +3.738401880e-03f, -4.737159306e-03f, -9.909240542e-04f, +5.413154414e-03f, -2.381556094e-03f, -3.068766793e-03f, +3.465483919e-03f, +1.274364829e-04f, -2.013929017e-03f, +9.828081602e-04f, -1.267947382e-04f, - /* 10, 2 (16) */ - -7.678239886e-04f, -1.935445028e-02f, +1.384487575e-02f, +4.219643416e-02f, -5.855263618e-02f, -7.482061940e-02f, +2.531018705e-01f, +5.536776200e-01f, +3.574166815e-01f, -2.302215280e-02f, -8.677709808e-02f, +2.846629574e-02f, +2.828233195e-02f, -1.754696689e-02f, -6.349878678e-03f, +6.187678292e-03f, - +7.678239886e-04f, +8.486425430e-03f, -2.243747570e-02f, +3.182960338e-03f, +3.374758519e-02f, -2.825821355e-02f, -2.368890980e-02f, +4.642256635e-02f, -3.243585121e-03f, -4.059912772e-02f, +2.423134762e-02f, +1.744917923e-02f, -2.398004729e-02f, +1.398620141e-03f, +1.013608667e-02f, -6.187678292e-03f, - +1.206433390e-03f, +2.185384103e-04f, -3.645480290e-03f, +1.784297311e-03f, +8.043912002e-03f, -8.895819829e-03f, -2.666235779e-02f, -5.783617872e-03f, +2.456178146e-02f, +1.688411413e-02f, -5.487636280e-03f, -5.042986279e-03f, +3.316394838e-03f, +1.179216799e-03f, -1.503089613e-03f, +3.813712907e-05f, - -1.206433390e-03f, +1.304614536e-03f, +1.173654098e-03f, -3.554506506e-03f, +1.156195444e-03f, +4.080355138e-03f, -4.374437030e-03f, -1.635372650e-03f, +5.488622149e-03f, -1.839279577e-03f, -3.473272968e-03f, +3.306721004e-03f, +4.910023555e-04f, -2.134173336e-03f, +8.717103820e-04f, -3.813712907e-05f, - /* 10, 3 (16) */ - +4.386094018e-04f, -1.913591187e-02f, +1.019939546e-02f, +4.398073147e-02f, -5.050872418e-02f, -8.371643923e-02f, +2.264395127e-01f, +5.478940021e-01f, +3.819784629e-01f, -6.138038667e-03f, -9.226473436e-02f, +2.342330946e-02f, +3.159872678e-02f, -1.636775009e-02f, -7.852968290e-03f, +6.225815421e-03f, - -4.386094018e-04f, +9.791039966e-03f, -2.126382160e-02f, -3.715461683e-04f, +3.490378063e-02f, -2.417785841e-02f, -2.806334683e-02f, +4.478719370e-02f, +2.245037028e-03f, -4.243840730e-02f, +2.075807466e-02f, +2.075590024e-02f, -2.348904493e-02f, -7.355531952e-04f, +1.100779705e-02f, -6.225815421e-03f, - +1.105572881e-03f, +4.534286433e-04f, -3.565544560e-03f, +1.139124392e-03f, +8.212029062e-03f, -7.279010530e-03f, -2.652673062e-02f, -8.032967803e-03f, +2.358709551e-02f, +1.835676138e-02f, -4.629533667e-03f, -5.640973860e-03f, +3.091385316e-03f, +1.480506938e-03f, -1.506865581e-03f, -5.936784234e-05f, - -1.105572881e-03f, +1.088961759e-03f, +1.438164344e-03f, -3.445415590e-03f, +6.423812380e-04f, +4.359204693e-03f, -3.951803513e-03f, -2.255831451e-03f, +5.485690578e-03f, -1.264099799e-03f, -3.834200007e-03f, +3.094261053e-03f, +8.594614010e-04f, -2.224930206e-03f, +7.387782004e-04f, +5.936784234e-05f, - /* 10, 4 (16) */ - +1.544182282e-03f, -1.868248322e-02f, +6.633850905e-03f, +4.511985586e-02f, -4.229669512e-02f, -9.099544976e-02f, +1.999127821e-01f, +5.398610343e-01f, +4.055655584e-01f, +1.221872271e-02f, -9.689426803e-02f, +1.778233560e-02f, +3.469011210e-02f, -1.488724315e-02f, -9.359833871e-03f, +6.166447579e-03f, - -1.544182282e-03f, +1.088000173e-02f, -1.982565726e-02f, -3.816961758e-03f, +3.554616187e-02f, -1.981865372e-02f, -3.201515034e-02f, +4.253136225e-02f, +7.730727605e-03f, -4.370250710e-02f, +1.692387465e-02f, +2.385016129e-02f, -2.262958353e-02f, -2.960483401e-03f, +1.174657525e-02f, -6.166447579e-03f, - +9.959848689e-04f, +6.674996743e-04f, -3.443996874e-03f, +5.143499871e-04f, +8.272468366e-03f, -5.689639005e-03f, -2.621334215e-02f, -1.021897905e-02f, +2.243596823e-02f, +1.975227473e-02f, -3.660426015e-03f, -6.199807221e-03f, +2.811769941e-03f, +1.779942042e-03f, -1.488208160e-03f, -1.647048182e-04f, - -9.959848689e-04f, +8.659341333e-04f, +1.671163550e-03f, -3.288624868e-03f, +1.298566562e-04f, +4.571662285e-03f, -3.475880282e-03f, -2.843222957e-03f, +5.404026108e-03f, -6.642118430e-04f, -4.145349247e-03f, +2.830083735e-03f, +1.227092741e-03f, -2.283489269e-03f, +5.853424824e-04f, +1.647048182e-04f, - /* 10, 5 (16) */ - +2.540167151e-03f, -1.801498355e-02f, +3.189854030e-03f, +4.563420585e-02f, -3.402422675e-02f, -9.668508876e-02f, +1.736994399e-01f, +5.296420553e-01f, +4.280015266e-01f, +3.197099744e-02f, -1.005546940e-01f, +1.158252838e-02f, +3.750188204e-02f, -1.310730111e-02f, -1.084804203e-02f, +6.001742761e-03f, - -2.540167151e-03f, +1.174593586e-02f, -1.815449371e-02f, -7.105586627e-03f, +3.567601852e-02f, -1.524699144e-02f, -3.549103062e-02f, +3.968813929e-02f, +1.313475371e-02f, -4.436671894e-02f, +1.277852540e-02f, +2.668024503e-02f, -2.140249079e-02f, -5.243972670e-03f, +1.233191773e-02f, -6.001742761e-03f, - +8.799154532e-04f, +8.590090941e-04f, -3.284673771e-03f, -8.331262053e-05f, +8.230207923e-03f, -4.141056237e-03f, -2.572860642e-02f, -1.232462896e-02f, +2.111539928e-02f, +2.105595376e-02f, -2.584878483e-03f, -6.710264990e-03f, +2.478300795e-03f, +2.073138191e-03f, -1.445899238e-03f, -2.766535061e-04f, - -8.799154532e-04f, +6.395339990e-04f, +1.870070197e-03f, -3.087792026e-03f, -3.737577831e-04f, +4.715485707e-03f, -2.954045395e-03f, -3.388978098e-03f, +5.244482628e-03f, -4.827050689e-05f, -4.401191852e-03f, +2.517031008e-03f, +1.588021768e-03f, -2.307592522e-03f, +4.131663641e-04f, +2.766535061e-04f, - /* 10, 6 (16) */ - +3.420082604e-03f, -1.715597445e-02f, -9.481974021e-05f, +4.555089323e-02f, -2.579401883e-02f, -1.008261450e-01f, +1.479708335e-01f, +5.173174263e-01f, +4.491169259e-01f, +5.302695120e-02f, -1.031395725e-01f, +4.872263389e-03f, +3.998018284e-02f, -1.103416292e-02f, -1.229394127e-02f, +5.725089255e-03f, - -3.420082604e-03f, +1.238546986e-02f, -1.628442351e-02f, -1.019337865e-02f, +3.530226074e-02f, -1.053150573e-02f, -3.844507602e-02f, +3.629916119e-02f, +1.837923634e-02f, -4.441498945e-02f, +8.377333551e-03f, +2.919727603e-02f, -1.981446902e-02f, -7.551565192e-03f, +1.274508409e-02f, -5.725089255e-03f, - +7.595737874e-04f, +1.026629236e-03f, -3.091716275e-03f, -6.478079279e-04f, +8.091129199e-03f, -2.645809247e-03f, -2.508040511e-02f, -1.433368394e-02f, +1.963400658e-02f, +2.225363607e-02f, -1.408749087e-03f, -7.163263256e-03f, +2.092490520e-03f, +2.355558081e-03f, -1.379012919e-03f, -3.937972918e-04f, - -7.595737874e-04f, +4.136673415e-04f, +2.032935304e-03f, -2.847171698e-03f, -8.611220933e-04f, +4.789500958e-03f, -2.394314759e-03f, -3.885167418e-03f, +5.009093069e-03f, +5.747402513e-04f, -4.596966294e-03f, +2.158779134e-03f, +1.936313892e-03f, -2.295488393e-03f, +2.244293821e-04f, +3.937972918e-04f, - /* 10, 7 (16) */ - +4.179656392e-03f, -1.612934522e-02f, -3.186536016e-03f, +4.490308530e-02f, -1.770288963e-02f, -1.034719542e-01f, +1.228904284e-01f, +5.029837424e-01f, +4.687509325e-01f, +7.528058728e-02f, -1.045483216e-01f, -2.290999867e-03f, +4.207267336e-02f, -8.678604841e-03f, -1.367295419e-02f, +5.331291963e-03f, - -4.179656392e-03f, +1.279913720e-02f, -1.425148820e-02f, -1.304055035e-02f, +3.444113865e-02f, -5.742004771e-03f, -4.083939078e-02f, +3.241399377e-02f, +2.338832941e-02f, -4.384024920e-02f, +3.780367257e-03f, +3.135605517e-02f, -1.787815513e-02f, -9.847053586e-03f, +1.296951348e-02f, -5.331291963e-03f, - +6.370999718e-04f, +1.169445024e-03f, -2.869500537e-03f, -1.173784016e-03f, +7.861919836e-03f, -1.215530076e-03f, -2.427798699e-02f, -1.623085673e-02f, +1.800195312e-02f, +2.333185413e-02f, -1.391627105e-04f, -7.549969926e-03f, +1.656627930e-03f, +2.622568288e-03f, -1.286946006e-03f, -5.145355992e-04f, - -6.370999718e-04f, +1.920796517e-04f, +2.158456113e-03f, -2.571533189e-03f, -1.325287071e-03f, +4.793607227e-03f, -1.805214179e-03f, -4.324622019e-03f, +4.701042344e-03f, +1.195644242e-03f, -4.728764801e-03f, +1.759796409e-03f, +2.266071590e-03f, -2.245978505e-03f, +2.170337449e-05f, +5.145355992e-04f, - /* 10, 8 (16) */ - +4.816756364e-03f, -1.495990019e-02f, -6.056036552e-03f, +4.372930128e-02f, -9.840969792e-03f, -1.046874843e-01f, +9.861244141e-02f, +4.867528856e-01f, +4.867528856e-01f, +9.861244141e-02f, -1.046874843e-01f, -9.840969792e-03f, +4.372930128e-02f, -6.056036552e-03f, -1.495990019e-02f, +4.816756364e-03f, - -4.816756364e-03f, +1.299121685e-02f, -1.209303209e-02f, -1.561208354e-02f, +3.311585158e-02f, -9.483975441e-04f, -4.264460496e-02f, +2.808937175e-02f, +2.808937175e-02f, -4.264460496e-02f, -9.483975441e-04f, +3.311585158e-02f, -1.561208354e-02f, -1.209303209e-02f, +1.299121685e-02f, -4.816756364e-03f, - +5.145355992e-04f, +1.286946006e-03f, -2.622568288e-03f, -1.656627930e-03f, +7.549969926e-03f, +1.391627105e-04f, -2.333185413e-02f, -1.800195312e-02f, +1.623085673e-02f, +2.427798699e-02f, +1.215530076e-03f, -7.861919836e-03f, +1.173784016e-03f, +2.869500537e-03f, -1.169445024e-03f, -6.370999718e-04f, - -5.145355992e-04f, -2.170337449e-05f, +2.245978505e-03f, -2.266071590e-03f, -1.759796409e-03f, +4.728764801e-03f, -1.195644242e-03f, -4.701042344e-03f, +4.324622019e-03f, +1.805214179e-03f, -4.793607227e-03f, +1.325287071e-03f, +2.571533189e-03f, -2.158456113e-03f, -1.920796517e-04f, +6.370999718e-04f, - /* 10, 9 (16) */ - +5.331291963e-03f, -1.367295419e-02f, -8.678604841e-03f, +4.207267336e-02f, -2.290999867e-03f, -1.045483216e-01f, +7.528058728e-02f, +4.687509325e-01f, +5.029837424e-01f, +1.228904284e-01f, -1.034719542e-01f, -1.770288963e-02f, +4.490308530e-02f, -3.186536016e-03f, -1.612934522e-02f, +4.179656392e-03f, - -5.331291963e-03f, +1.296951348e-02f, -9.847053586e-03f, -1.787815513e-02f, +3.135605517e-02f, +3.780367257e-03f, -4.384024920e-02f, +2.338832941e-02f, +3.241399377e-02f, -4.083939078e-02f, -5.742004771e-03f, +3.444113865e-02f, -1.304055035e-02f, -1.425148820e-02f, +1.279913720e-02f, -4.179656392e-03f, - +3.937972918e-04f, +1.379012919e-03f, -2.355558081e-03f, -2.092490520e-03f, +7.163263256e-03f, +1.408749087e-03f, -2.225363607e-02f, -1.963400658e-02f, +1.433368394e-02f, +2.508040511e-02f, +2.645809247e-03f, -8.091129199e-03f, +6.478079279e-04f, +3.091716275e-03f, -1.026629236e-03f, -7.595737874e-04f, - -3.937972918e-04f, -2.244293821e-04f, +2.295488393e-03f, -1.936313892e-03f, -2.158779134e-03f, +4.596966294e-03f, -5.747402513e-04f, -5.009093069e-03f, +3.885167418e-03f, +2.394314759e-03f, -4.789500958e-03f, +8.611220933e-04f, +2.847171698e-03f, -2.032935304e-03f, -4.136673415e-04f, +7.595737874e-04f, - /* 10,10 (16) */ - +5.725089255e-03f, -1.229394127e-02f, -1.103416292e-02f, +3.998018284e-02f, +4.872263389e-03f, -1.031395725e-01f, +5.302695120e-02f, +4.491169259e-01f, +5.173174263e-01f, +1.479708335e-01f, -1.008261450e-01f, -2.579401883e-02f, +4.555089323e-02f, -9.481974021e-05f, -1.715597445e-02f, +3.420082604e-03f, - -5.725089255e-03f, +1.274508409e-02f, -7.551565192e-03f, -1.981446902e-02f, +2.919727603e-02f, +8.377333551e-03f, -4.441498945e-02f, +1.837923634e-02f, +3.629916119e-02f, -3.844507602e-02f, -1.053150573e-02f, +3.530226074e-02f, -1.019337865e-02f, -1.628442351e-02f, +1.238546986e-02f, -3.420082604e-03f, - +2.766535061e-04f, +1.445899238e-03f, -2.073138191e-03f, -2.478300795e-03f, +6.710264990e-03f, +2.584878483e-03f, -2.105595376e-02f, -2.111539928e-02f, +1.232462896e-02f, +2.572860642e-02f, +4.141056237e-03f, -8.230207923e-03f, +8.331262053e-05f, +3.284673771e-03f, -8.590090941e-04f, -8.799154532e-04f, - -2.766535061e-04f, -4.131663641e-04f, +2.307592522e-03f, -1.588021768e-03f, -2.517031008e-03f, +4.401191852e-03f, +4.827050689e-05f, -5.244482628e-03f, +3.388978098e-03f, +2.954045395e-03f, -4.715485707e-03f, +3.737577831e-04f, +3.087792026e-03f, -1.870070197e-03f, -6.395339990e-04f, +8.799154532e-04f, - /* 10,11 (16) */ - +6.001742761e-03f, -1.084804203e-02f, -1.310730111e-02f, +3.750188204e-02f, +1.158252838e-02f, -1.005546940e-01f, +3.197099744e-02f, +4.280015266e-01f, +5.296420553e-01f, +1.736994399e-01f, -9.668508876e-02f, -3.402422675e-02f, +4.563420585e-02f, +3.189854030e-03f, -1.801498355e-02f, +2.540167151e-03f, - -6.001742761e-03f, +1.233191773e-02f, -5.243972670e-03f, -2.140249079e-02f, +2.668024503e-02f, +1.277852540e-02f, -4.436671894e-02f, +1.313475371e-02f, +3.968813929e-02f, -3.549103062e-02f, -1.524699144e-02f, +3.567601852e-02f, -7.105586627e-03f, -1.815449371e-02f, +1.174593586e-02f, -2.540167151e-03f, - +1.647048182e-04f, +1.488208160e-03f, -1.779942042e-03f, -2.811769941e-03f, +6.199807221e-03f, +3.660426015e-03f, -1.975227473e-02f, -2.243596823e-02f, +1.021897905e-02f, +2.621334215e-02f, +5.689639005e-03f, -8.272468366e-03f, -5.143499871e-04f, +3.443996874e-03f, -6.674996743e-04f, -9.959848689e-04f, - -1.647048182e-04f, -5.853424824e-04f, +2.283489269e-03f, -1.227092741e-03f, -2.830083735e-03f, +4.145349247e-03f, +6.642118430e-04f, -5.404026108e-03f, +2.843222957e-03f, +3.475880282e-03f, -4.571662285e-03f, -1.298566562e-04f, +3.288624868e-03f, -1.671163550e-03f, -8.659341333e-04f, +9.959848689e-04f, - /* 10,12 (16) */ - +6.166447579e-03f, -9.359833871e-03f, -1.488724315e-02f, +3.469011210e-02f, +1.778233560e-02f, -9.689426803e-02f, +1.221872271e-02f, +4.055655584e-01f, +5.398610343e-01f, +1.999127821e-01f, -9.099544976e-02f, -4.229669512e-02f, +4.511985586e-02f, +6.633850905e-03f, -1.868248322e-02f, +1.544182282e-03f, - -6.166447579e-03f, +1.174657525e-02f, -2.960483401e-03f, -2.262958353e-02f, +2.385016129e-02f, +1.692387465e-02f, -4.370250710e-02f, +7.730727605e-03f, +4.253136225e-02f, -3.201515034e-02f, -1.981865372e-02f, +3.554616187e-02f, -3.816961758e-03f, -1.982565726e-02f, +1.088000173e-02f, -1.544182282e-03f, - +5.936784234e-05f, +1.506865581e-03f, -1.480506938e-03f, -3.091385316e-03f, +5.640973860e-03f, +4.629533667e-03f, -1.835676138e-02f, -2.358709551e-02f, +8.032967803e-03f, +2.652673062e-02f, +7.279010530e-03f, -8.212029062e-03f, -1.139124392e-03f, +3.565544560e-03f, -4.534286433e-04f, -1.105572881e-03f, - -5.936784234e-05f, -7.387782004e-04f, +2.224930206e-03f, -8.594614010e-04f, -3.094261053e-03f, +3.834200007e-03f, +1.264099799e-03f, -5.485690578e-03f, +2.255831451e-03f, +3.951803513e-03f, -4.359204693e-03f, -6.423812380e-04f, +3.445415590e-03f, -1.438164344e-03f, -1.088961759e-03f, +1.105572881e-03f, - /* 10,13 (16) */ - +6.225815421e-03f, -7.852968290e-03f, -1.636775009e-02f, +3.159872678e-02f, +2.342330946e-02f, -9.226473436e-02f, -6.138038667e-03f, +3.819784629e-01f, +5.478940021e-01f, +2.264395127e-01f, -8.371643923e-02f, -5.050872418e-02f, +4.398073147e-02f, +1.019939546e-02f, -1.913591187e-02f, +4.386094018e-04f, - -6.225815421e-03f, +1.100779705e-02f, -7.355531952e-04f, -2.348904493e-02f, +2.075590024e-02f, +2.075807466e-02f, -4.243840730e-02f, +2.245037028e-03f, +4.478719370e-02f, -2.806334683e-02f, -2.417785841e-02f, +3.490378063e-02f, -3.715461683e-04f, -2.126382160e-02f, +9.791039966e-03f, -4.386094018e-04f, - -3.813712907e-05f, +1.503089613e-03f, -1.179216799e-03f, -3.316394838e-03f, +5.042986279e-03f, +5.487636280e-03f, -1.688411413e-02f, -2.456178146e-02f, +5.783617872e-03f, +2.666235779e-02f, +8.895819829e-03f, -8.043912002e-03f, -1.784297311e-03f, +3.645480290e-03f, -2.185384103e-04f, -1.206433390e-03f, - +3.813712907e-05f, -8.717103820e-04f, +2.134173336e-03f, -4.910023555e-04f, -3.306721004e-03f, +3.473272968e-03f, +1.839279577e-03f, -5.488622149e-03f, +1.635372650e-03f, +4.374437030e-03f, -4.080355138e-03f, -1.156195444e-03f, +3.554506506e-03f, -1.173654098e-03f, -1.304614536e-03f, +1.206433390e-03f, - /* 10,14 (16) */ - +6.187678292e-03f, -6.349878678e-03f, -1.754696689e-02f, +2.828233195e-02f, +2.846629574e-02f, -8.677709808e-02f, -2.302215280e-02f, +3.574166815e-01f, +5.536776200e-01f, +2.531018705e-01f, -7.482061940e-02f, -5.855263618e-02f, +4.219643416e-02f, +1.384487575e-02f, -1.935445028e-02f, -7.678239886e-04f, - -6.187678292e-03f, +1.013608667e-02f, +1.398620141e-03f, -2.398004729e-02f, +1.744917923e-02f, +2.423134762e-02f, -4.059912772e-02f, -3.243585121e-03f, +4.642256635e-02f, -2.368890980e-02f, -2.825821355e-02f, +3.374758519e-02f, +3.182960338e-03f, -2.243747570e-02f, +8.486425430e-03f, +7.678239886e-04f, - -1.267947382e-04f, +1.478357259e-03f, -8.802495447e-04f, -3.486782309e-03f, +4.415091081e-03f, +6.231472352e-03f, -1.534941132e-02f, -2.535470034e-02f, +3.488574950e-03f, +2.661536312e-02f, +1.052603445e-02f, -7.764132105e-03f, -2.442553666e-03f, +3.680340235e-03f, +3.501782856e-05f, -1.296317730e-03f, - +1.267947382e-04f, -9.828081602e-04f, +2.013929017e-03f, -1.274364829e-04f, -3.465483919e-03f, +3.068766793e-03f, +2.381556094e-03f, -5.413154414e-03f, +9.909240542e-04f, +4.737159306e-03f, -3.738401880e-03f, -1.663514904e-03f, +3.612910995e-03f, -8.808218865e-04f, -1.508861724e-03f, +1.296317730e-03f, - /* 10,15 (16) */ - +6.060883554e-03f, -4.871521418e-03f, -1.842721644e-02f, +2.479554964e-02f, +3.288138682e-02f, -8.054562573e-02f, -3.837156411e-02f, +3.320619811e-01f, +5.571661949e-01f, +2.797172336e-01f, -6.429458495e-02f, -6.631676829e-02f, +3.975388049e-02f, +1.752521599e-02f, -1.931943245e-02f, -2.064141719e-03f, - -6.060883554e-03f, +9.153278505e-03f, +3.412549158e-03f, -2.410748377e-02f, +1.398369531e-02f, +2.730011442e-02f, -3.821757163e-02f, -8.656739535e-03f, +4.741349040e-02f, -1.895175049e-02f, -3.199661543e-02f, +3.208407028e-02f, +6.795871333e-03f, -2.331829758e-02f, +6.977563706e-03f, +2.064141719e-03f, - -2.057994592e-04f, +1.434368848e-03f, -5.875296536e-04f, -3.603234301e-03f, +3.766451313e-03f, +6.859079874e-03f, -1.376794766e-02f, -2.596223776e-02f, +1.165934790e-03f, +2.638250973e-02f, +1.215507318e-02f, -7.369777567e-03f, -3.106042361e-03f, +3.667099347e-03f, +3.046863589e-04f, -1.373010852e-03f, - +2.057994592e-04f, -1.071180540e-03f, +1.867299721e-03f, +2.257579891e-04f, -3.569445935e-03f, +2.627443187e-03f, +2.883316118e-03f, -5.260798186e-03f, +3.319322640e-04f, +5.034212769e-03f, -3.337640081e-03f, -2.156512678e-03f, +3.618378046e-03f, -5.634281965e-04f, -1.697714826e-03f, +1.373010852e-03f, - /* 11, 0 (16) */ - +0.000000000e+00f, -1.373489721e-02f, -2.689410444e-03f, +4.706208751e-02f, -4.375898825e-02f, -8.747376728e-02f, +2.921822056e-01f, +6.060775524e-01f, +2.921822056e-01f, -8.747376728e-02f, -4.375898825e-02f, +4.706208751e-02f, -2.689410444e-03f, -1.373489721e-02f, +4.644945395e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.011444094e-02f, -1.842243900e-02f, -1.779232024e-03f, +3.398287415e-02f, -2.895666372e-02f, -1.839498342e-02f, +4.774542267e-02f, -1.839498342e-02f, -2.895666372e-02f, +3.398287415e-02f, -1.779232024e-03f, -1.842243900e-02f, +1.011444094e-02f, +1.888764174e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.393028468e-03f, -3.103671150e-03f, -5.123356853e-04f, +9.526290245e-03f, -8.817433098e-03f, -3.141672250e-02f, -1.497867054e-03f, +3.122303595e-02f, +1.088463154e-02f, -9.486523061e-03f, -1.970053778e-04f, +3.377476312e-03f, -1.279770068e-03f, -3.631883083e-04f, +0.000000000e+00f, - +0.000000000e+00f, +5.869534826e-04f, +1.703849036e-03f, -3.419435378e-03f, +8.241988134e-04f, +4.217903305e-03f, -5.015090271e-03f, -3.703013835e-04f, +5.339761045e-03f, -3.828408216e-03f, -1.384871449e-03f, +3.568009575e-03f, -1.478927867e-03f, -8.075414587e-04f, +9.254561391e-04f, +0.000000000e+00f, - /* 11, 1 (16) */ - +0.000000000e+00f, -1.234186874e-02f, -5.793081594e-03f, +4.654975183e-02f, -3.423269800e-02f, -9.629120038e-02f, +2.607654831e-01f, +6.045796853e-01f, +3.234052416e-01f, -7.658913574e-02f, -5.324551131e-02f, +4.686508213e-02f, +6.880658674e-04f, -1.501466728e-02f, +4.281757087e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.070139442e-02f, -1.671858996e-02f, -5.198667402e-03f, +3.480707296e-02f, -2.473876041e-02f, -2.341007369e-02f, +4.737512128e-02f, -1.305522237e-02f, -3.278507193e-02f, +3.259800270e-02f, +1.788777551e-03f, -1.990136686e-02f, +9.306899477e-03f, +2.814220313e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.473843895e-03f, -2.799518348e-03f, -1.170357329e-03f, +9.427647009e-03f, -6.787632568e-03f, -3.135252243e-02f, -4.479499004e-03f, +3.076785475e-02f, +1.296785522e-02f, -9.300239145e-03f, -9.496071616e-04f, +3.614218792e-03f, -1.133679473e-03f, -4.955490992e-04f, +0.000000000e+00f, - +0.000000000e+00f, +3.693349051e-04f, +1.889986898e-03f, -3.219904145e-03f, +2.634404758e-04f, +4.534070137e-03f, -4.612902675e-03f, -1.104819373e-03f, +5.580993592e-03f, -3.371018553e-03f, -1.935919095e-03f, +3.661385682e-03f, -1.217656810e-03f, -1.026887972e-03f, +9.662693161e-04f, +0.000000000e+00f, - /* 11, 2 (16) */ - +0.000000000e+00f, -1.086802485e-02f, -8.592599943e-03f, +4.537939450e-02f, -2.480505099e-02f, -1.030788329e-01f, +2.294129607e-01f, +6.001001863e-01f, +3.541730963e-01f, -6.362128052e-02f, -6.254575045e-02f, +4.591547497e-02f, +4.302284659e-03f, -1.614834675e-02f, +3.786207988e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.107072932e-02f, -1.482860306e-02f, -8.418571547e-03f, +3.507051344e-02f, -2.020469027e-02f, -2.802297636e-02f, +4.627030191e-02f, -7.474228782e-03f, -3.615609049e-02f, +3.066208360e-02f, +5.450163233e-03f, -2.111902367e-02f, +8.280011505e-03f, +3.780489629e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.523152946e-03f, -2.471826192e-03f, -1.770209195e-03f, +9.200107445e-03f, -4.815464692e-03f, -3.103679482e-02f, -7.418990522e-03f, +3.005040361e-02f, +1.504483455e-02f, -8.960909248e-03f, -1.736265275e-03f, +3.807397193e-03f, -9.549565371e-04f, -6.313792306e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.586325199e-04f, +2.035708755e-03f, -2.974424362e-03f, -2.880677725e-04f, +4.772793788e-03f, -4.140384955e-03f, -1.821188280e-03f, +5.734243111e-03f, -2.852408566e-03f, -2.467766205e-03f, +3.696190222e-03f, -9.232520779e-04f, -1.240593602e-03f, +9.893364223e-04f, +0.000000000e+00f, - /* 11, 3 (16) */ - +0.000000000e+00f, -9.344871900e-03f, -1.106442614e-02f, +4.360918530e-02f, -1.560494355e-02f, -1.078942976e-01f, +1.983761659e-01f, +5.926811958e-01f, +3.842234999e-01f, -4.857644597e-02f, -7.150665970e-02f, +4.417920970e-02f, +8.109681852e-03f, -1.710330329e-02f, +3.154828757e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.122936184e-02f, -1.279289431e-02f, -1.139299591e-02f, +3.478244567e-02f, -1.543189649e-02f, -3.216336132e-02f, +4.444911363e-02f, -1.739985670e-03f, -3.900849905e-02f, +2.819431740e-02f, +9.146353455e-03f, -2.204227575e-02f, +7.039417904e-03f, +4.769826052e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.542390402e-03f, -2.127380216e-03f, -2.306291198e-03f, +8.854410300e-03f, -2.919805837e-03f, -3.047853414e-02f, -1.028879925e-02f, +2.907278609e-02f, +1.709266158e-02f, -8.463733673e-03f, -2.546712806e-03f, +3.950846717e-03f, -7.444232685e-04f, -7.680873803e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.153819788e-05f, +2.140184639e-03f, -2.688660184e-03f, -8.213540304e-04f, +4.931331812e-03f, -3.605856087e-03f, -2.507657643e-03f, +5.796428894e-03f, -2.280391569e-03f, -2.970972036e-03f, +3.670003615e-03f, -5.996787195e-04f, -1.444152827e-03f, +9.928392635e-04f, +0.000000000e+00f, - /* 11, 4 (16) */ - +0.000000000e+00f, -7.802481498e-03f, -1.319180635e-02f, +4.130289410e-02f, -6.750533249e-03f, -1.108141035e-01f, +1.678976317e-01f, +5.823923965e-01f, +4.132962860e-01f, -3.148378439e-02f, -7.997039338e-02f, +4.163249689e-02f, +1.206052857e-02f, -1.784772656e-02f, +2.386741377e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.118782365e-02f, -1.065270967e-02f, -1.408165609e-02f, +3.396109164e-02f, -1.050056467e-02f, -3.576921741e-02f, +4.194145599e-02f, +4.056443223e-03f, -4.128889062e-02f, +2.522334536e-02f, +1.281635707e-02f, -2.264195447e-02f, +5.595265077e-03f, +5.762665315e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.533433808e-03f, -1.772833324e-03f, -2.774274881e-03f, +8.402325022e-03f, -1.117976720e-03f, -2.968922244e-02f, -1.306220201e-02f, +2.783999434e-02f, +1.908806289e-02f, -7.805775261e-03f, -3.369723486e-03f, +4.038862682e-03f, -5.035472270e-04f, -9.028656780e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.279509957e-04f, +2.203373835e-03f, -2.368810453e-03f, -1.327960997e-03f, +5.008342813e-03f, -3.018615167e-03f, -3.152993768e-03f, +5.765996237e-03f, -1.663796722e-03f, -3.436402410e-03f, +3.581430694e-03f, -2.516008226e-04f, -1.633041947e-03f, +9.752919577e-04f, +0.000000000e+00f, - /* 11, 5 (16) */ - +0.000000000e+00f, -6.269047690e-03f, -1.496463967e-02f, +3.852861922e-02f, +1.651791773e-03f, -1.119320802e-01f, +1.382084093e-01f, +5.693301945e-01f, +4.411362804e-01f, -1.239572150e-02f, -8.777616864e-02f, +3.826277341e-02f, +1.609939125e-02f, -1.835127378e-02f, +1.483875699e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.095987265e-02f, -8.449335833e-03f, -1.645046655e-02f, +3.263313064e-02f, -5.492221861e-03f, -3.878783257e-02f, +3.878846222e-02f, +9.822439460e-03f, -4.295268734e-02f, +2.178694295e-02f, +1.639778776e-02f, -2.289355529e-02f, +3.962223130e-03f, +6.737957273e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.498543093e-03f, -1.414603574e-03f, -3.171104647e-03f, +7.856450140e-03f, +5.744294695e-04f, -2.868265182e-02f, -1.571360705e-02f, +2.635988190e-02f, +2.100768326e-02f, -6.986070336e-03f, -4.193233982e-03f, +4.066322563e-03f, -2.344543316e-04f, -1.032732874e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.978165350e-04f, +2.225996651e-03f, -2.021480993e-03f, -1.800084393e-03f, +5.003889648e-03f, -2.388772976e-03f, -3.746673306e-03f, +5.642951548e-03f, -1.012326124e-03f, -3.855398949e-03f, +3.430153677e-03f, +1.156835838e-04f, -1.802810808e-03f, +9.355912052e-04f, +0.000000000e+00f, - /* 11, 6 (16) */ - +0.000000000e+00f, -4.770504597e-03f, -1.637924325e-02f, +3.535751458e-02f, +9.508241913e-03f, -1.113576507e-01f, +1.095257575e-01f, +5.536165875e-01f, +4.674961623e-01f, +8.611961754e-03f, -9.476223897e-02f, +3.406953942e-02f, +2.016571381e-02f, -1.858572811e-02f, +4.511428248e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.056205612e-02f, -6.223339182e-03f, -1.847194754e-02f, +3.083304625e-02f, -4.883322131e-04f, -4.117660555e-02f, +3.504178891e-02f, +1.546539101e-02f, -4.396501347e-02f, +1.793154400e-02f, +1.982794144e-02f, -2.277787171e-02f, +2.159412322e-03f, +7.673548478e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.440296577e-03f, -1.058780971e-03f, -3.494979626e-03f, +7.230007106e-03f, +2.143691711e-03f, -2.747471986e-02f, -1.821885135e-02f, +2.464309965e-02f, +2.282837633e-02f, -6.005715381e-03f, -5.004484122e-03f, +4.028804412e-03f, +6.006968784e-05f, -1.154583537e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.488192447e-04f, +2.209492435e-03f, -1.653552784e-03f, -2.230696755e-03f, +4.919417533e-03f, -1.727070435e-03f, -4.279064017e-03f, +5.428869871e-03f, -3.363946391e-04f, -4.219942601e-03f, +3.216966189e-03f, +4.963220818e-04f, -1.949176543e-03f, +8.730602337e-04f, +0.000000000e+00f, - /* 11, 7 (16) */ - +0.000000000e+00f, -3.330208019e-03f, -1.743802422e-02f, +3.186253495e-02f, +1.673824902e-02f, -1.092139590e-01f, +8.205103762e-02f, +5.353977361e-01f, +4.921392619e-01f, +3.144033808e-02f, -1.007679544e-01f, +2.906505530e-02f, +2.419451823e-02f, -1.852565843e-02f, -7.034407121e-04f, +0.000000000e+00f, - +0.000000000e+00f, +1.001323687e-02f, -4.013846747e-03f, -2.012550032e-02f, +2.860234949e-02f, +4.431085319e-03f, -4.290367599e-02f, +3.076272489e-02f, +2.089426088e-02f, -4.430140811e-02f, +1.371160140e-02f, +2.304490763e-02f, -2.228154963e-02f, +2.102357789e-04f, +8.546608712e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.361524676e-03f, -7.110444233e-04f, -3.745317205e-03f, +6.536632766e-03f, +3.578077151e-03f, -2.608320117e-02f, -2.055547875e-02f, +2.270299547e-02f, +2.452749837e-02f, -4.867927512e-03f, -5.790173517e-03f, +3.922699520e-03f, +3.765897830e-04f, -1.265242631e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.791429583e-04f, +2.155965071e-03f, -1.272048600e-03f, -2.613654597e-03f, +4.757707776e-03f, -1.044687322e-03f, -4.741589444e-03f, +5.126874571e-03f, +3.530447981e-04f, -4.522808308e-03f, +2.943787263e-03f, +8.840007045e-04f, -2.068117455e-03f, +7.874852006e-04f, +0.000000000e+00f, - /* 11, 8 (16) */ - +0.000000000e+00f, -1.968683343e-03f, -1.814906864e-02f, +2.811721775e-02f, +2.327488178e-02f, -1.056358819e-01f, +5.596783645e-02f, +5.148422574e-01f, +5.148422574e-01f, +5.596783645e-02f, -1.056358819e-01f, +2.327488178e-02f, +2.811721775e-02f, -1.814906864e-02f, -1.968683343e-03f, +0.000000000e+00f, - +0.000000000e+00f, +9.334093912e-03f, -1.857881676e-03f, -2.139754892e-02f, +2.598869489e-02f, +9.188793095e-03f, -4.394836331e-02f, +2.602113545e-02f, +2.602113545e-02f, -4.394836331e-02f, +9.188793095e-03f, +2.598869489e-02f, -2.139754892e-02f, -1.857881676e-03f, +9.334093912e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.265242631e-03f, -3.765897830e-04f, -3.922699520e-03f, +5.790173517e-03f, +4.867927512e-03f, -2.452749837e-02f, -2.270299547e-02f, +2.055547875e-02f, +2.608320117e-02f, -3.578077151e-03f, -6.536632766e-03f, +3.745317205e-03f, +7.110444233e-04f, -1.361524676e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.874852006e-04f, +2.068117455e-03f, -8.840007045e-04f, -2.943787263e-03f, +4.522808308e-03f, -3.530447981e-04f, -5.126874571e-03f, +4.741589444e-03f, +1.044687322e-03f, -4.757707776e-03f, +2.613654597e-03f, +1.272048600e-03f, -2.155965071e-03f, +6.791429583e-04f, +0.000000000e+00f, - /* 11, 9 (16) */ - +0.000000000e+00f, -7.034407121e-04f, -1.852565843e-02f, +2.419451823e-02f, +2.906505530e-02f, -1.007679544e-01f, +3.144033808e-02f, +4.921392619e-01f, +5.353977361e-01f, +8.205103762e-02f, -1.092139590e-01f, +1.673824902e-02f, +3.186253495e-02f, -1.743802422e-02f, -3.330208019e-03f, +0.000000000e+00f, - +0.000000000e+00f, +8.546608712e-03f, +2.102357789e-04f, -2.228154963e-02f, +2.304490763e-02f, +1.371160140e-02f, -4.430140811e-02f, +2.089426088e-02f, +3.076272489e-02f, -4.290367599e-02f, +4.431085319e-03f, +2.860234949e-02f, -2.012550032e-02f, -4.013846747e-03f, +1.001323687e-02f, +0.000000000e+00f, - +0.000000000e+00f, +1.154583537e-03f, -6.006968784e-05f, -4.028804412e-03f, +5.004484122e-03f, +6.005715381e-03f, -2.282837633e-02f, -2.464309965e-02f, +1.821885135e-02f, +2.747471986e-02f, -2.143691711e-03f, -7.230007106e-03f, +3.494979626e-03f, +1.058780971e-03f, -1.440296577e-03f, +0.000000000e+00f, - +0.000000000e+00f, -8.730602337e-04f, +1.949176543e-03f, -4.963220818e-04f, -3.216966189e-03f, +4.219942601e-03f, +3.363946391e-04f, -5.428869871e-03f, +4.279064017e-03f, +1.727070435e-03f, -4.919417533e-03f, +2.230696755e-03f, +1.653552784e-03f, -2.209492435e-03f, +5.488192447e-04f, +0.000000000e+00f, - /* 11,10 (16) */ - +0.000000000e+00f, +4.511428248e-04f, -1.858572811e-02f, +2.016571381e-02f, +3.406953942e-02f, -9.476223897e-02f, +8.611961754e-03f, +4.674961623e-01f, +5.536165875e-01f, +1.095257575e-01f, -1.113576507e-01f, +9.508241913e-03f, +3.535751458e-02f, -1.637924325e-02f, -4.770504597e-03f, +0.000000000e+00f, - +0.000000000e+00f, +7.673548478e-03f, +2.159412322e-03f, -2.277787171e-02f, +1.982794144e-02f, +1.793154400e-02f, -4.396501347e-02f, +1.546539101e-02f, +3.504178891e-02f, -4.117660555e-02f, -4.883322131e-04f, +3.083304625e-02f, -1.847194754e-02f, -6.223339182e-03f, +1.056205612e-02f, +0.000000000e+00f, - +0.000000000e+00f, +1.032732874e-03f, +2.344543316e-04f, -4.066322563e-03f, +4.193233982e-03f, +6.986070336e-03f, -2.100768326e-02f, -2.635988190e-02f, +1.571360705e-02f, +2.868265182e-02f, -5.744294695e-04f, -7.856450140e-03f, +3.171104647e-03f, +1.414603574e-03f, -1.498543093e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.355912052e-04f, +1.802810808e-03f, -1.156835838e-04f, -3.430153677e-03f, +3.855398949e-03f, +1.012326124e-03f, -5.642951548e-03f, +3.746673306e-03f, +2.388772976e-03f, -5.003889648e-03f, +1.800084393e-03f, +2.021480993e-03f, -2.225996651e-03f, +3.978165350e-04f, +0.000000000e+00f, - /* 11,11 (16) */ - +0.000000000e+00f, +1.483875699e-03f, -1.835127378e-02f, +1.609939125e-02f, +3.826277341e-02f, -8.777616864e-02f, -1.239572150e-02f, +4.411362804e-01f, +5.693301945e-01f, +1.382084093e-01f, -1.119320802e-01f, +1.651791773e-03f, +3.852861922e-02f, -1.496463967e-02f, -6.269047690e-03f, +0.000000000e+00f, - +0.000000000e+00f, +6.737957273e-03f, +3.962223130e-03f, -2.289355529e-02f, +1.639778776e-02f, +2.178694295e-02f, -4.295268734e-02f, +9.822439460e-03f, +3.878846222e-02f, -3.878783257e-02f, -5.492221861e-03f, +3.263313064e-02f, -1.645046655e-02f, -8.449335833e-03f, +1.095987265e-02f, +0.000000000e+00f, - +0.000000000e+00f, +9.028656780e-04f, +5.035472270e-04f, -4.038862682e-03f, +3.369723486e-03f, +7.805775261e-03f, -1.908806289e-02f, -2.783999434e-02f, +1.306220201e-02f, +2.968922244e-02f, +1.117976720e-03f, -8.402325022e-03f, +2.774274881e-03f, +1.772833324e-03f, -1.533433808e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.752919577e-04f, +1.633041947e-03f, +2.516008226e-04f, -3.581430694e-03f, +3.436402410e-03f, +1.663796722e-03f, -5.765996237e-03f, +3.152993768e-03f, +3.018615167e-03f, -5.008342813e-03f, +1.327960997e-03f, +2.368810453e-03f, -2.203373835e-03f, +2.279509957e-04f, +0.000000000e+00f, - /* 11,12 (16) */ - +0.000000000e+00f, +2.386741377e-03f, -1.784772656e-02f, +1.206052857e-02f, +4.163249689e-02f, -7.997039338e-02f, -3.148378439e-02f, +4.132962860e-01f, +5.823923965e-01f, +1.678976317e-01f, -1.108141035e-01f, -6.750533249e-03f, +4.130289410e-02f, -1.319180635e-02f, -7.802481498e-03f, +0.000000000e+00f, - +0.000000000e+00f, +5.762665315e-03f, +5.595265077e-03f, -2.264195447e-02f, +1.281635707e-02f, +2.522334536e-02f, -4.128889062e-02f, +4.056443223e-03f, +4.194145599e-02f, -3.576921741e-02f, -1.050056467e-02f, +3.396109164e-02f, -1.408165609e-02f, -1.065270967e-02f, +1.118782365e-02f, +0.000000000e+00f, - +0.000000000e+00f, +7.680873803e-04f, +7.444232685e-04f, -3.950846717e-03f, +2.546712806e-03f, +8.463733673e-03f, -1.709266158e-02f, -2.907278609e-02f, +1.028879925e-02f, +3.047853414e-02f, +2.919805837e-03f, -8.854410300e-03f, +2.306291198e-03f, +2.127380216e-03f, -1.542390402e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.928392635e-04f, +1.444152827e-03f, +5.996787195e-04f, -3.670003615e-03f, +2.970972036e-03f, +2.280391569e-03f, -5.796428894e-03f, +2.507657643e-03f, +3.605856087e-03f, -4.931331812e-03f, +8.213540304e-04f, +2.688660184e-03f, -2.140184639e-03f, +4.153819788e-05f, +0.000000000e+00f, - /* 11,13 (16) */ - +0.000000000e+00f, +3.154828757e-03f, -1.710330329e-02f, +8.109681852e-03f, +4.417920970e-02f, -7.150665970e-02f, -4.857644597e-02f, +3.842234999e-01f, +5.926811958e-01f, +1.983761659e-01f, -1.078942976e-01f, -1.560494355e-02f, +4.360918530e-02f, -1.106442614e-02f, -9.344871900e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.769826052e-03f, +7.039417904e-03f, -2.204227575e-02f, +9.146353455e-03f, +2.819431740e-02f, -3.900849905e-02f, -1.739985670e-03f, +4.444911363e-02f, -3.216336132e-02f, -1.543189649e-02f, +3.478244567e-02f, -1.139299591e-02f, -1.279289431e-02f, +1.122936184e-02f, +0.000000000e+00f, - +0.000000000e+00f, +6.313792306e-04f, +9.549565371e-04f, -3.807397193e-03f, +1.736265275e-03f, +8.960909248e-03f, -1.504483455e-02f, -3.005040361e-02f, +7.418990522e-03f, +3.103679482e-02f, +4.815464692e-03f, -9.200107445e-03f, +1.770209195e-03f, +2.471826192e-03f, -1.523152946e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.893364223e-04f, +1.240593602e-03f, +9.232520779e-04f, -3.696190222e-03f, +2.467766205e-03f, +2.852408566e-03f, -5.734243111e-03f, +1.821188280e-03f, +4.140384955e-03f, -4.772793788e-03f, +2.880677725e-04f, +2.974424362e-03f, -2.035708755e-03f, -1.586325199e-04f, +0.000000000e+00f, - /* 11,14 (16) */ - +0.000000000e+00f, +3.786207988e-03f, -1.614834675e-02f, +4.302284659e-03f, +4.591547497e-02f, -6.254575045e-02f, -6.362128052e-02f, +3.541730963e-01f, +6.001001863e-01f, +2.294129607e-01f, -1.030788329e-01f, -2.480505099e-02f, +4.537939450e-02f, -8.592599943e-03f, -1.086802485e-02f, +0.000000000e+00f, - +0.000000000e+00f, +3.780489629e-03f, +8.280011505e-03f, -2.111902367e-02f, +5.450163233e-03f, +3.066208360e-02f, -3.615609049e-02f, -7.474228782e-03f, +4.627030191e-02f, -2.802297636e-02f, -2.020469027e-02f, +3.507051344e-02f, -8.418571547e-03f, -1.482860306e-02f, +1.107072932e-02f, +0.000000000e+00f, - +0.000000000e+00f, +4.955490992e-04f, +1.133679473e-03f, -3.614218792e-03f, +9.496071616e-04f, +9.300239145e-03f, -1.296785522e-02f, -3.076785475e-02f, +4.479499004e-03f, +3.135252243e-02f, +6.787632568e-03f, -9.427647009e-03f, +1.170357329e-03f, +2.799518348e-03f, -1.473843895e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.662693161e-04f, +1.026887972e-03f, +1.217656810e-03f, -3.661385682e-03f, +1.935919095e-03f, +3.371018553e-03f, -5.580993592e-03f, +1.104819373e-03f, +4.612902675e-03f, -4.534070137e-03f, -2.634404758e-04f, +3.219904145e-03f, -1.889986898e-03f, -3.693349051e-04f, +0.000000000e+00f, - /* 11,15 (16) */ - +0.000000000e+00f, +4.281757087e-03f, -1.501466728e-02f, +6.880658674e-04f, +4.686508213e-02f, -5.324551131e-02f, -7.658913574e-02f, +3.234052416e-01f, +6.045796853e-01f, +2.607654831e-01f, -9.629120038e-02f, -3.423269800e-02f, +4.654975183e-02f, -5.793081594e-03f, -1.234186874e-02f, +0.000000000e+00f, - +0.000000000e+00f, +2.814220313e-03f, +9.306899477e-03f, -1.990136686e-02f, +1.788777551e-03f, +3.259800270e-02f, -3.278507193e-02f, -1.305522237e-02f, +4.737512128e-02f, -2.341007369e-02f, -2.473876041e-02f, +3.480707296e-02f, -5.198667402e-03f, -1.671858996e-02f, +1.070139442e-02f, +0.000000000e+00f, - +0.000000000e+00f, +3.631883083e-04f, +1.279770068e-03f, -3.377476312e-03f, +1.970053778e-04f, +9.486523061e-03f, -1.088463154e-02f, -3.122303595e-02f, +1.497867054e-03f, +3.141672250e-02f, +8.817433098e-03f, -9.526290245e-03f, +5.123356853e-04f, +3.103671150e-03f, -1.393028468e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.254561391e-04f, +8.075414587e-04f, +1.478927867e-03f, -3.568009575e-03f, +1.384871449e-03f, +3.828408216e-03f, -5.339761045e-03f, +3.703013835e-04f, +5.015090271e-03f, -4.217903305e-03f, -8.241988134e-04f, +3.419435378e-03f, -1.703849036e-03f, -5.869534826e-04f, +0.000000000e+00f, - /* 12, 0 (16) */ - +0.000000000e+00f, -3.620456273e-03f, -2.111184944e-02f, +4.528285549e-02f, -9.776114099e-03f, -1.164304310e-01f, +2.737872222e-01f, +6.538229750e-01f, +2.737872222e-01f, -1.164304310e-01f, -9.776114099e-03f, +4.528285549e-02f, -2.111184944e-02f, -3.620456273e-03f, +6.533709569e-03f, +0.000000000e+00f, - +0.000000000e+00f, +3.620456273e-03f, +1.387619818e-03f, -2.260808244e-02f, +3.336683490e-02f, -1.281591977e-02f, -2.715932523e-02f, +4.774542267e-02f, -2.715932523e-02f, -1.281591977e-02f, +3.336683490e-02f, -2.260808244e-02f, +1.387619818e-03f, +8.420160123e-03f, -6.533709569e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.979981950e-03f, -1.399822114e-03f, -3.931771063e-03f, +1.035048906e-02f, -4.599529793e-03f, -3.643181277e-02f, -1.868168438e-03f, +3.656279700e-02f, +7.056223323e-03f, -1.087139451e-02f, +3.371004197e-03f, +1.898548445e-03f, -2.087311526e-03f, +5.622678308e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.979981950e-03f, +2.584053438e-03f, -1.458373355e-03f, -2.286117262e-03f, +5.648692980e-03f, -4.731620858e-03f, -4.561504540e-04f, +5.292642204e-03f, -5.494367629e-03f, +1.684930446e-03f, +1.974767750e-03f, -2.745993195e-03f, +1.468985553e-03f, -5.622678308e-04f, +0.000000000e+00f, - /* 12, 1 (16) */ - +0.000000000e+00f, -1.640474323e-03f, -2.251167155e-02f, +4.135108443e-02f, +5.743749596e-04f, -1.210299608e-01f, +2.373554094e-01f, +6.519548066e-01f, +3.103500192e-01f, -1.093742077e-01f, -2.064750861e-02f, +4.865385969e-02f, -1.921330100e-02f, -5.707767800e-03f, +7.095977400e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.640474323e-03f, +3.971673256e-03f, -2.406645579e-02f, +3.108071764e-02f, -7.167226794e-03f, -3.189094609e-02f, +4.728927221e-02f, -2.186668303e-02f, -1.831028740e-02f, +3.505176535e-02f, -2.063331469e-02f, -1.358373377e-03f, +9.889145676e-03f, -7.095977400e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.843178801e-03f, -9.095314506e-04f, -4.390261474e-03f, +9.691087485e-03f, -2.253562431e-03f, -3.596542511e-02f, -5.584318377e-03f, +3.634884835e-02f, +9.596836670e-03f, -1.123615824e-02f, +2.711778521e-03f, +2.396561982e-03f, -2.160567445e-03f, +4.707202169e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.843178801e-03f, +2.374554586e-03f, -9.300309354e-04f, -2.826869422e-03f, +5.689376211e-03f, -4.082457079e-03f, -1.359283642e-03f, +5.753503758e-03f, -5.227811881e-03f, +1.034457934e-03f, +2.467645188e-03f, -2.854632541e-03f, +1.336650224e-03f, -4.707202169e-04f, +0.000000000e+00f, - /* 12, 2 (16) */ - +0.000000000e+00f, +2.027044775e-04f, -2.342120300e-02f, +3.696082295e-02f, +1.026546244e-02f, -1.232835232e-01f, +2.013899843e-01f, +6.463704882e-01f, +3.466988675e-01f, -9.977737101e-02f, -3.188366685e-02f, +5.136563821e-02f, -1.681673901e-02f, -7.868335245e-03f, +7.566697617e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.027044775e-04f, +6.346227842e-03f, -2.499648673e-02f, +2.825384822e-02f, -1.477850584e-03f, -3.597340317e-02f, +4.592998857e-02f, -1.611317927e-02f, -2.353809929e-02f, +3.608622328e-02f, -1.816566950e-02f, -4.213005918e-03f, +1.122579590e-02f, -7.566697617e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.681785466e-03f, -4.361174373e-04f, -4.744633558e-03f, +8.912039673e-03f, -4.267090354e-05f, -3.517717977e-02f, -9.240178803e-03f, +3.578464672e-02f, +1.219242599e-02f, -1.142867545e-02f, +1.959924946e-03f, +2.884145115e-03f, -2.195550139e-03f, +3.579571916e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.681785466e-03f, +2.124083205e-03f, -4.012189313e-04f, -3.297552255e-03f, +5.617376388e-03f, -3.358891424e-03f, -2.235106267e-03f, +6.104177201e-03f, -4.852810648e-03f, +3.471508423e-04f, +2.925604708e-03f, -2.905241137e-03f, +1.164283587e-03f, -3.579571916e-04f, +0.000000000e+00f, - /* 12, 3 (16) */ - +0.000000000e+00f, +1.884489944e-03f, -2.385732044e-02f, +3.221618939e-02f, +1.917750212e-02f, -1.233261941e-01f, +1.662128046e-01f, +6.371303094e-01f, +3.824835143e-01f, -8.758494502e-02f, -4.331234230e-02f, +5.332556315e-02f, -1.393259390e-02f, -1.006388538e-02f, +7.924654809e-03f, +0.000000000e+00f, - +0.000000000e+00f, -1.884489944e-03f, +8.470311047e-03f, -2.539770566e-02f, +2.495629596e-02f, +4.139525804e-03f, -3.933229459e-02f, +4.369488230e-02f, -1.000900207e-02f, -2.839090993e-02f, +3.643337413e-02f, -1.524006479e-02f, -7.118247055e-03f, +1.239007949e-02f, -7.924654809e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.500852204e-03f, +1.280442282e-05f, -4.994951383e-03f, +8.033056270e-03f, +2.011525976e-03f, -3.408439022e-02f, -1.279645690e-02f, +3.486921498e-02f, +1.481227001e-02f, -1.143470571e-02f, +1.123290809e-03f, +3.351167997e-03f, -2.188576095e-03f, +2.247518832e-04f, +0.000000000e+00f, - +0.000000000e+00f, -1.500852204e-03f, +1.839891100e-03f, +1.169244753e-04f, -3.690220277e-03f, +5.435969863e-03f, -2.576086649e-03f, -3.066049075e-03f, +6.336847858e-03f, -4.375472659e-03f, -3.634827903e-04f, +3.337674673e-03f, -2.894246643e-03f, +9.539861005e-04f, -2.247518832e-04f, +0.000000000e+00f, - /* 12, 4 (16) */ - +0.000000000e+00f, +3.385342148e-03f, -2.384451602e-02f, +2.722123801e-02f, +2.721055839e-02f, -1.213146682e-01f, +1.321284143e-01f, +6.243338525e-01f, +4.173527292e-01f, -7.277267501e-02f, -5.474704801e-02f, +5.444885396e-02f, -1.058142590e-02f, -1.225246148e-02f, +8.149406692e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.385342148e-03f, +1.031020215e-02f, -2.528078118e-02f, +2.126607569e-02f, +9.575495667e-03f, -4.190838124e-02f, +4.062883323e-02f, -3.672154211e-03f, -3.276638259e-02f, +3.606989134e-02f, -1.190239012e-02f, -1.001249370e-02f, +1.334406559e-02f, -8.149406692e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.305482812e-03f, +4.305405109e-04f, -5.143085334e-03f, +7.074364025e-03f, +3.890366093e-03f, -3.270783760e-02f, -1.621519577e-02f, +3.360599057e-02f, +1.742426617e-02f, -1.124217767e-02f, +2.117072082e-04f, +3.787261859e-03f, -2.136589174e-03f, +7.242627967e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.305482812e-03f, +1.529705674e-03f, +6.138369571e-04f, -3.998751648e-03f, +5.150647482e-03f, -1.750298308e-03f, -3.835484876e-03f, +6.446092918e-03f, -3.804129816e-03f, -1.083151379e-03f, +3.693571014e-03f, -2.819358928e-03f, +7.088882412e-04f, -7.242627967e-05f, +0.000000000e+00f, - /* 12, 5 (16) */ - +0.000000000e+00f, +4.690824960e-03f, -2.341397551e-02f, +2.207815268e-02f, +3.428492241e-02f, -1.174243021e-01f, +9.942057673e-02f, +6.081186568e-01f, +4.509587198e-01f, -5.534840884e-02f, -6.598922568e-02f, +5.466056117e-02f, -6.794164042e-03f, -1.438905065e-02f, +8.221832972e-03f, +0.000000000e+00f, - +0.000000000e+00f, -4.690824960e-03f, +1.183990782e-02f, -2.466694423e-02f, +1.726732404e-02f, +1.472614315e-02f, -4.365867955e-02f, +3.679334835e-02f, +2.773938707e-03f, -3.657051241e-02f, +3.498673996e-02f, -8.208819102e-03f, -1.283185263e-02f, +1.405295383e-02f, -8.221832972e-03f, +0.000000000e+00f, - +0.000000000e+00f, +1.100726558e-03f, +8.113930777e-04f, -5.192585640e-03f, +6.056365747e-03f, +5.578319117e-03f, -3.107142480e-02f, -1.946028036e-02f, +3.200283345e-02f, +1.999535713e-02f, -1.084146928e-02f, -7.630803057e-04f, +4.182006147e-03f, -2.037265139e-03f, -9.714166871e-05f, +0.000000000e+00f, - +0.000000000e+00f, -1.100726558e-03f, +1.201535403e-03f, +1.079748438e-03f, -4.218939941e-03f, +4.768965380e-03f, -8.985243634e-04f, -4.528076476e-03f, +6.429009114e-03f, -3.149186900e-03f, -1.797075635e-03f, +3.983946298e-03f, -2.679667835e-03f, +4.331157460e-04f, +9.714166871e-05f, +0.000000000e+00f, - /* 12, 6 (16) */ - +0.000000000e+00f, +5.791551518e-03f, -2.260258243e-02f, +1.688556704e-02f, +4.034128816e-02f, -1.118459829e-01f, +6.834915193e-02f, +5.886583764e-01f, +4.829615533e-01f, -3.535305171e-02f, -7.683069497e-02f, +5.389748086e-02f, -2.612157895e-03f, -1.642631579e-02f, +8.124691303e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.791551518e-03f, +1.304144322e-02f, -2.358719579e-02f, +1.304838410e-02f, +1.949510853e-02f, -4.455720391e-02f, +3.226527188e-02f, +9.202947821e-03f, -3.971969931e-02f, +3.318966432e-02f, -4.224872805e-03f, -1.551152046e-02f, +1.448606958e-02f, -8.124691303e-03f, +0.000000000e+00f, - +0.000000000e+00f, +8.914773328e-04f, +1.150711463e-03f, -5.148532409e-03f, +4.999310351e-03f, +7.063109243e-03f, -2.920179030e-02f, -2.249791537e-02f, +3.007196952e-02f, +2.249198169e-02f, -1.022565798e-02f, -1.787517933e-03f, +4.525126494e-03f, -1.889106856e-03f, -2.815233033e-04f, +0.000000000e+00f, - +0.000000000e+00f, -8.914773328e-04f, +8.634751685e-04f, +1.505873829e-03f, -4.348541982e-03f, +4.300353269e-03f, -3.814160103e-05f, -5.130096486e-03f, +6.285286814e-03f, -2.422924447e-03f, -2.490300577e-03f, +4.200623641e-03f, -2.475711368e-03f, +1.317288329e-04f, +2.815233033e-04f, +0.000000000e+00f, - /* 12, 7 (16) */ - +0.000000000e+00f, +6.683028851e-03f, -2.145187097e-02f, +1.173703463e-02f, +4.534059851e-02f, -1.047828737e-01f, +3.914736163e-02f, +5.661604610e-01f, +5.130335228e-01f, -1.286107003e-02f, -8.705635295e-02f, +5.210996293e-02f, +1.912968599e-03f, -1.831542265e-02f, +7.843168000e-03f, +0.000000000e+00f, - +0.000000000e+00f, -6.683028851e-03f, +1.390491839e-02f, -2.208132196e-02f, +8.699842117e-03f, +2.379546180e-02f, -4.459534551e-02f, +2.713517539e-02f, +1.548823464e-02f, -4.214262376e-02f, +3.069936375e-02f, -2.424916377e-05f, -1.798723183e-02f, +1.461779841e-02f, -7.843168000e-03f, +0.000000000e+00f, - +0.000000000e+00f, +6.823817179e-04f, +1.444920648e-03f, -5.017365805e-03f, +3.922978168e-03f, +8.335784927e-03f, -2.712788849e-02f, -2.529706819e-02f, +2.782987004e-02f, +2.488054317e-02f, -9.390735819e-03f, -2.846386253e-03f, +4.806700225e-03f, -1.691527672e-03f, -4.777574306e-04f, +0.000000000e+00f, - +0.000000000e+00f, -6.823817179e-04f, +5.235160507e-04f, +1.884578276e-03f, -4.387281552e-03f, +3.755884995e-03f, +8.134631155e-04f, -5.629712099e-03f, +6.017228656e-03f, -1.639258644e-03f, -3.148016953e-03f, +4.336809729e-03f, -2.209511852e-03f, -1.893639647e-04f, +4.777574306e-04f, +0.000000000e+00f, - /* 12, 8 (16) */ - +0.000000000e+00f, +7.365410569e-03f, -2.000695032e-02f, +6.719668823e-03f, +4.926357668e-02f, -9.644708877e-02f, +1.201947314e-02f, +5.408633928e-01f, +5.408633928e-01f, +1.201947314e-02f, -9.644708877e-02f, +4.926357668e-02f, +6.719668823e-03f, -2.000695032e-02f, +7.365410569e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.365410569e-03f, +1.442843444e-02f, -2.019674368e-02f, +4.312560565e-03f, +2.755134679e-02f, -4.378188240e-02f, +2.150546329e-02f, +2.150546329e-02f, -4.378188240e-02f, +2.755134679e-02f, +4.312560565e-03f, -2.019674368e-02f, +1.442843444e-02f, -7.365410569e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.777574306e-04f, +1.691527672e-03f, -4.806700225e-03f, +2.846386253e-03f, +9.390735819e-03f, -2.488054317e-02f, -2.782987004e-02f, +2.529706819e-02f, +2.712788849e-02f, -8.335784927e-03f, -3.922978168e-03f, +5.017365805e-03f, -1.444920648e-03f, -6.823817179e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.777574306e-04f, +1.893639647e-04f, +2.209511852e-03f, -4.336809729e-03f, +3.148016953e-03f, +1.639258644e-03f, -6.017228656e-03f, +5.629712099e-03f, -8.134631155e-04f, -3.755884995e-03f, +4.387281552e-03f, -1.884578276e-03f, -5.235160507e-04f, +6.823817179e-04f, +0.000000000e+00f, - /* 12, 9 (16) */ - +0.000000000e+00f, +7.843168000e-03f, -1.831542265e-02f, +1.912968599e-03f, +5.210996293e-02f, -8.705635295e-02f, -1.286107003e-02f, +5.130335228e-01f, +5.661604610e-01f, +3.914736163e-02f, -1.047828737e-01f, +4.534059851e-02f, +1.173703463e-02f, -2.145187097e-02f, +6.683028851e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.843168000e-03f, +1.461779841e-02f, -1.798723183e-02f, -2.424916377e-05f, +3.069936375e-02f, -4.214262376e-02f, +1.548823464e-02f, +2.713517539e-02f, -4.459534551e-02f, +2.379546180e-02f, +8.699842117e-03f, -2.208132196e-02f, +1.390491839e-02f, -6.683028851e-03f, +0.000000000e+00f, - +0.000000000e+00f, +2.815233033e-04f, +1.889106856e-03f, -4.525126494e-03f, +1.787517933e-03f, +1.022565798e-02f, -2.249198169e-02f, -3.007196952e-02f, +2.249791537e-02f, +2.920179030e-02f, -7.063109243e-03f, -4.999310351e-03f, +5.148532409e-03f, -1.150711463e-03f, -8.914773328e-04f, +0.000000000e+00f, - +0.000000000e+00f, -2.815233033e-04f, -1.317288329e-04f, +2.475711368e-03f, -4.200623641e-03f, +2.490300577e-03f, +2.422924447e-03f, -6.285286814e-03f, +5.130096486e-03f, +3.814160103e-05f, -4.300353269e-03f, +4.348541982e-03f, -1.505873829e-03f, -8.634751685e-04f, +8.914773328e-04f, +0.000000000e+00f, - /* 12,10 (16) */ - +0.000000000e+00f, +8.124691303e-03f, -1.642631579e-02f, -2.612157895e-03f, +5.389748086e-02f, -7.683069497e-02f, -3.535305171e-02f, +4.829615533e-01f, +5.886583764e-01f, +6.834915193e-02f, -1.118459829e-01f, +4.034128816e-02f, +1.688556704e-02f, -2.260258243e-02f, +5.791551518e-03f, +0.000000000e+00f, - +0.000000000e+00f, -8.124691303e-03f, +1.448606958e-02f, -1.551152046e-02f, -4.224872805e-03f, +3.318966432e-02f, -3.971969931e-02f, +9.202947821e-03f, +3.226527188e-02f, -4.455720391e-02f, +1.949510853e-02f, +1.304838410e-02f, -2.358719579e-02f, +1.304144322e-02f, -5.791551518e-03f, +0.000000000e+00f, - +0.000000000e+00f, +9.714166871e-05f, +2.037265139e-03f, -4.182006147e-03f, +7.630803057e-04f, +1.084146928e-02f, -1.999535713e-02f, -3.200283345e-02f, +1.946028036e-02f, +3.107142480e-02f, -5.578319117e-03f, -6.056365747e-03f, +5.192585640e-03f, -8.113930777e-04f, -1.100726558e-03f, +0.000000000e+00f, - +0.000000000e+00f, -9.714166871e-05f, -4.331157460e-04f, +2.679667835e-03f, -3.983946298e-03f, +1.797075635e-03f, +3.149186900e-03f, -6.429009114e-03f, +4.528076476e-03f, +8.985243634e-04f, -4.768965380e-03f, +4.218939941e-03f, -1.079748438e-03f, -1.201535403e-03f, +1.100726558e-03f, +0.000000000e+00f, - /* 12,11 (16) */ - +0.000000000e+00f, +8.221832972e-03f, -1.438905065e-02f, -6.794164042e-03f, +5.466056117e-02f, -6.598922568e-02f, -5.534840884e-02f, +4.509587198e-01f, +6.081186568e-01f, +9.942057673e-02f, -1.174243021e-01f, +3.428492241e-02f, +2.207815268e-02f, -2.341397551e-02f, +4.690824960e-03f, +0.000000000e+00f, - +0.000000000e+00f, -8.221832972e-03f, +1.405295383e-02f, -1.283185263e-02f, -8.208819102e-03f, +3.498673996e-02f, -3.657051241e-02f, +2.773938707e-03f, +3.679334835e-02f, -4.365867955e-02f, +1.472614315e-02f, +1.726732404e-02f, -2.466694423e-02f, +1.183990782e-02f, -4.690824960e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.242627967e-05f, +2.136589174e-03f, -3.787261859e-03f, -2.117072082e-04f, +1.124217767e-02f, -1.742426617e-02f, -3.360599057e-02f, +1.621519577e-02f, +3.270783760e-02f, -3.890366093e-03f, -7.074364025e-03f, +5.143085334e-03f, -4.305405109e-04f, -1.305482812e-03f, +0.000000000e+00f, - +0.000000000e+00f, +7.242627967e-05f, -7.088882412e-04f, +2.819358928e-03f, -3.693571014e-03f, +1.083151379e-03f, +3.804129816e-03f, -6.446092918e-03f, +3.835484876e-03f, +1.750298308e-03f, -5.150647482e-03f, +3.998751648e-03f, -6.138369571e-04f, -1.529705674e-03f, +1.305482812e-03f, +0.000000000e+00f, - /* 12,12 (16) */ - +0.000000000e+00f, +8.149406692e-03f, -1.225246148e-02f, -1.058142590e-02f, +5.444885396e-02f, -5.474704801e-02f, -7.277267501e-02f, +4.173527292e-01f, +6.243338525e-01f, +1.321284143e-01f, -1.213146682e-01f, +2.721055839e-02f, +2.722123801e-02f, -2.384451602e-02f, +3.385342148e-03f, +0.000000000e+00f, - +0.000000000e+00f, -8.149406692e-03f, +1.334406559e-02f, -1.001249370e-02f, -1.190239012e-02f, +3.606989134e-02f, -3.276638259e-02f, -3.672154211e-03f, +4.062883323e-02f, -4.190838124e-02f, +9.575495667e-03f, +2.126607569e-02f, -2.528078118e-02f, +1.031020215e-02f, -3.385342148e-03f, +0.000000000e+00f, - +0.000000000e+00f, -2.247518832e-04f, +2.188576095e-03f, -3.351167997e-03f, -1.123290809e-03f, +1.143470571e-02f, -1.481227001e-02f, -3.486921498e-02f, +1.279645690e-02f, +3.408439022e-02f, -2.011525976e-03f, -8.033056270e-03f, +4.994951383e-03f, -1.280442282e-05f, -1.500852204e-03f, +0.000000000e+00f, - +0.000000000e+00f, +2.247518832e-04f, -9.539861005e-04f, +2.894246643e-03f, -3.337674673e-03f, +3.634827903e-04f, +4.375472659e-03f, -6.336847858e-03f, +3.066049075e-03f, +2.576086649e-03f, -5.435969863e-03f, +3.690220277e-03f, -1.169244753e-04f, -1.839891100e-03f, +1.500852204e-03f, +0.000000000e+00f, - /* 12,13 (16) */ - +0.000000000e+00f, +7.924654809e-03f, -1.006388538e-02f, -1.393259390e-02f, +5.332556315e-02f, -4.331234230e-02f, -8.758494502e-02f, +3.824835143e-01f, +6.371303094e-01f, +1.662128046e-01f, -1.233261941e-01f, +1.917750212e-02f, +3.221618939e-02f, -2.385732044e-02f, +1.884489944e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.924654809e-03f, +1.239007949e-02f, -7.118247055e-03f, -1.524006479e-02f, +3.643337413e-02f, -2.839090993e-02f, -1.000900207e-02f, +4.369488230e-02f, -3.933229459e-02f, +4.139525804e-03f, +2.495629596e-02f, -2.539770566e-02f, +8.470311047e-03f, -1.884489944e-03f, +0.000000000e+00f, - +0.000000000e+00f, -3.579571916e-04f, +2.195550139e-03f, -2.884145115e-03f, -1.959924946e-03f, +1.142867545e-02f, -1.219242599e-02f, -3.578464672e-02f, +9.240178803e-03f, +3.517717977e-02f, +4.267090354e-05f, -8.912039673e-03f, +4.744633558e-03f, +4.361174373e-04f, -1.681785466e-03f, +0.000000000e+00f, - +0.000000000e+00f, +3.579571916e-04f, -1.164283587e-03f, +2.905241137e-03f, -2.925604708e-03f, -3.471508423e-04f, +4.852810648e-03f, -6.104177201e-03f, +2.235106267e-03f, +3.358891424e-03f, -5.617376388e-03f, +3.297552255e-03f, +4.012189313e-04f, -2.124083205e-03f, +1.681785466e-03f, +0.000000000e+00f, - /* 12,14 (16) */ - +0.000000000e+00f, +7.566697617e-03f, -7.868335245e-03f, -1.681673901e-02f, +5.136563821e-02f, -3.188366685e-02f, -9.977737101e-02f, +3.466988675e-01f, +6.463704882e-01f, +2.013899843e-01f, -1.232835232e-01f, +1.026546244e-02f, +3.696082295e-02f, -2.342120300e-02f, +2.027044775e-04f, +0.000000000e+00f, - +0.000000000e+00f, -7.566697617e-03f, +1.122579590e-02f, -4.213005918e-03f, -1.816566950e-02f, +3.608622328e-02f, -2.353809929e-02f, -1.611317927e-02f, +4.592998857e-02f, -3.597340317e-02f, -1.477850584e-03f, +2.825384822e-02f, -2.499648673e-02f, +6.346227842e-03f, -2.027044775e-04f, +0.000000000e+00f, - +0.000000000e+00f, -4.707202169e-04f, +2.160567445e-03f, -2.396561982e-03f, -2.711778521e-03f, +1.123615824e-02f, -9.596836670e-03f, -3.634884835e-02f, +5.584318377e-03f, +3.596542511e-02f, +2.253562431e-03f, -9.691087485e-03f, +4.390261474e-03f, +9.095314506e-04f, -1.843178801e-03f, +0.000000000e+00f, - +0.000000000e+00f, +4.707202169e-04f, -1.336650224e-03f, +2.854632541e-03f, -2.467645188e-03f, -1.034457934e-03f, +5.227811881e-03f, -5.753503758e-03f, +1.359283642e-03f, +4.082457079e-03f, -5.689376211e-03f, +2.826869422e-03f, +9.300309354e-04f, -2.374554586e-03f, +1.843178801e-03f, +0.000000000e+00f, - /* 12,15 (16) */ - +0.000000000e+00f, +7.095977400e-03f, -5.707767800e-03f, -1.921330100e-02f, +4.865385969e-02f, -2.064750861e-02f, -1.093742077e-01f, +3.103500192e-01f, +6.519548066e-01f, +2.373554094e-01f, -1.210299608e-01f, +5.743749596e-04f, +4.135108443e-02f, -2.251167155e-02f, -1.640474323e-03f, +0.000000000e+00f, - +0.000000000e+00f, -7.095977400e-03f, +9.889145676e-03f, -1.358373377e-03f, -2.063331469e-02f, +3.505176535e-02f, -1.831028740e-02f, -2.186668303e-02f, +4.728927221e-02f, -3.189094609e-02f, -7.167226794e-03f, +3.108071764e-02f, -2.406645579e-02f, +3.971673256e-03f, +1.640474323e-03f, +0.000000000e+00f, - +0.000000000e+00f, -5.622678308e-04f, +2.087311526e-03f, -1.898548445e-03f, -3.371004197e-03f, +1.087139451e-02f, -7.056223323e-03f, -3.656279700e-02f, +1.868168438e-03f, +3.643181277e-02f, +4.599529793e-03f, -1.035048906e-02f, +3.931771063e-03f, +1.399822114e-03f, -1.979981950e-03f, +0.000000000e+00f, - +0.000000000e+00f, +5.622678308e-04f, -1.468985553e-03f, +2.745993195e-03f, -1.974767750e-03f, -1.684930446e-03f, +5.494367629e-03f, -5.292642204e-03f, +4.561504540e-04f, +4.731620858e-03f, -5.648692980e-03f, +2.286117262e-03f, +1.458373355e-03f, -2.584053438e-03f, +1.979981950e-03f, +0.000000000e+00f, - /* 13, 0 (12) */ - -1.972422962e-02f, +2.267477305e-02f, +2.359072080e-02f, -1.292463508e-01f, +2.466278970e-01f, +7.015683977e-01f, +2.466278970e-01f, -1.292463508e-01f, +2.359072080e-02f, +2.267477305e-02f, -1.972422962e-02f, +4.799703850e-03f, - +5.623298117e-03f, -2.233279642e-02f, +2.771214615e-02f, -6.222863232e-03f, -2.982427142e-02f, +4.774542267e-02f, -2.982427142e-02f, -6.222863232e-03f, +2.771214615e-02f, -2.233279642e-02f, +5.623298117e-03f, +3.049445224e-03f, - +1.184231324e-03f, -5.390144418e-03f, +8.064371797e-03f, +1.049163186e-03f, -4.116343363e-02f, -2.324318892e-03f, +4.185543920e-02f, +1.561855693e-03f, -9.186464064e-03f, +5.345771948e-03f, -8.474447504e-04f, -6.183259736e-04f, - +1.561188515e-03f, -2.121741000e-04f, -3.135764939e-03f, +5.747483122e-03f, -4.460474383e-03f, -4.909849421e-04f, +5.123770053e-03f, -5.739572450e-03f, +2.652101873e-03f, +7.139584264e-04f, -1.811553195e-03f, +1.074994695e-03f, - /* 13, 1 (12) */ - -1.853999830e-02f, +1.728462863e-02f, +3.165509260e-02f, -1.281971876e-01f, +2.054644633e-01f, +6.992440788e-01f, +2.884833362e-01f, -1.276844951e-01f, +1.440425674e-02f, +2.802054500e-02f, -2.057167437e-02f, +4.181377877e-03f, - +7.184486632e-03f, -2.254497052e-02f, +2.457638121e-02f, -4.753801099e-04f, -3.428474580e-02f, +4.725443772e-02f, -2.470050137e-02f, -1.196243568e-02f, +3.036424802e-02f, -2.161883800e-02f, +3.811744922e-03f, +4.124439920e-03f, - +1.465023136e-03f, -5.320292410e-03f, +6.864218062e-03f, +3.435813779e-03f, -4.004788218e-02f, -6.943602019e-03f, +4.210235210e-02f, +4.369024788e-03f, -1.020170031e-02f, +5.179423709e-03f, -4.580705590e-04f, -8.239172206e-04f, - +1.291087560e-03f, +2.707142018e-04f, -3.536453862e-03f, +5.633317814e-03f, -3.709661828e-03f, -1.462247758e-03f, +5.684120067e-03f, -5.607319388e-03f, +2.093921463e-03f, +1.223471859e-03f, -2.034388843e-03f, +1.095048359e-03f, - /* 13, 2 (12) */ - -1.707497516e-02f, +1.196433622e-02f, +3.851931066e-02f, -1.247613738e-01f, +1.654165812e-01f, +6.923004768e-01f, +3.305856883e-01f, -1.233154703e-01f, +4.202556435e-03f, +3.319996871e-02f, -2.102974493e-02f, +3.357460656e-03f, - +8.475574192e-03f, -2.227425632e-02f, +2.103992735e-02f, +5.157937705e-03f, -3.799440763e-02f, +4.579218997e-02f, -1.901638130e-02f, -1.756975507e-02f, +3.245816949e-02f, -2.039536614e-02f, +1.777356079e-03f, +5.219488278e-03f, - +1.687965768e-03f, -5.145852489e-03f, +5.614487418e-03f, +5.574705484e-03f, -3.853607120e-02f, -1.147528507e-02f, +4.188882392e-02f, +7.339615338e-03f, -1.108152461e-02f, +4.885529654e-03f, -2.109602172e-05f, -1.031266552e-03f, - +1.009122428e-03f, +7.244470526e-04f, -3.847864393e-03f, +5.402051594e-03f, -2.888573507e-03f, -2.401635327e-03f, +6.128281347e-03f, -5.351268396e-03f, +1.471688198e-03f, +1.728888211e-03f, -2.222199009e-03f, +1.084783716e-03f, - /* 13, 3 (12) */ - -1.538700940e-02f, +6.818483736e-03f, +4.413379808e-02f, -1.191866683e-01f, +1.268805100e-01f, +6.808251917e-01f, +3.724745122e-01f, -1.159758550e-01f, -6.878968176e-03f, +3.808549836e-02f, -2.105084095e-02f, +2.326194104e-03f, - +9.484696619e-03f, -2.154980927e-02f, +1.719206296e-02f, +1.055998930e-02f, -4.088298114e-02f, +4.339055464e-02f, -1.288809995e-02f, -2.292102347e-02f, +3.392985768e-02f, -1.866647793e-02f, -4.448429299e-04f, +6.304271994e-03f, - +1.852695523e-03f, -4.878026907e-03f, +4.342835993e-03f, +7.447495839e-03f, -3.666047687e-02f, -1.586250597e-02f, +4.120606284e-02f, +1.043679735e-02f, -1.179818850e-02f, +4.460965481e-03f, +4.569213542e-04f, -1.234589995e-03f, - +7.230348342e-04f, +1.139889429e-03f, -4.065933899e-03f, +5.061203430e-03f, -2.015850099e-03f, -3.288711431e-03f, +6.445521069e-03f, -4.974811001e-03f, +7.976759417e-04f, +2.217996040e-03f, -2.368001990e-03f, +1.041954536e-03f, - /* 13, 4 (12) */ - -1.353431387e-02f, +1.940456828e-03f, +4.847663407e-02f, -1.117391725e-01f, +9.022003309e-02f, +6.649626858e-01f, +4.136805750e-01f, -1.055390576e-01f, -1.867715668e-02f, +4.254646384e-02f, -2.059391960e-02f, +1.091604109e-03f, - +1.020773145e-02f, -2.040991984e-02f, +1.312612906e-02f, +1.562119273e-02f, -4.289883124e-02f, +4.010184321e-02f, -6.442578884e-03f, -2.789583447e-02f, +3.472753363e-02f, -1.644848189e-02f, -2.812844920e-03f, +7.346226530e-03f, - +1.960246185e-03f, -4.529248377e-03f, +3.075612377e-03f, +9.041013575e-03f, -3.445813591e-02f, -2.005068065e-02f, +4.005208349e-02f, +1.362013635e-02f, -1.232532905e-02f, +3.905278222e-03f, +9.679029306e-04f, -1.427700933e-03f, - +4.402390107e-04f, +1.509211753e-03f, -4.188873780e-03f, +4.620613922e-03f, -1.111089860e-03f, -4.104240237e-03f, +6.627884225e-03f, -4.484154052e-03f, +8.571990451e-05f, +2.678492060e-03f, -2.465544739e-03f, +9.651380799e-04f, - /* 13, 5 (12) */ - -1.157406769e-02f, -2.588791548e-03f, +5.155224645e-02f, -1.026981589e-01f, +5.576189718e-02f, +6.449120051e-01f, +4.537326585e-01f, -9.191892125e-02f, -3.100248573e-02f, +4.645174207e-02f, -1.962601667e-02f, -3.360968235e-04f, - +1.064797046e-02f, -1.890070809e-02f, +8.937255278e-03f, +2.024180665e-02f, -4.400992110e-02f, +3.599760297e-02f, +1.853053405e-04f, -3.237998852e-02f, +3.481325353e-02f, -1.376998983e-02f, -5.278389659e-03f, +8.311364610e-03f, - +2.012928481e-03f, -4.112837201e-03f, +1.837425806e-03f, +1.034728450e-02f, -3.196994916e-02f, -2.398835684e-02f, +3.843184257e-02f, +1.684617023e-02f, -1.263854492e-02f, +3.220865992e-03f, +1.502338312e-03f, -1.604149393e-03f, - +1.676420501e-04f, +1.826031572e-03f, -4.217145811e-03f, +4.092171844e-03f, -1.943883389e-04f, -4.830625910e-03f, +6.670397326e-03f, -3.888219826e-03f, -6.490759840e-04f, +3.098286887e-03f, -2.509506132e-03f, +8.538256948e-04f, - /* 13, 6 (12) */ - -9.561139207e-03f, -6.701628749e-03f, +5.338967226e-02f, -9.235087441e-02f, +2.379194802e-02f, +6.209236483e-01f, +4.921645011e-01f, -7.507275102e-02f, -4.364103065e-02f, +4.967260806e-02f, -1.812367836e-02f, -1.940246217e-03f, - +1.081561251e-02f, -1.707467651e-02f, +4.720109467e-03f, +2.433397849e-02f, -4.420430944e-02f, +3.116697706e-02f, +6.855702666e-03f, -3.626820835e-02f, +3.416417755e-02f, -1.067170294e-02f, -7.787895790e-03f, +9.165190305e-03f, - +2.014186632e-03f, -3.642658580e-03f, +6.507683685e-04f, +1.136346251e-02f, -2.923993190e-02f, -2.762801186e-02f, +3.635725634e-02f, +2.006905724e-02f, -1.271595856e-02f, +2.413105708e-03f, +2.049415126e-03f, -1.757378023e-03f, - -8.851409983e-05f, +2.085513525e-03f, -4.153384390e-03f, +3.489497026e-03f, +7.141289846e-04f, -5.452312891e-03f, +6.571202918e-03f, -3.198479453e-03f, -1.390669949e-03f, +3.465815504e-03f, -2.495683579e-03f, +7.084908599e-04f, - /* 13, 7 (12) */ - -7.546952575e-03f, -1.034428733e-02f, +5.404044063e-02f, -8.098741190e-02f, -5.447983881e-03f, +5.932956364e-01f, +5.285217574e-01f, -5.500369378e-02f, -5.635698920e-02f, +5.208571377e-02f, -1.607426323e-02f, -3.697624239e-03f, - +1.072709841e-02f, -1.498916299e-02f, +5.667250777e-04f, +2.782347552e-02f, -4.349018045e-02f, +2.571466417e-02f, +1.342690558e-02f, -3.946668780e-02f, +3.277350760e-02f, -7.205887438e-03f, -1.028357937e-02f, +9.873681165e-03f, - +1.968436699e-03f, -3.132787529e-03f, -4.643033836e-04f, +1.209166992e-02f, -2.631442538e-02f, -3.092678029e-02f, +3.384709869e-02f, +2.324128453e-02f, -1.253875277e-02f, +1.490423475e-03f, +2.597188372e-03f, -1.880891637e-03f, - -3.227855554e-04f, +2.284426396e-03f, -4.002268016e-03f, +2.827588058e-03f, +1.594769820e-03f, -5.956137318e-03f, +6.331621268e-03f, -2.428722834e-03f, -2.122444019e-03f, +3.770344500e-03f, -2.421157226e-03f, +5.306316939e-04f, - /* 13, 8 (12) */ - -5.578515876e-03f, -1.347707486e-02f, +5.357613724e-02f, -6.889574198e-02f, -3.176240926e-02f, +5.623688561e-01f, +5.623688561e-01f, -3.176240926e-02f, -6.889574198e-02f, +5.357613724e-02f, -1.347707486e-02f, -5.578515876e-03f, - +1.040431286e-02f, -1.270473659e-02f, -3.435542938e-03f, +3.065106358e-02f, -4.189541063e-02f, +1.975852685e-02f, +1.975852685e-02f, -4.189541063e-02f, +3.065106358e-02f, -3.435542938e-03f, -1.270473659e-02f, +1.040431286e-02f, - +1.880891637e-03f, -2.597188372e-03f, -1.490423475e-03f, +1.253875277e-02f, -2.324128453e-02f, -3.384709869e-02f, +3.092678029e-02f, +2.631442538e-02f, -1.209166992e-02f, +4.643033836e-04f, +3.132787529e-03f, -1.968436699e-03f, - -5.306316939e-04f, +2.421157226e-03f, -3.770344500e-03f, +2.122444019e-03f, +2.428722834e-03f, -6.331621268e-03f, +5.956137318e-03f, -1.594769820e-03f, -2.827588058e-03f, +4.002268016e-03f, -2.284426396e-03f, +3.227855554e-04f, - /* 13, 9 (12) */ - -3.697624239e-03f, -1.607426323e-02f, +5.208571377e-02f, -5.635698920e-02f, -5.500369378e-02f, +5.285217574e-01f, +5.932956364e-01f, -5.447983881e-03f, -8.098741190e-02f, +5.404044063e-02f, -1.034428733e-02f, -7.546952575e-03f, - +9.873681165e-03f, -1.028357937e-02f, -7.205887438e-03f, +3.277350760e-02f, -3.946668780e-02f, +1.342690558e-02f, +2.571466417e-02f, -4.349018045e-02f, +2.782347552e-02f, +5.667250777e-04f, -1.498916299e-02f, +1.072709841e-02f, - +1.757378023e-03f, -2.049415126e-03f, -2.413105708e-03f, +1.271595856e-02f, -2.006905724e-02f, -3.635725634e-02f, +2.762801186e-02f, +2.923993190e-02f, -1.136346251e-02f, -6.507683685e-04f, +3.642658580e-03f, -2.014186632e-03f, - -7.084908599e-04f, +2.495683579e-03f, -3.465815504e-03f, +1.390669949e-03f, +3.198479453e-03f, -6.571202918e-03f, +5.452312891e-03f, -7.141289846e-04f, -3.489497026e-03f, +4.153384390e-03f, -2.085513525e-03f, +8.851409983e-05f, - /* 13,10 (12) */ - -1.940246217e-03f, -1.812367836e-02f, +4.967260806e-02f, -4.364103065e-02f, -7.507275102e-02f, +4.921645011e-01f, +6.209236483e-01f, +2.379194802e-02f, -9.235087441e-02f, +5.338967226e-02f, -6.701628749e-03f, -9.561139207e-03f, - +9.165190305e-03f, -7.787895790e-03f, -1.067170294e-02f, +3.416417755e-02f, -3.626820835e-02f, +6.855702666e-03f, +3.116697706e-02f, -4.420430944e-02f, +2.433397849e-02f, +4.720109467e-03f, -1.707467651e-02f, +1.081561251e-02f, - +1.604149393e-03f, -1.502338312e-03f, -3.220865992e-03f, +1.263854492e-02f, -1.684617023e-02f, -3.843184257e-02f, +2.398835684e-02f, +3.196994916e-02f, -1.034728450e-02f, -1.837425806e-03f, +4.112837201e-03f, -2.012928481e-03f, - -8.538256948e-04f, +2.509506132e-03f, -3.098286887e-03f, +6.490759840e-04f, +3.888219826e-03f, -6.670397326e-03f, +4.830625910e-03f, +1.943883389e-04f, -4.092171844e-03f, +4.217145811e-03f, -1.826031572e-03f, -1.676420501e-04f, - /* 13,11 (12) */ - -3.360968235e-04f, -1.962601667e-02f, +4.645174207e-02f, -3.100248573e-02f, -9.191892125e-02f, +4.537326585e-01f, +6.449120051e-01f, +5.576189718e-02f, -1.026981589e-01f, +5.155224645e-02f, -2.588791548e-03f, -1.157406769e-02f, - +8.311364610e-03f, -5.278389659e-03f, -1.376998983e-02f, +3.481325353e-02f, -3.237998852e-02f, +1.853053405e-04f, +3.599760297e-02f, -4.400992110e-02f, +2.024180665e-02f, +8.937255278e-03f, -1.890070809e-02f, +1.064797046e-02f, - +1.427700933e-03f, -9.679029306e-04f, -3.905278222e-03f, +1.232532905e-02f, -1.362013635e-02f, -4.005208349e-02f, +2.005068065e-02f, +3.445813591e-02f, -9.041013575e-03f, -3.075612377e-03f, +4.529248377e-03f, -1.960246185e-03f, - -9.651380799e-04f, +2.465544739e-03f, -2.678492060e-03f, -8.571990451e-05f, +4.484154052e-03f, -6.627884225e-03f, +4.104240237e-03f, +1.111089860e-03f, -4.620613922e-03f, +4.188873780e-03f, -1.509211753e-03f, -4.402390107e-04f, - /* 13,12 (12) */ - +1.091604109e-03f, -2.059391960e-02f, +4.254646384e-02f, -1.867715668e-02f, -1.055390576e-01f, +4.136805750e-01f, +6.649626858e-01f, +9.022003309e-02f, -1.117391725e-01f, +4.847663407e-02f, +1.940456828e-03f, -1.353431387e-02f, - +7.346226530e-03f, -2.812844920e-03f, -1.644848189e-02f, +3.472753363e-02f, -2.789583447e-02f, -6.442578884e-03f, +4.010184321e-02f, -4.289883124e-02f, +1.562119273e-02f, +1.312612906e-02f, -2.040991984e-02f, +1.020773145e-02f, - +1.234589995e-03f, -4.569213542e-04f, -4.460965481e-03f, +1.179818850e-02f, -1.043679735e-02f, -4.120606284e-02f, +1.586250597e-02f, +3.666047687e-02f, -7.447495839e-03f, -4.342835993e-03f, +4.878026907e-03f, -1.852695523e-03f, - -1.041954536e-03f, +2.368001990e-03f, -2.217996040e-03f, -7.976759417e-04f, +4.974811001e-03f, -6.445521069e-03f, +3.288711431e-03f, +2.015850099e-03f, -5.061203430e-03f, +4.065933899e-03f, -1.139889429e-03f, -7.230348342e-04f, - /* 13,13 (12) */ - +2.326194104e-03f, -2.105084095e-02f, +3.808549836e-02f, -6.878968176e-03f, -1.159758550e-01f, +3.724745122e-01f, +6.808251917e-01f, +1.268805100e-01f, -1.191866683e-01f, +4.413379808e-02f, +6.818483736e-03f, -1.538700940e-02f, - +6.304271994e-03f, -4.448429299e-04f, -1.866647793e-02f, +3.392985768e-02f, -2.292102347e-02f, -1.288809995e-02f, +4.339055464e-02f, -4.088298114e-02f, +1.055998930e-02f, +1.719206296e-02f, -2.154980927e-02f, +9.484696619e-03f, - +1.031266552e-03f, +2.109602172e-05f, -4.885529654e-03f, +1.108152461e-02f, -7.339615338e-03f, -4.188882392e-02f, +1.147528507e-02f, +3.853607120e-02f, -5.574705484e-03f, -5.614487418e-03f, +5.145852489e-03f, -1.687965768e-03f, - -1.084783716e-03f, +2.222199009e-03f, -1.728888211e-03f, -1.471688198e-03f, +5.351268396e-03f, -6.128281347e-03f, +2.401635327e-03f, +2.888573507e-03f, -5.402051594e-03f, +3.847864393e-03f, -7.244470526e-04f, -1.009122428e-03f, - /* 13,14 (12) */ - +3.357460656e-03f, -2.102974493e-02f, +3.319996871e-02f, +4.202556435e-03f, -1.233154703e-01f, +3.305856883e-01f, +6.923004768e-01f, +1.654165812e-01f, -1.247613738e-01f, +3.851931066e-02f, +1.196433622e-02f, -1.707497516e-02f, - +5.219488278e-03f, +1.777356079e-03f, -2.039536614e-02f, +3.245816949e-02f, -1.756975507e-02f, -1.901638130e-02f, +4.579218997e-02f, -3.799440763e-02f, +5.157937705e-03f, +2.103992735e-02f, -2.227425632e-02f, +8.475574192e-03f, - +8.239172206e-04f, +4.580705590e-04f, -5.179423709e-03f, +1.020170031e-02f, -4.369024788e-03f, -4.210235210e-02f, +6.943602019e-03f, +4.004788218e-02f, -3.435813779e-03f, -6.864218062e-03f, +5.320292410e-03f, -1.465023136e-03f, - -1.095048359e-03f, +2.034388843e-03f, -1.223471859e-03f, -2.093921463e-03f, +5.607319388e-03f, -5.684120067e-03f, +1.462247758e-03f, +3.709661828e-03f, -5.633317814e-03f, +3.536453862e-03f, -2.707142018e-04f, -1.291087560e-03f, - /* 13,15 (12) */ - +4.181377877e-03f, -2.057167437e-02f, +2.802054500e-02f, +1.440425674e-02f, -1.276844951e-01f, +2.884833362e-01f, +6.992440788e-01f, +2.054644633e-01f, -1.281971876e-01f, +3.165509260e-02f, +1.728462863e-02f, -1.853999830e-02f, - +4.124439920e-03f, +3.811744922e-03f, -2.161883800e-02f, +3.036424802e-02f, -1.196243568e-02f, -2.470050137e-02f, +4.725443772e-02f, -3.428474580e-02f, -4.753801099e-04f, +2.457638121e-02f, -2.254497052e-02f, +7.184486632e-03f, - +6.183259736e-04f, +8.474447504e-04f, -5.345771948e-03f, +9.186464064e-03f, -1.561855693e-03f, -4.185543920e-02f, +2.324318892e-03f, +4.116343363e-02f, -1.049163186e-03f, -8.064371797e-03f, +5.390144418e-03f, -1.184231324e-03f, - -1.074994695e-03f, +1.811553195e-03f, -7.139584264e-04f, -2.652101873e-03f, +5.739572450e-03f, -5.123770053e-03f, +4.909849421e-04f, +4.460474383e-03f, -5.747483122e-03f, +3.135764939e-03f, +2.121741000e-04f, -1.561188515e-03f, - /* 14, 0 (12) */ - -1.410093151e-02f, +3.419766284e-04f, +5.130286695e-02f, -1.354692140e-01f, +2.168036256e-01f, +7.493138204e-01f, +2.168036256e-01f, -1.354692140e-01f, +5.130286695e-02f, +3.419766284e-04f, -1.410093151e-02f, +7.849149075e-03f, - +1.318985173e-02f, -2.245225355e-02f, +1.749789399e-02f, +5.877664802e-03f, -3.469299762e-02f, +4.774542267e-02f, -3.469299762e-02f, +5.877664802e-03f, +1.749789399e-02f, -2.245225355e-02f, +1.318985173e-02f, -2.890388553e-03f, - +2.745419839e-03f, -5.602318518e-03f, +4.928606858e-03f, +6.796646308e-03f, -4.562390801e-02f, -2.815303834e-03f, +4.697920925e-02f, -4.177716757e-03f, -6.534362190e-03f, +6.059730374e-03f, -2.658997945e-03f, +4.566687215e-04f, - +2.338514229e-04f, +1.800862557e-03f, -4.580061513e-03f, +5.864122748e-03f, -3.930391905e-03f, -5.565917689e-04f, +4.784909270e-03f, -6.128420019e-03f, +4.314624777e-03f, -1.335481562e-03f, -5.978506604e-04f, +8.509417120e-04f, - /* 14, 1 (12) */ - -1.135551167e-02f, -5.260341890e-03f, +5.623147381e-02f, -1.286725677e-01f, +1.711797175e-01f, +7.464985165e-01f, +2.637828348e-01f, -1.396469308e-01f, +4.476850476e-02f, +6.401707002e-03f, -1.675992945e-02f, +8.305817796e-03f, - +1.342370315e-02f, -2.065139100e-02f, +1.291783248e-02f, +1.174178755e-02f, -3.862338952e-02f, +4.718883090e-02f, -2.990808835e-02f, -2.507552168e-04f, +2.181251877e-02f, -2.378773512e-02f, +1.259200106e-02f, -2.039446841e-03f, - +2.756110696e-03f, -5.049578208e-03f, +3.327764201e-03f, +9.069131594e-03f, -4.375754401e-02f, -8.405849777e-03f, +4.778647217e-02f, -1.238294600e-03f, -8.107778843e-03f, +6.402895568e-03f, -2.492459402e-03f, +2.711311382e-04f, - -1.116907677e-04f, +2.199803878e-03f, -4.726214325e-03f, +5.464975734e-03f, -2.990800672e-03f, -1.656107509e-03f, +5.532377135e-03f, -6.248513983e-03f, +3.932921792e-03f, -8.130708818e-04f, -9.709400403e-04f, +1.018386892e-03f, - /* 14, 2 (12) */ - -8.599400971e-03f, -1.030992010e-02f, +5.955923801e-02f, -1.196034361e-01f, +1.274221735e-01f, +7.380926668e-01f, +3.115693070e-01f, -1.408852254e-01f, +3.666072592e-02f, +1.280460257e-02f, -1.925238885e-02f, +8.576948934e-03f, - +1.331201238e-02f, -1.845158712e-02f, +8.191618156e-03f, +1.720676328e-02f, -4.161419019e-02f, +4.553272339e-02f, -2.437571121e-02f, -6.499269200e-03f, +2.574544056e-02f, -2.460080600e-02f, +1.162106102e-02f, -1.021059949e-03f, - +2.697088195e-03f, -4.421405436e-03f, +1.766623025e-03f, +1.097675708e-02f, -4.142464471e-02f, -1.387692040e-02f, +4.801710527e-02f, +1.988346942e-03f, -9.609836412e-03f, +6.614417865e-03f, -2.243295030e-03f, +5.351716407e-05f, - -4.304528982e-04f, +2.525050957e-03f, -4.753218382e-03f, +4.943560352e-03f, -1.990037500e-03f, -2.714971521e-03f, +6.153333419e-03f, -6.218584674e-03f, +3.441131336e-03f, -2.450155674e-04f, -1.342939161e-03f, +1.170206406e-03f, - /* 14, 3 (12) */ - -5.902312776e-03f, -1.473132553e-02f, +6.132586104e-02f, -1.086266790e-01f, +8.599752882e-02f, +7.242157464e-01f, +3.595864122e-01f, -1.388968784e-01f, +2.705088951e-02f, +1.941902044e-02f, -2.149568388e-02f, +8.630466098e-03f, - +1.288155948e-02f, -1.592653616e-02f, +3.438399775e-03f, +2.215032364e-02f, -4.360422769e-02f, +4.281775187e-02f, -1.822237779e-02f, -1.271785387e-02f, +2.918657190e-02f, -2.484582157e-02f, +1.027812186e-02f, +1.491464571e-04f, - +2.575730357e-03f, -3.738137478e-03f, +2.769020939e-04f, +1.250869927e-02f, -3.867632697e-02f, -1.915121740e-02f, +4.765158391e-02f, +5.461986348e-03f, -1.100051256e-02f, +6.678961521e-03f, -1.911080636e-03f, -1.926354590e-04f, - -7.153451349e-04f, +2.771618498e-03f, -4.664268634e-03f, +4.315299818e-03f, -9.532978677e-04f, -3.707245444e-03f, +6.631355119e-03f, -6.036561645e-03f, +2.848514420e-03f, +3.555680957e-04f, -1.703120183e-03f, +1.299970873e-03f, - /* 14, 4 (12) */ - -3.326582419e-03f, -1.846946301e-02f, +6.160276313e-02f, -9.611797976e-02f, +4.732120185e-02f, +7.050645290e-01f, +4.072379962e-01f, -1.334348921e-01f, +1.605037695e-02f, +2.609798196e-02f, -2.340676452e-02f, +8.437830640e-03f, - +1.216621435e-02f, -1.315491766e-02f, -1.225868860e-03f, +2.646562345e-02f, -4.455752556e-02f, +3.911050642e-02f, -1.159102267e-02f, -1.875441552e-02f, +3.203508632e-02f, -2.449025347e-02f, +8.575001680e-03f, +1.449117330e-03f, - +2.400485196e-03f, -3.020036623e-03f, -1.113261403e-03f, +1.366162750e-02f, -3.556922577e-02f, -2.415492089e-02f, +4.667996772e-02f, +9.135982298e-03f, -1.223960915e-02f, +6.583770282e-03f, -1.497641809e-03f, -4.625628530e-04f, - -9.606550012e-04f, +2.936836755e-03f, -4.465446619e-03f, +3.598004813e-03f, +9.359009452e-05f, -4.608702375e-03f, +6.953507460e-03f, -5.704242686e-03f, +2.167248376e-03f, +9.741348398e-04f, -2.040502789e-03f, +1.401524761e-03f, - /* 14, 5 (12) */ - -9.260972236e-04f, -2.148949964e-02f, +6.048950173e-02f, -8.245635226e-02f, +1.175197608e-02f, +6.809096081e-01f, +4.539179639e-01f, -1.242989098e-01f, +3.810767804e-03f, +3.268175224e-02f, -2.490440633e-02f, +7.975267787e-03f, - +1.120555935e-02f, -1.021808091e-02f, -5.691315478e-03f, +3.006362827e-02f, -4.446393547e-02f, +3.450180405e-02f, -4.637515215e-03f, -2.445865820e-02f, +3.420233470e-02f, -2.351611863e-02f, +6.534498892e-03f, +2.850642091e-03f, - +2.180570531e-03f, -2.286805629e-03f, -2.379720004e-03f, +1.443945634e-02f, -3.216433750e-02f, -2.881898275e-02f, +4.510223989e-02f, +1.295795041e-02f, -1.328762090e-02f, +6.319152879e-03f, -1.007167819e-03f, -7.503236984e-04f, - -1.162143957e-03f, +3.020331197e-03f, -4.165473924e-03f, +2.811364148e-03f, +1.124836684e-03f, -5.397446933e-03f, +7.110704025e-03f, -5.227310602e-03f, +1.412176509e-03f, +1.595064181e-03f, -2.344170140e-03f, +1.469207754e-03f, - /* 14, 6 (12) */ - +1.254473307e-03f, -2.377630526e-02f, +5.810978172e-02f, -6.801689592e-02f, -2.041236142e-02f, +6.520906253e-01f, +4.990202038e-01f, -1.113409594e-01f, -9.476853099e-03f, +3.900090512e-02f, -2.591157415e-02f, +7.224944088e-03f, - +1.004341539e-02f, -7.197749712e-03f, -9.856789402e-03f, +3.287499242e-02f, -4.333909878e-02f, +2.910435712e-02f, +2.473188810e-03f, -2.968596881e-02f, +3.561451120e-02f, -2.192105445e-02f, +4.190328751e-03f, +4.319849845e-03f, - +1.925672532e-03f, -1.557145055e-03f, -3.502616021e-03f, +1.485295954e-02f, -2.852580292e-02f, -3.308032475e-02f, +4.292845926e-02f, +1.687057779e-02f, -1.410662851e-02f, +5.878921212e-03f, -4.462684529e-04f, -1.048887163e-03f, - -1.317095431e-03f, +3.023938398e-03f, -3.775401019e-03f, +1.976395230e-03f, +2.115353784e-03f, -6.054472941e-03f, +7.097967562e-03f, -4.615246101e-03f, +6.004783629e-04f, +2.202057061e-03f, -2.603596979e-03f, +1.498071419e-03f, - /* 14, 7 (12) */ - +3.180145839e-03f, -2.533345032e-02f, +5.460716570e-02f, -5.316393638e-02f, -4.893816433e-02f, +6.190103006e-01f, +5.419486630e-01f, -9.447038158e-02f, -2.358348161e-02f, +4.487982633e-02f, -2.635784260e-02f, +6.176056925e-03f, - +8.726319957e-03f, -4.173811314e-03f, -1.363219042e-02f, +3.485138765e-02f, -4.122374500e-02f, +2.304988417e-02f, +9.571156372e-03f, -3.430121491e-02f, +3.621498957e-02f, -1.971899739e-02f, +1.586731773e-03f, +5.817921264e-03f, - +1.645651143e-03f, -8.483611332e-04f, -4.466571399e-03f, +1.491925798e-02f, -2.471965556e-02f, -3.688291761e-02f, +4.017871996e-02f, +2.081256169e-02f, -1.466119679e-02f, +5.260767975e-03f, +1.760311468e-04f, -1.350259943e-03f, - -1.424314870e-03f, +2.951562769e-03f, -3.308241767e-03f, +1.114869941e-03f, +3.041392397e-03f, -6.564143945e-03f, +6.914583858e-03f, -3.881137696e-03f, -2.487319811e-04f, +2.778565199e-03f, -2.808980318e-03f, +1.484083824e-03f, - /* 14, 8 (12) */ - +4.825796983e-03f, -2.618181145e-02f, +5.014059430e-02f, -3.824467840e-02f, -7.365781989e-02f, +5.821273830e-01f, +5.821273830e-01f, -7.365781989e-02f, -3.824467840e-02f, +5.014059430e-02f, -2.618181145e-02f, +4.825796983e-03f, - +7.302005088e-03f, -1.222248545e-03f, -1.694043219e-02f, +3.596625759e-02f, -3.818235260e-02f, +1.648574023e-02f, +1.648574023e-02f, -3.818235260e-02f, +3.596625759e-02f, -1.694043219e-02f, -1.222248545e-03f, +7.302005088e-03f, - +1.350259943e-03f, -1.760311468e-04f, -5.260767975e-03f, +1.466119679e-02f, -2.081256169e-02f, -4.017871996e-02f, +3.688291761e-02f, +2.471965556e-02f, -1.491925798e-02f, +4.466571399e-03f, +8.483611332e-04f, -1.645651143e-03f, - -1.484083824e-03f, +2.808980318e-03f, -2.778565199e-03f, +2.487319811e-04f, +3.881137696e-03f, -6.914583858e-03f, +6.564143945e-03f, -3.041392397e-03f, -1.114869941e-03f, +3.308241767e-03f, -2.951562769e-03f, +1.424314870e-03f, - /* 14, 9 (12) */ - +6.176056925e-03f, -2.635784260e-02f, +4.487982633e-02f, -2.358348161e-02f, -9.447038158e-02f, +5.419486630e-01f, +6.190103006e-01f, -4.893816433e-02f, -5.316393638e-02f, +5.460716570e-02f, -2.533345032e-02f, +3.180145839e-03f, - +5.817921264e-03f, +1.586731773e-03f, -1.971899739e-02f, +3.621498957e-02f, -3.430121491e-02f, +9.571156372e-03f, +2.304988417e-02f, -4.122374500e-02f, +3.485138765e-02f, -1.363219042e-02f, -4.173811314e-03f, +8.726319957e-03f, - +1.048887163e-03f, +4.462684529e-04f, -5.878921212e-03f, +1.410662851e-02f, -1.687057779e-02f, -4.292845926e-02f, +3.308032475e-02f, +2.852580292e-02f, -1.485295954e-02f, +3.502616021e-03f, +1.557145055e-03f, -1.925672532e-03f, - -1.498071419e-03f, +2.603596979e-03f, -2.202057061e-03f, -6.004783629e-04f, +4.615246101e-03f, -7.097967562e-03f, +6.054472941e-03f, -2.115353784e-03f, -1.976395230e-03f, +3.775401019e-03f, -3.023938398e-03f, +1.317095431e-03f, - /* 14,10 (12) */ - +7.224944088e-03f, -2.591157415e-02f, +3.900090512e-02f, -9.476853099e-03f, -1.113409594e-01f, +4.990202038e-01f, +6.520906253e-01f, -2.041236142e-02f, -6.801689592e-02f, +5.810978172e-02f, -2.377630526e-02f, +1.254473307e-03f, - +4.319849845e-03f, +4.190328751e-03f, -2.192105445e-02f, +3.561451120e-02f, -2.968596881e-02f, +2.473188810e-03f, +2.910435712e-02f, -4.333909878e-02f, +3.287499242e-02f, -9.856789402e-03f, -7.197749712e-03f, +1.004341539e-02f, - +7.503236984e-04f, +1.007167819e-03f, -6.319152879e-03f, +1.328762090e-02f, -1.295795041e-02f, -4.510223989e-02f, +2.881898275e-02f, +3.216433750e-02f, -1.443945634e-02f, +2.379720004e-03f, +2.286805629e-03f, -2.180570531e-03f, - -1.469207754e-03f, +2.344170140e-03f, -1.595064181e-03f, -1.412176509e-03f, +5.227310602e-03f, -7.110704025e-03f, +5.397446933e-03f, -1.124836684e-03f, -2.811364148e-03f, +4.165473924e-03f, -3.020331197e-03f, +1.162143957e-03f, - /* 14,11 (12) */ - +7.975267787e-03f, -2.490440633e-02f, +3.268175224e-02f, +3.810767804e-03f, -1.242989098e-01f, +4.539179639e-01f, +6.809096081e-01f, +1.175197608e-02f, -8.245635226e-02f, +6.048950173e-02f, -2.148949964e-02f, -9.260972236e-04f, - +2.850642091e-03f, +6.534498892e-03f, -2.351611863e-02f, +3.420233470e-02f, -2.445865820e-02f, -4.637515215e-03f, +3.450180405e-02f, -4.446393547e-02f, +3.006362827e-02f, -5.691315478e-03f, -1.021808091e-02f, +1.120555935e-02f, - +4.625628530e-04f, +1.497641809e-03f, -6.583770282e-03f, +1.223960915e-02f, -9.135982298e-03f, -4.667996772e-02f, +2.415492089e-02f, +3.556922577e-02f, -1.366162750e-02f, +1.113261403e-03f, +3.020036623e-03f, -2.400485196e-03f, - -1.401524761e-03f, +2.040502789e-03f, -9.741348398e-04f, -2.167248376e-03f, +5.704242686e-03f, -6.953507460e-03f, +4.608702375e-03f, -9.359009452e-05f, -3.598004813e-03f, +4.465446619e-03f, -2.936836755e-03f, +9.606550012e-04f, - /* 14,12 (12) */ - +8.437830640e-03f, -2.340676452e-02f, +2.609798196e-02f, +1.605037695e-02f, -1.334348921e-01f, +4.072379962e-01f, +7.050645290e-01f, +4.732120185e-02f, -9.611797976e-02f, +6.160276313e-02f, -1.846946301e-02f, -3.326582419e-03f, - +1.449117330e-03f, +8.575001680e-03f, -2.449025347e-02f, +3.203508632e-02f, -1.875441552e-02f, -1.159102267e-02f, +3.911050642e-02f, -4.455752556e-02f, +2.646562345e-02f, -1.225868860e-03f, -1.315491766e-02f, +1.216621435e-02f, - +1.926354590e-04f, +1.911080636e-03f, -6.678961521e-03f, +1.100051256e-02f, -5.461986348e-03f, -4.765158391e-02f, +1.915121740e-02f, +3.867632697e-02f, -1.250869927e-02f, -2.769020939e-04f, +3.738137478e-03f, -2.575730357e-03f, - -1.299970873e-03f, +1.703120183e-03f, -3.555680957e-04f, -2.848514420e-03f, +6.036561645e-03f, -6.631355119e-03f, +3.707245444e-03f, +9.532978677e-04f, -4.315299818e-03f, +4.664268634e-03f, -2.771618498e-03f, +7.153451349e-04f, - /* 14,13 (12) */ - +8.630466098e-03f, -2.149568388e-02f, +1.941902044e-02f, +2.705088951e-02f, -1.388968784e-01f, +3.595864122e-01f, +7.242157464e-01f, +8.599752882e-02f, -1.086266790e-01f, +6.132586104e-02f, -1.473132553e-02f, -5.902312776e-03f, - +1.491464571e-04f, +1.027812186e-02f, -2.484582157e-02f, +2.918657190e-02f, -1.271785387e-02f, -1.822237779e-02f, +4.281775187e-02f, -4.360422769e-02f, +2.215032364e-02f, +3.438399775e-03f, -1.592653616e-02f, +1.288155948e-02f, - -5.351716407e-05f, +2.243295030e-03f, -6.614417865e-03f, +9.609836412e-03f, -1.988346942e-03f, -4.801710527e-02f, +1.387692040e-02f, +4.142464471e-02f, -1.097675708e-02f, -1.766623025e-03f, +4.421405436e-03f, -2.697088195e-03f, - -1.170206406e-03f, +1.342939161e-03f, +2.450155674e-04f, -3.441131336e-03f, +6.218584674e-03f, -6.153333419e-03f, +2.714971521e-03f, +1.990037500e-03f, -4.943560352e-03f, +4.753218382e-03f, -2.525050957e-03f, +4.304528982e-04f, - /* 14,14 (12) */ - +8.576948934e-03f, -1.925238885e-02f, +1.280460257e-02f, +3.666072592e-02f, -1.408852254e-01f, +3.115693070e-01f, +7.380926668e-01f, +1.274221735e-01f, -1.196034361e-01f, +5.955923801e-02f, -1.030992010e-02f, -8.599400971e-03f, - -1.021059949e-03f, +1.162106102e-02f, -2.460080600e-02f, +2.574544056e-02f, -6.499269200e-03f, -2.437571121e-02f, +4.553272339e-02f, -4.161419019e-02f, +1.720676328e-02f, +8.191618156e-03f, -1.845158712e-02f, +1.331201238e-02f, - -2.711311382e-04f, +2.492459402e-03f, -6.402895568e-03f, +8.107778843e-03f, +1.238294600e-03f, -4.778647217e-02f, +8.405849777e-03f, +4.375754401e-02f, -9.069131594e-03f, -3.327764201e-03f, +5.049578208e-03f, -2.756110696e-03f, - -1.018386892e-03f, +9.709400403e-04f, +8.130708818e-04f, -3.932921792e-03f, +6.248513983e-03f, -5.532377135e-03f, +1.656107509e-03f, +2.990800672e-03f, -5.464975734e-03f, +4.726214325e-03f, -2.199803878e-03f, +1.116907677e-04f, - /* 14,15 (12) */ - +8.305817796e-03f, -1.675992945e-02f, +6.401707002e-03f, +4.476850476e-02f, -1.396469308e-01f, +2.637828348e-01f, +7.464985165e-01f, +1.711797175e-01f, -1.286725677e-01f, +5.623147381e-02f, -5.260341890e-03f, -1.135551167e-02f, - -2.039446841e-03f, +1.259200106e-02f, -2.378773512e-02f, +2.181251877e-02f, -2.507552168e-04f, -2.990808835e-02f, +4.718883090e-02f, -3.862338952e-02f, +1.174178755e-02f, +1.291783248e-02f, -2.065139100e-02f, +1.342370315e-02f, - -4.566687215e-04f, +2.658997945e-03f, -6.059730374e-03f, +6.534362190e-03f, +4.177716757e-03f, -4.697920925e-02f, +2.815303834e-03f, +4.562390801e-02f, -6.796646308e-03f, -4.928606858e-03f, +5.602318518e-03f, -2.745419839e-03f, - -8.509417120e-04f, +5.978506604e-04f, +1.335481562e-03f, -4.314624777e-03f, +6.128420019e-03f, -4.784909270e-03f, +5.565917689e-04f, +3.930391905e-03f, -5.864122748e-03f, +4.580061513e-03f, -1.800862557e-03f, -2.338514229e-04f, - /* 15, 0 (12) */ - -9.110797801e-04f, -2.211027693e-02f, +6.880076095e-02f, -1.295915492e-01f, +1.821106279e-01f, +7.970592430e-01f, +1.821106279e-01f, -1.295915492e-01f, +6.880076095e-02f, -2.211027693e-02f, -9.110797801e-04f, +4.958760522e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +2.979271262e-03f, -3.801455961e-03f, +3.485453450e-04f, +1.266076906e-02f, -4.955429992e-02f, -3.371895603e-03f, +5.176411852e-02f, -1.030613678e-02f, -2.219737413e-03f, +4.724248812e-03f, -3.256848606e-03f, +1.307610434e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 1 (12) */ - +2.068191481e-03f, -2.591173289e-02f, +6.914930629e-02f, -1.169307801e-01f, +1.325563280e-01f, +7.936873474e-01f, +2.338747465e-01f, -1.398976860e-01f, +6.658102354e-02f, -1.738602811e-02f, -4.167928386e-03f, +6.266370955e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +2.644419928e-03f, -2.849774330e-03f, -1.398450125e-03f, +1.453410733e-02f, -4.674834468e-02f, -1.006195729e-02f, +5.331884931e-02f, -7.486808583e-03f, -4.174857051e-03f, +5.589824686e-03f, -3.463399442e-03f, +1.289518030e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 2 (12) */ - +4.712611409e-03f, -2.876150722e-02f, +6.775085617e-02f, -1.023966728e-01f, +8.580798333e-02f, +7.836253902e-01f, +2.871935958e-01f, -1.473844946e-01f, +6.240616648e-02f, -1.179620343e-02f, -7.631327828e-03f, +7.555888986e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +2.266635297e-03f, -1.896354479e-03f, -2.986595357e-03f, +1.592031743e-02f, -4.341468221e-02f, -1.659189192e-02f, +5.417043869e-02f, -4.230237732e-03f, -6.168705076e-03f, +6.369402298e-03f, -3.586234192e-03f, +1.223723570e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 3 (12) */ - +6.979246706e-03f, -3.065786170e-02f, +6.476426081e-02f, -8.647635539e-02f, +4.239330113e-02f, +7.670334982e-01f, +3.413640345e-01f, -1.516147323e-01f, +5.623746141e-02f, -5.426801130e-03f, -1.121756202e-02f, +8.779612556e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.860385222e-03f, -9.665189796e-04f, -4.387366540e-03f, +1.682399909e-02f, -3.962962484e-02f, -2.285846285e-02f, +5.428293902e-02f, -5.745752964e-04f, -8.151998138e-03f, +7.034529617e-03f, -3.614200819e-03f, +1.107335414e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 4 (12) */ - +8.839631928e-03f, -3.162438068e-02f, +6.037689427e-02f, -6.965235630e-02f, +2.763676290e-03f, +7.441750354e-01f, +3.956469735e-01f, -1.521893076e-01f, +4.808546327e-02f, +1.607728487e-03f, -1.483176284e-02f, +9.886947970e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.439830194e-03f, -8.319986772e-05f, -5.578708022e-03f, +1.725963231e-02f, -3.547563568e-02f, -2.876362326e-02f, +5.363347518e-02f, +3.431739612e-03f, -1.007236077e-02f, +7.557905122e-03f, -3.538144597e-03f, +9.389619079e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 5 (12) */ - +1.027946212e-02f, -3.170758054e-02f, +5.479818625e-02f, -5.239272399e-02f, -3.271195939e-02f, +7.154114121e-01f, +4.492804487e-01f, -1.487575680e-01f, +3.801310250e-02f, +9.165633609e-03f, -1.836990744e-02f, +1.082590988e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +1.018426574e-03f, +7.335255681e-04f, -6.545193928e-03f, +1.725082049e-02f, -3.103950081e-02f, -3.421642968e-02f, +5.221294392e-02f, +7.730639805e-03f, -1.187544439e-02f, +7.914217061e-03f, -3.351337960e-03f, +7.188840555e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 6 (12) */ - +1.129788870e-02f, -3.097405498e-02f, +4.825299232e-02f, -3.514190350e-02f, -6.375146020e-02f, +6.811949825e-01f, +5.014933926e-01f, -1.410269282e-01f, +2.613765811e-02f, +1.707985067e-02f, -2.172124540e-02f, +1.154479393e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +6.085771005e-04f, +1.466793343e-03f, -7.278017040e-03f, +1.682935477e-02f, -2.641044913e-02f, -3.913479769e-02f, +5.002642682e-02f, +1.225533168e-02f, -1.350615014e-02f, +8.080978272e-03f, -3.049865431e-03f, +4.491842562e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 7 (12) */ - +1.190646580e-02f, -2.950726163e-02f, +4.097497528e-02f, -1.831254873e-02f, -9.016190933e-02f, +6.420601848e-01f, +5.515198194e-01f, -1.287715965e-01f, +1.263150796e-02f, +2.516082894e-02f, -2.477111083e-02f, +1.199397819e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - +2.213362736e-04f, +2.103201636e-03f, -7.774813167e-03f, +1.603412792e-02f, -2.167826316e-02f, -4.344706155e-02f, +4.709330382e-02f, +1.693142400e-02f, -1.490992877e-02f, +8.039333174e-03f, -2.632949171e-03f, +1.338238810e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 8 (12) */ - +1.212780207e-02f, -2.740406000e-02f, +3.320016212e-02f, -2.278420811e-03f, -1.118401725e-01f, +5.986131232e-01f, +5.986131232e-01f, -1.118401725e-01f, -2.278420811e-03f, +3.320016212e-02f, -2.740406000e-02f, +1.212780207e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.338238810e-04f, +2.632949171e-03f, -8.039333174e-03f, +1.490992877e-02f, -1.693142400e-02f, -4.709330382e-02f, +4.344706155e-02f, +2.167826316e-02f, -1.603412792e-02f, +7.774813167e-03f, -2.103201636e-03f, -2.213362736e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15, 9 (12) */ - +1.199397819e-02f, -2.477111083e-02f, +2.516082894e-02f, +1.263150796e-02f, -1.287715965e-01f, +5.515198194e-01f, +6.420601848e-01f, -9.016190933e-02f, -1.831254873e-02f, +4.097497528e-02f, -2.950726163e-02f, +1.190646580e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -4.491842562e-04f, +3.049865431e-03f, -8.080978272e-03f, +1.350615014e-02f, -1.225533168e-02f, -5.002642682e-02f, +3.913479769e-02f, +2.641044913e-02f, -1.682935477e-02f, +7.278017040e-03f, -1.466793343e-03f, -6.085771005e-04f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,10 (12) */ - +1.154479393e-02f, -2.172124540e-02f, +1.707985067e-02f, +2.613765811e-02f, -1.410269282e-01f, +5.014933926e-01f, +6.811949825e-01f, -6.375146020e-02f, -3.514190350e-02f, +4.825299232e-02f, -3.097405498e-02f, +1.129788870e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -7.188840555e-04f, +3.351337960e-03f, -7.914217061e-03f, +1.187544439e-02f, -7.730639805e-03f, -5.221294392e-02f, +3.421642968e-02f, +3.103950081e-02f, -1.725082049e-02f, +6.545193928e-03f, -7.335255681e-04f, -1.018426574e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,11 (12) */ - +1.082590988e-02f, -1.836990744e-02f, +9.165633609e-03f, +3.801310250e-02f, -1.487575680e-01f, +4.492804487e-01f, +7.154114121e-01f, -3.271195939e-02f, -5.239272399e-02f, +5.479818625e-02f, -3.170758054e-02f, +1.027946212e-02f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -9.389619079e-04f, +3.538144597e-03f, -7.557905122e-03f, +1.007236077e-02f, -3.431739612e-03f, -5.363347518e-02f, +2.876362326e-02f, +3.547563568e-02f, -1.725963231e-02f, +5.578708022e-03f, +8.319986772e-05f, -1.439830194e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,12 (12) */ - +9.886947970e-03f, -1.483176284e-02f, +1.607728487e-03f, +4.808546327e-02f, -1.521893076e-01f, +3.956469735e-01f, +7.441750354e-01f, +2.763676290e-03f, -6.965235630e-02f, +6.037689427e-02f, -3.162438068e-02f, +8.839631928e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.107335414e-03f, +3.614200819e-03f, -7.034529617e-03f, +8.151998138e-03f, +5.745752964e-04f, -5.428293902e-02f, +2.285846285e-02f, +3.962962484e-02f, -1.682399909e-02f, +4.387366540e-03f, +9.665189796e-04f, -1.860385222e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,13 (12) */ - +8.779612556e-03f, -1.121756202e-02f, -5.426801130e-03f, +5.623746141e-02f, -1.516147323e-01f, +3.413640345e-01f, +7.670334982e-01f, +4.239330113e-02f, -8.647635539e-02f, +6.476426081e-02f, -3.065786170e-02f, +6.979246706e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.223723570e-03f, +3.586234192e-03f, -6.369402298e-03f, +6.168705076e-03f, +4.230237732e-03f, -5.417043869e-02f, +1.659189192e-02f, +4.341468221e-02f, -1.592031743e-02f, +2.986595357e-03f, +1.896354479e-03f, -2.266635297e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,14 (12) */ - +7.555888986e-03f, -7.631327828e-03f, -1.179620343e-02f, +6.240616648e-02f, -1.473844946e-01f, +2.871935958e-01f, +7.836253902e-01f, +8.580798333e-02f, -1.023966728e-01f, +6.775085617e-02f, -2.876150722e-02f, +4.712611409e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.289518030e-03f, +3.463399442e-03f, -5.589824686e-03f, +4.174857051e-03f, +7.486808583e-03f, -5.331884931e-02f, +1.006195729e-02f, +4.674834468e-02f, -1.453410733e-02f, +1.398450125e-03f, +2.849774330e-03f, -2.644419928e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - /* 15,15 (12) */ - +6.266370955e-03f, -4.167928386e-03f, -1.738602811e-02f, +6.658102354e-02f, -1.398976860e-01f, +2.338747465e-01f, +7.936873474e-01f, +1.325563280e-01f, -1.169307801e-01f, +6.914930629e-02f, -2.591173289e-02f, +2.068191481e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - -1.307610434e-03f, +3.256848606e-03f, -4.724248812e-03f, +2.219737413e-03f, +1.030613678e-02f, -5.176411852e-02f, +3.371895603e-03f, +4.955429992e-02f, -1.266076906e-02f, -3.485453450e-04f, +3.801455961e-03f, -2.979271262e-03f, - +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - } +alignas(16) constexpr float bsinc12_tab[39936] = { + /* 0, 0 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.519885812e-03f, +3.451133814e-03f, +6.515582343e-03f, +1.087383005e-02f, +1.652921626e-02f, +2.328367055e-02f, +3.072645296e-02f, +3.826378940e-02f, +4.518869460e-02f, +5.078083067e-02f, +5.441847120e-02f, +5.568063817e-02f, +5.441847120e-02f, +5.078083067e-02f, +4.518869460e-02f, +3.826378940e-02f, +3.072645296e-02f, +2.328367055e-02f, +1.652921626e-02f, +1.087383005e-02f, +6.515582343e-03f, +3.451133814e-03f, +1.519885812e-03f, +4.670736076e-04f, + -4.473156016e-05f, -7.634926120e-05f, -1.148555588e-04f, -1.562964586e-04f, -1.949507756e-04f, -2.241543973e-04f, -2.374890420e-04f, -2.300991725e-04f, -1.998415601e-04f, -1.479851488e-04f, -7.926606770e-05f, -1.244974771e-06f, +7.692363257e-05f, +1.460597965e-04f, +1.985319023e-04f, +2.295023193e-04f, +2.375909238e-04f, +2.248419263e-04f, +1.960418335e-04f, +1.575799374e-04f, +1.161320286e-04f, +7.746358669e-05f, +4.559156282e-05f, +2.243424753e-05f, + /* 0, 1 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.475154251e-03f, +3.374784553e-03f, +6.400726784e-03f, +1.071753360e-02f, +1.633426549e-02f, +2.305951615e-02f, +3.048896392e-02f, +3.803369023e-02f, +4.498885304e-02f, +5.063284553e-02f, +5.433920513e-02f, +5.567939320e-02f, +5.449539483e-02f, +5.092689047e-02f, +4.538722650e-02f, +3.849329172e-02f, +3.096404388e-02f, +2.350851248e-02f, +1.672525810e-02f, +1.103140999e-02f, +6.631714371e-03f, +3.528597401e-03f, +1.565477374e-03f, +4.895078551e-04f, + -4.388025644e-05f, -7.524183918e-05f, -1.135821039e-04f, -1.550103394e-04f, -1.938504700e-04f, -2.234512424e-04f, -2.373666959e-04f, -2.306734093e-04f, -2.011298355e-04f, -1.498937974e-04f, -8.159928545e-05f, -3.734778125e-06f, +7.457224711e-05f, +1.441179370e-04f, +1.972009578e-04f, +2.288828348e-04f, +2.376722283e-04f, +2.255136482e-04f, +1.971234341e-04f, +1.588605782e-04f, +1.174113605e-04f, +7.858472543e-05f, +4.646023953e-05f, +2.302203695e-05f, + /* 0, 2 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.431273995e-03f, +3.299542714e-03f, +6.287144680e-03f, +1.056252326e-02f, +1.614041502e-02f, +2.283606491e-02f, +3.025159722e-02f, +3.780301682e-02f, +4.478772320e-02f, +5.048295173e-02f, +5.425760585e-02f, +5.567565842e-02f, +5.456996708e-02f, +5.107100841e-02f, +4.558442746e-02f, +3.872217455e-02f, +3.120171611e-02f, +2.373402612e-02f, +1.692238153e-02f, +1.119027057e-02f, +6.749125732e-03f, +3.607182126e-03f, +1.611937614e-03f, +5.125298920e-04f, + -4.303767463e-05f, -7.414140875e-05f, -1.123118154e-04f, -1.537217763e-04f, -1.927411265e-04f, -2.227326442e-04f, -2.372240010e-04f, -2.312250478e-04f, -2.023966364e-04f, -1.517855485e-04f, -8.392302033e-05f, -6.224142940e-06f, +7.221217990e-05f, +1.421597696e-04f, +1.958488257e-04f, +2.282407078e-04f, +2.377328453e-04f, +2.261693833e-04f, +1.981953682e-04f, +1.601381827e-04f, +1.186933996e-04f, +7.971258511e-05f, +4.733756345e-05f, +2.361844294e-05f, + /* 0, 3 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.388236320e-03f, +3.225401305e-03f, +6.174832865e-03f, +1.040880148e-02f, +1.594767389e-02f, +2.261333227e-02f, +3.001437322e-02f, +3.757179177e-02f, +4.458532657e-02f, +5.033116618e-02f, +5.417368283e-02f, +5.566943427e-02f, +5.464217926e-02f, +5.121316818e-02f, +4.578027628e-02f, +3.895041526e-02f, +3.143944896e-02f, +2.396019551e-02f, +1.712057690e-02f, +1.135040875e-02f, +6.867819132e-03f, +3.686894711e-03f, +1.659275177e-03f, +5.361483350e-04f, + -4.220383580e-05f, -7.304805597e-05f, -1.110448427e-04f, -1.524309647e-04f, -1.916229551e-04f, -2.219987871e-04f, -2.370610757e-04f, -2.317541095e-04f, -2.036418741e-04f, -1.536602113e-04f, -8.623700849e-05f, -8.712776940e-06f, +6.984370103e-05f, +1.401854962e-04f, +1.944756084e-04f, +2.275759301e-04f, +2.377726671e-04f, +2.268089534e-04f, +1.992574267e-04f, +1.614125515e-04f, +1.199779894e-04f, +8.084707136e-05f, +4.822350583e-05f, +2.422349177e-05f, + /* 0, 4 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.346032485e-03f, +3.152353249e-03f, +6.063788022e-03f, +1.025637051e-02f, +1.575605093e-02f, +2.239133348e-02f, +2.977731215e-02f, +3.734003766e-02f, +4.438168469e-02f, +5.017750597e-02f, +5.408744582e-02f, +5.566072150e-02f, +5.471202296e-02f, +5.135335367e-02f, +4.597475189e-02f, +3.917799119e-02f, +3.167722163e-02f, +2.418700446e-02f, +1.731983432e-02f, +1.151182130e-02f, +6.987797121e-03f, +3.767741783e-03f, +1.707498683e-03f, +5.603718267e-04f, + -4.137875911e-05f, -7.196186479e-05f, -1.097813335e-04f, -1.511380992e-04f, -1.904961658e-04f, -2.212498566e-04f, -2.368780408e-04f, -2.322606191e-04f, -2.048654630e-04f, -1.555175978e-04f, -8.854098772e-05f, -1.120038797e-05f, +6.746708201e-05f, +1.381953216e-04f, +1.930814118e-04f, +2.268884971e-04f, +2.377915891e-04f, +2.274321824e-04f, +2.003094010e-04f, +1.626834846e-04f, +1.212649717e-04f, +8.198808773e-05f, +4.911803594e-05f, +2.483720823e-05f, + /* 0, 5 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.304653725e-03f, +3.080391384e-03f, +5.954006688e-03f, +1.010523242e-02f, +1.556555477e-02f, +2.217008362e-02f, +2.954043411e-02f, +3.710777704e-02f, +4.417681923e-02f, +5.002198837e-02f, +5.399890483e-02f, +5.564952111e-02f, +5.477949004e-02f, +5.149154900e-02f, +4.616783330e-02f, +3.940487969e-02f, +3.191501321e-02f, +2.441443664e-02f, +1.752014373e-02f, +1.167450479e-02f, +7.109062093e-03f, +3.849729871e-03f, +1.756616719e-03f, +5.852090350e-04f, + -4.056246185e-05f, -7.088291709e-05f, -1.085214336e-04f, -1.498433732e-04f, -1.893609687e-04f, -2.204860398e-04f, -2.366750198e-04f, -2.327446049e-04f, -2.060673215e-04f, -1.573575226e-04f, -9.083469754e-05f, -1.368668407e-05f, +6.508259574e-05f, +1.361894531e-04f, +1.916663450e-04f, +2.261784077e-04f, +2.377895090e-04f, +2.280388952e-04f, +2.013510827e-04f, +1.639507809e-04f, +1.225541865e-04f, +8.313553567e-05f, +5.002112110e-05f, +2.545961565e-05f, + /* 0, 6 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.264091264e-03f, +3.009508467e-03f, +5.845485255e-03f, +9.955389042e-03f, +1.537619380e-02f, +2.194959758e-02f, +2.930375909e-02f, +3.687503244e-02f, +4.397075191e-02f, +4.986463085e-02f, +5.390807013e-02f, +5.563583443e-02f, +5.484457264e-02f, +5.162773845e-02f, +4.635949965e-02f, +3.963105810e-02f, +3.215280272e-02f, +2.464247554e-02f, +1.772149481e-02f, +1.183845557e-02f, +7.231616279e-03f, +3.932865406e-03f, +1.806637840e-03f, +6.106686506e-04f, + -3.975495944e-05f, -6.981129264e-05f, -1.072652872e-04f, -1.485469791e-04f, -1.882175742e-04f, -2.197075250e-04f, -2.364521385e-04f, -2.332060983e-04f, -2.072473709e-04f, -1.591798037e-04f, -9.311787923e-05f, -1.617137348e-05f, +6.269051648e-05f, +1.341681007e-04f, +1.902305206e-04f, +2.254456640e-04f, +2.377663278e-04f, +2.286289191e-04f, +2.023822639e-04f, +1.652142386e-04f, +1.238454723e-04f, +8.428931461e-05f, +5.093272665e-05f, +2.609073586e-05f, + /* 0, 7 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.224336304e-03f, +2.939697175e-03f, +5.738219968e-03f, +9.806842063e-03f, +1.518797623e-02f, +2.172989006e-02f, +2.906730695e-02f, +3.664182634e-02f, +4.376350454e-02f, +4.970545104e-02f, +5.381495225e-02f, +5.561966305e-02f, +5.490726315e-02f, +5.176190655e-02f, +4.654973017e-02f, +3.985650376e-02f, +3.239056905e-02f, +2.487110446e-02f, +1.792387707e-02f, +1.200366981e-02f, +7.355461751e-03f, +4.017154721e-03f, +1.857570567e-03f, +6.367593865e-04f, + -3.895626544e-05f, -6.874706913e-05f, -1.060130363e-04f, -1.472491081e-04f, -1.870661925e-04f, -2.189145021e-04f, -2.362095255e-04f, -2.336451340e-04f, -2.084055364e-04f, -1.609842617e-04f, -9.539027583e-05f, -1.865416474e-05f, +6.029111978e-05f, +1.321314770e-04f, +1.887740547e-04f, +2.246902716e-04f, +2.377219491e-04f, +2.292020825e-04f, +2.034027372e-04f, +1.664736552e-04f, +1.251386658e-04f, +8.544932188e-05f, +5.185281596e-05f, +2.673058920e-05f, + /* 0, 8 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.185380039e-03f, +2.870950105e-03f, +5.632206931e-03f, +9.659592955e-03f, +1.500091003e-02f, +2.151097556e-02f, +2.883109742e-02f, +3.640818120e-02f, +4.355509900e-02f, +4.954446678e-02f, +5.371956198e-02f, +5.560100889e-02f, +5.496755427e-02f, +5.189403803e-02f, +4.673850422e-02f, +4.008119403e-02f, +3.262829100e-02f, +2.510030654e-02f, +1.812727981e-02f, +1.217014346e-02f, +7.480600417e-03f, +4.102604043e-03f, +1.909423383e-03f, +6.634899757e-04f, + -3.816639157e-05f, -6.769032218e-05f, -1.047648212e-04f, -1.459499503e-04f, -1.859070338e-04f, -2.181071619e-04f, -2.359473116e-04f, -2.340617500e-04f, -2.095417464e-04f, -1.627707202e-04f, -9.765163225e-05f, -2.113476669e-05f, +5.788468247e-05f, +1.300797972e-04f, +1.872970664e-04f, +2.239122397e-04f, +2.376562792e-04f, +2.297582162e-04f, +2.044122956e-04f, +1.677288274e-04f, +1.264336021e-04f, +8.661545276e-05f, +5.278135038e-05f, +2.737919445e-05f, + /* 0, 9 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.147213647e-03f, +2.803259783e-03f, +5.527442110e-03f, +9.513643005e-03f, +1.481500300e-02f, +2.129286839e-02f, +2.859515011e-02f, +3.617411945e-02f, +4.334555725e-02f, +4.938169606e-02f, +5.362191034e-02f, +5.557987412e-02f, +5.502543896e-02f, +5.202411782e-02f, +4.692580129e-02f, +4.030510627e-02f, +3.286594728e-02f, +2.533006476e-02f, +1.833169210e-02f, +1.233787229e-02f, +7.607034019e-03f, +4.189219495e-03f, +1.962204733e-03f, +6.908691701e-04f, + -3.738534770e-05f, -6.664112530e-05f, -1.035207805e-04f, -1.446496947e-04f, -1.847403082e-04f, -2.172856968e-04f, -2.356656303e-04f, -2.344559875e-04f, -2.106559329e-04f, -1.645390058e-04f, -9.990169528e-05f, -2.361288858e-05f, +5.547148255e-05f, +1.280132790e-04f, +1.857996784e-04f, +2.231115807e-04f, +2.375692277e-04f, +2.302971523e-04f, +2.054107328e-04f, +1.689795512e-04f, +1.277301149e-04f, +8.778760047e-05f, +5.371828929e-05f, +2.803656886e-05f, + /* 0,10 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.109828299e-03f, +2.736618658e-03f, +5.423921330e-03f, +9.368993310e-03f, +1.463026269e-02f, +2.107558270e-02f, +2.835948448e-02f, +3.593966347e-02f, +4.313490132e-02f, +4.921715706e-02f, +5.352200865e-02f, +5.555626123e-02f, +5.508091044e-02f, +5.215213110e-02f, +4.711160097e-02f, +4.052821785e-02f, +3.310351651e-02f, +2.556036191e-02f, +1.853710284e-02f, +1.250685184e-02f, +7.734764134e-03f, +4.277007096e-03f, +2.015923023e-03f, +7.189057390e-04f, + -3.661314192e-05f, -6.559954993e-05f, -1.022810507e-04f, -1.433485289e-04f, -1.835662257e-04f, -2.164503001e-04f, -2.353646174e-04f, -2.348278912e-04f, -2.117480312e-04f, -1.662889481e-04f, -1.021402136e-04f, -2.608824006e-05f, +5.305179922e-05f, +1.259321426e-04f, +1.842820166e-04f, +2.222883106e-04f, +2.374607067e-04f, +2.308187252e-04f, +2.063978428e-04f, +1.702256220e-04f, +1.290280359e-04f, +8.896565621e-05f, +5.466359004e-05f, +2.870272812e-05f, + /* 0,11 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.073215158e-03f, +2.671019108e-03f, +5.321640279e-03f, +9.225644781e-03f, +1.444669647e-02f, +2.085913240e-02f, +2.812411986e-02f, +3.570483557e-02f, +4.292315329e-02f, +4.905086811e-02f, +5.341986844e-02f, +5.553017299e-02f, +5.513396224e-02f, +5.227806324e-02f, +4.729588299e-02f, +4.075050616e-02f, +3.334097721e-02f, +2.579118063e-02f, +1.874350068e-02f, +1.267707746e-02f, +7.863792170e-03f, +4.365972752e-03f, +2.070586613e-03f, +7.476084671e-04f, + -3.584978049e-05f, -6.456566540e-05f, -1.010457663e-04f, -1.420466395e-04f, -1.823849963e-04f, -2.156011663e-04f, -2.350444110e-04f, -2.351775086e-04f, -2.128179804e-04f, -1.680203798e-04f, -1.043669379e-04f, -2.856053128e-05f, +5.062591276e-05f, +1.238366106e-04f, +1.827442103e-04f, +2.214424487e-04f, +2.373306314e-04f, +2.313227709e-04f, +2.073734206e-04f, +1.714668346e-04f, +1.303271956e-04f, +9.014950911e-05f, +5.561720797e-05f, +2.937768631e-05f, + /* 0,12 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.037365377e-03f, +2.606453443e-03f, +5.220594513e-03f, +9.083598142e-03f, +1.426431147e-02f, +2.064353123e-02f, +2.788907545e-02f, +3.546965807e-02f, +4.271033531e-02f, +4.888284773e-02f, +5.331550150e-02f, +5.550161246e-02f, +5.518458815e-02f, +5.240189986e-02f, +4.747862720e-02f, +4.097194861e-02f, +3.357830785e-02f, +2.602250340e-02f, +1.895087410e-02f, +1.284854430e-02f, +7.994119366e-03f, +4.456122261e-03f, +2.126203821e-03f, +7.769861534e-04f, + -3.509526789e-05f, -6.353953899e-05f, -9.981506022e-05f, -1.407442116e-04f, -1.811968298e-04f, -2.147384913e-04f, -2.347051515e-04f, -2.355048907e-04f, -2.138657227e-04f, -1.697331367e-04f, -1.065816209e-04f, -3.102947289e-05f, +4.819410453e-05f, +1.217269082e-04f, +1.811863919e-04f, +2.205740179e-04f, +2.371789201e-04f, +2.318091276e-04f, +2.083372615e-04f, +1.727029831e-04f, +1.316274228e-04f, +9.133904628e-05f, +5.657909639e-05f, +3.006145594e-05f, + /* 0,13 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.002270109e-03f, +2.542913904e-03f, +5.120779452e-03f, +8.942853930e-03f, +1.408311464e-02f, +2.042879274e-02f, +2.765437030e-02f, +3.523415318e-02f, +4.249646959e-02f, +4.871311459e-02f, +5.320891988e-02f, +5.547058299e-02f, +5.523278225e-02f, +5.252362676e-02f, +4.765981359e-02f, +4.119252263e-02f, +3.381548677e-02f, +2.625431253e-02f, +1.915921136e-02f, +1.302124728e-02f, +8.125746789e-03f, +4.547461308e-03f, +2.182782917e-03f, +8.070476094e-04f, + -3.434960685e-05f, -6.252123589e-05f, -9.858906309e-05f, -1.394414293e-04f, -1.800019355e-04f, -2.138624717e-04f, -2.343469818e-04f, -2.358100918e-04f, -2.148912040e-04f, -1.714270575e-04f, -1.087840172e-04f, -3.349477614e-05f, +4.575665691e-05f, +1.196032629e-04f, +1.796086972e-04f, +2.196830446e-04f, +2.370054938e-04f, +2.322776351e-04f, +2.092891617e-04f, +1.739338611e-04f, +1.329285447e-04f, +9.253415281e-05f, +5.754920659e-05f, +3.075404787e-05f, + /* 0,14 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +9.679205023e-04f, +2.480392668e-03f, +5.022190389e-03f, +8.803412501e-03f, +1.390311270e-02f, +2.021493027e-02f, +2.742002332e-02f, +3.499834308e-02f, +4.228157838e-02f, +4.854168753e-02f, +5.310013586e-02f, +5.543708821e-02f, +5.527853891e-02f, +5.264323003e-02f, +4.783942229e-02f, +4.141220567e-02f, +3.405249226e-02f, +2.648659017e-02f, +1.936850052e-02f, +1.319518114e-02f, +8.258675333e-03f, +4.639995460e-03f, +2.240332124e-03f, +8.378016572e-04f, + -3.361279831e-05f, -6.151081921e-05f, -9.736790378e-05f, -1.381384751e-04f, -1.788005228e-04f, -2.129733054e-04f, -2.339700470e-04f, -2.360931689e-04f, -2.158943737e-04f, -1.731019841e-04f, -1.109738837e-04f, -3.595615288e-05f, +4.331385324e-05f, +1.174659045e-04f, +1.780112652e-04f, +2.187695585e-04f, +2.368102768e-04f, +2.327281357e-04f, +2.102289181e-04f, +1.751592616e-04f, +1.342303873e-04f, +9.373471177e-05f, +5.852748780e-05f, +3.145547134e-05f, + /* 0,15 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +9.343077040e-04f, +2.418881849e-03f, +4.924822486e-03f, +8.665274026e-03f, +1.372431218e-02f, +2.000195696e-02f, +2.718605327e-02f, +3.476224991e-02f, +4.206568401e-02f, +4.836858555e-02f, +5.298916198e-02f, +5.540113206e-02f, +5.532185276e-02f, +5.276069593e-02f, +4.801743355e-02f, +4.163097523e-02f, +3.428930254e-02f, +2.671931830e-02f, +1.957872944e-02f, +1.337034040e-02f, +8.392905721e-03f, +4.733730172e-03f, +2.298859611e-03f, +8.692571286e-04f, + -3.288484150e-05f, -6.050835000e-05f, -9.615170919e-05f, -1.368355303e-04f, -1.775928005e-04f, -2.120711910e-04f, -2.335744944e-04f, -2.363541826e-04f, -2.168751846e-04f, -1.747577616e-04f, -1.131509793e-04f, -3.841331568e-05f, +4.086597778e-05f, +1.153150651e-04f, +1.763942382e-04f, +2.178335929e-04f, +2.365931963e-04f, +2.331604734e-04f, +2.111563284e-04f, +1.763789774e-04f, +1.355327749e-04f, +9.494060420e-05f, +5.951388722e-05f, +3.216573391e-05f, + /* 0,16 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +9.014228625e-04f, +2.358373499e-03f, +4.828670776e-03f, +8.528438495e-03f, +1.354671938e-02f, +1.978988577e-02f, +2.695247878e-02f, +3.452589573e-02f, +4.184880882e-02f, +4.819382779e-02f, +5.287601100e-02f, +5.536271874e-02f, +5.536271874e-02f, +5.287601100e-02f, +4.819382779e-02f, +4.184880882e-02f, +3.452589573e-02f, +2.695247878e-02f, +1.978988577e-02f, +1.354671938e-02f, +8.528438495e-03f, +4.828670776e-03f, +2.358373499e-03f, +9.014228625e-04f, + -3.216573391e-05f, -5.951388722e-05f, -9.494060420e-05f, -1.355327749e-04f, -1.763789774e-04f, -2.111563284e-04f, -2.331604734e-04f, -2.365931963e-04f, -2.178335929e-04f, -1.763942382e-04f, -1.153150651e-04f, -4.086597778e-05f, +3.841331568e-05f, +1.131509793e-04f, +1.747577616e-04f, +2.168751846e-04f, +2.363541826e-04f, +2.335744944e-04f, +2.120711910e-04f, +1.775928005e-04f, +1.368355303e-04f, +9.615170919e-05f, +6.050835000e-05f, +3.288484150e-05f, + /* 0,17 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +8.692571286e-04f, +2.298859611e-03f, +4.733730172e-03f, +8.392905721e-03f, +1.337034040e-02f, +1.957872944e-02f, +2.671931830e-02f, +3.428930254e-02f, +4.163097523e-02f, +4.801743355e-02f, +5.276069593e-02f, +5.532185276e-02f, +5.540113206e-02f, +5.298916198e-02f, +4.836858555e-02f, +4.206568401e-02f, +3.476224991e-02f, +2.718605327e-02f, +2.000195696e-02f, +1.372431218e-02f, +8.665274026e-03f, +4.924822486e-03f, +2.418881849e-03f, +9.343077040e-04f, + -3.145547134e-05f, -5.852748780e-05f, -9.373471177e-05f, -1.342303873e-04f, -1.751592616e-04f, -2.102289181e-04f, -2.327281357e-04f, -2.368102768e-04f, -2.187695585e-04f, -1.780112652e-04f, -1.174659045e-04f, -4.331385324e-05f, +3.595615288e-05f, +1.109738837e-04f, +1.731019841e-04f, +2.158943737e-04f, +2.360931689e-04f, +2.339700470e-04f, +2.129733054e-04f, +1.788005228e-04f, +1.381384751e-04f, +9.736790378e-05f, +6.151081921e-05f, +3.361279831e-05f, + /* 0,18 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +8.378016572e-04f, +2.240332124e-03f, +4.639995460e-03f, +8.258675333e-03f, +1.319518114e-02f, +1.936850052e-02f, +2.648659017e-02f, +3.405249226e-02f, +4.141220567e-02f, +4.783942229e-02f, +5.264323003e-02f, +5.527853891e-02f, +5.543708821e-02f, +5.310013586e-02f, +4.854168753e-02f, +4.228157838e-02f, +3.499834308e-02f, +2.742002332e-02f, +2.021493027e-02f, +1.390311270e-02f, +8.803412501e-03f, +5.022190389e-03f, +2.480392668e-03f, +9.679205023e-04f, + -3.075404787e-05f, -5.754920659e-05f, -9.253415281e-05f, -1.329285447e-04f, -1.739338611e-04f, -2.092891617e-04f, -2.322776351e-04f, -2.370054938e-04f, -2.196830446e-04f, -1.796086972e-04f, -1.196032629e-04f, -4.575665691e-05f, +3.349477614e-05f, +1.087840172e-04f, +1.714270575e-04f, +2.148912040e-04f, +2.358100918e-04f, +2.343469818e-04f, +2.138624717e-04f, +1.800019355e-04f, +1.394414293e-04f, +9.858906309e-05f, +6.252123589e-05f, +3.434960685e-05f, + /* 0,19 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +8.070476094e-04f, +2.182782917e-03f, +4.547461308e-03f, +8.125746789e-03f, +1.302124728e-02f, +1.915921136e-02f, +2.625431253e-02f, +3.381548677e-02f, +4.119252263e-02f, +4.765981359e-02f, +5.252362676e-02f, +5.523278225e-02f, +5.547058299e-02f, +5.320891988e-02f, +4.871311459e-02f, +4.249646959e-02f, +3.523415318e-02f, +2.765437030e-02f, +2.042879274e-02f, +1.408311464e-02f, +8.942853930e-03f, +5.120779452e-03f, +2.542913904e-03f, +1.002270109e-03f, + -3.006145594e-05f, -5.657909639e-05f, -9.133904628e-05f, -1.316274228e-04f, -1.727029831e-04f, -2.083372615e-04f, -2.318091276e-04f, -2.371789201e-04f, -2.205740179e-04f, -1.811863919e-04f, -1.217269082e-04f, -4.819410453e-05f, +3.102947289e-05f, +1.065816209e-04f, +1.697331367e-04f, +2.138657227e-04f, +2.355048907e-04f, +2.347051515e-04f, +2.147384913e-04f, +1.811968298e-04f, +1.407442116e-04f, +9.981506022e-05f, +6.353953899e-05f, +3.509526789e-05f, + /* 0,20 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +7.769861534e-04f, +2.126203821e-03f, +4.456122261e-03f, +7.994119366e-03f, +1.284854430e-02f, +1.895087410e-02f, +2.602250340e-02f, +3.357830785e-02f, +4.097194861e-02f, +4.747862720e-02f, +5.240189986e-02f, +5.518458815e-02f, +5.550161246e-02f, +5.331550150e-02f, +4.888284773e-02f, +4.271033531e-02f, +3.546965807e-02f, +2.788907545e-02f, +2.064353123e-02f, +1.426431147e-02f, +9.083598142e-03f, +5.220594513e-03f, +2.606453443e-03f, +1.037365377e-03f, + -2.937768631e-05f, -5.561720797e-05f, -9.014950911e-05f, -1.303271956e-04f, -1.714668346e-04f, -2.073734206e-04f, -2.313227709e-04f, -2.373306314e-04f, -2.214424487e-04f, -1.827442103e-04f, -1.238366106e-04f, -5.062591276e-05f, +2.856053128e-05f, +1.043669379e-04f, +1.680203798e-04f, +2.128179804e-04f, +2.351775086e-04f, +2.350444110e-04f, +2.156011663e-04f, +1.823849963e-04f, +1.420466395e-04f, +1.010457663e-04f, +6.456566540e-05f, +3.584978049e-05f, + /* 0,21 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +7.476084671e-04f, +2.070586613e-03f, +4.365972752e-03f, +7.863792170e-03f, +1.267707746e-02f, +1.874350068e-02f, +2.579118063e-02f, +3.334097721e-02f, +4.075050616e-02f, +4.729588299e-02f, +5.227806324e-02f, +5.513396224e-02f, +5.553017299e-02f, +5.341986844e-02f, +4.905086811e-02f, +4.292315329e-02f, +3.570483557e-02f, +2.812411986e-02f, +2.085913240e-02f, +1.444669647e-02f, +9.225644781e-03f, +5.321640279e-03f, +2.671019108e-03f, +1.073215158e-03f, + -2.870272812e-05f, -5.466359004e-05f, -8.896565621e-05f, -1.290280359e-04f, -1.702256220e-04f, -2.063978428e-04f, -2.308187252e-04f, -2.374607067e-04f, -2.222883106e-04f, -1.842820166e-04f, -1.259321426e-04f, -5.305179922e-05f, +2.608824006e-05f, +1.021402136e-04f, +1.662889481e-04f, +2.117480312e-04f, +2.348278912e-04f, +2.353646174e-04f, +2.164503001e-04f, +1.835662257e-04f, +1.433485289e-04f, +1.022810507e-04f, +6.559954993e-05f, +3.661314192e-05f, + /* 0,22 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +7.189057390e-04f, +2.015923023e-03f, +4.277007096e-03f, +7.734764134e-03f, +1.250685184e-02f, +1.853710284e-02f, +2.556036191e-02f, +3.310351651e-02f, +4.052821785e-02f, +4.711160097e-02f, +5.215213110e-02f, +5.508091044e-02f, +5.555626123e-02f, +5.352200865e-02f, +4.921715706e-02f, +4.313490132e-02f, +3.593966347e-02f, +2.835948448e-02f, +2.107558270e-02f, +1.463026269e-02f, +9.368993310e-03f, +5.423921330e-03f, +2.736618658e-03f, +1.109828299e-03f, + -2.803656886e-05f, -5.371828929e-05f, -8.778760047e-05f, -1.277301149e-04f, -1.689795512e-04f, -2.054107328e-04f, -2.302971523e-04f, -2.375692277e-04f, -2.231115807e-04f, -1.857996784e-04f, -1.280132790e-04f, -5.547148255e-05f, +2.361288858e-05f, +9.990169528e-05f, +1.645390058e-04f, +2.106559329e-04f, +2.344559875e-04f, +2.356656303e-04f, +2.172856968e-04f, +1.847403082e-04f, +1.446496947e-04f, +1.035207805e-04f, +6.664112530e-05f, +3.738534770e-05f, + /* 0,23 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +6.908691701e-04f, +1.962204733e-03f, +4.189219495e-03f, +7.607034019e-03f, +1.233787229e-02f, +1.833169210e-02f, +2.533006476e-02f, +3.286594728e-02f, +4.030510627e-02f, +4.692580129e-02f, +5.202411782e-02f, +5.502543896e-02f, +5.557987412e-02f, +5.362191034e-02f, +4.938169606e-02f, +4.334555725e-02f, +3.617411945e-02f, +2.859515011e-02f, +2.129286839e-02f, +1.481500300e-02f, +9.513643005e-03f, +5.527442110e-03f, +2.803259783e-03f, +1.147213647e-03f, + -2.737919445e-05f, -5.278135038e-05f, -8.661545276e-05f, -1.264336021e-04f, -1.677288274e-04f, -2.044122956e-04f, -2.297582162e-04f, -2.376562792e-04f, -2.239122397e-04f, -1.872970664e-04f, -1.300797972e-04f, -5.788468247e-05f, +2.113476669e-05f, +9.765163225e-05f, +1.627707202e-04f, +2.095417464e-04f, +2.340617500e-04f, +2.359473116e-04f, +2.181071619e-04f, +1.859070338e-04f, +1.459499503e-04f, +1.047648212e-04f, +6.769032218e-05f, +3.816639157e-05f, + /* 0,24 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +6.634899757e-04f, +1.909423383e-03f, +4.102604043e-03f, +7.480600417e-03f, +1.217014346e-02f, +1.812727981e-02f, +2.510030654e-02f, +3.262829100e-02f, +4.008119403e-02f, +4.673850422e-02f, +5.189403803e-02f, +5.496755427e-02f, +5.560100889e-02f, +5.371956198e-02f, +4.954446678e-02f, +4.355509900e-02f, +3.640818120e-02f, +2.883109742e-02f, +2.151097556e-02f, +1.500091003e-02f, +9.659592955e-03f, +5.632206931e-03f, +2.870950105e-03f, +1.185380039e-03f, + -2.673058920e-05f, -5.185281596e-05f, -8.544932188e-05f, -1.251386658e-04f, -1.664736552e-04f, -2.034027372e-04f, -2.292020825e-04f, -2.377219491e-04f, -2.246902716e-04f, -1.887740547e-04f, -1.321314770e-04f, -6.029111978e-05f, +1.865416474e-05f, +9.539027583e-05f, +1.609842617e-04f, +2.084055364e-04f, +2.336451340e-04f, +2.362095255e-04f, +2.189145021e-04f, +1.870661925e-04f, +1.472491081e-04f, +1.060130363e-04f, +6.874706913e-05f, +3.895626544e-05f, + /* 0,25 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +6.367593865e-04f, +1.857570567e-03f, +4.017154721e-03f, +7.355461751e-03f, +1.200366981e-02f, +1.792387707e-02f, +2.487110446e-02f, +3.239056905e-02f, +3.985650376e-02f, +4.654973017e-02f, +5.176190655e-02f, +5.490726315e-02f, +5.561966305e-02f, +5.381495225e-02f, +4.970545104e-02f, +4.376350454e-02f, +3.664182634e-02f, +2.906730695e-02f, +2.172989006e-02f, +1.518797623e-02f, +9.806842063e-03f, +5.738219968e-03f, +2.939697175e-03f, +1.224336304e-03f, + -2.609073586e-05f, -5.093272665e-05f, -8.428931461e-05f, -1.238454723e-04f, -1.652142386e-04f, -2.023822639e-04f, -2.286289191e-04f, -2.377663278e-04f, -2.254456640e-04f, -1.902305206e-04f, -1.341681007e-04f, -6.269051648e-05f, +1.617137348e-05f, +9.311787923e-05f, +1.591798037e-04f, +2.072473709e-04f, +2.332060983e-04f, +2.364521385e-04f, +2.197075250e-04f, +1.882175742e-04f, +1.485469791e-04f, +1.072652872e-04f, +6.981129264e-05f, +3.975495944e-05f, + /* 0,26 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +6.106686506e-04f, +1.806637840e-03f, +3.932865406e-03f, +7.231616279e-03f, +1.183845557e-02f, +1.772149481e-02f, +2.464247554e-02f, +3.215280272e-02f, +3.963105810e-02f, +4.635949965e-02f, +5.162773845e-02f, +5.484457264e-02f, +5.563583443e-02f, +5.390807013e-02f, +4.986463085e-02f, +4.397075191e-02f, +3.687503244e-02f, +2.930375909e-02f, +2.194959758e-02f, +1.537619380e-02f, +9.955389042e-03f, +5.845485255e-03f, +3.009508467e-03f, +1.264091264e-03f, + -2.545961565e-05f, -5.002112110e-05f, -8.313553567e-05f, -1.225541865e-04f, -1.639507809e-04f, -2.013510827e-04f, -2.280388952e-04f, -2.377895090e-04f, -2.261784077e-04f, -1.916663450e-04f, -1.361894531e-04f, -6.508259574e-05f, +1.368668407e-05f, +9.083469754e-05f, +1.573575226e-04f, +2.060673215e-04f, +2.327446049e-04f, +2.366750198e-04f, +2.204860398e-04f, +1.893609687e-04f, +1.498433732e-04f, +1.085214336e-04f, +7.088291709e-05f, +4.056246185e-05f, + /* 0,27 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.852090350e-04f, +1.756616719e-03f, +3.849729871e-03f, +7.109062093e-03f, +1.167450479e-02f, +1.752014373e-02f, +2.441443664e-02f, +3.191501321e-02f, +3.940487969e-02f, +4.616783330e-02f, +5.149154900e-02f, +5.477949004e-02f, +5.564952111e-02f, +5.399890483e-02f, +5.002198837e-02f, +4.417681923e-02f, +3.710777704e-02f, +2.954043411e-02f, +2.217008362e-02f, +1.556555477e-02f, +1.010523242e-02f, +5.954006688e-03f, +3.080391384e-03f, +1.304653725e-03f, + -2.483720823e-05f, -4.911803594e-05f, -8.198808773e-05f, -1.212649717e-04f, -1.626834846e-04f, -2.003094010e-04f, -2.274321824e-04f, -2.377915891e-04f, -2.268884971e-04f, -1.930814118e-04f, -1.381953216e-04f, -6.746708201e-05f, +1.120038797e-05f, +8.854098772e-05f, +1.555175978e-04f, +2.048654630e-04f, +2.322606191e-04f, +2.368780408e-04f, +2.212498566e-04f, +1.904961658e-04f, +1.511380992e-04f, +1.097813335e-04f, +7.196186479e-05f, +4.137875911e-05f, + /* 0,28 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.603718267e-04f, +1.707498683e-03f, +3.767741783e-03f, +6.987797121e-03f, +1.151182130e-02f, +1.731983432e-02f, +2.418700446e-02f, +3.167722163e-02f, +3.917799119e-02f, +4.597475189e-02f, +5.135335367e-02f, +5.471202296e-02f, +5.566072150e-02f, +5.408744582e-02f, +5.017750597e-02f, +4.438168469e-02f, +3.734003766e-02f, +2.977731215e-02f, +2.239133348e-02f, +1.575605093e-02f, +1.025637051e-02f, +6.063788022e-03f, +3.152353249e-03f, +1.346032485e-03f, + -2.422349177e-05f, -4.822350583e-05f, -8.084707136e-05f, -1.199779894e-04f, -1.614125515e-04f, -1.992574267e-04f, -2.268089534e-04f, -2.377726671e-04f, -2.275759301e-04f, -1.944756084e-04f, -1.401854962e-04f, -6.984370103e-05f, +8.712776940e-06f, +8.623700849e-05f, +1.536602113e-04f, +2.036418741e-04f, +2.317541095e-04f, +2.370610757e-04f, +2.219987871e-04f, +1.916229551e-04f, +1.524309647e-04f, +1.110448427e-04f, +7.304805597e-05f, +4.220383580e-05f, + /* 0,29 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.361483350e-04f, +1.659275177e-03f, +3.686894711e-03f, +6.867819132e-03f, +1.135040875e-02f, +1.712057690e-02f, +2.396019551e-02f, +3.143944896e-02f, +3.895041526e-02f, +4.578027628e-02f, +5.121316818e-02f, +5.464217926e-02f, +5.566943427e-02f, +5.417368283e-02f, +5.033116618e-02f, +4.458532657e-02f, +3.757179177e-02f, +3.001437322e-02f, +2.261333227e-02f, +1.594767389e-02f, +1.040880148e-02f, +6.174832865e-03f, +3.225401305e-03f, +1.388236320e-03f, + -2.361844294e-05f, -4.733756345e-05f, -7.971258511e-05f, -1.186933996e-04f, -1.601381827e-04f, -1.981953682e-04f, -2.261693833e-04f, -2.377328453e-04f, -2.282407078e-04f, -1.958488257e-04f, -1.421597696e-04f, -7.221217990e-05f, +6.224142940e-06f, +8.392302033e-05f, +1.517855485e-04f, +2.023966364e-04f, +2.312250478e-04f, +2.372240010e-04f, +2.227326442e-04f, +1.927411265e-04f, +1.537217763e-04f, +1.123118154e-04f, +7.414140875e-05f, +4.303767463e-05f, + /* 0,30 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.125298920e-04f, +1.611937614e-03f, +3.607182126e-03f, +6.749125732e-03f, +1.119027057e-02f, +1.692238153e-02f, +2.373402612e-02f, +3.120171611e-02f, +3.872217455e-02f, +4.558442746e-02f, +5.107100841e-02f, +5.456996708e-02f, +5.567565842e-02f, +5.425760585e-02f, +5.048295173e-02f, +4.478772320e-02f, +3.780301682e-02f, +3.025159722e-02f, +2.283606491e-02f, +1.614041502e-02f, +1.056252326e-02f, +6.287144680e-03f, +3.299542714e-03f, +1.431273995e-03f, + -2.302203695e-05f, -4.646023953e-05f, -7.858472543e-05f, -1.174113605e-04f, -1.588605782e-04f, -1.971234341e-04f, -2.255136482e-04f, -2.376722283e-04f, -2.288828348e-04f, -1.972009578e-04f, -1.441179370e-04f, -7.457224711e-05f, +3.734778125e-06f, +8.159928545e-05f, +1.498937974e-04f, +2.011298355e-04f, +2.306734093e-04f, +2.373666959e-04f, +2.234512424e-04f, +1.938504700e-04f, +1.550103394e-04f, +1.135821039e-04f, +7.524183918e-05f, +4.388025644e-05f, + /* 0,31 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.895078551e-04f, +1.565477374e-03f, +3.528597401e-03f, +6.631714371e-03f, +1.103140999e-02f, +1.672525810e-02f, +2.350851248e-02f, +3.096404388e-02f, +3.849329172e-02f, +4.538722650e-02f, +5.092689047e-02f, +5.449539483e-02f, +5.567939320e-02f, +5.433920513e-02f, +5.063284553e-02f, +4.498885304e-02f, +3.803369023e-02f, +3.048896392e-02f, +2.305951615e-02f, +1.633426549e-02f, +1.071753360e-02f, +6.400726784e-03f, +3.374784553e-03f, +1.475154251e-03f, + -2.243424753e-05f, -4.559156282e-05f, -7.746358669e-05f, -1.161320286e-04f, -1.575799374e-04f, -1.960418335e-04f, -2.248419263e-04f, -2.375909238e-04f, -2.295023193e-04f, -1.985319023e-04f, -1.460597965e-04f, -7.692363257e-05f, +1.244974771e-06f, +7.926606770e-05f, +1.479851488e-04f, +1.998415601e-04f, +2.300991725e-04f, +2.374890420e-04f, +2.241543973e-04f, +1.949507756e-04f, +1.562964586e-04f, +1.148555588e-04f, +7.634926120e-05f, +4.473156016e-05f, + /* 1, 0 (24) */ + +1.519885812e-03f, +3.451133814e-03f, +6.515582343e-03f, +1.087383005e-02f, +1.652921626e-02f, +2.328367055e-02f, +3.072645296e-02f, +3.826378940e-02f, +4.518869460e-02f, +5.078083067e-02f, +5.441847120e-02f, +5.568063817e-02f, +5.441847120e-02f, +5.078083067e-02f, +4.518869460e-02f, +3.826378940e-02f, +3.072645296e-02f, +2.328367055e-02f, +1.652921626e-02f, +1.087383005e-02f, +6.515582343e-03f, +3.451133814e-03f, +1.519885812e-03f, +4.670736076e-04f, + -4.473156016e-05f, -7.634926120e-05f, -1.148555588e-04f, -1.562964586e-04f, -1.949507756e-04f, -2.241543973e-04f, -2.374890420e-04f, -2.300991725e-04f, -1.998415601e-04f, -1.479851488e-04f, -7.926606770e-05f, -1.244974771e-06f, +7.692363257e-05f, +1.460597965e-04f, +1.985319023e-04f, +2.295023193e-04f, +2.375909238e-04f, +2.248419263e-04f, +1.960418335e-04f, +1.575799374e-04f, +1.161320286e-04f, +7.746358669e-05f, +4.559156282e-05f, +2.243424753e-05f, + -2.571886324e-03f, -4.676401683e-03f, -6.561668623e-03f, -7.164735847e-03f, -5.308059271e-03f, -9.514922051e-05f, +8.682143432e-03f, +2.028234462e-02f, +3.302709414e-02f, +4.462858385e-02f, +5.275755856e-02f, +5.568063817e-02f, +5.275755856e-02f, +4.462858385e-02f, +3.302709414e-02f, +2.028234462e-02f, +8.682143432e-03f, -9.514922051e-05f, -5.308059271e-03f, -7.164735847e-03f, -6.561668623e-03f, -4.676401683e-03f, -2.571886324e-03f, -9.379568278e-04f, + +6.057711558e-05f, +6.716380176e-05f, +4.569112297e-05f, -1.252739563e-05f, -1.055379432e-04f, -2.180533719e-04f, -3.234559409e-04f, -3.906185166e-04f, -3.936511404e-04f, -3.212149006e-04f, -1.818366243e-04f, -2.908776646e-06f, +1.766603177e-04f, +3.177737361e-04f, +3.925388696e-04f, +3.917885782e-04f, +3.262924828e-04f, +2.216145512e-04f, +1.088731127e-04f, +1.495214967e-05f, -4.444991597e-05f, -6.698223140e-05f, -6.107446643e-05f, -4.042206620e-05f, + /* 1, 1 (24) */ + +1.475154251e-03f, +3.374784553e-03f, +6.400726784e-03f, +1.071753360e-02f, +1.633426549e-02f, +2.305951615e-02f, +3.048896392e-02f, +3.803369023e-02f, +4.498885304e-02f, +5.063284553e-02f, +5.433920513e-02f, +5.567939320e-02f, +5.449539483e-02f, +5.092689047e-02f, +4.538722650e-02f, +3.849329172e-02f, +3.096404388e-02f, +2.350851248e-02f, +1.672525810e-02f, +1.103140999e-02f, +6.631714371e-03f, +3.528597401e-03f, +1.565477374e-03f, +4.895078551e-04f, + -4.388025644e-05f, -7.524183918e-05f, -1.135821039e-04f, -1.550103394e-04f, -1.938504700e-04f, -2.234512424e-04f, -2.373666959e-04f, -2.306734093e-04f, -2.011298355e-04f, -1.498937974e-04f, -8.159928545e-05f, -3.734778125e-06f, +7.457224711e-05f, +1.441179370e-04f, +1.972009578e-04f, +2.288828348e-04f, +2.376722283e-04f, +2.255136482e-04f, +1.971234341e-04f, +1.588605782e-04f, +1.174113605e-04f, +7.858472543e-05f, +4.646023953e-05f, +2.302203695e-05f, + -2.511309208e-03f, -4.609237881e-03f, -6.515977501e-03f, -7.177263242e-03f, -5.413597214e-03f, -3.132025924e-04f, +8.358687491e-03f, +1.989172610e-02f, +3.263344300e-02f, +4.430736895e-02f, +5.257572193e-02f, +5.567772939e-02f, +5.293421887e-02f, +4.494635759e-02f, +3.341963301e-02f, +2.067413320e-02f, +9.008435915e-03f, +1.264653307e-04f, -5.199186158e-03f, -7.149783697e-03f, -6.606118539e-03f, -4.743383914e-03f, -2.632960791e-03f, -9.783788940e-04f, + +6.006588847e-05f, +6.731755534e-05f, +4.689554782e-05f, -1.013775625e-05f, -1.022227988e-04f, -2.144856476e-04f, -3.205816252e-04f, -3.893845993e-04f, -3.946880233e-04f, -3.245890848e-04f, -1.869733261e-04f, -8.725687627e-06f, +1.714455010e-04f, +3.142661832e-04f, +3.913511592e-04f, +3.928941620e-04f, +3.290903040e-04f, +2.251682337e-04f, +1.122276266e-04f, +1.741175321e-05f, -4.317179353e-05f, -6.677245590e-05f, -6.155749209e-05f, -4.115169237e-05f, + /* 1, 2 (24) */ + +1.431273995e-03f, +3.299542714e-03f, +6.287144680e-03f, +1.056252326e-02f, +1.614041502e-02f, +2.283606491e-02f, +3.025159722e-02f, +3.780301682e-02f, +4.478772320e-02f, +5.048295173e-02f, +5.425760585e-02f, +5.567565842e-02f, +5.456996708e-02f, +5.107100841e-02f, +4.558442746e-02f, +3.872217455e-02f, +3.120171611e-02f, +2.373402612e-02f, +1.692238153e-02f, +1.119027057e-02f, +6.749125732e-03f, +3.607182126e-03f, +1.611937614e-03f, +5.125298920e-04f, + -4.303767463e-05f, -7.414140875e-05f, -1.123118154e-04f, -1.537217763e-04f, -1.927411265e-04f, -2.227326442e-04f, -2.372240010e-04f, -2.312250478e-04f, -2.023966364e-04f, -1.517855485e-04f, -8.392302033e-05f, -6.224142940e-06f, +7.221217990e-05f, +1.421597696e-04f, +1.958488257e-04f, +2.282407078e-04f, +2.377328453e-04f, +2.261693833e-04f, +1.981953682e-04f, +1.601381827e-04f, +1.186933996e-04f, +7.971258511e-05f, +4.733756345e-05f, +2.361844294e-05f, + -2.451243320e-03f, -4.541920326e-03f, -6.469081953e-03f, -7.187400998e-03f, -5.515820013e-03f, -5.276882399e-04f, +8.038105866e-03f, +1.950234150e-02f, +3.223875497e-02f, +4.398277987e-02f, +5.238874861e-02f, +5.566900371e-02f, +5.310566437e-02f, +4.526062377e-02f, +3.381098417e-02f, +2.106702736e-02f, +9.337526219e-03f, +3.516335643e-04f, -5.086958531e-03f, -7.132371944e-03f, -6.649290333e-03f, -4.810156370e-03f, -2.694518283e-03f, -1.019530586e-03f, + +5.954123292e-05f, +6.744388532e-05f, +4.806333441e-05f, -7.783483193e-06f, -9.892834806e-05f, -2.109123251e-04f, -3.176704877e-04f, -3.880874633e-04f, -3.956495901e-04f, -3.278957162e-04f, -1.920693398e-04f, -1.454067187e-05f, +1.661932803e-04f, +3.106928523e-04f, +3.900879776e-04f, +3.939346603e-04f, +3.318484630e-04f, +2.287134631e-04f, +1.156007930e-04f, +1.990592754e-05f, -4.185663315e-05f, -6.653409200e-05f, -6.202574269e-05f, -4.187973832e-05f, + /* 1, 3 (24) */ + +1.388236320e-03f, +3.225401305e-03f, +6.174832865e-03f, +1.040880148e-02f, +1.594767389e-02f, +2.261333227e-02f, +3.001437322e-02f, +3.757179177e-02f, +4.458532657e-02f, +5.033116618e-02f, +5.417368283e-02f, +5.566943427e-02f, +5.464217926e-02f, +5.121316818e-02f, +4.578027628e-02f, +3.895041526e-02f, +3.143944896e-02f, +2.396019551e-02f, +1.712057690e-02f, +1.135040875e-02f, +6.867819132e-03f, +3.686894711e-03f, +1.659275177e-03f, +5.361483350e-04f, + -4.220383580e-05f, -7.304805597e-05f, -1.110448427e-04f, -1.524309647e-04f, -1.916229551e-04f, -2.219987871e-04f, -2.370610757e-04f, -2.317541095e-04f, -2.036418741e-04f, -1.536602113e-04f, -8.623700849e-05f, -8.712776940e-06f, +6.984370103e-05f, +1.401854962e-04f, +1.944756084e-04f, +2.275759301e-04f, +2.377726671e-04f, +2.268089534e-04f, +1.992574267e-04f, +1.614125515e-04f, +1.199779894e-04f, +8.084707136e-05f, +4.822350583e-05f, +2.422349177e-05f, + -2.391702087e-03f, -4.474476440e-03f, -6.421018618e-03f, -7.195184482e-03f, -5.614748361e-03f, -7.386005651e-04f, +7.720435378e-03f, +1.911425404e-02f, +3.184310538e-02f, +4.365488415e-02f, +5.219667927e-02f, +5.565446303e-02f, +5.327185765e-02f, +4.557131662e-02f, +3.420107214e-02f, +2.146096202e-02f, +9.669374682e-03f, +5.803470275e-04f, -4.971357738e-03f, -7.112466016e-03f, -6.691146966e-03f, -4.876690462e-03f, -2.756544025e-03f, -1.061410325e-03f, + +5.900359551e-05f, +6.754318962e-05f, +4.919463712e-05f, -5.464814636e-06f, -9.565524824e-05f, -2.073343464e-04f, -3.147234851e-04f, -3.867277599e-04f, -3.965359323e-04f, -3.311342413e-04f, -1.971235943e-04f, -2.035244551e-05f, +1.609047730e-04f, +3.070543729e-04f, +3.887493134e-04f, +3.949094806e-04f, +3.345660239e-04f, +2.322492790e-04f, +1.189919086e-04f, +2.243438042e-05f, -4.050432324e-05f, -6.626676172e-05f, -6.247876761e-05f, -4.260584945e-05f, + /* 1, 4 (24) */ + +1.346032485e-03f, +3.152353249e-03f, +6.063788022e-03f, +1.025637051e-02f, +1.575605093e-02f, +2.239133348e-02f, +2.977731215e-02f, +3.734003766e-02f, +4.438168469e-02f, +5.017750597e-02f, +5.408744582e-02f, +5.566072150e-02f, +5.471202296e-02f, +5.135335367e-02f, +4.597475189e-02f, +3.917799119e-02f, +3.167722163e-02f, +2.418700446e-02f, +1.731983432e-02f, +1.151182130e-02f, +6.987797121e-03f, +3.767741783e-03f, +1.707498683e-03f, +5.603718267e-04f, + -4.137875911e-05f, -7.196186479e-05f, -1.097813335e-04f, -1.511380992e-04f, -1.904961658e-04f, -2.212498566e-04f, -2.368780408e-04f, -2.322606191e-04f, -2.048654630e-04f, -1.555175978e-04f, -8.854098772e-05f, -1.120038797e-05f, +6.746708201e-05f, +1.381953216e-04f, +1.930814118e-04f, +2.268884971e-04f, +2.377915891e-04f, +2.274321824e-04f, +2.003094010e-04f, +1.626834846e-04f, +1.212649717e-04f, +8.198808773e-05f, +4.911803594e-05f, +2.483720823e-05f, + -2.332698492e-03f, -4.406933251e-03f, -6.371823981e-03f, -7.200649296e-03f, -5.710403609e-03f, -9.459349115e-04f, +7.405711893e-03f, +1.872752628e-02f, +3.144656945e-02f, +4.332374991e-02f, +5.199955567e-02f, +5.563411059e-02f, +5.343276243e-02f, +4.587837100e-02f, +3.458982146e-02f, +2.185587150e-02f, +1.000394071e-02f, +8.125963065e-04f, -4.852365830e-03f, -7.090031636e-03f, -6.731651289e-03f, -4.942957224e-03f, -2.819022793e-03f, -1.104016174e-03f, + +5.845342137e-05f, +6.761587059e-05f, +5.028962066e-05f, -3.181975286e-06f, -9.240414446e-05f, -2.037526479e-04f, -3.117415784e-04f, -3.853061542e-04f, -3.973471616e-04f, -3.343041262e-04f, -2.021350307e-04f, -2.615972566e-05f, +1.555811067e-04f, +3.033513931e-04f, +3.873351753e-04f, +3.958180458e-04f, +3.372420571e-04f, +2.357747169e-04f, +1.224002588e-04f, +2.499680603e-05f, -3.911476326e-05f, -6.597009251e-05f, -6.291611563e-05f, -4.332966631e-05f, + /* 1, 5 (24) */ + +1.304653725e-03f, +3.080391384e-03f, +5.954006688e-03f, +1.010523242e-02f, +1.556555477e-02f, +2.217008362e-02f, +2.954043411e-02f, +3.710777704e-02f, +4.417681923e-02f, +5.002198837e-02f, +5.399890483e-02f, +5.564952111e-02f, +5.477949004e-02f, +5.149154900e-02f, +4.616783330e-02f, +3.940487969e-02f, +3.191501321e-02f, +2.441443664e-02f, +1.752014373e-02f, +1.167450479e-02f, +7.109062093e-03f, +3.849729871e-03f, +1.756616719e-03f, +5.852090350e-04f, + -4.056246185e-05f, -7.088291709e-05f, -1.085214336e-04f, -1.498433732e-04f, -1.893609687e-04f, -2.204860398e-04f, -2.366750198e-04f, -2.327446049e-04f, -2.060673215e-04f, -1.573575226e-04f, -9.083469754e-05f, -1.368668407e-05f, +6.508259574e-05f, +1.361894531e-04f, +1.916663450e-04f, +2.261784077e-04f, +2.377895090e-04f, +2.280388952e-04f, +2.013510827e-04f, +1.639507809e-04f, +1.225541865e-04f, +8.313553567e-05f, +5.002112110e-05f, +2.545961565e-05f, + -2.274245070e-03f, -4.339317380e-03f, -6.321534361e-03f, -7.203831272e-03f, -5.802807753e-03f, -1.149687559e-03f, +7.093970315e-03f, +1.834222013e-02f, +3.104922229e-02f, +4.298944578e-02f, +5.179742064e-02f, +5.560795086e-02f, +5.358834353e-02f, +4.618172239e-02f, +3.497715663e-02f, +2.225168955e-02f, +1.034118276e-02f, +1.048371023e-03f, -4.729965571e-03f, -7.065034830e-03f, -6.770766053e-03f, -5.008927316e-03f, -2.881938909e-03f, -1.147345840e-03f, + +5.789115407e-05f, +6.766233489e-05f, +5.134845990e-05f, -9.351764323e-07f, -8.917566987e-05f, -2.001681605e-04f, -3.087257329e-04f, -3.838233252e-04f, -3.980834092e-04f, -3.374048561e-04f, -2.071026027e-04f, -3.196123075e-05f, +1.502234199e-04f, +2.995845792e-04f, +3.858455924e-04f, +3.966597940e-04f, +3.398756389e-04f, +2.392888085e-04f, +1.258251183e-04f, +2.759288502e-05f, -3.768786388e-05f, -6.564371751e-05f, -6.333733508e-05f, -4.405082471e-05f, + /* 1, 6 (24) */ + +1.264091264e-03f, +3.009508467e-03f, +5.845485255e-03f, +9.955389042e-03f, +1.537619380e-02f, +2.194959758e-02f, +2.930375909e-02f, +3.687503244e-02f, +4.397075191e-02f, +4.986463085e-02f, +5.390807013e-02f, +5.563583443e-02f, +5.484457264e-02f, +5.162773845e-02f, +4.635949965e-02f, +3.963105810e-02f, +3.215280272e-02f, +2.464247554e-02f, +1.772149481e-02f, +1.183845557e-02f, +7.231616279e-03f, +3.932865406e-03f, +1.806637840e-03f, +6.106686506e-04f, + -3.975495944e-05f, -6.981129264e-05f, -1.072652872e-04f, -1.485469791e-04f, -1.882175742e-04f, -2.197075250e-04f, -2.364521385e-04f, -2.332060983e-04f, -2.072473709e-04f, -1.591798037e-04f, -9.311787923e-05f, -1.617137348e-05f, +6.269051648e-05f, +1.341681007e-04f, +1.902305206e-04f, +2.254456640e-04f, +2.377663278e-04f, +2.286289191e-04f, +2.023822639e-04f, +1.652142386e-04f, +1.238454723e-04f, +8.428931461e-05f, +5.093272665e-05f, +2.609073586e-05f, + -2.216353916e-03f, -4.271655045e-03f, -6.270185901e-03f, -7.204766448e-03f, -5.891983423e-03f, -1.349855720e-03f, +6.785244582e-03f, +1.795839680e-02f, +3.065113888e-02f, +4.265204093e-02f, +5.159031804e-02f, +5.557598963e-02f, +5.373856695e-02f, +4.648130697e-02f, +3.536300222e-02f, +2.264834934e-02f, +1.068105840e-02f, +1.287659832e-03f, -4.604140453e-03f, -7.037441945e-03f, -6.808453917e-03f, -5.074571034e-03f, -2.945276244e-03f, -1.191396665e-03f, + +5.731723542e-05f, +6.768299327e-05f, +5.237133972e-05f, +1.275384025e-06f, -8.597044546e-05f, -1.965818092e-04f, -3.056769175e-04f, -3.822799655e-04f, -3.987448259e-04f, -3.404359360e-04f, -2.120252768e-04f, -3.775568092e-05f, +1.448328608e-04f, +2.957546163e-04f, +3.842806141e-04f, +3.974341794e-04f, +3.424658527e-04f, +2.427905823e-04f, +1.292657505e-04f, +3.022228446e-05f, -3.622354707e-05f, -6.528727571e-05f, -6.374197407e-05f, -4.476895583e-05f, + /* 1, 7 (24) */ + +1.224336304e-03f, +2.939697175e-03f, +5.738219968e-03f, +9.806842063e-03f, +1.518797623e-02f, +2.172989006e-02f, +2.906730695e-02f, +3.664182634e-02f, +4.376350454e-02f, +4.970545104e-02f, +5.381495225e-02f, +5.561966305e-02f, +5.490726315e-02f, +5.176190655e-02f, +4.654973017e-02f, +3.985650376e-02f, +3.239056905e-02f, +2.487110446e-02f, +1.792387707e-02f, +1.200366981e-02f, +7.355461751e-03f, +4.017154721e-03f, +1.857570567e-03f, +6.367593865e-04f, + -3.895626544e-05f, -6.874706913e-05f, -1.060130363e-04f, -1.472491081e-04f, -1.870661925e-04f, -2.189145021e-04f, -2.362095255e-04f, -2.336451340e-04f, -2.084055364e-04f, -1.609842617e-04f, -9.539027583e-05f, -1.865416474e-05f, +6.029111978e-05f, +1.321314770e-04f, +1.887740547e-04f, +2.246902716e-04f, +2.377219491e-04f, +2.292020825e-04f, +2.034027372e-04f, +1.664736552e-04f, +1.251386658e-04f, +8.544932188e-05f, +5.185281596e-05f, +2.673058920e-05f, + -2.159036681e-03f, -4.203972052e-03f, -6.217814561e-03f, -7.203491064e-03f, -5.977953869e-03f, -1.546437529e-03f, +6.479567664e-03f, +1.757611683e-02f, +3.025239405e-02f, +4.231160499e-02f, +5.137829276e-02f, +5.553823395e-02f, +5.388339982e-02f, +4.677706159e-02f, +3.574728284e-02f, +2.304578352e-02f, +1.102352425e-02f, +1.530450414e-03f, -4.474874702e-03f, -7.007219660e-03f, -6.844677464e-03f, -5.139858309e-03f, -3.009018218e-03f, -1.236165621e-03f, + +5.673210536e-05f, +6.767826036e-05f, +5.335845485e-05f, +3.449521528e-06f, -8.278907995e-05f, -1.929945127e-04f, -3.025961045e-04f, -3.806767808e-04f, -3.993315822e-04f, -3.433968906e-04f, -2.169020328e-04f, -4.354179844e-05f, +1.394105874e-04f, +2.918622071e-04f, +3.826403100e-04f, +3.981406720e-04f, +3.450117886e-04f, +2.462790636e-04f, +1.327214084e-04f, +3.288465786e-05f, -3.472174628e-05f, -6.490041214e-05f, -6.412958061e-05f, -4.548368629e-05f, + /* 1, 8 (24) */ + +1.185380039e-03f, +2.870950105e-03f, +5.632206931e-03f, +9.659592955e-03f, +1.500091003e-02f, +2.151097556e-02f, +2.883109742e-02f, +3.640818120e-02f, +4.355509900e-02f, +4.954446678e-02f, +5.371956198e-02f, +5.560100889e-02f, +5.496755427e-02f, +5.189403803e-02f, +4.673850422e-02f, +4.008119403e-02f, +3.262829100e-02f, +2.510030654e-02f, +1.812727981e-02f, +1.217014346e-02f, +7.480600417e-03f, +4.102604043e-03f, +1.909423383e-03f, +6.634899757e-04f, + -3.816639157e-05f, -6.769032218e-05f, -1.047648212e-04f, -1.459499503e-04f, -1.859070338e-04f, -2.181071619e-04f, -2.359473116e-04f, -2.340617500e-04f, -2.095417464e-04f, -1.627707202e-04f, -9.765163225e-05f, -2.113476669e-05f, +5.788468247e-05f, +1.300797972e-04f, +1.872970664e-04f, +2.239122397e-04f, +2.376562792e-04f, +2.297582162e-04f, +2.044122956e-04f, +1.677288274e-04f, +1.264336021e-04f, +8.661545276e-05f, +5.278135038e-05f, +2.737919445e-05f, + -2.102304575e-03f, -4.136293792e-03f, -6.164456106e-03f, -7.200041542e-03f, -6.060742949e-03f, -1.739432042e-03f, +6.176971560e-03f, +1.719544005e-02f, +2.985306247e-02f, +4.196820810e-02f, +5.116139073e-02f, +5.549469215e-02f, +5.402281040e-02f, +4.706892379e-02f, +3.612992315e-02f, +2.344392419e-02f, +1.136853604e-02f, +1.776729478e-03f, -4.342153294e-03f, -6.974335002e-03f, -6.879399210e-03f, -5.204758722e-03f, -3.073147798e-03f, -1.281649307e-03f, + +5.613620176e-05f, +6.764855447e-05f, +5.431000971e-05f, +5.587064814e-06f, -7.963216967e-05f, -1.894071836e-04f, -2.994842696e-04f, -3.790144899e-04f, -3.998438681e-04f, -3.462872642e-04f, -2.217318639e-04f, -4.931830803e-05f, +1.339577671e-04f, +2.879080727e-04f, +3.809247703e-04f, +3.987787580e-04f, +3.475125441e-04f, +2.497532750e-04f, +1.361913343e-04f, +3.557964519e-05f, -3.318240655e-05f, -6.448277808e-05f, -6.449970283e-05f, -4.619463825e-05f, + /* 1, 9 (24) */ + +1.147213647e-03f, +2.803259783e-03f, +5.527442110e-03f, +9.513643005e-03f, +1.481500300e-02f, +2.129286839e-02f, +2.859515011e-02f, +3.617411945e-02f, +4.334555725e-02f, +4.938169606e-02f, +5.362191034e-02f, +5.557987412e-02f, +5.502543896e-02f, +5.202411782e-02f, +4.692580129e-02f, +4.030510627e-02f, +3.286594728e-02f, +2.533006476e-02f, +1.833169210e-02f, +1.233787229e-02f, +7.607034019e-03f, +4.189219495e-03f, +1.962204733e-03f, +6.908691701e-04f, + -3.738534770e-05f, -6.664112530e-05f, -1.035207805e-04f, -1.446496947e-04f, -1.847403082e-04f, -2.172856968e-04f, -2.356656303e-04f, -2.344559875e-04f, -2.106559329e-04f, -1.645390058e-04f, -9.990169528e-05f, -2.361288858e-05f, +5.547148255e-05f, +1.280132790e-04f, +1.857996784e-04f, +2.231115807e-04f, +2.375692277e-04f, +2.302971523e-04f, +2.054107328e-04f, +1.689795512e-04f, +1.277301149e-04f, +8.778760047e-05f, +5.371828929e-05f, +2.803656886e-05f, + -2.046168374e-03f, -4.068645237e-03f, -6.110146096e-03f, -7.194454478e-03f, -6.140375118e-03f, -1.928839225e-03f, +5.877487290e-03f, +1.681642556e-02f, +2.945321860e-02f, +4.162192084e-02f, +5.093965886e-02f, +5.544537384e-02f, +5.415676817e-02f, +4.735683186e-02f, +3.651084792e-02f, +2.384270295e-02f, +1.171604859e-02f, +2.026482753e-03f, -4.205961960e-03f, -6.938755357e-03f, -6.912581616e-03f, -5.269241500e-03f, -3.137647501e-03f, -1.327843946e-03f, + +5.552996031e-05f, +6.759429744e-05f, +5.522621826e-05f, +7.687855865e-06f, -7.650029847e-05f, -1.858207276e-04f, -2.963423910e-04f, -3.772938242e-04f, -4.002818927e-04f, -3.491066211e-04f, -2.265137770e-04f, -5.508393727e-05f, +1.284755764e-04f, +2.838929516e-04f, +3.791341056e-04f, +3.993479400e-04f, +3.499672243e-04f, +2.532122364e-04f, +1.396747604e-04f, +3.830687289e-05f, -3.160548461e-05f, -6.403403126e-05f, -6.485188912e-05f, -4.690142952e-05f, + /* 1,10 (24) */ + +1.109828299e-03f, +2.736618658e-03f, +5.423921330e-03f, +9.368993310e-03f, +1.463026269e-02f, +2.107558270e-02f, +2.835948448e-02f, +3.593966347e-02f, +4.313490132e-02f, +4.921715706e-02f, +5.352200865e-02f, +5.555626123e-02f, +5.508091044e-02f, +5.215213110e-02f, +4.711160097e-02f, +4.052821785e-02f, +3.310351651e-02f, +2.556036191e-02f, +1.853710284e-02f, +1.250685184e-02f, +7.734764134e-03f, +4.277007096e-03f, +2.015923023e-03f, +7.189057390e-04f, + -3.661314192e-05f, -6.559954993e-05f, -1.022810507e-04f, -1.433485289e-04f, -1.835662257e-04f, -2.164503001e-04f, -2.353646174e-04f, -2.348278912e-04f, -2.117480312e-04f, -1.662889481e-04f, -1.021402136e-04f, -2.608824006e-05f, +5.305179922e-05f, +1.259321426e-04f, +1.842820166e-04f, +2.222883106e-04f, +2.374607067e-04f, +2.308187252e-04f, +2.063978428e-04f, +1.702256220e-04f, +1.290280359e-04f, +8.896565621e-05f, +5.466359004e-05f, +2.870272812e-05f, + -1.990638413e-03f, -4.001050940e-03f, -6.054919878e-03f, -7.186766622e-03f, -6.216875417e-03f, -2.114659953e-03f, +5.581144899e-03f, +1.643913174e-02f, +2.905293671e-02f, +4.127281421e-02f, +5.071314509e-02f, +5.539028991e-02f, +5.428524375e-02f, +4.764072482e-02f, +3.688998202e-02f, +2.424205089e-02f, +1.206601581e-02f, +2.279694989e-03f, -4.066287199e-03f, -6.900448484e-03f, -6.944187101e-03f, -5.333275531e-03f, -3.202499390e-03f, -1.374745375e-03f, + +5.491381433e-05f, +6.751591438e-05f, +5.610730378e-05f, +9.751749846e-06f, -7.339403759e-05f, -1.822360436e-04f, -2.931714495e-04f, -3.755155275e-04f, -4.006458844e-04f, -3.518545456e-04f, -2.312467930e-04f, -6.083741698e-05f, +1.229652003e-04f, +2.798176001e-04f, +3.772684468e-04f, +3.998477374e-04f, +3.523749422e-04f, +2.566549656e-04f, +1.431709084e-04f, +4.106595391e-05f, -2.999094905e-05f, -6.355383603e-05f, -6.518568834e-05f, -4.760367367e-05f, + /* 1,11 (24) */ + +1.073215158e-03f, +2.671019108e-03f, +5.321640279e-03f, +9.225644781e-03f, +1.444669647e-02f, +2.085913240e-02f, +2.812411986e-02f, +3.570483557e-02f, +4.292315329e-02f, +4.905086811e-02f, +5.341986844e-02f, +5.553017299e-02f, +5.513396224e-02f, +5.227806324e-02f, +4.729588299e-02f, +4.075050616e-02f, +3.334097721e-02f, +2.579118063e-02f, +1.874350068e-02f, +1.267707746e-02f, +7.863792170e-03f, +4.365972752e-03f, +2.070586613e-03f, +7.476084671e-04f, + -3.584978049e-05f, -6.456566540e-05f, -1.010457663e-04f, -1.420466395e-04f, -1.823849963e-04f, -2.156011663e-04f, -2.350444110e-04f, -2.351775086e-04f, -2.128179804e-04f, -1.680203798e-04f, -1.043669379e-04f, -2.856053128e-05f, +5.062591276e-05f, +1.238366106e-04f, +1.827442103e-04f, +2.214424487e-04f, +2.373306314e-04f, +2.313227709e-04f, +2.073734206e-04f, +1.714668346e-04f, +1.303271956e-04f, +9.014950911e-05f, +5.561720797e-05f, +2.937768631e-05f, + -1.935724599e-03f, -3.933535025e-03f, -5.998812574e-03f, -7.177014872e-03f, -6.290269454e-03f, -2.296895997e-03f, +5.287973450e-03f, +1.606361621e-02f, +2.865229083e-02f, +4.092095967e-02f, +5.048189829e-02f, +5.532945249e-02f, +5.440820895e-02f, +4.792054242e-02f, +3.726725047e-02f, +2.464189863e-02f, +1.241839075e-02f, +2.536349955e-03f, -3.923116291e-03f, -6.859382530e-03f, -6.974178050e-03f, -5.396829367e-03f, -3.267685079e-03f, -1.422349049e-03f, + +5.428819468e-05f, +6.741383353e-05f, +5.695349877e-05f, +1.177861505e-05f, -7.031394560e-05f, -1.786540232e-04f, -2.899724281e-04f, -3.736803560e-04f, -4.009360908e-04f, -3.545306419e-04f, -2.359299473e-04f, -6.657748159e-05f, +1.174278323e-04f, +2.756827919e-04f, +3.753279455e-04f, +4.002776863e-04f, +3.547348191e-04f, +2.600804786e-04f, +1.466789902e-04f, +4.385648766e-05f, -2.833878040e-05f, -6.304186356e-05f, -6.550064997e-05f, -4.830098012e-05f, + /* 1,12 (24) */ + +1.037365377e-03f, +2.606453443e-03f, +5.220594513e-03f, +9.083598142e-03f, +1.426431147e-02f, +2.064353123e-02f, +2.788907545e-02f, +3.546965807e-02f, +4.271033531e-02f, +4.888284773e-02f, +5.331550150e-02f, +5.550161246e-02f, +5.518458815e-02f, +5.240189986e-02f, +4.747862720e-02f, +4.097194861e-02f, +3.357830785e-02f, +2.602250340e-02f, +1.895087410e-02f, +1.284854430e-02f, +7.994119366e-03f, +4.456122261e-03f, +2.126203821e-03f, +7.769861534e-04f, + -3.509526789e-05f, -6.353953899e-05f, -9.981506022e-05f, -1.407442116e-04f, -1.811968298e-04f, -2.147384913e-04f, -2.347051515e-04f, -2.355048907e-04f, -2.138657227e-04f, -1.697331367e-04f, -1.065816209e-04f, -3.102947289e-05f, +4.819410453e-05f, +1.217269082e-04f, +1.811863919e-04f, +2.205740179e-04f, +2.371789201e-04f, +2.318091276e-04f, +2.083372615e-04f, +1.727029831e-04f, +1.316274228e-04f, +9.133904628e-05f, +5.657909639e-05f, +3.006145594e-05f, + -1.881436404e-03f, -3.866121192e-03f, -5.941859076e-03f, -7.165236257e-03f, -6.360583400e-03f, -2.475550020e-03f, +4.998001022e-03f, +1.568993586e-02f, +2.825135474e-02f, +4.056642903e-02f, +5.024596835e-02f, +5.526287501e-02f, +5.452563678e-02f, +4.819622521e-02f, +3.764257842e-02f, +2.504217631e-02f, +1.277312557e-02f, +2.796430433e-03f, -3.776437301e-03f, -6.815526043e-03f, -7.002516830e-03f, -5.459871231e-03f, -3.333185729e-03f, -1.470650029e-03f, + +5.365352956e-05f, +6.728848602e-05f, +5.776504473e-05f, +1.376833283e-05f, -6.726056827e-05f, -1.750755508e-04f, -2.867463115e-04f, -3.717890774e-04f, -4.011527782e-04f, -3.571345343e-04f, -2.405622897e-04f, -7.230286952e-05f, +1.118646739e-04f, +2.714893178e-04f, +3.733127737e-04f, +4.006373398e-04f, +3.570459849e-04f, +2.634877895e-04f, +1.501982080e-04f, +4.667806016e-05f, -2.664897123e-05f, -6.249779202e-05f, -6.579632434e-05f, -4.899295427e-05f, + /* 1,13 (24) */ + +1.002270109e-03f, +2.542913904e-03f, +5.120779452e-03f, +8.942853930e-03f, +1.408311464e-02f, +2.042879274e-02f, +2.765437030e-02f, +3.523415318e-02f, +4.249646959e-02f, +4.871311459e-02f, +5.320891988e-02f, +5.547058299e-02f, +5.523278225e-02f, +5.252362676e-02f, +4.765981359e-02f, +4.119252263e-02f, +3.381548677e-02f, +2.625431253e-02f, +1.915921136e-02f, +1.302124728e-02f, +8.125746789e-03f, +4.547461308e-03f, +2.182782917e-03f, +8.070476094e-04f, + -3.434960685e-05f, -6.252123589e-05f, -9.858906309e-05f, -1.394414293e-04f, -1.800019355e-04f, -2.138624717e-04f, -2.343469818e-04f, -2.358100918e-04f, -2.148912040e-04f, -1.714270575e-04f, -1.087840172e-04f, -3.349477614e-05f, +4.575665691e-05f, +1.196032629e-04f, +1.796086972e-04f, +2.196830446e-04f, +2.370054938e-04f, +2.322776351e-04f, +2.092891617e-04f, +1.739338611e-04f, +1.329285447e-04f, +9.253415281e-05f, +5.754920659e-05f, +3.075404787e-05f, + -1.827782875e-03f, -3.798832706e-03f, -5.884094031e-03f, -7.151467924e-03f, -6.427843968e-03f, -2.650625571e-03f, +4.711254710e-03f, +1.531814678e-02f, +2.785020196e-02f, +4.020929449e-02f, +5.000540606e-02f, +5.519057214e-02f, +5.463750145e-02f, +4.846771453e-02f, +3.801589119e-02f, +2.544281365e-02f, +1.313017156e-02f, +3.059918223e-03f, -3.626239093e-03f, -6.768847983e-03f, -7.029165802e-03f, -5.522369023e-03f, -3.398982053e-03f, -1.519642983e-03f, + +5.301024443e-05f, +6.714030571e-05f, +5.854219200e-05f, +1.572079753e-05f, -6.423443851e-05f, -1.715015031e-04f, -2.834940860e-04f, -3.698424711e-04f, -4.012962317e-04f, -3.596658675e-04f, -2.451428848e-04f, -7.801232354e-05f, +1.062769342e-04f, +2.672379855e-04f, +3.712231236e-04f, +4.009262684e-04f, +3.593075781e-04f, +2.668759114e-04f, +1.537277542e-04f, +4.953024396e-05f, -2.492152632e-05f, -6.192130682e-05f, -6.607226275e-05f, -4.967919760e-05f, + /* 1,14 (24) */ + +9.679205023e-04f, +2.480392668e-03f, +5.022190389e-03f, +8.803412501e-03f, +1.390311270e-02f, +2.021493027e-02f, +2.742002332e-02f, +3.499834308e-02f, +4.228157838e-02f, +4.854168753e-02f, +5.310013586e-02f, +5.543708821e-02f, +5.527853891e-02f, +5.264323003e-02f, +4.783942229e-02f, +4.141220567e-02f, +3.405249226e-02f, +2.648659017e-02f, +1.936850052e-02f, +1.319518114e-02f, +8.258675333e-03f, +4.639995460e-03f, +2.240332124e-03f, +8.378016572e-04f, + -3.361279831e-05f, -6.151081921e-05f, -9.736790378e-05f, -1.381384751e-04f, -1.788005228e-04f, -2.129733054e-04f, -2.339700470e-04f, -2.360931689e-04f, -2.158943737e-04f, -1.731019841e-04f, -1.109738837e-04f, -3.595615288e-05f, +4.331385324e-05f, +1.174659045e-04f, +1.780112652e-04f, +2.187695585e-04f, +2.368102768e-04f, +2.327281357e-04f, +2.102289181e-04f, +1.751592616e-04f, +1.342303873e-04f, +9.373471177e-05f, +5.852748780e-05f, +3.145547134e-05f, + -1.774772630e-03f, -3.731692400e-03f, -5.825551839e-03f, -7.135747127e-03f, -6.492078407e-03f, -2.822127074e-03f, +4.427760624e-03f, +1.494830431e-02f, +2.744890573e-02f, +3.984962863e-02f, +4.976026317e-02f, +5.511255982e-02f, +5.474377839e-02f, +4.873495251e-02f, +3.838711431e-02f, +2.584373992e-02f, +1.348947914e-02f, +3.326794134e-03f, -3.472511338e-03f, -6.719317739e-03f, -7.054087328e-03f, -5.584290329e-03f, -3.465054316e-03f, -1.569322181e-03f, + +5.235876180e-05f, +6.696972897e-05f, +5.928519960e-05f, +1.763591641e-05f, -6.123607625e-05f, -1.679327488e-04f, -2.802167391e-04f, -3.678413279e-04f, -4.013667552e-04f, -3.621243063e-04f, -2.496708124e-04f, -8.370459117e-05f, +1.006658295e-04f, +2.629296196e-04f, +3.690592083e-04f, +4.011440598e-04f, +3.615187468e-04f, +2.702438562e-04f, +1.572668119e-04f, +5.241259825e-05f, -2.315646270e-05f, -6.131210073e-05f, -6.632801773e-05f, -5.035930779e-05f, + /* 1,15 (24) */ + +9.343077040e-04f, +2.418881849e-03f, +4.924822486e-03f, +8.665274026e-03f, +1.372431218e-02f, +2.000195696e-02f, +2.718605327e-02f, +3.476224991e-02f, +4.206568401e-02f, +4.836858555e-02f, +5.298916198e-02f, +5.540113206e-02f, +5.532185276e-02f, +5.276069593e-02f, +4.801743355e-02f, +4.163097523e-02f, +3.428930254e-02f, +2.671931830e-02f, +1.957872944e-02f, +1.337034040e-02f, +8.392905721e-03f, +4.733730172e-03f, +2.298859611e-03f, +8.692571286e-04f, + -3.288484150e-05f, -6.050835000e-05f, -9.615170919e-05f, -1.368355303e-04f, -1.775928005e-04f, -2.120711910e-04f, -2.335744944e-04f, -2.363541826e-04f, -2.168751846e-04f, -1.747577616e-04f, -1.131509793e-04f, -3.841331568e-05f, +4.086597778e-05f, +1.153150651e-04f, +1.763942382e-04f, +2.178335929e-04f, +2.365931963e-04f, +2.331604734e-04f, +2.111563284e-04f, +1.763789774e-04f, +1.355327749e-04f, +9.494060420e-05f, +5.951388722e-05f, +3.216573391e-05f, + -1.722413869e-03f, -3.664722671e-03f, -5.766266639e-03f, -7.118111210e-03f, -6.553314483e-03f, -2.990059823e-03f, +4.147543885e-03f, +1.458046298e-02f, +2.704753897e-02f, +3.948750432e-02f, +4.951059236e-02f, +5.502885522e-02f, +5.484444422e-02f, +4.899788213e-02f, +3.875617352e-02f, +2.624488398e-02f, +1.385099788e-02f, +3.597037991e-03f, -3.315244526e-03f, -6.666905140e-03f, -7.077243791e-03f, -5.645602430e-03f, -3.531382333e-03f, -1.619681489e-03f, + +5.169950117e-05f, +6.677719450e-05f, +5.999433503e-05f, +1.951360955e-05f, -5.826598844e-05f, -1.643701487e-04f, -2.769152592e-04f, -3.657864495e-04f, -4.013646710e-04f, -3.645095356e-04f, -2.541451677e-04f, -8.937842500e-05f, +9.503258313e-05f, +2.585650612e-04f, +3.668212610e-04f, +4.012903196e-04f, +3.636786482e-04f, +2.735906352e-04f, +1.608145551e-04f, +5.532466888e-05f, -2.135380981e-05f, -6.066987409e-05f, -6.656314316e-05f, -5.103287883e-05f, + /* 1,16 (24) */ + +9.014228625e-04f, +2.358373499e-03f, +4.828670776e-03f, +8.528438495e-03f, +1.354671938e-02f, +1.978988577e-02f, +2.695247878e-02f, +3.452589573e-02f, +4.184880882e-02f, +4.819382779e-02f, +5.287601100e-02f, +5.536271874e-02f, +5.536271874e-02f, +5.287601100e-02f, +4.819382779e-02f, +4.184880882e-02f, +3.452589573e-02f, +2.695247878e-02f, +1.978988577e-02f, +1.354671938e-02f, +8.528438495e-03f, +4.828670776e-03f, +2.358373499e-03f, +9.014228625e-04f, + -3.216573391e-05f, -5.951388722e-05f, -9.494060420e-05f, -1.355327749e-04f, -1.763789774e-04f, -2.111563284e-04f, -2.331604734e-04f, -2.365931963e-04f, -2.178335929e-04f, -1.763942382e-04f, -1.153150651e-04f, -4.086597778e-05f, +3.841331568e-05f, +1.131509793e-04f, +1.747577616e-04f, +2.168751846e-04f, +2.363541826e-04f, +2.335744944e-04f, +2.120711910e-04f, +1.775928005e-04f, +1.368355303e-04f, +9.615170919e-05f, +6.050835000e-05f, +3.288484150e-05f, + -1.670714367e-03f, -3.597945477e-03f, -5.706272304e-03f, -7.098597601e-03f, -6.611580471e-03f, -3.154429971e-03f, +3.870628626e-03f, +1.421467653e-02f, +2.664617430e-02f, +3.912299478e-02f, +4.925644719e-02f, +5.493947680e-02f, +5.493947680e-02f, +4.925644719e-02f, +3.912299478e-02f, +2.664617430e-02f, +1.421467653e-02f, +3.870628626e-03f, -3.154429971e-03f, -6.611580471e-03f, -7.098597601e-03f, -5.706272304e-03f, -3.597945477e-03f, -1.670714367e-03f, + +5.103287883e-05f, +6.656314316e-05f, +6.066987409e-05f, +2.135380981e-05f, -5.532466888e-05f, -1.608145551e-04f, -2.735906352e-04f, -3.636786482e-04f, -4.012903196e-04f, -3.668212610e-04f, -2.585650612e-04f, -9.503258313e-05f, +8.937842500e-05f, +2.541451677e-04f, +3.645095356e-04f, +4.013646710e-04f, +3.657864495e-04f, +2.769152592e-04f, +1.643701487e-04f, +5.826598844e-05f, -1.951360955e-05f, -5.999433503e-05f, -6.677719450e-05f, -5.169950117e-05f, + /* 1,17 (24) */ + +8.692571286e-04f, +2.298859611e-03f, +4.733730172e-03f, +8.392905721e-03f, +1.337034040e-02f, +1.957872944e-02f, +2.671931830e-02f, +3.428930254e-02f, +4.163097523e-02f, +4.801743355e-02f, +5.276069593e-02f, +5.532185276e-02f, +5.540113206e-02f, +5.298916198e-02f, +4.836858555e-02f, +4.206568401e-02f, +3.476224991e-02f, +2.718605327e-02f, +2.000195696e-02f, +1.372431218e-02f, +8.665274026e-03f, +4.924822486e-03f, +2.418881849e-03f, +9.343077040e-04f, + -3.145547134e-05f, -5.852748780e-05f, -9.373471177e-05f, -1.342303873e-04f, -1.751592616e-04f, -2.102289181e-04f, -2.327281357e-04f, -2.368102768e-04f, -2.187695585e-04f, -1.780112652e-04f, -1.174659045e-04f, -4.331385324e-05f, +3.595615288e-05f, +1.109738837e-04f, +1.731019841e-04f, +2.158943737e-04f, +2.360931689e-04f, +2.339700470e-04f, +2.129733054e-04f, +1.788005228e-04f, +1.381384751e-04f, +9.736790378e-05f, +6.151081921e-05f, +3.361279831e-05f, + -1.619681489e-03f, -3.531382333e-03f, -5.645602430e-03f, -7.077243791e-03f, -6.666905140e-03f, -3.315244526e-03f, +3.597037991e-03f, +1.385099788e-02f, +2.624488398e-02f, +3.875617352e-02f, +4.899788213e-02f, +5.484444422e-02f, +5.502885522e-02f, +4.951059236e-02f, +3.948750432e-02f, +2.704753897e-02f, +1.458046298e-02f, +4.147543885e-03f, -2.990059823e-03f, -6.553314483e-03f, -7.118111210e-03f, -5.766266639e-03f, -3.664722671e-03f, -1.722413869e-03f, + +5.035930779e-05f, +6.632801773e-05f, +6.131210073e-05f, +2.315646270e-05f, -5.241259825e-05f, -1.572668119e-04f, -2.702438562e-04f, -3.615187468e-04f, -4.011440598e-04f, -3.690592083e-04f, -2.629296196e-04f, -1.006658295e-04f, +8.370459117e-05f, +2.496708124e-04f, +3.621243063e-04f, +4.013667552e-04f, +3.678413279e-04f, +2.802167391e-04f, +1.679327488e-04f, +6.123607625e-05f, -1.763591641e-05f, -5.928519960e-05f, -6.696972897e-05f, -5.235876180e-05f, + /* 1,18 (24) */ + +8.378016572e-04f, +2.240332124e-03f, +4.639995460e-03f, +8.258675333e-03f, +1.319518114e-02f, +1.936850052e-02f, +2.648659017e-02f, +3.405249226e-02f, +4.141220567e-02f, +4.783942229e-02f, +5.264323003e-02f, +5.527853891e-02f, +5.543708821e-02f, +5.310013586e-02f, +4.854168753e-02f, +4.228157838e-02f, +3.499834308e-02f, +2.742002332e-02f, +2.021493027e-02f, +1.390311270e-02f, +8.803412501e-03f, +5.022190389e-03f, +2.480392668e-03f, +9.679205023e-04f, + -3.075404787e-05f, -5.754920659e-05f, -9.253415281e-05f, -1.329285447e-04f, -1.739338611e-04f, -2.092891617e-04f, -2.322776351e-04f, -2.370054938e-04f, -2.196830446e-04f, -1.796086972e-04f, -1.196032629e-04f, -4.575665691e-05f, +3.349477614e-05f, +1.087840172e-04f, +1.714270575e-04f, +2.148912040e-04f, +2.358100918e-04f, +2.343469818e-04f, +2.138624717e-04f, +1.800019355e-04f, +1.394414293e-04f, +9.858906309e-05f, +6.252123589e-05f, +3.434960685e-05f, + -1.569322181e-03f, -3.465054316e-03f, -5.584290329e-03f, -7.054087328e-03f, -6.719317739e-03f, -3.472511338e-03f, +3.326794134e-03f, +1.348947914e-02f, +2.584373992e-02f, +3.838711431e-02f, +4.873495251e-02f, +5.474377839e-02f, +5.511255982e-02f, +4.976026317e-02f, +3.984962863e-02f, +2.744890573e-02f, +1.494830431e-02f, +4.427760624e-03f, -2.822127074e-03f, -6.492078407e-03f, -7.135747127e-03f, -5.825551839e-03f, -3.731692400e-03f, -1.774772630e-03f, + +4.967919760e-05f, +6.607226275e-05f, +6.192130682e-05f, +2.492152632e-05f, -4.953024396e-05f, -1.537277542e-04f, -2.668759114e-04f, -3.593075781e-04f, -4.009262684e-04f, -3.712231236e-04f, -2.672379855e-04f, -1.062769342e-04f, +7.801232354e-05f, +2.451428848e-04f, +3.596658675e-04f, +4.012962317e-04f, +3.698424711e-04f, +2.834940860e-04f, +1.715015031e-04f, +6.423443851e-05f, -1.572079753e-05f, -5.854219200e-05f, -6.714030571e-05f, -5.301024443e-05f, + /* 1,19 (24) */ + +8.070476094e-04f, +2.182782917e-03f, +4.547461308e-03f, +8.125746789e-03f, +1.302124728e-02f, +1.915921136e-02f, +2.625431253e-02f, +3.381548677e-02f, +4.119252263e-02f, +4.765981359e-02f, +5.252362676e-02f, +5.523278225e-02f, +5.547058299e-02f, +5.320891988e-02f, +4.871311459e-02f, +4.249646959e-02f, +3.523415318e-02f, +2.765437030e-02f, +2.042879274e-02f, +1.408311464e-02f, +8.942853930e-03f, +5.120779452e-03f, +2.542913904e-03f, +1.002270109e-03f, + -3.006145594e-05f, -5.657909639e-05f, -9.133904628e-05f, -1.316274228e-04f, -1.727029831e-04f, -2.083372615e-04f, -2.318091276e-04f, -2.371789201e-04f, -2.205740179e-04f, -1.811863919e-04f, -1.217269082e-04f, -4.819410453e-05f, +3.102947289e-05f, +1.065816209e-04f, +1.697331367e-04f, +2.138657227e-04f, +2.355048907e-04f, +2.347051515e-04f, +2.147384913e-04f, +1.811968298e-04f, +1.407442116e-04f, +9.981506022e-05f, +6.353953899e-05f, +3.509526789e-05f, + -1.519642983e-03f, -3.398982053e-03f, -5.522369023e-03f, -7.029165802e-03f, -6.768847983e-03f, -3.626239093e-03f, +3.059918223e-03f, +1.313017156e-02f, +2.544281365e-02f, +3.801589119e-02f, +4.846771453e-02f, +5.463750145e-02f, +5.519057214e-02f, +5.000540606e-02f, +4.020929449e-02f, +2.785020196e-02f, +1.531814678e-02f, +4.711254710e-03f, -2.650625571e-03f, -6.427843968e-03f, -7.151467924e-03f, -5.884094031e-03f, -3.798832706e-03f, -1.827782875e-03f, + +4.899295427e-05f, +6.579632434e-05f, +6.249779202e-05f, +2.664897123e-05f, -4.667806016e-05f, -1.501982080e-04f, -2.634877895e-04f, -3.570459849e-04f, -4.006373398e-04f, -3.733127737e-04f, -2.714893178e-04f, -1.118646739e-04f, +7.230286952e-05f, +2.405622897e-04f, +3.571345343e-04f, +4.011527782e-04f, +3.717890774e-04f, +2.867463115e-04f, +1.750755508e-04f, +6.726056827e-05f, -1.376833283e-05f, -5.776504473e-05f, -6.728848602e-05f, -5.365352956e-05f, + /* 1,20 (24) */ + +7.769861534e-04f, +2.126203821e-03f, +4.456122261e-03f, +7.994119366e-03f, +1.284854430e-02f, +1.895087410e-02f, +2.602250340e-02f, +3.357830785e-02f, +4.097194861e-02f, +4.747862720e-02f, +5.240189986e-02f, +5.518458815e-02f, +5.550161246e-02f, +5.331550150e-02f, +4.888284773e-02f, +4.271033531e-02f, +3.546965807e-02f, +2.788907545e-02f, +2.064353123e-02f, +1.426431147e-02f, +9.083598142e-03f, +5.220594513e-03f, +2.606453443e-03f, +1.037365377e-03f, + -2.937768631e-05f, -5.561720797e-05f, -9.014950911e-05f, -1.303271956e-04f, -1.714668346e-04f, -2.073734206e-04f, -2.313227709e-04f, -2.373306314e-04f, -2.214424487e-04f, -1.827442103e-04f, -1.238366106e-04f, -5.062591276e-05f, +2.856053128e-05f, +1.043669379e-04f, +1.680203798e-04f, +2.128179804e-04f, +2.351775086e-04f, +2.350444110e-04f, +2.156011663e-04f, +1.823849963e-04f, +1.420466395e-04f, +1.010457663e-04f, +6.456566540e-05f, +3.584978049e-05f, + -1.470650029e-03f, -3.333185729e-03f, -5.459871231e-03f, -7.002516830e-03f, -6.815526043e-03f, -3.776437301e-03f, +2.796430433e-03f, +1.277312557e-02f, +2.504217631e-02f, +3.764257842e-02f, +4.819622521e-02f, +5.452563678e-02f, +5.526287501e-02f, +5.024596835e-02f, +4.056642903e-02f, +2.825135474e-02f, +1.568993586e-02f, +4.998001022e-03f, -2.475550020e-03f, -6.360583400e-03f, -7.165236257e-03f, -5.941859076e-03f, -3.866121192e-03f, -1.881436404e-03f, + +4.830098012e-05f, +6.550064997e-05f, +6.304186356e-05f, +2.833878040e-05f, -4.385648766e-05f, -1.466789902e-04f, -2.600804786e-04f, -3.547348191e-04f, -4.002776863e-04f, -3.753279455e-04f, -2.756827919e-04f, -1.174278323e-04f, +6.657748159e-05f, +2.359299473e-04f, +3.545306419e-04f, +4.009360908e-04f, +3.736803560e-04f, +2.899724281e-04f, +1.786540232e-04f, +7.031394560e-05f, -1.177861505e-05f, -5.695349877e-05f, -6.741383353e-05f, -5.428819468e-05f, + /* 1,21 (24) */ + +7.476084671e-04f, +2.070586613e-03f, +4.365972752e-03f, +7.863792170e-03f, +1.267707746e-02f, +1.874350068e-02f, +2.579118063e-02f, +3.334097721e-02f, +4.075050616e-02f, +4.729588299e-02f, +5.227806324e-02f, +5.513396224e-02f, +5.553017299e-02f, +5.341986844e-02f, +4.905086811e-02f, +4.292315329e-02f, +3.570483557e-02f, +2.812411986e-02f, +2.085913240e-02f, +1.444669647e-02f, +9.225644781e-03f, +5.321640279e-03f, +2.671019108e-03f, +1.073215158e-03f, + -2.870272812e-05f, -5.466359004e-05f, -8.896565621e-05f, -1.290280359e-04f, -1.702256220e-04f, -2.063978428e-04f, -2.308187252e-04f, -2.374607067e-04f, -2.222883106e-04f, -1.842820166e-04f, -1.259321426e-04f, -5.305179922e-05f, +2.608824006e-05f, +1.021402136e-04f, +1.662889481e-04f, +2.117480312e-04f, +2.348278912e-04f, +2.353646174e-04f, +2.164503001e-04f, +1.835662257e-04f, +1.433485289e-04f, +1.022810507e-04f, +6.559954993e-05f, +3.661314192e-05f, + -1.422349049e-03f, -3.267685079e-03f, -5.396829367e-03f, -6.974178050e-03f, -6.859382530e-03f, -3.923116291e-03f, +2.536349955e-03f, +1.241839075e-02f, +2.464189863e-02f, +3.726725047e-02f, +4.792054242e-02f, +5.440820895e-02f, +5.532945249e-02f, +5.048189829e-02f, +4.092095967e-02f, +2.865229083e-02f, +1.606361621e-02f, +5.287973450e-03f, -2.296895997e-03f, -6.290269454e-03f, -7.177014872e-03f, -5.998812574e-03f, -3.933535025e-03f, -1.935724599e-03f, + +4.760367367e-05f, +6.518568834e-05f, +6.355383603e-05f, +2.999094905e-05f, -4.106595391e-05f, -1.431709084e-04f, -2.566549656e-04f, -3.523749422e-04f, -3.998477374e-04f, -3.772684468e-04f, -2.798176001e-04f, -1.229652003e-04f, +6.083741698e-05f, +2.312467930e-04f, +3.518545456e-04f, +4.006458844e-04f, +3.755155275e-04f, +2.931714495e-04f, +1.822360436e-04f, +7.339403759e-05f, -9.751749846e-06f, -5.610730378e-05f, -6.751591438e-05f, -5.491381433e-05f, + /* 1,22 (24) */ + +7.189057390e-04f, +2.015923023e-03f, +4.277007096e-03f, +7.734764134e-03f, +1.250685184e-02f, +1.853710284e-02f, +2.556036191e-02f, +3.310351651e-02f, +4.052821785e-02f, +4.711160097e-02f, +5.215213110e-02f, +5.508091044e-02f, +5.555626123e-02f, +5.352200865e-02f, +4.921715706e-02f, +4.313490132e-02f, +3.593966347e-02f, +2.835948448e-02f, +2.107558270e-02f, +1.463026269e-02f, +9.368993310e-03f, +5.423921330e-03f, +2.736618658e-03f, +1.109828299e-03f, + -2.803656886e-05f, -5.371828929e-05f, -8.778760047e-05f, -1.277301149e-04f, -1.689795512e-04f, -2.054107328e-04f, -2.302971523e-04f, -2.375692277e-04f, -2.231115807e-04f, -1.857996784e-04f, -1.280132790e-04f, -5.547148255e-05f, +2.361288858e-05f, +9.990169528e-05f, +1.645390058e-04f, +2.106559329e-04f, +2.344559875e-04f, +2.356656303e-04f, +2.172856968e-04f, +1.847403082e-04f, +1.446496947e-04f, +1.035207805e-04f, +6.664112530e-05f, +3.738534770e-05f, + -1.374745375e-03f, -3.202499390e-03f, -5.333275531e-03f, -6.944187101e-03f, -6.900448484e-03f, -4.066287199e-03f, +2.279694989e-03f, +1.206601581e-02f, +2.424205089e-02f, +3.688998202e-02f, +4.764072482e-02f, +5.428524375e-02f, +5.539028991e-02f, +5.071314509e-02f, +4.127281421e-02f, +2.905293671e-02f, +1.643913174e-02f, +5.581144899e-03f, -2.114659953e-03f, -6.216875417e-03f, -7.186766622e-03f, -6.054919878e-03f, -4.001050940e-03f, -1.990638413e-03f, + +4.690142952e-05f, +6.485188912e-05f, +6.403403126e-05f, +3.160548461e-05f, -3.830687289e-05f, -1.396747604e-04f, -2.532122364e-04f, -3.499672243e-04f, -3.993479400e-04f, -3.791341056e-04f, -2.838929516e-04f, -1.284755764e-04f, +5.508393727e-05f, +2.265137770e-04f, +3.491066211e-04f, +4.002818927e-04f, +3.772938242e-04f, +2.963423910e-04f, +1.858207276e-04f, +7.650029847e-05f, -7.687855865e-06f, -5.522621826e-05f, -6.759429744e-05f, -5.552996031e-05f, + /* 1,23 (24) */ + +6.908691701e-04f, +1.962204733e-03f, +4.189219495e-03f, +7.607034019e-03f, +1.233787229e-02f, +1.833169210e-02f, +2.533006476e-02f, +3.286594728e-02f, +4.030510627e-02f, +4.692580129e-02f, +5.202411782e-02f, +5.502543896e-02f, +5.557987412e-02f, +5.362191034e-02f, +4.938169606e-02f, +4.334555725e-02f, +3.617411945e-02f, +2.859515011e-02f, +2.129286839e-02f, +1.481500300e-02f, +9.513643005e-03f, +5.527442110e-03f, +2.803259783e-03f, +1.147213647e-03f, + -2.737919445e-05f, -5.278135038e-05f, -8.661545276e-05f, -1.264336021e-04f, -1.677288274e-04f, -2.044122956e-04f, -2.297582162e-04f, -2.376562792e-04f, -2.239122397e-04f, -1.872970664e-04f, -1.300797972e-04f, -5.788468247e-05f, +2.113476669e-05f, +9.765163225e-05f, +1.627707202e-04f, +2.095417464e-04f, +2.340617500e-04f, +2.359473116e-04f, +2.181071619e-04f, +1.859070338e-04f, +1.459499503e-04f, +1.047648212e-04f, +6.769032218e-05f, +3.816639157e-05f, + -1.327843946e-03f, -3.137647501e-03f, -5.269241500e-03f, -6.912581616e-03f, -6.938755357e-03f, -4.205961960e-03f, +2.026482753e-03f, +1.171604859e-02f, +2.384270295e-02f, +3.651084792e-02f, +4.735683186e-02f, +5.415676817e-02f, +5.544537384e-02f, +5.093965886e-02f, +4.162192084e-02f, +2.945321860e-02f, +1.681642556e-02f, +5.877487290e-03f, -1.928839225e-03f, -6.140375118e-03f, -7.194454478e-03f, -6.110146096e-03f, -4.068645237e-03f, -2.046168374e-03f, + +4.619463825e-05f, +6.449970283e-05f, +6.448277808e-05f, +3.318240655e-05f, -3.557964519e-05f, -1.361913343e-04f, -2.497532750e-04f, -3.475125441e-04f, -3.987787580e-04f, -3.809247703e-04f, -2.879080727e-04f, -1.339577671e-04f, +4.931830803e-05f, +2.217318639e-04f, +3.462872642e-04f, +3.998438681e-04f, +3.790144899e-04f, +2.994842696e-04f, +1.894071836e-04f, +7.963216967e-05f, -5.587064814e-06f, -5.431000971e-05f, -6.764855447e-05f, -5.613620176e-05f, + /* 1,24 (24) */ + +6.634899757e-04f, +1.909423383e-03f, +4.102604043e-03f, +7.480600417e-03f, +1.217014346e-02f, +1.812727981e-02f, +2.510030654e-02f, +3.262829100e-02f, +4.008119403e-02f, +4.673850422e-02f, +5.189403803e-02f, +5.496755427e-02f, +5.560100889e-02f, +5.371956198e-02f, +4.954446678e-02f, +4.355509900e-02f, +3.640818120e-02f, +2.883109742e-02f, +2.151097556e-02f, +1.500091003e-02f, +9.659592955e-03f, +5.632206931e-03f, +2.870950105e-03f, +1.185380039e-03f, + -2.673058920e-05f, -5.185281596e-05f, -8.544932188e-05f, -1.251386658e-04f, -1.664736552e-04f, -2.034027372e-04f, -2.292020825e-04f, -2.377219491e-04f, -2.246902716e-04f, -1.887740547e-04f, -1.321314770e-04f, -6.029111978e-05f, +1.865416474e-05f, +9.539027583e-05f, +1.609842617e-04f, +2.084055364e-04f, +2.336451340e-04f, +2.362095255e-04f, +2.189145021e-04f, +1.870661925e-04f, +1.472491081e-04f, +1.060130363e-04f, +6.874706913e-05f, +3.895626544e-05f, + -1.281649307e-03f, -3.073147798e-03f, -5.204758722e-03f, -6.879399210e-03f, -6.974335002e-03f, -4.342153294e-03f, +1.776729478e-03f, +1.136853604e-02f, +2.344392419e-02f, +3.612992315e-02f, +4.706892379e-02f, +5.402281040e-02f, +5.549469215e-02f, +5.116139073e-02f, +4.196820810e-02f, +2.985306247e-02f, +1.719544005e-02f, +6.176971560e-03f, -1.739432042e-03f, -6.060742949e-03f, -7.200041542e-03f, -6.164456106e-03f, -4.136293792e-03f, -2.102304575e-03f, + +4.548368629e-05f, +6.412958061e-05f, +6.490041214e-05f, +3.472174628e-05f, -3.288465786e-05f, -1.327214084e-04f, -2.462790636e-04f, -3.450117886e-04f, -3.981406720e-04f, -3.826403100e-04f, -2.918622071e-04f, -1.394105874e-04f, +4.354179844e-05f, +2.169020328e-04f, +3.433968906e-04f, +3.993315822e-04f, +3.806767808e-04f, +3.025961045e-04f, +1.929945127e-04f, +8.278907995e-05f, -3.449521528e-06f, -5.335845485e-05f, -6.767826036e-05f, -5.673210536e-05f, + /* 1,25 (24) */ + +6.367593865e-04f, +1.857570567e-03f, +4.017154721e-03f, +7.355461751e-03f, +1.200366981e-02f, +1.792387707e-02f, +2.487110446e-02f, +3.239056905e-02f, +3.985650376e-02f, +4.654973017e-02f, +5.176190655e-02f, +5.490726315e-02f, +5.561966305e-02f, +5.381495225e-02f, +4.970545104e-02f, +4.376350454e-02f, +3.664182634e-02f, +2.906730695e-02f, +2.172989006e-02f, +1.518797623e-02f, +9.806842063e-03f, +5.738219968e-03f, +2.939697175e-03f, +1.224336304e-03f, + -2.609073586e-05f, -5.093272665e-05f, -8.428931461e-05f, -1.238454723e-04f, -1.652142386e-04f, -2.023822639e-04f, -2.286289191e-04f, -2.377663278e-04f, -2.254456640e-04f, -1.902305206e-04f, -1.341681007e-04f, -6.269051648e-05f, +1.617137348e-05f, +9.311787923e-05f, +1.591798037e-04f, +2.072473709e-04f, +2.332060983e-04f, +2.364521385e-04f, +2.197075250e-04f, +1.882175742e-04f, +1.485469791e-04f, +1.072652872e-04f, +6.981129264e-05f, +3.975495944e-05f, + -1.236165621e-03f, -3.009018218e-03f, -5.139858309e-03f, -6.844677464e-03f, -7.007219660e-03f, -4.474874702e-03f, +1.530450414e-03f, +1.102352425e-02f, +2.304578352e-02f, +3.574728284e-02f, +4.677706159e-02f, +5.388339982e-02f, +5.553823395e-02f, +5.137829276e-02f, +4.231160499e-02f, +3.025239405e-02f, +1.757611683e-02f, +6.479567664e-03f, -1.546437529e-03f, -5.977953869e-03f, -7.203491064e-03f, -6.217814561e-03f, -4.203972052e-03f, -2.159036681e-03f, + +4.476895583e-05f, +6.374197407e-05f, +6.528727571e-05f, +3.622354707e-05f, -3.022228446e-05f, -1.292657505e-04f, -2.427905823e-04f, -3.424658527e-04f, -3.974341794e-04f, -3.842806141e-04f, -2.957546163e-04f, -1.448328608e-04f, +3.775568092e-05f, +2.120252768e-04f, +3.404359360e-04f, +3.987448259e-04f, +3.822799655e-04f, +3.056769175e-04f, +1.965818092e-04f, +8.597044546e-05f, -1.275384025e-06f, -5.237133972e-05f, -6.768299327e-05f, -5.731723542e-05f, + /* 1,26 (24) */ + +6.106686506e-04f, +1.806637840e-03f, +3.932865406e-03f, +7.231616279e-03f, +1.183845557e-02f, +1.772149481e-02f, +2.464247554e-02f, +3.215280272e-02f, +3.963105810e-02f, +4.635949965e-02f, +5.162773845e-02f, +5.484457264e-02f, +5.563583443e-02f, +5.390807013e-02f, +4.986463085e-02f, +4.397075191e-02f, +3.687503244e-02f, +2.930375909e-02f, +2.194959758e-02f, +1.537619380e-02f, +9.955389042e-03f, +5.845485255e-03f, +3.009508467e-03f, +1.264091264e-03f, + -2.545961565e-05f, -5.002112110e-05f, -8.313553567e-05f, -1.225541865e-04f, -1.639507809e-04f, -2.013510827e-04f, -2.280388952e-04f, -2.377895090e-04f, -2.261784077e-04f, -1.916663450e-04f, -1.361894531e-04f, -6.508259574e-05f, +1.368668407e-05f, +9.083469754e-05f, +1.573575226e-04f, +2.060673215e-04f, +2.327446049e-04f, +2.366750198e-04f, +2.204860398e-04f, +1.893609687e-04f, +1.498433732e-04f, +1.085214336e-04f, +7.088291709e-05f, +4.056246185e-05f, + -1.191396665e-03f, -2.945276244e-03f, -5.074571034e-03f, -6.808453917e-03f, -7.037441945e-03f, -4.604140453e-03f, +1.287659832e-03f, +1.068105840e-02f, +2.264834934e-02f, +3.536300222e-02f, +4.648130697e-02f, +5.373856695e-02f, +5.557598963e-02f, +5.159031804e-02f, +4.265204093e-02f, +3.065113888e-02f, +1.795839680e-02f, +6.785244582e-03f, -1.349855720e-03f, -5.891983423e-03f, -7.204766448e-03f, -6.270185901e-03f, -4.271655045e-03f, -2.216353916e-03f, + +4.405082471e-05f, +6.333733508e-05f, +6.564371751e-05f, +3.768786388e-05f, -2.759288502e-05f, -1.258251183e-04f, -2.392888085e-04f, -3.398756389e-04f, -3.966597940e-04f, -3.858455924e-04f, -2.995845792e-04f, -1.502234199e-04f, +3.196123075e-05f, +2.071026027e-04f, +3.374048561e-04f, +3.980834092e-04f, +3.838233252e-04f, +3.087257329e-04f, +2.001681605e-04f, +8.917566987e-05f, +9.351764323e-07f, -5.134845990e-05f, -6.766233489e-05f, -5.789115407e-05f, + /* 1,27 (24) */ + +5.852090350e-04f, +1.756616719e-03f, +3.849729871e-03f, +7.109062093e-03f, +1.167450479e-02f, +1.752014373e-02f, +2.441443664e-02f, +3.191501321e-02f, +3.940487969e-02f, +4.616783330e-02f, +5.149154900e-02f, +5.477949004e-02f, +5.564952111e-02f, +5.399890483e-02f, +5.002198837e-02f, +4.417681923e-02f, +3.710777704e-02f, +2.954043411e-02f, +2.217008362e-02f, +1.556555477e-02f, +1.010523242e-02f, +5.954006688e-03f, +3.080391384e-03f, +1.304653725e-03f, + -2.483720823e-05f, -4.911803594e-05f, -8.198808773e-05f, -1.212649717e-04f, -1.626834846e-04f, -2.003094010e-04f, -2.274321824e-04f, -2.377915891e-04f, -2.268884971e-04f, -1.930814118e-04f, -1.381953216e-04f, -6.746708201e-05f, +1.120038797e-05f, +8.854098772e-05f, +1.555175978e-04f, +2.048654630e-04f, +2.322606191e-04f, +2.368780408e-04f, +2.212498566e-04f, +1.904961658e-04f, +1.511380992e-04f, +1.097813335e-04f, +7.196186479e-05f, +4.137875911e-05f, + -1.147345840e-03f, -2.881938909e-03f, -5.008927316e-03f, -6.770766053e-03f, -7.065034830e-03f, -4.729965571e-03f, +1.048371023e-03f, +1.034118276e-02f, +2.225168955e-02f, +3.497715663e-02f, +4.618172239e-02f, +5.358834353e-02f, +5.560795086e-02f, +5.179742064e-02f, +4.298944578e-02f, +3.104922229e-02f, +1.834222013e-02f, +7.093970315e-03f, -1.149687559e-03f, -5.802807753e-03f, -7.203831272e-03f, -6.321534361e-03f, -4.339317380e-03f, -2.274245070e-03f, + +4.332966631e-05f, +6.291611563e-05f, +6.597009251e-05f, +3.911476326e-05f, -2.499680603e-05f, -1.224002588e-04f, -2.357747169e-04f, -3.372420571e-04f, -3.958180458e-04f, -3.873351753e-04f, -3.033513931e-04f, -1.555811067e-04f, +2.615972566e-05f, +2.021350307e-04f, +3.343041262e-04f, +3.973471616e-04f, +3.853061542e-04f, +3.117415784e-04f, +2.037526479e-04f, +9.240414446e-05f, +3.181975286e-06f, -5.028962066e-05f, -6.761587059e-05f, -5.845342137e-05f, + /* 1,28 (24) */ + +5.603718267e-04f, +1.707498683e-03f, +3.767741783e-03f, +6.987797121e-03f, +1.151182130e-02f, +1.731983432e-02f, +2.418700446e-02f, +3.167722163e-02f, +3.917799119e-02f, +4.597475189e-02f, +5.135335367e-02f, +5.471202296e-02f, +5.566072150e-02f, +5.408744582e-02f, +5.017750597e-02f, +4.438168469e-02f, +3.734003766e-02f, +2.977731215e-02f, +2.239133348e-02f, +1.575605093e-02f, +1.025637051e-02f, +6.063788022e-03f, +3.152353249e-03f, +1.346032485e-03f, + -2.422349177e-05f, -4.822350583e-05f, -8.084707136e-05f, -1.199779894e-04f, -1.614125515e-04f, -1.992574267e-04f, -2.268089534e-04f, -2.377726671e-04f, -2.275759301e-04f, -1.944756084e-04f, -1.401854962e-04f, -6.984370103e-05f, +8.712776940e-06f, +8.623700849e-05f, +1.536602113e-04f, +2.036418741e-04f, +2.317541095e-04f, +2.370610757e-04f, +2.219987871e-04f, +1.916229551e-04f, +1.524309647e-04f, +1.110448427e-04f, +7.304805597e-05f, +4.220383580e-05f, + -1.104016174e-03f, -2.819022793e-03f, -4.942957224e-03f, -6.731651289e-03f, -7.090031636e-03f, -4.852365830e-03f, +8.125963065e-04f, +1.000394071e-02f, +2.185587150e-02f, +3.458982146e-02f, +4.587837100e-02f, +5.343276243e-02f, +5.563411059e-02f, +5.199955567e-02f, +4.332374991e-02f, +3.144656945e-02f, +1.872752628e-02f, +7.405711893e-03f, -9.459349115e-04f, -5.710403609e-03f, -7.200649296e-03f, -6.371823981e-03f, -4.406933251e-03f, -2.332698492e-03f, + +4.260584945e-05f, +6.247876761e-05f, +6.626676172e-05f, +4.050432324e-05f, -2.243438042e-05f, -1.189919086e-04f, -2.322492790e-04f, -3.345660239e-04f, -3.949094806e-04f, -3.887493134e-04f, -3.070543729e-04f, -1.609047730e-04f, +2.035244551e-05f, +1.971235943e-04f, +3.311342413e-04f, +3.965359323e-04f, +3.867277599e-04f, +3.147234851e-04f, +2.073343464e-04f, +9.565524824e-05f, +5.464814636e-06f, -4.919463712e-05f, -6.754318962e-05f, -5.900359551e-05f, + /* 1,29 (24) */ + +5.361483350e-04f, +1.659275177e-03f, +3.686894711e-03f, +6.867819132e-03f, +1.135040875e-02f, +1.712057690e-02f, +2.396019551e-02f, +3.143944896e-02f, +3.895041526e-02f, +4.578027628e-02f, +5.121316818e-02f, +5.464217926e-02f, +5.566943427e-02f, +5.417368283e-02f, +5.033116618e-02f, +4.458532657e-02f, +3.757179177e-02f, +3.001437322e-02f, +2.261333227e-02f, +1.594767389e-02f, +1.040880148e-02f, +6.174832865e-03f, +3.225401305e-03f, +1.388236320e-03f, + -2.361844294e-05f, -4.733756345e-05f, -7.971258511e-05f, -1.186933996e-04f, -1.601381827e-04f, -1.981953682e-04f, -2.261693833e-04f, -2.377328453e-04f, -2.282407078e-04f, -1.958488257e-04f, -1.421597696e-04f, -7.221217990e-05f, +6.224142940e-06f, +8.392302033e-05f, +1.517855485e-04f, +2.023966364e-04f, +2.312250478e-04f, +2.372240010e-04f, +2.227326442e-04f, +1.927411265e-04f, +1.537217763e-04f, +1.123118154e-04f, +7.414140875e-05f, +4.303767463e-05f, + -1.061410325e-03f, -2.756544025e-03f, -4.876690462e-03f, -6.691146966e-03f, -7.112466016e-03f, -4.971357738e-03f, +5.803470275e-04f, +9.669374682e-03f, +2.146096202e-02f, +3.420107214e-02f, +4.557131662e-02f, +5.327185765e-02f, +5.565446303e-02f, +5.219667927e-02f, +4.365488415e-02f, +3.184310538e-02f, +1.911425404e-02f, +7.720435378e-03f, -7.386005651e-04f, -5.614748361e-03f, -7.195184482e-03f, -6.421018618e-03f, -4.474476440e-03f, -2.391702087e-03f, + +4.187973832e-05f, +6.202574269e-05f, +6.653409200e-05f, +4.185663315e-05f, -1.990592754e-05f, -1.156007930e-04f, -2.287134631e-04f, -3.318484630e-04f, -3.939346603e-04f, -3.900879776e-04f, -3.106928523e-04f, -1.661932803e-04f, +1.454067187e-05f, +1.920693398e-04f, +3.278957162e-04f, +3.956495901e-04f, +3.880874633e-04f, +3.176704877e-04f, +2.109123251e-04f, +9.892834806e-05f, +7.783483193e-06f, -4.806333441e-05f, -6.744388532e-05f, -5.954123292e-05f, + /* 1,30 (24) */ + +5.125298920e-04f, +1.611937614e-03f, +3.607182126e-03f, +6.749125732e-03f, +1.119027057e-02f, +1.692238153e-02f, +2.373402612e-02f, +3.120171611e-02f, +3.872217455e-02f, +4.558442746e-02f, +5.107100841e-02f, +5.456996708e-02f, +5.567565842e-02f, +5.425760585e-02f, +5.048295173e-02f, +4.478772320e-02f, +3.780301682e-02f, +3.025159722e-02f, +2.283606491e-02f, +1.614041502e-02f, +1.056252326e-02f, +6.287144680e-03f, +3.299542714e-03f, +1.431273995e-03f, + -2.302203695e-05f, -4.646023953e-05f, -7.858472543e-05f, -1.174113605e-04f, -1.588605782e-04f, -1.971234341e-04f, -2.255136482e-04f, -2.376722283e-04f, -2.288828348e-04f, -1.972009578e-04f, -1.441179370e-04f, -7.457224711e-05f, +3.734778125e-06f, +8.159928545e-05f, +1.498937974e-04f, +2.011298355e-04f, +2.306734093e-04f, +2.373666959e-04f, +2.234512424e-04f, +1.938504700e-04f, +1.550103394e-04f, +1.135821039e-04f, +7.524183918e-05f, +4.388025644e-05f, + -1.019530586e-03f, -2.694518283e-03f, -4.810156370e-03f, -6.649290333e-03f, -7.132371944e-03f, -5.086958531e-03f, +3.516335643e-04f, +9.337526219e-03f, +2.106702736e-02f, +3.381098417e-02f, +4.526062377e-02f, +5.310566437e-02f, +5.566900371e-02f, +5.238874861e-02f, +4.398277987e-02f, +3.223875497e-02f, +1.950234150e-02f, +8.038105866e-03f, -5.276882399e-04f, -5.515820013e-03f, -7.187400998e-03f, -6.469081953e-03f, -4.541920326e-03f, -2.451243320e-03f, + +4.115169237e-05f, +6.155749209e-05f, +6.677245590e-05f, +4.317179353e-05f, -1.741175321e-05f, -1.122276266e-04f, -2.251682337e-04f, -3.290903040e-04f, -3.928941620e-04f, -3.913511592e-04f, -3.142661832e-04f, -1.714455010e-04f, +8.725687627e-06f, +1.869733261e-04f, +3.245890848e-04f, +3.946880233e-04f, +3.893845993e-04f, +3.205816252e-04f, +2.144856476e-04f, +1.022227988e-04f, +1.013775625e-05f, -4.689554782e-05f, -6.731755534e-05f, -6.006588847e-05f, + /* 1,31 (24) */ + +4.895078551e-04f, +1.565477374e-03f, +3.528597401e-03f, +6.631714371e-03f, +1.103140999e-02f, +1.672525810e-02f, +2.350851248e-02f, +3.096404388e-02f, +3.849329172e-02f, +4.538722650e-02f, +5.092689047e-02f, +5.449539483e-02f, +5.567939320e-02f, +5.433920513e-02f, +5.063284553e-02f, +4.498885304e-02f, +3.803369023e-02f, +3.048896392e-02f, +2.305951615e-02f, +1.633426549e-02f, +1.071753360e-02f, +6.400726784e-03f, +3.374784553e-03f, +1.475154251e-03f, + -2.243424753e-05f, -4.559156282e-05f, -7.746358669e-05f, -1.161320286e-04f, -1.575799374e-04f, -1.960418335e-04f, -2.248419263e-04f, -2.375909238e-04f, -2.295023193e-04f, -1.985319023e-04f, -1.460597965e-04f, -7.692363257e-05f, +1.244974771e-06f, +7.926606770e-05f, +1.479851488e-04f, +1.998415601e-04f, +2.300991725e-04f, +2.374890420e-04f, +2.241543973e-04f, +1.949507756e-04f, +1.562964586e-04f, +1.148555588e-04f, +7.634926120e-05f, +4.473156016e-05f, + -9.783788940e-04f, -2.632960791e-03f, -4.743383914e-03f, -6.606118539e-03f, -7.149783697e-03f, -5.199186158e-03f, +1.264653307e-04f, +9.008435915e-03f, +2.067413320e-02f, +3.341963301e-02f, +4.494635759e-02f, +5.293421887e-02f, +5.567772939e-02f, +5.257572193e-02f, +4.430736895e-02f, +3.263344300e-02f, +1.989172610e-02f, +8.358687491e-03f, -3.132025924e-04f, -5.413597214e-03f, -7.177263242e-03f, -6.515977501e-03f, -4.609237881e-03f, -2.511309208e-03f, + +4.042206620e-05f, +6.107446643e-05f, +6.698223140e-05f, +4.444991597e-05f, -1.495214967e-05f, -1.088731127e-04f, -2.216145512e-04f, -3.262924828e-04f, -3.917885782e-04f, -3.925388696e-04f, -3.177737361e-04f, -1.766603177e-04f, +2.908776646e-06f, +1.818366243e-04f, +3.212149006e-04f, +3.936511404e-04f, +3.906185166e-04f, +3.234559409e-04f, +2.180533719e-04f, +1.055379432e-04f, +1.252739563e-05f, -4.569112297e-05f, -6.716380176e-05f, -6.057711558e-05f, + /* 2, 0 (24) */ + -1.052000512e-03f, -1.225267868e-03f, -4.608628065e-05f, +3.709094207e-03f, +1.122115699e-02f, +2.318852133e-02f, +3.940859639e-02f, +5.854613402e-02f, +7.821578874e-02f, +9.540941453e-02f, +1.071760298e-01f, +1.113612763e-01f, +1.071760298e-01f, +9.540941453e-02f, +7.821578874e-02f, +5.854613402e-02f, +3.940859639e-02f, +2.318852133e-02f, +1.122115699e-02f, +3.709094207e-03f, -4.608628065e-05f, -1.225267868e-03f, -1.052000512e-03f, -4.708832203e-04f, + +1.584555542e-05f, -9.185459440e-06f, -6.916443580e-05f, -1.688238542e-04f, -3.004887188e-04f, -4.422077692e-04f, -5.609449829e-04f, -6.207176891e-04f, -5.934927004e-04f, -4.692000494e-04f, -2.611026920e-04f, -4.153751417e-06f, +2.535839502e-04f, +4.638335327e-04f, +5.910707719e-04f, +6.212908975e-04f, +5.638834066e-04f, +4.464564775e-04f, +3.049149461e-04f, +1.725320870e-04f, +7.168211267e-05f, +1.048135530e-05f, -1.548290361e-05f, -1.798781866e-05f, + +2.602648486e-04f, -1.790854894e-03f, -6.469170083e-03f, -1.331774173e-02f, -2.013268817e-02f, -2.337843094e-02f, -1.959106136e-02f, -7.230457758e-03f, +1.197693589e-02f, +3.306945298e-02f, +4.948642618e-02f, +5.568063817e-02f, +4.948642618e-02f, +3.306945298e-02f, +1.197693589e-02f, -7.230457758e-03f, -1.959106136e-02f, -2.337843094e-02f, -2.013268817e-02f, -1.331774173e-02f, -6.469170083e-03f, -1.790854894e-03f, +2.602648486e-04f, +4.785335182e-04f, + +2.853574234e-05f, +1.020710182e-04f, +1.857692058e-04f, +2.293779382e-04f, +1.790313220e-04f, +9.966225700e-06f, -2.476430534e-04f, -5.080781166e-04f, -6.611133931e-04f, -6.228059886e-04f, -3.804399088e-04f, -6.236330677e-06f, +3.701651116e-04f, +6.181549083e-04f, +6.630960758e-04f, +5.150465232e-04f, +2.562970312e-04f, -2.935877331e-06f, -1.755456498e-04f, -2.294652832e-04f, -1.880413307e-04f, -1.047427193e-04f, -3.035250677e-05f, +9.064716865e-06f, + /* 2, 1 (24) */ + -1.036154957e-03f, -1.234453328e-03f, -1.152507165e-04f, +3.540270353e-03f, +1.092066827e-02f, +2.274631356e-02f, +3.884765141e-02f, +5.792541633e-02f, +7.762229604e-02f, +9.494021448e-02f, +1.069149271e-01f, +1.113571226e-01f, +1.074296137e-01f, +9.587324806e-02f, +7.880685951e-02f, +5.916742492e-02f, +3.997247980e-02f, +2.363497781e-02f, +1.152607194e-02f, +3.881626294e-03f, +2.559583202e-05f, -1.214786513e-03f, -1.067483416e-03f, -4.888710389e-04f, + +1.618563203e-05f, -7.924283845e-06f, -6.668655613e-05f, -1.651480956e-04f, -2.960732688e-04f, -4.379368899e-04f, -5.579483211e-04f, -6.200580086e-04f, -5.958178588e-04f, -4.744828822e-04f, -2.685726115e-04f, -1.246046575e-05f, +2.460177481e-04f, +4.583841202e-04f, +5.885521170e-04f, +6.217769968e-04f, +5.667625323e-04f, +4.506818819e-04f, +3.093510607e-04f, +1.762723314e-04f, +7.423956698e-05f, +1.181226953e-05f, -1.509725256e-05f, -1.812965542e-05f, + +2.888005909e-04f, -1.688783876e-03f, -6.283400877e-03f, -1.308836379e-02f, -1.995365684e-02f, -2.336846472e-02f, -1.983870441e-02f, -7.738535875e-03f, +1.131582250e-02f, +3.244664700e-02f, +4.910598627e-02f, +5.567440184e-02f, +4.985659129e-02f, +3.368760789e-02f, +1.264003196e-02f, -6.715411235e-03f, -1.933476432e-02f, -2.338136682e-02f, -2.030823382e-02f, -1.354720701e-02f, -6.657211414e-03f, -1.895597614e-03f, +2.299123418e-04f, +4.875982351e-04f, + +2.675586256e-05f, +9.941151491e-05f, +1.834583669e-04f, +2.291964006e-04f, +1.823962955e-04f, +1.690521069e-05f, -2.389940689e-04f, -5.010026274e-04f, -6.589376933e-04f, -6.272503973e-04f, -3.905809452e-04f, -1.870676093e-05f, +3.597600253e-04f, +6.132981627e-04f, +6.648840429e-04f, +5.219044802e-04f, +2.649526494e-04f, +4.183916502e-06f, -1.719392626e-04f, -2.294569894e-04f, -1.902729177e-04f, -1.074253608e-04f, -3.220584870e-05f, +8.403713181e-06f, + /* 2, 2 (24) */ + -1.019969325e-03f, -1.242377612e-03f, -1.819372726e-04f, +3.375122257e-03f, +1.062459500e-02f, +2.230837667e-02f, +3.828970309e-02f, +5.730535832e-02f, +7.702647818e-02f, +9.446573159e-02f, +1.066463545e-01f, +1.113446621e-01f, +1.076756315e-01f, +9.633163218e-02f, +7.939541162e-02f, +5.978920191e-02f, +4.053924233e-02f, +2.408565969e-02f, +1.183542300e-02f, +4.057898625e-03f, +9.983539900e-05f, -1.202974244e-03f, -1.082580669e-03f, -5.070006944e-04f, + +1.650355829e-05f, -6.697523430e-06f, -6.424848103e-05f, -1.615052594e-04f, -2.916694746e-04f, -4.336449694e-04f, -5.548944887e-04f, -6.193125111e-04f, -5.980462265e-04f, -4.796812647e-04f, -2.759923601e-04f, -2.076481481e-05f, +2.384054602e-04f, +4.528526219e-04f, +5.859368034e-04f, +6.221753681e-04f, +5.695813083e-04f, +4.548828464e-04f, +3.137961612e-04f, +1.800441102e-04f, +7.683676646e-05f, +1.317849311e-05f, -1.468817924e-05f, -1.826129538e-05f, + +3.155564535e-04f, -1.589372361e-03f, -6.099942510e-03f, -1.285916739e-02f, -1.977126055e-02f, -2.335155950e-02f, -2.007769848e-02f, -8.239538502e-03f, +1.065688480e-02f, +3.181939660e-02f, +4.871540533e-02f, +5.565569508e-02f, +5.021635132e-02f, +3.430090605e-02f, +1.330491601e-02f, -6.193506755e-03f, -1.906981168e-02f, -2.337718290e-02f, -2.048017308e-02f, -1.377666400e-02f, -6.847484331e-03f, -2.003022974e-03f, +1.977064931e-04f, +4.960019483e-04f, + +2.501314587e-05f, +9.676543903e-05f, +1.811106325e-04f, +2.289221454e-04f, +1.856406436e-04f, +2.375097296e-05f, -2.303534036e-04f, -4.938234485e-04f, -6.565707484e-04f, -6.314872159e-04f, -4.005848091e-04f, -3.117049891e-05f, +3.492281796e-04f, +6.082368464e-04f, +6.664756702e-04f, +5.286486484e-04f, +2.736065296e-04f, +1.139117981e-05f, -1.682122012e-04f, -2.293516403e-04f, -1.924621382e-04f, -1.101176588e-04f, -3.409543201e-05f, +7.708395271e-06f, + /* 2, 3 (24) */ + -1.003465767e-03f, -1.249075135e-03f, -2.461857536e-04f, +3.213616998e-03f, +1.033292553e-02f, +2.187473170e-02f, +3.773480860e-02f, +5.668604581e-02f, +7.642843195e-02f, +9.398605033e-02f, +1.063703621e-01f, +1.113238973e-01f, +1.079140369e-01f, +9.678448480e-02f, +7.998134843e-02f, +6.041137728e-02f, +4.110882364e-02f, +2.454054253e-02f, +1.214921916e-02f, +4.237942736e-03f, +1.766721655e-04f, -1.189795751e-03f, -1.097268848e-03f, -5.252619897e-04f, + +1.679975971e-05f, -5.504866354e-06f, -6.185020561e-05f, -1.578957793e-04f, -2.872782033e-04f, -4.293331335e-04f, -5.517845608e-04f, -6.184818694e-04f, -6.001778064e-04f, -4.847944527e-04f, -2.833606028e-04f, -2.906522245e-05f, +2.307484740e-04f, +4.472398691e-04f, +5.832249218e-04f, +6.224854107e-04f, +5.723386911e-04f, +4.590582325e-04f, +3.182493353e-04f, +1.838469319e-04f, +7.947366616e-05f, +1.458030965e-05f, -1.425526179e-05f, -1.838235768e-05f, + +3.405695994e-04f, -1.492606922e-03f, -5.918831878e-03f, -1.263024524e-02f, -1.958561990e-02f, -2.332780853e-02f, -2.030805188e-02f, -8.733361951e-03f, +1.000031405e-02f, +3.118790938e-02f, +4.831482052e-02f, +5.562452458e-02f, +5.056557950e-02f, +3.490914290e-02f, +1.397139168e-02f, -5.664858107e-03f, -1.879620515e-02f, -2.336579172e-02f, -2.064838528e-02f, -1.400601564e-02f, -7.039946469e-03f, -2.113140633e-03f, +1.636110611e-04f, +5.037103435e-04f, + +2.330784222e-05f, +9.413399264e-05f, +1.787278146e-04f, +2.285566754e-04f, +1.887644956e-04f, +3.050171218e-05f, -2.217243550e-04f, -4.865439971e-04f, -6.540144025e-04f, -6.355156147e-04f, -4.104481502e-04f, -4.362308645e-05f, +3.385731614e-04f, +6.029721417e-04f, +6.678694090e-04f, +5.352757180e-04f, +2.822552695e-04f, +1.868387906e-05f, -1.643645643e-04f, -2.291478507e-04f, -1.946071598e-04f, -1.128183026e-04f, -3.602089138e-05f, +6.978371850e-06f, + /* 2, 4 (24) */ + -9.866660070e-04f, -1.254580002e-03f, -3.080359592e-04f, +3.055721218e-03f, +1.004564733e-02f, +2.144539857e-02f, +3.718302404e-02f, +5.606756394e-02f, +7.582825414e-02f, +9.350125588e-02f, +1.060870015e-01f, +1.112948321e-01f, +1.081447854e-01f, +9.723172467e-02f, +8.056457335e-02f, +6.103386269e-02f, +4.168116233e-02f, +2.499960077e-02f, +1.246746849e-02f, +4.421789668e-03f, +2.561458316e-04f, -1.175215441e-03f, -1.111524110e-03f, -5.436443474e-04f, + +1.707466226e-05f, -4.345994203e-06f, -5.949171285e-05f, -1.543200745e-04f, -2.829003102e-04f, -4.250025045e-04f, -5.486196193e-04f, -6.175667733e-04f, -6.022126246e-04f, -4.898217239e-04f, -2.906760184e-04f, -3.736011364e-05f, +2.230481888e-04f, +4.415467146e-04f, +5.804165871e-04f, +6.227065429e-04f, +5.750336461e-04f, +4.632068992e-04f, +3.227096598e-04f, +1.876802906e-04f, +8.215020841e-05f, +1.601799522e-05f, -1.379807969e-05f, -1.849245808e-05f, + +3.638774416e-04f, -1.398472929e-03f, -5.740104063e-03f, -1.240168857e-02f, -1.939685541e-02f, -2.329730682e-02f, -2.052977624e-02f, -9.219905948e-03f, +9.346299651e-03f, +3.055239377e-02f, +4.790437237e-02f, +5.558090149e-02f, +5.090415266e-02f, +3.551211504e-02f, +1.463926109e-02f, -5.129582389e-03f, -1.851394988e-02f, -2.334710784e-02f, -2.081274984e-02f, -1.423516349e-02f, -7.234553629e-03f, -2.225958936e-03f, +1.275901697e-04f, +5.106887154e-04f, + +2.164017338e-05f, +9.151834969e-05f, +1.763117176e-04f, +2.281015201e-04f, +1.917680365e-04f, +3.715568749e-05f, -2.131101909e-04f, -4.791677130e-04f, -6.512705711e-04f, -6.393348523e-04f, -4.201676808e-04f, -5.606007047e-05f, +3.277986126e-04f, +5.975053183e-04f, +6.690637871e-04f, +5.417824102e-04f, +2.908954441e-04f, +2.605992372e-05f, -1.603965089e-04f, -2.288442673e-04f, -1.967061477e-04f, -1.155259551e-04f, -3.798183208e-05f, +6.213268125e-06f, + /* 2, 5 (24) */ + -9.695913448e-04f, -1.258925996e-03f, -3.675276721e-04f, +2.901401144e-03f, +9.762747015e-03f, +2.102039606e-02f, +3.663440442e-02f, +5.544999717e-02f, +7.522604152e-02f, +9.301143415e-02f, +1.057963255e-01f, +1.112574720e-01f, +1.083678336e-01f, +9.767327138e-02f, +8.114498994e-02f, +6.165656923e-02f, +4.225619598e-02f, +2.546280767e-02f, +1.279017815e-02f, +4.609469958e-03f, +3.382960400e-04f, -1.159197446e-03f, -1.125322189e-03f, -5.621368055e-04f, + +1.732869222e-05f, -3.220582194e-06f, -5.717297374e-05f, -1.507785496e-04f, -2.785366386e-04f, -4.206542003e-04f, -5.454007527e-04f, -6.165679301e-04f, -6.041507306e-04f, -4.947623787e-04f, -2.979373002e-04f, -4.564791482e-05f, +2.153060157e-04f, +4.357740323e-04f, +5.775119374e-04f, +6.228382017e-04f, +5.776651480e-04f, +4.673277037e-04f, +3.271762009e-04f, +1.915436659e-04f, +8.486632263e-05f, +1.749181816e-05f, -1.331621398e-05f, -1.859120906e-05f, + +3.855176150e-04f, -1.306954580e-03f, -5.563792346e-03f, -1.217358705e-02f, -1.920508737e-02f, -2.326015113e-02f, -2.074288643e-02f, -9.699073661e-03f, +8.695029080e-03f, +2.991305892e-02f, +4.748420469e-02f, +5.552484142e-02f, +5.123195127e-02f, +3.610962036e-02f, +1.530832487e-02f, -4.587799978e-03f, -1.822305443e-02f, -2.332104792e-02f, -2.097314635e-02f, -1.446400776e-02f, -7.431259777e-03f, -2.341484891e-03f, +8.960833763e-05f, +5.169019835e-04f, + +2.001033321e-05f, +8.891965578e-05f, +1.738641378e-04f, +2.275582344e-04f, +1.946515064e-04f, +4.371121788e-05f, -2.045141480e-04f, -4.716980567e-04f, -6.483412393e-04f, -6.429442762e-04f, -4.297401776e-04f, -6.847700495e-05f, +3.169082289e-04f, +5.918377328e-04f, +6.700574097e-04f, +5.481654794e-04f, +2.995236074e-04f, +3.351716690e-05f, -1.563082506e-04f, -2.284395699e-04f, -1.987572655e-04f, -1.182392537e-04f, -3.997782979e-05f, +5.412726337e-06f, + /* 2, 6 (24) */ + -9.522626525e-04f, -1.262146578e-03f, -4.247006458e-04f, +2.750622594e-03f, +9.484210377e-03f, +2.059974186e-02f, +3.608900367e-02f, +5.483342924e-02f, +7.462189079e-02f, +9.251667177e-02f, +1.054983882e-01f, +1.112118241e-01f, +1.085831396e-01f, +9.810904542e-02f, +8.172250187e-02f, +6.227940744e-02f, +4.283386113e-02f, +2.593013537e-02f, +1.311735436e-02f, +4.801013624e-03f, +4.231623627e-04f, -1.141705627e-03f, -1.138638403e-03f, -5.807280146e-04f, + +1.756227598e-05f, -2.128299365e-06f, -5.489394744e-05f, -1.472715951e-04f, -2.741880197e-04f, -4.162893342e-04f, -5.421290560e-04f, -6.154860638e-04f, -6.059921968e-04f, -4.996157398e-04f, -3.051431560e-04f, -5.392705441e-05f, +2.075233773e-04f, +4.299227169e-04f, +5.745111347e-04f, +6.228798434e-04f, +5.802321806e-04f, +4.714195013e-04f, +3.316480143e-04f, +1.954365230e-04f, +8.762192522e-05f, +1.900203890e-05f, -1.280924741e-05f, -1.867821997e-05f, + +4.055279482e-04f, -1.218034924e-03f, -5.389928208e-03f, -1.194602881e-02f, -1.901043587e-02f, -2.321643991e-02f, -2.094740058e-02f, -1.017077172e-02f, +8.046687841e-03f, +2.927011464e-02f, +4.705446451e-02f, +5.545636442e-02f, +5.154885950e-02f, +3.670145809e-02f, +1.597838228e-02f, -4.039634499e-03f, -1.792353082e-02f, -2.328753075e-02f, -2.112945460e-02f, -1.469244733e-02f, -7.630017042e-03f, -2.459724145e-03f, +4.963050784e-05f, +5.223147098e-04f, + +1.841848797e-05f, +8.633902784e-05f, +1.713868621e-04f, +2.269283978e-04f, +1.974151997e-04f, +5.016668252e-05f, -1.959394305e-04f, -4.641385077e-04f, -6.452284613e-04f, -6.463433227e-04f, -4.391624825e-04f, -8.086945297e-05f, +3.059057580e-04f, +5.859708285e-04f, +6.708489603e-04f, +5.544217142e-04f, +3.081362939e-04f, +4.105340592e-05f, -1.521000643e-04f, -2.279324725e-04f, -2.007586760e-04f, -1.209568106e-04f, -4.200843041e-05f, +4.576406290e-06f, + /* 2, 7 (24) */ + -9.347003766e-04f, -1.264274877e-03f, -4.795945933e-04f, +2.603350999e-03f, +9.210022357e-03f, +2.018345253e-02f, +3.554687461e-02f, +5.421794317e-02f, +7.401589859e-02f, +9.201705604e-02f, +1.051932450e-01f, +1.111578970e-01f, +1.087906630e-01f, +9.853896813e-02f, +8.229701301e-02f, +6.290228728e-02f, +4.341409331e-02f, +2.640155487e-02f, +1.344900237e-02f, +4.996450147e-03f, +5.107842879e-04f, -1.122703589e-03f, -1.151447651e-03f, -5.994062345e-04f, + +1.777583992e-05f, -1.068808779e-06f, -5.265458140e-05f, -1.437995866e-04f, -2.698552725e-04f, -4.119090148e-04f, -5.388056300e-04f, -6.143219148e-04f, -6.077371186e-04f, -5.043811523e-04f, -3.122923087e-04f, -6.219596318e-05f, +1.997017072e-04f, +4.239936841e-04f, +5.714143646e-04f, +6.228309436e-04f, +5.827337377e-04f, +4.754811461e-04f, +3.361241455e-04f, +1.993583130e-04f, +9.041691952e-05f, +2.054890974e-05f, -1.227676465e-05f, -1.875309709e-05f, + +4.239464361e-04f, -1.131695896e-03f, -5.218541346e-03f, -1.171910042e-02f, -1.881302067e-02f, -2.316627323e-02f, -2.114334001e-02f, -1.063491023e-02f, +7.401459380e-03f, +2.862377132e-02f, +4.661530203e-02f, +5.537549496e-02f, +5.185476526e-02f, +3.728742892e-02f, +1.664923124e-02f, -3.485212785e-03f, -1.761539453e-02f, -2.324647735e-02f, -2.128155467e-02f, -1.492037980e-02f, -7.830775718e-03f, -2.580680955e-03f, +7.622077426e-06f, +5.268911161e-04f, + +1.686477662e-05f, +8.377755386e-05f, +1.688816670e-04f, +2.262136130e-04f, +2.000594643e-04f, +5.652052112e-05f, -1.873892085e-04f, -4.564925630e-04f, -6.419343587e-04f, -6.495315166e-04f, -4.484315048e-04f, -9.323298872e-05f, +2.947949980e-04f, +5.799061350e-04f, +6.714372019e-04f, +5.605479395e-04f, +3.167300202e-04f, +4.866638302e-05f, -1.477722844e-04f, -2.273217245e-04f, -2.027085424e-04f, -1.236772130e-04f, -4.407314990e-05f, +3.703985872e-06f, + /* 2, 8 (24) */ + -9.169245366e-04f, -1.265343686e-03f, -5.322491747e-04f, +2.459551413e-03f, +8.940167085e-03f, +1.977154351e-02f, +3.500806898e-02f, +5.360362126e-02f, +7.340816147e-02f, +9.151267488e-02f, +1.048809527e-01f, +1.110957010e-01f, +1.089903647e-01f, +9.896296182e-02f, +8.286842737e-02f, +6.352511822e-02f, +4.399682704e-02f, +2.687703602e-02f, +1.378512652e-02f, +5.195808460e-03f, +6.012012074e-04f, -1.102154679e-03f, -1.163724415e-03f, -6.181593316e-04f, + +1.796981020e-05f, -4.176771401e-08f, -5.045481151e-05f, -1.403628855e-04f, -2.655392034e-04f, -4.075143456e-04f, -5.354315812e-04f, -6.130762398e-04f, -6.093856145e-04f, -5.090579844e-04f, -3.193834961e-04f, -7.045307472e-05f, +1.918424496e-04f, +4.179878698e-04f, +5.682218367e-04f, +6.226909977e-04f, +5.851688234e-04f, +4.795114912e-04f, +3.406036299e-04f, +2.033084726e-04f, +9.325119560e-05f, +2.213267467e-05f, -1.171835245e-05f, -1.881544380e-05f, + +4.408112127e-04f, -1.047918342e-03f, -5.049659679e-03f, -1.149288680e-02f, -1.861296120e-02f, -2.310975271e-02f, -2.133072921e-02f, -1.109140279e-02f, +6.759525021e-03f, +2.797423980e-02f, +4.616687052e-02f, +5.528226198e-02f, +5.214956026e-02f, +3.786733506e-02f, +1.732066845e-02f, -2.924664845e-03f, -1.729866451e-02f, -2.319781096e-02f, -2.142932695e-02f, -1.514770153e-02f, -8.033484261e-03f, -2.704358168e-03f, -3.645107247e-05f, +5.305951020e-04f, + +1.534931117e-05f, +8.123629262e-05f, +1.663503184e-04f, +2.254155049e-04f, +2.025847015e-04f, +6.277123418e-05f, -1.788666174e-04f, -4.487637350e-04f, -6.384611192e-04f, -6.525084716e-04f, -4.575442216e-04f, -1.055631995e-04f, +2.835797956e-04f, +5.736452673e-04f, +6.718209774e-04f, +5.665410181e-04f, +3.253012863e-04f, +5.635378605e-05f, -1.433253052e-04f, -2.266061112e-04f, -2.046050295e-04f, -1.263990239e-04f, -4.617147413e-05f, +2.795161580e-06f, + /* 2, 9 (24) */ + -8.989547265e-04f, -1.265385454e-03f, -5.827039862e-04f, +2.319188527e-03f, +8.674627881e-03f, +1.936402917e-02f, +3.447263740e-02f, +5.299054502e-02f, +7.279877586e-02f, +9.100361690e-02f, +1.045615692e-01f, +1.110252480e-01f, +1.091822071e-01f, +9.938094969e-02f, +8.343664921e-02f, +6.414780922e-02f, +4.458199587e-02f, +2.735654751e-02f, +1.412573014e-02f, +5.399116933e-03f, +6.944524030e-04f, -1.080022004e-03f, -1.175442768e-03f, -6.369747754e-04f, + +1.814461260e-05f, +9.531721336e-07f, -4.829456226e-05f, -1.369618388e-04f, -2.612406066e-04f, -4.031064244e-04f, -5.320080214e-04f, -6.117498117e-04f, -6.109378255e-04f, -5.136456269e-04f, -3.264154723e-04f, -7.869682585e-05f, +1.839470589e-04f, +4.119062305e-04f, +5.649337840e-04f, +6.224595207e-04f, +5.875364520e-04f, +4.835093887e-04f, +3.450854932e-04f, +2.072864241e-04f, +9.612463026e-05f, +2.375356921e-05f, -1.113359983e-05f, -1.886486066e-05f, + +4.561605239e-04f, -9.666820497e-04f, -4.883309360e-03f, -1.126747130e-02f, -1.841037650e-02f, -2.304698148e-02f, -2.150959583e-02f, -1.154016652e-02f, +6.121063902e-03f, +2.732173133e-02f, +4.570932630e-02f, +5.517669878e-02f, +5.243314005e-02f, +3.844098032e-02f, +1.799248942e-02f, -2.358123827e-03f, -1.697336322e-02f, -2.314145718e-02f, -2.157265226e-02f, -1.537430764e-02f, -8.238089290e-03f, -2.830757192e-03f, -8.262254660e-05f, +5.333902636e-04f, + +1.387217702e-05f, +7.871627351e-05f, +1.637945700e-04f, +2.245357194e-04f, +2.049913645e-04f, +6.891738327e-05f, -1.703747559e-04f, -4.409555500e-04f, -6.348109959e-04f, -6.552738902e-04f, -4.664976795e-04f, -1.178556876e-04f, +2.722640448e-04f, +5.671899256e-04f, +6.719992106e-04f, +5.723978525e-04f, +3.338465777e-04f, +6.411324919e-05f, -1.387595813e-04f, -2.257844555e-04f, -2.064463045e-04f, -1.291207824e-04f, -4.830285877e-05f, +1.849649032e-06f, + /* 2,10 (24) */ + -8.808101138e-04f, -1.264432282e-03f, -6.309985484e-04f, +2.182226688e-03f, +8.413387275e-03f, +1.896092274e-02f, +3.394062938e-02f, +5.237879521e-02f, +7.218783803e-02f, +9.048997127e-02f, +1.042351537e-01f, +1.109465511e-01f, +1.093661542e-01f, +9.979285592e-02f, +8.400158299e-02f, +6.477026874e-02f, +4.516953232e-02f, +2.784005690e-02f, +1.447081564e-02f, +5.606403357e-03f, +7.905770333e-04f, -1.056268435e-03f, -1.186576368e-03f, -6.558396361e-04f, + +1.830067241e-05f, +1.916364455e-06f, -4.617374690e-05f, -1.335967791e-04f, -2.569602633e-04f, -3.986863436e-04f, -5.285360669e-04f, -6.103434187e-04f, -6.123939157e-04f, -5.181434937e-04f, -3.333870066e-04f, -8.692565704e-05f, +1.760169995e-04f, +4.057497427e-04f, +5.615504634e-04f, +6.221360480e-04f, +5.898356489e-04f, +4.874736909e-04f, +3.495687512e-04f, +2.112915759e-04f, +9.903708683e-05f, +2.541182018e-05f, -1.052209830e-05f, -1.890094555e-05f, + +4.700327009e-04f, -8.879657762e-04f, -4.719514790e-03f, -1.104293558e-02f, -1.820538514e-02f, -2.297806409e-02f, -2.167997059e-02f, -1.198112207e-02f, +5.486252906e-03f, +2.666645744e-02f, +4.524282862e-02f, +5.505884309e-02f, +5.270540410e-02f, +3.900817025e-02f, +1.866448863e-02f, -1.785725975e-03f, -1.663951665e-02f, -2.307734393e-02f, -2.171141184e-02f, -1.560009209e-02f, -8.444535595e-03f, -2.959877975e-03f, -1.309254054e-04f, +5.352399126e-04f, + +1.243343331e-05f, +7.621849629e-05f, +1.612161629e-04f, +2.235759227e-04f, +2.072799585e-04f, +7.495759125e-05f, -1.619166851e-04f, -4.330715464e-04f, -6.309863052e-04f, -6.578275632e-04f, -4.752889960e-04f, -1.301060727e-04f, +2.608516846e-04f, +5.605418947e-04f, +6.719709070e-04f, +5.781153860e-04f, +3.423623664e-04f, +7.194235371e-05f, -1.340756278e-04f, -2.248556185e-04f, -2.082305379e-04f, -1.318410047e-04f, -5.046672918e-05f, +8.671834766e-07f, + /* 2,11 (24) */ + -8.625094414e-04f, -1.262515917e-03f, -6.771722953e-04f, +2.048629909e-03f, +8.156427011e-03f, +1.856223640e-02f, +3.341209331e-02f, +5.176845179e-02f, +7.157544412e-02f, +8.997182778e-02f, +1.039017667e-01f, +1.108596255e-01f, +1.095421712e-01f, +1.001986057e-01f, +8.456313346e-02f, +6.539240479e-02f, +4.575936797e-02f, +2.832753059e-02f, +1.482038439e-02f, +5.817694933e-03f, +8.896141201e-04f, -1.030856615e-03f, -1.197098466e-03f, -6.747405816e-04f, + +1.843841419e-05f, +2.848168129e-06f, -4.409226758e-05f, -1.302680244e-04f, -2.526989419e-04f, -3.942551895e-04f, -5.250168391e-04f, -6.088578646e-04f, -6.137540712e-04f, -5.225510217e-04f, -3.402968852e-04f, -9.513801287e-05f, +1.680537451e-04f, +3.995194025e-04f, +5.580721558e-04f, +6.217201350e-04f, +5.920654505e-04f, +4.914032495e-04f, +3.540524109e-04f, +2.153233223e-04f, +1.019884152e-04f, +2.710764555e-05f, -9.883441999e-06f, -1.892329380e-05f, + +4.824661342e-04f, -8.117472799e-04f, -4.558298627e-03f, -1.081935966e-02f, -1.799810518e-02f, -2.290310650e-02f, -2.184188727e-02f, -1.241419362e-02f, +4.855266601e-03f, +2.600862987e-02f, +4.476753963e-02f, +5.492873702e-02f, +5.296625578e-02f, +3.956871215e-02f, +1.933645954e-02f, -1.207610589e-03f, -1.629715428e-02f, -2.300540157e-02f, -2.184548747e-02f, -1.582494771e-02f, -8.652766133e-03f, -3.091718979e-03f, -1.813921345e-04f, +5.361070961e-04f, + +1.103311328e-05f, +7.374393090e-05f, +1.586168246e-04f, +2.225377996e-04f, +2.094510392e-04f, +8.089054244e-05f, -1.534954273e-04f, -4.251152730e-04f, -6.269894260e-04f, -6.601693699e-04f, -4.839153604e-04f, -1.423099933e-04f, +2.493466977e-04f, +5.537030433e-04f, +6.717351548e-04f, +5.836906051e-04f, +3.508451129e-04f, +7.983862880e-05f, -1.292740206e-04f, -2.238185004e-04f, -2.099559051e-04f, -1.345581839e-04f, -5.266248031e-05f, -1.524797041e-07f, + /* 2,12 (24) */ + -8.440710273e-04f, -1.259667749e-03f, -7.212645629e-04f, +1.918361885e-03f, +7.903728069e-03f, +1.816798121e-02f, +3.288707647e-02f, +5.115959392e-02f, +7.096169005e-02f, +8.944927676e-02f, +1.035614698e-01f, +1.107644875e-01f, +1.097102249e-01f, +1.005981251e-01f, +8.512120561e-02f, +6.601412492e-02f, +4.635143342e-02f, +2.881893384e-02f, +1.517443680e-02f, +6.033018255e-03f, +9.916025353e-04f, -1.003748969e-03f, -1.206981908e-03f, -6.936638754e-04f, + +1.855826167e-05f, +3.748947027e-06f, -4.205001549e-05f, -1.269758788e-04f, -2.484573980e-04f, -3.898140421e-04f, -5.214514630e-04f, -6.072939681e-04f, -6.150185008e-04f, -5.268676710e-04f, -3.471439106e-04f, -1.033323424e-04f, +1.600587785e-04f, +3.932162260e-04f, +5.544991655e-04f, +6.212113577e-04f, +5.942249049e-04f, +4.952969171e-04f, +3.585354695e-04f, +2.193810432e-04f, +1.049784515e-04f, +2.884125426e-05f, -9.217227941e-06f, -1.893149833e-05f, + +4.934992475e-04f, -7.380033490e-04f, -4.399681803e-03f, -1.059682186e-02f, -1.778865414e-02f, -2.282221596e-02f, -2.199538270e-02f, -1.283930889e-02f, +4.228277175e-03f, +2.534846050e-02f, +4.428362427e-02f, +5.478642702e-02f, +5.321560248e-02f, +4.012241519e-02f, +2.000819470e-02f, -6.239199835e-04f, -1.594630917e-02f, -2.292556295e-02f, -2.197476149e-02f, -1.604876621e-02f, -8.862722038e-03f, -3.226277163e-03f, -2.340546149e-04f, +5.359546164e-04f, + +9.671224678e-06f, +7.129351731e-05f, +1.559982682e-04f, +2.214230526e-04f, +2.115052124e-04f, +8.671498277e-05f, -1.451139647e-04f, -4.170902870e-04f, -6.228227982e-04f, -6.622992779e-04f, -4.923740349e-04f, -1.544631089e-04f, +2.377531086e-04f, +5.466753230e-04f, +6.712911252e-04f, +5.891205406e-04f, +3.592912675e-04f, +8.779955236e-05f, -1.243553968e-04f, -2.226720419e-04f, -2.116205870e-04f, -1.372707913e-04f, -5.488947664e-05f, -1.209564500e-06f, + /* 2,13 (24) */ + -8.255127656e-04f, -1.255918802e-03f, -7.633145784e-04f, +1.791386006e-03f, +7.655270671e-03f, +1.777816717e-02f, +3.236562501e-02f, +5.055229995e-02f, +7.034667155e-02f, +8.892240909e-02f, +1.032143259e-01f, +1.106611551e-01f, +1.098702837e-01f, +1.009913413e-01f, +8.567570478e-02f, +6.663533628e-02f, +4.694565832e-02f, +2.931423076e-02f, +1.553297227e-02f, +6.252399298e-03f, +1.096580987e-03f, -9.749077150e-04f, -1.216199136e-03f, -7.125953738e-04f, + +1.866063758e-05f, +4.619069815e-06f, -4.004687109e-05f, -1.237206317e-04f, -2.442363740e-04f, -3.853639748e-04f, -5.178410678e-04f, -6.056525629e-04f, -6.161874357e-04f, -5.310929250e-04f, -3.539269020e-04f, -1.115070997e-04f, +1.520335911e-04f, +3.868412484e-04f, +5.508318208e-04f, +6.206093129e-04f, +5.963130719e-04f, +4.991535465e-04f, +3.630169159e-04f, +2.234641050e-04f, +1.080070184e-04f, +3.061284599e-05f, -8.523056161e-06f, -1.892514973e-05f, + +5.031704722e-04f, -6.667098317e-04f, -4.243683534e-03f, -1.037539880e-02f, -1.757714893e-02f, -2.273550098e-02f, -2.214049667e-02f, -1.325639918e-02f, +3.605454377e-03f, +2.468616123e-02f, +4.379125023e-02f, +5.463196391e-02f, +5.345335559e-02f, +4.066909051e-02f, +2.067948582e-02f, -3.479944287e-05f, -1.558701790e-02f, -2.283776339e-02f, -2.209911688e-02f, -1.627143825e-02f, -9.074342625e-03f, -3.363547954e-03f, -2.889440915e-04f, +5.347450519e-04f, + +8.347750126e-06f, +6.886816537e-05f, +1.533621916e-04f, +2.202334011e-04f, +2.134431333e-04f, +9.242971990e-05f, -1.367752381e-04f, -4.090001528e-04f, -6.184889212e-04f, -6.642173426e-04f, -5.006623563e-04f, -1.665611023e-04f, +2.260749816e-04f, +5.394607684e-04f, +6.706380730e-04f, +5.944022694e-04f, +3.676972726e-04f, +9.582255189e-05f, -1.193204547e-04f, -2.214152249e-04f, -2.132227712e-04f, -1.399772766e-04f, -5.714705212e-05f, -2.304273786e-06f, + /* 2,14 (24) */ + -8.068521280e-04f, -1.251299732e-03f, -8.033614495e-04f, +1.667665374e-03f, +7.411034297e-03f, +1.739280319e-02f, +3.184778394e-02f, +4.994664739e-02f, +6.973048411e-02f, +8.839131616e-02f, +1.028603990e-01f, +1.105496480e-01f, +1.100223173e-01f, +1.013781825e-01f, +8.622653660e-02f, +6.725594559e-02f, +4.754197139e-02f, +2.981338430e-02f, +1.589598919e-02f, +6.475863403e-03f, +1.204588005e-03f, -9.442948690e-04f, -1.224722192e-03f, -7.315205235e-04f, + +1.874596349e-05f, +5.458909754e-06f, -3.808270418e-05f, -1.205025587e-04f, -2.400365990e-04f, -3.809060541e-04f, -5.141867861e-04f, -6.039344968e-04f, -6.172611289e-04f, -5.352262904e-04f, -3.606446961e-04f, -1.196607440e-04f, +1.439796827e-04f, +3.803955241e-04f, +5.470704735e-04f, +6.199136183e-04f, +5.983290236e-04f, +5.029719919e-04f, +3.674957301e-04f, +2.275718599e-04f, +1.110739246e-04f, +3.242261104e-05f, -7.800529930e-06f, -1.890383645e-05f, + +5.115182223e-04f, -5.978416663e-04f, -4.090321343e-03f, -1.015516540e-02f, -1.736370579e-02f, -2.264307126e-02f, -2.227727190e-02f, -1.366539933e-02f, +2.986965455e-03f, +2.402194388e-02f, +4.329058788e-02f, +5.446540281e-02f, +5.367943057e-02f, +4.120855128e-02f, +2.135012389e-02f, +5.596028265e-04f, -1.521932063e-02f, -2.274194084e-02f, -2.221843734e-02f, -1.649285348e-02f, -9.287565396e-03f, -3.503525231e-03f, -3.460911436e-04f, +5.324407781e-04f, + +7.062647538e-06f, +6.646875466e-05f, +1.507102769e-04f, +2.189705797e-04f, +2.152655055e-04f, +9.803362332e-05f, -1.284821462e-04f, -4.008484398e-04f, -6.139903527e-04f, -6.659237071e-04f, -5.087777361e-04f, -1.785996809e-04f, +2.143164194e-04f, +5.320614954e-04f, +6.697753378e-04f, +5.995329158e-04f, +3.760595635e-04f, +1.039050054e-04f, -1.141699541e-04f, -2.200470734e-04f, -2.147606532e-04f, -1.426760689e-04f, -5.943451013e-05f, -3.436788838e-06f, + /* 2,15 (24) */ + -7.881061645e-04f, -1.245840822e-03f, -8.414441537e-04f, +1.547162816e-03f, +7.170997698e-03f, +1.701189714e-02f, +3.133359716e-02f, +4.934271290e-02f, +6.911322298e-02f, +8.785608987e-02f, +1.024997543e-01f, +1.104299873e-01f, +1.101662970e-01f, +1.017585781e-01f, +8.677360707e-02f, +6.787585921e-02f, +4.814030042e-02f, +3.031635629e-02f, +1.626348492e-02f, +6.703435263e-03f, +1.315661930e-03f, -9.118722579e-04f, -1.232522722e-03f, -7.504243599e-04f, + +1.881465967e-05f, +6.268844507e-06f, -3.615737416e-05f, -1.173219208e-04f, -2.358587890e-04f, -3.764413397e-04f, -5.104897536e-04f, -6.021406320e-04f, -6.182398555e-04f, -5.392672972e-04f, -3.672961470e-04f, -1.277917407e-04f, +1.358985609e-04f, +3.738801264e-04f, +5.432154992e-04f, +6.191239125e-04f, +6.002718445e-04f, +5.067511085e-04f, +3.719708835e-04f, +2.317036463e-04f, +1.141789651e-04f, +3.427073012e-05f, -7.049255941e-06f, -1.886714492e-05f, + +5.185808699e-04f, -5.313729117e-04f, -3.939611066e-03f, -9.936194824e-03f, -1.714844029e-02f, -2.254503763e-02f, -2.240575405e-02f, -1.406624777e-02f, +2.372975103e-03f, +2.335602018e-02f, +4.278181014e-02f, +5.428680313e-02f, +5.389374699e-02f, +4.174061278e-02f, +2.201989923e-02f, +1.159135742e-03f, -1.484326106e-02f, -2.263803584e-02f, -2.233260729e-02f, -1.671290055e-02f, -9.502326049e-03f, -3.646201300e-03f, -4.055256537e-04f, +5.290039893e-04f, + +5.815850534e-06f, +6.409613443e-05f, +1.480441893e-04f, +2.176363376e-04f, +2.169730800e-04f, +1.035256244e-04f, -1.202375441e-04f, -3.926387209e-04f, -6.093297069e-04f, -6.674186018e-04f, -5.167176626e-04f, -1.905745794e-04f, +2.024815608e-04f, +5.244797011e-04f, +6.687023441e-04f, +6.045096535e-04f, +3.843745706e-04f, +1.120442422e-04f, -1.089047163e-04f, -2.185666547e-04f, -2.162324372e-04f, -1.453655767e-04f, -6.175112348e-05f, -4.607268862e-06f, + /* 2,16 (24) */ + -7.692915048e-04f, -1.239571978e-03f, -8.776015278e-04f, +1.429840895e-03f, +6.935138909e-03f, +1.663545580e-02f, +3.082310740e-02f, +4.874057226e-02f, +6.849498313e-02f, +8.731682257e-02f, +1.021324582e-01f, +1.103021955e-01f, +1.103021955e-01f, +1.021324582e-01f, +8.731682257e-02f, +6.849498313e-02f, +4.874057226e-02f, +3.082310740e-02f, +1.663545580e-02f, +6.935138909e-03f, +1.429840895e-03f, -8.776015278e-04f, -1.239571978e-03f, -7.692915048e-04f, + +1.886714492e-05f, +7.049255941e-06f, -3.427073012e-05f, -1.141789651e-04f, -2.317036463e-04f, -3.719708835e-04f, -5.067511085e-04f, -6.002718445e-04f, -6.191239125e-04f, -5.432154992e-04f, -3.738801264e-04f, -1.358985609e-04f, +1.277917407e-04f, +3.672961470e-04f, +5.392672972e-04f, +6.182398555e-04f, +6.021406320e-04f, +5.104897536e-04f, +3.764413397e-04f, +2.358587890e-04f, +1.173219208e-04f, +3.615737416e-05f, -6.268844507e-06f, -1.881465967e-05f, + +5.243967204e-04f, -4.672767772e-04f, -3.791566877e-03f, -9.718558487e-03f, -1.693146721e-02f, -2.244151201e-02f, -2.252599159e-02f, -1.445888649e-02f, +1.763645396e-03f, +2.268860158e-02f, +4.226509248e-02f, +5.409622855e-02f, +5.409622855e-02f, +4.226509248e-02f, +2.268860158e-02f, +1.763645396e-03f, -1.445888649e-02f, -2.252599159e-02f, -2.244151201e-02f, -1.693146721e-02f, -9.718558487e-03f, -3.791566877e-03f, -4.672767772e-04f, +5.243967204e-04f, + +4.607268862e-06f, +6.175112348e-05f, +1.453655767e-04f, +2.162324372e-04f, +2.185666547e-04f, +1.089047163e-04f, -1.120442422e-04f, -3.843745706e-04f, -6.045096535e-04f, -6.687023441e-04f, -5.244797011e-04f, -2.024815608e-04f, +1.905745794e-04f, +5.167176626e-04f, +6.674186018e-04f, +6.093297069e-04f, +3.926387209e-04f, +1.202375441e-04f, -1.035256244e-04f, -2.169730800e-04f, -2.176363376e-04f, -1.480441893e-04f, -6.409613443e-05f, -5.815850534e-06f, + /* 2,17 (24) */ + -7.504243599e-04f, -1.232522722e-03f, -9.118722579e-04f, +1.315661930e-03f, +6.703435263e-03f, +1.626348492e-02f, +3.031635629e-02f, +4.814030042e-02f, +6.787585921e-02f, +8.677360707e-02f, +1.017585781e-01f, +1.101662970e-01f, +1.104299873e-01f, +1.024997543e-01f, +8.785608987e-02f, +6.911322298e-02f, +4.934271290e-02f, +3.133359716e-02f, +1.701189714e-02f, +7.170997698e-03f, +1.547162816e-03f, -8.414441537e-04f, -1.245840822e-03f, -7.881061645e-04f, + +1.890383645e-05f, +7.800529930e-06f, -3.242261104e-05f, -1.110739246e-04f, -2.275718599e-04f, -3.674957301e-04f, -5.029719919e-04f, -5.983290236e-04f, -6.199136183e-04f, -5.470704735e-04f, -3.803955241e-04f, -1.439796827e-04f, +1.196607440e-04f, +3.606446961e-04f, +5.352262904e-04f, +6.172611289e-04f, +6.039344968e-04f, +5.141867861e-04f, +3.809060541e-04f, +2.400365990e-04f, +1.205025587e-04f, +3.808270418e-05f, -5.458909754e-06f, -1.874596349e-05f, + +5.290039893e-04f, -4.055256537e-04f, -3.646201300e-03f, -9.502326049e-03f, -1.671290055e-02f, -2.233260729e-02f, -2.263803584e-02f, -1.484326106e-02f, +1.159135742e-03f, +2.201989923e-02f, +4.174061278e-02f, +5.389374699e-02f, +5.428680313e-02f, +4.278181014e-02f, +2.335602018e-02f, +2.372975103e-03f, -1.406624777e-02f, -2.240575405e-02f, -2.254503763e-02f, -1.714844029e-02f, -9.936194824e-03f, -3.939611066e-03f, -5.313729117e-04f, +5.185808699e-04f, + +3.436788838e-06f, +5.943451013e-05f, +1.426760689e-04f, +2.147606532e-04f, +2.200470734e-04f, +1.141699541e-04f, -1.039050054e-04f, -3.760595635e-04f, -5.995329158e-04f, -6.697753378e-04f, -5.320614954e-04f, -2.143164194e-04f, +1.785996809e-04f, +5.087777361e-04f, +6.659237071e-04f, +6.139903527e-04f, +4.008484398e-04f, +1.284821462e-04f, -9.803362332e-05f, -2.152655055e-04f, -2.189705797e-04f, -1.507102769e-04f, -6.646875466e-05f, -7.062647538e-06f, + /* 2,18 (24) */ + -7.315205235e-04f, -1.224722192e-03f, -9.442948690e-04f, +1.204588005e-03f, +6.475863403e-03f, +1.589598919e-02f, +2.981338430e-02f, +4.754197139e-02f, +6.725594559e-02f, +8.622653660e-02f, +1.013781825e-01f, +1.100223173e-01f, +1.105496480e-01f, +1.028603990e-01f, +8.839131616e-02f, +6.973048411e-02f, +4.994664739e-02f, +3.184778394e-02f, +1.739280319e-02f, +7.411034297e-03f, +1.667665374e-03f, -8.033614495e-04f, -1.251299732e-03f, -8.068521280e-04f, + +1.892514973e-05f, +8.523056161e-06f, -3.061284599e-05f, -1.080070184e-04f, -2.234641050e-04f, -3.630169159e-04f, -4.991535465e-04f, -5.963130719e-04f, -6.206093129e-04f, -5.508318208e-04f, -3.868412484e-04f, -1.520335911e-04f, +1.115070997e-04f, +3.539269020e-04f, +5.310929250e-04f, +6.161874357e-04f, +6.056525629e-04f, +5.178410678e-04f, +3.853639748e-04f, +2.442363740e-04f, +1.237206317e-04f, +4.004687109e-05f, -4.619069815e-06f, -1.866063758e-05f, + +5.324407781e-04f, -3.460911436e-04f, -3.503525231e-03f, -9.287565396e-03f, -1.649285348e-02f, -2.221843734e-02f, -2.274194084e-02f, -1.521932063e-02f, +5.596028265e-04f, +2.135012389e-02f, +4.120855128e-02f, +5.367943057e-02f, +5.446540281e-02f, +4.329058788e-02f, +2.402194388e-02f, +2.986965455e-03f, -1.366539933e-02f, -2.227727190e-02f, -2.264307126e-02f, -1.736370579e-02f, -1.015516540e-02f, -4.090321343e-03f, -5.978416663e-04f, +5.115182223e-04f, + +2.304273786e-06f, +5.714705212e-05f, +1.399772766e-04f, +2.132227712e-04f, +2.214152249e-04f, +1.193204547e-04f, -9.582255189e-05f, -3.676972726e-04f, -5.944022694e-04f, -6.706380730e-04f, -5.394607684e-04f, -2.260749816e-04f, +1.665611023e-04f, +5.006623563e-04f, +6.642173426e-04f, +6.184889212e-04f, +4.090001528e-04f, +1.367752381e-04f, -9.242971990e-05f, -2.134431333e-04f, -2.202334011e-04f, -1.533621916e-04f, -6.886816537e-05f, -8.347750126e-06f, + /* 2,19 (24) */ + -7.125953738e-04f, -1.216199136e-03f, -9.749077150e-04f, +1.096580987e-03f, +6.252399298e-03f, +1.553297227e-02f, +2.931423076e-02f, +4.694565832e-02f, +6.663533628e-02f, +8.567570478e-02f, +1.009913413e-01f, +1.098702837e-01f, +1.106611551e-01f, +1.032143259e-01f, +8.892240909e-02f, +7.034667155e-02f, +5.055229995e-02f, +3.236562501e-02f, +1.777816717e-02f, +7.655270671e-03f, +1.791386006e-03f, -7.633145784e-04f, -1.255918802e-03f, -8.255127656e-04f, + +1.893149833e-05f, +9.217227941e-06f, -2.884125426e-05f, -1.049784515e-04f, -2.193810432e-04f, -3.585354695e-04f, -4.952969171e-04f, -5.942249049e-04f, -6.212113577e-04f, -5.544991655e-04f, -3.932162260e-04f, -1.600587785e-04f, +1.033323424e-04f, +3.471439106e-04f, +5.268676710e-04f, +6.150185008e-04f, +6.072939681e-04f, +5.214514630e-04f, +3.898140421e-04f, +2.484573980e-04f, +1.269758788e-04f, +4.205001549e-05f, -3.748947027e-06f, -1.855826167e-05f, + +5.347450519e-04f, -2.889440915e-04f, -3.363547954e-03f, -9.074342625e-03f, -1.627143825e-02f, -2.209911688e-02f, -2.283776339e-02f, -1.558701790e-02f, -3.479944287e-05f, +2.067948582e-02f, +4.066909051e-02f, +5.345335559e-02f, +5.463196391e-02f, +4.379125023e-02f, +2.468616123e-02f, +3.605454377e-03f, -1.325639918e-02f, -2.214049667e-02f, -2.273550098e-02f, -1.757714893e-02f, -1.037539880e-02f, -4.243683534e-03f, -6.667098317e-04f, +5.031704722e-04f, + +1.209564500e-06f, +5.488947664e-05f, +1.372707913e-04f, +2.116205870e-04f, +2.226720419e-04f, +1.243553968e-04f, -8.779955236e-05f, -3.592912675e-04f, -5.891205406e-04f, -6.712911252e-04f, -5.466753230e-04f, -2.377531086e-04f, +1.544631089e-04f, +4.923740349e-04f, +6.622992779e-04f, +6.228227982e-04f, +4.170902870e-04f, +1.451139647e-04f, -8.671498277e-05f, -2.115052124e-04f, -2.214230526e-04f, -1.559982682e-04f, -7.129351731e-05f, -9.671224678e-06f, + /* 2,20 (24) */ + -6.936638754e-04f, -1.206981908e-03f, -1.003748969e-03f, +9.916025353e-04f, +6.033018255e-03f, +1.517443680e-02f, +2.881893384e-02f, +4.635143342e-02f, +6.601412492e-02f, +8.512120561e-02f, +1.005981251e-01f, +1.097102249e-01f, +1.107644875e-01f, +1.035614698e-01f, +8.944927676e-02f, +7.096169005e-02f, +5.115959392e-02f, +3.288707647e-02f, +1.816798121e-02f, +7.903728069e-03f, +1.918361885e-03f, -7.212645629e-04f, -1.259667749e-03f, -8.440710273e-04f, + +1.892329380e-05f, +9.883441999e-06f, -2.710764555e-05f, -1.019884152e-04f, -2.153233223e-04f, -3.540524109e-04f, -4.914032495e-04f, -5.920654505e-04f, -6.217201350e-04f, -5.580721558e-04f, -3.995194025e-04f, -1.680537451e-04f, +9.513801287e-05f, +3.402968852e-04f, +5.225510217e-04f, +6.137540712e-04f, +6.088578646e-04f, +5.250168391e-04f, +3.942551895e-04f, +2.526989419e-04f, +1.302680244e-04f, +4.409226758e-05f, -2.848168129e-06f, -1.843841419e-05f, + +5.359546164e-04f, -2.340546149e-04f, -3.226277163e-03f, -8.862722038e-03f, -1.604876621e-02f, -2.197476149e-02f, -2.292556295e-02f, -1.594630917e-02f, -6.239199835e-04f, +2.000819470e-02f, +4.012241519e-02f, +5.321560248e-02f, +5.478642702e-02f, +4.428362427e-02f, +2.534846050e-02f, +4.228277175e-03f, -1.283930889e-02f, -2.199538270e-02f, -2.282221596e-02f, -1.778865414e-02f, -1.059682186e-02f, -4.399681803e-03f, -7.380033490e-04f, +4.934992475e-04f, + +1.524797041e-07f, +5.266248031e-05f, +1.345581839e-04f, +2.099559051e-04f, +2.238185004e-04f, +1.292740206e-04f, -7.983862880e-05f, -3.508451129e-04f, -5.836906051e-04f, -6.717351548e-04f, -5.537030433e-04f, -2.493466977e-04f, +1.423099933e-04f, +4.839153604e-04f, +6.601693699e-04f, +6.269894260e-04f, +4.251152730e-04f, +1.534954273e-04f, -8.089054244e-05f, -2.094510392e-04f, -2.225377996e-04f, -1.586168246e-04f, -7.374393090e-05f, -1.103311328e-05f, + /* 2,21 (24) */ + -6.747405816e-04f, -1.197098466e-03f, -1.030856615e-03f, +8.896141201e-04f, +5.817694933e-03f, +1.482038439e-02f, +2.832753059e-02f, +4.575936797e-02f, +6.539240479e-02f, +8.456313346e-02f, +1.001986057e-01f, +1.095421712e-01f, +1.108596255e-01f, +1.039017667e-01f, +8.997182778e-02f, +7.157544412e-02f, +5.176845179e-02f, +3.341209331e-02f, +1.856223640e-02f, +8.156427011e-03f, +2.048629909e-03f, -6.771722953e-04f, -1.262515917e-03f, -8.625094414e-04f, + +1.890094555e-05f, +1.052209830e-05f, -2.541182018e-05f, -9.903708683e-05f, -2.112915759e-04f, -3.495687512e-04f, -4.874736909e-04f, -5.898356489e-04f, -6.221360480e-04f, -5.615504634e-04f, -4.057497427e-04f, -1.760169995e-04f, +8.692565704e-05f, +3.333870066e-04f, +5.181434937e-04f, +6.123939157e-04f, +6.103434187e-04f, +5.285360669e-04f, +3.986863436e-04f, +2.569602633e-04f, +1.335967791e-04f, +4.617374690e-05f, -1.916364455e-06f, -1.830067241e-05f, + +5.361070961e-04f, -1.813921345e-04f, -3.091718979e-03f, -8.652766133e-03f, -1.582494771e-02f, -2.184548747e-02f, -2.300540157e-02f, -1.629715428e-02f, -1.207610589e-03f, +1.933645954e-02f, +3.956871215e-02f, +5.296625578e-02f, +5.492873702e-02f, +4.476753963e-02f, +2.600862987e-02f, +4.855266601e-03f, -1.241419362e-02f, -2.184188727e-02f, -2.290310650e-02f, -1.799810518e-02f, -1.081935966e-02f, -4.558298627e-03f, -8.117472799e-04f, +4.824661342e-04f, + -8.671834766e-07f, +5.046672918e-05f, +1.318410047e-04f, +2.082305379e-04f, +2.248556185e-04f, +1.340756278e-04f, -7.194235371e-05f, -3.423623664e-04f, -5.781153860e-04f, -6.719709070e-04f, -5.605418947e-04f, -2.608516846e-04f, +1.301060727e-04f, +4.752889960e-04f, +6.578275632e-04f, +6.309863052e-04f, +4.330715464e-04f, +1.619166851e-04f, -7.495759125e-05f, -2.072799585e-04f, -2.235759227e-04f, -1.612161629e-04f, -7.621849629e-05f, -1.243343331e-05f, + /* 2,22 (24) */ + -6.558396361e-04f, -1.186576368e-03f, -1.056268435e-03f, +7.905770333e-04f, +5.606403357e-03f, +1.447081564e-02f, +2.784005690e-02f, +4.516953232e-02f, +6.477026874e-02f, +8.400158299e-02f, +9.979285592e-02f, +1.093661542e-01f, +1.109465511e-01f, +1.042351537e-01f, +9.048997127e-02f, +7.218783803e-02f, +5.237879521e-02f, +3.394062938e-02f, +1.896092274e-02f, +8.413387275e-03f, +2.182226688e-03f, -6.309985484e-04f, -1.264432282e-03f, -8.808101138e-04f, + +1.886486066e-05f, +1.113359983e-05f, -2.375356921e-05f, -9.612463026e-05f, -2.072864241e-04f, -3.450854932e-04f, -4.835093887e-04f, -5.875364520e-04f, -6.224595207e-04f, -5.649337840e-04f, -4.119062305e-04f, -1.839470589e-04f, +7.869682585e-05f, +3.264154723e-04f, +5.136456269e-04f, +6.109378255e-04f, +6.117498117e-04f, +5.320080214e-04f, +4.031064244e-04f, +2.612406066e-04f, +1.369618388e-04f, +4.829456226e-05f, -9.531721336e-07f, -1.814461260e-05f, + +5.352399126e-04f, -1.309254054e-04f, -2.959877975e-03f, -8.444535595e-03f, -1.560009209e-02f, -2.171141184e-02f, -2.307734393e-02f, -1.663951665e-02f, -1.785725975e-03f, +1.866448863e-02f, +3.900817025e-02f, +5.270540410e-02f, +5.505884309e-02f, +4.524282862e-02f, +2.666645744e-02f, +5.486252906e-03f, -1.198112207e-02f, -2.167997059e-02f, -2.297806409e-02f, -1.820538514e-02f, -1.104293558e-02f, -4.719514790e-03f, -8.879657762e-04f, +4.700327009e-04f, + -1.849649032e-06f, +4.830285877e-05f, +1.291207824e-04f, +2.064463045e-04f, +2.257844555e-04f, +1.387595813e-04f, -6.411324919e-05f, -3.338465777e-04f, -5.723978525e-04f, -6.719992106e-04f, -5.671899256e-04f, -2.722640448e-04f, +1.178556876e-04f, +4.664976795e-04f, +6.552738902e-04f, +6.348109959e-04f, +4.409555500e-04f, +1.703747559e-04f, -6.891738327e-05f, -2.049913645e-04f, -2.245357194e-04f, -1.637945700e-04f, -7.871627351e-05f, -1.387217702e-05f, + /* 2,23 (24) */ + -6.369747754e-04f, -1.175442768e-03f, -1.080022004e-03f, +6.944524030e-04f, +5.399116933e-03f, +1.412573014e-02f, +2.735654751e-02f, +4.458199587e-02f, +6.414780922e-02f, +8.343664921e-02f, +9.938094969e-02f, +1.091822071e-01f, +1.110252480e-01f, +1.045615692e-01f, +9.100361690e-02f, +7.279877586e-02f, +5.299054502e-02f, +3.447263740e-02f, +1.936402917e-02f, +8.674627881e-03f, +2.319188527e-03f, -5.827039862e-04f, -1.265385454e-03f, -8.989547265e-04f, + +1.881544380e-05f, +1.171835245e-05f, -2.213267467e-05f, -9.325119560e-05f, -2.033084726e-04f, -3.406036299e-04f, -4.795114912e-04f, -5.851688234e-04f, -6.226909977e-04f, -5.682218367e-04f, -4.179878698e-04f, -1.918424496e-04f, +7.045307472e-05f, +3.193834961e-04f, +5.090579844e-04f, +6.093856145e-04f, +6.130762398e-04f, +5.354315812e-04f, +4.075143456e-04f, +2.655392034e-04f, +1.403628855e-04f, +5.045481151e-05f, +4.176771401e-08f, -1.796981020e-05f, + +5.333902636e-04f, -8.262254660e-05f, -2.830757192e-03f, -8.238089290e-03f, -1.537430764e-02f, -2.157265226e-02f, -2.314145718e-02f, -1.697336322e-02f, -2.358123827e-03f, +1.799248942e-02f, +3.844098032e-02f, +5.243314005e-02f, +5.517669878e-02f, +4.570932630e-02f, +2.732173133e-02f, +6.121063902e-03f, -1.154016652e-02f, -2.150959583e-02f, -2.304698148e-02f, -1.841037650e-02f, -1.126747130e-02f, -4.883309360e-03f, -9.666820497e-04f, +4.561605239e-04f, + -2.795161580e-06f, +4.617147413e-05f, +1.263990239e-04f, +2.046050295e-04f, +2.266061112e-04f, +1.433253052e-04f, -5.635378605e-05f, -3.253012863e-04f, -5.665410181e-04f, -6.718209774e-04f, -5.736452673e-04f, -2.835797956e-04f, +1.055631995e-04f, +4.575442216e-04f, +6.525084716e-04f, +6.384611192e-04f, +4.487637350e-04f, +1.788666174e-04f, -6.277123418e-05f, -2.025847015e-04f, -2.254155049e-04f, -1.663503184e-04f, -8.123629262e-05f, -1.534931117e-05f, + /* 2,24 (24) */ + -6.181593316e-04f, -1.163724415e-03f, -1.102154679e-03f, +6.012012074e-04f, +5.195808460e-03f, +1.378512652e-02f, +2.687703602e-02f, +4.399682704e-02f, +6.352511822e-02f, +8.286842737e-02f, +9.896296182e-02f, +1.089903647e-01f, +1.110957010e-01f, +1.048809527e-01f, +9.151267488e-02f, +7.340816147e-02f, +5.360362126e-02f, +3.500806898e-02f, +1.977154351e-02f, +8.940167085e-03f, +2.459551413e-03f, -5.322491747e-04f, -1.265343686e-03f, -9.169245366e-04f, + +1.875309709e-05f, +1.227676465e-05f, -2.054890974e-05f, -9.041691952e-05f, -1.993583130e-04f, -3.361241455e-04f, -4.754811461e-04f, -5.827337377e-04f, -6.228309436e-04f, -5.714143646e-04f, -4.239936841e-04f, -1.997017072e-04f, +6.219596318e-05f, +3.122923087e-04f, +5.043811523e-04f, +6.077371186e-04f, +6.143219148e-04f, +5.388056300e-04f, +4.119090148e-04f, +2.698552725e-04f, +1.437995866e-04f, +5.265458140e-05f, +1.068808779e-06f, -1.777583992e-05f, + +5.305951020e-04f, -3.645107247e-05f, -2.704358168e-03f, -8.033484261e-03f, -1.514770153e-02f, -2.142932695e-02f, -2.319781096e-02f, -1.729866451e-02f, -2.924664845e-03f, +1.732066845e-02f, +3.786733506e-02f, +5.214956026e-02f, +5.528226198e-02f, +4.616687052e-02f, +2.797423980e-02f, +6.759525021e-03f, -1.109140279e-02f, -2.133072921e-02f, -2.310975271e-02f, -1.861296120e-02f, -1.149288680e-02f, -5.049659679e-03f, -1.047918342e-03f, +4.408112127e-04f, + -3.703985872e-06f, +4.407314990e-05f, +1.236772130e-04f, +2.027085424e-04f, +2.273217245e-04f, +1.477722844e-04f, -4.866638302e-05f, -3.167300202e-04f, -5.605479395e-04f, -6.714372019e-04f, -5.799061350e-04f, -2.947949980e-04f, +9.323298872e-05f, +4.484315048e-04f, +6.495315166e-04f, +6.419343587e-04f, +4.564925630e-04f, +1.873892085e-04f, -5.652052112e-05f, -2.000594643e-04f, -2.262136130e-04f, -1.688816670e-04f, -8.377755386e-05f, -1.686477662e-05f, + /* 2,25 (24) */ + -5.994062345e-04f, -1.151447651e-03f, -1.122703589e-03f, +5.107842879e-04f, +4.996450147e-03f, +1.344900237e-02f, +2.640155487e-02f, +4.341409331e-02f, +6.290228728e-02f, +8.229701301e-02f, +9.853896813e-02f, +1.087906630e-01f, +1.111578970e-01f, +1.051932450e-01f, +9.201705604e-02f, +7.401589859e-02f, +5.421794317e-02f, +3.554687461e-02f, +2.018345253e-02f, +9.210022357e-03f, +2.603350999e-03f, -4.795945933e-04f, -1.264274877e-03f, -9.347003766e-04f, + +1.867821997e-05f, +1.280924741e-05f, -1.900203890e-05f, -8.762192522e-05f, -1.954365230e-04f, -3.316480143e-04f, -4.714195013e-04f, -5.802321806e-04f, -6.228798434e-04f, -5.745111347e-04f, -4.299227169e-04f, -2.075233773e-04f, +5.392705441e-05f, +3.051431560e-04f, +4.996157398e-04f, +6.059921968e-04f, +6.154860638e-04f, +5.421290560e-04f, +4.162893342e-04f, +2.741880197e-04f, +1.472715951e-04f, +5.489394744e-05f, +2.128299365e-06f, -1.756227598e-05f, + +5.268911161e-04f, +7.622077426e-06f, -2.580680955e-03f, -7.830775718e-03f, -1.492037980e-02f, -2.128155467e-02f, -2.324647735e-02f, -1.761539453e-02f, -3.485212785e-03f, +1.664923124e-02f, +3.728742892e-02f, +5.185476526e-02f, +5.537549496e-02f, +4.661530203e-02f, +2.862377132e-02f, +7.401459380e-03f, -1.063491023e-02f, -2.114334001e-02f, -2.316627323e-02f, -1.881302067e-02f, -1.171910042e-02f, -5.218541346e-03f, -1.131695896e-03f, +4.239464361e-04f, + -4.576406290e-06f, +4.200843041e-05f, +1.209568106e-04f, +2.007586760e-04f, +2.279324725e-04f, +1.521000643e-04f, -4.105340592e-05f, -3.081362939e-04f, -5.544217142e-04f, -6.708489603e-04f, -5.859708285e-04f, -3.059057580e-04f, +8.086945297e-05f, +4.391624825e-04f, +6.463433227e-04f, +6.452284613e-04f, +4.641385077e-04f, +1.959394305e-04f, -5.016668252e-05f, -1.974151997e-04f, -2.269283978e-04f, -1.713868621e-04f, -8.633902784e-05f, -1.841848797e-05f, + /* 2,26 (24) */ + -5.807280146e-04f, -1.138638403e-03f, -1.141705627e-03f, +4.231623627e-04f, +4.801013624e-03f, +1.311735436e-02f, +2.593013537e-02f, +4.283386113e-02f, +6.227940744e-02f, +8.172250187e-02f, +9.810904542e-02f, +1.085831396e-01f, +1.112118241e-01f, +1.054983882e-01f, +9.251667177e-02f, +7.462189079e-02f, +5.483342924e-02f, +3.608900367e-02f, +2.059974186e-02f, +9.484210377e-03f, +2.750622594e-03f, -4.247006458e-04f, -1.262146578e-03f, -9.522626525e-04f, + +1.859120906e-05f, +1.331621398e-05f, -1.749181816e-05f, -8.486632263e-05f, -1.915436659e-04f, -3.271762009e-04f, -4.673277037e-04f, -5.776651480e-04f, -6.228382017e-04f, -5.775119374e-04f, -4.357740323e-04f, -2.153060157e-04f, +4.564791482e-05f, +2.979373002e-04f, +4.947623787e-04f, +6.041507306e-04f, +6.165679301e-04f, +5.454007527e-04f, +4.206542003e-04f, +2.785366386e-04f, +1.507785496e-04f, +5.717297374e-05f, +3.220582194e-06f, -1.732869222e-05f, + +5.223147098e-04f, +4.963050784e-05f, -2.459724145e-03f, -7.630017042e-03f, -1.469244733e-02f, -2.112945460e-02f, -2.328753075e-02f, -1.792353082e-02f, -4.039634499e-03f, +1.597838228e-02f, +3.670145809e-02f, +5.154885950e-02f, +5.545636442e-02f, +4.705446451e-02f, +2.927011464e-02f, +8.046687841e-03f, -1.017077172e-02f, -2.094740058e-02f, -2.321643991e-02f, -1.901043587e-02f, -1.194602881e-02f, -5.389928208e-03f, -1.218034924e-03f, +4.055279482e-04f, + -5.412726337e-06f, +3.997782979e-05f, +1.182392537e-04f, +1.987572655e-04f, +2.284395699e-04f, +1.563082506e-04f, -3.351716690e-05f, -2.995236074e-04f, -5.481654794e-04f, -6.700574097e-04f, -5.918377328e-04f, -3.169082289e-04f, +6.847700495e-05f, +4.297401776e-04f, +6.429442762e-04f, +6.483412393e-04f, +4.716980567e-04f, +2.045141480e-04f, -4.371121788e-05f, -1.946515064e-04f, -2.275582344e-04f, -1.738641378e-04f, -8.891965578e-05f, -2.001033321e-05f, + /* 2,27 (24) */ + -5.621368055e-04f, -1.125322189e-03f, -1.159197446e-03f, +3.382960400e-04f, +4.609469958e-03f, +1.279017815e-02f, +2.546280767e-02f, +4.225619598e-02f, +6.165656923e-02f, +8.114498994e-02f, +9.767327138e-02f, +1.083678336e-01f, +1.112574720e-01f, +1.057963255e-01f, +9.301143415e-02f, +7.522604152e-02f, +5.544999717e-02f, +3.663440442e-02f, +2.102039606e-02f, +9.762747015e-03f, +2.901401144e-03f, -3.675276721e-04f, -1.258925996e-03f, -9.695913448e-04f, + +1.849245808e-05f, +1.379807969e-05f, -1.601799522e-05f, -8.215020841e-05f, -1.876802906e-04f, -3.227096598e-04f, -4.632068992e-04f, -5.750336461e-04f, -6.227065429e-04f, -5.804165871e-04f, -4.415467146e-04f, -2.230481888e-04f, +3.736011364e-05f, +2.906760184e-04f, +4.898217239e-04f, +6.022126246e-04f, +6.175667733e-04f, +5.486196193e-04f, +4.250025045e-04f, +2.829003102e-04f, +1.543200745e-04f, +5.949171285e-05f, +4.345994203e-06f, -1.707466226e-05f, + +5.169019835e-04f, +8.960833763e-05f, -2.341484891e-03f, -7.431259777e-03f, -1.446400776e-02f, -2.097314635e-02f, -2.332104792e-02f, -1.822305443e-02f, -4.587799978e-03f, +1.530832487e-02f, +3.610962036e-02f, +5.123195127e-02f, +5.552484142e-02f, +4.748420469e-02f, +2.991305892e-02f, +8.695029080e-03f, -9.699073661e-03f, -2.074288643e-02f, -2.326015113e-02f, -1.920508737e-02f, -1.217358705e-02f, -5.563792346e-03f, -1.306954580e-03f, +3.855176150e-04f, + -6.213268125e-06f, +3.798183208e-05f, +1.155259551e-04f, +1.967061477e-04f, +2.288442673e-04f, +1.603965089e-04f, -2.605992372e-05f, -2.908954441e-04f, -5.417824102e-04f, -6.690637871e-04f, -5.975053183e-04f, -3.277986126e-04f, +5.606007047e-05f, +4.201676808e-04f, +6.393348523e-04f, +6.512705711e-04f, +4.791677130e-04f, +2.131101909e-04f, -3.715568749e-05f, -1.917680365e-04f, -2.281015201e-04f, -1.763117176e-04f, -9.151834969e-05f, -2.164017338e-05f, + /* 2,28 (24) */ + -5.436443474e-04f, -1.111524110e-03f, -1.175215441e-03f, +2.561458316e-04f, +4.421789668e-03f, +1.246746849e-02f, +2.499960077e-02f, +4.168116233e-02f, +6.103386269e-02f, +8.056457335e-02f, +9.723172467e-02f, +1.081447854e-01f, +1.112948321e-01f, +1.060870015e-01f, +9.350125588e-02f, +7.582825414e-02f, +5.606756394e-02f, +3.718302404e-02f, +2.144539857e-02f, +1.004564733e-02f, +3.055721218e-03f, -3.080359592e-04f, -1.254580002e-03f, -9.866660070e-04f, + +1.838235768e-05f, +1.425526179e-05f, -1.458030965e-05f, -7.947366616e-05f, -1.838469319e-04f, -3.182493353e-04f, -4.590582325e-04f, -5.723386911e-04f, -6.224854107e-04f, -5.832249218e-04f, -4.472398691e-04f, -2.307484740e-04f, +2.906522245e-05f, +2.833606028e-04f, +4.847944527e-04f, +6.001778064e-04f, +6.184818694e-04f, +5.517845608e-04f, +4.293331335e-04f, +2.872782033e-04f, +1.578957793e-04f, +6.185020561e-05f, +5.504866354e-06f, -1.679975971e-05f, + +5.106887154e-04f, +1.275901697e-04f, -2.225958936e-03f, -7.234553629e-03f, -1.423516349e-02f, -2.081274984e-02f, -2.334710784e-02f, -1.851394988e-02f, -5.129582389e-03f, +1.463926109e-02f, +3.551211504e-02f, +5.090415266e-02f, +5.558090149e-02f, +4.790437237e-02f, +3.055239377e-02f, +9.346299651e-03f, -9.219905948e-03f, -2.052977624e-02f, -2.329730682e-02f, -1.939685541e-02f, -1.240168857e-02f, -5.740104063e-03f, -1.398472929e-03f, +3.638774416e-04f, + -6.978371850e-06f, +3.602089138e-05f, +1.128183026e-04f, +1.946071598e-04f, +2.291478507e-04f, +1.643645643e-04f, -1.868387906e-05f, -2.822552695e-04f, -5.352757180e-04f, -6.678694090e-04f, -6.029721417e-04f, -3.385731614e-04f, +4.362308645e-05f, +4.104481502e-04f, +6.355156147e-04f, +6.540144025e-04f, +4.865439971e-04f, +2.217243550e-04f, -3.050171218e-05f, -1.887644956e-04f, -2.285566754e-04f, -1.787278146e-04f, -9.413399264e-05f, -2.330784222e-05f, + /* 2,29 (24) */ + -5.252619897e-04f, -1.097268848e-03f, -1.189795751e-03f, +1.766721655e-04f, +4.237942736e-03f, +1.214921916e-02f, +2.454054253e-02f, +4.110882364e-02f, +6.041137728e-02f, +7.998134843e-02f, +9.678448480e-02f, +1.079140369e-01f, +1.113238973e-01f, +1.063703621e-01f, +9.398605033e-02f, +7.642843195e-02f, +5.668604581e-02f, +3.773480860e-02f, +2.187473170e-02f, +1.033292553e-02f, +3.213616998e-03f, -2.461857536e-04f, -1.249075135e-03f, -1.003465767e-03f, + +1.826129538e-05f, +1.468817924e-05f, -1.317849311e-05f, -7.683676646e-05f, -1.800441102e-04f, -3.137961612e-04f, -4.548828464e-04f, -5.695813083e-04f, -6.221753681e-04f, -5.859368034e-04f, -4.528526219e-04f, -2.384054602e-04f, +2.076481481e-05f, +2.759923601e-04f, +4.796812647e-04f, +5.980462265e-04f, +6.193125111e-04f, +5.548944887e-04f, +4.336449694e-04f, +2.916694746e-04f, +1.615052594e-04f, +6.424848103e-05f, +6.697523430e-06f, -1.650355829e-05f, + +5.037103435e-04f, +1.636110611e-04f, -2.113140633e-03f, -7.039946469e-03f, -1.400601564e-02f, -2.064838528e-02f, -2.336579172e-02f, -1.879620515e-02f, -5.664858107e-03f, +1.397139168e-02f, +3.490914290e-02f, +5.056557950e-02f, +5.562452458e-02f, +4.831482052e-02f, +3.118790938e-02f, +1.000031405e-02f, -8.733361951e-03f, -2.030805188e-02f, -2.332780853e-02f, -1.958561990e-02f, -1.263024524e-02f, -5.918831878e-03f, -1.492606922e-03f, +3.405695994e-04f, + -7.708395271e-06f, +3.409543201e-05f, +1.101176588e-04f, +1.924621382e-04f, +2.293516403e-04f, +1.682122012e-04f, -1.139117981e-05f, -2.736065296e-04f, -5.286486484e-04f, -6.664756702e-04f, -6.082368464e-04f, -3.492281796e-04f, +3.117049891e-05f, +4.005848091e-04f, +6.314872159e-04f, +6.565707484e-04f, +4.938234485e-04f, +2.303534036e-04f, -2.375097296e-05f, -1.856406436e-04f, -2.289221454e-04f, -1.811106325e-04f, -9.676543903e-05f, -2.501314587e-05f, + /* 2,30 (24) */ + -5.070006944e-04f, -1.082580669e-03f, -1.202974244e-03f, +9.983539900e-05f, +4.057898625e-03f, +1.183542300e-02f, +2.408565969e-02f, +4.053924233e-02f, +5.978920191e-02f, +7.939541162e-02f, +9.633163218e-02f, +1.076756315e-01f, +1.113446621e-01f, +1.066463545e-01f, +9.446573159e-02f, +7.702647818e-02f, +5.730535832e-02f, +3.828970309e-02f, +2.230837667e-02f, +1.062459500e-02f, +3.375122257e-03f, -1.819372726e-04f, -1.242377612e-03f, -1.019969325e-03f, + +1.812965542e-05f, +1.509725256e-05f, -1.181226953e-05f, -7.423956698e-05f, -1.762723314e-04f, -3.093510607e-04f, -4.506818819e-04f, -5.667625323e-04f, -6.217769968e-04f, -5.885521170e-04f, -4.583841202e-04f, -2.460177481e-04f, +1.246046575e-05f, +2.685726115e-04f, +4.744828822e-04f, +5.958178588e-04f, +6.200580086e-04f, +5.579483211e-04f, +4.379368899e-04f, +2.960732688e-04f, +1.651480956e-04f, +6.668655613e-05f, +7.924283845e-06f, -1.618563203e-05f, + +4.960019483e-04f, +1.977064931e-04f, -2.003022974e-03f, -6.847484331e-03f, -1.377666400e-02f, -2.048017308e-02f, -2.337718290e-02f, -1.906981168e-02f, -6.193506755e-03f, +1.330491601e-02f, +3.430090605e-02f, +5.021635132e-02f, +5.565569508e-02f, +4.871540533e-02f, +3.181939660e-02f, +1.065688480e-02f, -8.239538502e-03f, -2.007769848e-02f, -2.335155950e-02f, -1.977126055e-02f, -1.285916739e-02f, -6.099942510e-03f, -1.589372361e-03f, +3.155564535e-04f, + -8.403713181e-06f, +3.220584870e-05f, +1.074253608e-04f, +1.902729177e-04f, +2.294569894e-04f, +1.719392626e-04f, -4.183916502e-06f, -2.649526494e-04f, -5.219044802e-04f, -6.648840429e-04f, -6.132981627e-04f, -3.597600253e-04f, +1.870676093e-05f, +3.905809452e-04f, +6.272503973e-04f, +6.589376933e-04f, +5.010026274e-04f, +2.389940689e-04f, -1.690521069e-05f, -1.823962955e-04f, -2.291964006e-04f, -1.834583669e-04f, -9.941151491e-05f, -2.675586256e-05f, + /* 2,31 (24) */ + -4.888710389e-04f, -1.067483416e-03f, -1.214786513e-03f, +2.559583202e-05f, +3.881626294e-03f, +1.152607194e-02f, +2.363497781e-02f, +3.997247980e-02f, +5.916742492e-02f, +7.880685951e-02f, +9.587324806e-02f, +1.074296137e-01f, +1.113571226e-01f, +1.069149271e-01f, +9.494021448e-02f, +7.762229604e-02f, +5.792541633e-02f, +3.884765141e-02f, +2.274631356e-02f, +1.092066827e-02f, +3.540270353e-03f, -1.152507165e-04f, -1.234453328e-03f, -1.036154957e-03f, + +1.798781866e-05f, +1.548290361e-05f, -1.048135530e-05f, -7.168211267e-05f, -1.725320870e-04f, -3.049149461e-04f, -4.464564775e-04f, -5.638834066e-04f, -6.212908975e-04f, -5.910707719e-04f, -4.638335327e-04f, -2.535839502e-04f, +4.153751417e-06f, +2.611026920e-04f, +4.692000494e-04f, +5.934927004e-04f, +6.207176891e-04f, +5.609449829e-04f, +4.422077692e-04f, +3.004887188e-04f, +1.688238542e-04f, +6.916443580e-05f, +9.185459440e-06f, -1.584555542e-05f, + +4.875982351e-04f, +2.299123418e-04f, -1.895597614e-03f, -6.657211414e-03f, -1.354720701e-02f, -2.030823382e-02f, -2.338136682e-02f, -1.933476432e-02f, -6.715411235e-03f, +1.264003196e-02f, +3.368760789e-02f, +4.985659129e-02f, +5.567440184e-02f, +4.910598627e-02f, +3.244664700e-02f, +1.131582250e-02f, -7.738535875e-03f, -1.983870441e-02f, -2.336846472e-02f, -1.995365684e-02f, -1.308836379e-02f, -6.283400877e-03f, -1.688783876e-03f, +2.888005909e-04f, + -9.064716865e-06f, +3.035250677e-05f, +1.047427193e-04f, +1.880413307e-04f, +2.294652832e-04f, +1.755456498e-04f, +2.935877331e-06f, -2.562970312e-04f, -5.150465232e-04f, -6.630960758e-04f, -6.181549083e-04f, -3.701651116e-04f, +6.236330677e-06f, +3.804399088e-04f, +6.228059886e-04f, +6.611133931e-04f, +5.080781166e-04f, +2.476430534e-04f, -9.966225700e-06f, -1.790313220e-04f, -2.293779382e-04f, -1.857692058e-04f, -1.020710182e-04f, -2.853574234e-05f, + /* 3, 0 (24) */ + -7.917356639e-04f, -3.016122763e-03f, -6.515256363e-03f, -9.608647522e-03f, -8.911531175e-03f, -1.899096117e-04f, +1.981753504e-02f, +5.131567626e-02f, +9.019272462e-02f, +1.284788675e-01f, +1.566624559e-01f, +1.670419145e-01f, +1.566624559e-01f, +1.284788675e-01f, +9.019272462e-02f, +5.131567626e-02f, +1.981753504e-02f, -1.899096117e-04f, -8.911531175e-03f, -9.608647522e-03f, -6.515256363e-03f, -3.016122763e-03f, -7.917356639e-04f, +7.650297944e-06f, + +4.438129776e-05f, +9.288555880e-05f, +1.166047700e-04f, +6.055408398e-05f, -1.214573968e-04f, -4.322415435e-04f, -8.085880363e-04f, -1.128795806e-03f, -1.254606094e-03f, -1.092006038e-03f, -6.415426008e-04f, -1.039008209e-05f, +6.237490619e-04f, +1.081988441e-03f, +1.254166848e-03f, +1.136337421e-03f, +8.201804378e-04f, +4.435206002e-04f, +1.293692963e-04f, -5.693319620e-05f, -1.163592181e-04f, -9.426136396e-05f, -4.583541038e-05f, -8.923101798e-06f, + +2.391742032e-03f, +5.312215035e-03f, +6.607426619e-03f, +2.622016450e-03f, -8.359379704e-03f, -2.318774526e-02f, -3.380890411e-02f, -3.134542425e-02f, -1.229656639e-02f, +1.750386073e-02f, +4.470491270e-02f, +5.568063817e-02f, +4.470491270e-02f, +1.750386073e-02f, -1.229656639e-02f, -3.134542425e-02f, -3.380890411e-02f, -2.318774526e-02f, -8.359379704e-03f, +2.622016450e-03f, +6.607426619e-03f, +5.312215035e-03f, +2.391742032e-03f, +4.555202259e-04f, + -8.328765248e-05f, -8.524146050e-05f, +2.168904174e-05f, +2.318317186e-04f, +4.324770105e-04f, +4.498819789e-04f, +1.726415751e-04f, -3.321135850e-04f, -8.129264642e-04f, -9.714409511e-04f, -6.623103823e-04f, -1.122753743e-05f, +6.457668103e-04f, +9.689372183e-04f, +8.241044281e-04f, +3.491395175e-04f, -1.594007232e-04f, -4.458682330e-04f, -4.366838699e-04f, -2.390934712e-04f, -2.700232027e-05f, +8.376427446e-05f, +8.444382486e-05f, +3.589476488e-05f, + /* 3, 1 (24) */ + -7.473543661e-04f, -2.923237204e-03f, -6.398651594e-03f, -9.548093438e-03f, -9.032988571e-03f, -6.221511552e-04f, +1.900894700e-02f, +5.018688045e-02f, +8.893811853e-02f, +1.273868615e-01f, +1.560209133e-01f, +1.670315244e-01f, +1.572862050e-01f, +1.295608560e-01f, +9.144689147e-02f, +5.245201368e-02f, +2.063771547e-02f, +2.536109885e-04f, -8.782161878e-03f, -9.665580718e-03f, -6.631615582e-03f, -3.110384127e-03f, -8.375710743e-04f, -1.272803854e-06f, + +4.294149459e-05f, +9.148723106e-05f, +1.167718107e-04f, +6.404830492e-05f, -1.136769732e-04f, -4.210316793e-04f, -7.969423900e-04f, -1.121060636e-03f, -1.254755552e-03f, -1.101733279e-03f, -6.591535567e-04f, -3.116722669e-05f, +6.057777733e-04f, +1.071682283e-03f, +1.253436160e-03f, +1.143681477e-03f, +8.317151817e-04f, +4.548657984e-04f, +1.374117981e-04f, -5.318465797e-05f, -1.160333507e-04f, -9.561309131e-05f, -4.730310127e-05f, -9.725942243e-06f, + +2.308454379e-03f, +5.226973574e-03f, +6.629115661e-03f, +2.853848169e-03f, -7.926902694e-03f, -2.273786328e-02f, -3.363626253e-02f, -3.167753783e-02f, -1.310949286e-02f, +1.653241978e-02f, +4.404260232e-02f, +5.566941063e-02f, +4.535067951e-02f, +1.847279795e-02f, -1.147246196e-02f, -3.099628473e-02f, -3.396830483e-02f, -2.363361349e-02f, -8.796063574e-03f, +2.382922979e-03f, +6.580424299e-03f, +5.395979309e-03f, +2.476185857e-03f, +4.914149908e-04f, + -8.208617321e-05f, -8.660649126e-05f, +1.648631167e-05f, +2.245666512e-04f, +4.280861048e-04f, +4.535921347e-04f, +1.856434745e-04f, -3.150688955e-04f, -8.014203357e-04f, -9.734637637e-04f, -6.785011074e-04f, -3.367650675e-05f, +6.288787583e-04f, +9.659521188e-04f, +8.349460613e-04f, +3.661367488e-04f, -1.459264257e-04f, -4.415496956e-04f, -4.407012446e-04f, -2.463467642e-04f, -3.242431918e-05f, +8.217356412e-05f, +8.555233233e-05f, +3.746454073e-05f, + /* 3, 2 (24) */ + -7.044128715e-04f, -2.831749973e-03f, -6.281879783e-03f, -9.484045133e-03f, -9.146665545e-03f, -1.043182834e-03f, +1.821200461e-02f, +4.906581982e-02f, +8.768336298e-02f, +1.262851282e-01f, +1.553617598e-01f, +1.670003572e-01f, +1.578919828e-01f, +1.306325382e-01f, +9.270032763e-02f, +5.359569516e-02f, +2.146943066e-02f, +7.084767869e-04f, -8.644750080e-03f, -9.718765376e-03f, -6.747648932e-03f, -3.205997218e-03f, -8.848741755e-04f, -1.099874610e-05f, + +4.151670416e-05f, +9.006791560e-05f, +1.168621514e-04f, +6.741688592e-05f, -1.060288310e-04f, -4.098939964e-04f, -7.852478923e-04f, -1.113135960e-03f, -1.254616975e-03f, -1.111168481e-03f, -6.765771692e-04f, -5.193531372e-05f, +5.876336398e-04f, +1.061089468e-03f, +1.252412474e-03f, +1.150824016e-03f, +8.431878379e-04f, +4.662740262e-04f, +1.455839599e-04f, -4.930753009e-05f, -1.156253717e-04f, -9.693916574e-05f, -4.878361126e-05f, -1.055290011e-05f, + +2.226368206e-03f, +5.140367083e-03f, +6.645601972e-03f, +3.078414820e-03f, -7.498816589e-03f, -2.228427115e-02f, -3.345061906e-02f, -3.199260673e-02f, -1.391091319e-02f, +1.555895602e-02f, +4.336410121e-02f, +5.563573413e-02f, +4.597955827e-02f, +1.943875007e-02f, -1.063751590e-02f, -3.063014798e-02f, -3.411423125e-02f, -2.407516319e-02f, -9.236764819e-03f, +2.136576215e-03f, +6.547999980e-03f, +5.478152873e-03f, +2.561738189e-03f, +5.288795315e-04f, + -8.084173690e-05f, -8.786080506e-05f, +1.139584045e-05f, +2.173033413e-04f, +4.235166508e-04f, +4.570000917e-04f, +1.984011167e-04f, -2.980153362e-04f, -7.895943690e-04f, -9.750063939e-04f, -6.943308460e-04f, -5.610716341e-05f, +6.116548155e-04f, +9.624854981e-04f, +8.454433646e-04f, +3.830952845e-04f, -1.322243893e-04f, -4.369253578e-04f, -4.445237610e-04f, -2.535863825e-04f, -3.795309249e-05f, +8.046803207e-05f, +8.661081072e-05f, +3.904815034e-05f, + /* 3, 3 (24) */ + -6.628961674e-04f, -2.741682057e-03f, -6.165017631e-03f, -9.416628247e-03f, -9.252694376e-03f, -1.453076831e-03f, +1.742675672e-02f, +4.795268386e-02f, +8.642874600e-02f, +1.251739597e-01f, +1.546851826e-01f, +1.669484219e-01f, +1.584796164e-01f, +1.316936277e-01f, +9.395274011e-02f, +5.474651917e-02f, +2.231261849e-02f, +1.174750813e-03f, -8.499166120e-03f, -9.768072906e-03f, -6.863274304e-03f, -3.302936384e-03f, -9.336577868e-04f, -2.155164621e-05f, + +4.010760193e-05f, +8.862912628e-05f, +1.168776089e-04f, +7.066089609e-05f, -9.851370773e-05f, -3.988314213e-04f, -7.735089158e-04f, -1.105025867e-03f, -1.254192209e-03f, -1.120310067e-03f, -6.938087530e-04f, -7.268830890e-05f, +5.693216354e-04f, +1.050212011e-03f, +1.251094331e-03f, +1.157761129e-03f, +8.545939606e-04f, +4.777421116e-04f, +1.538847709e-04f, -4.530091876e-05f, -1.151334936e-04f, -9.823799292e-05f, -5.027615317e-05f, -1.140398583e-05f, + +2.145526469e-03f, +5.052506278e-03f, +6.656997813e-03f, +3.295718161e-03f, -7.075299938e-03f, -2.182727105e-02f, -3.325221794e-02f, -3.229062206e-02f, -1.470050756e-02f, +1.458394963e-02f, +4.266977036e-02f, +5.557962696e-02f, +4.659121308e-02f, +2.040123557e-02f, -9.792072538e-03f, -3.024705269e-02f, -3.424645564e-02f, -2.451208855e-02f, -9.681288580e-03f, +1.882989832e-03f, +6.510046887e-03f, +5.558620905e-03f, +2.648349000e-03f, +5.679276819e-04f, + -7.955668309e-05f, -8.900590706e-05f, +6.419221105e-06f, +2.100467847e-04f, +4.187742019e-04f, +4.601074287e-04f, +2.109094015e-04f, -2.809627312e-04f, -7.774570446e-04f, -9.760698691e-04f, -7.097916912e-04f, -7.850731232e-05f, +5.941037881e-04f, +9.585374951e-04f, +8.555885112e-04f, +4.000050864e-04f, -1.183005185e-04f, -4.319944063e-04f, -4.481461147e-04f, -2.608070442e-04f, -4.358657619e-05f, +7.864645488e-05f, +8.761689193e-05f, +4.064418164e-05f, + /* 3, 4 (24) */ + -6.227885655e-04f, -2.653052931e-03f, -6.048140022e-03f, -9.345967351e-03f, -9.351208083e-03f, -1.851908252e-03f, +1.665324780e-02f, +4.684765799e-02f, +8.517455379e-02f, +1.240536496e-01f, +1.539913739e-01f, +1.668757336e-01f, +1.590489380e-01f, +1.327438397e-01f, +9.520383444e-02f, +5.590428030e-02f, +2.316721245e-02f, +1.652492925e-03f, -8.345281349e-03f, -9.813373825e-03f, -6.978407798e-03f, -3.401174377e-03f, -9.839339400e-04f, -3.295563204e-05f, + +3.871483564e-05f, +8.717235549e-05f, +1.168200048e-04f, +7.378144564e-05f, -9.113227368e-05f, -3.878468170e-04f, -7.617298102e-04f, -1.096734486e-03f, -1.253483196e-03f, -1.129156576e-03f, -7.108436992e-04f, -9.342018411e-05f, +5.508468014e-04f, +1.039052033e-03f, +1.249480374e-03f, +1.164488953e-03f, +8.659290902e-04f, +4.892668230e-04f, +1.623131509e-04f, -4.116397666e-05f, -1.145559393e-04f, -9.950795986e-05f, -5.177991177e-05f, -1.227918995e-05f, + +2.065969786e-03f, +4.963500371e-03f, +6.663417034e-03f, +3.505764946e-03f, -6.656525736e-03f, -2.136716363e-02f, -3.304130854e-02f, -3.257158479e-02f, -1.547796461e-02f, +1.360787976e-02f, +4.195997867e-02f, +5.550111965e-02f, +4.718531687e-02f, +2.135977306e-02f, -8.936484026e-03f, -2.984704761e-02f, -3.436475616e-02f, -2.494408295e-02f, -1.012943469e-02f, +1.622182788e-03f, +6.466460311e-03f, +5.637267360e-03f, +2.735965892e-03f, +6.085718635e-04f, + -7.823333901e-05f, -9.004336690e-05f, +1.557929709e-06f, +2.028018984e-04f, +4.138643616e-04f, +4.629159086e-04f, +2.231634351e-04f, -2.639208351e-04f, -7.650169907e-04f, -9.766555049e-04f, -7.248759729e-04f, -1.008647784e-04f, +5.762346935e-04f, +9.541085427e-04f, +8.653738534e-04f, +4.168560789e-04f, -1.041609125e-04f, -4.267562251e-04f, -4.515630755e-04f, -2.680034041e-04f, -4.932258818e-05f, +7.670768539e-05f, +8.856820608e-05f, +4.225117502e-05f, + /* 3, 5 (24) */ + -5.840737298e-04f, -2.565880576e-03f, -5.931320018e-03f, -9.272185905e-03f, -9.442340357e-03f, -2.239755069e-03f, +1.589151799e-02f, +4.575092351e-02f, +8.392107060e-02f, +1.229244931e-01f, +1.532805302e-01f, +1.667823134e-01f, +1.595997848e-01f, +1.337828917e-01f, +9.645331481e-02f, +5.706876926e-02f, +2.403314154e-02f, +2.141759748e-03f, -8.182968199e-03f, -9.854537802e-03f, -7.092963737e-03f, -3.500682337e-03f, -1.035713852e-03f, -4.523482199e-05f, + +3.733902543e-05f, +8.569907359e-05f, +1.166911641e-04f, +7.677968482e-05f, -8.388513217e-05f, -3.769429824e-04f, -7.499149007e-04f, -1.088265987e-03f, -1.252491970e-03f, -1.137706655e-03f, -7.276774778e-04f, -1.141249198e-04f, +5.322142446e-04f, +1.027611765e-03f, +1.247569347e-03f, +1.171003681e-03f, +8.771887553e-04f, +5.008448706e-04f, +1.708679503e-04f, -3.689590400e-05f, -1.138909429e-04f, -1.007474356e-04f, -5.329404377e-05f, -1.317848272e-05f, + +1.987736447e-03f, +4.873457004e-03f, +6.664974964e-03f, +3.708566844e-03f, -6.242661375e-03f, -2.090424772e-02f, -3.281814510e-02f, -3.283550563e-02f, -1.624298160e-02f, +1.263122425e-02f, +4.123510270e-02f, +5.540025487e-02f, +4.776155157e-02f, +2.231388161e-02f, -8.071110173e-03f, -2.943019153e-02f, -3.446891707e-02f, -2.537083918e-02f, -1.058099777e-02f, +1.354179384e-03f, +6.417137723e-03f, +5.713975046e-03f, +2.824534098e-03f, +6.508230385e-04f, + -7.687401763e-05f, -9.097481622e-05f, -3.186674108e-06f, +1.955735175e-04f, +4.087927792e-04f, +4.654274759e-04f, +2.351585315e-04f, -2.468993268e-04f, -7.522829769e-04f, -9.767649031e-04f, -7.395762632e-04f, -1.231674144e-04f, +5.580567552e-04f, +9.491993685e-04f, +8.747919281e-04f, +4.336381561e-04f, -8.981186280e-05f, -4.212103984e-04f, -4.547694920e-04f, -2.751700567e-04f, -5.515882843e-05f, +7.465065498e-05f, +8.946238374e-05f, +4.386762395e-05f, + /* 3, 6 (24) */ + -5.467347044e-04f, -2.480181502e-03f, -5.814628854e-03f, -9.195406221e-03f, -9.526225489e-03f, -2.616698052e-03f, +1.514160309e-02f, +4.466265752e-02f, +8.266857863e-02f, +1.217867864e-01f, +1.525528527e-01f, +1.666681885e-01f, +1.601319991e-01f, +1.348105035e-01f, +9.770088416e-02f, +5.823977294e-02f, +2.491033030e-02f, +2.642604618e-03f, -8.012100248e-03f, -9.891433706e-03f, -7.206854680e-03f, -3.601429772e-03f, -1.089007895e-03f, -5.841330471e-05f, + +3.598076395e-05f, +8.421072848e-05f, +1.164929146e-04f, +7.965680278e-05f, -7.677282003e-05f, -3.661226517e-04f, -7.380684864e-04f, -1.079624571e-03f, -1.251220658e-03f, -1.145959062e-03f, -7.443056386e-04f, -1.347965074e-04f, +5.134291353e-04f, +1.015893545e-03f, +1.245360095e-03f, +1.177301558e-03f, +8.883684744e-04f, +5.124729073e-04f, +1.795479501e-04f, -3.249594950e-05f, -1.131367508e-04f, -1.019547717e-04f, -5.481767783e-05f, -1.410181368e-05f, + +1.910862429e-03f, +4.782482188e-03f, +6.661788290e-03f, +3.904140362e-03f, -5.833868595e-03f, -2.043882024e-02f, -3.258298657e-02f, -3.308240496e-02f, -1.699526457e-02f, +1.165445935e-02f, +4.049552644e-02f, +5.527708746e-02f, +4.831960832e-02f, +2.326308098e-02f, -7.196318245e-03f, -2.899655337e-02f, -3.455872894e-02f, -2.579204958e-02f, -1.103576726e-02f, +1.079009327e-03f, +6.361978894e-03f, +5.788625701e-03f, +2.913996481e-03f, +6.946906625e-04f, + -7.548101566e-05f, -9.180194618e-05f, -7.813346558e-06f, +1.883663929e-04f, +4.035651448e-04f, +4.676442529e-04f, +2.468902149e-04f, -2.299078035e-04f, -7.392639072e-04f, -9.763999499e-04f, -7.538853802e-04f, -1.454031092e-04f, +5.395793965e-04f, +9.438109947e-04f, +8.838354626e-04f, +4.503411878e-04f, -7.525985006e-05f, -4.153567124e-04f, -4.577602963e-04f, -2.823015400e-04f, -6.109287905e-05f, +7.247437578e-05f, +9.029705817e-05f, +4.549197558e-05f, + /* 3, 7 (24) */ + -5.107539404e-04f, -2.395970773e-03f, -5.698135939e-03f, -9.115749418e-03f, -9.602998309e-03f, -2.982820703e-03f, +1.440353461e-02f, +4.358303295e-02f, +8.141735797e-02f, +1.206408274e-01f, +1.518085470e-01f, +1.665333920e-01f, +1.606454282e-01f, +1.358263971e-01f, +9.894624425e-02f, +5.941707449e-02f, +2.579869877e-02f, +3.155077526e-03f, -7.832552298e-03f, -9.923929655e-03f, -7.319991431e-03f, -3.703384544e-03f, -1.143825573e-03f, -7.251511839e-05f, + +3.464061654e-05f, +8.270874508e-05f, +1.162270856e-04f, +8.241402644e-05f, -6.979580815e-05f, -3.553884937e-04f, -7.261948385e-04f, -1.070814478e-03f, -1.249671477e-03f, -1.153912669e-03f, -7.607238135e-04f, -1.554289519e-04f, +4.944967052e-04f, +1.003899819e-03f, +1.242851567e-03f, +1.183378883e-03f, +8.994637579e-04f, +5.241475292e-04f, +1.883518612e-04f, -2.796341146e-05f, -1.122916229e-04f, -1.031283033e-04f, -5.634991455e-05f, -1.504911122e-05f, + +1.835381414e-03f, +4.690680242e-03f, +6.653974943e-03f, +4.092506755e-03f, -5.430303451e-03f, -1.997117599e-02f, -3.233609636e-02f, -3.331231276e-02f, -1.773452848e-02f, +1.067805940e-02f, +3.974164106e-02f, +5.513168435e-02f, +4.885918772e-02f, +2.420689197e-02f, -6.312482782e-03f, -2.854621219e-02f, -3.463398879e-02f, -2.620740629e-02f, -1.149352756e-02f, +7.967077873e-04f, +6.300886015e-03f, +5.861100077e-03f, +3.004293539e-03f, +7.401826381e-04f, + -7.405661171e-05f, -9.252650505e-05f, -1.232095899e-05f, +1.811851882e-04f, +3.981871848e-04f, +4.695685371e-04f, +2.583542202e-04f, -2.129557746e-04f, -7.259688140e-04f, -9.755628138e-04f, -7.677963930e-04f, -1.675597955e-04f, +5.208122351e-04f, +9.379447391e-04f, +8.924973807e-04f, +4.669550271e-04f, -6.051154104e-05f, -4.091951571e-04f, -4.605305087e-04f, -2.893923386e-04f, -6.712220468e-05f, +7.017794291e-05f, +9.106986765e-05f, +4.712263144e-05f, + /* 3, 8 (24) */ + -4.761133239e-04f, -2.313262028e-03f, -5.581908853e-03f, -9.033335391e-03f, -9.672794117e-03f, -3.338209197e-03f, +1.367733977e-02f, +4.251221847e-02f, +8.016768649e-02f, +1.194869147e-01f, +1.510478232e-01f, +1.663779630e-01f, +1.611399249e-01f, +1.368302969e-01f, +1.001890958e-01f, +6.060045338e-02f, +2.669816253e-02f, +3.679225055e-03f, -7.644200437e-03f, -9.951893067e-03f, -7.432283053e-03f, -3.806512847e-03f, -1.200175488e-03f, -8.756422961e-05f, + +3.331912137e-05f, +8.119452490e-05f, +1.158955069e-04f, +8.505261935e-05f, -6.295450197e-05f, -3.447431114e-04f, -7.142981987e-04f, -1.061839975e-03f, -1.247846734e-03f, -1.161566456e-03f, -7.769277177e-04f, -1.760162742e-04f, +4.754222452e-04f, +9.916331371e-04f, +1.240042814e-03f, +1.189232016e-03f, +9.104701097e-04f, +5.358652772e-04f, +1.972783248e-04f, -2.329763868e-05f, -1.113538339e-04f, -1.042663492e-04f, -5.788982657e-05f, -1.602028222e-05f, + +1.761324802e-03f, +4.598153737e-03f, +6.641653984e-03f, +4.273691943e-03f, -5.032116266e-03f, -1.950160745e-02f, -3.207774214e-02f, -3.352526853e-02f, -1.846049729e-02f, +9.702496584e-03f, +3.897384466e-02f, +5.496412455e-02f, +4.937999995e-02f, +2.514483671e-02f, -5.419985402e-03f, -2.807925716e-02f, -3.469450033e-02f, -2.661660145e-02f, -1.195405807e-02f, +5.073154486e-04f, +6.233763811e-03f, +5.931278019e-03f, +3.095363407e-03f, +7.873052695e-04f, + -7.260306441e-05f, -9.315029562e-05f, -1.670849714e-05f, +1.740344774e-04f, +3.926646570e-04f, +4.712027976e-04f, +2.695464950e-04f, -1.960526557e-04f, -7.124068508e-04f, -9.742559428e-04f, -7.813026251e-04f, -1.896254575e-04f, +5.017650765e-04f, +9.316022141e-04f, +9.007708077e-04f, +4.834695166e-04f, -4.557378534e-05f, -4.027259288e-04f, -4.630752424e-04f, -2.964368879e-04f, -7.324415279e-05f, +6.776053655e-05f, +9.177845775e-05f, +4.875794816e-05f, + /* 3, 9 (24) */ + -4.427942025e-04f, -2.232067503e-03f, -5.466013346e-03f, -8.948282772e-03f, -9.735748619e-03f, -3.682952308e-03f, +1.296304157e-02f, +4.145037849e-02f, +7.891983976e-02f, +1.183253482e-01f, +1.502708955e-01f, +1.662019467e-01f, +1.616153472e-01f, +1.378219300e-01f, +1.014291386e-01f, +6.178968539e-02f, +2.760863264e-02f, +4.215090332e-03f, -7.446922112e-03f, -9.975190705e-03f, -7.543636887e-03f, -3.910779196e-03f, -1.258065314e-03f, -1.035845118e-04f, + +3.201678962e-05f, +7.966944564e-05f, +1.155000078e-04f, +8.757388061e-05f, -5.624924209e-05f, -3.341890411e-04f, -7.023827773e-04f, -1.052705362e-03f, -1.245748821e-03f, -1.168919517e-03f, -7.929131518e-04f, -1.965525135e-04f, +4.562111037e-04f, +9.790961562e-04f, +1.236932995e-03f, +1.194857373e-03f, +9.213830297e-04f, +5.476226379e-04f, +2.063259119e-04f, -1.849803145e-05f, -1.103216742e-04f, -1.053672132e-04f, -5.943645860e-05f, -1.701521163e-05f, + +1.688721738e-03f, +4.505003441e-03f, +6.624945487e-03f, +4.447726420e-03f, -4.639451609e-03f, -1.903040465e-02f, -3.180819564e-02f, -3.372132119e-02f, -1.917290414e-02f, +8.728240641e-03f, +3.819254204e-02f, +5.477449910e-02f, +4.988176503e-02f, +2.607643892e-02f, -4.519214594e-03f, -2.759578764e-02f, -3.474007411e-02f, -2.701932737e-02f, -1.241713331e-02f, +2.108785608e-04f, +6.160519658e-03f, +5.999038556e-03f, +3.187141865e-03f, +8.360632177e-04f, + -7.112261064e-05f, -9.367517274e-05f, -2.097506020e-05f, +1.669187426e-04f, +3.870033460e-04f, +4.725496714e-04f, +2.804632006e-04f, -1.792077627e-04f, -6.985872860e-04f, -9.724820624e-04f, -7.943976588e-04f, -2.115881394e-04f, +4.824479080e-04f, +9.247853271e-04f, +9.086490765e-04f, +4.998744954e-04f, -3.045361205e-05f, -3.959494315e-04f, -4.653897081e-04f, -3.034295771e-04f, -7.945595420e-05f, +6.522142408e-05f, +9.242048371e-05f, +5.039623831e-05f, + /* 3,10 (24) */ + -4.107774129e-04f, -2.152398058e-03f, -5.350513339e-03f, -8.860708891e-03f, -9.791997861e-03f, -4.017141350e-03f, +1.226065879e-02f, +4.039767313e-02f, +7.767409094e-02f, +1.171564287e-01f, +1.494779824e-01f, +1.660053942e-01f, +1.620715583e-01f, +1.388010262e-01f, +1.026660716e-01f, +6.298454277e-02f, +2.853001567e-02f, +4.762712970e-03f, -7.240596200e-03f, -9.993688737e-03f, -7.653958562e-03f, -4.016146410e-03f, -1.317501773e-03f, -1.205997235e-04f, + +3.073410572e-05f, +7.813486075e-05f, +1.150424160e-04f, +8.997914366e-05f, -4.968030480e-05f, -3.237287524e-04f, -6.904527520e-04f, -1.043414965e-03f, -1.243380221e-03f, -1.175971057e-03f, -8.086760026e-04f, -2.170317298e-04f, +4.368686841e-04f, +9.662916374e-04f, +1.233521370e-03f, +1.200251434e-03f, +9.321980153e-04f, +5.594160446e-04f, +2.154931235e-04f, -1.356404255e-05f, -1.091934511e-04f, -1.064291845e-04f, -6.098882748e-05f, -1.803376207e-05f, + +1.617599127e-03f, +4.411328268e-03f, +6.603970427e-03f, +4.614645163e-03f, -4.252448263e-03f, -1.855785498e-02f, -3.152773244e-02f, -3.390052895e-02f, -1.987149143e-02f, +7.755758579e-03f, +3.739814438e-02f, +5.456291096e-02f, +5.036421294e-02f, +2.700122425e-02f, -3.610565517e-03f, -2.709591315e-02f, -3.477052773e-02f, -2.741527681e-02f, -1.288252302e-02f, -9.255101630e-05f, +6.081063704e-03f, +6.064259980e-03f, +3.279562349e-03f, +8.864594560e-04f, + -6.961746379e-05f, -9.410304080e-05f, -2.511985993e-05f, +1.598423714e-04f, +3.812090587e-04f, +4.736119604e-04f, +2.911007126e-04f, -1.624303064e-04f, -6.845194958e-04f, -9.702441724e-04f, -8.070753387e-04f, -2.334359524e-04f, +4.628708924e-04f, +9.174962798e-04f, +9.161257322e-04f, +5.161598063e-04f, -1.515822609e-05f, -3.888662781e-04f, -4.674692186e-04f, -3.103647537e-04f, -8.575472369e-05f, +6.255996215e-05f, +9.299361279e-05f, +5.203577121e-05f, + /* 3,11 (24) */ + -3.800433072e-04f, -2.074263197e-03f, -5.235470923e-03f, -8.770729748e-03f, -9.841678166e-03f, -4.340870102e-03f, +1.157020604e-02f, +3.935425817e-02f, +7.643071072e-02f, +1.159804577e-01f, +1.486693064e-01f, +1.657883625e-01f, +1.625084270e-01f, +1.397673178e-01f, +1.038995930e-01f, +6.418479420e-02f, +2.946221369e-02f, +5.322129014e-03f, -7.025103077e-03f, -1.000725278e-02f, -7.763152013e-03f, -4.122575594e-03f, -1.378490601e-03f, -1.386334855e-04f, + +2.947152747e-05f, +7.659209903e-05f, +1.145245570e-04f, +9.226977516e-05f, -4.324790277e-05f, -3.133646471e-04f, -6.785122664e-04f, -1.033973138e-03f, -1.240743497e-03f, -1.182720392e-03f, -8.242122456e-04f, -2.374480061e-04f, +4.174004428e-04f, +9.532224458e-04f, +1.229807311e-03f, +1.205410740e-03f, +9.429105634e-04f, +5.712418783e-04f, +2.247783902e-04f, -8.495178141e-06f, -1.079674899e-04f, -1.074505383e-04f, -6.254592231e-05f, -1.907577351e-05f, + +1.547981663e-03f, +4.317225227e-03f, +6.578850567e-03f, +4.774487534e-03f, -3.871239204e-03f, -1.808424302e-02f, -3.123663173e-02f, -3.406295926e-02f, -2.055601093e-02f, +6.785514407e-03f, +3.659106904e-02f, +5.432947500e-02f, +5.082708383e-02f, +2.791872053e-02f, -2.694439785e-03f, -2.657975334e-02f, -3.478568595e-02f, -2.780414308e-02f, -1.334999224e-02f, -4.029157700e-04f, +5.995308980e-03f, +6.126819942e-03f, +3.372555961e-03f, +9.384952272e-04f, + -6.808981202e-05f, -9.443585119e-05f, -2.914221957e-05f, +1.528096552e-04f, +3.752876194e-04f, +4.743926272e-04f, +3.014556219e-04f, -1.457293867e-04f, -6.702129574e-04f, -9.675455443e-04f, -8.193297752e-04f, -2.551570831e-04f, +4.430443616e-04f, +9.097375674e-04f, +9.231945381e-04f, +5.323153022e-04f, +3.049954096e-07f, -3.814772927e-04f, -4.693091933e-04f, -3.172367269e-04f, -9.213746067e-05f, +5.977559862e-05f, +9.349552672e-05f, +5.367477390e-05f, + /* 3,12 (24) */ + -3.505717797e-04f, -1.997671098e-03f, -5.120946366e-03f, -8.678459973e-03f, -9.884926069e-03f, -4.654234749e-03f, +1.089169377e-02f, +3.832028503e-02f, +7.518996722e-02f, +1.147977373e-01f, +1.478450941e-01f, +1.655509145e-01f, +1.629258274e-01f, +1.407205403e-01f, +1.051294003e-01f, +6.539020494e-02f, +3.040512425e-02f, +5.893370893e-03f, -6.800324687e-03f, -1.001574796e-02f, -7.871119503e-03f, -4.230026132e-03f, -1.441036523e-03f, -1.577092590e-04f, + +2.822948635e-05f, +7.504246434e-05f, +1.139482527e-04f, +9.444717383e-05f, -3.695218563e-05f, -3.030990593e-04f, -6.665654277e-04f, -1.024384255e-03f, -1.237841299e-03f, -1.189166949e-03f, -8.395179455e-04f, -2.577954513e-04f, +3.978118871e-04f, +9.398915490e-04f, +1.225790291e-03f, +1.210331898e-03f, +9.535161724e-04f, +5.830964695e-04f, +2.341800727e-04f, -3.290998695e-06f, -1.066421355e-04f, -1.084295370e-04f, -6.410670458e-05f, -2.014106283e-05f, + +1.479891851e-03f, +4.222789376e-03f, +6.549708347e-03f, +4.927297190e-03f, -3.495951585e-03f, -1.760985039e-02f, -3.093517611e-02f, -3.420868864e-02f, -2.122622388e-02f, +5.817968862e-03f, +3.577173927e-02f, +5.407431792e-02f, +5.127012819e-02f, +2.882845810e-02f, -1.771245247e-03f, -2.604743804e-02f, -3.478538096e-02f, -2.818562038e-02f, -1.381930143e-02f, -7.201524968e-04f, +5.903171519e-03f, +6.186595541e-03f, +3.466051488e-03f, +9.921700011e-04f, + -6.654181667e-05f, -9.467559976e-05f, -3.304157275e-05f, +1.458247867e-04f, +3.692448657e-04f, +4.748947917e-04f, +3.115247356e-04f, -1.291139872e-04f, -6.556772422e-04f, -9.643897178e-04f, -8.311553482e-04f, -2.767398011e-04f, +4.229788096e-04f, +9.015119779e-04f, +9.298494802e-04f, +5.483308534e-04f, +1.592850708e-05f, -3.737835110e-04f, -4.709051630e-04f, -3.240397715e-04f, -9.860105002e-05f, +5.686787454e-05f, +9.392392406e-05f, +5.531143209e-05f, + /* 3,13 (24) */ + -3.223422934e-04f, -1.922628634e-03f, -5.006998113e-03f, -8.584012799e-03f, -9.921878255e-03f, -4.957333808e-03f, +1.022512834e-02f, +3.729590077e-02f, +7.395212592e-02f, +1.136085703e-01f, +1.470055762e-01f, +1.652931190e-01f, +1.633236393e-01f, +1.416604318e-01f, +1.063551906e-01f, +6.660053684e-02f, +3.135864042e-02f, +6.476467362e-03f, -6.566144614e-03f, -1.001903896e-02f, -7.977761638e-03f, -4.338455669e-03f, -1.505143227e-03f, -1.778503219e-04f, + +2.700838771e-05f, +7.348723518e-05f, +1.133153205e-04f, +9.651276932e-05f, -3.079324068e-05f, -2.929342549e-04f, -6.546163060e-04f, -1.014652716e-03f, -1.234676357e-03f, -1.195310268e-03f, -8.545892583e-04f, -2.780682019e-04f, +3.781085727e-04f, +9.263020168e-04f, +1.221469894e-03f, +1.215011582e-03f, +9.640103445e-04f, +5.949760984e-04f, +2.436964612e-04f, +2.048880094e-06f, -1.052157528e-04f, -1.093644307e-04f, -6.567010828e-05f, -2.122942351e-05f, + +1.413350034e-03f, +4.128113776e-03f, +6.516666774e-03f, +5.073121976e-03f, -3.126706719e-03f, -1.713495560e-02f, -3.062365137e-02f, -3.433780263e-02f, -2.188190113e-02f, +4.853579145e-03f, +3.494058392e-02f, +5.379757812e-02f, +5.169310700e-02f, +2.972997008e-02f, -8.413957668e-04f, -2.549910718e-02f, -3.476945245e-02f, -2.855940389e-02f, -1.429020659e-02f, -1.044192268e-03f, +5.804570469e-03f, +6.243463415e-03f, +3.559975412e-03f, +1.047481433e-03f, + -6.497561062e-05f, -9.482432426e-05f, -3.681746224e-05f, +1.388918578e-04f, +3.630866432e-04f, +4.751217272e-04f, +3.213050770e-04f, -1.125929696e-04f, -6.409220088e-04f, -9.607804978e-04f, -8.425467097e-04f, -2.981724664e-04f, +4.026848863e-04f, +8.928225909e-04f, +9.360847722e-04f, +5.641963547e-04f, +3.170459927e-05f, -3.657861821e-04f, -4.722527742e-04f, -3.307681324e-04f, -1.051422630e-04f, +5.383642604e-05f, +9.427652269e-05f, +5.694389116e-05f, + /* 3,14 (24) */ + -2.953339057e-04f, -1.849141399e-03f, -4.893682792e-03f, -8.487500029e-03f, -9.952671495e-03f, -5.250268063e-03f, +9.570512039e-03f, +3.628124806e-02f, +7.271744956e-02f, +1.124132600e-01f, +1.461509869e-01f, +1.650150508e-01f, +1.637017479e-01f, +1.425867338e-01f, +1.075766605e-01f, +6.781554842e-02f, +3.232265077e-02f, +7.071443461e-03f, -6.322448153e-03f, -1.001699008e-02f, -8.082977391e-03f, -4.447820100e-03f, -1.570813336e-03f, -1.990797454e-04f, + +2.580861103e-05f, +7.192766441e-05f, +1.126275727e-04f, +9.846802098e-05f, -2.477109356e-05f, -2.828724308e-04f, -6.426689324e-04f, -1.004782937e-03f, -1.231251482e-03f, -1.201149997e-03f, -8.694224322e-04f, -2.982604250e-04f, +3.582961021e-04f, +9.124570196e-04f, +1.216845811e-03f, +1.219446534e-03f, +9.743885871e-04f, +6.068769973e-04f, +2.533257760e-04f, +7.524786438e-06f, -1.036867286e-04f, -1.102534579e-04f, -6.723504006e-05f, -2.234062528e-05f, + +1.348374424e-03f, +4.033289452e-03f, +6.479849312e-03f, +5.212013834e-03f, -2.763620076e-03f, -1.665983388e-02f, -3.030234629e-02f, -3.445039560e-02f, -2.252282313e-02f, +3.892798647e-03f, +3.409803721e-02f, +5.349940565e-02f, +5.209579189e-02f, +3.062279267e-02f, +9.468900538e-05f, -2.493491083e-02f, -3.473774785e-02f, -2.892519007e-02f, -1.476245937e-02f, -1.374960401e-03f, +5.699428206e-03f, +6.297299841e-03f, +3.654251935e-03f, +1.104425324e-03f, + -6.339329680e-05f, -9.488410187e-05f, -4.046953872e-05f, +1.320148582e-04f, +3.568188019e-04f, +4.750768565e-04f, +3.307938859e-04f, -9.617506873e-05f, -6.259569963e-04f, -9.567219509e-04f, -8.534987871e-04f, -3.194435369e-04f, +3.821733903e-04f, +8.836727763e-04f, +9.418948604e-04f, +5.799017319e-04f, +4.762540224e-05f, -3.574867691e-04f, -4.733477932e-04f, -3.374160279e-04f, -1.117577581e-04f, +5.068098615e-05f, +9.455106226e-05f, +5.857025732e-05f, + /* 3,15 (24) */ + -2.695252946e-04f, -1.777213734e-03f, -4.781055220e-03f, -8.389032008e-03f, -9.977442589e-03f, -5.533140494e-03f, +8.927843106e-03f, +3.527646512e-02f, +7.148619808e-02f, +1.112121100e-01f, +1.452815645e-01f, +1.647167904e-01f, +1.640600440e-01f, +1.434991908e-01f, +1.087935063e-01f, +6.903499495e-02f, +3.329703935e-02f, +7.678320458e-03f, -6.069122377e-03f, -1.000946529e-02f, -8.186664119e-03f, -4.558073558e-03f, -1.638048376e-03f, -2.214203707e-04f, + +2.463051020e-05f, +7.036497893e-05f, +1.118868151e-04f, +1.003144168e-04f, -1.888570902e-05f, -2.729157153e-04f, -6.307272977e-04f, -9.947793529e-04f, -1.227569562e-03f, -1.206685899e-03f, -8.840138096e-04f, -3.183663200e-04f, +3.383801218e-04f, +8.983598275e-04f, +1.211917843e-03f, +1.223633566e-03f, +9.846464151e-04f, +6.187953507e-04f, +2.630661673e-04f, +1.313699159e-05f, -1.020534721e-04f, -1.110948466e-04f, -6.880037942e-05f, -2.347441378e-05f, + +1.284981127e-03f, +3.938405350e-03f, +6.439379774e-03f, +5.344028692e-03f, -2.406801274e-03f, -1.618475702e-02f, -2.997155241e-02f, -3.454657067e-02f, -2.314878013e-02f, +2.936076696e-03f, +3.324453842e-02f, +5.317996212e-02f, +5.247796528e-02f, +3.150646544e-02f, +1.036583866e-03f, -2.435500910e-02f, -3.469012245e-02f, -2.928267684e-02f, -1.523580716e-02f, -1.712376429e-03f, +5.587670448e-03f, +6.347980828e-03f, +3.748802997e-03f, +1.162995582e-03f, + -6.179694664e-05f, -9.485704656e-05f, -4.399755940e-05f, +1.251976733e-04f, +3.504471909e-04f, +4.747637479e-04f, +3.399886191e-04f, -7.986888717e-05f, -6.107920170e-04f, -9.522184016e-04f, -8.640067861e-04f, -3.405415765e-04f, +3.614552619e-04f, +8.740661928e-04f, +9.472744285e-04f, +5.954369495e-04f, +6.368289049e-05f, -3.488869502e-04f, -4.741861112e-04f, -3.439776545e-04f, -1.184440826e-04f, +4.740138658e-05f, +9.474530667e-05f, +6.018859872e-05f, + /* 3,16 (24) */ + -2.448947844e-04f, -1.706848755e-03f, -4.669168405e-03f, -8.288717592e-03f, -9.996328298e-03f, -5.806056209e-03f, +8.297115809e-03f, +3.428168577e-02f, +7.025862852e-02f, +1.100054241e-01f, +1.443975507e-01f, +1.643984241e-01f, +1.643984241e-01f, +1.443975507e-01f, +1.100054241e-01f, +7.025862852e-02f, +3.428168577e-02f, +8.297115809e-03f, -5.806056209e-03f, -9.996328298e-03f, -8.288717592e-03f, -4.669168405e-03f, -1.706848755e-03f, -2.448947844e-04f, + +2.347441378e-05f, +6.880037942e-05f, +1.110948466e-04f, +1.020534721e-04f, -1.313699159e-05f, -2.630661673e-04f, -6.187953507e-04f, -9.846464151e-04f, -1.223633566e-03f, -1.211917843e-03f, -8.983598275e-04f, -3.383801218e-04f, +3.183663200e-04f, +8.840138096e-04f, +1.206685899e-03f, +1.227569562e-03f, +9.947793529e-04f, +6.307272977e-04f, +2.729157153e-04f, +1.888570902e-05f, -1.003144168e-04f, -1.118868151e-04f, -7.036497893e-05f, -2.463051020e-05f, + +1.223184180e-03f, +3.843548304e-03f, +6.395382214e-03f, +5.469226366e-03f, -2.056354083e-03f, -1.570999327e-02f, -2.963156379e-02f, -3.462643956e-02f, -2.375957215e-02f, +1.983858294e-03f, +3.238053164e-02f, +5.283942054e-02f, +5.283942054e-02f, +3.238053164e-02f, +1.983858294e-03f, -2.375957215e-02f, -3.462643956e-02f, -2.963156379e-02f, -1.570999327e-02f, -2.056354083e-03f, +5.469226366e-03f, +6.395382214e-03f, +3.843548304e-03f, +1.223184180e-03f, + -6.018859872e-05f, -9.474530667e-05f, -4.740138658e-05f, +1.184440826e-04f, +3.439776545e-04f, +4.741861112e-04f, +3.488869502e-04f, -6.368289049e-05f, -5.954369495e-04f, -9.472744285e-04f, -8.740661928e-04f, -3.614552619e-04f, +3.405415765e-04f, +8.640067861e-04f, +9.522184016e-04f, +6.107920170e-04f, +7.986888717e-05f, -3.399886191e-04f, -4.747637479e-04f, -3.504471909e-04f, -1.251976733e-04f, +4.399755940e-05f, +9.485704656e-05f, +6.179694664e-05f, + /* 3,17 (24) */ + -2.214203707e-04f, -1.638048376e-03f, -4.558073558e-03f, -8.186664119e-03f, -1.000946529e-02f, -6.069122377e-03f, +7.678320458e-03f, +3.329703935e-02f, +6.903499495e-02f, +1.087935063e-01f, +1.434991908e-01f, +1.640600440e-01f, +1.647167904e-01f, +1.452815645e-01f, +1.112121100e-01f, +7.148619808e-02f, +3.527646512e-02f, +8.927843106e-03f, -5.533140494e-03f, -9.977442589e-03f, -8.389032008e-03f, -4.781055220e-03f, -1.777213734e-03f, -2.695252946e-04f, + +2.234062528e-05f, +6.723504006e-05f, +1.102534579e-04f, +1.036867286e-04f, -7.524786438e-06f, -2.533257760e-04f, -6.068769973e-04f, -9.743885871e-04f, -1.219446534e-03f, -1.216845811e-03f, -9.124570196e-04f, -3.582961021e-04f, +2.982604250e-04f, +8.694224322e-04f, +1.201149997e-03f, +1.231251482e-03f, +1.004782937e-03f, +6.426689324e-04f, +2.828724308e-04f, +2.477109356e-05f, -9.846802098e-05f, -1.126275727e-04f, -7.192766441e-05f, -2.580861103e-05f, + +1.162995582e-03f, +3.748802997e-03f, +6.347980828e-03f, +5.587670448e-03f, -1.712376429e-03f, -1.523580716e-02f, -2.928267684e-02f, -3.469012245e-02f, -2.435500910e-02f, +1.036583866e-03f, +3.150646544e-02f, +5.247796528e-02f, +5.317996212e-02f, +3.324453842e-02f, +2.936076696e-03f, -2.314878013e-02f, -3.454657067e-02f, -2.997155241e-02f, -1.618475702e-02f, -2.406801274e-03f, +5.344028692e-03f, +6.439379774e-03f, +3.938405350e-03f, +1.284981127e-03f, + -5.857025732e-05f, -9.455106226e-05f, -5.068098615e-05f, +1.117577581e-04f, +3.374160279e-04f, +4.733477932e-04f, +3.574867691e-04f, -4.762540224e-05f, -5.799017319e-04f, -9.418948604e-04f, -8.836727763e-04f, -3.821733903e-04f, +3.194435369e-04f, +8.534987871e-04f, +9.567219509e-04f, +6.259569963e-04f, +9.617506873e-05f, -3.307938859e-04f, -4.750768565e-04f, -3.568188019e-04f, -1.320148582e-04f, +4.046953872e-05f, +9.488410187e-05f, +6.339329680e-05f, + /* 3,18 (24) */ + -1.990797454e-04f, -1.570813336e-03f, -4.447820100e-03f, -8.082977391e-03f, -1.001699008e-02f, -6.322448153e-03f, +7.071443461e-03f, +3.232265077e-02f, +6.781554842e-02f, +1.075766605e-01f, +1.425867338e-01f, +1.637017479e-01f, +1.650150508e-01f, +1.461509869e-01f, +1.124132600e-01f, +7.271744956e-02f, +3.628124806e-02f, +9.570512039e-03f, -5.250268063e-03f, -9.952671495e-03f, -8.487500029e-03f, -4.893682792e-03f, -1.849141399e-03f, -2.953339057e-04f, + +2.122942351e-05f, +6.567010828e-05f, +1.093644307e-04f, +1.052157528e-04f, -2.048880094e-06f, -2.436964612e-04f, -5.949760984e-04f, -9.640103445e-04f, -1.215011582e-03f, -1.221469894e-03f, -9.263020168e-04f, -3.781085727e-04f, +2.780682019e-04f, +8.545892583e-04f, +1.195310268e-03f, +1.234676357e-03f, +1.014652716e-03f, +6.546163060e-04f, +2.929342549e-04f, +3.079324068e-05f, -9.651276932e-05f, -1.133153205e-04f, -7.348723518e-05f, -2.700838771e-05f, + +1.104425324e-03f, +3.654251935e-03f, +6.297299841e-03f, +5.699428206e-03f, -1.374960401e-03f, -1.476245937e-02f, -2.892519007e-02f, -3.473774785e-02f, -2.493491083e-02f, +9.468900538e-05f, +3.062279267e-02f, +5.209579189e-02f, +5.349940565e-02f, +3.409803721e-02f, +3.892798647e-03f, -2.252282313e-02f, -3.445039560e-02f, -3.030234629e-02f, -1.665983388e-02f, -2.763620076e-03f, +5.212013834e-03f, +6.479849312e-03f, +4.033289452e-03f, +1.348374424e-03f, + -5.694389116e-05f, -9.427652269e-05f, -5.383642604e-05f, +1.051422630e-04f, +3.307681324e-04f, +4.722527742e-04f, +3.657861821e-04f, -3.170459927e-05f, -5.641963547e-04f, -9.360847722e-04f, -8.928225909e-04f, -4.026848863e-04f, +2.981724664e-04f, +8.425467097e-04f, +9.607804978e-04f, +6.409220088e-04f, +1.125929696e-04f, -3.213050770e-04f, -4.751217272e-04f, -3.630866432e-04f, -1.388918578e-04f, +3.681746224e-05f, +9.482432426e-05f, +6.497561062e-05f, + /* 3,19 (24) */ + -1.778503219e-04f, -1.505143227e-03f, -4.338455669e-03f, -7.977761638e-03f, -1.001903896e-02f, -6.566144614e-03f, +6.476467362e-03f, +3.135864042e-02f, +6.660053684e-02f, +1.063551906e-01f, +1.416604318e-01f, +1.633236393e-01f, +1.652931190e-01f, +1.470055762e-01f, +1.136085703e-01f, +7.395212592e-02f, +3.729590077e-02f, +1.022512834e-02f, -4.957333808e-03f, -9.921878255e-03f, -8.584012799e-03f, -5.006998113e-03f, -1.922628634e-03f, -3.223422934e-04f, + +2.014106283e-05f, +6.410670458e-05f, +1.084295370e-04f, +1.066421355e-04f, +3.290998695e-06f, -2.341800727e-04f, -5.830964695e-04f, -9.535161724e-04f, -1.210331898e-03f, -1.225790291e-03f, -9.398915490e-04f, -3.978118871e-04f, +2.577954513e-04f, +8.395179455e-04f, +1.189166949e-03f, +1.237841299e-03f, +1.024384255e-03f, +6.665654277e-04f, +3.030990593e-04f, +3.695218563e-05f, -9.444717383e-05f, -1.139482527e-04f, -7.504246434e-05f, -2.822948635e-05f, + +1.047481433e-03f, +3.559975412e-03f, +6.243463415e-03f, +5.804570469e-03f, -1.044192268e-03f, -1.429020659e-02f, -2.855940389e-02f, -3.476945245e-02f, -2.549910718e-02f, -8.413957668e-04f, +2.972997008e-02f, +5.169310700e-02f, +5.379757812e-02f, +3.494058392e-02f, +4.853579145e-03f, -2.188190113e-02f, -3.433780263e-02f, -3.062365137e-02f, -1.713495560e-02f, -3.126706719e-03f, +5.073121976e-03f, +6.516666774e-03f, +4.128113776e-03f, +1.413350034e-03f, + -5.531143209e-05f, -9.392392406e-05f, -5.686787454e-05f, +9.860105002e-05f, +3.240397715e-04f, +4.709051630e-04f, +3.737835110e-04f, -1.592850708e-05f, -5.483308534e-04f, -9.298494802e-04f, -9.015119779e-04f, -4.229788096e-04f, +2.767398011e-04f, +8.311553482e-04f, +9.643897178e-04f, +6.556772422e-04f, +1.291139872e-04f, -3.115247356e-04f, -4.748947917e-04f, -3.692448657e-04f, -1.458247867e-04f, +3.304157275e-05f, +9.467559976e-05f, +6.654181667e-05f, + /* 3,20 (24) */ + -1.577092590e-04f, -1.441036523e-03f, -4.230026132e-03f, -7.871119503e-03f, -1.001574796e-02f, -6.800324687e-03f, +5.893370893e-03f, +3.040512425e-02f, +6.539020494e-02f, +1.051294003e-01f, +1.407205403e-01f, +1.629258274e-01f, +1.655509145e-01f, +1.478450941e-01f, +1.147977373e-01f, +7.518996722e-02f, +3.832028503e-02f, +1.089169377e-02f, -4.654234749e-03f, -9.884926069e-03f, -8.678459973e-03f, -5.120946366e-03f, -1.997671098e-03f, -3.505717797e-04f, + +1.907577351e-05f, +6.254592231e-05f, +1.074505383e-04f, +1.079674899e-04f, +8.495178141e-06f, -2.247783902e-04f, -5.712418783e-04f, -9.429105634e-04f, -1.205410740e-03f, -1.229807311e-03f, -9.532224458e-04f, -4.174004428e-04f, +2.374480061e-04f, +8.242122456e-04f, +1.182720392e-03f, +1.240743497e-03f, +1.033973138e-03f, +6.785122664e-04f, +3.133646471e-04f, +4.324790277e-05f, -9.226977516e-05f, -1.145245570e-04f, -7.659209903e-05f, -2.947152747e-05f, + +9.921700011e-04f, +3.466051488e-03f, +6.186595541e-03f, +5.903171519e-03f, -7.201524968e-04f, -1.381930143e-02f, -2.818562038e-02f, -3.478538096e-02f, -2.604743804e-02f, -1.771245247e-03f, +2.882845810e-02f, +5.127012819e-02f, +5.407431792e-02f, +3.577173927e-02f, +5.817968862e-03f, -2.122622388e-02f, -3.420868864e-02f, -3.093517611e-02f, -1.760985039e-02f, -3.495951585e-03f, +4.927297190e-03f, +6.549708347e-03f, +4.222789376e-03f, +1.479891851e-03f, + -5.367477390e-05f, -9.349552672e-05f, -5.977559862e-05f, +9.213746067e-05f, +3.172367269e-04f, +4.693091933e-04f, +3.814772927e-04f, -3.049954096e-07f, -5.323153022e-04f, -9.231945381e-04f, -9.097375674e-04f, -4.430443616e-04f, +2.551570831e-04f, +8.193297752e-04f, +9.675455443e-04f, +6.702129574e-04f, +1.457293867e-04f, -3.014556219e-04f, -4.743926272e-04f, -3.752876194e-04f, -1.528096552e-04f, +2.914221957e-05f, +9.443585119e-05f, +6.808981202e-05f, + /* 3,21 (24) */ + -1.386334855e-04f, -1.378490601e-03f, -4.122575594e-03f, -7.763152013e-03f, -1.000725278e-02f, -7.025103077e-03f, +5.322129014e-03f, +2.946221369e-02f, +6.418479420e-02f, +1.038995930e-01f, +1.397673178e-01f, +1.625084270e-01f, +1.657883625e-01f, +1.486693064e-01f, +1.159804577e-01f, +7.643071072e-02f, +3.935425817e-02f, +1.157020604e-02f, -4.340870102e-03f, -9.841678166e-03f, -8.770729748e-03f, -5.235470923e-03f, -2.074263197e-03f, -3.800433072e-04f, + +1.803376207e-05f, +6.098882748e-05f, +1.064291845e-04f, +1.091934511e-04f, +1.356404255e-05f, -2.154931235e-04f, -5.594160446e-04f, -9.321980153e-04f, -1.200251434e-03f, -1.233521370e-03f, -9.662916374e-04f, -4.368686841e-04f, +2.170317298e-04f, +8.086760026e-04f, +1.175971057e-03f, +1.243380221e-03f, +1.043414965e-03f, +6.904527520e-04f, +3.237287524e-04f, +4.968030480e-05f, -8.997914366e-05f, -1.150424160e-04f, -7.813486075e-05f, -3.073410572e-05f, + +9.384952272e-04f, +3.372555961e-03f, +6.126819942e-03f, +5.995308980e-03f, -4.029157700e-04f, -1.334999224e-02f, -2.780414308e-02f, -3.478568595e-02f, -2.657975334e-02f, -2.694439785e-03f, +2.791872053e-02f, +5.082708383e-02f, +5.432947500e-02f, +3.659106904e-02f, +6.785514407e-03f, -2.055601093e-02f, -3.406295926e-02f, -3.123663173e-02f, -1.808424302e-02f, -3.871239204e-03f, +4.774487534e-03f, +6.578850567e-03f, +4.317225227e-03f, +1.547981663e-03f, + -5.203577121e-05f, -9.299361279e-05f, -6.255996215e-05f, +8.575472369e-05f, +3.103647537e-04f, +4.674692186e-04f, +3.888662781e-04f, +1.515822609e-05f, -5.161598063e-04f, -9.161257322e-04f, -9.174962798e-04f, -4.628708924e-04f, +2.334359524e-04f, +8.070753387e-04f, +9.702441724e-04f, +6.845194958e-04f, +1.624303064e-04f, -2.911007126e-04f, -4.736119604e-04f, -3.812090587e-04f, -1.598423714e-04f, +2.511985993e-05f, +9.410304080e-05f, +6.961746379e-05f, + /* 3,22 (24) */ + -1.205997235e-04f, -1.317501773e-03f, -4.016146410e-03f, -7.653958562e-03f, -9.993688737e-03f, -7.240596200e-03f, +4.762712970e-03f, +2.853001567e-02f, +6.298454277e-02f, +1.026660716e-01f, +1.388010262e-01f, +1.620715583e-01f, +1.660053942e-01f, +1.494779824e-01f, +1.171564287e-01f, +7.767409094e-02f, +4.039767313e-02f, +1.226065879e-02f, -4.017141350e-03f, -9.791997861e-03f, -8.860708891e-03f, -5.350513339e-03f, -2.152398058e-03f, -4.107774129e-04f, + +1.701521163e-05f, +5.943645860e-05f, +1.053672132e-04f, +1.103216742e-04f, +1.849803145e-05f, -2.063259119e-04f, -5.476226379e-04f, -9.213830297e-04f, -1.194857373e-03f, -1.236932995e-03f, -9.790961562e-04f, -4.562111037e-04f, +1.965525135e-04f, +7.929131518e-04f, +1.168919517e-03f, +1.245748821e-03f, +1.052705362e-03f, +7.023827773e-04f, +3.341890411e-04f, +5.624924209e-05f, -8.757388061e-05f, -1.155000078e-04f, -7.966944564e-05f, -3.201678962e-05f, + +8.864594560e-04f, +3.279562349e-03f, +6.064259980e-03f, +6.081063704e-03f, -9.255101630e-05f, -1.288252302e-02f, -2.741527681e-02f, -3.477052773e-02f, -2.709591315e-02f, -3.610565517e-03f, +2.700122425e-02f, +5.036421294e-02f, +5.456291096e-02f, +3.739814438e-02f, +7.755758579e-03f, -1.987149143e-02f, -3.390052895e-02f, -3.152773244e-02f, -1.855785498e-02f, -4.252448263e-03f, +4.614645163e-03f, +6.603970427e-03f, +4.411328268e-03f, +1.617599127e-03f, + -5.039623831e-05f, -9.242048371e-05f, -6.522142408e-05f, +7.945595420e-05f, +3.034295771e-04f, +4.653897081e-04f, +3.959494315e-04f, +3.045361205e-05f, -4.998744954e-04f, -9.086490765e-04f, -9.247853271e-04f, -4.824479080e-04f, +2.115881394e-04f, +7.943976588e-04f, +9.724820624e-04f, +6.985872860e-04f, +1.792077627e-04f, -2.804632006e-04f, -4.725496714e-04f, -3.870033460e-04f, -1.669187426e-04f, +2.097506020e-05f, +9.367517274e-05f, +7.112261064e-05f, + /* 3,23 (24) */ + -1.035845118e-04f, -1.258065314e-03f, -3.910779196e-03f, -7.543636887e-03f, -9.975190705e-03f, -7.446922112e-03f, +4.215090332e-03f, +2.760863264e-02f, +6.178968539e-02f, +1.014291386e-01f, +1.378219300e-01f, +1.616153472e-01f, +1.662019467e-01f, +1.502708955e-01f, +1.183253482e-01f, +7.891983976e-02f, +4.145037849e-02f, +1.296304157e-02f, -3.682952308e-03f, -9.735748619e-03f, -8.948282772e-03f, -5.466013346e-03f, -2.232067503e-03f, -4.427942025e-04f, + +1.602028222e-05f, +5.788982657e-05f, +1.042663492e-04f, +1.113538339e-04f, +2.329763868e-05f, -1.972783248e-04f, -5.358652772e-04f, -9.104701097e-04f, -1.189232016e-03f, -1.240042814e-03f, -9.916331371e-04f, -4.754222452e-04f, +1.760162742e-04f, +7.769277177e-04f, +1.161566456e-03f, +1.247846734e-03f, +1.061839975e-03f, +7.142981987e-04f, +3.447431114e-04f, +6.295450197e-05f, -8.505261935e-05f, -1.158955069e-04f, -8.119452490e-05f, -3.331912137e-05f, + +8.360632177e-04f, +3.187141865e-03f, +5.999038556e-03f, +6.160519658e-03f, +2.108785608e-04f, -1.241713331e-02f, -2.701932737e-02f, -3.474007411e-02f, -2.759578764e-02f, -4.519214594e-03f, +2.607643892e-02f, +4.988176503e-02f, +5.477449910e-02f, +3.819254204e-02f, +8.728240641e-03f, -1.917290414e-02f, -3.372132119e-02f, -3.180819564e-02f, -1.903040465e-02f, -4.639451609e-03f, +4.447726420e-03f, +6.624945487e-03f, +4.505003441e-03f, +1.688721738e-03f, + -4.875794816e-05f, -9.177845775e-05f, -6.776053655e-05f, +7.324415279e-05f, +2.964368879e-04f, +4.630752424e-04f, +4.027259288e-04f, +4.557378534e-05f, -4.834695166e-04f, -9.007708077e-04f, -9.316022141e-04f, -5.017650765e-04f, +1.896254575e-04f, +7.813026251e-04f, +9.742559428e-04f, +7.124068508e-04f, +1.960526557e-04f, -2.695464950e-04f, -4.712027976e-04f, -3.926646570e-04f, -1.740344774e-04f, +1.670849714e-05f, +9.315029562e-05f, +7.260306441e-05f, + /* 3,24 (24) */ + -8.756422961e-05f, -1.200175488e-03f, -3.806512847e-03f, -7.432283053e-03f, -9.951893067e-03f, -7.644200437e-03f, +3.679225055e-03f, +2.669816253e-02f, +6.060045338e-02f, +1.001890958e-01f, +1.368302969e-01f, +1.611399249e-01f, +1.663779630e-01f, +1.510478232e-01f, +1.194869147e-01f, +8.016768649e-02f, +4.251221847e-02f, +1.367733977e-02f, -3.338209197e-03f, -9.672794117e-03f, -9.033335391e-03f, -5.581908853e-03f, -2.313262028e-03f, -4.761133239e-04f, + +1.504911122e-05f, +5.634991455e-05f, +1.031283033e-04f, +1.122916229e-04f, +2.796341146e-05f, -1.883518612e-04f, -5.241475292e-04f, -8.994637579e-04f, -1.183378883e-03f, -1.242851567e-03f, -1.003899819e-03f, -4.944967052e-04f, +1.554289519e-04f, +7.607238135e-04f, +1.153912669e-03f, +1.249671477e-03f, +1.070814478e-03f, +7.261948385e-04f, +3.553884937e-04f, +6.979580815e-05f, -8.241402644e-05f, -1.162270856e-04f, -8.270874508e-05f, -3.464061654e-05f, + +7.873052695e-04f, +3.095363407e-03f, +5.931278019e-03f, +6.233763811e-03f, +5.073154486e-04f, -1.195405807e-02f, -2.661660145e-02f, -3.469450033e-02f, -2.807925716e-02f, -5.419985402e-03f, +2.514483671e-02f, +4.937999995e-02f, +5.496412455e-02f, +3.897384466e-02f, +9.702496584e-03f, -1.846049729e-02f, -3.352526853e-02f, -3.207774214e-02f, -1.950160745e-02f, -5.032116266e-03f, +4.273691943e-03f, +6.641653984e-03f, +4.598153737e-03f, +1.761324802e-03f, + -4.712263144e-05f, -9.106986765e-05f, -7.017794291e-05f, +6.712220468e-05f, +2.893923386e-04f, +4.605305087e-04f, +4.091951571e-04f, +6.051154104e-05f, -4.669550271e-04f, -8.924973807e-04f, -9.379447391e-04f, -5.208122351e-04f, +1.675597955e-04f, +7.677963930e-04f, +9.755628138e-04f, +7.259688140e-04f, +2.129557746e-04f, -2.583542202e-04f, -4.695685371e-04f, -3.981871848e-04f, -1.811851882e-04f, +1.232095899e-05f, +9.252650505e-05f, +7.405661171e-05f, + /* 3,25 (24) */ + -7.251511839e-05f, -1.143825573e-03f, -3.703384544e-03f, -7.319991431e-03f, -9.923929655e-03f, -7.832552298e-03f, +3.155077526e-03f, +2.579869877e-02f, +5.941707449e-02f, +9.894624425e-02f, +1.358263971e-01f, +1.606454282e-01f, +1.665333920e-01f, +1.518085470e-01f, +1.206408274e-01f, +8.141735797e-02f, +4.358303295e-02f, +1.440353461e-02f, -2.982820703e-03f, -9.602998309e-03f, -9.115749418e-03f, -5.698135939e-03f, -2.395970773e-03f, -5.107539404e-04f, + +1.410181368e-05f, +5.481767783e-05f, +1.019547717e-04f, +1.131367508e-04f, +3.249594950e-05f, -1.795479501e-04f, -5.124729073e-04f, -8.883684744e-04f, -1.177301558e-03f, -1.245360095e-03f, -1.015893545e-03f, -5.134291353e-04f, +1.347965074e-04f, +7.443056386e-04f, +1.145959062e-03f, +1.251220658e-03f, +1.079624571e-03f, +7.380684864e-04f, +3.661226517e-04f, +7.677282003e-05f, -7.965680278e-05f, -1.164929146e-04f, -8.421072848e-05f, -3.598076395e-05f, + +7.401826381e-04f, +3.004293539e-03f, +5.861100077e-03f, +6.300886015e-03f, +7.967077873e-04f, -1.149352756e-02f, -2.620740629e-02f, -3.463398879e-02f, -2.854621219e-02f, -6.312482782e-03f, +2.420689197e-02f, +4.885918772e-02f, +5.513168435e-02f, +3.974164106e-02f, +1.067805940e-02f, -1.773452848e-02f, -3.331231276e-02f, -3.233609636e-02f, -1.997117599e-02f, -5.430303451e-03f, +4.092506755e-03f, +6.653974943e-03f, +4.690680242e-03f, +1.835381414e-03f, + -4.549197558e-05f, -9.029705817e-05f, -7.247437578e-05f, +6.109287905e-05f, +2.823015400e-04f, +4.577602963e-04f, +4.153567124e-04f, +7.525985006e-05f, -4.503411878e-04f, -8.838354626e-04f, -9.438109947e-04f, -5.395793965e-04f, +1.454031092e-04f, +7.538853802e-04f, +9.763999499e-04f, +7.392639072e-04f, +2.299078035e-04f, -2.468902149e-04f, -4.676442529e-04f, -4.035651448e-04f, -1.883663929e-04f, +7.813346558e-06f, +9.180194618e-05f, +7.548101566e-05f, + /* 3,26 (24) */ + -5.841330471e-05f, -1.089007895e-03f, -3.601429772e-03f, -7.206854680e-03f, -9.891433706e-03f, -8.012100248e-03f, +2.642604618e-03f, +2.491033030e-02f, +5.823977294e-02f, +9.770088416e-02f, +1.348105035e-01f, +1.601319991e-01f, +1.666681885e-01f, +1.525528527e-01f, +1.217867864e-01f, +8.266857863e-02f, +4.466265752e-02f, +1.514160309e-02f, -2.616698052e-03f, -9.526225489e-03f, -9.195406221e-03f, -5.814628854e-03f, -2.480181502e-03f, -5.467347044e-04f, + +1.317848272e-05f, +5.329404377e-05f, +1.007474356e-04f, +1.138909429e-04f, +3.689590400e-05f, -1.708679503e-04f, -5.008448706e-04f, -8.771887553e-04f, -1.171003681e-03f, -1.247569347e-03f, -1.027611765e-03f, -5.322142446e-04f, +1.141249198e-04f, +7.276774778e-04f, +1.137706655e-03f, +1.252491970e-03f, +1.088265987e-03f, +7.499149007e-04f, +3.769429824e-04f, +8.388513217e-05f, -7.677968482e-05f, -1.166911641e-04f, -8.569907359e-05f, -3.733902543e-05f, + +6.946906625e-04f, +2.913996481e-03f, +5.788625701e-03f, +6.361978894e-03f, +1.079009327e-03f, -1.103576726e-02f, -2.579204958e-02f, -3.455872894e-02f, -2.899655337e-02f, -7.196318245e-03f, +2.326308098e-02f, +4.831960832e-02f, +5.527708746e-02f, +4.049552644e-02f, +1.165445935e-02f, -1.699526457e-02f, -3.308240496e-02f, -3.258298657e-02f, -2.043882024e-02f, -5.833868595e-03f, +3.904140362e-03f, +6.661788290e-03f, +4.782482188e-03f, +1.910862429e-03f, + -4.386762395e-05f, -8.946238374e-05f, -7.465065498e-05f, +5.515882843e-05f, +2.751700567e-04f, +4.547694920e-04f, +4.212103984e-04f, +8.981186280e-05f, -4.336381561e-04f, -8.747919281e-04f, -9.491993685e-04f, -5.580567552e-04f, +1.231674144e-04f, +7.395762632e-04f, +9.767649031e-04f, +7.522829769e-04f, +2.468993268e-04f, -2.351585315e-04f, -4.654274759e-04f, -4.087927792e-04f, -1.955735175e-04f, +3.186674108e-06f, +9.097481622e-05f, +7.687401763e-05f, + /* 3,27 (24) */ + -4.523482199e-05f, -1.035713852e-03f, -3.500682337e-03f, -7.092963737e-03f, -9.854537802e-03f, -8.182968199e-03f, +2.141759748e-03f, +2.403314154e-02f, +5.706876926e-02f, +9.645331481e-02f, +1.337828917e-01f, +1.595997848e-01f, +1.667823134e-01f, +1.532805302e-01f, +1.229244931e-01f, +8.392107060e-02f, +4.575092351e-02f, +1.589151799e-02f, -2.239755069e-03f, -9.442340357e-03f, -9.272185905e-03f, -5.931320018e-03f, -2.565880576e-03f, -5.840737298e-04f, + +1.227918995e-05f, +5.177991177e-05f, +9.950795986e-05f, +1.145559393e-04f, +4.116397666e-05f, -1.623131509e-04f, -4.892668230e-04f, -8.659290902e-04f, -1.164488953e-03f, -1.249480374e-03f, -1.039052033e-03f, -5.508468014e-04f, +9.342018411e-05f, +7.108436992e-04f, +1.129156576e-03f, +1.253483196e-03f, +1.096734486e-03f, +7.617298102e-04f, +3.878468170e-04f, +9.113227368e-05f, -7.378144564e-05f, -1.168200048e-04f, -8.717235549e-05f, -3.871483564e-05f, + +6.508230385e-04f, +2.824534098e-03f, +5.713975046e-03f, +6.417137723e-03f, +1.354179384e-03f, -1.058099777e-02f, -2.537083918e-02f, -3.446891707e-02f, -2.943019153e-02f, -8.071110173e-03f, +2.231388161e-02f, +4.776155157e-02f, +5.540025487e-02f, +4.123510270e-02f, +1.263122425e-02f, -1.624298160e-02f, -3.283550563e-02f, -3.281814510e-02f, -2.090424772e-02f, -6.242661375e-03f, +3.708566844e-03f, +6.664974964e-03f, +4.873457004e-03f, +1.987736447e-03f, + -4.225117502e-05f, -8.856820608e-05f, -7.670768539e-05f, +4.932258818e-05f, +2.680034041e-04f, +4.515630755e-04f, +4.267562251e-04f, +1.041609125e-04f, -4.168560789e-04f, -8.653738534e-04f, -9.541085427e-04f, -5.762346935e-04f, +1.008647784e-04f, +7.248759729e-04f, +9.766555049e-04f, +7.650169907e-04f, +2.639208351e-04f, -2.231634351e-04f, -4.629159086e-04f, -4.138643616e-04f, -2.028018984e-04f, -1.557929709e-06f, +9.004336690e-05f, +7.823333901e-05f, + /* 3,28 (24) */ + -3.295563204e-05f, -9.839339400e-04f, -3.401174377e-03f, -6.978407798e-03f, -9.813373825e-03f, -8.345281349e-03f, +1.652492925e-03f, +2.316721245e-02f, +5.590428030e-02f, +9.520383444e-02f, +1.327438397e-01f, +1.590489380e-01f, +1.668757336e-01f, +1.539913739e-01f, +1.240536496e-01f, +8.517455379e-02f, +4.684765799e-02f, +1.665324780e-02f, -1.851908252e-03f, -9.351208083e-03f, -9.345967351e-03f, -6.048140022e-03f, -2.653052931e-03f, -6.227885655e-04f, + +1.140398583e-05f, +5.027615317e-05f, +9.823799292e-05f, +1.151334936e-04f, +4.530091876e-05f, -1.538847709e-04f, -4.777421116e-04f, -8.545939606e-04f, -1.157761129e-03f, -1.251094331e-03f, -1.050212011e-03f, -5.693216354e-04f, +7.268830890e-05f, +6.938087530e-04f, +1.120310067e-03f, +1.254192209e-03f, +1.105025867e-03f, +7.735089158e-04f, +3.988314213e-04f, +9.851370773e-05f, -7.066089609e-05f, -1.168776089e-04f, -8.862912628e-05f, -4.010760193e-05f, + +6.085718635e-04f, +2.735965892e-03f, +5.637267360e-03f, +6.466460311e-03f, +1.622182788e-03f, -1.012943469e-02f, -2.494408295e-02f, -3.436475616e-02f, -2.984704761e-02f, -8.936484026e-03f, +2.135977306e-02f, +4.718531687e-02f, +5.550111965e-02f, +4.195997867e-02f, +1.360787976e-02f, -1.547796461e-02f, -3.257158479e-02f, -3.304130854e-02f, -2.136716363e-02f, -6.656525736e-03f, +3.505764946e-03f, +6.663417034e-03f, +4.963500371e-03f, +2.065969786e-03f, + -4.064418164e-05f, -8.761689193e-05f, -7.864645488e-05f, +4.358657619e-05f, +2.608070442e-04f, +4.481461147e-04f, +4.319944063e-04f, +1.183005185e-04f, -4.000050864e-04f, -8.555885112e-04f, -9.585374951e-04f, -5.941037881e-04f, +7.850731232e-05f, +7.097916912e-04f, +9.760698691e-04f, +7.774570446e-04f, +2.809627312e-04f, -2.109094015e-04f, -4.601074287e-04f, -4.187742019e-04f, -2.100467847e-04f, -6.419221105e-06f, +8.900590706e-05f, +7.955668309e-05f, + /* 3,29 (24) */ + -2.155164621e-05f, -9.336577868e-04f, -3.302936384e-03f, -6.863274304e-03f, -9.768072906e-03f, -8.499166120e-03f, +1.174750813e-03f, +2.231261849e-02f, +5.474651917e-02f, +9.395274011e-02f, +1.316936277e-01f, +1.584796164e-01f, +1.669484219e-01f, +1.546851826e-01f, +1.251739597e-01f, +8.642874600e-02f, +4.795268386e-02f, +1.742675672e-02f, -1.453076831e-03f, -9.252694376e-03f, -9.416628247e-03f, -6.165017631e-03f, -2.741682057e-03f, -6.628961674e-04f, + +1.055290011e-05f, +4.878361126e-05f, +9.693916574e-05f, +1.156253717e-04f, +4.930753009e-05f, -1.455839599e-04f, -4.662740262e-04f, -8.431878379e-04f, -1.150824016e-03f, -1.252412474e-03f, -1.061089468e-03f, -5.876336398e-04f, +5.193531372e-05f, +6.765771692e-04f, +1.111168481e-03f, +1.254616975e-03f, +1.113135960e-03f, +7.852478923e-04f, +4.098939964e-04f, +1.060288310e-04f, -6.741688592e-05f, -1.168621514e-04f, -9.006791560e-05f, -4.151670416e-05f, + +5.679276819e-04f, +2.648349000e-03f, +5.558620905e-03f, +6.510046887e-03f, +1.882989832e-03f, -9.681288580e-03f, -2.451208855e-02f, -3.424645564e-02f, -3.024705269e-02f, -9.792072538e-03f, +2.040123557e-02f, +4.659121308e-02f, +5.557962696e-02f, +4.266977036e-02f, +1.458394963e-02f, -1.470050756e-02f, -3.229062206e-02f, -3.325221794e-02f, -2.182727105e-02f, -7.075299938e-03f, +3.295718161e-03f, +6.656997813e-03f, +5.052506278e-03f, +2.145526469e-03f, + -3.904815034e-05f, -8.661081072e-05f, -8.046803207e-05f, +3.795309249e-05f, +2.535863825e-04f, +4.445237610e-04f, +4.369253578e-04f, +1.322243893e-04f, -3.830952845e-04f, -8.454433646e-04f, -9.624854981e-04f, -6.116548155e-04f, +5.610716341e-05f, +6.943308460e-04f, +9.750063939e-04f, +7.895943690e-04f, +2.980153362e-04f, -1.984011167e-04f, -4.570000917e-04f, -4.235166508e-04f, -2.173033413e-04f, -1.139584045e-05f, +8.786080506e-05f, +8.084173690e-05f, + /* 3,30 (24) */ + -1.099874610e-05f, -8.848741755e-04f, -3.205997218e-03f, -6.747648932e-03f, -9.718765376e-03f, -8.644750080e-03f, +7.084767869e-04f, +2.146943066e-02f, +5.359569516e-02f, +9.270032763e-02f, +1.306325382e-01f, +1.578919828e-01f, +1.670003572e-01f, +1.553617598e-01f, +1.262851282e-01f, +8.768336298e-02f, +4.906581982e-02f, +1.821200461e-02f, -1.043182834e-03f, -9.146665545e-03f, -9.484045133e-03f, -6.281879783e-03f, -2.831749973e-03f, -7.044128715e-04f, + +9.725942243e-06f, +4.730310127e-05f, +9.561309131e-05f, +1.160333507e-04f, +5.318465797e-05f, -1.374117981e-04f, -4.548657984e-04f, -8.317151817e-04f, -1.143681477e-03f, -1.253436160e-03f, -1.071682283e-03f, -6.057777733e-04f, +3.116722669e-05f, +6.591535567e-04f, +1.101733279e-03f, +1.254755552e-03f, +1.121060636e-03f, +7.969423900e-04f, +4.210316793e-04f, +1.136769732e-04f, -6.404830492e-05f, -1.167718107e-04f, -9.148723106e-05f, -4.294149459e-05f, + +5.288795315e-04f, +2.561738189e-03f, +5.478152873e-03f, +6.547999980e-03f, +2.136576215e-03f, -9.236764819e-03f, -2.407516319e-02f, -3.411423125e-02f, -3.063014798e-02f, -1.063751590e-02f, +1.943875007e-02f, +4.597955827e-02f, +5.563573413e-02f, +4.336410121e-02f, +1.555895602e-02f, -1.391091319e-02f, -3.199260673e-02f, -3.345061906e-02f, -2.228427115e-02f, -7.498816589e-03f, +3.078414820e-03f, +6.645601972e-03f, +5.140367083e-03f, +2.226368206e-03f, + -3.746454073e-05f, -8.555233233e-05f, -8.217356412e-05f, +3.242431918e-05f, +2.463467642e-04f, +4.407012446e-04f, +4.415496956e-04f, +1.459264257e-04f, -3.661367488e-04f, -8.349460613e-04f, -9.659521188e-04f, -6.288787583e-04f, +3.367650675e-05f, +6.785011074e-04f, +9.734637637e-04f, +8.014203357e-04f, +3.150688955e-04f, -1.856434745e-04f, -4.535921347e-04f, -4.280861048e-04f, -2.245666512e-04f, -1.648631167e-05f, +8.660649126e-05f, +8.208617321e-05f, + /* 3,31 (24) */ + -1.272803854e-06f, -8.375710743e-04f, -3.110384127e-03f, -6.631615582e-03f, -9.665580718e-03f, -8.782161878e-03f, +2.536109885e-04f, +2.063771547e-02f, +5.245201368e-02f, +9.144689147e-02f, +1.295608560e-01f, +1.572862050e-01f, +1.670315244e-01f, +1.560209133e-01f, +1.273868615e-01f, +8.893811853e-02f, +5.018688045e-02f, +1.900894700e-02f, -6.221511552e-04f, -9.032988571e-03f, -9.548093438e-03f, -6.398651594e-03f, -2.923237204e-03f, -7.473543661e-04f, + +8.923101798e-06f, +4.583541038e-05f, +9.426136396e-05f, +1.163592181e-04f, +5.693319620e-05f, -1.293692963e-04f, -4.435206002e-04f, -8.201804378e-04f, -1.136337421e-03f, -1.254166848e-03f, -1.081988441e-03f, -6.237490619e-04f, +1.039008209e-05f, +6.415426008e-04f, +1.092006038e-03f, +1.254606094e-03f, +1.128795806e-03f, +8.085880363e-04f, +4.322415435e-04f, +1.214573968e-04f, -6.055408398e-05f, -1.166047700e-04f, -9.288555880e-05f, -4.438129776e-05f, + +4.914149908e-04f, +2.476185857e-03f, +5.395979309e-03f, +6.580424299e-03f, +2.382922979e-03f, -8.796063574e-03f, -2.363361349e-02f, -3.396830483e-02f, -3.099628473e-02f, -1.147246196e-02f, +1.847279795e-02f, +4.535067951e-02f, +5.566941063e-02f, +4.404260232e-02f, +1.653241978e-02f, -1.310949286e-02f, -3.167753783e-02f, -3.363626253e-02f, -2.273786328e-02f, -7.926902694e-03f, +2.853848169e-03f, +6.629115661e-03f, +5.226973574e-03f, +2.308454379e-03f, + -3.589476488e-05f, -8.444382486e-05f, -8.376427446e-05f, +2.700232027e-05f, +2.390934712e-04f, +4.366838699e-04f, +4.458682330e-04f, +1.594007232e-04f, -3.491395175e-04f, -8.241044281e-04f, -9.689372183e-04f, -6.457668103e-04f, +1.122753743e-05f, +6.623103823e-04f, +9.714409511e-04f, +8.129264642e-04f, +3.321135850e-04f, -1.726415751e-04f, -4.498819789e-04f, -4.324770105e-04f, -2.318317186e-04f, -2.168904174e-05f, +8.524146050e-05f, +8.328765248e-05f, + /* 4, 0 (24) */ + +1.600006368e-03f, +2.296092272e-03f, +9.217025557e-05f, -6.986631072e-03f, -1.727091088e-02f, -2.337765487e-02f, -1.399136907e-02f, +1.997025201e-02f, +7.789615823e-02f, +1.459827282e-01f, +2.013673686e-01f, +2.227225527e-01f, +2.013673686e-01f, +1.459827282e-01f, +7.789615823e-02f, +1.997025201e-02f, -1.399136907e-02f, -2.337765487e-02f, -1.727091088e-02f, -6.986631072e-03f, +9.217025557e-05f, +2.296092272e-03f, +1.600006368e-03f, +4.631705239e-04f, + -3.890635472e-05f, +7.644098300e-06f, +1.382938117e-04f, +2.923858025e-04f, +3.110196137e-04f, +1.764043540e-05f, -6.359464612e-04f, -1.460909391e-03f, -2.067532558e-03f, -2.063446989e-03f, -1.303852983e-03f, -2.161761953e-05f, +1.269515872e-03f, +2.050925659e-03f, +2.078271276e-03f, +1.485476938e-03f, +6.607797145e-04f, -2.347632839e-06f, -3.073145736e-04f, -2.960266674e-04f, -1.433615383e-04f, -1.049708950e-05f, +3.860841448e-05f, +2.697166309e-05f, + -1.915727268e-03f, -9.515901960e-05f, +6.422434166e-03f, +1.421211896e-02f, +1.445777228e-02f, +2.854429011e-04f, -2.377097129e-02f, -4.073011900e-02f, -3.326070272e-02f, -1.823756678e-04f, +3.855895525e-02f, +5.568063817e-02f, +3.855895525e-02f, -1.823756678e-04f, -3.326070272e-02f, -4.073011900e-02f, -2.377097129e-02f, +2.854429011e-04f, +1.445777228e-02f, +1.421211896e-02f, +6.422434166e-03f, -9.515901960e-05f, -1.915727268e-03f, -9.377691235e-04f, + +5.457975959e-06f, -1.280176524e-04f, -2.583963475e-04f, -1.810574896e-04f, +1.961620417e-04f, +6.539923216e-04f, +7.518795146e-04f, +2.236763837e-04f, -6.738101129e-04f, -1.264799271e-03f, -1.009061979e-03f, -1.788224777e-05f, +9.866129608e-04f, +1.271034774e-03f, +7.007776918e-04f, -1.983647722e-04f, -7.450412298e-04f, -6.648278939e-04f, -2.112722132e-04f, +1.735680368e-04f, +2.601751204e-04f, +1.330885160e-04f, -2.671525331e-06f, -4.060480517e-05f, + /* 4, 1 (24) */ + +1.561100013e-03f, +2.303736370e-03f, +2.304640673e-04f, -6.694245269e-03f, -1.695989127e-02f, -2.336001444e-02f, -1.462731553e-02f, +1.850934262e-02f, +7.582862567e-02f, +1.439192813e-01f, +2.000635157e-01f, +2.227009351e-01f, +2.026368845e-01f, +1.480336539e-01f, +7.997442951e-02f, +2.145572895e-02f, -1.333058935e-02f, -2.338000250e-02f, -1.757822545e-02f, -7.282657739e-03f, -5.119128274e-05f, +2.285595183e-03f, +1.638614782e-03f, +4.901421870e-04f, + -3.914467862e-05f, +4.880739804e-06f, +1.332581224e-04f, +2.886149562e-04f, +3.144091316e-04f, +3.256045541e-05f, -6.112989155e-04f, -1.436129532e-03f, -2.056175888e-03f, -2.075197043e-03f, -1.337654664e-03f, -6.484373343e-05f, +1.234656532e-03f, +2.037634402e-03f, +2.088382221e-03f, +1.509818226e-03f, +6.857887560e-04f, +1.331610283e-05f, -3.032894465e-04f, -2.995314222e-04f, -1.484576699e-04f, -1.343952718e-05f, +3.824923106e-05f, +2.773859848e-05f, + -1.910269292e-03f, -2.231766720e-04f, +6.164037818e-03f, +1.403106147e-02f, +1.465393432e-02f, +9.394352227e-04f, -2.301909178e-02f, -4.050644262e-02f, -3.393451283e-02f, -1.447174939e-03f, +3.754989327e-02f, +5.566275592e-02f, +3.954556821e-02f, +1.088659106e-03f, -3.255992502e-02f, -4.092848378e-02f, -2.451601252e-02f, -3.793849927e-04f, +1.424650006e-02f, +1.438568700e-02f, +6.682609286e-03f, +3.792949637e-05f, -1.918398793e-03f, -9.783739287e-04f, + +8.135227175e-06f, -1.229546211e-04f, -2.564056106e-04f, -1.882251109e-04f, +1.811527070e-04f, +6.427907079e-04f, +7.580581083e-04f, +2.485873599e-04f, -6.465318711e-04f, -1.257676790e-03f, -1.030735887e-03f, -5.363268835e-05f, +9.634049570e-04f, +1.276374679e-03f, +7.274108696e-04f, -1.726700408e-04f, -7.375419549e-04f, -6.752830043e-04f, -2.264708226e-04f, +1.657580629e-04f, +2.617353228e-04f, +1.381613802e-04f, +2.235815352e-07f, -4.080197272e-05f, + /* 4, 2 (24) */ + +1.521955334e-03f, +2.308617110e-03f, +3.637221897e-04f, -6.405630313e-03f, -1.664548213e-02f, -2.332745398e-02f, -1.523861445e-02f, +1.707321309e-02f, +7.377244979e-02f, +1.418440842e-01f, +1.987258610e-01f, +2.226360913e-01f, +2.038715410e-01f, +1.500712883e-01f, +8.206281173e-02f, +2.296554718e-02f, -1.264480060e-02f, -2.336668640e-02f, -1.788151490e-02f, -7.582189161e-03f, -1.996489527e-04f, +2.272155655e-03f, +1.676864013e-03f, +5.178807854e-04f, + -3.932503274e-05f, +2.207110546e-06f, +1.282579919e-04f, +2.847202272e-04f, +3.174878198e-04f, +4.710609530e-05f, -5.868467756e-04f, -1.411151296e-03f, -2.044211344e-03f, -2.086174875e-03f, -1.370908015e-03f, -1.080424771e-04f, +1.199288455e-03f, +2.023574966e-03f, +2.097855838e-03f, +1.533919301e-03f, +7.109634486e-04f, +2.934866841e-05f, -2.989398010e-04f, -3.028939125e-04f, -1.535784642e-04f, -1.647113367e-05f, +3.782719946e-05f, +2.849525023e-05f, + -1.902134065e-03f, -3.461312931e-04f, +5.907632207e-03f, +1.384283636e-02f, +1.483508702e-02f, +1.582225931e-03f, -2.226103367e-02f, -4.025785526e-02f, -3.458104470e-02f, -2.704851729e-03f, +3.651915739e-02f, +5.560912323e-02f, +4.050897317e-02f, +2.365033785e-03f, -3.183251415e-02f, -4.110115382e-02f, -2.525355447e-02f, -1.054667997e-03f, +1.402002924e-02f, +1.455144506e-02f, +6.944344609e-03f, +1.760908766e-04f, -1.918175212e-03f, -1.019175901e-03f, + +1.070289269e-05f, -1.179051185e-04f, -2.542096223e-04f, -1.950699416e-04f, +1.662563353e-04f, +6.312376447e-04f, +7.635788941e-04f, +2.730806734e-04f, -6.189668383e-04f, -1.249676678e-03f, -1.051619252e-03f, -8.934097687e-05f, +9.394547681e-04f, +1.280811105e-03f, +7.536860648e-04f, -1.466101804e-04f, -7.293809816e-04f, -6.853434200e-04f, -2.417452079e-04f, +1.576292334e-04f, +2.630704645e-04f, +1.432302827e-04f, +3.226641988e-06f, -4.093050783e-05f, + /* 4, 3 (24) */ + +1.482630302e-03f, +2.310824221e-03f, +4.919801815e-04f, -6.120910086e-03f, -1.632799431e-02f, -2.328034788e-02f, -1.582546122e-02f, +1.566206180e-02f, +7.172823844e-02f, +1.397579093e-01f, +1.973549530e-01f, +2.225280488e-01f, +2.050708295e-01f, +1.520948633e-01f, +8.416066757e-02f, +2.449946648e-02f, -1.193383715e-02f, -2.333733773e-02f, -1.818045470e-02f, -7.885083074e-03f, -3.532274169e-04f, +2.255684522e-03f, +1.714691213e-03f, +5.463760357e-04f, + -3.944908116e-05f, -3.767807771e-07f, +1.232968301e-04f, +2.807076808e-04f, +3.202604942e-04f, +6.127600737e-05f, -5.625995143e-04f, -1.385988598e-03f, -2.031649253e-03f, -2.096379936e-03f, -1.403600444e-03f, -1.511956212e-04f, +1.163425423e-03f, +2.008749506e-03f, +2.106682842e-03f, +1.557766215e-03f, +7.362934421e-04f, +4.574770527e-05f, -2.942613438e-04f, -3.061079629e-04f, -1.587200698e-04f, -1.959153804e-05f, +3.734073876e-05f, +2.924019581e-05f, + -1.891431172e-03f, -4.640364116e-04f, +5.653422585e-03f, +1.364776642e-02f, +1.500134336e-02f, +2.213463575e-03f, -2.149745477e-02f, -3.998477459e-02f, -3.520001154e-02f, -3.954528407e-03f, +3.546753813e-02f, +5.551978226e-02f, +4.144842794e-02f, +3.645844890e-03f, -3.107882809e-02f, -4.124776400e-02f, -2.598293546e-02f, -1.740011417e-03f, +1.377828403e-02f, +1.470907429e-02f, +7.207415073e-03f, +3.193211593e-04f, -1.914948570e-03f, -1.060106409e-03f, + +1.316074035e-05f, -1.128747009e-04f, -2.518151926e-04f, -2.015913700e-04f, +1.514847712e-04f, +6.193478786e-04f, +7.684443329e-04f, +2.971397975e-04f, -5.911389977e-04f, -1.240808997e-03f, -1.071697343e-03f, -1.249790545e-04f, +9.147798576e-04f, +1.284336918e-03f, +7.795798755e-04f, -1.202036428e-04f, -7.205581984e-04f, -6.949951116e-04f, -2.570824535e-04f, +1.491835725e-04f, +2.641741805e-04f, +1.482891349e-04f, +6.336791463e-06f, -4.098788653e-05f, + /* 4, 4 (24) */ + +1.443181221e-03f, +2.310447440e-03f, +6.152770116e-04f, -5.840202405e-03f, -1.600773382e-02f, -2.321907188e-02f, -1.638806074e-02f, +1.427607320e-02f, +6.969658919e-02f, +1.376615294e-01f, +1.959513525e-01f, +2.223768532e-01f, +2.062342549e-01f, +1.541036128e-01f, +8.626735041e-02f, +2.605723269e-02f, -1.119754371e-02f, -2.329159003e-02f, -1.847471604e-02f, -8.191191037e-03f, -5.119474867e-04f, +2.236092984e-03f, +1.752031952e-03f, +5.756162315e-04f, + -3.951850337e-05f, -2.871011414e-06f, +1.183779345e-04f, +2.765833440e-04f, +3.227320879e-04f, +7.506909163e-05f, -5.385663751e-04f, -1.360655321e-03f, -2.018500186e-03f, -2.105812081e-03f, -1.435719672e-03f, -1.942849625e-04f, +1.127081495e-03f, +1.993160576e-03f, +2.114854228e-03f, +1.581345032e-03f, +7.617681777e-04f, +6.251059783e-05f, -2.892499246e-04f, -3.091673808e-04f, -1.638785275e-04f, -2.280027447e-05f, +3.678829431e-05f, +2.997198507e-05f, + -1.878270432e-03f, -5.769111124e-04f, +5.401607392e-03f, +1.344617505e-02f, +1.515282813e-02f, +2.832811454e-03f, -2.072901044e-02f, -3.968763479e-02f, -3.579115054e-02f, -5.195337404e-03f, +3.439584079e-02f, +5.539480320e-02f, +4.236320779e-02f, +4.930181808e-03f, -3.029924821e-02f, -4.136796764e-02f, -2.670349365e-02f, -2.435006529e-03f, +1.352120158e-02f, +1.485825787e-02f, +7.471589254e-03f, +4.676102941e-04f, -1.908611778e-03f, -1.101094296e-03f, + +1.550868921e-05f, -1.078687810e-04f, -2.492292190e-04f, -2.077891270e-04f, +1.368495688e-04f, +6.071362952e-04f, +7.726574551e-04f, +3.207487185e-04f, -5.630724209e-04f, -1.231084514e-03f, -1.090956146e-03f, -1.605189261e-04f, +8.893983368e-04f, +1.286945741e-03f, +8.050691020e-04f, -9.346932708e-05f, -7.110740955e-04f, -7.042242699e-04f, -2.724694003e-04f, +1.404234661e-04f, +2.650402404e-04f, +1.533317275e-04f, +9.553001232e-06f, -4.097162398e-05f, + /* 4, 5 (24) */ + +1.403662717e-03f, +2.307576429e-03f, +7.336549461e-04f, -5.563619061e-03f, -1.568500173e-02f, -2.314400279e-02f, -1.692662711e-02f, +1.291541788e-02f, +6.767808900e-02f, +1.355557173e-01f, +1.945156329e-01f, +2.221825683e-01f, +2.073613364e-01f, +1.560967734e-01f, +8.838220464e-02f, +2.763857773e-02f, -1.043577553e-02f, -2.322907943e-02f, -1.876396597e-02f, -8.500358418e-03f, -6.758260142e-04f, +2.213292709e-03f, +1.788820246e-03f, +6.055882166e-04f, + -3.953499220e-05f, -5.275742626e-06f, +1.135044900e-04f, +2.723532024e-04f, +3.249076470e-04f, +8.848449348e-05f, -5.147563692e-04f, -1.335165314e-03f, -2.004774947e-03f, -2.114471558e-03f, -1.467253741e-03f, -2.372923342e-04f, +1.090271000e-03f, +1.976811134e-03f, +2.122361275e-03f, +1.604641837e-03f, +7.873768925e-04f, +7.963447218e-05f, -2.839015417e-04f, -3.120659607e-04f, -1.690497713e-04f, -2.609678061e-05f, +3.616833997e-05f, +3.068914123e-05f, + -1.862761743e-03f, -6.847798935e-04f, +5.152378173e-03f, +1.323838592e-02f, +1.528967770e-02f, +3.439947749e-03f, -1.995635298e-02f, -3.936688607e-02f, -3.635422296e-02f, -6.426421918e-03f, +3.330488464e-02f, +5.523428428e-02f, +4.325260613e-02f, +6.217127549e-03f, -2.949417911e-02f, -4.146143697e-02f, -2.741456775e-02f, -3.139230798e-03f, +1.324873218e-02f, +1.499868133e-02f, +7.736629494e-03f, +6.209420216e-04f, -1.899058777e-03f, -1.142065920e-03f, + +1.774680651e-05f, -1.028926238e-04f, -2.464586776e-04f, -2.136632816e-04f, +1.223619839e-04f, +5.946179023e-04f, +7.762218530e-04f, +3.438919470e-04f, -5.347912450e-04f, -1.220514691e-03f, -1.109382373e-03f, -1.959326858e-04f, +8.633289495e-04f, +1.288631960e-03f, +8.301307690e-04f, -6.642656459e-05f, -7.009297703e-04f, -7.130173215e-04f, -2.878926567e-04f, +1.313516642e-04f, +2.656625581e-04f, +1.583517357e-04f, +1.287407632e-05f, -4.087927890e-05f, + /* 4, 6 (24) */ + +1.364127725e-03f, +2.302300686e-03f, +8.471594361e-04f, -5.291265859e-03f, -1.536009408e-02f, -2.305551829e-02f, -1.744138348e-02f, +1.158025256e-02f, +6.567331406e-02f, +1.334412458e-01f, +1.930483791e-01f, +2.219452759e-01f, +2.084516074e-01f, +1.580735845e-01f, +9.050456591e-02f, +2.924321956e-02f, -9.648398637e-03f, -2.314944496e-02f, -1.904786751e-02f, -8.812424378e-03f, -8.448757855e-04f, +2.187195929e-03f, +1.824988586e-03f, +6.362773578e-04f, + -3.950025171e-05f, -7.591217706e-06f, +1.086795681e-04f, +2.680231957e-04f, +3.267923248e-04f, +1.015216012e-04f, -4.911782716e-04f, -1.309532375e-03f, -1.990484565e-03f, -2.122359012e-03f, -1.498191019e-03f, -2.801996166e-04f, +1.053008532e-03f, +1.959704540e-03f, +2.129195558e-03f, +1.627642745e-03f, +8.131086244e-04f, +9.711619491e-05f, -2.782123463e-04f, -3.147974895e-04f, -1.742296298e-04f, -2.948039595e-05f, +3.547938035e-05f, +3.139016191e-05f, + -1.845014936e-03f, -7.876725172e-04f, +4.905919496e-03f, +1.302472264e-02f, +1.541203968e-02f, +4.034565651e-03f, -1.918013113e-02f, -3.902299412e-02f, -3.688901420e-02f, -7.646936609e-03f, +3.219550227e-02f, +5.503835159e-02f, +4.411593508e-02f, +7.505759509e-03f, -2.866404834e-02f, -4.152786353e-02f, -2.811549752e-02f, -3.852248120e-03f, +1.296083952e-02f, +1.513003300e-02f, +8.002292052e-03f, +7.792937573e-04f, -1.886184701e-03f, -1.182945199e-03f, + +1.987530445e-05f, -9.795134253e-05f, -2.435106135e-04f, -2.192142359e-04f, +1.080329663e-04f, +5.818078140e-04f, +7.791416723e-04f, +3.665545286e-04f, -5.063196498e-04f, -1.209111664e-03f, -1.126963471e-03f, -2.311925422e-04f, +8.365910557e-04f, +1.289390737e-03f, +8.547421485e-04f, -3.909510354e-05f, -6.901269306e-04f, -7.213609453e-04f, -3.033386091e-04f, +1.219712837e-04f, +2.660352008e-04f, +1.633427247e-04f, +1.629865360e-05f, -4.070845819e-05f, + /* 4, 7 (24) */ + +1.324627473e-03f, +2.294709468e-03f, +9.558390041e-04f, -5.023242663e-03f, -1.503330176e-02f, -2.295399669e-02f, -1.793256175e-02f, +1.027072019e-02f, +6.368282949e-02f, +1.313188867e-01f, +1.915501881e-01f, +2.216650763e-01f, +2.095046159e-01f, +1.600332890e-01f, +9.263376147e-02f, +3.087086231e-02f, -8.835290013e-03f, -2.305232876e-02f, -1.932607986e-02f, -9.127221868e-03f, -1.019105415e-03f, +2.157715533e-03f, +1.860467966e-03f, +6.676675197e-04f, + -3.941599517e-05f, -9.817759973e-06f, +1.039061266e-04f, +2.635992146e-04f, +3.283913767e-04f, +1.141800434e-04f, -4.678406184e-04f, -1.283770252e-03f, -1.975640291e-03f, -2.129475483e-03f, -1.528520206e-03f, -3.229887474e-04f, +1.015308940e-03f, +1.941844558e-03f, +2.135348947e-03f, +1.650333910e-03f, +8.389522168e-04f, +1.149523721e-04f, -2.721786476e-04f, -3.173557501e-04f, -1.794138276e-04f, -3.295036037e-05f, +3.471995310e-05f, +3.207352022e-05f, + -1.825139632e-03f, -8.856238598e-04f, +4.662408882e-03f, +1.280550840e-02f, +1.552007265e-02f, +4.616373465e-03f, -1.840098946e-02f, -3.865643960e-02f, -3.739533385e-02f, -8.856048273e-03f, +3.106853880e-02f, +5.480715905e-02f, +4.495252614e-02f, +8.795150246e-03f, -2.780930619e-02f, -4.156695864e-02f, -2.880562445e-02f, -4.573609065e-03f, +1.265750091e-02f, +1.525200428e-02f, +8.268327253e-03f, +9.426364820e-04f, -1.869886047e-03f, -1.223653657e-03f, + +2.189453686e-05f, -9.304989612e-05f, -2.403921319e-04f, -2.244427192e-04f, +9.387315197e-05f, +5.687212344e-04f, +7.814216028e-04f, +3.887220543e-04f, -4.776818356e-04f, -1.196888238e-03f, -1.143687639e-03f, -2.662708436e-04f, +8.092046148e-04f, +1.289218010e-03f, +8.788807818e-04f, -1.149509324e-05f, -6.786678989e-04f, -7.292420878e-04f, -3.187934335e-04f, +1.122858102e-04f, +2.661523987e-04f, +1.682981552e-04f, +1.982520010e-05f, -4.045682146e-05f, + /* 4, 8 (24) */ + +1.285211478e-03f, +2.284891708e-03f, +1.059745131e-03f, -4.759643448e-03f, -1.470491038e-02f, -2.283981665e-02f, -1.840040237e-02f, +8.986949936e-03f, +6.170718920e-02f, +1.291894113e-01f, +1.900216679e-01f, +2.213420876e-01f, +2.105199249e-01f, +1.619751336e-01f, +9.476911042e-02f, +3.252119622e-02f, -7.996337796e-03f, -2.293737639e-02f, -1.959825850e-02f, -9.444577618e-03f, -1.198519243e-03f, +2.124765172e-03f, +1.895187919e-03f, +6.997410399e-04f, + -3.928394304e-05f, -1.195577071e-05f, +9.918700977e-05f, +2.590870968e-04f, +3.297101550e-04f, +1.264596862e-04f, -4.447517036e-04f, -1.257892630e-03f, -1.960253585e-03f, -2.135822399e-03f, -1.558230343e-03f, -3.656417317e-04f, +9.771873217e-04f, +1.923235351e-03f, +2.140813622e-03f, +1.672701532e-03f, +8.648963243e-04f, +1.331393484e-04f, -2.657969177e-04f, -3.197345265e-04f, -1.845979867e-04f, -3.650581267e-05f, +3.388863118e-05f, +3.273766594e-05f, + -1.803245095e-03f, -9.786737559e-04f, +4.422016750e-03f, +1.258106569e-02f, +1.561394580e-02f, +5.185094700e-03f, -1.761956786e-02f, -3.826771754e-02f, -3.787301569e-02f, -1.005293651e-02f, +2.992485116e-02f, +5.454088820e-02f, +4.576173075e-02f, +1.008436826e-02f, -2.693042541e-02f, -4.157845373e-02f, -2.948429235e-02f, -5.302851153e-03f, +1.233870748e-02f, +1.536429009e-02f, +8.534479652e-03f, +1.110934637e-03f, -1.850060847e-03f, -1.264110478e-03f, + +2.380499576e-05f, -8.819308537e-05f, -2.371103885e-04f, -2.293497828e-04f, +7.989285652e-05f, +5.553734415e-04f, +7.830668693e-04f, +4.103806698e-04f, -4.489019999e-04f, -1.183857869e-03f, -1.159543829e-03f, -3.011401031e-04f, +7.811901687e-04f, +1.288110505e-03f, +9.025245021e-04f, +1.635293224e-05f, -6.665556153e-04f, -7.366479792e-04f, -3.342431068e-04f, +1.022990993e-04f, +2.660085539e-04f, +1.732113900e-04f, +2.345201148e-05f, -4.012208559e-05f, + /* 4, 9 (24) */ + +1.245927535e-03f, +2.272935938e-03f, +1.158932141e-03f, -4.500556352e-03f, -1.437520023e-02f, -2.271335696e-02f, -1.884515407e-02f, +7.729057306e-03f, +5.974693562e-02f, +1.270535889e-01f, +1.884634375e-01f, +2.209764458e-01f, +2.114971122e-01f, +1.638983689e-01f, +9.690992404e-02f, +3.419389775e-02f, -7.131441472e-03f, -2.280423704e-02f, -1.986405542e-02f, -9.764312144e-03f, -1.383117230e-03f, +2.088259360e-03f, +1.929076550e-03f, +7.324787058e-04f, + -3.910582102e-05f, -1.400572709e-05f, +9.452494757e-05f, +2.544926232e-04f, +3.307541039e-04f, +1.383606303e-04f, -4.219195767e-04f, -1.231913124e-03f, -1.944336107e-03f, -2.141401579e-03f, -1.587310811e-03f, -4.081406529e-04f, +9.386590117e-04f, +1.903881483e-03f, +2.145582071e-03f, +1.694731869e-03f, +8.909294177e-04f, +1.516732064e-04f, -2.590637962e-04f, -3.219276085e-04f, -1.897776284e-04f, -4.014578915e-05f, +3.298402511e-05f, +3.338102668e-05f, + -1.779440099e-03f, -1.066866841e-03f, +4.184906362e-03f, +1.235171590e-02f, +1.569383866e-02f, +5.740468141e-03f, -1.683650099e-02f, -3.785733687e-02f, -3.832191769e-02f, -1.123679438e-02f, +2.876530733e-02f, +5.423974810e-02f, +4.654292092e-02f, +1.137247876e-02f, -2.602790091e-02f, -4.156210080e-02f, -3.015084797e-02f, -6.039499132e-03f, +1.200446437e-02f, +1.546658919e-02f, +8.800488206e-03f, +1.284146027e-03f, -1.826608836e-03f, -1.304232564e-03f, + +2.560730777e-05f, -8.338555042e-05f, -2.336725808e-04f, -2.339367939e-04f, +6.610206861e-05f, +5.417797710e-04f, +7.840832211e-04f, +4.315170851e-04f, -4.200043158e-04f, -1.170034648e-03f, -1.174521759e-03f, -3.357730234e-04f, +7.525688233e-04f, +1.286065738e-03f, +9.256514557e-04f, +4.442807088e-05f, -6.537936395e-04f, -7.435661491e-04f, -3.496734189e-04f, +9.201537813e-05f, +2.655982496e-04f, +1.780756998e-04f, +2.717721072e-05f, -3.970202937e-05f, + /* 4,10 (24) */ + +1.206821714e-03f, +2.258930210e-03f, +1.253457088e-03f, -4.246063728e-03f, -1.404444612e-02f, -2.257499633e-02f, -1.926707365e-02f, +6.497144181e-03f, +5.780259951e-02f, +1.249121873e-01f, +1.868761267e-01f, +2.205683052e-01f, +2.124357712e-01f, +1.658022504e-01f, +9.905550611e-02f, +3.588862962e-02f, -6.240512054e-03f, -2.265256384e-02f, -2.012311922e-02f, -1.008623975e-02f, -1.572894858e-03f, +2.048113570e-03f, +1.962060576e-03f, +7.658597325e-04f, + -3.888335807e-05f, -1.596818006e-05f, +8.992255611e-05f, +2.498215151e-04f, +3.315287539e-04f, +1.498832080e-04f, -3.993520395e-04f, -1.205845271e-03f, -1.927899717e-03f, -2.146215229e-03f, -1.615751341e-03f, -4.504676821e-04f, +8.997395766e-04f, +1.883787917e-03f, +2.149647103e-03f, +1.716411240e-03f, +9.170397892e-04f, +1.705497664e-04f, -2.519760951e-04f, -3.239287962e-04f, -1.949481748e-04f, -4.386922233e-05f, +3.200478532e-05f, +3.400200914e-05f, + -1.753832791e-03f, -1.150252392e-03f, +3.951233781e-03f, +1.211777911e-02f, +1.575994073e-02f, +6.282247912e-03f, -1.605241777e-02f, -3.742581979e-02f, -3.874192200e-02f, -1.240682903e-02f, +2.759078557e-02f, +5.390397508e-02f, +4.729548974e-02f, +1.265854450e-02f, -2.510224946e-02f, -4.151767273e-02f, -3.080464160e-02f, -6.783065281e-03f, +1.165479095e-02f, +1.555860457e-02f, +9.066086455e-03f, +1.462221727e-03f, -1.799431625e-03f, -1.343934593e-03f, + +2.730223042e-05f, -7.863176802e-05f, -2.300859391e-04f, -2.382054290e-04f, +5.251044389e-05f, +5.279556008e-04f, +7.844769221e-04f, +4.521185823e-04f, -3.910129090e-04f, -1.155433287e-03f, -1.188611921e-03f, -3.701425216e-04f, +7.233622306e-04f, +1.283082020e-03f, +9.482401246e-04f, +7.270907003e-05f, -6.403861531e-04f, -7.499844418e-04f, -3.650699852e-04f, +8.143924587e-05f, +2.649162596e-04f, +1.828842697e-04f, +3.099874700e-05f, -3.919449805e-05f, + /* 4,11 (24) */ + +1.167938356e-03f, +2.242962030e-03f, +1.343379644e-03f, -3.996242213e-03f, -1.371291737e-02f, -2.242511312e-02f, -1.966642569e-02f, +5.291298910e-03f, +5.587469979e-02f, +1.227659721e-01f, +1.852603754e-01f, +2.201178375e-01f, +2.133355108e-01f, +1.676860383e-01f, +1.012051532e-01f, +3.760504086e-02f, -5.323472265e-03f, -2.248201407e-02f, -2.037509531e-02f, -1.041016855e-02f, -1.767843033e-03f, +2.004244348e-03f, +1.994065361e-03f, +7.998617417e-04f, + -3.861828455e-05f, -1.784375216e-05f, +8.538233747e-05f, +2.450794304e-04f, +3.320397166e-04f, +1.610279801e-04f, -3.770566444e-04f, -1.179702524e-03f, -1.910956455e-03f, -2.150265936e-03f, -1.643542021e-03f, -4.926050893e-04f, +8.604448044e-04f, +1.862960013e-03f, +2.153001849e-03f, +1.737726042e-03f, +9.432155588e-04f, +1.897645857e-04f, -2.445308031e-04f, -3.257319050e-04f, -2.001049506e-04f, -4.767493968e-05f, +3.094960441e-05f, +3.459900040e-05f, + -1.726530561e-03f, -1.228884160e-03f, +3.721147842e-03f, +1.187957368e-02f, +1.581245117e-02f, +6.810203513e-03f, -1.526794084e-02f, -3.697370120e-02f, -3.913293491e-02f, -1.356226232e-02f, +2.640217365e-02f, +5.353383256e-02f, +4.801885197e-02f, +1.394162652e-02f, -2.415400933e-02f, -4.144496366e-02f, -3.144502776e-02f, -7.533049723e-03f, +1.128972097e-02f, +1.564004381e-02f, +9.331002715e-03f, +1.645105997e-03f, -1.768432878e-03f, -1.383129091e-03f, + +2.889064834e-05f, -7.393604918e-05f, -2.263577172e-04f, -2.421576681e-04f, +3.912729931e-05f, +5.139163346e-04f, +7.842547396e-04f, +4.721730237e-04f, -3.619518359e-04f, -1.140069105e-03f, -1.201805585e-03f, -4.042217537e-04f, +6.935925692e-04f, +1.279158464e-03f, +9.702693474e-04f, +1.011743441e-04f, -6.263379604e-04f, -7.558910313e-04f, -3.804182591e-04f, +7.057567423e-05f, +2.639575569e-04f, +1.876302057e-04f, +3.491439479e-05f, -3.859740791e-05f, + /* 4,12 (24) */ + +1.129320071e-03f, +2.225118278e-03f, +1.428761982e-03f, -3.751162783e-03f, -1.338087765e-02f, -2.226408514e-02f, -2.004348233e-02f, +4.111596385e-03f, +5.396374334e-02f, +1.206157061e-01f, +1.836168334e-01f, +2.196252324e-01f, +2.141959556e-01f, +1.695489983e-01f, +1.033581551e-01f, +3.934276690e-02f, -4.380256706e-03f, -2.229224948e-02f, -2.061962612e-02f, -1.073590045e-02f, -1.967947983e-03f, +1.956569408e-03f, +2.025014965e-03f, +8.344607421e-04f, + -3.831233032e-05f, -1.963313541e-05f, +8.090667996e-05f, +2.402719605e-04f, +3.322926800e-04f, +1.717957323e-04f, -3.550406920e-04f, -1.153498242e-03f, -1.893518541e-03f, -2.153556667e-03f, -1.670673294e-03f, -5.345352524e-04f, +8.207906967e-04f, +1.841403527e-03f, +2.155639771e-03f, +1.758662752e-03f, +9.694446795e-04f, +2.093129585e-04f, -2.367250903e-04f, -3.273307702e-04f, -2.052431855e-04f, -5.156166247e-05f, +2.981721948e-05f, +3.517036926e-05f, + -1.697639913e-03f, -1.302820209e-03f, +3.494790125e-03f, +1.163741601e-02f, +1.585157847e-02f, +7.324119848e-03f, -1.448368610e-02f, -3.650152818e-02f, -3.949488675e-02f, -1.470233142e-02f, +2.520036807e-02f, +5.312961080e-02f, +4.871244454e-02f, +1.522078498e-02f, -2.318373998e-02f, -4.134378931e-02f, -3.207136572e-02f, -8.288940755e-03f, +1.090930271e-02f, +1.571061949e-02f, +9.594960272e-03f, +1.832736202e-03f, -1.733518483e-03f, -1.421726499e-03f, + +3.037356937e-05f, -6.930253702e-05f, -2.224951841e-04f, -2.457957871e-04f, +2.596160801e-05f, +4.996773867e-04f, +7.834239334e-04f, +4.916688586e-04f, -3.328450618e-04f, -1.123958007e-03f, -1.214094808e-03f, -4.379841389e-04f, +6.632825249e-04f, +1.274294983e-03f, +9.917183406e-04f, +1.298019927e-04f, -6.116544888e-04f, -7.612744370e-04f, -3.957035450e-04f, +5.943000741e-05f, +2.627173228e-04f, +1.923065421e-04f, +3.892175321e-05f, -3.790875087e-05f, + /* 4,13 (24) */ + +1.091007741e-03f, +2.205485143e-03f, +1.509668662e-03f, -3.510890822e-03f, -1.304858497e-02f, -2.209228941e-02f, -2.039852303e-02f, +2.958098143e-03f, +5.207022480e-02f, +1.184621495e-01f, +1.819461601e-01f, +2.190906972e-01f, +2.150167463e-01f, +1.713904019e-01f, +1.055137948e-01f, +4.110142965e-02f, -3.410812026e-03f, -2.208293652e-02f, -2.085635121e-02f, -1.106323122e-02f, -2.173191169e-03f, +1.905007746e-03f, +2.054832185e-03f, +8.696311113e-04f, + -3.796722292e-05f, -2.133708908e-05f, +7.649785829e-05f, +2.354046271e-04f, +3.322934025e-04f, +1.821874723e-04f, -3.333112290e-04f, -1.127245685e-03f, -1.875598366e-03f, -2.156090765e-03f, -1.697135968e-03f, -5.762406683e-04f, +7.807934590e-04f, +1.819124608e-03f, +2.157554666e-03f, +1.779207937e-03f, +9.957149438e-04f, +2.291899164e-04f, -2.285563129e-04f, -3.287192523e-04f, -2.103580158e-04f, -5.552800462e-05f, +2.860641441e-05f, +3.571446765e-05f, + -1.667266343e-03f, -1.372122746e-03f, +3.272294941e-03f, +1.139162022e-02f, +1.587754008e-02f, +7.823797235e-03f, -1.370026217e-02f, -3.600985932e-02f, -3.982773181e-02f, -1.582628943e-02f, +2.398627326e-02f, +5.269162666e-02f, +4.937572707e-02f, +1.649507997e-02f, -2.219202164e-02f, -4.121398732e-02f, -3.268302021e-02f, -9.050215191e-03f, +1.051359916e-02f, +1.577004950e-02f, +9.857677594e-03f, +2.025042745e-03f, -1.694596730e-03f, -1.459635250e-03f, + +3.175212055e-05f, -6.473520493e-05f, -2.185056152e-04f, -2.491223514e-04f, +1.302199447e-05f, +4.852541662e-04f, +7.819922437e-04f, +5.105951303e-04f, -3.037164389e-04f, -1.107116472e-03f, -1.225472438e-03f, -4.714033835e-04f, +6.324552708e-04f, +1.268492295e-03f, +1.012566720e-03f, +1.585698194e-04f, -5.963417892e-04f, -7.661235378e-04f, -4.109110111e-04f, +4.800796156e-05f, +2.611909559e-04f, +1.969062480e-04f, +4.301824547e-05f, -3.712659903e-05f, + /* 4,14 (24) */ + +1.053040518e-03f, +2.184148054e-03f, +1.586166520e-03f, -3.275486195e-03f, -1.271629157e-02f, -2.191010194e-02f, -2.073183425e-02f, +1.830852458e-03f, +5.019462643e-02f, +1.163060587e-01f, +1.802490241e-01f, +2.185144565e-01f, +2.157975398e-01f, +1.732095265e-01f, +1.076713495e-01f, +4.288063759e-02f, -2.415097083e-03f, -2.185374661e-02f, -2.108490752e-02f, -1.139195048e-02f, -2.383549185e-03f, +1.849479741e-03f, +2.083438599e-03f, +9.053455790e-04f, + -3.758468577e-05f, -2.295643745e-05f, +7.215803397e-05f, +2.304828792e-04f, +3.320477083e-04f, +1.922044257e-04f, -3.118750465e-04f, -1.100958005e-03f, -1.857208478e-03f, -2.157871948e-03f, -1.722921219e-03f, -6.177039619e-04f, +7.404694924e-04f, +1.796129796e-03f, +2.158740672e-03f, +1.799348266e-03f, +1.022013989e-03f, +2.493902282e-04f, -2.200220172e-04f, -3.298912414e-04f, -2.154444867e-04f, -5.957247171e-05f, +2.731602220e-05f, +3.622963204e-05f, + -1.635514223e-03f, -1.436857951e-03f, +3.053789325e-03f, +1.114249787e-02f, +1.589056207e-02f, +8.309051401e-03f, -1.291826993e-02f, -3.549926419e-02f, -4.013144825e-02f, -1.693340590e-02f, +2.276080082e-02f, +5.222022328e-02f, +5.000818234e-02f, +1.776357226e-02f, -2.117945492e-02f, -4.105541750e-02f, -3.327936200e-02f, -9.816338729e-03f, +1.010268815e-02f, +1.581805746e-02f, +1.011886855e-02f, +2.221948993e-03f, -1.651578484e-03f, -1.496761849e-03f, + +3.302754405e-05f, -6.023785490e-05f, -2.143962835e-04f, -2.521402083e-04f, +3.167302584e-07f, +4.706620616e-04f, +7.799678790e-04f, +5.289414813e-04f, -2.745896849e-04f, -1.089561530e-03f, -1.235932120e-03f, -5.044535044e-04f, +6.011344466e-04f, +1.261751929e-03f, +1.032794521e-03f, +1.874553504e-04f, -5.804065349e-04f, -7.704275872e-04f, -4.260257039e-04f, +3.631562396e-05f, +2.593740802e-04f, +2.014222347e-04f, +4.720111872e-05f, -3.624910917e-05f, + /* 4,15 (24) */ + +1.015455832e-03f, +2.161191616e-03f, +1.658324554e-03f, -3.045003316e-03f, -1.238424386e-02f, -2.171789751e-02f, -2.104370930e-02f, +7.298944523e-04f, +4.833741795e-02f, +1.141481867e-01f, +1.785261029e-01f, +2.178967525e-01f, +2.165380092e-01f, +1.750056563e-01f, +1.098300902e-01f, +4.467998586e-02f, -1.393083093e-03f, -2.160435638e-02f, -2.130492954e-02f, -1.172184172e-02f, -2.598993671e-03f, +1.789907270e-03f, +2.110754621e-03f, +9.415752110e-04f, + -3.716643644e-05f, -2.449206763e-05f, +6.788925573e-05f, +2.255120901e-04f, +3.315614818e-04f, +2.018480326e-04f, -2.907386786e-04f, -1.074648240e-03f, -1.838361579e-03f, -2.158904301e-03f, -1.748020596e-03f, -6.589078965e-04f, +6.998353837e-04f, +1.772426020e-03f, +2.159192272e-03f, +1.819070515e-03f, +1.048329306e-03f, +2.699084005e-04f, -2.111199439e-04f, -3.308406629e-04f, -2.204975547e-04f, -6.369346004e-05f, +2.594492724e-05f, +3.671418494e-05f, + -1.602486679e-03f, -1.497095806e-03f, +2.839393042e-03f, +1.089035766e-02f, +1.589087880e-02f, +8.779713462e-03f, -1.213830205e-02f, -3.497032271e-02f, -4.040603793e-02f, -1.802296743e-02f, +2.152486870e-02f, +5.171576978e-02f, +5.060931679e-02f, +1.902532419e-02f, -2.014666040e-02f, -4.086796215e-02f, -3.385976853e-02f, -1.058676632e-02f, +9.676662449e-03f, +1.585437308e-02f, +1.037824263e-02f, +2.423371227e-03f, -1.604377366e-03f, -1.533010958e-03f, + +3.420119301e-05f, -5.581411613e-05f, -2.101744516e-04f, -2.548524797e-04f, -1.214626993e-05f, +4.559164258e-04f, +7.773595044e-04f, +5.466981591e-04f, -2.454883617e-04f, -1.071310751e-03f, -1.245468296e-03f, -5.371088529e-04f, +5.693441375e-04f, +1.254076215e-03f, +1.052382220e-03f, +2.164358544e-04f, -5.638560203e-04f, -7.741762277e-04f, -4.410325610e-04f, +2.435945170e-05f, +2.572625544e-04f, +2.058473631e-04f, +5.146744392e-05f, -3.527452729e-05f, + /* 4,16 (24) */ + +9.782893959e-04f, +2.136699549e-03f, +1.726213810e-03f, -2.819491226e-03f, -1.205268238e-02f, -2.151604948e-02f, -2.133444798e-02f, -3.447537878e-04f, +4.649905637e-02f, +1.119892824e-01f, +1.767780823e-01f, +2.172378446e-01f, +2.172378446e-01f, +1.767780823e-01f, +1.119892824e-01f, +4.649905637e-02f, -3.447537878e-04f, -2.133444798e-02f, -2.151604948e-02f, -1.205268238e-02f, -2.819491226e-03f, +1.726213810e-03f, +2.136699549e-03f, +9.782893959e-04f, + -3.671418494e-05f, -2.594492724e-05f, +6.369346004e-05f, +2.204975547e-04f, +3.308406629e-04f, +2.111199439e-04f, -2.699084005e-04f, -1.048329306e-03f, -1.819070515e-03f, -2.159192272e-03f, -1.772426020e-03f, -6.998353837e-04f, +6.589078965e-04f, +1.748020596e-03f, +2.158904301e-03f, +1.838361579e-03f, +1.074648240e-03f, +2.907386786e-04f, -2.018480326e-04f, -3.315614818e-04f, -2.255120901e-04f, -6.788925573e-05f, +2.449206763e-05f, +3.716643644e-05f, + -1.568285486e-03f, -1.552909922e-03f, +2.629218590e-03f, +1.063550518e-02f, +1.587873253e-02f, +9.235629888e-03f, -1.136094254e-02f, -3.442362455e-02f, -4.065152629e-02f, -1.909427818e-02f, +2.027940040e-02f, +5.117866092e-02f, +5.117866092e-02f, +2.027940040e-02f, -1.909427818e-02f, -4.065152629e-02f, -3.442362455e-02f, -1.136094254e-02f, +9.235629888e-03f, +1.587873253e-02f, +1.063550518e-02f, +2.629218590e-03f, -1.552909922e-03f, -1.568285486e-03f, + +3.527452729e-05f, -5.146744392e-05f, -2.058473631e-04f, -2.572625544e-04f, -2.435945170e-05f, +4.410325610e-04f, +7.741762277e-04f, +5.638560203e-04f, -2.164358544e-04f, -1.052382220e-03f, -1.254076215e-03f, -5.693441375e-04f, +5.371088529e-04f, +1.245468296e-03f, +1.071310751e-03f, +2.454883617e-04f, -5.466981591e-04f, -7.773595044e-04f, -4.559164258e-04f, +1.214626993e-05f, +2.548524797e-04f, +2.101744516e-04f, +5.581411613e-05f, -3.420119301e-05f, + /* 4,17 (24) */ + +9.415752110e-04f, +2.110754621e-03f, +1.789907270e-03f, -2.598993671e-03f, -1.172184172e-02f, -2.130492954e-02f, -2.160435638e-02f, -1.393083093e-03f, +4.467998586e-02f, +1.098300902e-01f, +1.750056563e-01f, +2.165380092e-01f, +2.178967525e-01f, +1.785261029e-01f, +1.141481867e-01f, +4.833741795e-02f, +7.298944523e-04f, -2.104370930e-02f, -2.171789751e-02f, -1.238424386e-02f, -3.045003316e-03f, +1.658324554e-03f, +2.161191616e-03f, +1.015455832e-03f, + -3.622963204e-05f, -2.731602220e-05f, +5.957247171e-05f, +2.154444867e-04f, +3.298912414e-04f, +2.200220172e-04f, -2.493902282e-04f, -1.022013989e-03f, -1.799348266e-03f, -2.158740672e-03f, -1.796129796e-03f, -7.404694924e-04f, +6.177039619e-04f, +1.722921219e-03f, +2.157871948e-03f, +1.857208478e-03f, +1.100958005e-03f, +3.118750465e-04f, -1.922044257e-04f, -3.320477083e-04f, -2.304828792e-04f, -7.215803397e-05f, +2.295643745e-05f, +3.758468577e-05f, + -1.533010958e-03f, -1.604377366e-03f, +2.423371227e-03f, +1.037824263e-02f, +1.585437308e-02f, +9.676662449e-03f, -1.058676632e-02f, -3.385976853e-02f, -4.086796215e-02f, -2.014666040e-02f, +1.902532419e-02f, +5.060931679e-02f, +5.171576978e-02f, +2.152486870e-02f, -1.802296743e-02f, -4.040603793e-02f, -3.497032271e-02f, -1.213830205e-02f, +8.779713462e-03f, +1.589087880e-02f, +1.089035766e-02f, +2.839393042e-03f, -1.497095806e-03f, -1.602486679e-03f, + +3.624910917e-05f, -4.720111872e-05f, -2.014222347e-04f, -2.593740802e-04f, -3.631562396e-05f, +4.260257039e-04f, +7.704275872e-04f, +5.804065349e-04f, -1.874553504e-04f, -1.032794521e-03f, -1.261751929e-03f, -6.011344466e-04f, +5.044535044e-04f, +1.235932120e-03f, +1.089561530e-03f, +2.745896849e-04f, -5.289414813e-04f, -7.799678790e-04f, -4.706620616e-04f, -3.167302584e-07f, +2.521402083e-04f, +2.143962835e-04f, +6.023785490e-05f, -3.302754405e-05f, + /* 4,18 (24) */ + +9.053455790e-04f, +2.083438599e-03f, +1.849479741e-03f, -2.383549185e-03f, -1.139195048e-02f, -2.108490752e-02f, -2.185374661e-02f, -2.415097083e-03f, +4.288063759e-02f, +1.076713495e-01f, +1.732095265e-01f, +2.157975398e-01f, +2.185144565e-01f, +1.802490241e-01f, +1.163060587e-01f, +5.019462643e-02f, +1.830852458e-03f, -2.073183425e-02f, -2.191010194e-02f, -1.271629157e-02f, -3.275486195e-03f, +1.586166520e-03f, +2.184148054e-03f, +1.053040518e-03f, + -3.571446765e-05f, -2.860641441e-05f, +5.552800462e-05f, +2.103580158e-04f, +3.287192523e-04f, +2.285563129e-04f, -2.291899164e-04f, -9.957149438e-04f, -1.779207937e-03f, -2.157554666e-03f, -1.819124608e-03f, -7.807934590e-04f, +5.762406683e-04f, +1.697135968e-03f, +2.156090765e-03f, +1.875598366e-03f, +1.127245685e-03f, +3.333112290e-04f, -1.821874723e-04f, -3.322934025e-04f, -2.354046271e-04f, -7.649785829e-05f, +2.133708908e-05f, +3.796722292e-05f, + -1.496761849e-03f, -1.651578484e-03f, +2.221948993e-03f, +1.011886855e-02f, +1.581805746e-02f, +1.010268815e-02f, -9.816338729e-03f, -3.327936200e-02f, -4.105541750e-02f, -2.117945492e-02f, +1.776357226e-02f, +5.000818234e-02f, +5.222022328e-02f, +2.276080082e-02f, -1.693340590e-02f, -4.013144825e-02f, -3.549926419e-02f, -1.291826993e-02f, +8.309051401e-03f, +1.589056207e-02f, +1.114249787e-02f, +3.053789325e-03f, -1.436857951e-03f, -1.635514223e-03f, + +3.712659903e-05f, -4.301824547e-05f, -1.969062480e-04f, -2.611909559e-04f, -4.800796156e-05f, +4.109110111e-04f, +7.661235378e-04f, +5.963417892e-04f, -1.585698194e-04f, -1.012566720e-03f, -1.268492295e-03f, -6.324552708e-04f, +4.714033835e-04f, +1.225472438e-03f, +1.107116472e-03f, +3.037164389e-04f, -5.105951303e-04f, -7.819922437e-04f, -4.852541662e-04f, -1.302199447e-05f, +2.491223514e-04f, +2.185056152e-04f, +6.473520493e-05f, -3.175212055e-05f, + /* 4,19 (24) */ + +8.696311113e-04f, +2.054832185e-03f, +1.905007746e-03f, -2.173191169e-03f, -1.106323122e-02f, -2.085635121e-02f, -2.208293652e-02f, -3.410812026e-03f, +4.110142965e-02f, +1.055137948e-01f, +1.713904019e-01f, +2.150167463e-01f, +2.190906972e-01f, +1.819461601e-01f, +1.184621495e-01f, +5.207022480e-02f, +2.958098143e-03f, -2.039852303e-02f, -2.209228941e-02f, -1.304858497e-02f, -3.510890822e-03f, +1.509668662e-03f, +2.205485143e-03f, +1.091007741e-03f, + -3.517036926e-05f, -2.981721948e-05f, +5.156166247e-05f, +2.052431855e-04f, +3.273307702e-04f, +2.367250903e-04f, -2.093129585e-04f, -9.694446795e-04f, -1.758662752e-03f, -2.155639771e-03f, -1.841403527e-03f, -8.207906967e-04f, +5.345352524e-04f, +1.670673294e-03f, +2.153556667e-03f, +1.893518541e-03f, +1.153498242e-03f, +3.550406920e-04f, -1.717957323e-04f, -3.322926800e-04f, -2.402719605e-04f, -8.090667996e-05f, +1.963313541e-05f, +3.831233032e-05f, + -1.459635250e-03f, -1.694596730e-03f, +2.025042745e-03f, +9.857677594e-03f, +1.577004950e-02f, +1.051359916e-02f, -9.050215191e-03f, -3.268302021e-02f, -4.121398732e-02f, -2.219202164e-02f, +1.649507997e-02f, +4.937572707e-02f, +5.269162666e-02f, +2.398627326e-02f, -1.582628943e-02f, -3.982773181e-02f, -3.600985932e-02f, -1.370026217e-02f, +7.823797235e-03f, +1.587754008e-02f, +1.139162022e-02f, +3.272294941e-03f, -1.372122746e-03f, -1.667266343e-03f, + +3.790875087e-05f, -3.892175321e-05f, -1.923065421e-04f, -2.627173228e-04f, -5.943000741e-05f, +3.957035450e-04f, +7.612744370e-04f, +6.116544888e-04f, -1.298019927e-04f, -9.917183406e-04f, -1.274294983e-03f, -6.632825249e-04f, +4.379841389e-04f, +1.214094808e-03f, +1.123958007e-03f, +3.328450618e-04f, -4.916688586e-04f, -7.834239334e-04f, -4.996773867e-04f, -2.596160801e-05f, +2.457957871e-04f, +2.224951841e-04f, +6.930253702e-05f, -3.037356937e-05f, + /* 4,20 (24) */ + +8.344607421e-04f, +2.025014965e-03f, +1.956569408e-03f, -1.967947983e-03f, -1.073590045e-02f, -2.061962612e-02f, -2.229224948e-02f, -4.380256706e-03f, +3.934276690e-02f, +1.033581551e-01f, +1.695489983e-01f, +2.141959556e-01f, +2.196252324e-01f, +1.836168334e-01f, +1.206157061e-01f, +5.396374334e-02f, +4.111596385e-03f, -2.004348233e-02f, -2.226408514e-02f, -1.338087765e-02f, -3.751162783e-03f, +1.428761982e-03f, +2.225118278e-03f, +1.129320071e-03f, + -3.459900040e-05f, -3.094960441e-05f, +4.767493968e-05f, +2.001049506e-04f, +3.257319050e-04f, +2.445308031e-04f, -1.897645857e-04f, -9.432155588e-04f, -1.737726042e-03f, -2.153001849e-03f, -1.862960013e-03f, -8.604448044e-04f, +4.926050893e-04f, +1.643542021e-03f, +2.150265936e-03f, +1.910956455e-03f, +1.179702524e-03f, +3.770566444e-04f, -1.610279801e-04f, -3.320397166e-04f, -2.450794304e-04f, -8.538233747e-05f, +1.784375216e-05f, +3.861828455e-05f, + -1.421726499e-03f, -1.733518483e-03f, +1.832736202e-03f, +9.594960272e-03f, +1.571061949e-02f, +1.090930271e-02f, -8.288940755e-03f, -3.207136572e-02f, -4.134378931e-02f, -2.318373998e-02f, +1.522078498e-02f, +4.871244454e-02f, +5.312961080e-02f, +2.520036807e-02f, -1.470233142e-02f, -3.949488675e-02f, -3.650152818e-02f, -1.448368610e-02f, +7.324119848e-03f, +1.585157847e-02f, +1.163741601e-02f, +3.494790125e-03f, -1.302820209e-03f, -1.697639913e-03f, + +3.859740791e-05f, -3.491439479e-05f, -1.876302057e-04f, -2.639575569e-04f, -7.057567423e-05f, +3.804182591e-04f, +7.558910313e-04f, +6.263379604e-04f, -1.011743441e-04f, -9.702693474e-04f, -1.279158464e-03f, -6.935925692e-04f, +4.042217537e-04f, +1.201805585e-03f, +1.140069105e-03f, +3.619518359e-04f, -4.721730237e-04f, -7.842547396e-04f, -5.139163346e-04f, -3.912729931e-05f, +2.421576681e-04f, +2.263577172e-04f, +7.393604918e-05f, -2.889064834e-05f, + /* 4,21 (24) */ + +7.998617417e-04f, +1.994065361e-03f, +2.004244348e-03f, -1.767843033e-03f, -1.041016855e-02f, -2.037509531e-02f, -2.248201407e-02f, -5.323472265e-03f, +3.760504086e-02f, +1.012051532e-01f, +1.676860383e-01f, +2.133355108e-01f, +2.201178375e-01f, +1.852603754e-01f, +1.227659721e-01f, +5.587469979e-02f, +5.291298910e-03f, -1.966642569e-02f, -2.242511312e-02f, -1.371291737e-02f, -3.996242213e-03f, +1.343379644e-03f, +2.242962030e-03f, +1.167938356e-03f, + -3.400200914e-05f, -3.200478532e-05f, +4.386922233e-05f, +1.949481748e-04f, +3.239287962e-04f, +2.519760951e-04f, -1.705497664e-04f, -9.170397892e-04f, -1.716411240e-03f, -2.149647103e-03f, -1.883787917e-03f, -8.997395766e-04f, +4.504676821e-04f, +1.615751341e-03f, +2.146215229e-03f, +1.927899717e-03f, +1.205845271e-03f, +3.993520395e-04f, -1.498832080e-04f, -3.315287539e-04f, -2.498215151e-04f, -8.992255611e-05f, +1.596818006e-05f, +3.888335807e-05f, + -1.383129091e-03f, -1.768432878e-03f, +1.645105997e-03f, +9.331002715e-03f, +1.564004381e-02f, +1.128972097e-02f, -7.533049723e-03f, -3.144502776e-02f, -4.144496366e-02f, -2.415400933e-02f, +1.394162652e-02f, +4.801885197e-02f, +5.353383256e-02f, +2.640217365e-02f, -1.356226232e-02f, -3.913293491e-02f, -3.697370120e-02f, -1.526794084e-02f, +6.810203513e-03f, +1.581245117e-02f, +1.187957368e-02f, +3.721147842e-03f, -1.228884160e-03f, -1.726530561e-03f, + +3.919449805e-05f, -3.099874700e-05f, -1.828842697e-04f, -2.649162596e-04f, -8.143924587e-05f, +3.650699852e-04f, +7.499844418e-04f, +6.403861531e-04f, -7.270907003e-05f, -9.482401246e-04f, -1.283082020e-03f, -7.233622306e-04f, +3.701425216e-04f, +1.188611921e-03f, +1.155433287e-03f, +3.910129090e-04f, -4.521185823e-04f, -7.844769221e-04f, -5.279556008e-04f, -5.251044389e-05f, +2.382054290e-04f, +2.300859391e-04f, +7.863176802e-05f, -2.730223042e-05f, + /* 4,22 (24) */ + +7.658597325e-04f, +1.962060576e-03f, +2.048113570e-03f, -1.572894858e-03f, -1.008623975e-02f, -2.012311922e-02f, -2.265256384e-02f, -6.240512054e-03f, +3.588862962e-02f, +9.905550611e-02f, +1.658022504e-01f, +2.124357712e-01f, +2.205683052e-01f, +1.868761267e-01f, +1.249121873e-01f, +5.780259951e-02f, +6.497144181e-03f, -1.926707365e-02f, -2.257499633e-02f, -1.404444612e-02f, -4.246063728e-03f, +1.253457088e-03f, +2.258930210e-03f, +1.206821714e-03f, + -3.338102668e-05f, -3.298402511e-05f, +4.014578915e-05f, +1.897776284e-04f, +3.219276085e-04f, +2.590637962e-04f, -1.516732064e-04f, -8.909294177e-04f, -1.694731869e-03f, -2.145582071e-03f, -1.903881483e-03f, -9.386590117e-04f, +4.081406529e-04f, +1.587310811e-03f, +2.141401579e-03f, +1.944336107e-03f, +1.231913124e-03f, +4.219195767e-04f, -1.383606303e-04f, -3.307541039e-04f, -2.544926232e-04f, -9.452494757e-05f, +1.400572709e-05f, +3.910582102e-05f, + -1.343934593e-03f, -1.799431625e-03f, +1.462221727e-03f, +9.066086455e-03f, +1.555860457e-02f, +1.165479095e-02f, -6.783065281e-03f, -3.080464160e-02f, -4.151767273e-02f, -2.510224946e-02f, +1.265854450e-02f, +4.729548974e-02f, +5.390397508e-02f, +2.759078557e-02f, -1.240682903e-02f, -3.874192200e-02f, -3.742581979e-02f, -1.605241777e-02f, +6.282247912e-03f, +1.575994073e-02f, +1.211777911e-02f, +3.951233781e-03f, -1.150252392e-03f, -1.753832791e-03f, + +3.970202937e-05f, -2.717721072e-05f, -1.780756998e-04f, -2.655982496e-04f, -9.201537813e-05f, +3.496734189e-04f, +7.435661491e-04f, +6.537936395e-04f, -4.442807088e-05f, -9.256514557e-04f, -1.286065738e-03f, -7.525688233e-04f, +3.357730234e-04f, +1.174521759e-03f, +1.170034648e-03f, +4.200043158e-04f, -4.315170851e-04f, -7.840832211e-04f, -5.417797710e-04f, -6.610206861e-05f, +2.339367939e-04f, +2.336725808e-04f, +8.338555042e-05f, -2.560730777e-05f, + /* 4,23 (24) */ + +7.324787058e-04f, +1.929076550e-03f, +2.088259360e-03f, -1.383117230e-03f, -9.764312144e-03f, -1.986405542e-02f, -2.280423704e-02f, -7.131441472e-03f, +3.419389775e-02f, +9.690992404e-02f, +1.638983689e-01f, +2.114971122e-01f, +2.209764458e-01f, +1.884634375e-01f, +1.270535889e-01f, +5.974693562e-02f, +7.729057306e-03f, -1.884515407e-02f, -2.271335696e-02f, -1.437520023e-02f, -4.500556352e-03f, +1.158932141e-03f, +2.272935938e-03f, +1.245927535e-03f, + -3.273766594e-05f, -3.388863118e-05f, +3.650581267e-05f, +1.845979867e-04f, +3.197345265e-04f, +2.657969177e-04f, -1.331393484e-04f, -8.648963243e-04f, -1.672701532e-03f, -2.140813622e-03f, -1.923235351e-03f, -9.771873217e-04f, +3.656417317e-04f, +1.558230343e-03f, +2.135822399e-03f, +1.960253585e-03f, +1.257892630e-03f, +4.447517036e-04f, -1.264596862e-04f, -3.297101550e-04f, -2.590870968e-04f, -9.918700977e-05f, +1.195577071e-05f, +3.928394304e-05f, + -1.304232564e-03f, -1.826608836e-03f, +1.284146027e-03f, +8.800488206e-03f, +1.546658919e-02f, +1.200446437e-02f, -6.039499132e-03f, -3.015084797e-02f, -4.156210080e-02f, -2.602790091e-02f, +1.137247876e-02f, +4.654292092e-02f, +5.423974810e-02f, +2.876530733e-02f, -1.123679438e-02f, -3.832191769e-02f, -3.785733687e-02f, -1.683650099e-02f, +5.740468141e-03f, +1.569383866e-02f, +1.235171590e-02f, +4.184906362e-03f, -1.066866841e-03f, -1.779440099e-03f, + +4.012208559e-05f, -2.345201148e-05f, -1.732113900e-04f, -2.660085539e-04f, -1.022990993e-04f, +3.342431068e-04f, +7.366479792e-04f, +6.665556153e-04f, -1.635293224e-05f, -9.025245021e-04f, -1.288110505e-03f, -7.811901687e-04f, +3.011401031e-04f, +1.159543829e-03f, +1.183857869e-03f, +4.489019999e-04f, -4.103806698e-04f, -7.830668693e-04f, -5.553734415e-04f, -7.989285652e-05f, +2.293497828e-04f, +2.371103885e-04f, +8.819308537e-05f, -2.380499576e-05f, + /* 4,24 (24) */ + +6.997410399e-04f, +1.895187919e-03f, +2.124765172e-03f, -1.198519243e-03f, -9.444577618e-03f, -1.959825850e-02f, -2.293737639e-02f, -7.996337796e-03f, +3.252119622e-02f, +9.476911042e-02f, +1.619751336e-01f, +2.105199249e-01f, +2.213420876e-01f, +1.900216679e-01f, +1.291894113e-01f, +6.170718920e-02f, +8.986949936e-03f, -1.840040237e-02f, -2.283981665e-02f, -1.470491038e-02f, -4.759643448e-03f, +1.059745131e-03f, +2.284891708e-03f, +1.285211478e-03f, + -3.207352022e-05f, -3.471995310e-05f, +3.295036037e-05f, +1.794138276e-04f, +3.173557501e-04f, +2.721786476e-04f, -1.149523721e-04f, -8.389522168e-04f, -1.650333910e-03f, -2.135348947e-03f, -1.941844558e-03f, -1.015308940e-03f, +3.229887474e-04f, +1.528520206e-03f, +2.129475483e-03f, +1.975640291e-03f, +1.283770252e-03f, +4.678406184e-04f, -1.141800434e-04f, -3.283913767e-04f, -2.635992146e-04f, -1.039061266e-04f, +9.817759973e-06f, +3.941599517e-05f, + -1.264110478e-03f, -1.850060847e-03f, +1.110934637e-03f, +8.534479652e-03f, +1.536429009e-02f, +1.233870748e-02f, -5.302851153e-03f, -2.948429235e-02f, -4.157845373e-02f, -2.693042541e-02f, +1.008436826e-02f, +4.576173075e-02f, +5.454088820e-02f, +2.992485116e-02f, -1.005293651e-02f, -3.787301569e-02f, -3.826771754e-02f, -1.761956786e-02f, +5.185094700e-03f, +1.561394580e-02f, +1.258106569e-02f, +4.422016750e-03f, -9.786737559e-04f, -1.803245095e-03f, + +4.045682146e-05f, -1.982520010e-05f, -1.682981552e-04f, -2.661523987e-04f, -1.122858102e-04f, +3.187934335e-04f, +7.292420878e-04f, +6.786678989e-04f, +1.149509324e-05f, -8.788807818e-04f, -1.289218010e-03f, -8.092046148e-04f, +2.662708436e-04f, +1.143687639e-03f, +1.196888238e-03f, +4.776818356e-04f, -3.887220543e-04f, -7.814216028e-04f, -5.687212344e-04f, -9.387315197e-05f, +2.244427192e-04f, +2.403921319e-04f, +9.304989612e-05f, -2.189453686e-05f, + /* 4,25 (24) */ + +6.676675197e-04f, +1.860467966e-03f, +2.157715533e-03f, -1.019105415e-03f, -9.127221868e-03f, -1.932607986e-02f, -2.305232876e-02f, -8.835290013e-03f, +3.087086231e-02f, +9.263376147e-02f, +1.600332890e-01f, +2.095046159e-01f, +2.216650763e-01f, +1.915501881e-01f, +1.313188867e-01f, +6.368282949e-02f, +1.027072019e-02f, -1.793256175e-02f, -2.295399669e-02f, -1.503330176e-02f, -5.023242663e-03f, +9.558390041e-04f, +2.294709468e-03f, +1.324627473e-03f, + -3.139016191e-05f, -3.547938035e-05f, +2.948039595e-05f, +1.742296298e-04f, +3.147974895e-04f, +2.782123463e-04f, -9.711619491e-05f, -8.131086244e-04f, -1.627642745e-03f, -2.129195558e-03f, -1.959704540e-03f, -1.053008532e-03f, +2.801996166e-04f, +1.498191019e-03f, +2.122359012e-03f, +1.990484565e-03f, +1.309532375e-03f, +4.911782716e-04f, -1.015216012e-04f, -3.267923248e-04f, -2.680231957e-04f, -1.086795681e-04f, +7.591217706e-06f, +3.950025171e-05f, + -1.223653657e-03f, -1.869886047e-03f, +9.426364820e-04f, +8.268327253e-03f, +1.525200428e-02f, +1.265750091e-02f, -4.573609065e-03f, -2.880562445e-02f, -4.156695864e-02f, -2.780930619e-02f, +8.795150246e-03f, +4.495252614e-02f, +5.480715905e-02f, +3.106853880e-02f, -8.856048273e-03f, -3.739533385e-02f, -3.865643960e-02f, -1.840098946e-02f, +4.616373465e-03f, +1.552007265e-02f, +1.280550840e-02f, +4.662408882e-03f, -8.856238598e-04f, -1.825139632e-03f, + +4.070845819e-05f, -1.629865360e-05f, -1.633427247e-04f, -2.660352008e-04f, -1.219712837e-04f, +3.033386091e-04f, +7.213609453e-04f, +6.901269306e-04f, +3.909510354e-05f, -8.547421485e-04f, -1.289390737e-03f, -8.365910557e-04f, +2.311925422e-04f, +1.126963471e-03f, +1.209111664e-03f, +5.063196498e-04f, -3.665545286e-04f, -7.791416723e-04f, -5.818078140e-04f, -1.080329663e-04f, +2.192142359e-04f, +2.435106135e-04f, +9.795134253e-05f, -1.987530445e-05f, + /* 4,26 (24) */ + +6.362773578e-04f, +1.824988586e-03f, +2.187195929e-03f, -8.448757855e-04f, -8.812424378e-03f, -1.904786751e-02f, -2.314944496e-02f, -9.648398637e-03f, +2.924321956e-02f, +9.050456591e-02f, +1.580735845e-01f, +2.084516074e-01f, +2.219452759e-01f, +1.930483791e-01f, +1.334412458e-01f, +6.567331406e-02f, +1.158025256e-02f, -1.744138348e-02f, -2.305551829e-02f, -1.536009408e-02f, -5.291265859e-03f, +8.471594361e-04f, +2.302300686e-03f, +1.364127725e-03f, + -3.068914123e-05f, -3.616833997e-05f, +2.609678061e-05f, +1.690497713e-04f, +3.120659607e-04f, +2.839015417e-04f, -7.963447218e-05f, -7.873768925e-04f, -1.604641837e-03f, -2.122361275e-03f, -1.976811134e-03f, -1.090271000e-03f, +2.372923342e-04f, +1.467253741e-03f, +2.114471558e-03f, +2.004774947e-03f, +1.335165314e-03f, +5.147563692e-04f, -8.848449348e-05f, -3.249076470e-04f, -2.723532024e-04f, -1.135044900e-04f, +5.275742626e-06f, +3.953499220e-05f, + -1.182945199e-03f, -1.886184701e-03f, +7.792937573e-04f, +8.002292052e-03f, +1.513003300e-02f, +1.296083952e-02f, -3.852248120e-03f, -2.811549752e-02f, -4.152786353e-02f, -2.866404834e-02f, +7.505759509e-03f, +4.411593508e-02f, +5.503835159e-02f, +3.219550227e-02f, -7.646936609e-03f, -3.688901420e-02f, -3.902299412e-02f, -1.918013113e-02f, +4.034565651e-03f, +1.541203968e-02f, +1.302472264e-02f, +4.905919496e-03f, -7.876725172e-04f, -1.845014936e-03f, + +4.087927890e-05f, -1.287407632e-05f, -1.583517357e-04f, -2.656625581e-04f, -1.313516642e-04f, +2.878926567e-04f, +7.130173215e-04f, +7.009297703e-04f, +6.642656459e-05f, -8.301307690e-04f, -1.288631960e-03f, -8.633289495e-04f, +1.959326858e-04f, +1.109382373e-03f, +1.220514691e-03f, +5.347912450e-04f, -3.438919470e-04f, -7.762218530e-04f, -5.946179023e-04f, -1.223619839e-04f, +2.136632816e-04f, +2.464586776e-04f, +1.028926238e-04f, -1.774680651e-05f, + /* 4,27 (24) */ + +6.055882166e-04f, +1.788820246e-03f, +2.213292709e-03f, -6.758260142e-04f, -8.500358418e-03f, -1.876396597e-02f, -2.322907943e-02f, -1.043577553e-02f, +2.763857773e-02f, +8.838220464e-02f, +1.560967734e-01f, +2.073613364e-01f, +2.221825683e-01f, +1.945156329e-01f, +1.355557173e-01f, +6.767808900e-02f, +1.291541788e-02f, -1.692662711e-02f, -2.314400279e-02f, -1.568500173e-02f, -5.563619061e-03f, +7.336549461e-04f, +2.307576429e-03f, +1.403662717e-03f, + -2.997198507e-05f, -3.678829431e-05f, +2.280027447e-05f, +1.638785275e-04f, +3.091673808e-04f, +2.892499246e-04f, -6.251059783e-05f, -7.617681777e-04f, -1.581345032e-03f, -2.114854228e-03f, -1.993160576e-03f, -1.127081495e-03f, +1.942849625e-04f, +1.435719672e-03f, +2.105812081e-03f, +2.018500186e-03f, +1.360655321e-03f, +5.385663751e-04f, -7.506909163e-05f, -3.227320879e-04f, -2.765833440e-04f, -1.183779345e-04f, +2.871011414e-06f, +3.951850337e-05f, + -1.142065920e-03f, -1.899058777e-03f, +6.209420216e-04f, +7.736629494e-03f, +1.499868133e-02f, +1.324873218e-02f, -3.139230798e-03f, -2.741456775e-02f, -4.146143697e-02f, -2.949417911e-02f, +6.217127549e-03f, +4.325260613e-02f, +5.523428428e-02f, +3.330488464e-02f, -6.426421918e-03f, -3.635422296e-02f, -3.936688607e-02f, -1.995635298e-02f, +3.439947749e-03f, +1.528967770e-02f, +1.323838592e-02f, +5.152378173e-03f, -6.847798935e-04f, -1.862761743e-03f, + +4.097162398e-05f, -9.553001232e-06f, -1.533317275e-04f, -2.650402404e-04f, -1.404234661e-04f, +2.724694003e-04f, +7.042242699e-04f, +7.110740955e-04f, +9.346932708e-05f, -8.050691020e-04f, -1.286945741e-03f, -8.893983368e-04f, +1.605189261e-04f, +1.090956146e-03f, +1.231084514e-03f, +5.630724209e-04f, -3.207487185e-04f, -7.726574551e-04f, -6.071362952e-04f, -1.368495688e-04f, +2.077891270e-04f, +2.492292190e-04f, +1.078687810e-04f, -1.550868921e-05f, + /* 4,28 (24) */ + +5.756162315e-04f, +1.752031952e-03f, +2.236092984e-03f, -5.119474867e-04f, -8.191191037e-03f, -1.847471604e-02f, -2.329159003e-02f, -1.119754371e-02f, +2.605723269e-02f, +8.626735041e-02f, +1.541036128e-01f, +2.062342549e-01f, +2.223768532e-01f, +1.959513525e-01f, +1.376615294e-01f, +6.969658919e-02f, +1.427607320e-02f, -1.638806074e-02f, -2.321907188e-02f, -1.600773382e-02f, -5.840202405e-03f, +6.152770116e-04f, +2.310447440e-03f, +1.443181221e-03f, + -2.924019581e-05f, -3.734073876e-05f, +1.959153804e-05f, +1.587200698e-04f, +3.061079629e-04f, +2.942613438e-04f, -4.574770527e-05f, -7.362934421e-04f, -1.557766215e-03f, -2.106682842e-03f, -2.008749506e-03f, -1.163425423e-03f, +1.511956212e-04f, +1.403600444e-03f, +2.096379936e-03f, +2.031649253e-03f, +1.385988598e-03f, +5.625995143e-04f, -6.127600737e-05f, -3.202604942e-04f, -2.807076808e-04f, -1.232968301e-04f, +3.767807771e-07f, +3.944908116e-05f, + -1.101094296e-03f, -1.908611778e-03f, +4.676102941e-04f, +7.471589254e-03f, +1.485825787e-02f, +1.352120158e-02f, -2.435006529e-03f, -2.670349365e-02f, -4.136796764e-02f, -3.029924821e-02f, +4.930181808e-03f, +4.236320779e-02f, +5.539480320e-02f, +3.439584079e-02f, -5.195337404e-03f, -3.579115054e-02f, -3.968763479e-02f, -2.072901044e-02f, +2.832811454e-03f, +1.515282813e-02f, +1.344617505e-02f, +5.401607392e-03f, -5.769111124e-04f, -1.878270432e-03f, + +4.098788653e-05f, -6.336791463e-06f, -1.482891349e-04f, -2.641741805e-04f, -1.491835725e-04f, +2.570824535e-04f, +6.949951116e-04f, +7.205581984e-04f, +1.202036428e-04f, -7.795798755e-04f, -1.284336918e-03f, -9.147798576e-04f, +1.249790545e-04f, +1.071697343e-03f, +1.240808997e-03f, +5.911389977e-04f, -2.971397975e-04f, -7.684443329e-04f, -6.193478786e-04f, -1.514847712e-04f, +2.015913700e-04f, +2.518151926e-04f, +1.128747009e-04f, -1.316074035e-05f, + /* 4,29 (24) */ + +5.463760357e-04f, +1.714691213e-03f, +2.255684522e-03f, -3.532274169e-04f, -7.885083074e-03f, -1.818045470e-02f, -2.333733773e-02f, -1.193383715e-02f, +2.449946648e-02f, +8.416066757e-02f, +1.520948633e-01f, +2.050708295e-01f, +2.225280488e-01f, +1.973549530e-01f, +1.397579093e-01f, +7.172823844e-02f, +1.566206180e-02f, -1.582546122e-02f, -2.328034788e-02f, -1.632799431e-02f, -6.120910086e-03f, +4.919801815e-04f, +2.310824221e-03f, +1.482630302e-03f, + -2.849525023e-05f, -3.782719946e-05f, +1.647113367e-05f, +1.535784642e-04f, +3.028939125e-04f, +2.989398010e-04f, -2.934866841e-05f, -7.109634486e-04f, -1.533919301e-03f, -2.097855838e-03f, -2.023574966e-03f, -1.199288455e-03f, +1.080424771e-04f, +1.370908015e-03f, +2.086174875e-03f, +2.044211344e-03f, +1.411151296e-03f, +5.868467756e-04f, -4.710609530e-05f, -3.174878198e-04f, -2.847202272e-04f, -1.282579919e-04f, -2.207110546e-06f, +3.932503274e-05f, + -1.060106409e-03f, -1.914948570e-03f, +3.193211593e-04f, +7.207415073e-03f, +1.470907429e-02f, +1.377828403e-02f, -1.740011417e-03f, -2.598293546e-02f, -4.124776400e-02f, -3.107882809e-02f, +3.645844890e-03f, +4.144842794e-02f, +5.551978226e-02f, +3.546753813e-02f, -3.954528407e-03f, -3.520001154e-02f, -3.998477459e-02f, -2.149745477e-02f, +2.213463575e-03f, +1.500134336e-02f, +1.364776642e-02f, +5.653422585e-03f, -4.640364116e-04f, -1.891431172e-03f, + +4.093050783e-05f, -3.226641988e-06f, -1.432302827e-04f, -2.630704645e-04f, -1.576292334e-04f, +2.417452079e-04f, +6.853434200e-04f, +7.293809816e-04f, +1.466101804e-04f, -7.536860648e-04f, -1.280811105e-03f, -9.394547681e-04f, +8.934097687e-05f, +1.051619252e-03f, +1.249676678e-03f, +6.189668383e-04f, -2.730806734e-04f, -7.635788941e-04f, -6.312376447e-04f, -1.662563353e-04f, +1.950699416e-04f, +2.542096223e-04f, +1.179051185e-04f, -1.070289269e-05f, + /* 4,30 (24) */ + +5.178807854e-04f, +1.676864013e-03f, +2.272155655e-03f, -1.996489527e-04f, -7.582189161e-03f, -1.788151490e-02f, -2.336668640e-02f, -1.264480060e-02f, +2.296554718e-02f, +8.206281173e-02f, +1.500712883e-01f, +2.038715410e-01f, +2.226360913e-01f, +1.987258610e-01f, +1.418440842e-01f, +7.377244979e-02f, +1.707321309e-02f, -1.523861445e-02f, -2.332745398e-02f, -1.664548213e-02f, -6.405630313e-03f, +3.637221897e-04f, +2.308617110e-03f, +1.521955334e-03f, + -2.773859848e-05f, -3.824923106e-05f, +1.343952718e-05f, +1.484576699e-04f, +2.995314222e-04f, +3.032894465e-04f, -1.331610283e-05f, -6.857887560e-04f, -1.509818226e-03f, -2.088382221e-03f, -2.037634402e-03f, -1.234656532e-03f, +6.484373343e-05f, +1.337654664e-03f, +2.075197043e-03f, +2.056175888e-03f, +1.436129532e-03f, +6.112989155e-04f, -3.256045541e-05f, -3.144091316e-04f, -2.886149562e-04f, -1.332581224e-04f, -4.880739804e-06f, +3.914467862e-05f, + -1.019175901e-03f, -1.918175212e-03f, +1.760908766e-04f, +6.944344609e-03f, +1.455144506e-02f, +1.402002924e-02f, -1.054667997e-03f, -2.525355447e-02f, -4.110115382e-02f, -3.183251415e-02f, +2.365033785e-03f, +4.050897317e-02f, +5.560912323e-02f, +3.651915739e-02f, -2.704851729e-03f, -3.458104470e-02f, -4.025785526e-02f, -2.226103367e-02f, +1.582225931e-03f, +1.483508702e-02f, +1.384283636e-02f, +5.907632207e-03f, -3.461312931e-04f, -1.902134065e-03f, + +4.080197272e-05f, -2.235815352e-07f, -1.381613802e-04f, -2.617353228e-04f, -1.657580629e-04f, +2.264708226e-04f, +6.752830043e-04f, +7.375419549e-04f, +1.726700408e-04f, -7.274108696e-04f, -1.276374679e-03f, -9.634049570e-04f, +5.363268835e-05f, +1.030735887e-03f, +1.257676790e-03f, +6.465318711e-04f, -2.485873599e-04f, -7.580581083e-04f, -6.427907079e-04f, -1.811527070e-04f, +1.882251109e-04f, +2.564056106e-04f, +1.229546211e-04f, -8.135227175e-06f, + /* 4,31 (24) */ + +4.901421870e-04f, +1.638614782e-03f, +2.285595183e-03f, -5.119128274e-05f, -7.282657739e-03f, -1.757822545e-02f, -2.338000250e-02f, -1.333058935e-02f, +2.145572895e-02f, +7.997442951e-02f, +1.480336539e-01f, +2.026368845e-01f, +2.227009351e-01f, +2.000635157e-01f, +1.439192813e-01f, +7.582862567e-02f, +1.850934262e-02f, -1.462731553e-02f, -2.336001444e-02f, -1.695989127e-02f, -6.694245269e-03f, +2.304640673e-04f, +2.303736370e-03f, +1.561100013e-03f, + -2.697166309e-05f, -3.860841448e-05f, +1.049708950e-05f, +1.433615383e-04f, +2.960266674e-04f, +3.073145736e-04f, +2.347632839e-06f, -6.607797145e-04f, -1.485476938e-03f, -2.078271276e-03f, -2.050925659e-03f, -1.269515872e-03f, +2.161761953e-05f, +1.303852983e-03f, +2.063446989e-03f, +2.067532558e-03f, +1.460909391e-03f, +6.359464612e-04f, -1.764043540e-05f, -3.110196137e-04f, -2.923858025e-04f, -1.382938117e-04f, -7.644098300e-06f, +3.890635472e-05f, + -9.783739287e-04f, -1.918398793e-03f, +3.792949637e-05f, +6.682609286e-03f, +1.438568700e-02f, +1.424650006e-02f, -3.793849927e-04f, -2.451601252e-02f, -4.092848378e-02f, -3.255992502e-02f, +1.088659106e-03f, +3.954556821e-02f, +5.566275592e-02f, +3.754989327e-02f, -1.447174939e-03f, -3.393451283e-02f, -4.050644262e-02f, -2.301909178e-02f, +9.394352227e-04f, +1.465393432e-02f, +1.403106147e-02f, +6.164037818e-03f, -2.231766720e-04f, -1.910269292e-03f, + +4.060480517e-05f, +2.671525331e-06f, -1.330885160e-04f, -2.601751204e-04f, -1.735680368e-04f, +2.112722132e-04f, +6.648278939e-04f, +7.450412298e-04f, +1.983647722e-04f, -7.007776918e-04f, -1.271034774e-03f, -9.866129608e-04f, +1.788224777e-05f, +1.009061979e-03f, +1.264799271e-03f, +6.738101129e-04f, -2.236763837e-04f, -7.518795146e-04f, -6.539923216e-04f, -1.961620417e-04f, +1.810574896e-04f, +2.583963475e-04f, +1.280176524e-04f, -5.457975959e-06f, + /* 5, 0 (24) */ + -3.157209003e-04f, +2.200933252e-03f, +6.514604421e-03f, +7.225487889e-03f, -2.813138603e-03f, -2.309221197e-02f, -3.776234036e-02f, -2.075986699e-02f, +4.463545552e-02f, +1.458003526e-01f, +2.399263239e-01f, +2.784031908e-01f, +2.399263239e-01f, +1.458003526e-01f, +4.463545552e-02f, -2.075986699e-02f, -3.776234036e-02f, -2.309221197e-02f, -2.813138603e-03f, +7.225487889e-03f, +6.514604421e-03f, +2.200933252e-03f, -3.157209003e-04f, -4.745985996e-04f, + -3.344837876e-05f, -1.203735541e-04f, -1.201025358e-04f, +1.113283129e-04f, +5.071816554e-04f, +6.716327570e-04f, +1.159330534e-04f, -1.237233007e-03f, -2.741342671e-03f, -3.328246260e-03f, -2.312914962e-03f, -3.949986729e-05f, +2.256128833e-03f, +3.321960433e-03f, +2.779048968e-03f, +1.287112166e-03f, -8.426151525e-05f, -6.671755267e-04f, -5.185867868e-04f, -1.224586306e-04f, +1.168135820e-04f, +1.225914265e-04f, +3.593688915e-05f, -1.363314209e-05f, + -1.065756848e-03f, -5.278430402e-03f, -6.652854040e-03f, +2.225777551e-03f, +1.817429953e-02f, +2.347202169e-02f, +3.321147688e-03f, -3.097435754e-02f, -4.527341035e-02f, -1.784651672e-02f, +3.123613533e-02f, +5.568063817e-02f, +3.123613533e-02f, -1.784651672e-02f, -4.527341035e-02f, -3.097435754e-02f, +3.321147688e-03f, +2.347202169e-02f, +1.817429953e-02f, +2.225777551e-03f, -6.652854040e-03f, -5.278430402e-03f, -1.065756848e-03f, +4.898976646e-04f, + +9.908417991e-05f, +1.330920197e-04f, -8.725054394e-05f, -4.448139414e-04f, -4.501546129e-04f, +1.925170661e-04f, +9.852348420e-04f, +9.604702507e-04f, -1.665956790e-04f, -1.399459798e-03f, -1.397566761e-03f, -2.620026282e-05f, +1.371426028e-03f, +1.423191721e-03f, +2.113441000e-04f, -9.398775262e-04f, -1.001351655e-03f, -2.198341146e-04f, +4.396205809e-04f, +4.531964488e-04f, +9.822200801e-05f, -1.306068552e-04f, -1.022919954e-04f, -4.211524069e-06f, + /* 5, 1 (24) */ + -3.491692790e-04f, +2.080559698e-03f, +6.394501885e-03f, +7.336816202e-03f, -2.305956948e-03f, -2.242057921e-02f, -3.764640731e-02f, -2.199710000e-02f, +4.189411285e-02f, +1.424721063e-01f, +2.376134089e-01f, +2.783636910e-01f, +2.421824527e-01f, +1.491223130e-01f, +4.741450448e-02f, -1.947275482e-02f, -3.784660187e-02f, -2.375938750e-02f, -3.331725390e-03f, +7.103029259e-03f, +6.631418003e-03f, +2.323524679e-03f, -2.797840111e-04f, -4.882317417e-04f, + -3.100945145e-05f, -1.180738813e-04f, -1.231474882e-04f, +1.003898453e-04f, +4.955618386e-04f, +6.753511633e-04f, +1.467591928e-04f, -1.187542172e-03f, -2.702707759e-03f, -3.332873833e-03f, -2.368390551e-03f, -1.184764218e-04f, +2.198061489e-03f, +3.314009081e-03f, +2.815793091e-03f, +1.337148185e-03f, -5.175319886e-05f, -6.619669015e-04f, -5.297602692e-04f, -1.337733593e-04f, +1.132776529e-04f, +1.247218530e-04f, +3.847281259e-05f, -1.306337424e-05f, + -9.666726676e-04f, -5.145338382e-03f, -6.740104584e-03f, +1.780963610e-03f, +1.772414492e-02f, +2.366453876e-02f, +4.306382530e-03f, -3.001388729e-02f, -4.544000602e-02f, -1.924597652e-02f, +2.983856857e-02f, +5.565443791e-02f, +3.260756136e-02f, -1.642332500e-02f, -4.506206625e-02f, -3.191423507e-02f, +2.319796034e-03f, +2.325218758e-02f, +1.861392011e-02f, +2.678974000e-03f, -6.554632032e-03f, -5.409037257e-03f, -1.168048843e-03f, +4.856861405e-04f, + +9.582297529e-05f, +1.353001982e-04f, -7.645233616e-05f, -4.360731296e-04f, -4.599789698e-04f, +1.653967645e-04f, +9.682574761e-04f, +9.798613549e-04f, -1.219875182e-04f, -1.374406946e-03f, -1.422226433e-03f, -7.857232390e-05f, +1.343829552e-03f, +1.445570939e-03f, +2.561839252e-04f, -9.180958213e-04f, -1.016579433e-03f, -2.473179135e-04f, +4.283780575e-04f, +4.612023484e-04f, +1.093551967e-04f, -1.278408987e-04f, -1.054388668e-04f, -6.384690347e-06f, + /* 5, 2 (24) */ + -3.801787305e-04f, +1.962485817e-03f, +6.271354397e-03f, +7.437206048e-03f, -1.810395109e-03f, -2.174522805e-02f, -3.749964811e-02f, -2.318464217e-02f, +3.919140509e-02f, +1.391392325e-01f, +2.352450184e-01f, +2.782452146e-01f, +2.443805142e-01f, +1.524363221e-01f, +5.023029758e-02f, -1.813560664e-02f, -3.789835507e-02f, -2.442135440e-02f, -3.861485659e-03f, +6.969255899e-03f, +6.744695656e-03f, +2.448246532e-03f, -2.413111985e-04f, -5.012951160e-04f, + -2.862214005e-05f, -1.156980079e-04f, -1.259516305e-04f, +8.965028562e-05f, +4.837441552e-04f, +6.783437400e-04f, +1.767321185e-04f, -1.138070623e-03f, -2.663178182e-03f, -3.335851552e-03f, -2.422527267e-03f, -1.973834540e-04f, +2.138743223e-03f, +3.304386071e-03f, +2.851541903e-03f, +1.387309121e-03f, -1.841753301e-05f, -6.559947516e-04f, -5.406850090e-04f, -1.452646791e-04f, +1.094920003e-04f, +1.267591490e-04f, +4.105384145e-05f, -1.243525760e-05f, + -8.708496923e-04f, -5.010038184e-03f, -6.816556920e-03f, +1.344890481e-03f, +1.726416595e-02f, +2.382993552e-02f, +5.274640006e-03f, -2.903402594e-02f, -4.556199354e-02f, -2.062038347e-02f, +2.841634214e-02f, +5.557586558e-02f, +3.395139091e-02f, -1.497775406e-02f, -4.480588232e-02f, -3.283233089e-02f, +1.303216601e-03f, +2.300486966e-02f, +1.904229817e-02f, +3.140176349e-03f, -6.445276836e-03f, -5.536878156e-03f, -1.273487710e-03f, +4.793014501e-04f, + +9.251582846e-05f, +1.372355424e-04f, -6.583842639e-05f, -4.269924794e-04f, -4.690934086e-04f, +1.385025771e-04f, +9.504487886e-04f, +9.980397348e-04f, -7.756801037e-05f, -1.348066343e-03f, -1.445381490e-03f, -1.308590259e-04f, +1.314804383e-03f, +1.466567125e-03f, +3.010658936e-04f, -8.951393075e-04f, -1.030890490e-03f, -2.749378696e-04f, +4.164291790e-04f, +4.688135280e-04f, +1.206380968e-04f, -1.247907041e-04f, -1.085171417e-04f, -8.647893339e-06f, + /* 5, 3 (24) */ + -4.088008705e-04f, +1.846787809e-03f, +6.145402767e-03f, +7.526856333e-03f, -1.326650954e-03f, -2.106688431e-02f, -3.732291599e-02f, -2.432271279e-02f, +3.652822691e-02f, +1.358033809e-01f, +2.328224911e-01f, +2.780478311e-01f, +2.465192574e-01f, +1.557407082e-01f, +5.308183948e-02f, -1.674829752e-02f, -3.791677261e-02f, -2.507734915e-02f, -4.402170668e-03f, +6.823991220e-03f, +6.854187656e-03f, +2.575005681e-03f, -2.002573571e-04f, -5.137303736e-04f, + -2.628834081e-05f, -1.132514817e-04f, -1.285183626e-04f, +7.911631081e-05f, +4.717452654e-04f, +6.806238860e-04f, +2.058448186e-04f, -1.088848800e-03f, -2.622788251e-03f, -3.337188933e-03f, -2.475297788e-03f, -2.761746757e-04f, +2.078205281e-03f, +3.293086424e-03f, +2.886262718e-03f, +1.437562572e-03f, +1.573524375e-05f, -6.492474063e-04f, -5.513437972e-04f, -1.569243904e-04f, +1.054541107e-04f, +1.286975968e-04f, +4.367753023e-05f, -1.174769073e-05f, + -7.783338639e-04f, -4.872802642e-03f, -6.882395347e-03f, +9.178980012e-04f, +1.679507254e-02f, +2.396843810e-02f, +6.225088795e-03f, -2.803598620e-02f, -4.563956155e-02f, -2.196844981e-02f, +2.697096065e-02f, +5.544500656e-02f, +3.526619530e-02f, -1.351118694e-02f, -4.450481643e-02f, -3.372747020e-02f, +2.723261116e-04f, +2.272993179e-02f, +1.945872735e-02f, +3.608989877e-03f, -6.324638739e-03f, -5.661668860e-03f, -1.382004851e-03f, +4.706535568e-04f, + +8.917006763e-05f, +1.389025366e-04f, -5.541935889e-05f, -4.175905900e-04f, -4.774986143e-04f, +1.118632115e-04f, +9.318387172e-04f, +1.014995825e-03f, -3.338502793e-05f, -1.320472530e-03f, -1.467010163e-03f, -1.830035781e-04f, +1.284379276e-03f, +1.486151448e-03f, +3.459403981e-04f, -8.710236820e-04f, -1.044257977e-03f, -3.026628272e-04f, +4.037770445e-04f, +4.760120962e-04f, +1.320582228e-04f, -1.214531979e-04f, -1.115190818e-04f, -1.099953653e-05f, + /* 5, 4 (24) */ + -4.350892113e-04f, +1.733536327e-03f, +6.016884404e-03f, +7.605972644e-03f, -8.549056885e-04f, -2.038626042e-02f, -3.711707118e-02f, -2.541156159e-02f, +3.390543865e-02f, +1.324661920e-01f, +2.303471933e-01f, +2.777716564e-01f, +2.485974627e-01f, +1.590337946e-01f, +5.596810220e-02f, -1.531073495e-02f, -3.790103736e-02f, -2.572659656e-02f, -4.953514465e-03f, +6.667066830e-03f, +6.959641767e-03f, +2.703703278e-03f, -1.565798269e-04f, -5.254780643e-04f, + -2.400981416e-05f, -1.107397924e-04f, -1.308512845e-04f, +6.879421704e-05f, +4.595816567e-04f, +6.822053868e-04f, +2.340910800e-04f, -1.039906603e-03f, -2.581572607e-03f, -3.336896596e-03f, -2.526675818e-03f, -3.548038886e-04f, +2.016479832e-03f, +3.280106316e-03f, +2.919923330e-03f, +1.487875705e-03f, +5.069408217e-05f, -6.417136720e-04f, -5.617193249e-04f, -1.687439147e-04f, +1.011617129e-04f, +1.305314530e-04f, +4.634129554e-05f, -1.099963891e-05f, + -6.891637963e-04f, -4.733900105e-03f, -6.937814706e-03f, +5.003074112e-04f, +1.631757393e-02f, +2.408030131e-02f, +7.156927512e-03f, -2.702099038e-02f, -4.567294658e-02f, -2.328892234e-02f, +2.550395049e-02f, +5.526200298e-02f, +3.655057457e-02f, -1.202503549e-02f, -4.415887603e-02f, -3.459849388e-02f, -7.719318653e-04f, +2.242726897e-02f, +1.986250440e-02f, +4.085001973e-03f, -6.192580516e-03f, -5.783122058e-03f, -1.493523933e-03f, +4.596540203e-04f, + +8.579289225e-05f, +1.403059826e-04f, -4.520517385e-05f, -4.078861655e-04f, -4.851961862e-04f, +8.550668452e-05f, +9.124578601e-04f, +1.030721596e-03f, +1.051413320e-05f, -1.291661356e-03f, -1.487092493e-03f, -2.349493624e-04f, +1.252584658e-03f, +1.504296605e-03f, +3.907575452e-04f, -8.457661589e-04f, -1.056655927e-03f, -3.304611022e-04f, +3.904257248e-04f, +4.827804113e-04f, +1.436026274e-04f, -1.178256924e-04f, -1.144368746e-04f, -1.343779690e-05f, + /* 5, 5 (24) */ + -4.590990255e-04f, +1.622796535e-03f, +5.886033120e-03f, +7.674766861e-03f, -3.953240318e-04f, -1.970405504e-02f, -3.688298010e-02f, -2.645146819e-02f, +3.132386605e-02f, +1.291292954e-01f, +2.278205175e-01f, +2.774168525e-01f, +2.506139425e-01f, +1.623139009e-01f, +5.888802553e-02f, -1.382285924e-02f, -3.785034328e-02f, -2.636831023e-02f, -5.515233790e-03f, +6.498322915e-03f, +7.060803480e-03f, +2.834234731e-03f, -1.102385313e-04f, -5.364777032e-04f, + -2.178818569e-05f, -1.081683664e-04f, -1.329541876e-04f, +5.868992073e-05f, +4.472696310e-04f, +6.831023958e-04f, +2.614654838e-04f, -9.912733666e-04f, -2.539566192e-03f, -3.334986249e-03f, -2.576636113e-03f, -4.332250200e-04f, +1.953599949e-03f, +3.265443094e-03f, +2.952492044e-03f, +1.538215273e-03f, +8.644712225e-05f, -6.333828494e-04f, -5.717941984e-04f, -1.807142965e-04f, +9.661278677e-05f, +1.322549551e-04f, +4.904241628e-05f, -1.019013767e-05f, + -6.033709040e-04f, -4.593594122e-03f, -6.983019879e-03f, +9.242124568e-05f, +1.583237774e-02f, +2.416580800e-02f, +8.069385372e-03f, -2.599026878e-02f, -4.566243245e-02f, -2.458058369e-02f, +2.401685799e-02f, +5.502705362e-02f, +3.780315923e-02f, -1.052073888e-02f, -4.376811848e-02f, -3.544426004e-02f, -1.828587792e-03f, +2.209680786e-02f, +2.025293012e-02f, +4.567782384e-03f, -6.048977889e-03f, -5.900947750e-03f, -1.607960808e-03f, +4.462162234e-04f, + +8.239136339e-05f, +1.414509860e-04f, -3.520540164e-05f, -3.978979866e-04f, -4.921886228e-04f, +5.946029444e-05f, +8.923374305e-04f, +1.045210559e-03f, +5.408280882e-05f, -1.261669934e-03f, -1.505610351e-03f, -2.866400026e-04f, +1.219452595e-03f, +1.520976867e-03f, +4.354672150e-04f, -8.193854588e-04f, -1.068059295e-03f, -3.583005186e-04f, +3.763802705e-04f, +4.891011109e-04f, +1.552579119e-04f, -1.139058979e-04f, -1.172626453e-04f, -1.596062272e-05f, + /* 5, 6 (24) */ + -4.808872112e-04f, +1.514628169e-03f, +5.753078932e-03f, +7.733456782e-03f, +5.194559915e-05f, -1.902095264e-02f, -3.662151461e-02f, -2.744274156e-02f, +2.878429985e-02f, +1.257943092e-01f, +2.252438814e-01f, +2.769836275e-01f, +2.525675425e-01f, +1.655793440e-01f, +6.184051757e-02f, -1.228464397e-02f, -3.776389616e-02f, -2.700169308e-02f, -6.087027988e-03f, +6.317608619e-03f, +7.157416267e-03f, +2.966489686e-03f, -6.119611503e-05f, -5.466678409e-04f, + -1.962494726e-05f, -1.055425602e-04f, -1.348310455e-04f, +4.880895984e-05f, +4.348252911e-04f, +6.833294152e-04f, +2.879634007e-04f, -9.429778464e-04f, -2.496804215e-03f, -3.331470676e-03f, -2.625154490e-03f, -5.113921588e-04f, +1.889599587e-03f, +3.249095277e-03f, +2.983937706e-03f, +1.588547642e-03f, +1.229816938e-04f, -6.242447504e-04f, -5.815509554e-04f, -1.928262058e-04f, +9.180557103e-05f, +1.338623287e-04f, +5.177803395e-05f, -9.318296287e-06f, + -5.209795406e-04f, -4.452143136e-03f, -7.018225281e-03f, -3.054767409e-04f, +1.534018912e-02f, +2.422526829e-02f, +8.961722803e-03f, -2.494505822e-02f, -4.560834964e-02f, -2.584225363e-02f, +2.251124764e-02f, +5.474041361e-02f, +3.902261183e-02f, -8.999762017e-03f, -4.333265127e-02f, -3.626364550e-02f, -2.896647087e-03f, +2.173850735e-02f, +2.062931039e-02f, +5.056883495e-03f, -5.893719977e-03f, -6.014853648e-03f, -1.725223453e-03f, +4.302556006e-04f, + +7.897239447e-05f, +1.423429413e-04f, -2.542905799e-05f, -3.876448820e-04f, -4.984793055e-04f, +3.375059295e-05f, +8.715092103e-04f, +1.058457753e-03f, +9.727502049e-05f, -1.230536590e-03f, -1.522547459e-03f, -3.380194324e-04f, +1.185016751e-03f, +1.536168113e-03f, +4.800191230e-04f, -7.919017969e-04f, -1.078443999e-03f, -3.861484449e-04f, +3.616467182e-04f, +4.949571413e-04f, +1.670102390e-04f, -1.096919351e-04f, -1.199884694e-04f, -1.856573183e-05f, + /* 5, 7 (24) */ + -5.005121585e-04f, +1.409085608e-03f, +5.618247886e-03f, +7.782265742e-03f, +4.867708903e-04f, -1.833762323e-02f, -3.633355121e-02f, -2.838571941e-02f, +2.628749564e-02f, +1.224628385e-01f, +2.226187269e-01f, +2.764722354e-01f, +2.544571421e-01f, +1.688284393e-01f, +6.482445528e-02f, -1.069609633e-02f, -3.764091446e-02f, -2.762593783e-02f, -6.668578944e-03f, +6.124782413e-03f, +7.249221838e-03f, +3.100352015e-03f, -9.418081089e-06f, -5.559861372e-04f, + -1.752145831e-05f, -1.028676561e-04f, -1.364860053e-04f, +3.915649547e-05f, +4.222645286e-04f, +6.829012778e-04f, +3.135809844e-04f, -8.950481981e-04f, -2.453322127e-03f, -3.326363721e-03f, -2.672207845e-03f, -5.892595910e-04f, +1.824513555e-03f, +3.231062568e-03f, +3.014229729e-03f, +1.638838817e-03f, +1.602843179e-04f, -6.142897157e-04f, -5.909720811e-04f, -2.050699399e-04f, +8.673857115e-05f, +1.353477948e-04f, +5.454515320e-05f, -8.383301236e-06f, + -4.420071462e-04f, -4.309800195e-03f, -7.043654339e-03f, -6.931216229e-04f, +1.484170981e-02f, +2.425901888e-02f, +9.833232013e-03f, -2.388660047e-02f, -4.551107462e-02f, -2.707279022e-02f, +2.098870018e-02f, +5.440239418e-02f, +4.020762858e-02f, -7.463593904e-03f, -4.285263215e-02f, -3.705554730e-02f, -3.975091086e-03f, +2.135235890e-02f, +2.099095711e-02f, +5.551840636e-03f, -5.726709738e-03f, -6.124545583e-03f, -1.845211923e-03f, +4.116898688e-04f, + +7.554274255e-05f, +1.429875171e-04f, -1.588464000e-05f, -3.771457014e-04f, -5.040724819e-04f, +8.403359275e-06f, +8.500055040e-04f, +1.070459747e-03f, +1.400455284e-04f, -1.198300808e-03f, -1.537889400e-03f, -3.890319635e-04f, +1.149312357e-03f, +1.549847868e-03f, +5.243628805e-04f, -7.633368679e-04f, -1.087786960e-03f, -4.139718323e-04f, +3.462320965e-04f, +5.003317867e-04f, +1.788453450e-04f, -1.051823464e-04f, -1.226063853e-04f, -2.125061018e-05f, + /* 5, 8 (24) */ + -5.180336168e-04f, +1.306217952e-03f, +5.481761881e-03f, +7.821422237e-03f, +9.090354189e-04f, -1.765472195e-02f, -3.601997023e-02f, -2.928076761e-02f, +2.383417351e-02f, +1.191364748e-01f, +2.199465191e-01f, +2.758829758e-01f, +2.562816556e-01f, +1.720595018e-01f, +6.783868500e-02f, -9.057257510e-03f, -3.748063015e-02f, -2.824022754e-02f, -7.259551025e-03f, +5.919712473e-03f, +7.335960409e-03f, +3.235699809e-03f, +4.512707211e-05f, -5.643694384e-04f, + -1.547894728e-05f, -1.001488561e-04f, -1.379233787e-04f, +2.973731395e-05f, +4.096030115e-04f, +6.818331277e-04f, +3.383151656e-04f, -8.475119607e-04f, -2.409155584e-03f, -3.319680268e-03f, -2.717774172e-03f, -6.667818348e-04f, +1.758377490e-03f, +3.211345856e-03f, +3.043338124e-03f, +1.689054465e-03f, +1.983407091e-04f, -6.035086308e-04f, -6.000400244e-04f, -2.174354272e-04f, +8.141056717e-05f, +1.367055774e-04f, +5.734064266e-05f, -7.384419649e-06f, + -3.664644036e-04f, -4.166812678e-03f, -7.059538979e-03f, -1.070267324e-03f, +1.433763733e-02f, +2.426742224e-02f, +1.068323752e-02f, -2.281614072e-02f, -4.537102909e-02f, -2.827109103e-02f, +1.945081078e-02f, +5.401336222e-02f, +4.135694093e-02f, -5.913746036e-03f, -4.232826927e-02f, -3.781888416e-02f, -5.062878046e-03f, +2.093838707e-02f, +2.133718921e-02f, +6.052172423e-03f, -5.547864393e-03f, -6.229727930e-03f, -1.967818308e-03f, +3.904392586e-04f, + +7.210900003e-05f, +1.433906409e-04f, -6.580123046e-06f, -3.664192875e-04f, -5.089732471e-04f, -1.655642461e-05f, +8.278590914e-04f, +1.081214627e-03f, +1.823498829e-04f, -1.165003181e-03f, -1.551623638e-03f, -4.396223536e-04f, +1.112376164e-03f, +1.561995332e-03f, +5.684480574e-04f, -7.337138299e-04f, -1.096066144e-03f, -4.417372537e-04f, +3.301444287e-04f, +5.052086988e-04f, +1.907485539e-04f, -1.003761070e-04f, -1.251084075e-04f, -2.401251095e-05f, + /* 5, 9 (24) */ + -5.335125640e-04f, +1.206069096e-03f, +5.343838502e-03f, +7.851159551e-03f, +1.318638430e-03f, -1.697288882e-02f, -3.568165506e-02f, -3.012827957e-02f, +2.142501793e-02f, +1.158167945e-01f, +2.172287449e-01f, +2.752161939e-01f, +2.580400331e-01f, +1.752708477e-01f, +7.088202313e-02f, -7.368203045e-03f, -3.728228944e-02f, -2.884373617e-02f, -7.859591049e-03f, +5.702277046e-03f, +7.417370976e-03f, +3.372405387e-03f, +1.024677148e-04f, -5.717538580e-04f, + -1.349851325e-05f, -9.739127752e-05f, -1.391476333e-04f, +2.055582931e-05f, +3.968561725e-04f, +6.801404013e-04f, +3.621636444e-04f, -8.003960392e-04f, -2.364340423e-03f, -3.311436227e-03f, -2.761832570e-03f, -7.439136762e-04f, +1.691227835e-03f, +3.189947221e-03f, +3.071233527e-03f, +1.739159940e-03f, +2.371357781e-04f, -5.918929427e-04f, -6.087372151e-04f, -2.299122304e-04f, +7.582062120e-05f, +1.379299107e-04f, +6.016123583e-05f, -6.321002691e-06f, + -2.943554036e-04f, -4.023422037e-03f, -7.066119102e-03f, -1.436686612e-03f, +1.382866408e-02f, +2.425086582e-02f, +1.151109661e-02f, -2.173492610e-02f, -4.518867921e-02f, -2.943609421e-02f, +1.789918715e-02f, +5.357373986e-02f, +4.246931710e-02f, -4.351750704e-03f, -4.175982121e-02f, -3.855259799e-02f, -6.158944190e-03f, +2.049664982e-02f, +2.166733363e-02f, +6.557381122e-03f, -5.357115839e-03f, -6.330104037e-03f, -2.092926715e-03f, +3.664267477e-04f, + +6.867758676e-05f, +1.435584841e-04f, +2.477041435e-06f, -3.554844497e-04f, -5.131875248e-04f, -4.110459735e-05f, +8.051031809e-04f, +1.090721988e-03f, +2.241444749e-04f, -1.130685353e-03f, -1.563739524e-03f, -4.897358727e-04f, +1.074246403e-03f, +1.572591413e-03f, +6.122242440e-04f, -7.030572853e-04f, -1.103260595e-03f, -4.694109435e-04f, +3.133927363e-04f, +5.095719253e-04f, +2.027047918e-04f, -9.527263564e-05f, -1.274865400e-04f, -2.684845389e-05f, + /* 5,10 (24) */ + -5.470110773e-04f, +1.108677819e-03f, +5.204690869e-03f, +7.871715380e-03f, +1.715494603e-03f, -1.629274842e-02f, -3.531949142e-02f, -3.092867561e-02f, +1.906067751e-02f, +1.125053583e-01f, +2.144669123e-01f, +2.744722803e-01f, +2.597312610e-01f, +1.784607949e-01f, +7.395325666e-02f, -5.629043106e-03f, -3.704515366e-02f, -2.943562912e-02f, -8.468328264e-03f, +5.472364815e-03f, +7.493191597e-03f, +3.510335297e-03f, +1.626289506e-04f, -5.780748607e-04f, + -1.158112765e-05f, -9.459994808e-05f, -1.401633830e-04f, +1.161608603e-05f, +3.840391977e-04f, +6.778388088e-04f, +3.851248826e-04f, -7.537266892e-04f, -2.318912626e-03f, -3.301648517e-03f, -2.804363262e-03f, -8.206102037e-04f, +1.623101807e-03f, +3.166869938e-03f, +3.097887227e-03f, +1.789120310e-03f, +2.766536360e-04f, -5.794346753e-04f, -6.170460803e-04f, -2.424895504e-04f, +6.996808483e-05f, +1.390150473e-04f, +6.300353231e-05f, -5.192488908e-06f, + -2.256778168e-04f, -3.879863553e-03f, -7.063642061e-03f, -1.792171061e-03f, +1.331547656e-02f, +2.420976122e-02f, +1.231619979e-02f, -2.064420411e-02f, -4.496453473e-02f, -3.056677956e-02f, +1.633544762e-02f, +5.308400399e-02f, +4.354356350e-02f, -2.779159291e-03f, -4.114759696e-02f, -3.925565528e-02f, -7.262204785e-03f, +2.002723887e-02f, +2.198072637e-02f, +7.066953047e-03f, -5.154411047e-03f, -6.425376672e-03f, -2.220413255e-03f, +3.395782938e-04f, + +6.525474269e-05f, +1.434974467e-04f, +1.127992733e-05f, -3.443599368e-04f, -5.167220476e-04f, -6.521784023e-05f, +7.817713627e-04f, +1.098982923e-03f, +2.653865847e-04f, -1.095389966e-03f, -1.574228306e-03f, -5.393183701e-04f, +1.034962741e-03f, +1.581618759e-03f, +6.556411139e-04f, -6.713932608e-04f, -1.109350476e-03f, -4.969588382e-04f, +2.959870397e-04f, +5.134059396e-04f, +2.146986025e-04f, -8.987180462e-05f, -1.297327897e-04f, -2.975522529e-05f, + /* 5,11 (24) */ + -5.585922049e-04f, +1.014077871e-03f, +5.064527486e-03f, +7.883331466e-03f, +2.099533801e-03f, -1.561490961e-02f, -3.493436653e-02f, -3.168240229e-02f, +1.674176488e-02f, +1.092037097e-01f, +2.116625490e-01f, +2.736516701e-01f, +2.613543628e-01f, +1.816276649e-01f, +7.705114388e-02f, -3.839922796e-03f, -3.676850002e-02f, -3.001506379e-02f, -9.085374345e-03f, +5.229875265e-03f, +7.563159682e-03f, +3.649350345e-03f, +2.256324829e-04f, -5.832673496e-04f, + -9.727636212e-06f, -9.177980134e-05f, -1.409753797e-04f, +2.921762272e-06f, +3.711670160e-04f, +6.749443147e-04f, +4.071980952e-04f, -7.075295006e-04f, -2.272908290e-03f, -3.290335041e-03f, -2.845347606e-03f, -8.968268430e-04f, +1.554037374e-03f, +3.142118477e-03f, +3.123271196e-03f, +1.838900386e-03f, +3.168775984e-04f, -5.661264457e-04f, -6.249490622e-04f, -2.551562308e-04f, +6.385260626e-05f, +1.399552660e-04f, +6.586399920e-05f, -3.998407513e-06f, + -1.604230741e-04f, -3.736366106e-03f, -7.052362133e-03f, -2.136530998e-03f, +1.279875451e-02f, +2.414454338e-02f, +1.309797115e-02f, -1.954522119e-02f, -4.469914815e-02f, -3.166216953e-02f, +1.476121932e-02f, +5.254468562e-02f, +4.457852624e-02f, -1.197540532e-03f, -4.049195585e-02f, -3.992704854e-02f, -8.371555262e-03f, +1.953028003e-02f, +2.227671341e-02f, +7.580358987e-03f, -4.939712445e-03f, -6.515248477e-03f, -2.350146045e-03f, +3.098230685e-04f, + +6.184652097e-05f, +1.432141418e-04f, +1.982213440e-05f, -3.330644120e-04f, -5.195843353e-04f, -8.887369771e-05f, +7.578975610e-04f, +1.106000008e-03f, +3.060344296e-04f, -1.059160601e-03f, -1.583083137e-03f, -5.883163394e-04f, +9.945662332e-04f, +1.589061778e-03f, +6.986484862e-04f, -6.387491843e-04f, -1.114317103e-03f, -5.243466183e-04f, +2.779383579e-04f, +5.166956692e-04f, +2.267141634e-04f, -8.417394930e-05f, -1.318391809e-04f, -3.272937824e-05f, + /* 5,12 (24) */ + -5.683198412e-04f, +9.222980693e-04f, +4.923552106e-03f, +7.886253229e-03f, +2.470700817e-03f, -1.493996530e-02f, -3.452716844e-02f, -3.238993180e-02f, +1.446885659e-02f, +1.059133747e-01f, +2.088172014e-01f, +2.727548432e-01f, +2.629084001e-01f, +1.847697833e-01f, +8.017441508e-02f, -2.001022409e-03f, -3.645162242e-02f, -3.058119024e-02f, -9.710323407e-03f, +4.974719034e-03f, +7.627012288e-03f, +3.789305611e-03f, +2.914964821e-04f, -5.872657572e-04f, + -7.938760954e-06f, -8.893567243e-05f, -1.415885041e-04f, -5.523826643e-06f, +3.582542880e-04f, +6.714731191e-04f, +4.283832414e-04f, -6.618293838e-04f, -2.226363603e-03f, -3.277514674e-03f, -2.884768102e-03f, -9.725193914e-04f, +1.484073222e-03f, +3.115698509e-03f, +3.147358112e-03f, +1.888464744e-03f, +3.577901908e-04f, -5.519614785e-04f, -6.324286353e-04f, -2.679007628e-04f, +5.747413731e-05f, +1.407448797e-04f, +6.873897269e-05f, -2.738381617e-06f, + -9.857655316e-05f, -3.593151964e-03f, -7.032539999e-03f, -2.469595410e-03f, +1.227917018e-02f, +2.405566968e-02f, +1.385586871e-02f, -1.843922118e-02f, -4.439311372e-02f, -3.272133013e-02f, +1.317813618e-02f, +5.195636928e-02f, +4.557309248e-02f, +3.915212458e-04f, -3.979330736e-02f, -4.056579772e-02f, -9.485872365e-03f, +1.900593342e-02f, +2.255465177e-02f, +8.097054656e-03f, -4.712998281e-03f, -6.599422426e-03f, -2.481985226e-03f, +2.770936903e-04f, + +5.845878150e-05f, +1.427153804e-04f, +2.809778795e-05f, -3.216164267e-04f, -5.217826740e-04f, -1.120505966e-04f, +7.335159874e-04f, +1.111777288e-03f, +3.460472098e-04f, -1.022041725e-03f, -1.590299077e-03f, -6.366769833e-04f, +9.530992759e-04f, +1.594906671e-03f, +7.411963889e-04f, -6.051538604e-04f, -1.118142977e-03f, -5.515397501e-04f, +2.592587068e-04f, +5.194265241e-04f, +2.387353031e-04f, -7.817987704e-05f, -1.337977690e-04f, -3.576723343e-05f, + /* 5,13 (24) */ + -5.762586021e-04f, +8.333623969e-04f, +4.781963602e-03f, +7.880729402e-03f, +2.828955105e-03f, -1.426849218e-02f, -3.409878520e-02f, -3.305176118e-02f, +1.224249299e-02f, +1.026358600e-01f, +2.059324333e-01f, +2.717823238e-01f, +2.643924734e-01f, +1.878854818e-01f, +8.332177319e-02f, -1.125576648e-04f, -3.609383223e-02f, -3.113315172e-02f, -1.034275204e-02f, +4.706818272e-03f, +7.684486426e-03f, +3.930050491e-03f, +3.602354548e-04f, -5.900041388e-04f, + -6.215102370e-06f, -8.607229401e-05f, -1.420077569e-04f, -1.371772433e-05f, +3.453153970e-04f, +6.674416385e-04f, +4.486810147e-04f, -6.166505551e-04f, -2.179314805e-03f, -3.263207237e-03f, -2.922608406e-03f, -1.047644052e-03f, +1.413248730e-03f, +3.087616903e-03f, +3.170121386e-03f, +1.937777756e-03f, +3.993731546e-04f, -5.369336214e-04f, -6.394673241e-04f, -2.807112907e-04f, +5.083294009e-05f, +1.413782434e-04f, +7.162465989e-05f, -1.412131386e-06f, + -4.011777165e-05f, -3.450436584e-03f, -7.004442211e-03f, -2.791211837e-03f, +1.175738750e-02f, +2.394361909e-02f, +1.458938470e-02f, -1.732744389e-02f, -4.404706651e-02f, -3.374337185e-02f, +1.158783710e-02f, +5.131969230e-02f, +4.652619175e-02f, +1.986427917e-03f, -3.905211097e-02f, -4.117095158e-02f, -1.060401534e-02f, +1.845439367e-02f, +2.281391047e-02f, +8.616481180e-03f, -4.474262978e-03f, -6.677602303e-03f, -2.615782995e-03f, +2.413264568e-04f, + +5.509718502e-05f, +1.420081557e-04f, +3.610153773e-05f, -3.100343958e-04f, -5.233260925e-04f, -1.347278638e-04f, +7.086610936e-04f, +1.116320258e-03f, +3.853851526e-04f, -9.840786261e-04f, -1.595873094e-03f, -6.843482775e-04f, +9.106055562e-04f, +1.599141448e-03f, +7.832351216e-04f, -5.706374440e-04f, -1.120811823e-03f, -5.785035294e-04f, +2.399610962e-04f, +5.215844253e-04f, +2.507455190e-04f, -7.189087556e-05f, -1.356006551e-04f, -3.886488029e-05f, + /* 5,14 (24) */ + -5.824737045e-04f, +7.472901029e-04f, +4.639955845e-03f, +7.867011678e-03f, +3.174270502e-03f, -1.360105054e-02f, -3.365010418e-02f, -3.366841173e-02f, +1.006317818e-02f, +9.937265279e-02f, +2.030098249e-01f, +2.707346798e-01f, +2.658057221e-01f, +1.909730987e-01f, +8.649189458e-02f, +1.825220092e-03f, -3.569445908e-02f, -3.167008534e-02f, -1.098221937e-02f, +4.426106981e-03f, +7.735319366e-03f, +4.071428734e-03f, +4.318601147e-04f, -5.914162702e-04f, + -4.557141719e-06f, -8.319429235e-05f, -1.422382495e-04f, -2.165732913e-05f, +3.323644386e-04f, +6.628664873e-04f, +4.680928325e-04f, -5.720165241e-04f, -2.131798163e-03f, -3.247433479e-03f, -2.958853339e-03f, -1.122157466e-03f, +1.341603939e-03f, +3.057881724e-03f, +3.191535193e-03f, +1.986803616e-03f, +4.416074545e-04f, -5.210373591e-04f, -6.460477211e-04f, -2.935756175e-04f, +4.392959355e-05f, +1.418497630e-04f, +7.451714092e-05f, -1.947713690e-08f, + +1.497941336e-05f, -3.308428428e-03f, -6.968340673e-03f, -3.101246233e-03f, +1.123406141e-02f, +2.380889122e-02f, +1.529804579e-02f, -1.621112363e-02f, -4.366168136e-02f, -3.472745048e-02f, +9.991964010e-03f, +5.063534402e-02f, +4.743679731e-02f, +3.585569365e-03f, -3.826887585e-02f, -4.174158903e-02f, -1.172482717e-02f, +1.787589014e-02f, +2.305387157e-02f, +9.138065605e-03f, -4.223517459e-03f, -6.749493179e-03f, -2.751383650e-03f, +2.024615766e-04f, + +5.176718757e-05f, +1.410996276e-04f, +4.382855603e-05f, -2.983365736e-04f, -5.242243400e-04f, -1.568857425e-04f, +6.833675242e-04f, +1.119635845e-03f, +4.240095559e-04f, -9.453173597e-04f, -1.599804062e-03f, -7.312790333e-04f, +8.671300005e-04f, +1.601755950e-03f, +8.247153181e-04f, -5.352314117e-04f, -1.122308617e-03f, -6.052031248e-04f, +2.200595253e-04f, +5.231558325e-04f, +2.627279961e-04f, -6.530872059e-05f, -1.372400007e-04f, -4.201817875e-05f, + /* 5,15 (24) */ + -5.870308462e-04f, +6.640958105e-04f, +4.497717596e-03f, +7.845354349e-03f, +3.506634940e-03f, -1.293818405e-02f, -3.318201135e-02f, -3.424042826e-02f, +7.931380019e-03f, +9.612521931e-02f, +2.000509716e-01f, +2.696125223e-01f, +2.671473260e-01f, +1.940309805e-01f, +8.968342977e-02f, +3.812023708e-03f, -3.525285162e-02f, -3.219112270e-02f, -1.162826709e-02f, +4.132531363e-03f, +7.779248959e-03f, +4.213278497e-03f, +5.063772556e-04f, -5.914357473e-04f, + -2.965243435e-06f, -8.030618376e-05f, -1.422851959e-04f, -2.934038961e-05f, +3.194152119e-04f, +6.577644584e-04f, +4.866208258e-04f, -5.279500810e-04f, -2.083849941e-03f, -3.230215052e-03f, -2.993488892e-03f, -1.196016749e-03f, +1.269179521e-03f, +3.026502235e-03f, +3.211574492e-03f, +2.035506370e-03f, +4.844732852e-04f, -5.042678272e-04f, -6.521525049e-04f, -3.064812112e-04f, +3.676499970e-05f, +1.421539031e-04f, +7.741237116e-05f, +1.439657656e-06f, + +6.674660094e-05f, -3.167328801e-03f, -6.924512117e-03f, -3.399582806e-03f, +1.070983707e-02f, +2.365200548e-02f, +1.598141332e-02f, -1.509148779e-02f, -4.323767180e-02f, -3.567276784e-02f, +8.392159948e-03f, +4.990406499e-02f, +4.830392731e-02f, +5.187325315e-03f, -3.744416054e-02f, -4.227682044e-02f, -1.284713578e-02f, +1.727068701e-02f, +2.327393110e-02f, +9.661221438e-03f, -3.960789463e-03f, -6.814801899e-03f, -2.888623651e-03f, +1.604433978e-04f, + +4.847403558e-05f, +1.399971074e-04f, +5.127453495e-05f, -2.865410298e-04f, -5.244878610e-04f, -1.785054070e-04f, +6.576700703e-04f, +1.121732389e-03f, +4.618828287e-04f, -9.058046859e-04f, -1.602092762e-03f, -7.774189589e-04f, +8.227187204e-04f, +1.602741870e-03f, +8.655880094e-04f, -4.989685310e-04f, -1.122619615e-03f, -6.316036224e-04f, +1.995689762e-04f, +5.241277714e-04f, +2.746656266e-04f, -5.843568295e-05f, -1.387080425e-04f, -4.522276128e-05f, + /* 5,16 (24) */ + -5.899960896e-04f, +5.837896268e-04f, +4.355432400e-03f, +7.816013959e-03f, +3.826050152e-03f, -1.228041959e-02f, -3.269539052e-02f, -3.476837834e-02f, +5.847530078e-03f, +9.289500426e-02f, +1.970574827e-01f, +2.684165056e-01f, +2.684165056e-01f, +1.970574827e-01f, +9.289500426e-02f, +5.847530078e-03f, -3.476837834e-02f, -3.269539052e-02f, -1.228041959e-02f, +3.826050152e-03f, +7.816013959e-03f, +4.355432400e-03f, +5.837896268e-04f, -5.899960896e-04f, + -1.439657656e-06f, -7.741237116e-05f, -1.421539031e-04f, -3.676499970e-05f, +3.064812112e-04f, +6.521525049e-04f, +5.042678272e-04f, -4.844732852e-04f, -2.035506370e-03f, -3.211574492e-03f, -3.026502235e-03f, -1.269179521e-03f, +1.196016749e-03f, +2.993488892e-03f, +3.230215052e-03f, +2.083849941e-03f, +5.279500810e-04f, -4.866208258e-04f, -6.577644584e-04f, -3.194152119e-04f, +2.934038961e-05f, +1.422851959e-04f, +8.030618376e-05f, +2.965243435e-06f, + +1.152206365e-04f, -3.027331693e-03f, -6.873237582e-03f, -3.686123836e-03f, +1.018534921e-02f, +2.347350007e-02f, +1.663908339e-02f, -1.396975540e-02f, -4.277578897e-02f, -3.657857253e-02f, +6.790067185e-03f, +4.912664603e-02f, +4.912664603e-02f, +6.790067185e-03f, -3.657857253e-02f, -4.277578897e-02f, -1.396975540e-02f, +1.663908339e-02f, +2.347350007e-02f, +1.018534921e-02f, -3.686123836e-03f, -6.873237582e-03f, -3.027331693e-03f, +1.152206365e-04f, + +4.522276128e-05f, +1.387080425e-04f, +5.843568295e-05f, -2.746656266e-04f, -5.241277714e-04f, -1.995689762e-04f, +6.316036224e-04f, +1.122619615e-03f, +4.989685310e-04f, -8.655880094e-04f, -1.602741870e-03f, -8.227187204e-04f, +7.774189589e-04f, +1.602092762e-03f, +9.058046859e-04f, -4.618828287e-04f, -1.121732389e-03f, -6.576700703e-04f, +1.785054070e-04f, +5.244878610e-04f, +2.865410298e-04f, -5.127453495e-05f, -1.399971074e-04f, -4.847403558e-05f, + /* 5,17 (24) */ + -5.914357473e-04f, +5.063772556e-04f, +4.213278497e-03f, +7.779248959e-03f, +4.132531363e-03f, -1.162826709e-02f, -3.219112270e-02f, -3.525285162e-02f, +3.812023708e-03f, +8.968342977e-02f, +1.940309805e-01f, +2.671473260e-01f, +2.696125223e-01f, +2.000509716e-01f, +9.612521931e-02f, +7.931380019e-03f, -3.424042826e-02f, -3.318201135e-02f, -1.293818405e-02f, +3.506634940e-03f, +7.845354349e-03f, +4.497717596e-03f, +6.640958105e-04f, -5.870308462e-04f, + +1.947713690e-08f, -7.451714092e-05f, -1.418497630e-04f, -4.392959355e-05f, +2.935756175e-04f, +6.460477211e-04f, +5.210373591e-04f, -4.416074545e-04f, -1.986803616e-03f, -3.191535193e-03f, -3.057881724e-03f, -1.341603939e-03f, +1.122157466e-03f, +2.958853339e-03f, +3.247433479e-03f, +2.131798163e-03f, +5.720165241e-04f, -4.680928325e-04f, -6.628664873e-04f, -3.323644386e-04f, +2.165732913e-05f, +1.422382495e-04f, +8.319429235e-05f, +4.557141719e-06f, + +1.604433978e-04f, -2.888623651e-03f, -6.814801899e-03f, -3.960789463e-03f, +9.661221438e-03f, +2.327393110e-02f, +1.727068701e-02f, -1.284713578e-02f, -4.227682044e-02f, -3.744416054e-02f, +5.187325315e-03f, +4.830392731e-02f, +4.990406499e-02f, +8.392159948e-03f, -3.567276784e-02f, -4.323767180e-02f, -1.509148779e-02f, +1.598141332e-02f, +2.365200548e-02f, +1.070983707e-02f, -3.399582806e-03f, -6.924512117e-03f, -3.167328801e-03f, +6.674660094e-05f, + +4.201817875e-05f, +1.372400007e-04f, +6.530872059e-05f, -2.627279961e-04f, -5.231558325e-04f, -2.200595253e-04f, +6.052031248e-04f, +1.122308617e-03f, +5.352314117e-04f, -8.247153181e-04f, -1.601755950e-03f, -8.671300005e-04f, +7.312790333e-04f, +1.599804062e-03f, +9.453173597e-04f, -4.240095559e-04f, -1.119635845e-03f, -6.833675242e-04f, +1.568857425e-04f, +5.242243400e-04f, +2.983365736e-04f, -4.382855603e-05f, -1.410996276e-04f, -5.176718757e-05f, + /* 5,18 (24) */ + -5.914162702e-04f, +4.318601147e-04f, +4.071428734e-03f, +7.735319366e-03f, +4.426106981e-03f, -1.098221937e-02f, -3.167008534e-02f, -3.569445908e-02f, +1.825220092e-03f, +8.649189458e-02f, +1.909730987e-01f, +2.658057221e-01f, +2.707346798e-01f, +2.030098249e-01f, +9.937265279e-02f, +1.006317818e-02f, -3.366841173e-02f, -3.365010418e-02f, -1.360105054e-02f, +3.174270502e-03f, +7.867011678e-03f, +4.639955845e-03f, +7.472901029e-04f, -5.824737045e-04f, + +1.412131386e-06f, -7.162465989e-05f, -1.413782434e-04f, -5.083294009e-05f, +2.807112907e-04f, +6.394673241e-04f, +5.369336214e-04f, -3.993731546e-04f, -1.937777756e-03f, -3.170121386e-03f, -3.087616903e-03f, -1.413248730e-03f, +1.047644052e-03f, +2.922608406e-03f, +3.263207237e-03f, +2.179314805e-03f, +6.166505551e-04f, -4.486810147e-04f, -6.674416385e-04f, -3.453153970e-04f, +1.371772433e-05f, +1.420077569e-04f, +8.607229401e-05f, +6.215102370e-06f, + +2.024615766e-04f, -2.751383650e-03f, -6.749493179e-03f, -4.223517459e-03f, +9.138065605e-03f, +2.305387157e-02f, +1.787589014e-02f, -1.172482717e-02f, -4.174158903e-02f, -3.826887585e-02f, +3.585569365e-03f, +4.743679731e-02f, +5.063534402e-02f, +9.991964010e-03f, -3.472745048e-02f, -4.366168136e-02f, -1.621112363e-02f, +1.529804579e-02f, +2.380889122e-02f, +1.123406141e-02f, -3.101246233e-03f, -6.968340673e-03f, -3.308428428e-03f, +1.497941336e-05f, + +3.886488029e-05f, +1.356006551e-04f, +7.189087556e-05f, -2.507455190e-04f, -5.215844253e-04f, -2.399610962e-04f, +5.785035294e-04f, +1.120811823e-03f, +5.706374440e-04f, -7.832351216e-04f, -1.599141448e-03f, -9.106055562e-04f, +6.843482775e-04f, +1.595873094e-03f, +9.840786261e-04f, -3.853851526e-04f, -1.116320258e-03f, -7.086610936e-04f, +1.347278638e-04f, +5.233260925e-04f, +3.100343958e-04f, -3.610153773e-05f, -1.420081557e-04f, -5.509718502e-05f, + /* 5,19 (24) */ + -5.900041388e-04f, +3.602354548e-04f, +3.930050491e-03f, +7.684486426e-03f, +4.706818272e-03f, -1.034275204e-02f, -3.113315172e-02f, -3.609383223e-02f, -1.125576648e-04f, +8.332177319e-02f, +1.878854818e-01f, +2.643924734e-01f, +2.717823238e-01f, +2.059324333e-01f, +1.026358600e-01f, +1.224249299e-02f, -3.305176118e-02f, -3.409878520e-02f, -1.426849218e-02f, +2.828955105e-03f, +7.880729402e-03f, +4.781963602e-03f, +8.333623969e-04f, -5.762586021e-04f, + +2.738381617e-06f, -6.873897269e-05f, -1.407448797e-04f, -5.747413731e-05f, +2.679007628e-04f, +6.324286353e-04f, +5.519614785e-04f, -3.577901908e-04f, -1.888464744e-03f, -3.147358112e-03f, -3.115698509e-03f, -1.484073222e-03f, +9.725193914e-04f, +2.884768102e-03f, +3.277514674e-03f, +2.226363603e-03f, +6.618293838e-04f, -4.283832414e-04f, -6.714731191e-04f, -3.582542880e-04f, +5.523826643e-06f, +1.415885041e-04f, +8.893567243e-05f, +7.938760954e-06f, + +2.413264568e-04f, -2.615782995e-03f, -6.677602303e-03f, -4.474262978e-03f, +8.616481180e-03f, +2.281391047e-02f, +1.845439367e-02f, -1.060401534e-02f, -4.117095158e-02f, -3.905211097e-02f, +1.986427917e-03f, +4.652619175e-02f, +5.131969230e-02f, +1.158783710e-02f, -3.374337185e-02f, -4.404706651e-02f, -1.732744389e-02f, +1.458938470e-02f, +2.394361909e-02f, +1.175738750e-02f, -2.791211837e-03f, -7.004442211e-03f, -3.450436584e-03f, -4.011777165e-05f, + +3.576723343e-05f, +1.337977690e-04f, +7.817987704e-05f, -2.387353031e-04f, -5.194265241e-04f, -2.592587068e-04f, +5.515397501e-04f, +1.118142977e-03f, +6.051538604e-04f, -7.411963889e-04f, -1.594906671e-03f, -9.530992759e-04f, +6.366769833e-04f, +1.590299077e-03f, +1.022041725e-03f, -3.460472098e-04f, -1.111777288e-03f, -7.335159874e-04f, +1.120505966e-04f, +5.217826740e-04f, +3.216164267e-04f, -2.809778795e-05f, -1.427153804e-04f, -5.845878150e-05f, + /* 5,20 (24) */ + -5.872657572e-04f, +2.914964821e-04f, +3.789305611e-03f, +7.627012288e-03f, +4.974719034e-03f, -9.710323407e-03f, -3.058119024e-02f, -3.645162242e-02f, -2.001022409e-03f, +8.017441508e-02f, +1.847697833e-01f, +2.629084001e-01f, +2.727548432e-01f, +2.088172014e-01f, +1.059133747e-01f, +1.446885659e-02f, -3.238993180e-02f, -3.452716844e-02f, -1.493996530e-02f, +2.470700817e-03f, +7.886253229e-03f, +4.923552106e-03f, +9.222980693e-04f, -5.683198412e-04f, + +3.998407513e-06f, -6.586399920e-05f, -1.399552660e-04f, -6.385260626e-05f, +2.551562308e-04f, +6.249490622e-04f, +5.661264457e-04f, -3.168775984e-04f, -1.838900386e-03f, -3.123271196e-03f, -3.142118477e-03f, -1.554037374e-03f, +8.968268430e-04f, +2.845347606e-03f, +3.290335041e-03f, +2.272908290e-03f, +7.075295006e-04f, -4.071980952e-04f, -6.749443147e-04f, -3.711670160e-04f, -2.921762272e-06f, +1.409753797e-04f, +9.177980134e-05f, +9.727636212e-06f, + +2.770936903e-04f, -2.481985226e-03f, -6.599422426e-03f, -4.712998281e-03f, +8.097054656e-03f, +2.255465177e-02f, +1.900593342e-02f, -9.485872365e-03f, -4.056579772e-02f, -3.979330736e-02f, +3.915212458e-04f, +4.557309248e-02f, +5.195636928e-02f, +1.317813618e-02f, -3.272133013e-02f, -4.439311372e-02f, -1.843922118e-02f, +1.385586871e-02f, +2.405566968e-02f, +1.227917018e-02f, -2.469595410e-03f, -7.032539999e-03f, -3.593151964e-03f, -9.857655316e-05f, + +3.272937824e-05f, +1.318391809e-04f, +8.417394930e-05f, -2.267141634e-04f, -5.166956692e-04f, -2.779383579e-04f, +5.243466183e-04f, +1.114317103e-03f, +6.387491843e-04f, -6.986484862e-04f, -1.589061778e-03f, -9.945662332e-04f, +5.883163394e-04f, +1.583083137e-03f, +1.059160601e-03f, -3.060344296e-04f, -1.106000008e-03f, -7.578975610e-04f, +8.887369771e-05f, +5.195843353e-04f, +3.330644120e-04f, -1.982213440e-05f, -1.432141418e-04f, -6.184652097e-05f, + /* 5,21 (24) */ + -5.832673496e-04f, +2.256324829e-04f, +3.649350345e-03f, +7.563159682e-03f, +5.229875265e-03f, -9.085374345e-03f, -3.001506379e-02f, -3.676850002e-02f, -3.839922796e-03f, +7.705114388e-02f, +1.816276649e-01f, +2.613543628e-01f, +2.736516701e-01f, +2.116625490e-01f, +1.092037097e-01f, +1.674176488e-02f, -3.168240229e-02f, -3.493436653e-02f, -1.561490961e-02f, +2.099533801e-03f, +7.883331466e-03f, +5.064527486e-03f, +1.014077871e-03f, -5.585922049e-04f, + +5.192488908e-06f, -6.300353231e-05f, -1.390150473e-04f, -6.996808483e-05f, +2.424895504e-04f, +6.170460803e-04f, +5.794346753e-04f, -2.766536360e-04f, -1.789120310e-03f, -3.097887227e-03f, -3.166869938e-03f, -1.623101807e-03f, +8.206102037e-04f, +2.804363262e-03f, +3.301648517e-03f, +2.318912626e-03f, +7.537266892e-04f, -3.851248826e-04f, -6.778388088e-04f, -3.840391977e-04f, -1.161608603e-05f, +1.401633830e-04f, +9.459994808e-05f, +1.158112765e-05f, + +3.098230685e-04f, -2.350146045e-03f, -6.515248477e-03f, -4.939712445e-03f, +7.580358987e-03f, +2.227671341e-02f, +1.953028003e-02f, -8.371555262e-03f, -3.992704854e-02f, -4.049195585e-02f, -1.197540532e-03f, +4.457852624e-02f, +5.254468562e-02f, +1.476121932e-02f, -3.166216953e-02f, -4.469914815e-02f, -1.954522119e-02f, +1.309797115e-02f, +2.414454338e-02f, +1.279875451e-02f, -2.136530998e-03f, -7.052362133e-03f, -3.736366106e-03f, -1.604230741e-04f, + +2.975522529e-05f, +1.297327897e-04f, +8.987180462e-05f, -2.146986025e-04f, -5.134059396e-04f, -2.959870397e-04f, +4.969588382e-04f, +1.109350476e-03f, +6.713932608e-04f, -6.556411139e-04f, -1.581618759e-03f, -1.034962741e-03f, +5.393183701e-04f, +1.574228306e-03f, +1.095389966e-03f, -2.653865847e-04f, -1.098982923e-03f, -7.817713627e-04f, +6.521784023e-05f, +5.167220476e-04f, +3.443599368e-04f, -1.127992733e-05f, -1.434974467e-04f, -6.525474269e-05f, + /* 5,22 (24) */ + -5.780748607e-04f, +1.626289506e-04f, +3.510335297e-03f, +7.493191597e-03f, +5.472364815e-03f, -8.468328264e-03f, -2.943562912e-02f, -3.704515366e-02f, -5.629043106e-03f, +7.395325666e-02f, +1.784607949e-01f, +2.597312610e-01f, +2.744722803e-01f, +2.144669123e-01f, +1.125053583e-01f, +1.906067751e-02f, -3.092867561e-02f, -3.531949142e-02f, -1.629274842e-02f, +1.715494603e-03f, +7.871715380e-03f, +5.204690869e-03f, +1.108677819e-03f, -5.470110773e-04f, + +6.321002691e-06f, -6.016123583e-05f, -1.379299107e-04f, -7.582062120e-05f, +2.299122304e-04f, +6.087372151e-04f, +5.918929427e-04f, -2.371357781e-04f, -1.739159940e-03f, -3.071233527e-03f, -3.189947221e-03f, -1.691227835e-03f, +7.439136762e-04f, +2.761832570e-03f, +3.311436227e-03f, +2.364340423e-03f, +8.003960392e-04f, -3.621636444e-04f, -6.801404013e-04f, -3.968561725e-04f, -2.055582931e-05f, +1.391476333e-04f, +9.739127752e-05f, +1.349851325e-05f, + +3.395782938e-04f, -2.220413255e-03f, -6.425376672e-03f, -5.154411047e-03f, +7.066953047e-03f, +2.198072637e-02f, +2.002723887e-02f, -7.262204785e-03f, -3.925565528e-02f, -4.114759696e-02f, -2.779159291e-03f, +4.354356350e-02f, +5.308400399e-02f, +1.633544762e-02f, -3.056677956e-02f, -4.496453473e-02f, -2.064420411e-02f, +1.231619979e-02f, +2.420976122e-02f, +1.331547656e-02f, -1.792171061e-03f, -7.063642061e-03f, -3.879863553e-03f, -2.256778168e-04f, + +2.684845389e-05f, +1.274865400e-04f, +9.527263564e-05f, -2.027047918e-04f, -5.095719253e-04f, -3.133927363e-04f, +4.694109435e-04f, +1.103260595e-03f, +7.030572853e-04f, -6.122242440e-04f, -1.572591413e-03f, -1.074246403e-03f, +4.897358727e-04f, +1.563739524e-03f, +1.130685353e-03f, -2.241444749e-04f, -1.090721988e-03f, -8.051031809e-04f, +4.110459735e-05f, +5.131875248e-04f, +3.554844497e-04f, -2.477041435e-06f, -1.435584841e-04f, -6.867758676e-05f, + /* 5,23 (24) */ + -5.717538580e-04f, +1.024677148e-04f, +3.372405387e-03f, +7.417370976e-03f, +5.702277046e-03f, -7.859591049e-03f, -2.884373617e-02f, -3.728228944e-02f, -7.368203045e-03f, +7.088202313e-02f, +1.752708477e-01f, +2.580400331e-01f, +2.752161939e-01f, +2.172287449e-01f, +1.158167945e-01f, +2.142501793e-02f, -3.012827957e-02f, -3.568165506e-02f, -1.697288882e-02f, +1.318638430e-03f, +7.851159551e-03f, +5.343838502e-03f, +1.206069096e-03f, -5.335125640e-04f, + +7.384419649e-06f, -5.734064266e-05f, -1.367055774e-04f, -8.141056717e-05f, +2.174354272e-04f, +6.000400244e-04f, +6.035086308e-04f, -1.983407091e-04f, -1.689054465e-03f, -3.043338124e-03f, -3.211345856e-03f, -1.758377490e-03f, +6.667818348e-04f, +2.717774172e-03f, +3.319680268e-03f, +2.409155584e-03f, +8.475119607e-04f, -3.383151656e-04f, -6.818331277e-04f, -4.096030115e-04f, -2.973731395e-05f, +1.379233787e-04f, +1.001488561e-04f, +1.547894728e-05f, + +3.664267477e-04f, -2.092926715e-03f, -6.330104037e-03f, -5.357115839e-03f, +6.557381122e-03f, +2.166733363e-02f, +2.049664982e-02f, -6.158944190e-03f, -3.855259799e-02f, -4.175982121e-02f, -4.351750704e-03f, +4.246931710e-02f, +5.357373986e-02f, +1.789918715e-02f, -2.943609421e-02f, -4.518867921e-02f, -2.173492610e-02f, +1.151109661e-02f, +2.425086582e-02f, +1.382866408e-02f, -1.436686612e-03f, -7.066119102e-03f, -4.023422037e-03f, -2.943554036e-04f, + +2.401251095e-05f, +1.251084075e-04f, +1.003761070e-04f, -1.907485539e-04f, -5.052086988e-04f, -3.301444287e-04f, +4.417372537e-04f, +1.096066144e-03f, +7.337138299e-04f, -5.684480574e-04f, -1.561995332e-03f, -1.112376164e-03f, +4.396223536e-04f, +1.551623638e-03f, +1.165003181e-03f, -1.823498829e-04f, -1.081214627e-03f, -8.278590914e-04f, +1.655642461e-05f, +5.089732471e-04f, +3.664192875e-04f, +6.580123046e-06f, -1.433906409e-04f, -7.210900003e-05f, + /* 5,24 (24) */ + -5.643694384e-04f, +4.512707211e-05f, +3.235699809e-03f, +7.335960409e-03f, +5.919712473e-03f, -7.259551025e-03f, -2.824022754e-02f, -3.748063015e-02f, -9.057257510e-03f, +6.783868500e-02f, +1.720595018e-01f, +2.562816556e-01f, +2.758829758e-01f, +2.199465191e-01f, +1.191364748e-01f, +2.383417351e-02f, -2.928076761e-02f, -3.601997023e-02f, -1.765472195e-02f, +9.090354189e-04f, +7.821422237e-03f, +5.481761881e-03f, +1.306217952e-03f, -5.180336168e-04f, + +8.383301236e-06f, -5.454515320e-05f, -1.353477948e-04f, -8.673857115e-05f, +2.050699399e-04f, +5.909720811e-04f, +6.142897157e-04f, -1.602843179e-04f, -1.638838817e-03f, -3.014229729e-03f, -3.231062568e-03f, -1.824513555e-03f, +5.892595910e-04f, +2.672207845e-03f, +3.326363721e-03f, +2.453322127e-03f, +8.950481981e-04f, -3.135809844e-04f, -6.829012778e-04f, -4.222645286e-04f, -3.915649547e-05f, +1.364860053e-04f, +1.028676561e-04f, +1.752145831e-05f, + +3.904392586e-04f, -1.967818308e-03f, -6.229727930e-03f, -5.547864393e-03f, +6.052172423e-03f, +2.133718921e-02f, +2.093838707e-02f, -5.062878046e-03f, -3.781888416e-02f, -4.232826927e-02f, -5.913746036e-03f, +4.135694093e-02f, +5.401336222e-02f, +1.945081078e-02f, -2.827109103e-02f, -4.537102909e-02f, -2.281614072e-02f, +1.068323752e-02f, +2.426742224e-02f, +1.433763733e-02f, -1.070267324e-03f, -7.059538979e-03f, -4.166812678e-03f, -3.664644036e-04f, + +2.125061018e-05f, +1.226063853e-04f, +1.051823464e-04f, -1.788453450e-04f, -5.003317867e-04f, -3.462320965e-04f, +4.139718323e-04f, +1.087786960e-03f, +7.633368679e-04f, -5.243628805e-04f, -1.549847868e-03f, -1.149312357e-03f, +3.890319635e-04f, +1.537889400e-03f, +1.198300808e-03f, -1.400455284e-04f, -1.070459747e-03f, -8.500055040e-04f, -8.403359275e-06f, +5.040724819e-04f, +3.771457014e-04f, +1.588464000e-05f, -1.429875171e-04f, -7.554274255e-05f, + /* 5,25 (24) */ + -5.559861372e-04f, -9.418081089e-06f, +3.100352015e-03f, +7.249221838e-03f, +6.124782413e-03f, -6.668578944e-03f, -2.762593783e-02f, -3.764091446e-02f, -1.069609633e-02f, +6.482445528e-02f, +1.688284393e-01f, +2.544571421e-01f, +2.764722354e-01f, +2.226187269e-01f, +1.224628385e-01f, +2.628749564e-02f, -2.838571941e-02f, -3.633355121e-02f, -1.833762323e-02f, +4.867708903e-04f, +7.782265742e-03f, +5.618247886e-03f, +1.409085608e-03f, -5.005121585e-04f, + +9.318296287e-06f, -5.177803395e-05f, -1.338623287e-04f, -9.180557103e-05f, +1.928262058e-04f, +5.815509554e-04f, +6.242447504e-04f, -1.229816938e-04f, -1.588547642e-03f, -2.983937706e-03f, -3.249095277e-03f, -1.889599587e-03f, +5.113921588e-04f, +2.625154490e-03f, +3.331470676e-03f, +2.496804215e-03f, +9.429778464e-04f, -2.879634007e-04f, -6.833294152e-04f, -4.348252911e-04f, -4.880895984e-05f, +1.348310455e-04f, +1.055425602e-04f, +1.962494726e-05f, + +4.116898688e-04f, -1.845211923e-03f, -6.124545583e-03f, -5.726709738e-03f, +5.551840636e-03f, +2.099095711e-02f, +2.135235890e-02f, -3.975091086e-03f, -3.705554730e-02f, -4.285263215e-02f, -7.463593904e-03f, +4.020762858e-02f, +5.440239418e-02f, +2.098870018e-02f, -2.707279022e-02f, -4.551107462e-02f, -2.388660047e-02f, +9.833232013e-03f, +2.425901888e-02f, +1.484170981e-02f, -6.931216229e-04f, -7.043654339e-03f, -4.309800195e-03f, -4.420071462e-04f, + +1.856573183e-05f, +1.199884694e-04f, +1.096919351e-04f, -1.670102390e-04f, -4.949571413e-04f, -3.616467182e-04f, +3.861484449e-04f, +1.078443999e-03f, +7.919017969e-04f, -4.800191230e-04f, -1.536168113e-03f, -1.185016751e-03f, +3.380194324e-04f, +1.522547459e-03f, +1.230536590e-03f, -9.727502049e-05f, -1.058457753e-03f, -8.715092103e-04f, -3.375059295e-05f, +4.984793055e-04f, +3.876448820e-04f, +2.542905799e-05f, -1.423429413e-04f, -7.897239447e-05f, + /* 5,26 (24) */ + -5.466678409e-04f, -6.119611503e-05f, +2.966489686e-03f, +7.157416267e-03f, +6.317608619e-03f, -6.087027988e-03f, -2.700169308e-02f, -3.776389616e-02f, -1.228464397e-02f, +6.184051757e-02f, +1.655793440e-01f, +2.525675425e-01f, +2.769836275e-01f, +2.252438814e-01f, +1.257943092e-01f, +2.878429985e-02f, -2.744274156e-02f, -3.662151461e-02f, -1.902095264e-02f, +5.194559915e-05f, +7.733456782e-03f, +5.753078932e-03f, +1.514628169e-03f, -4.808872112e-04f, + +1.019013767e-05f, -4.904241628e-05f, -1.322549551e-04f, -9.661278677e-05f, +1.807142965e-04f, +5.717941984e-04f, +6.333828494e-04f, -8.644712225e-05f, -1.538215273e-03f, -2.952492044e-03f, -3.265443094e-03f, -1.953599949e-03f, +4.332250200e-04f, +2.576636113e-03f, +3.334986249e-03f, +2.539566192e-03f, +9.912733666e-04f, -2.614654838e-04f, -6.831023958e-04f, -4.472696310e-04f, -5.868992073e-05f, +1.329541876e-04f, +1.081683664e-04f, +2.178818569e-05f, + +4.302556006e-04f, -1.725223453e-03f, -6.014853648e-03f, -5.893719977e-03f, +5.056883495e-03f, +2.062931039e-02f, +2.173850735e-02f, -2.896647087e-03f, -3.626364550e-02f, -4.333265127e-02f, -8.999762017e-03f, +3.902261183e-02f, +5.474041361e-02f, +2.251124764e-02f, -2.584225363e-02f, -4.560834964e-02f, -2.494505822e-02f, +8.961722803e-03f, +2.422526829e-02f, +1.534018912e-02f, -3.054767409e-04f, -7.018225281e-03f, -4.452143136e-03f, -5.209795406e-04f, + +1.596062272e-05f, +1.172626453e-04f, +1.139058979e-04f, -1.552579119e-04f, -4.891011109e-04f, -3.763802705e-04f, +3.583005186e-04f, +1.068059295e-03f, +8.193854588e-04f, -4.354672150e-04f, -1.520976867e-03f, -1.219452595e-03f, +2.866400026e-04f, +1.505610351e-03f, +1.261669934e-03f, -5.408280882e-05f, -1.045210559e-03f, -8.923374305e-04f, -5.946029444e-05f, +4.921886228e-04f, +3.978979866e-04f, +3.520540164e-05f, -1.414509860e-04f, -8.239136339e-05f, + /* 5,27 (24) */ + -5.364777032e-04f, -1.102385313e-04f, +2.834234731e-03f, +7.060803480e-03f, +6.498322915e-03f, -5.515233790e-03f, -2.636831023e-02f, -3.785034328e-02f, -1.382285924e-02f, +5.888802553e-02f, +1.623139009e-01f, +2.506139425e-01f, +2.774168525e-01f, +2.278205175e-01f, +1.291292954e-01f, +3.132386605e-02f, -2.645146819e-02f, -3.688298010e-02f, -1.970405504e-02f, -3.953240318e-04f, +7.674766861e-03f, +5.886033120e-03f, +1.622796535e-03f, -4.590990255e-04f, + +1.099963891e-05f, -4.634129554e-05f, -1.305314530e-04f, -1.011617129e-04f, +1.687439147e-04f, +5.617193249e-04f, +6.417136720e-04f, -5.069408217e-05f, -1.487875705e-03f, -2.919923330e-03f, -3.280106316e-03f, -2.016479832e-03f, +3.548038886e-04f, +2.526675818e-03f, +3.336896596e-03f, +2.581572607e-03f, +1.039906603e-03f, -2.340910800e-04f, -6.822053868e-04f, -4.595816567e-04f, -6.879421704e-05f, +1.308512845e-04f, +1.107397924e-04f, +2.400981416e-05f, + +4.462162234e-04f, -1.607960808e-03f, -5.900947750e-03f, -6.048977889e-03f, +4.567782384e-03f, +2.025293012e-02f, +2.209680786e-02f, -1.828587792e-03f, -3.544426004e-02f, -4.376811848e-02f, -1.052073888e-02f, +3.780315923e-02f, +5.502705362e-02f, +2.401685799e-02f, -2.458058369e-02f, -4.566243245e-02f, -2.599026878e-02f, +8.069385372e-03f, +2.416580800e-02f, +1.583237774e-02f, +9.242124568e-05f, -6.983019879e-03f, -4.593594122e-03f, -6.033709040e-04f, + +1.343779690e-05f, +1.144368746e-04f, +1.178256924e-04f, -1.436026274e-04f, -4.827804113e-04f, -3.904257248e-04f, +3.304611022e-04f, +1.056655927e-03f, +8.457661589e-04f, -3.907575452e-04f, -1.504296605e-03f, -1.252584658e-03f, +2.349493624e-04f, +1.487092493e-03f, +1.291661356e-03f, -1.051413320e-05f, -1.030721596e-03f, -9.124578601e-04f, -8.550668452e-05f, +4.851961862e-04f, +4.078861655e-04f, +4.520517385e-05f, -1.403059826e-04f, -8.579289225e-05f, + /* 5,28 (24) */ + -5.254780643e-04f, -1.565798269e-04f, +2.703703278e-03f, +6.959641767e-03f, +6.667066830e-03f, -4.953514465e-03f, -2.572659656e-02f, -3.790103736e-02f, -1.531073495e-02f, +5.596810220e-02f, +1.590337946e-01f, +2.485974627e-01f, +2.777716564e-01f, +2.303471933e-01f, +1.324661920e-01f, +3.390543865e-02f, -2.541156159e-02f, -3.711707118e-02f, -2.038626042e-02f, -8.549056885e-04f, +7.605972644e-03f, +6.016884404e-03f, +1.733536327e-03f, -4.350892113e-04f, + +1.174769073e-05f, -4.367753023e-05f, -1.286975968e-04f, -1.054541107e-04f, +1.569243904e-04f, +5.513437972e-04f, +6.492474063e-04f, -1.573524375e-05f, -1.437562572e-03f, -2.886262718e-03f, -3.293086424e-03f, -2.078205281e-03f, +2.761746757e-04f, +2.475297788e-03f, +3.337188933e-03f, +2.622788251e-03f, +1.088848800e-03f, -2.058448186e-04f, -6.806238860e-04f, -4.717452654e-04f, -7.911631081e-05f, +1.285183626e-04f, +1.132514817e-04f, +2.628834081e-05f, + +4.596540203e-04f, -1.493523933e-03f, -5.783122058e-03f, -6.192580516e-03f, +4.085001973e-03f, +1.986250440e-02f, +2.242726897e-02f, -7.719318653e-04f, -3.459849388e-02f, -4.415887603e-02f, -1.202503549e-02f, +3.655057457e-02f, +5.526200298e-02f, +2.550395049e-02f, -2.328892234e-02f, -4.567294658e-02f, -2.702099038e-02f, +7.156927512e-03f, +2.408030131e-02f, +1.631757393e-02f, +5.003074112e-04f, -6.937814706e-03f, -4.733900105e-03f, -6.891637963e-04f, + +1.099953653e-05f, +1.115190818e-04f, +1.214531979e-04f, -1.320582228e-04f, -4.760120962e-04f, -4.037770445e-04f, +3.026628272e-04f, +1.044257977e-03f, +8.710236820e-04f, -3.459403981e-04f, -1.486151448e-03f, -1.284379276e-03f, +1.830035781e-04f, +1.467010163e-03f, +1.320472530e-03f, +3.338502793e-05f, -1.014995825e-03f, -9.318387172e-04f, -1.118632115e-04f, +4.774986143e-04f, +4.175905900e-04f, +5.541935889e-05f, -1.389025366e-04f, -8.917006763e-05f, + /* 5,29 (24) */ + -5.137303736e-04f, -2.002573571e-04f, +2.575005681e-03f, +6.854187656e-03f, +6.823991220e-03f, -4.402170668e-03f, -2.507734915e-02f, -3.791677261e-02f, -1.674829752e-02f, +5.308183948e-02f, +1.557407082e-01f, +2.465192574e-01f, +2.780478311e-01f, +2.328224911e-01f, +1.358033809e-01f, +3.652822691e-02f, -2.432271279e-02f, -3.732291599e-02f, -2.106688431e-02f, -1.326650954e-03f, +7.526856333e-03f, +6.145402767e-03f, +1.846787809e-03f, -4.088008705e-04f, + +1.243525760e-05f, -4.105384145e-05f, -1.267591490e-04f, -1.094920003e-04f, +1.452646791e-04f, +5.406850090e-04f, +6.559947516e-04f, +1.841753301e-05f, -1.387309121e-03f, -2.851541903e-03f, -3.304386071e-03f, -2.138743223e-03f, +1.973834540e-04f, +2.422527267e-03f, +3.335851552e-03f, +2.663178182e-03f, +1.138070623e-03f, -1.767321185e-04f, -6.783437400e-04f, -4.837441552e-04f, -8.965028562e-05f, +1.259516305e-04f, +1.156980079e-04f, +2.862214005e-05f, + +4.706535568e-04f, -1.382004851e-03f, -5.661668860e-03f, -6.324638739e-03f, +3.608989877e-03f, +1.945872735e-02f, +2.272993179e-02f, +2.723261116e-04f, -3.372747020e-02f, -4.450481643e-02f, -1.351118694e-02f, +3.526619530e-02f, +5.544500656e-02f, +2.697096065e-02f, -2.196844981e-02f, -4.563956155e-02f, -2.803598620e-02f, +6.225088795e-03f, +2.396843810e-02f, +1.679507254e-02f, +9.178980012e-04f, -6.882395347e-03f, -4.872802642e-03f, -7.783338639e-04f, + +8.647893339e-06f, +1.085171417e-04f, +1.247907041e-04f, -1.206380968e-04f, -4.688135280e-04f, -4.164291790e-04f, +2.749378696e-04f, +1.030890490e-03f, +8.951393075e-04f, -3.010658936e-04f, -1.466567125e-03f, -1.314804383e-03f, +1.308590259e-04f, +1.445381490e-03f, +1.348066343e-03f, +7.756801037e-05f, -9.980397348e-04f, -9.504487886e-04f, -1.385025771e-04f, +4.690934086e-04f, +4.269924794e-04f, +6.583842639e-05f, -1.372355424e-04f, -9.251582846e-05f, + /* 5,30 (24) */ + -5.012951160e-04f, -2.413111985e-04f, +2.448246532e-03f, +6.744695656e-03f, +6.969255899e-03f, -3.861485659e-03f, -2.442135440e-02f, -3.789835507e-02f, -1.813560664e-02f, +5.023029758e-02f, +1.524363221e-01f, +2.443805142e-01f, +2.782452146e-01f, +2.352450184e-01f, +1.391392325e-01f, +3.919140509e-02f, -2.318464217e-02f, -3.749964811e-02f, -2.174522805e-02f, -1.810395109e-03f, +7.437206048e-03f, +6.271354397e-03f, +1.962485817e-03f, -3.801787305e-04f, + +1.306337424e-05f, -3.847281259e-05f, -1.247218530e-04f, -1.132776529e-04f, +1.337733593e-04f, +5.297602692e-04f, +6.619669015e-04f, +5.175319886e-05f, -1.337148185e-03f, -2.815793091e-03f, -3.314009081e-03f, -2.198061489e-03f, +1.184764218e-04f, +2.368390551e-03f, +3.332873833e-03f, +2.702707759e-03f, +1.187542172e-03f, -1.467591928e-04f, -6.753511633e-04f, -4.955618386e-04f, -1.003898453e-04f, +1.231474882e-04f, +1.180738813e-04f, +3.100945145e-05f, + +4.793014501e-04f, -1.273487710e-03f, -5.536878156e-03f, -6.445276836e-03f, +3.140176349e-03f, +1.904229817e-02f, +2.300486966e-02f, +1.303216601e-03f, -3.283233089e-02f, -4.480588232e-02f, -1.497775406e-02f, +3.395139091e-02f, +5.557586558e-02f, +2.841634214e-02f, -2.062038347e-02f, -4.556199354e-02f, -2.903402594e-02f, +5.274640006e-03f, +2.382993552e-02f, +1.726416595e-02f, +1.344890481e-03f, -6.816556920e-03f, -5.010038184e-03f, -8.708496923e-04f, + +6.384690347e-06f, +1.054388668e-04f, +1.278408987e-04f, -1.093551967e-04f, -4.612023484e-04f, -4.283780575e-04f, +2.473179135e-04f, +1.016579433e-03f, +9.180958213e-04f, -2.561839252e-04f, -1.445570939e-03f, -1.343829552e-03f, +7.857232390e-05f, +1.422226433e-03f, +1.374406946e-03f, +1.219875182e-04f, -9.798613549e-04f, -9.682574761e-04f, -1.653967645e-04f, +4.599789698e-04f, +4.360731296e-04f, +7.645233616e-05f, -1.353001982e-04f, -9.582297529e-05f, + /* 5,31 (24) */ + -4.882317417e-04f, -2.797840111e-04f, +2.323524679e-03f, +6.631418003e-03f, +7.103029259e-03f, -3.331725390e-03f, -2.375938750e-02f, -3.784660187e-02f, -1.947275482e-02f, +4.741450448e-02f, +1.491223130e-01f, +2.421824527e-01f, +2.783636910e-01f, +2.376134089e-01f, +1.424721063e-01f, +4.189411285e-02f, -2.199710000e-02f, -3.764640731e-02f, -2.242057921e-02f, -2.305956948e-03f, +7.336816202e-03f, +6.394501885e-03f, +2.080559698e-03f, -3.491692790e-04f, + +1.363314209e-05f, -3.593688915e-05f, -1.225914265e-04f, -1.168135820e-04f, +1.224586306e-04f, +5.185867868e-04f, +6.671755267e-04f, +8.426151525e-05f, -1.287112166e-03f, -2.779048968e-03f, -3.321960433e-03f, -2.256128833e-03f, +3.949986729e-05f, +2.312914962e-03f, +3.328246260e-03f, +2.741342671e-03f, +1.237233007e-03f, -1.159330534e-04f, -6.716327570e-04f, -5.071816554e-04f, -1.113283129e-04f, +1.201025358e-04f, +1.203735541e-04f, +3.344837876e-05f, + +4.856861405e-04f, -1.168048843e-03f, -5.409037257e-03f, -6.554632032e-03f, +2.678974000e-03f, +1.861392011e-02f, +2.325218758e-02f, +2.319796034e-03f, -3.191423507e-02f, -4.506206625e-02f, -1.642332500e-02f, +3.260756136e-02f, +5.565443791e-02f, +2.983856857e-02f, -1.924597652e-02f, -4.544000602e-02f, -3.001388729e-02f, +4.306382530e-03f, +2.366453876e-02f, +1.772414492e-02f, +1.780963610e-03f, -6.740104584e-03f, -5.145338382e-03f, -9.666726676e-04f, + +4.211524069e-06f, +1.022919954e-04f, +1.306068552e-04f, -9.822200801e-05f, -4.531964488e-04f, -4.396205809e-04f, +2.198341146e-04f, +1.001351655e-03f, +9.398775262e-04f, -2.113441000e-04f, -1.423191721e-03f, -1.371426028e-03f, +2.620026282e-05f, +1.397566761e-03f, +1.399459798e-03f, +1.665956790e-04f, -9.604702507e-04f, -9.852348420e-04f, -1.925170661e-04f, +4.501546129e-04f, +4.448139414e-04f, +8.725054394e-05f, -1.330920197e-04f, -9.908417991e-05f, + /* 6, 0 (24) */ + -1.381477748e-03f, -3.077497149e-03f, -1.382496192e-04f, +9.451265441e-03f, +1.536116093e-02f, +3.798097220e-04f, -3.444119267e-02f, -5.173422453e-02f, -6.379548291e-04f, +1.279538359e-01f, +2.711624592e-01f, +3.340838290e-01f, +2.711624592e-01f, +1.279538359e-01f, -6.379548291e-04f, -5.173422453e-02f, -3.444119267e-02f, +3.798097220e-04f, +1.536116093e-02f, +9.451265441e-03f, -1.382496192e-04f, -3.077497149e-03f, -1.381477748e-03f, +1.529906491e-05f, + +6.563580115e-05f, +1.271846563e-05f, -2.073530798e-04f, -3.334856284e-04f, +5.702704247e-05f, +8.641498231e-04f, +1.101167895e-03f, -2.767627563e-04f, -2.907938350e-03f, -4.727706059e-03f, -3.710481723e-03f, -6.570013011e-05f, +3.627554861e-03f, +4.745152154e-03f, +2.990393068e-03f, +3.472346398e-04f, -1.085613170e-03f, -8.870096413e-04f, -7.896620590e-05f, +3.307378182e-04f, +2.150355900e-04f, -8.015428714e-06f, -6.635510628e-05f, -1.784466616e-05f, + +1.381477748e-03f, +3.077497149e-03f, -1.905329511e-03f, -9.009890737e-03f, -5.096548909e-03f, +1.240770844e-02f, +2.062426252e-02f, -2.077574300e-04f, -2.908566530e-02f, -2.444344784e-02f, +1.424658180e-02f, +3.770038936e-02f, +1.424658180e-02f, -2.444344784e-02f, -2.908566530e-02f, -2.077574300e-04f, +2.062426252e-02f, +1.240770844e-02f, -5.096548909e-03f, -9.009890737e-03f, -1.905329511e-03f, +2.574664269e-03f, +1.381477748e-03f, -1.529906491e-05f, + -6.563580115e-05f, -1.271846563e-05f, +2.339013135e-04f, +1.286753269e-04f, -3.844162184e-04f, -5.688768839e-04f, +1.643669824e-04f, +9.949917205e-04f, +5.645336545e-04f, -8.271109120e-04f, -1.277873593e-03f, -2.614726878e-05f, +1.261262345e-03f, +8.655401410e-04f, -5.277248058e-04f, -1.005173835e-03f, -1.968738343e-04f, +5.597509504e-04f, +4.003935711e-04f, -1.169654343e-04f, -2.376998145e-04f, -3.444877766e-05f, +6.635510628e-05f, +1.784466616e-05f, + /* 6, 1 (24) */ + -1.315841947e-03f, -3.064778684e-03f, -3.456026989e-04f, +9.117779812e-03f, +1.541818797e-02f, +1.243959545e-03f, -3.334002477e-02f, -5.201098729e-02f, -3.545893179e-03f, +1.232261298e-01f, +2.674519775e-01f, +3.340181289e-01f, +2.747900141e-01f, +1.326989880e-01f, +2.352438239e-03f, -5.138698989e-02f, -3.552680584e-02f, -5.071999193e-04f, +1.528219472e-02f, +9.782003259e-03f, +7.678597090e-05f, -3.085512578e-03f, -1.447832854e-03f, -2.545601248e-06f, + +6.481352384e-05f, +1.722631685e-05f, -1.995998244e-04f, -3.356832843e-04f, +3.558286875e-05f, +8.407479278e-04f, +1.115016669e-03f, -2.076808167e-04f, -2.824695277e-03f, -4.707280779e-03f, -3.790616984e-03f, -1.970487457e-04f, +3.541891040e-03f, +4.759580019e-03f, +3.071977016e-03f, +4.190523637e-04f, -1.068332631e-03f, -9.092848150e-04f, -1.013822117e-04f, +3.274289891e-04f, +2.226328496e-04f, -3.119045703e-06f, -6.696605421e-05f, -1.944806459e-05f, + +1.315841947e-03f, +3.064778684e-03f, -1.671428198e-03f, -8.881215410e-03f, -5.480965128e-03f, +1.183883156e-02f, +2.078862950e-02f, +7.872342904e-04f, -2.852113165e-02f, -2.527055875e-02f, +1.296870820e-02f, +3.767424209e-02f, +1.550784414e-02f, -2.357790770e-02f, -2.961339011e-02f, -1.212931265e-03f, +2.042738868e-02f, +1.296745939e-02f, -4.696155338e-03f, -9.126856171e-03f, -2.143029326e-03f, +2.540215492e-03f, +1.447832854e-03f, +2.545601248e-06f, + -6.481352384e-05f, -1.722631685e-05f, +2.297724939e-04f, +1.398967235e-04f, -3.681127511e-04f, -5.769611755e-04f, +1.320208631e-04f, +9.834114395e-04f, +6.002327499e-04f, -7.876498834e-04f, -1.292570593e-03f, -7.840153916e-05f, +1.242758144e-03f, +9.028730329e-04f, -4.898564049e-04f, -1.013928274e-03f, -2.294901511e-04f, +5.495832833e-04f, +4.160109560e-04f, -1.047782799e-04f, -2.411522223e-04f, -4.092376319e-05f, +6.696605421e-05f, +1.944806459e-05f, + /* 6, 2 (24) */ + -1.251028423e-03f, -3.047552367e-03f, -5.452025233e-04f, +8.782096528e-03f, +1.545377084e-02f, +2.084707473e-03f, -3.222500811e-02f, -5.221866811e-02f, -6.370588456e-03f, +1.185188490e-01f, +2.636613605e-01f, +3.338210801e-01f, +2.783319051e-01f, +1.374585680e-01f, +5.424415255e-03f, -5.096793753e-02f, -3.659513847e-02f, -1.416484734e-03f, +1.518081251e-02f, +1.010943225e-02f, +2.994188205e-04f, -3.088631624e-03f, -1.514798908e-03f, -2.199366583e-05f, + +6.389368841e-05f, +2.153753453e-05f, -1.917900568e-04f, -3.373421937e-04f, +1.465074660e-05f, +8.168463171e-04f, +1.127180907e-03f, -1.400308877e-04f, -2.740746193e-03f, -4.683917896e-03f, -3.867908757e-03f, -3.282424799e-04f, +3.453547606e-03f, +4.770953197e-03f, +3.152607797e-03f, +4.921698130e-04f, -1.049308023e-03f, -9.309326212e-04f, -1.242558299e-04f, +3.235488489e-04f, +2.301300971e-04f, +1.968444869e-06f, -6.746330023e-05f, -2.108315094e-05f, + +1.251028423e-03f, +3.047552367e-03f, -1.441655704e-03f, -8.741318686e-03f, -5.849077879e-03f, +1.126187038e-02f, +2.092065036e-02f, +1.770645730e-03f, -2.792089890e-02f, -2.605820864e-02f, +1.167613761e-02f, +3.759584055e-02f, +1.675060228e-02f, -2.267503467e-02f, -3.010324651e-02f, -2.226859539e-03f, +2.019789853e-02f, +1.351704268e-02f, -4.280144382e-03f, -9.231634451e-03f, -2.384181548e-03f, +2.499291729e-03f, +1.514798908e-03f, +2.199366583e-05f, + -6.389368841e-05f, -2.153753453e-05f, +2.253294414e-04f, +1.506195234e-04f, -3.515170566e-04f, -5.840057251e-04f, +9.988589785e-05f, +9.704645605e-04f, +6.347740361e-04f, -7.472229839e-04f, -1.305335186e-03f, -1.305350756e-04f, +1.222385389e-03f, +9.390465563e-04f, -4.509807251e-04f, -1.021227655e-03f, -2.621639014e-04f, +5.383756226e-04f, +4.312346192e-04f, -9.212622896e-05f, -2.442431118e-04f, -4.752681547e-05f, +6.746330023e-05f, +2.108315094e-05f, + /* 6, 3 (24) */ + -1.187134734e-03f, -3.026014832e-03f, -7.369925802e-04f, +8.444754334e-03f, +1.546842159e-02f, +2.901553790e-03f, -3.109782720e-02f, -5.235869900e-02f, -9.111334648e-03f, +1.138349311e-01f, +2.597934518e-01f, +3.334928377e-01f, +2.817854527e-01f, +1.422295212e-01f, +8.577023051e-03f, -5.047576772e-02f, -3.764444649e-02f, -2.347417355e-03f, +1.505655668e-02f, +1.043298110e-02f, +5.295489175e-04f, -3.086663179e-03f, -1.582262209e-03f, -4.307681677e-05f, + +6.288172682e-05f, +2.565105489e-05f, -1.839377214e-04f, -3.384742792e-04f, -5.753348927e-06f, +7.924870975e-04f, +1.137683536e-03f, -7.385297568e-05f, -2.656173279e-03f, -4.657661463e-03f, -3.942307950e-03f, -4.591782538e-04f, +3.362584557e-03f, +4.779237872e-03f, +3.232203116e-03f, +5.665388902e-04f, -1.028522733e-03f, -9.519102335e-04f, -1.475667527e-04f, +3.190877058e-04f, +2.375123335e-04f, +7.244398905e-06f, -6.784155157e-05f, -2.274722726e-05f, + +1.187134734e-03f, +3.026014832e-03f, -1.216326262e-03f, -8.590699163e-03f, -6.200594936e-03f, +1.067786466e-02f, +2.102053626e-02f, +2.741110290e-03f, -2.728612486e-02f, -2.680543162e-02f, +1.037080242e-02f, +3.746530547e-02f, +1.797298767e-02f, -2.173598811e-02f, -3.055422724e-02f, -3.248087194e-03f, +1.993573463e-02f, +1.405541830e-02f, -3.848909763e-03f, -9.323760680e-03f, -2.628424660e-03f, +2.451764913e-03f, +1.582262209e-03f, +4.307681677e-05f, + -6.288172682e-05f, -2.565105489e-05f, +2.205885129e-04f, +1.608347588e-04f, -3.346629931e-04f, -5.900142142e-04f, +6.801158183e-05f, +9.561846390e-04f, +6.681116709e-04f, -7.058974164e-04f, -1.316152368e-03f, -1.824676140e-04f, +1.200171545e-03f, +9.739992989e-04f, -4.111520349e-04f, -1.027046790e-03f, -2.948423740e-04f, +5.261315604e-04f, +4.460309708e-04f, -7.902277375e-05f, -2.469574470e-04f, -5.424738949e-05f, +6.784155157e-05f, +2.274722726e-05f, + /* 6, 4 (24) */ + -1.124253008e-03f, -3.000363778e-03f, -9.209303016e-04f, +8.106280055e-03f, +1.546266824e-02f, +3.694040888e-03f, -2.996014366e-02f, -5.243255197e-02f, -1.176750793e-02f, +1.091772697e-01f, +2.558511438e-01f, +3.330336594e-01f, +2.851480373e-01f, +1.470087591e-01f, +1.180922617e-02f, -4.990922883e-02f, -3.867296923e-02f, -3.299327589e-03f, +1.490898993e-02f, +1.075206880e-02f, +7.670612510e-04f, -3.079418780e-03f, -1.650103760e-03f, -6.582404402e-05f, + +6.178307809e-05f, +2.956619010e-05f, -1.760564584e-04f, -3.390919485e-04f, -2.561452950e-05f, +7.677120714e-04f, +1.146548940e-03f, -9.185006537e-06f, -2.571058474e-03f, -4.628557951e-03f, -4.013768311e-03f, -5.897532510e-04f, +3.269064490e-03f, +4.784402921e-03f, +3.310680875e-03f, +6.421095461e-04f, -1.005961845e-03f, -9.721747743e-04f, -1.712936001e-04f, +3.140364966e-04f, +2.447643402e-04f, +1.270576066e-05f, -6.809557905e-05f, -2.443743580e-05f, + +1.124253008e-03f, +3.000363778e-03f, -9.957377493e-04f, -8.429864404e-03f, -6.535257929e-03f, +1.008785045e-02f, +2.108854784e-02f, +3.697294929e-03f, -2.661801319e-02f, -2.751132904e-02f, +9.054650055e-03f, +3.728283786e-02f, +1.917315922e-02f, -2.076198881e-02f, -3.096537927e-02f, -4.275133985e-03f, +1.964089226e-02f, +1.458154986e-02f, -3.402878792e-03f, -9.402783454e-03f, -2.875382107e-03f, +2.397517524e-03f, +1.650103760e-03f, +6.582404402e-05f, + -6.178307809e-05f, -2.956619010e-05f, +2.155662977e-04f, +1.705345927e-04f, -3.175843266e-04f, -5.949920767e-04f, +3.644640680e-05f, +9.406071432e-04f, +7.002020898e-04f, -6.637415389e-04f, -1.325010312e-03f, -2.341192274e-04f, +1.176147110e-03f, +1.007671578e-03f, -3.704265174e-04f, -1.031362745e-03f, -3.274722649e-04f, +5.128565571e-04f, +4.603666510e-04f, -6.548252658e-05f, -2.492806200e-04f, -6.107441404e-05f, +6.809557905e-05f, +2.443743580e-05f, + /* 6, 5 (24) */ + -1.062469930e-03f, -2.970797587e-03f, -1.096986760e-03f, +7.767188107e-03f, +1.543705371e-02f, +4.461752959e-03f, -2.881359472e-02f, -5.244173698e-02f, -1.433856640e-02f, +1.045487117e-01f, +2.518373755e-01f, +3.324439062e-01f, +2.884171018e-01f, +1.517931620e-01f, +1.511990704e-02f, -4.926711928e-02f, -3.967893107e-02f, -4.271502363e-03f, +1.473769633e-02f, +1.106610530e-02f, +1.011825591e-03f, -3.066713019e-03f, -1.718199339e-03f, -9.026147983e-05f, + +6.060317770e-05f, +3.328261961e-05f, -1.681595893e-04f, -3.392080658e-04f, -4.491899181e-05f, +7.425626902e-04f, +1.153802914e-03f, +5.393719231e-05f, -2.485483383e-03f, -4.596656183e-03f, -4.082246465e-03f, -7.198650226e-04f, +3.173052544e-03f, +4.786419960e-03f, +3.387959259e-03f, +7.188298137e-04f, -9.816121727e-04f, -9.916833680e-04f, -1.954139279e-04f, +3.083868143e-04f, +2.518706986e-04f, +1.834905721e-05f, -6.822022903e-05f, -2.615076039e-05f, + +1.062469930e-03f, +2.970797587e-03f, -7.801714517e-04f, -8.259329812e-03f, -6.852842255e-03f, +9.492858368e-03f, +2.112499425e-02f, +4.637902073e-03f, -2.591781110e-02f, -2.817507058e-02f, +7.729639742e-03f, +3.704871863e-02f, +2.034930633e-02f, -1.975431723e-02f, -3.133580579e-02f, -5.306496729e-03f, +1.931341999e-02f, +1.509440642e-02f, -2.942512141e-03f, -9.468265980e-03f, -3.124662727e-03f, +2.336443110e-03f, +1.718199339e-03f, +9.026147983e-05f, + -6.060317770e-05f, -3.328261961e-05f, +2.102795790e-04f, +1.797123137e-04f, -3.003146694e-04f, -5.989464665e-04f, +5.237786086e-06f, +9.237693767e-04f, +7.310040664e-04f, -6.208247442e-04f, -1.331900379e-03f, -2.854104603e-04f, +1.150345561e-03f, +1.040005548e-03f, -3.288621856e-04f, -1.034154896e-03f, -3.599997655e-04f, +4.985579560e-04f, +4.742085965e-04f, -5.152121081e-05f, -2.511984901e-04f, -6.799630432e-05f, +6.822022903e-05f, +2.615076039e-05f, + /* 6, 6 (24) */ + -1.001866752e-03f, -2.937514968e-03f, -1.265146349e-03f, +7.427980041e-03f, +1.539213472e-02f, +5.204315649e-03f, -2.765979181e-02f, -5.238779979e-02f, -1.682404978e-02f, +9.995205552e-02f, +2.477551290e-01f, +3.317240411e-01f, +2.915901543e-01f, +1.565795820e-01f, +1.850786630e-02f, -4.854828947e-02f, -4.066054324e-02f, -5.263185731e-03f, +1.454228240e-02f, +1.137449211e-02f, +1.263696290e-03f, -3.048363962e-03f, -1.786419568e-03f, -1.164122402e-04f, + +5.934744720e-05f, +3.680038110e-05f, -1.602601035e-04f, -3.388359222e-04f, -6.365401444e-05f, +7.170800082e-04f, +1.159472611e-03f, +1.154799069e-04f, -2.399529195e-03f, -4.562007266e-03f, -4.147701949e-03f, -8.494115912e-04f, +3.074616339e-03f, +4.785263390e-03f, +3.463956829e-03f, +7.966458449e-04f, -9.554623048e-04f, -1.010393195e-03f, -2.199042372e-04f, +3.021309355e-04f, +2.588158100e-04f, +2.417039358e-05f, -6.821043546e-05f, -2.788402811e-05f, + +1.001866752e-03f, +2.937514968e-03f, -5.698918727e-04f, -8.079617498e-03f, -7.153156925e-03f, +8.893911902e-03f, +2.113023204e-02f, +5.561671449e-03f, -2.518680704e-02f, -2.879589532e-02f, +6.397739363e-03f, +3.676330817e-02f, +2.149965189e-02f, -1.871431169e-02f, -3.166466798e-02f, -6.340651625e-03f, +1.895342023e-02f, +1.559296437e-02f, -2.468303545e-03f, -9.519787191e-03f, -3.375861217e-03f, +2.268446805e-03f, +1.786419568e-03f, +1.164122402e-04f, + -5.934744720e-05f, -3.680038110e-05f, +2.047452951e-04f, +1.883623296e-04f, -2.828874197e-04f, -6.018862218e-04f, -2.556801747e-05f, +9.057103977e-04f, +7.604787672e-04f, -5.772173382e-04f, -1.336817126e-03f, -3.362624619e-04f, +1.122803310e-03f, +1.070945305e-03f, -2.865187936e-04f, -1.035404989e-03f, -3.923706530e-04f, +4.832449927e-04f, +4.875241071e-04f, -3.715564929e-05f, -2.526974221e-04f, -7.500097594e-05f, +6.821043546e-05f, +2.788402811e-05f, + /* 6, 7 (24) */ + -9.425193046e-04f, -2.900714587e-03f, -1.425406453e-03f, +7.089144119e-03f, +1.532848070e-02f, +5.921395657e-03f, -2.650031920e-02f, -5.227231988e-02f, -1.922357898e-02f, +9.539004826e-02f, +2.436074271e-01f, +3.308746295e-01f, +2.946647707e-01f, +1.613648454e-01f, +2.197182313e-02f, -4.775164362e-02f, -4.161600555e-02f, -6.273578926e-03f, +1.432237817e-02f, +1.167662305e-02f, +1.522512100e-03f, -3.024193569e-03f, -1.854630004e-03f, -1.442962683e-04f, + +5.802128424e-05f, +4.011986105e-05f, -1.523706453e-04f, -3.379892059e-04f, -8.180795328e-05f, +6.913046371e-04f, +1.163586488e-03f, +1.754115491e-04f, -2.313276598e-03f, -4.524664529e-03f, -4.210097246e-03f, -9.782915545e-04f, +2.973825913e-03f, +4.780910436e-03f, +3.538592610e-03f, +8.755019491e-04f, -9.275026422e-04f, -1.028261548e-03f, -2.447399846e-04f, +2.952618468e-04f, +2.655839161e-04f, +3.016544842e-05f, -6.806123211e-05f, -2.963391142e-05f, + +9.425193046e-04f, +2.900714587e-03f, -3.651465776e-04f, -7.891255168e-03f, -7.436044344e-03f, +8.292025680e-03f, +2.110466402e-02f, +6.467381847e-03f, -2.442632827e-02f, -2.937311266e-02f, +5.060922236e-03f, +3.642704571e-02f, +2.262245520e-02f, -1.764336638e-02f, -3.195118677e-02f, -7.376056614e-03f, +1.856104957e-02f, +1.607620937e-02f, -1.980779438e-03f, -9.556942840e-03f, -3.628558639e-03f, +2.193445829e-03f, +1.854630004e-03f, +1.442962683e-04f, + -5.802128424e-05f, -4.011986105e-05f, +1.989805015e-04f, +1.964801581e-04f, -2.653357019e-04f, -6.038218276e-04f, -5.592596085e-05f, +8.864709371e-04f, +7.885898027e-04f, -5.329904173e-04f, -1.339758308e-03f, -3.865971177e-04f, +1.093559642e-03f, +1.100436991e-03f, -2.434577447e-04f, -1.035097187e-03f, -4.245303820e-04f, +4.669288026e-04f, +5.002809122e-04f, -2.240375052e-05f, -2.537643245e-04f, -8.207586033e-05f, +6.806123211e-05f, +2.963391142e-05f, + /* 6, 8 (24) */ + -8.844980204e-04f, -2.860594726e-03f, -1.577777098e-03f, +6.751154913e-03f, +1.524667275e-02f, +6.612700294e-03f, -2.533673271e-02f, -5.209690833e-02f, -2.153685558e-02f, +9.086538373e-02f, +2.393973298e-01f, +3.298963380e-01f, +2.976385966e-01f, +1.661457558e-01f, +2.551041574e-02f, -4.687614167e-02f, -4.254350819e-02f, -7.301840474e-03f, +1.407763818e-02f, +1.197188490e-02f, +1.788096016e-03f, -2.994028120e-03f, -1.922691236e-03f, -1.739301798e-04f, + +5.663005275e-05f, +4.324178486e-05f, -1.445035018e-04f, -3.366819736e-04f, -9.937023555e-05f, +6.652767031e-04f, +1.166174257e-03f, +2.337026664e-04f, -2.226805702e-03f, -4.484683449e-03f, -4.269397810e-03f, -1.106404188e-03f, +2.870753655e-03f, +4.773341188e-03f, +3.611786181e-03f, +9.553406348e-04f, -8.977254349e-04f, -1.045245885e-03f, -2.698955957e-04f, +2.877732716e-04f, +2.721591211e-04f, +3.632947036e-05f, -6.776776486e-05f, -3.139693059e-05f, + +8.844980204e-04f, +2.860594726e-03f, -1.661660761e-04f, -7.694775010e-03f, -7.701380046e-03f, +7.688203853e-03f, +2.104873806e-02f, +7.353852784e-03f, -2.363773847e-02f, -2.990610308e-02f, +3.721163928e-03f, +3.604044859e-02f, +2.371601484e-02f, -1.654292939e-02f, -3.219464451e-02f, -8.411153801e-03f, +1.813651919e-02f, +1.654313817e-02f, -1.480498526e-03f, -9.579346591e-03f, -3.882322963e-03f, +2.111369969e-03f, +1.922691236e-03f, +1.739301798e-04f, + -5.663005275e-05f, -4.324178486e-05f, +1.930023331e-04f, +2.040624157e-04f, -2.476923088e-04f, -6.047653749e-04f, -8.579228719e-05f, +8.660933128e-04f, +8.153032736e-04f, -4.882157442e-04f, -1.340724874e-03f, -4.363371811e-04f, +1.062656658e-03f, +1.128428889e-03f, -1.997419964e-04f, -1.033218118e-03f, -4.564241782e-04f, +4.496224237e-04f, +5.124472386e-04f, -7.284492294e-06f, -2.543866878e-04f, -8.920792150e-05f, +6.776776486e-05f, +3.139693059e-05f, + /* 6, 9 (24) */ + -8.278679676e-04f, -2.817352941e-03f, -1.722280600e-03f, +6.414472939e-03f, +1.514730251e-02f, +7.277976997e-03f, -2.417055845e-02f, -5.186320566e-02f, -2.376366128e-02f, +8.638070028e-02f, +2.351279320e-01f, +3.287899338e-01f, +3.005093502e-01f, +1.709190970e-01f, +2.912220192e-02f, -4.592080104e-02f, -4.344123363e-02f, -8.347086359e-03f, +1.380774258e-02f, +1.225965817e-02f, +2.060255137e-03f, -2.957698650e-03f, -1.990459001e-03f, -2.053271103e-04f, + +5.517907351e-05f, +4.616720663e-05f, -1.366705918e-04f, -3.349286204e-04f, -1.163313523e-04f, +6.390358040e-04f, +1.167266825e-03f, +2.903259489e-04f, -2.140195948e-03f, -4.442121581e-03f, -4.325572093e-03f, -1.233649549e-03f, +2.765474238e-03f, +4.762538634e-03f, +3.683457771e-03f, +1.036102654e-03f, -8.661248172e-04f, -1.061303886e-03f, -2.953444788e-04f, +2.796596949e-04f, +2.785254130e-04f, +4.265727503e-05f, -6.732530413e-05f, -3.316945658e-05f, + +8.278679676e-04f, +2.817352941e-03f, +2.683625699e-05f, -7.490712594e-03f, -7.949072355e-03f, +7.083438478e-03f, +2.096294577e-02f, +8.219946097e-03f, -2.282243519e-02f, -3.039431882e-02f, +2.380439054e-03f, +3.560411141e-02f, +2.477867150e-02f, -1.541450050e-02f, -3.239438651e-02f, -9.444371919e-03f, +1.768009501e-02f, +1.699276059e-02f, -9.680512870e-04f, -9.586631083e-03f, -4.136709651e-03f, +2.022162048e-03f, +1.990459001e-03f, +2.053271103e-04f, + -5.517907351e-05f, -4.616720663e-05f, +1.868279672e-04f, +2.111068049e-04f, -2.299896455e-04f, -6.047305176e-04f, -1.151245892e-04f, +8.446213427e-04f, +8.405878122e-04f, -4.429656241e-04f, -1.339720954e-03f, -4.854064019e-04f, +1.030139207e-03f, +1.154871522e-03f, -1.554359608e-04f, -1.029756914e-03f, -4.879971326e-04f, +4.313407968e-04f, +5.239918765e-04f, +8.182096944e-06f, -2.545526212e-04f, -9.638367424e-05f, +6.732530413e-05f, +3.316945658e-05f, + /* 6,10 (24) */ + -7.726888941e-04f, -2.771185734e-03f, -1.858951192e-03f, +6.079544319e-03f, +1.503097116e-02f, +7.917012801e-03f, -2.300329163e-02f, -5.157287971e-02f, -2.590385723e-02f, +8.193857870e-02f, +2.308023599e-01f, +3.275562843e-01f, +3.032748245e-01f, +1.756816356e-01f, +3.280565969e-02f, -4.488469839e-02f, -4.430735844e-02f, -9.408390245e-03f, +1.351239811e-02f, +1.253931786e-02f, +2.338780550e-03f, -2.915041375e-03f, -2.057784305e-03f, -2.384965669e-04f, + +5.367361504e-05f, +4.889749865e-05f, -1.288834556e-04f, -3.327438508e-04f, -1.326828498e-04f, +6.126209686e-04f, +1.166896245e-03f, +3.452562339e-04f, -2.053526041e-03f, -4.397038482e-03f, -4.378591568e-03f, -1.359928574e-03f, +2.658064548e-03f, +4.748488696e-03f, +3.753528341e-03f, +1.117727050e-03f, -8.326968404e-04f, -1.076393514e-03f, -3.210590406e-04f, +2.709163893e-04f, +2.846666873e-04f, +4.914324270e-05f, -6.672925739e-05f, -3.494771420e-05f, + +7.726888941e-04f, +2.771185734e-03f, +2.136642242e-04f, -7.279605790e-03f, -8.179062001e-03f, +6.478707960e-03f, +2.084782118e-02f, +9.064567440e-03f, -2.198184738e-02f, -3.083728444e-02f, +1.040718100e-03f, +3.511870501e-02f, +2.580881071e-02f, -1.425962898e-02f, -3.254982247e-02f, -1.047412883e-02f, +1.719209788e-02f, +1.742410139e-02f, -4.440594105e-04f, -9.578448986e-03f, -4.391262272e-03f, +1.925778373e-03f, +2.057784305e-03f, +2.384965669e-04f, + -5.367361504e-05f, -4.889749865e-05f, +1.804745870e-04f, +2.176120983e-04f, -2.122596742e-04f, -6.037324270e-04f, -1.438818692e-04f, +8.221002559e-04f, +8.644146191e-04f, -3.973127796e-04f, -1.336753852e-03f, -5.337296543e-04f, +9.960548144e-04f, +1.179717742e-03f, -1.106054035e-04f, -1.024705255e-03f, -5.191942975e-04f, +4.121007614e-04f, +5.348842467e-04f, +2.397495925e-05f, -2.542508895e-04f, -1.035892036e-04f, +6.672925739e-05f, +3.494771420e-05f, + /* 6,11 (24) */ + -7.190152791e-04f, -2.722288236e-03f, -1.987834647e-03f, +5.746800468e-03f, +1.489828831e-02f, +8.529633770e-03f, -2.183639538e-02f, -5.122762348e-02f, -2.795738327e-02f, +7.754154022e-02f, +2.264237684e-01f, +3.261963557e-01f, +3.059328890e-01f, +1.804301243e-01f, +3.655918803e-02f, -4.376697134e-02f, -4.514005528e-02f, -1.048478376e-02f, +1.319133907e-02f, +1.281023425e-02f, +2.623447237e-03f, -2.865898132e-03f, -2.124513562e-03f, -2.734442811e-04f, + +5.211888475e-05f, +5.143434051e-05f, -1.211532453e-04f, -3.301426497e-04f, -1.484173194e-04f, +5.860706170e-04f, +1.165095656e-03f, +3.984705076e-04f, -1.966873861e-03f, -4.349495642e-03f, -4.428430743e-03f, -1.485143182e-03f, +2.548603607e-03f, +4.731180255e-03f, +3.821919682e-03f, +1.200151202e-03f, -7.974395044e-04f, -1.090473064e-03f, -3.470107043e-04f, +2.615394385e-04f, +2.905667697e-04f, +5.578131674e-05f, -6.597518170e-05f, -3.672778576e-05f, + +7.190152791e-04f, +2.722288236e-03f, +3.941388112e-04f, -7.061993691e-03f, -8.391321675e-03f, +5.874975533e-03f, +2.070393931e-02f, +9.886667696e-03f, -2.111743276e-02f, -3.123459722e-02f, -2.960357521e-04f, +3.458497535e-02f, +2.680486552e-02f, -1.307991124e-02f, -3.266042788e-02f, -1.149883409e-02f, +1.667290358e-02f, +1.783620215e-02f, +9.082483626e-05f, -9.554474027e-03f, -4.645513162e-03f, +1.822189170e-03f, +2.124513562e-03f, +2.734442811e-04f, + -5.211888475e-05f, -5.143434051e-05f, +1.739593458e-04f, +2.235781227e-04f, -1.945338611e-04f, -6.017877439e-04f, -1.720245964e-04f, +7.985766012e-04f, +8.867574951e-04f, -3.513302258e-04f, -1.331834017e-03f, -5.812330620e-04f, +9.604536064e-04f, +1.202922818e-03f, -6.531733867e-05f, -1.018057400e-03f, -5.499607829e-04f, +3.919210484e-04f, +5.450944670e-04f, +4.007203065e-05f, -2.534709491e-04f, -1.108101859e-04f, +6.597518170e-05f, +3.672778576e-05f, + /* 6,12 (24) */ + -6.668963943e-04f, -2.670853895e-03f, -2.108987893e-03f, +5.416657818e-03f, +1.474987099e-02f, +9.115704387e-03f, -2.067129973e-02f, -5.082915297e-02f, -2.992425713e-02f, +7.319204457e-02f, +2.219953376e-01f, +3.247112125e-01f, +3.084814926e-01f, +1.851613046e-01f, +4.038110771e-02f, -4.256682013e-02f, -4.593749479e-02f, -1.157525682e-02f, +1.284432836e-02f, +1.307177369e-02f, +2.914014007e-03f, -2.810116815e-03f, -2.190488744e-03f, -3.101720669e-04f, + +5.052002055e-05f, +5.377970800e-05f, -1.134907162e-04f, -3.271402533e-04f, -1.635283859e-04f, +5.594225224e-04f, +1.161899229e-03f, +4.499479043e-04f, -1.880316393e-03f, -4.299556399e-03f, -4.475067179e-03f, -1.609196375e-03f, +2.437172497e-03f, +4.710605181e-03f, +3.888554500e-03f, +1.283310884e-03f, -7.603527866e-04f, -1.103501229e-03f, -3.731699285e-04f, +2.515257613e-04f, +2.962094404e-04f, +6.256500263e-05f, -6.505879630e-05f, -3.850561505e-05f, + +6.668963943e-04f, +2.670853895e-03f, +5.680981570e-04f, -6.838415569e-03f, -8.585855536e-03f, +5.273187789e-03f, +2.053191472e-02f, +1.068524430e-02f, -2.023067527e-02f, -3.158592745e-02f, -1.627869769e-03f, +3.400374229e-02f, +2.776531913e-02f, -1.187698842e-02f, -3.272574521e-02f, -1.251689149e-02f, +1.612294280e-02f, +1.822812320e-02f, +6.359193033e-04f, -9.514401996e-03f, -4.898984111e-03f, +1.711378984e-03f, +2.190488744e-03f, +3.101720669e-04f, + -5.052002055e-05f, -5.377970800e-05f, +1.672993318e-04f, +2.290057391e-04f, -1.768431249e-04f, -5.989145286e-04f, -1.995147604e-04f, +7.740981547e-04f, +9.075928686e-04f, -3.050911452e-04f, -1.324975022e-03f, -6.278441214e-04f, +9.233882296e-04f, +1.224444521e-03f, -1.963992123e-05f, -1.009810214e-03f, -5.802418545e-04f, +3.708222693e-04f, +5.545934181e-04f, +5.645026705e-05f, -2.522029828e-04f, -1.180319106e-04f, +6.505879630e-05f, +3.850561505e-05f, + /* 6,13 (24) */ + -6.163763738e-04f, -2.617074187e-03f, -2.222478609e-03f, +5.089517565e-03f, +1.458634261e-02f, +9.675126909e-03f, -1.950940050e-02f, -5.037920507e-02f, -3.180457352e-02f, +6.889248817e-02f, +2.175202704e-01f, +3.231020161e-01f, +3.109186651e-01f, +1.898719098e-01f, +4.426966222e-02f, -4.128350925e-02f, -4.669784758e-02f, -1.267875805e-02f, +1.247115843e-02f, +1.332329945e-02f, +3.210223448e-03f, -2.747551813e-03f, -2.255547540e-03f, -3.486776819e-04f, + +4.888208265e-05f, +5.593586166e-05f, -1.059062192e-04f, -3.237521202e-04f, -1.780106955e-04f, +5.327137747e-04f, +1.157342108e-03f, +4.996697028e-04f, -1.793929652e-03f, -4.247285863e-03f, -4.518481500e-03f, -1.731992329e-03f, +2.323854286e-03f, +4.686758351e-03f, +3.953356508e-03f, +1.367140312e-03f, -7.214386688e-04f, -1.115437151e-03f, -3.995062278e-04f, +2.408731346e-04f, +3.015784591e-04f, +6.948736784e-05f, -6.397599520e-05f, -4.027701168e-05f, + +6.163763738e-04f, +2.617074187e-03f, +7.353974888e-04f, -6.609409829e-03f, -8.762698661e-03f, +4.674273261e-03f, +2.033239995e-02f, +1.145934245e-02f, -1.932308240e-02f, -3.189101859e-02f, -2.952844791e-03f, +3.337589817e-02f, +2.868870736e-02f, -1.065254390e-02f, -3.274538514e-02f, -1.352670170e-02f, +1.554270095e-02f, +1.859894547e-02f, +1.190512721e-03f, -9.457951729e-03f, -5.151187094e-03f, +1.593347073e-03f, +2.255547540e-03f, +3.486776819e-04f, + -4.888208265e-05f, -5.593586166e-05f, +1.605115338e-04f, +2.338968232e-04f, -1.592177872e-04f, -5.951322091e-04f, -2.263159219e-04f, +7.487138261e-04f, +9.268998177e-04f, -2.586687636e-04f, -1.316193531e-03f, -6.734918225e-04f, +8.849137654e-04f, +1.244243205e-03f, +2.635766287e-05f, -9.999631993e-04f, -6.099830312e-04f, +3.488269012e-04f, +5.633528087e-04f, +7.308567245e-05f, -2.504379341e-04f, -1.252393043e-04f, +6.397599520e-05f, +4.027701168e-05f, + /* 6,14 (24) */ + -5.674942911e-04f, -2.561138325e-03f, -2.328384828e-03f, +4.765765445e-03f, +1.440833191e-02f, +1.020784068e-02f, -1.835205839e-02f, -4.987953537e-02f, -3.359850317e-02f, +6.464520231e-02f, +2.130017889e-01f, +3.213700238e-01f, +3.132425194e-01f, +1.945586681e-01f, +4.822301872e-02f, -3.991636894e-02f, -4.741928624e-02f, -1.379419520e-02f, +1.207165220e-02f, +1.356417259e-02f, +3.511801907e-03f, -2.678064445e-03f, -2.319523535e-03f, -3.889546936e-04f, + +4.721004585e-05f, +5.790533520e-05f, -9.840969351e-05f, -3.199939028e-04f, -1.918599014e-04f, +5.059807448e-04f, +1.151460357e-03f, +5.476193212e-04f, -1.707788607e-03f, -4.192750838e-03f, -4.558657401e-03f, -1.853436500e-03f, +2.208733939e-03f, +4.659637675e-03f, +4.016250511e-03f, +1.451572205e-03f, -6.807011622e-04f, -1.126240484e-03f, -4.259881958e-04f, +2.295802150e-04f, +3.066575897e-04f, +7.654104238e-05f, -6.272285979e-05f, -4.203765589e-05f, + +5.674942911e-04f, +2.561138325e-03f, +8.959090226e-04f, -6.375513006e-03f, -8.921916448e-03f, +4.079141051e-03f, +2.010608403e-02f, +1.220805628e-02f, -1.839618258e-02f, -3.214968736e-02f, -4.269038322e-03f, +3.270240635e-02f, +2.957362112e-02f, -9.408300692e-03f, -3.271902747e-02f, -1.452666490e-02f, +1.493271791e-02f, +1.894777237e-02f, +1.753865530e-03f, -9.384866057e-03f, -5.401625028e-03f, +1.468107769e-03f, +2.319523535e-03f, +3.889546936e-04f, + -4.721004585e-05f, -5.790533520e-05f, +1.536128079e-04f, +2.382542419e-04f, -1.416875244e-04f, -5.904615270e-04f, -2.523932593e-04f, +7.224735630e-04f, +9.446600874e-04f, -2.121362253e-04f, -1.305509262e-03f, -7.181067668e-04f, +8.450876411e-04f, +1.262281880e-03f, +7.260530933e-05f, -9.885185114e-04f, -6.391301841e-04f, +3.259592689e-04f, +5.713452407e-04f, +8.995332953e-05f, -2.481675405e-04f, -1.324169550e-04f, +6.272285979e-05f, +4.203765589e-05f, + /* 6,15 (24) */ + -5.202842453e-04f, -2.503232990e-03f, -2.426794521e-03f, +4.445771542e-03f, +1.421647201e-02f, +1.071382143e-02f, -1.720059803e-02f, -4.933191604e-02f, -3.530629178e-02f, +6.045245147e-02f, +2.084431315e-01f, +3.195165873e-01f, +3.154512533e-01f, +1.992183058e-01f, +5.223926923e-02f, -3.846479673e-02f, -4.809998741e-02f, -1.492043569e-02f, +1.164566401e-02f, +1.379375280e-02f, +3.818459496e-03f, -2.601523403e-03f, -2.382246395e-03f, -4.309923495e-04f, + +4.550879214e-05f, +5.969092366e-05f, -9.101066092e-05f, -3.158814194e-04f, -2.050726491e-04f, +4.792590514e-04f, +1.144290896e-03f, +5.937823076e-04f, -1.621967112e-03f, -4.136019738e-03f, -4.595581654e-03f, -1.973435708e-03f, +2.091898242e-03f, +4.629244105e-03f, +4.077162501e-03f, +1.536537839e-03f, -6.381463300e-04f, -1.135871450e-03f, -4.525835287e-04f, +2.176465602e-04f, +3.114306263e-04f, +8.371822012e-05f, -6.129567137e-05f, -4.378310363e-05f, + +5.202842453e-04f, +2.503232990e-03f, +1.049521831e-03f, -6.137258764e-03f, -9.063603972e-03f, +3.488679524e-03f, +1.985369077e-02f, +1.293052984e-02f, -1.745152249e-02f, -3.236182358e-02f, -5.574547584e-03f, +3.198429958e-02f, +3.041870876e-02f, -8.146018813e-03f, -3.264642216e-02f, -1.551518341e-02f, +1.429358773e-02f, +1.927373164e-02f, +2.325210771e-03f, -9.294912727e-03f, -5.649792568e-03f, +1.335690814e-03f, +2.382246395e-03f, +4.309923495e-04f, + -4.550879214e-05f, -5.969092366e-05f, +1.466198448e-04f, +2.420818303e-04f, -1.242813225e-04f, -5.849244815e-04f, -2.777136124e-04f, +6.954282546e-04f, +9.608581028e-04f, -1.655664700e-04f, -1.292944947e-03f, -7.616212822e-04f, +8.039695356e-04f, +1.278526282e-03f, +1.190321101e-04f, -9.754809765e-04f, -6.676296348e-04f, +3.022455226e-04f, +5.785442723e-04f, +1.070274325e-04f, -2.453843657e-04f, -1.395491384e-04f, +6.129567137e-05f, +4.378310363e-05f, + /* 6,16 (24) */ + -4.747754531e-04f, -2.443542066e-03f, -2.517805182e-03f, +4.129890123e-03f, +1.401139936e-02f, +1.119308048e-02f, -1.605630714e-02f, -4.873813374e-02f, -3.692825889e-02f, +5.631643174e-02f, +2.038475499e-01f, +3.175431516e-01f, +3.175431516e-01f, +2.038475499e-01f, +5.631643174e-02f, -3.692825889e-02f, -4.873813374e-02f, -1.605630714e-02f, +1.119308048e-02f, +1.401139936e-02f, +4.129890123e-03f, -2.517805182e-03f, -2.443542066e-03f, -4.747754531e-04f, + +4.378310363e-05f, +6.129567137e-05f, -8.371822012e-05f, -3.114306263e-04f, -2.176465602e-04f, +4.525835287e-04f, +1.135871450e-03f, +6.381463300e-04f, -1.536537839e-03f, -4.077162501e-03f, -4.629244105e-03f, -2.091898242e-03f, +1.973435708e-03f, +4.595581654e-03f, +4.136019738e-03f, +1.621967112e-03f, -5.937823076e-04f, -1.144290896e-03f, -4.792590514e-04f, +2.050726491e-04f, +3.158814194e-04f, +9.101066092e-05f, -5.969092366e-05f, -4.550879214e-05f, + +4.747754531e-04f, +2.443542066e-03f, +1.196141675e-03f, -5.895176934e-03f, -9.187885295e-03f, +2.903755043e-03f, +1.957597716e-02f, +1.362595810e-02f, -1.649066439e-02f, -3.252739005e-02f, -6.867492530e-03f, +3.122267830e-02f, +3.122267830e-02f, -6.867492530e-03f, -3.252739005e-02f, -1.649066439e-02f, +1.362595810e-02f, +1.957597716e-02f, +2.903755043e-03f, -9.187885295e-03f, -5.895176934e-03f, +1.196141675e-03f, +2.443542066e-03f, +4.747754531e-04f, + -4.378310363e-05f, -6.129567137e-05f, +1.395491384e-04f, +2.453843657e-04f, -1.070274325e-04f, -5.785442723e-04f, -3.022455226e-04f, +6.676296348e-04f, +9.754809765e-04f, -1.190321101e-04f, -1.278526282e-03f, -8.039695356e-04f, +7.616212822e-04f, +1.292944947e-03f, +1.655664700e-04f, -9.608581028e-04f, -6.954282546e-04f, +2.777136124e-04f, +5.849244815e-04f, +1.242813225e-04f, -2.420818303e-04f, -1.466198448e-04f, +5.969092366e-05f, +4.550879214e-05f, + /* 6,17 (24) */ + -4.309923495e-04f, -2.382246395e-03f, -2.601523403e-03f, +3.818459496e-03f, +1.379375280e-02f, +1.164566401e-02f, -1.492043569e-02f, -4.809998741e-02f, -3.846479673e-02f, +5.223926923e-02f, +1.992183058e-01f, +3.154512533e-01f, +3.195165873e-01f, +2.084431315e-01f, +6.045245147e-02f, -3.530629178e-02f, -4.933191604e-02f, -1.720059803e-02f, +1.071382143e-02f, +1.421647201e-02f, +4.445771542e-03f, -2.426794521e-03f, -2.503232990e-03f, -5.202842453e-04f, + +4.203765589e-05f, +6.272285979e-05f, -7.654104238e-05f, -3.066575897e-04f, -2.295802150e-04f, +4.259881958e-04f, +1.126240484e-03f, +6.807011622e-04f, -1.451572205e-03f, -4.016250511e-03f, -4.659637675e-03f, -2.208733939e-03f, +1.853436500e-03f, +4.558657401e-03f, +4.192750838e-03f, +1.707788607e-03f, -5.476193212e-04f, -1.151460357e-03f, -5.059807448e-04f, +1.918599014e-04f, +3.199939028e-04f, +9.840969351e-05f, -5.790533520e-05f, -4.721004585e-05f, + +4.309923495e-04f, +2.382246395e-03f, +1.335690814e-03f, -5.649792568e-03f, -9.294912727e-03f, +2.325210771e-03f, +1.927373164e-02f, +1.429358773e-02f, -1.551518341e-02f, -3.264642216e-02f, -8.146018813e-03f, +3.041870876e-02f, +3.198429958e-02f, -5.574547584e-03f, -3.236182358e-02f, -1.745152249e-02f, +1.293052984e-02f, +1.985369077e-02f, +3.488679524e-03f, -9.063603972e-03f, -6.137258764e-03f, +1.049521831e-03f, +2.503232990e-03f, +5.202842453e-04f, + -4.203765589e-05f, -6.272285979e-05f, +1.324169550e-04f, +2.481675405e-04f, -8.995332953e-05f, -5.713452407e-04f, -3.259592689e-04f, +6.391301841e-04f, +9.885185114e-04f, -7.260530933e-05f, -1.262281880e-03f, -8.450876411e-04f, +7.181067668e-04f, +1.305509262e-03f, +2.121362253e-04f, -9.446600874e-04f, -7.224735630e-04f, +2.523932593e-04f, +5.904615270e-04f, +1.416875244e-04f, -2.382542419e-04f, -1.536128079e-04f, +5.790533520e-05f, +4.721004585e-05f, + /* 6,18 (24) */ + -3.889546936e-04f, -2.319523535e-03f, -2.678064445e-03f, +3.511801907e-03f, +1.356417259e-02f, +1.207165220e-02f, -1.379419520e-02f, -4.741928624e-02f, -3.991636894e-02f, +4.822301872e-02f, +1.945586681e-01f, +3.132425194e-01f, +3.213700238e-01f, +2.130017889e-01f, +6.464520231e-02f, -3.359850317e-02f, -4.987953537e-02f, -1.835205839e-02f, +1.020784068e-02f, +1.440833191e-02f, +4.765765445e-03f, -2.328384828e-03f, -2.561138325e-03f, -5.674942911e-04f, + +4.027701168e-05f, +6.397599520e-05f, -6.948736784e-05f, -3.015784591e-04f, -2.408731346e-04f, +3.995062278e-04f, +1.115437151e-03f, +7.214386688e-04f, -1.367140312e-03f, -3.953356508e-03f, -4.686758351e-03f, -2.323854286e-03f, +1.731992329e-03f, +4.518481500e-03f, +4.247285863e-03f, +1.793929652e-03f, -4.996697028e-04f, -1.157342108e-03f, -5.327137747e-04f, +1.780106955e-04f, +3.237521202e-04f, +1.059062192e-04f, -5.593586166e-05f, -4.888208265e-05f, + +3.889546936e-04f, +2.319523535e-03f, +1.468107769e-03f, -5.401625028e-03f, -9.384866057e-03f, +1.753865530e-03f, +1.894777237e-02f, +1.493271791e-02f, -1.452666490e-02f, -3.271902747e-02f, -9.408300692e-03f, +2.957362112e-02f, +3.270240635e-02f, -4.269038322e-03f, -3.214968736e-02f, -1.839618258e-02f, +1.220805628e-02f, +2.010608403e-02f, +4.079141051e-03f, -8.921916448e-03f, -6.375513006e-03f, +8.959090226e-04f, +2.561138325e-03f, +5.674942911e-04f, + -4.027701168e-05f, -6.397599520e-05f, +1.252393043e-04f, +2.504379341e-04f, -7.308567245e-05f, -5.633528087e-04f, -3.488269012e-04f, +6.099830312e-04f, +9.999631993e-04f, -2.635766287e-05f, -1.244243205e-03f, -8.849137654e-04f, +6.734918225e-04f, +1.316193531e-03f, +2.586687636e-04f, -9.268998177e-04f, -7.487138261e-04f, +2.263159219e-04f, +5.951322091e-04f, +1.592177872e-04f, -2.338968232e-04f, -1.605115338e-04f, +5.593586166e-05f, +4.888208265e-05f, + /* 6,19 (24) */ + -3.486776819e-04f, -2.255547540e-03f, -2.747551813e-03f, +3.210223448e-03f, +1.332329945e-02f, +1.247115843e-02f, -1.267875805e-02f, -4.669784758e-02f, -4.128350925e-02f, +4.426966222e-02f, +1.898719098e-01f, +3.109186651e-01f, +3.231020161e-01f, +2.175202704e-01f, +6.889248817e-02f, -3.180457352e-02f, -5.037920507e-02f, -1.950940050e-02f, +9.675126909e-03f, +1.458634261e-02f, +5.089517565e-03f, -2.222478609e-03f, -2.617074187e-03f, -6.163763738e-04f, + +3.850561505e-05f, +6.505879630e-05f, -6.256500263e-05f, -2.962094404e-04f, -2.515257613e-04f, +3.731699285e-04f, +1.103501229e-03f, +7.603527866e-04f, -1.283310884e-03f, -3.888554500e-03f, -4.710605181e-03f, -2.437172497e-03f, +1.609196375e-03f, +4.475067179e-03f, +4.299556399e-03f, +1.880316393e-03f, -4.499479043e-04f, -1.161899229e-03f, -5.594225224e-04f, +1.635283859e-04f, +3.271402533e-04f, +1.134907162e-04f, -5.377970800e-05f, -5.052002055e-05f, + +3.486776819e-04f, +2.255547540e-03f, +1.593347073e-03f, -5.151187094e-03f, -9.457951729e-03f, +1.190512721e-03f, +1.859894547e-02f, +1.554270095e-02f, -1.352670170e-02f, -3.274538514e-02f, -1.065254390e-02f, +2.868870736e-02f, +3.337589817e-02f, -2.952844791e-03f, -3.189101859e-02f, -1.932308240e-02f, +1.145934245e-02f, +2.033239995e-02f, +4.674273261e-03f, -8.762698661e-03f, -6.609409829e-03f, +7.353974888e-04f, +2.617074187e-03f, +6.163763738e-04f, + -3.850561505e-05f, -6.505879630e-05f, +1.180319106e-04f, +2.522029828e-04f, -5.645026705e-05f, -5.545934181e-04f, -3.708222693e-04f, +5.802418545e-04f, +1.009810214e-03f, +1.963992123e-05f, -1.224444521e-03f, -9.233882296e-04f, +6.278441214e-04f, +1.324975022e-03f, +3.050911452e-04f, -9.075928686e-04f, -7.740981547e-04f, +1.995147604e-04f, +5.989145286e-04f, +1.768431249e-04f, -2.290057391e-04f, -1.672993318e-04f, +5.377970800e-05f, +5.052002055e-05f, + /* 6,20 (24) */ + -3.101720669e-04f, -2.190488744e-03f, -2.810116815e-03f, +2.914014007e-03f, +1.307177369e-02f, +1.284432836e-02f, -1.157525682e-02f, -4.593749479e-02f, -4.256682013e-02f, +4.038110771e-02f, +1.851613046e-01f, +3.084814926e-01f, +3.247112125e-01f, +2.219953376e-01f, +7.319204457e-02f, -2.992425713e-02f, -5.082915297e-02f, -2.067129973e-02f, +9.115704387e-03f, +1.474987099e-02f, +5.416657818e-03f, -2.108987893e-03f, -2.670853895e-03f, -6.668963943e-04f, + +3.672778576e-05f, +6.597518170e-05f, -5.578131674e-05f, -2.905667697e-04f, -2.615394385e-04f, +3.470107043e-04f, +1.090473064e-03f, +7.974395044e-04f, -1.200151202e-03f, -3.821919682e-03f, -4.731180255e-03f, -2.548603607e-03f, +1.485143182e-03f, +4.428430743e-03f, +4.349495642e-03f, +1.966873861e-03f, -3.984705076e-04f, -1.165095656e-03f, -5.860706170e-04f, +1.484173194e-04f, +3.301426497e-04f, +1.211532453e-04f, -5.143434051e-05f, -5.211888475e-05f, + +3.101720669e-04f, +2.190488744e-03f, +1.711378984e-03f, -4.898984111e-03f, -9.514401996e-03f, +6.359193033e-04f, +1.822812320e-02f, +1.612294280e-02f, -1.251689149e-02f, -3.272574521e-02f, -1.187698842e-02f, +2.776531913e-02f, +3.400374229e-02f, -1.627869769e-03f, -3.158592745e-02f, -2.023067527e-02f, +1.068524430e-02f, +2.053191472e-02f, +5.273187789e-03f, -8.585855536e-03f, -6.838415569e-03f, +5.680981570e-04f, +2.670853895e-03f, +6.668963943e-04f, + -3.672778576e-05f, -6.597518170e-05f, +1.108101859e-04f, +2.534709491e-04f, -4.007203065e-05f, -5.450944670e-04f, -3.919210484e-04f, +5.499607829e-04f, +1.018057400e-03f, +6.531733867e-05f, -1.202922818e-03f, -9.604536064e-04f, +5.812330620e-04f, +1.331834017e-03f, +3.513302258e-04f, -8.867574951e-04f, -7.985766012e-04f, +1.720245964e-04f, +6.017877439e-04f, +1.945338611e-04f, -2.235781227e-04f, -1.739593458e-04f, +5.143434051e-05f, +5.211888475e-05f, + /* 6,21 (24) */ + -2.734442811e-04f, -2.124513562e-03f, -2.865898132e-03f, +2.623447237e-03f, +1.281023425e-02f, +1.319133907e-02f, -1.048478376e-02f, -4.514005528e-02f, -4.376697134e-02f, +3.655918803e-02f, +1.804301243e-01f, +3.059328890e-01f, +3.261963557e-01f, +2.264237684e-01f, +7.754154022e-02f, -2.795738327e-02f, -5.122762348e-02f, -2.183639538e-02f, +8.529633770e-03f, +1.489828831e-02f, +5.746800468e-03f, -1.987834647e-03f, -2.722288236e-03f, -7.190152791e-04f, + +3.494771420e-05f, +6.672925739e-05f, -4.914324270e-05f, -2.846666873e-04f, -2.709163893e-04f, +3.210590406e-04f, +1.076393514e-03f, +8.326968404e-04f, -1.117727050e-03f, -3.753528341e-03f, -4.748488696e-03f, -2.658064548e-03f, +1.359928574e-03f, +4.378591568e-03f, +4.397038482e-03f, +2.053526041e-03f, -3.452562339e-04f, -1.166896245e-03f, -6.126209686e-04f, +1.326828498e-04f, +3.327438508e-04f, +1.288834556e-04f, -4.889749865e-05f, -5.367361504e-05f, + +2.734442811e-04f, +2.124513562e-03f, +1.822189170e-03f, -4.645513162e-03f, -9.554474027e-03f, +9.082483626e-05f, +1.783620215e-02f, +1.667290358e-02f, -1.149883409e-02f, -3.266042788e-02f, -1.307991124e-02f, +2.680486552e-02f, +3.458497535e-02f, -2.960357521e-04f, -3.123459722e-02f, -2.111743276e-02f, +9.886667696e-03f, +2.070393931e-02f, +5.874975533e-03f, -8.391321675e-03f, -7.061993691e-03f, +3.941388112e-04f, +2.722288236e-03f, +7.190152791e-04f, + -3.494771420e-05f, -6.672925739e-05f, +1.035892036e-04f, +2.542508895e-04f, -2.397495925e-05f, -5.348842467e-04f, -4.121007614e-04f, +5.191942975e-04f, +1.024705255e-03f, +1.106054035e-04f, -1.179717742e-03f, -9.960548144e-04f, +5.337296543e-04f, +1.336753852e-03f, +3.973127796e-04f, -8.644146191e-04f, -8.221002559e-04f, +1.438818692e-04f, +6.037324270e-04f, +2.122596742e-04f, -2.176120983e-04f, -1.804745870e-04f, +4.889749865e-05f, +5.367361504e-05f, + /* 6,22 (24) */ + -2.384965669e-04f, -2.057784305e-03f, -2.915041375e-03f, +2.338780550e-03f, +1.253931786e-02f, +1.351239811e-02f, -9.408390245e-03f, -4.430735844e-02f, -4.488469839e-02f, +3.280565969e-02f, +1.756816356e-01f, +3.032748245e-01f, +3.275562843e-01f, +2.308023599e-01f, +8.193857870e-02f, -2.590385723e-02f, -5.157287971e-02f, -2.300329163e-02f, +7.917012801e-03f, +1.503097116e-02f, +6.079544319e-03f, -1.858951192e-03f, -2.771185734e-03f, -7.726888941e-04f, + +3.316945658e-05f, +6.732530413e-05f, -4.265727503e-05f, -2.785254130e-04f, -2.796596949e-04f, +2.953444788e-04f, +1.061303886e-03f, +8.661248172e-04f, -1.036102654e-03f, -3.683457771e-03f, -4.762538634e-03f, -2.765474238e-03f, +1.233649549e-03f, +4.325572093e-03f, +4.442121581e-03f, +2.140195948e-03f, -2.903259489e-04f, -1.167266825e-03f, -6.390358040e-04f, +1.163313523e-04f, +3.349286204e-04f, +1.366705918e-04f, -4.616720663e-05f, -5.517907351e-05f, + +2.384965669e-04f, +2.057784305e-03f, +1.925778373e-03f, -4.391262272e-03f, -9.578448986e-03f, -4.440594105e-04f, +1.742410139e-02f, +1.719209788e-02f, -1.047412883e-02f, -3.254982247e-02f, -1.425962898e-02f, +2.580881071e-02f, +3.511870501e-02f, +1.040718100e-03f, -3.083728444e-02f, -2.198184738e-02f, +9.064567440e-03f, +2.084782118e-02f, +6.478707960e-03f, -8.179062001e-03f, -7.279605790e-03f, +2.136642242e-04f, +2.771185734e-03f, +7.726888941e-04f, + -3.316945658e-05f, -6.732530413e-05f, +9.638367424e-05f, +2.545526212e-04f, -8.182096944e-06f, -5.239918765e-04f, -4.313407968e-04f, +4.879971326e-04f, +1.029756914e-03f, +1.554359608e-04f, -1.154871522e-03f, -1.030139207e-03f, +4.854064019e-04f, +1.339720954e-03f, +4.429656241e-04f, -8.405878122e-04f, -8.446213427e-04f, +1.151245892e-04f, +6.047305176e-04f, +2.299896455e-04f, -2.111068049e-04f, -1.868279672e-04f, +4.616720663e-05f, +5.517907351e-05f, + /* 6,23 (24) */ + -2.053271103e-04f, -1.990459001e-03f, -2.957698650e-03f, +2.060255137e-03f, +1.225965817e-02f, +1.380774258e-02f, -8.347086359e-03f, -4.344123363e-02f, -4.592080104e-02f, +2.912220192e-02f, +1.709190970e-01f, +3.005093502e-01f, +3.287899338e-01f, +2.351279320e-01f, +8.638070028e-02f, -2.376366128e-02f, -5.186320566e-02f, -2.417055845e-02f, +7.277976997e-03f, +1.514730251e-02f, +6.414472939e-03f, -1.722280600e-03f, -2.817352941e-03f, -8.278679676e-04f, + +3.139693059e-05f, +6.776776486e-05f, -3.632947036e-05f, -2.721591211e-04f, -2.877732716e-04f, +2.698955957e-04f, +1.045245885e-03f, +8.977254349e-04f, -9.553406348e-04f, -3.611786181e-03f, -4.773341188e-03f, -2.870753655e-03f, +1.106404188e-03f, +4.269397810e-03f, +4.484683449e-03f, +2.226805702e-03f, -2.337026664e-04f, -1.166174257e-03f, -6.652767031e-04f, +9.937023555e-05f, +3.366819736e-04f, +1.445035018e-04f, -4.324178486e-05f, -5.663005275e-05f, + +2.053271103e-04f, +1.990459001e-03f, +2.022162048e-03f, -4.136709651e-03f, -9.586631083e-03f, -9.680512870e-04f, +1.699276059e-02f, +1.768009501e-02f, -9.444371919e-03f, -3.239438651e-02f, -1.541450050e-02f, +2.477867150e-02f, +3.560411141e-02f, +2.380439054e-03f, -3.039431882e-02f, -2.282243519e-02f, +8.219946097e-03f, +2.096294577e-02f, +7.083438478e-03f, -7.949072355e-03f, -7.490712594e-03f, +2.683625699e-05f, +2.817352941e-03f, +8.278679676e-04f, + -3.139693059e-05f, -6.776776486e-05f, +8.920792150e-05f, +2.543866878e-04f, +7.284492294e-06f, -5.124472386e-04f, -4.496224237e-04f, +4.564241782e-04f, +1.033218118e-03f, +1.997419964e-04f, -1.128428889e-03f, -1.062656658e-03f, +4.363371811e-04f, +1.340724874e-03f, +4.882157442e-04f, -8.153032736e-04f, -8.660933128e-04f, +8.579228719e-05f, +6.047653749e-04f, +2.476923088e-04f, -2.040624157e-04f, -1.930023331e-04f, +4.324178486e-05f, +5.663005275e-05f, + /* 6,24 (24) */ + -1.739301798e-04f, -1.922691236e-03f, -2.994028120e-03f, +1.788096016e-03f, +1.197188490e-02f, +1.407763818e-02f, -7.301840474e-03f, -4.254350819e-02f, -4.687614167e-02f, +2.551041574e-02f, +1.661457558e-01f, +2.976385966e-01f, +3.298963380e-01f, +2.393973298e-01f, +9.086538373e-02f, -2.153685558e-02f, -5.209690833e-02f, -2.533673271e-02f, +6.612700294e-03f, +1.524667275e-02f, +6.751154913e-03f, -1.577777098e-03f, -2.860594726e-03f, -8.844980204e-04f, + +2.963391142e-05f, +6.806123211e-05f, -3.016544842e-05f, -2.655839161e-04f, -2.952618468e-04f, +2.447399846e-04f, +1.028261548e-03f, +9.275026422e-04f, -8.755019491e-04f, -3.538592610e-03f, -4.780910436e-03f, -2.973825913e-03f, +9.782915545e-04f, +4.210097246e-03f, +4.524664529e-03f, +2.313276598e-03f, -1.754115491e-04f, -1.163586488e-03f, -6.913046371e-04f, +8.180795328e-05f, +3.379892059e-04f, +1.523706453e-04f, -4.011986105e-05f, -5.802128424e-05f, + +1.739301798e-04f, +1.922691236e-03f, +2.111369969e-03f, -3.882322963e-03f, -9.579346591e-03f, -1.480498526e-03f, +1.654313817e-02f, +1.813651919e-02f, -8.411153801e-03f, -3.219464451e-02f, -1.654292939e-02f, +2.371601484e-02f, +3.604044859e-02f, +3.721163928e-03f, -2.990610308e-02f, -2.363773847e-02f, +7.353852784e-03f, +2.104873806e-02f, +7.688203853e-03f, -7.701380046e-03f, -7.694775010e-03f, -1.661660761e-04f, +2.860594726e-03f, +8.844980204e-04f, + -2.963391142e-05f, -6.806123211e-05f, +8.207586033e-05f, +2.537643245e-04f, +2.240375052e-05f, -5.002809122e-04f, -4.669288026e-04f, +4.245303820e-04f, +1.035097187e-03f, +2.434577447e-04f, -1.100436991e-03f, -1.093559642e-03f, +3.865971177e-04f, +1.339758308e-03f, +5.329904173e-04f, -7.885898027e-04f, -8.864709371e-04f, +5.592596085e-05f, +6.038218276e-04f, +2.653357019e-04f, -1.964801581e-04f, -1.989805015e-04f, +4.011986105e-05f, +5.802128424e-05f, + /* 6,25 (24) */ + -1.442962683e-04f, -1.854630004e-03f, -3.024193569e-03f, +1.522512100e-03f, +1.167662305e-02f, +1.432237817e-02f, -6.273578926e-03f, -4.161600555e-02f, -4.775164362e-02f, +2.197182313e-02f, +1.613648454e-01f, +2.946647707e-01f, +3.308746295e-01f, +2.436074271e-01f, +9.539004826e-02f, -1.922357898e-02f, -5.227231988e-02f, -2.650031920e-02f, +5.921395657e-03f, +1.532848070e-02f, +7.089144119e-03f, -1.425406453e-03f, -2.900714587e-03f, -9.425193046e-04f, + +2.788402811e-05f, +6.821043546e-05f, -2.417039358e-05f, -2.588158100e-04f, -3.021309355e-04f, +2.199042372e-04f, +1.010393195e-03f, +9.554623048e-04f, -7.966458449e-04f, -3.463956829e-03f, -4.785263390e-03f, -3.074616339e-03f, +8.494115912e-04f, +4.147701949e-03f, +4.562007266e-03f, +2.399529195e-03f, -1.154799069e-04f, -1.159472611e-03f, -7.170800082e-04f, +6.365401444e-05f, +3.388359222e-04f, +1.602601035e-04f, -3.680038110e-05f, -5.934744720e-05f, + +1.442962683e-04f, +1.854630004e-03f, +2.193445829e-03f, -3.628558639e-03f, -9.556942840e-03f, -1.980779438e-03f, +1.607620937e-02f, +1.856104957e-02f, -7.376056614e-03f, -3.195118677e-02f, -1.764336638e-02f, +2.262245520e-02f, +3.642704571e-02f, +5.060922236e-03f, -2.937311266e-02f, -2.442632827e-02f, +6.467381847e-03f, +2.110466402e-02f, +8.292025680e-03f, -7.436044344e-03f, -7.891255168e-03f, -3.651465776e-04f, +2.900714587e-03f, +9.425193046e-04f, + -2.788402811e-05f, -6.821043546e-05f, +7.500097594e-05f, +2.526974221e-04f, +3.715564929e-05f, -4.875241071e-04f, -4.832449927e-04f, +3.923706530e-04f, +1.035404989e-03f, +2.865187936e-04f, -1.070945305e-03f, -1.122803310e-03f, +3.362624619e-04f, +1.336817126e-03f, +5.772173382e-04f, -7.604787672e-04f, -9.057103977e-04f, +2.556801747e-05f, +6.018862218e-04f, +2.828874197e-04f, -1.883623296e-04f, -2.047452951e-04f, +3.680038110e-05f, +5.934744720e-05f, + /* 6,26 (24) */ + -1.164122402e-04f, -1.786419568e-03f, -3.048363962e-03f, +1.263696290e-03f, +1.137449211e-02f, +1.454228240e-02f, -5.263185731e-03f, -4.066054324e-02f, -4.854828947e-02f, +1.850786630e-02f, +1.565795820e-01f, +2.915901543e-01f, +3.317240411e-01f, +2.477551290e-01f, +9.995205552e-02f, -1.682404978e-02f, -5.238779979e-02f, -2.765979181e-02f, +5.204315649e-03f, +1.539213472e-02f, +7.427980041e-03f, -1.265146349e-03f, -2.937514968e-03f, -1.001866752e-03f, + +2.615076039e-05f, +6.822022903e-05f, -1.834905721e-05f, -2.518706986e-04f, -3.083868143e-04f, +1.954139279e-04f, +9.916833680e-04f, +9.816121727e-04f, -7.188298137e-04f, -3.387959259e-03f, -4.786419960e-03f, -3.173052544e-03f, +7.198650226e-04f, +4.082246465e-03f, +4.596656183e-03f, +2.485483383e-03f, -5.393719231e-05f, -1.153802914e-03f, -7.425626902e-04f, +4.491899181e-05f, +3.392080658e-04f, +1.681595893e-04f, -3.328261961e-05f, -6.060317770e-05f, + +1.164122402e-04f, +1.786419568e-03f, +2.268446805e-03f, -3.375861217e-03f, -9.519787191e-03f, -2.468303545e-03f, +1.559296437e-02f, +1.895342023e-02f, -6.340651625e-03f, -3.166466798e-02f, -1.871431169e-02f, +2.149965189e-02f, +3.676330817e-02f, +6.397739363e-03f, -2.879589532e-02f, -2.518680704e-02f, +5.561671449e-03f, +2.113023204e-02f, +8.893911902e-03f, -7.153156925e-03f, -8.079617498e-03f, -5.698918727e-04f, +2.937514968e-03f, +1.001866752e-03f, + -2.615076039e-05f, -6.822022903e-05f, +6.799630432e-05f, +2.511984901e-04f, +5.152121081e-05f, -4.742085965e-04f, -4.985579560e-04f, +3.599997655e-04f, +1.034154896e-03f, +3.288621856e-04f, -1.040005548e-03f, -1.150345561e-03f, +2.854104603e-04f, +1.331900379e-03f, +6.208247442e-04f, -7.310040664e-04f, -9.237693767e-04f, -5.237786086e-06f, +5.989464665e-04f, +3.003146694e-04f, -1.797123137e-04f, -2.102795790e-04f, +3.328261961e-05f, +6.060317770e-05f, + /* 6,27 (24) */ + -9.026147983e-05f, -1.718199339e-03f, -3.066713019e-03f, +1.011825591e-03f, +1.106610530e-02f, +1.473769633e-02f, -4.271502363e-03f, -3.967893107e-02f, -4.926711928e-02f, +1.511990704e-02f, +1.517931620e-01f, +2.884171018e-01f, +3.324439062e-01f, +2.518373755e-01f, +1.045487117e-01f, -1.433856640e-02f, -5.244173698e-02f, -2.881359472e-02f, +4.461752959e-03f, +1.543705371e-02f, +7.767188107e-03f, -1.096986760e-03f, -2.970797587e-03f, -1.062469930e-03f, + +2.443743580e-05f, +6.809557905e-05f, -1.270576066e-05f, -2.447643402e-04f, -3.140364966e-04f, +1.712936001e-04f, +9.721747743e-04f, +1.005961845e-03f, -6.421095461e-04f, -3.310680875e-03f, -4.784402921e-03f, -3.269064490e-03f, +5.897532510e-04f, +4.013768311e-03f, +4.628557951e-03f, +2.571058474e-03f, +9.185006537e-06f, -1.146548940e-03f, -7.677120714e-04f, +2.561452950e-05f, +3.390919485e-04f, +1.760564584e-04f, -2.956619010e-05f, -6.178307809e-05f, + +9.026147983e-05f, +1.718199339e-03f, +2.336443110e-03f, -3.124662727e-03f, -9.468265980e-03f, -2.942512141e-03f, +1.509440642e-02f, +1.931341999e-02f, -5.306496729e-03f, -3.133580579e-02f, -1.975431723e-02f, +2.034930633e-02f, +3.704871863e-02f, +7.729639742e-03f, -2.817507058e-02f, -2.591781110e-02f, +4.637902073e-03f, +2.112499425e-02f, +9.492858368e-03f, -6.852842255e-03f, -8.259329812e-03f, -7.801714517e-04f, +2.970797587e-03f, +1.062469930e-03f, + -2.443743580e-05f, -6.809557905e-05f, +6.107441404e-05f, +2.492806200e-04f, +6.548252658e-05f, -4.603666510e-04f, -5.128565571e-04f, +3.274722649e-04f, +1.031362745e-03f, +3.704265174e-04f, -1.007671578e-03f, -1.176147110e-03f, +2.341192274e-04f, +1.325010312e-03f, +6.637415389e-04f, -7.002020898e-04f, -9.406071432e-04f, -3.644640680e-05f, +5.949920767e-04f, +3.175843266e-04f, -1.705345927e-04f, -2.155662977e-04f, +2.956619010e-05f, +6.178307809e-05f, + /* 6,28 (24) */ + -6.582404402e-05f, -1.650103760e-03f, -3.079418780e-03f, +7.670612510e-04f, +1.075206880e-02f, +1.490898993e-02f, -3.299327589e-03f, -3.867296923e-02f, -4.990922883e-02f, +1.180922617e-02f, +1.470087591e-01f, +2.851480373e-01f, +3.330336594e-01f, +2.558511438e-01f, +1.091772697e-01f, -1.176750793e-02f, -5.243255197e-02f, -2.996014366e-02f, +3.694040888e-03f, +1.546266824e-02f, +8.106280055e-03f, -9.209303016e-04f, -3.000363778e-03f, -1.124253008e-03f, + +2.274722726e-05f, +6.784155157e-05f, -7.244398905e-06f, -2.375123335e-04f, -3.190877058e-04f, +1.475667527e-04f, +9.519102335e-04f, +1.028522733e-03f, -5.665388902e-04f, -3.232203116e-03f, -4.779237872e-03f, -3.362584557e-03f, +4.591782538e-04f, +3.942307950e-03f, +4.657661463e-03f, +2.656173279e-03f, +7.385297568e-05f, -1.137683536e-03f, -7.924870975e-04f, +5.753348927e-06f, +3.384742792e-04f, +1.839377214e-04f, -2.565105489e-05f, -6.288172682e-05f, + +6.582404402e-05f, +1.650103760e-03f, +2.397517524e-03f, -2.875382107e-03f, -9.402783454e-03f, -3.402878792e-03f, +1.458154986e-02f, +1.964089226e-02f, -4.275133985e-03f, -3.096537927e-02f, -2.076198881e-02f, +1.917315922e-02f, +3.728283786e-02f, +9.054650055e-03f, -2.751132904e-02f, -2.661801319e-02f, +3.697294929e-03f, +2.108854784e-02f, +1.008785045e-02f, -6.535257929e-03f, -8.429864404e-03f, -9.957377493e-04f, +3.000363778e-03f, +1.124253008e-03f, + -2.274722726e-05f, -6.784155157e-05f, +5.424738949e-05f, +2.469574470e-04f, +7.902277375e-05f, -4.460309708e-04f, -5.261315604e-04f, +2.948423740e-04f, +1.027046790e-03f, +4.111520349e-04f, -9.739992989e-04f, -1.200171545e-03f, +1.824676140e-04f, +1.316152368e-03f, +7.058974164e-04f, -6.681116709e-04f, -9.561846390e-04f, -6.801158183e-05f, +5.900142142e-04f, +3.346629931e-04f, -1.608347588e-04f, -2.205885129e-04f, +2.565105489e-05f, +6.288172682e-05f, + /* 6,29 (24) */ + -4.307681677e-05f, -1.582262209e-03f, -3.086663179e-03f, +5.295489175e-04f, +1.043298110e-02f, +1.505655668e-02f, -2.347417355e-03f, -3.764444649e-02f, -5.047576772e-02f, +8.577023051e-03f, +1.422295212e-01f, +2.817854527e-01f, +3.334928377e-01f, +2.597934518e-01f, +1.138349311e-01f, -9.111334648e-03f, -5.235869900e-02f, -3.109782720e-02f, +2.901553790e-03f, +1.546842159e-02f, +8.444754334e-03f, -7.369925802e-04f, -3.026014832e-03f, -1.187134734e-03f, + +2.108315094e-05f, +6.746330023e-05f, -1.968444869e-06f, -2.301300971e-04f, -3.235488489e-04f, +1.242558299e-04f, +9.309326212e-04f, +1.049308023e-03f, -4.921698130e-04f, -3.152607797e-03f, -4.770953197e-03f, -3.453547606e-03f, +3.282424799e-04f, +3.867908757e-03f, +4.683917896e-03f, +2.740746193e-03f, +1.400308877e-04f, -1.127180907e-03f, -8.168463171e-04f, -1.465074660e-05f, +3.373421937e-04f, +1.917900568e-04f, -2.153753453e-05f, -6.389368841e-05f, + +4.307681677e-05f, +1.582262209e-03f, +2.451764913e-03f, -2.628424660e-03f, -9.323760680e-03f, -3.848909763e-03f, +1.405541830e-02f, +1.993573463e-02f, -3.248087194e-03f, -3.055422724e-02f, -2.173598811e-02f, +1.797298767e-02f, +3.746530547e-02f, +1.037080242e-02f, -2.680543162e-02f, -2.728612486e-02f, +2.741110290e-03f, +2.102053626e-02f, +1.067786466e-02f, -6.200594936e-03f, -8.590699163e-03f, -1.216326262e-03f, +3.026014832e-03f, +1.187134734e-03f, + -2.108315094e-05f, -6.746330023e-05f, +4.752681547e-05f, +2.442431118e-04f, +9.212622896e-05f, -4.312346192e-04f, -5.383756226e-04f, +2.621639014e-04f, +1.021227655e-03f, +4.509807251e-04f, -9.390465563e-04f, -1.222385389e-03f, +1.305350756e-04f, +1.305335186e-03f, +7.472229839e-04f, -6.347740361e-04f, -9.704645605e-04f, -9.988589785e-05f, +5.840057251e-04f, +3.515170566e-04f, -1.506195234e-04f, -2.253294414e-04f, +2.153753453e-05f, +6.389368841e-05f, + /* 6,30 (24) */ + -2.199366583e-05f, -1.514798908e-03f, -3.088631624e-03f, +2.994188205e-04f, +1.010943225e-02f, +1.518081251e-02f, -1.416484734e-03f, -3.659513847e-02f, -5.096793753e-02f, +5.424415255e-03f, +1.374585680e-01f, +2.783319051e-01f, +3.338210801e-01f, +2.636613605e-01f, +1.185188490e-01f, -6.370588456e-03f, -5.221866811e-02f, -3.222500811e-02f, +2.084707473e-03f, +1.545377084e-02f, +8.782096528e-03f, -5.452025233e-04f, -3.047552367e-03f, -1.251028423e-03f, + +1.944806459e-05f, +6.696605421e-05f, +3.119045703e-06f, -2.226328496e-04f, -3.274289891e-04f, +1.013822117e-04f, +9.092848150e-04f, +1.068332631e-03f, -4.190523637e-04f, -3.071977016e-03f, -4.759580019e-03f, -3.541891040e-03f, +1.970487457e-04f, +3.790616984e-03f, +4.707280779e-03f, +2.824695277e-03f, +2.076808167e-04f, -1.115016669e-03f, -8.407479278e-04f, -3.558286875e-05f, +3.356832843e-04f, +1.995998244e-04f, -1.722631685e-05f, -6.481352384e-05f, + +2.199366583e-05f, +1.514798908e-03f, +2.499291729e-03f, -2.384181548e-03f, -9.231634451e-03f, -4.280144382e-03f, +1.351704268e-02f, +2.019789853e-02f, -2.226859539e-03f, -3.010324651e-02f, -2.267503467e-02f, +1.675060228e-02f, +3.759584055e-02f, +1.167613761e-02f, -2.605820864e-02f, -2.792089890e-02f, +1.770645730e-03f, +2.092065036e-02f, +1.126187038e-02f, -5.849077879e-03f, -8.741318686e-03f, -1.441655704e-03f, +3.047552367e-03f, +1.251028423e-03f, + -1.944806459e-05f, -6.696605421e-05f, +4.092376319e-05f, +2.411522223e-04f, +1.047782799e-04f, -4.160109560e-04f, -5.495832833e-04f, +2.294901511e-04f, +1.013928274e-03f, +4.898564049e-04f, -9.028730329e-04f, -1.242758144e-03f, +7.840153916e-05f, +1.292570593e-03f, +7.876498834e-04f, -6.002327499e-04f, -9.834114395e-04f, -1.320208631e-04f, +5.769611755e-04f, +3.681127511e-04f, -1.398967235e-04f, -2.297724939e-04f, +1.722631685e-05f, +6.481352384e-05f, + /* 6,31 (24) */ + -2.545601248e-06f, -1.447832854e-03f, -3.085512578e-03f, +7.678597090e-05f, +9.782003259e-03f, +1.528219472e-02f, -5.071999193e-04f, -3.552680584e-02f, -5.138698989e-02f, +2.352438239e-03f, +1.326989880e-01f, +2.747900141e-01f, +3.340181289e-01f, +2.674519775e-01f, +1.232261298e-01f, -3.545893179e-03f, -5.201098729e-02f, -3.334002477e-02f, +1.243959545e-03f, +1.541818797e-02f, +9.117779812e-03f, -3.456026989e-04f, -3.064778684e-03f, -1.315841947e-03f, + +1.784466616e-05f, +6.635510628e-05f, +8.015428714e-06f, -2.150355900e-04f, -3.307378182e-04f, +7.896620590e-05f, +8.870096413e-04f, +1.085613170e-03f, -3.472346398e-04f, -2.990393068e-03f, -4.745152154e-03f, -3.627554861e-03f, +6.570013011e-05f, +3.710481723e-03f, +4.727706059e-03f, +2.907938350e-03f, +2.767627563e-04f, -1.101167895e-03f, -8.641498231e-04f, -5.702704247e-05f, +3.334856284e-04f, +2.073530798e-04f, -1.271846563e-05f, -6.563580115e-05f, + +2.545601248e-06f, +1.447832854e-03f, +2.540215492e-03f, -2.143029326e-03f, -9.126856171e-03f, -4.696155338e-03f, +1.296745939e-02f, +2.042738868e-02f, -1.212931265e-03f, -2.961339011e-02f, -2.357790770e-02f, +1.550784414e-02f, +3.767424209e-02f, +1.296870820e-02f, -2.527055875e-02f, -2.852113165e-02f, +7.872342904e-04f, +2.078862950e-02f, +1.183883156e-02f, -5.480965128e-03f, -8.881215410e-03f, -1.671428198e-03f, +3.064778684e-03f, +1.315841947e-03f, + -1.784466616e-05f, -6.635510628e-05f, +3.444877766e-05f, +2.376998145e-04f, +1.169654343e-04f, -4.003935711e-04f, -5.597509504e-04f, +1.968738343e-04f, +1.005173835e-03f, +5.277248058e-04f, -8.655401410e-04f, -1.261262345e-03f, +2.614726878e-05f, +1.277873593e-03f, +8.271109120e-04f, -5.645336545e-04f, -9.949917205e-04f, -1.643669824e-04f, +5.688768839e-04f, +3.844162184e-04f, -1.286753269e-04f, -2.339013135e-04f, +1.271846563e-05f, +6.563580115e-05f, + /* 7, 0 (20) */ + -2.043579130e-03f, +4.413747039e-04f, +1.026461202e-02f, +1.278751817e-02f, -1.381693015e-02f, -5.194198196e-02f, -2.972362013e-02f, +1.035103880e-01f, +2.854090410e-01f, +3.717842184e-01f, +2.854090410e-01f, +1.035103880e-01f, -2.972362013e-02f, -5.194198196e-02f, -1.381693015e-02f, +1.278751817e-02f, +1.026461202e-02f, +4.413747039e-04f, -2.043579130e-03f, -5.028328800e-04f, + +2.654823367e-05f, -2.048103015e-04f, -3.273891760e-04f, +2.952729392e-04f, +1.265534878e-03f, +7.182289642e-04f, -2.343404695e-03f, -5.554816971e-03f, -4.988355315e-03f, -9.184739889e-05f, +4.888817206e-03f, +5.610692295e-03f, +2.462668262e-03f, -6.579391952e-04f, -1.282487004e-03f, -3.272586910e-04f, +3.214273652e-04f, +2.137723839e-04f, -2.266422450e-05f, -4.246420638e-05f, + +2.043579130e-03f, -2.603852842e-03f, -7.295781969e-03f, +1.777626449e-03f, +1.768131754e-02f, +9.370481930e-03f, -2.216869121e-02f, -2.781756318e-02f, +1.047598502e-02f, +3.732936584e-02f, +1.047598502e-02f, -2.781756318e-02f, -2.216869121e-02f, +9.370481930e-03f, +1.768131754e-02f, +1.777626449e-03f, -7.295781969e-03f, -2.603852842e-03f, +1.437219775e-03f, +5.028328800e-04f, + -2.654823367e-05f, +2.052721633e-04f, -3.310665577e-06f, -5.210311924e-04f, -2.797446115e-04f, +7.822523602e-04f, +8.773782963e-04f, -6.119124701e-04f, -1.412578692e-03f, -3.077706798e-05f, +1.400145616e-03f, +6.628304558e-04f, -8.490965277e-04f, -8.103982468e-04f, +2.529848066e-04f, +5.306655498e-04f, +1.884155900e-05f, -2.073002217e-04f, -2.970926703e-05f, +4.246420638e-05f, + /* 7, 1 (20) */ + -2.017030896e-03f, +2.365644024e-04f, +9.937222845e-03f, +1.308279111e-02f, -1.255139528e-02f, -5.122375300e-02f, -3.206702483e-02f, +9.795557104e-02f, +2.804206857e-01f, +3.716923710e-01f, +2.902978582e-01f, +1.091210803e-01f, -2.726095187e-02f, -5.259992116e-02f, -1.509941716e-02f, +1.246025947e-02f, +1.058603939e-02f, +6.551470878e-04f, -2.066243355e-03f, -5.452970863e-04f, + +3.017266954e-05f, -1.957865608e-04f, -3.325298824e-04f, +2.637867523e-04f, +1.247037532e-03f, +7.757306228e-04f, -2.224462527e-03f, -5.494930663e-03f, -5.083187578e-03f, -2.754502848e-04f, +4.784649184e-03f, +5.662453052e-03f, +2.582120611e-03f, -5.948759102e-04f, -1.297822783e-03f, -3.597015317e-04f, +3.146287443e-04f, +2.226507092e-04f, -1.851937276e-05f, -4.404280889e-05f, + +2.017030896e-03f, -2.398580678e-03f, -7.299092635e-03f, +1.256595257e-03f, +1.740157293e-02f, +1.015273429e-02f, -2.129131292e-02f, -2.842947565e-02f, +9.063406332e-03f, +3.729858877e-02f, +1.187613064e-02f, -2.715473272e-02f, -2.301778774e-02f, +8.560083684e-03f, +1.793430235e-02f, +2.308291999e-03f, -7.276940410e-03f, -2.811153063e-03f, +1.407510508e-03f, +5.452970863e-04f, + -3.017266954e-05f, +2.028102973e-04f, +1.179701523e-05f, -5.105611064e-04f, -3.054888055e-04f, +7.530520433e-04f, +9.037910865e-04f, -5.602491446e-04f, -1.422484159e-03f, -9.227396912e-05f, +1.385200332e-03f, +7.129021976e-04f, -8.189824236e-04f, -8.374202502e-04f, +2.252474774e-04f, +5.394258599e-04f, +3.477010676e-05f, -2.088760710e-04f, -3.568439400e-05f, +4.404280889e-05f, + /* 7, 2 (20) */ + -1.986858227e-03f, +4.077784161e-05f, +9.604692963e-03f, +1.334657786e-02f, -1.130435774e-02f, -5.044802238e-02f, -3.429148735e-02f, +9.246064038e-02f, +2.753374981e-01f, +3.714169207e-01f, +2.950825074e-01f, +1.147835334e-01f, -2.467883126e-02f, -5.319479707e-02f, -1.639723994e-02f, +1.210055794e-02f, +1.090066813e-02f, +8.777977970e-04f, -2.084762727e-03f, -5.893398952e-04f, + +3.353938457e-05f, -1.867226703e-04f, -3.368663100e-04f, +2.328405920e-04f, +1.227066805e-03f, +8.304336728e-04f, -2.105972156e-03f, -5.431140880e-03f, -5.173243944e-03f, -4.587775555e-04f, +4.675932995e-03f, +5.709999753e-03f, +2.701627071e-03f, -5.290578424e-04f, -1.311471924e-03f, -3.925569985e-04f, +3.069787893e-04f, +2.314226199e-04f, -1.411301470e-05f, -4.555837060e-05f, + +1.986858227e-03f, -2.195770381e-03f, -7.287295620e-03f, +7.460341506e-04f, +1.709608413e-02f, +1.090578633e-02f, -2.038752183e-02f, -2.898972479e-02f, +7.640922173e-03f, +3.720631480e-02f, +1.326133097e-02f, -2.644183052e-02f, -2.383677016e-02f, +7.722663433e-03f, +1.815954983e-02f, +2.847717859e-03f, -7.242170304e-03f, -3.020029134e-03f, +1.371826114e-03f, +5.893398952e-04f, + -3.353938457e-05f, +1.999336602e-04f, +2.645749345e-05f, -4.992947547e-04f, -3.301820368e-04f, +7.228680859e-04f, +9.283023291e-04f, -5.079422657e-04f, -1.429851616e-03f, -1.535992829e-04f, +1.367763221e-03f, +7.620278883e-04f, -7.870766570e-04f, -8.632504201e-04f, +1.965733985e-04f, +5.472750577e-04f, +5.106921368e-05f, -2.099820088e-04f, -4.180480123e-05f, +4.555837060e-05f, + /* 7, 3 (20) */ + -1.953318842e-03f, -1.459448287e-04f, +9.267826653e-03f, +1.357941845e-02f, -1.007729094e-02f, -4.961758870e-02f, -3.639745951e-02f, +8.702949950e-02f, +2.701642542e-01f, +3.709581431e-01f, +2.997584404e-01f, +1.204935331e-01f, -2.197720419e-02f, -5.372385491e-02f, -1.770871186e-02f, +1.170800094e-02f, +1.120764692e-02f, +1.109220417e-03f, -2.098875742e-03f, -6.348982658e-04f, + +3.665079142e-05f, -1.776395203e-04f, -3.404163420e-04f, +2.024728833e-04f, +1.205695118e-03f, +8.823316633e-04f, -1.988061608e-03f, -5.363558879e-03f, -5.258460319e-03f, -6.416458677e-04f, +4.562756102e-03f, +5.753237171e-03f, +2.821051081e-03f, -4.605079003e-04f, -1.323365107e-03f, -4.257786731e-04f, +2.984642181e-04f, +2.400649321e-04f, -9.445113488e-06f, -4.700299059e-05f, + +1.953318842e-03f, -1.995836721e-03f, -7.260838126e-03f, +2.467393959e-04f, +1.676590209e-02f, +1.162865442e-02f, -1.945921950e-02f, -2.949766706e-02f, +6.211070557e-03f, +3.705271552e-02f, +1.462909419e-02f, -2.567980264e-02f, -2.462384682e-02f, +6.859413013e-03f, +1.835612323e-02f, +3.394992917e-03f, -7.191101090e-03f, -3.230011143e-03f, +1.330021313e-03f, +6.348982658e-04f, + -3.665079142e-05f, +1.966618593e-04f, +4.064837437e-05f, -4.872726340e-04f, -3.537917286e-04f, +6.917724485e-04f, +9.508835635e-04f, -4.550942873e-04f, -1.434675664e-03f, -2.146390078e-04f, +1.347859614e-03f, +8.101090303e-04f, -7.534238774e-04f, -8.878224722e-04f, +1.670059789e-04f, +5.541774399e-04f, +6.771028362e-05f, -2.106010952e-04f, -4.805757752e-05f, +4.700299059e-05f, + /* 7, 4 (20) */ + -1.916668051e-03f, -3.235843490e-04f, +8.927410311e-03f, +1.378189133e-02f, -8.871595821e-03f, -4.873525704e-02f, -3.838552112e-02f, +8.166594062e-02f, +2.649057939e-01f, +3.703164973e-01f, +3.043211965e-01f, +1.262467703e-01f, -1.915615311e-02f, -5.418436281e-02f, -1.903207697e-02f, +1.128222227e-02f, +1.150611114e-02f, +1.349285349e-03f, -2.108320856e-03f, -6.819012564e-04f, + +3.950983931e-05f, -1.685573558e-04f, -3.431988561e-04f, +1.727199946e-04f, +1.182995347e-03f, +9.314221367e-04f, -1.870856384e-03f, -5.292299490e-03f, -5.338778624e-03f, -8.238724784e-04f, +4.445211600e-03f, +5.792074499e-03f, +2.940254357e-03f, -3.892531985e-04f, -1.333434110e-03f, -4.593182172e-04f, +2.890730509e-04f, +2.485539700e-04f, -4.516279813e-06f, -4.836865338e-05f, + +1.916668051e-03f, -1.799174861e-03f, -7.220189752e-03f, -2.405332382e-04f, +1.641211036e-02f, +1.232042687e-02f, -1.850833594e-02f, -2.995276134e-02f, +4.776394893e-03f, +3.683807651e-02f, +1.597695381e-02f, -2.486969360e-02f, -2.537727070e-02f, +5.971590541e-03f, +1.852312920e-02f, +3.949170357e-03f, -7.123390806e-03f, -3.440612238e-03f, +1.281963735e-03f, +6.819012564e-04f, + -3.950983931e-05f, +1.930150079e-04f, +5.434888104e-05f, -4.745361639e-04f, -3.762881120e-04f, +6.598380943e-04f, +9.715104632e-04f, -4.018081145e-04f, -1.436955911e-03f, -2.752797265e-04f, +1.325519754e-03f, +8.570486475e-04f, -7.180726487e-04f, -9.110719496e-04f, +1.365912017e-04f, +5.600987715e-04f, +8.466325981e-05f, -2.107172154e-04f, -5.442903877e-05f, +4.836865338e-05f, + /* 7, 5 (20) */ + -1.877158212e-03f, -4.921417048e-04f, +8.584211455e-03f, +1.395461133e-02f, -7.688600474e-03f, -4.780383490e-02f, -4.025637750e-02f, +7.637364113e-02f, +2.595670152e-01f, +3.694926248e-01f, +3.087664081e-01f, +1.320388448e-01f, -1.621589875e-02f, -5.457361601e-02f, -2.036551108e-02f, +1.082290405e-02f, +1.179518419e-02f, +1.597839319e-03f, -2.112837135e-03f, -7.302699098e-04f, + +4.211998972e-05f, -1.594957521e-04f, -3.452336613e-04f, +1.436162238e-04f, +1.159040700e-03f, +9.777065690e-04f, -1.754479317e-03f, -5.217480927e-03f, -5.414146844e-03f, -1.005275483e-03f, +4.323398105e-03f, +5.826425508e-03f, +3.059097074e-03f, -3.153250819e-04f, -1.341611938e-03f, -4.931254120e-04f, +2.787946686e-04f, +2.568656035e-04f, +6.722085081e-07f, -4.964724711e-05f, + +1.877158212e-03f, -1.606159853e-03f, -7.165840871e-03f, -7.150694020e-04f, +1.603582225e-02f, +1.298026496e-02f, -1.753682547e-02f, -3.035456946e-02f, +3.339438982e-03f, +3.656279679e-02f, +1.730247356e-02f, -2.401264496e-02f, -2.609534335e-02f, +5.060518591e-03f, +1.865972041e-02f, +4.509269128e-03f, -7.038727546e-03f, -3.651329454e-03f, +1.227534696e-03f, +7.302699098e-04f, + -4.211998972e-05f, +1.890136608e-04f, +6.753987228e-05f, -4.611275748e-04f, -3.976442523e-04f, +6.271388219e-04f, +9.901628520e-04f, -3.481868894e-04f, -1.436696948e-03f, -3.354088381e-04f, +1.300778745e-03f, +9.027514936e-04f, -6.810753783e-04f, -9.329363822e-04f, +1.053775565e-04f, +5.650063904e-04f, +1.018966696e-04f, -2.103151419e-04f, -6.090474729e-05f, +4.964724711e-05f, + /* 7, 6 (20) */ + -1.835038222e-03f, -6.516374570e-04f, +8.238977793e-03f, +1.409822755e-02f, -6.529559773e-03f, -4.682612834e-02f, -4.201085682e-02f, +7.115616020e-02f, +2.541528684e-01f, +3.684873493e-01f, +3.130898062e-01f, +1.378652703e-01f, -1.315680168e-02f, -5.488894109e-02f, -2.170712302e-02f, +1.032977864e-02f, +1.207397886e-02f, +1.854704923e-03f, -2.112164927e-03f, -7.799171569e-04f, + +4.448519162e-05f, -1.504735926e-04f, -3.465414342e-04f, +1.151937864e-04f, +1.133904594e-03f, +1.021190305e-03f, -1.639050427e-03f, -5.139224605e-03f, -5.484519075e-03f, -1.185674053e-03f, +4.197419649e-03f, +5.856208695e-03f, +3.177438036e-03f, -2.387591440e-04f, -1.347832958e-03f, -5.271482026e-04f, +2.676198699e-04f, +2.649752862e-04f, +6.118387923e-06f, -5.083058236e-05f, + +1.835038222e-03f, -1.417146193e-03f, -7.098300999e-03f, -1.176196977e-03f, +1.563817800e-02f, +1.360740378e-02f, -1.654666262e-02f, -3.070275635e-02f, +1.902742034e-03f, +3.622738795e-02f, +1.860325231e-02f, -2.310989346e-02f, -2.677641873e-02f, +4.127582209e-03f, +1.876509796e-02f, +5.074275519e-03f, -6.936830877e-03f, -3.861644596e-03f, +1.166629949e-03f, +7.799171569e-04f, + -4.448519162e-05f, +1.846787500e-04f, +8.020385627e-05f, -4.470897965e-04f, -4.178360684e-04f, +5.937490967e-04f, +1.006824711e-03f, -2.943337751e-04f, -1.433908334e-03f, -3.949147877e-04f, +1.273676493e-03f, +9.471242589e-04f, -6.424882360e-04f, -9.533554423e-04f, +7.341596628e-05f, +5.688693095e-04f, +1.193776738e-04f, -2.093805949e-04f, -6.746953387e-05f, +5.083058236e-05f, + /* 7, 7 (20) */ + -1.790553030e-03f, -8.021110495e-04f, +7.892436359e-03f, +1.421342134e-02f, -5.395655180e-03f, -4.580493803e-02f, -4.364990725e-02f, +6.601693560e-02f, +2.486683493e-01f, +3.673016753e-01f, +3.172872259e-01f, +1.437214790e-01f, -9.979363640e-03f, -5.512770024e-02f, -2.305495598e-02f, +9.802630440e-03f, +1.234159873e-02f, +2.119680209e-03f, -2.106046539e-03f, -8.307477393e-04f, + +4.660985620e-05f, -1.415090478e-04f, -3.471436552e-04f, +8.748280951e-05f, +1.107660528e-03f, +1.061882486e-03f, -1.524686796e-03f, -5.057654947e-03f, -5.549855554e-03f, -1.364888672e-03f, +4.067385554e-03f, +5.881347427e-03f, +3.295134865e-03f, -1.595952382e-04f, -1.352033024e-03f, -5.613327454e-04f, +2.555409276e-04f, +2.728580963e-04f, +1.181959165e-05f, -5.191041191e-05f, + +1.790553030e-03f, -1.232467443e-03f, -7.018097142e-03f, -1.623286773e-03f, +1.522034193e-02f, +1.420115288e-02f, -1.553983791e-02f, -3.099709012e-02f, +4.688337005e-04f, +3.583247316e-02f, +1.987692880e-02f, -2.216276920e-02f, -2.741890696e-02f, +3.174226767e-03f, +1.883851393e-02f, +5.643144828e-03f, -6.817453203e-03f, -4.071025190e-03f, +1.099160415e-03f, +8.307477393e-04f, + -4.660985620e-05f, +1.800315206e-04f, +9.232499980e-05f, -4.324663462e-04f, -4.368423451e-04f, +5.597438829e-04f, +1.021484178e-03f, -2.403517431e-04f, -1.428604554e-03f, -4.536872945e-04f, +1.244257631e-03f, +9.900757732e-04f, -6.023710661e-04f, -9.722710983e-04f, +4.075970651e-05f, +5.716583171e-04f, +1.370721197e-04f, -2.079003019e-04f, -7.410752232e-05f, +5.191041191e-05f, + /* 7, 8 (20) */ + -1.743943174e-03f, -9.436200974e-04f, +7.545292704e-03f, +1.430090415e-02f, -4.287994652e-03f, -4.474305555e-02f, -4.517459404e-02f, +6.095928065e-02f, +2.431184938e-01f, +3.659367866e-01f, +3.213546114e-01f, +1.496028264e-01f, -6.684228775e-03f, -5.528729548e-02f, -2.440698900e-02f, +9.241297694e-03f, +1.259713966e-02f, +2.392538305e-03f, -2.094226947e-03f, -8.826581512e-04f, + +4.849883127e-05f, -1.326195579e-04f, -3.470625443e-04f, +6.051132815e-05f, +1.080381970e-03f, +1.099795979e-03f, -1.411502428e-03f, -4.972899193e-03f, -5.610122683e-03f, -1.542741369e-03f, +3.933410313e-03f, +5.901770077e-03f, +3.412044185e-03f, -7.787748289e-05f, -1.354149613e-03f, -5.956234609e-04f, +2.425516429e-04f, +2.804887793e-04f, +1.777243331e-05f, -5.287845114e-05f, + +1.743943174e-03f, -1.052435922e-03f, -6.925772142e-03f, -2.055753119e-03f, +1.478349958e-02f, +1.476089676e-02f, -1.451835373e-02f, -3.123744187e-02f, -9.597708539e-04f, +3.537878587e-02f, +2.112118643e-02f, -2.117269343e-02f, -2.802127803e-02f, +2.201955669e-03f, +1.887927364e-02f, +6.214803145e-03f, -6.680381083e-03f, -4.278925492e-03f, +1.025052893e-03f, +8.826581512e-04f, + -4.849883127e-05f, +1.750934673e-04f, +1.038891331e-04f, -4.173012173e-04f, -4.546447394e-04f, +5.251984770e-04f, +1.034133532e-03f, -1.863433608e-04f, -1.420804980e-03f, -5.116175765e-04f, +1.212571443e-03f, +1.031517205e-03f, -5.607872884e-04f, -9.896277631e-04f, +7.464318658e-06f, +5.733460737e-04f, +1.549445993e-04f, -2.058620556e-04f, -8.080215677e-05f, +5.287845114e-05f, + /* 7, 9 (20) */ + -1.695444343e-03f, -1.076239655e-03f, +7.198230160e-03f, +1.436141548e-02f, -3.207612682e-03f, -4.364325957e-02f, -4.658609647e-02f, +5.598638146e-02f, +2.375083711e-01f, +3.643940452e-01f, +3.252880217e-01f, +1.555045965e-01f, -3.272184590e-03f, -5.536517296e-02f, -2.576113861e-02f, +8.645674233e-03f, +1.283969130e-02f, +2.673027084e-03f, -2.076454514e-03f, -9.355366023e-04f, + +5.015737533e-05f, -1.238218155e-04f, -3.463209978e-04f, +3.430528633e-05f, +1.052142236e-03f, +1.134947292e-03f, -1.299608136e-03f, -4.885087205e-03f, -5.665293048e-03f, -1.719055951e-03f, +3.795613445e-03f, +5.917410157e-03f, +3.528021810e-03f, +6.345740225e-06f, -1.354121950e-03f, -6.299630894e-04f, +2.286473977e-04f, +2.878417919e-04f, +2.397279188e-05f, -5.372639922e-05f, + +1.695444343e-03f, -8.773424549e-04f, -6.821883009e-03f, -2.473054337e-03f, +1.432885484e-02f, +1.528609524e-02f, -1.348422020e-02f, -3.142378523e-02f, -2.380575833e-03f, +3.486716829e-02f, +2.233375787e-02f, -2.014117623e-02f, -2.858206532e-02f, +1.212327906e-03f, +1.888673795e-02f, +6.788149219e-03f, -6.525436484e-03f, -4.484787548e-03f, +9.442507362e-04f, +9.355366023e-04f, + -5.015737533e-05f, +1.698862713e-04f, +1.148837505e-04f, -4.016387687e-04f, -4.712277792e-04f, +4.901883411e-04f, +1.044769181e-03f, -1.324105813e-04f, -1.410533806e-03f, -5.685985728e-04f, +1.178671770e-03f, +1.071362258e-03f, -5.178037930e-04f, -1.005372440e-03f, -2.641248286e-05f, +5.739072067e-04f, +1.729585111e-04f, -2.032547702e-04f, -8.753623134e-05f, +5.372639922e-05f, + /* 7,10 (20) */ + -1.645286968e-03f, -1.200061471e-03f, +6.851909162e-03f, +1.439572076e-02f, -2.155470446e-03f, -4.250831227e-02f, -4.788570461e-02f, +5.110129425e-02f, +2.318430780e-01f, +3.626749893e-01f, +3.290836352e-01f, +1.614220066e-01f, +2.558372196e-04f, -5.535882722e-02f, -2.711526056e-02f, +8.015711144e-03f, +1.306833870e-02f, +2.960868876e-03f, -2.052481722e-03f, -9.892630015e-04f, + +5.159113137e-05f, -1.151317525e-04f, -3.449425240e-04f, +8.888541570e-06f, +1.023014376e-03f, +1.167356490e-03f, -1.189111422e-03f, -4.794351262e-03f, -5.715345420e-03f, -1.893658228e-03f, +3.654119363e-03f, +5.928206438e-03f, +3.642922938e-03f, +9.302179430e-05f, -1.351891138e-03f, -6.642927522e-04f, +2.138252061e-04f, +2.948913485e-04f, +3.041579779e-05f, -5.444596092e-05f, + +1.645286968e-03f, -7.074561836e-04f, -6.706999259e-03f, -2.874693105e-03f, +1.385762706e-02f, +1.577628358e-02f, -1.243945102e-02f, -3.155619581e-02f, -3.791109640e-03f, +3.429856972e-02f, +2.351242964e-02f, -1.906981397e-02f, -2.909986911e-02f, +2.069554655e-04f, +1.886032547e-02f, +7.362056426e-03f, -6.352477973e-03f, -4.688042318e-03f, +8.567145049e-04f, +9.892630015e-04f, + -5.159113137e-05f, +1.644317385e-04f, +1.252980066e-04f, -3.855236147e-04f, -4.865788560e-04f, +4.547889381e-04f, +1.053391624e-03f, -7.865453639e-05f, -1.397819994e-03f, -6.245251606e-04f, +1.142616908e-03f, +1.109527359e-03f, -4.734908251e-04f, -1.019454864e-03f, -6.081090988e-05f, +5.733184009e-04f, +1.910761257e-04f, -2.000685362e-04f, -9.429192253e-05f, +5.444596092e-05f, + /* 7,11 (20) */ + -1.593695836e-03f, -1.315193223e-03f, +6.506966638e-03f, +1.440460930e-02f, -1.132456070e-03f, -4.134095578e-02f, -4.907481603e-02f, +4.630694299e-02f, +2.261277326e-01f, +3.607813310e-01f, +3.327377545e-01f, +1.673502131e-01f, +3.898760157e-03f, -5.526580542e-02f, -2.846715170e-02f, +7.351418392e-03f, +1.328216390e-02f, +3.255760225e-03f, -2.022065924e-03f, -1.043708962e-03f, + +5.280610052e-05f, -1.065645271e-04f, -3.429511805e-04f, -1.571712687e-05f, +9.930710598e-04f, +1.197047109e-03f, -1.080116366e-03f, -4.700825868e-03f, -5.760264760e-03f, -2.066376244e-03f, +3.509057213e-03f, +5.934103073e-03f, +3.756602344e-03f, +1.820938026e-04f, -1.347400287e-03f, -6.985520155e-04f, +1.980837627e-04f, +3.016114691e-04f, +3.709582054e-05f, -5.502886915e-05f, + +1.593695836e-03f, -5.430244451e-04f, -6.581701252e-03f, -3.260216720e-03f, +1.337104821e-02f, +1.623107252e-02f, -1.138605940e-02f, -3.163485035e-02f, -5.188929633e-03f, +3.367404456e-02f, +2.465504655e-02f, -1.796028661e-02f, -2.957335993e-02f, -8.124993983e-04f, +1.879951456e-02f, +7.935374826e-03f, -6.161401847e-03f, -4.888110854e-03f, +7.624225823e-04f, +1.043708962e-03f, + -5.280610052e-05f, +1.587517383e-04f, +1.351227089e-04f, -3.690005166e-04f, -5.006882110e-04f, +4.190755693e-04f, +1.060005420e-03f, -2.517533160e-05f, -1.382697186e-03f, -6.792943695e-04f, +1.104469498e-03f, +1.145931847e-03f, -4.279218625e-04f, -1.031827635e-03f, -9.566920556e-05f, +5.715584861e-04f, +2.092586564e-04f, -1.962946724e-04f, -1.010508240e-04f, +5.502886915e-05f, + /* 7,12 (20) */ + -1.540889736e-03f, -1.421757750e-03f, +6.164015457e-03f, +1.438889218e-02f, -1.393850104e-04f, -4.014390868e-02f, -5.015493239e-02f, +4.160611712e-02f, +2.203674679e-01f, +3.587149548e-01f, +3.362468117e-01f, +1.732843162e-01f, +7.655362501e-03f, -5.508371162e-02f, -2.981455199e-02f, +6.652866376e-03f, +1.348024766e-02f, +3.557371694e-03f, -1.984970104e-03f, -1.098737832e-03f, + +5.380861561e-05f, -9.813451419e-05f, -3.403715108e-04f, -3.949200614e-05f, +9.623844684e-04f, +1.224046059e-03f, -9.727235245e-04f, -4.604647544e-03f, -5.800042201e-03f, -2.237040496e-03f, +3.360560727e-03f, +5.935049702e-03f, +3.868914579e-03f, +2.735006702e-04f, -1.340594641e-03f, -7.326789593e-04f, +1.814234896e-04f, +3.079760284e-04f, +4.400645762e-05f, -5.546690801e-05f, + +1.540889736e-03f, -3.842727068e-04f, -6.446578543e-03f, -3.629217237e-03f, +1.287036000e-02f, +1.665014809e-02f, -1.032605398e-02f, -3.166002568e-02f, -6.571626820e-03f, +3.299475019e-02f, +2.575951605e-02f, -1.681435476e-02f, -3.000128180e-02f, -1.844327034e-03f, +1.870384536e-02f, +8.506933313e-03f, -5.952143191e-03f, -5.084405527e-03f, +6.613717584e-04f, +1.098737832e-03f, + -5.380861561e-05f, +1.528681437e-04f, +1.443503056e-04f, -3.521142755e-04f, -5.135489144e-04f, +3.831232131e-04f, +1.064619140e-03f, +2.792815481e-05f, -1.365203629e-03f, -7.328055899e-04f, +1.064296405e-03f, +1.180498150e-03f, -3.811734851e-04f, -1.042446355e-03f, -1.309237554e-04f, +5.686085208e-04f, +2.274663326e-04f, -1.919257767e-04f, -1.077939837e-04f, +5.546690801e-05f, + /* 7,13 (20) */ + -1.487081120e-03f, -1.519892264e-03f, +5.823643947e-03f, +1.434940017e-02f, +8.229994580e-04f, -3.891986262e-02f, -5.112765592e-02f, +3.700146958e-02f, +2.145674257e-01f, +3.564779143e-01f, +3.396073725e-01f, +1.792193659e-01f, +1.152427708e-02f, -5.481021095e-02f, -3.115514663e-02f, +5.920187417e-03f, +1.366167115e-02f, +3.865347722e-03f, -1.940963646e-03f, -1.154204740e-03f, + +5.460531467e-05f, -8.985529698e-05f, -3.372284827e-04f, -6.241843442e-05f, +9.310261863e-04f, +1.248383529e-03f, -8.670298343e-04f, -4.505954627e-03f, -5.834675030e-03f, -2.405484152e-03f, +3.208768052e-03f, +5.931001556e-03f, +3.979714171e-03f, +3.671771130e-04f, -1.331421700e-03f, -7.666102496e-04f, +1.638465809e-04f, +3.139588071e-04f, +5.114052502e-05f, -5.575193650e-05f, + +1.487081120e-03f, -2.314045631e-04f, -6.302228238e-03f, -3.981331512e-03f, +1.235681108e-02f, +1.703327130e-02f, -9.261434836e-03f, -3.163209752e-02f, -7.936830448e-03f, +3.226194460e-02f, +2.682381246e-02f, -1.563385661e-02f, -3.038245528e-02f, -2.886773388e-03f, +1.857292160e-02f, +9.075541833e-03f, -5.724676858e-03f, -5.276331304e-03f, +5.535777746e-04f, +1.154204740e-03f, + -5.460531467e-05f, +1.468027723e-04f, +1.529748702e-04f, -3.349096262e-04f, -5.251568388e-04f, +3.470063668e-04f, +1.067245309e-03f, +8.055846923e-05f, -1.345382071e-03f, -7.849607770e-04f, +1.022168591e-03f, +1.213151962e-03f, -3.333252362e-04f, -1.051269745e-03f, -1.665092036e-04f, +5.644518714e-04f, +2.456584776e-04f, -1.869557736e-04f, -1.145019438e-04f, +5.575193650e-05f, + /* 7,14 (20) */ + -1.432475805e-03f, -1.609747561e-03f, +5.486415464e-03f, +1.428698174e-02f, +1.754025644e-03f, -3.767147909e-02f, -5.199468575e-02f, +3.249551495e-02f, +2.087327506e-01f, +3.540724301e-01f, +3.428161405e-01f, +1.851503674e-01f, +1.550399125e-02f, -5.444303384e-02f, -3.248656833e-02f, +5.153577167e-03f, +1.382551773e-02f, +4.179306529e-03f, -1.889823121e-03f, -1.209956676e-03f, + +5.520311442e-05f, -8.173966085e-05f, -3.335474258e-04f, -8.448078218e-05f, +8.990670975e-04f, +1.270092884e-03f, -7.631285195e-04f, -4.404887064e-03f, -5.864166663e-03f, -2.571543266e-03f, +3.053821581e-03f, +5.921919554e-03f, +4.088855821e-03f, +4.630536933e-04f, -1.319831346e-03f, -8.002812150e-04f, +1.453570448e-04f, +3.195335445e-04f, +5.849004917e-05f, -5.587591266e-05f, + +1.432475805e-03f, -8.460179078e-05f, -6.149253368e-03f, -4.316241138e-03f, +1.183165424e-02f, +1.738027767e-02f, -8.194189527e-03f, -3.155153905e-02f, -9.282212520e-03f, +3.147698382e-02f, +2.784598105e-02f, -1.442070465e-02f, -3.071578052e-02f, -3.938043134e-03f, +1.840641240e-02f, +9.639993705e-03f, -5.479018381e-03f, -5.463287077e-03f, +4.390758309e-04f, +1.209956676e-03f, + -5.520311442e-05f, +1.405773297e-04f, +1.609920818e-04f, -3.174311340e-04f, -5.355106268e-04f, +3.107988913e-04f, +1.067900350e-03f, +1.326197758e-04f, -1.323279664e-03f, -8.356646486e-04f, +9.781609726e-04f, +1.243822410e-03f, -2.844594777e-04f, -1.058259774e-03f, -2.023585751e-04f, +5.590742877e-04f, +2.637935894e-04f, -1.813799598e-04f, -1.211547821e-04f, +5.587591266e-05f, + /* 7,15 (20) */ + -1.377272691e-03f, -1.691487222e-03f, +5.152868038e-03f, +1.420250095e-02f, +2.653092742e-03f, -3.640138620e-02f, -5.275781427e-02f, +2.809062789e-02f, +2.028685840e-01f, +3.515008869e-01f, +3.458699621e-01f, +1.910722870e-01f, +1.959284707e-02f, -5.397998014e-02f, -3.380639968e-02f, +4.353295952e-03f, +1.397087478e-02f, +4.498840074e-03f, -1.831333072e-03f, -1.265832589e-03f, + +5.560918391e-05f, -7.379958910e-05f, -3.293539716e-04f, -1.056654301e-04f, +8.665772837e-04f, +1.289210562e-03f, -6.611090096e-04f, -4.301586208e-03f, -5.888526601e-03f, -2.735056991e-03f, +2.895867777e-03f, +5.907770388e-03f, +4.196194611e-03f, +5.610568623e-04f, -1.305775965e-03f, -8.336259270e-04f, +1.259607436e-04f, +3.246739927e-04f, +6.604626058e-05f, -5.583091827e-05f, + +1.377272691e-03f, +5.597553889e-05f, -5.988261286e-03f, -4.633672272e-03f, +1.129614362e-02f, +1.769107656e-02f, -7.126289177e-03f, -3.141891928e-02f, -1.060549218e-02f, +3.064131917e-02f, +2.882414202e-02f, -1.317688224e-02f, -3.100024000e-02f, -4.996302908e-03f, +1.820405382e-02f, +1.019906799e-02f, -5.215224791e-03f, -5.644667037e-03f, +3.179210487e-04f, +1.265832589e-03f, + -5.560918391e-05f, +1.342133529e-04f, +1.683992018e-04f, -2.997230928e-04f, -5.446116517e-04f, +2.745738586e-04f, +1.066604505e-03f, +1.840180448e-04f, -1.298947844e-03f, -8.848248770e-04f, +9.323522747e-04f, +1.272442214e-03f, -2.346612363e-04f, -1.063381764e-03f, -2.384034027e-04f, +5.524639733e-04f, +2.818294260e-04f, -1.751950471e-04f, -1.277321569e-04f, +5.583091827e-05f, + /* 7,16 (20) */ + -1.321663507e-03f, -1.765286811e-03f, +4.823514067e-03f, +1.409683552e-02f, +3.519670025e-03f, -3.511217564e-02f, -5.341892328e-02f, +2.378904168e-02f, +1.969800574e-01f, +3.487658299e-01f, +3.487658299e-01f, +1.969800574e-01f, +2.378904168e-02f, -5.341892328e-02f, -3.511217564e-02f, +3.519670025e-03f, +1.409683552e-02f, +4.823514067e-03f, -1.765286811e-03f, -1.321663507e-03f, + +5.583091827e-05f, -6.604626058e-05f, -3.246739927e-04f, -1.259607436e-04f, +8.336259270e-04f, +1.305775965e-03f, -5.610568623e-04f, -4.196194611e-03f, -5.907770388e-03f, -2.895867777e-03f, +2.735056991e-03f, +5.888526601e-03f, +4.301586208e-03f, +6.611090096e-04f, -1.289210562e-03f, -8.665772837e-04f, +1.056654301e-04f, +3.293539716e-04f, +7.379958910e-05f, -5.560918391e-05f, + +1.321663507e-03f, +1.901888918e-04f, -5.819862084e-03f, -4.933395365e-03f, +1.075153197e-02f, +1.796565042e-02f, -6.059684672e-03f, -3.123490123e-02f, -1.190444003e-02f, +2.975649429e-02f, +2.975649429e-02f, -1.190444003e-02f, -3.123490123e-02f, -6.059684672e-03f, +1.796565042e-02f, +1.075153197e-02f, -4.933395365e-03f, -5.819862084e-03f, +1.901888918e-04f, +1.321663507e-03f, + -5.583091827e-05f, +1.277321569e-04f, +1.751950471e-04f, -2.818294260e-04f, -5.524639733e-04f, +2.384034027e-04f, +1.063381764e-03f, +2.346612363e-04f, -1.272442214e-03f, -9.323522747e-04f, +8.848248770e-04f, +1.298947844e-03f, -1.840180448e-04f, -1.066604505e-03f, -2.745738586e-04f, +5.446116517e-04f, +2.997230928e-04f, -1.683992018e-04f, -1.342133529e-04f, +5.560918391e-05f, + /* 7,17 (20) */ + -1.265832589e-03f, -1.831333072e-03f, +4.498840074e-03f, +1.397087478e-02f, +4.353295952e-03f, -3.380639968e-02f, -5.397998014e-02f, +1.959284707e-02f, +1.910722870e-01f, +3.458699621e-01f, +3.515008869e-01f, +2.028685840e-01f, +2.809062789e-02f, -5.275781427e-02f, -3.640138620e-02f, +2.653092742e-03f, +1.420250095e-02f, +5.152868038e-03f, -1.691487222e-03f, -1.377272691e-03f, + +5.587591266e-05f, -5.849004917e-05f, -3.195335445e-04f, -1.453570448e-04f, +8.002812150e-04f, +1.319831346e-03f, -4.630536933e-04f, -4.088855821e-03f, -5.921919554e-03f, -3.053821581e-03f, +2.571543266e-03f, +5.864166663e-03f, +4.404887064e-03f, +7.631285195e-04f, -1.270092884e-03f, -8.990670975e-04f, +8.448078218e-05f, +3.335474258e-04f, +8.173966085e-05f, -5.520311442e-05f, + +1.265832589e-03f, +3.179210487e-04f, -5.644667037e-03f, -5.215224791e-03f, +1.019906799e-02f, +1.820405382e-02f, -4.996302908e-03f, -3.100024000e-02f, -1.317688224e-02f, +2.882414202e-02f, +3.064131917e-02f, -1.060549218e-02f, -3.141891928e-02f, -7.126289177e-03f, +1.769107656e-02f, +1.129614362e-02f, -4.633672272e-03f, -5.988261286e-03f, +5.597553889e-05f, +1.377272691e-03f, + -5.587591266e-05f, +1.211547821e-04f, +1.813799598e-04f, -2.637935894e-04f, -5.590742877e-04f, +2.023585751e-04f, +1.058259774e-03f, +2.844594777e-04f, -1.243822410e-03f, -9.781609726e-04f, +8.356646486e-04f, +1.323279664e-03f, -1.326197758e-04f, -1.067900350e-03f, -3.107988913e-04f, +5.355106268e-04f, +3.174311340e-04f, -1.609920818e-04f, -1.405773297e-04f, +5.520311442e-05f, + /* 7,18 (20) */ + -1.209956676e-03f, -1.889823121e-03f, +4.179306529e-03f, +1.382551773e-02f, +5.153577167e-03f, -3.248656833e-02f, -5.444303384e-02f, +1.550399125e-02f, +1.851503674e-01f, +3.428161405e-01f, +3.540724301e-01f, +2.087327506e-01f, +3.249551495e-02f, -5.199468575e-02f, -3.767147909e-02f, +1.754025644e-03f, +1.428698174e-02f, +5.486415464e-03f, -1.609747561e-03f, -1.432475805e-03f, + +5.575193650e-05f, -5.114052502e-05f, -3.139588071e-04f, -1.638465809e-04f, +7.666102496e-04f, +1.331421700e-03f, -3.671771130e-04f, -3.979714171e-03f, -5.931001556e-03f, -3.208768052e-03f, +2.405484152e-03f, +5.834675030e-03f, +4.505954627e-03f, +8.670298343e-04f, -1.248383529e-03f, -9.310261863e-04f, +6.241843442e-05f, +3.372284827e-04f, +8.985529698e-05f, -5.460531467e-05f, + +1.209956676e-03f, +4.390758309e-04f, -5.463287077e-03f, -5.479018381e-03f, +9.639993705e-03f, +1.840641240e-02f, -3.938043134e-03f, -3.071578052e-02f, -1.442070465e-02f, +2.784598105e-02f, +3.147698382e-02f, -9.282212520e-03f, -3.155153905e-02f, -8.194189527e-03f, +1.738027767e-02f, +1.183165424e-02f, -4.316241138e-03f, -6.149253368e-03f, -8.460179078e-05f, +1.432475805e-03f, + -5.575193650e-05f, +1.145019438e-04f, +1.869557736e-04f, -2.456584776e-04f, -5.644518714e-04f, +1.665092036e-04f, +1.051269745e-03f, +3.333252362e-04f, -1.213151962e-03f, -1.022168591e-03f, +7.849607770e-04f, +1.345382071e-03f, -8.055846923e-05f, -1.067245309e-03f, -3.470063668e-04f, +5.251568388e-04f, +3.349096262e-04f, -1.529748702e-04f, -1.468027723e-04f, +5.460531467e-05f, + /* 7,19 (20) */ + -1.154204740e-03f, -1.940963646e-03f, +3.865347722e-03f, +1.366167115e-02f, +5.920187417e-03f, -3.115514663e-02f, -5.481021095e-02f, +1.152427708e-02f, +1.792193659e-01f, +3.396073725e-01f, +3.564779143e-01f, +2.145674257e-01f, +3.700146958e-02f, -5.112765592e-02f, -3.891986262e-02f, +8.229994580e-04f, +1.434940017e-02f, +5.823643947e-03f, -1.519892264e-03f, -1.487081120e-03f, + +5.546690801e-05f, -4.400645762e-05f, -3.079760284e-04f, -1.814234896e-04f, +7.326789593e-04f, +1.340594641e-03f, -2.735006702e-04f, -3.868914579e-03f, -5.935049702e-03f, -3.360560727e-03f, +2.237040496e-03f, +5.800042201e-03f, +4.604647544e-03f, +9.727235245e-04f, -1.224046059e-03f, -9.623844684e-04f, +3.949200614e-05f, +3.403715108e-04f, +9.813451419e-05f, -5.380861561e-05f, + +1.154204740e-03f, +5.535777746e-04f, -5.276331304e-03f, -5.724676858e-03f, +9.075541833e-03f, +1.857292160e-02f, -2.886773388e-03f, -3.038245528e-02f, -1.563385661e-02f, +2.682381246e-02f, +3.226194460e-02f, -7.936830448e-03f, -3.163209752e-02f, -9.261434836e-03f, +1.703327130e-02f, +1.235681108e-02f, -3.981331512e-03f, -6.302228238e-03f, -2.314045631e-04f, +1.487081120e-03f, + -5.546690801e-05f, +1.077939837e-04f, +1.919257767e-04f, -2.274663326e-04f, -5.686085208e-04f, +1.309237554e-04f, +1.042446355e-03f, +3.811734851e-04f, -1.180498150e-03f, -1.064296405e-03f, +7.328055899e-04f, +1.365203629e-03f, -2.792815481e-05f, -1.064619140e-03f, -3.831232131e-04f, +5.135489144e-04f, +3.521142755e-04f, -1.443503056e-04f, -1.528681437e-04f, +5.380861561e-05f, + /* 7,20 (20) */ + -1.098737832e-03f, -1.984970104e-03f, +3.557371694e-03f, +1.348024766e-02f, +6.652866376e-03f, -2.981455199e-02f, -5.508371162e-02f, +7.655362501e-03f, +1.732843162e-01f, +3.362468117e-01f, +3.587149548e-01f, +2.203674679e-01f, +4.160611712e-02f, -5.015493239e-02f, -4.014390868e-02f, -1.393850104e-04f, +1.438889218e-02f, +6.164015457e-03f, -1.421757750e-03f, -1.540889736e-03f, + +5.502886915e-05f, -3.709582054e-05f, -3.016114691e-04f, -1.980837627e-04f, +6.985520155e-04f, +1.347400287e-03f, -1.820938026e-04f, -3.756602344e-03f, -5.934103073e-03f, -3.509057213e-03f, +2.066376244e-03f, +5.760264760e-03f, +4.700825868e-03f, +1.080116366e-03f, -1.197047109e-03f, -9.930710598e-04f, +1.571712687e-05f, +3.429511805e-04f, +1.065645271e-04f, -5.280610052e-05f, + +1.098737832e-03f, +6.613717584e-04f, -5.084405527e-03f, -5.952143191e-03f, +8.506933313e-03f, +1.870384536e-02f, -1.844327034e-03f, -3.000128180e-02f, -1.681435476e-02f, +2.575951605e-02f, +3.299475019e-02f, -6.571626820e-03f, -3.166002568e-02f, -1.032605398e-02f, +1.665014809e-02f, +1.287036000e-02f, -3.629217237e-03f, -6.446578543e-03f, -3.842727068e-04f, +1.540889736e-03f, + -5.502886915e-05f, +1.010508240e-04f, +1.962946724e-04f, -2.092586564e-04f, -5.715584861e-04f, +9.566920556e-05f, +1.031827635e-03f, +4.279218625e-04f, -1.145931847e-03f, -1.104469498e-03f, +6.792943695e-04f, +1.382697186e-03f, +2.517533160e-05f, -1.060005420e-03f, -4.190755693e-04f, +5.006882110e-04f, +3.690005166e-04f, -1.351227089e-04f, -1.587517383e-04f, +5.280610052e-05f, + /* 7,21 (20) */ + -1.043708962e-03f, -2.022065924e-03f, +3.255760225e-03f, +1.328216390e-02f, +7.351418392e-03f, -2.846715170e-02f, -5.526580542e-02f, +3.898760157e-03f, +1.673502131e-01f, +3.327377545e-01f, +3.607813310e-01f, +2.261277326e-01f, +4.630694299e-02f, -4.907481603e-02f, -4.134095578e-02f, -1.132456070e-03f, +1.440460930e-02f, +6.506966638e-03f, -1.315193223e-03f, -1.593695836e-03f, + +5.444596092e-05f, -3.041579779e-05f, -2.948913485e-04f, -2.138252061e-04f, +6.642927522e-04f, +1.351891138e-03f, -9.302179430e-05f, -3.642922938e-03f, -5.928206438e-03f, -3.654119363e-03f, +1.893658228e-03f, +5.715345420e-03f, +4.794351262e-03f, +1.189111422e-03f, -1.167356490e-03f, -1.023014376e-03f, -8.888541570e-06f, +3.449425240e-04f, +1.151317525e-04f, -5.159113137e-05f, + +1.043708962e-03f, +7.624225823e-04f, -4.888110854e-03f, -6.161401847e-03f, +7.935374826e-03f, +1.879951456e-02f, -8.124993983e-04f, -2.957335993e-02f, -1.796028661e-02f, +2.465504655e-02f, +3.367404456e-02f, -5.188929633e-03f, -3.163485035e-02f, -1.138605940e-02f, +1.623107252e-02f, +1.337104821e-02f, -3.260216720e-03f, -6.581701252e-03f, -5.430244451e-04f, +1.593695836e-03f, + -5.444596092e-05f, +9.429192253e-05f, +2.000685362e-04f, -1.910761257e-04f, -5.733184009e-04f, +6.081090988e-05f, +1.019454864e-03f, +4.734908251e-04f, -1.109527359e-03f, -1.142616908e-03f, +6.245251606e-04f, +1.397819994e-03f, +7.865453639e-05f, -1.053391624e-03f, -4.547889381e-04f, +4.865788560e-04f, +3.855236147e-04f, -1.252980066e-04f, -1.644317385e-04f, +5.159113137e-05f, + /* 7,22 (20) */ + -9.892630015e-04f, -2.052481722e-03f, +2.960868876e-03f, +1.306833870e-02f, +8.015711144e-03f, -2.711526056e-02f, -5.535882722e-02f, +2.558372196e-04f, +1.614220066e-01f, +3.290836352e-01f, +3.626749893e-01f, +2.318430780e-01f, +5.110129425e-02f, -4.788570461e-02f, -4.250831227e-02f, -2.155470446e-03f, +1.439572076e-02f, +6.851909162e-03f, -1.200061471e-03f, -1.645286968e-03f, + +5.372639922e-05f, -2.397279188e-05f, -2.878417919e-04f, -2.286473977e-04f, +6.299630894e-04f, +1.354121950e-03f, -6.345740225e-06f, -3.528021810e-03f, -5.917410157e-03f, -3.795613445e-03f, +1.719055951e-03f, +5.665293048e-03f, +4.885087205e-03f, +1.299608136e-03f, -1.134947292e-03f, -1.052142236e-03f, -3.430528633e-05f, +3.463209978e-04f, +1.238218155e-04f, -5.015737533e-05f, + +9.892630015e-04f, +8.567145049e-04f, -4.688042318e-03f, -6.352477973e-03f, +7.362056426e-03f, +1.886032547e-02f, +2.069554655e-04f, -2.909986911e-02f, -1.906981397e-02f, +2.351242964e-02f, +3.429856972e-02f, -3.791109640e-03f, -3.155619581e-02f, -1.243945102e-02f, +1.577628358e-02f, +1.385762706e-02f, -2.874693105e-03f, -6.706999259e-03f, -7.074561836e-04f, +1.645286968e-03f, + -5.372639922e-05f, +8.753623134e-05f, +2.032547702e-04f, -1.729585111e-04f, -5.739072067e-04f, +2.641248286e-05f, +1.005372440e-03f, +5.178037930e-04f, -1.071362258e-03f, -1.178671770e-03f, +5.685985728e-04f, +1.410533806e-03f, +1.324105813e-04f, -1.044769181e-03f, -4.901883411e-04f, +4.712277792e-04f, +4.016387687e-04f, -1.148837505e-04f, -1.698862713e-04f, +5.015737533e-05f, + /* 7,23 (20) */ + -9.355366023e-04f, -2.076454514e-03f, +2.673027084e-03f, +1.283969130e-02f, +8.645674233e-03f, -2.576113861e-02f, -5.536517296e-02f, -3.272184590e-03f, +1.555045965e-01f, +3.252880217e-01f, +3.643940452e-01f, +2.375083711e-01f, +5.598638146e-02f, -4.658609647e-02f, -4.364325957e-02f, -3.207612682e-03f, +1.436141548e-02f, +7.198230160e-03f, -1.076239655e-03f, -1.695444343e-03f, + +5.287845114e-05f, -1.777243331e-05f, -2.804887793e-04f, -2.425516429e-04f, +5.956234609e-04f, +1.354149613e-03f, +7.787748289e-05f, -3.412044185e-03f, -5.901770077e-03f, -3.933410313e-03f, +1.542741369e-03f, +5.610122683e-03f, +4.972899193e-03f, +1.411502428e-03f, -1.099795979e-03f, -1.080381970e-03f, -6.051132815e-05f, +3.470625443e-04f, +1.326195579e-04f, -4.849883127e-05f, + +9.355366023e-04f, +9.442507362e-04f, -4.484787548e-03f, -6.525436484e-03f, +6.788149219e-03f, +1.888673795e-02f, +1.212327906e-03f, -2.858206532e-02f, -2.014117623e-02f, +2.233375787e-02f, +3.486716829e-02f, -2.380575833e-03f, -3.142378523e-02f, -1.348422020e-02f, +1.528609524e-02f, +1.432885484e-02f, -2.473054337e-03f, -6.821883009e-03f, -8.773424549e-04f, +1.695444343e-03f, + -5.287845114e-05f, +8.080215677e-05f, +2.058620556e-04f, -1.549445993e-04f, -5.733460737e-04f, -7.464318658e-06f, +9.896277631e-04f, +5.607872884e-04f, -1.031517205e-03f, -1.212571443e-03f, +5.116175765e-04f, +1.420804980e-03f, +1.863433608e-04f, -1.034133532e-03f, -5.251984770e-04f, +4.546447394e-04f, +4.173012173e-04f, -1.038891331e-04f, -1.750934673e-04f, +4.849883127e-05f, + /* 7,24 (20) */ + -8.826581512e-04f, -2.094226947e-03f, +2.392538305e-03f, +1.259713966e-02f, +9.241297694e-03f, -2.440698900e-02f, -5.528729548e-02f, -6.684228775e-03f, +1.496028264e-01f, +3.213546114e-01f, +3.659367866e-01f, +2.431184938e-01f, +6.095928065e-02f, -4.517459404e-02f, -4.474305555e-02f, -4.287994652e-03f, +1.430090415e-02f, +7.545292704e-03f, -9.436200974e-04f, -1.743943174e-03f, + +5.191041191e-05f, -1.181959165e-05f, -2.728580963e-04f, -2.555409276e-04f, +5.613327454e-04f, +1.352033024e-03f, +1.595952382e-04f, -3.295134865e-03f, -5.881347427e-03f, -4.067385554e-03f, +1.364888672e-03f, +5.549855554e-03f, +5.057654947e-03f, +1.524686796e-03f, -1.061882486e-03f, -1.107660528e-03f, -8.748280951e-05f, +3.471436552e-04f, +1.415090478e-04f, -4.660985620e-05f, + +8.826581512e-04f, +1.025052893e-03f, -4.278925492e-03f, -6.680381083e-03f, +6.214803145e-03f, +1.887927364e-02f, +2.201955669e-03f, -2.802127803e-02f, -2.117269343e-02f, +2.112118643e-02f, +3.537878587e-02f, -9.597708539e-04f, -3.123744187e-02f, -1.451835373e-02f, +1.476089676e-02f, +1.478349958e-02f, -2.055753119e-03f, -6.925772142e-03f, -1.052435922e-03f, +1.743943174e-03f, + -5.191041191e-05f, +7.410752232e-05f, +2.079003019e-04f, -1.370721197e-04f, -5.716583171e-04f, -4.075970651e-05f, +9.722710983e-04f, +6.023710661e-04f, -9.900757732e-04f, -1.244257631e-03f, +4.536872945e-04f, +1.428604554e-03f, +2.403517431e-04f, -1.021484178e-03f, -5.597438829e-04f, +4.368423451e-04f, +4.324663462e-04f, -9.232499980e-05f, -1.800315206e-04f, +4.660985620e-05f, + /* 7,25 (20) */ + -8.307477393e-04f, -2.106046539e-03f, +2.119680209e-03f, +1.234159873e-02f, +9.802630440e-03f, -2.305495598e-02f, -5.512770024e-02f, -9.979363640e-03f, +1.437214790e-01f, +3.172872259e-01f, +3.673016753e-01f, +2.486683493e-01f, +6.601693560e-02f, -4.364990725e-02f, -4.580493803e-02f, -5.395655180e-03f, +1.421342134e-02f, +7.892436359e-03f, -8.021110495e-04f, -1.790553030e-03f, + +5.083058236e-05f, -6.118387923e-06f, -2.649752862e-04f, -2.676198699e-04f, +5.271482026e-04f, +1.347832958e-03f, +2.387591440e-04f, -3.177438036e-03f, -5.856208695e-03f, -4.197419649e-03f, +1.185674053e-03f, +5.484519075e-03f, +5.139224605e-03f, +1.639050427e-03f, -1.021190305e-03f, -1.133904594e-03f, -1.151937864e-04f, +3.465414342e-04f, +1.504735926e-04f, -4.448519162e-05f, + +8.307477393e-04f, +1.099160415e-03f, -4.071025190e-03f, -6.817453203e-03f, +5.643144828e-03f, +1.883851393e-02f, +3.174226767e-03f, -2.741890696e-02f, -2.216276920e-02f, +1.987692880e-02f, +3.583247316e-02f, +4.688337005e-04f, -3.099709012e-02f, -1.553983791e-02f, +1.420115288e-02f, +1.522034193e-02f, -1.623286773e-03f, -7.018097142e-03f, -1.232467443e-03f, +1.790553030e-03f, + -5.083058236e-05f, +6.746953387e-05f, +2.093805949e-04f, -1.193776738e-04f, -5.688693095e-04f, -7.341596628e-05f, +9.533554423e-04f, +6.424882360e-04f, -9.471242589e-04f, -1.273676493e-03f, +3.949147877e-04f, +1.433908334e-03f, +2.943337751e-04f, -1.006824711e-03f, -5.937490967e-04f, +4.178360684e-04f, +4.470897965e-04f, -8.020385627e-05f, -1.846787500e-04f, +4.448519162e-05f, + /* 7,26 (20) */ + -7.799171569e-04f, -2.112164927e-03f, +1.854704923e-03f, +1.207397886e-02f, +1.032977864e-02f, -2.170712302e-02f, -5.488894109e-02f, -1.315680168e-02f, +1.378652703e-01f, +3.130898062e-01f, +3.684873493e-01f, +2.541528684e-01f, +7.115616020e-02f, -4.201085682e-02f, -4.682612834e-02f, -6.529559773e-03f, +1.409822755e-02f, +8.238977793e-03f, -6.516374570e-04f, -1.835038222e-03f, + +4.964724711e-05f, -6.722085081e-07f, -2.568656035e-04f, -2.787946686e-04f, +4.931254120e-04f, +1.341611938e-03f, +3.153250819e-04f, -3.059097074e-03f, -5.826425508e-03f, -4.323398105e-03f, +1.005275483e-03f, +5.414146844e-03f, +5.217480927e-03f, +1.754479317e-03f, -9.777065690e-04f, -1.159040700e-03f, -1.436162238e-04f, +3.452336613e-04f, +1.594957521e-04f, -4.211998972e-05f, + +7.799171569e-04f, +1.166629949e-03f, -3.861644596e-03f, -6.936830877e-03f, +5.074275519e-03f, +1.876509796e-02f, +4.127582209e-03f, -2.677641873e-02f, -2.310989346e-02f, +1.860325231e-02f, +3.622738795e-02f, +1.902742034e-03f, -3.070275635e-02f, -1.654666262e-02f, +1.360740378e-02f, +1.563817800e-02f, -1.176196977e-03f, -7.098300999e-03f, -1.417146193e-03f, +1.835038222e-03f, + -4.964724711e-05f, +6.090474729e-05f, +2.103151419e-04f, -1.018966696e-04f, -5.650063904e-04f, -1.053775565e-04f, +9.329363822e-04f, +6.810753783e-04f, -9.027514936e-04f, -1.300778745e-03f, +3.354088381e-04f, +1.436696948e-03f, +3.481868894e-04f, -9.901628520e-04f, -6.271388219e-04f, +3.976442523e-04f, +4.611275748e-04f, -6.753987228e-05f, -1.890136608e-04f, +4.211998972e-05f, + /* 7,27 (20) */ + -7.302699098e-04f, -2.112837135e-03f, +1.597839319e-03f, +1.179518419e-02f, +1.082290405e-02f, -2.036551108e-02f, -5.457361601e-02f, -1.621589875e-02f, +1.320388448e-01f, +3.087664081e-01f, +3.694926248e-01f, +2.595670152e-01f, +7.637364113e-02f, -4.025637750e-02f, -4.780383490e-02f, -7.688600474e-03f, +1.395461133e-02f, +8.584211455e-03f, -4.921417048e-04f, -1.877158212e-03f, + +4.836865338e-05f, +4.516279813e-06f, -2.485539700e-04f, -2.890730509e-04f, +4.593182172e-04f, +1.333434110e-03f, +3.892531985e-04f, -2.940254357e-03f, -5.792074499e-03f, -4.445211600e-03f, +8.238724784e-04f, +5.338778624e-03f, +5.292299490e-03f, +1.870856384e-03f, -9.314221367e-04f, -1.182995347e-03f, -1.727199946e-04f, +3.431988561e-04f, +1.685573558e-04f, -3.950983931e-05f, + +7.302699098e-04f, +1.227534696e-03f, -3.651329454e-03f, -7.038727546e-03f, +4.509269128e-03f, +1.865972041e-02f, +5.060518591e-03f, -2.609534335e-02f, -2.401264496e-02f, +1.730247356e-02f, +3.656279679e-02f, +3.339438982e-03f, -3.035456946e-02f, -1.753682547e-02f, +1.298026496e-02f, +1.603582225e-02f, -7.150694020e-04f, -7.165840871e-03f, -1.606159853e-03f, +1.877158212e-03f, + -4.836865338e-05f, +5.442903877e-05f, +2.107172154e-04f, -8.466325981e-05f, -5.600987715e-04f, -1.365912017e-04f, +9.110719496e-04f, +7.180726487e-04f, -8.570486475e-04f, -1.325519754e-03f, +2.752797265e-04f, +1.436955911e-03f, +4.018081145e-04f, -9.715104632e-04f, -6.598380943e-04f, +3.762881120e-04f, +4.745361639e-04f, -5.434888104e-05f, -1.930150079e-04f, +3.950983931e-05f, + /* 7,28 (20) */ + -6.819012564e-04f, -2.108320856e-03f, +1.349285349e-03f, +1.150611114e-02f, +1.128222227e-02f, -1.903207697e-02f, -5.418436281e-02f, -1.915615311e-02f, +1.262467703e-01f, +3.043211965e-01f, +3.703164973e-01f, +2.649057939e-01f, +8.166594062e-02f, -3.838552112e-02f, -4.873525704e-02f, -8.871595821e-03f, +1.378189133e-02f, +8.927410311e-03f, -3.235843490e-04f, -1.916668051e-03f, + +4.700299059e-05f, +9.445113488e-06f, -2.400649321e-04f, -2.984642181e-04f, +4.257786731e-04f, +1.323365107e-03f, +4.605079003e-04f, -2.821051081e-03f, -5.753237171e-03f, -4.562756102e-03f, +6.416458677e-04f, +5.258460319e-03f, +5.363558879e-03f, +1.988061608e-03f, -8.823316633e-04f, -1.205695118e-03f, -2.024728833e-04f, +3.404163420e-04f, +1.776395203e-04f, -3.665079142e-05f, + +6.819012564e-04f, +1.281963735e-03f, -3.440612238e-03f, -7.123390806e-03f, +3.949170357e-03f, +1.852312920e-02f, +5.971590541e-03f, -2.537727070e-02f, -2.486969360e-02f, +1.597695381e-02f, +3.683807651e-02f, +4.776394893e-03f, -2.995276134e-02f, -1.850833594e-02f, +1.232042687e-02f, +1.641211036e-02f, -2.405332382e-04f, -7.220189752e-03f, -1.799174861e-03f, +1.916668051e-03f, + -4.700299059e-05f, +4.805757752e-05f, +2.106010952e-04f, -6.771028362e-05f, -5.541774399e-04f, -1.670059789e-04f, +8.878224722e-04f, +7.534238774e-04f, -8.101090303e-04f, -1.347859614e-03f, +2.146390078e-04f, +1.434675664e-03f, +4.550942873e-04f, -9.508835635e-04f, -6.917724485e-04f, +3.537917286e-04f, +4.872726340e-04f, -4.064837437e-05f, -1.966618593e-04f, +3.665079142e-05f, + /* 7,29 (20) */ + -6.348982658e-04f, -2.098875742e-03f, +1.109220417e-03f, +1.120764692e-02f, +1.170800094e-02f, -1.770871186e-02f, -5.372385491e-02f, -2.197720419e-02f, +1.204935331e-01f, +2.997584404e-01f, +3.709581431e-01f, +2.701642542e-01f, +8.702949950e-02f, -3.639745951e-02f, -4.961758870e-02f, -1.007729094e-02f, +1.357941845e-02f, +9.267826653e-03f, -1.459448287e-04f, -1.953318842e-03f, + +4.555837060e-05f, +1.411301470e-05f, -2.314226199e-04f, -3.069787893e-04f, +3.925569985e-04f, +1.311471924e-03f, +5.290578424e-04f, -2.701627071e-03f, -5.709999753e-03f, -4.675932995e-03f, +4.587775555e-04f, +5.173243944e-03f, +5.431140880e-03f, +2.105972156e-03f, -8.304336728e-04f, -1.227066805e-03f, -2.328405920e-04f, +3.368663100e-04f, +1.867226703e-04f, -3.353938457e-05f, + +6.348982658e-04f, +1.330021313e-03f, -3.230011143e-03f, -7.191101090e-03f, +3.394992917e-03f, +1.835612323e-02f, +6.859413013e-03f, -2.462384682e-02f, -2.567980264e-02f, +1.462909419e-02f, +3.705271552e-02f, +6.211070557e-03f, -2.949766706e-02f, -1.945921950e-02f, +1.162865442e-02f, +1.676590209e-02f, +2.467393959e-04f, -7.260838126e-03f, -1.995836721e-03f, +1.953318842e-03f, + -4.555837060e-05f, +4.180480123e-05f, +2.099820088e-04f, -5.106921368e-05f, -5.472750577e-04f, -1.965733985e-04f, +8.632504201e-04f, +7.870766570e-04f, -7.620278883e-04f, -1.367763221e-03f, +1.535992829e-04f, +1.429851616e-03f, +5.079422657e-04f, -9.283023291e-04f, -7.228680859e-04f, +3.301820368e-04f, +4.992947547e-04f, -2.645749345e-05f, -1.999336602e-04f, +3.353938457e-05f, + /* 7,30 (20) */ + -5.893398952e-04f, -2.084762727e-03f, +8.777977970e-04f, +1.090066813e-02f, +1.210055794e-02f, -1.639723994e-02f, -5.319479707e-02f, -2.467883126e-02f, +1.147835334e-01f, +2.950825074e-01f, +3.714169207e-01f, +2.753374981e-01f, +9.246064038e-02f, -3.429148735e-02f, -5.044802238e-02f, -1.130435774e-02f, +1.334657786e-02f, +9.604692963e-03f, +4.077784161e-05f, -1.986858227e-03f, + +4.404280889e-05f, +1.851937276e-05f, -2.226507092e-04f, -3.146287443e-04f, +3.597015317e-04f, +1.297822783e-03f, +5.948759102e-04f, -2.582120611e-03f, -5.662453052e-03f, -4.784649184e-03f, +2.754502848e-04f, +5.083187578e-03f, +5.494930663e-03f, +2.224462527e-03f, -7.757306228e-04f, -1.247037532e-03f, -2.637867523e-04f, +3.325298824e-04f, +1.957865608e-04f, -3.017266954e-05f, + +5.893398952e-04f, +1.371826114e-03f, -3.020029134e-03f, -7.242170304e-03f, +2.847717859e-03f, +1.815954983e-02f, +7.722663433e-03f, -2.383677016e-02f, -2.644183052e-02f, +1.326133097e-02f, +3.720631480e-02f, +7.640922173e-03f, -2.898972479e-02f, -2.038752183e-02f, +1.090578633e-02f, +1.709608413e-02f, +7.460341506e-04f, -7.287295620e-03f, -2.195770381e-03f, +1.986858227e-03f, + -4.404280889e-05f, +3.568439400e-05f, +2.088760710e-04f, -3.477010676e-05f, -5.394258599e-04f, -2.252474774e-04f, +8.374202502e-04f, +8.189824236e-04f, -7.129021976e-04f, -1.385200332e-03f, +9.227396912e-05f, +1.422484159e-03f, +5.602491446e-04f, -9.037910865e-04f, -7.530520433e-04f, +3.054888055e-04f, +5.105611064e-04f, -1.179701523e-05f, -2.028102973e-04f, +3.017266954e-05f, + /* 7,31 (20) */ + -5.452970863e-04f, -2.066243355e-03f, +6.551470878e-04f, +1.058603939e-02f, +1.246025947e-02f, -1.509941716e-02f, -5.259992116e-02f, -2.726095187e-02f, +1.091210803e-01f, +2.902978582e-01f, +3.716923710e-01f, +2.804206857e-01f, +9.795557104e-02f, -3.206702483e-02f, -5.122375300e-02f, -1.255139528e-02f, +1.308279111e-02f, +9.937222845e-03f, +2.365644024e-04f, -2.017030896e-03f, + +4.246420638e-05f, +2.266422450e-05f, -2.137723839e-04f, -3.214273652e-04f, +3.272586910e-04f, +1.282487004e-03f, +6.579391952e-04f, -2.462668262e-03f, -5.610692295e-03f, -4.888817206e-03f, +9.184739889e-05f, +4.988355315e-03f, +5.554816971e-03f, +2.343404695e-03f, -7.182289642e-04f, -1.265534878e-03f, -2.952729392e-04f, +3.273891760e-04f, +2.048103015e-04f, -2.654823367e-05f, + +5.452970863e-04f, +1.407510508e-03f, -2.811153063e-03f, -7.276940410e-03f, +2.308291999e-03f, +1.793430235e-02f, +8.560083684e-03f, -2.301778774e-02f, -2.715473272e-02f, +1.187613064e-02f, +3.729858877e-02f, +9.063406332e-03f, -2.842947565e-02f, -2.129131292e-02f, +1.015273429e-02f, +1.740157293e-02f, +1.256595257e-03f, -7.299092635e-03f, -2.398580678e-03f, +2.017030896e-03f, + -4.246420638e-05f, +2.970926703e-05f, +2.073002217e-04f, -1.884155900e-05f, -5.306655498e-04f, -2.529848066e-04f, +8.103982468e-04f, +8.490965277e-04f, -6.628304558e-04f, -1.400145616e-03f, +3.077706798e-05f, +1.412578692e-03f, +6.119124701e-04f, -8.773782963e-04f, -7.822523602e-04f, +2.797446115e-04f, +5.210311924e-04f, +3.310665577e-06f, -2.052721633e-04f, +2.654823367e-05f, + /* 8, 0 (20) */ + +0.000000000e+00f, -2.162478138e-03f, +2.968830052e-03f, +1.456514462e-02f, +3.864387390e-03f, -4.257150003e-02f, -5.189231134e-02f, +7.569282484e-02f, +2.958850260e-01f, +4.091135842e-01f, +2.958850260e-01f, +7.569282484e-02f, -5.189231134e-02f, -4.257150003e-02f, +3.864387390e-03f, +1.456514462e-02f, +2.968830052e-03f, -2.162478138e-03f, -6.063593551e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.618617492e-07f, -3.306998416e-04f, -2.257582532e-04f, +9.857902663e-04f, +1.500481324e-03f, -1.466026399e-03f, -6.166729441e-03f, -6.400934007e-03f, -1.226244669e-04f, +6.288962822e-03f, +6.273522751e-03f, +1.613571734e-03f, -1.468337442e-03f, -1.029502197e-03f, +2.034068588e-04f, +3.402689242e-04f, +6.472162169e-06f, -5.237349152e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.255434474e-04f, -5.708818371e-03f, -2.108551328e-03f, +1.418929790e-02f, +1.339449588e-02f, -1.745001859e-02f, -2.945354373e-02f, +8.130342331e-03f, +3.732936584e-02f, +8.130342331e-03f, -2.945354373e-02f, -1.745001859e-02f, +1.339449588e-02f, +1.418929790e-02f, -2.108551328e-03f, -5.708818371e-03f, -6.255434474e-04f, +6.470832082e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.212460831e-04f, +1.186460577e-04f, -3.756000324e-04f, -4.540503574e-04f, +5.830089752e-04f, +1.025476853e-03f, -4.527856805e-04f, -1.499376150e-03f, -3.408818562e-05f, +1.490537654e-03f, +5.111716778e-04f, -1.005631891e-03f, -6.194541872e-04f, +4.361168879e-04f, +3.920153858e-04f, -1.097030990e-04f, -1.267209228e-04f, +2.133747723e-05f, +0.000000000e+00f, + /* 8, 1 (20) */ + +0.000000000e+00f, -2.162016276e-03f, +2.638130210e-03f, +1.433938636e-02f, +4.850177656e-03f, -4.107101871e-02f, -5.335833774e-02f, +6.952609540e-02f, +2.894840920e-01f, +4.089909597e-01f, +3.021739889e-01f, +8.196634759e-02f, -5.027873961e-02f, -4.403983748e-02f, +2.834885193e-03f, +1.476855147e-02f, +3.309098976e-03f, -2.156005975e-03f, -6.587328467e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.023736503e-06f, -3.207328672e-04f, -2.467743542e-04f, +9.415487266e-04f, +1.528782666e-03f, -1.320671441e-03f, -6.055179807e-03f, -6.505671737e-03f, -3.677242540e-04f, +6.169849517e-03f, +6.375355250e-03f, +1.763138187e-03f, -1.432296160e-03f, -1.072575305e-03f, +1.797243282e-04f, +3.493988511e-04f, +1.377463820e-05f, -5.420376676e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.042973643e-04f, -5.590172313e-03f, -2.484151361e-03f, +1.373524754e-02f, +1.397750486e-02f, -1.642454174e-02f, -2.990632942e-02f, +6.630966181e-03f, +3.729527765e-02f, +9.620879985e-03f, -2.894237206e-02f, -1.845565048e-02f, +1.277504170e-02f, +1.462541478e-02f, -1.716535943e-03f, -5.818521470e-03f, -7.522643702e-04f, +6.684206855e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.156522294e-04f, +1.269625761e-04f, -3.587843512e-04f, -4.706157560e-04f, +5.459703823e-04f, +1.043026549e-03f, -3.939675859e-04f, -1.505248756e-03f, -1.021939107e-04f, +1.478740802e-03f, +5.689991241e-04f, -9.835082565e-04f, -6.552154762e-04f, +4.168291511e-04f, +4.079788706e-04f, -1.001380708e-04f, -1.320541391e-04f, +1.932808259e-05f, +0.000000000e+00f, + /* 8, 2 (20) */ + +0.000000000e+00f, -2.154992539e-03f, +2.317397343e-03f, +1.409261201e-02f, +5.791726383e-03f, -3.954223604e-02f, -5.467900918e-02f, +6.347091559e-02f, +2.829784203e-01f, +4.086232355e-01f, +3.083438384e-01f, +8.834170284e-02f, -4.851560142e-02f, -4.547213364e-02f, +1.762309887e-03f, +1.494827580e-02f, +3.658497827e-03f, -2.142231337e-03f, -7.129366134e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.321098992e-05f, -3.104088166e-04f, -2.664541626e-04f, +8.968847683e-04f, +1.553301759e-03f, -1.177669827e-03f, -5.939083145e-03f, -6.603095559e-03f, -6.123768384e-04f, +6.043696216e-03f, +6.472027641e-03f, +1.914550414e-03f, -1.392308263e-03f, -1.114898525e-03f, +1.547180591e-04f, +3.580480029e-04f, +2.144061112e-05f, -5.591781592e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.886451349e-04f, -5.463209737e-03f, -2.842935712e-03f, +1.326463178e-02f, +1.452347524e-02f, -1.538151519e-02f, -3.030029700e-02f, +5.125717425e-03f, +3.719308374e-02f, +1.109962079e-02f, -2.837337293e-02f, -1.943915874e-02f, +1.211982622e-02f, +1.504224393e-02f, -1.308557072e-03f, -5.918659541e-03f, -8.843185093e-04f, +6.877487681e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.099615968e-04f, +1.346501531e-04f, -3.416197214e-04f, -4.858028393e-04f, +5.084290207e-04f, +1.058269733e-03f, -3.348439216e-04f, -1.508154461e-03f, -1.700878596e-04f, +1.463999657e-03f, +6.261419350e-04f, -9.591278986e-04f, -6.902025932e-04f, +3.962045354e-04f, +4.234389215e-04f, -8.995724925e-05f, -1.372228099e-04f, +1.710004392e-05f, +0.000000000e+00f, + /* 8, 3 (20) */ + +0.000000000e+00f, -2.141781549e-03f, +2.006988527e-03f, +1.382615785e-02f, +6.688611151e-03f, -3.798893429e-02f, -5.585667901e-02f, +5.753183244e-02f, +2.763753247e-01f, +4.080108587e-01f, +3.143875346e-01f, +9.481373048e-02f, -4.660105101e-02f, -4.686444190e-02f, +6.474113621e-04f, +1.510299386e-02f, +4.016545830e-03f, -2.120790726e-03f, -7.688544293e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.902233903e-05f, -2.997679676e-04f, -2.847997507e-04f, +8.519033891e-04f, +1.574104112e-03f, -1.037178045e-03f, -5.818653167e-03f, -6.693135983e-03f, -8.562848755e-04f, +5.910615717e-03f, +6.563346201e-03f, +2.067627203e-03f, -1.348330372e-03f, -1.156359128e-03f, +1.283987668e-04f, +3.661745017e-04f, +2.946383688e-05f, -5.750269101e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.786835381e-04f, -5.328559584e-03f, -3.184555433e-03f, +1.277882894e-02f, +1.503190426e-02f, -1.432324546e-02f, -3.063514092e-02f, +3.617562964e-03f, +3.702299588e-02f, +1.256362044e-02f, -2.774723100e-02f, -2.039828664e-02f, +1.142962363e-02f, +1.543844847e-02f, -8.851181504e-04f, -6.008616790e-03f, -1.021541319e-03f, +7.048488120e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.041959854e-04f, +1.417081185e-04f, -3.241572278e-04f, -4.996048872e-04f, +4.704753514e-04f, +1.071200476e-03f, -2.755409949e-04f, -1.508098759e-03f, -2.376293875e-04f, +1.446334796e-03f, +6.824746924e-04f, -9.325181251e-04f, -7.243258077e-04f, +3.742640308e-04f, +4.383440878e-04f, -7.916884454e-05f, -1.422037663e-04f, +1.465200696e-05f, +0.000000000e+00f, + /* 8, 4 (20) */ + +0.000000000e+00f, -2.122759210e-03f, +1.707220559e-03f, +1.354135809e-02f, +7.540514540e-03f, -3.641483017e-02f, -5.689385706e-02f, +5.171317928e-02f, +2.696821888e-01f, +4.071545738e-01f, +3.202981503e-01f, +1.013770767e-01f, -4.453342381e-02f, -4.821277227e-02f, -5.089477662e-04f, +1.523139263e-02f, +4.382720332e-03f, -2.091326889e-03f, -8.263571204e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.445765210e-05f, -2.888499750e-04f, -3.018161692e-04f, +8.067072348e-04f, +1.591260231e-03f, -8.993459211e-04f, -5.694107605e-03f, -6.775734534e-03f, -1.099152205e-03f, +5.770731354e-03f, +6.649123146e-03f, +2.222181709e-03f, -1.300325148e-03f, -1.196842908e-03f, +1.007805544e-04f, +3.737363107e-04f, +3.783675462e-05f, -5.894531858e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.744875527e-04f, -5.186851466e-03f, -3.508712661e-03f, +1.227922406e-02f, +1.550237961e-02f, -1.325204498e-02f, -3.091068192e-02f, +2.109464205e-03f, +3.678536650e-02f, +1.400995524e-02f, -2.706475631e-02f, -2.133080476e-02f, +1.070529782e-02f, +1.581271250e-02f, -4.467740626e-04f, -6.087785635e-03f, -1.163745085e-03f, +7.195008189e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.837670411e-05f, +1.481375893e-04f, -3.064475298e-04f, -5.120186609e-04f, +4.321994666e-04f, +1.081818129e-03f, -2.161846012e-04f, -1.505093613e-03f, -3.046786581e-04f, +1.425773284e-03f, +7.378729408e-04f, -9.037115885e-04f, -7.574961350e-04f, +3.510322360e-04f, +4.526431748e-04f, -6.778302618e-05f, -1.469736598e-04f, +1.198340192e-05f, +0.000000000e+00f, + /* 8, 5 (20) */ + +0.000000000e+00f, -2.098301558e-03f, +1.418370584e-03f, +1.323954193e-02f, +8.347221775e-03f, -3.482356994e-02f, -5.779320298e-02f, +4.601907167e-02f, +2.629064542e-01f, +4.060554216e-01f, +3.260688817e-01f, +1.080261998e-01f, -4.231124210e-02f, -4.951309742e-02f, -1.705790674e-03f, +1.533217318e-02f, +4.756456642e-03f, -2.053490135e-03f, -8.853024389e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.951790863e-05f, -2.776937890e-04f, -3.175113510e-04f, +7.613964480e-04f, +1.604845391e-03f, -7.643164645e-04f, -5.565667816e-03f, -6.850843792e-03f, -1.340684321e-03f, +5.624176851e-03f, +6.729177001e-03f, +2.378021695e-03f, -1.248261464e-03f, -1.236234382e-03f, +7.188097839e-05f, +3.806913382e-04f, +4.655046160e-05f, -6.023253879e-05f, +0.000000000e+00f, + +0.000000000e+00f, -7.611084864e-05f, -5.038713876e-03f, -3.815160191e-03f, +1.176720539e-02f, +1.593457908e-02f, -1.217022685e-02f, -3.112686652e-02f, +6.043705926e-04f, +3.648068784e-02f, +1.543572852e-02f, -2.632688336e-02f, -2.223451635e-02f, +9.947801685e-03f, +1.616374474e-02f, +5.869112213e-06f, -6.155568661e-03f, -1.310718745e-03f, +7.314842209e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.252451654e-05f, +1.539414209e-04f, -2.885407354e-04f, -5.230443508e-04f, +3.936908756e-04f, +1.090127269e-03f, -1.568997351e-04f, -1.499157406e-03f, -3.710969634e-04f, +1.402348631e-03f, +7.922134833e-04f, -8.727462592e-04f, -7.896255635e-04f, +3.265373564e-04f, +4.662853874e-04f, -5.581194207e-05f, -1.515090324e-04f, +9.094470904e-06f, +0.000000000e+00f, + /* 8, 6 (20) */ + +0.000000000e+00f, -2.068783650e-03f, +1.140676795e-03f, +1.292203057e-02f, +9.108618223e-03f, -3.321872455e-02f, -5.855751944e-02f, +4.045340386e-02f, +2.560556104e-01f, +4.047147373e-01f, +3.316930585e-01f, +1.147553768e-01f, -3.993322040e-02f, -5.076135888e-02f, -2.942025056e-03f, +1.540405416e-02f, +5.137147981e-03f, -2.006939673e-03f, -9.455349777e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.420515739e-05f, -2.663375779e-04f, -3.318960101e-04f, +7.160685252e-04f, +1.614939401e-03f, -6.322257162e-04f, -5.433558380e-03f, -6.918427409e-03f, -1.580588841e-03f, +5.471096141e-03f, +6.803332954e-03f, +2.534949799e-03f, -1.192114586e-03f, -1.274416991e-03f, +4.172110693e-05f, +3.869975437e-04f, +5.559469128e-05f, -6.135114594e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.641366791e-05f, -4.884772455e-03f, -4.103700926e-03f, +1.124416104e-02f, +1.632826996e-02f, -1.108009958e-02f, -3.128376625e-02f, -8.947868130e-04f, +3.610959088e-02f, +1.683807716e-02f, -2.553466988e-02f, -2.310726261e-02f, +9.158176121e-03f, +1.649028209e-02f, +4.721544996e-04f, -6.211380603e-03f, -1.462227778e-03f, +7.405786918e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.665959027e-05f, +1.591241558e-04f, -2.704862783e-04f, -5.326855166e-04f, +3.550382947e-04f, +1.096137638e-03f, -9.781030550e-05f, -1.490314875e-03f, -4.367470415e-04f, +1.376100729e-03f, +8.453746769e-04f, -8.396653856e-04f, -8.206272825e-04f, +3.008111924e-04f, +4.792204753e-04f, -4.326973245e-05f, -1.557863887e-04f, +5.986293400e-06f, +0.000000000e+00f, + /* 8, 7 (20) */ + +0.000000000e+00f, -2.034578492e-03f, +8.743392170e-04f, +1.259013456e-02f, +9.824686748e-03f, -3.160378515e-02f, -5.918974516e-02f, +3.501984548e-02f, +2.491371830e-01f, +4.031341484e-01f, +3.371641547e-01f, +1.215587098e-01f, -3.739827060e-02f, -5.195347347e-02f, -4.216442048e-03f, +1.544577527e-02f, +5.524145524e-03f, -1.951344982e-03f, -1.006886124e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.852247275e-05f, -2.548186554e-04f, -3.449835367e-04f, +6.708181825e-04f, +1.621626369e-03f, -5.032026181e-04f, -5.298006690e-03f, -6.978460109e-03f, -1.818575967e-03f, +5.311643185e-03f, +6.871423201e-03f, +2.692763799e-03f, -1.131866336e-03f, -1.311273318e-03f, +1.032557166e-05f, +3.926130473e-04f, +6.495779442e-05f, -6.228793068e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.030732582e-04f, -4.725648300e-03f, -4.374187205e-03f, +1.071147553e-02f, +1.668330825e-02f, -9.983961945e-03f, -3.138157656e-02f, -2.385101688e-03f, +3.567284383e-02f, +1.821417788e-02f, -2.468929520e-02f, -2.394692800e-02f, +8.337548839e-03f, +1.679109329e-02f, +9.513749750e-04f, -6.254650335e-03f, -1.618014166e-03f, +7.465649852e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.080144936e-05f, +1.636919669e-04f, -2.523327995e-04f, -5.409490196e-04f, +3.163294421e-04f, +1.099864065e-03f, -3.903885532e-05f, -1.478597032e-03f, -5.014933909e-04f, +1.347075783e-03f, +8.972367241e-04f, -8.045174409e-04f, -8.504159104e-04f, +2.738891182e-04f, +4.913988792e-04f, -3.017253819e-05f, -1.597822697e-04f, +2.660809337e-06f, +0.000000000e+00f, + /* 8, 8 (20) */ + +0.000000000e+00f, -1.996056020e-03f, +6.195205617e-04f, +1.224515103e-02f, +1.049550493e-02f, -2.998215878e-02f, -5.969294778e-02f, +2.972183879e-02f, +2.421587229e-01f, +4.013155724e-01f, +3.424757978e-01f, +1.284301330e-01f, -3.470550680e-02f, -5.308533981e-02f, -5.527715365e-03f, +1.545610084e-02f, +5.916758572e-03f, -1.886387187e-03f, -1.069174054e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.247390942e-05f, -2.431734112e-04f, -3.567898892e-04f, +6.257372305e-04f, +1.624994456e-03f, -3.773688956e-04f, -5.159242554e-03f, -7.030927663e-03f, -2.054358946e-03f, +5.145981756e-03f, +6.933287283e-03f, +2.851256896e-03f, -1.067505246e-03f, -1.346685295e-03f, -2.227738715e-05f, +3.974962422e-04f, +7.462672369e-05f, -6.302972345e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.838747075e-04f, -4.561956333e-03f, -4.626520004e-03f, +1.017052651e-02f, +1.699963769e-02f, -8.884097880e-03f, -3.142061541e-02f, -3.863698720e-03f, +3.517135044e-02f, +1.956125367e-02f, -2.379205848e-02f, -2.475144544e-02f, +7.487132928e-03f, +1.706498240e-02f, +1.442773854e-03f, -6.284822874e-03f, -1.777796436e-03f, +7.492257945e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.496893016e-05f, +1.676525981e-04f, -2.341280336e-04f, -5.478449469e-04f, +2.776508377e-04f, +1.101326377e-03f, +1.929371400e-05f, -1.464041066e-03f, -5.652025795e-04f, +1.315326220e-03f, +9.476819635e-04f, -7.673560558e-04f, -8.789077206e-04f, +2.458100504e-04f, +5.027718777e-04f, -1.653850333e-05f, -1.634733292e-04f, -8.791601960e-07f, +0.000000000e+00f, + /* 8, 9 (20) */ + +0.000000000e+00f, -1.953582110e-03f, +3.763471504e-04f, +1.188836114e-02f, +1.112124216e-02f, -2.835716432e-02f, -6.007031667e-02f, +2.456259623e-02f, +2.351277952e-01f, +3.992612135e-01f, +3.476217796e-01f, +1.353634203e-01f, -3.185424991e-02f, -5.415284505e-02f, -6.874400660e-03f, +1.543382345e-02f, +6.314254814e-03f, -1.811760464e-03f, -1.132203778e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.606445578e-05f, -2.314372474e-04f, -3.673334824e-04f, +5.809144570e-04f, +1.625135633e-03f, -2.548389554e-04f, -5.017497786e-03f, -7.075826854e-03f, -2.287654524e-03f, +4.974285215e-03f, +6.988772415e-03f, +3.010218017e-03f, -9.990266999e-04f, -1.380534433e-03f, -5.605588272e-05f, +4.016059088e-04f, +8.458702163e-05f, -6.356343946e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.588436377e-04f, -4.394303735e-03f, -4.860648038e-03f, +9.622681561e-03f, +1.727728853e-02f, -7.782771502e-03f, -3.140132170e-02f, -5.327739786e-03f, +3.460614786e-02f, +2.087657989e-02f, -2.284437652e-02f, -2.551880149e-02f, +6.608225208e-03f, +1.731079245e-02f, +1.945545732e-03f, -6.301361377e-03f, -1.941269765e-03f, +7.483466343e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.918014043e-05f, +1.710153017e-04f, -2.159186992e-04f, -5.533865287e-04f, +2.390876085e-04f, +1.100549303e-03f, +7.706841200e-05f, -1.446690235e-03f, -6.277435499e-04f, +1.280910578e-03f, +9.965951551e-04f, -7.282399390e-04f, -9.060208672e-04f, +2.166164074e-04f, +5.132917351e-04f, -2.387771828e-06f, -1.668364102e-04f, -4.629894786e-06f, +0.000000000e+00f, + /* 8,10 (20) */ + +0.000000000e+00f, -1.907517654e-03f, +1.449099031e-04f, +1.152102766e-02f, +1.170215662e-02f, -2.673202869e-02f, -6.032515563e-02f, +1.954509845e-02f, +2.280519684e-01f, +3.969735590e-01f, +3.525960648e-01f, +1.423521927e-01f, -2.884403189e-02f, -5.515187175e-02f, -8.254935092e-03f, +1.537776757e-02f, +6.715860723e-03f, -1.727173442e-03f, -1.195767217e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.929998603e-05f, -2.196445174e-04f, -3.766350731e-04f, +5.364355200e-04f, +1.622145428e-03f, -1.357197978e-04f, -4.873005799e-03f, -7.113165414e-03f, -2.518183389e-03f, +4.796736271e-03f, +7.037733797e-03f, +3.169432113e-03f, -9.264330694e-04f, -1.412702048e-03f, -9.097435133e-05f, +4.049013318e-04f, +9.482281232e-05f, -6.387612474e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.280237781e-04f, -4.223288433e-03f, -5.076566737e-03f, +9.069295032e-03f, +1.751637614e-02f, -6.682222200e-03f, -3.132425329e-02f, -6.774430021e-03f, +3.397840431e-02f, +2.215749047e-02f, -2.184778136e-02f, -2.624704143e-02f, +5.702204340e-03f, +1.752740886e-02f, +2.458837467e-03f, -6.303749149e-03f, -2.108106175e-03f, +7.437167395e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.345242192e-05f, +1.737907723e-04f, -1.977503951e-04f, -5.575900484e-04f, +2.007232999e-04f, +1.097562356e-03f, +1.341684222e-04f, -1.426593742e-03f, -6.889879173e-04f, +1.243893395e-03f, +1.043863763e-03f, -6.872327832e-04f, -9.316756075e-04f, +1.863540588e-04f, +5.229118486e-04f, +1.225752168e-05f, -1.698486244e-04f, -8.586759214e-06f, +0.000000000e+00f, + /* 8,11 (20) */ + +0.000000000e+00f, -1.858217668e-03f, -7.473461437e-05f, +1.114439258e-02f, +1.223859214e-02f, -2.510988326e-02f, -6.046087543e-02f, +1.467209265e-02f, +2.209388030e-01f, +3.944553756e-01f, +3.573928011e-01f, +1.493899265e-01f, -2.567459978e-02f, -5.607830482e-02f, -9.667637140e-03f, +1.528679322e-02f, +7.120762054e-03f, -1.632350630e-03f, -1.259643342e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.218721123e-05f, -2.078284716e-04f, -3.847176435e-04f, +4.923828488e-04f, +1.616122678e-03f, -2.011094541e-05f, -4.726001200e-03f, -7.142961946e-03f, -2.745670614e-03f, +4.613526711e-03f, +7.080034920e-03f, +3.328680481e-03f, -8.497338328e-04f, -1.443069493e-03f, -1.269935294e-04f, +4.073424191e-04f, +1.053167967e-04f, -6.395500345e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.914762000e-04f, -4.049497661e-03f, -5.274317132e-03f, +8.511704983e-03f, +1.771709944e-02f, -5.584659843e-03f, -3.119008487e-02f, -8.201023763e-03f, +3.328941640e-02f, +2.340138386e-02f, -2.080391760e-02f, -2.693427421e-02f, +4.770528733e-03f, +1.771376292e-02f, +2.981749316e-03f, -6.291491627e-03f, -2.277954800e-03f, +7.351299803e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.780231643e-05f, +1.759910779e-04f, -1.796675011e-04f, -5.604747465e-04f, +1.626396944e-04f, +1.092399722e-03f, +1.904793584e-04f, -1.403806598e-03f, -7.488102621e-04f, +1.204345068e-03f, +1.089378230e-03f, -6.444031594e-04f, -9.557945223e-04f, +1.550722645e-04f, +5.315868954e-04f, +2.737326717e-05f, -1.724874317e-04f, -1.274419075e-05f, +0.000000000e+00f, + /* 8,12 (20) */ + +0.000000000e+00f, -1.806030457e-03f, -2.825630860e-04f, +1.075967494e-02f, +1.273097499e-02f, -2.349376059e-02f, -6.048098637e-02f, +9.946091448e-03f, +2.137958410e-01f, +3.917097050e-01f, +3.620063278e-01f, +1.564699614e-01f, -2.234591930e-02f, -5.692803865e-02f, -1.111070663e-02f, +1.515979969e-02f, +7.528104474e-03f, -1.527033833e-03f, -1.323598345e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.473362948e-05f, -1.960212053e-04f, -3.916062816e-04f, +4.488355540e-04f, +1.607169272e-03f, +9.189561518e-05f, -4.576719389e-03f, -7.165245829e-03f, -2.969846086e-03f, +4.424857132e-03f, +7.115547851e-03f, +3.487741094e-03f, -7.689456846e-04f, -1.471518397e-03f, -1.640704385e-04f, +4.088898222e-04f, +1.160502517e-04f, -6.378752610e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.492785165e-04f, -3.873506583e-03f, -5.453984633e-03f, +7.951230237e-03f, +1.787973913e-02f, -4.492260122e-03f, -3.099960551e-02f, -9.604830361e-03f, +3.254060613e-02f, +2.460572893e-02f, -1.971453937e-02f, -2.757867737e-02f, +3.814734211e-03f, +1.786883518e-02f, +3.513336211e-03f, -6.264118360e-03f, -2.450442232e-03f, +7.223857896e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.224553531e-05f, +1.776295889e-04f, -1.617130840e-04f, -5.620627177e-04f, +1.249166356e-04f, +1.085100116e-03f, +2.458895125e-04f, -1.378389468e-03f, -8.070884138e-04f, +1.162341705e-03f, +1.133032251e-03f, -5.998243967e-04f, -9.783027328e-04f, +1.228236045e-04f, +5.392729787e-04f, +4.293340064e-05f, -1.747307205e-04f, -1.709568934e-05f, +0.000000000e+00f, + /* 8,13 (20) */ + +0.000000000e+00f, -1.751296828e-03f, -4.785842912e-04f, +1.036806866e-02f, +1.317981054e-02f, -2.188659131e-02f, -6.038909076e-02f, +5.369372059e-03f, +2.066305952e-01f, +3.887398589e-01f, +3.664311849e-01f, +1.635855092e-01f, -1.885817820e-02f, -5.769698434e-02f, -1.258222503e-02f, +1.499572925e-02f, +7.936994296e-03f, -1.410983581e-03f, -1.387385872e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.694747535e-05f, -1.842536125e-04f, -3.973280606e-04f, +4.058693476e-04f, +1.595389896e-03f, +2.002154750e-04f, -4.425396158e-03f, -7.180057102e-03f, -3.190444929e-03f, +4.230936643e-03f, +7.144153518e-03f, +3.646388934e-03f, -6.840926323e-04f, -1.497930904e-03f, -2.021583781e-04f, +4.095050584e-04f, +1.270030335e-04f, -6.336141875e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.015240518e-04f, -3.695876994e-03f, -5.615697717e-03f, +7.389167519e-03f, +1.800465577e-02f, -3.407160005e-03f, -3.075371600e-02f, -1.098321983e-02f, +3.173351772e-02f, +2.576807063e-02f, -1.858150712e-02f, -2.817850177e-02f, +2.836431478e-03f, +1.799165879e-02f, +4.052609190e-03f, -6.221184959e-03f, -2.625172952e-03f, +7.052901002e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.679693256e-05f, +1.787209045e-04f, -1.439288099e-04f, -5.623788026e-04f, +8.763186081e-05f, +1.075706652e-03f, +3.002900951e-04f, -1.350408511e-03f, -8.637037285e-04f, +1.117964965e-03f, +1.174723035e-03f, -5.535744514e-04f, -9.991281130e-04f, +8.966389948e-05f, +5.459277726e-04f, +5.890993161e-05f, -1.765568897e-04f, -2.163381083e-05f, +0.000000000e+00f, + /* 8,14 (20) */ + +0.000000000e+00f, -1.694349352e-03f, -6.628379037e-04f, +9.970740597e-03f, +1.358567989e-02f, -2.029120142e-02f, -6.018887528e-02f, +9.439759012e-04f, +1.994505381e-01f, +3.855494140e-01f, +3.706621216e-01f, +1.707296628e-01f, -1.521178927e-02f, -5.838107697e-02f, -1.408015593e-02f, +1.479357087e-02f, +8.346499354e-03f, -1.283980548e-03f, -1.450747290e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.883766883e-05f, -1.725553440e-04f, -4.019119162e-04f, +3.635564707e-04f, +1.580891775e-03f, +3.047718303e-04f, -4.272267288e-03f, -7.187446327e-03f, -3.407207915e-03f, +4.031982553e-03f, +7.165741964e-03f, +3.804396343e-03f, -5.952060805e-04f, -1.522189921e-03f, -2.412069273e-04f, +4.091506342e-04f, +1.381535847e-04f, -6.266473295e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.483209843e-04f, -3.517156089e-03f, -5.759626527e-03f, +6.826788717e-03f, +1.809228763e-02f, -2.331453353e-03f, -3.045342590e-02f, -1.233362834e-02f, +3.086981399e-02f, +2.688603560e-02f, -1.740678408e-02f, -2.873207622e-02f, +1.837303365e-03f, +1.808132269e-02f, +4.598536962e-03f, -6.162275028e-03f, -2.801729842e-03f, +6.836562894e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.147048134e-05f, +1.792807772e-04f, -1.263548615e-04f, -5.614504733e-04f, +5.086084095e-05f, +1.064266684e-03f, +3.535754669e-04f, -1.319935200e-03f, -9.185413560e-04f, +1.071301879e-03f, +1.214351565e-03f, -5.057357615e-04f, -1.018201499e-03f, +5.565212027e-05f, +5.515106656e-04f, +7.527297698e-05f, -1.779449298e-04f, -2.635016326e-05f, +0.000000000e+00f, + /* 8,15 (20) */ + +0.000000000e+00f, -1.635511683e-03f, -8.353932478e-04f, +9.568828681e-03f, +1.394923636e-02f, -1.871030964e-02f, -5.988410345e-02f, -3.328291387e-03f, +1.922630918e-01f, +3.821422060e-01f, +3.746941041e-01f, +1.778954047e-01f, -1.140739292e-02f, -5.897628305e-02f, -1.560234585e-02f, +1.455236395e-02f, +8.755649988e-03f, -1.145826963e-03f, -1.513412023e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.041376381e-05f, -1.609547698e-04f, -4.053885229e-04f, +3.219656320e-04f, +1.563784421e-03f, +4.054954957e-04f, -4.117568163e-03f, -7.187474445e-03f, -3.619881868e-03f, +3.828220052e-03f, +7.180212602e-03f, +3.961533375e-03f, -5.023249021e-04f, -1.544179367e-03f, -2.811619537e-04f, +4.077901696e-04f, +1.494789456e-04f, -6.168589636e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.897914657e-04f, -3.337875312e-03f, -5.885981388e-03f, +6.265338243e-03f, +1.814314847e-02f, -1.267186669e-03f, -3.009985043e-02f, -1.365356354e-02f, +2.995127264e-02f, +2.795733748e-02f, -1.619243252e-02f, -2.923781198e-02f, +8.191018661e-04f, +1.813697481e-02f, +5.150047628e-03f, -6.087002051e-03f, -2.979674772e-03f, +6.573061261e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.627925413e-05f, +1.793260355e-04f, -1.090298612e-04f, -5.593077148e-04f, +1.467662789e-05f, +1.050831646e-03f, +4.056433600e-04f, -1.287046136e-03f, -9.714904984e-04f, +1.022444659e-03f, +1.251822843e-03f, -4.563950908e-04f, -1.035456889e-03f, +2.085028936e-05f, +5.559829007e-04f, +9.199080094e-05f, -1.788745052e-04f, -3.123540632e-05f, +0.000000000e+00f, + /* 8,16 (20) */ + +0.000000000e+00f, -1.575097920e-03f, -9.963480176e-04f, +9.163440158e-03f, +1.427120199e-02f, -1.714652522e-02f, -5.947860795e-02f, -7.445859550e-03f, +1.850756173e-01f, +3.785223242e-01f, +3.785223242e-01f, +1.850756173e-01f, -7.445859550e-03f, -5.947860795e-02f, -1.714652522e-02f, +1.427120199e-02f, +9.163440158e-03f, -9.963480176e-04f, -1.575097920e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.168589636e-05f, -1.494789456e-04f, -4.077901696e-04f, +2.811619537e-04f, +1.544179367e-03f, +5.023249021e-04f, -3.961533375e-03f, -7.180212602e-03f, -3.828220052e-03f, +3.619881868e-03f, +7.187474445e-03f, +4.117568163e-03f, -4.054954957e-04f, -1.563784421e-03f, -3.219656320e-04f, +4.053885229e-04f, +1.609547698e-04f, -6.041376381e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.260707198e-04f, -3.158549277e-03f, -5.995011250e-03f, +5.706030529e-03f, +1.815782510e-02f, -2.163550230e-04f, -2.969420707e-02f, -1.494060968e-02f, +2.897978214e-02f, +2.897978214e-02f, -1.494060968e-02f, -2.969420707e-02f, -2.163550230e-04f, +1.815782510e-02f, +5.706030529e-03f, -5.995011250e-03f, -3.158549277e-03f, +6.260707198e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.123540632e-05f, +1.788745052e-04f, -9.199080094e-05f, -5.559829007e-04f, -2.085028936e-05f, +1.035456889e-03f, +4.563950908e-04f, -1.251822843e-03f, -1.022444659e-03f, +9.714904984e-04f, +1.287046136e-03f, -4.056433600e-04f, -1.050831646e-03f, -1.467662789e-05f, +5.593077148e-04f, +1.090298612e-04f, -1.793260355e-04f, -3.627925413e-05f, +0.000000000e+00f, + /* 8,17 (20) */ + +0.000000000e+00f, -1.513412023e-03f, -1.145826963e-03f, +8.755649988e-03f, +1.455236395e-02f, -1.560234585e-02f, -5.897628305e-02f, -1.140739292e-02f, +1.778954047e-01f, +3.746941041e-01f, +3.821422060e-01f, +1.922630918e-01f, -3.328291387e-03f, -5.988410345e-02f, -1.871030964e-02f, +1.394923636e-02f, +9.568828681e-03f, -8.353932478e-04f, -1.635511683e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.266473295e-05f, -1.381535847e-04f, -4.091506342e-04f, +2.412069273e-04f, +1.522189921e-03f, +5.952060805e-04f, -3.804396343e-03f, -7.165741964e-03f, -4.031982553e-03f, +3.407207915e-03f, +7.187446327e-03f, +4.272267288e-03f, -3.047718303e-04f, -1.580891775e-03f, -3.635564707e-04f, +4.019119162e-04f, +1.725553440e-04f, -5.883766883e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.573061261e-04f, -2.979674772e-03f, -6.087002051e-03f, +5.150047628e-03f, +1.813697481e-02f, +8.191018661e-04f, -2.923781198e-02f, -1.619243252e-02f, +2.795733748e-02f, +2.995127264e-02f, -1.365356354e-02f, -3.009985043e-02f, -1.267186669e-03f, +1.814314847e-02f, +6.265338243e-03f, -5.885981388e-03f, -3.337875312e-03f, +5.897914657e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.635016326e-05f, +1.779449298e-04f, -7.527297698e-05f, -5.515106656e-04f, -5.565212027e-05f, +1.018201499e-03f, +5.057357615e-04f, -1.214351565e-03f, -1.071301879e-03f, +9.185413560e-04f, +1.319935200e-03f, -3.535754669e-04f, -1.064266684e-03f, -5.086084095e-05f, +5.614504733e-04f, +1.263548615e-04f, -1.792807772e-04f, -4.147048134e-05f, +0.000000000e+00f, + /* 8,18 (20) */ + +0.000000000e+00f, -1.450747290e-03f, -1.283980548e-03f, +8.346499354e-03f, +1.479357087e-02f, -1.408015593e-02f, -5.838107697e-02f, -1.521178927e-02f, +1.707296628e-01f, +3.706621216e-01f, +3.855494140e-01f, +1.994505381e-01f, +9.439759012e-04f, -6.018887528e-02f, -2.029120142e-02f, +1.358567989e-02f, +9.970740597e-03f, -6.628379037e-04f, -1.694349352e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.336141875e-05f, -1.270030335e-04f, -4.095050584e-04f, +2.021583781e-04f, +1.497930904e-03f, +6.840926323e-04f, -3.646388934e-03f, -7.144153518e-03f, -4.230936643e-03f, +3.190444929e-03f, +7.180057102e-03f, +4.425396158e-03f, -2.002154750e-04f, -1.595389896e-03f, -4.058693476e-04f, +3.973280606e-04f, +1.842536125e-04f, -5.694747535e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.836562894e-04f, -2.801729842e-03f, -6.162275028e-03f, +4.598536962e-03f, +1.808132269e-02f, +1.837303365e-03f, -2.873207622e-02f, -1.740678408e-02f, +2.688603560e-02f, +3.086981399e-02f, -1.233362834e-02f, -3.045342590e-02f, -2.331453353e-03f, +1.809228763e-02f, +6.826788717e-03f, -5.759626527e-03f, -3.517156089e-03f, +5.483209843e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.163381083e-05f, +1.765568897e-04f, -5.890993161e-05f, -5.459277726e-04f, -8.966389948e-05f, +9.991281130e-04f, +5.535744514e-04f, -1.174723035e-03f, -1.117964965e-03f, +8.637037285e-04f, +1.350408511e-03f, -3.002900951e-04f, -1.075706652e-03f, -8.763186081e-05f, +5.623788026e-04f, +1.439288099e-04f, -1.787209045e-04f, -4.679693256e-05f, +0.000000000e+00f, + /* 8,19 (20) */ + +0.000000000e+00f, -1.387385872e-03f, -1.410983581e-03f, +7.936994296e-03f, +1.499572925e-02f, -1.258222503e-02f, -5.769698434e-02f, -1.885817820e-02f, +1.635855092e-01f, +3.664311849e-01f, +3.887398589e-01f, +2.066305952e-01f, +5.369372059e-03f, -6.038909076e-02f, -2.188659131e-02f, +1.317981054e-02f, +1.036806866e-02f, -4.785842912e-04f, -1.751296828e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.378752610e-05f, -1.160502517e-04f, -4.088898222e-04f, +1.640704385e-04f, +1.471518397e-03f, +7.689456846e-04f, -3.487741094e-03f, -7.115547851e-03f, -4.424857132e-03f, +2.969846086e-03f, +7.165245829e-03f, +4.576719389e-03f, -9.189561518e-05f, -1.607169272e-03f, -4.488355540e-04f, +3.916062816e-04f, +1.960212053e-04f, -5.473362948e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.052901002e-04f, -2.625172952e-03f, -6.221184959e-03f, +4.052609190e-03f, +1.799165879e-02f, +2.836431478e-03f, -2.817850177e-02f, -1.858150712e-02f, +2.576807063e-02f, +3.173351772e-02f, -1.098321983e-02f, -3.075371600e-02f, -3.407160005e-03f, +1.800465577e-02f, +7.389167519e-03f, -5.615697717e-03f, -3.695876994e-03f, +5.015240518e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.709568934e-05f, +1.747307205e-04f, -4.293340064e-05f, -5.392729787e-04f, -1.228236045e-04f, +9.783027328e-04f, +5.998243967e-04f, -1.133032251e-03f, -1.162341705e-03f, +8.070884138e-04f, +1.378389468e-03f, -2.458895125e-04f, -1.085100116e-03f, -1.249166356e-04f, +5.620627177e-04f, +1.617130840e-04f, -1.776295889e-04f, -5.224553531e-05f, +0.000000000e+00f, + /* 8,20 (20) */ + +0.000000000e+00f, -1.323598345e-03f, -1.527033833e-03f, +7.528104474e-03f, +1.515979969e-02f, -1.111070663e-02f, -5.692803865e-02f, -2.234591930e-02f, +1.564699614e-01f, +3.620063278e-01f, +3.917097050e-01f, +2.137958410e-01f, +9.946091448e-03f, -6.048098637e-02f, -2.349376059e-02f, +1.273097499e-02f, +1.075967494e-02f, -2.825630860e-04f, -1.806030457e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.395500345e-05f, -1.053167967e-04f, -4.073424191e-04f, +1.269935294e-04f, +1.443069493e-03f, +8.497338328e-04f, -3.328680481e-03f, -7.080034920e-03f, -4.613526711e-03f, +2.745670614e-03f, +7.142961946e-03f, +4.726001200e-03f, +2.011094541e-05f, -1.616122678e-03f, -4.923828488e-04f, +3.847176435e-04f, +2.078284716e-04f, -5.218721123e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.223857896e-04f, -2.450442232e-03f, -6.264118360e-03f, +3.513336211e-03f, +1.786883518e-02f, +3.814734211e-03f, -2.757867737e-02f, -1.971453937e-02f, +2.460572893e-02f, +3.254060613e-02f, -9.604830361e-03f, -3.099960551e-02f, -4.492260122e-03f, +1.787973913e-02f, +7.951230237e-03f, -5.453984633e-03f, -3.873506583e-03f, +4.492785165e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.274419075e-05f, +1.724874317e-04f, -2.737326717e-05f, -5.315868954e-04f, -1.550722645e-04f, +9.557945223e-04f, +6.444031594e-04f, -1.089378230e-03f, -1.204345068e-03f, +7.488102621e-04f, +1.403806598e-03f, -1.904793584e-04f, -1.092399722e-03f, -1.626396944e-04f, +5.604747465e-04f, +1.796675011e-04f, -1.759910779e-04f, -5.780231643e-05f, +0.000000000e+00f, + /* 8,21 (20) */ + +0.000000000e+00f, -1.259643342e-03f, -1.632350630e-03f, +7.120762054e-03f, +1.528679322e-02f, -9.667637140e-03f, -5.607830482e-02f, -2.567459978e-02f, +1.493899265e-01f, +3.573928011e-01f, +3.944553756e-01f, +2.209388030e-01f, +1.467209265e-02f, -6.046087543e-02f, -2.510988326e-02f, +1.223859214e-02f, +1.114439258e-02f, -7.473461437e-05f, -1.858217668e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.387612474e-05f, -9.482281232e-05f, -4.049013318e-04f, +9.097435133e-05f, +1.412702048e-03f, +9.264330694e-04f, -3.169432113e-03f, -7.037733797e-03f, -4.796736271e-03f, +2.518183389e-03f, +7.113165414e-03f, +4.873005799e-03f, +1.357197978e-04f, -1.622145428e-03f, -5.364355200e-04f, +3.766350731e-04f, +2.196445174e-04f, -4.929998603e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.351299803e-04f, -2.277954800e-03f, -6.291491627e-03f, +2.981749316e-03f, +1.771376292e-02f, +4.770528733e-03f, -2.693427421e-02f, -2.080391760e-02f, +2.340138386e-02f, +3.328941640e-02f, -8.201023763e-03f, -3.119008487e-02f, -5.584659843e-03f, +1.771709944e-02f, +8.511704983e-03f, -5.274317132e-03f, -4.049497661e-03f, +3.914762000e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.586759214e-06f, +1.698486244e-04f, -1.225752168e-05f, -5.229118486e-04f, -1.863540588e-04f, +9.316756075e-04f, +6.872327832e-04f, -1.043863763e-03f, -1.243893395e-03f, +6.889879173e-04f, +1.426593742e-03f, -1.341684222e-04f, -1.097562356e-03f, -2.007232999e-04f, +5.575900484e-04f, +1.977503951e-04f, -1.737907723e-04f, -6.345242192e-05f, +0.000000000e+00f, + /* 8,22 (20) */ + +0.000000000e+00f, -1.195767217e-03f, -1.727173442e-03f, +6.715860723e-03f, +1.537776757e-02f, -8.254935092e-03f, -5.515187175e-02f, -2.884403189e-02f, +1.423521927e-01f, +3.525960648e-01f, +3.969735590e-01f, +2.280519684e-01f, +1.954509845e-02f, -6.032515563e-02f, -2.673202869e-02f, +1.170215662e-02f, +1.152102766e-02f, +1.449099031e-04f, -1.907517654e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.356343946e-05f, -8.458702163e-05f, -4.016059088e-04f, +5.605588272e-05f, +1.380534433e-03f, +9.990266999e-04f, -3.010218017e-03f, -6.988772415e-03f, -4.974285215e-03f, +2.287654524e-03f, +7.075826854e-03f, +5.017497786e-03f, +2.548389554e-04f, -1.625135633e-03f, -5.809144570e-04f, +3.673334824e-04f, +2.314372474e-04f, -4.606445578e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.437167395e-04f, -2.108106175e-03f, -6.303749149e-03f, +2.458837467e-03f, +1.752740886e-02f, +5.702204340e-03f, -2.624704143e-02f, -2.184778136e-02f, +2.215749047e-02f, +3.397840431e-02f, -6.774430021e-03f, -3.132425329e-02f, -6.682222200e-03f, +1.751637614e-02f, +9.069295032e-03f, -5.076566737e-03f, -4.223288433e-03f, +3.280237781e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.629894786e-06f, +1.668364102e-04f, +2.387771828e-06f, -5.132917351e-04f, -2.166164074e-04f, +9.060208672e-04f, +7.282399390e-04f, -9.965951551e-04f, -1.280910578e-03f, +6.277435499e-04f, +1.446690235e-03f, -7.706841200e-05f, -1.100549303e-03f, -2.390876085e-04f, +5.533865287e-04f, +2.159186992e-04f, -1.710153017e-04f, -6.918014043e-05f, +0.000000000e+00f, + /* 8,23 (20) */ + +0.000000000e+00f, -1.132203778e-03f, -1.811760464e-03f, +6.314254814e-03f, +1.543382345e-02f, -6.874400660e-03f, -5.415284505e-02f, -3.185424991e-02f, +1.353634203e-01f, +3.476217796e-01f, +3.992612135e-01f, +2.351277952e-01f, +2.456259623e-02f, -6.007031667e-02f, -2.835716432e-02f, +1.112124216e-02f, +1.188836114e-02f, +3.763471504e-04f, -1.953582110e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.302972345e-05f, -7.462672369e-05f, -3.974962422e-04f, +2.227738715e-05f, +1.346685295e-03f, +1.067505246e-03f, -2.851256896e-03f, -6.933287283e-03f, -5.145981756e-03f, +2.054358946e-03f, +7.030927663e-03f, +5.159242554e-03f, +3.773688956e-04f, -1.624994456e-03f, -6.257372305e-04f, +3.567898892e-04f, +2.431734112e-04f, -4.247390942e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.483466343e-04f, -1.941269765e-03f, -6.301361377e-03f, +1.945545732e-03f, +1.731079245e-02f, +6.608225208e-03f, -2.551880149e-02f, -2.284437652e-02f, +2.087657989e-02f, +3.460614786e-02f, -5.327739786e-03f, -3.140132170e-02f, -7.782771502e-03f, +1.727728853e-02f, +9.622681561e-03f, -4.860648038e-03f, -4.394303735e-03f, +2.588436377e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.791601960e-07f, +1.634733292e-04f, +1.653850333e-05f, -5.027718777e-04f, -2.458100504e-04f, +8.789077206e-04f, +7.673560558e-04f, -9.476819635e-04f, -1.315326220e-03f, +5.652025795e-04f, +1.464041066e-03f, -1.929371400e-05f, -1.101326377e-03f, -2.776508377e-04f, +5.478449469e-04f, +2.341280336e-04f, -1.676525981e-04f, -7.496893016e-05f, +0.000000000e+00f, + /* 8,24 (20) */ + +0.000000000e+00f, -1.069174054e-03f, -1.886387187e-03f, +5.916758572e-03f, +1.545610084e-02f, -5.527715365e-03f, -5.308533981e-02f, -3.470550680e-02f, +1.284301330e-01f, +3.424757978e-01f, +4.013155724e-01f, +2.421587229e-01f, +2.972183879e-02f, -5.969294778e-02f, -2.998215878e-02f, +1.049550493e-02f, +1.224515103e-02f, +6.195205617e-04f, -1.996056020e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.228793068e-05f, -6.495779442e-05f, -3.926130473e-04f, -1.032557166e-05f, +1.311273318e-03f, +1.131866336e-03f, -2.692763799e-03f, -6.871423201e-03f, -5.311643185e-03f, +1.818575967e-03f, +6.978460109e-03f, +5.298006690e-03f, +5.032026181e-04f, -1.621626369e-03f, -6.708181825e-04f, +3.449835367e-04f, +2.548186554e-04f, -3.852247275e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.492257945e-04f, -1.777796436e-03f, -6.284822874e-03f, +1.442773854e-03f, +1.706498240e-02f, +7.487132928e-03f, -2.475144544e-02f, -2.379205848e-02f, +1.956125367e-02f, +3.517135044e-02f, -3.863698720e-03f, -3.142061541e-02f, -8.884097880e-03f, +1.699963769e-02f, +1.017052651e-02f, -4.626520004e-03f, -4.561956333e-03f, +1.838747075e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.660809337e-06f, +1.597822697e-04f, +3.017253819e-05f, -4.913988792e-04f, -2.738891182e-04f, +8.504159104e-04f, +8.045174409e-04f, -8.972367241e-04f, -1.347075783e-03f, +5.014933909e-04f, +1.478597032e-03f, +3.903885532e-05f, -1.099864065e-03f, -3.163294421e-04f, +5.409490196e-04f, +2.523327995e-04f, -1.636919669e-04f, -8.080144936e-05f, +0.000000000e+00f, + /* 8,25 (20) */ + +0.000000000e+00f, -1.006886124e-03f, -1.951344982e-03f, +5.524145524e-03f, +1.544577527e-02f, -4.216442048e-03f, -5.195347347e-02f, -3.739827060e-02f, +1.215587098e-01f, +3.371641547e-01f, +4.031341484e-01f, +2.491371830e-01f, +3.501984548e-02f, -5.918974516e-02f, -3.160378515e-02f, +9.824686748e-03f, +1.259013456e-02f, +8.743392170e-04f, -2.034578492e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.135114594e-05f, -5.559469128e-05f, -3.869975437e-04f, -4.172110693e-05f, +1.274416991e-03f, +1.192114586e-03f, -2.534949799e-03f, -6.803332954e-03f, -5.471096141e-03f, +1.580588841e-03f, +6.918427409e-03f, +5.433558380e-03f, +6.322257162e-04f, -1.614939401e-03f, -7.160685252e-04f, +3.318960101e-04f, +2.663375779e-04f, -3.420515739e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.465649852e-04f, -1.618014166e-03f, -6.254650335e-03f, +9.513749750e-04f, +1.679109329e-02f, +8.337548839e-03f, -2.394692800e-02f, -2.468929520e-02f, +1.821417788e-02f, +3.567284383e-02f, -2.385101688e-03f, -3.138157656e-02f, -9.983961945e-03f, +1.668330825e-02f, +1.071147553e-02f, -4.374187205e-03f, -4.725648300e-03f, +1.030732582e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.986293400e-06f, +1.557863887e-04f, +4.326973245e-05f, -4.792204753e-04f, -3.008111924e-04f, +8.206272825e-04f, +8.396653856e-04f, -8.453746769e-04f, -1.376100729e-03f, +4.367470415e-04f, +1.490314875e-03f, +9.781030550e-05f, -1.096137638e-03f, -3.550382947e-04f, +5.326855166e-04f, +2.704862783e-04f, -1.591241558e-04f, -8.665959027e-05f, +0.000000000e+00f, + /* 8,26 (20) */ + +0.000000000e+00f, -9.455349777e-04f, -2.006939673e-03f, +5.137147981e-03f, +1.540405416e-02f, -2.942025056e-03f, -5.076135888e-02f, -3.993322040e-02f, +1.147553768e-01f, +3.316930585e-01f, +4.047147373e-01f, +2.560556104e-01f, +4.045340386e-02f, -5.855751944e-02f, -3.321872455e-02f, +9.108618223e-03f, +1.292203057e-02f, +1.140676795e-03f, -2.068783650e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.023253879e-05f, -4.655046160e-05f, -3.806913382e-04f, -7.188097839e-05f, +1.236234382e-03f, +1.248261464e-03f, -2.378021695e-03f, -6.729177001e-03f, -5.624176851e-03f, +1.340684321e-03f, +6.850843792e-03f, +5.565667816e-03f, +7.643164645e-04f, -1.604845391e-03f, -7.613964480e-04f, +3.175113510e-04f, +2.776937890e-04f, -2.951790863e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.405786918e-04f, -1.462227778e-03f, -6.211380603e-03f, +4.721544996e-04f, +1.649028209e-02f, +9.158176121e-03f, -2.310726261e-02f, -2.553466988e-02f, +1.683807716e-02f, +3.610959088e-02f, -8.947868130e-04f, -3.128376625e-02f, -1.108009958e-02f, +1.632826996e-02f, +1.124416104e-02f, -4.103700926e-03f, -4.884772455e-03f, +1.641366791e-05f, +0.000000000e+00f, + +0.000000000e+00f, -9.094470904e-06f, +1.515090324e-04f, +5.581194207e-05f, -4.662853874e-04f, -3.265373564e-04f, +7.896255635e-04f, +8.727462592e-04f, -7.922134833e-04f, -1.402348631e-03f, +3.710969634e-04f, +1.499157406e-03f, +1.568997351e-04f, -1.090127269e-03f, -3.936908756e-04f, +5.230443508e-04f, +2.885407354e-04f, -1.539414209e-04f, -9.252451654e-05f, +0.000000000e+00f, + /* 8,27 (20) */ + +0.000000000e+00f, -8.853024389e-04f, -2.053490135e-03f, +4.756456642e-03f, +1.533217318e-02f, -1.705790674e-03f, -4.951309742e-02f, -4.231124210e-02f, +1.080261998e-01f, +3.260688817e-01f, +4.060554216e-01f, +2.629064542e-01f, +4.601907167e-02f, -5.779320298e-02f, -3.482356994e-02f, +8.347221775e-03f, +1.323954193e-02f, +1.418370584e-03f, -2.098301558e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.894531858e-05f, -3.783675462e-05f, -3.737363107e-04f, -1.007805544e-04f, +1.196842908e-03f, +1.300325148e-03f, -2.222181709e-03f, -6.649123146e-03f, -5.770731354e-03f, +1.099152205e-03f, +6.775734534e-03f, +5.694107605e-03f, +8.993459211e-04f, -1.591260231e-03f, -8.067072348e-04f, +3.018161692e-04f, +2.888499750e-04f, -2.445765210e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.314842209e-04f, -1.310718745e-03f, -6.155568661e-03f, +5.869112213e-06f, +1.616374474e-02f, +9.947801685e-03f, -2.223451635e-02f, -2.632688336e-02f, +1.543572852e-02f, +3.648068784e-02f, +6.043705926e-04f, -3.112686652e-02f, -1.217022685e-02f, +1.593457908e-02f, +1.176720539e-02f, -3.815160191e-03f, -5.038713876e-03f, -7.611084864e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.198340192e-05f, +1.469736598e-04f, +6.778302618e-05f, -4.526431748e-04f, -3.510322360e-04f, +7.574961350e-04f, +9.037115885e-04f, -7.378729408e-04f, -1.425773284e-03f, +3.046786581e-04f, +1.505093613e-03f, +2.161846012e-04f, -1.081818129e-03f, -4.321994666e-04f, +5.120186609e-04f, +3.064475298e-04f, -1.481375893e-04f, -9.837670411e-05f, +0.000000000e+00f, + /* 8,28 (20) */ + +0.000000000e+00f, -8.263571204e-04f, -2.091326889e-03f, +4.382720332e-03f, +1.523139263e-02f, -5.089477662e-04f, -4.821277227e-02f, -4.453342381e-02f, +1.013770767e-01f, +3.202981503e-01f, +4.071545738e-01f, +2.696821888e-01f, +5.171317928e-02f, -5.689385706e-02f, -3.641483017e-02f, +7.540514540e-03f, +1.354135809e-02f, +1.707220559e-03f, -2.122759210e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.750269101e-05f, -2.946383688e-05f, -3.661745017e-04f, -1.283987668e-04f, +1.156359128e-03f, +1.348330372e-03f, -2.067627203e-03f, -6.563346201e-03f, -5.910615717e-03f, +8.562848755e-04f, +6.693135983e-03f, +5.818653167e-03f, +1.037178045e-03f, -1.574104112e-03f, -8.519033891e-04f, +2.847997507e-04f, +2.997679676e-04f, -1.902233903e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.195008189e-04f, -1.163745085e-03f, -6.087785635e-03f, -4.467740626e-04f, +1.581271250e-02f, +1.070529782e-02f, -2.133080476e-02f, -2.706475631e-02f, +1.400995524e-02f, +3.678536650e-02f, +2.109464205e-03f, -3.091068192e-02f, -1.325204498e-02f, +1.550237961e-02f, +1.227922406e-02f, -3.508712661e-03f, -5.186851466e-03f, -1.744875527e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.465200696e-05f, +1.422037663e-04f, +7.916884454e-05f, -4.383440878e-04f, -3.742640308e-04f, +7.243258077e-04f, +9.325181251e-04f, -6.824746924e-04f, -1.446334796e-03f, +2.376293875e-04f, +1.508098759e-03f, +2.755409949e-04f, -1.071200476e-03f, -4.704753514e-04f, +4.996048872e-04f, +3.241572278e-04f, -1.417081185e-04f, -1.041959854e-04f, +0.000000000e+00f, + /* 8,29 (20) */ + +0.000000000e+00f, -7.688544293e-04f, -2.120790726e-03f, +4.016545830e-03f, +1.510299386e-02f, +6.474113621e-04f, -4.686444190e-02f, -4.660105101e-02f, +9.481373048e-02f, +3.143875346e-01f, +4.080108587e-01f, +2.763753247e-01f, +5.753183244e-02f, -5.585667901e-02f, -3.798893429e-02f, +6.688611151e-03f, +1.382615785e-02f, +2.006988527e-03f, -2.141781549e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.591781592e-05f, -2.144061112e-05f, -3.580480029e-04f, -1.547180591e-04f, +1.114898525e-03f, +1.392308263e-03f, -1.914550414e-03f, -6.472027641e-03f, -6.043696216e-03f, +6.123768384e-04f, +6.603095559e-03f, +5.939083145e-03f, +1.177669827e-03f, -1.553301759e-03f, -8.968847683e-04f, +2.664541626e-04f, +3.104088166e-04f, -1.321098992e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.048488120e-04f, -1.021541319e-03f, -6.008616790e-03f, -8.851181504e-04f, +1.543844847e-02f, +1.142962363e-02f, -2.039828664e-02f, -2.774723100e-02f, +1.256362044e-02f, +3.702299588e-02f, +3.617562964e-03f, -3.063514092e-02f, -1.432324546e-02f, +1.503190426e-02f, +1.277882894e-02f, -3.184555433e-03f, -5.328559584e-03f, -2.786835381e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.710004392e-05f, +1.372228099e-04f, +8.995724925e-05f, -4.234389215e-04f, -3.962045354e-04f, +6.902025932e-04f, +9.591278986e-04f, -6.261419350e-04f, -1.463999657e-03f, +1.700878596e-04f, +1.508154461e-03f, +3.348439216e-04f, -1.058269733e-03f, -5.084290207e-04f, +4.858028393e-04f, +3.416197214e-04f, -1.346501531e-04f, -1.099615968e-04f, +0.000000000e+00f, + /* 8,30 (20) */ + +0.000000000e+00f, -7.129366134e-04f, -2.142231337e-03f, +3.658497827e-03f, +1.494827580e-02f, +1.762309887e-03f, -4.547213364e-02f, -4.851560142e-02f, +8.834170284e-02f, +3.083438384e-01f, +4.086232355e-01f, +2.829784203e-01f, +6.347091559e-02f, -5.467900918e-02f, -3.954223604e-02f, +5.791726383e-03f, +1.409261201e-02f, +2.317397343e-03f, -2.154992539e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.420376676e-05f, -1.377463820e-05f, -3.493988511e-04f, -1.797243282e-04f, +1.072575305e-03f, +1.432296160e-03f, -1.763138187e-03f, -6.375355250e-03f, -6.169849517e-03f, +3.677242540e-04f, +6.505671737e-03f, +6.055179807e-03f, +1.320671441e-03f, -1.528782666e-03f, -9.415487266e-04f, +2.467743542e-04f, +3.207328672e-04f, -7.023736503e-06f, +0.000000000e+00f, + +0.000000000e+00f, +6.877487681e-04f, -8.843185093e-04f, -5.918659541e-03f, -1.308557072e-03f, +1.504224393e-02f, +1.211982622e-02f, -1.943915874e-02f, -2.837337293e-02f, +1.109962079e-02f, +3.719308374e-02f, +5.125717425e-03f, -3.030029700e-02f, -1.538151519e-02f, +1.452347524e-02f, +1.326463178e-02f, -2.842935712e-03f, -5.463209737e-03f, -3.886451349e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.932808259e-05f, +1.320541391e-04f, +1.001380708e-04f, -4.079788706e-04f, -4.168291511e-04f, +6.552154762e-04f, +9.835082565e-04f, -5.689991241e-04f, -1.478740802e-03f, +1.021939107e-04f, +1.505248756e-03f, +3.939675859e-04f, -1.043026549e-03f, -5.459703823e-04f, +4.706157560e-04f, +3.587843512e-04f, -1.269625761e-04f, -1.156522294e-04f, +0.000000000e+00f, + /* 8,31 (20) */ + +0.000000000e+00f, -6.587328467e-04f, -2.156005975e-03f, +3.309098976e-03f, +1.476855147e-02f, +2.834885193e-03f, -4.403983748e-02f, -5.027873961e-02f, +8.196634759e-02f, +3.021739889e-01f, +4.089909597e-01f, +2.894840920e-01f, +6.952609540e-02f, -5.335833774e-02f, -4.107101871e-02f, +4.850177656e-03f, +1.433938636e-02f, +2.638130210e-03f, -2.162016276e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.237349152e-05f, -6.472162169e-06f, -3.402689242e-04f, -2.034068588e-04f, +1.029502197e-03f, +1.468337442e-03f, -1.613571734e-03f, -6.273522751e-03f, -6.288962822e-03f, +1.226244669e-04f, +6.400934007e-03f, +6.166729441e-03f, +1.466026399e-03f, -1.500481324e-03f, -9.857902663e-04f, +2.257582532e-04f, +3.306998416e-04f, -4.618617492e-07f, +0.000000000e+00f, + +0.000000000e+00f, +6.684206855e-04f, -7.522643702e-04f, -5.818521470e-03f, -1.716535943e-03f, +1.462541478e-02f, +1.277504170e-02f, -1.845565048e-02f, -2.894237206e-02f, +9.620879985e-03f, +3.729527765e-02f, +6.630966181e-03f, -2.990632942e-02f, -1.642454174e-02f, +1.397750486e-02f, +1.373524754e-02f, -2.484151361e-03f, -5.590172313e-03f, -5.042973643e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.133747723e-05f, +1.267209228e-04f, +1.097030990e-04f, -3.920153858e-04f, -4.361168879e-04f, +6.194541872e-04f, +1.005631891e-03f, -5.111716778e-04f, -1.490537654e-03f, +3.408818562e-05f, +1.499376150e-03f, +4.527856805e-04f, -1.025476853e-03f, -5.830089752e-04f, +4.540503574e-04f, +3.756000324e-04f, -1.186460577e-04f, -1.212460831e-04f, +0.000000000e+00f, + /* 9, 0 (20) */ + +0.000000000e+00f, -2.788021585e-03f, -2.739988319e-03f, +1.245659329e-02f, +1.805368529e-02f, -2.917700415e-02f, -6.934232994e-02f, +4.623928110e-02f, +3.040153684e-01f, +4.464429501e-01f, +3.040153684e-01f, +4.623928110e-02f, -6.934232994e-02f, -2.917700415e-02f, +1.805368529e-02f, +1.245659329e-02f, -2.739988319e-03f, -2.788021585e-03f, +4.072385311e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.217079448e-04f, -2.120537838e-04f, -6.013582856e-04f, +5.317399089e-04f, +2.083490300e-03f, -4.405495465e-04f, -6.619515121e-03f, -7.900310157e-03f, -1.567126525e-04f, +7.779500476e-03f, +6.784694429e-03f, +6.079398431e-04f, -2.087791629e-03f, -5.933853095e-04f, +5.954222446e-04f, +2.305658252e-04f, -1.202487606e-04f, -3.103601429e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.788021585e-03f, -6.954497747e-04f, -9.513451793e-03f, +2.287479789e-03f, +2.102105089e-02f, -2.915564891e-03f, -3.246879931e-02f, +1.360596461e-03f, +3.732936584e-02f, +1.360596461e-03f, -3.246879931e-02f, -2.915564891e-03f, +2.102105089e-02f, +2.287479789e-03f, -9.513451793e-03f, -6.954497747e-04f, +2.466267758e-03f, -4.072385311e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.217079448e-04f, +2.791298664e-04f, +8.987193298e-05f, -7.470938414e-04f, -8.255078474e-05f, +1.321526365e-03f, +6.339450830e-05f, -1.728195928e-03f, -4.405076371e-05f, +1.732279086e-03f, +1.405178167e-05f, -1.331931790e-03f, +3.088857861e-05f, +7.592913089e-04f, -6.557991726e-05f, -2.884591603e-04f, +6.119626725e-05f, +3.103601429e-05f, +0.000000000e+00f, + /* 9, 1 (20) */ + +0.000000000e+00f, -2.666313640e-03f, -2.952042103e-03f, +1.185523500e-02f, +1.858542519e-02f, -2.709351385e-02f, -6.978287948e-02f, +3.961976598e-02f, +2.961150582e-01f, +4.462862374e-01f, +3.117948688e-01f, +5.302397553e-02f, -6.873439009e-02f, -3.126479578e-02f, +1.746029998e-02f, +1.305201553e-02f, -2.509422494e-03f, -2.908270346e-03f, +9.687838816e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.226759659e-04f, -1.937702911e-04f, -6.055587053e-04f, +4.709329705e-04f, +2.074753048e-03f, -2.776448918e-04f, -6.449147393e-03f, -8.010920493e-03f, -4.699181647e-04f, +7.648590319e-03f, +6.944354374e-03f, +7.796299310e-04f, -2.087511637e-03f, -6.557461540e-04f, +5.877031988e-04f, +2.492607803e-04f, -1.182795009e-04f, -3.487568417e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.666313640e-03f, -4.163199083e-04f, -9.423579860e-03f, +1.540385947e-03f, +2.093850011e-02f, -1.594038526e-03f, -3.240540481e-02f, -3.675994675e-04f, +3.728531508e-02f, +3.092875547e-03f, -3.245474753e-02f, -4.247496681e-03f, +2.105193947e-02f, +3.046771098e-03f, -9.579031710e-03f, -9.839089351e-04f, +2.527464025e-03f, -9.687838816e-06f, +0.000000000e+00f, + +0.000000000e+00f, -1.226759659e-04f, +2.692234406e-04f, +1.132138829e-04f, -7.331134341e-04f, -1.331115381e-04f, +1.307865322e-03f, +1.400484287e-04f, -1.719817145e-03f, -1.320370426e-04f, +1.732039536e-03f, +9.209013332e-05f, -1.339014882e-03f, -2.174754707e-05f, +7.696325503e-04f, -4.038933415e-05f, -2.971603546e-04f, +5.453398286e-05f, +3.487568417e-05f, +0.000000000e+00f, + /* 9, 2 (20) */ + +0.000000000e+00f, -2.543637674e-03f, -3.145812394e-03f, +1.124967630e-02f, +1.905635816e-02f, -2.501876080e-02f, -7.006052437e-02f, +3.317061859e-02f, +2.881041377e-01f, +4.458163192e-01f, +3.194434592e-01f, +5.996832990e-02f, -6.795476016e-02f, -3.335230742e-02f, +1.680455382e-02f, +1.363971873e-02f, -2.260161714e-03f, -3.026549847e-03f, -2.518784535e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.231725867e-04f, -1.757586635e-04f, -6.080738841e-04f, +4.110819289e-04f, +2.061730780e-03f, -1.194000942e-04f, -6.273927067e-03f, -8.111250020e-03f, -7.824646979e-04f, +7.507695873e-03f, +7.098169576e-03f, +9.554225158e-04f, -2.082510856e-03f, -7.186939899e-04f, +5.781569807e-04f, +2.680907537e-04f, -1.157821988e-04f, -3.881777201e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.543637674e-03f, -1.470964677e-04f, -9.310365977e-03f, +8.072725131e-04f, +2.080538857e-02f, -2.861732041e-04f, -3.226535638e-02f, -2.087416613e-03f, +3.715327803e-02f, +4.824915084e-03f, -3.236265740e-02f, -5.586511563e-03f, +2.103019192e-02f, +3.816403648e-03f, -9.619421045e-03f, -1.281069290e-03f, +2.581998008e-03f, +2.518784535e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.231725867e-04f, +2.587914125e-04f, +1.355584979e-04f, -7.174273497e-04f, -1.824483844e-04f, +1.291023805e-03f, +2.157133115e-04f, -1.707181490e-03f, -2.196779041e-04f, +1.727461982e-03f, +1.705171546e-04f, -1.342717643e-03f, -7.522529786e-05f, +7.780485578e-04f, -1.435583036e-05f, -3.051832409e-04f, +4.735383549e-05f, +3.881777201e-05f, +0.000000000e+00f, + /* 9, 3 (20) */ + +0.000000000e+00f, -2.420465088e-03f, -3.321571058e-03f, +1.064160241e-02f, +1.946744009e-02f, -2.295703002e-02f, -7.017992447e-02f, +2.689669152e-02f, +2.799928877e-01f, +4.450338545e-01f, +3.269511550e-01f, +6.706649948e-02f, -6.699933765e-02f, -3.543481827e-02f, +1.608585983e-02f, +1.421787571e-02f, -1.992070960e-03f, -3.142332045e-03f, -6.400561736e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.232183244e-04f, -1.580598491e-04f, -6.089569785e-04f, +3.522985019e-04f, +2.044579463e-03f, +3.402243142e-05f, -6.094194162e-03f, -8.201234742e-03f, -1.093914263e-03f, +7.356950513e-03f, +7.245820893e-03f, +1.135109078e-03f, -2.072656180e-03f, -7.820950974e-04f, +5.667428546e-04f, +2.870056572e-04f, -1.127399294e-04f, -4.285068405e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.420465088e-03f, +1.116949448e-04f, -9.174807479e-03f, +8.984516335e-05f, +2.062294019e-02f, +1.004850601e-03f, -3.204964307e-02f, -3.794598103e-03f, +3.693360013e-02f, +6.552377066e-03f, -3.219214025e-02f, -6.929229206e-03f, +2.095496663e-02f, +4.594452206e-03f, -9.633776875e-03f, -1.586252531e-03f, +2.629351844e-03f, +6.400561736e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.232183244e-04f, +2.478856778e-04f, +1.568628027e-04f, -7.001165165e-04f, -2.304442459e-04f, +1.271085084e-03f, +2.901966692e-04f, -1.690339236e-03f, -3.067441618e-04f, +1.718542995e-03f, +2.491269374e-04f, -1.342991048e-03f, -1.294079547e-04f, +7.844748965e-04f, +1.246089578e-05f, -3.124785706e-04f, +3.966422846e-05f, +4.285068405e-05f, +0.000000000e+00f, + /* 9, 4 (20) */ + +0.000000000e+00f, -2.297246763e-03f, -3.479630907e-03f, +1.003264543e-02f, +1.981973860e-02f, -2.091245056e-02f, -7.014590204e-02f, +2.080249736e-02f, +2.717916530e-01f, +4.439399403e-01f, +3.343081056e-01f, +7.431232037e-02f, -6.586422857e-02f, -3.750747445e-02f, +1.530376473e-02f, +1.478461857e-02f, -1.705065303e-03f, -3.255071975e-03f, -1.068563014e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.228343562e-04f, -1.407123858e-04f, -6.082636990e-04f, +2.946885739e-04f, +2.023459698e-03f, +1.824722076e-04f, -5.910292206e-03f, -8.280828147e-03f, -1.403830863e-03f, +7.196504639e-03f, +7.386996087e-03f, +1.318470120e-03f, -2.057821283e-03f, -8.458106722e-04f, +5.534237292e-04f, +3.059532845e-04f, -1.091369052e-04f, -4.696191667e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.297246763e-03f, +3.595806226e-04f, -9.017944677e-03f, -6.102713531e-04f, +2.039249594e-02f, +2.275935685e-03f, -3.175944640e-02f, -5.484937339e-03f, +3.662685597e-02f, +8.270920061e-03f, -3.194301331e-02f, -8.272220254e-03f, +2.082555867e-02f, +5.378927102e-03f, -9.621315979e-03f, -1.898731101e-03f, +2.669016072e-03f, +1.068563014e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.228343562e-04f, +2.365583057e-04f, +1.770881657e-04f, -6.812652106e-04f, -2.769876987e-04f, +1.248140225e-03f, +3.633107207e-04f, -1.669351991e-03f, -3.930082645e-04f, +1.705291065e-03f, +3.277116368e-04f, -1.339795282e-03f, -1.841547287e-04f, +7.888519877e-04f, +3.999720662e-05f, -3.189982554e-04f, +3.147584400e-05f, +4.696191667e-05f, +0.000000000e+00f, + /* 9, 5 (20) */ + +0.000000000e+00f, -2.174412407e-03f, -3.620343293e-03f, +9.424381734e-03f, +2.011442717e-02f, -1.888899086e-02f, -6.996342983e-02f, +1.489220515e-02f, +2.635108248e-01f, +4.425361094e-01f, +3.415046102e-01f, +8.169931646e-02f, -6.454575845e-02f, -3.956529574e-02f, +1.445795406e-02f, +1.533804229e-02f, -1.399112018e-03f, -3.364208880e-03f, -1.538182181e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.220424252e-04f, -1.237523680e-04f, -6.060520864e-04f, +2.383520973e-04f, +1.998536266e-03f, +3.258108042e-04f, -5.722567552e-03f, -8.350001198e-03f, -1.711781284e-03f, +7.026525481e-03f, +7.521390485e-03f, +1.505275436e-03f, -2.037887028e-03f, -9.096970252e-04f, +5.381663658e-04f, +3.248793961e-04f, -1.049585708e-04f, -5.113806788e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.174412407e-03f, +5.961389283e-04f, -8.840856511e-03f, -1.291536564e-03f, +2.011550824e-02f, +3.524075909e-03f, -3.139613568e-02f, -7.154289331e-03f, +3.623384770e-02f, +9.976211126e-03f, -3.161530167e-02f, -9.612015537e-03f, +2.064140394e-02f, +6.167779090e-03f, -9.581318772e-03f, -2.217729357e-03f, +2.700491916e-03f, +1.538182181e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.220424252e-04f, +2.248613507e-04f, +1.962003325e-04f, -6.609607334e-04f, -3.219732290e-04f, +1.222287742e-03f, +4.348728983e-04f, -1.644292481e-03f, -4.782449426e-04f, +1.687726605e-03f, +4.060620597e-04f, -1.333099948e-03f, -2.393211330e-04f, +7.911253806e-04f, +6.818565330e-05f, -3.246955684e-04f, +2.280166760e-05f, +5.113806788e-05f, +0.000000000e+00f, + /* 9, 6 (20) */ + +0.000000000e+00f, -2.052369982e-03f, -3.744095661e-03f, +8.818329648e-03f, +2.035277927e-02f, -1.689045460e-02f, -6.963761902e-02f, +9.169637602e-03f, +2.551608236e-01f, +4.408243281e-01f, +3.485311357e-01f, +8.922070695e-02f, -6.304048301e-02f, -4.160318276e-02f, +1.354825704e-02f, +1.587620866e-02f, -1.074232622e-03f, -3.469167451e-03f, -2.049562860e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.208647477e-04f, -1.072134221e-04f, -6.023822883e-04f, +1.833830086e-04f, +1.969977696e-03f, +4.639119216e-04f, -5.531368685e-03f, -8.408742284e-03f, -2.017335882e-03f, +6.847196870e-03f, +7.648707631e-03f, +1.695284414e-03f, -2.012741869e-03f, -9.736057991e-04f, +5.209415823e-04f, +3.437278112e-04f, -1.001916974e-04f, -5.536485254e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.052369982e-03f, +8.210002790e-04f, -8.644656178e-03f, -1.952497297e-03f, +1.979353501e-02f, +4.746363651e-03f, -3.096126278e-02f, -8.798581812e-03f, +3.575560276e-02f, +1.166393773e-02f, -3.120923961e-02f, -1.094511548e-02f, +2.040208281e-02f, +6.958904470e-03f, -9.513133119e-03f, -2.542424925e-03f, +2.723293584e-03f, +2.049562860e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.208647477e-04f, +2.128466679e-04f, +2.141694439e-04f, -6.392930840e-04f, -3.653014671e-04f, +1.193633229e-03f, +5.047063370e-04f, -1.615244300e-03f, -5.622318479e-04f, +1.665881937e-03f, +4.839682608e-04f, -1.322884248e-03f, -2.947593716e-04f, +7.912460132e-04f, +9.695511913e-05f, -3.295253456e-04f, +1.365700397e-05f, +5.536485254e-05f, +0.000000000e+00f, + /* 9, 7 (20) */ + +0.000000000e+00f, -1.931505234e-03f, -3.851309083e-03f, +8.215947360e-03f, +2.053616228e-02f, -1.492047690e-02f, -6.917370710e-02f, +3.638268917e-03f, +2.467520813e-01f, +4.388069922e-01f, +3.553783325e-01f, +9.686941458e-02f, -6.134519860e-02f, -4.361592463e-02f, +1.257465124e-02f, +1.639715024e-02f, -7.305048110e-04f, -3.569359148e-03f, -2.603211385e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.193239221e-04f, -9.112668851e-05f, -5.973163362e-04f, +1.298691629e-04f, +1.937955811e-03f, +5.966614467e-04f, -5.337045545e-03f, -8.457057141e-03f, -2.320069358e-03f, +6.658718969e-03f, +7.768659925e-03f, +1.888246358e-03f, -1.982282247e-03f, -1.037384200e-03f, +5.017244508e-04f, +3.624405091e-04f, -9.482447532e-05f, -5.962712134e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.931505234e-03f, +1.033846947e-03f, -8.430486735e-03f, -2.591790381e-03f, +1.942823355e-02f, +5.939996881e-03f, -3.045655644e-02f, -1.041382611e-02f, +3.519337091e-02f, +1.332981967e-02f, -3.072527135e-02f, -1.226799973e-02f, +2.010732344e-02f, +7.750150484e-03f, -9.416178000e-03f, -2.871950271e-03f, +2.736950588e-03f, +2.603211385e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.193239221e-04f, +2.005657339e-04f, +2.309700388e-04f, -6.163546279e-04f, -4.068794000e-04f, +1.162288975e-03f, +5.726403428e-04f, -1.582301631e-03f, -6.447501854e-04f, +1.639801227e-03f, +5.612201445e-04f, -1.309137140e-03f, -3.503187417e-04f, +7.891704580e-04f, +1.262309784e-04f, -3.334441850e-04f, +4.059484342e-06f, +5.962712134e-05f, +0.000000000e+00f, + /* 9, 8 (20) */ + +0.000000000e+00f, -1.812181312e-03f, -3.942435771e-03f, +7.618631023e-03f, +2.066603144e-02f, -1.298252109e-02f, -6.857704566e-02f, -1.698776629e-03f, +2.382950242e-01f, +4.364869229e-01f, +3.620370515e-01f, +1.046380745e-01f, -5.945695224e-02f, -4.559820688e-02f, +1.153726704e-02f, +1.689887469e-02f, -3.680643019e-04f, -3.664183623e-03f, -3.199482598e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.174428396e-04f, -7.552081317e-05f, -5.909179227e-04f, +7.789228352e-05f, +1.902645294e-03f, +7.239574817e-04f, -5.139948840e-03f, -8.494968729e-03f, -2.619561526e-03f, +6.461307976e-03f, +7.880969246e-03f, +2.083900841e-03f, -1.946412967e-03f, -1.100875244e-03f, +4.804944906e-04f, +3.809577389e-04f, -8.884660549e-05f, -6.390888365e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.812181312e-03f, +1.234412681e-03f, -8.199516696e-03f, -3.208145009e-03f, +1.902135415e-02f, +7.102285855e-03f, -2.988391610e-02f, -1.199612774e-02f, +3.454862073e-02f, +1.496962089e-02f, -3.016405121e-02f, -1.357713687e-02f, +1.975700470e-02f, +8.539320942e-03f, -9.289947022e-03f, -3.205394456e-03f, +2.741010072e-03f, +3.199482598e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.174428396e-04f, +1.880694730e-04f, +2.465810426e-04f, -5.922397644e-04f, -4.466205602e-04f, +1.128373559e-03f, +6.385108396e-04f, -1.545568935e-03f, -7.255853330e-04f, +1.609540390e-03f, +6.376080704e-04f, -1.291857461e-03f, -4.058460523e-04f, +7.848611546e-04f, +1.559352700e-04f, -3.364106453e-04f, -5.970935089e-06f, +6.390888365e-05f, +0.000000000e+00f, + /* 9, 9 (20) */ + +0.000000000e+00f, -1.694738472e-03f, -4.017956584e-03f, +7.027713101e-03f, +2.074392372e-02f, -1.107987579e-02f, -6.785308817e-02f, -6.838725469e-03f, +2.298000555e-01f, +4.338673614e-01f, +3.684983595e-01f, +1.125190437e-01f, -5.737305140e-02f, -4.754461985e-02f, +1.043639179e-02f, +1.737936918e-02f, +1.289343693e-05f, -3.753030229e-03f, -3.838571435e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.152445962e-04f, -6.042194565e-05f, -5.832521816e-04f, +2.752792830e-05f, +1.864223241e-03f, +8.457103473e-04f, -4.940429374e-03f, -8.522517089e-03f, -2.915398074e-03f, +6.255195794e-03f, +7.985367570e-03f, +2.281978078e-03f, -1.905047567e-03f, -1.163918025e-03f, +4.572358524e-04f, +3.992181370e-04f, -8.224938858e-05f, -6.819333424e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.694738472e-03f, +1.422482154e-03f, -7.952935653e-03f, -3.800384773e-03f, +1.857473359e-02f, +8.230659415e-03f, -2.924540526e-02f, -1.354169668e-02f, +3.382303539e-02f, +1.657916129e-02f, -2.952644314e-02f, -1.486899433e-02f, +1.935115864e-02f, +9.324182096e-03f, -9.134011752e-03f, -3.541805101e-03f, +2.735039137e-03f, +3.838571435e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.152445962e-04f, +1.754080893e-04f, +2.609857401e-04f, -5.670445928e-04f, -4.844451928e-04f, +1.092011438e-03f, +7.021607935e-04f, -1.505160608e-03f, -8.045274491e-04f, +1.575166969e-03f, +7.129234617e-04f, -1.271054027e-03f, -4.611860537e-04f, +7.782866263e-04f, +1.859868858e-04f, -3.383854403e-04f, -1.641198385e-05f, +6.819333424e-05f, +0.000000000e+00f, + /* 9,10 (20) */ + +0.000000000e+00f, -1.579493876e-03f, -4.078378530e-03f, +6.444460919e-03f, +2.077145165e-02f, -9.215652553e-03f, -6.700737783e-02f, -1.177915484e-02f, +2.212775384e-01f, +4.309519633e-01f, +3.747535553e-01f, +1.205044113e-01f, -5.509107332e-02f, -4.944966741e-02f, +9.272473769e-03f, +1.783660504e-02f, +4.121115739e-04f, -3.835279617e-03f, -4.520504777e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.127524080e-04f, -4.585374517e-05f, -5.743854683e-04f, -2.115452835e-05f, +1.822868728e-03f, +9.618425585e-04f, -4.738837376e-03f, -8.539759156e-03f, -3.207171306e-03f, +6.040629666e-03f, +8.081597560e-03f, +2.482199329e-03f, -1.858108677e-03f, -1.226347989e-03f, +4.319374973e-04f, +4.171588535e-04f, -7.502581213e-05f, -7.246288396e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.579493876e-03f, +1.597890243e-03f, -7.691949913e-03f, -4.367429366e-03f, +1.809028839e-02f, +9.322670852e-03f, -2.854324447e-02f, -1.504685729e-02f, +3.301850795e-02f, +1.815432825e-02f, -2.881351967e-02f, -1.614004836e-02f, +1.888997259e-02f, +1.010246872e-02f, -8.948024866e-03f, -3.880190541e-03f, +2.718627153e-03f, +4.520504777e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.127524080e-04f, +1.626309055e-04f, +2.741717344e-04f, -5.408665778e-04f, -5.202803985e-04f, +1.053332509e-03f, +7.634406120e-04f, -1.461200618e-03f, -8.813720660e-04f, +1.536759961e-03f, +7.869594125e-04f, -1.246745698e-03f, -5.161818798e-04f, +7.694216806e-04f, +2.163017729e-04f, -3.393316318e-04f, -2.723909709e-05f, +7.246288396e-05f, +0.000000000e+00f, + /* 9,11 (20) */ + +0.000000000e+00f, -1.466741468e-03f, -4.124232275e-03f, +5.870075451e-03f, +2.075029712e-02f, -7.392783826e-03f, -6.604553527e-02f, -1.651799222e-02f, +2.127377792e-01f, +4.277447920e-01f, +3.807941849e-01f, +1.285860089e-01f, -5.260887399e-02f, -5.130777609e-02f, +8.046125780e-03f, +1.826854253e-02f, +8.292704274e-04f, -3.910305430e-03f, -5.245133617e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.099895277e-04f, -3.183739373e-05f, -5.643851446e-04f, -6.809189769e-05f, +1.778762372e-03f, +1.072288776e-03f, -4.535521841e-03f, -8.546768544e-03f, -3.494480876e-03f, +5.817871779e-03f, +8.169413149e-03f, +2.684277322e-03f, -1.805528355e-03f, -1.287997228e-03f, +4.045933660e-04f, +4.347156863e-04f, -6.717063500e-05f, -7.669919420e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.466741468e-03f, +1.760521149e-03f, -7.417778179e-03f, -4.908295944e-03f, +1.757000799e-02f, +1.037600336e-02f, -2.777980385e-02f, -1.650805790e-02f, +3.213713588e-02f, +1.969108821e-02f, -2.802656026e-02f, -1.738679406e-02f, +1.837379071e-02f, +1.087189040e-02f, -8.731723093e-03f, -4.219522173e-03f, +2.691388056e-03f, +5.245133617e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.099895277e-04f, +1.497862086e-04f, +2.861308923e-04f, -5.138042171e-04f, -5.540602536e-04f, +1.012471674e-03f, +8.222085199e-04f, -1.413822106e-03f, -9.559206659e-04f, +1.494409627e-03f, +8.595112945e-04f, -1.218961417e-03f, -5.706755001e-04f, +7.582475927e-04f, +2.467931502e-04f, -3.392148164e-04f, -3.842544483e-05f, +7.669919420e-05f, +0.000000000e+00f, + /* 9,12 (20) */ + +0.000000000e+00f, -1.356751941e-03f, -4.156069669e-03f, +5.305690306e-03f, +2.068220522e-02f, -5.614021453e-03f, -6.497324649e-02f, -2.105351406e-02f, +2.041910107e-01f, +4.242503111e-01f, +3.866120567e-01f, +1.367554220e-01f, -4.992459667e-02f, -5.311330444e-02f, +6.758128552e-03f, +1.867313590e-02f, +1.263986114e-03f, -3.977476065e-03f, -6.012125559e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.069791648e-04f, -1.839161634e-05f, -5.533193656e-04f, -1.132271637e-04f, +1.732085908e-03f, +1.176995732e-03f, -4.330829877e-03f, -8.543635297e-03f, -3.776934500e-03f, +5.587198838e-03f, +8.248580102e-03f, +2.887916697e-03f, -1.747248417e-03f, -1.348694792e-03f, +3.752025402e-04f, +4.518232228e-04f, -5.868046884e-05f, -8.088321544e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.356751941e-03f, +1.910307357e-03f, -7.131647286e-03f, -5.422100161e-03f, +1.701594774e-02f, +1.138847504e-02f, -2.695759533e-02f, -1.792188001e-02f, +3.118121521e-02f, +2.118549784e-02f, -2.716704897e-02f, -1.860575548e-02f, +1.780311521e-02f, +1.163013800e-02f, -8.484929943e-03f, -4.558736989e-03f, +2.652962611e-03f, +6.012125559e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.069791648e-04f, +1.369211034e-04f, +2.968592758e-04f, -4.859567114e-04f, -5.857259060e-04f, +9.695683799e-04f, +8.783309074e-04f, -1.363166966e-03f, -1.027981240e-03f, +1.448217257e-03f, +9.303773597e-04f, -1.187740218e-03f, -6.245081812e-04f, +7.447522702e-04f, +2.773717379e-04f, -3.380033093e-04f, -4.994197077e-05f, +8.088321544e-05f, +0.000000000e+00f, + /* 9,13 (20) */ + +0.000000000e+00f, -1.249772776e-03f, -4.174461285e-03f, +4.752370941e-03f, +2.056897806e-02f, -3.881935545e-03f, -6.379625076e-02f, -2.538434394e-02f, +1.956473754e-01f, +4.204733766e-01f, +3.921992556e-01f, +1.450040021e-01f, -4.703667997e-02f, -5.486055286e-02f, +5.409433760e-03f, +1.904833844e-02f, +1.715809337e-03f, -4.036156533e-03f, -6.820957713e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.037444079e-04f, -5.532707939e-06f, -5.412568705e-04f, -1.565094550e-04f, +1.683021757e-03f, +1.275922127e-03f, -4.125106062e-03f, -8.530465613e-03f, -4.054148657e-03f, +5.348901608e-03f, +8.318876553e-03f, +3.092814483e-03f, -1.683220745e-03f, -1.408267004e-03f, +3.437693945e-04f, +4.684149900e-04f, -4.955385621e-05f, -8.499522959e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.249772776e-03f, +2.047228461e-03f, -6.834788011e-03f, -5.908056872e-03f, +1.643022183e-02f, +1.235804342e-02f, -2.607926443e-02f, -1.928504698e-02f, +3.015323397e-02f, +2.263371510e-02f, -2.623667161e-02f, -1.979349569e-02f, +1.717860703e-02f, +1.237489027e-02f, -8.207558205e-03f, -4.896740299e-03f, +2.603020640e-03f, +6.820957713e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.037444079e-04f, +1.240813725e-04f, +3.063570604e-04f, -4.574236364e-04f, -6.152256489e-04f, +9.247661581e-04f, +9.316826521e-04f, -1.309385403e-03f, -1.097368829e-03f, +1.398294905e-03f, +9.993593378e-04f, -1.153131200e-03f, -6.775209553e-04f, +7.289304000e-04f, +3.079459993e-04f, -3.356683205e-04f, -6.175744052e-05f, +8.499522959e-05f, +0.000000000e+00f, + /* 9,14 (20) */ + +0.000000000e+00f, -1.146028368e-03f, -4.179993993e-03f, +4.211114070e-03f, +2.041246861e-02f, -2.198913789e-03f, -6.252032863e-02f, -2.950945000e-02f, +1.871169098e-01f, +4.164192280e-01f, +3.975481572e-01f, +1.533228787e-01f, -4.394386549e-02f, -5.654377361e-02f, +4.001166755e-03f, +1.939210783e-02f, +2.184224327e-03f, -4.085710390e-03f, -7.670910009e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.003081502e-04f, +6.725433176e-06f, -5.282667776e-04f, -1.978940026e-04f, +1.631752616e-03f, +1.369038514e-03f, -3.918691821e-03f, -8.507381527e-03f, -4.325749271e-03f, +5.103284432e-03f, +8.380093529e-03f, +3.298660581e-03f, -1.613407579e-03f, -1.466537801e-03f, +3.103037383e-04f, +4.844236112e-04f, -3.979134513e-05f, -8.901489621e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.146028368e-03f, +2.171309833e-03f, -6.528430950e-03f, -6.365480509e-03f, +1.581499619e-02f, +1.328280957e-02f, -2.514758177e-02f, -2.059443238e-02f, +2.905586514e-02f, +2.403201000e-02f, -2.523731227e-02f, -2.094662689e-02f, +1.650108607e-02f, +1.310382067e-02f, -7.899612206e-03f, -5.232408619e-03f, +2.541263200e-03f, +7.670910009e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.003081502e-04f, +1.113113465e-04f, +3.146284418e-04f, -4.283046210e-04f, -6.425149696e-04f, +8.782121549e-04f, +9.821474132e-04f, -1.252635460e-03f, -1.163906035e-03f, +1.344765095e-03f, +1.066263026e-03f, -1.115193478e-03f, -7.295550957e-04f, +7.107835746e-04f, +3.384223955e-04f, -3.321841264e-04f, -7.383849955e-05f, +8.901489621e-05f, +0.000000000e+00f, + /* 9,15 (20) */ + +0.000000000e+00f, -1.045720218e-03f, -4.173268560e-03f, +3.682847292e-03f, +2.021457460e-02f, -5.671611725e-04f, -6.115129012e-02f, -3.342814182e-02f, +1.786095282e-01f, +4.120934787e-01f, +4.026514416e-01f, +1.617029722e-01f, -4.064520491e-02f, -5.815718119e-02f, +2.534628954e-03f, +1.970241157e-02f, +2.668647938e-03f, -4.125501735e-03f, -8.561058971e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.669301793e-05f, +1.837126566e-05f, -5.144183841e-04f, -2.373420828e-04f, +1.578461049e-03f, +1.456327142e-03f, -3.711924803e-03f, -8.474520581e-03f, -4.591372366e-03f, +4.850664711e-03f, +8.432035445e-03f, +3.505138284e-03f, -1.537781791e-03f, -1.523329078e-03f, +2.748209470e-04f, +4.997809705e-04f, -2.939555957e-05f, -9.292130267e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.045720218e-03f, +2.282621180e-03f, -6.213802508e-03f, -6.793785130e-03f, +1.517248122e-02f, +1.416102173e-02f, -2.416543436e-02f, -2.184706784e-02f, +2.789195911e-02f, +2.537677510e-02f, -2.417104924e-02f, -2.206182037e-02f, +1.577153098e-02f, +1.381460424e-02f, -7.561189810e-03f, -5.564592746e-03f, +2.467424700e-03f, +8.561058971e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.669301793e-05f, +9.865378036e-05f, +3.216815302e-04f, -3.986990295e-04f, -6.675565758e-04f, +8.300566539e-04f, +1.029617897e-03f, -1.193082535e-03f, -1.227423523e-03f, +1.287760488e-03f, +1.130898870e-03f, -1.073996092e-03f, -7.804525961e-04f, +6.903203990e-04f, +3.687056509e-04f, -3.275282327e-04f, -8.614974053e-05f, +9.292130267e-05f, +0.000000000e+00f, + /* 9,16 (20) */ + +0.000000000e+00f, -9.490271998e-04f, -4.154897294e-03f, +3.168428908e-03f, +1.997723252e-02f, +1.011299876e-03f, -5.969496298e-02f, -3.714006662e-02f, +1.701350077e-01f, +4.075021063e-01f, +4.075021063e-01f, +1.701350077e-01f, -3.714006662e-02f, -5.969496298e-02f, +1.011299876e-03f, +1.997723252e-02f, +3.168428908e-03f, -4.154897294e-03f, -9.490271998e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.292130267e-05f, +2.939555957e-05f, -4.997809705e-04f, -2.748209470e-04f, +1.523329078e-03f, +1.537781791e-03f, -3.505138284e-03f, -8.432035445e-03f, -4.850664711e-03f, +4.591372366e-03f, +8.474520581e-03f, +3.711924803e-03f, -1.456327142e-03f, -1.578461049e-03f, +2.373420828e-04f, +5.144183841e-04f, -1.837126566e-05f, -9.669301793e-05f, +0.000000000e+00f, + +0.000000000e+00f, +9.490271998e-04f, +2.381274960e-03f, -5.892120978e-03f, -7.192484159e-03f, +1.450492464e-02f, +1.499107838e-02f, -2.313581646e-02f, -2.304015037e-02f, +2.666453559e-02f, +2.666453559e-02f, -2.304015037e-02f, -2.313581646e-02f, +1.499107838e-02f, +1.450492464e-02f, -7.192484159e-03f, -5.892120978e-03f, +2.381274960e-03f, +9.490271998e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.292130267e-05f, +8.614974053e-05f, +3.275282327e-04f, -3.687056509e-04f, -6.903203990e-04f, +7.804525961e-04f, +1.073996092e-03f, -1.130898870e-03f, -1.287760488e-03f, +1.227423523e-03f, +1.193082535e-03f, -1.029617897e-03f, -8.300566539e-04f, +6.675565758e-04f, +3.986990295e-04f, -3.216815302e-04f, -9.865378036e-05f, +9.669301793e-05f, +0.000000000e+00f, + /* 9,17 (20) */ + +0.000000000e+00f, -8.561058971e-04f, -4.125501735e-03f, +2.668647938e-03f, +1.970241157e-02f, +2.534628954e-03f, -5.815718119e-02f, -4.064520491e-02f, +1.617029722e-01f, +4.026514416e-01f, +4.120934787e-01f, +1.786095282e-01f, -3.342814182e-02f, -6.115129012e-02f, -5.671611725e-04f, +2.021457460e-02f, +3.682847292e-03f, -4.173268560e-03f, -1.045720218e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.901489621e-05f, +3.979134513e-05f, -4.844236112e-04f, -3.103037383e-04f, +1.466537801e-03f, +1.613407579e-03f, -3.298660581e-03f, -8.380093529e-03f, -5.103284432e-03f, +4.325749271e-03f, +8.507381527e-03f, +3.918691821e-03f, -1.369038514e-03f, -1.631752616e-03f, +1.978940026e-04f, +5.282667776e-04f, -6.725433176e-06f, -1.003081502e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.561058971e-04f, +2.467424700e-03f, -5.564592746e-03f, -7.561189810e-03f, +1.381460424e-02f, +1.577153098e-02f, -2.206182037e-02f, -2.417104924e-02f, +2.537677510e-02f, +2.789195911e-02f, -2.184706784e-02f, -2.416543436e-02f, +1.416102173e-02f, +1.517248122e-02f, -6.793785130e-03f, -6.213802508e-03f, +2.282621180e-03f, +1.045720218e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.901489621e-05f, +7.383849955e-05f, +3.321841264e-04f, -3.384223955e-04f, -7.107835746e-04f, +7.295550957e-04f, +1.115193478e-03f, -1.066263026e-03f, -1.344765095e-03f, +1.163906035e-03f, +1.252635460e-03f, -9.821474132e-04f, -8.782121549e-04f, +6.425149696e-04f, +4.283046210e-04f, -3.146284418e-04f, -1.113113465e-04f, +1.003081502e-04f, +0.000000000e+00f, + /* 9,18 (20) */ + +0.000000000e+00f, -7.670910009e-04f, -4.085710390e-03f, +2.184224327e-03f, +1.939210783e-02f, +4.001166755e-03f, -5.654377361e-02f, -4.394386549e-02f, +1.533228787e-01f, +3.975481572e-01f, +4.164192280e-01f, +1.871169098e-01f, -2.950945000e-02f, -6.252032863e-02f, -2.198913789e-03f, +2.041246861e-02f, +4.211114070e-03f, -4.179993993e-03f, -1.146028368e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.499522959e-05f, +4.955385621e-05f, -4.684149900e-04f, -3.437693945e-04f, +1.408267004e-03f, +1.683220745e-03f, -3.092814483e-03f, -8.318876553e-03f, -5.348901608e-03f, +4.054148657e-03f, +8.530465613e-03f, +4.125106062e-03f, -1.275922127e-03f, -1.683021757e-03f, +1.565094550e-04f, +5.412568705e-04f, +5.532707939e-06f, -1.037444079e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.670910009e-04f, +2.541263200e-03f, -5.232408619e-03f, -7.899612206e-03f, +1.310382067e-02f, +1.650108607e-02f, -2.094662689e-02f, -2.523731227e-02f, +2.403201000e-02f, +2.905586514e-02f, -2.059443238e-02f, -2.514758177e-02f, +1.328280957e-02f, +1.581499619e-02f, -6.365480509e-03f, -6.528430950e-03f, +2.171309833e-03f, +1.146028368e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.499522959e-05f, +6.175744052e-05f, +3.356683205e-04f, -3.079459993e-04f, -7.289304000e-04f, +6.775209553e-04f, +1.153131200e-03f, -9.993593378e-04f, -1.398294905e-03f, +1.097368829e-03f, +1.309385403e-03f, -9.316826521e-04f, -9.247661581e-04f, +6.152256489e-04f, +4.574236364e-04f, -3.063570604e-04f, -1.240813725e-04f, +1.037444079e-04f, +0.000000000e+00f, + /* 9,19 (20) */ + +0.000000000e+00f, -6.820957713e-04f, -4.036156533e-03f, +1.715809337e-03f, +1.904833844e-02f, +5.409433760e-03f, -5.486055286e-02f, -4.703667997e-02f, +1.450040021e-01f, +3.921992556e-01f, +4.204733766e-01f, +1.956473754e-01f, -2.538434394e-02f, -6.379625076e-02f, -3.881935545e-03f, +2.056897806e-02f, +4.752370941e-03f, -4.174461285e-03f, -1.249772776e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.088321544e-05f, +5.868046884e-05f, -4.518232228e-04f, -3.752025402e-04f, +1.348694792e-03f, +1.747248417e-03f, -2.887916697e-03f, -8.248580102e-03f, -5.587198838e-03f, +3.776934500e-03f, +8.543635297e-03f, +4.330829877e-03f, -1.176995732e-03f, -1.732085908e-03f, +1.132271637e-04f, +5.533193656e-04f, +1.839161634e-05f, -1.069791648e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.820957713e-04f, +2.603020640e-03f, -4.896740299e-03f, -8.207558205e-03f, +1.237489027e-02f, +1.717860703e-02f, -1.979349569e-02f, -2.623667161e-02f, +2.263371510e-02f, +3.015323397e-02f, -1.928504698e-02f, -2.607926443e-02f, +1.235804342e-02f, +1.643022183e-02f, -5.908056872e-03f, -6.834788011e-03f, +2.047228461e-03f, +1.249772776e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.088321544e-05f, +4.994197077e-05f, +3.380033093e-04f, -2.773717379e-04f, -7.447522702e-04f, +6.245081812e-04f, +1.187740218e-03f, -9.303773597e-04f, -1.448217257e-03f, +1.027981240e-03f, +1.363166966e-03f, -8.783309074e-04f, -9.695683799e-04f, +5.857259060e-04f, +4.859567114e-04f, -2.968592758e-04f, -1.369211034e-04f, +1.069791648e-04f, +0.000000000e+00f, + /* 9,20 (20) */ + +0.000000000e+00f, -6.012125559e-04f, -3.977476065e-03f, +1.263986114e-03f, +1.867313590e-02f, +6.758128552e-03f, -5.311330444e-02f, -4.992459667e-02f, +1.367554220e-01f, +3.866120567e-01f, +4.242503111e-01f, +2.041910107e-01f, -2.105351406e-02f, -6.497324649e-02f, -5.614021453e-03f, +2.068220522e-02f, +5.305690306e-03f, -4.156069669e-03f, -1.356751941e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.669919420e-05f, +6.717063500e-05f, -4.347156863e-04f, -4.045933660e-04f, +1.287997228e-03f, +1.805528355e-03f, -2.684277322e-03f, -8.169413149e-03f, -5.817871779e-03f, +3.494480876e-03f, +8.546768544e-03f, +4.535521841e-03f, -1.072288776e-03f, -1.778762372e-03f, +6.809189769e-05f, +5.643851446e-04f, +3.183739373e-05f, -1.099895277e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.012125559e-04f, +2.652962611e-03f, -4.558736989e-03f, -8.484929943e-03f, +1.163013800e-02f, +1.780311521e-02f, -1.860575548e-02f, -2.716704897e-02f, +2.118549784e-02f, +3.118121521e-02f, -1.792188001e-02f, -2.695759533e-02f, +1.138847504e-02f, +1.701594774e-02f, -5.422100161e-03f, -7.131647286e-03f, +1.910307357e-03f, +1.356751941e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.669919420e-05f, +3.842544483e-05f, +3.392148164e-04f, -2.467931502e-04f, -7.582475927e-04f, +5.706755001e-04f, +1.218961417e-03f, -8.595112945e-04f, -1.494409627e-03f, +9.559206659e-04f, +1.413822106e-03f, -8.222085199e-04f, -1.012471674e-03f, +5.540602536e-04f, +5.138042171e-04f, -2.861308923e-04f, -1.497862086e-04f, +1.099895277e-04f, +0.000000000e+00f, + /* 9,21 (20) */ + +0.000000000e+00f, -5.245133617e-04f, -3.910305430e-03f, +8.292704274e-04f, +1.826854253e-02f, +8.046125780e-03f, -5.130777609e-02f, -5.260887399e-02f, +1.285860089e-01f, +3.807941849e-01f, +4.277447920e-01f, +2.127377792e-01f, -1.651799222e-02f, -6.604553527e-02f, -7.392783826e-03f, +2.075029712e-02f, +5.870075451e-03f, -4.124232275e-03f, -1.466741468e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.246288396e-05f, +7.502581213e-05f, -4.171588535e-04f, -4.319374973e-04f, +1.226347989e-03f, +1.858108677e-03f, -2.482199329e-03f, -8.081597560e-03f, -6.040629666e-03f, +3.207171306e-03f, +8.539759156e-03f, +4.738837376e-03f, -9.618425585e-04f, -1.822868728e-03f, +2.115452835e-05f, +5.743854683e-04f, +4.585374517e-05f, -1.127524080e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.245133617e-04f, +2.691388056e-03f, -4.219522173e-03f, -8.731723093e-03f, +1.087189040e-02f, +1.837379071e-02f, -1.738679406e-02f, -2.802656026e-02f, +1.969108821e-02f, +3.213713588e-02f, -1.650805790e-02f, -2.777980385e-02f, +1.037600336e-02f, +1.757000799e-02f, -4.908295944e-03f, -7.417778179e-03f, +1.760521149e-03f, +1.466741468e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.246288396e-05f, +2.723909709e-05f, +3.393316318e-04f, -2.163017729e-04f, -7.694216806e-04f, +5.161818798e-04f, +1.246745698e-03f, -7.869594125e-04f, -1.536759961e-03f, +8.813720660e-04f, +1.461200618e-03f, -7.634406120e-04f, -1.053332509e-03f, +5.202803985e-04f, +5.408665778e-04f, -2.741717344e-04f, -1.626309055e-04f, +1.127524080e-04f, +0.000000000e+00f, + /* 9,22 (20) */ + +0.000000000e+00f, -4.520504777e-04f, -3.835279617e-03f, +4.121115739e-04f, +1.783660504e-02f, +9.272473769e-03f, -4.944966741e-02f, -5.509107332e-02f, +1.205044113e-01f, +3.747535553e-01f, +4.309519633e-01f, +2.212775384e-01f, -1.177915484e-02f, -6.700737783e-02f, -9.215652553e-03f, +2.077145165e-02f, +6.444460919e-03f, -4.078378530e-03f, -1.579493876e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.819333424e-05f, +8.224938858e-05f, -3.992181370e-04f, -4.572358524e-04f, +1.163918025e-03f, +1.905047567e-03f, -2.281978078e-03f, -7.985367570e-03f, -6.255195794e-03f, +2.915398074e-03f, +8.522517089e-03f, +4.940429374e-03f, -8.457103473e-04f, -1.864223241e-03f, -2.752792830e-05f, +5.832521816e-04f, +6.042194565e-05f, -1.152445962e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.520504777e-04f, +2.718627153e-03f, -3.880190541e-03f, -8.948024866e-03f, +1.010246872e-02f, +1.888997259e-02f, -1.614004836e-02f, -2.881351967e-02f, +1.815432825e-02f, +3.301850795e-02f, -1.504685729e-02f, -2.854324447e-02f, +9.322670852e-03f, +1.809028839e-02f, -4.367429366e-03f, -7.691949913e-03f, +1.597890243e-03f, +1.579493876e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.819333424e-05f, +1.641198385e-05f, +3.383854403e-04f, -1.859868858e-04f, -7.782866263e-04f, +4.611860537e-04f, +1.271054027e-03f, -7.129234617e-04f, -1.575166969e-03f, +8.045274491e-04f, +1.505160608e-03f, -7.021607935e-04f, -1.092011438e-03f, +4.844451928e-04f, +5.670445928e-04f, -2.609857401e-04f, -1.754080893e-04f, +1.152445962e-04f, +0.000000000e+00f, + /* 9,23 (20) */ + +0.000000000e+00f, -3.838571435e-04f, -3.753030229e-03f, +1.289343693e-05f, +1.737936918e-02f, +1.043639179e-02f, -4.754461985e-02f, -5.737305140e-02f, +1.125190437e-01f, +3.684983595e-01f, +4.338673614e-01f, +2.298000555e-01f, -6.838725469e-03f, -6.785308817e-02f, -1.107987579e-02f, +2.074392372e-02f, +7.027713101e-03f, -4.017956584e-03f, -1.694738472e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.390888365e-05f, +8.884660549e-05f, -3.809577389e-04f, -4.804944906e-04f, +1.100875244e-03f, +1.946412967e-03f, -2.083900841e-03f, -7.880969246e-03f, -6.461307976e-03f, +2.619561526e-03f, +8.494968729e-03f, +5.139948840e-03f, -7.239574817e-04f, -1.902645294e-03f, -7.789228352e-05f, +5.909179227e-04f, +7.552081317e-05f, -1.174428396e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.838571435e-04f, +2.735039137e-03f, -3.541805101e-03f, -9.134011752e-03f, +9.324182096e-03f, +1.935115864e-02f, -1.486899433e-02f, -2.952644314e-02f, +1.657916129e-02f, +3.382303539e-02f, -1.354169668e-02f, -2.924540526e-02f, +8.230659415e-03f, +1.857473359e-02f, -3.800384773e-03f, -7.952935653e-03f, +1.422482154e-03f, +1.694738472e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.390888365e-05f, +5.970935089e-06f, +3.364106453e-04f, -1.559352700e-04f, -7.848611546e-04f, +4.058460523e-04f, +1.291857461e-03f, -6.376080704e-04f, -1.609540390e-03f, +7.255853330e-04f, +1.545568935e-03f, -6.385108396e-04f, -1.128373559e-03f, +4.466205602e-04f, +5.922397644e-04f, -2.465810426e-04f, -1.880694730e-04f, +1.174428396e-04f, +0.000000000e+00f, + /* 9,24 (20) */ + +0.000000000e+00f, -3.199482598e-04f, -3.664183623e-03f, -3.680643019e-04f, +1.689887469e-02f, +1.153726704e-02f, -4.559820688e-02f, -5.945695224e-02f, +1.046380745e-01f, +3.620370515e-01f, +4.364869229e-01f, +2.382950242e-01f, -1.698776629e-03f, -6.857704566e-02f, -1.298252109e-02f, +2.066603144e-02f, +7.618631023e-03f, -3.942435771e-03f, -1.812181312e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.962712134e-05f, +9.482447532e-05f, -3.624405091e-04f, -5.017244508e-04f, +1.037384200e-03f, +1.982282247e-03f, -1.888246358e-03f, -7.768659925e-03f, -6.658718969e-03f, +2.320069358e-03f, +8.457057141e-03f, +5.337045545e-03f, -5.966614467e-04f, -1.937955811e-03f, -1.298691629e-04f, +5.973163362e-04f, +9.112668851e-05f, -1.193239221e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.199482598e-04f, +2.741010072e-03f, -3.205394456e-03f, -9.289947022e-03f, +8.539320942e-03f, +1.975700470e-02f, -1.357713687e-02f, -3.016405121e-02f, +1.496962089e-02f, +3.454862073e-02f, -1.199612774e-02f, -2.988391610e-02f, +7.102285855e-03f, +1.902135415e-02f, -3.208145009e-03f, -8.199516696e-03f, +1.234412681e-03f, +1.812181312e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.962712134e-05f, -4.059484342e-06f, +3.334441850e-04f, -1.262309784e-04f, -7.891704580e-04f, +3.503187417e-04f, +1.309137140e-03f, -5.612201445e-04f, -1.639801227e-03f, +6.447501854e-04f, +1.582301631e-03f, -5.726403428e-04f, -1.162288975e-03f, +4.068794000e-04f, +6.163546279e-04f, -2.309700388e-04f, -2.005657339e-04f, +1.193239221e-04f, +0.000000000e+00f, + /* 9,25 (20) */ + +0.000000000e+00f, -2.603211385e-04f, -3.569359148e-03f, -7.305048110e-04f, +1.639715024e-02f, +1.257465124e-02f, -4.361592463e-02f, -6.134519860e-02f, +9.686941458e-02f, +3.553783325e-01f, +4.388069922e-01f, +2.467520813e-01f, +3.638268917e-03f, -6.917370710e-02f, -1.492047690e-02f, +2.053616228e-02f, +8.215947360e-03f, -3.851309083e-03f, -1.931505234e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.536485254e-05f, +1.001916974e-04f, -3.437278112e-04f, -5.209415823e-04f, +9.736057991e-04f, +2.012741869e-03f, -1.695284414e-03f, -7.648707631e-03f, -6.847196870e-03f, +2.017335882e-03f, +8.408742284e-03f, +5.531368685e-03f, -4.639119216e-04f, -1.969977696e-03f, -1.833830086e-04f, +6.023822883e-04f, +1.072134221e-04f, -1.208647477e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.603211385e-04f, +2.736950588e-03f, -2.871950271e-03f, -9.416178000e-03f, +7.750150484e-03f, +2.010732344e-02f, -1.226799973e-02f, -3.072527135e-02f, +1.332981967e-02f, +3.519337091e-02f, -1.041382611e-02f, -3.045655644e-02f, +5.939996881e-03f, +1.942823355e-02f, -2.591790381e-03f, -8.430486735e-03f, +1.033846947e-03f, +1.931505234e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.536485254e-05f, -1.365700397e-05f, +3.295253456e-04f, -9.695511913e-05f, -7.912460132e-04f, +2.947593716e-04f, +1.322884248e-03f, -4.839682608e-04f, -1.665881937e-03f, +5.622318479e-04f, +1.615244300e-03f, -5.047063370e-04f, -1.193633229e-03f, +3.653014671e-04f, +6.392930840e-04f, -2.141694439e-04f, -2.128466679e-04f, +1.208647477e-04f, +0.000000000e+00f, + /* 9,26 (20) */ + +0.000000000e+00f, -2.049562860e-04f, -3.469167451e-03f, -1.074232622e-03f, +1.587620866e-02f, +1.354825704e-02f, -4.160318276e-02f, -6.304048301e-02f, +8.922070695e-02f, +3.485311357e-01f, +4.408243281e-01f, +2.551608236e-01f, +9.169637602e-03f, -6.963761902e-02f, -1.689045460e-02f, +2.035277927e-02f, +8.818329648e-03f, -3.744095661e-03f, -2.052369982e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.113806788e-05f, +1.049585708e-04f, -3.248793961e-04f, -5.381663658e-04f, +9.096970252e-04f, +2.037887028e-03f, -1.505275436e-03f, -7.521390485e-03f, -7.026525481e-03f, +1.711781284e-03f, +8.350001198e-03f, +5.722567552e-03f, -3.258108042e-04f, -1.998536266e-03f, -2.383520973e-04f, +6.060520864e-04f, +1.237523680e-04f, -1.220424252e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.049562860e-04f, +2.723293584e-03f, -2.542424925e-03f, -9.513133119e-03f, +6.958904470e-03f, +2.040208281e-02f, -1.094511548e-02f, -3.120923961e-02f, +1.166393773e-02f, +3.575560276e-02f, -8.798581812e-03f, -3.096126278e-02f, +4.746363651e-03f, +1.979353501e-02f, -1.952497297e-03f, -8.644656178e-03f, +8.210002790e-04f, +2.052369982e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.113806788e-05f, -2.280166760e-05f, +3.246955684e-04f, -6.818565330e-05f, -7.911253806e-04f, +2.393211330e-04f, +1.333099948e-03f, -4.060620597e-04f, -1.687726605e-03f, +4.782449426e-04f, +1.644292481e-03f, -4.348728983e-04f, -1.222287742e-03f, +3.219732290e-04f, +6.609607334e-04f, -1.962003325e-04f, -2.248613507e-04f, +1.220424252e-04f, +0.000000000e+00f, + /* 9,27 (20) */ + +0.000000000e+00f, -1.538182181e-04f, -3.364208880e-03f, -1.399112018e-03f, +1.533804229e-02f, +1.445795406e-02f, -3.956529574e-02f, -6.454575845e-02f, +8.169931646e-02f, +3.415046102e-01f, +4.425361094e-01f, +2.635108248e-01f, +1.489220515e-02f, -6.996342983e-02f, -1.888899086e-02f, +2.011442717e-02f, +9.424381734e-03f, -3.620343293e-03f, -2.174412407e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.696191667e-05f, +1.091369052e-04f, -3.059532845e-04f, -5.534237292e-04f, +8.458106722e-04f, +2.057821283e-03f, -1.318470120e-03f, -7.386996087e-03f, -7.196504639e-03f, +1.403830863e-03f, +8.280828147e-03f, +5.910292206e-03f, -1.824722076e-04f, -2.023459698e-03f, -2.946885739e-04f, +6.082636990e-04f, +1.407123858e-04f, -1.228343562e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.538182181e-04f, +2.700491916e-03f, -2.217729357e-03f, -9.581318772e-03f, +6.167779090e-03f, +2.064140394e-02f, -9.612015537e-03f, -3.161530167e-02f, +9.976211126e-03f, +3.623384770e-02f, -7.154289331e-03f, -3.139613568e-02f, +3.524075909e-03f, +2.011550824e-02f, -1.291536564e-03f, -8.840856511e-03f, +5.961389283e-04f, +2.174412407e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.696191667e-05f, -3.147584400e-05f, +3.189982554e-04f, -3.999720662e-05f, -7.888519877e-04f, +1.841547287e-04f, +1.339795282e-03f, -3.277116368e-04f, -1.705291065e-03f, +3.930082645e-04f, +1.669351991e-03f, -3.633107207e-04f, -1.248140225e-03f, +2.769876987e-04f, +6.812652106e-04f, -1.770881657e-04f, -2.365583057e-04f, +1.228343562e-04f, +0.000000000e+00f, + /* 9,28 (20) */ + +0.000000000e+00f, -1.068563014e-04f, -3.255071975e-03f, -1.705065303e-03f, +1.478461857e-02f, +1.530376473e-02f, -3.750747445e-02f, -6.586422857e-02f, +7.431232037e-02f, +3.343081056e-01f, +4.439399403e-01f, +2.717916530e-01f, +2.080249736e-02f, -7.014590204e-02f, -2.091245056e-02f, +1.981973860e-02f, +1.003264543e-02f, -3.479630907e-03f, -2.297246763e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.285068405e-05f, +1.127399294e-04f, -2.870056572e-04f, -5.667428546e-04f, +7.820950974e-04f, +2.072656180e-03f, -1.135109078e-03f, -7.245820893e-03f, -7.356950513e-03f, +1.093914263e-03f, +8.201234742e-03f, +6.094194162e-03f, -3.402243142e-05f, -2.044579463e-03f, -3.522985019e-04f, +6.089569785e-04f, +1.580598491e-04f, -1.232183244e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.068563014e-04f, +2.669016072e-03f, -1.898731101e-03f, -9.621315979e-03f, +5.378927102e-03f, +2.082555867e-02f, -8.272220254e-03f, -3.194301331e-02f, +8.270920061e-03f, +3.662685597e-02f, -5.484937339e-03f, -3.175944640e-02f, +2.275935685e-03f, +2.039249594e-02f, -6.102713531e-04f, -9.017944677e-03f, +3.595806226e-04f, +2.297246763e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.285068405e-05f, -3.966422846e-05f, +3.124785706e-04f, -1.246089578e-05f, -7.844748965e-04f, +1.294079547e-04f, +1.342991048e-03f, -2.491269374e-04f, -1.718542995e-03f, +3.067441618e-04f, +1.690339236e-03f, -2.901966692e-04f, -1.271085084e-03f, +2.304442459e-04f, +7.001165165e-04f, -1.568628027e-04f, -2.478856778e-04f, +1.232183244e-04f, +0.000000000e+00f, + /* 9,29 (20) */ + +0.000000000e+00f, -6.400561736e-05f, -3.142332045e-03f, -1.992070960e-03f, +1.421787571e-02f, +1.608585983e-02f, -3.543481827e-02f, -6.699933765e-02f, +6.706649948e-02f, +3.269511550e-01f, +4.450338545e-01f, +2.799928877e-01f, +2.689669152e-02f, -7.017992447e-02f, -2.295703002e-02f, +1.946744009e-02f, +1.064160241e-02f, -3.321571058e-03f, -2.420465088e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.881777201e-05f, +1.157821988e-04f, -2.680907537e-04f, -5.781569807e-04f, +7.186939899e-04f, +2.082510856e-03f, -9.554225158e-04f, -7.098169576e-03f, -7.507695873e-03f, +7.824646979e-04f, +8.111250020e-03f, +6.273927067e-03f, +1.194000942e-04f, -2.061730780e-03f, -4.110819289e-04f, +6.080738841e-04f, +1.757586635e-04f, -1.231725867e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.400561736e-05f, +2.629351844e-03f, -1.586252531e-03f, -9.633776875e-03f, +4.594452206e-03f, +2.095496663e-02f, -6.929229206e-03f, -3.219214025e-02f, +6.552377066e-03f, +3.693360013e-02f, -3.794598103e-03f, -3.204964307e-02f, +1.004850601e-03f, +2.062294019e-02f, +8.984516335e-05f, -9.174807479e-03f, +1.116949448e-04f, +2.420465088e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.881777201e-05f, -4.735383549e-05f, +3.051832409e-04f, +1.435583036e-05f, -7.780485578e-04f, +7.522529786e-05f, +1.342717643e-03f, -1.705171546e-04f, -1.727461982e-03f, +2.196779041e-04f, +1.707181490e-03f, -2.157133115e-04f, -1.291023805e-03f, +1.824483844e-04f, +7.174273497e-04f, -1.355584979e-04f, -2.587914125e-04f, +1.231725867e-04f, +0.000000000e+00f, + /* 9,30 (20) */ + +0.000000000e+00f, -2.518784535e-05f, -3.026549847e-03f, -2.260161714e-03f, +1.363971873e-02f, +1.680455382e-02f, -3.335230742e-02f, -6.795476016e-02f, +5.996832990e-02f, +3.194434592e-01f, +4.458163192e-01f, +2.881041377e-01f, +3.317061859e-02f, -7.006052437e-02f, -2.501876080e-02f, +1.905635816e-02f, +1.124967630e-02f, -3.145812394e-03f, -2.543637674e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.487568417e-05f, +1.182795009e-04f, -2.492607803e-04f, -5.877031988e-04f, +6.557461540e-04f, +2.087511637e-03f, -7.796299310e-04f, -6.944354374e-03f, -7.648590319e-03f, +4.699181647e-04f, +8.010920493e-03f, +6.449147393e-03f, +2.776448918e-04f, -2.074753048e-03f, -4.709329705e-04f, +6.055587053e-04f, +1.937702911e-04f, -1.226759659e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.518784535e-05f, +2.581998008e-03f, -1.281069290e-03f, -9.619421045e-03f, +3.816403648e-03f, +2.103019192e-02f, -5.586511563e-03f, -3.236265740e-02f, +4.824915084e-03f, +3.715327803e-02f, -2.087416613e-03f, -3.226535638e-02f, -2.861732041e-04f, +2.080538857e-02f, +8.072725131e-04f, -9.310365977e-03f, -1.470964677e-04f, +2.543637674e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.487568417e-05f, -5.453398286e-05f, +2.971603546e-04f, +4.038933415e-05f, -7.696325503e-04f, +2.174754707e-05f, +1.339014882e-03f, -9.209013332e-05f, -1.732039536e-03f, +1.320370426e-04f, +1.719817145e-03f, -1.400484287e-04f, -1.307865322e-03f, +1.331115381e-04f, +7.331134341e-04f, -1.132138829e-04f, -2.692234406e-04f, +1.226759659e-04f, +0.000000000e+00f, + /* 9,31 (20) */ + +0.000000000e+00f, +9.687838816e-06f, -2.908270346e-03f, -2.509422494e-03f, +1.305201553e-02f, +1.746029998e-02f, -3.126479578e-02f, -6.873439009e-02f, +5.302397553e-02f, +3.117948688e-01f, +4.462862374e-01f, +2.961150582e-01f, +3.961976598e-02f, -6.978287948e-02f, -2.709351385e-02f, +1.858542519e-02f, +1.185523500e-02f, -2.952042103e-03f, -2.666313640e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.103601429e-05f, +1.202487606e-04f, -2.305658252e-04f, -5.954222446e-04f, +5.933853095e-04f, +2.087791629e-03f, -6.079398431e-04f, -6.784694429e-03f, -7.779500476e-03f, +1.567126525e-04f, +7.900310157e-03f, +6.619515121e-03f, +4.405495465e-04f, -2.083490300e-03f, -5.317399089e-04f, +6.013582856e-04f, +2.120537838e-04f, -1.217079448e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.687838816e-06f, +2.527464025e-03f, -9.839089351e-04f, -9.579031710e-03f, +3.046771098e-03f, +2.105193947e-02f, -4.247496681e-03f, -3.245474753e-02f, +3.092875547e-03f, +3.728531508e-02f, -3.675994675e-04f, -3.240540481e-02f, -1.594038526e-03f, +2.093850011e-02f, +1.540385947e-03f, -9.423579860e-03f, -4.163199083e-04f, +2.666313640e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.103601429e-05f, -6.119626725e-05f, +2.884591603e-04f, +6.557991726e-05f, -7.592913089e-04f, -3.088857861e-05f, +1.331931790e-03f, -1.405178167e-05f, -1.732279086e-03f, +4.405076371e-05f, +1.728195928e-03f, -6.339450830e-05f, -1.321526365e-03f, +8.255078474e-05f, +7.470938414e-04f, -8.987193298e-05f, -2.791298664e-04f, +1.217079448e-04f, +0.000000000e+00f, + /* 10, 0 (16) */ + -3.435438094e-03f, +2.943141494e-03f, +2.034116507e-02f, -8.155953257e-03f, -7.225789483e-02f, +1.377048179e-02f, +3.053759648e-01f, +4.837723159e-01f, +3.053759648e-01f, +1.377048179e-02f, -7.225789483e-02f, -8.155953257e-03f, +2.034116507e-02f, +2.943141494e-03f, -3.435438094e-03f, -3.217538268e-04f, + +6.707608258e-05f, -5.114863527e-04f, -2.153539325e-04f, +2.000939515e-03f, +8.809768187e-04f, -6.556120613e-03f, -9.628506085e-03f, -2.007634162e-04f, +9.511779562e-03f, +6.798746210e-03f, -7.239919468e-04f, -2.056903051e-03f, +1.659059994e-04f, +5.298423273e-04f, -5.789333512e-05f, -5.905249340e-05f, + +3.435438094e-03f, -4.847709799e-03f, -6.981797302e-03f, +1.656141375e-02f, +8.646918829e-03f, -3.077159020e-02f, -4.021341136e-03f, +3.732936584e-02f, -4.021341136e-03f, -3.077159020e-02f, +8.646918829e-03f, +1.656141375e-02f, -6.981797302e-03f, -4.847709799e-03f, +2.606381379e-03f, +3.217538268e-04f, + -6.707608258e-05f, +3.641911522e-04f, -4.062610643e-04f, -6.600034460e-04f, +1.173864442e-03f, +5.790625007e-04f, -1.850959514e-03f, -5.311769911e-05f, +1.872042266e-03f, -4.956591564e-04f, -1.218918145e-03f, +6.236938338e-04f, +4.420194799e-04f, -3.614489713e-04f, -2.785323460e-05f, +5.905249340e-05f, + /* 10, 1 (16) */ + -3.368362011e-03f, +2.431655141e-03f, +2.012581114e-02f, -6.155013742e-03f, -7.137691801e-02f, +7.214361174e-03f, +2.957474587e-01f, +4.835715525e-01f, +3.148877444e-01f, +2.056922800e-02f, -7.298188677e-02f, -1.021285631e-02f, +2.050707107e-02f, +3.472983821e-03f, -3.493331429e-03f, -3.808063202e-04f, + +7.545314953e-05f, -4.923448224e-04f, -2.621804636e-04f, +1.941641510e-03f, +1.030220430e-03f, -6.309098964e-03f, -9.730737638e-03f, -6.019552073e-04f, +9.380629856e-03f, +7.036444507e-03f, -5.593849512e-04f, -2.109259184e-03f, +1.138863962e-04f, +5.473138646e-04f, -4.789957434e-05f, -6.374551801e-05f, + +3.368362011e-03f, -4.483518646e-03f, -7.388058366e-03f, +1.590141031e-02f, +9.820783271e-03f, -3.019252770e-02f, -5.872300650e-03f, +3.727624814e-02f, -2.149298869e-03f, -3.126724936e-02f, +7.428000684e-03f, +1.718510759e-02f, -6.539777822e-03f, -5.209158770e-03f, +2.578528144e-03f, +3.808063202e-04f, + -7.545314953e-05f, +3.654664619e-04f, -3.701104367e-04f, -6.934136248e-04f, +1.125845779e-03f, +6.598697561e-04f, -1.824406662e-03f, -1.591853495e-04f, +1.887562529e-03f, -4.099047792e-04f, -1.260814382e-03f, +5.845525278e-04f, +4.772438143e-04f, -3.572022469e-04f, -4.096700691e-05f, +6.374551801e-05f, + /* 10, 2 (16) */ + -3.292908862e-03f, +1.939310319e-03f, +1.986363068e-02f, -4.213372232e-03f, -7.034669758e-02f, +9.052622097e-04f, +2.860167211e-01f, +4.829695973e-01f, +3.242683743e-01f, +2.760567250e-02f, -7.354127172e-02f, -1.232211549e-02f, +2.062095747e-02f, +4.020297686e-03f, -3.541231003e-03f, -4.445518383e-04f, + +8.303274900e-05f, -4.725153862e-04f, -3.063454208e-04f, +1.879282395e-03f, +1.171623711e-03f, -6.058213755e-03f, -9.818431511e-03f, -1.002142602e-03f, +9.235157855e-03f, +7.268686731e-03f, -3.872951273e-04f, -2.157736154e-03f, +5.935456784e-05f, +5.638011503e-04f, -3.709248724e-05f, -6.842836328e-05f, + +3.292908862e-03f, -4.118052185e-03f, -7.758168803e-03f, +1.520799668e-02f, +1.094662905e-02f, -2.953265794e-02f, -7.696707312e-03f, +3.711706279e-02f, -2.617363403e-04f, -3.167715414e-02f, +6.167186302e-03f, +1.776966011e-02f, -6.062534007e-03f, -5.566361017e-03f, +2.537561137e-03f, +4.445518383e-04f, + -8.303274900e-05f, +3.653173998e-04f, -3.337076127e-04f, -7.238681425e-04f, +1.075062234e-03f, +7.378467177e-04f, -1.792493798e-03f, -2.647503330e-04f, +1.897446001e-03f, -3.220545052e-04f, -1.299369010e-03f, +5.426587225e-04f, +5.117908634e-04f, -3.514184228e-04f, -5.451931058e-05f, +6.842836328e-05f, + /* 10, 3 (16) */ + -3.209876113e-03f, +1.466794933e-03f, +1.955728526e-02f, -2.334089837e-03f, -6.917507387e-02f, -5.152951546e-03f, +2.761982896e-01f, +4.819674547e-01f, +3.335035321e-01f, +3.487435924e-02f, -7.392856685e-02f, -1.447985165e-02f, +2.068031204e-02f, +4.584098836e-03f, -3.578323491e-03f, -5.129802015e-04f, + +8.982582867e-05f, -4.520941759e-04f, -3.478180146e-04f, +1.814135217e-03f, +1.305107515e-03f, -5.803997492e-03f, -9.891573978e-03f, -1.400658425e-03f, +9.075493508e-03f, +7.494947831e-03f, -2.078819698e-04f, -2.202064135e-03f, +2.379799119e-06f, +5.792037504e-04f, -2.547291348e-05f, -7.307570094e-05f, + +3.209876113e-03f, -3.752734785e-03f, -8.091876415e-03f, +1.448412854e-02f, +1.202169128e-02f, -2.879481123e-02f, -9.489201110e-03f, +3.685231246e-02f, +1.635709661e-03f, -3.199920864e-02f, +4.867817292e-03f, +1.831231884e-02f, -5.550743144e-03f, -5.917779440e-03f, +2.483041827e-03f, +5.129802015e-04f, + -8.982582867e-05f, +3.637909909e-04f, -2.971902528e-04f, -7.513222962e-04f, +1.021720648e-03f, +8.127707584e-04f, -1.755348252e-03f, -3.694794580e-04f, +1.901636797e-03f, -2.323727364e-04f, -1.334407010e-03f, +4.981029650e-04f, +5.455166228e-04f, -3.440703317e-04f, -6.846569569e-05f, +7.307570094e-05f, + /* 10, 4 (16) */ + -3.120050284e-03f, +1.014700757e-03f, +1.920946724e-02f, -5.199546196e-04f, -6.786996635e-02f, -1.095694904e-02f, +2.663067156e-01f, +4.805667962e-01f, +3.425790256e-01f, +4.236930707e-02f, -7.413644882e-02f, -1.668191578e-02f, +2.068269184e-02f, +5.163302586e-03f, -3.603796404e-03f, -5.860559025e-04f, + +9.584591995e-05f, -4.311755333e-04f, -3.865766366e-04f, +1.746471999e-03f, +1.430612432e-03f, -5.546981485e-03f, -9.950180138e-03f, -1.796839128e-03f, +8.901795703e-03f, +7.714707724e-03f, -2.132516203e-05f, -2.241976012e-03f, -5.695868450e-05f, +5.934209358e-04f, -1.304497082e-05f, -7.766106117e-05f, + +3.120050284e-03f, -3.388943794e-03f, -8.389066668e-03f, +1.373280624e-02f, +1.304341193e-02f, -2.798204047e-02f, -1.124454936e-02f, +3.648283300e-02f, +3.537346458e-03f, -3.223158138e-02f, +3.533410282e-03f, +1.881042180e-02f, -5.005226521e-03f, -6.261849771e-03f, +2.414576131e-03f, +5.860559025e-04f, + -9.584591995e-05f, +3.609384715e-04f, -2.606931803e-04f, -7.757428758e-04f, +9.660338085e-04f, +8.844315071e-04f, -1.713114085e-03f, -4.730424052e-04f, +1.900097714e-03f, -1.411322875e-04f, -1.365763233e-03f, +4.509870073e-04f, +5.782768362e-04f, -3.351364524e-04f, -8.275832759e-05f, +7.766106117e-05f, + /* 10, 5 (16) */ + -3.024204364e-03f, +5.835252234e-04f, +1.882289061e-02f, +1.226517379e-03f, -6.643935392e-02f, -1.650393052e-02f, +2.563565355e-01f, +4.787699571e-01f, +3.514808213e-01f, +5.008401479e-02f, -7.415777398e-02f, -1.892389179e-02f, +2.062573315e-02f, +5.756723522e-03f, -3.616841375e-03f, -6.637169637e-04f, + +1.011089827e-04f, -4.098517539e-04f, -4.226086362e-04f, +1.676563037e-03f, +1.548098546e-03f, -5.287694653e-03f, -9.994293679e-03f, -2.190026227e-03f, +8.714252086e-03f, +7.927452544e-03f, +1.721754883e-04f, -2.277208161e-03f, -1.185716446e-04f, +6.063520191e-04f, +1.838277482e-07f, -8.215690319e-05f, + +3.024204364e-03f, -3.028005322e-03f, -8.649759848e-03f, +1.295706337e-02f, +1.400944574e-02f, -2.709760896e-02f, -1.295766345e-02f, +3.600979060e-02f, +5.437444172e-03f, -3.237271367e-02f, +2.167647048e-03f, +1.926140881e-02f, -4.426949685e-03f, -6.596986224e-03f, +2.331817803e-03f, +6.637169637e-04f, + -1.011089827e-04f, +3.568149648e-04f, -2.243479199e-04f, -7.971080899e-04f, +9.082196071e-04f, +9.526314781e-04f, -1.665951517e-03f, -5.751128615e-04f, +1.892810425e-03f, -4.861349538e-05f, -1.393283111e-03f, +4.014236137e-04f, +6.099275555e-04f, -3.246011477e-04f, -9.734610367e-05f, +8.215690319e-05f, + /* 10, 6 (16) */ + -2.923095382e-03f, +1.736734695e-04f, +1.840028197e-02f, +2.903080417e-03f, -6.489125537e-02f, -2.179162518e-02f, +2.463622418e-01f, +4.765799309e-01f, +3.601950734e-01f, +5.801146733e-02f, -7.398559850e-02f, -2.120109995e-02f, +2.050716151e-02f, +6.363075541e-03f, -3.616657547e-03f, -7.458738668e-04f, + +1.056332458e-04f, -3.882128445e-04f, -4.559100754e-04f, +1.604676229e-03f, +1.657545151e-03f, -5.026662348e-03f, -1.002398658e-02f, -2.579567730e-03f, +8.513078807e-03f, +8.132675892e-03f, +3.724001658e-04f, -2.307501240e-03f, -1.823597859e-04f, +6.178967014e-04f, +1.420246565e-05f, -8.653469341e-05f, + +2.923095382e-03f, -2.671190358e-03f, -8.874107768e-03f, +1.215995528e-02f, +1.491766535e-02f, -2.614497748e-02f, -1.462361496e-02f, +3.543467773e-02f, +7.330254596e-03f, -3.242132716e-02f, +7.743639368e-04f, +1.966283242e-02f, -3.817022129e-03f, -6.921587371e-03f, +2.234471700e-03f, +7.458738668e-04f, + -1.056332458e-04f, +3.514791479e-04f, -1.882822589e-04f, -8.154074480e-04f, +8.485002010e-04f, +1.017186649e-03f, -1.614036301e-03f, -6.753696396e-04f, +1.879775612e-03f, +4.489670547e-05f, -1.416823338e-03f, +3.495363225e-04f, +6.403257102e-04f, -3.124548839e-04f, -1.121747884e-04f, +8.653469341e-05f, + /* 10, 7 (16) */ + -2.817462136e-03f, -2.145393750e-04f, +1.794437189e-02f, +4.507756646e-03f, -6.323371022e-02f, -2.681828752e-02f, +2.363382552e-01f, +4.740003632e-01f, +3.687081522e-01f, +6.614414323e-02f, -7.361319833e-02f, -2.350860119e-02f, +2.032480172e-02f, +6.980972243e-03f, -3.602455082e-03f, -8.324085603e-04f, + +1.094390454e-04f, -3.663462974e-04f, -4.864854650e-04f, +1.531076411e-03f, +1.758950422e-03f, -4.764405202e-03f, -1.003935877e-02f, -2.964819543e-03f, +8.298520195e-03f, +8.329880069e-03f, +5.791092179e-04f, -2.332600989e-03f, -2.482137416e-04f, +6.279554292e-04f, +2.899632408e-05f, -9.076499098e-05f, + +2.817462136e-03f, -2.319711210e-03f, -9.062390027e-03f, +1.134454783e-02f, +1.576616555e-02f, -2.512779083e-02f, -1.623765126e-02f, +3.475930809e-02f, +9.210030208e-03f, -3.237643046e-02f, -6.424594009e-04f, +2.001236875e-02f, -3.176696419e-03f, -7.234042255e-03f, +2.122296911e-03f, +8.324085603e-04f, + -1.094390454e-04f, +3.449929113e-04f, -1.526198322e-04f, -8.306416028e-04f, +7.871011619e-04f, +1.077926982e-03f, -1.557559045e-03f, -7.734977779e-04f, +1.861013029e-03f, +1.391057373e-04f, -1.436252516e-03f, +2.954591628e-04f, +6.693296845e-04f, -2.986944284e-04f, -1.271871667e-04f, +9.076499098e-05f, + /* 10, 8 (16) */ + -2.708023090e-03f, -5.808856724e-04f, +1.745788643e-02f, +6.038833057e-03f, -6.147475980e-02f, -3.158269273e-02f, +2.262988964e-01f, +4.710355436e-01f, +3.770066724e-01f, +7.447402330e-02f, -7.303408911e-02f, -2.584120218e-02f, +2.007658798e-02f, +7.608927672e-03f, -3.573458757e-03f, -9.231735512e-04f, + +1.125486598e-04f, -3.443368801e-04f, -5.143474809e-04f, +1.456024734e-03f, +1.852331041e-03f, -4.501438001e-03f, -1.004053766e-02f, -3.345146859e-03f, +8.070848366e-03f, +8.518577317e-03f, +7.920433793e-04f, -2.352259019e-03f, -3.160140896e-04f, +6.364297606e-04f, +4.454709359e-05f, -9.481754058e-05f, + +2.708023090e-03f, -1.974718299e-03f, -9.215009859e-03f, +1.051390623e-02f, +1.655326671e-02f, -2.404986385e-02f, -1.779521031e-02f, +3.398581032e-02f, +1.107104324e-02f, -3.223732472e-02f, -2.078711917e-03f, +2.030782791e-02f, -2.507366735e-03f, -7.532736684e-03f, +1.995109745e-03f, +9.231735512e-04f, + -1.125486598e-04f, +3.374210131e-04f, -1.174797317e-04f, -8.428221511e-04f, +7.242506242e-04f, +1.134696899e-03f, -1.496724481e-03f, -8.691896187e-04f, +1.836561498e-03f, +2.337163610e-04f, -1.451451769e-03f, +2.393363273e-04f, +6.967999002e-04f, -2.833230255e-04f, -1.423232151e-04f, +9.481754058e-05f, + /* 10, 9 (16) */ + -2.595474431e-03f, -9.252225525e-04f, +1.694353895e-02f, +7.494857790e-03f, -5.962242876e-02f, -3.608413073e-02f, +2.162583588e-01f, +4.676903968e-01f, +3.850775208e-01f, +8.299260061e-02f, -7.224204573e-02f, -2.819346120e-02f, +1.976057389e-02f, +8.245357433e-03f, -3.528911664e-03f, -1.017991092e-03f, + +1.149861436e-04f, -3.222664415e-04f, -5.395166645e-04f, +1.379778048e-03f, +1.937721785e-03f, -4.238268581e-03f, -1.002767770e-02f, -3.719925523e-03f, +7.830362763e-03f, +8.698291032e-03f, +1.010924051e-03f, -2.366233621e-03f, -3.856313990e-04f, +6.432227382e-04f, +6.083269664e-05f, -9.866137243e-05f, + +2.595474431e-03f, -1.637297285e-03f, -9.332489591e-03f, +9.671084076e-03f, +1.727751733e-02f, -2.291516695e-02f, -1.929193479e-02f, +3.311662070e-02f, +1.290760473e-02f, -3.200360836e-02f, -3.530163685e-03f, +2.054716424e-02f, -1.810566834e-03f, -7.816059709e-03f, +1.852786530e-03f, +1.017991092e-03f, + -1.149861436e-04f, +3.288307295e-04f, -8.297614255e-05f, -8.519713973e-04f, +6.601784345e-04f, +1.187355687e-03f, -1.431750689e-03f, -9.621458585e-04f, +1.806478830e-03f, +3.284276817e-04f, -1.462315310e-03f, +1.813218010e-04f, +7.225994014e-04f, -2.663505488e-04f, -1.575202906e-04f, +9.866137243e-05f, + /* 10,10 (16) */ + -2.480488287e-03f, -1.247488994e-03f, +1.640402228e-02f, +8.874635839e-03f, -5.768470697e-02f, -4.032239931e-02f, +2.062306811e-01f, +4.639704712e-01f, +3.929078835e-01f, +9.169089164e-02f, -7.123112168e-02f, -3.055969482e-02f, +1.937494249e-02f, +8.888580171e-03f, -3.468078967e-03f, -1.116652464e-03f, + +1.167771603e-04f, -3.002137339e-04f, -5.620211061e-04f, +1.302588329e-03f, +2.015175068e-03f, -3.975396764e-03f, -1.000095977e-02f, -4.088543372e-03f, +7.577389627e-03f, +8.868556972e-03f, +1.235453631e-03f, -2.374290557e-03f, -4.569263083e-04f, +6.482392702e-04f, +7.782722175e-05f, -1.022649092e-04f, + +2.480488287e-03f, -1.308466556e-03f, -9.415465734e-03f, +8.819112678e-03f, +1.793769577e-02f, -2.172781127e-02f, -2.072368548e-02f, +3.215447484e-02f, +1.471408356e-02f, -3.167518068e-02f, -4.992478995e-03f, +2.072848604e-02f, -1.087967433e-03f, -8.082410258e-03f, +1.695266239e-03f, +1.116652464e-03f, + -1.167771603e-04f, +3.192915029e-04f, -4.921800614e-05f, -8.581220787e-04f, +5.951153051e-04f, +1.235777858e-03f, -1.362868279e-03f, -1.052076568e-03f, +1.770841690e-03f, +4.229361746e-04f, -1.468750971e-03f, +1.215789467e-04f, +7.465944404e-04f, -2.477936289e-04f, -1.727133364e-04f, +1.022649092e-04f, + /* 10,11 (16) */ + -2.363711127e-03f, -1.547702728e-03f, +1.584200118e-02f, +1.017722417e-02f, -5.566953191e-02f, -4.429779607e-02f, +1.962297213e-01f, +4.598819279e-01f, +4.004852732e-01f, +1.005594486e-01f, -6.999566805e-02f, -3.293398538e-02f, +1.891801618e-02f, +9.536819441e-03f, -3.390251745e-03f, -1.218917373e-03f, + +1.179488149e-04f, -2.782542523e-04f, -5.818961148e-04f, +1.224702119e-03f, +2.084760450e-03f, -3.713313321e-03f, -9.960590650e-03f, -4.450401542e-03f, +7.312281406e-03f, +9.028924444e-03f, +1.465315904e-03f, -2.376203855e-03f, -5.297496357e-04f, +6.513865162e-04f, +9.550086989e-05f, -1.055960798e-04f, + +2.363711127e-03f, -9.891750530e-04f, -9.464683740e-03f, +7.960990600e-03f, +1.853281107e-02f, -2.049203341e-02f, -2.208655376e-02f, +3.110239827e-02f, +1.648492525e-02f, -3.125224450e-02f, -6.461229966e-03f, +2.085006498e-02f, -3.413729927e-04f, -8.330203887e-03f, +1.522552903e-03f, +1.218917373e-03f, + -1.179488149e-04f, +3.088745889e-04f, -1.630871143e-05f, -8.613170562e-04f, +5.292919751e-04f, +1.279853446e-03f, -1.290319525e-03f, -1.138702179e-03f, +1.729745387e-03f, +5.169367262e-04f, -1.470680684e-03f, +6.028004957e-05f, +7.686550620e-04f, -2.276757550e-04f, -1.878351046e-04f, +1.055960798e-04f, + /* 10,12 (16) */ + -2.245762312e-03f, -1.825956980e-03f, +1.526010506e-02f, +1.140192629e-02f, -5.358477146e-02f, -4.801110939e-02f, +1.862691307e-01f, +4.554315263e-01f, +4.077975546e-01f, +1.095883731e-01f, -6.853035215e-02f, -3.531018923e-02f, +1.838826655e-02f, +1.018820596e-02f, -3.294750876e-03f, -1.324513453e-03f, + +1.185294870e-04f, -2.564600899e-04f, -5.991838751e-04f, +1.146360002e-03f, +2.146564111e-03f, -3.452498969e-03f, -9.906802264e-03f, -4.804915740e-03f, +7.035416094e-03f, +9.178957462e-03f, +1.700176480e-03f, -2.371756599e-03f, -6.039425217e-04f, +6.525742781e-04f, +1.138199136e-04f, -1.086224396e-04f, + +2.245762312e-03f, -6.803004640e-04f, -9.480992451e-03f, +7.099673544e-03f, +1.906210305e-02f, -1.921217996e-02f, -2.337687328e-02f, +2.996369609e-02f, +1.821467064e-02f, -3.073530777e-02f, -7.931910651e-03f, +2.091034503e-02f, +4.272820693e-04f, -8.557879642e-03f, +1.334717798e-03f, +1.324513453e-03f, + -1.185294870e-04f, +2.976527050e-04f, +1.565418526e-05f, -8.616089703e-04f, +4.629383813e-04f, +1.319488243e-03f, -1.214357471e-03f, -1.221754428e-03f, +1.683303591e-03f, +6.101236891e-04f, -1.468040921e-03f, -2.394179827e-06f, +7.886556833e-04f, -2.060273506e-04f, -2.028163947e-04f, +1.086224396e-04f, + /* 10,13 (16) */ + -2.127232825e-03f, -2.082417070e-03f, +1.466092119e-02f, +1.254828629e-02f, -5.143820735e-02f, -5.146360836e-02f, +1.763623284e-01f, +4.506266106e-01f, +4.148329707e-01f, +1.187673305e-01f, -6.683017567e-02f, -3.768194583e-02f, +1.778432403e-02f, +1.084078024e-02f, -3.180930962e-03f, -1.433135893e-03f, + +1.185486646e-04f, -2.348998102e-04f, -6.139330914e-04f, +1.067796108e-03f, +2.200688286e-03f, -3.193423410e-03f, -9.839851015e-03f, -5.151517486e-03f, +6.747196514e-03f, +9.318235891e-03f, +1.939683283e-03f, -2.360741701e-03f, -6.793366042e-04f, +6.517153938e-04f, +1.327466695e-04f, -1.113112967e-04f, + +2.127232825e-03f, -3.826477591e-04f, -9.465338266e-03f, +6.238064573e-03f, +1.952504143e-02f, -1.789269172e-02f, -2.459123075e-02f, +2.874194167e-02f, +1.989797423e-02f, -3.012518409e-02f, -9.399951571e-03f, +2.090795085e-02f, +1.215937753e-03f, -8.763906993e-03f, +1.131901403e-03f, +1.433135893e-03f, + -1.185486646e-04f, +2.856996806e-04f, +4.657921086e-05f, -8.590598665e-04f, +3.962828439e-04f, +1.354603980e-03f, -1.135244995e-03f, -1.300977268e-03f, +1.631647999e-03f, +7.021919452e-04f, -1.460783075e-03f, -6.625514129e-05f, +8.064756664e-04f, -1.828858210e-04f, -2.175863071e-04f, +1.113112967e-04f, + /* 10,14 (16) */ + -2.008684160e-03f, -2.317316880e-03f, +1.404698810e-02f, +1.361608240e-02f, -4.923751906e-02f, -5.465703177e-02f, +1.665224774e-01f, +4.454750931e-01f, +4.215801672e-01f, +1.280855664e-01f, -6.489049238e-02f, -4.004268753e-02f, +1.710498742e-02f, +1.149249563e-02f, -3.048184293e-03f, -1.544447190e-03f, + +1.180367796e-04f, -2.136383358e-04f, -6.261986236e-04f, +9.892376468e-04f, +2.247250669e-03f, -2.936544408e-03f, -9.760016987e-03f, -5.489655306e-03f, +6.448049527e-03f, +9.446356555e-03f, +2.183467104e-03f, -2.342962675e-03f, -7.557542266e-04f, +6.487261338e-04f, +1.522394848e-04f, -1.136298447e-04f, + +2.008684160e-03f, -9.694807848e-05f, -9.418759055e-03f, +5.379004707e-03f, +1.992132427e-02f, -1.653808774e-02f, -2.572647575e-02f, +2.744096440e-02f, +2.152962223e-02f, -2.942299214e-02f, -1.086073465e-02f, +2.084169571e-02f, +2.022413419e-03f, -8.946792814e-03f, +9.143150961e-04f, +1.544447190e-03f, + -1.180367796e-04f, +2.730901122e-04f, +7.638119638e-05f, -8.537407893e-04f, +3.295512676e-04f, +1.385138445e-03f, -1.053253846e-03f, -1.376127726e-03f, +1.574927919e-03f, +7.928379732e-04f, -1.448873803e-03f, -1.311069184e-04f, +8.219998828e-04f, -1.582955729e-04f, -2.320725114e-04f, +1.136298447e-04f, + /* 10,15 (16) */ + -1.890647380e-03f, -2.530955216e-03f, +1.342078947e-02f, +1.460532004e-02f, -4.699026839e-02f, -5.759357618e-02f, +1.567624604e-01f, +4.399854378e-01f, +4.280282167e-01f, +1.375319230e-01f, -6.270702528e-02f, -4.238565021e-02f, +1.634923319e-02f, +1.214122176e-02f, -2.895944808e-03f, -1.658077034e-03f, + +1.170250460e-04f, -1.927368539e-04f, -6.360411123e-04f, +9.109044728e-04f, +2.286383796e-03f, -2.682306906e-03f, -9.667603116e-03f, -5.818795889e-03f, +6.138425198e-03f, +9.562934316e-03f, +2.431142192e-03f, -2.318234387e-03f, -8.330086791e-04f, +6.435265979e-04f, +1.722527379e-04f, -1.155453001e-04f, + +1.890647380e-03f, +1.761420338e-04f, -9.342377859e-03f, +4.525263917e-03f, +2.025087554e-02f, -1.515294930e-02f, -2.677972960e-02f, +2.606483667e-02f, +2.310455015e-02f, -2.863015417e-02f, -1.230960845e-02f, +2.071058879e-02f, +2.844413302e-03f, -9.105088387e-03f, +6.822425847e-04f, +1.658077034e-03f, + -1.170250460e-04f, +2.598990228e-04f, +1.049814675e-04f, -8.457313496e-04f, +2.629663626e-04f, +1.411045545e-03f, -9.686636535e-04f, -1.446976716e-03f, +1.513309805e-03f, +8.817609175e-04f, -1.432295302e-03f, -1.967468878e-04f, +8.351192661e-04f, -1.323080046e-04f, -2.462015281e-04f, +1.155453001e-04f, + /* 10,16 (16) */ + -1.773622334e-03f, -2.723692070e-03f, +1.278474836e-02f, +1.551622452e-02f, -4.470388459e-02f, -6.027588309e-02f, +1.470948573e-01f, +4.341666419e-01f, +4.341666419e-01f, +1.470948573e-01f, -6.027588309e-02f, -4.470388459e-02f, +1.551622452e-02f, +1.278474836e-02f, -2.723692070e-03f, -1.773622334e-03f, + +1.155453001e-04f, -1.722527379e-04f, -6.435265979e-04f, +8.330086791e-04f, +2.318234387e-03f, -2.431142192e-03f, -9.562934316e-03f, -6.138425198e-03f, +5.818795889e-03f, +9.667603116e-03f, +2.682306906e-03f, -2.286383796e-03f, -9.109044728e-04f, +6.360411123e-04f, +1.927368539e-04f, -1.170250460e-04f, + +1.773622334e-03f, +4.360410565e-04f, -9.237396391e-03f, +3.679532568e-03f, +2.051384191e-02f, -1.374190375e-02f, -2.774839325e-02f, +2.461785996e-02f, +2.461785996e-02f, -2.774839325e-02f, -1.374190375e-02f, +2.051384191e-02f, +3.679532568e-03f, -9.237396391e-03f, +4.360410565e-04f, +1.773622334e-03f, + -1.155453001e-04f, +2.462015281e-04f, +1.323080046e-04f, -8.351192661e-04f, +1.967468878e-04f, +1.432295302e-03f, -8.817609175e-04f, -1.513309805e-03f, +1.446976716e-03f, +9.686636535e-04f, -1.411045545e-03f, -2.629663626e-04f, +8.457313496e-04f, -1.049814675e-04f, -2.598990228e-04f, +1.170250460e-04f, + /* 10,17 (16) */ + -1.658077034e-03f, -2.895944808e-03f, +1.214122176e-02f, +1.634923319e-02f, -4.238565021e-02f, -6.270702528e-02f, +1.375319230e-01f, +4.280282167e-01f, +4.399854378e-01f, +1.567624604e-01f, -5.759357618e-02f, -4.699026839e-02f, +1.460532004e-02f, +1.342078947e-02f, -2.530955216e-03f, -1.890647380e-03f, + +1.136298447e-04f, -1.522394848e-04f, -6.487261338e-04f, +7.557542266e-04f, +2.342962675e-03f, -2.183467104e-03f, -9.446356555e-03f, -6.448049527e-03f, +5.489655306e-03f, +9.760016987e-03f, +2.936544408e-03f, -2.247250669e-03f, -9.892376468e-04f, +6.261986236e-04f, +2.136383358e-04f, -1.180367796e-04f, + +1.658077034e-03f, +6.822425847e-04f, -9.105088387e-03f, +2.844413302e-03f, +2.071058879e-02f, -1.230960845e-02f, -2.863015417e-02f, +2.310455015e-02f, +2.606483667e-02f, -2.677972960e-02f, -1.515294930e-02f, +2.025087554e-02f, +4.525263917e-03f, -9.342377859e-03f, +1.761420338e-04f, +1.890647380e-03f, + -1.136298447e-04f, +2.320725114e-04f, +1.582955729e-04f, -8.219998828e-04f, +1.311069184e-04f, +1.448873803e-03f, -7.928379732e-04f, -1.574927919e-03f, +1.376127726e-03f, +1.053253846e-03f, -1.385138445e-03f, -3.295512676e-04f, +8.537407893e-04f, -7.638119638e-05f, -2.730901122e-04f, +1.180367796e-04f, + /* 10,18 (16) */ + -1.544447190e-03f, -3.048184293e-03f, +1.149249563e-02f, +1.710498742e-02f, -4.004268753e-02f, -6.489049238e-02f, +1.280855664e-01f, +4.215801672e-01f, +4.454750931e-01f, +1.665224774e-01f, -5.465703177e-02f, -4.923751906e-02f, +1.361608240e-02f, +1.404698810e-02f, -2.317316880e-03f, -2.008684160e-03f, + +1.113112967e-04f, -1.327466695e-04f, -6.517153938e-04f, +6.793366042e-04f, +2.360741701e-03f, -1.939683283e-03f, -9.318235891e-03f, -6.747196514e-03f, +5.151517486e-03f, +9.839851015e-03f, +3.193423410e-03f, -2.200688286e-03f, -1.067796108e-03f, +6.139330914e-04f, +2.348998102e-04f, -1.185486646e-04f, + +1.544447190e-03f, +9.143150961e-04f, -8.946792814e-03f, +2.022413419e-03f, +2.084169571e-02f, -1.086073465e-02f, -2.942299214e-02f, +2.152962223e-02f, +2.744096440e-02f, -2.572647575e-02f, -1.653808774e-02f, +1.992132427e-02f, +5.379004707e-03f, -9.418759055e-03f, -9.694807848e-05f, +2.008684160e-03f, + -1.113112967e-04f, +2.175863071e-04f, +1.828858210e-04f, -8.064756664e-04f, +6.625514129e-05f, +1.460783075e-03f, -7.021919452e-04f, -1.631647999e-03f, +1.300977268e-03f, +1.135244995e-03f, -1.354603980e-03f, -3.962828439e-04f, +8.590598665e-04f, -4.657921086e-05f, -2.856996806e-04f, +1.185486646e-04f, + /* 10,19 (16) */ + -1.433135893e-03f, -3.180930962e-03f, +1.084078024e-02f, +1.778432403e-02f, -3.768194583e-02f, -6.683017567e-02f, +1.187673305e-01f, +4.148329707e-01f, +4.506266106e-01f, +1.763623284e-01f, -5.146360836e-02f, -5.143820735e-02f, +1.254828629e-02f, +1.466092119e-02f, -2.082417070e-03f, -2.127232825e-03f, + +1.086224396e-04f, -1.138199136e-04f, -6.525742781e-04f, +6.039425217e-04f, +2.371756599e-03f, -1.700176480e-03f, -9.178957462e-03f, -7.035416094e-03f, +4.804915740e-03f, +9.906802264e-03f, +3.452498969e-03f, -2.146564111e-03f, -1.146360002e-03f, +5.991838751e-04f, +2.564600899e-04f, -1.185294870e-04f, + +1.433135893e-03f, +1.131901403e-03f, -8.763906993e-03f, +1.215937753e-03f, +2.090795085e-02f, -9.399951571e-03f, -3.012518409e-02f, +1.989797423e-02f, +2.874194167e-02f, -2.459123075e-02f, -1.789269172e-02f, +1.952504143e-02f, +6.238064573e-03f, -9.465338266e-03f, -3.826477591e-04f, +2.127232825e-03f, + -1.086224396e-04f, +2.028163947e-04f, +2.060273506e-04f, -7.886556833e-04f, +2.394179827e-06f, +1.468040921e-03f, -6.101236891e-04f, -1.683303591e-03f, +1.221754428e-03f, +1.214357471e-03f, -1.319488243e-03f, -4.629383813e-04f, +8.616089703e-04f, -1.565418526e-05f, -2.976527050e-04f, +1.185294870e-04f, + /* 10,20 (16) */ + -1.324513453e-03f, -3.294750876e-03f, +1.018820596e-02f, +1.838826655e-02f, -3.531018923e-02f, -6.853035215e-02f, +1.095883731e-01f, +4.077975546e-01f, +4.554315263e-01f, +1.862691307e-01f, -4.801110939e-02f, -5.358477146e-02f, +1.140192629e-02f, +1.526010506e-02f, -1.825956980e-03f, -2.245762312e-03f, + +1.055960798e-04f, -9.550086989e-05f, -6.513865162e-04f, +5.297496357e-04f, +2.376203855e-03f, -1.465315904e-03f, -9.028924444e-03f, -7.312281406e-03f, +4.450401542e-03f, +9.960590650e-03f, +3.713313321e-03f, -2.084760450e-03f, -1.224702119e-03f, +5.818961148e-04f, +2.782542523e-04f, -1.179488149e-04f, + +1.324513453e-03f, +1.334717798e-03f, -8.557879642e-03f, +4.272820693e-04f, +2.091034503e-02f, -7.931910651e-03f, -3.073530777e-02f, +1.821467064e-02f, +2.996369609e-02f, -2.337687328e-02f, -1.921217996e-02f, +1.906210305e-02f, +7.099673544e-03f, -9.480992451e-03f, -6.803004640e-04f, +2.245762312e-03f, + -1.055960798e-04f, +1.878351046e-04f, +2.276757550e-04f, -7.686550620e-04f, -6.028004957e-05f, +1.470680684e-03f, -5.169367262e-04f, -1.729745387e-03f, +1.138702179e-03f, +1.290319525e-03f, -1.279853446e-03f, -5.292919751e-04f, +8.613170562e-04f, +1.630871143e-05f, -3.088745889e-04f, +1.179488149e-04f, + /* 10,21 (16) */ + -1.218917373e-03f, -3.390251745e-03f, +9.536819441e-03f, +1.891801618e-02f, -3.293398538e-02f, -6.999566805e-02f, +1.005594486e-01f, +4.004852732e-01f, +4.598819279e-01f, +1.962297213e-01f, -4.429779607e-02f, -5.566953191e-02f, +1.017722417e-02f, +1.584200118e-02f, -1.547702728e-03f, -2.363711127e-03f, + +1.022649092e-04f, -7.782722175e-05f, -6.482392702e-04f, +4.569263083e-04f, +2.374290557e-03f, -1.235453631e-03f, -8.868556972e-03f, -7.577389627e-03f, +4.088543372e-03f, +1.000095977e-02f, +3.975396764e-03f, -2.015175068e-03f, -1.302588329e-03f, +5.620211061e-04f, +3.002137339e-04f, -1.167771603e-04f, + +1.218917373e-03f, +1.522552903e-03f, -8.330203887e-03f, -3.413729927e-04f, +2.085006498e-02f, -6.461229966e-03f, -3.125224450e-02f, +1.648492525e-02f, +3.110239827e-02f, -2.208655376e-02f, -2.049203341e-02f, +1.853281107e-02f, +7.960990600e-03f, -9.464683740e-03f, -9.891750530e-04f, +2.363711127e-03f, + -1.022649092e-04f, +1.727133364e-04f, +2.477936289e-04f, -7.465944404e-04f, -1.215789467e-04f, +1.468750971e-03f, -4.229361746e-04f, -1.770841690e-03f, +1.052076568e-03f, +1.362868279e-03f, -1.235777858e-03f, -5.951153051e-04f, +8.581220787e-04f, +4.921800614e-05f, -3.192915029e-04f, +1.167771603e-04f, + /* 10,22 (16) */ + -1.116652464e-03f, -3.468078967e-03f, +8.888580171e-03f, +1.937494249e-02f, -3.055969482e-02f, -7.123112168e-02f, +9.169089164e-02f, +3.929078835e-01f, +4.639704712e-01f, +2.062306811e-01f, -4.032239931e-02f, -5.768470697e-02f, +8.874635839e-03f, +1.640402228e-02f, -1.247488994e-03f, -2.480488287e-03f, + +9.866137243e-05f, -6.083269664e-05f, -6.432227382e-04f, +3.856313990e-04f, +2.366233621e-03f, -1.010924051e-03f, -8.698291032e-03f, -7.830362763e-03f, +3.719925523e-03f, +1.002767770e-02f, +4.238268581e-03f, -1.937721785e-03f, -1.379778048e-03f, +5.395166645e-04f, +3.222664415e-04f, -1.149861436e-04f, + +1.116652464e-03f, +1.695266239e-03f, -8.082410258e-03f, -1.087967433e-03f, +2.072848604e-02f, -4.992478995e-03f, -3.167518068e-02f, +1.471408356e-02f, +3.215447484e-02f, -2.072368548e-02f, -2.172781127e-02f, +1.793769577e-02f, +8.819112678e-03f, -9.415465734e-03f, -1.308466556e-03f, +2.480488287e-03f, + -9.866137243e-05f, +1.575202906e-04f, +2.663505488e-04f, -7.225994014e-04f, -1.813218010e-04f, +1.462315310e-03f, -3.284276817e-04f, -1.806478830e-03f, +9.621458585e-04f, +1.431750689e-03f, -1.187355687e-03f, -6.601784345e-04f, +8.519713973e-04f, +8.297614255e-05f, -3.288307295e-04f, +1.149861436e-04f, + /* 10,23 (16) */ + -1.017991092e-03f, -3.528911664e-03f, +8.245357433e-03f, +1.976057389e-02f, -2.819346120e-02f, -7.224204573e-02f, +8.299260061e-02f, +3.850775208e-01f, +4.676903968e-01f, +2.162583588e-01f, -3.608413073e-02f, -5.962242876e-02f, +7.494857790e-03f, +1.694353895e-02f, -9.252225525e-04f, -2.595474431e-03f, + +9.481754058e-05f, -4.454709359e-05f, -6.364297606e-04f, +3.160140896e-04f, +2.352259019e-03f, -7.920433793e-04f, -8.518577317e-03f, -8.070848366e-03f, +3.345146859e-03f, +1.004053766e-02f, +4.501438001e-03f, -1.852331041e-03f, -1.456024734e-03f, +5.143474809e-04f, +3.443368801e-04f, -1.125486598e-04f, + +1.017991092e-03f, +1.852786530e-03f, -7.816059709e-03f, -1.810566834e-03f, +2.054716424e-02f, -3.530163685e-03f, -3.200360836e-02f, +1.290760473e-02f, +3.311662070e-02f, -1.929193479e-02f, -2.291516695e-02f, +1.727751733e-02f, +9.671084076e-03f, -9.332489591e-03f, -1.637297285e-03f, +2.595474431e-03f, + -9.481754058e-05f, +1.423232151e-04f, +2.833230255e-04f, -6.967999002e-04f, -2.393363273e-04f, +1.451451769e-03f, -2.337163610e-04f, -1.836561498e-03f, +8.691896187e-04f, +1.496724481e-03f, -1.134696899e-03f, -7.242506242e-04f, +8.428221511e-04f, +1.174797317e-04f, -3.374210131e-04f, +1.125486598e-04f, + /* 10,24 (16) */ + -9.231735512e-04f, -3.573458757e-03f, +7.608927672e-03f, +2.007658798e-02f, -2.584120218e-02f, -7.303408911e-02f, +7.447402330e-02f, +3.770066724e-01f, +4.710355436e-01f, +2.262988964e-01f, -3.158269273e-02f, -6.147475980e-02f, +6.038833057e-03f, +1.745788643e-02f, -5.808856724e-04f, -2.708023090e-03f, + +9.076499098e-05f, -2.899632408e-05f, -6.279554292e-04f, +2.482137416e-04f, +2.332600989e-03f, -5.791092179e-04f, -8.329880069e-03f, -8.298520195e-03f, +2.964819543e-03f, +1.003935877e-02f, +4.764405202e-03f, -1.758950422e-03f, -1.531076411e-03f, +4.864854650e-04f, +3.663462974e-04f, -1.094390454e-04f, + +9.231735512e-04f, +1.995109745e-03f, -7.532736684e-03f, -2.507366735e-03f, +2.030782791e-02f, -2.078711917e-03f, -3.223732472e-02f, +1.107104324e-02f, +3.398581032e-02f, -1.779521031e-02f, -2.404986385e-02f, +1.655326671e-02f, +1.051390623e-02f, -9.215009859e-03f, -1.974718299e-03f, +2.708023090e-03f, + -9.076499098e-05f, +1.271871667e-04f, +2.986944284e-04f, -6.693296845e-04f, -2.954591628e-04f, +1.436252516e-03f, -1.391057373e-04f, -1.861013029e-03f, +7.734977779e-04f, +1.557559045e-03f, -1.077926982e-03f, -7.871011619e-04f, +8.306416028e-04f, +1.526198322e-04f, -3.449929113e-04f, +1.094390454e-04f, + /* 10,25 (16) */ + -8.324085603e-04f, -3.602455082e-03f, +6.980972243e-03f, +2.032480172e-02f, -2.350860119e-02f, -7.361319833e-02f, +6.614414323e-02f, +3.687081522e-01f, +4.740003632e-01f, +2.363382552e-01f, -2.681828752e-02f, -6.323371022e-02f, +4.507756646e-03f, +1.794437189e-02f, -2.145393750e-04f, -2.817462136e-03f, + +8.653469341e-05f, -1.420246565e-05f, -6.178967014e-04f, +1.823597859e-04f, +2.307501240e-03f, -3.724001658e-04f, -8.132675892e-03f, -8.513078807e-03f, +2.579567730e-03f, +1.002398658e-02f, +5.026662348e-03f, -1.657545151e-03f, -1.604676229e-03f, +4.559100754e-04f, +3.882128445e-04f, -1.056332458e-04f, + +8.324085603e-04f, +2.122296911e-03f, -7.234042255e-03f, -3.176696419e-03f, +2.001236875e-02f, -6.424594009e-04f, -3.237643046e-02f, +9.210030208e-03f, +3.475930809e-02f, -1.623765126e-02f, -2.512779083e-02f, +1.576616555e-02f, +1.134454783e-02f, -9.062390027e-03f, -2.319711210e-03f, +2.817462136e-03f, + -8.653469341e-05f, +1.121747884e-04f, +3.124548839e-04f, -6.403257102e-04f, -3.495363225e-04f, +1.416823338e-03f, -4.489670547e-05f, -1.879775612e-03f, +6.753696396e-04f, +1.614036301e-03f, -1.017186649e-03f, -8.485002010e-04f, +8.154074480e-04f, +1.882822589e-04f, -3.514791479e-04f, +1.056332458e-04f, + /* 10,26 (16) */ + -7.458738668e-04f, -3.616657547e-03f, +6.363075541e-03f, +2.050716151e-02f, -2.120109995e-02f, -7.398559850e-02f, +5.801146733e-02f, +3.601950734e-01f, +4.765799309e-01f, +2.463622418e-01f, -2.179162518e-02f, -6.489125537e-02f, +2.903080417e-03f, +1.840028197e-02f, +1.736734695e-04f, -2.923095382e-03f, + +8.215690319e-05f, -1.838277482e-07f, -6.063520191e-04f, +1.185716446e-04f, +2.277208161e-03f, -1.721754883e-04f, -7.927452544e-03f, -8.714252086e-03f, +2.190026227e-03f, +9.994293679e-03f, +5.287694653e-03f, -1.548098546e-03f, -1.676563037e-03f, +4.226086362e-04f, +4.098517539e-04f, -1.011089827e-04f, + +7.458738668e-04f, +2.234471700e-03f, -6.921587371e-03f, -3.817022129e-03f, +1.966283242e-02f, +7.743639368e-04f, -3.242132716e-02f, +7.330254596e-03f, +3.543467773e-02f, -1.462361496e-02f, -2.614497748e-02f, +1.491766535e-02f, +1.215995528e-02f, -8.874107768e-03f, -2.671190358e-03f, +2.923095382e-03f, + -8.215690319e-05f, +9.734610367e-05f, +3.246011477e-04f, -6.099275555e-04f, -4.014236137e-04f, +1.393283111e-03f, +4.861349538e-05f, -1.892810425e-03f, +5.751128615e-04f, +1.665951517e-03f, -9.526314781e-04f, -9.082196071e-04f, +7.971080899e-04f, +2.243479199e-04f, -3.568149648e-04f, +1.011089827e-04f, + /* 10,27 (16) */ + -6.637169637e-04f, -3.616841375e-03f, +5.756723522e-03f, +2.062573315e-02f, -1.892389179e-02f, -7.415777398e-02f, +5.008401479e-02f, +3.514808213e-01f, +4.787699571e-01f, +2.563565355e-01f, -1.650393052e-02f, -6.643935392e-02f, +1.226517379e-03f, +1.882289061e-02f, +5.835252234e-04f, -3.024204364e-03f, + +7.766106117e-05f, +1.304497082e-05f, -5.934209358e-04f, +5.695868450e-05f, +2.241976012e-03f, +2.132516203e-05f, -7.714707724e-03f, -8.901795703e-03f, +1.796839128e-03f, +9.950180138e-03f, +5.546981485e-03f, -1.430612432e-03f, -1.746471999e-03f, +3.865766366e-04f, +4.311755333e-04f, -9.584591995e-05f, + +6.637169637e-04f, +2.331817803e-03f, -6.596986224e-03f, -4.426949685e-03f, +1.926140881e-02f, +2.167647048e-03f, -3.237271367e-02f, +5.437444172e-03f, +3.600979060e-02f, -1.295766345e-02f, -2.709760896e-02f, +1.400944574e-02f, +1.295706337e-02f, -8.649759848e-03f, -3.028005322e-03f, +3.024204364e-03f, + -7.766106117e-05f, +8.275832759e-05f, +3.351364524e-04f, -5.782768362e-04f, -4.509870073e-04f, +1.365763233e-03f, +1.411322875e-04f, -1.900097714e-03f, +4.730424052e-04f, +1.713114085e-03f, -8.844315071e-04f, -9.660338085e-04f, +7.757428758e-04f, +2.606931803e-04f, -3.609384715e-04f, +9.584591995e-05f, + /* 10,28 (16) */ + -5.860559025e-04f, -3.603796404e-03f, +5.163302586e-03f, +2.068269184e-02f, -1.668191578e-02f, -7.413644882e-02f, +4.236930707e-02f, +3.425790256e-01f, +4.805667962e-01f, +2.663067156e-01f, -1.095694904e-02f, -6.786996635e-02f, -5.199546196e-04f, +1.920946724e-02f, +1.014700757e-03f, -3.120050284e-03f, + +7.307570094e-05f, +2.547291348e-05f, -5.792037504e-04f, -2.379799119e-06f, +2.202064135e-03f, +2.078819698e-04f, -7.494947831e-03f, -9.075493508e-03f, +1.400658425e-03f, +9.891573978e-03f, +5.803997492e-03f, -1.305107515e-03f, -1.814135217e-03f, +3.478180146e-04f, +4.520941759e-04f, -8.982582867e-05f, + +5.860559025e-04f, +2.414576131e-03f, -6.261849771e-03f, -5.005226521e-03f, +1.881042180e-02f, +3.533410282e-03f, -3.223158138e-02f, +3.537346458e-03f, +3.648283300e-02f, -1.124454936e-02f, -2.798204047e-02f, +1.304341193e-02f, +1.373280624e-02f, -8.389066668e-03f, -3.388943794e-03f, +3.120050284e-03f, + -7.307570094e-05f, +6.846569569e-05f, +3.440703317e-04f, -5.455166228e-04f, -4.981029650e-04f, +1.334407010e-03f, +2.323727364e-04f, -1.901636797e-03f, +3.694794580e-04f, +1.755348252e-03f, -8.127707584e-04f, -1.021720648e-03f, +7.513222962e-04f, +2.971902528e-04f, -3.637909909e-04f, +8.982582867e-05f, + /* 10,29 (16) */ + -5.129802015e-04f, -3.578323491e-03f, +4.584098836e-03f, +2.068031204e-02f, -1.447985165e-02f, -7.392856685e-02f, +3.487435924e-02f, +3.335035321e-01f, +4.819674547e-01f, +2.761982896e-01f, -5.152951546e-03f, -6.917507387e-02f, -2.334089837e-03f, +1.955728526e-02f, +1.466794933e-03f, -3.209876113e-03f, + +6.842836328e-05f, +3.709248724e-05f, -5.638011503e-04f, -5.935456784e-05f, +2.157736154e-03f, +3.872951273e-04f, -7.268686731e-03f, -9.235157855e-03f, +1.002142602e-03f, +9.818431511e-03f, +6.058213755e-03f, -1.171623711e-03f, -1.879282395e-03f, +3.063454208e-04f, +4.725153862e-04f, -8.303274900e-05f, + +5.129802015e-04f, +2.483041827e-03f, -5.917779440e-03f, -5.550743144e-03f, +1.831231884e-02f, +4.867817292e-03f, -3.199920864e-02f, +1.635709661e-03f, +3.685231246e-02f, -9.489201110e-03f, -2.879481123e-02f, +1.202169128e-02f, +1.448412854e-02f, -8.091876415e-03f, -3.752734785e-03f, +3.209876113e-03f, + -6.842836328e-05f, +5.451931058e-05f, +3.514184228e-04f, -5.117908634e-04f, -5.426587225e-04f, +1.299369010e-03f, +3.220545052e-04f, -1.897446001e-03f, +2.647503330e-04f, +1.792493798e-03f, -7.378467177e-04f, -1.075062234e-03f, +7.238681425e-04f, +3.337076127e-04f, -3.653173998e-04f, +8.303274900e-05f, + /* 10,30 (16) */ + -4.445518383e-04f, -3.541231003e-03f, +4.020297686e-03f, +2.062095747e-02f, -1.232211549e-02f, -7.354127172e-02f, +2.760567250e-02f, +3.242683743e-01f, +4.829695973e-01f, +2.860167211e-01f, +9.052622097e-04f, -7.034669758e-02f, -4.213372232e-03f, +1.986363068e-02f, +1.939310319e-03f, -3.292908862e-03f, + +6.374551801e-05f, +4.789957434e-05f, -5.473138646e-04f, -1.138863962e-04f, +2.109259184e-03f, +5.593849512e-04f, -7.036444507e-03f, -9.380629856e-03f, +6.019552073e-04f, +9.730737638e-03f, +6.309098964e-03f, -1.030220430e-03f, -1.941641510e-03f, +2.621804636e-04f, +4.923448224e-04f, -7.545314953e-05f, + +4.445518383e-04f, +2.537561137e-03f, -5.566361017e-03f, -6.062534007e-03f, +1.776966011e-02f, +6.167186302e-03f, -3.167715414e-02f, -2.617363403e-04f, +3.711706279e-02f, -7.696707312e-03f, -2.953265794e-02f, +1.094662905e-02f, +1.520799668e-02f, -7.758168803e-03f, -4.118052185e-03f, +3.292908862e-03f, + -6.374551801e-05f, +4.096700691e-05f, +3.572022469e-04f, -4.772438143e-04f, -5.845525278e-04f, +1.260814382e-03f, +4.099047792e-04f, -1.887562529e-03f, +1.591853495e-04f, +1.824406662e-03f, -6.598697561e-04f, -1.125845779e-03f, +6.934136248e-04f, +3.701104367e-04f, -3.654664619e-04f, +7.545314953e-05f, + /* 10,31 (16) */ + -3.808063202e-04f, -3.493331429e-03f, +3.472983821e-03f, +2.050707107e-02f, -1.021285631e-02f, -7.298188677e-02f, +2.056922800e-02f, +3.148877444e-01f, +4.835715525e-01f, +2.957474587e-01f, +7.214361174e-03f, -7.137691801e-02f, -6.155013742e-03f, +2.012581114e-02f, +2.431655141e-03f, -3.368362011e-03f, + +5.905249340e-05f, +5.789333512e-05f, -5.298423273e-04f, -1.659059994e-04f, +2.056903051e-03f, +7.239919468e-04f, -6.798746210e-03f, -9.511779562e-03f, +2.007634162e-04f, +9.628506085e-03f, +6.556120613e-03f, -8.809768187e-04f, -2.000939515e-03f, +2.153539325e-04f, +5.114863527e-04f, -6.707608258e-05f, + +3.808063202e-04f, +2.578528144e-03f, -5.209158770e-03f, -6.539777822e-03f, +1.718510759e-02f, +7.428000684e-03f, -3.126724936e-02f, -2.149298869e-03f, +3.727624814e-02f, -5.872300650e-03f, -3.019252770e-02f, +9.820783271e-03f, +1.590141031e-02f, -7.388058366e-03f, -4.483518646e-03f, +3.368362011e-03f, + -5.905249340e-05f, +2.785323460e-05f, +3.614489713e-04f, -4.420194799e-04f, -6.236938338e-04f, +1.218918145e-03f, +4.956591564e-04f, -1.872042266e-03f, +5.311769911e-05f, +1.850959514e-03f, -5.790625007e-04f, -1.173864442e-03f, +6.600034460e-04f, +4.062610643e-04f, -3.641911522e-04f, +6.707608258e-05f, + /* 11, 0 (16) */ + +0.000000000e+00f, -1.904568305e-03f, +1.335936777e-02f, +8.405460496e-03f, -6.361097600e-02f, -1.700110841e-02f, +3.013546237e-01f, +5.211016817e-01f, +3.013546237e-01f, -1.700110841e-02f, -6.361097600e-02f, +8.405460496e-03f, +1.335936777e-02f, -1.904568305e-03f, -8.290567151e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.472952004e-04f, -6.216149968e-04f, +1.340936069e-03f, +2.054841261e-03f, -5.977058112e-03f, -1.147946560e-02f, -2.538811153e-04f, +1.138382183e-02f, +6.303087054e-03f, -1.942910092e-03f, -1.433209217e-03f, +6.079254793e-04f, +1.683933560e-04f, -8.574656972e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.480522463e-03f, -4.775743118e-03f, +1.308464897e-02f, +8.314368759e-03f, -2.916003915e-02f, -4.410825970e-03f, +3.732936584e-02f, -4.410825970e-03f, -2.916003915e-02f, +8.314368759e-03f, +1.308464897e-02f, -4.775743118e-03f, -2.480522463e-03f, +5.676567717e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.049849662e-04f, -2.302028513e-04f, -5.952533556e-04f, +1.005669730e-03f, +6.331246402e-04f, -1.832946003e-03f, -5.432457122e-05f, +1.858153918e-03f, -5.546741618e-04f, -1.053408101e-03f, +5.713413495e-04f, +2.581574779e-04f, -2.078822347e-04f, +1.346620625e-05f, +0.000000000e+00f, + /* 11, 1 (16) */ + +0.000000000e+00f, -2.051863505e-03f, +1.273775278e-02f, +9.746396564e-03f, -6.155613474e-02f, -2.297816653e-02f, +2.898751581e-01f, +5.208478006e-01f, +3.127384455e-01f, -1.069802136e-02f, -6.555388609e-02f, +6.972251279e-03f, +1.396729325e-02f, -1.736174949e-03f, -9.148032848e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.268783605e-04f, -6.322909003e-04f, +1.248227886e-03f, +2.156066209e-03f, -5.649229208e-03f, -1.155514430e-02f, -7.611405568e-04f, +1.126819238e-02f, +6.626539728e-03f, -1.820199333e-03f, -1.524706656e-03f, +5.911302105e-04f, +1.901116177e-04f, -8.886658125e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.275537496e-03f, -5.005945970e-03f, +1.248939562e-02f, +9.320038489e-03f, -2.852691451e-02f, -6.243771973e-03f, +3.727504127e-02f, -2.552672051e-03f, -2.971471331e-02f, +7.260960658e-03f, +1.365599032e-02f, -4.517585640e-03f, -2.688404697e-03f, +5.811229779e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.012967661e-04f, -2.024810993e-04f, -6.164173868e-04f, +9.556137271e-04f, +7.085417387e-04f, -1.802172594e-03f, -1.627936759e-04f, +1.877678504e-03f, -4.734211408e-04f, -1.098614544e-03f, +5.446973254e-04f, +2.862363067e-04f, -2.099357034e-04f, +9.129372137e-06f, +0.000000000e+00f, + /* 11, 2 (16) */ + +0.000000000e+00f, -2.178741866e-03f, +1.210546188e-02f, +1.099462445e-02f, -5.940006853e-02f, -2.862739573e-02f, +2.783200138e-01f, +5.200866601e-01f, +3.240066379e-01f, -4.071481631e-03f, -6.737408542e-02f, +5.447544623e-03f, +1.455842346e-02f, -1.546063331e-03f, -1.003669866e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.071979865e-04f, -6.400530335e-04f, +1.155414253e-03f, +2.246685944e-03f, -5.320367038e-03f, -1.161092531e-02f, -1.266892935e-03f, +1.113260386e-02f, +6.946632226e-03f, -1.686664137e-03f, -1.615077431e-03f, +5.711454312e-04f, +2.123827275e-04f, -9.161179782e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.074240730e-03f, -5.208427069e-03f, +1.187297823e-02f, +1.027565222e-02f, -2.781837277e-02f, -8.045944567e-03f, +3.711224759e-02f, -6.749935475e-04f, -3.018813445e-02f, +6.162346114e-03f, +1.420068765e-02f, -4.231349334e-03f, -2.898340401e-03f, +5.902523501e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.968722212e-04f, -1.750964586e-04f, -6.348285654e-04f, +9.034591676e-04f, +7.807080980e-04f, -1.765970402e-03f, -2.707233287e-04f, +1.891421339e-03f, -3.896091618e-04f, -1.141080469e-03f, +5.153485024e-04f, +3.143265902e-04f, -2.110945529e-04f, +4.369440610e-06f, +0.000000000e+00f, + /* 11, 3 (16) */ + +0.000000000e+00f, -2.285939852e-03f, +1.146540884e-02f, +1.215003870e-02f, -5.715338258e-02f, -3.394776277e-02f, +2.667090885e-01f, +5.188197671e-01f, +3.351392418e-01f, +2.875150595e-03f, -6.906074956e-02f, +3.832467192e-03f, +1.512956889e-02f, -1.333680604e-03f, -1.095281664e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.830318502e-05f, -6.450082674e-04f, +1.062812921e-03f, +2.326828164e-03f, -4.991226734e-03f, -1.164692223e-02f, -1.770137883e-03f, +1.097713031e-02f, +7.262575094e-03f, -1.542288980e-03f, -1.703961170e-03f, +5.478964219e-04f, +2.351334187e-04f, -9.393860917e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.877368509e-03f, -5.383523527e-03f, +1.123814966e-02f, +1.117911138e-02f, -2.703766467e-02f, -9.811914969e-03f, +3.684152426e-02f, +1.216427791e-03f, -3.057774361e-02f, +5.021265645e-03f, +1.471603615e-02f, -3.917022743e-03f, -3.109434954e-03f, +5.946217907e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.917673084e-04f, -1.481483990e-04f, -6.504928668e-04f, +8.494289867e-04f, +8.494205068e-04f, -1.724494415e-03f, -3.777560982e-04f, +1.899303879e-03f, -3.034937685e-04f, -1.180603899e-03f, +4.833335002e-04f, +3.423118946e-04f, -2.113103429e-04f, -8.081390693e-07f, +0.000000000e+00f, + /* 11, 4 (16) */ + +0.000000000e+00f, -2.374243037e-03f, +1.082040057e-02f, +1.321285162e-02f, -5.482655442e-02f, -3.893898951e-02f, +2.550621663e-01f, +5.170496292e-01f, +3.461163721e-01f, +1.013772569e-02f, -7.060303854e-02f, +2.128506022e-03f, +1.567746532e-02f, -1.098547185e-03f, -1.189220273e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.023706188e-05f, -6.472698169e-04f, +9.707291231e-04f, +2.396646241e-03f, -4.662549978e-03f, -1.166329422e-02f, -2.269881533e-03f, +1.080189342e-02f, +7.573575436e-03f, -1.387088395e-03f, -1.790989004e-03f, +5.213181517e-04f, +2.582844834e-04f, -9.580329841e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.685601201e-03f, -5.531671926e-03f, +1.058765680e-02f, +1.202854037e-02f, -2.618824416e-02f, -1.153640938e-02f, +3.646376817e-02f, +3.115731670e-03f, -3.088123738e-02f, +3.840661746e-03f, +1.519936965e-02f, -3.574710849e-03f, -3.320745296e-03f, +5.938136516e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.860390689e-04f, -1.217313216e-04f, -6.634268523e-04f, +7.937490495e-04f, +9.144905107e-04f, -1.677917215e-03f, -4.835378479e-04f, +1.901267847e-03f, -2.153416212e-04f, -1.216990366e-03f, +4.487024310e-04f, +3.700725160e-04f, -2.105373403e-04f, -6.395100902e-06f, +0.000000000e+00f, + /* 11, 5 (16) */ + +0.000000000e+00f, -2.444480099e-03f, +1.017313076e-02f, +1.418358075e-02f, -5.242990818e-02f, -4.360153948e-02f, +2.433988720e-01f, +5.147797477e-01f, +3.569182655e-01f, +1.771130113e-02f, -7.199012694e-02f, +3.375170173e-04f, +1.619878347e-02f, -8.402627015e-04f, -1.285023571e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.303678911e-05f, -6.469565560e-04f, +8.794549476e-04f, +2.456318153e-03f, -4.335063175e-03f, -1.166024520e-02f, -2.765139089e-03f, +1.060706251e-02f, +7.878839049e-03f, -1.221107623e-03f, -1.875784547e-03f, +4.913559109e-04f, +2.817508714e-04f, -9.716227592e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.499562132e-03f, -5.653403248e-03f, +9.924229945e-03f, +1.282228942e-02f, -2.527375365e-02f, -1.321432660e-02f, +3.598023032e-02f, +5.016999518e-03f, -3.109657900e-02f, +2.623671381e-03f, +1.564807208e-02f, -3.204638333e-03f, -3.531282637e-03f, +5.874185507e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.797452882e-04f, -9.593428836e-05f, -6.736573625e-04f, +7.366472271e-04f, +9.757449570e-04f, -1.626428246e-03f, -5.877190360e-04f, +1.897275544e-03f, -1.254296023e-04f, -1.250053791e-03f, +4.115169448e-04f, +3.974859214e-04f, -2.087328446e-04f, -1.238029514e-05f, +0.000000000e+00f, + /* 11, 6 (16) */ + +0.000000000e+00f, -2.497516888e-03f, +9.526174202e-03f, +1.506303569e-02f, -4.997359003e-02f, -4.793660266e-02f, +2.317386268e-01f, +5.120146086e-01f, +3.675253280e-01f, +2.559014017e-02f, -7.321123456e-02f, -1.538267530e-03f, +1.669013938e-02f, -5.585118301e-04f, -1.382185847e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.673369658e-05f, -6.441923343e-04f, +7.892687808e-04f, +2.506045352e-03f, -4.009475700e-03f, -1.163802289e-02f, -3.254937370e-03f, +1.039285442e-02f, +8.177572597e-03f, -1.044423172e-03f, -1.957964918e-03f, +4.579659243e-04f, +3.054418175e-04f, -9.797232276e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.319816844e-03f, -5.749337536e-03f, +9.250572582e-03f, +1.355893665e-02f, -2.429800870e-02f, -1.484075485e-02f, +3.539251128e-02f, +6.914275062e-03f, -3.122200860e-02f, +1.373617589e-03f, +1.605958902e-02f, -2.807152411e-03f, -3.740015481e-03f, +5.750382556e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.729441808e-04f, -7.084078296e-05f, -6.812211733e-04f, +6.783524775e-04f, +1.033026473e-03f, -1.570233017e-03f, -6.899559970e-04f, +1.887310081e-03f, -3.404387314e-05f, -1.279617346e-03f, +3.718502256e-04f, +4.244272151e-04f, -2.058575066e-04f, -1.874963546e-05f, +0.000000000e+00f, + /* 11, 7 (16) */ + +0.000000000e+00f, -2.534250585e-03f, +8.881981867e-03f, +1.585230448e-02f, -4.746754467e-02f, -5.194607836e-02f, +2.201006040e-01f, +5.087596713e-01f, +3.779181824e-01f, +3.376771277e-02f, -7.425565773e-02f, -3.496232448e-03f, +1.714810530e-02f, -2.530700126e-04f, -1.480158170e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.135338610e-05f, -6.391052972e-04f, +7.004348084e-04f, +2.546051583e-03f, -3.686478220e-03f, -1.159691782e-02f, -3.738317321e-03f, +1.015953322e-02f, +8.468985806e-03f, -8.571432978e-04f, -2.037141826e-03f, +4.211159430e-04f, +3.292610009e-04f, -9.819084264e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.146872663e-03f, -5.820178319e-03f, +8.569351409e-03f, +1.423728912e-02f, -2.326498222e-02f, -1.641098786e-02f, +3.470255529e-02f, +8.801585143e-03f, -3.125605248e-02f, +9.400024357e-05f, +1.643143925e-02f, -2.382725196e-03f, -3.945872988e-03f, +5.562886201e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.656940839e-04f, -4.652850306e-05f, -6.861646173e-04f, +6.190939368e-04f, +1.086193879e-03f, -1.509552241e-03f, -7.899121992e-04f, +1.871375538e-03f, +5.852111391e-05f, -1.305514278e-03f, +3.297869390e-04f, +4.507696264e-04f, -2.018756421e-04f, -2.548606104e-05f, +0.000000000e+00f, + /* 11, 8 (16) */ + +0.000000000e+00f, -2.555603971e-03f, +8.242876570e-03f, +1.655273928e-02f, -4.492149309e-02f, -5.563255658e-02f, +2.085036861e-01f, +5.050213539e-01f, +3.880777156e-01f, +4.223669858e-02f, -7.511280103e-02f, -5.533374273e-03f, +1.756922125e-02f, +7.619098826e-05f, -1.578349013e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.915867024e-06f, -6.318272127e-04f, +6.132025826e-04f, +2.576581665e-03f, -3.366741102e-03f, -1.153726214e-02f, -4.214336477e-03f, +9.907409864e-03f, +8.752293678e-03f, -6.594083894e-04f, -2.112922692e-03f, +3.807858107e-04f, +3.531067351e-04f, -9.777612154e-05f, +0.000000000e+00f, + +0.000000000e+00f, -9.811785789e-04f, -5.866706822e-03f, +7.883186792e-03f, +1.485638306e-02f, -2.217878834e-02f, -1.792054010e-02f, +3.391264309e-02f, +1.067296068e-02f, -3.119753136e-02f, -1.211514035e-03f, +1.676122619e-02f, -1.931955570e-03f, -4.147748630e-03f, +5.308025591e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.580531598e-04f, -2.306918468e-05f, -6.885431715e-04f, +5.591000242e-04f, +1.135122532e-03f, -1.444620927e-03f, -8.872594744e-04f, +1.849497036e-03f, +1.519636454e-04f, -1.327588722e-03f, +2.854231292e-04f, +4.763850190e-04f, -1.967555349e-04f, -3.256951419e-05f, +0.000000000e+00f, + /* 11, 9 (16) */ + +0.000000000e+00f, -2.562519838e-03f, +7.611049357e-03f, +1.716594187e-02f, -4.234491142e-02f, -5.899929768e-02f, +1.969664240e-01f, +5.008070175e-01f, +3.979851255e-01f, +5.098899226e-02f, -7.577220942e-02f, -7.646296965e-03f, +1.795000706e-02f, +4.292977234e-04f, -1.676125134e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.564288080e-06f, -6.224928071e-04f, +5.278066510e-04f, +2.597900219e-03f, -3.050912894e-03f, -1.145942839e-02f, -4.682071381e-03f, +9.636841592e-03f, +9.026718713e-03f, -4.513912593e-04f, -2.184911820e-03f, +3.369680024e-04f, +3.768721893e-04f, -9.668759395e-05f, +0.000000000e+00f, + +0.000000000e+00f, -8.231254191e-04f, -5.889776007e-03f, +7.194643620e-03f, +1.541548309e-02f, -2.104366581e-02f, -1.936516103e-02f, +3.302538361e-02f, +1.252245772e-02f, -3.104556772e-02f, -2.539102756e-03f, +1.704664932e-02f, -1.455570551e-03f, -4.344504165e-03f, +4.982330449e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.500791075e-04f, -5.284584951e-07f, -6.884210159e-04f, +4.985975632e-04f, +1.179704599e-03f, -1.375687421e-03f, -9.816792142e-04f, +1.821720727e-03f, +2.459758139e-04f, -1.345696463e-03f, +2.388660659e-04f, +5.011444191e-04f, -1.904697302e-04f, -3.997693428e-05f, +0.000000000e+00f, + /* 11,10 (16) */ + +0.000000000e+00f, -2.555955550e-03f, +6.988556550e-03f, +1.769374852e-02f, -3.974701121e-02f, -6.205021057e-02f, +1.855069956e-01f, +4.961249461e-01f, +4.076219671e-01f, +6.001571097e-02f, -7.622360068e-02f, -9.831208785e-03f, +1.828697506e-02f, +8.061699127e-04f, -1.772812728e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.907776907e-05f, -6.112391122e-04f, +4.444662506e-04f, +2.610290373e-03f, -2.739618907e-03f, -1.136382805e-02f, -5.140619940e-03f, +9.348231317e-03f, +9.291493147e-03f, -2.332973398e-04f, -2.252711610e-03f, +2.896681321e-04f, +4.004456412e-04f, -9.488611462e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.730463116e-04f, -5.890304466e-03f, +6.506222604e-03f, +1.591408065e-02f, -1.986396121e-02f, -2.074084845e-02f, +3.204370440e-02f, +1.434417844e-02f, -3.079959190e-02f, -3.884799219e-03f, +1.728551538e-02f, -9.544261318e-04f, -4.534973895e-03f, +4.582561106e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.418288877e-04f, +2.103426197e-05f, -6.858705636e-04f, +4.378109246e-04f, +1.219849269e-03f, -1.303012400e-03f, -1.072863528e-03f, +1.788113712e-03f, +3.402446188e-04f, -1.359705677e-03f, +1.902340416e-04f, +5.249185599e-04f, -1.829953158e-04f, -4.768226821e-05f, +0.000000000e+00f, + /* 11,11 (16) */ + +0.000000000e+00f, -2.536877781e-03f, +6.377317438e-03f, +1.813821477e-02f, -3.713672083e-02f, -6.478982948e-02f, +1.741431676e-01f, +4.909843261e-01f, +4.169701984e-01f, +6.930720412e-02f, -7.645689802e-02f, -1.208392040e-02f, +1.857664319e-02f, +1.206615554e-03f, -1.867698843e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.062033667e-05f, -5.982048263e-04f, +3.633850627e-04f, +2.614052425e-03f, -2.433459876e-03f, -1.125091018e-02f, -5.589103720e-03f, +9.042026792e-03f, +9.545861170e-03f, -5.364779826e-06f, -2.315923806e-03f, +2.389054263e-04f, +4.237107612e-04f, -9.233423472e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.312174239e-04f, -5.869270204e-03f, +5.820352041e-03f, +1.635189157e-02f, -1.864411194e-02f, -2.204386085e-02f, +3.097084087e-02f, +1.613229216e-02f, -3.045934729e-02f, -5.244504897e-03f, +1.747574943e-02f, -4.295075719e-04f, -4.717969211e-03f, +4.105738424e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.333584586e-04f, +4.156586045e-05f, -6.809719658e-04f, +3.769611920e-04f, +1.255482883e-03f, -1.226867825e-03f, -1.160516358e-03f, +1.748763870e-03f, +4.344530968e-04f, -1.369497622e-03f, +1.396561165e-04f, +5.475784417e-04f, -1.743141886e-04f, -5.565649824e-05f, +0.000000000e+00f, + /* 11,12 (16) */ + +0.000000000e+00f, -2.506257444e-03f, +5.779112612e-03f, +1.850159983e-02f, -3.452266841e-02f, -6.722328936e-02f, +1.628922574e-01f, +4.853952224e-01f, +4.260122252e-01f, +7.885306529e-02f, -7.646226280e-02f, -1.439984420e-02f, +1.881554862e-02f, +1.630326315e-03f, -1.960033078e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.119261508e-05f, -5.835296898e-04f, +2.847510312e-04f, +2.609502493e-03f, -2.133010727e-03f, -1.112115974e-02f, -6.026670168e-03f, +8.718719686e-03f, +9.789081151e-03f, +2.321355588e-04f, -2.374150778e-03f, +1.847131615e-04f, +4.465469274e-04f, -8.899648114e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.978589652e-04f, -5.827704343e-03f, +5.139380075e-03f, +1.672885277e-02f, -1.738862906e-02f, -2.327072868e-02f, +2.981032451e-02f, +1.788105603e-02f, -3.002489419e-02f, -6.614002519e-03f, +1.761540554e-02f, +1.180708697e-04f, -4.892283400e-03f, +3.549173442e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.247225261e-04f, +6.101956685e-05f, -6.738125947e-04f, +3.162653554e-04f, +1.286549006e-03f, -1.147535856e-03f, -1.244354548e-03f, +1.703779605e-03f, +5.282814765e-04f, -1.374967286e-03f, +8.727181486e-05f, +5.689959034e-04f, -1.644133056e-04f, -6.386768716e-05f, +0.000000000e+00f, + /* 11,13 (16) */ + +0.000000000e+00f, -2.465064829e-03f, +5.195582922e-03f, +1.878635086e-02f, -3.191316591e-02f, -6.935630008e-02f, +1.517710976e-01f, +4.793685522e-01f, +4.347309449e-01f, +8.864214644e-02f, -7.623012724e-02f, -1.677399498e-02f, +1.900026178e-02f, +2.076873243e-03f, -2.049029559e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.079987044e-05f, -5.673538806e-04f, +2.087362411e-04f, +2.596971129e-03f, -1.838819431e-03f, -1.097509601e-02f, -6.452494754e-03f, +8.378844513e-03f, +1.002042784e-02f, +4.789002077e-04f, -2.426996842e-03f, +1.271390622e-04f, +4.688295727e-04f, -8.483963763e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.731364391e-04f, -5.766684776e-03f, +4.465567480e-03f, +1.704511812e-02f, -1.610208006e-02f, -2.441826453e-02f, +2.856596996e-02f, +1.958483563e-02f, -2.949661271e-02f, -7.988969805e-03f, +1.770267736e-02f, +6.870667731e-04f, -5.056696705e-03f, +2.910496570e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.159743082e-04f, +7.935497537e-05f, -6.644865060e-04f, +2.559355344e-04f, +1.313008429e-03f, -1.065307738e-03f, -1.324108863e-03f, +1.653289520e-03f, +6.214083546e-04f, -1.376023996e-03f, +3.323077078e-05f, +5.890442050e-04f, -1.532849178e-04f, -7.228104141e-05f, +0.000000000e+00f, + /* 11,14 (16) */ + +0.000000000e+00f, -2.414264959e-03f, +4.628229041e-03f, +1.899508710e-02f, -2.931619478e-02f, -7.119511951e-02f, +1.407960016e-01f, +4.729160575e-01f, +4.431097894e-01f, +9.866257427e-02f, -7.575122703e-02f, -1.920099182e-02f, +1.912740084e-02f, +2.545702815e-03f, -2.133869196e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.945177645e-05f, -5.498174272e-04f, +1.354968576e-04f, +2.576801937e-03f, -1.551405963e-03f, -1.081327083e-02f, -6.865783031e-03f, +8.022977447e-03f, +1.023919453e-02f, +7.345933011e-04f, -2.474069593e-03f, +6.624565629e-05f, +4.904305609e-04f, -7.983302664e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.571621309e-04f, -5.687329801e-03f, +3.801080974e-03f, +1.730105366e-02f, -1.478907163e-02f, -2.548357227e-02f, +2.724186110e-02f, +2.123812515e-02f, -2.887520436e-02f, -9.364993801e-03f, +1.773590813e-02f, +1.276110978e-03f, -5.209981623e-03f, +2.187686156e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.071653152e-04f, +9.653803256e-05f, -6.530938851e-04f, +1.961782338e-04f, +1.334839093e-03f, -9.804826529e-04f, -1.399524947e-03f, +1.597442008e-03f, +7.135118869e-04f, -1.372591967e-03f, -2.230767534e-05f, +6.075986170e-04f, -1.409267840e-04f, -8.085899218e-05f, +0.000000000e+00f, + /* 11,15 (16) */ + +0.000000000e+00f, -2.354813182e-03f, +4.078411614e-03f, +1.913058396e-02f, -2.673939285e-02f, -7.274652548e-02f, +1.299827308e-01f, +4.660502745e-01f, +4.511327669e-01f, +1.089017688e-01f, -7.501663373e-02f, -2.167506141e-02f, +1.919364650e-02f, +3.036133376e-03f, -2.213702223e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.716216885e-05f, -5.310596448e-04f, +6.517312326e-05f, +2.549350159e-03f, -1.271261362e-03f, -1.063626677e-02f, -7.265772605e-03f, +7.651735003e-03f, +1.044469523e-02f, +9.988468901e-04f, -2.514981275e-03f, +2.110586983e-06f, +5.112185933e-04f, -7.394879023e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.999681573e-05f, -5.590791768e-03f, +3.147987089e-03f, +1.749723189e-02f, -1.345423253e-02f, -2.646405492e-02f, +2.584233615e-02f, +2.283556716e-02f, -2.816169247e-02f, -1.073758577e-02f, +1.771360045e-02f, +1.883709595e-03f, -5.350908407e-03f, +1.379096234e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.834514462e-05f, +1.125409961e-04f, -6.397404787e-04f, +1.371936357e-04f, +1.352035959e-03f, -8.933665568e-04f, -1.470364230e-03f, +1.536404765e-03f, +8.042709914e-04f, -1.364610807e-03f, -7.917492811e-05f, +6.245370154e-04f, -1.273423653e-04f, -8.956129451e-05f, +0.000000000e+00f, + /* 11,16 (16) */ + +0.000000000e+00f, -2.287651013e-03f, +3.547351969e-03f, +1.919575708e-02f, -2.419004269e-02f, -7.401778684e-02f, +1.193464640e-01f, +4.587845019e-01f, +4.587845019e-01f, +1.193464640e-01f, -7.401778684e-02f, -2.419004269e-02f, +1.919575708e-02f, +3.547351969e-03f, -2.287651013e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.394879023e-05f, -5.112185933e-04f, -2.110586983e-06f, +2.514981275e-03f, -9.988468901e-04f, -1.044469523e-02f, -7.651735003e-03f, +7.265772605e-03f, +1.063626677e-02f, +1.271261362e-03f, -2.549350159e-03f, -6.517312326e-05f, +5.310596448e-04f, -6.716216885e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.834832889e-05f, -5.478250772e-03f, +2.508246610e-03f, +1.763442552e-02f, -1.210219657e-02f, -2.735742148e-02f, +2.437197192e-02f, +2.437197192e-02f, -2.735742148e-02f, -1.210219657e-02f, +1.763442552e-02f, +2.508246610e-03f, -5.478250772e-03f, +4.834832889e-05f, +0.000000000e+00f, + +0.000000000e+00f, +8.956129451e-05f, +1.273423653e-04f, -6.245370154e-04f, +7.917492811e-05f, +1.364610807e-03f, -8.042709914e-04f, -1.536404765e-03f, +1.470364230e-03f, +8.933665568e-04f, -1.352035959e-03f, -1.371936357e-04f, +6.397404787e-04f, -1.125409961e-04f, -9.834514462e-05f, +0.000000000e+00f, + /* 11,17 (16) */ + +0.000000000e+00f, -2.213702223e-03f, +3.036133376e-03f, +1.919364650e-02f, -2.167506141e-02f, -7.501663373e-02f, +1.089017688e-01f, +4.511327669e-01f, +4.660502745e-01f, +1.299827308e-01f, -7.274652548e-02f, -2.673939285e-02f, +1.913058396e-02f, +4.078411614e-03f, -2.354813182e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.983302664e-05f, -4.904305609e-04f, -6.624565629e-05f, +2.474069593e-03f, -7.345933011e-04f, -1.023919453e-02f, -8.022977447e-03f, +6.865783031e-03f, +1.081327083e-02f, +1.551405963e-03f, -2.576801937e-03f, -1.354968576e-04f, +5.498174272e-04f, -5.945177645e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.379096234e-04f, -5.350908407e-03f, +1.883709595e-03f, +1.771360045e-02f, -1.073758577e-02f, -2.816169247e-02f, +2.283556716e-02f, +2.584233615e-02f, -2.646405492e-02f, -1.345423253e-02f, +1.749723189e-02f, +3.147987089e-03f, -5.590791768e-03f, -4.999681573e-05f, +0.000000000e+00f, + +0.000000000e+00f, +8.085899218e-05f, +1.409267840e-04f, -6.075986170e-04f, +2.230767534e-05f, +1.372591967e-03f, -7.135118869e-04f, -1.597442008e-03f, +1.399524947e-03f, +9.804826529e-04f, -1.334839093e-03f, -1.961782338e-04f, +6.530938851e-04f, -9.653803256e-05f, -1.071653152e-04f, +0.000000000e+00f, + /* 11,18 (16) */ + +0.000000000e+00f, -2.133869196e-03f, +2.545702815e-03f, +1.912740084e-02f, -1.920099182e-02f, -7.575122703e-02f, +9.866257427e-02f, +4.431097894e-01f, +4.729160575e-01f, +1.407960016e-01f, -7.119511951e-02f, -2.931619478e-02f, +1.899508710e-02f, +4.628229041e-03f, -2.414264959e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.483963763e-05f, -4.688295727e-04f, -1.271390622e-04f, +2.426996842e-03f, -4.789002077e-04f, -1.002042784e-02f, -8.378844513e-03f, +6.452494754e-03f, +1.097509601e-02f, +1.838819431e-03f, -2.596971129e-03f, -2.087362411e-04f, +5.673538806e-04f, -5.079987044e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.187686156e-04f, -5.209981623e-03f, +1.276110978e-03f, +1.773590813e-02f, -9.364993801e-03f, -2.887520436e-02f, +2.123812515e-02f, +2.724186110e-02f, -2.548357227e-02f, -1.478907163e-02f, +1.730105366e-02f, +3.801080974e-03f, -5.687329801e-03f, -1.571621309e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.228104141e-05f, +1.532849178e-04f, -5.890442050e-04f, -3.323077078e-05f, +1.376023996e-03f, -6.214083546e-04f, -1.653289520e-03f, +1.324108863e-03f, +1.065307738e-03f, -1.313008429e-03f, -2.559355344e-04f, +6.644865060e-04f, -7.935497537e-05f, -1.159743082e-04f, +0.000000000e+00f, + /* 11,19 (16) */ + +0.000000000e+00f, -2.049029559e-03f, +2.076873243e-03f, +1.900026178e-02f, -1.677399498e-02f, -7.623012724e-02f, +8.864214644e-02f, +4.347309449e-01f, +4.793685522e-01f, +1.517710976e-01f, -6.935630008e-02f, -3.191316591e-02f, +1.878635086e-02f, +5.195582922e-03f, -2.465064829e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.899648114e-05f, -4.465469274e-04f, -1.847131615e-04f, +2.374150778e-03f, -2.321355588e-04f, -9.789081151e-03f, -8.718719686e-03f, +6.026670168e-03f, +1.112115974e-02f, +2.133010727e-03f, -2.609502493e-03f, -2.847510312e-04f, +5.835296898e-04f, -4.119261508e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.910496570e-04f, -5.056696705e-03f, +6.870667731e-04f, +1.770267736e-02f, -7.988969805e-03f, -2.949661271e-02f, +1.958483563e-02f, +2.856596996e-02f, -2.441826453e-02f, -1.610208006e-02f, +1.704511812e-02f, +4.465567480e-03f, -5.766684776e-03f, -2.731364391e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.386768716e-05f, +1.644133056e-04f, -5.689959034e-04f, -8.727181486e-05f, +1.374967286e-03f, -5.282814765e-04f, -1.703779605e-03f, +1.244354548e-03f, +1.147535856e-03f, -1.286549006e-03f, -3.162653554e-04f, +6.738125947e-04f, -6.101956685e-05f, -1.247225261e-04f, +0.000000000e+00f, + /* 11,20 (16) */ + +0.000000000e+00f, -1.960033078e-03f, +1.630326315e-03f, +1.881554862e-02f, -1.439984420e-02f, -7.646226280e-02f, +7.885306529e-02f, +4.260122252e-01f, +4.853952224e-01f, +1.628922574e-01f, -6.722328936e-02f, -3.452266841e-02f, +1.850159983e-02f, +5.779112612e-03f, -2.506257444e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.233423472e-05f, -4.237107612e-04f, -2.389054263e-04f, +2.315923806e-03f, +5.364779826e-06f, -9.545861170e-03f, -9.042026792e-03f, +5.589103720e-03f, +1.125091018e-02f, +2.433459876e-03f, -2.614052425e-03f, -3.633850627e-04f, +5.982048263e-04f, -3.062033667e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.549173442e-04f, -4.892283400e-03f, +1.180708697e-04f, +1.761540554e-02f, -6.614002519e-03f, -3.002489419e-02f, +1.788105603e-02f, +2.981032451e-02f, -2.327072868e-02f, -1.738862906e-02f, +1.672885277e-02f, +5.139380075e-03f, -5.827704343e-03f, -3.978589652e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.565649824e-05f, +1.743141886e-04f, -5.475784417e-04f, -1.396561165e-04f, +1.369497622e-03f, -4.344530968e-04f, -1.748763870e-03f, +1.160516358e-03f, +1.226867825e-03f, -1.255482883e-03f, -3.769611920e-04f, +6.809719658e-04f, -4.156586045e-05f, -1.333584586e-04f, +0.000000000e+00f, + /* 11,21 (16) */ + +0.000000000e+00f, -1.867698843e-03f, +1.206615554e-03f, +1.857664319e-02f, -1.208392040e-02f, -7.645689802e-02f, +6.930720412e-02f, +4.169701984e-01f, +4.909843261e-01f, +1.741431676e-01f, -6.478982948e-02f, -3.713672083e-02f, +1.813821477e-02f, +6.377317438e-03f, -2.536877781e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.488611462e-05f, -4.004456412e-04f, -2.896681321e-04f, +2.252711610e-03f, +2.332973398e-04f, -9.291493147e-03f, -9.348231317e-03f, +5.140619940e-03f, +1.136382805e-02f, +2.739618907e-03f, -2.610290373e-03f, -4.444662506e-04f, +6.112391122e-04f, -1.907776907e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.105738424e-04f, -4.717969211e-03f, -4.295075719e-04f, +1.747574943e-02f, -5.244504897e-03f, -3.045934729e-02f, +1.613229216e-02f, +3.097084087e-02f, -2.204386085e-02f, -1.864411194e-02f, +1.635189157e-02f, +5.820352041e-03f, -5.869270204e-03f, -5.312174239e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.768226821e-05f, +1.829953158e-04f, -5.249185599e-04f, -1.902340416e-04f, +1.359705677e-03f, -3.402446188e-04f, -1.788113712e-03f, +1.072863528e-03f, +1.303012400e-03f, -1.219849269e-03f, -4.378109246e-04f, +6.858705636e-04f, -2.103426197e-05f, -1.418288877e-04f, +0.000000000e+00f, + /* 11,22 (16) */ + +0.000000000e+00f, -1.772812728e-03f, +8.061699127e-04f, +1.828697506e-02f, -9.831208785e-03f, -7.622360068e-02f, +6.001571097e-02f, +4.076219671e-01f, +4.961249461e-01f, +1.855069956e-01f, -6.205021057e-02f, -3.974701121e-02f, +1.769374852e-02f, +6.988556550e-03f, -2.555955550e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.668759395e-05f, -3.768721893e-04f, -3.369680024e-04f, +2.184911820e-03f, +4.513912593e-04f, -9.026718713e-03f, -9.636841592e-03f, +4.682071381e-03f, +1.145942839e-02f, +3.050912894e-03f, -2.597900219e-03f, -5.278066510e-04f, +6.224928071e-04f, -6.564288080e-06f, +0.000000000e+00f, + +0.000000000e+00f, +4.582561106e-04f, -4.534973895e-03f, -9.544261318e-04f, +1.728551538e-02f, -3.884799219e-03f, -3.079959190e-02f, +1.434417844e-02f, +3.204370440e-02f, -2.074084845e-02f, -1.986396121e-02f, +1.591408065e-02f, +6.506222604e-03f, -5.890304466e-03f, -6.730463116e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.997693428e-05f, +1.904697302e-04f, -5.011444191e-04f, -2.388660659e-04f, +1.345696463e-03f, -2.459758139e-04f, -1.821720727e-03f, +9.816792142e-04f, +1.375687421e-03f, -1.179704599e-03f, -4.985975632e-04f, +6.884210159e-04f, +5.284584951e-07f, -1.500791075e-04f, +0.000000000e+00f, + /* 11,23 (16) */ + +0.000000000e+00f, -1.676125134e-03f, +4.292977234e-04f, +1.795000706e-02f, -7.646296965e-03f, -7.577220942e-02f, +5.098899226e-02f, +3.979851255e-01f, +5.008070175e-01f, +1.969664240e-01f, -5.899929768e-02f, -4.234491142e-02f, +1.716594187e-02f, +7.611049357e-03f, -2.562519838e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.777612154e-05f, -3.531067351e-04f, -3.807858107e-04f, +2.112922692e-03f, +6.594083894e-04f, -8.752293678e-03f, -9.907409864e-03f, +4.214336477e-03f, +1.153726214e-02f, +3.366741102e-03f, -2.576581665e-03f, -6.132025826e-04f, +6.318272127e-04f, +6.915867024e-06f, +0.000000000e+00f, + +0.000000000e+00f, +4.982330449e-04f, -4.344504165e-03f, -1.455570551e-03f, +1.704664932e-02f, -2.539102756e-03f, -3.104556772e-02f, +1.252245772e-02f, +3.302538361e-02f, -1.936516103e-02f, -2.104366581e-02f, +1.541548309e-02f, +7.194643620e-03f, -5.889776007e-03f, -8.231254191e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.256951419e-05f, +1.967555349e-04f, -4.763850190e-04f, -2.854231292e-04f, +1.327588722e-03f, -1.519636454e-04f, -1.849497036e-03f, +8.872594744e-04f, +1.444620927e-03f, -1.135122532e-03f, -5.591000242e-04f, +6.885431715e-04f, +2.306918468e-05f, -1.580531598e-04f, +0.000000000e+00f, + /* 11,24 (16) */ + +0.000000000e+00f, -1.578349013e-03f, +7.619098826e-05f, +1.756922125e-02f, -5.533374273e-03f, -7.511280103e-02f, +4.223669858e-02f, +3.880777156e-01f, +5.050213539e-01f, +2.085036861e-01f, -5.563255658e-02f, -4.492149309e-02f, +1.655273928e-02f, +8.242876570e-03f, -2.555603971e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.819084264e-05f, -3.292610009e-04f, -4.211159430e-04f, +2.037141826e-03f, +8.571432978e-04f, -8.468985806e-03f, -1.015953322e-02f, +3.738317321e-03f, +1.159691782e-02f, +3.686478220e-03f, -2.546051583e-03f, -7.004348084e-04f, +6.391052972e-04f, +2.135338610e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.308025591e-04f, -4.147748630e-03f, -1.931955570e-03f, +1.676122619e-02f, -1.211514035e-03f, -3.119753136e-02f, +1.067296068e-02f, +3.391264309e-02f, -1.792054010e-02f, -2.217878834e-02f, +1.485638306e-02f, +7.883186792e-03f, -5.866706822e-03f, -9.811785789e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.548606104e-05f, +2.018756421e-04f, -4.507696264e-04f, -3.297869390e-04f, +1.305514278e-03f, -5.852111391e-05f, -1.871375538e-03f, +7.899121992e-04f, +1.509552241e-03f, -1.086193879e-03f, -6.190939368e-04f, +6.861646173e-04f, +4.652850306e-05f, -1.656940839e-04f, +0.000000000e+00f, + /* 11,25 (16) */ + +0.000000000e+00f, -1.480158170e-03f, -2.530700126e-04f, +1.714810530e-02f, -3.496232448e-03f, -7.425565773e-02f, +3.376771277e-02f, +3.779181824e-01f, +5.087596713e-01f, +2.201006040e-01f, -5.194607836e-02f, -4.746754467e-02f, +1.585230448e-02f, +8.881981867e-03f, -2.534250585e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.797232276e-05f, -3.054418175e-04f, -4.579659243e-04f, +1.957964918e-03f, +1.044423172e-03f, -8.177572597e-03f, -1.039285442e-02f, +3.254937370e-03f, +1.163802289e-02f, +4.009475700e-03f, -2.506045352e-03f, -7.892687808e-04f, +6.441923343e-04f, +3.673369658e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.562886201e-04f, -3.945872988e-03f, -2.382725196e-03f, +1.643143925e-02f, +9.400024357e-05f, -3.125605248e-02f, +8.801585143e-03f, +3.470255529e-02f, -1.641098786e-02f, -2.326498222e-02f, +1.423728912e-02f, +8.569351409e-03f, -5.820178319e-03f, -1.146872663e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.874963546e-05f, +2.058575066e-04f, -4.244272151e-04f, -3.718502256e-04f, +1.279617346e-03f, +3.404387314e-05f, -1.887310081e-03f, +6.899559970e-04f, +1.570233017e-03f, -1.033026473e-03f, -6.783524775e-04f, +6.812211733e-04f, +7.084078296e-05f, -1.729441808e-04f, +0.000000000e+00f, + /* 11,26 (16) */ + +0.000000000e+00f, -1.382185847e-03f, -5.585118301e-04f, +1.669013938e-02f, -1.538267530e-03f, -7.321123456e-02f, +2.559014017e-02f, +3.675253280e-01f, +5.120146086e-01f, +2.317386268e-01f, -4.793660266e-02f, -4.997359003e-02f, +1.506303569e-02f, +9.526174202e-03f, -2.497516888e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.716227592e-05f, -2.817508714e-04f, -4.913559109e-04f, +1.875784547e-03f, +1.221107623e-03f, -7.878839049e-03f, -1.060706251e-02f, +2.765139089e-03f, +1.166024520e-02f, +4.335063175e-03f, -2.456318153e-03f, -8.794549476e-04f, +6.469565560e-04f, +5.303678911e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.750382556e-04f, -3.740015481e-03f, -2.807152411e-03f, +1.605958902e-02f, +1.373617589e-03f, -3.122200860e-02f, +6.914275062e-03f, +3.539251128e-02f, -1.484075485e-02f, -2.429800870e-02f, +1.355893665e-02f, +9.250572582e-03f, -5.749337536e-03f, -1.319816844e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.238029514e-05f, +2.087328446e-04f, -3.974859214e-04f, -4.115169448e-04f, +1.250053791e-03f, +1.254296023e-04f, -1.897275544e-03f, +5.877190360e-04f, +1.626428246e-03f, -9.757449570e-04f, -7.366472271e-04f, +6.736573625e-04f, +9.593428836e-05f, -1.797452882e-04f, +0.000000000e+00f, + /* 11,27 (16) */ + +0.000000000e+00f, -1.285023571e-03f, -8.402627015e-04f, +1.619878347e-02f, +3.375170173e-04f, -7.199012694e-02f, +1.771130113e-02f, +3.569182655e-01f, +5.147797477e-01f, +2.433988720e-01f, -4.360153948e-02f, -5.242990818e-02f, +1.418358075e-02f, +1.017313076e-02f, -2.444480099e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.580329841e-05f, -2.582844834e-04f, -5.213181517e-04f, +1.790989004e-03f, +1.387088395e-03f, -7.573575436e-03f, -1.080189342e-02f, +2.269881533e-03f, +1.166329422e-02f, +4.662549978e-03f, -2.396646241e-03f, -9.707291231e-04f, +6.472698169e-04f, +7.023706188e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.874185507e-04f, -3.531282637e-03f, -3.204638333e-03f, +1.564807208e-02f, +2.623671381e-03f, -3.109657900e-02f, +5.016999518e-03f, +3.598023032e-02f, -1.321432660e-02f, -2.527375365e-02f, +1.282228942e-02f, +9.924229945e-03f, -5.653403248e-03f, -1.499562132e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.395100902e-06f, +2.105373403e-04f, -3.700725160e-04f, -4.487024310e-04f, +1.216990366e-03f, +2.153416212e-04f, -1.901267847e-03f, +4.835378479e-04f, +1.677917215e-03f, -9.144905107e-04f, -7.937490495e-04f, +6.634268523e-04f, +1.217313216e-04f, -1.860390689e-04f, +0.000000000e+00f, + /* 11,28 (16) */ + +0.000000000e+00f, -1.189220273e-03f, -1.098547185e-03f, +1.567746532e-02f, +2.128506022e-03f, -7.060303854e-02f, +1.013772569e-02f, +3.461163721e-01f, +5.170496292e-01f, +2.550621663e-01f, -3.893898951e-02f, -5.482655442e-02f, +1.321285162e-02f, +1.082040057e-02f, -2.374243037e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.393860917e-05f, -2.351334187e-04f, -5.478964219e-04f, +1.703961170e-03f, +1.542288980e-03f, -7.262575094e-03f, -1.097713031e-02f, +1.770137883e-03f, +1.164692223e-02f, +4.991226734e-03f, -2.326828164e-03f, -1.062812921e-03f, +6.450082674e-04f, +8.830318502e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.938136516e-04f, -3.320745296e-03f, -3.574710849e-03f, +1.519936965e-02f, +3.840661746e-03f, -3.088123738e-02f, +3.115731670e-03f, +3.646376817e-02f, -1.153640938e-02f, -2.618824416e-02f, +1.202854037e-02f, +1.058765680e-02f, -5.531671926e-03f, -1.685601201e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.081390693e-07f, +2.113103429e-04f, -3.423118946e-04f, -4.833335002e-04f, +1.180603899e-03f, +3.034937685e-04f, -1.899303879e-03f, +3.777560982e-04f, +1.724494415e-03f, -8.494205068e-04f, -8.494289867e-04f, +6.504928668e-04f, +1.481483990e-04f, -1.917673084e-04f, +0.000000000e+00f, + /* 11,29 (16) */ + +0.000000000e+00f, -1.095281664e-03f, -1.333680604e-03f, +1.512956889e-02f, +3.832467192e-03f, -6.906074956e-02f, +2.875150595e-03f, +3.351392418e-01f, +5.188197671e-01f, +2.667090885e-01f, -3.394776277e-02f, -5.715338258e-02f, +1.215003870e-02f, +1.146540884e-02f, -2.285939852e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.161179782e-05f, -2.123827275e-04f, -5.711454312e-04f, +1.615077431e-03f, +1.686664137e-03f, -6.946632226e-03f, -1.113260386e-02f, +1.266892935e-03f, +1.161092531e-02f, +5.320367038e-03f, -2.246685944e-03f, -1.155414253e-03f, +6.400530335e-04f, +1.071979865e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.946217907e-04f, -3.109434954e-03f, -3.917022743e-03f, +1.471603615e-02f, +5.021265645e-03f, -3.057774361e-02f, +1.216427791e-03f, +3.684152426e-02f, -9.811914969e-03f, -2.703766467e-02f, +1.117911138e-02f, +1.123814966e-02f, -5.383523527e-03f, -1.877368509e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.369440610e-06f, +2.110945529e-04f, -3.143265902e-04f, -5.153485024e-04f, +1.141080469e-03f, +3.896091618e-04f, -1.891421339e-03f, +2.707233287e-04f, +1.765970402e-03f, -7.807080980e-04f, -9.034591676e-04f, +6.348285654e-04f, +1.750964586e-04f, -1.968722212e-04f, +0.000000000e+00f, + /* 11,30 (16) */ + +0.000000000e+00f, -1.003669866e-03f, -1.546063331e-03f, +1.455842346e-02f, +5.447544623e-03f, -6.737408542e-02f, -4.071481631e-03f, +3.240066379e-01f, +5.200866601e-01f, +2.783200138e-01f, -2.862739573e-02f, -5.940006853e-02f, +1.099462445e-02f, +1.210546188e-02f, -2.178741866e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.886658125e-05f, -1.901116177e-04f, -5.911302105e-04f, +1.524706656e-03f, +1.820199333e-03f, -6.626539728e-03f, -1.126819238e-02f, +7.611405568e-04f, +1.155514430e-02f, +5.649229208e-03f, -2.156066209e-03f, -1.248227886e-03f, +6.322909003e-04f, +1.268783605e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.902523501e-04f, -2.898340401e-03f, -4.231349334e-03f, +1.420068765e-02f, +6.162346114e-03f, -3.018813445e-02f, -6.749935475e-04f, +3.711224759e-02f, -8.045944567e-03f, -2.781837277e-02f, +1.027565222e-02f, +1.187297823e-02f, -5.208427069e-03f, -2.074240730e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.129372137e-06f, +2.099357034e-04f, -2.862363067e-04f, -5.446973254e-04f, +1.098614544e-03f, +4.734211408e-04f, -1.877678504e-03f, +1.627936759e-04f, +1.802172594e-03f, -7.085417387e-04f, -9.556137271e-04f, +6.164173868e-04f, +2.024810993e-04f, -2.012967661e-04f, +0.000000000e+00f, + /* 11,31 (16) */ + +0.000000000e+00f, -9.148032848e-04f, -1.736174949e-03f, +1.396729325e-02f, +6.972251279e-03f, -6.555388609e-02f, -1.069802136e-02f, +3.127384455e-01f, +5.208478006e-01f, +2.898751581e-01f, -2.297816653e-02f, -6.155613474e-02f, +9.746396564e-03f, +1.273775278e-02f, -2.051863505e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.574656972e-05f, -1.683933560e-04f, -6.079254793e-04f, +1.433209217e-03f, +1.942910092e-03f, -6.303087054e-03f, -1.138382183e-02f, +2.538811153e-04f, +1.147946560e-02f, +5.977058112e-03f, -2.054841261e-03f, -1.340936069e-03f, +6.216149968e-04f, +1.472952004e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.811229779e-04f, -2.688404697e-03f, -4.517585640e-03f, +1.365599032e-02f, +7.260960658e-03f, -2.971471331e-02f, -2.552672051e-03f, +3.727504127e-02f, -6.243771973e-03f, -2.852691451e-02f, +9.320038489e-03f, +1.248939562e-02f, -5.005945970e-03f, -2.275537496e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.346620625e-05f, +2.078822347e-04f, -2.581574779e-04f, -5.713413495e-04f, +1.053408101e-03f, +5.546741618e-04f, -1.858153918e-03f, +5.432457122e-05f, +1.832946003e-03f, -6.331246402e-04f, -1.005669730e-03f, +5.952533556e-04f, +2.302028513e-04f, -2.049849662e-04f, +0.000000000e+00f, + /* 12, 0 (16) */ + +0.000000000e+00f, -4.385090767e-03f, +8.583624654e-03f, +2.149010947e-02f, -5.529660724e-02f, -4.616114756e-02f, +2.969437977e-01f, +5.584310476e-01f, +2.969437977e-01f, -4.616114756e-02f, -5.529660724e-02f, +2.149010947e-02f, +8.583624654e-03f, -4.385090767e-03f, -2.613999434e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.768976579e-05f, -8.518178481e-04f, +7.456827132e-04f, +3.060510991e-03f, -5.343933472e-03f, -1.331241160e-02f, -3.082056865e-04f, +1.324197575e-02f, +5.748412892e-03f, -2.996318192e-03f, -8.618678673e-04f, +8.660829573e-04f, -3.948887869e-05f, -7.228036347e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.385090767e-03f, -8.116893231e-03f, -8.922865569e-04f, +2.202328737e-02f, -2.110190956e-02f, -1.394485664e-02f, +3.732936584e-02f, -1.394485664e-02f, -2.110190956e-02f, +2.202328737e-02f, -8.922865569e-04f, -8.116893231e-03f, +3.333012858e-03f, +2.613999434e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.768976579e-05f, +4.395561877e-04f, -9.567603037e-04f, +2.376959244e-04f, +1.528844573e-03f, -1.937939192e-03f, -7.280146223e-05f, +2.004762733e-03f, -1.464361568e-03f, -3.326174256e-04f, +9.885505371e-04f, -4.199849082e-04f, -6.968989714e-05f, +7.228036347e-05f, +0.000000000e+00f, + /* 12, 1 (16) */ + +0.000000000e+00f, -4.327401002e-03f, +7.731806806e-03f, +2.223579218e-02f, -5.223609625e-02f, -5.150508103e-02f, +2.836313861e-01f, +5.581228419e-01f, +3.101857735e-01f, -4.041273467e-02f, -5.829292543e-02f, +2.062824160e-02f, +9.449707611e-03f, -4.424579646e-03f, -3.336803069e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.441840558e-05f, -8.347719996e-04f, +6.318104988e-04f, +3.111679936e-03f, -4.940687470e-03f, -1.335731689e-02f, -9.239342327e-04f, +1.314587089e-02f, +6.153118587e-03f, -2.918813877e-03f, -9.800093305e-04f, +8.773665173e-04f, -1.982408569e-05f, -7.973720911e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.327401002e-03f, -7.677337043e-03f, -1.849046861e-03f, +2.226098329e-02f, -1.957306499e-02f, -1.588279583e-02f, +3.725656438e-02f, -1.194009391e-02f, -2.256627113e-02f, +2.169066994e-02f, +9.626398011e-05f, -8.536878139e-03f, +3.263322961e-03f, +3.336803069e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.441840558e-05f, +4.563134437e-04f, -9.215951689e-04f, +1.435751254e-04f, +1.586203207e-03f, -1.863578082e-03f, -2.180929495e-04f, +2.063717530e-03f, -1.392953765e-03f, -4.279244817e-04f, +1.016728084e-03f, -3.976041819e-04f, -9.173925168e-05f, +7.973720911e-05f, +0.000000000e+00f, + /* 12, 2 (16) */ + +0.000000000e+00f, -4.252982596e-03f, +6.897034807e-03f, +2.286760268e-02f, -4.912441631e-02f, -5.644576850e-02f, +2.702740692e-01f, +5.571989077e-01f, +3.233316444e-01f, -3.425961608e-02f, -6.121173931e-02f, +1.964823227e-02f, +1.032707413e-02f, -4.444403732e-03f, -4.134175160e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.967423475e-05f, -8.151494921e-04f, +5.205856872e-04f, +3.150145112e-03f, -4.539658940e-03f, -1.337689571e-02f, -1.537616264e-03f, +1.302402520e-02f, +6.557023064e-03f, -2.827744606e-03f, -1.099728929e-03f, +8.854720214e-04f, +1.288174649e-06f, -8.724235721e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.252982596e-03f, -7.221023599e-03f, -2.770642030e-03f, +2.240455842e-02f, -1.798686178e-02f, -1.774637391e-02f, +3.703847143e-02f, -9.876376375e-03f, -2.395922489e-02f, +2.126274546e-02f, +1.112992064e-03f, -8.934482321e-03f, +3.171583709e-03f, +4.134175160e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.967423475e-05f, +4.702668609e-04f, -8.833037439e-04f, +5.065945679e-05f, +1.636272318e-03f, -1.782042421e-03f, -3.624515650e-04f, +2.114505956e-03f, -1.314854568e-03f, -5.231930854e-04f, +1.041067443e-03f, -3.724337367e-04f, -1.143898470e-04f, +8.724235721e-05f, +0.000000000e+00f, + /* 12, 3 (16) */ + +0.000000000e+00f, -4.163308361e-03f, +6.081885314e-03f, +2.338818837e-02f, -4.597427120e-02f, -6.098542744e-02f, +2.568971735e-01f, +5.556612914e-01f, +3.363556696e-01f, -2.770259302e-02f, -6.403948391e-02f, +1.854850334e-02f, +1.121254615e-02f, -4.443115557e-03f, -5.006598732e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.034641234e-04f, -7.931566664e-04f, +4.123200544e-04f, +3.176257150e-03f, -4.141806227e-03f, -1.337141665e-02f, -2.147893981e-03f, +1.287643418e-02f, +6.959081326e-03f, -2.722892879e-03f, -1.220627670e-03f, +8.902083165e-04f, +2.382307579e-05f, -9.474674824e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.163308361e-03f, -6.750756739e-03f, -3.653945773e-03f, +2.245521787e-02f, -1.635058946e-02f, -1.952841633e-02f, +3.667601986e-02f, -7.761870419e-03f, -2.527407946e-02f, +2.073955237e-02f, +2.154059507e-03f, -9.306916058e-03f, +3.057193862e-03f, +5.006598732e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.034641234e-04f, +4.814409226e-04f, -8.421439845e-04f, -4.065915088e-05f, +1.678921589e-03f, -1.693725217e-03f, -5.052601862e-04f, +2.156865482e-03f, -1.230330450e-03f, -6.179923005e-04f, +1.061356810e-03f, -3.445087681e-04f, -1.375350439e-04f, +9.474674824e-05f, +0.000000000e+00f, + /* 12, 4 (16) */ + +0.000000000e+00f, -4.059844238e-03f, +5.288728648e-03f, +2.380050842e-02f, -4.279801405e-02f, -6.512723367e-02f, +2.435257569e-01f, +5.535133974e-01f, +3.492321037e-01f, -2.074351169e-02f, -6.676237679e-02f, +1.732787567e-02f, +1.210275447e-02f, -4.419292481e-03f, -5.954066215e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.158020071e-04f, -7.690011385e-04f, +3.073022708e-04f, +3.190395290e-03f, -3.748059468e-03f, -1.334121144e-02f, -2.753419381e-03f, +1.270316126e-02f, +7.358233815e-03f, -2.604078761e-03f, -1.342286574e-03f, +8.913906677e-04f, +4.774714309e-05f, -1.021983993e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.059844238e-03f, -6.269315816e-03f, -4.496089758e-03f, +2.241455872e-02f, -1.467166787e-02f, -2.122214155e-02f, +3.617075968e-02f, -5.605004937e-03f, -2.650440991e-02f, +2.012156007e-02f, +3.215416316e-03f, -9.651424826e-03f, +2.919658818e-03f, +5.954066215e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.158020071e-04f, +4.898738829e-04f, -7.983816905e-04f, -1.300029546e-04f, +1.714055781e-03f, -1.599047487e-03f, -6.459088539e-04f, +2.190570068e-03f, -1.139680024e-03f, -7.118862561e-04f, +1.077399460e-03f, -3.138801756e-04f, -1.610611489e-04f, +1.021983993e-04f, +0.000000000e+00f, + /* 12, 5 (16) */ + +0.000000000e+00f, -3.944042231e-03f, +4.519727509e-03f, +2.410781069e-02f, -3.960761876e-02f, -6.887529314e-02f, +2.301845454e-01f, +5.507599780e-01f, +3.619352650e-01f, -1.338527788e-02f, -6.936645555e-02f, +1.598558910e-02f, +1.299414513e-02f, -4.371545338e-03f, -6.976050208e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.267084991e-04f, -7.428908444e-04f, +2.057975852e-04f, +3.192965380e-03f, -3.359318218e-03f, -1.328667344e-02f, -3.352858125e-03f, +1.250433805e-02f, +7.753409447e-03f, -2.471161414e-03f, -1.464267602e-03f, +8.888418324e-04f, +7.301802684e-05f, -1.095425711e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.944042231e-03f, -5.779441933e-03f, -5.294471448e-03f, +2.228455577e-02f, -1.295761209e-02f, -2.282118904e-02f, +3.552485082e-02f, -3.414434869e-03f, -2.764408994e-02f, +1.940967382e-02f, +4.292815776e-03f, -9.965305001e-03f, +2.758597669e-03f, +6.976050208e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.267084991e-04f, +4.956171750e-04f, -7.522889935e-04f, -2.170099927e-04f, +1.741614807e-03f, -1.498456150e-03f, -7.837975882e-04f, +2.215431384e-03f, -1.043232948e-03f, -8.044361941e-04f, +1.089015067e-03f, -2.806147185e-04f, -1.848478580e-04f, +1.095425711e-04f, +0.000000000e+00f, + /* 12, 6 (16) */ + +0.000000000e+00f, -3.817333732e-03f, +3.776836665e-03f, +2.431360828e-02f, -3.641465338e-02f, -7.223461136e-02f, +2.168978720e-01f, +5.474071199e-01f, +3.744396031e-01f, -5.631868430e-03f, -7.183761697e-02f, +1.452132150e-02f, +1.388298697e-02f, -4.298527311e-03f, -8.071475918e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.362104842e-04f, -7.150331173e-04f, +1.080476075e-04f, +3.184397829e-03f, -2.976449226e-03f, -1.320825590e-02f, -3.944893367e-03f, +1.228016450e-02f, +8.143528724e-03f, -2.324040518e-03f, -1.586114692e-03f, +8.823931394e-04f, +9.958431085e-05f, -1.167219582e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.817333732e-03f, -5.283824758e-03f, -6.046760442e-03f, +2.206754578e-02f, -1.121599729e-02f, -2.431964519e-02f, +3.474105324e-02f, -1.199003486e-03f, -2.868732288e-02f, +1.860523762e-02f, +5.381830843e-03f, -1.024591972e-02f, +2.573749811e-03f, +8.071475918e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.362104842e-04f, +4.987347624e-04f, -7.041428442e-04f, -3.013355759e-04f, +1.761573627e-03f, -1.392421801e-03f, -9.183391548e-04f, +2.231299853e-03f, -9.413486665e-04f, -8.952025607e-04f, +1.096040968e-03f, -2.447950865e-04f, -2.087687550e-04f, +1.167219582e-04f, +0.000000000e+00f, + /* 12, 7 (16) */ + +0.000000000e+00f, -3.681123248e-03f, +3.061803548e-03f, +2.442165588e-02f, -3.323025555e-02f, -7.521106058e-02f, +2.036896161e-01f, +5.434622265e-01f, +3.867197676e-01f, +2.511660294e-03f, -7.416165749e-02f, +1.293520680e-02f, +1.476538011e-02f, -4.198943001e-03f, -9.238695501e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.443406978e-04f, -6.856338003e-04f, +1.427019117e-05f, +3.165145520e-03f, -2.600284341e-03f, -1.310647006e-02f, -4.528229520e-03f, +1.203090876e-02f, +8.527506920e-03f, -2.162657576e-03f, -1.707354887e-03f, +8.718855694e-04f, +1.273853588e-04f, -1.236769037e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.681123248e-03f, -4.785089996e-03f, -6.750903286e-03f, +2.176621020e-02f, -9.454423659e-03f, -2.571206699e-02f, +3.382271408e-02f, +1.032296367e-03f, -2.962867155e-02f, +1.771003506e-02f, +6.477871811e-03f, -1.049071481e-02f, +2.364981056e-03f, +9.238695501e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.443406978e-04f, +4.993024377e-04f, -6.542235037e-04f, -3.826536696e-04f, +1.773941977e-03f, -1.281436392e-03f, -1.048961769e-03f, +2.238065516e-03f, -8.344149967e-04f, -9.837471310e-04f, +1.098333359e-03f, -2.065198836e-04f, -2.326918614e-04f, +1.236769037e-04f, +0.000000000e+00f, + /* 12, 8 (16) */ + +0.000000000e+00f, -3.536782550e-03f, +2.376169748e-03f, +2.443592608e-02f, -3.006511003e-02f, -7.781134492e-02f, +1.905831460e-01f, +5.389339970e-01f, +3.987506763e-01f, +1.103916721e-02f, -7.632431506e-02f, +1.122785192e-02f, +1.563726568e-02f, -4.071557642e-03f, -1.047546454e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.511372927e-04f, -6.548963973e-04f, -7.534058889e-05f, +3.135681689e-03f, -2.231618570e-03f, -1.298188307e-02f, -5.101595952e-03f, +1.175690690e-02f, +8.904257323e-03f, -1.986997111e-03f, -1.827499563e-03f, +8.571708297e-04f, +1.563512002e-04f, -1.303456357e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.536782550e-03f, -4.285787558e-03f, -7.405126790e-03f, +2.138355653e-02f, -7.680481682e-03f, -2.699350338e-02f, +3.277375231e-02f, +3.270361883e-03f, -3.046308655e-02f, +1.672628793e-02f, +7.576205170e-03f, -1.069723469e-02f, +2.132289195e-03f, +1.047546454e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.511372927e-04f, +4.974070735e-04f, -6.028130504e-04f, -4.606581604e-04f, +1.778763934e-03f, -1.166010816e-03f, -1.175111724e-03f, +2.235658703e-03f, -7.228465633e-04f, -1.069635157e-03f, +1.095768412e-03f, -1.659035242e-04f, -2.564802355e-04f, +1.303456357e-04f, +0.000000000e+00f, + /* 12, 9 (16) */ + +0.000000000e+00f, -3.385645257e-03f, +1.721273350e-03f, +2.436058549e-02f, -2.692942834e-02f, -8.004296349e-02f, +1.776012630e-01f, +5.338324011e-01f, +4.105075832e-01f, +1.994342454e-02f, -7.831131217e-02f, +9.400352354e-03f, +1.649443651e-02f, -3.915206442e-03f, -1.177892089e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.566433956e-04f, -6.230212655e-04f, -1.606143648e-04f, +3.096497783e-03f, -1.871208295e-03f, -1.283511581e-02f, -5.663750595e-03f, +1.145856232e-02f, +9.272694527e-03f, -1.797087722e-03f, -1.946045754e-03f, +8.381124214e-04f, +1.864024591e-04f, -1.366645282e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.385645257e-03f, -3.788380484e-03f, -8.007939840e-03f, +2.092289837e-02f, -5.901717748e-03f, -2.815951420e-02f, +3.159864059e-02f, +5.506020586e-03f, -3.118593311e-02f, +1.565665278e-02f, +8.671973582e-03f, -1.086313821e-02f, +1.875808959e-03f, +1.177892089e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.566433956e-04f, +4.931458313e-04f, -5.501939069e-04f, -5.350640050e-04f, +1.776117314e-03f, -1.046672423e-03f, -1.296255929e-03f, +2.224050523e-03f, -6.070830886e-04f, -1.152437526e-03f, +1.088243314e-03f, -1.230760375e-04f, -2.799926206e-04f, +1.366645282e-04f, +0.000000000e+00f, + /* 12,10 (16) */ + +0.000000000e+00f, -3.229001861e-03f, +1.098252085e-03f, +2.419997112e-02f, -2.383293056e-02f, -8.191417179e-02f, +1.647661472e-01f, +5.281686505e-01f, +4.219661455e-01f, +2.921611906e-02f, -8.010839990e-02f, +7.454306600e-03f, +1.733254893e-02f, -3.728803982e-03f, -1.314556618e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.609066568e-04f, -5.902048503e-04f, -2.414043130e-04f, +3.048101298e-03f, -1.519769638e-03f, -1.266684045e-02f, -6.213483468e-03f, +1.113634503e-02f, +9.631737766e-03f, -1.593003017e-03f, -2.062477569e-03f, +8.145866919e-04f, +2.174503254e-04f, -1.425683828e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.229001861e-03f, -3.295234653e-03f, -8.558133747e-03f, +2.038783436e-02f, -4.125600433e-03f, -2.920618662e-02f, +3.030238466e-02f, +7.730071109e-03f, -3.179301620e-02f, +1.450421525e-02f, +9.760216896e-03f, -1.098621425e-02f, +1.595816339e-03f, +1.314556618e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.609066568e-04f, +4.866253339e-04f, -4.966473970e-04f, -6.056082532e-04f, +1.766112914e-03f, -9.239624617e-04f, -1.411884346e-03f, +2.203253147e-03f, -4.875875456e-04f, -1.231732925e-03f, +1.075677213e-03f, -7.818278249e-05f, -3.030841367e-04f, +1.425683828e-04f, +0.000000000e+00f, + /* 12,11 (16) */ + +0.000000000e+00f, -3.068095205e-03f, +5.080472344e-04f, +2.395856681e-02f, -2.078482926e-02f, -8.343394143e-02f, +1.520993067e-01f, +5.219551670e-01f, +4.331024906e-01f, +3.884785683e-02f, -8.170140291e-02f, +5.391829031e-03f, +1.814713562e-02f, -3.511353657e-03f, -1.457125001e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.639787953e-04f, -5.566389658e-04f, -3.175869031e-04f, +2.991013617e-03f, -1.177976993e-03f, -1.247777800e-02f, -6.749620078e-03f, +1.079079066e-02f, +9.980314267e-03f, -1.374862402e-03f, -2.176267689e-03f, +7.864838679e-04f, +2.493965726e-04f, -1.479907330e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.068095205e-03f, -2.808609319e-03f, -9.054781144e-03f, +1.978222611e-02f, -2.359487519e-03f, -3.013014908e-02f, +2.889050031e-02f, +9.933324256e-03f, -3.228060375e-02f, +1.327248232e-02f, +1.083589411e-02f, -1.106439703e-02f, +1.292732202e-03f, +1.457125001e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.639787953e-04f, +4.779608069e-04f, -4.424523385e-04f, -6.720509461e-04f, +1.748893602e-03f, -7.984334752e-04f, -1.521512318e-03f, +2.173319910e-03f, -3.648441826e-04f, -1.307109985e-03f, +1.058012069e-03f, -3.138407093e-05f, -3.256070155e-04f, +1.479907330e-04f, +0.000000000e+00f, + /* 12,12 (16) */ + +0.000000000e+00f, -2.904116409e-03f, -4.859173137e-05f, +2.364097991e-02f, -1.779381564e-02f, -8.461191842e-02f, +1.396215287e-01f, +5.152055469e-01f, +4.438932812e-01f, +4.882817110e-02f, -8.307626532e-02f, +3.215561342e-03f, +1.893361949e-02f, -3.261957084e-03f, -1.605115733e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.659151412e-04f, -5.225101230e-04f, -3.890615635e-04f, +2.925767848e-03f, -8.464617203e-04f, -1.226869559e-02f, -7.271024717e-03f, +1.042249929e-02f, +1.031736263e-02f, -1.142831727e-03f, -2.286878964e-03f, +7.537090649e-04f, +2.821336218e-04f, -1.528641683e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.904116409e-03f, -2.330648512e-03f, -9.497233483e-03f, +1.911017517e-02f, -6.105939172e-04f, -3.092858256e-02f, +2.736898799e-02f, +1.210664417e-02f, -3.264544793e-02f, +1.196537234e-02f, +1.189390618e-02f, -1.109578111e-02f, +9.671251867e-04f, +1.605115733e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.659151412e-04f, +4.672751941e-04f, -3.878836788e-04f, -7.341758823e-04f, +1.724633258e-03f, -6.706466594e-04f, -1.624682761e-03f, +2.134345200e-03f, -2.393564281e-04f, -1.378169419e-03f, +1.035213400e-03f, +1.714530120e-05f, -3.474113734e-04f, +1.528641683e-04f, +0.000000000e+00f, + /* 12,13 (16) */ + +0.000000000e+00f, -2.738201268e-03f, -5.711018543e-04f, +2.325191834e-02f, -1.486804779e-02f, -8.545838014e-02f, +1.273528331e-01f, +5.079345222e-01f, +4.543157805e-01f, +5.914553372e-02f, -8.421909704e-02f, +9.286823783e-04f, +1.968732855e-02f, -2.979823463e-03f, -1.757979902e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.667741787e-04f, -4.879989052e-04f, -4.557502649e-04f, +2.852906664e-03f, -5.258110017e-04f, -1.204040375e-02f, -7.776603617e-03f, +1.003213403e-02f, +1.064183619e-02f, -8.971237883e-04f, -2.393766071e-03f, +7.161832671e-04f, +3.155446549e-04f, -1.571206790e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.738201268e-03f, -1.863373318e-03f, -9.885117161e-03f, +1.837599928e-02f, +1.114039340e-03f, -3.159922922e-02f, +2.574430523e-02f, +1.424098937e-02f, -3.288480436e-02f, +1.058720292e-02f, +1.292911958e-02f, -1.107863580e-02f, +6.197138133e-04f, +1.757979902e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.667741787e-04f, +4.546982540e-04f, -3.332111809e-04f, -7.917912538e-04f, +1.693535578e-03f, -5.411691939e-04f, -1.720968237e-03f, +2.086464164e-03f, -1.116446844e-04f, -1.444526114e-03f, +1.007270919e-03f, +6.721661228e-05f, -3.683460194e-04f, +1.571206790e-04f, +0.000000000e+00f, + /* 12,14 (16) */ + +0.000000000e+00f, -2.571427089e-03f, -1.059100760e-03f, +2.279616808e-02f, -1.201514113e-02f, -8.598419114e-02f, +1.153124294e-01f, +5.001579186e-01f, +4.643479146e-01f, +6.978736991e-02f, -8.511622083e-02f, -1.465083693e-03f, +2.040351182e-02f, -2.664278808e-03f, -1.915100581e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.666170916e-04f, -4.532793947e-04f, -5.175970275e-04f, +2.772980170e-03f, -2.165668702e-04f, -1.179375349e-02f, -8.265307979e-03f, +9.620419455e-03f, +1.095270642e-02f, -6.379986660e-04f, -2.496377269e-03f, +6.738442733e-04f, +3.495037769e-04f, -1.606920188e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.571427089e-03f, -1.408675064e-03f, -1.021832834e-02f, +1.758420803e-02f, +2.807574919e-03f, -3.214039841e-02f, +2.402333700e-02f, +1.632745353e-02f, -3.299644904e-02f, +9.142676806e-03f, +1.393639050e-02f, -1.101141919e-02f, +2.513677939e-04f, +1.915100581e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.666170916e-04f, +4.403656415e-04f, -2.786981641e-04f, -8.447301477e-04f, +1.655832748e-03f, -4.105715627e-04f, -1.809972867e-03f, +2.029852206e-03f, +1.775597749e-05f, -1.505811183e-03f, +9.741990656e-04f, +1.186278635e-04f, -3.882592950e-04f, +1.606920188e-04f, +0.000000000e+00f, + /* 12,15 (16) */ + +0.000000000e+00f, -2.404809998e-03f, -1.512380154e-03f, +2.227857105e-02f, -9.242160959e-03f, -8.620075801e-02f, +1.035186759e-01f, +4.918926106e-01f, +4.739683340e-01f, +8.074007633e-02f, -8.575421950e-02f, -3.961460961e-03f, +2.107735609e-02f, -2.314775031e-03f, -2.075792600e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.655073135e-04f, -4.185186487e-04f, -5.745673555e-04f, +2.686543794e-03f, +8.077459724e-05f, -1.152963333e-02f, -8.736136835e-03f, +9.188139768e-03f, +1.124896622e-02f, -3.657639165e-04f, -2.594156203e-03f, +6.266476024e-04f, +3.838762280e-04f, -1.635100847e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.404809998e-03f, -9.683094227e-04f, -1.049702651e-02f, +1.673947788e-02f, +4.463407667e-03f, -3.255096997e-02f, +2.221336413e-02f, +1.835730573e-02f, -3.297869306e-02f, +7.636865623e-03f, +1.491058956e-02f, -1.089279133e-02f, -1.368915011e-04f, +2.075792600e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.655073135e-04f, +4.244179817e-04f, -2.246003067e-04f, -8.928509148e-04f, +1.611783985e-03f, -2.794248771e-04f, -1.891334096e-03f, +1.964724298e-03f, +1.482982130e-04f, -1.561673971e-03f, +9.360374043e-04f, +1.711645148e-04f, -4.069999399e-04f, +1.635100847e-04f, +0.000000000e+00f, + /* 12,16 (16) */ + +0.000000000e+00f, -2.239302684e-03f, -1.930898803e-03f, +2.170400369e-02f, -6.555617165e-03f, -8.611998341e-02f, +9.198904255e-02f, +4.831564738e-01f, +4.831564738e-01f, +9.198904255e-02f, -8.611998341e-02f, -6.555617165e-03f, +2.170400369e-02f, -1.930898803e-03f, -2.239302684e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.635100847e-04f, -3.838762280e-04f, -6.266476024e-04f, +2.594156203e-03f, +3.657639165e-04f, -1.124896622e-02f, -9.188139768e-03f, +8.736136835e-03f, +1.152963333e-02f, -8.077459724e-05f, -2.686543794e-03f, +5.745673555e-04f, +4.185186487e-04f, -1.655073135e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.239302684e-03f, -5.438914410e-04f, -1.072162681e-02f, +1.584662697e-02f, +6.075191651e-03f, -3.283039485e-02f, +2.032203003e-02f, +2.032203003e-02f, -3.283039485e-02f, +6.075191651e-03f, +1.584662697e-02f, -1.072162681e-02f, -5.438914410e-04f, +2.239302684e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.635100847e-04f, +4.069999399e-04f, -1.711645148e-04f, -9.360374043e-04f, +1.561673971e-03f, -1.482982130e-04f, -1.964724298e-03f, +1.891334096e-03f, +2.794248771e-04f, -1.611783985e-03f, +8.928509148e-04f, +2.246003067e-04f, -4.244179817e-04f, +1.655073135e-04f, +0.000000000e+00f, + /* 12,17 (16) */ + +0.000000000e+00f, -2.075792600e-03f, -2.314775031e-03f, +2.107735609e-02f, -3.961460961e-03f, -8.575421950e-02f, +8.074007633e-02f, +4.739683340e-01f, +4.918926106e-01f, +1.035186759e-01f, -8.620075801e-02f, -9.242160959e-03f, +2.227857105e-02f, -1.512380154e-03f, -2.404809998e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.606920188e-04f, -3.495037769e-04f, -6.738442733e-04f, +2.496377269e-03f, +6.379986660e-04f, -1.095270642e-02f, -9.620419455e-03f, +8.265307979e-03f, +1.179375349e-02f, +2.165668702e-04f, -2.772980170e-03f, +5.175970275e-04f, +4.532793947e-04f, -1.666170916e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.075792600e-03f, -1.368915011e-04f, -1.089279133e-02f, +1.491058956e-02f, +7.636865623e-03f, -3.297869306e-02f, +1.835730573e-02f, +2.221336413e-02f, -3.255096997e-02f, +4.463407667e-03f, +1.673947788e-02f, -1.049702651e-02f, -9.683094227e-04f, +2.404809998e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.606920188e-04f, +3.882592950e-04f, -1.186278635e-04f, -9.741990656e-04f, +1.505811183e-03f, -1.775597749e-05f, -2.029852206e-03f, +1.809972867e-03f, +4.105715627e-04f, -1.655832748e-03f, +8.447301477e-04f, +2.786981641e-04f, -4.403656415e-04f, +1.666170916e-04f, +0.000000000e+00f, + /* 12,18 (16) */ + +0.000000000e+00f, -1.915100581e-03f, -2.664278808e-03f, +2.040351182e-02f, -1.465083693e-03f, -8.511622083e-02f, +6.978736991e-02f, +4.643479146e-01f, +5.001579186e-01f, +1.153124294e-01f, -8.598419114e-02f, -1.201514113e-02f, +2.279616808e-02f, -1.059100760e-03f, -2.571427089e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.571206790e-04f, -3.155446549e-04f, -7.161832671e-04f, +2.393766071e-03f, +8.971237883e-04f, -1.064183619e-02f, -1.003213403e-02f, +7.776603617e-03f, +1.204040375e-02f, +5.258110017e-04f, -2.852906664e-03f, +4.557502649e-04f, +4.879989052e-04f, -1.667741787e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.915100581e-03f, +2.513677939e-04f, -1.101141919e-02f, +1.393639050e-02f, +9.142676806e-03f, -3.299644904e-02f, +1.632745353e-02f, +2.402333700e-02f, -3.214039841e-02f, +2.807574919e-03f, +1.758420803e-02f, -1.021832834e-02f, -1.408675064e-03f, +2.571427089e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.571206790e-04f, +3.683460194e-04f, -6.721661228e-05f, -1.007270919e-03f, +1.444526114e-03f, +1.116446844e-04f, -2.086464164e-03f, +1.720968237e-03f, +5.411691939e-04f, -1.693535578e-03f, +7.917912538e-04f, +3.332111809e-04f, -4.546982540e-04f, +1.667741787e-04f, +0.000000000e+00f, + /* 12,19 (16) */ + +0.000000000e+00f, -1.757979902e-03f, -2.979823463e-03f, +1.968732855e-02f, +9.286823783e-04f, -8.421909704e-02f, +5.914553372e-02f, +4.543157805e-01f, +5.079345222e-01f, +1.273528331e-01f, -8.545838014e-02f, -1.486804779e-02f, +2.325191834e-02f, -5.711018543e-04f, -2.738201268e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.528641683e-04f, -2.821336218e-04f, -7.537090649e-04f, +2.286878964e-03f, +1.142831727e-03f, -1.031736263e-02f, -1.042249929e-02f, +7.271024717e-03f, +1.226869559e-02f, +8.464617203e-04f, -2.925767848e-03f, +3.890615635e-04f, +5.225101230e-04f, -1.659151412e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.757979902e-03f, +6.197138133e-04f, -1.107863580e-02f, +1.292911958e-02f, +1.058720292e-02f, -3.288480436e-02f, +1.424098937e-02f, +2.574430523e-02f, -3.159922922e-02f, +1.114039340e-03f, +1.837599928e-02f, -9.885117161e-03f, -1.863373318e-03f, +2.738201268e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.528641683e-04f, +3.474113734e-04f, -1.714530120e-05f, -1.035213400e-03f, +1.378169419e-03f, +2.393564281e-04f, -2.134345200e-03f, +1.624682761e-03f, +6.706466594e-04f, -1.724633258e-03f, +7.341758823e-04f, +3.878836788e-04f, -4.672751941e-04f, +1.659151412e-04f, +0.000000000e+00f, + /* 12,20 (16) */ + +0.000000000e+00f, -1.605115733e-03f, -3.261957084e-03f, +1.893361949e-02f, +3.215561342e-03f, -8.307626532e-02f, +4.882817110e-02f, +4.438932812e-01f, +5.152055469e-01f, +1.396215287e-01f, -8.461191842e-02f, -1.779381564e-02f, +2.364097991e-02f, -4.859173137e-05f, -2.904116409e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.479907330e-04f, -2.493965726e-04f, -7.864838679e-04f, +2.176267689e-03f, +1.374862402e-03f, -9.980314267e-03f, -1.079079066e-02f, +6.749620078e-03f, +1.247777800e-02f, +1.177976993e-03f, -2.991013617e-03f, +3.175869031e-04f, +5.566389658e-04f, -1.639787953e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.605115733e-03f, +9.671251867e-04f, -1.109578111e-02f, +1.189390618e-02f, +1.196537234e-02f, -3.264544793e-02f, +1.210664417e-02f, +2.736898799e-02f, -3.092858256e-02f, -6.105939172e-04f, +1.911017517e-02f, -9.497233483e-03f, -2.330648512e-03f, +2.904116409e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.479907330e-04f, +3.256070155e-04f, +3.138407093e-05f, -1.058012069e-03f, +1.307109985e-03f, +3.648441826e-04f, -2.173319910e-03f, +1.521512318e-03f, +7.984334752e-04f, -1.748893602e-03f, +6.720509461e-04f, +4.424523385e-04f, -4.779608069e-04f, +1.639787953e-04f, +0.000000000e+00f, + /* 12,21 (16) */ + +0.000000000e+00f, -1.457125001e-03f, -3.511353657e-03f, +1.814713562e-02f, +5.391829031e-03f, -8.170140291e-02f, +3.884785683e-02f, +4.331024906e-01f, +5.219551670e-01f, +1.520993067e-01f, -8.343394143e-02f, -2.078482926e-02f, +2.395856681e-02f, +5.080472344e-04f, -3.068095205e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.425683828e-04f, -2.174503254e-04f, -8.145866919e-04f, +2.062477569e-03f, +1.593003017e-03f, -9.631737766e-03f, -1.113634503e-02f, +6.213483468e-03f, +1.266684045e-02f, +1.519769638e-03f, -3.048101298e-03f, +2.414043130e-04f, +5.902048503e-04f, -1.609066568e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.457125001e-03f, +1.292732202e-03f, -1.106439703e-02f, +1.083589411e-02f, +1.327248232e-02f, -3.228060375e-02f, +9.933324256e-03f, +2.889050031e-02f, -3.013014908e-02f, -2.359487519e-03f, +1.978222611e-02f, -9.054781144e-03f, -2.808609319e-03f, +3.068095205e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.425683828e-04f, +3.030841367e-04f, +7.818278249e-05f, -1.075677213e-03f, +1.231732925e-03f, +4.875875456e-04f, -2.203253147e-03f, +1.411884346e-03f, +9.239624617e-04f, -1.766112914e-03f, +6.056082532e-04f, +4.966473970e-04f, -4.866253339e-04f, +1.609066568e-04f, +0.000000000e+00f, + /* 12,22 (16) */ + +0.000000000e+00f, -1.314556618e-03f, -3.728803982e-03f, +1.733254893e-02f, +7.454306600e-03f, -8.010839990e-02f, +2.921611906e-02f, +4.219661455e-01f, +5.281686505e-01f, +1.647661472e-01f, -8.191417179e-02f, -2.383293056e-02f, +2.419997112e-02f, +1.098252085e-03f, -3.229001861e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.366645282e-04f, -1.864024591e-04f, -8.381124214e-04f, +1.946045754e-03f, +1.797087722e-03f, -9.272694527e-03f, -1.145856232e-02f, +5.663750595e-03f, +1.283511581e-02f, +1.871208295e-03f, -3.096497783e-03f, +1.606143648e-04f, +6.230212655e-04f, -1.566433956e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.314556618e-03f, +1.595816339e-03f, -1.098621425e-02f, +9.760216896e-03f, +1.450421525e-02f, -3.179301620e-02f, +7.730071109e-03f, +3.030238466e-02f, -2.920618662e-02f, -4.125600433e-03f, +2.038783436e-02f, -8.558133747e-03f, -3.295234653e-03f, +3.229001861e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.366645282e-04f, +2.799926206e-04f, +1.230760375e-04f, -1.088243314e-03f, +1.152437526e-03f, +6.070830886e-04f, -2.224050523e-03f, +1.296255929e-03f, +1.046672423e-03f, -1.776117314e-03f, +5.350640050e-04f, +5.501939069e-04f, -4.931458313e-04f, +1.566433956e-04f, +0.000000000e+00f, + /* 12,23 (16) */ + +0.000000000e+00f, -1.177892089e-03f, -3.915206442e-03f, +1.649443651e-02f, +9.400352354e-03f, -7.831131217e-02f, +1.994342454e-02f, +4.105075832e-01f, +5.338324011e-01f, +1.776012630e-01f, -8.004296349e-02f, -2.692942834e-02f, +2.436058549e-02f, +1.721273350e-03f, -3.385645257e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.303456357e-04f, -1.563512002e-04f, -8.571708297e-04f, +1.827499563e-03f, +1.986997111e-03f, -8.904257323e-03f, -1.175690690e-02f, +5.101595952e-03f, +1.298188307e-02f, +2.231618570e-03f, -3.135681689e-03f, +7.534058889e-05f, +6.548963973e-04f, -1.511372927e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.177892089e-03f, +1.875808959e-03f, -1.086313821e-02f, +8.671973582e-03f, +1.565665278e-02f, -3.118593311e-02f, +5.506020586e-03f, +3.159864059e-02f, -2.815951420e-02f, -5.901717748e-03f, +2.092289837e-02f, -8.007939840e-03f, -3.788380484e-03f, +3.385645257e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.303456357e-04f, +2.564802355e-04f, +1.659035242e-04f, -1.095768412e-03f, +1.069635157e-03f, +7.228465633e-04f, -2.235658703e-03f, +1.175111724e-03f, +1.166010816e-03f, -1.778763934e-03f, +4.606581604e-04f, +6.028130504e-04f, -4.974070735e-04f, +1.511372927e-04f, +0.000000000e+00f, + /* 12,24 (16) */ + +0.000000000e+00f, -1.047546454e-03f, -4.071557642e-03f, +1.563726568e-02f, +1.122785192e-02f, -7.632431506e-02f, +1.103916721e-02f, +3.987506763e-01f, +5.389339970e-01f, +1.905831460e-01f, -7.781134492e-02f, -3.006511003e-02f, +2.443592608e-02f, +2.376169748e-03f, -3.536782550e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.236769037e-04f, -1.273853588e-04f, -8.718855694e-04f, +1.707354887e-03f, +2.162657576e-03f, -8.527506920e-03f, -1.203090876e-02f, +4.528229520e-03f, +1.310647006e-02f, +2.600284341e-03f, -3.165145520e-03f, -1.427019117e-05f, +6.856338003e-04f, -1.443406978e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.047546454e-03f, +2.132289195e-03f, -1.069723469e-02f, +7.576205170e-03f, +1.672628793e-02f, -3.046308655e-02f, +3.270361883e-03f, +3.277375231e-02f, -2.699350338e-02f, -7.680481682e-03f, +2.138355653e-02f, -7.405126790e-03f, -4.285787558e-03f, +3.536782550e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.236769037e-04f, +2.326918614e-04f, +2.065198836e-04f, -1.098333359e-03f, +9.837471310e-04f, +8.344149967e-04f, -2.238065516e-03f, +1.048961769e-03f, +1.281436392e-03f, -1.773941977e-03f, +3.826536696e-04f, +6.542235037e-04f, -4.993024377e-04f, +1.443406978e-04f, +0.000000000e+00f, + /* 12,25 (16) */ + +0.000000000e+00f, -9.238695501e-04f, -4.198943001e-03f, +1.476538011e-02f, +1.293520680e-02f, -7.416165749e-02f, +2.511660294e-03f, +3.867197676e-01f, +5.434622265e-01f, +2.036896161e-01f, -7.521106058e-02f, -3.323025555e-02f, +2.442165588e-02f, +3.061803548e-03f, -3.681123248e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.167219582e-04f, -9.958431085e-05f, -8.823931394e-04f, +1.586114692e-03f, +2.324040518e-03f, -8.143528724e-03f, -1.228016450e-02f, +3.944893367e-03f, +1.320825590e-02f, +2.976449226e-03f, -3.184397829e-03f, -1.080476075e-04f, +7.150331173e-04f, -1.362104842e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.238695501e-04f, +2.364981056e-03f, -1.049071481e-02f, +6.477871811e-03f, +1.771003506e-02f, -2.962867155e-02f, +1.032296367e-03f, +3.382271408e-02f, -2.571206699e-02f, -9.454423659e-03f, +2.176621020e-02f, -6.750903286e-03f, -4.785089996e-03f, +3.681123248e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.167219582e-04f, +2.087687550e-04f, +2.447950865e-04f, -1.096040968e-03f, +8.952025607e-04f, +9.413486665e-04f, -2.231299853e-03f, +9.183391548e-04f, +1.392421801e-03f, -1.761573627e-03f, +3.013355759e-04f, +7.041428442e-04f, -4.987347624e-04f, +1.362104842e-04f, +0.000000000e+00f, + /* 12,26 (16) */ + +0.000000000e+00f, -8.071475918e-04f, -4.298527311e-03f, +1.388298697e-02f, +1.452132150e-02f, -7.183761697e-02f, -5.631868430e-03f, +3.744396031e-01f, +5.474071199e-01f, +2.168978720e-01f, -7.223461136e-02f, -3.641465338e-02f, +2.431360828e-02f, +3.776836665e-03f, -3.817333732e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.095425711e-04f, -7.301802684e-05f, -8.888418324e-04f, +1.464267602e-03f, +2.471161414e-03f, -7.753409447e-03f, -1.250433805e-02f, +3.352858125e-03f, +1.328667344e-02f, +3.359318218e-03f, -3.192965380e-03f, -2.057975852e-04f, +7.428908444e-04f, -1.267084991e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.071475918e-04f, +2.573749811e-03f, -1.024591972e-02f, +5.381830843e-03f, +1.860523762e-02f, -2.868732288e-02f, -1.199003486e-03f, +3.474105324e-02f, -2.431964519e-02f, -1.121599729e-02f, +2.206754578e-02f, -6.046760442e-03f, -5.283824758e-03f, +3.817333732e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.095425711e-04f, +1.848478580e-04f, +2.806147185e-04f, -1.089015067e-03f, +8.044361941e-04f, +1.043232948e-03f, -2.215431384e-03f, +7.837975882e-04f, +1.498456150e-03f, -1.741614807e-03f, +2.170099927e-04f, +7.522889935e-04f, -4.956171750e-04f, +1.267084991e-04f, +0.000000000e+00f, + /* 12,27 (16) */ + +0.000000000e+00f, -6.976050208e-04f, -4.371545338e-03f, +1.299414513e-02f, +1.598558910e-02f, -6.936645555e-02f, -1.338527788e-02f, +3.619352650e-01f, +5.507599780e-01f, +2.301845454e-01f, -6.887529314e-02f, -3.960761876e-02f, +2.410781069e-02f, +4.519727509e-03f, -3.944042231e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.021983993e-04f, -4.774714309e-05f, -8.913906677e-04f, +1.342286574e-03f, +2.604078761e-03f, -7.358233815e-03f, -1.270316126e-02f, +2.753419381e-03f, +1.334121144e-02f, +3.748059468e-03f, -3.190395290e-03f, -3.073022708e-04f, +7.690011385e-04f, -1.158020071e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.976050208e-04f, +2.758597669e-03f, -9.965305001e-03f, +4.292815776e-03f, +1.940967382e-02f, -2.764408994e-02f, -3.414434869e-03f, +3.552485082e-02f, -2.282118904e-02f, -1.295761209e-02f, +2.228455577e-02f, -5.294471448e-03f, -5.779441933e-03f, +3.944042231e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.021983993e-04f, +1.610611489e-04f, +3.138801756e-04f, -1.077399460e-03f, +7.118862561e-04f, +1.139680024e-03f, -2.190570068e-03f, +6.459088539e-04f, +1.599047487e-03f, -1.714055781e-03f, +1.300029546e-04f, +7.983816905e-04f, -4.898738829e-04f, +1.158020071e-04f, +0.000000000e+00f, + /* 12,28 (16) */ + +0.000000000e+00f, -5.954066215e-04f, -4.419292481e-03f, +1.210275447e-02f, +1.732787567e-02f, -6.676237679e-02f, -2.074351169e-02f, +3.492321037e-01f, +5.535133974e-01f, +2.435257569e-01f, -6.512723367e-02f, -4.279801405e-02f, +2.380050842e-02f, +5.288728648e-03f, -4.059844238e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.474674824e-05f, -2.382307579e-05f, -8.902083165e-04f, +1.220627670e-03f, +2.722892879e-03f, -6.959081326e-03f, -1.287643418e-02f, +2.147893981e-03f, +1.337141665e-02f, +4.141806227e-03f, -3.176257150e-03f, -4.123200544e-04f, +7.931566664e-04f, -1.034641234e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.954066215e-04f, +2.919658818e-03f, -9.651424826e-03f, +3.215416316e-03f, +2.012156007e-02f, -2.650440991e-02f, -5.605004937e-03f, +3.617075968e-02f, -2.122214155e-02f, -1.467166787e-02f, +2.241455872e-02f, -4.496089758e-03f, -6.269315816e-03f, +4.059844238e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.474674824e-05f, +1.375350439e-04f, +3.445087681e-04f, -1.061356810e-03f, +6.179923005e-04f, +1.230330450e-03f, -2.156865482e-03f, +5.052601862e-04f, +1.693725217e-03f, -1.678921589e-03f, +4.065915088e-05f, +8.421439845e-04f, -4.814409226e-04f, +1.034641234e-04f, +0.000000000e+00f, + /* 12,29 (16) */ + +0.000000000e+00f, -5.006598732e-04f, -4.443115557e-03f, +1.121254615e-02f, +1.854850334e-02f, -6.403948391e-02f, -2.770259302e-02f, +3.363556696e-01f, +5.556612914e-01f, +2.568971735e-01f, -6.098542744e-02f, -4.597427120e-02f, +2.338818837e-02f, +6.081885314e-03f, -4.163308361e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.724235721e-05f, -1.288174649e-06f, -8.854720214e-04f, +1.099728929e-03f, +2.827744606e-03f, -6.557023064e-03f, -1.302402520e-02f, +1.537616264e-03f, +1.337689571e-02f, +4.539658940e-03f, -3.150145112e-03f, -5.205856872e-04f, +8.151494921e-04f, -8.967423475e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.006598732e-04f, +3.057193862e-03f, -9.306916058e-03f, +2.154059507e-03f, +2.073955237e-02f, -2.527407946e-02f, -7.761870419e-03f, +3.667601986e-02f, -1.952841633e-02f, -1.635058946e-02f, +2.245521787e-02f, -3.653945773e-03f, -6.750756739e-03f, +4.163308361e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.724235721e-05f, +1.143898470e-04f, +3.724337367e-04f, -1.041067443e-03f, +5.231930854e-04f, +1.314854568e-03f, -2.114505956e-03f, +3.624515650e-04f, +1.782042421e-03f, -1.636272318e-03f, -5.065945679e-05f, +8.833037439e-04f, -4.702668609e-04f, +8.967423475e-05f, +0.000000000e+00f, + /* 12,30 (16) */ + +0.000000000e+00f, -4.134175160e-04f, -4.444403732e-03f, +1.032707413e-02f, +1.964823227e-02f, -6.121173931e-02f, -3.425961608e-02f, +3.233316444e-01f, +5.571989077e-01f, +2.702740692e-01f, -5.644576850e-02f, -4.912441631e-02f, +2.286760268e-02f, +6.897034807e-03f, -4.252982596e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.973720911e-05f, +1.982408569e-05f, -8.773665173e-04f, +9.800093305e-04f, +2.918813877e-03f, -6.153118587e-03f, -1.314587089e-02f, +9.239342327e-04f, +1.335731689e-02f, +4.940687470e-03f, -3.111679936e-03f, -6.318104988e-04f, +8.347719996e-04f, -7.441840558e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.134175160e-04f, +3.171583709e-03f, -8.934482321e-03f, +1.112992064e-03f, +2.126274546e-02f, -2.395922489e-02f, -9.876376375e-03f, +3.703847143e-02f, -1.774637391e-02f, -1.798686178e-02f, +2.240455842e-02f, -2.770642030e-03f, -7.221023599e-03f, +4.252982596e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.973720911e-05f, +9.173925168e-05f, +3.976041819e-04f, -1.016728084e-03f, +4.279244817e-04f, +1.392953765e-03f, -2.063717530e-03f, +2.180929495e-04f, +1.863578082e-03f, -1.586203207e-03f, -1.435751254e-04f, +9.215951689e-04f, -4.563134437e-04f, +7.441840558e-05f, +0.000000000e+00f, + /* 12,31 (16) */ + +0.000000000e+00f, -3.336803069e-04f, -4.424579646e-03f, +9.449707611e-03f, +2.062824160e-02f, -5.829292543e-02f, -4.041273467e-02f, +3.101857735e-01f, +5.581228419e-01f, +2.836313861e-01f, -5.150508103e-02f, -5.223609625e-02f, +2.223579218e-02f, +7.731806806e-03f, -4.327401002e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.228036347e-05f, +3.948887869e-05f, -8.660829573e-04f, +8.618678673e-04f, +2.996318192e-03f, -5.748412892e-03f, -1.324197575e-02f, +3.082056865e-04f, +1.331241160e-02f, +5.343933472e-03f, -3.060510991e-03f, -7.456827132e-04f, +8.518178481e-04f, -5.768976579e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.336803069e-04f, +3.263322961e-03f, -8.536878139e-03f, +9.626398011e-05f, +2.169066994e-02f, -2.256627113e-02f, -1.194009391e-02f, +3.725656438e-02f, -1.588279583e-02f, -1.957306499e-02f, +2.226098329e-02f, -1.849046861e-03f, -7.677337043e-03f, +4.327401002e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.228036347e-05f, +6.968989714e-05f, +4.199849082e-04f, -9.885505371e-04f, +3.326174256e-04f, +1.464361568e-03f, -2.004762733e-03f, +7.280146223e-05f, +1.937939192e-03f, -1.528844573e-03f, -2.376959244e-04f, +9.567603037e-04f, -4.395561877e-04f, +5.768976579e-05f, +0.000000000e+00f, + /* 13, 0 (12) */ + +4.667314234e-04f, +2.059782291e-02f, -3.327331987e-02f, -6.726305712e-02f, +2.829989411e-01f, +5.957604134e-01f, +2.829989411e-01f, -6.726305712e-02f, -3.327331987e-02f, +2.059782291e-02f, +4.667314234e-04f, -1.052077910e-03f, + -4.122616604e-04f, -2.110775905e-04f, +3.298206916e-03f, -3.815088899e-03f, -1.525035079e-02f, -3.810071488e-04f, +1.524673848e-02f, +4.284051325e-03f, -3.328935618e-03f, +1.266826698e-04f, +4.460980491e-04f, -1.091787758e-04f, + -3.950298292e-03f, +1.359255440e-03f, +1.656242101e-02f, -2.092552594e-02f, -1.221715500e-02f, +3.732936584e-02f, -1.221715500e-02f, -2.092552594e-02f, +1.656242101e-02f, +1.359255440e-03f, -3.950298292e-03f, +4.123088596e-04f, + +2.027049756e-04f, -6.325482595e-04f, +2.453987339e-04f, +1.329735890e-03f, -1.872425123e-03f, -7.050431205e-05f, +1.936185460e-03f, -1.272919965e-03f, -3.215169699e-04f, +6.562259075e-04f, -1.951957310e-04f, -6.396508586e-06f, + /* 13, 1 (12) */ + +5.446976298e-05f, +2.038674532e-02f, -2.997511296e-02f, -7.107814602e-02f, +2.677485903e-01f, +5.953794063e-01f, +2.982456796e-01f, -6.297900580e-02f, -3.660225549e-02f, +2.072450558e-02f, +9.128294725e-04f, -1.161256685e-03f, + -3.784585558e-04f, -2.897846701e-04f, +3.255255062e-03f, -3.354484262e-03f, -1.522089498e-02f, -1.142027182e-03f, +1.520958842e-02f, +4.760164822e-03f, -3.346738359e-03f, +3.671875380e-05f, +4.797623354e-04f, -1.115633374e-04f, + -3.747593316e-03f, +7.267071801e-04f, +1.680781975e-02f, -1.959579005e-02f, -1.408958012e-02f, +3.725886153e-02f, -1.028096954e-02f, -2.219844591e-02f, +1.624090404e-02f, +2.015481347e-03f, -4.145494023e-03f, +4.059123510e-04f, + +2.085845515e-04f, -6.068231235e-04f, +1.703636618e-04f, +1.380000724e-03f, -1.801595605e-03f, -2.112080461e-04f, +1.992539666e-03f, -1.209699291e-03f, -3.983827397e-04f, +6.776518272e-04f, -1.860167439e-04f, -1.343995169e-05f, + /* 13, 2 (12) */ + -3.239887928e-04f, +2.009696065e-02f, -2.671985789e-02f, -7.443263029e-02f, +2.525276953e-01f, +5.942373791e-01f, +3.134552680e-01f, -5.821884098e-02f, -3.994899385e-02f, +2.076122433e-02f, +1.392591808e-03f, -1.272820023e-03f, + -3.448826313e-04f, -3.627180567e-04f, +3.200804569e-03f, -2.903386621e-03f, -1.515893813e-02f, -1.900067829e-03f, +1.513853115e-02f, +5.242168496e-03f, -3.350937692e-03f, -5.866148612e-05f, +5.130382847e-04f, -1.131016723e-04f, + -3.539008765e-03f, +1.198840566e-04f, +1.697818341e-02f, -1.821578933e-02f, -1.589117572e-02f, +3.704765348e-02f, -8.288429870e-03f, -2.340814520e-02f, +1.584252131e-02f, +2.693133174e-03f, -4.331510767e-03f, +3.924723993e-04f, + +2.128828168e-04f, -5.792588735e-04f, +9.673397891e-05f, +1.423601243e-03f, -1.724063779e-03f, -3.509985769e-04f, +2.041182561e-03f, -1.140253075e-03f, -4.756484828e-04f, +6.966272125e-04f, -1.751368193e-04f, -2.101743717e-05f, + /* 13, 3 (12) */ + -6.688714241e-04f, +1.973424259e-02f, -2.351905333e-02f, -7.733601691e-02f, +2.373687572e-01f, +5.923373113e-01f, +3.285937991e-01f, -5.297667248e-02f, -4.329993154e-02f, +2.070256285e-02f, +1.905630093e-03f, -1.385921695e-03f, + -3.117157438e-04f, -4.298239302e-04f, +3.135597999e-03f, -2.462884638e-03f, -1.506514186e-02f, -2.653154167e-03f, +1.503329967e-02f, +5.728750876e-03f, -3.340885179e-03f, -1.592708602e-04f, +5.456995484e-04f, -1.137119681e-04f, + -3.326125948e-03f, -4.593748169e-04f, +1.707491739e-02f, -1.679218809e-02f, -1.761523950e-02f, +3.669665491e-02f, -6.247247309e-03f, -2.454839827e-02f, +1.536687282e-02f, +3.389760387e-03f, -4.506647586e-03f, +3.714549621e-04f, + +2.156557882e-04f, -5.500667276e-04f, +2.481713253e-05f, +1.460457427e-03f, -1.640224450e-03f, -4.892719846e-04f, +2.081842445e-03f, -1.064792956e-03f, -5.529562791e-04f, +7.129599965e-04f, -1.625341969e-04f, -2.910137426e-05f, + /* 13, 4 (12) */ + -9.805871679e-04f, +1.930441866e-02f, -2.038345533e-02f, -7.979890154e-02f, +2.223036153e-01f, +5.896841571e-01f, +3.436270988e-01f, -4.724792160e-02f, -4.664081672e-02f, +2.054329199e-02f, +2.451329641e-03f, -1.499633663e-03f, + -2.791272556e-04f, -4.910794196e-04f, +3.060392336e-03f, -2.034003686e-03f, -1.494025893e-02f, -3.399328234e-03f, +1.489373133e-02f, +6.218553791e-03f, -3.315965017e-03f, -2.648871138e-04f, +5.775104921e-04f, -1.133140058e-04f, + -3.110470160e-03f, -1.009441545e-03f, +1.709973452e-02f, -1.533173066e-02f, -1.925546395e-02f, +3.620738292e-02f, -4.165404864e-03f, -2.561319123e-02f, +1.481391654e-02f, +4.102720383e-03f, -4.669181783e-03f, +3.423535879e-04f, + +2.169664862e-04f, -5.194594773e-04f, -4.509547366e-05f, +1.490522365e-03f, -1.550498232e-03f, -6.254316455e-04f, +2.114282635e-03f, -9.835624004e-04f, -6.299395067e-04f, +7.264661526e-04f, -1.481970653e-04f, -3.765856183e-05f, + /* 13, 5 (12) */ + -1.259714424e-03f, +1.881333924e-02f, -1.732306299e-02f, -8.183290523e-02f, +2.073633564e-01f, +5.862848289e-01f, +3.585208301e-01f, -4.102936781e-02f, -4.995678174e-02f, +2.027840487e-02f, +3.028840133e-03f, -1.612947669e-03f, + -2.472736694e-04f, -5.464914084e-04f, +2.975955388e-03f, -1.617703411e-03f, -1.478512959e-02f, -4.136655713e-03f, +1.471976944e-02f, +6.710176499e-03f, -3.275597609e-03f, -3.752525352e-04f, +6.082271138e-04f, -1.118298311e-04f, + -2.893503673e-03f, -1.528901022e-03f, +1.705463905e-02f, -1.384120829e-02f, -2.080596219e-02f, +3.558195128e-02f, -2.051122229e-03f, -2.659675363e-02f, +1.418397704e-02f, +4.829186536e-03f, -4.817378848e-03f, +3.046950260e-04f, + +2.168842588e-04f, -4.876502430e-04f, -1.127296324e-04f, +1.513781996e-03f, -1.455329316e-03f, -7.588910977e-04f, +2.138302843e-03f, -8.968359192e-04f, -7.062245809e-04f, +7.369709832e-04f, -1.321240280e-04f, -4.665017954e-05f, + /* 13, 6 (12) */ + -1.506988093e-03f, +1.826684783e-02f, -1.434710760e-02f, -8.345060864e-02f, +1.925782268e-01f, +5.821481731e-01f, +3.732405996e-01f, -3.431919132e-02f, -5.323237935e-02f, +1.990315234e-02f, +3.637067247e-03f, -1.724777500e-03f, + -2.162983549e-04f, -5.960952367e-04f, +2.883062253e-03f, -1.214875599e-03f, -1.460067770e-02f, -4.863232522e-03f, +1.451146435e-02f, +7.202180058e-03f, -3.219243078e-03f, -4.900737240e-04f, +6.375980530e-04f, -1.091844442e-04f, + -2.676619415e-03f, -2.016551265e-03f, +1.694190942e-02f, -1.232742630e-02f, -2.226129150e-02f, +3.482306018e-02f, +8.718061384e-05f, -2.749358955e-02f, +1.347775246e-02f, +5.566157519e-03f, -4.949502876e-03f, +2.580448465e-04f, + +2.154840876e-04f, -4.548512623e-04f, -1.778293686e-04f, +1.530254679e-03f, -1.355183132e-03f, -8.890768524e-04f, +2.153740373e-03f, -8.049181191e-04f, -7.814327649e-04f, +7.443103889e-04f, -1.143245190e-04f, -5.603182102e-05f, + /* 13, 7 (12) */ + -1.723286448e-03f, +1.767075260e-02f, -1.146404535e-02f, -8.466548424e-02f, +1.779775491e-01f, +5.772849406e-01f, +3.877520639e-01f, -2.711701126e-02f, -5.645162242e-02f, +1.941307861e-02f, +4.274665300e-03f, -1.833961944e-03f, + -1.863313626e-04f, -6.399533126e-04f, +2.782491851e-03f, -8.263423637e-04f, -1.438790645e-02f, -5.577191289e-03f, +1.426897428e-02f, +7.693091924e-03f, -3.146404707e-03f, -6.090215279e-04f, +6.653656857e-04f, -1.053065026e-04f, + -2.461135327e-03f, -2.471402527e-03f, +1.676408005e-02f, -1.079717162e-02f, -2.361647463e-02f, +3.393398333e-02f, +2.240920987e-03f, -2.829850767e-02f, +1.269631969e-02f, +6.310467908e-03f, -5.063827395e-03f, +2.020130255e-04f, + +2.128458812e-04f, -4.212727168e-04f, -2.401578552e-04f, +1.539990607e-03f, -1.250543921e-03f, -1.015431139e-03f, +2.160471134e-03f, -7.081425809e-04f, -8.551820431e-04f, +7.483321095e-04f, -9.481916130e-05f, -6.575357007e-05f, + /* 13, 8 (12) */ + -1.909617810e-03f, +1.703079929e-02f, -8.681553498e-03f, -8.549182660e-02f, +1.635896427e-01f, +5.717077493e-01f, +4.020210382e-01f, -1.942391933e-02f, -5.959802713e-02f, +1.880405709e-02f, +4.940030986e-03f, -1.939268447e-03f, + -1.574893238e-04f, -6.781536393e-04f, +2.675023529e-03f, -4.528546356e-04f, -1.414789389e-02f, -6.276707676e-03f, +1.399256560e-02f, +8.181410760e-03f, -3.056632268e-03f, -7.317311509e-04f, +6.912673055e-04f, -1.001290353e-04f, + -2.248289446e-03f, -2.892675244e-03f, +1.652392219e-02f, -9.257181012e-03f, -2.486701855e-02f, +3.291855219e-02f, +4.401392120e-03f, -2.900665025e-02f, +1.184113765e-02f, +7.058800017e-03f, -5.158646556e-03f, +1.362594554e-04f, + +2.090537622e-04f, -3.871216046e-04f, -2.994982043e-04f, +1.543071053e-03f, -1.141912228e-03f, -1.137414565e-03f, +2.158410463e-03f, -6.068705757e-04f, -9.270890492e-04f, +7.488969293e-04f, -7.364006599e-05f, -7.576012094e-05f, + /* 13, 9 (12) */ + -2.067107134e-03f, +1.635264565e-02f, -6.006529970e-03f, -8.594468124e-02f, +1.494417488e-01f, +5.654310417e-01f, +4.160136038e-01f, -1.124250857e-02f, -6.265465940e-02f, +1.807232594e-02f, +5.631298291e-03f, -2.039397482e-03f, + -1.298754343e-04f, -7.108082717e-04f, +2.561433778e-03f, -9.509098033e-05f, -1.388178823e-02f, -6.960006524e-03f, +1.368261284e-02f, +8.665611439e-03f, -2.949525249e-03f, -8.578024405e-04f, +7.150363840e-04f, -9.359016142e-05f, + -2.039235684e-03f, -3.279796849e-03f, +1.622442399e-02f, -7.714109959e-03f, -2.600893078e-02f, +3.178113762e-02f, +6.559802583e-03f, -2.961352082e-02f, +1.091404860e-02f, +7.807696947e-03f, -5.232286622e-03f, +6.049933448e-05f, + +2.041953504e-04f, -3.526006638e-04f, -3.556541343e-04f, +1.539607480e-03f, -1.029802339e-03f, -1.254508685e-03f, +2.147513754e-03f, -5.014896212e-04f, -9.967710368e-04f, +7.458798377e-04f, -5.083106712e-05f, -8.599094342e-05f, + /* 13,10 (12) */ + -2.196982568e-03f, +1.564183737e-02f, -3.445096192e-03f, -8.603977222e-02f, +1.355599605e-01f, +5.584710351e-01f, +4.296962167e-01f, -2.576897136e-03f, -6.560418465e-02f, +1.721452350e-02f, +6.346334675e-03f, -2.132987644e-03f, + -1.035795163e-04f, -7.380517100e-04f, +2.442493044e-03f, +2.463432767e-04f, -1.359080291e-02f, -7.625367814e-03f, +1.333959818e-02f, +9.144150220e-03f, -2.824735942e-03f, -9.868003555e-04f, +7.364039095e-04f, -8.563381123e-05f, + -1.835040333e-03f, -3.632397512e-03f, +1.586876985e-02f, -6.174502479e-03f, -2.703873312e-02f, +3.052662894e-02f, +8.707316338e-03f, -3.011501045e-02f, +9.917277561e-03f, +8.553576784e-03f, -5.283117689e-03f, -2.549160894e-05f, + +1.983610502e-04f, -3.179073510e-04f, -4.084505094e-04f, +1.529740495e-03f, -9.147396575e-04f, -1.366218456e-03f, +2.127776888e-03f, -3.924118856e-04f, -1.063847884e-03f, +7.391711375e-04f, -2.644788973e-05f, -9.638049292e-05f, + /* 13,11 (12) */ + -2.300562085e-03f, +1.490378566e-02f, -1.002603147e-03f, -8.579342894e-02f, +1.219691576e-01f, +5.508456673e-01f, +4.430358148e-01f, +6.567253084e-03f, -6.842892059e-02f, +1.622772314e-02f, +7.082738584e-03f, -2.218621455e-03f, + -7.867815891e-05f, -7.600392416e-04f, +2.318962671e-03f, +5.709166087e-04f, -1.327621148e-02f, -8.271132396e-03f, +1.296411057e-02f, +9.615470084e-03f, -2.681972387e-03f, -1.118255620e-03f, +7.550997970e-04f, -7.621044297e-05f, + -1.636679283e-03f, -3.950304863e-03f, +1.546031934e-02f, -4.644761985e-03f, -2.795347278e-02f, +2.916041048e-02f, +1.083509323e-02f, -3.050742233e-02f, +8.853429677e-03f, +9.292747922e-03f, -5.309565579e-03f, -1.218721019e-04f, + +1.916433438e-04f, -2.832328815e-04f, -4.577337520e-04f, +1.513638670e-03f, -7.972580578e-04f, -1.472074572e-03f, +2.099236453e-03f, -2.800724448e-04f, -1.127944121e-03f, +7.286774941e-04f, -5.582472163e-07f, -1.068584657e-04f, + /* 13,12 (12) */ + -2.379240244e-03f, +1.414374642e-02f, +1.316359524e-03f, -8.522251234e-02f, +1.086929461e-01f, +5.425745349e-01f, +4.559999254e-01f, +1.618272317e-02f, -7.111089298e-02f, +1.510946752e-02f, +7.837838381e-03f, -2.294831898e-03f, + -5.523492886e-05f, -7.769452423e-04f, +2.191591966e-03f, +8.781715374e-04f, -1.293934225e-02f, -8.895707478e-03f, +1.255684449e-02f, +1.007800620e-02f, -2.521001147e-03f, -1.251665564e-03f, +7.708543661e-04f, -6.527775164e-05f, + -1.445035939e-03f, -4.233537745e-03f, +1.500258559e-02f, -3.131123314e-03f, -2.875073084e-02f, +2.768833591e-02f, +1.293432968e-02f, -3.078749478e-02f, +7.725485557e-03f, +1.002142542e-02f, -5.310123826e-03f, -2.287305676e-04f, + +1.841360964e-04f, -2.487613335e-04f, -5.033721282e-04f, +1.491497241e-03f, -6.778972102e-04f, -1.571635666e-03f, +2.061969768e-03f, -1.649274018e-04f, -1.188690968e-03f, +7.143229162e-04f, +2.675813412e-05f, -1.173500990e-04f, + /* 13,13 (12) */ + -2.434475173e-03f, +1.336680118e-02f, +3.507951490e-03f, -8.434434080e-02f, +9.575360390e-02f, +5.336788274e-01f, +4.685567699e-01f, +2.626072937e-02f, -7.363189412e-02f, +1.385780196e-02f, +8.608692748e-03f, -2.360109649e-03f, + -3.330065123e-05f, -7.889614458e-04f, +2.061115410e-03f, +1.167724577e-03f, -1.258157294e-02f, -9.497571855e-03f, +1.211859820e-02f, +1.053019151e-02f, -2.341649902e-03f, -1.386495152e-03f, +7.833998794e-04f, -5.280136448e-05f, + -1.260899843e-03f, -4.482299078e-03f, +1.449921346e-02f, -1.639626073e-03f, -2.942862805e-02f, +2.611670024e-02f, +1.499629945e-02f, -3.095242218e-02f, +6.536794588e-03f, +1.073574833e-02f, -5.283365692e-03f, -3.460806666e-04f, + +1.759338775e-04f, -2.146688219e-04f, -5.452559065e-04f, +1.463536678e-03f, -5.571999031e-04f, -1.664490364e-03f, +2.016094696e-03f, -4.745187593e-05f, -1.245728378e-03f, +6.960496621e-04f, +5.540956598e-05f, -1.277765152e-04f, + /* 13,14 (12) */ + -2.467775824e-03f, +1.257783973e-02f, +5.569066900e-03f, -8.317661622e-02f, +8.317203096e-02f, +5.241812556e-01f, +4.806753681e-01f, +3.679092087e-02f, -7.597354403e-02f, +1.247130680e-02f, +9.392092627e-03f, -2.412911014e-03f, + -1.291375314e-05f, -7.962951917e-04f, +1.928250023e-03f, +1.439265878e-03f, -1.220432505e-02f, -1.007528085e-02f, +1.165027166e-02f, +1.097046239e-02f, -2.143809849e-03f, -1.522178203e-03f, +7.924721368e-04f, -3.875551810e-05f, + -1.084965965e-03f, -4.696967900e-03f, +1.395395756e-02f, -1.760893956e-04f, -2.998582795e-02f, +2.445220988e-02f, +1.701239414e-02f, -3.099987405e-02f, +5.291066210e-03f, +1.143179799e-02f, -5.227956126e-03f, -4.738571818e-04f, + +1.671313016e-04f, -1.811227425e-04f, -5.832973933e-04f, +1.430001151e-03f, -4.357093718e-04f, -1.750259188e-03f, +1.961769251e-03f, +7.186212692e-05f, -1.298707061e-03f, +6.738190635e-04f, +8.529252613e-05f, -1.380551095e-04f, + /* 13,15 (12) */ + -2.480689577e-03f, +1.178154454e-02f, +7.497316922e-03f, -8.173735034e-02f, +7.096770591e-02f, +5.141059747e-01f, +4.923256397e-01f, +4.776138327e-02f, -7.811735387e-02f, +1.094912860e-02f, +1.018456476e-02f, -2.451666532e-03f, + +5.899333034e-06f, -7.991676621e-04f, +1.793692879e-03f, +1.692558582e-03f, -1.180905820e-02f, -1.062747093e-02f, +1.115286407e-02f, +1.139726444e-02f, -1.927437888e-03f, -1.658118799e-03f, +7.978121172e-04f, -2.312371193e-05f, + -9.178346638e-04f, -4.878090643e-03f, +1.337066016e-02f, +1.253911755e-03f, -3.042153732e-02f, +2.270195069e-02f, +1.897416339e-02f, -3.092801193e-02f, +3.992359149e-03f, +1.210561706e-02f, -5.142663600e-03f, -6.119122913e-04f, + +1.578223934e-04f, -1.482810923e-04f, -6.174308449e-04f, +1.391156898e-03f, -3.139666497e-04f, -1.828596289e-03f, +1.899191006e-03f, +1.925079550e-04f, -1.347290496e-03f, +6.476122611e-04f, +1.162918651e-04f, -1.480999791e-04f, + /* 13,16 (12) */ + -2.474790244e-03f, +1.098237688e-02f, +9.291009802e-03f, -8.004479176e-02f, +5.915864770e-02f, +5.034785038e-01f, +5.034785038e-01f, +5.915864770e-02f, -8.004479176e-02f, +9.291009802e-03f, +1.098237688e-02f, -2.474790244e-03f, + +2.312371193e-05f, -7.978121172e-04f, +1.658118799e-03f, +1.927437888e-03f, -1.139726444e-02f, -1.115286407e-02f, +1.062747093e-02f, +1.180905820e-02f, -1.692558582e-03f, -1.793692879e-03f, +7.991676621e-04f, -5.899333034e-06f, + -7.600122705e-04f, -5.026371735e-03f, +1.275322932e-02f, +2.645068653e-03f, -3.073550397e-02f, +2.087335440e-02f, +2.087335440e-02f, -3.073550397e-02f, +2.645068653e-03f, +1.275322932e-02f, -5.026371735e-03f, -7.600122705e-04f, + +1.480999791e-04f, -1.162918651e-04f, -6.476122611e-04f, +1.347290496e-03f, -1.925079550e-04f, -1.899191006e-03f, +1.828596289e-03f, +3.139666497e-04f, -1.391156898e-03f, +6.174308449e-04f, +1.482810923e-04f, -1.578223934e-04f, + /* 13,17 (12) */ + -2.451666532e-03f, +1.018456476e-02f, +1.094912860e-02f, -7.811735387e-02f, +4.776138327e-02f, +4.923256397e-01f, +5.141059747e-01f, +7.096770591e-02f, -8.173735034e-02f, +7.497316922e-03f, +1.178154454e-02f, -2.480689577e-03f, + +3.875551810e-05f, -7.924721368e-04f, +1.522178203e-03f, +2.143809849e-03f, -1.097046239e-02f, -1.165027166e-02f, +1.007528085e-02f, +1.220432505e-02f, -1.439265878e-03f, -1.928250023e-03f, +7.962951917e-04f, +1.291375314e-05f, + -6.119122913e-04f, -5.142663600e-03f, +1.210561706e-02f, +3.992359149e-03f, -3.092801193e-02f, +1.897416339e-02f, +2.270195069e-02f, -3.042153732e-02f, +1.253911755e-03f, +1.337066016e-02f, -4.878090643e-03f, -9.178346638e-04f, + +1.380551095e-04f, -8.529252613e-05f, -6.738190635e-04f, +1.298707061e-03f, -7.186212692e-05f, -1.961769251e-03f, +1.750259188e-03f, +4.357093718e-04f, -1.430001151e-03f, +5.832973933e-04f, +1.811227425e-04f, -1.671313016e-04f, + /* 13,18 (12) */ + -2.412911014e-03f, +9.392092627e-03f, +1.247130680e-02f, -7.597354403e-02f, +3.679092087e-02f, +4.806753681e-01f, +5.241812556e-01f, +8.317203096e-02f, -8.317661622e-02f, +5.569066900e-03f, +1.257783973e-02f, -2.467775824e-03f, + +5.280136448e-05f, -7.833998794e-04f, +1.386495152e-03f, +2.341649902e-03f, -1.053019151e-02f, -1.211859820e-02f, +9.497571855e-03f, +1.258157294e-02f, -1.167724577e-03f, -2.061115410e-03f, +7.889614458e-04f, +3.330065123e-05f, + -4.738571818e-04f, -5.227956126e-03f, +1.143179799e-02f, +5.291066210e-03f, -3.099987405e-02f, +1.701239414e-02f, +2.445220988e-02f, -2.998582795e-02f, -1.760893956e-04f, +1.395395756e-02f, -4.696967900e-03f, -1.084965965e-03f, + +1.277765152e-04f, -5.540956598e-05f, -6.960496621e-04f, +1.245728378e-03f, +4.745187593e-05f, -2.016094696e-03f, +1.664490364e-03f, +5.571999031e-04f, -1.463536678e-03f, +5.452559065e-04f, +2.146688219e-04f, -1.759338775e-04f, + /* 13,19 (12) */ + -2.360109649e-03f, +8.608692748e-03f, +1.385780196e-02f, -7.363189412e-02f, +2.626072937e-02f, +4.685567699e-01f, +5.336788274e-01f, +9.575360390e-02f, -8.434434080e-02f, +3.507951490e-03f, +1.336680118e-02f, -2.434475173e-03f, + +6.527775164e-05f, -7.708543661e-04f, +1.251665564e-03f, +2.521001147e-03f, -1.007800620e-02f, -1.255684449e-02f, +8.895707478e-03f, +1.293934225e-02f, -8.781715374e-04f, -2.191591966e-03f, +7.769452423e-04f, +5.523492886e-05f, + -3.460806666e-04f, -5.283365692e-03f, +1.073574833e-02f, +6.536794588e-03f, -3.095242218e-02f, +1.499629945e-02f, +2.611670024e-02f, -2.942862805e-02f, -1.639626073e-03f, +1.449921346e-02f, -4.482299078e-03f, -1.260899843e-03f, + +1.173500990e-04f, -2.675813412e-05f, -7.143229162e-04f, +1.188690968e-03f, +1.649274018e-04f, -2.061969768e-03f, +1.571635666e-03f, +6.778972102e-04f, -1.491497241e-03f, +5.033721282e-04f, +2.487613335e-04f, -1.841360964e-04f, + /* 13,20 (12) */ + -2.294831898e-03f, +7.837838381e-03f, +1.510946752e-02f, -7.111089298e-02f, +1.618272317e-02f, +4.559999254e-01f, +5.425745349e-01f, +1.086929461e-01f, -8.522251234e-02f, +1.316359524e-03f, +1.414374642e-02f, -2.379240244e-03f, + +7.621044297e-05f, -7.550997970e-04f, +1.118255620e-03f, +2.681972387e-03f, -9.615470084e-03f, -1.296411057e-02f, +8.271132396e-03f, +1.327621148e-02f, -5.709166087e-04f, -2.318962671e-03f, +7.600392416e-04f, +7.867815891e-05f, + -2.287305676e-04f, -5.310123826e-03f, +1.002142542e-02f, +7.725485557e-03f, -3.078749478e-02f, +1.293432968e-02f, +2.768833591e-02f, -2.875073084e-02f, -3.131123314e-03f, +1.500258559e-02f, -4.233537745e-03f, -1.445035939e-03f, + +1.068584657e-04f, +5.582472163e-07f, -7.286774941e-04f, +1.127944121e-03f, +2.800724448e-04f, -2.099236453e-03f, +1.472074572e-03f, +7.972580578e-04f, -1.513638670e-03f, +4.577337520e-04f, +2.832328815e-04f, -1.916433438e-04f, + /* 13,21 (12) */ + -2.218621455e-03f, +7.082738584e-03f, +1.622772314e-02f, -6.842892059e-02f, +6.567253084e-03f, +4.430358148e-01f, +5.508456673e-01f, +1.219691576e-01f, -8.579342894e-02f, -1.002603147e-03f, +1.490378566e-02f, -2.300562085e-03f, + +8.563381123e-05f, -7.364039095e-04f, +9.868003555e-04f, +2.824735942e-03f, -9.144150220e-03f, -1.333959818e-02f, +7.625367814e-03f, +1.359080291e-02f, -2.463432767e-04f, -2.442493044e-03f, +7.380517100e-04f, +1.035795163e-04f, + -1.218721019e-04f, -5.309565579e-03f, +9.292747922e-03f, +8.853429677e-03f, -3.050742233e-02f, +1.083509323e-02f, +2.916041048e-02f, -2.795347278e-02f, -4.644761985e-03f, +1.546031934e-02f, -3.950304863e-03f, -1.636679283e-03f, + +9.638049292e-05f, +2.644788973e-05f, -7.391711375e-04f, +1.063847884e-03f, +3.924118856e-04f, -2.127776888e-03f, +1.366218456e-03f, +9.147396575e-04f, -1.529740495e-03f, +4.084505094e-04f, +3.179073510e-04f, -1.983610502e-04f, + /* 13,22 (12) */ + -2.132987644e-03f, +6.346334675e-03f, +1.721452350e-02f, -6.560418465e-02f, -2.576897136e-03f, +4.296962167e-01f, +5.584710351e-01f, +1.355599605e-01f, -8.603977222e-02f, -3.445096192e-03f, +1.564183737e-02f, -2.196982568e-03f, + +9.359016142e-05f, -7.150363840e-04f, +8.578024405e-04f, +2.949525249e-03f, -8.665611439e-03f, -1.368261284e-02f, +6.960006524e-03f, +1.388178823e-02f, +9.509098033e-05f, -2.561433778e-03f, +7.108082717e-04f, +1.298754343e-04f, + -2.549160894e-05f, -5.283117689e-03f, +8.553576784e-03f, +9.917277561e-03f, -3.011501045e-02f, +8.707316338e-03f, +3.052662894e-02f, -2.703873312e-02f, -6.174502479e-03f, +1.586876985e-02f, -3.632397512e-03f, -1.835040333e-03f, + +8.599094342e-05f, +5.083106712e-05f, -7.458798377e-04f, +9.967710368e-04f, +5.014896212e-04f, -2.147513754e-03f, +1.254508685e-03f, +1.029802339e-03f, -1.539607480e-03f, +3.556541343e-04f, +3.526006638e-04f, -2.041953504e-04f, + /* 13,23 (12) */ + -2.039397482e-03f, +5.631298291e-03f, +1.807232594e-02f, -6.265465940e-02f, -1.124250857e-02f, +4.160136038e-01f, +5.654310417e-01f, +1.494417488e-01f, -8.594468124e-02f, -6.006529970e-03f, +1.635264565e-02f, -2.067107134e-03f, + +1.001290353e-04f, -6.912673055e-04f, +7.317311509e-04f, +3.056632268e-03f, -8.181410760e-03f, -1.399256560e-02f, +6.276707676e-03f, +1.414789389e-02f, +4.528546356e-04f, -2.675023529e-03f, +6.781536393e-04f, +1.574893238e-04f, + +6.049933448e-05f, -5.232286622e-03f, +7.807696947e-03f, +1.091404860e-02f, -2.961352082e-02f, +6.559802583e-03f, +3.178113762e-02f, -2.600893078e-02f, -7.714109959e-03f, +1.622442399e-02f, -3.279796849e-03f, -2.039235684e-03f, + +7.576012094e-05f, +7.364006599e-05f, -7.488969293e-04f, +9.270890492e-04f, +6.068705757e-04f, -2.158410463e-03f, +1.137414565e-03f, +1.141912228e-03f, -1.543071053e-03f, +2.994982043e-04f, +3.871216046e-04f, -2.090537622e-04f, + /* 13,24 (12) */ + -1.939268447e-03f, +4.940030986e-03f, +1.880405709e-02f, -5.959802713e-02f, -1.942391933e-02f, +4.020210382e-01f, +5.717077493e-01f, +1.635896427e-01f, -8.549182660e-02f, -8.681553498e-03f, +1.703079929e-02f, -1.909617810e-03f, + +1.053065026e-04f, -6.653656857e-04f, +6.090215279e-04f, +3.146404707e-03f, -7.693091924e-03f, -1.426897428e-02f, +5.577191289e-03f, +1.438790645e-02f, +8.263423637e-04f, -2.782491851e-03f, +6.399533126e-04f, +1.863313626e-04f, + +1.362594554e-04f, -5.158646556e-03f, +7.058800017e-03f, +1.184113765e-02f, -2.900665025e-02f, +4.401392120e-03f, +3.291855219e-02f, -2.486701855e-02f, -9.257181012e-03f, +1.652392219e-02f, -2.892675244e-03f, -2.248289446e-03f, + +6.575357007e-05f, +9.481916130e-05f, -7.483321095e-04f, +8.551820431e-04f, +7.081425809e-04f, -2.160471134e-03f, +1.015431139e-03f, +1.250543921e-03f, -1.539990607e-03f, +2.401578552e-04f, +4.212727168e-04f, -2.128458812e-04f, + /* 13,25 (12) */ + -1.833961944e-03f, +4.274665300e-03f, +1.941307861e-02f, -5.645162242e-02f, -2.711701126e-02f, +3.877520639e-01f, +5.772849406e-01f, +1.779775491e-01f, -8.466548424e-02f, -1.146404535e-02f, +1.767075260e-02f, -1.723286448e-03f, + +1.091844442e-04f, -6.375980530e-04f, +4.900737240e-04f, +3.219243078e-03f, -7.202180058e-03f, -1.451146435e-02f, +4.863232522e-03f, +1.460067770e-02f, +1.214875599e-03f, -2.883062253e-03f, +5.960952367e-04f, +2.162983549e-04f, + +2.020130255e-04f, -5.063827395e-03f, +6.310467908e-03f, +1.269631969e-02f, -2.829850767e-02f, +2.240920987e-03f, +3.393398333e-02f, -2.361647463e-02f, -1.079717162e-02f, +1.676408005e-02f, -2.471402527e-03f, -2.461135327e-03f, + +5.603182102e-05f, +1.143245190e-04f, -7.443103889e-04f, +7.814327649e-04f, +8.049181191e-04f, -2.153740373e-03f, +8.890768524e-04f, +1.355183132e-03f, -1.530254679e-03f, +1.778293686e-04f, +4.548512623e-04f, -2.154840876e-04f, + /* 13,26 (12) */ + -1.724777500e-03f, +3.637067247e-03f, +1.990315234e-02f, -5.323237935e-02f, -3.431919132e-02f, +3.732405996e-01f, +5.821481731e-01f, +1.925782268e-01f, -8.345060864e-02f, -1.434710760e-02f, +1.826684783e-02f, -1.506988093e-03f, + +1.118298311e-04f, -6.082271138e-04f, +3.752525352e-04f, +3.275597609e-03f, -6.710176499e-03f, -1.471976944e-02f, +4.136655713e-03f, +1.478512959e-02f, +1.617703411e-03f, -2.975955388e-03f, +5.464914084e-04f, +2.472736694e-04f, + +2.580448465e-04f, -4.949502876e-03f, +5.566157519e-03f, +1.347775246e-02f, -2.749358955e-02f, +8.718061384e-05f, +3.482306018e-02f, -2.226129150e-02f, -1.232742630e-02f, +1.694190942e-02f, -2.016551265e-03f, -2.676619415e-03f, + +4.665017954e-05f, +1.321240280e-04f, -7.369709832e-04f, +7.062245809e-04f, +8.968359192e-04f, -2.138302843e-03f, +7.588910977e-04f, +1.455329316e-03f, -1.513781996e-03f, +1.127296324e-04f, +4.876502430e-04f, -2.168842588e-04f, + /* 13,27 (12) */ + -1.612947669e-03f, +3.028840133e-03f, +2.027840487e-02f, -4.995678174e-02f, -4.102936781e-02f, +3.585208301e-01f, +5.862848289e-01f, +2.073633564e-01f, -8.183290523e-02f, -1.732306299e-02f, +1.881333924e-02f, -1.259714424e-03f, + +1.133140058e-04f, -5.775104921e-04f, +2.648871138e-04f, +3.315965017e-03f, -6.218553791e-03f, -1.489373133e-02f, +3.399328234e-03f, +1.494025893e-02f, +2.034003686e-03f, -3.060392336e-03f, +4.910794196e-04f, +2.791272556e-04f, + +3.046950260e-04f, -4.817378848e-03f, +4.829186536e-03f, +1.418397704e-02f, -2.659675363e-02f, -2.051122229e-03f, +3.558195128e-02f, -2.080596219e-02f, -1.384120829e-02f, +1.705463905e-02f, -1.528901022e-03f, -2.893503673e-03f, + +3.765856183e-05f, +1.481970653e-04f, -7.264661526e-04f, +6.299395067e-04f, +9.835624004e-04f, -2.114282635e-03f, +6.254316455e-04f, +1.550498232e-03f, -1.490522365e-03f, +4.509547366e-05f, +5.194594773e-04f, -2.169664862e-04f, + /* 13,28 (12) */ + -1.499633663e-03f, +2.451329641e-03f, +2.054329199e-02f, -4.664081672e-02f, -4.724792160e-02f, +3.436270988e-01f, +5.896841571e-01f, +2.223036153e-01f, -7.979890154e-02f, -2.038345533e-02f, +1.930441866e-02f, -9.805871679e-04f, + +1.137119681e-04f, -5.456995484e-04f, +1.592708602e-04f, +3.340885179e-03f, -5.728750876e-03f, -1.503329967e-02f, +2.653154167e-03f, +1.506514186e-02f, +2.462884638e-03f, -3.135597999e-03f, +4.298239302e-04f, +3.117157438e-04f, + +3.423535879e-04f, -4.669181783e-03f, +4.102720383e-03f, +1.481391654e-02f, -2.561319123e-02f, -4.165404864e-03f, +3.620738292e-02f, -1.925546395e-02f, -1.533173066e-02f, +1.709973452e-02f, -1.009441545e-03f, -3.110470160e-03f, + +2.910137426e-05f, +1.625341969e-04f, -7.129599965e-04f, +5.529562791e-04f, +1.064792956e-03f, -2.081842445e-03f, +4.892719846e-04f, +1.640224450e-03f, -1.460457427e-03f, -2.481713253e-05f, +5.500667276e-04f, -2.156557882e-04f, + /* 13,29 (12) */ + -1.385921695e-03f, +1.905630093e-03f, +2.070256285e-02f, -4.329993154e-02f, -5.297667248e-02f, +3.285937991e-01f, +5.923373113e-01f, +2.373687572e-01f, -7.733601691e-02f, -2.351905333e-02f, +1.973424259e-02f, -6.688714241e-04f, + +1.131016723e-04f, -5.130382847e-04f, +5.866148612e-05f, +3.350937692e-03f, -5.242168496e-03f, -1.513853115e-02f, +1.900067829e-03f, +1.515893813e-02f, +2.903386621e-03f, -3.200804569e-03f, +3.627180567e-04f, +3.448826313e-04f, + +3.714549621e-04f, -4.506647586e-03f, +3.389760387e-03f, +1.536687282e-02f, -2.454839827e-02f, -6.247247309e-03f, +3.669665491e-02f, -1.761523950e-02f, -1.679218809e-02f, +1.707491739e-02f, -4.593748169e-04f, -3.326125948e-03f, + +2.101743717e-05f, +1.751368193e-04f, -6.966272125e-04f, +4.756484828e-04f, +1.140253075e-03f, -2.041182561e-03f, +3.509985769e-04f, +1.724063779e-03f, -1.423601243e-03f, -9.673397891e-05f, +5.792588735e-04f, -2.128828168e-04f, + /* 13,30 (12) */ + -1.272820023e-03f, +1.392591808e-03f, +2.076122433e-02f, -3.994899385e-02f, -5.821884098e-02f, +3.134552680e-01f, +5.942373791e-01f, +2.525276953e-01f, -7.443263029e-02f, -2.671985789e-02f, +2.009696065e-02f, -3.239887928e-04f, + +1.115633374e-04f, -4.797623354e-04f, -3.671875380e-05f, +3.346738359e-03f, -4.760164822e-03f, -1.520958842e-02f, +1.142027182e-03f, +1.522089498e-02f, +3.354484262e-03f, -3.255255062e-03f, +2.897846701e-04f, +3.784585558e-04f, + +3.924723993e-04f, -4.331510767e-03f, +2.693133174e-03f, +1.584252131e-02f, -2.340814520e-02f, -8.288429870e-03f, +3.704765348e-02f, -1.589117572e-02f, -1.821578933e-02f, +1.697818341e-02f, +1.198840566e-04f, -3.539008765e-03f, + +1.343995169e-05f, +1.860167439e-04f, -6.776518272e-04f, +3.983827397e-04f, +1.209699291e-03f, -1.992539666e-03f, +2.112080461e-04f, +1.801595605e-03f, -1.380000724e-03f, -1.703636618e-04f, +6.068231235e-04f, -2.085845515e-04f, + /* 13,31 (12) */ + -1.161256685e-03f, +9.128294725e-04f, +2.072450558e-02f, -3.660225549e-02f, -6.297900580e-02f, +2.982456796e-01f, +5.953794063e-01f, +2.677485903e-01f, -7.107814602e-02f, -2.997511296e-02f, +2.038674532e-02f, +5.446976298e-05f, + +1.091787758e-04f, -4.460980491e-04f, -1.266826698e-04f, +3.328935618e-03f, -4.284051325e-03f, -1.524673848e-02f, +3.810071488e-04f, +1.525035079e-02f, +3.815088899e-03f, -3.298206916e-03f, +2.110775905e-04f, +4.122616604e-04f, + +4.059123510e-04f, -4.145494023e-03f, +2.015481347e-03f, +1.624090404e-02f, -2.219844591e-02f, -1.028096954e-02f, +3.725886153e-02f, -1.408958012e-02f, -1.959579005e-02f, +1.680781975e-02f, +7.267071801e-04f, -3.747593316e-03f, + +6.396508586e-06f, +1.951957310e-04f, -6.562259075e-04f, +3.215169699e-04f, +1.272919965e-03f, -1.936185460e-03f, +7.050431205e-05f, +1.872425123e-03f, -1.329735890e-03f, -2.453987339e-04f, +6.325482595e-04f, -2.027049756e-04f, + /* 14, 0 (12) */ + -3.483566868e-03f, +2.195707835e-02f, -1.671089886e-02f, -8.818858307e-02f, +2.707817861e-01f, +6.330897793e-01f, +2.707817861e-01f, -8.818858307e-02f, -1.671089886e-02f, +2.195707835e-02f, -3.483566868e-03f, -6.397690500e-04f, + -2.095566848e-04f, -8.436258499e-04f, +3.543605650e-03f, -2.485353009e-03f, -1.712277592e-02f, -4.515114608e-04f, +1.718292394e-02f, +3.011131360e-03f, -3.650452588e-03f, +7.829085773e-04f, +2.509023181e-04f, -1.155752844e-04f, + -2.786478503e-03f, -3.384442003e-03f, +1.860961494e-02f, -1.609625641e-02f, -1.593698094e-02f, +3.732936584e-02f, -1.593698094e-02f, -1.609625641e-02f, +1.860961494e-02f, -3.384442003e-03f, -2.786478503e-03f, +7.162108030e-04f, + +2.877351700e-04f, -5.205013231e-04f, -1.552916331e-04f, +1.621475507e-03f, -1.858124495e-03f, -7.900112358e-05f, +1.943254627e-03f, -1.581791628e-03f, +7.451458378e-05f, +5.621608250e-04f, -2.920940404e-04f, +4.492956993e-05f, + /* 14, 1 (12) */ + -3.693123553e-03f, +2.111345250e-02f, -1.316729321e-02f, -9.067393607e-02f, +2.536590102e-01f, +6.326382678e-01f, +2.879647100e-01f, -8.517745171e-02f, -2.036135145e-02f, +2.273998693e-02f, -3.232664550e-03f, -7.553443344e-04f, + -1.698740044e-04f, -8.966077936e-04f, +3.425618724e-03f, -1.974483539e-03f, -1.702249058e-02f, -1.353235228e-03f, +1.720212808e-02f, +3.550465531e-03f, -3.745121099e-03f, +7.143705810e-04f, +2.937455915e-04f, -1.250032891e-04f, + -2.498743333e-03f, -3.904943326e-03f, +1.845432331e-02f, -1.447478090e-02f, -1.779510544e-02f, +3.725036472e-02f, -1.399372632e-02f, -1.767804803e-02f, +1.868412953e-02f, -2.822281178e-03f, -3.078572543e-03f, +7.611403730e-04f, + +2.818251726e-04f, -4.778498449e-04f, -2.330186866e-04f, +1.652961485e-03f, -1.765331581e-03f, -2.366256669e-04f, +2.020246759e-03f, -1.533967754e-03f, -8.969655050e-06f, +6.025480632e-04f, -2.947864381e-04f, +4.119965783e-05f, + /* 14, 2 (12) */ + -3.862997557e-03f, +2.021684471e-02f, -9.741674484e-03f, -9.264841961e-02f, +2.366365196e-01f, +6.312850326e-01f, +3.051668381e-01f, -8.162698617e-02f, -2.410647254e-02f, +2.345435751e-02f, -2.938918959e-03f, -8.803476234e-04f, + -1.319998145e-04f, -9.419769302e-04f, +3.297538548e-03f, -1.479785379e-03f, -1.688300191e-02f, -2.251066406e-03f, +1.717971371e-02f, +4.101915421e-03f, -3.826586174e-03f, +6.379657263e-04f, +3.379014654e-04f, -1.341191095e-04f, + -2.216918160e-03f, -4.382793171e-03f, +1.822130462e-02f, -1.282181941e-02f, -1.956043702e-02f, +3.701373905e-02f, -1.197347956e-02f, -1.921201579e-02f, +1.867515987e-02f, -2.219733115e-03f, -3.373358981e-03f, +8.023400308e-04f, + +2.744845839e-04f, -4.344828754e-04f, -3.073778285e-04f, +1.676234961e-03f, -1.665386148e-03f, -3.931190910e-04f, +2.088663505e-03f, -1.478105414e-03f, -9.479479793e-05f, +6.413805850e-04f, -2.957032450e-04f, +3.666633283e-05f, + /* 14, 3 (12) */ + -3.994997372e-03f, +1.927486778e-02f, -6.444135936e-03f, -9.412820499e-02f, +2.197535177e-01f, +6.290339662e-01f, +3.223465518e-01f, -7.752507075e-02f, -2.793305872e-02f, +2.409232323e-02f, -2.601017493e-03f, -1.014466733e-03f, + -9.605995565e-05f, -9.798906578e-04f, +3.160415132e-03f, -1.002427212e-03f, -1.670536631e-02f, -3.142426152e-03f, +1.711514211e-02f, +4.663957920e-03f, -3.893841458e-03f, +5.536891363e-04f, +3.831653515e-04f, -1.428133424e-04f, + -1.942433576e-03f, -4.817276046e-03f, +1.791392679e-02f, -1.114558445e-02f, -2.122582317e-02f, +3.662061996e-02f, -9.884816051e-03f, -2.069012120e-02f, +1.858036507e-02f, -1.578352530e-03f, -3.669062226e-03f, +8.390063636e-04f, + +2.658380941e-04f, -3.906715309e-04f, -3.780772691e-04f, +1.691324078e-03f, -1.558830532e-03f, -5.477339459e-04f, +2.148107906e-03f, -1.414349844e-03f, -1.825726615e-04f, +6.783754690e-04f, -2.947425992e-04f, +3.131430453e-05f, + /* 14, 4 (12) */ + -4.091057328e-03f, +1.829497712e-02f, -3.283720804e-03f, -9.513063220e-02f, +2.030481514e-01f, +6.258915400e-01f, +3.394616939e-01f, -7.286111283e-02f, -3.182690018e-02f, +2.464601237e-02f, -2.217852142e-03f, -1.157280075e-03f, + -6.216076941e-05f, -1.010538897e-03f, +3.015296862e-03f, -5.434813215e-04f, -1.649075716e-02f, -4.024759880e-03f, +1.700801397e-02f, +5.234991390e-03f, -3.945904524e-03f, +4.615790388e-04f, +4.293134268e-04f, -1.509725676e-04f, + -1.676595482e-03f, -5.207947577e-03f, +1.753584952e-02f, -9.454260375e-03f, -2.278465370e-02f, +3.607288601e-02f, -7.736708145e-03f, -2.210447105e-02f, +1.839779241e-02f, -8.999770607e-04f, -3.963804825e-03f, +8.703206682e-04f, + +2.560135196e-04f, -3.466800695e-04f, -4.448524013e-04f, +1.698298923e-03f, -1.446236031e-03f, -6.997326862e-04f, +2.198225824e-03f, -1.342889811e-03f, -2.718949091e-04f, +7.132510745e-04f, -2.918109105e-04f, +2.513456335e-05f, + /* 14, 5 (12) */ + -4.153218097e-03f, +1.728443822e-02f, -2.684239422e-04f, -9.567411352e-02f, +1.865573942e-01f, +6.218667801e-01f, +3.564697079e-01f, -6.762612144e-02f, -3.577280470e-02f, +2.510759141e-02f, -1.788538715e-03f, -1.308252643e-03f, + -3.038941061e-05f, -1.034141651e-03f, +2.863225755e-03f, -1.039214152e-04f, -1.624045891e-02f, -4.895546810e-03f, +1.685807228e-02f, +5.813340580e-03f, -3.981822189e-03f, +3.617184481e-04f, +4.761030859e-04f, -1.584800107e-04f, + -1.420581962e-03f, -5.554627647e-03f, +1.709099712e-02f, -7.755961452e-03f, -2.423088973e-02f, +3.537315333e-02f, -5.538482321e-03f, -2.344736086e-02f, +1.812589750e-02f, -1.867259862e-04f, -4.255615736e-03f, +8.954552315e-04f, + +2.451407895e-04f, -3.027644889e-04f, -5.074666744e-04f, +1.697270512e-03f, -1.328199640e-03f, -8.483915534e-04f, +2.238708105e-03f, -1.263957192e-03f, -3.623349518e-04f, +7.457288302e-04f, -2.868238523e-04f, +1.812476249e-05f, + /* 14, 6 (12) */ + -4.183607508e-03f, +1.625029657e-02f, +2.594801813e-03f, -9.577803494e-02f, +1.703169353e-01f, +6.169712333e-01f, +3.733277802e-01f, -6.181278086e-02f, -3.975462689e-02f, +2.546930986e-02f, -1.312435629e-03f, -1.466732654e-03f, + -8.142673220e-07f, -1.050946499e-03f, +2.705232885e-03f, +3.153790798e-04f, -1.595586084e-02f, -5.752309374e-03f, +1.666520473e-02f, +6.397261939e-03f, -4.000675843e-03f, +2.542366648e-04f, +5.232735340e-04f, -1.652162652e-04f, + -1.175441173e-03f, -5.857392136e-03f, +1.658353045e-02f, -6.058690940e-03f, -2.555908937e-02f, +3.452476177e-02f, -3.299774216e-03f, -2.471131805e-02f, +1.776356255e-02f, +5.590028440e-04f, -4.542439588e-03f, +9.135799940e-04f, + +2.333509534e-04f, -2.591712155e-04f, -5.657122833e-04f, +1.688389547e-03f, -1.205340678e-03f, -9.930043805e-04f, +2.269292511e-03f, -1.177826303e-03f, -4.534499955e-04f, +7.755350544e-04f, -2.797073241e-04f, +1.028956101e-05f, + /* 14, 7 (12) */ + -4.184421775e-03f, +1.519935007e-02f, +5.300034698e-03f, -9.546265586e-02f, +1.543610745e-01f, +6.112189239e-01f, +3.899929849e-01f, -5.541551893e-02f, -4.375530273e-02f, +2.572354652e-02f, -7.891620951e-04f, -1.631948919e-03f, + +2.651451868e-05f, -1.061226029e-03f, +2.542333996e-03f, +7.136482429e-04f, -1.563845037e-02f, -6.592622428e-03f, +1.642944541e-02f, +6.984949343e-03f, -4.001586750e-03f, +1.393105816e-04f, +5.705465244e-04f, -1.710600727e-04f, + -9.420902195e-04f, -6.116563351e-03f, +1.601781816e-02f, -4.370301393e-03f, -2.676443005e-02f, +3.353175739e-02f, -1.030481705e-03f, -2.588914435e-02f, +1.731011255e-02f, +1.334537898e-03f, -4.822146912e-03f, +9.238695550e-04f, + +2.207752179e-04f, -2.161358931e-04f, -6.194106731e-04f, +1.671844972e-03f, -1.078297313e-03f, -1.132886295e-03f, +2.289765401e-03f, -1.084812977e-03f, -5.447832259e-04f, +8.024027933e-04f, -2.703983748e-04f, +1.640924043e-06f, + /* 14, 8 (12) */ + -4.157907256e-03f, +1.413812404e-02f, +7.842368693e-03f, -9.474900762e-02f, +1.387226241e-01f, +6.046263015e-01f, +4.064224303e-01f, -4.843056958e-02f, -4.775688948e-02f, +2.586285710e-02f, -2.186155707e-04f, -1.803008991e-03f, + +5.156443831e-05f, -1.065275244e-03f, +2.375525325e-03f, +1.090216417e-03f, -1.528980612e-02f, -7.414122240e-03f, +1.615097606e-02f, +7.574540184e-03f, -3.983721317e-03f, +1.716577841e-05f, +6.176272395e-04f, -1.758891562e-04f, + -7.213150016e-04f, -6.332699244e-03f, +1.539840749e-02f, -2.698456421e-03f, -2.784272736e-02f, +3.239887110e-02f, +1.259283696e-03f, -2.697395733e-02f, +1.676532933e-02f, +2.136940692e-03f, -5.092545287e-03f, +9.255104791e-04f, + +2.075440164e-04f, -1.738822750e-04f, -6.684128596e-04f, +1.647862332e-03f, -9.477230128e-04f, -1.267377302e-03f, +2.299963153e-03f, -9.852733917e-04f, -6.358661197e-04f, +8.260736675e-04f, -2.588460809e-04f, -7.801624059e-06f, + /* 14, 9 (12) */ + -4.106342818e-03f, +1.307284880e-02f, +1.021789402e-02f, -9.365879120e-02f, +1.234328180e-01f, +5.972121793e-01f, +4.225734064e-01f, -4.085602940e-02f, -5.174061080e-02f, +2.588002288e-02f, +3.990116688e-04f, -1.978898148e-03f, + +7.431991612e-05f, -1.063408936e-03f, +2.205779643e-03f, +1.444516500e-03f, -1.491159057e-02f, -8.214515209e-03f, +1.583012660e-02f, +8.164121817e-03f, -3.946296285e-03f, -1.119226028e-04f, +6.642053169e-04f, -1.795811048e-04f, + -5.137709852e-04f, -6.506581519e-03f, +1.472999463e-02f, -1.050594090e-03f, -2.879045037e-02f, +3.113149380e-02f, +3.559246850e-03f, -2.795923072e-02f, +1.612946321e-02f, +2.963014359e-03f, -5.351391368e-03f, +9.177088550e-04f, + +1.937861184e-04f, -1.326212247e-04f, -7.125995664e-04f, +1.616701951e-03f, -8.142829350e-04f, -1.395845724e-03f, +2.299773314e-03f, -8.796026607e-04f, -7.262208694e-04f, +8.462997143e-04f, -2.450123702e-04f, -1.801079715e-05f, + /* 14,10 (12) */ + -4.032022902e-03f, +1.200943986e-02f, +1.242367366e-02f, -9.221427470e-02f, +1.085212274e-01f, +5.889976641e-01f, +4.384035330e-01f, -3.269190758e-02f, -5.568690709e-02f, +2.576810028e-02f, +1.063216986e-03f, -2.158479252e-03f, + +9.478153387e-05f, -1.055959061e-03f, +2.034042535e-03f, +1.776083771e-03f, -1.450554257e-02f, -8.991586271e-03f, +1.546737506e-02f, +8.751738335e-03f, -3.888583826e-03f, -2.476292181e-04f, +7.099560197e-04f, -1.820143042e-04f, + -3.199848669e-04f, -6.639202744e-03f, +1.401739507e-02f, +5.661078616e-04f, -2.960473331e-02f, +2.973564807e-02f, +5.859020164e-03f, -2.883883338e-02f, +1.540324234e-02f, +3.809314073e-03f, -5.596403738e-03f, +8.996980578e-04f, + +1.796277841e-04f, -9.254982940e-05f, -7.518811835e-04f, +1.578656937e-03f, -6.786502876e-04f, -1.517691483e-03f, +2.289135474e-03f, -7.682331800e-04f, -8.153629108e-04f, +8.628452127e-04f, -2.288727852e-04f, -2.895139895e-05f, + /* 14,11 (12) */ + -3.937241368e-03f, +1.095348080e-02f, +1.445771620e-02f, -9.043819093e-02f, +9.401568484e-02f, +5.800060778e-01f, +4.538709081e-01f, -2.394016925e-02f, -5.957549091e-02f, +2.552047106e-02f, +1.773173005e-03f, -2.340493557e-03f, + +1.129651849e-04f, -1.043272123e-03f, +1.861228919e-03f, +2.084555279e-03f, -1.407346953e-02f, -9.743206968e-03f, +1.506334703e-02f, +9.335397639e-03f, -3.809916508e-03f, -3.895781260e-04f, +7.545415498e-04f, -1.830689087e-04f, + -1.403570827e-04f, -6.731752573e-03f, +1.326551388e-02f, +2.144764798e-03f, -3.028338360e-02f, +2.821795659e-02f, +8.148155638e-03f, -2.960706656e-02f, +1.458787943e-02f, +4.672159286e-03f, -5.825276523e-03f, +8.707466589e-04f, + +1.651919677e-04f, -5.385062770e-05f, -7.861975489e-04f, +1.534051030e-03f, -5.415026718e-04f, -1.632349197e-03f, +2.268041857e-03f, -6.516327482e-04f, -9.028035375e-04f, +8.754884812e-04f, -2.104171770e-04f, -4.058023191e-05f, + /* 14,12 (12) */ + -3.824276183e-03f, +9.910208678e-03f, +1.631894512e-02f, -8.835363565e-02f, +7.994221531e-02f, +5.702628708e-01f, +4.689342551e-01f, -1.460477161e-02f, -6.338540742e-02f, +2.513089294e-02f, +2.527714555e-03f, -2.523562465e-03f, + +1.289011675e-04f, -1.025706576e-03f, +1.688219838e-03f, +2.369668778e-03f, -1.361723946e-02f, -1.046734314e-02f, +1.461881426e-02f, +9.913078798e-03f, -3.709692115e-03f, -5.373426477e-04f, +7.976125002e-04f, -1.826278507e-04f, + +2.483488496e-05f, -6.785603201e-03f, +1.247931633e-02f, +3.678815829e-03f, -3.082488627e-02f, +2.658560739e-02f, +1.041619749e-02f, -3.025869931e-02f, +1.368507589e-02f, +5.547647767e-03f, -6.035693700e-03f, +8.301664270e-04f, + +1.505975742e-04f, -1.669095444e-05f, -8.155175604e-04f, +1.483236316e-03f, -4.035184337e-04f, -1.739291087e-03f, +2.236537626e-03f, -5.303024628e-04f, -9.880525889e-04f, +8.840236334e-04f, -1.896503245e-04f, -5.284606617e-05f, + /* 14,13 (12) */ + -3.695375015e-03f, +8.884502102e-03f, +1.800716495e-02f, -8.598396687e-02f, +6.632497585e-02f, +5.597955277e-01f, +4.835530693e-01f, -4.691692810e-03f, -6.709509954e-02f, +2.459355029e-02f, +3.325327055e-03f, -2.706190316e-03f, + +1.426332262e-04f, -1.003630268e-03f, +1.515859504e-03f, +2.631261254e-03f, -1.313877285e-02f, -1.116206222e-02f, +1.413469289e-02f, +1.048273963e-02f, -3.587378280e-03f, -6.904454897e-04f, +8.388094454e-04f, -1.805778797e-04f, + +1.754324591e-04f, -6.802294155e-03f, +1.166379877e-02f, +5.162052144e-03f, -3.122840470e-02f, +2.484631631e-02f, +1.265273512e-02f, -3.078900177e-02f, +1.269702330e-02f, +6.431671401e-03f, -6.225344025e-03f, +7.773203608e-04f, + +1.359587736e-04f, +1.877759626e-05f, -8.398386216e-04f, +1.426590804e-03f, -2.653730447e-04f, -1.838029668e-03f, +2.194720887e-03f, -4.047744056e-04f, -1.070621198e-03f, +8.882622810e-04f, -1.665924708e-04f, -6.568967103e-05f, + /* 14,14 (12) */ + -3.552741789e-03f, +7.880871834e-03f, +1.952302446e-02f, -8.335270562e-02f, +5.318620301e-02f, +5.486334655e-01f, +4.976877622e-01f, +5.791046820e-03f, -7.068247782e-02f, +2.390310480e-02f, +4.164136501e-03f, -2.886768196e-03f, + +1.542175485e-04f, -9.774179342e-04f, +1.344952629e-03f, +2.869267029e-03f, -1.264003442e-02f, -1.182554003e-02f, +1.361204091e-02f, +1.104232452e-02f, -3.442516910e-03f, -8.483591395e-04f, +8.777646629e-04f, -1.768106276e-04f, + +3.113912327e-04f, -6.783516559e-03f, +1.082396015e-02f, +6.588642948e-03f, -3.149377775e-02f, +2.300828664e-02f, +1.484745601e-02f, -3.119377618e-02f, +1.162640210e-02f, +7.319933682e-03f, -6.391936496e-03f, +7.116306898e-04f, + +1.213843752e-04f, +5.241958966e-05f, -8.591859308e-04f, +1.364515909e-03f, -1.277355294e-04f, -1.928120205e-03f, +2.142742413e-03f, -2.756091257e-04f, -1.150024578e-03f, +8.880351716e-04f, -1.412797720e-04f, -7.904391072e-05f, + /* 14,15 (12) */ + -3.398524241e-03f, +6.903453900e-03f, +2.086797709e-02f, -8.048343859e-02f, +4.054616859e-02f, +5.368079254e-01f, +5.112998031e-01f, +1.683337134e-02f, -7.412499473e-02f, +2.305474566e-02f, +5.041901164e-03f, -3.063578823e-03f, + +1.637217264e-04f, -9.474487544e-04f, +1.176262034e-03f, +3.083715479e-03f, -1.212302485e-02f, -1.245606722e-02f, +1.305205507e-02f, +1.158977239e-02f, -3.274728383e-03f, -1.010506538e-03f, +9.141039823e-04f, -1.712236910e-04f, + +4.327756079e-04f, -6.731096969e-03f, +9.964774221e-03f, +7.953158857e-03f, -3.162151328e-02f, +2.108016643e-02f, +1.699019842e-02f, -3.146938530e-02f, +1.047637753e-02f, +8.207968853e-03f, -6.533216268e-03f, +6.325867791e-04f, + +1.069772648e-04f, +8.411605119e-05f, -8.736116193e-04f, +1.297433827e-03f, +8.735035650e-06f, -2.009162944e-03f, +2.080805069e-03f, -1.433929362e-04f, -1.225784842e-03f, +8.831937479e-04f, -1.137646507e-04f, -9.283390635e-05f, + /* 14,16 (12) */ + -3.234802514e-03f, +5.956005146e-03f, +2.204423912e-02f, -7.739972311e-02f, +2.842314373e-02f, +5.243518582e-01f, +5.243518582e-01f, +2.842314373e-02f, -7.739972311e-02f, +2.204423912e-02f, +5.956005146e-03f, -3.234802514e-03f, + +1.712236910e-04f, -9.141039823e-04f, +1.010506538e-03f, +3.274728383e-03f, -1.158977239e-02f, -1.305205507e-02f, +1.245606722e-02f, +1.212302485e-02f, -3.083715479e-03f, -1.176262034e-03f, +9.474487544e-04f, -1.637217264e-04f, + +5.397528727e-04f, -6.646980918e-03f, +9.091162601e-03f, +9.250592684e-03f, -3.161277824e-02f, +1.907100349e-02f, +1.907100349e-02f, -3.161277824e-02f, +9.250592684e-03f, +9.091162601e-03f, -6.646980918e-03f, +5.397528727e-04f, + +9.283390635e-05f, +1.137646507e-04f, -8.831937479e-04f, +1.225784842e-03f, +1.433929362e-04f, -2.080805069e-03f, +2.009162944e-03f, -8.735035650e-06f, -1.297433827e-03f, +8.736116193e-04f, -8.411605119e-05f, -1.069772648e-04f, + /* 14,17 (12) */ + -3.063578823e-03f, +5.041901164e-03f, +2.305474566e-02f, -7.412499473e-02f, +1.683337134e-02f, +5.112998031e-01f, +5.368079254e-01f, +4.054616859e-02f, -8.048343859e-02f, +2.086797709e-02f, +6.903453900e-03f, -3.398524241e-03f, + +1.768106276e-04f, -8.777646629e-04f, +8.483591395e-04f, +3.442516910e-03f, -1.104232452e-02f, -1.361204091e-02f, +1.182554003e-02f, +1.264003442e-02f, -2.869267029e-03f, -1.344952629e-03f, +9.774179342e-04f, -1.542175485e-04f, + +6.325867791e-04f, -6.533216268e-03f, +8.207968853e-03f, +1.047637753e-02f, -3.146938530e-02f, +1.699019842e-02f, +2.108016643e-02f, -3.162151328e-02f, +7.953158857e-03f, +9.964774221e-03f, -6.731096969e-03f, +4.327756079e-04f, + +7.904391072e-05f, +1.412797720e-04f, -8.880351716e-04f, +1.150024578e-03f, +2.756091257e-04f, -2.142742413e-03f, +1.928120205e-03f, +1.277355294e-04f, -1.364515909e-03f, +8.591859308e-04f, -5.241958966e-05f, -1.213843752e-04f, + /* 14,18 (12) */ + -2.886768196e-03f, +4.164136501e-03f, +2.390310480e-02f, -7.068247782e-02f, +5.791046820e-03f, +4.976877622e-01f, +5.486334655e-01f, +5.318620301e-02f, -8.335270562e-02f, +1.952302446e-02f, +7.880871834e-03f, -3.552741789e-03f, + +1.805778797e-04f, -8.388094454e-04f, +6.904454897e-04f, +3.587378280e-03f, -1.048273963e-02f, -1.413469289e-02f, +1.116206222e-02f, +1.313877285e-02f, -2.631261254e-03f, -1.515859504e-03f, +1.003630268e-03f, -1.426332262e-04f, + +7.116306898e-04f, -6.391936496e-03f, +7.319933682e-03f, +1.162640210e-02f, -3.119377618e-02f, +1.484745601e-02f, +2.300828664e-02f, -3.149377775e-02f, +6.588642948e-03f, +1.082396015e-02f, -6.783516559e-03f, +3.113912327e-04f, + +6.568967103e-05f, +1.665924708e-04f, -8.882622810e-04f, +1.070621198e-03f, +4.047744056e-04f, -2.194720887e-03f, +1.838029668e-03f, +2.653730447e-04f, -1.426590804e-03f, +8.398386216e-04f, -1.877759626e-05f, -1.359587736e-04f, + /* 14,19 (12) */ + -2.706190316e-03f, +3.325327055e-03f, +2.459355029e-02f, -6.709509954e-02f, -4.691692810e-03f, +4.835530693e-01f, +5.597955277e-01f, +6.632497585e-02f, -8.598396687e-02f, +1.800716495e-02f, +8.884502102e-03f, -3.695375015e-03f, + +1.826278507e-04f, -7.976125002e-04f, +5.373426477e-04f, +3.709692115e-03f, -9.913078798e-03f, -1.461881426e-02f, +1.046734314e-02f, +1.361723946e-02f, -2.369668778e-03f, -1.688219838e-03f, +1.025706576e-03f, -1.289011675e-04f, + +7.773203608e-04f, -6.225344025e-03f, +6.431671401e-03f, +1.269702330e-02f, -3.078900177e-02f, +1.265273512e-02f, +2.484631631e-02f, -3.122840470e-02f, +5.162052144e-03f, +1.166379877e-02f, -6.802294155e-03f, +1.754324591e-04f, + +5.284606617e-05f, +1.896503245e-04f, -8.840236334e-04f, +9.880525889e-04f, +5.303024628e-04f, -2.236537626e-03f, +1.739291087e-03f, +4.035184337e-04f, -1.483236316e-03f, +8.155175604e-04f, +1.669095444e-05f, -1.505975742e-04f, + /* 14,20 (12) */ + -2.523562465e-03f, +2.527714555e-03f, +2.513089294e-02f, -6.338540742e-02f, -1.460477161e-02f, +4.689342551e-01f, +5.702628708e-01f, +7.994221531e-02f, -8.835363565e-02f, +1.631894512e-02f, +9.910208678e-03f, -3.824276183e-03f, + +1.830689087e-04f, -7.545415498e-04f, +3.895781260e-04f, +3.809916508e-03f, -9.335397639e-03f, -1.506334703e-02f, +9.743206968e-03f, +1.407346953e-02f, -2.084555279e-03f, -1.861228919e-03f, +1.043272123e-03f, -1.129651849e-04f, + +8.301664270e-04f, -6.035693700e-03f, +5.547647767e-03f, +1.368507589e-02f, -3.025869931e-02f, +1.041619749e-02f, +2.658560739e-02f, -3.082488627e-02f, +3.678815829e-03f, +1.247931633e-02f, -6.785603201e-03f, +2.483488496e-05f, + +4.058023191e-05f, +2.104171770e-04f, -8.754884812e-04f, +9.028035375e-04f, +6.516327482e-04f, -2.268041857e-03f, +1.632349197e-03f, +5.415026718e-04f, -1.534051030e-03f, +7.861975489e-04f, +5.385062770e-05f, -1.651919677e-04f, + /* 14,21 (12) */ + -2.340493557e-03f, +1.773173005e-03f, +2.552047106e-02f, -5.957549091e-02f, -2.394016925e-02f, +4.538709081e-01f, +5.800060778e-01f, +9.401568484e-02f, -9.043819093e-02f, +1.445771620e-02f, +1.095348080e-02f, -3.937241368e-03f, + +1.820143042e-04f, -7.099560197e-04f, +2.476292181e-04f, +3.888583826e-03f, -8.751738335e-03f, -1.546737506e-02f, +8.991586271e-03f, +1.450554257e-02f, -1.776083771e-03f, -2.034042535e-03f, +1.055959061e-03f, -9.478153387e-05f, + +8.707466589e-04f, -5.825276523e-03f, +4.672159286e-03f, +1.458787943e-02f, -2.960706656e-02f, +8.148155638e-03f, +2.821795659e-02f, -3.028338360e-02f, +2.144764798e-03f, +1.326551388e-02f, -6.731752573e-03f, -1.403570827e-04f, + +2.895139895e-05f, +2.288727852e-04f, -8.628452127e-04f, +8.153629108e-04f, +7.682331800e-04f, -2.289135474e-03f, +1.517691483e-03f, +6.786502876e-04f, -1.578656937e-03f, +7.518811835e-04f, +9.254982940e-05f, -1.796277841e-04f, + /* 14,22 (12) */ + -2.158479252e-03f, +1.063216986e-03f, +2.576810028e-02f, -5.568690709e-02f, -3.269190758e-02f, +4.384035330e-01f, +5.889976641e-01f, +1.085212274e-01f, -9.221427470e-02f, +1.242367366e-02f, +1.200943986e-02f, -4.032022902e-03f, + +1.795811048e-04f, -6.642053169e-04f, +1.119226028e-04f, +3.946296285e-03f, -8.164121817e-03f, -1.583012660e-02f, +8.214515209e-03f, +1.491159057e-02f, -1.444516500e-03f, -2.205779643e-03f, +1.063408936e-03f, -7.431991612e-05f, + +8.996980578e-04f, -5.596403738e-03f, +3.809314073e-03f, +1.540324234e-02f, -2.883883338e-02f, +5.859020164e-03f, +2.973564807e-02f, -2.960473331e-02f, +5.661078616e-04f, +1.401739507e-02f, -6.639202744e-03f, -3.199848669e-04f, + +1.801079715e-05f, +2.450123702e-04f, -8.462997143e-04f, +7.262208694e-04f, +8.796026607e-04f, -2.299773314e-03f, +1.395845724e-03f, +8.142829350e-04f, -1.616701951e-03f, +7.125995664e-04f, +1.326212247e-04f, -1.937861184e-04f, + /* 14,23 (12) */ + -1.978898148e-03f, +3.990116688e-04f, +2.588002288e-02f, -5.174061080e-02f, -4.085602940e-02f, +4.225734064e-01f, +5.972121793e-01f, +1.234328180e-01f, -9.365879120e-02f, +1.021789402e-02f, +1.307284880e-02f, -4.106342818e-03f, + +1.758891562e-04f, -6.176272395e-04f, -1.716577841e-05f, +3.983721317e-03f, -7.574540184e-03f, -1.615097606e-02f, +7.414122240e-03f, +1.528980612e-02f, -1.090216417e-03f, -2.375525325e-03f, +1.065275244e-03f, -5.156443831e-05f, + +9.177088550e-04f, -5.351391368e-03f, +2.963014359e-03f, +1.612946321e-02f, -2.795923072e-02f, +3.559246850e-03f, +3.113149380e-02f, -2.879045037e-02f, -1.050594090e-03f, +1.472999463e-02f, -6.506581519e-03f, -5.137709852e-04f, + +7.801624059e-06f, +2.588460809e-04f, -8.260736675e-04f, +6.358661197e-04f, +9.852733917e-04f, -2.299963153e-03f, +1.267377302e-03f, +9.477230128e-04f, -1.647862332e-03f, +6.684128596e-04f, +1.738822750e-04f, -2.075440164e-04f, + /* 14,24 (12) */ + -1.803008991e-03f, -2.186155707e-04f, +2.586285710e-02f, -4.775688948e-02f, -4.843056958e-02f, +4.064224303e-01f, +6.046263015e-01f, +1.387226241e-01f, -9.474900762e-02f, +7.842368693e-03f, +1.413812404e-02f, -4.157907256e-03f, + +1.710600727e-04f, -5.705465244e-04f, -1.393105816e-04f, +4.001586750e-03f, -6.984949343e-03f, -1.642944541e-02f, +6.592622428e-03f, +1.563845037e-02f, -7.136482429e-04f, -2.542333996e-03f, +1.061226029e-03f, -2.651451868e-05f, + +9.255104791e-04f, -5.092545287e-03f, +2.136940692e-03f, +1.676532933e-02f, -2.697395733e-02f, +1.259283696e-03f, +3.239887110e-02f, -2.784272736e-02f, -2.698456421e-03f, +1.539840749e-02f, -6.332699244e-03f, -7.213150016e-04f, + -1.640924043e-06f, +2.703983748e-04f, -8.024027933e-04f, +5.447832259e-04f, +1.084812977e-03f, -2.289765401e-03f, +1.132886295e-03f, +1.078297313e-03f, -1.671844972e-03f, +6.194106731e-04f, +2.161358931e-04f, -2.207752179e-04f, + /* 14,25 (12) */ + -1.631948919e-03f, -7.891620951e-04f, +2.572354652e-02f, -4.375530273e-02f, -5.541551893e-02f, +3.899929849e-01f, +6.112189239e-01f, +1.543610745e-01f, -9.546265586e-02f, +5.300034698e-03f, +1.519935007e-02f, -4.184421775e-03f, + +1.652162652e-04f, -5.232735340e-04f, -2.542366648e-04f, +4.000675843e-03f, -6.397261939e-03f, -1.666520473e-02f, +5.752309374e-03f, +1.595586084e-02f, -3.153790798e-04f, -2.705232885e-03f, +1.050946499e-03f, +8.142673220e-07f, + +9.238695550e-04f, -4.822146912e-03f, +1.334537898e-03f, +1.731011255e-02f, -2.588914435e-02f, -1.030481705e-03f, +3.353175739e-02f, -2.676443005e-02f, -4.370301393e-03f, +1.601781816e-02f, -6.116563351e-03f, -9.420902195e-04f, + -1.028956101e-05f, +2.797073241e-04f, -7.755350544e-04f, +4.534499955e-04f, +1.177826303e-03f, -2.269292511e-03f, +9.930043805e-04f, +1.205340678e-03f, -1.688389547e-03f, +5.657122833e-04f, +2.591712155e-04f, -2.333509534e-04f, + /* 14,26 (12) */ + -1.466732654e-03f, -1.312435629e-03f, +2.546930986e-02f, -3.975462689e-02f, -6.181278086e-02f, +3.733277802e-01f, +6.169712333e-01f, +1.703169353e-01f, -9.577803494e-02f, +2.594801813e-03f, +1.625029657e-02f, -4.183607508e-03f, + +1.584800107e-04f, -4.761030859e-04f, -3.617184481e-04f, +3.981822189e-03f, -5.813340580e-03f, -1.685807228e-02f, +4.895546810e-03f, +1.624045891e-02f, +1.039214152e-04f, -2.863225755e-03f, +1.034141651e-03f, +3.038941061e-05f, + +9.135799940e-04f, -4.542439588e-03f, +5.590028440e-04f, +1.776356255e-02f, -2.471131805e-02f, -3.299774216e-03f, +3.452476177e-02f, -2.555908937e-02f, -6.058690940e-03f, +1.658353045e-02f, -5.857392136e-03f, -1.175441173e-03f, + -1.812476249e-05f, +2.868238523e-04f, -7.457288302e-04f, +3.623349518e-04f, +1.263957192e-03f, -2.238708105e-03f, +8.483915534e-04f, +1.328199640e-03f, -1.697270512e-03f, +5.074666744e-04f, +3.027644889e-04f, -2.451407895e-04f, + /* 14,27 (12) */ + -1.308252643e-03f, -1.788538715e-03f, +2.510759141e-02f, -3.577280470e-02f, -6.762612144e-02f, +3.564697079e-01f, +6.218667801e-01f, +1.865573942e-01f, -9.567411352e-02f, -2.684239422e-04f, +1.728443822e-02f, -4.153218097e-03f, + +1.509725676e-04f, -4.293134268e-04f, -4.615790388e-04f, +3.945904524e-03f, -5.234991390e-03f, -1.700801397e-02f, +4.024759880e-03f, +1.649075716e-02f, +5.434813215e-04f, -3.015296862e-03f, +1.010538897e-03f, +6.216076941e-05f, + +8.954552315e-04f, -4.255615736e-03f, -1.867259862e-04f, +1.812589750e-02f, -2.344736086e-02f, -5.538482321e-03f, +3.537315333e-02f, -2.423088973e-02f, -7.755961452e-03f, +1.709099712e-02f, -5.554627647e-03f, -1.420581962e-03f, + -2.513456335e-05f, +2.918109105e-04f, -7.132510745e-04f, +2.718949091e-04f, +1.342889811e-03f, -2.198225824e-03f, +6.997326862e-04f, +1.446236031e-03f, -1.698298923e-03f, +4.448524013e-04f, +3.466800695e-04f, -2.560135196e-04f, + /* 14,28 (12) */ + -1.157280075e-03f, -2.217852142e-03f, +2.464601237e-02f, -3.182690018e-02f, -7.286111283e-02f, +3.394616939e-01f, +6.258915400e-01f, +2.030481514e-01f, -9.513063220e-02f, -3.283720804e-03f, +1.829497712e-02f, -4.091057328e-03f, + +1.428133424e-04f, -3.831653515e-04f, -5.536891363e-04f, +3.893841458e-03f, -4.663957920e-03f, -1.711514211e-02f, +3.142426152e-03f, +1.670536631e-02f, +1.002427212e-03f, -3.160415132e-03f, +9.798906578e-04f, +9.605995565e-05f, + +8.703206682e-04f, -3.963804825e-03f, -8.999770607e-04f, +1.839779241e-02f, -2.210447105e-02f, -7.736708145e-03f, +3.607288601e-02f, -2.278465370e-02f, -9.454260375e-03f, +1.753584952e-02f, -5.207947577e-03f, -1.676595482e-03f, + -3.131430453e-05f, +2.947425992e-04f, -6.783754690e-04f, +1.825726615e-04f, +1.414349844e-03f, -2.148107906e-03f, +5.477339459e-04f, +1.558830532e-03f, -1.691324078e-03f, +3.780772691e-04f, +3.906715309e-04f, -2.658380941e-04f, + /* 14,29 (12) */ + -1.014466733e-03f, -2.601017493e-03f, +2.409232323e-02f, -2.793305872e-02f, -7.752507075e-02f, +3.223465518e-01f, +6.290339662e-01f, +2.197535177e-01f, -9.412820499e-02f, -6.444135936e-03f, +1.927486778e-02f, -3.994997372e-03f, + +1.341191095e-04f, -3.379014654e-04f, -6.379657263e-04f, +3.826586174e-03f, -4.101915421e-03f, -1.717971371e-02f, +2.251066406e-03f, +1.688300191e-02f, +1.479785379e-03f, -3.297538548e-03f, +9.419769302e-04f, +1.319998145e-04f, + +8.390063636e-04f, -3.669062226e-03f, -1.578352530e-03f, +1.858036507e-02f, -2.069012120e-02f, -9.884816051e-03f, +3.662061996e-02f, -2.122582317e-02f, -1.114558445e-02f, +1.791392679e-02f, -4.817276046e-03f, -1.942433576e-03f, + -3.666633283e-05f, +2.957032450e-04f, -6.413805850e-04f, +9.479479793e-05f, +1.478105414e-03f, -2.088663505e-03f, +3.931190910e-04f, +1.665386148e-03f, -1.676234961e-03f, +3.073778285e-04f, +4.344828754e-04f, -2.744845839e-04f, + /* 14,30 (12) */ + -8.803476234e-04f, -2.938918959e-03f, +2.345435751e-02f, -2.410647254e-02f, -8.162698617e-02f, +3.051668381e-01f, +6.312850326e-01f, +2.366365196e-01f, -9.264841961e-02f, -9.741674484e-03f, +2.021684471e-02f, -3.862997557e-03f, + +1.250032891e-04f, -2.937455915e-04f, -7.143705810e-04f, +3.745121099e-03f, -3.550465531e-03f, -1.720212808e-02f, +1.353235228e-03f, +1.702249058e-02f, +1.974483539e-03f, -3.425618724e-03f, +8.966077936e-04f, +1.698740044e-04f, + +8.023400308e-04f, -3.373358981e-03f, -2.219733115e-03f, +1.867515987e-02f, -1.921201579e-02f, -1.197347956e-02f, +3.701373905e-02f, -1.956043702e-02f, -1.282181941e-02f, +1.822130462e-02f, -4.382793171e-03f, -2.216918160e-03f, + -4.119965783e-05f, +2.947864381e-04f, -6.025480632e-04f, +8.969655050e-06f, +1.533967754e-03f, -2.020246759e-03f, +2.366256669e-04f, +1.765331581e-03f, -1.652961485e-03f, +2.330186866e-04f, +4.778498449e-04f, -2.818251726e-04f, + /* 14,31 (12) */ + -7.553443344e-04f, -3.232664550e-03f, +2.273998693e-02f, -2.036135145e-02f, -8.517745171e-02f, +2.879647100e-01f, +6.326382678e-01f, +2.536590102e-01f, -9.067393607e-02f, -1.316729321e-02f, +2.111345250e-02f, -3.693123553e-03f, + +1.155752844e-04f, -2.509023181e-04f, -7.829085773e-04f, +3.650452588e-03f, -3.011131360e-03f, -1.718292394e-02f, +4.515114608e-04f, +1.712277592e-02f, +2.485353009e-03f, -3.543605650e-03f, +8.436258499e-04f, +2.095566848e-04f, + +7.611403730e-04f, -3.078572543e-03f, -2.822281178e-03f, +1.868412953e-02f, -1.767804803e-02f, -1.399372632e-02f, +3.725036472e-02f, -1.779510544e-02f, -1.447478090e-02f, +1.845432331e-02f, -3.904943326e-03f, -2.498743333e-03f, + -4.492956993e-05f, +2.920940404e-04f, -5.621608250e-04f, -7.451458378e-05f, +1.581791628e-03f, -1.943254627e-03f, +7.900112358e-05f, +1.858124495e-03f, -1.621475507e-03f, +1.552916331e-04f, +5.205013231e-04f, -2.877351700e-04f, + /* 15, 0 (12) */ + -6.270045371e-03f, +1.857263635e-02f, +1.898716084e-03f, -1.042848395e-01f, +2.548448052e-01f, +6.704191451e-01f, +2.548448052e-01f, -1.042848395e-01f, +1.898716084e-03f, +1.857263635e-02f, -6.270045371e-03f, +7.644175308e-05f, + +7.817848527e-05f, -1.364127173e-03f, +3.388314016e-03f, -8.638775022e-04f, -1.898090041e-02f, -5.305125844e-04f, +1.912617857e-02f, +1.429339731e-03f, -3.575938004e-03f, +1.345069402e-03f, -4.119172230e-05f, -7.064571447e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 1 (12) */ + -6.191866886e-03f, +1.720850917e-02f, +5.287030100e-03f, -1.051487170e-01f, +2.358639047e-01f, +6.698886325e-01f, +2.739709837e-01f, -1.028554997e-01f, -1.677221920e-03f, +1.991770575e-02f, -6.311237093e-03f, +5.796038602e-06f, + +1.119511682e-04f, -1.374457639e-03f, +3.192600037e-03f, -3.215220538e-04f, -1.878782216e-02f, -1.589860895e-03f, +1.922237484e-02f, +2.016497777e-03f, -3.754090754e-03f, +1.316918644e-03f, -1.040846606e-06f, -8.380363123e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 2 (12) */ + -6.079915717e-03f, +1.583405154e-02f, +8.479630137e-03f, -1.054702390e-01f, +2.170760826e-01f, +6.682987716e-01f, +2.931933586e-01f, -1.008390020e-01f, -5.431312674e-03f, +2.123462439e-02f, -6.312277940e-03f, -7.800759263e-05f, + +1.424847694e-04f, -1.376459806e-03f, +2.990160719e-03f, +1.964495825e-04f, -1.854838806e-02f, -2.644185497e-03f, +1.926837722e-02f, +2.623810007e-03f, -3.921380972e-03f, +1.279346311e-03f, +4.219822040e-05f, -9.745277665e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 3 (12) */ + -5.937430948e-03f, +1.445759173e-02f, +1.146979086e-02f, -1.052737894e-01f, +1.985276945e-01f, +6.656545861e-01f, +3.124617358e-01f, -9.821519196e-02f, -9.352693646e-03f, +2.251397070e-02f, -6.270079719e-03f, -1.754603693e-04f, + +1.697781384e-04f, -1.370562189e-03f, +2.782337863e-03f, +6.888968659e-04f, -1.826419684e-02f, -3.690160098e-03f, +1.926325002e-02f, +3.249608075e-03f, -4.076414120e-03f, +1.232064605e-03f, +8.842275228e-05f, -1.114990379e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 4 (12) */ + -5.767652810e-03f, +1.308702954e-02f, +1.425212872e-02f, -1.045848926e-01f, +1.802634977e-01f, +6.619644260e-01f, +3.317249858e-01f, -9.496558388e-02f, -1.342910777e-02f, +2.374603531e-02f, -6.181656967e-03f, -2.869594071e-04f, + +1.938527502e-04f, -1.357218966e-03f, +2.570444461e-03f, +1.154817602e-03f, -1.793699319e-02f, -4.724492566e-03f, +1.920623979e-02f, +3.892101579e-03f, -4.217799433e-03f, +1.174830113e-03f, +1.375025163e-04f, -1.258380042e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 5 (12) */ + -5.573800059e-03f, +1.172981057e-02f, +1.682257318e-02f, -1.034300750e-01f, +1.623265045e-01f, +6.572399335e-01f, +3.509312256e-01f, -9.107348230e-02f, -1.764690720e-02f, +2.492086542e-02f, -6.044154451e-03f, -4.127974114e-04f, + +2.147513789e-04f, -1.336906140e-03f, +2.355759081e-03f, +1.593349097e-03f, -1.756865855e-02f, -5.743938364e-03f, +1.909678039e-02f, +4.549383387e-03f, -4.344157141e-03f, +1.107447278e-03f, +1.892792335e-04f, -1.403552482e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 6 (12) */ + -5.359048680e-03f, +1.039290443e-02f, +1.917833226e-02f, -1.018367259e-01f, +1.447578459e-01f, +6.514959951e-01f, +3.700280060e-01f, -8.652409891e-02f, -2.199106434e-02f, +2.602831270e-02f, -5.854875217e-03f, -5.531526595e-04f, + +2.325366861e-04f, -1.310117715e-03f, +2.139520601e-03f, +2.003768627e-03f, -1.716120151e-02f, -6.745313754e-03f, +1.893449724e-02f, +5.219435635e-03f, -4.454125839e-03f, +1.029771719e-03f, +2.435662099e-04f, -1.549267042e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 7 (12) */ + -5.126511994e-03f, +9.082786720e-03f, +2.131785286e-02f, -9.983295725e-02f, +1.275966444e-01f, +6.447506813e-01f, +3.889625032e-01f, -8.130466328e-02f, -2.644519018e-02f, +2.705808442e-02f, -5.611309007e-03f, -7.080793637e-04f, + +2.472897366e-04f, -1.277361922e-03f, +1.922923322e-03f, +2.385493214e-03f, -1.671674768e-02f, -7.725508723e-03f, +1.871921081e-02f, +5.900136366e-03f, -4.546369976e-03f, +9.417133749e-04f, +3.001481496e-04f, -1.694191487e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 8 (12) */ + -4.879222258e-03f, +7.805424797e-03f, +2.324077619e-02f, -9.744746404e-02f, +1.108798967e-01f, +6.370251726e-01f, +4.076817140e-01f, -7.540452691e-02f, -3.099156015e-02f, +2.799979780e-02f, -5.311160858e-03f, -8.774985124e-04f, + +2.591084547e-04f, -1.239157519e-03f, +1.707112465e-03f, +2.738078749e-03f, -1.623752913e-02f, -8.681499542e-03f, +1.845093922e-02f, +6.589266792e-03f, -4.619587437e-03f, +8.432394459e-04f, +3.587811586e-04f, -1.836907803e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 9 (12) */ + -4.620113803e-03f, +6.566267278e-03f, +2.494788865e-02f, -9.470938529e-02f, +9.464236761e-02f, +6.283436731e-01f, +4.261326532e-01f, -6.881526012e-02f, -3.561114759e-02f, +2.884303724e-02f, -4.952379699e-03f, -1.061189293e-03f, + +2.681060345e-04f, -1.196030160e-03f, +1.493180077e-03f, +3.061218451e-03f, -1.572587350e-02f, -9.610360933e-03f, +1.812989991e-02f, +7.284519157e-03f, -4.672517155e-03f, +7.343771115e-04f, +4.191929467e-04f, -1.975919020e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,10 (12) */ + -4.352007769e-03f, +5.370237118e-03f, +2.644106873e-02f, -9.164816684e-02f, +7.891649411e-02f, +6.187333121e-01f, +4.442625532e-01f, -6.153074096e-02f, -4.028366475e-02f, +2.957741435e-02f, -4.533186752e-03f, -1.258781195e-03f, + +2.744093180e-04f, -1.148508890e-03f, +1.282161351e-03f, +3.354740708e-03f, -1.518419286e-02f, -1.050927775e-02f, +1.775651054e-02f, +7.983505155e-03f, -4.703946737e-03f, +6.152159946e-04f, +4.810832345e-04f, -2.109657031e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,11 (12) */ + -4.077598451e-03f, +4.221728228e-03f, +2.772323008e-02f, -8.829342613e-02f, +6.373230125e-02f, +6.082240344e-01f, +4.620190637e-01f, -5.354723581e-02f, -4.498761148e-02f, +3.019263035e-02f, -4.052103518e-03f, -1.469746898e-03f, + +2.781571526e-04f, -1.097122751e-03f, +1.075031370e-03f, +3.618606309e-03f, -1.461497220e-02f, -1.137555617e-02f, +1.733138888e-02f, +8.683764891e-03f, -4.712720046e-03f, +4.859103552e-04f, +5.441243728e-04f, -2.236491406e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,12 (12) */ + -3.799441298e-03f, +3.124605477e-03f, +2.879826145e-02f, -8.467481982e-02f, +4.911732904e-02f, +5.968484782e-01f, +4.793504526e-01f, -4.486347092e-02f, -4.970033153e-02f, +3.067854070e-02f, -3.507979145e-03f, -1.693396038e-03f, + +2.794987417e-04f, -1.042397530e-03f, +8.727022773e-04f, +3.852905094e-03f, -1.402075789e-02f, -1.220663423e-02f, +1.685535188e-02f, +9.382776335e-03f, -4.697744704e-03f, +3.466809857e-04f, +6.079621757e-04f, -2.354739168e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,13 (12) */ + -3.519942556e-03f, +2.082207947e-03f, +2.967096373e-02f, -8.082191473e-02f, +3.509657115e-02f, +5.846418440e-01f, +4.962058045e-01f, -3.548069458e-02f, -5.439807623e-02f, +3.102522169e-02f, -2.900016969e-03f, -1.928869955e-03f, + +2.785919998e-04f, -9.848526714e-04f, +6.760208820e-04f, +4.057852059e-03f, -1.340414589e-02f, -1.300009189e-02f, +1.632941378e-02f, +1.007796522e-02f, -4.657999478e-03f, +1.978167914e-04f, +6.722169746e-04f, -2.462675508e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,14 (12) */ + -3.241350556e-03f, +1.097355275e-03f, +3.034698461e-02f, -7.676406267e-02f, +2.169242526e-02f, +5.716417521e-01f, +5.125352182e-01f, -2.540272936e-02f, -5.905607571e-02f, +3.122303848e-02f, -2.227799995e-03f, -2.175137506e-03f, + +2.756019237e-04f, -9.249983445e-04f, +4.857666985e-04f, +4.233782938e-03f, -1.276776995e-02f, -1.375366024e-02f, +1.575478333e-02f, +1.076671539e-02f, -4.592541488e-03f, +3.967603208e-05f, +7.364848909e-04f, -2.558545383e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,15 (12) */ + -2.965748633e-03f, +1.723569308e-04f, +3.083275131e-02f, -7.253027973e-02f, +8.924655309e-03f, +5.578880919e-01f, +5.282900016e-01f, -1.463601396e-02f, -6.364861720e-02f, +3.126271451e-02f, -1.491315104e-03f, -2.430992044e-03f, + +2.706989912e-04f, -8.633327032e-04f, +3.026504151e-04f, +4.381149306e-03f, -1.211428982e-02f, -1.446523016e-02f, +1.513286014e-02f, +1.144637946e-02f, -4.500513226e-03f, -1.273127899e-04f, +8.003393316e-04f, -2.640575974e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,16 (12) */ + -2.695049642e-03f, -6.909757724e-04f, +3.113540172e-02f, -6.814913042e-02f, -3.189634508e-03f, +5.434228617e-01f, +5.434228617e-01f, -3.189634508e-03f, -6.814913042e-02f, +3.113540172e-02f, -6.909757724e-04f, -2.695049642e-03f, + +2.640575974e-04f, -8.003393316e-04f, +1.273127899e-04f, +4.500513226e-03f, -1.144637946e-02f, -1.513286014e-02f, +1.446523016e-02f, +1.211428982e-02f, -4.381149306e-03f, -3.026504151e-04f, +8.633327032e-04f, -2.706989912e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,17 (12) */ + -2.430992044e-03f, -1.491315104e-03f, +3.126271451e-02f, -6.364861720e-02f, -1.463601396e-02f, +5.282900016e-01f, +5.578880919e-01f, +8.924655309e-03f, -7.253027973e-02f, +3.083275131e-02f, +1.723569308e-04f, -2.965748633e-03f, + +2.558545383e-04f, -7.364848909e-04f, -3.967603208e-05f, +4.592541488e-03f, -1.076671539e-02f, -1.575478333e-02f, +1.375366024e-02f, +1.276776995e-02f, -4.233782938e-03f, -4.857666985e-04f, +9.249983445e-04f, -2.756019237e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,18 (12) */ + -2.175137506e-03f, -2.227799995e-03f, +3.122303848e-02f, -5.905607571e-02f, -2.540272936e-02f, +5.125352182e-01f, +5.716417521e-01f, +2.169242526e-02f, -7.676406267e-02f, +3.034698461e-02f, +1.097355275e-03f, -3.241350556e-03f, + +2.462675508e-04f, -6.722169746e-04f, -1.978167914e-04f, +4.657999478e-03f, -1.007796522e-02f, -1.632941378e-02f, +1.300009189e-02f, +1.340414589e-02f, -4.057852059e-03f, -6.760208820e-04f, +9.848526714e-04f, -2.785919998e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,19 (12) */ + -1.928869955e-03f, -2.900016969e-03f, +3.102522169e-02f, -5.439807623e-02f, -3.548069458e-02f, +4.962058045e-01f, +5.846418440e-01f, +3.509657115e-02f, -8.082191473e-02f, +2.967096373e-02f, +2.082207947e-03f, -3.519942556e-03f, + +2.354739168e-04f, -6.079621757e-04f, -3.466809857e-04f, +4.697744704e-03f, -9.382776335e-03f, -1.685535188e-02f, +1.220663423e-02f, +1.402075789e-02f, -3.852905094e-03f, -8.727022773e-04f, +1.042397530e-03f, -2.794987417e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,20 (12) */ + -1.693396038e-03f, -3.507979145e-03f, +3.067854070e-02f, -4.970033153e-02f, -4.486347092e-02f, +4.793504526e-01f, +5.968484782e-01f, +4.911732904e-02f, -8.467481982e-02f, +2.879826145e-02f, +3.124605477e-03f, -3.799441298e-03f, + +2.236491406e-04f, -5.441243728e-04f, -4.859103552e-04f, +4.712720046e-03f, -8.683764891e-03f, -1.733138888e-02f, +1.137555617e-02f, +1.461497220e-02f, -3.618606309e-03f, -1.075031370e-03f, +1.097122751e-03f, -2.781571526e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,21 (12) */ + -1.469746898e-03f, -4.052103518e-03f, +3.019263035e-02f, -4.498761148e-02f, -5.354723581e-02f, +4.620190637e-01f, +6.082240344e-01f, +6.373230125e-02f, -8.829342613e-02f, +2.772323008e-02f, +4.221728228e-03f, -4.077598451e-03f, + +2.109657031e-04f, -4.810832345e-04f, -6.152159946e-04f, +4.703946737e-03f, -7.983505155e-03f, -1.775651054e-02f, +1.050927775e-02f, +1.518419286e-02f, -3.354740708e-03f, -1.282161351e-03f, +1.148508890e-03f, -2.744093180e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,22 (12) */ + -1.258781195e-03f, -4.533186752e-03f, +2.957741435e-02f, -4.028366475e-02f, -6.153074096e-02f, +4.442625532e-01f, +6.187333121e-01f, +7.891649411e-02f, -9.164816684e-02f, +2.644106873e-02f, +5.370237118e-03f, -4.352007769e-03f, + +1.975919020e-04f, -4.191929467e-04f, -7.343771115e-04f, +4.672517155e-03f, -7.284519157e-03f, -1.812989991e-02f, +9.610360933e-03f, +1.572587350e-02f, -3.061218451e-03f, -1.493180077e-03f, +1.196030160e-03f, -2.681060345e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,23 (12) */ + -1.061189293e-03f, -4.952379699e-03f, +2.884303724e-02f, -3.561114759e-02f, -6.881526012e-02f, +4.261326532e-01f, +6.283436731e-01f, +9.464236761e-02f, -9.470938529e-02f, +2.494788865e-02f, +6.566267278e-03f, -4.620113803e-03f, + +1.836907803e-04f, -3.587811586e-04f, -8.432394459e-04f, +4.619587437e-03f, -6.589266792e-03f, -1.845093922e-02f, +8.681499542e-03f, +1.623752913e-02f, -2.738078749e-03f, -1.707112465e-03f, +1.239157519e-03f, -2.591084547e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,24 (12) */ + -8.774985124e-04f, -5.311160858e-03f, +2.799979780e-02f, -3.099156015e-02f, -7.540452691e-02f, +4.076817140e-01f, +6.370251726e-01f, +1.108798967e-01f, -9.744746404e-02f, +2.324077619e-02f, +7.805424797e-03f, -4.879222258e-03f, + +1.694191487e-04f, -3.001481496e-04f, -9.417133749e-04f, +4.546369976e-03f, -5.900136366e-03f, -1.871921081e-02f, +7.725508723e-03f, +1.671674768e-02f, -2.385493214e-03f, -1.922923322e-03f, +1.277361922e-03f, -2.472897366e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,25 (12) */ + -7.080793637e-04f, -5.611309007e-03f, +2.705808442e-02f, -2.644519018e-02f, -8.130466328e-02f, +3.889625032e-01f, +6.447506813e-01f, +1.275966444e-01f, -9.983295725e-02f, +2.131785286e-02f, +9.082786720e-03f, -5.126511994e-03f, + +1.549267042e-04f, -2.435662099e-04f, -1.029771719e-03f, +4.454125839e-03f, -5.219435635e-03f, -1.893449724e-02f, +6.745313754e-03f, +1.716120151e-02f, -2.003768627e-03f, -2.139520601e-03f, +1.310117715e-03f, -2.325366861e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,26 (12) */ + -5.531526595e-04f, -5.854875217e-03f, +2.602831270e-02f, -2.199106434e-02f, -8.652409891e-02f, +3.700280060e-01f, +6.514959951e-01f, +1.447578459e-01f, -1.018367259e-01f, +1.917833226e-02f, +1.039290443e-02f, -5.359048680e-03f, + +1.403552482e-04f, -1.892792335e-04f, -1.107447278e-03f, +4.344157141e-03f, -4.549383387e-03f, -1.909678039e-02f, +5.743938364e-03f, +1.756865855e-02f, -1.593349097e-03f, -2.355759081e-03f, +1.336906140e-03f, -2.147513789e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,27 (12) */ + -4.127974114e-04f, -6.044154451e-03f, +2.492086542e-02f, -1.764690720e-02f, -9.107348230e-02f, +3.509312256e-01f, +6.572399335e-01f, +1.623265045e-01f, -1.034300750e-01f, +1.682257318e-02f, +1.172981057e-02f, -5.573800059e-03f, + +1.258380042e-04f, -1.375025163e-04f, -1.174830113e-03f, +4.217799433e-03f, -3.892101579e-03f, -1.920623979e-02f, +4.724492566e-03f, +1.793699319e-02f, -1.154817602e-03f, -2.570444461e-03f, +1.357218966e-03f, -1.938527502e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,28 (12) */ + -2.869594071e-04f, -6.181656967e-03f, +2.374603531e-02f, -1.342910777e-02f, -9.496558388e-02f, +3.317249858e-01f, +6.619644260e-01f, +1.802634977e-01f, -1.045848926e-01f, +1.425212872e-02f, +1.308702954e-02f, -5.767652810e-03f, + +1.114990379e-04f, -8.842275228e-05f, -1.232064605e-03f, +4.076414120e-03f, -3.249608075e-03f, -1.926325002e-02f, +3.690160098e-03f, +1.826419684e-02f, -6.888968659e-04f, -2.782337863e-03f, +1.370562189e-03f, -1.697781384e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,29 (12) */ + -1.754603693e-04f, -6.270079719e-03f, +2.251397070e-02f, -9.352693646e-03f, -9.821519196e-02f, +3.124617358e-01f, +6.656545861e-01f, +1.985276945e-01f, -1.052737894e-01f, +1.146979086e-02f, +1.445759173e-02f, -5.937430948e-03f, + +9.745277665e-05f, -4.219822040e-05f, -1.279346311e-03f, +3.921380972e-03f, -2.623810007e-03f, -1.926837722e-02f, +2.644185497e-03f, +1.854838806e-02f, -1.964495825e-04f, -2.990160719e-03f, +1.376459806e-03f, -1.424847694e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,30 (12) */ + -7.800759263e-05f, -6.312277940e-03f, +2.123462439e-02f, -5.431312674e-03f, -1.008390020e-01f, +2.931933586e-01f, +6.682987716e-01f, +2.170760826e-01f, -1.054702390e-01f, +8.479630137e-03f, +1.583405154e-02f, -6.079915717e-03f, + +8.380363123e-05f, +1.040846606e-06f, -1.316918644e-03f, +3.754090754e-03f, -2.016497777e-03f, -1.922237484e-02f, +1.589860895e-03f, +1.878782216e-02f, +3.215220538e-04f, -3.192600037e-03f, +1.374457639e-03f, -1.119511682e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,31 (12) */ + +5.796038602e-06f, -6.311237093e-03f, +1.991770575e-02f, -1.677221920e-03f, -1.028554997e-01f, +2.739709837e-01f, +6.698886325e-01f, +2.358639047e-01f, -1.051487170e-01f, +5.287030100e-03f, +1.720850917e-02f, -6.191866886e-03f, + +7.064571447e-05f, +4.119172230e-05f, -1.345069402e-03f, +3.575938004e-03f, -1.429339731e-03f, -1.912617857e-02f, +5.305125844e-04f, +1.898090041e-02f, +8.638775022e-04f, -3.388314016e-03f, +1.364127173e-03f, -7.817848527e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +}; +constexpr BSincTable bsinc12 = { + /* scaleBase */ 1.647904275e-01f, /* scaleRange */ 1.197304285e+00f, + /* m */ { 24u, 24u, 24u, 24u, 24u, 24u, 24u, 20u, 20u, 20u, 16u, 16u, 16u, 12u, 12u, 12u }, + /* filterOffset */ { 0u, 3072u, 6144u, 9216u, 12288u, 15360u, 18432u, 21504u, 24064u, 26624u, 29184u, 31232u, 33280u, 35328u, 36864u, 38400u }, + bsinc12_tab }; +} // namespace diff --git a/build/default-44100.mhr.h b/build/default-44100.mhr.h deleted file mode 100644 index 442f439..0000000 --- a/build/default-44100.mhr.h +++ /dev/null @@ -1,5025 +0,0 @@ -static const unsigned char hrtf_default_44100[] = { - 0x4d, 0x69, 0x6e, 0x50, 0x48, 0x52, 0x30, 0x32, 0x44, 0xac, 0x00, 0x00, 0x01, 0x00, 0x20, 0x01, - 0x78, 0x05, 0x13, 0x01, 0x0c, 0x18, 0x24, 0x2d, 0x38, 0x3c, 0x48, 0x48, 0x48, 0x48, 0x48, 0x3c, - 0x38, 0x2d, 0x24, 0x18, 0x0c, 0x01, 0x5b, 0xe6, 0x17, 0xd7, 0xad, 0x20, 0xbe, 0xd2, 0x0d, 0xd1, - 0x55, 0x0b, 0x3a, 0x62, 0x04, 0xd1, 0x55, 0x01, 0xd6, 0x67, 0x03, 0x30, 0xcd, 0xfc, 0x5c, 0x6d, - 0xf6, 0x6d, 0xdf, 0xfa, 0xd3, 0x44, 0x02, 0xec, 0x7a, 0xff, 0x6a, 0x95, 0xfd, 0xd7, 0xba, 0xfb, - 0x9a, 0x17, 0xfc, 0x96, 0x5f, 0xfe, 0xe1, 0x0b, 0xff, 0x4e, 0x34, 0xff, 0xa6, 0xab, 0xff, 0x45, - 0x7b, 0xff, 0xfd, 0x87, 0xfe, 0x0f, 0x38, 0xff, 0xb4, 0x60, 0xfe, 0xa0, 0xb3, 0xfe, 0x3e, 0x67, - 0xfe, 0x24, 0x9a, 0xfd, 0xd9, 0x15, 0xfe, 0x78, 0xb4, 0xfe, 0x30, 0x31, 0xff, 0x19, 0x9e, 0xff, - 0xd4, 0xf9, 0xff, 0x2c, 0x6e, 0xff, 0x60, 0x2e, 0x1b, 0x45, 0xf3, 0x21, 0x05, 0xcd, 0x0b, 0x0d, - 0xc7, 0x0c, 0x77, 0x7e, 0x04, 0xe2, 0x17, 0x00, 0x0b, 0x4c, 0x03, 0x99, 0x01, 0xfd, 0xb6, 0x37, - 0xf6, 0x84, 0x7a, 0xf9, 0x16, 0x16, 0x02, 0xe4, 0x55, 0x00, 0x62, 0xa9, 0xfd, 0x92, 0x6b, 0xfc, - 0x07, 0x37, 0xfc, 0xd2, 0x6a, 0xfc, 0x71, 0x91, 0xfe, 0x3b, 0xaf, 0xff, 0x9b, 0x39, 0xff, 0x1d, - 0x29, 0xff, 0x01, 0x24, 0xfe, 0xd6, 0xc8, 0xfe, 0x52, 0x45, 0xfe, 0xc9, 0x8a, 0xfe, 0x80, 0x71, - 0xfe, 0xff, 0xd4, 0xfd, 0xd5, 0xfa, 0xfd, 0x52, 0x07, 0xff, 0x06, 0x9a, 0xff, 0x0a, 0xb4, 0xff, - 0x1b, 0xfc, 0xff, 0x1e, 0x50, 0xff, 0x97, 0xce, 0x18, 0xe2, 0x9e, 0x1f, 0x93, 0x7d, 0x0b, 0xce, - 0x23, 0x0b, 0xe2, 0x59, 0x04, 0x03, 0x57, 0x01, 0x12, 0x52, 0x03, 0x3a, 0x88, 0xfc, 0x96, 0xcc, - 0xf6, 0x93, 0x18, 0xfb, 0xda, 0xfa, 0x01, 0x30, 0x40, 0xff, 0x2c, 0xd0, 0xfd, 0x0d, 0xa4, 0xfc, - 0x5d, 0x15, 0xfd, 0xc9, 0x1a, 0xfe, 0xd9, 0xb9, 0xfe, 0xe5, 0xb1, 0xff, 0xd0, 0xee, 0xff, 0xc5, - 0x54, 0xff, 0xdd, 0x69, 0xfe, 0xb4, 0x43, 0xff, 0x86, 0x6e, 0xfe, 0x45, 0xa0, 0xfe, 0xc6, 0x34, - 0xfe, 0xfb, 0xa8, 0xfd, 0x21, 0x3e, 0xfe, 0x64, 0xc5, 0xfe, 0x85, 0x48, 0xff, 0x84, 0xb2, 0xff, - 0x43, 0x0d, 0x00, 0xed, 0x79, 0xff, 0x9c, 0x17, 0x17, 0xe4, 0x50, 0x1d, 0x62, 0x91, 0x0a, 0x13, - 0x3f, 0x0a, 0x89, 0xe5, 0x03, 0xb9, 0x75, 0x01, 0x14, 0x73, 0x03, 0xf8, 0xcb, 0xfc, 0x26, 0x69, - 0xf7, 0xff, 0x3a, 0xfc, 0x7e, 0xbc, 0x02, 0x7b, 0x81, 0xff, 0x44, 0x57, 0xfe, 0x1a, 0x0a, 0xfd, - 0xa0, 0x47, 0xfd, 0x3a, 0xe2, 0xfe, 0xf7, 0x2c, 0xff, 0x43, 0x54, 0xff, 0x3f, 0xc1, 0xff, 0x4f, - 0x82, 0xff, 0x78, 0xb0, 0xfe, 0x5f, 0x7f, 0xff, 0x9f, 0x9e, 0xfe, 0xb9, 0xf0, 0xfe, 0xd1, 0x90, - 0xfe, 0xba, 0xd7, 0xfd, 0x24, 0x54, 0xfe, 0x2c, 0xd7, 0xfe, 0xe9, 0x4e, 0xff, 0xf6, 0xb5, 0xff, - 0xe7, 0x05, 0x00, 0xd7, 0x77, 0xff, 0xd1, 0xb1, 0x16, 0x77, 0xdf, 0x1c, 0xc7, 0x6a, 0x0a, 0xf9, - 0x16, 0x0a, 0x4f, 0xed, 0x03, 0x95, 0xc3, 0x01, 0xbd, 0xe4, 0x03, 0x80, 0x48, 0xfd, 0x21, 0xdf, - 0xf7, 0x1f, 0xa7, 0xfc, 0x55, 0x05, 0x03, 0x8e, 0x9c, 0xff, 0xa4, 0x27, 0xfe, 0xe6, 0xa7, 0xfc, - 0x3d, 0x25, 0xfd, 0x48, 0x0f, 0xff, 0x35, 0x47, 0xff, 0xf7, 0x4a, 0xff, 0xad, 0xc0, 0xff, 0x84, - 0x8e, 0xff, 0x9a, 0xb9, 0xfe, 0x5b, 0x90, 0xff, 0x54, 0xbf, 0xfe, 0x50, 0x23, 0xff, 0xc0, 0xd2, - 0xfe, 0xf1, 0x04, 0xfe, 0xc4, 0x6a, 0xfe, 0xbb, 0xd6, 0xfe, 0xf8, 0x28, 0xff, 0xe7, 0x86, 0xff, - 0x01, 0xdd, 0xff, 0xe8, 0x57, 0xff, 0xfa, 0x46, 0x17, 0x44, 0xb5, 0x1d, 0x86, 0x89, 0x0a, 0x66, - 0xc4, 0x09, 0xd3, 0x66, 0x03, 0x3d, 0x4f, 0x01, 0x95, 0x8d, 0x03, 0xbb, 0xd0, 0xfc, 0x7f, 0x16, - 0xf7, 0x2c, 0xe1, 0xfb, 0x21, 0x07, 0x03, 0x53, 0xef, 0xff, 0x66, 0x32, 0xfe, 0xf1, 0x7a, 0xfc, - 0xc1, 0xef, 0xfc, 0x20, 0x10, 0xff, 0x88, 0x8f, 0xff, 0x03, 0x9a, 0xff, 0x3e, 0xf4, 0xff, 0x97, - 0xc6, 0xff, 0xe8, 0xe2, 0xfe, 0xe2, 0x98, 0xff, 0xbf, 0xb3, 0xfe, 0x16, 0x01, 0xff, 0xad, 0xaa, - 0xfe, 0xcd, 0xeb, 0xfd, 0x00, 0x70, 0xfe, 0x82, 0x07, 0xff, 0x4e, 0x83, 0xff, 0xe5, 0xee, 0xff, - 0x89, 0x20, 0x00, 0x89, 0x62, 0xff, 0x3f, 0x74, 0x19, 0xb5, 0x1c, 0x20, 0x26, 0xc8, 0x0a, 0x9d, - 0x4c, 0x0a, 0x73, 0x81, 0x03, 0xa5, 0x45, 0x01, 0x2a, 0x7e, 0x03, 0x02, 0xd2, 0xfb, 0x49, 0x82, - 0xf5, 0xf3, 0xdb, 0xfa, 0x77, 0x56, 0x03, 0x5a, 0xcc, 0xff, 0x52, 0x55, 0xfd, 0xa1, 0x91, 0xfb, - 0x0e, 0x53, 0xfc, 0x94, 0xc3, 0xfe, 0x1d, 0x67, 0xff, 0xab, 0x66, 0xff, 0x8b, 0xdf, 0xff, 0xc7, - 0xc2, 0xff, 0x81, 0xa5, 0xfe, 0xcd, 0x84, 0xff, 0x9d, 0xae, 0xfe, 0x82, 0x05, 0xff, 0x15, 0xa8, - 0xfe, 0x52, 0xe0, 0xfd, 0x5a, 0x70, 0xfe, 0xcf, 0x19, 0xff, 0x83, 0x80, 0xff, 0x4b, 0xd8, 0xff, - 0xfe, 0x26, 0x00, 0x4e, 0x88, 0xff, 0x42, 0xe7, 0x1a, 0x79, 0xc5, 0x22, 0xf8, 0xfb, 0x0b, 0xf5, - 0xce, 0x0a, 0x16, 0xa2, 0x03, 0xdc, 0x90, 0x00, 0x63, 0x3e, 0x03, 0xcb, 0x25, 0xfb, 0xe6, 0x0b, - 0xf5, 0x33, 0xd7, 0xfa, 0xdb, 0x48, 0x02, 0xdb, 0x18, 0xff, 0x94, 0x93, 0xfd, 0xf9, 0xa0, 0xfb, - 0x48, 0x27, 0xfc, 0x56, 0x62, 0xfe, 0x4f, 0x0c, 0xff, 0xa8, 0xb7, 0xff, 0xd6, 0xf6, 0xff, 0xb5, - 0x71, 0xff, 0x0e, 0x6a, 0xfe, 0xbf, 0x49, 0xff, 0xd2, 0x71, 0xfe, 0x6c, 0xcb, 0xfe, 0x74, 0x5c, - 0xfe, 0xe2, 0xab, 0xfd, 0x2d, 0x48, 0xfe, 0xca, 0xd2, 0xfe, 0x9e, 0x66, 0xff, 0x19, 0xc9, 0xff, - 0x68, 0x22, 0x00, 0x67, 0x7e, 0xff, 0xa5, 0xac, 0x1c, 0xd9, 0x8e, 0x23, 0x2f, 0x9c, 0x0b, 0x50, - 0x37, 0x0c, 0xef, 0x8e, 0x04, 0x77, 0x71, 0x00, 0xa6, 0x61, 0x02, 0xf2, 0xd9, 0xf9, 0xde, 0x6c, - 0xf5, 0x6e, 0x48, 0xfd, 0x9b, 0xcb, 0x01, 0x37, 0x03, 0xfc, 0x02, 0x9c, 0xfc, 0x93, 0x52, 0xfc, - 0x6b, 0xb2, 0xfd, 0x89, 0x41, 0xff, 0xc8, 0x4e, 0xfe, 0xd8, 0x1a, 0xff, 0x4d, 0x29, 0x00, 0xfa, - 0x5e, 0xff, 0x33, 0x70, 0xfe, 0x42, 0x70, 0xff, 0xc4, 0x31, 0xfe, 0xfc, 0x9c, 0xfe, 0x9f, 0xea, - 0xfd, 0x0e, 0x3c, 0xfd, 0x49, 0x2e, 0xfe, 0x93, 0x8a, 0xfe, 0x2b, 0xf2, 0xfe, 0x96, 0x97, 0xff, - 0xaf, 0x03, 0x00, 0x33, 0x44, 0xff, 0x01, 0x9c, 0x20, 0xb1, 0x98, 0x26, 0x2e, 0xc2, 0x08, 0x2c, - 0xc2, 0x09, 0xf0, 0x57, 0x02, 0x2e, 0x98, 0x00, 0x7e, 0xfa, 0x04, 0x8a, 0x3f, 0xfa, 0xbd, 0x40, - 0xf4, 0xd9, 0x4b, 0xfe, 0xfa, 0x02, 0x05, 0x5b, 0x20, 0xfc, 0xbc, 0x91, 0xfa, 0x67, 0x97, 0xfa, - 0x64, 0x7a, 0xfd, 0xfa, 0x12, 0x00, 0x34, 0x00, 0xfe, 0x42, 0x0a, 0xfe, 0xde, 0xef, 0xff, 0xb5, - 0x6b, 0xff, 0x15, 0xdd, 0xfd, 0xe6, 0x6e, 0xff, 0xc8, 0x1b, 0xfe, 0x60, 0xb4, 0xfe, 0xa7, 0xe5, - 0xfd, 0x9c, 0xb1, 0xfc, 0x57, 0x00, 0xfe, 0x9c, 0xbb, 0xfe, 0x7b, 0x06, 0xff, 0x58, 0x90, 0xff, - 0x63, 0x0a, 0x00, 0xa6, 0x2c, 0xff, 0xe6, 0xdc, 0x21, 0x58, 0x10, 0x28, 0x95, 0x97, 0x09, 0xd7, - 0x19, 0x09, 0x7c, 0xa5, 0x00, 0x2d, 0x83, 0x00, 0x2e, 0x7d, 0x05, 0x9d, 0x29, 0xfb, 0x5b, 0xaf, - 0xf2, 0x6d, 0x7b, 0xfc, 0x3c, 0xd1, 0x06, 0x77, 0xf3, 0xfe, 0x54, 0xc0, 0xfa, 0xdd, 0xb4, 0xf7, - 0x4d, 0xb1, 0xfb, 0x64, 0xce, 0x00, 0xaa, 0xa3, 0xff, 0x17, 0xc2, 0xfd, 0xf1, 0x11, 0xff, 0xb6, - 0x3b, 0xff, 0x87, 0x9e, 0xfd, 0x4a, 0x2d, 0xff, 0x6a, 0xbc, 0xfd, 0x8d, 0xb7, 0xfe, 0xfb, 0x13, - 0xfe, 0xa0, 0xe7, 0xfc, 0x8c, 0xe3, 0xfd, 0x25, 0xdc, 0xfe, 0x73, 0x35, 0xff, 0xc4, 0x87, 0xff, - 0x71, 0xe5, 0xff, 0xf2, 0xf5, 0xfe, 0x4c, 0x45, 0x20, 0x02, 0x54, 0x27, 0x7d, 0xc5, 0x0c, 0xad, - 0xd3, 0x0a, 0xa6, 0x5d, 0x01, 0xce, 0x3d, 0x00, 0x6a, 0xe6, 0x03, 0x7a, 0x92, 0xfb, 0xad, 0xae, - 0xf1, 0x44, 0xab, 0xf9, 0xb1, 0x3a, 0x05, 0x15, 0x7f, 0x00, 0xdb, 0xdb, 0xfe, 0xe3, 0x4e, 0xf8, - 0xcf, 0x91, 0xf8, 0x9e, 0xc7, 0xff, 0x9e, 0x91, 0x00, 0x81, 0x33, 0xff, 0x85, 0x50, 0xff, 0xa6, - 0x08, 0xff, 0x37, 0x13, 0xfe, 0x3e, 0x31, 0xff, 0x73, 0xb1, 0xfd, 0x31, 0xe2, 0xfe, 0x9c, 0x10, - 0xfe, 0x4d, 0x7a, 0xfc, 0x58, 0xbc, 0xfd, 0xa6, 0x67, 0xfe, 0x19, 0x3b, 0xff, 0xb7, 0xcc, 0xff, - 0x8a, 0x26, 0x00, 0x9d, 0x68, 0xff, 0x8d, 0x46, 0x1e, 0xda, 0xa9, 0x25, 0xff, 0x14, 0x0c, 0xbb, - 0xe5, 0x0b, 0xb1, 0x6a, 0x03, 0x3c, 0x0f, 0x00, 0x74, 0xd4, 0x02, 0x19, 0x7d, 0xfb, 0xac, 0xba, - 0xf4, 0x24, 0xe1, 0xf8, 0xeb, 0xc9, 0x03, 0xf8, 0x51, 0x00, 0xf3, 0x31, 0xfd, 0xd5, 0xf8, 0xfb, - 0x25, 0x1f, 0xf9, 0xfd, 0xde, 0xfb, 0x19, 0xd9, 0xff, 0xf2, 0xf6, 0xff, 0x60, 0xe5, 0xff, 0x12, - 0xe2, 0xff, 0xf8, 0x83, 0xfe, 0xb9, 0xbb, 0xfe, 0x05, 0x7a, 0xfd, 0xd4, 0x1f, 0xfe, 0x88, 0xa7, - 0xfe, 0x77, 0x75, 0xfd, 0x7f, 0x9e, 0xfd, 0x7a, 0xab, 0xfe, 0x3f, 0x3c, 0xff, 0x4c, 0xcf, 0xff, - 0x8b, 0x17, 0x00, 0xcb, 0x5f, 0xff, 0xcc, 0xc0, 0x1e, 0x50, 0xc7, 0x22, 0x81, 0x7e, 0x09, 0xf4, - 0x02, 0x0f, 0x32, 0x61, 0x04, 0x35, 0x68, 0xfe, 0x08, 0x63, 0x03, 0x2f, 0x88, 0xfd, 0xc1, 0xf9, - 0xf5, 0x9a, 0x7d, 0xf7, 0xe7, 0x16, 0x02, 0xe8, 0xb6, 0x01, 0xeb, 0x8c, 0xfd, 0x5f, 0x4d, 0xfd, - 0x6e, 0x22, 0xfc, 0xc3, 0xc5, 0xf9, 0x39, 0x84, 0xfe, 0x93, 0x7a, 0x00, 0x36, 0x82, 0xfe, 0x9a, - 0xe0, 0xfe, 0x8e, 0xc1, 0xfd, 0x44, 0x4d, 0xfe, 0x05, 0x4b, 0xfe, 0xbf, 0x59, 0xfe, 0xcf, 0x8d, - 0xfe, 0xcf, 0x23, 0xfe, 0x32, 0xc0, 0xfd, 0x92, 0x76, 0xff, 0xe2, 0x09, 0x00, 0xc7, 0xb0, 0xff, - 0xbb, 0xf6, 0xff, 0xce, 0x2d, 0xff, 0x0b, 0x61, 0x1b, 0x60, 0x70, 0x20, 0x12, 0x8b, 0x0a, 0xfd, - 0xae, 0x0d, 0x32, 0x12, 0x04, 0x4f, 0x81, 0xff, 0x92, 0x44, 0x03, 0xa7, 0x97, 0xfc, 0x8e, 0x22, - 0xf7, 0x6d, 0xbf, 0xf9, 0x38, 0xe2, 0x00, 0x18, 0xcf, 0xff, 0x5f, 0x00, 0xfe, 0xbb, 0xbb, 0xfd, - 0x0a, 0xc1, 0xfd, 0x4f, 0x25, 0xfc, 0x55, 0x5b, 0xfd, 0xf6, 0x1d, 0x00, 0x17, 0x2a, 0x00, 0xb3, - 0x14, 0xff, 0x4c, 0xe7, 0xfd, 0xf0, 0xe7, 0xfe, 0x19, 0x8a, 0xfe, 0xb7, 0xa2, 0xfe, 0xe6, 0x4e, - 0xfe, 0x3e, 0xf5, 0xfd, 0x5e, 0x66, 0xfe, 0x1b, 0x00, 0xff, 0x3a, 0x4a, 0xff, 0x06, 0x7a, 0xff, - 0xcb, 0x10, 0x00, 0xa6, 0x7a, 0xff, 0xb8, 0x4c, 0x19, 0xce, 0x19, 0x1e, 0x27, 0x79, 0x09, 0x7c, - 0x5e, 0x0b, 0x41, 0x85, 0x04, 0x23, 0x55, 0x01, 0xf3, 0x16, 0x03, 0x7d, 0x6b, 0xfc, 0xfc, 0x71, - 0xf7, 0x0f, 0x0c, 0xfb, 0xff, 0x60, 0x01, 0x44, 0x3b, 0xff, 0x08, 0x35, 0xfe, 0xc8, 0xc7, 0xfd, - 0xb0, 0x10, 0xfe, 0x26, 0x66, 0xfd, 0x95, 0x63, 0xfe, 0x85, 0x6f, 0x00, 0x0b, 0x21, 0x00, 0x75, - 0x11, 0xff, 0x43, 0x53, 0xfe, 0x0d, 0x53, 0xff, 0xe3, 0x85, 0xfe, 0xc9, 0x7d, 0xfe, 0xa9, 0xfb, - 0xfd, 0xa5, 0xcf, 0xfd, 0x0e, 0x68, 0xfe, 0xa4, 0xcc, 0xfe, 0x7b, 0x60, 0xff, 0x40, 0xc5, 0xff, - 0xac, 0x1f, 0x00, 0x04, 0x89, 0xff, 0x74, 0x62, 0x17, 0x56, 0xca, 0x1b, 0xe8, 0x79, 0x08, 0x76, - 0x82, 0x0a, 0xaa, 0x71, 0x04, 0x4c, 0x5b, 0x01, 0x80, 0xfc, 0x02, 0xe2, 0x97, 0xfc, 0x50, 0x0d, - 0xf8, 0x61, 0x40, 0xfc, 0x7d, 0xa5, 0x01, 0xe3, 0xd9, 0xfe, 0xa0, 0xc0, 0xfe, 0xce, 0x49, 0xfe, - 0x0b, 0x2c, 0xfe, 0xeb, 0x5e, 0xfe, 0x8a, 0xe8, 0xfe, 0xe2, 0xd7, 0xff, 0x1d, 0xe4, 0xff, 0xa5, - 0x3f, 0xff, 0xc7, 0x84, 0xfe, 0x1f, 0x65, 0xff, 0xf9, 0xa6, 0xfe, 0xaa, 0xec, 0xfe, 0x08, 0x80, - 0xfe, 0xf3, 0x0d, 0xfe, 0xe9, 0x46, 0xfe, 0x3f, 0xa9, 0xfe, 0x45, 0x63, 0xff, 0x47, 0xcc, 0xff, - 0x6d, 0x15, 0x00, 0x35, 0x79, 0xff, 0x63, 0x5c, 0x15, 0x1a, 0x4b, 0x19, 0xba, 0x07, 0x08, 0xf4, - 0x9b, 0x09, 0x1f, 0xbe, 0x03, 0xb5, 0xbf, 0x01, 0xa2, 0x5b, 0x03, 0x5a, 0xfd, 0xfc, 0xef, 0xc5, - 0xf8, 0xdc, 0x79, 0xfd, 0x55, 0xc9, 0x02, 0x78, 0x96, 0xff, 0x34, 0x56, 0xff, 0xfc, 0x8a, 0xfe, - 0x68, 0x65, 0xfe, 0xa6, 0x20, 0xff, 0xc3, 0x32, 0xff, 0x2a, 0x75, 0xff, 0x60, 0xd1, 0xff, 0x2f, - 0x88, 0xff, 0x28, 0xe9, 0xfe, 0x7d, 0xc7, 0xff, 0x80, 0xe2, 0xfe, 0x21, 0x28, 0xff, 0x9c, 0xb7, - 0xfe, 0xd8, 0x1f, 0xfe, 0x20, 0x8c, 0xfe, 0x9e, 0xee, 0xfe, 0xd3, 0x69, 0xff, 0x1c, 0xcb, 0xff, - 0xb3, 0x0d, 0x00, 0x43, 0x86, 0xff, 0xde, 0x80, 0x14, 0x4a, 0xd2, 0x17, 0xe5, 0xe4, 0x06, 0x6e, - 0x89, 0x08, 0xa6, 0x4d, 0x03, 0x9d, 0xfa, 0x01, 0x70, 0x1d, 0x04, 0x05, 0x52, 0xfe, 0x84, 0x3e, - 0xfa, 0xb1, 0xd2, 0xfe, 0xbe, 0xc5, 0x03, 0x16, 0x1e, 0x00, 0x25, 0x41, 0xff, 0xa2, 0x0f, 0xfe, - 0x9c, 0x22, 0xfe, 0xd7, 0x5c, 0xff, 0xa8, 0x81, 0xff, 0xbb, 0x93, 0xff, 0x7d, 0xe8, 0xff, 0xb0, - 0xa2, 0xff, 0xbe, 0xe3, 0xfe, 0xb1, 0xb8, 0xff, 0x25, 0x09, 0xff, 0xcb, 0x6f, 0xff, 0xc4, 0xf4, - 0xfe, 0x0c, 0x4e, 0xfe, 0xf1, 0xd0, 0xfe, 0xe2, 0x3c, 0xff, 0x07, 0x92, 0xff, 0xa3, 0xbd, 0xff, - 0x78, 0xcb, 0xff, 0xd5, 0x28, 0xff, 0x90, 0x72, 0x14, 0x71, 0x63, 0x18, 0x91, 0xd0, 0x07, 0x4f, - 0x4c, 0x09, 0xe5, 0xdb, 0x03, 0xe1, 0x70, 0x02, 0x8a, 0x4a, 0x04, 0x21, 0xfa, 0xfd, 0x1a, 0xb0, - 0xf9, 0x19, 0x4f, 0xfe, 0x68, 0x50, 0x03, 0x8c, 0xbe, 0xff, 0x29, 0xe0, 0xfe, 0x8e, 0xb6, 0xfd, - 0xe3, 0x32, 0xfe, 0x32, 0x93, 0xff, 0xbb, 0x62, 0xff, 0xc9, 0x57, 0xff, 0x57, 0xd2, 0xff, 0x82, - 0xa4, 0xff, 0xb1, 0xfa, 0xfe, 0xc2, 0xeb, 0xff, 0xb2, 0x28, 0xff, 0xd7, 0x92, 0xff, 0x48, 0x40, - 0xff, 0x53, 0x74, 0xfe, 0x65, 0xb2, 0xfe, 0x93, 0xe6, 0xfe, 0x7e, 0x12, 0xff, 0xc9, 0x69, 0xff, - 0x99, 0xbd, 0xff, 0x23, 0x49, 0xff, 0x54, 0xcc, 0x14, 0x4b, 0xa6, 0x18, 0x5a, 0x70, 0x07, 0xde, - 0xad, 0x08, 0x2c, 0x68, 0x03, 0xb1, 0x46, 0x02, 0xef, 0x59, 0x04, 0x7d, 0xff, 0xfd, 0xd8, 0x58, - 0xf9, 0x9f, 0x03, 0xfe, 0x03, 0x77, 0x03, 0xbf, 0xc9, 0xff, 0xed, 0x94, 0xfe, 0xa6, 0x4b, 0xfd, - 0x9e, 0xdc, 0xfd, 0xe6, 0xd4, 0xff, 0xbf, 0x2a, 0x00, 0xbe, 0xfb, 0xff, 0x60, 0x18, 0x00, 0x6b, - 0xa9, 0xff, 0x50, 0xdc, 0xfe, 0xea, 0xa6, 0xff, 0x1d, 0xd2, 0xfe, 0xa5, 0x41, 0xff, 0x56, 0x10, - 0xff, 0xcd, 0xab, 0xfe, 0xd3, 0x35, 0xff, 0xe8, 0x53, 0xff, 0x93, 0x46, 0xff, 0x40, 0x5c, 0xff, - 0x52, 0x8e, 0xff, 0xb7, 0x22, 0xff, 0x2e, 0xc9, 0x15, 0x3c, 0x24, 0x1a, 0x96, 0xd8, 0x07, 0x12, - 0x83, 0x08, 0xf0, 0xbd, 0x02, 0xde, 0x8c, 0x01, 0x21, 0xa5, 0x03, 0x4a, 0x01, 0xfd, 0x69, 0x06, - 0xf8, 0xe6, 0xc2, 0xfc, 0x55, 0x8f, 0x03, 0xd0, 0x7e, 0x00, 0x6b, 0xe1, 0xfe, 0x22, 0x4b, 0xfd, - 0xa2, 0xc4, 0xfd, 0xe0, 0xa4, 0xff, 0x55, 0x09, 0x00, 0xd7, 0xf8, 0xff, 0x6c, 0x31, 0x00, 0xa1, - 0x15, 0x00, 0xf5, 0x48, 0xff, 0xe3, 0xf2, 0xff, 0x1c, 0x0b, 0xff, 0x62, 0x47, 0xff, 0x16, 0xee, - 0xfe, 0x64, 0x46, 0xfe, 0x15, 0xc6, 0xfe, 0x77, 0x55, 0xff, 0x19, 0xd4, 0xff, 0x65, 0x3e, 0x00, - 0x06, 0x3a, 0x00, 0x01, 0x4d, 0xff, 0xc8, 0x9c, 0x17, 0x89, 0x3a, 0x1c, 0x4b, 0x42, 0x08, 0xea, - 0x1b, 0x09, 0x2a, 0xd8, 0x02, 0xb3, 0x89, 0x01, 0x86, 0x90, 0x03, 0x39, 0x12, 0xfc, 0x90, 0x45, - 0xf6, 0x41, 0x4a, 0xfb, 0x1c, 0xae, 0x03, 0x54, 0x62, 0x00, 0x41, 0xea, 0xfd, 0x29, 0x5f, 0xfc, - 0x23, 0x31, 0xfd, 0xa8, 0x8e, 0xff, 0x88, 0x45, 0x00, 0xab, 0x0f, 0x00, 0x2b, 0x6c, 0x00, 0x42, - 0x61, 0x00, 0xcb, 0x32, 0xff, 0x71, 0xe0, 0xff, 0x31, 0xfa, 0xfe, 0x0d, 0x4f, 0xff, 0x59, 0x1a, - 0xff, 0x41, 0x72, 0xfe, 0xd8, 0x01, 0xff, 0x61, 0x97, 0xff, 0x86, 0xb7, 0xff, 0x9a, 0xe9, 0xff, - 0xc7, 0x12, 0x00, 0x7b, 0x8f, 0xff, 0x3a, 0xc9, 0x1a, 0xd7, 0x0b, 0x1f, 0x90, 0xb2, 0x07, 0xf5, - 0xa1, 0x09, 0x80, 0xd3, 0x02, 0x81, 0x6d, 0x01, 0x11, 0x84, 0x03, 0xb4, 0xbc, 0xfa, 0x63, 0xae, - 0xf4, 0xe0, 0xe0, 0xfa, 0x0a, 0x95, 0x04, 0x80, 0x1b, 0x00, 0x86, 0xee, 0xfc, 0x59, 0x72, 0xfb, - 0xc9, 0xa1, 0xfc, 0xa0, 0x24, 0xff, 0x52, 0xc4, 0xff, 0x67, 0x8f, 0xff, 0xfd, 0x10, 0x00, 0x6c, - 0x13, 0x00, 0x4a, 0xbd, 0xfe, 0x38, 0xd6, 0xff, 0xd5, 0x05, 0xff, 0x47, 0x53, 0xff, 0xf4, 0xe6, - 0xfe, 0xb5, 0x2c, 0xfe, 0x2f, 0xca, 0xfe, 0x8e, 0x7f, 0xff, 0x7f, 0xc8, 0xff, 0x04, 0x0b, 0x00, - 0x4c, 0x4f, 0x00, 0x3c, 0xa2, 0xff, 0x51, 0x5d, 0x1d, 0x5e, 0x61, 0x22, 0x39, 0xc5, 0x07, 0x96, - 0xaf, 0x09, 0x6d, 0xcc, 0x02, 0x4a, 0x06, 0x01, 0x85, 0x88, 0x03, 0x53, 0x64, 0xf9, 0x84, 0x84, - 0xf3, 0xc3, 0xcf, 0xfa, 0xde, 0x82, 0x04, 0x7e, 0xe9, 0xff, 0x7f, 0xd7, 0xfc, 0x43, 0xcb, 0xfa, - 0x6d, 0x2f, 0xfc, 0xfb, 0xe7, 0xfe, 0x15, 0x8f, 0xff, 0xc0, 0xc2, 0xff, 0xc0, 0xdd, 0xff, 0x0b, - 0xd6, 0xff, 0xc5, 0x8a, 0xfe, 0xf9, 0x7d, 0xff, 0xf5, 0x77, 0xfe, 0xf3, 0xec, 0xfe, 0x08, 0x81, - 0xfe, 0x95, 0xe1, 0xfd, 0x2d, 0xb1, 0xfe, 0xbd, 0x6b, 0xff, 0x4b, 0xda, 0xff, 0x80, 0x03, 0x00, - 0xef, 0x5d, 0x00, 0x62, 0x97, 0xff, 0x6f, 0x1d, 0x1e, 0x50, 0xbe, 0x24, 0xa6, 0xaf, 0x09, 0x01, - 0x6d, 0x0a, 0x49, 0xf5, 0x02, 0x3b, 0xc3, 0xff, 0x65, 0x24, 0x03, 0x9a, 0x45, 0xf9, 0x30, 0xd0, - 0xf3, 0xce, 0xf9, 0xfa, 0xb2, 0x2c, 0x02, 0xc4, 0xcb, 0xfe, 0xfb, 0xb3, 0xfd, 0x5d, 0x86, 0xfb, - 0x18, 0x38, 0xfc, 0x74, 0x51, 0xfe, 0xe4, 0x0f, 0xff, 0x7a, 0x64, 0x00, 0xba, 0x30, 0x00, 0x8d, - 0x51, 0xff, 0x67, 0x4b, 0xfe, 0x7f, 0x60, 0xff, 0xbf, 0x8b, 0xfe, 0xe4, 0xdf, 0xfe, 0x85, 0x4a, - 0xfe, 0x7c, 0xca, 0xfd, 0xc8, 0x7d, 0xfe, 0x89, 0xe8, 0xfe, 0xb3, 0xa1, 0xff, 0x66, 0xf0, 0xff, - 0x6e, 0x49, 0x00, 0xfd, 0x8c, 0xff, 0x77, 0x1a, 0x1f, 0x45, 0x8a, 0x25, 0xbf, 0x96, 0x0a, 0x74, - 0x62, 0x0c, 0x34, 0x49, 0x04, 0x8f, 0x38, 0xff, 0xa7, 0x88, 0x01, 0x77, 0x06, 0xf8, 0xf3, 0x55, - 0xf4, 0xd0, 0x10, 0xfd, 0x34, 0x7b, 0x00, 0x19, 0xd3, 0xfb, 0x38, 0xbe, 0xfd, 0x13, 0xf0, 0xfc, - 0xb8, 0xe0, 0xfd, 0x70, 0x63, 0xfe, 0x9c, 0xa7, 0xfd, 0xea, 0xd9, 0xff, 0x74, 0x92, 0x00, 0x4b, - 0x6c, 0xff, 0x53, 0xae, 0xfe, 0x7e, 0x92, 0xff, 0xce, 0x60, 0xfe, 0xf7, 0xb9, 0xfe, 0x63, 0xd8, - 0xfd, 0xbb, 0x6c, 0xfd, 0x8c, 0x56, 0xfe, 0x99, 0x67, 0xfe, 0x5a, 0x1d, 0xff, 0x3c, 0xc6, 0xff, - 0xeb, 0x39, 0x00, 0xed, 0x75, 0xff, 0xda, 0x2e, 0x22, 0x49, 0x0c, 0x26, 0x91, 0x94, 0x08, 0x23, - 0xc1, 0x0d, 0x54, 0xb0, 0x04, 0x3c, 0x33, 0xff, 0x0f, 0x2f, 0x01, 0x4f, 0x8a, 0xf6, 0xf7, 0x0f, - 0xf5, 0xdf, 0x7e, 0x00, 0x74, 0x5a, 0x00, 0x3e, 0xd1, 0xf7, 0xc3, 0x5c, 0xfc, 0xf5, 0x6e, 0xfd, - 0xd3, 0x94, 0xff, 0xc3, 0xdf, 0xff, 0xff, 0x17, 0xfd, 0x01, 0x2f, 0xff, 0x92, 0xd3, 0x00, 0x56, - 0x1a, 0xff, 0x30, 0x5e, 0xfe, 0x71, 0xb7, 0xff, 0x9b, 0xed, 0xfd, 0xe1, 0x86, 0xfe, 0x0c, 0x53, - 0xfd, 0x87, 0xea, 0xfc, 0x89, 0x63, 0xfe, 0x7d, 0x4b, 0xfe, 0x0e, 0xab, 0xfe, 0xa8, 0xa0, 0xff, - 0x73, 0x12, 0x00, 0xb0, 0x10, 0xff, 0xd6, 0x9f, 0x26, 0x90, 0xfa, 0x29, 0x1f, 0x85, 0x04, 0x47, - 0x90, 0x0a, 0xa4, 0x32, 0x03, 0x93, 0x5f, 0xff, 0xc0, 0x8f, 0x04, 0x2d, 0xbe, 0xf6, 0xb8, 0x52, - 0xf3, 0x8b, 0x38, 0x02, 0x4e, 0x8a, 0x03, 0xbf, 0xe0, 0xf6, 0x8b, 0xe3, 0xf9, 0xc1, 0x90, 0xfc, - 0xbc, 0x06, 0x00, 0x0f, 0x1a, 0x01, 0x91, 0xc9, 0xfc, 0xe8, 0x18, 0xfe, 0xf6, 0xe6, 0x00, 0x82, - 0x4f, 0xff, 0xc5, 0xc6, 0xfd, 0xfc, 0xb6, 0xff, 0x27, 0xc8, 0xfd, 0xdb, 0x73, 0xfe, 0xa3, 0x23, - 0xfd, 0x6f, 0x3d, 0xfc, 0xf6, 0x62, 0xfe, 0xd2, 0x81, 0xfe, 0xfd, 0x76, 0xfe, 0xc8, 0x5d, 0xff, - 0x69, 0x48, 0x00, 0x80, 0x3a, 0xff, 0xc0, 0x38, 0x2b, 0x43, 0xe9, 0x2b, 0xe8, 0x1d, 0x01, 0x91, - 0xe0, 0x08, 0xd1, 0x55, 0x00, 0x7c, 0x35, 0x00, 0xcc, 0x22, 0x07, 0xba, 0xb6, 0xf6, 0xfd, 0x38, - 0xf2, 0x5e, 0x26, 0x03, 0x1c, 0x78, 0x07, 0x52, 0x27, 0xf7, 0xef, 0x99, 0xf7, 0x8c, 0x08, 0xfa, - 0xb5, 0x98, 0xff, 0xb9, 0xd6, 0x01, 0xee, 0x28, 0xfc, 0x67, 0xd0, 0xfc, 0xee, 0x9d, 0x00, 0x7b, - 0x4b, 0xff, 0x7d, 0x09, 0xfd, 0xe1, 0xdd, 0xff, 0x69, 0xbd, 0xfd, 0xe5, 0xc2, 0xfe, 0x4a, 0x41, - 0xfd, 0xa1, 0xad, 0xfb, 0x52, 0x21, 0xfe, 0xfb, 0xca, 0xfe, 0x75, 0xcc, 0xfe, 0x9e, 0x89, 0xff, - 0x9e, 0x23, 0x00, 0xcb, 0xd8, 0xfe, 0x1f, 0x9b, 0x2d, 0x7b, 0xc6, 0x2d, 0xb7, 0xd8, 0x00, 0xe7, - 0x38, 0x07, 0x1f, 0xdf, 0xfd, 0x36, 0xee, 0x00, 0x97, 0xb8, 0x08, 0x54, 0xcd, 0xf7, 0xe2, 0x1f, - 0xf0, 0x86, 0xc2, 0x01, 0x86, 0xdd, 0x0a, 0x71, 0x98, 0xf9, 0x0c, 0xb0, 0xf6, 0xcb, 0x43, 0xf6, - 0xa5, 0xed, 0xfd, 0x6e, 0x75, 0x03, 0x84, 0x47, 0xfd, 0x55, 0xf1, 0xfb, 0xaf, 0xb5, 0xff, 0x8f, - 0xf4, 0xfe, 0xea, 0xfc, 0xfc, 0x65, 0xe2, 0xff, 0x26, 0x27, 0xfd, 0x34, 0xad, 0xfe, 0xd2, 0x7c, - 0xfd, 0x7b, 0xd1, 0xfb, 0x65, 0x49, 0xfe, 0x84, 0x33, 0xff, 0x09, 0xf9, 0xfe, 0x28, 0xa8, 0xff, - 0xd8, 0xf4, 0xff, 0x1d, 0x86, 0xfe, 0xd9, 0x19, 0x2e, 0x1a, 0xed, 0x2e, 0x53, 0x99, 0x02, 0x5d, - 0x1c, 0x07, 0xbb, 0x9c, 0xfc, 0xa0, 0x82, 0x00, 0xb7, 0x5a, 0x08, 0xb5, 0xab, 0xf8, 0xe4, 0x5a, - 0xee, 0x53, 0x6a, 0xff, 0xd6, 0x26, 0x0c, 0x68, 0x27, 0xfd, 0xe7, 0x31, 0xf7, 0x42, 0x51, 0xf3, - 0x75, 0x4f, 0xfc, 0x91, 0x10, 0x04, 0x7a, 0xbd, 0xff, 0x4e, 0xb1, 0xfb, 0x0d, 0xaf, 0xfe, 0x03, - 0x1d, 0xff, 0x5e, 0x8a, 0xfc, 0x9c, 0x59, 0xff, 0xcd, 0xf5, 0xfc, 0x1f, 0xe6, 0xfe, 0x0e, 0xac, - 0xfd, 0x8b, 0x1c, 0xfc, 0x40, 0xcf, 0xfd, 0x26, 0x1d, 0xff, 0x78, 0x2f, 0xff, 0x2d, 0x68, 0xff, - 0x90, 0xd0, 0xff, 0xb7, 0x65, 0xfe, 0x61, 0xb2, 0x2c, 0x1f, 0x1d, 0x2f, 0x50, 0x68, 0x06, 0x80, - 0xe2, 0x08, 0x16, 0x4a, 0xfc, 0xbf, 0xd4, 0xff, 0x84, 0x15, 0x07, 0x34, 0xd6, 0xf8, 0x4a, 0xe8, - 0xec, 0xaf, 0x63, 0xfc, 0x2f, 0x44, 0x0b, 0xb8, 0x79, 0x00, 0x32, 0x82, 0xfb, 0xeb, 0xc1, 0xf1, - 0x46, 0x4a, 0xf9, 0x46, 0x1b, 0x04, 0x62, 0xba, 0x01, 0xa9, 0x12, 0xfd, 0xc3, 0xa4, 0xfd, 0x0f, - 0xfb, 0xfe, 0x04, 0xf6, 0xfc, 0xc8, 0x2f, 0xff, 0x64, 0x45, 0xfd, 0xb2, 0x64, 0xff, 0xde, 0xa0, - 0xfd, 0x81, 0xc9, 0xfb, 0x5d, 0x8b, 0xfd, 0xa4, 0x70, 0xfe, 0x48, 0x3e, 0xff, 0xc1, 0x35, 0xff, - 0xaa, 0xf7, 0xff, 0x37, 0xfa, 0xfe, 0x97, 0x71, 0x2a, 0x1c, 0xb0, 0x2d, 0xa3, 0x21, 0x0a, 0xfc, - 0x2e, 0x0a, 0xc9, 0xbb, 0xfd, 0x07, 0xa9, 0xff, 0x89, 0xc5, 0x04, 0xd6, 0x10, 0xfa, 0xed, 0xf4, - 0xeb, 0xa7, 0x3b, 0xf9, 0x99, 0x50, 0x09, 0xf9, 0x30, 0x01, 0x91, 0x36, 0x00, 0xb2, 0x83, 0xf3, - 0x6a, 0xe9, 0xf4, 0x73, 0x95, 0x02, 0x19, 0x35, 0x02, 0x08, 0xc2, 0xfe, 0xee, 0xd2, 0xfe, 0x0c, - 0x91, 0xfe, 0xf5, 0xa3, 0xfd, 0x45, 0x42, 0xff, 0xf9, 0xd9, 0xfc, 0x18, 0x4b, 0xff, 0x5f, 0x98, - 0xfd, 0xd4, 0x21, 0xfb, 0x3d, 0x94, 0xfd, 0x1f, 0x1e, 0xfe, 0x09, 0x5e, 0xff, 0x7d, 0x06, 0x00, - 0x7a, 0x52, 0x00, 0xbc, 0x59, 0xff, 0xc7, 0xcf, 0x27, 0xf2, 0xe4, 0x2b, 0xc9, 0xc9, 0x0a, 0x51, - 0x93, 0x0c, 0xad, 0x80, 0xff, 0x3b, 0xc1, 0xfe, 0x45, 0x70, 0x04, 0x7e, 0x30, 0xfa, 0xa8, 0x73, - 0xed, 0x9c, 0xac, 0xf6, 0x5c, 0x49, 0x08, 0xf2, 0xcb, 0x00, 0x67, 0x50, 0x00, 0xd0, 0x47, 0xf8, - 0x8c, 0xc8, 0xf1, 0xe8, 0xb3, 0xfe, 0xbd, 0xf9, 0x02, 0xcf, 0x31, 0x00, 0x2c, 0xe7, 0xff, 0x08, - 0xae, 0xfe, 0x5c, 0xda, 0xfd, 0xab, 0xba, 0xff, 0x38, 0x92, 0xfc, 0xa9, 0x7b, 0xfd, 0x14, 0x47, - 0xfe, 0x80, 0x99, 0xfb, 0xb4, 0x7c, 0xfd, 0x1c, 0xb8, 0xfe, 0x1b, 0x56, 0xff, 0xde, 0x4c, 0x00, - 0x41, 0x44, 0x00, 0x7e, 0x50, 0xff, 0x69, 0xdc, 0x25, 0x1b, 0x6e, 0x2a, 0xcf, 0x0b, 0x09, 0x49, - 0xdc, 0x0c, 0x7c, 0x26, 0x02, 0x8d, 0xa5, 0xfe, 0x7b, 0x56, 0x02, 0xea, 0x2d, 0xfa, 0x44, 0xfe, - 0xf2, 0x80, 0x8e, 0xf6, 0x9f, 0x30, 0x06, 0x63, 0x34, 0x01, 0xfd, 0x75, 0xfc, 0xa1, 0x67, 0xfc, - 0xa1, 0x29, 0xf5, 0xb6, 0x66, 0xf9, 0xef, 0xa6, 0x01, 0x70, 0xc4, 0x00, 0x20, 0xf4, 0xff, 0xb1, - 0x57, 0x00, 0x43, 0x67, 0xfe, 0x73, 0x11, 0xfe, 0x73, 0x7a, 0xfc, 0xe1, 0x9d, 0xfd, 0xef, 0x2a, - 0xff, 0x83, 0x3a, 0xfd, 0x80, 0x06, 0xfd, 0x09, 0xbf, 0xfe, 0xc2, 0x4d, 0xff, 0x38, 0x0b, 0x00, - 0x47, 0x2f, 0x00, 0xb0, 0x49, 0xff, 0x5b, 0xf9, 0x22, 0x8d, 0xc4, 0x26, 0x1c, 0xb3, 0x08, 0x23, - 0x11, 0x0e, 0xb4, 0x9e, 0x03, 0x8f, 0x89, 0xfe, 0x2d, 0x53, 0x02, 0x95, 0x56, 0xfb, 0x34, 0xa4, - 0xf4, 0xa4, 0xef, 0xf6, 0xf9, 0xec, 0x04, 0x4a, 0x9a, 0x02, 0x2d, 0xb5, 0xfb, 0x51, 0xcc, 0xfc, - 0xb0, 0xd3, 0xf9, 0xf9, 0x1f, 0xf8, 0xbd, 0x55, 0xff, 0xdd, 0xba, 0x00, 0x3a, 0xba, 0xfe, 0xa5, - 0x9d, 0xff, 0xa4, 0xa8, 0xfe, 0x3a, 0xb1, 0xfe, 0x15, 0x85, 0xfd, 0x5d, 0xc2, 0xfd, 0x27, 0xef, - 0xfe, 0xe7, 0x16, 0xfe, 0x2b, 0xfc, 0xfc, 0xb8, 0xdf, 0xfe, 0xcf, 0x96, 0xff, 0x5c, 0xc4, 0xff, - 0xd1, 0x61, 0x00, 0x99, 0x38, 0xff, 0x32, 0xa0, 0x22, 0xb5, 0x12, 0x23, 0x27, 0xff, 0x06, 0xd1, - 0x2c, 0x12, 0x58, 0xd3, 0x03, 0x0e, 0x40, 0xfc, 0x93, 0xd1, 0x03, 0xf1, 0x66, 0xfe, 0x17, 0x9a, - 0xf5, 0x69, 0xcd, 0xf4, 0x75, 0x78, 0x02, 0x87, 0xad, 0x03, 0x00, 0x12, 0xfd, 0xdc, 0x73, 0xfe, - 0x3c, 0xc4, 0xfb, 0x24, 0x61, 0xf6, 0xa0, 0x24, 0xff, 0xc3, 0x87, 0x01, 0xd1, 0x64, 0xfd, 0x1c, - 0xb5, 0xfe, 0xce, 0x5e, 0xfd, 0xf8, 0xc1, 0xfd, 0x68, 0x7b, 0xfe, 0xdc, 0x15, 0xfe, 0x9f, 0xc1, - 0xfe, 0x3f, 0x85, 0xfe, 0xf4, 0x5a, 0xfd, 0x31, 0x0f, 0x00, 0xe4, 0x7a, 0x00, 0x56, 0x8e, 0xff, - 0xe9, 0xee, 0xff, 0xf0, 0x08, 0xff, 0x4a, 0x4d, 0x1e, 0x24, 0x24, 0x21, 0x67, 0x86, 0x09, 0xa1, - 0xcb, 0x10, 0x14, 0x47, 0x03, 0x2c, 0xbb, 0xfc, 0x61, 0x60, 0x03, 0x2e, 0x10, 0xfd, 0x01, 0x5b, - 0xf7, 0xb9, 0xc5, 0xf7, 0x10, 0xf5, 0xff, 0xd8, 0x40, 0x01, 0xbd, 0x2e, 0xfe, 0x7f, 0x50, 0xff, - 0xf9, 0xf6, 0xfd, 0x5a, 0xd3, 0xf8, 0x5e, 0x97, 0xfc, 0xa3, 0xfe, 0x00, 0x27, 0x18, 0x00, 0x85, - 0x05, 0xff, 0x06, 0x5b, 0xfd, 0x1b, 0x58, 0xfe, 0x51, 0xb9, 0xfe, 0x5a, 0xab, 0xfe, 0xa7, 0xb6, - 0xfe, 0x8d, 0x62, 0xfe, 0x5b, 0x15, 0xfe, 0x9e, 0x3c, 0xff, 0xaa, 0xb6, 0xff, 0xb4, 0x5d, 0xff, - 0x5f, 0xfe, 0xff, 0x3b, 0x68, 0xff, 0xd2, 0x96, 0x1b, 0x65, 0x59, 0x1e, 0x32, 0x00, 0x09, 0x80, - 0x48, 0x0e, 0xae, 0xd2, 0x03, 0x3d, 0xcc, 0xff, 0x28, 0x2e, 0x03, 0x74, 0x9c, 0xfc, 0x6b, 0x14, - 0xf8, 0xe6, 0x1b, 0xf9, 0x60, 0x1d, 0x00, 0x47, 0x27, 0x00, 0x30, 0x5c, 0xfe, 0xb8, 0xf2, 0xfe, - 0xcc, 0xba, 0xfe, 0x84, 0x10, 0xfb, 0xf7, 0x1c, 0xfd, 0x43, 0x58, 0x01, 0xa1, 0x4a, 0x00, 0xf5, - 0xac, 0xfe, 0x32, 0xe8, 0xfd, 0xe7, 0x17, 0xff, 0x61, 0xc2, 0xfe, 0x8d, 0x58, 0xfe, 0x57, 0xed, - 0xfd, 0x47, 0x18, 0xfe, 0x74, 0xa1, 0xfe, 0x09, 0xea, 0xfe, 0x0c, 0x23, 0xff, 0x77, 0x8b, 0xff, - 0xc7, 0x44, 0x00, 0xec, 0x9f, 0xff, 0x3a, 0x46, 0x19, 0xd9, 0x34, 0x1c, 0x1a, 0xf8, 0x07, 0x9b, - 0xf2, 0x0b, 0x5c, 0xd6, 0x04, 0xab, 0x3f, 0x01, 0x3b, 0xb0, 0x02, 0x68, 0x8c, 0xfc, 0xea, 0x5b, - 0xf8, 0xeb, 0x97, 0xfa, 0x76, 0x7e, 0x00, 0x28, 0x8f, 0xff, 0xa8, 0xb9, 0xfe, 0x3b, 0x24, 0xff, - 0x2d, 0xf9, 0xfe, 0x16, 0x30, 0xfc, 0x7e, 0x26, 0xfe, 0xc7, 0x78, 0x01, 0xd0, 0x2e, 0x00, 0x1b, - 0xb1, 0xfe, 0xf7, 0x4c, 0xfe, 0xf1, 0x63, 0xff, 0x76, 0xa8, 0xfe, 0x5e, 0x46, 0xfe, 0x3f, 0xbf, - 0xfd, 0xc6, 0x13, 0xfe, 0x1b, 0x8d, 0xfe, 0x81, 0xc8, 0xfe, 0xd3, 0x7b, 0xff, 0xe6, 0xd5, 0xff, - 0x4e, 0x31, 0x00, 0x90, 0x9c, 0xff, 0xc7, 0x25, 0x17, 0xe8, 0xc5, 0x19, 0x72, 0x02, 0x07, 0xfc, - 0x15, 0x0b, 0x52, 0x1e, 0x05, 0xb1, 0x44, 0x01, 0x54, 0x73, 0x02, 0xa8, 0xc2, 0xfc, 0x77, 0x00, - 0xf9, 0xb4, 0xff, 0xfb, 0xb5, 0xa8, 0x00, 0xf9, 0x04, 0xff, 0xd7, 0x56, 0xff, 0x36, 0x9f, 0xff, - 0x19, 0x04, 0xff, 0x40, 0x50, 0xfd, 0x11, 0xde, 0xfe, 0xd0, 0xc8, 0x00, 0xdd, 0xdb, 0xff, 0xca, - 0xe7, 0xfe, 0x05, 0x96, 0xfe, 0xdb, 0x7d, 0xff, 0x09, 0xa3, 0xfe, 0x13, 0x95, 0xfe, 0xb3, 0x3f, - 0xfe, 0xc7, 0x70, 0xfe, 0xd3, 0x7c, 0xfe, 0x77, 0x97, 0xfe, 0xdb, 0x79, 0xff, 0x1b, 0xf0, 0xff, - 0xde, 0x31, 0x00, 0x63, 0x7e, 0xff, 0x46, 0xa3, 0x14, 0xc2, 0x81, 0x17, 0x9f, 0xbc, 0x06, 0x52, - 0xf1, 0x09, 0xba, 0x72, 0x04, 0x32, 0xc1, 0x01, 0x51, 0xd4, 0x02, 0x51, 0xf5, 0xfc, 0x40, 0x91, - 0xf9, 0x7f, 0x10, 0xfd, 0xce, 0x35, 0x01, 0xe4, 0x45, 0xff, 0xa1, 0x29, 0x00, 0xa9, 0xef, 0xff, - 0xfb, 0x19, 0xff, 0x18, 0x59, 0xfe, 0xa2, 0xfd, 0xfe, 0xee, 0x1a, 0x00, 0xc4, 0xde, 0xff, 0x7f, - 0x2a, 0xff, 0xb1, 0xc4, 0xfe, 0xf5, 0xd5, 0xff, 0x1e, 0x35, 0xff, 0x14, 0x21, 0xff, 0xbf, 0x7b, - 0xfe, 0x14, 0x4a, 0xfe, 0x1d, 0x7d, 0xfe, 0xa8, 0xc2, 0xfe, 0x78, 0x8d, 0xff, 0xa9, 0xd3, 0xff, - 0x55, 0x0c, 0x00, 0x17, 0xa3, 0xff, 0x2a, 0x85, 0x12, 0xf9, 0xcb, 0x14, 0x82, 0x86, 0x06, 0x15, - 0x40, 0x09, 0x3a, 0xe1, 0x03, 0xf3, 0x21, 0x02, 0xfc, 0x0f, 0x03, 0x94, 0x77, 0xfd, 0xc5, 0x83, - 0xfa, 0xba, 0x79, 0xfe, 0x9d, 0x63, 0x02, 0x49, 0xdd, 0xff, 0x29, 0x95, 0x00, 0x86, 0x35, 0x00, - 0x34, 0x60, 0xff, 0x5c, 0x14, 0xff, 0xd3, 0x2b, 0xff, 0x30, 0x9e, 0xff, 0xa1, 0xda, 0xff, 0x70, - 0x8e, 0xff, 0x14, 0x35, 0xff, 0x76, 0x0b, 0x00, 0x29, 0x2e, 0xff, 0x84, 0x56, 0xff, 0x30, 0xdd, - 0xfe, 0xf5, 0x74, 0xfe, 0x63, 0xb9, 0xfe, 0xe9, 0xfa, 0xfe, 0x8f, 0x84, 0xff, 0xdd, 0xdd, 0xff, - 0x3a, 0x11, 0x00, 0xa0, 0x9b, 0xff, 0x85, 0x7b, 0x11, 0x86, 0x38, 0x13, 0x3d, 0x8a, 0x05, 0x33, - 0xe3, 0x07, 0x60, 0x23, 0x03, 0x6f, 0x48, 0x02, 0x3a, 0xd5, 0x03, 0x40, 0xc8, 0xfe, 0x47, 0xce, - 0xfb, 0x9e, 0xf4, 0xff, 0x3f, 0xc6, 0x03, 0x2a, 0xc3, 0x00, 0xf2, 0xb8, 0x00, 0xe5, 0xd8, 0xff, - 0xa0, 0x17, 0xff, 0xbe, 0x35, 0xff, 0x27, 0x60, 0xff, 0xb7, 0xba, 0xff, 0x29, 0x2a, 0x00, 0x22, - 0xcb, 0xff, 0x42, 0x26, 0xff, 0xf1, 0xf9, 0xff, 0x16, 0x65, 0xff, 0x5c, 0x9c, 0xff, 0x15, 0x04, - 0xff, 0xc6, 0x94, 0xfe, 0xac, 0x0e, 0xff, 0x13, 0x62, 0xff, 0x97, 0xbb, 0xff, 0x1e, 0xf0, 0xff, - 0xad, 0xdd, 0xff, 0xdc, 0x2a, 0xff, 0x7b, 0xc1, 0x10, 0x0b, 0x37, 0x12, 0x25, 0xcb, 0x04, 0xad, - 0xe7, 0x07, 0x99, 0xef, 0x03, 0xf8, 0x04, 0x03, 0x4a, 0x80, 0x04, 0x9f, 0xb8, 0xff, 0x7e, 0xff, - 0xfc, 0x73, 0xac, 0x00, 0x36, 0xc1, 0x03, 0x70, 0x45, 0x00, 0x64, 0xc6, 0xff, 0x0e, 0xf7, 0xfe, - 0xe0, 0x23, 0xff, 0xcd, 0xe7, 0xff, 0xd9, 0xc8, 0xff, 0x02, 0xa7, 0xff, 0xce, 0xbf, 0xff, 0xe3, - 0x99, 0xff, 0x89, 0x3a, 0xff, 0x35, 0x0e, 0x00, 0x08, 0x87, 0xff, 0x57, 0xf3, 0xff, 0x73, 0x78, - 0xff, 0x96, 0xcc, 0xfe, 0xe1, 0x1c, 0xff, 0xa0, 0x56, 0xff, 0x4b, 0x86, 0xff, 0x99, 0x88, 0xff, - 0x3c, 0x7f, 0xff, 0xd5, 0x0f, 0xff, 0x35, 0xf4, 0x10, 0x3d, 0x70, 0x13, 0xbc, 0x59, 0x06, 0xe7, - 0xc3, 0x08, 0x43, 0x25, 0x04, 0xb3, 0x4b, 0x03, 0x07, 0x84, 0x04, 0xe0, 0xf5, 0xfe, 0x0b, 0xdf, - 0xfb, 0x06, 0xb5, 0xff, 0x61, 0x1d, 0x03, 0xc5, 0x04, 0x00, 0xdd, 0xc1, 0xff, 0x25, 0xe2, 0xfe, - 0xf2, 0x36, 0xff, 0x26, 0xe4, 0xff, 0xf4, 0x65, 0xff, 0x41, 0x61, 0xff, 0x5d, 0xe2, 0xff, 0xe9, - 0xbe, 0xff, 0x24, 0x4d, 0xff, 0xd6, 0x45, 0x00, 0xca, 0x9e, 0xff, 0x85, 0xfe, 0xff, 0xbc, 0xb0, - 0xff, 0x8d, 0xe8, 0xfe, 0xb4, 0xe8, 0xfe, 0xc5, 0xe4, 0xfe, 0x67, 0xf0, 0xfe, 0x7f, 0x49, 0xff, - 0xc4, 0x9c, 0xff, 0x13, 0x44, 0xff, 0xb3, 0x5c, 0x11, 0xbe, 0xab, 0x13, 0x57, 0xfd, 0x05, 0x23, - 0x42, 0x08, 0x9c, 0xeb, 0x03, 0x3e, 0x5b, 0x03, 0x2f, 0xb4, 0x04, 0xea, 0xfb, 0xfe, 0x62, 0x6c, - 0xfb, 0x99, 0x2a, 0xff, 0xf8, 0xfc, 0x02, 0x37, 0xf4, 0xff, 0x1a, 0x6a, 0xff, 0x16, 0x95, 0xfe, - 0xc1, 0x20, 0xff, 0x1b, 0x57, 0x00, 0x10, 0x4d, 0x00, 0xff, 0xec, 0xff, 0x30, 0xdb, 0xff, 0x83, - 0x95, 0xff, 0xaf, 0x31, 0xff, 0xa0, 0xe9, 0xff, 0x9b, 0x2d, 0xff, 0xf2, 0xc3, 0xff, 0xde, 0xba, - 0xff, 0x38, 0x69, 0xff, 0x19, 0x7a, 0xff, 0x7b, 0x09, 0xff, 0x80, 0xdb, 0xfe, 0x85, 0x0f, 0xff, - 0xbf, 0x68, 0xff, 0x47, 0x3e, 0xff, 0xbd, 0xff, 0x11, 0x1e, 0x51, 0x14, 0x53, 0x91, 0x05, 0xee, - 0x4f, 0x07, 0x7f, 0xc5, 0x02, 0x51, 0x94, 0x02, 0x3b, 0x6a, 0x04, 0x90, 0xe1, 0xfe, 0x04, 0x03, - 0xfb, 0x6e, 0x01, 0xff, 0x8c, 0xc5, 0x03, 0x33, 0xa7, 0x00, 0x96, 0x92, 0xff, 0x53, 0xe8, 0xfd, - 0x7b, 0x25, 0xfe, 0x69, 0x29, 0x00, 0xf1, 0xae, 0x00, 0xcc, 0xa8, 0x00, 0xe4, 0xcb, 0x00, 0x51, - 0xff, 0xff, 0xb1, 0x25, 0xff, 0x05, 0xf8, 0xff, 0x7d, 0x10, 0xff, 0xb0, 0x40, 0xff, 0x07, 0x3e, - 0xff, 0x6b, 0xff, 0xfe, 0x18, 0x8a, 0xff, 0xbf, 0xf5, 0xff, 0x60, 0xe4, 0xff, 0xaa, 0x9b, 0xff, - 0x11, 0x52, 0xff, 0x7f, 0xc5, 0xfe, 0xb9, 0x3f, 0x13, 0x45, 0x29, 0x16, 0x58, 0x07, 0x06, 0xbb, - 0x67, 0x07, 0x98, 0x65, 0x02, 0xec, 0x01, 0x02, 0x91, 0x99, 0x03, 0xe1, 0x6e, 0xfd, 0x40, 0x3a, - 0xf9, 0x8b, 0x68, 0xfd, 0x83, 0xde, 0x03, 0x59, 0x42, 0x01, 0x02, 0x9b, 0xff, 0x0e, 0x29, 0xfe, - 0xa8, 0x90, 0xfe, 0x2c, 0x1a, 0x00, 0x3c, 0x80, 0x00, 0x14, 0x52, 0x00, 0xc4, 0x62, 0x00, 0x43, - 0x6c, 0x00, 0x21, 0xbb, 0xff, 0x27, 0x41, 0x00, 0x53, 0x6a, 0xff, 0x64, 0x83, 0xff, 0xdd, 0x33, - 0xff, 0x70, 0xab, 0xfe, 0x73, 0x14, 0xff, 0xe1, 0x9e, 0xff, 0xd4, 0x24, 0x00, 0xb8, 0x8c, 0x00, - 0x81, 0x44, 0x00, 0xb6, 0x2f, 0xff, 0x42, 0x31, 0x15, 0x81, 0x55, 0x18, 0x67, 0x51, 0x06, 0xce, - 0xf3, 0x07, 0x58, 0x6b, 0x02, 0x13, 0xe0, 0x01, 0x77, 0x5f, 0x03, 0xc3, 0x4e, 0xfc, 0xee, 0x5b, - 0xf7, 0xf0, 0xd7, 0xfb, 0x35, 0x05, 0x04, 0xb5, 0x19, 0x01, 0x60, 0x97, 0xfe, 0xf6, 0x5a, 0xfd, - 0x8a, 0x2f, 0xfe, 0xef, 0x58, 0x00, 0x4f, 0xf9, 0x00, 0xd3, 0x73, 0x00, 0x78, 0xa5, 0x00, 0xb6, - 0x7e, 0x00, 0xd3, 0x73, 0xff, 0xfb, 0x51, 0x00, 0x20, 0x5b, 0xff, 0x45, 0x9c, 0xff, 0x65, 0x7d, - 0xff, 0xcd, 0xdb, 0xfe, 0x02, 0x3b, 0xff, 0x33, 0xe1, 0xff, 0x3c, 0x03, 0x00, 0x83, 0x00, 0x00, - 0xe7, 0x47, 0x00, 0xd4, 0xd7, 0xff, 0x18, 0x31, 0x18, 0x7e, 0xaf, 0x1a, 0xfb, 0xe4, 0x05, 0x50, - 0xb5, 0x08, 0x4f, 0x5c, 0x02, 0x14, 0x06, 0x02, 0xa7, 0x78, 0x03, 0x5b, 0x28, 0xfb, 0x80, 0x72, - 0xf5, 0x34, 0xdb, 0xfa, 0xb6, 0xf5, 0x04, 0xb5, 0xdc, 0x00, 0xd6, 0x59, 0xfd, 0x0b, 0x44, 0xfc, - 0x29, 0x63, 0xfd, 0x65, 0xc8, 0xff, 0x11, 0x99, 0x00, 0xba, 0x19, 0x00, 0x5d, 0xa8, 0x00, 0x23, - 0xb9, 0x00, 0xb4, 0x5e, 0xff, 0x52, 0x50, 0x00, 0xc4, 0x69, 0xff, 0xb3, 0x80, 0xff, 0x25, 0x63, - 0xff, 0xc5, 0xf5, 0xfe, 0x7a, 0x4e, 0xff, 0x18, 0x03, 0x00, 0x7f, 0xf5, 0xff, 0xfd, 0xf2, 0xff, - 0x6d, 0x23, 0x00, 0x3e, 0x90, 0xff, 0xb8, 0xd2, 0x1b, 0x52, 0x83, 0x1d, 0x17, 0xb8, 0x04, 0xe1, - 0x57, 0x09, 0x3d, 0x4e, 0x02, 0xab, 0xc6, 0x01, 0x7e, 0x67, 0x03, 0x6c, 0x92, 0xf9, 0x65, 0xf9, - 0xf3, 0x1f, 0xe5, 0xfa, 0x07, 0x08, 0x06, 0x05, 0x62, 0x00, 0x92, 0x57, 0xfc, 0x53, 0x68, 0xfb, - 0xa7, 0x03, 0xfd, 0x47, 0x7d, 0xff, 0xe3, 0x25, 0x00, 0x39, 0xac, 0xff, 0xa9, 0x41, 0x00, 0xad, - 0x6f, 0x00, 0x2b, 0xcc, 0xfe, 0x91, 0x2d, 0x00, 0xcb, 0x67, 0xff, 0xf6, 0x98, 0xff, 0x1f, 0x25, - 0xff, 0xdc, 0x80, 0xfe, 0xf0, 0x20, 0xff, 0x46, 0xe6, 0xff, 0x01, 0x08, 0x00, 0xf2, 0x36, 0x00, - 0xe5, 0x73, 0x00, 0x86, 0xbd, 0xff, 0x04, 0x13, 0x1f, 0x74, 0xe6, 0x20, 0x01, 0xdd, 0x03, 0x31, - 0x81, 0x09, 0xc0, 0x7e, 0x02, 0x4c, 0x65, 0x01, 0x09, 0x66, 0x03, 0x57, 0xf5, 0xf7, 0x0f, 0xa7, - 0xf2, 0xcf, 0x1e, 0xfb, 0x95, 0x8e, 0x06, 0x18, 0x1f, 0x00, 0xb0, 0xe6, 0xfb, 0x5c, 0xad, 0xfa, - 0xe0, 0xbd, 0xfc, 0xd0, 0x69, 0xff, 0x6e, 0xd1, 0xff, 0x78, 0x86, 0xff, 0x81, 0x0e, 0x00, 0x50, - 0x5f, 0x00, 0x15, 0x93, 0xfe, 0x3d, 0xc5, 0xff, 0x75, 0xd7, 0xfe, 0xbc, 0x54, 0xff, 0xe8, 0xc5, - 0xfe, 0x9d, 0x37, 0xfe, 0x18, 0x0a, 0xff, 0x0f, 0xc9, 0xff, 0xca, 0x0f, 0x00, 0x12, 0x46, 0x00, - 0x1a, 0xb1, 0x00, 0xf4, 0xca, 0xff, 0x43, 0xee, 0x20, 0x5b, 0x49, 0x24, 0x4c, 0xce, 0x04, 0xd2, - 0x77, 0x09, 0x3d, 0x1a, 0x02, 0xb4, 0x83, 0x00, 0x81, 0xac, 0x03, 0x41, 0xf8, 0xf6, 0xa0, 0x2b, - 0xf2, 0xa9, 0xf0, 0xfa, 0x01, 0xdf, 0x04, 0x6c, 0xd3, 0xff, 0xef, 0xcc, 0xfc, 0x09, 0x57, 0xfa, - 0x5a, 0xf9, 0xfb, 0x35, 0xfb, 0xfe, 0xe0, 0xcd, 0xff, 0x10, 0x84, 0x00, 0x48, 0xe1, 0xff, 0x88, - 0xc7, 0xff, 0xbd, 0x6c, 0xfe, 0x3c, 0x78, 0xff, 0x80, 0x6c, 0xfe, 0x5c, 0xe4, 0xfe, 0x84, 0x69, - 0xfe, 0xfd, 0x07, 0xfe, 0xb0, 0xf3, 0xfe, 0x15, 0x8f, 0xff, 0xa4, 0x2d, 0x00, 0x8d, 0x29, 0x00, - 0x09, 0x89, 0x00, 0x23, 0x92, 0xff, 0x11, 0x88, 0x21, 0xd5, 0x93, 0x26, 0x76, 0xe9, 0x06, 0xab, - 0x43, 0x0a, 0xd5, 0x5b, 0x02, 0x06, 0xe4, 0xfe, 0xa7, 0x1d, 0x03, 0xdc, 0x24, 0xf7, 0x07, 0xcc, - 0xf2, 0x1f, 0x40, 0xfb, 0x80, 0xe2, 0x01, 0xab, 0xa4, 0xfe, 0x47, 0xf3, 0xfd, 0xd1, 0x61, 0xfb, - 0x72, 0x49, 0xfc, 0x80, 0x29, 0xfe, 0x90, 0x1d, 0xff, 0x79, 0x40, 0x01, 0x85, 0x4b, 0x00, 0xc5, - 0x1b, 0xff, 0xdf, 0x31, 0xfe, 0x75, 0x7c, 0xff, 0xb3, 0xaf, 0xfe, 0x52, 0xed, 0xfe, 0xae, 0x31, - 0xfe, 0xe8, 0xf9, 0xfd, 0x37, 0xb3, 0xfe, 0xc5, 0xf3, 0xfe, 0xaf, 0xe5, 0xff, 0xfd, 0x11, 0x00, - 0x94, 0x6f, 0x00, 0x67, 0x9a, 0xff, 0x8d, 0x54, 0x22, 0x4d, 0x9b, 0x27, 0xd4, 0x66, 0x08, 0xb2, - 0x4c, 0x0c, 0x7e, 0x91, 0x03, 0xcd, 0xe2, 0xfd, 0x56, 0x59, 0x01, 0x73, 0x0c, 0xf6, 0x73, 0x80, - 0xf3, 0x64, 0x6f, 0xfd, 0xbb, 0x7c, 0xff, 0xcb, 0x83, 0xfb, 0x66, 0xa1, 0xfe, 0x29, 0x40, 0xfd, - 0x09, 0xca, 0xfd, 0x10, 0xd0, 0xfd, 0xcc, 0x78, 0xfd, 0x7a, 0xd1, 0x00, 0xd0, 0xbf, 0x00, 0xfe, - 0x55, 0xff, 0x3b, 0xca, 0xfe, 0x67, 0x84, 0xff, 0x48, 0x63, 0xfe, 0x0f, 0xd9, 0xfe, 0x49, 0xda, - 0xfd, 0x90, 0xad, 0xfd, 0x7c, 0x8f, 0xfe, 0x0a, 0x48, 0xfe, 0xf9, 0x5d, 0xff, 0x79, 0xfc, 0xff, - 0x41, 0x70, 0x00, 0xc0, 0x8d, 0xff, 0xf2, 0x99, 0x24, 0x03, 0xad, 0x27, 0x38, 0xa1, 0x07, 0x71, - 0xae, 0x0e, 0xe3, 0xb6, 0x04, 0x2c, 0x7c, 0xfd, 0x6e, 0xa6, 0xff, 0xa2, 0xad, 0xf4, 0x61, 0x73, - 0xf4, 0x7c, 0x4e, 0x00, 0xe5, 0xc2, 0xfd, 0x91, 0xba, 0xf7, 0x77, 0x8e, 0xfe, 0x01, 0x40, 0xfe, - 0xde, 0xfc, 0xff, 0xe4, 0x56, 0xfe, 0x00, 0xf5, 0xfb, 0x6b, 0x75, 0x00, 0xf5, 0x4c, 0x01, 0xb4, - 0xf1, 0xfe, 0xee, 0xd5, 0xfe, 0xce, 0xe6, 0xff, 0x72, 0x23, 0xfe, 0x90, 0xac, 0xfe, 0xc8, 0x0b, - 0xfd, 0x16, 0x28, 0xfd, 0x8b, 0x84, 0xfe, 0x4c, 0xf8, 0xfd, 0x2f, 0xe5, 0xfe, 0x5e, 0xd5, 0xff, - 0x62, 0x2e, 0x00, 0x9b, 0x29, 0xff, 0xde, 0x81, 0x28, 0x01, 0xf4, 0x27, 0xeb, 0xb9, 0x04, 0xf3, - 0x33, 0x10, 0x23, 0xa0, 0x04, 0x78, 0x8c, 0xfd, 0x2d, 0xdf, 0xff, 0x77, 0xe0, 0xf2, 0x13, 0x86, - 0xf5, 0xb0, 0x75, 0x04, 0x9a, 0x96, 0xfd, 0x54, 0x0b, 0xf3, 0xd2, 0x22, 0xfd, 0x19, 0xf6, 0xfe, - 0xb6, 0xa6, 0x01, 0x8d, 0x1c, 0x00, 0x6d, 0x66, 0xfb, 0x63, 0x97, 0xff, 0x08, 0xa6, 0x01, 0x88, - 0x9b, 0xfe, 0x2b, 0x5d, 0xfe, 0xc6, 0x0d, 0x00, 0x0d, 0x8e, 0xfd, 0xe0, 0x75, 0xfe, 0xb3, 0x9c, - 0xfc, 0x88, 0xae, 0xfc, 0x69, 0xb6, 0xfe, 0xb4, 0xec, 0xfd, 0x08, 0x60, 0xfe, 0xfa, 0xbd, 0xff, - 0xf3, 0x22, 0x00, 0x1b, 0xd1, 0xfe, 0x97, 0x73, 0x2d, 0x76, 0x57, 0x2b, 0x12, 0xe7, 0xff, 0xfb, - 0xbf, 0x0d, 0x07, 0xc3, 0x03, 0xb1, 0xd5, 0xfd, 0xf4, 0xcd, 0x02, 0x62, 0x93, 0xf2, 0xfb, 0x1c, - 0xf4, 0x85, 0xfc, 0x06, 0x7a, 0x89, 0x00, 0x4d, 0xef, 0xf0, 0xa3, 0x78, 0xfa, 0x19, 0x92, 0xfe, - 0x79, 0xab, 0x02, 0x3f, 0x88, 0x01, 0xca, 0xd6, 0xfa, 0x9a, 0xad, 0xfe, 0x6f, 0xf9, 0x01, 0x7f, - 0x7a, 0xfe, 0x2a, 0xa5, 0xfd, 0xd1, 0x61, 0x00, 0x1a, 0x59, 0xfd, 0x0d, 0x32, 0xfe, 0xeb, 0x4b, - 0xfc, 0x03, 0x15, 0xfc, 0xde, 0xca, 0xfe, 0x62, 0x23, 0xfe, 0x69, 0x29, 0xfe, 0xdb, 0x76, 0xff, - 0x74, 0x48, 0x00, 0x84, 0xdf, 0xfe, 0xb9, 0x97, 0x33, 0x0c, 0x98, 0x2e, 0xd8, 0xfa, 0xf9, 0x1f, - 0xc7, 0x0a, 0x5a, 0x38, 0x01, 0xd1, 0xe8, 0xfe, 0x58, 0x4c, 0x07, 0xf4, 0x03, 0xf2, 0xed, 0x10, - 0xf2, 0x81, 0xe9, 0x08, 0xde, 0xda, 0x04, 0xed, 0x73, 0xf0, 0x6f, 0x6d, 0xf7, 0x84, 0xc1, 0xfc, - 0xe5, 0x23, 0x03, 0xdb, 0xa0, 0x02, 0x84, 0xa3, 0xf9, 0xb6, 0xf6, 0xfc, 0x15, 0x5c, 0x02, 0xa0, - 0x11, 0xff, 0x94, 0xac, 0xfc, 0x38, 0x53, 0x00, 0x97, 0x5f, 0xfd, 0xb0, 0x84, 0xfe, 0x3c, 0x55, - 0xfc, 0x40, 0x47, 0xfb, 0xac, 0xa5, 0xfe, 0x65, 0x43, 0xfe, 0x0b, 0x25, 0xfe, 0x3b, 0x98, 0xff, - 0xff, 0x88, 0x00, 0x00, 0xc0, 0xfe, 0xaf, 0x01, 0x38, 0xe8, 0x17, 0x30, 0x29, 0xa8, 0xf6, 0x0f, - 0x67, 0x09, 0xfc, 0x37, 0xfe, 0x0a, 0x37, 0x00, 0xb6, 0xe0, 0x09, 0xe4, 0xe8, 0xf1, 0x19, 0x99, - 0xf0, 0xf8, 0x9c, 0x09, 0xe2, 0x3c, 0x09, 0xe0, 0x63, 0xf0, 0xf2, 0x16, 0xf5, 0x8c, 0x24, 0xfa, - 0xaa, 0x69, 0x02, 0xca, 0x7c, 0x03, 0xc6, 0x61, 0xf9, 0x24, 0xb8, 0xfb, 0x62, 0xcb, 0x01, 0x1d, - 0xfd, 0xfe, 0x95, 0x0a, 0xfc, 0xa4, 0x97, 0x00, 0x64, 0x34, 0xfd, 0xce, 0xe6, 0xfe, 0xb2, 0x71, - 0xfc, 0xad, 0x92, 0xfa, 0x0a, 0x88, 0xfe, 0x62, 0xd6, 0xfe, 0x76, 0x7e, 0xfe, 0xf5, 0x8e, 0xff, - 0x2e, 0x45, 0x00, 0xb6, 0x6d, 0xfe, 0xc1, 0xee, 0x3a, 0xb3, 0x2d, 0x32, 0x79, 0x4c, 0xf5, 0x58, - 0x65, 0x07, 0x62, 0x6a, 0xfb, 0x72, 0xa0, 0x01, 0xa4, 0x2b, 0x0c, 0xc9, 0x90, 0xf2, 0x80, 0x1e, - 0xee, 0x0d, 0x85, 0x08, 0x78, 0x93, 0x0d, 0x30, 0x5a, 0xf2, 0x57, 0x91, 0xf3, 0x6e, 0xe4, 0xf5, - 0x1e, 0x03, 0x01, 0x4d, 0xa7, 0x05, 0xf0, 0x06, 0xfa, 0x19, 0x91, 0xfa, 0x45, 0xbf, 0x00, 0x6a, - 0xba, 0xfe, 0x9b, 0x01, 0xfc, 0xbf, 0xc1, 0x00, 0xb0, 0xb2, 0xfc, 0x8f, 0xcc, 0xfe, 0xbc, 0x89, - 0xfc, 0xa9, 0xa7, 0xfa, 0x43, 0xd3, 0xfe, 0x24, 0x52, 0xff, 0xc2, 0xae, 0xfe, 0x34, 0x8b, 0xff, - 0xe8, 0x15, 0x00, 0xea, 0x23, 0xfe, 0x01, 0xdd, 0x3c, 0x54, 0x5f, 0x33, 0xe4, 0x83, 0xf6, 0x9b, - 0x27, 0x06, 0xf6, 0x7e, 0xf9, 0xaf, 0x00, 0x02, 0xc9, 0x78, 0x0c, 0xef, 0x2d, 0xf4, 0x07, 0x87, - 0xeb, 0xdd, 0xb6, 0x06, 0x97, 0xa4, 0x10, 0x6f, 0x9c, 0xf5, 0x61, 0xab, 0xf2, 0x85, 0x0c, 0xf2, - 0xcc, 0xc0, 0xff, 0xcb, 0x46, 0x07, 0x3b, 0x2b, 0xfc, 0xe0, 0x85, 0xf9, 0xde, 0x03, 0x00, 0x50, - 0x9f, 0xfe, 0x82, 0xea, 0xfb, 0x1c, 0x5c, 0x00, 0x6e, 0xe5, 0xfb, 0xa7, 0x0b, 0xff, 0xc1, 0x03, - 0xfd, 0x06, 0xf8, 0xfa, 0xe3, 0x91, 0xfe, 0x58, 0x89, 0xff, 0x32, 0xd7, 0xfe, 0x02, 0xc4, 0xff, - 0x20, 0xc2, 0xff, 0x37, 0xc5, 0xfd, 0xa4, 0xf1, 0x3c, 0x5e, 0xa7, 0x34, 0xf4, 0x8c, 0xf8, 0xea, - 0x0c, 0x06, 0x56, 0x34, 0xf8, 0xb2, 0x86, 0x01, 0x48, 0xea, 0x0b, 0x75, 0x01, 0xf5, 0x31, 0x8c, - 0xe9, 0xa4, 0x05, 0x04, 0x36, 0x12, 0x12, 0x0a, 0xb3, 0xf9, 0x2c, 0x1b, 0xf3, 0x94, 0xb1, 0xee, - 0xd5, 0x33, 0xfe, 0xb7, 0x05, 0x08, 0x2f, 0x0f, 0xff, 0xaf, 0x07, 0xf9, 0xa8, 0xb4, 0xfe, 0x58, - 0x17, 0xff, 0x06, 0x3c, 0xfb, 0xcb, 0xcf, 0xff, 0x7f, 0xfa, 0xfb, 0xe2, 0x4d, 0xff, 0xf2, 0x21, - 0xfd, 0x17, 0x3a, 0xfb, 0x78, 0xe3, 0xfd, 0x52, 0x74, 0xff, 0x25, 0x17, 0xff, 0x5d, 0x40, 0xff, - 0x88, 0xbd, 0xff, 0x18, 0xba, 0xfd, 0x14, 0x63, 0x3b, 0xa4, 0x94, 0x35, 0xf9, 0x9f, 0xfc, 0x82, - 0x96, 0x07, 0x13, 0x46, 0xf7, 0xa6, 0xbb, 0x00, 0x98, 0xce, 0x0a, 0xf3, 0x10, 0xf5, 0xeb, 0x08, - 0xe8, 0xc1, 0xa4, 0x00, 0x83, 0xf3, 0x11, 0x8f, 0x19, 0xfe, 0x3a, 0x19, 0xf7, 0x75, 0xc1, 0xeb, - 0x77, 0x2d, 0xfb, 0x3f, 0xb3, 0x08, 0x3c, 0xc4, 0x01, 0x82, 0x28, 0xfa, 0x20, 0xe7, 0xfc, 0x7b, - 0x53, 0xff, 0x15, 0x68, 0xfb, 0x4d, 0x95, 0xff, 0x7f, 0x91, 0xfc, 0x9f, 0xdc, 0xff, 0x34, 0xec, - 0xfc, 0x73, 0xe1, 0xfa, 0xe7, 0xb0, 0xfd, 0x9d, 0xc2, 0xfe, 0x35, 0x45, 0xff, 0x3b, 0xc3, 0xfe, - 0x1a, 0xf5, 0xff, 0x6d, 0x44, 0xfe, 0xe6, 0x38, 0x39, 0xb5, 0x33, 0x35, 0xd8, 0xa0, 0x01, 0xd3, - 0xbc, 0x08, 0xb5, 0xb1, 0xf7, 0x32, 0xe7, 0xff, 0x74, 0xdd, 0x08, 0x1b, 0x89, 0xf6, 0xdc, 0xe3, - 0xe5, 0xda, 0x5e, 0xfd, 0xfd, 0x4e, 0x10, 0x6c, 0xbd, 0x00, 0xe1, 0xfd, 0xfc, 0x27, 0xe7, 0xea, - 0xaa, 0xe8, 0xf6, 0x4c, 0xb6, 0x08, 0x13, 0xec, 0x02, 0x1c, 0xf7, 0xfb, 0xd3, 0xd1, 0xfc, 0xd7, - 0xac, 0xfe, 0xb9, 0xb3, 0xfc, 0x97, 0x5c, 0xff, 0xf9, 0x2e, 0xfc, 0xb7, 0x68, 0x00, 0x0d, 0x1a, - 0xfd, 0x43, 0x3d, 0xfa, 0x8e, 0x7a, 0xfd, 0x7b, 0xe0, 0xfd, 0x57, 0x65, 0xff, 0x89, 0x5f, 0xff, - 0xc9, 0x31, 0x00, 0x19, 0x07, 0xff, 0x2c, 0xac, 0x36, 0x0b, 0x4e, 0x33, 0xc3, 0xbd, 0x05, 0x57, - 0xba, 0x09, 0x9e, 0x73, 0xf9, 0x98, 0xd2, 0xff, 0xdd, 0xf2, 0x05, 0xdb, 0x28, 0xf8, 0xba, 0x26, - 0xe5, 0x58, 0xec, 0xf9, 0x0c, 0x86, 0x0e, 0x33, 0x3e, 0x01, 0x35, 0xb9, 0x01, 0xaa, 0x1b, 0xed, - 0xee, 0x71, 0xf1, 0xfb, 0x0c, 0x07, 0xce, 0xa0, 0x03, 0x72, 0xc4, 0xfd, 0xd4, 0x49, 0xfe, 0x4a, - 0x1d, 0xfe, 0x93, 0x3c, 0xfd, 0x9f, 0x6c, 0xff, 0xc9, 0xce, 0xfb, 0x0b, 0x01, 0x00, 0xe9, 0xea, - 0xfc, 0x04, 0x90, 0xf9, 0x73, 0xb3, 0xfd, 0x53, 0xcc, 0xfd, 0x22, 0x9d, 0xff, 0xcb, 0x46, 0x00, - 0x95, 0x7a, 0x00, 0x83, 0x40, 0xff, 0xb4, 0x6c, 0x33, 0x60, 0x0d, 0x31, 0xe7, 0xbf, 0x07, 0x59, - 0x1c, 0x0d, 0xaa, 0x47, 0xfa, 0x62, 0xbc, 0xfe, 0x82, 0x63, 0x05, 0x88, 0x5d, 0xf8, 0x88, 0xa2, - 0xe6, 0xc1, 0x1d, 0xf6, 0x72, 0x49, 0x0d, 0x87, 0x6c, 0x01, 0x05, 0x3c, 0x03, 0x62, 0xa4, 0xf1, - 0x2b, 0x54, 0xec, 0x1d, 0xa4, 0x03, 0xd1, 0x47, 0x05, 0x0b, 0x3c, 0xff, 0x0a, 0x11, 0xff, 0x0b, - 0x3f, 0xfe, 0x56, 0xa7, 0xfd, 0xac, 0xc5, 0xff, 0xf1, 0x61, 0xfb, 0x3b, 0x00, 0xfe, 0xfe, 0xba, - 0xfd, 0xdd, 0xf3, 0xf9, 0x4d, 0x7a, 0xfd, 0xd9, 0x21, 0xfe, 0xae, 0xbb, 0xff, 0x8b, 0xf3, 0x00, - 0xac, 0x41, 0x00, 0xfb, 0x23, 0xff, 0x6a, 0x53, 0x31, 0x03, 0xf0, 0x2f, 0xd5, 0x52, 0x06, 0x9d, - 0x61, 0x0e, 0x9a, 0x61, 0xfd, 0x39, 0x4d, 0xfc, 0xfc, 0xdd, 0x04, 0x0c, 0xb3, 0xf9, 0x45, 0x39, - 0xea, 0xa3, 0x77, 0xf4, 0xec, 0xdd, 0x0b, 0xa7, 0xb3, 0x00, 0xc1, 0x14, 0x00, 0x40, 0x76, 0xf8, - 0x39, 0xd8, 0xeb, 0x5a, 0x5e, 0xfd, 0x8a, 0xc3, 0x05, 0x44, 0xa2, 0x00, 0xa3, 0x68, 0x00, 0xeb, - 0xee, 0xfe, 0xe0, 0x65, 0xfd, 0x15, 0x4c, 0xff, 0x49, 0x21, 0xfb, 0x14, 0x02, 0xfd, 0xff, 0xd7, - 0xfe, 0x6d, 0xde, 0xfa, 0xbe, 0x83, 0xfd, 0x47, 0x1a, 0xff, 0x5b, 0x16, 0xff, 0x51, 0xb1, 0x00, - 0xf2, 0x43, 0x00, 0xd1, 0x04, 0xff, 0x6f, 0xd0, 0x2e, 0x52, 0xb0, 0x2e, 0xc8, 0x95, 0x04, 0xca, - 0x8e, 0x0e, 0x21, 0x76, 0x00, 0xe8, 0x23, 0xfd, 0xd8, 0xf9, 0x01, 0xbb, 0xdf, 0xf8, 0x7d, 0x33, - 0xf1, 0xd1, 0xd7, 0xf3, 0x6e, 0xb5, 0x09, 0x0d, 0xf0, 0x01, 0xd4, 0x4b, 0xfb, 0x98, 0x25, 0xfd, - 0x3e, 0x01, 0xf0, 0xc4, 0x38, 0xf7, 0x02, 0x9f, 0x04, 0x64, 0x5c, 0x01, 0xce, 0xcc, 0xff, 0xe5, - 0xe9, 0x00, 0x5e, 0x2a, 0xfe, 0x2a, 0x37, 0xfd, 0xfb, 0x6a, 0xfb, 0x50, 0x36, 0xfd, 0x59, 0xf8, - 0xff, 0x70, 0xd4, 0xfc, 0x5d, 0x4d, 0xfc, 0x93, 0xfc, 0xfe, 0xbc, 0x5f, 0xff, 0xd1, 0x51, 0x00, - 0x4e, 0x3d, 0x00, 0x70, 0x2c, 0xff, 0x83, 0xef, 0x2b, 0xed, 0x16, 0x2b, 0x81, 0x67, 0x04, 0x76, - 0x0a, 0x10, 0x0d, 0x48, 0x02, 0x0f, 0xfe, 0xfc, 0xda, 0x7d, 0x01, 0xe8, 0x6e, 0xf9, 0xc3, 0x3e, - 0xf3, 0xf5, 0xfc, 0xf4, 0xab, 0x50, 0x08, 0xa8, 0x39, 0x03, 0xcf, 0xf5, 0xf9, 0x40, 0x02, 0xfe, - 0x75, 0x5d, 0xf5, 0x97, 0x51, 0xf4, 0xfc, 0xd0, 0x01, 0x4a, 0xbe, 0x01, 0x2d, 0xa1, 0xfe, 0x6a, - 0xbd, 0x00, 0x24, 0xec, 0xfe, 0x81, 0xc4, 0xfd, 0x4b, 0xd4, 0xfb, 0x39, 0x42, 0xfd, 0x55, 0x83, - 0x00, 0x54, 0x00, 0xfe, 0x7a, 0x7a, 0xfb, 0x03, 0xe5, 0xfe, 0x5d, 0xdf, 0xff, 0x62, 0xf4, 0xff, - 0x66, 0x7b, 0x00, 0x33, 0x32, 0xff, 0x59, 0x84, 0x27, 0x41, 0xee, 0x26, 0x4e, 0x82, 0x05, 0xad, - 0x6d, 0x11, 0x77, 0x02, 0x03, 0xff, 0x4f, 0xfc, 0x17, 0x92, 0x02, 0x1d, 0x4c, 0xfc, 0x85, 0x6a, - 0xf4, 0x63, 0xb9, 0xf3, 0x5b, 0xd7, 0x05, 0xe9, 0x2d, 0x05, 0xd7, 0x9f, 0xfa, 0xa9, 0xed, 0xfd, - 0x61, 0x99, 0xf9, 0xfc, 0x74, 0xf4, 0x4c, 0x39, 0x00, 0x7f, 0xc9, 0x01, 0x93, 0x2c, 0xfd, 0x86, - 0x42, 0xff, 0x38, 0x5a, 0xfe, 0x26, 0x54, 0xfe, 0x22, 0x16, 0xfe, 0x1c, 0x75, 0xfd, 0x6c, 0xb8, - 0xfe, 0xba, 0x7a, 0xfe, 0xbb, 0xb9, 0xfc, 0x1a, 0x87, 0xff, 0x57, 0xf5, 0xff, 0xe6, 0xa9, 0xff, - 0xf2, 0x7f, 0x00, 0x5d, 0xfa, 0xfe, 0xf6, 0xce, 0x26, 0xe7, 0xbc, 0x22, 0x54, 0x6e, 0x04, 0x5c, - 0x63, 0x16, 0xff, 0x90, 0x02, 0x3b, 0xa6, 0xf9, 0x2f, 0xc2, 0x04, 0xb3, 0x9a, 0xff, 0x59, 0xfa, - 0xf4, 0x2e, 0x53, 0xf1, 0x00, 0x79, 0x03, 0x35, 0x3d, 0x06, 0xf3, 0x00, 0xfc, 0x7c, 0x01, 0x00, - 0x34, 0xff, 0xfa, 0x6f, 0x32, 0xf2, 0xcb, 0xbd, 0x00, 0xe7, 0xb4, 0x02, 0x9d, 0xc1, 0xfb, 0xd6, - 0xc4, 0xfe, 0x5e, 0xf4, 0xfc, 0xc0, 0x23, 0xfd, 0x1b, 0xe2, 0xfe, 0x93, 0xb0, 0xfd, 0xf5, 0x15, - 0xff, 0x34, 0xf6, 0xfe, 0x5a, 0xbf, 0xfc, 0x85, 0xe2, 0x00, 0xfe, 0xe2, 0x00, 0xbd, 0x47, 0xff, - 0x05, 0xec, 0xff, 0x01, 0xe2, 0xfe, 0xd6, 0x36, 0x21, 0xb0, 0x44, 0x21, 0xac, 0xa2, 0x08, 0x84, - 0x57, 0x14, 0x78, 0xb8, 0x01, 0x40, 0xb7, 0xf9, 0xfc, 0xff, 0x03, 0xaf, 0xd5, 0xfd, 0x7b, 0x8e, - 0xf7, 0x9c, 0x26, 0xf5, 0xee, 0x47, 0xff, 0xdd, 0x68, 0x03, 0xfa, 0x11, 0xfe, 0xae, 0x3f, 0x01, - 0xdd, 0xc5, 0xfd, 0x57, 0xa8, 0xf4, 0xd1, 0xae, 0xfc, 0x1c, 0x4a, 0x02, 0x5f, 0xb7, 0xff, 0x6c, - 0x15, 0xff, 0xea, 0xc3, 0xfc, 0x27, 0xc5, 0xfd, 0x9f, 0x1d, 0xff, 0xb7, 0x9b, 0xfe, 0x8f, 0x33, - 0xff, 0x1a, 0xc9, 0xfe, 0x0d, 0x7f, 0xfd, 0x13, 0x8d, 0xff, 0x07, 0x3a, 0x00, 0xf0, 0x33, 0xff, - 0xec, 0xed, 0xff, 0x64, 0x5e, 0xff, 0x38, 0xa3, 0x1d, 0xbf, 0x69, 0x1e, 0x9e, 0x80, 0x08, 0x80, - 0xbe, 0x11, 0xf1, 0xc6, 0x02, 0xee, 0x28, 0xfd, 0xf1, 0x9b, 0x03, 0xc5, 0x38, 0xfd, 0xef, 0xb3, - 0xf8, 0x94, 0x9c, 0xf6, 0x88, 0xf6, 0xfe, 0x9b, 0xf9, 0x01, 0x09, 0x69, 0xfe, 0x72, 0xb4, 0x00, - 0xea, 0x0b, 0xff, 0xb7, 0xa6, 0xf7, 0x2e, 0x5e, 0xfc, 0xb7, 0xa6, 0x02, 0xb5, 0x3d, 0x00, 0x44, - 0x35, 0xfe, 0xf9, 0x60, 0xfd, 0x1c, 0xba, 0xfe, 0x5e, 0x20, 0xff, 0xf4, 0x3c, 0xfe, 0xf6, 0x2a, - 0xfe, 0xd5, 0x9e, 0xfe, 0xb9, 0x99, 0xfe, 0x33, 0x2d, 0xff, 0x55, 0x34, 0xff, 0x13, 0x42, 0xff, - 0xde, 0x54, 0x00, 0xe5, 0x9d, 0xff, 0x30, 0xdc, 0x1a, 0xcf, 0xc9, 0x1b, 0x69, 0xf0, 0x07, 0x3d, - 0x8a, 0x0e, 0xa1, 0xff, 0x03, 0x9e, 0x22, 0x00, 0x1d, 0xa2, 0x02, 0x02, 0xeb, 0xfc, 0xea, 0x28, - 0xf9, 0x69, 0x2a, 0xf8, 0x0e, 0x3b, 0xff, 0xc8, 0xf2, 0x00, 0xf9, 0xc1, 0xfe, 0xdc, 0x6d, 0x00, - 0x3f, 0xa8, 0xff, 0x76, 0x61, 0xf9, 0x10, 0x39, 0xfd, 0x39, 0xec, 0x02, 0xc8, 0x16, 0x00, 0x94, - 0x34, 0xfe, 0xf0, 0x19, 0xfe, 0xed, 0x1d, 0xff, 0xb1, 0xf1, 0xfe, 0xfc, 0xff, 0xfd, 0xe0, 0x8a, - 0xfd, 0x79, 0x53, 0xfe, 0x41, 0x9e, 0xfe, 0xe5, 0xda, 0xfe, 0x3a, 0x58, 0xff, 0xc8, 0x9e, 0xff, - 0x85, 0x4a, 0x00, 0xc1, 0xc3, 0xff, 0xa2, 0xd2, 0x17, 0x97, 0x7c, 0x19, 0xc2, 0xe2, 0x06, 0x4c, - 0x33, 0x0c, 0x44, 0xb9, 0x05, 0xd5, 0x38, 0x01, 0x21, 0xf6, 0x01, 0x60, 0x15, 0xfd, 0xf2, 0xa6, - 0xf9, 0x1d, 0x1a, 0xfa, 0x07, 0x72, 0xff, 0x2f, 0x30, 0x00, 0xba, 0x7f, 0xff, 0x5d, 0xe2, 0x00, - 0xdf, 0xb9, 0xff, 0x1e, 0xc5, 0xfa, 0x36, 0x81, 0xfe, 0xd1, 0xc0, 0x02, 0x94, 0xf9, 0xff, 0x6b, - 0x39, 0xfe, 0x51, 0x71, 0xfe, 0x0a, 0x96, 0xff, 0xf3, 0xd2, 0xfe, 0xd9, 0xee, 0xfd, 0x4c, 0x8e, - 0xfd, 0x46, 0x94, 0xfe, 0xb7, 0xae, 0xfe, 0xc5, 0xab, 0xfe, 0x49, 0xb0, 0xff, 0xa6, 0xfd, 0xff, - 0xf1, 0x45, 0x00, 0xaf, 0xac, 0xff, 0x70, 0x63, 0x15, 0x52, 0xc6, 0x16, 0xfd, 0x28, 0x06, 0x09, - 0x99, 0x0b, 0xfb, 0xda, 0x05, 0x98, 0x00, 0x01, 0x83, 0xbe, 0x01, 0x41, 0x62, 0xfd, 0x43, 0x71, - 0xfa, 0xc3, 0x9a, 0xfb, 0x61, 0x62, 0xff, 0xb4, 0x87, 0xff, 0xf2, 0x50, 0x00, 0x6d, 0x57, 0x01, - 0x0f, 0xb7, 0xff, 0x86, 0x1d, 0xfc, 0x85, 0x08, 0xff, 0x9f, 0xa5, 0x01, 0x39, 0xa3, 0xff, 0xf1, - 0x9a, 0xfe, 0xf7, 0xc4, 0xfe, 0x5d, 0x8b, 0xff, 0xfa, 0xcb, 0xfe, 0x8e, 0x6b, 0xfe, 0x21, 0x39, - 0xfe, 0xdf, 0xef, 0xfe, 0xc4, 0x7a, 0xfe, 0xe3, 0x71, 0xfe, 0x25, 0xa4, 0xff, 0x3f, 0x0b, 0x00, - 0x83, 0x3e, 0x00, 0xef, 0x87, 0xff, 0x8a, 0x66, 0x12, 0xf8, 0x65, 0x14, 0x29, 0x17, 0x06, 0xa9, - 0x5c, 0x0a, 0x8a, 0x43, 0x05, 0x44, 0x8f, 0x01, 0x4f, 0x10, 0x02, 0x46, 0x95, 0xfd, 0xb4, 0x25, - 0xfb, 0x93, 0xce, 0xfc, 0x17, 0xc0, 0xff, 0x04, 0x98, 0xff, 0x83, 0x4b, 0x01, 0x51, 0xac, 0x01, - 0xf8, 0xc1, 0xff, 0x24, 0x5c, 0xfd, 0x94, 0xf8, 0xfe, 0x5c, 0xc0, 0x00, 0x2a, 0xc8, 0xff, 0x34, - 0xed, 0xfe, 0x7a, 0xe6, 0xfe, 0xf2, 0xd2, 0xff, 0xeb, 0x6a, 0xff, 0xc6, 0x15, 0xff, 0x12, 0x86, - 0xfe, 0xce, 0xb7, 0xfe, 0xce, 0x5f, 0xfe, 0x3f, 0x9a, 0xfe, 0x2c, 0xba, 0xff, 0x3e, 0xe5, 0xff, - 0xc1, 0x14, 0x00, 0x28, 0xb2, 0xff, 0x29, 0x80, 0x0f, 0x5d, 0x77, 0x11, 0x59, 0x6f, 0x06, 0xaa, - 0x5d, 0x09, 0xce, 0xa2, 0x04, 0x93, 0x5d, 0x02, 0xd4, 0x4e, 0x02, 0x9f, 0x00, 0xfe, 0x9d, 0xf8, - 0xfb, 0x6f, 0x2c, 0xfe, 0xd8, 0xdb, 0x00, 0x6b, 0x22, 0x00, 0xf3, 0xed, 0x01, 0xcc, 0xe0, 0x01, - 0x83, 0x00, 0x00, 0x48, 0x6c, 0xfe, 0x6d, 0x2e, 0xff, 0xba, 0x1a, 0x00, 0xb5, 0xb6, 0xff, 0x3d, - 0x4f, 0xff, 0x5c, 0x7c, 0xff, 0x45, 0x49, 0x00, 0x0d, 0x7e, 0xff, 0x67, 0x4b, 0xff, 0x4d, 0xd0, - 0xfe, 0xb1, 0xc7, 0xfe, 0xae, 0xb6, 0xfe, 0x6f, 0xe1, 0xfe, 0x52, 0xa1, 0xff, 0xaa, 0xde, 0xff, - 0x86, 0x0e, 0x00, 0x2a, 0xce, 0xff, 0xee, 0x60, 0x0d, 0x04, 0xf9, 0x0e, 0x78, 0x02, 0x06, 0x95, - 0x28, 0x08, 0x02, 0xec, 0x03, 0x89, 0xa6, 0x02, 0x8a, 0xe7, 0x02, 0x47, 0xb4, 0xfe, 0x29, 0x53, - 0xfd, 0xb5, 0x24, 0x00, 0xe3, 0x5a, 0x02, 0x24, 0x0c, 0x01, 0x67, 0x16, 0x02, 0x73, 0x11, 0x02, - 0x71, 0x4b, 0x00, 0x97, 0xe6, 0xfe, 0xc6, 0x0b, 0xff, 0x6d, 0x97, 0xff, 0x43, 0x28, 0x00, 0x9c, - 0xea, 0xff, 0x8a, 0x77, 0xff, 0xc5, 0x28, 0x00, 0xf8, 0xbf, 0xff, 0xd9, 0xb4, 0xff, 0x0c, 0x1e, - 0xff, 0x88, 0xdc, 0xfe, 0xfd, 0xfc, 0xfe, 0x74, 0x1c, 0xff, 0x76, 0xb5, 0xff, 0xe1, 0x03, 0x00, - 0xf3, 0x0b, 0x00, 0xce, 0x9a, 0xff, 0x6b, 0x8c, 0x0c, 0xe2, 0x7a, 0x0d, 0xa9, 0xd0, 0x04, 0x3d, - 0xd5, 0x06, 0x3d, 0x84, 0x03, 0x54, 0x11, 0x03, 0x68, 0xe8, 0x03, 0x04, 0xaa, 0x00, 0xdc, 0xca, - 0xfe, 0x0e, 0x59, 0x01, 0x6e, 0x71, 0x03, 0x5c, 0x8e, 0x01, 0x31, 0xee, 0x01, 0x03, 0x31, 0x01, - 0xb9, 0xbe, 0xff, 0x99, 0x23, 0xff, 0x8c, 0x97, 0xff, 0x8d, 0xfc, 0xff, 0x50, 0x3a, 0x00, 0xe8, - 0xdc, 0xff, 0x7e, 0x76, 0xff, 0xcc, 0x2a, 0x00, 0xb6, 0xe4, 0xff, 0x66, 0xed, 0xff, 0x98, 0x48, - 0xff, 0x91, 0x12, 0xff, 0xa9, 0x61, 0xff, 0xc8, 0x99, 0xff, 0xfa, 0xe3, 0xff, 0x68, 0xe8, 0xff, - 0x13, 0xa0, 0xff, 0xe4, 0x01, 0xff, 0x1a, 0xb0, 0x0b, 0x81, 0x80, 0x0c, 0xe3, 0x31, 0x04, 0x9d, - 0x29, 0x07, 0x28, 0xa6, 0x04, 0x31, 0xdf, 0x03, 0x32, 0x86, 0x04, 0x70, 0x7f, 0x01, 0x6d, 0xf5, - 0xff, 0x97, 0xf5, 0x01, 0xf4, 0x37, 0x03, 0x33, 0xdd, 0x00, 0xb1, 0xc0, 0x00, 0x63, 0x44, 0x00, - 0x2f, 0x07, 0x00, 0x22, 0x06, 0x00, 0x8c, 0xf0, 0xff, 0xb7, 0xc3, 0xff, 0xbf, 0xaf, 0xff, 0xb2, - 0xad, 0xff, 0x23, 0x9d, 0xff, 0x1f, 0x48, 0x00, 0x73, 0x0b, 0x00, 0xdf, 0x54, 0x00, 0xd2, 0xd2, - 0xff, 0xa6, 0x41, 0xff, 0x6f, 0x5d, 0xff, 0x54, 0x76, 0xff, 0xad, 0x93, 0xff, 0x69, 0x6c, 0xff, - 0xdf, 0x42, 0xff, 0x55, 0x01, 0xff, 0x30, 0xd6, 0x0b, 0x60, 0xd2, 0x0d, 0x72, 0xc4, 0x05, 0xf0, - 0x08, 0x08, 0x20, 0x00, 0x05, 0xae, 0x3d, 0x04, 0x9e, 0x79, 0x04, 0xf2, 0x94, 0x00, 0x61, 0xc9, - 0xfe, 0x59, 0x19, 0x01, 0x68, 0xac, 0x02, 0xdf, 0x95, 0x00, 0x0e, 0x92, 0x00, 0xdc, 0x11, 0x00, - 0x97, 0x33, 0x00, 0xf3, 0x1b, 0x00, 0xf5, 0x87, 0xff, 0x43, 0x78, 0xff, 0x25, 0xca, 0xff, 0xf5, - 0xc6, 0xff, 0x4f, 0xb9, 0xff, 0x92, 0x90, 0x00, 0xbc, 0x22, 0x00, 0x0e, 0x69, 0x00, 0x24, 0x23, - 0x00, 0x46, 0x58, 0xff, 0x59, 0x19, 0xff, 0xf4, 0xf4, 0xfe, 0x50, 0xec, 0xfe, 0x34, 0x30, 0xff, - 0x78, 0x66, 0xff, 0xd8, 0x3e, 0xff, 0xdb, 0x8f, 0x0c, 0xa5, 0xac, 0x0e, 0x02, 0x45, 0x06, 0x6f, - 0xe7, 0x07, 0xbc, 0xa8, 0x04, 0xe6, 0x5e, 0x04, 0x38, 0xae, 0x04, 0x1e, 0x59, 0x00, 0xfe, 0xd9, - 0xfd, 0xe8, 0xa7, 0xff, 0xe5, 0xdd, 0x01, 0x79, 0xda, 0x00, 0xde, 0xd5, 0x00, 0x85, 0x06, 0x00, - 0x11, 0x36, 0x00, 0x4a, 0x54, 0x00, 0x9b, 0xf7, 0xff, 0x58, 0xc1, 0xff, 0xdf, 0xbc, 0xff, 0x52, - 0xa1, 0xff, 0x60, 0xbe, 0xff, 0x9a, 0x51, 0x00, 0xb3, 0xa8, 0xff, 0x0a, 0x49, 0x00, 0x71, 0x96, - 0x00, 0x95, 0xf8, 0xff, 0xd4, 0x23, 0xff, 0xa1, 0x90, 0xfe, 0x74, 0xa9, 0xfe, 0xec, 0x03, 0xff, - 0xf0, 0x58, 0xff, 0xe7, 0x5e, 0xff, 0x2f, 0xc4, 0x0c, 0x9f, 0xa7, 0x0e, 0xe7, 0x40, 0x05, 0x19, - 0xfa, 0x06, 0x74, 0x3d, 0x04, 0x97, 0x3b, 0x04, 0xf7, 0xc7, 0x04, 0x18, 0x58, 0x00, 0xcf, 0x8d, - 0xfd, 0x83, 0x35, 0x00, 0xc8, 0xdf, 0x02, 0x1e, 0x6f, 0x00, 0x02, 0xe6, 0xff, 0xc6, 0x62, 0xff, - 0x56, 0xbd, 0xff, 0x5b, 0xe6, 0x00, 0x55, 0x2e, 0x01, 0xcf, 0x78, 0x00, 0x87, 0x14, 0x00, 0x00, - 0xb7, 0xff, 0xfe, 0x66, 0xff, 0x74, 0xef, 0xff, 0xdb, 0x73, 0xff, 0xc8, 0xdd, 0xff, 0x9f, 0xe6, - 0xff, 0x21, 0x23, 0x00, 0xfd, 0x45, 0x00, 0x33, 0x72, 0xff, 0x1e, 0xd6, 0xfe, 0x32, 0xce, 0xfe, - 0x9f, 0x13, 0xff, 0x22, 0x1e, 0xff, 0xaf, 0xd7, 0x0d, 0x4a, 0xeb, 0x0f, 0x01, 0x0c, 0x05, 0x07, - 0x0a, 0x06, 0x9a, 0xce, 0x02, 0xe8, 0x3c, 0x03, 0x4e, 0x39, 0x04, 0x86, 0xd8, 0xff, 0x03, 0xbc, - 0xfc, 0x42, 0x75, 0xff, 0x0e, 0xae, 0x03, 0x74, 0xbe, 0x01, 0xf3, 0x6f, 0x00, 0x10, 0xcd, 0xfe, - 0x51, 0xde, 0xfe, 0x37, 0x65, 0x00, 0x69, 0x02, 0x01, 0x67, 0x16, 0x01, 0xa3, 0x10, 0x01, 0xf7, - 0x48, 0x00, 0xae, 0xaf, 0xff, 0xcf, 0x37, 0x00, 0xe5, 0x61, 0xff, 0x63, 0x7a, 0xff, 0xd1, 0x80, - 0xff, 0x4e, 0x57, 0xff, 0x68, 0xda, 0xff, 0x79, 0x47, 0x00, 0xd9, 0x38, 0x00, 0x6d, 0xd4, 0xff, - 0x3c, 0x38, 0xff, 0xd4, 0x9b, 0xfe, 0xbc, 0x78, 0x0f, 0x16, 0x06, 0x12, 0x4c, 0x56, 0x05, 0x38, - 0x2f, 0x06, 0x45, 0x69, 0x02, 0x93, 0x9f, 0x02, 0x6d, 0x57, 0x03, 0xe8, 0x30, 0xfe, 0x92, 0xa9, - 0xfa, 0x1e, 0xb4, 0xfd, 0x2d, 0xfe, 0x03, 0xf0, 0x54, 0x02, 0x66, 0x4f, 0x00, 0x9c, 0x14, 0xff, - 0x48, 0x4e, 0xff, 0x92, 0x6d, 0x00, 0xf6, 0xfc, 0x00, 0x17, 0xa5, 0x00, 0x8b, 0x87, 0x00, 0xf6, - 0xce, 0x00, 0x62, 0x39, 0x00, 0xf8, 0x7d, 0x00, 0xbf, 0xd6, 0xff, 0x84, 0xb0, 0xff, 0xa4, 0x7f, - 0xff, 0xdd, 0x1b, 0xff, 0xa2, 0x56, 0xff, 0x77, 0xe5, 0xff, 0xb8, 0x76, 0x00, 0xb0, 0xd9, 0x00, - 0xfb, 0x3d, 0x00, 0x87, 0x0d, 0xff, 0x5c, 0xbd, 0x11, 0x3a, 0x68, 0x14, 0x5f, 0x70, 0x05, 0xfb, - 0xc1, 0x06, 0x39, 0x5b, 0x02, 0x71, 0x64, 0x02, 0xf7, 0xff, 0x02, 0x50, 0xd1, 0xfc, 0xb4, 0x8e, - 0xf8, 0xaf, 0xfd, 0xfb, 0xde, 0x4a, 0x04, 0x50, 0x1f, 0x02, 0x64, 0x2a, 0xff, 0xf2, 0x56, 0xfe, - 0xc4, 0x0e, 0xff, 0x2f, 0xef, 0x00, 0x03, 0xa0, 0x01, 0x51, 0xbd, 0x00, 0xfc, 0xcc, 0x00, 0x5d, - 0xb9, 0x00, 0x55, 0xd2, 0xff, 0xa8, 0xb5, 0x00, 0x0f, 0xc5, 0xff, 0x2e, 0xd8, 0xff, 0x75, 0xe2, - 0xff, 0x30, 0x4e, 0xff, 0xec, 0x6b, 0xff, 0x99, 0x2c, 0x00, 0xcd, 0x48, 0x00, 0xff, 0x1f, 0x00, - 0xf9, 0x75, 0x00, 0x4b, 0x09, 0x00, 0x58, 0xc6, 0x14, 0x2e, 0x9e, 0x16, 0x60, 0xf9, 0x04, 0x87, - 0xaf, 0x07, 0x99, 0x45, 0x02, 0x31, 0x92, 0x02, 0xe9, 0x24, 0x03, 0x1c, 0x9a, 0xfb, 0x6d, 0x6d, - 0xf6, 0xc2, 0xe0, 0xfa, 0x33, 0x5e, 0x05, 0xe9, 0xd3, 0x01, 0x07, 0xb1, 0xfd, 0xe5, 0x29, 0xfd, - 0x01, 0x43, 0xfe, 0xb4, 0x75, 0x00, 0x58, 0x8b, 0x01, 0xcc, 0xa2, 0x00, 0x46, 0x0f, 0x01, 0xa9, - 0x63, 0x01, 0x53, 0xc7, 0xff, 0x82, 0x6d, 0x00, 0x8d, 0xbb, 0xff, 0xc9, 0xc7, 0xff, 0xc0, 0xe5, - 0xff, 0x72, 0x75, 0xff, 0xc2, 0xcc, 0xff, 0xab, 0x6d, 0x00, 0x2a, 0x09, 0x00, 0x26, 0x0d, 0x00, - 0xb0, 0x12, 0x00, 0xd9, 0xc7, 0xff, 0xd6, 0x27, 0x19, 0x26, 0x4c, 0x19, 0xff, 0x73, 0x03, 0x45, - 0xb4, 0x08, 0xb6, 0xf9, 0x01, 0x60, 0x9b, 0x02, 0x2e, 0x1e, 0x03, 0xb0, 0xdc, 0xf9, 0xef, 0x82, - 0xf4, 0x1a, 0x8b, 0xfa, 0x7c, 0xce, 0x06, 0x49, 0x1d, 0x01, 0x2f, 0x53, 0xfc, 0x9d, 0x31, 0xfc, - 0xc5, 0xa3, 0xfd, 0xae, 0xed, 0xff, 0x76, 0xf5, 0x00, 0xcd, 0xfd, 0xff, 0x87, 0xca, 0x00, 0x03, - 0x1a, 0x01, 0x8f, 0x48, 0xff, 0xf3, 0xaa, 0x00, 0x92, 0xe3, 0xff, 0x42, 0xc6, 0xff, 0xe9, 0xa5, - 0xff, 0x92, 0x46, 0xff, 0x41, 0x8f, 0xff, 0xe1, 0x6f, 0x00, 0xdb, 0x2a, 0x00, 0x38, 0x1b, 0x00, - 0x7f, 0x44, 0x00, 0x68, 0xa0, 0xff, 0x8b, 0xa2, 0x1d, 0x5c, 0x81, 0x1c, 0x4f, 0x7c, 0x01, 0x69, - 0x97, 0x09, 0x91, 0xf4, 0x01, 0x75, 0x1e, 0x02, 0x80, 0x18, 0x03, 0xac, 0xcf, 0xf7, 0x49, 0x06, - 0xf3, 0xc1, 0xf8, 0xfa, 0xfe, 0xfe, 0x07, 0x68, 0x81, 0x00, 0x17, 0x51, 0xfb, 0x9f, 0x36, 0xfb, - 0xed, 0x68, 0xfd, 0xd6, 0xcf, 0xff, 0x79, 0x57, 0x00, 0xc8, 0xb9, 0xff, 0xa4, 0x5e, 0x00, 0x23, - 0xaf, 0x00, 0x2f, 0xc0, 0xfe, 0x79, 0x87, 0x00, 0x44, 0xbd, 0xff, 0xa9, 0xaa, 0xff, 0x7e, 0x49, - 0xff, 0x6b, 0xd9, 0xfe, 0x92, 0x58, 0xff, 0xd1, 0x37, 0x00, 0x49, 0x44, 0x00, 0xb0, 0x61, 0x00, - 0x90, 0xc5, 0x00, 0x5e, 0x09, 0x00, 0x22, 0x6b, 0x21, 0x14, 0x1b, 0x20, 0x8f, 0x12, 0x00, 0x47, - 0xcf, 0x09, 0xa0, 0x29, 0x02, 0x9e, 0xae, 0x01, 0xbc, 0x26, 0x03, 0x0f, 0xeb, 0xf5, 0x87, 0xb5, - 0xf1, 0x8a, 0x72, 0xfb, 0x13, 0x7b, 0x08, 0xf9, 0x17, 0x00, 0x9f, 0xe8, 0xfa, 0x53, 0x7c, 0xfa, - 0x2d, 0x2e, 0xfd, 0xa5, 0xb6, 0xff, 0x34, 0x13, 0x00, 0x3e, 0x90, 0xff, 0x49, 0x2d, 0x00, 0x7a, - 0xca, 0x00, 0x39, 0x7a, 0xfe, 0x57, 0xf9, 0xff, 0x36, 0x0e, 0xff, 0xd3, 0x84, 0xff, 0x0f, 0xe1, - 0xfe, 0x87, 0x80, 0xfe, 0x4c, 0x5c, 0xff, 0x10, 0x27, 0x00, 0xd2, 0x4e, 0x00, 0x85, 0x72, 0x00, - 0xfd, 0xef, 0x00, 0x92, 0xe4, 0xff, 0x4d, 0x05, 0x24, 0x7f, 0x0b, 0x24, 0x18, 0x6d, 0x00, 0x36, - 0x8b, 0x09, 0x09, 0x9b, 0x01, 0x1d, 0xe0, 0x00, 0x6d, 0x93, 0x03, 0xa8, 0x5f, 0xf4, 0xd7, 0x19, - 0xf1, 0x00, 0x4f, 0xfb, 0x58, 0xba, 0x06, 0x07, 0x19, 0x00, 0x92, 0xdf, 0xfb, 0x14, 0xa5, 0xf9, - 0xb8, 0x5d, 0xfc, 0x22, 0x43, 0xff, 0x63, 0x2d, 0x00, 0xe1, 0xde, 0x00, 0xf6, 0xa4, 0xff, 0xe9, - 0x11, 0x00, 0xd8, 0x68, 0xfe, 0xad, 0xa7, 0xff, 0x9d, 0x6f, 0xfe, 0x61, 0xec, 0xfe, 0xbc, 0x73, - 0xfe, 0xf4, 0x48, 0xfe, 0x9f, 0x53, 0xff, 0x45, 0x0f, 0x00, 0x62, 0x8a, 0x00, 0x71, 0x2b, 0x00, - 0x1f, 0xaf, 0x00, 0x99, 0x9f, 0xff, 0xca, 0xd1, 0x24, 0x78, 0x1d, 0x27, 0xc1, 0x6a, 0x02, 0x42, - 0xf2, 0x09, 0x57, 0xa3, 0x01, 0x61, 0xf6, 0xfe, 0xfc, 0xb3, 0x03, 0x77, 0x7d, 0xf4, 0x23, 0x94, - 0xf1, 0xbd, 0x57, 0xfb, 0x91, 0x5c, 0x03, 0x69, 0x57, 0xff, 0x92, 0x90, 0xfd, 0xec, 0x7e, 0xfa, - 0x00, 0xdf, 0xfb, 0x52, 0xa4, 0xfe, 0x20, 0xbf, 0xff, 0xdd, 0xc1, 0x01, 0xda, 0xfe, 0xff, 0xe2, - 0x5a, 0xff, 0x17, 0x39, 0xfe, 0x00, 0x72, 0xff, 0x17, 0xac, 0xfe, 0x5d, 0xf0, 0xfe, 0xb7, 0x3d, - 0xfe, 0x65, 0x45, 0xfe, 0x5c, 0x0c, 0xff, 0xc4, 0x3b, 0xff, 0xc1, 0x64, 0x00, 0x61, 0x51, 0x00, - 0x1a, 0xb6, 0x00, 0x60, 0x91, 0xff, 0x06, 0x83, 0x25, 0x03, 0x03, 0x29, 0xae, 0xca, 0x04, 0x4a, - 0x7c, 0x0b, 0x0b, 0x56, 0x02, 0x62, 0x06, 0xfd, 0xcf, 0x2e, 0x02, 0x9e, 0x54, 0xf4, 0x07, 0x82, - 0xf2, 0x66, 0xde, 0xfc, 0x15, 0xa2, 0xff, 0x14, 0xcd, 0xfc, 0x28, 0x24, 0xff, 0x5f, 0x69, 0xfc, - 0x0c, 0xfc, 0xfc, 0x54, 0x86, 0xfd, 0x59, 0x45, 0xfe, 0x48, 0x2f, 0x02, 0xf8, 0x69, 0x00, 0x81, - 0x09, 0xff, 0x5f, 0x9f, 0xfe, 0x1c, 0x67, 0xff, 0x74, 0x8e, 0xfe, 0x57, 0x0e, 0xff, 0xe5, 0xf6, - 0xfd, 0x1c, 0x17, 0xfe, 0x26, 0xd4, 0xfe, 0x74, 0x6f, 0xfe, 0xb6, 0xf4, 0xff, 0xd6, 0x31, 0x00, - 0xc7, 0x91, 0x00, 0xc3, 0x8b, 0xff, 0x0f, 0xb6, 0x26, 0x0d, 0xca, 0x29, 0x83, 0xd6, 0x05, 0x92, - 0xd3, 0x0d, 0x1e, 0xa3, 0x03, 0x36, 0xfb, 0xfb, 0x38, 0x37, 0x00, 0x37, 0x01, 0xf3, 0xbb, 0xac, - 0xf3, 0xc1, 0x72, 0xff, 0xff, 0x9c, 0xfc, 0x55, 0xc3, 0xf9, 0x11, 0x06, 0x00, 0x78, 0x41, 0xfe, - 0x4d, 0xd1, 0xfe, 0xec, 0xfb, 0xfc, 0x87, 0x55, 0xfc, 0x08, 0xe1, 0x01, 0xfb, 0x39, 0x01, 0x79, - 0x0d, 0xff, 0x5c, 0x0c, 0xff, 0x82, 0xb2, 0xff, 0x48, 0x71, 0xfe, 0x6c, 0xb9, 0xfe, 0xa3, 0x63, - 0xfd, 0x59, 0xc6, 0xfd, 0xc0, 0xb2, 0xfe, 0xb4, 0xdd, 0xfd, 0xb0, 0x62, 0xff, 0x4f, 0x18, 0x00, - 0x4d, 0xa1, 0x00, 0x3c, 0xa1, 0xff, 0x83, 0xce, 0x29, 0x63, 0x5a, 0x29, 0xf1, 0x88, 0x04, 0x22, - 0xfb, 0x10, 0x9e, 0x92, 0x04, 0xca, 0x58, 0xfb, 0xe0, 0x33, 0xfe, 0xb5, 0xa1, 0xf1, 0x8c, 0x0a, - 0xf5, 0xa3, 0xf8, 0x02, 0x28, 0x2a, 0xfa, 0x20, 0x05, 0xf5, 0xa7, 0x7c, 0x00, 0x6f, 0x62, 0xff, - 0x82, 0x71, 0x01, 0x6f, 0x7c, 0xfd, 0x33, 0x6d, 0xfa, 0x7a, 0xb3, 0x01, 0xe9, 0xe0, 0x01, 0x72, - 0x64, 0xfe, 0x28, 0x25, 0xff, 0xc2, 0x1e, 0x00, 0xdb, 0xf6, 0xfd, 0x6f, 0xa7, 0xfe, 0x10, 0x61, - 0xfc, 0xc4, 0x36, 0xfd, 0x30, 0xc3, 0xfe, 0xdf, 0x7d, 0xfd, 0x4e, 0xe0, 0xfe, 0x13, 0xfe, 0xff, - 0xc6, 0x3d, 0x00, 0xd0, 0x07, 0xff, 0xa9, 0x59, 0x2e, 0xd5, 0xee, 0x28, 0x85, 0x45, 0x01, 0xe9, - 0x8b, 0x13, 0x7a, 0x48, 0x04, 0x28, 0x57, 0xfb, 0x98, 0x5a, 0xfe, 0x63, 0x78, 0xef, 0x52, 0x9d, - 0xf6, 0xc7, 0xcd, 0x07, 0xa0, 0x27, 0xf9, 0xba, 0x4b, 0xef, 0xa2, 0xa3, 0xff, 0x3c, 0x99, 0x00, - 0x3e, 0x80, 0x03, 0x75, 0x40, 0xff, 0xe1, 0x57, 0xf9, 0x37, 0xe3, 0x00, 0x25, 0x6e, 0x02, 0x2b, - 0xe8, 0xfd, 0x52, 0xd1, 0xfe, 0x56, 0x5e, 0x00, 0x0e, 0x18, 0xfd, 0x26, 0x7c, 0xfe, 0x3d, 0x02, - 0xfc, 0x56, 0xce, 0xfc, 0x6a, 0xfe, 0xfe, 0xb7, 0x55, 0xfd, 0x01, 0x53, 0xfe, 0x80, 0xf3, 0xff, - 0x52, 0x25, 0x00, 0x80, 0xb3, 0xfe, 0x8d, 0x22, 0x34, 0xa8, 0x13, 0x2b, 0x23, 0xab, 0xfb, 0x0b, - 0xbe, 0x12, 0x49, 0xc2, 0x03, 0x50, 0xc0, 0xfb, 0x91, 0x83, 0x00, 0x16, 0x19, 0xee, 0xba, 0x59, - 0xf6, 0xfe, 0xce, 0x0b, 0x79, 0xfa, 0xfa, 0xab, 0x3f, 0xeb, 0xf6, 0x31, 0xfd, 0xc8, 0xcf, 0x00, - 0xa9, 0xef, 0x04, 0xa1, 0x26, 0x01, 0xf8, 0x9f, 0xf8, 0xb0, 0xc8, 0xff, 0xd9, 0xfc, 0x02, 0x1e, - 0x7f, 0xfd, 0x76, 0xd1, 0xfd, 0x12, 0xe4, 0x00, 0x9e, 0xce, 0xfc, 0x55, 0x28, 0xfe, 0x53, 0x65, - 0xfb, 0x61, 0x19, 0xfc, 0x75, 0x51, 0xff, 0xa6, 0x8d, 0xfd, 0xdf, 0xd4, 0xfd, 0xfc, 0xbf, 0xff, - 0x26, 0x4c, 0x00, 0x0b, 0x6e, 0xfe, 0x64, 0x7b, 0x3a, 0x0d, 0xc9, 0x2f, 0x7a, 0x2a, 0xf4, 0x72, - 0xd8, 0x0e, 0x82, 0x61, 0x02, 0xfd, 0x9a, 0xfc, 0xe4, 0x4c, 0x06, 0x62, 0x58, 0xed, 0x93, 0xf9, - 0xf2, 0xcc, 0x61, 0x0e, 0x6b, 0x9e, 0xff, 0x4b, 0xaa, 0xe9, 0xa7, 0xea, 0xf9, 0x1c, 0x22, 0x00, - 0x09, 0x72, 0x05, 0x8d, 0x8e, 0x02, 0xa0, 0xc6, 0xf7, 0xa1, 0x2c, 0xfe, 0x68, 0x68, 0x03, 0xdb, - 0x1e, 0xfe, 0x8f, 0xf1, 0xfc, 0x4c, 0xdf, 0x00, 0x9b, 0xa6, 0xfc, 0x88, 0x49, 0xfe, 0x30, 0x52, - 0xfb, 0xb1, 0x16, 0xfb, 0x84, 0x87, 0xff, 0x34, 0xde, 0xfd, 0x77, 0x7d, 0xfd, 0x40, 0x71, 0xff, - 0x8a, 0xcf, 0x00, 0xa3, 0xbf, 0xfe, 0x1a, 0x63, 0x42, 0xe3, 0x50, 0x31, 0x00, 0xf8, 0xec, 0x88, - 0x60, 0x0d, 0xe7, 0x1c, 0xff, 0x98, 0xa9, 0xfe, 0xb3, 0x66, 0x0a, 0x6b, 0xd6, 0xeb, 0x53, 0xac, - 0xf1, 0xf4, 0x0b, 0x11, 0x13, 0x90, 0x04, 0x93, 0x57, 0xe8, 0xe7, 0x24, 0xf6, 0x87, 0xd6, 0xfd, - 0x83, 0xb8, 0x06, 0xdb, 0xa2, 0x03, 0xe8, 0xa6, 0xf5, 0xf8, 0x6f, 0xfc, 0x54, 0x48, 0x04, 0x90, - 0x68, 0xfe, 0x76, 0x81, 0xfb, 0xf9, 0x4b, 0x01, 0xa5, 0xb7, 0xfc, 0x7e, 0xaa, 0xfe, 0x14, 0x58, - 0xfb, 0x5e, 0x4a, 0xfa, 0x78, 0x38, 0xff, 0x6c, 0xf7, 0xfd, 0x93, 0xc8, 0xfd, 0x9f, 0xdb, 0xff, - 0xb7, 0xc5, 0x00, 0x7f, 0x2f, 0xfe, 0xd9, 0x41, 0x47, 0xd3, 0x7d, 0x32, 0x2c, 0x41, 0xe9, 0x95, - 0x2d, 0x0c, 0xfc, 0xa7, 0xfb, 0x64, 0xb0, 0x00, 0x7e, 0x31, 0x0d, 0x20, 0x85, 0xeb, 0x39, 0xbe, - 0xef, 0xae, 0xcf, 0x11, 0x92, 0xd3, 0x09, 0x0c, 0xc2, 0xe7, 0x92, 0x87, 0xf3, 0xf3, 0xe7, 0xfa, - 0x61, 0xdd, 0x05, 0xbb, 0xd4, 0x04, 0x56, 0x8f, 0xf5, 0x98, 0x01, 0xfb, 0x79, 0x82, 0x03, 0x70, - 0x5a, 0xfe, 0x84, 0xe5, 0xfa, 0x3c, 0xb1, 0x01, 0xd9, 0x68, 0xfc, 0x02, 0x2d, 0xff, 0xa2, 0x6b, - 0xfb, 0xfc, 0x67, 0xf9, 0x00, 0x44, 0xff, 0x54, 0xcc, 0xfe, 0xaf, 0x1a, 0xfe, 0x1a, 0xa7, 0xff, - 0x4e, 0x6d, 0x00, 0x2b, 0xe6, 0xfd, 0xdb, 0x39, 0x4b, 0xf4, 0x56, 0x34, 0x13, 0x16, 0xe7, 0xc3, - 0x09, 0x0a, 0x12, 0x51, 0xf8, 0x92, 0x0a, 0x03, 0xb5, 0xe3, 0x0f, 0x06, 0xd1, 0xeb, 0x53, 0xb3, - 0xec, 0x21, 0x1c, 0x11, 0xe2, 0x38, 0x0f, 0xba, 0x5e, 0xe9, 0x19, 0x77, 0xf1, 0x51, 0xe2, 0xf5, - 0xff, 0xd7, 0x04, 0xe0, 0x9d, 0x07, 0xe1, 0xf3, 0xf5, 0x7a, 0x85, 0xf9, 0x25, 0x6b, 0x02, 0x08, - 0x27, 0xfe, 0x31, 0xe2, 0xfa, 0x75, 0xec, 0x01, 0xbd, 0xd2, 0xfb, 0xa2, 0x33, 0xff, 0xc6, 0x71, - 0xfb, 0xc9, 0x71, 0xf9, 0x20, 0xae, 0xff, 0xba, 0x62, 0xff, 0x54, 0x3f, 0xfe, 0xd2, 0x97, 0xff, - 0xc9, 0x32, 0x00, 0x83, 0x97, 0xfd, 0x9d, 0xd5, 0x4d, 0x12, 0xe9, 0x35, 0x88, 0x9e, 0xe7, 0x79, - 0xe0, 0x07, 0xd9, 0xff, 0xf5, 0xd2, 0x3a, 0x04, 0xee, 0xcb, 0x10, 0x74, 0xa2, 0xed, 0xf6, 0x32, - 0xe9, 0xec, 0x62, 0x0f, 0x6d, 0x07, 0x14, 0xac, 0x48, 0xec, 0xaa, 0x7f, 0xef, 0x3c, 0x30, 0xf1, - 0xa3, 0xca, 0x03, 0x96, 0x47, 0x0a, 0x21, 0xa3, 0xf7, 0xec, 0xdd, 0xf7, 0x19, 0xb0, 0x01, 0xed, - 0xfc, 0xfd, 0xda, 0xf6, 0xfa, 0x83, 0xb5, 0x01, 0xa5, 0xb6, 0xfa, 0x24, 0x64, 0xff, 0x13, 0x28, - 0xfc, 0xdb, 0xa2, 0xf9, 0x08, 0x91, 0xff, 0x63, 0xd3, 0xff, 0xff, 0x4b, 0xfe, 0x38, 0xee, 0xff, - 0xcb, 0xd2, 0xff, 0x7d, 0x1d, 0xfd, 0xd2, 0x10, 0x4f, 0xed, 0x4e, 0x37, 0x5b, 0x5b, 0xe9, 0x98, - 0xe2, 0x06, 0xb8, 0x50, 0xf4, 0x99, 0x1b, 0x04, 0x74, 0xa8, 0x10, 0xa3, 0x32, 0xef, 0x9e, 0x2f, - 0xe6, 0x7e, 0x33, 0x0d, 0xfb, 0xdb, 0x16, 0x92, 0x77, 0xf0, 0xb2, 0x7b, 0xee, 0x0f, 0x19, 0xed, - 0xe1, 0xda, 0x02, 0x4d, 0xa4, 0x0b, 0x07, 0xa9, 0xfa, 0x14, 0x8a, 0xf6, 0x51, 0xa8, 0x00, 0xa3, - 0x63, 0xfe, 0xde, 0x72, 0xfa, 0xb7, 0xf8, 0x00, 0xb6, 0x66, 0xfa, 0x18, 0xe0, 0xff, 0x2b, 0x3f, - 0xfc, 0x42, 0x35, 0xfa, 0x96, 0xd8, 0xfe, 0x3e, 0xce, 0xff, 0x8c, 0xc4, 0xfe, 0x10, 0xbc, 0xff, - 0xe4, 0x72, 0xff, 0x1b, 0xf1, 0xfc, 0x57, 0x2f, 0x4e, 0xfb, 0x2a, 0x39, 0x9d, 0x64, 0xec, 0xd2, - 0x0e, 0x07, 0x35, 0xc0, 0xf2, 0xfb, 0x7e, 0x03, 0x6c, 0xd9, 0x0f, 0x8c, 0xdb, 0xef, 0x53, 0x09, - 0xe4, 0xf8, 0x89, 0x09, 0x4f, 0x91, 0x18, 0xfd, 0xb7, 0xf5, 0xa9, 0xbc, 0xef, 0xfe, 0xb4, 0xe8, - 0x02, 0xcc, 0x00, 0x0c, 0xe6, 0x0c, 0x56, 0x42, 0xfe, 0x0c, 0x0f, 0xf6, 0xb9, 0xa6, 0xfe, 0xa7, - 0x50, 0xff, 0x80, 0x90, 0xf9, 0xfa, 0x9c, 0x00, 0xd6, 0xe3, 0xfa, 0x07, 0x39, 0x00, 0xaa, 0x4a, - 0xfc, 0xeb, 0x1d, 0xfa, 0x04, 0x32, 0xfe, 0x26, 0xa3, 0xff, 0x1f, 0xfa, 0xfe, 0x72, 0xe0, 0xfe, - 0x03, 0xcd, 0xff, 0x79, 0x03, 0xfd, 0x38, 0x63, 0x4c, 0x8f, 0x2f, 0x3a, 0x1d, 0x4b, 0xf1, 0x75, - 0x52, 0x08, 0x75, 0x79, 0xf1, 0xc4, 0xc5, 0x02, 0x75, 0x7c, 0x0e, 0xf9, 0x22, 0xf0, 0x82, 0x28, - 0xe2, 0x01, 0xd0, 0x05, 0x06, 0xb5, 0x18, 0x81, 0xe7, 0xfa, 0x61, 0x08, 0xf4, 0x71, 0xbc, 0xe4, - 0xb5, 0x96, 0xfd, 0x8c, 0x0e, 0x0e, 0xd9, 0x48, 0x01, 0x5c, 0x14, 0xf7, 0x4f, 0x67, 0xfc, 0x6e, - 0xc7, 0xff, 0x05, 0xdb, 0xf9, 0xa4, 0x47, 0x00, 0x95, 0xa1, 0xfb, 0xd3, 0xbf, 0x00, 0xfa, 0xf6, - 0xfb, 0x41, 0xc9, 0xf9, 0x22, 0xef, 0xfd, 0xe3, 0xd6, 0xfe, 0x68, 0x4b, 0xff, 0x94, 0x4c, 0xfe, - 0x86, 0x1a, 0x00, 0xf6, 0xb5, 0xfd, 0x17, 0xe6, 0x49, 0xa4, 0xfe, 0x39, 0x3e, 0x7f, 0xf7, 0x2b, - 0x1e, 0x09, 0x74, 0x8b, 0xf1, 0xae, 0xb9, 0x01, 0x0c, 0x5b, 0x0c, 0x3a, 0x16, 0xf2, 0x9e, 0x50, - 0xdf, 0xf4, 0x2f, 0x02, 0xa2, 0x3d, 0x17, 0xb4, 0x97, 0xfe, 0x8e, 0xb7, 0xfa, 0xc9, 0x88, 0xe2, - 0x1a, 0xc6, 0xf8, 0xae, 0xca, 0x0e, 0xab, 0xc5, 0x02, 0x53, 0x0e, 0xf9, 0xdd, 0xd2, 0xfb, 0x34, - 0x13, 0xff, 0xef, 0x8e, 0xfb, 0x1e, 0xc4, 0xff, 0x9a, 0x45, 0xfb, 0x9a, 0x81, 0x01, 0xfb, 0x19, - 0xfc, 0xf1, 0x06, 0xf9, 0x49, 0xb2, 0xfd, 0xb4, 0xcc, 0xfd, 0x10, 0x8f, 0xff, 0xaf, 0xee, 0xfe, - 0x44, 0x4f, 0x00, 0xc4, 0xa1, 0xfe, 0x4a, 0xba, 0x46, 0xfe, 0xa5, 0x39, 0x1a, 0x56, 0xfc, 0x6c, - 0xa2, 0x08, 0x63, 0x24, 0xf4, 0xab, 0x22, 0x01, 0xb8, 0xfc, 0x08, 0x47, 0x6f, 0xf4, 0x52, 0x49, - 0xdd, 0x50, 0xd1, 0xfe, 0xa9, 0x7b, 0x15, 0x1f, 0xc4, 0xff, 0x48, 0xec, 0x00, 0xde, 0x51, 0xe3, - 0x5d, 0x84, 0xf2, 0x44, 0x52, 0x0e, 0x66, 0x9a, 0x03, 0xa1, 0x18, 0xfb, 0x09, 0xf7, 0xfc, 0xe3, - 0x01, 0xfe, 0x50, 0x66, 0xfc, 0x01, 0xcf, 0xff, 0x61, 0xd6, 0xfa, 0x4d, 0x62, 0x01, 0x28, 0xec, - 0xfb, 0x4b, 0x4e, 0xf8, 0xba, 0x00, 0xfe, 0xfc, 0x09, 0xfd, 0x65, 0x0d, 0x00, 0x97, 0xe6, 0xff, - 0x41, 0x56, 0x00, 0x39, 0x51, 0xff, 0xc9, 0x65, 0x43, 0xf9, 0x0a, 0x36, 0x1d, 0xd2, 0x01, 0x2f, - 0x9c, 0x0b, 0xa2, 0x7b, 0xf4, 0xa1, 0x8c, 0x00, 0x23, 0x6c, 0x06, 0x61, 0x59, 0xf6, 0x92, 0xa8, - 0xdd, 0x8c, 0x87, 0xf9, 0x3c, 0x21, 0x14, 0xc1, 0xb8, 0x00, 0x18, 0x5c, 0x05, 0x41, 0xce, 0xe6, - 0x1b, 0xd4, 0xea, 0xf1, 0x1d, 0x0c, 0x74, 0x7e, 0x05, 0x63, 0x13, 0xfd, 0xc0, 0x58, 0xfe, 0xe9, - 0x9e, 0xfd, 0xb6, 0x39, 0xfd, 0xb1, 0xb9, 0xff, 0x6c, 0x35, 0xfa, 0x8e, 0x46, 0x00, 0x2b, 0x49, - 0xfc, 0x2e, 0xb1, 0xf7, 0xf9, 0x28, 0xfe, 0xde, 0x91, 0xfd, 0x9a, 0x0e, 0x00, 0x33, 0x14, 0x01, - 0x42, 0x92, 0x00, 0xb4, 0xfd, 0xfe, 0xfe, 0x88, 0x3f, 0x2c, 0xbd, 0x34, 0xa9, 0xb8, 0x02, 0x0c, - 0xff, 0x0e, 0xbe, 0x04, 0xf6, 0x00, 0x8e, 0xfe, 0xa8, 0xd1, 0x06, 0x3f, 0x30, 0xf6, 0xa7, 0x08, - 0xe0, 0x8a, 0x7b, 0xf5, 0x25, 0xac, 0x13, 0x56, 0x68, 0x00, 0xa4, 0x19, 0x05, 0x9d, 0xb1, 0xed, - 0x11, 0xf3, 0xe4, 0x99, 0xb3, 0x07, 0x02, 0x05, 0x08, 0xb7, 0x94, 0xfe, 0x7a, 0x25, 0xff, 0x09, - 0x97, 0xfd, 0xd3, 0x70, 0xfd, 0x52, 0x66, 0x00, 0x47, 0xad, 0xf9, 0xf2, 0x86, 0xfd, 0x78, 0x10, - 0xfe, 0x5c, 0x54, 0xf8, 0xad, 0xbe, 0xfd, 0x73, 0x5c, 0xfe, 0xde, 0xe0, 0xff, 0x54, 0x6f, 0x01, - 0x83, 0x34, 0x00, 0x88, 0x04, 0xff, 0x3d, 0x1e, 0x3d, 0xc9, 0x81, 0x33, 0x86, 0x0a, 0x01, 0xe7, - 0xcb, 0x10, 0x5c, 0x7f, 0xf9, 0x8d, 0xec, 0xfa, 0x20, 0x52, 0x06, 0x08, 0x45, 0xf8, 0x10, 0x98, - 0xe4, 0x6f, 0xef, 0xf2, 0x1c, 0xc3, 0x11, 0x62, 0xf5, 0xff, 0x66, 0x28, 0x01, 0xc8, 0x57, 0xf6, - 0xb8, 0xf6, 0xe3, 0x63, 0xc5, 0xff, 0xbb, 0x6e, 0x09, 0x6e, 0x1f, 0x00, 0x2e, 0x85, 0x00, 0x96, - 0x8b, 0xfe, 0x74, 0xf6, 0xfc, 0xde, 0x78, 0xff, 0xf2, 0x81, 0xf9, 0xfe, 0xaf, 0xfc, 0x2d, 0x69, - 0xff, 0x52, 0x66, 0xf9, 0x74, 0xac, 0xfd, 0x78, 0x64, 0xff, 0xbe, 0xf3, 0xfe, 0x74, 0x43, 0x01, - 0x78, 0x35, 0x00, 0x96, 0xcc, 0xfe, 0x01, 0x48, 0x3a, 0x76, 0xda, 0x32, 0x43, 0xbf, 0xfe, 0x9b, - 0x02, 0x11, 0x8c, 0x4c, 0xfd, 0x09, 0x8c, 0xfb, 0x96, 0x23, 0x02, 0x8c, 0x25, 0xf8, 0xc9, 0xb4, - 0xed, 0x56, 0x30, 0xf0, 0x81, 0xbb, 0x0f, 0xe9, 0x68, 0x01, 0x48, 0x9b, 0xfa, 0xdf, 0x94, 0xfd, - 0xda, 0xab, 0xe7, 0x40, 0x80, 0xf7, 0xd2, 0x4b, 0x09, 0x67, 0x2c, 0x01, 0x9c, 0xf7, 0xff, 0xf9, - 0x48, 0x01, 0xb9, 0x4c, 0xfd, 0x06, 0x79, 0xfc, 0xdf, 0x66, 0xfa, 0x34, 0xb0, 0xfc, 0x76, 0xc8, - 0x00, 0x4c, 0xb0, 0xfb, 0xfd, 0xf3, 0xfb, 0x33, 0x86, 0xff, 0x06, 0x30, 0xff, 0xf3, 0xc8, 0x00, - 0xf1, 0x2d, 0x00, 0x5a, 0xf5, 0xfe, 0x81, 0x88, 0x36, 0xf8, 0x72, 0x2f, 0x0d, 0x92, 0xfe, 0xc5, - 0xa1, 0x12, 0x88, 0x21, 0x00, 0x7b, 0x8f, 0xfb, 0xf8, 0x0a, 0x01, 0x4f, 0xf7, 0xf6, 0xff, 0xa9, - 0xf2, 0x26, 0xd1, 0xf1, 0x87, 0x43, 0x0c, 0x70, 0x25, 0x04, 0xaf, 0x8d, 0xf7, 0x7c, 0xfa, 0xff, - 0x54, 0x59, 0xee, 0x81, 0x50, 0xf1, 0xbc, 0x1a, 0x07, 0xad, 0x20, 0x02, 0xb7, 0x21, 0xfe, 0xdf, - 0x39, 0x02, 0x79, 0xca, 0xfe, 0x99, 0xef, 0xfb, 0xa6, 0x65, 0xfa, 0x35, 0x4f, 0xfd, 0xd4, 0xc6, - 0x01, 0x23, 0x62, 0xfd, 0xb2, 0x4d, 0xfa, 0xc4, 0x57, 0xff, 0xe3, 0xf6, 0xff, 0x66, 0x3c, 0x00, - 0x75, 0x76, 0x00, 0x49, 0x27, 0xff, 0xdd, 0x75, 0x32, 0x27, 0xf4, 0x2a, 0xda, 0xc3, 0xff, 0xac, - 0x6c, 0x14, 0x17, 0x0f, 0x01, 0xf0, 0x8f, 0xfa, 0x31, 0xb2, 0x01, 0x28, 0x29, 0xfa, 0x53, 0xbb, - 0xf2, 0xa7, 0xfb, 0xf0, 0xa8, 0x6c, 0x0b, 0x85, 0x31, 0x06, 0x0b, 0xe4, 0xf6, 0x94, 0xe9, 0xff, - 0x0b, 0x76, 0xf4, 0x5b, 0x89, 0xef, 0x43, 0x11, 0x04, 0xff, 0xb9, 0x02, 0x4b, 0x80, 0xfc, 0x89, - 0xc8, 0x00, 0xb1, 0xdd, 0xfe, 0xf4, 0x78, 0xfd, 0xad, 0x41, 0xfc, 0xf5, 0xb5, 0xfc, 0x22, 0xc6, - 0x00, 0xc4, 0x69, 0xfe, 0x39, 0x9a, 0xfa, 0x77, 0xc2, 0xff, 0xac, 0x19, 0x00, 0xf9, 0xca, 0xff, - 0xef, 0xe3, 0x00, 0x7a, 0xca, 0xfe, 0x45, 0xbd, 0x2c, 0x9e, 0x95, 0x26, 0xbb, 0x35, 0x02, 0x0b, - 0xf1, 0x15, 0xa6, 0x82, 0x01, 0xf8, 0xb2, 0xf9, 0xa9, 0x40, 0x03, 0x4f, 0x74, 0xfd, 0xcf, 0xd7, - 0xf3, 0xf9, 0xe0, 0xef, 0xd5, 0x87, 0x07, 0x9c, 0xf0, 0x07, 0x02, 0x1f, 0xf9, 0x17, 0x80, 0xff, - 0x70, 0x6a, 0xf8, 0x88, 0x26, 0xf0, 0x97, 0x4e, 0x02, 0x2d, 0xe9, 0x02, 0x34, 0x43, 0xfb, 0x7c, - 0x58, 0xff, 0xf6, 0x08, 0xfe, 0x2a, 0xc7, 0xfd, 0x0c, 0xa5, 0xfe, 0xcb, 0xfc, 0xfc, 0x0c, 0xc7, - 0xfe, 0x8f, 0xeb, 0xfe, 0xbf, 0x32, 0xfc, 0x1d, 0x52, 0x00, 0xa8, 0x55, 0x00, 0x26, 0x78, 0xff, - 0x68, 0x8d, 0x00, 0x14, 0xc3, 0xfe, 0x41, 0x4f, 0x2b, 0x2e, 0xac, 0x21, 0x55, 0xf3, 0x01, 0x62, - 0xbe, 0x1b, 0x40, 0x4a, 0x00, 0x7a, 0xb3, 0xf6, 0x7d, 0x61, 0x06, 0xd1, 0x14, 0x01, 0x92, 0xf9, - 0xf3, 0x89, 0xfe, 0xec, 0x47, 0x63, 0x05, 0x77, 0x58, 0x09, 0x89, 0x1b, 0xfa, 0x6f, 0x2b, 0x02, - 0x77, 0xa9, 0xf9, 0xb2, 0x36, 0xed, 0xbc, 0xa4, 0x03, 0x5a, 0xc8, 0x03, 0x88, 0x7f, 0xf9, 0x18, - 0x39, 0xff, 0xb5, 0x71, 0xfc, 0x66, 0x71, 0xfc, 0xc0, 0x8c, 0xff, 0x98, 0x16, 0xfd, 0xd5, 0x98, - 0xff, 0x92, 0x70, 0xff, 0x73, 0xe1, 0xfb, 0xbe, 0x06, 0x02, 0x51, 0x32, 0x01, 0x67, 0xda, 0xfe, - 0x68, 0xf7, 0xff, 0x92, 0xb7, 0xfe, 0xc3, 0x75, 0x24, 0x72, 0x29, 0x21, 0x7c, 0x0e, 0x08, 0xba, - 0xaf, 0x18, 0x8d, 0x19, 0xff, 0x69, 0x1e, 0xf6, 0x4a, 0x65, 0x05, 0x72, 0xe6, 0xfe, 0xb6, 0x89, - 0xf7, 0xd1, 0x9b, 0xf1, 0x2d, 0x0a, 0xff, 0x7b, 0x7c, 0x06, 0xa2, 0x5e, 0xfd, 0x19, 0xba, 0x03, - 0x65, 0xed, 0xfc, 0xa9, 0x57, 0xef, 0xca, 0xe4, 0xfd, 0x71, 0xc7, 0x03, 0xbf, 0xe7, 0xfe, 0xe0, - 0x63, 0xff, 0xa8, 0xf9, 0xfb, 0x88, 0x18, 0xfd, 0x80, 0xc6, 0xff, 0xc6, 0x70, 0xfe, 0xd9, 0xe9, - 0xff, 0xf6, 0x28, 0xff, 0x2d, 0x8c, 0xfc, 0x1e, 0x1d, 0x00, 0xab, 0xe0, 0x00, 0xd1, 0xe0, 0xfe, - 0xe1, 0xd8, 0xff, 0x7d, 0x58, 0xff, 0x2a, 0x0d, 0x20, 0x7e, 0xbc, 0x1e, 0x29, 0x51, 0x08, 0xcb, - 0x46, 0x16, 0xb6, 0xab, 0x00, 0xca, 0x6b, 0xf9, 0x42, 0xf4, 0x04, 0x46, 0x1c, 0xfe, 0xd3, 0x26, - 0xf9, 0x9f, 0x01, 0xf3, 0xe0, 0x0e, 0xfe, 0x1d, 0xe8, 0x04, 0x5a, 0xe3, 0xfd, 0xd5, 0xfd, 0x02, - 0xa0, 0xd7, 0xfe, 0x4e, 0xf3, 0xf2, 0xe0, 0x37, 0xfc, 0x29, 0x5c, 0x04, 0x61, 0xe7, 0xff, 0x7f, - 0xaf, 0xfd, 0xe4, 0xb3, 0xfc, 0x1a, 0x39, 0xfe, 0x17, 0xbe, 0xff, 0x7a, 0x16, 0xfe, 0x92, 0xa3, - 0xfe, 0x10, 0x3b, 0xff, 0x1a, 0x4a, 0xfe, 0x11, 0xaa, 0xff, 0xf7, 0x55, 0xff, 0x45, 0xc1, 0xfe, - 0x92, 0x69, 0x00, 0x56, 0x95, 0xff, 0x75, 0x7f, 0x1c, 0x39, 0x7d, 0x1b, 0xd5, 0x7d, 0x08, 0x16, - 0x79, 0x12, 0xdd, 0x3b, 0x02, 0x06, 0xe1, 0xfd, 0x1c, 0x4a, 0x03, 0x3e, 0xc0, 0xfd, 0x26, 0x31, - 0xfa, 0xfd, 0xa8, 0xf4, 0x64, 0x26, 0xfe, 0xc7, 0x53, 0x03, 0x8b, 0x94, 0xfe, 0x01, 0x68, 0x02, - 0x72, 0xc6, 0xff, 0x26, 0x96, 0xf5, 0x30, 0xd8, 0xfc, 0x33, 0xac, 0x04, 0xed, 0xbe, 0xff, 0xad, - 0x99, 0xfd, 0xbb, 0xad, 0xfd, 0x2d, 0x05, 0xff, 0x0d, 0x7e, 0xff, 0x61, 0x92, 0xfd, 0xc6, 0xbe, - 0xfd, 0xb1, 0x01, 0xff, 0x0d, 0xd7, 0xfe, 0x33, 0xe0, 0xfe, 0x71, 0xe8, 0xfe, 0xfb, 0x76, 0xff, - 0xfd, 0xaa, 0x00, 0xd7, 0xca, 0xff, 0x8e, 0x9b, 0x19, 0xd8, 0x57, 0x19, 0x86, 0xe0, 0x07, 0xde, - 0x09, 0x0f, 0x74, 0x43, 0x04, 0xcf, 0x31, 0x00, 0x46, 0xde, 0x01, 0x13, 0xae, 0xfd, 0x2f, 0x69, - 0xfa, 0xf2, 0x65, 0xf6, 0xcb, 0x3c, 0xfe, 0xbe, 0x65, 0x02, 0x47, 0x04, 0xff, 0xe5, 0x2f, 0x02, - 0xf8, 0x5f, 0x00, 0x3c, 0xf1, 0xf6, 0x83, 0xa7, 0xfd, 0x5a, 0xcb, 0x04, 0xa4, 0x81, 0xff, 0x91, - 0xb1, 0xfd, 0xbc, 0x64, 0xfe, 0xb0, 0x0b, 0xff, 0xb7, 0x3a, 0xff, 0xd5, 0x84, 0xfd, 0xe7, 0x36, - 0xfd, 0x96, 0xbd, 0xfe, 0xca, 0x8d, 0xfe, 0xfb, 0xcb, 0xfe, 0xda, 0x8d, 0xff, 0x01, 0xa2, 0xff, - 0xb1, 0x53, 0x00, 0x31, 0xf2, 0xff, 0x79, 0xfe, 0x15, 0xe6, 0x22, 0x17, 0xa1, 0xe7, 0x06, 0x26, - 0xc1, 0x0c, 0xd5, 0x9e, 0x06, 0x64, 0xcf, 0x00, 0x3a, 0x1a, 0x01, 0x70, 0x11, 0xfe, 0x81, 0x07, - 0xfb, 0xd2, 0xa4, 0xf8, 0xae, 0x2e, 0xfe, 0xe1, 0x86, 0x01, 0x00, 0x1c, 0x00, 0x76, 0xc4, 0x02, - 0x65, 0x3c, 0x00, 0xc8, 0x93, 0xf8, 0x04, 0x0b, 0xff, 0x2e, 0x4c, 0x04, 0x74, 0x72, 0xff, 0xe1, - 0xb6, 0xfd, 0x5b, 0xb0, 0xfe, 0x66, 0xa8, 0xff, 0xc1, 0x0b, 0xff, 0x2b, 0x76, 0xfd, 0xb6, 0x63, - 0xfd, 0x53, 0x2d, 0xff, 0x12, 0xae, 0xfe, 0xc9, 0x8a, 0xfe, 0xeb, 0xe8, 0xff, 0x99, 0x0f, 0x00, - 0xa0, 0x54, 0x00, 0x9f, 0xc7, 0xff, 0xf6, 0x55, 0x13, 0x63, 0x48, 0x14, 0xf2, 0x5a, 0x06, 0x73, - 0x46, 0x0c, 0x10, 0xf0, 0x06, 0x45, 0x67, 0x00, 0x7d, 0xd3, 0x00, 0x8f, 0x76, 0xfe, 0xec, 0xdf, - 0xfb, 0x80, 0x50, 0xfa, 0xb0, 0xe4, 0xfd, 0xb4, 0xbd, 0x00, 0xb2, 0x15, 0x01, 0xcc, 0x25, 0x03, - 0xcf, 0x2a, 0x00, 0xf3, 0x22, 0xfa, 0xa8, 0x9f, 0xff, 0x25, 0xeb, 0x02, 0xcd, 0x13, 0xff, 0x8c, - 0x39, 0xfe, 0xa9, 0x17, 0xff, 0x30, 0x8b, 0xff, 0xd8, 0xe0, 0xfe, 0x1c, 0xf1, 0xfd, 0xe1, 0x1f, - 0xfe, 0xa5, 0xa2, 0xff, 0x24, 0x73, 0xfe, 0x03, 0x3f, 0xfe, 0x90, 0xd6, 0xff, 0x50, 0x2d, 0x00, - 0x40, 0x51, 0x00, 0xed, 0x8f, 0xff, 0xd8, 0x22, 0x10, 0xc4, 0xf7, 0x11, 0x45, 0x58, 0x06, 0xd7, - 0x4a, 0x0b, 0x66, 0x90, 0x06, 0x6e, 0xa5, 0x00, 0x69, 0xf0, 0x00, 0x84, 0xb9, 0xfe, 0xcf, 0xcd, - 0xfc, 0xbf, 0x8a, 0xfb, 0xba, 0xa7, 0xfd, 0x2e, 0x45, 0x00, 0xfe, 0x4f, 0x02, 0x89, 0xa0, 0x03, - 0x27, 0x17, 0x00, 0x50, 0x8f, 0xfb, 0xac, 0x2e, 0xff, 0xa9, 0xc0, 0x01, 0x4e, 0x7c, 0xff, 0x67, - 0x94, 0xfe, 0xe6, 0x04, 0xff, 0x99, 0x7c, 0xff, 0x90, 0x85, 0xff, 0xa1, 0xe9, 0xfe, 0x88, 0xab, - 0xfe, 0xa9, 0x4d, 0xff, 0xca, 0xeb, 0xfd, 0x8d, 0x55, 0xfe, 0x39, 0xfe, 0xff, 0xd9, 0xfa, 0xff, - 0xdd, 0x25, 0x00, 0xcf, 0xaa, 0xff, 0x6b, 0x65, 0x0c, 0xfc, 0xba, 0x0f, 0x67, 0xfd, 0x06, 0xe4, - 0x29, 0x09, 0x85, 0xda, 0x05, 0x57, 0x22, 0x02, 0x90, 0x80, 0x01, 0xb5, 0xc8, 0xfe, 0x78, 0x53, - 0xfd, 0xe2, 0xe2, 0xfc, 0x95, 0xb9, 0xfe, 0xba, 0x21, 0x01, 0x6c, 0x38, 0x03, 0x0c, 0x78, 0x03, - 0x8d, 0x3d, 0x00, 0xd7, 0xf4, 0xfc, 0x43, 0x43, 0xff, 0x7e, 0x05, 0x01, 0xdb, 0x93, 0xff, 0xf6, - 0xe4, 0xfe, 0xcb, 0x6b, 0xff, 0x21, 0x63, 0x00, 0x61, 0x3b, 0x00, 0xeb, 0x15, 0xff, 0x52, 0x6f, - 0xfe, 0x1b, 0x17, 0xff, 0xcf, 0x91, 0xfe, 0xa2, 0xb3, 0xfe, 0x6d, 0xef, 0xff, 0x03, 0xd4, 0xff, - 0xff, 0xfd, 0xff, 0x37, 0x0d, 0x00, 0x25, 0x6c, 0x09, 0x80, 0x47, 0x0c, 0x86, 0xe1, 0x07, 0x64, - 0xa8, 0x08, 0x8e, 0x62, 0x05, 0x64, 0xc4, 0x02, 0x7d, 0x5c, 0x01, 0x3b, 0x86, 0xff, 0xc4, 0x79, - 0xfe, 0x44, 0x67, 0xfe, 0xed, 0xcd, 0xff, 0x39, 0x4e, 0x01, 0xe5, 0xae, 0x03, 0x88, 0xd8, 0x03, - 0x4b, 0x92, 0x00, 0x27, 0xf8, 0xfd, 0xdc, 0x5c, 0xff, 0xa6, 0x3d, 0x00, 0xb8, 0x88, 0xff, 0x4b, - 0x6e, 0xff, 0x04, 0x31, 0x00, 0x42, 0x7e, 0x00, 0xb6, 0xbd, 0xff, 0x2e, 0x5c, 0xff, 0x63, 0x23, - 0xff, 0x06, 0x4e, 0xff, 0x56, 0xbf, 0xfe, 0xb8, 0xe5, 0xfe, 0x78, 0xb8, 0xff, 0xef, 0xea, 0xff, - 0xcd, 0x10, 0x00, 0xae, 0xfc, 0xff, 0xb8, 0x2c, 0x07, 0x71, 0x03, 0x0a, 0x61, 0x6b, 0x07, 0xcf, - 0x13, 0x07, 0x88, 0xaf, 0x04, 0x78, 0x1e, 0x03, 0x01, 0x3b, 0x02, 0x0a, 0x3c, 0x00, 0x15, 0x03, - 0x00, 0xb2, 0x9f, 0x00, 0xfd, 0x58, 0x01, 0x73, 0x59, 0x02, 0x6d, 0x9f, 0x03, 0x05, 0xfe, 0x03, - 0x2f, 0xdf, 0x00, 0xd2, 0x51, 0xfe, 0xf7, 0x0b, 0xff, 0xb7, 0xbe, 0xff, 0x35, 0x4c, 0x00, 0x48, - 0x15, 0x00, 0xc8, 0xd2, 0xff, 0x09, 0x48, 0x00, 0x58, 0x4b, 0x00, 0xf8, 0xd6, 0xff, 0x80, 0x4d, - 0xff, 0xf8, 0x4e, 0xff, 0xaa, 0x16, 0xff, 0x63, 0x21, 0xff, 0xbe, 0xdc, 0xff, 0xfe, 0x17, 0x00, - 0xa6, 0x00, 0x00, 0x4b, 0xb6, 0xff, 0x96, 0x59, 0x06, 0x1b, 0x85, 0x08, 0x03, 0x44, 0x06, 0x2c, - 0x78, 0x05, 0xe1, 0x2d, 0x04, 0xb8, 0x96, 0x03, 0x9d, 0x50, 0x03, 0xea, 0x6e, 0x02, 0x63, 0x3d, - 0x01, 0xca, 0xd6, 0x01, 0xd1, 0xb9, 0x02, 0x88, 0xfd, 0x02, 0x09, 0x8b, 0x03, 0x54, 0xf8, 0x02, - 0xbc, 0x2e, 0x00, 0x82, 0x85, 0xfe, 0x79, 0xaf, 0xff, 0xb2, 0x45, 0x00, 0xc6, 0x6b, 0x00, 0xd2, - 0xfc, 0xff, 0xad, 0xd5, 0xff, 0x5d, 0x52, 0x00, 0x84, 0x6f, 0x00, 0x19, 0x02, 0x00, 0x5f, 0x65, - 0xff, 0xba, 0x87, 0xff, 0x7f, 0x92, 0xff, 0xf2, 0xbc, 0xff, 0xb2, 0x0d, 0x00, 0xfe, 0x06, 0x00, - 0xf5, 0x87, 0xff, 0xed, 0xf9, 0xfe, 0x6b, 0x17, 0x05, 0x16, 0xa4, 0x06, 0x11, 0xf2, 0x04, 0x30, - 0x74, 0x05, 0x7e, 0x1b, 0x05, 0x64, 0x6b, 0x04, 0xba, 0x6d, 0x04, 0xc2, 0x4e, 0x04, 0xc0, 0x7b, - 0x03, 0x26, 0x99, 0x02, 0x6e, 0x34, 0x02, 0xd6, 0x40, 0x02, 0xa9, 0x70, 0x02, 0x7d, 0xfe, 0x01, - 0x83, 0x6d, 0x00, 0x73, 0x91, 0xff, 0x56, 0x33, 0x00, 0xd0, 0x13, 0x00, 0x8b, 0xcf, 0xff, 0x1a, - 0xe5, 0xff, 0x5e, 0xe1, 0xff, 0x82, 0x39, 0x00, 0xb2, 0x9d, 0x00, 0xbf, 0x7f, 0x00, 0x24, 0xe2, - 0xff, 0x9e, 0xc7, 0xff, 0x99, 0xaf, 0xff, 0xf5, 0xc7, 0xff, 0xce, 0xf0, 0xff, 0xa1, 0x6b, 0xff, - 0x80, 0x04, 0xff, 0x40, 0xd9, 0xfe, 0xe0, 0x9c, 0x04, 0x5f, 0x3e, 0x07, 0xb9, 0xb6, 0x05, 0x69, - 0xc2, 0x06, 0x1f, 0xe8, 0x06, 0x69, 0x0c, 0x05, 0xd2, 0x17, 0x04, 0x05, 0x5d, 0x03, 0x97, 0xd8, - 0x02, 0xac, 0xbc, 0x02, 0x00, 0x35, 0x02, 0x03, 0x79, 0x01, 0x48, 0xf0, 0x00, 0x3d, 0x41, 0x01, - 0x44, 0x3b, 0x01, 0xb8, 0x60, 0x00, 0xf7, 0x09, 0x00, 0x76, 0x99, 0xff, 0xe1, 0x46, 0xff, 0xbe, - 0xae, 0xff, 0x9e, 0x57, 0x00, 0xb6, 0xb3, 0x00, 0x44, 0xbb, 0x00, 0xbf, 0xd8, 0x00, 0x39, 0x92, - 0x00, 0x2c, 0xb6, 0xff, 0xb1, 0x5d, 0xff, 0x91, 0x45, 0xff, 0xaa, 0x32, 0xff, 0xe9, 0x16, 0xff, - 0x53, 0xf7, 0xfe, 0xbd, 0x34, 0xff, 0x0c, 0x4e, 0x05, 0x47, 0x6f, 0x09, 0xd0, 0xfe, 0x07, 0xf6, - 0x1d, 0x07, 0xa4, 0xf9, 0x05, 0x97, 0x38, 0x05, 0x3b, 0x2c, 0x04, 0xe7, 0x41, 0x02, 0x5f, 0x2e, - 0x01, 0x71, 0x24, 0x01, 0xf7, 0x49, 0x01, 0x5f, 0xa8, 0x01, 0xde, 0xd6, 0x01, 0xf9, 0x7c, 0x01, - 0xfa, 0xfc, 0x00, 0x90, 0xda, 0xff, 0x2f, 0x4f, 0xff, 0xbb, 0x7b, 0xff, 0x51, 0xfd, 0xff, 0xfd, - 0x06, 0x00, 0x1b, 0x2c, 0x00, 0x52, 0xdf, 0x00, 0x3a, 0xc1, 0x00, 0x6d, 0xb5, 0x00, 0x91, 0xa4, - 0x00, 0x9d, 0xde, 0xff, 0xe4, 0x0e, 0xff, 0x21, 0xb6, 0xfe, 0xcb, 0x93, 0xfe, 0x65, 0x08, 0xff, - 0x84, 0x58, 0xff, 0xc7, 0x5f, 0xff, 0xe2, 0x2c, 0x06, 0xe4, 0xdc, 0x09, 0x00, 0xd8, 0x07, 0x57, - 0xb6, 0x06, 0xd0, 0xcb, 0x05, 0x5d, 0x6c, 0x05, 0x4f, 0x6e, 0x04, 0xe1, 0x3b, 0x02, 0xa8, 0x5c, - 0x00, 0xf7, 0xa7, 0xff, 0xf7, 0xa1, 0x00, 0x4a, 0x24, 0x02, 0x5e, 0xe2, 0x01, 0xc3, 0x4b, 0x01, - 0x34, 0x18, 0x01, 0x3f, 0x5c, 0x00, 0x6a, 0x2c, 0x00, 0x28, 0xe0, 0xff, 0x9b, 0x9f, 0xff, 0x88, - 0xb3, 0xff, 0x3b, 0x49, 0x00, 0xe8, 0x6f, 0x00, 0xd2, 0x11, 0x00, 0xed, 0xa6, 0x00, 0x78, 0x52, - 0x01, 0xa6, 0xae, 0x00, 0x05, 0x1c, 0xff, 0x0a, 0x4d, 0xfe, 0x1a, 0x76, 0xfe, 0xaa, 0xd5, 0xfe, - 0x52, 0x2b, 0xff, 0x44, 0x84, 0xff, 0x46, 0x30, 0x06, 0x07, 0x9a, 0x09, 0x93, 0x88, 0x06, 0xbb, - 0xd7, 0x05, 0xc8, 0xb2, 0x05, 0x51, 0x77, 0x05, 0x45, 0x9e, 0x04, 0xa2, 0x31, 0x02, 0xb7, 0x18, - 0x00, 0xef, 0xaa, 0x00, 0x11, 0xcd, 0x01, 0x4a, 0x18, 0x01, 0x69, 0x87, 0x00, 0x8d, 0xcc, 0x00, - 0x41, 0xd3, 0x00, 0x87, 0x3e, 0x01, 0x46, 0xad, 0x01, 0xa3, 0x75, 0x00, 0xf6, 0xba, 0xff, 0xdf, - 0xbb, 0xff, 0xfa, 0xd0, 0xff, 0x1c, 0xea, 0xff, 0x48, 0xed, 0xff, 0x68, 0x42, 0x00, 0xfc, 0x6e, - 0x00, 0xc9, 0x1b, 0x01, 0x4d, 0xbd, 0x00, 0xaa, 0x18, 0xff, 0xef, 0x43, 0xfe, 0x3c, 0x67, 0xfe, - 0xc2, 0xe8, 0xfe, 0xd4, 0x58, 0xff, 0xb2, 0x6a, 0x07, 0x78, 0x8d, 0x0a, 0xf6, 0xe3, 0x05, 0xbb, - 0x7e, 0x04, 0x68, 0xd7, 0x03, 0xe1, 0x6b, 0x04, 0x04, 0x63, 0x04, 0x84, 0x4a, 0x02, 0x83, 0x88, - 0xff, 0x85, 0x3c, 0x00, 0x5c, 0xf2, 0x02, 0x4b, 0x7e, 0x02, 0x2a, 0x20, 0x01, 0x4f, 0x78, 0xff, - 0xe9, 0x20, 0xff, 0xea, 0x10, 0x01, 0x28, 0xfd, 0x01, 0x77, 0x92, 0x01, 0x66, 0x58, 0x01, 0xd8, - 0x0a, 0x00, 0x7b, 0xa0, 0xff, 0x1c, 0x4d, 0x00, 0xf1, 0xb3, 0xff, 0xeb, 0x55, 0xff, 0x26, 0x1b, - 0x00, 0x45, 0x63, 0x00, 0x39, 0x64, 0x00, 0x26, 0xb1, 0x00, 0x77, 0xfc, 0xff, 0x38, 0x19, 0xff, - 0x55, 0x7e, 0xfe, 0xf2, 0x7c, 0xfe, 0x06, 0xa3, 0x08, 0x81, 0x7f, 0x0c, 0x26, 0xf2, 0x05, 0xe1, - 0x14, 0x04, 0x47, 0x08, 0x03, 0x60, 0xb1, 0x03, 0x36, 0x5a, 0x03, 0x4f, 0xa4, 0x00, 0x74, 0x13, - 0xfe, 0xda, 0xe2, 0xfe, 0x30, 0xb7, 0x03, 0x7c, 0xd1, 0x03, 0xb2, 0x3e, 0x01, 0x9f, 0xe5, 0xff, - 0xd0, 0xc2, 0xff, 0xd6, 0x11, 0x00, 0x7b, 0xff, 0x00, 0x82, 0x88, 0x01, 0x4c, 0x3f, 0x01, 0x7f, - 0xf5, 0x00, 0x2a, 0xbb, 0x00, 0xbc, 0x63, 0x00, 0xb0, 0xca, 0xff, 0xb0, 0xdd, 0xff, 0x95, 0x91, - 0xff, 0xcb, 0x46, 0xff, 0x2a, 0xfb, 0xff, 0x2d, 0x8a, 0x00, 0xbe, 0xee, 0x00, 0xd2, 0x9f, 0x00, - 0x83, 0x62, 0xff, 0x89, 0x69, 0xfe, 0xcd, 0x0a, 0x0b, 0xa7, 0xdb, 0x0e, 0x6a, 0xfb, 0x05, 0x9c, - 0xb2, 0x04, 0x6a, 0xdb, 0x02, 0x9c, 0x1f, 0x03, 0xa4, 0x87, 0x02, 0x33, 0xc7, 0xfe, 0xc2, 0x5b, - 0xfb, 0xe3, 0xd9, 0xfc, 0x70, 0x26, 0x04, 0x05, 0xd1, 0x03, 0xa1, 0xb8, 0x00, 0x50, 0x29, 0x00, - 0x47, 0x11, 0x00, 0x29, 0xe4, 0x00, 0xe5, 0xce, 0x01, 0xcc, 0xa1, 0x00, 0x54, 0x4f, 0x00, 0x90, - 0x69, 0x01, 0x0d, 0xc6, 0x00, 0xc7, 0xc2, 0x00, 0x93, 0x9e, 0x00, 0x37, 0xbd, 0xff, 0x7d, 0xf9, - 0xff, 0xef, 0xbf, 0xff, 0xb4, 0x4d, 0xff, 0x7c, 0xfd, 0xff, 0x6b, 0xb8, 0x00, 0x3d, 0x67, 0x01, - 0x4d, 0x85, 0x00, 0x7f, 0x2a, 0xff, 0x8e, 0xb0, 0x0d, 0x11, 0x44, 0x11, 0x91, 0xb0, 0x05, 0x79, - 0x5d, 0x05, 0xea, 0xb9, 0x02, 0xf9, 0xfc, 0x02, 0xdb, 0x57, 0x02, 0x30, 0x63, 0xfd, 0xf2, 0x56, - 0xf9, 0xfa, 0x52, 0xfb, 0x7e, 0xc4, 0x04, 0x42, 0x6b, 0x03, 0x08, 0x2d, 0xff, 0x59, 0x21, 0xff, - 0x9c, 0xb3, 0xff, 0x5d, 0x6b, 0x01, 0x2d, 0x67, 0x02, 0xbb, 0xfd, 0x00, 0xe3, 0x0f, 0x01, 0x5c, - 0x10, 0x01, 0x8e, 0x26, 0x00, 0x35, 0x0a, 0x01, 0xf1, 0x29, 0x00, 0xb3, 0x0a, 0x00, 0x61, 0x65, - 0x00, 0x43, 0xcf, 0xff, 0x7b, 0xa5, 0xff, 0xf0, 0x9b, 0x00, 0x66, 0x77, 0x00, 0xeb, 0x06, 0x00, - 0x40, 0x95, 0x00, 0x13, 0x5f, 0x00, 0xf6, 0xf9, 0x10, 0xdb, 0x45, 0x13, 0xf4, 0xfc, 0x04, 0x34, - 0x81, 0x06, 0x38, 0x88, 0x02, 0x9f, 0x3c, 0x03, 0x61, 0x89, 0x02, 0xe6, 0x0f, 0xfc, 0x25, 0x0f, - 0xf7, 0x9a, 0x52, 0xfa, 0x04, 0x23, 0x06, 0xce, 0xfb, 0x02, 0xe4, 0x86, 0xfd, 0x52, 0xf8, 0xfd, - 0x01, 0xeb, 0xfe, 0xb3, 0xeb, 0x00, 0xd5, 0x6c, 0x02, 0x15, 0xee, 0x00, 0x6d, 0x64, 0x01, 0x24, - 0x0d, 0x02, 0x41, 0x14, 0x00, 0x08, 0x8b, 0x00, 0xad, 0x2d, 0x00, 0x35, 0xf8, 0xff, 0x98, 0x6c, - 0x00, 0x7c, 0xfe, 0xff, 0x48, 0x30, 0x00, 0xa2, 0xd5, 0x00, 0xef, 0x11, 0x00, 0xf1, 0x1e, 0x00, - 0x4b, 0x01, 0x00, 0x31, 0x05, 0x00, 0xa8, 0xfb, 0x15, 0x42, 0xb8, 0x15, 0x45, 0x1a, 0x03, 0xa3, - 0xe2, 0x07, 0xcd, 0x03, 0x02, 0xdb, 0x7c, 0x03, 0x16, 0x82, 0x02, 0x66, 0x26, 0xfa, 0x2f, 0xd8, - 0xf4, 0xad, 0xd3, 0xf9, 0xe8, 0xeb, 0x07, 0xa1, 0x0f, 0x02, 0x8d, 0xf8, 0xfb, 0x75, 0xf2, 0xfc, - 0x08, 0x29, 0xfe, 0x73, 0x56, 0x00, 0x91, 0xb3, 0x01, 0xb5, 0x3d, 0x00, 0xb1, 0x4f, 0x01, 0x7d, - 0xaa, 0x01, 0xad, 0xc4, 0xff, 0xb6, 0x17, 0x01, 0x13, 0x52, 0x00, 0x6b, 0xb4, 0xff, 0x91, 0x30, - 0x00, 0x38, 0x27, 0x00, 0xfe, 0xc7, 0xff, 0x13, 0xee, 0x00, 0x70, 0x3b, 0x00, 0x01, 0xed, 0xff, - 0xab, 0x38, 0x00, 0x3b, 0xb1, 0xff, 0xdb, 0xee, 0x1a, 0x60, 0x21, 0x18, 0x81, 0x9c, 0x00, 0xf3, - 0x4b, 0x09, 0x4e, 0x94, 0x01, 0x6b, 0x3c, 0x03, 0xf7, 0x73, 0x02, 0x04, 0x09, 0xf8, 0x2e, 0x7e, - 0xf3, 0xb5, 0x7d, 0xfa, 0xc3, 0x5b, 0x09, 0x9c, 0xd8, 0x00, 0x88, 0xc1, 0xfa, 0xe5, 0x40, 0xfc, - 0x07, 0xf4, 0xfd, 0x6a, 0xf0, 0xff, 0x14, 0x60, 0x01, 0x69, 0xa8, 0xff, 0x20, 0xcd, 0x00, 0xa2, - 0x90, 0x01, 0x80, 0xca, 0xfe, 0x5a, 0xfe, 0x00, 0x98, 0x75, 0x00, 0xe5, 0x2d, 0x00, 0x95, 0xce, - 0xff, 0x10, 0x47, 0xff, 0x7c, 0xdd, 0xff, 0x48, 0xdc, 0x00, 0x00, 0x59, 0x00, 0x9b, 0x79, 0x00, - 0xc0, 0x6e, 0x00, 0x40, 0xc1, 0xff, 0x7d, 0x2c, 0x20, 0x32, 0xb9, 0x1b, 0x30, 0xca, 0xfd, 0xcd, - 0x81, 0x0a, 0x94, 0xac, 0x01, 0x21, 0x6a, 0x02, 0x6b, 0x96, 0x02, 0x9a, 0x7e, 0xf5, 0xd7, 0x09, - 0xf2, 0x45, 0x31, 0xfb, 0x6d, 0x80, 0x0a, 0x39, 0x52, 0x00, 0xb7, 0xd9, 0xf9, 0x5b, 0x02, 0xfb, - 0xee, 0xe4, 0xfd, 0xac, 0x1a, 0x00, 0xd8, 0x59, 0x00, 0x62, 0xc8, 0xff, 0xf4, 0x69, 0x00, 0x2e, - 0xda, 0x00, 0x39, 0xa3, 0xfe, 0xaa, 0xeb, 0x00, 0x40, 0x08, 0x00, 0x1c, 0x8a, 0xff, 0x9f, 0x65, - 0xff, 0x7f, 0x40, 0xff, 0xb7, 0x6d, 0xff, 0x12, 0x7f, 0x00, 0xf5, 0x83, 0x00, 0x0f, 0x8a, 0x00, - 0x67, 0x45, 0x01, 0xf9, 0x76, 0x00, 0xed, 0x1b, 0x24, 0xfa, 0x47, 0x1f, 0xd1, 0xfd, 0xfb, 0x59, - 0xae, 0x0a, 0xfe, 0xe8, 0x01, 0x16, 0x02, 0x02, 0xd1, 0xb5, 0x02, 0x61, 0x7a, 0xf3, 0x7a, 0xe5, - 0xf0, 0x75, 0xe9, 0xfb, 0x37, 0xb6, 0x0a, 0xa6, 0xc8, 0xff, 0xc2, 0xa5, 0xf9, 0x5c, 0x6c, 0xfa, - 0x0c, 0xb1, 0xfd, 0x7d, 0xeb, 0xff, 0x5d, 0x5a, 0x00, 0x99, 0x86, 0xff, 0x80, 0x4a, 0x00, 0x17, - 0x58, 0x01, 0x96, 0x3d, 0xfe, 0x97, 0x1e, 0x00, 0x41, 0x38, 0xff, 0x7b, 0xb0, 0xff, 0x00, 0xef, - 0xfe, 0xa9, 0xc9, 0xfe, 0xe9, 0xb0, 0xff, 0x21, 0x88, 0x00, 0xea, 0x86, 0x00, 0x17, 0x9c, 0x00, - 0xf4, 0x2f, 0x01, 0x6d, 0xeb, 0xff, 0x84, 0x3a, 0x27, 0xcf, 0x82, 0x23, 0xcc, 0xd0, 0xfb, 0x2f, - 0x42, 0x0a, 0xa0, 0x29, 0x01, 0xe2, 0x47, 0x01, 0x28, 0x4e, 0x03, 0xc1, 0x73, 0xf1, 0x6c, 0x65, - 0xf0, 0x32, 0xc3, 0xfb, 0xac, 0xb0, 0x08, 0x3d, 0x2e, 0x00, 0x9e, 0xbd, 0xfa, 0xe1, 0x10, 0xf9, - 0x0e, 0xe6, 0xfc, 0xb3, 0x73, 0xff, 0xfc, 0x97, 0x00, 0x1e, 0x43, 0x01, 0x14, 0x4a, 0xff, 0xad, - 0x76, 0x00, 0x26, 0x54, 0xfe, 0xb5, 0xd3, 0xff, 0x4a, 0x74, 0xfe, 0x24, 0xef, 0xfe, 0xed, 0x80, - 0xfe, 0x1b, 0x99, 0xfe, 0x35, 0xb0, 0xff, 0xc6, 0x89, 0x00, 0xbb, 0xdc, 0x00, 0x50, 0x1d, 0x00, - 0x40, 0xdf, 0x00, 0x8d, 0xaa, 0xff, 0x71, 0x35, 0x28, 0x9c, 0x45, 0x27, 0x65, 0x61, 0xfd, 0x86, - 0x3a, 0x0a, 0xb8, 0x04, 0x01, 0x49, 0x37, 0xff, 0x09, 0x47, 0x04, 0x5d, 0x4e, 0xf1, 0xa1, 0xb0, - 0xf0, 0x1e, 0x83, 0xfb, 0x07, 0x32, 0x05, 0x12, 0xfd, 0xff, 0xe6, 0xd9, 0xfc, 0xf2, 0x88, 0xf9, - 0xc5, 0x85, 0xfb, 0x10, 0x56, 0xff, 0xdc, 0x6a, 0x00, 0x60, 0x2f, 0x02, 0x22, 0x89, 0xff, 0x11, - 0xc6, 0xff, 0x7e, 0x30, 0xfe, 0x1d, 0x58, 0xff, 0x28, 0xb4, 0xfe, 0x3e, 0xf0, 0xfe, 0xfc, 0x51, - 0xfe, 0x0c, 0xa0, 0xfe, 0xc7, 0x63, 0xff, 0x29, 0x81, 0xff, 0x66, 0xee, 0x00, 0x14, 0x82, 0x00, - 0xf4, 0xfd, 0x00, 0x12, 0x79, 0xff, 0xd2, 0xf4, 0x28, 0x4e, 0xca, 0x29, 0x70, 0xda, 0xff, 0x57, - 0xf3, 0x0a, 0x5d, 0x53, 0x01, 0x1e, 0xc5, 0xfc, 0x27, 0x69, 0x03, 0x5c, 0xfa, 0xf1, 0xf0, 0xc1, - 0xf1, 0xe1, 0xfe, 0xfb, 0x85, 0x94, 0x00, 0xe6, 0x26, 0xff, 0xcb, 0xa1, 0xfe, 0x4d, 0xda, 0xfa, - 0x1c, 0x77, 0xfc, 0x84, 0x85, 0xfd, 0x8b, 0x7b, 0xff, 0x7e, 0x94, 0x03, 0x41, 0xde, 0xff, 0xfc, - 0x87, 0xfe, 0xc3, 0x25, 0xfe, 0x77, 0xbc, 0xff, 0x66, 0x1c, 0xff, 0x86, 0xdf, 0xfe, 0x84, 0xf2, - 0xfd, 0xdd, 0x9b, 0xfe, 0x4c, 0x08, 0xff, 0xd2, 0xe7, 0xfe, 0x2a, 0x99, 0x00, 0x22, 0x36, 0x00, - 0x70, 0xbf, 0x00, 0xd6, 0xb2, 0xff, 0x15, 0xc9, 0x29, 0x89, 0x65, 0x2b, 0xa7, 0x43, 0x02, 0x34, - 0x17, 0x0d, 0xae, 0x34, 0x02, 0x6d, 0xa0, 0xfa, 0x70, 0x5e, 0x01, 0x47, 0x58, 0xf1, 0xf2, 0xd4, - 0xf2, 0x79, 0xb9, 0xfe, 0x8b, 0x49, 0xfc, 0x71, 0x45, 0xfb, 0x5f, 0x1b, 0x01, 0x2f, 0x6c, 0xfd, - 0x6f, 0x8a, 0xfd, 0xde, 0x80, 0xfc, 0x85, 0x62, 0xfd, 0x00, 0x8f, 0x03, 0x79, 0x59, 0x00, 0x21, - 0xf0, 0xfe, 0xac, 0x31, 0xff, 0x76, 0x21, 0xff, 0x15, 0x75, 0xfe, 0xaa, 0x3c, 0xff, 0xe3, 0xa7, - 0xfd, 0xf1, 0x4a, 0xfe, 0xdd, 0xef, 0xfe, 0x15, 0xbf, 0xfd, 0xf7, 0x27, 0x00, 0x1b, 0x57, 0x00, - 0xaf, 0xb2, 0x00, 0x1e, 0x76, 0xff, 0x91, 0x62, 0x2b, 0xb9, 0xb9, 0x2b, 0x34, 0xc7, 0x02, 0xf7, - 0xc7, 0x0f, 0x88, 0x7c, 0x03, 0x11, 0x9d, 0xf9, 0xd5, 0x43, 0xff, 0x1a, 0xd7, 0xef, 0x54, 0x85, - 0xf4, 0x4b, 0x81, 0x01, 0x15, 0xb6, 0xf8, 0x0c, 0xa1, 0xf8, 0x3c, 0x0e, 0x02, 0x94, 0x1c, 0xff, - 0x9e, 0xb4, 0xff, 0xcf, 0xb5, 0xfb, 0x29, 0x42, 0xfb, 0x2c, 0x74, 0x03, 0x10, 0x83, 0x01, 0x97, - 0x9e, 0xfe, 0x3f, 0x70, 0xff, 0x4d, 0xca, 0xff, 0x1e, 0x80, 0xfe, 0xcc, 0x8f, 0xfe, 0x80, 0xe8, - 0xfc, 0x1e, 0x07, 0xfe, 0xd9, 0xd2, 0xfe, 0x25, 0x58, 0xfd, 0xad, 0x87, 0xff, 0x1e, 0x3b, 0x00, - 0x70, 0xd5, 0x00, 0x5a, 0xb0, 0xff, 0xa0, 0x08, 0x2f, 0xe4, 0xae, 0x2a, 0xc0, 0x49, 0x01, 0xec, - 0xad, 0x13, 0x2a, 0x27, 0x04, 0x8d, 0xbb, 0xf8, 0xf4, 0xd0, 0xfc, 0x26, 0xb3, 0xee, 0x9f, 0x39, - 0xf6, 0x76, 0x4d, 0x05, 0xf9, 0x5b, 0xf5, 0x53, 0x6f, 0xf3, 0x17, 0x5e, 0x03, 0x13, 0x2c, 0x00, - 0xb9, 0xab, 0x02, 0x92, 0xec, 0xfb, 0xb4, 0xf7, 0xf8, 0x57, 0x98, 0x03, 0x3f, 0x38, 0x02, 0xee, - 0xaf, 0xfd, 0xc9, 0xa5, 0xff, 0x29, 0x40, 0x00, 0x7e, 0xe4, 0xfd, 0x57, 0xa4, 0xfe, 0x27, 0x99, - 0xfb, 0xd7, 0x77, 0xfd, 0xa7, 0x01, 0xff, 0x24, 0xe4, 0xfc, 0x33, 0x01, 0xff, 0x02, 0x30, 0x00, - 0xbd, 0x4d, 0x00, 0xd4, 0xe4, 0xfe, 0x33, 0xc1, 0x33, 0x59, 0x3b, 0x29, 0x7a, 0x60, 0xfe, 0xe6, - 0x9c, 0x17, 0x9c, 0x7c, 0x03, 0x37, 0x8b, 0xf8, 0xe4, 0xc4, 0xfc, 0x67, 0x61, 0xec, 0xb0, 0x4d, - 0xf8, 0x02, 0x78, 0x0a, 0xfb, 0x24, 0xf3, 0xa5, 0xf9, 0xec, 0x76, 0x9d, 0x03, 0xb2, 0xec, 0x01, - 0x15, 0x23, 0x05, 0xaa, 0x4c, 0xfd, 0x6b, 0x35, 0xf7, 0x77, 0x37, 0x03, 0x3f, 0xe9, 0x02, 0x9d, - 0x00, 0xfd, 0x84, 0xcb, 0xff, 0xba, 0x81, 0x00, 0x16, 0x8e, 0xfc, 0x28, 0x9e, 0xfe, 0x79, 0x7a, - 0xfb, 0xa7, 0x41, 0xfd, 0x2d, 0x20, 0xff, 0x7d, 0x89, 0xfc, 0x6a, 0x95, 0xfe, 0x4e, 0x2d, 0x00, - 0xf8, 0x13, 0x00, 0xff, 0xbc, 0xfe, 0x64, 0x0f, 0x3a, 0x29, 0xf3, 0x28, 0x98, 0xf5, 0xf8, 0x20, - 0x99, 0x19, 0x51, 0xa9, 0x02, 0x62, 0x31, 0xf9, 0x25, 0x7c, 0xfd, 0x7d, 0x7d, 0xe9, 0xeb, 0x71, - 0xfa, 0x54, 0xfd, 0x0f, 0xbe, 0x50, 0xf2, 0xd8, 0xea, 0xe6, 0xc9, 0x68, 0x02, 0x5c, 0xab, 0x02, - 0xba, 0x8e, 0x06, 0xe2, 0xe9, 0xff, 0x4c, 0x77, 0xf6, 0x26, 0x7e, 0x01, 0x98, 0xc1, 0x03, 0x7c, - 0x7d, 0xfc, 0x8a, 0x5f, 0xfe, 0x8f, 0x01, 0x01, 0x05, 0x4d, 0xfc, 0x3b, 0x70, 0xfe, 0x78, 0x5d, - 0xfa, 0xb6, 0x56, 0xfc, 0x22, 0xf1, 0xff, 0x9a, 0xac, 0xfc, 0xe2, 0x84, 0xfd, 0x81, 0x4e, 0x00, - 0xf3, 0x44, 0x00, 0x6e, 0xdc, 0xfd, 0x1c, 0xf3, 0x40, 0xfe, 0xa0, 0x2c, 0x87, 0xff, 0xf0, 0x5c, - 0x3a, 0x17, 0xdb, 0x77, 0x02, 0x03, 0x9c, 0xf9, 0xde, 0xb0, 0x01, 0xb9, 0xba, 0xe8, 0x55, 0xf3, - 0xf7, 0x6a, 0x93, 0x13, 0x78, 0x57, 0xf6, 0x55, 0x63, 0xe3, 0xd0, 0x22, 0xff, 0xbe, 0x07, 0x03, - 0xd2, 0x53, 0x08, 0x10, 0x2d, 0x01, 0x51, 0x08, 0xf5, 0x02, 0xf9, 0x00, 0x06, 0x7a, 0x04, 0xd9, - 0xe4, 0xfb, 0xd8, 0xaa, 0xfd, 0x41, 0xfd, 0x01, 0x09, 0xbb, 0xfb, 0xe6, 0xf2, 0xfd, 0x69, 0x34, - 0xfa, 0x54, 0xd4, 0xfb, 0x7f, 0x07, 0x00, 0x5f, 0xf0, 0xfc, 0x93, 0x70, 0xfd, 0xb4, 0xd6, 0xff, - 0x58, 0x79, 0x00, 0x9b, 0x1d, 0xfe, 0x43, 0x56, 0x48, 0xed, 0x78, 0x31, 0xbd, 0x43, 0xe7, 0xf3, - 0x68, 0x13, 0x57, 0xfb, 0x00, 0x5d, 0x18, 0xfb, 0x1e, 0x38, 0x09, 0xd6, 0xa2, 0xe6, 0xd1, 0xad, - 0xf3, 0xf9, 0xe2, 0x16, 0xed, 0xa7, 0xfb, 0x67, 0x77, 0xe1, 0x96, 0x8e, 0xfb, 0x55, 0x62, 0x02, - 0xfd, 0x73, 0x08, 0x6f, 0xd3, 0x02, 0x23, 0x00, 0xf4, 0x11, 0xb5, 0xfe, 0x60, 0x2a, 0x05, 0x01, - 0x1f, 0xfd, 0xbc, 0x68, 0xfc, 0xed, 0xad, 0x01, 0xdb, 0xbb, 0xfb, 0x46, 0x6e, 0xfe, 0x7a, 0x20, - 0xfa, 0x49, 0x64, 0xfa, 0x09, 0x8d, 0x00, 0xc4, 0x49, 0xfd, 0x64, 0xd7, 0xfc, 0x35, 0x9e, 0xff, - 0x79, 0x4c, 0x01, 0xaf, 0x6b, 0xfe, 0x1c, 0xee, 0x51, 0x94, 0x6d, 0x31, 0xfe, 0xc9, 0xde, 0x7d, - 0x3e, 0x13, 0x49, 0x16, 0xfd, 0xed, 0x24, 0xfe, 0xa0, 0x3a, 0x0d, 0xa6, 0x2f, 0xe4, 0x41, 0xf4, - 0xf2, 0x55, 0x40, 0x1a, 0x8e, 0xd6, 0x00, 0xea, 0x3b, 0xdf, 0x23, 0x51, 0xf7, 0x94, 0x0c, 0x00, - 0x1f, 0xad, 0x0a, 0x60, 0xc7, 0x03, 0xe4, 0xff, 0xf0, 0xaf, 0x1e, 0xfd, 0x56, 0xa2, 0x06, 0x6d, - 0x28, 0xfd, 0xa8, 0x9b, 0xfa, 0xea, 0x87, 0x02, 0xd7, 0xc6, 0xfb, 0xb0, 0xd2, 0xfe, 0x30, 0x16, - 0xfa, 0x3c, 0x9a, 0xf9, 0x88, 0x2d, 0x00, 0x41, 0x55, 0xfd, 0xd0, 0x4c, 0xfd, 0x12, 0x38, 0x00, - 0xa6, 0x14, 0x01, 0x88, 0x9c, 0xfd, 0x8f, 0x19, 0x57, 0x3a, 0x4a, 0x32, 0x42, 0x25, 0xda, 0xbc, - 0xac, 0x12, 0x80, 0xa3, 0xf9, 0x0c, 0x59, 0x00, 0x2a, 0xf9, 0x0f, 0x75, 0x7f, 0xe3, 0x51, 0x2b, - 0xf1, 0x6d, 0x80, 0x1b, 0x7c, 0xb1, 0x06, 0xa6, 0x21, 0xdd, 0x01, 0x31, 0xf4, 0x9f, 0x27, 0xfe, - 0xfb, 0xf3, 0x09, 0x58, 0xaa, 0x04, 0x0d, 0xb4, 0xf0, 0x9b, 0x87, 0xfb, 0x21, 0x13, 0x06, 0x75, - 0x4f, 0xfd, 0x77, 0xaa, 0xf9, 0xb5, 0x1d, 0x03, 0xd6, 0x61, 0xfb, 0xe2, 0x83, 0xff, 0x3a, 0x4d, - 0xfa, 0x47, 0x43, 0xf8, 0xb0, 0x1c, 0x00, 0x88, 0x52, 0xfe, 0xda, 0xa4, 0xfd, 0x4d, 0xe6, 0xff, - 0xeb, 0xaf, 0x00, 0x6d, 0x51, 0xfd, 0x34, 0xac, 0x5d, 0xfd, 0x5f, 0x32, 0xba, 0x8c, 0xd6, 0x0f, - 0x1c, 0x11, 0x6a, 0xe8, 0xf4, 0x19, 0xba, 0x04, 0xe3, 0x31, 0x13, 0x50, 0x9d, 0xe2, 0x92, 0x13, - 0xee, 0x97, 0x56, 0x1c, 0x10, 0x9e, 0x0c, 0xeb, 0xa6, 0xdd, 0xc8, 0x0d, 0xf2, 0x6c, 0x39, 0xf8, - 0x49, 0xc4, 0x09, 0x63, 0xb3, 0x07, 0xa8, 0x79, 0xf0, 0xbb, 0xde, 0xf9, 0x0b, 0x11, 0x05, 0xaa, - 0x07, 0xfd, 0x91, 0xa9, 0xf9, 0x5f, 0x84, 0x03, 0xfc, 0xed, 0xfa, 0x48, 0xf6, 0xff, 0x73, 0xc3, - 0xf9, 0x42, 0x23, 0xf8, 0x00, 0xf3, 0x00, 0xc5, 0x1b, 0xff, 0xe3, 0xa1, 0xfd, 0x9a, 0xc0, 0xff, - 0xe1, 0x68, 0x00, 0x0f, 0x14, 0xfd, 0x87, 0xd2, 0x5f, 0x91, 0x9b, 0x35, 0x6e, 0xe0, 0xd4, 0x42, - 0x59, 0x0e, 0x13, 0xcb, 0xf2, 0xda, 0x6c, 0x06, 0xe3, 0x54, 0x15, 0x0e, 0x94, 0xe3, 0x58, 0x21, - 0xea, 0xe0, 0x93, 0x1a, 0x5c, 0x2f, 0x13, 0xa9, 0x5c, 0xdf, 0x83, 0x0b, 0xef, 0x83, 0x65, 0xf3, - 0x11, 0xf8, 0x08, 0x1b, 0x45, 0x0b, 0x5c, 0xd8, 0xf0, 0x53, 0x10, 0xf8, 0x17, 0x02, 0x04, 0xa8, - 0x2b, 0xfd, 0x37, 0xae, 0xf9, 0x86, 0x9f, 0x03, 0x8e, 0xf1, 0xf9, 0xd3, 0xb0, 0xff, 0x5a, 0x6d, - 0xfa, 0x85, 0x5e, 0xf8, 0x1d, 0xfd, 0x00, 0x6d, 0x84, 0xff, 0x22, 0xd3, 0xfd, 0x9b, 0xbd, 0xff, - 0x6c, 0x30, 0x00, 0x79, 0xab, 0xfc, 0xc1, 0x36, 0x63, 0x83, 0x19, 0x36, 0x8a, 0x58, 0xd6, 0x73, - 0xf1, 0x0b, 0xb4, 0x59, 0xf0, 0xb7, 0x12, 0x08, 0xbb, 0x85, 0x15, 0x2e, 0x09, 0xe6, 0x79, 0xbe, - 0xe5, 0x3b, 0x46, 0x19, 0xb4, 0x6d, 0x18, 0x6d, 0x77, 0xe2, 0xe7, 0xa0, 0xec, 0xb3, 0x3a, 0xee, - 0x6c, 0x8b, 0x08, 0x5a, 0x34, 0x0e, 0x78, 0xfb, 0xf2, 0xcd, 0xce, 0xf5, 0x1d, 0xa9, 0x03, 0x27, - 0xf4, 0xfc, 0xa2, 0xd6, 0xf9, 0x1c, 0x2e, 0x03, 0x78, 0x95, 0xf8, 0x00, 0x64, 0x00, 0x2e, 0x43, - 0xfb, 0x67, 0x6e, 0xf8, 0x1f, 0xbd, 0x00, 0x7c, 0x17, 0x00, 0x68, 0xb7, 0xfd, 0x78, 0x52, 0x00, - 0xb2, 0x95, 0xff, 0x28, 0x24, 0xfc, 0x3b, 0x63, 0x64, 0x81, 0xa7, 0x37, 0xb7, 0x21, 0xd8, 0xaf, - 0xb5, 0x0a, 0x0c, 0xb3, 0xee, 0x30, 0xe9, 0x07, 0x73, 0x5c, 0x15, 0xd0, 0xc3, 0xe7, 0x67, 0x29, - 0xe2, 0x5e, 0x2f, 0x17, 0x2c, 0xb1, 0x1b, 0x3c, 0xf8, 0xe6, 0xa6, 0xec, 0xea, 0x8e, 0xe2, 0xe9, - 0xda, 0x15, 0x08, 0x88, 0xa5, 0x0f, 0x2a, 0x62, 0xf6, 0xfa, 0xe8, 0xf3, 0x5a, 0xa4, 0x02, 0xd2, - 0xa4, 0xfd, 0xa7, 0x17, 0xf9, 0x23, 0x54, 0x02, 0x97, 0x79, 0xf8, 0xa8, 0xfd, 0x00, 0x60, 0x24, - 0xfb, 0xd1, 0x36, 0xf9, 0x62, 0xbb, 0xff, 0x03, 0x14, 0x00, 0x95, 0x63, 0xfe, 0x43, 0xed, 0xff, - 0xe2, 0x2a, 0xff, 0xc0, 0x0e, 0xfc, 0xb1, 0xe8, 0x63, 0xe9, 0x80, 0x39, 0x1d, 0xd7, 0xda, 0x0d, - 0x27, 0x0a, 0xf4, 0xfd, 0xec, 0x2b, 0xa7, 0x07, 0x82, 0x71, 0x14, 0x28, 0xdb, 0xe8, 0xc9, 0x6d, - 0xdf, 0x29, 0xa6, 0x13, 0x02, 0x48, 0x1e, 0x88, 0x5f, 0xec, 0xee, 0xb6, 0xea, 0x8a, 0x0c, 0xe5, - 0x09, 0xcd, 0x06, 0x6b, 0x1b, 0x11, 0x98, 0x3e, 0xfa, 0xab, 0x68, 0xf2, 0x56, 0xcb, 0x00, 0x23, - 0xef, 0xfe, 0x8d, 0xba, 0xf7, 0xb5, 0x02, 0x02, 0x12, 0xf8, 0xf8, 0xfe, 0x24, 0x01, 0x8e, 0x54, - 0xfb, 0xbc, 0x48, 0xf9, 0xc0, 0xb1, 0xfe, 0x8d, 0x48, 0x00, 0xe9, 0x8f, 0xfe, 0xbc, 0xe7, 0xfe, - 0x71, 0xa5, 0xff, 0x90, 0xfe, 0xfb, 0x54, 0x55, 0x61, 0xd5, 0xeb, 0x3c, 0x8f, 0x79, 0xdf, 0xc3, - 0xf3, 0x0a, 0x23, 0xf8, 0xea, 0xd9, 0x85, 0x06, 0xfc, 0xd0, 0x13, 0x0c, 0x07, 0xe9, 0xdf, 0x71, - 0xdd, 0x94, 0xcd, 0x0e, 0x4d, 0x4c, 0x20, 0x0d, 0x07, 0xf3, 0xca, 0x25, 0xee, 0xfb, 0xfc, 0xde, - 0x92, 0xc7, 0x03, 0x1e, 0x7e, 0x13, 0x92, 0x4b, 0xfe, 0xb8, 0xbb, 0xf2, 0x19, 0x90, 0xfd, 0xe4, - 0x64, 0x00, 0x2e, 0x38, 0xf7, 0xea, 0xda, 0x01, 0x24, 0xe4, 0xf9, 0x64, 0xfb, 0x01, 0xa4, 0xc9, - 0xfa, 0x78, 0xa4, 0xf8, 0x5c, 0xe5, 0xfe, 0xb7, 0x43, 0xff, 0xdb, 0x12, 0xff, 0xd8, 0xf0, 0xfd, - 0x2d, 0x4d, 0x00, 0x58, 0x4a, 0xfc, 0x4f, 0xf1, 0x5f, 0x7f, 0xd8, 0x3b, 0x66, 0xe1, 0xe5, 0x41, - 0xa8, 0x0b, 0x15, 0xe5, 0xe9, 0x75, 0x7f, 0x06, 0x69, 0x53, 0x11, 0x1d, 0xf2, 0xe9, 0xc3, 0x01, - 0xdb, 0x3e, 0xe7, 0x0b, 0x9c, 0x4c, 0x1f, 0xb9, 0xe7, 0xf7, 0xb9, 0x37, 0xf3, 0x05, 0x19, 0xdb, - 0x9c, 0xa7, 0x00, 0xa5, 0x70, 0x14, 0x33, 0x94, 0x00, 0xe0, 0xff, 0xf3, 0x16, 0x8f, 0xfb, 0x38, - 0x7d, 0x00, 0x0a, 0x6a, 0xf8, 0x0a, 0x1d, 0x01, 0x50, 0xbf, 0xfa, 0x54, 0x0c, 0x02, 0xc8, 0x78, - 0xfa, 0x77, 0xb4, 0xf8, 0x2e, 0x14, 0xfe, 0xff, 0x91, 0xfe, 0x31, 0x7f, 0xff, 0x44, 0x8d, 0xfd, - 0xb8, 0x72, 0x00, 0x0d, 0x99, 0xfd, 0x8d, 0x4e, 0x5c, 0x29, 0xa6, 0x3c, 0xad, 0x53, 0xed, 0x18, - 0x51, 0x0b, 0x4c, 0x81, 0xea, 0xef, 0xa5, 0x04, 0x53, 0x2a, 0x0f, 0x6b, 0x58, 0xed, 0x82, 0xe0, - 0xd6, 0x2b, 0xbc, 0x07, 0x3e, 0x05, 0x1e, 0x57, 0x03, 0xfc, 0x86, 0x6b, 0xfb, 0x4b, 0xef, 0xd7, - 0x23, 0x69, 0xfa, 0xaf, 0x3e, 0x16, 0x70, 0xbc, 0x01, 0xe0, 0x7a, 0xf6, 0x4f, 0x3a, 0xfb, 0xf9, - 0x55, 0xff, 0x0e, 0xea, 0xfa, 0x6b, 0x3c, 0x00, 0xd8, 0xc3, 0xf9, 0xdb, 0x6c, 0x03, 0x6b, 0xb8, - 0xfa, 0xba, 0x4d, 0xf7, 0x6b, 0x47, 0xfe, 0x93, 0x28, 0xfd, 0x7d, 0xf4, 0xff, 0x3d, 0xd2, 0xfe, - 0x90, 0x98, 0x00, 0xe0, 0x76, 0xfe, 0x17, 0xb1, 0x58, 0x59, 0xbd, 0x3c, 0x86, 0x61, 0xf2, 0xc4, - 0xc4, 0x09, 0x9d, 0x2c, 0xee, 0x83, 0xbd, 0x03, 0x4a, 0x1e, 0x0b, 0x69, 0x6c, 0xf0, 0xef, 0x6a, - 0xd4, 0x5f, 0x6f, 0x04, 0x0f, 0x66, 0x1c, 0xde, 0x12, 0xfd, 0x51, 0x18, 0x02, 0x8c, 0x7c, 0xd8, - 0xb5, 0x1e, 0xf3, 0xd4, 0x5c, 0x16, 0xdc, 0x9f, 0x02, 0x13, 0xa0, 0xf8, 0x80, 0x7c, 0xfc, 0x9d, - 0xe9, 0xfd, 0x2c, 0xc0, 0xfb, 0x5e, 0x55, 0x00, 0x69, 0x60, 0xf9, 0xa6, 0x13, 0x03, 0x59, 0x6e, - 0xfa, 0x19, 0xa5, 0xf6, 0x9a, 0xc5, 0xfe, 0xbf, 0x45, 0xfc, 0x4c, 0xb5, 0x00, 0x52, 0xc8, 0xff, - 0x7a, 0x6b, 0x00, 0x02, 0x4a, 0xff, 0x72, 0x49, 0x55, 0xb9, 0x87, 0x38, 0xb8, 0x3b, 0xfa, 0x54, - 0x9e, 0x0b, 0xb4, 0x78, 0xee, 0xff, 0x59, 0x03, 0x26, 0x4c, 0x07, 0xd1, 0xde, 0xf3, 0x07, 0xce, - 0xd3, 0x87, 0x6e, 0xfe, 0x6b, 0x7d, 0x1b, 0xc1, 0x73, 0xfe, 0xe1, 0xef, 0x07, 0x17, 0x23, 0xdb, - 0x5b, 0xce, 0xe9, 0xee, 0x58, 0x15, 0x9f, 0xa1, 0x04, 0xec, 0xe8, 0xfa, 0xe2, 0x2a, 0xfe, 0x44, - 0xf6, 0xfc, 0xe0, 0xe8, 0xfc, 0x15, 0xef, 0xff, 0x76, 0xac, 0xf8, 0x90, 0x89, 0x02, 0x7a, 0x84, - 0xfa, 0x46, 0x75, 0xf5, 0xbc, 0x5b, 0xff, 0x2f, 0xf9, 0xfc, 0xfc, 0x7c, 0x00, 0x1a, 0x3c, 0x01, - 0x65, 0xde, 0x00, 0x9b, 0xc0, 0xfe, 0xeb, 0x36, 0x50, 0x00, 0xc9, 0x36, 0x9a, 0x40, 0xfd, 0xba, - 0xac, 0x10, 0x7e, 0x83, 0xed, 0xec, 0xa2, 0x01, 0xce, 0xb7, 0x07, 0x85, 0x65, 0xf3, 0x18, 0x6d, - 0xd6, 0xf6, 0x2d, 0xf8, 0xfb, 0x11, 0x1b, 0x4c, 0x40, 0xff, 0x33, 0xc3, 0x09, 0x11, 0xcf, 0xe0, - 0xaf, 0xe9, 0xe0, 0x02, 0xa5, 0x12, 0xbd, 0x62, 0x08, 0x42, 0xdc, 0xfb, 0x4e, 0x3d, 0xfe, 0x62, - 0x6d, 0xfd, 0xfa, 0x65, 0xfd, 0xd6, 0x55, 0x00, 0x13, 0xfd, 0xf7, 0x41, 0x43, 0xff, 0xdc, 0xaa, - 0xfc, 0x62, 0x1f, 0xf6, 0x76, 0x92, 0xfe, 0x58, 0x25, 0xfd, 0x13, 0xec, 0x00, 0xda, 0x38, 0x02, - 0xdf, 0xd1, 0xff, 0x8e, 0xd1, 0xfe, 0x20, 0xb7, 0x4c, 0x23, 0xea, 0x36, 0x25, 0xfd, 0xfb, 0xa9, - 0x9d, 0x12, 0x1c, 0xc6, 0xf1, 0xc5, 0x2b, 0xfe, 0x3a, 0xe3, 0x08, 0xc5, 0x70, 0xf3, 0x29, 0x4d, - 0xd9, 0x43, 0xfb, 0xf4, 0x45, 0xc7, 0x1b, 0x65, 0x70, 0xfd, 0x7a, 0xbc, 0x06, 0xda, 0xa0, 0xeb, - 0xf3, 0xe2, 0xda, 0xe3, 0x8c, 0x0c, 0x88, 0x72, 0x0b, 0xcd, 0xb2, 0xfd, 0x71, 0xd0, 0xff, 0x1f, - 0x7c, 0xfc, 0x2e, 0x57, 0xfd, 0x3d, 0x85, 0x01, 0x64, 0x45, 0xf7, 0xd0, 0x82, 0xfc, 0x73, 0x6b, - 0xff, 0x1c, 0x4e, 0xf6, 0x02, 0x56, 0xfe, 0xec, 0x29, 0xff, 0x53, 0x9a, 0xff, 0x16, 0xec, 0x01, - 0x2a, 0x20, 0x00, 0x3f, 0xed, 0xfe, 0x4a, 0x69, 0x4a, 0xd9, 0x22, 0x35, 0x0f, 0xf0, 0xf9, 0xbe, - 0x18, 0x15, 0x46, 0x22, 0xf5, 0x38, 0xdf, 0xf8, 0x7e, 0x21, 0x08, 0x87, 0x47, 0xf7, 0x74, 0x69, - 0xdf, 0x5a, 0x41, 0xf1, 0x45, 0x7e, 0x18, 0x46, 0x1c, 0xfe, 0x79, 0x73, 0x01, 0xf2, 0xc6, 0xf5, - 0x38, 0xb8, 0xda, 0x28, 0x12, 0x02, 0xea, 0xf4, 0x0d, 0x23, 0x01, 0xff, 0xba, 0x0a, 0x01, 0x56, - 0x7f, 0xfe, 0xae, 0x4d, 0xfc, 0x95, 0x3c, 0xff, 0xc1, 0x98, 0xf7, 0x29, 0xa9, 0xfc, 0xae, 0x68, - 0x00, 0x6d, 0xd5, 0xf7, 0x15, 0x1f, 0xfe, 0xe0, 0xdb, 0xff, 0x4d, 0x79, 0xfe, 0x50, 0x02, 0x02, - 0x46, 0xfa, 0xff, 0x15, 0x76, 0xfe, 0x86, 0x00, 0x47, 0xdb, 0x2a, 0x35, 0xb0, 0x3c, 0xf7, 0xa8, - 0x34, 0x15, 0x74, 0xa3, 0xf9, 0xa9, 0x45, 0xfa, 0xcf, 0x54, 0x02, 0xfd, 0x0a, 0xf7, 0x50, 0xc8, - 0xea, 0x64, 0x91, 0xec, 0xd6, 0x04, 0x17, 0x4c, 0x40, 0x00, 0xe7, 0x2d, 0xf9, 0xe6, 0xd8, 0xfe, - 0xf6, 0x86, 0xde, 0x27, 0x4c, 0xf8, 0xa5, 0xb3, 0x0e, 0x33, 0x21, 0x00, 0x65, 0xdb, 0xff, 0x21, - 0xfe, 0x01, 0x82, 0x7c, 0xfc, 0x2d, 0x7e, 0xfb, 0x38, 0x52, 0xf9, 0x08, 0x6c, 0xfc, 0x2e, 0x1d, - 0x02, 0xe2, 0x73, 0xfa, 0x74, 0x65, 0xfb, 0x35, 0x36, 0x00, 0x92, 0xff, 0xfe, 0xf6, 0x49, 0x01, - 0xe4, 0x0b, 0x00, 0xcd, 0xc8, 0xfe, 0xae, 0x8f, 0x42, 0x48, 0x34, 0x32, 0xff, 0x1b, 0xf7, 0xd5, - 0xf6, 0x16, 0x14, 0x3a, 0xfd, 0xc8, 0x24, 0xfa, 0xce, 0xb2, 0x00, 0x41, 0x94, 0xf4, 0x5c, 0x7f, - 0xf2, 0x62, 0xdd, 0xed, 0xb8, 0xbc, 0x11, 0xc7, 0xa8, 0x04, 0x30, 0x5d, 0xf4, 0x88, 0xea, 0x02, - 0xd2, 0xe0, 0xe5, 0xd0, 0x09, 0xef, 0xdf, 0xcc, 0x0d, 0x7a, 0x76, 0x01, 0x77, 0x60, 0xfd, 0x80, - 0x06, 0x04, 0xcd, 0x54, 0xfe, 0x98, 0xe3, 0xf9, 0xb8, 0x34, 0xf9, 0xa6, 0x95, 0xfd, 0x1f, 0x56, - 0x03, 0x4b, 0x76, 0xfc, 0xd5, 0xee, 0xf8, 0xd8, 0x27, 0x00, 0x5d, 0x05, 0x00, 0xb1, 0x84, 0x00, - 0x9f, 0x68, 0x00, 0xc5, 0x1b, 0xff, 0x6b, 0xed, 0x3e, 0x4a, 0x70, 0x2d, 0x51, 0xc2, 0xf8, 0x1d, - 0x26, 0x19, 0x08, 0x0d, 0xfe, 0x90, 0xe0, 0xf8, 0xd7, 0xef, 0x00, 0xa9, 0x0e, 0xf8, 0xc7, 0x4b, - 0xf1, 0x2a, 0x79, 0xee, 0x21, 0xc1, 0x11, 0x11, 0x5c, 0x05, 0xe9, 0xe4, 0xf3, 0x96, 0xd2, 0x02, - 0xd4, 0xbd, 0xec, 0xa1, 0xce, 0xeb, 0x38, 0xb8, 0x09, 0x25, 0xe4, 0x02, 0x3d, 0x07, 0xfc, 0xaa, - 0xce, 0x02, 0x27, 0xd1, 0xfe, 0xf0, 0xf7, 0xfb, 0x00, 0x00, 0xfa, 0xb2, 0x9b, 0xfc, 0x15, 0xba, - 0x03, 0x69, 0x77, 0xfd, 0x11, 0x1e, 0xf8, 0xe0, 0x87, 0x00, 0x89, 0x77, 0x00, 0x87, 0xe9, 0xff, - 0x3c, 0xf8, 0x00, 0xeb, 0xc0, 0xfe, 0x76, 0xd9, 0x38, 0x0a, 0x35, 0x29, 0xa7, 0x2d, 0xfb, 0x5f, - 0x81, 0x1a, 0x1b, 0xd9, 0xfe, 0x1a, 0xa3, 0xf7, 0xfa, 0xc2, 0x02, 0x32, 0xaf, 0xfb, 0xde, 0x1f, - 0xf2, 0xba, 0x50, 0xeb, 0x30, 0xb0, 0x0f, 0x02, 0x4e, 0x0a, 0x67, 0x04, 0xf2, 0x86, 0x08, 0x03, - 0xf4, 0xd9, 0xf3, 0xb0, 0x6b, 0xe9, 0x2e, 0xdc, 0x07, 0x04, 0x83, 0x03, 0x9d, 0x30, 0xf9, 0xb2, - 0x1f, 0x01, 0xca, 0xcb, 0xfe, 0x65, 0x32, 0xfd, 0xdd, 0x7d, 0xfd, 0xb9, 0xbc, 0xfb, 0xdb, 0x9e, - 0x00, 0xb3, 0x36, 0xff, 0x7e, 0xbf, 0xf9, 0xfa, 0x0f, 0x01, 0xc3, 0x10, 0x00, 0x74, 0x83, 0xff, - 0x0d, 0x81, 0x01, 0xac, 0x1a, 0xfe, 0x6b, 0x0d, 0x32, 0x58, 0x13, 0x25, 0x0f, 0x26, 0xff, 0x72, - 0xdc, 0x1b, 0xcf, 0xda, 0xfe, 0x5b, 0xbb, 0xf6, 0x5e, 0xb4, 0x04, 0x08, 0x25, 0xff, 0x3f, 0xed, - 0xf2, 0xbe, 0x10, 0xeb, 0x3a, 0xfd, 0x09, 0x23, 0x45, 0x0b, 0xfe, 0xf7, 0xf6, 0x8f, 0xa0, 0x01, - 0x6a, 0xc9, 0xf6, 0x12, 0x32, 0xeb, 0x75, 0xa9, 0x05, 0x87, 0xde, 0x03, 0x4c, 0xa4, 0xf8, 0x52, - 0xce, 0xff, 0x1c, 0x92, 0xfd, 0xfe, 0x26, 0xfd, 0xcb, 0xa1, 0xff, 0x25, 0x45, 0xfc, 0x03, 0xd9, - 0xfe, 0xb2, 0x7f, 0xff, 0x09, 0x8c, 0xfb, 0x36, 0x68, 0x01, 0xd9, 0xa6, 0x00, 0xb7, 0x1d, 0xff, - 0x07, 0x9a, 0x00, 0x82, 0x8b, 0xfe, 0xb5, 0x0a, 0x33, 0x27, 0xc7, 0x20, 0x44, 0x70, 0xff, 0x39, - 0x14, 0x22, 0x0c, 0xae, 0xf6, 0xef, 0x6b, 0xf2, 0xb7, 0xa5, 0x05, 0x68, 0x2b, 0xfa, 0x51, 0x1e, - 0xeb, 0xf5, 0x42, 0xef, 0xc7, 0x4a, 0x19, 0x94, 0xb8, 0x06, 0x92, 0x8f, 0xf8, 0x39, 0x7b, 0x0e, - 0x4f, 0x97, 0xf8, 0x1e, 0x95, 0xed, 0x6a, 0x78, 0x07, 0x84, 0x7e, 0x00, 0xa1, 0x04, 0xf6, 0x6e, - 0xb7, 0xfb, 0xbb, 0xc8, 0xf8, 0x24, 0x8e, 0xfd, 0x52, 0x2b, 0xfd, 0xb5, 0xc1, 0xf9, 0x07, 0x69, - 0xff, 0xf5, 0x19, 0xfd, 0xef, 0x91, 0xfc, 0x1d, 0x1a, 0x02, 0x83, 0x6a, 0xff, 0xd6, 0x01, 0xfe, - 0x6c, 0x3d, 0x01, 0x7d, 0xe5, 0xff, 0xbf, 0x97, 0x2a, 0x40, 0x44, 0x20, 0x75, 0x63, 0x03, 0xb5, - 0x3c, 0x1e, 0xde, 0x95, 0xfc, 0x9f, 0x0a, 0xf0, 0x10, 0x7a, 0x00, 0x3c, 0xc2, 0xfa, 0x83, 0xa3, - 0xf0, 0x8f, 0xae, 0xf4, 0xfa, 0x4d, 0x11, 0x2d, 0x47, 0x08, 0x13, 0x89, 0xfc, 0x5b, 0x43, 0x09, - 0xc1, 0xf0, 0xfa, 0x90, 0x02, 0xef, 0x0b, 0x94, 0x00, 0xee, 0x4f, 0x00, 0x15, 0x83, 0xf9, 0x84, - 0xbf, 0xfe, 0x69, 0xcd, 0xf9, 0x33, 0x9e, 0xfd, 0x9d, 0x34, 0x00, 0x7b, 0xdf, 0xf8, 0xd2, 0xa6, - 0xff, 0x13, 0xb2, 0xfe, 0x2f, 0x07, 0xfa, 0xe1, 0xf1, 0xff, 0x27, 0xd8, 0xff, 0xdc, 0xee, 0xfe, - 0xe6, 0x38, 0x00, 0x89, 0xb6, 0xff, 0x7d, 0x39, 0x24, 0xd8, 0x32, 0x1d, 0x80, 0xef, 0x05, 0xd7, - 0x93, 0x1b, 0xd1, 0x7d, 0xfe, 0xec, 0xe9, 0xf3, 0xf4, 0xac, 0x00, 0x63, 0x9d, 0xfa, 0x6d, 0x8b, - 0xf4, 0x3d, 0xdd, 0xf6, 0x9f, 0x32, 0x0c, 0x0b, 0x6f, 0x07, 0x4a, 0xf7, 0xfc, 0xaa, 0xf2, 0x06, - 0x9f, 0x67, 0xfc, 0xcb, 0x74, 0xf1, 0xe4, 0x93, 0xff, 0x5a, 0x8c, 0xff, 0x5e, 0x2c, 0xfb, 0x95, - 0xab, 0xff, 0xbd, 0x52, 0xfb, 0x4e, 0xda, 0xfe, 0x2e, 0x03, 0x00, 0xd3, 0xf1, 0xf9, 0xe2, 0xc9, - 0xff, 0xf6, 0x87, 0xfe, 0x6e, 0x69, 0xfa, 0xbc, 0xf4, 0xfe, 0x33, 0x0d, 0xff, 0xcd, 0xef, 0xfe, - 0xb5, 0x09, 0x00, 0xd0, 0x5f, 0xff, 0x6b, 0xf3, 0x1d, 0x34, 0x46, 0x1a, 0x2a, 0x73, 0x08, 0x6d, - 0x79, 0x18, 0x51, 0x42, 0x00, 0x49, 0xaa, 0xf7, 0xe8, 0x81, 0x00, 0x00, 0xaf, 0xfb, 0x38, 0xf8, - 0xf7, 0xcc, 0x08, 0xf8, 0x5f, 0x8c, 0x08, 0x2a, 0xb6, 0x05, 0xd1, 0x45, 0xfd, 0xe3, 0x38, 0x05, - 0x4c, 0x51, 0xfd, 0x30, 0x3a, 0xf4, 0x0e, 0x0a, 0xfe, 0xc6, 0x89, 0xff, 0xf7, 0x34, 0xfc, 0xf5, - 0x6f, 0xff, 0xe5, 0x0f, 0xfe, 0x7d, 0xb8, 0x00, 0x81, 0x24, 0x00, 0x17, 0xf4, 0xfa, 0x82, 0x45, - 0xff, 0x31, 0xf3, 0xfd, 0x58, 0x0c, 0xfb, 0x73, 0x07, 0xfe, 0x98, 0xde, 0xfd, 0x9a, 0x49, 0xfe, - 0xc4, 0x09, 0x00, 0x03, 0xf7, 0xff, 0x7a, 0xdb, 0x18, 0xf6, 0xff, 0x17, 0x9d, 0xc2, 0x09, 0x19, - 0x42, 0x15, 0xc6, 0x7a, 0x02, 0x76, 0x0d, 0xfa, 0x1f, 0x46, 0x00, 0x05, 0x44, 0xfe, 0xe4, 0x1b, - 0xfa, 0x1c, 0xc4, 0xf8, 0xb1, 0x05, 0x06, 0x71, 0x14, 0x04, 0xfb, 0x7e, 0xfd, 0x9a, 0xba, 0x03, - 0xd8, 0xa4, 0xfe, 0x57, 0xfa, 0xf5, 0x98, 0x1c, 0xfd, 0xbd, 0xfb, 0xff, 0x47, 0xec, 0xfc, 0xb6, - 0x8f, 0x00, 0x0d, 0xb1, 0x00, 0x63, 0x7d, 0x01, 0x3f, 0xc1, 0xff, 0x86, 0xd2, 0xfb, 0xc9, 0x8f, - 0xfe, 0x57, 0x84, 0xfd, 0x7b, 0xa0, 0xfb, 0xd1, 0x33, 0xfd, 0xbd, 0x96, 0xfd, 0x75, 0x45, 0xfe, - 0x5c, 0xd4, 0xff, 0x10, 0x01, 0x00, 0x81, 0xbd, 0x14, 0xf8, 0x42, 0x16, 0xd1, 0xa4, 0x09, 0xed, - 0x5b, 0x12, 0x66, 0x74, 0x04, 0xd5, 0x56, 0xfb, 0x6e, 0x29, 0x01, 0x0c, 0x3f, 0x00, 0x0a, 0x54, - 0xfb, 0xde, 0xdf, 0xf9, 0x7f, 0x84, 0x03, 0x21, 0x8f, 0x02, 0xaa, 0xd0, 0xfd, 0xc7, 0xcf, 0x02, - 0x74, 0x3b, 0xff, 0xf4, 0x86, 0xf7, 0xc3, 0xfe, 0xfc, 0xd2, 0x5d, 0x00, 0x1a, 0x08, 0xff, 0x95, - 0xee, 0x01, 0xf3, 0x07, 0x01, 0x32, 0xc2, 0x00, 0x50, 0xca, 0xff, 0x41, 0x78, 0xfc, 0xc9, 0xec, - 0xfd, 0xa1, 0x4b, 0xfd, 0x00, 0xf2, 0xfb, 0x85, 0xb5, 0xfd, 0xeb, 0xbf, 0xfd, 0xa7, 0x30, 0xfe, - 0x52, 0x81, 0xff, 0xc4, 0x9d, 0xff, 0xe6, 0x3d, 0x12, 0x4c, 0x7e, 0x14, 0x15, 0xe1, 0x08, 0x2c, - 0xf3, 0x0f, 0x13, 0xca, 0x04, 0x7b, 0xc2, 0xfc, 0x7e, 0x4e, 0x02, 0xbf, 0xb3, 0x00, 0x1e, 0x71, - 0xfc, 0xda, 0xc2, 0xfa, 0x53, 0x1b, 0x01, 0x92, 0x57, 0x01, 0x38, 0x5e, 0xfe, 0xf3, 0x78, 0x02, - 0x8a, 0x3d, 0xff, 0x53, 0xd1, 0xf8, 0x5e, 0x00, 0xfe, 0xd7, 0x2d, 0x01, 0xc3, 0x8b, 0x00, 0x22, - 0x2c, 0x02, 0x8e, 0x2a, 0x00, 0x4e, 0x04, 0x00, 0x97, 0x6d, 0xff, 0x6f, 0x7f, 0xfc, 0x54, 0xb6, - 0xfd, 0x2b, 0x27, 0xfe, 0x1c, 0x0c, 0xfd, 0xa9, 0x68, 0xfd, 0x7b, 0x87, 0xfd, 0xb6, 0x5f, 0xfe, - 0xd0, 0x82, 0xff, 0x4d, 0xb5, 0xff, 0x9b, 0xd1, 0x10, 0x8f, 0x0b, 0x12, 0x9c, 0x64, 0x08, 0x67, - 0x2c, 0x0e, 0x98, 0x7b, 0x04, 0x46, 0x13, 0xff, 0x33, 0x1d, 0x03, 0x73, 0xfa, 0x00, 0x55, 0x9c, - 0xfd, 0x05, 0x61, 0xfb, 0xf8, 0x96, 0xff, 0xe7, 0xe8, 0x00, 0x1b, 0x68, 0xff, 0xe7, 0x79, 0x02, - 0x3e, 0x1f, 0x00, 0x4e, 0x88, 0xfa, 0x2c, 0xb9, 0xfe, 0xbb, 0x0b, 0x02, 0x16, 0x86, 0x01, 0x91, - 0x6f, 0x01, 0xed, 0x73, 0xff, 0xa4, 0xd6, 0xff, 0x22, 0xfe, 0xfe, 0x64, 0x77, 0xfd, 0x12, 0x37, - 0xff, 0x9f, 0xc6, 0xfe, 0x7d, 0x04, 0xfd, 0xe0, 0x6b, 0xfd, 0x40, 0x1f, 0xfe, 0xce, 0xe4, 0xfe, - 0x33, 0xdc, 0xff, 0x5c, 0x27, 0x00, 0x90, 0x31, 0x0f, 0xde, 0x1e, 0x10, 0x3e, 0xd2, 0x07, 0xd1, - 0x0b, 0x0c, 0x43, 0xc3, 0x04, 0x82, 0xf8, 0x00, 0x7c, 0x2a, 0x03, 0x0c, 0x37, 0x01, 0x62, 0x71, - 0xfe, 0xde, 0x9f, 0xfb, 0x38, 0xcb, 0xfe, 0xac, 0xa8, 0x00, 0x01, 0x22, 0x01, 0x66, 0x91, 0x03, - 0x81, 0x2d, 0x00, 0x1d, 0x52, 0xfb, 0x59, 0x20, 0xff, 0x30, 0xca, 0x02, 0x1d, 0xba, 0x01, 0xac, - 0x35, 0x00, 0xfe, 0xd5, 0xfe, 0xb0, 0x35, 0x00, 0x38, 0x0e, 0x00, 0xf7, 0x6d, 0xfe, 0x73, 0x41, - 0xff, 0x44, 0xe4, 0xfe, 0x81, 0x5f, 0xfd, 0xc0, 0xb1, 0xfd, 0xe2, 0xeb, 0xfe, 0xf7, 0xb6, 0xff, - 0xdd, 0x71, 0x00, 0x4c, 0x4d, 0x00, 0xc4, 0xbd, 0x0c, 0x57, 0x34, 0x0f, 0xdf, 0x19, 0x07, 0x5a, - 0x60, 0x09, 0xfc, 0xcb, 0x05, 0x4d, 0x9b, 0x02, 0x74, 0xf7, 0x02, 0xec, 0x13, 0x01, 0xb4, 0xe2, - 0xfe, 0xff, 0xec, 0xfb, 0xeb, 0x4b, 0xff, 0x6a, 0xb9, 0x02, 0x75, 0xe8, 0x01, 0xf6, 0x9f, 0x02, - 0x96, 0x46, 0x00, 0xd1, 0x48, 0xfc, 0x6e, 0x62, 0xff, 0x31, 0xe9, 0x02, 0x80, 0x2a, 0x01, 0x5a, - 0x85, 0xff, 0x23, 0xd1, 0xff, 0xea, 0x9a, 0x00, 0x1f, 0x5a, 0x00, 0xe4, 0xf3, 0xfe, 0x93, 0xc4, - 0xfe, 0x2e, 0xf3, 0xfe, 0x70, 0x59, 0xfe, 0xe4, 0xb6, 0xfe, 0xdc, 0xc2, 0xff, 0x0a, 0x64, 0x00, - 0xdf, 0xc1, 0xff, 0x87, 0xc9, 0xfe, 0xda, 0x51, 0x09, 0x7c, 0xf0, 0x0c, 0x11, 0x8f, 0x07, 0x72, - 0x93, 0x08, 0xb3, 0x96, 0x06, 0xed, 0xd2, 0x02, 0xa7, 0x7c, 0x02, 0xa5, 0x79, 0x01, 0x1c, 0x89, - 0x00, 0x67, 0xe3, 0xfe, 0xea, 0x6e, 0xff, 0xfd, 0x7b, 0x02, 0x8d, 0xad, 0x02, 0x47, 0x9d, 0x01, - 0xd3, 0x64, 0x00, 0x4d, 0xc8, 0xfd, 0x96, 0x03, 0xff, 0x1a, 0x6a, 0x02, 0xd4, 0xa4, 0x01, 0x0e, - 0xd8, 0xff, 0xb7, 0x1e, 0x00, 0x45, 0xb2, 0x00, 0xbd, 0x35, 0x00, 0x35, 0x18, 0xff, 0x3b, 0x79, - 0xff, 0xf7, 0xcc, 0xff, 0xa4, 0x30, 0xff, 0x8e, 0xb8, 0xff, 0x08, 0xe3, 0xff, 0x63, 0x28, 0xff, - 0x37, 0xbd, 0xfe, 0x9d, 0xb7, 0xfe, 0xa0, 0x51, 0x07, 0xb6, 0x06, 0x0c, 0x5e, 0x96, 0x07, 0xcc, - 0x88, 0x05, 0x99, 0x93, 0x05, 0x99, 0x03, 0x05, 0xad, 0x76, 0x03, 0x82, 0xe9, 0x01, 0x8b, 0x8f, - 0x01, 0x9f, 0x22, 0x01, 0x15, 0xe8, 0x00, 0xee, 0xd5, 0x01, 0x8d, 0xd5, 0x01, 0x91, 0x84, 0x00, - 0x3a, 0x58, 0x00, 0xe5, 0x1e, 0xff, 0xcb, 0x8d, 0xff, 0xd9, 0x1b, 0x02, 0xf0, 0xa0, 0x01, 0x59, - 0x25, 0x00, 0xa0, 0xe2, 0xff, 0x92, 0x65, 0x00, 0xd9, 0x8f, 0x00, 0xbf, 0x4a, 0x00, 0xa6, 0x13, - 0x00, 0x7b, 0x3a, 0x00, 0x93, 0x13, 0x00, 0x4c, 0xf0, 0xfe, 0x97, 0x8f, 0xfe, 0x69, 0xc8, 0xfe, - 0x5b, 0x08, 0xff, 0x5e, 0x34, 0xff, 0x7c, 0x38, 0x06, 0x20, 0x4d, 0x09, 0xab, 0x59, 0x06, 0xe6, - 0x5a, 0x05, 0x28, 0x28, 0x06, 0xb1, 0x98, 0x05, 0x25, 0xd1, 0x04, 0x56, 0xf8, 0x03, 0x4b, 0x43, - 0x02, 0x6c, 0xad, 0x01, 0xdc, 0x2e, 0x01, 0x90, 0xcc, 0x00, 0x4d, 0x24, 0x01, 0x0b, 0x93, 0x00, - 0x5d, 0x79, 0xff, 0xdc, 0x08, 0x00, 0x82, 0x39, 0x01, 0xd6, 0x57, 0x01, 0x1f, 0xd8, 0x00, 0x7e, - 0x0f, 0x00, 0x4d, 0x11, 0x00, 0x6a, 0x19, 0x01, 0x24, 0x7d, 0x01, 0x23, 0xd2, 0x00, 0xe2, 0x61, - 0x00, 0x50, 0x99, 0xff, 0x2f, 0xb7, 0xfe, 0xf0, 0xb0, 0xfe, 0xc0, 0xcd, 0xfe, 0x91, 0xe4, 0xfe, - 0x13, 0x47, 0xff, 0xfb, 0x3b, 0xff, 0xfb, 0xc1, 0x05, 0xd5, 0x03, 0x07, 0x79, 0xde, 0x05, 0x8f, - 0xc8, 0x07, 0x0a, 0x79, 0x07, 0x15, 0x05, 0x06, 0xb1, 0x13, 0x04, 0x61, 0x70, 0x03, 0x07, 0x64, - 0x03, 0xba, 0xac, 0x01, 0x05, 0xc2, 0x00, 0x9e, 0x5b, 0x00, 0xa1, 0x0e, 0x00, 0xcb, 0x60, 0x00, - 0x11, 0x5c, 0x00, 0xa4, 0x66, 0x00, 0x6c, 0xf8, 0x00, 0x03, 0xaf, 0x00, 0x45, 0xc1, 0x00, 0x73, - 0x59, 0x01, 0x7d, 0x2f, 0x01, 0x1e, 0xfc, 0x00, 0x46, 0xf6, 0x00, 0x8c, 0x81, 0x00, 0xcc, 0x93, - 0xff, 0x3e, 0xe4, 0xfe, 0x69, 0x6b, 0xfe, 0x64, 0xaf, 0xfe, 0x02, 0x18, 0xff, 0xde, 0xfc, 0xfe, - 0x5d, 0x0b, 0xff, 0x98, 0xfc, 0xfe, 0xe8, 0x7b, 0x07, 0x80, 0x99, 0x09, 0x89, 0x79, 0x06, 0xf5, - 0xaa, 0x07, 0x3f, 0x3c, 0x07, 0xb9, 0xf3, 0x05, 0xd2, 0xad, 0x03, 0x4f, 0x7d, 0x01, 0x90, 0xfa, - 0x00, 0x39, 0x01, 0x01, 0xf6, 0x47, 0x01, 0xc3, 0x89, 0x00, 0xcb, 0x14, 0x00, 0xd5, 0x7a, 0x00, - 0x8a, 0xdb, 0x00, 0x55, 0x05, 0x00, 0xfd, 0xf6, 0xff, 0x7d, 0x2c, 0x01, 0xdb, 0xfe, 0x01, 0xf6, - 0x50, 0x02, 0x16, 0x97, 0x01, 0x87, 0x50, 0x00, 0xd4, 0x54, 0xff, 0xd8, 0x02, 0xff, 0xf5, 0xda, - 0xfe, 0x25, 0xc8, 0xfe, 0x49, 0xf6, 0xfe, 0x48, 0xff, 0xfe, 0x73, 0xe2, 0xfe, 0x3f, 0xea, 0xfe, - 0xf4, 0xc0, 0xfe, 0xd8, 0xb2, 0xfe, 0x59, 0x72, 0x06, 0x08, 0x9a, 0x09, 0x35, 0xc6, 0x07, 0x9c, - 0x22, 0x08, 0x25, 0x34, 0x07, 0x06, 0xaa, 0x05, 0xb7, 0xd6, 0x02, 0x64, 0x0d, 0x01, 0x35, 0xf3, - 0x00, 0x4b, 0xcb, 0x00, 0x48, 0x58, 0x01, 0x74, 0x77, 0x01, 0xdc, 0x02, 0x01, 0x1e, 0x50, 0x00, - 0x1a, 0xb1, 0xff, 0x16, 0xc2, 0xff, 0x93, 0xcd, 0x00, 0x01, 0x52, 0x01, 0x97, 0x03, 0x02, 0x43, - 0x9c, 0x02, 0xf2, 0xcf, 0x01, 0xba, 0x8f, 0x00, 0xc9, 0x1a, 0xff, 0x52, 0x3b, 0xfe, 0x27, 0x8e, - 0xfe, 0x53, 0xc8, 0xfe, 0xf5, 0x0e, 0xff, 0xd3, 0x29, 0xff, 0xdf, 0xe4, 0xfe, 0x56, 0x18, 0xff, - 0x6a, 0xcb, 0xfe, 0x5b, 0x89, 0xfe, 0xc2, 0xb4, 0x07, 0x05, 0xb5, 0x0a, 0x9c, 0x5c, 0x06, 0x61, - 0x65, 0x07, 0x38, 0xc5, 0x05, 0x4f, 0x49, 0x04, 0x9f, 0x8c, 0x03, 0x67, 0x0e, 0x01, 0xf6, 0x53, - 0x00, 0xd7, 0xc7, 0x01, 0x24, 0x25, 0x02, 0xb8, 0x4e, 0x01, 0x35, 0x71, 0x01, 0x60, 0x8b, 0xff, - 0x3e, 0x37, 0xff, 0x6c, 0x7f, 0x00, 0x0c, 0xd1, 0x00, 0xe2, 0x10, 0x01, 0xaa, 0xff, 0x01, 0x4a, - 0xb6, 0x02, 0xa1, 0xad, 0x01, 0x50, 0xb3, 0x00, 0x04, 0x25, 0xff, 0x7a, 0x1c, 0xfe, 0xf2, 0x97, - 0xfe, 0xb8, 0xaf, 0xfe, 0xe5, 0x72, 0xfe, 0xcf, 0x40, 0xff, 0x16, 0x42, 0xff, 0xcd, 0xdf, 0xfe, - 0x7a, 0x15, 0xff, 0xf7, 0xa2, 0xfe, 0x1d, 0x98, 0x07, 0x6a, 0x0d, 0x0a, 0x3a, 0x7f, 0x05, 0x68, - 0x45, 0x06, 0x6e, 0x1a, 0x05, 0x6a, 0x85, 0x04, 0x8c, 0x68, 0x03, 0xfa, 0x6b, 0x01, 0x75, 0xfa, - 0x00, 0xa9, 0xcc, 0x01, 0x72, 0x08, 0x02, 0xb9, 0xc8, 0x01, 0x92, 0xda, 0x01, 0xf9, 0xf7, 0xff, - 0xac, 0x38, 0x00, 0xca, 0xbf, 0x00, 0xde, 0x7b, 0x00, 0x1f, 0xa0, 0x00, 0x3f, 0x1b, 0x01, 0xc5, - 0xad, 0x01, 0x38, 0x59, 0x02, 0x1f, 0xcb, 0x02, 0xb1, 0x3e, 0x00, 0x50, 0xbe, 0xfe, 0x98, 0x75, - 0xfe, 0x43, 0xff, 0xfd, 0x49, 0xdc, 0xfe, 0x55, 0x28, 0xff, 0x94, 0x09, 0xff, 0xcf, 0x26, 0xff, - 0xf7, 0x42, 0xff, 0xfd, 0xea, 0xfe, 0xf3, 0x9f, 0x08, 0x7e, 0x26, 0x0b, 0xc9, 0xef, 0x04, 0x40, - 0xe1, 0x04, 0xf6, 0xec, 0x03, 0xa0, 0xd6, 0x03, 0x5b, 0x4c, 0x03, 0x62, 0x0a, 0x01, 0xd6, 0xe0, - 0xff, 0x3f, 0xb7, 0x01, 0xd9, 0x2f, 0x03, 0x1c, 0xe5, 0x01, 0x42, 0xf5, 0x00, 0xa6, 0x06, 0x01, - 0xab, 0xc5, 0x00, 0x41, 0x4a, 0x00, 0x1a, 0xd0, 0x01, 0x9a, 0xca, 0x00, 0x88, 0x60, 0x00, 0x05, - 0x60, 0x01, 0xe2, 0xde, 0x00, 0x9e, 0xbc, 0x01, 0xb2, 0x6d, 0x02, 0xd0, 0x8f, 0x01, 0xd5, 0xca, - 0xfe, 0xdf, 0xc7, 0xfd, 0x63, 0x44, 0xfe, 0x0a, 0xbc, 0xfe, 0x40, 0x41, 0xff, 0xc3, 0x58, 0xff, - 0xae, 0x5f, 0xff, 0x4c, 0x03, 0xff, 0xff, 0x84, 0x0a, 0xed, 0x83, 0x0d, 0x74, 0xd3, 0x04, 0x66, - 0xc0, 0x04, 0x82, 0x3a, 0x02, 0x5e, 0x01, 0x02, 0x6b, 0x56, 0x03, 0xd2, 0x6a, 0x00, 0x4f, 0x7a, - 0xfe, 0x94, 0xbc, 0x00, 0x66, 0x9d, 0x03, 0x23, 0xed, 0x01, 0x66, 0x9e, 0x01, 0xe6, 0xfa, 0x00, - 0xa2, 0xe2, 0xff, 0x5a, 0x4f, 0x01, 0xe3, 0xe7, 0x01, 0xe2, 0xeb, 0x00, 0x5e, 0xc5, 0x01, 0xdd, - 0x36, 0x01, 0x28, 0xd5, 0xff, 0xba, 0x64, 0x01, 0x94, 0x96, 0x01, 0xb9, 0x5e, 0x01, 0x0c, 0x75, - 0x01, 0x08, 0x9b, 0xff, 0x5a, 0x19, 0xfe, 0xc3, 0x85, 0xfe, 0x4d, 0x21, 0xff, 0x08, 0x2a, 0xff, - 0x57, 0x6d, 0xff, 0x81, 0x52, 0xff, 0x06, 0x2f, 0x0c, 0xb3, 0x85, 0x0e, 0x5b, 0xd5, 0x04, 0x86, - 0xa6, 0x05, 0x6a, 0xea, 0x02, 0x6d, 0x6f, 0x02, 0x14, 0x5b, 0x02, 0x8e, 0xd6, 0xfd, 0x9b, 0x8a, - 0xfb, 0x1e, 0x84, 0x00, 0xcb, 0xee, 0x04, 0x68, 0xf5, 0x00, 0x2c, 0x19, 0x01, 0xde, 0xad, 0x00, - 0x57, 0xd6, 0xff, 0x86, 0x81, 0x01, 0x9a, 0xed, 0x00, 0xb1, 0x6e, 0x01, 0x3a, 0xc5, 0x02, 0x43, - 0x48, 0x01, 0xb4, 0x60, 0x00, 0xf8, 0xcd, 0x00, 0xb4, 0xf4, 0xff, 0x52, 0x1e, 0x01, 0x79, 0x46, - 0x01, 0x0f, 0x3d, 0x00, 0xd6, 0xad, 0x00, 0x95, 0xe2, 0xff, 0x10, 0x60, 0xfe, 0xb9, 0x42, 0xfe, - 0x86, 0x6a, 0xff, 0x4f, 0x53, 0xff, 0xb3, 0xcd, 0x0e, 0x52, 0xfc, 0x10, 0x72, 0x42, 0x04, 0xa9, - 0x16, 0x06, 0x4d, 0x20, 0x03, 0x60, 0x4f, 0x02, 0x91, 0xc5, 0x01, 0x25, 0xd8, 0xfb, 0x07, 0x92, - 0xf9, 0x50, 0x6a, 0x00, 0x80, 0xd9, 0x05, 0x53, 0x47, 0x00, 0xeb, 0x84, 0xff, 0xbf, 0x14, 0xff, - 0xe2, 0x8e, 0xff, 0xd6, 0xca, 0x01, 0x36, 0xbb, 0x01, 0xd8, 0x6e, 0x01, 0xaa, 0x8a, 0x01, 0x40, - 0x88, 0x01, 0xe5, 0x60, 0x00, 0x4f, 0x30, 0x01, 0xe8, 0xf5, 0x00, 0x8e, 0x27, 0x00, 0xc5, 0xe5, - 0xff, 0x90, 0xe3, 0xff, 0xe4, 0xc2, 0x00, 0x21, 0xfd, 0x00, 0x74, 0x44, 0x00, 0xc5, 0x25, 0xff, - 0xff, 0x82, 0xfe, 0x52, 0x8f, 0xfe, 0xe7, 0x11, 0x12, 0xfc, 0x4b, 0x14, 0xaa, 0x9d, 0x03, 0xf7, - 0xfa, 0x05, 0x1e, 0x76, 0x02, 0xf5, 0xf4, 0x01, 0xa8, 0x42, 0x02, 0xb0, 0x2a, 0xfa, 0x34, 0x49, - 0xf7, 0x62, 0xd1, 0x00, 0x73, 0xcc, 0x06, 0x9b, 0x45, 0xff, 0xcc, 0xca, 0xfe, 0xcd, 0x07, 0xfe, - 0xd7, 0x60, 0xfe, 0xe0, 0x68, 0x01, 0x79, 0x85, 0x01, 0x74, 0x55, 0x01, 0xd4, 0x3f, 0x02, 0x45, - 0x29, 0x01, 0xd3, 0xf2, 0xfe, 0xc5, 0xb0, 0x01, 0x2b, 0x0f, 0x01, 0x76, 0x5e, 0x00, 0xa4, 0x9f, - 0x00, 0x20, 0xbe, 0xfe, 0xa4, 0xa5, 0xff, 0x1b, 0x17, 0x01, 0xe5, 0x95, 0x00, 0x31, 0xfb, 0xff, - 0x0e, 0x82, 0x00, 0x25, 0xa1, 0xff, 0x82, 0x31, 0x16, 0x8a, 0x2e, 0x17, 0x56, 0x43, 0x02, 0x43, - 0x2f, 0x06, 0x01, 0x65, 0x02, 0x9d, 0xe9, 0x01, 0x27, 0xdc, 0x01, 0x75, 0xeb, 0xf7, 0xb1, 0xb8, - 0xf5, 0x84, 0x36, 0x02, 0x03, 0x5a, 0x07, 0x8f, 0x41, 0xfe, 0xed, 0x46, 0xfe, 0xd2, 0xab, 0xfc, - 0xb1, 0xf2, 0xfd, 0x5a, 0x4b, 0x01, 0x1c, 0xab, 0x00, 0xb5, 0x24, 0x01, 0x09, 0x0c, 0x02, 0x91, - 0x44, 0x00, 0xe8, 0x22, 0xff, 0x20, 0x7d, 0x01, 0xad, 0xda, 0xff, 0x32, 0xf9, 0x00, 0x50, 0x73, - 0x00, 0x28, 0xb0, 0xfe, 0x2d, 0x16, 0x00, 0x81, 0x9b, 0xff, 0x13, 0xe8, 0xff, 0x68, 0xf6, 0x00, - 0xd8, 0x78, 0x01, 0x6d, 0x49, 0x00, 0x02, 0x6f, 0x1a, 0xd8, 0x14, 0x1a, 0xbe, 0xd0, 0x00, 0x66, - 0xa3, 0x06, 0x0d, 0x9b, 0x02, 0xee, 0xef, 0x01, 0xf3, 0x2b, 0x01, 0x46, 0xf8, 0xf4, 0x71, 0x6a, - 0xf4, 0x9d, 0x7b, 0x04, 0x97, 0xfe, 0x07, 0x2f, 0x39, 0xfd, 0xe6, 0xe7, 0xfd, 0xae, 0x31, 0xfb, - 0xa5, 0x79, 0xfd, 0x37, 0x79, 0x01, 0x33, 0x7c, 0x00, 0x15, 0xea, 0x00, 0x41, 0x5c, 0x01, 0x5c, - 0xa0, 0xff, 0xcd, 0x9e, 0xfe, 0x2f, 0x84, 0x01, 0x34, 0xe3, 0xff, 0xfd, 0x01, 0x00, 0x2e, 0xc5, - 0xff, 0x63, 0x86, 0xfe, 0x97, 0x86, 0xff, 0x70, 0x7e, 0x00, 0x41, 0x4b, 0x00, 0x28, 0xd7, 0xff, - 0x87, 0x49, 0x01, 0x76, 0xf6, 0x00, 0x02, 0xec, 0x1e, 0xbe, 0x62, 0x1d, 0x65, 0x89, 0xff, 0x97, - 0xd8, 0x06, 0x1a, 0xed, 0x01, 0x8b, 0xa1, 0x01, 0xd2, 0xac, 0x00, 0xd5, 0x1c, 0xf2, 0xfe, 0xd7, - 0xf3, 0x3f, 0x65, 0x06, 0x04, 0xf2, 0x07, 0xe3, 0xbc, 0xfc, 0x18, 0xc7, 0xfd, 0x3e, 0xbc, 0xf9, - 0x3d, 0xfd, 0xfc, 0xc8, 0x68, 0x01, 0x3d, 0x61, 0x00, 0x1c, 0x33, 0x01, 0x4a, 0xd5, 0x00, 0x21, - 0xa1, 0xfe, 0xb5, 0x2f, 0xfe, 0x10, 0x78, 0x01, 0x43, 0x90, 0xff, 0x25, 0xe6, 0xff, 0x3c, 0xa2, - 0xfe, 0x14, 0x86, 0xfd, 0x10, 0x7e, 0xff, 0x70, 0x81, 0x00, 0x8a, 0x08, 0x00, 0x24, 0xfa, 0xff, - 0x67, 0xc9, 0x01, 0xc1, 0x4f, 0x00, 0x2c, 0x7e, 0x22, 0xd5, 0x3c, 0x21, 0x91, 0x0f, 0xff, 0x78, - 0xce, 0x06, 0x7c, 0x37, 0x01, 0xe5, 0x7e, 0x00, 0xc4, 0x6d, 0x00, 0xf7, 0xd3, 0xef, 0x63, 0x99, - 0xf3, 0x07, 0x97, 0x07, 0xd5, 0x27, 0x07, 0x70, 0xa3, 0xfc, 0x66, 0xd9, 0xfd, 0xf4, 0x10, 0xf9, - 0x00, 0x3c, 0xfc, 0x91, 0xbf, 0x00, 0x32, 0x87, 0x00, 0x68, 0x7f, 0x01, 0x48, 0x59, 0x00, 0xdd, - 0x20, 0xfe, 0xd3, 0x9c, 0xfd, 0x66, 0x82, 0x01, 0x1b, 0xf8, 0xfe, 0x96, 0x06, 0xff, 0x06, 0xd3, - 0xfe, 0x6a, 0x2c, 0xfd, 0x8f, 0xe5, 0xfe, 0x7a, 0xad, 0xff, 0xfb, 0xcc, 0xff, 0xff, 0x48, 0x00, - 0x04, 0x60, 0x01, 0x18, 0x5f, 0x00, 0x24, 0x62, 0x24, 0xf2, 0xcf, 0x25, 0xf6, 0x4b, 0x00, 0xbc, - 0x58, 0x06, 0x45, 0x5e, 0x01, 0x38, 0x88, 0xfe, 0xbb, 0xd8, 0xff, 0xbf, 0x18, 0xef, 0xa8, 0x8c, - 0xf3, 0x96, 0xe9, 0x07, 0xcf, 0x06, 0x06, 0xc4, 0xc9, 0xfc, 0xfa, 0xd8, 0xfd, 0xfa, 0x3c, 0xf9, - 0xac, 0x00, 0xfc, 0x2b, 0x7a, 0xff, 0xa0, 0x42, 0x00, 0x55, 0x4b, 0x02, 0x04, 0x19, 0x00, 0x41, - 0x06, 0xfe, 0x0b, 0x1f, 0xfd, 0x1a, 0x74, 0x00, 0x5c, 0xd7, 0xff, 0xab, 0xb5, 0xfe, 0xde, 0x10, - 0xfe, 0x34, 0x24, 0xfd, 0x02, 0x31, 0xfe, 0x0f, 0x19, 0x00, 0x78, 0x75, 0xff, 0x0a, 0x58, 0xff, - 0x70, 0x75, 0x01, 0x6a, 0xfa, 0xff, 0xd9, 0xce, 0x23, 0x0a, 0x1c, 0x2a, 0xeb, 0x50, 0x04, 0x75, - 0x5e, 0x05, 0xa5, 0xd8, 0x01, 0x21, 0xe2, 0xfc, 0x5a, 0x24, 0xfe, 0x24, 0x51, 0xef, 0xde, 0x94, - 0xf3, 0xdf, 0xe5, 0x06, 0xf0, 0xff, 0x04, 0xef, 0x26, 0xfd, 0x3b, 0x49, 0xfd, 0xa2, 0xa9, 0xf9, - 0x4a, 0xf6, 0xfb, 0x54, 0x3b, 0xfe, 0x47, 0xdd, 0xff, 0x24, 0x73, 0x02, 0xa8, 0x54, 0x00, 0x84, - 0x73, 0xfd, 0xf4, 0xbb, 0xfc, 0x75, 0x7f, 0x00, 0x9c, 0xd5, 0xff, 0x7e, 0xa0, 0xfe, 0xb4, 0x48, - 0xfd, 0x01, 0x1f, 0xfd, 0x6f, 0xfb, 0xfd, 0xba, 0x58, 0xff, 0x20, 0x4a, 0xff, 0xba, 0xc4, 0xfe, - 0x67, 0x52, 0x01, 0x4e, 0x8a, 0x00, 0x83, 0x90, 0x22, 0xff, 0x62, 0x2c, 0xb0, 0x09, 0x0a, 0x8b, - 0x0a, 0x06, 0x0e, 0xb4, 0x01, 0x8a, 0x46, 0xfc, 0xe5, 0x95, 0xfc, 0x19, 0x6d, 0xef, 0x03, 0x81, - 0xf3, 0x9c, 0x4d, 0x05, 0xd2, 0xeb, 0x03, 0x09, 0x21, 0xfe, 0x64, 0xb8, 0xfc, 0xf4, 0xa7, 0xf9, - 0x0f, 0x85, 0xfc, 0x90, 0xde, 0xfc, 0xe8, 0x83, 0xff, 0x7d, 0x79, 0x02, 0x2c, 0x85, 0xff, 0x22, - 0x1b, 0xff, 0x3a, 0xce, 0xfc, 0xf1, 0x00, 0xff, 0xb3, 0xf8, 0xff, 0xc0, 0x74, 0xfe, 0xb1, 0xd7, - 0xfd, 0xd3, 0x05, 0xfd, 0xb2, 0x0b, 0xfd, 0xb8, 0x62, 0xfe, 0x51, 0x09, 0xff, 0xac, 0x7b, 0xff, - 0x79, 0xbc, 0x01, 0x09, 0x4b, 0x00, 0x60, 0x05, 0x23, 0xc2, 0x38, 0x2c, 0xee, 0xd0, 0x0d, 0x91, - 0x81, 0x09, 0x3f, 0x01, 0x01, 0x95, 0x28, 0xfc, 0x4a, 0x3a, 0xfc, 0x05, 0x7b, 0xef, 0x2d, 0xee, - 0xf3, 0xb8, 0xf0, 0x02, 0x94, 0xbe, 0x01, 0x76, 0xb5, 0xff, 0xe2, 0x99, 0xfc, 0x64, 0x32, 0xf9, - 0x0b, 0x40, 0xfd, 0x16, 0xf2, 0xfb, 0x1d, 0x39, 0xfe, 0x6e, 0x17, 0x03, 0xf9, 0x1b, 0x00, 0x8d, - 0x79, 0xfe, 0x37, 0xa1, 0xfd, 0xd3, 0x0d, 0xff, 0x61, 0x06, 0x00, 0x82, 0x2f, 0xfe, 0xc1, 0x1d, - 0xfd, 0x25, 0x02, 0xfd, 0x0b, 0x47, 0xfc, 0x24, 0xb6, 0xfe, 0x46, 0xc4, 0xff, 0x43, 0x55, 0xff, - 0xde, 0xfb, 0x00, 0x83, 0x5e, 0x00, 0x98, 0xba, 0x24, 0x54, 0x29, 0x2b, 0xef, 0x9d, 0x0e, 0xa1, - 0x6a, 0x0e, 0xdb, 0x39, 0x01, 0x48, 0x05, 0xfb, 0x15, 0x1a, 0xfc, 0x01, 0xbe, 0xef, 0xa7, 0x54, - 0xf5, 0x65, 0x59, 0x00, 0x54, 0x24, 0xfd, 0x82, 0xd3, 0x00, 0x52, 0x49, 0xfd, 0x55, 0x5c, 0xf9, - 0x64, 0x53, 0xfe, 0xcb, 0x78, 0xf9, 0x2b, 0x6a, 0xfe, 0x69, 0xd7, 0x03, 0x64, 0x1d, 0xff, 0x31, - 0x37, 0xff, 0x4e, 0xec, 0xfd, 0xb2, 0x8b, 0xfe, 0xc9, 0x1a, 0x00, 0x68, 0x30, 0xfe, 0xcd, 0x43, - 0xfc, 0x47, 0x54, 0xfd, 0x72, 0x75, 0xfc, 0x73, 0xf8, 0xfd, 0x62, 0xdd, 0xfe, 0x84, 0x5e, 0xff, - 0x38, 0xf0, 0x01, 0x64, 0x66, 0x00, 0x95, 0xc7, 0x27, 0x03, 0xeb, 0x29, 0xe1, 0x44, 0x0d, 0xa7, - 0xd2, 0x12, 0x71, 0x4b, 0x02, 0x65, 0x52, 0xfa, 0x2a, 0x28, 0xfc, 0xe4, 0x7c, 0xf0, 0x14, 0xc7, - 0xf7, 0x2c, 0xf6, 0xfe, 0x14, 0x6b, 0xf6, 0x6d, 0xa3, 0x00, 0xa5, 0x1e, 0xff, 0x78, 0x0f, 0xf8, - 0x66, 0x85, 0x00, 0x64, 0x8b, 0xf9, 0x1d, 0x99, 0xfc, 0x74, 0x95, 0x04, 0x57, 0x2b, 0xff, 0xa3, - 0x62, 0xff, 0x80, 0x4c, 0xfe, 0x62, 0xb9, 0xfd, 0x80, 0x21, 0x00, 0x02, 0x78, 0xfe, 0xc8, 0xf1, - 0xfb, 0xab, 0x02, 0xfe, 0x55, 0x4a, 0xfc, 0x33, 0x0f, 0xfd, 0x51, 0xf1, 0xfe, 0x5e, 0x5d, 0xff, - 0xfe, 0x4f, 0x01, 0xea, 0xc0, 0xff, 0xf4, 0xcc, 0x2c, 0x02, 0x55, 0x28, 0xd2, 0xf7, 0x09, 0x7a, - 0xf4, 0x16, 0xb7, 0xfe, 0x01, 0x63, 0x4a, 0xfa, 0x76, 0xa1, 0xfc, 0xf3, 0x00, 0xf1, 0x58, 0xa8, - 0xfb, 0xf8, 0x03, 0xfe, 0x98, 0xd0, 0xee, 0xb1, 0xc1, 0xff, 0xe3, 0x40, 0x00, 0x12, 0xda, 0xf6, - 0x5a, 0x04, 0x03, 0x31, 0x42, 0xf9, 0xe8, 0x5e, 0xfc, 0x42, 0x7b, 0x05, 0xd3, 0xcd, 0xfd, 0x93, - 0xf8, 0xfe, 0xb2, 0x6e, 0xff, 0x70, 0xf1, 0xfd, 0x2a, 0xcb, 0xff, 0x13, 0x74, 0xfe, 0x77, 0x2b, - 0xfb, 0xe7, 0x3d, 0xfe, 0x16, 0x0d, 0xfd, 0x25, 0xf2, 0xfc, 0x89, 0xe4, 0xfd, 0xeb, 0xc5, 0xfe, - 0x18, 0x51, 0x01, 0x80, 0x95, 0xff, 0xfc, 0x0b, 0x32, 0x58, 0x23, 0x27, 0x97, 0x38, 0x05, 0x0c, - 0x96, 0x1b, 0x67, 0x0e, 0x01, 0xaf, 0x85, 0xf9, 0xd5, 0xc6, 0xfe, 0xef, 0xa9, 0xf1, 0xd7, 0xfa, - 0xff, 0xf0, 0x3d, 0xff, 0xf2, 0xb2, 0xe6, 0x83, 0x05, 0xfc, 0x4b, 0xe8, 0x03, 0xd8, 0x2e, 0xf5, - 0x53, 0xdf, 0x03, 0x58, 0x54, 0xfb, 0xf0, 0x2d, 0xfb, 0x56, 0xb0, 0x05, 0xec, 0x3f, 0xfd, 0x8d, - 0xa0, 0xfe, 0xff, 0xc0, 0x00, 0x09, 0x7d, 0xfe, 0xab, 0x0e, 0xff, 0x0f, 0x7b, 0xfe, 0xc6, 0x25, - 0xfb, 0x82, 0x4b, 0xfe, 0x6b, 0xf8, 0xfc, 0xde, 0x3c, 0xfc, 0x38, 0x9b, 0xfd, 0x4a, 0x4a, 0xff, - 0x1c, 0x74, 0x01, 0x48, 0x26, 0xfe, 0x33, 0xda, 0x37, 0x14, 0x41, 0x27, 0xeb, 0x30, 0xfe, 0x16, - 0x0b, 0x20, 0xb2, 0x86, 0x00, 0x97, 0x23, 0xf6, 0xe7, 0x77, 0x01, 0xf3, 0xae, 0xf1, 0xa8, 0x53, - 0x05, 0x9d, 0x9c, 0x02, 0x72, 0x15, 0xde, 0x5c, 0x4e, 0xf6, 0x43, 0x4b, 0x07, 0xcd, 0x01, 0xf6, - 0xf7, 0x57, 0x03, 0x50, 0x2e, 0xfc, 0xaa, 0xa5, 0xfa, 0x02, 0xb2, 0x05, 0x91, 0x5d, 0xfd, 0x2f, - 0xb5, 0xfd, 0x9a, 0xfa, 0x00, 0xe0, 0x98, 0xff, 0x33, 0x09, 0xff, 0x3e, 0xa3, 0xfe, 0xd5, 0x8e, - 0xfa, 0xd0, 0x02, 0xfd, 0xca, 0x34, 0xfd, 0x54, 0xd2, 0xfc, 0x26, 0x22, 0xfd, 0x19, 0x98, 0xfe, - 0x1f, 0x9b, 0x00, 0xe0, 0xb9, 0xfd, 0x81, 0xb2, 0x3d, 0x99, 0x51, 0x2a, 0xd9, 0x98, 0xf5, 0xaf, - 0xe5, 0x20, 0x0a, 0x84, 0x02, 0xa2, 0x2e, 0xf3, 0xc8, 0x22, 0x04, 0xd6, 0x67, 0xf1, 0xf3, 0xb7, - 0x09, 0x96, 0x23, 0x08, 0x9c, 0xd8, 0xd8, 0x61, 0xfd, 0xee, 0x9b, 0x02, 0x09, 0xb4, 0x9a, 0xf8, - 0xde, 0x8b, 0x02, 0x02, 0xc6, 0xfd, 0x00, 0x38, 0xfa, 0xf3, 0x05, 0x05, 0x4d, 0x97, 0xfd, 0xb8, - 0xf8, 0xfc, 0x22, 0x76, 0x00, 0xb7, 0x97, 0x01, 0x20, 0xc8, 0xff, 0xd9, 0x70, 0xfd, 0xa9, 0x42, - 0xfa, 0x83, 0xc4, 0xfc, 0x46, 0xd7, 0xfd, 0x7f, 0xef, 0xfc, 0xd4, 0x28, 0xfb, 0xbe, 0x61, 0xfe, - 0x95, 0x1e, 0x02, 0xbd, 0x6e, 0xfd, 0xa9, 0x2c, 0x46, 0x47, 0x6e, 0x2e, 0x6b, 0xac, 0xeb, 0xa0, - 0x7b, 0x1c, 0x34, 0x01, 0x04, 0x46, 0xcf, 0xf2, 0x28, 0x6d, 0x07, 0x61, 0xe3, 0xef, 0xad, 0x50, - 0x0a, 0x96, 0x48, 0x0e, 0x6d, 0x6e, 0xd7, 0x02, 0x70, 0xe8, 0x3b, 0x96, 0x07, 0x4b, 0xef, 0xfb, - 0x71, 0xf9, 0x02, 0xcc, 0xe9, 0xfe, 0xc6, 0x80, 0xf9, 0x18, 0x74, 0x03, 0x3a, 0xd4, 0xfd, 0x20, - 0x14, 0xfc, 0x2b, 0x4f, 0x00, 0x94, 0x93, 0x02, 0xb2, 0xd3, 0xff, 0xfa, 0x65, 0xfc, 0xb7, 0x79, - 0xfa, 0x73, 0x62, 0xfc, 0xaf, 0xcf, 0xfc, 0xd5, 0x10, 0xfd, 0xe3, 0x13, 0xfb, 0x79, 0xba, 0xfe, - 0x75, 0xa3, 0x02, 0xce, 0xd1, 0xfc, 0x44, 0x42, 0x4e, 0xeb, 0x4c, 0x31, 0xad, 0xf3, 0xe3, 0x03, - 0xbb, 0x18, 0x9f, 0x2a, 0x04, 0xd1, 0xfb, 0xf2, 0xf6, 0x57, 0x0a, 0x4a, 0x74, 0xed, 0xce, 0xdc, - 0x0a, 0x37, 0xe2, 0x16, 0xb1, 0x9a, 0xd5, 0xa7, 0x20, 0xe3, 0xaf, 0x13, 0x06, 0x70, 0x5f, 0xfe, - 0xf9, 0xbd, 0x04, 0x02, 0xb4, 0xfe, 0xa5, 0x65, 0xf9, 0x89, 0x6a, 0x01, 0xa1, 0x2b, 0xfe, 0x0c, - 0x12, 0xfc, 0x4d, 0xd7, 0xff, 0x9c, 0x56, 0x02, 0x62, 0x08, 0x00, 0xa4, 0x68, 0xfc, 0x55, 0xaa, - 0xf9, 0x65, 0x8b, 0xfb, 0xfa, 0x3b, 0xfc, 0x4c, 0x75, 0xfe, 0x3d, 0x81, 0xfb, 0xd7, 0x9a, 0xfe, - 0x55, 0xab, 0x02, 0xd2, 0xcb, 0xfc, 0xd4, 0xa1, 0x56, 0xfe, 0x50, 0x36, 0xf8, 0x11, 0xdb, 0x36, - 0xf0, 0x10, 0x3e, 0x2d, 0x01, 0xac, 0xf4, 0xf7, 0xea, 0xd6, 0x0e, 0x8c, 0xf2, 0xe7, 0xbc, 0xba, - 0x09, 0x57, 0xad, 0x1c, 0xd7, 0x2f, 0xd6, 0x8b, 0xaf, 0xe1, 0x7a, 0xe3, 0x03, 0x40, 0xaa, 0xfd, - 0x50, 0xff, 0x05, 0x35, 0x81, 0xff, 0x4a, 0xa1, 0xf8, 0xa3, 0xb4, 0xff, 0xb9, 0x39, 0xfe, 0x98, - 0x72, 0xfb, 0x86, 0xcf, 0xfe, 0xab, 0x5d, 0x02, 0x2c, 0xd8, 0xff, 0xcb, 0x67, 0xfb, 0x82, 0x97, - 0xf8, 0x76, 0xe0, 0xfa, 0xb0, 0x42, 0xfc, 0x66, 0xb9, 0xff, 0x8f, 0xce, 0xfb, 0xd2, 0x33, 0xfe, - 0x06, 0x09, 0x03, 0xdb, 0x17, 0xfd, 0x0f, 0x1a, 0x5f, 0xc6, 0x00, 0x3a, 0x1b, 0xc7, 0xd4, 0xc4, - 0x45, 0x0b, 0x56, 0x20, 0xfd, 0xf6, 0xd9, 0xfe, 0x0d, 0x07, 0x11, 0x86, 0x48, 0xe3, 0x08, 0x43, - 0x0b, 0xc4, 0x52, 0x20, 0xa6, 0x8b, 0xda, 0x3f, 0x6f, 0xe1, 0xc2, 0xf6, 0x00, 0x4f, 0xc4, 0xfb, - 0x9c, 0xe9, 0x07, 0xfa, 0x4a, 0x02, 0xda, 0xad, 0xf7, 0xf5, 0xd8, 0xfd, 0xfc, 0x7d, 0xfe, 0x75, - 0xb7, 0xfb, 0x6f, 0x04, 0xfe, 0xf4, 0x7f, 0x02, 0x7d, 0x0b, 0xff, 0xf1, 0x88, 0xfb, 0x64, 0x5a, - 0xf8, 0xda, 0x21, 0xfa, 0xd2, 0xac, 0xfc, 0x2b, 0xc3, 0x00, 0xf7, 0x4f, 0xfc, 0xec, 0x87, 0xfe, - 0xf5, 0x22, 0x04, 0xa7, 0xbd, 0xfc, 0xbf, 0x23, 0x66, 0xb3, 0xe9, 0x3c, 0x00, 0xf0, 0xcf, 0x09, - 0x73, 0x06, 0x24, 0x07, 0xf9, 0x83, 0xb7, 0x03, 0xf1, 0xbb, 0x10, 0x2b, 0xf7, 0xe0, 0xf4, 0x82, - 0x0b, 0x57, 0x5e, 0x23, 0x59, 0xf4, 0xdf, 0x3b, 0xde, 0xdf, 0xf6, 0xc3, 0xfe, 0xb3, 0xa4, 0xf8, - 0x3d, 0x3e, 0x0a, 0xa2, 0x97, 0x04, 0xa7, 0x64, 0xf5, 0xd1, 0xda, 0xfc, 0x65, 0xf9, 0xfe, 0x5d, - 0x87, 0xfb, 0xf1, 0xa6, 0xfc, 0x0f, 0x1b, 0x02, 0xe6, 0x3f, 0xfe, 0xda, 0x95, 0xfc, 0x4e, 0xad, - 0xf7, 0x14, 0xbd, 0xf8, 0x48, 0x1d, 0xfd, 0x2e, 0x72, 0x01, 0xff, 0xf5, 0xfc, 0xdf, 0x0a, 0xff, - 0xca, 0x2d, 0x04, 0x0a, 0xfc, 0xfb, 0xef, 0x0a, 0x6c, 0x60, 0x47, 0x3f, 0xd0, 0xf7, 0xcc, 0x8a, - 0xd1, 0x02, 0x90, 0x82, 0xf5, 0xcf, 0x3f, 0x06, 0xd5, 0xd2, 0x0f, 0x4d, 0x32, 0xe1, 0x4a, 0xc3, - 0x09, 0x48, 0xdb, 0x25, 0xe7, 0xb6, 0xe6, 0x84, 0x45, 0xde, 0x03, 0x6a, 0xfd, 0x75, 0xfc, 0xf4, - 0x76, 0xd5, 0x0b, 0xa4, 0xc6, 0x06, 0x9f, 0x82, 0xf3, 0xee, 0xad, 0xfc, 0x7e, 0xb0, 0xff, 0xda, - 0x53, 0xfa, 0x5c, 0x6b, 0xfb, 0x61, 0x72, 0x02, 0xcb, 0xb3, 0xfd, 0x03, 0x8f, 0xfd, 0x2c, 0xde, - 0xf6, 0xa2, 0x98, 0xf7, 0xd7, 0x98, 0xfd, 0x8d, 0x04, 0x02, 0x8a, 0xc5, 0xfd, 0xe1, 0x31, 0xff, - 0x99, 0x6d, 0x03, 0x11, 0x0c, 0xfc, 0x6e, 0x90, 0x6e, 0x72, 0x73, 0x43, 0x03, 0x74, 0xcb, 0xfa, - 0x03, 0x00, 0x40, 0xa1, 0xf2, 0x1c, 0x0b, 0x06, 0xfa, 0x14, 0x0f, 0xd2, 0x53, 0xe2, 0x4c, 0x9b, - 0x05, 0x97, 0xf5, 0x27, 0x06, 0x6a, 0xef, 0x0e, 0x6a, 0xdc, 0xd7, 0xc5, 0xfb, 0x8f, 0x57, 0xf1, - 0xc4, 0x9b, 0x0b, 0xba, 0x90, 0x09, 0x0b, 0x6e, 0xf2, 0x95, 0x7a, 0xfc, 0xe6, 0xfd, 0xff, 0xd1, - 0xca, 0xf8, 0xba, 0x6f, 0xfa, 0x62, 0x3e, 0x03, 0x8e, 0x93, 0xfc, 0xec, 0x20, 0xfe, 0xc2, 0xf0, - 0xf6, 0xc7, 0x8e, 0xf6, 0x9c, 0xcb, 0xfd, 0xf7, 0x60, 0x02, 0x45, 0x24, 0xfe, 0x1c, 0xc2, 0xfe, - 0x0c, 0xe2, 0x02, 0xb1, 0x1c, 0xfc, 0x4b, 0xfe, 0x71, 0x97, 0x2d, 0x44, 0x04, 0xc4, 0xcc, 0x58, - 0xab, 0xfe, 0x1f, 0x87, 0xef, 0xf5, 0x9f, 0x05, 0x97, 0x7a, 0x0d, 0xe2, 0xca, 0xe2, 0x18, 0x00, - 0x02, 0xbd, 0x16, 0x2a, 0x5f, 0xb1, 0xf6, 0x0d, 0xc6, 0xdc, 0xbd, 0x53, 0xf9, 0x3d, 0x16, 0xee, - 0x98, 0x91, 0x0b, 0xb7, 0x0e, 0x0b, 0x37, 0x28, 0xf3, 0x9c, 0xcb, 0xfb, 0x36, 0x54, 0x00, 0x9c, - 0x83, 0xf7, 0x2f, 0x2d, 0xfa, 0xe7, 0x6f, 0x03, 0xa8, 0x71, 0xfb, 0x8d, 0xd6, 0xfe, 0x36, 0x75, - 0xf7, 0x45, 0x54, 0xf6, 0x11, 0xd5, 0xfd, 0xce, 0x82, 0x02, 0x09, 0x64, 0xfd, 0x10, 0xde, 0xfe, - 0xb6, 0x47, 0x02, 0xf3, 0xe9, 0xfb, 0x25, 0x89, 0x72, 0x28, 0xd5, 0x45, 0x93, 0xc3, 0xcf, 0x64, - 0xb0, 0xfd, 0xa1, 0x15, 0xec, 0x86, 0x1c, 0x04, 0x1f, 0x23, 0x0d, 0xdd, 0x48, 0xe1, 0x11, 0x13, - 0xfe, 0x26, 0xf8, 0x2b, 0x2e, 0xa0, 0xfc, 0x06, 0xcf, 0xde, 0x53, 0xb4, 0xf6, 0x69, 0x5d, 0xeb, - 0x17, 0x11, 0x0a, 0x1a, 0x00, 0x0c, 0xb9, 0x4d, 0xf5, 0xc2, 0xf0, 0xf9, 0x42, 0x74, 0x00, 0x27, - 0xa3, 0xf7, 0x66, 0x1a, 0xf9, 0x92, 0xc2, 0x02, 0xc0, 0xf5, 0xfa, 0x1d, 0x88, 0xff, 0xe0, 0x3a, - 0xf8, 0x59, 0xa5, 0xf6, 0x75, 0x15, 0xfd, 0x47, 0xdb, 0x01, 0x12, 0xcc, 0xfc, 0x06, 0x7c, 0xfe, - 0x63, 0xed, 0x01, 0x82, 0x23, 0xfc, 0x0a, 0x86, 0x70, 0x37, 0xbf, 0x48, 0x5c, 0xbd, 0xd4, 0xb6, - 0xd6, 0xfd, 0xfe, 0xa4, 0xe7, 0x4e, 0x58, 0x02, 0x14, 0x2b, 0x0f, 0x58, 0xd8, 0xdd, 0xc2, 0x5a, - 0xfa, 0xb8, 0xbe, 0x2c, 0x5f, 0xac, 0x01, 0x29, 0x59, 0xe3, 0x8c, 0x3b, 0xf5, 0xcf, 0xb8, 0xe8, - 0x3a, 0x07, 0x07, 0x6b, 0xb3, 0x0c, 0xfe, 0x96, 0xf8, 0x74, 0x3f, 0xf8, 0xb9, 0xd2, 0xff, 0x5e, - 0xd3, 0xf8, 0x88, 0xce, 0xf7, 0xf6, 0x3d, 0x02, 0x8e, 0x20, 0xfb, 0xf3, 0x35, 0x00, 0x9f, 0xed, - 0xf9, 0x3c, 0xe8, 0xf5, 0x2c, 0xde, 0xfb, 0x9a, 0x97, 0x01, 0x43, 0xdc, 0xfb, 0x60, 0xe3, 0xfe, - 0x63, 0x6b, 0x02, 0x87, 0xdf, 0xfb, 0x31, 0x3f, 0x6c, 0x5d, 0x10, 0x4c, 0xc7, 0xc5, 0xdb, 0xba, - 0xc9, 0xfe, 0xb2, 0x2e, 0xe3, 0xf7, 0x43, 0x00, 0x40, 0x18, 0x12, 0xab, 0x02, 0xda, 0xbd, 0x28, - 0xf6, 0xe1, 0xea, 0x2c, 0x8f, 0xa2, 0x05, 0x20, 0xad, 0xe9, 0x67, 0x68, 0xf6, 0x06, 0x67, 0xe4, - 0x02, 0xa5, 0x03, 0xbe, 0x78, 0x0d, 0xe5, 0x0f, 0xfb, 0xac, 0x36, 0xf8, 0x06, 0x36, 0xfe, 0xc8, - 0x93, 0xf9, 0x58, 0xa8, 0xf7, 0xf7, 0x2a, 0x02, 0x55, 0x05, 0xfc, 0x47, 0x02, 0x01, 0xf4, 0x06, - 0xfa, 0xbb, 0xd1, 0xf5, 0x5d, 0xa4, 0xfa, 0xa7, 0x17, 0x00, 0x17, 0x4b, 0xfd, 0xec, 0x5c, 0xff, - 0xc2, 0x87, 0x02, 0x48, 0xfe, 0xfb, 0xf9, 0x9c, 0x67, 0xca, 0x3d, 0x4d, 0xf4, 0x70, 0xe4, 0x29, - 0x02, 0x00, 0x0d, 0x7e, 0xdf, 0xec, 0xdf, 0xfe, 0xeb, 0x8b, 0x13, 0x43, 0x4e, 0xd8, 0x4a, 0x4d, - 0xf0, 0xd7, 0xaa, 0x2c, 0x11, 0x9d, 0x09, 0x9d, 0xe1, 0xee, 0x58, 0xd4, 0xfa, 0x2d, 0xea, 0xde, - 0xf4, 0x26, 0x00, 0x66, 0x94, 0x0e, 0x9f, 0x9b, 0xfb, 0x6e, 0x27, 0xf9, 0x28, 0x88, 0xfc, 0xa1, - 0xf1, 0xf8, 0x20, 0x5a, 0xf9, 0x89, 0x7c, 0x03, 0xaf, 0x5a, 0xfb, 0x8b, 0x86, 0x01, 0x0e, 0x42, - 0xfa, 0x4e, 0xb6, 0xf4, 0x44, 0x98, 0xfa, 0x56, 0x8d, 0xff, 0xcd, 0x72, 0xfe, 0x29, 0xc2, 0xff, - 0xfd, 0xb6, 0x02, 0x8b, 0x77, 0xfc, 0x59, 0x9b, 0x60, 0xbb, 0x5a, 0x4f, 0x9e, 0xf1, 0xed, 0x03, - 0xd6, 0x00, 0xb6, 0xfb, 0xdd, 0x95, 0x1d, 0xfb, 0x5a, 0xed, 0x12, 0x00, 0x2e, 0xdc, 0x65, 0x96, - 0xe7, 0x6f, 0xea, 0x29, 0x48, 0xaf, 0x10, 0x2a, 0x08, 0xf1, 0x69, 0x9c, 0x02, 0x76, 0xc8, 0xda, - 0xbd, 0x00, 0xfa, 0xc7, 0x0e, 0x10, 0xc6, 0x75, 0xfa, 0x8d, 0xb5, 0xfa, 0xa0, 0x55, 0xfc, 0xb0, - 0x8a, 0xf7, 0x04, 0x69, 0xfb, 0xc8, 0x1e, 0x04, 0xbb, 0x2b, 0xfa, 0xc7, 0xf3, 0x02, 0xfa, 0x2d, - 0xf9, 0xf7, 0x16, 0xf4, 0x0b, 0xb4, 0xfc, 0x5d, 0x2f, 0xfe, 0x7e, 0x60, 0xff, 0x0c, 0xa3, 0x00, - 0xf7, 0x42, 0x02, 0xc9, 0x4e, 0xfc, 0xc2, 0xb7, 0x5b, 0xfb, 0x8c, 0x4d, 0x4c, 0x45, 0xf7, 0x1b, - 0xca, 0x01, 0x64, 0xc9, 0xdc, 0x4d, 0x82, 0xf8, 0x0b, 0x22, 0x0e, 0x60, 0x25, 0xe3, 0xae, 0x21, - 0xe1, 0x26, 0xee, 0x23, 0x77, 0xf5, 0x17, 0xff, 0x15, 0xf2, 0xfa, 0x0e, 0x0a, 0x11, 0x98, 0xda, - 0x08, 0x41, 0xf1, 0xc6, 0x6a, 0x10, 0xc6, 0x2e, 0xf9, 0xa3, 0x43, 0xfb, 0x75, 0xc4, 0xfe, 0xff, - 0x17, 0xf6, 0x3e, 0x79, 0xfa, 0xd0, 0x7d, 0x05, 0x04, 0xa0, 0xf9, 0x5c, 0x12, 0x02, 0xc6, 0x91, - 0xfa, 0x3f, 0x5f, 0xf3, 0x19, 0x40, 0xfe, 0x55, 0xce, 0xfe, 0x2a, 0xf2, 0xfe, 0x8b, 0x9e, 0x00, - 0xf2, 0xf9, 0x01, 0xf6, 0xad, 0xfc, 0x32, 0x4c, 0x58, 0xdf, 0x42, 0x4a, 0x43, 0x6d, 0xfd, 0x36, - 0xe6, 0x04, 0xbd, 0x4a, 0xde, 0x89, 0x9d, 0xf5, 0xb8, 0x1c, 0x09, 0x60, 0xe8, 0xe7, 0x78, 0x4f, - 0xdf, 0x59, 0x02, 0x1d, 0xf9, 0x90, 0x1e, 0x08, 0x7f, 0xf4, 0x0f, 0x79, 0x0d, 0xeb, 0xd7, 0xdf, - 0xed, 0x85, 0xe7, 0x64, 0xc1, 0x0f, 0x0c, 0x7a, 0xf9, 0x77, 0x77, 0xfa, 0x95, 0xdf, 0x00, 0x35, - 0x10, 0xf6, 0x57, 0x78, 0xfa, 0x27, 0xa3, 0x04, 0x03, 0x5a, 0xf9, 0xb3, 0x2c, 0x02, 0xe2, 0xd8, - 0xfc, 0x83, 0x1d, 0xf3, 0xbc, 0x03, 0x00, 0x08, 0xe3, 0xfe, 0x5c, 0x01, 0xfe, 0xe2, 0x8c, 0x01, - 0xac, 0x73, 0x01, 0xe3, 0x60, 0xfc, 0xe1, 0xce, 0x55, 0x4b, 0x8b, 0x48, 0x5c, 0xfd, 0xfc, 0x2c, - 0x54, 0x09, 0x3f, 0xbf, 0xe2, 0xa5, 0x6c, 0xef, 0x6c, 0xc3, 0x06, 0x8a, 0x55, 0xeb, 0xce, 0x15, - 0xdd, 0x97, 0xdc, 0x17, 0xd1, 0xc4, 0x24, 0x9f, 0x7e, 0xf6, 0xbf, 0xc1, 0x0d, 0x4d, 0x0f, 0xe7, - 0xef, 0xf6, 0xde, 0x43, 0xa0, 0x0e, 0x73, 0x76, 0xfb, 0xa5, 0x0f, 0xf7, 0x08, 0x3a, 0x02, 0x25, - 0x99, 0xf6, 0xdd, 0xf9, 0xf9, 0xe6, 0x98, 0x04, 0x3e, 0xb2, 0xf8, 0xb7, 0x96, 0x01, 0x7e, 0x16, - 0x00, 0x80, 0x15, 0xf4, 0x99, 0x1e, 0xff, 0xf4, 0x4d, 0xff, 0xe7, 0x80, 0xfe, 0x15, 0xe0, 0x00, - 0x56, 0xee, 0x00, 0x35, 0xe4, 0xfc, 0x2f, 0xa1, 0x56, 0x25, 0x46, 0x43, 0x58, 0x4f, 0xfa, 0x5b, - 0x26, 0x10, 0x3d, 0x18, 0xe3, 0x08, 0x20, 0xeb, 0x63, 0x60, 0x07, 0x09, 0xd0, 0xed, 0x66, 0x97, - 0xdb, 0xfc, 0x72, 0x12, 0x08, 0xba, 0x28, 0xcc, 0xd3, 0xf8, 0xf0, 0x93, 0x0e, 0xe1, 0x2c, 0xec, - 0xfb, 0xec, 0xda, 0x6f, 0x74, 0x0a, 0x81, 0x40, 0xfe, 0x0e, 0xee, 0xf6, 0x46, 0xcf, 0xff, 0x37, - 0x3d, 0xf6, 0x82, 0x3d, 0xf9, 0xef, 0x6f, 0x06, 0xbe, 0x56, 0xf9, 0x4f, 0x05, 0x00, 0xa2, 0x4f, - 0x02, 0x1c, 0xea, 0xf4, 0xf6, 0xd0, 0xfe, 0x07, 0x85, 0xff, 0x14, 0xb8, 0xfd, 0x7e, 0x07, 0x01, - 0xbe, 0xdf, 0x00, 0xb5, 0x9e, 0xfc, 0x60, 0x23, 0x53, 0x66, 0x6f, 0x3e, 0xa9, 0xe0, 0xfb, 0x09, - 0xc7, 0x16, 0xc2, 0xb1, 0xdf, 0xf3, 0xda, 0xe9, 0x8d, 0x23, 0x0b, 0x08, 0xf0, 0xed, 0x1d, 0x52, - 0xdd, 0x95, 0x2a, 0x08, 0x99, 0xa2, 0x29, 0x04, 0x83, 0xfe, 0xed, 0xbe, 0x0d, 0x4c, 0x09, 0xf5, - 0xd1, 0x14, 0xd7, 0x69, 0x5b, 0x04, 0x03, 0x24, 0x02, 0x3c, 0xaf, 0xf7, 0x09, 0xae, 0xfd, 0xf8, - 0x83, 0xf4, 0x3f, 0x6b, 0xf7, 0x2e, 0x07, 0x08, 0xae, 0xc7, 0xfb, 0x6c, 0x70, 0xfe, 0x64, 0xb3, - 0x04, 0xeb, 0x31, 0xf4, 0x59, 0x8e, 0xfc, 0x3b, 0x28, 0x02, 0x07, 0x78, 0xfd, 0x0f, 0x6c, 0x00, - 0x67, 0x43, 0x00, 0xf5, 0x7f, 0xfc, 0x55, 0xda, 0x4c, 0x15, 0x4a, 0x39, 0x63, 0x72, 0xfe, 0x27, - 0x4d, 0x1b, 0x59, 0xac, 0xe1, 0xa2, 0x25, 0xe9, 0x23, 0x3e, 0x0b, 0xe6, 0x0d, 0xf1, 0x08, 0x8d, - 0xdd, 0x2c, 0x9e, 0xfe, 0x9d, 0xb7, 0x27, 0x12, 0xc9, 0x03, 0xd5, 0x52, 0x0c, 0x29, 0xc7, 0xfd, - 0x40, 0x82, 0xd8, 0x63, 0xb4, 0xfc, 0xac, 0xb4, 0x05, 0xe7, 0x14, 0xf7, 0xd1, 0x8f, 0xfc, 0x04, - 0x45, 0xf5, 0x4f, 0x3f, 0xf4, 0x8a, 0x72, 0x06, 0x44, 0x52, 0xfd, 0x4b, 0x04, 0x01, 0x2c, 0xbb, - 0x05, 0x34, 0xfc, 0xf0, 0xd0, 0x44, 0xfb, 0x5d, 0x6c, 0x05, 0x6e, 0x66, 0xfd, 0xc3, 0x01, 0xff, - 0x88, 0xfa, 0xff, 0xf5, 0x42, 0xfd, 0xf1, 0x6a, 0x4a, 0x14, 0x5d, 0x32, 0xd7, 0x1c, 0xf8, 0xcf, - 0xfe, 0x21, 0xad, 0x35, 0xeb, 0x4c, 0x3c, 0xe9, 0x21, 0xe1, 0x08, 0x22, 0xe8, 0xef, 0xbd, 0x11, - 0xdf, 0x91, 0x47, 0xf8, 0x6c, 0xd0, 0x27, 0xe5, 0x8e, 0x07, 0x58, 0xcb, 0x04, 0x77, 0x75, 0x05, - 0xb9, 0xa9, 0xdf, 0xa0, 0xdb, 0xf6, 0x72, 0x2f, 0x07, 0x28, 0x8b, 0xf8, 0x4e, 0x09, 0xfa, 0xaf, - 0x8d, 0xf5, 0xd4, 0x76, 0xf3, 0x43, 0x3a, 0x03, 0x8b, 0x08, 0xff, 0x1f, 0x6d, 0x01, 0x41, 0xe0, - 0x05, 0x87, 0x60, 0xf1, 0x5b, 0x56, 0xf9, 0x50, 0xfd, 0x06, 0x69, 0x11, 0xfe, 0xc7, 0x28, 0xfe, - 0x0a, 0xc4, 0xff, 0xe4, 0x20, 0xfe, 0xf7, 0x6e, 0x45, 0x87, 0xfd, 0x2c, 0x8f, 0x8f, 0xf8, 0x68, - 0x01, 0x25, 0x9a, 0xa9, 0xee, 0x81, 0x53, 0xe9, 0x6a, 0x08, 0x09, 0xb3, 0x36, 0xf4, 0x2f, 0xda, - 0xe0, 0x42, 0x31, 0xf2, 0xae, 0xd9, 0x25, 0x67, 0x5d, 0x08, 0x13, 0x3d, 0xfc, 0xb4, 0xfc, 0x0e, - 0xa3, 0x1d, 0xea, 0x22, 0x1b, 0xee, 0xdf, 0xf3, 0x09, 0x9f, 0x06, 0xfa, 0x19, 0x83, 0xf6, 0x22, - 0xed, 0xf8, 0x22, 0x59, 0xf4, 0x96, 0x05, 0x00, 0xb6, 0xa0, 0xfd, 0xc3, 0x27, 0xff, 0xc1, 0xcf, - 0x06, 0xdd, 0x36, 0xf6, 0x61, 0x55, 0xf7, 0x77, 0x91, 0x04, 0xd4, 0x19, 0x00, 0x55, 0xa3, 0xfe, - 0x39, 0xe8, 0xff, 0xfc, 0x40, 0xfe, 0x25, 0x38, 0x3f, 0xf1, 0x73, 0x28, 0x19, 0x3d, 0xfb, 0x89, - 0x5c, 0x24, 0xd3, 0x64, 0xf0, 0xf1, 0x81, 0xec, 0x6d, 0x7b, 0x07, 0x77, 0xfe, 0xf6, 0x81, 0x2d, - 0xe4, 0x71, 0xa7, 0xee, 0x3e, 0xfa, 0x22, 0x54, 0x8e, 0x06, 0x25, 0xb1, 0xf8, 0x78, 0x51, 0x12, - 0x3f, 0xcb, 0xf0, 0xad, 0x3f, 0xec, 0x39, 0xc7, 0x09, 0xb5, 0x61, 0xfb, 0xa9, 0xd5, 0xf4, 0x34, - 0xc6, 0xfa, 0xc2, 0xd8, 0xf5, 0xc8, 0xda, 0xfe, 0x82, 0xd1, 0xfb, 0x4f, 0xac, 0xfb, 0x48, 0x86, - 0x05, 0xf9, 0xa4, 0xfa, 0x0c, 0xeb, 0xf8, 0xec, 0x21, 0x02, 0xb2, 0x01, 0xff, 0xff, 0x4c, 0xff, - 0xf1, 0x9e, 0x01, 0xd6, 0x6f, 0xfe, 0xf5, 0x28, 0x3a, 0xe8, 0xdb, 0x23, 0x88, 0x91, 0xfc, 0xb8, - 0x65, 0x24, 0xa3, 0x81, 0xf2, 0x5f, 0x98, 0xef, 0xa2, 0xf3, 0x06, 0x2f, 0xc8, 0xf7, 0x9b, 0x26, - 0xe8, 0x7a, 0x70, 0xee, 0x32, 0xfd, 0x1d, 0xf1, 0xea, 0x06, 0xd8, 0x0b, 0xf8, 0x0c, 0xbc, 0x10, - 0x26, 0x9d, 0xf4, 0xc6, 0xda, 0xed, 0xf4, 0x32, 0x09, 0xa9, 0x93, 0xfc, 0xef, 0xd0, 0xf5, 0x59, - 0x23, 0xfb, 0xce, 0x06, 0xf7, 0x86, 0x68, 0xfe, 0x72, 0x0c, 0xfc, 0x66, 0x1a, 0xfa, 0x37, 0x04, - 0x02, 0xb2, 0x2a, 0xfc, 0x0f, 0xdf, 0xfb, 0xc0, 0x46, 0x02, 0xc0, 0xbb, 0xfd, 0x56, 0xbb, 0xfe, - 0x2b, 0x96, 0x02, 0xbd, 0xfa, 0xfe, 0x54, 0x2e, 0x3b, 0xc0, 0xce, 0x23, 0x1c, 0xd1, 0xec, 0x36, - 0xa0, 0x25, 0x13, 0xd7, 0x02, 0xed, 0x2e, 0xea, 0x84, 0x93, 0xff, 0xbb, 0xaf, 0xfc, 0xb5, 0xf0, - 0xeb, 0x3b, 0x23, 0xf0, 0x31, 0xa0, 0x1e, 0x66, 0x36, 0xfe, 0xb2, 0xbc, 0xf1, 0x38, 0xb3, 0x0d, - 0x42, 0x3d, 0xfc, 0xa4, 0x70, 0xf6, 0x92, 0x41, 0x0d, 0xc7, 0x2d, 0x03, 0x62, 0x6f, 0xfa, 0x2f, - 0x1e, 0x00, 0xd2, 0x8b, 0xf9, 0x59, 0xb9, 0xfd, 0x1a, 0xc8, 0xf6, 0x87, 0x58, 0xf4, 0x8f, 0xb6, - 0xfd, 0x18, 0xcf, 0xfb, 0xda, 0x67, 0xf9, 0x0a, 0x3d, 0xff, 0x77, 0x00, 0xff, 0xb1, 0x12, 0x00, - 0x21, 0x35, 0x02, 0x8c, 0x55, 0xfe, 0x4d, 0x83, 0x31, 0xc3, 0x69, 0x23, 0x9e, 0x11, 0xf6, 0xbc, - 0xa8, 0x20, 0x22, 0x6e, 0x01, 0x08, 0x69, 0xec, 0xb6, 0x3d, 0x00, 0x0a, 0xd4, 0xfb, 0x5a, 0x44, - 0xef, 0x21, 0xa2, 0xf1, 0xa4, 0x10, 0x17, 0x3a, 0xc1, 0x01, 0x6d, 0xe4, 0xf6, 0xaf, 0x4c, 0x0b, - 0x8c, 0xda, 0xfb, 0x85, 0xdc, 0xf6, 0xb7, 0xae, 0x09, 0x86, 0x9e, 0x02, 0xff, 0x47, 0xfc, 0x63, - 0xad, 0xff, 0x1e, 0x87, 0xf9, 0x22, 0x33, 0xfe, 0x00, 0xff, 0xf8, 0x03, 0x69, 0xf6, 0x46, 0x36, - 0xfe, 0x0c, 0x75, 0xfb, 0x79, 0x24, 0xfa, 0x5f, 0x31, 0xff, 0x67, 0x8e, 0xfe, 0x56, 0x0c, 0xff, - 0xa1, 0x96, 0x01, 0x98, 0x5e, 0xff, 0xab, 0x8a, 0x29, 0x18, 0x91, 0x20, 0x8b, 0xfa, 0xfb, 0x18, - 0x3f, 0x1d, 0xa8, 0x0b, 0x02, 0x11, 0xe1, 0xf0, 0x68, 0xc7, 0x01, 0x79, 0xe7, 0xfb, 0xbc, 0x70, - 0xf0, 0x52, 0x60, 0xf3, 0x30, 0x54, 0x12, 0x69, 0x63, 0x02, 0xb9, 0xd5, 0xf9, 0x9a, 0x14, 0x09, - 0x09, 0xcd, 0xfc, 0x91, 0xb7, 0xf7, 0x10, 0xf1, 0x06, 0x4a, 0xf7, 0x02, 0xfe, 0x7a, 0xfc, 0x30, - 0x3f, 0xff, 0x18, 0xc2, 0xfa, 0x20, 0x90, 0xfd, 0x4a, 0xe6, 0xfa, 0x31, 0x09, 0xf9, 0xf1, 0x67, - 0xfe, 0x12, 0xa8, 0xfc, 0xed, 0xb8, 0xfa, 0x34, 0xa7, 0xfe, 0x3a, 0x07, 0xff, 0x8d, 0x5c, 0xfe, - 0x3f, 0x2b, 0x00, 0x86, 0x14, 0xff, 0xd7, 0x8c, 0x22, 0x7a, 0x39, 0x1d, 0x2b, 0x13, 0x01, 0xfe, - 0x94, 0x1a, 0x52, 0x1b, 0x02, 0x0f, 0x06, 0xf5, 0xb5, 0xea, 0x03, 0x43, 0xe0, 0xfb, 0x59, 0x38, - 0xf1, 0x27, 0x5a, 0xf5, 0x73, 0xaa, 0x0e, 0xe7, 0x3a, 0x03, 0xf3, 0x16, 0xfb, 0xa2, 0x0d, 0x07, - 0x0d, 0x8c, 0xfe, 0xc3, 0x9a, 0xf7, 0xd7, 0xc5, 0x04, 0xb7, 0x8d, 0x03, 0x2f, 0xcd, 0xfc, 0xc2, - 0xf4, 0xfe, 0x45, 0x7c, 0xfb, 0x17, 0xb4, 0xfd, 0x17, 0xf4, 0xfb, 0x20, 0x67, 0xfb, 0xa5, 0xe8, - 0xff, 0x5b, 0x08, 0xfd, 0x03, 0x14, 0xfb, 0x8e, 0xc6, 0xfe, 0xa3, 0x18, 0xff, 0x07, 0x00, 0xfe, - 0x02, 0x34, 0xff, 0xb3, 0x73, 0xfe, 0x14, 0x9f, 0x1d, 0x07, 0x75, 0x1a, 0x4c, 0x15, 0x03, 0x00, - 0xcb, 0x17, 0xb7, 0xb9, 0x03, 0xd4, 0x73, 0xf8, 0xb5, 0xb9, 0x03, 0xe0, 0x61, 0xfc, 0x0a, 0x78, - 0xf3, 0xb2, 0x18, 0xf6, 0x9b, 0x2d, 0x0c, 0xc1, 0x6f, 0x04, 0xe8, 0xaa, 0xfa, 0xf2, 0x65, 0x05, - 0xf7, 0x9a, 0xff, 0xf1, 0x04, 0xf8, 0x66, 0x8b, 0x03, 0xf8, 0x14, 0x03, 0xcf, 0x4d, 0xfd, 0x0d, - 0xaf, 0xfe, 0x89, 0x05, 0xfc, 0x6e, 0x1e, 0xfe, 0xfb, 0xd4, 0xfd, 0x55, 0x3b, 0xfd, 0xd2, 0xd3, - 0xff, 0xbd, 0x7f, 0xfd, 0x76, 0xe8, 0xfb, 0xed, 0xff, 0xfe, 0x71, 0x7e, 0xfe, 0xe9, 0x52, 0xfd, - 0xc0, 0xc1, 0xfe, 0x19, 0x43, 0xfe, 0x92, 0x65, 0x1a, 0xf3, 0x49, 0x18, 0x1a, 0x35, 0x03, 0xb0, - 0xdb, 0x14, 0xe6, 0x69, 0x06, 0x38, 0x92, 0xfb, 0x39, 0xaa, 0x01, 0x96, 0x39, 0xfd, 0xcd, 0xf5, - 0xf6, 0xbf, 0xeb, 0xf6, 0x23, 0xf1, 0x09, 0x1e, 0xe6, 0x04, 0xb3, 0xec, 0xfa, 0x45, 0x78, 0x03, - 0xf5, 0xc0, 0xff, 0x49, 0xe2, 0xf9, 0xd7, 0x98, 0x02, 0xfe, 0x28, 0x02, 0x95, 0xbb, 0xfd, 0xfb, - 0xaa, 0xfe, 0xb7, 0x55, 0xfd, 0x28, 0xb3, 0xff, 0x7e, 0x4f, 0xff, 0x18, 0x6e, 0xfd, 0xbb, 0x44, - 0xff, 0x96, 0x65, 0xfe, 0xc5, 0xe0, 0xfc, 0xd9, 0x62, 0xfe, 0xee, 0xc3, 0xfd, 0x70, 0x59, 0xfd, - 0x80, 0x25, 0xff, 0x79, 0x04, 0xfe, 0x6c, 0x37, 0x16, 0xa4, 0xf4, 0x15, 0x27, 0xc1, 0x04, 0xf6, - 0xa0, 0x12, 0x8d, 0x3e, 0x07, 0x42, 0xce, 0xfd, 0x0a, 0x56, 0x01, 0x4b, 0xd5, 0xfd, 0x74, 0x1d, - 0xf9, 0xbd, 0x4c, 0xf8, 0x84, 0xa5, 0x07, 0x74, 0xe9, 0x03, 0x9f, 0xb6, 0xfb, 0x0d, 0x0f, 0x02, - 0x80, 0xcc, 0xff, 0xce, 0x47, 0xfb, 0xe5, 0x59, 0x01, 0x23, 0x70, 0x01, 0x9d, 0x4d, 0xfe, 0x41, - 0xfb, 0xff, 0xf8, 0xc1, 0xfe, 0xa1, 0xe7, 0xff, 0xb3, 0x9d, 0xff, 0x58, 0x6e, 0xfd, 0x4b, 0xe2, - 0xfe, 0x12, 0x8d, 0xfe, 0x8c, 0x1b, 0xfd, 0xa7, 0xca, 0xfd, 0xca, 0xcb, 0xfd, 0xac, 0xe9, 0xfd, - 0xc1, 0xfb, 0xfe, 0x25, 0x00, 0xfe, 0x55, 0xe8, 0x12, 0xb5, 0xb6, 0x13, 0x63, 0x26, 0x06, 0x61, - 0x9a, 0x10, 0x4b, 0xba, 0x07, 0x90, 0x96, 0xff, 0x72, 0x07, 0x01, 0xec, 0xcb, 0xfe, 0xd7, 0x31, - 0xfb, 0xea, 0xd8, 0xf9, 0xbd, 0xf2, 0x04, 0x22, 0x16, 0x03, 0xdf, 0xdf, 0xfc, 0x62, 0xcc, 0x00, - 0xd2, 0x0c, 0x00, 0xa8, 0x4e, 0xfc, 0x38, 0x92, 0x00, 0x40, 0xfb, 0x01, 0xd4, 0xf6, 0xff, 0x21, - 0x08, 0x00, 0xd6, 0x21, 0xff, 0xd0, 0x94, 0x00, 0xcd, 0x7f, 0xff, 0xdb, 0x18, 0xfd, 0xcc, 0x77, - 0xfe, 0xff, 0x86, 0xfe, 0x08, 0x72, 0xfd, 0x2e, 0x40, 0xfe, 0xd6, 0x29, 0xfe, 0x4c, 0x2a, 0xfe, - 0xfd, 0x35, 0xff, 0x2f, 0x6b, 0xfe, 0x38, 0x85, 0x0f, 0x47, 0xa5, 0x11, 0x35, 0x92, 0x07, 0x65, - 0x69, 0x0f, 0xab, 0x2f, 0x07, 0x54, 0x5b, 0x00, 0x8a, 0x43, 0x02, 0xd6, 0xc2, 0xff, 0xac, 0x50, - 0xfc, 0x25, 0xb2, 0xfa, 0xd6, 0x2a, 0x03, 0x5e, 0x41, 0x02, 0xa2, 0xe6, 0xfc, 0x86, 0xc8, 0x00, - 0xa7, 0xb4, 0x00, 0x2f, 0xf3, 0xfc, 0x89, 0x45, 0x01, 0x0b, 0x6f, 0x02, 0xe6, 0xa4, 0xff, 0xfb, - 0x0c, 0x00, 0x99, 0xff, 0xff, 0xe5, 0x92, 0x00, 0xc9, 0x9d, 0xfe, 0xe2, 0x8d, 0xfc, 0x93, 0x99, - 0xfe, 0x47, 0x40, 0xff, 0x71, 0x06, 0xfe, 0x83, 0x42, 0xfe, 0x40, 0x62, 0xfe, 0x87, 0xe5, 0xfe, - 0xc1, 0xa6, 0xff, 0x6c, 0xe3, 0xfe, 0x38, 0x9d, 0x0d, 0x0b, 0x37, 0x10, 0x76, 0x88, 0x07, 0xe3, - 0x04, 0x0e, 0x19, 0xf6, 0x06, 0x6e, 0xc1, 0x00, 0x16, 0xc9, 0x02, 0x2c, 0xc6, 0x00, 0xf6, 0x84, - 0xfd, 0x7b, 0xf7, 0xfa, 0xd9, 0x82, 0x01, 0x87, 0x89, 0x01, 0x54, 0x51, 0xfd, 0x2c, 0x67, 0x01, - 0x14, 0x39, 0x02, 0xfc, 0xe9, 0xfd, 0xb7, 0x5f, 0x00, 0x80, 0xf7, 0x01, 0x90, 0xff, 0xff, 0x65, - 0x62, 0x00, 0xf9, 0x1f, 0x00, 0x3e, 0x6a, 0xff, 0x6d, 0x9c, 0xfd, 0xa4, 0xae, 0xfd, 0x94, 0x90, - 0xff, 0xe3, 0x41, 0xff, 0x70, 0x37, 0xfe, 0x78, 0x80, 0xfe, 0x54, 0x28, 0xff, 0x31, 0xae, 0xff, - 0x50, 0x4b, 0xff, 0xf4, 0xd6, 0xfd, 0x59, 0xea, 0x0c, 0x15, 0x98, 0x0e, 0x40, 0x00, 0x07, 0xa8, - 0x2f, 0x0d, 0x45, 0xfe, 0x05, 0xc9, 0x4b, 0x01, 0x4d, 0xb7, 0x03, 0xd3, 0x90, 0x01, 0x9d, 0xe2, - 0xfd, 0xac, 0x15, 0xfb, 0x14, 0xbb, 0x00, 0xad, 0xef, 0x00, 0x6b, 0x82, 0xff, 0x6f, 0x6b, 0x03, - 0xf0, 0x5c, 0x01, 0x05, 0x76, 0xfd, 0x17, 0x75, 0x00, 0x9e, 0xbb, 0x01, 0xa2, 0x80, 0x00, 0xfc, - 0x27, 0x00, 0xd0, 0x28, 0xff, 0x05, 0x0f, 0xff, 0x9c, 0xa7, 0xfe, 0xe7, 0xdc, 0xfe, 0x5e, 0xc3, - 0xff, 0xc1, 0x6a, 0xff, 0x7c, 0x93, 0xfe, 0x56, 0x4b, 0xff, 0x72, 0x5e, 0xff, 0x83, 0xb8, 0xfe, - 0x3f, 0x56, 0xfe, 0x40, 0x85, 0xfd, 0x3a, 0x59, 0x0c, 0x5f, 0x67, 0x0d, 0xd3, 0x28, 0x06, 0xa1, - 0xfc, 0x0b, 0xe8, 0x8b, 0x05, 0x2a, 0x00, 0x02, 0x20, 0xaa, 0x04, 0x97, 0xae, 0x01, 0x39, 0x0e, - 0xfe, 0xe6, 0xa9, 0xfb, 0xba, 0xdd, 0x00, 0x08, 0xd0, 0x02, 0x47, 0xa9, 0x00, 0x44, 0xa8, 0x02, - 0xdf, 0x11, 0x01, 0x53, 0x80, 0xfd, 0xf1, 0x4e, 0x00, 0xa8, 0xdd, 0x01, 0x0d, 0x14, 0x00, 0x8c, - 0xbc, 0xff, 0x8c, 0xda, 0xff, 0x57, 0xaa, 0xff, 0x0e, 0x85, 0xff, 0x05, 0x5f, 0xff, 0x8c, 0x2b, - 0x00, 0x61, 0xfa, 0xff, 0xb5, 0x96, 0xfe, 0x0b, 0x9c, 0xfe, 0x11, 0x82, 0xfe, 0x23, 0x5c, 0xfe, - 0x14, 0x66, 0xfe, 0x32, 0x54, 0xfe, 0xd8, 0x6b, 0x0b, 0xaa, 0xfe, 0x0b, 0x74, 0x47, 0x05, 0x34, - 0x04, 0x0b, 0x33, 0x8b, 0x05, 0x97, 0xc9, 0x02, 0xfe, 0x12, 0x05, 0x84, 0xbd, 0x01, 0xba, 0xf2, - 0xfe, 0x9d, 0x24, 0xfe, 0xf7, 0x1a, 0x01, 0x0f, 0xfc, 0x01, 0x66, 0x8f, 0x01, 0x88, 0x3a, 0x02, - 0x00, 0x75, 0x00, 0xa7, 0x93, 0xfd, 0x09, 0x8e, 0xff, 0x72, 0xbd, 0x01, 0xfa, 0xf0, 0x00, 0x17, - 0xa2, 0x00, 0x90, 0xdc, 0xff, 0x80, 0xb9, 0xff, 0x22, 0x4c, 0x00, 0x61, 0x6d, 0x00, 0x57, 0x5e, - 0x00, 0x56, 0xb3, 0xfe, 0x25, 0x5b, 0xfd, 0x82, 0x4d, 0xfe, 0x07, 0xcf, 0xfe, 0x07, 0xee, 0xfe, - 0xe7, 0xcc, 0xfe, 0x74, 0x0e, 0xfe, 0xbe, 0xce, 0x0a, 0xc0, 0xaa, 0x0b, 0xe4, 0x3d, 0x04, 0xe9, - 0x1f, 0x08, 0xf0, 0xd9, 0x05, 0x49, 0x02, 0x05, 0x9f, 0x89, 0x05, 0x7f, 0xc4, 0x02, 0x28, 0x88, - 0x00, 0x84, 0x1d, 0xfe, 0x19, 0x26, 0x01, 0xc7, 0xc7, 0x02, 0xf7, 0x04, 0x01, 0x08, 0x0b, 0x01, - 0x20, 0x86, 0xff, 0x21, 0x9a, 0xfd, 0x4e, 0xef, 0x00, 0xa5, 0xe4, 0x02, 0xc6, 0xda, 0x00, 0x9e, - 0x2d, 0x00, 0x2c, 0x4f, 0x00, 0xb3, 0x41, 0x01, 0x9d, 0x1e, 0x01, 0x8f, 0x3d, 0xff, 0x7f, 0x65, - 0xfe, 0xce, 0x0a, 0xfe, 0x4b, 0x05, 0xfe, 0x7d, 0xe7, 0xfe, 0x38, 0x46, 0xff, 0x32, 0xb5, 0xfe, - 0x31, 0x5a, 0xfe, 0x77, 0x36, 0xfe, 0xae, 0x61, 0x08, 0xb3, 0xa8, 0x0a, 0x60, 0x94, 0x04, 0x20, - 0x53, 0x07, 0xf4, 0x5e, 0x06, 0x46, 0x49, 0x05, 0x14, 0xe2, 0x07, 0x43, 0xa4, 0x04, 0xf4, 0xf5, - 0x00, 0x09, 0xd7, 0xfe, 0xfb, 0xab, 0xff, 0x95, 0xea, 0x01, 0xc0, 0x1d, 0x01, 0x1a, 0x48, 0x00, - 0x99, 0x8d, 0xff, 0x30, 0x4f, 0xff, 0xc1, 0x92, 0x01, 0x4b, 0xf1, 0x02, 0x19, 0x63, 0x01, 0xf6, - 0x77, 0x00, 0x8c, 0x06, 0x01, 0x70, 0x3d, 0x01, 0x56, 0xe5, 0xff, 0xc1, 0x29, 0xfe, 0xa3, 0x5b, - 0xfe, 0xab, 0x83, 0xfe, 0xb2, 0x7a, 0xfe, 0x05, 0x29, 0xff, 0x50, 0xf4, 0xfe, 0x02, 0x97, 0xfe, - 0xf4, 0x65, 0xfe, 0x5c, 0x5a, 0xfe, 0xdf, 0x34, 0x07, 0xee, 0x7f, 0x0a, 0xc1, 0xe8, 0x05, 0x63, - 0x3c, 0x07, 0x41, 0x41, 0x08, 0xaf, 0x40, 0x06, 0xea, 0x40, 0x05, 0xb2, 0x96, 0x04, 0x48, 0xf9, - 0x01, 0x52, 0x5a, 0xff, 0xbb, 0x0f, 0xff, 0x54, 0x4f, 0xff, 0xff, 0xfc, 0xff, 0x9d, 0xe7, 0x01, - 0x37, 0xd4, 0x01, 0xf7, 0x7b, 0x00, 0x18, 0x79, 0x01, 0xbf, 0x60, 0x02, 0x7d, 0xa6, 0x01, 0xe7, - 0xa1, 0x00, 0xe2, 0x54, 0x00, 0x00, 0xd7, 0xff, 0x22, 0xd4, 0xfe, 0xa0, 0x7a, 0xfe, 0x38, 0xaa, - 0xfe, 0x32, 0x7c, 0xfe, 0xdc, 0x6b, 0xfe, 0x5f, 0xed, 0xfe, 0x50, 0x31, 0xff, 0xcf, 0xc4, 0xfe, - 0xf9, 0x50, 0xfe, 0xc7, 0xa5, 0xfe, 0x0f, 0xda, 0x05, 0x57, 0x7f, 0x0a, 0x21, 0x16, 0x08, 0xfb, - 0x49, 0x07, 0x5d, 0x48, 0x08, 0x20, 0xfb, 0x07, 0x0c, 0xb9, 0x05, 0xc7, 0x86, 0x02, 0x36, 0x0e, - 0x00, 0x4f, 0x02, 0xff, 0xb2, 0x6c, 0xff, 0x9d, 0x72, 0x00, 0xf1, 0xb2, 0x00, 0xee, 0x25, 0x01, - 0xa1, 0x2f, 0x02, 0xfb, 0x64, 0x02, 0x93, 0xef, 0x01, 0x5d, 0xbc, 0x01, 0xef, 0xf0, 0x00, 0x4a, - 0xf3, 0xff, 0xf0, 0x6d, 0xff, 0xc8, 0x49, 0xff, 0xfd, 0x04, 0xff, 0x6e, 0xac, 0xfe, 0x2c, 0xd1, - 0xfe, 0x80, 0xb1, 0xfe, 0xcd, 0x47, 0xfe, 0x59, 0x85, 0xfe, 0xbf, 0x1b, 0xff, 0x55, 0x0d, 0xff, - 0x4d, 0x11, 0xff, 0x67, 0xef, 0xfe, 0xad, 0x81, 0x07, 0x06, 0x08, 0x0b, 0x41, 0xab, 0x06, 0xed, - 0xc8, 0x08, 0x6d, 0x79, 0x08, 0xa6, 0xff, 0x05, 0x52, 0x25, 0x06, 0x0d, 0xa0, 0x02, 0x22, 0x4f, - 0xfe, 0x3d, 0x92, 0xfe, 0x2d, 0xd3, 0x00, 0x25, 0xd4, 0x00, 0x62, 0x08, 0x01, 0x75, 0xec, 0x01, - 0x51, 0xd7, 0x01, 0x9e, 0xbc, 0x02, 0x5f, 0x2d, 0x03, 0x25, 0x01, 0x01, 0xcf, 0x23, 0xff, 0xa1, - 0x28, 0xff, 0x86, 0x6d, 0xff, 0xd3, 0x62, 0xff, 0x90, 0x50, 0xff, 0x12, 0xce, 0xfe, 0x67, 0x80, - 0xfe, 0xb3, 0x7c, 0xfe, 0xa7, 0x95, 0xfe, 0x09, 0x33, 0xff, 0x0c, 0xe7, 0xfe, 0xc1, 0xbc, 0xfe, - 0x5d, 0x43, 0xff, 0xae, 0x37, 0xff, 0xe4, 0x66, 0x07, 0xe1, 0xf3, 0x0a, 0x3e, 0x92, 0x07, 0x14, - 0xf7, 0x07, 0x52, 0x35, 0x07, 0x1a, 0x4f, 0x05, 0x4a, 0xac, 0x04, 0x04, 0x24, 0x03, 0xb9, 0x44, - 0x00, 0x3f, 0xf6, 0xff, 0x1f, 0xf1, 0x00, 0x93, 0xa4, 0x00, 0x37, 0xc0, 0x00, 0x64, 0x9b, 0x01, - 0x56, 0x94, 0x02, 0xb6, 0x40, 0x03, 0x30, 0xb1, 0x02, 0x8e, 0x3f, 0x00, 0x7e, 0x11, 0xff, 0x93, - 0x21, 0xff, 0x58, 0x03, 0xff, 0x14, 0x5d, 0xff, 0x9a, 0x70, 0xff, 0x25, 0x3f, 0xff, 0x46, 0x9b, - 0xfe, 0x6a, 0x31, 0xfe, 0x3c, 0x92, 0xfe, 0xb7, 0x18, 0xff, 0xf4, 0x0e, 0xff, 0x1f, 0x22, 0xff, - 0xc3, 0x23, 0xff, 0x80, 0xfe, 0xfe, 0x74, 0x16, 0x08, 0x3d, 0x13, 0x0c, 0xa9, 0xf4, 0x05, 0x99, - 0x2f, 0x05, 0xe7, 0xfc, 0x05, 0xa2, 0xc5, 0x04, 0x75, 0x1a, 0x04, 0xe6, 0xb2, 0x04, 0x8c, 0x37, - 0x02, 0x7c, 0xfc, 0xff, 0xeb, 0x7c, 0x01, 0x86, 0xc8, 0x00, 0x26, 0x82, 0x00, 0xf1, 0x20, 0x02, - 0xa3, 0x92, 0x02, 0x3f, 0xe3, 0x01, 0xfe, 0xd3, 0x02, 0x83, 0xcb, 0x01, 0x28, 0x9c, 0xfe, 0x7d, - 0x38, 0xfe, 0xbb, 0x54, 0xff, 0x30, 0xad, 0xff, 0x1b, 0x05, 0xff, 0xdb, 0x1d, 0xff, 0x0e, 0x00, - 0xff, 0xc0, 0x8c, 0xfe, 0x20, 0x65, 0xfe, 0x3f, 0x88, 0xfe, 0x6e, 0x22, 0xff, 0x09, 0x72, 0xff, - 0xff, 0x37, 0xff, 0x29, 0xe0, 0xfe, 0xba, 0x6f, 0x08, 0xdb, 0x8e, 0x0b, 0x2d, 0x7f, 0x04, 0x01, - 0x87, 0x03, 0x90, 0x11, 0x04, 0xb8, 0xa0, 0x04, 0x8b, 0xdb, 0x05, 0x0f, 0x6d, 0x04, 0xd2, 0xee, - 0x01, 0x0d, 0x69, 0x02, 0x98, 0xe4, 0x01, 0x14, 0xc7, 0xff, 0x93, 0x4c, 0x01, 0xc9, 0x5e, 0x02, - 0x67, 0x4b, 0x02, 0x05, 0x6b, 0x02, 0xe5, 0x73, 0x02, 0xb6, 0x20, 0x02, 0x4e, 0xa5, 0x00, 0x6f, - 0xda, 0xfe, 0x28, 0x2d, 0xfe, 0x5c, 0x16, 0xff, 0x24, 0xac, 0xff, 0xfe, 0xce, 0xff, 0x32, 0xea, - 0xfe, 0x09, 0x89, 0xfe, 0xc8, 0xcd, 0xfe, 0x4f, 0x8b, 0xfe, 0xb2, 0xb4, 0xfe, 0xed, 0x13, 0xff, - 0x25, 0xa2, 0xff, 0x68, 0x52, 0xff, 0x0a, 0xa3, 0x08, 0x39, 0x65, 0x0b, 0xd6, 0x69, 0x04, 0xe8, - 0xb5, 0x03, 0x73, 0xeb, 0x03, 0xd6, 0x91, 0x03, 0x99, 0xc5, 0x03, 0xed, 0x04, 0x03, 0xdf, 0xf3, - 0x01, 0x5f, 0x09, 0x03, 0x77, 0x2d, 0x03, 0x7b, 0xc8, 0x01, 0xce, 0xb6, 0x00, 0x9d, 0x2e, 0x01, - 0x6e, 0x38, 0x03, 0x7c, 0xb1, 0x02, 0xda, 0x07, 0x02, 0xaf, 0x29, 0x02, 0x6e, 0x4d, 0x02, 0x85, - 0x89, 0x00, 0x2c, 0x5c, 0xff, 0x88, 0xc4, 0xfe, 0xe7, 0x02, 0xfe, 0x98, 0xdd, 0xff, 0x00, 0xff, - 0xff, 0xb1, 0xe7, 0xfe, 0x3c, 0xd3, 0xfe, 0xa4, 0x1f, 0xff, 0x5c, 0x9c, 0xfe, 0xa0, 0xd1, 0xfe, - 0x45, 0x65, 0xff, 0x5b, 0x4d, 0xff, 0x37, 0xba, 0x08, 0x11, 0xf6, 0x0b, 0x4e, 0x49, 0x04, 0xe0, - 0x66, 0x03, 0xc9, 0xf0, 0x04, 0x89, 0x88, 0x04, 0x41, 0x01, 0x03, 0x88, 0x12, 0x00, 0x75, 0x9c, - 0xfe, 0x45, 0x69, 0x03, 0x40, 0x64, 0x05, 0xe8, 0x98, 0x01, 0xe5, 0xcc, 0x00, 0x12, 0x9a, 0x01, - 0x22, 0x08, 0x02, 0xd7, 0xa3, 0x02, 0x86, 0xe5, 0x02, 0x37, 0xe4, 0x01, 0x12, 0x11, 0x02, 0x92, - 0xa2, 0x02, 0x6d, 0x21, 0x01, 0x43, 0x38, 0xff, 0xae, 0xe6, 0xfe, 0x71, 0xb0, 0xfe, 0x74, 0x49, - 0xfe, 0xfa, 0xd8, 0xff, 0x5d, 0xef, 0xff, 0x39, 0xeb, 0xfe, 0xfe, 0x10, 0xff, 0x1f, 0xe7, 0xfe, - 0xa7, 0xe0, 0xfe, 0xcc, 0x42, 0xff, 0x59, 0x39, 0x0a, 0x88, 0xed, 0x0c, 0xd2, 0xbf, 0x03, 0xb9, - 0xb2, 0x03, 0x16, 0x09, 0x05, 0xf4, 0xd3, 0x04, 0xd6, 0xe1, 0x02, 0x89, 0x0f, 0xfe, 0x43, 0x1b, - 0xfd, 0xf8, 0x67, 0x02, 0x9f, 0x21, 0x04, 0x8f, 0xeb, 0x01, 0x1c, 0x75, 0x01, 0x3c, 0x2a, 0x00, - 0x9b, 0xc5, 0x01, 0x37, 0x29, 0x03, 0x3c, 0xb2, 0x01, 0x11, 0xeb, 0x01, 0x18, 0xdc, 0x02, 0x8b, - 0xa6, 0x01, 0x9d, 0xc8, 0x01, 0xf0, 0x1a, 0x02, 0x5a, 0x4f, 0xff, 0x6f, 0x79, 0xfe, 0xe0, 0x54, - 0xfe, 0x4a, 0x31, 0xfe, 0x06, 0x53, 0xff, 0x3b, 0xe5, 0xff, 0xac, 0x60, 0xff, 0xb7, 0xdf, 0xfe, - 0xe8, 0xfa, 0xfe, 0x3b, 0x95, 0xfe, 0xbe, 0xff, 0x0b, 0x3d, 0x33, 0x0f, 0xe7, 0x18, 0x04, 0x9c, - 0x85, 0x03, 0x75, 0x27, 0x04, 0x97, 0x49, 0x04, 0x0e, 0xd4, 0x02, 0xdd, 0x31, 0xfd, 0x62, 0xba, - 0xfb, 0x94, 0xbe, 0x02, 0x50, 0x59, 0x04, 0x22, 0xd1, 0xff, 0x95, 0x65, 0x00, 0x0b, 0x7b, 0x00, - 0x21, 0x9a, 0x01, 0x27, 0x21, 0x02, 0x2d, 0x9c, 0x01, 0xb8, 0x43, 0x02, 0xc9, 0x0a, 0x02, 0x8d, - 0x1d, 0x02, 0xe1, 0x15, 0x02, 0x63, 0x6a, 0x01, 0x2a, 0x45, 0x01, 0xa6, 0x8d, 0x00, 0x78, 0x0d, - 0xfe, 0xe9, 0x50, 0xfe, 0xd5, 0x0c, 0xff, 0x2a, 0x8c, 0xfe, 0x82, 0x45, 0xff, 0x45, 0xdb, 0xff, - 0xe4, 0x58, 0xff, 0xa8, 0x9e, 0xfe, 0xdd, 0x35, 0x0e, 0x51, 0x37, 0x11, 0xeb, 0xc3, 0x03, 0x5a, - 0xcd, 0x03, 0xe5, 0x1f, 0x04, 0xe4, 0x57, 0x04, 0xc0, 0x6e, 0x02, 0xea, 0xff, 0xfa, 0xfd, 0xc5, - 0xfa, 0x33, 0xc1, 0x03, 0x8f, 0x85, 0x04, 0xd0, 0x33, 0xff, 0x6e, 0x48, 0xff, 0x9e, 0x80, 0xfe, - 0xcd, 0x54, 0x01, 0x55, 0x99, 0x02, 0xdc, 0x3f, 0x01, 0x06, 0x98, 0x01, 0x73, 0xb6, 0x01, 0x2e, - 0x77, 0x01, 0x6a, 0x87, 0x01, 0x48, 0x94, 0x02, 0x9a, 0x16, 0x01, 0xd2, 0xb3, 0x00, 0xd2, 0x85, - 0x00, 0x8b, 0x39, 0xff, 0xd2, 0x81, 0xfe, 0x0a, 0x86, 0xfe, 0x77, 0xe4, 0xfe, 0x11, 0xe2, 0xfe, - 0xa4, 0x8b, 0xff, 0xbd, 0x5c, 0xff, 0x05, 0xd3, 0x10, 0xb1, 0x29, 0x13, 0xb6, 0x0b, 0x03, 0xf9, - 0x7b, 0x04, 0xa9, 0x95, 0x04, 0x78, 0x60, 0x04, 0xb7, 0xc7, 0x01, 0xbe, 0xfe, 0xf8, 0xee, 0x14, - 0xfa, 0x2c, 0xf1, 0x04, 0x5f, 0x6f, 0x04, 0xe6, 0x71, 0xfe, 0xb6, 0x09, 0xff, 0xa0, 0xcb, 0xfd, - 0xee, 0x5b, 0x00, 0x98, 0x78, 0x01, 0x5e, 0x79, 0x01, 0x80, 0x1a, 0x02, 0x04, 0x1e, 0x01, 0x99, - 0x5f, 0x00, 0xff, 0x27, 0x01, 0xea, 0x1f, 0x02, 0xb2, 0xfc, 0x00, 0x6e, 0xb5, 0x01, 0x76, 0x22, - 0x00, 0xc8, 0x7f, 0x00, 0x9c, 0xc9, 0x00, 0xe0, 0x91, 0xfe, 0x96, 0x9a, 0xfe, 0x43, 0xf7, 0xfe, - 0xea, 0xe7, 0xfe, 0xe9, 0x9b, 0xfe, 0xc6, 0xe2, 0x13, 0xd2, 0x7c, 0x15, 0x77, 0x39, 0x02, 0x94, - 0xe9, 0x04, 0x64, 0x90, 0x04, 0x51, 0xea, 0x03, 0x77, 0xf4, 0x00, 0xb7, 0x09, 0xf7, 0x0a, 0x72, - 0xfa, 0xae, 0x70, 0x06, 0xc4, 0x85, 0x03, 0x33, 0x46, 0xfd, 0xee, 0x76, 0xfe, 0x8c, 0x51, 0xfd, - 0xf9, 0x88, 0x00, 0x7d, 0xe5, 0x00, 0x74, 0x2c, 0x00, 0xfc, 0x06, 0x02, 0x7a, 0x39, 0x01, 0x28, - 0xfc, 0xff, 0x27, 0x64, 0x00, 0x9b, 0xfb, 0x00, 0x5f, 0xc0, 0x00, 0x57, 0x16, 0x01, 0x55, 0x2a, - 0x00, 0xce, 0x17, 0x01, 0x91, 0x95, 0x00, 0xfb, 0x58, 0x00, 0x61, 0x1c, 0x00, 0x8c, 0x99, 0xfe, - 0xfe, 0xc8, 0xfe, 0x6e, 0x8b, 0xfe, 0x1d, 0x37, 0x17, 0xb5, 0xa4, 0x17, 0xfc, 0x49, 0x01, 0x68, - 0xe0, 0x05, 0x7e, 0xe7, 0x04, 0xce, 0x21, 0x03, 0x16, 0x77, 0xff, 0xec, 0x01, 0xf5, 0x5b, 0x8c, - 0xfb, 0xec, 0x69, 0x08, 0x4f, 0x89, 0x02, 0x54, 0x67, 0xfc, 0xc0, 0xaf, 0xfd, 0x52, 0x86, 0xfc, - 0x31, 0xd7, 0x00, 0xc9, 0x6c, 0x00, 0xb5, 0x42, 0x00, 0xf4, 0xdb, 0x01, 0xb0, 0x3c, 0x00, 0x39, - 0xcc, 0xff, 0x78, 0x45, 0x00, 0x41, 0xc8, 0x00, 0xec, 0xde, 0xff, 0x8c, 0x4f, 0x00, 0xfc, 0x7c, - 0xff, 0xf6, 0xad, 0x00, 0x48, 0x31, 0x01, 0xb7, 0x89, 0x00, 0xfa, 0x92, 0x00, 0x19, 0xa4, 0x00, - 0xf2, 0xb6, 0xff, 0x1a, 0xae, 0xfd, 0x3f, 0xaa, 0x1a, 0x7c, 0xfe, 0x19, 0x6d, 0x52, 0x00, 0xf0, - 0xf4, 0x06, 0xb3, 0x2f, 0x05, 0x3f, 0x0e, 0x02, 0xb3, 0x91, 0xfd, 0xcd, 0x1e, 0xf3, 0x8e, 0x63, - 0xfd, 0xe8, 0x01, 0x0a, 0x1b, 0x45, 0x01, 0xfe, 0xd0, 0xfb, 0x9b, 0x4a, 0xfd, 0x91, 0xda, 0xfb, - 0x39, 0xde, 0x00, 0xfd, 0xa2, 0xff, 0x0a, 0xfb, 0xff, 0xde, 0x9e, 0x02, 0x63, 0xcf, 0xff, 0x4f, - 0xf9, 0xfe, 0x66, 0xe1, 0xff, 0xe4, 0x8d, 0x00, 0x2f, 0xd3, 0xff, 0x48, 0xf4, 0xff, 0xd5, 0x07, - 0xfe, 0xf6, 0x3b, 0x00, 0x19, 0xcd, 0x00, 0x31, 0x08, 0x00, 0xce, 0x8f, 0x01, 0x0f, 0x70, 0x00, - 0xc3, 0x17, 0x00, 0x40, 0xc6, 0xff, 0xbd, 0xbf, 0x1d, 0x3f, 0x23, 0x1d, 0xc2, 0x85, 0xff, 0x29, - 0x81, 0x07, 0xa3, 0x54, 0x05, 0x7f, 0x99, 0x00, 0xe6, 0xb1, 0xfb, 0x3c, 0x85, 0xf1, 0x97, 0x6e, - 0xff, 0x12, 0x20, 0x0b, 0xd4, 0xb3, 0xff, 0xee, 0x71, 0xfb, 0xc8, 0xd8, 0xfc, 0x4d, 0xb3, 0xfb, - 0x9c, 0x08, 0x01, 0xbe, 0x82, 0xfe, 0x62, 0x74, 0xff, 0x28, 0xff, 0x02, 0xc5, 0x99, 0xff, 0x6a, - 0xf4, 0xfe, 0xe6, 0x62, 0xff, 0xa5, 0xc1, 0xff, 0x90, 0xd1, 0xff, 0xc2, 0x9a, 0xff, 0xc4, 0xa2, - 0xfd, 0x07, 0x94, 0xff, 0xa8, 0xad, 0xff, 0xe8, 0x13, 0x00, 0x16, 0x64, 0x00, 0xd3, 0x2c, 0x00, - 0xf5, 0x52, 0x01, 0x9c, 0xa8, 0xff, 0x66, 0x73, 0x20, 0x9e, 0x72, 0x20, 0x19, 0x51, 0xff, 0xe6, - 0xc3, 0x07, 0xee, 0xaa, 0x05, 0x8b, 0x25, 0xff, 0xcf, 0xb6, 0xf9, 0x19, 0x03, 0xf0, 0xb0, 0xa0, - 0x01, 0x2d, 0xe4, 0x0b, 0xfd, 0x47, 0xfe, 0x7e, 0x31, 0xfb, 0x75, 0x33, 0xfc, 0x48, 0xe5, 0xfb, - 0x08, 0x58, 0x01, 0xdc, 0xb5, 0xfd, 0xe7, 0xc7, 0xfe, 0x9b, 0xf2, 0x02, 0x6c, 0x50, 0xff, 0xc4, - 0x17, 0xff, 0x79, 0x67, 0xff, 0x14, 0x2d, 0xff, 0x7e, 0x68, 0xff, 0x01, 0x56, 0xff, 0xee, 0x2c, - 0xfd, 0xaf, 0x94, 0xff, 0x4c, 0x8f, 0xff, 0xb8, 0xee, 0xfd, 0xe9, 0x22, 0x00, 0xa9, 0xfb, 0x00, - 0xe9, 0x91, 0x00, 0xc8, 0x0c, 0x00, 0xe4, 0xc2, 0x21, 0xe6, 0x47, 0x24, 0x54, 0x75, 0x00, 0x24, - 0x10, 0x07, 0x26, 0x89, 0x06, 0xd1, 0xb4, 0xfd, 0xfe, 0xfa, 0xf7, 0xdd, 0xc3, 0xee, 0x9f, 0xb9, - 0x02, 0x4b, 0x9a, 0x0c, 0xac, 0x56, 0xfd, 0x60, 0x1d, 0xfb, 0x2d, 0x2f, 0xfb, 0xb2, 0x0b, 0xfc, - 0xae, 0xa7, 0x01, 0xfd, 0x4a, 0xfd, 0x01, 0x81, 0xfe, 0x7b, 0x74, 0x02, 0x0c, 0xbf, 0xfe, 0xf8, - 0x10, 0xff, 0xaa, 0x7c, 0xff, 0x49, 0x06, 0xff, 0x47, 0x3d, 0xff, 0xd1, 0x8a, 0xfe, 0x7e, 0x69, - 0xfd, 0x42, 0xd7, 0xfe, 0x13, 0x1e, 0xfe, 0xf9, 0xe9, 0xfe, 0xf7, 0xfb, 0xff, 0xc9, 0xd5, 0xff, - 0xff, 0x7a, 0x00, 0xf9, 0xba, 0xff, 0x91, 0x2c, 0x21, 0x9e, 0x37, 0x28, 0x35, 0xe2, 0x03, 0x61, - 0x7a, 0x05, 0x95, 0x89, 0x07, 0x1d, 0x00, 0xfd, 0xde, 0x6e, 0xf6, 0xa4, 0x30, 0xee, 0xb3, 0x21, - 0x02, 0xcc, 0x0e, 0x0d, 0x42, 0x3f, 0xfd, 0x0d, 0x28, 0xfb, 0xa9, 0x4a, 0xfa, 0xfb, 0xb3, 0xfb, - 0x05, 0xd4, 0x01, 0x06, 0x33, 0xfd, 0x41, 0x51, 0xfe, 0x26, 0x49, 0x02, 0xc3, 0x4d, 0xfe, 0xcb, - 0x6d, 0xfe, 0x29, 0x9b, 0xff, 0xc8, 0xb5, 0xfe, 0xdf, 0x76, 0xff, 0x1e, 0xa5, 0xfe, 0xfd, 0xcb, - 0xfb, 0xdb, 0x57, 0xfe, 0x2d, 0xe8, 0xfe, 0x88, 0x4d, 0xfe, 0x4a, 0xaf, 0xff, 0x60, 0xe9, 0xff, - 0xff, 0x02, 0x00, 0xa1, 0x6c, 0xff, 0xd9, 0xbd, 0x1f, 0x2b, 0xbc, 0x2a, 0x1d, 0x31, 0x09, 0xba, - 0x78, 0x04, 0x9f, 0x6e, 0x07, 0x8e, 0x64, 0xfd, 0xad, 0xdd, 0xf4, 0x06, 0x2a, 0xee, 0x27, 0x96, - 0x00, 0x2a, 0x9d, 0x0c, 0xf2, 0xb2, 0xfd, 0xde, 0x31, 0xfb, 0x39, 0xd9, 0xf9, 0xe3, 0xe8, 0xfa, - 0x97, 0xcb, 0x01, 0x3a, 0x13, 0xfd, 0xc2, 0x1c, 0xfe, 0x53, 0x41, 0x02, 0x76, 0x42, 0xfe, 0x8f, - 0xdd, 0xfd, 0x0a, 0xdf, 0xfe, 0x2c, 0x14, 0xff, 0xb2, 0x73, 0xff, 0x0a, 0xf8, 0xfc, 0x9e, 0x23, - 0xfc, 0x1c, 0x8c, 0xfe, 0x07, 0x2d, 0xfe, 0x1f, 0x31, 0xfe, 0x65, 0x41, 0xff, 0x15, 0xed, 0xff, - 0xbb, 0x4d, 0x00, 0x2c, 0xda, 0xff, 0xa5, 0x34, 0x1f, 0x7a, 0x43, 0x2b, 0xaf, 0xd5, 0x0d, 0x39, - 0x3d, 0x06, 0x0f, 0x0b, 0x06, 0xac, 0xea, 0xfd, 0xf0, 0x15, 0xf4, 0xdc, 0xee, 0xed, 0x7c, 0xd4, - 0xff, 0xcd, 0x40, 0x0b, 0xf6, 0xcf, 0xfd, 0x78, 0x5e, 0xfb, 0xfb, 0xa3, 0xf9, 0xf6, 0x67, 0xfa, - 0x43, 0x8f, 0x01, 0x0e, 0xad, 0xfc, 0x87, 0x05, 0xfe, 0xc6, 0x44, 0x02, 0xbe, 0x6e, 0xfe, 0xd8, - 0x9b, 0xfd, 0xc0, 0xf7, 0xfe, 0x20, 0xe3, 0xfd, 0xb7, 0x6c, 0xfe, 0x80, 0x56, 0xfe, 0x58, 0x75, - 0xfb, 0x0a, 0xce, 0xfd, 0xb2, 0x08, 0xfe, 0xfb, 0x07, 0xfe, 0x48, 0x39, 0xff, 0x09, 0x33, 0x00, - 0x2c, 0x8d, 0x00, 0x1a, 0x1c, 0xff, 0xd8, 0xb1, 0x1f, 0x51, 0xfa, 0x2a, 0x82, 0x2d, 0x10, 0xd0, - 0x00, 0x0a, 0x11, 0x6a, 0x05, 0xe7, 0x16, 0xfd, 0xce, 0x5c, 0xf4, 0x34, 0xdd, 0xed, 0xa3, 0x40, - 0xff, 0x60, 0xbb, 0x09, 0xfc, 0xad, 0xfd, 0xa3, 0x6d, 0xfb, 0x9e, 0x17, 0xf9, 0xab, 0x61, 0xfa, - 0xa2, 0x5c, 0x01, 0x58, 0x15, 0xfc, 0x1a, 0xe3, 0xfd, 0x3e, 0x32, 0x02, 0xe9, 0xa4, 0xfe, 0xb5, - 0xc4, 0xfe, 0xd9, 0x17, 0xfd, 0x05, 0x2d, 0xfd, 0x15, 0x65, 0xff, 0x81, 0x9d, 0xfd, 0xae, 0xa3, - 0xfb, 0x34, 0x27, 0xfd, 0xd8, 0x69, 0xfd, 0x2c, 0x3a, 0xfe, 0xf5, 0xc6, 0xff, 0xfc, 0x27, 0x00, - 0x80, 0xa4, 0xff, 0x2f, 0x00, 0xff, 0x36, 0x5d, 0x21, 0xb7, 0x16, 0x2a, 0x73, 0x5b, 0x10, 0x8c, - 0xa7, 0x0d, 0x61, 0xa7, 0x06, 0xb1, 0xfa, 0xfb, 0x67, 0x54, 0xf4, 0x0e, 0x80, 0xef, 0x52, 0x9b, - 0xfe, 0xb4, 0xab, 0x07, 0xa9, 0x68, 0xfd, 0xea, 0x30, 0xfc, 0x6f, 0xc1, 0xf7, 0xfb, 0x11, 0xfa, - 0x2e, 0x8d, 0x01, 0xc1, 0x24, 0xfb, 0x59, 0x96, 0xfd, 0x93, 0x83, 0x02, 0x5a, 0xfc, 0xfe, 0xd2, - 0xa2, 0xfd, 0x34, 0x23, 0xfe, 0x67, 0x48, 0xfd, 0x4a, 0x3d, 0xfe, 0xc5, 0xc3, 0xfd, 0x7e, 0xba, - 0xfb, 0x76, 0x61, 0xfd, 0x4c, 0xae, 0xfc, 0x00, 0x79, 0xfe, 0x3c, 0x84, 0xff, 0x81, 0x57, 0xff, - 0xf4, 0x43, 0x00, 0x72, 0xe2, 0xff, 0x5b, 0xf7, 0x24, 0x7d, 0x7b, 0x28, 0xe3, 0x1e, 0x0f, 0x3d, - 0x06, 0x11, 0x83, 0x78, 0x07, 0x7d, 0x05, 0xfc, 0xa4, 0xcb, 0xf2, 0xb7, 0x26, 0xf2, 0x93, 0x48, - 0xff, 0x06, 0xc9, 0x03, 0xe4, 0xed, 0xfc, 0x24, 0xfb, 0xfd, 0x10, 0xdb, 0xf6, 0x37, 0xd7, 0xf8, - 0x95, 0xf1, 0x01, 0x75, 0x6c, 0xf9, 0x63, 0xb7, 0xfe, 0xc8, 0xf0, 0x01, 0x3d, 0x59, 0xfd, 0xe1, - 0x22, 0x00, 0x32, 0xd1, 0xfd, 0x76, 0x98, 0xfc, 0xf4, 0x8c, 0xfe, 0x77, 0x4e, 0xfd, 0x5e, 0x8e, - 0xfb, 0x1d, 0x1b, 0xfe, 0x25, 0x98, 0xfc, 0x77, 0x5a, 0xfd, 0x6c, 0xe2, 0xfe, 0x23, 0x08, 0x00, - 0x85, 0xe0, 0x00, 0xc5, 0x0e, 0xff, 0xb1, 0xb2, 0x29, 0xa7, 0xa4, 0x26, 0x4f, 0x28, 0x0c, 0x2c, - 0xee, 0x14, 0x97, 0xc9, 0x06, 0x95, 0xfd, 0xfc, 0xcf, 0xe2, 0xf1, 0xaa, 0x36, 0xf4, 0xc8, 0x19, - 0x02, 0xc3, 0x52, 0xfe, 0x39, 0x39, 0xfb, 0x0b, 0x95, 0x00, 0x22, 0xe2, 0xf6, 0x2c, 0x5a, 0xf7, - 0x83, 0x69, 0x01, 0x65, 0xd7, 0xf8, 0x86, 0xcf, 0xfd, 0x1e, 0xf2, 0x00, 0x41, 0x57, 0xfe, 0x40, - 0xc1, 0x00, 0xc8, 0x87, 0xfd, 0x14, 0xdd, 0xfc, 0x07, 0x6e, 0xfe, 0xca, 0x48, 0xfd, 0x7e, 0x68, - 0xfb, 0x5c, 0xb8, 0xfe, 0x85, 0x87, 0xfb, 0x51, 0xdb, 0xfc, 0xa7, 0xdf, 0xff, 0x93, 0x95, 0xff, - 0x07, 0xd4, 0xff, 0x59, 0x38, 0xff, 0x7e, 0xcb, 0x2e, 0x0a, 0xa8, 0x25, 0x8a, 0x50, 0x07, 0x9c, - 0x9b, 0x19, 0x11, 0xc3, 0x05, 0xb2, 0xb6, 0xfc, 0x7a, 0x4e, 0xf3, 0x82, 0xad, 0xf5, 0xdc, 0x43, - 0x06, 0x88, 0x68, 0xf9, 0x5f, 0x14, 0xf7, 0xb0, 0xc8, 0x03, 0x3f, 0x2a, 0xf8, 0xc3, 0xea, 0xf5, - 0xf3, 0xf4, 0x01, 0x64, 0xb6, 0xf5, 0xe6, 0x49, 0xfd, 0xe4, 0x9d, 0x02, 0x12, 0xda, 0xfb, 0x19, - 0x00, 0x03, 0x00, 0x25, 0xfe, 0x1d, 0x2d, 0xfc, 0xbe, 0xbc, 0xfe, 0xce, 0xb8, 0xfd, 0xd6, 0x9f, - 0xfb, 0xe7, 0x09, 0xfe, 0x54, 0x97, 0xfb, 0xfb, 0x39, 0xfd, 0x8f, 0xea, 0xff, 0xfb, 0xd9, 0xfe, - 0x22, 0xd7, 0xff, 0xe5, 0xdc, 0xfe, 0xa2, 0x91, 0x33, 0x41, 0x27, 0x26, 0x42, 0x9f, 0x00, 0xc6, - 0xc0, 0x1d, 0xf5, 0xff, 0x05, 0x24, 0xcb, 0xf9, 0x1f, 0xdf, 0xf5, 0x32, 0xc4, 0xf7, 0xfb, 0x94, - 0x0a, 0x1a, 0x21, 0xf6, 0x1b, 0x82, 0xf0, 0x25, 0x87, 0x05, 0x92, 0x17, 0xfb, 0xc3, 0x13, 0xf6, - 0x93, 0x8c, 0xff, 0x30, 0x17, 0xf4, 0x8e, 0x90, 0xfd, 0x03, 0x94, 0x01, 0xdf, 0x35, 0xfb, 0x17, - 0x41, 0x04, 0x02, 0xfd, 0xfe, 0xda, 0x79, 0xfb, 0xf2, 0xa9, 0xfe, 0x12, 0x4f, 0xfe, 0x5e, 0xab, - 0xfb, 0x55, 0x29, 0xfe, 0x10, 0x5d, 0xfb, 0xf7, 0xd1, 0xfc, 0xd5, 0x50, 0x00, 0x99, 0xd7, 0xfe, - 0x21, 0x53, 0xff, 0x72, 0x44, 0xfe, 0x84, 0xaf, 0x39, 0xb1, 0x73, 0x27, 0x73, 0xbd, 0xf8, 0x93, - 0x47, 0x1f, 0x45, 0xb8, 0x07, 0x74, 0x79, 0xf6, 0x20, 0xc0, 0xf7, 0xff, 0xa9, 0xfa, 0x6d, 0xe3, - 0x0e, 0x19, 0x18, 0xf5, 0xa3, 0xab, 0xe8, 0xd9, 0xc6, 0x04, 0xea, 0xb5, 0x00, 0xed, 0x8f, 0xf4, - 0xed, 0x51, 0xfe, 0x5a, 0xac, 0xf3, 0xb8, 0x6f, 0xfb, 0xb2, 0xed, 0x02, 0xa3, 0xb2, 0xf9, 0xed, - 0xb2, 0x04, 0x16, 0x61, 0x00, 0x9b, 0xbd, 0xfa, 0x73, 0xc7, 0xfe, 0x01, 0x45, 0xfe, 0xb7, 0xa6, - 0xfb, 0x66, 0xe0, 0xfe, 0x00, 0x8c, 0xfb, 0x75, 0xe1, 0xfb, 0xf7, 0x0f, 0x01, 0x2f, 0xc9, 0xfe, - 0x59, 0xd0, 0xfe, 0xa0, 0xa8, 0xfd, 0xd6, 0x68, 0x41, 0xa5, 0xab, 0x2c, 0x26, 0xea, 0xed, 0x12, - 0x01, 0x1a, 0x6a, 0xe0, 0x0b, 0x91, 0x6a, 0xf7, 0x40, 0xec, 0xf9, 0x38, 0xdc, 0xfa, 0xf8, 0x6c, - 0x11, 0x85, 0x20, 0xf8, 0xe2, 0xa2, 0xe1, 0xb1, 0x63, 0x02, 0x5f, 0x4c, 0x05, 0x23, 0x72, 0xf4, - 0xb3, 0xb5, 0xfd, 0xad, 0x7c, 0xf2, 0xf1, 0x1e, 0xfb, 0xdd, 0x80, 0x03, 0x13, 0x5a, 0xf9, 0xa8, - 0x33, 0x04, 0x29, 0x0d, 0x01, 0x11, 0x97, 0xfb, 0x59, 0x55, 0xfe, 0xf2, 0xe0, 0xfd, 0xaa, 0x74, - 0xfb, 0x35, 0xda, 0xff, 0x65, 0x56, 0xfc, 0xfb, 0x8c, 0xfb, 0xcb, 0xb7, 0x00, 0xd6, 0x36, 0xff, - 0x8c, 0x95, 0xfe, 0x38, 0x0c, 0xfd, 0x2f, 0x25, 0x49, 0x24, 0x5b, 0x32, 0xf0, 0x2d, 0xe3, 0x06, - 0xf4, 0x11, 0xca, 0xfa, 0x0f, 0x7c, 0x72, 0xfa, 0x24, 0xbe, 0xfb, 0x8f, 0xf5, 0xf9, 0x30, 0x5f, - 0x12, 0xc5, 0xe6, 0xfb, 0xd1, 0x50, 0xdd, 0x54, 0xc7, 0xfd, 0xf0, 0xa4, 0x07, 0xdb, 0xcf, 0xf6, - 0x8b, 0x60, 0xfc, 0x35, 0x02, 0xf2, 0xde, 0x95, 0xfa, 0x5b, 0x41, 0x03, 0xa2, 0xbd, 0xf9, 0x5c, - 0x77, 0x03, 0xe8, 0x9c, 0x01, 0xe1, 0xcb, 0xfb, 0x2c, 0x90, 0xfd, 0x76, 0x6a, 0xfd, 0xb5, 0xcf, - 0xfb, 0x51, 0x20, 0x00, 0xc4, 0xb9, 0xfc, 0xab, 0x6e, 0xfb, 0xfd, 0x27, 0x00, 0x96, 0xf3, 0xff, - 0x16, 0xa8, 0xfe, 0x41, 0x02, 0xfc, 0xa8, 0x89, 0x50, 0xc7, 0xe8, 0x37, 0x29, 0x9c, 0xd9, 0x35, - 0x94, 0x09, 0x64, 0x9b, 0x12, 0xf6, 0x49, 0xff, 0xd2, 0x85, 0xfd, 0xf6, 0xc5, 0xf8, 0x9b, 0x88, - 0x12, 0x90, 0x1d, 0x00, 0x89, 0x32, 0xdb, 0x30, 0x8a, 0xf8, 0x04, 0x36, 0x08, 0x8d, 0x74, 0xfa, - 0x84, 0xbe, 0xfb, 0x0d, 0x57, 0xf1, 0x12, 0x0c, 0xfb, 0x1a, 0x2f, 0x02, 0xf9, 0xff, 0xf9, 0xca, - 0x9e, 0x03, 0x3f, 0x87, 0x01, 0x7f, 0xa9, 0xfb, 0x1a, 0x5b, 0xfd, 0x4f, 0x2c, 0xfd, 0xb6, 0x0b, - 0xfc, 0x1d, 0xf3, 0xff, 0xe3, 0x8a, 0xfc, 0xda, 0x1b, 0xfc, 0xdb, 0x00, 0x00, 0x3f, 0x6b, 0x00, - 0x6f, 0x5c, 0xfe, 0x0f, 0x30, 0xfb, 0x63, 0xba, 0x59, 0x6d, 0x5c, 0x39, 0xe8, 0x5c, 0xd1, 0x23, - 0xcf, 0x03, 0x71, 0x52, 0x12, 0x85, 0x81, 0x04, 0x5c, 0x43, 0xfe, 0xdd, 0xcc, 0xf6, 0x01, 0x17, - 0x14, 0x6b, 0x13, 0x04, 0xff, 0x44, 0xd8, 0xa2, 0xf0, 0xf3, 0x14, 0x6e, 0x08, 0x1b, 0xed, 0xfc, - 0x19, 0xd5, 0xfc, 0xed, 0x41, 0xf0, 0xb2, 0x10, 0xfc, 0x40, 0x0a, 0x00, 0x3c, 0xb1, 0xf9, 0x25, - 0xe2, 0x04, 0xa5, 0xa1, 0x00, 0x81, 0x35, 0xfb, 0x80, 0x68, 0xfd, 0x4e, 0x3f, 0xfd, 0xb5, 0xfe, - 0xfa, 0xec, 0xe2, 0xff, 0x18, 0x6e, 0xfc, 0xf9, 0xdd, 0xfc, 0xf4, 0xa2, 0xff, 0x4a, 0x21, 0x00, - 0xbf, 0x77, 0xfe, 0xfd, 0xd8, 0xfa, 0x3e, 0xb3, 0x61, 0x4a, 0xdf, 0x3a, 0x68, 0xa3, 0xca, 0xfb, - 0xf8, 0x00, 0x68, 0x79, 0x10, 0xf1, 0xba, 0x08, 0x50, 0xd1, 0xfe, 0xeb, 0x2a, 0xf4, 0x60, 0xc9, - 0x18, 0xbf, 0x8f, 0x08, 0x05, 0xb1, 0xd3, 0x81, 0xfd, 0xf0, 0xa3, 0xf2, 0x08, 0x07, 0xc0, 0xfd, - 0x7f, 0x8f, 0x00, 0x4f, 0x19, 0xf0, 0x58, 0x44, 0xfb, 0x4b, 0x85, 0xfe, 0x90, 0xe5, 0xf9, 0xa9, - 0x28, 0x06, 0xf5, 0x6b, 0xff, 0xa3, 0x42, 0xfb, 0xdd, 0x15, 0xfe, 0x2a, 0x25, 0xfd, 0x23, 0x75, - 0xf9, 0xc2, 0x5f, 0x00, 0xb9, 0xb8, 0xfc, 0xbe, 0xd7, 0xfc, 0x99, 0x88, 0xff, 0x28, 0x21, 0x00, - 0xd6, 0x00, 0xff, 0x88, 0x6f, 0xfa, 0xe6, 0x91, 0x68, 0x66, 0x90, 0x3b, 0x6f, 0xf2, 0xc4, 0xad, - 0xae, 0x00, 0xb3, 0xd1, 0x0c, 0x86, 0xb5, 0x0a, 0x3e, 0xc7, 0xfe, 0xdd, 0x7b, 0xf0, 0x0d, 0x44, - 0x20, 0x5b, 0xd0, 0x0a, 0x6e, 0xd7, 0xce, 0x8f, 0x2b, 0xf0, 0xe7, 0xdc, 0x06, 0x52, 0xb5, 0xfe, - 0x96, 0xe9, 0x04, 0xbf, 0x15, 0xf0, 0x47, 0x21, 0xf9, 0x47, 0xb2, 0xfd, 0xec, 0x4e, 0xfa, 0xa3, - 0xcc, 0x05, 0x93, 0x54, 0xfe, 0x6f, 0xa9, 0xfb, 0xa2, 0xe1, 0xfe, 0x21, 0x70, 0xfc, 0xdd, 0x14, - 0xf8, 0x63, 0x2f, 0x00, 0xff, 0x0a, 0xfd, 0xaa, 0xa7, 0xfc, 0x1c, 0x4d, 0xff, 0xdb, 0x57, 0x00, - 0x2a, 0xd1, 0xfe, 0xa2, 0x46, 0xfa, 0xa7, 0x6a, 0x6e, 0x36, 0x1e, 0x3c, 0x98, 0xb0, 0xc0, 0x21, - 0x1e, 0x02, 0x72, 0x77, 0x08, 0xd7, 0x18, 0x0b, 0xa4, 0x30, 0xfe, 0x47, 0x21, 0xed, 0x9e, 0x80, - 0x28, 0x05, 0x81, 0x0b, 0x73, 0x79, 0xcc, 0x3c, 0xd8, 0xef, 0xb4, 0x4b, 0x03, 0x9f, 0x5a, 0x00, - 0xaa, 0x8a, 0x08, 0xee, 0xe5, 0xf0, 0x6e, 0xc8, 0xf6, 0x44, 0x04, 0xfe, 0x98, 0x21, 0xfa, 0x64, - 0x07, 0x04, 0xeb, 0x52, 0xfe, 0x5e, 0x63, 0xfc, 0x30, 0x78, 0xff, 0x59, 0x94, 0xfb, 0xdf, 0x08, - 0xf7, 0x85, 0xb9, 0xff, 0xfe, 0x9f, 0xfd, 0x45, 0x63, 0xfc, 0x3e, 0x4a, 0xff, 0x15, 0x2a, 0x00, - 0x43, 0xb1, 0xfe, 0x2a, 0xd7, 0xfa, 0x95, 0x77, 0x74, 0xc7, 0xc6, 0x3b, 0x61, 0xf9, 0xbd, 0x69, - 0x13, 0x04, 0x39, 0xda, 0x03, 0x76, 0x74, 0x0b, 0xa7, 0x81, 0xfc, 0xa2, 0x06, 0xeb, 0xd6, 0x3a, - 0x2f, 0x54, 0xcf, 0x0b, 0xe5, 0x5a, 0xcd, 0x38, 0x9e, 0xee, 0x68, 0x25, 0x00, 0x18, 0x68, 0x01, - 0xb3, 0xb7, 0x0b, 0x01, 0x71, 0xf2, 0x1e, 0xf1, 0xf4, 0xc1, 0x13, 0xff, 0x65, 0x42, 0xf9, 0x39, - 0x91, 0x01, 0x33, 0x0e, 0xff, 0xa3, 0xc7, 0xfd, 0x86, 0x35, 0xff, 0x80, 0xe2, 0xfa, 0xf9, 0x71, - 0xf6, 0xaf, 0x85, 0xff, 0x01, 0x3f, 0xfe, 0xb4, 0x19, 0xfc, 0xcc, 0x04, 0xff, 0xd0, 0x7c, 0x00, - 0xff, 0xf0, 0xfe, 0xbf, 0x9b, 0xfa, 0xdf, 0xf0, 0x77, 0xae, 0xf5, 0x3d, 0xbc, 0x9f, 0xbb, 0x4a, - 0xc8, 0x04, 0xae, 0xdc, 0xff, 0xb9, 0x8e, 0x0b, 0x1b, 0x5c, 0xfa, 0x22, 0x36, 0xe9, 0xaf, 0x41, - 0x32, 0x78, 0x8a, 0x0d, 0x94, 0xaf, 0xd0, 0x87, 0xf8, 0xeb, 0x3d, 0x90, 0xfd, 0xff, 0x08, 0x01, - 0x4b, 0x79, 0x0e, 0xd7, 0x58, 0xf4, 0x6c, 0x4c, 0xf3, 0xb2, 0x78, 0x00, 0x42, 0xa1, 0xf7, 0x61, - 0xd6, 0xfe, 0x45, 0xe6, 0xff, 0x61, 0x52, 0xff, 0x64, 0x0c, 0xfe, 0xab, 0xa9, 0xfa, 0x4f, 0xca, - 0xf5, 0x2c, 0x94, 0xff, 0x44, 0xf4, 0xfe, 0xa0, 0xe7, 0xfa, 0x5f, 0x3b, 0xff, 0x60, 0x2e, 0x01, - 0x8a, 0x78, 0xfe, 0x3e, 0xcf, 0xf9, 0xd0, 0x81, 0x7b, 0x0f, 0x5b, 0x3f, 0x89, 0xe2, 0xba, 0x47, - 0x48, 0x04, 0xd4, 0x59, 0xfc, 0xa5, 0x4a, 0x0c, 0xfb, 0x3b, 0xf7, 0xf2, 0x2e, 0xe8, 0xea, 0xd4, - 0x32, 0x71, 0xb5, 0x0f, 0x40, 0x95, 0xd5, 0x7b, 0x2c, 0xe9, 0xf1, 0x9c, 0xfb, 0x27, 0x8e, 0xff, - 0xa0, 0x4d, 0x11, 0x0d, 0x00, 0xf6, 0x47, 0x64, 0xf2, 0xeb, 0xaf, 0x01, 0x0b, 0x01, 0xf6, 0xaa, - 0x57, 0xfc, 0x0b, 0xb1, 0x00, 0xbf, 0x49, 0x00, 0xbe, 0x1d, 0xfd, 0x8d, 0xe5, 0xfa, 0x42, 0xae, - 0xf4, 0xc9, 0x6a, 0x00, 0x00, 0x15, 0xff, 0x0b, 0xed, 0xf9, 0x49, 0x18, 0x00, 0x36, 0x05, 0x01, - 0x5f, 0xc4, 0xfd, 0x10, 0x79, 0xf9, 0x3e, 0x60, 0x7e, 0xc1, 0x62, 0x40, 0x06, 0xc9, 0xbb, 0xca, - 0xeb, 0x02, 0x3d, 0x96, 0xf9, 0x07, 0xca, 0x0c, 0x16, 0x6c, 0xf4, 0xa5, 0x05, 0xe7, 0xcc, 0x07, - 0x31, 0x70, 0xfe, 0x12, 0x34, 0xbd, 0xda, 0x6f, 0x08, 0xe7, 0x73, 0x2d, 0xfa, 0xf9, 0x68, 0xfd, - 0x36, 0xb1, 0x13, 0x3e, 0x76, 0xf7, 0x48, 0x3b, 0xf2, 0x61, 0x1d, 0x02, 0xe3, 0xea, 0xf4, 0x7a, - 0x6f, 0xfa, 0x8b, 0xfa, 0x00, 0xdb, 0xae, 0x00, 0x17, 0x86, 0xfc, 0xcd, 0x8a, 0xfb, 0x74, 0xde, - 0xf3, 0x6d, 0x9b, 0x00, 0x49, 0x33, 0xff, 0x18, 0x08, 0xfa, 0x24, 0x0c, 0x00, 0xec, 0x3e, 0x00, - 0x21, 0x7b, 0xfd, 0xcc, 0x42, 0xf9, 0x90, 0xbb, 0x7e, 0xec, 0xb4, 0x43, 0xe6, 0x92, 0xbd, 0xde, - 0xbe, 0x00, 0xb2, 0x9d, 0xf7, 0x01, 0xc7, 0x0b, 0x5b, 0x65, 0xf4, 0x91, 0xa1, 0xe3, 0x20, 0x45, - 0x2d, 0x21, 0x60, 0x18, 0xfa, 0x2b, 0xdf, 0x03, 0x44, 0xe6, 0x03, 0x9e, 0xf8, 0x54, 0x52, 0xfb, - 0xaf, 0x0c, 0x15, 0xb9, 0x2e, 0xf9, 0xf9, 0xc4, 0xf2, 0x71, 0x76, 0x01, 0x1b, 0x5e, 0xf4, 0x07, - 0x5a, 0xf9, 0xb3, 0xaf, 0x00, 0x5d, 0x8e, 0x00, 0xe6, 0x29, 0xfc, 0x03, 0xb0, 0xfc, 0x79, 0x76, - 0xf3, 0x69, 0xa1, 0xff, 0x3c, 0x0c, 0x00, 0x40, 0x13, 0xfa, 0x01, 0x46, 0xff, 0xa6, 0xc8, 0xff, - 0x52, 0x00, 0xfd, 0xf2, 0xda, 0xf9, 0x98, 0x94, 0x7c, 0xe1, 0x64, 0x48, 0x0f, 0x08, 0xc1, 0x61, - 0xc3, 0xfe, 0x84, 0xbc, 0xf5, 0x80, 0x1f, 0x09, 0x14, 0x60, 0xf7, 0xe7, 0xb8, 0xdd, 0x3d, 0x45, - 0x28, 0x15, 0x6e, 0x1f, 0xe1, 0xac, 0xe2, 0x7d, 0x39, 0xe7, 0xd6, 0xf1, 0xf6, 0x86, 0x26, 0xf9, - 0x1b, 0x23, 0x15, 0xfb, 0x80, 0xfb, 0xf1, 0x0e, 0xf4, 0x09, 0xd3, 0xff, 0x30, 0x16, 0xf4, 0xc5, - 0xfe, 0xf8, 0xd4, 0x8a, 0x00, 0x86, 0x6a, 0xff, 0xd1, 0x8a, 0xfc, 0xb3, 0xc2, 0xfd, 0x03, 0x35, - 0xf3, 0xde, 0xd1, 0xfe, 0xe3, 0xcc, 0xff, 0x8e, 0x62, 0xfa, 0xae, 0x9c, 0xfe, 0xd9, 0x1b, 0xff, - 0xff, 0x5f, 0xfd, 0x0e, 0x56, 0xfb, 0xb2, 0x45, 0x78, 0x8f, 0x78, 0x4d, 0x18, 0x59, 0xc6, 0x54, - 0xb3, 0xfd, 0x4f, 0x9b, 0xf3, 0x98, 0xa4, 0x05, 0x3f, 0xfb, 0xfb, 0xdb, 0xd8, 0xd5, 0x8f, 0xa2, - 0x22, 0x0f, 0x60, 0x27, 0xe7, 0xbe, 0xe5, 0x63, 0x2e, 0xe9, 0x7f, 0x45, 0xf6, 0x9f, 0x82, 0xf6, - 0x9d, 0xfd, 0x13, 0xc0, 0xb8, 0xfe, 0x08, 0x95, 0xf5, 0x4f, 0xb8, 0xfd, 0x90, 0xaa, 0xf3, 0xcb, - 0xc6, 0xf9, 0xf4, 0x30, 0x00, 0x3f, 0xd3, 0xfd, 0xbf, 0x36, 0xfd, 0xc2, 0x99, 0xfe, 0xd9, 0x3d, - 0xf3, 0x56, 0x7e, 0xfd, 0xe8, 0x7b, 0xff, 0x52, 0x80, 0xfa, 0x0f, 0x08, 0xfe, 0x75, 0x94, 0xff, - 0x23, 0x50, 0xfe, 0x47, 0x3d, 0xfc, 0x55, 0x13, 0x72, 0x52, 0xdc, 0x51, 0x8f, 0x24, 0xce, 0xc8, - 0x52, 0xfd, 0xa3, 0xce, 0xf0, 0xff, 0x69, 0x02, 0x87, 0x7b, 0x00, 0x2a, 0xe8, 0xcd, 0xf6, 0x9a, - 0x1b, 0x31, 0xe5, 0x2e, 0x52, 0x5b, 0xe9, 0x37, 0x83, 0xeb, 0x6c, 0x54, 0xf7, 0x66, 0xc3, 0xf2, - 0x42, 0xa9, 0x11, 0x3e, 0xb4, 0x02, 0xc8, 0xb7, 0xf6, 0x5b, 0x92, 0xfb, 0x59, 0x0a, 0xf4, 0x06, - 0x06, 0xfa, 0x80, 0x2d, 0x00, 0x2b, 0x50, 0xfc, 0xda, 0x0b, 0xfd, 0x9b, 0xaa, 0xff, 0x3b, 0x7c, - 0xf2, 0x5e, 0xf4, 0xfc, 0x55, 0x66, 0xfe, 0x6d, 0x65, 0xfa, 0xab, 0x1e, 0xff, 0xd0, 0x0d, 0x00, - 0x64, 0xf9, 0xfe, 0x36, 0x5a, 0xfd, 0x68, 0xea, 0x6a, 0x79, 0xae, 0x55, 0x56, 0xc8, 0xd7, 0x7c, - 0x0c, 0xfd, 0x3d, 0xc4, 0xed, 0x3b, 0x77, 0x00, 0x95, 0x0f, 0x04, 0x77, 0x56, 0xc8, 0xb0, 0x3b, - 0x12, 0x06, 0xc5, 0x34, 0x15, 0x6b, 0xef, 0x54, 0xde, 0xec, 0x70, 0x5f, 0xfb, 0xb7, 0xd7, 0xed, - 0x7c, 0xbe, 0x0e, 0xa0, 0x02, 0x07, 0xf9, 0x16, 0xf7, 0xa0, 0x41, 0xfb, 0x0f, 0x31, 0xf4, 0x68, - 0x01, 0xfa, 0x34, 0x40, 0x00, 0x2f, 0x06, 0xfc, 0x37, 0xaa, 0xfa, 0xb3, 0xd8, 0x00, 0xc6, 0x22, - 0xf3, 0x61, 0xe0, 0xfa, 0xed, 0x88, 0xfe, 0x7e, 0x17, 0xfb, 0x70, 0x3a, 0x00, 0x98, 0x98, 0x00, - 0x91, 0x4a, 0x00, 0xa5, 0xd9, 0xfd, 0x6c, 0x46, 0x64, 0x45, 0x05, 0x58, 0xca, 0x48, 0xe0, 0xfc, - 0x21, 0xfd, 0x54, 0xd5, 0xec, 0x7a, 0xa4, 0xfd, 0x51, 0xa3, 0x04, 0xe0, 0xda, 0xc7, 0xda, 0x01, - 0x07, 0xbd, 0x48, 0x36, 0x98, 0x3e, 0xf9, 0x10, 0x66, 0xec, 0x43, 0x48, 0x00, 0x10, 0x38, 0xea, - 0x2b, 0x9e, 0x09, 0xa4, 0x05, 0x0c, 0x1c, 0xc8, 0xf6, 0xef, 0xe9, 0xfb, 0x26, 0xae, 0xf4, 0x39, - 0x64, 0xf8, 0xf7, 0xce, 0x00, 0xf9, 0x9d, 0xfb, 0x5e, 0xb5, 0xf7, 0x6f, 0x6c, 0x01, 0x03, 0x68, - 0xf3, 0x85, 0x33, 0xfa, 0xf2, 0x95, 0xff, 0x81, 0xba, 0xfa, 0x5f, 0xac, 0x01, 0x0c, 0x02, 0x02, - 0xf0, 0x47, 0x00, 0xd9, 0x0f, 0xfd, 0x18, 0x7e, 0x5f, 0x5b, 0x6b, 0x58, 0x40, 0x09, 0xe5, 0x75, - 0x48, 0xfe, 0xf6, 0x22, 0xf0, 0xbe, 0x7f, 0xf8, 0x28, 0x02, 0x01, 0x93, 0x50, 0xcc, 0x2b, 0x66, - 0xfc, 0x7c, 0x92, 0x33, 0xcd, 0x51, 0x04, 0xf5, 0xbe, 0xeb, 0x8f, 0xd8, 0x03, 0x6d, 0xdc, 0xe8, - 0xb0, 0x8a, 0x03, 0xb5, 0x23, 0x10, 0xad, 0xa2, 0xf7, 0x70, 0xeb, 0xfb, 0x83, 0x27, 0xf6, 0xab, - 0x54, 0xf5, 0x83, 0x57, 0xff, 0xe1, 0x4e, 0xfd, 0x68, 0x6d, 0xf4, 0xf1, 0xa8, 0xff, 0x90, 0xbf, - 0xf5, 0x06, 0x2f, 0xfa, 0x85, 0x5d, 0x00, 0x52, 0x9c, 0xfa, 0xb2, 0xc5, 0x02, 0x22, 0xa3, 0x02, - 0x78, 0xb2, 0xff, 0xc1, 0xd7, 0xfc, 0x1b, 0xe4, 0x5d, 0xc4, 0x8f, 0x54, 0xf4, 0xcf, 0xe7, 0x47, - 0x56, 0x02, 0x0c, 0x46, 0xf4, 0xcb, 0x20, 0xf4, 0xc9, 0xa3, 0xfa, 0x16, 0xb4, 0xd2, 0xb7, 0x64, - 0xf4, 0x3f, 0x81, 0x30, 0xb7, 0x26, 0x0c, 0x90, 0x40, 0xec, 0x3a, 0x8c, 0x07, 0xbd, 0xba, 0xe6, - 0x3e, 0x69, 0x00, 0xef, 0x26, 0x12, 0xfd, 0x91, 0xf9, 0x05, 0xd1, 0xfc, 0x79, 0x54, 0xf6, 0xbf, - 0x4a, 0xf2, 0x05, 0x93, 0xfe, 0x7a, 0x5f, 0xfd, 0x10, 0xe0, 0xf1, 0xc7, 0x43, 0x00, 0x82, 0xa9, - 0xf6, 0xf5, 0xff, 0xfa, 0x6a, 0x5e, 0x01, 0x2c, 0x45, 0xfa, 0x8c, 0x79, 0x03, 0x5f, 0xce, 0x02, - 0x28, 0x39, 0xff, 0x50, 0xa1, 0xfc, 0x9b, 0xc2, 0x5c, 0x4b, 0x10, 0x50, 0x25, 0xc4, 0xe8, 0x37, - 0xa4, 0x07, 0x4a, 0x81, 0xf8, 0xf2, 0x15, 0xef, 0x32, 0x4a, 0xf5, 0x7d, 0xbe, 0xda, 0x55, 0x2d, - 0xec, 0x25, 0x08, 0x2d, 0x6a, 0x1f, 0x14, 0xb4, 0x5f, 0xe9, 0x48, 0x8a, 0x0c, 0x13, 0xf1, 0xe6, - 0xdc, 0xc3, 0xfb, 0xca, 0xa0, 0x15, 0x2e, 0x23, 0xfb, 0xc8, 0x88, 0xfc, 0x97, 0xce, 0xf6, 0x1b, - 0xb8, 0xf1, 0xae, 0x65, 0xfb, 0xa0, 0xc0, 0xfc, 0xba, 0x36, 0xf1, 0x62, 0x01, 0x01, 0x70, 0xd5, - 0xf8, 0x84, 0xc3, 0xf9, 0x63, 0x2e, 0x02, 0x48, 0xfe, 0xfa, 0x04, 0xb1, 0x03, 0x2c, 0x05, 0x02, - 0xb4, 0xd0, 0xfe, 0xf1, 0xc6, 0xfd, 0xbb, 0x98, 0x5d, 0x82, 0x0e, 0x4b, 0x87, 0xd6, 0xe6, 0x92, - 0xfb, 0x0b, 0x1f, 0x06, 0xfc, 0xb7, 0xfc, 0xea, 0x56, 0x1a, 0xf2, 0x03, 0x3c, 0xe4, 0xe5, 0x40, - 0xe7, 0xe1, 0x8c, 0x24, 0x82, 0xec, 0x1c, 0x04, 0x3f, 0xe5, 0xc0, 0x6d, 0x0d, 0xe6, 0x1d, 0xee, - 0x94, 0x08, 0xf4, 0x76, 0xf3, 0x19, 0xc8, 0xc2, 0xfc, 0x02, 0x81, 0xf9, 0x5c, 0x5e, 0xfa, 0xf8, - 0xd8, 0xf0, 0x77, 0x56, 0xf8, 0x89, 0x53, 0xfc, 0x42, 0xe2, 0xf0, 0x74, 0x2e, 0x01, 0xdf, 0x4c, - 0xfc, 0xdf, 0x39, 0xf7, 0x23, 0x61, 0x02, 0x80, 0xac, 0xfc, 0x3a, 0x0a, 0x02, 0x8d, 0xb7, 0x02, - 0x60, 0x99, 0xfe, 0x62, 0x24, 0xfe, 0x1b, 0x0b, 0x5c, 0xd1, 0x91, 0x47, 0xbd, 0x66, 0xe5, 0x5c, - 0x82, 0x10, 0xa1, 0x97, 0xfe, 0x3a, 0x2c, 0xe8, 0xa1, 0x6e, 0xf0, 0xda, 0x2b, 0xea, 0xd3, 0x4a, - 0xe5, 0xa0, 0xf2, 0x1a, 0xf4, 0x06, 0x25, 0xe3, 0x8f, 0xe5, 0xed, 0x65, 0x07, 0xc7, 0xb6, 0xf7, - 0x91, 0xdc, 0xee, 0x67, 0x2f, 0x19, 0x07, 0x5b, 0x03, 0x83, 0x5d, 0xf5, 0xe0, 0xf9, 0xfb, 0x2c, - 0x57, 0xf2, 0xe8, 0x56, 0xf6, 0x84, 0x20, 0xfc, 0x53, 0x01, 0xf0, 0x74, 0x74, 0x00, 0xcc, 0x98, - 0xfe, 0x4d, 0x99, 0xf6, 0xda, 0x2a, 0x01, 0xf0, 0x94, 0xfd, 0x2b, 0x3f, 0x01, 0xce, 0x39, 0x03, - 0x68, 0x56, 0xff, 0x01, 0xa8, 0xfd, 0xec, 0x6b, 0x5a, 0xb0, 0xf1, 0x41, 0xd1, 0x0a, 0xe5, 0x07, - 0x3d, 0x16, 0x00, 0xfe, 0xfd, 0x52, 0x5f, 0xe7, 0x04, 0x75, 0xf2, 0x6b, 0xe7, 0xeb, 0x11, 0xd7, - 0xe3, 0x83, 0xca, 0x14, 0x9e, 0x0f, 0x29, 0x18, 0x12, 0xe7, 0x6d, 0x75, 0x02, 0xab, 0x18, 0xfb, - 0x46, 0xd9, 0xef, 0xac, 0x70, 0x17, 0x89, 0xe3, 0x06, 0x56, 0xc3, 0xf4, 0xb2, 0xb3, 0xfb, 0xd6, - 0xf1, 0xf4, 0x7c, 0xe1, 0xf4, 0xdb, 0x8c, 0xfd, 0xa9, 0x59, 0xef, 0xeb, 0x7f, 0xfc, 0xb1, 0xb3, - 0xff, 0x0f, 0xbf, 0xf7, 0x76, 0xc6, 0x00, 0xcf, 0x53, 0xfd, 0xd6, 0x90, 0x00, 0xc2, 0x41, 0x03, - 0xe0, 0xe3, 0xff, 0x9c, 0x07, 0xfe, 0xf6, 0xb6, 0x58, 0x39, 0x89, 0x3d, 0x56, 0xda, 0xe3, 0x4a, - 0xc3, 0x1a, 0xdd, 0xc3, 0xfb, 0x6c, 0x53, 0xe5, 0x0c, 0x89, 0xf8, 0xf9, 0xc2, 0xef, 0xe4, 0x4f, - 0xe0, 0xee, 0x7b, 0x0d, 0xd8, 0x35, 0x2e, 0x86, 0xdf, 0xe6, 0xbf, 0xa8, 0xfc, 0xb6, 0x62, 0x02, - 0x67, 0x2d, 0xee, 0x8b, 0xe1, 0x13, 0x7e, 0x9d, 0x0b, 0xb3, 0x54, 0xf5, 0x34, 0x7e, 0xfb, 0xf5, - 0x6d, 0xf6, 0xd5, 0x8e, 0xf4, 0x61, 0xb4, 0xff, 0x05, 0x47, 0xf0, 0xf1, 0x23, 0xf6, 0x6c, 0xa7, - 0xfe, 0xf7, 0xee, 0xf9, 0x58, 0x49, 0x01, 0x86, 0xc2, 0xfe, 0x23, 0xc9, 0xfd, 0x55, 0xf5, 0x01, - 0xf2, 0x0e, 0x02, 0xd9, 0x5d, 0xff, 0xda, 0x8b, 0x55, 0xd2, 0xab, 0x3b, 0xf8, 0x18, 0xdf, 0x23, - 0x6e, 0x1f, 0x17, 0x25, 0xff, 0x5e, 0x12, 0xe0, 0x57, 0x6c, 0xfd, 0x7b, 0xcc, 0xf4, 0xea, 0x8d, - 0xdf, 0xec, 0x1d, 0x03, 0xde, 0x1f, 0x31, 0xc6, 0x45, 0xec, 0x40, 0x82, 0xf4, 0x01, 0x37, 0x09, - 0x65, 0xab, 0xee, 0x74, 0xa2, 0x0b, 0x86, 0x7f, 0x12, 0x0a, 0x5f, 0xf7, 0x5f, 0x25, 0xfa, 0x3b, - 0x9b, 0xf9, 0x6e, 0x79, 0xf2, 0xc7, 0x5d, 0x02, 0xbf, 0xa9, 0xf2, 0x6f, 0xcb, 0xef, 0xc0, 0x1b, - 0xfd, 0x7f, 0x32, 0xfb, 0x03, 0xe8, 0x00, 0x5c, 0xb8, 0x01, 0xa8, 0x67, 0xfc, 0xdb, 0xa1, 0xfe, - 0x1e, 0x63, 0x04, 0x9b, 0xcd, 0x00, 0xa8, 0x5b, 0x53, 0x7b, 0x13, 0x37, 0xfc, 0x48, 0xdd, 0x27, - 0x5e, 0x22, 0xdb, 0x35, 0x03, 0x05, 0x90, 0xdf, 0x92, 0x95, 0xfb, 0x01, 0xe8, 0xfb, 0xe9, 0x17, - 0xe2, 0x89, 0x42, 0xf7, 0x5f, 0xec, 0x32, 0xd3, 0x91, 0xf2, 0x06, 0x41, 0xef, 0xea, 0xb6, 0x0c, - 0x4e, 0x4c, 0xf1, 0xc6, 0xca, 0x04, 0xe8, 0xc8, 0x13, 0x84, 0xe7, 0xfc, 0xee, 0x3d, 0xfa, 0xa7, - 0xfb, 0xfa, 0x4c, 0x3d, 0xf3, 0x42, 0xc7, 0x01, 0xec, 0x79, 0xf4, 0x42, 0xb0, 0xee, 0x51, 0x8c, - 0xfb, 0x7a, 0xf8, 0xf9, 0xe5, 0x2d, 0x00, 0x73, 0x0d, 0x04, 0xb4, 0x2e, 0xfd, 0x29, 0x86, 0xfd, - 0xe1, 0x72, 0x03, 0xea, 0x65, 0x01, 0xc6, 0x87, 0x4f, 0x69, 0x9c, 0x31, 0x22, 0xb3, 0xdd, 0x4f, - 0xfc, 0x25, 0x73, 0xc6, 0x03, 0x3b, 0x8a, 0xe0, 0x96, 0x63, 0xfd, 0xf5, 0x79, 0xfc, 0xd7, 0x66, - 0xe4, 0xb0, 0x75, 0xf3, 0xd1, 0xd1, 0x2e, 0x30, 0x0e, 0xf6, 0xd9, 0x13, 0xef, 0x18, 0xc6, 0x0e, - 0xe1, 0xaa, 0xf2, 0xcc, 0xc7, 0xff, 0xce, 0x00, 0x13, 0xea, 0xaa, 0xff, 0xe2, 0x9b, 0xfc, 0xa1, - 0xd7, 0xfb, 0xd9, 0x94, 0xf4, 0xd4, 0x25, 0x00, 0x51, 0x5c, 0xf4, 0x81, 0xd4, 0xf0, 0xf9, 0x0c, - 0xfb, 0x55, 0xd5, 0xf8, 0xa3, 0xa3, 0xfd, 0x64, 0x59, 0x04, 0xd3, 0x97, 0xfe, 0x15, 0xe0, 0xfe, - 0xea, 0xdb, 0x01, 0x22, 0x7f, 0xff, 0xf2, 0x43, 0x4a, 0x89, 0x82, 0x2b, 0x85, 0x85, 0xe1, 0x4f, - 0x2b, 0x28, 0x28, 0x41, 0x02, 0xa6, 0xd0, 0xe3, 0x0c, 0xdc, 0xfe, 0x13, 0x74, 0xfb, 0xd4, 0xa0, - 0xe6, 0x71, 0x9a, 0xf2, 0x51, 0x94, 0x29, 0x98, 0xcf, 0xf7, 0x02, 0x24, 0xf0, 0xe1, 0x3a, 0x10, - 0xc5, 0x2c, 0xf5, 0x25, 0x71, 0xfa, 0x45, 0x9f, 0x12, 0x0b, 0x2a, 0x01, 0xf2, 0xa3, 0xfb, 0xcc, - 0xb9, 0xff, 0x5b, 0x17, 0xf5, 0x3f, 0x88, 0xfe, 0xad, 0x46, 0xf5, 0x1f, 0xda, 0xf0, 0xaf, 0x28, - 0xfd, 0xd3, 0x47, 0xf9, 0x3c, 0x95, 0xfa, 0xd7, 0x8f, 0x02, 0xaf, 0x99, 0xff, 0x0b, 0x1b, 0x00, - 0xf1, 0x15, 0x02, 0xc1, 0x61, 0xfe, 0xf3, 0x55, 0x43, 0x24, 0xb0, 0x26, 0xaf, 0x26, 0xe7, 0xee, - 0x2c, 0x28, 0xe1, 0xa9, 0x01, 0x68, 0x43, 0xe7, 0xe8, 0x8a, 0xff, 0xd4, 0xcc, 0xfb, 0x66, 0x06, - 0xe9, 0x85, 0x62, 0xf1, 0x36, 0x8b, 0x24, 0x31, 0xb5, 0xfa, 0x02, 0x8f, 0xf0, 0x0f, 0xce, 0x0f, - 0x5a, 0x5e, 0xf9, 0x8a, 0x0b, 0xf7, 0xdd, 0x1e, 0x10, 0x19, 0x2a, 0x03, 0x14, 0x4e, 0xfa, 0xf2, - 0x92, 0x00, 0xfb, 0x40, 0xf8, 0xdb, 0x31, 0xfd, 0xc8, 0xe8, 0xf5, 0xcb, 0x78, 0xf2, 0xbe, 0x7d, - 0xfd, 0x52, 0x4f, 0xfb, 0xcd, 0xf6, 0xf8, 0x1e, 0x68, 0x00, 0xef, 0x90, 0xff, 0xf8, 0x66, 0x00, - 0x62, 0xe0, 0x02, 0x41, 0x4f, 0xfe, 0xa2, 0xd2, 0x41, 0x80, 0x1d, 0x1e, 0xe9, 0x76, 0xe3, 0xa4, - 0xd7, 0x30, 0x23, 0x10, 0x09, 0x96, 0xd1, 0xde, 0x78, 0xae, 0xfb, 0xc9, 0xbc, 0x01, 0x0c, 0x36, - 0xed, 0xeb, 0xd1, 0xf8, 0xc0, 0xf5, 0x19, 0x9d, 0xda, 0xf2, 0x5f, 0xbc, 0xf6, 0xd9, 0x65, 0x0d, - 0x3a, 0x8c, 0xf9, 0x46, 0x7a, 0xfc, 0xc0, 0x10, 0x0a, 0x41, 0xbb, 0xfe, 0x88, 0x5a, 0xff, 0xd8, - 0x85, 0x02, 0x97, 0x67, 0xfd, 0x22, 0xae, 0x04, 0xd9, 0xed, 0xfb, 0xcf, 0xb4, 0xf9, 0x20, 0xe4, - 0x00, 0xae, 0x31, 0xfb, 0x57, 0x65, 0xfa, 0x22, 0x93, 0xfe, 0xf7, 0x90, 0xf9, 0x84, 0xc5, 0xfa, - 0xcb, 0x4e, 0xfe, 0x37, 0x33, 0xfd, 0xac, 0x75, 0x38, 0x39, 0x5b, 0x1c, 0x44, 0x9c, 0xea, 0x65, - 0x80, 0x2a, 0xc7, 0xc2, 0x08, 0x35, 0xe3, 0xe5, 0xc2, 0xa1, 0xfc, 0x83, 0x23, 0x00, 0xa1, 0x5b, - 0xf0, 0x30, 0xc3, 0xf8, 0x97, 0xae, 0x15, 0x51, 0x06, 0xf6, 0xdd, 0xfc, 0xf6, 0x8c, 0x65, 0x0b, - 0x92, 0xc6, 0xfa, 0xbb, 0xa6, 0xfb, 0xbf, 0xdf, 0x08, 0x55, 0xbe, 0xff, 0x76, 0xeb, 0xfe, 0x9d, - 0xc4, 0x01, 0x56, 0x4f, 0xfe, 0x6a, 0xf1, 0x03, 0xe0, 0xad, 0xfb, 0xda, 0x55, 0xfa, 0xba, 0xcf, - 0x00, 0x01, 0x52, 0xfb, 0xa9, 0x7a, 0xfb, 0xae, 0x69, 0xff, 0x31, 0x34, 0xfb, 0x14, 0xd3, 0xfb, - 0x1b, 0x96, 0xfd, 0x77, 0x82, 0xfd, 0x88, 0xe6, 0x2f, 0x1d, 0x90, 0x1b, 0xcb, 0x0c, 0xf1, 0x82, - 0x5d, 0x23, 0x97, 0x14, 0x0a, 0xb0, 0xc7, 0xec, 0x91, 0x0b, 0xfc, 0x59, 0xb6, 0xff, 0x71, 0x3e, - 0xf3, 0xa3, 0x80, 0xf8, 0x7e, 0x6d, 0x12, 0x34, 0x1f, 0xf9, 0xac, 0x22, 0xf7, 0x0e, 0x4d, 0x09, - 0x49, 0xf9, 0xfc, 0xd6, 0x83, 0xfb, 0x12, 0x4d, 0x07, 0xee, 0xf2, 0x00, 0xf9, 0x28, 0xff, 0xbb, - 0x2a, 0x01, 0x74, 0x95, 0xfe, 0x28, 0x48, 0x03, 0xf4, 0xaf, 0xfc, 0xec, 0x88, 0xfa, 0x22, 0x18, - 0x00, 0x1c, 0x5b, 0xfc, 0xd5, 0x1f, 0xfc, 0xd8, 0x73, 0x00, 0x2c, 0xb9, 0xfc, 0x63, 0x65, 0xfc, - 0x8b, 0xe4, 0xfd, 0x1a, 0x9d, 0xfd, 0x89, 0x3f, 0x28, 0x86, 0x86, 0x1a, 0xd6, 0xcf, 0xf5, 0x7c, - 0xf4, 0x1c, 0x7f, 0xf9, 0x0b, 0x7b, 0xfe, 0xf1, 0x7f, 0x7d, 0xfb, 0xee, 0x2c, 0x00, 0xd8, 0x68, - 0xf5, 0x8b, 0x47, 0xf8, 0xbc, 0x6f, 0x0f, 0xc8, 0x75, 0xfb, 0xb3, 0x33, 0xf7, 0x8f, 0x34, 0x07, - 0xec, 0x88, 0xfe, 0x91, 0xf1, 0xfb, 0xbd, 0xf2, 0x05, 0xc9, 0x0c, 0x01, 0xe8, 0x97, 0xff, 0xf1, - 0x04, 0x01, 0x2f, 0x38, 0xfe, 0xcf, 0xa5, 0x02, 0xd0, 0x4e, 0xfd, 0xd7, 0xf4, 0xfa, 0x04, 0xab, - 0xff, 0x72, 0x99, 0xfd, 0x64, 0x0a, 0xfd, 0x5d, 0xc3, 0xff, 0x20, 0xcb, 0xfd, 0x96, 0x5e, 0xfd, - 0xd0, 0x28, 0xfe, 0x82, 0x94, 0xfd, 0xa4, 0xcc, 0x21, 0xa7, 0x3b, 0x19, 0xeb, 0x67, 0xf9, 0x41, - 0x40, 0x18, 0x38, 0x71, 0x0d, 0xfe, 0xe4, 0xf5, 0xae, 0x27, 0xfc, 0xc7, 0x25, 0x01, 0x72, 0xf1, - 0xf6, 0xed, 0x59, 0xf8, 0x09, 0x2c, 0x0d, 0x8c, 0x12, 0xfd, 0x9a, 0x6f, 0xf7, 0x24, 0xd6, 0x05, - 0xd2, 0xe7, 0xff, 0xca, 0xbf, 0xfc, 0x35, 0x7b, 0x04, 0x53, 0x79, 0x01, 0x95, 0x63, 0x00, 0xfc, - 0x64, 0x00, 0x3f, 0x82, 0xfe, 0x18, 0x23, 0x02, 0x56, 0xba, 0xfd, 0x04, 0x11, 0xfc, 0x4d, 0x6d, - 0x00, 0xe5, 0x45, 0xfe, 0x36, 0x2e, 0xfd, 0x81, 0xbe, 0xff, 0x02, 0x52, 0xfe, 0x1a, 0x14, 0xfe, - 0x99, 0x58, 0xfe, 0x0d, 0x20, 0xfe, 0x3c, 0x37, 0x1c, 0x47, 0x99, 0x17, 0x71, 0xf0, 0xfb, 0x76, - 0xdf, 0x14, 0xb2, 0x82, 0x0e, 0xa4, 0xba, 0xf8, 0x79, 0x28, 0xfd, 0xb0, 0xf0, 0x01, 0x3b, 0x1f, - 0xf8, 0xcf, 0x6e, 0xf8, 0x46, 0x2a, 0x0b, 0xc7, 0x0a, 0xfe, 0x9d, 0xe5, 0xf7, 0xc1, 0xcf, 0x04, - 0x3a, 0xfc, 0x00, 0x9f, 0x0f, 0xfd, 0x4e, 0x94, 0x03, 0x58, 0x4e, 0x02, 0x76, 0xe4, 0xff, 0x37, - 0x03, 0x00, 0x8f, 0x18, 0xff, 0x50, 0xea, 0x01, 0xc7, 0x8c, 0xfe, 0xe2, 0xf8, 0xfc, 0x75, 0x91, - 0x00, 0x7a, 0xb7, 0xfe, 0x93, 0x7e, 0xfd, 0xb0, 0x66, 0xff, 0xe8, 0x5c, 0xfe, 0x72, 0x3f, 0xfe, - 0xde, 0xf4, 0xfe, 0x73, 0x92, 0xfe, 0x94, 0x00, 0x18, 0xde, 0xde, 0x14, 0xd7, 0xf7, 0xfd, 0x62, - 0x1b, 0x13, 0xd9, 0x8a, 0x0e, 0x8e, 0xef, 0xfa, 0xe0, 0x5f, 0xfe, 0x01, 0x8e, 0x02, 0xfe, 0x93, - 0xf8, 0x68, 0xe7, 0xf8, 0x7a, 0x5d, 0x09, 0xa8, 0xbc, 0xfe, 0x94, 0x70, 0xf8, 0xbb, 0xfa, 0x03, - 0x3f, 0xc9, 0x01, 0xf2, 0x63, 0xfd, 0xc5, 0x5e, 0x03, 0x19, 0xe7, 0x01, 0xbb, 0x7f, 0xff, 0xa6, - 0x84, 0x00, 0xe3, 0xf5, 0xff, 0x09, 0xc2, 0x01, 0xb7, 0xa2, 0xfe, 0xff, 0xcb, 0xfd, 0xef, 0xdf, - 0x00, 0xd2, 0x9e, 0xfe, 0x62, 0x4f, 0xfd, 0x52, 0x02, 0xff, 0xd0, 0x5e, 0xfe, 0x0f, 0xb8, 0xfe, - 0xb6, 0x87, 0xff, 0x30, 0x18, 0xff, 0xf6, 0xe2, 0x14, 0xc3, 0x08, 0x13, 0xd4, 0xf6, 0xff, 0xb2, - 0xf6, 0x10, 0x01, 0x0d, 0x0d, 0xb4, 0xf0, 0xfc, 0x45, 0x02, 0x00, 0x5a, 0xad, 0x02, 0xf8, 0x4c, - 0xf9, 0xa4, 0x85, 0xf9, 0x0c, 0x9f, 0x07, 0xb8, 0xcc, 0xfe, 0x59, 0x59, 0xf9, 0x76, 0x68, 0x04, - 0xb8, 0xea, 0x01, 0x92, 0xb9, 0xfd, 0x39, 0x0a, 0x03, 0xdf, 0x29, 0x01, 0xe3, 0xa5, 0x00, 0xef, - 0x70, 0x01, 0xf2, 0xb8, 0xff, 0xc3, 0x91, 0x01, 0x20, 0x5a, 0xff, 0xe4, 0x1d, 0xfe, 0x5a, 0xff, - 0xff, 0x7f, 0x84, 0xfe, 0xfb, 0x7b, 0xfd, 0x63, 0x10, 0xff, 0x3c, 0x13, 0xff, 0x4b, 0x33, 0xff, - 0xcc, 0x5e, 0xff, 0x26, 0x70, 0xfe, 0xf8, 0xa1, 0x11, 0xe2, 0x74, 0x11, 0x1f, 0x4a, 0x01, 0xe8, - 0x10, 0x0f, 0x32, 0xe2, 0x0c, 0xa8, 0x2b, 0xff, 0x37, 0x2d, 0x00, 0x6a, 0x1d, 0x02, 0x67, 0xfb, - 0xfa, 0xd3, 0x8a, 0xf9, 0xcc, 0x84, 0x05, 0xe5, 0xfb, 0xff, 0xe6, 0x02, 0xfb, 0x5a, 0x27, 0x03, - 0xc7, 0xb3, 0x01, 0x13, 0x09, 0xff, 0xe9, 0xc3, 0x02, 0xe1, 0xd0, 0x01, 0x65, 0x53, 0x01, 0xf6, - 0xef, 0x00, 0x37, 0xd0, 0xff, 0x74, 0x7b, 0x01, 0x41, 0x57, 0xff, 0x4b, 0xdc, 0xfd, 0xbd, 0x5e, - 0xff, 0xec, 0xac, 0xfe, 0x2f, 0x1a, 0xfe, 0xd8, 0x92, 0xff, 0xff, 0x30, 0xff, 0x21, 0x58, 0xfe, - 0xc4, 0x7e, 0xfe, 0xa8, 0x4a, 0xfe, 0x00, 0x98, 0x0e, 0xe9, 0xb1, 0x0f, 0x8d, 0x1e, 0x03, 0xe7, - 0x48, 0x0d, 0x74, 0x82, 0x0c, 0x65, 0xa1, 0x01, 0xe4, 0xf1, 0xff, 0xf9, 0x53, 0x01, 0x2a, 0x7b, - 0xfc, 0xd3, 0x66, 0xfa, 0xd6, 0xfe, 0x03, 0x42, 0x9e, 0x00, 0x95, 0xfc, 0xfb, 0x8e, 0x5f, 0x02, - 0x77, 0xd9, 0x02, 0x77, 0x07, 0x01, 0x1b, 0x53, 0x02, 0x03, 0x64, 0x01, 0xfb, 0xa4, 0x01, 0xfc, - 0xcc, 0x00, 0xf6, 0xe1, 0xff, 0x75, 0x01, 0x01, 0xad, 0xf8, 0xfe, 0x5e, 0xc8, 0xfd, 0x6b, 0xe8, - 0xff, 0x8b, 0x78, 0xff, 0xa5, 0x44, 0xfe, 0x58, 0xee, 0xfe, 0x75, 0x17, 0xfe, 0x43, 0x2d, 0xfe, - 0xef, 0xd7, 0xfe, 0x98, 0xd2, 0xfe, 0xfa, 0xaa, 0x0c, 0xdc, 0xbf, 0x0e, 0xb2, 0x6d, 0x04, 0x50, - 0x58, 0x0b, 0x41, 0x43, 0x0c, 0x5b, 0xb9, 0x02, 0xec, 0xfc, 0xfe, 0xcf, 0x81, 0x01, 0x43, 0x62, - 0xfe, 0x04, 0xca, 0xfa, 0x95, 0x08, 0x02, 0xf1, 0x91, 0x01, 0x03, 0xf1, 0xfd, 0xbf, 0x5b, 0x03, - 0xdf, 0x2c, 0x04, 0xc1, 0xca, 0x00, 0x86, 0x75, 0x01, 0x9e, 0xca, 0x01, 0xa0, 0x53, 0x01, 0x8f, - 0x70, 0x00, 0x55, 0xa5, 0xff, 0xff, 0x68, 0x00, 0x41, 0xb7, 0xff, 0x91, 0xf4, 0xfe, 0x7d, 0xae, - 0xff, 0x58, 0x5c, 0xfe, 0xc0, 0x96, 0xfd, 0x8b, 0x92, 0xfe, 0xf5, 0xab, 0xfe, 0xc2, 0xbd, 0xfe, - 0x09, 0x08, 0xff, 0x40, 0xe6, 0xfe, 0xf2, 0x0a, 0x0a, 0x9f, 0xb0, 0x0d, 0x4f, 0x07, 0x06, 0xac, - 0x76, 0x09, 0x75, 0xc7, 0x0b, 0xf1, 0xe9, 0x03, 0xba, 0xa9, 0xff, 0x2b, 0x8f, 0x01, 0x6e, 0xee, - 0xfd, 0x5c, 0x6d, 0xfb, 0xa6, 0x64, 0x02, 0x18, 0x9f, 0x03, 0xc7, 0x02, 0x00, 0x03, 0xd7, 0x02, - 0xd8, 0xa6, 0x03, 0x18, 0xa6, 0x00, 0x0e, 0x6f, 0x01, 0x82, 0xad, 0x01, 0x81, 0x82, 0x00, 0x25, - 0x1c, 0x00, 0xc0, 0x58, 0x00, 0x09, 0x0d, 0x01, 0x51, 0xdc, 0xff, 0x32, 0x31, 0xfe, 0xf1, 0x18, - 0xfe, 0x2d, 0x20, 0xfe, 0xd0, 0x47, 0xfe, 0x57, 0xe1, 0xfe, 0x17, 0xf6, 0xfe, 0x31, 0xd4, 0xfe, - 0xed, 0xaa, 0xfe, 0xff, 0x97, 0xfe, 0x36, 0xb4, 0x08, 0x2c, 0x7c, 0x0d, 0x88, 0xf1, 0x05, 0x57, - 0xf0, 0x07, 0xda, 0x1e, 0x0c, 0xe0, 0x2d, 0x04, 0xf4, 0xbd, 0xfe, 0xdb, 0x4f, 0x01, 0x06, 0x6a, - 0xff, 0x42, 0x15, 0xfe, 0x8d, 0xa8, 0x03, 0x04, 0x8d, 0x03, 0x68, 0x68, 0x00, 0xd6, 0x02, 0x03, - 0xa6, 0x0d, 0x03, 0xd5, 0x5f, 0x00, 0x2e, 0xa4, 0x00, 0xb2, 0x28, 0x01, 0x04, 0x72, 0x01, 0x4c, - 0xec, 0x00, 0x25, 0x35, 0x00, 0x0f, 0xc8, 0xff, 0xa1, 0x4e, 0xfe, 0x29, 0xca, 0xfd, 0x4a, 0xa2, - 0xfe, 0xb3, 0xc6, 0xfe, 0x81, 0x8d, 0xfe, 0x89, 0xc4, 0xfe, 0xe7, 0x8e, 0xfe, 0xec, 0x82, 0xfe, - 0xdd, 0xc9, 0xfe, 0x74, 0xbb, 0xfe, 0x41, 0x34, 0x08, 0x62, 0x2a, 0x0c, 0x80, 0x5d, 0x06, 0x99, - 0xd0, 0x08, 0x7d, 0x20, 0x09, 0xec, 0xa0, 0x02, 0xd2, 0x60, 0x01, 0xdb, 0xe3, 0x03, 0x77, 0xe1, - 0x00, 0x4f, 0xe0, 0xfe, 0xf8, 0xc4, 0x03, 0x7b, 0x39, 0x03, 0x58, 0xed, 0x00, 0x8a, 0x40, 0x03, - 0x59, 0xcd, 0x01, 0xf2, 0x81, 0xff, 0x66, 0x9c, 0x01, 0x80, 0x87, 0x02, 0x09, 0x07, 0x01, 0x29, - 0x7b, 0xff, 0x55, 0x9b, 0xfe, 0x35, 0x31, 0xff, 0x21, 0x06, 0xff, 0xd4, 0x6e, 0xfe, 0x28, 0xd8, - 0xfe, 0xbf, 0xb5, 0xfe, 0x40, 0x37, 0xfe, 0x1f, 0x5d, 0xfe, 0x39, 0xce, 0xfe, 0x87, 0xa6, 0xfe, - 0xbd, 0xe0, 0xfe, 0xa0, 0xf6, 0xfe, 0x39, 0x52, 0x08, 0xc6, 0xf5, 0x0a, 0x21, 0x38, 0x05, 0x63, - 0x0e, 0x08, 0x8d, 0x91, 0x08, 0x61, 0x1a, 0x05, 0x66, 0x3c, 0x04, 0x47, 0xfc, 0x03, 0x55, 0x6a, - 0x00, 0x1b, 0x1f, 0xff, 0x16, 0x70, 0x04, 0x0d, 0xe8, 0x03, 0xe5, 0x24, 0x00, 0x9b, 0x68, 0x01, - 0xbb, 0x6f, 0x02, 0xea, 0x51, 0x01, 0x27, 0x5e, 0x01, 0xcc, 0xd4, 0x00, 0x6f, 0xc5, 0xfe, 0x98, - 0x7a, 0xfe, 0x11, 0xa3, 0xff, 0x01, 0x02, 0x00, 0xe1, 0xda, 0xfe, 0x79, 0x32, 0xfe, 0x17, 0x77, - 0xfe, 0x95, 0x43, 0xfe, 0x16, 0x2e, 0xfe, 0x00, 0x8a, 0xfe, 0x92, 0xdc, 0xfe, 0x27, 0x07, 0xff, - 0xb0, 0xff, 0xfe, 0x86, 0xbb, 0xfe, 0xff, 0xad, 0x06, 0x94, 0xb4, 0x09, 0x3d, 0x13, 0x06, 0xba, - 0x38, 0x09, 0xbd, 0x7b, 0x0a, 0x29, 0x61, 0x05, 0x51, 0x97, 0x03, 0xcc, 0x9b, 0x04, 0xf9, 0x7c, - 0x01, 0xb6, 0x21, 0x00, 0x35, 0xcc, 0x03, 0x7c, 0xd2, 0x02, 0x1c, 0x78, 0x00, 0x63, 0xd6, 0x02, - 0xe6, 0x8c, 0x02, 0x6d, 0x85, 0xff, 0x7b, 0x46, 0xff, 0x61, 0xb0, 0xff, 0x99, 0x7e, 0xff, 0xfb, - 0xaf, 0xff, 0xbb, 0xc6, 0xff, 0x6b, 0x7a, 0xff, 0x32, 0x5a, 0xfe, 0xa3, 0xf9, 0xfd, 0x1c, 0x5b, - 0xfe, 0x49, 0x5c, 0xfe, 0x51, 0x50, 0xfe, 0x86, 0xe3, 0xfe, 0x9d, 0x40, 0xff, 0x80, 0xe7, 0xfe, - 0x4e, 0xdd, 0xfe, 0x2b, 0xda, 0xfe, 0xd9, 0xde, 0x07, 0xe4, 0xd4, 0x0c, 0x16, 0xd1, 0x08, 0xd0, - 0x05, 0x08, 0xe6, 0x9b, 0x07, 0x3a, 0x60, 0x05, 0x43, 0x46, 0x04, 0x13, 0xde, 0x03, 0x06, 0xca, - 0x01, 0x62, 0x17, 0x01, 0x4c, 0xc6, 0x02, 0xc3, 0xd2, 0x03, 0x1f, 0xdd, 0x01, 0x8a, 0x55, 0xff, - 0xdd, 0x5e, 0xff, 0xfd, 0x63, 0xff, 0x82, 0xe7, 0xff, 0x63, 0x50, 0x00, 0xdf, 0xcf, 0xff, 0x6f, - 0x80, 0xff, 0x80, 0xdb, 0xfe, 0xaa, 0xad, 0xfe, 0xaa, 0x5d, 0xfe, 0x64, 0x13, 0xfe, 0x0b, 0x51, - 0xfe, 0x29, 0xb5, 0xfe, 0x10, 0xdd, 0xfe, 0xa2, 0xc9, 0xfe, 0xa3, 0x3f, 0xff, 0x5a, 0x2f, 0xff, - 0x75, 0xe0, 0xfe, 0x40, 0xb8, 0xfe, 0xd5, 0xd7, 0x07, 0x34, 0xf3, 0x0c, 0xfd, 0xee, 0x08, 0x62, - 0x5c, 0x07, 0xcc, 0x3b, 0x07, 0x94, 0x1d, 0x06, 0x5a, 0x39, 0x05, 0xc6, 0xb8, 0x04, 0x11, 0x09, - 0x03, 0xd0, 0x6d, 0x01, 0x51, 0x62, 0x02, 0x73, 0x7a, 0x03, 0x98, 0x65, 0x00, 0x63, 0xe6, 0xfd, - 0x50, 0x17, 0xff, 0xcf, 0x1b, 0x00, 0x1f, 0x8c, 0x00, 0xa0, 0x67, 0x00, 0x9f, 0x7f, 0xff, 0xee, - 0xd9, 0xfe, 0x24, 0xe6, 0xfe, 0x1a, 0xfa, 0xfe, 0x91, 0x55, 0xfe, 0xdc, 0x30, 0xfe, 0xfa, 0x98, - 0xfe, 0x27, 0xbe, 0xfe, 0x3b, 0xb8, 0xfe, 0xe7, 0xf5, 0xfe, 0x9e, 0x55, 0xff, 0xf2, 0x39, 0xff, - 0x40, 0x08, 0xff, 0xfa, 0xbd, 0xfe, 0xe8, 0x87, 0x07, 0xbc, 0x3d, 0x0b, 0x0b, 0xab, 0x06, 0x6b, - 0x8c, 0x06, 0xff, 0xc8, 0x06, 0x04, 0x47, 0x06, 0xee, 0x99, 0x06, 0x1c, 0x9d, 0x07, 0xf3, 0x49, - 0x05, 0xda, 0x88, 0x02, 0xb0, 0xff, 0x01, 0x05, 0x9e, 0x00, 0xb7, 0x75, 0x00, 0x11, 0x91, 0xff, - 0x89, 0xd0, 0xfe, 0xec, 0xcc, 0xff, 0x48, 0xb3, 0x00, 0x14, 0x19, 0x00, 0xfb, 0x2f, 0xff, 0x42, - 0x45, 0xff, 0x62, 0x0a, 0xff, 0xcd, 0xdc, 0xfe, 0x8a, 0x8c, 0xfe, 0x3f, 0x64, 0xfe, 0x38, 0xb4, - 0xfe, 0xec, 0xbb, 0xfe, 0x35, 0x83, 0xfe, 0xe0, 0xf0, 0xfe, 0x07, 0x5f, 0xff, 0x12, 0x2d, 0xff, - 0xff, 0x1a, 0xff, 0xaa, 0xe8, 0xfe, 0x4c, 0x27, 0x08, 0xf8, 0xb6, 0x0b, 0xa3, 0xec, 0x05, 0x38, - 0x5e, 0x05, 0x81, 0xf4, 0x04, 0x18, 0xe4, 0x04, 0x0d, 0x42, 0x07, 0x4b, 0x09, 0x08, 0x10, 0x39, - 0x05, 0x63, 0xef, 0x02, 0x15, 0x1c, 0x02, 0x4e, 0x17, 0x02, 0x41, 0x8f, 0x02, 0x0b, 0xec, 0xff, - 0x46, 0x08, 0xff, 0x22, 0x8b, 0xff, 0xfe, 0x58, 0xff, 0xb8, 0x02, 0x00, 0x3f, 0xc2, 0xff, 0x09, - 0xf3, 0xfe, 0xa1, 0x74, 0xfe, 0xef, 0x01, 0xff, 0xf3, 0x06, 0xff, 0x1e, 0x8f, 0xfe, 0xe6, 0xed, - 0xfe, 0xd4, 0x28, 0xff, 0x2e, 0xfb, 0xfe, 0x3d, 0xdc, 0xfe, 0x93, 0x09, 0xff, 0xe9, 0x2d, 0xff, - 0x9f, 0xec, 0xfe, 0x70, 0xc6, 0xfe, 0xfe, 0x8e, 0x08, 0xfd, 0x58, 0x0b, 0x77, 0x5b, 0x04, 0x74, - 0x9b, 0x04, 0x27, 0x2a, 0x05, 0x0e, 0xb7, 0x03, 0x67, 0xaa, 0x03, 0x82, 0xa2, 0x05, 0xee, 0x7a, - 0x06, 0x3f, 0x43, 0x05, 0xcc, 0x49, 0x04, 0x80, 0x35, 0x03, 0xe2, 0xaa, 0x02, 0x95, 0x68, 0x03, - 0x8b, 0xd5, 0x00, 0x3c, 0x4a, 0xfd, 0x57, 0xb2, 0xfe, 0x23, 0x85, 0xff, 0x6e, 0xc7, 0xff, 0x2b, - 0xaf, 0xff, 0x7b, 0xc6, 0xfe, 0x38, 0xd5, 0xfe, 0xe2, 0x02, 0xff, 0x7a, 0xf9, 0xfe, 0x13, 0x12, - 0xff, 0x3c, 0x37, 0xff, 0xa5, 0xe3, 0xfe, 0xeb, 0x3f, 0xff, 0x6b, 0xe6, 0xfe, 0x9b, 0xbf, 0xfe, - 0x45, 0x37, 0xff, 0x36, 0xb8, 0xfe, 0xb0, 0x09, 0x08, 0xa3, 0xfe, 0x0a, 0x03, 0x58, 0x04, 0x10, - 0x52, 0x04, 0xde, 0x66, 0x05, 0x68, 0xb7, 0x04, 0xb5, 0x21, 0x03, 0xf7, 0x7b, 0x01, 0x70, 0x65, - 0x02, 0x7c, 0x0c, 0x05, 0x9f, 0x03, 0x06, 0x43, 0x65, 0x04, 0x4b, 0x33, 0x03, 0x60, 0x75, 0x03, - 0xcb, 0x4e, 0x04, 0x8a, 0xcf, 0x01, 0xf2, 0x1e, 0xfe, 0x70, 0x0c, 0xfe, 0x08, 0xff, 0xfe, 0x22, - 0x74, 0xff, 0x95, 0xcd, 0xff, 0x3d, 0x67, 0xff, 0xc9, 0x90, 0xfe, 0x0b, 0xea, 0xfe, 0xe9, 0x66, - 0xff, 0xef, 0xde, 0xfe, 0xc2, 0xfa, 0xfe, 0x6a, 0x75, 0xff, 0x39, 0x09, 0xff, 0x9b, 0xbf, 0xfe, - 0x21, 0xd0, 0xfe, 0x0a, 0xf5, 0xfe, 0xba, 0xb4, 0x08, 0x9e, 0x08, 0x0b, 0x6e, 0xc4, 0x02, 0x6a, - 0x25, 0x03, 0x83, 0xfc, 0x04, 0x75, 0x7d, 0x04, 0x98, 0x58, 0x03, 0x3d, 0x1a, 0x01, 0xcd, 0x10, - 0x00, 0x7e, 0xad, 0x02, 0xb6, 0x5f, 0x04, 0xbd, 0xa3, 0x03, 0xb3, 0xa9, 0x04, 0xbc, 0x6e, 0x05, - 0x76, 0x6f, 0x05, 0xfe, 0xf6, 0x03, 0x80, 0x04, 0x02, 0x43, 0x7d, 0x00, 0x7d, 0x8e, 0xfe, 0x9c, - 0xb2, 0xfd, 0x23, 0xc2, 0xfe, 0x96, 0x8c, 0xff, 0xe1, 0x2c, 0xff, 0x11, 0xe3, 0xfe, 0x57, 0xd9, - 0xfe, 0xec, 0xe6, 0xfe, 0x00, 0x10, 0xff, 0x3f, 0xae, 0xff, 0x24, 0x3f, 0xff, 0xb3, 0xe4, 0xfe, - 0x59, 0x1b, 0xff, 0x0d, 0xec, 0xfe, 0xf7, 0xbb, 0x09, 0x68, 0x10, 0x0c, 0x68, 0xd1, 0x02, 0xcc, - 0xfd, 0x03, 0xc3, 0x70, 0x05, 0xdf, 0xcb, 0x03, 0x67, 0x7c, 0x02, 0xbe, 0x87, 0xff, 0x4f, 0x12, - 0x00, 0x68, 0xdf, 0x03, 0xb4, 0x42, 0x02, 0x20, 0x52, 0x00, 0x36, 0x52, 0x02, 0xce, 0xae, 0x03, - 0x8b, 0xcb, 0x05, 0xb5, 0xf7, 0x04, 0xb2, 0x63, 0x03, 0xad, 0xa2, 0x03, 0x77, 0xbd, 0x01, 0xae, - 0x32, 0xff, 0x3b, 0x0f, 0xfe, 0xd4, 0xc9, 0xfd, 0x69, 0x5f, 0xfe, 0xda, 0x87, 0xff, 0x05, 0x73, - 0xff, 0x11, 0xba, 0xfe, 0x9a, 0xc7, 0xfe, 0xf2, 0x88, 0xff, 0x26, 0x55, 0xff, 0x85, 0x0c, 0xff, - 0x33, 0x50, 0xff, 0x8f, 0xe3, 0xfe, 0xe9, 0xd7, 0x0a, 0xff, 0x7b, 0x0c, 0xb5, 0x70, 0x02, 0xa1, - 0x6e, 0x05, 0x11, 0x1b, 0x07, 0xca, 0xa3, 0x04, 0x1f, 0x27, 0x01, 0x54, 0x65, 0xfc, 0x71, 0x92, - 0xff, 0xa6, 0x6a, 0x05, 0x6b, 0x1a, 0x02, 0x16, 0x33, 0xff, 0xa3, 0x3e, 0x00, 0x50, 0x79, 0x01, - 0x54, 0xca, 0x03, 0x28, 0x89, 0x02, 0x82, 0x68, 0x03, 0xc9, 0xf1, 0x04, 0x39, 0x68, 0x03, 0xe7, - 0x37, 0x02, 0x93, 0xac, 0x00, 0xc2, 0xe6, 0xfe, 0xb9, 0x5f, 0xfd, 0xd7, 0xd4, 0xfd, 0x78, 0xf3, - 0xfe, 0xbd, 0x3c, 0xff, 0x65, 0x54, 0xff, 0xc5, 0x37, 0xff, 0x3e, 0xeb, 0xfe, 0xfd, 0x0d, 0xff, - 0xb4, 0x69, 0xff, 0xa8, 0xfb, 0xfe, 0xc6, 0x17, 0x0d, 0x35, 0x7e, 0x0f, 0x13, 0x6f, 0x02, 0x8c, - 0x7e, 0x04, 0x39, 0x5e, 0x06, 0x04, 0xb9, 0x04, 0x5b, 0x7a, 0x01, 0x32, 0x5f, 0xfb, 0x58, 0x51, - 0xff, 0x32, 0x37, 0x05, 0xa9, 0x18, 0x01, 0x3e, 0xc7, 0xfe, 0x36, 0x44, 0x00, 0xbc, 0xc5, 0x00, - 0x5d, 0x01, 0x02, 0xe1, 0x61, 0x01, 0x42, 0x99, 0x01, 0xd3, 0x31, 0x03, 0x4b, 0xad, 0x03, 0x2d, - 0xf4, 0x02, 0x3c, 0xc9, 0x01, 0xe1, 0x35, 0x01, 0x8d, 0x05, 0x00, 0xb8, 0x9a, 0xfe, 0x97, 0xb4, - 0xfd, 0x32, 0x21, 0xfe, 0xc1, 0x05, 0xff, 0xb9, 0xd4, 0xff, 0x4d, 0x96, 0xff, 0xe1, 0xab, 0xfe, - 0xe1, 0xca, 0xfe, 0x7a, 0x29, 0xff, 0x41, 0x14, 0x0f, 0xcf, 0x1f, 0x11, 0x36, 0xfc, 0x01, 0x84, - 0x64, 0x05, 0x7f, 0xc0, 0x07, 0xb2, 0x36, 0x04, 0xc2, 0x92, 0xff, 0xc4, 0x9e, 0xf9, 0x8f, 0xc9, - 0x00, 0x2f, 0x88, 0x06, 0xc2, 0x57, 0xff, 0xfc, 0x9c, 0xfd, 0x67, 0x96, 0xff, 0xbd, 0xbf, 0x00, - 0xb9, 0x7e, 0x02, 0x67, 0x27, 0x00, 0x75, 0x0b, 0x00, 0xe6, 0x08, 0x02, 0x06, 0x69, 0x01, 0x0e, - 0x9c, 0x01, 0x4f, 0x8c, 0x02, 0x28, 0x10, 0x02, 0xfc, 0x77, 0x01, 0x34, 0xe8, 0x00, 0xec, 0x67, - 0xff, 0xe6, 0x6c, 0xfe, 0xfa, 0xe9, 0xfd, 0xc3, 0x1f, 0xff, 0x10, 0x72, 0xff, 0xb7, 0xfc, 0xfe, - 0x9d, 0x24, 0xff, 0xd3, 0x94, 0xfe, 0x56, 0x3e, 0x11, 0x5c, 0xc4, 0x12, 0x7c, 0x82, 0x01, 0xa4, - 0x74, 0x06, 0xef, 0x13, 0x09, 0x11, 0x02, 0x04, 0xec, 0x4f, 0xfd, 0x15, 0x03, 0xf8, 0xde, 0x8e, - 0x02, 0x41, 0xe5, 0x06, 0x7d, 0x25, 0xfe, 0x16, 0x9d, 0xfd, 0x91, 0xc6, 0xfe, 0x58, 0x2c, 0x00, - 0x9c, 0x94, 0x02, 0xc7, 0xbb, 0xff, 0xc7, 0xed, 0xff, 0xbf, 0x1a, 0x01, 0x13, 0x1f, 0x00, 0xca, - 0xaf, 0x00, 0xe7, 0x65, 0x00, 0x61, 0x60, 0x01, 0x20, 0x32, 0x02, 0xab, 0x31, 0x01, 0x7b, 0x30, - 0x01, 0x69, 0xce, 0x00, 0xa5, 0x1f, 0xff, 0x5f, 0x10, 0xff, 0x7b, 0xab, 0xfe, 0xf9, 0x7c, 0xfe, - 0x7b, 0xf5, 0xfe, 0xb3, 0xec, 0xfe, 0x7b, 0x4b, 0x14, 0x10, 0xdf, 0x15, 0xa8, 0x00, 0x01, 0x45, - 0xeb, 0x05, 0xd2, 0xfb, 0x08, 0x77, 0x6d, 0x03, 0xc7, 0xed, 0xfb, 0x3c, 0xc7, 0xf7, 0x10, 0x2d, - 0x04, 0xdc, 0x1f, 0x06, 0x85, 0x88, 0xfc, 0x94, 0xf0, 0xfd, 0x1e, 0xb9, 0xfe, 0xe9, 0xfc, 0xff, - 0x95, 0x64, 0x02, 0xe3, 0xf7, 0xfe, 0x76, 0xc8, 0xff, 0x9a, 0x11, 0x01, 0x27, 0x6b, 0xff, 0xee, - 0xbc, 0xff, 0x78, 0xbb, 0xff, 0xfc, 0x52, 0x00, 0x01, 0x94, 0x00, 0x1d, 0xbd, 0x00, 0x8c, 0x82, - 0x01, 0xfb, 0x5c, 0x01, 0x05, 0xe6, 0x00, 0x5e, 0x0e, 0x01, 0xe4, 0x46, 0xff, 0x2a, 0x2a, 0xfe, - 0x0b, 0xa5, 0xfe, 0x81, 0x32, 0xfe, 0xf9, 0x54, 0x16, 0x1a, 0x61, 0x17, 0xe9, 0xb2, 0x00, 0x14, - 0x06, 0x08, 0x27, 0xe6, 0x0a, 0xc5, 0xb0, 0x01, 0xa9, 0x41, 0xf8, 0xb7, 0xaf, 0xf7, 0x84, 0x12, - 0x07, 0xff, 0x78, 0x05, 0x47, 0x14, 0xfb, 0x7f, 0xff, 0xfd, 0x08, 0x40, 0xfe, 0xa0, 0x24, 0x00, - 0xed, 0x44, 0x02, 0x8f, 0x1e, 0xfe, 0xf3, 0xd7, 0xff, 0x8d, 0x0a, 0x01, 0x7c, 0xa6, 0xfe, 0x89, - 0xaf, 0xff, 0x8c, 0xfb, 0xfe, 0x5d, 0x71, 0xff, 0x10, 0x91, 0x00, 0x35, 0x20, 0xff, 0xae, 0x09, - 0x00, 0xd7, 0x6f, 0x01, 0x3d, 0xeb, 0x00, 0x4d, 0xf8, 0x01, 0x4f, 0x31, 0x01, 0xc7, 0x88, 0xff, - 0x32, 0xee, 0xfe, 0x74, 0x04, 0xfe, 0x85, 0xa5, 0x18, 0xac, 0x3e, 0x1a, 0x31, 0x93, 0x00, 0x83, - 0x5d, 0x08, 0x52, 0xd9, 0x0b, 0x35, 0x69, 0x00, 0x1a, 0x83, 0xf5, 0x31, 0x40, 0xf8, 0x70, 0x7d, - 0x09, 0xb8, 0xd6, 0x03, 0xec, 0xb9, 0xf9, 0x91, 0x8a, 0xfe, 0x2e, 0x07, 0xfe, 0xff, 0x6f, 0x00, - 0x50, 0x49, 0x02, 0x29, 0x4c, 0xfd, 0x4b, 0x89, 0xff, 0x20, 0xf8, 0x00, 0x73, 0x31, 0xfe, 0x98, - 0xa8, 0xff, 0xed, 0xbc, 0xfe, 0x18, 0x0a, 0xff, 0x28, 0x03, 0x00, 0xd5, 0x49, 0xfe, 0x0b, 0xc2, - 0xff, 0xc8, 0x6b, 0x00, 0xb9, 0x16, 0x00, 0x67, 0xbd, 0x01, 0x1e, 0x22, 0x01, 0x89, 0x7c, 0x00, - 0x27, 0x8b, 0x00, 0xd9, 0x01, 0xff, 0x8b, 0x54, 0x1a, 0x76, 0x52, 0x1d, 0xe1, 0x12, 0x01, 0xb4, - 0x48, 0x08, 0xf9, 0xce, 0x0c, 0x09, 0x42, 0xff, 0xf3, 0xad, 0xf2, 0xc7, 0xc9, 0xf8, 0xd3, 0xcb, - 0x0b, 0x67, 0x45, 0x02, 0x6b, 0x11, 0xf8, 0x46, 0x15, 0xff, 0x80, 0xdc, 0xfd, 0xa7, 0x82, 0x00, - 0x61, 0x63, 0x02, 0x3d, 0xc7, 0xfc, 0x5c, 0x47, 0xff, 0xb7, 0xc0, 0x00, 0x36, 0xa2, 0xfd, 0xc8, - 0x4d, 0xff, 0x84, 0x66, 0xfe, 0x34, 0xc4, 0xfe, 0x6d, 0x33, 0x00, 0x5b, 0x99, 0xfd, 0xa6, 0xcf, - 0xfe, 0x18, 0x37, 0x00, 0x34, 0xaa, 0xff, 0x7c, 0xce, 0x00, 0x2a, 0x82, 0x00, 0x28, 0xe7, 0xff, - 0xed, 0x93, 0x00, 0xc2, 0x64, 0x00, 0x6f, 0xda, 0x1b, 0x08, 0x15, 0x21, 0x60, 0x1b, 0x02, 0x6a, - 0xd0, 0x06, 0xa7, 0x3b, 0x0d, 0xc3, 0xb3, 0xfe, 0x8d, 0xb1, 0xf0, 0x10, 0x45, 0xf9, 0x8a, 0xe9, - 0x0c, 0xe0, 0x60, 0x01, 0x4a, 0xb2, 0xf6, 0xb4, 0xe5, 0xfe, 0xfb, 0x23, 0xfe, 0x77, 0x45, 0x00, - 0xea, 0x9b, 0x02, 0x36, 0xa1, 0xfc, 0x73, 0xc7, 0xfe, 0x5f, 0xaf, 0x00, 0xdb, 0x5d, 0xfd, 0x49, - 0xcc, 0xfe, 0x30, 0xf6, 0xfd, 0xa0, 0x5e, 0xfe, 0xec, 0xde, 0xff, 0xb6, 0x97, 0xfd, 0xf0, 0x8c, - 0xfe, 0x2b, 0x92, 0xff, 0x89, 0x46, 0xff, 0xe5, 0xa5, 0x00, 0xdc, 0xf7, 0xff, 0xd4, 0x4a, 0xff, - 0x49, 0xcf, 0xff, 0x21, 0x0c, 0xff, 0x41, 0x97, 0x1c, 0x85, 0x80, 0x24, 0xa9, 0xe2, 0x03, 0x8a, - 0xff, 0x05, 0x68, 0x72, 0x0d, 0x38, 0x0e, 0xfe, 0x32, 0x2e, 0xef, 0x55, 0x7a, 0xf9, 0x8c, 0xb7, - 0x0d, 0xf8, 0xe5, 0x00, 0x8a, 0xc6, 0xf5, 0x47, 0x27, 0xfe, 0x61, 0x50, 0xfe, 0x62, 0x32, 0x00, - 0x06, 0xa4, 0x02, 0x41, 0xf2, 0xfc, 0xb1, 0xf8, 0xfd, 0xcf, 0x8d, 0x00, 0xcd, 0x9e, 0xfd, 0x59, - 0x82, 0xfe, 0x5e, 0x7a, 0xfd, 0xad, 0xaa, 0xfd, 0x74, 0x87, 0xff, 0xa9, 0x63, 0xfd, 0x6b, 0x61, - 0xfe, 0x65, 0x5d, 0xff, 0x60, 0x15, 0xff, 0xa0, 0x37, 0x00, 0x49, 0x5f, 0x00, 0x76, 0x6e, 0xfe, - 0xd9, 0x28, 0xfe, 0x65, 0x61, 0xff, 0x3c, 0xbd, 0x1c, 0x5d, 0x82, 0x27, 0x7c, 0x61, 0x06, 0xca, - 0x93, 0x05, 0x3e, 0x57, 0x0d, 0xfc, 0x87, 0xfd, 0xd8, 0x9f, 0xee, 0x40, 0xf8, 0xf8, 0xe4, 0xf1, - 0x0d, 0xa9, 0x29, 0x01, 0x67, 0xd2, 0xf4, 0x1d, 0xb4, 0xfd, 0x35, 0x27, 0xfe, 0xb3, 0xcf, 0xff, - 0xf8, 0xdb, 0x02, 0xfb, 0x34, 0xfd, 0x22, 0x48, 0xfd, 0x6d, 0x5d, 0x00, 0xa8, 0xd9, 0xfd, 0xf3, - 0x53, 0xfe, 0x36, 0x62, 0xfd, 0x0a, 0xfa, 0xfc, 0xad, 0x27, 0xff, 0xc9, 0x03, 0xfd, 0x8b, 0xda, - 0xfd, 0x4f, 0x13, 0xff, 0x64, 0x47, 0xff, 0x2c, 0xc9, 0x00, 0x96, 0xb1, 0xfe, 0x7f, 0x04, 0xfe, - 0x66, 0xb9, 0xfe, 0x1e, 0x72, 0xfe, 0x32, 0xc6, 0x1d, 0x05, 0x93, 0x2a, 0xcf, 0x9d, 0x08, 0xa8, - 0x29, 0x04, 0x0c, 0x0f, 0x0c, 0xb9, 0xdc, 0xfd, 0x64, 0xa8, 0xef, 0x82, 0x19, 0xf8, 0x3f, 0x30, - 0x0c, 0xa8, 0xfb, 0x01, 0xe8, 0xb6, 0xf4, 0xdc, 0xdc, 0xfc, 0x64, 0x8b, 0xfe, 0x42, 0xf6, 0xfe, - 0x0b, 0x49, 0x02, 0xe2, 0x3a, 0xfe, 0x66, 0xb0, 0xfc, 0x9d, 0x79, 0xff, 0xc6, 0x5c, 0xfe, 0x05, - 0x30, 0xfe, 0x27, 0xf5, 0xfc, 0xf9, 0xe1, 0xfc, 0x48, 0xf6, 0xfe, 0x78, 0x9a, 0xfc, 0x9a, 0xdf, - 0xfc, 0x58, 0x65, 0xff, 0x88, 0x29, 0xff, 0x1d, 0x15, 0xff, 0x10, 0x75, 0xff, 0xfa, 0x36, 0xfe, - 0x87, 0xb0, 0xfd, 0x34, 0xa1, 0xfe, 0xca, 0x79, 0x1e, 0xc8, 0xe3, 0x2b, 0x95, 0x06, 0x0c, 0x95, - 0xf9, 0x03, 0x73, 0xcf, 0x09, 0xf9, 0x93, 0x00, 0x63, 0xd1, 0xf0, 0xf5, 0xe7, 0xf5, 0x39, 0xe8, - 0x0a, 0x75, 0xea, 0x02, 0xf6, 0x8d, 0xf5, 0x8c, 0x9d, 0xfc, 0xa3, 0xc3, 0xfd, 0x24, 0x87, 0xfe, - 0xf1, 0x0c, 0x02, 0x7c, 0xab, 0xfe, 0xa9, 0x3b, 0xfd, 0xe2, 0x43, 0xfe, 0x24, 0xac, 0xfd, 0x17, - 0xdf, 0xfe, 0xb0, 0xa8, 0xfd, 0xbe, 0x56, 0xfc, 0x4d, 0x3e, 0xfe, 0xe0, 0x26, 0xfd, 0x6f, 0x94, - 0xfd, 0x60, 0xef, 0xfd, 0x7e, 0x98, 0xfd, 0x13, 0x26, 0x00, 0xa6, 0xfe, 0xfe, 0x3d, 0x08, 0xfe, - 0x07, 0x3e, 0xfe, 0x15, 0x34, 0xfe, 0x6e, 0xac, 0x20, 0xbb, 0xa9, 0x2a, 0x37, 0xf5, 0x0c, 0xf3, - 0xd5, 0x07, 0xa7, 0xc0, 0x08, 0x11, 0x31, 0x01, 0x5b, 0xa1, 0xf0, 0xf6, 0x44, 0xf5, 0xfe, 0xc9, - 0x09, 0x9e, 0x6b, 0x02, 0xf8, 0x5a, 0xf7, 0x4b, 0xf6, 0xfb, 0xd6, 0xcd, 0xfc, 0x93, 0xd2, 0xfe, - 0x5c, 0xb8, 0x01, 0x80, 0x6e, 0xfe, 0x85, 0xb5, 0xfd, 0xdc, 0x2e, 0xfd, 0xf8, 0x09, 0xfd, 0xd8, - 0xa5, 0xff, 0xe7, 0x4a, 0xfd, 0x10, 0xfe, 0xfb, 0x92, 0x0c, 0xfe, 0x4c, 0x21, 0xfe, 0xb4, 0xfc, - 0xfc, 0x0e, 0xd9, 0xfc, 0xdb, 0xbc, 0xfd, 0x1c, 0x01, 0xff, 0x58, 0x39, 0xff, 0x4e, 0x4c, 0xfe, - 0x4f, 0xeb, 0xfd, 0xe7, 0x1b, 0xfe, 0xbe, 0x44, 0x23, 0x96, 0xee, 0x27, 0x46, 0xa8, 0x0c, 0x72, - 0x0b, 0x0e, 0x52, 0x55, 0x08, 0xab, 0x42, 0x01, 0x57, 0x5f, 0xf0, 0x6a, 0x73, 0xf5, 0x04, 0xea, - 0x08, 0x5e, 0xbc, 0xff, 0xe9, 0x1f, 0xfa, 0x55, 0x98, 0xfc, 0x04, 0x20, 0xfb, 0xc4, 0x6e, 0xff, - 0x21, 0x39, 0x01, 0xf8, 0xaa, 0xfd, 0x78, 0xa6, 0xfe, 0x34, 0xb4, 0xfc, 0xef, 0x3b, 0xfc, 0x70, - 0xb5, 0xff, 0xb8, 0x2c, 0xfc, 0xa4, 0x0f, 0xfd, 0x0b, 0x53, 0xfe, 0xb9, 0x58, 0xfc, 0xd3, 0x27, - 0xfe, 0x9c, 0xfc, 0xfc, 0x81, 0x64, 0xfc, 0x8d, 0x4c, 0xff, 0xd5, 0x0f, 0xff, 0xb3, 0x08, 0xfe, - 0x25, 0xf9, 0xfd, 0x01, 0x4c, 0xfe, 0x7c, 0xc3, 0x26, 0xbb, 0x9b, 0x23, 0x7e, 0xf2, 0x08, 0x75, - 0x87, 0x17, 0xd3, 0x11, 0x0b, 0xfc, 0x65, 0xfd, 0x54, 0x74, 0xf0, 0xc3, 0x67, 0xf8, 0xc2, 0x5c, - 0x06, 0x87, 0x29, 0xfb, 0xcd, 0x38, 0xfe, 0xdd, 0x0c, 0xfe, 0x96, 0xbd, 0xf8, 0xbe, 0xbc, 0xff, - 0xc9, 0xae, 0x00, 0x2b, 0x6b, 0xfd, 0x30, 0x70, 0xff, 0xce, 0x11, 0xfc, 0x67, 0x38, 0xfb, 0xca, - 0x77, 0xff, 0xc5, 0x3a, 0xfc, 0xc1, 0xef, 0xfc, 0x21, 0x94, 0xfc, 0x65, 0x15, 0xfd, 0x29, 0xd2, - 0xfe, 0xfe, 0x6d, 0xfc, 0x6c, 0xc8, 0xfc, 0x7e, 0x71, 0xfe, 0x73, 0xfe, 0xfe, 0x5c, 0x87, 0xfe, - 0x44, 0x94, 0xfe, 0x39, 0x86, 0xfd, 0x0d, 0xc8, 0x2b, 0x4a, 0xee, 0x22, 0xdd, 0xcd, 0x02, 0x61, - 0xd4, 0x1c, 0xba, 0xbf, 0x0d, 0x36, 0x01, 0xf9, 0xaa, 0xf6, 0xf2, 0x39, 0x22, 0xfe, 0x63, 0x99, - 0x02, 0x80, 0x92, 0xf3, 0x8d, 0xdb, 0x01, 0xda, 0x79, 0x02, 0xb9, 0xdb, 0xf6, 0x2d, 0x4c, 0xff, - 0xe5, 0xd9, 0xff, 0x61, 0x21, 0xfd, 0x0f, 0xfc, 0x00, 0xc3, 0x48, 0xfb, 0x93, 0xe1, 0xf9, 0x1f, - 0xeb, 0x00, 0xd9, 0x2b, 0xfa, 0x19, 0x9d, 0xfb, 0xfb, 0x89, 0xfe, 0x3f, 0x66, 0xfb, 0xdc, 0x4c, - 0xff, 0x84, 0x1b, 0xfd, 0x04, 0xa9, 0xfc, 0x7e, 0xb8, 0xfe, 0x9c, 0xd9, 0xfe, 0xce, 0x44, 0xff, - 0x3b, 0x68, 0xfe, 0x4d, 0x88, 0xfc, 0x56, 0xd4, 0x30, 0x49, 0xbe, 0x23, 0x86, 0x39, 0xfb, 0x66, - 0xae, 0x1f, 0x11, 0x76, 0x12, 0x8c, 0x6f, 0xf4, 0x87, 0xdc, 0xf3, 0x94, 0x99, 0x05, 0xa2, 0xde, - 0x00, 0x2f, 0xe5, 0xe9, 0xcb, 0x72, 0x02, 0xae, 0x21, 0x09, 0x0d, 0x55, 0xf6, 0xdc, 0xef, 0xfd, - 0x51, 0x0b, 0xff, 0x3a, 0x02, 0xfc, 0xfe, 0x8f, 0x02, 0xc5, 0x20, 0xfb, 0x8d, 0xbd, 0xf9, 0xb9, - 0x98, 0xff, 0xab, 0x6b, 0xf8, 0xf5, 0x48, 0xfc, 0x25, 0xe8, 0xfd, 0xa7, 0x25, 0xfb, 0xe5, 0xc4, - 0xff, 0xaf, 0xd8, 0xfc, 0x2b, 0xe3, 0xfc, 0xa6, 0xf6, 0xff, 0xf1, 0x0b, 0xff, 0xc0, 0xfa, 0xfd, - 0x59, 0x7b, 0xfe, 0x8f, 0xb1, 0xfd, 0x37, 0x6d, 0x35, 0x6d, 0x0b, 0x26, 0x8e, 0x6a, 0xf3, 0x16, - 0xc4, 0x1f, 0x37, 0xb4, 0x18, 0x8b, 0x36, 0xf1, 0x27, 0x3d, 0xf3, 0xc6, 0x3d, 0x0d, 0x4f, 0xf5, - 0x01, 0x96, 0xc9, 0xe0, 0x31, 0xe6, 0xfe, 0xfe, 0xf8, 0x0f, 0x0f, 0x00, 0xf9, 0xb7, 0xee, 0xfb, - 0xf8, 0x49, 0xfe, 0xb7, 0x6b, 0xfa, 0xe8, 0x80, 0x03, 0xef, 0x20, 0xfd, 0x7f, 0x84, 0xf7, 0x87, - 0xef, 0xfe, 0x0a, 0xa7, 0xf8, 0x5b, 0xe3, 0xf9, 0x7f, 0x0a, 0xff, 0xce, 0x7d, 0xfb, 0xe8, 0x1b, - 0xff, 0x89, 0x43, 0xfd, 0x3e, 0x2a, 0xfd, 0x79, 0x45, 0x01, 0x87, 0xb1, 0xfe, 0xea, 0xf1, 0xfc, - 0xea, 0x6b, 0xff, 0x7b, 0x51, 0xfe, 0x9f, 0x32, 0x3b, 0x31, 0xf0, 0x29, 0x05, 0x44, 0xea, 0xb5, - 0x2c, 0x1b, 0x56, 0xe4, 0x1f, 0xe4, 0xe5, 0xf1, 0x10, 0x31, 0xf0, 0xd7, 0xe4, 0x11, 0xc4, 0xce, - 0x04, 0xb3, 0x0b, 0xdb, 0x1b, 0xae, 0xf8, 0xfd, 0xbb, 0x13, 0xdb, 0x0b, 0xfe, 0x10, 0xe3, 0xfa, - 0x88, 0xad, 0xfc, 0x11, 0xa0, 0xf8, 0x3a, 0x21, 0x05, 0xac, 0xe1, 0xfc, 0x46, 0x84, 0xf5, 0x33, - 0x3d, 0x00, 0x99, 0x3f, 0xf7, 0xb6, 0x4a, 0xf8, 0x37, 0x3f, 0xff, 0x63, 0x00, 0xfc, 0xf5, 0x51, - 0xff, 0xa0, 0x12, 0xfd, 0xaa, 0x56, 0xfd, 0x65, 0x88, 0x01, 0xf5, 0xb7, 0xfe, 0xe7, 0xe9, 0xfc, - 0x7e, 0x8f, 0xff, 0x62, 0x3d, 0xfe, 0xf3, 0x6f, 0x41, 0x85, 0x62, 0x2d, 0x6b, 0x0d, 0xe2, 0x12, - 0x2b, 0x16, 0x71, 0xe7, 0x24, 0xce, 0x4a, 0xf4, 0x95, 0xad, 0xed, 0xfa, 0x2d, 0x16, 0xf1, 0x9a, - 0x07, 0xeb, 0x0e, 0xd7, 0xdf, 0x3e, 0xf2, 0x11, 0xc8, 0x14, 0xe9, 0x6a, 0x04, 0x7d, 0xb2, 0xfb, - 0xa6, 0xe3, 0xf9, 0x3c, 0xbc, 0xf7, 0x86, 0xf8, 0x05, 0x4c, 0xd8, 0xfb, 0x3c, 0x7b, 0xf5, 0x75, - 0xe6, 0xff, 0x2e, 0x51, 0xf7, 0x0a, 0x26, 0xf7, 0x5e, 0x66, 0xfe, 0x54, 0x33, 0xfd, 0x99, 0xa4, - 0xff, 0xf2, 0x27, 0xfd, 0x94, 0xc1, 0xfc, 0x78, 0x9e, 0x01, 0x8e, 0x0a, 0xff, 0x80, 0x6d, 0xfd, - 0xba, 0x2f, 0xff, 0x8a, 0x53, 0xfe, 0x76, 0x69, 0x4a, 0x00, 0xbd, 0x2e, 0xf4, 0x86, 0xd9, 0xc7, - 0x9c, 0x11, 0xc7, 0x83, 0x27, 0x9c, 0x46, 0xf8, 0x25, 0x30, 0xec, 0x5f, 0x42, 0x19, 0x0a, 0x01, - 0x09, 0xea, 0xe2, 0xd4, 0xc2, 0xa0, 0xed, 0xff, 0x89, 0x13, 0x28, 0x53, 0x0a, 0xd2, 0xad, 0xfd, - 0x80, 0x68, 0xf7, 0x0b, 0x64, 0xf6, 0x2e, 0xfa, 0x06, 0x60, 0xe1, 0xfa, 0x91, 0xe6, 0xf4, 0x41, - 0x56, 0x00, 0xa4, 0xe2, 0xf6, 0x66, 0x01, 0xf7, 0x03, 0x0e, 0xfe, 0x11, 0x93, 0xfd, 0x32, 0x1f, - 0x00, 0xad, 0x59, 0xfd, 0x92, 0xd4, 0xfb, 0xfb, 0xca, 0x01, 0xc4, 0xcb, 0xff, 0xcd, 0x59, 0xfd, - 0x72, 0x04, 0xff, 0xee, 0x43, 0xfe, 0x7b, 0x70, 0x54, 0x61, 0x21, 0x30, 0x9b, 0x95, 0xcf, 0xe0, - 0x73, 0x0c, 0x9c, 0xea, 0x28, 0x38, 0x05, 0xfe, 0xfb, 0x5e, 0xeb, 0x15, 0x34, 0x19, 0xd5, 0xcd, - 0x09, 0x6b, 0xb5, 0xd4, 0x0b, 0x80, 0xea, 0x01, 0x76, 0x10, 0xec, 0x3a, 0x0e, 0xf9, 0xc1, 0x00, - 0x7f, 0xbf, 0xf5, 0xe3, 0xed, 0xf3, 0x1b, 0x4e, 0x08, 0xd4, 0xca, 0xf9, 0x37, 0xd5, 0xf3, 0xcc, - 0xff, 0x00, 0x21, 0x1c, 0xf6, 0xec, 0xd9, 0xf7, 0x88, 0x2e, 0xfd, 0xbd, 0xb8, 0xfd, 0x2b, 0xa4, - 0x00, 0x1a, 0xe0, 0xfc, 0x48, 0x30, 0xfb, 0xdf, 0x21, 0x02, 0xd9, 0x4f, 0x00, 0x12, 0xc7, 0xfc, - 0xd7, 0xd1, 0xfe, 0xa4, 0x0a, 0xfe, 0x65, 0x06, 0x5d, 0x10, 0x64, 0x33, 0x48, 0xc9, 0xc5, 0x82, - 0xd7, 0x08, 0x07, 0xbf, 0x28, 0x22, 0x89, 0x03, 0xeb, 0x03, 0xec, 0xd8, 0xf8, 0x17, 0xe9, 0xea, - 0x0c, 0x98, 0x16, 0xd5, 0x60, 0xe1, 0xe7, 0xca, 0x00, 0x0d, 0x61, 0x7b, 0x10, 0xa0, 0x7d, 0x05, - 0x53, 0xe1, 0xf4, 0x15, 0xc9, 0xf1, 0x50, 0x63, 0x09, 0x33, 0x10, 0xf9, 0x6d, 0x7b, 0xf3, 0xca, - 0xf7, 0x01, 0x32, 0xc8, 0xf5, 0x0d, 0x42, 0xf8, 0xb1, 0x3f, 0xfd, 0x54, 0xb7, 0xfd, 0x38, 0xd2, - 0x00, 0x30, 0x83, 0xfc, 0x73, 0x6d, 0xfb, 0xf8, 0xd2, 0x02, 0x90, 0xe2, 0xff, 0x8b, 0x5c, 0xfc, - 0x6c, 0x2e, 0xff, 0xd2, 0x0d, 0xfe, 0xaa, 0x13, 0x67, 0x4d, 0x49, 0x32, 0xf4, 0xb1, 0xbd, 0xc8, - 0xc0, 0x08, 0x7b, 0x07, 0x26, 0x91, 0x41, 0x05, 0x37, 0x73, 0xed, 0xa4, 0x54, 0x17, 0xcf, 0x01, - 0x11, 0xb2, 0x5a, 0xd4, 0x0b, 0x71, 0xe4, 0xce, 0xbc, 0x0a, 0x05, 0xef, 0x10, 0xd0, 0x8c, 0x09, - 0xca, 0x12, 0xf4, 0x75, 0x1a, 0xf1, 0x90, 0x1b, 0x09, 0x1c, 0x09, 0xf7, 0xab, 0xeb, 0xf4, 0x49, - 0xcb, 0x02, 0x1f, 0x81, 0xf4, 0x99, 0x0a, 0xf8, 0xee, 0x2e, 0xfe, 0x2f, 0x0b, 0xfd, 0xb0, 0x75, - 0x00, 0x0b, 0x4b, 0xfc, 0x17, 0x2f, 0xfc, 0xc4, 0x3a, 0x03, 0x48, 0x61, 0xfe, 0x9e, 0x7b, 0xfc, - 0x88, 0x61, 0xff, 0x1d, 0x11, 0xfe, 0xf2, 0x29, 0x6d, 0x4d, 0xe4, 0x34, 0xd7, 0x91, 0xb6, 0x33, - 0x10, 0x0a, 0x91, 0x09, 0x22, 0x8c, 0xa0, 0x04, 0x3a, 0xfc, 0xee, 0xe8, 0xf2, 0x15, 0xe8, 0x33, - 0x19, 0x43, 0xb2, 0xd3, 0x30, 0x4d, 0xde, 0x42, 0x8a, 0x09, 0x57, 0x6a, 0x11, 0xd8, 0x60, 0x0b, - 0xaf, 0xb0, 0xf5, 0x6d, 0x72, 0xf1, 0x8b, 0x7d, 0x06, 0x7e, 0x75, 0xf6, 0x87, 0x04, 0xf7, 0x64, - 0xe0, 0x02, 0x10, 0x8c, 0xf3, 0x66, 0xdd, 0xf7, 0x70, 0xe3, 0xfe, 0x97, 0x10, 0xfc, 0x5f, 0x0d, - 0x00, 0x71, 0xe0, 0xfc, 0xd4, 0xa5, 0xfc, 0x17, 0x5f, 0x03, 0x62, 0x11, 0xfd, 0x7e, 0xb2, 0xfc, - 0x7b, 0xba, 0xff, 0x4e, 0xa6, 0xfd, 0xe4, 0xf5, 0x73, 0xc1, 0xef, 0x33, 0x98, 0x8a, 0xb2, 0x1e, - 0x9b, 0x0d, 0x62, 0x9e, 0x1c, 0x09, 0xb2, 0x01, 0x3f, 0xe7, 0xee, 0x17, 0x5a, 0x16, 0xf7, 0x2d, - 0x22, 0xa2, 0xa1, 0xd2, 0x52, 0xe8, 0xd7, 0xb0, 0x04, 0x09, 0x59, 0x99, 0x11, 0x46, 0x10, 0x0b, - 0x58, 0x33, 0xf9, 0xbe, 0xd7, 0xf1, 0x86, 0x18, 0x03, 0x83, 0x35, 0xf7, 0x88, 0x78, 0xf8, 0x84, - 0xa1, 0x02, 0xb3, 0x5b, 0xf2, 0x35, 0xc2, 0xf8, 0xf7, 0xe6, 0xfe, 0x41, 0x8c, 0xfa, 0x93, 0xf3, - 0xff, 0x36, 0xc3, 0xfd, 0x12, 0x07, 0xfd, 0x98, 0x28, 0x03, 0x47, 0x3e, 0xfc, 0xe0, 0x90, 0xfc, - 0x0c, 0x59, 0x00, 0x19, 0x8e, 0xfc, 0xae, 0x9c, 0x78, 0x4c, 0xe0, 0x33, 0x46, 0xef, 0xb0, 0x55, - 0x45, 0x11, 0xff, 0x28, 0x17, 0x3f, 0x6d, 0xfe, 0x7b, 0x6d, 0xec, 0xd1, 0x9b, 0x17, 0x11, 0xbb, - 0x2b, 0x0c, 0x35, 0xd2, 0x87, 0xb6, 0xd2, 0x80, 0xc5, 0x07, 0x84, 0x15, 0x11, 0x79, 0x05, 0x0a, - 0x4c, 0x77, 0xfe, 0x18, 0x21, 0xf1, 0x30, 0x6b, 0x00, 0x7c, 0x95, 0xf9, 0xd5, 0x10, 0xf8, 0x7e, - 0x9a, 0x02, 0x1a, 0xab, 0xf1, 0xb7, 0x37, 0xfa, 0x49, 0x52, 0xfe, 0x2f, 0x2b, 0xf9, 0x8d, 0xab, - 0xff, 0x8a, 0xec, 0xfe, 0x6f, 0x8c, 0xfd, 0xcb, 0x60, 0x02, 0x93, 0x4f, 0xfc, 0x22, 0x48, 0xfc, - 0x9f, 0x7e, 0x00, 0x3f, 0xef, 0xfa, 0xb5, 0x2e, 0x7a, 0x67, 0x39, 0x36, 0x68, 0xfd, 0xb0, 0xf4, - 0x61, 0x13, 0x77, 0x2c, 0x13, 0xd8, 0x0a, 0xfc, 0x4f, 0xbc, 0xe7, 0x5c, 0xe7, 0x17, 0x58, 0x47, - 0x34, 0x16, 0xca, 0xd3, 0xa9, 0x3b, 0xd0, 0x16, 0x62, 0x04, 0x76, 0x0a, 0x10, 0x2d, 0xc3, 0x08, - 0x6a, 0xd5, 0x03, 0x1a, 0xbd, 0xf0, 0x90, 0xfb, 0xfd, 0xa1, 0xee, 0xfc, 0xbe, 0x9d, 0xf6, 0x7b, - 0x1e, 0x02, 0xc0, 0x45, 0xf2, 0xfd, 0x93, 0xfb, 0x09, 0x21, 0xfd, 0x05, 0x40, 0xf8, 0xe0, 0x55, - 0xff, 0xca, 0xf5, 0xff, 0x61, 0xf1, 0xfd, 0x65, 0x36, 0x01, 0x37, 0x8e, 0xfd, 0xe3, 0x4d, 0xfb, - 0x87, 0x70, 0xff, 0xa6, 0x6e, 0xfa, 0x50, 0x14, 0x7c, 0xf1, 0x43, 0x39, 0xba, 0x02, 0xb1, 0x31, - 0x0e, 0x13, 0xf7, 0xf5, 0x10, 0x3c, 0xbf, 0xfa, 0x2c, 0x65, 0xe1, 0x39, 0x33, 0x17, 0x99, 0xb1, - 0x3a, 0x49, 0x17, 0xd7, 0x10, 0xde, 0xcf, 0xd3, 0x00, 0xff, 0x67, 0x41, 0x0f, 0xca, 0x62, 0x08, - 0x4f, 0x67, 0x07, 0xa9, 0xb1, 0xf1, 0x16, 0x12, 0xfc, 0x3b, 0x26, 0xff, 0x33, 0xaf, 0xf5, 0x83, - 0x0c, 0x01, 0x25, 0x90, 0xf3, 0x25, 0x3c, 0xfc, 0xa7, 0xe3, 0xfb, 0xdc, 0xcd, 0xf7, 0xf1, 0x07, - 0xff, 0x47, 0x7d, 0x00, 0x78, 0x04, 0xfe, 0x51, 0x0d, 0x01, 0x5d, 0x21, 0xfe, 0x74, 0x80, 0xf9, - 0x67, 0xd5, 0xfe, 0xb0, 0x7c, 0xfa, 0x2f, 0x3c, 0x7d, 0x96, 0x0c, 0x3b, 0x45, 0x50, 0xb3, 0x2c, - 0x8a, 0x11, 0xa4, 0xc3, 0x0f, 0x79, 0xe6, 0xf9, 0xcc, 0x9d, 0xdb, 0x0d, 0x1b, 0x15, 0x43, 0x60, - 0x3d, 0xd3, 0x28, 0xdd, 0xe6, 0x2c, 0xd1, 0x70, 0xd1, 0xf8, 0x45, 0x01, 0x0e, 0x8d, 0x21, 0x09, - 0x47, 0x61, 0x08, 0x0c, 0x7f, 0xf3, 0xbc, 0xd0, 0xfb, 0x2c, 0x37, 0xff, 0x9e, 0x05, 0xf6, 0xfd, - 0x0e, 0x00, 0x9a, 0x02, 0xf5, 0x8d, 0x39, 0xfc, 0xf5, 0xec, 0xfa, 0x1b, 0xbf, 0xf7, 0x64, 0x8a, - 0xfe, 0xd2, 0x68, 0x00, 0xa0, 0x8d, 0xfe, 0xb8, 0xd4, 0x00, 0x45, 0x9d, 0xfc, 0x0a, 0x94, 0xf9, - 0x12, 0xd4, 0xfd, 0x10, 0x52, 0xfa, 0x76, 0x6b, 0x7b, 0x40, 0x49, 0x3f, 0xa9, 0xe4, 0xb6, 0x99, - 0xf5, 0x0e, 0x52, 0x96, 0x0f, 0x68, 0x49, 0xf8, 0xfd, 0xcb, 0xd8, 0xd6, 0x0f, 0x0f, 0x28, 0x87, - 0x3e, 0x98, 0x57, 0xe6, 0xc1, 0x86, 0xd2, 0x1c, 0xcf, 0xf2, 0x63, 0x2c, 0x0c, 0x46, 0xf5, 0x0a, - 0x15, 0x78, 0x07, 0x0e, 0xf8, 0xf5, 0x07, 0x31, 0xfd, 0xe1, 0xaf, 0xfd, 0x52, 0xd6, 0xf6, 0x7a, - 0x6e, 0x00, 0x1d, 0xd3, 0xf5, 0x6d, 0xad, 0xfb, 0x68, 0x78, 0xfa, 0x04, 0x4f, 0xf7, 0x36, 0x71, - 0xfe, 0xdf, 0xb8, 0x00, 0x1c, 0xd1, 0xfd, 0x2b, 0xdb, 0xff, 0xd4, 0xfc, 0xfb, 0xb0, 0xcf, 0xf9, - 0xd4, 0xfa, 0xfc, 0x16, 0x70, 0xfb, 0x5d, 0x62, 0x77, 0x1e, 0x1a, 0x45, 0x63, 0xd2, 0xbb, 0x57, - 0xe9, 0x0b, 0xba, 0x14, 0x0f, 0xaf, 0xf1, 0xf6, 0xf9, 0x08, 0xd9, 0x2e, 0x0a, 0x05, 0x9e, 0x9f, - 0x3e, 0xe2, 0x37, 0xf1, 0x78, 0xe6, 0xd3, 0x81, 0xbb, 0xee, 0x8f, 0x1e, 0x09, 0x7f, 0x0a, 0x0d, - 0x4d, 0x95, 0x05, 0x7c, 0xd0, 0xf8, 0xf2, 0xef, 0xff, 0xb0, 0xf3, 0xfa, 0x35, 0xad, 0xf8, 0x9b, - 0x54, 0x01, 0x7a, 0x45, 0xf6, 0x9b, 0xb5, 0xfa, 0xa8, 0xe2, 0xf9, 0x4a, 0x68, 0xf7, 0x3b, 0xed, - 0xfe, 0x7f, 0xaf, 0xff, 0xb5, 0xad, 0xfb, 0x02, 0xd7, 0x00, 0x63, 0xed, 0xfa, 0x40, 0x5f, 0xfa, - 0xe5, 0xef, 0xfd, 0x29, 0x38, 0xfb, 0xe4, 0x8a, 0x71, 0x65, 0xd3, 0x4b, 0x6a, 0x42, 0xc2, 0xc4, - 0x46, 0x07, 0xaf, 0x23, 0x0d, 0x52, 0x05, 0xf8, 0xcf, 0xde, 0xdb, 0x15, 0x4d, 0xf7, 0xd2, 0xcb, - 0x3c, 0xd1, 0x9f, 0xfc, 0x17, 0xee, 0xd5, 0x1d, 0x5c, 0xed, 0xb8, 0x6f, 0x04, 0x22, 0x75, 0x0d, - 0x40, 0xa7, 0x04, 0xe9, 0xcc, 0xfa, 0xb1, 0xb1, 0x03, 0xd5, 0x74, 0xf8, 0x5d, 0x23, 0xfa, 0x34, - 0xcd, 0x02, 0xa0, 0x16, 0xf6, 0x67, 0x6d, 0xf9, 0x0d, 0x8e, 0xf9, 0xe5, 0x45, 0xf8, 0x4e, 0x05, - 0xfd, 0x86, 0x5c, 0xfe, 0x84, 0xb8, 0xfa, 0x32, 0x6a, 0x01, 0xca, 0x09, 0xfb, 0xf7, 0x5e, 0xfb, - 0x75, 0x18, 0xfe, 0xb8, 0x8d, 0xfa, 0xaf, 0xd2, 0x6b, 0xc4, 0x3e, 0x4e, 0x49, 0xf3, 0xcb, 0x81, - 0x40, 0x05, 0x0e, 0xc7, 0x08, 0xe1, 0xe7, 0xf9, 0x9d, 0xea, 0xdc, 0xad, 0xbe, 0xea, 0x5a, 0x64, - 0x3a, 0xcf, 0x19, 0x07, 0xfb, 0xe6, 0xd7, 0xbc, 0x1e, 0xee, 0xa7, 0x84, 0xff, 0x4a, 0x09, 0x0a, - 0x55, 0xdd, 0x07, 0x8f, 0x87, 0xfa, 0x8f, 0x2d, 0x07, 0xa4, 0xc4, 0xf8, 0x06, 0xc3, 0xf8, 0x11, - 0xbc, 0x05, 0x73, 0x1a, 0xf5, 0x5b, 0x98, 0xf8, 0x7e, 0x9e, 0xf9, 0xb0, 0xb5, 0xf6, 0xa6, 0x06, - 0xfb, 0x3d, 0xfb, 0xfd, 0xd1, 0xfb, 0xf9, 0xc4, 0x94, 0x02, 0xa2, 0x4a, 0xfc, 0x9b, 0x69, 0xfa, - 0x19, 0xfa, 0xfe, 0xb1, 0xba, 0xfa, 0x4a, 0x1d, 0x64, 0xf5, 0x6e, 0x4f, 0x79, 0xfd, 0xd7, 0x39, - 0x08, 0x05, 0x6e, 0x6a, 0x04, 0x37, 0x9f, 0xfb, 0x4e, 0x1f, 0xdd, 0x8a, 0xd6, 0xde, 0x22, 0x16, - 0x37, 0x34, 0x55, 0x12, 0xe7, 0x79, 0xd9, 0x02, 0x32, 0xef, 0x40, 0x15, 0xfd, 0xe3, 0x5a, 0x02, - 0xa2, 0x75, 0x0d, 0x8d, 0xf6, 0xfa, 0xf6, 0x3f, 0x07, 0x6f, 0xcb, 0xfd, 0xfa, 0x6c, 0xf5, 0x12, - 0x4d, 0x07, 0x58, 0xc5, 0xf6, 0x94, 0x60, 0xf6, 0xca, 0x27, 0xf9, 0xc5, 0x8b, 0xf5, 0x68, 0x7d, - 0xf8, 0xcf, 0xa6, 0xfe, 0x04, 0x7e, 0xfa, 0x58, 0x96, 0x02, 0xbd, 0x03, 0xfe, 0xa4, 0x74, 0xf9, - 0x44, 0xbb, 0xff, 0xd4, 0x45, 0xfa, 0x7c, 0x60, 0x5d, 0xfb, 0xf1, 0x50, 0xb1, 0x93, 0xe3, 0xa2, - 0xdf, 0x01, 0x0a, 0x99, 0xfe, 0x2f, 0xc3, 0xff, 0xa3, 0x56, 0xe1, 0x32, 0x3a, 0xd4, 0x74, 0x72, - 0x2e, 0xa6, 0xe7, 0x1c, 0xc8, 0x46, 0xdc, 0xcb, 0xed, 0xef, 0x4f, 0xa0, 0xff, 0x48, 0x42, 0xf8, - 0x04, 0xc8, 0x0f, 0x48, 0xd7, 0xff, 0x77, 0x2e, 0x04, 0x4e, 0x58, 0x03, 0xce, 0xe4, 0xf4, 0x07, - 0xcd, 0x04, 0xd7, 0xac, 0xf9, 0xae, 0x15, 0xf5, 0xd6, 0xc1, 0xf7, 0x6f, 0x8e, 0xf5, 0x4d, 0x09, - 0xf7, 0x8a, 0xb8, 0xfe, 0xf1, 0xf3, 0xfb, 0x87, 0x81, 0x01, 0xda, 0x9d, 0xff, 0xb3, 0x0d, 0xf9, - 0xce, 0xe7, 0xfe, 0x6e, 0x58, 0xfb, 0xd2, 0x27, 0x59, 0xd5, 0x19, 0x51, 0x9d, 0x14, 0xe7, 0xaa, - 0xcf, 0x04, 0x78, 0x38, 0x00, 0x9c, 0x4d, 0xf9, 0xee, 0xfb, 0xe4, 0x07, 0xea, 0xd2, 0x72, 0xba, - 0x21, 0x1d, 0xd5, 0x24, 0xf0, 0xd3, 0xe1, 0x6c, 0x6d, 0xed, 0xf6, 0x0d, 0x05, 0x10, 0x0a, 0xf1, - 0x64, 0x0a, 0x0d, 0x43, 0x98, 0x07, 0x39, 0x2d, 0x01, 0x1a, 0xc7, 0x04, 0xe8, 0x9c, 0xf7, 0x47, - 0x57, 0x00, 0x2b, 0x6f, 0xfc, 0x2c, 0xe6, 0xf5, 0xdd, 0x62, 0xf5, 0xad, 0x2d, 0xf8, 0x73, 0x37, - 0xf5, 0x43, 0x12, 0xfe, 0xd3, 0x79, 0xfd, 0xd2, 0x4c, 0x00, 0x76, 0x75, 0xff, 0x16, 0xb5, 0xf9, - 0x1b, 0x4a, 0xfe, 0x0c, 0xcb, 0xfb, 0x83, 0xfa, 0x5a, 0x1e, 0x1c, 0x4d, 0xab, 0xc0, 0xe4, 0x4d, - 0x78, 0x0a, 0xd7, 0x13, 0x03, 0x51, 0xd7, 0xf0, 0xac, 0x57, 0xe5, 0x9a, 0x5f, 0xd9, 0x46, 0xb8, - 0x15, 0x7a, 0x34, 0x26, 0xcb, 0x50, 0xe9, 0xd3, 0x92, 0xea, 0xfa, 0x2a, 0x0a, 0xeb, 0x7b, 0xee, - 0xff, 0x3b, 0x09, 0xce, 0xe4, 0x0a, 0x74, 0xac, 0x00, 0xe5, 0x94, 0x03, 0x11, 0xc8, 0xf9, 0xf3, - 0x5b, 0xff, 0x0f, 0x0c, 0xfb, 0x5f, 0x61, 0xf9, 0xb4, 0xb5, 0xf4, 0x02, 0x3e, 0xfa, 0xcd, 0x7b, - 0xf5, 0xe7, 0xe3, 0xfa, 0xb7, 0x3b, 0xfe, 0x18, 0x36, 0xff, 0xba, 0xf5, 0xff, 0xcc, 0xac, 0xf9, - 0xe6, 0x94, 0xfd, 0x29, 0x32, 0xfc, 0xe1, 0x54, 0x5a, 0xe1, 0x5a, 0x4b, 0x6a, 0x75, 0xe2, 0x32, - 0x07, 0x0f, 0x34, 0x31, 0x06, 0xb9, 0x0b, 0xea, 0x62, 0xa6, 0xe7, 0xbf, 0x91, 0xde, 0x26, 0x42, - 0x0a, 0x12, 0x89, 0x25, 0xf3, 0xe8, 0xf3, 0x65, 0x43, 0xe6, 0x8b, 0x9b, 0x0e, 0x66, 0x2f, 0xef, - 0x25, 0x9c, 0x03, 0x0a, 0x74, 0x0e, 0x68, 0xf7, 0xfb, 0x8d, 0x25, 0x06, 0x0f, 0x09, 0xfb, 0x6e, - 0xb5, 0xfc, 0x48, 0x17, 0xfe, 0x24, 0x34, 0xfc, 0x5d, 0x71, 0xf5, 0xb1, 0xb8, 0xfb, 0x7e, 0x1d, - 0xf6, 0x14, 0x2d, 0xf7, 0x89, 0xf3, 0xfd, 0x80, 0xf3, 0xfd, 0x97, 0x72, 0x01, 0x60, 0x16, 0xfa, - 0xa0, 0x17, 0xfb, 0x90, 0x1b, 0xfd, 0x02, 0x57, 0x5d, 0x39, 0x77, 0x43, 0x32, 0x0d, 0xe1, 0xa8, - 0xc9, 0x15, 0x3f, 0x19, 0x04, 0xb9, 0x1b, 0xe7, 0xac, 0x36, 0xea, 0x1a, 0xd5, 0xe1, 0x62, 0xe6, - 0x00, 0x3b, 0xc0, 0x25, 0xb1, 0xbe, 0xfb, 0x5d, 0x17, 0xe3, 0xf4, 0xb6, 0x0f, 0xbf, 0x6e, 0xf4, - 0x0c, 0xfa, 0xfc, 0x6f, 0xad, 0x0d, 0x69, 0x69, 0xfd, 0x34, 0xc2, 0x00, 0x6e, 0x24, 0xff, 0x17, - 0x6c, 0xfd, 0xe0, 0xe9, 0xff, 0x8a, 0x7c, 0xff, 0x56, 0xe6, 0xf4, 0xb2, 0x03, 0xfc, 0x63, 0x02, - 0xf8, 0xa7, 0xc2, 0xf5, 0x48, 0x14, 0xfa, 0x9a, 0x63, 0xfe, 0x52, 0xc6, 0x00, 0x2b, 0xe2, 0xfa, - 0x90, 0x98, 0xfa, 0x94, 0x9b, 0xfc, 0x8c, 0x16, 0x5f, 0xd0, 0x7f, 0x40, 0x02, 0xfb, 0xd8, 0xeb, - 0xb5, 0x1b, 0xcb, 0x55, 0x09, 0xf1, 0x31, 0xdf, 0xb6, 0x17, 0xeb, 0x30, 0x49, 0xeb, 0xbc, 0x51, - 0xfa, 0xd0, 0x28, 0x1d, 0x5e, 0x50, 0x07, 0xab, 0x2b, 0xe2, 0xd4, 0xc3, 0x0b, 0x7d, 0x6d, 0xfb, - 0x52, 0xa3, 0xf8, 0x61, 0x6b, 0x0b, 0x5c, 0xee, 0xfd, 0x21, 0xac, 0xfc, 0x9b, 0xcf, 0x01, 0x1b, - 0xda, 0x02, 0x14, 0xd0, 0xfe, 0xde, 0x65, 0x01, 0x06, 0x44, 0xf6, 0xd8, 0x90, 0xfa, 0x93, 0x90, - 0xfa, 0x92, 0x86, 0xf5, 0x63, 0xe4, 0xf7, 0xf9, 0x34, 0xfc, 0xe9, 0x1f, 0xff, 0xde, 0xc5, 0xfb, - 0x8a, 0xe5, 0xfc, 0xc5, 0x46, 0xfc, 0x59, 0x5f, 0x60, 0x51, 0x70, 0x3c, 0xf1, 0x07, 0xd0, 0x86, - 0x28, 0x24, 0x94, 0x48, 0x0e, 0x78, 0xc2, 0xd5, 0xca, 0x7d, 0xed, 0x0d, 0x60, 0xf5, 0xc2, 0xbe, - 0xf4, 0x49, 0x2e, 0x13, 0x21, 0x2c, 0x11, 0xb1, 0x01, 0xe3, 0x0a, 0xbe, 0x06, 0x1f, 0x3d, 0x01, - 0x27, 0x11, 0xf5, 0xcb, 0xcd, 0x09, 0xca, 0xc7, 0xfe, 0x28, 0x51, 0xfb, 0xad, 0x10, 0x03, 0xa1, - 0x65, 0x04, 0x79, 0xe0, 0x00, 0xde, 0x17, 0x02, 0x28, 0xd6, 0xf6, 0x0f, 0xbd, 0xfa, 0x64, 0x09, - 0xfb, 0xee, 0x38, 0xf6, 0x8d, 0x23, 0xf8, 0xc8, 0xca, 0xf9, 0x2a, 0x17, 0xfb, 0xdd, 0x06, 0xfd, - 0x69, 0xa2, 0xff, 0xe5, 0xaa, 0xfc, 0x61, 0xdc, 0x61, 0xaf, 0xcc, 0x34, 0x40, 0x24, 0xca, 0x06, - 0x5d, 0x2e, 0xe8, 0xc5, 0x0e, 0x17, 0xb1, 0xcf, 0x3c, 0x37, 0xf1, 0xb0, 0x47, 0xfc, 0xdc, 0x0b, - 0xf2, 0x9e, 0x5e, 0x09, 0x3a, 0xb3, 0x16, 0xe6, 0xa4, 0xe6, 0xcd, 0x74, 0x03, 0x64, 0x91, 0x02, - 0x05, 0x4a, 0xf2, 0x27, 0x7a, 0x0b, 0x32, 0x8a, 0x00, 0xb5, 0xd3, 0xf8, 0x2d, 0x90, 0x05, 0x4c, - 0x86, 0x02, 0x8a, 0x3c, 0x01, 0x3f, 0x79, 0x06, 0x8d, 0x1b, 0xf5, 0xd5, 0xb7, 0xfb, 0xed, 0xcd, - 0xfb, 0xfe, 0xfe, 0xf4, 0xb2, 0xca, 0xfa, 0x55, 0xf7, 0xf8, 0xdf, 0xbd, 0xf6, 0xd8, 0xe9, 0xfc, - 0xb2, 0xf3, 0x00, 0x9c, 0xc3, 0xfd, 0xb2, 0x1c, 0x62, 0xda, 0x19, 0x2b, 0x90, 0x0c, 0xc9, 0xf8, - 0xe8, 0x37, 0xd6, 0x96, 0x0b, 0x49, 0x90, 0xcd, 0x32, 0xd1, 0xf5, 0x98, 0x41, 0x01, 0xb1, 0x13, - 0xed, 0x91, 0x43, 0x03, 0x36, 0xc2, 0x1c, 0x0b, 0x2c, 0xe7, 0x92, 0x7a, 0xff, 0xed, 0xa7, 0x06, - 0x65, 0x2f, 0xf1, 0x98, 0xb8, 0x08, 0xc7, 0x04, 0x06, 0xa4, 0xba, 0xf8, 0x98, 0x9c, 0x02, 0x5e, - 0x85, 0x03, 0x4c, 0x13, 0x00, 0x3f, 0x92, 0x07, 0x9f, 0x75, 0xf8, 0x30, 0x8d, 0xf9, 0x06, 0x80, - 0xfd, 0xea, 0x6b, 0xf5, 0xb2, 0xf8, 0xf9, 0xad, 0x01, 0xfc, 0x2f, 0x7d, 0xf4, 0x87, 0x57, 0xfa, - 0x16, 0x0a, 0x01, 0x1e, 0x0a, 0xff, 0xc2, 0xb1, 0x5d, 0x25, 0x85, 0x23, 0x2e, 0x09, 0xce, 0x7c, - 0xf1, 0x3b, 0xa4, 0xb9, 0x06, 0x09, 0x83, 0xd1, 0xad, 0x2c, 0xfa, 0x3f, 0xd6, 0xff, 0x04, 0xb7, - 0xea, 0x79, 0xde, 0x01, 0x55, 0x0e, 0x1e, 0x73, 0xb9, 0xe6, 0xe6, 0x7f, 0xfd, 0xf1, 0x27, 0x0b, - 0xed, 0x95, 0xf0, 0x96, 0xe9, 0x04, 0xc1, 0x72, 0x0a, 0x90, 0xe1, 0xf9, 0x3b, 0x16, 0x00, 0x2a, - 0x38, 0x03, 0x41, 0x31, 0xff, 0x26, 0x83, 0x07, 0x55, 0x33, 0xfa, 0x60, 0x88, 0xf9, 0x5a, 0xd4, - 0xfe, 0xed, 0x35, 0xf6, 0xfa, 0x0c, 0xf9, 0x6e, 0x61, 0xfd, 0x7e, 0xe8, 0xf5, 0x64, 0xa4, 0xf8, - 0x6e, 0xc8, 0xfe, 0xd5, 0x5b, 0xff, 0x15, 0xab, 0x55, 0x76, 0x55, 0x1f, 0x8e, 0xe1, 0xd5, 0xc8, - 0x46, 0x3a, 0xa3, 0x56, 0x05, 0x7b, 0x8e, 0xd7, 0xb7, 0x13, 0xfa, 0x9f, 0xeb, 0xff, 0xf3, 0xd1, - 0xeb, 0x2d, 0xc5, 0xfd, 0x65, 0x99, 0x1d, 0x51, 0x7b, 0xea, 0xa4, 0x98, 0xfa, 0x3d, 0x8e, 0x0c, - 0xbd, 0x03, 0xf4, 0xbe, 0xcc, 0x01, 0x87, 0x31, 0x0a, 0x87, 0xc2, 0xfb, 0x09, 0x12, 0x01, 0x13, - 0x50, 0x01, 0xe7, 0xd3, 0xfd, 0xaf, 0x79, 0x08, 0xc0, 0x31, 0xf9, 0x5b, 0xa6, 0xfa, 0x80, 0x09, - 0x01, 0x6d, 0x3b, 0xf6, 0x70, 0xa3, 0xf9, 0x23, 0xce, 0xfd, 0x8f, 0x30, 0xf7, 0xde, 0x56, 0xf9, - 0x41, 0x53, 0xfd, 0x89, 0xde, 0xfd, 0x34, 0xe6, 0x4b, 0x26, 0x43, 0x1e, 0xb4, 0x9d, 0xdc, 0xe9, - 0x27, 0x36, 0x93, 0x91, 0x07, 0x73, 0x9e, 0xda, 0x14, 0x25, 0xfa, 0x8a, 0x38, 0x02, 0x68, 0xf6, - 0xeb, 0x8f, 0xea, 0xf9, 0x61, 0xff, 0x1c, 0xa0, 0x0d, 0xef, 0xf6, 0x61, 0xf7, 0xf1, 0x7f, 0x0d, - 0xa9, 0xb5, 0xf7, 0x47, 0x78, 0xfe, 0x47, 0xd0, 0x09, 0xea, 0x84, 0xfd, 0xf3, 0x8e, 0x00, 0xbe, - 0xe0, 0x01, 0x8f, 0x0a, 0xfd, 0xa8, 0x64, 0x06, 0x60, 0x2a, 0xfb, 0xfb, 0xc9, 0xf9, 0x6c, 0x74, - 0x01, 0x65, 0x07, 0xf9, 0xb1, 0x68, 0xf9, 0xbc, 0xa1, 0xfe, 0xf6, 0xf1, 0xf7, 0x11, 0x07, 0xfa, - 0x81, 0xd8, 0xfd, 0x53, 0x0e, 0xfd, 0x79, 0x81, 0x3d, 0xb0, 0x0e, 0x17, 0x6e, 0xcf, 0xea, 0x6f, - 0xe4, 0x36, 0xc0, 0x3f, 0x04, 0x0d, 0x2c, 0xdc, 0x51, 0xf6, 0xff, 0xaf, 0x9e, 0x01, 0x72, 0x85, - 0xf1, 0x49, 0x13, 0x00, 0x4b, 0x56, 0x09, 0xb7, 0xe9, 0xf1, 0xed, 0xa4, 0x06, 0x3e, 0x78, 0x08, - 0x79, 0x3e, 0xf6, 0xfb, 0x7d, 0xfe, 0x59, 0x9f, 0x04, 0xe4, 0x86, 0xfd, 0x22, 0x73, 0xfc, 0x8a, - 0xe2, 0x00, 0x38, 0x44, 0xff, 0xcd, 0x0c, 0x00, 0x81, 0x16, 0xfe, 0xc6, 0xe3, 0x02, 0xc9, 0x3b, - 0x03, 0xa9, 0xaa, 0x00, 0xcc, 0x1a, 0x01, 0x8d, 0x43, 0xfe, 0xb4, 0xe8, 0xfb, 0x9c, 0x41, 0xfe, - 0x92, 0x87, 0xfc, 0xe5, 0x3c, 0xfa, 0x82, 0x81, 0x34, 0x04, 0xc7, 0x16, 0x36, 0x7d, 0xf0, 0x95, - 0x1f, 0x2f, 0x3e, 0xff, 0x05, 0x0a, 0x05, 0xe3, 0x77, 0x2b, 0xff, 0x8b, 0x4e, 0x00, 0x6a, 0x6e, - 0xf3, 0xf3, 0x19, 0x00, 0x4e, 0xa1, 0x08, 0x21, 0x84, 0xf4, 0x0b, 0xa9, 0x04, 0x59, 0x7f, 0x07, - 0x8d, 0x4c, 0xf8, 0x7c, 0x6f, 0xfd, 0xe4, 0x2c, 0x03, 0xf6, 0x55, 0xfe, 0xf6, 0xe5, 0xfc, 0x67, - 0xef, 0xff, 0xc7, 0x94, 0xff, 0xc6, 0x4e, 0x01, 0x9c, 0x86, 0xfe, 0x13, 0x66, 0x01, 0x6b, 0x3d, - 0x03, 0x15, 0xc9, 0x00, 0xc9, 0xf7, 0xff, 0xbc, 0x67, 0xfe, 0x39, 0xba, 0xfc, 0xc9, 0xd4, 0xfd, - 0x3f, 0x26, 0xfd, 0x9d, 0x38, 0xfc, 0xe1, 0x16, 0x2d, 0xfa, 0xa5, 0x16, 0xf1, 0xca, 0xf4, 0x97, - 0x3f, 0x28, 0xf6, 0x5e, 0x08, 0xc5, 0x43, 0xe8, 0xc5, 0x23, 0xfe, 0x48, 0x43, 0x00, 0x27, 0x67, - 0xf5, 0xa9, 0xcf, 0xff, 0x5a, 0x26, 0x08, 0xe7, 0x31, 0xf7, 0xb1, 0x7a, 0x02, 0xe3, 0xed, 0x06, - 0x7a, 0x92, 0xfa, 0x1a, 0x71, 0xfc, 0xd6, 0x91, 0x02, 0x8c, 0x0a, 0xff, 0x60, 0x49, 0xfd, 0x93, - 0xe5, 0xff, 0x80, 0x20, 0x00, 0x01, 0x97, 0x01, 0x48, 0xa8, 0xfe, 0x4f, 0x67, 0x01, 0x4a, 0x41, - 0x02, 0x9e, 0x29, 0x00, 0x25, 0xa9, 0x00, 0xc9, 0x0a, 0xff, 0xc2, 0xe3, 0xfc, 0x60, 0xdf, 0xfd, - 0xa4, 0xec, 0xfd, 0x63, 0x67, 0xfd, 0x06, 0x04, 0x27, 0x1c, 0x19, 0x16, 0xbd, 0x66, 0xf7, 0x1b, - 0xf9, 0x22, 0x3c, 0xea, 0x09, 0xfd, 0x47, 0xec, 0x52, 0x26, 0xfe, 0xa8, 0x6a, 0x00, 0x08, 0x34, - 0xf7, 0x43, 0x9a, 0xff, 0x06, 0xd0, 0x07, 0x32, 0xb8, 0xf8, 0x51, 0xf2, 0x00, 0xbd, 0xa6, 0x06, - 0x5b, 0x86, 0xfb, 0xa3, 0x38, 0xfc, 0x43, 0x3c, 0x02, 0xd0, 0xad, 0xff, 0xf4, 0xa0, 0xfd, 0x8f, - 0x19, 0x00, 0xef, 0xda, 0x00, 0xdf, 0xea, 0x00, 0xd3, 0x0d, 0xff, 0xb0, 0x39, 0x01, 0x75, 0x32, - 0x01, 0x7b, 0x37, 0x00, 0xdb, 0x3d, 0x01, 0xcb, 0xbc, 0xff, 0x4f, 0x2e, 0xfd, 0x74, 0x4e, 0xfe, - 0xf6, 0x66, 0xfe, 0xc5, 0xa4, 0xfd, 0x6a, 0x4c, 0x22, 0x01, 0xa1, 0x14, 0xac, 0x69, 0xf9, 0x85, - 0xf1, 0x1e, 0x09, 0x2e, 0x0a, 0xc0, 0x39, 0xf0, 0x53, 0x3a, 0xfe, 0xba, 0xc1, 0x00, 0x6c, 0xf7, - 0xf8, 0x38, 0x3d, 0xff, 0xc3, 0x4f, 0x07, 0x5e, 0xb8, 0xf9, 0x3c, 0x17, 0x00, 0x1d, 0xdf, 0x05, - 0xd2, 0x51, 0xfc, 0x68, 0x58, 0xfc, 0x94, 0x2d, 0x02, 0x8f, 0x1e, 0x00, 0x19, 0xf3, 0xfd, 0xbb, - 0xc8, 0x00, 0x86, 0x8b, 0x00, 0x59, 0x77, 0x00, 0x47, 0x7f, 0xff, 0x85, 0x92, 0x00, 0xfb, 0x44, - 0x01, 0xd6, 0x8e, 0x00, 0x65, 0x43, 0x01, 0xae, 0x4f, 0x00, 0x7a, 0xcf, 0xfd, 0x5f, 0x7c, 0xfe, - 0xcb, 0xa9, 0xfe, 0x0a, 0xde, 0xfd, 0xa0, 0x31, 0x1e, 0x2c, 0x23, 0x13, 0x47, 0x65, 0xfb, 0xb4, - 0xd1, 0x1a, 0x57, 0x6c, 0x0a, 0x75, 0x1c, 0xf4, 0x8d, 0x60, 0xfe, 0x36, 0x5b, 0x01, 0x80, 0x17, - 0xfa, 0x03, 0x55, 0xff, 0x13, 0xa3, 0x06, 0xaa, 0x46, 0xfa, 0x14, 0xbd, 0xff, 0xd6, 0x4c, 0x05, - 0xf3, 0xf2, 0xfc, 0x3d, 0x9c, 0xfc, 0xb9, 0x75, 0x02, 0x5b, 0x6e, 0x00, 0xa7, 0xce, 0xfe, 0xc1, - 0x98, 0x00, 0x48, 0x16, 0x00, 0x84, 0xea, 0x00, 0x79, 0x80, 0xff, 0x15, 0xb4, 0x00, 0x7b, 0x87, - 0x01, 0xfe, 0xd7, 0x00, 0x8b, 0x50, 0x01, 0x3c, 0x5f, 0x00, 0xed, 0x71, 0xfe, 0xf6, 0xe8, 0xfe, - 0xe0, 0xf6, 0xfe, 0xc1, 0x2f, 0xfe, 0xd4, 0x19, 0x1a, 0x0d, 0x41, 0x11, 0xde, 0x25, 0xfd, 0xe1, - 0xe6, 0x17, 0xc3, 0x2c, 0x0b, 0x1f, 0x03, 0xf7, 0x8d, 0x76, 0xfe, 0xcb, 0xcf, 0x01, 0xeb, 0x58, - 0xfb, 0xeb, 0x4c, 0xff, 0xc0, 0x75, 0x05, 0x58, 0x1d, 0xfb, 0xc0, 0xb2, 0xff, 0xa0, 0x7c, 0x04, - 0xcd, 0x6b, 0xfd, 0x1a, 0xce, 0xfd, 0x52, 0x6f, 0x02, 0xd5, 0x63, 0x00, 0xaf, 0x5d, 0xff, 0x2e, - 0x60, 0x00, 0x7c, 0xa4, 0x00, 0x9b, 0x34, 0x01, 0x3f, 0x8c, 0xff, 0xf7, 0xdd, 0x00, 0x63, 0xc4, - 0x01, 0xb2, 0xea, 0x00, 0xd4, 0x52, 0x01, 0x38, 0x7e, 0x00, 0x7d, 0xeb, 0xfe, 0xe9, 0xa9, 0xff, - 0x05, 0xe4, 0xfe, 0x6d, 0x73, 0xfd, 0x56, 0x38, 0x16, 0x4d, 0x1d, 0x10, 0xf3, 0x8e, 0xfe, 0xcd, - 0xd6, 0x14, 0xb8, 0x9c, 0x0b, 0xd5, 0xbf, 0xf9, 0x00, 0xcc, 0xfe, 0xda, 0x20, 0x02, 0x79, 0x36, - 0xfc, 0xac, 0xeb, 0xfe, 0x00, 0xbe, 0x04, 0x47, 0x03, 0xfc, 0x2f, 0x81, 0xff, 0x14, 0xc6, 0x03, - 0xfd, 0x7a, 0xfe, 0xf8, 0x59, 0xfe, 0x74, 0xf1, 0x01, 0xbe, 0x24, 0x01, 0x1e, 0xbb, 0xff, 0xe5, - 0xc7, 0x00, 0x0b, 0x14, 0x01, 0x6e, 0xf2, 0x00, 0x56, 0x00, 0x00, 0x5b, 0x00, 0x01, 0x5c, 0xbe, - 0x01, 0x85, 0xf4, 0x00, 0x32, 0x3b, 0x01, 0x33, 0xe1, 0x00, 0x2a, 0x3b, 0xff, 0x68, 0xdf, 0xfe, - 0xd3, 0xe6, 0xfd, 0x10, 0x0e, 0xfd, 0xbb, 0x18, 0x13, 0x21, 0xd8, 0x0e, 0xcf, 0xb1, 0xff, 0x02, - 0x78, 0x12, 0x56, 0xca, 0x0b, 0x95, 0x15, 0xfc, 0x52, 0x51, 0xff, 0x52, 0x3b, 0x02, 0x07, 0xd6, - 0xfc, 0xc4, 0xd1, 0xfe, 0xcb, 0x33, 0x04, 0xb9, 0x26, 0xfd, 0x55, 0x66, 0xff, 0x5c, 0xfc, 0x02, - 0x0d, 0x6f, 0xff, 0x1a, 0x0a, 0xff, 0xd1, 0x49, 0x02, 0xc0, 0xf1, 0x01, 0x64, 0x46, 0x00, 0x62, - 0x25, 0x01, 0x68, 0x1b, 0x01, 0xab, 0x19, 0x01, 0xf7, 0x6e, 0x00, 0x16, 0x2d, 0x01, 0xa5, 0xa3, - 0x01, 0x53, 0x2d, 0x01, 0x75, 0x3b, 0x01, 0xd7, 0xd7, 0xff, 0x84, 0x67, 0xfe, 0xf8, 0x51, 0xfe, - 0x2f, 0xe0, 0xfd, 0xcb, 0x45, 0xfd, 0xef, 0x7f, 0x10, 0x0c, 0xb2, 0x0d, 0xad, 0xd7, 0x00, 0x34, - 0x86, 0x10, 0x41, 0x53, 0x0b, 0x96, 0x95, 0xfd, 0x18, 0x4a, 0x00, 0xc7, 0x3c, 0x02, 0x82, 0xd7, - 0xfc, 0x8a, 0x2c, 0xff, 0xb8, 0x4b, 0x04, 0xc8, 0x5e, 0xfd, 0xe2, 0x92, 0xfe, 0xd1, 0x68, 0x03, - 0x87, 0xc9, 0x00, 0x91, 0xd2, 0xff, 0x46, 0xff, 0x02, 0x20, 0x08, 0x02, 0x27, 0x8d, 0x00, 0x73, - 0xa2, 0x01, 0xe3, 0x2a, 0x01, 0x3a, 0x46, 0x01, 0xda, 0xb2, 0x00, 0xc2, 0x29, 0x01, 0x14, 0x0e, - 0x01, 0xf8, 0x11, 0x00, 0x7c, 0x2a, 0x00, 0x4c, 0x29, 0xff, 0x2d, 0x50, 0xfe, 0x9c, 0x28, 0xfe, - 0x38, 0x78, 0xfd, 0xae, 0xfb, 0xfc, 0x9c, 0x5f, 0x0f, 0xdb, 0xa1, 0x0d, 0x16, 0x50, 0x01, 0xc6, - 0xfe, 0x0d, 0x51, 0x5b, 0x0a, 0xce, 0xae, 0xfe, 0x72, 0x1a, 0x01, 0x85, 0x75, 0x02, 0x11, 0xef, - 0xfc, 0x11, 0x05, 0xff, 0xc0, 0xe2, 0x03, 0xba, 0x1a, 0xfe, 0x3d, 0x1c, 0xff, 0x92, 0xa2, 0x04, - 0x9b, 0x03, 0x02, 0xde, 0xf7, 0xff, 0x30, 0x42, 0x03, 0x55, 0xaa, 0x02, 0x42, 0x61, 0x01, 0x40, - 0x74, 0x01, 0x0e, 0x00, 0x01, 0xb4, 0x64, 0x01, 0x2d, 0x1a, 0x00, 0x19, 0x8d, 0xff, 0x90, 0xcb, - 0xff, 0x92, 0xf2, 0xff, 0xdb, 0xce, 0xff, 0x24, 0xed, 0xfe, 0xb0, 0x87, 0xfd, 0xfe, 0x60, 0xfd, - 0xd2, 0xcf, 0xfd, 0xdc, 0x58, 0xfd, 0x5e, 0x57, 0x0d, 0x2d, 0xe2, 0x0b, 0xc8, 0x3c, 0x02, 0x86, - 0xfc, 0x0d, 0xc7, 0xca, 0x09, 0xda, 0x7b, 0xff, 0xe7, 0xfc, 0x01, 0x39, 0xc4, 0x01, 0x8c, 0xca, - 0xfc, 0x27, 0xd2, 0xff, 0x1d, 0x48, 0x04, 0x39, 0x2a, 0xff, 0xde, 0x3c, 0x00, 0xdd, 0xb9, 0x04, - 0xaa, 0x65, 0x02, 0x49, 0xa3, 0x01, 0x60, 0x02, 0x04, 0xac, 0x96, 0x02, 0x66, 0x0c, 0x01, 0x18, - 0x0c, 0x01, 0x26, 0x9b, 0x00, 0x18, 0xb2, 0xff, 0xf9, 0xc3, 0xfe, 0xe6, 0x17, 0xff, 0x02, 0xce, - 0xff, 0x07, 0xf1, 0xff, 0xde, 0xf0, 0xfe, 0x3a, 0x3d, 0xfe, 0x6b, 0x87, 0xfd, 0x2e, 0x04, 0xfe, - 0xf9, 0x15, 0xfe, 0x5b, 0x55, 0xfd, 0x96, 0x6c, 0x0c, 0x8a, 0xb9, 0x0b, 0x89, 0xcd, 0x02, 0x18, - 0xd0, 0x0c, 0x52, 0x30, 0x09, 0xea, 0xbc, 0xff, 0x62, 0x58, 0x01, 0x3e, 0x40, 0x02, 0x23, 0xbc, - 0xfe, 0x50, 0x6b, 0x00, 0xbd, 0x71, 0x04, 0xb1, 0x1a, 0x00, 0xad, 0x65, 0x01, 0x91, 0x07, 0x06, - 0x95, 0xd8, 0x03, 0xdb, 0xea, 0x01, 0x96, 0x49, 0x03, 0x30, 0x09, 0x02, 0x50, 0xea, 0xff, 0xcb, - 0x76, 0xff, 0x8e, 0x05, 0xff, 0x7b, 0x6f, 0xff, 0xd1, 0xc5, 0xfe, 0x80, 0xe9, 0xfe, 0xac, 0xc1, - 0xff, 0x34, 0x11, 0xff, 0x34, 0xaf, 0xfe, 0xf9, 0x83, 0xfe, 0x53, 0x02, 0xfe, 0x61, 0x37, 0xfe, - 0x3a, 0x0f, 0xfe, 0xc9, 0x8f, 0xfd, 0x34, 0xa5, 0x0a, 0x33, 0xda, 0x0a, 0x0b, 0x31, 0x04, 0xb1, - 0xa8, 0x0b, 0x5d, 0xd3, 0x07, 0xb2, 0x86, 0x01, 0xdf, 0x69, 0x02, 0x12, 0xbc, 0x02, 0x4b, 0x10, - 0x00, 0x50, 0x65, 0x00, 0x14, 0xcf, 0x04, 0xd3, 0x6a, 0x02, 0x5a, 0x04, 0x03, 0xe1, 0xd2, 0x05, - 0xcc, 0x72, 0x03, 0x05, 0x82, 0x01, 0x5d, 0xc3, 0x01, 0x27, 0xb2, 0xff, 0xbe, 0x72, 0xfe, 0xb1, - 0x67, 0xff, 0xa3, 0x04, 0xff, 0x36, 0xdb, 0xfe, 0x1c, 0x23, 0xfe, 0x86, 0xb0, 0xfe, 0x75, 0xc5, - 0xff, 0xa8, 0x36, 0xff, 0x3d, 0xc5, 0xfe, 0x1e, 0x56, 0xfe, 0x7c, 0x1a, 0xfe, 0x83, 0x59, 0xfe, - 0xdb, 0xdf, 0xfd, 0x61, 0xbb, 0xfd, 0xf0, 0xbd, 0x09, 0xc9, 0xff, 0x09, 0xf0, 0x14, 0x04, 0x76, - 0xf8, 0x0a, 0x52, 0x42, 0x09, 0x91, 0x68, 0x03, 0xfd, 0x63, 0x02, 0x68, 0x1b, 0x03, 0xcb, 0xee, - 0x01, 0x29, 0x1d, 0x02, 0x54, 0x1c, 0x05, 0x4e, 0xc1, 0x03, 0x30, 0x8b, 0x03, 0xf0, 0x4c, 0x04, - 0x23, 0xce, 0x01, 0xa1, 0x5f, 0xff, 0x44, 0xe8, 0xff, 0x40, 0xa0, 0xff, 0xf9, 0x09, 0xff, 0x2e, - 0x94, 0xfe, 0x85, 0xdf, 0xfd, 0x83, 0x89, 0xfe, 0x63, 0xfa, 0xfe, 0xd7, 0x92, 0xff, 0xf7, 0x5f, - 0xff, 0xf6, 0xa0, 0xfe, 0x97, 0xaa, 0xfe, 0x72, 0xd0, 0xfe, 0xb3, 0x4c, 0xfe, 0xf0, 0xe2, 0xfd, - 0x55, 0x10, 0xfe, 0xcd, 0x58, 0xfe, 0x67, 0xc7, 0x08, 0x83, 0x74, 0x0b, 0x21, 0x70, 0x06, 0x5f, - 0xcb, 0x09, 0xe1, 0xf9, 0x08, 0x5d, 0x24, 0x04, 0x45, 0xe7, 0x03, 0xfb, 0x2f, 0x05, 0xc6, 0xa9, - 0x02, 0x71, 0xd6, 0x02, 0x69, 0x2d, 0x05, 0x22, 0x06, 0x02, 0x35, 0x59, 0x01, 0xf0, 0x7c, 0x02, - 0x2f, 0x2e, 0x00, 0xd6, 0xbe, 0xfe, 0xa9, 0x64, 0xff, 0x43, 0xed, 0xfe, 0x1f, 0x26, 0xfe, 0x55, - 0x54, 0xfe, 0xc9, 0x6f, 0xfe, 0xb7, 0xd8, 0xfe, 0x15, 0x3b, 0xff, 0xbd, 0x6b, 0xff, 0x23, 0x00, - 0xff, 0x5e, 0x72, 0xfe, 0xe0, 0xa3, 0xfe, 0x41, 0x78, 0xfe, 0xfa, 0x4d, 0xfe, 0x43, 0x4d, 0xfe, - 0x34, 0x55, 0xfe, 0x43, 0x81, 0xfe, 0x91, 0xef, 0x07, 0x84, 0xdb, 0x0b, 0xda, 0x79, 0x07, 0xcc, - 0x12, 0x0a, 0xb0, 0xf8, 0x0b, 0x8f, 0x70, 0x07, 0xe3, 0xdd, 0x03, 0x43, 0x69, 0x04, 0x4e, 0x08, - 0x03, 0xfa, 0x7d, 0x01, 0xca, 0x2a, 0x02, 0x17, 0x8e, 0x00, 0xb9, 0x85, 0x00, 0x37, 0xb5, 0x01, - 0x18, 0xf4, 0xff, 0x2c, 0x42, 0xfe, 0xfc, 0x9b, 0xfe, 0xa6, 0x75, 0xfe, 0x84, 0x16, 0xfe, 0xfd, - 0x9d, 0xfe, 0x13, 0xc0, 0xfe, 0x70, 0x0e, 0xff, 0x34, 0x19, 0xff, 0xa4, 0xd1, 0xfe, 0x5a, 0xa5, - 0xfe, 0xf2, 0xa3, 0xfe, 0x83, 0xd3, 0xfe, 0x1b, 0x96, 0xfe, 0xec, 0x43, 0xfe, 0x7d, 0x2f, 0xfe, - 0xa7, 0x89, 0xfe, 0x1d, 0xd2, 0xfe, 0x73, 0xd0, 0x08, 0x9c, 0x25, 0x0e, 0x97, 0xe7, 0x09, 0x2d, - 0xba, 0x0b, 0x93, 0x1b, 0x0b, 0xe5, 0x9f, 0x06, 0x75, 0x5a, 0x05, 0x26, 0x1f, 0x04, 0x6a, 0x39, - 0x00, 0x7a, 0xbd, 0xfe, 0x31, 0xb8, 0x01, 0x49, 0x3d, 0x01, 0x48, 0x40, 0xff, 0xb4, 0xa6, 0x00, - 0x7c, 0xf3, 0xff, 0x54, 0x4a, 0xfd, 0x5d, 0xa6, 0xfe, 0xb5, 0x6a, 0xff, 0x4e, 0x23, 0xfe, 0x0c, - 0x89, 0xfe, 0x1e, 0xea, 0xfe, 0xc0, 0xd6, 0xfe, 0xce, 0x1b, 0xff, 0xbc, 0xe2, 0xfe, 0x6d, 0x8d, - 0xfe, 0x1a, 0xb5, 0xfe, 0x3b, 0x99, 0xfe, 0xfa, 0xb0, 0xfe, 0x98, 0xab, 0xfe, 0x99, 0x5b, 0xfe, - 0x6e, 0x98, 0xfe, 0x05, 0xd5, 0xfe, 0x70, 0x7b, 0x0a, 0xe4, 0x33, 0x12, 0x20, 0x3e, 0x0c, 0x42, - 0x6b, 0x09, 0xc9, 0x86, 0x08, 0x04, 0xbd, 0x05, 0x18, 0x39, 0x04, 0xe6, 0xf6, 0x02, 0xa2, 0xcf, - 0x00, 0xff, 0x43, 0x00, 0x4d, 0x65, 0x00, 0x55, 0x02, 0xff, 0x28, 0xa7, 0xff, 0xd4, 0x45, 0x00, - 0xfe, 0xf5, 0xfe, 0xbe, 0x47, 0xfe, 0x51, 0xe4, 0xfe, 0x7a, 0xbb, 0xfe, 0x47, 0x9a, 0xfe, 0x75, - 0xf4, 0xfe, 0x59, 0x90, 0xfe, 0xbe, 0xe6, 0xfe, 0x71, 0xcd, 0xfe, 0xb9, 0xb3, 0xfe, 0x12, 0xbe, - 0xfe, 0xc2, 0xa1, 0xfe, 0xba, 0xa1, 0xfe, 0xe1, 0x9b, 0xfe, 0x7c, 0xaf, 0xfe, 0xbb, 0x96, 0xfe, - 0x1e, 0xe1, 0xfe, 0xde, 0xc8, 0xfe, 0x25, 0x8a, 0x0b, 0x49, 0x5b, 0x12, 0x1e, 0x17, 0x0b, 0xda, - 0xc9, 0x07, 0xfd, 0x9f, 0x06, 0x3b, 0x81, 0x05, 0x3a, 0x97, 0x05, 0x1f, 0x65, 0x03, 0x19, 0x14, - 0x01, 0xe3, 0x8b, 0x02, 0xf0, 0x14, 0x01, 0x9e, 0xa4, 0xfe, 0xea, 0x9f, 0xfe, 0x31, 0x47, 0xff, - 0x97, 0x81, 0x00, 0x93, 0x3d, 0xff, 0x2d, 0xa3, 0xfd, 0xe1, 0xc9, 0xfe, 0xea, 0xc0, 0xff, 0x25, - 0xcb, 0xfe, 0x79, 0xcc, 0xfe, 0x57, 0xe0, 0xfe, 0x7b, 0x7b, 0xfe, 0xcf, 0xda, 0xfe, 0x61, 0x9d, - 0xfe, 0x05, 0xbd, 0xfe, 0x05, 0xd4, 0xfe, 0xe0, 0xc9, 0xfe, 0x0d, 0xcc, 0xfe, 0xfd, 0xc3, 0xfe, - 0x78, 0xfd, 0xfe, 0xb8, 0xfa, 0xfe, 0x6c, 0x69, 0x0a, 0x23, 0x6b, 0x10, 0x9a, 0x8f, 0x09, 0xe4, - 0x7c, 0x06, 0x60, 0x42, 0x06, 0x0f, 0xac, 0x04, 0xf0, 0x7d, 0x04, 0x54, 0x71, 0x05, 0x72, 0x43, - 0x03, 0xc1, 0xbb, 0x02, 0xcd, 0x9a, 0x03, 0xcc, 0x4c, 0x00, 0x3d, 0xf7, 0xfe, 0x5c, 0xf2, 0xff, - 0xb0, 0x50, 0xff, 0x37, 0x9c, 0xfe, 0x3f, 0x6c, 0xff, 0x86, 0x73, 0xff, 0x0a, 0x8d, 0xfe, 0x86, - 0x40, 0xff, 0x71, 0x6d, 0xff, 0x66, 0x6b, 0xfe, 0x49, 0x3b, 0xfe, 0xe4, 0xc6, 0xfe, 0xe1, 0xc2, - 0xfe, 0x2b, 0xd5, 0xfe, 0x43, 0x01, 0xff, 0x66, 0x08, 0xff, 0x28, 0x17, 0xff, 0x71, 0xe0, 0xfe, - 0x01, 0xe8, 0xfe, 0x8f, 0xe9, 0xfe, 0x52, 0x5f, 0x09, 0xa6, 0x81, 0x0d, 0x1d, 0xd8, 0x07, 0xb2, - 0xc1, 0x06, 0xca, 0x50, 0x05, 0xd2, 0xda, 0x03, 0x5e, 0x05, 0x04, 0xc5, 0x9d, 0x02, 0x47, 0xa8, - 0x02, 0x4b, 0xb9, 0x05, 0xe9, 0x2d, 0x05, 0x6b, 0x3b, 0x03, 0x8a, 0x27, 0x02, 0x01, 0x41, 0x00, - 0xdc, 0x75, 0x00, 0xbc, 0x6c, 0xff, 0x63, 0x05, 0xfe, 0xf7, 0xf9, 0xfe, 0x97, 0xd0, 0xff, 0x02, - 0x01, 0xff, 0x48, 0x10, 0xfe, 0x3f, 0xc4, 0xfe, 0x0f, 0x0d, 0xff, 0x6a, 0x86, 0xfe, 0x39, 0xbe, - 0xfe, 0x8d, 0x28, 0xff, 0x3d, 0x38, 0xff, 0xd7, 0x3f, 0xff, 0x6d, 0xdd, 0xfe, 0xaa, 0xb9, 0xfe, - 0xc0, 0xa9, 0xfe, 0x93, 0xe1, 0xfe, 0x9d, 0xc8, 0x07, 0x1f, 0xd9, 0x09, 0x15, 0xe7, 0x04, 0x97, - 0xa8, 0x06, 0xfc, 0xef, 0x06, 0x6e, 0x5b, 0x05, 0x93, 0xe2, 0x01, 0x4e, 0x62, 0xff, 0xfe, 0x9d, - 0x02, 0x0e, 0xd7, 0x04, 0x10, 0x5e, 0x04, 0xd3, 0xa1, 0x05, 0x53, 0x82, 0x05, 0x1c, 0x73, 0x04, - 0x7d, 0xbc, 0x03, 0x08, 0x66, 0x00, 0xd1, 0x65, 0xff, 0x71, 0x90, 0xff, 0xd1, 0x25, 0xfe, 0x19, - 0x7c, 0xfe, 0x59, 0x7a, 0xff, 0x54, 0xdb, 0xfe, 0xa7, 0x5c, 0xfe, 0xd8, 0x19, 0xff, 0x5e, 0x6a, - 0xff, 0x03, 0x29, 0xff, 0xe3, 0xe6, 0xfe, 0xf1, 0x70, 0xff, 0xdc, 0x4a, 0xff, 0x32, 0xcb, 0xfe, - 0x45, 0xc5, 0xfe, 0x33, 0xc9, 0xfe, 0x25, 0xe9, 0x08, 0x24, 0x22, 0x0b, 0x5c, 0x5f, 0x03, 0xe4, - 0x41, 0x04, 0x56, 0xf8, 0x05, 0x4b, 0xde, 0x04, 0xed, 0xbb, 0x01, 0xb3, 0x55, 0xff, 0xaf, 0xe8, - 0x01, 0xbb, 0xbb, 0x03, 0x09, 0x76, 0x02, 0xc2, 0x12, 0x03, 0x37, 0xf7, 0x04, 0xae, 0x37, 0x06, - 0x70, 0x21, 0x06, 0xc5, 0x27, 0x03, 0x8f, 0xa8, 0x01, 0xde, 0xda, 0x00, 0xe7, 0x68, 0xff, 0x0e, - 0xc7, 0xfe, 0xad, 0xfc, 0xfd, 0x38, 0xbe, 0xfe, 0xee, 0x93, 0xff, 0xc7, 0xe2, 0xfe, 0xb7, 0x8c, - 0xfe, 0xca, 0x90, 0xff, 0x58, 0xb4, 0xff, 0xeb, 0x18, 0xff, 0xec, 0xd0, 0xfe, 0x5b, 0xa2, 0xfe, - 0xd3, 0x08, 0xff, 0x77, 0xf4, 0xfe, 0x6d, 0xb3, 0x09, 0xba, 0x14, 0x0c, 0x34, 0x1f, 0x04, 0x19, - 0xb8, 0x04, 0x93, 0xf2, 0x05, 0xcb, 0x9c, 0x04, 0x87, 0x9d, 0x00, 0xd3, 0x5c, 0xfe, 0x8b, 0x0a, - 0x03, 0xe1, 0x3d, 0x04, 0x33, 0x25, 0x00, 0x38, 0xee, 0x00, 0x11, 0x62, 0x02, 0xf7, 0x24, 0x03, - 0x92, 0x2d, 0x05, 0xd0, 0x11, 0x04, 0x27, 0x88, 0x03, 0xc3, 0xc1, 0x03, 0x86, 0x6d, 0x01, 0x8a, - 0x9c, 0xff, 0x2a, 0x37, 0xff, 0x14, 0x82, 0xfe, 0xf6, 0x4c, 0xfe, 0xcd, 0xd5, 0xfe, 0xd6, 0x48, - 0xff, 0x64, 0x39, 0xff, 0xf6, 0xcc, 0xfe, 0x44, 0x76, 0xff, 0xa5, 0x79, 0xff, 0xd0, 0x5b, 0xfe, - 0x2b, 0xa9, 0xfe, 0x45, 0x3e, 0xff, 0xca, 0x31, 0x0b, 0x1f, 0x75, 0x0d, 0x42, 0xbd, 0x03, 0xd1, - 0x7e, 0x05, 0xee, 0x66, 0x07, 0x12, 0x5f, 0x04, 0x30, 0x23, 0xff, 0x0b, 0x5d, 0xfd, 0x6b, 0xea, - 0x03, 0x2e, 0x22, 0x04, 0xfc, 0x37, 0xff, 0x4a, 0x9a, 0x00, 0x29, 0x48, 0x01, 0x4e, 0xb7, 0x01, - 0xe6, 0x6e, 0x02, 0xcc, 0xfe, 0x00, 0xb2, 0xcf, 0x02, 0x98, 0x55, 0x04, 0x86, 0xb5, 0x02, 0x8c, - 0x39, 0x02, 0x16, 0xfb, 0x00, 0x09, 0x0f, 0xff, 0x3c, 0x6f, 0xff, 0xf2, 0xc2, 0xfe, 0x54, 0x49, - 0xfe, 0xb2, 0x66, 0xff, 0xae, 0x7a, 0xff, 0xe0, 0xfd, 0xfe, 0x3f, 0x8f, 0xfe, 0x50, 0xe4, 0xfe, - 0xdf, 0x0e, 0xff, 0xd0, 0xcd, 0xfe, 0x2b, 0x98, 0x0c, 0x42, 0xcf, 0x0f, 0x45, 0x28, 0x04, 0xbc, - 0x2d, 0x05, 0x7e, 0xb3, 0x07, 0xe6, 0x62, 0x04, 0xc7, 0x0b, 0xfe, 0xce, 0x2d, 0xfd, 0x61, 0xf1, - 0x04, 0x1d, 0x39, 0x03, 0x46, 0x0b, 0xfe, 0x16, 0xc2, 0x00, 0xff, 0x04, 0x01, 0x41, 0x5b, 0x01, - 0x87, 0x1c, 0x02, 0x67, 0x59, 0xff, 0xdf, 0x53, 0x00, 0x86, 0x5d, 0x02, 0x7e, 0x03, 0x02, 0x71, - 0x5e, 0x02, 0x27, 0xfd, 0x01, 0xce, 0x77, 0x01, 0x88, 0xbe, 0x00, 0xb7, 0x78, 0xff, 0x55, 0x63, - 0xff, 0xc4, 0x96, 0xff, 0x15, 0xda, 0xfe, 0xcc, 0x0d, 0xff, 0xe7, 0x0d, 0xff, 0x1d, 0x4a, 0xfe, - 0x70, 0x7c, 0xfe, 0x3a, 0x13, 0xff, 0x88, 0x19, 0x0e, 0xf1, 0xaa, 0x11, 0xc0, 0x3e, 0x04, 0x34, - 0xb7, 0x05, 0x40, 0xc3, 0x08, 0xaf, 0xcf, 0x03, 0x87, 0x0c, 0xfc, 0x02, 0x56, 0xfd, 0x3a, 0x39, - 0x06, 0x19, 0x48, 0x02, 0xcf, 0x52, 0xfd, 0x17, 0x96, 0x00, 0x03, 0x89, 0x00, 0x32, 0x0d, 0x01, - 0xc8, 0x20, 0x02, 0x34, 0x1a, 0xff, 0x3d, 0x92, 0xff, 0x0e, 0x32, 0x01, 0x4a, 0xfa, 0xff, 0x2c, - 0x80, 0x00, 0x6f, 0x20, 0x01, 0x34, 0x7f, 0x01, 0x5a, 0xca, 0x01, 0x13, 0x4d, 0x01, 0x32, 0xbc, - 0x00, 0x5b, 0x43, 0x00, 0xad, 0xf6, 0xff, 0xc1, 0x54, 0xff, 0xe2, 0x48, 0xfe, 0xeb, 0x3f, 0xfe, - 0x8d, 0xc8, 0xfe, 0x97, 0x99, 0xfe, 0x52, 0x71, 0x10, 0x92, 0x5f, 0x14, 0x05, 0xee, 0x03, 0x3b, - 0x30, 0x05, 0x7d, 0x42, 0x09, 0x33, 0x2a, 0x03, 0xb2, 0xdd, 0xfa, 0xa9, 0x28, 0xfe, 0x35, 0x78, - 0x06, 0xa7, 0xde, 0x00, 0xca, 0xf6, 0xfc, 0x9e, 0xc1, 0x00, 0x0a, 0x38, 0x00, 0xac, 0xc0, 0x00, - 0x43, 0xdb, 0x01, 0xf0, 0xcd, 0xfe, 0xea, 0x6c, 0xff, 0xe6, 0xdc, 0x00, 0x3d, 0x34, 0xff, 0x1f, - 0xa2, 0xff, 0x94, 0x5a, 0xff, 0xa5, 0xcf, 0xff, 0x32, 0x11, 0x01, 0x4d, 0xf5, 0x00, 0xc3, 0xe5, - 0x01, 0x84, 0x4a, 0x02, 0x6c, 0xc8, 0x00, 0xb1, 0xd6, 0xff, 0xe2, 0x4c, 0xff, 0xd8, 0x3a, 0xfe, - 0x21, 0x29, 0xfe, 0x35, 0xc1, 0xfe, 0x10, 0x57, 0x12, 0x97, 0x96, 0x16, 0x1d, 0x16, 0x04, 0x6d, - 0x69, 0x05, 0xd6, 0x16, 0x0a, 0x50, 0x42, 0x02, 0x26, 0xe9, 0xf8, 0x9d, 0x72, 0xff, 0x42, 0x8e, - 0x07, 0xf5, 0x08, 0xff, 0xb0, 0x91, 0xfc, 0x86, 0x15, 0x01, 0x1f, 0x9a, 0xff, 0x8e, 0x9d, 0x00, - 0xda, 0x11, 0x02, 0x06, 0x91, 0xfe, 0x1b, 0x17, 0xff, 0x15, 0xad, 0x00, 0x79, 0x06, 0xff, 0xe8, - 0x50, 0xff, 0x66, 0xb2, 0xfe, 0x1b, 0x06, 0xff, 0xd5, 0x6e, 0xff, 0xc9, 0x82, 0xff, 0x42, 0x70, - 0x01, 0x9c, 0x43, 0x02, 0x29, 0xf5, 0x01, 0xf5, 0x4e, 0x01, 0x29, 0xe9, 0xff, 0x7d, 0x18, 0xff, - 0x12, 0x48, 0xff, 0xf3, 0x90, 0xfe, 0x25, 0xa4, 0x14, 0x65, 0xd4, 0x18, 0xdb, 0xa4, 0x03, 0x8a, - 0xe6, 0x05, 0x17, 0x19, 0x0b, 0x6f, 0x78, 0x00, 0x84, 0x19, 0xf7, 0x78, 0x8f, 0x01, 0x86, 0xe9, - 0x07, 0xc1, 0x03, 0xfd, 0xe1, 0x62, 0xfc, 0xa5, 0x41, 0x01, 0x9e, 0x74, 0xff, 0x36, 0x1b, 0x00, - 0x6c, 0xd5, 0x01, 0xdf, 0x7f, 0xfe, 0x6e, 0xdb, 0xfe, 0x66, 0x97, 0x00, 0x27, 0xd5, 0xfe, 0xbe, - 0xfe, 0xfe, 0xf5, 0x3c, 0xfe, 0xca, 0x81, 0xfe, 0x7d, 0xef, 0xfe, 0x62, 0xad, 0xfe, 0xa6, 0x32, - 0x00, 0xca, 0x39, 0x01, 0x91, 0x2e, 0x01, 0xb7, 0x20, 0x01, 0xf0, 0x30, 0x01, 0x8e, 0x31, 0x00, - 0xf8, 0xb8, 0xff, 0x3a, 0x3e, 0xff, 0xe1, 0x66, 0x16, 0x7e, 0xad, 0x1a, 0x89, 0x40, 0x04, 0xc9, - 0x88, 0x06, 0xd9, 0xdb, 0x0b, 0x5b, 0x3e, 0xff, 0xcd, 0xe0, 0xf4, 0xc2, 0x92, 0x03, 0xfa, 0x19, - 0x09, 0x94, 0xb7, 0xfa, 0x13, 0x07, 0xfc, 0x20, 0xbd, 0x01, 0xb2, 0x60, 0xff, 0x35, 0xbf, 0xff, - 0xb5, 0x9a, 0x01, 0x6a, 0x89, 0xfe, 0x40, 0x62, 0xfe, 0xdc, 0xa3, 0x00, 0x97, 0x0e, 0xff, 0x34, - 0xa3, 0xfe, 0x68, 0xe2, 0xfd, 0x59, 0x63, 0xfe, 0x48, 0x9b, 0xfe, 0x98, 0x3c, 0xfe, 0xe8, 0xc2, - 0xff, 0xcc, 0x4f, 0x00, 0x19, 0x64, 0x00, 0xbc, 0x62, 0x00, 0x20, 0x72, 0x00, 0x21, 0x38, 0x00, - 0x89, 0x99, 0x00, 0x42, 0x16, 0x00, 0x2f, 0x07, 0x18, 0x51, 0x0b, 0x1d, 0xe8, 0xe1, 0x04, 0x8b, - 0xa2, 0x06, 0x64, 0x7e, 0x0c, 0xe4, 0xae, 0xfe, 0x72, 0xd5, 0xf2, 0x9c, 0x04, 0x05, 0x66, 0x26, - 0x0a, 0xfb, 0xad, 0xf8, 0xec, 0x00, 0xfc, 0xeb, 0x2c, 0x02, 0x4a, 0x11, 0xff, 0xe5, 0x85, 0xff, - 0x19, 0x3f, 0x01, 0x91, 0xdf, 0xfe, 0x6a, 0x4d, 0xfe, 0x45, 0x00, 0x00, 0x49, 0x38, 0xff, 0x54, - 0x7d, 0xfe, 0x9c, 0xb8, 0xfd, 0x23, 0x8a, 0xfe, 0x05, 0x35, 0xfe, 0x06, 0xce, 0xfd, 0xb7, 0x60, - 0xff, 0x92, 0x04, 0x00, 0x7d, 0x51, 0x00, 0xc9, 0xa7, 0xff, 0x5a, 0x71, 0xff, 0x6f, 0x56, 0xff, - 0x06, 0x0b, 0x00, 0x08, 0x87, 0x00, 0x3a, 0xac, 0x1a, 0x50, 0x02, 0x20, 0x98, 0x81, 0x03, 0x2e, - 0x33, 0x07, 0xbb, 0x27, 0x0d, 0x52, 0xdd, 0xfc, 0x56, 0xc4, 0xf2, 0xb4, 0xf5, 0x05, 0xe8, 0xbc, - 0x09, 0xb5, 0x8b, 0xf7, 0x6e, 0x2e, 0xfc, 0x79, 0x6a, 0x02, 0x1d, 0xc5, 0xfe, 0xca, 0x07, 0xff, - 0xdc, 0x34, 0x01, 0x46, 0x44, 0xff, 0x25, 0xda, 0xfd, 0x3f, 0x82, 0xff, 0x32, 0x4f, 0xff, 0x5c, - 0x63, 0xfe, 0xe1, 0x7e, 0xfd, 0xb5, 0x81, 0xfe, 0xd8, 0xd0, 0xfd, 0x58, 0x86, 0xfd, 0xa6, 0x9b, - 0xff, 0x06, 0xa3, 0xff, 0xf8, 0xf0, 0xff, 0x33, 0x4c, 0xff, 0x84, 0xc7, 0xfe, 0xcd, 0x0b, 0xff, - 0x1d, 0x7d, 0xff, 0xf7, 0x62, 0xff, 0xbb, 0xa9, 0x1c, 0xc5, 0x37, 0x22, 0x83, 0x52, 0x03, 0x7c, - 0x1e, 0x08, 0x11, 0x8c, 0x0d, 0x8a, 0x84, 0xfb, 0xc5, 0x44, 0xf2, 0xf3, 0x4a, 0x06, 0x5f, 0x2b, - 0x0a, 0xa4, 0x8b, 0xf6, 0xb9, 0xab, 0xfb, 0xba, 0xca, 0x02, 0x56, 0x9e, 0xfe, 0x7f, 0xa1, 0xfe, - 0x87, 0x34, 0x01, 0x59, 0x7b, 0xff, 0xc5, 0x55, 0xfd, 0x13, 0x10, 0xff, 0xe6, 0x7f, 0xff, 0x07, - 0x89, 0xfe, 0x15, 0xef, 0xfc, 0x16, 0xf1, 0xfd, 0x2f, 0xf2, 0xfd, 0x47, 0x7d, 0xfd, 0x70, 0x72, - 0xff, 0x6b, 0x8b, 0xff, 0x43, 0x4f, 0xff, 0x82, 0x20, 0xff, 0x24, 0xbc, 0xfe, 0x61, 0x92, 0xfe, - 0xdd, 0x06, 0xff, 0xd2, 0xd3, 0xfe, 0x5e, 0x96, 0x1d, 0xb6, 0xce, 0x23, 0x94, 0x33, 0x04, 0xe0, - 0xb3, 0x09, 0x71, 0x05, 0x0e, 0x16, 0x23, 0xfa, 0xc4, 0xe4, 0xf1, 0xad, 0x22, 0x06, 0xb0, 0x9e, - 0x0a, 0xcd, 0x55, 0xf6, 0x7b, 0x8d, 0xfa, 0x8c, 0xe7, 0x02, 0x09, 0x0f, 0xff, 0x68, 0x55, 0xfe, - 0x58, 0x92, 0x00, 0x15, 0xe3, 0xff, 0x8e, 0x4e, 0xfd, 0xd1, 0x63, 0xfe, 0x16, 0xce, 0xff, 0x40, - 0x1e, 0xfe, 0xb1, 0x64, 0xfc, 0x17, 0x03, 0xfe, 0x51, 0xf1, 0xfd, 0x72, 0x6e, 0xfd, 0x3e, 0xb8, - 0xfe, 0x41, 0x14, 0xff, 0xcb, 0xff, 0xff, 0x69, 0x0e, 0xff, 0x8a, 0x12, 0xfe, 0x21, 0x2e, 0xfe, - 0x57, 0x06, 0xff, 0xcd, 0x94, 0xfe, 0x77, 0x5b, 0x1e, 0x94, 0x13, 0x25, 0x27, 0xfe, 0x05, 0xa9, - 0x72, 0x0a, 0xb0, 0x7b, 0x0d, 0x83, 0xdf, 0xfa, 0x51, 0xfb, 0xf1, 0x96, 0x5c, 0x04, 0xfc, 0xdc, - 0x0a, 0xcd, 0xcc, 0xf6, 0x0f, 0x49, 0xf9, 0xe0, 0x72, 0x03, 0x36, 0x55, 0xff, 0xcf, 0x75, 0xfd, - 0x38, 0x62, 0x00, 0x94, 0xf1, 0xff, 0xd0, 0x41, 0xfe, 0xef, 0xe6, 0xfd, 0xc7, 0x7b, 0xfe, 0x53, - 0x74, 0xfe, 0x20, 0x3f, 0xfc, 0x61, 0xaa, 0xfd, 0x2d, 0x0f, 0xfe, 0x01, 0x08, 0xfd, 0xca, 0x1f, - 0xfe, 0x7a, 0x23, 0xff, 0x2b, 0x12, 0x00, 0x65, 0x23, 0xff, 0xbb, 0xfd, 0xfd, 0xfe, 0xf3, 0xfd, - 0x84, 0x59, 0xfe, 0xd8, 0xbb, 0xfd, 0xef, 0x54, 0x1f, 0x68, 0x45, 0x25, 0x47, 0x5a, 0x08, 0x28, - 0x5b, 0x0b, 0xec, 0xe8, 0x0b, 0x3d, 0x43, 0xfd, 0x0f, 0x67, 0xf2, 0xf0, 0xa9, 0x01, 0x99, 0x60, - 0x0a, 0x9f, 0xf7, 0xf7, 0x9c, 0xea, 0xf8, 0x3d, 0xb6, 0x02, 0x06, 0xdc, 0xff, 0xc4, 0xfc, 0xfc, - 0xc9, 0x9b, 0xff, 0x16, 0xb8, 0x00, 0x22, 0x09, 0xff, 0x43, 0x06, 0xfd, 0x25, 0x9e, 0xfd, 0x0e, - 0xba, 0xfe, 0x5e, 0x18, 0xfc, 0x55, 0x55, 0xfd, 0x26, 0x16, 0xfd, 0xb6, 0x1e, 0xfd, 0xf8, 0xb2, - 0xfe, 0xcb, 0x68, 0xfe, 0xc5, 0xdf, 0xff, 0x10, 0x81, 0xff, 0x73, 0x2c, 0xfe, 0x9b, 0x25, 0xfd, - 0xa1, 0x9f, 0xfd, 0xcb, 0xb6, 0xfd, 0x5f, 0xd4, 0x20, 0x95, 0x96, 0x23, 0x36, 0xcc, 0x09, 0x05, - 0xc7, 0x0e, 0xdc, 0xfe, 0x0a, 0xae, 0xbc, 0xfd, 0xba, 0x63, 0xf2, 0x37, 0x05, 0x01, 0xe5, 0xa3, - 0x08, 0xc9, 0x59, 0xf8, 0x42, 0x09, 0xfa, 0x79, 0xad, 0x00, 0xaf, 0xc0, 0xff, 0xbb, 0x01, 0xfe, - 0x3b, 0x77, 0xfe, 0xd7, 0x7f, 0x00, 0x90, 0x07, 0x00, 0x4e, 0x7d, 0xfc, 0xea, 0xf6, 0xfc, 0x0d, - 0x3d, 0xff, 0xb8, 0x23, 0xfb, 0x28, 0x4c, 0xfc, 0x67, 0xbf, 0xfc, 0x3b, 0x50, 0xfd, 0x48, 0xad, - 0xfe, 0xd0, 0xf4, 0xfd, 0xc5, 0xa1, 0xff, 0x18, 0xe6, 0xff, 0x21, 0xac, 0xfd, 0x61, 0x61, 0xfc, - 0x15, 0xdc, 0xfd, 0xb8, 0x88, 0xfc, 0xef, 0x5f, 0x22, 0x77, 0x79, 0x20, 0xd5, 0x80, 0x09, 0x74, - 0xa5, 0x15, 0xcb, 0xf0, 0x0c, 0x47, 0x9c, 0xfa, 0x29, 0xcf, 0xf1, 0x9d, 0xfb, 0x04, 0x4c, 0x92, - 0x05, 0x9b, 0x35, 0xf6, 0x4d, 0xe3, 0xfd, 0x65, 0xe3, 0xfe, 0x4e, 0x3a, 0xfe, 0xc4, 0x8d, 0x00, - 0xb1, 0x1f, 0xfd, 0x17, 0x90, 0xff, 0xf8, 0xdd, 0x01, 0xd9, 0x66, 0xfc, 0xa8, 0xdb, 0xfc, 0xf7, - 0x7d, 0xff, 0x01, 0x12, 0xfa, 0x66, 0x00, 0xfc, 0x70, 0x95, 0xfc, 0xa7, 0xca, 0xfc, 0xbd, 0xfb, - 0xfe, 0xc5, 0xc4, 0xfd, 0x94, 0xb2, 0xff, 0x78, 0x22, 0xff, 0xa2, 0x29, 0xfe, 0x2c, 0x98, 0xfc, - 0x9e, 0xcf, 0xfc, 0x3d, 0xc5, 0xfc, 0x72, 0xf6, 0x25, 0x99, 0x52, 0x1e, 0xd0, 0x2d, 0x05, 0xde, - 0x9a, 0x1c, 0x99, 0xa7, 0x0f, 0x26, 0x57, 0xf5, 0xdd, 0x8c, 0xf3, 0x03, 0x79, 0x09, 0x69, 0xef, - 0xff, 0xa6, 0xc0, 0xf3, 0xc1, 0xd3, 0x02, 0x21, 0x31, 0xfe, 0x23, 0x21, 0xfb, 0xec, 0xdc, 0x01, - 0xa4, 0x58, 0xfd, 0x6f, 0x5a, 0xfe, 0xab, 0x33, 0x03, 0xeb, 0x40, 0xfc, 0x48, 0x66, 0xfc, 0xc5, - 0xa8, 0xff, 0x5b, 0xee, 0xf9, 0x4d, 0x74, 0xfb, 0x50, 0x32, 0xfb, 0x1f, 0xb8, 0xfc, 0x2f, 0xa3, - 0xff, 0x34, 0x19, 0xfd, 0x42, 0xae, 0xfe, 0xd3, 0x66, 0xff, 0x31, 0xec, 0xfd, 0xbd, 0x80, 0xfc, - 0x8c, 0x66, 0xfd, 0xb6, 0x0b, 0xfc, 0x46, 0x76, 0x2a, 0x99, 0x2e, 0x1e, 0xa8, 0xe9, 0xfe, 0xa4, - 0x56, 0x20, 0x0f, 0x62, 0x14, 0xd0, 0x25, 0xf1, 0xc3, 0xbd, 0xf4, 0xd5, 0x82, 0x0e, 0x03, 0x78, - 0xfa, 0x46, 0x44, 0xf0, 0x9b, 0x05, 0x08, 0xb4, 0x28, 0xff, 0xc1, 0x53, 0xf7, 0x6c, 0x00, 0x02, - 0x81, 0x46, 0xff, 0xf8, 0xa3, 0xfc, 0xe7, 0xf7, 0x03, 0x98, 0x07, 0xfd, 0x96, 0x98, 0xfb, 0x9b, - 0x18, 0x00, 0x61, 0x24, 0xfa, 0x9f, 0x97, 0xfa, 0x67, 0x5d, 0xfa, 0x9f, 0x02, 0xfd, 0x7a, 0x56, - 0xff, 0x0e, 0x46, 0xfc, 0x9b, 0x0f, 0xfe, 0x6c, 0x9b, 0xff, 0x5d, 0xd4, 0xfd, 0xc5, 0xd8, 0xfc, - 0xc6, 0x96, 0xfd, 0xa2, 0x78, 0xfb, 0xf5, 0x3c, 0x2e, 0x11, 0x98, 0x20, 0xf6, 0xac, 0xf7, 0xf4, - 0x8b, 0x20, 0x6e, 0x3d, 0x1b, 0xf2, 0xcd, 0xee, 0xcb, 0x7e, 0xf4, 0x1e, 0xdc, 0x13, 0x02, 0xaa, - 0xf6, 0x77, 0xdf, 0xea, 0xd4, 0x70, 0x0c, 0x21, 0x79, 0x02, 0x50, 0x0a, 0xf4, 0x56, 0xcc, 0xff, - 0x3e, 0xf2, 0x01, 0x27, 0x21, 0xfc, 0x09, 0x81, 0x03, 0x9d, 0xb0, 0xfe, 0x6d, 0xa3, 0xfa, 0x00, - 0x79, 0x00, 0xa5, 0x4c, 0xfa, 0x05, 0xa5, 0xfa, 0xfe, 0xf9, 0xf9, 0x67, 0xe6, 0xfb, 0x03, 0x24, - 0xff, 0xb1, 0xfc, 0xfb, 0x0a, 0x7d, 0xfd, 0x57, 0x4b, 0xff, 0xb7, 0x97, 0xfe, 0xe9, 0x9c, 0xfc, - 0x7f, 0x0a, 0xfe, 0x5f, 0xe9, 0xfb, 0x78, 0x1d, 0x32, 0x10, 0x5e, 0x23, 0x89, 0x1f, 0xf1, 0x56, - 0xe7, 0x1d, 0x36, 0xa3, 0x21, 0x16, 0x66, 0xee, 0x85, 0x85, 0xf3, 0x4a, 0x10, 0x19, 0xdb, 0xdb, - 0xf3, 0x9f, 0x71, 0xe4, 0x76, 0xfe, 0x0e, 0xec, 0x24, 0x07, 0x47, 0x30, 0xf2, 0xd1, 0xe9, 0xfb, - 0x48, 0x49, 0x03, 0x97, 0x41, 0xfd, 0x67, 0x69, 0x02, 0xe6, 0x03, 0x00, 0xcf, 0x43, 0xfa, 0xbe, - 0xcb, 0xff, 0x41, 0x22, 0xfb, 0xdb, 0x6d, 0xfa, 0x64, 0x50, 0xf9, 0xc4, 0x18, 0xfb, 0xa2, 0x29, - 0xfe, 0x76, 0xae, 0xfb, 0x01, 0xbc, 0xfd, 0xe7, 0x9c, 0xfe, 0xcc, 0xaa, 0xfe, 0x36, 0xd8, 0xfc, - 0xa3, 0xa1, 0xfe, 0x89, 0x85, 0xfc, 0xad, 0x71, 0x37, 0x2c, 0xc6, 0x24, 0x35, 0xb4, 0xeb, 0x21, - 0xc8, 0x1a, 0xf6, 0x63, 0x25, 0x1c, 0x54, 0xef, 0xd5, 0xa8, 0xf3, 0x9f, 0x37, 0x1e, 0xc7, 0xd1, - 0xf0, 0xf6, 0xf1, 0xde, 0x47, 0x9b, 0x0f, 0x2e, 0xe4, 0x0b, 0xf0, 0x84, 0xf2, 0x2c, 0xb2, 0xf7, - 0x08, 0xd8, 0x02, 0x5a, 0x38, 0xff, 0x6a, 0x2c, 0x02, 0x3b, 0x71, 0x00, 0x5e, 0xcd, 0xfa, 0xf9, - 0xc1, 0xfe, 0xcc, 0xee, 0xfb, 0xf1, 0xe0, 0xf9, 0xb1, 0xea, 0xf8, 0xfe, 0x98, 0xfa, 0x06, 0x12, - 0xfd, 0x19, 0xc4, 0xfb, 0xe8, 0xa4, 0xfd, 0x3c, 0xac, 0xfe, 0x69, 0x2c, 0xfe, 0x93, 0x78, 0xfd, - 0x6f, 0x39, 0xff, 0x3c, 0x88, 0xfc, 0xe9, 0x2d, 0x3d, 0x16, 0xd4, 0x25, 0x3c, 0xbe, 0xe6, 0x38, - 0x47, 0x18, 0xe4, 0x2d, 0x26, 0x97, 0xe6, 0xf0, 0x7f, 0x49, 0xf5, 0xee, 0x08, 0x23, 0x81, 0xfc, - 0xed, 0x73, 0x93, 0xda, 0x71, 0x63, 0x0e, 0x36, 0xb4, 0x0f, 0xe8, 0xf0, 0xf4, 0x2f, 0x05, 0xf4, - 0x59, 0xda, 0x00, 0xb4, 0xb8, 0x00, 0x98, 0x6a, 0x03, 0xd5, 0x28, 0x00, 0xdf, 0xbf, 0xfb, 0x79, - 0x24, 0xfe, 0x25, 0x41, 0xfb, 0x7e, 0x49, 0xfa, 0xe6, 0x51, 0xf8, 0xd5, 0xfa, 0xf9, 0x5a, 0x08, - 0xfd, 0x8f, 0x55, 0xfb, 0xca, 0x44, 0xfd, 0x0e, 0x96, 0xff, 0x24, 0xfb, 0xfd, 0xd0, 0x36, 0xfd, - 0x7e, 0xac, 0xff, 0x07, 0xb3, 0xfc, 0x1c, 0xcd, 0x44, 0x4b, 0x99, 0x24, 0xd1, 0x22, 0xe2, 0x06, - 0xad, 0x17, 0x1a, 0x38, 0x24, 0xa1, 0x8d, 0xf0, 0x46, 0x89, 0xf9, 0xc3, 0xaa, 0x27, 0xab, 0xa7, - 0xe9, 0x13, 0x23, 0xd8, 0xdc, 0x9d, 0x0c, 0xd2, 0x78, 0x11, 0x6c, 0xf5, 0xf7, 0x52, 0xf1, 0xf1, - 0x83, 0x0a, 0xfe, 0x47, 0xe9, 0x00, 0xad, 0xc1, 0x05, 0x68, 0xcb, 0xff, 0x0b, 0xc4, 0xfc, 0x3a, - 0xf2, 0xfc, 0xf4, 0x15, 0xfa, 0xeb, 0x47, 0xfb, 0x02, 0xef, 0xf6, 0xfd, 0x9a, 0xfa, 0xa4, 0x57, - 0xfc, 0x23, 0xa2, 0xfa, 0xfd, 0xe8, 0xfd, 0x37, 0x33, 0x00, 0xa9, 0xd3, 0xfd, 0x08, 0xa0, 0xfc, - 0x51, 0x84, 0xff, 0x73, 0x0d, 0xfd, 0xf4, 0x08, 0x4c, 0xa4, 0x24, 0x24, 0x06, 0x3d, 0xdd, 0x6c, - 0x5f, 0x18, 0x97, 0xfa, 0x20, 0xf9, 0x47, 0xef, 0x9d, 0x81, 0xfe, 0xba, 0x7a, 0x2c, 0x72, 0x8b, - 0xe6, 0x76, 0xc1, 0xd5, 0xf2, 0xee, 0x0a, 0x61, 0x2f, 0x12, 0x4a, 0xbc, 0xfa, 0x31, 0x9d, 0xf1, - 0x88, 0x52, 0xfb, 0xbc, 0xd4, 0xff, 0x7a, 0x71, 0x08, 0xae, 0x8b, 0x00, 0xcd, 0xfd, 0xfc, 0xa7, - 0xd1, 0xfb, 0x46, 0x6a, 0xf9, 0x71, 0xaf, 0xfb, 0xfa, 0xc5, 0xf6, 0xb7, 0xe9, 0xfa, 0xa0, 0x5d, - 0xfb, 0x66, 0xd0, 0xfa, 0x31, 0x71, 0xfe, 0x16, 0xec, 0x00, 0xbd, 0xb2, 0xfd, 0x8b, 0x82, 0xfb, - 0x22, 0x83, 0xff, 0x26, 0xd6, 0xfd, 0x39, 0x93, 0x54, 0x32, 0xd4, 0x24, 0x12, 0x50, 0xd5, 0xd7, - 0xa8, 0x17, 0x43, 0x43, 0x20, 0x26, 0x82, 0xef, 0x14, 0xb8, 0x00, 0x71, 0x34, 0x2e, 0x67, 0x27, - 0xe6, 0xcd, 0x8a, 0xd4, 0xf3, 0xab, 0x09, 0x1c, 0xda, 0x11, 0x6e, 0x5d, 0xfb, 0xf5, 0x95, 0xf2, - 0x00, 0xef, 0xf9, 0x92, 0xd1, 0xfd, 0xfb, 0xe2, 0x0a, 0x38, 0xd0, 0x01, 0x72, 0x46, 0xfb, 0x08, - 0xfe, 0xfb, 0xd5, 0x54, 0xf9, 0x3e, 0x13, 0xfb, 0xe7, 0x35, 0xf7, 0x67, 0x64, 0xfa, 0x6b, 0x85, - 0xfb, 0xfc, 0x4a, 0xfb, 0xa8, 0x3c, 0xfe, 0x68, 0x91, 0x01, 0x9a, 0x64, 0xfd, 0x55, 0x8c, 0xfa, - 0x64, 0xc4, 0xff, 0xeb, 0x8f, 0xfe, 0xe7, 0x42, 0x5c, 0x40, 0xb0, 0x26, 0xd2, 0x1a, 0xcd, 0x09, - 0x58, 0x17, 0xd3, 0x8f, 0x1f, 0x29, 0x7e, 0xef, 0x60, 0x8d, 0x01, 0xc5, 0x8e, 0x2f, 0x1a, 0x36, - 0xe8, 0x24, 0x5e, 0xd2, 0x54, 0xd3, 0x08, 0xe7, 0xd9, 0x11, 0xb9, 0x7d, 0xfa, 0x87, 0x0e, 0xf4, - 0x5c, 0x2c, 0xfa, 0xf6, 0xbc, 0xfa, 0x1f, 0x8a, 0x0c, 0x51, 0xbd, 0x03, 0x57, 0xe0, 0xf8, 0x63, - 0x3e, 0xfd, 0x88, 0x5d, 0xf9, 0x2b, 0x2f, 0xfa, 0xf7, 0xef, 0xf7, 0x15, 0x00, 0xfa, 0xb1, 0xf4, - 0xfb, 0xa3, 0xa1, 0xfb, 0x8e, 0x39, 0xfe, 0x1a, 0x9e, 0x01, 0x51, 0x09, 0xfd, 0x59, 0x24, 0xfa, - 0x12, 0x68, 0x00, 0x83, 0xa4, 0xfe, 0xc2, 0xa3, 0x63, 0x48, 0x96, 0x27, 0xc9, 0xce, 0xc6, 0x1f, - 0x76, 0x17, 0xa0, 0x53, 0x1e, 0xd8, 0xa7, 0xee, 0x60, 0x52, 0x01, 0x33, 0x0b, 0x31, 0x2c, 0xd7, - 0xeb, 0x80, 0xcc, 0xcf, 0xf9, 0xd7, 0x07, 0xf6, 0x20, 0x12, 0x93, 0x02, 0xf9, 0x4a, 0xc1, 0xf5, - 0x6a, 0x40, 0xfb, 0x98, 0x4d, 0xf7, 0x99, 0x09, 0x0d, 0x05, 0xbc, 0x05, 0xa0, 0x49, 0xf7, 0xb5, - 0x95, 0xfe, 0xef, 0x40, 0xf9, 0x7b, 0x82, 0xf9, 0x57, 0x03, 0xf9, 0xb5, 0xa4, 0xf9, 0x4a, 0xfd, - 0xfb, 0x99, 0x3d, 0xfc, 0x8d, 0x19, 0xfe, 0x5e, 0x6b, 0x01, 0xae, 0x98, 0xfc, 0x16, 0x03, 0xfa, - 0xa9, 0x82, 0x01, 0x28, 0xae, 0xfd, 0x25, 0x04, 0x68, 0x40, 0x9a, 0x2a, 0x9c, 0x09, 0xc2, 0x49, - 0x37, 0x17, 0xaa, 0xa1, 0x1c, 0xdc, 0xab, 0xed, 0x61, 0x78, 0xfe, 0xf9, 0x20, 0x33, 0x53, 0x6f, - 0xf1, 0xdb, 0xa0, 0xcc, 0x84, 0x07, 0x06, 0x56, 0x2b, 0x12, 0xb7, 0x4a, 0xf8, 0xc1, 0xdf, 0xf6, - 0x2a, 0x5b, 0xfc, 0xb7, 0x41, 0xf4, 0x23, 0xc5, 0x0b, 0xc7, 0xb9, 0x07, 0x8f, 0x04, 0xf7, 0x42, - 0xf5, 0xfe, 0xa3, 0xac, 0xf9, 0x2b, 0x51, 0xf9, 0x40, 0xa0, 0xf9, 0xa8, 0x47, 0xf9, 0x3b, 0xeb, - 0xfb, 0x8a, 0xb0, 0xfc, 0xf6, 0xf2, 0xfd, 0x8a, 0xc8, 0x00, 0x29, 0x70, 0xfc, 0x16, 0x2a, 0xfa, - 0x0a, 0xa2, 0x01, 0xde, 0xa3, 0xfc, 0x43, 0x8b, 0x6b, 0xea, 0xdd, 0x2c, 0xda, 0x24, 0xc0, 0x35, - 0x8b, 0x16, 0xff, 0xe9, 0x1a, 0x31, 0x33, 0xec, 0x8b, 0xea, 0xf9, 0xc0, 0xed, 0x35, 0xd9, 0xe7, - 0xf6, 0xb5, 0xbe, 0xca, 0xac, 0xf8, 0x03, 0xb9, 0x0a, 0x11, 0x5b, 0x0a, 0xf9, 0x9d, 0xbc, 0xf7, - 0x6e, 0xba, 0xfc, 0x92, 0x77, 0xf2, 0x59, 0x89, 0x09, 0x0a, 0xca, 0x08, 0x8a, 0x8d, 0xf8, 0x17, - 0x3c, 0xfe, 0x81, 0xc1, 0xfa, 0x18, 0x2e, 0xfa, 0xf2, 0xf0, 0xf8, 0xf3, 0x9b, 0xf9, 0x17, 0xd6, - 0xfb, 0x6b, 0x06, 0xfd, 0x8b, 0xab, 0xfd, 0x5c, 0xd9, 0xff, 0xc0, 0xd7, 0xfc, 0xbe, 0x18, 0xfa, - 0x3c, 0x77, 0x00, 0x8d, 0xad, 0xfc, 0x1b, 0x41, 0x6e, 0x9a, 0xe2, 0x2d, 0x81, 0x5c, 0xc1, 0xe8, - 0x9f, 0x15, 0x1a, 0x74, 0x19, 0xa9, 0x15, 0xea, 0x10, 0x6a, 0xf4, 0x7f, 0xe8, 0x38, 0x85, 0x8d, - 0xfb, 0x64, 0xfa, 0xca, 0x15, 0xb2, 0x01, 0x17, 0x82, 0x0e, 0x3e, 0x43, 0xfb, 0x2c, 0xd6, 0xf8, - 0x3b, 0xc4, 0xfb, 0x02, 0xbc, 0xf1, 0xc0, 0x7a, 0x07, 0x09, 0x58, 0x08, 0xa5, 0xb8, 0xfb, 0x32, - 0x09, 0xfd, 0x2d, 0xd0, 0xfb, 0xf8, 0x47, 0xfc, 0x78, 0x52, 0xf7, 0xb7, 0x93, 0xfa, 0xb8, 0xcd, - 0xfb, 0x10, 0x27, 0xfd, 0xb9, 0xf6, 0xfc, 0x12, 0x70, 0xff, 0xbe, 0xb1, 0xfc, 0xcd, 0x94, 0xf9, - 0x6c, 0xee, 0xff, 0x64, 0x89, 0xfc, 0xaa, 0x36, 0x6e, 0x94, 0x4d, 0x30, 0x65, 0xdb, 0xc4, 0xc5, - 0xb5, 0x14, 0x17, 0xf0, 0x17, 0x3b, 0x08, 0xe7, 0x5f, 0xbb, 0xee, 0x3b, 0xe4, 0x3a, 0x03, 0xbc, - 0x00, 0x28, 0x95, 0xcc, 0xda, 0x97, 0xfe, 0x9e, 0x3a, 0x0b, 0xa4, 0xd9, 0xfe, 0xe6, 0x2b, 0xfa, - 0x70, 0x72, 0xf9, 0x12, 0xcb, 0xf1, 0xe8, 0x57, 0x06, 0x39, 0x23, 0x06, 0x7d, 0xbb, 0xff, 0xc4, - 0x99, 0xfc, 0xd0, 0xc1, 0xfb, 0x17, 0x74, 0xff, 0x7d, 0xfb, 0xf5, 0x2d, 0x46, 0xfb, 0x1a, 0x13, - 0xfc, 0xb2, 0x7a, 0xfc, 0x80, 0xcb, 0xfc, 0x0d, 0x19, 0xfe, 0xa2, 0xb6, 0xfb, 0x13, 0xd4, 0xfa, - 0xf5, 0xf7, 0xfe, 0x06, 0xea, 0xfb, 0xf5, 0x1a, 0x6c, 0xdb, 0xbd, 0x33, 0x0a, 0x79, 0xc9, 0x3c, - 0x98, 0x13, 0x96, 0x7d, 0x16, 0xd4, 0x8e, 0xe4, 0xca, 0x2e, 0xe9, 0x21, 0x4b, 0x39, 0x21, 0xda, - 0x06, 0x11, 0xc7, 0xcf, 0x25, 0x1c, 0xfb, 0xb4, 0x82, 0x07, 0x1d, 0x7d, 0x02, 0x99, 0x7e, 0xfb, - 0xa3, 0xa2, 0xf6, 0xbc, 0xcb, 0xf2, 0x02, 0x91, 0x05, 0xc4, 0x9a, 0x02, 0x16, 0x0d, 0x03, 0xb2, - 0x69, 0xfe, 0x41, 0x2d, 0xfa, 0xb6, 0x7d, 0x02, 0x8c, 0x5a, 0xf6, 0xd7, 0x9b, 0xfa, 0x2e, 0xe1, - 0xfc, 0xbb, 0x11, 0xfc, 0x21, 0x9a, 0xfa, 0xc6, 0x7c, 0xfc, 0x96, 0x38, 0xfc, 0x9b, 0x4c, 0xfb, - 0xeb, 0xc1, 0xfe, 0x60, 0x8a, 0xfb, 0x7d, 0x1c, 0x68, 0x92, 0xe9, 0x36, 0x45, 0x0f, 0xd0, 0xd5, - 0x2f, 0x14, 0xdd, 0xe1, 0x13, 0x4f, 0xf2, 0xe1, 0x83, 0x2f, 0xe4, 0xbc, 0x3d, 0x35, 0x9d, 0x5e, - 0x0e, 0x98, 0x3f, 0xd3, 0xab, 0x39, 0xf7, 0x48, 0x76, 0x04, 0x8a, 0x4d, 0x05, 0xa0, 0x19, 0xfd, - 0xff, 0x94, 0xf4, 0xe9, 0xca, 0xf3, 0x65, 0xf9, 0x04, 0x58, 0x2b, 0xff, 0xb6, 0x8e, 0x04, 0xf9, - 0x45, 0x02, 0xa0, 0x78, 0xf8, 0xcb, 0xf2, 0x03, 0x62, 0xf0, 0xf8, 0x69, 0x39, 0xf9, 0x1e, 0xd5, - 0xfd, 0xed, 0x1e, 0xfa, 0x34, 0x69, 0xf8, 0xfd, 0x8b, 0xfc, 0x49, 0x40, 0xfb, 0xaf, 0x8a, 0xfc, - 0xc3, 0x8b, 0xff, 0xb9, 0x07, 0xfb, 0xa5, 0x83, 0x63, 0xd4, 0xa9, 0x3a, 0x65, 0x6b, 0xd6, 0xa4, - 0x96, 0x13, 0xbc, 0x8c, 0x11, 0x7e, 0x93, 0xe3, 0x75, 0x75, 0xde, 0xf2, 0x74, 0x2c, 0x65, 0x51, - 0x17, 0x48, 0x10, 0xd7, 0x70, 0x59, 0xf4, 0x2b, 0xbd, 0x02, 0x2a, 0xf1, 0x04, 0xfd, 0x87, 0xff, - 0xee, 0x9b, 0xf4, 0x4a, 0x18, 0xf4, 0x72, 0xcf, 0x04, 0x1e, 0xea, 0xfb, 0x2d, 0x6a, 0x04, 0xe7, - 0x9f, 0x06, 0xb7, 0xc8, 0xf8, 0xc7, 0x07, 0x03, 0xbd, 0x5b, 0xfc, 0x9b, 0x04, 0xf9, 0x31, 0x57, - 0xfb, 0xd7, 0x90, 0xfa, 0x5c, 0x29, 0xf7, 0x32, 0x42, 0xfb, 0x58, 0x12, 0xfb, 0xd9, 0xec, 0xfd, - 0xb0, 0xf6, 0x00, 0xd7, 0xc1, 0xfa, 0xfb, 0x79, 0x5f, 0x07, 0x1a, 0x3e, 0x2d, 0xfc, 0xda, 0x22, - 0xdc, 0x13, 0x5d, 0x55, 0x0e, 0x5d, 0x4a, 0xe6, 0xd2, 0x8d, 0xdb, 0x47, 0x94, 0x1f, 0xd0, 0x06, - 0x1f, 0x23, 0x5d, 0xdc, 0x44, 0x81, 0xf1, 0x26, 0x25, 0x02, 0xaf, 0x1d, 0x03, 0x0e, 0xe9, 0x00, - 0x9a, 0x03, 0xf7, 0x64, 0x1a, 0xf4, 0x01, 0xd3, 0x03, 0x14, 0x85, 0xfa, 0xa1, 0x95, 0x02, 0x50, - 0x99, 0x09, 0x07, 0x7e, 0xfa, 0x2f, 0x3e, 0x02, 0xf3, 0xae, 0xfd, 0x70, 0x79, 0xf8, 0x43, 0xd7, - 0xf9, 0x6c, 0x60, 0xfb, 0xe0, 0xd5, 0xf6, 0x5e, 0x07, 0xfa, 0xc6, 0xf1, 0xfa, 0x52, 0xec, 0xfe, - 0x37, 0xfd, 0x01, 0xcc, 0x96, 0xfa, 0x73, 0xf0, 0x5c, 0x52, 0x1e, 0x3f, 0x14, 0xef, 0xde, 0xd7, - 0x19, 0x16, 0x29, 0xcd, 0x0a, 0x15, 0x31, 0xe7, 0xb7, 0xb2, 0xdb, 0x2a, 0x14, 0x13, 0xe7, 0xec, - 0x22, 0x6f, 0x8f, 0xe3, 0x5d, 0x3a, 0xee, 0x1b, 0x49, 0x02, 0xa4, 0x4a, 0x02, 0x92, 0xf3, 0xff, - 0x7c, 0x8a, 0xfb, 0xae, 0x18, 0xf4, 0xa6, 0x4e, 0x02, 0x0c, 0x72, 0xfb, 0x9a, 0xd4, 0xfe, 0xdc, - 0x0b, 0x0b, 0x0a, 0x6c, 0xfd, 0x13, 0xa4, 0x00, 0x8e, 0x48, 0xfd, 0xc9, 0x9b, 0xf9, 0x09, 0x21, - 0xf9, 0x5c, 0xa0, 0xfc, 0x3e, 0xb3, 0xf7, 0x05, 0xce, 0xf8, 0x43, 0xc2, 0xfb, 0xcf, 0xb0, 0xfd, - 0x07, 0xd3, 0x01, 0x80, 0xd8, 0xfb, 0x56, 0x8d, 0x5a, 0x03, 0x2d, 0x40, 0x1c, 0xc7, 0xe1, 0xd6, - 0x0f, 0x19, 0x60, 0xb7, 0x08, 0xb9, 0xa0, 0xe5, 0x82, 0xfa, 0xde, 0xa3, 0x6c, 0x07, 0x7b, 0xe6, - 0x22, 0xa4, 0x77, 0xed, 0x75, 0x03, 0xea, 0xa0, 0x3b, 0x02, 0x66, 0x88, 0x04, 0x53, 0xae, 0xfc, - 0x82, 0x45, 0x00, 0x7e, 0x36, 0xf6, 0x31, 0xbc, 0xff, 0x98, 0xdb, 0xfd, 0x78, 0x5a, 0xfa, 0x54, - 0x18, 0x0a, 0xeb, 0xf7, 0x00, 0x47, 0x53, 0xfe, 0xc0, 0x91, 0xfd, 0x32, 0xc9, 0xfb, 0x48, 0xc0, - 0xf9, 0xca, 0x88, 0xfd, 0x85, 0xfe, 0xf9, 0x85, 0xf7, 0xf8, 0xa4, 0x0a, 0xfa, 0x33, 0xa3, 0xfb, - 0xa4, 0x49, 0x02, 0x09, 0xa1, 0xfd, 0x56, 0x0f, 0x56, 0x48, 0xd2, 0x41, 0x22, 0x6e, 0xe6, 0xe8, - 0xc3, 0x18, 0xf5, 0x8a, 0x07, 0x3a, 0x9b, 0xe6, 0x63, 0xf9, 0xe0, 0xea, 0xe5, 0xfb, 0xaa, 0x22, - 0x22, 0x1a, 0xc1, 0xf6, 0x65, 0x25, 0xe6, 0x8d, 0x25, 0x02, 0x03, 0x6c, 0x07, 0x41, 0x3f, 0xf9, - 0x49, 0x13, 0x04, 0x98, 0xb0, 0xf9, 0x1b, 0xc4, 0xfb, 0xc4, 0x56, 0x00, 0x90, 0xa5, 0xf7, 0xe5, - 0x5a, 0x04, 0x17, 0x33, 0x04, 0x06, 0xe1, 0xfe, 0xf3, 0xd9, 0xfc, 0xad, 0xe6, 0xfe, 0x47, 0xec, - 0xfa, 0xc2, 0x25, 0xff, 0x52, 0xb9, 0xfb, 0xee, 0x79, 0xf8, 0xaa, 0xf4, 0xf8, 0x25, 0x69, 0xf9, - 0xe3, 0x9a, 0x00, 0xe2, 0x1e, 0xff, 0x29, 0x04, 0x53, 0x5e, 0xd8, 0x40, 0x95, 0x9b, 0xeb, 0x73, - 0xbe, 0x17, 0x16, 0x2b, 0x05, 0x23, 0x04, 0xea, 0x46, 0xd9, 0xe0, 0x15, 0x28, 0xf3, 0x3e, 0x4d, - 0x20, 0x02, 0x1c, 0xfd, 0x61, 0x2a, 0xe5, 0xe6, 0xc5, 0x01, 0x88, 0xf0, 0x08, 0x96, 0x4e, 0xf8, - 0x41, 0x31, 0x07, 0x66, 0x51, 0xf9, 0x0e, 0x1b, 0xfa, 0x90, 0xca, 0x02, 0x40, 0x52, 0xf4, 0xb7, - 0x9f, 0xff, 0x3f, 0x2a, 0x04, 0x3e, 0x5f, 0x01, 0xff, 0x98, 0xfd, 0xad, 0x74, 0x01, 0xe2, 0xbb, - 0xfc, 0x14, 0x2b, 0xff, 0x3c, 0x9d, 0xfd, 0x03, 0x7c, 0xf8, 0x19, 0xd2, 0xf8, 0xf2, 0x64, 0xf6, - 0x41, 0x61, 0xfd, 0x21, 0xfb, 0xff, 0x8c, 0x43, 0x52, 0x5c, 0x7f, 0x3d, 0xec, 0x38, 0xef, 0x1e, - 0x43, 0x19, 0x7e, 0xa7, 0x01, 0x16, 0x79, 0xed, 0x8c, 0x9c, 0xe2, 0xd9, 0xc2, 0xeb, 0x64, 0x63, - 0x1d, 0x93, 0xef, 0x03, 0x52, 0x70, 0xe4, 0xdc, 0x07, 0x01, 0x12, 0x9c, 0x0d, 0xe9, 0x64, 0xf6, - 0x51, 0x79, 0x07, 0xd6, 0x1e, 0xfa, 0x23, 0x75, 0xf8, 0x87, 0x4e, 0x04, 0xec, 0x35, 0xf3, 0x9b, - 0x01, 0xfe, 0x09, 0x28, 0x01, 0x27, 0x6c, 0x02, 0x2a, 0xd8, 0x03, 0xec, 0x17, 0x01, 0xe7, 0xe1, - 0xfc, 0x64, 0xeb, 0x01, 0xe2, 0x7f, 0xfe, 0x52, 0x9a, 0xf8, 0x4f, 0xd9, 0xf8, 0x66, 0x66, 0xf5, - 0x02, 0xa6, 0xf9, 0xb7, 0xa4, 0xfe, 0x5a, 0x3c, 0x53, 0x42, 0xaa, 0x38, 0xe3, 0x6f, 0xef, 0x61, - 0xc9, 0x1c, 0x41, 0x1d, 0xff, 0xea, 0x0a, 0xee, 0x98, 0xc8, 0xe4, 0xe5, 0x33, 0xe8, 0x81, 0x51, - 0x18, 0xa1, 0x55, 0x09, 0x5f, 0x65, 0xe6, 0x1f, 0xeb, 0xfe, 0x5b, 0xee, 0x11, 0xbf, 0xda, 0xf4, - 0xa4, 0x03, 0x04, 0x99, 0xb1, 0xfc, 0xa8, 0xc5, 0xf6, 0x54, 0xeb, 0x03, 0xdf, 0xd1, 0xf5, 0x70, - 0x83, 0xfb, 0x52, 0xe3, 0x01, 0xfa, 0x7d, 0x00, 0x27, 0xd0, 0x04, 0x43, 0xc6, 0x05, 0xd1, 0x8e, - 0xfb, 0x01, 0x80, 0x03, 0x50, 0x13, 0x00, 0x57, 0x6d, 0xf7, 0x7a, 0x70, 0xf9, 0x47, 0x0c, 0xf6, - 0x8a, 0x9b, 0xf6, 0x40, 0x68, 0xfc, 0xb8, 0xf5, 0x54, 0x83, 0x14, 0x35, 0x54, 0x86, 0xe8, 0x51, - 0xba, 0x24, 0xae, 0x0c, 0x01, 0x10, 0xbf, 0xe6, 0x6a, 0x2a, 0xe9, 0x60, 0xc6, 0xe9, 0x83, 0x24, - 0x12, 0xc3, 0x08, 0x0c, 0xd4, 0x02, 0xeb, 0x9a, 0x10, 0xfc, 0x29, 0x5c, 0x14, 0x4f, 0xed, 0xf3, - 0xc0, 0x08, 0xff, 0xd0, 0x9d, 0x00, 0xd9, 0x56, 0xf6, 0x3d, 0x90, 0x01, 0x1d, 0xed, 0xf9, 0x14, - 0xf2, 0xfc, 0x1d, 0xf0, 0x00, 0x33, 0x01, 0xff, 0x24, 0x09, 0x01, 0x39, 0x5d, 0x0b, 0x87, 0x02, - 0xfe, 0x14, 0x25, 0x00, 0x2d, 0x91, 0x04, 0x6c, 0xf5, 0xf5, 0xec, 0x0f, 0xf8, 0xb3, 0xd1, 0xf9, - 0x7c, 0x38, 0xf5, 0xcb, 0xf8, 0xf8, 0x4a, 0xa8, 0x59, 0xd5, 0xbf, 0x2d, 0xb5, 0x41, 0xde, 0x83, - 0x5a, 0x32, 0xb4, 0xc0, 0x01, 0xfb, 0xe0, 0xd9, 0xb5, 0xf1, 0xef, 0x1b, 0x61, 0xf1, 0x2c, 0x40, - 0x09, 0x17, 0xe2, 0x0b, 0xbe, 0x10, 0xf3, 0xcb, 0xcc, 0xf5, 0xe1, 0x2f, 0x15, 0x19, 0x66, 0xf6, - 0x1d, 0xee, 0xf7, 0x1f, 0xe5, 0x03, 0xd7, 0x4d, 0xf9, 0x00, 0x3b, 0xfe, 0x2e, 0x92, 0xfc, 0x83, - 0x00, 0x01, 0x19, 0x3e, 0xfe, 0x7c, 0xe5, 0xfd, 0xe6, 0xad, 0xff, 0x73, 0x26, 0x09, 0x15, 0x72, - 0x03, 0x79, 0x6c, 0x00, 0xd6, 0x7c, 0x02, 0xcf, 0xd8, 0xf8, 0x6d, 0xf8, 0xf6, 0x25, 0x66, 0xfa, - 0xa8, 0x2a, 0xf7, 0xce, 0xb2, 0xf6, 0xc4, 0x68, 0x5d, 0xe5, 0x14, 0x24, 0x40, 0xea, 0xd9, 0x19, - 0x0e, 0x3d, 0xb7, 0x3b, 0xfd, 0x56, 0x52, 0xd5, 0x41, 0xc1, 0xf6, 0x7b, 0x20, 0xf6, 0x9f, 0xce, - 0x02, 0x3a, 0x58, 0x0a, 0xc9, 0xc3, 0xf8, 0xce, 0x92, 0xf2, 0xdb, 0x49, 0x14, 0x11, 0xe5, 0xf7, - 0x2b, 0x8a, 0xf4, 0xa2, 0x37, 0x05, 0x8d, 0xa9, 0xfd, 0x48, 0xb7, 0xfc, 0x7b, 0xe0, 0xfc, 0x5b, - 0xb3, 0x02, 0xd1, 0xef, 0xfe, 0x40, 0x27, 0xfd, 0x18, 0x08, 0xfd, 0xc5, 0xe3, 0x07, 0xc5, 0xe1, - 0x04, 0x75, 0xa9, 0x02, 0xb1, 0x8e, 0x01, 0xf7, 0x15, 0xfb, 0x50, 0xbd, 0xf7, 0x29, 0x12, 0xf8, - 0x45, 0xf8, 0xf9, 0x7c, 0xf1, 0xf7, 0x8a, 0x34, 0x5e, 0x09, 0x7e, 0x1c, 0xf6, 0x81, 0xd7, 0x3a, - 0x18, 0x44, 0x97, 0x54, 0xfb, 0x1f, 0xcd, 0xd0, 0xa7, 0xa6, 0xfc, 0x0b, 0x54, 0xfe, 0x00, 0x13, - 0xf9, 0xbe, 0x45, 0x06, 0xd3, 0x57, 0x02, 0x21, 0xc4, 0xee, 0x20, 0xb0, 0x0f, 0x14, 0x1b, 0xfd, - 0x1d, 0xf9, 0xf3, 0x17, 0x48, 0x03, 0x06, 0xda, 0x00, 0x6f, 0xee, 0xfd, 0x01, 0xec, 0xfc, 0xd2, - 0x3e, 0x01, 0x79, 0x40, 0xff, 0xda, 0x8a, 0xff, 0xf8, 0x01, 0xfa, 0x68, 0xa3, 0x06, 0x22, 0x02, - 0x06, 0xcb, 0xc8, 0x00, 0xc8, 0x83, 0x04, 0x30, 0x8f, 0xfc, 0x3b, 0xad, 0xf6, 0xe0, 0xbd, 0xf9, - 0x50, 0x05, 0xfa, 0xb7, 0xae, 0xf8, 0x57, 0x73, 0x59, 0x40, 0xa0, 0x17, 0x56, 0xf7, 0xd9, 0xbd, - 0xd9, 0x46, 0x94, 0xc5, 0xfa, 0xdb, 0xd7, 0xcf, 0x41, 0x70, 0x01, 0x18, 0xdf, 0x00, 0xf4, 0xf6, - 0xf2, 0xb5, 0x74, 0x05, 0xef, 0x6c, 0x06, 0xc6, 0x12, 0xec, 0x42, 0x74, 0x0d, 0x45, 0x0b, 0x02, - 0x7c, 0x08, 0xf3, 0x9e, 0xc5, 0x02, 0x04, 0x3e, 0x02, 0xfa, 0x2f, 0xfd, 0x19, 0xcc, 0xfe, 0x05, - 0xea, 0xff, 0x23, 0x4e, 0xfe, 0x51, 0x22, 0x01, 0x89, 0x77, 0xfa, 0x7a, 0x7c, 0x04, 0x2e, 0xf0, - 0x04, 0x59, 0x6b, 0x01, 0x47, 0x54, 0x04, 0x44, 0x1a, 0xfe, 0xeb, 0x49, 0xf7, 0x98, 0x59, 0xfb, - 0xff, 0xe8, 0xfa, 0xaa, 0x24, 0xf7, 0xe5, 0x54, 0x50, 0x16, 0xcd, 0x15, 0xbf, 0xd2, 0xdf, 0x58, - 0x7e, 0x44, 0xf7, 0xf0, 0xfc, 0x2b, 0x00, 0xd3, 0x1e, 0x15, 0x01, 0x96, 0xca, 0x01, 0x8e, 0x2c, - 0xf2, 0x90, 0xac, 0x02, 0xee, 0x94, 0x07, 0x1b, 0x6a, 0xed, 0xfa, 0x54, 0x0b, 0x6e, 0x90, 0x04, - 0xf6, 0x56, 0xf4, 0xb5, 0xcf, 0x01, 0xe8, 0x7a, 0x02, 0x7b, 0x34, 0xfd, 0x34, 0x7b, 0xfe, 0xac, - 0x69, 0x00, 0xe1, 0x37, 0xfe, 0xf8, 0x2a, 0x00, 0x15, 0x77, 0xfc, 0xb6, 0xb8, 0x03, 0xfe, 0x01, - 0x03, 0xa4, 0x21, 0x02, 0xe8, 0x5a, 0x03, 0xb2, 0xde, 0xfd, 0xb7, 0x37, 0xfa, 0x6d, 0x3f, 0xfc, - 0xda, 0x43, 0xfb, 0x14, 0xe4, 0xf7, 0x61, 0x58, 0x46, 0x12, 0xcd, 0x16, 0xa1, 0xf8, 0xe4, 0x07, - 0x12, 0x3e, 0x01, 0xb9, 0x01, 0x17, 0x85, 0xd6, 0x78, 0x31, 0x00, 0x9d, 0xe2, 0x02, 0x17, 0x2f, - 0xf1, 0x81, 0x53, 0x00, 0xe9, 0x2a, 0x09, 0x1a, 0xb6, 0xef, 0xa0, 0x4a, 0x08, 0xe1, 0x8e, 0x07, - 0xb9, 0x1e, 0xf5, 0x98, 0x93, 0xff, 0x5e, 0x45, 0x04, 0x39, 0x46, 0xfd, 0x20, 0xbf, 0xfc, 0x35, - 0x2f, 0x01, 0x7d, 0x01, 0xff, 0x12, 0x37, 0xff, 0x2a, 0x76, 0xfd, 0xe9, 0xef, 0x03, 0x3b, 0xe1, - 0x02, 0xe7, 0xa7, 0x00, 0xe6, 0xba, 0x02, 0x33, 0x20, 0xfe, 0x6e, 0xef, 0xfa, 0xd7, 0x1f, 0xfe, - 0xa7, 0x80, 0xfb, 0x91, 0xce, 0xf8, 0x2c, 0x53, 0x3e, 0x48, 0x8b, 0x1c, 0x63, 0xa5, 0xed, 0xe9, - 0xec, 0x2b, 0x8c, 0x7f, 0xfe, 0x8a, 0x9e, 0xe1, 0x93, 0x02, 0x00, 0xd4, 0x34, 0xfd, 0x1f, 0x59, - 0xfc, 0x94, 0x2b, 0x01, 0xfc, 0xfd, 0xfc, 0xf7, 0x9e, 0xfb, 0xbf, 0x0d, 0x09, 0xd2, 0x28, 0x00, - 0x99, 0x73, 0xf9, 0xcc, 0x99, 0xfe, 0x21, 0x6f, 0x01, 0xf6, 0x1f, 0xfe, 0xd6, 0x84, 0xfa, 0xc2, - 0x4c, 0x00, 0x22, 0xc6, 0x00, 0x45, 0xa4, 0x00, 0x6c, 0x1e, 0x00, 0xa0, 0xb5, 0x00, 0x92, 0x25, - 0x00, 0x26, 0x69, 0x02, 0xcc, 0x92, 0x01, 0x16, 0x75, 0xff, 0x69, 0xeb, 0xff, 0xce, 0x7c, 0xff, - 0xe7, 0xa3, 0xfe, 0xd3, 0x4c, 0xff, 0x32, 0xb9, 0x34, 0xbb, 0x4a, 0x1a, 0x58, 0xc5, 0xf4, 0x78, - 0xfe, 0x28, 0x7e, 0xcd, 0xfe, 0xfc, 0x1e, 0xe6, 0xee, 0x0f, 0x00, 0x25, 0x24, 0xfc, 0xbe, 0x56, - 0xfd, 0xcf, 0x96, 0x01, 0x4c, 0xf9, 0xfc, 0x67, 0xeb, 0xfb, 0xb4, 0x04, 0x09, 0xcf, 0xba, 0x00, - 0x49, 0x92, 0xf9, 0x3b, 0x7b, 0xfe, 0xee, 0xdd, 0x00, 0xe9, 0x5f, 0xfe, 0xb0, 0x5b, 0xfb, 0xdb, - 0x4d, 0x00, 0xb4, 0x2d, 0x00, 0x79, 0x4a, 0x00, 0x03, 0x87, 0x00, 0x2e, 0xd5, 0x00, 0x71, 0xcb, - 0x00, 0x32, 0x6a, 0x02, 0x7d, 0x27, 0x01, 0x96, 0x4f, 0xff, 0xb5, 0x3d, 0x00, 0x2e, 0xcf, 0xff, - 0xf6, 0x28, 0xfe, 0xd7, 0x4f, 0xff, 0xa5, 0xe4, 0x2b, 0xa2, 0xd9, 0x18, 0x6d, 0xba, 0xfb, 0xca, - 0x87, 0x23, 0xf4, 0xd0, 0xff, 0x10, 0x7c, 0xec, 0xe4, 0xff, 0xfd, 0xbf, 0xe1, 0xfa, 0xe2, 0x3f, - 0xff, 0x2d, 0x33, 0x02, 0xf0, 0x3e, 0xfc, 0xf9, 0xba, 0xfc, 0xb2, 0x9e, 0x08, 0x9a, 0xe8, 0x00, - 0xcb, 0x82, 0xfa, 0x69, 0x1a, 0xfe, 0xeb, 0xd5, 0x00, 0x37, 0x6c, 0xfe, 0x7e, 0xd6, 0xfb, 0xc7, - 0x6c, 0x00, 0x05, 0x07, 0x00, 0xf1, 0xf5, 0xff, 0x11, 0x89, 0x00, 0x4b, 0x21, 0x01, 0xd2, 0x6e, - 0x01, 0x93, 0xfa, 0x01, 0x30, 0x52, 0x00, 0xf1, 0xdf, 0xff, 0x34, 0x54, 0x00, 0xbe, 0xa8, 0xff, - 0x7e, 0x2e, 0xff, 0x30, 0xa1, 0xff, 0xbf, 0xd9, 0x24, 0x53, 0x60, 0x18, 0xba, 0x59, 0xff, 0x79, - 0xc4, 0x1d, 0x8d, 0x72, 0x02, 0x3a, 0xc3, 0xf0, 0xf7, 0xaf, 0xfc, 0x1c, 0xff, 0xfa, 0xa2, 0x47, - 0x00, 0xf6, 0x50, 0x02, 0xd2, 0x96, 0xfc, 0x6a, 0x7d, 0xfd, 0x79, 0xf5, 0x06, 0xc7, 0x77, 0x01, - 0x94, 0x9f, 0xfb, 0x84, 0x9d, 0xfd, 0x81, 0x87, 0x00, 0x18, 0xcd, 0xfe, 0xbe, 0x69, 0xfc, 0x51, - 0x52, 0x00, 0x14, 0x1c, 0x00, 0x02, 0xf9, 0xff, 0x14, 0x30, 0x00, 0x55, 0x91, 0x01, 0x5a, 0x07, - 0x02, 0xc2, 0x75, 0x00, 0x51, 0x3f, 0x00, 0x08, 0x3c, 0x01, 0x5e, 0x08, 0x00, 0x57, 0x42, 0xff, - 0xbb, 0x95, 0x00, 0x9e, 0x7f, 0x00, 0xab, 0x59, 0x20, 0x39, 0x04, 0x18, 0x66, 0xce, 0xff, 0xeb, - 0x99, 0x19, 0x38, 0xf4, 0x04, 0xf8, 0x80, 0xf2, 0xbb, 0xe0, 0xfc, 0xf8, 0xe2, 0xfc, 0xa2, 0xfd, - 0xff, 0x7c, 0x9a, 0x01, 0x34, 0x76, 0xfe, 0x97, 0x11, 0xfe, 0xdd, 0x91, 0x04, 0x5d, 0x4d, 0x02, - 0xd0, 0xdb, 0xfc, 0xff, 0xcf, 0xfc, 0x9d, 0x61, 0x00, 0x76, 0xa3, 0xff, 0x11, 0x08, 0xfd, 0x17, - 0xf8, 0xff, 0xc0, 0x7b, 0x00, 0xdf, 0x0a, 0x00, 0xd5, 0x0d, 0x00, 0x3e, 0x4e, 0x02, 0x41, 0x60, - 0x01, 0xf8, 0x12, 0x00, 0x2e, 0x4e, 0x01, 0x70, 0x65, 0x01, 0x6c, 0xf4, 0xff, 0x66, 0x48, 0x00, - 0x81, 0x84, 0x01, 0xa1, 0x31, 0x00, 0x76, 0xca, 0x1d, 0xd2, 0x33, 0x17, 0x70, 0x2f, 0xff, 0x9b, - 0x5f, 0x16, 0x5c, 0xae, 0x05, 0xac, 0x5e, 0xf4, 0x00, 0x60, 0xfe, 0xe8, 0xec, 0xfd, 0x6d, 0x62, - 0xff, 0x68, 0x91, 0x01, 0x5d, 0x39, 0x00, 0xd1, 0xec, 0xfd, 0x8e, 0x2d, 0x03, 0xc4, 0xce, 0x02, - 0x1d, 0xf9, 0xfc, 0xe0, 0x0f, 0xfd, 0x88, 0xbc, 0x00, 0xc1, 0xe5, 0xff, 0xa8, 0x52, 0xfd, 0x33, - 0x47, 0x00, 0x84, 0xc2, 0x00, 0x30, 0x83, 0xff, 0x68, 0x2d, 0x01, 0x88, 0x8f, 0x02, 0x28, 0x8f, - 0x00, 0x0f, 0xb1, 0x00, 0x20, 0xef, 0x01, 0xed, 0xcc, 0x01, 0x17, 0x7b, 0x00, 0xa6, 0x15, 0x01, - 0x58, 0x00, 0x01, 0x96, 0x31, 0xff, 0x26, 0x11, 0x1b, 0xe4, 0xb0, 0x15, 0xbc, 0x2d, 0xff, 0xa8, - 0x1e, 0x14, 0xa4, 0xdf, 0x05, 0x33, 0x56, 0xf6, 0x7d, 0x7a, 0xff, 0xdc, 0x60, 0xfe, 0x29, 0x24, - 0xff, 0x10, 0x00, 0x02, 0x9d, 0x0a, 0x01, 0xb1, 0x8b, 0xfd, 0xbf, 0x5b, 0x02, 0x66, 0x9d, 0x02, - 0xaa, 0xa8, 0xfd, 0x60, 0x9d, 0xfd, 0x3a, 0x89, 0x00, 0x41, 0x00, 0x00, 0x6f, 0xc7, 0xfd, 0xa6, - 0xaa, 0x00, 0xfa, 0x64, 0x00, 0x4e, 0x7c, 0x00, 0xf3, 0x5b, 0x02, 0x50, 0x22, 0x01, 0xd1, 0xd3, - 0x00, 0xbb, 0x2d, 0x02, 0xe9, 0x70, 0x02, 0xac, 0x8d, 0x01, 0x17, 0x49, 0x00, 0x98, 0xbc, 0x00, - 0x88, 0xbc, 0xff, 0x5c, 0xd3, 0xfe, 0x50, 0x2b, 0x18, 0x83, 0x7c, 0x13, 0xc1, 0x0e, 0x00, 0xac, - 0xe9, 0x12, 0x05, 0xce, 0x05, 0x19, 0x26, 0xf8, 0xa4, 0xff, 0xff, 0xaa, 0x2b, 0xff, 0xff, 0xcc, - 0xff, 0x5e, 0xdb, 0x01, 0xb3, 0xbd, 0x00, 0x62, 0xba, 0xfd, 0xde, 0x8b, 0x02, 0x12, 0x4a, 0x02, - 0x37, 0xea, 0xfd, 0xf1, 0x38, 0xfe, 0xbf, 0xa4, 0x00, 0x9e, 0xd2, 0xff, 0x19, 0xa1, 0xfe, 0xf4, - 0x43, 0x01, 0x8f, 0xb8, 0x00, 0xe3, 0xc6, 0x01, 0x1a, 0x08, 0x02, 0x14, 0x42, 0x01, 0x24, 0x2b, - 0x02, 0x82, 0x55, 0x02, 0x19, 0x00, 0x02, 0x86, 0x96, 0x00, 0x81, 0xc4, 0xff, 0x32, 0x1b, 0x00, - 0xd3, 0x64, 0xff, 0x94, 0xd1, 0xfe, 0x5f, 0xca, 0x15, 0x19, 0x71, 0x12, 0xad, 0x8d, 0x00, 0xbc, - 0x3c, 0x10, 0x66, 0xf1, 0x05, 0xd6, 0x69, 0xfa, 0x71, 0xf3, 0x00, 0x37, 0x5e, 0xff, 0x01, 0x78, - 0xff, 0xf2, 0x15, 0x02, 0xbe, 0x30, 0x01, 0x62, 0x20, 0xfe, 0xf9, 0xe2, 0x01, 0x92, 0x02, 0x02, - 0xb5, 0x99, 0xfe, 0x16, 0x9d, 0xfe, 0x5d, 0x91, 0x00, 0x06, 0x8a, 0x00, 0x97, 0x09, 0x00, 0x84, - 0x44, 0x01, 0x5e, 0xcb, 0x01, 0x8c, 0x07, 0x03, 0x17, 0xc7, 0x01, 0xa3, 0xc8, 0x01, 0x66, 0xcd, - 0x01, 0xe8, 0x09, 0x01, 0x53, 0x36, 0x01, 0xd6, 0x1e, 0x00, 0x8f, 0x72, 0xff, 0xd9, 0xc7, 0xff, - 0x3b, 0x64, 0xff, 0xf2, 0x55, 0xfe, 0xcc, 0xe4, 0x12, 0x1b, 0xac, 0x10, 0xe1, 0x78, 0x01, 0x68, - 0x23, 0x0f, 0x35, 0x90, 0x06, 0x71, 0xcf, 0xfb, 0xcb, 0xed, 0x00, 0xdf, 0xca, 0xff, 0x7a, 0x3a, - 0x00, 0xb0, 0x04, 0x02, 0x85, 0xc4, 0x00, 0x3a, 0x88, 0xfe, 0xda, 0xce, 0x01, 0x8d, 0xbe, 0x01, - 0x17, 0x37, 0xff, 0x38, 0x52, 0xff, 0x41, 0x04, 0x01, 0xd7, 0x8d, 0x01, 0xcb, 0x06, 0x01, 0x33, - 0x4b, 0x02, 0x85, 0x14, 0x03, 0xfd, 0xcd, 0x02, 0x1b, 0x11, 0x01, 0xa4, 0x8c, 0x00, 0xe5, 0x89, - 0x00, 0x14, 0xb1, 0x00, 0xa5, 0xda, 0x00, 0x5f, 0x1f, 0x00, 0x2c, 0x2a, 0xff, 0xcc, 0x26, 0xff, - 0x8f, 0x13, 0xff, 0x71, 0x12, 0xfe, 0x90, 0x14, 0x10, 0x14, 0x1b, 0x0f, 0x44, 0xe7, 0x02, 0x6e, - 0xf3, 0x0d, 0x4e, 0x27, 0x06, 0xa3, 0x88, 0xfd, 0xe1, 0xc9, 0x01, 0xba, 0xa1, 0xff, 0x04, 0x60, - 0x00, 0x05, 0x3b, 0x02, 0x5d, 0x84, 0x00, 0x07, 0x9d, 0xfe, 0x79, 0xfd, 0x01, 0xb6, 0x3c, 0x02, - 0xdd, 0xff, 0xff, 0x0f, 0xd3, 0xff, 0xd9, 0x17, 0x02, 0xc3, 0x58, 0x03, 0x53, 0x03, 0x02, 0x39, - 0xbe, 0x02, 0x18, 0x8c, 0x02, 0x1d, 0x80, 0x00, 0x9e, 0xbc, 0xff, 0x39, 0x5e, 0x00, 0x0d, 0x21, - 0x00, 0xeb, 0x8c, 0x00, 0x93, 0x82, 0x00, 0x4f, 0x51, 0xff, 0x88, 0xd5, 0xfe, 0xe6, 0x26, 0xff, - 0x22, 0x96, 0xfe, 0x50, 0x9b, 0xfd, 0x91, 0x90, 0x0e, 0xfd, 0xab, 0x0e, 0x0f, 0xf0, 0x02, 0x0f, - 0xb5, 0x0b, 0x87, 0xd4, 0x06, 0x4e, 0xb7, 0xff, 0x2b, 0x8a, 0x01, 0x1f, 0x82, 0xff, 0x56, 0x9b, - 0x00, 0xed, 0x33, 0x02, 0xd4, 0x45, 0x01, 0x96, 0x94, 0xff, 0x8e, 0x0c, 0x02, 0x5e, 0x8e, 0x02, - 0xd9, 0x8d, 0x01, 0x0d, 0x19, 0x02, 0x62, 0x91, 0x03, 0x86, 0x7e, 0x03, 0xd1, 0x4b, 0x01, 0xdf, - 0x0b, 0x01, 0xc6, 0xc5, 0x00, 0x33, 0x13, 0x00, 0x3e, 0xcd, 0xff, 0x80, 0x0a, 0x00, 0x7c, 0xd3, - 0xff, 0x24, 0x0e, 0x00, 0xe4, 0x05, 0x00, 0x25, 0x12, 0xff, 0x3d, 0xbb, 0xfe, 0x74, 0xd2, 0xfe, - 0xac, 0x15, 0xfe, 0x76, 0xa2, 0xfd, 0x07, 0x4e, 0x0b, 0x7e, 0x8c, 0x0c, 0x83, 0x57, 0x05, 0xfd, - 0xf3, 0x0b, 0xde, 0x48, 0x06, 0xcd, 0xba, 0x00, 0x2b, 0xdd, 0x01, 0x1b, 0xb3, 0xff, 0xc2, 0xac, - 0x01, 0x22, 0x99, 0x02, 0x69, 0xf5, 0x00, 0xb9, 0x9b, 0x00, 0x97, 0x0a, 0x04, 0xb1, 0x40, 0x04, - 0x1d, 0x72, 0x02, 0x8b, 0x7c, 0x02, 0x49, 0xee, 0x02, 0x3f, 0x7e, 0x01, 0x4e, 0xf5, 0xff, 0x6e, - 0xa2, 0x00, 0xa6, 0x54, 0x00, 0x54, 0x37, 0x00, 0xdf, 0x68, 0xff, 0xd6, 0x24, 0xff, 0x47, 0x7e, - 0xff, 0xad, 0x9d, 0xff, 0x5a, 0xc2, 0xff, 0x91, 0x06, 0xff, 0x37, 0x7b, 0xfe, 0x6a, 0x60, 0xfe, - 0x1e, 0xf3, 0xfd, 0xad, 0x15, 0xfe, 0xf1, 0xc7, 0x0a, 0x35, 0x6b, 0x0d, 0x3e, 0x3e, 0x05, 0x71, - 0xfc, 0x08, 0x8e, 0xc1, 0x06, 0xdc, 0x21, 0x02, 0x64, 0xed, 0x01, 0x77, 0x13, 0x00, 0x06, 0x04, - 0x02, 0xc8, 0x48, 0x04, 0xce, 0x3d, 0x03, 0x7f, 0xae, 0x02, 0xc0, 0x7e, 0x04, 0x58, 0x0e, 0x04, - 0xd7, 0xc1, 0x01, 0xee, 0xe1, 0xff, 0x41, 0x94, 0x00, 0x0a, 0x71, 0x01, 0xbc, 0xc9, 0x00, 0xb9, - 0x3a, 0x00, 0x3e, 0x2d, 0xff, 0x9b, 0x0d, 0xff, 0x3c, 0x0d, 0xff, 0x10, 0x33, 0xff, 0x08, 0x3b, - 0xff, 0x32, 0x44, 0xff, 0x21, 0xf6, 0xfe, 0xca, 0x9a, 0xfe, 0xcc, 0xd8, 0xfe, 0x0d, 0x4f, 0xfe, - 0x7d, 0x38, 0xfe, 0xb5, 0x35, 0xfe, 0xe2, 0xab, 0x08, 0x9b, 0xce, 0x0b, 0x40, 0xab, 0x06, 0x9a, - 0xc0, 0x09, 0x96, 0x48, 0x07, 0xad, 0x4b, 0x02, 0x6c, 0x80, 0x02, 0x66, 0x71, 0x02, 0xf2, 0xba, - 0x04, 0xb4, 0xca, 0x05, 0xe2, 0x1d, 0x04, 0x0f, 0xef, 0x02, 0x7c, 0x1a, 0x02, 0xce, 0x0c, 0x01, - 0xea, 0x09, 0x00, 0x8d, 0x56, 0x00, 0x3a, 0x83, 0x01, 0xc7, 0x42, 0x01, 0x1b, 0x6c, 0xff, 0xbe, - 0xef, 0xfe, 0x84, 0xbb, 0xff, 0x0e, 0xc8, 0xfe, 0x9d, 0x2e, 0xfe, 0x6a, 0xc1, 0xfe, 0x9e, 0x0f, - 0xff, 0x6d, 0x22, 0xff, 0x18, 0xd2, 0xfe, 0x01, 0x12, 0xff, 0xa8, 0xca, 0xfe, 0x1b, 0x85, 0xfe, - 0xeb, 0x62, 0xfe, 0x6f, 0x2d, 0xfe, 0x6f, 0x52, 0x09, 0x32, 0x39, 0x0e, 0xdb, 0x96, 0x07, 0x9e, - 0x06, 0x07, 0x09, 0x0c, 0x06, 0x70, 0x81, 0x05, 0x3f, 0x8f, 0x07, 0x5f, 0x87, 0x05, 0xdf, 0x05, - 0x04, 0x54, 0x8f, 0x03, 0x12, 0x4b, 0x01, 0x7b, 0xbc, 0xff, 0x11, 0x40, 0x00, 0x02, 0x20, 0x01, - 0x48, 0x92, 0x01, 0xa7, 0x4d, 0x00, 0x65, 0x7a, 0xff, 0xfa, 0x5a, 0x00, 0x4b, 0x86, 0xff, 0xdc, - 0xb2, 0xfe, 0x3c, 0x9c, 0xfe, 0x95, 0xcb, 0xfd, 0x5a, 0x3c, 0xfe, 0x38, 0x46, 0xff, 0x94, 0x17, - 0xff, 0xd6, 0xdb, 0xfe, 0xb2, 0x38, 0xff, 0xa9, 0x5c, 0xff, 0x56, 0xa4, 0xfe, 0x2c, 0x2e, 0xfe, - 0xf9, 0x6d, 0xfe, 0x97, 0x65, 0xfe, 0x05, 0xe5, 0x09, 0xba, 0x23, 0x0e, 0x78, 0x0d, 0x09, 0xd3, - 0x37, 0x0b, 0x2b, 0x56, 0x09, 0xc9, 0x57, 0x07, 0x32, 0x82, 0x07, 0x95, 0xe5, 0x02, 0xf6, 0xfd, - 0xff, 0x41, 0x75, 0x00, 0x21, 0x40, 0x00, 0x6f, 0x3b, 0x00, 0x50, 0x97, 0x00, 0xd5, 0x80, 0x00, - 0xbb, 0x04, 0x01, 0xec, 0x8d, 0xff, 0xd6, 0x2d, 0xff, 0x44, 0xfc, 0xff, 0xc8, 0x9a, 0xfe, 0x20, - 0x31, 0xfe, 0xfe, 0x26, 0xfe, 0x95, 0xa9, 0xfd, 0xc7, 0x87, 0xfe, 0xc8, 0x8b, 0xff, 0xe3, 0x5b, - 0xff, 0xe1, 0xe8, 0xfe, 0xf1, 0x0d, 0xff, 0x9b, 0x34, 0xff, 0x71, 0xac, 0xfe, 0x22, 0x53, 0xfe, - 0xf1, 0x52, 0xfe, 0x82, 0x3f, 0xfe, 0x7f, 0x80, 0x0b, 0x44, 0x11, 0x12, 0xd2, 0xc4, 0x0e, 0x32, - 0x0a, 0x0e, 0x5a, 0xa4, 0x07, 0x30, 0xe8, 0x03, 0x13, 0x42, 0x02, 0x8a, 0xfa, 0xff, 0xdc, 0xf3, - 0xff, 0xb5, 0xb5, 0x00, 0x7f, 0x62, 0x00, 0x28, 0x61, 0xff, 0xab, 0xb5, 0xff, 0x2f, 0x24, 0x00, - 0x7e, 0xe1, 0x00, 0x10, 0x40, 0xff, 0xa2, 0xa9, 0xfe, 0xa6, 0x0d, 0xff, 0x33, 0xf0, 0xfd, 0xdd, - 0xf6, 0xfd, 0x4a, 0x2b, 0xfe, 0x36, 0x97, 0xfe, 0x8b, 0xdb, 0xfe, 0x00, 0xf7, 0xfe, 0xb7, 0x09, - 0xff, 0x87, 0x5b, 0xff, 0xb3, 0x50, 0xff, 0x8e, 0xcd, 0xfe, 0x59, 0x6d, 0xfe, 0x42, 0x41, 0xfe, - 0xa7, 0x6b, 0xfe, 0x1e, 0x4f, 0xfe, 0xe0, 0xd0, 0x0d, 0x69, 0xda, 0x18, 0x37, 0xa0, 0x12, 0xa4, - 0x3e, 0x08, 0x89, 0xc0, 0x00, 0x40, 0xfa, 0x01, 0xdf, 0x20, 0x04, 0x49, 0xe4, 0x02, 0xe9, 0xe8, - 0xfe, 0xd1, 0x1e, 0xfe, 0x1b, 0xf6, 0xff, 0x39, 0x41, 0x00, 0x24, 0xfe, 0xff, 0x0e, 0x16, 0xff, - 0xe9, 0x21, 0x00, 0xd2, 0x84, 0xff, 0x61, 0x59, 0xfe, 0x15, 0x53, 0xfe, 0x33, 0x0c, 0xfe, 0x6e, - 0xb5, 0xfe, 0x71, 0x6b, 0xfe, 0xf4, 0x61, 0xfe, 0xf1, 0x84, 0xfe, 0x33, 0x19, 0xff, 0xdb, 0x3a, - 0xff, 0x4e, 0x23, 0xff, 0xe1, 0x65, 0xff, 0x1e, 0xb9, 0xfe, 0xa5, 0x74, 0xfe, 0x30, 0x2b, 0xfe, - 0xdc, 0x5b, 0xfe, 0xb8, 0xb1, 0xfe, 0x94, 0xcb, 0x0e, 0x52, 0xdd, 0x18, 0x3d, 0xe5, 0x0c, 0xf8, - 0x9e, 0x04, 0x58, 0xf4, 0x02, 0x98, 0xfb, 0x05, 0x62, 0x14, 0x07, 0x07, 0x8f, 0x01, 0xe8, 0xee, - 0xfd, 0x2b, 0x01, 0x00, 0x79, 0x54, 0x00, 0x6b, 0x6b, 0xfe, 0xa9, 0x27, 0x00, 0xe5, 0x77, 0xff, - 0x9f, 0x2f, 0xff, 0x3d, 0x46, 0xff, 0x27, 0x4a, 0xfe, 0x7d, 0xe9, 0xfe, 0x18, 0xa1, 0xfe, 0x76, - 0x47, 0xfe, 0xda, 0x9e, 0xfe, 0x80, 0x64, 0xfe, 0x4f, 0x0a, 0xfe, 0xfc, 0x03, 0xff, 0x32, 0x46, - 0xff, 0xf7, 0xed, 0xfe, 0x8a, 0x22, 0xff, 0xe5, 0xcc, 0xfe, 0xd9, 0xa6, 0xfe, 0x0c, 0x91, 0xfe, - 0x16, 0x58, 0xfe, 0x65, 0x7a, 0xfe, 0xa0, 0xfc, 0x08, 0xc5, 0xa2, 0x0d, 0x36, 0x97, 0x07, 0x31, - 0xc4, 0x07, 0x3e, 0xfb, 0x08, 0x56, 0xfa, 0x08, 0x6e, 0x2b, 0x08, 0x8b, 0xdb, 0x03, 0xef, 0xfe, - 0x01, 0xca, 0xc7, 0x02, 0x02, 0x5d, 0x01, 0x07, 0x5c, 0xff, 0x49, 0xe4, 0xfe, 0x64, 0xa6, 0xff, - 0x3f, 0xec, 0xff, 0x94, 0x83, 0xfe, 0xcc, 0x81, 0xfe, 0x37, 0x35, 0xff, 0xfb, 0x18, 0xff, 0xe4, - 0x3f, 0xff, 0xf4, 0x62, 0xfe, 0x61, 0x41, 0xfe, 0x2e, 0xd6, 0xfe, 0xee, 0x7d, 0xfe, 0x73, 0x6f, - 0xfe, 0xfa, 0x00, 0xff, 0xf6, 0xd5, 0xfe, 0xdf, 0xaf, 0xfe, 0xcb, 0x4c, 0xff, 0x12, 0x0b, 0xff, - 0x1c, 0x77, 0xfe, 0x28, 0x66, 0xfe, 0x3e, 0x17, 0x07, 0x5b, 0xd1, 0x09, 0xe3, 0x70, 0x04, 0x27, - 0x2c, 0x05, 0x24, 0xdd, 0x07, 0xfa, 0x14, 0x08, 0x80, 0x35, 0x06, 0xc8, 0xcb, 0x04, 0xef, 0x05, - 0x06, 0x5a, 0x02, 0x06, 0xb9, 0x3e, 0x04, 0x91, 0x54, 0x02, 0xd2, 0x3f, 0x01, 0x22, 0xe3, 0x00, - 0x9a, 0x79, 0xff, 0x88, 0xa4, 0xfe, 0x9b, 0x22, 0xff, 0xe9, 0x9e, 0xfe, 0x7b, 0x70, 0xfe, 0x07, - 0x9c, 0xff, 0xb2, 0xe3, 0xfe, 0x04, 0xc6, 0xfe, 0xdd, 0x4d, 0xff, 0xd6, 0xa2, 0xfe, 0x41, 0xb1, - 0xfe, 0x19, 0xec, 0xfe, 0x94, 0x93, 0xfe, 0x32, 0x43, 0xfe, 0x07, 0xc0, 0xfe, 0x1c, 0x06, 0xff, - 0x96, 0xe5, 0xfe, 0x83, 0x0d, 0xff, 0xf9, 0xc7, 0x07, 0xb3, 0xb3, 0x0a, 0xe6, 0xf5, 0x04, 0xcb, - 0x52, 0x05, 0xa2, 0xa6, 0x06, 0x95, 0xf6, 0x04, 0x2f, 0xc5, 0x02, 0xb6, 0x54, 0x02, 0x63, 0xd3, - 0x04, 0xf6, 0x50, 0x06, 0xda, 0x00, 0x05, 0xaf, 0xe5, 0x03, 0xef, 0xa5, 0x03, 0xef, 0x08, 0x03, - 0xa7, 0x5a, 0x01, 0x05, 0x91, 0xff, 0x35, 0x28, 0xff, 0x93, 0x09, 0xff, 0xe7, 0xed, 0xfe, 0xec, - 0xb9, 0xfe, 0x79, 0x72, 0xfe, 0x1f, 0xea, 0xfe, 0xe5, 0x73, 0xff, 0xd5, 0x01, 0xff, 0x4c, 0xc7, - 0xfe, 0xed, 0x11, 0xff, 0x55, 0x78, 0xfe, 0x05, 0x76, 0xfe, 0x4f, 0xd3, 0xfe, 0xad, 0x6e, 0xfe, - 0x14, 0xb2, 0xfe, 0x53, 0x2e, 0xff, 0x0c, 0xcc, 0x08, 0x79, 0xa7, 0x0b, 0x24, 0xe8, 0x03, 0x3d, - 0xea, 0x04, 0xa7, 0x02, 0x07, 0x42, 0xa2, 0x04, 0xbe, 0x1e, 0x01, 0xce, 0x59, 0x00, 0x51, 0xbd, - 0x03, 0xa5, 0x8c, 0x04, 0x8d, 0xcb, 0x02, 0xbc, 0xe6, 0x03, 0xa3, 0x4e, 0x05, 0x4b, 0xaf, 0x04, - 0x28, 0x69, 0x03, 0x29, 0x5a, 0x01, 0xb1, 0xab, 0x00, 0xce, 0xdd, 0xff, 0x4a, 0xef, 0xfe, 0xfc, - 0x4e, 0xff, 0x14, 0x7b, 0xfe, 0x2b, 0x62, 0xfe, 0x6d, 0x61, 0xff, 0x77, 0xff, 0xfe, 0xa9, 0x54, - 0xff, 0xf2, 0xae, 0xff, 0x82, 0xa9, 0xfe, 0x28, 0x9c, 0xfe, 0x4f, 0xd7, 0xfe, 0x7c, 0x4f, 0xfe, - 0xc1, 0xa4, 0xfe, 0xcd, 0xd8, 0xfe, 0xee, 0xb0, 0x09, 0x74, 0x98, 0x0d, 0x69, 0x92, 0x04, 0x3d, - 0xac, 0x04, 0xc0, 0xc7, 0x06, 0xb6, 0x53, 0x03, 0x61, 0x3b, 0x00, 0x43, 0x47, 0x01, 0x15, 0xec, - 0x03, 0x49, 0x62, 0x02, 0xc4, 0xc6, 0x00, 0xa7, 0x24, 0x02, 0x07, 0xfa, 0x02, 0xfc, 0xe7, 0x03, - 0xb4, 0x7d, 0x04, 0xd7, 0xdc, 0x02, 0x54, 0x08, 0x02, 0xa9, 0x52, 0x01, 0xb9, 0x6d, 0x00, 0xf1, - 0x27, 0x00, 0x6b, 0xca, 0xfe, 0x1c, 0xc5, 0xfe, 0x12, 0x23, 0xff, 0xf5, 0x78, 0xfe, 0x09, 0x42, - 0xff, 0x39, 0xb4, 0xff, 0x8a, 0x02, 0xff, 0xf3, 0x01, 0xff, 0x6e, 0xe4, 0xfe, 0xe1, 0x63, 0xfe, - 0xbf, 0x9d, 0xfe, 0xbb, 0xdc, 0xfe, 0xfa, 0x56, 0x0a, 0x5a, 0x85, 0x0e, 0x42, 0x2a, 0x05, 0xab, - 0x62, 0x05, 0xaf, 0xf0, 0x07, 0x38, 0xb9, 0x02, 0xd1, 0x01, 0xfe, 0x1b, 0x45, 0x01, 0x60, 0xc0, - 0x04, 0xe2, 0xc9, 0x01, 0x86, 0x41, 0x00, 0x95, 0x7e, 0x01, 0x4c, 0x63, 0x01, 0x77, 0xd0, 0x01, - 0x6e, 0x3e, 0x02, 0x31, 0xd6, 0x01, 0x19, 0xd2, 0x02, 0xad, 0xf0, 0x02, 0x34, 0x9c, 0x01, 0x21, - 0x05, 0x01, 0xc3, 0x88, 0x00, 0xf0, 0xbe, 0xff, 0xb5, 0x1a, 0xff, 0xe1, 0xf1, 0xfe, 0x09, 0x11, - 0xff, 0x16, 0x21, 0xff, 0x5a, 0x13, 0xff, 0x23, 0x0b, 0xff, 0x3c, 0x1a, 0xff, 0xfd, 0xd5, 0xfe, - 0x41, 0x94, 0xfe, 0xae, 0xb4, 0xfe, 0xcb, 0x93, 0x0b, 0x73, 0x2e, 0x10, 0x57, 0xce, 0x05, 0xe4, - 0x32, 0x05, 0x8e, 0xfa, 0x07, 0x44, 0x63, 0x02, 0x71, 0xd7, 0xfc, 0x06, 0xd2, 0x01, 0x69, 0xdf, - 0x04, 0x41, 0x32, 0x00, 0xd0, 0xe7, 0xff, 0xfc, 0xe0, 0x01, 0x7c, 0x44, 0x01, 0xb4, 0xb6, 0x00, - 0xa7, 0x20, 0x01, 0x65, 0x3e, 0x00, 0x71, 0x26, 0x00, 0xd2, 0xc5, 0x01, 0x0e, 0x73, 0x02, 0x8b, - 0x10, 0x02, 0xa2, 0x55, 0x01, 0xb5, 0xe3, 0x00, 0xf1, 0x46, 0x00, 0x26, 0x80, 0xff, 0x3a, 0x48, - 0xff, 0xa5, 0x65, 0xff, 0x2b, 0xfd, 0xfe, 0x80, 0x8c, 0xfe, 0xc1, 0xc1, 0xfe, 0x8a, 0x05, 0xff, - 0xbb, 0xe0, 0xfe, 0x0e, 0x99, 0xfe, 0x31, 0xa8, 0x0c, 0x4b, 0xf5, 0x11, 0x22, 0x87, 0x06, 0x17, - 0x00, 0x05, 0xd2, 0x6c, 0x08, 0x6a, 0x45, 0x02, 0x8c, 0x8b, 0xfb, 0xbb, 0x40, 0x02, 0x16, 0x30, - 0x05, 0x03, 0x1e, 0xff, 0x62, 0x81, 0xff, 0x1b, 0x2b, 0x02, 0xd1, 0x23, 0x01, 0x09, 0x61, 0x00, - 0x8e, 0xec, 0x00, 0x5b, 0xbb, 0xff, 0x20, 0x66, 0xff, 0x8c, 0x14, 0x00, 0x00, 0x47, 0x00, 0xa1, - 0x1d, 0x01, 0xcc, 0xaf, 0x01, 0xda, 0x2e, 0x02, 0xcf, 0x46, 0x01, 0x66, 0x60, 0x00, 0xab, 0x77, - 0x00, 0x8f, 0xf2, 0xff, 0xdf, 0x52, 0xff, 0xae, 0xfe, 0xfe, 0x4d, 0xaf, 0xfe, 0x0c, 0x85, 0xfe, - 0x38, 0xff, 0xfe, 0xbb, 0xc5, 0xfe, 0x0f, 0x8e, 0x0e, 0xe8, 0x53, 0x14, 0xf6, 0x6f, 0x06, 0x10, - 0x5e, 0x04, 0x35, 0x7a, 0x08, 0xc2, 0xf9, 0x01, 0x3a, 0x01, 0xfb, 0x3a, 0xef, 0x02, 0x2a, 0xbd, - 0x04, 0x1f, 0x8d, 0xfd, 0x69, 0x70, 0xff, 0x1d, 0x9d, 0x02, 0xdc, 0x25, 0x01, 0xb0, 0xd5, 0xff, - 0xaa, 0x79, 0x00, 0xd3, 0xa4, 0xff, 0xbc, 0x13, 0xff, 0xd5, 0x9b, 0xff, 0x54, 0x9b, 0xff, 0xf1, - 0xaa, 0xff, 0x70, 0x79, 0xff, 0x59, 0x1b, 0x01, 0xb0, 0xdf, 0x01, 0x02, 0x75, 0x01, 0xf7, 0x16, - 0x01, 0xe3, 0x96, 0x00, 0xb1, 0x54, 0x00, 0xa6, 0x89, 0xff, 0x04, 0xd9, 0xfe, 0xd5, 0xa2, 0xfe, - 0x87, 0xe5, 0xfe, 0x3d, 0x80, 0xfe, 0x94, 0x16, 0x10, 0x2c, 0x3c, 0x16, 0x70, 0xc8, 0x06, 0x68, - 0x63, 0x04, 0x0e, 0xb8, 0x08, 0x27, 0x2d, 0x01, 0x81, 0x42, 0xfa, 0x17, 0x34, 0x04, 0x82, 0xb6, - 0x04, 0x24, 0xda, 0xfb, 0x1b, 0xf7, 0xfe, 0x8b, 0xe6, 0x02, 0x83, 0x31, 0x01, 0x00, 0xe7, 0xff, - 0x88, 0x24, 0x00, 0x33, 0x34, 0xff, 0x21, 0xec, 0xfe, 0xd6, 0x76, 0xff, 0x87, 0x7c, 0xff, 0x8d, - 0x41, 0xff, 0x78, 0xad, 0xfe, 0x4f, 0x8b, 0xff, 0x52, 0x2b, 0x00, 0x7b, 0xb3, 0x00, 0xbf, 0x91, - 0x01, 0x83, 0x5d, 0x01, 0x4b, 0xea, 0x00, 0xd8, 0x6c, 0x00, 0x4e, 0xaf, 0xff, 0xfb, 0xf3, 0xfe, - 0x76, 0xfe, 0xfe, 0x94, 0xdd, 0xfe, 0x96, 0x0d, 0x12, 0xab, 0x34, 0x18, 0x96, 0xa2, 0x06, 0xda, - 0xd6, 0x04, 0x00, 0x17, 0x09, 0x8f, 0xd1, 0xff, 0x18, 0xfa, 0xf9, 0xfe, 0xf0, 0x05, 0xb4, 0x66, - 0x04, 0x12, 0x35, 0xfa, 0x24, 0xd0, 0xfe, 0xbb, 0x46, 0x03, 0xb9, 0x29, 0x01, 0x16, 0xbd, 0xff, - 0x9b, 0x01, 0x00, 0x9e, 0x39, 0xff, 0x05, 0xca, 0xfe, 0x9b, 0x35, 0xff, 0xa6, 0x9d, 0xff, 0xf3, - 0x23, 0xff, 0x8c, 0x7d, 0xfe, 0x24, 0x24, 0xff, 0x72, 0x6f, 0xff, 0x27, 0x9e, 0xff, 0x8e, 0x17, - 0x00, 0xac, 0xc6, 0x00, 0x9d, 0x5b, 0x01, 0x74, 0x09, 0x01, 0xda, 0x3f, 0x00, 0xcc, 0xcd, 0xff, - 0x9a, 0xf4, 0xff, 0x3a, 0x36, 0xff, 0xcb, 0x43, 0x14, 0xba, 0xf8, 0x19, 0x6b, 0x1e, 0x06, 0x43, - 0xd2, 0x05, 0x3d, 0x58, 0x09, 0xff, 0xb7, 0xfd, 0x85, 0xd3, 0xf9, 0xc1, 0xdc, 0x07, 0xa2, 0xe1, - 0x03, 0x1a, 0xb4, 0xf8, 0xda, 0x6c, 0xfe, 0xcb, 0x50, 0x03, 0xc5, 0x55, 0x01, 0xd2, 0x81, 0xff, - 0xbd, 0xcc, 0xff, 0x02, 0xf8, 0xfe, 0x60, 0x79, 0xfe, 0xa7, 0xe6, 0xfe, 0x55, 0xe8, 0xff, 0x6e, - 0xfd, 0xfe, 0x70, 0x40, 0xfe, 0xec, 0x13, 0xff, 0x7d, 0x8a, 0xfe, 0x80, 0x93, 0xff, 0x03, 0xdd, - 0xff, 0x65, 0x52, 0xff, 0x01, 0xc6, 0xff, 0xd1, 0x63, 0x00, 0x92, 0xa2, 0x00, 0xa5, 0x82, 0x00, - 0x9e, 0x36, 0x00, 0xd6, 0xc6, 0xff, 0x1a, 0xc1, 0x16, 0x25, 0xe0, 0x1b, 0x07, 0x62, 0x05, 0x8c, - 0xa2, 0x06, 0x0f, 0x8f, 0x09, 0x81, 0xcb, 0xfb, 0x6d, 0xd3, 0xf9, 0x95, 0x79, 0x09, 0xb7, 0x29, - 0x03, 0x0b, 0xae, 0xf7, 0xaa, 0x45, 0xfe, 0xcf, 0x02, 0x03, 0xbd, 0x42, 0x01, 0x47, 0x4f, 0xff, - 0xbe, 0x28, 0x00, 0xf4, 0xb8, 0xfe, 0xcd, 0xa3, 0xfd, 0x26, 0xb7, 0xfe, 0x89, 0xf9, 0xff, 0x49, - 0x2b, 0xff, 0x88, 0x17, 0xfe, 0x7e, 0xe2, 0xfe, 0x20, 0x2b, 0xfe, 0x74, 0x6f, 0xff, 0x72, 0xd1, - 0xff, 0x2e, 0xf9, 0xfe, 0x17, 0x0c, 0xff, 0x8d, 0xfa, 0xfe, 0x1a, 0x84, 0xff, 0xa6, 0x0a, 0x00, - 0xd3, 0x78, 0x00, 0x90, 0x20, 0x00, 0xc2, 0xbc, 0x18, 0xcf, 0xd7, 0x1d, 0xd3, 0x89, 0x05, 0x0e, - 0x01, 0x07, 0xf9, 0xe3, 0x09, 0x9c, 0x91, 0xfa, 0x32, 0x2e, 0xf9, 0xdc, 0x4d, 0x0b, 0x4a, 0x26, - 0x03, 0xf9, 0x3c, 0xf6, 0x6d, 0x6d, 0xfe, 0xb8, 0xe5, 0x02, 0xbe, 0x0e, 0x01, 0x54, 0x5d, 0xff, - 0xc8, 0x0e, 0x00, 0x8a, 0x20, 0xff, 0xaa, 0x4b, 0xfd, 0x8d, 0x1b, 0xfe, 0xdc, 0x46, 0x00, 0x3c, - 0xfd, 0xfe, 0x50, 0xc2, 0xfd, 0xb6, 0x8a, 0xff, 0xbb, 0x26, 0xfe, 0x2e, 0xe8, 0xfe, 0x7e, 0xf0, - 0xff, 0xd1, 0xdd, 0xfe, 0xd5, 0xf8, 0xfe, 0xe9, 0xc3, 0xfe, 0xaf, 0x62, 0xfe, 0x7c, 0xd6, 0xfe, - 0xe2, 0xc8, 0xff, 0xa5, 0x1a, 0x00, 0x15, 0x6e, 0x1a, 0x3e, 0x96, 0x1f, 0x70, 0xb3, 0x05, 0xec, - 0x12, 0x08, 0xc4, 0x36, 0x0a, 0xe2, 0x4d, 0xf8, 0x99, 0xdd, 0xf8, 0x6c, 0x1f, 0x0d, 0xf4, 0xd6, - 0x02, 0xba, 0x21, 0xf5, 0xe2, 0x32, 0xfe, 0x8c, 0xcc, 0x02, 0x1f, 0xd2, 0x00, 0xfe, 0x13, 0xff, - 0xb6, 0xf0, 0xff, 0x1b, 0x6a, 0xff, 0x1a, 0x12, 0xfd, 0xa7, 0x90, 0xfd, 0xe9, 0x4c, 0x00, 0x95, - 0xd2, 0xfe, 0x92, 0x48, 0xfd, 0xf1, 0x81, 0xff, 0x09, 0x6d, 0xfe, 0x97, 0xb9, 0xfe, 0x4a, 0x91, - 0xff, 0x91, 0x29, 0xff, 0xa3, 0xd6, 0xfe, 0x30, 0x2c, 0xfe, 0x69, 0xfa, 0xfd, 0x94, 0x73, 0xfe, - 0xd8, 0x52, 0xff, 0xb1, 0xdf, 0xfe, 0x2d, 0xf5, 0x1b, 0xaf, 0xab, 0x21, 0xa3, 0x34, 0x06, 0x0a, - 0x0f, 0x08, 0x74, 0xe6, 0x0a, 0x98, 0x67, 0xf7, 0xa2, 0x00, 0xf8, 0xb3, 0x13, 0x0e, 0x75, 0x06, - 0x03, 0x79, 0xa7, 0xf4, 0xab, 0xdf, 0xfd, 0x89, 0xc5, 0x02, 0xa6, 0x65, 0x00, 0x25, 0xfc, 0xfe, - 0x79, 0xf7, 0xff, 0xb6, 0x7e, 0xff, 0xa9, 0x5c, 0xfd, 0x1d, 0xb3, 0xfc, 0x09, 0x3e, 0x00, 0x0f, - 0x7f, 0xff, 0xec, 0xb6, 0xfc, 0xf7, 0x01, 0xff, 0x69, 0x84, 0xfe, 0xe0, 0xe2, 0xfe, 0x77, 0x93, - 0xff, 0x73, 0x19, 0xff, 0xfb, 0xe4, 0xfe, 0x87, 0xcb, 0xfd, 0xfb, 0xc7, 0xfd, 0x45, 0x59, 0xfe, - 0xec, 0xfa, 0xfe, 0xf1, 0x41, 0xfe, 0x46, 0xf8, 0x1c, 0x75, 0x77, 0x24, 0xf1, 0x2d, 0x07, 0x08, - 0x62, 0x06, 0x6b, 0xdb, 0x0b, 0xed, 0x53, 0xf8, 0xb3, 0x53, 0xf6, 0xd9, 0x94, 0x0d, 0x28, 0x98, - 0x03, 0x53, 0x31, 0xf5, 0xf9, 0x19, 0xfd, 0x04, 0x47, 0x02, 0xdf, 0x7a, 0x00, 0x87, 0x8a, 0xfe, - 0x67, 0x20, 0x00, 0xeb, 0x90, 0xff, 0x18, 0x66, 0xfd, 0x7f, 0x58, 0xfc, 0x66, 0xc0, 0xff, 0x9b, - 0xe3, 0xff, 0xd4, 0xf3, 0xfc, 0x37, 0x3c, 0xfe, 0xe5, 0x20, 0xfe, 0x1c, 0x68, 0xff, 0x77, 0x72, - 0xff, 0x55, 0x95, 0xfe, 0xc4, 0xfd, 0xfe, 0x4f, 0xee, 0xfd, 0x3b, 0xa8, 0xfd, 0xc4, 0x0e, 0xfe, - 0x78, 0x4c, 0xfe, 0xb1, 0x4a, 0xfe, 0x84, 0xb9, 0x1d, 0x3f, 0x2a, 0x26, 0x5f, 0x09, 0x09, 0x79, - 0x95, 0x05, 0xf0, 0xfc, 0x0b, 0x69, 0xfe, 0xf9, 0x40, 0x7c, 0xf4, 0xff, 0x82, 0x0c, 0x4e, 0x70, - 0x04, 0x15, 0xc3, 0xf5, 0x0b, 0xad, 0xfc, 0xce, 0x6c, 0x01, 0x97, 0x96, 0x00, 0xcd, 0x59, 0xfe, - 0x80, 0xcf, 0xff, 0x8c, 0xca, 0xff, 0x2b, 0x9e, 0xfd, 0xfd, 0xfb, 0xfb, 0x9a, 0x51, 0xff, 0x15, - 0x0d, 0x00, 0x41, 0xc9, 0xfc, 0x98, 0x48, 0xfe, 0x9b, 0xf1, 0xfd, 0xce, 0xf2, 0xfe, 0xa7, 0x93, - 0xff, 0x17, 0x54, 0xfe, 0xcb, 0x96, 0xfe, 0x4f, 0x63, 0xfe, 0x4c, 0x47, 0xfd, 0x86, 0x70, 0xfd, - 0xac, 0x9c, 0xfe, 0x7e, 0x27, 0xfe, 0x12, 0xa8, 0x1f, 0xf4, 0x30, 0x26, 0x87, 0xf9, 0x09, 0x27, - 0x6d, 0x07, 0x61, 0xb6, 0x0b, 0x79, 0x2f, 0xfa, 0x98, 0xc3, 0xf3, 0xf9, 0x22, 0x0c, 0xbb, 0xf7, - 0x03, 0xb3, 0xb2, 0xf6, 0x7a, 0xdd, 0xfc, 0x73, 0x57, 0x00, 0xe4, 0xde, 0x00, 0xe6, 0x32, 0xfe, - 0x4f, 0x30, 0xff, 0x18, 0x4a, 0x00, 0x02, 0x5b, 0xfe, 0xc6, 0x7a, 0xfb, 0x0a, 0xb4, 0xfe, 0x10, - 0x69, 0x00, 0xde, 0xe8, 0xfc, 0x3b, 0x12, 0xfe, 0x20, 0xf3, 0xfd, 0xac, 0xa5, 0xfe, 0xed, 0x70, - 0xff, 0x80, 0x79, 0xfe, 0x83, 0x7e, 0xfe, 0x86, 0xe7, 0xfd, 0xa9, 0x17, 0xfd, 0x4c, 0x3d, 0xfd, - 0xb2, 0x41, 0xff, 0x9a, 0x07, 0xfe, 0x17, 0xcd, 0x22, 0x64, 0xd5, 0x24, 0x24, 0x16, 0x09, 0x59, - 0xa4, 0x0b, 0x67, 0xc8, 0x0b, 0xa4, 0x65, 0xf8, 0x07, 0x0d, 0xf4, 0x66, 0x60, 0x0c, 0x1a, 0xb0, - 0x01, 0xe4, 0xfb, 0xf7, 0xda, 0xdf, 0xfd, 0xf6, 0xf2, 0xfe, 0x44, 0xa3, 0x00, 0x1a, 0x1f, 0xfe, - 0xe3, 0xad, 0xfe, 0x25, 0x4d, 0x00, 0x97, 0x67, 0xff, 0x4c, 0xeb, 0xfa, 0x09, 0xd7, 0xfd, 0x03, - 0xbb, 0x00, 0xa6, 0x7b, 0xfd, 0x7b, 0x46, 0xfd, 0x5b, 0xb8, 0xfd, 0x2f, 0xdf, 0xfe, 0xdb, 0xf9, - 0xfe, 0xd2, 0x99, 0xfe, 0xcc, 0x68, 0xfe, 0xd1, 0x1b, 0xfd, 0xbc, 0xb4, 0xfc, 0x43, 0xeb, 0xfd, - 0xfc, 0xf7, 0xfe, 0x8f, 0xc2, 0xfd, 0xf3, 0xd2, 0x24, 0xf4, 0x51, 0x23, 0x1a, 0x8b, 0x08, 0x64, - 0xa5, 0x0f, 0xb0, 0x40, 0x0e, 0xd1, 0x59, 0xf6, 0xe9, 0xa6, 0xf2, 0x83, 0xc1, 0x0e, 0xcd, 0x87, - 0xfe, 0xe2, 0xea, 0xf7, 0xd3, 0x0f, 0x01, 0x56, 0xd1, 0xfd, 0x2f, 0xd3, 0xfe, 0xfc, 0xe7, 0xfe, - 0x4b, 0xa4, 0xfe, 0xab, 0x33, 0xff, 0x07, 0x90, 0x01, 0x7c, 0x48, 0xfa, 0x16, 0xc6, 0xfc, 0x1e, - 0x79, 0x01, 0xd1, 0xbe, 0xfd, 0xcd, 0x0c, 0xfd, 0xa2, 0x2c, 0xfd, 0x5f, 0x38, 0xff, 0x74, 0xbd, - 0xfe, 0xe1, 0x7d, 0xfe, 0x4f, 0x1c, 0xfe, 0x5d, 0x14, 0xfd, 0x03, 0xb2, 0xfc, 0x79, 0xb1, 0xfd, - 0x51, 0xba, 0xfe, 0x3b, 0xc5, 0xfd, 0xa0, 0x7a, 0x27, 0x43, 0xd4, 0x20, 0xdd, 0x7d, 0x05, 0x5f, - 0x77, 0x17, 0xd6, 0x90, 0x10, 0x94, 0xfa, 0xf0, 0x91, 0xa3, 0xf4, 0xb8, 0x1f, 0x12, 0xc1, 0x82, - 0xf8, 0x45, 0x6b, 0xf7, 0x5b, 0x83, 0x05, 0x57, 0x51, 0xfd, 0xb9, 0x19, 0xfd, 0x9a, 0x45, 0xfe, - 0x07, 0x61, 0xff, 0x0d, 0x0c, 0xfe, 0x0c, 0xb5, 0x02, 0xfc, 0x44, 0xfb, 0xdc, 0x14, 0xfb, 0x23, - 0xa4, 0x01, 0x3b, 0x54, 0xfe, 0xc6, 0x14, 0xfd, 0x6c, 0x03, 0xfd, 0x3e, 0x35, 0xff, 0x51, 0x37, - 0xfe, 0x0f, 0x67, 0xfe, 0x61, 0xcd, 0xfd, 0x25, 0xe0, 0xfd, 0x78, 0x58, 0xfc, 0x9a, 0x72, 0xfc, - 0x04, 0x60, 0xff, 0xff, 0x1e, 0xfd, 0x0f, 0xc0, 0x2a, 0xb1, 0xc7, 0x20, 0x05, 0x32, 0x00, 0x79, - 0xbf, 0x1b, 0xd4, 0x8d, 0x14, 0x5d, 0xa6, 0xed, 0xda, 0x4e, 0xf6, 0x3c, 0xdd, 0x14, 0x47, 0x9f, - 0xf2, 0xa6, 0xe2, 0xf5, 0x42, 0x7d, 0x0a, 0x57, 0x68, 0xfd, 0xcb, 0x32, 0xfb, 0x83, 0x6b, 0xfd, - 0xf6, 0x99, 0x00, 0x04, 0xe1, 0xfc, 0x86, 0x55, 0x02, 0xdc, 0x87, 0xfd, 0x27, 0x96, 0xf9, 0xca, - 0x13, 0x01, 0xe8, 0x57, 0xff, 0xd3, 0x0f, 0xfd, 0x0b, 0xef, 0xfc, 0x5c, 0x5c, 0xff, 0xe0, 0xff, - 0xfd, 0xc0, 0xd5, 0xfd, 0xf6, 0xcc, 0xfd, 0x81, 0xcf, 0xfd, 0x2a, 0x99, 0xfc, 0xf7, 0x0f, 0xfc, - 0x90, 0x77, 0xfe, 0xf1, 0xc9, 0xfc, 0x11, 0x77, 0x2f, 0x5f, 0x22, 0x22, 0x3b, 0x7f, 0xf9, 0x98, - 0xb6, 0x1b, 0x57, 0x4e, 0x1a, 0x83, 0x92, 0xec, 0x88, 0xc3, 0xf6, 0x1b, 0xd4, 0x16, 0x75, 0xd8, - 0xed, 0x76, 0xdb, 0xf3, 0xb4, 0x8a, 0x0e, 0xd9, 0x77, 0xfe, 0x5c, 0x1d, 0xf9, 0xe2, 0x7e, 0xfc, - 0xbd, 0xea, 0x01, 0x29, 0x6c, 0xfc, 0xd8, 0x4d, 0x00, 0x4c, 0xc4, 0xff, 0x23, 0xa5, 0xf9, 0xfb, - 0x3b, 0xff, 0xa2, 0xa9, 0x00, 0xcb, 0x15, 0xfd, 0xa6, 0xe0, 0xfc, 0xf6, 0x1c, 0x00, 0xa4, 0x44, - 0xfd, 0xc5, 0xa0, 0xfd, 0xf2, 0xb5, 0xfd, 0xa8, 0xb2, 0xfc, 0x13, 0x77, 0xfd, 0x7e, 0x2a, 0xfc, - 0x0d, 0x95, 0xfc, 0x3e, 0x32, 0xfd, 0x46, 0x8a, 0x34, 0xde, 0xec, 0x23, 0xfc, 0x99, 0xf2, 0x27, - 0x81, 0x1a, 0xb5, 0xc6, 0x1e, 0xd2, 0x3b, 0xed, 0xc4, 0xf4, 0xf7, 0xbc, 0xac, 0x17, 0x77, 0x06, - 0xea, 0x72, 0x4f, 0xf1, 0x46, 0x26, 0x11, 0xd9, 0xf2, 0x00, 0xb0, 0x32, 0xf7, 0xf5, 0x12, 0xfb, - 0x42, 0x15, 0x03, 0x2a, 0x8a, 0xfc, 0xcc, 0x2a, 0xfe, 0x01, 0x71, 0x00, 0xce, 0x4d, 0xfb, 0xea, - 0x3b, 0xfd, 0x9b, 0xe7, 0x00, 0x7a, 0xfb, 0xfd, 0x13, 0xd0, 0xfc, 0xab, 0x06, 0x01, 0xb3, 0xaa, - 0xfc, 0xac, 0x35, 0xfd, 0x3a, 0x40, 0xfd, 0xa8, 0x2a, 0xfc, 0x0b, 0x4f, 0xfd, 0x8d, 0x25, 0xfc, - 0x2a, 0x59, 0xfc, 0xb9, 0xda, 0xfc, 0x6f, 0xdb, 0x38, 0xc2, 0x8d, 0x26, 0x02, 0xaf, 0xed, 0x74, - 0xc6, 0x15, 0x64, 0xc2, 0x22, 0xe6, 0x84, 0xf0, 0x8e, 0x24, 0xf8, 0x8b, 0x3e, 0x19, 0xf1, 0xc2, - 0xe6, 0xad, 0x78, 0xee, 0x09, 0x39, 0x12, 0x35, 0x32, 0x04, 0x7e, 0x56, 0xf6, 0x00, 0xf4, 0xf8, - 0x10, 0x10, 0x04, 0xe6, 0x20, 0xfd, 0xa2, 0x86, 0xfc, 0xc6, 0x71, 0xff, 0x60, 0xb4, 0xfd, 0xcc, - 0x39, 0xfc, 0x03, 0xcf, 0xff, 0xda, 0xa9, 0xff, 0x2f, 0xcb, 0xfc, 0x89, 0xec, 0x01, 0x97, 0x7c, - 0xfc, 0x16, 0x5f, 0xfc, 0x04, 0x07, 0xfd, 0xad, 0x95, 0xfb, 0x3a, 0x7c, 0xfc, 0xfb, 0x5e, 0xfc, - 0x18, 0x45, 0xfd, 0x3c, 0x24, 0xfc, 0xf4, 0x88, 0x3c, 0x67, 0xe0, 0x29, 0xf8, 0x31, 0xea, 0x81, - 0x9b, 0x0f, 0x64, 0xb2, 0x24, 0xcd, 0x00, 0xf5, 0xca, 0xd1, 0xf8, 0xfc, 0x17, 0x1b, 0xb2, 0xc5, - 0xe3, 0xc0, 0xce, 0xeb, 0xc7, 0x0f, 0x12, 0xa4, 0x26, 0x07, 0xe1, 0x9f, 0xf6, 0x50, 0xb8, 0xf6, - 0xc2, 0x56, 0x04, 0x3a, 0xef, 0xfd, 0x18, 0xc8, 0xfb, 0x52, 0x4e, 0xfd, 0x0f, 0x6f, 0xff, 0x06, - 0xa3, 0xfc, 0x7f, 0x39, 0xfe, 0xec, 0x0d, 0x01, 0x73, 0xa1, 0xfd, 0x7f, 0xf0, 0x01, 0x22, 0x6b, - 0xfc, 0x6e, 0x2b, 0xfc, 0x9c, 0x90, 0xfc, 0xb2, 0x97, 0xfa, 0xfb, 0xef, 0xfb, 0x0b, 0x7d, 0xfc, - 0x49, 0x17, 0xfe, 0x42, 0x60, 0xfc, 0xd6, 0x21, 0x43, 0xc2, 0x15, 0x2a, 0xff, 0x02, 0xe6, 0x8d, - 0x6e, 0x0d, 0x14, 0x02, 0x23, 0xfd, 0x46, 0xf6, 0x4a, 0xc7, 0xfe, 0xa7, 0x39, 0x1b, 0xd2, 0x1b, - 0xdf, 0x8c, 0xdb, 0xeb, 0x21, 0x5a, 0x11, 0x00, 0xa2, 0x08, 0x90, 0x10, 0xf7, 0x98, 0x8c, 0xf5, - 0x8b, 0x0d, 0x04, 0xe7, 0x2d, 0xfe, 0xad, 0xdf, 0xfb, 0x03, 0x56, 0xfb, 0x40, 0x8e, 0xff, 0xf2, - 0xd0, 0xfd, 0xce, 0x82, 0xfd, 0xdf, 0x8b, 0x01, 0x0b, 0x72, 0xff, 0x25, 0xfc, 0x00, 0xb7, 0x1a, - 0xfc, 0x17, 0xfb, 0xfc, 0xa2, 0x63, 0xfb, 0x0a, 0xfb, 0xf9, 0x1e, 0x72, 0xfb, 0x56, 0x41, 0xfc, - 0x8e, 0xe4, 0xfe, 0x9a, 0xb6, 0xfd, 0xfa, 0x0a, 0x48, 0xf9, 0xc5, 0x2c, 0xe0, 0x36, 0xe1, 0x3a, - 0xf9, 0x0b, 0xd8, 0x35, 0x20, 0x44, 0xe9, 0xf6, 0xa8, 0x73, 0x04, 0x35, 0xd0, 0x1c, 0x0e, 0x61, - 0xdb, 0x13, 0xad, 0xea, 0x77, 0x84, 0x11, 0x03, 0x04, 0x09, 0x69, 0xec, 0xf7, 0x05, 0x2f, 0xf5, - 0xac, 0x00, 0x03, 0x80, 0x52, 0xfe, 0x34, 0x69, 0xfc, 0xbf, 0x2c, 0xfa, 0xe4, 0x61, 0xfe, 0x5d, - 0xc4, 0xfe, 0xdf, 0x32, 0xfe, 0xbd, 0xe8, 0x01, 0x0b, 0xb7, 0x00, 0x25, 0x00, 0x00, 0x61, 0x69, - 0xfc, 0x18, 0x67, 0xfd, 0x45, 0x9a, 0xfa, 0x56, 0xc8, 0xf9, 0x0d, 0x9b, 0xfa, 0xbc, 0x1f, 0xfc, - 0x61, 0xbb, 0xff, 0xf3, 0x3a, 0xff, 0xbd, 0x4b, 0x4e, 0x1b, 0x57, 0x2d, 0x6a, 0x21, 0xdd, 0xf8, - 0x56, 0x0b, 0xc4, 0x4f, 0x1d, 0x12, 0x8e, 0xf4, 0x0b, 0xee, 0x0a, 0xfe, 0xee, 0x1e, 0xc1, 0x44, - 0xd7, 0xa2, 0xdf, 0xe9, 0xb9, 0x1f, 0x12, 0xbb, 0x7a, 0x08, 0xbe, 0xd3, 0xf7, 0x2a, 0x3f, 0xf6, - 0x64, 0x3e, 0x01, 0x10, 0xa0, 0xfd, 0x64, 0x70, 0xfd, 0x8a, 0x79, 0xf9, 0x46, 0xe2, 0xfc, 0x3d, - 0x60, 0xfe, 0x09, 0xfe, 0xff, 0xf7, 0x05, 0x03, 0x86, 0x20, 0x00, 0xa6, 0xa6, 0xff, 0xc5, 0x37, - 0xfd, 0x01, 0xec, 0xfc, 0x1c, 0x6a, 0xfa, 0x9e, 0x83, 0xf9, 0x26, 0xa0, 0xf9, 0x77, 0x56, 0xfc, - 0x44, 0xf0, 0xff, 0xda, 0x9a, 0x00, 0x56, 0x6d, 0x52, 0x6a, 0xbb, 0x30, 0x4e, 0xf8, 0xd8, 0x53, - 0x48, 0x0a, 0x28, 0x24, 0x1b, 0x55, 0xf4, 0xf1, 0x7a, 0x26, 0x0e, 0xa8, 0xac, 0x23, 0x5c, 0xdd, - 0xd4, 0x7e, 0x67, 0xe7, 0xa8, 0x47, 0x13, 0x6e, 0x98, 0x07, 0x4e, 0xd2, 0xf7, 0x6c, 0xb6, 0xf7, - 0xea, 0xa1, 0xff, 0x9a, 0x0f, 0xfc, 0x80, 0x13, 0xff, 0xe4, 0x21, 0xf9, 0x98, 0xa7, 0xfb, 0xb5, - 0x74, 0xfd, 0x7a, 0x5c, 0x01, 0x70, 0xc6, 0x05, 0x21, 0x15, 0xfe, 0x58, 0xe0, 0xff, 0x14, 0xc0, - 0xfe, 0x40, 0xb3, 0xfb, 0x64, 0x26, 0xfb, 0xeb, 0x14, 0xf9, 0x4c, 0xf2, 0xf8, 0x9d, 0x45, 0xfc, - 0x16, 0xf2, 0xff, 0x9f, 0x55, 0x01, 0xff, 0xcc, 0x56, 0x76, 0xfe, 0x32, 0x37, 0x44, 0xd6, 0xe9, - 0xa1, 0x08, 0xf0, 0xf0, 0x19, 0xb9, 0x41, 0xee, 0x1f, 0x65, 0x0f, 0x67, 0xf7, 0x28, 0x90, 0x32, - 0xd3, 0x40, 0xa7, 0xe5, 0x2d, 0x89, 0x13, 0x11, 0xa5, 0x06, 0x1d, 0xc2, 0xf7, 0x54, 0x3a, 0xf9, - 0xcb, 0x25, 0xfe, 0x9b, 0x15, 0xfa, 0xa0, 0xaf, 0x00, 0xab, 0x99, 0xf8, 0xb9, 0x66, 0xfb, 0xe0, - 0x13, 0xfc, 0x52, 0xb9, 0x01, 0x73, 0x3a, 0x09, 0xdd, 0x18, 0xfc, 0x80, 0xa7, 0xff, 0x50, 0xd0, - 0x00, 0x6c, 0x5b, 0xfa, 0x84, 0xd5, 0xfb, 0xec, 0x4b, 0xf9, 0x23, 0x9c, 0xf7, 0x5c, 0x47, 0xfc, - 0x03, 0x49, 0xff, 0xa6, 0x7a, 0x01, 0x9f, 0x78, 0x5a, 0xcd, 0xf1, 0x34, 0x80, 0x24, 0xd5, 0x80, - 0x54, 0x06, 0x3c, 0xbb, 0x19, 0x96, 0x33, 0xea, 0x3b, 0x6f, 0x0e, 0x4a, 0x66, 0x2e, 0xe0, 0xc7, - 0xd2, 0x4b, 0x17, 0xe5, 0xec, 0x47, 0x12, 0xd9, 0x8f, 0x05, 0x7f, 0x92, 0xf8, 0x9f, 0x0f, 0xfa, - 0xb1, 0xbc, 0xfc, 0xd9, 0x9c, 0xf8, 0x1e, 0xab, 0x01, 0x42, 0x19, 0xf8, 0x58, 0x18, 0xfc, 0x6e, - 0xb4, 0xfa, 0xa0, 0xf0, 0x00, 0xe5, 0x48, 0x0c, 0x18, 0xc8, 0xfb, 0x09, 0x72, 0xfe, 0xa3, 0x31, - 0x03, 0x3e, 0xfd, 0xf9, 0xf0, 0xa8, 0xfb, 0xcf, 0x33, 0xfa, 0xd9, 0xe5, 0xf5, 0x29, 0xd4, 0xfb, - 0xdb, 0x2e, 0xfe, 0x6b, 0x48, 0x01, 0x84, 0xb0, 0x5d, 0x2e, 0x51, 0x36, 0x74, 0x7a, 0xd4, 0x59, - 0xc5, 0x05, 0x3c, 0x20, 0x18, 0x36, 0xc9, 0xe6, 0xdb, 0x7d, 0x0c, 0xdd, 0xce, 0x31, 0xb1, 0x00, - 0xd4, 0xc3, 0xbe, 0xe5, 0x3d, 0x42, 0x10, 0x57, 0x76, 0x03, 0x36, 0xaa, 0xfa, 0x60, 0x1d, 0xfa, - 0x18, 0xd1, 0xfa, 0x77, 0x4a, 0xf8, 0x4e, 0xe6, 0x01, 0x56, 0xc1, 0xf7, 0x83, 0x19, 0xfd, 0xf1, - 0xb1, 0xf9, 0x40, 0x73, 0xff, 0x77, 0xd1, 0x0d, 0x22, 0x53, 0xfd, 0xfb, 0x31, 0xfd, 0xe4, 0xbe, - 0x04, 0xf3, 0x47, 0xfb, 0xeb, 0x5b, 0xfa, 0x4c, 0x0c, 0xfb, 0xcd, 0x3c, 0xf4, 0xc6, 0xe9, 0xfa, - 0x5d, 0x24, 0xfd, 0x11, 0x48, 0x00, 0xef, 0xcd, 0x60, 0x16, 0x53, 0x37, 0x3a, 0x1a, 0xd4, 0x43, - 0x8b, 0x07, 0xc5, 0x9c, 0x14, 0xc1, 0x36, 0xe4, 0x46, 0xcd, 0x0a, 0xe7, 0x66, 0x32, 0x9e, 0x56, - 0xd7, 0xc5, 0x03, 0xe7, 0xa3, 0x9a, 0x0d, 0x66, 0x28, 0x01, 0x79, 0x98, 0xfd, 0x08, 0xfb, 0xf9, - 0x69, 0xa0, 0xf8, 0x1e, 0xf0, 0xf8, 0x6f, 0x80, 0x02, 0xd2, 0x1d, 0xf7, 0x6e, 0x60, 0xfe, 0xec, - 0x6a, 0xf9, 0x63, 0x89, 0xfd, 0x5f, 0x9b, 0x0d, 0x43, 0x71, 0x00, 0x76, 0x71, 0xfd, 0x79, 0x61, - 0x04, 0xc1, 0x22, 0xfe, 0x4e, 0xb2, 0xf8, 0xf3, 0x85, 0xfa, 0x51, 0xea, 0xf3, 0xe5, 0xe7, 0xf9, - 0x85, 0xaa, 0xfb, 0x4a, 0x66, 0xff, 0x60, 0x9f, 0x5f, 0xdb, 0x73, 0x3b, 0x70, 0x12, 0xd7, 0x59, - 0xd9, 0x04, 0xa7, 0x1c, 0x14, 0xd3, 0x29, 0xe2, 0x76, 0x6f, 0x05, 0x40, 0x48, 0x33, 0xd9, 0xbf, - 0xdc, 0xa5, 0xa9, 0xe7, 0xd5, 0xb5, 0x09, 0xed, 0xda, 0xff, 0x4f, 0xf6, 0xff, 0x42, 0xa7, 0xf9, - 0x9f, 0x38, 0xf7, 0x6a, 0x0b, 0xf9, 0x07, 0xed, 0x03, 0xc5, 0x27, 0xf6, 0x36, 0xca, 0xfe, 0xd2, - 0xdf, 0xfa, 0x19, 0x7d, 0xfa, 0x5f, 0x5b, 0x0b, 0x42, 0x6c, 0x05, 0x23, 0xba, 0xfe, 0x3d, 0x1e, - 0x02, 0xb5, 0x75, 0x01, 0x31, 0xb0, 0xf6, 0x0f, 0xd9, 0xf9, 0x5c, 0xbc, 0xf4, 0x69, 0xdf, 0xf7, - 0xc9, 0x5c, 0xfb, 0xfa, 0x9e, 0xfd, 0xf5, 0x28, 0x5b, 0xbc, 0x11, 0x41, 0x68, 0x03, 0xde, 0x6d, - 0x05, 0xff, 0xbc, 0xc3, 0x14, 0xd7, 0x74, 0xe2, 0x09, 0x1e, 0xfc, 0x1a, 0xdf, 0x33, 0xb3, 0xca, - 0xe4, 0x52, 0x9d, 0xe6, 0x8f, 0xd4, 0x06, 0x11, 0x45, 0xfe, 0x83, 0x51, 0x01, 0xe8, 0xa8, 0xfa, - 0xe8, 0xd6, 0xf5, 0x4c, 0x9f, 0xf9, 0xfe, 0xdd, 0x04, 0x08, 0xa4, 0xf5, 0x2c, 0xd8, 0xfe, 0x26, - 0x85, 0xfc, 0xa4, 0x8f, 0xf8, 0xc6, 0x8a, 0x07, 0x57, 0x90, 0x09, 0x90, 0x0c, 0x02, 0x1b, 0x86, - 0xfe, 0x8d, 0xf2, 0x02, 0x7a, 0x8a, 0xf7, 0x95, 0x66, 0xf8, 0x76, 0x98, 0xf5, 0x15, 0x17, 0xf7, - 0xbd, 0xe6, 0xfa, 0xa8, 0x43, 0xfc, 0x50, 0xb8, 0x58, 0x6c, 0x73, 0x43, 0xee, 0xd4, 0xe3, 0xbb, - 0x82, 0xfe, 0xad, 0x31, 0x11, 0xb1, 0x45, 0xe4, 0x80, 0xf1, 0xf4, 0xde, 0x6f, 0x30, 0xdb, 0x04, - 0xee, 0xf8, 0x2d, 0xe5, 0xd3, 0x93, 0x05, 0x88, 0x38, 0xfc, 0xa8, 0x99, 0x01, 0xd3, 0xfe, 0xfc, - 0x17, 0xf3, 0xf4, 0x6b, 0xfe, 0xf9, 0xce, 0x94, 0x05, 0x82, 0x51, 0xf5, 0xb9, 0xff, 0xfe, 0x25, - 0x04, 0xfe, 0x6f, 0xe6, 0xf7, 0xf6, 0xf1, 0x04, 0x05, 0x5d, 0x09, 0x06, 0xbb, 0x05, 0xf7, 0xa1, - 0xfc, 0xee, 0xb9, 0x02, 0xa5, 0xd0, 0xf9, 0x9e, 0x5e, 0xf7, 0x1b, 0x71, 0xf6, 0x6b, 0x37, 0xf7, - 0xe6, 0x3f, 0xfb, 0x0e, 0x00, 0xfb, 0xab, 0x6c, 0x59, 0x34, 0xc4, 0x42, 0xb8, 0x08, 0xe5, 0x3b, - 0xf4, 0x05, 0x74, 0xdb, 0x09, 0xdc, 0x6e, 0xe3, 0x30, 0x45, 0xf4, 0xbc, 0x9e, 0x28, 0x22, 0x44, - 0xf5, 0x14, 0x9d, 0xe6, 0x78, 0x4f, 0x03, 0xa8, 0x4f, 0xfa, 0xdb, 0xde, 0x02, 0x73, 0xf9, 0xfd, - 0x8c, 0x0f, 0xf6, 0xec, 0x82, 0xf9, 0xa0, 0x36, 0x05, 0x99, 0xe9, 0xf6, 0xce, 0xb3, 0xfd, 0x87, - 0x88, 0x00, 0xfd, 0x1a, 0xf8, 0x93, 0xa9, 0x02, 0x4f, 0x53, 0x05, 0xaf, 0x26, 0x08, 0xc3, 0xfa, - 0xfe, 0x40, 0x37, 0x00, 0x7e, 0xf9, 0xfc, 0xee, 0x67, 0xf7, 0x38, 0x87, 0xf6, 0xe1, 0x6c, 0xf9, - 0xff, 0x00, 0xfb, 0xea, 0x61, 0xf8, 0x7b, 0xae, 0x59, 0xea, 0x6a, 0x42, 0x68, 0xb2, 0xe4, 0x27, - 0xfc, 0x0e, 0x57, 0x3b, 0x03, 0x40, 0x58, 0xe0, 0xce, 0x76, 0xf6, 0x26, 0x29, 0x1f, 0x09, 0x14, - 0xfb, 0xdc, 0x11, 0xea, 0xbd, 0x22, 0xff, 0xe2, 0xf6, 0xf9, 0x20, 0x17, 0x05, 0xc2, 0x4b, 0xfd, - 0xba, 0x96, 0xf8, 0xc4, 0x65, 0xf8, 0x40, 0xa0, 0x03, 0xd4, 0xe4, 0xfa, 0x26, 0x35, 0xfb, 0xa0, - 0x27, 0x03, 0xa2, 0xdf, 0xf8, 0x2a, 0x01, 0xfe, 0x3f, 0x44, 0x02, 0x23, 0xb7, 0x08, 0x20, 0x86, - 0x02, 0xcc, 0x0a, 0x00, 0x68, 0x8f, 0xfd, 0x7a, 0xca, 0xf9, 0x62, 0xac, 0xf7, 0x35, 0x1d, 0xf9, - 0xf0, 0xde, 0xfa, 0x33, 0xfa, 0xf7, 0xde, 0x0b, 0x59, 0x40, 0xd1, 0x41, 0xf0, 0xfb, 0xe5, 0x96, - 0x0d, 0x15, 0x69, 0x32, 0xff, 0x1d, 0xf0, 0xdc, 0x55, 0xe3, 0xf7, 0xf4, 0x61, 0x16, 0xaf, 0x75, - 0xff, 0x46, 0x5f, 0xee, 0xe9, 0x29, 0xfa, 0x60, 0x34, 0xfb, 0xcb, 0xaa, 0x07, 0xe9, 0x54, 0xfb, - 0x90, 0x21, 0xfb, 0x57, 0x66, 0xf8, 0x78, 0x81, 0x00, 0xf4, 0x88, 0x00, 0x7f, 0x1e, 0xf9, 0xf8, - 0x75, 0x01, 0xa2, 0x7e, 0xfb, 0x73, 0x5d, 0xfa, 0xc7, 0xd9, 0xfe, 0xe9, 0xb9, 0x08, 0xee, 0x6a, - 0x05, 0x60, 0xe1, 0x01, 0xd0, 0x57, 0xfe, 0x9a, 0xe7, 0xfb, 0x1f, 0xdc, 0xf7, 0x82, 0xb3, 0xf8, - 0xc2, 0x0a, 0xfc, 0x82, 0xe3, 0xf7, 0x90, 0x8d, 0x56, 0x19, 0xdb, 0x41, 0x9d, 0x9c, 0xe9, 0x70, - 0x02, 0x17, 0xad, 0x05, 0xfe, 0xfd, 0xd2, 0xdb, 0xf5, 0xdc, 0xf5, 0x6e, 0x58, 0x0f, 0x40, 0x97, - 0x03, 0xb8, 0xb0, 0xf1, 0xe7, 0xf1, 0xf6, 0x76, 0xaf, 0xfc, 0xbb, 0xa9, 0x09, 0x2a, 0x40, 0xfa, - 0xad, 0xdb, 0xfb, 0x2c, 0x61, 0xfa, 0xda, 0x3a, 0xfe, 0xc9, 0x60, 0x02, 0x56, 0x68, 0xf9, 0xfa, - 0x7d, 0xfd, 0xab, 0xf9, 0xfc, 0x90, 0xe6, 0xfb, 0x58, 0x3c, 0xfb, 0x41, 0x53, 0x06, 0x96, 0xaf, - 0x07, 0x28, 0x47, 0x07, 0x3b, 0x41, 0xfd, 0x8d, 0x33, 0xfb, 0x3a, 0x0b, 0xfc, 0x27, 0xa6, 0xf7, - 0x04, 0x57, 0xfb, 0x67, 0xec, 0xf8, 0xbf, 0xad, 0x53, 0xaa, 0xb5, 0x41, 0x88, 0x48, 0xed, 0x78, - 0xf4, 0x17, 0x2c, 0x82, 0xfd, 0x51, 0xa8, 0xdc, 0xa1, 0xc0, 0xf2, 0xb7, 0x41, 0x08, 0x32, 0x49, - 0x08, 0xa9, 0xec, 0xf4, 0x5b, 0xda, 0xf3, 0xa8, 0x73, 0xff, 0x9e, 0x52, 0x0a, 0xf7, 0xc4, 0xf9, - 0x66, 0x78, 0xfd, 0x14, 0x22, 0xfb, 0x20, 0x66, 0xfc, 0x41, 0x57, 0x02, 0x10, 0x79, 0xf9, 0xa7, - 0x1b, 0xfb, 0x3c, 0x69, 0xfd, 0x52, 0xce, 0xff, 0x48, 0x91, 0xf8, 0x31, 0x31, 0x05, 0x14, 0xfe, - 0x07, 0x92, 0x10, 0x08, 0xde, 0x0f, 0x01, 0x1d, 0x35, 0xfa, 0xb3, 0xe1, 0xfd, 0x2e, 0xcf, 0xf7, - 0x1e, 0x7b, 0xfb, 0xad, 0x90, 0xf9, 0x9c, 0x73, 0x53, 0x52, 0x35, 0x3d, 0xae, 0x59, 0xf1, 0x9e, - 0x67, 0x19, 0x9d, 0xed, 0xfa, 0x91, 0xdf, 0xdf, 0xb5, 0x0c, 0xef, 0xea, 0xd5, 0x01, 0xdd, 0x36, - 0x0c, 0xd7, 0xd3, 0xf8, 0xbd, 0x9a, 0xf0, 0xec, 0xa8, 0x01, 0x9b, 0x74, 0x0c, 0xbb, 0xc1, 0xf8, - 0xde, 0xaf, 0xfd, 0xb2, 0x9c, 0xfa, 0x74, 0x29, 0xfc, 0xbc, 0x46, 0x00, 0x2f, 0xec, 0xf8, 0xda, - 0x0b, 0xfd, 0x64, 0x80, 0xfb, 0x17, 0xea, 0x01, 0x6b, 0xf4, 0xfc, 0x2c, 0x06, 0x02, 0xca, 0x32, - 0x04, 0xdd, 0x34, 0x08, 0xf4, 0x3e, 0x06, 0xdb, 0xc0, 0xf9, 0x6d, 0x15, 0xfc, 0x01, 0xa3, 0xfb, - 0x6a, 0x4b, 0xfb, 0x90, 0xef, 0xf8, 0xc6, 0x68, 0x4f, 0x29, 0x2e, 0x3b, 0x59, 0x71, 0xf7, 0xa5, - 0xe1, 0x17, 0xb8, 0x22, 0xf9, 0x84, 0x3b, 0xe7, 0x0c, 0x67, 0xe8, 0x0d, 0x9a, 0xfa, 0x75, 0x86, - 0x13, 0x91, 0xd3, 0xfa, 0xa1, 0x5a, 0xed, 0xb4, 0xb2, 0x05, 0xa7, 0x3f, 0x0c, 0xd5, 0xfa, 0xf7, - 0x58, 0x96, 0xfe, 0x37, 0x84, 0xf7, 0x9b, 0xa6, 0xfc, 0xa5, 0x6b, 0x01, 0x1b, 0x63, 0xf5, 0xf4, - 0xe1, 0xff, 0xe6, 0xe3, 0xfd, 0xb5, 0xa0, 0xff, 0xf0, 0xc4, 0x01, 0xac, 0x60, 0x01, 0xde, 0xf5, - 0xff, 0x60, 0x1d, 0x07, 0xfa, 0x15, 0x06, 0xdc, 0xee, 0xfd, 0xa7, 0x7d, 0xfc, 0x4a, 0x55, 0xfb, - 0x90, 0x88, 0xfd, 0x17, 0xbe, 0xf8, 0xb8, 0x5f, 0x4e, 0x34, 0x97, 0x36, 0xfa, 0xd1, 0xfb, 0xd5, - 0x00, 0x17, 0x1d, 0xad, 0xf4, 0xac, 0xbb, 0xef, 0x0c, 0xa5, 0xe6, 0x14, 0x4c, 0xf1, 0x62, 0xf3, - 0x18, 0xed, 0xc0, 0xff, 0x06, 0x39, 0xea, 0xb3, 0xab, 0x07, 0x3a, 0x6f, 0x0c, 0x3b, 0x5c, 0xf6, - 0x71, 0x00, 0xfe, 0xd9, 0x55, 0xf6, 0x91, 0x57, 0xfe, 0x2f, 0xb4, 0x00, 0xf2, 0x01, 0xf4, 0xba, - 0xe5, 0x02, 0x60, 0x9a, 0x00, 0xb1, 0xca, 0xfc, 0x3b, 0x74, 0x03, 0xb9, 0x44, 0x04, 0x4f, 0x56, - 0xfd, 0xfc, 0x95, 0x03, 0x38, 0xc7, 0x03, 0xba, 0xa4, 0x01, 0x6c, 0xb8, 0xff, 0x98, 0xfc, 0xf9, - 0x11, 0xf8, 0xfe, 0xf2, 0x8f, 0xfa, 0x73, 0xad, 0x52, 0x95, 0x3b, 0x31, 0xbd, 0xab, 0xf5, 0x2c, - 0x0f, 0x1c, 0x60, 0xbc, 0xf2, 0x74, 0xd6, 0xee, 0x4d, 0x22, 0xea, 0xb8, 0x9d, 0xf0, 0xfa, 0x69, - 0x17, 0x59, 0xf9, 0x01, 0x09, 0x80, 0xec, 0x88, 0x4b, 0x06, 0x43, 0x49, 0x0c, 0xda, 0xae, 0xf4, - 0x89, 0xaa, 0xfc, 0xc1, 0xfc, 0xf7, 0xa9, 0xc6, 0xfe, 0x31, 0x5d, 0x01, 0xec, 0x97, 0xf4, 0xe0, - 0xcc, 0x02, 0x74, 0xcf, 0x01, 0xce, 0x73, 0xfe, 0x2f, 0x50, 0x03, 0x84, 0xb5, 0x03, 0xda, 0xae, - 0xfd, 0xa8, 0x18, 0x01, 0xba, 0xb2, 0x02, 0x4a, 0xf7, 0x00, 0x2a, 0x06, 0x02, 0x1f, 0x3a, 0xfd, - 0x14, 0xbd, 0xfc, 0x24, 0x6d, 0xfd, 0x3d, 0xa6, 0x56, 0x6f, 0x27, 0x2a, 0x5e, 0x74, 0xed, 0xb4, - 0xce, 0x25, 0x2c, 0x32, 0xf1, 0xf3, 0xd4, 0xe7, 0x0d, 0x51, 0xf1, 0x1c, 0x63, 0xf3, 0xc6, 0x8d, - 0x12, 0x01, 0xce, 0x03, 0x24, 0x4f, 0xed, 0xd5, 0x47, 0x03, 0xcf, 0xfa, 0x0d, 0x01, 0xfa, 0xf3, - 0xec, 0x6c, 0xf9, 0x4f, 0xfc, 0xfa, 0x1a, 0x48, 0x00, 0x8b, 0x15, 0x01, 0x39, 0x90, 0xf5, 0x0e, - 0x36, 0x01, 0xee, 0x8d, 0x02, 0xd1, 0xd3, 0x00, 0x7d, 0xac, 0x01, 0x3b, 0xa1, 0x02, 0x70, 0xf5, - 0xfe, 0xa4, 0x34, 0xff, 0x53, 0xac, 0x01, 0x58, 0x76, 0x00, 0xf0, 0x3e, 0x01, 0xf7, 0x17, 0x01, - 0x8c, 0x81, 0xfc, 0x15, 0x20, 0xfd, 0x0b, 0x4a, 0x55, 0xcb, 0x1e, 0x24, 0x4b, 0x82, 0xe8, 0x9c, - 0x0b, 0x30, 0x63, 0xa5, 0xf2, 0x5e, 0x41, 0xdf, 0xf4, 0x53, 0xf7, 0x97, 0xa9, 0xfa, 0xee, 0xf4, - 0x0b, 0x65, 0xe4, 0x00, 0xfd, 0x9f, 0xf1, 0x5a, 0xb8, 0x00, 0xce, 0xfc, 0x0d, 0x64, 0xf8, 0xf4, - 0xea, 0x14, 0xf8, 0x7c, 0x18, 0xfe, 0xba, 0x13, 0x00, 0x3d, 0xd8, 0xff, 0xa3, 0xd7, 0xf7, 0x32, - 0xd2, 0x01, 0x5a, 0x91, 0x00, 0xa5, 0x52, 0x01, 0x35, 0x71, 0x02, 0x63, 0x19, 0x02, 0xb0, 0x9e, - 0xfe, 0x0e, 0x29, 0x00, 0xf7, 0xed, 0xff, 0xdb, 0xf3, 0xfe, 0xfc, 0x34, 0x03, 0x69, 0x72, 0x00, - 0xa1, 0x76, 0xfe, 0x7a, 0x61, 0xfe, 0x4b, 0xe7, 0x52, 0x6b, 0xd2, 0x1e, 0x17, 0xdc, 0xe6, 0x85, - 0x40, 0x36, 0x71, 0x34, 0xf3, 0xd6, 0x72, 0xd9, 0xfd, 0xbb, 0xfe, 0x7d, 0x47, 0xfd, 0x11, 0x43, - 0x04, 0x2e, 0x5b, 0x02, 0x1a, 0x5b, 0xf4, 0x67, 0x14, 0xfd, 0xef, 0x13, 0x0e, 0x5b, 0xef, 0xf7, - 0xa1, 0xb6, 0xf7, 0xb1, 0xe7, 0xff, 0x17, 0x26, 0x00, 0xa2, 0xca, 0xfd, 0x3d, 0x77, 0xfa, 0xd7, - 0x25, 0x02, 0x5d, 0x8e, 0xfe, 0xa8, 0xf2, 0x00, 0x89, 0x1e, 0x03, 0xea, 0xe6, 0x01, 0x8c, 0x2b, - 0xfe, 0x10, 0x74, 0x00, 0x52, 0x47, 0x00, 0x1c, 0xca, 0xfe, 0xda, 0x65, 0x02, 0xbd, 0x83, 0x00, - 0xbd, 0xfc, 0xfe, 0x97, 0xfa, 0xff, 0x1f, 0xf8, 0x4d, 0x46, 0x44, 0x1d, 0xf4, 0x89, 0xe7, 0x30, - 0x5d, 0x33, 0xb2, 0x66, 0xf5, 0xe6, 0x66, 0xde, 0xd1, 0x9c, 0x00, 0xbf, 0x0d, 0xfa, 0x7b, 0xfb, - 0x01, 0x60, 0x1e, 0x03, 0xa8, 0x9e, 0xf6, 0xdb, 0x61, 0xfb, 0x71, 0x2e, 0x0d, 0xf7, 0xba, 0xfa, - 0x96, 0x34, 0xf8, 0xd4, 0x86, 0x00, 0x51, 0xdf, 0xff, 0x09, 0x9f, 0xfd, 0x32, 0x0d, 0xfb, 0x16, - 0x40, 0x01, 0xc9, 0x76, 0xff, 0x4a, 0xf5, 0x00, 0xac, 0x6c, 0x01, 0x34, 0x3a, 0x02, 0x44, 0x9d, - 0xfe, 0x05, 0xd5, 0xff, 0xf2, 0xfa, 0x01, 0x04, 0xb9, 0xff, 0x6e, 0xf1, 0xff, 0x28, 0x4c, 0x00, - 0x1e, 0xb0, 0xff, 0x08, 0xd5, 0xff, 0xde, 0x58, 0x47, 0x27, 0xb2, 0x1c, 0x06, 0xba, 0xe9, 0x60, - 0x0c, 0x2f, 0x14, 0x39, 0xfa, 0xeb, 0x02, 0xe1, 0xa1, 0x59, 0xff, 0x13, 0xc7, 0xfb, 0x06, 0xdd, - 0xfe, 0x61, 0xb9, 0x01, 0x4d, 0x45, 0xfa, 0xdf, 0x68, 0xfb, 0xe3, 0xeb, 0x0a, 0x14, 0x60, 0xfd, - 0x31, 0x7f, 0xf9, 0x8e, 0x20, 0xff, 0x91, 0xc6, 0x00, 0x89, 0x39, 0xfe, 0xa3, 0x0e, 0xfa, 0x38, - 0xa6, 0x00, 0xdf, 0xf0, 0x00, 0xaf, 0xc3, 0x00, 0x75, 0x03, 0x00, 0xcd, 0xa1, 0x01, 0x90, 0x5e, - 0xff, 0xe6, 0x08, 0x01, 0x65, 0x17, 0x02, 0x8c, 0xf2, 0xff, 0xdf, 0x6f, 0xff, 0x51, 0x28, 0xff, - 0xc8, 0x0e, 0x00, 0xc0, 0x85, 0xff, 0xda, 0xef, 0x38, 0x02, 0x81, 0x20, 0x41, 0xba, 0xfc, 0x25, - 0x80, 0x16, 0x08, 0x75, 0xf5, 0x4f, 0x1a, 0xf6, 0x95, 0x63, 0xf9, 0xde, 0x17, 0xf9, 0xb4, 0xeb, - 0x06, 0x75, 0xdf, 0xff, 0x25, 0x61, 0xf6, 0xb6, 0xd9, 0x03, 0xca, 0x50, 0x08, 0x95, 0xbc, 0xfa, - 0x71, 0xd5, 0xfc, 0xf7, 0x61, 0xfb, 0x7b, 0xc1, 0x00, 0x8c, 0xba, 0xfe, 0xb0, 0x8b, 0xf9, 0x6d, - 0x6b, 0x01, 0x8f, 0xd4, 0xfe, 0xb8, 0x74, 0xfe, 0x87, 0x32, 0x01, 0xc7, 0xa8, 0x01, 0x20, 0x70, - 0x02, 0xa4, 0x81, 0x04, 0xd4, 0x00, 0xff, 0xe3, 0xf4, 0xfc, 0xff, 0xf9, 0xfe, 0xfc, 0x6c, 0xfd, - 0x62, 0x2c, 0xff, 0xfa, 0x69, 0x01, 0x99, 0x60, 0x31, 0x37, 0x07, 0x20, 0x7c, 0xfe, 0xfd, 0x6e, - 0x69, 0x14, 0x2e, 0x7c, 0xfa, 0x42, 0xe8, 0xf4, 0x33, 0xc7, 0xfa, 0x50, 0xb8, 0xfa, 0xd6, 0xc1, - 0x03, 0x08, 0x61, 0x00, 0x6a, 0x62, 0xf8, 0xb0, 0xf1, 0x02, 0xd4, 0x4f, 0x07, 0x4a, 0x4c, 0xfc, - 0x0f, 0xb1, 0xfc, 0xb9, 0xca, 0xfb, 0xad, 0xde, 0x00, 0x8c, 0x28, 0xfe, 0x64, 0x0c, 0xfa, 0x31, - 0x75, 0x01, 0xd6, 0x56, 0xfe, 0x70, 0x3b, 0xfe, 0x1d, 0xe1, 0x01, 0xd0, 0x94, 0x01, 0xed, 0x12, - 0x02, 0x69, 0x3d, 0x03, 0x94, 0xbb, 0xfe, 0xc9, 0xa6, 0xfe, 0xa5, 0x13, 0xff, 0x77, 0x08, 0xfd, - 0x4b, 0xc7, 0xff, 0x79, 0x5c, 0x01, 0x18, 0x24, 0x2b, 0xfa, 0xdc, 0x1e, 0x25, 0x6e, 0xff, 0x55, - 0x0d, 0x14, 0xb5, 0xc6, 0xfc, 0xd7, 0x78, 0xf4, 0xcd, 0xf7, 0xfc, 0x80, 0x36, 0xfb, 0x1f, 0x2d, - 0x02, 0x77, 0x84, 0x00, 0x3c, 0x42, 0xfa, 0x51, 0xcf, 0x02, 0xbe, 0x13, 0x06, 0xb2, 0x86, 0xfd, - 0x1a, 0x38, 0xfd, 0x54, 0xac, 0xfc, 0x52, 0x4c, 0x00, 0xf9, 0xfa, 0xfd, 0x09, 0x69, 0xfb, 0xba, - 0xe3, 0x00, 0x1e, 0x20, 0xfe, 0xf5, 0xdf, 0xfe, 0x4c, 0xbb, 0x01, 0xb6, 0xb5, 0x01, 0xff, 0x2f, - 0x02, 0x85, 0xb5, 0x01, 0x32, 0xdd, 0xfe, 0x1a, 0x40, 0x00, 0x7a, 0x6a, 0xff, 0x73, 0x39, 0xfd, - 0x77, 0x0c, 0x00, 0xe7, 0xb6, 0x01, 0x29, 0xe8, 0x24, 0x9c, 0xa3, 0x1c, 0x2d, 0x0d, 0x03, 0x7e, - 0xb2, 0x12, 0x46, 0x0d, 0xfd, 0x29, 0x05, 0xf7, 0xfe, 0x7c, 0xfd, 0x4f, 0x2d, 0xfb, 0x03, 0x30, - 0x02, 0xfd, 0x50, 0x00, 0x1e, 0x62, 0xfb, 0xa1, 0x98, 0x02, 0xd9, 0x7c, 0x05, 0x44, 0x13, 0xfe, - 0x70, 0xb2, 0xfd, 0x6f, 0xa9, 0xfd, 0x23, 0x9a, 0xff, 0x83, 0x25, 0xfe, 0xc3, 0x34, 0xfc, 0x4f, - 0x5e, 0x00, 0xec, 0xa9, 0xfe, 0xe1, 0x1e, 0xff, 0x50, 0x47, 0x01, 0x6c, 0xe6, 0x01, 0x23, 0xe2, - 0x01, 0x27, 0xb0, 0x00, 0xec, 0xd8, 0xff, 0xcd, 0x10, 0x01, 0x6b, 0xdc, 0xff, 0xe7, 0x29, 0xfe, - 0xc6, 0xee, 0xff, 0xcf, 0x2a, 0x02, 0x9b, 0x68, 0x1e, 0xd9, 0xaa, 0x1a, 0x41, 0x84, 0x07, 0x6c, - 0xd3, 0x0f, 0xbb, 0xc4, 0xfd, 0x35, 0xe7, 0xfa, 0x39, 0xd7, 0xfc, 0xae, 0xe6, 0xfa, 0xe4, 0xe0, - 0x02, 0x83, 0xb6, 0x00, 0xf4, 0x8a, 0xfb, 0x7f, 0x63, 0x02, 0x01, 0x1f, 0x05, 0xa8, 0x6d, 0xfe, - 0x3b, 0xbc, 0xfe, 0x44, 0xf7, 0xfd, 0x53, 0xf8, 0xfe, 0x77, 0xa5, 0xfe, 0xf8, 0x0e, 0xfd, 0xa5, - 0xf4, 0xff, 0xa0, 0xdf, 0xfe, 0xb9, 0x7a, 0xff, 0xc5, 0xdf, 0x00, 0xe6, 0xe2, 0x01, 0x33, 0x54, - 0x01, 0x73, 0xcd, 0x00, 0xb5, 0x1d, 0x01, 0xb0, 0xab, 0x01, 0x49, 0x8c, 0x00, 0x58, 0x86, 0xfe, - 0xbf, 0x33, 0x00, 0x1e, 0xcf, 0x01, 0xea, 0x09, 0x18, 0x5d, 0x71, 0x18, 0xbc, 0x7d, 0x0b, 0xa5, - 0xba, 0x0d, 0x8a, 0xfd, 0xfe, 0x22, 0xf2, 0xfd, 0x02, 0x3d, 0xfc, 0x98, 0xce, 0xfa, 0xe5, 0xb6, - 0x03, 0x95, 0x19, 0x01, 0x41, 0x90, 0xfb, 0xbf, 0xcf, 0x01, 0x6d, 0xa2, 0x04, 0xcb, 0xe6, 0xff, - 0x29, 0x37, 0xff, 0x13, 0x2b, 0xfd, 0x99, 0x43, 0xff, 0x9f, 0xd8, 0xff, 0x27, 0x21, 0xfd, 0x8b, - 0x6d, 0xff, 0xde, 0x5f, 0xff, 0x88, 0x59, 0xff, 0x6e, 0x27, 0x01, 0xf3, 0xd3, 0x01, 0x43, 0xc1, - 0x00, 0x11, 0xda, 0x01, 0xb8, 0x98, 0x02, 0xf8, 0x3f, 0x02, 0x7f, 0x32, 0x00, 0x93, 0x8e, 0xfe, - 0xee, 0x75, 0x00, 0x43, 0xec, 0x00, 0xcb, 0x63, 0x14, 0x1a, 0xd5, 0x16, 0xf8, 0x42, 0x0c, 0x3e, - 0xf2, 0x0b, 0x84, 0x05, 0x00, 0x4a, 0x61, 0xff, 0xf9, 0x0a, 0xfd, 0x59, 0x73, 0xfb, 0x53, 0x08, - 0x03, 0xb5, 0x47, 0x01, 0x80, 0xb0, 0xfc, 0x40, 0x72, 0x01, 0x97, 0xa1, 0x03, 0x60, 0xb3, 0x00, - 0x97, 0x91, 0xff, 0x17, 0xdf, 0xfc, 0xc3, 0xea, 0xff, 0x7a, 0x68, 0x00, 0x15, 0xe5, 0xfc, 0x2b, - 0x37, 0xff, 0xb7, 0xd1, 0xff, 0x24, 0xc6, 0xff, 0xc9, 0x68, 0x01, 0x33, 0xc2, 0x01, 0xd8, 0x57, - 0x01, 0xec, 0x2a, 0x03, 0xe9, 0x4e, 0x03, 0x08, 0x82, 0x01, 0x0f, 0x24, 0xff, 0x63, 0xc9, 0xfe, - 0x50, 0x20, 0x00, 0x87, 0x71, 0x00, 0x6e, 0xf5, 0x11, 0xeb, 0xff, 0x14, 0xef, 0x57, 0x0c, 0x32, - 0x23, 0x0b, 0xe2, 0x31, 0x00, 0x93, 0xb2, 0x00, 0xbb, 0x79, 0xfe, 0x4e, 0x73, 0xfb, 0x44, 0x89, - 0x02, 0xa7, 0x0f, 0x02, 0x0b, 0xc7, 0xfd, 0x77, 0x99, 0x00, 0xae, 0xef, 0x02, 0x11, 0xd6, 0x01, - 0x0c, 0xbd, 0xff, 0x0e, 0xf8, 0xfc, 0xa7, 0x83, 0x00, 0x42, 0x57, 0x00, 0x9d, 0x16, 0xfd, 0xdf, - 0xec, 0xff, 0xf0, 0xed, 0xff, 0x92, 0x90, 0x00, 0x60, 0xae, 0x02, 0x73, 0x00, 0x02, 0x37, 0x05, - 0x02, 0x66, 0x9f, 0x03, 0xc4, 0x87, 0x02, 0xb7, 0x4d, 0x00, 0x80, 0xda, 0xfe, 0x81, 0xc7, 0xfe, - 0xd5, 0x64, 0x00, 0x19, 0xca, 0x00, 0xfd, 0x40, 0x10, 0xb1, 0xc8, 0x12, 0x8a, 0xa2, 0x0b, 0x34, - 0x3f, 0x0b, 0x28, 0xdc, 0x00, 0xb5, 0xb6, 0x00, 0xc2, 0xa5, 0xfe, 0x8f, 0x92, 0xfc, 0x41, 0xcf, - 0x02, 0x92, 0xb2, 0x01, 0x63, 0xbf, 0xfd, 0xb3, 0x8d, 0x00, 0x5e, 0x26, 0x03, 0x84, 0xf3, 0x01, - 0x71, 0x67, 0xff, 0x38, 0x34, 0xfd, 0x11, 0x03, 0x01, 0xb7, 0x67, 0x00, 0x8a, 0x51, 0xfd, 0xd1, - 0x97, 0x00, 0x80, 0xf6, 0x00, 0x3f, 0x11, 0x02, 0x90, 0xfb, 0x02, 0x84, 0x1f, 0x01, 0x77, 0xfe, - 0x01, 0x49, 0x0e, 0x03, 0xe1, 0xe0, 0x00, 0x41, 0x64, 0xff, 0x03, 0x61, 0xff, 0x19, 0x54, 0xff, - 0xd1, 0xe3, 0xff, 0x20, 0xd7, 0xff, 0x1b, 0xca, 0x0f, 0x6f, 0x0b, 0x12, 0xed, 0x00, 0x0a, 0x78, - 0xdd, 0x09, 0xfd, 0x59, 0x01, 0x95, 0x35, 0x01, 0x75, 0x61, 0xff, 0x57, 0x57, 0xfd, 0xa1, 0x7c, - 0x02, 0x36, 0x90, 0x01, 0xd2, 0x63, 0xfe, 0xb2, 0x46, 0x01, 0xf1, 0xdd, 0x02, 0xf9, 0xdc, 0x00, - 0xc0, 0xf7, 0xff, 0x5a, 0xa2, 0xfe, 0x02, 0xbd, 0x00, 0x51, 0x8d, 0x00, 0x69, 0x33, 0xff, 0x56, - 0x15, 0x02, 0xe8, 0x02, 0x02, 0xea, 0x1b, 0x02, 0x56, 0x69, 0x01, 0x3d, 0x9f, 0x00, 0x3c, 0xc0, - 0x01, 0x8c, 0xbe, 0x01, 0x60, 0x88, 0x00, 0x7a, 0xad, 0xff, 0x87, 0x3c, 0xff, 0x05, 0x08, 0xff, - 0xed, 0xdb, 0xff, 0xa7, 0xaf, 0xff, 0x04, 0x6a, 0x0e, 0xef, 0x71, 0x10, 0x85, 0x95, 0x09, 0x71, - 0xdf, 0x09, 0x61, 0xdb, 0x01, 0xd2, 0x43, 0x01, 0x32, 0x88, 0xff, 0x94, 0x23, 0xfe, 0xb4, 0xc8, - 0x02, 0x31, 0xc6, 0x01, 0x2d, 0x91, 0xfe, 0x10, 0x1e, 0x01, 0x74, 0xd1, 0x02, 0xec, 0x28, 0x01, - 0xc2, 0x82, 0x00, 0xd2, 0x71, 0xff, 0xdd, 0xde, 0x01, 0x4b, 0x20, 0x02, 0x3f, 0x7b, 0x00, 0x37, - 0xbd, 0x01, 0x91, 0x91, 0x01, 0x30, 0xf6, 0x00, 0x6f, 0x06, 0x00, 0xb1, 0xb4, 0x00, 0x96, 0x7d, - 0x01, 0x05, 0x86, 0x01, 0x70, 0x2f, 0x00, 0xf8, 0x3b, 0xff, 0xa8, 0x43, 0xff, 0x21, 0x0c, 0xff, - 0x97, 0xc9, 0xff, 0x6d, 0x37, 0xff, 0xda, 0x59, 0x0d, 0x50, 0x7c, 0x0f, 0x6d, 0x22, 0x09, 0xb9, - 0x67, 0x09, 0xdd, 0x33, 0x02, 0x99, 0x14, 0x01, 0x95, 0xf0, 0xff, 0x5f, 0x6c, 0xff, 0x02, 0xfd, - 0x02, 0x37, 0x3f, 0x01, 0xc0, 0xb4, 0xfe, 0x6a, 0x2a, 0x02, 0x5f, 0xa8, 0x02, 0x68, 0x2b, 0x01, - 0xff, 0xc7, 0x02, 0x55, 0x89, 0x01, 0x6a, 0x29, 0x02, 0xc3, 0xfa, 0x01, 0xe3, 0xe3, 0xff, 0xeb, - 0xbf, 0x00, 0x8e, 0xc8, 0x00, 0xa4, 0xa5, 0xff, 0xd4, 0x57, 0x00, 0x68, 0x66, 0x01, 0xea, 0xa2, - 0x00, 0xd9, 0xc3, 0x00, 0xb7, 0xff, 0xff, 0xfd, 0x47, 0xff, 0x25, 0x21, 0xff, 0x51, 0x07, 0xff, - 0x54, 0x6f, 0xff, 0xb7, 0xf3, 0xfe, 0xf6, 0xd5, 0x0c, 0x55, 0x34, 0x0f, 0xd3, 0xc6, 0x08, 0xad, - 0x09, 0x08, 0x84, 0xb6, 0x01, 0xa7, 0xf1, 0x01, 0x7e, 0x4c, 0x01, 0xf5, 0x39, 0xff, 0xcf, 0x50, - 0x02, 0x7c, 0x32, 0x02, 0xaa, 0xa2, 0xff, 0x4a, 0x2f, 0x02, 0xf5, 0x2f, 0x04, 0x0e, 0x95, 0x03, - 0xb9, 0x92, 0x03, 0xd0, 0x00, 0x01, 0xa2, 0x9c, 0x00, 0xe4, 0xb0, 0x00, 0xc6, 0x21, 0xff, 0x78, - 0x52, 0x00, 0xf5, 0x8f, 0x00, 0xf7, 0xa7, 0xff, 0x17, 0x39, 0x00, 0xbb, 0xb2, 0x00, 0xa8, 0xab, - 0x00, 0x83, 0x45, 0x00, 0xcd, 0x65, 0xff, 0xa6, 0x0d, 0xff, 0x37, 0xf7, 0xfe, 0xfd, 0x1d, 0xff, - 0x9f, 0xfe, 0xfe, 0x5c, 0x8b, 0xfe, 0x27, 0xe2, 0x0b, 0x06, 0xcf, 0x0d, 0x32, 0xfb, 0x08, 0x7f, - 0xed, 0x08, 0xb5, 0x20, 0x02, 0x7e, 0x16, 0x01, 0xb7, 0xfc, 0x00, 0x62, 0x6e, 0x01, 0xff, 0x0b, - 0x03, 0xf5, 0xa7, 0x01, 0x3b, 0xe3, 0x01, 0xe0, 0x05, 0x05, 0xea, 0xde, 0x04, 0x30, 0xa8, 0x02, - 0xc7, 0x1e, 0x02, 0xdd, 0x54, 0xff, 0xc7, 0x84, 0xff, 0x15, 0x33, 0x00, 0xae, 0x7b, 0xff, 0x2b, - 0x98, 0x00, 0xf1, 0xb1, 0xff, 0x96, 0x88, 0xff, 0xbe, 0x56, 0x00, 0x44, 0xa8, 0x00, 0xf3, 0x23, - 0x00, 0x36, 0x81, 0xff, 0x66, 0x46, 0xff, 0x79, 0xd1, 0xfe, 0xc7, 0x25, 0xff, 0x43, 0xef, 0xfe, - 0xe0, 0x7f, 0xfe, 0x0f, 0x64, 0xfe, 0x9d, 0x83, 0x0b, 0x60, 0x6c, 0x0e, 0xfe, 0x8f, 0x09, 0x2e, - 0x5f, 0x07, 0x6b, 0xd4, 0x00, 0xb5, 0x79, 0x02, 0x20, 0xa5, 0x02, 0xe2, 0x22, 0x02, 0x7b, 0xe1, - 0x04, 0x1a, 0xce, 0x04, 0x02, 0xfe, 0x02, 0x8a, 0xc3, 0x03, 0xf2, 0x21, 0x03, 0xea, 0x55, 0x00, - 0xd5, 0x4c, 0x00, 0xbe, 0x1e, 0xff, 0x2b, 0xff, 0xff, 0xf2, 0x24, 0x00, 0x18, 0x1d, 0xff, 0x4c, - 0x1d, 0x00, 0x87, 0xe3, 0xff, 0x44, 0xd6, 0xff, 0x1d, 0x1a, 0x00, 0x70, 0x33, 0x00, 0x11, 0x23, - 0xff, 0x75, 0x46, 0xff, 0x5f, 0x36, 0xff, 0x2e, 0xcf, 0xfe, 0x6e, 0x27, 0xff, 0x0f, 0x6c, 0xfe, - 0xe7, 0x65, 0xfe, 0x2c, 0x81, 0xfe, 0x1a, 0x81, 0x0b, 0xdc, 0x5b, 0x0e, 0xc4, 0x9b, 0x09, 0x99, - 0x49, 0x07, 0x8a, 0xbf, 0x00, 0xa3, 0xfc, 0x02, 0x03, 0x2b, 0x06, 0xfa, 0xae, 0x06, 0xe0, 0xce, - 0x04, 0x3b, 0x08, 0x03, 0x8e, 0x9e, 0x01, 0xcf, 0xfd, 0x00, 0xc1, 0x8c, 0x01, 0xe4, 0x99, 0xff, - 0xde, 0x22, 0x00, 0xd5, 0xbc, 0xff, 0x45, 0xf6, 0xfe, 0x60, 0xaf, 0xff, 0xc4, 0xbc, 0xff, 0x15, - 0xfe, 0xff, 0x8d, 0xe1, 0xff, 0xc3, 0x86, 0xff, 0x29, 0x5b, 0xff, 0xee, 0xbc, 0xff, 0x03, 0xe3, - 0xfe, 0xf9, 0xd4, 0xfe, 0x9f, 0x1f, 0xff, 0x93, 0xd0, 0xfe, 0x3a, 0xeb, 0xfe, 0xfe, 0x89, 0xfe, - 0x02, 0x4f, 0xfe, 0x61, 0xa5, 0xfe, 0x14, 0x1e, 0x0b, 0x25, 0xfb, 0x0d, 0x4a, 0x91, 0x09, 0xf8, - 0x5e, 0x08, 0x78, 0x65, 0x04, 0xd2, 0xbf, 0x05, 0x52, 0x92, 0x06, 0xe6, 0x00, 0x07, 0x23, 0x9e, - 0x03, 0x0e, 0x03, 0xff, 0xc8, 0xfd, 0xfe, 0x25, 0x6f, 0x01, 0x15, 0x90, 0x01, 0xa9, 0xf2, 0xfe, - 0xe3, 0x59, 0xff, 0xab, 0x59, 0xff, 0x6c, 0x48, 0xff, 0xc5, 0x92, 0xff, 0xd9, 0xa4, 0xff, 0x20, - 0xce, 0xff, 0x9b, 0x37, 0xff, 0x96, 0x36, 0xff, 0x60, 0x4b, 0xff, 0x2e, 0xdd, 0xfe, 0xf5, 0x60, - 0xfe, 0x5b, 0xed, 0xfe, 0x50, 0xda, 0xfe, 0xf2, 0xfd, 0xfe, 0xeb, 0xf1, 0xfe, 0xcd, 0x45, 0xfe, - 0x13, 0xa6, 0xfe, 0xc4, 0xdd, 0xfe, 0x64, 0x05, 0x0a, 0x92, 0x0a, 0x10, 0xda, 0x86, 0x0d, 0x38, - 0x5a, 0x0a, 0x14, 0x85, 0x05, 0x27, 0x82, 0x05, 0x73, 0x28, 0x06, 0xe9, 0xd9, 0x03, 0xf3, 0x08, - 0x00, 0xc5, 0x1b, 0x00, 0xdb, 0xe6, 0xff, 0x92, 0x43, 0x00, 0xd6, 0xe0, 0x00, 0xa7, 0x0d, 0xff, - 0x32, 0x00, 0x00, 0xeb, 0x5c, 0xff, 0x59, 0xf6, 0xfe, 0x6a, 0x08, 0x00, 0x50, 0x6a, 0xff, 0x04, - 0x57, 0xff, 0xb4, 0x9a, 0xff, 0x70, 0x47, 0xff, 0xea, 0x9d, 0xfe, 0x8b, 0x89, 0xfe, 0xee, 0x9b, - 0xfe, 0x35, 0x2d, 0xff, 0x84, 0x3a, 0xff, 0xa5, 0x19, 0xff, 0x65, 0xfd, 0xfe, 0x0b, 0x99, 0xfe, - 0xbf, 0xdf, 0xfe, 0xe4, 0xdd, 0xfe, 0x6f, 0xae, 0x0c, 0xf4, 0x5f, 0x17, 0x59, 0x69, 0x0f, 0xc7, - 0xe0, 0x05, 0xff, 0x01, 0x03, 0x16, 0x63, 0x05, 0x39, 0x04, 0x03, 0x49, 0x86, 0x01, 0x96, 0x57, - 0x02, 0xc2, 0xaa, 0xff, 0xcd, 0x8f, 0xfe, 0x01, 0xc7, 0xff, 0x27, 0xcd, 0x01, 0xe5, 0xce, 0xff, - 0x2b, 0x8d, 0xfe, 0x40, 0xbc, 0xff, 0xcf, 0x3b, 0xff, 0x7b, 0xeb, 0xfe, 0xdf, 0x9c, 0xff, 0xf4, - 0xc3, 0xff, 0xba, 0x3b, 0xff, 0xbc, 0xc7, 0xfe, 0x86, 0x65, 0xfe, 0x40, 0x99, 0xfe, 0x25, 0x05, - 0xff, 0x7f, 0x34, 0xff, 0xd3, 0x4c, 0xff, 0xf5, 0x21, 0xff, 0x20, 0xd8, 0xfe, 0x19, 0xbb, 0xfe, - 0x6d, 0xc2, 0xfe, 0x8e, 0xa1, 0xfe, 0x64, 0xc3, 0x0e, 0xec, 0xab, 0x17, 0x74, 0xd0, 0x0d, 0xaf, - 0x01, 0x07, 0x27, 0x85, 0x01, 0xf2, 0x5e, 0x01, 0xad, 0xff, 0x04, 0xa8, 0x44, 0x04, 0x84, 0xa8, - 0xff, 0x82, 0x3c, 0xff, 0x75, 0x01, 0x01, 0xcc, 0xc3, 0xff, 0x4f, 0x8c, 0x00, 0xf5, 0x40, 0x00, - 0xfb, 0x5f, 0xff, 0xb5, 0x00, 0xff, 0xac, 0xb3, 0xfe, 0x57, 0xe5, 0xfe, 0x6d, 0x86, 0xff, 0xfd, - 0xb0, 0xff, 0x14, 0x2a, 0xff, 0x1b, 0x0b, 0xff, 0x97, 0x48, 0xfe, 0xd0, 0xc5, 0xfe, 0xab, 0x25, - 0xff, 0x8b, 0x0a, 0xff, 0x90, 0x01, 0xff, 0x5c, 0x03, 0xff, 0x68, 0xf3, 0xfe, 0xac, 0xbb, 0xfe, - 0xd0, 0x96, 0xfe, 0xd4, 0xaf, 0xfe, 0xc9, 0x12, 0x0b, 0x1f, 0xe4, 0x13, 0xb9, 0x01, 0x0f, 0x6d, - 0x17, 0x08, 0x82, 0xb0, 0x01, 0x3d, 0x8b, 0x02, 0x6c, 0x76, 0x05, 0x34, 0x05, 0x04, 0x95, 0xe4, - 0x00, 0x05, 0xf9, 0xff, 0x8f, 0x5c, 0x01, 0x5a, 0x58, 0x01, 0x55, 0xac, 0x00, 0x54, 0xd8, 0xff, - 0x34, 0x22, 0x00, 0x91, 0x2f, 0xff, 0x30, 0x9d, 0xfe, 0x84, 0xea, 0xfe, 0x07, 0xd0, 0xfe, 0x71, - 0x36, 0xff, 0xfd, 0xde, 0xff, 0xda, 0x46, 0xff, 0x94, 0x70, 0xfe, 0x68, 0x51, 0xff, 0xbc, 0x1e, - 0xff, 0xf0, 0xd7, 0xfe, 0x45, 0xc3, 0xfe, 0x33, 0xce, 0xfe, 0x0d, 0xcc, 0xfe, 0xbc, 0xb9, 0xfe, - 0x14, 0xde, 0xfe, 0xb1, 0xaf, 0xfe, 0xc1, 0x8e, 0x0a, 0x4a, 0xfc, 0x12, 0xf8, 0xba, 0x0b, 0x1e, - 0x58, 0x05, 0x6e, 0xb3, 0x03, 0x4e, 0x17, 0x04, 0x98, 0x42, 0x04, 0xee, 0xca, 0x03, 0xc8, 0x06, - 0x03, 0x65, 0x03, 0x01, 0x78, 0xe7, 0x00, 0xa4, 0xac, 0x02, 0xd8, 0x39, 0x02, 0x05, 0x75, 0x00, - 0xc8, 0x28, 0x00, 0xbb, 0xdc, 0xff, 0x44, 0x33, 0xff, 0x0a, 0x62, 0xfe, 0x6a, 0xf0, 0xfe, 0xe3, - 0x46, 0xff, 0x63, 0x0f, 0xff, 0x6f, 0x7b, 0xff, 0x89, 0x7e, 0xff, 0x96, 0x77, 0xff, 0xe8, 0x56, - 0xff, 0x7c, 0x56, 0xff, 0x30, 0xc3, 0xfe, 0x8e, 0x6e, 0xfe, 0x93, 0x81, 0xfe, 0xf9, 0xb3, 0xfe, - 0x55, 0xe3, 0xfe, 0xf7, 0xbd, 0xfe, 0xbb, 0x0a, 0x0a, 0x9a, 0xcd, 0x11, 0xc6, 0xb6, 0x09, 0x0a, - 0x4f, 0x04, 0x9a, 0x36, 0x05, 0x74, 0x8b, 0x03, 0x62, 0xda, 0x01, 0xe4, 0x11, 0x04, 0xd8, 0xdb, - 0x03, 0xc6, 0xa7, 0x01, 0xf3, 0x6d, 0x02, 0x89, 0xa6, 0x02, 0x8e, 0x1d, 0x02, 0xc6, 0x67, 0x02, - 0x66, 0xaf, 0x01, 0x5d, 0xbb, 0xff, 0xb8, 0xc4, 0xff, 0x75, 0xbd, 0xff, 0xe1, 0x75, 0xfe, 0x45, - 0x99, 0xfe, 0x78, 0x78, 0xff, 0x74, 0x76, 0xff, 0xbe, 0xdf, 0xfe, 0xd0, 0x0a, 0x00, 0xe4, 0x35, - 0x00, 0xae, 0x3c, 0xff, 0x53, 0x3e, 0xff, 0x9c, 0xc8, 0xfe, 0xd2, 0x4a, 0xfe, 0x86, 0x4c, 0xfe, - 0x2c, 0x9c, 0xfe, 0xe7, 0xe4, 0xfe, 0xbb, 0x6c, 0x09, 0x13, 0x52, 0x10, 0xb6, 0x24, 0x09, 0x69, - 0x01, 0x05, 0x4b, 0xc1, 0x05, 0xcd, 0x8d, 0x02, 0x37, 0x7c, 0x00, 0x2f, 0xeb, 0x03, 0x7a, 0x74, - 0x03, 0xf1, 0xe1, 0x00, 0x06, 0x1f, 0x02, 0xf9, 0x8b, 0x03, 0xd7, 0x40, 0x03, 0x46, 0x2e, 0x02, - 0xf4, 0xb2, 0x01, 0xa1, 0xa2, 0x01, 0xdd, 0xd8, 0x00, 0x03, 0xb0, 0xff, 0x92, 0x8d, 0xff, 0x09, - 0x38, 0xff, 0x51, 0xbe, 0xfe, 0x78, 0x05, 0xff, 0x18, 0x73, 0xff, 0x0a, 0xa9, 0xff, 0xfc, 0xa2, - 0xff, 0x89, 0x1b, 0x00, 0xc6, 0xa7, 0xff, 0x17, 0xcc, 0xfe, 0x99, 0xcd, 0xfe, 0x3f, 0x75, 0xfe, - 0x76, 0x13, 0xfe, 0x5e, 0x81, 0xfe, 0x62, 0x98, 0x09, 0x81, 0x54, 0x10, 0x84, 0x08, 0x09, 0x0f, - 0xe5, 0x04, 0x47, 0xce, 0x05, 0x58, 0x35, 0x02, 0x6f, 0xc8, 0xff, 0x8b, 0x0d, 0x04, 0x7b, 0x86, - 0x03, 0x63, 0xb2, 0xff, 0x4f, 0xc9, 0x00, 0xad, 0x57, 0x03, 0xb3, 0xf7, 0x02, 0x5b, 0x71, 0x02, - 0x37, 0xd7, 0x02, 0x39, 0x50, 0x01, 0xb7, 0xb8, 0x00, 0xe4, 0x88, 0x01, 0x1f, 0xb5, 0x00, 0x63, - 0x20, 0xff, 0xce, 0xa5, 0xff, 0x12, 0xf1, 0xff, 0xd8, 0xcb, 0xfe, 0x3c, 0x5c, 0xff, 0x3c, 0x39, - 0x00, 0x0e, 0xd2, 0xff, 0x9c, 0x53, 0xff, 0x91, 0x7f, 0xff, 0xfc, 0x25, 0xff, 0x26, 0xa0, 0xfe, - 0x1f, 0xa2, 0xfe, 0x20, 0x67, 0xfe, 0xa8, 0xa8, 0x09, 0xea, 0x2a, 0x10, 0x57, 0x2f, 0x09, 0x16, - 0x18, 0x06, 0x53, 0x4e, 0x06, 0x49, 0xc7, 0x00, 0x32, 0x02, 0xff, 0xbe, 0x13, 0x05, 0xe8, 0x94, - 0x03, 0xf7, 0xad, 0xfe, 0x94, 0x4e, 0x00, 0xb6, 0xb3, 0x02, 0xc5, 0xfc, 0x01, 0x14, 0x86, 0x01, - 0x07, 0x7c, 0x02, 0x0f, 0xb2, 0x01, 0x92, 0xdc, 0x00, 0xc0, 0x22, 0x01, 0x11, 0x30, 0x01, 0xea, - 0xa4, 0x00, 0xc5, 0x06, 0x00, 0xa1, 0x14, 0x00, 0x69, 0x20, 0x00, 0x30, 0xdb, 0xff, 0xae, 0x92, - 0xff, 0xa2, 0xbc, 0xff, 0xde, 0xaa, 0xff, 0xa3, 0x15, 0xff, 0xdb, 0xd5, 0xfe, 0xbf, 0x28, 0xff, - 0xfd, 0xe6, 0xfe, 0x41, 0xb2, 0xfe, 0xa1, 0x3f, 0x0a, 0x13, 0x4a, 0x11, 0x0c, 0x74, 0x09, 0x1a, - 0xb5, 0x05, 0x2d, 0x56, 0x06, 0x2b, 0xb8, 0x00, 0xbd, 0xae, 0xfe, 0x23, 0xf0, 0x04, 0x38, 0x93, - 0x03, 0x8e, 0x65, 0xfe, 0x2e, 0xe2, 0xff, 0x42, 0x31, 0x02, 0x44, 0xb0, 0x01, 0x2e, 0x1c, 0x01, - 0x4d, 0x67, 0x01, 0x72, 0xf0, 0x00, 0x77, 0x19, 0x00, 0xe4, 0xba, 0x00, 0x71, 0xa1, 0x01, 0x50, - 0xa5, 0x00, 0x07, 0x0f, 0x00, 0xe3, 0x10, 0x01, 0xc1, 0xc4, 0x00, 0x27, 0x53, 0x00, 0x33, 0xa7, - 0x00, 0xba, 0x21, 0x00, 0x02, 0x35, 0xff, 0x6c, 0xe4, 0xfe, 0xc6, 0xd2, 0xfe, 0x5e, 0xbf, 0xfe, - 0xd7, 0xc6, 0xfe, 0xfa, 0x04, 0xff, 0x30, 0x23, 0x0b, 0x36, 0x3d, 0x12, 0x10, 0x9a, 0x09, 0x91, - 0x3e, 0x06, 0xb6, 0x70, 0x06, 0x60, 0xd1, 0xff, 0x01, 0x8b, 0xfe, 0xa7, 0x91, 0x05, 0x35, 0x54, - 0x03, 0xc9, 0xe1, 0xfd, 0xcf, 0xbd, 0xff, 0xb3, 0x43, 0x02, 0xd8, 0x4e, 0x01, 0xb5, 0x6a, 0x00, - 0x78, 0xb5, 0x01, 0x32, 0xd0, 0x00, 0x9e, 0xd4, 0xfe, 0x45, 0x6b, 0xff, 0x56, 0x0b, 0x01, 0x78, - 0xc0, 0x00, 0xd4, 0x14, 0x00, 0x21, 0xf7, 0x00, 0x39, 0x30, 0x01, 0xdd, 0x56, 0x01, 0x47, 0x2b, - 0x01, 0x3f, 0xd4, 0x00, 0x6b, 0x61, 0x00, 0x69, 0x16, 0xff, 0x39, 0x38, 0xfe, 0xe5, 0x87, 0xfe, - 0xf4, 0xf0, 0xfe, 0xc8, 0xb7, 0xfe, 0x9c, 0x6e, 0x0c, 0x3e, 0xd3, 0x13, 0xb8, 0x83, 0x09, 0xbc, - 0xf2, 0x05, 0xef, 0x86, 0x06, 0x50, 0x93, 0xff, 0xd6, 0x7e, 0xfe, 0xf4, 0x8c, 0x05, 0x7c, 0xee, - 0x02, 0x01, 0x9a, 0xfd, 0x4a, 0xe8, 0xff, 0x99, 0x03, 0x02, 0x81, 0xf4, 0x00, 0x0c, 0x25, 0x00, - 0x37, 0x5c, 0x01, 0xac, 0x1e, 0x01, 0xf8, 0xdb, 0xfe, 0xb8, 0x72, 0xfe, 0x71, 0x8d, 0xff, 0x76, - 0x23, 0x00, 0x60, 0xa3, 0xff, 0xf0, 0x44, 0x00, 0xe5, 0x84, 0x01, 0xe4, 0x8b, 0x01, 0xc1, 0x72, - 0x01, 0x73, 0x98, 0x01, 0xf3, 0xf4, 0x00, 0xd0, 0xd3, 0xff, 0xff, 0xd7, 0xfe, 0x6b, 0x70, 0xfe, - 0x63, 0x79, 0xfe, 0x16, 0xa4, 0xfe, 0xd3, 0x3f, 0x0d, 0xdf, 0x5e, 0x15, 0x0f, 0x15, 0x0a, 0xb3, - 0x91, 0x05, 0x7d, 0xaa, 0x06, 0xee, 0x76, 0xff, 0xba, 0xfe, 0xfd, 0xc2, 0x0a, 0x06, 0x19, 0xbc, - 0x02, 0xe4, 0xcb, 0xfc, 0x68, 0xf0, 0xff, 0x72, 0x1f, 0x02, 0xaa, 0xcc, 0x00, 0x6a, 0xaf, 0xff, - 0x5b, 0xc4, 0x00, 0xa0, 0x6a, 0x01, 0x24, 0x55, 0xff, 0xaf, 0xf9, 0xfd, 0x2d, 0xfa, 0xfe, 0xf8, - 0x58, 0xff, 0x82, 0xad, 0xfe, 0xf8, 0x7d, 0xff, 0x02, 0xac, 0x00, 0x43, 0x80, 0x01, 0x2b, 0xb1, - 0x01, 0x51, 0x8f, 0x01, 0xbb, 0x75, 0x01, 0x52, 0x6b, 0x00, 0xb0, 0x69, 0xff, 0xd4, 0x10, 0xff, - 0xb2, 0xca, 0xfe, 0x3a, 0x91, 0xfe, 0xfb, 0xbf, 0x0e, 0x10, 0x6a, 0x17, 0xba, 0xfa, 0x09, 0x02, - 0xc7, 0x04, 0x9d, 0x01, 0x07, 0xac, 0x7c, 0xff, 0x82, 0xa8, 0xfd, 0xb6, 0x48, 0x06, 0x8b, 0x8b, - 0x02, 0x60, 0x5c, 0xfc, 0x10, 0x01, 0x00, 0xc1, 0xe6, 0x01, 0x1e, 0x80, 0x00, 0x51, 0xbe, 0xff, - 0x73, 0x4e, 0x00, 0xed, 0x50, 0x01, 0xc4, 0x97, 0xff, 0x76, 0x1f, 0xfe, 0x46, 0xac, 0xfe, 0x75, - 0xec, 0xfe, 0xbb, 0x8a, 0xfe, 0xac, 0x9b, 0xfe, 0x32, 0xa7, 0xff, 0xcd, 0x17, 0x01, 0x42, 0x6c, - 0x01, 0x9f, 0x29, 0x01, 0x47, 0x91, 0x01, 0x71, 0xb9, 0x00, 0x4b, 0xac, 0xff, 0x56, 0xa7, 0xff, - 0x31, 0x46, 0xff, 0x97, 0xfa, 0xfe, 0x72, 0x93, 0x10, 0xd8, 0x75, 0x19, 0x56, 0xa3, 0x09, 0xa5, - 0x38, 0x04, 0xf3, 0x44, 0x07, 0x48, 0xf1, 0xfe, 0x27, 0xa9, 0xfd, 0x7c, 0xdc, 0x06, 0xb1, 0xd1, - 0x01, 0xa4, 0xd5, 0xfb, 0xcb, 0x47, 0x00, 0x53, 0x0b, 0x02, 0x52, 0xe4, 0xff, 0x58, 0x36, 0xff, - 0xa1, 0x40, 0x00, 0x62, 0x29, 0x01, 0x1d, 0xb8, 0xff, 0x0c, 0x28, 0xfe, 0xe9, 0x78, 0xfe, 0xe8, - 0xcd, 0xfe, 0x67, 0x60, 0xfe, 0x78, 0x4c, 0xfe, 0x54, 0x2a, 0xff, 0x8c, 0x58, 0x00, 0xe1, 0xfb, - 0x00, 0xe2, 0x9a, 0x00, 0x0f, 0xe2, 0x00, 0x3b, 0x9f, 0x00, 0x91, 0xc4, 0xff, 0xfd, 0xb3, 0xff, - 0x72, 0x81, 0xff, 0x53, 0x8b, 0xff, 0xaf, 0xb1, 0x12, 0xd7, 0xb7, 0x1b, 0xd7, 0x01, 0x09, 0x26, - 0xc2, 0x03, 0x84, 0x90, 0x07, 0x65, 0x2e, 0xfe, 0x75, 0xe6, 0xfd, 0x1d, 0x91, 0x07, 0xd4, 0xef, - 0x00, 0x62, 0x75, 0xfb, 0x96, 0xa4, 0x00, 0xab, 0x1a, 0x02, 0xe8, 0x89, 0xff, 0x78, 0xcc, 0xfe, - 0xea, 0xfe, 0xff, 0xd4, 0xf0, 0x00, 0x7d, 0xab, 0xff, 0xab, 0x79, 0xfe, 0x0c, 0x9f, 0xfe, 0xe9, - 0x68, 0xfe, 0x67, 0x32, 0xfe, 0x97, 0x6f, 0xfe, 0xd6, 0x34, 0xff, 0x2e, 0xb7, 0xff, 0x34, 0xab, - 0x00, 0x92, 0x58, 0x00, 0xb2, 0x2d, 0x00, 0xff, 0x37, 0x00, 0x43, 0x14, 0xff, 0x39, 0x7e, 0xff, - 0x0d, 0xeb, 0xff, 0x87, 0xc2, 0xff, 0xb3, 0xb1, 0x14, 0xd2, 0xf3, 0x1d, 0x55, 0x8f, 0x08, 0x6c, - 0x67, 0x03, 0xb8, 0xe2, 0x07, 0xf6, 0x12, 0xfd, 0x90, 0x0c, 0xfe, 0xbd, 0xaa, 0x08, 0x54, 0xf9, - 0xff, 0x8f, 0xda, 0xfa, 0xa1, 0x0a, 0x01, 0x77, 0x43, 0x02, 0x2a, 0x48, 0xff, 0x38, 0x48, 0xfe, - 0xf3, 0xa0, 0xff, 0x23, 0xc5, 0x00, 0xff, 0x84, 0xff, 0xe1, 0x77, 0xfe, 0x2a, 0xd0, 0xfe, 0xad, - 0x4d, 0xfe, 0x1b, 0xfe, 0xfd, 0x05, 0x47, 0xfe, 0x7a, 0x90, 0xff, 0x60, 0x77, 0xff, 0x55, 0xf2, - 0xff, 0x77, 0xbd, 0x00, 0xd9, 0xbb, 0xff, 0x05, 0x62, 0xff, 0x6f, 0xb0, 0xfe, 0x2a, 0xda, 0xfe, - 0x86, 0x7e, 0xff, 0x79, 0xc0, 0xff, 0x87, 0x8f, 0x16, 0x05, 0x68, 0x20, 0xf0, 0x4c, 0x08, 0x35, - 0xbc, 0x02, 0x9b, 0x54, 0x08, 0xc9, 0xf0, 0xfb, 0xb4, 0xdd, 0xfd, 0x8f, 0xc9, 0x09, 0xdf, 0x27, - 0xff, 0x06, 0x49, 0xfa, 0x74, 0x58, 0x01, 0x9b, 0x33, 0x02, 0x59, 0x32, 0xff, 0x12, 0xfc, 0xfd, - 0x35, 0xec, 0xfe, 0xe1, 0x88, 0x00, 0xc6, 0x80, 0xff, 0xdf, 0x65, 0xfe, 0x59, 0xc1, 0xfe, 0x91, - 0x23, 0xfe, 0x4d, 0xfd, 0xfd, 0x0f, 0x13, 0xfe, 0x78, 0xac, 0xff, 0x4b, 0xc7, 0xff, 0x63, 0x45, - 0xff, 0xef, 0x8f, 0x00, 0xd4, 0x01, 0x00, 0x4e, 0xbc, 0xfe, 0xa8, 0x64, 0xfe, 0xb1, 0x5b, 0xfe, - 0xc8, 0x99, 0xfe, 0xed, 0x61, 0xff, 0x68, 0x0b, 0x18, 0xd3, 0xf8, 0x22, 0x27, 0x7d, 0x08, 0x95, - 0xcc, 0x01, 0x20, 0xe0, 0x08, 0xa6, 0x3d, 0xfb, 0x1c, 0x6b, 0xfd, 0xe6, 0xc2, 0x0a, 0xa7, 0xa8, - 0xfe, 0x25, 0xdd, 0xf9, 0x4f, 0xb8, 0x01, 0xbe, 0x4f, 0x02, 0x51, 0xc8, 0xfe, 0x58, 0x00, 0xfe, - 0x54, 0x91, 0xfe, 0x60, 0xe0, 0xff, 0xbc, 0x80, 0xff, 0xa7, 0x66, 0xfe, 0x32, 0xdd, 0xfe, 0x91, - 0x1a, 0xfe, 0xe9, 0xce, 0xfd, 0x3c, 0xd0, 0xfd, 0x90, 0xb8, 0xff, 0x69, 0x8a, 0x00, 0x41, 0x32, - 0xff, 0x93, 0x97, 0xff, 0x41, 0x45, 0x00, 0xe1, 0xfb, 0xfe, 0xba, 0x03, 0xfe, 0x9e, 0x30, 0xfe, - 0x6a, 0xc0, 0xfd, 0x2a, 0xda, 0xfe, 0x7e, 0x52, 0x1a, 0xb6, 0x21, 0x25, 0x8f, 0xfb, 0x07, 0x66, - 0x9f, 0x01, 0xb6, 0xf3, 0x08, 0x1f, 0x1f, 0xfa, 0x0d, 0x82, 0xfd, 0xf7, 0x2c, 0x0b, 0x6c, 0xa5, - 0xfd, 0x6c, 0x22, 0xfa, 0x2c, 0xf4, 0x01, 0x72, 0x1f, 0x02, 0xfc, 0x63, 0xfe, 0x91, 0xd5, 0xfd, - 0xc4, 0xac, 0xfe, 0xf2, 0xef, 0xfe, 0x39, 0x0d, 0xff, 0x04, 0x92, 0xfe, 0x67, 0x12, 0xff, 0xad, - 0xf6, 0xfd, 0xc1, 0x82, 0xfd, 0x35, 0x97, 0xfd, 0xfe, 0xa8, 0xff, 0x4b, 0xc6, 0x00, 0x5c, 0xb2, - 0xff, 0x64, 0x27, 0xff, 0x02, 0x7c, 0xff, 0xd9, 0x6f, 0xff, 0xec, 0xc3, 0xfd, 0x65, 0xdf, 0xfd, - 0x5d, 0xa4, 0xfd, 0x2a, 0x11, 0xfe, 0xa0, 0x1b, 0x1d, 0x2e, 0xb3, 0x26, 0x43, 0x25, 0x07, 0x7e, - 0x99, 0x02, 0x00, 0x7a, 0x08, 0xb1, 0x0c, 0xf9, 0x5c, 0xe9, 0xfd, 0x5b, 0x41, 0x0b, 0xa8, 0x9a, - 0xfc, 0xea, 0x9f, 0xfa, 0x94, 0x64, 0x02, 0xa1, 0xe5, 0x01, 0xca, 0x24, 0xfe, 0xbb, 0x69, 0xfd, - 0x48, 0x43, 0xff, 0x33, 0x0f, 0xfe, 0x69, 0x53, 0xfe, 0x7e, 0xd8, 0xfe, 0x7a, 0x2e, 0xff, 0xb5, - 0x30, 0xfe, 0x2d, 0x36, 0xfd, 0xde, 0x5f, 0xfd, 0x31, 0xd8, 0xff, 0xf6, 0xa1, 0x00, 0x81, 0xd5, - 0xff, 0xc9, 0xe5, 0xff, 0xdf, 0xc1, 0xfe, 0x64, 0xe2, 0xfe, 0x3d, 0x04, 0xfe, 0xbc, 0xba, 0xfd, - 0x19, 0x96, 0xfd, 0x70, 0xae, 0xfd, 0x51, 0x57, 0x1f, 0x4f, 0xdc, 0x27, 0x74, 0x2c, 0x07, 0x0c, - 0xab, 0x03, 0x93, 0x12, 0x08, 0x7d, 0x9a, 0xf8, 0x53, 0x90, 0xfd, 0x92, 0x1a, 0x0b, 0x28, 0x36, - 0xfc, 0xab, 0x03, 0xfb, 0xe9, 0x5c, 0x02, 0x89, 0x02, 0x02, 0xc9, 0x5b, 0xfe, 0x47, 0x8e, 0xfc, - 0xef, 0xaf, 0xff, 0x83, 0xd5, 0xfd, 0x61, 0x79, 0xfd, 0x60, 0xb6, 0xfe, 0xb9, 0x58, 0xff, 0x30, - 0x7f, 0xfe, 0xf3, 0x6c, 0xfd, 0xac, 0xf4, 0xfc, 0x09, 0xb7, 0xff, 0x0f, 0xfa, 0x00, 0x7c, 0x91, - 0xff, 0x58, 0x76, 0x00, 0xbd, 0xd6, 0xfe, 0x91, 0x25, 0xfe, 0xe8, 0x02, 0xfe, 0x93, 0xb1, 0xfd, - 0x05, 0x6f, 0xfd, 0xd0, 0xb9, 0xfd, 0x41, 0x24, 0x21, 0xc3, 0x87, 0x28, 0x45, 0xc6, 0x07, 0x11, - 0xe8, 0x04, 0x6b, 0xe5, 0x07, 0x19, 0xa5, 0xf8, 0x99, 0x5c, 0xfc, 0x7f, 0xe9, 0x0a, 0x1f, 0x17, - 0xfc, 0xd1, 0x3d, 0xfb, 0x2d, 0x6b, 0x02, 0xf3, 0xb9, 0x01, 0x85, 0xf1, 0xfe, 0x2e, 0x05, 0xfc, - 0xdf, 0x57, 0xff, 0x57, 0x18, 0xfe, 0x27, 0xf0, 0xfc, 0xcb, 0xbf, 0xfd, 0x86, 0xb0, 0xff, 0x92, - 0xe2, 0xfe, 0x9a, 0xa1, 0xfd, 0x8f, 0xe3, 0xfc, 0x09, 0xf1, 0xfe, 0xb3, 0xcf, 0x01, 0xa6, 0x66, - 0xff, 0xbc, 0x16, 0x00, 0x2e, 0x5c, 0xff, 0x59, 0x0b, 0xfe, 0x25, 0xa6, 0xfd, 0xc0, 0x4b, 0xfd, - 0x0d, 0x6b, 0xfd, 0xb5, 0xcf, 0xfd, 0xbd, 0x48, 0x23, 0xc5, 0x71, 0x28, 0x7c, 0xda, 0x07, 0xe2, - 0xdb, 0x06, 0x42, 0x94, 0x08, 0xf5, 0xee, 0xf7, 0x9d, 0xf4, 0xfa, 0x61, 0x3a, 0x0b, 0x27, 0x6f, - 0xfb, 0x00, 0x42, 0xfb, 0xd3, 0xeb, 0x02, 0x11, 0x38, 0x01, 0xf4, 0x02, 0xff, 0x9b, 0x57, 0xfc, - 0xb2, 0xb5, 0xfe, 0x9d, 0xea, 0xfd, 0x3c, 0x18, 0xfd, 0xbf, 0x7d, 0xfc, 0xc7, 0x82, 0xff, 0x2b, - 0xac, 0xff, 0xdf, 0x8b, 0xfd, 0x7c, 0x1c, 0xfd, 0x74, 0x7d, 0xfe, 0x15, 0xd3, 0x01, 0xff, 0x00, - 0x00, 0x4e, 0x44, 0xff, 0xa9, 0x80, 0xff, 0xc6, 0x97, 0xfe, 0xef, 0x27, 0xfd, 0x9a, 0xcb, 0xfc, - 0xbb, 0xa0, 0xfd, 0x67, 0x9b, 0xfd, 0x21, 0x88, 0x26, 0xd3, 0x7a, 0x27, 0x78, 0xfa, 0x05, 0xd5, - 0xd1, 0x0a, 0x7d, 0x1a, 0x0a, 0xe1, 0x53, 0xf5, 0x98, 0x99, 0xfa, 0x9f, 0x06, 0x0c, 0x22, 0xea, - 0xf9, 0xfe, 0x51, 0xfb, 0xbc, 0x9b, 0x03, 0x82, 0xfd, 0x00, 0xde, 0x84, 0xfe, 0xfc, 0xee, 0xfc, - 0x85, 0xbd, 0xfe, 0x0e, 0xfa, 0xfc, 0xc6, 0x79, 0xfd, 0x67, 0xfc, 0xfb, 0xcf, 0x81, 0xfe, 0xd8, - 0x56, 0x00, 0x29, 0xe7, 0xfd, 0x44, 0x14, 0xfd, 0x5c, 0xee, 0xfe, 0xf5, 0x2f, 0x01, 0xf3, 0x61, - 0x00, 0x64, 0x62, 0xff, 0xc7, 0x25, 0xff, 0x2a, 0xc3, 0xfe, 0x0f, 0x16, 0xfd, 0xce, 0xaa, 0xfc, - 0x64, 0xae, 0xfd, 0x59, 0x56, 0xfd, 0xb2, 0x66, 0x29, 0xc4, 0xf7, 0x25, 0x34, 0xb2, 0x03, 0xfc, - 0xac, 0x10, 0x88, 0xfd, 0x0b, 0x01, 0x08, 0xf1, 0xe0, 0x90, 0xfb, 0x79, 0xd6, 0x0d, 0x49, 0x12, - 0xf7, 0xce, 0x03, 0xfb, 0x9b, 0x0a, 0x05, 0x95, 0x15, 0x01, 0xae, 0xc4, 0xfd, 0x54, 0x11, 0xfd, - 0x5d, 0x77, 0xff, 0xc0, 0x64, 0xfc, 0x33, 0x6e, 0xfd, 0xd3, 0xf4, 0xfb, 0x44, 0x36, 0xfd, 0x2f, - 0x61, 0x00, 0x5c, 0x5b, 0xff, 0x6c, 0x7c, 0xfc, 0x81, 0x66, 0xff, 0xb6, 0x2a, 0x01, 0x92, 0x0f, - 0x00, 0xea, 0x68, 0x00, 0x1f, 0x78, 0xfe, 0x90, 0x86, 0xfe, 0x85, 0xc1, 0xfd, 0xea, 0xc0, 0xfc, - 0x42, 0xfa, 0xfc, 0xa8, 0xbe, 0xfd, 0x57, 0x7e, 0x2a, 0xd0, 0x96, 0x24, 0x05, 0x88, 0x02, 0xf5, - 0xa9, 0x16, 0xdd, 0xd5, 0x0d, 0xb6, 0x4b, 0xec, 0x78, 0xb3, 0xfd, 0x93, 0xc0, 0x10, 0x5f, 0x5f, - 0xf2, 0xb0, 0xf4, 0xf9, 0x54, 0xa6, 0x07, 0x1f, 0x60, 0x01, 0xb2, 0x91, 0xfc, 0x36, 0xaa, 0xfc, - 0x0c, 0x96, 0x00, 0xae, 0x52, 0xfc, 0x59, 0x0d, 0xfd, 0xfc, 0x0f, 0xfc, 0xf2, 0xf8, 0xfb, 0x0e, - 0x7d, 0xff, 0xfd, 0x10, 0x01, 0xf4, 0x6d, 0xfc, 0x83, 0x15, 0xff, 0x0c, 0xc2, 0x01, 0x75, 0x79, - 0xff, 0xa4, 0x4f, 0x01, 0xf9, 0x67, 0xfe, 0x50, 0x13, 0xfe, 0xa4, 0x39, 0xfe, 0xc0, 0xe4, 0xfc, - 0xeb, 0x4c, 0xfc, 0xe9, 0x49, 0xfe, 0x04, 0xf7, 0x2c, 0xef, 0x9e, 0x26, 0xd6, 0xff, 0xfd, 0x79, - 0xa8, 0x16, 0xb1, 0x0c, 0x13, 0xe0, 0x6c, 0xeb, 0x88, 0x2a, 0xfc, 0x5b, 0x5e, 0x12, 0x38, 0xd1, - 0xef, 0xc1, 0xb2, 0xf8, 0x7e, 0x8f, 0x09, 0xe6, 0x2d, 0x01, 0x1e, 0x5f, 0xfb, 0xe6, 0x8b, 0xfc, - 0x77, 0xaa, 0x01, 0xa6, 0xa9, 0xfb, 0x03, 0x6b, 0xfc, 0x85, 0xc4, 0xfc, 0x22, 0x69, 0xfb, 0xf9, - 0xa3, 0xfd, 0x4f, 0x7e, 0x01, 0xf3, 0xee, 0xfd, 0x03, 0x39, 0xfe, 0x5c, 0x17, 0x02, 0x98, 0x95, - 0xff, 0x3e, 0x58, 0x01, 0x93, 0xbd, 0xfe, 0x06, 0xcb, 0xfd, 0x99, 0x4c, 0xfe, 0x88, 0xc9, 0xfc, - 0xff, 0xf5, 0xfb, 0x01, 0x13, 0xfe, 0x36, 0x5c, 0x31, 0xe5, 0x87, 0x28, 0x66, 0x23, 0xf9, 0xeb, - 0xc6, 0x13, 0x23, 0x5d, 0x18, 0xda, 0xe0, 0xec, 0xab, 0x80, 0xfa, 0x55, 0x77, 0x12, 0xde, 0x4e, - 0xee, 0xdb, 0xed, 0xf7, 0x17, 0xcb, 0x0a, 0x04, 0x70, 0x01, 0xe4, 0xbe, 0xf9, 0xbe, 0x9f, 0xfc, - 0x89, 0xd0, 0x02, 0x01, 0x31, 0xfb, 0x07, 0x85, 0xfb, 0x55, 0x56, 0xfd, 0x1d, 0xb4, 0xfb, 0x2e, - 0x25, 0xfc, 0x95, 0x96, 0x00, 0x2c, 0xad, 0xff, 0x87, 0x4b, 0xfe, 0x40, 0x9f, 0x01, 0x03, 0x79, - 0x00, 0xe4, 0x2f, 0x01, 0xf0, 0xed, 0xfe, 0x33, 0x2d, 0xfe, 0x45, 0x22, 0xfe, 0x98, 0x6b, 0xfc, - 0x38, 0xe8, 0xfb, 0xe4, 0x87, 0xfd, 0xa7, 0xab, 0x35, 0x6d, 0xcb, 0x2a, 0xff, 0x25, 0xf4, 0x0d, - 0x78, 0x10, 0xea, 0x8c, 0x1b, 0x83, 0x6b, 0xf0, 0x99, 0x93, 0xf9, 0xf0, 0x51, 0x11, 0x7b, 0xba, - 0xed, 0xc9, 0x27, 0xf7, 0x75, 0x8d, 0x0b, 0x1f, 0x07, 0x02, 0x54, 0x13, 0xf8, 0xd5, 0x81, 0xfc, - 0x31, 0xa0, 0x03, 0xf4, 0xe8, 0xfa, 0xb2, 0xa7, 0xfa, 0x9e, 0x77, 0xfd, 0xdc, 0x41, 0xfc, 0x4b, - 0x49, 0xfb, 0xae, 0xd9, 0xfe, 0x27, 0xe9, 0x00, 0x88, 0x46, 0xff, 0x15, 0x97, 0x00, 0x2f, 0x77, - 0x01, 0xba, 0x66, 0x01, 0xa1, 0xfd, 0xfe, 0xe9, 0xf2, 0xfe, 0xdb, 0xc6, 0xfd, 0x06, 0xc5, 0xfb, - 0x45, 0x16, 0xfc, 0xf9, 0x13, 0xfd, 0xfa, 0x98, 0x39, 0x2d, 0xcc, 0x2d, 0xec, 0x3c, 0xf0, 0x96, - 0xea, 0x0b, 0xd5, 0x69, 0x1d, 0x09, 0xf6, 0xf4, 0x3d, 0x83, 0xf9, 0xd5, 0x98, 0x0f, 0xa1, 0x3f, - 0xed, 0xda, 0xd6, 0xf6, 0x71, 0x77, 0x0b, 0x8e, 0x06, 0x03, 0x4d, 0xb8, 0xf6, 0xab, 0x1b, 0xfc, - 0x9c, 0x4f, 0x04, 0x9b, 0xc5, 0xfa, 0xd0, 0x48, 0xfa, 0x1d, 0x17, 0xfd, 0x31, 0x15, 0xfd, 0x4a, - 0x17, 0xfb, 0x52, 0x1b, 0xfd, 0x2e, 0x0e, 0x01, 0x9e, 0xdd, 0x00, 0xe9, 0xe2, 0xff, 0x49, 0xcd, - 0x01, 0x24, 0x37, 0x02, 0xd5, 0x47, 0xff, 0x9a, 0x9e, 0xff, 0xd1, 0x5f, 0xfd, 0xe6, 0x44, 0xfb, - 0x7c, 0x09, 0xfc, 0xea, 0xc8, 0xfc, 0xdd, 0x2e, 0x3d, 0xc1, 0x2e, 0x31, 0xf3, 0x47, 0xed, 0xf6, - 0x9d, 0x06, 0x96, 0x13, 0x1e, 0x06, 0x02, 0xf9, 0xc6, 0xd9, 0xfa, 0xeb, 0xef, 0x0d, 0xdb, 0xfc, - 0xeb, 0x39, 0x69, 0xf7, 0xc8, 0xca, 0x0a, 0x0f, 0xa4, 0x03, 0xef, 0x24, 0xf6, 0x84, 0x4a, 0xfb, - 0x32, 0x8e, 0x04, 0x3f, 0xbb, 0xfa, 0x09, 0x34, 0xfa, 0x9f, 0x6b, 0xfc, 0xae, 0xbe, 0xfd, 0xed, - 0x51, 0xfb, 0x78, 0x18, 0xfc, 0xbc, 0xf2, 0xff, 0x0c, 0x2e, 0x02, 0x5c, 0x39, 0x00, 0x11, 0x59, - 0x01, 0x7d, 0x3f, 0x03, 0xb9, 0xf3, 0xff, 0x38, 0xdd, 0xff, 0x81, 0xf6, 0xfc, 0xaf, 0x2f, 0xfb, - 0xeb, 0xb4, 0xfb, 0xd8, 0x43, 0xfc, 0x41, 0xed, 0x3f, 0xc3, 0x46, 0x35, 0xaa, 0xde, 0xea, 0x3b, - 0x52, 0x01, 0x68, 0xc4, 0x1d, 0x21, 0xd0, 0xfb, 0x5c, 0x3b, 0xfd, 0xc1, 0x2b, 0x0d, 0xd2, 0xb2, - 0xe9, 0xda, 0xb0, 0xf8, 0xa0, 0x17, 0x0a, 0x07, 0x3b, 0x03, 0x04, 0x8f, 0xf6, 0x89, 0x4d, 0xfa, - 0xf0, 0x02, 0x04, 0x12, 0xd3, 0xfa, 0x58, 0x6e, 0xfa, 0xf0, 0x8e, 0xfb, 0xe5, 0x39, 0xfe, 0xa3, - 0xc9, 0xfb, 0x3b, 0xd5, 0xfb, 0xd7, 0x56, 0xfe, 0xe9, 0x88, 0x02, 0x04, 0x2f, 0x01, 0xf1, 0xeb, - 0x00, 0xb1, 0x24, 0x04, 0x0f, 0xd1, 0x00, 0x36, 0xcf, 0xff, 0xa0, 0xc0, 0xfc, 0xad, 0x59, 0xfb, - 0x1c, 0x46, 0xfb, 0x3c, 0xa7, 0xfb, 0xbb, 0x95, 0x43, 0xa7, 0xb8, 0x38, 0xc0, 0x9d, 0xe7, 0xb7, - 0x6c, 0xfe, 0xe5, 0x11, 0x1c, 0x95, 0x94, 0xfc, 0x0f, 0xe1, 0x00, 0xc5, 0x34, 0x0d, 0x4f, 0x9b, - 0xe6, 0x70, 0x86, 0xfa, 0x42, 0xff, 0x09, 0xc6, 0x91, 0x01, 0x37, 0xa8, 0xf7, 0xf6, 0xcb, 0xf9, - 0xd8, 0xb9, 0x02, 0x36, 0xb3, 0xfa, 0xe3, 0x47, 0xfb, 0x24, 0x85, 0xfa, 0x44, 0xc5, 0xfe, 0x2f, - 0x7d, 0xfc, 0x1f, 0xc2, 0xfb, 0x9b, 0x53, 0xfd, 0x7e, 0xf9, 0x01, 0x12, 0x0a, 0x02, 0x43, 0xe8, - 0x00, 0xf4, 0x50, 0x05, 0x81, 0x8d, 0x01, 0xeb, 0x5e, 0xff, 0x7d, 0xf7, 0xfc, 0x78, 0x63, 0xfb, - 0x70, 0xeb, 0xfa, 0x54, 0x27, 0xfb, 0xca, 0x93, 0x4a, 0x33, 0x77, 0x38, 0x5e, 0x93, 0xe2, 0x1f, - 0x5f, 0x00, 0xcb, 0xd8, 0x17, 0xa0, 0x63, 0xfb, 0x01, 0x12, 0x06, 0x3f, 0x33, 0x0c, 0x99, 0xcd, - 0xe3, 0xb6, 0x08, 0xfd, 0x9f, 0xf7, 0x09, 0x72, 0xd9, 0xfe, 0x13, 0x1b, 0xf9, 0x62, 0x8d, 0xf9, - 0x8b, 0xe4, 0x00, 0xd3, 0x6f, 0xfa, 0xa7, 0xf9, 0xfb, 0x23, 0xfb, 0xf9, 0x9c, 0x15, 0xff, 0xdd, - 0x4d, 0xfd, 0x72, 0x91, 0xfb, 0x54, 0xf4, 0xfc, 0xe0, 0x26, 0x01, 0xbf, 0x37, 0x02, 0x75, 0x0e, - 0x01, 0x86, 0xec, 0x06, 0x4e, 0x2f, 0x02, 0xdc, 0x38, 0xfe, 0xc0, 0x8f, 0xfd, 0x0f, 0x10, 0xfb, - 0xd1, 0x73, 0xfa, 0xa2, 0x0b, 0xfb, 0x00, 0x46, 0x51, 0xa3, 0x24, 0x38, 0xae, 0xe2, 0xdd, 0x9e, - 0x7d, 0x03, 0xa3, 0x73, 0x12, 0x59, 0x2b, 0xfa, 0x6c, 0x4b, 0x0a, 0xf4, 0x7b, 0x0b, 0xf9, 0x73, - 0xe2, 0x17, 0xa5, 0xfe, 0xf8, 0xd6, 0x09, 0x70, 0x31, 0xfc, 0x5b, 0x2f, 0xfb, 0x7a, 0x9a, 0xf8, - 0x4e, 0x2b, 0xff, 0xf6, 0xa5, 0xfa, 0x5d, 0x04, 0xfc, 0x6c, 0x74, 0xfa, 0x89, 0x07, 0xff, 0x84, - 0xe9, 0xfd, 0xe2, 0x07, 0xfc, 0x18, 0x54, 0xfc, 0xbe, 0xb0, 0x00, 0xe6, 0x0f, 0x02, 0x82, 0xd1, - 0x00, 0xa2, 0xf2, 0x08, 0xcf, 0x02, 0x03, 0x09, 0xb8, 0xfc, 0xbe, 0x0f, 0xfe, 0x26, 0xce, 0xfa, - 0x22, 0xb6, 0xf9, 0x9a, 0x7f, 0xfb, 0xbe, 0x5c, 0x56, 0x06, 0xbe, 0x38, 0x4d, 0xaf, 0xda, 0x4b, - 0x20, 0x06, 0x84, 0x63, 0x0d, 0xc5, 0xab, 0xf8, 0xcb, 0x3a, 0x0d, 0x75, 0x50, 0x0b, 0x18, 0xd1, - 0xe2, 0x75, 0x4e, 0xff, 0x94, 0x21, 0x09, 0x63, 0x9d, 0xfa, 0x9f, 0x04, 0xfd, 0xa8, 0x79, 0xf7, - 0x94, 0x9c, 0xfd, 0x94, 0x2d, 0xfb, 0x19, 0x39, 0xfc, 0xf1, 0xf3, 0xfa, 0x14, 0xfa, 0xfe, 0x90, - 0x61, 0xfe, 0x11, 0xe7, 0xfc, 0xdc, 0xc1, 0xfb, 0x85, 0x52, 0x00, 0xc8, 0x4f, 0x02, 0x2e, 0xfc, - 0xff, 0x37, 0x94, 0x0a, 0xb4, 0x49, 0x04, 0x8f, 0x71, 0xfb, 0xac, 0xe6, 0xfd, 0x4a, 0xfa, 0xfa, - 0xff, 0x29, 0xf9, 0xdc, 0x2e, 0xfc, 0x88, 0x7d, 0x59, 0x86, 0x36, 0x3a, 0xe7, 0x5f, 0xd9, 0x81, - 0x44, 0x07, 0x22, 0xee, 0x08, 0x54, 0x8c, 0xf6, 0xce, 0x9b, 0x0e, 0x68, 0x89, 0x0b, 0x0a, 0x23, - 0xe4, 0x7b, 0x0a, 0xff, 0x02, 0xd3, 0x07, 0x6f, 0x9c, 0xf9, 0xeb, 0x58, 0xfe, 0x9f, 0x76, 0xf6, - 0x7c, 0xd9, 0xfb, 0x3b, 0xf2, 0xfb, 0xfe, 0xc9, 0xfc, 0x8f, 0x5f, 0xfa, 0xeb, 0x59, 0xff, 0xd5, - 0x96, 0xfe, 0xc6, 0x71, 0xfd, 0x9c, 0xd5, 0xfb, 0x64, 0x65, 0xff, 0x66, 0x6e, 0x03, 0x9e, 0x94, - 0xfe, 0xe9, 0x35, 0x0a, 0x72, 0xf6, 0x05, 0x86, 0x2a, 0xfb, 0x38, 0x72, 0xfc, 0x28, 0x85, 0xfb, - 0x90, 0x5a, 0xf9, 0xd2, 0x27, 0xfc, 0x3a, 0xce, 0x5a, 0x18, 0x2b, 0x3c, 0xf1, 0x7c, 0xda, 0x42, - 0x23, 0x07, 0xc5, 0x40, 0x05, 0x29, 0x19, 0xf4, 0xe9, 0xb3, 0x0e, 0xe6, 0x2c, 0x0c, 0xb8, 0x10, - 0xe6, 0x50, 0x90, 0xfe, 0xa1, 0x2e, 0x06, 0x96, 0xdf, 0xf8, 0xb8, 0x91, 0xff, 0x99, 0xcf, 0xf5, - 0x3f, 0x59, 0xfa, 0x2a, 0xe4, 0xfc, 0xdf, 0x76, 0xfd, 0xaa, 0x1b, 0xf9, 0x59, 0x28, 0x00, 0x39, - 0xc6, 0xfe, 0x74, 0x6b, 0xfd, 0x42, 0x17, 0xfd, 0xb1, 0x36, 0xfe, 0x21, 0xee, 0x04, 0xb0, 0x23, - 0xfd, 0xb7, 0x74, 0x07, 0x0e, 0xd6, 0x07, 0x09, 0x66, 0xfc, 0x3c, 0xbf, 0xfa, 0x2c, 0x1b, 0xfc, - 0xed, 0x36, 0xfa, 0xd0, 0xf8, 0xfb, 0x4a, 0x0d, 0x5a, 0xe2, 0x22, 0x3f, 0xc8, 0x9a, 0xdd, 0x67, - 0x21, 0x06, 0x53, 0xfa, 0x01, 0xf7, 0xed, 0xf1, 0x92, 0x41, 0x0d, 0xe4, 0x35, 0x0d, 0x13, 0x90, - 0xe8, 0x97, 0xaf, 0xfd, 0xca, 0xd7, 0x04, 0x5a, 0xbd, 0xf7, 0x1a, 0x4a, 0x01, 0x6f, 0xaf, 0xf5, - 0x5a, 0x53, 0xf9, 0x80, 0x85, 0xfd, 0xea, 0x02, 0xfe, 0xaa, 0xed, 0xf7, 0x9a, 0xc7, 0x00, 0x2d, - 0x67, 0xff, 0xb0, 0x95, 0xfc, 0x1e, 0xf3, 0xff, 0x8a, 0xf1, 0xfc, 0xd2, 0x0a, 0x05, 0x64, 0xed, - 0xfc, 0x3a, 0x63, 0x03, 0xb2, 0x40, 0x08, 0x8d, 0x64, 0xff, 0x8c, 0x80, 0xfa, 0x49, 0x60, 0xfb, - 0xd7, 0x1f, 0xfc, 0x18, 0x5e, 0xfc, 0xa9, 0x19, 0x59, 0xa8, 0x80, 0x40, 0xe0, 0xd8, 0xe2, 0x7e, - 0xe5, 0x04, 0x7a, 0xe3, 0xfe, 0x70, 0xf9, 0xef, 0x8d, 0x76, 0x0a, 0x4a, 0xca, 0x0e, 0xde, 0x61, - 0xea, 0xb6, 0x5f, 0xfd, 0x23, 0x66, 0x03, 0x05, 0x73, 0xf6, 0xe2, 0x8b, 0x03, 0x34, 0x1f, 0xf6, - 0x2e, 0x63, 0xf8, 0x94, 0xaa, 0xfd, 0xcc, 0x86, 0xfe, 0xd4, 0xd8, 0xf6, 0x1e, 0x77, 0x01, 0x77, - 0xcc, 0xff, 0x20, 0x43, 0xfc, 0xcd, 0x1d, 0x03, 0x75, 0xc3, 0xfa, 0xc7, 0x25, 0x04, 0x9d, 0x53, - 0xfe, 0x52, 0xde, 0xfe, 0xd1, 0x00, 0x07, 0x3c, 0x89, 0x03, 0x69, 0x2d, 0xfb, 0x78, 0xca, 0xfa, - 0x96, 0xaf, 0xfe, 0xe5, 0x6f, 0xfb, 0xcb, 0x1d, 0x57, 0xdd, 0xc5, 0x41, 0xe5, 0xb1, 0xe8, 0x0f, - 0x9f, 0x03, 0x4b, 0x80, 0xfc, 0xaf, 0x30, 0xed, 0xa9, 0x27, 0x07, 0xb7, 0x61, 0x10, 0x9d, 0x51, - 0xeb, 0x1b, 0x76, 0xfd, 0xef, 0xe2, 0x01, 0x00, 0x59, 0xf5, 0xc8, 0x51, 0x06, 0xc0, 0x79, 0xf6, - 0xbb, 0x90, 0xf7, 0x2f, 0x16, 0xfd, 0xe4, 0xd5, 0xfe, 0xe5, 0xaf, 0xf6, 0x02, 0xca, 0x00, 0xac, - 0xab, 0x01, 0xa6, 0x96, 0xfb, 0xa9, 0xcf, 0x03, 0x3a, 0x4c, 0xfa, 0x71, 0xd7, 0x01, 0x06, 0x24, - 0x00, 0x5c, 0x94, 0xfc, 0xc9, 0xbc, 0x03, 0x3b, 0x40, 0x06, 0x5f, 0x6a, 0xfe, 0xdd, 0xb6, 0xfa, - 0x25, 0xce, 0xfe, 0xe2, 0x2e, 0xfb, 0x94, 0xb7, 0x54, 0x6a, 0x06, 0x43, 0x52, 0xd9, 0xed, 0x31, - 0x9b, 0x04, 0xbf, 0x14, 0xfa, 0x4a, 0x11, 0xea, 0x49, 0xc4, 0x04, 0x48, 0x8f, 0x10, 0x0c, 0xd3, - 0xec, 0xa7, 0x86, 0xfd, 0x20, 0x59, 0x01, 0xf0, 0xf1, 0xf4, 0xa2, 0x1a, 0x09, 0xdf, 0x3d, 0xf7, - 0x12, 0x68, 0xf6, 0xff, 0xf3, 0xfc, 0xf6, 0xad, 0xfe, 0x8c, 0xb0, 0xf7, 0x86, 0x87, 0x00, 0x31, - 0xb9, 0x02, 0x05, 0x36, 0xfa, 0x82, 0x09, 0x04, 0x78, 0x04, 0xfb, 0x72, 0xf8, 0xfe, 0x6c, 0xd3, - 0x02, 0xbb, 0xad, 0xfc, 0x4e, 0x33, 0xff, 0x69, 0x4a, 0x08, 0x4b, 0x33, 0x02, 0xb9, 0x2e, 0xfa, - 0xfe, 0x15, 0xff, 0x7a, 0xb8, 0xfc, 0xb7, 0x4d, 0x51, 0x7d, 0xc6, 0x44, 0x6e, 0x4b, 0xf2, 0x70, - 0x2f, 0x06, 0x79, 0x8a, 0xf8, 0x20, 0x57, 0xe6, 0xd1, 0x80, 0x02, 0xa9, 0x9d, 0x0f, 0x6c, 0xb4, - 0xee, 0xba, 0xc2, 0xfd, 0x3c, 0x0e, 0x01, 0x74, 0x7a, 0xf5, 0x3a, 0x21, 0x0b, 0x79, 0xc3, 0xf7, - 0x40, 0xcc, 0xf5, 0x6d, 0x0e, 0xfc, 0xbf, 0x11, 0xff, 0xa3, 0x93, 0xfa, 0x9b, 0x63, 0xfd, 0x8f, - 0x06, 0x03, 0x39, 0x81, 0xfa, 0xf0, 0xe9, 0x01, 0xe4, 0x10, 0xfd, 0x2f, 0x66, 0xfe, 0x4a, 0xf7, - 0x01, 0x39, 0x60, 0x00, 0x3e, 0x44, 0xfd, 0x9b, 0x90, 0x04, 0x1e, 0x2d, 0x05, 0x70, 0xb6, 0xfc, - 0x1f, 0x09, 0xff, 0x2d, 0x51, 0xfc, 0x61, 0xab, 0x4e, 0x95, 0xa5, 0x44, 0xe4, 0xc5, 0xf6, 0x1b, - 0x79, 0x07, 0x6a, 0xd9, 0xf7, 0x1d, 0xf8, 0xe2, 0x1d, 0x6b, 0xff, 0x06, 0x28, 0x0e, 0xe4, 0x1b, - 0xf1, 0x3c, 0x55, 0xfe, 0x10, 0xc4, 0x00, 0x77, 0xad, 0xf6, 0x63, 0x57, 0x0c, 0x9a, 0x5b, 0xf8, - 0x3c, 0x0d, 0xf4, 0x61, 0xc4, 0xfd, 0x3b, 0x22, 0xff, 0x5f, 0x7b, 0xfa, 0xe1, 0xf8, 0xfb, 0x79, - 0xa6, 0x01, 0x58, 0xe1, 0xfa, 0x66, 0x76, 0x01, 0xc8, 0x30, 0xfe, 0x8a, 0x83, 0xfe, 0x4b, 0x7e, - 0x01, 0xa1, 0xc0, 0x04, 0x00, 0x14, 0xfc, 0xa3, 0x64, 0xfe, 0x2b, 0xf2, 0x07, 0x9c, 0xee, 0xfe, - 0x03, 0x52, 0xfe, 0x30, 0xe0, 0xfc, 0xba, 0x29, 0x4d, 0x86, 0xbc, 0x42, 0x5f, 0x57, 0xfa, 0x2e, - 0xfb, 0x09, 0xb1, 0xbf, 0xf6, 0x88, 0x84, 0xe0, 0x3e, 0x2b, 0xfc, 0xb1, 0xb3, 0x0b, 0x42, 0x62, - 0xf5, 0x1a, 0x0a, 0xff, 0x69, 0xc3, 0xfe, 0x33, 0xd2, 0xfa, 0x19, 0x5f, 0x0b, 0x80, 0x8f, 0xf7, - 0x55, 0xfc, 0xf6, 0x4f, 0xc4, 0xfc, 0x88, 0xca, 0xfd, 0x64, 0xa8, 0xfb, 0x21, 0x50, 0xf9, 0x94, - 0x3e, 0x00, 0xf7, 0x7f, 0xfd, 0x6d, 0x9f, 0x00, 0xaa, 0x56, 0xfd, 0xac, 0x96, 0x02, 0x4e, 0xec, - 0x00, 0x6c, 0x61, 0x03, 0xe0, 0x42, 0x00, 0x63, 0xd7, 0xfa, 0x97, 0xfe, 0x03, 0x30, 0xff, 0x00, - 0xa8, 0x44, 0x00, 0xd8, 0xb1, 0xfd, 0xe8, 0x78, 0x4b, 0xf3, 0xfc, 0x40, 0xfb, 0xaa, 0xfc, 0x7d, - 0xa3, 0x0c, 0x0d, 0xe9, 0xf5, 0x3e, 0x87, 0xde, 0xc7, 0xff, 0xf7, 0xae, 0x09, 0x0b, 0xa4, 0x2c, - 0xf9, 0xeb, 0xa4, 0xff, 0xee, 0xca, 0xfd, 0xb5, 0xb4, 0xfc, 0xce, 0x7b, 0x0b, 0x1d, 0x8b, 0xf8, - 0x55, 0x42, 0xf7, 0xb2, 0x07, 0xfc, 0x82, 0xe3, 0xfc, 0x97, 0x95, 0xfa, 0x23, 0x86, 0xf8, 0x79, - 0x3e, 0x01, 0xe0, 0xcf, 0xfc, 0xc2, 0x42, 0x01, 0xfc, 0xe0, 0xff, 0x12, 0xf1, 0x01, 0x48, 0xb3, - 0x00, 0x42, 0xe4, 0x03, 0xf2, 0x17, 0x03, 0x4b, 0x3e, 0xf9, 0x33, 0xc3, 0xfe, 0x7a, 0x43, 0x01, - 0xe3, 0xbc, 0x02, 0xa2, 0xc7, 0xfe, 0xd5, 0xe8, 0x4b, 0xa3, 0x2f, 0x3c, 0x75, 0xee, 0xfe, 0x81, - 0xf1, 0x0f, 0x4c, 0x30, 0xf3, 0x70, 0x1a, 0xde, 0x7c, 0xcb, 0xf5, 0x7d, 0x84, 0x08, 0x31, 0x1d, - 0xff, 0xe9, 0xdd, 0xff, 0x5d, 0x00, 0xfa, 0xbe, 0x4b, 0x02, 0x00, 0x86, 0x0a, 0x5b, 0x1d, 0xf7, - 0xdb, 0xed, 0xf9, 0xa3, 0x6c, 0xf9, 0xf4, 0xe5, 0xfa, 0xc4, 0x72, 0xfc, 0x98, 0x87, 0xf8, 0xf3, - 0x65, 0xff, 0x48, 0x80, 0xff, 0x51, 0xbc, 0x02, 0x01, 0x9a, 0xfe, 0x99, 0x51, 0x01, 0x93, 0x3d, - 0x03, 0x97, 0x28, 0x04, 0x7e, 0x10, 0x01, 0xc0, 0x21, 0xfc, 0x25, 0x17, 0xfc, 0x9c, 0x4d, 0xfd, - 0x15, 0x6b, 0x04, 0xc3, 0x8e, 0x00, 0x88, 0xda, 0x4a, 0x77, 0xdf, 0x37, 0x5a, 0xa9, 0x00, 0xd5, - 0x1b, 0x13, 0xde, 0x58, 0xf0, 0x1e, 0x0c, 0xdf, 0x3a, 0xec, 0xf3, 0x20, 0xb9, 0x06, 0x21, 0x45, - 0x03, 0x60, 0xab, 0x00, 0x8b, 0xd4, 0xf7, 0x83, 0x22, 0x04, 0xf4, 0xd6, 0x0a, 0x03, 0xaa, 0xf6, - 0xf9, 0xc4, 0xf9, 0x82, 0x9c, 0xf6, 0xf3, 0xb5, 0xfc, 0x5c, 0xec, 0xfc, 0x19, 0x6a, 0xf6, 0x96, - 0xd0, 0x02, 0x41, 0x19, 0x00, 0x7b, 0x09, 0x00, 0x96, 0x71, 0x00, 0xc5, 0xcb, 0x01, 0xcb, 0x5d, - 0x02, 0xcd, 0x31, 0x05, 0x98, 0xea, 0xff, 0xa5, 0x82, 0xfd, 0x6d, 0xb1, 0xfc, 0xaf, 0xc6, 0xf8, - 0x89, 0x81, 0x03, 0x2a, 0x21, 0x02, 0x02, 0xfe, 0x46, 0xf1, 0x1c, 0x34, 0x6d, 0x71, 0x05, 0xb7, - 0xbd, 0x13, 0x97, 0xa0, 0xec, 0x3c, 0x64, 0xe6, 0xc2, 0x7e, 0xef, 0x1b, 0x02, 0x01, 0x96, 0x92, - 0x0d, 0x16, 0x79, 0xff, 0x9a, 0xf1, 0xf1, 0xad, 0x0d, 0x09, 0x7d, 0x12, 0x0a, 0x10, 0x4a, 0xf5, - 0xae, 0x26, 0xfa, 0x0f, 0x16, 0xf6, 0x46, 0xe7, 0xfc, 0xfb, 0xc7, 0xfd, 0x05, 0xe9, 0xf7, 0x3d, - 0xf9, 0x02, 0xe0, 0xec, 0xfe, 0x72, 0xa9, 0xff, 0xfe, 0xc6, 0x02, 0x0d, 0x31, 0x00, 0xb4, 0x1e, - 0x01, 0x4d, 0x3c, 0x07, 0x7b, 0x36, 0x00, 0xb7, 0x2e, 0xfc, 0xbd, 0x6d, 0xfe, 0xf7, 0x1d, 0xf8, - 0x87, 0x8e, 0xff, 0xf4, 0xd0, 0x02, 0xa7, 0x8a, 0x47, 0x30, 0x2f, 0x31, 0x6a, 0x7b, 0x04, 0x44, - 0x43, 0x0f, 0x0c, 0x5a, 0xed, 0x92, 0xed, 0xed, 0x60, 0x3b, 0xed, 0xc0, 0x08, 0xff, 0x54, 0x1f, - 0x11, 0x90, 0x87, 0xfe, 0x88, 0x64, 0xf1, 0x71, 0x84, 0x09, 0xf3, 0x15, 0x08, 0xe4, 0x11, 0xf6, - 0x14, 0x24, 0xfb, 0xa5, 0xf7, 0xf3, 0x0a, 0xa0, 0xff, 0x33, 0xc4, 0xff, 0x7e, 0x51, 0xf7, 0xdc, - 0x9e, 0x02, 0x9b, 0xad, 0xfe, 0xfa, 0xaa, 0x00, 0x13, 0x4c, 0x02, 0x08, 0x5b, 0xff, 0xb7, 0xbc, - 0x01, 0x4f, 0x87, 0x07, 0xbe, 0x5d, 0x00, 0xe3, 0x4f, 0xfc, 0x8c, 0xb1, 0xfd, 0xb1, 0xde, 0xf8, - 0x71, 0xa4, 0xfe, 0x54, 0x4c, 0x02, 0x17, 0x68, 0x4a, 0x88, 0xd7, 0x2d, 0x5f, 0x46, 0xfc, 0x63, - 0x03, 0x11, 0xd8, 0xf2, 0xec, 0x23, 0xe1, 0xf0, 0x9e, 0x39, 0xf3, 0xaa, 0x05, 0xfa, 0xd3, 0xc3, - 0x10, 0x99, 0x8f, 0x00, 0x96, 0x55, 0xf0, 0x08, 0x35, 0x08, 0x02, 0xf9, 0x07, 0x5f, 0xb5, 0xf5, - 0x62, 0xdc, 0xfa, 0xf8, 0x52, 0xf7, 0xa5, 0xc3, 0xff, 0xe9, 0x1e, 0xff, 0x33, 0x0d, 0xf8, 0xd0, - 0xf9, 0x02, 0x72, 0x6d, 0xff, 0x48, 0x93, 0xfe, 0x49, 0x54, 0x01, 0x76, 0x8b, 0x01, 0x09, 0x4c, - 0x02, 0x24, 0x83, 0x05, 0x53, 0x91, 0x00, 0x52, 0x05, 0xfd, 0xff, 0xae, 0xfc, 0x12, 0xf6, 0xf9, - 0x10, 0x25, 0xff, 0x80, 0xc5, 0x00, 0xf6, 0x47, 0x4a, 0x4e, 0x01, 0x29, 0x4f, 0xdf, 0xf6, 0x25, - 0x59, 0x16, 0x4d, 0x92, 0xee, 0xd4, 0xb6, 0xef, 0x1c, 0x1e, 0xf6, 0xa5, 0xb5, 0xfc, 0x83, 0xc8, - 0x0c, 0x93, 0x2f, 0xfe, 0xbd, 0x77, 0xf3, 0x66, 0x2d, 0x07, 0x4f, 0x78, 0x07, 0xd3, 0xf8, 0xf4, - 0x5f, 0xea, 0xfc, 0x28, 0xb0, 0xf9, 0x15, 0x46, 0xff, 0x12, 0x72, 0xfe, 0x81, 0x80, 0xf8, 0x73, - 0x31, 0x04, 0x15, 0x89, 0xfe, 0xb0, 0x68, 0xfd, 0xa3, 0x86, 0x01, 0xd5, 0x37, 0x02, 0x26, 0xa3, - 0x02, 0x0f, 0xfd, 0x04, 0x03, 0xe0, 0xff, 0xef, 0x42, 0xfd, 0x6d, 0xd0, 0xfc, 0x35, 0xb8, 0xfa, - 0xc0, 0x1e, 0x00, 0x11, 0x2b, 0x00, 0x68, 0xf3, 0x46, 0xdb, 0x32, 0x25, 0x35, 0x1b, 0xf4, 0x28, - 0xa6, 0x1b, 0x6f, 0x99, 0xf0, 0x29, 0xc3, 0xec, 0x47, 0xf2, 0xfb, 0x76, 0xb6, 0xfc, 0xda, 0xfa, - 0x06, 0x58, 0xc2, 0xff, 0xa7, 0x24, 0xf5, 0xf1, 0x85, 0x05, 0x0c, 0x75, 0x07, 0x2e, 0xc1, 0xf6, - 0x0b, 0x5c, 0xfd, 0x61, 0x10, 0xfb, 0xa4, 0x37, 0xff, 0xbe, 0xf8, 0xfd, 0x66, 0x08, 0xfa, 0xff, - 0xe5, 0x02, 0xa2, 0xf7, 0xfd, 0xb8, 0x6d, 0xfe, 0xa6, 0x48, 0x01, 0xa7, 0x3a, 0x01, 0xa6, 0x84, - 0x03, 0x18, 0x4e, 0x05, 0xac, 0xaf, 0xfe, 0x64, 0x31, 0xfd, 0x3b, 0xa5, 0xfd, 0x63, 0x90, 0xfb, - 0x94, 0x03, 0x00, 0x77, 0x55, 0x01, 0x00, 0xd8, 0x40, 0xf7, 0xf7, 0x21, 0xa5, 0x6b, 0xf7, 0xd7, - 0xec, 0x1a, 0xe6, 0xa4, 0xf1, 0x31, 0xad, 0xf1, 0x88, 0x29, 0xfc, 0x0e, 0x1e, 0xf9, 0xff, 0x75, - 0x07, 0x98, 0xfb, 0xff, 0xd2, 0x31, 0xf5, 0x31, 0xa8, 0x04, 0x01, 0x37, 0x08, 0xd9, 0xa8, 0xf8, - 0x68, 0x24, 0xfd, 0x45, 0xa6, 0xfb, 0xd4, 0x66, 0xff, 0x9d, 0xd4, 0xfe, 0x00, 0xe3, 0xf9, 0x28, - 0x8a, 0x01, 0x09, 0x95, 0xfe, 0x6d, 0xe3, 0xfe, 0x06, 0xa9, 0x00, 0x3e, 0x47, 0x01, 0xe7, 0x98, - 0x03, 0x62, 0xbd, 0x04, 0xd8, 0xdb, 0xfe, 0x2b, 0xb0, 0xfc, 0x9e, 0x54, 0xfe, 0x47, 0x07, 0xfd, - 0xe0, 0x57, 0xff, 0x95, 0x68, 0x01, 0xf4, 0xed, 0x38, 0x9e, 0x1d, 0x21, 0x65, 0x01, 0x01, 0x6b, - 0x47, 0x11, 0x97, 0x00, 0xef, 0xad, 0x88, 0xf6, 0xab, 0x65, 0x00, 0x15, 0x2a, 0xff, 0x66, 0x1a, - 0xff, 0x89, 0xc1, 0xfc, 0xb2, 0xc4, 0xf8, 0xd7, 0x47, 0x06, 0xe5, 0xb8, 0x04, 0xd6, 0x1a, 0xf8, - 0xd9, 0xf3, 0x00, 0xc5, 0x46, 0xfb, 0x95, 0x40, 0xfe, 0x08, 0xbd, 0xff, 0x2f, 0x55, 0xfa, 0x58, - 0x6b, 0x01, 0xc3, 0xc8, 0xfe, 0x18, 0x2b, 0xfd, 0x3b, 0x71, 0x01, 0xe4, 0xd9, 0x00, 0x61, 0x66, - 0xfe, 0x7d, 0x4d, 0x03, 0xbb, 0x55, 0x01, 0x0f, 0x47, 0xff, 0x87, 0x7d, 0x00, 0xb8, 0x6d, 0xfc, - 0x0d, 0xd7, 0xfe, 0x51, 0x3b, 0xff, 0x0e, 0xf7, 0x2f, 0xe1, 0xe2, 0x1f, 0x73, 0x95, 0x05, 0x14, - 0x9b, 0x0d, 0xbd, 0x5e, 0xf3, 0x5d, 0x14, 0xfb, 0x04, 0x14, 0xfe, 0x43, 0xd3, 0xfd, 0x7c, 0x9f, - 0x00, 0x2f, 0xb2, 0xfd, 0x35, 0x7c, 0xf8, 0x7e, 0x29, 0x05, 0x74, 0xae, 0x05, 0x7d, 0xc5, 0xf9, - 0x5c, 0x55, 0x00, 0xbb, 0x12, 0xfc, 0xa4, 0xe2, 0xfe, 0x78, 0x91, 0xff, 0xcc, 0x45, 0xfb, 0x67, - 0xea, 0x00, 0x63, 0xc8, 0xfe, 0x0e, 0xb0, 0xfd, 0xfb, 0x1e, 0x01, 0xaf, 0x97, 0x00, 0x69, 0x15, - 0xff, 0x43, 0x52, 0x03, 0x4c, 0x40, 0x01, 0xfd, 0xdb, 0xff, 0x65, 0xa9, 0xff, 0xaa, 0xb7, 0xfc, - 0xbd, 0x11, 0x00, 0xbd, 0xfb, 0xff, 0x31, 0x5a, 0x26, 0x09, 0xd8, 0x1f, 0x21, 0xbb, 0x09, 0x1a, - 0x86, 0x09, 0x3b, 0xe3, 0xf7, 0x5c, 0xaa, 0xfd, 0xde, 0xc9, 0xfc, 0x93, 0xc4, 0xfc, 0xbb, 0x30, - 0x01, 0x8c, 0x51, 0xfe, 0xf5, 0x27, 0xf9, 0xfd, 0x6f, 0x04, 0xae, 0xbd, 0x04, 0x9d, 0xa2, 0xfb, - 0x8a, 0x16, 0x00, 0x0b, 0xc5, 0xfc, 0x40, 0xd4, 0xfe, 0x7c, 0x33, 0xff, 0xcb, 0x7d, 0xfc, 0x66, - 0x91, 0x00, 0x00, 0x62, 0xfe, 0x46, 0xd8, 0xfd, 0x9a, 0x3a, 0x01, 0x1f, 0x31, 0x00, 0xdc, 0xb3, - 0xff, 0xf3, 0x98, 0x02, 0xe4, 0xfa, 0x00, 0xb5, 0x8b, 0x00, 0x1b, 0x60, 0xff, 0x6e, 0x6e, 0xfd, - 0xa8, 0xcd, 0x00, 0x3b, 0xc4, 0x00, 0x5d, 0x1a, 0x20, 0xf6, 0x22, 0x1e, 0xf7, 0x51, 0x0a, 0x86, - 0xa8, 0x09, 0xe9, 0xea, 0xfa, 0x2b, 0xfe, 0xfc, 0x80, 0xdd, 0xfd, 0x3e, 0xbd, 0xfd, 0x6d, 0xbc, - 0x00, 0x66, 0x1c, 0xfe, 0x47, 0xb9, 0xfa, 0xca, 0xdd, 0x03, 0x2a, 0x15, 0x04, 0xb9, 0x88, 0xfc, - 0x48, 0x04, 0x00, 0x99, 0xca, 0xfd, 0x1f, 0x8a, 0xfe, 0x54, 0x7f, 0xff, 0x9d, 0x59, 0xfd, 0xa3, - 0xde, 0xff, 0x31, 0x9d, 0xfe, 0xfb, 0xcd, 0xfe, 0x37, 0x82, 0x00, 0xee, 0xca, 0xff, 0x78, 0x78, - 0x00, 0xa9, 0x25, 0x02, 0xbf, 0x7e, 0x01, 0xe4, 0xfa, 0x00, 0xab, 0x7c, 0xff, 0xcd, 0xf0, 0xfe, - 0xe2, 0x64, 0x01, 0xbc, 0x08, 0x00, 0x69, 0x5b, 0x1c, 0x39, 0x35, 0x1b, 0x9a, 0xe4, 0x09, 0x64, - 0xa7, 0x0a, 0xe9, 0x52, 0xfc, 0x2f, 0x3e, 0xfc, 0xa8, 0x4d, 0xff, 0x88, 0x33, 0xff, 0xb0, 0x85, - 0xff, 0xae, 0x39, 0xfe, 0xcc, 0x6d, 0xfc, 0x5c, 0xf6, 0x02, 0xf3, 0x7f, 0x03, 0x0f, 0xe2, 0xfc, - 0xa2, 0x66, 0x00, 0x67, 0xb8, 0xfe, 0xc8, 0x0f, 0xfe, 0x5e, 0x9e, 0xff, 0xa9, 0x54, 0xfe, 0xa2, - 0xa0, 0xff, 0x67, 0xa5, 0xfe, 0x2d, 0x35, 0xff, 0x09, 0xd3, 0xff, 0x9b, 0x17, 0x00, 0x47, 0x21, - 0x01, 0x7c, 0x36, 0x02, 0xec, 0x78, 0x02, 0xc8, 0xfb, 0x00, 0xac, 0x9e, 0xff, 0x16, 0xd8, 0xff, - 0xb9, 0xd1, 0x00, 0x60, 0x1b, 0xff, 0xd2, 0xa9, 0x18, 0xec, 0x77, 0x18, 0x61, 0x6e, 0x0a, 0xd9, - 0xe8, 0x0a, 0x07, 0x90, 0xfd, 0xb4, 0x80, 0xfc, 0x4f, 0xde, 0xff, 0xa2, 0x67, 0x00, 0xd8, 0x46, - 0xff, 0x48, 0xc4, 0xfe, 0xd7, 0x33, 0xfd, 0x01, 0xe9, 0x01, 0x70, 0x79, 0x03, 0x4b, 0xf4, 0xfd, - 0x77, 0x6b, 0x00, 0x5f, 0xe4, 0xfe, 0x93, 0x61, 0xfe, 0xc8, 0x6f, 0x00, 0x57, 0xfb, 0xfe, 0xaf, - 0xc2, 0xfe, 0xa5, 0x46, 0xff, 0xf9, 0xdb, 0xff, 0xc6, 0x88, 0xff, 0xa4, 0x3e, 0x01, 0x71, 0xcc, - 0x01, 0xe8, 0x99, 0x02, 0xc5, 0xdb, 0x02, 0x8e, 0x71, 0x00, 0xa2, 0x96, 0xff, 0x25, 0xc9, 0xff, - 0xd7, 0x34, 0x00, 0xf7, 0xbc, 0xfe, 0x3b, 0x29, 0x15, 0x3c, 0xf7, 0x15, 0x95, 0x0f, 0x0b, 0x93, - 0x00, 0x0b, 0x44, 0xbd, 0xfe, 0xfa, 0xb6, 0xfc, 0x4a, 0x1a, 0x00, 0x62, 0xca, 0x01, 0x2b, 0x42, - 0xff, 0xcd, 0xe0, 0xfe, 0x76, 0xb2, 0xfd, 0xc5, 0x54, 0x01, 0x3b, 0x81, 0x03, 0xa1, 0x87, 0xfe, - 0x7e, 0x8f, 0x00, 0x6a, 0x52, 0xff, 0xce, 0xec, 0xfe, 0x8e, 0xdd, 0x00, 0x60, 0xed, 0xfe, 0xa3, - 0xe1, 0xfe, 0x64, 0x6c, 0x00, 0xff, 0x91, 0x00, 0x79, 0x3a, 0x00, 0xd8, 0xab, 0x01, 0x68, 0xce, - 0x01, 0x6a, 0xea, 0x02, 0x2a, 0xf1, 0x01, 0xa6, 0x53, 0xff, 0xca, 0xcc, 0xff, 0x7a, 0x0e, 0x00, - 0x2b, 0xd5, 0xff, 0x01, 0x79, 0xfe, 0x4f, 0x81, 0x12, 0x9a, 0x8d, 0x14, 0xe5, 0xda, 0x0a, 0x1c, - 0xf9, 0x09, 0x48, 0x20, 0x00, 0xd9, 0x6d, 0xfd, 0x97, 0x60, 0x00, 0x5d, 0x56, 0x02, 0xf2, 0x51, - 0xff, 0x4b, 0x7f, 0xff, 0x24, 0x23, 0xfe, 0x8c, 0x86, 0x00, 0x0e, 0x8a, 0x03, 0x89, 0xdc, 0xff, - 0xcf, 0x53, 0x00, 0x42, 0x7c, 0xff, 0x82, 0xbb, 0xff, 0x64, 0xfc, 0x00, 0x5f, 0xba, 0xff, 0x11, - 0x4b, 0x00, 0x37, 0x9e, 0x01, 0x6b, 0x6c, 0x00, 0x98, 0x2b, 0x00, 0x8d, 0x0a, 0x02, 0xdf, 0x54, - 0x01, 0xd5, 0x8b, 0x01, 0xd0, 0x23, 0x01, 0x0a, 0xb4, 0xff, 0xed, 0x15, 0x00, 0xe7, 0xe7, 0xff, - 0xd5, 0x48, 0xff, 0xf4, 0xab, 0xfe, 0x40, 0x8d, 0x0f, 0xa5, 0x58, 0x12, 0x58, 0xa3, 0x0b, 0xb9, - 0x92, 0x0a, 0x40, 0x84, 0x00, 0x76, 0x5c, 0xfd, 0x89, 0xbd, 0x00, 0xf9, 0x60, 0x03, 0x1d, 0xb5, - 0xff, 0xb1, 0x42, 0xff, 0xbd, 0x74, 0xfe, 0x86, 0xa9, 0x00, 0x59, 0x9e, 0x03, 0x6c, 0x61, 0x00, - 0x83, 0x64, 0x00, 0xb2, 0xf9, 0xff, 0xff, 0x01, 0x01, 0x1a, 0x36, 0x02, 0x77, 0xe9, 0x00, 0xbf, - 0xe3, 0x00, 0x62, 0xec, 0x00, 0xa1, 0x2f, 0x00, 0xcc, 0x01, 0x00, 0xfe, 0xcb, 0x00, 0x4a, 0xe5, - 0x00, 0xd1, 0x49, 0x01, 0x04, 0xf4, 0x00, 0xb3, 0xc1, 0xff, 0x52, 0x25, 0x00, 0xba, 0xe0, 0xff, - 0xe3, 0xf1, 0xfe, 0x01, 0xfa, 0xfe, 0x18, 0x39, 0x0e, 0x50, 0x74, 0x11, 0x33, 0x70, 0x0b, 0xc0, - 0x1b, 0x09, 0xbf, 0xa9, 0x00, 0xbf, 0x47, 0xfe, 0x4a, 0x82, 0x01, 0xbf, 0x39, 0x03, 0xd2, 0xe2, - 0xff, 0x8b, 0xc7, 0xff, 0xf0, 0xc4, 0xfe, 0xdd, 0xe2, 0x00, 0x03, 0xa4, 0x03, 0x07, 0xb1, 0x00, - 0x7c, 0x52, 0x01, 0x1b, 0x36, 0x02, 0xd7, 0x3b, 0x02, 0x0f, 0xb4, 0x01, 0xa4, 0xb7, 0x00, 0xfc, - 0xb9, 0x00, 0xa6, 0x9f, 0xff, 0x84, 0x23, 0xff, 0x57, 0x0f, 0x00, 0xbe, 0xbb, 0x00, 0xee, 0x99, - 0x00, 0x3f, 0xcf, 0x00, 0xfc, 0x90, 0x00, 0x43, 0x1c, 0x00, 0xe7, 0x46, 0x00, 0x04, 0x45, 0xff, - 0x11, 0xe7, 0xfe, 0xf7, 0xd9, 0xfe, 0xa3, 0xbe, 0x0c, 0x5b, 0x54, 0x10, 0x0a, 0xa8, 0x0b, 0xc6, - 0xcc, 0x08, 0x09, 0x48, 0x00, 0x41, 0x92, 0xfe, 0x87, 0x92, 0x02, 0xd1, 0x9c, 0x03, 0x7a, 0xb7, - 0xff, 0x1d, 0x6e, 0x00, 0x83, 0x34, 0xff, 0x48, 0xa4, 0x00, 0x3f, 0x33, 0x05, 0x28, 0xe4, 0x02, - 0xa0, 0xff, 0x01, 0x9c, 0xe8, 0x01, 0xd7, 0x92, 0x01, 0x4c, 0x5d, 0x01, 0xfa, 0xc2, 0xff, 0x27, - 0xe8, 0xfe, 0x74, 0x60, 0xff, 0xee, 0x02, 0x00, 0xf0, 0x8a, 0xff, 0xd3, 0x18, 0x00, 0x70, 0x8f, - 0x00, 0x91, 0xb9, 0x00, 0x7f, 0x95, 0x00, 0x05, 0xdc, 0xff, 0xec, 0xdc, 0xff, 0x57, 0xf5, 0xfe, - 0xc3, 0xbd, 0xfe, 0x7f, 0xca, 0xfe, 0x88, 0x2d, 0x0c, 0x79, 0x19, 0x10, 0x86, 0x5b, 0x0b, 0x16, - 0x9f, 0x07, 0x1d, 0xfe, 0xff, 0x0a, 0x9d, 0xff, 0xf5, 0x6f, 0x03, 0x21, 0xfe, 0x03, 0x43, 0x4f, - 0xff, 0xf8, 0x99, 0x00, 0x9b, 0x02, 0x02, 0x05, 0xea, 0x02, 0x18, 0xec, 0x04, 0x4d, 0xde, 0x01, - 0xc3, 0xa7, 0x01, 0xbb, 0x5a, 0x01, 0x17, 0xea, 0xff, 0x55, 0xe4, 0xff, 0x5e, 0x84, 0xff, 0x47, - 0xf2, 0xfe, 0x55, 0x5f, 0xff, 0xb3, 0x9c, 0xff, 0x92, 0x3c, 0xff, 0xc4, 0xc6, 0x00, 0xb6, 0x62, - 0x00, 0x82, 0x83, 0xff, 0x3c, 0x60, 0x00, 0x84, 0x0a, 0x00, 0xb7, 0x28, 0xff, 0xc8, 0xc0, 0xfe, - 0x97, 0xd4, 0xfe, 0x99, 0x5f, 0xfe, 0x15, 0xa1, 0x0c, 0x91, 0xd3, 0x10, 0x57, 0x46, 0x0a, 0xba, - 0x24, 0x06, 0x92, 0x4c, 0x00, 0x01, 0x1d, 0x01, 0x61, 0x72, 0x03, 0x1b, 0xa1, 0x04, 0x58, 0x24, - 0x02, 0xa3, 0x64, 0x02, 0x20, 0x8d, 0x02, 0xd1, 0x91, 0x01, 0x6a, 0x9b, 0x03, 0x85, 0x74, 0x01, - 0xe5, 0xd1, 0xff, 0xca, 0xf6, 0xff, 0xfc, 0x12, 0x00, 0xcd, 0xc4, 0xff, 0xc2, 0xf5, 0xfe, 0x51, - 0x93, 0xfe, 0xb1, 0x0a, 0x00, 0x27, 0x4f, 0x00, 0xa8, 0x19, 0xff, 0x8e, 0x00, 0x00, 0x1b, 0x7e, - 0xff, 0xf6, 0x88, 0xff, 0x10, 0x7a, 0x00, 0xd2, 0xdb, 0xff, 0xdb, 0xbd, 0xfe, 0xeb, 0x66, 0xfe, - 0x3e, 0xf4, 0xfe, 0x0e, 0x7d, 0xfe, 0x53, 0x38, 0x0d, 0x20, 0x75, 0x12, 0x97, 0xd4, 0x08, 0x44, - 0xb9, 0x04, 0x82, 0x31, 0x00, 0xb8, 0x8b, 0x03, 0xd0, 0xe8, 0x07, 0x97, 0x76, 0x05, 0xdc, 0x4f, - 0x01, 0x82, 0x66, 0x01, 0xb0, 0x18, 0x02, 0x09, 0x71, 0x00, 0xc3, 0x81, 0x01, 0x3f, 0x5f, 0x00, - 0x90, 0x28, 0x00, 0xd2, 0xda, 0xff, 0x99, 0x2e, 0xff, 0xf7, 0x96, 0xff, 0x3e, 0x4f, 0xff, 0x5c, - 0xf8, 0xff, 0xa1, 0x40, 0x00, 0x60, 0x38, 0xff, 0xdf, 0xa6, 0xfe, 0xba, 0xa0, 0xff, 0x8e, 0x85, - 0xff, 0x68, 0x93, 0xff, 0x75, 0x79, 0x00, 0xe6, 0x80, 0xff, 0xbf, 0x51, 0xfe, 0x83, 0xc0, 0xfe, - 0x03, 0x3e, 0xff, 0x31, 0xd7, 0xfe, 0x75, 0x67, 0x0d, 0xe3, 0x1b, 0x13, 0x8f, 0x9d, 0x07, 0x6d, - 0x52, 0x04, 0x53, 0xf7, 0x04, 0x62, 0xd2, 0x06, 0xcd, 0x95, 0x06, 0x30, 0xf4, 0x03, 0x5c, 0xec, - 0x00, 0xe7, 0x50, 0x00, 0xf6, 0xa5, 0x00, 0x65, 0xad, 0xff, 0xbc, 0x1f, 0x01, 0xc8, 0x01, 0x00, - 0x2d, 0xd7, 0xff, 0x4a, 0xb8, 0xff, 0xa5, 0xef, 0xfe, 0xd7, 0x7b, 0x00, 0xd0, 0x99, 0x00, 0x2a, - 0x2b, 0xff, 0xf6, 0x05, 0xff, 0xad, 0x64, 0xff, 0x28, 0xd9, 0xfe, 0xe8, 0xdf, 0xfe, 0x7e, 0x5e, - 0xff, 0x6c, 0x22, 0x00, 0x54, 0xc5, 0xff, 0x3e, 0x4f, 0xff, 0x1a, 0x06, 0xff, 0xc3, 0x02, 0xff, - 0xfd, 0x0a, 0xff, 0xf3, 0xc1, 0xfe, 0x22, 0x22, 0x0c, 0xe1, 0x67, 0x12, 0x8e, 0x92, 0x0b, 0x7b, - 0xb5, 0x07, 0x30, 0xaa, 0x03, 0x9f, 0x00, 0x06, 0x35, 0xe3, 0x06, 0x46, 0xf1, 0x02, 0x1e, 0xc0, - 0xff, 0xa3, 0xc2, 0xff, 0x5e, 0xc4, 0x00, 0xd1, 0xce, 0xff, 0xc0, 0x52, 0x00, 0x24, 0xda, 0xff, - 0x6b, 0xf9, 0xff, 0x4a, 0x32, 0x00, 0xd7, 0x69, 0x00, 0x05, 0x7c, 0x00, 0xe5, 0x81, 0xff, 0xbf, - 0x4f, 0xff, 0xda, 0x59, 0xff, 0x5f, 0x12, 0xff, 0xfc, 0x71, 0xfe, 0xe2, 0x10, 0xff, 0x90, 0x64, - 0xff, 0xaa, 0xbe, 0xff, 0xd2, 0x28, 0x00, 0xc1, 0xd7, 0xff, 0x79, 0x62, 0xff, 0x8c, 0xdb, 0xfe, - 0xfa, 0x96, 0xfe, 0xff, 0xc7, 0xfe, 0xca, 0x36, 0x0f, 0xcb, 0x19, 0x17, 0xac, 0x94, 0x09, 0x9e, - 0x7f, 0x03, 0xae, 0x89, 0x04, 0xb0, 0x26, 0x06, 0xd3, 0x1e, 0x05, 0x58, 0x55, 0x02, 0xd4, 0x51, - 0xff, 0x67, 0xc0, 0xff, 0x2e, 0xb3, 0x00, 0xf1, 0x02, 0x00, 0x17, 0xa1, 0x00, 0x7a, 0x5a, 0xff, - 0x5b, 0x8d, 0x00, 0xbf, 0xee, 0x01, 0xa7, 0x57, 0x00, 0x68, 0xdc, 0xfe, 0x4e, 0xe8, 0xff, 0xed, - 0xf5, 0xff, 0x60, 0xcf, 0xfe, 0x7c, 0x96, 0xfe, 0xee, 0xa0, 0xfe, 0xb3, 0x37, 0xff, 0xc9, 0x2f, - 0xff, 0x40, 0x2a, 0x00, 0xd8, 0xa2, 0x00, 0xa7, 0x06, 0x00, 0x3f, 0xf2, 0xfe, 0xcd, 0x80, 0xfe, - 0x2d, 0xc8, 0xfe, 0x10, 0x87, 0xfe, 0x49, 0x10, 0x10, 0xb0, 0xf5, 0x18, 0x58, 0x0b, 0x08, 0xa8, - 0x10, 0x01, 0xe7, 0x83, 0x04, 0xc9, 0x76, 0x05, 0xc5, 0xb8, 0x04, 0x3f, 0x3f, 0x03, 0xf2, 0x05, - 0x00, 0xc4, 0xf9, 0xfe, 0x4a, 0x4c, 0x01, 0xf3, 0x6f, 0x00, 0x4f, 0x49, 0x00, 0xbf, 0x65, 0x00, - 0xf8, 0x4b, 0x01, 0x1a, 0xd1, 0x01, 0x29, 0xf4, 0xff, 0x9e, 0x9d, 0xff, 0x30, 0xe6, 0xff, 0xd7, - 0xb3, 0xff, 0xc4, 0xd8, 0xfe, 0x69, 0xe9, 0xfe, 0xa6, 0xa1, 0xfe, 0x84, 0xb3, 0xfe, 0xb2, 0x96, - 0xff, 0x9a, 0x52, 0x00, 0x82, 0xae, 0x00, 0xb1, 0xee, 0xff, 0x03, 0x3f, 0xff, 0x35, 0x7b, 0xfe, - 0x45, 0x98, 0xfe, 0x23, 0xa7, 0xfe, 0x60, 0x15, 0x0c, 0xd4, 0x95, 0x16, 0x3d, 0x25, 0x0d, 0x06, - 0x3c, 0x02, 0x6a, 0x1b, 0x01, 0x9f, 0x99, 0x03, 0xd6, 0x65, 0x05, 0x30, 0xfb, 0x04, 0xd5, 0x53, - 0x00, 0xa5, 0x1e, 0xff, 0x1a, 0xb4, 0x01, 0x53, 0x7b, 0x01, 0x91, 0xf4, 0xff, 0x87, 0x38, 0x00, - 0xaa, 0xf6, 0x01, 0x9c, 0x03, 0x02, 0xdc, 0xd6, 0x00, 0xfe, 0xac, 0xff, 0x28, 0xcf, 0xff, 0x8f, - 0x2a, 0x00, 0x7c, 0x5e, 0xff, 0x0d, 0x9d, 0xfe, 0x44, 0xe0, 0xfe, 0x4e, 0x06, 0xff, 0x36, 0x0b, - 0xff, 0x6d, 0x0f, 0x00, 0xe5, 0x92, 0x00, 0xe8, 0x34, 0x00, 0x4a, 0x62, 0xff, 0xcd, 0xef, 0xfe, - 0x73, 0xbf, 0xfe, 0x2a, 0x93, 0xfe, 0x74, 0x12, 0x0a, 0x13, 0xe2, 0x13, 0xb9, 0xab, 0x0e, 0xa3, - 0xb9, 0x04, 0x37, 0xa4, 0x00, 0xd7, 0x2b, 0x02, 0x30, 0x1a, 0x04, 0x0e, 0xe4, 0x04, 0x97, 0x2e, - 0x01, 0xbd, 0x2d, 0xff, 0x2c, 0x8d, 0x01, 0x9a, 0x53, 0x02, 0x8b, 0x81, 0x00, 0xdb, 0x45, 0x00, - 0x76, 0xb1, 0x01, 0x81, 0x7c, 0x01, 0xf3, 0xbb, 0x01, 0xc5, 0xab, 0x00, 0x51, 0x20, 0x00, 0x50, - 0x3a, 0x00, 0x0d, 0x4d, 0xff, 0x7f, 0x46, 0xff, 0x3f, 0x69, 0xff, 0x97, 0xe8, 0xfe, 0x92, 0xd7, - 0xfe, 0x6c, 0xf7, 0xff, 0x4c, 0x7b, 0x00, 0x20, 0xf5, 0xff, 0xf4, 0x2c, 0xff, 0xa7, 0x4e, 0xff, - 0x81, 0x2f, 0xff, 0x85, 0xae, 0xfe, 0xdc, 0xf8, 0x09, 0xa7, 0x5d, 0x13, 0xdf, 0xd1, 0x0d, 0x2a, - 0x5e, 0x05, 0x62, 0x5a, 0x01, 0x43, 0x69, 0x01, 0x05, 0xd0, 0x03, 0x52, 0xf3, 0x04, 0xdf, 0xb8, - 0x00, 0xf2, 0x4a, 0xfe, 0xcd, 0x38, 0x01, 0x7b, 0xa9, 0x02, 0x00, 0xd6, 0x00, 0xb4, 0x36, 0x00, - 0xe0, 0xba, 0x01, 0x6a, 0xb1, 0x01, 0xc2, 0x4f, 0x01, 0x91, 0xdb, 0x00, 0xad, 0xd6, 0x00, 0xbb, - 0xb0, 0x00, 0xde, 0xbf, 0xff, 0xac, 0x8a, 0xff, 0x1e, 0x83, 0xff, 0x7d, 0x5d, 0xff, 0xc6, 0x96, - 0xff, 0x67, 0x92, 0xff, 0x95, 0x19, 0x00, 0xaf, 0x4c, 0x00, 0xe1, 0x1d, 0xff, 0xfb, 0xd2, 0xfe, - 0x3f, 0xf1, 0xfe, 0xd4, 0x2c, 0xff, 0xb9, 0x66, 0x0a, 0x62, 0x5d, 0x13, 0x45, 0x2a, 0x0d, 0x50, - 0xbb, 0x05, 0xe2, 0xdf, 0x01, 0x94, 0xfa, 0x00, 0x94, 0x6c, 0x03, 0xc7, 0x15, 0x05, 0x4b, 0xd7, - 0x00, 0xb3, 0x04, 0xfe, 0x1d, 0x91, 0x00, 0xfe, 0xfd, 0x01, 0x76, 0x67, 0x00, 0x15, 0x08, 0x00, - 0x66, 0x9e, 0x01, 0xed, 0x57, 0x01, 0xe3, 0x32, 0x01, 0xb2, 0x92, 0x01, 0xd1, 0x90, 0x00, 0xa1, - 0x3e, 0x00, 0x89, 0x7c, 0x00, 0x4d, 0x01, 0x00, 0xb6, 0xd5, 0xff, 0xaa, 0xd5, 0xff, 0xcd, 0xf5, - 0xff, 0xb7, 0xe6, 0xff, 0x35, 0x3b, 0x00, 0x97, 0x2a, 0x00, 0x0c, 0x57, 0xff, 0x58, 0xaa, 0xfe, - 0x93, 0x92, 0xfe, 0xff, 0xde, 0xfe, 0x3f, 0x57, 0x0b, 0x15, 0x39, 0x14, 0x9a, 0x8c, 0x0c, 0x4b, - 0x90, 0x05, 0x5c, 0x11, 0x02, 0x57, 0xd7, 0x00, 0x3f, 0x8b, 0x03, 0x77, 0x32, 0x05, 0x5c, 0x89, - 0x00, 0x53, 0xdb, 0xfd, 0xfe, 0x9a, 0x00, 0x55, 0xf0, 0x01, 0x2f, 0x49, 0x00, 0x8e, 0xf4, 0xfe, - 0xc1, 0xc4, 0x00, 0x60, 0x18, 0x01, 0xe8, 0xb2, 0x00, 0x60, 0xa7, 0x01, 0x2f, 0x0c, 0x01, 0xe3, - 0x3e, 0x00, 0xce, 0x14, 0x00, 0x14, 0xa1, 0xff, 0x94, 0x87, 0x00, 0xd6, 0x9c, 0x00, 0xbd, 0xed, - 0xff, 0x6e, 0xbd, 0x00, 0x7c, 0xb3, 0x00, 0xbd, 0x31, 0x00, 0xbd, 0x9c, 0xff, 0xf3, 0xe7, 0xfe, - 0xc6, 0x92, 0xfe, 0x32, 0x82, 0xfe, 0x9d, 0x1d, 0x0c, 0x5c, 0x8b, 0x15, 0x56, 0x63, 0x0c, 0x4d, - 0xf9, 0x04, 0x02, 0x8e, 0x02, 0xcc, 0xaf, 0x00, 0xdd, 0x3a, 0x03, 0x27, 0x6e, 0x05, 0x84, 0x6d, - 0x00, 0x39, 0xaf, 0xfd, 0x4a, 0x64, 0x00, 0xcd, 0xd3, 0x01, 0xdc, 0xa5, 0x00, 0xe8, 0xac, 0xfe, - 0x74, 0xed, 0xff, 0x47, 0x87, 0x00, 0x0f, 0x7f, 0xff, 0xbd, 0xdc, 0x00, 0xde, 0xce, 0x01, 0x74, - 0x32, 0x00, 0xa6, 0x98, 0xff, 0x6f, 0x95, 0xff, 0x4b, 0x1a, 0x00, 0x90, 0xb3, 0x00, 0x3b, 0x3a, - 0x00, 0x5e, 0x15, 0x01, 0x59, 0x31, 0x01, 0x0b, 0x92, 0x00, 0x15, 0x3a, 0x00, 0xed, 0x24, 0xff, - 0x26, 0x7c, 0xfe, 0x41, 0xc0, 0xfe, 0x86, 0x27, 0x0d, 0x98, 0x32, 0x17, 0xa7, 0x33, 0x0c, 0xd5, - 0x7a, 0x04, 0xa2, 0xf6, 0x02, 0xa8, 0x4e, 0x00, 0x06, 0xfc, 0x02, 0x0f, 0xbf, 0x05, 0xac, 0x25, - 0x00, 0x2c, 0x31, 0xfd, 0x07, 0x89, 0x00, 0xda, 0xc8, 0x01, 0xa9, 0x79, 0x00, 0x0c, 0xdd, 0xfe, - 0xd0, 0x6e, 0xff, 0x6a, 0x3f, 0x00, 0x67, 0xfe, 0xfe, 0x0a, 0x7e, 0xff, 0x03, 0x95, 0x01, 0x2d, - 0x3f, 0x00, 0x6a, 0x33, 0xff, 0x58, 0x65, 0xff, 0xf2, 0x9b, 0xff, 0x3e, 0x99, 0x00, 0xd9, 0x3a, - 0x00, 0xe1, 0x9b, 0x00, 0x02, 0x81, 0x01, 0x32, 0x08, 0x01, 0xfa, 0x46, 0x00, 0x63, 0xe1, 0xff, - 0xd0, 0x39, 0xff, 0xfe, 0x87, 0xfe, 0x80, 0x9e, 0x0e, 0x73, 0x3f, 0x19, 0xef, 0xee, 0x0b, 0xa0, - 0xb3, 0x03, 0xac, 0x75, 0x03, 0x7a, 0x1b, 0x00, 0x82, 0xaa, 0x02, 0x3a, 0x10, 0x06, 0x6f, 0xf2, - 0xff, 0x83, 0xc8, 0xfc, 0x8d, 0x97, 0x00, 0xc8, 0xc9, 0x01, 0x59, 0x44, 0x00, 0x2f, 0x2f, 0xff, - 0xa5, 0x3f, 0xff, 0x32, 0xd2, 0xff, 0x38, 0xf6, 0xfe, 0x21, 0xbe, 0xfe, 0x05, 0x13, 0x01, 0x37, - 0xa8, 0x00, 0x41, 0x8b, 0xfe, 0x3d, 0xa6, 0xfe, 0x6a, 0xb7, 0xff, 0xba, 0x59, 0x00, 0x3c, 0x12, - 0x00, 0x45, 0x24, 0x00, 0x09, 0x77, 0x01, 0x18, 0x17, 0x01, 0xc3, 0x0f, 0x00, 0x27, 0x5e, 0x00, - 0xe6, 0xbe, 0xff, 0x37, 0x22, 0xff, 0xa4, 0x57, 0x10, 0x0d, 0xa3, 0x1b, 0x6a, 0xa3, 0x0b, 0xee, - 0xb0, 0x02, 0x6e, 0xe5, 0x03, 0x15, 0xe1, 0xff, 0xf6, 0x76, 0x02, 0xf0, 0x75, 0x06, 0x34, 0x48, - 0xff, 0xec, 0x85, 0xfc, 0x99, 0xeb, 0x00, 0xaf, 0xb6, 0x01, 0xf2, 0xd3, 0xff, 0x1c, 0x1d, 0xff, - 0x24, 0x9c, 0xff, 0x9b, 0x74, 0xff, 0x31, 0x9e, 0xfe, 0xbc, 0x82, 0xfe, 0xf5, 0x5e, 0x00, 0x40, - 0x0b, 0x01, 0xd2, 0xd0, 0xfe, 0x6a, 0xb6, 0xfd, 0x5e, 0x63, 0xff, 0xd4, 0x26, 0x00, 0x32, 0xdb, - 0xff, 0x79, 0x07, 0x00, 0x7c, 0xcb, 0x00, 0x51, 0xdb, 0x00, 0x32, 0x3b, 0x00, 0x15, 0x06, 0x00, - 0x66, 0xd0, 0xff, 0xd0, 0x93, 0xff, 0xce, 0x89, 0x12, 0x92, 0x36, 0x1e, 0x9d, 0xfd, 0x0a, 0x3b, - 0xc7, 0x01, 0xdf, 0x31, 0x04, 0x0b, 0x5f, 0xff, 0x28, 0x95, 0x02, 0x59, 0xe2, 0x06, 0xb6, 0x38, - 0xfe, 0xe9, 0x38, 0xfc, 0xf0, 0x8a, 0x01, 0xcf, 0xaf, 0x01, 0x44, 0x33, 0xff, 0x6e, 0xe2, 0xfe, - 0x9c, 0xd4, 0xff, 0x01, 0x38, 0xff, 0xa5, 0x2e, 0xfe, 0x82, 0x55, 0xfe, 0x4a, 0xf5, 0xff, 0xa9, - 0xc8, 0x00, 0x6d, 0x6c, 0xff, 0xaf, 0x6c, 0xfd, 0x91, 0xe5, 0xfe, 0x5f, 0x3e, 0x00, 0xe1, 0x5c, - 0xff, 0x97, 0xcc, 0xff, 0x70, 0x6b, 0x00, 0xbb, 0x31, 0x00, 0x27, 0x05, 0x00, 0x0d, 0xea, 0xff, - 0x02, 0xc8, 0xff, 0xde, 0x4f, 0xff, 0x93, 0xb3, 0x14, 0x45, 0xee, 0x20, 0x90, 0x89, 0x0a, 0xc4, - 0xc4, 0x00, 0xf5, 0x33, 0x04, 0xc6, 0xa1, 0xfe, 0x58, 0xcf, 0x02, 0xbf, 0x5d, 0x07, 0x90, 0xd4, - 0xfc, 0x37, 0xbb, 0xfb, 0x7c, 0x50, 0x02, 0x05, 0xb1, 0x01, 0xdb, 0x64, 0xfe, 0x80, 0x79, 0xfe, - 0xc1, 0x08, 0x00, 0xeb, 0xf3, 0xfe, 0xbb, 0x87, 0xfd, 0xff, 0xf2, 0xfd, 0xa9, 0xb5, 0xff, 0x68, - 0x6c, 0x00, 0x65, 0x97, 0xff, 0x0e, 0xac, 0xfd, 0xb6, 0x53, 0xfe, 0xfe, 0x36, 0x00, 0x28, 0x78, - 0xff, 0x74, 0x39, 0xff, 0x65, 0x44, 0x00, 0xf0, 0x41, 0xff, 0x1b, 0x59, 0xff, 0x3d, 0x0c, 0x00, - 0xdb, 0x71, 0xff, 0xdf, 0x1c, 0xff, 0x4f, 0xe3, 0x16, 0xa9, 0xc2, 0x23, 0x97, 0x77, 0x0a, 0x9b, - 0x23, 0x00, 0xbf, 0x1e, 0x04, 0x19, 0xe4, 0xfd, 0x7f, 0x5e, 0x03, 0x00, 0x32, 0x08, 0x3e, 0x70, - 0xfb, 0xda, 0x5f, 0xfb, 0x7d, 0x6e, 0x03, 0x4a, 0xf5, 0x01, 0x6d, 0xdb, 0xfd, 0x15, 0x1a, 0xfe, - 0x1f, 0x67, 0x00, 0x40, 0xff, 0xfe, 0x87, 0x23, 0xfd, 0xb2, 0xa9, 0xfd, 0x8f, 0x66, 0xff, 0xad, - 0x5e, 0x00, 0x64, 0xd8, 0xff, 0x78, 0x26, 0xfe, 0xde, 0x7b, 0xfe, 0x25, 0xbe, 0xff, 0x9b, 0x16, - 0x00, 0xf8, 0x72, 0xff, 0xe6, 0xcb, 0xff, 0x62, 0x48, 0xff, 0x1c, 0x8c, 0xfe, 0x3c, 0xcd, 0xff, - 0x1b, 0xa6, 0xff, 0x92, 0xf8, 0xfe, 0x1f, 0x79, 0x18, 0x4c, 0x70, 0x26, 0x8c, 0x4d, 0x0b, 0x7d, - 0x5f, 0xff, 0xb0, 0xc7, 0x03, 0xaf, 0xf3, 0xfc, 0x35, 0x70, 0x03, 0xf1, 0x43, 0x09, 0x66, 0x17, - 0xfa, 0x3a, 0x7b, 0xfa, 0xb1, 0x6d, 0x04, 0xdf, 0x62, 0x02, 0x71, 0x33, 0xfd, 0x06, 0x8d, 0xfd, - 0x0c, 0x7c, 0x00, 0x79, 0x04, 0xff, 0xc6, 0xce, 0xfc, 0x74, 0x27, 0xfd, 0xae, 0xc0, 0xfe, 0xb1, - 0x31, 0x00, 0x5b, 0x01, 0x00, 0xfa, 0x1e, 0xfe, 0x8f, 0x13, 0xff, 0x57, 0x73, 0xff, 0x02, 0xc1, - 0xff, 0x4b, 0x3b, 0x00, 0x45, 0x59, 0xff, 0x92, 0xd5, 0xfe, 0xc8, 0xa2, 0xfe, 0x36, 0xe4, 0xfe, - 0x2d, 0x62, 0xff, 0xfd, 0x30, 0xff, 0x27, 0xd6, 0x19, 0x30, 0x2f, 0x29, 0x2b, 0x71, 0x0c, 0xa8, - 0xb6, 0xfe, 0xd8, 0x6c, 0x03, 0x79, 0x71, 0xfc, 0x36, 0x26, 0x03, 0xa5, 0xe3, 0x09, 0xe4, 0x75, - 0xf9, 0x81, 0x8a, 0xf9, 0x84, 0x19, 0x05, 0x8d, 0x13, 0x03, 0x63, 0xcc, 0xfc, 0x4d, 0xeb, 0xfc, - 0x99, 0x98, 0x00, 0x5d, 0x03, 0xff, 0xc4, 0x90, 0xfc, 0x74, 0x04, 0xfd, 0x12, 0xdd, 0xfd, 0xa9, - 0xb9, 0xff, 0x62, 0xbd, 0x00, 0x30, 0xcd, 0xfd, 0x72, 0x39, 0xff, 0x5e, 0x56, 0x00, 0x0d, 0x0a, - 0xff, 0x4d, 0x80, 0x00, 0xa2, 0xf8, 0xff, 0x8c, 0x28, 0xfe, 0x06, 0x60, 0xfe, 0x16, 0xf7, 0xfe, - 0x0f, 0xab, 0xfe, 0xe5, 0x80, 0xff, 0x83, 0xb9, 0x1a, 0x56, 0xd7, 0x2b, 0x78, 0x31, 0x0e, 0xbe, - 0xb8, 0xfd, 0x9d, 0x67, 0x03, 0xdc, 0x8b, 0xfc, 0xd5, 0x44, 0x02, 0x31, 0xb9, 0x09, 0xd4, 0xa3, - 0xf9, 0xeb, 0xed, 0xf8, 0x66, 0xfa, 0x04, 0x07, 0xd1, 0x03, 0xb8, 0xb8, 0xfc, 0x0d, 0x7c, 0xfc, - 0xcf, 0x68, 0x00, 0x90, 0x00, 0xff, 0x2d, 0x35, 0xfc, 0x78, 0x0d, 0xfd, 0xaa, 0x76, 0xfd, 0xdd, - 0x61, 0xfe, 0xad, 0x2c, 0x01, 0xdc, 0xa6, 0xfe, 0xca, 0x75, 0xfe, 0xd5, 0x1e, 0x01, 0x4e, 0x59, - 0xff, 0x3d, 0xbb, 0xff, 0x6a, 0xe4, 0x00, 0x14, 0x43, 0xfe, 0xc2, 0x6b, 0xfd, 0xdf, 0xfc, 0xfe, - 0x64, 0x7a, 0xfe, 0xe6, 0x57, 0xff, 0x63, 0x8a, 0x1c, 0xef, 0x0e, 0x2e, 0xc8, 0x7a, 0x0e, 0x84, - 0xc6, 0xfd, 0xea, 0xa2, 0x03, 0xaa, 0x36, 0xfc, 0x15, 0xa6, 0x01, 0x53, 0xed, 0x08, 0x32, 0xb8, - 0xf9, 0xcb, 0xd8, 0xf8, 0xe9, 0x8f, 0x04, 0x34, 0x27, 0x04, 0xec, 0xbc, 0xfc, 0x72, 0x3c, 0xfc, - 0x15, 0x30, 0x00, 0x6e, 0xed, 0xfe, 0xb0, 0x92, 0xfb, 0xbe, 0x1b, 0xfd, 0x4d, 0x63, 0xfd, 0xfd, - 0x3d, 0xfd, 0xef, 0x80, 0x00, 0x5f, 0xeb, 0xff, 0x9c, 0x7b, 0xfe, 0xf6, 0x93, 0x00, 0xfa, 0x9a, - 0x00, 0xf4, 0x0b, 0xff, 0x06, 0xc4, 0x00, 0x0d, 0x49, 0xff, 0x16, 0xc4, 0xfc, 0xc8, 0x39, 0xfe, - 0x42, 0xa8, 0xfe, 0x84, 0xf2, 0xfe, 0x36, 0x2d, 0x20, 0xe3, 0x81, 0x2f, 0xd3, 0x67, 0x0c, 0x3a, - 0x48, 0xff, 0xad, 0xe2, 0x04, 0x6f, 0x03, 0xfb, 0x61, 0xef, 0x00, 0x08, 0xca, 0x08, 0xde, 0xf8, - 0xf8, 0x64, 0x8a, 0xf9, 0x5b, 0x0d, 0x04, 0xb4, 0x49, 0x04, 0x38, 0x03, 0xfd, 0x67, 0xbc, 0xfb, - 0xc8, 0x7e, 0x00, 0x28, 0x8a, 0xfe, 0xb1, 0x77, 0xfb, 0xf6, 0x9b, 0xfc, 0xd4, 0x90, 0xfd, 0x21, - 0xdf, 0xfc, 0xfc, 0x45, 0xff, 0x87, 0x79, 0x00, 0x93, 0xe2, 0xff, 0x9a, 0xd3, 0xff, 0xa7, 0xf7, - 0x00, 0x3c, 0xe1, 0xff, 0x38, 0xd5, 0xff, 0x49, 0xf1, 0xff, 0xb7, 0x52, 0xfd, 0xa4, 0x27, 0xfd, - 0x68, 0x6e, 0xfe, 0x15, 0x1d, 0xff, 0x4b, 0x51, 0x24, 0xe0, 0xfa, 0x2f, 0x12, 0xbe, 0x08, 0x6d, - 0x0c, 0x03, 0xe9, 0xfe, 0x06, 0xdb, 0xc0, 0xf7, 0xbf, 0x5d, 0x00, 0xf9, 0xd2, 0x09, 0x9f, 0xa8, - 0xf7, 0x5c, 0xab, 0xf9, 0x17, 0xe5, 0x03, 0x21, 0x1e, 0x04, 0xd2, 0x63, 0xfd, 0x3b, 0x0c, 0xfb, - 0xed, 0xc4, 0x00, 0x20, 0x01, 0xfe, 0x89, 0x9b, 0xfb, 0xfd, 0x1d, 0xfc, 0xa5, 0x37, 0xfd, 0xfd, - 0xf7, 0xfc, 0x7b, 0x58, 0xfe, 0x8c, 0xcf, 0xff, 0xf4, 0x55, 0x01, 0x14, 0x69, 0x00, 0xf0, 0x17, - 0x00, 0x8e, 0xdc, 0x00, 0x81, 0x83, 0xff, 0x66, 0xbb, 0xff, 0xd2, 0x2c, 0xfe, 0x5f, 0xdd, 0xfc, - 0xc1, 0x7f, 0xfd, 0x95, 0x25, 0xff, 0xcd, 0xa3, 0x27, 0x8e, 0x44, 0x2f, 0xee, 0x53, 0x05, 0x80, - 0x96, 0x09, 0xd0, 0xbb, 0x08, 0x4d, 0x32, 0xf2, 0xed, 0x19, 0x01, 0x6b, 0x33, 0x0c, 0xd3, 0x5d, - 0xf5, 0xfb, 0xad, 0xf8, 0x4e, 0xf9, 0x04, 0x70, 0xba, 0x03, 0xde, 0x1b, 0xfd, 0x84, 0xcf, 0xfa, - 0x30, 0x00, 0x01, 0x90, 0x47, 0xfd, 0xd0, 0x95, 0xfb, 0x81, 0x1a, 0xfc, 0xb3, 0xad, 0xfc, 0x5d, - 0xe4, 0xfc, 0x52, 0xe8, 0xfd, 0xc0, 0xd3, 0xfe, 0x05, 0xce, 0x01, 0x7f, 0xb6, 0x01, 0x89, 0x9a, - 0xff, 0x6c, 0x2c, 0x01, 0x33, 0xb7, 0xff, 0x3d, 0x4f, 0xff, 0x35, 0x85, 0xfe, 0x7b, 0x74, 0xfd, - 0xe9, 0xf9, 0xfc, 0xdd, 0x3d, 0xfe, 0xbd, 0x35, 0x2a, 0x86, 0x5a, 0x2d, 0x29, 0x61, 0x03, 0x10, - 0xca, 0x11, 0xde, 0x0b, 0x09, 0xbe, 0x21, 0xec, 0xd2, 0xb7, 0x03, 0x7a, 0xd7, 0x0e, 0x96, 0xf3, - 0xf1, 0x7b, 0x9f, 0xf7, 0x62, 0x31, 0x07, 0xf0, 0x19, 0x03, 0xe2, 0x01, 0xfc, 0x36, 0x7a, 0xfb, - 0xa0, 0x43, 0x01, 0x1f, 0x56, 0xfc, 0x8c, 0x85, 0xfb, 0x4a, 0x98, 0xfc, 0xda, 0x4f, 0xfc, 0x37, - 0x76, 0xfc, 0x03, 0x07, 0xfe, 0xbb, 0x34, 0xfe, 0x2d, 0x63, 0x01, 0x79, 0x8c, 0x02, 0xab, 0x28, - 0x00, 0xfa, 0x91, 0x01, 0xfb, 0xe2, 0xff, 0x92, 0x0d, 0xff, 0x7c, 0x7a, 0xfe, 0x7b, 0x8a, 0xfe, - 0xdb, 0x14, 0xfd, 0x0c, 0x79, 0xfd, 0x3e, 0xb5, 0x30, 0x55, 0x31, 0x2e, 0x81, 0x4c, 0xfc, 0x4b, - 0xa2, 0x12, 0x91, 0x0f, 0x0d, 0x3d, 0x0b, 0xec, 0xbf, 0xfb, 0x01, 0x87, 0x13, 0x0e, 0x83, 0x21, - 0xf1, 0x07, 0x22, 0xf8, 0xae, 0x0c, 0x08, 0xf0, 0xc9, 0x01, 0x0b, 0xcb, 0xfa, 0x3c, 0x52, 0xfc, - 0x3a, 0x32, 0x01, 0x74, 0x08, 0xfb, 0x96, 0x84, 0xfb, 0x97, 0x6b, 0xfc, 0xb6, 0x9f, 0xfc, 0x20, - 0xf5, 0xfb, 0x6f, 0x21, 0xfe, 0xbe, 0x1a, 0xfe, 0x8b, 0x56, 0x00, 0xf4, 0x4e, 0x03, 0x37, 0xcc, - 0x00, 0x49, 0x3e, 0x01, 0x8e, 0x19, 0x00, 0x52, 0x5e, 0xff, 0x21, 0x10, 0xfe, 0x2e, 0xd3, 0xfe, - 0xc2, 0x55, 0xfd, 0x0f, 0xd4, 0xfd, 0xab, 0x1a, 0x37, 0x77, 0xa7, 0x2f, 0x0b, 0x91, 0xf5, 0x12, - 0x88, 0x11, 0x30, 0xea, 0x10, 0x03, 0x2c, 0xee, 0x12, 0x5a, 0xff, 0xb8, 0xf8, 0x0c, 0xb1, 0x17, - 0xf1, 0xdc, 0x94, 0xf8, 0x5d, 0xa1, 0x08, 0x3c, 0xde, 0x00, 0x9e, 0x9a, 0xf9, 0x8e, 0xcc, 0xfc, - 0x64, 0x60, 0x01, 0x80, 0x88, 0xf9, 0xfc, 0xd9, 0xfb, 0x5e, 0xf0, 0xfb, 0x8d, 0x4d, 0xfd, 0xc7, - 0xcd, 0xfb, 0x7a, 0xd3, 0xfd, 0x1f, 0xed, 0xfe, 0x6f, 0xfb, 0xfe, 0x90, 0x4c, 0x03, 0x62, 0xe1, - 0x01, 0x62, 0x33, 0x01, 0xbc, 0xe1, 0xff, 0x39, 0xe2, 0xff, 0xda, 0x32, 0xfe, 0xa5, 0xdc, 0xfe, - 0xef, 0x9d, 0xfd, 0xd7, 0xa6, 0xfe, 0x97, 0x87, 0x3c, 0x2a, 0x7e, 0x32, 0x08, 0x5f, 0xef, 0x56, - 0xb2, 0x0e, 0xac, 0xe9, 0x13, 0xf5, 0x36, 0xf2, 0xe2, 0x6c, 0xfc, 0xf5, 0x4d, 0x0b, 0xa0, 0xd4, - 0xf1, 0xa7, 0xcf, 0xf8, 0x48, 0xd9, 0x08, 0x07, 0x18, 0x00, 0xd6, 0x15, 0xf9, 0xb0, 0x4b, 0xfc, - 0x03, 0xb7, 0x01, 0x48, 0x47, 0xf8, 0x1c, 0xe7, 0xfb, 0x72, 0xa4, 0xfb, 0xd6, 0xd0, 0xfd, 0xe2, - 0x54, 0xfc, 0xd3, 0xfb, 0xfc, 0x73, 0xff, 0xff, 0xf8, 0x44, 0xfe, 0x15, 0x52, 0x02, 0x83, 0xa7, - 0x02, 0xae, 0xe4, 0x01, 0x9f, 0x37, 0xff, 0x22, 0x5f, 0x00, 0x05, 0xd3, 0xfe, 0x7c, 0x6a, 0xfe, - 0x27, 0x73, 0xfe, 0x52, 0xf4, 0xfe, 0x83, 0xdf, 0x42, 0x54, 0x24, 0x34, 0xc8, 0x13, 0xea, 0xf1, - 0xcf, 0x0b, 0xb6, 0xa1, 0x14, 0xee, 0xbc, 0xf6, 0x4c, 0xdf, 0xfa, 0x57, 0xc4, 0x08, 0x0c, 0x70, - 0xf2, 0x27, 0xea, 0xf9, 0x5d, 0x48, 0x08, 0x27, 0x25, 0xff, 0xb3, 0x5f, 0xf9, 0xe1, 0x0c, 0xfb, - 0x7c, 0xac, 0x01, 0xa8, 0x9d, 0xf7, 0x44, 0x7a, 0xfb, 0xf7, 0xd0, 0xfb, 0xea, 0x0f, 0xfe, 0xb0, - 0x07, 0xfd, 0xea, 0x81, 0xfc, 0xb3, 0x43, 0x00, 0x69, 0xd9, 0xfe, 0xa1, 0xb4, 0x00, 0xac, 0xe8, - 0x02, 0x64, 0xda, 0x02, 0xaf, 0x7d, 0xfe, 0xd2, 0xe5, 0x00, 0xbf, 0x5f, 0xff, 0x03, 0xf2, 0xfd, - 0xc0, 0x73, 0xff, 0x5b, 0xcc, 0xfe, 0xba, 0x34, 0x48, 0xf7, 0xcc, 0x36, 0xa9, 0x37, 0xe5, 0xe0, - 0x21, 0x09, 0xbf, 0xc5, 0x13, 0x2d, 0xd2, 0xfa, 0xa3, 0xcf, 0xfa, 0xd4, 0xd1, 0x05, 0x78, 0x67, - 0xf3, 0x19, 0xfa, 0xfa, 0xc9, 0x67, 0x07, 0x6a, 0x18, 0xfe, 0x2b, 0x68, 0xfa, 0x71, 0x29, 0xf9, - 0xd8, 0x53, 0x01, 0x18, 0x84, 0xf7, 0x50, 0xcc, 0xfa, 0x4b, 0x7f, 0xfc, 0x90, 0xfe, 0xfd, 0x43, - 0xa1, 0xfd, 0xbd, 0x86, 0xfc, 0xaa, 0x06, 0x00, 0x3b, 0xc9, 0xff, 0x09, 0xc5, 0xff, 0x8d, 0x0f, - 0x02, 0xa2, 0x27, 0x04, 0x67, 0xfe, 0xfd, 0x3f, 0xca, 0x00, 0x9b, 0x16, 0x00, 0xe8, 0xa6, 0xfd, - 0xdf, 0xe9, 0xff, 0x29, 0xec, 0xfe, 0xd9, 0xd0, 0x4c, 0x60, 0xfa, 0x39, 0xde, 0x0a, 0xe1, 0x16, - 0x23, 0x07, 0x25, 0x8c, 0x11, 0x7a, 0x8b, 0xfd, 0x87, 0x44, 0xfc, 0x03, 0xef, 0x02, 0xdb, 0xab, - 0xf4, 0x2d, 0x8c, 0xfb, 0x82, 0x9a, 0x06, 0xd4, 0x34, 0xfd, 0xfa, 0x54, 0xfb, 0x32, 0x93, 0xf7, - 0x4a, 0x9f, 0x00, 0x86, 0xc3, 0xf7, 0x43, 0x88, 0xfa, 0xcd, 0x27, 0xfd, 0xfe, 0xb7, 0xfd, 0xa1, - 0x46, 0xfe, 0x70, 0xcc, 0xfc, 0x1a, 0xa9, 0xff, 0x9d, 0xa0, 0x00, 0x21, 0xe9, 0xff, 0x22, 0x88, - 0x00, 0xdb, 0x7b, 0x05, 0x20, 0xc0, 0xfd, 0xc0, 0xb5, 0xff, 0xc7, 0x08, 0x01, 0xb6, 0x90, 0xfd, - 0x6d, 0xe1, 0xff, 0x63, 0xba, 0xff, 0x57, 0x7e, 0x52, 0xcb, 0xe7, 0x3a, 0x39, 0x39, 0xde, 0xd4, - 0x66, 0x06, 0xe4, 0xfe, 0x0d, 0xa9, 0xd0, 0xfe, 0xe4, 0x45, 0xfe, 0xd9, 0x3a, 0x01, 0xf2, 0x50, - 0xf5, 0x8b, 0x11, 0xfc, 0xa0, 0xcd, 0x05, 0x6d, 0x7e, 0xfc, 0xf5, 0xc0, 0xfb, 0x27, 0xbf, 0xf6, - 0x9a, 0xa3, 0xff, 0x40, 0x31, 0xf8, 0x88, 0x09, 0xfb, 0x54, 0x06, 0xfd, 0x47, 0x9d, 0xfd, 0x62, - 0x04, 0xff, 0xa4, 0xed, 0xfc, 0xdf, 0xb7, 0xff, 0x90, 0xe8, 0x00, 0xa0, 0xf2, 0x00, 0x26, 0x81, - 0xff, 0xf3, 0x82, 0x05, 0x85, 0xef, 0xfd, 0x84, 0x17, 0xfe, 0xb0, 0x51, 0x01, 0xbd, 0xe0, 0xfd, - 0x39, 0x58, 0x00, 0x93, 0x45, 0x00, 0xf0, 0x8a, 0x56, 0xda, 0x8f, 0x3c, 0x62, 0x04, 0xdd, 0xb1, - 0x5e, 0x05, 0x41, 0xf8, 0x09, 0xba, 0xa2, 0xfe, 0xf5, 0x4c, 0x00, 0x83, 0xa5, 0x00, 0xdd, 0x5b, - 0xf5, 0x22, 0x34, 0xfc, 0x22, 0x19, 0x05, 0xdf, 0x50, 0xfb, 0xe5, 0xb5, 0xfc, 0x62, 0x1a, 0xf6, - 0x87, 0x88, 0xfe, 0x86, 0x4d, 0xf9, 0xf2, 0x39, 0xfb, 0x06, 0x6c, 0xfc, 0x1f, 0x9e, 0xfd, 0x48, - 0xcb, 0xff, 0xdc, 0xef, 0xfc, 0xd3, 0xdf, 0xff, 0x8c, 0x0d, 0x01, 0xfa, 0x8a, 0x02, 0x09, 0x83, - 0xfe, 0x3a, 0x30, 0x04, 0xa0, 0xc1, 0xfe, 0x7b, 0x43, 0xfc, 0x6c, 0x57, 0x00, 0xa4, 0x40, 0xff, - 0xd8, 0xf1, 0x00, 0x58, 0x67, 0x00, 0x52, 0x4c, 0x59, 0xeb, 0x4a, 0x3e, 0x35, 0x91, 0xdd, 0xc9, - 0xb6, 0x04, 0x60, 0x26, 0x05, 0x5c, 0xb3, 0xfd, 0x3c, 0x75, 0x02, 0x8c, 0x69, 0x00, 0x84, 0x3f, - 0xf5, 0xe5, 0x7c, 0xfc, 0xe3, 0xdb, 0x03, 0x36, 0x3a, 0xfa, 0x95, 0xa3, 0xfe, 0x77, 0x9c, 0xf5, - 0x23, 0xa6, 0xfd, 0x60, 0x86, 0xfa, 0x7f, 0x31, 0xfb, 0x5a, 0xa1, 0xfb, 0x72, 0xb7, 0xfd, 0x61, - 0xdc, 0x00, 0xe7, 0x65, 0xfc, 0x8c, 0xbe, 0x00, 0x58, 0x84, 0x01, 0xc4, 0xf9, 0x02, 0xc9, 0x0e, - 0xfe, 0x96, 0x85, 0x02, 0x5c, 0x27, 0xff, 0xf0, 0x51, 0xfb, 0xc0, 0x5f, 0xff, 0xd7, 0xc3, 0xff, - 0x48, 0x04, 0x02, 0x01, 0xac, 0x01, 0x5b, 0x1e, 0x5b, 0x54, 0x4a, 0x3f, 0xf9, 0xe7, 0xdf, 0x63, - 0xb7, 0x04, 0x6d, 0x05, 0xff, 0x69, 0xb9, 0xfc, 0x16, 0x0d, 0x04, 0xb5, 0x10, 0x00, 0x19, 0x2f, - 0xf5, 0xac, 0xaa, 0xfc, 0xf3, 0x28, 0x02, 0x91, 0x8e, 0xf9, 0xf8, 0x85, 0x01, 0xdf, 0x03, 0xf5, - 0xaf, 0xcf, 0xfc, 0xb5, 0xa6, 0xfb, 0x8d, 0x9c, 0xfa, 0x7b, 0x29, 0xfb, 0x60, 0x20, 0xfe, 0x1b, - 0xf7, 0x00, 0xd5, 0xde, 0xfc, 0x52, 0xbf, 0x01, 0xa2, 0x81, 0x00, 0x4a, 0x3d, 0x03, 0x01, 0x14, - 0xfe, 0x0e, 0x6c, 0x00, 0x00, 0x70, 0xff, 0xe0, 0x0e, 0xfc, 0x37, 0xfe, 0xfd, 0x3c, 0x25, 0xff, - 0xbb, 0x01, 0x04, 0xd1, 0x7b, 0x02, 0xa0, 0xc8, 0x5b, 0x5d, 0xef, 0x3f, 0x95, 0x94, 0xe3, 0x37, - 0xd4, 0x04, 0xc2, 0x52, 0xf8, 0x51, 0x72, 0xfb, 0x55, 0xfc, 0x04, 0xa5, 0x84, 0xff, 0x2e, 0xc7, - 0xf4, 0xc3, 0xc7, 0xfc, 0xb8, 0x8d, 0x00, 0x1a, 0xa9, 0xf9, 0x58, 0xa4, 0x04, 0x28, 0x30, 0xf4, - 0x21, 0x3a, 0xfc, 0xba, 0xce, 0xfb, 0x41, 0x40, 0xfa, 0x24, 0x5f, 0xfb, 0x67, 0x81, 0xfd, 0xce, - 0x37, 0x02, 0x78, 0xa9, 0xfc, 0x44, 0x42, 0x01, 0x41, 0xf7, 0xff, 0x4c, 0xfe, 0x02, 0x55, 0xb1, - 0xfd, 0xbc, 0x96, 0xff, 0xf8, 0x12, 0x00, 0xf8, 0xcd, 0xfb, 0xe2, 0xbf, 0xfe, 0xff, 0x54, 0xfe, - 0x11, 0x7f, 0x02, 0xa7, 0x21, 0x04, 0x4f, 0x3b, 0x5a, 0x72, 0x50, 0x41, 0xa2, 0xbc, 0xe8, 0x4b, - 0x4e, 0x05, 0x73, 0x85, 0xf2, 0x10, 0x56, 0xf9, 0x49, 0x84, 0x05, 0xbf, 0x0a, 0xff, 0xef, 0x40, - 0xf4, 0x73, 0x5d, 0xfd, 0x9b, 0x35, 0x00, 0x94, 0xbd, 0xf9, 0x37, 0xde, 0x07, 0x92, 0x10, 0xf4, - 0xf4, 0xac, 0xfa, 0xa8, 0xba, 0xfc, 0xf4, 0xd4, 0xf9, 0xcc, 0x23, 0xfc, 0x17, 0xe3, 0xfd, 0x0a, - 0x73, 0x01, 0xda, 0x1f, 0xfc, 0x1c, 0x95, 0x01, 0x38, 0xa3, 0xfe, 0x9f, 0xad, 0x02, 0xb8, 0x03, - 0xff, 0x06, 0xd3, 0xfe, 0x80, 0x4b, 0x00, 0x79, 0x78, 0xfd, 0xbc, 0x2d, 0xff, 0x74, 0xc7, 0xfc, - 0x4e, 0xb9, 0x00, 0x20, 0x4e, 0x05, 0x9e, 0x18, 0x5a, 0x42, 0x69, 0x3f, 0x17, 0x0b, 0xef, 0xf1, - 0x68, 0x05, 0x3b, 0x6b, 0xed, 0x0b, 0x56, 0xf6, 0x6d, 0x19, 0x05, 0x3e, 0xd6, 0xfe, 0x42, 0x47, - 0xf3, 0xc1, 0xa3, 0xff, 0x88, 0xff, 0xfe, 0xb6, 0xc6, 0xfa, 0x7a, 0x4f, 0x0a, 0x0a, 0x86, 0xf3, - 0x21, 0x6d, 0xf9, 0x01, 0xc6, 0xfc, 0xea, 0xdc, 0xfb, 0x60, 0xe2, 0xfb, 0x45, 0x09, 0xfc, 0xeb, - 0x48, 0x01, 0x3c, 0xca, 0xfb, 0xdd, 0x9c, 0x00, 0xd8, 0x86, 0xfe, 0x4f, 0x24, 0x03, 0x21, 0xfb, - 0xfe, 0x78, 0x8f, 0xff, 0x84, 0x59, 0x01, 0x66, 0x33, 0xfd, 0x69, 0xb5, 0xfe, 0x8e, 0x32, 0xfe, - 0x6f, 0xc4, 0xfe, 0xa8, 0xd9, 0x01, 0x44, 0x97, 0x56, 0xc0, 0xd9, 0x3f, 0x96, 0x63, 0xf5, 0xa5, - 0xd7, 0x05, 0xa1, 0x8e, 0xea, 0x98, 0xde, 0xf1, 0xa9, 0x5e, 0x03, 0xa3, 0x43, 0x00, 0x75, 0x97, - 0xf3, 0xdb, 0xb7, 0x00, 0xda, 0x01, 0xff, 0xe6, 0xa9, 0xfb, 0x13, 0x5c, 0x0c, 0x5c, 0xae, 0xf2, - 0x5f, 0x8d, 0xf8, 0xa3, 0x14, 0x00, 0x43, 0x60, 0xfa, 0x8f, 0xe2, 0xfa, 0x06, 0xc4, 0xfb, 0x87, - 0xce, 0xff, 0x97, 0xde, 0xfb, 0x20, 0x1b, 0x01, 0xad, 0x48, 0xfe, 0x06, 0xe2, 0x02, 0xe5, 0x2d, - 0x01, 0xe8, 0x08, 0x00, 0x09, 0x84, 0xff, 0xd1, 0xbd, 0xfe, 0x40, 0x3b, 0x00, 0xc8, 0x51, 0xfc, - 0x98, 0x34, 0xff, 0x49, 0xd6, 0xfe, 0xa7, 0x7a, 0x53, 0x71, 0xcd, 0x3e, 0xd5, 0x56, 0xfb, 0x4b, - 0xf2, 0x05, 0x94, 0x22, 0xe9, 0x91, 0x74, 0xec, 0x35, 0xae, 0x00, 0x58, 0x4b, 0x04, 0x26, 0xae, - 0xf3, 0x6a, 0x71, 0x00, 0x2a, 0x37, 0x00, 0x52, 0xf7, 0xfc, 0x0e, 0x94, 0x0a, 0x0b, 0x89, 0xf5, - 0xf2, 0x34, 0xf9, 0x7f, 0x02, 0xfe, 0x36, 0xef, 0xfa, 0x2d, 0xc3, 0xf9, 0x10, 0x78, 0xfa, 0x93, - 0xd3, 0xff, 0x81, 0xe9, 0xfc, 0xe5, 0xf4, 0xff, 0x2e, 0x54, 0xff, 0x05, 0xc4, 0x04, 0x24, 0x57, - 0xff, 0xcc, 0x53, 0x00, 0x39, 0xbc, 0x00, 0x1e, 0x60, 0xfe, 0x90, 0x94, 0x00, 0x6e, 0x91, 0xfb, - 0xb2, 0x3d, 0x00, 0x44, 0xba, 0xfd, 0x25, 0x69, 0x50, 0xe0, 0xba, 0x3d, 0x6c, 0x44, 0xfe, 0x45, - 0xca, 0x08, 0xd3, 0x32, 0xe7, 0xc5, 0x87, 0xe6, 0x6f, 0x1d, 0x01, 0xdb, 0x3a, 0x07, 0xc0, 0x09, - 0xf3, 0x19, 0xd3, 0x02, 0x10, 0xd1, 0xfe, 0x9f, 0xea, 0xfc, 0xff, 0x18, 0x0e, 0xfd, 0x93, 0xf4, - 0xba, 0xce, 0xf8, 0x72, 0x2b, 0xfe, 0xcc, 0x84, 0xf8, 0xa3, 0xb2, 0xfa, 0x1e, 0xfd, 0xfa, 0x81, - 0xac, 0xfe, 0xdf, 0x80, 0xfd, 0xce, 0xec, 0x01, 0xd5, 0xc2, 0xff, 0x77, 0x76, 0x02, 0xb2, 0x20, - 0x00, 0xa5, 0x23, 0x02, 0xc7, 0x89, 0xff, 0x47, 0x30, 0xfd, 0xc2, 0x2d, 0x03, 0x6d, 0x6f, 0xfb, - 0x48, 0x51, 0xfe, 0x92, 0xfe, 0xff, 0xfe, 0x25, 0x50, 0x5b, 0x32, 0x38, 0x27, 0x92, 0x01, 0x57, - 0x42, 0x0b, 0x0a, 0x4b, 0xe3, 0xdb, 0xab, 0xe5, 0x77, 0xc2, 0x00, 0x59, 0x95, 0x08, 0x36, 0xc8, - 0xf5, 0x75, 0x77, 0x01, 0x2f, 0x07, 0xfe, 0x30, 0x68, 0x00, 0x8e, 0x79, 0x0c, 0x91, 0xd6, 0xf4, - 0x9e, 0x2c, 0xf9, 0xd6, 0x00, 0xfb, 0xfd, 0xe5, 0xf9, 0xcd, 0xcd, 0xfc, 0x8d, 0x84, 0xf8, 0xb0, - 0xa6, 0xff, 0x43, 0x42, 0x01, 0x52, 0x6d, 0xff, 0xc8, 0xd1, 0xfe, 0x90, 0x3a, 0x04, 0x98, 0xbb, - 0xff, 0x07, 0xf6, 0x00, 0xa3, 0x2f, 0x00, 0x20, 0xad, 0xfd, 0xce, 0x27, 0x03, 0x7a, 0x79, 0xfc, - 0xfa, 0xd5, 0xfc, 0xe2, 0x89, 0x00, 0x97, 0xdc, 0x4c, 0xab, 0x44, 0x34, 0x7b, 0xf7, 0x04, 0x64, - 0xa5, 0x0b, 0xbe, 0xc5, 0xe2, 0xab, 0x95, 0xe5, 0xa8, 0x4d, 0x00, 0x83, 0xc5, 0x08, 0x33, 0x58, - 0xf8, 0xda, 0x40, 0x03, 0xf4, 0xc8, 0xf8, 0x68, 0xca, 0x03, 0x27, 0x3a, 0x0d, 0xb7, 0xee, 0xf1, - 0xa0, 0xa9, 0xf9, 0x94, 0xf3, 0xfa, 0x29, 0x27, 0xfb, 0x76, 0x35, 0xfc, 0xc8, 0x28, 0xfa, 0x5e, - 0x30, 0x01, 0x7f, 0x41, 0xff, 0xd7, 0x58, 0xff, 0x0a, 0x84, 0x00, 0x0d, 0xa6, 0x02, 0xfc, 0xcc, - 0xfe, 0xd3, 0xd6, 0x01, 0x5f, 0x73, 0x00, 0x0e, 0x0f, 0xfe, 0x2d, 0x58, 0x02, 0xed, 0x6f, 0xfd, - 0x24, 0x88, 0xfd, 0xed, 0xfc, 0xfd, 0xfb, 0x76, 0x47, 0x64, 0xe1, 0x32, 0xd6, 0x75, 0x06, 0x65, - 0xa5, 0x09, 0x20, 0x91, 0xe5, 0x41, 0x14, 0xea, 0x7f, 0x52, 0xfb, 0x7c, 0x3f, 0x09, 0xdc, 0xb3, - 0xff, 0x1e, 0x25, 0xfd, 0xf9, 0xc3, 0xf7, 0x27, 0x05, 0x08, 0x6c, 0xee, 0x08, 0x9f, 0x41, 0xf2, - 0x9f, 0x57, 0xfc, 0xed, 0x29, 0xf9, 0xdb, 0xec, 0xfb, 0x29, 0xff, 0xff, 0x80, 0xdd, 0xf8, 0x1e, - 0xe3, 0xff, 0x16, 0xd9, 0x00, 0x22, 0x71, 0xff, 0x67, 0x3b, 0xff, 0xb6, 0x09, 0x02, 0x1a, 0xab, - 0xff, 0xe9, 0x98, 0x01, 0x2a, 0x95, 0x00, 0x98, 0x91, 0xfe, 0x1a, 0x20, 0x02, 0x26, 0xb9, 0xfd, - 0xac, 0xf7, 0xfd, 0x22, 0x11, 0xfd, 0xc6, 0x7b, 0x48, 0xba, 0x7f, 0x2f, 0xdc, 0xa5, 0xfe, 0x7a, - 0x38, 0x0b, 0xac, 0x32, 0xe7, 0x28, 0xc8, 0xed, 0xfb, 0xbf, 0xff, 0x33, 0xa6, 0x04, 0xf5, 0x55, - 0xff, 0xe5, 0xf8, 0xfe, 0xbb, 0x9a, 0xf6, 0xe4, 0xf6, 0x07, 0xe8, 0x31, 0x07, 0x5e, 0x84, 0xf2, - 0xc9, 0x8b, 0xfd, 0xfa, 0x10, 0xfa, 0x3a, 0x4a, 0xfe, 0x7a, 0x2d, 0xff, 0xbc, 0xcf, 0xf7, 0xe2, - 0x2d, 0x02, 0xca, 0x08, 0x01, 0xea, 0xfb, 0xfc, 0xb0, 0xad, 0xff, 0x01, 0x7f, 0x02, 0x3e, 0xc3, - 0xff, 0x1a, 0x6e, 0x01, 0xad, 0xd7, 0xff, 0xf8, 0xbf, 0xff, 0x66, 0xa3, 0x02, 0x5f, 0x77, 0xfc, - 0x60, 0x9e, 0xfd, 0x33, 0x7b, 0xfe, 0x9f, 0x0b, 0x45, 0xd6, 0x1c, 0x29, 0x95, 0xcf, 0xff, 0xb6, - 0x8e, 0x0d, 0x83, 0x95, 0xe6, 0x63, 0x38, 0xf5, 0x77, 0x04, 0xfe, 0xe2, 0xdf, 0x01, 0xd1, 0x13, - 0x03, 0x8d, 0x35, 0xfb, 0xeb, 0xf3, 0xf5, 0xad, 0x16, 0x0a, 0xc6, 0xd0, 0x05, 0x64, 0x06, 0xf2, - 0x0e, 0x81, 0x00, 0xbc, 0x52, 0xfb, 0x84, 0x08, 0xfe, 0x76, 0xe9, 0xfe, 0x8e, 0x7d, 0xf8, 0x7f, - 0x17, 0x03, 0x15, 0xa9, 0xff, 0x6a, 0x85, 0xfc, 0x55, 0x7b, 0x00, 0x6f, 0x71, 0x02, 0x28, 0xfb, - 0xfe, 0xfd, 0xcc, 0x01, 0xb3, 0xc5, 0x00, 0xe2, 0x85, 0xff, 0x17, 0x36, 0x02, 0x06, 0x7e, 0xfc, - 0xd3, 0xc7, 0xfd, 0xfa, 0xbb, 0xfe, 0xd7, 0xb6, 0x3f, 0xe6, 0x09, 0x24, 0xa2, 0xb9, 0x00, 0xaf, - 0xea, 0x0f, 0x72, 0x04, 0xeb, 0xa6, 0xf9, 0xf4, 0xbd, 0xe9, 0xfe, 0x77, 0xcc, 0x02, 0x01, 0xf4, - 0xff, 0x04, 0xa3, 0xfa, 0xa0, 0x1a, 0xf8, 0x7f, 0x56, 0x09, 0x7d, 0xc0, 0x03, 0x0a, 0x2a, 0xf5, - 0x6c, 0x0a, 0x02, 0xa0, 0xdd, 0xfa, 0x49, 0x34, 0xfe, 0x4e, 0x28, 0xff, 0x4f, 0xa7, 0xf9, 0x88, - 0x5e, 0x02, 0xfb, 0xf4, 0xfe, 0xac, 0xb8, 0xfc, 0x5f, 0x65, 0x01, 0x6e, 0x76, 0x01, 0xa2, 0x65, - 0xfe, 0xca, 0x18, 0x03, 0x4f, 0x0b, 0x01, 0x34, 0x1b, 0xff, 0x0c, 0xc0, 0x01, 0x75, 0xbc, 0xfc, - 0x08, 0xb5, 0xfd, 0x1d, 0x1c, 0xff, 0xf9, 0xd4, 0x3c, 0xa5, 0x1b, 0x2c, 0xbf, 0x4d, 0x09, 0x91, - 0xd6, 0x01, 0x54, 0x26, 0xd8, 0xdd, 0x76, 0xf2, 0xcb, 0xbb, 0x0b, 0xe2, 0xd3, 0x0c, 0x72, 0x07, - 0xfe, 0x4a, 0x76, 0xf8, 0x00, 0xec, 0xf2, 0xde, 0x01, 0x01, 0x41, 0x7a, 0x06, 0xae, 0x42, 0xf8, - 0x18, 0x99, 0x04, 0x9e, 0x9d, 0xfe, 0xfe, 0xb9, 0xfd, 0x75, 0x5e, 0x02, 0x43, 0x6d, 0xfd, 0xaa, - 0xdf, 0x01, 0x0a, 0xb9, 0xff, 0x0a, 0x84, 0xfd, 0x62, 0x10, 0xff, 0xa4, 0x54, 0xfd, 0x30, 0x63, - 0xfe, 0xcd, 0x24, 0x02, 0xa5, 0xda, 0xfd, 0x40, 0x9d, 0xff, 0x57, 0xcb, 0x03, 0xaf, 0xc8, 0xfe, - 0x7f, 0xe3, 0x00, 0x00, 0x93, 0xff, 0x33, 0x38, 0x33, 0xdf, 0x0a, 0x2b, 0x57, 0x79, 0x0c, 0xb0, - 0xfb, 0x04, 0x39, 0x0c, 0xde, 0x6e, 0x97, 0xed, 0x3a, 0x41, 0x08, 0x8f, 0x9a, 0x0a, 0xe2, 0x9b, - 0x01, 0xfb, 0xc7, 0xfc, 0xab, 0xa5, 0xf3, 0x68, 0xf5, 0xfd, 0xf7, 0x8c, 0x04, 0x86, 0xd5, 0xfb, - 0x97, 0xd8, 0x03, 0xb3, 0x6c, 0xfe, 0xef, 0x3e, 0xfe, 0x18, 0xd2, 0x02, 0x04, 0xd8, 0xfd, 0x03, - 0x11, 0x01, 0xce, 0xfb, 0x00, 0x63, 0x4a, 0xfe, 0x86, 0x2a, 0xff, 0x3a, 0xad, 0xfd, 0x1b, 0xab, - 0xfd, 0x08, 0x07, 0x01, 0xa3, 0x48, 0xfd, 0x5d, 0x33, 0x00, 0x61, 0x5d, 0x04, 0xcd, 0x97, 0xff, - 0x2f, 0x9d, 0x01, 0x29, 0x9f, 0xff, 0x6e, 0x52, 0x2c, 0x6a, 0x89, 0x27, 0xf0, 0x78, 0x0d, 0x53, - 0xe0, 0x06, 0x37, 0xba, 0xe3, 0xee, 0x11, 0xef, 0x17, 0xdf, 0x05, 0xd0, 0x71, 0x07, 0x75, 0x1a, - 0x02, 0x59, 0x45, 0xfe, 0x6e, 0xae, 0xf5, 0x78, 0xdf, 0xfc, 0x94, 0x5c, 0x04, 0x38, 0x2d, 0xfd, - 0x03, 0x23, 0x02, 0xfd, 0xf1, 0xfe, 0x5c, 0x6c, 0xfe, 0x8a, 0x7e, 0x02, 0xe0, 0x77, 0xfe, 0xba, - 0x6c, 0x00, 0x7d, 0x0a, 0x01, 0x22, 0x29, 0xff, 0x68, 0xe4, 0xfe, 0x1e, 0xbc, 0xfd, 0xfd, 0x1a, - 0xfe, 0x94, 0x33, 0x00, 0xb1, 0xb1, 0xfd, 0xc6, 0xca, 0x00, 0xaf, 0xe0, 0x03, 0xa6, 0x6a, 0x00, - 0x5f, 0x6a, 0x01, 0x22, 0x60, 0xff, 0x43, 0x76, 0x24, 0x9c, 0xec, 0x23, 0x27, 0xc0, 0x0f, 0x48, - 0x62, 0x07, 0x60, 0x99, 0xe9, 0x41, 0xa2, 0xf1, 0x87, 0x72, 0x02, 0x10, 0xa7, 0x05, 0xe0, 0xab, - 0x02, 0x51, 0x4d, 0xff, 0xd3, 0xe0, 0xf7, 0x2b, 0x5e, 0xfc, 0xf9, 0xf4, 0x03, 0xdf, 0xd1, 0xfd, - 0xb8, 0x0a, 0x01, 0xab, 0x82, 0xff, 0x9b, 0xa7, 0xfe, 0xe3, 0x1f, 0x02, 0xbc, 0x30, 0xff, 0xfd, - 0x13, 0x00, 0xfb, 0x37, 0x01, 0xfe, 0xdf, 0xff, 0x35, 0xa0, 0xfe, 0xff, 0x02, 0xfe, 0x3c, 0x6e, - 0xfe, 0xec, 0x0f, 0x00, 0x6d, 0xf6, 0xfe, 0x56, 0x23, 0x01, 0x50, 0x11, 0x03, 0x4b, 0xc7, 0x00, - 0x2f, 0xe9, 0x00, 0x91, 0x3c, 0xff, 0xdc, 0x90, 0x1e, 0xbe, 0x82, 0x21, 0x3d, 0x68, 0x11, 0xde, - 0x01, 0x07, 0x12, 0x10, 0xee, 0xe2, 0x8f, 0xf3, 0x17, 0x8b, 0x00, 0x01, 0xe7, 0x04, 0xe2, 0x9d, - 0x02, 0x4e, 0x1e, 0x00, 0x05, 0xc8, 0xf9, 0xb0, 0x5c, 0xfc, 0xf9, 0x1d, 0x03, 0x71, 0x35, 0xfe, - 0x43, 0xf3, 0x00, 0x1b, 0xdb, 0xff, 0x92, 0xac, 0xfe, 0x2b, 0x13, 0x02, 0x6b, 0xf6, 0xff, 0xb0, - 0xf5, 0xff, 0x4d, 0x54, 0x01, 0xb9, 0x22, 0x00, 0xff, 0xb2, 0xfe, 0x50, 0xe5, 0xfe, 0x74, 0x48, - 0xff, 0x34, 0x13, 0x00, 0x3d, 0x6f, 0xff, 0xb0, 0x11, 0x01, 0x36, 0x2c, 0x02, 0xd1, 0xab, 0x00, - 0x00, 0x8b, 0x00, 0xf4, 0x0f, 0xff, 0x83, 0xc1, 0x18, 0x9b, 0xa1, 0x1e, 0x01, 0x73, 0x12, 0x3b, - 0x75, 0x07, 0x3e, 0x20, 0xf2, 0x25, 0xa7, 0xf4, 0xd4, 0x5b, 0xff, 0x2d, 0x3b, 0x04, 0xc6, 0xbd, - 0x02, 0x1d, 0xd3, 0x00, 0xe0, 0x1f, 0xfb, 0xa2, 0xb5, 0xfc, 0x05, 0x68, 0x02, 0xbd, 0x4d, 0xfe, - 0x57, 0xc0, 0x00, 0x83, 0x70, 0x00, 0xca, 0xf4, 0xfe, 0x0f, 0xdd, 0x01, 0xb2, 0x88, 0x00, 0xd0, - 0x0b, 0x00, 0x1f, 0x45, 0x01, 0x10, 0xd6, 0x00, 0x3f, 0xd0, 0xff, 0x52, 0xdd, 0xff, 0xd7, 0x4f, - 0xff, 0x68, 0x25, 0xff, 0xd7, 0x95, 0xff, 0x38, 0xa7, 0x00, 0x8b, 0x08, 0x01, 0x35, 0x78, 0x00, - 0xd8, 0x54, 0x00, 0x38, 0x61, 0xff, 0xf3, 0xde, 0x14, 0x8b, 0xff, 0x1b, 0x91, 0x15, 0x13, 0x60, - 0x8f, 0x08, 0x35, 0xab, 0xf4, 0x05, 0x60, 0xf5, 0x5c, 0xf7, 0xfe, 0x04, 0x05, 0x04, 0x06, 0x24, - 0x03, 0x2e, 0x15, 0x01, 0x00, 0x34, 0xfc, 0x20, 0x91, 0xfd, 0x45, 0xaa, 0x01, 0x5b, 0x51, 0xfe, - 0x9c, 0x41, 0x01, 0xef, 0xe6, 0x00, 0x85, 0x4f, 0xff, 0x2e, 0x09, 0x02, 0xe3, 0x9d, 0x00, 0xf4, - 0xeb, 0x00, 0xb0, 0x9a, 0x02, 0x7d, 0x3c, 0x01, 0x5e, 0xdb, 0xff, 0x39, 0x0b, 0x00, 0x63, 0xf3, - 0xfe, 0x76, 0x48, 0xfe, 0x3a, 0xbb, 0xff, 0x37, 0x92, 0x00, 0xb8, 0x9a, 0x00, 0x55, 0xc5, 0x00, - 0x3d, 0x4e, 0x00, 0x9e, 0x1d, 0xff, 0x7c, 0x9a, 0x12, 0xfd, 0x44, 0x1a, 0x14, 0x69, 0x12, 0x76, - 0xff, 0x07, 0x80, 0x05, 0xf6, 0x1f, 0xcc, 0xf6, 0x04, 0x2a, 0xff, 0x8a, 0x64, 0x03, 0x70, 0x16, - 0x03, 0x87, 0x61, 0x01, 0x34, 0x0d, 0xfd, 0xa7, 0xbf, 0xfd, 0x6b, 0x2d, 0x01, 0xac, 0x97, 0xfe, - 0x50, 0x95, 0x01, 0x28, 0x03, 0x01, 0xca, 0x61, 0xff, 0xdd, 0xa6, 0x02, 0xb2, 0xdb, 0x01, 0xe6, - 0x8e, 0x01, 0x91, 0x39, 0x02, 0x6c, 0xac, 0x00, 0xa0, 0x7a, 0xff, 0x14, 0x61, 0xff, 0xdc, 0xf3, - 0xfd, 0xec, 0x66, 0xfe, 0x44, 0x2d, 0x00, 0x33, 0xe5, 0xff, 0xf1, 0x9e, 0x00, 0x40, 0x39, 0x00, - 0xe5, 0x9e, 0xff, 0x0c, 0x20, 0x00, 0xd9, 0x53, 0x10, 0xa4, 0xee, 0x17, 0xaa, 0x09, 0x12, 0x72, - 0x6a, 0x08, 0x19, 0x50, 0xf7, 0x81, 0x89, 0xf7, 0x0a, 0x49, 0xff, 0x8b, 0x84, 0x03, 0xa3, 0x50, - 0x03, 0x7f, 0x6e, 0x01, 0xbf, 0xf8, 0xfd, 0xc5, 0x49, 0xfe, 0xfd, 0xf2, 0x00, 0x0b, 0xf4, 0xfe, - 0x6f, 0x85, 0x01, 0x98, 0x3b, 0x02, 0x9e, 0x73, 0x01, 0x3d, 0xda, 0x02, 0x11, 0x8a, 0x01, 0x08, - 0x0f, 0x01, 0x8e, 0x74, 0x01, 0xa5, 0xb4, 0xff, 0xd1, 0xbb, 0xfe, 0x60, 0x75, 0xff, 0xf7, 0xe7, - 0xfd, 0xf8, 0xb8, 0xfe, 0x26, 0x5c, 0x00, 0x37, 0x23, 0xff, 0xbd, 0xf2, 0xff, 0xd6, 0xdf, 0x00, - 0x63, 0x31, 0x00, 0x15, 0xe6, 0xff, 0xfa, 0xaa, 0x0f, 0x90, 0x64, 0x17, 0xe1, 0xb9, 0x10, 0x14, - 0x27, 0x07, 0x91, 0x0b, 0xf8, 0xfe, 0xfa, 0xf8, 0xfd, 0x20, 0x00, 0x8c, 0xa6, 0x03, 0x21, 0x69, - 0x03, 0x76, 0x86, 0x01, 0x2d, 0x14, 0xff, 0xae, 0xae, 0xfe, 0x9a, 0x95, 0x00, 0x50, 0x49, 0x00, - 0x7d, 0x36, 0x03, 0xb8, 0x29, 0x03, 0xfb, 0x12, 0x01, 0xad, 0xc5, 0x01, 0x55, 0x09, 0x01, 0x34, - 0x98, 0x00, 0x56, 0xb1, 0x00, 0xbc, 0x7d, 0xff, 0xfa, 0x17, 0xff, 0x62, 0x44, 0xff, 0x8d, 0x4d, - 0xfe, 0x89, 0xf0, 0xfe, 0x1d, 0x68, 0xff, 0x3c, 0xf9, 0xff, 0x25, 0xca, 0x00, 0xe8, 0x1f, 0x00, - 0xec, 0xe1, 0xff, 0x21, 0x27, 0x00, 0xbe, 0x64, 0x0f, 0x31, 0xa0, 0x16, 0xf7, 0x68, 0x0f, 0xe5, - 0xe2, 0x05, 0xf8, 0x85, 0xf8, 0x2d, 0xc2, 0xfa, 0x18, 0x44, 0x01, 0x51, 0xa3, 0x03, 0xe5, 0xc0, - 0x03, 0xf8, 0xf7, 0x01, 0x4d, 0xac, 0xff, 0x42, 0xc6, 0xff, 0x63, 0x5a, 0x02, 0x3d, 0x48, 0x01, - 0x6b, 0x6f, 0x02, 0xf4, 0x0c, 0x02, 0xd5, 0x3d, 0x00, 0x85, 0xec, 0x00, 0xe9, 0x82, 0x00, 0x6e, - 0x8b, 0x00, 0x83, 0x8b, 0x00, 0x8b, 0x94, 0xff, 0x49, 0xd7, 0xfe, 0x7a, 0x14, 0xff, 0x7b, 0x57, - 0xfe, 0x5c, 0xa0, 0xff, 0x8d, 0x8f, 0x00, 0x3c, 0x2b, 0xff, 0x83, 0x03, 0x00, 0xcd, 0x0b, 0x00, - 0x7d, 0x39, 0x00, 0xf3, 0x66, 0x00, 0x37, 0x40, 0x0f, 0x09, 0x7e, 0x16, 0x43, 0xe6, 0x0d, 0x72, - 0x1a, 0x05, 0xd0, 0x8d, 0xf9, 0xad, 0xcc, 0xfb, 0x77, 0x6f, 0x02, 0xc0, 0x2c, 0x04, 0x75, 0x82, - 0x03, 0x7d, 0xc6, 0x02, 0x38, 0x02, 0x02, 0x8f, 0x1f, 0x00, 0x42, 0x12, 0x01, 0xf6, 0xe1, 0x00, - 0x5e, 0x62, 0x01, 0x56, 0x42, 0x01, 0x25, 0x1b, 0x00, 0xb6, 0xb3, 0x00, 0xaa, 0xaa, 0x00, 0x99, - 0x8d, 0x00, 0xe1, 0x2e, 0x00, 0x37, 0x63, 0xff, 0x6a, 0xaa, 0xfe, 0x3d, 0x5e, 0xff, 0x1d, 0x0a, - 0x00, 0x1f, 0x9d, 0xff, 0xee, 0x12, 0xff, 0x33, 0x44, 0xff, 0xe7, 0x0c, 0x00, 0x1d, 0x13, 0x00, - 0x9e, 0x15, 0x00, 0x16, 0x92, 0x00, 0x04, 0x5c, 0x0e, 0x8e, 0x08, 0x16, 0xec, 0x46, 0x0d, 0xcf, - 0xd8, 0x04, 0x54, 0x35, 0xfb, 0x81, 0x53, 0xfd, 0x71, 0x5a, 0x03, 0xbe, 0xc9, 0x04, 0xe9, 0x12, - 0x05, 0xed, 0x90, 0x03, 0x60, 0xb0, 0x00, 0x57, 0x4c, 0xff, 0xeb, 0x02, 0x00, 0xb3, 0xe2, 0xff, - 0xdf, 0x0c, 0x01, 0xc0, 0xec, 0x00, 0xcc, 0x5d, 0x00, 0x76, 0x89, 0x00, 0xcd, 0x61, 0x00, 0x55, - 0x45, 0x00, 0x4f, 0x09, 0x00, 0xef, 0x90, 0xff, 0x3d, 0x89, 0xff, 0x2c, 0xc0, 0x00, 0xf0, 0x06, - 0xff, 0xe1, 0x7f, 0xfe, 0x52, 0x4d, 0xff, 0x26, 0x7d, 0xff, 0xa7, 0x74, 0xff, 0x81, 0xb8, 0xff, - 0x19, 0xe1, 0x00, 0x97, 0xd4, 0xff, 0xdd, 0x30, 0x0e, 0xbc, 0x00, 0x16, 0x8f, 0x5e, 0x0c, 0xd5, - 0x84, 0x04, 0xa4, 0x63, 0xfd, 0x26, 0xcd, 0xfe, 0x0f, 0x83, 0x04, 0x9f, 0x04, 0x06, 0x17, 0xb7, - 0x03, 0xbe, 0xd4, 0x01, 0x6d, 0x51, 0x00, 0x21, 0xec, 0xfe, 0xad, 0xc0, 0xff, 0x3a, 0x7e, 0xff, - 0x28, 0x04, 0x01, 0xa4, 0xef, 0x00, 0xc2, 0x0f, 0x00, 0x7d, 0x3d, 0x00, 0x5e, 0x5c, 0x00, 0x0f, - 0xc8, 0x00, 0x80, 0xa4, 0xff, 0x54, 0xb1, 0x00, 0x2c, 0xbf, 0x00, 0x23, 0xc6, 0xfe, 0x37, 0xb9, - 0xfe, 0x84, 0x25, 0xff, 0xc5, 0x0b, 0xff, 0x9f, 0xe0, 0xfe, 0xfa, 0xa4, 0xff, 0xa2, 0xf6, 0xff, - 0xab, 0xc2, 0xff, 0xc4, 0x20, 0x00, 0x62, 0xa4, 0x0e, 0x52, 0x46, 0x16, 0x1b, 0xaa, 0x0b, 0x65, - 0x67, 0x04, 0x1c, 0x01, 0xff, 0xea, 0xd7, 0x00, 0xcf, 0xc4, 0x04, 0x55, 0x76, 0x04, 0x55, 0x5f, - 0x02, 0x4a, 0x1f, 0x01, 0x5a, 0x07, 0x00, 0xac, 0x23, 0xff, 0x53, 0xd0, 0xff, 0xa4, 0x1d, 0xff, - 0xb8, 0xe8, 0x00, 0xb1, 0xe0, 0x00, 0xa8, 0x6f, 0xff, 0xb9, 0x77, 0x00, 0x1b, 0x44, 0x01, 0xaf, - 0x1e, 0x00, 0x6c, 0x9b, 0x00, 0x6b, 0xcb, 0x01, 0xbd, 0xe6, 0xfe, 0xe2, 0xb9, 0xfe, 0x42, 0x35, - 0xff, 0xaa, 0xb0, 0xfe, 0x5c, 0x8b, 0xfe, 0x7d, 0x53, 0xff, 0x9f, 0xaf, 0xff, 0x62, 0xcb, 0xfe, - 0xb2, 0x1a, 0x00, 0x2c, 0xdb, 0x00, 0xc7, 0x7c, 0x0e, 0xe5, 0x7e, 0x17, 0xf6, 0xb9, 0x0c, 0x24, - 0x3c, 0x04, 0x63, 0x3b, 0xff, 0xf4, 0x82, 0x00, 0xe6, 0xcd, 0x03, 0x80, 0xd2, 0x03, 0x6e, 0xe6, - 0x01, 0x83, 0x03, 0x01, 0x4e, 0x88, 0x00, 0x1c, 0x8f, 0xfe, 0x48, 0xb9, 0xff, 0x13, 0x97, 0xff, - 0xd1, 0x2a, 0x00, 0xf8, 0xd1, 0x00, 0x36, 0xe0, 0xff, 0x7b, 0xf4, 0x00, 0xe4, 0xac, 0x00, 0xb3, - 0x11, 0x01, 0xc3, 0x28, 0x02, 0x10, 0xac, 0xff, 0x6d, 0xdb, 0xfe, 0x94, 0xd8, 0xff, 0xbf, 0x8e, - 0xfe, 0x19, 0xee, 0xfd, 0x5b, 0x03, 0xff, 0xe0, 0x71, 0xff, 0x22, 0xae, 0xfe, 0x52, 0x47, 0xff, - 0x6d, 0x9c, 0x00, 0x35, 0x40, 0x01, 0x8a, 0x5c, 0x0f, 0x31, 0x0f, 0x19, 0x33, 0x32, 0x0d, 0x44, - 0x58, 0x03, 0x9e, 0x46, 0xfe, 0x4d, 0xd1, 0xfe, 0x14, 0xe7, 0x02, 0xd8, 0x9c, 0x04, 0xc7, 0x2b, - 0x02, 0x0f, 0xf5, 0x00, 0x8c, 0xa0, 0x00, 0x35, 0x59, 0xfe, 0x65, 0x46, 0xff, 0x76, 0xce, 0xff, - 0x80, 0x7f, 0x00, 0x91, 0x8f, 0x00, 0xfb, 0x7f, 0x00, 0x77, 0xc2, 0x00, 0x5d, 0x51, 0x00, 0xda, - 0xb1, 0x02, 0xef, 0x80, 0x01, 0xdd, 0xea, 0xfe, 0x91, 0x92, 0xff, 0x80, 0x99, 0xff, 0x59, 0x78, - 0xfe, 0xff, 0xf5, 0xfd, 0xa3, 0x1d, 0xff, 0x61, 0x96, 0xfe, 0xef, 0xbb, 0xfe, 0x6f, 0x55, 0x00, - 0xbb, 0xdd, 0x00, 0xad, 0x75, 0x00, 0x70, 0x83, 0x0f, 0x20, 0x92, 0x1a, 0x6c, 0xdd, 0x0d, 0x27, - 0x4d, 0x02, 0x02, 0x63, 0xfd, 0x5d, 0x90, 0xfd, 0x19, 0x43, 0x02, 0x97, 0x76, 0x04, 0x2d, 0xfc, - 0x01, 0xc9, 0x7b, 0x01, 0x63, 0xd0, 0x00, 0x3c, 0x05, 0xfe, 0xdf, 0x61, 0xff, 0x7d, 0x11, 0x00, - 0x44, 0x4d, 0x00, 0x32, 0xc6, 0x00, 0x62, 0x16, 0x01, 0xaf, 0xdb, 0xff, 0xcf, 0x81, 0x00, 0x6c, - 0xd3, 0x03, 0x58, 0xe1, 0x00, 0x29, 0xe7, 0xfe, 0x5a, 0xff, 0xff, 0x28, 0x62, 0xff, 0x5c, 0x47, - 0xfe, 0x5a, 0xa3, 0xfe, 0xeb, 0xee, 0xfe, 0x9e, 0xe2, 0xfd, 0x81, 0xcc, 0xfe, 0x2e, 0xce, 0x00, - 0xdf, 0x6a, 0x01, 0x20, 0x91, 0xff, 0x60, 0xbe, 0x0e, 0x72, 0xfc, 0x1a, 0xb6, 0x6e, 0x0f, 0x11, - 0xf6, 0x01, 0x3e, 0x55, 0xfc, 0xe7, 0x28, 0xfd, 0xe4, 0x7b, 0x02, 0x6a, 0x90, 0x04, 0x5b, 0x56, - 0x01, 0x38, 0x6a, 0x00, 0xc3, 0xa0, 0x00, 0x49, 0xc9, 0xfe, 0x01, 0x71, 0xff, 0x05, 0xfe, 0xff, - 0x0c, 0xf3, 0x00, 0x59, 0xb4, 0x00, 0x2c, 0x7a, 0x00, 0x2e, 0x2d, 0x00, 0x45, 0x49, 0x00, 0xd5, - 0x74, 0x03, 0xbc, 0xc2, 0x01, 0xb6, 0x05, 0xff, 0x8a, 0xc6, 0xff, 0x21, 0x8f, 0xff, 0x0f, 0x64, - 0xfe, 0xc6, 0xdc, 0xfe, 0xed, 0xd9, 0xfe, 0x7c, 0xf3, 0xfd, 0x07, 0xdf, 0xfe, 0xd4, 0x7a, 0x00, - 0x34, 0x49, 0x01, 0xfc, 0xb6, 0xff, 0x62, 0x8c, 0x0d, 0x73, 0xec, 0x1a, 0xe5, 0x95, 0x11, 0x56, - 0xb6, 0x02, 0x67, 0x4c, 0xfb, 0x1d, 0x78, 0xfc, 0xc0, 0x90, 0x02, 0x91, 0x62, 0x05, 0x12, 0x04, - 0x02, 0x60, 0x56, 0xff, 0xaa, 0x74, 0xff, 0x70, 0x7c, 0xfe, 0x8f, 0xe4, 0xfe, 0xe0, 0x96, 0x00, - 0xaa, 0xeb, 0x01, 0x9d, 0xbd, 0x00, 0x7b, 0x86, 0x00, 0xf0, 0x65, 0x00, 0x0a, 0x69, 0xff, 0x70, - 0x08, 0x03, 0xa1, 0xf5, 0x02, 0x46, 0x41, 0xff, 0x78, 0x80, 0xff, 0xb9, 0x14, 0x00, 0xad, 0xea, - 0xfe, 0xde, 0xf8, 0xfe, 0x18, 0x0a, 0xff, 0x8f, 0x49, 0xfe, 0xd9, 0xe2, 0xfe, 0x90, 0x7f, 0x00, - 0xd9, 0x40, 0x01, 0x88, 0xab, 0xff, 0xc5, 0x47, 0x0d, 0x85, 0x11, 0x1b, 0x85, 0xb1, 0x12, 0xcf, - 0x24, 0x03, 0x7a, 0x9c, 0xfa, 0xa4, 0xc3, 0xfb, 0x04, 0x95, 0x02, 0xc1, 0x02, 0x06, 0x1c, 0x5d, - 0x02, 0x1a, 0x09, 0xff, 0xfc, 0x07, 0xff, 0x40, 0x3b, 0xfe, 0x89, 0xe2, 0xfd, 0x56, 0x83, 0xff, - 0x91, 0xec, 0x01, 0xfd, 0x95, 0x01, 0x1c, 0x7b, 0x00, 0x0f, 0x87, 0x00, 0x84, 0xb8, 0xff, 0xbb, - 0xa9, 0x01, 0x33, 0x46, 0x03, 0xba, 0x13, 0x00, 0x25, 0xe0, 0xfe, 0xb2, 0xb5, 0xff, 0x90, 0x67, - 0xff, 0x82, 0x90, 0xff, 0x60, 0x3f, 0xff, 0x48, 0x3c, 0xfe, 0x56, 0xd7, 0xfe, 0xd3, 0xae, 0x00, - 0xb1, 0x0d, 0x01, 0x6e, 0xe8, 0xff, 0xd9, 0xe5, 0x0d, 0x49, 0xfa, 0x1b, 0x63, 0xfa, 0x12, 0x76, - 0x4e, 0x03, 0xa5, 0xbd, 0xf9, 0x08, 0x20, 0xfb, 0x4e, 0x1f, 0x03, 0x3c, 0x5f, 0x06, 0x93, 0xab, - 0x02, 0x5c, 0xb0, 0xfe, 0xfa, 0xc0, 0xfe, 0xaf, 0x8a, 0xfe, 0xd5, 0x9a, 0xfd, 0xbe, 0xd2, 0xfe, - 0xdf, 0x11, 0x01, 0x2b, 0x3f, 0x01, 0x62, 0x60, 0x00, 0xeb, 0xb9, 0x00, 0xfd, 0x84, 0x00, 0xec, - 0x27, 0x01, 0xbe, 0xee, 0x02, 0x7e, 0x1c, 0x01, 0x08, 0x89, 0xfe, 0x3f, 0xbc, 0xfe, 0xf9, 0x90, - 0xff, 0xe5, 0xf1, 0xff, 0xf8, 0xd3, 0xff, 0x61, 0x9e, 0xfe, 0xd3, 0xee, 0xfe, 0xd2, 0xa8, 0x00, - 0xed, 0xfc, 0x00, 0x14, 0x45, 0x00, 0x86, 0xc5, 0x0e, 0x7f, 0x5f, 0x1d, 0x70, 0xd3, 0x13, 0x0c, - 0x1c, 0x03, 0xd5, 0xa0, 0xf8, 0x81, 0x6a, 0xfa, 0x63, 0x5d, 0x03, 0x0b, 0x63, 0x07, 0x63, 0xab, - 0x02, 0x1a, 0x10, 0xfe, 0x0f, 0xbf, 0xfe, 0x19, 0x9a, 0xfe, 0x5a, 0xb7, 0xfd, 0x07, 0xa8, 0xfe, - 0x97, 0x80, 0x00, 0x59, 0xe5, 0x00, 0x2e, 0x9c, 0xff, 0x4a, 0xad, 0xff, 0xae, 0x12, 0x01, 0x64, - 0x2d, 0x01, 0xa4, 0x86, 0x02, 0x7c, 0x4a, 0x02, 0xcb, 0x2f, 0xff, 0xd5, 0xb0, 0xfd, 0x23, 0x9f, - 0xfe, 0xd2, 0xdb, 0xff, 0x12, 0x5c, 0x00, 0xa7, 0x27, 0xff, 0x67, 0xeb, 0xfe, 0x13, 0x01, 0x01, - 0xc4, 0x05, 0x01, 0xd6, 0x58, 0x00, 0x3f, 0xb0, 0x0f, 0x01, 0x55, 0x1f, 0xff, 0x9b, 0x14, 0x76, - 0x0e, 0x02, 0x8f, 0xb1, 0xf7, 0x37, 0xfb, 0xf9, 0x30, 0x85, 0x03, 0xb0, 0x3f, 0x08, 0xc6, 0x72, - 0x02, 0x81, 0x52, 0xfd, 0xf9, 0x90, 0xfe, 0x72, 0xae, 0xfe, 0xc4, 0xde, 0xfd, 0xf5, 0xaf, 0xfe, - 0x3b, 0x20, 0x00, 0x17, 0x97, 0x00, 0xf3, 0xa7, 0xff, 0x8e, 0xb9, 0xfe, 0xab, 0x60, 0x00, 0x9d, - 0x3d, 0x01, 0x59, 0xe3, 0x01, 0x0e, 0x5b, 0x02, 0x33, 0x8a, 0x00, 0xc0, 0xd9, 0xfd, 0x1c, 0x8e, - 0xfd, 0xb7, 0x45, 0xff, 0x34, 0x58, 0x00, 0x50, 0x50, 0xff, 0x72, 0xe6, 0xfe, 0x43, 0x01, 0x01, - 0xec, 0xe3, 0x00, 0xee, 0x76, 0x00, 0x7b, 0x54, 0x11, 0xa3, 0xe7, 0x21, 0xe1, 0x6a, 0x15, 0x45, - 0xbf, 0x00, 0xa2, 0x83, 0xf6, 0xb2, 0x0d, 0xf9, 0xb2, 0xe9, 0x03, 0xba, 0xe9, 0x09, 0x69, 0xdb, - 0x01, 0x5b, 0x24, 0xfc, 0x36, 0x5f, 0xfe, 0x30, 0xe7, 0xfe, 0x7f, 0xe6, 0xfd, 0x29, 0xc8, 0xfe, - 0x12, 0x27, 0x00, 0xdd, 0x44, 0x00, 0x49, 0x8a, 0xff, 0x5c, 0x57, 0xfe, 0xa1, 0xde, 0xff, 0x30, - 0xf0, 0x00, 0xed, 0x2c, 0x01, 0x5e, 0xbe, 0x01, 0x07, 0x45, 0x01, 0x0c, 0x8d, 0xfe, 0x40, 0x81, - 0xfd, 0x12, 0xa3, 0xfe, 0xdd, 0xf3, 0xff, 0x89, 0x88, 0xff, 0xd3, 0xb0, 0xfe, 0x63, 0xa0, 0x00, - 0x3f, 0x8d, 0x00, 0xd5, 0x44, 0x00, 0x0a, 0x53, 0x13, 0xb1, 0x8d, 0x24, 0x41, 0xb4, 0x15, 0x14, - 0x50, 0xff, 0x29, 0x37, 0xf5, 0xac, 0x22, 0xf8, 0x81, 0xbd, 0x04, 0x01, 0x4c, 0x0b, 0x19, 0x1e, - 0x01, 0xd4, 0xfd, 0xfa, 0x6e, 0x30, 0xfe, 0xcf, 0x2e, 0xff, 0xe8, 0xab, 0xfd, 0xa0, 0xd5, 0xfe, - 0x5f, 0x64, 0x00, 0x69, 0xfc, 0xff, 0xbe, 0x58, 0xff, 0x33, 0x1c, 0xfe, 0x99, 0xb4, 0xff, 0x46, - 0xc2, 0x00, 0xec, 0xa7, 0x00, 0xea, 0x2c, 0x01, 0xa0, 0x54, 0x01, 0xfa, 0x0d, 0xff, 0xa7, 0x4c, - 0xfd, 0xc7, 0x73, 0xfe, 0xfc, 0xf8, 0xff, 0x17, 0x97, 0xff, 0x67, 0x99, 0xfe, 0x96, 0x6f, 0x00, - 0x4f, 0x1b, 0x00, 0x8c, 0x32, 0xff, 0xa0, 0x6f, 0x14, 0xd1, 0x2f, 0x28, 0xeb, 0x50, 0x17, 0x10, - 0x82, 0xfd, 0x1a, 0x81, 0xf3, 0xaa, 0x44, 0xf7, 0x89, 0x17, 0x05, 0xdc, 0xfc, 0x0c, 0x52, 0xa8, - 0x00, 0xa2, 0x68, 0xf9, 0x5f, 0x13, 0xfe, 0xcc, 0x54, 0xff, 0xb8, 0xaa, 0xfd, 0x26, 0x88, 0xfe, - 0x04, 0xab, 0x00, 0x74, 0xd4, 0xff, 0x6c, 0xd9, 0xfe, 0x94, 0x46, 0xfe, 0x3c, 0x51, 0xff, 0xa4, - 0x7e, 0x00, 0x7f, 0x7e, 0x00, 0xe6, 0x4c, 0x00, 0x6c, 0x4c, 0x01, 0xc4, 0x85, 0xff, 0xb7, 0x75, - 0xfd, 0xd1, 0x21, 0xfe, 0x47, 0x6b, 0xff, 0xef, 0xac, 0xff, 0x7a, 0x50, 0xff, 0xd6, 0x16, 0x00, - 0xfb, 0xad, 0xff, 0xd1, 0x95, 0xfe, 0x8e, 0xd0, 0x16, 0x2b, 0x99, 0x2b, 0xde, 0x7f, 0x17, 0xf4, - 0x9e, 0xfb, 0x5c, 0xa9, 0xf1, 0x53, 0xe6, 0xf6, 0xb1, 0x4c, 0x06, 0x54, 0x2e, 0x0e, 0x9c, 0xbd, - 0xff, 0xaf, 0xe9, 0xf7, 0xc9, 0x51, 0xfe, 0x4a, 0x9e, 0xff, 0x95, 0x7e, 0xfd, 0x32, 0x68, 0xfe, - 0xdc, 0xf8, 0x00, 0xbd, 0xc4, 0xff, 0x05, 0x5a, 0xfe, 0xde, 0x4b, 0xfe, 0xa7, 0x59, 0xff, 0xe0, - 0x73, 0x00, 0x6f, 0x39, 0x00, 0xc0, 0xb2, 0xff, 0xff, 0x3e, 0x01, 0x90, 0xc4, 0xff, 0x68, 0xd0, - 0xfd, 0x9e, 0x28, 0xfe, 0x4c, 0x37, 0xff, 0x7a, 0x54, 0xff, 0x00, 0x62, 0xff, 0x36, 0xae, 0x00, - 0x11, 0x6e, 0xff, 0xd0, 0x69, 0xfe, 0xfc, 0x7b, 0x18, 0xd0, 0x0d, 0x2f, 0xe0, 0x7c, 0x18, 0x19, - 0x23, 0xfa, 0xaf, 0xb4, 0xef, 0xad, 0x30, 0xf6, 0x97, 0x6e, 0x07, 0x74, 0x2b, 0x0f, 0x1a, 0x2a, - 0xff, 0x82, 0x6f, 0xf6, 0x2e, 0x56, 0xfe, 0xb6, 0x32, 0x00, 0xf0, 0x3d, 0xfd, 0xc0, 0x11, 0xfe, - 0xa8, 0x40, 0x01, 0x33, 0xf8, 0xff, 0x67, 0xd0, 0xfd, 0x1d, 0x16, 0xfe, 0xcf, 0x6d, 0xff, 0xba, - 0x73, 0x00, 0x82, 0x2c, 0x00, 0x8c, 0xfc, 0xfe, 0xc4, 0xe5, 0x00, 0x4d, 0x2d, 0x00, 0x36, 0x21, - 0xfe, 0xb5, 0x81, 0xfe, 0xba, 0xf6, 0xfe, 0x75, 0x33, 0xff, 0x5c, 0x28, 0xff, 0x77, 0xda, 0x00, - 0x1a, 0x8f, 0xff, 0xa3, 0x54, 0xfe, 0x4f, 0xa6, 0x1a, 0xa3, 0x9d, 0x32, 0xd1, 0xae, 0x19, 0x31, - 0x64, 0xf8, 0x22, 0x09, 0xed, 0x7a, 0x1d, 0xf5, 0x21, 0x8e, 0x08, 0x9d, 0x22, 0x10, 0xe5, 0xf4, - 0xfd, 0x79, 0x75, 0xf4, 0xb4, 0x42, 0xfe, 0xbf, 0xce, 0x00, 0x0b, 0xd3, 0xfc, 0xa5, 0x72, 0xfd, - 0x64, 0x11, 0x01, 0x28, 0x37, 0x00, 0x6c, 0x49, 0xfd, 0x59, 0xa7, 0xfd, 0x11, 0x0c, 0xff, 0x1a, - 0x55, 0x00, 0xef, 0x23, 0x00, 0x38, 0x2a, 0xfe, 0x97, 0x0b, 0x00, 0x52, 0x3f, 0x00, 0xfe, 0x71, - 0xfe, 0x9c, 0xd9, 0xfe, 0x65, 0x03, 0xff, 0x5e, 0xb7, 0xfe, 0x16, 0x02, 0xff, 0x7b, 0x61, 0x00, - 0x1a, 0xc9, 0xff, 0x04, 0xf2, 0xfd, 0x1b, 0x22, 0x1c, 0x1c, 0x9e, 0x35, 0x35, 0x22, 0x1b, 0x72, - 0x5a, 0xf8, 0x21, 0x36, 0xeb, 0xf2, 0xdf, 0xf3, 0x31, 0xea, 0x09, 0x23, 0xe1, 0x10, 0x66, 0xaa, - 0xfd, 0x74, 0x0d, 0xf3, 0xe1, 0x17, 0xfe, 0x14, 0xfa, 0x01, 0x60, 0xbf, 0xfc, 0xa7, 0x23, 0xfd, - 0x35, 0x2c, 0x01, 0x62, 0x76, 0x00, 0x8d, 0x2b, 0xfd, 0x22, 0xd1, 0xfd, 0xee, 0xe7, 0xfe, 0x8d, - 0x47, 0x00, 0x3a, 0x61, 0x00, 0xdb, 0xfd, 0xfd, 0x63, 0x64, 0xff, 0xa0, 0x56, 0x00, 0x1d, 0x1f, - 0xff, 0x6d, 0x12, 0xff, 0x50, 0xcb, 0xff, 0x31, 0x8c, 0xfe, 0x1c, 0x47, 0xff, 0x68, 0x32, 0x00, - 0x61, 0xbb, 0xff, 0x3d, 0x55, 0xfe, 0xf7, 0x37, 0x1f, 0x47, 0x65, 0x38, 0xad, 0xfa, 0x1a, 0x3f, - 0xe9, 0xf8, 0xb7, 0x38, 0xe9, 0x2a, 0x3c, 0xf2, 0x6a, 0xd0, 0x0b, 0x5a, 0x0e, 0x11, 0x27, 0x75, - 0xfc, 0xe3, 0xd1, 0xf1, 0x9c, 0xab, 0xfd, 0x20, 0x00, 0x03, 0x6d, 0xc2, 0xfc, 0xb4, 0x64, 0xfc, - 0xb8, 0x64, 0x01, 0x43, 0x79, 0x00, 0xe4, 0xbb, 0xfc, 0x5c, 0xe6, 0xfd, 0x30, 0xc8, 0xfe, 0x10, - 0x2d, 0x00, 0x08, 0x3f, 0x00, 0x73, 0x1d, 0xfe, 0x1b, 0x52, 0xfe, 0x38, 0xcb, 0xff, 0x67, 0x31, - 0x00, 0xd2, 0x1c, 0xff, 0x39, 0x57, 0x00, 0x95, 0xcd, 0xfe, 0x16, 0x25, 0xff, 0xe8, 0x70, 0x00, - 0xad, 0x59, 0xff, 0xad, 0x57, 0xfe, 0xd7, 0xae, 0x22, 0x87, 0xec, 0x3a, 0x8d, 0x20, 0x19, 0xf6, - 0xd9, 0xf8, 0x8c, 0xad, 0xe8, 0xb7, 0x98, 0xf1, 0x95, 0x4c, 0x0d, 0xef, 0x24, 0x10, 0x79, 0x38, - 0xfb, 0x9a, 0xa9, 0xf1, 0x21, 0x02, 0xfd, 0x9f, 0x85, 0x03, 0x99, 0x16, 0xfd, 0x71, 0xa6, 0xfb, - 0x1b, 0x66, 0x01, 0xa1, 0x99, 0x00, 0xcc, 0x52, 0xfc, 0x90, 0xf9, 0xfd, 0x4e, 0xb6, 0xfe, 0xcd, - 0x12, 0x00, 0x61, 0xf0, 0xff, 0x77, 0x6d, 0xfe, 0x6d, 0xe8, 0xfd, 0xc3, 0x76, 0xfe, 0x95, 0x17, - 0x01, 0xff, 0xa1, 0xff, 0xea, 0x4b, 0x00, 0x6d, 0x8a, 0xff, 0x0c, 0xdc, 0xfe, 0x1b, 0x8a, 0x00, - 0xca, 0x94, 0xff, 0x60, 0xe6, 0xfd, 0xd7, 0x45, 0x29, 0xf3, 0x9b, 0x3d, 0x78, 0x3e, 0x13, 0x1c, - 0x6b, 0xf8, 0xc7, 0xc9, 0xe9, 0xcd, 0x09, 0xf2, 0x4f, 0x50, 0x0e, 0x26, 0x3f, 0x0e, 0xee, 0x2f, - 0xf9, 0x83, 0x7b, 0xf2, 0x8b, 0x5d, 0xfc, 0xb0, 0x4d, 0x03, 0xd5, 0xf6, 0xfd, 0x3d, 0xc7, 0xfa, - 0x02, 0x15, 0x01, 0xeb, 0x88, 0x00, 0xab, 0x36, 0xfc, 0x6c, 0xe7, 0xfd, 0x03, 0xd8, 0xfe, 0x6d, - 0xf9, 0xff, 0x7c, 0x55, 0xff, 0xef, 0x93, 0xfe, 0x27, 0x0f, 0xfe, 0xe7, 0x12, 0xfd, 0xc0, 0x2a, - 0x01, 0xb2, 0xe0, 0x00, 0x69, 0xc3, 0xff, 0x68, 0x8d, 0x00, 0x39, 0x2f, 0xff, 0x18, 0xd4, 0xff, - 0x40, 0x4a, 0x00, 0x53, 0x7d, 0xfd, 0xd9, 0xa7, 0x2e, 0x70, 0x09, 0x3e, 0xe0, 0x7b, 0x0e, 0xec, - 0x67, 0xfb, 0xf3, 0x21, 0xeb, 0x0e, 0xc1, 0xef, 0x0d, 0x0e, 0x0f, 0x8d, 0x63, 0x0e, 0xba, 0x3f, - 0xf7, 0xae, 0x77, 0xf2, 0x35, 0x4f, 0xfc, 0x27, 0x37, 0x03, 0x69, 0x61, 0xfe, 0xfd, 0x33, 0xfa, - 0xaf, 0xcf, 0x00, 0x4b, 0x53, 0x00, 0x06, 0x26, 0xfc, 0x2f, 0x09, 0xfe, 0x29, 0x53, 0xff, 0xb8, - 0x9d, 0xff, 0x02, 0xee, 0xfe, 0x50, 0x96, 0xfe, 0x16, 0x61, 0xfe, 0xb6, 0x7b, 0xfc, 0x7b, 0x46, - 0x00, 0x98, 0x57, 0x02, 0xf2, 0x80, 0xff, 0x34, 0xed, 0x00, 0xbe, 0x0c, 0x00, 0x35, 0x33, 0xff, - 0x12, 0xa6, 0x00, 0x48, 0x86, 0xfd, 0x0f, 0xe1, 0x33, 0x4a, 0xac, 0x3d, 0xd6, 0x9e, 0x09, 0xa1, - 0x83, 0xff, 0x08, 0x83, 0xec, 0xa7, 0x14, 0xed, 0xf4, 0xa6, 0x0f, 0x1d, 0xba, 0x0e, 0xbb, 0x1a, - 0xf5, 0xcc, 0x44, 0xf2, 0x7a, 0xe3, 0xfc, 0xf4, 0xb7, 0x02, 0xab, 0x62, 0xfe, 0x6c, 0xec, 0xf9, - 0x81, 0x98, 0x00, 0x06, 0xca, 0xff, 0x0e, 0xe0, 0xfb, 0x5a, 0x71, 0xfe, 0xfd, 0x1e, 0x00, 0xc5, - 0xed, 0xfe, 0x12, 0x84, 0xfe, 0xed, 0xcf, 0xfe, 0xd7, 0x3e, 0xfe, 0xdf, 0x63, 0xfc, 0xb3, 0x33, - 0xff, 0x4d, 0x3f, 0x03, 0x67, 0xea, 0xff, 0x16, 0xb5, 0x00, 0xc7, 0xf2, 0x00, 0xe8, 0x0c, 0xff, - 0x76, 0x58, 0x00, 0x8d, 0xcf, 0xfd, 0x6f, 0x64, 0x3b, 0x3d, 0x90, 0x3f, 0xce, 0x4d, 0x00, 0x99, - 0x2e, 0x00, 0xb1, 0xac, 0xf0, 0xf8, 0xd2, 0xed, 0x44, 0x4b, 0x0e, 0xa0, 0x4e, 0x0d, 0xee, 0xab, - 0xf3, 0xd5, 0x38, 0xf2, 0xbe, 0xbe, 0xfd, 0x8d, 0xc2, 0x01, 0x53, 0xac, 0xfe, 0x35, 0x66, 0xf9, - 0x0c, 0x1d, 0x00, 0x5a, 0x40, 0xff, 0xbf, 0xd5, 0xfb, 0xdf, 0x9f, 0xfe, 0x6d, 0x02, 0x01, 0xc7, - 0xda, 0xfe, 0x53, 0xbe, 0xfd, 0x8b, 0xef, 0xfe, 0xd4, 0xb0, 0xfd, 0xff, 0x05, 0xfd, 0x65, 0x6e, - 0xfe, 0x11, 0xf5, 0x02, 0x62, 0x15, 0x01, 0xf8, 0xb6, 0x00, 0x53, 0x21, 0x01, 0x1d, 0x7c, 0xff, - 0x28, 0xa9, 0xff, 0x62, 0xe5, 0xfd, 0x04, 0x5f, 0x43, 0x5a, 0x46, 0x40, 0x02, 0xc1, 0xf7, 0xc1, - 0xe3, 0xff, 0x24, 0x13, 0xf4, 0xdd, 0x7f, 0xf0, 0x4a, 0x9b, 0x0c, 0xb4, 0x93, 0x0b, 0x5a, 0x0a, - 0xf3, 0x0b, 0xf0, 0xf1, 0x34, 0x9c, 0xfe, 0xc6, 0x34, 0x01, 0xde, 0xd1, 0xfe, 0x2b, 0xc5, 0xf8, - 0x4e, 0x0f, 0x00, 0x8c, 0x87, 0xfe, 0x90, 0x18, 0xfc, 0x0e, 0x0e, 0xff, 0x32, 0x9a, 0x01, 0x69, - 0x01, 0xff, 0x8d, 0x02, 0xfd, 0xe7, 0x47, 0xff, 0x51, 0x1c, 0xfd, 0x2b, 0xb5, 0xfd, 0xaa, 0x69, - 0xfe, 0x98, 0x4a, 0x02, 0x29, 0xcf, 0x01, 0xb3, 0x4c, 0x01, 0xf9, 0xbc, 0x00, 0x14, 0xc6, 0xff, - 0xa3, 0x98, 0xff, 0x63, 0x5e, 0xfd, 0xa5, 0xae, 0x4a, 0x19, 0x4b, 0x43, 0xc4, 0x5c, 0xee, 0xe4, - 0x97, 0xfd, 0x24, 0x14, 0xf8, 0x1c, 0x8a, 0xf4, 0x24, 0xe4, 0x09, 0xe5, 0x91, 0x09, 0x5d, 0x96, - 0xf3, 0x4c, 0x84, 0xf0, 0xdf, 0x69, 0xff, 0xa7, 0x98, 0x00, 0x58, 0x0f, 0xff, 0xd6, 0xdf, 0xf7, - 0x2a, 0xd7, 0xff, 0xc8, 0xe7, 0xfd, 0xa1, 0x84, 0xfc, 0x4c, 0x95, 0xff, 0x69, 0xde, 0x01, 0xef, - 0x85, 0xff, 0x56, 0xd2, 0xfb, 0xab, 0xc3, 0xff, 0xac, 0xa3, 0xfc, 0x4d, 0x32, 0xfe, 0x82, 0xe9, - 0xfe, 0xf2, 0x97, 0x01, 0xa3, 0x83, 0x01, 0x34, 0x4b, 0x02, 0xc0, 0x42, 0x00, 0x6e, 0x38, 0xff, - 0xfb, 0x31, 0x00, 0xaa, 0xb3, 0xfc, 0x96, 0xf2, 0x50, 0xb0, 0x94, 0x45, 0x41, 0x6e, 0xe7, 0x2c, - 0x8e, 0xfa, 0x3e, 0x6c, 0xfa, 0x3b, 0xc1, 0xf8, 0xdf, 0xa4, 0x07, 0xb8, 0x14, 0x08, 0xe5, 0x5b, - 0xf4, 0xb6, 0xf1, 0xee, 0x60, 0xd7, 0xff, 0x77, 0x13, 0x00, 0x85, 0x33, 0xff, 0xe6, 0x5c, 0xf7, - 0x89, 0x9b, 0xff, 0x11, 0x90, 0xfd, 0x1e, 0x18, 0xfd, 0xaf, 0xe7, 0xff, 0x07, 0xd1, 0x01, 0xed, - 0x0c, 0x00, 0x70, 0xdd, 0xfa, 0x60, 0x32, 0x00, 0x8a, 0x72, 0xfc, 0xd7, 0x56, 0xfe, 0x08, 0xea, - 0xff, 0xd5, 0x3d, 0x01, 0x25, 0x35, 0x00, 0x7a, 0x06, 0x03, 0x25, 0x28, 0x00, 0x09, 0x48, 0xfe, - 0x20, 0xc7, 0x00, 0x89, 0xdc, 0xfc, 0x6a, 0xef, 0x57, 0x6a, 0xfe, 0x47, 0xe9, 0x3a, 0xe1, 0x3c, - 0x19, 0xf6, 0x6e, 0x98, 0xfb, 0x90, 0x99, 0xfd, 0x55, 0xcb, 0x05, 0xe0, 0x13, 0x07, 0x96, 0xf8, - 0xf4, 0x3c, 0x1e, 0xed, 0x1d, 0xdd, 0xff, 0x18, 0x3c, 0xff, 0x8c, 0xa1, 0xff, 0x8e, 0x2c, 0xf7, - 0x22, 0x97, 0xff, 0x0b, 0x72, 0xfd, 0x03, 0xca, 0xfd, 0x93, 0xfc, 0xff, 0xd9, 0x97, 0x01, 0x08, - 0xb0, 0x00, 0xd4, 0x25, 0xfa, 0x7a, 0xb9, 0x00, 0x95, 0x0d, 0xfc, 0xbe, 0xec, 0xfe, 0xc8, 0x16, - 0x01, 0x7a, 0x89, 0x00, 0x77, 0xa8, 0xfe, 0x1e, 0xcc, 0x02, 0xa3, 0x78, 0x00, 0xd0, 0xa3, 0xfd, - 0xbd, 0x09, 0x01, 0x1f, 0xe2, 0xfd, 0x7b, 0xd5, 0x5c, 0x44, 0xae, 0x4a, 0x2c, 0x2f, 0xdd, 0x26, - 0x1f, 0xf2, 0x74, 0x11, 0xfb, 0x34, 0xb7, 0x00, 0x0e, 0x8f, 0x05, 0xb2, 0xa4, 0x06, 0x5c, 0x29, - 0xf5, 0x9d, 0xa6, 0xeb, 0x8e, 0x3e, 0xff, 0xeb, 0x54, 0xfe, 0x84, 0x7c, 0x00, 0x9c, 0x74, 0xf7, - 0x96, 0xa1, 0xff, 0x5b, 0xbb, 0xfd, 0x9c, 0xed, 0xfd, 0x20, 0xc1, 0xff, 0x4b, 0x5a, 0x01, 0x3c, - 0x70, 0x01, 0x68, 0xe9, 0xf9, 0xf4, 0xbf, 0x00, 0x05, 0x1f, 0xfc, 0x2f, 0xa7, 0xff, 0x94, 0x0c, - 0x01, 0x94, 0x18, 0x00, 0x18, 0x86, 0xfd, 0x57, 0xb0, 0x01, 0xa5, 0x2c, 0x01, 0xb5, 0xd4, 0xfd, - 0x1b, 0xe9, 0x00, 0xd6, 0xa8, 0xfe, 0xa7, 0xf3, 0x60, 0xa4, 0x40, 0x4d, 0xcb, 0xcf, 0xda, 0xa2, - 0xf8, 0xee, 0x99, 0x8f, 0xf8, 0xa3, 0xfc, 0x02, 0xc5, 0x93, 0x06, 0xba, 0x54, 0x06, 0xa4, 0x37, - 0xf5, 0x1d, 0x66, 0xea, 0xc4, 0x00, 0xfe, 0x21, 0x7b, 0xfd, 0xde, 0x46, 0x02, 0x04, 0xf4, 0xf7, - 0xfa, 0xc2, 0xff, 0x81, 0x4a, 0xfe, 0x66, 0x8a, 0xfd, 0xa3, 0x5a, 0xff, 0x74, 0x7c, 0x01, 0x67, - 0x66, 0x02, 0x63, 0xad, 0xf9, 0x0d, 0xfa, 0x00, 0xfc, 0x7d, 0xfc, 0xf9, 0x84, 0xff, 0xb0, 0x99, - 0x00, 0x73, 0xe2, 0xff, 0x67, 0x74, 0xfc, 0x5e, 0xc4, 0x00, 0xf8, 0x20, 0x02, 0x70, 0x6c, 0xfe, - 0x4a, 0xad, 0x00, 0x53, 0x42, 0xff, 0x65, 0x5c, 0x65, 0x0f, 0x49, 0x4f, 0xac, 0xa3, 0xd9, 0x1a, - 0x53, 0xec, 0x62, 0x03, 0xf3, 0xdf, 0xc8, 0x04, 0x0e, 0xc7, 0x08, 0xc0, 0xe0, 0x05, 0x24, 0xf7, - 0xf4, 0x34, 0x00, 0xe9, 0x91, 0x05, 0xfc, 0xb3, 0x1f, 0xfd, 0x9e, 0x4a, 0x05, 0xc8, 0x1b, 0xf8, - 0xcb, 0x45, 0x00, 0x6f, 0x69, 0xfe, 0x30, 0x85, 0xfc, 0xbb, 0x82, 0xff, 0x6d, 0xe1, 0x01, 0xac, - 0xce, 0x02, 0xc5, 0x6b, 0xfa, 0x89, 0x38, 0x01, 0x62, 0x3c, 0xfb, 0x88, 0x4b, 0xff, 0xae, 0x01, - 0x00, 0xf9, 0x26, 0xff, 0x56, 0x59, 0xfc, 0xb1, 0x5d, 0x00, 0x2c, 0x7a, 0x02, 0x2c, 0x57, 0xff, - 0xb2, 0x06, 0x01, 0x0d, 0x3e, 0xff, 0x01, 0xb7, 0x68, 0x14, 0xc0, 0x4f, 0x4c, 0x7b, 0xda, 0xa4, - 0xaa, 0xea, 0x51, 0xd3, 0xec, 0x58, 0xe2, 0x05, 0xa0, 0x87, 0x0a, 0xc3, 0x9e, 0x05, 0xfe, 0x30, - 0xf4, 0x67, 0x54, 0xe8, 0x29, 0xad, 0xfa, 0x82, 0x85, 0xfd, 0x49, 0xbf, 0x07, 0x35, 0x4a, 0xf8, - 0xd4, 0x79, 0x00, 0xd9, 0x99, 0xfd, 0x5d, 0x83, 0xfc, 0xbd, 0xf6, 0xff, 0x76, 0xae, 0x01, 0x77, - 0xc4, 0x03, 0x91, 0x14, 0xfb, 0x5e, 0x9c, 0xff, 0xf5, 0x72, 0xfa, 0xd7, 0x23, 0xff, 0x80, 0x1a, - 0xff, 0x5b, 0x5b, 0xff, 0x6d, 0x22, 0xfd, 0x02, 0xcb, 0xff, 0xfe, 0x4a, 0x02, 0xe1, 0xbb, 0x00, - 0x48, 0x01, 0x01, 0xfc, 0x41, 0xfe, 0x8c, 0x4a, 0x6a, 0xb9, 0x97, 0x50, 0xfe, 0xad, 0xdd, 0xcb, - 0x08, 0xe9, 0x60, 0x3e, 0xe5, 0x4b, 0x61, 0x05, 0x1b, 0xae, 0x0c, 0xfd, 0x38, 0x05, 0xcb, 0x15, - 0xf3, 0x6e, 0x7d, 0xe9, 0x66, 0x52, 0xf9, 0x26, 0xc1, 0xfd, 0xc1, 0xc9, 0x0a, 0x95, 0x2f, 0xf8, - 0x63, 0x7b, 0xff, 0x17, 0xc8, 0xfd, 0x7b, 0xd6, 0xfc, 0x0f, 0x4e, 0x00, 0x50, 0x84, 0x02, 0x89, - 0x58, 0x03, 0x10, 0x31, 0xfa, 0x11, 0xc1, 0xfe, 0xfe, 0x41, 0xf9, 0xb5, 0xdd, 0xfe, 0x5a, 0x82, - 0xff, 0xa6, 0xcb, 0xff, 0x0a, 0x9c, 0xfd, 0xfd, 0xb0, 0xff, 0x05, 0x56, 0x02, 0xf7, 0xbf, 0x00, - 0x76, 0x3f, 0x01, 0x2a, 0x76, 0xfe, 0xcb, 0x0e, 0x69, 0xa8, 0xcd, 0x52, 0x56, 0x70, 0xe1, 0x6e, - 0xc6, 0xe8, 0x0e, 0x7a, 0xde, 0x6d, 0xbd, 0x02, 0x14, 0xf9, 0x0e, 0xc1, 0x1f, 0x04, 0xc1, 0x06, - 0xf4, 0x9d, 0x60, 0xeb, 0xb5, 0xdd, 0xf7, 0xb2, 0x48, 0xfe, 0x50, 0x8a, 0x0c, 0x4a, 0xda, 0xf7, - 0x9d, 0xbc, 0xfe, 0x6c, 0xb3, 0xfe, 0x3c, 0x53, 0xfd, 0xe0, 0xb7, 0x01, 0x7e, 0x99, 0x00, 0x37, - 0x43, 0x02, 0x3f, 0xac, 0xfa, 0x72, 0x5c, 0xfd, 0xef, 0x13, 0xf9, 0x95, 0xac, 0xff, 0x67, 0xb0, - 0xff, 0x63, 0xc1, 0xff, 0x85, 0xb7, 0xfe, 0x58, 0xa3, 0xff, 0xb8, 0x1f, 0x01, 0x8a, 0xff, 0x00, - 0x56, 0xdc, 0x02, 0xc7, 0x8b, 0xfd, 0xf2, 0x49, 0x69, 0x28, 0xd8, 0x50, 0x6e, 0xd6, 0xe7, 0x3f, - 0x16, 0xe9, 0xe6, 0x35, 0xd6, 0xa7, 0x6c, 0xff, 0x12, 0xbd, 0x0f, 0x8e, 0x52, 0x05, 0xe1, 0x85, - 0xf5, 0xa2, 0xcc, 0xed, 0x7c, 0xe2, 0xf6, 0x02, 0x6c, 0xfe, 0x00, 0x97, 0x0d, 0xb1, 0x29, 0xf7, - 0xc1, 0xdc, 0xfe, 0xa3, 0x51, 0x01, 0x29, 0x83, 0xfd, 0x95, 0xb9, 0xff, 0xa4, 0x7e, 0xff, 0x91, - 0x23, 0x01, 0x54, 0x10, 0xfb, 0x3a, 0x39, 0xfd, 0x8e, 0xb6, 0xf9, 0x20, 0x13, 0x00, 0x96, 0xc6, - 0xff, 0xff, 0x84, 0x00, 0xa7, 0x8f, 0xfe, 0x52, 0x3f, 0xff, 0x43, 0x54, 0x01, 0xf9, 0xfd, 0x00, - 0x91, 0x49, 0x03, 0x80, 0xa7, 0xfd, 0xaf, 0x70, 0x66, 0xad, 0x0b, 0x51, 0x6c, 0x9c, 0xed, 0xff, - 0x2a, 0xea, 0x8b, 0xf7, 0xcf, 0xbf, 0x3f, 0xfa, 0xa6, 0x3d, 0x11, 0x2d, 0x41, 0x08, 0xdd, 0x82, - 0xf6, 0x43, 0x09, 0xf0, 0x0f, 0x81, 0xf6, 0xe8, 0xa2, 0xfd, 0x89, 0x71, 0x0d, 0xf4, 0x14, 0xf8, - 0xec, 0xe2, 0x00, 0x82, 0x43, 0x01, 0x5e, 0x90, 0xfb, 0xad, 0x8f, 0xff, 0x5e, 0x16, 0xfe, 0x4a, - 0x1c, 0x01, 0xdb, 0x71, 0xfc, 0x34, 0x15, 0xfd, 0x70, 0x62, 0xfa, 0x92, 0xa9, 0x00, 0x0c, 0xb7, - 0xff, 0x6d, 0xae, 0xff, 0xb4, 0x4e, 0xff, 0x39, 0xe2, 0xff, 0xd0, 0xaa, 0x00, 0xb7, 0xa4, 0x00, - 0x03, 0x2a, 0x04, 0x0e, 0xc1, 0xfd, 0xd6, 0x49, 0x65, 0xfe, 0x2d, 0x4e, 0x4c, 0x6b, 0xf2, 0x75, - 0xd4, 0xeb, 0xb0, 0x96, 0xc9, 0x92, 0xf2, 0xf5, 0x44, 0xea, 0x13, 0x10, 0xad, 0x0a, 0x31, 0xb3, - 0xf6, 0x08, 0x41, 0xf3, 0xeb, 0x5c, 0xf5, 0x06, 0x9d, 0xfb, 0x84, 0x92, 0x0f, 0xcd, 0x61, 0xf9, - 0xc2, 0xfc, 0xff, 0xd8, 0xc6, 0x00, 0x2f, 0xe6, 0xf9, 0x7c, 0x4a, 0xff, 0x25, 0x69, 0xfe, 0xad, - 0xfd, 0x00, 0x7c, 0x4b, 0xfd, 0x8c, 0x78, 0xfd, 0x52, 0xa7, 0xfb, 0xce, 0xb2, 0xff, 0xfd, 0xd7, - 0xfe, 0x17, 0x7f, 0x00, 0x89, 0xe7, 0xff, 0x11, 0x36, 0xff, 0x63, 0xad, 0x00, 0x58, 0xd4, 0x00, - 0xf3, 0x1b, 0x04, 0x2f, 0xba, 0xfd, 0x47, 0x59, 0x62, 0x96, 0xdd, 0x4a, 0x97, 0xeb, 0xf6, 0x86, - 0x6d, 0xee, 0xdf, 0x5b, 0xc3, 0xf9, 0xcc, 0xf3, 0xa1, 0x79, 0x15, 0xdb, 0xcd, 0x0c, 0xb8, 0x00, - 0xf9, 0x31, 0xcf, 0xf4, 0x5a, 0xf6, 0xf2, 0xf2, 0x93, 0xfd, 0xd2, 0x02, 0x10, 0x50, 0xf8, 0xf7, - 0x5b, 0x89, 0x00, 0xa6, 0x15, 0xfe, 0x38, 0x10, 0xfa, 0xcd, 0x2a, 0x01, 0xcd, 0x54, 0xfd, 0x83, - 0x57, 0x01, 0x2f, 0x2a, 0xff, 0x96, 0xd5, 0xfd, 0xe2, 0xcb, 0xfa, 0x7c, 0x44, 0xff, 0xe0, 0xa8, - 0xff, 0x48, 0x28, 0x00, 0xcd, 0xda, 0xff, 0xa5, 0x62, 0xff, 0xfd, 0xed, 0x00, 0x9c, 0xaa, 0x00, - 0xd2, 0x9b, 0x03, 0x3b, 0xe1, 0xfd, 0x68, 0xa3, 0x5f, 0x37, 0x5e, 0x46, 0x4a, 0x9c, 0xfa, 0xf8, - 0x27, 0xef, 0x0a, 0xcc, 0xc2, 0xd2, 0x24, 0xf2, 0x9f, 0x6f, 0x15, 0x8f, 0x1b, 0x10, 0x61, 0x71, - 0xf8, 0x52, 0xad, 0xf6, 0xce, 0x56, 0xf3, 0xbd, 0xae, 0xfc, 0xcf, 0xf1, 0x0f, 0x09, 0x69, 0xf7, - 0x14, 0xc0, 0xfe, 0xd4, 0x88, 0xfe, 0xd6, 0x7b, 0xfb, 0xca, 0xe0, 0x00, 0x9c, 0x9d, 0xfd, 0x15, - 0x9c, 0x02, 0xde, 0x19, 0xff, 0x4f, 0xda, 0xfc, 0x56, 0xc1, 0xfb, 0xe2, 0x8d, 0xff, 0x42, 0xcb, - 0xfe, 0xb6, 0x2e, 0x00, 0xf5, 0x65, 0x00, 0xea, 0x48, 0xff, 0xed, 0xfc, 0x00, 0xf9, 0x4d, 0x00, - 0x24, 0xa7, 0x03, 0x78, 0xf5, 0xfd, 0xa5, 0xeb, 0x59, 0x5e, 0x82, 0x41, 0x31, 0xd7, 0xfd, 0x97, - 0x43, 0xf2, 0xe3, 0xcf, 0xc4, 0xe2, 0x14, 0xf0, 0x31, 0x09, 0x15, 0x6e, 0x8e, 0x10, 0x61, 0xc5, - 0xfb, 0x62, 0xef, 0xf7, 0xb4, 0x2e, 0xf0, 0x8d, 0xd6, 0xfe, 0x6f, 0xc3, 0x0d, 0xb8, 0x02, 0xf6, - 0x0d, 0xc9, 0xff, 0xa2, 0xe0, 0xfe, 0x15, 0xf5, 0xfb, 0x0c, 0x07, 0x02, 0xde, 0xb2, 0xfe, 0xd8, - 0xfd, 0x00, 0x92, 0x48, 0xff, 0x35, 0xb7, 0xfd, 0x3b, 0x58, 0xfc, 0xba, 0xb0, 0xfe, 0x67, 0x47, - 0xfe, 0x22, 0x05, 0x01, 0x07, 0x97, 0x00, 0x57, 0x75, 0xfe, 0xee, 0x39, 0x01, 0x7f, 0x3a, 0x01, - 0x09, 0x74, 0x02, 0x12, 0xd9, 0xfd, 0xae, 0x6d, 0x54, 0xfc, 0x41, 0x3c, 0x7b, 0xb4, 0xff, 0x3f, - 0xd2, 0xf6, 0xb1, 0x21, 0xc8, 0xf9, 0xb4, 0xee, 0xe4, 0xc9, 0x12, 0x86, 0x3e, 0x13, 0xb3, 0x8e, - 0xfc, 0xaf, 0xbf, 0xf6, 0xd7, 0xac, 0xf0, 0x43, 0x63, 0xfe, 0x43, 0xb1, 0x0c, 0x0f, 0xee, 0xf5, - 0xf8, 0x8e, 0x00, 0x1c, 0xc8, 0xfe, 0xfa, 0x5d, 0xfd, 0x65, 0x6b, 0x03, 0x46, 0x7f, 0xfc, 0xe9, - 0x1f, 0x01, 0xb5, 0xa2, 0x00, 0xff, 0x42, 0xfd, 0x92, 0x8a, 0xfc, 0x25, 0x52, 0xfe, 0x34, 0x5a, - 0xfe, 0x22, 0xb8, 0x01, 0xad, 0x94, 0xff, 0x64, 0x30, 0xfe, 0xbf, 0xc6, 0x02, 0x7a, 0xac, 0x00, - 0x3a, 0x4c, 0x01, 0x45, 0x8e, 0xfe, 0x5a, 0x95, 0x4d, 0x37, 0xd5, 0x34, 0x9a, 0x52, 0x02, 0x24, - 0xf6, 0xfd, 0x71, 0xed, 0xca, 0x68, 0x3c, 0xee, 0xf7, 0xa0, 0x13, 0x58, 0xc4, 0x10, 0xcc, 0x05, - 0xfd, 0xbc, 0x19, 0xf8, 0x6b, 0xc4, 0xee, 0xff, 0xa6, 0x00, 0xe8, 0x20, 0x0b, 0xd7, 0x5a, 0xf5, - 0x0c, 0xe6, 0x01, 0xa5, 0xbf, 0xff, 0xd7, 0xb4, 0xfe, 0x31, 0xd2, 0x01, 0xcc, 0x44, 0xfc, 0x1a, - 0x5d, 0x02, 0x9c, 0x94, 0x00, 0x87, 0x82, 0xfc, 0xfc, 0x7d, 0xfd, 0xc3, 0x4f, 0xfe, 0x5f, 0x58, - 0xfe, 0xbd, 0x78, 0x01, 0xba, 0x22, 0xff, 0x37, 0xe8, 0xfe, 0x2e, 0x2a, 0x03, 0x58, 0x21, 0x00, - 0xe1, 0xa8, 0x00, 0x6b, 0x06, 0xff, 0x8f, 0x4c, 0x45, 0x60, 0x43, 0x30, 0xa8, 0x02, 0x06, 0x6e, - 0xd0, 0x00, 0x52, 0x80, 0xcf, 0x13, 0x8a, 0xf1, 0x38, 0xb1, 0x0f, 0x1f, 0x29, 0x0e, 0x5b, 0xd5, - 0xfe, 0xf8, 0x0c, 0xf7, 0xd8, 0xaf, 0xf0, 0xdd, 0x40, 0x01, 0x9a, 0xd1, 0x08, 0x7a, 0x30, 0xf6, - 0x2b, 0x72, 0x03, 0x47, 0x2d, 0x00, 0x48, 0x7c, 0xfd, 0x49, 0xf9, 0x01, 0xd2, 0x07, 0xfd, 0x77, - 0x41, 0x02, 0x6b, 0x0a, 0x00, 0x02, 0xad, 0xfc, 0xae, 0x95, 0xfe, 0xd6, 0xe4, 0xfd, 0xcb, 0xef, - 0xfd, 0xc0, 0xe7, 0x01, 0x1e, 0xf4, 0xfe, 0x7a, 0xb5, 0xfe, 0x14, 0xbe, 0x03, 0xaa, 0x88, 0xff, - 0x68, 0x72, 0x00, 0x2f, 0x52, 0xff, 0xe0, 0xb5, 0x41, 0x0d, 0xb3, 0x2e, 0x64, 0xd2, 0x01, 0x71, - 0x4d, 0xf9, 0x81, 0x8e, 0xd3, 0x73, 0x41, 0xff, 0xba, 0xca, 0x13, 0x6c, 0xfe, 0x05, 0x14, 0x23, - 0xfa, 0x1e, 0x61, 0xfa, 0x44, 0xac, 0xf5, 0x87, 0x90, 0xfe, 0x02, 0x95, 0x08, 0x30, 0xad, 0xf6, - 0x01, 0x71, 0x02, 0x5b, 0x83, 0x00, 0xdc, 0x7a, 0xfd, 0x8a, 0x37, 0x01, 0x4a, 0x60, 0xfe, 0x33, - 0xd5, 0x01, 0x94, 0x52, 0xff, 0x06, 0xa1, 0xfd, 0x81, 0x7e, 0xfd, 0x27, 0x2c, 0xff, 0xa2, 0x06, - 0xff, 0xc3, 0xf5, 0xff, 0x1a, 0xe7, 0xff, 0xd1, 0xb1, 0xff, 0x5c, 0x24, 0xff, 0xff, 0x26, 0xff, - 0x33, 0x3f, 0x03, 0x79, 0x6b, 0xff, 0x18, 0x54, 0x35, 0x6f, 0xf8, 0x2e, 0xd6, 0xa9, 0x0c, 0x53, - 0x8d, 0xfc, 0xe9, 0x64, 0xd4, 0xa3, 0x2f, 0xf5, 0x09, 0x10, 0x0d, 0x37, 0x3a, 0x0a, 0xc3, 0xac, - 0x02, 0xa5, 0xef, 0xfb, 0xca, 0xb8, 0xf4, 0x67, 0xbc, 0xfb, 0x89, 0xc0, 0x04, 0x22, 0xff, 0xf9, - 0xf8, 0x80, 0x04, 0xdf, 0xc4, 0x00, 0xb9, 0xcb, 0xfc, 0x66, 0x76, 0x02, 0x2e, 0xa2, 0xfe, 0xfc, - 0x77, 0x00, 0x2b, 0x11, 0x01, 0x5c, 0xad, 0xfe, 0xd8, 0xf9, 0xfd, 0x91, 0x96, 0x00, 0x5f, 0x9b, - 0xfc, 0xb9, 0x46, 0xfe, 0xea, 0xfc, 0xff, 0x28, 0xc1, 0xfe, 0x17, 0x44, 0x01, 0x4c, 0x36, 0x01, - 0x3e, 0x11, 0x03, 0x4e, 0xd0, 0xff, 0x5c, 0xce, 0x2b, 0xea, 0xb8, 0x2a, 0x25, 0x72, 0x0f, 0xd9, - 0xa6, 0xff, 0x41, 0x90, 0xdd, 0xc8, 0x7b, 0xf4, 0x63, 0x60, 0x09, 0xc6, 0xe7, 0x08, 0x7c, 0x50, - 0x02, 0x16, 0x3c, 0xfd, 0x82, 0x80, 0xf7, 0x86, 0xa6, 0xfb, 0x0e, 0x37, 0x03, 0xa6, 0x22, 0xfc, - 0x7c, 0xa5, 0x03, 0x96, 0x92, 0x00, 0x3e, 0x4a, 0xfd, 0xf3, 0x43, 0x02, 0xb7, 0x17, 0xff, 0xe7, - 0x31, 0x00, 0xb3, 0x76, 0x01, 0x73, 0x29, 0xff, 0x51, 0xcf, 0xfe, 0x19, 0xa2, 0x00, 0x47, 0xe9, - 0xfc, 0x58, 0x94, 0xfe, 0x00, 0x69, 0x00, 0x50, 0x07, 0xff, 0x37, 0xd3, 0x00, 0xb7, 0x7e, 0x01, - 0x53, 0x7a, 0x02, 0xe7, 0xeb, 0xff, 0xd8, 0x1d, 0x24, 0x2a, 0xe6, 0x26, 0x39, 0x9c, 0x10, 0xfb, - 0x8d, 0x02, 0x7b, 0xe6, 0xe4, 0x41, 0x55, 0xf4, 0xf0, 0xe0, 0x06, 0x2b, 0x06, 0x07, 0x1f, 0x40, - 0x02, 0xa8, 0xd1, 0xfe, 0xf0, 0x8a, 0xf9, 0xa8, 0xb1, 0xfb, 0xc7, 0x84, 0x02, 0xb4, 0x73, 0xfd, - 0x25, 0xae, 0x02, 0x07, 0xa2, 0x00, 0xf1, 0xe1, 0xfd, 0x6e, 0x0e, 0x02, 0x01, 0x81, 0xff, 0x22, - 0x36, 0x00, 0x13, 0xad, 0x01, 0x34, 0xf6, 0xff, 0x41, 0x21, 0xff, 0x34, 0xd2, 0x00, 0xed, 0x2c, - 0xfe, 0x21, 0xbf, 0xfe, 0x40, 0x33, 0x00, 0xd8, 0xc2, 0xfe, 0xa6, 0x6c, 0x00, 0xfb, 0x50, 0x01, - 0x16, 0xef, 0x01, 0xa7, 0x2a, 0x00, 0x37, 0x64, 0x1e, 0x97, 0x36, 0x23, 0x98, 0x14, 0x11, 0x24, - 0x2f, 0x04, 0x4f, 0x42, 0xea, 0x4e, 0x25, 0xf5, 0xbf, 0x08, 0x05, 0x9c, 0x50, 0x05, 0x1f, 0x76, - 0x02, 0x68, 0xee, 0xff, 0x32, 0x0e, 0xfb, 0x07, 0x19, 0xfc, 0xd9, 0xe7, 0x01, 0xe2, 0x39, 0xfe, - 0xaf, 0xe3, 0x01, 0xcf, 0xd7, 0x00, 0x49, 0x5f, 0xfe, 0x24, 0xc6, 0x01, 0x15, 0xfa, 0xff, 0xf4, - 0x5a, 0x00, 0xbe, 0xce, 0x01, 0x4d, 0xc3, 0x00, 0xc8, 0xf7, 0xff, 0xc5, 0x09, 0x01, 0x8d, 0x87, - 0xfe, 0x92, 0x48, 0xfe, 0xc2, 0xa6, 0xff, 0xac, 0x99, 0xfe, 0xb0, 0x8e, 0xff, 0xa6, 0x10, 0x01, - 0x5d, 0x22, 0x02, 0x85, 0x1c, 0x00, 0x11, 0x5a, 0x1a, 0x07, 0x93, 0x20, 0x32, 0x92, 0x10, 0x2a, - 0xb9, 0x04, 0x48, 0x9b, 0xee, 0xa3, 0xa9, 0xf6, 0x50, 0xbb, 0x03, 0xc5, 0x5d, 0x04, 0x2a, 0xd4, - 0x02, 0x99, 0x8c, 0x00, 0xee, 0x82, 0xfc, 0x12, 0xce, 0xfc, 0x0a, 0xac, 0x01, 0x96, 0xac, 0xfe, - 0xa5, 0xad, 0x01, 0x88, 0x39, 0x01, 0xe8, 0xe7, 0xfe, 0x60, 0xcc, 0x01, 0x44, 0x65, 0x00, 0x0f, - 0x4f, 0x01, 0xfb, 0x9e, 0x02, 0xdc, 0x48, 0x01, 0x53, 0x0e, 0x00, 0x7d, 0xa9, 0x00, 0x80, 0x9a, - 0xfe, 0x08, 0x01, 0xfe, 0x7e, 0x31, 0xff, 0x95, 0x7a, 0xfe, 0xf2, 0x64, 0xff, 0x74, 0x40, 0x01, - 0x04, 0x47, 0x02, 0x81, 0x20, 0x00, 0x68, 0x62, 0x17, 0x85, 0xf1, 0x1d, 0x3a, 0x1c, 0x10, 0xdd, - 0x91, 0x04, 0x96, 0x4c, 0xf1, 0x7f, 0x01, 0xf8, 0xa4, 0xe7, 0x02, 0x69, 0x96, 0x03, 0x4b, 0xe0, - 0x02, 0x76, 0x04, 0x01, 0xf3, 0x91, 0xfd, 0x0e, 0x61, 0xfd, 0x8d, 0x1c, 0x01, 0xb4, 0xfb, 0xfe, - 0x69, 0xb8, 0x01, 0x3d, 0x28, 0x01, 0xe5, 0x32, 0xff, 0x0d, 0x33, 0x02, 0x69, 0x58, 0x01, 0xd0, - 0x91, 0x01, 0x5c, 0x1f, 0x02, 0xa4, 0xaa, 0x00, 0xfa, 0x95, 0xff, 0x93, 0x45, 0x00, 0x2d, 0x46, - 0xfe, 0x34, 0xac, 0xfd, 0xde, 0x03, 0xff, 0xfa, 0x4f, 0xfe, 0x20, 0xef, 0xfe, 0x28, 0x4d, 0x01, - 0x62, 0xf7, 0x01, 0xa8, 0xb3, 0xff, 0x59, 0x5a, 0x15, 0x4a, 0x5d, 0x1c, 0xb6, 0x0e, 0x0f, 0x48, - 0xfc, 0x03, 0x13, 0xdb, 0xf3, 0xc2, 0x5e, 0xf9, 0x0e, 0x9c, 0x02, 0xc4, 0x69, 0x03, 0x93, 0x35, - 0x03, 0x92, 0x72, 0x01, 0x9a, 0x93, 0xfe, 0x5f, 0x19, 0xfe, 0xde, 0xf5, 0x00, 0x87, 0x7c, 0xff, - 0x60, 0xd8, 0x01, 0x0b, 0xdb, 0x01, 0xa3, 0x14, 0x00, 0xb2, 0x36, 0x02, 0xf9, 0x52, 0x01, 0x5a, - 0x1f, 0x01, 0xe5, 0x70, 0x01, 0x45, 0x77, 0x00, 0x05, 0x69, 0xff, 0x58, 0x0c, 0x00, 0xe0, 0xbd, - 0xfe, 0xbe, 0xac, 0xfd, 0x18, 0x9b, 0xfe, 0x2d, 0x62, 0xfe, 0xcb, 0x1c, 0xff, 0xba, 0x0e, 0x01, - 0xa7, 0x5b, 0x02, 0xef, 0x8a, 0x00, 0x46, 0x02, 0x14, 0xd3, 0x45, 0x1b, 0x51, 0xde, 0x0d, 0x5a, - 0x25, 0x03, 0xef, 0xfa, 0xf5, 0x38, 0x8e, 0xfa, 0x6a, 0xca, 0x02, 0x7d, 0xb5, 0x03, 0xf0, 0x7c, - 0x03, 0xd2, 0xd0, 0x01, 0x26, 0x56, 0xff, 0xb8, 0xdb, 0xfe, 0x8e, 0xeb, 0x00, 0x38, 0x53, 0x00, - 0x6f, 0x77, 0x02, 0x2a, 0xc0, 0x01, 0xa9, 0xd0, 0xff, 0x6f, 0x57, 0x01, 0x2d, 0x36, 0x01, 0xcb, - 0xf1, 0x00, 0x70, 0xc7, 0x00, 0xfe, 0x85, 0x00, 0xf7, 0xb3, 0xff, 0xac, 0xf7, 0xff, 0xf8, 0xbb, - 0xfe, 0x80, 0xc3, 0xfd, 0x4c, 0x9f, 0xfe, 0xd4, 0x24, 0xfe, 0xf4, 0xd1, 0xff, 0xe6, 0xee, 0x01, - 0xae, 0x6b, 0x01, 0x1d, 0x10, 0x00, 0xbb, 0xf8, 0x12, 0x1d, 0xba, 0x1a, 0xb5, 0xb8, 0x0c, 0x32, - 0x13, 0x02, 0x15, 0xcc, 0xf7, 0xa7, 0xaf, 0xfb, 0xae, 0x47, 0x03, 0xda, 0x46, 0x04, 0x6f, 0x74, - 0x03, 0xae, 0x42, 0x02, 0xe4, 0xb3, 0xff, 0xe0, 0x86, 0xff, 0x6d, 0x92, 0x01, 0x67, 0x19, 0x00, - 0xaf, 0xc5, 0x01, 0xb0, 0x42, 0x01, 0x1e, 0x68, 0xff, 0xb6, 0x80, 0x00, 0xcf, 0x16, 0x01, 0xb7, - 0x0b, 0x01, 0x7e, 0x74, 0x00, 0xa0, 0x9a, 0x00, 0x2a, 0xc2, 0xff, 0x1b, 0x8b, 0xff, 0x88, 0x3a, - 0xff, 0x51, 0x04, 0xfe, 0x87, 0xe3, 0xfd, 0x41, 0xad, 0xff, 0xd0, 0x4c, 0x00, 0x0b, 0x17, 0x00, - 0x89, 0xb8, 0x00, 0xd5, 0x7e, 0x00, 0x04, 0x4e, 0x12, 0xb5, 0xa0, 0x1a, 0x2f, 0xd4, 0x0b, 0xe6, - 0x7c, 0x01, 0x1a, 0x5f, 0xf9, 0xba, 0xe1, 0xfc, 0x96, 0xd9, 0x03, 0x7a, 0x17, 0x05, 0xad, 0x70, - 0x03, 0xf7, 0x8e, 0x02, 0xff, 0xc2, 0x00, 0x80, 0xfc, 0xfe, 0xb8, 0x46, 0x01, 0xaa, 0xf0, 0xff, - 0x0b, 0x26, 0x01, 0xf3, 0x39, 0x01, 0xb6, 0x27, 0xff, 0xe5, 0x04, 0x00, 0x09, 0xf5, 0x00, 0x18, - 0xac, 0x01, 0xac, 0x59, 0x00, 0x85, 0x3c, 0x00, 0x01, 0x45, 0x00, 0x21, 0x16, 0x00, 0xa6, 0xcf, - 0xfe, 0xdf, 0xb7, 0xfe, 0xf2, 0x9e, 0xff, 0xfd, 0x7f, 0xfe, 0x20, 0x53, 0xff, 0x81, 0x45, 0x00, - 0xf2, 0x5b, 0x00, 0x2c, 0x9a, 0x00, 0x32, 0x15, 0x12, 0x30, 0x7c, 0x1a, 0x3f, 0x49, 0x0b, 0xf4, - 0x67, 0x01, 0xc5, 0x9e, 0xfa, 0xb6, 0x86, 0xfd, 0x70, 0x07, 0x04, 0x43, 0x45, 0x05, 0xf1, 0xf1, - 0x03, 0x04, 0x5a, 0x02, 0x06, 0x9d, 0x00, 0x0b, 0x60, 0xfe, 0x53, 0x34, 0x00, 0x3c, 0x5d, 0x00, - 0x44, 0xd0, 0x00, 0xfd, 0xfd, 0x00, 0x73, 0xf7, 0xfe, 0x99, 0xa1, 0xff, 0x72, 0x2c, 0x01, 0x85, - 0x3c, 0x01, 0x36, 0x5d, 0x00, 0x38, 0x77, 0x00, 0x29, 0x99, 0x00, 0x30, 0x91, 0xff, 0xe6, 0xc3, - 0xff, 0x70, 0x54, 0x00, 0x75, 0xd3, 0xfd, 0x94, 0xc5, 0xfd, 0x89, 0x76, 0xff, 0xf1, 0x29, 0x00, - 0xd4, 0x1c, 0x00, 0x03, 0x41, 0x00, 0x97, 0xb6, 0x11, 0x95, 0xb3, 0x1a, 0x24, 0xb9, 0x0b, 0xa2, - 0xb9, 0x01, 0x80, 0x89, 0xfb, 0x47, 0x62, 0xfd, 0x22, 0x86, 0x03, 0xaf, 0x24, 0x05, 0x9d, 0x9c, - 0x03, 0x78, 0x8f, 0x02, 0xfa, 0x68, 0x00, 0x31, 0x16, 0xfe, 0x98, 0xdd, 0xff, 0xbf, 0xbb, 0xff, - 0x90, 0xe8, 0x00, 0x38, 0xf0, 0x00, 0xe8, 0x3e, 0xff, 0x01, 0x7d, 0xff, 0x2e, 0xdb, 0x00, 0xc7, - 0x20, 0x01, 0x7c, 0x04, 0x00, 0x3c, 0x23, 0x01, 0x0d, 0x0b, 0x00, 0xf1, 0x56, 0x00, 0x12, 0xae, - 0x01, 0x2c, 0x49, 0xfe, 0x6a, 0x52, 0xfd, 0x62, 0x9c, 0xfe, 0xed, 0xc4, 0xfe, 0x34, 0xd5, 0xff, - 0x60, 0xa8, 0x00, 0xfd, 0xe8, 0xff, 0xa1, 0xd1, 0x11, 0xbd, 0x8d, 0x1b, 0xe1, 0x45, 0x0c, 0xe6, - 0x8d, 0x01, 0xc2, 0xbd, 0xfb, 0x49, 0x89, 0xfd, 0xac, 0xb8, 0x02, 0x6e, 0x53, 0x04, 0x3c, 0x0e, - 0x03, 0xa2, 0xf8, 0x01, 0x67, 0x2f, 0x01, 0x7a, 0x77, 0xfe, 0x3a, 0x2e, 0xff, 0xfc, 0xc7, 0xff, - 0x1e, 0x4f, 0x00, 0x38, 0xd2, 0x00, 0xd6, 0xe5, 0xff, 0x30, 0xe4, 0xff, 0x45, 0x83, 0x00, 0x5c, - 0x61, 0x00, 0x3c, 0xa3, 0x00, 0x55, 0x5f, 0x00, 0x9b, 0x0a, 0x00, 0x96, 0xc9, 0x02, 0x10, 0x62, - 0x00, 0x11, 0x28, 0xfd, 0xdc, 0x47, 0xfe, 0xc1, 0x7a, 0xfe, 0xe7, 0xa9, 0xfe, 0x7f, 0x06, 0x00, - 0x56, 0xa8, 0x00, 0x60, 0xea, 0xfe, 0x1d, 0x14, 0x12, 0x74, 0xd8, 0x1c, 0xad, 0x09, 0x0d, 0xb4, - 0xae, 0x00, 0xe2, 0x93, 0xfb, 0x54, 0x87, 0xfd, 0xf9, 0x90, 0x02, 0xf2, 0x4a, 0x04, 0xcf, 0xd3, - 0x01, 0xf3, 0x31, 0x01, 0xce, 0x14, 0x01, 0x7c, 0x74, 0xfe, 0x0e, 0xf4, 0xff, 0x25, 0xc1, 0xff, - 0x3c, 0x29, 0x00, 0xd3, 0xe0, 0x00, 0xa7, 0x98, 0xff, 0xe8, 0x51, 0x00, 0x08, 0xd5, 0x00, 0x1e, - 0x41, 0x00, 0xfa, 0x3c, 0x00, 0xf3, 0xd7, 0xff, 0x56, 0xff, 0x00, 0xa9, 0x2e, 0x03, 0x10, 0x4d, - 0xff, 0x0f, 0x8f, 0xfd, 0xdc, 0x8d, 0xfe, 0x9f, 0x59, 0xfe, 0xfa, 0x3a, 0xff, 0x15, 0x6d, 0x00, - 0xe5, 0xf5, 0xff, 0x91, 0x64, 0xfe, 0x7c, 0x09, 0x12, 0xe9, 0x7f, 0x1e, 0x8d, 0x0b, 0x0e, 0xaa, - 0xc0, 0xff, 0xa0, 0xfc, 0xfa, 0x05, 0xda, 0xfc, 0x97, 0xf7, 0x02, 0xd0, 0xf4, 0x04, 0x0e, 0x57, - 0x01, 0xf4, 0x65, 0x00, 0xd1, 0x09, 0x00, 0x64, 0xca, 0xfd, 0xc3, 0x90, 0xff, 0x2f, 0x5a, 0x00, - 0x74, 0x20, 0x01, 0x51, 0xce, 0x00, 0xc8, 0x9a, 0xff, 0x9a, 0x23, 0x00, 0x4b, 0x67, 0x00, 0xd4, - 0x95, 0x00, 0xd8, 0x8c, 0x00, 0x31, 0x54, 0xff, 0x5b, 0xdd, 0x00, 0x58, 0x6d, 0x03, 0xf7, 0xb8, - 0xfe, 0x35, 0x9a, 0xfd, 0xdb, 0x0b, 0xff, 0x47, 0x42, 0xfe, 0x60, 0xd0, 0xff, 0x8e, 0xc5, 0x00, - 0xe9, 0x5c, 0xff, 0xc8, 0x5e, 0xfe, 0xfe, 0x34, 0x12, 0xff, 0xf7, 0x1f, 0x83, 0x87, 0x0f, 0x57, - 0xea, 0xfe, 0xf1, 0xd1, 0xf9, 0xa3, 0x48, 0xfc, 0xd0, 0x72, 0x03, 0x8b, 0xd2, 0x05, 0x13, 0x67, - 0x01, 0xd3, 0x0f, 0x00, 0x3e, 0x79, 0xff, 0xbc, 0x18, 0xfd, 0x57, 0x64, 0xfe, 0x13, 0x07, 0x00, - 0xe0, 0x5e, 0x01, 0x2c, 0x67, 0x01, 0x49, 0x64, 0x00, 0xce, 0x28, 0x00, 0xf6, 0x42, 0x00, 0xd5, - 0x37, 0x00, 0xad, 0xb7, 0x00, 0x7a, 0x70, 0xff, 0x86, 0x9d, 0x00, 0x48, 0x6c, 0x03, 0x7c, 0x79, - 0xfe, 0x17, 0x81, 0xfd, 0xd6, 0x3d, 0xff, 0xcb, 0x61, 0xfe, 0x2b, 0x59, 0x00, 0x0f, 0x11, 0x01, - 0x0f, 0x5f, 0xff, 0xb2, 0x5b, 0xfe, 0xf6, 0x76, 0x12, 0x3f, 0xdf, 0x21, 0xb6, 0xcd, 0x10, 0xd9, - 0x48, 0xfe, 0xbd, 0x88, 0xf8, 0x79, 0x47, 0xfb, 0x3b, 0x34, 0x04, 0xf1, 0x83, 0x06, 0xb5, 0x8c, - 0x01, 0xe0, 0xc0, 0xff, 0xd9, 0x30, 0xff, 0x57, 0xf9, 0xfc, 0xd6, 0xbe, 0xfd, 0xb1, 0x39, 0xff, - 0x71, 0xeb, 0x00, 0x40, 0x1f, 0x01, 0x52, 0x3d, 0x00, 0xc7, 0xbe, 0x00, 0xad, 0x03, 0x01, 0xec, - 0x27, 0x00, 0x62, 0x68, 0x00, 0xc7, 0xd5, 0xff, 0x40, 0x96, 0xff, 0xbb, 0x1a, 0x03, 0x77, 0xb3, - 0xff, 0x88, 0xb8, 0xfc, 0x58, 0xa6, 0xfe, 0x3c, 0xcc, 0xfe, 0xad, 0x94, 0x00, 0x30, 0x1e, 0x01, - 0xa7, 0xa8, 0xff, 0xfb, 0xa2, 0xfe, 0xd8, 0x05, 0x13, 0x75, 0xf2, 0x23, 0x90, 0x87, 0x12, 0x5b, - 0xfa, 0xfc, 0x9d, 0xaa, 0xf6, 0x47, 0x37, 0xfb, 0x51, 0xa9, 0x04, 0x33, 0x6e, 0x07, 0x8f, 0xb0, - 0x01, 0x11, 0xa2, 0xfe, 0xb9, 0x6a, 0xff, 0x65, 0x1d, 0xfd, 0xe7, 0x25, 0xfd, 0xae, 0x1c, 0xff, - 0xa3, 0x53, 0x00, 0x08, 0xa6, 0x00, 0x16, 0x8f, 0xff, 0xa4, 0x09, 0x00, 0x90, 0x7f, 0x01, 0x44, - 0x5f, 0x00, 0x62, 0x98, 0x00, 0x55, 0xc3, 0x00, 0xa2, 0x78, 0xfe, 0xf1, 0x0f, 0x02, 0x91, 0x0f, - 0x01, 0xf3, 0x9a, 0xfc, 0x71, 0xf7, 0xfd, 0x3d, 0xe9, 0xfe, 0x6a, 0x35, 0x00, 0xa5, 0x3a, 0x01, - 0x16, 0xf4, 0xff, 0x23, 0x90, 0xfe, 0xb1, 0xc5, 0x13, 0xc6, 0x68, 0x26, 0xb8, 0xa7, 0x14, 0x8b, - 0xae, 0xfb, 0xb1, 0x72, 0xf4, 0x1b, 0xdb, 0xfa, 0xc9, 0x35, 0x05, 0xb1, 0x6a, 0x08, 0x90, 0x90, - 0x01, 0x30, 0x8e, 0xfd, 0xf7, 0x7a, 0xff, 0x7d, 0xab, 0xfd, 0x29, 0xc1, 0xfc, 0x4d, 0x0f, 0xff, - 0x9a, 0x18, 0x00, 0xf5, 0x29, 0x00, 0xf9, 0x5d, 0xff, 0x6f, 0x36, 0xff, 0x6c, 0x29, 0x01, 0x30, - 0xba, 0x00, 0xb3, 0xd8, 0xff, 0xa2, 0x4e, 0x01, 0x2e, 0x72, 0xff, 0x16, 0x42, 0x00, 0x8b, 0xc8, - 0x01, 0xa4, 0x47, 0xfe, 0x47, 0xcb, 0xfc, 0x40, 0x09, 0xfe, 0x4b, 0x45, 0x00, 0x48, 0x2d, 0x01, - 0x3c, 0xc2, 0xff, 0x1c, 0xc1, 0xfe, 0x27, 0x1e, 0x14, 0x1a, 0x1a, 0x29, 0x3c, 0xdd, 0x17, 0x9b, - 0x36, 0xfa, 0x61, 0xf7, 0xf1, 0x30, 0x4b, 0xfa, 0x1b, 0x8f, 0x05, 0x57, 0xca, 0x09, 0x8d, 0x68, - 0x01, 0xb5, 0x2e, 0xfc, 0x63, 0x24, 0xff, 0x8b, 0x73, 0xfe, 0x16, 0x94, 0xfc, 0x23, 0xe2, 0xfe, - 0xfa, 0x4e, 0x00, 0xeb, 0xa3, 0xff, 0xb8, 0x0f, 0xff, 0x34, 0xbc, 0xfe, 0x2d, 0xa9, 0x00, 0x22, - 0x2a, 0x01, 0x30, 0x5d, 0xff, 0x9e, 0x4e, 0x00, 0x04, 0x3d, 0x00, 0x4e, 0x8a, 0xff, 0x08, 0x57, - 0x01, 0xf2, 0x90, 0x00, 0xac, 0x39, 0xfd, 0x3f, 0xfa, 0xfc, 0xed, 0x78, 0xff, 0x39, 0xa3, 0x00, - 0x06, 0x08, 0x00, 0xc3, 0xce, 0xfe, 0x5e, 0xaa, 0x14, 0x14, 0x19, 0x2c, 0x2b, 0x5b, 0x1b, 0xa4, - 0x91, 0xf8, 0x1c, 0x01, 0xef, 0xfa, 0xd8, 0xf9, 0xca, 0x26, 0x06, 0xc4, 0x3b, 0x0b, 0x46, 0x3c, - 0x01, 0x2b, 0x7a, 0xfa, 0xc7, 0xbb, 0xfe, 0x78, 0x3e, 0xff, 0xef, 0x7f, 0xfc, 0xe6, 0x95, 0xfe, - 0x1c, 0x94, 0x00, 0xd6, 0x8e, 0xff, 0xba, 0x95, 0xfe, 0x99, 0x71, 0xfe, 0xa5, 0x3b, 0x00, 0x50, - 0x07, 0x01, 0xf3, 0x10, 0x00, 0x69, 0x40, 0xff, 0xb4, 0x8a, 0xff, 0x1d, 0xc8, 0xff, 0xd0, 0xf6, - 0xff, 0x41, 0xa8, 0x01, 0x6a, 0xdd, 0xff, 0x00, 0x96, 0xfc, 0x1d, 0x21, 0xfe, 0xb7, 0x9f, 0x00, - 0xfb, 0x78, 0xff, 0xbc, 0x79, 0xfe, 0x07, 0xa3, 0x17, 0xfa, 0x92, 0x30, 0x2c, 0x83, 0x1b, 0x75, - 0x4c, 0xf5, 0x78, 0x5d, 0xec, 0xbd, 0xc2, 0xf9, 0xc3, 0x27, 0x08, 0x27, 0x41, 0x0c, 0x92, 0xbd, - 0xff, 0xcf, 0xce, 0xf8, 0x71, 0x8c, 0xfe, 0xac, 0xb0, 0xff, 0x95, 0x85, 0xfc, 0xee, 0x4d, 0xfe, - 0x36, 0x9f, 0x00, 0x8c, 0x82, 0xff, 0xf7, 0x07, 0xfe, 0xa4, 0x42, 0xfe, 0xa8, 0xff, 0xff, 0xfd, - 0xb1, 0x00, 0x9b, 0x37, 0x00, 0x7f, 0x31, 0xff, 0xbb, 0x8c, 0xfe, 0x6c, 0x3e, 0xff, 0xfe, 0x8d, - 0xff, 0x27, 0x27, 0x01, 0xed, 0x8e, 0x01, 0x9e, 0x3a, 0xfe, 0x85, 0x1b, 0xfd, 0x9f, 0xbf, 0xff, - 0x14, 0xaa, 0xff, 0x40, 0xde, 0xfd, 0xc3, 0x84, 0x19, 0x1d, 0x70, 0x34, 0x27, 0xb6, 0x1d, 0xa0, - 0xf3, 0xf2, 0x62, 0x13, 0xe9, 0xc6, 0xcd, 0xf9, 0x99, 0x9d, 0x09, 0x9a, 0x25, 0x0d, 0x35, 0x05, - 0xff, 0x65, 0xe9, 0xf6, 0x7c, 0x18, 0xfe, 0x2d, 0xcd, 0x00, 0x88, 0x1e, 0xfc, 0x3b, 0x1a, 0xfe, - 0xc4, 0xe8, 0x00, 0x38, 0x2e, 0xff, 0x75, 0xcd, 0xfd, 0xa8, 0x35, 0xfe, 0x04, 0xab, 0xff, 0xe3, - 0xac, 0x00, 0xde, 0x12, 0x00, 0x8c, 0x39, 0xff, 0x49, 0x7f, 0xfe, 0xa5, 0xe9, 0xfd, 0xf0, 0x7d, - 0xff, 0x70, 0xdd, 0x00, 0xf9, 0xcb, 0x01, 0xc8, 0x6d, 0x00, 0x60, 0x9c, 0xfd, 0x88, 0x34, 0xfe, - 0xa4, 0xb6, 0xff, 0xe4, 0x03, 0xfe, 0xf2, 0x64, 0x1b, 0x3b, 0xf4, 0x37, 0x70, 0x5e, 0x20, 0xb7, - 0x0b, 0xf1, 0x51, 0x49, 0xe5, 0xa7, 0xe2, 0xf9, 0xdd, 0x2d, 0x0b, 0xcf, 0xc6, 0x0d, 0x80, 0x3b, - 0xfe, 0x1d, 0x06, 0xf5, 0x1a, 0x45, 0xfd, 0x95, 0x3f, 0x02, 0x50, 0xef, 0xfb, 0xbd, 0x40, 0xfd, - 0x78, 0x45, 0x01, 0x1a, 0x2c, 0xff, 0x19, 0x4a, 0xfd, 0xef, 0x17, 0xfe, 0x94, 0xc5, 0xff, 0x20, - 0x30, 0x00, 0xcc, 0x43, 0x00, 0xf0, 0xc1, 0xfe, 0x64, 0xc1, 0xfe, 0x1e, 0x56, 0xfd, 0x01, 0x46, - 0xfe, 0x50, 0x43, 0x01, 0xbd, 0xa4, 0x01, 0xf9, 0x3d, 0x01, 0xc2, 0x92, 0xff, 0x0e, 0x90, 0xfd, - 0x50, 0x30, 0xfe, 0xab, 0xab, 0xfe, 0x3d, 0x51, 0x1f, 0xb8, 0x1b, 0x3c, 0x18, 0xca, 0x1f, 0x06, - 0xb8, 0xee, 0x58, 0x9a, 0xe2, 0x3a, 0x22, 0xfa, 0x13, 0xad, 0x0d, 0xc9, 0xe9, 0x0d, 0x8b, 0x3c, - 0xfc, 0xc6, 0xb1, 0xf3, 0x42, 0x0c, 0xfd, 0x1e, 0x0b, 0x03, 0x32, 0x09, 0xfc, 0xed, 0x94, 0xfc, - 0x98, 0x72, 0x01, 0x20, 0xfa, 0xfe, 0xe6, 0x44, 0xfd, 0x2d, 0xca, 0xfd, 0xe6, 0x07, 0x00, 0x7c, - 0x26, 0x00, 0x92, 0xbf, 0xff, 0x5f, 0xd9, 0xfe, 0x6c, 0x79, 0xfe, 0x30, 0x5c, 0xfd, 0xd5, 0x9e, - 0xfd, 0x13, 0xd0, 0x00, 0x7d, 0x2e, 0x02, 0x41, 0x37, 0x01, 0x36, 0xac, 0x00, 0x88, 0x11, 0xff, - 0x17, 0xa0, 0xfc, 0xae, 0xe7, 0xfd, 0xbd, 0xa6, 0x22, 0x6f, 0x7f, 0x3f, 0xf2, 0x91, 0x1f, 0x01, - 0x13, 0xee, 0x0c, 0x31, 0xe0, 0x99, 0x93, 0xf9, 0x4a, 0x15, 0x10, 0xb1, 0xa8, 0x0d, 0x78, 0xc1, - 0xfa, 0x45, 0xbc, 0xf2, 0xd7, 0x38, 0xfc, 0xf5, 0xe1, 0x03, 0xdd, 0x66, 0xfc, 0xd1, 0x9c, 0xfb, - 0xcd, 0x87, 0x01, 0xb2, 0x09, 0xff, 0x0a, 0x04, 0xfd, 0x8f, 0xe7, 0xfd, 0x8a, 0x21, 0x00, 0x4a, - 0x36, 0x00, 0xe7, 0x47, 0xff, 0x56, 0xbb, 0xfe, 0x97, 0x4f, 0xfe, 0x5c, 0x6a, 0xfd, 0xb5, 0xad, - 0xfd, 0x98, 0xd6, 0xff, 0xd4, 0x74, 0x02, 0x98, 0xac, 0x01, 0x7b, 0x85, 0x00, 0xcb, 0xd6, 0x00, - 0x64, 0x0d, 0xfd, 0x04, 0xed, 0xfb, 0x3b, 0x0d, 0x26, 0x82, 0x8d, 0x42, 0xab, 0x0c, 0x1e, 0x63, - 0x1c, 0xee, 0x99, 0x0b, 0xdf, 0x05, 0x29, 0xf8, 0xfa, 0x03, 0x12, 0x13, 0x49, 0x0d, 0x7b, 0x22, - 0xf9, 0xae, 0x1a, 0xf2, 0xd0, 0x40, 0xfb, 0xb7, 0x59, 0x04, 0x49, 0xae, 0xfc, 0x68, 0x9a, 0xfa, - 0x03, 0x2a, 0x01, 0x6e, 0x27, 0xff, 0x17, 0xc6, 0xfc, 0xf7, 0x0a, 0xfe, 0x0b, 0x2e, 0x00, 0x1f, - 0x33, 0x00, 0xc6, 0xe4, 0xfe, 0xd2, 0x16, 0xfe, 0x30, 0x60, 0xfe, 0xb8, 0x19, 0xfd, 0xbf, 0x40, - 0xfe, 0xb6, 0x53, 0xff, 0x25, 0x63, 0x01, 0x51, 0x81, 0x02, 0xd7, 0x4f, 0x00, 0x29, 0x0f, 0x01, - 0xf3, 0xe4, 0xfe, 0x64, 0xb9, 0xfa, 0x3a, 0x31, 0x2c, 0x72, 0x92, 0x45, 0x5c, 0xed, 0x18, 0xc5, - 0x3a, 0xed, 0x53, 0x0a, 0xe0, 0x24, 0xc8, 0xf7, 0x24, 0x6d, 0x13, 0x9c, 0xae, 0x0c, 0xee, 0x00, - 0xf7, 0xec, 0xae, 0xf1, 0x20, 0x58, 0xfb, 0xa1, 0x57, 0x04, 0xdd, 0x8a, 0xfc, 0x9a, 0x33, 0xfa, - 0xe7, 0xb6, 0x00, 0x72, 0x07, 0xff, 0xc5, 0x0c, 0xfd, 0x80, 0x3b, 0xfe, 0x22, 0x75, 0x00, 0x9c, - 0x66, 0x00, 0x6c, 0x47, 0xfe, 0xae, 0xbc, 0xfd, 0xb5, 0x54, 0xfe, 0xf4, 0xe5, 0xfc, 0x86, 0xce, - 0xfe, 0xf6, 0x09, 0x00, 0x9b, 0xe3, 0xff, 0x23, 0x7b, 0x02, 0xd0, 0xeb, 0x00, 0x54, 0x63, 0x00, - 0x4d, 0x72, 0x00, 0xc5, 0x27, 0xfb, 0xc2, 0x7a, 0x33, 0x14, 0x4c, 0x48, 0x6a, 0xa4, 0x11, 0xee, - 0xa9, 0xec, 0x51, 0x53, 0xe2, 0xe5, 0x5d, 0xf8, 0x25, 0xa8, 0x13, 0x2a, 0xf2, 0x0b, 0x8d, 0x8d, - 0xf5, 0xb5, 0xf4, 0xf0, 0x13, 0x21, 0xfc, 0x86, 0xc6, 0x03, 0x2b, 0x9d, 0xfc, 0x73, 0xc3, 0xf9, - 0x4d, 0x68, 0x00, 0x8f, 0xe3, 0xfe, 0xc3, 0x80, 0xfd, 0xb3, 0x95, 0xfe, 0xa8, 0xa5, 0x00, 0x45, - 0xe8, 0x00, 0x8c, 0x5e, 0xfd, 0xbb, 0xee, 0xfd, 0x54, 0x0d, 0xfe, 0x5a, 0xfb, 0xfc, 0x92, 0x3c, - 0xff, 0xad, 0x1f, 0x01, 0x71, 0xd5, 0xfe, 0x83, 0x84, 0x01, 0x7d, 0x98, 0x01, 0x19, 0xde, 0xff, - 0x98, 0x1f, 0x01, 0xc9, 0x62, 0xfc, 0x13, 0xd6, 0x3a, 0x73, 0x2f, 0x4b, 0x59, 0x0c, 0x09, 0xbb, - 0xa5, 0xeb, 0xe5, 0x54, 0xe5, 0x50, 0x59, 0xf9, 0x4e, 0xac, 0x12, 0x0b, 0x28, 0x0b, 0xac, 0xc5, - 0xf4, 0x5a, 0xac, 0xef, 0x69, 0xf5, 0xfc, 0xe9, 0x92, 0x02, 0x7c, 0xe0, 0xfc, 0xdd, 0x55, 0xf9, - 0x7c, 0xf7, 0xff, 0x73, 0xf5, 0xfe, 0xdb, 0xb4, 0xfd, 0xdd, 0xfe, 0xfe, 0x37, 0x79, 0x00, 0x34, - 0x66, 0x01, 0x20, 0x5e, 0xfc, 0x48, 0x6e, 0xfe, 0x6b, 0x9a, 0xfd, 0xff, 0x12, 0xfd, 0x1c, 0xb7, - 0xff, 0xaf, 0x9e, 0x01, 0xbe, 0x46, 0xfe, 0x63, 0xf7, 0xff, 0xf8, 0xca, 0x01, 0xe9, 0xb2, 0xff, - 0xc6, 0x2d, 0x01, 0x75, 0xae, 0xfd, 0xbb, 0x09, 0x44, 0x21, 0xeb, 0x4c, 0xdb, 0x35, 0xff, 0x0f, - 0x51, 0xea, 0x94, 0x74, 0xe8, 0x0e, 0xb2, 0xfb, 0xa8, 0x03, 0x11, 0xea, 0x74, 0x0a, 0x4d, 0xeb, - 0xf3, 0x03, 0x96, 0xee, 0x3c, 0xa7, 0xfd, 0xba, 0x33, 0x01, 0x76, 0x51, 0xfd, 0xf4, 0x4a, 0xf9, - 0x72, 0xee, 0xff, 0xce, 0xe5, 0xfe, 0xe5, 0x31, 0xfe, 0x6a, 0x0f, 0xff, 0xe4, 0x7c, 0x00, 0x67, - 0x98, 0x01, 0x37, 0xd7, 0xfb, 0x7c, 0x0b, 0xff, 0x1e, 0x38, 0xfd, 0x11, 0x73, 0xfd, 0xe7, 0x3d, - 0x00, 0x63, 0x70, 0x01, 0x8d, 0xc0, 0xfd, 0xe6, 0xf2, 0xfe, 0x45, 0x3c, 0x01, 0x3d, 0xe1, 0xff, - 0xae, 0x7d, 0x01, 0x0f, 0xc0, 0xfe, 0x02, 0x9c, 0x4d, 0x6d, 0x09, 0x4e, 0x3d, 0x83, 0xf5, 0x00, - 0xce, 0xe8, 0xa9, 0xd7, 0xea, 0xe9, 0x95, 0xfe, 0x5c, 0x64, 0x0f, 0x01, 0xec, 0x09, 0x8e, 0x0b, - 0xf3, 0xaa, 0x56, 0xed, 0x0d, 0xeb, 0xfd, 0x5f, 0xc5, 0xff, 0x1a, 0x4e, 0xfe, 0xad, 0xd9, 0xf9, - 0x5b, 0xdd, 0xff, 0x28, 0xf1, 0xfe, 0xa3, 0x9a, 0xfe, 0xe7, 0x99, 0xfe, 0x3d, 0xcc, 0x00, 0x3c, - 0xc6, 0x01, 0xee, 0xbd, 0xfb, 0xea, 0x88, 0xff, 0x48, 0xf8, 0xfc, 0x31, 0x0d, 0xfe, 0xae, 0x32, - 0x00, 0x66, 0xb9, 0x00, 0x58, 0x7e, 0xfd, 0xe4, 0x48, 0xfe, 0x55, 0x67, 0x00, 0xcb, 0x78, 0x00, - 0xe7, 0xea, 0x01, 0x45, 0x6a, 0xff, 0x83, 0xf1, 0x55, 0x1c, 0x58, 0x4f, 0x2b, 0xcb, 0xec, 0x04, - 0x82, 0xe7, 0x96, 0xc5, 0xeb, 0x29, 0xa0, 0x01, 0x43, 0x47, 0x0e, 0xb8, 0x5e, 0x09, 0x10, 0x2d, - 0xf2, 0x41, 0xaf, 0xeb, 0x88, 0x0c, 0xfe, 0xea, 0x67, 0xfe, 0x01, 0x79, 0x00, 0xd5, 0x35, 0xfa, - 0xcc, 0xd4, 0xff, 0x05, 0x31, 0xff, 0x3b, 0x18, 0xfe, 0xa4, 0x62, 0xfe, 0xae, 0x47, 0x01, 0x5f, - 0x30, 0x02, 0x6f, 0xba, 0xfb, 0x9a, 0xf9, 0xff, 0x2a, 0xb8, 0xfc, 0x4e, 0xfe, 0xfd, 0x77, 0xc3, - 0xff, 0x69, 0x35, 0x00, 0x91, 0x50, 0xfd, 0x14, 0xf2, 0xfd, 0xb4, 0x1a, 0x00, 0x07, 0xf7, 0x00, - 0xe2, 0x9c, 0x01, 0x66, 0x79, 0x00, 0x5c, 0x3c, 0x5d, 0x06, 0xc0, 0x50, 0xef, 0x9e, 0xe5, 0x5b, - 0x10, 0xe6, 0x8a, 0xcb, 0xea, 0x0d, 0xbc, 0x04, 0xad, 0xff, 0x0d, 0x1e, 0x5f, 0x08, 0x71, 0x2e, - 0xf1, 0x49, 0xd7, 0xe9, 0x2d, 0x56, 0xfe, 0x06, 0xbd, 0xfd, 0x76, 0x4e, 0x03, 0x1b, 0xfe, 0xf9, - 0xd8, 0x6c, 0x00, 0x78, 0xa7, 0xfe, 0x82, 0x4d, 0xfd, 0x48, 0xff, 0xfe, 0x94, 0x93, 0x01, 0xab, - 0xe3, 0x02, 0x20, 0xc0, 0xfb, 0x43, 0x45, 0x00, 0x62, 0x4a, 0xfb, 0x66, 0xc2, 0xfd, 0xb2, 0xb5, - 0xff, 0x5b, 0xa8, 0xff, 0x83, 0x55, 0xfd, 0xd0, 0xbf, 0xfe, 0x44, 0xad, 0xff, 0x4c, 0x8c, 0x00, - 0xce, 0xf4, 0x01, 0x1a, 0x30, 0x01, 0x0f, 0x55, 0x63, 0xde, 0xe4, 0x51, 0x41, 0x99, 0xe0, 0x1c, - 0x4b, 0xe4, 0xbf, 0x52, 0xe8, 0xff, 0x52, 0x07, 0x52, 0x6e, 0x0e, 0x51, 0xe5, 0x06, 0x7b, 0xcd, - 0xef, 0x85, 0xf3, 0xe8, 0x09, 0x2d, 0xff, 0xf3, 0x59, 0xfd, 0xa3, 0x37, 0x06, 0x81, 0xc1, 0xf9, - 0xad, 0x77, 0x00, 0xb9, 0xdd, 0xfd, 0x7b, 0x5c, 0xfd, 0x69, 0xe4, 0xff, 0xed, 0x8b, 0x01, 0x85, - 0xd7, 0x03, 0x0e, 0x7e, 0xfb, 0x1f, 0xf6, 0xfe, 0x7e, 0x06, 0xfa, 0xc1, 0x3c, 0xfe, 0xaa, 0x33, - 0xff, 0xb1, 0xfd, 0xff, 0x81, 0x20, 0xfe, 0xf1, 0x1e, 0xff, 0x5e, 0xdf, 0xfe, 0x7c, 0xc7, 0x00, - 0x15, 0xe8, 0x01, 0x1b, 0xbb, 0x00, 0xd0, 0x2f, 0x68, 0xb1, 0x09, 0x52, 0xc7, 0x93, 0xdd, 0x98, - 0x1d, 0xe3, 0x01, 0xd1, 0xe4, 0xb5, 0xe2, 0x08, 0x12, 0x7a, 0x0f, 0xd6, 0x93, 0x04, 0xca, 0xb9, - 0xee, 0x55, 0x8e, 0xea, 0x66, 0xff, 0xfe, 0xd4, 0xaa, 0xfd, 0xbc, 0xd2, 0x08, 0xcb, 0xe3, 0xf8, - 0xcc, 0x09, 0x00, 0x15, 0x1e, 0xfe, 0xfb, 0x14, 0xfe, 0xdc, 0x5b, 0x00, 0x32, 0xb2, 0x01, 0x70, - 0x80, 0x03, 0x17, 0x29, 0xfa, 0x3a, 0x42, 0xfe, 0x83, 0x80, 0xf9, 0xf9, 0x38, 0xfe, 0xf1, 0x23, - 0x00, 0x29, 0xaf, 0x00, 0x29, 0x01, 0xfe, 0xfd, 0x6c, 0xff, 0xd1, 0x1b, 0xff, 0x8f, 0xef, 0xff, - 0x28, 0x5f, 0x01, 0x03, 0x5f, 0x01, 0xd1, 0x71, 0x6a, 0x70, 0x53, 0x52, 0x5d, 0xc9, 0xdb, 0x57, - 0xaa, 0xe3, 0x05, 0x10, 0xe0, 0x83, 0x7f, 0x09, 0xac, 0xdf, 0x10, 0x9d, 0xbd, 0x01, 0xa5, 0xe7, - 0xef, 0x63, 0x39, 0xec, 0x97, 0xeb, 0xfe, 0x84, 0x31, 0xfe, 0x79, 0x40, 0x0a, 0xfe, 0xaf, 0xf7, - 0x45, 0xff, 0xff, 0xac, 0xc0, 0xff, 0x3f, 0x2c, 0xfe, 0x58, 0xa7, 0x00, 0x00, 0xd2, 0xff, 0xb6, - 0x93, 0x02, 0x96, 0x27, 0xfa, 0x07, 0xbf, 0xfd, 0x93, 0x43, 0xf9, 0x36, 0x9d, 0xff, 0x18, 0x2c, - 0x01, 0x2b, 0xe7, 0xff, 0x76, 0xd5, 0xfe, 0x41, 0xb8, 0xff, 0x94, 0x64, 0xfe, 0xb5, 0x51, 0xff, - 0x39, 0xb1, 0x01, 0x85, 0x2f, 0x01, 0x81, 0xfe, 0x6c, 0x95, 0x8a, 0x4f, 0xe4, 0x3e, 0xdd, 0x4c, - 0xd1, 0xe3, 0x1b, 0x48, 0xd9, 0x57, 0x6f, 0x09, 0x76, 0x66, 0x12, 0x4b, 0x8d, 0x01, 0x90, 0x69, - 0xf0, 0xf7, 0xec, 0xee, 0x53, 0x11, 0xfe, 0xa8, 0x0f, 0xfe, 0x1e, 0x2a, 0x0b, 0x71, 0x2f, 0xf7, - 0xc5, 0x6c, 0x01, 0x0c, 0xd4, 0x00, 0xdc, 0x59, 0xfd, 0xd8, 0xa7, 0xfe, 0x71, 0x24, 0xff, 0x18, - 0x2c, 0x02, 0x21, 0x7c, 0xfa, 0xce, 0xea, 0xfd, 0xd1, 0x01, 0xfa, 0x79, 0x3e, 0x00, 0x58, 0xe8, - 0x00, 0x7c, 0x0d, 0x00, 0xa3, 0x15, 0xff, 0xe5, 0x7b, 0xff, 0x9d, 0x6f, 0xfe, 0xe0, 0xf3, 0xfe, - 0xef, 0x9c, 0x01, 0x70, 0x0c, 0x01, 0x11, 0xda, 0x6b, 0x90, 0x49, 0x4e, 0xd3, 0xb4, 0xdf, 0xa3, - 0xb1, 0xe4, 0x3d, 0xb2, 0xd1, 0xd3, 0x2b, 0x08, 0x2b, 0x67, 0x16, 0xb5, 0xdb, 0x00, 0x46, 0x9e, - 0xf1, 0xe1, 0xd4, 0xf1, 0xde, 0x4c, 0xfc, 0x7b, 0x0d, 0xfd, 0xb9, 0x2c, 0x0d, 0x5e, 0x9a, 0xf7, - 0x9c, 0xf3, 0x01, 0x0d, 0x85, 0x00, 0x74, 0x6d, 0xfa, 0x9c, 0xfe, 0xfe, 0x18, 0xb8, 0xfe, 0xd6, - 0xcb, 0x01, 0x85, 0xf9, 0xfb, 0x3d, 0x82, 0xfe, 0x80, 0xe1, 0xf9, 0xc9, 0x69, 0x00, 0xb3, 0xd7, - 0x00, 0x7b, 0xa7, 0xff, 0x48, 0x95, 0xff, 0x2a, 0x4a, 0xff, 0xaa, 0x8c, 0xfe, 0xbe, 0x6e, 0xfe, - 0xa7, 0xf7, 0x01, 0x8e, 0xb0, 0x00, 0xbb, 0xe6, 0x6b, 0x3f, 0x45, 0x48, 0xd2, 0x77, 0xe3, 0x04, - 0x98, 0xe5, 0x46, 0x0e, 0xcb, 0x21, 0x01, 0x0a, 0x00, 0x56, 0x18, 0xa4, 0x8d, 0x00, 0x3a, 0x1d, - 0xf3, 0x23, 0x5c, 0xf4, 0x8a, 0xa3, 0xf9, 0x24, 0x6f, 0xfe, 0xb8, 0xb4, 0x0e, 0x99, 0x64, 0xf6, - 0x61, 0x03, 0x02, 0xc5, 0x4f, 0xfe, 0x68, 0x11, 0xfa, 0x12, 0x05, 0x00, 0x1a, 0x27, 0xfe, 0x4a, - 0x58, 0x02, 0xa3, 0xb1, 0xfd, 0xb0, 0xd0, 0xfd, 0x8e, 0xfd, 0xf9, 0x0f, 0xa2, 0x00, 0x73, 0x6e, - 0x00, 0x90, 0xa4, 0xff, 0xc1, 0xa4, 0xff, 0x87, 0x60, 0xff, 0x88, 0x98, 0xfe, 0xfc, 0x56, 0xfe, - 0xcd, 0x46, 0x02, 0x50, 0xf7, 0xff, 0x9c, 0x59, 0x68, 0xa9, 0xa4, 0x43, 0xc1, 0x7c, 0xe7, 0x7c, - 0x5b, 0xe7, 0xc3, 0xec, 0xc7, 0x08, 0x18, 0x0a, 0xb4, 0x71, 0x19, 0x72, 0xab, 0x01, 0xc0, 0xcb, - 0xf3, 0xb7, 0x64, 0xf6, 0x67, 0x2b, 0xf9, 0xdf, 0xb2, 0xfe, 0x3d, 0xa8, 0x0e, 0x43, 0x36, 0xf5, - 0xb3, 0xb1, 0x00, 0xda, 0x74, 0xfe, 0x56, 0xbd, 0xfa, 0x7b, 0x3b, 0x00, 0x11, 0x04, 0xff, 0xd7, - 0xb9, 0x02, 0x72, 0x0a, 0xfe, 0xaa, 0x56, 0xfd, 0xfe, 0x97, 0xfa, 0x8d, 0xd3, 0x00, 0x69, 0x8b, - 0xff, 0x9b, 0xce, 0xff, 0xf1, 0xea, 0xff, 0x62, 0x75, 0xff, 0xc5, 0xda, 0xfe, 0x81, 0x24, 0xfe, - 0x46, 0x75, 0x02, 0x41, 0xe0, 0xff, 0x27, 0xc2, 0x60, 0x79, 0x90, 0x3f, 0xe8, 0x0a, 0xec, 0xa6, - 0x61, 0xeb, 0xe9, 0xc8, 0xc7, 0x47, 0x1e, 0x08, 0xa2, 0x1a, 0x1a, 0xa8, 0xe7, 0x01, 0xf0, 0xc9, - 0xf5, 0xf5, 0x8b, 0xf8, 0x04, 0xa1, 0xf7, 0xe9, 0x93, 0xfe, 0xcc, 0xa7, 0x0d, 0xdd, 0xb5, 0xf3, - 0x47, 0x31, 0x01, 0x8b, 0x22, 0xff, 0xee, 0x77, 0xfa, 0x7a, 0x3f, 0x02, 0xfe, 0xd7, 0xfe, 0xf0, - 0xf2, 0x01, 0x7c, 0x7e, 0xfe, 0x8f, 0x79, 0xfd, 0x3b, 0x7f, 0xfb, 0xb3, 0xa5, 0xff, 0xc0, 0x91, - 0xff, 0x5d, 0x04, 0x00, 0x2b, 0xee, 0xff, 0xf1, 0xa9, 0xff, 0x21, 0xbc, 0xfe, 0xe8, 0x3e, 0xfe, - 0x61, 0xcb, 0x02, 0xe8, 0x50, 0xff, 0x67, 0x0f, 0x58, 0xa4, 0x5d, 0x39, 0x1d, 0x08, 0xf3, 0xa0, - 0xbb, 0xef, 0x0a, 0x1e, 0xca, 0x79, 0x95, 0x05, 0x24, 0xb2, 0x17, 0x7c, 0xa7, 0x04, 0x69, 0xb5, - 0xf7, 0xb6, 0xa0, 0xf8, 0xb5, 0x3e, 0xf7, 0xa3, 0x07, 0xfe, 0x16, 0x57, 0x0b, 0x63, 0xfa, 0xf4, - 0x79, 0x62, 0x01, 0xda, 0xef, 0xfe, 0x29, 0x8a, 0xfc, 0xab, 0x82, 0x02, 0x93, 0xfb, 0xfd, 0x54, - 0x83, 0x01, 0x56, 0x9e, 0xff, 0x17, 0x67, 0xfd, 0x55, 0x62, 0xfb, 0x53, 0xbb, 0xff, 0x61, 0x6f, - 0xff, 0x8a, 0xf3, 0xff, 0xe3, 0x16, 0x00, 0x8f, 0x86, 0xff, 0x9e, 0x16, 0xff, 0x84, 0x75, 0xfe, - 0x82, 0x74, 0x02, 0x0b, 0x6e, 0xff, 0x6d, 0xb8, 0x4d, 0x35, 0x84, 0x33, 0xc7, 0x76, 0xfa, 0xe6, - 0xa0, 0xf4, 0xcf, 0x60, 0xce, 0xfd, 0x9e, 0x01, 0xfc, 0x61, 0x16, 0x31, 0x9a, 0x06, 0x7f, 0xdf, - 0xf7, 0x1e, 0x38, 0xfa, 0x35, 0x29, 0xf6, 0xc8, 0x75, 0xfd, 0x74, 0xc6, 0x0a, 0xf4, 0x90, 0xf5, - 0x6f, 0x86, 0x01, 0xe1, 0x29, 0x00, 0x95, 0x72, 0xfd, 0xb7, 0xd8, 0x01, 0xd3, 0x9c, 0xfd, 0x9d, - 0x20, 0x02, 0x54, 0xc7, 0xff, 0xbe, 0xc8, 0xfc, 0xb4, 0xb5, 0xfc, 0x1d, 0x87, 0xff, 0x26, 0x17, - 0xff, 0xc9, 0x21, 0x00, 0x3e, 0xf6, 0xff, 0x7e, 0xc5, 0xff, 0x4c, 0x32, 0xff, 0x0c, 0x63, 0xfe, - 0x2c, 0xdf, 0x02, 0x1f, 0xcd, 0xff, 0x01, 0xc5, 0x3d, 0x01, 0xcf, 0x27, 0x88, 0x16, 0xf3, 0x18, - 0x07, 0xfb, 0x90, 0x42, 0xef, 0x3e, 0x13, 0x0d, 0x93, 0xbb, 0x07, 0xa7, 0xc3, 0xf7, 0xd2, 0x5d, - 0xf8, 0xae, 0xc8, 0x00, 0xc2, 0xdd, 0x00, 0xac, 0xc7, 0xfe, 0x98, 0x48, 0x05, 0x06, 0x72, 0xf7, - 0x2a, 0x37, 0x00, 0x54, 0x8e, 0xff, 0x3d, 0x99, 0xfb, 0x24, 0x94, 0x00, 0x8e, 0x4f, 0xfe, 0xb5, - 0x39, 0x00, 0x96, 0x74, 0xff, 0x3a, 0xf9, 0xfd, 0x89, 0x66, 0xfd, 0x82, 0x22, 0x03, 0x5a, 0xae, - 0xff, 0xd8, 0x0e, 0x00, 0xb5, 0x77, 0x00, 0xcb, 0x60, 0xfd, 0x70, 0xbc, 0xff, 0xcb, 0x1c, 0xfe, - 0x2a, 0x03, 0xff, 0xc1, 0x18, 0x00, 0xf4, 0xe2, 0x34, 0xc1, 0x02, 0x27, 0xe2, 0x7f, 0xf8, 0xa5, - 0xc3, 0xfa, 0xd6, 0x26, 0xf0, 0x93, 0x6a, 0x0a, 0x77, 0x39, 0x09, 0x72, 0x6e, 0xfa, 0xb5, 0x06, - 0xf9, 0xa3, 0x02, 0x00, 0x08, 0xcd, 0xff, 0x1c, 0xce, 0xfe, 0x8d, 0xa8, 0x04, 0xb4, 0xeb, 0xf8, - 0xcc, 0xde, 0xff, 0x3f, 0x21, 0x00, 0xa2, 0xa0, 0xfc, 0x1c, 0x3c, 0x00, 0x36, 0x03, 0xff, 0x68, - 0x42, 0x00, 0x0d, 0x75, 0xff, 0x39, 0x1e, 0xfe, 0xcd, 0x41, 0xfd, 0xd5, 0x77, 0x02, 0xd5, 0x1f, - 0x00, 0x2c, 0x0f, 0x00, 0x11, 0xfe, 0x00, 0x17, 0x13, 0xfe, 0x29, 0x7f, 0xff, 0x44, 0x78, 0xfe, - 0x57, 0x04, 0xff, 0xec, 0xbc, 0xff, 0x72, 0x77, 0x2d, 0x18, 0x67, 0x25, 0xa7, 0x4a, 0xfd, 0x77, - 0x04, 0xfb, 0xea, 0xd7, 0xf1, 0x50, 0x51, 0x08, 0xa1, 0xac, 0x09, 0x92, 0x82, 0xfc, 0xdf, 0x39, - 0xfa, 0xa5, 0x54, 0xff, 0xd5, 0x2e, 0xff, 0x1e, 0x57, 0xff, 0x6a, 0xe9, 0x03, 0x92, 0x7b, 0xfa, - 0x6b, 0xda, 0xff, 0x53, 0xae, 0x00, 0x5f, 0x99, 0xfd, 0xc3, 0x32, 0x00, 0x8b, 0xb5, 0xff, 0x1d, - 0x60, 0x00, 0x7f, 0xa2, 0xff, 0x2b, 0x7a, 0xfe, 0x96, 0x89, 0xfd, 0xbb, 0xf6, 0x01, 0xb7, 0xb8, - 0x00, 0xed, 0x3a, 0x00, 0x13, 0x08, 0x01, 0x09, 0x9b, 0xfe, 0x41, 0x69, 0xff, 0xdf, 0xd7, 0xfe, - 0x53, 0xea, 0xfe, 0xd1, 0xa0, 0xff, 0x4e, 0x81, 0x27, 0xe3, 0x00, 0x24, 0x60, 0x59, 0x00, 0xc7, - 0x53, 0xfb, 0x8c, 0xa3, 0xf3, 0x75, 0xd5, 0x06, 0x2e, 0x99, 0x09, 0xc8, 0x3b, 0xfe, 0xf3, 0x73, - 0xfb, 0x56, 0xd7, 0xfe, 0x29, 0x2c, 0xff, 0xdb, 0xb4, 0xff, 0x73, 0x3a, 0x03, 0x5b, 0xd6, 0xfb, - 0x09, 0x35, 0x00, 0x42, 0x0e, 0x01, 0xa8, 0x5f, 0xfe, 0xb8, 0x4d, 0x00, 0x86, 0x46, 0x00, 0xef, - 0xa3, 0x00, 0x2e, 0xc1, 0xff, 0xa3, 0x15, 0xff, 0x97, 0x10, 0xfe, 0x3b, 0x8d, 0x01, 0x4c, 0xf4, - 0x00, 0x62, 0x3e, 0x00, 0xae, 0xe3, 0x00, 0x37, 0x03, 0xff, 0xae, 0x66, 0xff, 0x91, 0x01, 0xff, - 0xa1, 0x23, 0xff, 0x24, 0x9e, 0xff, 0x15, 0x0c, 0x23, 0x6f, 0xb2, 0x22, 0xb2, 0xff, 0x01, 0xdd, - 0x3e, 0xfb, 0xe0, 0x5e, 0xf5, 0x63, 0xbd, 0x05, 0xb1, 0x0f, 0x09, 0x0e, 0x7a, 0xff, 0x93, 0x67, - 0xfc, 0xdb, 0xb0, 0xfe, 0x27, 0x49, 0xff, 0xbc, 0xbd, 0xff, 0x7e, 0xa7, 0x02, 0x46, 0x03, 0xfd, - 0xe4, 0x7e, 0x00, 0xd7, 0x1a, 0x01, 0x57, 0xf5, 0xfe, 0x97, 0x61, 0x00, 0xaa, 0x8d, 0x00, 0xe9, - 0xe7, 0x00, 0xf3, 0xe8, 0xff, 0xc5, 0x86, 0xff, 0xbb, 0x53, 0xfe, 0x40, 0xdc, 0x00, 0x24, 0xe3, - 0x00, 0x25, 0x2d, 0x00, 0x64, 0x69, 0x00, 0xe6, 0x35, 0xff, 0x02, 0x70, 0xff, 0xf5, 0x39, 0xff, - 0x47, 0x25, 0xff, 0xe7, 0x1f, 0xff, 0xf6, 0xcf, 0x1f, 0x50, 0x75, 0x21, 0x3f, 0xd4, 0x02, 0xdd, - 0x2f, 0xfb, 0x57, 0x12, 0xf7, 0x95, 0xef, 0x04, 0x8a, 0x68, 0x08, 0xf2, 0x87, 0x00, 0x4f, 0x2e, - 0xfd, 0x46, 0xe1, 0xfe, 0xf2, 0x71, 0xff, 0x04, 0xcd, 0xff, 0x20, 0x81, 0x02, 0xa5, 0xd8, 0xfd, - 0x19, 0xc2, 0x00, 0x7a, 0x2d, 0x01, 0xac, 0x67, 0xff, 0xcb, 0x74, 0x00, 0xd8, 0xdd, 0x00, 0x1f, - 0x18, 0x01, 0xa2, 0xd3, 0xff, 0xf1, 0xc2, 0xff, 0xfb, 0x77, 0xfe, 0x16, 0x2a, 0x00, 0xdf, 0xb2, - 0x00, 0xfd, 0x0f, 0x00, 0x59, 0x0f, 0x00, 0xdb, 0x91, 0xff, 0x64, 0x84, 0xff, 0x61, 0x25, 0xff, - 0x7d, 0x19, 0xff, 0xa0, 0x3a, 0xff, 0x70, 0x5e, 0x1d, 0xec, 0xaf, 0x20, 0xaa, 0x33, 0x03, 0x00, - 0x26, 0xfb, 0x5f, 0x88, 0xf8, 0x8f, 0x5b, 0x04, 0x2c, 0xeb, 0x07, 0xfc, 0x7b, 0x01, 0x06, 0xb3, - 0xfd, 0xba, 0x4c, 0xff, 0xe9, 0x00, 0x00, 0xe8, 0xab, 0xff, 0x03, 0xad, 0x02, 0x18, 0x7a, 0xfe, - 0x7a, 0xd7, 0x00, 0x23, 0x67, 0x01, 0xca, 0xc4, 0xff, 0x45, 0x7d, 0x00, 0x89, 0xd6, 0x00, 0xab, - 0x4c, 0x01, 0xe4, 0xab, 0xff, 0x31, 0xb9, 0xff, 0xb5, 0xb7, 0xfe, 0xec, 0x87, 0xff, 0x97, 0x7d, - 0x00, 0x0f, 0x60, 0x00, 0x67, 0xde, 0xff, 0xe2, 0xbb, 0xff, 0xae, 0x8a, 0xff, 0xd8, 0x5d, 0xff, - 0xa9, 0x3b, 0xff, 0xb3, 0xcc, 0xfe, 0xd9, 0xe2, 0x1b, 0xf5, 0x0e, 0x20, 0xb6, 0x34, 0x03, 0xa2, - 0xfb, 0xfa, 0x7a, 0xd9, 0xf9, 0x75, 0x27, 0x04, 0x03, 0x6f, 0x07, 0x89, 0x20, 0x02, 0x56, 0xf7, - 0xfd, 0x70, 0xaa, 0xff, 0x91, 0xee, 0x00, 0x6b, 0x50, 0xff, 0x14, 0xa6, 0x02, 0xe4, 0x35, 0xff, - 0x36, 0x8f, 0x00, 0x44, 0x98, 0x01, 0x73, 0xeb, 0xff, 0x28, 0x20, 0x00, 0x2a, 0xc2, 0x00, 0xfd, - 0x5b, 0x01, 0x8e, 0x95, 0xff, 0xa6, 0x58, 0xff, 0xf2, 0xdd, 0xfe, 0xf8, 0x7a, 0xff, 0x1f, 0x29, - 0x00, 0xcc, 0x92, 0x00, 0x86, 0xc1, 0xff, 0xb1, 0xaf, 0xff, 0x56, 0xf2, 0xff, 0x32, 0x1d, 0xff, - 0xca, 0x76, 0xff, 0xd4, 0x37, 0x00, 0x64, 0x6c, 0x1a, 0x63, 0x0a, 0x20, 0x0a, 0x6c, 0x03, 0xb5, - 0xee, 0xfa, 0x18, 0x04, 0xfb, 0xeb, 0x1a, 0x04, 0xd0, 0x0e, 0x07, 0x87, 0x4c, 0x02, 0x79, 0x69, - 0xfe, 0x87, 0x83, 0xff, 0x14, 0xe8, 0x01, 0x95, 0x94, 0xff, 0x6f, 0xbf, 0x01, 0x4f, 0x1f, 0x00, - 0xbf, 0x7d, 0x00, 0x4a, 0xe0, 0x00, 0xb4, 0x44, 0x00, 0x5f, 0x06, 0x00, 0xdc, 0x49, 0x00, 0xbd, - 0x53, 0x01, 0x65, 0xcc, 0xff, 0x1c, 0x0d, 0xff, 0xd0, 0xc0, 0xfe, 0x56, 0xff, 0xff, 0x00, 0xbd, - 0xff, 0x90, 0x4a, 0x00, 0x6d, 0x38, 0x00, 0x55, 0xb0, 0xff, 0x42, 0xa2, 0xff, 0x42, 0x31, 0x00, - 0x09, 0x57, 0x00, 0x00, 0x2f, 0xff, 0xbd, 0xd8, 0x19, 0x49, 0xba, 0x1f, 0x97, 0xb7, 0x03, 0x9a, - 0xf9, 0xfa, 0x54, 0x03, 0xfc, 0x4f, 0x5d, 0x04, 0x14, 0xb4, 0x06, 0xa4, 0x14, 0x02, 0x67, 0x4c, - 0xfe, 0x9b, 0xbf, 0xff, 0x46, 0xe1, 0x01, 0xc6, 0x2f, 0x00, 0xb8, 0x8b, 0x01, 0x3f, 0x9f, 0xff, - 0x6a, 0x12, 0x01, 0x9d, 0x68, 0x00, 0x6e, 0xa4, 0xff, 0xb0, 0x74, 0x00, 0x45, 0x24, 0x00, 0xb2, - 0xbb, 0x00, 0xfe, 0xeb, 0xff, 0x22, 0x98, 0xff, 0x2d, 0x76, 0xfe, 0x12, 0xaa, 0xff, 0xc6, 0xf6, - 0xff, 0x09, 0x38, 0x00, 0xf2, 0x01, 0x00, 0xdb, 0x80, 0xff, 0x27, 0xf8, 0x00, 0xd9, 0x9c, 0x00, - 0x7c, 0x47, 0xff, 0xd0, 0x6d, 0xff, 0xa6, 0x6d, 0x19, 0x52, 0x0f, 0x20, 0xef, 0xea, 0x03, 0x64, - 0xed, 0xfa, 0xf2, 0xca, 0xfc, 0xe1, 0x9b, 0x04, 0x75, 0x73, 0x06, 0x50, 0xce, 0x01, 0x4e, 0xcf, - 0xfd, 0xb9, 0x6d, 0xff, 0xb1, 0xfe, 0x01, 0xb3, 0xd3, 0xff, 0xfd, 0xcb, 0x01, 0xbd, 0xd4, 0xff, - 0x1d, 0x54, 0x00, 0xa0, 0xc7, 0x00, 0xe3, 0x56, 0xff, 0x2e, 0xb3, 0xff, 0x72, 0x9b, 0x00, 0x17, - 0x91, 0x00, 0x38, 0x6c, 0xff, 0x50, 0xec, 0xff, 0x8a, 0xde, 0xfe, 0x92, 0xdc, 0xfe, 0x3a, 0xc4, - 0xff, 0x09, 0xa6, 0x00, 0xe7, 0x2d, 0xff, 0x16, 0x5b, 0x00, 0x0a, 0xc9, 0x01, 0x83, 0x6f, 0xff, - 0xba, 0x9d, 0xff, 0x6c, 0x52, 0xff, 0x18, 0xb8, 0x19, 0x4c, 0xc5, 0x20, 0x0d, 0xd4, 0x03, 0x4e, - 0x8f, 0xfa, 0x75, 0x8b, 0xfd, 0x6f, 0x52, 0x05, 0xd0, 0x8e, 0x06, 0xe3, 0x76, 0x01, 0x81, 0x88, - 0xfd, 0x2f, 0xde, 0xfe, 0xcd, 0xaf, 0x01, 0xa5, 0xe0, 0xff, 0xa8, 0x5a, 0x01, 0x28, 0x3d, 0x00, - 0xba, 0xea, 0x00, 0xb9, 0x54, 0x00, 0xec, 0x55, 0xff, 0x42, 0x09, 0x00, 0xed, 0xed, 0xff, 0xe1, - 0xbc, 0x00, 0x76, 0xed, 0xff, 0x9e, 0x97, 0xff, 0x77, 0xde, 0xfe, 0x8a, 0x31, 0xff, 0x6a, 0xe5, - 0xff, 0xab, 0xad, 0xff, 0x91, 0xc5, 0xff, 0x86, 0xba, 0x01, 0xc9, 0x78, 0x00, 0xb1, 0x7a, 0xff, - 0xad, 0x64, 0x00, 0x5f, 0xb8, 0xfe, 0x21, 0x49, 0x1a, 0xf3, 0xe1, 0x21, 0xd5, 0xad, 0x03, 0x1b, - 0x6f, 0xf9, 0x2a, 0xee, 0xfd, 0x87, 0xfa, 0x05, 0xc1, 0xd6, 0x06, 0x2a, 0x63, 0x01, 0x3f, 0xa3, - 0xfc, 0xc6, 0x5e, 0xfe, 0x39, 0x82, 0x01, 0x9f, 0x0c, 0xff, 0x7c, 0xd7, 0x00, 0x9c, 0x3b, 0x00, - 0xba, 0xcc, 0x00, 0xed, 0xd1, 0x00, 0x53, 0x40, 0xff, 0xaf, 0x81, 0xff, 0xb1, 0x48, 0x00, 0x89, - 0x41, 0x00, 0x2d, 0x69, 0xff, 0x76, 0x17, 0x00, 0xdf, 0x7b, 0xfe, 0xf3, 0x16, 0xff, 0x6b, 0x24, - 0x00, 0x2c, 0x2c, 0xff, 0x40, 0x22, 0x00, 0xf0, 0xb1, 0x01, 0xf1, 0xb1, 0xff, 0x45, 0xbf, 0xff, - 0xf6, 0x03, 0x00, 0x0f, 0xc8, 0xfe, 0x66, 0xed, 0x1a, 0x0c, 0x92, 0x23, 0x98, 0xbc, 0x03, 0x00, - 0x38, 0xf8, 0xae, 0x0c, 0xfe, 0xe4, 0x93, 0x06, 0xc5, 0x3a, 0x07, 0x80, 0x78, 0x01, 0x5a, 0x27, - 0xfc, 0xa0, 0xb4, 0xfd, 0x99, 0x8a, 0x01, 0x20, 0xcc, 0xfe, 0x82, 0xf1, 0xff, 0xcf, 0xd4, 0xff, - 0x0a, 0xf0, 0x00, 0x77, 0xac, 0x00, 0x68, 0x51, 0xff, 0xad, 0x0d, 0x00, 0x82, 0x0e, 0x00, 0xa1, - 0x32, 0x00, 0x47, 0x68, 0xff, 0xf3, 0x82, 0xff, 0xa9, 0x50, 0xfe, 0xad, 0x98, 0xff, 0xda, 0x2d, - 0x00, 0xbd, 0xe8, 0xfe, 0x65, 0xa7, 0x00, 0xd9, 0x95, 0x01, 0xad, 0xe8, 0xfe, 0x7a, 0xb6, 0xff, - 0xbc, 0x03, 0x00, 0x7b, 0xca, 0xfe, 0x09, 0xea, 0x1b, 0x3d, 0xac, 0x25, 0x9e, 0xaf, 0x03, 0xb7, - 0xa0, 0xf6, 0x2a, 0x4f, 0xfe, 0xab, 0x37, 0x07, 0xa9, 0x94, 0x07, 0xa7, 0x95, 0x01, 0x3d, 0x72, - 0xfb, 0x83, 0xa1, 0xfd, 0x31, 0xba, 0x01, 0x96, 0x66, 0xfe, 0xcb, 0x72, 0xff, 0xdf, 0x86, 0xff, - 0x54, 0x8c, 0x00, 0x53, 0x7c, 0x00, 0xa2, 0x22, 0xff, 0x08, 0xea, 0xff, 0x79, 0xa2, 0x00, 0xe8, - 0x72, 0x00, 0xc4, 0x0b, 0xff, 0x23, 0x86, 0xff, 0x2e, 0x14, 0xfe, 0xf2, 0x2d, 0xff, 0xa6, 0xab, - 0x00, 0x02, 0x4a, 0xff, 0xf3, 0x65, 0x00, 0x45, 0xd2, 0x01, 0x6e, 0xcf, 0xfe, 0xfd, 0x43, 0xff, - 0xa1, 0x9a, 0xff, 0xd6, 0xea, 0xfe, 0xb7, 0x97, 0x1d, 0x12, 0xb8, 0x27, 0x1b, 0x35, 0x03, 0x9b, - 0x11, 0xf5, 0xe1, 0x85, 0xfe, 0x8d, 0x0e, 0x08, 0xe4, 0xa6, 0x07, 0xc4, 0x41, 0x01, 0x83, 0x9d, - 0xfa, 0x7e, 0x8f, 0xfd, 0x85, 0x58, 0x02, 0x4d, 0x1c, 0xfe, 0x63, 0xd2, 0xfe, 0x87, 0x08, 0xff, - 0x52, 0x8b, 0x00, 0x4f, 0x1e, 0x00, 0x83, 0x69, 0xfe, 0x97, 0xbd, 0xff, 0x9d, 0xa3, 0x00, 0x39, - 0x76, 0x00, 0x07, 0x32, 0xff, 0x76, 0x8d, 0xff, 0x4f, 0xd7, 0xfd, 0x44, 0x26, 0xff, 0xdd, 0x9e, - 0x00, 0xd0, 0x1f, 0xff, 0x11, 0x32, 0x00, 0x49, 0x4d, 0x02, 0x10, 0x10, 0xff, 0x91, 0x6f, 0xfe, - 0x9a, 0x81, 0xff, 0xd9, 0xc9, 0xfe, 0x72, 0xa0, 0x1f, 0x85, 0x0b, 0x2a, 0x7d, 0x48, 0x02, 0xb7, - 0x3f, 0xf3, 0xc8, 0xd5, 0xfe, 0xfa, 0xec, 0x08, 0x32, 0xa1, 0x07, 0x12, 0x93, 0x00, 0xaf, 0xa2, - 0xf9, 0xf9, 0x5b, 0xfd, 0x6c, 0x0d, 0x03, 0xd9, 0xdf, 0xfd, 0x47, 0x12, 0xfe, 0xd1, 0xb2, 0xfe, - 0xc6, 0x36, 0x00, 0x39, 0xb6, 0xff, 0x72, 0xfc, 0xfd, 0xab, 0x17, 0xff, 0xa1, 0x55, 0x00, 0x3f, - 0x3e, 0x00, 0x88, 0xc1, 0xfe, 0x2c, 0xbb, 0xff, 0x16, 0x1a, 0xfe, 0x2b, 0xfb, 0xfe, 0x7e, 0x9a, - 0x00, 0xdd, 0x5e, 0xff, 0xb9, 0xeb, 0xfe, 0x78, 0x14, 0x02, 0x27, 0x78, 0x00, 0xfe, 0xc3, 0xfd, - 0x09, 0xd8, 0xfe, 0x8a, 0xe0, 0xfe, 0x54, 0x94, 0x22, 0xb5, 0xaa, 0x2c, 0xf9, 0xf1, 0x00, 0x26, - 0x8d, 0xf1, 0xcb, 0x7a, 0xff, 0x1d, 0x43, 0x0a, 0xaa, 0x92, 0x07, 0x15, 0xc2, 0xff, 0xb2, 0x9f, - 0xf8, 0x6e, 0xb3, 0xfd, 0xf0, 0x00, 0x04, 0x1b, 0xe2, 0xfd, 0x01, 0x7a, 0xfd, 0x86, 0x77, 0xfe, - 0x41, 0x81, 0x00, 0x35, 0x61, 0xff, 0x8b, 0x79, 0xfd, 0xfe, 0x31, 0xff, 0xf3, 0x26, 0x00, 0xf0, - 0xbc, 0xff, 0x53, 0xa1, 0xfe, 0xa0, 0x82, 0xff, 0x2a, 0xb0, 0xfe, 0xde, 0x90, 0xff, 0x44, 0x72, - 0x00, 0x9a, 0xee, 0xff, 0xbd, 0x77, 0xfe, 0xc9, 0xf4, 0x00, 0x22, 0x7e, 0x01, 0x59, 0x7c, 0xfe, - 0x92, 0x21, 0xfe, 0xfd, 0x1a, 0xff, 0x22, 0xe3, 0x25, 0xe2, 0x12, 0x2f, 0x22, 0x65, 0xff, 0xa9, - 0xe8, 0xef, 0xf4, 0xf9, 0xff, 0x68, 0x98, 0x0b, 0x54, 0x3e, 0x07, 0xe7, 0xac, 0xfe, 0x69, 0x47, - 0xf7, 0x67, 0x15, 0xfe, 0xdd, 0xea, 0x04, 0x15, 0xd0, 0xfd, 0xed, 0xc1, 0xfc, 0x8c, 0x03, 0xfe, - 0x2f, 0x9c, 0x00, 0x54, 0x36, 0xff, 0xee, 0xd9, 0xfc, 0x76, 0xe8, 0xfe, 0xf6, 0x56, 0x00, 0xb3, - 0xe4, 0xfe, 0xcf, 0x5b, 0xfe, 0x20, 0x35, 0xff, 0x17, 0x9e, 0xfe, 0xf4, 0x8a, 0x00, 0x28, 0x4c, - 0x00, 0xd2, 0xf8, 0xff, 0x94, 0xa7, 0xfe, 0x2e, 0x97, 0xff, 0xc0, 0x73, 0x01, 0x00, 0xcd, 0xff, - 0x52, 0x71, 0xfd, 0x3d, 0xda, 0xfe, 0xb8, 0x2f, 0x29, 0xb1, 0xf9, 0x31, 0xeb, 0xe9, 0xfd, 0xb4, - 0x55, 0xee, 0xce, 0x55, 0x00, 0xaa, 0x03, 0x0d, 0x8e, 0x05, 0x07, 0x85, 0x85, 0xfd, 0x9f, 0x2f, - 0xf6, 0xbb, 0x37, 0xfe, 0x96, 0x20, 0x06, 0x6a, 0xb0, 0xfd, 0x3a, 0x3b, 0xfc, 0x20, 0xa9, 0xfd, - 0x8f, 0x9b, 0x00, 0x3a, 0x10, 0xff, 0x1d, 0x92, 0xfc, 0x44, 0x8f, 0xfe, 0x5d, 0x98, 0x00, 0x11, - 0x6e, 0xfe, 0xa0, 0xd8, 0xfd, 0x2c, 0x52, 0xff, 0xef, 0x4d, 0xfe, 0xc8, 0x5e, 0x01, 0x2d, 0x96, - 0x00, 0xff, 0xcd, 0xff, 0x43, 0xe8, 0xfe, 0x67, 0x01, 0xff, 0xe7, 0x56, 0x00, 0x24, 0x35, 0x01, - 0xcb, 0xfd, 0xfd, 0x1b, 0xba, 0xfd, 0x1a, 0xc1, 0x2b, 0x47, 0x35, 0x35, 0xaf, 0x16, 0xfd, 0xfd, - 0x2d, 0xed, 0xc7, 0x31, 0x00, 0x43, 0x27, 0x0e, 0xcd, 0x1a, 0x07, 0x34, 0x59, 0xfc, 0x2e, 0x93, - 0xf5, 0xea, 0xea, 0xfd, 0x9f, 0x4c, 0x07, 0x17, 0x97, 0xfd, 0x92, 0xc6, 0xfb, 0x31, 0x6e, 0xfd, - 0xc9, 0x97, 0x00, 0xb7, 0xdd, 0xfe, 0x3c, 0x4d, 0xfc, 0xbb, 0x63, 0xfe, 0xa8, 0x88, 0x00, 0x64, - 0x84, 0xfe, 0x9d, 0x3b, 0xfd, 0x56, 0x99, 0xff, 0xb4, 0x00, 0xfe, 0xbf, 0xe5, 0x01, 0xcc, 0x15, - 0x01, 0x88, 0xa6, 0xff, 0x4f, 0xfe, 0xfe, 0x77, 0xd4, 0xfe, 0xda, 0x48, 0xff, 0x66, 0x6c, 0x01, - 0x9d, 0xc9, 0xff, 0x90, 0xd7, 0xfc, 0xe2, 0xc2, 0x2e, 0xaa, 0x16, 0x38, 0xf0, 0xf4, 0xfb, 0xcb, - 0x7b, 0xec, 0xeb, 0xb7, 0xff, 0xeb, 0xee, 0x0e, 0x7d, 0x09, 0x07, 0xf1, 0x3a, 0xfb, 0x2f, 0xf5, - 0xf4, 0xd0, 0xaf, 0xfd, 0xe5, 0x16, 0x08, 0xc0, 0x71, 0xfd, 0x82, 0x2f, 0xfb, 0xd1, 0x46, 0xfd, - 0x60, 0x80, 0x00, 0x6d, 0xa9, 0xfe, 0x48, 0xf4, 0xfb, 0xb7, 0x20, 0xfe, 0x6c, 0x55, 0x00, 0xbd, - 0x96, 0xfe, 0x37, 0xdd, 0xfc, 0xd6, 0xce, 0xff, 0x32, 0xf4, 0xfd, 0xd3, 0xdc, 0x01, 0xda, 0x94, - 0x01, 0x32, 0x92, 0xff, 0xe7, 0xd7, 0xfe, 0x15, 0x96, 0xfe, 0xb1, 0x9f, 0xfe, 0xa4, 0xa8, 0x00, - 0x87, 0x6f, 0x01, 0x78, 0x3f, 0xfd, 0xf0, 0x98, 0x32, 0x76, 0xde, 0x39, 0x09, 0x89, 0xfa, 0x95, - 0x8f, 0xec, 0x73, 0x3f, 0xff, 0x10, 0x27, 0x0f, 0x94, 0xd3, 0x06, 0x19, 0x69, 0xfa, 0x59, 0x73, - 0xf4, 0xd9, 0x95, 0xfd, 0x71, 0x7f, 0x08, 0x66, 0x35, 0xfd, 0x20, 0xba, 0xfa, 0xb3, 0x18, 0xfd, - 0xfb, 0x71, 0x00, 0x73, 0x66, 0xfe, 0x90, 0xc1, 0xfb, 0xae, 0xc6, 0xfd, 0x6a, 0x0f, 0x00, 0x32, - 0x9e, 0xfe, 0xe9, 0xeb, 0xfc, 0x9b, 0xc4, 0xff, 0x60, 0x55, 0xfe, 0x3a, 0xb5, 0x01, 0xc5, 0xa4, - 0x01, 0xa8, 0xab, 0xff, 0xfe, 0xc1, 0xfe, 0xa7, 0x20, 0xfe, 0xbd, 0x46, 0xfe, 0xec, 0xf0, 0xff, - 0x4f, 0xd8, 0x01, 0x76, 0xce, 0xfe, 0xca, 0x59, 0x36, 0xf9, 0xcb, 0x3b, 0x05, 0xa3, 0xf8, 0x37, - 0x34, 0xed, 0x4c, 0xe1, 0xfe, 0xc4, 0x97, 0x0e, 0x87, 0xb2, 0x06, 0xc5, 0xe5, 0xf9, 0x12, 0x25, - 0xf4, 0xe5, 0x3c, 0xfd, 0xba, 0xca, 0x08, 0xe0, 0xf1, 0xfc, 0x01, 0x89, 0xfa, 0xf0, 0xf2, 0xfc, - 0xfb, 0x36, 0x00, 0x06, 0x50, 0xfe, 0x08, 0x9c, 0xfb, 0x8c, 0x68, 0xfd, 0xe3, 0xcd, 0xff, 0xb0, - 0xca, 0xfe, 0x7c, 0x2d, 0xfd, 0x18, 0xa0, 0xff, 0x89, 0xd6, 0xfe, 0xe3, 0xa4, 0x01, 0xfd, 0x53, - 0x01, 0xd3, 0xd9, 0xff, 0xf4, 0xc5, 0xfe, 0x04, 0x9d, 0xfd, 0xd9, 0xf8, 0xfd, 0xbe, 0xb7, 0xff, - 0x80, 0x2a, 0x01, 0x4a, 0x64, 0x00, 0xbb, 0x10, 0x3a, 0xb6, 0xe1, 0x3d, 0x3e, 0x57, 0xf5, 0x66, - 0x4b, 0xee, 0x53, 0xd3, 0xfe, 0x92, 0x40, 0x0d, 0xef, 0xb6, 0x06, 0x3e, 0x7a, 0xf9, 0x58, 0xdb, - 0xf3, 0x4f, 0x88, 0xfc, 0xcc, 0xe7, 0x08, 0x39, 0x83, 0xfc, 0xcb, 0xce, 0xfa, 0x7c, 0x92, 0xfc, - 0x1e, 0xe4, 0xff, 0x0b, 0x36, 0xfe, 0xce, 0x5d, 0xfb, 0x6d, 0x26, 0xfd, 0x2d, 0x5b, 0xff, 0xe4, - 0x48, 0xff, 0xea, 0x2f, 0xfd, 0xed, 0x91, 0xff, 0x05, 0x27, 0xff, 0x0b, 0x75, 0x01, 0x04, 0xbf, - 0x00, 0xf5, 0x22, 0x00, 0x7e, 0x8c, 0xfe, 0x7a, 0x46, 0xfd, 0x79, 0xcc, 0xfd, 0x07, 0x7c, 0xff, - 0xb1, 0x31, 0x00, 0x0b, 0x34, 0x01, 0x99, 0xd2, 0x3f, 0xab, 0xa0, 0x3e, 0xac, 0x0a, 0xf0, 0xa9, - 0x67, 0xf0, 0x8f, 0x4f, 0xff, 0x77, 0xc7, 0x0b, 0x28, 0x68, 0x06, 0x02, 0xf1, 0xf8, 0x54, 0x68, - 0xf3, 0xb8, 0x3b, 0xfc, 0x2f, 0x00, 0x09, 0xd1, 0xdb, 0xfb, 0x8f, 0xdd, 0xfb, 0x36, 0xe6, 0xfb, - 0xf6, 0xf2, 0xff, 0x02, 0xd7, 0xfd, 0x89, 0x1c, 0xfb, 0x4b, 0x35, 0xfd, 0x17, 0x2c, 0xff, 0x34, - 0xc5, 0xff, 0x54, 0x00, 0xfd, 0xae, 0x08, 0x00, 0x11, 0xd0, 0xfe, 0x92, 0x65, 0x01, 0xbf, 0x5e, - 0x00, 0x4a, 0x40, 0x00, 0x58, 0x40, 0xfe, 0x58, 0x5c, 0xfd, 0x33, 0xf7, 0xfd, 0x63, 0xb5, 0xfe, - 0x8e, 0xcb, 0xff, 0xff, 0x7b, 0x01, 0x3e, 0x4b, 0x47, 0x1d, 0x9a, 0x3d, 0x08, 0x58, 0xe9, 0xd3, - 0x77, 0xf3, 0xcf, 0x82, 0xff, 0x9b, 0xe3, 0x0a, 0xa5, 0x67, 0x05, 0x7a, 0x5d, 0xf8, 0x83, 0xa9, - 0xf2, 0x1a, 0x76, 0xfc, 0xc8, 0x2f, 0x09, 0xa8, 0x25, 0xfb, 0xec, 0x3c, 0xfd, 0x77, 0x36, 0xfb, - 0x41, 0x26, 0x00, 0xda, 0x2c, 0xfd, 0x9e, 0x0c, 0xfb, 0xc1, 0xaf, 0xfd, 0xc6, 0x1e, 0xff, 0xfd, - 0xbf, 0xff, 0xd9, 0x42, 0xfd, 0x00, 0x19, 0x00, 0x7c, 0xec, 0xfd, 0x24, 0x11, 0x02, 0xf2, 0xca, - 0xff, 0x79, 0x24, 0x00, 0x20, 0x85, 0xfe, 0xa6, 0x88, 0xfd, 0xa6, 0xbe, 0xfd, 0xc8, 0x20, 0xfe, - 0x91, 0x0f, 0x00, 0xd4, 0xe2, 0x00, 0x2f, 0x8d, 0x4e, 0x8a, 0xa1, 0x3b, 0x80, 0xde, 0xe2, 0x47, - 0xb0, 0xf6, 0x8d, 0x56, 0xff, 0x85, 0x74, 0x0a, 0x29, 0xdf, 0x03, 0x2c, 0xaf, 0xf7, 0xd0, 0xca, - 0xf1, 0x6a, 0x05, 0xfd, 0x15, 0xa7, 0x09, 0xa1, 0x45, 0xfa, 0xa4, 0xe0, 0xfe, 0xa5, 0x8f, 0xfa, - 0xff, 0x18, 0x00, 0x0e, 0x87, 0xfc, 0xc1, 0x83, 0xfb, 0x4f, 0x5d, 0xfe, 0x8e, 0x3a, 0xfe, 0x85, - 0x46, 0x00, 0x90, 0x19, 0xfd, 0xf1, 0x22, 0xff, 0x4f, 0x1d, 0xfe, 0x0a, 0x66, 0x02, 0x9e, 0xfe, - 0xfe, 0xb2, 0xcd, 0x00, 0x9e, 0xde, 0xfe, 0xb1, 0xd8, 0xfc, 0x42, 0xe1, 0xfd, 0xff, 0x54, 0xfe, - 0x42, 0x6c, 0xff, 0xa2, 0x2b, 0x00, 0xaf, 0x3b, 0x55, 0xb3, 0x0a, 0x39, 0x8a, 0x2a, 0xdd, 0xce, - 0xed, 0xf9, 0x57, 0xcc, 0xfe, 0x9c, 0x44, 0x0a, 0x69, 0x4d, 0x02, 0xbb, 0xce, 0xf6, 0x70, 0x59, - 0xf1, 0xb4, 0x63, 0xfe, 0xa6, 0xbb, 0x09, 0x22, 0xa4, 0xf9, 0xfa, 0xfb, 0x00, 0x4a, 0x75, 0xf9, - 0x58, 0x1e, 0x00, 0xc4, 0xbf, 0xfc, 0xe1, 0x2e, 0xfc, 0x05, 0x40, 0xfe, 0x82, 0xf1, 0xfd, 0x9b, - 0x4c, 0x00, 0x73, 0x23, 0xfc, 0x56, 0x67, 0xff, 0xd7, 0xdd, 0xfd, 0x79, 0xb2, 0x02, 0xc4, 0x66, - 0xff, 0xea, 0x4c, 0x01, 0x9d, 0x64, 0xfe, 0x33, 0xbb, 0xfc, 0x80, 0xb7, 0xfe, 0x63, 0xa2, 0xfd, - 0x93, 0xb9, 0xfe, 0xd1, 0x49, 0x00, 0x23, 0x40, 0x5a, 0x9d, 0x9a, 0x36, 0x27, 0xab, 0xd8, 0xbd, - 0xfe, 0xfc, 0xf5, 0x28, 0xfd, 0xd0, 0x5a, 0x0a, 0x94, 0x2c, 0x01, 0x79, 0x91, 0xf5, 0x97, 0xf1, - 0xf1, 0x81, 0x98, 0xff, 0xd6, 0x61, 0x09, 0x8f, 0xb1, 0xf9, 0x46, 0xc1, 0x02, 0xb2, 0xf1, 0xf7, - 0xb7, 0x20, 0x01, 0x8e, 0x62, 0xfd, 0xe0, 0xac, 0xfb, 0x1f, 0xe4, 0xfe, 0x0b, 0x90, 0xfc, 0x14, - 0x1e, 0x00, 0x51, 0x71, 0xfc, 0xa6, 0xa2, 0xfe, 0xe4, 0x0d, 0xfe, 0x4d, 0x12, 0x04, 0x4c, 0x54, - 0xff, 0xc6, 0xf9, 0x00, 0x67, 0xc3, 0xfe, 0xc0, 0xde, 0xfc, 0x9f, 0x82, 0xfe, 0x50, 0x2a, 0xfd, - 0x11, 0x99, 0xfe, 0x7e, 0x37, 0x00, 0x55, 0x8a, 0x5d, 0xc9, 0x46, 0x33, 0xfb, 0xca, 0xd6, 0x08, - 0x38, 0xff, 0xc4, 0x52, 0xfa, 0x17, 0x26, 0x0b, 0x4d, 0xa7, 0x00, 0x37, 0xab, 0xf4, 0x5b, 0xab, - 0xf2, 0xfb, 0xe0, 0x00, 0x50, 0xa1, 0x08, 0x26, 0x07, 0xfa, 0x71, 0xfb, 0x03, 0x69, 0x6b, 0xf7, - 0x14, 0x1f, 0x02, 0x83, 0x5f, 0xfd, 0x61, 0xad, 0xfb, 0x22, 0xd5, 0xfd, 0x2e, 0x1f, 0xfc, 0xdf, - 0x9c, 0x00, 0x4d, 0xbc, 0xfb, 0xfd, 0xd1, 0xfe, 0xe8, 0xfa, 0xfe, 0x85, 0x8b, 0x04, 0x84, 0xce, - 0xfe, 0x65, 0x9f, 0x01, 0x07, 0xcc, 0xfe, 0x33, 0x55, 0xfc, 0xbf, 0xa4, 0xfe, 0xeb, 0xef, 0xfc, - 0x4d, 0x75, 0xfe, 0x07, 0x31, 0x00, 0xff, 0xbf, 0x5e, 0x15, 0x80, 0x2f, 0x3b, 0xf7, 0xd7, 0xe7, - 0xd8, 0xff, 0xb3, 0x9a, 0xf6, 0x02, 0xb5, 0x0c, 0x72, 0x38, 0x01, 0x3a, 0x82, 0xf3, 0x99, 0x84, - 0xf3, 0x25, 0x86, 0x02, 0x8d, 0xcc, 0x06, 0x93, 0xb2, 0xfa, 0xae, 0x1c, 0x06, 0x56, 0x57, 0xf6, - 0x15, 0xd3, 0x02, 0x4b, 0xae, 0xfd, 0x54, 0xd2, 0xf9, 0xea, 0x69, 0xfe, 0x36, 0x09, 0xfc, 0x0b, - 0x16, 0x00, 0x88, 0xaf, 0xfc, 0x50, 0x02, 0xff, 0xc8, 0x0d, 0xff, 0x5e, 0xb0, 0x04, 0x6f, 0x3e, - 0xff, 0xf2, 0x71, 0x01, 0x35, 0xa7, 0xfe, 0x05, 0x18, 0xfc, 0x4b, 0xc4, 0xfe, 0x13, 0xf8, 0xfc, - 0xe7, 0x2e, 0xfe, 0x02, 0x7d, 0x00, 0xe6, 0x9e, 0x5c, 0x9d, 0x27, 0x2d, 0x88, 0xc0, 0xda, 0xa2, - 0x51, 0xff, 0x73, 0xd5, 0xf2, 0xf4, 0x01, 0x0f, 0xec, 0x2b, 0x02, 0x26, 0x6a, 0xf2, 0xa0, 0x0c, - 0xf5, 0xff, 0xdc, 0x02, 0x08, 0xe8, 0x04, 0xed, 0xaf, 0xfc, 0x69, 0xd9, 0x06, 0xa8, 0xbc, 0xf5, - 0xc2, 0x15, 0x03, 0x8d, 0xa8, 0xfc, 0xfc, 0xcf, 0xf9, 0x07, 0xbb, 0xfe, 0x7e, 0xc6, 0xfb, 0x03, - 0xcc, 0x00, 0xe2, 0x6c, 0xfd, 0x67, 0x8e, 0xfe, 0x04, 0xeb, 0xfe, 0x4f, 0x47, 0x05, 0xc8, 0xf6, - 0xfe, 0xfb, 0x28, 0x01, 0x72, 0xb2, 0xfe, 0x75, 0xfa, 0xfb, 0x07, 0x30, 0xff, 0x53, 0xa0, 0xfc, - 0x9a, 0x50, 0xfe, 0xe7, 0xe8, 0x00, 0x2e, 0x9d, 0x57, 0xc5, 0xac, 0x2b, 0x0a, 0x27, 0xdf, 0x98, - 0xfa, 0xfd, 0x4a, 0x47, 0xf0, 0x7c, 0x78, 0x10, 0xc1, 0x7f, 0x03, 0x1f, 0x8c, 0xf2, 0x60, 0xbb, - 0xf5, 0x2d, 0xd9, 0x02, 0x66, 0x33, 0x04, 0xa5, 0x65, 0xfd, 0x84, 0x9b, 0x07, 0x79, 0x49, 0xf5, - 0x67, 0xdb, 0x01, 0xbd, 0x99, 0xfd, 0x49, 0x5d, 0xf9, 0x9c, 0x4d, 0xff, 0x86, 0x85, 0xfc, 0xf3, - 0x16, 0x01, 0xdc, 0xb7, 0xfd, 0x9a, 0x37, 0xfe, 0xb3, 0xf0, 0xfe, 0x37, 0x2a, 0x05, 0x13, 0xc9, - 0xfe, 0x5c, 0x9c, 0x00, 0x42, 0x6c, 0xff, 0xc6, 0xea, 0xfb, 0x6e, 0x3c, 0xff, 0xd3, 0xbf, 0xfc, - 0xfb, 0xd6, 0xfe, 0xab, 0xd5, 0x00, 0xe6, 0x19, 0x51, 0xda, 0x5f, 0x29, 0x8a, 0xbb, 0xe5, 0x10, - 0x41, 0xfc, 0x52, 0xff, 0xee, 0xac, 0x95, 0x10, 0xe4, 0x37, 0x05, 0x0b, 0x3d, 0xf3, 0x24, 0x69, - 0xf6, 0x1e, 0x7a, 0x03, 0xbe, 0x0c, 0x02, 0xb6, 0xfb, 0xfe, 0x42, 0x12, 0x07, 0x57, 0xe1, 0xf4, - 0x91, 0xd5, 0x01, 0x0e, 0xd3, 0xfd, 0x33, 0x00, 0xfa, 0x55, 0xd9, 0xff, 0x04, 0x95, 0xfd, 0x17, - 0x9a, 0x00, 0x9f, 0x33, 0xfe, 0x96, 0x3a, 0xfe, 0xd7, 0x9f, 0xfe, 0xa3, 0x95, 0x04, 0xae, 0x9f, - 0xfe, 0xaa, 0xc9, 0x00, 0x17, 0xbc, 0xff, 0x86, 0x01, 0xfc, 0xbb, 0x6b, 0xff, 0x48, 0x76, 0xfd, - 0x42, 0xd0, 0xfe, 0x5d, 0xc9, 0x00, 0x43, 0x33, 0x48, 0xef, 0x71, 0x28, 0x5d, 0x43, 0xec, 0x7e, - 0x20, 0xfb, 0x9a, 0x81, 0xee, 0x54, 0x92, 0x0f, 0x86, 0xaa, 0x06, 0x2b, 0xe1, 0xf4, 0x23, 0xd0, - 0xf7, 0x17, 0x0c, 0x02, 0x93, 0x5d, 0x01, 0x91, 0x4c, 0xff, 0x5a, 0xce, 0x05, 0x77, 0x1e, 0xf6, - 0x65, 0xdc, 0x00, 0x71, 0xc9, 0xfe, 0xf1, 0xa9, 0xfa, 0x32, 0x6d, 0x00, 0x5c, 0x15, 0xfe, 0xd5, - 0x08, 0x00, 0xfe, 0x08, 0xff, 0x9f, 0x28, 0xfe, 0xc4, 0xcf, 0xfd, 0xfa, 0xd8, 0x03, 0xe0, 0x29, - 0xff, 0x6c, 0x77, 0x00, 0x26, 0x0d, 0x00, 0xba, 0x71, 0xfc, 0xc0, 0xcd, 0xff, 0xf1, 0xc3, 0xfd, - 0x33, 0xf8, 0xfe, 0x89, 0x9c, 0x00, 0x9f, 0x2f, 0x3b, 0xa4, 0xc1, 0x28, 0xbc, 0xc1, 0xf0, 0xe9, - 0xb6, 0xfb, 0x7b, 0xad, 0xf8, 0x76, 0x40, 0x08, 0x23, 0x71, 0x01, 0xc4, 0x79, 0xf7, 0x06, 0x59, - 0xf8, 0x07, 0x1d, 0x02, 0x33, 0x1a, 0x03, 0x94, 0x4e, 0xff, 0xcc, 0x85, 0x04, 0xe8, 0x30, 0xfa, - 0x96, 0x28, 0x01, 0xcc, 0x0e, 0x00, 0x47, 0x52, 0xfc, 0x8b, 0x6e, 0xff, 0xc2, 0xed, 0xfe, 0xe6, - 0x0d, 0x00, 0x8c, 0x5c, 0xfe, 0x68, 0xd0, 0xfe, 0x97, 0x6c, 0xfe, 0x55, 0x6a, 0x02, 0xf1, 0xfe, - 0xfe, 0xb2, 0xe3, 0xff, 0x8f, 0x7f, 0x00, 0xc8, 0x99, 0xfd, 0x30, 0xdb, 0xfe, 0xd5, 0x3c, 0xfe, - 0x30, 0x6b, 0xfe, 0xed, 0x90, 0xff, 0xf1, 0x55, 0x32, 0x0f, 0xc0, 0x27, 0xeb, 0x75, 0xf6, 0x73, - 0x58, 0xfa, 0x5e, 0xa8, 0xf8, 0xa2, 0xc5, 0x07, 0x81, 0x35, 0x03, 0xbb, 0xa9, 0xf9, 0x35, 0x64, - 0xf9, 0x3d, 0x72, 0x00, 0x17, 0xa7, 0x02, 0x65, 0x89, 0xff, 0x0e, 0xb6, 0x03, 0xb6, 0xa0, 0xfb, - 0x6a, 0x40, 0x00, 0x21, 0x9a, 0x00, 0x76, 0x71, 0xfd, 0xa9, 0x02, 0x00, 0x69, 0x9e, 0xff, 0x08, - 0x21, 0x00, 0x7b, 0x05, 0xff, 0x10, 0xae, 0xfe, 0xbc, 0xf9, 0xfd, 0x40, 0xd1, 0x01, 0x3c, 0x69, - 0xff, 0x11, 0xbe, 0xff, 0xb0, 0xdc, 0x00, 0xde, 0x4b, 0xfe, 0x50, 0x0e, 0xff, 0xfb, 0x87, 0xfe, - 0xfe, 0x98, 0xfe, 0x83, 0x56, 0xff, 0x78, 0x12, 0x2b, 0xcc, 0x6a, 0x26, 0xce, 0xa8, 0xfa, 0xa7, - 0xb1, 0xf9, 0xab, 0x40, 0xf9, 0x30, 0xbb, 0x06, 0x2b, 0x3c, 0x04, 0xb9, 0xf0, 0xfb, 0xb3, 0x2a, - 0xfa, 0x23, 0x66, 0xff, 0x84, 0x55, 0x02, 0xd5, 0x86, 0xff, 0xcf, 0x52, 0x03, 0x81, 0xf4, 0xfc, - 0xaf, 0xd9, 0xff, 0x19, 0x04, 0x01, 0x2f, 0xa5, 0xfe, 0x46, 0x16, 0x00, 0xb8, 0x19, 0x00, 0xae, - 0xa3, 0x00, 0xff, 0x30, 0xff, 0x4d, 0xed, 0xfe, 0x96, 0xe9, 0xfd, 0x80, 0x1c, 0x01, 0xad, 0xc6, - 0xff, 0x2a, 0x97, 0xff, 0x2e, 0xb4, 0x00, 0xa5, 0xd6, 0xfe, 0x82, 0x33, 0xff, 0xb8, 0xc5, 0xfe, - 0xc2, 0xed, 0xfe, 0x1d, 0xfc, 0xfe, 0xda, 0xa1, 0x25, 0xe3, 0x1b, 0x25, 0xdc, 0x38, 0xfd, 0x88, - 0x4f, 0xf9, 0x9d, 0x0c, 0xfa, 0xf9, 0xb2, 0x05, 0x98, 0xb6, 0x04, 0x75, 0x8f, 0xfd, 0xc0, 0xf1, - 0xfa, 0x4f, 0xdc, 0xfe, 0xac, 0x16, 0x02, 0x00, 0x96, 0xff, 0x01, 0xd6, 0x02, 0xcf, 0x27, 0xfe, - 0x58, 0xde, 0xff, 0x14, 0x0a, 0x01, 0xe8, 0x6d, 0xff, 0x87, 0x06, 0x00, 0x28, 0x66, 0x00, 0x48, - 0xef, 0x00, 0x3c, 0x57, 0xff, 0x45, 0x1c, 0xff, 0xbc, 0xdb, 0xfd, 0x5a, 0x60, 0x00, 0x4f, 0xbb, - 0xff, 0x0e, 0x4a, 0xff, 0x3c, 0x36, 0x00, 0x37, 0x60, 0xff, 0xd6, 0x59, 0xff, 0xfd, 0xec, 0xfe, - 0xd9, 0xf5, 0xfe, 0x8d, 0xc1, 0xfe, 0x02, 0x2e, 0x22, 0xe7, 0xec, 0x23, 0xe0, 0xba, 0xfe, 0x5b, - 0x27, 0xf9, 0x1f, 0x0f, 0xfb, 0xaf, 0x0f, 0x05, 0xdf, 0xe8, 0x04, 0x99, 0xb7, 0xfe, 0x39, 0xae, - 0xfb, 0xaf, 0xca, 0xfe, 0xa4, 0x06, 0x02, 0x61, 0x05, 0x00, 0x21, 0x8e, 0x02, 0x1b, 0x03, 0xff, - 0x48, 0x69, 0x00, 0xc7, 0xda, 0x00, 0x1d, 0xc8, 0xff, 0x7b, 0x41, 0x00, 0x4a, 0x8b, 0x00, 0x52, - 0xf9, 0x00, 0xd7, 0x7a, 0xff, 0xaf, 0x5e, 0xff, 0xd6, 0xda, 0xfd, 0x39, 0xb4, 0xff, 0x7f, 0x96, - 0xff, 0x79, 0x27, 0xff, 0x6c, 0x22, 0x00, 0xcf, 0xf3, 0xff, 0x10, 0x5c, 0xff, 0xcb, 0xe8, 0xfe, - 0xe3, 0x82, 0xff, 0xec, 0xe4, 0xfe, 0x46, 0xcd, 0x1f, 0x47, 0x37, 0x23, 0x51, 0xb2, 0xff, 0x86, - 0x00, 0xf9, 0xb0, 0x1d, 0xfc, 0xce, 0xb3, 0x04, 0x97, 0xdf, 0x04, 0x88, 0x7c, 0xff, 0x08, 0xce, - 0xfb, 0x62, 0xda, 0xfe, 0x96, 0x19, 0x02, 0x56, 0x45, 0x00, 0x24, 0xac, 0x02, 0x5f, 0x36, 0xff, - 0xff, 0xcb, 0x00, 0x36, 0x18, 0x01, 0xf6, 0x5b, 0xff, 0x25, 0x26, 0x00, 0x38, 0xc4, 0x00, 0xe3, - 0xbb, 0x00, 0x02, 0x2c, 0xff, 0x6c, 0xb8, 0xff, 0x42, 0xef, 0xfd, 0xe9, 0xd9, 0xfe, 0x5a, 0x9a, - 0xff, 0xf9, 0x80, 0xff, 0x6b, 0xda, 0xff, 0x52, 0xb5, 0xff, 0xf7, 0xc4, 0xff, 0x82, 0x76, 0xff, - 0x58, 0xf1, 0xfe, 0x32, 0xa7, 0xff, 0x42, 0x8d, 0x1e, 0xce, 0xf5, 0x22, 0xde, 0x24, 0x00, 0xea, - 0xe5, 0xf8, 0xbf, 0x36, 0xfd, 0x21, 0xf1, 0x04, 0x2d, 0x72, 0x04, 0x0d, 0xdb, 0xff, 0xba, 0xb5, - 0xfb, 0x81, 0x5a, 0xfe, 0x68, 0x8a, 0x02, 0xbe, 0x05, 0x00, 0x31, 0x80, 0x02, 0x24, 0xf7, 0xff, - 0xfe, 0x88, 0x00, 0x67, 0x31, 0x01, 0xca, 0x92, 0xff, 0x77, 0x46, 0xff, 0x82, 0x93, 0x00, 0x20, - 0x1e, 0x01, 0x11, 0xb5, 0xfe, 0x35, 0x2a, 0xff, 0xcd, 0x7c, 0xfe, 0xd9, 0x06, 0xff, 0xc7, 0x06, - 0xff, 0x4f, 0x99, 0xff, 0x88, 0x9e, 0xff, 0xb0, 0xaa, 0xff, 0x9c, 0x15, 0x00, 0x52, 0xf5, 0xfe, - 0x99, 0x82, 0x00, 0x70, 0xbb, 0x00, 0x65, 0x80, 0x1e, 0x2e, 0x51, 0x23, 0xbe, 0xd4, 0xff, 0xea, - 0xad, 0xf8, 0x88, 0x47, 0xfe, 0xe8, 0xab, 0x05, 0x22, 0x72, 0x04, 0xb7, 0x3f, 0xff, 0xf0, 0x9f, - 0xfb, 0x42, 0x14, 0xfe, 0x2d, 0x07, 0x02, 0xb8, 0x01, 0x00, 0x8c, 0x03, 0x02, 0xdb, 0x25, 0x00, - 0x77, 0x30, 0x01, 0x40, 0xfe, 0x00, 0x1a, 0x68, 0xff, 0x05, 0x98, 0xff, 0xb9, 0x06, 0x00, 0x3d, - 0x7f, 0x00, 0x4b, 0x0a, 0xff, 0x9c, 0x0a, 0xff, 0x33, 0x0f, 0xfe, 0x5d, 0x73, 0xff, 0xc8, 0x9c, - 0xff, 0x0a, 0xb4, 0xfe, 0x0a, 0x6e, 0xff, 0x78, 0x31, 0x00, 0x68, 0x32, 0xff, 0x2f, 0x3c, 0x00, - 0x5c, 0x84, 0x01, 0x99, 0xf5, 0xfe, 0xef, 0xca, 0x1e, 0x96, 0x97, 0x24, 0x4b, 0xb4, 0xff, 0x8d, - 0xed, 0xf7, 0x8a, 0x51, 0xff, 0x1a, 0x88, 0x06, 0x90, 0xa7, 0x04, 0xf8, 0xf5, 0xfe, 0x5a, 0xdd, - 0xfa, 0xbb, 0xd2, 0xfd, 0xec, 0x1f, 0x02, 0x24, 0x34, 0xff, 0x7c, 0x5f, 0x01, 0x4f, 0x52, 0x00, - 0x90, 0x0a, 0x01, 0xc1, 0x90, 0x01, 0xe2, 0xa2, 0xff, 0x71, 0x72, 0xff, 0xc8, 0x76, 0x00, 0x39, - 0x2a, 0x00, 0xb5, 0x0f, 0xfe, 0xe0, 0x40, 0xff, 0xbc, 0x96, 0xfe, 0x0f, 0x27, 0xff, 0x2d, 0x65, - 0xff, 0x67, 0x65, 0xff, 0xc8, 0xb5, 0xff, 0x08, 0xcc, 0xfe, 0xc7, 0xe2, 0xff, 0x07, 0x88, 0x01, - 0x1e, 0xf0, 0xff, 0x5e, 0xb3, 0xfe, 0x07, 0x75, 0x20, 0x56, 0x12, 0x26, 0xa0, 0xe1, 0xfe, 0xe9, - 0x02, 0xf7, 0xec, 0x2a, 0x00, 0x34, 0x8f, 0x07, 0x7e, 0xb3, 0x04, 0x0c, 0x97, 0xfe, 0xc9, 0x58, - 0xfa, 0xcd, 0x65, 0xfd, 0x83, 0x3f, 0x02, 0x2f, 0xf2, 0xfe, 0xd8, 0x81, 0x00, 0xe8, 0xac, 0xff, - 0x63, 0x28, 0x01, 0xfe, 0x86, 0x01, 0xc6, 0x5d, 0xff, 0x9c, 0x1b, 0x00, 0x92, 0xe4, 0x00, 0x27, - 0xe5, 0xff, 0x95, 0xed, 0xfd, 0x47, 0xd1, 0xfe, 0x1e, 0xfd, 0xfd, 0x0c, 0xb1, 0xff, 0xf3, 0xb9, - 0xff, 0xdf, 0x1f, 0xff, 0x4c, 0xbd, 0xff, 0x70, 0x15, 0xff, 0x10, 0x25, 0x00, 0x24, 0xea, 0x00, - 0x38, 0x64, 0xff, 0xf0, 0xcd, 0xfe, 0x28, 0xce, 0x22, 0xff, 0x2f, 0x28, 0xa4, 0x71, 0xfd, 0x42, - 0xc8, 0xf5, 0x46, 0x41, 0x01, 0xdb, 0x47, 0x08, 0x65, 0x78, 0x04, 0x3e, 0xf8, 0xfd, 0x6b, 0x96, - 0xf9, 0x5d, 0x70, 0xfd, 0x73, 0x88, 0x02, 0x3e, 0x8e, 0xfe, 0x0a, 0x9e, 0xff, 0x7a, 0x3c, 0xff, - 0x58, 0x02, 0x01, 0x09, 0xf8, 0x00, 0x60, 0xed, 0xfe, 0xf9, 0xfe, 0xff, 0xfd, 0x36, 0x01, 0x24, - 0x08, 0x00, 0x36, 0xe1, 0xfd, 0xe6, 0xaa, 0xfe, 0xd0, 0xab, 0xfd, 0x18, 0x8a, 0xff, 0x85, 0x5e, - 0xff, 0x1c, 0x93, 0xff, 0xc6, 0xd5, 0xff, 0x6e, 0xb5, 0xfe, 0x3b, 0x16, 0x00, 0x40, 0x1f, 0x01, - 0xf0, 0x20, 0xff, 0xf7, 0xcd, 0xfd, 0x0a, 0xe9, 0x25, 0x8c, 0x94, 0x2a, 0x11, 0x81, 0xfb, 0xf4, - 0xb7, 0xf4, 0x1c, 0x6b, 0x02, 0xc6, 0x05, 0x09, 0xd9, 0xaa, 0x03, 0x2b, 0x22, 0xfd, 0x20, 0xdb, - 0xf8, 0xf7, 0xc2, 0xfd, 0x1e, 0x50, 0x03, 0x6d, 0xd9, 0xfd, 0xf5, 0xff, 0xfe, 0x53, 0xa4, 0xfe, - 0xec, 0x17, 0x01, 0x15, 0xbe, 0x00, 0x1d, 0xe5, 0xfd, 0x1f, 0xc8, 0xff, 0x4c, 0x29, 0x01, 0x0b, - 0xa8, 0xff, 0x5a, 0xe8, 0xfd, 0x54, 0x08, 0xff, 0x2a, 0x84, 0xfd, 0x1f, 0xfe, 0xff, 0x24, 0x1c, - 0xff, 0x6a, 0xcf, 0xfe, 0x45, 0xfe, 0xff, 0x35, 0x11, 0xff, 0x72, 0x5b, 0xff, 0x01, 0xa7, 0x00, - 0x6e, 0x1f, 0x00, 0xf4, 0x8b, 0xfd, 0xd7, 0xe6, 0x29, 0xaf, 0x2a, 0x2d, 0x2f, 0x0a, 0xf9, 0x96, - 0x05, 0xf4, 0x60, 0xa4, 0x03, 0x7a, 0xae, 0x09, 0x25, 0xa9, 0x02, 0x72, 0xe2, 0xfb, 0xb5, 0x45, - 0xf8, 0x63, 0x58, 0xfe, 0xb5, 0x7c, 0x04, 0xf2, 0x19, 0xfd, 0xdb, 0x32, 0xfe, 0x72, 0x72, 0xfe, - 0xcd, 0x23, 0x01, 0x11, 0x81, 0x00, 0x29, 0x70, 0xfd, 0x5f, 0x3a, 0xff, 0xa8, 0xd6, 0x00, 0x1f, - 0x7a, 0xff, 0x4a, 0x61, 0xfd, 0xf1, 0x7d, 0xff, 0x75, 0xc8, 0xfd, 0xde, 0x6c, 0x00, 0xe2, 0x8c, - 0xff, 0x30, 0x50, 0xfe, 0xf9, 0x90, 0xff, 0xfe, 0xef, 0xfe, 0x62, 0xfa, 0xfe, 0x25, 0x1f, 0x00, - 0x90, 0xe8, 0x00, 0xba, 0x1f, 0xfe, 0x69, 0x63, 0x2e, 0xea, 0xf9, 0x2f, 0x76, 0x8a, 0xf6, 0xa8, - 0xde, 0xf3, 0x98, 0x90, 0x04, 0xc2, 0x0e, 0x0a, 0x13, 0xc3, 0x01, 0xbf, 0xb3, 0xfa, 0x19, 0xdb, - 0xf7, 0x7c, 0x11, 0xff, 0xf5, 0xc0, 0x05, 0xe8, 0x85, 0xfc, 0x93, 0x8f, 0xfd, 0xe8, 0x4d, 0xfe, - 0x96, 0x7b, 0x01, 0x6e, 0x20, 0x00, 0x30, 0x25, 0xfd, 0xac, 0x29, 0xff, 0xf8, 0x40, 0x00, 0x06, - 0x62, 0xff, 0x79, 0x38, 0xfd, 0x8c, 0x9c, 0xff, 0xd4, 0x4b, 0xfe, 0x67, 0xd3, 0x00, 0x91, 0xe6, - 0xff, 0x5f, 0x91, 0xfe, 0xba, 0x59, 0xff, 0xa9, 0x86, 0xfe, 0x41, 0x64, 0xfe, 0x6c, 0xa5, 0xff, - 0x22, 0x26, 0x01, 0x3a, 0xc1, 0xff, 0x25, 0x4b, 0x33, 0xcc, 0x8c, 0x32, 0x24, 0xb6, 0xf3, 0x1e, - 0x0f, 0xf4, 0xd0, 0xb3, 0x04, 0x1b, 0xbd, 0x09, 0xd4, 0xdd, 0x00, 0x2c, 0xa4, 0xf9, 0x4d, 0x5b, - 0xf7, 0xd8, 0x90, 0xff, 0xaa, 0xa2, 0x06, 0x7f, 0xba, 0xfb, 0xc6, 0x23, 0xfd, 0xd1, 0x00, 0xfe, - 0x57, 0x95, 0x01, 0xcf, 0xbb, 0xff, 0x6e, 0xa7, 0xfc, 0xe3, 0xcb, 0xfe, 0xe2, 0xd9, 0xff, 0xa2, - 0x47, 0xff, 0x68, 0xf7, 0xfc, 0xbd, 0xb2, 0xff, 0xd4, 0x90, 0xfe, 0x66, 0xdd, 0x00, 0xea, 0xde, - 0xff, 0x21, 0xfe, 0xfe, 0x9f, 0x09, 0xff, 0x8f, 0x25, 0xfe, 0x5a, 0xc1, 0xfd, 0xa0, 0xef, 0xfe, - 0xa3, 0xa4, 0x00, 0x75, 0x04, 0x01, 0x05, 0x3e, 0x38, 0xf0, 0x24, 0x35, 0xa4, 0xc2, 0xf0, 0x95, - 0xe3, 0xf4, 0xfe, 0x48, 0x04, 0x1a, 0xdb, 0x08, 0x2a, 0x5e, 0x00, 0xa6, 0x0a, 0xf9, 0x62, 0x0c, - 0xf7, 0xba, 0xc8, 0xff, 0x83, 0x54, 0x07, 0xad, 0x1f, 0xfb, 0x96, 0x1a, 0xfd, 0x6e, 0xcc, 0xfd, - 0x34, 0x8f, 0x01, 0x2f, 0x8b, 0xff, 0xfa, 0x44, 0xfc, 0xf8, 0x62, 0xfe, 0x26, 0xa4, 0xff, 0x36, - 0x7d, 0xff, 0x4d, 0xe3, 0xfc, 0x1a, 0x04, 0x00, 0x84, 0xa6, 0xfe, 0xc2, 0xd2, 0x00, 0x08, 0xae, - 0xff, 0xdc, 0x85, 0xff, 0xc1, 0xe3, 0xfe, 0x1a, 0xe1, 0xfd, 0x09, 0x91, 0xfd, 0xef, 0x17, 0xfe, - 0x4b, 0x4b, 0x00, 0x8d, 0x83, 0x01, 0x28, 0xd7, 0x3d, 0x04, 0xba, 0x36, 0x32, 0xe5, 0xec, 0xc6, - 0x43, 0xf6, 0x9e, 0x5f, 0x03, 0x5c, 0x53, 0x07, 0x99, 0xc2, 0xff, 0x61, 0x87, 0xf8, 0x1e, 0x8f, - 0xf6, 0xb1, 0xb7, 0xff, 0x19, 0x90, 0x07, 0xef, 0x8d, 0xfa, 0xa2, 0x5a, 0xfd, 0xd1, 0x5c, 0xfd, - 0x76, 0x63, 0x01, 0x87, 0x24, 0xff, 0xdc, 0xd9, 0xfb, 0x8f, 0xfc, 0xfd, 0x26, 0x7d, 0xff, 0xff, - 0x6e, 0xff, 0xb0, 0xdc, 0xfc, 0x4e, 0x37, 0x00, 0xde, 0x34, 0xfe, 0x45, 0xdc, 0x00, 0x25, 0x29, - 0xff, 0x89, 0xb1, 0xff, 0xef, 0xed, 0xfe, 0xe6, 0x91, 0xfd, 0x9f, 0x67, 0xfd, 0xd1, 0x1c, 0xfd, - 0xb5, 0x31, 0x00, 0x26, 0x46, 0x01, 0x90, 0x3b, 0x44, 0x10, 0x20, 0x37, 0x1d, 0x05, 0xe8, 0xa2, - 0x80, 0xf8, 0x10, 0x8c, 0x02, 0x88, 0xc9, 0x05, 0x6c, 0xe0, 0xfe, 0xbb, 0x43, 0xf8, 0x32, 0x09, - 0xf6, 0xb1, 0xbc, 0xff, 0x84, 0x27, 0x08, 0x12, 0xd9, 0xf9, 0x53, 0x3f, 0xfe, 0xd5, 0x0d, 0xfd, - 0xa3, 0x36, 0x01, 0x84, 0xa4, 0xfe, 0x99, 0xe4, 0xfb, 0x77, 0x21, 0xfe, 0xcb, 0xc4, 0xfe, 0x95, - 0xde, 0xff, 0x2d, 0xe5, 0xfc, 0xe0, 0xb1, 0xff, 0xdd, 0x39, 0xfe, 0xf1, 0x03, 0x01, 0xb3, 0x85, - 0xfe, 0x35, 0x29, 0x00, 0x72, 0x55, 0xff, 0x96, 0xed, 0xfc, 0x37, 0x73, 0xfd, 0xcb, 0x01, 0xfd, - 0xb2, 0xa9, 0xff, 0xb9, 0xcb, 0x00, 0x35, 0x05, 0x4b, 0xca, 0x9c, 0x35, 0x1e, 0x00, 0xe3, 0x09, - 0x88, 0xfb, 0x83, 0xe3, 0x01, 0x9d, 0x74, 0x04, 0x03, 0x82, 0xfd, 0xe0, 0x3e, 0xf8, 0xf6, 0x47, - 0xf5, 0x2c, 0xc8, 0x00, 0x9a, 0x9b, 0x08, 0xc0, 0x04, 0xf9, 0x79, 0x13, 0x00, 0x2b, 0x70, 0xfc, - 0xfb, 0x0d, 0x01, 0x5e, 0x9b, 0xfe, 0x72, 0xad, 0xfc, 0xf6, 0x7d, 0xfd, 0xdc, 0x72, 0xfe, 0x38, - 0x72, 0x00, 0x16, 0xd8, 0xfb, 0x8a, 0xf2, 0xff, 0x27, 0x2d, 0xfe, 0xe6, 0xf2, 0x00, 0x20, 0xda, - 0xfe, 0x1b, 0xd0, 0x00, 0x70, 0x22, 0xff, 0x1f, 0x74, 0xfc, 0xf7, 0x3a, 0xfe, 0x33, 0xcc, 0xfc, - 0x47, 0x93, 0xfe, 0xf1, 0xcf, 0x00, 0x50, 0xd3, 0x4f, 0xfe, 0xc9, 0x33, 0x85, 0x9c, 0xde, 0xc8, - 0x91, 0xfe, 0xbb, 0xc5, 0x00, 0x95, 0x36, 0x03, 0x51, 0x60, 0xfc, 0x56, 0x94, 0xf7, 0x85, 0x52, - 0xf5, 0x0e, 0xd0, 0x01, 0x05, 0x78, 0x08, 0x6e, 0x00, 0xf9, 0xb6, 0xb8, 0x01, 0xe7, 0x2b, 0xfb, - 0xf9, 0xab, 0x01, 0x04, 0x35, 0xff, 0xbb, 0x1a, 0xfc, 0x45, 0xbb, 0xfd, 0x30, 0x78, 0xfd, 0x43, - 0xfb, 0xff, 0x94, 0xf8, 0xfb, 0xee, 0x62, 0xff, 0x3f, 0x1f, 0xfe, 0x52, 0x1a, 0x02, 0x6c, 0xde, - 0xfe, 0x14, 0xb3, 0x00, 0x33, 0x56, 0xff, 0x55, 0x98, 0xfc, 0x15, 0xfc, 0xfd, 0xc7, 0x5f, 0xfc, - 0xff, 0x46, 0xfe, 0x7d, 0x7c, 0x00, 0xa4, 0x4f, 0x52, 0x29, 0x98, 0x30, 0x77, 0x5e, 0xdd, 0xe4, - 0xdb, 0x00, 0xbb, 0xd3, 0xfe, 0x44, 0x2f, 0x03, 0x67, 0x92, 0xfb, 0xb5, 0x41, 0xf7, 0x23, 0xac, - 0xf5, 0xf8, 0xd0, 0x02, 0x8c, 0x3b, 0x08, 0xde, 0x68, 0xf9, 0x2a, 0xd1, 0x02, 0xc6, 0xf9, 0xfa, - 0xef, 0x69, 0x02, 0x3e, 0xf6, 0xfe, 0x0c, 0x8e, 0xfc, 0xa1, 0xbc, 0xfc, 0x02, 0xc5, 0xfc, 0xc1, - 0x69, 0x00, 0x33, 0x4a, 0xfb, 0x44, 0x97, 0xff, 0xc9, 0x12, 0xff, 0x98, 0x89, 0x02, 0x6d, 0x90, - 0xfe, 0xc5, 0x70, 0x01, 0x5c, 0x71, 0xff, 0xdc, 0x08, 0xfc, 0xfb, 0xe8, 0xfd, 0x77, 0x89, 0xfc, - 0xc5, 0x13, 0xfe, 0x39, 0x1f, 0x00, 0xd2, 0x35, 0x51, 0xb0, 0xb1, 0x2d, 0x14, 0x53, 0xdf, 0x4d, - 0x36, 0x01, 0xab, 0x82, 0xfc, 0x6c, 0x69, 0x04, 0x0b, 0x26, 0xfc, 0x79, 0x87, 0xf6, 0x38, 0x3a, - 0xf6, 0xcf, 0xff, 0x03, 0xe3, 0xb9, 0x06, 0xc1, 0x99, 0xfa, 0x03, 0xc9, 0x04, 0xc6, 0xd9, 0xf9, - 0x73, 0x1b, 0x03, 0xf9, 0x59, 0xff, 0x72, 0x19, 0xfb, 0xe2, 0x7f, 0xfd, 0x18, 0x65, 0xfc, 0x71, - 0x08, 0x00, 0xf6, 0x74, 0xfc, 0xc3, 0x84, 0xff, 0x5f, 0x30, 0xff, 0x4a, 0x0b, 0x03, 0xd0, 0x04, - 0xff, 0x3a, 0x37, 0x01, 0x07, 0x30, 0xff, 0x47, 0x21, 0xfc, 0x71, 0x07, 0xfe, 0x01, 0xc7, 0xfc, - 0x7d, 0xf2, 0xfd, 0x47, 0xf8, 0xff, 0xd8, 0x8d, 0x4c, 0x6c, 0x29, 0x2b, 0xf4, 0x10, 0xe4, 0xc2, - 0xb5, 0xff, 0xc3, 0x6d, 0xfa, 0xb4, 0x84, 0x06, 0x32, 0x48, 0xfd, 0x07, 0x0a, 0xf6, 0xbc, 0x11, - 0xf7, 0x94, 0xab, 0x03, 0xee, 0x83, 0x05, 0xa2, 0xca, 0xfc, 0x03, 0xdd, 0x04, 0x6c, 0x05, 0xfa, - 0x8d, 0xa3, 0x02, 0x05, 0xe4, 0xfe, 0x80, 0x8a, 0xfb, 0x99, 0x75, 0xfd, 0x95, 0x09, 0xfd, 0x74, - 0x5f, 0x00, 0x1d, 0x1b, 0xfd, 0xc4, 0x01, 0xff, 0x2d, 0x54, 0xff, 0xa5, 0x99, 0x03, 0xa4, 0x89, - 0xfe, 0x35, 0xce, 0x00, 0xb6, 0x6e, 0xff, 0x9c, 0x6e, 0xfc, 0x3a, 0x45, 0xfe, 0x77, 0xe9, 0xfc, - 0x97, 0x2a, 0xfe, 0x71, 0x3e, 0x00, 0x56, 0xa4, 0x44, 0xea, 0xef, 0x29, 0xaa, 0x19, 0xea, 0x5a, - 0x5b, 0xfd, 0x53, 0x18, 0xf9, 0xd9, 0xd8, 0x07, 0x83, 0x3a, 0xff, 0x77, 0x58, 0xf6, 0x3a, 0x40, - 0xf7, 0x02, 0x41, 0x03, 0xc0, 0x5a, 0x04, 0x2a, 0xd3, 0xfd, 0x6b, 0x84, 0x05, 0x7b, 0x68, 0xf9, - 0xa7, 0xc5, 0x01, 0xdb, 0xbd, 0xff, 0xc4, 0x33, 0xfb, 0x17, 0xbb, 0xfe, 0x97, 0xce, 0xfd, 0x42, - 0x3c, 0x00, 0x7c, 0xa6, 0xfd, 0x30, 0xaa, 0xfe, 0x9c, 0x42, 0xff, 0x6a, 0xd7, 0x02, 0x3a, 0x9a, - 0xfe, 0xfa, 0x55, 0x00, 0xf0, 0xd9, 0xff, 0x59, 0xec, 0xfc, 0xa0, 0x5b, 0xfe, 0x68, 0x97, 0xfd, - 0x36, 0x81, 0xfe, 0xc7, 0xc1, 0xff, 0x80, 0xa0, 0x36, 0x8b, 0x28, 0x28, 0x1b, 0xed, 0xee, 0x83, - 0x6d, 0xfe, 0xbc, 0x11, 0x02, 0xde, 0x8f, 0x04, 0xfe, 0x2c, 0xfe, 0x57, 0x90, 0xf9, 0xea, 0x30, - 0xf9, 0x81, 0x69, 0x02, 0x81, 0x18, 0x05, 0xbb, 0xa7, 0xfd, 0x57, 0x4f, 0x02, 0xe7, 0x50, 0xfd, - 0x7c, 0xf6, 0x01, 0x7b, 0x98, 0xff, 0x89, 0x0a, 0xfd, 0xe4, 0x06, 0xfe, 0x83, 0xa8, 0xfd, 0x23, - 0x0d, 0x00, 0xef, 0x1b, 0xfe, 0x1d, 0x7b, 0xff, 0xde, 0x5a, 0xff, 0xcf, 0x59, 0x02, 0x26, 0x59, - 0xff, 0xce, 0x3e, 0x00, 0xff, 0xb0, 0xff, 0x03, 0x51, 0xfd, 0x54, 0x30, 0xfe, 0x29, 0xe0, 0xfd, - 0x61, 0x61, 0xfe, 0x63, 0x18, 0xff, 0xb9, 0xd6, 0x31, 0x4c, 0x5f, 0x28, 0x5c, 0x9d, 0xf1, 0x4b, - 0xa5, 0xfa, 0x7f, 0x14, 0x01, 0x43, 0xc6, 0x06, 0x9d, 0x61, 0x00, 0x57, 0x5f, 0xfa, 0xa9, 0x97, - 0xf8, 0xfd, 0x16, 0x00, 0x4b, 0x97, 0x04, 0x4e, 0xb8, 0xfe, 0x49, 0xa4, 0x02, 0x17, 0xf9, 0xfd, - 0xed, 0xbf, 0x01, 0xf9, 0xd2, 0x00, 0x6e, 0x7d, 0xfd, 0xc1, 0xe6, 0xfe, 0xe5, 0x1a, 0xff, 0x9e, - 0xed, 0xff, 0xea, 0x66, 0xfe, 0x2a, 0x18, 0xff, 0x98, 0x87, 0xfe, 0x77, 0x35, 0x02, 0xdc, 0x67, - 0xff, 0x5a, 0x96, 0xff, 0xa4, 0x46, 0x00, 0xa5, 0xfd, 0xfd, 0xc9, 0x6d, 0xfe, 0x4d, 0x4d, 0xfe, - 0xb2, 0x9d, 0xfe, 0x31, 0x50, 0xff, 0xa5, 0xdb, 0x2d, 0xa4, 0xb5, 0x28, 0x5a, 0x37, 0xf4, 0xae, - 0xf2, 0xf7, 0xe5, 0xdf, 0xff, 0x32, 0x32, 0x07, 0x98, 0x0a, 0x02, 0xee, 0xd8, 0xfb, 0x42, 0xcd, - 0xf8, 0xbf, 0xb3, 0xfe, 0x25, 0xdd, 0x03, 0xc8, 0x2a, 0xff, 0x5b, 0xc4, 0x02, 0x65, 0xa5, 0xfe, - 0x80, 0xa4, 0x01, 0xa9, 0x69, 0x01, 0x6f, 0x4c, 0xfe, 0x08, 0x13, 0xff, 0x3f, 0xf3, 0xff, 0x80, - 0x26, 0x00, 0xb6, 0x51, 0xfe, 0xf7, 0x46, 0xff, 0x09, 0xc2, 0xfd, 0xce, 0x4b, 0x01, 0x51, 0xdd, - 0xff, 0xab, 0x14, 0xff, 0xb6, 0x16, 0x00, 0x70, 0xcf, 0xfe, 0x6d, 0x8b, 0xfe, 0x55, 0x8a, 0xfe, - 0x60, 0x23, 0xff, 0x42, 0x15, 0xff, 0xbc, 0x79, 0x2b, 0x08, 0x3a, 0x29, 0xd9, 0xa0, 0xf5, 0x21, - 0xae, 0xf6, 0x6b, 0xb4, 0xff, 0xa4, 0x4f, 0x07, 0x13, 0xaf, 0x02, 0xe8, 0x61, 0xfc, 0xc4, 0x1e, - 0xf9, 0xf4, 0x29, 0xfe, 0xf9, 0x67, 0x03, 0x64, 0xf8, 0xfe, 0x14, 0x9b, 0x02, 0x2c, 0xee, 0xfe, - 0x63, 0xbb, 0x01, 0xdb, 0xd0, 0x01, 0xbb, 0x83, 0xfe, 0x9b, 0x69, 0xff, 0xef, 0x25, 0x00, 0x4d, - 0xe5, 0xff, 0x8c, 0xfa, 0xfd, 0xed, 0x78, 0xff, 0x9b, 0x78, 0xfd, 0x7e, 0x29, 0x00, 0x93, 0x33, - 0x00, 0xea, 0x31, 0xff, 0xab, 0xbe, 0xff, 0x73, 0xf2, 0xfe, 0x70, 0xe0, 0xfe, 0x47, 0xa5, 0xfe, - 0x8c, 0x3d, 0xff, 0x8d, 0x5d, 0xff, 0x09, 0x44, 0x2b, 0xde, 0x9f, 0x29, 0x1c, 0x60, 0xf5, 0xde, - 0x95, 0xf6, 0x28, 0x43, 0x01, 0x25, 0xd7, 0x07, 0x59, 0x8c, 0x02, 0x36, 0xcf, 0xfb, 0x9d, 0xf2, - 0xf8, 0x47, 0x51, 0xfe, 0x04, 0x85, 0x03, 0xf0, 0x8c, 0xfe, 0x2f, 0x87, 0x01, 0x69, 0x58, 0xff, - 0xfc, 0x93, 0x01, 0xa6, 0xbc, 0x01, 0x09, 0xef, 0xfe, 0x17, 0x99, 0xff, 0xc0, 0x77, 0x00, 0x69, - 0x9f, 0xff, 0x26, 0x50, 0xfd, 0x94, 0xfc, 0xfe, 0xbf, 0xd6, 0xfd, 0x46, 0x0f, 0x00, 0xb2, 0xc3, - 0xff, 0x90, 0x97, 0xff, 0xbb, 0xba, 0xff, 0x5c, 0xeb, 0xfe, 0x5a, 0x0f, 0xff, 0xee, 0x42, 0xfe, - 0xd9, 0x63, 0xff, 0x4c, 0x1e, 0x00, 0x96, 0x5c, 0x2d, 0xd8, 0x4e, 0x29, 0x5d, 0xcd, 0xf3, 0x9c, - 0xfe, 0xf7, 0xd4, 0xa2, 0x03, 0x2e, 0x59, 0x08, 0xda, 0x54, 0x01, 0x88, 0xd8, 0xfa, 0x71, 0xd2, - 0xf8, 0x73, 0xff, 0xfe, 0x73, 0xd7, 0x03, 0xe6, 0x03, 0xfe, 0x67, 0x7c, 0x00, 0xaf, 0xaf, 0xfe, - 0xe1, 0x09, 0x02, 0xff, 0x06, 0x01, 0x28, 0x55, 0xfe, 0x3b, 0x8e, 0x00, 0x5a, 0x72, 0x00, 0xb8, - 0x27, 0xff, 0x6c, 0x4a, 0xfd, 0xc4, 0x6d, 0xfe, 0x76, 0x99, 0xfd, 0x40, 0x9e, 0x00, 0x85, 0xfe, - 0xff, 0xe4, 0x54, 0xff, 0x71, 0x9c, 0xff, 0xd7, 0x3d, 0xff, 0x2f, 0xb2, 0xfe, 0x7e, 0x0b, 0xfe, - 0x95, 0x6f, 0xff, 0x2e, 0x45, 0x00, 0x5b, 0x57, 0x30, 0xc9, 0xd0, 0x29, 0xbc, 0x2e, 0xf2, 0xe7, - 0x18, 0xfa, 0x0a, 0x65, 0x05, 0x09, 0x57, 0x07, 0xfd, 0xbe, 0xff, 0x7a, 0x0e, 0xfa, 0x42, 0x47, - 0xf9, 0x82, 0x60, 0x00, 0x34, 0x8f, 0x04, 0xff, 0x0b, 0xfd, 0x61, 0x5c, 0xff, 0x49, 0xb3, 0xfe, - 0xb0, 0xb8, 0x01, 0x30, 0x15, 0x00, 0x54, 0xe1, 0xfd, 0x2e, 0xfd, 0xff, 0x8b, 0x58, 0x00, 0xda, - 0xed, 0xfe, 0xe7, 0x48, 0xfd, 0x7e, 0xc3, 0xfe, 0x30, 0xcb, 0xfd, 0x56, 0x9d, 0x00, 0x7b, 0xac, - 0xff, 0x14, 0xf7, 0xff, 0xff, 0x69, 0xff, 0x40, 0xb3, 0xfe, 0x1e, 0x79, 0xfe, 0x15, 0xd4, 0xfd, - 0x0a, 0x77, 0xff, 0x74, 0x32, 0x00, 0xb8, 0x8b, 0x34, 0x79, 0x2b, 0x2b, 0xfc, 0x52, 0xf0, 0xda, - 0xd9, 0xfb, 0x2d, 0xff, 0x04, 0x36, 0x05, 0x05, 0x92, 0x92, 0xfe, 0xa1, 0x26, 0xfa, 0x61, 0x23, - 0xfa, 0x2e, 0x4d, 0x02, 0xac, 0x28, 0x05, 0x51, 0xa9, 0xfb, 0x33, 0xec, 0xfe, 0x81, 0xa2, 0xfe, - 0x79, 0x24, 0x01, 0x3c, 0xed, 0xfe, 0xb7, 0x85, 0xfd, 0xec, 0xa4, 0xfe, 0x39, 0x8a, 0xff, 0xc6, - 0x50, 0xff, 0x02, 0x1a, 0xfd, 0xfd, 0x80, 0xff, 0xcb, 0x58, 0xfe, 0x74, 0x66, 0x00, 0x4b, 0x5c, - 0xff, 0xdb, 0x70, 0x00, 0x1e, 0x4b, 0xff, 0xec, 0xc8, 0xfd, 0xc1, 0x6f, 0xfe, 0x75, 0x8b, 0xfd, - 0xdc, 0xf0, 0xfe, 0x00, 0x4d, 0x00, 0x61, 0x8e, 0x39, 0x45, 0x7d, 0x2d, 0x10, 0x43, 0xed, 0x82, - 0x7f, 0xfc, 0x30, 0xc1, 0x02, 0xde, 0x75, 0x02, 0x3d, 0x77, 0xfe, 0x5a, 0xbe, 0xfa, 0x28, 0xd5, - 0xfa, 0x32, 0xec, 0x03, 0xc9, 0x94, 0x05, 0x52, 0x21, 0xfa, 0x35, 0xb2, 0xff, 0xcb, 0x0a, 0xfe, - 0xd1, 0xf7, 0xff, 0xa9, 0xe5, 0xfe, 0x7b, 0x51, 0xfc, 0x24, 0x34, 0xfd, 0x3c, 0x5a, 0xff, 0x3e, - 0x85, 0xff, 0xb2, 0xe5, 0xfc, 0x9c, 0x26, 0x00, 0x39, 0x7b, 0xfe, 0x48, 0x49, 0x00, 0x15, 0xaf, - 0xff, 0x5d, 0x75, 0x00, 0x53, 0xb8, 0xfe, 0x1c, 0x6a, 0xfd, 0xa8, 0x81, 0xfe, 0xd8, 0x9a, 0xfc, - 0xec, 0x77, 0xfe, 0xb5, 0xa2, 0x00, 0x2e, 0x71, 0x3e, 0x19, 0x89, 0x2d, 0x9f, 0x75, 0xea, 0xf6, - 0xd8, 0xfd, 0x6c, 0xd5, 0x00, 0x08, 0xcb, 0x00, 0x3e, 0x98, 0xfe, 0x77, 0x45, 0xfb, 0x2f, 0x54, - 0xfb, 0x9b, 0x39, 0x05, 0xe8, 0xa7, 0x05, 0x9e, 0xac, 0xf9, 0x09, 0x07, 0x01, 0x07, 0x1c, 0xfd, - 0xb5, 0xbb, 0xff, 0xa1, 0x01, 0xff, 0xb8, 0x62, 0xfb, 0x7e, 0x95, 0xfc, 0x61, 0xfc, 0xfe, 0x5d, - 0xf5, 0xff, 0xc0, 0xfa, 0xfc, 0x35, 0x47, 0x00, 0xee, 0xfb, 0xfe, 0x3c, 0x96, 0x00, 0xb7, 0x19, - 0x00, 0xf2, 0x6b, 0x00, 0xc9, 0x84, 0xfe, 0xe4, 0x97, 0xfd, 0xb3, 0xfb, 0xfd, 0x38, 0x36, 0xfc, - 0xec, 0x7b, 0xfe, 0x40, 0x9b, 0x00, 0x3d, 0x28, 0x3f, 0x90, 0x8b, 0x2c, 0x40, 0x9b, 0xe9, 0x7a, - 0x44, 0xff, 0x83, 0x72, 0x00, 0x16, 0x4f, 0x00, 0xf7, 0xdc, 0xfd, 0x66, 0xf0, 0xfa, 0x0f, 0x14, - 0xfb, 0x9a, 0x4e, 0x05, 0x24, 0x0e, 0x06, 0x0d, 0xe8, 0xf9, 0x2a, 0xa1, 0x01, 0x80, 0x66, 0xfd, - 0x74, 0x92, 0xff, 0x72, 0x07, 0xff, 0xff, 0x0a, 0xfc, 0x54, 0x75, 0xfb, 0xfe, 0x85, 0xfe, 0x83, - 0x59, 0x00, 0x35, 0x5e, 0xfc, 0x12, 0xc5, 0x00, 0x4a, 0x96, 0xff, 0xba, 0xc6, 0x00, 0xd6, 0x0e, - 0x00, 0x37, 0xbd, 0x00, 0xbb, 0x9b, 0xfe, 0xa3, 0xf6, 0xfc, 0xda, 0xf9, 0xfd, 0xc0, 0x62, 0xfc, - 0xf0, 0x35, 0xfe, 0x92, 0x38, 0x00, 0x66, 0x6c, 0x3c, 0xb2, 0xc8, 0x29, 0x44, 0x82, 0xeb, 0xb0, - 0xee, 0xff, 0xee, 0x66, 0x01, 0xc9, 0xb5, 0x01, 0xa3, 0x46, 0xfd, 0xde, 0x2f, 0xfa, 0xfb, 0x1b, - 0xfa, 0x6c, 0xad, 0x04, 0xa6, 0xc2, 0x05, 0x9c, 0x43, 0xfb, 0x0a, 0x6e, 0x02, 0x7f, 0x1b, 0xfd, - 0x0e, 0xd5, 0x00, 0x29, 0x63, 0xff, 0xb4, 0x3d, 0xfc, 0x6b, 0x7c, 0xfc, 0x47, 0x91, 0xfd, 0x79, - 0x0b, 0x00, 0xb4, 0x4d, 0xfd, 0x84, 0x5c, 0x00, 0xe2, 0xd4, 0xff, 0x74, 0x4d, 0x01, 0x55, 0xfe, - 0xff, 0x09, 0xb7, 0x00, 0x53, 0xb8, 0xfe, 0x29, 0x0b, 0xfd, 0xa1, 0x02, 0xfe, 0xdb, 0x38, 0xfd, - 0x6b, 0x12, 0xfe, 0x63, 0x92, 0xff, 0x9c, 0x58, 0x2e, 0x21, 0x78, 0x28, 0x48, 0x00, 0xf4, 0x02, - 0x85, 0xfd, 0x24, 0x3d, 0x05, 0xe0, 0x56, 0x02, 0x32, 0xf0, 0xfe, 0xfb, 0x8c, 0xfb, 0xc9, 0x11, - 0xfc, 0xda, 0x32, 0x04, 0x5d, 0xe1, 0x04, 0x8e, 0x02, 0xfd, 0x97, 0xec, 0xff, 0x31, 0x41, 0xff, - 0xfd, 0x8f, 0x00, 0x17, 0xc5, 0xff, 0x32, 0x03, 0xfe, 0xfd, 0x06, 0xfd, 0x99, 0xb3, 0xfe, 0x3c, - 0xbb, 0xff, 0xf3, 0x2f, 0xfd, 0xf0, 0xef, 0xff, 0xee, 0xf2, 0xff, 0x06, 0x3a, 0x01, 0xe6, 0x20, - 0x01, 0x6f, 0xfb, 0x00, 0x79, 0x9b, 0xfe, 0xee, 0x8a, 0xfc, 0x4e, 0x14, 0xfd, 0x06, 0xda, 0xfd, - 0x86, 0xcb, 0xff, 0x42, 0xd8, 0x00, 0x12, 0x11, 0x12, 0x12, 0x14, 0x13, 0x12, 0x11, 0x10, 0x10, - 0x0f, 0x0f, 0x10, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x13, 0x16, 0x14, 0x13, 0x12, 0x12, 0x11, 0x10, - 0x0f, 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0f, 0x10, 0x11, 0x11, - 0x12, 0x13, 0x13, 0x14, 0x17, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, - 0x0c, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0c, - 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x15, 0x18, 0x17, 0x16, 0x15, 0x14, 0x14, - 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0a, 0x0c, 0x0d, 0x0e, - 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x1b, 0x18, 0x17, 0x16, 0x15, 0x14, - 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, - 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, - 0x17, 0x18, 0x1d, 0x1a, 0x19, 0x19, 0x18, 0x17, 0x16, 0x15, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, - 0x09, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x20, 0x1b, 0x1a, 0x19, 0x19, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x14, 0x13, 0x12, 0x11, 0x11, - 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x03, - 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, - 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, - 0x11, 0x12, 0x13, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, - 0x16, 0x15, 0x15, 0x14, 0x13, 0x12, 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, - 0x08, 0x07, 0x06, 0x05, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, - 0x1b, 0x1c, 0x1e, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x07, 0x08, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x1b, 0x1a, 0x19, 0x18, - 0x17, 0x16, 0x15, 0x14, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, - 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, - 0x1b, 0x1c, 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, - 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, - 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, - 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x17, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, - 0x11, 0x10, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, 0x04, 0x03, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, - 0x05, 0x05, 0x06, 0x07, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x16, - 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x15, 0x13, 0x13, 0x11, 0x10, 0x0f, 0x0e, - 0x0d, 0x0c, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x06, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, - 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, - 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x09, 0x09, 0x0a, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x07, 0x07, - 0x07, 0x05, -}; diff --git a/build/default-48000.mhr.h b/build/default-48000.mhr.h deleted file mode 100644 index 4cf0797..0000000 --- a/build/default-48000.mhr.h +++ /dev/null @@ -1,5025 +0,0 @@ -static const unsigned char hrtf_default_48000[] = { - 0x4d, 0x69, 0x6e, 0x50, 0x48, 0x52, 0x30, 0x32, 0x80, 0xbb, 0x00, 0x00, 0x01, 0x00, 0x20, 0x01, - 0x78, 0x05, 0x13, 0x01, 0x0c, 0x18, 0x24, 0x2d, 0x38, 0x3c, 0x48, 0x48, 0x48, 0x48, 0x48, 0x3c, - 0x38, 0x2d, 0x24, 0x18, 0x0c, 0x01, 0x88, 0x69, 0x16, 0x08, 0x0c, 0x22, 0x83, 0xe8, 0x10, 0x65, - 0xc8, 0x0a, 0xa3, 0xdf, 0x07, 0x72, 0xc9, 0x00, 0x0e, 0x0c, 0x03, 0x41, 0x89, 0x01, 0xe3, 0x24, - 0xfa, 0x13, 0x31, 0xf6, 0x24, 0x57, 0xfc, 0xe1, 0x71, 0x02, 0x72, 0x9c, 0xff, 0xfc, 0x9c, 0xfd, - 0x66, 0x0c, 0xfc, 0x79, 0x8c, 0xfb, 0xbd, 0xc9, 0xfd, 0x97, 0xe5, 0xfe, 0x13, 0x35, 0xff, 0x76, - 0x4a, 0xff, 0xd9, 0xdc, 0xff, 0x3a, 0x1b, 0xff, 0x6d, 0x9e, 0xfe, 0x3b, 0x2e, 0xff, 0x91, 0x63, - 0xfe, 0x77, 0xa0, 0xfe, 0xb0, 0x92, 0xfe, 0x91, 0xa4, 0xfd, 0x9d, 0xe0, 0xfd, 0x75, 0x75, 0xfe, - 0x2a, 0x07, 0xff, 0x53, 0x56, 0xff, 0xd2, 0xe0, 0x19, 0x80, 0xf0, 0x23, 0x6b, 0xa6, 0x0e, 0x49, - 0x54, 0x0b, 0xee, 0x18, 0x09, 0x88, 0x86, 0xff, 0xcb, 0x6f, 0x02, 0x17, 0x92, 0x01, 0x0a, 0x52, - 0xfa, 0xbf, 0xa5, 0xf5, 0xd8, 0x08, 0xfb, 0x1d, 0x6e, 0x02, 0x05, 0x6d, 0x00, 0xae, 0xbf, 0xfd, - 0xe0, 0x8a, 0xfc, 0x66, 0x26, 0xfc, 0x98, 0x46, 0xfc, 0x14, 0x70, 0xfd, 0x7d, 0xa3, 0xff, 0xae, - 0x5e, 0xff, 0x3d, 0x5c, 0xff, 0x9f, 0xce, 0xfe, 0x6f, 0x30, 0xfe, 0x41, 0xc7, 0xfe, 0xa8, 0x46, - 0xfe, 0x53, 0x7d, 0xfe, 0x5b, 0x8b, 0xfe, 0xeb, 0xe6, 0xfd, 0x97, 0xd7, 0xfd, 0x68, 0x8d, 0xfe, - 0x98, 0x87, 0xff, 0xbb, 0x91, 0xff, 0xb0, 0x9b, 0x17, 0x79, 0x59, 0x21, 0x6f, 0x3c, 0x0e, 0x85, - 0x15, 0x0a, 0x1d, 0x01, 0x08, 0xfc, 0xa1, 0x00, 0x3d, 0x32, 0x03, 0x67, 0x36, 0x01, 0xd0, 0x01, - 0xfa, 0x42, 0xa2, 0xf6, 0x82, 0x91, 0xfc, 0x17, 0x25, 0x02, 0x3d, 0x52, 0xff, 0xf5, 0xcc, 0xfd, - 0xc7, 0xd5, 0xfc, 0xf0, 0xb1, 0xfc, 0x18, 0xf7, 0xfd, 0xac, 0x55, 0xfe, 0x62, 0x5e, 0xff, 0xbe, - 0xce, 0xff, 0x1b, 0xf3, 0xff, 0x57, 0xe7, 0xfe, 0xbb, 0x89, 0xfe, 0x2c, 0x3d, 0xff, 0x19, 0x6f, - 0xfe, 0xfb, 0x91, 0xfe, 0x3d, 0x5d, 0xfe, 0x9c, 0x9f, 0xfd, 0x0e, 0x0f, 0xfe, 0xcb, 0x8d, 0xfe, - 0x40, 0x1b, 0xff, 0x61, 0x6d, 0xff, 0x33, 0xfa, 0x15, 0x34, 0xf0, 0x1e, 0xdc, 0x1b, 0x0d, 0x61, - 0x48, 0x09, 0x99, 0x45, 0x07, 0x91, 0x9d, 0x00, 0xbd, 0x55, 0x03, 0x7f, 0x63, 0x01, 0x7e, 0x57, - 0xfa, 0x75, 0x66, 0xf7, 0xbf, 0xb8, 0xfd, 0x6a, 0xd8, 0x02, 0x43, 0x92, 0xff, 0xa3, 0x4b, 0xfe, - 0x1e, 0x4f, 0xfd, 0x94, 0xda, 0xfc, 0x90, 0x8d, 0xfe, 0x77, 0x19, 0xff, 0x47, 0x50, 0xff, 0x09, - 0x68, 0xff, 0xa3, 0xec, 0xff, 0xca, 0x21, 0xff, 0xae, 0xd1, 0xfe, 0xa7, 0x76, 0xff, 0x88, 0x9f, - 0xfe, 0x18, 0xe0, 0xfe, 0x61, 0xbc, 0xfe, 0x86, 0xd9, 0xfd, 0x25, 0x27, 0xfe, 0xf1, 0xa1, 0xfe, - 0xfd, 0x25, 0xff, 0x55, 0x72, 0xff, 0x10, 0x9a, 0x15, 0x6b, 0x76, 0x1e, 0x46, 0xed, 0x0c, 0xf9, - 0x22, 0x09, 0xfb, 0x33, 0x07, 0x3b, 0xd2, 0x00, 0x23, 0xb9, 0x03, 0x39, 0xde, 0x01, 0x48, 0xd2, - 0xfa, 0xb0, 0xdb, 0xf7, 0x61, 0x20, 0xfe, 0xce, 0x1d, 0x03, 0x59, 0xac, 0xff, 0x0e, 0x22, 0xfe, - 0x22, 0xed, 0xfc, 0x78, 0x9f, 0xfc, 0xca, 0xaa, 0xfe, 0x12, 0x46, 0xff, 0x6b, 0x53, 0xff, 0xda, - 0x5d, 0xff, 0x5c, 0xf2, 0xff, 0x27, 0x2e, 0xff, 0xf0, 0xda, 0xfe, 0x61, 0x89, 0xff, 0xd3, 0xc0, - 0xfe, 0xc8, 0x11, 0xff, 0x48, 0xfe, 0xfe, 0xa2, 0x0d, 0xfe, 0x74, 0x42, 0xfe, 0x9c, 0xac, 0xfe, - 0xf6, 0x0f, 0xff, 0x4a, 0x43, 0xff, 0x21, 0x28, 0x16, 0xb5, 0x55, 0x1f, 0x63, 0x31, 0x0d, 0x75, - 0xe0, 0x08, 0x0b, 0xba, 0x06, 0x82, 0x4a, 0x00, 0xb0, 0x5a, 0x03, 0xe7, 0x7f, 0x01, 0x89, 0x44, - 0xfa, 0x94, 0x00, 0xf7, 0xe0, 0x71, 0xfd, 0x8c, 0x2f, 0x03, 0x1a, 0x02, 0x00, 0xe6, 0x33, 0xfe, - 0x58, 0xc5, 0xfc, 0xa7, 0x65, 0xfc, 0x1f, 0x94, 0xfe, 0x01, 0x76, 0xff, 0x4d, 0xaa, 0xff, 0x84, - 0x9f, 0xff, 0xa9, 0x24, 0x00, 0x30, 0x66, 0xff, 0xb8, 0xfd, 0xfe, 0x03, 0x8f, 0xff, 0x1b, 0xb4, - 0xfe, 0x63, 0xf0, 0xfe, 0x11, 0xd5, 0xfe, 0x08, 0xf0, 0xfd, 0xff, 0x3c, 0xfe, 0xb7, 0xcc, 0xfe, - 0x2c, 0x59, 0xff, 0x56, 0xaa, 0xff, 0xdd, 0x3a, 0x18, 0x59, 0xf3, 0x21, 0x82, 0xb0, 0x0d, 0x3d, - 0x33, 0x09, 0x94, 0x21, 0x07, 0xa6, 0x22, 0x00, 0x0d, 0x75, 0x03, 0x9c, 0x13, 0x01, 0x4a, 0x03, - 0xf9, 0xc5, 0x64, 0xf5, 0xca, 0xa9, 0xfc, 0x94, 0x8b, 0x03, 0x4f, 0xe3, 0xff, 0x5b, 0x5b, 0xfd, - 0xaf, 0xd4, 0xfb, 0x7b, 0xb0, 0xfb, 0x7e, 0x34, 0xfe, 0x80, 0x44, 0xff, 0x89, 0x81, 0xff, 0xfc, - 0x6d, 0xff, 0xeb, 0x23, 0x00, 0x09, 0x51, 0xff, 0x55, 0xc1, 0xfe, 0xda, 0x7e, 0xff, 0xfb, 0xaf, - 0xfe, 0xe8, 0xf3, 0xfe, 0x98, 0xd5, 0xfe, 0xb7, 0xe3, 0xfd, 0xcb, 0x38, 0xfe, 0x5a, 0xd9, 0xfe, - 0x13, 0x67, 0xff, 0x26, 0x97, 0xff, 0xfd, 0x9b, 0x19, 0xa4, 0xa1, 0x24, 0x3b, 0x3f, 0x0f, 0x58, - 0xb2, 0x09, 0x2a, 0x88, 0x07, 0xa9, 0xa3, 0xff, 0xf2, 0xe9, 0x02, 0x75, 0xca, 0x00, 0x6d, 0x37, - 0xf8, 0x2a, 0x28, 0xf5, 0x4e, 0x87, 0xfc, 0x33, 0x72, 0x02, 0x7a, 0x2b, 0xff, 0x76, 0x93, 0xfd, - 0x3f, 0xf8, 0xfb, 0x06, 0x8b, 0xfb, 0x7c, 0xea, 0xfd, 0x78, 0xca, 0xfe, 0x84, 0x82, 0xff, 0x4a, - 0xcb, 0xff, 0xe8, 0x06, 0x00, 0x67, 0xfe, 0xfe, 0x5f, 0x88, 0xfe, 0xfe, 0x42, 0xff, 0x5c, 0x73, - 0xfe, 0x06, 0xba, 0xfe, 0xf8, 0x8b, 0xfe, 0x3d, 0xa5, 0xfd, 0xc8, 0x16, 0xfe, 0xc8, 0x97, 0xfe, - 0xa8, 0x33, 0xff, 0x36, 0x89, 0xff, 0x48, 0x4a, 0x1b, 0xc6, 0xb1, 0x25, 0x84, 0xbf, 0x0e, 0x0c, - 0xab, 0x0a, 0x87, 0xec, 0x08, 0xe8, 0xdc, 0xff, 0x31, 0x71, 0x02, 0x41, 0x9b, 0xff, 0x6d, 0x2b, - 0xf7, 0x34, 0x3f, 0xf6, 0xe0, 0xe3, 0xfe, 0x7c, 0x9b, 0x01, 0x73, 0x09, 0xfc, 0xe8, 0x5e, 0xfc, - 0x04, 0x85, 0xfc, 0x74, 0xf8, 0xfc, 0x68, 0x40, 0xff, 0x24, 0x99, 0xfe, 0xf7, 0x8f, 0xfe, 0x7d, - 0x9b, 0xff, 0xc4, 0x3b, 0x00, 0x03, 0xdb, 0xfe, 0x69, 0xa2, 0xfe, 0x29, 0x5f, 0xff, 0x1f, 0x33, - 0xfe, 0xd2, 0x88, 0xfe, 0x7a, 0x27, 0xfe, 0xd8, 0x23, 0xfd, 0xfb, 0xeb, 0xfd, 0x25, 0x70, 0xfe, - 0x25, 0xc4, 0xfe, 0x56, 0x2c, 0xff, 0x98, 0x09, 0x1f, 0x46, 0x54, 0x29, 0x19, 0x99, 0x0c, 0x6e, - 0xaa, 0x07, 0x6c, 0xc8, 0x06, 0xc8, 0x76, 0xfe, 0x06, 0x67, 0x04, 0x49, 0xad, 0x01, 0x73, 0xc0, - 0xf6, 0x8f, 0x35, 0xf5, 0x66, 0x7e, 0x00, 0xad, 0xc6, 0x04, 0xcd, 0x2b, 0xfc, 0xb4, 0x52, 0xfa, - 0xf9, 0xa2, 0xfa, 0xba, 0x4b, 0xfc, 0x1e, 0x04, 0x00, 0xc4, 0xe4, 0xfe, 0x93, 0xa9, 0xfd, 0x81, - 0xbf, 0xfe, 0xa2, 0x52, 0x00, 0xf3, 0xb2, 0xfe, 0x4d, 0x1a, 0xfe, 0xea, 0x65, 0xff, 0x68, 0x1f, - 0xfe, 0x8b, 0x98, 0xfe, 0xa9, 0x38, 0xfe, 0x0f, 0xa4, 0xfc, 0xc0, 0x92, 0xfd, 0x44, 0x8b, 0xfe, - 0xed, 0xf3, 0xfe, 0xbe, 0x28, 0xff, 0xf2, 0x3d, 0x20, 0x13, 0xdd, 0x2a, 0x3d, 0x8d, 0x0d, 0x9f, - 0x8c, 0x07, 0x90, 0x0c, 0x05, 0x0f, 0xa1, 0xfd, 0x53, 0xba, 0x04, 0x70, 0x7c, 0x02, 0x76, 0x2e, - 0xf7, 0x6a, 0x0a, 0xf3, 0x7e, 0x28, 0xff, 0xc9, 0xd4, 0x06, 0xa0, 0x09, 0xff, 0x43, 0xd2, 0xfa, - 0xcf, 0xf7, 0xf7, 0x50, 0xe4, 0xf9, 0x2c, 0x02, 0x00, 0x43, 0x8e, 0x00, 0xbd, 0x84, 0xfe, 0xd3, - 0xd1, 0xfd, 0xdd, 0xbc, 0xff, 0x89, 0x86, 0xfe, 0x78, 0xde, 0xfd, 0x07, 0x1f, 0xff, 0xba, 0xc0, - 0xfd, 0x1c, 0x97, 0xfe, 0x2b, 0x64, 0xfe, 0xe7, 0xe1, 0xfc, 0x81, 0x8b, 0xfd, 0x98, 0x81, 0xfe, - 0x6e, 0x35, 0xff, 0xf7, 0x35, 0xff, 0x64, 0xb7, 0x1e, 0x53, 0xbf, 0x29, 0xc7, 0x4a, 0x10, 0x20, - 0x18, 0x0a, 0xb3, 0xbc, 0x05, 0x9d, 0x25, 0xfe, 0x0f, 0x58, 0x03, 0x17, 0xa0, 0x01, 0xd2, 0xa4, - 0xf7, 0xfc, 0x5c, 0xf1, 0x6f, 0x56, 0xfc, 0xd4, 0x6d, 0x05, 0xbe, 0x9c, 0x00, 0x71, 0xf2, 0xfe, - 0xbb, 0x80, 0xf9, 0xb9, 0x0e, 0xf7, 0xd8, 0xed, 0xfd, 0xa2, 0xf5, 0x00, 0x5a, 0xe6, 0xff, 0xb2, - 0xf1, 0xfe, 0xd2, 0x8b, 0xff, 0xe8, 0x88, 0xfe, 0x03, 0x4d, 0xfe, 0x71, 0x1a, 0xff, 0xe4, 0xb4, - 0xfd, 0x99, 0xbf, 0xfe, 0x06, 0x73, 0xfe, 0x32, 0x79, 0xfc, 0xd4, 0x52, 0xfd, 0xb8, 0x2f, 0xfe, - 0xca, 0xe1, 0xfe, 0x33, 0x7c, 0xff, 0x39, 0xd2, 0x1c, 0xf8, 0xe9, 0x27, 0xab, 0x7f, 0x0f, 0xe2, - 0x81, 0x0a, 0x73, 0xfb, 0x07, 0xfd, 0xf3, 0xfe, 0x8b, 0x8c, 0x02, 0x59, 0x7f, 0x00, 0x80, 0xc8, - 0xf8, 0xde, 0x2b, 0xf4, 0x5b, 0xda, 0xfa, 0x8f, 0x2d, 0x04, 0x86, 0x71, 0x00, 0xc9, 0x24, 0xfd, - 0xc5, 0x66, 0xfc, 0x3d, 0x6d, 0xf9, 0xd7, 0x65, 0xfa, 0x02, 0x9a, 0xfe, 0x14, 0x66, 0x00, 0x27, - 0xae, 0xff, 0x2e, 0x2a, 0x00, 0x36, 0x6e, 0xff, 0xbc, 0x82, 0xfe, 0x62, 0xa3, 0xfe, 0x3c, 0x78, - 0xfd, 0x5c, 0x01, 0xfe, 0x68, 0xc2, 0xfe, 0x09, 0xad, 0xfd, 0xd3, 0x62, 0xfd, 0x6a, 0x44, 0xfe, - 0x93, 0x13, 0xff, 0x23, 0x6e, 0xff, 0xb0, 0xb1, 0x1d, 0x55, 0x5f, 0x25, 0x5f, 0xe1, 0x0b, 0xe7, - 0xaa, 0x0c, 0x01, 0x89, 0x0a, 0x6b, 0xa2, 0xfd, 0xec, 0xc7, 0x01, 0x08, 0xe7, 0x01, 0x9e, 0xca, - 0xfa, 0x3d, 0xde, 0xf4, 0x21, 0x28, 0xf9, 0xaf, 0xb6, 0x02, 0x11, 0xc3, 0x01, 0xd8, 0xb5, 0xfd, - 0xf8, 0x27, 0xfd, 0x60, 0xc6, 0xfc, 0x17, 0xfa, 0xf9, 0x79, 0xf6, 0xfb, 0x23, 0xb5, 0x00, 0xa1, - 0x5e, 0xff, 0xda, 0xa4, 0xfe, 0x4b, 0x9a, 0xfe, 0x78, 0xb9, 0xfd, 0x39, 0x5a, 0xfe, 0xa6, 0x4b, - 0xfe, 0xcb, 0x53, 0xfe, 0x34, 0x8e, 0xfe, 0x37, 0x4a, 0xfe, 0x6c, 0xb0, 0xfd, 0x3a, 0xaa, 0xfe, - 0x9d, 0x28, 0x00, 0x6b, 0xb8, 0xff, 0x21, 0x6d, 0x1a, 0x46, 0x91, 0x22, 0x96, 0xd1, 0x0c, 0x65, - 0x0e, 0x0c, 0xb7, 0x52, 0x09, 0xed, 0x92, 0xfe, 0x91, 0x6d, 0x02, 0x3d, 0x39, 0x01, 0x6b, 0x32, - 0xfa, 0xc2, 0xb9, 0xf6, 0x48, 0x0f, 0xfb, 0x24, 0x37, 0x01, 0x23, 0xd6, 0xff, 0xf9, 0x09, 0xfe, - 0x33, 0xb4, 0xfd, 0xf7, 0xd7, 0xfd, 0xe1, 0xb3, 0xfc, 0xa8, 0x3c, 0xfc, 0x22, 0x23, 0xff, 0xd0, - 0x58, 0x00, 0xd4, 0xf8, 0xff, 0xd1, 0x8c, 0xfe, 0xb7, 0x02, 0xfe, 0x77, 0xf0, 0xfe, 0x5a, 0x8a, - 0xfe, 0xc3, 0x9a, 0xfe, 0x24, 0x6a, 0xfe, 0x30, 0xec, 0xfd, 0x83, 0x41, 0xfe, 0xfe, 0xbf, 0xfe, - 0x03, 0x47, 0xff, 0x21, 0x43, 0xff, 0x2d, 0x68, 0x18, 0x01, 0x0d, 0x20, 0x3c, 0xc3, 0x0b, 0x51, - 0xf0, 0x09, 0xf2, 0x62, 0x08, 0x3c, 0x93, 0x00, 0x97, 0x38, 0x03, 0x39, 0xd0, 0x00, 0x47, 0x29, - 0xfa, 0xdb, 0x44, 0xf7, 0xf6, 0x6c, 0xfc, 0xbb, 0x8d, 0x01, 0x02, 0x41, 0xff, 0x53, 0x2e, 0xfe, - 0xc8, 0xd6, 0xfd, 0xd2, 0xf3, 0xfd, 0x89, 0xbc, 0xfd, 0x9c, 0x83, 0xfd, 0x73, 0xc5, 0xff, 0x81, - 0x75, 0x00, 0x33, 0xe2, 0xff, 0xea, 0xa2, 0xfe, 0x4c, 0x7f, 0xfe, 0x7b, 0x50, 0xff, 0x85, 0x83, - 0xfe, 0x5b, 0x75, 0xfe, 0xa5, 0x1b, 0xfe, 0x3f, 0xb2, 0xfd, 0xa3, 0x48, 0xfe, 0xeb, 0x9a, 0xfe, - 0x4e, 0x2b, 0xff, 0xa5, 0x85, 0xff, 0x78, 0x90, 0x16, 0xc7, 0x9b, 0x1d, 0xa0, 0x9e, 0x0a, 0x07, - 0x0f, 0x09, 0x6f, 0xff, 0x07, 0xbc, 0xb8, 0x00, 0xa7, 0x17, 0x03, 0xc3, 0xd5, 0x00, 0x52, 0x6a, - 0xfa, 0x98, 0x16, 0xf8, 0xd0, 0x97, 0xfd, 0xae, 0xb4, 0x01, 0x4d, 0xdd, 0xfe, 0x7e, 0xa7, 0xfe, - 0x9a, 0x77, 0xfe, 0xac, 0x05, 0xfe, 0x59, 0x6c, 0xfe, 0xa7, 0x7a, 0xfe, 0x46, 0x92, 0xff, 0xf0, - 0xde, 0xff, 0xb4, 0xdb, 0xff, 0x92, 0xd9, 0xfe, 0xe1, 0xac, 0xfe, 0xc6, 0x5f, 0xff, 0x73, 0xa6, - 0xfe, 0x81, 0xe1, 0xfe, 0x64, 0xa3, 0xfe, 0xe7, 0x05, 0xfe, 0x6d, 0x3c, 0xfe, 0xa8, 0x6b, 0xfe, - 0xfe, 0x1e, 0xff, 0x21, 0x8f, 0xff, 0xd0, 0x9b, 0x14, 0x00, 0xf2, 0x1a, 0xec, 0xea, 0x09, 0xbf, - 0x76, 0x08, 0x2b, 0xf3, 0x06, 0xee, 0xc6, 0x00, 0xa9, 0x8f, 0x03, 0x45, 0x2e, 0x01, 0x25, 0xe2, - 0xfa, 0x47, 0xf2, 0xf8, 0xcc, 0xdd, 0xfe, 0xda, 0xcf, 0x02, 0x45, 0x99, 0xff, 0x6a, 0x3e, 0xff, - 0xad, 0xc8, 0xfe, 0x7f, 0x2a, 0xfe, 0x53, 0x0c, 0xff, 0xdb, 0x1b, 0xff, 0xee, 0x64, 0xff, 0x8f, - 0x87, 0xff, 0x72, 0xf3, 0xff, 0xb6, 0x2e, 0xff, 0xb6, 0x14, 0xff, 0xe5, 0xbe, 0xff, 0x2b, 0xe1, - 0xfe, 0x35, 0x1b, 0xff, 0x01, 0xe0, 0xfe, 0x1c, 0x1a, 0xfe, 0x18, 0x6d, 0xfe, 0x5b, 0xc1, 0xfe, - 0x9f, 0x3d, 0xff, 0x7e, 0x8d, 0xff, 0x50, 0xc7, 0x13, 0xc2, 0x76, 0x19, 0xbc, 0xb8, 0x08, 0x97, - 0x5e, 0x07, 0x23, 0x38, 0x06, 0x18, 0xca, 0x00, 0x4e, 0x08, 0x04, 0xab, 0x37, 0x02, 0x7b, 0x50, - 0xfc, 0xb6, 0x69, 0xfa, 0xc6, 0x2a, 0x00, 0xf7, 0xc1, 0x03, 0x9d, 0x1e, 0x00, 0x60, 0x33, 0xff, - 0xbd, 0x51, 0xfe, 0x18, 0xcc, 0xfd, 0xdf, 0x25, 0xff, 0x75, 0x75, 0xff, 0x76, 0x99, 0xff, 0xff, - 0x9c, 0xff, 0xa8, 0x0d, 0x00, 0xd9, 0x43, 0xff, 0x54, 0x08, 0xff, 0xa0, 0xb3, 0xff, 0xe9, 0x09, - 0xff, 0x05, 0x63, 0xff, 0x76, 0x20, 0xff, 0xb7, 0x48, 0xfe, 0x9a, 0xa8, 0xfe, 0xa6, 0x12, 0xff, - 0xf1, 0x7a, 0xff, 0x7c, 0x9d, 0xff, 0xe6, 0xbb, 0x13, 0x73, 0xf4, 0x19, 0x12, 0xa6, 0x09, 0x29, - 0x30, 0x08, 0x9e, 0xd6, 0x06, 0xb6, 0x47, 0x01, 0xf8, 0x66, 0x04, 0x28, 0x2c, 0x02, 0x20, 0xd8, - 0xfb, 0xea, 0xda, 0xf9, 0x82, 0xa8, 0xff, 0x24, 0x4f, 0x03, 0xa4, 0xbe, 0xff, 0x47, 0xd4, 0xfe, - 0x0b, 0xf1, 0xfd, 0x25, 0xc0, 0xfd, 0x74, 0x64, 0xff, 0x90, 0x7b, 0xff, 0xd4, 0x5d, 0xff, 0x24, - 0x6e, 0xff, 0xe8, 0x03, 0x00, 0xe1, 0x49, 0xff, 0x53, 0x26, 0xff, 0x6c, 0xe7, 0xff, 0xb7, 0x28, - 0xff, 0x33, 0x84, 0xff, 0x6a, 0x69, 0xff, 0x0e, 0x7e, 0xfe, 0x55, 0x9b, 0xfe, 0xd0, 0xd0, 0xfe, - 0x86, 0x06, 0xff, 0xa4, 0x26, 0xff, 0xf7, 0x11, 0x14, 0x77, 0x44, 0x1a, 0xc2, 0x5f, 0x09, 0x53, - 0x92, 0x07, 0xcb, 0x4c, 0x06, 0x68, 0xfe, 0x00, 0x98, 0x5e, 0x04, 0x59, 0x44, 0x02, 0x96, 0xc2, - 0xfb, 0xf0, 0x73, 0xf9, 0xd9, 0x6f, 0xff, 0x31, 0x7b, 0x03, 0x65, 0xca, 0xff, 0x9b, 0x8c, 0xfe, - 0xe6, 0x87, 0xfd, 0xc1, 0x5a, 0xfd, 0x03, 0x6b, 0xff, 0xc0, 0x22, 0x00, 0x30, 0x26, 0x00, 0x5a, - 0xe8, 0xff, 0xe0, 0x2c, 0x00, 0x84, 0x42, 0xff, 0x46, 0x00, 0xff, 0x3f, 0x9e, 0xff, 0x9c, 0xd1, - 0xfe, 0x62, 0x32, 0xff, 0x66, 0x31, 0xff, 0x44, 0x9d, 0xfe, 0x84, 0x14, 0xff, 0x84, 0x4f, 0xff, - 0xf9, 0x55, 0xff, 0x7e, 0x3b, 0xff, 0xc8, 0x06, 0x15, 0x0c, 0xd0, 0x1b, 0x93, 0xfc, 0x09, 0x59, - 0x7c, 0x07, 0x49, 0xce, 0x05, 0xcd, 0x32, 0x00, 0x6f, 0xb7, 0x03, 0x39, 0x70, 0x01, 0x0f, 0xad, - 0xfa, 0x76, 0x0a, 0xf8, 0xeb, 0x58, 0xfe, 0x97, 0xb2, 0x03, 0xa2, 0x83, 0x00, 0xc2, 0xe2, 0xfe, - 0x6b, 0x8d, 0xfd, 0x9d, 0x45, 0xfd, 0x61, 0x42, 0xff, 0x39, 0xf3, 0xff, 0x91, 0x19, 0x00, 0x22, - 0xeb, 0xff, 0x1b, 0x63, 0x00, 0x96, 0xbb, 0xff, 0xfb, 0x64, 0xff, 0xc1, 0xe8, 0xff, 0xc1, 0x08, - 0xff, 0x4c, 0x3a, 0xff, 0x16, 0x14, 0xff, 0x89, 0x46, 0xfe, 0x8e, 0x98, 0xfe, 0xca, 0x1d, 0xff, - 0x14, 0xa7, 0xff, 0x39, 0xff, 0xff, 0x6d, 0xca, 0x16, 0x17, 0x0f, 0x1e, 0xbc, 0x94, 0x0a, 0x7d, - 0xf5, 0x07, 0xd0, 0x2f, 0x06, 0x0b, 0x14, 0x00, 0xcc, 0xce, 0x03, 0xc2, 0x06, 0x01, 0x96, 0x72, - 0xf9, 0x04, 0x29, 0xf6, 0x02, 0x21, 0xfd, 0x8a, 0xe7, 0x03, 0x39, 0x69, 0x00, 0x7b, 0xf1, 0xfd, - 0xac, 0x94, 0xfc, 0xff, 0x99, 0xfc, 0x77, 0x03, 0xff, 0x0a, 0x1f, 0x00, 0x45, 0x4a, 0x00, 0x68, - 0x00, 0x00, 0x54, 0xb7, 0x00, 0xba, 0xec, 0xff, 0xf0, 0x46, 0xff, 0x41, 0xd7, 0xff, 0x80, 0xf8, - 0xfe, 0x36, 0x3f, 0xff, 0xce, 0x3e, 0xff, 0x82, 0x73, 0xfe, 0x23, 0xcc, 0xfe, 0x75, 0x67, 0xff, - 0xd0, 0xbd, 0xff, 0xc1, 0xb8, 0xff, 0xea, 0xda, 0x19, 0x91, 0x41, 0x21, 0xaa, 0x4a, 0x0a, 0x9a, - 0x0a, 0x08, 0x4f, 0xa3, 0x06, 0x42, 0xb4, 0xff, 0xab, 0xff, 0x03, 0x5a, 0x6c, 0x00, 0x58, 0xe2, - 0xf7, 0x97, 0xb1, 0xf4, 0xec, 0x0c, 0xfd, 0x2b, 0xce, 0x04, 0x64, 0x22, 0x00, 0xa4, 0xf2, 0xfc, - 0x1f, 0xa1, 0xfb, 0x6c, 0xee, 0xfb, 0x3e, 0xa0, 0xfe, 0xcb, 0xa0, 0xff, 0xab, 0xcb, 0xff, 0x55, - 0x85, 0xff, 0x8a, 0x71, 0x00, 0x56, 0x8b, 0xff, 0xfb, 0xde, 0xfe, 0x5b, 0xd6, 0xff, 0x2b, 0x05, - 0xff, 0x15, 0x44, 0xff, 0x46, 0x14, 0xff, 0x9f, 0x29, 0xfe, 0x9d, 0x92, 0xfe, 0xb8, 0x3c, 0xff, - 0x93, 0xc3, 0xff, 0xff, 0xcd, 0xff, 0x79, 0x58, 0x1c, 0xa9, 0xcf, 0x24, 0x34, 0xdb, 0x0a, 0xcb, - 0xc5, 0x07, 0xf3, 0xe7, 0x06, 0xe4, 0x34, 0xff, 0x53, 0xfa, 0x03, 0x62, 0xf7, 0xff, 0xd9, 0x4d, - 0xf6, 0x79, 0xd7, 0xf3, 0xb1, 0x11, 0xfd, 0x83, 0xb7, 0x04, 0xd2, 0xef, 0xff, 0x97, 0xdf, 0xfc, - 0x9d, 0x0e, 0xfb, 0x63, 0x57, 0xfb, 0x8a, 0x6c, 0xfe, 0x6a, 0x50, 0xff, 0xeb, 0xde, 0xff, 0x20, - 0x9a, 0xff, 0x9e, 0x27, 0x00, 0x58, 0x56, 0xff, 0x43, 0xa8, 0xfe, 0xa9, 0x76, 0xff, 0xb0, 0x76, - 0xfe, 0x1f, 0xda, 0xfe, 0xeb, 0xb2, 0xfe, 0xec, 0xce, 0xfd, 0xbd, 0x75, 0xfe, 0xaa, 0x20, 0xff, - 0x23, 0xcb, 0xff, 0xc2, 0xd4, 0xff, 0x5d, 0x11, 0x1d, 0x73, 0x11, 0x27, 0xe9, 0x0e, 0x0d, 0xe3, - 0xaa, 0x08, 0xef, 0x63, 0x07, 0x46, 0x6a, 0xfe, 0xcb, 0xe1, 0x02, 0x80, 0xef, 0xff, 0xad, 0x20, - 0xf6, 0x72, 0x65, 0xf4, 0xcf, 0xd2, 0xfc, 0xa3, 0x4a, 0x02, 0xdd, 0xce, 0xfe, 0x50, 0xb3, 0xfd, - 0x62, 0xe5, 0xfb, 0x37, 0x8b, 0xfb, 0xff, 0xfe, 0xfd, 0x50, 0x9c, 0xfe, 0x56, 0xf5, 0xff, 0x49, - 0x60, 0x00, 0xc8, 0x10, 0x00, 0x7b, 0xd2, 0xfe, 0x9c, 0x74, 0xfe, 0x17, 0x5e, 0xff, 0xa4, 0x8b, - 0xfe, 0x30, 0xd1, 0xfe, 0xe4, 0x7b, 0xfe, 0x19, 0xb0, 0xfd, 0x24, 0x58, 0xfe, 0xa8, 0xaf, 0xfe, - 0xe6, 0x60, 0xff, 0xa8, 0xbe, 0xff, 0xbe, 0x06, 0x1e, 0xbc, 0xf0, 0x27, 0x35, 0xcc, 0x0d, 0x31, - 0x72, 0x0a, 0x9d, 0x29, 0x09, 0x6a, 0xb3, 0xfe, 0x0a, 0x90, 0x01, 0x74, 0x5b, 0xfe, 0xe5, 0x3a, - 0xf5, 0xd5, 0xa0, 0xf5, 0x46, 0x9f, 0xfe, 0x1a, 0x3c, 0x00, 0x9b, 0xcb, 0xfb, 0x52, 0x8d, 0xfd, - 0x12, 0x3a, 0xfd, 0x6a, 0x4a, 0xfd, 0x4a, 0xbe, 0xfe, 0x5e, 0x86, 0xfd, 0x40, 0xc0, 0xfe, 0x43, - 0x6d, 0x00, 0xd9, 0x66, 0x00, 0xba, 0xf0, 0xfe, 0x48, 0xe2, 0xfe, 0x70, 0x80, 0xff, 0xf6, 0x5e, - 0xfe, 0x7e, 0xac, 0xfe, 0x40, 0x12, 0xfe, 0x5d, 0x41, 0xfd, 0xae, 0x2e, 0xfe, 0x7b, 0x58, 0xfe, - 0x3c, 0xc5, 0xfe, 0xd1, 0x66, 0xff, 0x8f, 0xfb, 0x20, 0x97, 0x04, 0x29, 0x7b, 0x89, 0x0b, 0xaa, - 0x11, 0x0b, 0x07, 0x56, 0x0a, 0x32, 0x7c, 0xfe, 0xea, 0xb0, 0x01, 0x18, 0x52, 0xfd, 0x4a, 0x11, - 0xf4, 0x15, 0x48, 0xf7, 0xdf, 0xff, 0x01, 0xfa, 0x94, 0xff, 0x6c, 0xbc, 0xf7, 0xe6, 0xe2, 0xfb, - 0x9c, 0x9a, 0xfd, 0x68, 0xb7, 0xfe, 0xd1, 0xa6, 0x00, 0x8f, 0xb8, 0xfd, 0x54, 0xca, 0xfd, 0x90, - 0x3d, 0x00, 0xb9, 0x9e, 0x00, 0x58, 0x70, 0xfe, 0x7f, 0xbb, 0xfe, 0x11, 0x98, 0xff, 0xd0, 0xec, - 0xfd, 0x3f, 0x72, 0xfe, 0x3d, 0xa2, 0xfd, 0xfa, 0xa2, 0xfc, 0x8c, 0x1e, 0xfe, 0xd1, 0x62, 0xfe, - 0x4c, 0x6a, 0xfe, 0xe3, 0x09, 0xff, 0x6d, 0x48, 0x25, 0x25, 0x99, 0x2d, 0x2a, 0x88, 0x08, 0x89, - 0xcd, 0x06, 0xfd, 0xc6, 0x08, 0x12, 0x61, 0xfd, 0x46, 0xfd, 0x03, 0xb5, 0x0f, 0x00, 0x3b, 0xf7, - 0xf2, 0x09, 0x0a, 0xf6, 0x5e, 0x5e, 0x04, 0xf8, 0x9b, 0x02, 0x3a, 0xc2, 0xf6, 0xfd, 0x4c, 0xf9, - 0x35, 0x7c, 0xfc, 0xde, 0xdb, 0xfe, 0x33, 0xe0, 0x01, 0xa4, 0x32, 0xfe, 0xac, 0xc1, 0xfc, 0x70, - 0x8b, 0xff, 0x18, 0x03, 0x01, 0xa4, 0x5d, 0xfe, 0xf8, 0x2c, 0xfe, 0x5a, 0xa1, 0xff, 0x62, 0xc7, - 0xfd, 0x43, 0x58, 0xfe, 0x26, 0x89, 0xfd, 0x9f, 0xf6, 0xfb, 0xd1, 0xdf, 0xfd, 0x0a, 0xa5, 0xfe, - 0x2b, 0x6c, 0xfe, 0x2b, 0xb4, 0xfe, 0xe3, 0xb5, 0x29, 0x85, 0x4f, 0x30, 0x1a, 0x55, 0x05, 0xc1, - 0xb0, 0x04, 0x75, 0x52, 0x06, 0x0d, 0xf2, 0xfb, 0xb7, 0xba, 0x06, 0x4a, 0x8d, 0x01, 0x65, 0x6a, - 0xf2, 0x4b, 0xf6, 0xf4, 0xb6, 0x10, 0x06, 0x11, 0x7a, 0x06, 0x1e, 0x08, 0xf7, 0x47, 0x06, 0xf7, - 0x2b, 0xdb, 0xf9, 0x52, 0xc4, 0xfd, 0x84, 0xac, 0x02, 0x4a, 0x2e, 0xfe, 0x00, 0x97, 0xfb, 0x0a, - 0x84, 0xfe, 0x78, 0x1c, 0x01, 0x70, 0x0f, 0xfe, 0xbb, 0x8a, 0xfd, 0x03, 0xd3, 0xff, 0xf1, 0xbe, - 0xfd, 0xf9, 0x9c, 0xfe, 0xa5, 0xc5, 0xfd, 0xbd, 0x73, 0xfb, 0x72, 0x76, 0xfd, 0xeb, 0xbf, 0xfe, - 0x8e, 0xd2, 0xfe, 0x27, 0xf2, 0xfe, 0xf4, 0x03, 0x2c, 0xb7, 0x70, 0x32, 0x20, 0x48, 0x05, 0xc2, - 0x80, 0x03, 0x4d, 0xa0, 0x03, 0x5b, 0x33, 0xfb, 0x7b, 0x51, 0x08, 0x93, 0x11, 0x03, 0x7a, 0xbb, - 0xf2, 0xfc, 0x3a, 0xf2, 0x8c, 0x88, 0x05, 0xa9, 0x13, 0x0a, 0x46, 0x7f, 0xf9, 0x7d, 0x5a, 0xf6, - 0x44, 0x41, 0xf6, 0xce, 0x24, 0xfb, 0x6b, 0x9e, 0x03, 0xdf, 0xf2, 0xff, 0x6e, 0x96, 0xfb, 0x3d, - 0x52, 0xfd, 0xd5, 0x7a, 0x00, 0xed, 0xc5, 0xfd, 0x6e, 0x96, 0xfd, 0x13, 0xc5, 0xff, 0xd6, 0x28, - 0xfd, 0xde, 0x7b, 0xfe, 0x36, 0x03, 0xfe, 0x6a, 0x9e, 0xfb, 0xdf, 0x92, 0xfd, 0x04, 0x18, 0xff, - 0xf4, 0x24, 0xff, 0x4d, 0x0e, 0xff, 0x12, 0x84, 0x2c, 0xda, 0x81, 0x33, 0xe7, 0x0d, 0x07, 0x9b, - 0x18, 0x04, 0x06, 0x4e, 0x02, 0x9e, 0x8b, 0xfa, 0xad, 0xc6, 0x07, 0x38, 0x59, 0x03, 0x81, 0x28, - 0xf3, 0x8e, 0xc3, 0xef, 0x5a, 0xa0, 0x03, 0x30, 0xb7, 0x0b, 0x2c, 0x16, 0xfd, 0x71, 0x41, 0xf7, - 0x4c, 0x70, 0xf3, 0x92, 0xfe, 0xf8, 0x69, 0x73, 0x03, 0xe5, 0x17, 0x02, 0x79, 0x10, 0xfd, 0x18, - 0x0f, 0xfc, 0x6e, 0x06, 0x00, 0x93, 0xda, 0xfd, 0xbe, 0x0f, 0xfd, 0x65, 0x41, 0xff, 0x8d, 0xf9, - 0xfc, 0x67, 0xb8, 0xfe, 0xf0, 0x2c, 0xfe, 0x35, 0xf6, 0xfb, 0x83, 0x51, 0xfd, 0xaa, 0xaa, 0xfe, - 0x3d, 0x6e, 0xff, 0x9b, 0xfc, 0xfe, 0x50, 0x2b, 0x2b, 0xe7, 0x4b, 0x33, 0x4d, 0x8e, 0x0a, 0x27, - 0xdc, 0x06, 0xf4, 0x40, 0x02, 0xb3, 0x1e, 0xfa, 0xa9, 0x8d, 0x06, 0x1a, 0xa4, 0x02, 0x6f, 0x41, - 0xf3, 0x04, 0x9d, 0xed, 0x46, 0xb7, 0x00, 0x93, 0x24, 0x0b, 0xc3, 0x7a, 0x00, 0x6a, 0xd3, 0xfb, - 0x67, 0xd3, 0xf2, 0x90, 0x83, 0xf5, 0xc3, 0x87, 0x02, 0x5a, 0x84, 0x03, 0x1e, 0x3c, 0xff, 0xd3, - 0x38, 0xfc, 0xfb, 0xe5, 0xfe, 0xe8, 0x22, 0xfe, 0xc2, 0x55, 0xfd, 0xec, 0x1e, 0xff, 0x97, 0x48, - 0xfd, 0x62, 0x3d, 0xff, 0x9b, 0x38, 0xfe, 0xa5, 0x99, 0xfb, 0x18, 0x22, 0xfd, 0x0b, 0x08, 0xfe, - 0x53, 0x22, 0xff, 0x05, 0x0e, 0xff, 0x6e, 0xf6, 0x28, 0x93, 0x62, 0x31, 0x77, 0xcf, 0x0d, 0x0f, - 0x2f, 0x09, 0x56, 0x11, 0x03, 0xab, 0x7e, 0xfb, 0x15, 0x61, 0x04, 0xce, 0xc4, 0x01, 0xb5, 0x86, - 0xf4, 0xf0, 0xb9, 0xeb, 0x39, 0x93, 0xfd, 0xe1, 0x5b, 0x09, 0xfb, 0x3c, 0x01, 0x19, 0x65, 0x00, - 0x8f, 0xb2, 0xf5, 0xc7, 0xd8, 0xf1, 0x27, 0x78, 0xff, 0xa7, 0xba, 0x03, 0x65, 0x30, 0x00, 0x6a, - 0x3d, 0xfe, 0x70, 0x34, 0xff, 0xc9, 0xea, 0xfd, 0x29, 0x11, 0xfe, 0x1c, 0x14, 0xff, 0xac, 0xdd, - 0xfc, 0x73, 0x1a, 0xff, 0x0d, 0x43, 0xfe, 0x0e, 0xfd, 0xfa, 0x0b, 0xee, 0xfc, 0x5d, 0xff, 0xfd, - 0xfc, 0xc5, 0xfe, 0xaf, 0xbb, 0xff, 0x2c, 0x69, 0x26, 0x7e, 0x4b, 0x2f, 0x56, 0x2b, 0x0e, 0xeb, - 0x23, 0x0b, 0xb7, 0xa9, 0x05, 0x06, 0x58, 0xfb, 0x33, 0x9e, 0x03, 0xdd, 0x77, 0x01, 0x08, 0x5c, - 0xf5, 0xc8, 0x97, 0xec, 0x6d, 0x9b, 0xfa, 0xb2, 0xa0, 0x08, 0xaa, 0xe0, 0x00, 0xf7, 0x15, 0x00, - 0x17, 0x81, 0xfa, 0x28, 0xfd, 0xf0, 0x24, 0x31, 0xfa, 0x1b, 0x28, 0x03, 0xcb, 0x8b, 0x01, 0xc3, - 0xbc, 0xff, 0x8f, 0xd4, 0xff, 0x51, 0x01, 0xfe, 0xf1, 0x4b, 0xfe, 0x3c, 0x94, 0xff, 0xf5, 0x84, - 0xfc, 0xb6, 0x41, 0xfd, 0x31, 0x97, 0xfe, 0x80, 0xdc, 0xfb, 0x61, 0xa7, 0xfc, 0xd1, 0x8c, 0xfe, - 0xac, 0xf9, 0xfe, 0xce, 0xd1, 0xff, 0x6d, 0x8c, 0x24, 0x46, 0xb5, 0x2d, 0xfb, 0x90, 0x0c, 0x8a, - 0x6c, 0x0a, 0x38, 0x2e, 0x08, 0xc7, 0xa9, 0xfc, 0x5c, 0x3d, 0x02, 0x8a, 0x60, 0xff, 0x9e, 0x8b, - 0xf7, 0x9e, 0xed, 0xf1, 0x74, 0x38, 0xf9, 0x75, 0xdd, 0x06, 0x55, 0x42, 0x01, 0x9e, 0x44, 0xfc, - 0x21, 0x04, 0xfd, 0x66, 0x7c, 0xf6, 0x3b, 0x75, 0xf6, 0xe3, 0x4d, 0xff, 0xec, 0x24, 0x02, 0x40, - 0xd6, 0xff, 0x6c, 0x68, 0x00, 0x36, 0xcc, 0xff, 0xf0, 0x43, 0xfe, 0x53, 0xea, 0xfd, 0xc4, 0x74, - 0xfc, 0x3e, 0x74, 0xfd, 0x80, 0x38, 0xff, 0x35, 0xb4, 0xfd, 0xbe, 0xb1, 0xfc, 0xa7, 0x25, 0xfe, - 0x1b, 0x33, 0xff, 0x05, 0x8b, 0xff, 0x84, 0xc1, 0x21, 0x75, 0xd4, 0x29, 0xef, 0xa5, 0x0b, 0x18, - 0x74, 0x0b, 0xda, 0xc0, 0x09, 0xd8, 0x54, 0xfd, 0xa9, 0xc3, 0x01, 0xbc, 0xf3, 0xff, 0x51, 0xe8, - 0xf8, 0xe4, 0x8f, 0xf3, 0xbc, 0x1e, 0xf9, 0x05, 0xb4, 0x05, 0xbb, 0xa7, 0x02, 0xea, 0xd1, 0xfb, - 0x96, 0x88, 0xfc, 0x83, 0x09, 0xfb, 0x48, 0x86, 0xf7, 0x2b, 0x21, 0xfc, 0x13, 0x77, 0x01, 0xa9, - 0x68, 0xff, 0x3c, 0x15, 0xff, 0x97, 0x6a, 0xff, 0x15, 0x9e, 0xfe, 0xcb, 0x9b, 0xfe, 0x53, 0x7e, - 0xfd, 0x65, 0xac, 0xfd, 0x4b, 0xde, 0xfe, 0xca, 0x73, 0xfe, 0x6d, 0x05, 0xfd, 0xec, 0xf6, 0xfd, - 0xb5, 0xa5, 0xff, 0x0e, 0x74, 0xff, 0x0f, 0xe0, 0x21, 0x60, 0x3a, 0x26, 0xeb, 0xae, 0x08, 0x1f, - 0x02, 0x0f, 0x31, 0x02, 0x0c, 0x58, 0xf4, 0xfa, 0xfd, 0x38, 0x01, 0xaf, 0x9f, 0x02, 0xae, 0x88, - 0xfb, 0x78, 0xb5, 0xf3, 0x4a, 0xa7, 0xf6, 0x99, 0x87, 0x03, 0x02, 0xa7, 0x03, 0x13, 0x4d, 0xfd, - 0x92, 0xf4, 0xfd, 0xc2, 0x64, 0xfd, 0x99, 0xbd, 0xf6, 0xba, 0xb2, 0xfa, 0x46, 0x89, 0x02, 0x56, - 0x18, 0xff, 0x75, 0xb1, 0xfd, 0x12, 0x93, 0xfe, 0xa4, 0x30, 0xfd, 0xec, 0xe7, 0xfd, 0x8b, 0x7b, - 0xfe, 0x1e, 0x18, 0xfe, 0x37, 0x9f, 0xfe, 0xe9, 0xd1, 0xfe, 0x5c, 0x5b, 0xfd, 0x6b, 0xd5, 0xfe, - 0x0d, 0xef, 0x00, 0xa7, 0xbd, 0xff, 0xa7, 0xa1, 0x1d, 0x85, 0xa1, 0x23, 0x3d, 0x39, 0x0b, 0x41, - 0xa7, 0x0e, 0x4b, 0x8a, 0x0a, 0x61, 0x76, 0xfb, 0xe3, 0x4b, 0x01, 0xdb, 0xa7, 0x01, 0xd3, 0xac, - 0xfa, 0x1f, 0x86, 0xf6, 0x0e, 0xe8, 0xf8, 0x21, 0x9e, 0x00, 0x4f, 0x3e, 0x01, 0xae, 0x4b, 0xfe, - 0x39, 0xf9, 0xfe, 0x4f, 0xf9, 0xfe, 0xf5, 0xe9, 0xf9, 0x14, 0xf8, 0xf9, 0x32, 0xdb, 0xff, 0xaf, - 0xcb, 0x00, 0x30, 0xd2, 0xff, 0xde, 0x6b, 0xfe, 0xe5, 0x5b, 0xfd, 0x8c, 0x78, 0xfe, 0xbd, 0xba, - 0xfe, 0xf9, 0xa8, 0xfe, 0xf0, 0xb9, 0xfe, 0x93, 0x7b, 0xfe, 0x5a, 0x10, 0xfe, 0xbc, 0xac, 0xfe, - 0xcc, 0xca, 0xff, 0xc1, 0x68, 0xff, 0xe6, 0xf6, 0x1a, 0x74, 0x93, 0x20, 0x6c, 0xa5, 0x0a, 0x0b, - 0x9b, 0x0c, 0xea, 0x51, 0x09, 0x96, 0x76, 0xfe, 0xc3, 0xde, 0x02, 0xc1, 0xcc, 0x00, 0x77, 0xae, - 0xfa, 0xf3, 0x73, 0xf7, 0x4a, 0x3e, 0xfa, 0xf3, 0x8d, 0x00, 0xe9, 0x25, 0x00, 0x55, 0x66, 0xfe, - 0xb0, 0xc1, 0xfe, 0x77, 0x2a, 0xff, 0x7a, 0x1f, 0xfc, 0x29, 0x3f, 0xfb, 0x0b, 0x00, 0x00, 0xa0, - 0x46, 0x01, 0x01, 0xb0, 0xff, 0x2b, 0x3b, 0xfe, 0x57, 0x13, 0xfe, 0x07, 0x28, 0xff, 0xd3, 0xbd, - 0xfe, 0xc9, 0x57, 0xfe, 0x8b, 0xfb, 0xfd, 0x25, 0xf6, 0xfd, 0x5e, 0x89, 0xfe, 0x30, 0xc9, 0xfe, - 0x1d, 0x19, 0xff, 0xbe, 0x32, 0xff, 0xe6, 0xb0, 0x18, 0xe4, 0x37, 0x1e, 0xf1, 0xbd, 0x09, 0xa4, - 0x50, 0x0a, 0x80, 0xe9, 0x08, 0x21, 0x93, 0x00, 0x9d, 0x0b, 0x03, 0x30, 0x62, 0x00, 0x3c, 0xb0, - 0xfa, 0xff, 0x07, 0xf8, 0x04, 0xc6, 0xfb, 0xef, 0xbd, 0x00, 0xe6, 0x8d, 0xff, 0xa8, 0xb5, 0xfe, - 0x94, 0x0a, 0xff, 0xef, 0x46, 0xff, 0x62, 0xfe, 0xfc, 0xbf, 0x82, 0xfc, 0x83, 0x88, 0x00, 0x6d, - 0x33, 0x01, 0xb2, 0x98, 0xff, 0xd0, 0x56, 0xfe, 0x16, 0x85, 0xfe, 0x90, 0x65, 0xff, 0x59, 0xa2, - 0xfe, 0x76, 0x44, 0xfe, 0x3e, 0xd0, 0xfd, 0x90, 0xe4, 0xfd, 0xb8, 0x87, 0xfe, 0xdd, 0x97, 0xfe, - 0xf7, 0x39, 0xff, 0xae, 0xa0, 0xff, 0x7e, 0x9c, 0x16, 0x17, 0xa2, 0x1b, 0x55, 0xa7, 0x08, 0x48, - 0x64, 0x09, 0xf6, 0xca, 0x08, 0x69, 0xf3, 0x00, 0x35, 0xbb, 0x02, 0xb3, 0x61, 0x00, 0x1b, 0xf7, - 0xfa, 0xb9, 0xf0, 0xf8, 0xc0, 0x1f, 0xfd, 0xfa, 0xbe, 0x00, 0x76, 0x03, 0xff, 0xd5, 0x40, 0xff, - 0x80, 0xa9, 0xff, 0x01, 0x43, 0xff, 0x47, 0xc3, 0xfd, 0x50, 0xb6, 0xfd, 0xba, 0x5d, 0x00, 0x3d, - 0x7a, 0x00, 0x3a, 0x8b, 0xff, 0x43, 0x9a, 0xfe, 0xa4, 0xcb, 0xfe, 0x76, 0x76, 0xff, 0x59, 0x9e, - 0xfe, 0x27, 0x8f, 0xfe, 0x02, 0x50, 0xfe, 0x2d, 0x51, 0xfe, 0x39, 0x96, 0xfe, 0xc4, 0x62, 0xfe, - 0x5f, 0x20, 0xff, 0x3a, 0xb2, 0xff, 0xf8, 0x2c, 0x14, 0xbb, 0x1d, 0x19, 0x07, 0x46, 0x08, 0x75, - 0x8a, 0x08, 0xa7, 0xaf, 0x07, 0xa5, 0x1c, 0x01, 0x96, 0x43, 0x03, 0x25, 0xa6, 0x00, 0xff, 0x33, - 0xfb, 0xca, 0xb0, 0xf9, 0x2d, 0x2c, 0xfe, 0xda, 0x3b, 0x01, 0x40, 0x43, 0xff, 0x67, 0x0e, 0x00, - 0x03, 0x20, 0x00, 0xb9, 0x36, 0xff, 0xe4, 0x97, 0xfe, 0x11, 0x6c, 0xfe, 0xba, 0xd1, 0xff, 0x0a, - 0x09, 0x00, 0xa9, 0xbe, 0xff, 0x07, 0xd7, 0xfe, 0xb8, 0xfc, 0xfe, 0x5c, 0xd7, 0xff, 0xaf, 0x31, - 0xff, 0xbd, 0x1d, 0xff, 0x7d, 0x99, 0xfe, 0xca, 0x35, 0xfe, 0x2f, 0x7f, 0xfe, 0x5a, 0x89, 0xfe, - 0xb4, 0x42, 0xff, 0x3a, 0xb1, 0xff, 0xd4, 0x17, 0x12, 0x88, 0x3c, 0x16, 0x72, 0xbe, 0x07, 0xe9, - 0x33, 0x08, 0x44, 0xc4, 0x06, 0x19, 0x44, 0x01, 0x1d, 0x98, 0x03, 0xe8, 0xf0, 0x00, 0x13, 0xdb, - 0xfb, 0x6e, 0xc6, 0xfa, 0x76, 0x9e, 0xff, 0xf8, 0x59, 0x02, 0xad, 0xd9, 0xff, 0x9e, 0x78, 0x00, - 0x03, 0x6f, 0x00, 0x68, 0x6c, 0xff, 0x09, 0x38, 0xff, 0x5f, 0xf9, 0xfe, 0x40, 0x80, 0xff, 0x20, - 0xab, 0xff, 0xb5, 0xee, 0xff, 0x8e, 0x46, 0xff, 0xdf, 0x67, 0xff, 0xed, 0x01, 0x00, 0xb1, 0x2a, - 0xff, 0x4c, 0x4e, 0xff, 0x44, 0xfe, 0xfe, 0x84, 0x6a, 0xfe, 0x16, 0xae, 0xfe, 0xc4, 0xd1, 0xfe, - 0xb4, 0x50, 0xff, 0xe4, 0xa9, 0xff, 0x97, 0x12, 0x11, 0x96, 0x9e, 0x14, 0x5d, 0xb5, 0x06, 0x75, - 0xf2, 0x06, 0x31, 0xa7, 0x05, 0x0c, 0x24, 0x01, 0xdc, 0x06, 0x04, 0x67, 0x06, 0x02, 0xb8, 0x30, - 0xfd, 0x3b, 0x18, 0xfc, 0xb7, 0x1f, 0x01, 0x1d, 0xb4, 0x03, 0x3c, 0xbd, 0x00, 0xe1, 0xa7, 0x00, - 0x4d, 0x1a, 0x00, 0x87, 0x12, 0xff, 0x03, 0x39, 0xff, 0x55, 0x38, 0xff, 0x6d, 0x9e, 0xff, 0x3f, - 0xdc, 0xff, 0x99, 0x44, 0x00, 0x43, 0x6e, 0xff, 0xd1, 0x4e, 0xff, 0x15, 0xf7, 0xff, 0x46, 0x64, - 0xff, 0x7f, 0x95, 0xff, 0x21, 0x29, 0xff, 0x8a, 0x86, 0xfe, 0x0e, 0xf1, 0xfe, 0xa9, 0x3e, 0xff, - 0x24, 0x9e, 0xff, 0xd4, 0xcf, 0xff, 0xa6, 0x5e, 0x10, 0xfc, 0x97, 0x13, 0x27, 0xe6, 0x05, 0x09, - 0xb6, 0x06, 0x24, 0x4a, 0x06, 0x18, 0xf9, 0x01, 0x22, 0xaf, 0x04, 0x5f, 0xc6, 0x02, 0x4e, 0x41, - 0xfe, 0x68, 0x40, 0xfd, 0x35, 0xb2, 0x01, 0xad, 0xa0, 0x03, 0x8e, 0x3b, 0x00, 0xb4, 0xba, 0xff, - 0x18, 0x25, 0xff, 0x5f, 0xdf, 0xfe, 0xef, 0xd6, 0xff, 0xa6, 0xcf, 0xff, 0xff, 0xc4, 0xff, 0xbc, - 0x94, 0xff, 0xe2, 0xdd, 0xff, 0xd2, 0x58, 0xff, 0xa9, 0x66, 0xff, 0xb9, 0x0b, 0x00, 0x7b, 0x87, - 0xff, 0x26, 0xea, 0xff, 0xec, 0x9f, 0xff, 0x4b, 0xcd, 0xfe, 0xc3, 0x05, 0xff, 0x14, 0x3e, 0xff, - 0x55, 0x7d, 0xff, 0xf9, 0x80, 0xff, 0xdf, 0x92, 0x10, 0x5f, 0xb8, 0x14, 0xea, 0x82, 0x07, 0x4e, - 0xca, 0x07, 0x57, 0xa3, 0x06, 0xb8, 0x2a, 0x02, 0x26, 0xf0, 0x04, 0x26, 0x77, 0x02, 0x46, 0x4a, - 0xfd, 0x2d, 0x20, 0xfc, 0x61, 0xc7, 0x00, 0xec, 0x06, 0x03, 0x28, 0xfc, 0xff, 0x15, 0xb7, 0xff, - 0x1d, 0x11, 0xff, 0x70, 0xe6, 0xfe, 0xc6, 0xea, 0xff, 0x66, 0x8b, 0xff, 0x2f, 0x5d, 0xff, 0x43, - 0x80, 0xff, 0x4a, 0x11, 0x00, 0xfe, 0x71, 0xff, 0x0c, 0x80, 0xff, 0x1c, 0x44, 0x00, 0x72, 0x9d, - 0xff, 0xd2, 0xf3, 0xff, 0x2f, 0xd4, 0xff, 0xa9, 0xf7, 0xfe, 0x8f, 0xe6, 0xfe, 0x78, 0xe1, 0xfe, - 0x3d, 0xed, 0xfe, 0x0f, 0x04, 0xff, 0x66, 0xf7, 0x10, 0xe6, 0x02, 0x15, 0xf8, 0x39, 0x07, 0xfd, - 0x43, 0x07, 0xbb, 0x4a, 0x06, 0xa8, 0x21, 0x02, 0xf8, 0x15, 0x05, 0xe4, 0xa2, 0x02, 0x44, 0x2a, - 0xfd, 0x39, 0x95, 0xfb, 0xe1, 0x4a, 0x00, 0xa8, 0xee, 0x02, 0x0d, 0xec, 0xff, 0xd3, 0x61, 0xff, - 0x85, 0xbd, 0xfe, 0xee, 0xbf, 0xfe, 0x7e, 0x29, 0x00, 0x59, 0x5b, 0x00, 0x9d, 0x2b, 0x00, 0x19, - 0xc3, 0xff, 0xed, 0xec, 0xff, 0x3a, 0x4f, 0xff, 0x49, 0x5d, 0xff, 0x73, 0xdf, 0xff, 0x17, 0x2d, - 0xff, 0xcd, 0xb6, 0xff, 0x87, 0xd3, 0xff, 0xaf, 0x61, 0xff, 0xcb, 0x87, 0xff, 0x4b, 0x2f, 0xff, - 0xcb, 0xe8, 0xfe, 0xeb, 0xdd, 0xfe, 0x92, 0x97, 0x11, 0x8e, 0xba, 0x15, 0x92, 0xf9, 0x06, 0x0c, - 0x64, 0x06, 0xc5, 0x2a, 0x05, 0x6e, 0x20, 0x01, 0x97, 0x96, 0x04, 0x0a, 0x7a, 0x02, 0x38, 0x01, - 0xfd, 0x3e, 0x1d, 0xfb, 0x74, 0x4d, 0x00, 0x50, 0xc4, 0x03, 0x23, 0x9f, 0x00, 0x27, 0x94, 0xff, - 0x7b, 0x31, 0xfe, 0xb2, 0xb4, 0xfd, 0x61, 0xb2, 0xff, 0xf3, 0x97, 0x00, 0x7c, 0xba, 0x00, 0x1b, - 0xa9, 0x00, 0x18, 0xc0, 0x00, 0x2d, 0x88, 0xff, 0xc6, 0x4d, 0xff, 0x3f, 0xf0, 0xff, 0x52, 0x0b, - 0xff, 0x93, 0x35, 0xff, 0x89, 0x51, 0xff, 0x7a, 0xf3, 0xfe, 0xf1, 0x60, 0xff, 0x3f, 0xd5, 0xff, - 0x36, 0x05, 0x00, 0xe9, 0xb4, 0xff, 0xa5, 0xd1, 0x12, 0x45, 0xa5, 0x17, 0xdb, 0xa8, 0x07, 0xfb, - 0x7b, 0x06, 0xf3, 0x01, 0x05, 0x29, 0x88, 0x00, 0xdf, 0x00, 0x04, 0xae, 0x5a, 0x01, 0x3e, 0x6f, - 0xfb, 0xe4, 0x3f, 0xf9, 0xfb, 0xed, 0xfe, 0xc3, 0x03, 0x04, 0x4e, 0x3c, 0x01, 0xc2, 0xa1, 0xff, - 0xe9, 0x5f, 0xfe, 0xd9, 0x28, 0xfe, 0x99, 0xcc, 0xff, 0xad, 0x63, 0x00, 0x77, 0x87, 0x00, 0x14, - 0x2d, 0x00, 0xc6, 0x98, 0x00, 0xdc, 0x20, 0x00, 0x03, 0xd2, 0xff, 0x61, 0x37, 0x00, 0x68, 0x65, - 0xff, 0xef, 0x7a, 0xff, 0x59, 0x51, 0xff, 0x6c, 0xab, 0xfe, 0x02, 0xef, 0xfe, 0x04, 0x68, 0xff, - 0x29, 0xf2, 0xff, 0x7c, 0x56, 0x00, 0x7c, 0xb8, 0x14, 0xdc, 0xfc, 0x19, 0x80, 0x23, 0x08, 0xc9, - 0xe2, 0x06, 0xe6, 0x56, 0x05, 0xc3, 0x49, 0x00, 0x93, 0xfb, 0x03, 0x0f, 0xc0, 0x00, 0xd6, 0x09, - 0xfa, 0xfb, 0x41, 0xf7, 0xe4, 0xa5, 0xfd, 0x03, 0x43, 0x04, 0x54, 0x12, 0x01, 0xc0, 0xa0, 0xfe, - 0xac, 0x81, 0xfd, 0x03, 0xab, 0xfd, 0x19, 0xda, 0xff, 0xa6, 0xe0, 0x00, 0x9f, 0xd3, 0x00, 0x70, - 0x4b, 0x00, 0xdd, 0xe5, 0x00, 0xc9, 0x07, 0x00, 0x09, 0x97, 0xff, 0x23, 0x4b, 0x00, 0x30, 0x56, - 0xff, 0x07, 0x8f, 0xff, 0xd5, 0x9b, 0xff, 0xc8, 0xe1, 0xfe, 0x58, 0x13, 0xff, 0xd6, 0xa2, 0xff, - 0xcf, 0x14, 0x00, 0x35, 0xe8, 0xff, 0x54, 0xa7, 0x17, 0x9f, 0xb0, 0x1c, 0x37, 0xd6, 0x07, 0x83, - 0x53, 0x07, 0xaa, 0xbe, 0x05, 0xbc, 0x0f, 0x00, 0x68, 0x69, 0x04, 0x38, 0x49, 0x00, 0xb3, 0x93, - 0xf8, 0xbd, 0x4d, 0xf5, 0xcb, 0x15, 0xfd, 0x76, 0x3c, 0x05, 0xcd, 0xd1, 0x00, 0x50, 0x62, 0xfd, - 0xae, 0x5f, 0xfc, 0x86, 0xcc, 0xfc, 0xb2, 0x3a, 0xff, 0x04, 0x70, 0x00, 0x86, 0x79, 0x00, 0x5a, - 0x09, 0x00, 0x01, 0x15, 0x01, 0x75, 0x2d, 0x00, 0xe5, 0x7c, 0xff, 0xef, 0x4d, 0x00, 0x8b, 0x64, - 0xff, 0x3c, 0x75, 0xff, 0x59, 0x7b, 0xff, 0x14, 0xf6, 0xfe, 0xf6, 0x28, 0xff, 0xab, 0xc1, 0xff, - 0xce, 0x21, 0x00, 0x97, 0xcf, 0xff, 0xe8, 0x34, 0x1b, 0x57, 0xf9, 0x1f, 0x50, 0xe6, 0x06, 0xb8, - 0x5b, 0x07, 0xe4, 0x52, 0x06, 0x1f, 0x7a, 0xff, 0x1a, 0x9b, 0x04, 0xf5, 0x86, 0xff, 0x17, 0xd2, - 0xf6, 0x52, 0x17, 0xf4, 0x11, 0x78, 0xfd, 0x09, 0x41, 0x06, 0x3a, 0x52, 0x00, 0x6d, 0x59, 0xfc, - 0x06, 0x7d, 0xfb, 0x8f, 0x49, 0xfc, 0xdf, 0x04, 0xff, 0x89, 0xfb, 0xff, 0xeb, 0x13, 0x00, 0xb2, - 0x8e, 0xff, 0xe0, 0xc9, 0x00, 0x0c, 0xca, 0xff, 0x6a, 0xf4, 0xfe, 0xe3, 0x36, 0x00, 0xfc, 0x63, - 0xff, 0xcb, 0x8c, 0xff, 0x63, 0x4f, 0xff, 0x1d, 0x79, 0xfe, 0x6f, 0xeb, 0xfe, 0x41, 0x9f, 0xff, - 0x71, 0x1c, 0x00, 0x33, 0xfa, 0xff, 0xb7, 0x63, 0x1e, 0xb5, 0xb6, 0x23, 0x1a, 0x82, 0x06, 0xe3, - 0xe8, 0x06, 0x3f, 0xf2, 0x06, 0x35, 0xff, 0xfe, 0x66, 0xa6, 0x04, 0x2e, 0xe7, 0xfe, 0x11, 0xf9, - 0xf4, 0x5a, 0x2b, 0xf3, 0x68, 0xe3, 0xfd, 0x13, 0xbb, 0x06, 0xbf, 0x0c, 0x00, 0xda, 0xe8, 0xfb, - 0x36, 0xc9, 0xfa, 0x38, 0xd6, 0xfb, 0x46, 0x05, 0xff, 0x57, 0xad, 0xff, 0xd8, 0xdc, 0xff, 0x1c, - 0x61, 0xff, 0xda, 0xa3, 0x00, 0x6a, 0xb5, 0xff, 0x93, 0xb1, 0xfe, 0x98, 0xc6, 0xff, 0x4b, 0xd4, - 0xfe, 0x93, 0x45, 0xff, 0x09, 0xf9, 0xfe, 0xa7, 0x1d, 0xfe, 0x51, 0xd4, 0xfe, 0x02, 0x7c, 0xff, - 0x69, 0x19, 0x00, 0xbd, 0xff, 0xff, 0xe2, 0x33, 0x20, 0xb3, 0x28, 0x27, 0xd6, 0xf6, 0x07, 0x96, - 0xce, 0x06, 0x50, 0xe2, 0x06, 0x3d, 0xff, 0xfd, 0x18, 0x79, 0x04, 0xa5, 0xdb, 0xfe, 0x6a, 0xc5, - 0xf3, 0x73, 0x0e, 0xf3, 0xd8, 0x6b, 0xfd, 0xda, 0x08, 0x05, 0x4a, 0xc5, 0xff, 0x9b, 0xd7, 0xfc, - 0xa0, 0xab, 0xfa, 0x40, 0xfe, 0xfa, 0x33, 0x8b, 0xfe, 0xb6, 0x58, 0xff, 0x3e, 0x88, 0x00, 0xe2, - 0x12, 0x00, 0x37, 0x0c, 0x00, 0x8e, 0x46, 0xff, 0xb3, 0x8a, 0xfe, 0xc0, 0x74, 0xff, 0x9c, 0x68, - 0xfe, 0x23, 0xd3, 0xfe, 0xb1, 0x9b, 0xfe, 0xca, 0xde, 0xfd, 0xc3, 0xc6, 0xfe, 0xa6, 0x40, 0xff, - 0x20, 0x11, 0x00, 0x25, 0x15, 0x00, 0x92, 0xc9, 0x20, 0xe7, 0x51, 0x29, 0x01, 0x56, 0x0a, 0x2d, - 0xc7, 0x07, 0xb8, 0x79, 0x07, 0x8f, 0x0f, 0xfd, 0xe0, 0xf6, 0x02, 0x2c, 0xf2, 0xfe, 0x2c, 0xe3, - 0xf3, 0x70, 0xfc, 0xf3, 0x9e, 0x26, 0xfd, 0xe6, 0xf0, 0x01, 0xe3, 0x9a, 0xfe, 0xe2, 0xf9, 0xfd, - 0xc6, 0xc7, 0xfb, 0x6b, 0x8c, 0xfb, 0xb4, 0x03, 0xfe, 0x1d, 0x5d, 0xfe, 0xb9, 0x99, 0x00, 0x49, - 0x02, 0x01, 0x76, 0xee, 0xff, 0xab, 0x9e, 0xfe, 0x3b, 0x67, 0xfe, 0x88, 0x7f, 0xff, 0x54, 0xad, - 0xfe, 0x09, 0xe2, 0xfe, 0xf3, 0x61, 0xfe, 0x01, 0xca, 0xfd, 0xcc, 0xa2, 0xfe, 0x4b, 0xb8, 0xfe, - 0x2c, 0x92, 0xff, 0x1e, 0xf7, 0xff, 0x01, 0x93, 0x21, 0x10, 0x59, 0x2a, 0xa0, 0xb2, 0x0b, 0x7c, - 0xc4, 0x09, 0xe4, 0x2a, 0x09, 0x6c, 0x03, 0xfd, 0x45, 0x36, 0x01, 0xdf, 0x71, 0xfd, 0xa3, 0x1f, - 0xf3, 0x96, 0x79, 0xf5, 0xfd, 0xe2, 0xfe, 0x34, 0x20, 0xff, 0x97, 0x77, 0xfb, 0x89, 0x7a, 0xfe, - 0x3c, 0xa3, 0xfd, 0x9c, 0x44, 0xfd, 0x2a, 0x58, 0xfe, 0x24, 0xec, 0xfc, 0xdc, 0x5d, 0xff, 0x3f, - 0x37, 0x01, 0x86, 0x4c, 0x00, 0x15, 0xee, 0xfe, 0xc7, 0xfb, 0xfe, 0x6b, 0x6f, 0xff, 0xc7, 0x60, - 0xfe, 0x88, 0xce, 0xfe, 0x65, 0x13, 0xfe, 0xa0, 0x6e, 0xfd, 0xb0, 0x85, 0xfe, 0x73, 0x42, 0xfe, - 0xc5, 0xd6, 0xfe, 0xd1, 0xb2, 0xff, 0x5d, 0xcb, 0x23, 0x45, 0xcc, 0x2a, 0x52, 0x7f, 0x0a, 0x8b, - 0xa3, 0x0b, 0xd8, 0x14, 0x0b, 0x43, 0x21, 0xfd, 0x26, 0x1b, 0x00, 0xbf, 0x95, 0xfb, 0x57, 0x55, - 0xf2, 0xb7, 0x3e, 0xf7, 0xe3, 0x73, 0x01, 0xce, 0xda, 0xfc, 0x24, 0xaa, 0xf7, 0x5a, 0x38, 0xfe, - 0x97, 0x8f, 0xfe, 0x8e, 0x47, 0xff, 0xb0, 0xc8, 0xff, 0x9d, 0xce, 0xfb, 0x1d, 0x30, 0xfe, 0x8a, - 0x88, 0x01, 0x6c, 0x99, 0x00, 0xc7, 0x6e, 0xfe, 0x15, 0x3d, 0xff, 0x15, 0xbd, 0xff, 0x3b, 0x20, - 0xfe, 0xe4, 0xa2, 0xfe, 0x8b, 0x56, 0xfd, 0x6e, 0xc0, 0xfc, 0xd1, 0x6f, 0xfe, 0x3c, 0x17, 0xfe, - 0x16, 0x5e, 0xfe, 0xc7, 0x5b, 0xff, 0x75, 0x96, 0x27, 0xf9, 0xca, 0x2b, 0x12, 0x39, 0x07, 0x52, - 0x4c, 0x0c, 0xd0, 0x09, 0x0c, 0x27, 0x7c, 0xfc, 0x48, 0xde, 0x00, 0xb0, 0xae, 0xfa, 0x95, 0xec, - 0xf0, 0x30, 0x7d, 0xf9, 0xcc, 0x79, 0x05, 0x89, 0x03, 0xfc, 0xeb, 0xee, 0xf2, 0xed, 0x7c, 0xfc, - 0xab, 0x32, 0xff, 0x83, 0xaa, 0x00, 0x16, 0xe1, 0x01, 0xb0, 0x2f, 0xfc, 0x5c, 0x08, 0xfd, 0xa5, - 0x48, 0x01, 0x46, 0xef, 0x00, 0x0a, 0xd3, 0xfd, 0xb3, 0xf8, 0xfe, 0x1a, 0xd4, 0xff, 0x98, 0x8b, - 0xfd, 0xfb, 0x61, 0xfe, 0xad, 0xfe, 0xfc, 0xaa, 0x29, 0xfc, 0x67, 0x7e, 0xfe, 0x44, 0x41, 0xfe, - 0xe2, 0xf7, 0xfd, 0xf6, 0xf6, 0xfe, 0x84, 0x6d, 0x2c, 0xcf, 0xf0, 0x2f, 0xc6, 0x36, 0x03, 0x08, - 0x85, 0x08, 0xee, 0x54, 0x0b, 0x72, 0xaa, 0xfb, 0xa6, 0x0c, 0x03, 0xcc, 0xc6, 0xfc, 0xdd, 0x86, - 0xef, 0xfc, 0xd1, 0xf8, 0x73, 0x9d, 0x08, 0xca, 0xa0, 0xfe, 0xa1, 0xbe, 0xf0, 0xf9, 0xa4, 0xf9, - 0xd1, 0x8a, 0xfe, 0xa9, 0x63, 0x01, 0xc5, 0x7c, 0x03, 0x70, 0x78, 0xfc, 0xc2, 0xe5, 0xfb, 0x3e, - 0xef, 0x00, 0x28, 0x61, 0x01, 0x31, 0x55, 0xfd, 0xea, 0x6e, 0xfe, 0x42, 0x2f, 0x00, 0x05, 0x53, - 0xfd, 0x88, 0x15, 0xfe, 0xe0, 0xc0, 0xfc, 0x67, 0x84, 0xfb, 0xbe, 0x5f, 0xfe, 0x82, 0x86, 0xfe, - 0x5a, 0xf8, 0xfd, 0x0d, 0x9c, 0xfe, 0x30, 0x6e, 0x32, 0x67, 0x31, 0x34, 0xbc, 0xfa, 0xfd, 0xc4, - 0x4e, 0x04, 0x1b, 0x28, 0x09, 0x32, 0x39, 0xfa, 0x26, 0x19, 0x07, 0xb8, 0x92, 0xff, 0x1f, 0xa9, - 0xed, 0xc4, 0x64, 0xf7, 0xb8, 0x67, 0x0b, 0x5b, 0xc5, 0x02, 0xa7, 0x31, 0xf0, 0x98, 0x8b, 0xf6, - 0xaf, 0x74, 0xfc, 0xac, 0x4f, 0x01, 0x49, 0xd9, 0x04, 0x76, 0x39, 0xfc, 0x95, 0xfc, 0xf9, 0xba, - 0x01, 0x00, 0xf1, 0x51, 0x02, 0x3a, 0x63, 0xfd, 0x2a, 0x7a, 0xfd, 0xaa, 0x39, 0x00, 0x89, 0x59, - 0xfd, 0x06, 0x61, 0xfe, 0x38, 0xee, 0xfc, 0x01, 0xbf, 0xfa, 0x90, 0xfd, 0xfd, 0x74, 0xa6, 0xfe, - 0x85, 0x05, 0xfe, 0xdc, 0x98, 0xfe, 0xab, 0xbf, 0x36, 0x58, 0x6c, 0x36, 0x4b, 0xb5, 0xfa, 0xec, - 0xa3, 0x02, 0xdf, 0x94, 0x06, 0xc3, 0x08, 0xf9, 0x1a, 0x3a, 0x0a, 0x62, 0xdd, 0x00, 0xcf, 0x0b, - 0xed, 0x84, 0xd4, 0xf5, 0x6f, 0x16, 0x0d, 0xe8, 0x0c, 0x07, 0x60, 0x15, 0xf0, 0x57, 0x2e, 0xf4, - 0xd3, 0xd3, 0xf9, 0x26, 0xe9, 0xff, 0x8f, 0xa0, 0x05, 0xfa, 0x83, 0xfc, 0x32, 0x18, 0xf9, 0xde, - 0xcc, 0xfe, 0x09, 0x33, 0x02, 0xf2, 0x0e, 0xfd, 0x4a, 0xfd, 0xfc, 0x0c, 0x82, 0x00, 0x53, 0x2f, - 0xfd, 0x97, 0xb6, 0xfe, 0x64, 0x32, 0xfd, 0x77, 0x12, 0xfa, 0x11, 0xa1, 0xfd, 0x6f, 0x0b, 0xff, - 0xd4, 0x97, 0xfe, 0xfa, 0xb4, 0xfe, 0x79, 0xa1, 0x39, 0xbd, 0xe1, 0x38, 0xe7, 0xa5, 0xf9, 0xbb, - 0xdb, 0x00, 0xd7, 0x9a, 0x03, 0xd5, 0x67, 0xf8, 0x23, 0xe4, 0x0c, 0x37, 0x7c, 0x02, 0xe2, 0xd8, - 0xec, 0x75, 0xc8, 0xf2, 0xbf, 0x1c, 0x0d, 0xc0, 0x89, 0x0b, 0x34, 0x04, 0xf2, 0xc4, 0xd7, 0xf2, - 0xe7, 0xbd, 0xf5, 0xd7, 0x4f, 0xfd, 0xb2, 0x50, 0x07, 0x5c, 0x1a, 0xfe, 0xa4, 0x9a, 0xf8, 0x34, - 0x6b, 0xfd, 0x5a, 0x84, 0x01, 0x3a, 0xdb, 0xfc, 0x77, 0x0e, 0xfd, 0x0b, 0x9b, 0x00, 0x0a, 0xad, - 0xfc, 0xa5, 0x91, 0xfe, 0xc1, 0x51, 0xfd, 0x0c, 0x1f, 0xfa, 0x71, 0xdc, 0xfd, 0x8c, 0x7d, 0xff, - 0xef, 0xf7, 0xfe, 0xde, 0xbf, 0xfe, 0x5a, 0x80, 0x3b, 0xe4, 0x33, 0x3a, 0xd0, 0xd2, 0xfa, 0x81, - 0x92, 0x00, 0xd7, 0x17, 0x01, 0x77, 0x35, 0xf8, 0x2c, 0x14, 0x0d, 0x2c, 0x99, 0x03, 0x83, 0x8b, - 0xed, 0x9f, 0x64, 0xef, 0x0d, 0x40, 0x0c, 0x33, 0xdf, 0x0e, 0x42, 0x47, 0xf5, 0x5e, 0x4a, 0xf2, - 0x77, 0xdf, 0xf1, 0x96, 0x42, 0xfb, 0xe3, 0x27, 0x08, 0xc8, 0xa6, 0x00, 0x67, 0x15, 0xf9, 0x1e, - 0xf2, 0xfb, 0x23, 0x47, 0x01, 0x1e, 0xac, 0xfc, 0x65, 0x06, 0xfd, 0xb5, 0x16, 0x00, 0xac, 0xe4, - 0xfb, 0x2b, 0xca, 0xfe, 0xcf, 0xca, 0xfd, 0xd1, 0x8a, 0xfa, 0x2c, 0xae, 0xfd, 0xfe, 0x7c, 0xff, - 0xbc, 0x3d, 0xff, 0x50, 0xe4, 0xfe, 0x36, 0x9f, 0x3b, 0x30, 0x52, 0x3b, 0x24, 0xf1, 0xfc, 0xb2, - 0x31, 0x01, 0x6f, 0xbc, 0xff, 0xfb, 0x8a, 0xf7, 0x44, 0x63, 0x0c, 0xe2, 0xbe, 0x03, 0x7c, 0xe9, - 0xed, 0xc9, 0x9e, 0xec, 0xef, 0x0f, 0x0a, 0x99, 0xbd, 0x10, 0xf5, 0x62, 0xf9, 0xc4, 0x25, 0xf3, - 0x73, 0x9a, 0xee, 0xa6, 0x1e, 0xf9, 0xce, 0x1d, 0x08, 0xc6, 0x25, 0x03, 0xe5, 0xbc, 0xfa, 0x46, - 0x2c, 0xfa, 0xb0, 0xe1, 0x00, 0xa3, 0xf6, 0xfc, 0xee, 0x34, 0xfc, 0xea, 0xa1, 0xff, 0xe6, 0xfa, - 0xfb, 0xda, 0x14, 0xff, 0x24, 0xe0, 0xfd, 0xd3, 0xdc, 0xfa, 0x0b, 0x42, 0xfd, 0xa7, 0xee, 0xfe, - 0x69, 0xab, 0xff, 0xdd, 0xa2, 0xfe, 0xa1, 0x20, 0x3a, 0x26, 0xcf, 0x3b, 0xfe, 0xe5, 0x00, 0x49, - 0xbf, 0x03, 0x20, 0x2e, 0xff, 0x5a, 0xa9, 0xf6, 0x50, 0x5e, 0x0b, 0xf8, 0x07, 0x03, 0x82, 0xf7, - 0xed, 0x4d, 0x42, 0xea, 0x58, 0xeb, 0x06, 0xfa, 0x0f, 0x11, 0x4c, 0xe2, 0xfd, 0xe9, 0x7b, 0xf7, - 0x00, 0x8e, 0xec, 0xd3, 0x3f, 0xf5, 0x29, 0xdb, 0x07, 0x35, 0x41, 0x05, 0x11, 0x54, 0xfd, 0x10, - 0x7d, 0xf9, 0x46, 0x74, 0xff, 0x83, 0x9d, 0xfd, 0x75, 0x1c, 0xfc, 0xc2, 0x86, 0xff, 0x3b, 0x8f, - 0xfc, 0xa2, 0xae, 0xff, 0xeb, 0xc3, 0xfd, 0x2d, 0x68, 0xfa, 0x2c, 0x32, 0xfd, 0xea, 0x38, 0xfe, - 0xe0, 0x87, 0xff, 0xf2, 0x96, 0xfe, 0xa3, 0xfe, 0x37, 0x53, 0xdf, 0x3a, 0xa8, 0x93, 0x05, 0x3f, - 0x4b, 0x06, 0x6c, 0x15, 0xff, 0x40, 0x20, 0xf7, 0xc3, 0xf7, 0x08, 0x5e, 0xdc, 0x02, 0x81, 0xdf, - 0xee, 0xa7, 0x34, 0xe7, 0x6a, 0xde, 0x03, 0xdc, 0xa7, 0x0f, 0x4f, 0x9e, 0x00, 0x97, 0x86, 0xfd, - 0xa3, 0xfd, 0xec, 0xd9, 0xaa, 0xf0, 0xcc, 0x87, 0x06, 0x8d, 0x5d, 0x06, 0x1f, 0xd3, 0xfe, 0xa3, - 0xe7, 0xfa, 0xfa, 0x86, 0xfe, 0x10, 0xa7, 0xfd, 0x38, 0x54, 0xfd, 0xe0, 0x22, 0xff, 0x82, 0x32, - 0xfc, 0x4a, 0x36, 0x00, 0xca, 0x14, 0xfe, 0x28, 0xcd, 0xf9, 0xd9, 0xe5, 0xfc, 0xdd, 0x9d, 0xfd, - 0xbe, 0xe9, 0xfe, 0xf4, 0x4b, 0xff, 0x18, 0x73, 0x35, 0xd8, 0x76, 0x38, 0xef, 0x2f, 0x09, 0x43, - 0x76, 0x08, 0xaa, 0xd8, 0xff, 0xe9, 0xfe, 0xf8, 0x9a, 0x43, 0x06, 0x8e, 0xca, 0x01, 0xb9, 0xab, - 0xf0, 0xe9, 0x4a, 0xe5, 0xc6, 0x7c, 0x00, 0x64, 0x13, 0x0e, 0xce, 0x2b, 0x01, 0xbb, 0x0f, 0x02, - 0x54, 0x60, 0xf0, 0x37, 0x24, 0xec, 0xd9, 0xdc, 0x02, 0x94, 0xf2, 0x06, 0x34, 0xcc, 0xff, 0x64, - 0x39, 0xfd, 0x7d, 0xef, 0xfe, 0xd7, 0x41, 0xfd, 0x4e, 0xf1, 0xfd, 0x0e, 0x17, 0xff, 0x0a, 0xd4, - 0xfb, 0xef, 0xc5, 0xff, 0xc6, 0xef, 0xfd, 0x7a, 0x26, 0xf9, 0x5e, 0xcf, 0xfc, 0x4c, 0xdd, 0xfd, - 0x77, 0xaf, 0xfe, 0xb2, 0x16, 0x00, 0x72, 0x47, 0x32, 0xce, 0xd0, 0x35, 0x21, 0x9f, 0x0a, 0x70, - 0xe1, 0x0b, 0xf9, 0xe5, 0x01, 0x39, 0x22, 0xf8, 0x70, 0x87, 0x05, 0x6a, 0x31, 0x01, 0xdc, 0xd4, - 0xf1, 0x89, 0xbc, 0xe5, 0xdf, 0x44, 0xfc, 0xbf, 0x4e, 0x0d, 0xc8, 0x5e, 0x01, 0x15, 0x2b, 0x03, - 0xb1, 0x6f, 0xf5, 0xbb, 0x27, 0xe9, 0xfc, 0x38, 0xfd, 0x78, 0x92, 0x07, 0x90, 0x80, 0x01, 0x19, - 0x8d, 0xfe, 0x4b, 0x44, 0xff, 0xb9, 0x83, 0xfd, 0x3a, 0x4f, 0xfe, 0xd9, 0x75, 0xff, 0x11, 0x51, - 0xfb, 0xac, 0xb9, 0xfd, 0x9c, 0x66, 0xfe, 0x56, 0xfe, 0xf9, 0x5a, 0x63, 0xfc, 0xc9, 0x37, 0xfe, - 0xb2, 0xba, 0xfe, 0xea, 0x9a, 0x00, 0x12, 0x31, 0x30, 0x77, 0x8e, 0x34, 0xf4, 0x60, 0x09, 0x41, - 0xcf, 0x0b, 0x44, 0xb2, 0x05, 0xc2, 0xaa, 0xf7, 0x7a, 0x4a, 0x03, 0xcd, 0xa3, 0x01, 0xd8, 0x1a, - 0xf4, 0x84, 0xc6, 0xe8, 0xc3, 0xb6, 0xf9, 0xea, 0x4c, 0x0c, 0x2b, 0x9e, 0x00, 0x46, 0xa1, 0xff, - 0x70, 0x3c, 0xfb, 0x51, 0xf3, 0xeb, 0xf1, 0x74, 0xf6, 0xe9, 0x8b, 0x05, 0x5b, 0x23, 0x03, 0x88, - 0xdd, 0xff, 0xb0, 0x7d, 0x00, 0x40, 0xeb, 0xfd, 0x57, 0xe6, 0xfd, 0x63, 0x09, 0xff, 0x65, 0x0b, - 0xfb, 0xbd, 0xb5, 0xfc, 0x1e, 0x37, 0xff, 0xe0, 0x52, 0xfb, 0x4d, 0x46, 0xfc, 0x5d, 0x1c, 0xff, - 0x30, 0xdb, 0xfe, 0x6c, 0xd6, 0xff, 0x2f, 0xc8, 0x2d, 0x8c, 0x1b, 0x33, 0xe5, 0xe6, 0x07, 0x7e, - 0xeb, 0x0a, 0x26, 0x71, 0x08, 0x89, 0xd3, 0xf9, 0x45, 0x41, 0x02, 0x0f, 0x22, 0xfe, 0x8c, 0x7b, - 0xf6, 0xab, 0x5e, 0xef, 0x71, 0x76, 0xf7, 0x9f, 0xbc, 0x0a, 0xf7, 0xce, 0x01, 0x8e, 0xe5, 0xfa, - 0x4c, 0x0d, 0xfe, 0xed, 0x81, 0xf2, 0xa5, 0x18, 0xf2, 0x40, 0x59, 0x01, 0x8c, 0x43, 0x04, 0x9b, - 0x8e, 0xff, 0xb2, 0xa4, 0x00, 0xb3, 0x3c, 0x00, 0x07, 0xd8, 0xfd, 0x22, 0x04, 0xfd, 0x43, 0x63, - 0xfb, 0x34, 0x02, 0xfd, 0x0b, 0xfd, 0xff, 0x52, 0xa6, 0xfd, 0x3e, 0xc3, 0xfb, 0x38, 0x2b, 0xfe, - 0x80, 0x64, 0xff, 0x8e, 0xa8, 0xff, 0x06, 0xf5, 0x2a, 0x57, 0x4c, 0x2f, 0x64, 0x28, 0x07, 0x2a, - 0x2f, 0x0c, 0x79, 0x60, 0x0a, 0x66, 0xa5, 0xfa, 0xe5, 0x81, 0x01, 0x9d, 0x1b, 0xfe, 0x1e, 0x75, - 0xf7, 0x57, 0xae, 0xf1, 0x06, 0xf9, 0xf7, 0xde, 0x6a, 0x09, 0x98, 0x1b, 0x03, 0x3a, 0xd9, 0xf9, - 0x1e, 0xcb, 0xfd, 0xe6, 0x1f, 0xf8, 0x03, 0x03, 0xf2, 0x95, 0xda, 0xfc, 0x0f, 0xf9, 0x03, 0x05, - 0x4b, 0xff, 0xab, 0x85, 0xff, 0xee, 0x7c, 0x00, 0xa0, 0x9d, 0xfe, 0x5b, 0x8b, 0xfd, 0x5c, 0xc9, - 0xfb, 0x84, 0x13, 0xfd, 0xa3, 0x5c, 0x00, 0xb3, 0xf4, 0xfe, 0x84, 0x7b, 0xfb, 0x0b, 0x66, 0xfd, - 0x33, 0x09, 0x00, 0xbc, 0x9d, 0xff, 0xe6, 0xa4, 0x26, 0x50, 0xab, 0x2a, 0xc1, 0xa4, 0x07, 0xca, - 0xd9, 0x0d, 0x25, 0x57, 0x0b, 0x96, 0x85, 0xfa, 0x3c, 0x20, 0x01, 0x50, 0x78, 0x00, 0xcf, 0xee, - 0xf9, 0xa0, 0x54, 0xf2, 0x9f, 0x2a, 0xf6, 0xee, 0x2c, 0x07, 0x84, 0x1c, 0x05, 0xd6, 0xd7, 0xfa, - 0xd8, 0x2c, 0xfd, 0x34, 0xe4, 0xfb, 0xcf, 0x0a, 0xf4, 0x92, 0xec, 0xfa, 0xd5, 0x8c, 0x03, 0xc0, - 0xda, 0xfe, 0x6b, 0xbb, 0xfd, 0xec, 0x4d, 0xff, 0xe4, 0x2e, 0xfe, 0xbb, 0x5c, 0xfe, 0xef, 0x0d, - 0xfe, 0xdc, 0x71, 0xfd, 0x85, 0x82, 0xfe, 0xe8, 0xe2, 0xfe, 0x3d, 0xd6, 0xfc, 0xe4, 0x39, 0xfe, - 0x3d, 0x69, 0x00, 0x9e, 0x66, 0xff, 0xa8, 0x6f, 0x26, 0x4e, 0x61, 0x26, 0x98, 0x2e, 0x05, 0xcb, - 0x8c, 0x12, 0x5d, 0x44, 0x0d, 0xc0, 0x5c, 0xf7, 0xe0, 0xf6, 0x00, 0x6f, 0xcc, 0x03, 0xc9, 0x7d, - 0xfc, 0x92, 0x03, 0xf2, 0xd4, 0x82, 0xf3, 0x5a, 0x28, 0x05, 0xa8, 0x0f, 0x06, 0xfb, 0x49, 0xfc, - 0xf6, 0x12, 0xff, 0xcf, 0xf3, 0xfd, 0xd7, 0x68, 0xf2, 0x2a, 0xf1, 0xf9, 0xe9, 0x30, 0x05, 0x04, - 0x4b, 0xfe, 0x3e, 0x8b, 0xfc, 0x8f, 0xd1, 0xfe, 0xb7, 0x85, 0xfc, 0x08, 0x74, 0xfd, 0x29, 0xe0, - 0xfe, 0x4f, 0xba, 0xfd, 0x7b, 0xc6, 0xfe, 0x75, 0x80, 0xff, 0xd2, 0xc5, 0xfc, 0x62, 0x1e, 0xff, - 0x4e, 0xdd, 0x01, 0xd4, 0x91, 0xff, 0x96, 0xdf, 0x20, 0xb5, 0x05, 0x24, 0xa0, 0x99, 0x09, 0xa8, - 0xed, 0x11, 0xdd, 0x35, 0x0b, 0xf9, 0xaa, 0xf7, 0xe6, 0x8c, 0x00, 0x78, 0x85, 0x02, 0xf5, 0x62, - 0xfb, 0xb8, 0x19, 0xf6, 0x39, 0x1b, 0xf6, 0x1b, 0x76, 0x00, 0xd0, 0x55, 0x03, 0x6a, 0x40, 0xfe, - 0x8c, 0x87, 0x00, 0xc0, 0x04, 0x00, 0x94, 0x04, 0xf6, 0xc5, 0x09, 0xf8, 0xf5, 0x85, 0x01, 0x8d, - 0x17, 0x01, 0x0a, 0x80, 0xff, 0x1f, 0x72, 0xfe, 0xe6, 0x9a, 0xfc, 0xc4, 0x0c, 0xfe, 0xf7, 0x1e, - 0xff, 0x62, 0x9e, 0xfe, 0x16, 0x18, 0xff, 0xd0, 0x17, 0xff, 0x50, 0x95, 0xfd, 0xc3, 0x8e, 0xfe, - 0xb6, 0x74, 0x00, 0xf1, 0x8a, 0xff, 0xb9, 0x53, 0x1d, 0x0d, 0xcc, 0x20, 0x83, 0x81, 0x09, 0x00, - 0xc7, 0x0f, 0xa4, 0x52, 0x0a, 0xa3, 0x3f, 0xfb, 0x60, 0x24, 0x02, 0x30, 0x60, 0x01, 0x1b, 0x75, - 0xfb, 0xe6, 0x7c, 0xf7, 0x7f, 0x6e, 0xf7, 0xce, 0xe0, 0xff, 0x8c, 0xec, 0x01, 0x5e, 0x85, 0xfe, - 0xbb, 0x2c, 0x00, 0xe1, 0x70, 0x00, 0x08, 0x3d, 0xf9, 0xb3, 0xf5, 0xf8, 0xee, 0xfc, 0x00, 0x8c, - 0x12, 0x02, 0xff, 0x46, 0xff, 0xe9, 0xca, 0xfd, 0x4c, 0x82, 0xfd, 0x8e, 0xe6, 0xfe, 0x28, 0x1a, - 0xff, 0xdd, 0x42, 0xfe, 0xc8, 0x1c, 0xfe, 0xb2, 0x91, 0xfe, 0x00, 0x99, 0xfe, 0xfe, 0xe5, 0xfe, - 0xd6, 0x5f, 0xff, 0xcb, 0x00, 0xff, 0x03, 0x8e, 0x1a, 0x0b, 0xe7, 0x1d, 0x61, 0x0a, 0x09, 0x21, - 0xfc, 0x0c, 0x8e, 0x55, 0x09, 0x91, 0xde, 0xfe, 0x36, 0xd7, 0x02, 0xb7, 0x3b, 0x00, 0xff, 0x8c, - 0xfb, 0x68, 0x2b, 0xf8, 0x65, 0x10, 0xf9, 0x1a, 0xdd, 0xff, 0x81, 0xeb, 0x00, 0xb5, 0xd0, 0xfe, - 0x70, 0x06, 0x00, 0x9a, 0xa0, 0x00, 0x7b, 0xe6, 0xfa, 0xe3, 0x3a, 0xfa, 0x0d, 0x73, 0x01, 0xf6, - 0x28, 0x02, 0x99, 0x0b, 0xff, 0x58, 0x05, 0xfe, 0xd3, 0x45, 0xfe, 0x3f, 0x31, 0xff, 0x13, 0xe9, - 0xfe, 0xda, 0x06, 0xfe, 0xca, 0x85, 0xfd, 0x6b, 0x22, 0xfe, 0xca, 0xa4, 0xfe, 0xd1, 0xa8, 0xfe, - 0x54, 0x37, 0xff, 0x4c, 0x63, 0xff, 0xf3, 0x8a, 0x17, 0x08, 0x51, 0x1b, 0x77, 0x34, 0x08, 0xa4, - 0x7f, 0x0a, 0x61, 0x9c, 0x09, 0xf2, 0x1e, 0x01, 0xcc, 0x75, 0x02, 0x58, 0xfa, 0xff, 0xc5, 0xb7, - 0xfb, 0xe1, 0x13, 0xf9, 0x51, 0xfa, 0xfa, 0x6e, 0xd1, 0xff, 0x36, 0x2d, 0x00, 0xa5, 0x7c, 0xff, - 0xf8, 0xa2, 0x00, 0xef, 0x99, 0x00, 0x6f, 0xda, 0xfb, 0xd5, 0xe5, 0xfb, 0xd1, 0xdb, 0x01, 0x3c, - 0xda, 0x01, 0xb7, 0x09, 0xff, 0x43, 0x11, 0xfe, 0x89, 0xb8, 0xfe, 0xbf, 0x98, 0xff, 0x16, 0xc7, - 0xfe, 0x8c, 0xf2, 0xfd, 0x08, 0x88, 0xfd, 0x4a, 0x55, 0xfe, 0xc2, 0xd7, 0xfe, 0x78, 0x75, 0xfe, - 0x00, 0x4d, 0xff, 0x73, 0xdc, 0xff, 0x48, 0x22, 0x15, 0x58, 0x6e, 0x18, 0xe3, 0x48, 0x07, 0xa6, - 0xe3, 0x09, 0xfb, 0x7b, 0x09, 0xaf, 0x37, 0x01, 0x06, 0x08, 0x02, 0x24, 0x10, 0x00, 0x5d, 0x16, - 0xfc, 0xed, 0x28, 0xfa, 0x29, 0x5e, 0xfc, 0x58, 0x90, 0xff, 0xac, 0x88, 0xff, 0xbe, 0x3c, 0x00, - 0xac, 0x46, 0x01, 0xb0, 0x79, 0x00, 0x19, 0xd1, 0xfc, 0x04, 0x21, 0xfd, 0x9a, 0x42, 0x01, 0x6e, - 0xe0, 0x00, 0x2e, 0x18, 0xff, 0xe7, 0x7b, 0xfe, 0x46, 0xfd, 0xfe, 0x82, 0x83, 0xff, 0xc7, 0xc4, - 0xfe, 0x73, 0x6b, 0xfe, 0x75, 0x34, 0xfe, 0x7b, 0xcb, 0xfe, 0xcd, 0xc3, 0xfe, 0xcc, 0x2c, 0xfe, - 0x55, 0x2f, 0xff, 0x79, 0xdf, 0xff, 0x48, 0x33, 0x12, 0x64, 0xc0, 0x15, 0xf9, 0x24, 0x07, 0xff, - 0xf7, 0x08, 0xd8, 0x61, 0x08, 0x23, 0x83, 0x01, 0x85, 0x89, 0x02, 0xf6, 0x47, 0x00, 0x07, 0x5e, - 0xfc, 0xb9, 0x16, 0xfb, 0xa4, 0x80, 0xfd, 0x10, 0xd6, 0xff, 0x76, 0x99, 0xff, 0x64, 0x30, 0x01, - 0x98, 0xcb, 0x01, 0xb0, 0x56, 0x00, 0xfa, 0xd6, 0xfd, 0x14, 0xd7, 0xfd, 0xd0, 0x64, 0x00, 0x75, - 0x6a, 0x00, 0xb4, 0x71, 0xff, 0x43, 0xbc, 0xfe, 0x20, 0x1e, 0xff, 0x84, 0xd6, 0xff, 0x36, 0x66, - 0xff, 0x48, 0x18, 0xff, 0x09, 0x91, 0xfe, 0x9b, 0xa5, 0xfe, 0xa2, 0x8f, 0xfe, 0x8b, 0x47, 0xfe, - 0xa7, 0x55, 0xff, 0x4c, 0xda, 0xff, 0x40, 0x53, 0x0f, 0x1f, 0x8a, 0x12, 0xe3, 0x35, 0x07, 0xb1, - 0x85, 0x08, 0x03, 0x26, 0x07, 0xf7, 0x0b, 0x02, 0x95, 0x19, 0x03, 0x2c, 0x7e, 0x00, 0x37, 0xed, - 0xfc, 0x0d, 0x0e, 0xfc, 0x3e, 0xeb, 0xfe, 0xd1, 0xdd, 0x00, 0xb9, 0x23, 0x00, 0x6f, 0xd1, 0x01, - 0x7e, 0x17, 0x02, 0x33, 0x6f, 0x00, 0xbe, 0xbf, 0xfe, 0xa0, 0x95, 0xfe, 0x86, 0xef, 0xff, 0xde, - 0xf0, 0xff, 0x35, 0x9a, 0xff, 0xa3, 0x30, 0xff, 0xd8, 0xb8, 0xff, 0xa4, 0x3f, 0x00, 0x8e, 0x77, - 0xff, 0x0c, 0x4a, 0xff, 0xfe, 0xe1, 0xfe, 0xd2, 0xb8, 0xfe, 0x46, 0xcc, 0xfe, 0xe3, 0xac, 0xfe, - 0x55, 0x5b, 0xff, 0xa9, 0xc2, 0xff, 0x21, 0x36, 0x0d, 0x94, 0xe2, 0x0f, 0xad, 0x9a, 0x06, 0x09, - 0x9d, 0x07, 0x68, 0xff, 0x05, 0xfb, 0x11, 0x02, 0x63, 0x8f, 0x03, 0x8d, 0x29, 0x01, 0xbb, 0xbc, - 0xfd, 0x2b, 0xad, 0xfd, 0x21, 0xdc, 0x00, 0x04, 0x4e, 0x02, 0x6b, 0x0a, 0x01, 0x1b, 0xff, 0x01, - 0xf4, 0x3f, 0x02, 0x6b, 0xb5, 0x00, 0x5b, 0x30, 0xff, 0xa3, 0xd0, 0xfe, 0xb8, 0x62, 0xff, 0x1d, - 0xd0, 0xff, 0x85, 0x45, 0x00, 0x33, 0xa3, 0xff, 0xd3, 0x9b, 0xff, 0xbc, 0x28, 0x00, 0x9e, 0xbd, - 0xff, 0x42, 0xb3, 0xff, 0xa3, 0x37, 0xff, 0xb8, 0xd1, 0xfe, 0x7e, 0xff, 0xfe, 0x42, 0xfc, 0xfe, - 0x84, 0x74, 0xff, 0xb3, 0xe2, 0xff, 0x04, 0x63, 0x0c, 0x62, 0x63, 0x0e, 0xe2, 0x60, 0x05, 0x1d, - 0x4b, 0x06, 0x5d, 0x28, 0x05, 0xfb, 0x4b, 0x02, 0xae, 0x29, 0x04, 0xaa, 0xac, 0x02, 0xa2, 0xac, - 0xff, 0x3c, 0xfa, 0xfe, 0x7c, 0x15, 0x02, 0x6f, 0x57, 0x03, 0xcd, 0x89, 0x01, 0xee, 0xe2, 0x01, - 0x55, 0x6d, 0x01, 0x63, 0xfd, 0xff, 0x87, 0x38, 0xff, 0xee, 0x4f, 0xff, 0x57, 0xe5, 0xff, 0x2a, - 0x0f, 0x00, 0x3b, 0x42, 0x00, 0x31, 0x98, 0xff, 0xb5, 0x9b, 0xff, 0xc3, 0x2c, 0x00, 0x9a, 0xe4, - 0xff, 0x04, 0xec, 0xff, 0x7f, 0x63, 0xff, 0x80, 0x02, 0xff, 0x6d, 0x54, 0xff, 0x79, 0x7c, 0xff, - 0xb3, 0xcd, 0xff, 0x17, 0xe9, 0xff, 0xdf, 0x8b, 0x0b, 0xd1, 0x5e, 0x0d, 0x08, 0xb1, 0x04, 0x98, - 0x4f, 0x06, 0x5f, 0x2e, 0x06, 0x62, 0x4b, 0x03, 0x8c, 0xcf, 0x04, 0xcb, 0x56, 0x03, 0x5a, 0xa7, - 0x00, 0xa5, 0x1c, 0x00, 0x47, 0x83, 0x02, 0xe7, 0x0f, 0x03, 0x19, 0xd4, 0x00, 0x59, 0xba, 0x00, - 0x64, 0x63, 0x00, 0x77, 0xfc, 0xff, 0xe7, 0x15, 0x00, 0x45, 0xec, 0xff, 0xe3, 0xea, 0xff, 0x68, - 0xa1, 0xff, 0x1f, 0xc6, 0xff, 0xba, 0x8e, 0xff, 0x49, 0xc4, 0xff, 0x76, 0x49, 0x00, 0xa7, 0x0c, - 0x00, 0xe3, 0x50, 0x00, 0xa8, 0xf1, 0xff, 0x0b, 0x46, 0xff, 0xc0, 0x56, 0xff, 0x29, 0x67, 0xff, - 0x44, 0x91, 0xff, 0x69, 0x81, 0xff, 0x1d, 0xb5, 0x0b, 0xda, 0x95, 0x0e, 0x5f, 0x58, 0x06, 0x42, - 0x5d, 0x07, 0xcd, 0xa4, 0x06, 0x4b, 0xa0, 0x03, 0x00, 0x15, 0x05, 0xea, 0xe6, 0x02, 0x27, 0x8c, - 0xff, 0x7a, 0xfe, 0xfe, 0xbd, 0xb6, 0x01, 0xf4, 0x8c, 0x02, 0x04, 0x8d, 0x00, 0xdb, 0x8d, 0x00, - 0xec, 0x2a, 0x00, 0xf0, 0x12, 0x00, 0xef, 0x4a, 0x00, 0xee, 0xaa, 0xff, 0x20, 0x7b, 0xff, 0x0f, - 0x89, 0xff, 0x96, 0xed, 0xff, 0xd3, 0x9f, 0xff, 0xea, 0xeb, 0xff, 0x49, 0x91, 0x00, 0x04, 0x21, - 0x00, 0x13, 0x63, 0x00, 0xd5, 0x3e, 0x00, 0x94, 0x71, 0xff, 0x1a, 0x26, 0xff, 0x0c, 0xfd, 0xfe, - 0x8e, 0xed, 0xfe, 0xbc, 0xfc, 0xfe, 0xd1, 0x69, 0x0c, 0xfe, 0x78, 0x0f, 0x5b, 0xe9, 0x06, 0xd8, - 0x68, 0x07, 0x40, 0x40, 0x06, 0x7a, 0x8e, 0x03, 0x06, 0x56, 0x05, 0x38, 0xf6, 0x02, 0x95, 0x18, - 0xff, 0x6f, 0xdb, 0xfd, 0xac, 0x49, 0x00, 0x11, 0xdc, 0x01, 0x03, 0xd7, 0x00, 0x43, 0xd8, 0x00, - 0x80, 0x24, 0x00, 0xc9, 0x0d, 0x00, 0x7c, 0x6e, 0x00, 0xbd, 0x0d, 0x00, 0xda, 0xe1, 0xff, 0xac, - 0xab, 0xff, 0x17, 0xc9, 0xff, 0xa3, 0x87, 0xff, 0x23, 0xee, 0xff, 0xe1, 0x44, 0x00, 0x6e, 0xa7, - 0xff, 0xfa, 0x3d, 0x00, 0xde, 0xa2, 0x00, 0xb7, 0x1a, 0x00, 0xe4, 0x64, 0xff, 0x19, 0xab, 0xfe, - 0xf8, 0x93, 0xfe, 0x0a, 0xca, 0xfe, 0x97, 0x9f, 0x0c, 0x4e, 0x84, 0x0f, 0x0c, 0x07, 0x06, 0x4b, - 0x57, 0x06, 0x85, 0xb4, 0x05, 0x8b, 0x4e, 0x03, 0x5a, 0x56, 0x05, 0x11, 0x16, 0x03, 0xea, 0xf1, - 0xfe, 0x6d, 0xa7, 0xfd, 0xca, 0x0d, 0x01, 0x59, 0xca, 0x02, 0x36, 0x63, 0x00, 0x66, 0xe3, 0xff, - 0x3d, 0x7b, 0xff, 0x21, 0x7d, 0xff, 0xba, 0x9f, 0x00, 0x7a, 0x30, 0x01, 0xda, 0xe6, 0x00, 0x98, - 0x27, 0x00, 0xca, 0x0f, 0x00, 0x77, 0x7b, 0xff, 0xf6, 0x89, 0xff, 0xa3, 0xe7, 0xff, 0xa4, 0x73, - 0xff, 0x9e, 0xd6, 0xff, 0x2d, 0xef, 0xff, 0x74, 0x05, 0x00, 0xb1, 0x5e, 0x00, 0xfb, 0xc3, 0xff, - 0x51, 0x0c, 0xff, 0xba, 0xb9, 0xfe, 0x03, 0xb1, 0x0d, 0xc0, 0xde, 0x10, 0x7d, 0x0b, 0x06, 0xd4, - 0x86, 0x05, 0xdb, 0x61, 0x04, 0x4c, 0x03, 0x02, 0xc6, 0xa8, 0x04, 0x16, 0x8f, 0x02, 0xb8, 0x69, - 0xfe, 0xb5, 0xb4, 0xfc, 0x40, 0x86, 0x00, 0x00, 0xbc, 0x03, 0x2f, 0xb3, 0x01, 0xab, 0x7d, 0x00, - 0xb8, 0x08, 0xff, 0x47, 0x91, 0xfe, 0x94, 0x05, 0x00, 0x2b, 0xd9, 0x00, 0xc1, 0x1e, 0x01, 0xa7, - 0x0f, 0x01, 0xcc, 0xf1, 0x00, 0xb0, 0xec, 0xff, 0x6e, 0xd0, 0xff, 0x5f, 0x2c, 0x00, 0xd3, 0x5a, - 0xff, 0xe8, 0x73, 0xff, 0x47, 0x8d, 0xff, 0x13, 0x4d, 0xff, 0xd2, 0xb1, 0xff, 0xf0, 0x28, 0x00, - 0xa4, 0x54, 0x00, 0x57, 0x08, 0x00, 0xfc, 0x4e, 0x0f, 0xb9, 0x16, 0x13, 0x5f, 0x91, 0x06, 0x1f, - 0x9d, 0x05, 0x0a, 0x44, 0x04, 0x56, 0x58, 0x01, 0xe2, 0x0e, 0x04, 0xc3, 0x4a, 0x01, 0x9a, 0x9c, - 0xfc, 0xaa, 0x8a, 0xfa, 0x4f, 0x14, 0xff, 0x96, 0x36, 0x04, 0x56, 0x47, 0x02, 0x31, 0x5f, 0x00, - 0x8f, 0x3a, 0xff, 0xc8, 0x0c, 0xff, 0x05, 0x2b, 0x00, 0x1a, 0xd1, 0x00, 0xf6, 0xf6, 0x00, 0xc8, - 0x63, 0x00, 0x77, 0xc6, 0x00, 0xfc, 0x9b, 0x00, 0x92, 0x40, 0x00, 0x19, 0x77, 0x00, 0xb7, 0xcf, - 0xff, 0x43, 0xad, 0xff, 0xce, 0x8f, 0xff, 0xd9, 0x21, 0xff, 0x81, 0x3a, 0xff, 0x27, 0xac, 0xff, - 0xf9, 0x3b, 0x00, 0x68, 0xb1, 0x00, 0x0a, 0x8e, 0x11, 0x0a, 0xac, 0x15, 0x18, 0xde, 0x06, 0x9c, - 0xfe, 0x05, 0x49, 0x97, 0x04, 0xe5, 0xf6, 0x00, 0x75, 0xfa, 0x03, 0x50, 0x7c, 0x00, 0xd7, 0xf8, - 0xfa, 0x5e, 0x4f, 0xf8, 0x0f, 0xb8, 0xfd, 0x59, 0x9e, 0x04, 0x57, 0x0b, 0x02, 0x2e, 0x3a, 0xff, - 0x56, 0x69, 0xfe, 0x95, 0xac, 0xfe, 0xfe, 0x72, 0x00, 0x2f, 0x8c, 0x01, 0x7d, 0x49, 0x01, 0x53, - 0x7b, 0x00, 0x68, 0x10, 0x01, 0xf6, 0x4b, 0x00, 0xe8, 0xf9, 0xff, 0x6c, 0xb1, 0x00, 0x49, 0xbc, - 0xff, 0xf1, 0xce, 0xff, 0xe0, 0xf5, 0xff, 0x06, 0x5e, 0xff, 0x23, 0x51, 0xff, 0x6a, 0xdf, 0xff, - 0x05, 0x67, 0x00, 0xcb, 0x17, 0x00, 0x50, 0x8f, 0x14, 0xb5, 0x38, 0x18, 0x18, 0x77, 0x06, 0x2c, - 0xa0, 0x06, 0x1c, 0x06, 0x05, 0xd5, 0xb6, 0x00, 0x75, 0x7b, 0x04, 0xb2, 0x02, 0x00, 0x56, 0x65, - 0xf9, 0x07, 0x1f, 0xf6, 0xaf, 0x1a, 0xfd, 0xa4, 0xba, 0x05, 0x3f, 0xb6, 0x01, 0xfa, 0xc0, 0xfd, - 0x64, 0x2b, 0xfd, 0x93, 0xcd, 0xfd, 0xa0, 0xde, 0xff, 0x84, 0x55, 0x01, 0x5b, 0x3e, 0x01, 0x81, - 0x6c, 0x00, 0x95, 0x97, 0x01, 0x20, 0xd4, 0x00, 0xed, 0xcc, 0xff, 0x60, 0x6f, 0x00, 0xae, 0xb4, - 0xff, 0xac, 0xbe, 0xff, 0xaa, 0xf4, 0xff, 0xb7, 0x7e, 0xff, 0x34, 0x9f, 0xff, 0xc8, 0x46, 0x00, - 0x3a, 0x4f, 0x00, 0x77, 0xe5, 0xff, 0x42, 0xe5, 0x18, 0x91, 0x73, 0x1b, 0xfb, 0x02, 0x05, 0xeb, - 0x11, 0x07, 0x26, 0x80, 0x05, 0x33, 0x1f, 0x00, 0xa2, 0x01, 0x05, 0x05, 0x16, 0xff, 0xa3, 0x7b, - 0xf7, 0x15, 0x59, 0xf4, 0x90, 0x4b, 0xfd, 0xdd, 0x18, 0x07, 0x37, 0xf5, 0x00, 0x71, 0x58, 0xfc, - 0x94, 0x2a, 0xfc, 0x87, 0x16, 0xfd, 0x93, 0x5f, 0xff, 0x64, 0xbe, 0x00, 0x3c, 0xa2, 0x00, 0xb6, - 0xdd, 0xff, 0xc0, 0x76, 0x01, 0x52, 0x60, 0x00, 0x36, 0x70, 0xff, 0x1a, 0xb8, 0x00, 0x3d, 0xda, - 0xff, 0x69, 0xbe, 0xff, 0x0e, 0xba, 0xff, 0x90, 0x48, 0xff, 0xa4, 0x69, 0xff, 0xe7, 0x21, 0x00, - 0xb6, 0x7a, 0x00, 0xb4, 0xee, 0xff, 0x38, 0x55, 0x1d, 0x71, 0x38, 0x1f, 0xc3, 0x4b, 0x03, 0x67, - 0x17, 0x07, 0x88, 0x63, 0x06, 0xbd, 0x34, 0xff, 0xfe, 0x3b, 0x05, 0x75, 0x20, 0xfe, 0x8c, 0x4c, - 0xf5, 0xd6, 0x4f, 0xf3, 0x99, 0x10, 0xfe, 0x19, 0x2f, 0x08, 0xac, 0x50, 0x00, 0x10, 0x51, 0xfb, - 0x64, 0x2d, 0xfb, 0x9a, 0x9e, 0xfc, 0xef, 0x6f, 0xff, 0x2a, 0x2c, 0x00, 0x2f, 0x3b, 0x00, 0x70, - 0x8c, 0xff, 0x46, 0x0b, 0x01, 0x6e, 0xe8, 0xff, 0xd9, 0xf4, 0xfe, 0x0b, 0x9d, 0x00, 0x3a, 0xb3, - 0xff, 0xde, 0xa1, 0xff, 0xa8, 0x6a, 0xff, 0xf1, 0xcd, 0xfe, 0xbf, 0x2f, 0xff, 0xa4, 0xe0, 0xff, - 0xbf, 0x6f, 0x00, 0x58, 0x1f, 0x00, 0xf3, 0x14, 0x21, 0xcf, 0x3c, 0x23, 0x14, 0x59, 0x02, 0xaa, - 0x8c, 0x06, 0x9f, 0x27, 0x07, 0x98, 0x96, 0xfe, 0x05, 0x60, 0x05, 0x74, 0x63, 0xfd, 0xb2, 0x31, - 0xf3, 0x13, 0x87, 0xf2, 0x4a, 0xb6, 0xfe, 0xe2, 0x93, 0x08, 0x32, 0xe4, 0xff, 0x79, 0xe8, 0xfa, - 0x34, 0x7b, 0xfa, 0xae, 0x35, 0xfc, 0x30, 0x70, 0xff, 0xe4, 0xdf, 0xff, 0xb0, 0x15, 0x00, 0x05, - 0x4d, 0xff, 0xf2, 0x00, 0x01, 0xe9, 0xf3, 0xff, 0xae, 0x9b, 0xfe, 0x07, 0x05, 0x00, 0x11, 0x07, - 0xff, 0xcd, 0x78, 0xff, 0xa3, 0x12, 0xff, 0x18, 0x5a, 0xfe, 0x73, 0x2e, 0xff, 0xd9, 0xcf, 0xff, - 0x05, 0x74, 0x00, 0x1d, 0x24, 0x00, 0x82, 0xa7, 0x23, 0x66, 0x55, 0x27, 0x09, 0x4a, 0x03, 0x93, - 0x10, 0x06, 0xc8, 0xff, 0x06, 0xa4, 0x72, 0xfd, 0xad, 0x80, 0x05, 0x78, 0x20, 0xfd, 0x21, 0x77, - 0xf1, 0x99, 0x70, 0xf2, 0x47, 0x3a, 0xfe, 0xdf, 0xd6, 0x06, 0x49, 0xef, 0xff, 0xf6, 0xf1, 0xfb, - 0xdc, 0xdd, 0xf9, 0xb2, 0x30, 0xfb, 0xf5, 0x06, 0xff, 0xfa, 0x7d, 0xff, 0x80, 0x21, 0x01, 0xc1, - 0xfc, 0xff, 0x92, 0x04, 0x00, 0x9f, 0x85, 0xff, 0x4b, 0x86, 0xfe, 0xfa, 0xa8, 0xff, 0x75, 0x66, - 0xfe, 0x2f, 0xdc, 0xfe, 0x0f, 0xa5, 0xfe, 0x4e, 0x0e, 0xfe, 0x78, 0x2b, 0xff, 0x08, 0xab, 0xff, - 0xb9, 0x99, 0x00, 0xc9, 0x30, 0x00, 0x4c, 0x71, 0x24, 0xe5, 0x46, 0x2a, 0x70, 0xbe, 0x05, 0x23, - 0x87, 0x06, 0x29, 0x74, 0x07, 0x61, 0x0d, 0xfc, 0x07, 0x4b, 0x04, 0x3c, 0xc5, 0xfd, 0x54, 0x4b, - 0xf1, 0x16, 0x50, 0xf3, 0x06, 0x8c, 0xfd, 0x23, 0x70, 0x03, 0x0a, 0x3d, 0xff, 0x4d, 0xa2, 0xfd, - 0x14, 0xef, 0xfa, 0x9a, 0xe6, 0xfa, 0xf8, 0x5d, 0xfe, 0xa1, 0xe6, 0xfe, 0x6c, 0x59, 0x01, 0x10, - 0x08, 0x01, 0x6f, 0xbd, 0xff, 0xa4, 0xeb, 0xfe, 0x2f, 0x5d, 0xfe, 0xc3, 0x7a, 0xff, 0xa3, 0xa6, - 0xfe, 0x53, 0xe5, 0xfe, 0x2c, 0x6c, 0xfe, 0xb3, 0x02, 0xfe, 0x25, 0x0d, 0xff, 0x53, 0xf1, 0xfe, - 0xe5, 0x09, 0x00, 0xeb, 0x56, 0x00, 0xe0, 0x20, 0x25, 0xde, 0x10, 0x2c, 0xde, 0x30, 0x08, 0x8d, - 0x3f, 0x08, 0x51, 0x99, 0x08, 0xee, 0x36, 0xfb, 0x36, 0xf5, 0x01, 0x42, 0x22, 0xfd, 0x69, 0x3a, - 0xf1, 0xb7, 0xe3, 0xf4, 0x89, 0x57, 0xfe, 0x5f, 0x5d, 0xff, 0xa4, 0xc2, 0xfc, 0x89, 0x1e, 0xff, - 0x59, 0xe4, 0xfc, 0xaf, 0x59, 0xfc, 0xf7, 0xeb, 0xfd, 0x7f, 0x23, 0xfd, 0x09, 0xdf, 0x00, 0xdd, - 0xd3, 0x01, 0x04, 0xb7, 0xff, 0x4e, 0xc3, 0xfe, 0x59, 0xcb, 0xfe, 0x66, 0x5b, 0xff, 0x31, 0x8d, - 0xfe, 0x5b, 0x06, 0xff, 0x5c, 0x2d, 0xfe, 0x35, 0xc6, 0xfd, 0xa8, 0xee, 0xfe, 0x5c, 0x4f, 0xfe, - 0x41, 0x52, 0xff, 0xa7, 0x26, 0x00, 0xdb, 0x52, 0x26, 0x63, 0xec, 0x2c, 0x90, 0x03, 0x09, 0x0c, - 0x6d, 0x0a, 0x23, 0x82, 0x0a, 0x66, 0x20, 0xfb, 0xcc, 0x1e, 0x00, 0xf6, 0x5b, 0xfb, 0x06, 0x69, - 0xf0, 0x13, 0x04, 0xf7, 0xa0, 0x3d, 0x00, 0x1a, 0xe3, 0xfb, 0xb0, 0xc3, 0xf9, 0x63, 0xe2, 0xff, - 0x84, 0xa9, 0xfe, 0x6d, 0x63, 0xfe, 0xf6, 0x3b, 0xfe, 0xd0, 0x58, 0xfb, 0x71, 0x8c, 0xff, 0xa9, - 0x5e, 0x02, 0x75, 0x44, 0x00, 0xad, 0xc2, 0xfe, 0x0e, 0x4f, 0xff, 0x8d, 0x93, 0xff, 0xe4, 0x6c, - 0xfe, 0xf3, 0xb5, 0xfe, 0x69, 0x98, 0xfd, 0xd6, 0x63, 0xfd, 0x5a, 0xce, 0xfe, 0xf9, 0xef, 0xfd, - 0x32, 0x9f, 0xfe, 0x70, 0xd4, 0xff, 0x56, 0x62, 0x29, 0xed, 0x00, 0x2d, 0x23, 0x08, 0x07, 0x1b, - 0x04, 0x0d, 0xbe, 0x8b, 0x0c, 0x55, 0xe2, 0xfa, 0xce, 0xcb, 0xfe, 0x67, 0x39, 0xf9, 0xf4, 0xce, - 0xef, 0x0c, 0x52, 0xf9, 0xfc, 0x55, 0x03, 0x59, 0xaf, 0xf8, 0x36, 0x10, 0xf5, 0xab, 0x27, 0x00, - 0x7d, 0xc5, 0xff, 0x81, 0xb9, 0x00, 0xe4, 0xe9, 0xff, 0x02, 0xc9, 0xf9, 0x8d, 0x50, 0xfe, 0x2e, - 0xf1, 0x02, 0x5f, 0x7d, 0x00, 0x22, 0x02, 0xfe, 0x81, 0xb5, 0xff, 0x7a, 0xd8, 0xff, 0xda, 0xf4, - 0xfd, 0x13, 0xa4, 0xfe, 0xc3, 0xb0, 0xfc, 0x73, 0x97, 0xfc, 0xae, 0xda, 0xfe, 0x43, 0xbf, 0xfd, - 0x42, 0x14, 0xfe, 0x84, 0x82, 0xff, 0x14, 0xd9, 0x2d, 0x3f, 0x66, 0x2d, 0x6d, 0x15, 0x03, 0x42, - 0xb6, 0x0e, 0x2f, 0xb7, 0x0d, 0x0d, 0xe6, 0xf9, 0xdf, 0xb1, 0xff, 0x3d, 0xf6, 0xf7, 0xc6, 0x49, - 0xee, 0x0f, 0x4a, 0xfc, 0xa1, 0xd8, 0x07, 0x3a, 0xcd, 0xf6, 0xae, 0x55, 0xef, 0xa9, 0xf9, 0xfe, - 0xf7, 0xfa, 0x00, 0x0b, 0x7b, 0x02, 0x60, 0x3a, 0x02, 0xa4, 0xaf, 0xf9, 0x53, 0xe1, 0xfc, 0x51, - 0xf6, 0x02, 0xd6, 0xde, 0x00, 0x54, 0x42, 0xfd, 0x4d, 0xab, 0xff, 0x39, 0xf5, 0xff, 0x15, 0x17, - 0xfd, 0x2f, 0x6c, 0xfe, 0xeb, 0x6c, 0xfc, 0xfa, 0x0c, 0xfc, 0x55, 0xfe, 0xfe, 0x02, 0xd4, 0xfd, - 0x67, 0x95, 0xfd, 0xc6, 0x27, 0xff, 0x3d, 0x90, 0x33, 0xf0, 0x79, 0x30, 0x95, 0xc4, 0xfd, 0xa5, - 0x6c, 0x0c, 0xbd, 0xe6, 0x0d, 0x98, 0x17, 0xf9, 0x42, 0xd1, 0x01, 0x22, 0xba, 0xf8, 0xce, 0x79, - 0xec, 0xce, 0x3a, 0xfd, 0x4c, 0x28, 0x0c, 0xda, 0xfb, 0xf7, 0xfb, 0x33, 0xeb, 0xa3, 0x46, 0xfc, - 0xac, 0x02, 0x01, 0xc5, 0x96, 0x03, 0x5a, 0x5e, 0x04, 0x06, 0x10, 0xfa, 0xbe, 0x6d, 0xfb, 0x26, - 0xaf, 0x02, 0x33, 0x74, 0x01, 0xaf, 0x53, 0xfc, 0x4c, 0x01, 0xff, 0x1d, 0x7e, 0x00, 0x0b, 0xc8, - 0xfc, 0x60, 0x0f, 0xfe, 0xd6, 0xea, 0xfb, 0x44, 0x33, 0xfb, 0xf1, 0x14, 0xff, 0x6c, 0x3f, 0xfe, - 0x37, 0x5b, 0xfd, 0xd0, 0xa5, 0xfe, 0x9d, 0xe0, 0x39, 0x0a, 0x22, 0x36, 0x77, 0x88, 0xf7, 0x98, - 0x83, 0x06, 0xf3, 0xcf, 0x0c, 0xce, 0xd6, 0xf7, 0xd8, 0x48, 0x06, 0x27, 0xb8, 0xfc, 0x55, 0x7b, - 0xe9, 0x25, 0xff, 0xfa, 0x86, 0xc4, 0x0f, 0x1b, 0x4c, 0xfc, 0x0d, 0x79, 0xe9, 0x01, 0xd9, 0xf8, - 0xaf, 0x10, 0x00, 0xfb, 0xce, 0x03, 0x42, 0xcc, 0x05, 0x24, 0x48, 0xfa, 0x4c, 0xad, 0xf9, 0xaf, - 0xdd, 0x01, 0x3b, 0x66, 0x02, 0xe7, 0x6c, 0xfc, 0x17, 0x26, 0xfe, 0x01, 0x90, 0x00, 0x8a, 0x9b, - 0xfc, 0x4b, 0x28, 0xfe, 0xbc, 0xfe, 0xfb, 0xed, 0x2e, 0xfa, 0x43, 0xe9, 0xfe, 0x5e, 0xbd, 0xfe, - 0x55, 0x47, 0xfd, 0x77, 0x2b, 0xfe, 0x51, 0xab, 0x41, 0x2d, 0xff, 0x38, 0xe9, 0x42, 0xf0, 0x95, - 0xe4, 0x03, 0xef, 0x6f, 0x0a, 0x31, 0x74, 0xf6, 0x09, 0x49, 0x0b, 0xbc, 0x24, 0xfe, 0xea, 0x6f, - 0xe7, 0x06, 0x5d, 0xfa, 0x99, 0x68, 0x13, 0xae, 0xe2, 0x00, 0x41, 0x0b, 0xe8, 0x80, 0x00, 0xf5, - 0x01, 0x6f, 0xfd, 0xb3, 0x4a, 0x04, 0x12, 0xad, 0x07, 0xca, 0x22, 0xf9, 0x34, 0x43, 0xf7, 0x10, - 0x4b, 0x01, 0x64, 0xaf, 0x03, 0xb6, 0xe3, 0xfb, 0xb5, 0xf4, 0xfc, 0xf7, 0x1a, 0x01, 0xef, 0xa6, - 0xfc, 0x13, 0x80, 0xfe, 0x75, 0x2d, 0xfc, 0xe4, 0x64, 0xf9, 0x88, 0x73, 0xfe, 0xdb, 0xb2, 0xfe, - 0x48, 0x89, 0xfd, 0xac, 0x80, 0xfe, 0xd7, 0x7f, 0x46, 0xa4, 0xf2, 0x3a, 0xb4, 0x71, 0xec, 0x80, - 0x7f, 0x02, 0x82, 0x70, 0x07, 0xae, 0x7c, 0xf5, 0x9b, 0x2b, 0x0f, 0xcd, 0x3a, 0xff, 0x85, 0xa1, - 0xe6, 0x66, 0x42, 0xf8, 0xaa, 0x7b, 0x15, 0x30, 0xf0, 0x05, 0x72, 0x5a, 0xe7, 0x5a, 0x56, 0xf2, - 0x99, 0x8c, 0xfa, 0x8a, 0xa2, 0x02, 0x7c, 0xbd, 0x08, 0x08, 0xab, 0xf9, 0x68, 0x5d, 0xf6, 0x98, - 0xcc, 0xff, 0x8c, 0x7e, 0x03, 0x64, 0x8e, 0xfb, 0xed, 0x8a, 0xfc, 0xc6, 0x7c, 0x01, 0x10, 0x58, - 0xfc, 0x9f, 0xf4, 0xfe, 0x5d, 0x74, 0xfc, 0x3c, 0x81, 0xf8, 0x97, 0x2a, 0xfe, 0xaa, 0x5e, 0xff, - 0xaa, 0x39, 0xfe, 0x2d, 0x77, 0xfe, 0x23, 0x71, 0x4a, 0x01, 0x54, 0x3d, 0xf0, 0x69, 0xea, 0x9c, - 0x9f, 0x00, 0x30, 0xe0, 0x03, 0x8d, 0x33, 0xf5, 0xc2, 0xd6, 0x12, 0x6f, 0xb8, 0x00, 0x72, 0x02, - 0xe6, 0x2d, 0xaf, 0xf4, 0x49, 0x43, 0x16, 0xc0, 0x5d, 0x0b, 0x18, 0xe1, 0xe8, 0xc5, 0x73, 0xf0, - 0xce, 0xac, 0xf5, 0xe4, 0x1e, 0x00, 0x9c, 0x3e, 0x0b, 0xb9, 0x3d, 0xfb, 0xdc, 0x7d, 0xf5, 0x9a, - 0x32, 0xfe, 0x1e, 0xe0, 0x02, 0xb4, 0x5f, 0xfb, 0xe2, 0xa9, 0xfc, 0x57, 0x9f, 0x01, 0x5c, 0xc2, - 0xfb, 0xf3, 0xf0, 0xfe, 0x14, 0x8a, 0xfc, 0xb5, 0x76, 0xf8, 0xc8, 0x7f, 0xfe, 0x11, 0xf1, 0xff, - 0xaf, 0x9f, 0xfe, 0xe6, 0x6e, 0xfe, 0xe4, 0x02, 0x4d, 0xb9, 0x1b, 0x3f, 0xd7, 0x08, 0xeb, 0xf8, - 0x66, 0xff, 0xfd, 0xa6, 0x00, 0x63, 0x70, 0xf5, 0x6f, 0xde, 0x13, 0x9e, 0x47, 0x02, 0xd3, 0x92, - 0xe6, 0x29, 0x40, 0xf0, 0xf2, 0x05, 0x16, 0x3b, 0x5e, 0x10, 0x7c, 0xba, 0xeb, 0xe8, 0xc6, 0xee, - 0xe3, 0xee, 0xf0, 0x79, 0xf0, 0xfd, 0x75, 0x2d, 0x0d, 0x93, 0xf6, 0xfd, 0x8b, 0x1d, 0xf5, 0x1c, - 0x7b, 0xfc, 0x4b, 0xaa, 0x02, 0x7d, 0x23, 0xfb, 0x9c, 0xdf, 0xfc, 0xf2, 0x37, 0x01, 0x92, 0xab, - 0xfa, 0xc1, 0x14, 0xff, 0x99, 0x43, 0xfd, 0x33, 0xd0, 0xf8, 0x05, 0x51, 0xfe, 0x99, 0x42, 0x00, - 0xca, 0xdd, 0xfe, 0x55, 0x90, 0xfe, 0xf3, 0x3f, 0x4e, 0x24, 0x7c, 0x40, 0x72, 0xd4, 0xec, 0xf6, - 0x54, 0xff, 0x10, 0x77, 0xfe, 0x09, 0x1a, 0xf5, 0x04, 0x5f, 0x13, 0x99, 0x44, 0x03, 0xcf, 0x0b, - 0xe7, 0xf6, 0x71, 0xec, 0x43, 0xc9, 0x14, 0x41, 0x95, 0x13, 0xeb, 0xe1, 0xef, 0xbf, 0x32, 0xee, - 0x88, 0xa6, 0xec, 0xe4, 0x56, 0xfc, 0xa0, 0xbe, 0x0d, 0xa5, 0xfe, 0x00, 0x05, 0x1d, 0xf6, 0x9e, - 0x4b, 0xfa, 0x41, 0xa9, 0x02, 0x14, 0x3f, 0xfb, 0x4c, 0x4e, 0xfc, 0xec, 0x73, 0x00, 0xaf, 0x66, - 0xfa, 0xb9, 0x98, 0xff, 0x74, 0x50, 0xfd, 0xf7, 0x6a, 0xf9, 0x7e, 0xf5, 0xfd, 0xdf, 0xad, 0xff, - 0xd4, 0x74, 0xff, 0x3d, 0x9f, 0xfe, 0x16, 0x72, 0x4d, 0xe7, 0xff, 0x41, 0x3e, 0x13, 0xf0, 0xe3, - 0x59, 0x00, 0x74, 0xff, 0xfc, 0x6e, 0x29, 0xf4, 0x42, 0x98, 0x12, 0x94, 0x10, 0x03, 0xdc, 0x68, - 0xe7, 0xc8, 0x32, 0xe9, 0xa7, 0xbf, 0x11, 0xf9, 0xe4, 0x15, 0xc5, 0x28, 0xf5, 0xd1, 0xe7, 0xef, - 0x8e, 0x91, 0xe8, 0x25, 0x58, 0xf9, 0xc7, 0x1b, 0x0e, 0x3b, 0x1b, 0x04, 0x94, 0x53, 0xf8, 0x9d, - 0xe5, 0xf7, 0xf9, 0x08, 0x02, 0x5f, 0xf8, 0xfb, 0xd8, 0x2b, 0xfb, 0xdf, 0x53, 0x00, 0x1d, 0xdb, - 0xfa, 0xf3, 0xfc, 0xff, 0xe2, 0x5e, 0xfd, 0xb6, 0x5c, 0xf9, 0x6e, 0x80, 0xfd, 0x5b, 0x11, 0xff, - 0xb2, 0xe3, 0xff, 0x2d, 0x18, 0xfe, 0x7b, 0xb0, 0x4b, 0x06, 0x86, 0x42, 0x43, 0xda, 0xf4, 0x97, - 0xf0, 0x02, 0x5b, 0xdd, 0xfb, 0x2e, 0x60, 0xf3, 0x5f, 0x63, 0x11, 0xd0, 0x4f, 0x02, 0xef, 0x99, - 0xe7, 0x8a, 0x4d, 0xe6, 0x90, 0x66, 0x0e, 0x09, 0x8d, 0x16, 0xf5, 0x75, 0xfa, 0x59, 0x98, 0xf4, - 0x8f, 0x87, 0xe5, 0x58, 0x03, 0xf5, 0xe0, 0x51, 0x0e, 0x89, 0x97, 0x06, 0xc4, 0x11, 0xfb, 0xf3, - 0xcb, 0xf6, 0x10, 0x64, 0x00, 0x06, 0xf6, 0xfc, 0x63, 0x11, 0xfb, 0x84, 0x29, 0x00, 0x47, 0x95, - 0xfb, 0xc3, 0x91, 0x00, 0x15, 0x20, 0xfd, 0xaa, 0xe7, 0xf8, 0x1d, 0x6f, 0xfd, 0x85, 0x32, 0xfe, - 0x7d, 0xd5, 0xff, 0xbb, 0x16, 0xfe, 0x4b, 0x34, 0x49, 0xd4, 0xb0, 0x41, 0x1a, 0xc3, 0xfa, 0x95, - 0x83, 0x05, 0xaf, 0x27, 0xfb, 0x1c, 0xcc, 0xf3, 0xb6, 0x85, 0x0e, 0xc3, 0x79, 0x02, 0xef, 0xa0, - 0xe8, 0x5d, 0x69, 0xe2, 0x13, 0x2e, 0x0b, 0x44, 0x5f, 0x15, 0x67, 0x4b, 0xfe, 0xb3, 0x86, 0xfb, - 0x80, 0xbf, 0xe4, 0x70, 0x77, 0xef, 0xe1, 0x9f, 0x0d, 0x06, 0x34, 0x08, 0x5c, 0xd0, 0xfc, 0x2d, - 0x1a, 0xf8, 0x7a, 0xe7, 0xfe, 0xf8, 0x44, 0xfd, 0x46, 0x8d, 0xfc, 0xa3, 0x71, 0xff, 0x80, 0x47, - 0xfb, 0x30, 0x52, 0x01, 0x18, 0x6b, 0xfd, 0xe5, 0x29, 0xf8, 0xb4, 0x1e, 0xfd, 0x23, 0x74, 0xfd, - 0x63, 0x33, 0xff, 0x47, 0xfa, 0xfe, 0xb4, 0x0b, 0x46, 0xe6, 0xa4, 0x40, 0x66, 0xb4, 0xff, 0xe9, - 0x26, 0x06, 0x34, 0x0c, 0xfc, 0xf3, 0x34, 0xf6, 0x96, 0x97, 0x0a, 0xe4, 0x08, 0x02, 0x4f, 0x64, - 0xea, 0x41, 0x3d, 0xdf, 0x7f, 0x1c, 0x08, 0xe0, 0xc8, 0x13, 0x23, 0x8b, 0xff, 0x96, 0xa9, 0x01, - 0xe7, 0x05, 0xe7, 0xe5, 0x84, 0xe9, 0x21, 0x01, 0x0b, 0x28, 0x63, 0x09, 0x23, 0xcd, 0xfd, 0x0a, - 0x9c, 0xfa, 0xba, 0xa6, 0xfe, 0xdd, 0xa9, 0xfc, 0x88, 0x7c, 0xfd, 0x83, 0x52, 0xff, 0x4c, 0xdd, - 0xfa, 0x48, 0x2a, 0x01, 0xbd, 0x56, 0xfd, 0x2c, 0x62, 0xf7, 0xac, 0x3c, 0xfd, 0xaf, 0x2e, 0xfd, - 0xfd, 0xaf, 0xfe, 0xcd, 0x41, 0x00, 0x67, 0xab, 0x42, 0xd9, 0x84, 0x3c, 0x9e, 0x0e, 0x04, 0xb1, - 0xc5, 0x0a, 0x0d, 0x5b, 0xfc, 0x49, 0x9e, 0xf6, 0x6c, 0x49, 0x08, 0x52, 0xfd, 0x00, 0xd5, 0x1c, - 0xed, 0x1e, 0xb4, 0xdd, 0xf5, 0xd7, 0x02, 0xa1, 0xf2, 0x12, 0x0e, 0x88, 0x00, 0xfb, 0xc3, 0x05, - 0x04, 0xcb, 0xeb, 0x16, 0x6b, 0xe3, 0x10, 0xb8, 0x05, 0xf6, 0x19, 0x0b, 0xd4, 0x5c, 0xff, 0x62, - 0xf3, 0xfc, 0x85, 0xef, 0xfe, 0xc2, 0x9d, 0xfc, 0x46, 0x46, 0xfe, 0x78, 0x1e, 0xff, 0x5b, 0x39, - 0xfa, 0x78, 0xff, 0xff, 0x64, 0x9e, 0xfd, 0x34, 0x0c, 0xf7, 0x15, 0xdb, 0xfc, 0xc4, 0x05, 0xfe, - 0x64, 0x90, 0xfe, 0xd7, 0xf6, 0x00, 0xb2, 0xdb, 0x3e, 0xd9, 0xcd, 0x3a, 0x0d, 0xd6, 0x04, 0x8c, - 0x5e, 0x0d, 0xb9, 0xa0, 0xff, 0xcb, 0xee, 0xf4, 0xdf, 0xc8, 0x07, 0x2b, 0xe7, 0x00, 0xbe, 0x18, - 0xee, 0xe2, 0x0d, 0xdf, 0xd7, 0x36, 0xfe, 0x9b, 0x2d, 0x13, 0x22, 0x24, 0x00, 0x6f, 0xe7, 0x04, - 0x22, 0xf7, 0xf2, 0x00, 0x98, 0xe0, 0x21, 0x6f, 0xfe, 0x71, 0x59, 0x0c, 0x45, 0x7c, 0x01, 0x06, - 0x3d, 0xfe, 0x90, 0x3d, 0xff, 0xb3, 0xac, 0xfc, 0x5d, 0x7e, 0xfe, 0x0b, 0xe1, 0xff, 0xd5, 0x87, - 0xf9, 0x8a, 0x2c, 0xfd, 0xf0, 0xeb, 0xfe, 0xd1, 0x74, 0xf8, 0xbd, 0x11, 0xfc, 0xeb, 0xc9, 0xfe, - 0xcd, 0xa7, 0xfe, 0xa9, 0x14, 0x01, 0x61, 0x6d, 0x3c, 0x21, 0x6f, 0x39, 0x82, 0x57, 0x03, 0xc7, - 0x8b, 0x0d, 0xb9, 0x3c, 0x04, 0xd6, 0x9a, 0xf3, 0x29, 0xcc, 0x04, 0xe8, 0xd8, 0x01, 0x0d, 0x4a, - 0xf1, 0x0d, 0xc0, 0xe2, 0x80, 0x71, 0xfa, 0x6b, 0xf5, 0x11, 0xe3, 0x98, 0xff, 0x21, 0x86, 0x00, - 0x67, 0x68, 0xfa, 0x2c, 0xba, 0xe3, 0xd4, 0x90, 0xf5, 0x7c, 0x9a, 0x0a, 0xf2, 0xde, 0x03, 0xb6, - 0x63, 0xff, 0xe2, 0xaf, 0x00, 0xa7, 0x3c, 0xfd, 0xfe, 0xc1, 0xfd, 0xc0, 0x0a, 0xff, 0x05, 0x5d, - 0xf9, 0xb3, 0x50, 0xfc, 0xfd, 0xf5, 0xff, 0xd1, 0x00, 0xfa, 0x72, 0xd5, 0xfb, 0x7d, 0xc1, 0xff, - 0x82, 0x9c, 0xfe, 0xdb, 0x25, 0x00, 0x1f, 0xb2, 0x39, 0x6a, 0x8e, 0x38, 0x95, 0x88, 0x01, 0xe1, - 0x4b, 0x0c, 0x4c, 0xc7, 0x07, 0x3d, 0xf5, 0xf5, 0x33, 0xe7, 0x02, 0xcc, 0x54, 0xfd, 0xab, 0xa6, - 0xf5, 0xf3, 0x78, 0xea, 0xbe, 0xbd, 0xf5, 0x50, 0x01, 0x11, 0x34, 0xe8, 0x00, 0x7a, 0xd7, 0xf9, - 0x13, 0x7d, 0xff, 0x86, 0x01, 0xeb, 0x63, 0x8c, 0xee, 0xb3, 0x88, 0x06, 0x56, 0x04, 0x06, 0xce, - 0xf0, 0xfe, 0x07, 0x43, 0x01, 0x5b, 0x32, 0x00, 0x39, 0xe3, 0xfc, 0xd0, 0x4d, 0xfc, 0xfb, 0x57, - 0xfa, 0x95, 0x71, 0xfc, 0x80, 0xd4, 0x00, 0xbc, 0xde, 0xfc, 0x62, 0xcf, 0xfa, 0xb3, 0xd4, 0xfe, - 0x49, 0x59, 0xff, 0xf7, 0xc4, 0xff, 0x12, 0xf8, 0x35, 0x95, 0xd9, 0x34, 0x0a, 0x00, 0x01, 0x6a, - 0x60, 0x0d, 0x0e, 0xba, 0x0a, 0x67, 0x33, 0xf7, 0x2b, 0x2d, 0x02, 0xca, 0xbe, 0xfb, 0x47, 0x21, - 0xf6, 0x98, 0x3c, 0xf0, 0x31, 0x8f, 0xf5, 0xb8, 0xf7, 0x0d, 0x5b, 0xad, 0x03, 0x2a, 0x2d, 0xf7, - 0xe0, 0xff, 0xff, 0x6b, 0x19, 0xf3, 0xcd, 0x98, 0xeb, 0xf4, 0xd5, 0x00, 0x8f, 0x40, 0x07, 0x87, - 0x26, 0xfe, 0x55, 0x13, 0x00, 0xae, 0xcd, 0x01, 0xf6, 0xfd, 0xfd, 0x7b, 0xa2, 0xfb, 0x11, 0x68, - 0xfa, 0x06, 0x15, 0xfd, 0x66, 0xa4, 0x01, 0x51, 0xd1, 0xfe, 0x0a, 0x00, 0xfa, 0x7a, 0x79, 0xfd, - 0x64, 0x64, 0x00, 0xa0, 0xae, 0xff, 0x40, 0xef, 0x31, 0x69, 0xfa, 0x2f, 0xfb, 0x6d, 0x01, 0xcc, - 0x7a, 0x0f, 0xc2, 0xe7, 0x0b, 0xea, 0x17, 0xf7, 0x23, 0x27, 0x01, 0xb7, 0x37, 0xfe, 0x3d, 0x82, - 0xf8, 0x2b, 0xc0, 0xef, 0x90, 0xaa, 0xf4, 0x81, 0x49, 0x0d, 0x4c, 0xc7, 0x05, 0x1c, 0xd5, 0xf6, - 0xb6, 0xf6, 0xfe, 0x1a, 0xe7, 0xf8, 0xba, 0xe8, 0xec, 0x3a, 0x74, 0xfc, 0x82, 0xf3, 0x06, 0x98, - 0xf8, 0xfd, 0x76, 0x10, 0xfe, 0xf0, 0xd2, 0x00, 0x22, 0x5a, 0xfe, 0x4b, 0x5c, 0xfd, 0x68, 0x32, - 0xfc, 0x3d, 0x97, 0xfc, 0x83, 0x6a, 0x00, 0x8f, 0x9f, 0xff, 0x57, 0xa5, 0xfa, 0xdb, 0xa0, 0xfd, - 0xd4, 0xf0, 0x00, 0x35, 0x45, 0xff, 0x04, 0x4b, 0x2c, 0x85, 0xf1, 0x2a, 0x10, 0x46, 0x03, 0x75, - 0x98, 0x11, 0x95, 0x92, 0x0c, 0x43, 0xbb, 0xf6, 0xbc, 0xd8, 0x00, 0x4d, 0x4a, 0x01, 0x6b, 0x13, - 0xfb, 0x49, 0x78, 0xf0, 0xa8, 0xcd, 0xf2, 0x91, 0x91, 0x09, 0xec, 0xa4, 0x07, 0x53, 0x62, 0xf9, - 0xd7, 0x50, 0xfe, 0x12, 0x22, 0xfc, 0x91, 0x5b, 0xef, 0x0b, 0x93, 0xfa, 0x4e, 0x76, 0x06, 0x37, - 0xc7, 0xfd, 0xa0, 0x6b, 0xfc, 0x00, 0xa1, 0xff, 0x7b, 0x99, 0xfd, 0xdc, 0xfa, 0xfd, 0x0b, 0x9a, - 0xfe, 0x2d, 0x06, 0xfd, 0xc1, 0x62, 0xfe, 0xfd, 0x80, 0xff, 0x67, 0x58, 0xfc, 0xee, 0x84, 0xfe, - 0x8b, 0x4a, 0x01, 0xb5, 0x3f, 0xff, 0xf3, 0x63, 0x2b, 0xc8, 0xb1, 0x25, 0xda, 0x8a, 0x01, 0x6b, - 0x77, 0x17, 0x19, 0xfd, 0x0d, 0x92, 0xcb, 0xf2, 0xbd, 0x42, 0x01, 0x2f, 0x71, 0x05, 0x94, 0x94, - 0xfd, 0x88, 0xa0, 0xef, 0x3e, 0xc3, 0xef, 0x50, 0xe9, 0x07, 0x0f, 0xdd, 0x08, 0x81, 0x6d, 0xfa, - 0xfd, 0xba, 0x00, 0x78, 0x59, 0xfe, 0x1c, 0xd4, 0xec, 0x49, 0x12, 0xfa, 0x92, 0xa7, 0x08, 0xe1, - 0xaa, 0xfc, 0x7f, 0x4f, 0xfb, 0xa1, 0x6d, 0xff, 0x87, 0x9f, 0xfb, 0xce, 0x07, 0xfd, 0x1d, 0x83, - 0xff, 0x9b, 0x25, 0xfd, 0xf0, 0x11, 0xff, 0xd4, 0x55, 0x00, 0x8c, 0xda, 0xfb, 0xce, 0x9b, 0xff, - 0x30, 0xf1, 0x02, 0x2e, 0x23, 0xff, 0xaa, 0x7e, 0x24, 0xc2, 0x17, 0x24, 0x39, 0x29, 0x08, 0x9f, - 0x39, 0x16, 0x5f, 0x44, 0x0b, 0x99, 0xbb, 0xf2, 0xbe, 0x3c, 0x00, 0x02, 0x01, 0x04, 0xd6, 0x37, - 0xfc, 0x5f, 0x38, 0xf5, 0x28, 0x6e, 0xf2, 0xaa, 0x05, 0x01, 0x60, 0x42, 0x06, 0x3f, 0x9b, 0xfd, - 0xe6, 0x8a, 0x02, 0x31, 0xdc, 0x00, 0xbd, 0x93, 0xf0, 0x62, 0xa8, 0xf6, 0xc4, 0x22, 0x04, 0x32, - 0xe9, 0x00, 0xa8, 0x15, 0xff, 0x1a, 0xad, 0xfe, 0xc8, 0x8d, 0xfb, 0x5d, 0xa2, 0xfd, 0x87, 0xc3, - 0xff, 0x78, 0x76, 0xfe, 0xd2, 0xa7, 0xff, 0x00, 0xcd, 0xff, 0xb8, 0xb0, 0xfc, 0xa7, 0x81, 0xfe, - 0x52, 0x69, 0x01, 0x43, 0x98, 0xff, 0x53, 0x17, 0x20, 0x7a, 0x34, 0x21, 0xc0, 0x9f, 0x08, 0xc7, - 0x16, 0x14, 0xb0, 0x02, 0x0b, 0x14, 0x5f, 0xf6, 0xd5, 0xac, 0x01, 0x57, 0xbd, 0x02, 0xbc, 0x4d, - 0xfc, 0x21, 0x1e, 0xf7, 0x57, 0x78, 0xf3, 0x69, 0xca, 0xff, 0x35, 0xbb, 0x04, 0x7d, 0x11, 0xfe, - 0xee, 0x02, 0x02, 0xeb, 0xa2, 0x01, 0x2f, 0xd3, 0xf4, 0xc2, 0xb2, 0xf6, 0x8d, 0xc2, 0x02, 0xb6, - 0xc5, 0x02, 0xa7, 0xa0, 0xfe, 0x23, 0x5a, 0xfd, 0x36, 0xbb, 0xfc, 0x60, 0x94, 0xfe, 0xd1, 0xb4, - 0xff, 0x1e, 0x22, 0xfe, 0xba, 0x6f, 0xfe, 0xfb, 0x5f, 0xff, 0x83, 0x5a, 0xfe, 0x25, 0x12, 0xff, - 0xd1, 0xe3, 0xff, 0x27, 0xa7, 0xfe, 0x49, 0x80, 0x1c, 0x5c, 0x9c, 0x1d, 0x24, 0xd5, 0x08, 0x3b, - 0x0f, 0x11, 0xf7, 0xa6, 0x09, 0x38, 0x8d, 0xfb, 0x05, 0xb1, 0x02, 0x99, 0xc7, 0x00, 0x50, 0xdc, - 0xfc, 0x68, 0x33, 0xf8, 0x11, 0x34, 0xf5, 0x56, 0x7d, 0xff, 0x1f, 0x36, 0x03, 0x1a, 0xb0, 0xfe, - 0x93, 0xa8, 0x01, 0x0e, 0xd2, 0x01, 0xf2, 0x86, 0xf7, 0xb4, 0x13, 0xf8, 0x93, 0x04, 0x03, 0x5a, - 0xff, 0x02, 0x90, 0x48, 0xfe, 0x5e, 0x97, 0xfd, 0x50, 0xd0, 0xfd, 0x52, 0x3e, 0xff, 0x50, 0x6c, - 0xff, 0x51, 0x9e, 0xfd, 0x41, 0x95, 0xfd, 0x81, 0xe0, 0xfe, 0x98, 0xf1, 0xfe, 0xaf, 0xc9, 0xfe, - 0x02, 0xf5, 0xfe, 0x83, 0xf5, 0xfe, 0xe0, 0x95, 0x19, 0xf3, 0x2f, 0x1b, 0x59, 0x80, 0x08, 0x6b, - 0xcc, 0x0d, 0x1e, 0x65, 0x09, 0x70, 0x3d, 0xff, 0x91, 0x62, 0x02, 0x1c, 0xc7, 0xff, 0x86, 0xf6, - 0xfc, 0xff, 0xbc, 0xf8, 0x0c, 0x02, 0xf7, 0x5b, 0x40, 0xff, 0x6e, 0x55, 0x02, 0x21, 0x18, 0xff, - 0x88, 0x85, 0x01, 0x9a, 0x19, 0x02, 0x2f, 0xd7, 0xf8, 0x1b, 0x2a, 0xf9, 0x9b, 0x6d, 0x03, 0x23, - 0xe8, 0x02, 0x76, 0x0d, 0xfe, 0xc0, 0xee, 0xfd, 0x23, 0x7d, 0xfe, 0x46, 0x27, 0xff, 0xe1, 0x2d, - 0xff, 0xb7, 0x92, 0xfd, 0x89, 0x15, 0xfd, 0xc4, 0x86, 0xfe, 0x95, 0xba, 0xfe, 0x1f, 0x80, 0xfe, - 0x8b, 0x5c, 0xff, 0x38, 0x89, 0xff, 0x4d, 0xf7, 0x15, 0xbd, 0xa6, 0x18, 0xb1, 0xd8, 0x07, 0xf1, - 0x2e, 0x0b, 0x4a, 0x5a, 0x0a, 0x7d, 0x74, 0x01, 0x7d, 0x78, 0x01, 0x24, 0xc6, 0xff, 0xdd, 0x39, - 0xfd, 0x27, 0xe3, 0xf9, 0xc5, 0x24, 0xf9, 0xa8, 0xe1, 0xfe, 0xe9, 0x82, 0x01, 0x07, 0x1d, 0x00, - 0xc0, 0x50, 0x02, 0x3a, 0xdf, 0x01, 0xdd, 0xe3, 0xf9, 0xcb, 0x1f, 0xfb, 0xd5, 0x98, 0x03, 0xa1, - 0x6a, 0x02, 0x45, 0x2b, 0xfe, 0xf3, 0xe7, 0xfd, 0xc9, 0xf3, 0xfe, 0xc8, 0xae, 0xff, 0xd7, 0xf9, - 0xfe, 0xd1, 0x7f, 0xfd, 0x4c, 0x3f, 0xfd, 0x29, 0xe9, 0xfe, 0x4c, 0x0a, 0xff, 0x60, 0x3f, 0xfe, - 0xae, 0x6a, 0xff, 0xb9, 0x0d, 0x00, 0xa0, 0x4c, 0x13, 0x61, 0x9e, 0x15, 0x60, 0x16, 0x07, 0xf2, - 0xb0, 0x0a, 0x0e, 0x6d, 0x0a, 0xf9, 0x86, 0x01, 0x4a, 0xd2, 0x00, 0x42, 0xf2, 0xff, 0xa0, 0xa3, - 0xfd, 0x1a, 0x15, 0xfb, 0x07, 0xa7, 0xfa, 0x2b, 0x5a, 0xfe, 0x4b, 0xc5, 0x00, 0x9f, 0x06, 0x01, - 0xc9, 0xe6, 0x02, 0xa3, 0xa4, 0x01, 0xe1, 0x03, 0xfb, 0x84, 0x87, 0xfc, 0x89, 0xcf, 0x02, 0x0e, - 0x3e, 0x01, 0x0a, 0x4d, 0xfe, 0x86, 0x70, 0xfe, 0x3f, 0x46, 0xff, 0xb4, 0x80, 0xff, 0xfc, 0xd5, - 0xfe, 0x07, 0xf6, 0xfd, 0xe3, 0xfa, 0xfd, 0xab, 0x79, 0xff, 0x4f, 0xf9, 0xfe, 0xd0, 0xe4, 0xfd, - 0x7a, 0x40, 0xff, 0xde, 0x15, 0x00, 0x5e, 0x20, 0x10, 0x97, 0xff, 0x12, 0xaa, 0x07, 0x07, 0x66, - 0xe9, 0x09, 0xc8, 0xac, 0x09, 0x21, 0xb0, 0x01, 0xf8, 0xfa, 0x00, 0xa1, 0x18, 0x00, 0x4d, 0x0b, - 0xfe, 0xac, 0x40, 0xfc, 0x04, 0xb1, 0xfb, 0x3d, 0xf9, 0xfd, 0x2b, 0x52, 0x00, 0x9d, 0x33, 0x02, - 0x70, 0xa1, 0x03, 0xd0, 0x5c, 0x01, 0x9e, 0x32, 0xfc, 0xde, 0x1b, 0xfd, 0x9a, 0x72, 0x01, 0x75, - 0xda, 0x00, 0xe7, 0xe0, 0xfe, 0x0b, 0xa3, 0xfe, 0x18, 0x27, 0xff, 0x99, 0x82, 0xff, 0xf2, 0x82, - 0xff, 0xb0, 0xf0, 0xfe, 0x9f, 0x99, 0xfe, 0xa2, 0x4f, 0xff, 0x07, 0x5e, 0xfe, 0x76, 0xc4, 0xfd, - 0xa4, 0x7b, 0xff, 0x06, 0x0e, 0x00, 0xd7, 0x67, 0x0c, 0xfe, 0x58, 0x10, 0x5f, 0xbd, 0x07, 0x30, - 0x63, 0x08, 0xa2, 0xeb, 0x07, 0xce, 0xc2, 0x02, 0xf3, 0x1f, 0x02, 0x59, 0x50, 0x00, 0x30, 0x26, - 0xfe, 0x2d, 0x0b, 0xfd, 0x14, 0x11, 0xfd, 0xe8, 0xfd, 0xfe, 0xc5, 0x2e, 0x01, 0x96, 0x24, 0x03, - 0x4c, 0x9e, 0x03, 0x41, 0x37, 0x01, 0x5f, 0x6f, 0xfd, 0xda, 0xe6, 0xfd, 0x5a, 0xc9, 0x00, 0x66, - 0x75, 0x00, 0x62, 0x29, 0xff, 0x32, 0xed, 0xfe, 0x3f, 0xa7, 0xff, 0x17, 0x72, 0x00, 0xd6, 0x30, - 0x00, 0xc3, 0x20, 0xff, 0x5d, 0x69, 0xfe, 0xae, 0xfe, 0xfe, 0x17, 0xd2, 0xfe, 0x3a, 0x61, 0xfe, - 0x9e, 0x82, 0xff, 0xf9, 0xfb, 0xff, 0xe5, 0x66, 0x09, 0x2a, 0xa4, 0x0c, 0xd9, 0x2b, 0x08, 0xe8, - 0x91, 0x08, 0x6f, 0xdf, 0x06, 0x88, 0x5c, 0x03, 0x32, 0x3d, 0x02, 0xc4, 0x6e, 0x00, 0xd6, 0x25, - 0xff, 0xaa, 0x3f, 0xfe, 0xbe, 0xa2, 0xfe, 0x13, 0xef, 0xff, 0x66, 0x5d, 0x01, 0x74, 0x92, 0x03, - 0xce, 0x0f, 0x04, 0x69, 0x72, 0x01, 0x42, 0x51, 0xfe, 0xe4, 0x8f, 0xfe, 0x7c, 0x2b, 0x00, 0x70, - 0xee, 0xff, 0xee, 0x63, 0xff, 0x86, 0x93, 0xff, 0x01, 0x60, 0x00, 0x01, 0x6a, 0x00, 0xf8, 0xb6, - 0xff, 0xb2, 0x5d, 0xff, 0x6f, 0x23, 0xff, 0xdf, 0x4c, 0xff, 0x23, 0xf1, 0xfe, 0xb4, 0xa7, 0xfe, - 0x35, 0x6e, 0xff, 0xb4, 0xd9, 0xff, 0xd0, 0x23, 0x07, 0xed, 0x34, 0x0a, 0x26, 0xa5, 0x07, 0x5a, - 0x3f, 0x07, 0x26, 0xa4, 0x05, 0x21, 0x70, 0x03, 0xe2, 0xe0, 0x02, 0xfa, 0x4e, 0x01, 0x6b, 0xee, - 0xff, 0xde, 0x28, 0x00, 0xee, 0xc0, 0x00, 0x63, 0x6e, 0x01, 0x08, 0x64, 0x02, 0xdc, 0x8a, 0x03, - 0x3a, 0x23, 0x04, 0x1a, 0xc2, 0x01, 0x1b, 0xa8, 0xfe, 0x49, 0x9f, 0xfe, 0x45, 0x7d, 0xff, 0x13, - 0x03, 0x00, 0x51, 0x58, 0x00, 0x37, 0xea, 0xff, 0x4a, 0xe7, 0xff, 0x12, 0x51, 0x00, 0x30, 0x49, - 0x00, 0xb7, 0xda, 0xff, 0x24, 0x57, 0xff, 0x5d, 0x4a, 0xff, 0x66, 0x30, 0xff, 0x5a, 0xff, 0xfe, - 0xaa, 0x8a, 0xff, 0xd4, 0x0f, 0x00, 0x2a, 0x4f, 0x06, 0x1a, 0xb5, 0x08, 0xb8, 0x7b, 0x06, 0xa6, - 0xb6, 0x05, 0x0c, 0x94, 0x04, 0x0c, 0xbb, 0x03, 0x8b, 0x7b, 0x03, 0x04, 0x0b, 0x03, 0xde, 0xf4, - 0x01, 0x6c, 0x2d, 0x01, 0x9a, 0x19, 0x02, 0x58, 0xbd, 0x02, 0x0c, 0x05, 0x03, 0x35, 0x84, 0x03, - 0xa6, 0x31, 0x03, 0xa4, 0xe2, 0x00, 0x64, 0x9f, 0xfe, 0x43, 0x29, 0xff, 0x11, 0x21, 0x00, 0x62, - 0x5d, 0x00, 0xe1, 0x56, 0x00, 0x92, 0xd5, 0xff, 0xf6, 0xee, 0xff, 0xff, 0x5b, 0x00, 0x8d, 0x6f, - 0x00, 0x4b, 0x06, 0x00, 0x04, 0x6f, 0xff, 0xb3, 0x79, 0xff, 0xd4, 0x96, 0xff, 0x77, 0xa0, 0xff, - 0x0a, 0xf1, 0xff, 0xbb, 0x18, 0x00, 0x53, 0x0e, 0x05, 0x34, 0xd0, 0x06, 0x0b, 0x07, 0x05, 0xcc, - 0x53, 0x05, 0x51, 0x5c, 0x05, 0xc7, 0x9e, 0x04, 0x8f, 0x61, 0x04, 0x61, 0x71, 0x04, 0x1a, 0x1c, - 0x04, 0x9b, 0x31, 0x03, 0xfd, 0x81, 0x02, 0x1f, 0x2d, 0x02, 0xa1, 0x45, 0x02, 0x21, 0x6f, 0x02, - 0x0a, 0x21, 0x02, 0xdd, 0xd0, 0x00, 0x3a, 0x99, 0xff, 0x8a, 0xf3, 0xff, 0xc3, 0x42, 0x00, 0x6e, - 0xe1, 0xff, 0xb1, 0xd9, 0xff, 0xc5, 0xe0, 0xff, 0xf2, 0xec, 0xff, 0x56, 0x47, 0x00, 0xb6, 0xa2, - 0x00, 0xfa, 0x81, 0x00, 0xa8, 0xf1, 0xff, 0x99, 0xc3, 0xff, 0x53, 0xbc, 0xff, 0xa8, 0xae, 0xff, - 0x80, 0xf2, 0xff, 0x3e, 0xbe, 0xff, 0x19, 0x9a, 0x04, 0x10, 0x4e, 0x07, 0x10, 0xdb, 0x05, 0xd0, - 0x5a, 0x06, 0x08, 0x3b, 0x07, 0x0c, 0xcb, 0x05, 0x68, 0x71, 0x04, 0x79, 0xce, 0x03, 0x1a, 0x1e, - 0x03, 0xe1, 0xcf, 0x02, 0xa8, 0xaf, 0x02, 0xb4, 0x20, 0x02, 0x85, 0x75, 0x01, 0xa9, 0xf2, 0x00, - 0xcb, 0x2e, 0x01, 0xc5, 0x5a, 0x01, 0x18, 0x9c, 0x00, 0xbc, 0x1f, 0x00, 0x16, 0xd9, 0xff, 0x86, - 0x5f, 0xff, 0x74, 0x5a, 0xff, 0x79, 0xe1, 0xff, 0xde, 0x74, 0x00, 0x53, 0xb7, 0x00, 0x36, 0xbc, - 0x00, 0xdb, 0xd7, 0x00, 0x0b, 0xa6, 0x00, 0xf1, 0xdc, 0xff, 0x1f, 0x66, 0xff, 0xc9, 0x50, 0xff, - 0x40, 0x36, 0xff, 0x85, 0x2c, 0xff, 0xa0, 0x4d, 0x05, 0x18, 0x64, 0x09, 0x61, 0x4a, 0x08, 0xb1, - 0x45, 0x07, 0xd1, 0x69, 0x06, 0x15, 0x6c, 0x05, 0xf6, 0xde, 0x04, 0xd8, 0x56, 0x03, 0x07, 0xbe, - 0x01, 0xf2, 0x18, 0x01, 0x5f, 0x2d, 0x01, 0x8d, 0x4f, 0x01, 0x4d, 0xab, 0x01, 0x07, 0xdb, 0x01, - 0x27, 0x88, 0x01, 0x7a, 0x29, 0x01, 0x96, 0x32, 0x00, 0xac, 0x65, 0xff, 0xd0, 0x58, 0xff, 0xf3, - 0xb3, 0xff, 0x68, 0x18, 0x00, 0x20, 0xf9, 0xff, 0x78, 0x55, 0x00, 0x95, 0xe7, 0x00, 0x7c, 0xbe, - 0x00, 0xbd, 0xb3, 0x00, 0x4f, 0xb0, 0x00, 0xbb, 0x0d, 0x00, 0x58, 0x3b, 0xff, 0xee, 0xcd, 0xfe, - 0x73, 0x96, 0xfe, 0x52, 0xba, 0xfe, 0x40, 0x27, 0x06, 0x90, 0xe9, 0x09, 0x3d, 0x2c, 0x08, 0x99, - 0xed, 0x06, 0x39, 0x14, 0x06, 0x38, 0x85, 0x05, 0xe9, 0x20, 0x05, 0xa2, 0x88, 0x03, 0x73, 0x7f, - 0x01, 0x5d, 0x04, 0x00, 0x71, 0xb8, 0xff, 0x00, 0xce, 0x00, 0xc3, 0x2b, 0x02, 0xcc, 0xee, 0x01, - 0xf7, 0x51, 0x01, 0x15, 0x34, 0x01, 0x53, 0x8d, 0x00, 0x04, 0x34, 0x00, 0x48, 0x0d, 0x00, 0xc8, - 0xb8, 0xff, 0xf3, 0x9a, 0xff, 0xf9, 0xd3, 0xff, 0xf6, 0x67, 0x00, 0x7a, 0x61, 0x00, 0xd6, 0x12, - 0x00, 0x1c, 0x9f, 0x00, 0xe6, 0x4c, 0x01, 0x2f, 0xec, 0x00, 0x27, 0x88, 0xff, 0x7e, 0x70, 0xfe, - 0xb2, 0x53, 0xfe, 0x2c, 0xa4, 0xfe, 0xe0, 0x2d, 0x06, 0x8d, 0xb5, 0x09, 0xe1, 0xfc, 0x06, 0x28, - 0xcd, 0x05, 0x0e, 0xd6, 0x05, 0x5e, 0x84, 0x05, 0xd3, 0x40, 0x05, 0x7d, 0xb3, 0x03, 0xc3, 0x46, - 0x01, 0x36, 0xf6, 0xff, 0xc0, 0xfa, 0x00, 0xe3, 0xcc, 0x01, 0xdf, 0x11, 0x01, 0x81, 0x88, 0x00, - 0x72, 0xc1, 0x00, 0x5f, 0xd8, 0x00, 0xfa, 0x02, 0x01, 0x0b, 0xb2, 0x01, 0xd4, 0x23, 0x01, 0x0c, - 0xf3, 0xff, 0xa9, 0xba, 0xff, 0x06, 0xba, 0xff, 0xc1, 0xdd, 0xff, 0x76, 0xe5, 0xff, 0x41, 0xf2, - 0xff, 0x74, 0x3f, 0x00, 0xda, 0x65, 0x00, 0x8e, 0xfa, 0x00, 0x15, 0x0c, 0x01, 0xb2, 0xac, 0xff, - 0x25, 0x78, 0xfe, 0x3d, 0x41, 0xfe, 0x7b, 0x68, 0x07, 0xfc, 0xc8, 0x0a, 0xe6, 0x88, 0x06, 0x39, - 0x9d, 0x04, 0x7a, 0x09, 0x04, 0x12, 0x05, 0x04, 0x2e, 0xb5, 0x04, 0xcb, 0xac, 0x03, 0xf9, 0x42, - 0x01, 0xee, 0x35, 0xff, 0xc1, 0xd4, 0x00, 0x4d, 0x0d, 0x03, 0x77, 0x76, 0x02, 0xcc, 0x34, 0x01, - 0xeb, 0xb0, 0xff, 0x45, 0xf4, 0xfe, 0xea, 0x6b, 0x00, 0x83, 0xea, 0x01, 0x36, 0xc1, 0x01, 0x7a, - 0x85, 0x01, 0xec, 0xf8, 0x00, 0xab, 0xb1, 0xff, 0x8b, 0xc9, 0xff, 0x75, 0x4d, 0x00, 0xfa, 0xa7, - 0xff, 0x37, 0x53, 0xff, 0x7a, 0x03, 0x00, 0xfb, 0x67, 0x00, 0x44, 0x54, 0x00, 0xc4, 0xa5, 0x00, - 0xa2, 0x6b, 0x00, 0x28, 0x7f, 0xff, 0xe2, 0xa3, 0x08, 0xcc, 0xcb, 0x0c, 0x15, 0xe2, 0x06, 0x52, - 0x2f, 0x04, 0xe8, 0x6b, 0x03, 0xde, 0x20, 0x03, 0x62, 0x07, 0x04, 0x6f, 0x37, 0x02, 0xd3, 0xb5, - 0xff, 0xa0, 0xaf, 0xfd, 0x5e, 0xbe, 0xff, 0xe3, 0x09, 0x04, 0x2e, 0xc3, 0x03, 0x40, 0x5d, 0x01, - 0x28, 0x00, 0x00, 0x15, 0xba, 0xff, 0xc3, 0xef, 0xff, 0x23, 0x95, 0x00, 0xe4, 0x70, 0x01, 0x06, - 0x6e, 0x01, 0xbf, 0x23, 0x01, 0x72, 0xe0, 0x00, 0x84, 0xb1, 0x00, 0x96, 0x4e, 0x00, 0x9c, 0xc6, - 0xff, 0x12, 0xdd, 0xff, 0x2b, 0xa3, 0xff, 0x02, 0x3e, 0xff, 0x5f, 0xc1, 0xff, 0x14, 0x62, 0x00, - 0x6a, 0xc7, 0x00, 0x70, 0xf0, 0x00, 0x6f, 0x0c, 0x0b, 0xfc, 0x5a, 0x0f, 0x85, 0x16, 0x07, 0xf0, - 0x9f, 0x04, 0xb2, 0xaf, 0x03, 0x07, 0x80, 0x02, 0x25, 0x84, 0x03, 0xcd, 0xeb, 0x00, 0x48, 0x8a, - 0xfd, 0x70, 0xdb, 0xfa, 0xd6, 0x2d, 0xfe, 0x75, 0x99, 0x04, 0xae, 0xb8, 0x03, 0xc9, 0xcf, 0x00, - 0x8a, 0x31, 0x00, 0x42, 0x09, 0x00, 0xe4, 0x88, 0x00, 0xa0, 0xa2, 0x01, 0xca, 0x63, 0x01, 0x42, - 0x1c, 0x00, 0x8f, 0xd2, 0x00, 0xe7, 0x5c, 0x01, 0x52, 0xa6, 0x00, 0x68, 0xd0, 0x00, 0x50, 0x93, - 0x00, 0x2b, 0xc0, 0xff, 0x2f, 0xed, 0xff, 0x61, 0xe3, 0xff, 0xb0, 0x4c, 0xff, 0x57, 0xb2, 0xff, - 0x2a, 0x65, 0x00, 0x2f, 0x21, 0x01, 0x65, 0xb3, 0x0d, 0xeb, 0x01, 0x12, 0x58, 0xf6, 0x06, 0xc5, - 0x06, 0x05, 0xe4, 0x05, 0x04, 0x05, 0x11, 0x02, 0x7e, 0xa9, 0x03, 0xa7, 0x23, 0x00, 0xba, 0xec, - 0xfb, 0x51, 0xb8, 0xf8, 0xf3, 0x10, 0xfd, 0xc7, 0x4b, 0x05, 0xa4, 0x44, 0x03, 0x86, 0x44, 0xff, - 0xa7, 0x13, 0xff, 0x1a, 0x7e, 0xff, 0x3f, 0xd4, 0x00, 0x1c, 0x56, 0x02, 0x9f, 0xc3, 0x01, 0x64, - 0xad, 0x00, 0x6d, 0x60, 0x01, 0x1b, 0xa2, 0x00, 0xf6, 0x4c, 0x00, 0xba, 0x0a, 0x01, 0xcc, 0x1c, - 0x00, 0x77, 0x04, 0x00, 0x4f, 0x6b, 0x00, 0x53, 0xf0, 0xff, 0x58, 0x8f, 0xff, 0x18, 0x3f, 0x00, - 0x38, 0xc2, 0x00, 0x2c, 0x15, 0x00, 0x01, 0xfe, 0x10, 0x32, 0x5f, 0x14, 0x89, 0x3d, 0x06, 0x0b, - 0xde, 0x05, 0xe9, 0x6d, 0x04, 0xbe, 0xc3, 0x01, 0x8e, 0x4d, 0x04, 0x5f, 0x9a, 0xff, 0x87, 0x39, - 0xfa, 0xaf, 0x67, 0xf6, 0x48, 0xa9, 0xfc, 0xa0, 0xa9, 0x06, 0x40, 0xc4, 0x02, 0x10, 0x9e, 0xfd, - 0xca, 0xd6, 0xfd, 0x4e, 0xa6, 0xfe, 0xa8, 0x37, 0x00, 0x24, 0x2d, 0x02, 0xc6, 0xd2, 0x01, 0x3b, - 0x9e, 0x00, 0x85, 0x19, 0x02, 0xb2, 0x71, 0x01, 0xbb, 0xfe, 0xff, 0xab, 0x9a, 0x00, 0x2b, 0x24, - 0x00, 0x0e, 0xf2, 0xff, 0xbf, 0x6c, 0x00, 0xc4, 0x17, 0x00, 0x5a, 0xfd, 0xff, 0xee, 0xc0, 0x00, - 0x9a, 0x76, 0x00, 0xcb, 0xf0, 0xff, 0x8a, 0x00, 0x16, 0x9a, 0x6c, 0x17, 0xe3, 0x46, 0x04, 0x18, - 0xb3, 0x06, 0x8e, 0xcd, 0x04, 0xc9, 0x26, 0x01, 0x10, 0x14, 0x05, 0xf1, 0x7a, 0xfe, 0xd4, 0x2c, - 0xf8, 0x98, 0x43, 0xf4, 0x6d, 0xd9, 0xfc, 0x59, 0x56, 0x08, 0xe4, 0xc6, 0x01, 0xea, 0x03, 0xfc, - 0x52, 0xcb, 0xfc, 0xd1, 0xcc, 0xfd, 0x38, 0xa5, 0xff, 0x81, 0x80, 0x01, 0xd5, 0x0e, 0x01, 0xcb, - 0x2e, 0x00, 0x99, 0x11, 0x02, 0x16, 0xe4, 0x00, 0x2a, 0xea, 0xff, 0x3f, 0x29, 0x01, 0x2f, 0x41, - 0x00, 0xdd, 0xb0, 0xff, 0x15, 0x24, 0x00, 0x76, 0x40, 0x00, 0xb1, 0xba, 0xff, 0x92, 0x87, 0x00, - 0x24, 0xd1, 0x00, 0xe6, 0xc7, 0xff, 0xad, 0xf5, 0x1a, 0xfa, 0x76, 0x1a, 0x9c, 0xc3, 0x01, 0x79, - 0x4f, 0x07, 0xa5, 0x78, 0x05, 0x11, 0x1b, 0x00, 0x9e, 0x9d, 0x05, 0x70, 0x45, 0xfd, 0x54, 0x1b, - 0xf6, 0x3e, 0x54, 0xf3, 0xbe, 0xf1, 0xfd, 0xc2, 0x91, 0x09, 0xf9, 0x82, 0x00, 0x7c, 0xbf, 0xfa, - 0x98, 0x10, 0xfc, 0x25, 0x7b, 0xfd, 0x44, 0x65, 0xff, 0x66, 0x08, 0x01, 0xea, 0xc2, 0x00, 0x08, - 0x62, 0xff, 0xc2, 0xed, 0x01, 0x8b, 0x7c, 0x00, 0x72, 0x00, 0xff, 0xa8, 0x2a, 0x01, 0x4c, 0x65, - 0x00, 0x4c, 0x29, 0x00, 0x7e, 0xec, 0xff, 0xba, 0x44, 0xff, 0x31, 0xa0, 0xff, 0x05, 0x95, 0x00, - 0x4b, 0xbe, 0x00, 0x89, 0x29, 0x00, 0x39, 0x36, 0x20, 0x77, 0xb0, 0x1e, 0x84, 0x3a, 0xff, 0x82, - 0x5b, 0x07, 0x6d, 0xca, 0x06, 0x36, 0xc7, 0xfe, 0xd4, 0xe8, 0x05, 0x74, 0x2e, 0xfc, 0x5b, 0x77, - 0xf3, 0xa0, 0x88, 0xf2, 0xde, 0xe9, 0xfe, 0x23, 0x98, 0x0a, 0x8a, 0xf2, 0xff, 0x24, 0xd9, 0xf9, - 0x8c, 0xd7, 0xfa, 0x41, 0x04, 0xfd, 0x4f, 0xe5, 0xff, 0x6e, 0x2c, 0x00, 0x6e, 0x50, 0x00, 0x84, - 0x88, 0xff, 0xe8, 0x36, 0x01, 0x44, 0xf1, 0xff, 0xf7, 0xe9, 0xfe, 0x44, 0x10, 0x01, 0x30, 0xf3, - 0xff, 0xfa, 0x84, 0xff, 0xa2, 0x77, 0xff, 0xbd, 0x35, 0xff, 0x95, 0x5b, 0xff, 0xdc, 0x06, 0x00, - 0x22, 0xca, 0x00, 0x1d, 0x3d, 0x00, 0xbc, 0x27, 0x24, 0xe6, 0xa9, 0x22, 0x87, 0xe2, 0xfd, 0x98, - 0xb6, 0x06, 0xa1, 0x9a, 0x07, 0x3e, 0x24, 0xfe, 0x44, 0x29, 0x06, 0xc0, 0x63, 0xfb, 0x5d, 0x4a, - 0xf1, 0x14, 0x09, 0xf2, 0x6b, 0xb7, 0xff, 0xb7, 0xab, 0x0a, 0x70, 0x69, 0xff, 0x38, 0xa5, 0xf9, - 0xef, 0x4a, 0xfa, 0x23, 0xb0, 0xfc, 0x51, 0xc7, 0xff, 0x4a, 0x08, 0x00, 0x52, 0x52, 0x00, 0x29, - 0x1a, 0xff, 0xc0, 0x7c, 0x01, 0x0b, 0x3d, 0x00, 0x9b, 0x60, 0xfe, 0x2f, 0x39, 0x00, 0x3c, 0x2b, - 0xff, 0x2a, 0xa8, 0xff, 0x85, 0x1f, 0xff, 0x9f, 0x93, 0xfe, 0x15, 0x8d, 0xff, 0xb2, 0x23, 0x00, - 0xee, 0xcf, 0x00, 0xdd, 0x3b, 0x00, 0xeb, 0x45, 0x27, 0x09, 0x1c, 0x27, 0xd2, 0x52, 0xfe, 0x38, - 0xf8, 0x05, 0xf0, 0x56, 0x07, 0x52, 0xd8, 0xfc, 0x00, 0x9f, 0x06, 0x07, 0xea, 0xfa, 0x5a, 0x31, - 0xef, 0x8f, 0x2f, 0xf2, 0x11, 0x14, 0xff, 0x23, 0xb8, 0x08, 0x71, 0xe0, 0xff, 0xef, 0xd8, 0xfa, - 0x74, 0x29, 0xf9, 0x38, 0x90, 0xfb, 0x2f, 0x76, 0xff, 0x9a, 0x93, 0xff, 0xab, 0xdb, 0x01, 0xfb, - 0xc8, 0xff, 0x5b, 0xfb, 0xff, 0x6b, 0xd8, 0xff, 0x81, 0x6b, 0xfe, 0x13, 0xdf, 0xff, 0x67, 0x63, - 0xfe, 0x3c, 0xe1, 0xfe, 0x91, 0xaf, 0xfe, 0xf1, 0x4c, 0xfe, 0xf6, 0x93, 0xff, 0xfb, 0x0a, 0x00, - 0xa3, 0x1f, 0x01, 0x44, 0x36, 0x00, 0xb0, 0x40, 0x28, 0x77, 0xc3, 0x2a, 0x5e, 0x8a, 0x00, 0xdb, - 0xce, 0x05, 0x0a, 0xbc, 0x07, 0x9a, 0x07, 0xfb, 0x6b, 0xf8, 0x05, 0x82, 0x0f, 0xfc, 0xdd, 0x8b, - 0xee, 0x07, 0x02, 0xf3, 0x4c, 0xfd, 0xfd, 0xb6, 0x4d, 0x05, 0x3c, 0xc7, 0xff, 0xb4, 0xf5, 0xfc, - 0x86, 0x00, 0xfa, 0x2c, 0x47, 0xfa, 0xbb, 0xf1, 0xfe, 0xbb, 0x85, 0xff, 0xb7, 0x18, 0x02, 0xe8, - 0xdc, 0x00, 0xcc, 0x88, 0xff, 0x80, 0x63, 0xff, 0xfc, 0x32, 0xfe, 0x08, 0x70, 0xff, 0x0d, 0xaa, - 0xfe, 0xcd, 0xe5, 0xfe, 0x8f, 0x7d, 0xfe, 0xae, 0x4a, 0xfe, 0xd2, 0x7c, 0xff, 0x8b, 0x1f, 0xff, - 0x5f, 0x8f, 0x00, 0x59, 0xb0, 0x00, 0xe4, 0xfe, 0x28, 0x08, 0x25, 0x2d, 0x3d, 0x49, 0x03, 0x62, - 0xc2, 0x06, 0xd3, 0x60, 0x08, 0xca, 0xad, 0xf9, 0xf8, 0x98, 0x03, 0xe4, 0x73, 0xfc, 0x98, 0x05, - 0xef, 0xc1, 0x89, 0xf4, 0xa4, 0x74, 0xfd, 0x32, 0x9b, 0x00, 0x34, 0x14, 0xff, 0xd0, 0xc9, 0xfe, - 0x1b, 0x3f, 0xfb, 0xdf, 0xa0, 0xfb, 0x14, 0xcd, 0xfd, 0x7e, 0xbb, 0xfd, 0xb4, 0xa9, 0x02, 0xa6, - 0x39, 0x02, 0xfc, 0xfa, 0xfe, 0xb2, 0x52, 0xfe, 0x3c, 0x65, 0xfe, 0x81, 0xd0, 0xff, 0x08, 0x12, - 0xff, 0x20, 0xdc, 0xfe, 0x7b, 0x15, 0xfe, 0x0d, 0x41, 0xfe, 0x52, 0x43, 0xff, 0x5e, 0x8a, 0xfe, - 0xa3, 0x16, 0x00, 0x82, 0x6d, 0x00, 0x19, 0xd5, 0x29, 0xed, 0xab, 0x2e, 0x28, 0xa2, 0x05, 0x65, - 0x0a, 0x09, 0x88, 0xe0, 0x09, 0x95, 0xc5, 0xf8, 0x51, 0xde, 0x00, 0xc0, 0x4d, 0xfb, 0x18, 0x8e, - 0xee, 0x93, 0xa6, 0xf6, 0xe0, 0x54, 0xff, 0x49, 0xb3, 0xfb, 0xe6, 0x57, 0xfb, 0x83, 0x15, 0x01, - 0xd2, 0x03, 0xfe, 0xd7, 0x08, 0xfd, 0xf7, 0x7f, 0xfd, 0x94, 0x9f, 0xfb, 0x91, 0x88, 0x01, 0x2f, - 0xd1, 0x02, 0x2b, 0x39, 0xff, 0xce, 0x0b, 0xff, 0x08, 0x3d, 0xff, 0x0f, 0x05, 0xff, 0xe3, 0x7a, - 0xfe, 0x3a, 0x39, 0xff, 0x4b, 0xe2, 0xfd, 0x51, 0xd3, 0xfd, 0x55, 0x48, 0xff, 0x03, 0xb3, 0xfd, - 0x16, 0x1a, 0xff, 0x82, 0x77, 0x00, 0xb0, 0x71, 0x2b, 0x87, 0x28, 0x2f, 0x41, 0xcb, 0x05, 0x42, - 0x79, 0x0b, 0xfe, 0xe7, 0x0b, 0x1a, 0x9f, 0xf8, 0x53, 0x0f, 0xff, 0xe9, 0x46, 0xf9, 0xa4, 0xc7, - 0xed, 0x8d, 0x68, 0xf9, 0x20, 0x2c, 0x01, 0xb5, 0xb0, 0xf7, 0xae, 0xcf, 0xf8, 0x8d, 0xf9, 0x01, - 0x5c, 0x88, 0xff, 0x5a, 0x68, 0xff, 0xf0, 0xb6, 0xfd, 0x67, 0x88, 0xf9, 0x69, 0x3d, 0x00, 0xbd, - 0xba, 0x03, 0x6c, 0xe5, 0xff, 0x47, 0x9c, 0xfe, 0x72, 0xba, 0xff, 0x48, 0x9d, 0xff, 0x5b, 0x7c, - 0xfe, 0x75, 0x93, 0xfe, 0xcb, 0x13, 0xfd, 0xb2, 0x80, 0xfd, 0xf1, 0x24, 0xff, 0x44, 0x79, 0xfd, - 0xf0, 0x74, 0xfe, 0xf0, 0x11, 0x00, 0x3b, 0x18, 0x2f, 0x83, 0xb0, 0x2e, 0x97, 0x63, 0x03, 0xf4, - 0xe0, 0x0e, 0x3c, 0xe7, 0x0d, 0x99, 0x15, 0xf8, 0x5f, 0x5f, 0xfd, 0x53, 0xeb, 0xf6, 0x38, 0x93, - 0xed, 0x80, 0x0a, 0xfc, 0x22, 0x67, 0x04, 0xd7, 0x6c, 0xf3, 0xd1, 0xc3, 0xf3, 0x6c, 0x20, 0x03, - 0x9e, 0x9e, 0x00, 0x56, 0xfd, 0x01, 0x75, 0x66, 0xff, 0x05, 0x61, 0xf7, 0x44, 0x1f, 0xff, 0x2a, - 0x97, 0x04, 0x79, 0xfa, 0xff, 0xb1, 0xa3, 0xfd, 0x54, 0x54, 0x00, 0xc2, 0xd6, 0xff, 0x4d, 0xe9, - 0xfd, 0x05, 0xaa, 0xfe, 0xee, 0xe5, 0xfb, 0x93, 0x9c, 0xfc, 0x67, 0x5c, 0xff, 0xd2, 0x3b, 0xfd, - 0x8a, 0xdb, 0xfd, 0xe2, 0xc9, 0xff, 0xae, 0xc7, 0x33, 0xe0, 0x0d, 0x2e, 0x4f, 0x67, 0xff, 0x50, - 0x28, 0x12, 0xa1, 0x1c, 0x0f, 0x7c, 0xab, 0xf6, 0x10, 0x3e, 0xfe, 0xe0, 0x4d, 0xf5, 0xf9, 0x2b, - 0xec, 0x41, 0x9f, 0xff, 0x55, 0xff, 0x08, 0x96, 0x28, 0xf0, 0x16, 0x67, 0xed, 0xa7, 0x0b, 0x03, - 0x22, 0x73, 0x02, 0xb0, 0x25, 0x04, 0xf5, 0xad, 0x01, 0x56, 0x6b, 0xf6, 0xfc, 0xaa, 0xfd, 0xbc, - 0x20, 0x05, 0x9c, 0x33, 0x00, 0x1c, 0xde, 0xfc, 0xb3, 0xd0, 0x00, 0x54, 0xd1, 0xff, 0x8c, 0x98, - 0xfc, 0x3d, 0x95, 0xfe, 0x0f, 0xe3, 0xfb, 0xd7, 0x48, 0xfc, 0xd6, 0x80, 0xff, 0x23, 0x0f, 0xfd, - 0x2f, 0x5c, 0xfd, 0x2c, 0x98, 0xff, 0x07, 0x0f, 0x3a, 0xd5, 0xd1, 0x2e, 0x85, 0x5c, 0xf9, 0x6a, - 0xf1, 0x12, 0x3e, 0xc7, 0x0f, 0x2a, 0xa6, 0xf5, 0x38, 0x41, 0x00, 0x3e, 0xbd, 0xf3, 0xef, 0x42, - 0xea, 0x98, 0x6c, 0x03, 0xaa, 0x0a, 0x0e, 0x74, 0x5f, 0xee, 0x12, 0x5c, 0xe7, 0xdd, 0x8a, 0x01, - 0x17, 0x3b, 0x03, 0xbb, 0x25, 0x05, 0x63, 0x64, 0x04, 0x6b, 0x36, 0xf7, 0x2c, 0xa3, 0xfb, 0x62, - 0xa3, 0x04, 0xd3, 0x20, 0x01, 0x8c, 0x92, 0xfb, 0x38, 0xdb, 0xff, 0xfd, 0x52, 0x00, 0xd6, 0x54, - 0xfc, 0xdc, 0x60, 0xfe, 0xf5, 0xf0, 0xfa, 0x6b, 0x0f, 0xfb, 0xa6, 0xfe, 0xff, 0x65, 0xbb, 0xfd, - 0x19, 0x91, 0xfc, 0xf8, 0xeb, 0xfe, 0x6e, 0xf7, 0x40, 0x13, 0x83, 0x33, 0x45, 0x42, 0xf2, 0xbe, - 0x63, 0x0e, 0x48, 0x27, 0x10, 0x75, 0xb9, 0xf4, 0x0d, 0x6d, 0x03, 0xa7, 0x8d, 0xf6, 0xfa, 0xc5, - 0xe7, 0x18, 0x2e, 0x02, 0xf6, 0x96, 0x12, 0x09, 0xbf, 0xf1, 0xf1, 0xab, 0xe3, 0xaa, 0x0d, 0xfe, - 0x5a, 0x43, 0x03, 0x23, 0xab, 0x06, 0xad, 0x3c, 0x06, 0x31, 0x97, 0xf6, 0xc8, 0x43, 0xfa, 0xb1, - 0xf8, 0x04, 0x9a, 0x97, 0x01, 0xb1, 0x8b, 0xfa, 0xdf, 0x9b, 0xff, 0x59, 0x41, 0x01, 0x2c, 0xb2, - 0xfb, 0x17, 0xd7, 0xfd, 0xc3, 0xda, 0xfa, 0x53, 0x80, 0xfa, 0x57, 0xf1, 0xff, 0x36, 0xf8, 0xfd, - 0x31, 0xbe, 0xfc, 0xec, 0x82, 0xfe, 0xf0, 0x68, 0x48, 0xfc, 0x72, 0x39, 0x08, 0xd3, 0xe9, 0x5e, - 0x00, 0x08, 0x0b, 0x67, 0x0f, 0xc7, 0x37, 0xf3, 0xa8, 0xc7, 0x09, 0x6e, 0xf6, 0xfa, 0x05, 0x03, - 0xe3, 0x11, 0xb5, 0xff, 0x4a, 0x09, 0x17, 0xd5, 0x9e, 0xf6, 0x5c, 0x8a, 0xe1, 0xcc, 0x54, 0xfa, - 0x8f, 0x67, 0x02, 0x4d, 0x7f, 0x06, 0x92, 0xba, 0x07, 0x18, 0xef, 0xf6, 0x8f, 0xe8, 0xf7, 0xa1, - 0xd3, 0x03, 0xb4, 0x24, 0x03, 0x80, 0xf9, 0xfa, 0xf1, 0x42, 0xfe, 0x09, 0x21, 0x01, 0x15, 0xad, - 0xfb, 0x0b, 0x4d, 0xfe, 0xd8, 0x00, 0xfb, 0x0b, 0x06, 0xf9, 0x1e, 0xe9, 0xff, 0x1c, 0xb8, 0xfe, - 0xee, 0x69, 0xfc, 0x08, 0xeb, 0xfd, 0xbd, 0xf4, 0x51, 0x12, 0xfb, 0x3a, 0x25, 0xab, 0xe0, 0x94, - 0xc1, 0x06, 0x33, 0xc9, 0x0c, 0xf8, 0xfd, 0xf1, 0x89, 0xd4, 0x0f, 0xee, 0x48, 0xfb, 0xdb, 0xad, - 0xe0, 0x2f, 0xc3, 0xff, 0x68, 0x6b, 0x1b, 0x11, 0x3f, 0xfb, 0x0e, 0x2e, 0xdf, 0x3f, 0x02, 0xf6, - 0xc2, 0xa8, 0xff, 0xa3, 0xcc, 0x07, 0x12, 0x00, 0x0a, 0x0f, 0xdc, 0xf4, 0xea, 0x25, 0xf5, 0x94, - 0xc6, 0x03, 0x85, 0xd0, 0x04, 0xb2, 0xeb, 0xf9, 0xb7, 0xef, 0xfc, 0x3c, 0x19, 0x02, 0xe6, 0xa9, - 0xfb, 0x6f, 0xa9, 0xfe, 0x1e, 0x22, 0xfb, 0xe5, 0x34, 0xf8, 0xdd, 0x74, 0xff, 0x07, 0x8e, 0xfe, - 0x4e, 0xc4, 0xfc, 0xa8, 0x72, 0xfe, 0x15, 0x29, 0x57, 0xfa, 0xa5, 0x3c, 0xa9, 0xd6, 0xdb, 0x63, - 0xbc, 0x05, 0x85, 0x1f, 0x0a, 0xc4, 0xf6, 0xf0, 0xa0, 0x04, 0x14, 0x25, 0xec, 0xfb, 0xe8, 0xc0, - 0xdf, 0x49, 0xd5, 0xfd, 0x55, 0x2c, 0x1e, 0xe1, 0xb1, 0x00, 0xa0, 0xe2, 0xdc, 0x60, 0xbc, 0xf2, - 0xeb, 0xc8, 0xfd, 0x42, 0x87, 0x06, 0x77, 0xca, 0x0a, 0x15, 0x1c, 0xf5, 0xe2, 0x15, 0xf4, 0x89, - 0x38, 0x02, 0x71, 0x02, 0x05, 0x34, 0x8b, 0xf9, 0x99, 0x45, 0xfc, 0xe7, 0xaf, 0x02, 0x32, 0x40, - 0xfb, 0x29, 0x4a, 0xff, 0x32, 0x9d, 0xfb, 0xbb, 0xe6, 0xf6, 0xab, 0xef, 0xfe, 0x10, 0x57, 0xff, - 0xbe, 0x90, 0xfd, 0xb9, 0x54, 0xfe, 0x9a, 0xb3, 0x5d, 0xfb, 0xaf, 0x3d, 0x71, 0xa4, 0xd7, 0x7d, - 0xc9, 0x04, 0xe4, 0x34, 0x05, 0xb8, 0x4f, 0xf1, 0x29, 0xbf, 0x19, 0x23, 0x94, 0xfc, 0xa6, 0x4d, - 0xde, 0x39, 0x8e, 0xfa, 0xd6, 0xc1, 0x20, 0x36, 0x44, 0x06, 0x81, 0x54, 0xdd, 0x3c, 0xc5, 0xf0, - 0xfe, 0x05, 0xf8, 0xee, 0x77, 0x04, 0x83, 0x14, 0x0e, 0x90, 0x0d, 0xf6, 0xef, 0xda, 0xf2, 0xb2, - 0x94, 0x00, 0x3b, 0x7e, 0x04, 0x5a, 0x35, 0xf9, 0xeb, 0x7f, 0xfc, 0x3c, 0xf3, 0x02, 0x7d, 0xd2, - 0xfa, 0x65, 0xb8, 0xff, 0xec, 0x37, 0xfb, 0xd1, 0x7f, 0xf6, 0xab, 0xa7, 0xff, 0xb8, 0x37, 0x00, - 0x06, 0xf3, 0xfd, 0xd4, 0x1c, 0xfe, 0xec, 0xee, 0x5f, 0x0d, 0x14, 0x41, 0x82, 0xb8, 0xd6, 0x8f, - 0xf2, 0x01, 0x45, 0xa1, 0x02, 0xf8, 0x5b, 0xf1, 0xb6, 0x45, 0x1c, 0xef, 0x4a, 0xfe, 0x08, 0x00, - 0xde, 0x5a, 0xb3, 0xf5, 0xfd, 0xe3, 0x20, 0x42, 0xfb, 0x0c, 0x88, 0xce, 0xde, 0xd2, 0xf1, 0xed, - 0xb7, 0x3b, 0xf3, 0x99, 0x33, 0x02, 0xf4, 0x40, 0x11, 0xb0, 0xfd, 0xf7, 0x9f, 0xa0, 0xf1, 0x3b, - 0xd1, 0xfe, 0x95, 0x12, 0x04, 0x9f, 0x52, 0xf9, 0x7b, 0x96, 0xfc, 0x3f, 0xf0, 0x02, 0xc5, 0xd2, - 0xf9, 0x91, 0x62, 0xff, 0x57, 0xe1, 0xfb, 0x33, 0xd5, 0xf6, 0x8d, 0xaa, 0xff, 0x0e, 0x83, 0x00, - 0x4e, 0x4f, 0xfe, 0x38, 0x29, 0xfe, 0x00, 0x44, 0x63, 0x84, 0xd6, 0x41, 0xa3, 0xe3, 0xd7, 0xea, - 0x26, 0x01, 0xae, 0xa0, 0xfe, 0x4a, 0x7d, 0xf2, 0x5d, 0xad, 0x1c, 0x8a, 0xe4, 0xff, 0x20, 0xc9, - 0xde, 0x17, 0x5a, 0xf0, 0x02, 0x73, 0x21, 0x4c, 0x41, 0x12, 0x58, 0xd7, 0xe1, 0x13, 0xde, 0xeb, - 0x53, 0xda, 0xed, 0x67, 0xa7, 0x00, 0xdb, 0x72, 0x13, 0x52, 0x43, 0xfb, 0xe4, 0xfc, 0xf0, 0xb1, - 0xd9, 0xfc, 0xad, 0x51, 0x04, 0x14, 0xe2, 0xf8, 0x21, 0xf6, 0xfc, 0x48, 0x30, 0x02, 0x07, 0x89, - 0xf8, 0x21, 0x0d, 0x00, 0x0b, 0xc2, 0xfc, 0x61, 0x1a, 0xf7, 0xc9, 0x44, 0xff, 0x70, 0xf6, 0x00, - 0x7e, 0x78, 0xfe, 0x8d, 0x4f, 0xfe, 0xa9, 0x79, 0x64, 0x4f, 0x55, 0x43, 0x12, 0xce, 0xd9, 0x08, - 0xd6, 0x00, 0xf6, 0x5d, 0xfc, 0x45, 0x42, 0xf2, 0xab, 0xfd, 0x1b, 0xce, 0x1d, 0x01, 0x1b, 0x18, - 0xdf, 0x42, 0x07, 0xec, 0x3e, 0x7d, 0x20, 0x80, 0xe9, 0x15, 0x79, 0x44, 0xe6, 0xf9, 0x9e, 0xea, - 0x70, 0x25, 0xe9, 0x10, 0x99, 0xff, 0xa9, 0x18, 0x14, 0x0e, 0xab, 0xfe, 0x3c, 0xd7, 0xf1, 0x91, - 0x1e, 0xfa, 0x09, 0xb2, 0x04, 0xde, 0x0c, 0xf9, 0x1d, 0x2a, 0xfc, 0x3c, 0x56, 0x01, 0xd5, 0x7d, - 0xf8, 0xd9, 0xb3, 0x00, 0x55, 0x90, 0xfc, 0xc9, 0xe6, 0xf7, 0x43, 0xc4, 0xfe, 0x96, 0x28, 0x00, - 0x60, 0x58, 0xff, 0x02, 0x4e, 0xfe, 0x91, 0x11, 0x64, 0xa0, 0xe4, 0x44, 0xe8, 0xbf, 0xdc, 0x7a, - 0x31, 0x01, 0x16, 0x64, 0xfa, 0x64, 0xc1, 0xf1, 0x99, 0x29, 0x1b, 0x3d, 0x22, 0x01, 0xad, 0x9a, - 0xdf, 0xa9, 0x1e, 0xe8, 0x45, 0xde, 0x1d, 0x5e, 0x1f, 0x19, 0x8c, 0x9f, 0xeb, 0xe9, 0xe2, 0xea, - 0xd6, 0x4b, 0xe4, 0x9f, 0x72, 0xfd, 0x1e, 0xb8, 0x14, 0xf7, 0x2c, 0x02, 0xe9, 0x88, 0xf3, 0x69, - 0xe7, 0xf6, 0x48, 0xc1, 0x04, 0xfe, 0xb8, 0xf9, 0x6d, 0x9d, 0xfa, 0xe9, 0x4e, 0x01, 0x65, 0xed, - 0xf8, 0x15, 0xe8, 0x00, 0x5d, 0xb0, 0xfc, 0x84, 0x21, 0xf8, 0x2e, 0xee, 0xfd, 0x6f, 0xa6, 0xff, - 0xfe, 0x1a, 0x00, 0xb1, 0x75, 0xfd, 0x94, 0x95, 0x61, 0x5a, 0xb0, 0x47, 0xf2, 0xe6, 0xe1, 0xf9, - 0xda, 0x02, 0x9a, 0x07, 0xf9, 0xcb, 0xdf, 0xef, 0x52, 0x9b, 0x1a, 0x1d, 0x99, 0x00, 0xc5, 0xd9, - 0xdf, 0x8d, 0xa8, 0xe4, 0xac, 0xc2, 0x19, 0xe5, 0xea, 0x1b, 0xf4, 0x56, 0xf2, 0x1b, 0xc3, 0xee, - 0x26, 0x26, 0xdf, 0x9c, 0xad, 0xf8, 0xa2, 0x40, 0x16, 0xd0, 0xab, 0x05, 0xf7, 0xbb, 0xf6, 0x81, - 0x3a, 0xf4, 0x77, 0x3e, 0x03, 0xda, 0x59, 0xfb, 0x40, 0x92, 0xf9, 0xec, 0x8a, 0x01, 0xab, 0xc1, - 0xf9, 0x34, 0xd0, 0x01, 0x5f, 0x58, 0xfc, 0xc6, 0x29, 0xf7, 0x61, 0x5e, 0xfe, 0xf1, 0xa3, 0xfe, - 0x18, 0x2f, 0x00, 0x06, 0x47, 0xfd, 0x62, 0x22, 0x60, 0xb3, 0x2e, 0x46, 0xe4, 0x9f, 0xe7, 0x63, - 0xd3, 0x05, 0xf2, 0xfa, 0xf6, 0x84, 0x9d, 0xf0, 0x60, 0x6f, 0x18, 0x95, 0xb9, 0xff, 0xa6, 0x47, - 0xe0, 0xf4, 0x66, 0xe1, 0x9d, 0x39, 0x17, 0x5e, 0x41, 0x1b, 0xf7, 0x66, 0xf7, 0x70, 0x3a, 0xf4, - 0x95, 0x28, 0xdc, 0x91, 0x8d, 0xf4, 0xd4, 0x57, 0x16, 0xcc, 0x99, 0x07, 0x7a, 0xfc, 0xf8, 0xdd, - 0xcc, 0xf3, 0x04, 0x4e, 0x01, 0x04, 0x70, 0xfc, 0x1b, 0x3a, 0xfa, 0x04, 0xe1, 0x00, 0xce, 0xa8, - 0xfa, 0xf7, 0xee, 0x01, 0x29, 0xf3, 0xfb, 0x55, 0x47, 0xf7, 0x02, 0xce, 0xfd, 0x9d, 0xa9, 0xfd, - 0x86, 0x3e, 0x00, 0x34, 0x7e, 0xfd, 0xef, 0x7c, 0x5c, 0x34, 0x20, 0x46, 0xbe, 0x33, 0xef, 0xcd, - 0x5a, 0x07, 0xb9, 0x4c, 0xf6, 0xc7, 0x28, 0xf1, 0x99, 0x65, 0x14, 0xe7, 0x32, 0x01, 0xb5, 0xce, - 0xe1, 0xe8, 0xfe, 0xdb, 0x3e, 0xd0, 0x13, 0x50, 0x3d, 0x1a, 0x0a, 0xb4, 0xfb, 0xdb, 0xab, 0xfc, - 0x4d, 0xcc, 0xda, 0x11, 0x2e, 0xed, 0x08, 0x5f, 0x16, 0xfa, 0x83, 0x09, 0x23, 0x77, 0xfa, 0x07, - 0xfa, 0xf5, 0xde, 0x6c, 0xff, 0x77, 0xc2, 0xfc, 0xac, 0x6d, 0xfc, 0x9b, 0x9b, 0xff, 0xed, 0xcd, - 0xf9, 0xfb, 0x46, 0x03, 0x89, 0x82, 0xfc, 0x42, 0xd3, 0xf5, 0xb7, 0xbc, 0xfd, 0xab, 0xf0, 0xfc, - 0x7b, 0x40, 0xff, 0xea, 0x1b, 0xff, 0x3a, 0xd9, 0x58, 0x86, 0x75, 0x45, 0x1d, 0xa6, 0xf4, 0x69, - 0xcd, 0x06, 0x5a, 0xae, 0xf7, 0xd0, 0x44, 0xf4, 0x02, 0x48, 0x0f, 0xc3, 0x16, 0x01, 0x84, 0xe7, - 0xe3, 0x5f, 0x53, 0xd8, 0xa4, 0xf8, 0x10, 0xd2, 0xbe, 0x18, 0xda, 0xd8, 0xfc, 0x4a, 0x46, 0x03, - 0x25, 0xf8, 0xdc, 0x07, 0x1d, 0xe6, 0x83, 0xfb, 0x13, 0x7a, 0x29, 0x0b, 0x38, 0x46, 0xfb, 0xee, - 0xd1, 0xf8, 0x36, 0xf7, 0xfe, 0x2f, 0xea, 0xfb, 0x32, 0x64, 0xfd, 0xb0, 0x87, 0xff, 0x1b, 0x71, - 0xf9, 0x10, 0xe4, 0x02, 0x97, 0x4d, 0xfc, 0xca, 0x0e, 0xf5, 0x66, 0x13, 0xfe, 0xda, 0x9b, 0xfc, - 0xb6, 0xc8, 0xfe, 0xbe, 0xae, 0x00, 0x15, 0x4c, 0x55, 0xbb, 0xa7, 0x40, 0xde, 0x37, 0xfb, 0xb0, - 0x49, 0x0b, 0x0b, 0xc4, 0xf6, 0x9b, 0xcc, 0xf5, 0x04, 0x93, 0x0b, 0x96, 0x44, 0x00, 0xa5, 0xbe, - 0xe7, 0xbd, 0x38, 0xd5, 0x4e, 0x75, 0x0b, 0xe5, 0x57, 0x18, 0x33, 0x41, 0xfe, 0x37, 0xd4, 0x08, - 0x76, 0x48, 0xe1, 0x3a, 0xfd, 0xdd, 0xb3, 0x5b, 0x0f, 0xec, 0xb9, 0x0d, 0x05, 0x95, 0xfc, 0xef, - 0xe3, 0xfb, 0xd2, 0xf3, 0xfe, 0xb4, 0x93, 0xfb, 0x05, 0x83, 0xfe, 0x5b, 0xe6, 0xfe, 0xdf, 0xcd, - 0xf8, 0x1b, 0x47, 0x02, 0x49, 0x75, 0xfc, 0x87, 0x05, 0xf4, 0xa9, 0xe6, 0xfd, 0x99, 0xe3, 0xfd, - 0x53, 0x6e, 0xfe, 0x97, 0x6c, 0x01, 0x9e, 0x4b, 0x50, 0xeb, 0x54, 0x3e, 0x96, 0xb7, 0xfd, 0x61, - 0x55, 0x10, 0xdf, 0x63, 0xf8, 0x91, 0xb9, 0xf2, 0xd6, 0x21, 0x0c, 0x62, 0x59, 0xff, 0x90, 0x28, - 0xe9, 0xe4, 0x05, 0xd6, 0x72, 0xad, 0x04, 0xe4, 0xfa, 0x18, 0xc5, 0xe1, 0xfe, 0xe8, 0x20, 0x0a, - 0xbc, 0xf9, 0xe7, 0xad, 0x8d, 0xd7, 0xae, 0xa8, 0x08, 0x2d, 0x10, 0x11, 0x8d, 0xaf, 0xfe, 0x8f, - 0x5e, 0xfc, 0xa1, 0xe5, 0xfe, 0x00, 0x59, 0xfc, 0x31, 0xc1, 0xfe, 0xd3, 0x72, 0xff, 0x01, 0xe6, - 0xf7, 0x54, 0xef, 0xfe, 0x2d, 0x17, 0xfe, 0xc8, 0x8e, 0xf5, 0x75, 0xd2, 0xfc, 0xa0, 0x10, 0xfe, - 0xe9, 0x69, 0xfe, 0x24, 0x97, 0x02, 0x16, 0xb9, 0x4c, 0xbd, 0x32, 0x3e, 0x52, 0x07, 0xfd, 0x0a, - 0x46, 0x10, 0x05, 0x18, 0xfe, 0xfc, 0x28, 0xf1, 0xc9, 0xb4, 0x0a, 0xb0, 0x7d, 0x00, 0xbd, 0xf0, - 0xe9, 0x23, 0x3a, 0xd8, 0x1a, 0xcf, 0x00, 0x3c, 0x72, 0x1a, 0x2a, 0xd4, 0xfc, 0x50, 0x3a, 0x06, - 0x05, 0xa1, 0xf2, 0x52, 0xf0, 0xd5, 0xc1, 0x2a, 0xff, 0x3e, 0x8b, 0x12, 0xc4, 0x00, 0x01, 0x27, - 0x73, 0xfe, 0xf5, 0x5c, 0xff, 0xae, 0x63, 0xfb, 0xe7, 0x00, 0xff, 0x5b, 0xae, 0x00, 0xe2, 0xf8, - 0xf6, 0x6b, 0x11, 0xfc, 0x0b, 0x6c, 0x00, 0xe5, 0xc5, 0xf6, 0xd5, 0xa9, 0xfb, 0xcc, 0x32, 0x00, - 0x0d, 0x64, 0xfe, 0x64, 0x54, 0x01, 0x25, 0x63, 0x4a, 0x21, 0x5b, 0x3c, 0x4b, 0xff, 0xfa, 0x1c, - 0xfd, 0x10, 0x4e, 0x1a, 0x03, 0x63, 0x83, 0xee, 0xae, 0x71, 0x06, 0x89, 0x44, 0x02, 0x49, 0x15, - 0xef, 0xcf, 0xef, 0xdc, 0x6a, 0x4e, 0xfb, 0x70, 0x4c, 0x18, 0xf4, 0x4f, 0xfd, 0x3c, 0x9e, 0x00, - 0x48, 0x07, 0xfb, 0xa0, 0xc8, 0xda, 0xf1, 0xd6, 0xf3, 0xf3, 0xab, 0x10, 0x2d, 0x54, 0x04, 0x68, - 0xb6, 0xfe, 0x7c, 0x7e, 0x01, 0xec, 0xa7, 0xfc, 0x7b, 0x60, 0xfd, 0x87, 0x96, 0xfe, 0xf3, 0x6a, - 0xf7, 0xac, 0x3c, 0xfc, 0x1c, 0x26, 0x01, 0x47, 0xa0, 0xf8, 0x07, 0x8e, 0xfb, 0x11, 0xc7, 0x00, - 0x96, 0x14, 0xfe, 0xec, 0x63, 0x00, 0x51, 0x17, 0x47, 0x72, 0x1b, 0x3c, 0x89, 0x01, 0xf9, 0xe3, - 0x5b, 0x0f, 0x07, 0x34, 0x07, 0x54, 0xc0, 0xf1, 0xb5, 0x46, 0x04, 0x22, 0xda, 0xfb, 0x3f, 0x08, - 0xf5, 0x16, 0xe1, 0xe5, 0x3b, 0x62, 0xf4, 0x04, 0x7c, 0x18, 0xa8, 0x1e, 0xff, 0x3b, 0x20, 0xf8, - 0x3f, 0xb5, 0x01, 0x9a, 0xdf, 0xe2, 0x7d, 0x15, 0xeb, 0x68, 0xcf, 0x0c, 0xc6, 0x50, 0x07, 0x31, - 0x98, 0xfd, 0xf4, 0xf9, 0x01, 0x58, 0x70, 0x00, 0x4e, 0xe7, 0xfb, 0x5a, 0x5d, 0xfb, 0x9a, 0x3d, - 0xf9, 0x69, 0x24, 0xfc, 0x0a, 0x32, 0x02, 0x91, 0x1a, 0xfc, 0x9c, 0x99, 0xf9, 0x13, 0x96, 0xff, - 0xf8, 0x56, 0xff, 0x3f, 0xe9, 0xff, 0x6e, 0x9f, 0x42, 0x67, 0xca, 0x38, 0xd3, 0xb8, 0xf8, 0x0d, - 0x47, 0x10, 0x7d, 0x05, 0x0b, 0x60, 0x0a, 0xf3, 0xd3, 0x71, 0x03, 0x55, 0xf5, 0xf8, 0x89, 0x7b, - 0xf5, 0x38, 0x9f, 0xee, 0x16, 0xb3, 0xf2, 0x61, 0x30, 0x14, 0xf9, 0x8e, 0x03, 0x5e, 0xb5, 0xf3, - 0x3e, 0x4b, 0x03, 0x8f, 0xd2, 0xec, 0xcd, 0x01, 0xe5, 0x71, 0xcf, 0x06, 0x47, 0x31, 0x0a, 0xfd, - 0x05, 0xfc, 0xa1, 0xe5, 0x00, 0x4b, 0x38, 0x03, 0x15, 0xf4, 0xfc, 0x60, 0x99, 0xf9, 0xc8, 0x4c, - 0xf9, 0x0e, 0x51, 0xfd, 0x77, 0x39, 0x03, 0x67, 0x79, 0xfe, 0xad, 0x29, 0xf8, 0x43, 0xdf, 0xfd, - 0x8a, 0xdf, 0x00, 0xe6, 0xac, 0xff, 0x6a, 0xfa, 0x3e, 0x71, 0xb9, 0x33, 0x3d, 0x70, 0xf9, 0xcd, - 0xf7, 0x12, 0xbe, 0x11, 0x0c, 0x14, 0xe7, 0xf2, 0x14, 0xcc, 0x01, 0xff, 0x9c, 0xfb, 0xf9, 0x85, - 0xf7, 0xf1, 0x23, 0xed, 0xb9, 0xc0, 0xf3, 0xab, 0xf4, 0x13, 0x58, 0x5a, 0x04, 0x8a, 0x78, 0xf3, - 0xce, 0x40, 0x02, 0x97, 0x5e, 0xf3, 0x1f, 0x9a, 0xe5, 0xcb, 0x9c, 0x00, 0xa5, 0x48, 0x0a, 0xc6, - 0x70, 0xfc, 0x7e, 0x19, 0xff, 0x19, 0x7c, 0x02, 0x0c, 0xd6, 0xfd, 0xdb, 0xbc, 0xfb, 0x4b, 0xf1, - 0xf9, 0xf3, 0x5e, 0xfc, 0x90, 0x5b, 0x03, 0x9b, 0xaf, 0xff, 0xc2, 0xb3, 0xf7, 0xf7, 0x85, 0xfd, - 0x71, 0xce, 0x01, 0xbb, 0x44, 0xff, 0x26, 0xe5, 0x38, 0x88, 0xda, 0x2e, 0xba, 0x5f, 0xfb, 0x81, - 0xc0, 0x14, 0x8b, 0x16, 0x0d, 0x1e, 0x65, 0xf2, 0x56, 0x5a, 0x01, 0x96, 0x1e, 0xff, 0x60, 0x50, - 0xfa, 0xe6, 0x0d, 0xed, 0xfc, 0xf6, 0xef, 0x67, 0xb5, 0x12, 0x43, 0x58, 0x09, 0xfc, 0x0a, 0xf2, - 0x0d, 0x03, 0x01, 0xa0, 0xa1, 0xfa, 0xa0, 0x38, 0xe6, 0xca, 0xd5, 0xfc, 0x89, 0xfb, 0x0a, 0x58, - 0x5e, 0xfb, 0x5b, 0x1a, 0xfc, 0x3c, 0x8c, 0x01, 0x03, 0xe9, 0xfd, 0xe1, 0x5a, 0xfd, 0xc2, 0x65, - 0xfd, 0x41, 0xb5, 0xfb, 0x6f, 0xf2, 0xff, 0x84, 0xa8, 0x00, 0xd0, 0xd8, 0xf9, 0x43, 0x3a, 0xfe, - 0xaa, 0xf5, 0x01, 0x59, 0x7e, 0xfe, 0x66, 0x21, 0x32, 0xca, 0xe4, 0x29, 0x8f, 0xd4, 0xfe, 0xe8, - 0x13, 0x17, 0x28, 0x2e, 0x0d, 0xbe, 0xe4, 0xf1, 0xe0, 0x28, 0x01, 0x84, 0xc0, 0x02, 0x24, 0x97, - 0xfc, 0xff, 0xdb, 0xed, 0x28, 0xbb, 0xee, 0x20, 0xf2, 0x0c, 0xd2, 0x93, 0x0a, 0xa9, 0x48, 0xf7, - 0xed, 0xf5, 0xff, 0xd4, 0x41, 0xfc, 0xe6, 0xa1, 0xe9, 0xac, 0x21, 0xfb, 0xcb, 0x1c, 0x0a, 0xd2, - 0xcb, 0xfb, 0xa1, 0xf7, 0xfa, 0xd2, 0x4d, 0x00, 0xee, 0xb7, 0xfc, 0x0a, 0xa9, 0xfd, 0x5f, 0x8e, - 0xff, 0xa4, 0x5a, 0xfc, 0x22, 0x39, 0xfe, 0x36, 0x53, 0x00, 0xd8, 0xaf, 0xfb, 0x0b, 0x07, 0xff, - 0xe6, 0x51, 0x02, 0x39, 0xe0, 0xfe, 0x14, 0x21, 0x33, 0x46, 0x04, 0x26, 0xad, 0x22, 0xfd, 0xa3, - 0x3c, 0x1e, 0xe6, 0x81, 0x09, 0x2d, 0x30, 0xe9, 0xcb, 0xd1, 0x01, 0xb6, 0x3b, 0x01, 0xa2, 0x11, - 0xf6, 0x45, 0x0f, 0xe7, 0x1d, 0xed, 0xf6, 0x6a, 0x11, 0x1b, 0xa1, 0xb1, 0x05, 0xd4, 0xa0, 0xf7, - 0x83, 0x47, 0x0d, 0x03, 0x20, 0x00, 0xe8, 0xc2, 0xea, 0x36, 0x70, 0xfe, 0x30, 0x9d, 0x08, 0x69, - 0x49, 0xf8, 0x00, 0x70, 0xf8, 0x3f, 0x4a, 0xfb, 0x7d, 0xe7, 0xf8, 0x52, 0x54, 0xfe, 0xc4, 0xcb, - 0xfc, 0x0d, 0xb8, 0xf9, 0xf4, 0xe3, 0xfe, 0x46, 0x2c, 0xfe, 0xa0, 0x81, 0xfb, 0x5f, 0xa9, 0x00, - 0x9a, 0x7e, 0x01, 0x97, 0xa8, 0xfd, 0x73, 0xa8, 0x2a, 0x27, 0x41, 0x24, 0x32, 0x53, 0x02, 0x02, - 0x7b, 0x1a, 0xef, 0x8f, 0x0c, 0xcb, 0x6c, 0xec, 0xa9, 0x1b, 0xfb, 0x4f, 0x4f, 0xff, 0x5b, 0x9f, - 0xf7, 0x13, 0x74, 0xee, 0x8b, 0xbb, 0xf9, 0x04, 0xd5, 0x12, 0x87, 0x9a, 0x07, 0xc5, 0x2f, 0xfc, - 0xd9, 0x58, 0x08, 0x15, 0x55, 0x00, 0x0d, 0x9b, 0xee, 0xa1, 0x4c, 0xf9, 0x26, 0x23, 0x04, 0xbb, - 0x18, 0xfb, 0xc5, 0x9d, 0xfb, 0x76, 0x2e, 0xfe, 0xa3, 0x2e, 0xf9, 0x4d, 0xd6, 0xfe, 0x85, 0xd0, - 0xff, 0x68, 0xee, 0xf8, 0x0f, 0xaa, 0xfe, 0x13, 0x2f, 0x00, 0x6d, 0xed, 0xf9, 0x34, 0xc8, 0xfd, - 0xa2, 0xdd, 0x00, 0x60, 0xc3, 0xfe, 0xb3, 0x46, 0x24, 0xa1, 0x66, 0x20, 0x29, 0x09, 0x05, 0x7b, - 0xb8, 0x18, 0x77, 0x13, 0x0c, 0x2a, 0xdd, 0xf0, 0xa3, 0xf1, 0xfc, 0xb7, 0xd2, 0xfe, 0x19, 0x8d, - 0xf8, 0x53, 0x1f, 0xf3, 0x9a, 0x4e, 0xfa, 0x4a, 0x99, 0x0d, 0xa6, 0xec, 0x06, 0xd4, 0xcf, 0xfc, - 0xd1, 0x00, 0x06, 0x2e, 0xcc, 0x00, 0x4b, 0x81, 0xf1, 0x63, 0x96, 0xf9, 0x6a, 0x89, 0x02, 0x61, - 0xb7, 0xfb, 0x3c, 0x3c, 0xfd, 0x82, 0xfe, 0xfe, 0x9f, 0xf1, 0xfa, 0x54, 0xc9, 0xff, 0x2e, 0xa7, - 0xff, 0x11, 0xf8, 0xf9, 0xf8, 0x00, 0xff, 0x5b, 0xd7, 0xff, 0x53, 0x65, 0xfa, 0x37, 0x4a, 0xfd, - 0xf0, 0xb1, 0xff, 0xdf, 0x80, 0xfe, 0xd0, 0xfd, 0x1d, 0x96, 0xb0, 0x1c, 0x6b, 0xc5, 0x07, 0xff, - 0x96, 0x16, 0xbb, 0x42, 0x0b, 0xdc, 0x5b, 0xf5, 0x91, 0x4c, 0xfe, 0x34, 0xa5, 0xfe, 0x6f, 0x9d, - 0xfa, 0xda, 0x98, 0xf6, 0xcf, 0x6d, 0xfa, 0x62, 0xc8, 0x09, 0x27, 0x4f, 0x05, 0x11, 0x2a, 0xfd, - 0x8e, 0x71, 0x04, 0xf8, 0xad, 0x00, 0x84, 0xa3, 0xf4, 0xad, 0x96, 0xf9, 0x8c, 0xf4, 0x00, 0x12, - 0x01, 0xfd, 0xb2, 0x64, 0xfd, 0x7d, 0x70, 0xff, 0x3d, 0x04, 0xfe, 0x56, 0x41, 0x01, 0x83, 0xcf, - 0xff, 0x46, 0xf9, 0xfa, 0x12, 0xb7, 0xfe, 0x0c, 0xf8, 0xfe, 0x1e, 0xfb, 0xfa, 0x64, 0x05, 0xfd, - 0xcf, 0x51, 0xfe, 0xac, 0xa8, 0xfd, 0xdb, 0xe2, 0x18, 0x46, 0xcb, 0x19, 0xa8, 0x70, 0x09, 0x72, - 0xe3, 0x13, 0x55, 0x18, 0x0b, 0xda, 0x2f, 0xf9, 0x87, 0x61, 0xfe, 0x8f, 0xa4, 0xff, 0xbf, 0x66, - 0xfd, 0x68, 0x6e, 0xf8, 0xbc, 0xa6, 0xfa, 0x43, 0x05, 0x07, 0x77, 0xc5, 0x03, 0xc2, 0x6e, 0xfd, - 0xc1, 0x03, 0x03, 0xca, 0x25, 0x01, 0x1a, 0x06, 0xf7, 0x26, 0x4e, 0xf9, 0x77, 0x7b, 0x00, 0x0e, - 0xeb, 0xfd, 0xdf, 0xf3, 0xfd, 0x2a, 0x23, 0x01, 0x2a, 0x8f, 0x00, 0x53, 0xaa, 0x01, 0xe9, 0x7a, - 0xff, 0x0f, 0xd6, 0xfb, 0x57, 0x3a, 0xfe, 0xe5, 0x2c, 0xfe, 0x9f, 0xa3, 0xfb, 0x68, 0x9f, 0xfc, - 0x83, 0x95, 0xfd, 0x2c, 0xb4, 0xfd, 0xbb, 0xc3, 0x14, 0x5b, 0x9a, 0x17, 0xf1, 0xc7, 0x09, 0x16, - 0xf4, 0x10, 0x71, 0x62, 0x0b, 0x2f, 0xa8, 0xfb, 0x49, 0xac, 0xfe, 0xdc, 0x76, 0x01, 0x32, 0xf2, - 0xfe, 0x8f, 0xd5, 0xf9, 0xea, 0x3b, 0xfb, 0x0c, 0x45, 0x04, 0x6a, 0x58, 0x02, 0x80, 0xc5, 0xfd, - 0x42, 0x2d, 0x02, 0x0e, 0x37, 0x01, 0xb8, 0xaa, 0xf8, 0xbc, 0xd9, 0xf9, 0xec, 0x2b, 0x00, 0xbb, - 0x4f, 0xff, 0xfb, 0x00, 0x00, 0x75, 0x2c, 0x02, 0x8d, 0xa9, 0x00, 0xfb, 0xe1, 0x00, 0xa5, 0x99, - 0xff, 0xe6, 0x81, 0xfc, 0x4c, 0xaf, 0xfd, 0xa9, 0xc5, 0xfd, 0xf7, 0xe1, 0xfb, 0xf2, 0x15, 0xfd, - 0x40, 0xf7, 0xfd, 0x75, 0xae, 0xfd, 0x72, 0x41, 0x12, 0x71, 0x9e, 0x15, 0xc6, 0x37, 0x09, 0x84, - 0x9e, 0x0e, 0xc4, 0x9a, 0x0a, 0x0a, 0x15, 0xfd, 0xb7, 0xe7, 0xff, 0x3a, 0x66, 0x02, 0x5a, 0x54, - 0xff, 0x5b, 0x4e, 0xfb, 0xd3, 0x86, 0xfb, 0xf2, 0xb2, 0x01, 0xe7, 0x35, 0x01, 0x30, 0x51, 0xfe, - 0xe8, 0xf5, 0x01, 0x0d, 0xf8, 0x00, 0x9a, 0xaa, 0xf9, 0xb9, 0x27, 0xfb, 0xf4, 0xd8, 0x00, 0xee, - 0x8c, 0x00, 0x73, 0x46, 0x01, 0xe7, 0xe9, 0x01, 0xa8, 0xc7, 0xff, 0x9a, 0x2a, 0x00, 0xa9, 0x45, - 0xff, 0xc8, 0x88, 0xfc, 0x9a, 0x76, 0xfd, 0xc7, 0x58, 0xfe, 0x99, 0x32, 0xfd, 0x29, 0x3a, 0xfd, - 0x17, 0x81, 0xfd, 0xfd, 0xc3, 0xfd, 0x65, 0xcd, 0x10, 0x02, 0x1b, 0x13, 0x43, 0x87, 0x08, 0x78, - 0x4d, 0x0d, 0x24, 0x2f, 0x09, 0xe2, 0xe0, 0xfe, 0xb6, 0xac, 0x01, 0x56, 0xa9, 0x02, 0x34, 0xe7, - 0xff, 0xf8, 0x92, 0xfc, 0x75, 0xc1, 0xfb, 0xd6, 0x12, 0x00, 0x03, 0xdb, 0x00, 0x52, 0x5c, 0xff, - 0x88, 0x11, 0x02, 0x49, 0x7c, 0x01, 0x45, 0x63, 0xfb, 0x60, 0x49, 0xfc, 0xc2, 0x6a, 0x01, 0x35, - 0xbb, 0x01, 0x35, 0xab, 0x01, 0x15, 0xe6, 0x00, 0xcb, 0x49, 0xff, 0x02, 0xef, 0xff, 0x60, 0xde, - 0xfe, 0x7f, 0x73, 0xfd, 0x2d, 0x05, 0xff, 0x06, 0x25, 0xff, 0x2f, 0x4d, 0xfd, 0x36, 0x1d, 0xfd, - 0x58, 0xde, 0xfd, 0x13, 0x6b, 0xfe, 0x1d, 0x26, 0x0f, 0x1f, 0x12, 0x11, 0x2d, 0xf5, 0x07, 0xd8, - 0x75, 0x0b, 0xc8, 0x33, 0x08, 0x71, 0xcf, 0x00, 0x96, 0x98, 0x02, 0x1e, 0x81, 0x02, 0xd2, 0x78, - 0x00, 0xc8, 0x57, 0xfd, 0x10, 0xd0, 0xfb, 0x0b, 0x34, 0xff, 0xad, 0xa9, 0x00, 0xe3, 0x02, 0x01, - 0x71, 0x69, 0x03, 0x3d, 0x8a, 0x01, 0x21, 0x01, 0xfc, 0x44, 0xe8, 0xfc, 0x89, 0xdc, 0x01, 0x35, - 0x8b, 0x02, 0x2c, 0x32, 0x01, 0x1f, 0xa8, 0xff, 0x48, 0xeb, 0xfe, 0xa6, 0x66, 0x00, 0xc3, 0xf6, - 0xff, 0x58, 0x6e, 0xfe, 0x23, 0x25, 0xff, 0x09, 0x29, 0xff, 0x8d, 0xac, 0xfd, 0xb7, 0x5a, 0xfd, - 0x53, 0x69, 0xfe, 0xee, 0x57, 0xff, 0x19, 0xb6, 0x0c, 0xf1, 0xe4, 0x0f, 0xa5, 0xa8, 0x07, 0x37, - 0xbc, 0x08, 0xd1, 0xd7, 0x07, 0x0e, 0xf2, 0x02, 0x25, 0x17, 0x03, 0xc7, 0x2d, 0x02, 0x87, 0x86, - 0x00, 0x00, 0xe0, 0xfd, 0x10, 0x02, 0xfc, 0x19, 0xdf, 0xff, 0x23, 0xbe, 0x02, 0x9e, 0xed, 0x01, - 0xbe, 0x88, 0x02, 0x96, 0x47, 0x01, 0x25, 0xed, 0xfc, 0x57, 0x78, 0xfd, 0x6f, 0xf4, 0x01, 0x0c, - 0x87, 0x02, 0xc3, 0x46, 0x00, 0xb6, 0x78, 0xff, 0x62, 0xfd, 0xff, 0x07, 0xaa, 0x00, 0x29, 0x4c, - 0x00, 0x5e, 0xfb, 0xfe, 0x58, 0xb8, 0xfe, 0x1e, 0x00, 0xff, 0x37, 0x7c, 0xfe, 0x63, 0x6f, 0xfe, - 0xb9, 0x4c, 0xff, 0xd1, 0x2d, 0x00, 0xb8, 0x4c, 0x09, 0x69, 0x46, 0x0d, 0xda, 0x17, 0x08, 0x2b, - 0x17, 0x08, 0xfb, 0xfd, 0x07, 0x57, 0xd9, 0x03, 0x20, 0x8e, 0x02, 0xbe, 0x22, 0x02, 0x08, 0x27, - 0x01, 0xe8, 0x24, 0x00, 0x4f, 0xb0, 0xfe, 0x09, 0xb9, 0xff, 0xce, 0x8b, 0x02, 0x7e, 0xbe, 0x02, - 0xb4, 0xb5, 0x01, 0xc1, 0xd8, 0x00, 0x59, 0x6e, 0xfe, 0xb6, 0xe4, 0xfd, 0x1e, 0x21, 0x01, 0xbb, - 0x99, 0x02, 0xa8, 0xc3, 0x00, 0xe1, 0xc1, 0xff, 0x6d, 0x48, 0x00, 0xc4, 0xb5, 0x00, 0x4c, 0x27, - 0x00, 0x2b, 0x1c, 0xff, 0x0d, 0x5f, 0xff, 0xb2, 0xdd, 0xff, 0xf2, 0x4a, 0xff, 0xbc, 0x6d, 0xff, - 0x2d, 0xfe, 0xff, 0x7c, 0x8b, 0xff, 0xb4, 0x4f, 0x07, 0xa3, 0x1e, 0x0c, 0x5c, 0x63, 0x08, 0x48, - 0xa1, 0x05, 0xbb, 0x9f, 0x05, 0xdb, 0x51, 0x05, 0x88, 0x5f, 0x04, 0xf2, 0xa3, 0x02, 0x7b, 0xb7, - 0x01, 0x9f, 0x7b, 0x01, 0x1e, 0x0a, 0x01, 0xc6, 0xf3, 0x00, 0x0f, 0xdd, 0x01, 0xd0, 0xe6, 0x01, - 0xd9, 0xa1, 0x00, 0xbc, 0x64, 0x00, 0x0f, 0x94, 0xff, 0xb5, 0xe5, 0xfe, 0x6f, 0x15, 0x01, 0x50, - 0x4e, 0x02, 0xd6, 0xf8, 0x00, 0xa9, 0xf1, 0xff, 0x40, 0xf6, 0xff, 0x91, 0x75, 0x00, 0xce, 0x8d, - 0x00, 0xce, 0x4c, 0x00, 0x2c, 0x17, 0x00, 0xa0, 0x2b, 0x00, 0x0e, 0x3f, 0x00, 0x8e, 0x59, 0xff, - 0xe4, 0x93, 0xfe, 0x24, 0xa9, 0xfe, 0xc2, 0x2f, 0x06, 0xf6, 0x6d, 0x09, 0xc8, 0xcf, 0x06, 0x31, - 0x51, 0x05, 0x11, 0xf2, 0x05, 0x40, 0x03, 0x06, 0x58, 0x1a, 0x05, 0xf0, 0x96, 0x04, 0x4d, 0x62, - 0x03, 0xc5, 0xf4, 0x01, 0x2b, 0xa7, 0x01, 0x33, 0x17, 0x01, 0xb5, 0xd0, 0x00, 0xa3, 0x20, 0x01, - 0xbc, 0xbb, 0x00, 0x5d, 0xa1, 0xff, 0xa1, 0xaa, 0xff, 0xa8, 0xe1, 0x00, 0x33, 0x65, 0x01, 0xa0, - 0x2e, 0x01, 0x3a, 0x8a, 0x00, 0xe0, 0xed, 0xff, 0x88, 0x3d, 0x00, 0x7e, 0x39, 0x01, 0xea, 0x79, - 0x01, 0x24, 0xd6, 0x00, 0xcf, 0x6e, 0x00, 0xcc, 0xcc, 0xff, 0x5f, 0xe1, 0xfe, 0x22, 0xa1, 0xfe, - 0xd7, 0xc7, 0xfe, 0x46, 0xd0, 0xfe, 0x6d, 0xb6, 0x05, 0x52, 0x3c, 0x07, 0x5c, 0xb6, 0x05, 0x61, - 0x6e, 0x07, 0xf5, 0xd1, 0x07, 0xab, 0xaa, 0x06, 0x27, 0x0d, 0x05, 0x45, 0x81, 0x03, 0x3a, 0x9a, - 0x03, 0x7c, 0x00, 0x03, 0x19, 0x6a, 0x01, 0xf4, 0xb2, 0x00, 0x35, 0x5d, 0x00, 0xc4, 0x0a, 0x00, - 0xf6, 0x55, 0x00, 0x18, 0x6a, 0x00, 0x73, 0x49, 0x00, 0x69, 0xcf, 0x00, 0x53, 0xe6, 0x00, 0x5b, - 0x93, 0x00, 0xb6, 0x03, 0x01, 0x14, 0x61, 0x01, 0x70, 0x1d, 0x01, 0x37, 0xfb, 0x00, 0xbb, 0xf5, - 0x00, 0x92, 0x86, 0x00, 0xe6, 0xae, 0xff, 0xb1, 0xff, 0xfe, 0xa4, 0x82, 0xfe, 0x5d, 0x7d, 0xfe, - 0xa5, 0xfe, 0xfe, 0x41, 0x0e, 0xff, 0x88, 0x72, 0x07, 0x2a, 0xe4, 0x09, 0x0b, 0xa4, 0x06, 0x59, - 0x56, 0x07, 0x94, 0xa4, 0x07, 0x4b, 0x77, 0x06, 0xec, 0x02, 0x05, 0xb1, 0x7c, 0x02, 0xb8, 0x3a, - 0x01, 0xab, 0xe6, 0x00, 0xf9, 0x1b, 0x01, 0x4d, 0x3b, 0x01, 0x67, 0x87, 0x00, 0x4a, 0x13, 0x00, - 0x31, 0x64, 0x00, 0x98, 0xe0, 0x00, 0xce, 0x52, 0x00, 0x05, 0xc2, 0xff, 0xb5, 0x97, 0x00, 0x9c, - 0x9e, 0x01, 0x75, 0x32, 0x02, 0x99, 0x38, 0x02, 0xbb, 0x55, 0x01, 0xd5, 0x25, 0x00, 0x2a, 0x4f, - 0xff, 0x05, 0x01, 0xff, 0x89, 0xe2, 0xfe, 0x4b, 0xc3, 0xfe, 0x02, 0xe9, 0xfe, 0x25, 0x05, 0xff, - 0x36, 0xea, 0xfe, 0x4c, 0xe7, 0xfe, 0x7e, 0x6d, 0x06, 0xdc, 0xb5, 0x09, 0xbb, 0xea, 0x07, 0xe7, - 0x0f, 0x08, 0xe1, 0xaa, 0x07, 0x3e, 0x5c, 0x06, 0x19, 0x60, 0x04, 0x2c, 0xb6, 0x01, 0xad, 0x01, - 0x01, 0x4f, 0xdc, 0x00, 0x35, 0xdf, 0x00, 0x1b, 0x63, 0x01, 0x2a, 0x78, 0x01, 0xf9, 0x0a, 0x01, - 0x44, 0x69, 0x00, 0xb0, 0xce, 0xff, 0xb0, 0x98, 0xff, 0xc5, 0x65, 0x00, 0x1a, 0x29, 0x01, 0x7c, - 0x8b, 0x01, 0xfb, 0x5d, 0x02, 0x0e, 0x81, 0x02, 0x2b, 0x8e, 0x01, 0x18, 0x62, 0x00, 0xf1, 0x08, - 0xff, 0x80, 0x3b, 0xfe, 0x2a, 0x81, 0xfe, 0x31, 0xc2, 0xfe, 0xd4, 0xf3, 0xfe, 0x0d, 0x36, 0xff, - 0x25, 0xf8, 0xfe, 0x9b, 0xf8, 0xfe, 0x3f, 0xb5, 0x07, 0x4b, 0xfa, 0x0a, 0x41, 0xc1, 0x06, 0x78, - 0x06, 0x07, 0xe1, 0xc0, 0x06, 0xa2, 0x75, 0x04, 0x10, 0x3b, 0x04, 0x7d, 0x76, 0x02, 0x59, 0x81, - 0x00, 0x5a, 0x93, 0x00, 0x60, 0x0e, 0x02, 0x45, 0x0a, 0x02, 0x07, 0x4d, 0x01, 0xd3, 0x7d, 0x01, - 0x09, 0xd4, 0xff, 0xa8, 0x01, 0xff, 0xc0, 0x32, 0x00, 0xe6, 0xc1, 0x00, 0x5c, 0xeb, 0x00, 0x96, - 0x5d, 0x01, 0x67, 0x77, 0x02, 0xea, 0x83, 0x02, 0x1d, 0x74, 0x01, 0x1d, 0x8a, 0x00, 0x0b, 0x11, - 0xff, 0xf8, 0x1a, 0xfe, 0x95, 0x86, 0xfe, 0xf5, 0xbf, 0xfe, 0xde, 0x69, 0xfe, 0x31, 0xee, 0xfe, - 0xc4, 0x6f, 0xff, 0x87, 0xf9, 0xfe, 0xbb, 0x99, 0x07, 0xe2, 0x5b, 0x0a, 0x21, 0xe8, 0x05, 0xb6, - 0xf8, 0x05, 0x22, 0xc4, 0x05, 0xb1, 0x7b, 0x04, 0xc1, 0x4f, 0x04, 0x92, 0x63, 0x02, 0x23, 0x1f, - 0x01, 0x2d, 0x16, 0x01, 0xc2, 0xfa, 0x01, 0x19, 0xf9, 0x01, 0xfb, 0xc9, 0x01, 0x6e, 0xed, 0x01, - 0x1f, 0x2d, 0x00, 0x9c, 0xf8, 0xff, 0xb8, 0xc5, 0x00, 0x97, 0x86, 0x00, 0xa9, 0x8d, 0x00, 0x31, - 0xc2, 0x00, 0xfb, 0x63, 0x01, 0x35, 0xc7, 0x01, 0x5b, 0x9a, 0x02, 0xcf, 0x9b, 0x02, 0x0a, 0x1b, - 0x00, 0xb3, 0xbf, 0xfe, 0x4f, 0x88, 0xfe, 0xa9, 0xfa, 0xfd, 0xfc, 0x94, 0xfe, 0x68, 0x2e, 0xff, - 0x56, 0x0d, 0xff, 0xce, 0x14, 0xff, 0x1c, 0xa2, 0x08, 0xe1, 0x8a, 0x0b, 0xf6, 0x9d, 0x05, 0x0b, - 0xa5, 0x04, 0xfa, 0x77, 0x04, 0x71, 0x93, 0x03, 0x1e, 0xf2, 0x03, 0x60, 0x54, 0x02, 0x68, 0x66, - 0x00, 0x52, 0x12, 0x00, 0x7e, 0x35, 0x02, 0x5d, 0x25, 0x03, 0x61, 0xd8, 0x01, 0xfe, 0xff, 0x00, - 0xca, 0xf6, 0x00, 0x73, 0xf9, 0x00, 0xf0, 0x2e, 0x00, 0x49, 0x44, 0x01, 0x39, 0xa7, 0x01, 0x02, - 0x24, 0x00, 0x77, 0xee, 0x00, 0x09, 0x3d, 0x01, 0xdb, 0xef, 0x00, 0x04, 0xe1, 0x01, 0xa7, 0x70, - 0x02, 0x20, 0xa0, 0x01, 0x90, 0x16, 0xff, 0x9c, 0xc1, 0xfd, 0xad, 0x25, 0xfe, 0x4d, 0x86, 0xfe, - 0x17, 0x17, 0xff, 0xd3, 0x4d, 0xff, 0x23, 0x89, 0x0a, 0xc4, 0x0d, 0x0e, 0xf4, 0xc8, 0x05, 0x40, - 0x75, 0x04, 0x51, 0x83, 0x03, 0x0a, 0x3b, 0x01, 0x4b, 0x4b, 0x03, 0x0a, 0x4d, 0x02, 0x5b, 0x6c, - 0xff, 0xb4, 0x9a, 0xfe, 0xd8, 0x85, 0x01, 0xd9, 0x9b, 0x03, 0xcf, 0xdf, 0x01, 0x1c, 0x9a, 0x01, - 0x1a, 0x33, 0x01, 0xab, 0xe8, 0xff, 0x57, 0xc1, 0x00, 0x7d, 0x01, 0x02, 0x91, 0x4d, 0x01, 0x4b, - 0x1a, 0x01, 0xfd, 0xfb, 0x01, 0xe1, 0x92, 0x00, 0x62, 0x01, 0x00, 0xb6, 0x92, 0x01, 0x13, 0x8d, - 0x01, 0xcc, 0x5c, 0x01, 0xd6, 0x88, 0x01, 0x7d, 0x0e, 0x00, 0xe8, 0x4c, 0xfe, 0x9c, 0x3b, 0xfe, - 0x5f, 0xf5, 0xfe, 0xbc, 0x27, 0xff, 0x9a, 0x30, 0x0c, 0xeb, 0x3a, 0x0f, 0x5b, 0xbd, 0x05, 0x0c, - 0x35, 0x05, 0xeb, 0x53, 0x04, 0x74, 0xcd, 0x01, 0x7d, 0x2d, 0x03, 0xc2, 0x86, 0x00, 0xe7, 0x81, - 0xfc, 0x12, 0x10, 0xfc, 0xda, 0xf4, 0x01, 0x0a, 0xc0, 0x04, 0x4c, 0xe0, 0x00, 0xda, 0x01, 0x01, - 0x12, 0xf8, 0x00, 0xca, 0xa6, 0xff, 0x76, 0x27, 0x01, 0xe4, 0x4d, 0x01, 0x6c, 0xdb, 0x00, 0xad, - 0x40, 0x02, 0x3b, 0x86, 0x02, 0x0f, 0xb7, 0x00, 0xf5, 0x86, 0x00, 0x0f, 0xb8, 0x00, 0xc3, 0xf3, - 0xff, 0x06, 0x12, 0x01, 0xf4, 0x67, 0x01, 0xb3, 0x4d, 0x00, 0x59, 0x90, 0x00, 0xe3, 0x60, 0x00, - 0xf1, 0xf5, 0xfe, 0x73, 0x11, 0xfe, 0xc8, 0xd1, 0x0e, 0x2a, 0xf0, 0x11, 0x93, 0x67, 0x05, 0x6c, - 0x44, 0x05, 0x73, 0xe0, 0x04, 0xf2, 0x9d, 0x01, 0xb2, 0x0e, 0x03, 0xa1, 0x44, 0xff, 0x10, 0x4f, - 0xfa, 0x73, 0x6f, 0xfa, 0xfa, 0x41, 0x02, 0x3e, 0x93, 0x05, 0x43, 0x27, 0x00, 0x86, 0x74, 0xff, - 0xa8, 0x49, 0xff, 0x7e, 0x0f, 0xff, 0x64, 0x63, 0x01, 0xd2, 0xda, 0x01, 0x29, 0x97, 0x01, 0x90, - 0x58, 0x01, 0x51, 0xbe, 0x01, 0x7d, 0x25, 0x01, 0x61, 0x65, 0x00, 0x5b, 0x4c, 0x01, 0xbc, 0xe6, - 0x00, 0xfd, 0x2a, 0x00, 0x39, 0xef, 0xff, 0x57, 0xcd, 0xff, 0xda, 0x85, 0x00, 0xee, 0x07, 0x01, - 0xb0, 0xaf, 0x00, 0xde, 0xb3, 0xff, 0xf9, 0x18, 0x12, 0xef, 0x88, 0x15, 0xf6, 0x25, 0x05, 0xb7, - 0xd9, 0x04, 0xc5, 0xa4, 0x04, 0xa8, 0xb9, 0x00, 0x84, 0x83, 0x03, 0x42, 0x03, 0xff, 0x62, 0xfb, - 0xf7, 0xa3, 0xaf, 0xf8, 0xdf, 0x1b, 0x03, 0x0f, 0x54, 0x06, 0x2d, 0x1e, 0xff, 0x56, 0xb3, 0xfe, - 0xc4, 0x58, 0xfe, 0xb6, 0xc3, 0xfd, 0x67, 0xcd, 0x00, 0x6f, 0xa6, 0x01, 0xcf, 0x5b, 0x01, 0x82, - 0x9b, 0x01, 0xfc, 0x67, 0x02, 0x1f, 0x23, 0x00, 0xc5, 0x46, 0xff, 0xec, 0xef, 0x01, 0x66, 0xf1, - 0x00, 0x83, 0x57, 0x00, 0xe2, 0xc2, 0x00, 0x4d, 0xfe, 0xfe, 0x54, 0x1f, 0xff, 0xa8, 0xc9, 0x00, - 0x36, 0xff, 0x00, 0x13, 0x1e, 0x00, 0x62, 0x39, 0x16, 0x2c, 0xda, 0x18, 0x77, 0x07, 0x04, 0xa6, - 0x95, 0x04, 0x07, 0xee, 0x04, 0xdf, 0x6e, 0x00, 0x02, 0x9e, 0x03, 0x92, 0xc4, 0xfd, 0x37, 0x85, - 0xf5, 0x18, 0xee, 0xf7, 0x40, 0xbd, 0x04, 0xf5, 0x9a, 0x06, 0xe2, 0x18, 0xfe, 0x19, 0x35, 0xfe, - 0xe2, 0x0c, 0xfd, 0xf6, 0x01, 0xfd, 0x26, 0xdc, 0x00, 0x4a, 0xf0, 0x00, 0x40, 0xc5, 0x00, 0xa0, - 0x9e, 0x01, 0x8c, 0xdb, 0x01, 0xd0, 0x62, 0xff, 0x97, 0xac, 0xff, 0xb9, 0x79, 0x01, 0xce, 0xca, - 0xff, 0x4d, 0xe9, 0x00, 0x4c, 0xc3, 0x00, 0x13, 0xab, 0xfe, 0x79, 0xc8, 0xff, 0xb9, 0xe6, 0xff, - 0x37, 0x90, 0xff, 0x19, 0x69, 0x00, 0x2c, 0x77, 0x1a, 0xc2, 0x34, 0x1c, 0xc3, 0xcb, 0x02, 0xa2, - 0x7a, 0x04, 0x2c, 0x8c, 0x05, 0xde, 0x47, 0x00, 0x0d, 0xac, 0x03, 0x01, 0xf6, 0xfb, 0xb0, 0x89, - 0xf2, 0xc7, 0xc2, 0xf7, 0xe1, 0x26, 0x07, 0x20, 0xe7, 0x06, 0xae, 0x11, 0xfd, 0x93, 0xdd, 0xfd, - 0x8f, 0xa9, 0xfb, 0x52, 0x29, 0xfc, 0xd0, 0x15, 0x01, 0xac, 0xd0, 0x00, 0xcb, 0xa0, 0x00, 0x1f, - 0x28, 0x01, 0x55, 0x25, 0x01, 0x0c, 0xc4, 0xfe, 0xb2, 0x3d, 0xff, 0x86, 0x91, 0x01, 0x95, 0xca, - 0xff, 0x3a, 0xf7, 0xff, 0xb3, 0xf7, 0xff, 0xf6, 0x8c, 0xfe, 0x5c, 0x30, 0xff, 0xb4, 0x32, 0x00, - 0x86, 0xa0, 0x00, 0x9a, 0xcc, 0xff, 0x89, 0xf4, 0x1e, 0x69, 0xf8, 0x1f, 0x6c, 0xc7, 0x01, 0xad, - 0x44, 0x04, 0x80, 0x6d, 0x05, 0x95, 0x66, 0xff, 0x65, 0xd8, 0x03, 0xe0, 0x36, 0xfa, 0x88, 0xe4, - 0xef, 0x5d, 0x3d, 0xf8, 0x3b, 0xef, 0x08, 0x10, 0xa4, 0x06, 0xa8, 0x98, 0xfc, 0x27, 0xcf, 0xfd, - 0x4c, 0x46, 0xfa, 0x7d, 0x5a, 0xfb, 0x05, 0x19, 0x01, 0xf1, 0x93, 0x00, 0x64, 0xdc, 0x00, 0x78, - 0x26, 0x01, 0xdf, 0x55, 0x00, 0x23, 0xd3, 0xfd, 0xf1, 0xfd, 0xfe, 0x8d, 0x77, 0x01, 0x27, 0x7c, - 0xff, 0x24, 0xdc, 0xff, 0x55, 0xf5, 0xfe, 0xc3, 0x59, 0xfd, 0x3c, 0xfc, 0xfe, 0xf8, 0x41, 0x00, - 0xf3, 0x7c, 0x00, 0x00, 0x93, 0xff, 0x8b, 0x87, 0x22, 0x54, 0x1d, 0x24, 0x12, 0xc6, 0x01, 0xe8, - 0xdc, 0x03, 0x7c, 0x54, 0x05, 0xe3, 0xed, 0xfd, 0x7f, 0x8e, 0x03, 0x55, 0x18, 0xf9, 0x76, 0xb4, - 0xed, 0x50, 0xe6, 0xf8, 0xab, 0xc7, 0x09, 0x62, 0xca, 0x05, 0xd9, 0x83, 0xfc, 0xe8, 0xef, 0xfd, - 0x44, 0xa6, 0xf9, 0x59, 0x9c, 0xfa, 0xf2, 0x58, 0x00, 0x92, 0x5c, 0x00, 0x70, 0x4f, 0x01, 0x5a, - 0x0a, 0x01, 0xc0, 0xcc, 0xff, 0x96, 0x48, 0xfd, 0xa1, 0x82, 0xfe, 0x8f, 0x88, 0x01, 0xa4, 0xd5, - 0xfe, 0x61, 0xf3, 0xfe, 0x71, 0x1a, 0xff, 0x45, 0x27, 0xfd, 0xec, 0x63, 0xfe, 0xbb, 0x88, 0xff, - 0xd9, 0xcd, 0xff, 0xe1, 0xd5, 0xff, 0x3a, 0x6c, 0x24, 0x10, 0xab, 0x28, 0x44, 0xca, 0x03, 0xb2, - 0x35, 0x03, 0xa6, 0xb9, 0x05, 0x34, 0xa0, 0xfc, 0x6f, 0x02, 0x02, 0xfd, 0xd3, 0xf8, 0x23, 0xd1, - 0xec, 0x38, 0x53, 0xf9, 0x4d, 0xbc, 0x09, 0x2c, 0xb6, 0x04, 0x91, 0xae, 0xfc, 0x77, 0xf9, 0xfd, - 0xc2, 0xbd, 0xf9, 0x30, 0xa4, 0xfa, 0x65, 0x39, 0xff, 0x61, 0x7d, 0xff, 0xa2, 0xe0, 0x01, 0x2c, - 0x79, 0x01, 0xb5, 0x5c, 0xff, 0xb6, 0x52, 0xfd, 0xf9, 0xb2, 0xfd, 0x7f, 0xac, 0x00, 0x17, 0xc1, - 0xff, 0xcd, 0xb1, 0xfe, 0xd9, 0x38, 0xfe, 0x81, 0x2c, 0xfd, 0xbf, 0xb8, 0xfd, 0xdc, 0x86, 0xff, - 0xde, 0x20, 0x00, 0xfc, 0xd9, 0xfe, 0x53, 0xd8, 0x23, 0xed, 0x86, 0x2c, 0x3d, 0xa7, 0x08, 0x4c, - 0xce, 0x02, 0xbe, 0xa9, 0x05, 0xea, 0x4d, 0xfc, 0x43, 0x8f, 0xff, 0xea, 0x3c, 0xf8, 0xf2, 0x14, - 0xed, 0x48, 0x2f, 0xf9, 0x14, 0x7e, 0x08, 0xa6, 0xde, 0x03, 0x3a, 0x0b, 0xfd, 0x99, 0x70, 0xfd, - 0x1f, 0xf9, 0xf9, 0x02, 0xfc, 0xfa, 0xaa, 0x10, 0xfe, 0x5d, 0xb7, 0xfe, 0x81, 0xd5, 0x01, 0x7f, - 0xc5, 0x01, 0x44, 0x55, 0xff, 0x67, 0xa2, 0xfc, 0xc3, 0x79, 0xfd, 0xae, 0xb3, 0x00, 0x4e, 0xc2, - 0xff, 0x0a, 0xa1, 0xfe, 0xf0, 0x76, 0xfd, 0x96, 0xf4, 0xfc, 0xa5, 0xc6, 0xfd, 0x6f, 0xc1, 0xfe, - 0x7f, 0xc4, 0xff, 0xc8, 0x8b, 0xfe, 0xbd, 0x95, 0x22, 0x95, 0x4d, 0x2e, 0x28, 0x86, 0x0e, 0x15, - 0xc7, 0x04, 0x3b, 0x26, 0x05, 0x4f, 0x61, 0xfc, 0xee, 0xfe, 0xfd, 0x05, 0x66, 0xf7, 0x6e, 0x65, - 0xed, 0x5b, 0xbe, 0xf8, 0xa4, 0xb3, 0x06, 0x9a, 0x10, 0x03, 0x45, 0x05, 0xfe, 0x92, 0xf8, 0xfc, - 0xf3, 0xb0, 0xf9, 0x30, 0xc8, 0xfb, 0x2e, 0x22, 0xfd, 0x1a, 0xa6, 0xfd, 0xf0, 0x28, 0x02, 0xb0, - 0x11, 0x01, 0xad, 0x51, 0xff, 0x94, 0x77, 0xfe, 0xef, 0xd0, 0xfc, 0xb2, 0x65, 0xff, 0x91, 0xec, - 0xff, 0x73, 0x74, 0xfe, 0x01, 0xf3, 0xfd, 0xe3, 0x1f, 0xfd, 0x44, 0xed, 0xfc, 0xc4, 0xc8, 0xfd, - 0x7a, 0x0b, 0xff, 0x4a, 0xe4, 0xfe, 0x9e, 0x06, 0x23, 0xe1, 0x0e, 0x2e, 0xf2, 0x8f, 0x11, 0x43, - 0x30, 0x09, 0x1f, 0x52, 0x05, 0xba, 0xc6, 0xfb, 0xd2, 0xfa, 0xfd, 0x90, 0xf0, 0xf6, 0x25, 0xdf, - 0xed, 0x73, 0xa6, 0xf8, 0x63, 0xde, 0x03, 0x89, 0x4e, 0x01, 0xff, 0x9f, 0xff, 0x97, 0x06, 0xfd, - 0xe6, 0xf9, 0xf8, 0xcb, 0x8e, 0xfc, 0x88, 0xc1, 0xfc, 0x9c, 0x2a, 0xfc, 0x40, 0xc9, 0x01, 0x9e, - 0x2d, 0x02, 0xf0, 0x2c, 0xff, 0x72, 0x29, 0xfe, 0x53, 0xba, 0xfd, 0x9f, 0x4a, 0xff, 0x34, 0x06, - 0x00, 0xbc, 0x37, 0xfe, 0x5a, 0x24, 0xfd, 0x07, 0x20, 0xfd, 0x2a, 0x47, 0xfc, 0x28, 0x91, 0xfd, - 0xc0, 0xdc, 0xff, 0x94, 0x3e, 0xff, 0x97, 0xb9, 0x24, 0x99, 0x42, 0x2d, 0xb4, 0x69, 0x11, 0xab, - 0xf7, 0x0d, 0x39, 0x62, 0x07, 0xd0, 0x5a, 0xfa, 0xad, 0x9c, 0xfd, 0x76, 0xc6, 0xf6, 0x26, 0xbb, - 0xee, 0xf7, 0x92, 0xf9, 0x9e, 0x40, 0x00, 0x80, 0x21, 0xfd, 0xc9, 0xd5, 0x00, 0x9a, 0xe8, 0xfd, - 0x24, 0xd0, 0xf8, 0x9e, 0x09, 0xfe, 0x75, 0x05, 0xfb, 0x91, 0xbf, 0xfa, 0x60, 0x35, 0x03, 0x12, - 0xa9, 0x01, 0x2a, 0xbe, 0xfe, 0x59, 0x11, 0xff, 0x3f, 0xc1, 0xfd, 0x0d, 0xc9, 0xfe, 0x14, 0x27, - 0x00, 0x96, 0x3e, 0xfe, 0xeb, 0x4a, 0xfc, 0x39, 0x2f, 0xfd, 0xdc, 0xbb, 0xfc, 0x9d, 0x0c, 0xfd, - 0x1f, 0xf6, 0xfe, 0xc8, 0x9a, 0xfe, 0xc6, 0xc4, 0x27, 0x12, 0x86, 0x2c, 0x5e, 0x2a, 0x0f, 0xce, - 0xaf, 0x11, 0x7a, 0x16, 0x0a, 0x5b, 0xa7, 0xf9, 0xbd, 0x69, 0xfd, 0x81, 0xf2, 0xf6, 0xe6, 0x26, - 0xf0, 0xba, 0xd7, 0xfb, 0x91, 0x63, 0xfd, 0xdb, 0x93, 0xf6, 0x4d, 0xd3, 0x00, 0xb9, 0xfd, 0xff, - 0xf6, 0x70, 0xf7, 0xe6, 0x90, 0xff, 0xcb, 0x6f, 0xfc, 0x39, 0xc5, 0xf8, 0xdc, 0xe7, 0x02, 0x9f, - 0x6a, 0x02, 0xb7, 0x89, 0xfe, 0x24, 0x82, 0xff, 0xc4, 0xe1, 0xfd, 0xcd, 0xeb, 0xfd, 0xc5, 0x42, - 0x00, 0x68, 0x8a, 0xfe, 0xd6, 0xf1, 0xfb, 0x2e, 0xb6, 0xfd, 0x06, 0x03, 0xfd, 0x61, 0x1c, 0xfc, - 0x3a, 0x9a, 0xfe, 0x2f, 0xd3, 0xfe, 0xe8, 0xc8, 0x2c, 0x8e, 0xc8, 0x2b, 0xa3, 0xc4, 0x0a, 0x8f, - 0x04, 0x15, 0x76, 0xa9, 0x0b, 0x41, 0x88, 0xf8, 0x0e, 0x5d, 0xfe, 0xae, 0xc7, 0xf6, 0x4c, 0xfe, - 0xf1, 0xe9, 0x8f, 0xff, 0xea, 0x9e, 0xfa, 0x94, 0x1b, 0xef, 0x6e, 0x21, 0x00, 0x9a, 0x5f, 0x01, - 0xf9, 0xfa, 0xf5, 0x1a, 0x99, 0x01, 0xdb, 0x60, 0xfd, 0x81, 0xaf, 0xf7, 0x29, 0xf4, 0x03, 0x32, - 0x30, 0x02, 0x42, 0x1e, 0xfd, 0x8f, 0xb5, 0xff, 0x20, 0x08, 0xff, 0x90, 0xef, 0xfd, 0x9a, 0xf6, - 0xff, 0xb3, 0x88, 0xfe, 0x9b, 0x32, 0xfb, 0x49, 0xa9, 0xfd, 0xf0, 0xd1, 0xfd, 0x9f, 0x62, 0xfc, - 0x67, 0xdd, 0xfd, 0x73, 0xcd, 0xfd, 0x04, 0x0d, 0x32, 0xfe, 0x89, 0x2b, 0x02, 0x07, 0x05, 0x38, - 0x49, 0x18, 0x46, 0x7b, 0x0d, 0x7b, 0xec, 0xf5, 0x19, 0x3b, 0x00, 0xb5, 0xda, 0xf7, 0x30, 0xac, - 0xf3, 0x9e, 0x43, 0x04, 0xf5, 0x02, 0xfa, 0x67, 0x91, 0xe6, 0xce, 0xaa, 0xfc, 0x8d, 0x10, 0x05, - 0xc9, 0xf1, 0xf4, 0xd8, 0x2d, 0x01, 0x8f, 0x38, 0x00, 0x2d, 0x2b, 0xf7, 0xb6, 0x66, 0x03, 0xeb, - 0x5c, 0x02, 0xef, 0x42, 0xfc, 0x82, 0xea, 0xff, 0x58, 0x72, 0x00, 0x4b, 0x3a, 0xfe, 0xb4, 0x3a, - 0xff, 0x42, 0x8a, 0xfe, 0xff, 0x37, 0xfb, 0x9b, 0xa4, 0xfd, 0xaa, 0xe6, 0xfd, 0x1a, 0xd0, 0xfb, - 0xf3, 0x46, 0xfd, 0x98, 0xee, 0xfd, 0x72, 0xe1, 0x37, 0x04, 0xbd, 0x2c, 0xf3, 0x7b, 0xfd, 0xf1, - 0x42, 0x1a, 0x06, 0x9e, 0x10, 0x7d, 0x23, 0xf1, 0x77, 0x08, 0x01, 0xf3, 0x7b, 0xf9, 0x87, 0x91, - 0xf4, 0xba, 0xe0, 0x0a, 0xb4, 0x1a, 0xfb, 0x38, 0x4e, 0xdd, 0x9a, 0x36, 0xf7, 0x53, 0x40, 0x08, - 0xce, 0x72, 0xf6, 0x39, 0x54, 0x00, 0x19, 0x08, 0x01, 0x62, 0x22, 0xf7, 0x8b, 0xe9, 0x02, 0x84, - 0xb4, 0x02, 0x9c, 0xeb, 0xfb, 0x67, 0x0f, 0xff, 0xe0, 0x11, 0x01, 0x39, 0x3a, 0xff, 0xeb, 0x2d, - 0xff, 0xe2, 0xaf, 0xfe, 0x02, 0xcc, 0xfa, 0xed, 0x48, 0xfc, 0xef, 0xaa, 0xfd, 0xde, 0x90, 0xfc, - 0x40, 0x3b, 0xfd, 0xfd, 0x42, 0xfd, 0x16, 0xbd, 0x3d, 0xfd, 0xcc, 0x30, 0x88, 0x99, 0xf5, 0xae, - 0xc8, 0x17, 0xab, 0xd1, 0x14, 0x27, 0x4b, 0xee, 0xbb, 0x5d, 0x01, 0xef, 0x6f, 0xfb, 0xad, 0x8c, - 0xf4, 0xce, 0x1d, 0x11, 0x20, 0xfa, 0xfe, 0x4b, 0x23, 0xd7, 0xa2, 0x05, 0xf0, 0x0a, 0x88, 0x09, - 0xec, 0xa6, 0xf9, 0x6e, 0x9b, 0xff, 0x86, 0x0f, 0x02, 0xfa, 0xdc, 0xf7, 0x91, 0xc3, 0x01, 0xf3, - 0xb5, 0x02, 0xe6, 0xe4, 0xfb, 0x05, 0x13, 0xfe, 0x0c, 0x0f, 0x01, 0x88, 0x59, 0x01, 0x38, 0xcb, - 0xff, 0xf1, 0x75, 0xfd, 0x09, 0x71, 0xfa, 0x1e, 0x04, 0xfc, 0xf2, 0xff, 0xfd, 0x59, 0x45, 0xfd, - 0x7e, 0xee, 0xfb, 0xc7, 0xa2, 0xfb, 0x23, 0x25, 0x46, 0x03, 0x2b, 0x36, 0x94, 0xe4, 0xec, 0xef, - 0x9b, 0x10, 0xa7, 0x11, 0x16, 0x92, 0x05, 0xee, 0x1c, 0x1a, 0x03, 0xe3, 0x93, 0xfd, 0xab, 0xf3, - 0xf1, 0xf4, 0x1d, 0x14, 0xdd, 0x82, 0x04, 0x41, 0xbd, 0xd4, 0x16, 0x7a, 0xe9, 0x18, 0xab, 0x07, - 0x32, 0xec, 0xfc, 0x28, 0xa6, 0x00, 0x63, 0xb3, 0x02, 0xf2, 0x79, 0xf8, 0xaa, 0xc0, 0xff, 0x42, - 0x4d, 0x02, 0x97, 0xd1, 0xfb, 0xf5, 0x19, 0xfd, 0x97, 0x46, 0x01, 0x1f, 0x4f, 0x02, 0xe1, 0xc8, - 0xff, 0x1f, 0x60, 0xfc, 0x23, 0x8d, 0xfa, 0x3b, 0xef, 0xfb, 0xdc, 0xd8, 0xfc, 0xb4, 0x14, 0xfd, - 0xe6, 0x04, 0xfc, 0xd5, 0xa0, 0xfb, 0xd4, 0x2a, 0x4e, 0x52, 0x2d, 0x3a, 0xe1, 0xdf, 0xe5, 0x70, - 0x1f, 0x0b, 0x99, 0xd9, 0x15, 0x17, 0xcb, 0xed, 0x32, 0x07, 0x05, 0xdc, 0x17, 0xff, 0xbd, 0x4f, - 0xee, 0xf0, 0x00, 0x18, 0xb3, 0x3d, 0x0c, 0x52, 0xc6, 0xd1, 0xc9, 0x3c, 0xe4, 0x8c, 0xf5, 0x05, - 0xe2, 0xe0, 0xfe, 0x16, 0x2b, 0x03, 0xfc, 0x7e, 0x02, 0x19, 0xc7, 0xf8, 0xd4, 0x3d, 0xfe, 0xf1, - 0x17, 0x01, 0x9d, 0x8e, 0xfc, 0x10, 0xac, 0xfc, 0x45, 0xf2, 0x00, 0xa8, 0x0b, 0x02, 0x9d, 0x0b, - 0x00, 0x34, 0x69, 0xfc, 0x95, 0xc1, 0xf9, 0x63, 0x2a, 0xfb, 0x6b, 0xed, 0xfb, 0x56, 0xee, 0xfd, - 0x96, 0x2e, 0xfd, 0xc7, 0x7e, 0xfb, 0x1f, 0x98, 0x56, 0x86, 0x43, 0x40, 0x0a, 0x73, 0xde, 0x2c, - 0x14, 0x02, 0x0f, 0x41, 0x11, 0x2c, 0x47, 0xef, 0x64, 0xfc, 0x0b, 0xd8, 0xe2, 0xfe, 0x3e, 0x38, - 0xe8, 0xf9, 0xdb, 0x19, 0xd3, 0x92, 0x11, 0xb1, 0xe4, 0xd1, 0x32, 0xb8, 0xe2, 0x25, 0xe0, 0x03, - 0x37, 0xb3, 0xfd, 0xf5, 0x52, 0x04, 0xcd, 0x7e, 0x03, 0x61, 0xcb, 0xf8, 0x74, 0x8a, 0xfc, 0x84, - 0x24, 0x00, 0x65, 0xc1, 0xfc, 0xad, 0x9d, 0xfb, 0x49, 0x2e, 0x00, 0x37, 0x1a, 0x02, 0xbc, 0xd5, - 0xff, 0xd8, 0x6b, 0xfb, 0x30, 0xa2, 0xf8, 0x6e, 0x73, 0xfa, 0x4b, 0x9f, 0xfb, 0x1a, 0xe9, 0xfe, - 0x1f, 0x28, 0xfe, 0x91, 0x2a, 0xfb, 0x89, 0x0c, 0x5f, 0x87, 0x0e, 0x45, 0x4d, 0xc0, 0xd8, 0xe0, - 0x4b, 0xfc, 0x6c, 0xa3, 0x0b, 0xc5, 0xd0, 0xf1, 0x2a, 0x4b, 0x13, 0x2e, 0xfb, 0xfb, 0x3e, 0x66, - 0xe5, 0x40, 0x64, 0x1c, 0x6b, 0x81, 0x15, 0xe1, 0x04, 0xd6, 0x92, 0x56, 0xe2, 0xfd, 0xf6, 0x00, - 0xa1, 0x80, 0xfb, 0x72, 0x4f, 0x05, 0x29, 0xca, 0x06, 0xb6, 0x40, 0xf9, 0x12, 0x8d, 0xfa, 0x1f, - 0x21, 0xff, 0x54, 0x84, 0xfd, 0xec, 0x54, 0xfb, 0x72, 0x96, 0xff, 0x25, 0x30, 0x02, 0x3b, 0x06, - 0xff, 0x69, 0x81, 0xfb, 0xcf, 0x90, 0xf8, 0x85, 0x95, 0xf9, 0x96, 0xbe, 0xfb, 0xe9, 0xcd, 0xff, - 0x34, 0x12, 0xff, 0xff, 0x4c, 0xfb, 0xb4, 0x1a, 0x66, 0xb5, 0xdd, 0x48, 0xf9, 0x4b, 0xd4, 0x26, - 0xb8, 0xf7, 0xb0, 0x1e, 0x06, 0x36, 0x8b, 0xf3, 0x82, 0x4d, 0x17, 0x58, 0xf8, 0xf8, 0x2e, 0x90, - 0xe4, 0x88, 0xb9, 0x1c, 0xd9, 0xb8, 0x19, 0xfc, 0xda, 0xda, 0xfe, 0xaa, 0xe0, 0x6d, 0xc2, 0xfe, - 0x88, 0x4e, 0xf8, 0x6a, 0x21, 0x06, 0xbe, 0x77, 0x0a, 0x7a, 0xf8, 0xf7, 0x96, 0xa5, 0xf8, 0xea, - 0xea, 0xfe, 0xea, 0x24, 0xfe, 0x90, 0x83, 0xfa, 0x73, 0x6f, 0xfe, 0x52, 0xc2, 0x01, 0x16, 0x45, - 0xfe, 0xf9, 0x86, 0xfc, 0x60, 0x3c, 0xf8, 0xe4, 0xe9, 0xf7, 0x5a, 0xd8, 0xfb, 0xaa, 0x75, 0x00, - 0x76, 0xcb, 0xff, 0xf0, 0xd3, 0xfb, 0xd2, 0x00, 0x6c, 0x62, 0xf3, 0x4b, 0x18, 0x80, 0xd1, 0xc2, - 0x9d, 0xf4, 0x2c, 0x75, 0x01, 0xef, 0x47, 0xf4, 0xdf, 0xba, 0x18, 0x32, 0xa5, 0xf7, 0x8b, 0x07, - 0xe5, 0x8b, 0x7f, 0x1a, 0x05, 0x37, 0x1e, 0xa7, 0xd7, 0xe0, 0x0c, 0x02, 0xdf, 0x73, 0x5e, 0xfd, - 0xfa, 0xd3, 0xf4, 0x65, 0x0d, 0x06, 0x6c, 0xe5, 0x0d, 0x97, 0xdf, 0xf6, 0xe6, 0x69, 0xf7, 0x01, - 0x7a, 0xff, 0x0f, 0x66, 0xfe, 0x60, 0xcb, 0xf8, 0x5a, 0xb6, 0xfd, 0x16, 0x05, 0x02, 0x1a, 0xbc, - 0xfd, 0x5d, 0x7e, 0xfd, 0xcf, 0xba, 0xf7, 0xa2, 0x75, 0xf6, 0x7f, 0x15, 0xfc, 0x42, 0x00, 0x01, - 0xab, 0x8c, 0x00, 0x46, 0x74, 0xfc, 0xe6, 0xab, 0x6e, 0xac, 0x41, 0x50, 0xa7, 0xdc, 0xd0, 0xae, - 0xce, 0xf1, 0xe9, 0x53, 0xfe, 0xc1, 0x21, 0xf3, 0x5d, 0x4b, 0x18, 0xa0, 0xc9, 0xf7, 0x08, 0x07, - 0xe5, 0x66, 0xe5, 0x15, 0xd6, 0xf1, 0x22, 0xe9, 0xce, 0xe8, 0x34, 0xed, 0xdc, 0x76, 0xac, 0xfb, - 0xa5, 0x8b, 0xf1, 0x0c, 0x42, 0x04, 0xf7, 0x10, 0x11, 0x2b, 0xf1, 0xf6, 0xd1, 0x69, 0xf6, 0x90, - 0xd3, 0xff, 0x0d, 0x30, 0xfe, 0x8f, 0xdf, 0xf6, 0xcd, 0x60, 0xfd, 0x1c, 0xa5, 0x02, 0xf7, 0x94, - 0xfc, 0x78, 0x01, 0xfe, 0xd2, 0x0e, 0xf8, 0xc1, 0x55, 0xf5, 0xde, 0x02, 0xfc, 0x03, 0x5b, 0x01, - 0x9e, 0xfb, 0x00, 0x2d, 0x7e, 0xfc, 0x9e, 0x07, 0x72, 0xdf, 0x4d, 0x51, 0x97, 0xcc, 0xd1, 0x55, - 0xdc, 0xf1, 0xce, 0x98, 0xfa, 0x99, 0x4a, 0xf2, 0x47, 0xf6, 0x16, 0x02, 0x3e, 0xf7, 0xc1, 0x8f, - 0xe4, 0x2e, 0x26, 0x12, 0x79, 0x32, 0x27, 0x12, 0x89, 0xef, 0x95, 0x36, 0xdd, 0x96, 0x43, 0xf9, - 0xb7, 0x33, 0xee, 0x48, 0x66, 0x03, 0x22, 0x72, 0x12, 0x44, 0x32, 0xf8, 0x9e, 0x1b, 0xf6, 0xd7, - 0x97, 0xff, 0x09, 0x34, 0xfe, 0xbd, 0x5e, 0xf5, 0x50, 0x9c, 0xfd, 0x81, 0x90, 0x02, 0x62, 0x7d, - 0xfb, 0x11, 0xac, 0xfe, 0xbf, 0xb2, 0xf8, 0xca, 0x2b, 0xf5, 0x76, 0xe2, 0xfb, 0x35, 0xaa, 0x01, - 0x02, 0x77, 0x00, 0x94, 0x1a, 0xfc, 0x8e, 0x91, 0x72, 0xe0, 0xce, 0x52, 0x2e, 0xda, 0xd4, 0x9c, - 0x35, 0xf2, 0x06, 0x2e, 0xf7, 0x4a, 0xf8, 0xef, 0x39, 0x24, 0x16, 0x99, 0xf1, 0xf6, 0x5e, 0xc2, - 0xe1, 0x58, 0xf6, 0x0e, 0xb3, 0x7c, 0x2a, 0x12, 0x53, 0xf5, 0x15, 0x21, 0xdf, 0xa9, 0xc8, 0xf6, - 0x3e, 0x47, 0xeb, 0xa3, 0xb3, 0x01, 0x58, 0x4e, 0x12, 0xf3, 0xcf, 0xfa, 0x04, 0xe1, 0xf5, 0x22, - 0xfa, 0xfd, 0x00, 0x0c, 0xff, 0x75, 0xd7, 0xf4, 0xb2, 0xa5, 0xfc, 0xc8, 0xdf, 0x01, 0x46, 0x0b, - 0xfb, 0x25, 0x5c, 0xff, 0x12, 0x7a, 0xf9, 0x90, 0xa9, 0xf5, 0x2b, 0x5c, 0xfb, 0xd3, 0xdf, 0x00, - 0xb2, 0xe7, 0xff, 0x3f, 0x8d, 0xfb, 0x0b, 0x9b, 0x70, 0xd8, 0x27, 0x55, 0xe0, 0x31, 0xda, 0x18, - 0xb5, 0xf3, 0xf5, 0xd0, 0xf3, 0x56, 0x01, 0xec, 0xbf, 0x70, 0x17, 0x58, 0x2a, 0xf7, 0x34, 0x08, - 0xdd, 0xae, 0x72, 0x0c, 0x9d, 0x0a, 0x2c, 0x36, 0xbe, 0xfa, 0x81, 0x87, 0xe3, 0x72, 0x8e, 0xf5, - 0xb7, 0x9f, 0xe8, 0xe3, 0xa9, 0xfe, 0xee, 0x49, 0x11, 0x33, 0x46, 0xfe, 0x26, 0x93, 0xf6, 0xf4, - 0xb1, 0xfb, 0x40, 0xcf, 0xff, 0xe8, 0x5a, 0xf5, 0x06, 0x2d, 0xfb, 0x70, 0x96, 0x01, 0xf5, 0x2e, - 0xfb, 0xb4, 0x01, 0x00, 0xbd, 0x37, 0xfb, 0x0b, 0x7d, 0xf5, 0xd0, 0xd6, 0xf9, 0xc4, 0x8a, 0x00, - 0xe8, 0x2c, 0xff, 0xc1, 0x0b, 0xfb, 0x5f, 0x66, 0x6c, 0x8d, 0x8b, 0x57, 0x14, 0xb9, 0xe1, 0x13, - 0x36, 0xf6, 0xb0, 0xca, 0xf0, 0xb8, 0x83, 0xe7, 0xba, 0x35, 0x19, 0x49, 0xf0, 0xf7, 0x2d, 0x96, - 0xd7, 0x90, 0x9f, 0x09, 0x5d, 0xc6, 0x2c, 0xea, 0x37, 0xff, 0x3e, 0xce, 0xe9, 0xe2, 0x22, 0xf7, - 0xec, 0xbc, 0xe4, 0x1f, 0x87, 0xfa, 0x93, 0xed, 0x10, 0x1a, 0x8a, 0x00, 0x06, 0x2a, 0xf8, 0xa3, - 0x3c, 0xfa, 0x29, 0x12, 0xff, 0x10, 0x39, 0xf6, 0x88, 0xbd, 0xfa, 0xf5, 0xb9, 0x01, 0x9a, 0x0e, - 0xfc, 0xb7, 0xd8, 0x00, 0x74, 0x61, 0xfb, 0x90, 0x66, 0xf5, 0x9f, 0x26, 0xf9, 0x67, 0x87, 0xfe, - 0xf9, 0x8a, 0xff, 0xda, 0x63, 0xfc, 0x74, 0xc4, 0x67, 0xc0, 0xc6, 0x57, 0x49, 0x47, 0xea, 0x8f, - 0xd5, 0xf9, 0x37, 0x97, 0xed, 0x6d, 0xca, 0xe4, 0xb9, 0x9e, 0x19, 0xc5, 0xf7, 0xf8, 0xc4, 0xb5, - 0xd3, 0x60, 0x61, 0x04, 0x21, 0xec, 0x2d, 0x0f, 0x37, 0x03, 0x85, 0x21, 0xef, 0x33, 0xe4, 0xfb, - 0x0f, 0x62, 0xe0, 0x66, 0x60, 0xf5, 0x96, 0xae, 0x11, 0xe8, 0x0f, 0x01, 0xca, 0x44, 0xf9, 0x3a, - 0x09, 0xfa, 0x66, 0x27, 0xfd, 0xe7, 0x7c, 0xf6, 0xcb, 0x8f, 0xfc, 0xa1, 0xd6, 0x02, 0x16, 0x4d, - 0xfb, 0x2e, 0x59, 0x01, 0xae, 0xd5, 0xfb, 0x30, 0x3e, 0xf4, 0x5e, 0xfd, 0xf8, 0x2f, 0x02, 0xfe, - 0x1f, 0xeb, 0xff, 0x66, 0x8c, 0xfd, 0x40, 0xd2, 0x60, 0x93, 0x92, 0x58, 0x7d, 0x2f, 0xf4, 0x4e, - 0xbb, 0xfc, 0x62, 0x1d, 0xec, 0xd7, 0x57, 0xe2, 0xde, 0xcc, 0x15, 0x66, 0x26, 0xfc, 0x1a, 0x10, - 0xd4, 0x4b, 0x20, 0xfa, 0x69, 0x86, 0x2e, 0xaf, 0xc6, 0x09, 0x82, 0x68, 0xf1, 0xb5, 0x92, 0x03, - 0x00, 0x8b, 0xde, 0xa0, 0x48, 0xed, 0xae, 0x68, 0x12, 0xce, 0xb1, 0x00, 0xbf, 0x44, 0xf9, 0x43, - 0xb5, 0xfb, 0x43, 0xa0, 0xfb, 0x40, 0x24, 0xf6, 0x8b, 0xc9, 0xfe, 0xf6, 0x14, 0x03, 0x72, 0x1b, - 0xfa, 0xbc, 0xd0, 0x02, 0x37, 0x27, 0xfb, 0x92, 0xd5, 0xf2, 0x77, 0x35, 0xfb, 0xdb, 0xa1, 0xfd, - 0x34, 0x54, 0xff, 0x9a, 0x2e, 0xff, 0x8d, 0xe9, 0x5b, 0xa6, 0xd1, 0x55, 0xb9, 0xce, 0xfc, 0xfb, - 0xa8, 0x00, 0xb6, 0xc2, 0xe9, 0xab, 0x34, 0xe2, 0xf9, 0x78, 0x0f, 0x93, 0x43, 0xfd, 0x17, 0x33, - 0xd9, 0x6f, 0xf2, 0xef, 0x1b, 0x1c, 0x2c, 0xa5, 0xd6, 0x10, 0x38, 0x73, 0xf2, 0x53, 0xa5, 0x0a, - 0x0e, 0xb6, 0xe0, 0x52, 0x15, 0xe4, 0xf1, 0x74, 0x10, 0x24, 0xfa, 0x00, 0x33, 0xbc, 0xf7, 0x0f, - 0x48, 0xfe, 0x4f, 0x8f, 0xfc, 0x1f, 0x4d, 0xf4, 0x0f, 0x69, 0xfe, 0x72, 0x84, 0x04, 0x8a, 0x62, - 0xf9, 0xe2, 0xd9, 0x01, 0x93, 0x95, 0xfc, 0xce, 0x55, 0xf2, 0x0c, 0xf4, 0xfb, 0x69, 0x38, 0xff, - 0x6e, 0xc9, 0xfe, 0xb6, 0x3b, 0xff, 0x8f, 0x68, 0x58, 0x47, 0xfb, 0x51, 0x80, 0xf6, 0x01, 0x3c, - 0x46, 0x05, 0xd5, 0x18, 0xeb, 0x3d, 0x45, 0xe2, 0xce, 0x66, 0x09, 0xb1, 0x90, 0xfc, 0xd7, 0x2e, - 0xde, 0xde, 0x99, 0xea, 0x95, 0x3e, 0x27, 0x16, 0x2e, 0x18, 0x23, 0x9a, 0xf4, 0x1a, 0x7f, 0x0d, - 0xcd, 0x79, 0xe7, 0xa4, 0x2f, 0xdc, 0x4c, 0xaf, 0x0b, 0x6d, 0x47, 0x03, 0x65, 0xb5, 0xf5, 0x45, - 0xcc, 0xff, 0x49, 0xb4, 0xfd, 0x25, 0x4f, 0xf4, 0xf1, 0x28, 0xfe, 0x31, 0xb9, 0x03, 0x2b, 0x1e, - 0xf9, 0x26, 0xdb, 0x01, 0x3c, 0xe5, 0xfe, 0x3f, 0x74, 0xf2, 0x67, 0xe1, 0xfc, 0x6f, 0xbc, 0x00, - 0x8e, 0x48, 0xfd, 0x43, 0xb6, 0xff, 0x86, 0xee, 0x55, 0x44, 0x12, 0x50, 0xff, 0x57, 0x01, 0x2c, - 0x05, 0x08, 0xd8, 0x84, 0xf1, 0x51, 0xca, 0xdf, 0xb3, 0x25, 0x03, 0x35, 0x06, 0xfe, 0xeb, 0x9f, - 0xe0, 0x42, 0x58, 0xe6, 0x36, 0x87, 0x23, 0xd5, 0x3e, 0x1f, 0x23, 0x36, 0xf6, 0x55, 0x3b, 0x0d, - 0x2c, 0x63, 0xef, 0x92, 0x84, 0xd6, 0xac, 0xe8, 0x05, 0xd6, 0x36, 0x07, 0xb0, 0x28, 0xf3, 0x5f, - 0x85, 0xfe, 0x8b, 0x6f, 0xff, 0xb9, 0x3e, 0xf4, 0x90, 0xc1, 0xfd, 0x62, 0xac, 0x03, 0xb9, 0x70, - 0xf8, 0x10, 0x20, 0x01, 0xc2, 0xec, 0x01, 0x59, 0x3f, 0xf4, 0x46, 0xe9, 0xfb, 0x44, 0xc9, 0x00, - 0xdd, 0xdb, 0xfd, 0xa9, 0xd0, 0xff, 0xd2, 0xab, 0x56, 0xab, 0x5e, 0x4b, 0x5d, 0xfe, 0xfc, 0xfb, - 0xb0, 0x0d, 0x86, 0x46, 0xf5, 0x04, 0x96, 0xdb, 0x61, 0x47, 0x01, 0x1a, 0xeb, 0xff, 0x1b, 0xad, - 0xe2, 0x27, 0xc0, 0xe2, 0x54, 0x47, 0x1f, 0x63, 0xdf, 0x23, 0x41, 0x68, 0xf8, 0x7a, 0xaf, 0x0d, - 0x04, 0xc7, 0xf4, 0x48, 0xae, 0xd4, 0x18, 0xf0, 0xff, 0xc1, 0x32, 0x08, 0xe4, 0x56, 0xf5, 0xfe, - 0x6f, 0xfc, 0x80, 0xd6, 0xfd, 0x11, 0xe7, 0xf3, 0x47, 0x40, 0xfd, 0xa1, 0xd0, 0x05, 0xc1, 0xdc, - 0xf8, 0xe0, 0x7b, 0xff, 0x8b, 0xdb, 0x03, 0xd6, 0xb2, 0xf5, 0xe4, 0x73, 0xfb, 0x51, 0x1b, 0x01, - 0xcf, 0x5c, 0xfd, 0x24, 0x5e, 0xff, 0x95, 0x2a, 0x53, 0x2a, 0x65, 0x46, 0x73, 0x08, 0xfd, 0x8f, - 0x90, 0x14, 0x99, 0x8c, 0xf5, 0x6f, 0xcb, 0xd6, 0xa7, 0xca, 0x04, 0x8a, 0x34, 0x01, 0x39, 0x39, - 0xe4, 0x18, 0xbf, 0xe1, 0x7b, 0x9a, 0x14, 0xd2, 0xc0, 0x26, 0xf7, 0xd6, 0xfd, 0x17, 0x81, 0x0c, - 0x7c, 0x3d, 0xfd, 0x59, 0xaa, 0xd4, 0xac, 0x6b, 0xf7, 0x65, 0x96, 0x09, 0x74, 0x8b, 0xf8, 0x9a, - 0x35, 0xfb, 0x52, 0xc4, 0xfb, 0x13, 0x2b, 0xf2, 0x95, 0xb7, 0xfb, 0x80, 0x01, 0x08, 0xab, 0x17, - 0xfb, 0xbf, 0xe2, 0xfd, 0xa4, 0xd8, 0x05, 0x96, 0x48, 0xf6, 0x53, 0x42, 0xf8, 0x16, 0xb7, 0x02, - 0x35, 0xcf, 0xfe, 0x14, 0x5b, 0xfe, 0x71, 0xf0, 0x4c, 0x80, 0x9f, 0x40, 0xcf, 0xa8, 0xfe, 0x9f, - 0x27, 0x19, 0x78, 0xa0, 0xf8, 0x5d, 0xdf, 0xd6, 0xc2, 0x02, 0x04, 0xe6, 0xa2, 0x02, 0x90, 0x96, - 0xe7, 0xb1, 0x3d, 0xdf, 0x8f, 0xa1, 0x0a, 0xef, 0x80, 0x26, 0xbb, 0xf4, 0x02, 0xab, 0x0d, 0x0b, - 0x3f, 0x93, 0x04, 0x71, 0x09, 0xda, 0xb7, 0x41, 0xef, 0xaa, 0x68, 0x09, 0xa0, 0x8f, 0xfb, 0x2d, - 0x9a, 0xf8, 0x72, 0x61, 0xfc, 0xb5, 0xbb, 0xf1, 0x8c, 0x57, 0xf8, 0x6a, 0xea, 0x06, 0xe6, 0xb8, - 0xfc, 0xc8, 0x7a, 0x00, 0xe4, 0x3b, 0x07, 0x81, 0xc3, 0xf3, 0xa2, 0x7f, 0xf5, 0x9e, 0x31, 0x05, - 0xa4, 0xb8, 0x00, 0xf8, 0xeb, 0xfc, 0x6d, 0x7d, 0x4a, 0xb2, 0x0f, 0x3a, 0xa5, 0x41, 0xf7, 0x0f, - 0x6b, 0x1c, 0x77, 0xaf, 0x03, 0xa2, 0x70, 0xda, 0x15, 0x1e, 0x02, 0x4a, 0x3a, 0x00, 0xe1, 0x08, - 0xe8, 0x26, 0x52, 0xdf, 0xa7, 0xa5, 0x03, 0x67, 0x16, 0x28, 0xa0, 0x77, 0x06, 0xbf, 0x7c, 0x03, - 0x11, 0xb5, 0x09, 0x91, 0x59, 0xe4, 0xe0, 0x15, 0xeb, 0xb0, 0x49, 0x07, 0x3a, 0xd9, 0xfe, 0x64, - 0x72, 0xf7, 0x87, 0x76, 0xfa, 0x13, 0x96, 0xf2, 0x51, 0x89, 0xf6, 0x4b, 0x1d, 0x04, 0x92, 0x96, - 0xfe, 0x31, 0x01, 0x01, 0x92, 0x18, 0x07, 0x37, 0xab, 0xf4, 0x2a, 0x94, 0xf3, 0xb9, 0x77, 0x05, - 0xbb, 0x7e, 0x02, 0x7f, 0x6f, 0xfc, 0x5a, 0x87, 0x45, 0x6e, 0x4e, 0x34, 0x48, 0xe6, 0xf6, 0xe7, - 0x0d, 0x1f, 0xf6, 0x55, 0x07, 0xfe, 0x2a, 0xdc, 0x0e, 0x38, 0x01, 0x88, 0x60, 0x02, 0x23, 0x8d, - 0xec, 0x9e, 0xf0, 0xde, 0xe5, 0x03, 0xfd, 0x2d, 0x2e, 0x27, 0x0e, 0x11, 0x07, 0xac, 0xda, 0xfa, - 0xd8, 0xfb, 0x0f, 0x45, 0xba, 0xf2, 0x92, 0x3e, 0xe5, 0x09, 0x1d, 0x04, 0x4f, 0x36, 0x04, 0x13, - 0x75, 0xf4, 0x56, 0x7d, 0xf9, 0xa1, 0x79, 0xf6, 0x2f, 0x0a, 0xf6, 0x10, 0xfe, 0x00, 0x4d, 0x32, - 0xfd, 0x16, 0xce, 0xfe, 0xb8, 0x3c, 0x07, 0xc8, 0xb5, 0xf9, 0xfb, 0xb1, 0xf3, 0x86, 0xbb, 0x01, - 0x4a, 0x36, 0x03, 0x50, 0x21, 0xfe, 0x81, 0x4d, 0x3f, 0x4f, 0x17, 0x2f, 0xb3, 0x25, 0xf9, 0xda, - 0x6c, 0x1f, 0x05, 0x46, 0x07, 0x74, 0x2d, 0xe0, 0xdf, 0x79, 0x01, 0x33, 0xac, 0x01, 0x2d, 0xfe, - 0xf0, 0x62, 0x61, 0xe0, 0xba, 0xec, 0xf8, 0x2b, 0xa1, 0x24, 0x13, 0x3b, 0x05, 0x74, 0x35, 0xf7, - 0x5c, 0x01, 0x12, 0x23, 0x24, 0xfa, 0x35, 0xba, 0xe5, 0xd5, 0xe2, 0x01, 0xff, 0x39, 0x06, 0xae, - 0xd5, 0xf3, 0x00, 0xb7, 0xf8, 0xac, 0xfd, 0xf8, 0x78, 0xd2, 0xf6, 0xe6, 0xb1, 0xff, 0x9b, 0x53, - 0xfb, 0x42, 0x5c, 0xfb, 0x23, 0x53, 0x05, 0x87, 0x75, 0xfd, 0xcb, 0xe3, 0xf6, 0xb5, 0xf8, 0xff, - 0x4e, 0x42, 0x01, 0xb1, 0xe9, 0xfd, 0x7e, 0x3f, 0x3a, 0x70, 0x01, 0x2a, 0x3e, 0xfc, 0xf9, 0xa1, - 0xf6, 0x1f, 0xb3, 0x14, 0x08, 0x6e, 0xd9, 0xe3, 0xa9, 0x87, 0x02, 0xb6, 0xf8, 0x00, 0x27, 0x2e, - 0xf3, 0x72, 0x2d, 0xe4, 0xb8, 0x3b, 0xf7, 0xb1, 0xda, 0x1f, 0xbd, 0xb8, 0x05, 0x31, 0xd2, 0xf6, - 0x9a, 0xe4, 0x0f, 0x8d, 0x2c, 0xfd, 0x2a, 0xab, 0xe8, 0xa5, 0x71, 0x01, 0xf5, 0x87, 0x06, 0x9d, - 0x57, 0xf5, 0x56, 0x2a, 0xf9, 0xa3, 0xb5, 0xf9, 0xce, 0xc5, 0xf7, 0xb0, 0x29, 0xff, 0x2f, 0x95, - 0xfb, 0x15, 0xf0, 0xf9, 0x82, 0x9a, 0x01, 0x2d, 0xee, 0xfd, 0xc8, 0x2d, 0xfa, 0x7c, 0x1c, 0x01, - 0x56, 0x5a, 0x00, 0x3b, 0xb3, 0xfc, 0xcf, 0x49, 0x3b, 0xe3, 0xdc, 0x2a, 0x26, 0xc0, 0xeb, 0x0e, - 0xb9, 0x19, 0x76, 0xd0, 0x18, 0xd1, 0xfa, 0xe7, 0xf1, 0xf9, 0xf7, 0x01, 0x88, 0xff, 0x04, 0x60, - 0xf9, 0xf1, 0x7b, 0xe6, 0x57, 0x76, 0xf9, 0xa5, 0x7d, 0x1f, 0x3b, 0xf9, 0xfc, 0xa6, 0x2e, 0xf0, - 0x13, 0x41, 0x0c, 0x51, 0x25, 0x02, 0xa1, 0x10, 0xf3, 0xdc, 0xd5, 0x05, 0x4d, 0x5a, 0x0c, 0xd2, - 0x1f, 0xfb, 0xdb, 0xcc, 0xfd, 0x2c, 0x51, 0xfe, 0x00, 0xa8, 0xf9, 0x88, 0xe1, 0xfd, 0x87, 0x30, - 0xf6, 0xba, 0x1b, 0xf4, 0x6b, 0x09, 0xfd, 0x12, 0xec, 0xfc, 0xde, 0xfc, 0xf8, 0xbc, 0x22, 0xfd, - 0x66, 0x0e, 0x00, 0x7b, 0x75, 0xfe, 0x44, 0x9a, 0x31, 0x2b, 0xd8, 0x28, 0xb2, 0xca, 0xf5, 0x20, - 0xaf, 0x17, 0x57, 0x5e, 0x14, 0x5a, 0x42, 0xea, 0x6b, 0x2e, 0xf9, 0x91, 0x9c, 0xff, 0x59, 0xf4, - 0xf8, 0xc1, 0x2c, 0xeb, 0xce, 0x9d, 0xf8, 0x93, 0x3c, 0x18, 0xc4, 0xd4, 0x00, 0x73, 0xc8, 0xf5, - 0x22, 0x5b, 0x0a, 0x3e, 0xdf, 0x00, 0xed, 0x15, 0xf4, 0x5c, 0x84, 0x03, 0x4c, 0x67, 0x09, 0xa9, - 0xae, 0xfc, 0xb3, 0xb3, 0xfe, 0x96, 0xce, 0xfd, 0xf1, 0xba, 0xf9, 0xb0, 0x87, 0xfe, 0xcf, 0x78, - 0xf8, 0x0a, 0x36, 0xf6, 0xe1, 0xb8, 0xfd, 0x8e, 0x8b, 0xfc, 0xaa, 0x73, 0xf9, 0xa3, 0x9a, 0xfd, - 0x37, 0x8a, 0xff, 0x6f, 0xf9, 0xfd, 0xa3, 0x9e, 0x29, 0xf5, 0xd4, 0x24, 0x87, 0xe2, 0xfb, 0xb2, - 0x58, 0x16, 0x71, 0xff, 0x11, 0x65, 0xcf, 0xee, 0x27, 0xed, 0xfb, 0xd7, 0x93, 0x00, 0xe8, 0xba, - 0xf8, 0xf7, 0x53, 0xed, 0x13, 0x2f, 0xf9, 0xdc, 0x5d, 0x13, 0xf5, 0xad, 0x01, 0x84, 0xfe, 0xf8, - 0x4d, 0x6b, 0x08, 0x19, 0xcb, 0x00, 0xec, 0xf6, 0xf5, 0x95, 0x7d, 0x01, 0x53, 0xe4, 0x07, 0xd0, - 0xd0, 0xfd, 0xac, 0x09, 0xfe, 0x7e, 0x1f, 0xfe, 0xa2, 0xaa, 0xfa, 0xfe, 0xe4, 0xfd, 0x98, 0x8e, - 0xfa, 0x67, 0xeb, 0xf8, 0x08, 0x04, 0xfe, 0x35, 0x7c, 0xfd, 0xa2, 0x85, 0xfa, 0x4a, 0x20, 0xfd, - 0xa7, 0x9b, 0xff, 0x66, 0x33, 0xfe, 0x86, 0x9c, 0x22, 0xf3, 0x81, 0x20, 0xa2, 0xea, 0x00, 0xf3, - 0x9e, 0x15, 0xad, 0x9a, 0x0f, 0xa5, 0x94, 0xf2, 0xda, 0x0a, 0xff, 0x73, 0xee, 0x01, 0xe2, 0x2d, - 0xf8, 0x2c, 0x2f, 0xef, 0x33, 0x29, 0xfa, 0xaa, 0x9a, 0x0f, 0xa4, 0xad, 0x02, 0xde, 0x8b, 0xfa, - 0x01, 0x45, 0x06, 0xca, 0xd7, 0x01, 0xd6, 0x17, 0xf7, 0xa6, 0x53, 0xff, 0x68, 0x24, 0x07, 0x3f, - 0xd0, 0xfe, 0x35, 0xc9, 0xfd, 0x40, 0x2f, 0xfe, 0x20, 0x5e, 0xfb, 0x75, 0x00, 0xfe, 0xca, 0xb5, - 0xfb, 0xfa, 0x46, 0xfb, 0x2a, 0xb0, 0xff, 0xb7, 0xfa, 0xfd, 0xf3, 0xd9, 0xfa, 0x4b, 0x5f, 0xfd, - 0xde, 0xa5, 0xff, 0x3f, 0x31, 0xfe, 0xa4, 0xad, 0x1d, 0xeb, 0x1c, 0x1d, 0x95, 0x0b, 0x03, 0xb2, - 0xb7, 0x13, 0x3f, 0xd6, 0x0e, 0x8f, 0xbe, 0xf6, 0xab, 0x34, 0x00, 0x45, 0xb4, 0x01, 0xac, 0x43, - 0xf9, 0xbd, 0xa9, 0xf1, 0xdc, 0xfb, 0xf9, 0xae, 0x47, 0x0d, 0xfd, 0xf1, 0x03, 0x9d, 0x5e, 0xfa, - 0x93, 0x55, 0x04, 0x87, 0x84, 0x02, 0xc1, 0xfe, 0xf7, 0x3c, 0x97, 0xfe, 0xe7, 0xf2, 0x05, 0x7c, - 0x20, 0xff, 0x16, 0xf0, 0xfd, 0x79, 0x0e, 0xfe, 0x27, 0xf7, 0xfb, 0xb1, 0x77, 0xfe, 0xbf, 0xad, - 0xfd, 0x09, 0x2d, 0xfd, 0x4d, 0xb2, 0xff, 0x43, 0x42, 0xfe, 0xac, 0xb3, 0xfb, 0x27, 0xe3, 0xfd, - 0xc4, 0x5b, 0xff, 0xfb, 0x72, 0xfd, 0xcd, 0x72, 0x1a, 0x05, 0x94, 0x1a, 0x7e, 0x68, 0x03, 0xa6, - 0x0c, 0x11, 0x79, 0x10, 0x0f, 0x09, 0x66, 0xfb, 0x2b, 0xf4, 0xff, 0x7a, 0x26, 0x00, 0x0c, 0x8a, - 0xfb, 0x78, 0xf7, 0xf4, 0x86, 0xec, 0xf9, 0x0d, 0x1f, 0x0b, 0xc0, 0x77, 0x04, 0x70, 0xca, 0xfa, - 0xf1, 0x78, 0x02, 0xc1, 0xf3, 0x01, 0x7d, 0xdf, 0xf9, 0x4b, 0xe1, 0xfe, 0xae, 0x57, 0x04, 0xf6, - 0x2d, 0xff, 0x2f, 0x1e, 0xfe, 0x32, 0x51, 0xfe, 0x38, 0x7b, 0xfd, 0x32, 0x07, 0x00, 0xf6, 0x22, - 0xff, 0x8b, 0x6e, 0xfd, 0x19, 0x13, 0xff, 0x78, 0xdd, 0xfe, 0x49, 0xee, 0xfc, 0xa9, 0xcb, 0xfd, - 0x2e, 0x72, 0xfe, 0x0e, 0x17, 0xfd, 0xf6, 0x42, 0x16, 0x0e, 0xbc, 0x17, 0x9a, 0x09, 0x05, 0x13, - 0x8c, 0x0f, 0x8c, 0x2b, 0x0e, 0xa2, 0x1f, 0xfe, 0x0f, 0x92, 0x00, 0x34, 0xec, 0xff, 0x00, 0xbb, - 0xfc, 0x26, 0x56, 0xf7, 0xa1, 0xa1, 0xfa, 0x9e, 0xa4, 0x08, 0x1f, 0x91, 0x03, 0x6a, 0xa2, 0xfb, - 0xcd, 0x48, 0x01, 0x50, 0x50, 0x01, 0xc2, 0x74, 0xfb, 0xd8, 0x9a, 0xfe, 0x0c, 0xe3, 0x02, 0x9d, - 0x40, 0xff, 0x42, 0xe6, 0xfe, 0xa2, 0xdf, 0xff, 0xb2, 0xa5, 0xfe, 0x90, 0x2a, 0x00, 0x01, 0x75, - 0xff, 0xed, 0x73, 0xfd, 0x63, 0xae, 0xfe, 0xb5, 0xe3, 0xfe, 0x63, 0x48, 0xfd, 0xe9, 0x71, 0xfd, - 0xb9, 0xfc, 0xfd, 0x21, 0x9d, 0xfd, 0xef, 0xf0, 0x12, 0x23, 0x16, 0x15, 0x6f, 0x6b, 0x06, 0xab, - 0x48, 0x0e, 0x26, 0x18, 0x0d, 0xe2, 0x60, 0x00, 0x1d, 0xe4, 0x00, 0x05, 0x01, 0x00, 0x92, 0x19, - 0xfe, 0x04, 0xad, 0xf9, 0xfa, 0x75, 0xfb, 0x6d, 0xbb, 0x05, 0x22, 0xda, 0x02, 0x3a, 0xe2, 0xfc, - 0x37, 0x34, 0x00, 0x60, 0xfc, 0x00, 0x8c, 0xb9, 0xfc, 0x9f, 0x61, 0xfe, 0x29, 0x62, 0x02, 0x2b, - 0xc4, 0x00, 0xfd, 0x02, 0x00, 0xee, 0xbe, 0xff, 0x52, 0x3d, 0xff, 0x1b, 0xbe, 0x00, 0xe4, 0x51, - 0xff, 0x97, 0x1e, 0xfd, 0xdb, 0x41, 0xfe, 0xb3, 0xc3, 0xfe, 0x1b, 0x8e, 0xfd, 0x19, 0xe1, 0xfd, - 0x49, 0x6c, 0xfe, 0x75, 0xe7, 0xfd, 0x43, 0x8c, 0x0f, 0xa1, 0x9e, 0x12, 0x30, 0xc6, 0x07, 0xd9, - 0xc1, 0x0d, 0x74, 0xde, 0x0b, 0x9f, 0xe2, 0x00, 0xed, 0xda, 0x01, 0x55, 0x4f, 0x01, 0x33, 0xe2, - 0xfe, 0xa7, 0x09, 0xfb, 0x8e, 0xd1, 0xfb, 0x65, 0xd8, 0x03, 0x2d, 0x12, 0x02, 0x48, 0xec, 0xfc, - 0xe1, 0x1e, 0x00, 0xf1, 0x8a, 0x01, 0x89, 0x67, 0xfd, 0xde, 0x09, 0xff, 0x28, 0x0d, 0x03, 0x77, - 0xda, 0x00, 0xe9, 0x9d, 0xff, 0x7e, 0x19, 0x00, 0xf8, 0x11, 0x00, 0xfb, 0x8d, 0x00, 0xd9, 0x6e, - 0xfe, 0xf7, 0x8d, 0xfc, 0x86, 0x4f, 0xfe, 0x7a, 0x69, 0xff, 0x01, 0x43, 0xfe, 0x3b, 0x0f, 0xfe, - 0xce, 0x6a, 0xfe, 0x12, 0x75, 0xfe, 0xc3, 0xa2, 0x0d, 0x06, 0x01, 0x11, 0x90, 0xc7, 0x07, 0xca, - 0x97, 0x0c, 0x9d, 0x0b, 0x0b, 0x59, 0x4c, 0x01, 0x19, 0x2e, 0x02, 0xfd, 0x1b, 0x02, 0x07, 0xf6, - 0xff, 0x0c, 0x37, 0xfc, 0xb5, 0xaa, 0xfb, 0x39, 0x23, 0x02, 0xf3, 0x64, 0x01, 0xa2, 0x53, 0xfd, - 0xf8, 0xaa, 0x00, 0x86, 0xe1, 0x02, 0x66, 0xd1, 0xfe, 0x5b, 0xb7, 0xfe, 0xfa, 0x16, 0x02, 0xeb, - 0xea, 0x00, 0xed, 0xfa, 0xff, 0x1c, 0x70, 0x00, 0xae, 0x00, 0x00, 0xb6, 0x3d, 0xff, 0x6b, 0x86, - 0xfd, 0x6f, 0xa1, 0xfd, 0x95, 0x6c, 0xff, 0xdc, 0x7b, 0xff, 0x38, 0x64, 0xfe, 0xcf, 0x45, 0xfe, - 0x6e, 0xe6, 0xfe, 0x57, 0x6b, 0xff, 0x6f, 0xed, 0x0c, 0x95, 0x61, 0x0f, 0x5e, 0x0e, 0x07, 0x22, - 0x06, 0x0c, 0x7b, 0xd3, 0x09, 0xc6, 0x43, 0x01, 0x4d, 0x11, 0x03, 0xdd, 0x01, 0x03, 0x4a, 0x9f, - 0x00, 0x63, 0x7f, 0xfc, 0x86, 0xb1, 0xfb, 0x1b, 0x3f, 0x01, 0x1c, 0xd8, 0x00, 0x96, 0x61, 0xff, - 0x0f, 0x05, 0x03, 0xa2, 0x79, 0x02, 0xb1, 0xf0, 0xfd, 0x9a, 0xdf, 0xfe, 0xec, 0xd7, 0x01, 0xdc, - 0x0b, 0x01, 0x79, 0x69, 0x00, 0x4c, 0xdd, 0xff, 0x1e, 0x10, 0xff, 0x03, 0x0c, 0xff, 0xd2, 0xa0, - 0xfe, 0xaa, 0xd6, 0xfe, 0xe8, 0xb1, 0xff, 0x44, 0x9b, 0xff, 0x55, 0xad, 0xfe, 0x5c, 0xee, 0xfe, - 0x64, 0x90, 0xff, 0x28, 0xfb, 0xfe, 0xa0, 0x5a, 0x0c, 0x17, 0x31, 0x0e, 0xe9, 0x2f, 0x06, 0x57, - 0xe8, 0x0a, 0x9f, 0xf4, 0x08, 0xe5, 0x9a, 0x01, 0xa2, 0x04, 0x04, 0x20, 0xb2, 0x03, 0x73, 0x84, - 0x00, 0x55, 0xed, 0xfc, 0xc2, 0x21, 0xfc, 0x83, 0x7b, 0x01, 0x9a, 0xc1, 0x02, 0xb8, 0xab, 0x00, - 0x63, 0x5d, 0x02, 0x62, 0xfe, 0x01, 0x78, 0xfe, 0xfd, 0x06, 0xc1, 0xfe, 0x59, 0xd7, 0x01, 0x09, - 0x12, 0x01, 0xba, 0xbd, 0xff, 0xd8, 0xd0, 0xff, 0x86, 0xd0, 0xff, 0x45, 0xa7, 0xff, 0x4f, 0x80, - 0xff, 0x2b, 0x5e, 0xff, 0xbd, 0x0f, 0x00, 0xf8, 0x34, 0x00, 0x07, 0xde, 0xfe, 0x7b, 0x7e, 0xfe, - 0x32, 0xa5, 0xfe, 0x5f, 0x5c, 0xfe, 0x6d, 0x6d, 0x0b, 0xe0, 0xc0, 0x0c, 0x41, 0x43, 0x05, 0xd8, - 0xee, 0x09, 0xb9, 0x80, 0x08, 0x93, 0x44, 0x02, 0x67, 0xa7, 0x04, 0xd5, 0xed, 0x03, 0xfd, 0x9d, - 0x00, 0x88, 0x63, 0xfe, 0x8a, 0x81, 0xfe, 0xfe, 0x65, 0x01, 0xdc, 0xf5, 0x01, 0x28, 0x8c, 0x01, - 0xde, 0x30, 0x02, 0x6b, 0x28, 0x01, 0x9c, 0x16, 0xfe, 0x98, 0x45, 0xfe, 0x64, 0x39, 0x01, 0x70, - 0x79, 0x01, 0x6c, 0xc3, 0x00, 0x4d, 0x7b, 0x00, 0x3d, 0xb5, 0xff, 0xd5, 0xcd, 0xff, 0x99, 0x4f, - 0x00, 0xa6, 0x6c, 0x00, 0x8f, 0x6e, 0x00, 0x45, 0x22, 0xff, 0x77, 0x75, 0xfd, 0x51, 0xdc, 0xfd, - 0x0d, 0xbd, 0xfe, 0x6c, 0xd1, 0xfe, 0x48, 0xce, 0x0a, 0x52, 0x60, 0x0c, 0x17, 0x92, 0x04, 0x3e, - 0x24, 0x07, 0xe2, 0x5d, 0x07, 0x72, 0x6d, 0x04, 0x1b, 0xf6, 0x05, 0xcb, 0x48, 0x04, 0x6b, 0x1e, - 0x02, 0x50, 0xa2, 0xff, 0xf2, 0x44, 0xfe, 0xd3, 0x93, 0x01, 0x2b, 0xbf, 0x02, 0x99, 0x16, 0x01, - 0xac, 0x01, 0x01, 0xf7, 0x23, 0x00, 0x3b, 0xb5, 0xfd, 0x73, 0x3c, 0xff, 0xf7, 0xb8, 0x02, 0x4d, - 0x0e, 0x02, 0x85, 0x60, 0x00, 0x2c, 0x2e, 0x00, 0x47, 0x70, 0x00, 0x8b, 0x60, 0x01, 0xf2, 0x0a, - 0x01, 0x43, 0x4b, 0xff, 0x3e, 0x6e, 0xfe, 0x59, 0x1f, 0xfe, 0x3d, 0xeb, 0xfd, 0xba, 0x8c, 0xfe, - 0xe1, 0x45, 0xff, 0xee, 0x07, 0xff, 0xe0, 0x61, 0x08, 0xde, 0x17, 0x0b, 0x98, 0x0f, 0x05, 0x58, - 0x58, 0x06, 0xa6, 0x87, 0x07, 0xa1, 0xcb, 0x04, 0xd3, 0x08, 0x07, 0x8d, 0x1b, 0x07, 0xce, 0x18, - 0x03, 0xc4, 0x47, 0x00, 0xb6, 0xac, 0xfe, 0x06, 0xf8, 0xff, 0x67, 0xed, 0x01, 0x9c, 0x34, 0x01, - 0x18, 0x55, 0x00, 0x5b, 0xc7, 0xff, 0xa0, 0x1f, 0xff, 0xd4, 0x87, 0x00, 0xa9, 0xb9, 0x02, 0x68, - 0x6d, 0x02, 0x58, 0xcd, 0x00, 0x3f, 0x8f, 0x00, 0xfc, 0x27, 0x01, 0x14, 0x2a, 0x01, 0x2f, 0xcb, - 0xff, 0xca, 0x2f, 0xfe, 0xfc, 0x47, 0xfe, 0x30, 0x91, 0xfe, 0xe2, 0x60, 0xfe, 0xf0, 0xf3, 0xfe, - 0x5b, 0x29, 0xff, 0xed, 0xb7, 0xfe, 0x7a, 0x36, 0x07, 0x30, 0xb9, 0x0a, 0x39, 0x70, 0x06, 0x59, - 0x78, 0x06, 0x73, 0x7c, 0x08, 0x04, 0x13, 0x07, 0x70, 0x93, 0x05, 0x18, 0x16, 0x05, 0xd4, 0xec, - 0x03, 0xdb, 0x17, 0x01, 0xc5, 0x22, 0xff, 0x16, 0x1b, 0xff, 0xad, 0x4d, 0xff, 0x6e, 0xea, 0xff, - 0x2a, 0xaa, 0x01, 0x49, 0x20, 0x02, 0xaf, 0xb2, 0x00, 0x32, 0xe3, 0x00, 0x94, 0x2e, 0x02, 0xe1, - 0x2f, 0x02, 0x03, 0x39, 0x01, 0x54, 0x78, 0x00, 0x0a, 0x4c, 0x00, 0xbe, 0xb5, 0xff, 0xf5, 0xc9, - 0xfe, 0xa8, 0x79, 0xfe, 0x83, 0xa6, 0xfe, 0x41, 0x8c, 0xfe, 0x82, 0x5d, 0xfe, 0xe6, 0xb9, 0xfe, - 0x8e, 0x27, 0xff, 0xc1, 0x0f, 0xff, 0xd2, 0xda, 0x05, 0x49, 0x76, 0x0a, 0xa1, 0x95, 0x08, 0x76, - 0x24, 0x07, 0xbd, 0x0a, 0x08, 0xcb, 0x53, 0x08, 0x98, 0x10, 0x07, 0x47, 0x58, 0x04, 0x47, 0x86, - 0x01, 0xe6, 0xa0, 0xff, 0x50, 0xf9, 0xfe, 0x10, 0x8b, 0xff, 0xa7, 0x74, 0x00, 0xec, 0xb4, 0x00, - 0x51, 0x05, 0x01, 0xf6, 0xfd, 0x01, 0xdf, 0x75, 0x02, 0xbc, 0x17, 0x02, 0xcf, 0xd6, 0x01, 0x06, - 0x79, 0x01, 0x66, 0x88, 0x00, 0x91, 0xbe, 0xff, 0xfc, 0x60, 0xff, 0x80, 0x45, 0xff, 0x2f, 0xff, - 0xfe, 0xea, 0xac, 0xfe, 0x39, 0xcb, 0xfe, 0xea, 0xc3, 0xfe, 0xa0, 0x5c, 0xfe, 0xb8, 0x54, 0xfe, - 0x42, 0xe8, 0xfe, 0x02, 0x22, 0xff, 0xe9, 0x81, 0x07, 0x0c, 0x43, 0x0b, 0x0a, 0x16, 0x07, 0xe4, - 0xee, 0x07, 0x05, 0x5c, 0x09, 0xb5, 0x8c, 0x06, 0x1e, 0x30, 0x06, 0x47, 0x2f, 0x05, 0x33, 0xd0, - 0x00, 0x1a, 0xe1, 0xfd, 0x54, 0x08, 0xff, 0x75, 0xf1, 0x00, 0xb5, 0xcf, 0x00, 0x9b, 0xfb, 0x00, - 0x96, 0xdd, 0x01, 0x58, 0xda, 0x01, 0x3c, 0x56, 0x02, 0x0d, 0x52, 0x03, 0x3b, 0x39, 0x02, 0x17, - 0xe7, 0xff, 0x10, 0xff, 0xfe, 0x77, 0x46, 0xff, 0x64, 0x6e, 0xff, 0x49, 0x61, 0xff, 0x7c, 0x4d, - 0xff, 0x63, 0xd2, 0xfe, 0x9b, 0x80, 0xfe, 0xbd, 0x81, 0xfe, 0xa9, 0x7a, 0xfe, 0x15, 0x04, 0xff, - 0x79, 0x27, 0xff, 0x7d, 0xad, 0xfe, 0x8b, 0x64, 0x07, 0xde, 0x1e, 0x0b, 0x4e, 0xf3, 0x07, 0x7a, - 0xb1, 0x07, 0x56, 0xd3, 0x07, 0xba, 0xeb, 0x05, 0xbb, 0xed, 0x04, 0x7e, 0x44, 0x04, 0x32, 0x20, - 0x02, 0xba, 0xd1, 0xff, 0x7c, 0x33, 0x00, 0x1b, 0xf5, 0x00, 0x44, 0xa1, 0x00, 0x80, 0xba, 0x00, - 0x50, 0x75, 0x01, 0x28, 0x66, 0x02, 0x28, 0x18, 0x03, 0x5b, 0x2f, 0x03, 0x85, 0x73, 0x01, 0xee, - 0x66, 0xff, 0x8a, 0x1a, 0xff, 0xb0, 0x11, 0xff, 0x3f, 0x11, 0xff, 0x79, 0x64, 0xff, 0x08, 0x71, - 0xff, 0xd5, 0x40, 0xff, 0xfc, 0xb0, 0xfe, 0xe4, 0x34, 0xfe, 0xf3, 0x67, 0xfe, 0xd3, 0xf6, 0xfe, - 0xe2, 0x1d, 0xff, 0x3f, 0x0c, 0xff, 0xd7, 0x16, 0x08, 0x5e, 0x53, 0x0c, 0x9c, 0xd9, 0x06, 0x23, - 0xd1, 0x04, 0x24, 0x0d, 0x06, 0x84, 0x54, 0x05, 0x00, 0x3b, 0x04, 0xdd, 0x62, 0x04, 0x91, 0x56, - 0x04, 0x35, 0x30, 0x01, 0x8d, 0x28, 0x00, 0x97, 0x90, 0x01, 0x75, 0xbe, 0x00, 0xcf, 0x74, 0x00, - 0x68, 0xe8, 0x01, 0xf0, 0xac, 0x02, 0xf6, 0xfa, 0x01, 0x82, 0x5f, 0x02, 0x57, 0xd1, 0x02, 0x3e, - 0x37, 0x00, 0x09, 0x17, 0xfe, 0x60, 0x84, 0xfe, 0x9e, 0x86, 0xff, 0xb0, 0x9a, 0xff, 0xa5, 0x01, - 0xff, 0x8b, 0x19, 0xff, 0x2a, 0x0f, 0xff, 0x6b, 0x9a, 0xfe, 0xdc, 0x6c, 0xfe, 0x9d, 0x6a, 0xfe, - 0xa1, 0xd9, 0xfe, 0xea, 0x5d, 0xff, 0x55, 0x6f, 0x08, 0xac, 0xeb, 0x0b, 0xaa, 0x75, 0x05, 0xf7, - 0x39, 0x03, 0x06, 0x1e, 0x04, 0x26, 0x25, 0x04, 0x06, 0x75, 0x05, 0x55, 0x9d, 0x05, 0xec, 0x6b, - 0x03, 0x8f, 0xc0, 0x01, 0x30, 0x9a, 0x02, 0x0f, 0xa0, 0x01, 0xd9, 0xc2, 0xff, 0x9a, 0x2f, 0x01, - 0x1c, 0x59, 0x02, 0x90, 0x4a, 0x02, 0xbd, 0x65, 0x02, 0x88, 0x6e, 0x02, 0xe5, 0x69, 0x02, 0xb5, - 0x8f, 0x01, 0x7b, 0xf5, 0xff, 0xbc, 0x71, 0xfe, 0xc5, 0x4e, 0xfe, 0x2c, 0x31, 0xff, 0x8b, 0xb3, - 0xff, 0xe0, 0xce, 0xff, 0x8c, 0x0b, 0xff, 0xb9, 0x7c, 0xfe, 0x20, 0xcb, 0xfe, 0x2d, 0xa1, 0xfe, - 0xac, 0x92, 0xfe, 0x3e, 0xdf, 0xfe, 0xa0, 0xa2, 0x08, 0xb5, 0xca, 0x0b, 0x20, 0x4e, 0x05, 0xef, - 0x68, 0x03, 0xb8, 0x1d, 0x04, 0x32, 0x8f, 0x03, 0x75, 0xbd, 0x03, 0xf3, 0x98, 0x03, 0x61, 0x89, - 0x02, 0x8f, 0x09, 0x02, 0x8a, 0x47, 0x03, 0xe3, 0x0b, 0x03, 0xf1, 0xbf, 0x01, 0x23, 0xc5, 0x00, - 0x1e, 0xed, 0x00, 0xc6, 0xef, 0x02, 0x62, 0x0d, 0x03, 0x2e, 0x24, 0x02, 0xd2, 0x0c, 0x02, 0x49, - 0x56, 0x02, 0x6c, 0xe0, 0x01, 0x8e, 0xf1, 0xff, 0x3d, 0x56, 0xff, 0xcf, 0x93, 0xfe, 0xff, 0x0d, - 0xfe, 0xa7, 0xcf, 0xff, 0x95, 0x1d, 0x00, 0xc3, 0x0c, 0xff, 0xee, 0xc0, 0xfe, 0xf7, 0x12, 0xff, - 0xf3, 0xe6, 0xfe, 0x21, 0x81, 0xfe, 0x15, 0xbc, 0x08, 0x2a, 0x57, 0x0c, 0x6c, 0x5b, 0x05, 0x95, - 0xef, 0x02, 0xa9, 0xb8, 0x04, 0xe4, 0xd2, 0x04, 0x7e, 0xed, 0x03, 0x62, 0xe4, 0x01, 0x22, 0x06, - 0xff, 0x9a, 0x61, 0xff, 0x1e, 0x66, 0x04, 0x55, 0x1c, 0x05, 0x4e, 0x83, 0x01, 0x7a, 0xc5, 0x00, - 0x08, 0x83, 0x01, 0xc9, 0xf2, 0x01, 0xe3, 0x6c, 0x02, 0x50, 0xf6, 0x02, 0x47, 0x68, 0x02, 0x0c, - 0xb5, 0x01, 0xd8, 0x74, 0x02, 0xf2, 0x63, 0x02, 0x6b, 0xab, 0x00, 0x34, 0x12, 0xff, 0x29, 0xea, - 0xfe, 0x88, 0xb6, 0xfe, 0x7c, 0x39, 0xfe, 0x20, 0x86, 0xff, 0xff, 0x2f, 0x00, 0x58, 0x26, 0xff, - 0x7d, 0xf2, 0xfe, 0x71, 0x0e, 0xff, 0x34, 0x39, 0x0a, 0x00, 0x7b, 0x0d, 0x16, 0xde, 0x04, 0x2c, - 0x04, 0x03, 0xcc, 0x01, 0x05, 0xc8, 0xde, 0x04, 0x04, 0x5b, 0x04, 0xcf, 0xd8, 0x00, 0x38, 0xe8, - 0xfc, 0xfb, 0x2b, 0xfe, 0x98, 0x4f, 0x03, 0x08, 0xeb, 0x03, 0x1c, 0xe3, 0x01, 0x14, 0x84, 0x01, - 0x5d, 0x41, 0x00, 0x4a, 0x2b, 0x01, 0x3e, 0x2a, 0x03, 0xdf, 0x47, 0x02, 0xe4, 0x7c, 0x01, 0xcb, - 0x89, 0x02, 0x71, 0x98, 0x02, 0xaa, 0x5c, 0x01, 0x07, 0x16, 0x02, 0x48, 0xd7, 0x01, 0x56, 0x31, - 0xff, 0xd8, 0x76, 0xfe, 0x8a, 0x65, 0xfe, 0xb3, 0x17, 0xfe, 0xa7, 0xfd, 0xfe, 0x18, 0xd4, 0xff, - 0x66, 0xb4, 0xff, 0x59, 0x05, 0xff, 0xb4, 0x02, 0x0c, 0x5d, 0xda, 0x0f, 0xf5, 0x78, 0x05, 0xc1, - 0xe7, 0x02, 0xb3, 0x5d, 0x04, 0x53, 0xff, 0x03, 0x28, 0x3a, 0x04, 0xa1, 0x8f, 0x00, 0x50, 0xac, - 0xfb, 0x27, 0x14, 0xfd, 0xdd, 0xf1, 0x03, 0x1f, 0xe2, 0x03, 0xea, 0xc0, 0xff, 0x12, 0x57, 0x00, - 0x3e, 0x81, 0x00, 0x68, 0x35, 0x01, 0x17, 0x48, 0x02, 0x14, 0x9e, 0x01, 0x02, 0x01, 0x02, 0x14, - 0x3b, 0x02, 0xb5, 0x01, 0x02, 0xff, 0x2a, 0x02, 0xa9, 0xfc, 0x01, 0x8c, 0x55, 0x01, 0x4d, 0x48, - 0x01, 0x90, 0x9e, 0x00, 0x26, 0x42, 0xfe, 0x45, 0x0a, 0xfe, 0x92, 0x12, 0xff, 0x17, 0xa4, 0xfe, - 0xa2, 0xd7, 0xfe, 0x12, 0xab, 0xff, 0x2a, 0x39, 0x0e, 0x4a, 0x12, 0x12, 0xba, 0x51, 0x05, 0x64, - 0xf6, 0x02, 0x3a, 0x97, 0x04, 0x93, 0xd4, 0x03, 0xae, 0x64, 0x04, 0xc9, 0x41, 0xff, 0xc2, 0x7f, - 0xf9, 0x71, 0xd3, 0xfc, 0xfd, 0xfe, 0x04, 0x36, 0xe7, 0x03, 0x8e, 0x22, 0xff, 0x2b, 0x4b, 0xff, - 0xfe, 0x80, 0xfe, 0x5f, 0x76, 0x00, 0xa6, 0xd3, 0x02, 0x90, 0x8e, 0x01, 0xd7, 0x64, 0x01, 0xff, - 0xa8, 0x01, 0x32, 0xba, 0x01, 0xc7, 0x4b, 0x01, 0xed, 0xd1, 0x01, 0x65, 0x85, 0x02, 0x5a, 0x02, - 0x01, 0xd9, 0xaf, 0x00, 0xcd, 0xa3, 0x00, 0xa4, 0x71, 0xff, 0x7c, 0xa6, 0xfe, 0x28, 0x66, 0xfe, - 0x23, 0xcf, 0xfe, 0x6e, 0xd4, 0xfe, 0x15, 0xd8, 0x10, 0x52, 0x49, 0x14, 0xa5, 0xb9, 0x04, 0xde, - 0x3c, 0x03, 0x82, 0x62, 0x05, 0x85, 0xdf, 0x03, 0x4e, 0x4f, 0x04, 0x43, 0xdf, 0xfd, 0xe0, 0x97, - 0xf7, 0xc3, 0xd3, 0xfc, 0xda, 0x29, 0x06, 0x69, 0xa1, 0x03, 0x86, 0x62, 0xfe, 0x5e, 0x0f, 0xff, - 0xe9, 0xd8, 0xfd, 0x9b, 0x91, 0xff, 0x4a, 0x9d, 0x01, 0x99, 0x2c, 0x01, 0x26, 0x14, 0x02, 0x88, - 0xad, 0x01, 0xde, 0xd0, 0x00, 0xc4, 0x51, 0x00, 0x79, 0x93, 0x01, 0xc7, 0xfc, 0x01, 0x38, 0xfd, - 0x00, 0x0d, 0xb6, 0x01, 0xde, 0x58, 0x00, 0x09, 0x27, 0x00, 0xb2, 0x28, 0x01, 0xbd, 0x33, 0xff, - 0x17, 0x64, 0xfe, 0x9d, 0xcd, 0xfe, 0xd5, 0xe7, 0x13, 0xd6, 0xeb, 0x16, 0xfb, 0x15, 0x04, 0xaa, - 0x47, 0x03, 0x46, 0xcc, 0x05, 0x05, 0x56, 0x03, 0x77, 0xf0, 0x03, 0xfc, 0x54, 0xfc, 0x3f, 0x12, - 0xf6, 0x61, 0xf2, 0xfd, 0x90, 0x50, 0x07, 0x6a, 0x89, 0x02, 0xf4, 0x39, 0xfd, 0xb8, 0x7e, 0xfe, - 0xb3, 0x4b, 0xfd, 0x27, 0xaa, 0xff, 0x24, 0x6e, 0x01, 0x4f, 0xe6, 0xff, 0xd9, 0x58, 0x01, 0xf2, - 0xee, 0x01, 0xcc, 0xad, 0x00, 0x35, 0xdf, 0xff, 0x68, 0xa8, 0x00, 0x53, 0xea, 0x00, 0xf7, 0xc8, - 0x00, 0x0d, 0x1a, 0x01, 0xe8, 0x33, 0x00, 0xa0, 0xe1, 0x00, 0x3f, 0xef, 0x00, 0xee, 0x2b, 0x00, - 0xdc, 0x8b, 0x00, 0x95, 0x39, 0xff, 0xc1, 0x3a, 0x17, 0xe5, 0x6f, 0x19, 0xe7, 0x3b, 0x03, 0xa0, - 0xc0, 0x03, 0x16, 0xb9, 0x06, 0x7c, 0xc3, 0x02, 0x24, 0xf9, 0x02, 0x41, 0x45, 0xfa, 0xdd, 0xd0, - 0xf4, 0xc8, 0xdc, 0xff, 0x0e, 0xcb, 0x08, 0xa8, 0x60, 0x01, 0x0f, 0x60, 0xfc, 0x8d, 0xc5, 0xfd, - 0xe6, 0x57, 0xfc, 0x71, 0xe6, 0xff, 0x74, 0x33, 0x01, 0xa0, 0x98, 0xff, 0xf3, 0x9f, 0x01, 0x53, - 0x27, 0x01, 0x7d, 0xf4, 0xff, 0xea, 0xc7, 0xff, 0xa1, 0x89, 0x00, 0xf2, 0xa5, 0x00, 0x70, 0xe2, - 0xff, 0xd3, 0x4d, 0x00, 0x08, 0x8e, 0xff, 0x59, 0x4c, 0x00, 0x8a, 0x5a, 0x01, 0x1b, 0xa3, 0x00, - 0x23, 0x98, 0x00, 0x58, 0x89, 0x00, 0x3d, 0xac, 0x1a, 0x2f, 0x29, 0x1c, 0x82, 0x5e, 0x02, 0x59, - 0x4b, 0x04, 0xf9, 0xb4, 0x07, 0xcc, 0xf2, 0x01, 0x3b, 0xa9, 0x01, 0x55, 0xe1, 0xf7, 0xcc, 0x15, - 0xf4, 0x0c, 0x4e, 0x02, 0x37, 0xc0, 0x09, 0x1e, 0x07, 0x00, 0x67, 0xcf, 0xfb, 0xd8, 0x6d, 0xfd, - 0x38, 0x97, 0xfb, 0xf1, 0xe1, 0xff, 0x74, 0xb6, 0x00, 0x5d, 0xce, 0xfe, 0x60, 0x2e, 0x02, 0xc0, - 0x7f, 0x01, 0x12, 0x2f, 0xff, 0x1f, 0x11, 0xff, 0xeb, 0x38, 0x00, 0x85, 0x6a, 0x00, 0xe2, 0xdc, - 0xff, 0xdf, 0xf8, 0xff, 0x48, 0x25, 0xfe, 0x78, 0x90, 0xff, 0x4b, 0x34, 0x01, 0x6a, 0xd6, 0xff, - 0xb6, 0x18, 0x01, 0x85, 0x34, 0x01, 0x53, 0xc5, 0x1d, 0x87, 0x95, 0x1f, 0xf0, 0xee, 0x01, 0x61, - 0x42, 0x04, 0xe7, 0x82, 0x08, 0xc0, 0xd3, 0x00, 0x0a, 0x1b, 0x00, 0x5f, 0xb1, 0xf5, 0x98, 0xa5, - 0xf3, 0x23, 0xd3, 0x04, 0xf8, 0x20, 0x0a, 0xf4, 0x7a, 0xfe, 0xcc, 0x72, 0xfb, 0xeb, 0x08, 0xfd, - 0x2f, 0x49, 0xfb, 0x42, 0x30, 0x00, 0xdb, 0xea, 0xff, 0xd3, 0xc3, 0xfd, 0xe4, 0x63, 0x02, 0x26, - 0x9e, 0x01, 0x69, 0xf8, 0xfe, 0xbe, 0x09, 0xff, 0xa5, 0x8d, 0xff, 0x88, 0xb2, 0xff, 0x58, 0xe1, - 0xff, 0x48, 0xa3, 0xff, 0x99, 0xb5, 0xfd, 0xa6, 0x16, 0xff, 0xc6, 0xf8, 0xff, 0xe5, 0x94, 0xff, - 0x42, 0xab, 0x00, 0x87, 0xe1, 0xff, 0xa0, 0x76, 0x20, 0x71, 0x1a, 0x23, 0x53, 0x28, 0x02, 0xdd, - 0x12, 0x04, 0xa8, 0x4a, 0x09, 0xfd, 0xe8, 0xff, 0xf5, 0x66, 0xfe, 0x9f, 0x7a, 0xf3, 0x88, 0x62, - 0xf3, 0xfe, 0x5c, 0x07, 0xd3, 0x29, 0x0a, 0x85, 0x22, 0xfd, 0xb1, 0x34, 0xfb, 0xcc, 0x66, 0xfc, - 0x12, 0x4f, 0xfb, 0x0e, 0xad, 0x00, 0x02, 0x63, 0xff, 0x9d, 0xdd, 0xfc, 0x3d, 0x26, 0x02, 0xc2, - 0x7d, 0x01, 0x8b, 0xbe, 0xfe, 0xf1, 0x49, 0xff, 0x99, 0x68, 0xff, 0xfc, 0x18, 0xff, 0x00, 0x7e, - 0xff, 0x6a, 0x5c, 0xff, 0x39, 0x46, 0xfd, 0x5e, 0xea, 0xfe, 0x12, 0x32, 0x00, 0x5c, 0xfd, 0xfd, - 0xca, 0x0e, 0xff, 0x8f, 0xd2, 0x00, 0xdd, 0xc1, 0x21, 0xbf, 0xe2, 0x26, 0xcb, 0x05, 0x04, 0x1e, - 0x2f, 0x03, 0x03, 0x01, 0x0a, 0xf3, 0x8c, 0xff, 0xd7, 0x72, 0xfc, 0xe0, 0xed, 0xf1, 0x72, 0xbd, - 0xf2, 0x44, 0xe9, 0x08, 0xa9, 0x5b, 0x0a, 0xa3, 0x40, 0xfc, 0xec, 0x21, 0xfb, 0x83, 0x65, 0xfb, - 0xb8, 0x3b, 0xfb, 0x02, 0x2f, 0x01, 0xd0, 0x0a, 0xff, 0x69, 0x8f, 0xfc, 0xcf, 0xc5, 0x01, 0x02, - 0xeb, 0x00, 0x12, 0x4e, 0xfe, 0x0e, 0x6c, 0xff, 0x51, 0x64, 0xff, 0x93, 0xf9, 0xfe, 0xf5, 0x4a, - 0xff, 0xc4, 0x8e, 0xfe, 0xe1, 0x67, 0xfd, 0xec, 0x98, 0xfe, 0x18, 0x79, 0xfe, 0x13, 0x3b, 0xfe, - 0xa7, 0xe1, 0xff, 0xb1, 0xbd, 0xff, 0xac, 0x2a, 0x21, 0x1f, 0x69, 0x2a, 0xf1, 0x53, 0x08, 0x37, - 0x17, 0x02, 0xc8, 0x05, 0x0a, 0xd5, 0x3c, 0x00, 0xab, 0x91, 0xfa, 0xb7, 0x1c, 0xf1, 0xb5, 0xf8, - 0xf1, 0x3e, 0xae, 0x08, 0x37, 0xc5, 0x0a, 0x85, 0x25, 0xfc, 0x7d, 0x2b, 0xfb, 0x5f, 0x8a, 0xfa, - 0xbd, 0xb8, 0xfa, 0x40, 0x63, 0x01, 0x3d, 0xfc, 0xfe, 0x25, 0x6f, 0xfc, 0xc6, 0x8a, 0x01, 0xa2, - 0xbf, 0x00, 0x5b, 0x9f, 0xfd, 0x9c, 0x08, 0xff, 0x87, 0x7f, 0xff, 0x7f, 0xa2, 0xfe, 0x00, 0x90, - 0xff, 0xf3, 0xb5, 0xfe, 0x9a, 0xe5, 0xfb, 0xc3, 0xa7, 0xfd, 0xd6, 0x41, 0xff, 0x19, 0x22, 0xfe, - 0x58, 0x2a, 0xff, 0xa2, 0xd8, 0xff, 0x2d, 0xbb, 0x1f, 0x68, 0x63, 0x2c, 0x93, 0x08, 0x0e, 0xe5, - 0x7d, 0x02, 0x53, 0xb8, 0x08, 0x62, 0x65, 0x01, 0x95, 0x5a, 0xf9, 0x15, 0x52, 0xf0, 0x79, 0x9e, - 0xf1, 0xcd, 0x05, 0x07, 0x72, 0xb7, 0x0a, 0xf6, 0x8a, 0xfc, 0x5a, 0x35, 0xfb, 0x76, 0x24, 0xfa, - 0x2c, 0xe0, 0xf9, 0xf7, 0x39, 0x01, 0x3b, 0xf4, 0xfe, 0x61, 0x35, 0xfc, 0x9c, 0x6b, 0x01, 0xc9, - 0xc6, 0x00, 0xf2, 0x6a, 0xfd, 0x55, 0x53, 0xfe, 0x07, 0xe6, 0xfe, 0xfb, 0x24, 0xff, 0x47, 0x70, - 0xff, 0xf1, 0x07, 0xfd, 0xbc, 0xfa, 0xfb, 0x78, 0x31, 0xfe, 0xf8, 0x7c, 0xfe, 0x8b, 0xea, 0xfd, - 0x46, 0xd8, 0xfe, 0xd5, 0x94, 0xff, 0x61, 0x30, 0x1f, 0x22, 0xa4, 0x2c, 0x73, 0x40, 0x12, 0x2e, - 0xa8, 0x05, 0x5a, 0x76, 0x07, 0xbd, 0x4d, 0x01, 0x1d, 0x6d, 0xf9, 0x9b, 0x6a, 0xef, 0xc3, 0x9c, - 0xf1, 0xbc, 0xcc, 0x05, 0x94, 0x9e, 0x09, 0x7e, 0xbb, 0xfc, 0xc9, 0x5f, 0xfb, 0x5e, 0xf7, 0xf9, - 0x08, 0x5b, 0xf9, 0x57, 0xf8, 0x00, 0x11, 0x95, 0xfe, 0xf8, 0xf9, 0xfb, 0x08, 0x68, 0x01, 0x40, - 0xe3, 0x00, 0xea, 0x76, 0xfd, 0x80, 0x14, 0xfe, 0xf2, 0xf7, 0xfe, 0xfa, 0xb1, 0xfd, 0x3f, 0x90, - 0xfe, 0xf9, 0x63, 0xfe, 0xea, 0x90, 0xfb, 0x2b, 0x35, 0xfd, 0x85, 0x5c, 0xfe, 0xa4, 0xad, 0xfd, - 0x93, 0xd1, 0xfe, 0x6a, 0x97, 0xff, 0x4a, 0xad, 0x1f, 0xa4, 0x5c, 0x2c, 0xec, 0xea, 0x13, 0xb2, - 0xd0, 0x09, 0xfc, 0x3c, 0x08, 0xd2, 0xdf, 0xff, 0xec, 0x7c, 0xf9, 0xad, 0x83, 0xef, 0x6f, 0x7f, - 0xf1, 0x6b, 0xdd, 0x04, 0x4f, 0x31, 0x08, 0x31, 0xc3, 0xfc, 0x10, 0x66, 0xfb, 0xf1, 0x6a, 0xf9, - 0xe5, 0x44, 0xf9, 0xc1, 0xe0, 0x00, 0x4f, 0x0d, 0xfe, 0x5a, 0x91, 0xfb, 0xef, 0x7e, 0x01, 0x43, - 0xa4, 0x00, 0xc8, 0x57, 0xfe, 0x92, 0x98, 0xfe, 0xfe, 0xba, 0xfc, 0x80, 0x77, 0xfd, 0x50, 0x76, - 0xff, 0x46, 0xad, 0xfd, 0xfd, 0xaa, 0xfb, 0x64, 0xd0, 0xfc, 0xd5, 0x7f, 0xfd, 0x0e, 0xac, 0xfd, - 0x6c, 0x3e, 0xff, 0xb0, 0x0b, 0x00, 0x9d, 0x54, 0x21, 0x86, 0xba, 0x2b, 0x5b, 0x65, 0x13, 0xf7, - 0x27, 0x0d, 0x8a, 0xa0, 0x0a, 0x6b, 0x5a, 0xff, 0x54, 0x82, 0xf8, 0x19, 0x8b, 0xf0, 0x01, 0xb4, - 0xf2, 0x2a, 0x7e, 0x03, 0xf1, 0x47, 0x06, 0x08, 0xbf, 0xfc, 0x38, 0x20, 0xfc, 0x31, 0x2c, 0xf8, - 0x70, 0xa0, 0xf8, 0x83, 0x54, 0x01, 0x41, 0x34, 0xfd, 0x72, 0x05, 0xfb, 0x9b, 0x72, 0x01, 0x04, - 0x4d, 0x01, 0x83, 0xf6, 0xfd, 0xc5, 0xcb, 0xfd, 0x3b, 0x17, 0xfe, 0x28, 0x2c, 0xfd, 0xec, 0x60, - 0xfe, 0xc5, 0xcd, 0xfd, 0xaa, 0xbd, 0xfb, 0xe2, 0x21, 0xfd, 0xcb, 0xea, 0xfc, 0x29, 0x77, 0xfd, - 0x81, 0x89, 0xff, 0xcf, 0x33, 0xff, 0x4c, 0xe8, 0x24, 0x56, 0xb1, 0x2a, 0x13, 0x28, 0x11, 0x19, - 0x4b, 0x10, 0x49, 0x40, 0x0c, 0x81, 0xc2, 0xff, 0x0f, 0x68, 0xf7, 0x33, 0x52, 0xf0, 0x48, 0x0c, - 0xf6, 0xc2, 0x50, 0x02, 0x10, 0x95, 0x02, 0xb5, 0xbc, 0xfc, 0xcb, 0xe1, 0xfd, 0x56, 0x7b, 0xf7, - 0x69, 0x0b, 0xf7, 0x72, 0xdb, 0x01, 0x78, 0xd4, 0xfb, 0x5d, 0xc3, 0xfa, 0xb9, 0xba, 0x02, 0x84, - 0x02, 0xff, 0xe3, 0x3b, 0xfe, 0x19, 0x08, 0x00, 0x42, 0x33, 0xfd, 0x90, 0xb5, 0xfc, 0x47, 0xb0, - 0xfe, 0x96, 0x57, 0xfd, 0x3e, 0x7b, 0xfb, 0x68, 0xc1, 0xfd, 0x6c, 0x3b, 0xfd, 0x07, 0x8a, 0xfc, - 0x53, 0x89, 0xfe, 0x7e, 0x2e, 0xff, 0x20, 0xa5, 0x29, 0xc0, 0xaa, 0x29, 0xd5, 0x01, 0x0d, 0x2b, - 0xb9, 0x13, 0xb0, 0x11, 0x0d, 0x9a, 0x7d, 0xff, 0x20, 0x23, 0xf8, 0xb7, 0x4c, 0xef, 0x93, 0x16, - 0xfa, 0xa3, 0xbf, 0x02, 0x41, 0xc4, 0xfc, 0xb0, 0xd6, 0xfb, 0xe6, 0x75, 0x00, 0xe2, 0xb6, 0xf7, - 0x7a, 0x83, 0xf5, 0x19, 0x29, 0x01, 0x97, 0x56, 0xfb, 0x2c, 0x02, 0xfa, 0x22, 0x95, 0x01, 0x27, - 0xc9, 0xfe, 0x98, 0x97, 0xff, 0x6e, 0x18, 0x00, 0xb0, 0x16, 0xfd, 0x16, 0xec, 0xfc, 0x9c, 0x94, - 0xfe, 0xd5, 0x52, 0xfd, 0x41, 0x45, 0xfb, 0x6a, 0x5d, 0xfe, 0x10, 0xb6, 0xfc, 0x2d, 0x59, 0xfb, - 0x12, 0x41, 0xff, 0xef, 0xa7, 0xff, 0x5e, 0xc4, 0x2e, 0x1d, 0x9e, 0x29, 0x5e, 0x38, 0x07, 0x2b, - 0xfd, 0x16, 0xa7, 0xd3, 0x0e, 0x1e, 0x25, 0xfd, 0x94, 0x18, 0xfa, 0xfb, 0x9c, 0xef, 0xdf, 0x76, - 0xfd, 0x69, 0x2b, 0x05, 0x61, 0x9d, 0xf6, 0xd3, 0x9e, 0xf8, 0x26, 0xb5, 0x03, 0x72, 0x4f, 0xf9, - 0x64, 0xf9, 0xf3, 0xab, 0x96, 0x01, 0x93, 0x87, 0xf9, 0xc9, 0x25, 0xf7, 0x3e, 0xe5, 0x03, 0x3f, - 0xcf, 0xfd, 0xe6, 0x68, 0xfe, 0xe0, 0xdb, 0x02, 0xf2, 0xe6, 0xfc, 0x13, 0x6e, 0xfc, 0x7c, 0xe5, - 0xfe, 0xe2, 0xba, 0xfd, 0x61, 0xa2, 0xfb, 0xc8, 0xae, 0xfd, 0x50, 0x93, 0xfc, 0xe0, 0xa2, 0xfb, - 0x9a, 0x9e, 0xff, 0xd5, 0x25, 0xff, 0xa1, 0x9e, 0x33, 0x60, 0x02, 0x2b, 0x9a, 0x42, 0x00, 0xcc, - 0x8f, 0x18, 0x48, 0x65, 0x12, 0xa6, 0x39, 0xf9, 0x51, 0xb9, 0xfa, 0xe7, 0xfb, 0xf1, 0x4f, 0x66, - 0x00, 0x8a, 0xaf, 0x08, 0xb0, 0x73, 0xf1, 0xe5, 0xc5, 0xf2, 0xda, 0x90, 0x05, 0xe9, 0x65, 0xfc, - 0xa1, 0x80, 0xf4, 0x44, 0x9c, 0xff, 0xa3, 0x36, 0xf7, 0x80, 0x12, 0xf7, 0xa9, 0xa3, 0x03, 0x4e, - 0x7f, 0xfc, 0x64, 0x94, 0xfe, 0xac, 0x4a, 0x04, 0xd3, 0x5d, 0xfd, 0x8f, 0xae, 0xfb, 0xa7, 0xde, - 0xfe, 0x98, 0x59, 0xfe, 0x3c, 0xb2, 0xfb, 0x9f, 0xca, 0xfd, 0x4e, 0x84, 0xfc, 0x44, 0x1f, 0xfb, - 0xb8, 0xb7, 0xff, 0x29, 0x7e, 0xff, 0x96, 0xb0, 0x39, 0xc7, 0x66, 0x2d, 0x15, 0x82, 0xf8, 0xba, - 0x4c, 0x17, 0x9c, 0x32, 0x16, 0x29, 0x6f, 0xf6, 0x1c, 0xe9, 0xf9, 0x4b, 0xc6, 0xf4, 0x0b, 0xbe, - 0x03, 0x3c, 0x96, 0x0c, 0x6e, 0xa2, 0xee, 0xb4, 0xf0, 0xea, 0x7a, 0x23, 0x05, 0xd0, 0x15, 0x02, - 0xe7, 0xfe, 0xf3, 0xa8, 0x6a, 0xfd, 0xd9, 0x91, 0xf7, 0x6f, 0xa5, 0xf4, 0xce, 0xc3, 0x03, 0xea, - 0xfa, 0xfc, 0x28, 0xd8, 0xfc, 0x22, 0xcf, 0x05, 0xe2, 0x22, 0xfe, 0x74, 0xf8, 0xfa, 0xc3, 0x03, - 0xff, 0xd0, 0x4f, 0xfe, 0xa8, 0xa6, 0xfb, 0x21, 0x56, 0xfe, 0xad, 0x24, 0xfd, 0x53, 0x36, 0xfa, - 0x6f, 0xb6, 0xff, 0xb3, 0x3b, 0x00, 0x64, 0x62, 0x41, 0x77, 0xc7, 0x33, 0x6f, 0x6a, 0xef, 0x75, - 0xa0, 0x0e, 0x93, 0x35, 0x19, 0x25, 0xbe, 0xf8, 0xb5, 0x20, 0xfb, 0x65, 0xa1, 0xf6, 0xa6, 0xae, - 0x03, 0x53, 0x7f, 0x10, 0x6b, 0x04, 0xf0, 0xca, 0x5a, 0xe3, 0xc2, 0x16, 0x03, 0xe4, 0xac, 0x06, - 0x8b, 0x81, 0xf4, 0x54, 0x98, 0xfc, 0x68, 0xba, 0xf6, 0xe9, 0x9c, 0xf3, 0x7a, 0x4e, 0x04, 0xc5, - 0x23, 0xfd, 0x5d, 0x4d, 0xfc, 0x36, 0x8a, 0x05, 0x70, 0x0e, 0xff, 0x04, 0xa8, 0xfb, 0x83, 0x88, - 0xfe, 0x93, 0xeb, 0xfd, 0x5d, 0x63, 0xfb, 0x91, 0x16, 0xff, 0x11, 0x36, 0xfe, 0x5e, 0x33, 0xfa, - 0x6e, 0x34, 0xff, 0x00, 0x4d, 0x00, 0x35, 0x19, 0x49, 0x79, 0x88, 0x3a, 0xf9, 0xc7, 0xe6, 0x4c, - 0x9a, 0x03, 0xe7, 0xac, 0x1a, 0x77, 0x1a, 0xfd, 0x8d, 0x33, 0xfd, 0x52, 0xa4, 0xf7, 0x8e, 0x47, - 0x02, 0xee, 0x15, 0x13, 0x6a, 0xcd, 0xf2, 0x31, 0x4f, 0xde, 0xa4, 0xa0, 0xfe, 0xaf, 0xc1, 0x08, - 0xaf, 0x57, 0xf7, 0x7d, 0xc5, 0xfb, 0x3c, 0xb5, 0xf5, 0xb9, 0x73, 0xf3, 0x51, 0x85, 0x03, 0x3d, - 0x91, 0xfd, 0x07, 0x25, 0xfc, 0xf0, 0x01, 0x05, 0xf9, 0xce, 0xff, 0x44, 0xa9, 0xfb, 0x8c, 0xc4, - 0xfd, 0x2e, 0x6b, 0xfd, 0xce, 0xb0, 0xfb, 0x13, 0x6c, 0xff, 0xd7, 0x81, 0xfe, 0x5c, 0x77, 0xfa, - 0x6f, 0x86, 0xfe, 0x28, 0x69, 0x00, 0xe6, 0x8b, 0x50, 0x72, 0x03, 0x41, 0x3f, 0x34, 0xdf, 0xca, - 0xf9, 0xf8, 0xc8, 0x4a, 0x1a, 0xe9, 0x36, 0x02, 0x46, 0x93, 0x00, 0x02, 0x17, 0xf8, 0x1b, 0xa0, - 0x00, 0x91, 0xd7, 0x14, 0x22, 0x88, 0xf6, 0x72, 0x6d, 0xdb, 0xde, 0x60, 0xf9, 0xa1, 0x06, 0x09, - 0x23, 0x0d, 0xfb, 0xdf, 0x2f, 0xfc, 0x0f, 0x49, 0xf4, 0x37, 0x1c, 0xf4, 0xee, 0xe9, 0x02, 0xbf, - 0xeb, 0xfc, 0x87, 0xab, 0xfc, 0xb2, 0xee, 0x04, 0xe6, 0xcb, 0xff, 0x36, 0x76, 0xfb, 0x87, 0x96, - 0xfd, 0x58, 0x28, 0xfd, 0xc2, 0xde, 0xfb, 0xab, 0x71, 0xff, 0x82, 0x0d, 0xfe, 0x6f, 0x17, 0xfb, - 0x40, 0xad, 0xfe, 0x55, 0x75, 0x00, 0x73, 0xa5, 0x59, 0x35, 0xce, 0x43, 0xc6, 0x4e, 0xd7, 0x1e, - 0x5b, 0xf2, 0xab, 0xae, 0x17, 0x83, 0x37, 0x06, 0x53, 0x59, 0x04, 0x2a, 0xb2, 0xf6, 0xa0, 0x6f, - 0xff, 0xe7, 0xa3, 0x17, 0x23, 0xd7, 0xf9, 0xbf, 0xb4, 0xd7, 0xe7, 0xe5, 0xf4, 0x0f, 0x0a, 0x09, - 0x88, 0x52, 0xfd, 0x21, 0x11, 0xfe, 0x4f, 0x21, 0xf3, 0x69, 0xaf, 0xf4, 0xf8, 0x83, 0x02, 0x51, - 0x96, 0xfa, 0x4d, 0xd2, 0xfd, 0x1d, 0x6b, 0x05, 0xd6, 0xe3, 0xfe, 0xd8, 0x08, 0xfb, 0xd7, 0xb6, - 0xfd, 0x86, 0x3c, 0xfd, 0x81, 0xda, 0xfa, 0xd8, 0x31, 0xff, 0x36, 0xf5, 0xfd, 0xf8, 0x8c, 0xfb, - 0x5b, 0x0d, 0xff, 0xd0, 0xba, 0xff, 0x42, 0x9e, 0x61, 0x0c, 0x77, 0x46, 0x14, 0xa5, 0xd0, 0xb5, - 0xc8, 0xee, 0x3c, 0x25, 0x15, 0x85, 0x06, 0x08, 0x6e, 0x5a, 0x08, 0x30, 0x42, 0xf4, 0x34, 0xef, - 0xfe, 0x28, 0xb5, 0x1d, 0x78, 0xba, 0xfc, 0x7d, 0x9c, 0xd2, 0x46, 0x15, 0xf2, 0x51, 0x9c, 0x09, - 0x08, 0xb9, 0xfd, 0x7f, 0xb9, 0x01, 0x86, 0x4d, 0xf4, 0x6e, 0x9a, 0xf3, 0xd6, 0x9e, 0x01, 0x86, - 0x24, 0xf9, 0x70, 0x3b, 0xff, 0x08, 0xca, 0x05, 0x9e, 0xbc, 0xfd, 0x40, 0x3d, 0xfb, 0x51, 0x6a, - 0xfe, 0x58, 0x2d, 0xfd, 0x71, 0x4f, 0xf9, 0x69, 0x41, 0xff, 0x2d, 0x9c, 0xfe, 0x94, 0x63, 0xfb, - 0x69, 0x2c, 0xff, 0xc4, 0x6b, 0xff, 0x06, 0x80, 0x68, 0x32, 0x35, 0x48, 0x9f, 0x9c, 0xca, 0x90, - 0xd7, 0xed, 0xdf, 0x8c, 0x12, 0x0c, 0xaa, 0x06, 0x3a, 0xb4, 0x0b, 0xc9, 0x67, 0xf0, 0x64, 0xf1, - 0xfe, 0x48, 0x07, 0x26, 0x54, 0x9e, 0xfc, 0x18, 0x02, 0xce, 0x85, 0x47, 0xf1, 0xb8, 0xa4, 0x07, - 0x8b, 0xce, 0xfd, 0x0f, 0x29, 0x06, 0xb5, 0xd1, 0xf5, 0xc4, 0xa5, 0xf1, 0xb2, 0x0b, 0x00, 0x7b, - 0x05, 0xf9, 0xa3, 0xa1, 0xff, 0x8b, 0xfa, 0x04, 0x9d, 0xdc, 0xfc, 0x3c, 0xd0, 0xfb, 0x67, 0x2d, - 0xff, 0xb8, 0x83, 0xfc, 0xf1, 0xe3, 0xf7, 0x95, 0xcf, 0xfe, 0x53, 0xf1, 0xfe, 0xab, 0x67, 0xfb, - 0x1d, 0xd6, 0xfe, 0xca, 0x71, 0xff, 0xb2, 0x5a, 0x6e, 0xd4, 0xab, 0x49, 0x03, 0xd1, 0xc5, 0xcb, - 0xc5, 0xee, 0xa2, 0x3c, 0x10, 0x23, 0x89, 0x03, 0x73, 0x27, 0x0e, 0x38, 0x25, 0xec, 0x94, 0xea, - 0xff, 0x3b, 0x4e, 0x2e, 0x36, 0x49, 0xfb, 0x98, 0x34, 0xcc, 0xc5, 0xd5, 0xf0, 0x17, 0x0c, 0x04, - 0x07, 0x9e, 0xfe, 0x42, 0xf0, 0x09, 0x3e, 0xca, 0xf7, 0x5a, 0xf6, 0xef, 0x50, 0xb6, 0xfe, 0x70, - 0xfb, 0xf9, 0xb7, 0x55, 0xfe, 0x05, 0xa6, 0x03, 0x6d, 0x1a, 0xfd, 0xb5, 0x98, 0xfc, 0xce, 0xb5, - 0xff, 0x64, 0xaf, 0xfb, 0x07, 0xd1, 0xf6, 0x3e, 0x27, 0xfe, 0xc4, 0x60, 0xff, 0x59, 0x89, 0xfb, - 0xc2, 0x7c, 0xfe, 0x81, 0x99, 0xff, 0x13, 0x54, 0x74, 0xc2, 0x47, 0x4a, 0x4e, 0x1b, 0xc2, 0x38, - 0xf1, 0xf0, 0x8f, 0x60, 0x0d, 0x59, 0xba, 0x00, 0xb3, 0xa2, 0x0f, 0x26, 0xc0, 0xe7, 0xa5, 0xf0, - 0x01, 0x50, 0x39, 0x34, 0x97, 0xd3, 0xfa, 0x4c, 0x4e, 0xcd, 0xcd, 0x81, 0xef, 0xd4, 0xb2, 0x00, - 0x40, 0x36, 0xff, 0x69, 0xcb, 0x0c, 0x4a, 0x7e, 0xfa, 0x77, 0xb3, 0xee, 0xfc, 0x34, 0xfe, 0xe5, - 0x17, 0xfb, 0xa5, 0x0d, 0xfc, 0x6a, 0x02, 0x02, 0xba, 0x4d, 0xfe, 0x33, 0xd2, 0xfd, 0xdf, 0x63, - 0xff, 0xd8, 0xf6, 0xfa, 0x4b, 0x43, 0xf6, 0x0e, 0xbd, 0xfd, 0x9f, 0xf4, 0xff, 0x3b, 0xa1, 0xfb, - 0x6c, 0xfe, 0xfd, 0x44, 0xb1, 0xff, 0x1e, 0xf0, 0x77, 0x9a, 0xe3, 0x4c, 0x71, 0xc4, 0xbf, 0xc5, - 0x6b, 0xf1, 0x93, 0xd6, 0x0a, 0x06, 0x48, 0xfe, 0x33, 0x37, 0x10, 0x46, 0xde, 0xe3, 0x19, 0xb6, - 0x02, 0x77, 0xdf, 0x36, 0xb0, 0xde, 0xfc, 0xa8, 0x6b, 0xd0, 0xbc, 0xa2, 0xec, 0x05, 0xff, 0xfd, - 0xb1, 0x9a, 0xfe, 0x30, 0xb5, 0x0e, 0x22, 0xbb, 0xfd, 0x4f, 0x65, 0xed, 0x54, 0x57, 0xfe, 0x9b, - 0xd0, 0xfb, 0x71, 0x33, 0xf9, 0x52, 0x21, 0x00, 0xc9, 0xcc, 0xff, 0xf4, 0x00, 0xff, 0xcb, 0x31, - 0xfe, 0x65, 0xb1, 0xfa, 0xff, 0xbf, 0xf5, 0xa8, 0x60, 0xfd, 0xbb, 0xf7, 0x00, 0xfb, 0xdc, 0xfa, - 0x65, 0x54, 0xfd, 0x38, 0x7d, 0x00, 0xdb, 0x88, 0x7b, 0x67, 0xb3, 0x4e, 0x5b, 0xce, 0xbe, 0x18, - 0x94, 0xf1, 0x56, 0x74, 0x07, 0xce, 0x76, 0xfd, 0xae, 0xc9, 0x0f, 0xde, 0x25, 0xe0, 0x29, 0x62, - 0x03, 0xa4, 0xeb, 0x36, 0x7b, 0x4e, 0x00, 0x73, 0xae, 0xd4, 0x0d, 0xbe, 0xe9, 0x19, 0xe6, 0xfb, - 0x9e, 0x08, 0xfd, 0xe1, 0x67, 0x10, 0x0e, 0xdb, 0x00, 0x7f, 0x66, 0xec, 0xd3, 0xf6, 0xfe, 0xd3, - 0x20, 0xfc, 0xea, 0x9e, 0xf6, 0xe8, 0x62, 0xfe, 0x23, 0x26, 0x01, 0x67, 0x9b, 0xff, 0x0e, 0x48, - 0xfd, 0x3e, 0xf0, 0xfa, 0xa6, 0xb6, 0xf4, 0xf5, 0xb2, 0xfd, 0x9e, 0xda, 0x01, 0x0a, 0xa2, 0xf9, - 0xa5, 0x9d, 0xfd, 0x43, 0x14, 0x01, 0x31, 0x5c, 0x7e, 0x97, 0x01, 0x50, 0x5b, 0x78, 0xbf, 0x7c, - 0x67, 0xf1, 0x16, 0xfe, 0x03, 0xa2, 0x5c, 0xfd, 0xfe, 0xb5, 0x0e, 0x14, 0x6a, 0xdd, 0x10, 0x8d, - 0x02, 0xf7, 0x4b, 0x35, 0x86, 0x2e, 0x05, 0x36, 0xf8, 0xd8, 0x97, 0x9c, 0xe7, 0x4b, 0x5e, 0xfa, - 0x5c, 0xd4, 0xfa, 0x6f, 0xb1, 0x11, 0xeb, 0x77, 0x03, 0x38, 0x25, 0xec, 0x4e, 0x6b, 0xff, 0xee, - 0xf7, 0xfb, 0x7f, 0xf7, 0xf4, 0xb1, 0xde, 0xfc, 0x24, 0xdb, 0x01, 0x42, 0xc0, 0xff, 0x36, 0xb9, - 0xfc, 0xc4, 0x9d, 0xfb, 0x60, 0xff, 0xf3, 0xf2, 0x95, 0xfd, 0xa0, 0x3a, 0x02, 0x7e, 0x83, 0xf9, - 0x7d, 0xea, 0xfd, 0x58, 0x7b, 0x00, 0x90, 0xbb, 0x7e, 0x9a, 0x23, 0x53, 0x6e, 0xf4, 0xc1, 0x6a, - 0xd8, 0xef, 0x2d, 0xaa, 0x01, 0x68, 0xf9, 0xfb, 0xa6, 0x5a, 0x0e, 0xc0, 0x9f, 0xdc, 0xc4, 0xb7, - 0xfd, 0x5e, 0xb1, 0x33, 0x1f, 0x98, 0x0b, 0x4d, 0xa3, 0xdc, 0x2d, 0xd6, 0xe6, 0x41, 0xd7, 0xf8, - 0x91, 0x93, 0xf8, 0xfb, 0x49, 0x12, 0x2a, 0x85, 0x05, 0x5c, 0x19, 0xed, 0xe6, 0x40, 0xff, 0xaa, - 0x41, 0xfb, 0x35, 0x4e, 0xf4, 0xb0, 0xcc, 0xfb, 0x18, 0xcb, 0x01, 0x27, 0x85, 0xff, 0x13, 0x65, - 0xfc, 0x84, 0xc8, 0xfc, 0x12, 0xd6, 0xf3, 0x73, 0x65, 0xfc, 0xd4, 0xb5, 0x02, 0x36, 0x1e, 0xfa, - 0xa1, 0x3f, 0xfd, 0xb8, 0xe2, 0xff, 0x8a, 0x99, 0x7c, 0x4d, 0x39, 0x57, 0x3a, 0xa3, 0xc6, 0x30, - 0x41, 0xee, 0x5f, 0x29, 0x00, 0x24, 0xae, 0xf8, 0x26, 0x15, 0x0f, 0x6c, 0x8e, 0xdd, 0xbb, 0x01, - 0xf5, 0xb2, 0xae, 0x32, 0x13, 0xfb, 0x12, 0x8e, 0x90, 0xdf, 0x54, 0xcd, 0xe7, 0xc0, 0x4d, 0xf7, - 0x3f, 0x33, 0xf6, 0x2a, 0xe2, 0x11, 0x97, 0x37, 0x07, 0xf3, 0x82, 0xef, 0xe2, 0x6d, 0xfe, 0x8d, - 0x17, 0xfa, 0x18, 0x26, 0xf4, 0x6f, 0x82, 0xfb, 0xb6, 0x7a, 0x01, 0x1e, 0x67, 0xfe, 0x90, 0xdb, - 0xfc, 0x47, 0xeb, 0xfd, 0x41, 0xac, 0xf3, 0x98, 0xa6, 0xfb, 0x2a, 0x29, 0x02, 0x7d, 0x74, 0xfa, - 0x0c, 0x08, 0xfd, 0x45, 0x0a, 0xff, 0x20, 0x50, 0x78, 0x87, 0x5d, 0x5b, 0xb7, 0x51, 0xcd, 0x64, - 0xa9, 0xed, 0x14, 0x1a, 0xff, 0x00, 0x16, 0xf4, 0xfd, 0xb0, 0x10, 0xf7, 0xfb, 0xde, 0x9b, 0xcc, - 0xe9, 0x55, 0x12, 0x32, 0xcb, 0xe1, 0x1a, 0x25, 0x27, 0xe2, 0x71, 0xc7, 0xe9, 0xe1, 0xd0, 0xf6, - 0xe9, 0xa0, 0xf3, 0xa9, 0x0e, 0x10, 0xef, 0x45, 0x09, 0x98, 0xb6, 0xf2, 0xfb, 0x45, 0xfd, 0x9f, - 0x79, 0xf8, 0xbb, 0x5d, 0xf4, 0x90, 0x49, 0xfc, 0xf2, 0x97, 0x00, 0x74, 0x04, 0xfd, 0xe8, 0x97, - 0xfd, 0x65, 0xcd, 0xfe, 0xaa, 0xd0, 0xf3, 0x2f, 0x84, 0xfa, 0x8e, 0x53, 0x01, 0x76, 0xcc, 0xfa, - 0x23, 0x86, 0xfc, 0x9b, 0xe8, 0xfe, 0x74, 0x25, 0x72, 0xf6, 0x84, 0x5e, 0x44, 0x41, 0xd6, 0x47, - 0x80, 0xee, 0xfa, 0x59, 0xfd, 0x35, 0x7a, 0xef, 0x90, 0x66, 0x12, 0x3c, 0x5b, 0xe0, 0x21, 0x2c, - 0xde, 0x81, 0xf0, 0x2f, 0x51, 0xc5, 0x22, 0x58, 0x33, 0xe5, 0x62, 0x29, 0xec, 0x88, 0x17, 0xf8, - 0x01, 0x67, 0xf0, 0x9a, 0x90, 0x0c, 0xe2, 0xdc, 0x0b, 0x9e, 0x11, 0xf6, 0x62, 0x90, 0xfb, 0x53, - 0x77, 0xf7, 0xe8, 0xf5, 0xf4, 0x71, 0x74, 0xfc, 0x94, 0x55, 0x00, 0xca, 0x6e, 0xfb, 0x9a, 0x8d, - 0xfd, 0xf9, 0xeb, 0xff, 0xd8, 0x2b, 0xf3, 0xcf, 0xe6, 0xf9, 0xe1, 0x72, 0x00, 0x0b, 0x03, 0xfa, - 0x0a, 0x6f, 0xfd, 0x64, 0xaf, 0xff, 0x81, 0x08, 0x6b, 0x97, 0xed, 0x60, 0x5b, 0xcd, 0xe0, 0xe4, - 0x39, 0xf0, 0x54, 0xb6, 0xfa, 0x02, 0x3f, 0xec, 0x93, 0xda, 0x13, 0xd1, 0x0f, 0xe2, 0x1e, 0x74, - 0xd4, 0x4b, 0x11, 0x2a, 0x06, 0x7b, 0x2a, 0xd0, 0x56, 0xea, 0x80, 0x98, 0xed, 0x17, 0x42, 0xfc, - 0x24, 0xcb, 0xec, 0x4e, 0x88, 0x07, 0xba, 0x73, 0x0f, 0x71, 0x32, 0xf8, 0xaa, 0xf9, 0xfa, 0x42, - 0x82, 0xf7, 0xc3, 0x13, 0xf5, 0x96, 0x5f, 0xfc, 0xcf, 0x84, 0x00, 0xbe, 0xd7, 0xfa, 0x67, 0x2e, - 0xfb, 0xa1, 0xfd, 0x00, 0xd8, 0x49, 0xf4, 0x80, 0xd1, 0xf7, 0xc2, 0x01, 0x00, 0x33, 0x9c, 0xfa, - 0xbc, 0x75, 0xfe, 0x57, 0x7e, 0x00, 0x24, 0x6c, 0x64, 0x8e, 0x05, 0x62, 0xe3, 0xea, 0xe9, 0x34, - 0x03, 0xf2, 0x77, 0xa2, 0xf9, 0x54, 0x5c, 0xea, 0xcd, 0xb4, 0x11, 0x27, 0x59, 0xe4, 0x11, 0x92, - 0xcf, 0xc2, 0x7b, 0x1f, 0xd5, 0xb8, 0x2f, 0x58, 0x26, 0xf3, 0x19, 0x1b, 0xed, 0x5f, 0xeb, 0x00, - 0xae, 0x2e, 0xeb, 0xef, 0x3e, 0x00, 0xd7, 0x1b, 0x13, 0x1c, 0x5b, 0xfa, 0x4f, 0x16, 0xfa, 0xb5, - 0x16, 0xf9, 0xcc, 0x3f, 0xf4, 0xdb, 0x38, 0xfb, 0x1f, 0x54, 0x01, 0x20, 0xfa, 0xf9, 0x9e, 0x3d, - 0xf8, 0xb0, 0x78, 0x01, 0xde, 0xe5, 0xf4, 0x08, 0xd2, 0xf6, 0xfb, 0x01, 0x01, 0xdf, 0x92, 0xfa, - 0xec, 0xe5, 0xfe, 0x68, 0x5d, 0x02, 0xe6, 0xa3, 0x5f, 0x60, 0xa2, 0x61, 0xe8, 0xf8, 0xee, 0x25, - 0x79, 0xf3, 0x88, 0x9e, 0xfc, 0x54, 0xc0, 0xe9, 0x49, 0x1e, 0x0a, 0xc2, 0x8a, 0xe6, 0x1f, 0x15, - 0xd0, 0x81, 0xf6, 0x12, 0x17, 0x7e, 0x31, 0x1d, 0x84, 0xfd, 0x63, 0x59, 0xec, 0x2d, 0x09, 0x04, - 0x2e, 0xac, 0xeb, 0x1e, 0xff, 0xf8, 0xe2, 0xf5, 0x14, 0x8b, 0xa3, 0xfd, 0x8e, 0x20, 0xf9, 0xdc, - 0xa9, 0xfa, 0xce, 0x20, 0xf4, 0x14, 0xb0, 0xf7, 0xfc, 0xf4, 0x00, 0xd8, 0x68, 0xfb, 0x81, 0xb3, - 0xf4, 0xd2, 0x88, 0xff, 0x67, 0x3c, 0xf7, 0x41, 0x1f, 0xf7, 0xba, 0x83, 0x01, 0x16, 0xe0, 0xfa, - 0x35, 0x23, 0xff, 0x13, 0xd0, 0x03, 0x30, 0x02, 0x5e, 0x2b, 0xa0, 0x5d, 0x79, 0x99, 0xf0, 0x98, - 0xe3, 0xf7, 0xd2, 0xa4, 0x00, 0xce, 0x8d, 0xea, 0xe6, 0xfe, 0x00, 0xbb, 0x4c, 0xe7, 0xd4, 0xc1, - 0xd3, 0x2f, 0x4c, 0x08, 0x14, 0x3a, 0x32, 0x56, 0xb7, 0x04, 0x80, 0xdf, 0xec, 0x20, 0x9d, 0x07, - 0xd9, 0xb8, 0xea, 0xb0, 0xdd, 0xf4, 0x84, 0xe9, 0x15, 0x84, 0x0d, 0x00, 0x3e, 0x4a, 0xfa, 0x2b, - 0x8b, 0xfb, 0xed, 0x10, 0xf3, 0xea, 0x94, 0xf4, 0x4b, 0xfd, 0x00, 0xd7, 0x09, 0xfb, 0x2c, 0x2b, - 0xf2, 0xc2, 0x0d, 0x00, 0xe0, 0x4c, 0xf8, 0x24, 0xba, 0xf7, 0x9d, 0xcd, 0x02, 0x2a, 0xc6, 0xfa, - 0x33, 0x4b, 0xff, 0x80, 0x92, 0x04, 0x9d, 0xe8, 0x5c, 0x79, 0x1d, 0x59, 0x60, 0x48, 0xf0, 0x13, - 0xd9, 0xfc, 0x0f, 0xae, 0x05, 0xd8, 0x69, 0xea, 0x86, 0x19, 0xf8, 0x02, 0x95, 0xe9, 0x00, 0xa9, - 0xd8, 0xd4, 0xf9, 0xfc, 0x8c, 0xdb, 0x32, 0xc4, 0xd3, 0x0b, 0xad, 0xe5, 0xe9, 0xc8, 0x2c, 0x0c, - 0x5b, 0xae, 0xec, 0xfb, 0x59, 0xef, 0xc3, 0x91, 0x17, 0x32, 0x35, 0x03, 0x41, 0x46, 0xfa, 0x9f, - 0x8b, 0xfb, 0xe8, 0x9d, 0xf3, 0xc8, 0xff, 0xf2, 0x02, 0xfc, 0xfd, 0xfc, 0xba, 0xfa, 0xe4, 0x6e, - 0xf1, 0x1c, 0xae, 0x00, 0xee, 0xb9, 0xfa, 0xea, 0xd4, 0xf6, 0xc9, 0xd4, 0x02, 0x11, 0xfa, 0xfb, - 0xbf, 0x84, 0xff, 0x7a, 0x86, 0x04, 0xc4, 0xb2, 0x5d, 0x09, 0x81, 0x54, 0x39, 0x0c, 0xed, 0x87, - 0x56, 0x00, 0x3a, 0x2e, 0x0a, 0x53, 0xf7, 0xe9, 0x57, 0x9f, 0xf1, 0xea, 0xfb, 0xec, 0x7c, 0x6c, - 0xe0, 0x74, 0x1b, 0xf3, 0x47, 0x1a, 0x2e, 0xcc, 0xaa, 0x14, 0x46, 0x63, 0xe5, 0x83, 0x03, 0x0c, - 0xab, 0x58, 0xf5, 0x19, 0x0e, 0xe9, 0x2d, 0x31, 0x17, 0x49, 0x20, 0x09, 0xc0, 0x93, 0xf6, 0x24, - 0x52, 0xfc, 0x83, 0x69, 0xf6, 0x30, 0xba, 0xf0, 0xe7, 0x4a, 0xfb, 0xdf, 0x9a, 0xfa, 0x71, 0x03, - 0xf1, 0xef, 0xb5, 0x00, 0x5f, 0x54, 0xfe, 0x14, 0x67, 0xf5, 0xb9, 0x2d, 0x01, 0xdc, 0x9f, 0xfe, - 0xbe, 0x7f, 0xfe, 0x8e, 0xff, 0x03, 0xfb, 0x36, 0x5c, 0x4a, 0x0b, 0x51, 0xff, 0xd5, 0xea, 0xf7, - 0xbd, 0x03, 0xb5, 0x67, 0x0e, 0x65, 0xfa, 0xe8, 0x79, 0x1d, 0xee, 0x53, 0xd1, 0xee, 0x18, 0x2a, - 0xe6, 0x29, 0xdb, 0xec, 0x15, 0xba, 0x26, 0xd2, 0xfb, 0x1d, 0x88, 0x1a, 0xe5, 0x74, 0x41, 0x05, - 0xa3, 0x59, 0xfe, 0x87, 0xd7, 0xe7, 0xf4, 0x75, 0x11, 0xcc, 0xae, 0x10, 0x60, 0x68, 0xf6, 0x06, - 0x5b, 0xf9, 0x54, 0xbb, 0xf9, 0x0d, 0x89, 0xf0, 0x2e, 0x89, 0xf9, 0x09, 0x83, 0xfa, 0x2c, 0x0f, - 0xf0, 0x52, 0xe5, 0xff, 0x75, 0x7d, 0x00, 0xa4, 0xa7, 0xf5, 0x84, 0x4f, 0xff, 0x9b, 0x59, 0xff, - 0x3d, 0x62, 0xfe, 0x63, 0x7d, 0x03, 0x19, 0x8b, 0x5a, 0x0d, 0x98, 0x4b, 0x58, 0xda, 0xe8, 0x79, - 0x50, 0x09, 0xc8, 0x36, 0x10, 0xb2, 0xdb, 0xe6, 0x98, 0x79, 0xef, 0x9d, 0x95, 0xf0, 0x08, 0xc3, - 0xe7, 0x14, 0x34, 0xe9, 0x62, 0xae, 0x21, 0xb7, 0xd4, 0x22, 0xdd, 0x5e, 0xe6, 0xf4, 0x17, 0x00, - 0xaa, 0xcc, 0x00, 0x73, 0x6a, 0xea, 0xd6, 0x12, 0x0f, 0xf0, 0xbe, 0x12, 0x5b, 0xa0, 0xf8, 0x17, - 0x5c, 0xf7, 0x0d, 0x81, 0xfb, 0xba, 0x02, 0xf2, 0xad, 0x0d, 0xf8, 0xd6, 0x51, 0xfc, 0x33, 0x12, - 0xef, 0x1f, 0xde, 0xfb, 0xc9, 0x18, 0x01, 0x60, 0x42, 0xf7, 0x2a, 0x09, 0xff, 0xc9, 0x1f, 0xff, - 0xf7, 0xd2, 0xfd, 0x49, 0x08, 0x03, 0x41, 0xd4, 0x58, 0x2e, 0x4f, 0x47, 0x77, 0x82, 0xe6, 0x19, - 0x6a, 0x0d, 0x8f, 0xf0, 0x10, 0x3a, 0x7d, 0xe2, 0x63, 0x6f, 0xf2, 0x2c, 0xc5, 0xf6, 0xd5, 0x84, - 0xe9, 0x57, 0x53, 0xe3, 0xb8, 0xf3, 0x1b, 0x7d, 0xd7, 0x28, 0x85, 0xc8, 0xe5, 0x97, 0xc0, 0xf9, - 0x69, 0x31, 0x07, 0xe9, 0xe3, 0xeb, 0xd7, 0x6b, 0x09, 0x08, 0x9f, 0x15, 0x42, 0xe3, 0xfb, 0xac, - 0x81, 0xf6, 0x77, 0x58, 0xfc, 0xaa, 0x0e, 0xf3, 0xce, 0xc2, 0xf7, 0x1b, 0xeb, 0xfe, 0x9a, 0xa0, - 0xef, 0x0e, 0x90, 0xf5, 0xd2, 0x14, 0xff, 0x13, 0xbb, 0xf9, 0xac, 0x7e, 0xff, 0x25, 0xbc, 0x00, - 0x54, 0xfe, 0xfc, 0x6a, 0xe1, 0xff, 0xb8, 0xb1, 0x55, 0x0b, 0x7a, 0x45, 0x47, 0xd6, 0xe1, 0x81, - 0xf7, 0x0e, 0xdb, 0xd2, 0x17, 0x8b, 0x26, 0xde, 0xd6, 0xf9, 0xf1, 0x8a, 0x4c, 0xfd, 0x83, 0x17, - 0xed, 0x1c, 0x97, 0xdf, 0x5e, 0xef, 0x11, 0x78, 0xb7, 0x2d, 0xa8, 0xc9, 0xea, 0xfc, 0x7e, 0xf1, - 0x43, 0xfa, 0x0b, 0xc3, 0x82, 0xf0, 0x81, 0x1e, 0x00, 0xd4, 0x34, 0x17, 0x1c, 0xeb, 0x02, 0xf5, - 0x81, 0xf4, 0x86, 0xa1, 0xfd, 0xff, 0x01, 0xf5, 0xa7, 0x8e, 0xf5, 0x22, 0x80, 0x02, 0xd5, 0x8c, - 0xf1, 0x36, 0x4c, 0xef, 0x33, 0xa2, 0xfc, 0x0e, 0x54, 0xfb, 0x86, 0xec, 0xfe, 0x68, 0xc4, 0x02, - 0xa1, 0x85, 0xfe, 0x41, 0x12, 0xfc, 0xed, 0x78, 0x53, 0xd0, 0xef, 0x40, 0x09, 0x3d, 0xdf, 0x99, - 0xeb, 0x10, 0xc0, 0x2d, 0x1c, 0x71, 0xed, 0xdf, 0x24, 0x6b, 0xef, 0x18, 0xc7, 0xfe, 0xfb, 0xa5, - 0xf5, 0x0b, 0x20, 0xdd, 0xa5, 0x7f, 0x06, 0x1f, 0x70, 0x31, 0xdd, 0xd1, 0xf0, 0xd8, 0x5a, 0xec, - 0xec, 0xe5, 0x0d, 0x30, 0x59, 0xf5, 0x21, 0x8f, 0xfa, 0x3d, 0x0f, 0x14, 0x55, 0x8b, 0x08, 0xf1, - 0x73, 0xf7, 0xf9, 0x63, 0xfd, 0xb9, 0xf5, 0xf6, 0x49, 0x96, 0xf5, 0x04, 0x3f, 0x02, 0x08, 0x5a, - 0xf3, 0xfd, 0x49, 0xee, 0xff, 0xe9, 0xfa, 0x68, 0x42, 0xfa, 0x14, 0x97, 0xfd, 0x3c, 0x4c, 0x04, - 0xb4, 0x7d, 0x00, 0x04, 0xa2, 0xfb, 0xb2, 0xa4, 0x4f, 0x20, 0x46, 0x3b, 0x3e, 0x86, 0xde, 0x62, - 0x8f, 0x14, 0xf2, 0xcd, 0x1d, 0x2f, 0x13, 0xe0, 0x0f, 0x6e, 0xf1, 0x42, 0xb0, 0xff, 0x62, 0xf1, - 0xf6, 0x08, 0xb2, 0xde, 0x8f, 0x68, 0x01, 0x67, 0x3d, 0x2e, 0x8b, 0x5a, 0xf4, 0xa4, 0x64, 0xec, - 0x9a, 0x36, 0x0f, 0xca, 0x18, 0xf8, 0xd8, 0x7f, 0xf6, 0xfc, 0xed, 0x10, 0x95, 0x50, 0x0a, 0x59, - 0x67, 0xfa, 0x03, 0x06, 0xff, 0xc0, 0xef, 0xf7, 0xe7, 0x9d, 0xf6, 0xbc, 0x4c, 0x00, 0xad, 0x7d, - 0xf3, 0xf3, 0x78, 0xf0, 0xef, 0x9a, 0xfa, 0x02, 0x56, 0xf9, 0x8e, 0x23, 0xfb, 0x3a, 0x55, 0x03, - 0xee, 0xd7, 0x01, 0xe8, 0x10, 0xfd, 0x9f, 0x62, 0x4a, 0x5a, 0xa1, 0x34, 0xf9, 0x06, 0xe1, 0x32, - 0x6f, 0x18, 0x42, 0x26, 0x1c, 0x14, 0x7e, 0xe1, 0x5a, 0xce, 0xf4, 0x22, 0x51, 0xff, 0x70, 0xca, - 0xf6, 0x32, 0x36, 0xe1, 0x3b, 0x13, 0xff, 0x6f, 0x60, 0x29, 0xd3, 0x40, 0xf6, 0x56, 0xb2, 0xed, - 0xfc, 0x05, 0x10, 0xd2, 0x96, 0xfb, 0xb3, 0xe0, 0xf2, 0x7b, 0x53, 0x0d, 0xae, 0xbb, 0x0c, 0x6e, - 0xc5, 0xf9, 0x90, 0xcb, 0xff, 0xe2, 0xef, 0xfb, 0x12, 0xe3, 0xf5, 0x05, 0x18, 0xff, 0x2b, 0x61, - 0xf4, 0xfb, 0x83, 0xf0, 0xe0, 0x75, 0xfc, 0x4d, 0x9b, 0xfa, 0xa4, 0x9d, 0xf8, 0xd2, 0xa2, 0x00, - 0xc4, 0xcc, 0x01, 0x77, 0x86, 0xfe, 0xf5, 0x73, 0x43, 0x25, 0xe7, 0x2e, 0xd0, 0xeb, 0xe5, 0xac, - 0x89, 0x1a, 0x50, 0x22, 0x1a, 0x05, 0x3e, 0xe4, 0x83, 0x13, 0xf7, 0xcb, 0x50, 0xff, 0x87, 0xdb, - 0xf7, 0x78, 0x90, 0xe3, 0x8d, 0x6d, 0xfc, 0x7c, 0xd6, 0x24, 0x44, 0x49, 0xf9, 0x77, 0x87, 0xee, - 0xe0, 0xc9, 0x0e, 0x7b, 0xe1, 0xff, 0x2f, 0xfc, 0xf1, 0xd7, 0xc2, 0x08, 0xb7, 0xbd, 0x0d, 0x74, - 0x85, 0xfa, 0xd5, 0x39, 0xfe, 0x23, 0x48, 0xfe, 0x2b, 0x47, 0xf8, 0x39, 0x7f, 0xfd, 0x8b, 0x3a, - 0xf5, 0x86, 0x34, 0xf2, 0x47, 0xa9, 0xfc, 0x01, 0xa3, 0xfc, 0x6a, 0x39, 0xf8, 0xd3, 0xe2, 0xfd, - 0x04, 0x18, 0x01, 0xe0, 0xb0, 0xfe, 0xe7, 0xf1, 0x41, 0x6b, 0xa8, 0x26, 0xfb, 0x66, 0xe0, 0x06, - 0xb2, 0x20, 0x07, 0x6a, 0x24, 0xad, 0xe5, 0xe1, 0x31, 0x48, 0xed, 0x7d, 0x0d, 0x02, 0xb7, 0xa4, - 0xfc, 0x8a, 0x58, 0xe9, 0xc3, 0xdc, 0x01, 0xe3, 0xae, 0x18, 0x95, 0xd6, 0xf1, 0x42, 0xbd, 0xf4, - 0xc6, 0x8e, 0x0d, 0x03, 0xff, 0xfd, 0xf9, 0xc8, 0xf7, 0x32, 0x92, 0x07, 0x7c, 0x89, 0x05, 0x57, - 0xc9, 0xfb, 0x98, 0xd1, 0x02, 0xc7, 0x09, 0x00, 0x95, 0xaf, 0xfe, 0x8c, 0xab, 0x04, 0x72, 0x54, - 0xfb, 0xcb, 0x70, 0xf9, 0x0c, 0xb7, 0x00, 0x65, 0xae, 0xfc, 0x0a, 0x42, 0xf9, 0xd5, 0x09, 0xfe, - 0x21, 0x2c, 0xfc, 0x17, 0xbc, 0xf8, 0xbc, 0x8f, 0x38, 0xd6, 0x74, 0x23, 0x04, 0x3e, 0xe8, 0x21, - 0x26, 0x1d, 0x50, 0xb9, 0x1f, 0x01, 0x3b, 0xe8, 0xff, 0xb4, 0xf1, 0x46, 0xd3, 0x00, 0xc4, 0x5b, - 0xfc, 0x2e, 0x06, 0xed, 0x58, 0x2c, 0x00, 0x03, 0xea, 0x14, 0x43, 0x24, 0xf5, 0xe3, 0x5b, 0xf5, - 0x24, 0x39, 0x0b, 0x78, 0xe4, 0xfe, 0xba, 0xda, 0xf7, 0x1b, 0xe8, 0x05, 0xf4, 0xb5, 0x05, 0x17, - 0x9c, 0xfc, 0xb2, 0xab, 0x01, 0x7a, 0xfc, 0xff, 0xa6, 0x68, 0xff, 0x52, 0xcb, 0x03, 0x3f, 0x28, - 0xfb, 0x9e, 0x14, 0xfa, 0x79, 0xb5, 0x00, 0x82, 0xa2, 0xfc, 0xd3, 0x2e, 0xfa, 0xf9, 0xfd, 0xfe, - 0xa5, 0x4d, 0xfd, 0xdc, 0x8c, 0xfa, 0x72, 0xfb, 0x2f, 0xb1, 0x49, 0x21, 0x0a, 0xad, 0xef, 0x92, - 0x72, 0x18, 0xbe, 0x06, 0x1c, 0x37, 0xbb, 0xef, 0x30, 0x7a, 0xf4, 0x95, 0x4f, 0xff, 0x3d, 0x3a, - 0xfd, 0xc1, 0xf9, 0xef, 0x47, 0xaf, 0xfe, 0xbf, 0x18, 0x12, 0x48, 0x5b, 0xf8, 0x7e, 0xde, 0xf5, - 0x89, 0xbf, 0x08, 0x83, 0x81, 0x00, 0xf6, 0xf6, 0xf8, 0x51, 0x17, 0x04, 0x09, 0xaf, 0x05, 0xa1, - 0xf6, 0xfd, 0xa6, 0x1b, 0x01, 0x0b, 0xd1, 0xff, 0xdd, 0x78, 0xff, 0xe7, 0x37, 0x03, 0xc5, 0x39, - 0xfc, 0x29, 0x5d, 0xfa, 0xec, 0xdd, 0xff, 0x44, 0x71, 0xfd, 0x6b, 0x0e, 0xfb, 0xbc, 0xa7, 0xff, - 0xfb, 0xdf, 0xfe, 0x26, 0x9c, 0xfb, 0xc9, 0x50, 0x28, 0x73, 0x11, 0x1f, 0x62, 0x62, 0xf5, 0xdb, - 0xcb, 0x13, 0xb4, 0x8b, 0x19, 0xc0, 0x24, 0xf6, 0x21, 0x0a, 0xf6, 0x2c, 0xb7, 0xfe, 0xb9, 0x62, - 0xfe, 0xc0, 0x29, 0xf2, 0x3d, 0x73, 0xfd, 0xc7, 0x70, 0x0f, 0x19, 0xca, 0xfa, 0x62, 0x41, 0xf6, - 0x34, 0x5f, 0x06, 0xfd, 0x79, 0x01, 0x8f, 0x39, 0xfa, 0x9a, 0xfc, 0x02, 0x4d, 0xf0, 0x04, 0x65, - 0x8b, 0xfe, 0x97, 0x3b, 0x01, 0x28, 0xa8, 0xff, 0x8f, 0xf8, 0xfe, 0xd5, 0xaf, 0x02, 0x3a, 0xe5, - 0xfc, 0xfd, 0xd4, 0xfa, 0x3d, 0x67, 0xff, 0x35, 0x51, 0xfe, 0xb4, 0x7d, 0xfc, 0xcb, 0x27, 0xff, - 0xa6, 0x0a, 0xff, 0x30, 0x06, 0xfd, 0x0d, 0xdb, 0x21, 0xf3, 0xd3, 0x1c, 0xac, 0xa7, 0xf9, 0x0d, - 0x61, 0x10, 0x52, 0xd2, 0x17, 0x6c, 0xd1, 0xfa, 0x3c, 0xc0, 0xf7, 0x3a, 0x6e, 0xff, 0x48, 0x76, - 0xff, 0x87, 0xc9, 0xf3, 0xac, 0xc3, 0xfc, 0x8a, 0x63, 0x0d, 0x59, 0x7a, 0xfc, 0xa0, 0xb5, 0xf6, - 0xd3, 0xd3, 0x04, 0x9b, 0x53, 0x02, 0xca, 0xb1, 0xfb, 0x2c, 0x0f, 0x02, 0xd5, 0x12, 0x04, 0x7c, - 0xca, 0xff, 0x4f, 0x37, 0x01, 0xde, 0x44, 0xff, 0x8e, 0x36, 0xff, 0x25, 0x22, 0x02, 0x41, 0x66, - 0xfd, 0x3e, 0xf4, 0xfb, 0x07, 0x2b, 0x00, 0x78, 0x0e, 0xff, 0x46, 0xc4, 0xfc, 0x2a, 0x20, 0xff, - 0x33, 0x40, 0xff, 0x69, 0xd0, 0xfd, 0x5b, 0x43, 0x1c, 0x87, 0x6f, 0x1a, 0x3f, 0xa3, 0xfc, 0x2a, - 0xe6, 0x0d, 0x6e, 0xa4, 0x16, 0x5b, 0x1a, 0xfe, 0x21, 0x53, 0xf9, 0x05, 0x5d, 0x00, 0x21, 0x39, - 0x00, 0x02, 0x16, 0xf5, 0xc9, 0x38, 0xfc, 0x52, 0x83, 0x0b, 0xd4, 0x84, 0xfd, 0x79, 0x52, 0xf7, - 0xe4, 0xb9, 0x03, 0x7a, 0xf8, 0x02, 0x92, 0xad, 0xfc, 0xee, 0x1f, 0x01, 0x33, 0x2e, 0x04, 0xb2, - 0x63, 0x00, 0x03, 0x42, 0x00, 0x30, 0x6e, 0xff, 0xb3, 0x9d, 0xff, 0xc8, 0xf2, 0x01, 0x31, 0x47, - 0xfe, 0x75, 0xe2, 0xfc, 0xbc, 0x59, 0x00, 0x07, 0x65, 0xff, 0xa3, 0x43, 0xfd, 0x64, 0xe6, 0xfe, - 0x85, 0x15, 0xff, 0xd9, 0xf1, 0xfd, 0xb0, 0x0a, 0x18, 0xb1, 0x30, 0x17, 0x24, 0x91, 0xfe, 0xf8, - 0x16, 0x0d, 0x61, 0x42, 0x15, 0xbb, 0x2c, 0x00, 0x8a, 0xec, 0xfa, 0x9f, 0x6f, 0x01, 0x27, 0x84, - 0x00, 0xfd, 0xd4, 0xf5, 0xe3, 0x39, 0xfc, 0x7a, 0xbc, 0x09, 0x3f, 0x49, 0xfe, 0xb1, 0x03, 0xf8, - 0x9c, 0xcd, 0x02, 0x7a, 0x82, 0x03, 0xb2, 0x51, 0xfd, 0x3e, 0x01, 0x01, 0xb4, 0xe4, 0x03, 0x93, - 0xe5, 0xff, 0xf6, 0x1d, 0x00, 0x1b, 0x36, 0x00, 0xcf, 0x4f, 0x00, 0x62, 0xb5, 0x01, 0x9f, 0x69, - 0xfe, 0x4c, 0xb6, 0xfd, 0x43, 0xbc, 0x00, 0xd0, 0x53, 0xff, 0xfe, 0x1f, 0xfd, 0xff, 0x8b, 0xfe, - 0xf8, 0xd6, 0xfe, 0x74, 0x3a, 0xfe, 0x12, 0xea, 0x14, 0xcf, 0xef, 0x14, 0x08, 0x85, 0x00, 0xa2, - 0x18, 0x0c, 0x42, 0x9b, 0x12, 0x59, 0x35, 0x01, 0xc4, 0x13, 0xfd, 0x79, 0x61, 0x02, 0x33, 0x81, - 0x00, 0x78, 0xed, 0xf6, 0x94, 0x54, 0xfc, 0xe3, 0xfb, 0x07, 0x0a, 0x68, 0xfe, 0x7f, 0xf4, 0xf8, - 0x31, 0x44, 0x03, 0x29, 0xb4, 0x03, 0xc2, 0x8a, 0xfd, 0x66, 0x27, 0x01, 0xf6, 0xf8, 0x02, 0x59, - 0xfe, 0xff, 0xa7, 0x89, 0x01, 0x50, 0xb7, 0x00, 0x03, 0xfb, 0xff, 0x91, 0x9c, 0x01, 0x45, 0x2a, - 0xff, 0x44, 0x13, 0xfe, 0x54, 0xe6, 0xff, 0x47, 0x01, 0xff, 0x2d, 0x61, 0xfd, 0x33, 0x84, 0xfe, - 0x9a, 0x49, 0xff, 0xd5, 0xf3, 0xfe, 0x55, 0xa8, 0x11, 0x9f, 0xf4, 0x12, 0x46, 0xee, 0x01, 0x99, - 0xe6, 0x0a, 0x88, 0x32, 0x11, 0xc8, 0x15, 0x03, 0x5d, 0x85, 0xfe, 0xf6, 0xb8, 0x01, 0x1e, 0xae, - 0x00, 0xb0, 0xbe, 0xf8, 0x88, 0xa1, 0xfb, 0xf9, 0x08, 0x06, 0x0e, 0xae, 0xff, 0xc7, 0xbf, 0xfa, - 0xb9, 0x48, 0x02, 0x4c, 0xe6, 0x02, 0x09, 0xd9, 0xfe, 0xa4, 0x71, 0x01, 0xd3, 0xdc, 0x02, 0x46, - 0x1b, 0x01, 0x37, 0x95, 0x01, 0x82, 0x50, 0x00, 0x49, 0x1e, 0x00, 0xc4, 0x7d, 0x01, 0x00, 0x2a, - 0xff, 0x09, 0xd7, 0xfd, 0x4f, 0x40, 0xff, 0x54, 0xfa, 0xfe, 0x04, 0xf8, 0xfd, 0xfd, 0x11, 0xff, - 0x44, 0xab, 0xff, 0x8d, 0x98, 0xfe, 0x4a, 0x9d, 0x0e, 0x1c, 0xcb, 0x10, 0x01, 0xb8, 0x03, 0xab, - 0x14, 0x0a, 0xf4, 0x74, 0x0f, 0x1b, 0x2d, 0x05, 0xdd, 0xd7, 0xff, 0x36, 0xb0, 0x00, 0x8f, 0xa0, - 0x00, 0xd0, 0x91, 0xfa, 0xc8, 0xe7, 0xfb, 0xe3, 0x87, 0x04, 0x2f, 0x62, 0x00, 0xf7, 0xd5, 0xfb, - 0xe4, 0x8d, 0x01, 0x9e, 0x70, 0x03, 0x75, 0x15, 0x01, 0x75, 0xef, 0x01, 0xdc, 0xfc, 0x01, 0x81, - 0x43, 0x01, 0x07, 0xb2, 0x01, 0x19, 0x3b, 0x00, 0x8b, 0x20, 0x00, 0xc8, 0xf6, 0x00, 0xa8, 0xd0, - 0xfe, 0x1f, 0xc1, 0xfd, 0xb9, 0xb2, 0xff, 0x1b, 0xd4, 0xff, 0x61, 0x52, 0xfe, 0xdd, 0xc0, 0xfe, - 0x47, 0x98, 0xfe, 0x4a, 0xdb, 0xfd, 0x47, 0xad, 0x0c, 0x0d, 0x90, 0x0f, 0x3a, 0x1e, 0x05, 0xfa, - 0xde, 0x08, 0x22, 0xff, 0x0d, 0x67, 0x82, 0x06, 0x5e, 0xb3, 0xff, 0x92, 0xda, 0xff, 0x7e, 0x8e, - 0x01, 0x2d, 0x81, 0xfc, 0xfc, 0xa0, 0xfb, 0x78, 0xa8, 0x02, 0x67, 0x6a, 0x01, 0x3b, 0xdd, 0xfd, - 0x17, 0x8b, 0x02, 0x87, 0xca, 0x04, 0xa4, 0x77, 0x01, 0x95, 0xe9, 0x00, 0x35, 0xe6, 0x01, 0xcc, - 0x8b, 0x01, 0xb0, 0x1f, 0x01, 0x17, 0x0e, 0x00, 0x5e, 0xbd, 0xff, 0xca, 0x75, 0x00, 0x4c, 0xa2, - 0xff, 0x3e, 0xf2, 0xfe, 0x9a, 0xa8, 0xff, 0x2b, 0xbe, 0xfe, 0x66, 0x83, 0xfd, 0xd6, 0x3e, 0xfe, - 0x27, 0xbc, 0xfe, 0xac, 0xa1, 0xfe, 0x29, 0x0a, 0x0a, 0x41, 0x23, 0x0e, 0x13, 0xd4, 0x06, 0x3a, - 0xc2, 0x07, 0xab, 0x6f, 0x0c, 0xac, 0x8d, 0x07, 0xc7, 0x8f, 0x00, 0xb1, 0x6a, 0x00, 0x71, 0x32, - 0x01, 0x44, 0x59, 0xfc, 0x89, 0x49, 0xfc, 0x48, 0x0f, 0x03, 0x65, 0x86, 0x03, 0x8d, 0x0f, 0x00, - 0x69, 0x44, 0x02, 0x36, 0x1b, 0x04, 0x8e, 0x4c, 0x01, 0x6c, 0xcd, 0x00, 0xd7, 0xf1, 0x01, 0x7a, - 0x15, 0x01, 0x9b, 0x4c, 0x00, 0x6d, 0x13, 0x00, 0x16, 0x88, 0x00, 0x1b, 0x08, 0x01, 0xe0, 0xc1, - 0xff, 0xb0, 0x37, 0xfe, 0x8e, 0x11, 0xfe, 0xcd, 0x25, 0xfe, 0x35, 0x29, 0xfe, 0x6f, 0xb0, 0xfe, - 0xbb, 0xfe, 0xfe, 0xe2, 0xe3, 0xfe, 0x75, 0xb5, 0x08, 0x8b, 0xc3, 0x0d, 0x01, 0x05, 0x07, 0x02, - 0x47, 0x06, 0xc5, 0x11, 0x0c, 0xfa, 0x49, 0x08, 0x26, 0x04, 0x00, 0xb5, 0x9a, 0xff, 0x73, 0x76, - 0x01, 0xd3, 0x56, 0xfe, 0x55, 0xdc, 0xfe, 0x3c, 0x1d, 0x04, 0x00, 0x72, 0x03, 0x1e, 0x6d, 0x00, - 0x86, 0x90, 0x02, 0x51, 0x91, 0x03, 0x4e, 0xee, 0x00, 0x2f, 0x4f, 0x00, 0x6e, 0x03, 0x01, 0x3d, - 0x4b, 0x01, 0x11, 0x67, 0x01, 0x34, 0xa1, 0x00, 0xeb, 0x29, 0x00, 0x74, 0xa2, 0xff, 0x69, 0x3c, - 0xfe, 0x02, 0xc6, 0xfd, 0x10, 0x8b, 0xfe, 0xbd, 0xd4, 0xfe, 0xae, 0x8d, 0xfe, 0x07, 0xb4, 0xfe, - 0xdf, 0xb2, 0xfe, 0x3a, 0x75, 0xfe, 0xbe, 0x36, 0x08, 0x7c, 0x70, 0x0c, 0xf1, 0x03, 0x07, 0x5a, - 0x9b, 0x07, 0x92, 0x3c, 0x0a, 0xb8, 0x35, 0x05, 0x5a, 0xff, 0x00, 0x47, 0xa7, 0x02, 0x26, 0x98, - 0x03, 0xac, 0x9a, 0xff, 0x87, 0x89, 0xff, 0x84, 0x25, 0x04, 0x4f, 0x1f, 0x03, 0xd2, 0xe5, 0x00, - 0xaf, 0xfc, 0x02, 0x1a, 0x8d, 0x02, 0xb7, 0xb4, 0xff, 0xc1, 0x90, 0x00, 0x2e, 0x90, 0x02, 0x89, - 0xf0, 0x01, 0xb1, 0x6d, 0x00, 0x6a, 0x15, 0xff, 0x32, 0xa5, 0xfe, 0x64, 0x43, 0xff, 0x55, 0xfa, - 0xfe, 0x24, 0x6f, 0xfe, 0x35, 0xcb, 0xfe, 0x9b, 0xce, 0xfe, 0x36, 0x4f, 0xfe, 0x52, 0x38, 0xfe, - 0x62, 0xaa, 0xfe, 0xc3, 0xc4, 0xfe, 0xe5, 0x51, 0x08, 0xa5, 0x58, 0x0b, 0x5e, 0xb5, 0x05, 0x1c, - 0xec, 0x06, 0x0e, 0x4f, 0x09, 0xe8, 0x54, 0x06, 0x0c, 0x5c, 0x04, 0xc6, 0x4e, 0x04, 0x3e, 0x2b, - 0x03, 0x5b, 0x51, 0xff, 0xef, 0xe3, 0xff, 0xb2, 0xd7, 0x04, 0x5e, 0xcb, 0x03, 0x58, 0x3a, 0x00, - 0xec, 0x13, 0x01, 0xac, 0x7f, 0x02, 0xce, 0xa2, 0x01, 0x80, 0x33, 0x01, 0x65, 0x61, 0x01, 0x25, - 0xdf, 0xff, 0x2d, 0x5d, 0xfe, 0x06, 0xc6, 0xfe, 0x82, 0xd8, 0xff, 0x27, 0xec, 0xff, 0xc3, 0xc9, - 0xfe, 0xf0, 0x31, 0xfe, 0xf4, 0x71, 0xfe, 0x5b, 0x54, 0xfe, 0x5c, 0x24, 0xfe, 0x04, 0x64, 0xfe, - 0xb1, 0xbe, 0xfe, 0x60, 0xf3, 0xfe, 0x73, 0xad, 0x06, 0x48, 0xe9, 0x09, 0x5b, 0x5e, 0x06, 0xbc, - 0x00, 0x08, 0x9e, 0x12, 0x0b, 0x59, 0x95, 0x07, 0x87, 0xb3, 0x03, 0x94, 0x38, 0x04, 0x34, 0x03, - 0x04, 0x52, 0x7c, 0x00, 0x2d, 0xae, 0x00, 0xfd, 0x0a, 0x04, 0x63, 0xb9, 0x02, 0xf3, 0x76, 0x00, - 0xb6, 0x77, 0x02, 0x14, 0x18, 0x03, 0x5d, 0x40, 0x00, 0x5e, 0x0f, 0xff, 0xb2, 0xa1, 0xff, 0x80, - 0x92, 0xff, 0x58, 0x8c, 0xff, 0x69, 0xb9, 0xff, 0xbe, 0xc7, 0xff, 0x05, 0x5b, 0xff, 0x29, 0x4e, - 0xfe, 0x10, 0xf6, 0xfd, 0x3b, 0x53, 0xfe, 0x11, 0x63, 0xfe, 0xfa, 0x46, 0xfe, 0x2a, 0xa0, 0xfe, - 0x18, 0x36, 0xff, 0xc2, 0x19, 0xff, 0x89, 0xdf, 0x07, 0xf2, 0xea, 0x0c, 0xfe, 0x76, 0x09, 0x23, - 0xde, 0x07, 0xc2, 0x13, 0x08, 0xc7, 0x47, 0x06, 0xfe, 0x96, 0x04, 0x13, 0x36, 0x04, 0xa2, 0x4b, - 0x03, 0x9d, 0x4a, 0x01, 0xfd, 0x4d, 0x01, 0x92, 0xfa, 0x02, 0x34, 0xcf, 0x03, 0x05, 0x0e, 0x02, - 0xe9, 0x81, 0xff, 0xcf, 0x47, 0xff, 0x5d, 0x6c, 0xff, 0x3e, 0x95, 0xff, 0x2c, 0x4c, 0x00, 0x8e, - 0x15, 0x00, 0xcf, 0xb5, 0xff, 0x6e, 0x52, 0xff, 0x67, 0xc5, 0xfe, 0xbb, 0xa9, 0xfe, 0x6b, 0x57, - 0xfe, 0x80, 0x12, 0xfe, 0xc5, 0x46, 0xfe, 0x26, 0xa1, 0xfe, 0x4d, 0xe0, 0xfe, 0x62, 0xc3, 0xfe, - 0x5d, 0x06, 0xff, 0xe5, 0x53, 0xff, 0x48, 0xd7, 0x07, 0x22, 0x04, 0x0d, 0x15, 0xa6, 0x09, 0x04, - 0x61, 0x07, 0x65, 0x6c, 0x07, 0x0d, 0x9c, 0x06, 0x65, 0x94, 0x05, 0xbd, 0x0b, 0x05, 0x98, 0x4e, - 0x04, 0x80, 0x75, 0x02, 0x88, 0x63, 0x01, 0xb1, 0x9b, 0x02, 0x69, 0x72, 0x03, 0x1c, 0xa5, 0x00, - 0xcb, 0xf4, 0xfd, 0xf0, 0xbc, 0xfe, 0x09, 0xe9, 0xff, 0x6c, 0x67, 0x00, 0xc8, 0x99, 0x00, 0x61, - 0x05, 0x00, 0xa9, 0x30, 0xff, 0x18, 0xc9, 0xfe, 0x16, 0xf8, 0xfe, 0xfe, 0xe9, 0xfe, 0xe5, 0x4e, - 0xfe, 0x1f, 0x2d, 0xfe, 0xfd, 0x8e, 0xfe, 0x01, 0xbd, 0xfe, 0x53, 0xb7, 0xfe, 0x97, 0xd3, 0xfe, - 0x8c, 0x35, 0xff, 0x17, 0x55, 0xff, 0x2c, 0x89, 0x07, 0xc4, 0x6f, 0x0b, 0x6c, 0x46, 0x07, 0xb8, - 0x3c, 0x06, 0xbb, 0xf4, 0x06, 0x92, 0x67, 0x06, 0xc0, 0x4e, 0x06, 0x43, 0x22, 0x07, 0x2b, 0x50, - 0x07, 0x19, 0x44, 0x04, 0xca, 0x65, 0x02, 0xce, 0xe2, 0x01, 0x15, 0x96, 0x00, 0x63, 0x78, 0x00, - 0xe1, 0xc1, 0xff, 0x1b, 0xcf, 0xfe, 0x58, 0x6a, 0xff, 0xd9, 0x7c, 0x00, 0xf6, 0x92, 0x00, 0x8c, - 0x8c, 0xff, 0x25, 0x2d, 0xff, 0xe4, 0x3e, 0xff, 0x3f, 0xfc, 0xfe, 0xbc, 0xd5, 0xfe, 0x0b, 0x88, - 0xfe, 0x14, 0x62, 0xfe, 0x3f, 0xab, 0xfe, 0x41, 0xc5, 0xfe, 0x2d, 0x89, 0xfe, 0x86, 0xb5, 0xfe, - 0x72, 0x46, 0xff, 0x48, 0x4d, 0xff, 0x2b, 0x28, 0x08, 0xaf, 0xfd, 0x0b, 0xc2, 0xb1, 0x06, 0x2d, - 0x1f, 0x05, 0x07, 0x61, 0x05, 0x38, 0x81, 0x04, 0x68, 0x0b, 0x06, 0xa6, 0x05, 0x08, 0x5a, 0x5e, - 0x07, 0x66, 0x5b, 0x04, 0xc7, 0xc2, 0x02, 0xe5, 0x08, 0x02, 0xee, 0x1b, 0x02, 0x64, 0xa1, 0x02, - 0xae, 0x50, 0x00, 0x98, 0xed, 0xfe, 0x1a, 0x87, 0xff, 0x41, 0x54, 0xff, 0x26, 0xb3, 0xff, 0x29, - 0x0c, 0x00, 0xce, 0x77, 0xff, 0xb6, 0xb7, 0xfe, 0x52, 0x81, 0xfe, 0xa0, 0x13, 0xff, 0xdc, 0x00, - 0xff, 0x9e, 0x8d, 0xfe, 0x23, 0xe0, 0xfe, 0x32, 0x28, 0xff, 0xa8, 0x0a, 0xff, 0xdd, 0xdf, 0xfe, - 0x86, 0xec, 0xfe, 0x93, 0x27, 0xff, 0xd9, 0x90, 0x08, 0x7f, 0xbe, 0x0b, 0x66, 0x34, 0x05, 0x2c, - 0x05, 0x04, 0xde, 0x73, 0x05, 0x73, 0x38, 0x04, 0xed, 0x72, 0x03, 0x8c, 0x58, 0x04, 0x5a, 0x47, - 0x06, 0x13, 0x3c, 0x06, 0xb9, 0x0b, 0x05, 0x4b, 0x33, 0x04, 0xdc, 0x2c, 0x03, 0x8c, 0xa8, 0x02, - 0xb0, 0x5f, 0x03, 0x7b, 0xcf, 0x01, 0x38, 0xd8, 0xfd, 0x30, 0xda, 0xfd, 0x32, 0x70, 0xff, 0x80, - 0x86, 0xff, 0xcd, 0xef, 0xff, 0x22, 0x60, 0xff, 0x45, 0xb7, 0xfe, 0xa2, 0xdd, 0xfe, 0x35, 0x03, - 0xff, 0xbc, 0xfa, 0xfe, 0x23, 0x08, 0xff, 0xb5, 0x3f, 0xff, 0xc0, 0xee, 0xfe, 0xc4, 0x17, 0xff, - 0x6b, 0x32, 0xff, 0xde, 0xa2, 0xfe, 0x15, 0x0b, 0x08, 0x95, 0x57, 0x0b, 0xed, 0x33, 0x05, 0x88, - 0xc4, 0x03, 0xd1, 0x69, 0x05, 0x1c, 0x05, 0x05, 0xac, 0x1b, 0x04, 0xb1, 0x34, 0x02, 0xf8, 0x7d, - 0x01, 0x4f, 0x0c, 0x03, 0xc2, 0x78, 0x05, 0xa8, 0xee, 0x05, 0xcd, 0x57, 0x04, 0x63, 0x3f, 0x03, - 0xe7, 0x51, 0x03, 0x38, 0x4a, 0x04, 0xa3, 0xfc, 0x02, 0xd9, 0x33, 0xff, 0x53, 0xb1, 0xfd, 0x75, - 0x8d, 0xfe, 0xd0, 0x30, 0xff, 0x7b, 0x93, 0xff, 0xb5, 0xcf, 0xff, 0xa3, 0x46, 0xff, 0xf3, 0x8c, - 0xfe, 0x70, 0xe2, 0xfe, 0xfd, 0x68, 0xff, 0xe9, 0xfa, 0xfe, 0xca, 0xd4, 0xfe, 0x5f, 0x60, 0xff, - 0xa6, 0x4a, 0xff, 0x0c, 0xd1, 0xfe, 0x9b, 0xb6, 0x08, 0x62, 0x84, 0x0b, 0xeb, 0xc7, 0x03, 0x73, - 0x58, 0x02, 0x3d, 0xd9, 0x04, 0xf8, 0xb5, 0x04, 0x84, 0x18, 0x04, 0x12, 0x6c, 0x02, 0x28, 0x6c, - 0x00, 0xd4, 0x71, 0x00, 0xa5, 0x47, 0x03, 0x9c, 0x54, 0x04, 0xfd, 0xa1, 0x03, 0x4a, 0x9a, 0x04, - 0x0e, 0x61, 0x05, 0x87, 0x87, 0x05, 0x0b, 0x93, 0x04, 0xfe, 0xab, 0x02, 0xec, 0x3c, 0x01, 0xa1, - 0x9b, 0xff, 0x3a, 0x01, 0xfe, 0x66, 0xda, 0xfd, 0xf3, 0x0b, 0xff, 0xc6, 0x88, 0xff, 0x59, 0x27, - 0xff, 0x9b, 0xe4, 0xfe, 0xcf, 0xd5, 0xfe, 0x19, 0xe9, 0xfe, 0x2d, 0xf1, 0xfe, 0xa3, 0x82, 0xff, - 0x9c, 0x92, 0xff, 0x0d, 0xf0, 0xfe, 0x21, 0xbe, 0x09, 0x7d, 0xa2, 0x0c, 0xa2, 0xe0, 0x03, 0xf5, - 0xf2, 0x02, 0x2e, 0xb2, 0x05, 0xdb, 0x52, 0x04, 0x0d, 0x57, 0x03, 0x92, 0x3b, 0x01, 0xcd, 0x05, - 0xff, 0x44, 0x28, 0x01, 0xab, 0x17, 0x04, 0xac, 0xde, 0x01, 0xef, 0x54, 0x00, 0xc5, 0x3b, 0x02, - 0xb0, 0x73, 0x03, 0x16, 0x6d, 0x05, 0x29, 0x9f, 0x05, 0x4d, 0xa9, 0x03, 0xb5, 0x98, 0x03, 0x2b, - 0x15, 0x03, 0xaa, 0xae, 0x00, 0x7d, 0xb5, 0xfe, 0xef, 0xf5, 0xfd, 0x00, 0xcb, 0xfd, 0xf4, 0x6e, - 0xfe, 0x94, 0x81, 0xff, 0xab, 0x85, 0xff, 0x8f, 0xd6, 0xfe, 0x2b, 0xa5, 0xfe, 0x00, 0x4c, 0xff, - 0xc9, 0x91, 0xff, 0xc0, 0x10, 0xff, 0x3c, 0xdb, 0x0a, 0x5d, 0x32, 0x0d, 0xc2, 0x65, 0x03, 0xd1, - 0xf3, 0x03, 0x58, 0x87, 0x07, 0x6e, 0x8c, 0x05, 0x47, 0x51, 0x03, 0x87, 0xb7, 0xfe, 0xd8, 0x5a, - 0xfc, 0x42, 0x9c, 0x01, 0x18, 0x7b, 0x05, 0xf7, 0x88, 0x01, 0x9b, 0x30, 0xff, 0x9b, 0x38, 0x00, - 0x42, 0x25, 0x01, 0x12, 0x8a, 0x03, 0x1a, 0x14, 0x03, 0xb2, 0x8a, 0x02, 0x2d, 0xb4, 0x04, 0xbc, - 0x5d, 0x04, 0x0e, 0xea, 0x02, 0x5c, 0xd2, 0x01, 0x80, 0x50, 0x00, 0xa7, 0xa6, 0xfe, 0xf2, 0x56, - 0xfd, 0x87, 0xca, 0xfd, 0xb0, 0xdd, 0xfe, 0xb8, 0x37, 0xff, 0xef, 0x4e, 0xff, 0x5c, 0x4b, 0xff, - 0x28, 0x0b, 0xff, 0xc2, 0xe2, 0xfe, 0x66, 0x1c, 0x0d, 0x4b, 0x57, 0x10, 0xb4, 0xdc, 0x03, 0x3d, - 0xfc, 0x02, 0xcf, 0xbf, 0x06, 0x43, 0x26, 0x05, 0x2b, 0xdb, 0x03, 0x1e, 0x64, 0xfe, 0xb6, 0x5a, - 0xfb, 0xfa, 0x9e, 0x01, 0x64, 0x0f, 0x05, 0xf2, 0x8b, 0x00, 0xf0, 0xc6, 0xfe, 0xce, 0x3f, 0x00, - 0xac, 0x9f, 0x00, 0x86, 0xd7, 0x01, 0xea, 0xb4, 0x01, 0x54, 0x31, 0x01, 0x8b, 0x87, 0x02, 0xc7, - 0x8e, 0x03, 0x64, 0x92, 0x03, 0xe0, 0x8c, 0x02, 0x57, 0xa9, 0x01, 0xab, 0x17, 0x01, 0x7b, 0xf4, - 0xff, 0x9e, 0xa4, 0xfe, 0x6a, 0xbd, 0xfd, 0x14, 0xf9, 0xfd, 0xba, 0xc5, 0xfe, 0x6f, 0x97, 0xff, - 0x0b, 0xe3, 0xff, 0xaf, 0x12, 0xff, 0x29, 0x16, 0x0f, 0xe1, 0x2b, 0x12, 0x9a, 0x8a, 0x03, 0xfb, - 0x5f, 0x03, 0x7d, 0x60, 0x08, 0x5f, 0x70, 0x05, 0x54, 0x8c, 0x02, 0x0f, 0x2d, 0xfc, 0xe4, 0x8c, - 0xfa, 0xed, 0xaf, 0x03, 0x8e, 0xbb, 0x05, 0x47, 0xae, 0xfe, 0x17, 0xa4, 0xfd, 0x3e, 0x93, 0xff, - 0xf4, 0x6b, 0x00, 0xb7, 0x73, 0x02, 0xb5, 0x07, 0x01, 0x85, 0x76, 0xff, 0x44, 0x61, 0x01, 0x27, - 0xed, 0x01, 0xe7, 0x41, 0x01, 0x6c, 0xee, 0x01, 0xf5, 0x97, 0x02, 0x56, 0xed, 0x01, 0x85, 0x78, - 0x01, 0xf0, 0xf0, 0x00, 0xda, 0x8e, 0xff, 0xea, 0x98, 0xfe, 0xac, 0xe7, 0xfd, 0xcc, 0x94, 0xfe, - 0xca, 0x96, 0xff, 0xbd, 0x17, 0xff, 0x4e, 0x3f, 0x11, 0x63, 0x09, 0x14, 0x21, 0x26, 0x03, 0xf0, - 0xf3, 0x03, 0x9f, 0xf3, 0x09, 0x23, 0xed, 0x05, 0x56, 0x4a, 0x01, 0x0b, 0x8e, 0xf9, 0xf7, 0x3f, - 0xfa, 0x36, 0xa4, 0x05, 0x47, 0x84, 0x05, 0xe4, 0x94, 0xfd, 0x13, 0xa5, 0xfd, 0xc6, 0xd3, 0xfe, - 0x06, 0xae, 0xff, 0x86, 0x8f, 0x02, 0x35, 0xb3, 0x00, 0x7d, 0x39, 0xff, 0x0d, 0x04, 0x01, 0x29, - 0x8d, 0x00, 0xa9, 0x46, 0x00, 0x0d, 0xac, 0x00, 0x93, 0x71, 0x00, 0xc4, 0x92, 0x01, 0x89, 0x30, - 0x02, 0xf5, 0x35, 0x01, 0x56, 0x24, 0x01, 0x0e, 0x10, 0x01, 0x3b, 0x7c, 0xff, 0xd4, 0xf4, 0xfe, - 0xb4, 0xfc, 0xfe, 0x41, 0x63, 0xfe, 0x8e, 0x4b, 0x14, 0x5a, 0x65, 0x17, 0x7d, 0x0e, 0x03, 0xa3, - 0x2a, 0x03, 0x6c, 0xe1, 0x09, 0x58, 0x95, 0x05, 0xa3, 0x48, 0x00, 0x21, 0x40, 0xf8, 0x48, 0xf7, - 0xfa, 0x12, 0xfb, 0x06, 0xf4, 0x38, 0x04, 0xa3, 0x28, 0xfc, 0xbe, 0xfd, 0xfd, 0x80, 0xd4, 0xfe, - 0xe0, 0x6d, 0xff, 0xf1, 0x7e, 0x02, 0x13, 0x00, 0x00, 0xed, 0xc4, 0xfe, 0xd8, 0x18, 0x01, 0x3b, - 0x37, 0x00, 0xd1, 0x66, 0xff, 0x35, 0xc7, 0xff, 0x44, 0xcd, 0xff, 0x3d, 0x64, 0x00, 0xd1, 0x97, - 0x00, 0xa8, 0xb4, 0x00, 0x15, 0x73, 0x01, 0x45, 0x7e, 0x01, 0xa9, 0xe8, 0x00, 0xf2, 0x1d, 0x01, - 0xb8, 0x46, 0x00, 0x4d, 0x62, 0xfe, 0x93, 0x55, 0x16, 0xfc, 0x1d, 0x19, 0x4b, 0xbd, 0x02, 0x08, - 0x98, 0x04, 0x6e, 0x76, 0x0c, 0x33, 0x67, 0x05, 0x09, 0x05, 0xfd, 0x14, 0x77, 0xf5, 0x72, 0xa1, - 0xfc, 0x0d, 0x55, 0x09, 0xa7, 0xf1, 0x02, 0xd5, 0xea, 0xfa, 0x71, 0x0b, 0xfe, 0xa2, 0x60, 0xfe, - 0xb8, 0x76, 0xff, 0xe2, 0x9a, 0x02, 0x83, 0x2f, 0xff, 0x97, 0x69, 0xfe, 0x79, 0x61, 0x01, 0xad, - 0xaf, 0xff, 0x71, 0xd8, 0xfe, 0x13, 0xbc, 0xff, 0x3b, 0xd1, 0xfe, 0xf5, 0xab, 0xff, 0x11, 0x8f, - 0x00, 0xe1, 0x23, 0xff, 0x27, 0xcb, 0xff, 0x9d, 0x67, 0x01, 0x96, 0xf6, 0x00, 0x12, 0x8c, 0x01, - 0x6b, 0xec, 0x01, 0xb9, 0x34, 0x00, 0xbd, 0xa7, 0x18, 0x51, 0x26, 0x1c, 0x5b, 0xfc, 0x02, 0x01, - 0x83, 0x04, 0xf1, 0x94, 0x0d, 0x54, 0x35, 0x05, 0x20, 0x8e, 0xfa, 0xb2, 0x97, 0xf3, 0xd3, 0xa1, - 0xfe, 0xc4, 0xe5, 0x0a, 0x86, 0xd1, 0x00, 0xe9, 0xe0, 0xf9, 0xde, 0x95, 0xfe, 0x5b, 0x2d, 0xfe, - 0x8b, 0xa8, 0xff, 0x98, 0xd5, 0x02, 0x7b, 0x7d, 0xfe, 0xb9, 0xcd, 0xfd, 0x80, 0x5c, 0x01, 0xf7, - 0x61, 0xff, 0x77, 0x7d, 0xfe, 0x7a, 0xc3, 0xff, 0x67, 0x76, 0xfe, 0x17, 0x4c, 0xff, 0x1e, 0xf8, - 0xff, 0xae, 0x4a, 0xfe, 0x26, 0x80, 0xff, 0xa7, 0x8f, 0x00, 0x8a, 0xe8, 0xff, 0x84, 0x38, 0x01, - 0xab, 0xb6, 0x01, 0x64, 0x8f, 0x00, 0x7c, 0x5a, 0x1a, 0x8f, 0x45, 0x1f, 0x8c, 0xf8, 0x03, 0x00, - 0x2c, 0x04, 0x89, 0x75, 0x0e, 0xd6, 0x3e, 0x05, 0x02, 0x06, 0xf8, 0x28, 0xb4, 0xf1, 0x34, 0x88, - 0x00, 0x2c, 0x6d, 0x0c, 0x1f, 0xb5, 0xfe, 0xce, 0x86, 0xf8, 0xaa, 0x21, 0xff, 0xea, 0x0e, 0xfe, - 0xb2, 0xa0, 0xff, 0x88, 0x10, 0x03, 0x69, 0x13, 0xfe, 0x08, 0x63, 0xfd, 0x23, 0x39, 0x01, 0xdc, - 0xfb, 0xfe, 0x40, 0xf1, 0xfd, 0xfd, 0x7b, 0xff, 0x9c, 0x12, 0xfe, 0x20, 0x1b, 0xff, 0xf3, 0x24, - 0x00, 0xd9, 0xa3, 0xfd, 0xd5, 0x7c, 0xfe, 0x9b, 0x41, 0x00, 0x87, 0xa5, 0xff, 0x06, 0x63, 0x00, - 0x9c, 0xe5, 0x00, 0x9e, 0x07, 0x00, 0x6b, 0xe1, 0x1b, 0xd2, 0xfe, 0x22, 0xbd, 0xb9, 0x05, 0x15, - 0xc6, 0x02, 0x0a, 0x3d, 0x0e, 0x4f, 0x9e, 0x05, 0x32, 0x3d, 0xf6, 0x24, 0x88, 0xf0, 0x47, 0xba, - 0x01, 0xb9, 0x0f, 0x0d, 0x1a, 0x8b, 0xfd, 0x5a, 0x3a, 0xf7, 0xbf, 0xfb, 0xfe, 0x35, 0x5a, 0xfe, - 0x91, 0x6a, 0xff, 0xaf, 0x2a, 0x03, 0x02, 0x2d, 0xfe, 0x41, 0xdb, 0xfc, 0x69, 0xfc, 0x00, 0x77, - 0xe6, 0xfe, 0x90, 0x8a, 0xfd, 0x93, 0xfb, 0xfe, 0x1a, 0xa6, 0xfd, 0x5e, 0xb6, 0xfe, 0xeb, 0xd1, - 0xff, 0x65, 0xa2, 0xfd, 0xd5, 0x48, 0xfe, 0xb7, 0xa2, 0xff, 0x88, 0x26, 0xff, 0xcd, 0x33, 0x00, - 0xb9, 0x94, 0x00, 0xf6, 0x56, 0xff, 0xd7, 0x9f, 0x1c, 0x6a, 0x47, 0x26, 0x90, 0x1d, 0x08, 0x18, - 0x2a, 0x02, 0x34, 0x14, 0x0e, 0xaf, 0xa6, 0x05, 0xb4, 0xcc, 0xf4, 0xd6, 0x96, 0xef, 0xaf, 0x79, - 0x02, 0xef, 0x8f, 0x0d, 0x77, 0xe6, 0xfc, 0x40, 0x4a, 0xf6, 0xeb, 0x43, 0xfe, 0x76, 0x7a, 0xfe, - 0x7d, 0x72, 0xff, 0x88, 0x05, 0x03, 0xe5, 0xa1, 0xfe, 0x98, 0x67, 0xfc, 0x4d, 0x50, 0x00, 0x1d, - 0x30, 0xff, 0x49, 0x8d, 0xfd, 0xd2, 0xa5, 0xfe, 0x07, 0x15, 0xfd, 0x42, 0x0a, 0xfe, 0x19, 0x7d, - 0xff, 0xb6, 0x6e, 0xfd, 0x11, 0x1e, 0xfe, 0xde, 0x6a, 0xff, 0xc1, 0x01, 0xff, 0x83, 0xc4, 0xff, - 0x9e, 0x98, 0x00, 0x80, 0x8d, 0xff, 0xb3, 0xc5, 0x1c, 0xc6, 0x11, 0x29, 0x53, 0x1b, 0x0b, 0x54, - 0x25, 0x02, 0x40, 0xc4, 0x0d, 0xe5, 0x6b, 0x05, 0xca, 0x20, 0xf4, 0xd3, 0x18, 0xef, 0xbd, 0x15, - 0x02, 0x95, 0x06, 0x0e, 0x23, 0xeb, 0xfc, 0x43, 0x4c, 0xf5, 0x68, 0xd7, 0xfd, 0x38, 0x54, 0xfe, - 0x02, 0x0d, 0xff, 0xa9, 0x12, 0x03, 0x3c, 0x0e, 0xff, 0xa8, 0x05, 0xfc, 0x33, 0xaf, 0xff, 0xf6, - 0x64, 0xff, 0xc5, 0x94, 0xfd, 0x9c, 0x80, 0xfe, 0x7d, 0xe6, 0xfc, 0xa9, 0x4f, 0xfd, 0xa5, 0x25, - 0xff, 0xcf, 0x11, 0xfd, 0x4f, 0x8f, 0xfd, 0xc7, 0x1e, 0xff, 0xa8, 0xed, 0xfe, 0x25, 0x8c, 0x00, - 0x8c, 0xe2, 0xff, 0x62, 0xe4, 0xfd, 0x74, 0xcb, 0x1d, 0xa3, 0x04, 0x2c, 0x37, 0xd2, 0x0d, 0x22, - 0x71, 0x01, 0x0c, 0x01, 0x0c, 0x55, 0x2f, 0x05, 0x58, 0x00, 0xf5, 0x0d, 0xaa, 0xef, 0x47, 0x5f, - 0x00, 0x75, 0xe6, 0x0c, 0x34, 0xed, 0xfd, 0xbe, 0xf3, 0xf4, 0xb8, 0x08, 0xfd, 0x2c, 0xb5, 0xfe, - 0xe9, 0x6b, 0xfe, 0x17, 0x1f, 0x02, 0xfc, 0xe0, 0xff, 0x42, 0x45, 0xfc, 0xfe, 0x73, 0xfe, 0x2a, - 0x49, 0xff, 0x91, 0x0b, 0xfe, 0xb8, 0x1d, 0xfe, 0x12, 0x92, 0xfc, 0x2c, 0x36, 0xfd, 0x7d, 0xf4, - 0xfe, 0x8d, 0xac, 0xfc, 0xc1, 0x93, 0xfc, 0xeb, 0x1c, 0xff, 0xe5, 0x5d, 0xff, 0x8e, 0xf3, 0xfe, - 0x43, 0x6a, 0xff, 0x05, 0x09, 0xff, 0x29, 0x7e, 0x1e, 0x23, 0x33, 0x2d, 0x61, 0x15, 0x11, 0xcf, - 0xad, 0x02, 0xc8, 0x42, 0x09, 0x70, 0x06, 0x06, 0x0f, 0xef, 0xf7, 0xd1, 0xeb, 0xee, 0xa4, 0x14, - 0xfe, 0xf4, 0x47, 0x0c, 0x22, 0x0c, 0xff, 0x06, 0xaf, 0xf5, 0xc1, 0xbf, 0xfc, 0xe6, 0xf3, 0xfd, - 0x69, 0xe5, 0xfd, 0xee, 0xe3, 0x01, 0x43, 0xfd, 0xff, 0xb5, 0x1b, 0xfd, 0x2a, 0x01, 0xfe, 0xe2, - 0xf1, 0xfd, 0xfc, 0xfb, 0xfd, 0xe3, 0xf2, 0xfe, 0x8a, 0x17, 0xfd, 0xf2, 0x80, 0xfc, 0x6a, 0x4c, - 0xfe, 0xf8, 0x2d, 0xfd, 0xd5, 0x63, 0xfd, 0x38, 0x25, 0xfe, 0x9d, 0x44, 0xfd, 0x67, 0x65, 0xff, - 0xc0, 0xf0, 0xff, 0x41, 0x2a, 0xfe, 0x73, 0xb3, 0x20, 0x8e, 0x44, 0x2c, 0x08, 0xfd, 0x10, 0xc4, - 0xf5, 0x06, 0x76, 0x72, 0x09, 0x05, 0x7a, 0x05, 0x02, 0xc6, 0xf8, 0x6e, 0x13, 0xee, 0x34, 0x99, - 0xfd, 0xfe, 0xde, 0x0a, 0xef, 0x25, 0xff, 0x8c, 0x6f, 0xf7, 0x88, 0x00, 0xfc, 0x1b, 0xef, 0xfc, - 0xa1, 0x1d, 0xfe, 0x51, 0xc4, 0x01, 0x6a, 0x82, 0xff, 0x83, 0x83, 0xfd, 0x39, 0xcf, 0xfd, 0x3d, - 0x86, 0xfc, 0x98, 0x35, 0xfe, 0xae, 0x75, 0xff, 0xd6, 0xa0, 0xfc, 0x9a, 0x2a, 0xfc, 0xbf, 0x24, - 0xfe, 0x12, 0x26, 0xfe, 0x5b, 0x15, 0xfd, 0x14, 0xc8, 0xfc, 0x2f, 0x68, 0xfd, 0x84, 0x97, 0xfe, - 0x3b, 0x57, 0xff, 0x79, 0xc9, 0xfe, 0x3e, 0x4e, 0x23, 0xaf, 0x08, 0x2a, 0x0d, 0x2a, 0x0f, 0xfc, - 0x0c, 0x0d, 0xb8, 0x41, 0x0b, 0x46, 0x65, 0x04, 0x38, 0x62, 0xf9, 0x04, 0x5e, 0xed, 0x78, 0x40, - 0xfe, 0x60, 0xcf, 0x08, 0x6b, 0x45, 0xfd, 0x09, 0x82, 0xfa, 0x9f, 0x7b, 0xfc, 0xca, 0x32, 0xfb, - 0xeb, 0x86, 0xfe, 0x2b, 0xb9, 0x01, 0x43, 0x66, 0xfe, 0x7e, 0x00, 0xfe, 0x21, 0x55, 0xfe, 0xfc, - 0x60, 0xfb, 0xda, 0x05, 0xfe, 0xf6, 0x1f, 0xff, 0x15, 0xb2, 0xfb, 0xf3, 0x7e, 0xfd, 0x2c, 0x3e, - 0xfe, 0xf4, 0x53, 0xfc, 0x07, 0xf8, 0xfd, 0xb8, 0x82, 0xfd, 0x84, 0xf9, 0xfb, 0x20, 0x63, 0xfe, - 0x03, 0x99, 0xff, 0x05, 0x5d, 0xfe, 0x14, 0xc9, 0x26, 0xde, 0x93, 0x26, 0xd8, 0x97, 0x09, 0xde, - 0x92, 0x14, 0xd6, 0xf4, 0x11, 0x45, 0x70, 0x01, 0xb6, 0x0e, 0xf7, 0x24, 0x58, 0xef, 0x0c, 0x47, - 0x00, 0xc9, 0x56, 0x04, 0x3c, 0x1a, 0xfa, 0x8e, 0x15, 0xff, 0xcc, 0xbc, 0xfd, 0xb0, 0xc3, 0xf8, - 0xac, 0x95, 0xfe, 0xf3, 0x88, 0x01, 0x97, 0xb8, 0xfd, 0xca, 0xac, 0xfe, 0x9f, 0x86, 0xfe, 0xeb, - 0x38, 0xfa, 0x1b, 0x63, 0xfd, 0x62, 0xeb, 0xfe, 0xfa, 0xe3, 0xfb, 0xde, 0x1e, 0xfd, 0xc8, 0x84, - 0xfc, 0x90, 0xf8, 0xfc, 0x6e, 0xe7, 0xfe, 0x20, 0xd9, 0xfc, 0xb6, 0x56, 0xfc, 0x4d, 0xef, 0xfd, - 0xfa, 0xf3, 0xfe, 0xe7, 0xb9, 0xfe, 0x54, 0xd0, 0x2b, 0x49, 0xdb, 0x26, 0xcf, 0xd5, 0x02, 0x10, - 0x34, 0x17, 0x0f, 0xb9, 0x17, 0xbe, 0x37, 0xfe, 0x69, 0x37, 0xf5, 0x06, 0xd9, 0xf4, 0x54, 0xb3, - 0x03, 0x3f, 0xdf, 0xfd, 0xf3, 0xfd, 0xf3, 0x24, 0xb5, 0x03, 0x91, 0xfa, 0x01, 0x75, 0x01, 0xf7, - 0xe6, 0xdc, 0xfd, 0x24, 0x04, 0x01, 0x69, 0xd4, 0xfc, 0x45, 0xe4, 0xff, 0x8e, 0x37, 0xff, 0xf9, - 0x66, 0xf8, 0x63, 0x50, 0xfd, 0x50, 0x00, 0x00, 0x0a, 0x11, 0xf9, 0xe9, 0x8f, 0xfc, 0x70, 0x5b, - 0xfe, 0x8d, 0x5d, 0xfb, 0xbd, 0xf8, 0xfe, 0x0e, 0xeb, 0xfd, 0x04, 0x12, 0xfc, 0xae, 0x4e, 0xfe, - 0x10, 0xcf, 0xfe, 0xf3, 0x06, 0xff, 0x30, 0xdd, 0x30, 0x7f, 0x9c, 0x28, 0x85, 0x5f, 0xfb, 0xa4, - 0xc6, 0x16, 0x01, 0x63, 0x1e, 0xc8, 0x80, 0xfc, 0x6b, 0x92, 0xf1, 0x83, 0x15, 0xfa, 0xd9, 0x93, - 0x09, 0x0a, 0x9a, 0xf8, 0xca, 0x0c, 0xeb, 0x40, 0xb1, 0x05, 0x27, 0x8f, 0x08, 0x4a, 0xd3, 0xf6, - 0xa9, 0x2f, 0xfc, 0xc5, 0x80, 0x00, 0x10, 0x40, 0xfb, 0x3e, 0xc2, 0x00, 0xa9, 0x2e, 0x00, 0x06, - 0xd8, 0xf7, 0x59, 0x34, 0xfd, 0x82, 0x04, 0xfe, 0x83, 0xe7, 0xf7, 0xaf, 0x41, 0xfd, 0xd9, 0xa6, - 0xfd, 0x3e, 0x11, 0xfb, 0x01, 0x7b, 0xff, 0x26, 0xc0, 0xfd, 0x0b, 0x05, 0xfc, 0xde, 0x4c, 0xff, - 0x7d, 0xc8, 0xff, 0xa0, 0x3d, 0xfe, 0x0c, 0x7a, 0x35, 0xf3, 0xb3, 0x2b, 0x54, 0x63, 0xf4, 0x17, - 0x7c, 0x13, 0x05, 0x07, 0x25, 0x60, 0x32, 0xfd, 0x3c, 0x5a, 0xed, 0x19, 0x14, 0xfe, 0x1a, 0xb6, - 0x10, 0xf2, 0x43, 0xf6, 0x08, 0x90, 0xe1, 0xaa, 0x84, 0x03, 0x27, 0x7f, 0x0f, 0x50, 0xf3, 0xf9, - 0x54, 0x44, 0xfa, 0x34, 0x95, 0xff, 0x0c, 0xe1, 0xf9, 0x17, 0x3c, 0x00, 0xd4, 0xa1, 0x02, 0xe3, - 0xea, 0xf7, 0xdf, 0xa4, 0xfa, 0x9a, 0x69, 0xfe, 0x38, 0x5a, 0xf7, 0xcb, 0x10, 0xfb, 0xd7, 0xe9, - 0xfe, 0xf8, 0x85, 0xfb, 0xac, 0xab, 0xfe, 0x2c, 0x29, 0xfe, 0x5e, 0x29, 0xfc, 0xb3, 0x64, 0x00, - 0xb6, 0x72, 0x00, 0x9a, 0x13, 0xfd, 0x68, 0x40, 0x3b, 0x85, 0x74, 0x30, 0x4c, 0xce, 0xec, 0xac, - 0xb1, 0x0b, 0x10, 0x05, 0x2a, 0x66, 0x25, 0x02, 0xbb, 0xfa, 0xe9, 0x17, 0x3f, 0xfe, 0x71, 0x5a, - 0x16, 0x10, 0xce, 0xf6, 0x04, 0xbd, 0xda, 0x8a, 0x12, 0xfe, 0x9d, 0x79, 0x13, 0x7e, 0x54, 0xff, - 0x75, 0xb7, 0xf9, 0x1b, 0xf9, 0xfd, 0xe5, 0xe0, 0xf7, 0x4a, 0x72, 0x00, 0x24, 0x54, 0x04, 0x3e, - 0xc2, 0xf5, 0xf4, 0x21, 0xfa, 0xbb, 0x6f, 0xff, 0x70, 0x65, 0xf5, 0xc6, 0xc3, 0xf9, 0x0a, 0x29, - 0xff, 0x0c, 0x07, 0xfc, 0x51, 0xf5, 0xfe, 0x45, 0xf7, 0xfd, 0xb2, 0x3b, 0xfc, 0xed, 0xaa, 0x00, - 0xb0, 0x9b, 0x00, 0x21, 0xfe, 0xfc, 0xbf, 0x87, 0x41, 0x23, 0xc3, 0x34, 0xad, 0xdf, 0xe5, 0x6b, - 0x60, 0x04, 0x17, 0x89, 0x2c, 0xe2, 0x61, 0x07, 0xc1, 0x4c, 0xe8, 0x23, 0x34, 0xfe, 0x23, 0xab, - 0x1b, 0x2d, 0xaf, 0xf7, 0x2e, 0xc6, 0xd5, 0xc8, 0xf3, 0xf7, 0x79, 0xc0, 0x14, 0x60, 0xce, 0x05, - 0x48, 0x67, 0xfb, 0xdc, 0x79, 0xfb, 0x63, 0xfe, 0xf5, 0xfa, 0x40, 0x01, 0x7e, 0x11, 0x04, 0xbe, - 0xeb, 0xf4, 0x59, 0x41, 0xfa, 0x4c, 0x04, 0xff, 0xf2, 0x7f, 0xf5, 0xcb, 0x5e, 0xf8, 0xa1, 0x74, - 0xfe, 0x6a, 0x39, 0xfd, 0xa8, 0x5b, 0xff, 0x6f, 0x22, 0xfe, 0x7d, 0xbd, 0xfb, 0x6a, 0x74, 0x00, - 0xb7, 0xe3, 0x00, 0x11, 0x76, 0xfd, 0xcd, 0x76, 0x4a, 0x80, 0x69, 0x37, 0xa8, 0xb9, 0xdd, 0x39, - 0x5b, 0xfe, 0x56, 0xb6, 0x2c, 0x43, 0x7d, 0x0c, 0xe3, 0xbb, 0xe8, 0xfe, 0xf5, 0xfd, 0x5e, 0x79, - 0x1f, 0x2e, 0xaf, 0xf7, 0xb9, 0x3c, 0xd3, 0xb8, 0x2e, 0xf3, 0xc0, 0xb2, 0x13, 0xb9, 0xa3, 0x0b, - 0xf5, 0x40, 0xfe, 0x06, 0x85, 0xf9, 0xcf, 0xcb, 0xf3, 0x71, 0xd0, 0x01, 0x33, 0x4b, 0x04, 0xb4, - 0x80, 0xf3, 0xcb, 0x78, 0xfa, 0x0e, 0x1b, 0xff, 0xf3, 0x23, 0xf5, 0x8a, 0x2b, 0xf8, 0xd5, 0x27, - 0xfe, 0x93, 0x8f, 0xfd, 0x45, 0xda, 0xff, 0x8a, 0x79, 0xfe, 0x99, 0x05, 0xfb, 0xea, 0xfe, 0xff, - 0x7e, 0xbc, 0x01, 0x10, 0xc1, 0xfd, 0x72, 0x76, 0x54, 0x68, 0x4a, 0x3a, 0x06, 0x25, 0xd4, 0x88, - 0xac, 0xf7, 0xc4, 0xb2, 0x2b, 0xa0, 0xde, 0x11, 0x7b, 0x79, 0xeb, 0x4b, 0x2d, 0xfc, 0x66, 0x79, - 0x20, 0x13, 0x0b, 0xf8, 0xe1, 0xdb, 0xd2, 0xdf, 0xa2, 0xef, 0x39, 0xba, 0x10, 0x21, 0x57, 0x0f, - 0x74, 0xdb, 0x01, 0x28, 0xd7, 0xf8, 0x3c, 0xc0, 0xf0, 0xb7, 0xf8, 0x01, 0x15, 0x10, 0x05, 0x60, - 0x5a, 0xf1, 0x35, 0xba, 0xfa, 0xa5, 0x1f, 0xff, 0xc2, 0xb1, 0xf4, 0xa6, 0xf0, 0xf8, 0x4d, 0x3f, - 0xfd, 0x61, 0x9f, 0xfd, 0xbf, 0x82, 0x00, 0x0e, 0x18, 0xfe, 0x26, 0x60, 0xfa, 0x32, 0xd5, 0xff, - 0x31, 0x8c, 0x02, 0xc6, 0x91, 0xfd, 0xe0, 0x2d, 0x5d, 0x27, 0xc9, 0x3e, 0x58, 0x16, 0xcb, 0xf3, - 0x12, 0xf2, 0x24, 0xaa, 0x2a, 0xae, 0x32, 0x15, 0xb3, 0x1a, 0xf0, 0x28, 0x24, 0xfa, 0x2d, 0x43, - 0x21, 0x3a, 0xf6, 0xfa, 0x8e, 0x82, 0xd2, 0x53, 0xd4, 0xec, 0xb1, 0x3d, 0x0d, 0xd5, 0x49, 0x11, - 0x8a, 0xd4, 0x06, 0x46, 0x53, 0xf9, 0x54, 0x06, 0xee, 0xcd, 0x28, 0x02, 0x12, 0xa5, 0x05, 0x08, - 0x0a, 0xf0, 0x6b, 0x5c, 0xfb, 0x97, 0xa8, 0xff, 0xcf, 0x66, 0xf4, 0x95, 0x6a, 0xf9, 0xf8, 0x41, - 0xfd, 0x75, 0xa1, 0xfd, 0x89, 0xb2, 0x00, 0xab, 0xd1, 0xfd, 0x5f, 0x50, 0xfa, 0x12, 0x92, 0x00, - 0xcd, 0xb1, 0x02, 0xf2, 0xd1, 0xfc, 0x5c, 0x1e, 0x67, 0xea, 0x50, 0x3f, 0x67, 0x14, 0xc2, 0x63, - 0x04, 0xf1, 0x0c, 0xdc, 0x28, 0x79, 0x3b, 0x14, 0xaf, 0x56, 0xf3, 0x08, 0x5b, 0xf9, 0xa1, 0x90, - 0x22, 0x7e, 0xaa, 0xfe, 0x43, 0xa8, 0xd0, 0x33, 0x7b, 0xe9, 0xeb, 0x05, 0x0b, 0x72, 0x6c, 0x11, - 0x27, 0xf0, 0x0a, 0x7b, 0xb6, 0xf9, 0xc8, 0x72, 0xec, 0x96, 0x9d, 0x02, 0xf9, 0xb5, 0x03, 0x47, - 0x7b, 0xef, 0x61, 0x41, 0xfd, 0x87, 0xaa, 0xff, 0xd6, 0x13, 0xf3, 0x28, 0x7b, 0xf9, 0x76, 0x28, - 0xfe, 0x22, 0xfd, 0xfc, 0x58, 0x3c, 0x00, 0xd9, 0xa1, 0xfd, 0xd9, 0xa2, 0xfa, 0x47, 0x9f, 0x01, - 0x92, 0xa3, 0x01, 0x86, 0xe7, 0xfb, 0x56, 0x55, 0x6d, 0x7c, 0xe5, 0x42, 0xd2, 0x17, 0xbb, 0x17, - 0x80, 0xf0, 0x5e, 0xc4, 0x27, 0x1c, 0xdb, 0x0f, 0xa9, 0x62, 0xf6, 0xc1, 0xb9, 0xf7, 0xa2, 0xb8, - 0x24, 0x7c, 0x98, 0x06, 0xc6, 0x88, 0xcd, 0x47, 0xd3, 0xe3, 0xde, 0xdb, 0x09, 0xac, 0xd9, 0x11, - 0xd3, 0xaa, 0x0c, 0xed, 0x6b, 0xfb, 0xa8, 0x78, 0xed, 0xe4, 0xe7, 0x00, 0xd3, 0x6e, 0x01, 0xfe, - 0xbc, 0xf0, 0x3d, 0xe0, 0xfe, 0xa5, 0x31, 0xff, 0x95, 0x25, 0xf2, 0xa6, 0x84, 0xf9, 0x96, 0xce, - 0xfe, 0x4c, 0x14, 0xfc, 0xa1, 0x97, 0xff, 0x98, 0x3d, 0xfe, 0x1d, 0x06, 0xfb, 0x96, 0x26, 0x02, - 0x7b, 0xbe, 0x00, 0x0a, 0x0f, 0xfb, 0xd1, 0x0b, 0x74, 0x13, 0x17, 0x43, 0xab, 0xd3, 0xb5, 0x3f, - 0xb0, 0xf3, 0x27, 0xa6, 0x25, 0x37, 0xbc, 0x09, 0xa2, 0xd2, 0xf6, 0xf6, 0x1c, 0xf6, 0x01, 0xe6, - 0x28, 0x07, 0xa4, 0x0e, 0x0a, 0x21, 0xca, 0x74, 0xd8, 0xdd, 0xdb, 0x7b, 0x09, 0x63, 0x1a, 0x12, - 0x1c, 0x1c, 0x0c, 0xd4, 0x3b, 0xfe, 0x4c, 0xcc, 0xef, 0x71, 0xc7, 0xfd, 0x33, 0x0e, 0x00, 0xa8, - 0x79, 0xf2, 0x0e, 0xbf, 0xff, 0xf4, 0x6c, 0xfe, 0x07, 0x3e, 0xf1, 0x08, 0x94, 0xfa, 0xa4, 0xb3, - 0xfe, 0x24, 0x88, 0xfa, 0x4d, 0x52, 0xff, 0x1f, 0x0b, 0xff, 0xaa, 0xa4, 0xfb, 0x17, 0x18, 0x02, - 0x4e, 0x32, 0x00, 0xb2, 0x46, 0xfa, 0xca, 0xb1, 0x78, 0x3c, 0xc1, 0x43, 0xbb, 0x36, 0xb3, 0xca, - 0x7b, 0xf7, 0x11, 0x3c, 0x23, 0xd1, 0xe4, 0x03, 0x69, 0x6d, 0xf5, 0x18, 0x26, 0xf3, 0x84, 0x86, - 0x2e, 0x7e, 0xd2, 0x16, 0x5b, 0xba, 0xc7, 0x9c, 0xe1, 0xd8, 0x49, 0x55, 0x08, 0xe2, 0xb8, 0x11, - 0x63, 0x92, 0x0a, 0x6a, 0x91, 0x02, 0xd9, 0x1a, 0xf2, 0x06, 0xaf, 0xf9, 0xa1, 0x27, 0x01, 0x99, - 0xb2, 0xf3, 0xbf, 0x41, 0xff, 0xc0, 0x36, 0xfe, 0x12, 0xd8, 0xf0, 0xe9, 0x1b, 0xfc, 0xcd, 0xf8, - 0xfd, 0xda, 0x18, 0xf9, 0xb3, 0xf7, 0xfe, 0x06, 0xde, 0xff, 0x02, 0xca, 0xfc, 0x59, 0x4d, 0x01, - 0x8b, 0x15, 0x00, 0x20, 0x0d, 0xfa, 0x1e, 0x63, 0x7a, 0x82, 0x3d, 0x46, 0x2f, 0x33, 0xb3, 0x26, - 0xb1, 0xf9, 0xe8, 0x42, 0x21, 0xe6, 0xf8, 0xff, 0x26, 0xe9, 0xf2, 0xed, 0x3c, 0xee, 0xbb, 0x5d, - 0x33, 0x11, 0x4d, 0x1e, 0x7a, 0x16, 0xc8, 0x24, 0x2b, 0xd6, 0x9a, 0xf6, 0x04, 0xe9, 0xad, 0x10, - 0x7c, 0xf4, 0x08, 0x9d, 0xb5, 0x06, 0x28, 0xf9, 0xf4, 0xcf, 0x83, 0xf5, 0x5f, 0x3a, 0x03, 0x23, - 0x12, 0xf5, 0x78, 0x6c, 0xfd, 0xfa, 0x47, 0xfe, 0x8f, 0xa4, 0xf1, 0x62, 0x58, 0xfd, 0x58, 0xa4, - 0xfc, 0x61, 0x25, 0xf8, 0xa7, 0xa0, 0xfe, 0xa5, 0x7c, 0x00, 0x1b, 0xf8, 0xfd, 0x7d, 0xf0, 0xff, - 0x1c, 0x96, 0x00, 0x20, 0x8e, 0xfa, 0x6e, 0x5b, 0x7c, 0x49, 0x67, 0x49, 0x46, 0x8a, 0xb3, 0xd4, - 0x92, 0xf9, 0x0d, 0x62, 0x1f, 0x9f, 0x97, 0xfe, 0x08, 0x57, 0xef, 0x42, 0x22, 0xe8, 0xea, 0xb3, - 0x36, 0x6a, 0x24, 0x24, 0xbf, 0xf6, 0xca, 0xd6, 0x0f, 0xd5, 0x6f, 0x9d, 0xff, 0x08, 0xa3, 0x0f, - 0xed, 0x9c, 0x08, 0x00, 0x30, 0x09, 0xc3, 0x07, 0xf8, 0x08, 0x19, 0xf3, 0xc3, 0x1b, 0x04, 0xd3, - 0x62, 0xf6, 0x74, 0xa5, 0xfb, 0x4c, 0x0a, 0xfe, 0xf9, 0x12, 0xf3, 0x50, 0xbd, 0xfd, 0xd6, 0x56, - 0xfb, 0xdc, 0xb4, 0xf7, 0xcf, 0x4d, 0xfe, 0x03, 0xcf, 0x00, 0x7f, 0x71, 0xfe, 0x91, 0x6e, 0xff, - 0xbf, 0x49, 0x01, 0xe5, 0xf4, 0xf9, 0xcc, 0x79, 0x7d, 0xaf, 0x25, 0x4b, 0x66, 0xf9, 0xb5, 0x4e, - 0x24, 0xf9, 0x86, 0x35, 0x1d, 0x56, 0xbb, 0xfe, 0x3c, 0x89, 0xeb, 0x5f, 0xde, 0xe2, 0x7e, 0xb0, - 0x36, 0xf8, 0xc4, 0x27, 0x0f, 0x30, 0xd1, 0x47, 0x31, 0xd5, 0xe0, 0x77, 0xf9, 0x14, 0xff, 0x0d, - 0x90, 0x7d, 0x09, 0x62, 0xd3, 0x09, 0x5e, 0xf3, 0xf9, 0xe8, 0xac, 0xf3, 0xe1, 0x8a, 0x03, 0xfb, - 0x16, 0xf7, 0x6e, 0x29, 0xfb, 0x29, 0x9b, 0xfd, 0x96, 0xae, 0xf4, 0xf6, 0x5c, 0xfd, 0xfd, 0x6e, - 0xfa, 0x15, 0xa7, 0xf7, 0x40, 0xd3, 0xfd, 0x3e, 0x9f, 0x00, 0x08, 0xcf, 0xfe, 0xe5, 0xd3, 0xff, - 0x88, 0xe9, 0xff, 0x1e, 0x3e, 0xf9, 0xd5, 0xa0, 0x7b, 0x13, 0xd8, 0x4e, 0x94, 0xae, 0xba, 0x57, - 0x23, 0xf7, 0x99, 0x37, 0x1c, 0x9d, 0x11, 0xfe, 0x27, 0x54, 0xe9, 0x7d, 0x92, 0xde, 0x31, 0x6f, - 0x31, 0x7a, 0x45, 0x2c, 0xac, 0xf6, 0xd9, 0xfd, 0x50, 0xd5, 0xa4, 0x79, 0xf3, 0x24, 0xb5, 0x0b, - 0xcc, 0x77, 0x0b, 0x70, 0x30, 0x09, 0x10, 0x10, 0xfb, 0xdb, 0xa6, 0xf6, 0xb1, 0x66, 0x02, 0x3d, - 0xb4, 0xf6, 0x06, 0xfc, 0xfb, 0x73, 0x0b, 0xfe, 0x78, 0x61, 0xf5, 0xd3, 0xa7, 0xfc, 0x2a, 0x08, - 0xfa, 0x63, 0x37, 0xf7, 0x56, 0x9c, 0xfd, 0x19, 0x0b, 0x01, 0x18, 0x49, 0xfe, 0x53, 0xf0, 0xfe, - 0xa7, 0xe2, 0xfe, 0x8a, 0x54, 0xf9, 0x3c, 0x92, 0x77, 0x28, 0xbf, 0x53, 0x23, 0x51, 0xc1, 0x93, - 0x93, 0xf4, 0x8e, 0x3c, 0x1b, 0x55, 0x96, 0xfc, 0x82, 0xcf, 0xe9, 0x1a, 0xc0, 0xda, 0x88, 0x74, - 0x27, 0x3a, 0x9d, 0x31, 0x2f, 0xcc, 0xe3, 0xb0, 0xba, 0xd5, 0xe5, 0x5f, 0xef, 0x67, 0x4a, 0x08, - 0x3d, 0x6f, 0x0d, 0x84, 0x19, 0x08, 0xda, 0x78, 0xfb, 0x66, 0x8d, 0xfb, 0x51, 0xc5, 0x00, 0xf9, - 0xe2, 0xf5, 0x7a, 0x28, 0xfe, 0x2f, 0x84, 0xfe, 0x33, 0xbd, 0xf5, 0x21, 0x7e, 0xfb, 0xcf, 0x8d, - 0xf9, 0x03, 0x4b, 0xf7, 0x90, 0x0b, 0xfe, 0x02, 0x9f, 0x00, 0x74, 0xb5, 0xfb, 0xda, 0x38, 0xff, - 0xa9, 0xec, 0xfe, 0x6d, 0x6f, 0xf8, 0x44, 0xba, 0x71, 0xe9, 0x3a, 0x59, 0xe4, 0xd9, 0xc9, 0x9f, - 0x01, 0xf1, 0x59, 0x51, 0x18, 0xdb, 0xb4, 0xfb, 0xea, 0x0a, 0xee, 0x2a, 0xb7, 0xd6, 0xa1, 0x35, - 0x19, 0x42, 0x50, 0x36, 0x07, 0xfc, 0xed, 0x08, 0x18, 0xd7, 0xce, 0xf0, 0xed, 0xed, 0x85, 0x03, - 0x6b, 0x37, 0x0d, 0xc7, 0xf0, 0x07, 0xff, 0x65, 0xfb, 0xb1, 0x7f, 0x00, 0x5a, 0x5f, 0x00, 0x41, - 0x6e, 0xf4, 0x4c, 0x9d, 0x00, 0xfd, 0x31, 0xff, 0xc9, 0x72, 0xf5, 0x6b, 0x0c, 0xfa, 0xcb, 0x65, - 0xf9, 0x81, 0x31, 0xf8, 0xfb, 0x57, 0xfc, 0x97, 0x10, 0xff, 0xb4, 0xa2, 0xfa, 0x24, 0x40, 0xff, - 0xea, 0x74, 0xff, 0xe8, 0xa9, 0xf8, 0x9e, 0xf4, 0x6b, 0xa5, 0x76, 0x5a, 0x1f, 0x0b, 0xd4, 0x1c, - 0xf0, 0xf1, 0x08, 0x13, 0x13, 0x66, 0xdc, 0xfa, 0x11, 0xbb, 0xf1, 0x9b, 0xa8, 0xd1, 0x59, 0x71, - 0x0c, 0x54, 0xa3, 0x39, 0xa4, 0xa4, 0xf7, 0x28, 0x6a, 0xd8, 0xc5, 0xb7, 0xee, 0x37, 0xf8, 0xfe, - 0x84, 0x97, 0x08, 0x02, 0xe1, 0x0a, 0x1a, 0xe2, 0xfb, 0xac, 0x25, 0x02, 0x8e, 0x9c, 0x03, 0x55, - 0x4b, 0xf2, 0x3d, 0x73, 0x01, 0x2b, 0x7e, 0x01, 0x36, 0xe3, 0xf3, 0x56, 0x82, 0xf9, 0x6f, 0x6d, - 0xf9, 0x71, 0xa8, 0xf6, 0x1d, 0x43, 0xfa, 0xfa, 0x70, 0xfe, 0x28, 0x0f, 0xfa, 0x07, 0x5f, 0xff, - 0x45, 0x78, 0x01, 0xde, 0x68, 0xf8, 0x6f, 0x3e, 0x64, 0x22, 0x2a, 0x5a, 0x40, 0x30, 0xe0, 0xc2, - 0x39, 0xf5, 0x64, 0x18, 0x0e, 0xaa, 0x12, 0xfa, 0xdb, 0x9b, 0xf4, 0x2f, 0x81, 0xcc, 0x9e, 0xfb, - 0xff, 0xd3, 0x12, 0x3c, 0xe4, 0x57, 0x02, 0x5e, 0x08, 0xd9, 0xe1, 0xea, 0xef, 0x26, 0x2b, 0xfd, - 0x1a, 0x1f, 0x00, 0x0a, 0x1b, 0x0e, 0xc9, 0xb9, 0xff, 0x1f, 0x8e, 0xff, 0x00, 0x9f, 0x08, 0x53, - 0x38, 0xf3, 0xb6, 0x76, 0xfe, 0x60, 0x9b, 0x04, 0xbf, 0x49, 0xf4, 0xf6, 0x5d, 0xf7, 0x91, 0x03, - 0xf9, 0x1f, 0x94, 0xf5, 0x7b, 0xa3, 0xf7, 0xac, 0x69, 0xfe, 0xdf, 0x3b, 0xfb, 0xe0, 0xce, 0xfe, - 0x99, 0x13, 0x03, 0x14, 0xc0, 0xf8, 0x33, 0x7e, 0x5d, 0xb7, 0x44, 0x5a, 0xe1, 0x15, 0xec, 0x26, - 0x2a, 0xf6, 0x79, 0x70, 0x06, 0x31, 0x76, 0xfa, 0x2d, 0xde, 0xfa, 0x7b, 0x37, 0xcb, 0xa0, 0x0f, - 0xf2, 0x57, 0x3b, 0x39, 0xd7, 0xad, 0x0d, 0x13, 0x6c, 0xda, 0x78, 0xe9, 0xf0, 0xf6, 0x3f, 0x00, - 0xd2, 0xc0, 0xf6, 0xee, 0x58, 0x0c, 0x64, 0x3b, 0x07, 0x27, 0x30, 0xfd, 0x1f, 0x35, 0x0a, 0x99, - 0x20, 0xf8, 0xc9, 0xe6, 0xfa, 0xea, 0x64, 0x04, 0x92, 0xc0, 0xf6, 0x1f, 0xad, 0xf5, 0x79, 0xb0, - 0xf7, 0xe0, 0xa4, 0xf5, 0x1b, 0x4b, 0xf6, 0xb1, 0xd7, 0xfd, 0x00, 0x01, 0xfd, 0x6d, 0x39, 0xfe, - 0x8f, 0x4b, 0x03, 0x95, 0x3d, 0xfa, 0x93, 0x43, 0x59, 0x44, 0xcc, 0x59, 0xec, 0xbe, 0xef, 0x26, - 0xc0, 0xf8, 0xea, 0xd7, 0x09, 0xec, 0x22, 0xf6, 0xdb, 0xe2, 0xf7, 0x5e, 0x13, 0xd1, 0xa6, 0xa9, - 0xe9, 0x2a, 0x49, 0x30, 0x8e, 0x50, 0x18, 0xae, 0x1f, 0xde, 0xfd, 0x98, 0xee, 0xaa, 0xbd, 0x05, - 0x0e, 0x6d, 0xf1, 0xf2, 0x01, 0x06, 0x1f, 0xb9, 0x0e, 0x3f, 0x4b, 0xfe, 0xb7, 0x45, 0x07, 0x1a, - 0xc5, 0xfc, 0xea, 0xe1, 0xf9, 0xac, 0x0c, 0x01, 0x23, 0x9d, 0xfa, 0x2b, 0x63, 0xf5, 0xdc, 0x97, - 0xf5, 0x4e, 0x34, 0xf8, 0x92, 0x14, 0xf5, 0x53, 0x37, 0xfc, 0x62, 0xca, 0xfe, 0x0c, 0xc9, 0xfd, - 0x1d, 0x3f, 0x02, 0x0d, 0xec, 0xfa, 0xb9, 0x07, 0x5b, 0x85, 0x53, 0x56, 0x33, 0x2b, 0xec, 0x3c, - 0x04, 0xfd, 0x7a, 0x4a, 0x0f, 0x0a, 0x93, 0xf1, 0xd7, 0xa0, 0xf0, 0xf1, 0x35, 0xd8, 0x32, 0x94, - 0xe9, 0xbf, 0x01, 0x24, 0xf6, 0xb4, 0x1d, 0x67, 0x27, 0xe4, 0x9e, 0xcc, 0xeb, 0x7a, 0xa2, 0x0a, - 0x38, 0x86, 0xf0, 0x6c, 0xa3, 0x00, 0xc6, 0x06, 0x11, 0xf6, 0xc8, 0xff, 0x62, 0x5d, 0x05, 0x38, - 0x55, 0xfd, 0x33, 0xc9, 0xfb, 0x3e, 0xbf, 0xfe, 0xd3, 0x97, 0xfa, 0x56, 0xae, 0xf8, 0xa1, 0xce, - 0xf4, 0x4c, 0x1d, 0xfa, 0x93, 0x23, 0xf6, 0x91, 0xb5, 0xf8, 0xc5, 0xe8, 0xfe, 0xab, 0x7e, 0xfd, - 0xf3, 0x96, 0x01, 0x05, 0xd7, 0xfb, 0xea, 0x64, 0x5a, 0x80, 0xb5, 0x54, 0x10, 0x87, 0xe9, 0x7c, - 0xa4, 0xff, 0x30, 0x04, 0x15, 0x52, 0x87, 0xed, 0xf3, 0x41, 0xec, 0xb1, 0x44, 0xdf, 0x77, 0xf5, - 0xe8, 0x4d, 0xad, 0x17, 0x4f, 0x6a, 0x21, 0x5f, 0xa2, 0xed, 0x89, 0x4c, 0xe7, 0xab, 0x61, 0x0e, - 0x9f, 0x67, 0xf3, 0x18, 0xaf, 0xf9, 0x39, 0xa8, 0x13, 0xff, 0x1f, 0xfe, 0x8a, 0xbf, 0x02, 0x32, - 0x13, 0x02, 0xcf, 0xc7, 0xf9, 0x01, 0xcc, 0xfd, 0xdc, 0x18, 0xfe, 0xd3, 0x37, 0xfb, 0xb3, 0x80, - 0xf5, 0xff, 0x7a, 0xfb, 0x63, 0x5b, 0xf7, 0xc6, 0x25, 0xf5, 0x4b, 0xb1, 0xfd, 0x3d, 0xed, 0xfc, - 0x4c, 0x22, 0x01, 0x4b, 0x3c, 0xfe, 0xa5, 0x5b, 0x5d, 0x72, 0x96, 0x4d, 0x37, 0x75, 0xe5, 0x81, - 0xcc, 0x06, 0x6f, 0x9d, 0x15, 0xc4, 0xdc, 0xe9, 0x29, 0x84, 0xeb, 0xa0, 0x47, 0xe4, 0x19, 0xbc, - 0xe7, 0xcb, 0x05, 0x0e, 0x78, 0xe9, 0x24, 0x4c, 0x9e, 0xf4, 0xae, 0xf4, 0xe3, 0x52, 0xe0, 0x0e, - 0x3d, 0x6b, 0xf9, 0xaf, 0x30, 0xf5, 0x37, 0x0e, 0x0f, 0x0c, 0xd8, 0x01, 0x26, 0x67, 0xfe, 0x2b, - 0xc4, 0x00, 0xa1, 0x51, 0xfe, 0xa2, 0x52, 0xfd, 0x85, 0x1d, 0x01, 0x4e, 0xeb, 0xfd, 0xa1, 0xe7, - 0xf4, 0x94, 0xba, 0xfb, 0x16, 0x2a, 0xf9, 0x7a, 0xe3, 0xf4, 0xe1, 0x62, 0xf9, 0xf5, 0x2d, 0xfc, - 0x36, 0x3d, 0x01, 0x84, 0xdd, 0xfd, 0x0e, 0x20, 0x5f, 0xc0, 0x63, 0x4b, 0x47, 0xdc, 0xdc, 0x38, - 0xe0, 0x08, 0xfd, 0x6e, 0x1e, 0xb3, 0x9f, 0xe5, 0xef, 0x88, 0xe5, 0x90, 0x64, 0xeb, 0x09, 0xba, - 0xed, 0xd7, 0x1e, 0x03, 0xcf, 0x40, 0x20, 0xaf, 0xaf, 0x00, 0x22, 0x85, 0xe2, 0x6d, 0x24, 0x0a, - 0x62, 0x74, 0x00, 0x01, 0x5e, 0xf3, 0xea, 0x4f, 0x0a, 0x0d, 0x29, 0x03, 0x16, 0xaa, 0xfb, 0x02, - 0x88, 0xfe, 0x6d, 0xcc, 0x03, 0x18, 0xce, 0x00, 0x29, 0xc0, 0xff, 0xfb, 0x6b, 0x00, 0xf6, 0xfc, - 0xf5, 0xe5, 0x35, 0xfa, 0xbc, 0x7b, 0xfb, 0x5c, 0x8e, 0xf5, 0x17, 0x3b, 0xf7, 0x3e, 0x20, 0xfa, - 0x73, 0x06, 0xff, 0xd4, 0x5b, 0xfd, 0x96, 0x79, 0x60, 0x22, 0x26, 0x48, 0x4c, 0x0c, 0xd3, 0x09, - 0xe3, 0x0c, 0x16, 0x8d, 0x28, 0x99, 0x4d, 0xdf, 0x12, 0xe8, 0xdf, 0x03, 0xe8, 0xf3, 0xec, 0x45, - 0xf4, 0xf0, 0x15, 0xf9, 0x2b, 0x8c, 0x19, 0x79, 0x80, 0x0b, 0x17, 0xd2, 0xe2, 0x48, 0x8b, 0x04, - 0x98, 0xfc, 0x05, 0x46, 0x14, 0xf2, 0x3c, 0x69, 0x06, 0x73, 0xa4, 0x04, 0x6a, 0x8a, 0xfa, 0x9e, - 0x66, 0xfe, 0xd8, 0x51, 0x05, 0xcd, 0x87, 0x02, 0xe0, 0xab, 0x01, 0x97, 0xf6, 0x00, 0xa1, 0x96, - 0xf6, 0xe5, 0x62, 0xfa, 0x77, 0xde, 0xfb, 0x6f, 0x50, 0xf6, 0xc0, 0xa3, 0xf7, 0xb5, 0x14, 0xf9, - 0xd5, 0xc3, 0xfa, 0x6f, 0x8c, 0xfb, 0x13, 0xee, 0x61, 0x41, 0x6f, 0x41, 0x19, 0xd6, 0xca, 0xa5, - 0xc1, 0x14, 0xf7, 0x80, 0x2e, 0x5f, 0xce, 0xd8, 0x5d, 0xaf, 0xde, 0x3a, 0x4b, 0xfa, 0x8b, 0x71, - 0xf9, 0x73, 0x80, 0xf2, 0xfc, 0x98, 0x11, 0xe9, 0x3c, 0x12, 0x2a, 0x2c, 0xe6, 0x0a, 0x14, 0x01, - 0x18, 0x35, 0x07, 0x51, 0x16, 0xf0, 0xb3, 0xd1, 0x05, 0xae, 0x41, 0x08, 0x83, 0x98, 0xf8, 0xe5, - 0x4a, 0xfe, 0x3c, 0x3e, 0x07, 0x26, 0xad, 0xff, 0x4c, 0xcf, 0x03, 0x68, 0xbd, 0x04, 0xc8, 0xb8, - 0xf4, 0x6b, 0x39, 0xfb, 0x5e, 0x1b, 0xfd, 0x43, 0xc7, 0xf4, 0xec, 0x7f, 0xf9, 0xdb, 0x72, 0xfa, - 0x50, 0xda, 0xf6, 0x34, 0xd9, 0xf8, 0x27, 0x2d, 0x62, 0xe3, 0x50, 0x38, 0xfa, 0xa2, 0xc6, 0x33, - 0x8c, 0x1e, 0x0a, 0x87, 0x2f, 0x49, 0xfa, 0xd3, 0xa5, 0xae, 0xe0, 0xd3, 0x07, 0x00, 0xa2, 0xf5, - 0xfb, 0x1c, 0x03, 0xeb, 0xe9, 0xc7, 0x0d, 0xbc, 0xc1, 0x18, 0xd4, 0x69, 0xe6, 0x47, 0xce, 0xfc, - 0xd1, 0x9f, 0x0a, 0x30, 0x17, 0xf1, 0xb7, 0x7e, 0x01, 0x18, 0x87, 0x0b, 0x9f, 0x7f, 0xfc, 0x98, - 0x3a, 0xfb, 0x73, 0x01, 0x06, 0x2b, 0x95, 0x00, 0xe4, 0x4d, 0x02, 0x9a, 0xa3, 0x06, 0x29, 0xd7, - 0xf7, 0xed, 0x21, 0xf9, 0xa5, 0x30, 0xfe, 0xf4, 0x46, 0xf6, 0x5f, 0xc5, 0xf7, 0xc6, 0x0d, 0xfd, - 0x4f, 0x55, 0xf7, 0x05, 0x51, 0xf5, 0x8f, 0xc4, 0x5d, 0x16, 0x52, 0x30, 0x8f, 0x7d, 0xc9, 0xb3, - 0x2b, 0x25, 0x6f, 0x95, 0x2b, 0x07, 0x98, 0xd3, 0x58, 0xe8, 0xe6, 0xb9, 0x6e, 0x01, 0x95, 0xcf, - 0xf9, 0xad, 0xbe, 0xe8, 0xc0, 0xd1, 0x0c, 0xc4, 0x3a, 0x1a, 0x87, 0xd4, 0xe5, 0x32, 0xa0, 0xfa, - 0x91, 0x82, 0x0e, 0xd4, 0xad, 0xf2, 0x37, 0xaa, 0xfc, 0x02, 0x4b, 0x0d, 0x7e, 0xaa, 0x00, 0xca, - 0x91, 0xf9, 0x3a, 0x3d, 0x04, 0x66, 0x72, 0x00, 0x46, 0x3b, 0x01, 0x58, 0xf7, 0x06, 0x78, 0x88, - 0xf9, 0xd4, 0x28, 0xf9, 0x0b, 0x43, 0xff, 0xc2, 0x95, 0xf7, 0xf0, 0xd9, 0xf6, 0x23, 0x7f, 0xfd, - 0x57, 0x52, 0xf9, 0x66, 0x4d, 0xf5, 0xaf, 0xbf, 0x55, 0x8e, 0xf3, 0x2a, 0xe1, 0xc7, 0xd0, 0x4a, - 0x9b, 0x26, 0x00, 0x82, 0x27, 0x15, 0x59, 0xd8, 0x86, 0x5c, 0xea, 0x2e, 0x15, 0x00, 0x81, 0x25, - 0xfb, 0xad, 0x92, 0xe8, 0xea, 0x62, 0x08, 0xe3, 0xad, 0x1a, 0x1f, 0x80, 0xe9, 0x09, 0xf4, 0xf7, - 0xe7, 0xb7, 0x0e, 0xbb, 0x16, 0xf7, 0x58, 0xd6, 0xfa, 0x5d, 0x31, 0x0b, 0xbe, 0x36, 0x02, 0xb4, - 0x3a, 0xfb, 0x94, 0x4c, 0x04, 0x36, 0x03, 0xfe, 0x05, 0x9f, 0x00, 0x40, 0xd1, 0x07, 0x41, 0x78, - 0xf8, 0xae, 0x2d, 0xfa, 0x1a, 0xa7, 0x01, 0x31, 0xd6, 0xf7, 0xbb, 0x37, 0xf7, 0x7b, 0x08, 0xfe, - 0x13, 0x15, 0xfa, 0xb2, 0xbc, 0xf6, 0x76, 0x02, 0x4c, 0x71, 0x60, 0x28, 0x15, 0x60, 0xd8, 0xd3, - 0x33, 0x24, 0xc3, 0x6e, 0x26, 0x88, 0x14, 0xdd, 0xe8, 0xbb, 0xea, 0x46, 0x5b, 0x01, 0x14, 0x22, - 0xfd, 0x09, 0xaa, 0xe7, 0xff, 0x2f, 0x04, 0x42, 0x0a, 0x1b, 0x30, 0xfc, 0xed, 0xab, 0x10, 0xf5, - 0x13, 0x56, 0x0e, 0x73, 0xba, 0xfb, 0x01, 0xfb, 0xf8, 0x67, 0xc1, 0x08, 0x28, 0xf5, 0x03, 0x00, - 0xde, 0xfb, 0x6f, 0xcf, 0x03, 0xf8, 0xd0, 0xfe, 0x52, 0x08, 0xff, 0xf0, 0x36, 0x06, 0xb8, 0x7c, - 0xfa, 0x0c, 0x70, 0xf9, 0xff, 0x80, 0x01, 0xe0, 0xe0, 0xfa, 0x5c, 0x90, 0xf7, 0x50, 0x3d, 0xfe, - 0xb7, 0x2b, 0xfb, 0x78, 0x42, 0xf7, 0xb4, 0x90, 0x3d, 0xa2, 0x12, 0x1f, 0xbd, 0x80, 0xe5, 0x8e, - 0x56, 0x29, 0x6d, 0x0a, 0x22, 0xd4, 0xd9, 0xdc, 0x69, 0xe2, 0xee, 0x03, 0xb7, 0x05, 0xae, 0x7a, - 0xfb, 0xd1, 0x40, 0xf1, 0x75, 0x3a, 0x05, 0x4c, 0x11, 0x07, 0xbb, 0xaf, 0xf1, 0xbd, 0x2f, 0x05, - 0x27, 0x1a, 0x0b, 0x34, 0x0e, 0xf8, 0x5d, 0x91, 0xfa, 0x23, 0x27, 0x04, 0x8b, 0x9b, 0x01, 0x6e, - 0x19, 0xfb, 0xc4, 0xe2, 0xfe, 0xf2, 0x6b, 0x00, 0x78, 0x7b, 0xff, 0x73, 0xc5, 0xff, 0x7e, 0x32, - 0xfe, 0xb4, 0xab, 0x02, 0xc4, 0xad, 0x03, 0x27, 0xbe, 0x00, 0xa9, 0x2b, 0x01, 0x3d, 0xa3, 0xff, - 0xcf, 0x54, 0xfc, 0xc1, 0xce, 0xfc, 0x48, 0x90, 0x34, 0xbd, 0x60, 0x1d, 0xc4, 0x78, 0xec, 0x4a, - 0xa6, 0x23, 0xfb, 0xac, 0x1e, 0xd7, 0x7b, 0xe4, 0x56, 0x90, 0xf1, 0x26, 0xb6, 0x03, 0x27, 0x57, - 0xfb, 0x93, 0x59, 0xf3, 0x79, 0x8a, 0x04, 0xe1, 0xc6, 0x06, 0x2d, 0x4c, 0xf4, 0x4f, 0x6e, 0x03, - 0xba, 0x79, 0x09, 0x37, 0x19, 0xfa, 0x2c, 0x8c, 0xfa, 0x93, 0x44, 0x02, 0x6d, 0x69, 0x01, 0x71, - 0x3e, 0xfc, 0x8c, 0x8a, 0xfe, 0x55, 0xaf, 0xff, 0x52, 0x12, 0x00, 0x7e, 0x15, 0x01, 0xcf, 0x80, - 0xfe, 0x07, 0x36, 0x01, 0x9f, 0x6e, 0x03, 0x90, 0x26, 0x01, 0x4f, 0x23, 0x00, 0xde, 0x27, 0xff, - 0xf6, 0x2c, 0xfd, 0x74, 0x0c, 0xfd, 0xa7, 0x21, 0x2d, 0x2b, 0x16, 0x1c, 0xad, 0xfa, 0xf1, 0xf8, - 0x45, 0x1e, 0xc0, 0x8a, 0x1c, 0x1f, 0x2a, 0xeb, 0xe8, 0xe6, 0xf2, 0x8c, 0x7a, 0x02, 0xaf, 0x36, - 0xfc, 0x61, 0x36, 0xf5, 0x86, 0xa3, 0x03, 0xee, 0xbd, 0x06, 0x67, 0xf7, 0xf6, 0xcd, 0x79, 0x01, - 0x02, 0x29, 0x08, 0x92, 0x84, 0xfc, 0x64, 0x72, 0xfa, 0xe6, 0x0a, 0x01, 0x9c, 0xb6, 0x01, 0x8e, - 0xf8, 0xfc, 0x93, 0xa2, 0xfe, 0x0b, 0xcc, 0xff, 0x4c, 0xa5, 0x00, 0xfb, 0x4f, 0x01, 0xf6, 0xa1, - 0xfe, 0x76, 0x3f, 0x01, 0xc3, 0x87, 0x02, 0x26, 0x4b, 0x00, 0x35, 0x91, 0x00, 0x8e, 0xf1, 0xff, - 0xaa, 0x87, 0xfd, 0x3c, 0x10, 0xfd, 0xb3, 0x0d, 0x27, 0xf5, 0xa7, 0x1a, 0x88, 0x80, 0xf5, 0x43, - 0xf7, 0x19, 0x2b, 0xdc, 0x1a, 0xce, 0xe7, 0xef, 0x0d, 0x8c, 0xf4, 0x1a, 0x16, 0x02, 0xa3, 0x0b, - 0xfd, 0x2f, 0xe7, 0xf6, 0x4c, 0xef, 0x02, 0x10, 0xb9, 0x06, 0x5d, 0x79, 0xf8, 0x28, 0x0b, 0x00, - 0x8d, 0x7c, 0x07, 0xeb, 0x8d, 0xfd, 0x07, 0x89, 0xfa, 0xfc, 0x97, 0x00, 0x75, 0xda, 0x01, 0x41, - 0xc3, 0xfd, 0x11, 0xa0, 0xfe, 0x60, 0x5d, 0x00, 0x48, 0x15, 0x01, 0x07, 0xa3, 0x00, 0x46, 0x14, - 0xff, 0xad, 0x21, 0x01, 0x70, 0x6b, 0x01, 0x5a, 0x25, 0x00, 0xb2, 0x0d, 0x01, 0xe9, 0xab, 0x00, - 0x8b, 0xfe, 0xfd, 0x10, 0x58, 0xfd, 0x00, 0x57, 0x22, 0x09, 0x8b, 0x18, 0xc9, 0xef, 0xf7, 0x2d, - 0x06, 0x17, 0x4b, 0x91, 0x18, 0xd9, 0xbf, 0xf3, 0x2e, 0x8d, 0xf6, 0xcf, 0x97, 0x01, 0xda, 0x33, - 0xfe, 0xe0, 0x58, 0xf8, 0xa5, 0x32, 0x02, 0xaf, 0x6f, 0x06, 0x2c, 0x7a, 0xf9, 0x6c, 0x49, 0xff, - 0xe5, 0x7b, 0x06, 0xaf, 0x2c, 0xfe, 0xe9, 0xfc, 0xfa, 0x65, 0x65, 0x00, 0x6c, 0x26, 0x02, 0x80, - 0x24, 0xfe, 0x7b, 0x10, 0xff, 0x69, 0xf6, 0x00, 0x7a, 0x7d, 0x00, 0x34, 0x61, 0x00, 0x08, 0x7c, - 0xff, 0xca, 0x81, 0x00, 0x3b, 0x57, 0x01, 0x13, 0x97, 0x00, 0x2d, 0x0b, 0x01, 0x72, 0x0b, 0x01, - 0x1c, 0xb4, 0xfe, 0x46, 0xc1, 0xfd, 0xd0, 0x3a, 0x1e, 0x35, 0x79, 0x16, 0x16, 0x48, 0xfa, 0x5b, - 0x11, 0x14, 0xf6, 0x24, 0x16, 0x04, 0xa9, 0xf7, 0xac, 0x64, 0xf8, 0x66, 0x78, 0x01, 0x58, 0x37, - 0xff, 0x0e, 0x4f, 0xf9, 0xe2, 0x05, 0x02, 0x0c, 0xd5, 0x05, 0x57, 0x0e, 0xfa, 0x3f, 0x06, 0xff, - 0xae, 0xbf, 0x05, 0x20, 0xb1, 0xfe, 0xaf, 0x61, 0xfb, 0x3e, 0xa6, 0x00, 0xea, 0x63, 0x02, 0xb5, - 0xbd, 0xfe, 0x37, 0xbe, 0xff, 0x4c, 0x6c, 0x00, 0xb7, 0x44, 0x00, 0xb1, 0xd5, 0x00, 0xa5, 0x76, - 0xff, 0x1f, 0xa2, 0x00, 0xcb, 0x99, 0x01, 0x62, 0xde, 0x00, 0x76, 0x34, 0x01, 0x85, 0xf9, 0x00, - 0x3e, 0x25, 0xff, 0xf4, 0x5b, 0xfe, 0xfb, 0x1f, 0x1a, 0x7f, 0x0e, 0x14, 0xc0, 0x3e, 0xfc, 0x0d, - 0x03, 0x12, 0x7f, 0xd1, 0x14, 0xdf, 0xe1, 0xfa, 0x47, 0xa2, 0xf9, 0xb4, 0x69, 0x01, 0xde, 0x0c, - 0x00, 0x60, 0x7f, 0xfa, 0x18, 0x8d, 0x01, 0xfe, 0xc9, 0x04, 0x9f, 0xee, 0xfa, 0xbf, 0x16, 0xff, - 0x3b, 0xde, 0x04, 0xd3, 0xd9, 0xfe, 0x60, 0x8d, 0xfc, 0xbf, 0x37, 0x01, 0xfd, 0xfc, 0x01, 0x3f, - 0x3d, 0xff, 0x00, 0xf1, 0xff, 0xc2, 0x53, 0x00, 0xce, 0xe8, 0x00, 0xfc, 0x09, 0x01, 0xd7, 0x83, - 0xff, 0xde, 0xcc, 0x00, 0x9f, 0xd3, 0x01, 0xca, 0x00, 0x01, 0x88, 0x2d, 0x01, 0x66, 0x13, 0x01, - 0x2a, 0x62, 0xff, 0xb0, 0x1a, 0xff, 0x99, 0x40, 0x16, 0x00, 0x65, 0x12, 0x53, 0x09, 0xfe, 0x96, - 0xa6, 0x0f, 0x42, 0x5e, 0x13, 0x5f, 0xaf, 0xfd, 0xf0, 0x13, 0xfb, 0x5e, 0x6e, 0x01, 0x8c, 0xab, - 0x00, 0x56, 0x37, 0xfb, 0xc8, 0xdf, 0x00, 0x0c, 0x3d, 0x04, 0x4d, 0xd7, 0xfb, 0x08, 0x01, 0xff, - 0x1c, 0x04, 0x04, 0x56, 0x94, 0xff, 0x3a, 0x94, 0xfd, 0x24, 0xcb, 0x00, 0x01, 0x24, 0x02, 0x95, - 0x0f, 0x00, 0xd3, 0x17, 0x00, 0x95, 0xed, 0x00, 0xc0, 0x20, 0x01, 0x3d, 0xd3, 0x00, 0xce, 0xfd, - 0xff, 0xda, 0xf3, 0x00, 0x54, 0xc7, 0x01, 0x87, 0x13, 0x01, 0x2d, 0x10, 0x01, 0x18, 0x44, 0x01, - 0x0c, 0xe4, 0xff, 0xe9, 0xeb, 0xfe, 0x44, 0x21, 0x13, 0x47, 0xb8, 0x10, 0xb8, 0x62, 0xff, 0x9d, - 0xe9, 0x0d, 0x69, 0x0e, 0x12, 0xee, 0xe8, 0xff, 0xc0, 0x83, 0xfc, 0x99, 0x8b, 0x01, 0xf9, 0xf1, - 0x00, 0xeb, 0xd7, 0xfb, 0x84, 0x81, 0x00, 0xde, 0xd8, 0x03, 0x46, 0xff, 0xfc, 0xaf, 0x06, 0xff, - 0x34, 0x15, 0x03, 0xb4, 0x3c, 0x00, 0x80, 0x8b, 0xfe, 0xba, 0x14, 0x01, 0xb3, 0xc9, 0x02, 0x45, - 0xcc, 0x00, 0x96, 0x8c, 0x00, 0x40, 0x37, 0x01, 0x37, 0x1d, 0x01, 0x8c, 0x09, 0x01, 0x01, 0x6c, - 0x00, 0x81, 0x23, 0x01, 0xdd, 0xae, 0x01, 0x5f, 0x34, 0x01, 0x2d, 0x4a, 0x01, 0xa0, 0x82, 0x00, - 0xc9, 0xd9, 0xfe, 0x7a, 0x46, 0xfe, 0xaf, 0x86, 0x10, 0x97, 0x3b, 0x0f, 0x6a, 0xa9, 0x00, 0x2c, - 0x9d, 0x0c, 0x5a, 0x8b, 0x10, 0x25, 0x10, 0x01, 0x70, 0xd7, 0xfd, 0xf4, 0x20, 0x02, 0x7b, 0xbd, - 0x00, 0x04, 0x0e, 0xfc, 0x58, 0xc7, 0x00, 0x7e, 0xf9, 0x03, 0x56, 0x33, 0xfd, 0x9a, 0x38, 0xfe, - 0x7e, 0x38, 0x03, 0x40, 0xa0, 0x01, 0x5f, 0x70, 0xff, 0xe1, 0xdb, 0x01, 0x7e, 0x2b, 0x03, 0x90, - 0xd4, 0x00, 0xfc, 0x03, 0x01, 0x8a, 0x95, 0x01, 0xa0, 0x24, 0x01, 0x9c, 0x3f, 0x01, 0xa4, 0xad, - 0x00, 0xc9, 0x23, 0x01, 0xa6, 0x2c, 0x01, 0xb0, 0x27, 0x00, 0xcb, 0x2b, 0x00, 0x4b, 0xa5, 0xff, - 0x14, 0x88, 0xfe, 0xaa, 0x3f, 0xfe, 0xb6, 0x63, 0x0f, 0x04, 0xfd, 0x0e, 0x64, 0x6b, 0x01, 0xa1, - 0xa1, 0x0a, 0xf2, 0x8c, 0x0e, 0x48, 0xbb, 0x01, 0x78, 0xe3, 0xfe, 0x7b, 0xb4, 0x02, 0x0b, 0xd0, - 0x00, 0x4b, 0x2f, 0xfc, 0x6e, 0x7a, 0x00, 0x44, 0xa8, 0x03, 0x45, 0xf4, 0xfd, 0xfd, 0xc4, 0xfe, - 0xbc, 0x4a, 0x04, 0x6e, 0x11, 0x03, 0x89, 0xc9, 0xff, 0x0f, 0x03, 0x02, 0x8d, 0x97, 0x03, 0x8e, - 0xb0, 0x01, 0x6f, 0x87, 0x01, 0x60, 0x3a, 0x01, 0xce, 0x1b, 0x01, 0xc2, 0x51, 0x01, 0xeb, 0x07, - 0x00, 0x3e, 0x8c, 0xff, 0xc6, 0xc5, 0xff, 0x64, 0xec, 0xff, 0xdd, 0xe8, 0xff, 0xb5, 0x55, 0xff, - 0x2d, 0x1e, 0xfe, 0x23, 0x35, 0xfd, 0x0f, 0x5a, 0x0d, 0xd7, 0x07, 0x0d, 0x79, 0x1a, 0x02, 0xb1, - 0x11, 0x0b, 0x24, 0xd8, 0x0d, 0xb8, 0xf3, 0x01, 0x00, 0x0e, 0x00, 0xc4, 0xe6, 0x02, 0x33, 0xf9, - 0xff, 0x8d, 0x77, 0xfc, 0x2c, 0x39, 0x01, 0x8e, 0x10, 0x04, 0xb1, 0x09, 0xff, 0xd8, 0xef, 0xff, - 0xe5, 0x81, 0x04, 0x54, 0x30, 0x03, 0xca, 0x39, 0x01, 0x05, 0x54, 0x03, 0x9c, 0xb4, 0x03, 0x33, - 0x8d, 0x01, 0xcc, 0x0d, 0x01, 0x8d, 0xf2, 0x00, 0xe1, 0x7a, 0x00, 0xa1, 0x86, 0xff, 0x76, 0xc1, - 0xfe, 0x47, 0x12, 0xff, 0xcc, 0xb9, 0xff, 0x22, 0x08, 0x00, 0xdb, 0x39, 0xff, 0xe4, 0x76, 0xfe, - 0x90, 0xcb, 0xfd, 0x01, 0x95, 0xfd, 0xf7, 0x6d, 0x0c, 0x14, 0xbc, 0x0c, 0x02, 0xc8, 0x02, 0x5d, - 0x45, 0x0a, 0xe5, 0xbc, 0x0c, 0x05, 0x29, 0x02, 0x0e, 0xd6, 0xff, 0x52, 0x62, 0x02, 0x39, 0x3c, - 0x01, 0xe7, 0x3d, 0xfe, 0xf0, 0x8f, 0x01, 0x2d, 0x4c, 0x04, 0x2a, 0xff, 0xff, 0xb9, 0x16, 0x01, - 0x8e, 0xc7, 0x05, 0x98, 0xac, 0x04, 0xe9, 0xfe, 0x01, 0x50, 0xc5, 0x02, 0xf9, 0x18, 0x03, 0xa4, - 0xce, 0x00, 0xe2, 0xb3, 0xff, 0x24, 0x47, 0xff, 0x89, 0x14, 0xff, 0x4f, 0x6d, 0xff, 0x58, 0xbb, - 0xfe, 0x69, 0xe0, 0xfe, 0xb4, 0xbd, 0xff, 0x94, 0x3e, 0xff, 0x9d, 0xb2, 0xfe, 0x44, 0xa5, 0xfe, - 0x52, 0x30, 0xfe, 0x20, 0x06, 0xfe, 0x56, 0xa7, 0x0a, 0x49, 0x9d, 0x0b, 0x4c, 0x1e, 0x04, 0xf2, - 0xed, 0x09, 0xcc, 0xba, 0x0a, 0x73, 0xe2, 0x02, 0x92, 0xba, 0x01, 0x95, 0xcd, 0x02, 0x80, 0x25, - 0x02, 0xc4, 0x5d, 0xff, 0x4f, 0x57, 0x01, 0xae, 0xe2, 0x04, 0xe6, 0x55, 0x02, 0xda, 0xd0, 0x02, - 0xa7, 0xbf, 0x05, 0x51, 0x34, 0x04, 0xc6, 0xb6, 0x01, 0x19, 0xbe, 0x01, 0xb4, 0xf8, 0x00, 0x7c, - 0xa6, 0xfe, 0x92, 0xd7, 0xfe, 0x19, 0x64, 0xff, 0xb4, 0xf3, 0xfe, 0xb4, 0xcc, 0xfe, 0x34, 0x1c, - 0xfe, 0x37, 0xa4, 0xfe, 0xca, 0xbd, 0xff, 0x67, 0x5d, 0xff, 0x71, 0xd8, 0xfe, 0xa0, 0x86, 0xfe, - 0xe6, 0x1a, 0xfe, 0x67, 0x3e, 0xfe, 0x45, 0xbe, 0x09, 0x5f, 0xad, 0x0a, 0xb2, 0x07, 0x04, 0xb5, - 0x3d, 0x09, 0x87, 0x43, 0x0b, 0x44, 0x29, 0x05, 0xe7, 0x81, 0x02, 0xf9, 0xa6, 0x02, 0xed, 0x0b, - 0x03, 0x41, 0x79, 0x01, 0x3d, 0xbe, 0x02, 0x32, 0x2f, 0x05, 0x1d, 0xb4, 0x03, 0x36, 0x7a, 0x03, - 0xeb, 0x5e, 0x04, 0xc4, 0x8e, 0x02, 0x27, 0xc3, 0xff, 0x78, 0x8e, 0xff, 0x03, 0x00, 0x00, 0x8c, - 0x37, 0xff, 0x0a, 0xfd, 0xfe, 0xe5, 0x43, 0xfe, 0xfd, 0xef, 0xfd, 0x34, 0x9f, 0xfe, 0xaf, 0xff, - 0xfe, 0x26, 0x8f, 0xff, 0x60, 0x75, 0xff, 0x4c, 0xb9, 0xfe, 0x40, 0x97, 0xfe, 0x68, 0xd2, 0xfe, - 0x8a, 0x97, 0xfe, 0x9d, 0x01, 0xfe, 0x68, 0xc7, 0x08, 0xae, 0xd5, 0x0b, 0xaa, 0xbe, 0x06, 0x86, - 0xb6, 0x08, 0x62, 0x46, 0x0a, 0xb2, 0xc6, 0x05, 0xab, 0x6b, 0x03, 0x39, 0xbb, 0x04, 0x3d, 0xac, - 0x04, 0x7a, 0x0f, 0x02, 0x82, 0x7c, 0x03, 0xe8, 0x12, 0x05, 0x50, 0xef, 0x01, 0xa7, 0x42, 0x01, - 0xce, 0x89, 0x02, 0xef, 0xd0, 0x00, 0xc2, 0xd7, 0xfe, 0xb3, 0x21, 0xff, 0xd2, 0x59, 0xff, 0x09, - 0x70, 0xfe, 0x26, 0x2b, 0xfe, 0xa6, 0x5e, 0xfe, 0xa7, 0x7c, 0xfe, 0xa1, 0xe9, 0xfe, 0xc0, 0x3d, - 0xff, 0x2f, 0x6c, 0xff, 0x0c, 0x15, 0xff, 0x15, 0x7c, 0xfe, 0xf2, 0x93, 0xfe, 0xfa, 0x94, 0xfe, - 0x5a, 0x55, 0xfe, 0xdf, 0x4c, 0xfe, 0xda, 0xef, 0x07, 0x5a, 0x11, 0x0c, 0x23, 0xed, 0x07, 0x91, - 0xe6, 0x08, 0x96, 0x37, 0x0c, 0x7e, 0xa9, 0x09, 0xd8, 0x06, 0x05, 0x8b, 0xdf, 0x03, 0xd6, 0x5f, - 0x04, 0xb4, 0x50, 0x02, 0xdd, 0x9b, 0x01, 0x92, 0x1e, 0x02, 0xe8, 0x80, 0x00, 0x2a, 0x72, 0x00, - 0x24, 0xb1, 0x01, 0xf0, 0x83, 0x00, 0xce, 0x81, 0xfe, 0x4a, 0x61, 0xfe, 0xfa, 0xb1, 0xfe, 0x26, - 0x28, 0xfe, 0xe6, 0x42, 0xfe, 0x61, 0xb2, 0xfe, 0x4c, 0xc9, 0xfe, 0xfd, 0x17, 0xff, 0x95, 0x16, - 0xff, 0x4b, 0xd2, 0xfe, 0x11, 0xaa, 0xfe, 0xfc, 0x9b, 0xfe, 0xaa, 0xcc, 0xfe, 0x6d, 0xb7, 0xfe, - 0x6f, 0x61, 0xfe, 0xf7, 0x2e, 0xfe, 0xcb, 0xd1, 0x08, 0x5f, 0x49, 0x0e, 0x51, 0x64, 0x0a, 0x99, - 0xe7, 0x0a, 0x1d, 0x36, 0x0c, 0x7a, 0x35, 0x08, 0x15, 0xa5, 0x05, 0x7d, 0x1b, 0x05, 0x5f, 0xfb, - 0x02, 0x81, 0x41, 0xff, 0x55, 0x28, 0xff, 0x39, 0xf0, 0x01, 0x57, 0x2b, 0x01, 0x80, 0x44, 0xff, - 0x2f, 0x6a, 0x00, 0x7a, 0x83, 0x00, 0x87, 0xc8, 0xfd, 0x65, 0xc3, 0xfd, 0x82, 0x87, 0xff, 0x25, - 0xc4, 0xfe, 0xb4, 0x18, 0xfe, 0xcd, 0xbf, 0xfe, 0xd4, 0xe2, 0xfe, 0x7f, 0xdc, 0xfe, 0x76, 0x1d, - 0xff, 0xb7, 0xe6, 0xfe, 0xe3, 0x8d, 0xfe, 0x0f, 0xaf, 0xfe, 0x43, 0xa4, 0xfe, 0x06, 0x9d, 0xfe, - 0xb5, 0xc1, 0xfe, 0x32, 0x7b, 0xfe, 0xcd, 0x7a, 0x0a, 0xda, 0x3f, 0x12, 0x92, 0x63, 0x0d, 0x93, - 0x86, 0x09, 0x1f, 0x28, 0x09, 0xa9, 0xd3, 0x06, 0xbc, 0xcc, 0x04, 0x20, 0xc7, 0x03, 0x1b, 0x42, - 0x02, 0x7a, 0x63, 0x00, 0x75, 0x64, 0x00, 0xf9, 0x46, 0x00, 0x90, 0xfc, 0xfe, 0x56, 0x93, 0xff, - 0xa5, 0x53, 0x00, 0x8f, 0x4b, 0xff, 0xba, 0x4a, 0xfe, 0x4b, 0xa3, 0xfe, 0xe4, 0xf4, 0xfe, 0xdc, - 0x84, 0xfe, 0x13, 0xd0, 0xfe, 0x3e, 0xd9, 0xfe, 0x12, 0x93, 0xfe, 0xbc, 0xef, 0xfe, 0xa6, 0xc9, - 0xfe, 0x08, 0xb1, 0xfe, 0xb5, 0xc2, 0xfe, 0x16, 0xa1, 0xfe, 0x31, 0xa6, 0xfe, 0xad, 0x95, 0xfe, - 0xf3, 0xae, 0xfe, 0xa2, 0x9c, 0xfe, 0xc8, 0x8a, 0x0b, 0xfc, 0x8b, 0x12, 0xb3, 0x58, 0x0c, 0xc9, - 0x0a, 0x08, 0xa8, 0x2b, 0x07, 0x0f, 0xba, 0x05, 0x24, 0x9d, 0x05, 0xdc, 0x0b, 0x05, 0xde, 0x33, - 0x02, 0x9b, 0x46, 0x01, 0x21, 0xa8, 0x02, 0xf6, 0xbc, 0x00, 0xdf, 0x9a, 0xfe, 0x91, 0xa0, 0xfe, - 0x00, 0x18, 0xff, 0x94, 0x60, 0x00, 0xc4, 0xe2, 0xff, 0xd1, 0xf5, 0xfd, 0xaf, 0xff, 0xfd, 0x62, - 0x80, 0xff, 0x92, 0x7e, 0xff, 0x29, 0x9b, 0xfe, 0x9e, 0xeb, 0xfe, 0x7e, 0xca, 0xfe, 0x5a, 0x7e, - 0xfe, 0x4e, 0xd9, 0xfe, 0x0a, 0xa5, 0xfe, 0xe3, 0xac, 0xfe, 0x04, 0xda, 0xfe, 0x7c, 0xc4, 0xfe, - 0xc4, 0xd4, 0xfe, 0x76, 0xba, 0xfe, 0xca, 0x65, 0x0a, 0x95, 0x9e, 0x10, 0xbc, 0xbf, 0x0a, 0xc1, - 0xa4, 0x06, 0xe3, 0x7f, 0x06, 0x2e, 0x59, 0x05, 0xb0, 0x3e, 0x04, 0xce, 0x12, 0x05, 0xa6, 0x07, - 0x05, 0x37, 0xa6, 0x02, 0xfe, 0x13, 0x03, 0x82, 0x6b, 0x03, 0x48, 0x36, 0x00, 0x35, 0xee, 0xfe, - 0xb4, 0xdf, 0xff, 0xac, 0x92, 0xff, 0x7c, 0xa7, 0xfe, 0x3b, 0x06, 0xff, 0x26, 0xb3, 0xff, 0x6a, - 0xef, 0xfe, 0x36, 0xa7, 0xfe, 0x37, 0x7c, 0xff, 0x4d, 0x3f, 0xff, 0xff, 0x4f, 0xfe, 0xc7, 0x41, - 0xfe, 0x0d, 0xc3, 0xfe, 0x01, 0xc8, 0xfe, 0x00, 0xc8, 0xfe, 0x89, 0xfd, 0xfe, 0xa0, 0x00, 0xff, - 0x76, 0x19, 0xff, 0x83, 0xfd, 0xfe, 0xd6, 0x5b, 0x09, 0xe5, 0xc8, 0x0d, 0x42, 0x9a, 0x08, 0xc1, - 0xba, 0x06, 0xcb, 0x16, 0x06, 0x7e, 0x1b, 0x04, 0xe7, 0x03, 0x04, 0x10, 0x98, 0x03, 0xf4, 0x2d, - 0x02, 0x4b, 0x69, 0x03, 0xae, 0x09, 0x06, 0x96, 0xe9, 0x04, 0x37, 0x35, 0x03, 0x15, 0x45, 0x02, - 0x42, 0x66, 0x00, 0xb4, 0x5c, 0x00, 0xfc, 0xfe, 0xff, 0x3a, 0x47, 0xfe, 0x13, 0x5b, 0xfe, 0x44, - 0x86, 0xff, 0xf9, 0xb3, 0xff, 0x1b, 0x97, 0xfe, 0x10, 0x1c, 0xfe, 0x25, 0xdf, 0xfe, 0xf9, 0x08, - 0xff, 0x94, 0x87, 0xfe, 0x26, 0xae, 0xfe, 0x2b, 0x1f, 0xff, 0x10, 0x31, 0xff, 0xd0, 0x49, 0xff, - 0x95, 0x0a, 0xff, 0x43, 0xc2, 0xfe, 0x43, 0xc7, 0x07, 0xbc, 0x36, 0x0a, 0xe4, 0x4e, 0x05, 0x17, - 0xf7, 0x05, 0xcb, 0x4f, 0x07, 0xe8, 0x07, 0x06, 0xef, 0xf3, 0x03, 0x80, 0x24, 0x00, 0xa5, 0x0f, - 0x00, 0xa6, 0xa1, 0x03, 0x42, 0xcb, 0x04, 0x7d, 0x6a, 0x04, 0x55, 0xa9, 0x05, 0x55, 0x9b, 0x05, - 0x9c, 0x7b, 0x04, 0x13, 0x24, 0x04, 0x05, 0x6f, 0x01, 0x97, 0x4f, 0xff, 0x7d, 0xbd, 0xff, 0xee, - 0xe7, 0xfe, 0xeb, 0xff, 0xfd, 0x2f, 0xdb, 0xfe, 0x37, 0x7e, 0xff, 0xbd, 0xb4, 0xfe, 0x72, 0x63, - 0xfe, 0x82, 0x12, 0xff, 0x48, 0x6a, 0xff, 0xcb, 0x3e, 0xff, 0xb5, 0xe2, 0xfe, 0x2f, 0x3c, 0xff, - 0xbd, 0x7e, 0xff, 0x15, 0xff, 0xfe, 0x9f, 0xe8, 0x08, 0x8b, 0x9f, 0x0b, 0x27, 0x41, 0x04, 0x1f, - 0x69, 0x03, 0xcd, 0xe7, 0x05, 0xfe, 0x75, 0x05, 0xc7, 0x96, 0x03, 0x90, 0x25, 0x00, 0xe5, 0xd0, - 0xff, 0x74, 0xc6, 0x02, 0x57, 0x9b, 0x03, 0x50, 0x61, 0x02, 0x31, 0x1d, 0x03, 0x5a, 0xe6, 0x04, - 0x65, 0x0d, 0x06, 0xe9, 0x74, 0x06, 0x77, 0x1d, 0x04, 0x37, 0xe9, 0x01, 0xbd, 0x67, 0x01, 0x9a, - 0x19, 0x00, 0x40, 0x29, 0xff, 0x09, 0x81, 0xfe, 0x9f, 0xfe, 0xfd, 0x12, 0xe9, 0xfe, 0xfe, 0x94, - 0xff, 0xad, 0xe8, 0xfe, 0xde, 0x80, 0xfe, 0x49, 0x5c, 0xff, 0xc8, 0xd2, 0xff, 0xb2, 0x46, 0xff, - 0x7a, 0xee, 0xfe, 0x7e, 0xac, 0xfe, 0xb7, 0xb2, 0x09, 0xe4, 0x97, 0x0c, 0xee, 0x04, 0x05, 0x5c, - 0xfe, 0x03, 0xc8, 0xfe, 0x05, 0x7e, 0x56, 0x05, 0xb2, 0xf2, 0x02, 0x65, 0xca, 0xfe, 0xc6, 0x82, - 0xff, 0x40, 0x37, 0x04, 0x2c, 0x88, 0x03, 0x1e, 0xf0, 0xff, 0x89, 0xfb, 0x00, 0xe8, 0x64, 0x02, - 0xcf, 0xdd, 0x02, 0x86, 0xf2, 0x04, 0x09, 0xa0, 0x04, 0x6a, 0x69, 0x03, 0xd5, 0xe9, 0x03, 0x0f, - 0xea, 0x02, 0x6a, 0x82, 0x00, 0x70, 0x6f, 0xff, 0x75, 0x1d, 0xff, 0x03, 0x68, 0xfe, 0xde, 0x53, - 0xfe, 0x45, 0xcf, 0xfe, 0xd3, 0x3f, 0xff, 0xcd, 0x4d, 0xff, 0xa8, 0xd6, 0xfe, 0x89, 0x24, 0xff, - 0x15, 0xb5, 0xff, 0x8c, 0xe6, 0xfe, 0xd0, 0x2e, 0x0b, 0xb8, 0x1e, 0x0e, 0x7d, 0xc4, 0x04, 0xf8, - 0x4a, 0x04, 0xd4, 0x96, 0x07, 0xf0, 0xda, 0x05, 0xd2, 0xf0, 0x01, 0x71, 0x34, 0xfd, 0xd4, 0x3c, - 0xff, 0xb4, 0x28, 0x05, 0x8b, 0x13, 0x03, 0x40, 0x14, 0xff, 0x77, 0xa7, 0x00, 0x14, 0x54, 0x01, - 0xce, 0x7e, 0x01, 0x83, 0x93, 0x02, 0x82, 0x47, 0x01, 0xda, 0xb7, 0x01, 0x81, 0x23, 0x04, 0x7b, - 0xb3, 0x03, 0x10, 0x57, 0x02, 0x63, 0x1b, 0x02, 0x9e, 0x78, 0x00, 0xe0, 0xfd, 0xfe, 0x80, 0x76, - 0xff, 0xaf, 0xcb, 0xfe, 0xc6, 0x37, 0xfe, 0x55, 0x38, 0xff, 0xcf, 0x8f, 0xff, 0x87, 0x30, 0xff, - 0x64, 0xad, 0xfe, 0xf1, 0xa4, 0xfe, 0x51, 0x97, 0x0c, 0x8f, 0x84, 0x10, 0x47, 0x8b, 0x05, 0xdd, - 0xe9, 0x03, 0xcd, 0xb9, 0x07, 0x4e, 0x26, 0x06, 0x9e, 0x58, 0x01, 0x14, 0x24, 0xfc, 0x6a, 0xc4, - 0xff, 0xb9, 0xe1, 0x05, 0x86, 0xd3, 0x01, 0xf3, 0x11, 0xfe, 0xfc, 0xcf, 0x00, 0xc0, 0x1c, 0x01, - 0x55, 0x14, 0x01, 0x06, 0x5e, 0x02, 0xaf, 0x18, 0x00, 0x55, 0x5e, 0xff, 0x74, 0xce, 0x01, 0x9b, - 0x41, 0x02, 0x7f, 0x16, 0x02, 0x34, 0x60, 0x02, 0x8a, 0xd9, 0x01, 0x6f, 0x68, 0x01, 0xaf, 0xb1, - 0x00, 0x91, 0x7d, 0xff, 0x9b, 0x56, 0xff, 0xfc, 0xa4, 0xff, 0xa3, 0x08, 0xff, 0xb4, 0xdb, 0xfe, - 0xd9, 0x3a, 0xff, 0xa7, 0xa3, 0xfe, 0xce, 0x18, 0x0e, 0x9c, 0x7b, 0x12, 0xbb, 0xd5, 0x05, 0xae, - 0x26, 0x04, 0x2b, 0xdb, 0x08, 0xbe, 0x6e, 0x06, 0x98, 0xb9, 0xff, 0xaa, 0xab, 0xfa, 0xa1, 0xd9, - 0x00, 0xb5, 0xa2, 0x06, 0x2f, 0xad, 0x00, 0x9e, 0x78, 0xfd, 0xfb, 0xa2, 0x00, 0x9f, 0xa1, 0x00, - 0xf7, 0xba, 0x00, 0xcb, 0x55, 0x02, 0xe6, 0x02, 0x00, 0x19, 0xc2, 0xfe, 0xbc, 0xe3, 0x00, 0x53, - 0xae, 0x00, 0xe3, 0xed, 0xff, 0x73, 0xc9, 0x00, 0x2c, 0x2f, 0x01, 0x20, 0x8f, 0x01, 0x5e, 0xcb, - 0x01, 0xfa, 0x4f, 0x01, 0xd1, 0xcc, 0x00, 0x5e, 0x57, 0x00, 0xfa, 0x09, 0x00, 0x03, 0xa6, 0xff, - 0xae, 0xb2, 0xfe, 0x9a, 0x18, 0xfe, 0xa5, 0x71, 0x10, 0x86, 0x5b, 0x15, 0x37, 0xf0, 0x05, 0xcf, - 0x59, 0x03, 0x61, 0x35, 0x09, 0xeb, 0x75, 0x06, 0x0c, 0x69, 0xfe, 0xeb, 0x48, 0xfa, 0x58, 0xf2, - 0x01, 0x80, 0x42, 0x06, 0xc5, 0x49, 0xff, 0x6a, 0x43, 0xfd, 0xc3, 0xc9, 0x00, 0x16, 0x57, 0x00, - 0xa0, 0x67, 0x00, 0x6d, 0x14, 0x02, 0xb8, 0xb3, 0xff, 0xb4, 0x8b, 0xfe, 0x7c, 0xbc, 0x00, 0x8d, - 0x16, 0x00, 0xb6, 0x26, 0xff, 0xab, 0xb8, 0xff, 0x94, 0x43, 0xff, 0xf6, 0x01, 0x00, 0x29, 0x19, - 0x01, 0x7b, 0xf1, 0x00, 0xd2, 0xc1, 0x01, 0x67, 0x67, 0x02, 0xaa, 0x3e, 0x01, 0xc4, 0x08, 0x00, - 0x8e, 0x9c, 0xff, 0x2a, 0xc6, 0xfe, 0x3c, 0x58, 0x12, 0x44, 0xb2, 0x17, 0x16, 0x5b, 0x06, 0x48, - 0x59, 0x03, 0xba, 0x07, 0x0a, 0xe4, 0x87, 0x06, 0x3c, 0x6d, 0xfc, 0xc8, 0x79, 0xf9, 0x4e, 0xf4, - 0x03, 0xb3, 0x60, 0x06, 0x2d, 0x68, 0xfd, 0x1f, 0x1a, 0xfd, 0xae, 0x16, 0x01, 0x5f, 0xbf, 0xff, - 0xa1, 0x26, 0x00, 0xad, 0x50, 0x02, 0x16, 0x9c, 0xff, 0xb7, 0x2b, 0xfe, 0xd7, 0x81, 0x00, 0x59, - 0xe6, 0xff, 0x9f, 0xf8, 0xfe, 0x14, 0x48, 0xff, 0x96, 0x97, 0xfe, 0x96, 0x25, 0xff, 0x2c, 0x6d, - 0xff, 0x3c, 0x76, 0xff, 0xe4, 0x3a, 0x01, 0x63, 0x40, 0x02, 0xe6, 0x0f, 0x02, 0xd3, 0xa0, 0x01, - 0x47, 0x92, 0x00, 0xe3, 0x53, 0xff, 0xc5, 0xa6, 0x14, 0x4e, 0x23, 0x1a, 0x45, 0x2b, 0x06, 0xa6, - 0x5c, 0x03, 0x00, 0x4c, 0x0b, 0x38, 0x07, 0x06, 0xd4, 0xcd, 0xf9, 0x75, 0x76, 0xf9, 0x70, 0x48, - 0x06, 0x9e, 0xa1, 0x05, 0x2f, 0x94, 0xfb, 0x0a, 0x13, 0xfd, 0xf5, 0x3f, 0x01, 0x5d, 0x9e, 0xff, - 0xf8, 0xac, 0xff, 0x3e, 0xf6, 0x01, 0x63, 0x95, 0xff, 0x7c, 0xf3, 0xfd, 0xb0, 0x5c, 0x00, 0x81, - 0xcb, 0xff, 0x35, 0xb8, 0xfe, 0xa6, 0xed, 0xfe, 0xc5, 0x19, 0xfe, 0x35, 0xa4, 0xfe, 0xa5, 0xea, - 0xfe, 0x45, 0xa6, 0xfe, 0xf7, 0x00, 0x00, 0x91, 0x23, 0x01, 0x6e, 0x3e, 0x01, 0x80, 0x15, 0x01, - 0xf4, 0x43, 0x01, 0x18, 0xc8, 0x00, 0x94, 0x68, 0x16, 0xc7, 0x17, 0x1c, 0x44, 0xe5, 0x06, 0x50, - 0xea, 0x03, 0x31, 0x22, 0x0c, 0xf7, 0xeb, 0x05, 0x18, 0x5d, 0xf7, 0xdd, 0xd6, 0xf8, 0x16, 0x08, - 0x09, 0x14, 0x89, 0x05, 0x9a, 0x52, 0xf9, 0x50, 0xf7, 0xfc, 0xb3, 0xb7, 0x01, 0x3c, 0x8f, 0xff, - 0xff, 0x5a, 0xff, 0x35, 0xa0, 0x01, 0x77, 0xa8, 0xff, 0x93, 0xa1, 0xfd, 0xb7, 0x0b, 0x00, 0xcf, - 0x18, 0x00, 0x11, 0xb7, 0xfe, 0xf9, 0x7f, 0xfe, 0x56, 0xce, 0xfd, 0xe6, 0x86, 0xfe, 0x33, 0x91, - 0xfe, 0x11, 0x35, 0xfe, 0xfa, 0x98, 0xff, 0x33, 0x4c, 0x00, 0x27, 0x5d, 0x00, 0x72, 0x63, 0x00, - 0xf4, 0x71, 0x00, 0x8e, 0x51, 0x00, 0xc1, 0x0c, 0x18, 0xfa, 0x84, 0x1e, 0x92, 0xcf, 0x07, 0x2c, - 0xf7, 0x03, 0x57, 0xa0, 0x0c, 0x9e, 0x37, 0x06, 0xac, 0x89, 0xf5, 0xd3, 0xf0, 0xf7, 0x8c, 0x44, - 0x0b, 0x8e, 0x74, 0x05, 0xdd, 0x5a, 0xf7, 0xde, 0x2e, 0xfd, 0x47, 0x1f, 0x02, 0x7d, 0x41, 0xff, - 0xca, 0x25, 0xff, 0xee, 0x3a, 0x01, 0x08, 0xc9, 0xff, 0x52, 0xea, 0xfd, 0x77, 0x72, 0xff, 0x18, - 0xd0, 0xff, 0xca, 0xea, 0xfe, 0x8c, 0x35, 0xfe, 0xdf, 0xc3, 0xfd, 0xa5, 0xa3, 0xfe, 0xd2, 0x23, - 0xfe, 0x48, 0xc6, 0xfd, 0x51, 0x38, 0xff, 0xea, 0xf1, 0xff, 0x74, 0x4e, 0x00, 0xb6, 0xf0, 0xff, - 0x01, 0x73, 0xff, 0x82, 0x62, 0xff, 0xac, 0xb7, 0x1a, 0x7a, 0xbf, 0x21, 0xcb, 0xdf, 0x06, 0xa8, - 0xa5, 0x03, 0x76, 0x0c, 0x0e, 0x18, 0xf4, 0x04, 0x2d, 0x4e, 0xf4, 0x36, 0xab, 0xf8, 0xcd, 0xe5, - 0x0b, 0xc9, 0xa1, 0x04, 0x46, 0x61, 0xf6, 0x6c, 0x79, 0xfd, 0x3c, 0x57, 0x02, 0xfb, 0xf9, 0xfe, - 0xc6, 0xaa, 0xfe, 0xf5, 0x01, 0x01, 0x05, 0x35, 0x00, 0xd0, 0xd1, 0xfd, 0x10, 0xca, 0xfe, 0xdf, - 0xa2, 0xff, 0x6a, 0x04, 0xff, 0xe7, 0x02, 0xfe, 0x93, 0x95, 0xfd, 0x72, 0x99, 0xfe, 0x9b, 0xb8, - 0xfd, 0xd8, 0x7a, 0xfd, 0x0f, 0x72, 0xff, 0xe1, 0xb3, 0xff, 0x29, 0xd3, 0xff, 0xc8, 0xb0, 0xff, - 0x3e, 0xd5, 0xfe, 0xec, 0xe1, 0xfe, 0xd7, 0xb4, 0x1c, 0x6d, 0x21, 0x24, 0xf7, 0xe4, 0x06, 0x50, - 0x22, 0x04, 0xd9, 0x14, 0x0f, 0xf8, 0xfb, 0x03, 0xe2, 0x3f, 0xf3, 0x82, 0x92, 0xf8, 0x0a, 0x72, - 0x0c, 0x22, 0xbb, 0x04, 0x63, 0x40, 0xf5, 0x34, 0x1e, 0xfd, 0x31, 0xb8, 0x02, 0xf4, 0xd9, 0xfe, - 0xe7, 0x44, 0xfe, 0xe6, 0xde, 0x00, 0x67, 0x7c, 0x00, 0xd2, 0x96, 0xfd, 0xd1, 0x25, 0xfe, 0xfa, - 0x82, 0xff, 0x44, 0x4c, 0xff, 0x21, 0xfb, 0xfd, 0xb5, 0xe8, 0xfc, 0xa2, 0x20, 0xfe, 0xc1, 0xdd, - 0xfd, 0x9a, 0x75, 0xfd, 0xb8, 0x42, 0xff, 0x76, 0xa9, 0xff, 0x2b, 0x4e, 0xff, 0x71, 0x3d, 0xff, - 0xf9, 0xea, 0xfe, 0xe0, 0x8c, 0xfe, 0xf4, 0xa0, 0x1d, 0x39, 0xc0, 0x25, 0xb7, 0xd3, 0x07, 0x50, - 0x81, 0x05, 0x63, 0x4f, 0x10, 0xd0, 0xfb, 0x02, 0x13, 0x44, 0xf2, 0x6f, 0x6b, 0xf8, 0xd1, 0x68, - 0x0c, 0x8a, 0x40, 0x05, 0xd6, 0xbb, 0xf4, 0xfa, 0x0e, 0xfc, 0x57, 0xde, 0x02, 0xa5, 0x4e, 0xff, - 0x96, 0x18, 0xfe, 0x91, 0x2b, 0x00, 0x22, 0x92, 0x00, 0x43, 0x03, 0xfe, 0xef, 0x79, 0xfd, 0x8a, - 0x53, 0xff, 0x39, 0x87, 0xff, 0xef, 0x52, 0xfd, 0xb7, 0x88, 0xfc, 0x6a, 0x36, 0xfe, 0xe1, 0xdb, - 0xfd, 0xb0, 0x69, 0xfd, 0x54, 0x9c, 0xfe, 0x6f, 0xfc, 0xfe, 0x02, 0xcf, 0xff, 0x8f, 0x9d, 0xff, - 0xba, 0x51, 0xfe, 0xfa, 0x04, 0xfe, 0x00, 0x64, 0x1e, 0x59, 0xfd, 0x26, 0x66, 0x92, 0x09, 0x5c, - 0xb5, 0x06, 0xba, 0xe6, 0x0f, 0xf0, 0x15, 0x03, 0x21, 0x2d, 0xf3, 0xbf, 0x65, 0xf7, 0xb8, 0xfb, - 0x0a, 0x42, 0x0c, 0x06, 0x16, 0xc2, 0xf4, 0xa3, 0xd7, 0xfa, 0x58, 0x74, 0x03, 0x14, 0xb1, 0xff, - 0xd3, 0x35, 0xfd, 0x93, 0xde, 0xff, 0xd2, 0x7d, 0x00, 0x15, 0xb2, 0xfe, 0x1e, 0x02, 0xfe, 0x1f, - 0xf8, 0xfd, 0xd1, 0xd9, 0xfe, 0x0b, 0xc1, 0xfd, 0xec, 0x33, 0xfc, 0x92, 0xf1, 0xfd, 0xd6, 0xf9, - 0xfd, 0x14, 0x08, 0xfd, 0x3b, 0xf9, 0xfd, 0x50, 0xf0, 0xfe, 0xd6, 0xee, 0xff, 0xb0, 0xa8, 0xff, - 0xe7, 0x5e, 0xfe, 0xca, 0xd0, 0xfd, 0xf0, 0x59, 0x1f, 0x40, 0x31, 0x27, 0x2d, 0x81, 0x0b, 0xed, - 0xa7, 0x08, 0x59, 0x3e, 0x0e, 0x11, 0xde, 0x03, 0x2a, 0x96, 0xf5, 0x79, 0xce, 0xf5, 0x45, 0xac, - 0x08, 0x33, 0x50, 0x06, 0x4f, 0xd0, 0xf5, 0x88, 0x4b, 0xfa, 0x04, 0xbc, 0x02, 0x38, 0x37, 0x00, - 0x1b, 0xee, 0xfc, 0x35, 0xee, 0xfe, 0xff, 0xcf, 0x00, 0x62, 0xc8, 0xff, 0xc5, 0xe9, 0xfd, 0x44, - 0xba, 0xfc, 0x73, 0x8b, 0xfe, 0x48, 0xfc, 0xfd, 0xe6, 0xff, 0xfb, 0x75, 0x88, 0xfd, 0xea, 0x02, - 0xfd, 0x16, 0x0d, 0xfd, 0x18, 0xab, 0xfe, 0x6a, 0x5a, 0xfe, 0x20, 0x77, 0xff, 0x31, 0xee, 0xff, - 0x10, 0xb9, 0xfe, 0x98, 0x93, 0xfd, 0xaa, 0xd8, 0x20, 0xb6, 0xb3, 0x25, 0x52, 0xee, 0x0b, 0x54, - 0xad, 0x0c, 0x25, 0x4a, 0x0e, 0x23, 0x77, 0x03, 0xac, 0x36, 0xf6, 0xe3, 0x62, 0xf5, 0x51, 0xb0, - 0x07, 0x3c, 0xaf, 0x04, 0x5a, 0xc7, 0xf6, 0x8d, 0x20, 0xfb, 0xdb, 0xa0, 0x00, 0x8a, 0xf6, 0xff, - 0x1f, 0x16, 0xfe, 0xd2, 0x28, 0xfe, 0x1c, 0xf8, 0xff, 0x9a, 0xa8, 0x00, 0xbd, 0x44, 0xfe, 0x3f, - 0xac, 0xfb, 0xed, 0x8f, 0xfe, 0x70, 0x35, 0xfe, 0xa7, 0xd5, 0xfa, 0x7a, 0x95, 0xfc, 0x37, 0xb7, - 0xfc, 0x2b, 0x39, 0xfd, 0x10, 0xb8, 0xfe, 0xd5, 0xee, 0xfd, 0xaf, 0x18, 0xff, 0x83, 0x25, 0x00, - 0x44, 0xdc, 0xfe, 0x2d, 0x87, 0xfc, 0x7a, 0x6a, 0x22, 0x9b, 0xf1, 0x22, 0x5c, 0x3d, 0x0a, 0x1d, - 0xd7, 0x12, 0xc8, 0xa1, 0x12, 0x0f, 0xb0, 0x01, 0x87, 0x43, 0xf3, 0x18, 0xbe, 0xf7, 0x1f, 0x1e, - 0x0a, 0x4d, 0x2b, 0x00, 0x52, 0x41, 0xf6, 0x22, 0xdb, 0xfe, 0x22, 0xa7, 0xfe, 0xf1, 0x29, 0xfe, - 0x5e, 0x90, 0x00, 0x73, 0xd3, 0xfd, 0xef, 0x08, 0xfe, 0xda, 0x08, 0x02, 0x4c, 0x48, 0xff, 0x25, - 0x20, 0xfb, 0x30, 0xe4, 0xfe, 0xd8, 0x0d, 0xfe, 0x37, 0xba, 0xf9, 0xbc, 0x72, 0xfc, 0x17, 0x7e, - 0xfc, 0x42, 0xb1, 0xfc, 0x3d, 0xfe, 0xfe, 0x23, 0xd2, 0xfd, 0xe5, 0x20, 0xff, 0x53, 0xac, 0xff, - 0xf3, 0x83, 0xfe, 0x99, 0x6f, 0xfd, 0xf6, 0x08, 0x26, 0x97, 0x8c, 0x21, 0x55, 0xdc, 0x04, 0x26, - 0x90, 0x17, 0x1a, 0xc9, 0x18, 0x3b, 0x04, 0xfe, 0x8a, 0x45, 0xf0, 0x07, 0xd2, 0xfc, 0x58, 0x52, - 0x0b, 0xbb, 0x6c, 0xf9, 0x57, 0xd5, 0xf5, 0x94, 0xbd, 0x03, 0xa9, 0xbe, 0xfd, 0xd0, 0xef, 0xfa, - 0x2a, 0x63, 0x01, 0x45, 0xd2, 0xfe, 0x23, 0x8f, 0xfc, 0xe6, 0x9a, 0x02, 0x67, 0x3b, 0x00, 0xdb, - 0x57, 0xfa, 0xa7, 0xe1, 0xfe, 0xe9, 0x16, 0xfe, 0x6f, 0x96, 0xf9, 0x18, 0xc1, 0xfb, 0xf3, 0x1a, - 0xfb, 0xc9, 0x94, 0xfc, 0x55, 0xad, 0xff, 0xba, 0x76, 0xfd, 0x13, 0xee, 0xfd, 0x24, 0x8d, 0xff, - 0xdc, 0xba, 0xfe, 0x2d, 0xea, 0xfc, 0xa3, 0x86, 0x2a, 0xce, 0x44, 0x22, 0xea, 0x5f, 0xfe, 0x01, - 0x72, 0x18, 0x0e, 0x75, 0x1f, 0xfe, 0x9c, 0xfc, 0x91, 0xfc, 0xec, 0x80, 0xc6, 0x01, 0x69, 0x3a, - 0x0d, 0xfc, 0x69, 0xf2, 0x56, 0x70, 0xf4, 0xd4, 0x14, 0x09, 0x6d, 0x88, 0xfe, 0xec, 0x24, 0xf7, - 0x27, 0xbe, 0x00, 0x65, 0x31, 0x01, 0xea, 0x8e, 0xfb, 0xef, 0xf1, 0x01, 0x53, 0xd7, 0x01, 0x42, - 0xf0, 0xf9, 0x1a, 0x7f, 0xfe, 0xca, 0xa7, 0xfe, 0x6e, 0x96, 0xf9, 0x0b, 0xc8, 0xfa, 0x2d, 0x54, - 0xfa, 0xf2, 0xdc, 0xfc, 0xd0, 0x7b, 0xff, 0xd6, 0xad, 0xfc, 0x13, 0x29, 0xfd, 0x94, 0x83, 0xff, - 0xbd, 0xdf, 0xfe, 0xf8, 0xd5, 0xfc, 0xbb, 0x53, 0x2e, 0x02, 0x59, 0x25, 0xc8, 0x07, 0xf8, 0xb6, - 0x4d, 0x15, 0xcb, 0x80, 0x26, 0x4a, 0x2d, 0xfe, 0x77, 0x7e, 0xe9, 0x9f, 0x6d, 0x05, 0x5b, 0x88, - 0x10, 0x3b, 0x4d, 0xec, 0x47, 0xc3, 0xf0, 0x31, 0x17, 0x0e, 0x1c, 0xaf, 0x01, 0x36, 0x14, 0xf4, - 0x35, 0xda, 0xfd, 0x6f, 0x54, 0x03, 0x04, 0x83, 0xfc, 0xd5, 0x5a, 0x00, 0x13, 0x5b, 0x03, 0xbf, - 0x4e, 0xfa, 0xa9, 0xa6, 0xfd, 0xa2, 0x58, 0xff, 0x81, 0x83, 0xf9, 0x3a, 0xee, 0xfa, 0xe1, 0xd6, - 0xf9, 0xb9, 0xc1, 0xfb, 0x8f, 0x35, 0xff, 0x01, 0x73, 0xfc, 0x35, 0xb1, 0xfc, 0x90, 0xe1, 0xfe, - 0xbf, 0x60, 0xff, 0xdb, 0x2f, 0xfd, 0xaf, 0x31, 0x32, 0x0c, 0xb7, 0x28, 0x00, 0xa0, 0xf2, 0x69, - 0x0a, 0x10, 0x58, 0x81, 0x2b, 0x5e, 0xa1, 0x01, 0x51, 0x90, 0xe6, 0xe6, 0x1a, 0x08, 0xfe, 0x5d, - 0x14, 0x23, 0xeb, 0xe6, 0xac, 0x92, 0xeb, 0xf0, 0x75, 0x11, 0xff, 0x42, 0x06, 0xa9, 0x96, 0xf2, - 0xaa, 0xa3, 0xf9, 0x56, 0x8f, 0x03, 0xba, 0x97, 0xfe, 0x76, 0x63, 0xff, 0x3e, 0x9c, 0x03, 0x96, - 0x68, 0xfb, 0x36, 0x88, 0xfc, 0x1f, 0x52, 0xff, 0xc7, 0x3f, 0xfa, 0x8a, 0x96, 0xfa, 0x0e, 0x2c, - 0xf9, 0x41, 0xf5, 0xfa, 0xdd, 0x3b, 0xfe, 0xbe, 0xea, 0xfb, 0x74, 0x01, 0xfd, 0x04, 0x75, 0xfe, - 0xc8, 0xf3, 0xfe, 0x94, 0x8b, 0xfd, 0x2c, 0x7b, 0x37, 0x5a, 0xdc, 0x2a, 0x08, 0xc0, 0xed, 0xca, - 0x84, 0x0b, 0x47, 0x7d, 0x2d, 0x9e, 0xfc, 0x04, 0xa5, 0x4d, 0xe5, 0x55, 0x60, 0x0b, 0xc0, 0xc8, - 0x17, 0x60, 0xca, 0xe1, 0xbb, 0xf9, 0xe6, 0x41, 0xbf, 0x12, 0x07, 0x00, 0x0b, 0xf1, 0x5d, 0xf3, - 0xff, 0x72, 0xf5, 0xe5, 0x07, 0x02, 0xff, 0x78, 0x00, 0x3a, 0x13, 0x00, 0xed, 0x2f, 0x03, 0x2d, - 0x81, 0xfc, 0x08, 0x22, 0xfc, 0xc3, 0xb5, 0xfe, 0x4f, 0x1b, 0xfb, 0x7b, 0xcc, 0xf9, 0x45, 0xdf, - 0xf8, 0xe1, 0x7a, 0xfa, 0x4f, 0x0f, 0xfd, 0x82, 0xe2, 0xfb, 0xa7, 0xf0, 0xfc, 0xf2, 0x8e, 0xfe, - 0x47, 0x99, 0xfe, 0x54, 0x77, 0xfd, 0x09, 0x43, 0x3d, 0xad, 0xa8, 0x2c, 0x81, 0x06, 0xe9, 0xef, - 0x30, 0x08, 0x20, 0x2f, 0x2d, 0xb8, 0xf7, 0x06, 0xc5, 0x01, 0xe6, 0x23, 0x30, 0x0f, 0xe3, 0xb8, - 0x1a, 0x4f, 0x65, 0xdd, 0x84, 0x1d, 0xe3, 0xac, 0x06, 0x12, 0xf6, 0xd3, 0x0e, 0xef, 0x42, 0xf6, - 0xbd, 0x1b, 0xf2, 0x34, 0x45, 0xff, 0x31, 0x21, 0x01, 0x90, 0xf8, 0x01, 0x9c, 0x3d, 0x03, 0xb4, - 0xbc, 0xfc, 0x07, 0xe9, 0xfc, 0xe9, 0x90, 0xfd, 0xdb, 0xde, 0xfa, 0x12, 0x17, 0xfa, 0x14, 0x44, - 0xf8, 0x92, 0xd5, 0xf9, 0x3e, 0xf9, 0xfc, 0xcb, 0xa2, 0xfb, 0x42, 0x44, 0xfc, 0x7f, 0x39, 0xff, - 0xfc, 0x0d, 0xff, 0x23, 0xed, 0xfc, 0xee, 0xcd, 0x44, 0x76, 0x89, 0x2c, 0xf1, 0xa7, 0xe3, 0x14, - 0x63, 0x07, 0xd6, 0x79, 0x2b, 0x2e, 0xae, 0x05, 0x05, 0x8e, 0xe7, 0xfd, 0x49, 0x15, 0x00, 0x19, - 0x1c, 0x2f, 0x75, 0xd8, 0xbe, 0x46, 0xe1, 0x6f, 0x49, 0x10, 0x5d, 0xb0, 0x10, 0xe4, 0x94, 0xf9, - 0x2e, 0x75, 0xf0, 0x99, 0x5a, 0xfc, 0xaa, 0x00, 0x00, 0x0e, 0x56, 0x04, 0xae, 0x01, 0x04, 0xc7, - 0xa0, 0xfc, 0xb7, 0xe0, 0xfd, 0x61, 0x6c, 0xfb, 0xd6, 0xa3, 0xfa, 0x96, 0xbc, 0xfa, 0x5e, 0xf0, - 0xf6, 0xa0, 0x5f, 0xfa, 0xf7, 0x93, 0xfc, 0xf0, 0x97, 0xfa, 0x09, 0xbe, 0xfc, 0x00, 0xe6, 0xff, - 0x09, 0x5b, 0xff, 0xdf, 0x59, 0xfc, 0x27, 0x0b, 0x4c, 0xf5, 0x23, 0x2d, 0xce, 0x10, 0xde, 0x00, - 0x92, 0x07, 0x18, 0xb4, 0x29, 0x60, 0x75, 0x02, 0xd6, 0x99, 0xe9, 0xa0, 0xaa, 0x1b, 0x4c, 0x15, - 0x1e, 0x0f, 0x97, 0xd4, 0xe8, 0x5a, 0xdf, 0xd1, 0xa1, 0x0e, 0x85, 0x74, 0x11, 0x04, 0x82, 0xfc, - 0xdd, 0x82, 0xf0, 0x48, 0x0c, 0xfa, 0x03, 0xb8, 0xfd, 0x14, 0x30, 0x06, 0x8c, 0x00, 0x06, 0xc7, - 0xc9, 0xfc, 0xea, 0xe8, 0xfd, 0x73, 0xe8, 0xf9, 0x34, 0x7d, 0xfa, 0x95, 0xfd, 0xfa, 0x58, 0xd5, - 0xf6, 0xcf, 0xb1, 0xfa, 0x64, 0xa9, 0xfb, 0x0b, 0x78, 0xfa, 0xa6, 0x55, 0xfd, 0xcc, 0x7c, 0x00, - 0x63, 0xe2, 0xff, 0x04, 0x71, 0xfb, 0x76, 0x91, 0x54, 0xc1, 0x23, 0x2f, 0xd9, 0xf6, 0xd5, 0xd7, - 0x40, 0x05, 0x7a, 0xab, 0x29, 0x85, 0xa6, 0x01, 0x23, 0x36, 0xeb, 0x9a, 0xe7, 0x1d, 0x0e, 0x28, - 0x1f, 0x3d, 0xc5, 0xd3, 0x5d, 0x1c, 0xde, 0xa2, 0x6d, 0x0d, 0x59, 0x1e, 0x11, 0x05, 0x24, 0xfd, - 0x8f, 0x7e, 0xf1, 0x74, 0x6c, 0xf9, 0x29, 0x19, 0xfb, 0xbb, 0x07, 0x07, 0xb4, 0xce, 0x08, 0x3c, - 0x18, 0xfc, 0x48, 0xa4, 0xfc, 0xa0, 0x68, 0xfa, 0xfa, 0x17, 0xfa, 0x9a, 0x83, 0xfa, 0xa9, 0x48, - 0xf7, 0x43, 0x2f, 0xfa, 0x09, 0xa8, 0xfb, 0x27, 0x1a, 0xfb, 0xca, 0x1e, 0xfd, 0xdf, 0xe1, 0x00, - 0x4e, 0x3d, 0x00, 0x86, 0x85, 0xfa, 0xc6, 0x4e, 0x5c, 0x24, 0x30, 0x32, 0x0b, 0xe8, 0xcd, 0x50, - 0xeb, 0x02, 0xa2, 0x1d, 0x2a, 0x2b, 0x71, 0x00, 0xb4, 0x5b, 0xec, 0x76, 0x58, 0x1e, 0xd2, 0x6d, - 0x21, 0xca, 0xc4, 0xd4, 0x02, 0x9f, 0xdb, 0x4c, 0xf0, 0x0c, 0x00, 0x08, 0x11, 0xf3, 0x42, 0xfc, - 0xad, 0x9e, 0xf2, 0x52, 0x87, 0xfa, 0xd7, 0x59, 0xf8, 0xe6, 0x41, 0x06, 0xc8, 0x2e, 0x0c, 0xa5, - 0x40, 0xfb, 0xa6, 0x2b, 0xfb, 0x7c, 0x23, 0xfc, 0xe3, 0x6d, 0xf9, 0xc8, 0xeb, 0xf9, 0x74, 0xfc, - 0xf7, 0xca, 0xcf, 0xf9, 0x5e, 0xf6, 0xfb, 0x3d, 0x98, 0xfb, 0x18, 0x18, 0xfd, 0x70, 0xf5, 0x00, - 0x30, 0x1c, 0x00, 0x14, 0xf7, 0xf9, 0x3a, 0x9f, 0x63, 0x50, 0x40, 0x34, 0x41, 0x5b, 0xc7, 0x3e, - 0xbf, 0x01, 0xca, 0xfa, 0x29, 0x2b, 0xac, 0xfe, 0x89, 0x6f, 0xec, 0xdf, 0xf7, 0x1d, 0x3e, 0xa8, - 0x24, 0x15, 0xf7, 0xd6, 0x8e, 0x8d, 0xd8, 0x1a, 0x64, 0x0c, 0x6c, 0x46, 0x11, 0x5d, 0xb7, 0xfa, - 0x9d, 0xd9, 0xf3, 0xe7, 0x76, 0xfc, 0xa6, 0xbc, 0xf5, 0xdd, 0x62, 0x04, 0xb9, 0xe5, 0x0e, 0x15, - 0x12, 0xfb, 0xbb, 0x4a, 0xfa, 0xbf, 0xcb, 0xfd, 0x5a, 0xac, 0xf8, 0xf7, 0x95, 0xf9, 0x23, 0x09, - 0xf9, 0xb5, 0x7d, 0xf9, 0xe1, 0xdb, 0xfb, 0xf3, 0x3b, 0xfc, 0x26, 0x2e, 0xfd, 0x8a, 0xad, 0x00, - 0xc6, 0xe9, 0xff, 0x23, 0x5a, 0xf9, 0x9b, 0x27, 0x68, 0x68, 0xd8, 0x37, 0x90, 0x0c, 0xc3, 0x78, - 0x41, 0x00, 0x95, 0x5c, 0x29, 0xcf, 0xe5, 0xfc, 0x67, 0x02, 0xeb, 0x27, 0x95, 0x1b, 0x79, 0xcc, - 0x29, 0xc4, 0x76, 0xda, 0xf0, 0x97, 0xd4, 0xa4, 0x21, 0x0b, 0x4d, 0x3a, 0x11, 0xe8, 0x00, 0xfa, - 0xc4, 0xa8, 0xf4, 0xeb, 0x0b, 0xfe, 0x89, 0xdc, 0xf3, 0x81, 0x61, 0x01, 0xb1, 0x41, 0x10, 0x71, - 0x23, 0xfc, 0x79, 0xd5, 0xf9, 0x21, 0x89, 0xfe, 0xcc, 0xc6, 0xf8, 0x5b, 0x8d, 0xf9, 0xbc, 0x94, - 0xf9, 0x97, 0x37, 0xf9, 0x1b, 0x9e, 0xfb, 0xb3, 0xbc, 0xfc, 0xee, 0x38, 0xfd, 0xa5, 0x19, 0x00, - 0x73, 0x85, 0xff, 0x8f, 0x54, 0xf9, 0xc3, 0xc1, 0x6b, 0x02, 0x7f, 0x3a, 0x75, 0x5b, 0xc1, 0x40, - 0x67, 0xff, 0x8f, 0xe2, 0x27, 0x76, 0xa5, 0xfb, 0x68, 0xb2, 0xe7, 0x95, 0xb8, 0x18, 0x6a, 0x8e, - 0x2f, 0x83, 0xea, 0xdd, 0x96, 0x1d, 0xd2, 0x32, 0x3b, 0x09, 0xf1, 0x1c, 0x10, 0x39, 0xad, 0xfa, - 0x29, 0x9a, 0xf5, 0x27, 0x92, 0xfe, 0x70, 0xe4, 0xf2, 0x6a, 0xb0, 0xfe, 0x87, 0xb6, 0x0f, 0x75, - 0x18, 0xfe, 0x5b, 0x5e, 0xfa, 0x42, 0xf2, 0xfd, 0xaf, 0x3f, 0xfa, 0x42, 0x1b, 0xfa, 0x92, 0xe3, - 0xf8, 0xf3, 0x90, 0xf9, 0x58, 0x8d, 0xfb, 0x6a, 0xf9, 0xfc, 0xaa, 0x4e, 0xfd, 0x81, 0x1a, 0xff, - 0x0d, 0x55, 0xff, 0x6a, 0xd8, 0xf9, 0x27, 0x68, 0x6e, 0x10, 0xbd, 0x3b, 0xed, 0x63, 0xc2, 0x8b, - 0x6a, 0xff, 0x8f, 0xd8, 0x25, 0x11, 0xd9, 0xfa, 0x5f, 0xc9, 0xe2, 0xf7, 0xec, 0x15, 0x3d, 0xe0, - 0x34, 0x86, 0x24, 0xe1, 0x47, 0xf1, 0xd1, 0xfc, 0x9d, 0x06, 0x3b, 0xb3, 0x0d, 0x5f, 0xb7, 0xfc, - 0xd7, 0x29, 0xf7, 0x15, 0xc1, 0xfd, 0xb1, 0x1f, 0xf2, 0x3a, 0x4d, 0xfd, 0xe3, 0x9e, 0x0d, 0x94, - 0x0e, 0x00, 0x17, 0x65, 0xfc, 0x97, 0x38, 0xfc, 0x92, 0x70, 0xfc, 0x3b, 0x88, 0xfb, 0x61, 0x54, - 0xf7, 0x22, 0x75, 0xfa, 0x9f, 0xb8, 0xfb, 0x23, 0xf3, 0xfc, 0x6e, 0xff, 0xfc, 0x96, 0x45, 0xfe, - 0x1f, 0x5b, 0xff, 0x7f, 0x63, 0xf9, 0xc0, 0x57, 0x6e, 0xe5, 0xe9, 0x3d, 0xe4, 0x26, 0xc6, 0xb2, - 0x9e, 0xff, 0x08, 0xed, 0x23, 0x26, 0x48, 0xf9, 0xba, 0x5a, 0xdd, 0x75, 0xb2, 0x12, 0x5e, 0x54, - 0x39, 0xfc, 0x83, 0xe5, 0xa4, 0xd5, 0xd2, 0xf7, 0xf9, 0x02, 0x4a, 0x9f, 0x0a, 0x19, 0x06, 0x00, - 0xbe, 0x57, 0xf9, 0xe7, 0x94, 0xfb, 0x1e, 0x52, 0xf1, 0x26, 0x7d, 0xfd, 0xfa, 0xa3, 0x0a, 0x6d, - 0xf3, 0x00, 0xe8, 0x08, 0x00, 0x76, 0x5d, 0xfa, 0x38, 0xc9, 0xfd, 0xd2, 0x38, 0xfe, 0xab, 0xea, - 0xf5, 0x25, 0x11, 0xfb, 0xb7, 0x43, 0xfc, 0xd9, 0x2c, 0xfc, 0x07, 0xdd, 0xfc, 0x75, 0x6c, 0xfd, - 0x56, 0xbc, 0xfd, 0x5d, 0xbf, 0xf9, 0x74, 0x38, 0x6c, 0x47, 0xcc, 0x40, 0x39, 0x6f, 0xcb, 0x4d, - 0x94, 0xff, 0x21, 0x2c, 0x22, 0xac, 0xbc, 0xf7, 0x30, 0x17, 0xd9, 0x58, 0x81, 0x0d, 0x07, 0x08, - 0x3b, 0xa6, 0xe9, 0xeb, 0x50, 0xc2, 0xd4, 0x93, 0xed, 0xfe, 0x5f, 0x1c, 0x07, 0xdf, 0x4f, 0x03, - 0xc7, 0xaf, 0xfb, 0x17, 0xbe, 0xf8, 0xdf, 0x28, 0xf1, 0xfd, 0x76, 0xfe, 0x48, 0x2d, 0x07, 0x3f, - 0x1e, 0x00, 0x3b, 0x7b, 0x04, 0x51, 0x30, 0xfa, 0x3d, 0x09, 0xfd, 0xc4, 0x6e, 0x01, 0x4b, 0x10, - 0xf6, 0x17, 0x58, 0xfa, 0x67, 0x10, 0xfd, 0x83, 0x17, 0xfc, 0x4b, 0x19, 0xfb, 0xe4, 0x29, 0xfb, - 0x6c, 0x82, 0xfd, 0xef, 0x74, 0xfa, 0xcd, 0x37, 0x68, 0x3d, 0x29, 0x43, 0xf3, 0x7d, 0xd2, 0xc4, - 0x96, 0x01, 0x3a, 0x34, 0x20, 0x24, 0xdf, 0xf4, 0xa0, 0x05, 0xd6, 0x6b, 0x0f, 0x07, 0x1b, 0x2e, - 0x3b, 0xd8, 0x3a, 0xf4, 0xa7, 0x5d, 0xd6, 0x7a, 0xb5, 0xfa, 0x54, 0x40, 0x04, 0x1b, 0xc7, 0x05, - 0x65, 0x21, 0xfe, 0x7c, 0xb0, 0xf6, 0x09, 0x47, 0xf1, 0xb7, 0x46, 0xff, 0x7f, 0x57, 0x04, 0xa6, - 0x1d, 0xfe, 0x92, 0x20, 0x08, 0xd5, 0x8e, 0xfc, 0xb0, 0x00, 0xfb, 0xdb, 0xae, 0x03, 0xa1, 0x65, - 0xf8, 0x62, 0xf6, 0xf8, 0x42, 0xde, 0xfd, 0x86, 0xfe, 0xfa, 0x16, 0x2a, 0xf8, 0x29, 0x00, 0xfb, - 0x2e, 0xc7, 0xfc, 0x6b, 0x60, 0xfa, 0xd6, 0xa6, 0x63, 0xff, 0x01, 0x46, 0x72, 0x9a, 0xd9, 0x75, - 0x7c, 0x02, 0x6a, 0x92, 0x1d, 0x61, 0xfc, 0xf4, 0x08, 0x0c, 0xd6, 0xda, 0x89, 0xfc, 0xf5, 0x87, - 0x38, 0x06, 0x9a, 0xfe, 0x46, 0xd2, 0xd7, 0x49, 0xe6, 0xf7, 0xef, 0x94, 0x02, 0xa1, 0x24, 0x05, - 0x1c, 0x99, 0x00, 0x69, 0x38, 0xf7, 0xd0, 0x2a, 0xf1, 0x1b, 0xdf, 0xff, 0x54, 0x41, 0x02, 0xf1, - 0x4a, 0xfb, 0x3d, 0x55, 0x0a, 0x9b, 0x83, 0x00, 0xcd, 0x3b, 0xfa, 0xa5, 0x58, 0x03, 0x75, 0xde, - 0xfb, 0xbf, 0xef, 0xf8, 0x33, 0x2c, 0xfb, 0x1d, 0x22, 0xfb, 0x26, 0x98, 0xf7, 0x9a, 0x4f, 0xf9, - 0x6d, 0x2c, 0xfc, 0x2c, 0xe0, 0xfa, 0x9b, 0xaa, 0x5f, 0x42, 0xb8, 0x48, 0x31, 0xd4, 0xde, 0x59, - 0xb3, 0x03, 0x34, 0x09, 0x1b, 0xf9, 0x44, 0xf4, 0xf8, 0x83, 0xd9, 0x72, 0xcf, 0xf1, 0xd8, 0x64, - 0x31, 0x5f, 0x55, 0x09, 0x5f, 0x5d, 0xda, 0x85, 0x3d, 0xf5, 0x48, 0x00, 0x02, 0x63, 0x3b, 0x03, - 0x6b, 0x87, 0x01, 0xd7, 0xc4, 0xf9, 0x8e, 0x07, 0xf2, 0x66, 0xd9, 0xfe, 0x7b, 0x67, 0x01, 0x15, - 0x19, 0xf9, 0xa7, 0x15, 0x0a, 0x71, 0x21, 0x04, 0x7f, 0xf0, 0xfa, 0xa1, 0xc4, 0x02, 0x29, 0x38, - 0xfd, 0x3a, 0x7e, 0xf8, 0x91, 0x80, 0xf9, 0x86, 0xa5, 0xfb, 0x06, 0xe0, 0xf7, 0x60, 0x0b, 0xf8, - 0x1d, 0x80, 0xfb, 0xb2, 0x57, 0xfb, 0x65, 0x18, 0x5d, 0x69, 0x56, 0x49, 0x52, 0xa2, 0xe2, 0x8f, - 0xd6, 0x06, 0x26, 0x33, 0x19, 0x66, 0xa3, 0xf1, 0x2a, 0x5c, 0xdd, 0xf5, 0xa8, 0xea, 0xff, 0xe4, - 0x27, 0x27, 0x8a, 0x11, 0x33, 0x21, 0xdf, 0x9a, 0xc8, 0xf1, 0xa8, 0x47, 0x02, 0xd7, 0x92, 0x02, - 0x2a, 0x05, 0x00, 0x07, 0x91, 0xfd, 0x6f, 0x48, 0xf4, 0x2a, 0x53, 0xfc, 0x12, 0x56, 0x02, 0x51, - 0xa9, 0xf7, 0x3b, 0x12, 0x07, 0xa1, 0x58, 0x07, 0x54, 0xcc, 0xfc, 0x4c, 0xfa, 0x00, 0x14, 0xf8, - 0xfc, 0xb5, 0xa5, 0xf9, 0x8c, 0xeb, 0xf8, 0x15, 0x46, 0xfc, 0x80, 0x94, 0xf9, 0xbd, 0xda, 0xf6, - 0xff, 0xa1, 0xfb, 0x6f, 0x7c, 0xfb, 0x01, 0xa9, 0x5a, 0x96, 0x10, 0x4a, 0x04, 0x75, 0xe5, 0x62, - 0xdd, 0x09, 0xdd, 0x83, 0x19, 0xef, 0x84, 0xed, 0xbd, 0xc7, 0xe0, 0x39, 0xcc, 0xe7, 0x07, 0x10, - 0x1c, 0xa1, 0x60, 0x17, 0x31, 0xe4, 0xe6, 0x22, 0xce, 0xec, 0xe1, 0x8e, 0x02, 0x33, 0x19, 0x05, - 0x70, 0xc4, 0xfc, 0xea, 0x51, 0x00, 0xc1, 0x21, 0xf9, 0x95, 0x83, 0xf9, 0x5c, 0x3a, 0x03, 0xb1, - 0xc9, 0xf7, 0xcd, 0xa4, 0x01, 0x60, 0x47, 0x09, 0x68, 0x27, 0xff, 0x90, 0x7b, 0xfe, 0x16, 0x77, - 0xfd, 0x59, 0xdb, 0xfb, 0xdb, 0xb2, 0xf9, 0x32, 0xdf, 0xfc, 0x43, 0xc7, 0xfb, 0x6b, 0x0c, 0xf8, - 0x9e, 0x78, 0xfa, 0x1e, 0x70, 0xf9, 0x74, 0x22, 0x56, 0x2d, 0xf4, 0x4a, 0xa0, 0xa7, 0xea, 0x72, - 0x60, 0x0a, 0xed, 0x8c, 0x18, 0x95, 0xb2, 0xec, 0xfd, 0x4e, 0xe4, 0xf5, 0xf7, 0xe3, 0x65, 0x71, - 0x10, 0x67, 0x2d, 0x1c, 0xdf, 0x4a, 0xee, 0xcb, 0x32, 0xe8, 0x50, 0xc0, 0x02, 0x7b, 0x49, 0x08, - 0x6f, 0x94, 0xf9, 0x80, 0xf0, 0x01, 0x04, 0xe6, 0xfe, 0xa8, 0xc4, 0xf6, 0x36, 0x53, 0x02, 0xef, - 0x10, 0xfa, 0x8b, 0x8e, 0xfb, 0x1e, 0x34, 0x06, 0xf4, 0xf5, 0x02, 0x99, 0x44, 0xfe, 0xd1, 0xfc, - 0xfc, 0x33, 0xe9, 0xfe, 0x1c, 0x2b, 0xfb, 0x4e, 0x16, 0xfe, 0x27, 0xf3, 0xfd, 0xe3, 0x32, 0xf8, - 0xea, 0x8e, 0xf9, 0x03, 0xea, 0xf7, 0xbd, 0x0b, 0x53, 0xeb, 0x6a, 0x49, 0x64, 0x91, 0xef, 0xc3, - 0x6b, 0x0b, 0xfe, 0x10, 0x15, 0x47, 0x27, 0xee, 0xd8, 0x85, 0xe7, 0xde, 0x6b, 0xdf, 0x1c, 0xf5, - 0x07, 0xed, 0xf3, 0x1d, 0x8d, 0xfc, 0xf3, 0x24, 0x96, 0xe6, 0x13, 0x83, 0x02, 0x3e, 0xf9, 0x09, - 0x95, 0x84, 0xf8, 0xb5, 0x52, 0x04, 0xef, 0x78, 0x00, 0x2d, 0x0e, 0xf4, 0x41, 0xc2, 0x03, 0x27, - 0xa3, 0xfa, 0xb5, 0x79, 0xf6, 0xaf, 0xa5, 0x02, 0x23, 0xe1, 0x03, 0x70, 0xa3, 0x00, 0x9c, 0xb9, - 0xfd, 0x50, 0x5b, 0x01, 0x4a, 0x69, 0xfd, 0x39, 0xe7, 0xfd, 0x8d, 0xac, 0xff, 0xa5, 0xed, 0xf8, - 0xe4, 0x62, 0xf9, 0xad, 0xd8, 0xf6, 0xd2, 0x3b, 0x52, 0x60, 0xfa, 0x45, 0x0c, 0xf3, 0xf1, 0xdf, - 0xf0, 0x0e, 0x20, 0x98, 0x11, 0xc3, 0x83, 0xee, 0x83, 0x14, 0xec, 0xd7, 0xd2, 0xdc, 0xd2, 0xf6, - 0xff, 0x25, 0x8f, 0x1e, 0x5a, 0x96, 0xfa, 0xe7, 0xeb, 0xe4, 0x85, 0xfc, 0x01, 0x71, 0xc6, 0x0e, - 0xd2, 0x53, 0xf7, 0x8a, 0x6b, 0x03, 0x70, 0x3f, 0x02, 0x91, 0x67, 0xf2, 0xda, 0x0d, 0x04, 0x62, - 0x7b, 0xfb, 0x2d, 0xac, 0xf4, 0xb5, 0xeb, 0x00, 0x4f, 0xd2, 0x00, 0x9e, 0xd1, 0x02, 0xd1, 0xe6, - 0x03, 0xa0, 0x1e, 0x01, 0x77, 0x16, 0xfd, 0x45, 0xa7, 0x00, 0x61, 0x0f, 0x01, 0xcd, 0x3d, 0xf9, - 0xc0, 0x4e, 0xf9, 0x93, 0xdd, 0xf6, 0x69, 0x2d, 0x53, 0x92, 0x78, 0x41, 0xfe, 0x8a, 0xf0, 0x48, - 0x46, 0x13, 0x1a, 0x64, 0x10, 0xa2, 0x06, 0xed, 0x95, 0x74, 0xee, 0xec, 0x2e, 0xdd, 0x78, 0x4a, - 0xfa, 0x4d, 0xec, 0x1b, 0x04, 0xf1, 0x00, 0xd1, 0xcb, 0xe5, 0xaf, 0xfe, 0xff, 0x96, 0xff, 0x12, - 0x25, 0x03, 0xf7, 0x9e, 0x05, 0xff, 0x50, 0xbb, 0x03, 0x8a, 0x1a, 0xf3, 0x83, 0x56, 0x01, 0x11, - 0xf6, 0xfd, 0x7b, 0x20, 0xf5, 0xcc, 0xbd, 0xfe, 0x98, 0xcc, 0x01, 0x43, 0x72, 0x00, 0x4f, 0x4d, - 0x05, 0x58, 0xef, 0x05, 0x07, 0x1b, 0xfc, 0xe5, 0x54, 0x01, 0xe9, 0x76, 0x03, 0x54, 0x8d, 0xf8, - 0xad, 0xcf, 0xf8, 0x2f, 0x2b, 0xf8, 0x0e, 0xf6, 0x54, 0x5c, 0xa3, 0x3e, 0xf8, 0x9b, 0xe8, 0x95, - 0xe5, 0x17, 0x3c, 0x77, 0x17, 0x60, 0x47, 0xe6, 0x09, 0xb2, 0xec, 0x53, 0x2e, 0xe3, 0xb9, 0xb2, - 0xf7, 0x8d, 0xe8, 0x16, 0x60, 0x65, 0x05, 0x1f, 0x97, 0xe9, 0xa4, 0x10, 0xfd, 0x88, 0x22, 0x15, - 0x36, 0x6b, 0xf7, 0x05, 0x3d, 0xf9, 0x12, 0x85, 0x05, 0x64, 0xd4, 0xf5, 0x4b, 0xf0, 0xfd, 0xea, - 0xe2, 0xfe, 0xca, 0x65, 0xf9, 0x15, 0xb3, 0xfe, 0x89, 0x1f, 0x01, 0x0a, 0x62, 0xfe, 0x48, 0xc1, - 0x01, 0x5f, 0x41, 0x0b, 0xf6, 0xe0, 0xff, 0x10, 0x6b, 0xfd, 0xcb, 0x7c, 0x06, 0xb6, 0x5b, 0xfa, - 0x69, 0x36, 0xf5, 0x46, 0x7e, 0xfa, 0x0e, 0xae, 0x59, 0xc1, 0xcd, 0x38, 0xd0, 0xdd, 0xdb, 0x79, - 0x28, 0x21, 0x30, 0xc6, 0x20, 0x29, 0xdb, 0xd9, 0x59, 0xc2, 0xe8, 0x9a, 0xbd, 0xee, 0x14, 0xe8, - 0xf8, 0xef, 0x4b, 0x0d, 0x4b, 0xb2, 0x08, 0xb6, 0x93, 0xf0, 0x5c, 0x95, 0xf6, 0x6c, 0x2f, 0x15, - 0x12, 0x58, 0xfb, 0x73, 0x89, 0xf2, 0x25, 0x12, 0x05, 0xed, 0x5e, 0xfb, 0x6c, 0x24, 0xfc, 0x14, - 0x57, 0xfd, 0x00, 0x27, 0xfe, 0x5b, 0xc8, 0x00, 0x32, 0xea, 0xfd, 0xe2, 0xbf, 0xfd, 0x92, 0x30, - 0x00, 0xc6, 0xd9, 0x08, 0x49, 0xd6, 0x04, 0x45, 0x86, 0xff, 0x30, 0x64, 0x03, 0x87, 0x65, 0xfc, - 0x6d, 0x33, 0xf6, 0x09, 0x15, 0xf9, 0x6f, 0x65, 0x5d, 0xe0, 0x4f, 0x30, 0x82, 0x24, 0xd4, 0xf4, - 0x44, 0x2b, 0x37, 0x0a, 0x22, 0x26, 0xda, 0xd1, 0xb6, 0xf2, 0xea, 0x09, 0xa3, 0xf6, 0x11, 0xac, - 0xf9, 0xf6, 0xda, 0x05, 0xfc, 0xb5, 0x09, 0x85, 0xb6, 0xf5, 0xd3, 0x37, 0xf3, 0x0e, 0xdd, 0x13, - 0x96, 0x4c, 0xfd, 0x1d, 0xbf, 0xef, 0xef, 0x08, 0x04, 0xde, 0x2a, 0x00, 0x43, 0x31, 0xfd, 0x71, - 0x9d, 0xfb, 0xa8, 0xb5, 0xff, 0xab, 0x12, 0x02, 0x0f, 0x80, 0xfe, 0xfd, 0xa7, 0xfc, 0x32, 0x85, - 0xfd, 0x74, 0x8c, 0x07, 0x4a, 0xe7, 0x05, 0xa2, 0x25, 0x02, 0xeb, 0xf9, 0x02, 0xe3, 0x05, 0xfd, - 0x63, 0xfe, 0xf8, 0x8d, 0x21, 0xf7, 0xac, 0x30, 0x5e, 0x3f, 0x4a, 0x29, 0x9d, 0x7a, 0xcf, 0xa5, - 0xe3, 0x31, 0x1f, 0xbe, 0x23, 0x59, 0x6f, 0xcc, 0xb0, 0xdf, 0xea, 0x29, 0x80, 0x00, 0x95, 0x44, - 0xfc, 0xb0, 0xde, 0xf9, 0xad, 0x9d, 0x09, 0x29, 0xdf, 0xfe, 0x7a, 0x09, 0xef, 0x1e, 0xab, 0x0e, - 0x25, 0x02, 0x02, 0xfd, 0x17, 0xf1, 0x01, 0xf3, 0x00, 0xcc, 0x11, 0x02, 0x6d, 0xd3, 0xff, 0x64, - 0xf6, 0xfb, 0x14, 0x61, 0xff, 0x94, 0x6f, 0x00, 0x56, 0xca, 0xff, 0xde, 0x94, 0xfe, 0x0d, 0x4f, - 0xfa, 0x4e, 0x1c, 0x06, 0xe9, 0x4a, 0x07, 0x83, 0x54, 0x00, 0x42, 0x66, 0x04, 0xae, 0x49, 0x00, - 0x2c, 0xdf, 0xf7, 0x45, 0xb0, 0xf7, 0x69, 0x72, 0x59, 0x46, 0xf3, 0x23, 0x9f, 0x02, 0xd1, 0xbd, - 0x44, 0x35, 0x23, 0x30, 0x24, 0x8b, 0xe3, 0xca, 0xe4, 0x8a, 0xec, 0xd9, 0x4d, 0x06, 0x42, 0x14, - 0xfb, 0xfb, 0xc7, 0xf3, 0x19, 0x80, 0x0a, 0x5d, 0xac, 0x02, 0xfe, 0x23, 0xec, 0x3b, 0x01, 0x0c, - 0x29, 0xad, 0x06, 0x23, 0xcf, 0xf1, 0x96, 0xfd, 0xfe, 0xcf, 0xf0, 0x03, 0x5c, 0x5b, 0xff, 0x27, - 0x94, 0xfc, 0x4a, 0xa2, 0x00, 0x3d, 0x60, 0xfe, 0xf8, 0x9b, 0xff, 0x44, 0x35, 0x00, 0xf7, 0xa3, - 0xfa, 0x85, 0x05, 0x04, 0x01, 0xdc, 0x05, 0x35, 0x07, 0x01, 0xce, 0x2c, 0x04, 0x26, 0x46, 0x01, - 0x5a, 0x27, 0xf9, 0x39, 0x49, 0xf8, 0xa6, 0x60, 0x50, 0xec, 0xca, 0x20, 0xdd, 0x5d, 0xd7, 0x19, - 0x51, 0x34, 0xb0, 0xd6, 0x23, 0x71, 0x40, 0xcf, 0x5b, 0x30, 0xed, 0x36, 0x6c, 0x06, 0xed, 0xda, - 0xfb, 0x30, 0x26, 0xf2, 0xde, 0xfc, 0x07, 0x4d, 0x55, 0x04, 0x22, 0x59, 0xed, 0xcd, 0xd4, 0x09, - 0x72, 0x97, 0x08, 0xdc, 0x0a, 0xf4, 0xfb, 0x13, 0xfe, 0x17, 0xcf, 0x03, 0xce, 0x96, 0xff, 0x28, - 0x64, 0xfc, 0x11, 0x74, 0x00, 0x64, 0x19, 0xff, 0xe9, 0x02, 0xff, 0x8d, 0x94, 0xff, 0x41, 0xaa, - 0xfc, 0xec, 0x69, 0x03, 0x7d, 0xa8, 0x03, 0x6f, 0x85, 0x01, 0x04, 0xdc, 0x03, 0x05, 0x0f, 0x00, - 0x2f, 0x22, 0xfb, 0xee, 0xb7, 0xfa, 0xf7, 0x6f, 0x46, 0x5d, 0x38, 0x20, 0x7b, 0x4b, 0xde, 0x12, - 0xb9, 0x2e, 0xa6, 0x46, 0x24, 0xb2, 0xdb, 0xd5, 0xb9, 0xcd, 0xec, 0x1e, 0xc6, 0x06, 0x4b, 0x6a, - 0xfc, 0x8b, 0x9c, 0xf0, 0xae, 0xd3, 0x05, 0x9c, 0x89, 0x06, 0x02, 0x7d, 0xef, 0x19, 0xc6, 0x06, - 0xd3, 0xbb, 0x0a, 0x33, 0x58, 0xf6, 0x61, 0x7a, 0xfb, 0xde, 0x5c, 0x04, 0x6a, 0x1d, 0x01, 0x7e, - 0x1a, 0xfb, 0xf0, 0x53, 0xff, 0xcf, 0x83, 0x00, 0xfa, 0x2a, 0xff, 0x9f, 0xcf, 0xfe, 0x60, 0xae, - 0xfd, 0x75, 0xb0, 0x03, 0x9d, 0x8b, 0x03, 0x88, 0x56, 0x00, 0xf4, 0xa7, 0x02, 0x8b, 0x5b, 0x00, - 0xbb, 0x4d, 0xfb, 0x84, 0x58, 0xfc, 0xbb, 0x53, 0x3e, 0xcf, 0x2e, 0x24, 0x4e, 0x13, 0xea, 0xf0, - 0xe7, 0x20, 0xb8, 0x31, 0x18, 0x1c, 0x3f, 0xdf, 0x03, 0x89, 0xf3, 0x5c, 0x73, 0x01, 0x42, 0x7c, - 0xfb, 0x2e, 0xac, 0xfd, 0x8f, 0x62, 0x01, 0x26, 0x21, 0xfc, 0xf5, 0xc3, 0xfb, 0x4f, 0xdd, 0x08, - 0xad, 0x32, 0x02, 0xb3, 0x41, 0xf9, 0x9e, 0x18, 0xfd, 0x2a, 0xac, 0x00, 0xda, 0xd9, 0x00, 0x77, - 0x0b, 0xfb, 0xda, 0x88, 0xfc, 0x83, 0xfe, 0x00, 0xdd, 0xba, 0x00, 0xb0, 0x80, 0x00, 0x66, 0x37, - 0x00, 0xea, 0xa2, 0x00, 0xd7, 0x2c, 0x00, 0x28, 0xe1, 0x01, 0x18, 0x61, 0x02, 0x43, 0xc8, 0xff, - 0x27, 0xb3, 0xff, 0x71, 0xd8, 0xff, 0x79, 0xbc, 0x34, 0xe5, 0x87, 0x20, 0x4a, 0x83, 0xf1, 0xbe, - 0x31, 0x20, 0xf9, 0xbd, 0x15, 0x42, 0x9a, 0xe3, 0x5e, 0xea, 0xf5, 0xc4, 0x54, 0x00, 0x6d, 0x1d, - 0xfb, 0xe1, 0xd8, 0xfe, 0xd3, 0x8b, 0x01, 0xc1, 0x2b, 0xfc, 0x2d, 0x14, 0xfc, 0x0c, 0xc7, 0x08, - 0x10, 0xc4, 0x02, 0x60, 0x7a, 0xf9, 0x9c, 0x0d, 0xfd, 0x29, 0x3f, 0x00, 0x33, 0x82, 0x00, 0xdb, - 0xd4, 0xfb, 0xf8, 0x13, 0xfd, 0xf3, 0xd0, 0x00, 0xfb, 0x09, 0x00, 0xc9, 0x4f, 0x00, 0x4d, 0x9a, - 0x00, 0xcb, 0xc5, 0x00, 0x2b, 0xc6, 0x00, 0x74, 0x19, 0x02, 0xa7, 0xef, 0x01, 0x6f, 0x8b, 0xff, - 0xa4, 0xc4, 0xff, 0xbd, 0x58, 0x00, 0xfa, 0xeb, 0x2b, 0x47, 0xb2, 0x1d, 0x9c, 0x20, 0xf9, 0xe4, - 0x40, 0x1d, 0xbd, 0x59, 0x12, 0xd2, 0x8a, 0xea, 0x1c, 0xbf, 0xf7, 0x78, 0x5b, 0xfd, 0x59, 0x59, - 0xfb, 0x8b, 0xd2, 0x00, 0xc9, 0xaa, 0x01, 0xbf, 0x8c, 0xfb, 0x47, 0xea, 0xfc, 0x1a, 0x73, 0x08, - 0x7e, 0xae, 0x02, 0xbc, 0x91, 0xfa, 0x2d, 0xef, 0xfc, 0x3b, 0x04, 0x00, 0x98, 0x87, 0x00, 0x46, - 0x15, 0xfc, 0xc8, 0x82, 0xfd, 0x3c, 0xd3, 0x00, 0x6c, 0xd3, 0xff, 0x6f, 0x03, 0x00, 0x29, 0x9c, - 0x00, 0x02, 0x14, 0x01, 0x6b, 0x66, 0x01, 0xa3, 0xfa, 0x01, 0x8c, 0xe8, 0x00, 0x7b, 0xb0, 0xff, - 0x5d, 0x4f, 0x00, 0x22, 0x08, 0x00, 0x79, 0xe1, 0x24, 0xaf, 0x27, 0x1c, 0xe5, 0xcc, 0xfd, 0xf8, - 0xa3, 0x18, 0xd6, 0x12, 0x11, 0xaa, 0x7e, 0xf0, 0x6c, 0x51, 0xf8, 0x62, 0x3f, 0xfc, 0x84, 0x06, - 0xfc, 0xb3, 0xc1, 0x01, 0xc5, 0x97, 0x01, 0x1a, 0x11, 0xfc, 0x6d, 0xa2, 0xfd, 0x13, 0xd1, 0x06, - 0x86, 0xce, 0x02, 0x46, 0xfe, 0xfb, 0xc7, 0xbb, 0xfc, 0x32, 0x8a, 0xff, 0x5f, 0x8a, 0x00, 0xc5, - 0xbe, 0xfc, 0x94, 0xca, 0xfd, 0xb3, 0xb6, 0x00, 0xa9, 0xf0, 0xff, 0xf5, 0xfb, 0xff, 0x72, 0x40, - 0x00, 0xbc, 0x7b, 0x01, 0x13, 0x27, 0x02, 0x63, 0xbd, 0x00, 0xa1, 0x11, 0x00, 0x06, 0x01, 0x01, - 0x7b, 0xd5, 0x00, 0x84, 0x49, 0xff, 0x1a, 0x61, 0x20, 0xe2, 0x33, 0x1b, 0x3b, 0x26, 0xff, 0x1b, - 0x80, 0x14, 0x7f, 0x39, 0x11, 0x63, 0xdc, 0xf3, 0x59, 0x47, 0xf8, 0x4f, 0x89, 0xfd, 0xb9, 0x68, - 0xfd, 0x36, 0xf3, 0x00, 0x21, 0x46, 0x01, 0xc7, 0x1a, 0xfe, 0x74, 0x1f, 0xfe, 0x35, 0x66, 0x04, - 0x43, 0x21, 0x03, 0xbc, 0xa6, 0xfd, 0xb5, 0x47, 0xfc, 0x63, 0xf4, 0xfe, 0xf8, 0xfd, 0x00, 0xa7, - 0xb7, 0xfd, 0xcb, 0xef, 0xfd, 0xd7, 0x71, 0x00, 0xad, 0x6c, 0x00, 0x43, 0xed, 0xff, 0xde, 0x29, - 0x00, 0x4c, 0x3b, 0x02, 0x1a, 0xad, 0x01, 0xa0, 0x08, 0x00, 0x0b, 0xf5, 0x00, 0x02, 0x9d, 0x01, - 0x1c, 0x9c, 0x00, 0x6f, 0xb6, 0xff, 0x70, 0xcf, 0x1d, 0xc3, 0x1d, 0x1a, 0x78, 0x04, 0xff, 0x9b, - 0x52, 0x11, 0x38, 0x6c, 0x10, 0x4f, 0xe9, 0xf5, 0xbb, 0xbf, 0xf9, 0xc9, 0x16, 0xff, 0x4f, 0xd5, - 0xfd, 0xff, 0x2d, 0x00, 0x5f, 0xa7, 0x01, 0x58, 0xdc, 0xff, 0xb0, 0xeb, 0xfd, 0xb3, 0xeb, 0x02, - 0x67, 0x7b, 0x03, 0x22, 0xf2, 0xfd, 0x40, 0x57, 0xfc, 0x9d, 0x6b, 0xff, 0xb2, 0x2d, 0x01, 0x33, - 0x19, 0xfe, 0xda, 0x1b, 0xfe, 0x99, 0xe9, 0x00, 0x8f, 0x70, 0x00, 0x30, 0x82, 0xff, 0xf9, 0x57, - 0x01, 0x58, 0x90, 0x02, 0x65, 0xc8, 0x00, 0xe4, 0x6d, 0x00, 0x62, 0xb2, 0x01, 0xd6, 0x0e, 0x02, - 0x5e, 0x03, 0x01, 0xa3, 0x7a, 0x00, 0x0d, 0x17, 0x1b, 0x33, 0x51, 0x18, 0x59, 0x33, 0xff, 0x3e, - 0x5f, 0x0f, 0x1b, 0x65, 0x0f, 0x1c, 0xb5, 0xf7, 0x79, 0x49, 0xfb, 0xa6, 0xef, 0xff, 0x55, 0xf9, - 0xfd, 0x89, 0xf8, 0xff, 0xfd, 0x48, 0x02, 0x8b, 0x97, 0x00, 0xb5, 0x85, 0xfd, 0x25, 0x13, 0x02, - 0x6c, 0x2f, 0x03, 0xb4, 0x75, 0xfe, 0x29, 0x1b, 0xfd, 0x90, 0x68, 0xff, 0xbd, 0x0c, 0x01, 0x26, - 0x68, 0xfe, 0xba, 0x9e, 0xfe, 0xed, 0x16, 0x01, 0x8b, 0x19, 0x00, 0x2c, 0xc3, 0x00, 0xc8, 0x64, - 0x02, 0xfb, 0x2b, 0x01, 0x4d, 0xb9, 0x00, 0x33, 0xf8, 0x01, 0x0a, 0x7a, 0x02, 0xf0, 0x09, 0x02, - 0x37, 0xa8, 0x00, 0x3d, 0x6c, 0x00, 0x38, 0x31, 0x18, 0x09, 0xcd, 0x15, 0xa6, 0xf4, 0xff, 0xdd, - 0xc0, 0x0e, 0x0b, 0x5c, 0x0e, 0xc5, 0x4b, 0xf9, 0x69, 0x74, 0xfc, 0x87, 0x5f, 0x00, 0x21, 0xe8, - 0xfe, 0x76, 0x63, 0x00, 0x6b, 0x0f, 0x02, 0x12, 0x50, 0x00, 0x4b, 0xb9, 0xfd, 0xe8, 0x49, 0x02, - 0x1f, 0xe1, 0x02, 0x6e, 0x88, 0xfe, 0x03, 0xb8, 0xfd, 0xb0, 0xc4, 0xff, 0x70, 0xd9, 0x00, 0x15, - 0xa0, 0xfe, 0x62, 0xa6, 0xff, 0x7e, 0x62, 0x01, 0xb6, 0xaf, 0x00, 0xd9, 0xfb, 0x01, 0x4c, 0xfc, - 0x01, 0xe3, 0x3b, 0x01, 0x98, 0x17, 0x02, 0xf6, 0x59, 0x02, 0x46, 0x2c, 0x02, 0x5f, 0x30, 0x01, - 0xea, 0xe0, 0xff, 0xc8, 0xf7, 0xff, 0x6a, 0xce, 0x15, 0x65, 0x75, 0x14, 0x9f, 0xb4, 0x00, 0xd0, - 0x95, 0x0c, 0xe9, 0xfb, 0x0c, 0x29, 0x6e, 0xfb, 0x75, 0x08, 0xfe, 0x1d, 0x00, 0x01, 0x93, 0xcd, - 0xfe, 0xea, 0x27, 0x00, 0x64, 0x5e, 0x02, 0xaf, 0xc6, 0x00, 0xc8, 0x1c, 0xfe, 0xce, 0xab, 0x01, - 0x95, 0x6e, 0x02, 0x11, 0x20, 0xff, 0xda, 0x44, 0xfe, 0x09, 0xd1, 0xff, 0xf7, 0xf8, 0x00, 0xf7, - 0xf7, 0xff, 0x6b, 0x8e, 0x00, 0x78, 0x5e, 0x01, 0x41, 0x1c, 0x02, 0xf8, 0xfe, 0x02, 0xd4, 0xb9, - 0x01, 0x6d, 0xbe, 0x01, 0xce, 0xeb, 0x01, 0x07, 0x10, 0x01, 0x1a, 0x3e, 0x01, 0x8c, 0x9d, 0x00, - 0x7f, 0x8c, 0xff, 0xfc, 0x97, 0xff, 0x71, 0xe7, 0x12, 0x76, 0x5c, 0x12, 0x02, 0x9d, 0x01, 0x3a, - 0xe4, 0x0b, 0xbe, 0xa3, 0x0c, 0x5c, 0x19, 0xfd, 0xda, 0x8a, 0xfe, 0xd2, 0x02, 0x01, 0xc1, 0x76, - 0xff, 0x4c, 0xca, 0x00, 0x71, 0x1e, 0x02, 0xe7, 0x6a, 0x00, 0x8b, 0x89, 0xfe, 0xe1, 0xa1, 0x01, - 0x76, 0x19, 0x02, 0x08, 0x90, 0xff, 0x8b, 0x10, 0xff, 0x54, 0x49, 0x00, 0xf0, 0xaa, 0x01, 0xcf, - 0x20, 0x01, 0x44, 0x67, 0x01, 0x87, 0x9d, 0x02, 0x52, 0x29, 0x03, 0xfa, 0x9c, 0x02, 0xe0, 0x01, - 0x01, 0x5b, 0x89, 0x00, 0xc7, 0x8f, 0x00, 0xb5, 0x9c, 0x00, 0x70, 0xe5, 0x00, 0xae, 0x77, 0x00, - 0xef, 0x85, 0xff, 0xf7, 0x06, 0xff, 0x00, 0x16, 0x10, 0xb5, 0x72, 0x10, 0x26, 0x00, 0x03, 0xd1, - 0x65, 0x0b, 0x41, 0x60, 0x0b, 0xd8, 0x56, 0xfe, 0x33, 0x0b, 0x00, 0x67, 0x4c, 0x01, 0x5a, 0x48, - 0xff, 0x05, 0x12, 0x01, 0xb0, 0x39, 0x02, 0xe9, 0x29, 0x00, 0xdd, 0xa2, 0xfe, 0xf0, 0xcd, 0x01, - 0x35, 0x87, 0x02, 0xbb, 0x58, 0x00, 0x21, 0xa3, 0xff, 0x98, 0xff, 0x00, 0xbe, 0x49, 0x03, 0x87, - 0xb0, 0x02, 0xa8, 0x10, 0x02, 0xdb, 0xf7, 0x02, 0xb3, 0x2d, 0x02, 0x43, 0x43, 0x00, 0xa2, 0xc3, - 0xff, 0x2b, 0x5b, 0x00, 0x15, 0x29, 0x00, 0x67, 0x68, 0x00, 0xdc, 0xb3, 0x00, 0x03, 0xbd, 0xff, - 0x3b, 0xe6, 0xfe, 0x29, 0xf8, 0xfe, 0x51, 0x93, 0x0e, 0xc3, 0xd0, 0x0f, 0x17, 0x54, 0x03, 0x41, - 0x66, 0x09, 0x26, 0xa7, 0x0a, 0x2e, 0xb5, 0x00, 0xbb, 0xec, 0x00, 0x62, 0xc4, 0x00, 0xa9, 0x72, - 0xff, 0x30, 0x31, 0x01, 0x29, 0x44, 0x02, 0xa2, 0x04, 0x01, 0x91, 0x95, 0xff, 0xe3, 0xe6, 0x01, - 0x85, 0xb7, 0x02, 0x30, 0xa1, 0x01, 0x0a, 0xd5, 0x01, 0x84, 0xf2, 0x02, 0xca, 0xfe, 0x03, 0xd2, - 0x6b, 0x02, 0x53, 0xfd, 0x00, 0xcd, 0x11, 0x01, 0xc8, 0x9f, 0x00, 0x3e, 0xff, 0xff, 0x39, 0xd0, - 0xff, 0xbd, 0x08, 0x00, 0x31, 0xdb, 0xff, 0xb5, 0xf5, 0xff, 0xc6, 0x2a, 0x00, 0xd6, 0x68, 0xff, - 0x0b, 0xc2, 0xfe, 0x37, 0xd0, 0xfe, 0xae, 0x50, 0x0b, 0x0e, 0x49, 0x0d, 0x0c, 0x68, 0x05, 0xc2, - 0x7f, 0x0a, 0x40, 0xc5, 0x09, 0x4f, 0x4d, 0x01, 0xcf, 0xc1, 0x01, 0xec, 0xcd, 0x00, 0x67, 0xf8, - 0xff, 0x20, 0x48, 0x02, 0xef, 0x67, 0x02, 0x94, 0xc4, 0x00, 0x5f, 0xa7, 0x00, 0x26, 0xe1, 0x03, - 0xc0, 0x81, 0x04, 0x52, 0xb0, 0x02, 0x1e, 0x5a, 0x02, 0x70, 0xd8, 0x02, 0x64, 0x7b, 0x02, 0xb1, - 0x74, 0x00, 0x7d, 0x28, 0x00, 0x41, 0xa6, 0x00, 0xe3, 0x45, 0x00, 0x92, 0x2a, 0x00, 0x30, 0x5e, - 0xff, 0xdf, 0x1f, 0xff, 0xfc, 0x7b, 0xff, 0xd4, 0x8f, 0xff, 0x7b, 0xcb, 0xff, 0x1e, 0x5a, 0xff, - 0x1d, 0x9d, 0xfe, 0xc8, 0x73, 0xfe, 0xcf, 0xc9, 0x0a, 0xac, 0x04, 0x0e, 0xce, 0xdc, 0x05, 0x8f, - 0xb6, 0x07, 0x35, 0xc9, 0x08, 0x8f, 0x19, 0x03, 0xd5, 0x2f, 0x02, 0xe3, 0x07, 0x01, 0x30, 0x41, - 0x00, 0x35, 0xe5, 0x02, 0xa4, 0x4e, 0x04, 0xa1, 0x10, 0x03, 0x51, 0xb5, 0x02, 0x96, 0x6d, 0x04, - 0x4b, 0x4b, 0x04, 0x38, 0x4b, 0x02, 0xdc, 0x40, 0x00, 0x91, 0x04, 0x00, 0x8d, 0x51, 0x01, 0xc8, - 0x29, 0x01, 0x86, 0x9f, 0x00, 0xcd, 0xea, 0xff, 0x43, 0x0f, 0xff, 0x8e, 0x11, 0xff, 0xdf, 0x0c, - 0xff, 0xd8, 0x30, 0xff, 0xac, 0x3d, 0xff, 0x2b, 0x3f, 0xff, 0xef, 0x1f, 0xff, 0x88, 0x9d, 0xfe, - 0x24, 0xca, 0xfe, 0x98, 0xa5, 0xfe, 0xee, 0xab, 0x08, 0x54, 0x29, 0x0c, 0xbc, 0x04, 0x07, 0x62, - 0xcd, 0x08, 0xdd, 0x3b, 0x09, 0x3c, 0x8a, 0x03, 0x76, 0x3e, 0x02, 0x44, 0x6b, 0x02, 0x41, 0xf7, - 0x02, 0x24, 0x64, 0x05, 0x3b, 0x93, 0x05, 0x28, 0xf3, 0x03, 0x14, 0xe9, 0x02, 0xae, 0x29, 0x02, - 0x8e, 0x34, 0x01, 0x10, 0x33, 0x00, 0x18, 0x11, 0x00, 0xe8, 0x1d, 0x01, 0x5c, 0xa8, 0x01, 0x31, - 0x79, 0x00, 0xbf, 0xf0, 0xfe, 0xfd, 0x33, 0xff, 0xb7, 0xb2, 0xff, 0x86, 0x98, 0xfe, 0xb0, 0x34, - 0xfe, 0x11, 0xbc, 0xfe, 0x61, 0x08, 0xff, 0x87, 0x2b, 0xff, 0x80, 0xdd, 0xfe, 0x1e, 0xf7, 0xfe, - 0xbe, 0x01, 0xff, 0x7a, 0x95, 0xfe, 0x10, 0x54, 0x09, 0xbd, 0x7b, 0x0e, 0xb6, 0x85, 0x08, 0xe3, - 0xae, 0x06, 0x7f, 0xda, 0x06, 0x3d, 0x0d, 0x05, 0xc6, 0xde, 0x06, 0xc5, 0x16, 0x07, 0x60, 0xae, - 0x04, 0x3c, 0xfe, 0x03, 0xcf, 0x41, 0x03, 0x5e, 0x09, 0x01, 0x81, 0xb8, 0xff, 0x4e, 0x35, 0x00, - 0xf8, 0x00, 0x01, 0xea, 0x97, 0x01, 0x25, 0xd5, 0x00, 0xdd, 0x7c, 0xff, 0x6c, 0xfc, 0xff, 0x1f, - 0x39, 0x00, 0xe7, 0x08, 0xff, 0x66, 0xb5, 0xfe, 0x8f, 0x77, 0xfe, 0x3e, 0xbc, 0xfd, 0xd3, 0x4c, - 0xfe, 0xdb, 0x41, 0xff, 0x8d, 0x25, 0xff, 0x43, 0xd9, 0xfe, 0xd9, 0x17, 0xff, 0xcf, 0x68, 0xff, - 0xfa, 0x05, 0xff, 0xc6, 0x4b, 0xfe, 0xab, 0xe5, 0x09, 0x47, 0x72, 0x0e, 0xdc, 0x77, 0x09, 0x70, - 0x84, 0x0a, 0xf3, 0xb2, 0x0a, 0x4e, 0x69, 0x07, 0xa7, 0xe8, 0x07, 0x8e, 0xe5, 0x05, 0x5f, 0x56, - 0x01, 0xe3, 0xf9, 0xff, 0x2a, 0x86, 0x00, 0x3d, 0x32, 0x00, 0xa3, 0x3d, 0x00, 0x46, 0x9b, 0x00, - 0xaf, 0x72, 0x00, 0x7c, 0x03, 0x01, 0x5b, 0x24, 0x00, 0x2b, 0xee, 0xfe, 0xe4, 0xd7, 0xff, 0x6a, - 0x7d, 0xff, 0xad, 0x38, 0xfe, 0xba, 0x45, 0xfe, 0xec, 0x03, 0xfe, 0x56, 0xaf, 0xfd, 0xc5, 0x98, - 0xfe, 0xb1, 0x88, 0xff, 0xad, 0x6a, 0xff, 0xac, 0xf5, 0xfe, 0x34, 0xf6, 0xfe, 0xd8, 0x39, 0xff, - 0x3c, 0xf5, 0xfe, 0xa9, 0x6b, 0xfe, 0x03, 0x81, 0x0b, 0x04, 0x2e, 0x12, 0x58, 0x1a, 0x0f, 0x1d, - 0x8a, 0x0e, 0xc3, 0x1b, 0x0a, 0xf7, 0xa0, 0x04, 0x75, 0x5b, 0x03, 0xd6, 0x09, 0x01, 0x40, 0xc8, - 0xff, 0x41, 0x21, 0x00, 0xb2, 0xcc, 0x00, 0xce, 0x40, 0x00, 0x15, 0x5d, 0xff, 0xc7, 0xb3, 0xff, - 0x61, 0x05, 0x00, 0x42, 0xde, 0x00, 0x50, 0xe7, 0xff, 0xbd, 0x81, 0xfe, 0x37, 0x1b, 0xff, 0x70, - 0x89, 0xfe, 0xb1, 0xcf, 0xfd, 0x3e, 0x0a, 0xfe, 0x89, 0x3b, 0xfe, 0x90, 0xa4, 0xfe, 0xc1, 0xdd, - 0xfe, 0x6f, 0xf5, 0xfe, 0xbe, 0x05, 0xff, 0x82, 0x49, 0xff, 0x71, 0x68, 0xff, 0x21, 0xfa, 0xfe, - 0xd7, 0x94, 0xfe, 0x0e, 0x49, 0xfe, 0x3e, 0xd2, 0x0d, 0xb5, 0xba, 0x18, 0xd9, 0x3d, 0x14, 0x1f, - 0xc6, 0x0a, 0xea, 0x53, 0x02, 0x51, 0xb2, 0x00, 0xbd, 0x85, 0x03, 0xd0, 0xfe, 0x03, 0xbd, 0xa4, - 0x01, 0xb0, 0x1f, 0xfe, 0x01, 0x7d, 0xfe, 0xed, 0x0f, 0x00, 0xf7, 0x3c, 0x00, 0xaa, 0x11, 0x00, - 0xe3, 0x15, 0xff, 0xb3, 0xe2, 0xff, 0x7d, 0xff, 0xff, 0xd9, 0x8d, 0xfe, 0xef, 0x65, 0xfe, 0x85, - 0x16, 0xfe, 0x09, 0x4a, 0xfe, 0x2b, 0xb8, 0xfe, 0x3b, 0x5a, 0xfe, 0xc2, 0x65, 0xfe, 0x7b, 0x89, - 0xfe, 0x9b, 0x12, 0xff, 0x99, 0x44, 0xff, 0xb3, 0x14, 0xff, 0x90, 0x6a, 0xff, 0x53, 0xfd, 0xfe, - 0x22, 0x82, 0xfe, 0xf1, 0x55, 0xfe, 0x3e, 0xd0, 0x0e, 0xde, 0x14, 0x19, 0x61, 0x3a, 0x0f, 0x84, - 0xb3, 0x05, 0x06, 0x17, 0x03, 0xab, 0x43, 0x04, 0x08, 0x8c, 0x07, 0x46, 0x19, 0x05, 0x0f, 0xa6, - 0xff, 0x75, 0x12, 0xfe, 0x67, 0x7a, 0x00, 0x7d, 0x11, 0x00, 0xc3, 0x6a, 0xfe, 0x9b, 0x15, 0x00, - 0xdc, 0xb0, 0xff, 0x9c, 0x05, 0xff, 0x9e, 0x81, 0xff, 0xeb, 0x7c, 0xfe, 0x7c, 0x91, 0xfe, 0xb1, - 0xf2, 0xfe, 0xdb, 0x63, 0xfe, 0x3e, 0x5a, 0xfe, 0xa9, 0xa7, 0xfe, 0xd2, 0x4d, 0xfe, 0xa0, 0x0e, - 0xfe, 0xe8, 0xfb, 0xfe, 0x43, 0x51, 0xff, 0x6e, 0xef, 0xfe, 0x80, 0x1a, 0xff, 0x8a, 0xf5, 0xfe, - 0x3d, 0xa8, 0xfe, 0x4b, 0xa5, 0xfe, 0x8c, 0xfd, 0x08, 0x82, 0xe0, 0x0d, 0x7d, 0x6c, 0x08, 0x22, - 0x26, 0x07, 0x37, 0xfb, 0x08, 0x3a, 0xd4, 0x08, 0xd7, 0x0d, 0x09, 0xfa, 0x7c, 0x06, 0x43, 0xa8, - 0x02, 0x91, 0x33, 0x02, 0x53, 0xba, 0x02, 0x51, 0x1e, 0x01, 0x1f, 0x51, 0xff, 0x49, 0xe4, 0xfe, - 0x5d, 0x7f, 0xff, 0x0f, 0x0e, 0x00, 0x62, 0xf0, 0xfe, 0x12, 0x3d, 0xfe, 0x62, 0x05, 0xff, 0x28, - 0x24, 0xff, 0x2b, 0x31, 0xff, 0xcb, 0x16, 0xff, 0x1a, 0x38, 0xfe, 0xcb, 0x56, 0xfe, 0x96, 0xd8, - 0xfe, 0x31, 0x80, 0xfe, 0xac, 0x64, 0xfe, 0xed, 0xe9, 0xfe, 0xe2, 0xf7, 0xfe, 0xa7, 0x9c, 0xfe, - 0x50, 0x0c, 0xff, 0xb3, 0x50, 0xff, 0xc7, 0x15, 0x07, 0x60, 0x1a, 0x0a, 0x8e, 0x1d, 0x05, 0x52, - 0x69, 0x04, 0xe3, 0x48, 0x07, 0xaa, 0x3d, 0x08, 0xa1, 0x5d, 0x07, 0x49, 0x3f, 0x05, 0x63, 0x15, - 0x05, 0x32, 0x48, 0x06, 0xc2, 0xbf, 0x05, 0x2b, 0x0b, 0x04, 0x32, 0x48, 0x02, 0xcd, 0x48, 0x01, - 0x35, 0xf9, 0x00, 0x08, 0xd9, 0xff, 0x65, 0xae, 0xfe, 0x62, 0xf3, 0xfe, 0x2f, 0x08, 0xff, 0xd3, - 0x44, 0xfe, 0x2b, 0xec, 0xfe, 0x13, 0x9a, 0xff, 0x22, 0xb0, 0xfe, 0xce, 0xe1, 0xfe, 0x6d, 0x4b, - 0xff, 0x42, 0xa5, 0xfe, 0x8e, 0xa6, 0xfe, 0x62, 0xeb, 0xfe, 0xb8, 0xb6, 0xfe, 0xe7, 0x4a, 0xfe, - 0x07, 0x78, 0xfe, 0xf1, 0xfa, 0xfe, 0x6b, 0xc5, 0x07, 0xfc, 0x03, 0x0b, 0x93, 0xad, 0x05, 0x95, - 0xb5, 0x04, 0xc3, 0xa6, 0x06, 0x48, 0xd1, 0x05, 0xe1, 0xcf, 0x03, 0xa7, 0x2d, 0x02, 0x40, 0x01, - 0x03, 0xb1, 0x84, 0x05, 0xf8, 0x3a, 0x06, 0x05, 0xd4, 0x04, 0x7f, 0xe3, 0x03, 0x84, 0xab, 0x03, - 0x83, 0x2b, 0x03, 0xc0, 0xd0, 0x01, 0x93, 0xf7, 0xff, 0xd9, 0x32, 0xff, 0x61, 0x1d, 0xff, 0x2a, - 0xf7, 0xfe, 0x31, 0xe5, 0xfe, 0x71, 0x9b, 0xfe, 0xcd, 0x79, 0xfe, 0x40, 0x03, 0xff, 0x99, 0x74, - 0xff, 0xa0, 0x06, 0xff, 0xcf, 0xbf, 0xfe, 0x93, 0x11, 0xff, 0x61, 0xac, 0xfe, 0xf5, 0x4e, 0xfe, - 0xe0, 0xc5, 0xfe, 0x20, 0xa5, 0xfe, 0xc7, 0xcc, 0x08, 0x29, 0x17, 0x0c, 0xa7, 0xd8, 0x04, 0xc0, - 0xed, 0x03, 0x03, 0xfa, 0x06, 0x47, 0xdd, 0x05, 0xa2, 0xd6, 0x02, 0x44, 0x20, 0x00, 0x73, 0x5a, - 0x01, 0x7b, 0x72, 0x04, 0xbe, 0x38, 0x04, 0x43, 0xbf, 0x02, 0xae, 0xf4, 0x03, 0x84, 0x4e, 0x05, - 0x11, 0xcf, 0x04, 0x62, 0xcb, 0x03, 0x69, 0xea, 0x01, 0xba, 0xc2, 0x00, 0xd1, 0x6a, 0x00, 0x9b, - 0x3f, 0xff, 0xe6, 0x0d, 0xff, 0xa8, 0x37, 0xff, 0x25, 0x46, 0xfe, 0xcc, 0x86, 0xfe, 0xb3, 0x64, - 0xff, 0xc2, 0x02, 0xff, 0xf5, 0x3a, 0xff, 0x57, 0xc1, 0xff, 0x71, 0xf1, 0xfe, 0x8f, 0x75, 0xfe, - 0x66, 0xde, 0xfe, 0x68, 0x92, 0xfe, 0x81, 0xb2, 0x09, 0x92, 0x06, 0x0e, 0x12, 0xd0, 0x05, 0x4f, - 0xb6, 0x03, 0x27, 0xdb, 0x06, 0xbf, 0x03, 0x05, 0xeb, 0x66, 0x01, 0x24, 0x16, 0x00, 0xe2, 0x6f, - 0x02, 0xa6, 0xf0, 0x03, 0xf6, 0xdb, 0x01, 0xb4, 0xd5, 0x00, 0x89, 0x2c, 0x02, 0xc9, 0xf6, 0x02, - 0x2a, 0xb7, 0x03, 0x3d, 0x97, 0x04, 0x4f, 0x6a, 0x03, 0xb6, 0x2c, 0x02, 0xa8, 0xcb, 0x01, 0x88, - 0xc7, 0x00, 0xa9, 0x63, 0x00, 0x83, 0xd2, 0xff, 0xe4, 0x97, 0xfe, 0x6d, 0xe1, 0xfe, 0x3c, 0x1c, - 0xff, 0xb5, 0x79, 0xfe, 0xc8, 0x1e, 0xff, 0x38, 0xc3, 0xff, 0xa1, 0x2c, 0xff, 0xb5, 0xee, 0xfe, - 0x8d, 0x0a, 0xff, 0x88, 0x9c, 0xfe, 0xc8, 0x57, 0x0a, 0x67, 0xf7, 0x0e, 0xd6, 0x74, 0x06, 0x89, - 0x4f, 0x04, 0x69, 0xfd, 0x07, 0x1b, 0x72, 0x05, 0xa2, 0x86, 0xff, 0x5f, 0x83, 0xfe, 0xd8, 0x2c, - 0x03, 0xf1, 0x65, 0x04, 0x27, 0x25, 0x01, 0xb1, 0x5c, 0x00, 0xab, 0x80, 0x01, 0x31, 0x6b, 0x01, - 0xb0, 0xac, 0x01, 0x83, 0x4c, 0x02, 0x3c, 0xdc, 0x01, 0x32, 0x57, 0x02, 0xb7, 0x2f, 0x03, 0x0c, - 0x56, 0x02, 0x0b, 0x4b, 0x01, 0xb8, 0xe9, 0x00, 0x94, 0x62, 0x00, 0x4a, 0xa3, 0xff, 0x28, 0x16, - 0xff, 0xda, 0xf0, 0xfe, 0x13, 0x0d, 0xff, 0xc9, 0x20, 0xff, 0x51, 0x18, 0xff, 0xbe, 0x09, 0xff, - 0x7f, 0x16, 0xff, 0x06, 0x06, 0xff, 0x23, 0x93, 0x0b, 0xf9, 0xac, 0x10, 0xe6, 0x47, 0x07, 0xd0, - 0x3e, 0x04, 0x5c, 0xdf, 0x07, 0x23, 0x7f, 0x05, 0x1f, 0x85, 0xfe, 0x24, 0xe7, 0xfd, 0x55, 0x14, - 0x04, 0xa8, 0xdd, 0x03, 0xbf, 0x9c, 0xff, 0x13, 0x2b, 0x00, 0x7c, 0xe3, 0x01, 0x60, 0x58, 0x01, - 0x20, 0xae, 0x00, 0x46, 0x1c, 0x01, 0x2d, 0x9b, 0x00, 0x8e, 0xe2, 0xff, 0x32, 0x01, 0x01, 0xad, - 0x43, 0x02, 0x1b, 0x65, 0x02, 0x99, 0xd8, 0x01, 0x2b, 0x38, 0x01, 0xcf, 0xd4, 0x00, 0xf1, 0x3c, - 0x00, 0xa7, 0x84, 0xff, 0x9c, 0x45, 0xff, 0x5d, 0x66, 0xff, 0x1e, 0x27, 0xff, 0x87, 0xa2, 0xfe, - 0xca, 0x9b, 0xfe, 0xf6, 0xea, 0xfe, 0xdd, 0xa8, 0x0c, 0xe8, 0x76, 0x12, 0x16, 0x3e, 0x08, 0xec, - 0x1d, 0x04, 0x82, 0x0b, 0x08, 0xb0, 0xf0, 0x05, 0x89, 0x7d, 0xfd, 0xc2, 0x28, 0xfd, 0x84, 0xe6, - 0x04, 0x6f, 0xb2, 0x03, 0xf9, 0x82, 0xfe, 0x56, 0xe5, 0xff, 0xba, 0x2b, 0x02, 0xf6, 0x41, 0x01, - 0xfb, 0x51, 0x00, 0x07, 0xec, 0x00, 0xfe, 0x30, 0x00, 0xd2, 0x3e, 0xff, 0x13, 0xdb, 0xff, 0x3c, - 0x1e, 0x00, 0x35, 0x91, 0x00, 0x0c, 0x4e, 0x01, 0x27, 0xd4, 0x01, 0x00, 0x29, 0x02, 0xbb, 0x35, - 0x01, 0x2c, 0x61, 0x00, 0x65, 0x79, 0x00, 0x67, 0x17, 0x00, 0xd4, 0x75, 0xff, 0xc0, 0x16, 0xff, - 0x98, 0xd7, 0xfe, 0x6a, 0x84, 0xfe, 0x04, 0x91, 0x0e, 0xf1, 0xf3, 0x14, 0x03, 0x86, 0x08, 0xc1, - 0x5e, 0x03, 0x56, 0xef, 0x07, 0x44, 0xee, 0x05, 0x65, 0xd8, 0xfc, 0xa3, 0x26, 0xfd, 0x7e, 0x8e, - 0x05, 0xee, 0xad, 0x02, 0x26, 0x1c, 0xfd, 0x92, 0xfb, 0xff, 0xb3, 0x99, 0x02, 0x02, 0x4e, 0x01, - 0x41, 0xd4, 0xff, 0xbe, 0x60, 0x00, 0x03, 0x10, 0x00, 0xfe, 0x08, 0xff, 0x26, 0x6f, 0xff, 0xd6, - 0x95, 0xff, 0xd4, 0xb3, 0xff, 0x04, 0x86, 0xff, 0x47, 0xaf, 0xff, 0xbb, 0x54, 0x01, 0x0d, 0xdd, - 0x01, 0x99, 0x77, 0x01, 0x80, 0x26, 0x01, 0xa0, 0xa7, 0x00, 0x4c, 0x70, 0x00, 0xfc, 0xda, 0xff, - 0xd0, 0x1b, 0xff, 0x13, 0xa5, 0xfe, 0x85, 0x1a, 0x10, 0x37, 0xf1, 0x16, 0x7f, 0x18, 0x09, 0xf8, - 0x52, 0x03, 0x37, 0x34, 0x08, 0x2d, 0xac, 0x05, 0xe7, 0xa9, 0xfb, 0x5f, 0x5b, 0xfd, 0xd1, 0xd7, - 0x06, 0xa9, 0xf1, 0x01, 0x19, 0x7b, 0xfb, 0xec, 0xab, 0xff, 0x68, 0xe1, 0x02, 0xf0, 0x5c, 0x01, - 0xdd, 0xe5, 0xff, 0x88, 0x2a, 0x00, 0xbc, 0x8e, 0xff, 0x82, 0xcf, 0xfe, 0x9c, 0x48, 0xff, 0xbe, - 0x79, 0xff, 0xf6, 0x7f, 0xff, 0xdf, 0x03, 0xff, 0x9f, 0xc0, 0xfe, 0xbd, 0xad, 0xff, 0x7f, 0x2f, - 0x00, 0x75, 0xab, 0x00, 0xaa, 0x84, 0x01, 0x83, 0x77, 0x01, 0xc6, 0x05, 0x01, 0x8f, 0xa0, 0x00, - 0xfc, 0x0b, 0x00, 0x7e, 0x42, 0xff, 0x33, 0x12, 0x12, 0xad, 0x12, 0x19, 0xeb, 0x25, 0x09, 0xd5, - 0x78, 0x03, 0xe2, 0xed, 0x08, 0xfe, 0xea, 0x04, 0xce, 0x5d, 0xfa, 0xd6, 0x45, 0xfe, 0x91, 0x45, - 0x08, 0xb4, 0xe9, 0x00, 0x5f, 0x03, 0xfa, 0x11, 0xaa, 0xff, 0x2b, 0x3f, 0x03, 0xf6, 0x5a, 0x01, - 0x96, 0xbb, 0xff, 0x81, 0x04, 0x00, 0x27, 0x87, 0xff, 0x5f, 0xcd, 0xfe, 0x34, 0xfd, 0xfe, 0xb9, - 0x6a, 0xff, 0xd5, 0x9a, 0xff, 0x41, 0xd3, 0xfe, 0x25, 0x91, 0xfe, 0x81, 0x37, 0xff, 0xd7, 0x70, - 0xff, 0x1a, 0x9b, 0xff, 0x2f, 0x07, 0x00, 0x1e, 0xa1, 0x00, 0x7f, 0x44, 0x01, 0x2d, 0x40, 0x01, - 0x64, 0x9b, 0x00, 0x2b, 0xec, 0xff, 0xbd, 0x48, 0x14, 0x0b, 0x10, 0x1b, 0x41, 0xbd, 0x08, 0xe2, - 0xfe, 0x03, 0xb4, 0xee, 0x09, 0x8f, 0x72, 0x03, 0xe2, 0xb9, 0xf8, 0xd5, 0x85, 0xff, 0x9f, 0xad, - 0x09, 0x7c, 0xbb, 0xff, 0x1b, 0xb4, 0xf8, 0x9d, 0x59, 0xff, 0x06, 0x4b, 0x03, 0xfe, 0x8a, 0x01, - 0xe4, 0x89, 0xff, 0x45, 0xca, 0xff, 0x7a, 0x4c, 0xff, 0x5d, 0x84, 0xfe, 0x0f, 0x9d, 0xfe, 0x2f, - 0x5f, 0xff, 0xc1, 0xe6, 0xff, 0xe1, 0x78, 0xfe, 0x54, 0x79, 0xfe, 0xd2, 0x09, 0xff, 0xc0, 0x8b, - 0xfe, 0xbb, 0x88, 0xff, 0xea, 0xed, 0xff, 0xcb, 0x59, 0xff, 0xf5, 0x97, 0xff, 0xac, 0x2f, 0x00, - 0x62, 0x9c, 0x00, 0x24, 0x90, 0x00, 0x8a, 0xc6, 0x16, 0x20, 0x39, 0x1d, 0x98, 0x24, 0x08, 0xcf, - 0x50, 0x04, 0x5a, 0xda, 0x0a, 0x4d, 0x0e, 0x02, 0xf2, 0x51, 0xf7, 0x07, 0xbd, 0x00, 0x7d, 0xb1, - 0x0a, 0xed, 0x8b, 0xfe, 0x26, 0xeb, 0xf7, 0xba, 0x32, 0xff, 0xfa, 0xfb, 0x02, 0xf8, 0x79, 0x01, - 0x53, 0x51, 0xff, 0x5a, 0x0b, 0x00, 0xc0, 0x66, 0xff, 0x65, 0xb0, 0xfd, 0x4a, 0x20, 0xfe, 0x7b, - 0x55, 0xff, 0xd4, 0x0d, 0x00, 0xc4, 0x91, 0xfe, 0x54, 0x47, 0xfe, 0xfc, 0xd5, 0xfe, 0x1e, 0x2b, - 0xfe, 0x15, 0x61, 0xff, 0xd6, 0xe9, 0xff, 0x2a, 0x0b, 0xff, 0x1a, 0x09, 0xff, 0xe7, 0xf3, 0xfe, - 0x08, 0x40, 0xff, 0xe6, 0xbf, 0xff, 0x30, 0xc1, 0x18, 0x90, 0x56, 0x1f, 0xa1, 0x79, 0x08, 0xc9, - 0x83, 0x04, 0xb9, 0x68, 0x0b, 0xbf, 0x7c, 0x01, 0x03, 0xde, 0xf5, 0xc8, 0x5d, 0x01, 0x48, 0x69, - 0x0c, 0x48, 0xbc, 0xfd, 0x46, 0xb6, 0xf6, 0x4a, 0x71, 0xff, 0xa5, 0xd8, 0x02, 0x74, 0x3f, 0x01, - 0x11, 0x65, 0xff, 0x6c, 0xe7, 0xff, 0x3b, 0xb4, 0xff, 0xbe, 0xc6, 0xfd, 0x61, 0x61, 0xfd, 0x46, - 0x2f, 0xff, 0x01, 0x5c, 0x00, 0x80, 0x27, 0xfe, 0x65, 0x29, 0xfe, 0x3f, 0x85, 0xff, 0xb0, 0x17, - 0xfe, 0x93, 0xd5, 0xfe, 0xcb, 0xfe, 0xff, 0xaa, 0x03, 0xff, 0x78, 0xe2, 0xfe, 0x4d, 0xec, 0xfe, - 0x94, 0x81, 0xfe, 0x47, 0x6f, 0xfe, 0x1f, 0x72, 0x1a, 0x69, 0x36, 0x21, 0x61, 0xc0, 0x08, 0x35, - 0x42, 0x05, 0xf6, 0x72, 0x0c, 0xc8, 0xfc, 0xff, 0x11, 0xff, 0xf3, 0x90, 0x81, 0x02, 0x3a, 0xc2, - 0x0d, 0xe0, 0xe3, 0xfc, 0x34, 0xc0, 0xf5, 0xd0, 0x46, 0xff, 0x43, 0xbc, 0x02, 0x52, 0x06, 0x01, - 0x79, 0x1a, 0xff, 0x57, 0xb6, 0xff, 0xe8, 0xea, 0xff, 0xde, 0xda, 0xfd, 0x0b, 0xd3, 0xfc, 0x7b, - 0xe4, 0xfe, 0xaa, 0x70, 0x00, 0xed, 0xd1, 0xfd, 0xfb, 0xbd, 0xfd, 0x73, 0x8c, 0xff, 0xbf, 0x5e, - 0xfe, 0x06, 0xab, 0xfe, 0x54, 0x94, 0xff, 0x75, 0x38, 0xff, 0x9f, 0xfa, 0xfe, 0x9e, 0x5f, 0xfe, - 0x97, 0x05, 0xfe, 0x56, 0x0a, 0xfe, 0x0e, 0xf8, 0x1b, 0x6b, 0x5c, 0x23, 0x37, 0x89, 0x09, 0x41, - 0x22, 0x05, 0x9d, 0x10, 0x0d, 0x7a, 0xec, 0xff, 0xb8, 0x95, 0xf2, 0x72, 0x9c, 0x02, 0xae, 0xae, - 0x0e, 0xb8, 0xc6, 0xfc, 0x11, 0x43, 0xf5, 0x8d, 0xfe, 0xfe, 0x82, 0xb4, 0x02, 0x67, 0x9e, 0x00, - 0x6e, 0xeb, 0xfe, 0xe0, 0xcd, 0xff, 0x93, 0xdb, 0xff, 0x14, 0x42, 0xfe, 0x91, 0x79, 0xfc, 0xd3, - 0x11, 0xfe, 0x0b, 0xf3, 0x00, 0x15, 0x31, 0xfe, 0xb5, 0x04, 0xfd, 0xe5, 0x27, 0xff, 0xbb, 0x77, - 0xfe, 0xb8, 0xd5, 0xfe, 0x29, 0x9d, 0xff, 0xd3, 0x20, 0xff, 0x5e, 0x10, 0xff, 0x90, 0x23, 0xfe, - 0x7c, 0xaa, 0xfd, 0x96, 0xf6, 0xfd, 0x93, 0xfb, 0x1c, 0x27, 0x17, 0x26, 0xef, 0x1b, 0x0b, 0x35, - 0xa1, 0x03, 0xd1, 0xe8, 0x0c, 0x11, 0xa8, 0x01, 0xc8, 0xd4, 0xf1, 0x69, 0x1e, 0x01, 0xda, 0xba, - 0x0e, 0x66, 0x71, 0xfd, 0xdd, 0x9e, 0xf5, 0x5e, 0x1f, 0xfe, 0x33, 0x3d, 0x02, 0x36, 0xbb, 0x00, - 0xa8, 0x78, 0xfe, 0x16, 0xd7, 0xff, 0x59, 0x05, 0x00, 0x00, 0x45, 0xfe, 0x52, 0x66, 0xfc, 0x69, - 0x7b, 0xfd, 0x7c, 0xc5, 0x00, 0xb4, 0xb5, 0xfe, 0x62, 0x0b, 0xfd, 0x2c, 0x50, 0xfe, 0x91, 0x25, - 0xfe, 0xd2, 0x57, 0xff, 0x02, 0x9a, 0xff, 0x25, 0x92, 0xfe, 0x5a, 0xfd, 0xfe, 0xdc, 0x5e, 0xfe, - 0x74, 0x99, 0xfd, 0x0c, 0xd4, 0xfd, 0x3f, 0xbd, 0x1d, 0x8c, 0xb3, 0x27, 0x5a, 0x29, 0x0d, 0x36, - 0x78, 0x03, 0x89, 0x17, 0x0c, 0xc1, 0x73, 0x03, 0x02, 0xc1, 0xf1, 0xea, 0xe0, 0xfe, 0x41, 0xa0, - 0x0e, 0x1a, 0x55, 0xfe, 0xa1, 0x0c, 0xf6, 0xb5, 0x95, 0xfd, 0xa1, 0x63, 0x01, 0xcd, 0xd1, 0x00, - 0xd1, 0x5d, 0xfe, 0xad, 0x72, 0xff, 0x57, 0x1d, 0x00, 0x82, 0x90, 0xfe, 0xdb, 0x5b, 0xfc, 0xbc, - 0xe8, 0xfc, 0x10, 0xa0, 0x00, 0xd3, 0xd3, 0xfe, 0x9d, 0xdb, 0xfc, 0xbc, 0x64, 0xfe, 0xdd, 0xed, - 0xfd, 0xb8, 0xdf, 0xfe, 0xe2, 0xaf, 0xff, 0xaa, 0x77, 0xfe, 0xe7, 0x73, 0xfe, 0x81, 0x9a, 0xfe, - 0xed, 0xcb, 0xfd, 0x0e, 0x01, 0xfd, 0xd5, 0xab, 0x1f, 0x35, 0xe9, 0x27, 0x01, 0x9e, 0x0d, 0xc3, - 0xa7, 0x05, 0x67, 0x37, 0x0c, 0xe9, 0x76, 0x03, 0x7f, 0x88, 0xf1, 0x73, 0x2a, 0xfe, 0xaa, 0x43, - 0x0e, 0x09, 0x12, 0xfe, 0x28, 0x2a, 0xf7, 0x95, 0x88, 0xfd, 0x63, 0x4d, 0x00, 0x77, 0x12, 0x01, - 0xea, 0x59, 0xfe, 0xf3, 0xc6, 0xfe, 0x74, 0x38, 0x00, 0x99, 0x77, 0xff, 0x55, 0x75, 0xfc, 0xca, - 0x17, 0xfc, 0x75, 0x67, 0x00, 0xc5, 0x43, 0xff, 0x3d, 0xd7, 0xfc, 0x62, 0x35, 0xfe, 0x62, 0xee, - 0xfd, 0xa2, 0x94, 0xfe, 0xe1, 0x80, 0xff, 0x08, 0x98, 0xfe, 0x21, 0x7c, 0xfe, 0x48, 0x2d, 0xfe, - 0xdc, 0x79, 0xfd, 0x86, 0xcb, 0xfc, 0xdc, 0xcf, 0x22, 0x9c, 0x0b, 0x27, 0x22, 0xc1, 0x0b, 0x3f, - 0x7d, 0x09, 0x0c, 0x0b, 0x0e, 0xa9, 0xad, 0x01, 0xb9, 0xa6, 0xf0, 0xbe, 0x17, 0xff, 0x54, 0x53, - 0x0d, 0xb9, 0x3d, 0xfc, 0xf1, 0x09, 0xf9, 0x7e, 0x29, 0xfe, 0x9d, 0xe4, 0xfe, 0x37, 0xce, 0x00, - 0xe8, 0x49, 0xfe, 0x6a, 0x62, 0xfe, 0x14, 0xd6, 0xff, 0xad, 0x67, 0x00, 0xe0, 0xcc, 0xfc, 0x98, - 0x09, 0xfb, 0x63, 0xf8, 0xff, 0x8c, 0xd7, 0xff, 0x56, 0x30, 0xfd, 0xdc, 0x4f, 0xfd, 0xa9, 0xc6, - 0xfd, 0xd7, 0xd4, 0xfe, 0xc1, 0x08, 0xff, 0x5e, 0x9e, 0xfe, 0x99, 0x8f, 0xfe, 0x35, 0x9b, 0xfd, - 0x98, 0xab, 0xfc, 0x93, 0x16, 0xfd, 0x84, 0xd5, 0x24, 0x1b, 0xdd, 0x25, 0xff, 0x67, 0x0a, 0x8e, - 0xe3, 0x0c, 0x24, 0x8c, 0x11, 0x5e, 0x81, 0x01, 0x25, 0xa3, 0xed, 0xee, 0x3c, 0x00, 0xef, 0x3b, - 0x0e, 0x98, 0x91, 0xf8, 0x8d, 0x4e, 0xfa, 0xb7, 0x0e, 0x01, 0x18, 0xa6, 0xfd, 0xa4, 0xed, 0xfe, - 0x31, 0xba, 0xfe, 0xab, 0x01, 0xff, 0xc9, 0x4d, 0xfe, 0xfe, 0xa6, 0x01, 0x4a, 0x12, 0xfe, 0xa6, - 0x4d, 0xf9, 0x8d, 0xea, 0xff, 0x80, 0x7a, 0x00, 0xe0, 0x69, 0xfd, 0xcd, 0xf2, 0xfc, 0xf1, 0x48, - 0xfd, 0x81, 0x2a, 0xff, 0xad, 0xdd, 0xfe, 0x88, 0x73, 0xfe, 0xff, 0x58, 0xfe, 0xed, 0x65, 0xfd, - 0xee, 0xc4, 0xfc, 0x2a, 0xeb, 0xfc, 0x0a, 0x86, 0x27, 0x9d, 0xfd, 0x23, 0x1b, 0x23, 0x06, 0xd2, - 0xc4, 0x12, 0x91, 0x9a, 0x17, 0xb7, 0x6b, 0xfd, 0xf8, 0xed, 0xea, 0x55, 0x13, 0x05, 0x1c, 0x14, - 0x0e, 0x9d, 0x45, 0xf2, 0x9a, 0xb8, 0xfb, 0xb1, 0x31, 0x05, 0x24, 0x05, 0xfd, 0xb8, 0x39, 0xfd, - 0xbb, 0xc9, 0xfd, 0x80, 0xcb, 0xff, 0x2e, 0x9b, 0xfd, 0xb3, 0x6d, 0x01, 0x9d, 0x1e, 0x00, 0x8a, - 0x88, 0xf8, 0xa2, 0xb1, 0xfe, 0xd5, 0x06, 0x01, 0xee, 0xe5, 0xfd, 0x50, 0xe7, 0xfc, 0x7d, 0x24, - 0xfd, 0x90, 0x2a, 0xff, 0x58, 0x59, 0xfe, 0x7a, 0x4d, 0xfe, 0xab, 0x10, 0xfe, 0x49, 0xb7, 0xfd, - 0x7a, 0x6f, 0xfd, 0x18, 0x81, 0xfb, 0xaf, 0xd6, 0x2a, 0xb9, 0x9a, 0x24, 0x50, 0xa1, 0x00, 0x84, - 0x68, 0x14, 0x82, 0xd2, 0x1d, 0xb7, 0xec, 0xfb, 0x5a, 0x06, 0xe9, 0x29, 0x0d, 0x09, 0xfa, 0xc3, - 0x0d, 0x20, 0xce, 0xeb, 0x04, 0x2b, 0xfc, 0x64, 0x06, 0x0a, 0x98, 0xf7, 0xfc, 0x3d, 0x53, 0xfb, - 0x82, 0xaa, 0xfc, 0x30, 0xca, 0x00, 0xe6, 0x7d, 0xfd, 0xb4, 0xbc, 0xff, 0xf5, 0x0c, 0x02, 0x77, - 0x3f, 0xf9, 0x75, 0xc1, 0xfc, 0x7c, 0x54, 0x01, 0x68, 0xbb, 0xfe, 0xe6, 0xd2, 0xfc, 0x35, 0x0f, - 0xfd, 0x8d, 0x55, 0xff, 0xca, 0x32, 0xfe, 0x14, 0xb5, 0xfd, 0x20, 0xf0, 0xfd, 0xa8, 0xaf, 0xfd, - 0xb5, 0x8a, 0xfd, 0xba, 0x9c, 0xfb, 0x2c, 0x81, 0x2f, 0xb6, 0xc3, 0x26, 0x80, 0x6c, 0xfa, 0xf9, - 0xa7, 0x11, 0xf2, 0x7f, 0x23, 0x91, 0xc8, 0xfd, 0xf4, 0x36, 0xe7, 0xa1, 0x8f, 0x0b, 0x5b, 0x75, - 0x0d, 0xb8, 0x66, 0xe6, 0x3c, 0xb2, 0xfb, 0x90, 0x24, 0x0e, 0x6b, 0xeb, 0xfd, 0x6a, 0x45, 0xf9, - 0x07, 0x6f, 0xfb, 0xd1, 0xc7, 0x01, 0xd7, 0x17, 0xfe, 0x15, 0x72, 0xfd, 0xdc, 0x4e, 0x02, 0x1e, - 0x96, 0xfb, 0xc3, 0x25, 0xfb, 0x7a, 0x72, 0x00, 0x74, 0x2a, 0x00, 0x26, 0x98, 0xfc, 0x5b, 0x18, - 0xfd, 0x82, 0x19, 0x00, 0x5b, 0x9a, 0xfd, 0xee, 0x3b, 0xfd, 0xb8, 0x20, 0xfe, 0x47, 0xa8, 0xfc, - 0x44, 0x5f, 0xfd, 0x45, 0xce, 0xfc, 0x39, 0x8e, 0x34, 0xc8, 0x5f, 0x29, 0xaa, 0x24, 0xf4, 0xfb, - 0x06, 0x0e, 0x54, 0x85, 0x27, 0xbe, 0x28, 0x00, 0x81, 0x61, 0xe7, 0xff, 0x76, 0x0d, 0x98, 0x9f, - 0x0c, 0xc7, 0x19, 0xe2, 0x8e, 0x1e, 0xfa, 0xf1, 0x1a, 0x11, 0x58, 0x4d, 0x00, 0xa6, 0x87, 0xf7, - 0xd4, 0x9c, 0xf9, 0x7c, 0x9f, 0x02, 0xfa, 0xea, 0xfe, 0x84, 0xd1, 0xfb, 0x52, 0x14, 0x01, 0xb0, - 0xb5, 0xfd, 0x30, 0x47, 0xfb, 0xcb, 0x76, 0xfe, 0x99, 0x10, 0x01, 0x17, 0x37, 0xfd, 0x54, 0x19, - 0xfd, 0xca, 0x02, 0x01, 0xf5, 0x29, 0xfd, 0xde, 0xa6, 0xfc, 0xb5, 0xd2, 0xfd, 0x98, 0x01, 0xfc, - 0x45, 0x1c, 0xfd, 0x9a, 0xb4, 0xfc, 0xe9, 0xdd, 0x38, 0x7a, 0x85, 0x2c, 0x4e, 0x44, 0xf0, 0xe4, - 0x05, 0x08, 0xe1, 0xdf, 0x28, 0x4c, 0x4c, 0x05, 0xf4, 0xfe, 0xe7, 0x65, 0xb7, 0x0e, 0xac, 0xd7, - 0x0c, 0xaa, 0x1d, 0xde, 0x5c, 0xf8, 0xf7, 0x2d, 0x9b, 0x12, 0x63, 0x7c, 0x03, 0x4c, 0x02, 0xf7, - 0x55, 0x1e, 0xf7, 0x27, 0x2e, 0x03, 0x7a, 0xeb, 0xff, 0x5f, 0x11, 0xfb, 0x00, 0x03, 0xff, 0x0b, - 0xa8, 0xfe, 0xeb, 0x21, 0xfd, 0xf8, 0x6e, 0xfc, 0xaa, 0xe5, 0x00, 0xce, 0xc1, 0xfe, 0xc8, 0x12, - 0xfd, 0x8c, 0xde, 0x01, 0x25, 0x39, 0xfd, 0xb8, 0xb3, 0xfb, 0x31, 0x8c, 0xfd, 0xe1, 0x93, 0xfb, - 0x38, 0x56, 0xfc, 0xe6, 0x24, 0xfc, 0xc4, 0x9b, 0x3c, 0xb2, 0x23, 0x30, 0x05, 0x01, 0xee, 0x28, - 0x68, 0x01, 0xaa, 0xa4, 0x27, 0x6c, 0x8d, 0x0a, 0xf2, 0xcc, 0xe9, 0x46, 0x26, 0x10, 0x4c, 0x60, - 0x0d, 0x7c, 0x73, 0xda, 0x3e, 0xc5, 0xf5, 0xec, 0xd3, 0x12, 0x05, 0x65, 0x06, 0xa3, 0xae, 0xf7, - 0x02, 0xaf, 0xf4, 0x79, 0x0a, 0x03, 0x1e, 0xba, 0x00, 0x82, 0x41, 0xfb, 0xe1, 0xe6, 0xfc, 0x5d, - 0x07, 0xfe, 0x1e, 0x6a, 0xff, 0xde, 0x91, 0xfb, 0x11, 0xdf, 0xff, 0xec, 0x50, 0x00, 0x90, 0xd4, - 0xfd, 0x33, 0xe5, 0x01, 0xef, 0x2a, 0xfd, 0xd5, 0x83, 0xfb, 0xc5, 0x39, 0xfd, 0xfc, 0xae, 0xfa, - 0x4d, 0x88, 0xfb, 0x03, 0xdb, 0xfb, 0xf6, 0x12, 0x43, 0x2e, 0x4b, 0x31, 0xf7, 0x9a, 0xe9, 0x8d, - 0xfa, 0xfe, 0x09, 0xb3, 0x25, 0xc5, 0x18, 0x0a, 0x55, 0x00, 0xee, 0xec, 0x1c, 0x15, 0xaa, 0x5a, - 0x0a, 0x50, 0xe1, 0xd6, 0xd9, 0x1b, 0xf6, 0x40, 0x12, 0x12, 0x6b, 0xf4, 0x07, 0x07, 0x53, 0xf8, - 0x96, 0x69, 0xf3, 0x7d, 0xb5, 0x02, 0x90, 0xa3, 0x00, 0x60, 0xe1, 0xfb, 0xbd, 0x99, 0xfb, 0xb2, - 0x8e, 0xfc, 0xaf, 0x7b, 0x00, 0xd5, 0x33, 0xfc, 0x19, 0x14, 0xff, 0xf7, 0x20, 0x01, 0xd4, 0x9e, - 0xff, 0x5a, 0xf8, 0x00, 0xd6, 0x96, 0xfc, 0x40, 0x7b, 0xfc, 0xb0, 0x76, 0xfc, 0x01, 0xaf, 0xf9, - 0xc1, 0x26, 0xfb, 0xc9, 0x56, 0xfb, 0x83, 0x1c, 0x48, 0xf5, 0x98, 0x34, 0x31, 0x49, 0xe5, 0x8e, - 0x90, 0xfc, 0x23, 0xc8, 0x23, 0x2c, 0x1e, 0x08, 0x56, 0x26, 0xf2, 0x54, 0x14, 0x1a, 0x27, 0x5f, - 0x09, 0x6d, 0x4c, 0xd3, 0xa2, 0x72, 0xf5, 0x9f, 0x4a, 0x12, 0x59, 0x44, 0x08, 0x64, 0x4c, 0xf9, - 0x4b, 0x2c, 0xf3, 0xeb, 0xb0, 0x01, 0x52, 0x4a, 0x00, 0x20, 0x99, 0xfc, 0xcb, 0x4b, 0xfb, 0xc6, - 0xf3, 0xfa, 0x2d, 0x1c, 0x00, 0x7d, 0x6b, 0xfd, 0x62, 0x7a, 0xff, 0xee, 0xae, 0x01, 0x11, 0xd4, - 0x00, 0x1f, 0x0a, 0x00, 0x78, 0x99, 0xfc, 0xfa, 0x44, 0xfd, 0x31, 0xab, 0xfb, 0xb0, 0x6d, 0xf9, - 0x32, 0x8d, 0xfa, 0x0a, 0xad, 0xfa, 0x64, 0x37, 0x4e, 0x5a, 0x1d, 0x36, 0x69, 0xee, 0xe0, 0xa7, - 0x61, 0xfb, 0xcf, 0x34, 0x22, 0x47, 0xff, 0x03, 0xdd, 0xaf, 0xf4, 0xaa, 0xac, 0x20, 0xff, 0x29, - 0x08, 0x16, 0x86, 0xcf, 0x47, 0x55, 0xf5, 0x1b, 0xc1, 0x12, 0x84, 0xc4, 0x07, 0x47, 0x0c, 0xf9, - 0x3e, 0x5d, 0xf4, 0x0a, 0x89, 0x00, 0x6f, 0xa9, 0xfe, 0x14, 0x92, 0xfd, 0xf2, 0x6c, 0xfb, 0xfb, - 0xbd, 0xf9, 0xde, 0xb2, 0xfe, 0x58, 0xc9, 0xfd, 0x3e, 0x66, 0x01, 0x5f, 0x8a, 0x02, 0xa2, 0x35, - 0x00, 0x5f, 0x9e, 0xff, 0xd0, 0x6c, 0xfd, 0x08, 0x0c, 0xfd, 0x29, 0x2d, 0xfb, 0x09, 0x88, 0xf9, - 0xaa, 0x8b, 0xf9, 0xaf, 0x56, 0xfa, 0xca, 0x79, 0x52, 0xa2, 0xfc, 0x39, 0xd9, 0x71, 0xdd, 0x78, - 0x29, 0xf9, 0x5c, 0x47, 0x21, 0x6b, 0x80, 0x00, 0xae, 0xd4, 0xf4, 0x99, 0xd4, 0x25, 0x7f, 0xc1, - 0x0a, 0x3e, 0xf1, 0xcb, 0x5d, 0xc2, 0xf3, 0xee, 0xf4, 0x13, 0x80, 0xc3, 0x06, 0x76, 0xf2, 0xf8, - 0xdf, 0xe2, 0xf5, 0x59, 0xb7, 0xff, 0x58, 0x54, 0xfc, 0xb7, 0x61, 0xfe, 0x44, 0x7c, 0xfc, 0xff, - 0x79, 0xf8, 0xac, 0xb4, 0xfd, 0x0d, 0x13, 0xfd, 0x59, 0x99, 0x03, 0x59, 0xd2, 0x04, 0x61, 0x03, - 0xfe, 0x0d, 0xb8, 0xff, 0x4a, 0x3b, 0xff, 0x4f, 0xfa, 0xfb, 0x06, 0x5e, 0xfb, 0xcd, 0xe1, 0xf9, - 0xfe, 0x88, 0xf8, 0x67, 0x25, 0xfa, 0x1d, 0xd4, 0x56, 0xd1, 0xc3, 0x3c, 0x66, 0x1d, 0xdb, 0x53, - 0xf6, 0xf6, 0xce, 0x75, 0x20, 0x51, 0x92, 0xfd, 0xe3, 0x6e, 0xf2, 0x0f, 0x59, 0x2a, 0xc3, 0x13, - 0x0e, 0x92, 0x27, 0xc9, 0x93, 0xb5, 0xf2, 0x57, 0x1f, 0x14, 0xd0, 0xcc, 0x05, 0xcb, 0xc5, 0xf8, - 0xbf, 0x60, 0xf7, 0xa7, 0x2d, 0xff, 0x10, 0x8d, 0xf9, 0xee, 0x28, 0xff, 0x0b, 0x40, 0xfd, 0x3f, - 0x9d, 0xf7, 0x9f, 0x7e, 0xfd, 0xa4, 0x5a, 0xfb, 0xf1, 0x27, 0x05, 0xda, 0xde, 0x07, 0x2d, 0xd3, - 0xfb, 0x08, 0x54, 0xff, 0x40, 0x87, 0x01, 0xc4, 0xfe, 0xfa, 0xbf, 0x39, 0xfb, 0x2d, 0xef, 0xfa, - 0xfb, 0x5b, 0xf7, 0x46, 0x7c, 0xf9, 0x37, 0x6e, 0x5a, 0xfb, 0x13, 0x3f, 0x8a, 0x5a, 0xda, 0xdd, - 0x95, 0xf4, 0x66, 0xc4, 0x1f, 0x2e, 0xa8, 0xfb, 0xa8, 0xf6, 0xed, 0xfa, 0x9f, 0x2d, 0x19, 0x0b, - 0x12, 0xba, 0xd6, 0xc7, 0x4d, 0x6e, 0xf2, 0xae, 0xa0, 0x12, 0xe3, 0xcc, 0x04, 0x82, 0x87, 0xf9, - 0xff, 0x4c, 0xf8, 0xc5, 0x6c, 0xfe, 0x42, 0x60, 0xf7, 0x60, 0xbd, 0xff, 0xf9, 0x65, 0xfd, 0xd5, - 0x7c, 0xf7, 0xed, 0xf5, 0xfd, 0x10, 0x51, 0xf9, 0x31, 0x68, 0x05, 0x30, 0xe7, 0x0a, 0x7e, 0x46, - 0xfb, 0x80, 0x03, 0xfe, 0x05, 0xc5, 0x03, 0xda, 0x5f, 0xfb, 0x88, 0x4c, 0xfa, 0x28, 0x36, 0xfc, - 0x24, 0x81, 0xf6, 0x3a, 0x22, 0xf8, 0xee, 0xa5, 0x5d, 0x69, 0xc6, 0x40, 0x64, 0xb3, 0xd9, 0x02, - 0x27, 0xf4, 0xfe, 0x81, 0x1e, 0xef, 0x1d, 0xf9, 0x4d, 0x3f, 0xea, 0x2e, 0x7b, 0x2e, 0xf5, 0x56, - 0x15, 0xc7, 0x7f, 0xc8, 0xf7, 0xfa, 0xf2, 0x90, 0x37, 0x10, 0x14, 0xcb, 0x02, 0xcf, 0x8e, 0xfb, - 0x91, 0xd3, 0xf8, 0xea, 0x98, 0xfc, 0x8e, 0x63, 0xf6, 0xba, 0x2e, 0x00, 0xf9, 0x04, 0xfd, 0x74, - 0xd8, 0xf7, 0x5d, 0xa2, 0xfe, 0x6c, 0x9f, 0xf7, 0x27, 0x79, 0x04, 0x90, 0xb9, 0x0c, 0x26, 0xb1, - 0xfc, 0xaa, 0xc5, 0xfc, 0xcb, 0xdf, 0x04, 0x30, 0x64, 0xfd, 0x09, 0xfe, 0xf8, 0x89, 0x94, 0xfc, - 0xa7, 0x32, 0xf6, 0xfb, 0x32, 0xf6, 0xa3, 0xca, 0x60, 0x2e, 0x2a, 0x42, 0x08, 0xe7, 0xd8, 0x1c, - 0x2b, 0xf6, 0x37, 0xaa, 0x1c, 0x8a, 0x55, 0xf5, 0xb2, 0xa1, 0xe8, 0x2a, 0x17, 0x2d, 0xc7, 0x72, - 0x17, 0xfe, 0x97, 0xcb, 0xd2, 0x9d, 0xf3, 0x5c, 0x31, 0x0d, 0x87, 0x9e, 0x00, 0x51, 0x5f, 0xfe, - 0x4f, 0x6c, 0xf9, 0xad, 0x34, 0xfa, 0x9b, 0x32, 0xf6, 0x16, 0x59, 0x01, 0x96, 0x89, 0xfc, 0xd5, - 0x08, 0xf8, 0xa8, 0xe0, 0xff, 0x0f, 0x87, 0xf6, 0xc8, 0xa9, 0x02, 0x93, 0xf6, 0x0c, 0xc0, 0xdf, - 0xff, 0x71, 0x2b, 0xfd, 0x8c, 0x0d, 0x04, 0x98, 0x53, 0x00, 0x2f, 0x84, 0xf8, 0xe9, 0xfc, 0xfa, - 0x38, 0x6e, 0xf6, 0xe3, 0x36, 0xf5, 0x6b, 0xa2, 0x5f, 0x7c, 0xd6, 0x45, 0x00, 0xe8, 0xdc, 0x08, - 0x22, 0xf4, 0x99, 0x20, 0x1b, 0xb9, 0xec, 0xf4, 0xf6, 0x02, 0xe4, 0x99, 0x6a, 0x29, 0x46, 0x05, - 0x1b, 0x54, 0x5b, 0xd0, 0x64, 0x19, 0xf3, 0x53, 0x2c, 0x09, 0x44, 0x7a, 0xff, 0xbf, 0xb4, 0x00, - 0x0a, 0x92, 0xf9, 0xa2, 0xb3, 0xf8, 0xe7, 0xb2, 0xf5, 0xf2, 0xab, 0x02, 0x5c, 0xd2, 0xfc, 0x82, - 0xf0, 0xf6, 0x3d, 0x6f, 0x01, 0x97, 0xe7, 0xf6, 0x0a, 0xf1, 0xfe, 0x93, 0x96, 0x0b, 0xd0, 0x0b, - 0x05, 0xd4, 0xba, 0xfe, 0x5a, 0x5f, 0x01, 0x6a, 0x39, 0x03, 0xfd, 0x5d, 0xf8, 0xde, 0x77, 0xf8, - 0x71, 0xf2, 0xf7, 0xfb, 0x0a, 0xf4, 0xf6, 0x2b, 0x5b, 0xae, 0x58, 0x4a, 0x3b, 0x92, 0xe5, 0xca, - 0x22, 0xf0, 0x99, 0x50, 0x18, 0x22, 0x1d, 0xf8, 0x9f, 0x10, 0xde, 0x41, 0xff, 0x21, 0x7a, 0x94, - 0x20, 0xa2, 0x8d, 0xd6, 0x89, 0xe1, 0xf0, 0x0f, 0x6c, 0x06, 0xe3, 0xfb, 0xfd, 0xae, 0xd4, 0x01, - 0x0e, 0x12, 0xfb, 0xa9, 0x5e, 0xf7, 0x66, 0x9b, 0xf5, 0xab, 0xda, 0x03, 0xa7, 0xf3, 0xfc, 0x46, - 0x4a, 0xf6, 0xb0, 0x4e, 0x02, 0xc2, 0x28, 0xf8, 0x70, 0xdf, 0xfb, 0xbb, 0x71, 0x08, 0x54, 0x86, - 0x09, 0xa2, 0x54, 0x02, 0x07, 0xee, 0xfd, 0x4c, 0x80, 0x03, 0x94, 0x79, 0xfa, 0x94, 0xda, 0xf6, - 0xcc, 0x22, 0xf8, 0xd0, 0x4d, 0xf4, 0x79, 0xba, 0x58, 0x76, 0x29, 0x4c, 0x0e, 0x87, 0xeb, 0x5b, - 0xaf, 0xf1, 0xe2, 0x2c, 0x14, 0xf8, 0x6b, 0xf8, 0xcb, 0xda, 0xdc, 0x47, 0x72, 0x18, 0x6b, 0xd0, - 0x23, 0x49, 0x0d, 0xde, 0x70, 0x3d, 0xee, 0xb3, 0x73, 0x05, 0x32, 0xf0, 0xfb, 0xbd, 0xb2, 0x01, - 0xd5, 0xd5, 0xfd, 0x2f, 0xbc, 0xf6, 0x78, 0x83, 0xf5, 0xaf, 0xa4, 0x04, 0x7c, 0x31, 0xfd, 0x08, - 0xc4, 0xf5, 0xcb, 0x3e, 0x03, 0x57, 0x51, 0xf9, 0xc4, 0xa0, 0xfa, 0x96, 0xd3, 0x05, 0x33, 0x95, - 0x09, 0x70, 0x10, 0x06, 0xeb, 0xac, 0xfc, 0x6b, 0x13, 0x02, 0xd7, 0x38, 0xfd, 0x05, 0x76, 0xf6, - 0x99, 0x0b, 0xf8, 0xe4, 0x20, 0xf5, 0x86, 0x7e, 0x59, 0x5b, 0xbe, 0x4b, 0x04, 0x56, 0xeb, 0x45, - 0x9c, 0xf9, 0x65, 0xb5, 0x11, 0x0e, 0x9d, 0xf1, 0xbc, 0x78, 0xe0, 0x15, 0x56, 0x11, 0x98, 0x39, - 0x21, 0x11, 0xf3, 0xe5, 0x86, 0xf6, 0xed, 0x48, 0x41, 0x03, 0x7c, 0x18, 0xfa, 0x54, 0xb6, 0x02, - 0xc3, 0x34, 0xff, 0xdb, 0x6c, 0xf7, 0x36, 0x31, 0xf6, 0x5c, 0x0a, 0x03, 0x9a, 0x04, 0xff, 0xb4, - 0x77, 0xf5, 0xed, 0x1f, 0x03, 0x0f, 0xff, 0xfb, 0xa1, 0x00, 0xfa, 0x90, 0x4e, 0x03, 0x1d, 0x93, - 0x05, 0xd7, 0x43, 0x08, 0x79, 0xd8, 0xff, 0xe2, 0x5c, 0xff, 0xee, 0x2a, 0xff, 0x3f, 0x5c, 0xf8, - 0x94, 0xf6, 0xf6, 0x8e, 0xe4, 0xf6, 0x89, 0xd8, 0x59, 0x36, 0xae, 0x4b, 0x10, 0xcc, 0xe9, 0xfc, - 0xf8, 0x01, 0x92, 0x7a, 0x11, 0xcc, 0x75, 0xe8, 0xc9, 0xab, 0xe4, 0x64, 0x5e, 0x0c, 0x6b, 0x68, - 0x1b, 0x41, 0x2b, 0xee, 0x1e, 0x0b, 0xef, 0xb0, 0x25, 0xff, 0xfa, 0xe5, 0xf9, 0x21, 0xf4, 0x04, - 0x14, 0xca, 0xfe, 0x9a, 0xff, 0xf8, 0xb4, 0x70, 0xf7, 0x3c, 0x61, 0xff, 0xe5, 0x20, 0x02, 0xac, - 0x73, 0xf6, 0x84, 0x32, 0x01, 0xfa, 0xde, 0xff, 0x03, 0xf3, 0xf8, 0x3d, 0xb1, 0xfe, 0x66, 0x98, - 0x02, 0x24, 0xae, 0x08, 0x6d, 0x7b, 0x03, 0x9b, 0xdc, 0xff, 0xc9, 0xfc, 0xfe, 0x0d, 0x85, 0xfa, - 0x70, 0xda, 0xf8, 0xa9, 0x33, 0xf7, 0x16, 0x2b, 0x59, 0xf5, 0x26, 0x4b, 0x40, 0x3c, 0xea, 0x80, - 0xd8, 0x07, 0xf8, 0xbd, 0x11, 0x73, 0x93, 0xe1, 0xbf, 0xb9, 0xe6, 0x71, 0x5d, 0x08, 0x54, 0xfe, - 0x14, 0xd6, 0x9b, 0xf5, 0x19, 0xd6, 0xf0, 0x21, 0x41, 0xfa, 0x35, 0x5a, 0xfb, 0x25, 0xbd, 0x07, - 0x37, 0x0f, 0xfd, 0xc8, 0x31, 0xfa, 0xf1, 0xda, 0xf9, 0x73, 0x2b, 0xfb, 0x25, 0x8c, 0x04, 0x57, - 0x3f, 0xfa, 0xbe, 0xca, 0xfc, 0xa6, 0xb0, 0x00, 0x13, 0x8a, 0xfa, 0x81, 0x8a, 0xfa, 0x2d, 0x5f, - 0xff, 0xa1, 0x8b, 0x08, 0xab, 0x3a, 0x06, 0x33, 0x29, 0x02, 0x52, 0xa3, 0xff, 0xca, 0x5f, 0xfc, - 0x69, 0x2a, 0xfa, 0x77, 0x9d, 0xf6, 0xa4, 0x99, 0x56, 0xa9, 0xd1, 0x4a, 0x0b, 0xab, 0xed, 0x41, - 0x73, 0x0a, 0x36, 0x9e, 0x11, 0xd5, 0xa2, 0xdf, 0xc8, 0x85, 0xe6, 0x1f, 0xf3, 0x02, 0xe1, 0x9f, - 0x10, 0xf1, 0xdc, 0xfb, 0x4d, 0x39, 0xf2, 0xeb, 0x2e, 0xf7, 0x3a, 0xfa, 0xfc, 0x93, 0xd8, 0x09, - 0xcd, 0x4c, 0xfc, 0x58, 0xfc, 0xf9, 0xbc, 0x7c, 0xfc, 0xb6, 0xfa, 0xf9, 0xe4, 0xc7, 0x03, 0x4f, - 0x00, 0xfd, 0x5e, 0x7d, 0xfa, 0x4d, 0xb6, 0xfd, 0xb7, 0xfd, 0xfc, 0x2e, 0x59, 0xfb, 0x8a, 0xa5, - 0xfb, 0x94, 0x06, 0x06, 0x66, 0xe4, 0x07, 0x5a, 0xa7, 0x07, 0x45, 0xbc, 0x00, 0x61, 0xb9, 0xf9, - 0x96, 0x85, 0xfd, 0xee, 0xa2, 0xf8, 0xd1, 0xba, 0x53, 0xa9, 0x2d, 0x4a, 0xd0, 0x45, 0xf1, 0x0e, - 0x38, 0x0c, 0x92, 0x2b, 0x11, 0xa5, 0xe3, 0xdf, 0x8a, 0x92, 0xe6, 0x61, 0x78, 0xfc, 0x63, 0xa8, - 0x0c, 0x5e, 0x9e, 0x02, 0x6e, 0x52, 0xf3, 0xd8, 0x80, 0xf4, 0x81, 0xca, 0xff, 0x3d, 0xc6, 0x0a, - 0x16, 0x96, 0xfb, 0x44, 0x44, 0xfb, 0xb8, 0xf4, 0xfd, 0x4d, 0xc7, 0xf8, 0xca, 0x89, 0x02, 0x71, - 0xa1, 0xfd, 0x72, 0x8e, 0xf9, 0x53, 0x51, 0xfb, 0xf9, 0xc5, 0xfe, 0xc4, 0xc6, 0xfe, 0x04, 0xbd, - 0xf8, 0xef, 0xb3, 0x04, 0x56, 0x7e, 0x08, 0x10, 0x90, 0x07, 0x0e, 0xd0, 0x04, 0x74, 0x0b, 0xfa, - 0xb1, 0x9d, 0xfd, 0x8e, 0x96, 0xfa, 0x1f, 0x62, 0x53, 0x7e, 0xac, 0x45, 0xf3, 0xc4, 0xf3, 0x58, - 0x09, 0x10, 0xa8, 0xe1, 0x0d, 0x3d, 0x8c, 0xe1, 0x97, 0x9e, 0xe7, 0x10, 0x7d, 0xf5, 0xc6, 0x5d, - 0x09, 0x46, 0x5b, 0x08, 0xc2, 0x8d, 0xf5, 0xce, 0x3f, 0xf1, 0xda, 0x2f, 0x02, 0x8b, 0x2d, 0x0d, - 0x29, 0x91, 0xfa, 0xc9, 0x65, 0xfb, 0xe0, 0x93, 0xfd, 0x84, 0x89, 0xf8, 0x33, 0x76, 0x01, 0x38, - 0x70, 0xfb, 0x64, 0xa1, 0xfa, 0x01, 0x5c, 0xfc, 0x1a, 0xbc, 0xfc, 0xde, 0xd4, 0x01, 0x55, 0xe4, - 0xfc, 0x88, 0xa8, 0x01, 0xfd, 0x79, 0x04, 0x60, 0xa1, 0x06, 0x5f, 0x44, 0x09, 0xae, 0xaa, 0xfc, - 0x27, 0x52, 0xfa, 0x77, 0x70, 0xfc, 0x49, 0x6d, 0x4f, 0x6b, 0xe0, 0x42, 0xed, 0x68, 0xf9, 0x42, - 0x4c, 0x11, 0xbc, 0x67, 0x09, 0xec, 0x4c, 0xe7, 0x64, 0x88, 0xe9, 0x41, 0xa5, 0xea, 0xec, 0xd4, - 0x07, 0x3a, 0x87, 0x10, 0xfe, 0x3d, 0xf5, 0x81, 0xb7, 0xee, 0xdb, 0x2f, 0x06, 0x82, 0x73, 0x0d, - 0xf0, 0x21, 0xf9, 0xf6, 0xd2, 0xfc, 0xc9, 0x39, 0xfb, 0x23, 0xe6, 0xf6, 0x5c, 0xc6, 0x03, 0x1f, - 0xc0, 0xf9, 0x98, 0x69, 0xf8, 0x9d, 0xd3, 0x00, 0x31, 0x60, 0xfd, 0x56, 0x1e, 0x00, 0x57, 0xe5, - 0x01, 0x01, 0x4e, 0x01, 0xc6, 0xeb, 0xff, 0xb9, 0x5a, 0x05, 0x5b, 0x4b, 0x08, 0x1c, 0xd3, 0xff, - 0x2d, 0x22, 0xfd, 0x8c, 0x52, 0xfb, 0x3b, 0x4c, 0x4e, 0x51, 0x2a, 0x3e, 0x24, 0x58, 0xfc, 0xc1, - 0x9b, 0x13, 0x73, 0xfe, 0x02, 0x8e, 0x98, 0xeb, 0xb1, 0xe6, 0xef, 0x95, 0x30, 0xe2, 0x5e, 0xdd, - 0x02, 0x17, 0x55, 0x18, 0xa8, 0x11, 0xf8, 0xb9, 0xa1, 0xeb, 0xd5, 0x51, 0x08, 0xe2, 0xe5, 0x0d, - 0x59, 0x4d, 0xf7, 0x0b, 0x6b, 0xfc, 0x1f, 0xb4, 0xf9, 0xb9, 0xc4, 0xf7, 0x7e, 0xb9, 0x04, 0x67, - 0xeb, 0xf7, 0x38, 0x6b, 0xf8, 0xaf, 0xca, 0x04, 0x74, 0xc5, 0xfe, 0x59, 0x38, 0xfd, 0xa0, 0xeb, - 0x03, 0x98, 0x58, 0x04, 0x06, 0xb4, 0xfd, 0xdb, 0xd5, 0x01, 0x3e, 0x29, 0x05, 0x3d, 0x54, 0x01, - 0x75, 0xf9, 0x01, 0x95, 0xbd, 0xfb, 0x72, 0x93, 0x52, 0x62, 0xe4, 0x39, 0xcc, 0x6e, 0xf4, 0x77, - 0x71, 0x17, 0x7e, 0x1f, 0x04, 0x55, 0x3b, 0xe8, 0x71, 0x98, 0xf2, 0x68, 0x2e, 0xe4, 0xae, 0x30, - 0x01, 0xda, 0x8a, 0x17, 0x4c, 0xe8, 0xfa, 0x43, 0x77, 0xed, 0xd6, 0xec, 0x06, 0xd3, 0xae, 0x0d, - 0x64, 0xff, 0xf5, 0xf6, 0x6f, 0xfa, 0xa3, 0xdf, 0xfa, 0x6c, 0xdc, 0xf8, 0xe6, 0xf1, 0x04, 0x70, - 0xe0, 0xf8, 0x60, 0x89, 0xf8, 0x12, 0xf6, 0x04, 0xb9, 0x3d, 0x00, 0x29, 0xc3, 0xfe, 0xc1, 0xac, - 0x03, 0x10, 0xbc, 0x03, 0xbc, 0x2e, 0xfe, 0xb3, 0xc6, 0xff, 0x2d, 0x55, 0x03, 0x63, 0xe2, 0x00, - 0x39, 0x1a, 0x02, 0x41, 0x0e, 0x00, 0x82, 0x95, 0x56, 0xd8, 0x0a, 0x34, 0x61, 0xfa, 0xe9, 0xc7, - 0x6f, 0x1e, 0xe8, 0xea, 0x08, 0x44, 0x5b, 0xdf, 0x18, 0x5e, 0xf3, 0xfd, 0x43, 0xec, 0x8f, 0xaa, - 0xff, 0x0e, 0xc1, 0x13, 0x6b, 0x9d, 0xfd, 0x43, 0x9e, 0xed, 0x33, 0xe5, 0x03, 0xfc, 0x3a, 0x0f, - 0x53, 0x1a, 0xf6, 0x87, 0xba, 0xf6, 0xaf, 0x25, 0xfc, 0x12, 0x05, 0xfc, 0x75, 0x8e, 0x04, 0x94, - 0x95, 0xf9, 0x6b, 0xa4, 0xf8, 0xf1, 0x53, 0x03, 0x40, 0xe5, 0x01, 0x6f, 0xbf, 0x00, 0xd3, 0xe5, - 0x01, 0xc0, 0x88, 0x02, 0xd5, 0x82, 0xff, 0x59, 0x84, 0xfe, 0x9a, 0x7d, 0x01, 0x57, 0xee, 0x00, - 0x1c, 0x8a, 0x00, 0x33, 0xd6, 0x01, 0x87, 0x53, 0x55, 0x9d, 0x6a, 0x2e, 0x19, 0x75, 0xe3, 0x99, - 0xc4, 0x25, 0x3b, 0x5b, 0x10, 0x61, 0x4f, 0xd7, 0xf6, 0x33, 0xf1, 0x86, 0x43, 0xf6, 0x1d, 0xe3, - 0x01, 0xbb, 0xe2, 0x0b, 0xc5, 0xf0, 0xfc, 0x1e, 0xaa, 0xf1, 0x72, 0x23, 0x01, 0x51, 0xf2, 0x0e, - 0x42, 0x9c, 0xf7, 0xd6, 0x0e, 0xf5, 0x45, 0x48, 0xfe, 0x5e, 0xd4, 0xfd, 0xab, 0xaf, 0x02, 0xf3, - 0x1b, 0xfa, 0x59, 0x15, 0xfb, 0xf9, 0xb3, 0x02, 0x77, 0x31, 0x00, 0x65, 0x80, 0x01, 0xda, 0x9f, - 0x02, 0x19, 0x00, 0x02, 0xd5, 0x0f, 0xff, 0xd4, 0x62, 0xff, 0x4d, 0xd0, 0x00, 0x79, 0x4b, 0xfe, - 0xf1, 0xb3, 0x01, 0xa9, 0xae, 0x02, 0x5f, 0xe3, 0x52, 0x51, 0x3c, 0x29, 0x0e, 0x95, 0xe0, 0xc9, - 0xa5, 0x2a, 0xd4, 0xa5, 0x14, 0xdd, 0x74, 0xd1, 0xca, 0x9f, 0xf1, 0x88, 0x36, 0xff, 0x27, 0xe9, - 0xfe, 0xfc, 0x71, 0x05, 0xb8, 0x07, 0x00, 0xbe, 0x99, 0xf3, 0x1c, 0x80, 0xfd, 0x3d, 0x9c, 0x0e, - 0x43, 0xd5, 0xfa, 0xd7, 0x1d, 0xf5, 0x19, 0x21, 0xff, 0xb4, 0x98, 0xff, 0xc1, 0x69, 0x00, 0x4c, - 0x4a, 0xfa, 0xf8, 0xc7, 0xfd, 0x19, 0xcb, 0x01, 0x1e, 0x5d, 0xfe, 0xa2, 0x5e, 0x01, 0x51, 0x4a, - 0x03, 0x08, 0xd9, 0x01, 0x72, 0x88, 0xfe, 0xda, 0x98, 0xff, 0xc8, 0x2b, 0x01, 0x6e, 0x72, 0xfe, - 0x34, 0xfa, 0x00, 0x2f, 0x41, 0x02, 0xff, 0xec, 0x4d, 0x13, 0x22, 0x27, 0x29, 0xba, 0xe1, 0x1f, - 0xf9, 0x27, 0xd2, 0xb4, 0x14, 0xa7, 0x24, 0xd6, 0x62, 0x9f, 0xf5, 0x25, 0x93, 0xfe, 0xac, 0x4a, - 0xfb, 0x4b, 0xfd, 0x03, 0x9b, 0x5c, 0x01, 0x63, 0xa0, 0xf5, 0x1a, 0xc5, 0xfb, 0xeb, 0x5b, 0x0d, - 0xe1, 0xa0, 0xfd, 0x47, 0x12, 0xf6, 0xb4, 0x84, 0xff, 0x47, 0xf5, 0xff, 0xbf, 0xac, 0xff, 0x6b, - 0xef, 0xfa, 0x88, 0xa2, 0xfd, 0x7e, 0x35, 0x01, 0x3e, 0x7a, 0xff, 0x52, 0x09, 0x01, 0x02, 0x99, - 0x01, 0xab, 0x20, 0x02, 0x4a, 0x24, 0xff, 0x37, 0xeb, 0xfe, 0x4c, 0x26, 0x02, 0x40, 0x66, 0x00, - 0xeb, 0x94, 0xff, 0xb3, 0x49, 0x00, 0x95, 0x51, 0x47, 0x38, 0xa0, 0x25, 0x10, 0xf4, 0xe4, 0x1c, - 0xde, 0x23, 0x31, 0x2d, 0x16, 0xca, 0xdf, 0xdb, 0x12, 0x76, 0xf4, 0x07, 0x38, 0xff, 0x5a, 0xc8, - 0xfb, 0x99, 0x2d, 0x00, 0xdf, 0x3a, 0x01, 0x62, 0x4c, 0xf9, 0x06, 0xad, 0xfb, 0xab, 0xec, 0x0a, - 0xc8, 0xbd, 0xff, 0x27, 0x51, 0xf8, 0x60, 0x39, 0xfe, 0x56, 0xf4, 0xff, 0x57, 0xd8, 0x00, 0xff, - 0xc1, 0xfa, 0x94, 0x5f, 0xfc, 0x06, 0x59, 0x01, 0x41, 0xe9, 0x00, 0x10, 0x8b, 0x00, 0xe4, 0x2b, - 0x00, 0x21, 0x87, 0x01, 0x95, 0xb5, 0xff, 0x13, 0x3f, 0x00, 0x69, 0x7f, 0x02, 0x5b, 0x7d, 0x00, - 0x82, 0xa6, 0xff, 0xa3, 0x21, 0xff, 0x09, 0xe7, 0x38, 0xb1, 0x4f, 0x26, 0x9d, 0xf8, 0xfa, 0x80, - 0x88, 0x14, 0xfc, 0x2d, 0x02, 0xf8, 0x6c, 0xef, 0x8f, 0x2b, 0xfc, 0x0b, 0xc4, 0xf5, 0x81, 0xe7, - 0xfe, 0xe6, 0x2a, 0x07, 0x48, 0x1b, 0xfd, 0x4a, 0xce, 0xf6, 0x3c, 0x21, 0x04, 0x42, 0x2a, 0x09, - 0x4c, 0x8f, 0xfb, 0x7c, 0x2c, 0xfc, 0xf5, 0xf3, 0xfb, 0x4d, 0xb9, 0xfd, 0xf3, 0x2f, 0x02, 0xf1, - 0x2f, 0xfa, 0x01, 0x92, 0xfc, 0xed, 0xa9, 0x01, 0x4a, 0x28, 0xfe, 0x13, 0xbf, 0xfe, 0xd8, 0x60, - 0x01, 0x46, 0x99, 0x01, 0x9b, 0x33, 0x02, 0x9e, 0x8c, 0x04, 0x70, 0xf6, 0x00, 0xd7, 0x87, 0xfc, - 0x7e, 0x92, 0xfe, 0x65, 0x37, 0xfe, 0xcc, 0x59, 0x31, 0x93, 0xe2, 0x24, 0x80, 0x58, 0xfd, 0xc4, - 0x99, 0x11, 0xf4, 0xe5, 0x05, 0x1d, 0x67, 0xf1, 0x70, 0x8b, 0xfa, 0xc0, 0x1b, 0xf9, 0x5c, 0x18, - 0xfe, 0xaf, 0x75, 0x04, 0xb3, 0x57, 0xfe, 0x53, 0x9c, 0xf8, 0xa1, 0x2f, 0x03, 0x42, 0xf5, 0x07, - 0xa3, 0x13, 0xfd, 0x23, 0x69, 0xfc, 0x1c, 0xef, 0xfb, 0xa3, 0x5b, 0xfe, 0x20, 0x8b, 0x01, 0x93, - 0x36, 0xfa, 0x33, 0x01, 0xfd, 0x6f, 0x8b, 0x01, 0xf9, 0x92, 0xfd, 0xe6, 0xb2, 0xfe, 0xa0, 0x09, - 0x02, 0xf5, 0x8e, 0x01, 0xc8, 0xdc, 0x01, 0x67, 0x77, 0x03, 0x6e, 0x0e, 0x00, 0x42, 0xe1, 0xfd, - 0x71, 0xa2, 0xff, 0xba, 0xa7, 0xfd, 0xf6, 0x21, 0x2b, 0x05, 0xfb, 0x22, 0x8f, 0x48, 0xff, 0x18, - 0xdc, 0x10, 0x69, 0xf3, 0x07, 0xd9, 0xef, 0xf1, 0x6f, 0xfe, 0xfa, 0x65, 0x8f, 0xfb, 0xcd, 0x37, - 0xfd, 0xae, 0x34, 0x03, 0x5a, 0xe0, 0xfe, 0xbd, 0x7e, 0xfa, 0xf5, 0xfd, 0x02, 0xec, 0x92, 0x06, - 0x2a, 0x2f, 0xfe, 0xec, 0x17, 0xfd, 0xe0, 0xb3, 0xfc, 0x57, 0x92, 0xfe, 0x72, 0x90, 0x00, 0x47, - 0x31, 0xfb, 0xd2, 0xc2, 0xfd, 0x9b, 0xbc, 0x00, 0xa2, 0xa8, 0xfd, 0x93, 0x50, 0xff, 0x76, 0xd6, - 0x01, 0xe7, 0xac, 0x01, 0x2e, 0x1c, 0x02, 0x67, 0x1d, 0x02, 0x76, 0x69, 0xff, 0xdb, 0x65, 0xff, - 0x36, 0x91, 0x00, 0xc1, 0xbc, 0xfd, 0xbc, 0xe9, 0x24, 0xb4, 0xee, 0x1f, 0x4c, 0xf8, 0x02, 0xdd, - 0xa1, 0x10, 0xbb, 0xd3, 0x06, 0x4f, 0x53, 0xf4, 0x00, 0x97, 0xfc, 0xac, 0x8e, 0xfb, 0x54, 0x4e, - 0xfd, 0x69, 0x0c, 0x03, 0xf4, 0xe2, 0xfe, 0x43, 0xa4, 0xfb, 0x4d, 0xbd, 0x02, 0x21, 0xe3, 0x05, - 0x81, 0xb9, 0xfe, 0x06, 0x78, 0xfd, 0xe7, 0xbd, 0xfd, 0x2d, 0x8f, 0xfe, 0x5b, 0xda, 0xff, 0x69, - 0x26, 0xfc, 0x4e, 0xe7, 0xfd, 0x38, 0x61, 0x00, 0xc1, 0x55, 0xfe, 0xd3, 0x6a, 0xff, 0x4f, 0x62, - 0x01, 0xdb, 0xda, 0x01, 0x5c, 0xf5, 0x01, 0x6b, 0xfe, 0x00, 0x73, 0xd2, 0xff, 0xa4, 0xa5, 0x00, - 0x8a, 0xd5, 0x00, 0x56, 0xa9, 0xfe, 0x73, 0x6b, 0x1e, 0x50, 0x06, 0x1d, 0xba, 0xaa, 0x07, 0xeb, - 0x56, 0x0f, 0x43, 0xfd, 0x04, 0x21, 0x80, 0xf8, 0x45, 0xff, 0xfd, 0x9e, 0x79, 0xfa, 0x00, 0x9a, - 0xfd, 0x8e, 0xb1, 0x03, 0x8d, 0x3c, 0xff, 0xc1, 0xc3, 0xfb, 0x12, 0x88, 0x02, 0xdd, 0x7e, 0x05, - 0x2c, 0xf4, 0xfe, 0xfe, 0x70, 0xfe, 0xc2, 0x6c, 0xfe, 0x19, 0x17, 0xfe, 0xce, 0xa1, 0xff, 0xaa, - 0x2a, 0xfd, 0x7a, 0x3b, 0xfe, 0x9f, 0xf1, 0xff, 0xaf, 0xbe, 0xfe, 0x17, 0xa8, 0xff, 0xad, 0xf9, - 0x00, 0x94, 0xd6, 0x01, 0x9a, 0x7a, 0x01, 0x26, 0xc9, 0x00, 0x47, 0x03, 0x01, 0x5b, 0x7d, 0x01, - 0x9f, 0x6c, 0x01, 0x39, 0x45, 0xff, 0x20, 0x0c, 0x18, 0xde, 0xec, 0x19, 0xe7, 0xcb, 0x0b, 0x9b, - 0x7d, 0x0e, 0xb0, 0x15, 0x04, 0xa0, 0x25, 0xfc, 0x3e, 0xe2, 0xfe, 0xbe, 0xad, 0xf9, 0xbd, 0xfe, - 0xfd, 0x1e, 0x81, 0x04, 0xab, 0x83, 0xff, 0xff, 0xbf, 0xfb, 0xcb, 0xf2, 0x01, 0x60, 0xe7, 0x04, - 0x5d, 0x45, 0x00, 0xfa, 0x60, 0xff, 0x13, 0xb9, 0xfd, 0x4e, 0xd5, 0xfd, 0x15, 0x99, 0x00, 0x9e, - 0x19, 0xfe, 0x4c, 0xbe, 0xfd, 0x30, 0xc5, 0xff, 0x7d, 0x35, 0xff, 0x2b, 0x7d, 0xff, 0xbd, 0x47, - 0x01, 0x7b, 0xd3, 0x01, 0x92, 0xd2, 0x00, 0x02, 0x84, 0x01, 0x0c, 0x95, 0x02, 0x0c, 0x72, 0x02, - 0x1e, 0x66, 0x01, 0xb7, 0xea, 0xfe, 0x41, 0x65, 0x14, 0x61, 0xe4, 0x17, 0xf8, 0xc6, 0x0c, 0x5a, - 0xfa, 0x0c, 0xc3, 0xea, 0x03, 0xc1, 0x09, 0xfe, 0x89, 0xad, 0xff, 0xcb, 0xaa, 0xfa, 0x1c, 0x18, - 0xfe, 0x01, 0xd1, 0x03, 0x04, 0x00, 0x00, 0xeb, 0xd1, 0xfc, 0xc2, 0x8b, 0x01, 0xde, 0xd2, 0x03, - 0x44, 0xe4, 0x00, 0x67, 0x07, 0x00, 0x07, 0x61, 0xfd, 0x49, 0x21, 0xfe, 0xff, 0x61, 0x01, 0x83, - 0x4a, 0xfe, 0x4b, 0x5b, 0xfd, 0x4d, 0xc7, 0xff, 0xd3, 0xb1, 0xff, 0xe6, 0xe6, 0xff, 0x42, 0x83, - 0x01, 0xa4, 0xc3, 0x01, 0x2c, 0x48, 0x01, 0x9e, 0xcb, 0x02, 0x4e, 0x93, 0x03, 0x1c, 0x3f, 0x02, - 0x5e, 0x28, 0x00, 0xe0, 0x86, 0xfe, 0x07, 0xf6, 0x11, 0x5f, 0xd6, 0x15, 0xfd, 0xce, 0x0c, 0xe5, - 0x56, 0x0c, 0x93, 0x91, 0x03, 0xf5, 0x05, 0xff, 0x92, 0x37, 0x01, 0xd3, 0x9e, 0xfb, 0xbd, 0xa4, - 0xfd, 0xad, 0x94, 0x03, 0x55, 0x02, 0x01, 0xdc, 0xc5, 0xfd, 0x8f, 0xa9, 0x00, 0x7c, 0x01, 0x03, - 0x4f, 0xf1, 0x01, 0x45, 0x7f, 0x00, 0xb9, 0x43, 0xfd, 0x82, 0xb5, 0xfe, 0x14, 0xa3, 0x01, 0xd3, - 0x2a, 0xfe, 0x73, 0xdb, 0xfd, 0xbb, 0x5e, 0x00, 0x45, 0xc5, 0xff, 0x55, 0xdf, 0x00, 0xa0, 0xbd, - 0x02, 0xf0, 0x05, 0x02, 0xba, 0xe1, 0x01, 0xa7, 0x6e, 0x03, 0xc9, 0x1e, 0x03, 0xdf, 0x03, 0x01, - 0xd6, 0x66, 0xff, 0xcf, 0x88, 0xfe, 0x93, 0x41, 0x10, 0x54, 0x8a, 0x13, 0x28, 0xe1, 0x0b, 0xb0, - 0x48, 0x0c, 0xbb, 0x23, 0x04, 0xc4, 0x68, 0xff, 0x8e, 0x0a, 0x01, 0x0e, 0x55, 0xfc, 0xf6, 0xa6, - 0xfe, 0xc9, 0x8a, 0x03, 0x2f, 0xb0, 0x00, 0xdb, 0xc1, 0xfd, 0xd1, 0x9e, 0x00, 0x15, 0x32, 0x03, - 0x47, 0x22, 0x02, 0x0d, 0x2f, 0x00, 0x25, 0x44, 0xfd, 0x2e, 0x3e, 0xff, 0x09, 0xe4, 0x01, 0xb3, - 0x35, 0xfe, 0xdc, 0x45, 0xfe, 0x2e, 0x20, 0x01, 0x53, 0xee, 0x00, 0x1b, 0x59, 0x02, 0xf0, 0xf0, - 0x02, 0x7c, 0x24, 0x01, 0xef, 0xc4, 0x01, 0xc5, 0x20, 0x03, 0x86, 0x9d, 0x01, 0xc9, 0xa4, 0xff, - 0xa0, 0x5e, 0xff, 0xed, 0x4e, 0xff, 0x50, 0xca, 0x0f, 0x5e, 0xd5, 0x12, 0x61, 0x6a, 0x0a, 0x59, - 0x91, 0x0a, 0x2f, 0x22, 0x04, 0xa0, 0x15, 0x00, 0xad, 0x7e, 0x01, 0xf7, 0x4a, 0xfd, 0xb0, 0x08, - 0xff, 0x50, 0x1a, 0x03, 0xaa, 0xb7, 0x00, 0x9f, 0x72, 0xfe, 0xe4, 0x55, 0x01, 0x23, 0xfd, 0x02, - 0x18, 0x06, 0x01, 0x56, 0x41, 0x00, 0xf9, 0xce, 0xfe, 0x3d, 0xa3, 0xff, 0x39, 0x67, 0x01, 0x7d, - 0x50, 0xff, 0x31, 0x38, 0x00, 0xfe, 0x65, 0x02, 0x93, 0xe9, 0x01, 0x88, 0x20, 0x02, 0x9a, 0x5a, - 0x01, 0x59, 0x97, 0x00, 0x1c, 0xa5, 0x01, 0x35, 0xe3, 0x01, 0x9f, 0xe2, 0x00, 0x75, 0xe4, 0xff, - 0xf5, 0x70, 0xff, 0xe6, 0x03, 0xff, 0x6f, 0x6a, 0x0e, 0x3a, 0x27, 0x11, 0x64, 0xda, 0x09, 0x0e, - 0x7b, 0x0a, 0x90, 0x85, 0x04, 0x29, 0x6d, 0x00, 0x70, 0x63, 0x01, 0xba, 0xd5, 0xfd, 0x19, 0xbc, - 0xff, 0x17, 0x4a, 0x03, 0x3c, 0xf7, 0x00, 0x4e, 0x95, 0xfe, 0x7f, 0x2d, 0x01, 0x20, 0xeb, 0x02, - 0x66, 0x47, 0x01, 0x8d, 0xc0, 0x00, 0xf2, 0x85, 0xff, 0xa8, 0xa7, 0x00, 0x7d, 0xbe, 0x02, 0x9e, - 0xfe, 0x00, 0xbb, 0xe1, 0x00, 0x9e, 0xd9, 0x01, 0x4a, 0x79, 0x01, 0x78, 0xd0, 0x00, 0x51, 0x07, - 0x00, 0x19, 0xa8, 0x00, 0x7e, 0x74, 0x01, 0x9f, 0x97, 0x01, 0xec, 0xab, 0x00, 0xcf, 0x57, 0xff, - 0xcd, 0x52, 0xff, 0x61, 0x0b, 0xff, 0x80, 0x5a, 0x0d, 0x88, 0x1e, 0x10, 0x2f, 0x6a, 0x09, 0x9c, - 0xe8, 0x09, 0xf6, 0xac, 0x04, 0x34, 0x8f, 0x00, 0xa8, 0x35, 0x01, 0x1a, 0xdd, 0xfe, 0xa5, 0xc4, - 0x00, 0x5e, 0x2f, 0x03, 0xe1, 0x72, 0x00, 0x64, 0xdc, 0xfe, 0xf6, 0x39, 0x02, 0xd7, 0xd5, 0x02, - 0x2e, 0x0e, 0x01, 0x71, 0x9d, 0x02, 0x12, 0x03, 0x02, 0xbe, 0x8f, 0x01, 0x3f, 0xa1, 0x02, 0xc6, - 0xc6, 0x00, 0xf7, 0xfc, 0xff, 0x03, 0xfd, 0x00, 0x03, 0x8e, 0x00, 0xc2, 0x92, 0xff, 0x55, 0x71, - 0x00, 0x89, 0x65, 0x01, 0xea, 0xb4, 0x00, 0x1f, 0xb9, 0x00, 0xdd, 0x57, 0x00, 0x21, 0x61, 0xff, - 0xda, 0x40, 0xff, 0xb3, 0xf5, 0xfe, 0x0d, 0xd4, 0x0c, 0x8c, 0xcb, 0x0f, 0xbe, 0x31, 0x09, 0x2a, - 0xac, 0x08, 0x06, 0xb9, 0x03, 0x77, 0xec, 0x00, 0x5c, 0x8a, 0x02, 0x42, 0xbd, 0xff, 0xba, 0x0e, - 0x00, 0x2d, 0xe3, 0x02, 0xd5, 0x9a, 0x01, 0x25, 0xa7, 0xff, 0x91, 0x42, 0x02, 0x19, 0x3c, 0x04, - 0xa2, 0x8e, 0x03, 0xe8, 0xca, 0x03, 0xca, 0xd4, 0x01, 0x28, 0x51, 0x00, 0x12, 0x0c, 0x01, 0xb4, - 0xce, 0xff, 0x97, 0x52, 0xff, 0xc1, 0xac, 0x00, 0x6e, 0x56, 0x00, 0x02, 0xa3, 0xff, 0xb5, 0x46, - 0x00, 0xbf, 0xb0, 0x00, 0x31, 0xae, 0x00, 0x08, 0x6a, 0x00, 0xb6, 0x9b, 0xff, 0xef, 0x1d, 0xff, - 0x5a, 0xfd, 0xfe, 0x8c, 0x00, 0xff, 0x74, 0xde, 0x0b, 0x21, 0x58, 0x0e, 0x8b, 0x1e, 0x09, 0x4b, - 0x8e, 0x09, 0xd1, 0x5f, 0x04, 0x28, 0x9e, 0x00, 0x7b, 0x7b, 0x01, 0x53, 0xa8, 0x00, 0x63, 0x4a, - 0x02, 0xa8, 0xda, 0x02, 0x6a, 0x6b, 0x01, 0xdf, 0x29, 0x02, 0x17, 0x12, 0x05, 0x7a, 0x0a, 0x05, - 0xe4, 0xc5, 0x02, 0xe8, 0x6a, 0x02, 0x03, 0x2a, 0x00, 0x85, 0xed, 0xfe, 0xcf, 0x4f, 0x00, 0x0b, - 0xa4, 0xff, 0xc6, 0xe7, 0xff, 0xfc, 0x8a, 0x00, 0x02, 0x7b, 0xff, 0x7c, 0xa2, 0xff, 0x00, 0x60, - 0x00, 0xe3, 0xa6, 0x00, 0x35, 0x3e, 0x00, 0xa4, 0x8f, 0xff, 0xd8, 0x61, 0xff, 0x23, 0xea, 0xfe, - 0xe0, 0xf5, 0xfe, 0x80, 0x29, 0xff, 0x3d, 0x83, 0x0b, 0x73, 0xd8, 0x0e, 0x61, 0xed, 0x09, 0x9a, - 0x7a, 0x08, 0x3a, 0x89, 0x02, 0x21, 0xfa, 0x00, 0x40, 0x6b, 0x03, 0xdd, 0xc9, 0x01, 0x0b, 0x1e, - 0x03, 0x54, 0x3c, 0x05, 0xd2, 0x72, 0x04, 0x08, 0xf1, 0x02, 0x06, 0xc7, 0x03, 0xfb, 0x53, 0x03, - 0x61, 0x82, 0x00, 0x7f, 0x55, 0x00, 0x80, 0x7a, 0xff, 0x2e, 0x57, 0xff, 0x4d, 0x8d, 0x00, 0x65, - 0x63, 0xff, 0x87, 0x76, 0xff, 0x4a, 0x2b, 0x00, 0xd8, 0xd3, 0xff, 0xd9, 0xd9, 0xff, 0x23, 0x21, - 0x00, 0x30, 0x37, 0x00, 0xad, 0x3d, 0xff, 0x72, 0x25, 0xff, 0x51, 0x64, 0xff, 0x55, 0xc9, 0xfe, - 0x7e, 0x1a, 0xff, 0x72, 0xd7, 0xfe, 0x80, 0x7f, 0x0b, 0x87, 0xc7, 0x0e, 0x36, 0xf7, 0x09, 0x80, - 0x6e, 0x08, 0x5f, 0x6f, 0x02, 0x8e, 0x0c, 0x01, 0xb2, 0x34, 0x05, 0xee, 0x85, 0x06, 0x5f, 0x60, - 0x06, 0x49, 0x1d, 0x04, 0x0f, 0xdc, 0x02, 0x2a, 0x70, 0x01, 0x91, 0xfe, 0x00, 0xe7, 0xa2, 0x01, - 0x8f, 0xc5, 0xff, 0x7e, 0xe4, 0xff, 0x78, 0x24, 0x00, 0xeb, 0xf8, 0xfe, 0xd3, 0x64, 0xff, 0x4a, - 0xb9, 0xff, 0x8c, 0xd7, 0xff, 0x1c, 0xfc, 0xff, 0x42, 0xd8, 0xff, 0xf4, 0x72, 0xff, 0x87, 0x62, - 0xff, 0xd9, 0xbc, 0xff, 0x36, 0xff, 0xfe, 0x4e, 0xb9, 0xfe, 0x7f, 0x26, 0xff, 0x59, 0xe1, 0xfe, - 0xf1, 0xe1, 0xfe, 0x33, 0xca, 0xfe, 0xf5, 0x1a, 0x0b, 0x51, 0x60, 0x0e, 0x97, 0xe0, 0x09, 0x4a, - 0x06, 0x09, 0x6d, 0x62, 0x05, 0x3a, 0xb9, 0x04, 0x7f, 0x82, 0x06, 0x8e, 0xbd, 0x06, 0xd4, 0x87, - 0x06, 0x8b, 0x0e, 0x02, 0x30, 0xae, 0xfe, 0x20, 0x32, 0xff, 0x3c, 0x79, 0x01, 0x68, 0xb7, 0x01, - 0x59, 0x24, 0xff, 0x71, 0x24, 0xff, 0xbb, 0x81, 0xff, 0x36, 0x28, 0xff, 0xd3, 0x88, 0xff, 0x83, - 0x86, 0xff, 0x6b, 0xce, 0xff, 0xef, 0xa2, 0xff, 0x43, 0x2b, 0xff, 0x84, 0x39, 0xff, 0x13, 0x4c, - 0xff, 0xd0, 0xe1, 0xfe, 0x54, 0x5f, 0xfe, 0x47, 0xd2, 0xfe, 0xff, 0xef, 0xfe, 0xa0, 0xd8, 0xfe, - 0x52, 0x21, 0xff, 0xb8, 0x89, 0xfe, 0xce, 0x04, 0x0a, 0x48, 0x10, 0x10, 0x7b, 0xf8, 0x0d, 0x21, - 0x6a, 0x0b, 0x50, 0xce, 0x06, 0x39, 0xf8, 0x04, 0x32, 0x2a, 0x06, 0x78, 0x91, 0x05, 0x2b, 0x61, - 0x02, 0x03, 0xa6, 0xff, 0x2e, 0x43, 0x00, 0xfa, 0xd0, 0xff, 0x93, 0x49, 0x00, 0x8a, 0xfa, 0x00, - 0x6b, 0x26, 0xff, 0xec, 0xbc, 0xff, 0x24, 0xd4, 0xff, 0xec, 0xbc, 0xfe, 0xab, 0xb2, 0xff, 0x28, - 0xda, 0xff, 0xb3, 0x43, 0xff, 0x00, 0x6e, 0xff, 0x29, 0x9d, 0xff, 0xda, 0x2b, 0xff, 0x48, 0x9b, - 0xfe, 0xfa, 0x87, 0xfe, 0xff, 0x93, 0xfe, 0x42, 0x10, 0xff, 0x56, 0x4b, 0xff, 0x6b, 0x17, 0xff, - 0x74, 0x1d, 0xff, 0xfa, 0xbd, 0xfe, 0x84, 0xb2, 0x0c, 0xf1, 0x4c, 0x17, 0x8e, 0x54, 0x11, 0x53, - 0xab, 0x07, 0x7a, 0x16, 0x03, 0x5f, 0x77, 0x04, 0x62, 0xe9, 0x04, 0x52, 0x99, 0x01, 0x2f, 0x1f, - 0x02, 0x83, 0xce, 0x01, 0xfe, 0x3d, 0xff, 0x2b, 0x96, 0xfe, 0x10, 0xd5, 0xff, 0xa8, 0xc7, 0x01, - 0xfc, 0x3b, 0x00, 0x98, 0x73, 0xfe, 0x4e, 0x7b, 0xff, 0x25, 0x93, 0xff, 0xb3, 0xe4, 0xfe, 0x9f, - 0x31, 0xff, 0xb5, 0xcc, 0xff, 0xed, 0xa0, 0xff, 0xb8, 0x20, 0xff, 0x68, 0xb8, 0xfe, 0x99, 0x62, - 0xfe, 0x0f, 0x96, 0xfe, 0x74, 0xfb, 0xfe, 0xa2, 0x2d, 0xff, 0x44, 0x4a, 0xff, 0x49, 0x39, 0xff, - 0x53, 0xf6, 0xfe, 0x5d, 0xc1, 0xfe, 0xf9, 0xc4, 0x0e, 0x9e, 0xeb, 0x17, 0xd6, 0x95, 0x0f, 0xc4, - 0x44, 0x08, 0xda, 0x34, 0x03, 0xc2, 0x68, 0x00, 0xc2, 0x77, 0x03, 0x88, 0x62, 0x05, 0x15, 0xc8, - 0x02, 0xe7, 0xd8, 0xfe, 0xbd, 0xbc, 0xff, 0x2d, 0xf4, 0x00, 0x84, 0xbc, 0xff, 0xe3, 0x81, 0x00, - 0xde, 0x66, 0x00, 0x92, 0x7c, 0xff, 0xa3, 0x22, 0xff, 0xc6, 0xbe, 0xfe, 0x12, 0xc6, 0xfe, 0x06, - 0x1c, 0xff, 0xbc, 0xc3, 0xff, 0x26, 0x7c, 0xff, 0xb7, 0x2b, 0xff, 0x35, 0xf1, 0xfe, 0xd6, 0x47, - 0xfe, 0xe9, 0xbb, 0xfe, 0x58, 0x29, 0xff, 0xbe, 0x0a, 0xff, 0x43, 0x06, 0xff, 0x6e, 0xfe, 0xfe, - 0xe4, 0x02, 0xff, 0xbb, 0xd7, 0xfe, 0xba, 0x12, 0x0b, 0xeb, 0xd1, 0x13, 0x15, 0x2b, 0x10, 0xc1, - 0xd1, 0x09, 0xd7, 0x52, 0x03, 0x49, 0x3a, 0x01, 0xed, 0x8b, 0x04, 0x9c, 0x41, 0x05, 0x36, 0xf7, - 0x02, 0x3c, 0x40, 0x00, 0xcc, 0x36, 0x00, 0x88, 0x6f, 0x01, 0x7a, 0x55, 0x01, 0x64, 0xbb, 0x00, - 0xd5, 0xe1, 0xff, 0xbb, 0x17, 0x00, 0x12, 0x9c, 0xff, 0xd1, 0x9a, 0xfe, 0x52, 0xd6, 0xfe, 0xb8, - 0xd9, 0xfe, 0x09, 0xe5, 0xfe, 0xb2, 0x6a, 0xff, 0x9d, 0xe8, 0xff, 0xb7, 0x16, 0xff, 0x57, 0x75, - 0xfe, 0x6c, 0x4b, 0xff, 0x39, 0x31, 0xff, 0x6c, 0xd7, 0xfe, 0xf6, 0xce, 0xfe, 0x7b, 0xbd, 0xfe, - 0x6c, 0xdd, 0xfe, 0x50, 0xb2, 0xfe, 0xdf, 0x90, 0x0a, 0x7b, 0xfe, 0x12, 0xd6, 0x53, 0x0d, 0xd6, - 0x46, 0x06, 0xf1, 0xfc, 0x03, 0xef, 0xc2, 0x03, 0xd1, 0x61, 0x04, 0x04, 0x02, 0x04, 0x8c, 0xaf, - 0x03, 0x98, 0x86, 0x02, 0x39, 0xc0, 0x00, 0xd1, 0x12, 0x01, 0x55, 0xb3, 0x02, 0xe4, 0x55, 0x02, - 0xe6, 0x9c, 0x00, 0xee, 0x2a, 0x00, 0x50, 0xff, 0xff, 0x2f, 0x81, 0xff, 0xa8, 0xae, 0xfe, 0x99, - 0x74, 0xfe, 0xa2, 0x3d, 0xff, 0x3d, 0x27, 0xff, 0x4e, 0x22, 0xff, 0x8a, 0x82, 0xff, 0x46, 0x7d, - 0xff, 0xfe, 0x78, 0xff, 0x40, 0x57, 0xff, 0xb9, 0x5d, 0xff, 0x25, 0xf6, 0xfe, 0x20, 0x74, 0xfe, - 0xd0, 0x7b, 0xfe, 0xcf, 0x8b, 0xfe, 0x37, 0x0c, 0x0a, 0xd6, 0xde, 0x11, 0x50, 0x6b, 0x0b, 0x4c, - 0xac, 0x04, 0x02, 0xf3, 0x04, 0x4f, 0xa0, 0x04, 0x39, 0x36, 0x02, 0xc7, 0x8c, 0x02, 0x06, 0x9a, - 0x04, 0x24, 0x1f, 0x03, 0x5d, 0x9b, 0x01, 0x9f, 0x8d, 0x02, 0x6d, 0xa1, 0x02, 0x47, 0x21, 0x02, - 0x0b, 0x5c, 0x02, 0x4a, 0x0a, 0x02, 0x21, 0x38, 0x00, 0xee, 0x81, 0xff, 0xc0, 0x05, 0x00, 0x83, - 0x1b, 0xff, 0x5d, 0x51, 0xfe, 0x93, 0xd9, 0xfe, 0x5b, 0x98, 0xff, 0x9e, 0x5a, 0xff, 0xd2, 0xe3, - 0xfe, 0x78, 0xff, 0xff, 0xb5, 0x50, 0x00, 0xa6, 0x57, 0xff, 0xaf, 0x3a, 0xff, 0xb7, 0x04, 0xff, - 0xf5, 0x71, 0xfe, 0x53, 0x3c, 0xfe, 0x86, 0x6e, 0x09, 0xc5, 0x66, 0x10, 0x9c, 0x99, 0x0a, 0xee, - 0x29, 0x05, 0x02, 0xba, 0x05, 0x26, 0x53, 0x04, 0x40, 0xaf, 0x00, 0x13, 0xbd, 0x01, 0x84, 0x8b, - 0x04, 0xd4, 0x89, 0x02, 0xde, 0xdb, 0x00, 0x2b, 0x59, 0x02, 0xa0, 0x8d, 0x03, 0x68, 0x51, 0x03, - 0x69, 0x4e, 0x02, 0x60, 0xbe, 0x01, 0x90, 0xad, 0x01, 0xef, 0x46, 0x01, 0x85, 0x24, 0x00, 0xa5, - 0x84, 0xff, 0xee, 0x88, 0xff, 0x21, 0x02, 0xff, 0x95, 0xc2, 0xfe, 0x57, 0x12, 0xff, 0x0b, 0x79, - 0xff, 0xdd, 0xa8, 0xff, 0xfa, 0x9c, 0xff, 0xc5, 0x07, 0x00, 0x6c, 0xeb, 0xff, 0x1d, 0xff, 0xfe, - 0x84, 0xc3, 0xfe, 0x6c, 0xb7, 0xfe, 0xdf, 0x99, 0x09, 0x5b, 0x6e, 0x10, 0xf3, 0x7e, 0x0a, 0x58, - 0x0a, 0x05, 0x17, 0xbb, 0x05, 0x98, 0x3f, 0x04, 0x7a, 0x00, 0x00, 0x62, 0x55, 0x01, 0xc7, 0xdc, - 0x04, 0x73, 0x4f, 0x02, 0x43, 0x7d, 0xff, 0x76, 0x1e, 0x01, 0xf4, 0x5c, 0x03, 0x62, 0x0e, 0x03, - 0xd5, 0x60, 0x02, 0x1b, 0xe7, 0x02, 0xf6, 0xde, 0x01, 0x18, 0xa5, 0x00, 0x73, 0x36, 0x01, 0xa5, - 0x6e, 0x01, 0x53, 0x02, 0x00, 0x80, 0x09, 0xff, 0x95, 0xe3, 0xff, 0x77, 0xcc, 0xff, 0x80, 0xc6, - 0xfe, 0x35, 0x51, 0xff, 0x1e, 0x32, 0x00, 0xfa, 0xf4, 0xff, 0xc8, 0x62, 0xff, 0x9c, 0x6b, 0xff, - 0x83, 0x6a, 0xff, 0x60, 0xcf, 0xfe, 0xe7, 0xa9, 0x09, 0xcf, 0x49, 0x10, 0x2a, 0x82, 0x0a, 0x74, - 0x0b, 0x06, 0x1c, 0xbf, 0x06, 0x82, 0x7a, 0x03, 0xf9, 0x7b, 0xfe, 0x84, 0x84, 0x01, 0xca, 0xdd, - 0x05, 0x54, 0xe4, 0x01, 0x31, 0x84, 0xfe, 0x3d, 0xad, 0x00, 0x49, 0xb5, 0x02, 0x1b, 0x15, 0x02, - 0xdc, 0x6d, 0x01, 0x54, 0x5e, 0x02, 0x6e, 0x19, 0x02, 0x90, 0x00, 0x01, 0x6b, 0xf9, 0x00, 0x77, - 0x38, 0x01, 0x96, 0x10, 0x01, 0x85, 0x67, 0x00, 0x0f, 0x00, 0x00, 0x6a, 0x18, 0x00, 0x45, 0x20, - 0x00, 0x70, 0xdd, 0xff, 0x35, 0x95, 0xff, 0x58, 0xb1, 0xff, 0x19, 0xc0, 0xff, 0xe7, 0x4f, 0xff, - 0xe9, 0xd6, 0xfe, 0x19, 0xfd, 0xfe, 0xcf, 0x40, 0x0a, 0xae, 0x6a, 0x11, 0x70, 0xf9, 0x0a, 0x1e, - 0xae, 0x05, 0xf5, 0xa1, 0x06, 0x0f, 0x8c, 0x03, 0xba, 0x3c, 0xfe, 0x00, 0x3b, 0x01, 0x69, 0xd1, - 0x05, 0x59, 0xd6, 0x01, 0xd8, 0x2e, 0xfe, 0x8f, 0x3f, 0x00, 0x19, 0x32, 0x02, 0xfa, 0xc3, 0x01, - 0x87, 0x19, 0x01, 0x37, 0x5d, 0x01, 0x3e, 0x32, 0x01, 0x0f, 0x52, 0x00, 0x19, 0x3d, 0x00, 0xa4, - 0x4b, 0x01, 0x54, 0x79, 0x01, 0x6a, 0x3f, 0x00, 0xd2, 0x3d, 0x00, 0x8f, 0x20, 0x01, 0xf5, 0xba, - 0x00, 0x33, 0x51, 0x00, 0xb2, 0xa3, 0x00, 0xe9, 0x4f, 0x00, 0x40, 0x6a, 0xff, 0x53, 0xf0, 0xfe, - 0x4e, 0xdc, 0xfe, 0x1a, 0xc5, 0xfe, 0x95, 0x24, 0x0b, 0xa3, 0x6e, 0x12, 0xb0, 0x2d, 0x0b, 0xf2, - 0x16, 0x06, 0x85, 0x11, 0x07, 0x8f, 0xea, 0x02, 0xa6, 0x82, 0xfd, 0xd6, 0xa0, 0x01, 0x2a, 0x3f, - 0x06, 0x00, 0x62, 0x01, 0x12, 0xbc, 0xfd, 0x77, 0x23, 0x00, 0x46, 0x44, 0x02, 0xbb, 0x6e, 0x01, - 0xeb, 0x57, 0x00, 0x35, 0x7a, 0x01, 0xda, 0x69, 0x01, 0xab, 0x61, 0xff, 0x5a, 0xd2, 0xfe, 0x89, - 0x3e, 0x00, 0x23, 0x39, 0x01, 0xaf, 0x64, 0x00, 0x22, 0x36, 0x00, 0x72, 0x0c, 0x01, 0xa4, 0x31, - 0x01, 0xcb, 0x54, 0x01, 0xd2, 0x38, 0x01, 0x12, 0xde, 0x00, 0x3f, 0x98, 0x00, 0x1c, 0x96, 0xff, - 0x92, 0x75, 0xfe, 0x47, 0x3d, 0xfe, 0xfb, 0x6e, 0x0c, 0x16, 0x1c, 0x14, 0xc1, 0x54, 0x0b, 0x46, - 0xab, 0x05, 0xd7, 0x23, 0x07, 0x4d, 0xcb, 0x02, 0x6d, 0x4e, 0xfd, 0x0d, 0xac, 0x01, 0x68, 0x1a, - 0x06, 0xb3, 0xee, 0x00, 0x3a, 0x8f, 0xfd, 0x52, 0x4d, 0x00, 0xb5, 0x00, 0x02, 0x56, 0x10, 0x01, - 0xa6, 0x19, 0x00, 0xa3, 0x11, 0x01, 0x05, 0x8a, 0x01, 0xe5, 0xac, 0xff, 0x63, 0x52, 0xfe, 0xe5, - 0xe3, 0xfe, 0x97, 0xef, 0xff, 0xad, 0x05, 0x00, 0x1c, 0xa0, 0xff, 0x2b, 0x73, 0x00, 0x82, 0x8f, - 0x01, 0x22, 0x8d, 0x01, 0x51, 0x6f, 0x01, 0x45, 0x9b, 0x01, 0x68, 0x38, 0x01, 0x17, 0x3c, 0x00, - 0xff, 0x3a, 0xff, 0x62, 0x8d, 0xfe, 0x33, 0x41, 0x0d, 0x89, 0xa7, 0x15, 0xd6, 0x23, 0x0c, 0xc0, - 0x5d, 0x05, 0x18, 0x0f, 0x07, 0x4c, 0xfb, 0x02, 0xaa, 0xc7, 0xfc, 0x18, 0x99, 0x01, 0xf6, 0x9a, - 0x06, 0x39, 0x64, 0x00, 0x17, 0xde, 0xfc, 0x32, 0x66, 0x00, 0xc0, 0x19, 0x02, 0x18, 0xec, 0x00, - 0xcb, 0xb1, 0xff, 0xc7, 0x6b, 0x00, 0xdb, 0x84, 0x01, 0x6f, 0x4d, 0x00, 0xc0, 0x43, 0xfe, 0x67, - 0x43, 0xfe, 0xb4, 0x5c, 0xff, 0xf1, 0x1a, 0xff, 0x57, 0xb8, 0xfe, 0x5f, 0xa8, 0xff, 0x52, 0xba, - 0x00, 0x64, 0x7a, 0x01, 0x80, 0xb6, 0x01, 0x67, 0x8f, 0x01, 0x25, 0x8f, 0x01, 0x98, 0xe0, 0x00, - 0x61, 0xc2, 0xff, 0x5a, 0x31, 0xff, 0xa1, 0xc1, 0x0e, 0x89, 0xc8, 0x17, 0xf5, 0x68, 0x0c, 0x42, - 0x73, 0x04, 0x11, 0x16, 0x07, 0x25, 0x54, 0x03, 0x8c, 0x6e, 0xfc, 0x7b, 0x88, 0x01, 0x9b, 0xd2, - 0x06, 0x3d, 0x07, 0x00, 0x08, 0x83, 0xfc, 0x0b, 0x7d, 0x00, 0x20, 0xdc, 0x01, 0xf7, 0x99, 0x00, - 0xeb, 0xc2, 0xff, 0x5e, 0x0f, 0x00, 0xa9, 0x34, 0x01, 0x71, 0x86, 0x00, 0xb4, 0x7a, 0xfe, 0xfa, - 0x42, 0xfe, 0x50, 0xe3, 0xfe, 0x0e, 0xd2, 0xfe, 0x22, 0x7f, 0xfe, 0x1a, 0xad, 0xfe, 0x87, 0xbc, - 0xff, 0x30, 0x0d, 0x01, 0x63, 0x76, 0x01, 0xaa, 0x25, 0x01, 0x1f, 0x7e, 0x01, 0x91, 0x35, 0x01, - 0x90, 0xf9, 0xff, 0xc3, 0x9f, 0xff, 0xd7, 0x93, 0x10, 0x3f, 0xf8, 0x19, 0x5d, 0x67, 0x0c, 0xbf, - 0xac, 0x03, 0x2b, 0x43, 0x07, 0x3c, 0x29, 0x03, 0xfa, 0xe1, 0xfb, 0xf9, 0x10, 0x02, 0xe2, 0xfe, - 0x06, 0xb1, 0x22, 0xff, 0xe5, 0x2d, 0xfc, 0x72, 0xcb, 0x00, 0x6a, 0xfd, 0x01, 0x9a, 0x06, 0x00, - 0xcb, 0x25, 0xff, 0x9b, 0xf8, 0xff, 0x3a, 0x10, 0x01, 0xd4, 0x86, 0x00, 0xc4, 0xa2, 0xfe, 0x5f, - 0x25, 0xfe, 0x13, 0xb3, 0xfe, 0xad, 0xb7, 0xfe, 0xfb, 0x4a, 0xfe, 0x55, 0x5b, 0xfe, 0x8a, 0x3a, - 0xff, 0x6f, 0x4e, 0x00, 0x4b, 0xfb, 0x00, 0x08, 0xac, 0x00, 0xbb, 0xbe, 0x00, 0x38, 0xe5, 0x00, - 0xb5, 0x0d, 0x00, 0xd2, 0xaf, 0xff, 0xc4, 0xb1, 0x12, 0x48, 0x68, 0x1c, 0xda, 0x23, 0x0c, 0xed, - 0xdc, 0x02, 0x97, 0x9a, 0x07, 0x5f, 0xc6, 0x02, 0x9e, 0x55, 0xfb, 0x78, 0xe6, 0x02, 0xb2, 0x22, - 0x07, 0x7d, 0x23, 0xfe, 0xe0, 0x08, 0xfc, 0xd9, 0x27, 0x01, 0x5b, 0x09, 0x02, 0xaa, 0xb1, 0xff, - 0x9d, 0xb5, 0xfe, 0xcf, 0xb2, 0xff, 0xec, 0xd2, 0x00, 0x12, 0x63, 0x00, 0x25, 0xc8, 0xfe, 0x72, - 0x82, 0xfe, 0xee, 0x98, 0xfe, 0x2c, 0x50, 0xfe, 0x01, 0x33, 0xfe, 0x95, 0x83, 0xfe, 0x33, 0x3f, - 0xff, 0xee, 0xae, 0xff, 0xe1, 0x97, 0x00, 0x17, 0x83, 0x00, 0xc6, 0x0f, 0x00, 0x69, 0x6a, 0x00, - 0x35, 0x82, 0xff, 0x3b, 0x15, 0xff, 0x16, 0xb1, 0x14, 0xed, 0xcc, 0x1e, 0xbe, 0x0c, 0x0c, 0xdc, - 0x2d, 0x02, 0x01, 0x06, 0x08, 0x40, 0x32, 0x02, 0x0a, 0x70, 0xfa, 0x86, 0xf2, 0x03, 0x0e, 0x94, - 0x07, 0x72, 0xef, 0xfc, 0x5f, 0xb6, 0xfb, 0x5f, 0x91, 0x01, 0xd4, 0x2e, 0x02, 0x20, 0x77, 0xff, - 0xfc, 0x31, 0xfe, 0x48, 0x49, 0xff, 0x58, 0x9a, 0x00, 0x11, 0x40, 0x00, 0x48, 0xa8, 0xfe, 0x2c, - 0xa6, 0xfe, 0xcf, 0xb4, 0xfe, 0x90, 0x24, 0xfe, 0xb1, 0xfd, 0xfd, 0x12, 0x66, 0xfe, 0x13, 0x9f, - 0xff, 0x03, 0x79, 0xff, 0x7b, 0xcb, 0xff, 0xf8, 0xc6, 0x00, 0x80, 0xff, 0xff, 0x48, 0x7a, 0xff, - 0x64, 0x05, 0xff, 0x42, 0x93, 0xfe, 0xfa, 0x8d, 0x16, 0xf2, 0x5f, 0x21, 0x8c, 0x3b, 0x0c, 0xff, - 0x38, 0x01, 0x7a, 0x64, 0x08, 0x1b, 0xc8, 0x01, 0xf3, 0x41, 0xf9, 0x84, 0xc9, 0x04, 0x57, 0x22, - 0x08, 0x95, 0xda, 0xfb, 0xf7, 0x67, 0xfb, 0x72, 0xdd, 0x01, 0x51, 0x1c, 0x02, 0xc8, 0x60, 0xff, - 0xb6, 0xf6, 0xfd, 0x5a, 0x9b, 0xfe, 0x34, 0x2c, 0x00, 0xaf, 0x3e, 0x00, 0x8d, 0x93, 0xfe, 0x5f, - 0x9e, 0xfe, 0x44, 0x95, 0xfe, 0x46, 0x05, 0xfe, 0xba, 0xfa, 0xfd, 0x64, 0x2d, 0xfe, 0x88, 0xc4, - 0xff, 0x60, 0xcd, 0xff, 0xc9, 0x33, 0xff, 0x3e, 0x5e, 0x00, 0x07, 0x5f, 0x00, 0x00, 0x18, 0xff, - 0x8e, 0x73, 0xfe, 0x64, 0x5f, 0xfe, 0xae, 0x0a, 0x18, 0x9f, 0xfb, 0x23, 0xf9, 0xeb, 0x0c, 0x1a, - 0x23, 0x00, 0x08, 0x9b, 0x08, 0x52, 0xd7, 0x01, 0xd6, 0x27, 0xf8, 0x76, 0x46, 0x05, 0xc4, 0xbe, - 0x08, 0x38, 0x1d, 0xfb, 0x3d, 0x2e, 0xfb, 0x58, 0x44, 0x02, 0x5c, 0x32, 0x02, 0x76, 0xf9, 0xfe, - 0xfd, 0xe8, 0xfd, 0x09, 0x72, 0xfe, 0x91, 0x6d, 0xff, 0xb7, 0x09, 0x00, 0xbb, 0x9f, 0xfe, 0x51, - 0xa5, 0xfe, 0xef, 0xb0, 0xfe, 0xf8, 0xe8, 0xfd, 0xe7, 0xca, 0xfd, 0x50, 0xe8, 0xfd, 0x81, 0xdb, - 0xff, 0x43, 0x8e, 0x00, 0x7e, 0x4d, 0xff, 0xd1, 0x61, 0xff, 0x45, 0x3f, 0x00, 0x76, 0x9e, 0xff, - 0x10, 0x2d, 0xfe, 0xaf, 0x26, 0xfe, 0xda, 0x51, 0x1a, 0xd2, 0x56, 0x26, 0x2b, 0xb4, 0x0c, 0x4a, - 0xa9, 0xff, 0x06, 0xe4, 0x08, 0x90, 0x16, 0x01, 0xaa, 0x58, 0xf7, 0x57, 0xf9, 0x05, 0x7a, 0x81, - 0x08, 0x55, 0x40, 0xfa, 0x66, 0xa5, 0xfb, 0x54, 0x69, 0x02, 0x01, 0x01, 0x02, 0x18, 0x9c, 0xfe, - 0x8d, 0xa0, 0xfd, 0xc4, 0xab, 0xfe, 0x9c, 0xba, 0xfe, 0x00, 0x3b, 0xff, 0x1a, 0x9d, 0xfe, 0x77, - 0xdf, 0xfe, 0x19, 0xcf, 0xfe, 0xc7, 0xaa, 0xfd, 0x95, 0x83, 0xfd, 0x4d, 0xb1, 0xfd, 0x84, 0xcf, - 0xff, 0x25, 0xc7, 0x00, 0x8c, 0xcf, 0xff, 0x88, 0x36, 0xff, 0x5f, 0x47, 0xff, 0x65, 0xbe, 0xff, - 0x8b, 0x6b, 0xfe, 0x04, 0x9e, 0xfd, 0x99, 0x1d, 0x1d, 0xbe, 0x37, 0x28, 0xa7, 0xda, 0x0b, 0xab, - 0x4c, 0x00, 0x8d, 0x33, 0x09, 0x72, 0xca, 0xff, 0x47, 0x12, 0xf7, 0x7e, 0x90, 0x06, 0xe0, 0x03, - 0x08, 0xd1, 0x6b, 0xf9, 0xa1, 0x60, 0xfc, 0xf8, 0xb8, 0x02, 0x5c, 0xc5, 0x01, 0x6c, 0x69, 0xfe, - 0x4c, 0x16, 0xfd, 0x5b, 0x34, 0xff, 0x97, 0x66, 0xfe, 0xc4, 0x0c, 0xfe, 0xd5, 0xa7, 0xfe, 0xc4, - 0x0b, 0xff, 0x4a, 0x01, 0xff, 0xe8, 0xc4, 0xfd, 0x7d, 0x27, 0xfd, 0x47, 0x89, 0xfd, 0x86, 0x00, - 0x00, 0xd3, 0xa5, 0x00, 0x15, 0xd6, 0xff, 0x69, 0x03, 0x00, 0x46, 0xfc, 0xfe, 0xf6, 0xcf, 0xfe, - 0x5f, 0x87, 0xfe, 0x55, 0xad, 0xfd, 0xf0, 0x5b, 0x1f, 0xa9, 0x98, 0x29, 0x45, 0xc2, 0x0b, 0xad, - 0x58, 0x01, 0x79, 0x4d, 0x09, 0x89, 0x2b, 0xff, 0x2d, 0xbb, 0xf6, 0x57, 0x4d, 0x06, 0x7f, 0xc8, - 0x07, 0x26, 0x25, 0xf9, 0xc9, 0xd7, 0xfc, 0x07, 0x9d, 0x02, 0x1e, 0xe5, 0x01, 0x12, 0xb7, 0xfe, - 0x8b, 0x34, 0xfc, 0xd5, 0x5f, 0xff, 0xf2, 0x9c, 0xfe, 0xb8, 0x2a, 0xfd, 0xd7, 0x33, 0xfe, 0xcf, - 0x15, 0xff, 0xc9, 0x3e, 0xff, 0x44, 0x14, 0xfe, 0x94, 0x47, 0xfd, 0x5a, 0x0c, 0xfd, 0x2b, 0xee, - 0xff, 0x4c, 0x00, 0x01, 0x7c, 0x94, 0xff, 0x46, 0x66, 0x00, 0xd7, 0x6b, 0xff, 0x50, 0x24, 0xfe, - 0xdf, 0x2a, 0xfe, 0x52, 0xcd, 0xfd, 0x9e, 0x2c, 0x21, 0x0b, 0x6b, 0x2a, 0x90, 0x1e, 0x0c, 0xd4, - 0xc5, 0x02, 0xb5, 0x65, 0x09, 0xfe, 0x34, 0xff, 0xa4, 0x1f, 0xf6, 0xfc, 0x43, 0x05, 0xcc, 0xe0, - 0x07, 0x90, 0xf2, 0xf8, 0x69, 0x31, 0xfd, 0x0f, 0x92, 0x02, 0xb2, 0x9b, 0x01, 0xdf, 0x55, 0xff, - 0xbc, 0xcd, 0xfb, 0x1e, 0xd6, 0xfe, 0x82, 0xd6, 0xfe, 0x45, 0x09, 0xfd, 0xec, 0x37, 0xfd, 0x02, - 0x9d, 0xfe, 0x52, 0xe3, 0xff, 0xb2, 0x40, 0xfe, 0xe7, 0x95, 0xfd, 0x19, 0xcb, 0xfc, 0x7a, 0x35, - 0xff, 0x57, 0xcf, 0x01, 0x98, 0x9c, 0xff, 0xc2, 0xd1, 0xff, 0x21, 0xe2, 0xff, 0x2a, 0x48, 0xfe, - 0x96, 0xe1, 0xfd, 0x8f, 0x5b, 0xfd, 0x3c, 0x4f, 0x23, 0x4d, 0x95, 0x2a, 0xf5, 0xc4, 0x0b, 0x77, - 0xa6, 0x04, 0x6f, 0x8c, 0x0a, 0x1e, 0x24, 0xff, 0x75, 0xa8, 0xf4, 0xf6, 0xa5, 0x04, 0x1c, 0x20, - 0x08, 0xcd, 0x21, 0xf8, 0x74, 0x81, 0xfd, 0xdc, 0xf8, 0x02, 0x18, 0x13, 0x01, 0x19, 0x60, 0xff, - 0x9b, 0x2b, 0xfc, 0x5a, 0x67, 0xfe, 0xec, 0x4e, 0xfe, 0xc0, 0x61, 0xfd, 0x4c, 0x8c, 0xfc, 0xdd, - 0x76, 0xfd, 0x92, 0x69, 0x00, 0x55, 0xc6, 0xfe, 0x7e, 0x7f, 0xfd, 0x12, 0x02, 0xfd, 0xba, 0xb8, - 0xfe, 0xa8, 0xc6, 0x01, 0xa0, 0x4e, 0x00, 0xf1, 0x2b, 0xff, 0x91, 0x92, 0xff, 0x6c, 0xfe, 0xfe, - 0xc4, 0xcf, 0xfd, 0x73, 0xad, 0xfc, 0xf9, 0x87, 0x26, 0xf2, 0x28, 0x2a, 0x19, 0x28, 0x09, 0x4c, - 0xa6, 0x07, 0x1a, 0xc2, 0x0d, 0xd7, 0x8a, 0xfd, 0x12, 0x9c, 0xf2, 0xec, 0x87, 0x05, 0xb1, 0x04, - 0x08, 0x4c, 0xa7, 0xf6, 0xdf, 0xf3, 0xfd, 0xb1, 0x8f, 0x03, 0x28, 0xd4, 0x00, 0x60, 0xdd, 0xfe, - 0xe4, 0x99, 0xfc, 0xb5, 0xd1, 0xfe, 0x8e, 0x50, 0xfd, 0x91, 0x51, 0xfd, 0xdc, 0xc1, 0xfc, 0x14, - 0x5d, 0xfc, 0x37, 0xfd, 0xff, 0xbe, 0xa7, 0xff, 0x03, 0x98, 0xfd, 0x01, 0x18, 0xfd, 0x72, 0x1f, - 0xff, 0x28, 0x26, 0x01, 0xfe, 0x89, 0x00, 0xc6, 0x86, 0xff, 0x43, 0x21, 0xff, 0x53, 0x12, 0xff, - 0x01, 0xdd, 0xfd, 0xa4, 0x8c, 0xfc, 0xe6, 0x61, 0x29, 0xa5, 0x37, 0x29, 0x7d, 0xf1, 0x05, 0x25, - 0x0c, 0x0c, 0x61, 0x71, 0x12, 0x33, 0x62, 0xfa, 0xb3, 0x3c, 0xf0, 0xce, 0x52, 0x08, 0x4c, 0xe6, - 0x07, 0x97, 0xcc, 0xf3, 0xa8, 0x5f, 0xfe, 0x21, 0xe4, 0x04, 0xb1, 0xe5, 0x00, 0x92, 0x20, 0xfe, - 0xae, 0x82, 0xfc, 0x61, 0xaf, 0xff, 0x33, 0x06, 0xfd, 0x8f, 0xe5, 0xfc, 0x26, 0xfe, 0xfc, 0xec, - 0xb5, 0xfb, 0x39, 0xbf, 0xfe, 0xda, 0x7e, 0x00, 0x21, 0xb5, 0xfe, 0x74, 0x69, 0xfc, 0x80, 0xab, - 0xff, 0x91, 0x30, 0x01, 0x89, 0x07, 0x00, 0x6e, 0x92, 0x00, 0xa3, 0xe8, 0xfe, 0x68, 0x5f, 0xfe, - 0x02, 0x51, 0xfe, 0x72, 0x1c, 0xfd, 0xc5, 0x7d, 0x2a, 0x46, 0x22, 0x28, 0x47, 0x00, 0x04, 0xfb, - 0xad, 0x10, 0x07, 0x37, 0x17, 0x5c, 0xcd, 0xf6, 0xf5, 0x09, 0xee, 0x07, 0xd8, 0x0c, 0x99, 0xcb, - 0x07, 0x48, 0xe1, 0xee, 0x82, 0x92, 0xfe, 0x04, 0x6a, 0x07, 0x40, 0x1b, 0x01, 0xd2, 0xfb, 0xfc, - 0x0d, 0xd3, 0xfb, 0x14, 0xb6, 0x00, 0x99, 0x6d, 0xfd, 0x28, 0x5b, 0xfc, 0xaf, 0x0a, 0xfd, 0x9d, - 0x5b, 0xfb, 0x8c, 0x26, 0xfd, 0x57, 0x74, 0x00, 0x87, 0x76, 0x00, 0x11, 0x02, 0xfc, 0xa0, 0x79, - 0xff, 0x69, 0xcc, 0x01, 0x68, 0x70, 0xff, 0xf3, 0x39, 0x01, 0xf5, 0x57, 0xff, 0x79, 0xba, 0xfd, - 0x10, 0x75, 0xfe, 0x5b, 0xa0, 0xfd, 0xa9, 0x02, 0x2d, 0xc0, 0x8b, 0x2a, 0xba, 0x2d, 0x00, 0xb6, - 0x72, 0x0e, 0xe1, 0x31, 0x1c, 0xd8, 0xdc, 0xf8, 0x00, 0x5d, 0xeb, 0x23, 0x64, 0x0d, 0x16, 0x5e, - 0x08, 0x1c, 0xbb, 0xeb, 0xe4, 0x38, 0xfe, 0xdb, 0x4d, 0x09, 0x61, 0xd0, 0x00, 0x40, 0xd0, 0xfb, - 0x86, 0x6f, 0xfb, 0xbb, 0xc8, 0x01, 0x74, 0x68, 0xfd, 0x5e, 0x3d, 0xfb, 0x2d, 0x64, 0xfd, 0x0f, - 0xbb, 0xfb, 0x0e, 0xe4, 0xfb, 0xb6, 0xda, 0xfe, 0x4c, 0x92, 0x01, 0x36, 0x34, 0xfd, 0x3b, 0x97, - 0xfe, 0x2d, 0x15, 0x02, 0x65, 0xae, 0xff, 0x86, 0x19, 0x01, 0x87, 0xcb, 0xff, 0x83, 0x8b, 0xfd, - 0x42, 0x60, 0xfe, 0x23, 0xaa, 0xfd, 0x24, 0x4e, 0x31, 0xc9, 0x16, 0x2d, 0xc6, 0x0c, 0xfc, 0xba, - 0xea, 0x09, 0x89, 0x95, 0x1f, 0xfe, 0x33, 0xfd, 0x97, 0xf3, 0xe9, 0xd6, 0xba, 0x0c, 0x4d, 0x1d, - 0x08, 0x62, 0xfc, 0xe9, 0xd6, 0xf1, 0xfd, 0x89, 0x91, 0x0a, 0x48, 0x0b, 0x01, 0x27, 0x2e, 0xfa, - 0x69, 0x2c, 0xfb, 0x2d, 0x02, 0x03, 0x61, 0x7a, 0xfd, 0xf4, 0x2d, 0xfa, 0x0d, 0x43, 0xfd, 0x9c, - 0x88, 0xfc, 0xca, 0x80, 0xfb, 0xdb, 0x1b, 0xfd, 0x63, 0x4b, 0x01, 0x52, 0x01, 0xff, 0x3f, 0x8a, - 0xfe, 0x9a, 0x8b, 0x01, 0xc3, 0x95, 0x00, 0x03, 0x1b, 0x01, 0x2a, 0xc6, 0xff, 0x56, 0xfe, 0xfd, - 0x82, 0x7a, 0xfe, 0x4a, 0x47, 0xfd, 0x1c, 0xa0, 0x35, 0xf9, 0xeb, 0x2f, 0x5b, 0xd8, 0xf7, 0x4e, - 0x49, 0x05, 0x92, 0xea, 0x20, 0xd2, 0xae, 0x01, 0xc7, 0x0e, 0xeb, 0xda, 0x23, 0x0b, 0xf5, 0x5e, - 0x07, 0xe3, 0x4c, 0xe9, 0x4a, 0x4d, 0xfd, 0x27, 0x88, 0x0b, 0x5e, 0x89, 0x01, 0x81, 0x96, 0xf8, - 0xbe, 0xaf, 0xfa, 0x78, 0xea, 0x03, 0x84, 0x8a, 0xfd, 0x8f, 0x5d, 0xf9, 0xd4, 0xcf, 0xfc, 0xd4, - 0x12, 0xfd, 0xf4, 0xba, 0xfb, 0x1f, 0xad, 0xfb, 0x5a, 0xf5, 0xff, 0xf2, 0x90, 0x00, 0x3a, 0x60, - 0xff, 0xef, 0x7b, 0x00, 0xe6, 0x68, 0x01, 0xf2, 0xa6, 0x01, 0x3b, 0x91, 0xff, 0xfa, 0xbf, 0xfe, - 0x9a, 0xb2, 0xfe, 0xf7, 0x87, 0xfc, 0x34, 0x94, 0x39, 0xca, 0x59, 0x33, 0xb4, 0xe8, 0xf4, 0xf5, - 0xfc, 0xff, 0x77, 0x78, 0x20, 0xcd, 0x4f, 0x06, 0x58, 0x7c, 0xed, 0xee, 0xb3, 0x09, 0x5e, 0xff, - 0x05, 0xe2, 0x14, 0xe9, 0xd7, 0xd7, 0xfc, 0xe3, 0xa8, 0x0b, 0x9c, 0x79, 0x02, 0x44, 0x5f, 0xf7, - 0x22, 0xe7, 0xf9, 0x98, 0xb6, 0x04, 0x2a, 0x89, 0xfd, 0xdc, 0x24, 0xf9, 0xe6, 0x3b, 0xfc, 0xd7, - 0x48, 0xfd, 0x41, 0x86, 0xfc, 0x27, 0xd7, 0xfa, 0x5f, 0x4b, 0xfe, 0x30, 0x1e, 0x01, 0x4d, 0xe4, - 0x00, 0x6e, 0xd5, 0xff, 0x40, 0x7d, 0x01, 0x2f, 0xa7, 0x02, 0xbf, 0xc7, 0xff, 0x8a, 0x74, 0xff, - 0xe5, 0xcd, 0xfe, 0x29, 0xe1, 0xfb, 0x4c, 0x29, 0x3d, 0x2f, 0x13, 0x37, 0xfd, 0x02, 0xf3, 0x50, - 0x5e, 0xfa, 0xfa, 0xca, 0x1e, 0x79, 0xfa, 0x09, 0x80, 0x78, 0xf0, 0x3e, 0x96, 0x09, 0xbd, 0xe7, - 0x03, 0xcb, 0x91, 0xe8, 0x7f, 0x42, 0xfd, 0x25, 0xfe, 0x0a, 0xe0, 0x1c, 0x03, 0x16, 0xed, 0xf6, - 0x32, 0xdf, 0xf8, 0xce, 0xf2, 0x04, 0xfa, 0x79, 0xfd, 0x5f, 0x41, 0xf9, 0xa1, 0x9e, 0xfb, 0x9c, - 0x2c, 0xfd, 0x13, 0x4e, 0xfd, 0xcc, 0xb2, 0xfa, 0xf3, 0x0d, 0xfd, 0x24, 0x44, 0x00, 0x7b, 0x43, - 0x02, 0xfe, 0x44, 0x00, 0xe0, 0xe1, 0x00, 0xba, 0x8d, 0x03, 0x3d, 0x9a, 0x00, 0x1a, 0xe2, 0xff, - 0xb5, 0x9f, 0xfe, 0x3f, 0x87, 0xfb, 0x9f, 0xf3, 0x3f, 0xa0, 0x58, 0x3b, 0xbc, 0xdb, 0xf1, 0xf6, - 0xca, 0xf4, 0x63, 0x9b, 0x1c, 0x9e, 0x22, 0x0c, 0xe8, 0x49, 0xf3, 0xe3, 0x0a, 0x0b, 0x7e, 0xc9, - 0x01, 0xfc, 0x3d, 0xe7, 0x2b, 0x9d, 0xfe, 0xfb, 0x0a, 0x0a, 0x8f, 0xc0, 0x02, 0xc3, 0x6c, 0xf7, - 0x71, 0xf1, 0xf7, 0x81, 0x48, 0x04, 0x3b, 0x50, 0xfd, 0x49, 0xb8, 0xf9, 0x37, 0x0f, 0xfb, 0xf0, - 0xc7, 0xfc, 0x32, 0x07, 0xfe, 0x8f, 0xff, 0xfa, 0x76, 0x78, 0xfc, 0xac, 0xb2, 0xfe, 0x93, 0xba, - 0x02, 0x44, 0x51, 0x01, 0xb3, 0x6b, 0x00, 0x5f, 0x35, 0x04, 0x3a, 0xaa, 0x01, 0x2a, 0x1e, 0x00, - 0xb1, 0x5a, 0xfe, 0x36, 0x88, 0xfb, 0x65, 0xae, 0x43, 0x43, 0x2d, 0x3f, 0x5d, 0x6a, 0xef, 0x51, - 0x4c, 0xf1, 0x19, 0xb8, 0x1a, 0xb5, 0x76, 0x0b, 0xaa, 0x03, 0xf6, 0x93, 0x07, 0x0e, 0xd2, 0xc1, - 0xff, 0x25, 0x2b, 0xe5, 0xb2, 0xde, 0x00, 0x38, 0x71, 0x09, 0x6d, 0x25, 0x01, 0x3f, 0x7f, 0xf8, - 0x53, 0xb9, 0xf7, 0x51, 0xfb, 0x02, 0x71, 0xa5, 0xfc, 0x37, 0xa0, 0xfa, 0xce, 0xd0, 0xfa, 0x97, - 0x0e, 0xfc, 0xcb, 0x18, 0xff, 0x6e, 0x5a, 0xfb, 0x2e, 0x47, 0xfc, 0xf3, 0x94, 0xfd, 0x76, 0x3c, - 0x02, 0xc3, 0x38, 0x02, 0x49, 0x66, 0x00, 0x58, 0x1f, 0x05, 0xb5, 0xd4, 0x02, 0x69, 0xd3, 0xff, - 0xa3, 0x45, 0xfe, 0xb9, 0xc4, 0xfb, 0xfc, 0xa2, 0x4a, 0x3f, 0x0b, 0x40, 0x04, 0x92, 0xe9, 0x6d, - 0x8a, 0xf2, 0xaa, 0xff, 0x18, 0xa5, 0xec, 0x06, 0x3a, 0xad, 0xf9, 0xde, 0x5e, 0x11, 0xf1, 0xcf, - 0xfc, 0xad, 0xb1, 0xe3, 0xed, 0xc4, 0x03, 0x66, 0xbc, 0x08, 0x79, 0x83, 0xfe, 0xe6, 0xcb, 0xf9, - 0x82, 0xfb, 0xf7, 0xd1, 0x17, 0x01, 0xcf, 0xd2, 0xfb, 0x0a, 0x3f, 0xfb, 0xe3, 0xe6, 0xfa, 0x86, - 0x85, 0xfb, 0x59, 0xf9, 0xff, 0x59, 0xcd, 0xfb, 0x59, 0x0e, 0xfc, 0x26, 0x1f, 0xfd, 0xf4, 0x6e, - 0x01, 0xda, 0x62, 0x02, 0x45, 0x86, 0x00, 0x4d, 0x66, 0x06, 0x7b, 0x38, 0x04, 0xd0, 0xc3, 0xfe, - 0xd4, 0x24, 0xfe, 0x06, 0x3f, 0xfc, 0x59, 0x5c, 0x51, 0x53, 0xcd, 0x40, 0xa5, 0xe4, 0xe3, 0x04, - 0x18, 0xf5, 0x5f, 0xbf, 0x16, 0x19, 0xa0, 0x01, 0x9c, 0x3f, 0xfd, 0x33, 0x93, 0x13, 0x01, 0x37, - 0xfb, 0x80, 0xfe, 0xe2, 0x19, 0xb4, 0x05, 0xdd, 0x09, 0x08, 0xce, 0xec, 0xfb, 0x40, 0xc0, 0xfb, - 0x96, 0xb9, 0xf7, 0xfa, 0xda, 0xfe, 0x04, 0xda, 0xfb, 0x4a, 0x3a, 0xfb, 0x39, 0x50, 0xfb, 0x44, - 0xb6, 0xfb, 0xdf, 0x0e, 0x00, 0xc7, 0x8e, 0xfc, 0xe5, 0x48, 0xfc, 0xea, 0x6b, 0xfc, 0xa3, 0x01, - 0x01, 0xe0, 0x3f, 0x02, 0x46, 0x2a, 0x00, 0x2e, 0x04, 0x08, 0x0e, 0xef, 0x05, 0x9c, 0x85, 0xfd, - 0xb0, 0xa9, 0xfd, 0xec, 0xe3, 0xfc, 0x22, 0x81, 0x56, 0xd8, 0x2c, 0x42, 0xfb, 0x0a, 0xe0, 0x2f, - 0x5b, 0xf7, 0x33, 0x82, 0x14, 0x56, 0x96, 0xfc, 0x83, 0xc5, 0xff, 0xa9, 0xf4, 0x14, 0x3e, 0x01, - 0xfb, 0xe8, 0x81, 0xe3, 0xa7, 0x51, 0x06, 0xe4, 0x0e, 0x07, 0x0c, 0x63, 0xfa, 0x54, 0x8a, 0xfd, - 0x6e, 0x2e, 0xf7, 0x05, 0xc6, 0xfc, 0xbc, 0x22, 0xfc, 0x3f, 0x80, 0xfb, 0xe7, 0xbe, 0xfb, 0x98, - 0xf7, 0xfb, 0xf6, 0x09, 0x00, 0x2f, 0x4b, 0xfd, 0x08, 0xf9, 0xfc, 0xf3, 0xad, 0xfb, 0xc6, 0xb9, - 0x00, 0x5e, 0x86, 0x02, 0x15, 0x4e, 0xff, 0x89, 0x16, 0x09, 0x4e, 0xe6, 0x07, 0x1e, 0xce, 0xfc, - 0x99, 0xb8, 0xfc, 0x2b, 0x48, 0xfd, 0x36, 0xa9, 0x59, 0xd1, 0x0f, 0x44, 0x65, 0x87, 0xde, 0x3f, - 0x7f, 0xf8, 0x15, 0x0d, 0x12, 0xd6, 0x02, 0xf8, 0xf2, 0x9c, 0x00, 0x77, 0x8f, 0x15, 0x23, 0xb2, - 0xfb, 0xfc, 0x98, 0xe4, 0xb7, 0xc3, 0x05, 0x45, 0xaf, 0x05, 0xc0, 0x6b, 0xf9, 0x0e, 0xd8, 0xfe, - 0x72, 0xa6, 0xf6, 0xf3, 0xa7, 0xfa, 0x64, 0x4a, 0xfc, 0x5c, 0x7e, 0xfc, 0x2d, 0x83, 0xfb, 0xb5, - 0xa4, 0xfb, 0x0c, 0xa3, 0x00, 0x23, 0x53, 0xfd, 0xba, 0xbf, 0xfd, 0x3e, 0x6b, 0xfb, 0x10, 0xea, - 0xff, 0x45, 0xa0, 0x03, 0x69, 0x37, 0xfe, 0xe3, 0x10, 0x08, 0xab, 0x7c, 0x09, 0x1f, 0x6f, 0xfd, - 0x58, 0x56, 0xfb, 0xe3, 0xa8, 0xfc, 0x94, 0xf3, 0x5a, 0xa1, 0x16, 0x46, 0xe5, 0xb8, 0xdf, 0x26, - 0xf3, 0xf8, 0x1d, 0x68, 0x0f, 0xf7, 0x42, 0xf4, 0xf8, 0xfa, 0xff, 0x44, 0xb0, 0x15, 0x63, 0x0b, - 0xfd, 0x7b, 0x20, 0xe6, 0x3c, 0xdf, 0x04, 0xf7, 0x06, 0x04, 0xa6, 0xc0, 0xf8, 0x59, 0x04, 0x00, - 0xc3, 0x6b, 0xf6, 0x6a, 0xe4, 0xf8, 0xe9, 0x8b, 0xfc, 0xc0, 0xca, 0xfd, 0xec, 0xd3, 0xfa, 0x8f, - 0xfa, 0xfa, 0xb2, 0xe3, 0x01, 0x4e, 0xd8, 0xfc, 0xfc, 0x57, 0xfe, 0x8a, 0x56, 0xfc, 0x3b, 0xc5, - 0xfe, 0x62, 0x0e, 0x05, 0x03, 0x66, 0xfd, 0xd5, 0xc2, 0x04, 0xe8, 0x4d, 0x0a, 0xee, 0xa5, 0xff, - 0x6e, 0x80, 0xfa, 0x51, 0x89, 0xfb, 0xb6, 0x34, 0x5a, 0xb2, 0xbc, 0x48, 0x03, 0x4f, 0xe3, 0xd9, - 0xec, 0xf8, 0x9c, 0x79, 0x0c, 0xa3, 0x67, 0xf1, 0xcd, 0x5d, 0xfe, 0x23, 0xcb, 0x14, 0xa1, 0x59, - 0xff, 0xe0, 0xc3, 0xe7, 0xa6, 0xb6, 0x03, 0x94, 0xa3, 0x02, 0xa3, 0xb0, 0xf7, 0xf7, 0x9e, 0x01, - 0xf6, 0xcb, 0xf6, 0x83, 0x93, 0xf7, 0xfa, 0xd7, 0xfc, 0xdf, 0x96, 0xfe, 0x18, 0x73, 0xfa, 0x18, - 0xfd, 0xf9, 0xa3, 0x6b, 0x03, 0xc6, 0x63, 0xfc, 0x48, 0x59, 0xfe, 0xbb, 0x16, 0xff, 0xcc, 0x4f, - 0xfd, 0x51, 0x09, 0x05, 0x96, 0xbe, 0xfd, 0x4c, 0xc5, 0x00, 0x84, 0x20, 0x09, 0xba, 0x86, 0x02, - 0x89, 0x02, 0xfc, 0xac, 0x26, 0xfa, 0x62, 0x30, 0x59, 0x15, 0xb7, 0x49, 0x38, 0x8d, 0xe8, 0xe5, - 0xaa, 0xf9, 0x0b, 0xd1, 0x08, 0x58, 0xa2, 0xef, 0x82, 0x75, 0xfb, 0xc1, 0x91, 0x13, 0x4a, 0xe7, - 0x01, 0x0e, 0xc7, 0xe8, 0xa3, 0x4e, 0x03, 0x62, 0xf5, 0x00, 0xfe, 0x88, 0xf6, 0x3a, 0xbc, 0x03, - 0x02, 0xbb, 0xf7, 0x95, 0x8f, 0xf6, 0x08, 0xa5, 0xfc, 0x3b, 0x3b, 0xff, 0xef, 0x11, 0xfa, 0x53, - 0x36, 0xf9, 0x74, 0xc6, 0x04, 0x83, 0xe8, 0xfb, 0xac, 0xea, 0xfe, 0x08, 0x0e, 0x02, 0x26, 0xdc, - 0xfa, 0x73, 0xf3, 0x03, 0xbf, 0x89, 0xff, 0x3c, 0x0e, 0xfd, 0xd0, 0xf7, 0x05, 0x6c, 0xa4, 0x05, - 0x71, 0xfa, 0xfe, 0xec, 0x06, 0xf9, 0x8b, 0x26, 0x57, 0xf2, 0x6e, 0x4a, 0x24, 0x82, 0xee, 0x1e, - 0x57, 0xfa, 0x88, 0xbf, 0x05, 0xe9, 0xd2, 0xed, 0xe7, 0x67, 0xf7, 0xc8, 0x77, 0x12, 0x84, 0xf6, - 0x03, 0x61, 0x2f, 0xe9, 0x47, 0x5d, 0x03, 0xeb, 0x27, 0xff, 0xc6, 0x92, 0xf5, 0x04, 0x6a, 0x06, - 0x0c, 0x99, 0xf8, 0x76, 0xa5, 0xf5, 0xa9, 0x13, 0xfc, 0xdd, 0x05, 0xff, 0xcd, 0x9f, 0xfa, 0x06, - 0x32, 0xf8, 0x53, 0x46, 0x05, 0x44, 0x6c, 0xfd, 0x18, 0xf7, 0xfd, 0x3b, 0x12, 0x03, 0x97, 0x29, - 0xfa, 0x97, 0x88, 0x01, 0x58, 0x32, 0x01, 0xb0, 0xf0, 0xfb, 0x4d, 0xd8, 0x01, 0xed, 0x52, 0x06, - 0x35, 0xfc, 0x02, 0x2b, 0x7f, 0xfa, 0xb0, 0xbd, 0x54, 0x78, 0x27, 0x4b, 0xea, 0xa8, 0xf3, 0x28, - 0xa1, 0xfc, 0x75, 0x06, 0x04, 0x81, 0xcb, 0xea, 0x9c, 0x76, 0xf4, 0x72, 0xfb, 0x10, 0x7c, 0x0d, - 0x05, 0x58, 0x5c, 0xea, 0xe4, 0x45, 0x03, 0x57, 0x89, 0xfe, 0x63, 0x39, 0xf5, 0xfc, 0x16, 0x09, - 0xf8, 0xf4, 0xf9, 0xee, 0x5f, 0xf4, 0x41, 0xe0, 0xfb, 0xa9, 0x9b, 0xfe, 0x8e, 0x62, 0xfb, 0x4e, - 0x8c, 0xf8, 0x02, 0x68, 0x05, 0xf7, 0x32, 0xfe, 0x4b, 0x3d, 0xfc, 0x44, 0xd2, 0x03, 0x2a, 0xaf, - 0xfa, 0x5b, 0x93, 0xfe, 0xb9, 0x52, 0x03, 0xf0, 0x80, 0xfd, 0xb4, 0x52, 0xfd, 0x92, 0x9b, 0x05, - 0x88, 0x55, 0x07, 0xf8, 0x2a, 0xfc, 0x99, 0x5d, 0x51, 0x89, 0x42, 0x4c, 0x2f, 0x65, 0xf8, 0xda, - 0xce, 0xfe, 0x6b, 0xbe, 0x03, 0xf3, 0x4f, 0xe7, 0x5f, 0x79, 0xf1, 0x84, 0x14, 0x0f, 0x45, 0x36, - 0x05, 0xca, 0x45, 0xec, 0x91, 0x12, 0x03, 0x11, 0x63, 0xfe, 0xa2, 0xbc, 0xf5, 0x43, 0x1a, 0x0b, - 0x59, 0xdb, 0xfa, 0x33, 0xad, 0xf3, 0x64, 0x5d, 0xfb, 0x9d, 0x9d, 0xfd, 0x15, 0x4f, 0xfe, 0x52, - 0xaf, 0xf8, 0xc7, 0x4b, 0x02, 0x12, 0xc3, 0xff, 0x81, 0x74, 0xfb, 0xfa, 0x1a, 0x02, 0xff, 0xd6, - 0xfc, 0xb9, 0x20, 0xfe, 0xf5, 0xfb, 0x01, 0xec, 0xe4, 0x00, 0xa0, 0xa4, 0xfd, 0x8b, 0xd6, 0x00, - 0xa9, 0xa2, 0x07, 0x51, 0xea, 0xff, 0x05, 0xab, 0x4e, 0x5b, 0xa6, 0x4b, 0x1a, 0xba, 0xfc, 0x9d, - 0x03, 0x01, 0xcd, 0x9f, 0x03, 0xd0, 0xf1, 0xe4, 0x86, 0xe0, 0xed, 0x74, 0x7c, 0x0c, 0x89, 0x16, - 0x05, 0x9d, 0xf1, 0xee, 0x22, 0xf8, 0x02, 0x85, 0x5b, 0xfe, 0xc5, 0xeb, 0xf6, 0x4a, 0x44, 0x0c, - 0xd1, 0xdb, 0xfb, 0x0f, 0xde, 0xf1, 0xcf, 0x25, 0xfc, 0x59, 0xd0, 0xfe, 0x68, 0xcb, 0xfd, 0x02, - 0x81, 0xf8, 0x1d, 0x35, 0x00, 0x37, 0x33, 0xff, 0x0b, 0xae, 0xfb, 0xd4, 0xb6, 0x01, 0x60, 0x0c, - 0xfe, 0xde, 0x4f, 0xfe, 0x8c, 0x33, 0x01, 0x45, 0x9c, 0x04, 0x9f, 0x4d, 0xff, 0x6f, 0x5c, 0xfa, - 0xf7, 0x56, 0x06, 0xd6, 0x12, 0x04, 0x37, 0x15, 0x4d, 0xc9, 0x85, 0x49, 0xb4, 0x88, 0xff, 0xa7, - 0x80, 0x04, 0x6a, 0x6a, 0x03, 0x45, 0xd4, 0xe2, 0xb8, 0x25, 0xeb, 0x41, 0xd0, 0x08, 0x60, 0xdf, - 0x04, 0x64, 0xbe, 0xf3, 0x7c, 0x28, 0x02, 0x66, 0xfd, 0xfc, 0x7f, 0x1a, 0xfb, 0x21, 0xa6, 0x0b, - 0x47, 0x58, 0xfa, 0xe0, 0xb7, 0xf4, 0xfc, 0x90, 0xfc, 0xc5, 0xa4, 0xfc, 0xfe, 0x65, 0xfe, 0x7b, - 0x5f, 0xf8, 0xf1, 0xcd, 0xfc, 0x7d, 0x7d, 0xff, 0xeb, 0x13, 0xfe, 0x66, 0x59, 0x00, 0x4c, 0x76, - 0xfd, 0xc0, 0x52, 0x02, 0x1a, 0x7d, 0x01, 0x17, 0x27, 0x02, 0x46, 0x18, 0x03, 0xf5, 0x42, 0xfa, - 0x60, 0x85, 0x00, 0x3a, 0xa7, 0x03, 0x77, 0x7b, 0x4b, 0x5d, 0x7d, 0x47, 0x65, 0x46, 0x01, 0xb3, - 0xb5, 0x07, 0xec, 0x82, 0x03, 0x23, 0x52, 0xe1, 0xda, 0xde, 0xe7, 0x72, 0x46, 0x05, 0x83, 0x4d, - 0x06, 0xbc, 0x78, 0xf7, 0xdd, 0xc4, 0x01, 0x18, 0x77, 0xfc, 0xa4, 0xdf, 0xfc, 0x10, 0xf2, 0x0b, - 0x59, 0x0b, 0xfb, 0x90, 0x75, 0xf5, 0xe8, 0xe4, 0xfb, 0x2c, 0xd4, 0xfb, 0x3b, 0x6e, 0xfd, 0xa8, - 0x2d, 0xf7, 0xea, 0xc7, 0xfc, 0x07, 0x58, 0x00, 0x91, 0x1c, 0xfd, 0x8c, 0x83, 0x01, 0x90, 0xe7, - 0xff, 0x28, 0xbc, 0x01, 0xcc, 0x21, 0x01, 0xd9, 0x6e, 0x02, 0x9b, 0x77, 0x05, 0x05, 0x3d, 0xfb, - 0x46, 0x7d, 0xfb, 0x4f, 0xaa, 0x00, 0x61, 0xcc, 0x4b, 0xfc, 0xe3, 0x42, 0x75, 0xd7, 0x01, 0x4d, - 0x73, 0x0c, 0xa0, 0xce, 0x01, 0xbe, 0xa2, 0xdf, 0xb2, 0x7c, 0xe7, 0xb3, 0x84, 0x01, 0x3a, 0xbe, - 0x06, 0xb0, 0xc9, 0xfd, 0x89, 0xdd, 0xff, 0x3b, 0x89, 0xf9, 0x37, 0x92, 0x02, 0x3f, 0x7d, 0x0b, - 0x75, 0xb7, 0xf8, 0x0e, 0x4f, 0xf8, 0x60, 0xd2, 0xfa, 0xc3, 0xa4, 0xf8, 0x00, 0xd0, 0xfd, 0xa5, - 0x12, 0xf9, 0x1d, 0x3c, 0xfb, 0xce, 0xa3, 0xff, 0x48, 0x3e, 0x00, 0x32, 0x77, 0x02, 0x68, 0x97, - 0xfe, 0xde, 0x08, 0x01, 0xc6, 0x65, 0x03, 0xaa, 0xc2, 0x03, 0x42, 0xed, 0x02, 0x08, 0xe1, 0xfc, - 0x16, 0x69, 0xfc, 0x77, 0x7c, 0xfb, 0x9e, 0xc4, 0x4a, 0x00, 0x91, 0x3e, 0xc0, 0x2d, 0x02, 0x1e, - 0xcc, 0x10, 0x13, 0xf4, 0xff, 0xc4, 0xbf, 0xde, 0xd4, 0x22, 0xe8, 0xdf, 0x21, 0xfe, 0x84, 0x65, - 0x07, 0x3b, 0x0d, 0x02, 0xc2, 0x7d, 0xff, 0x00, 0xaa, 0xf7, 0x11, 0x71, 0x04, 0xd0, 0x0a, 0x0c, - 0xd0, 0xfa, 0xf7, 0x20, 0xac, 0xf8, 0x22, 0x2f, 0xf8, 0x83, 0x58, 0xf8, 0x7f, 0x55, 0x00, 0x28, - 0x1f, 0xf7, 0x43, 0x10, 0xfb, 0x4a, 0x73, 0x03, 0xdd, 0x71, 0xff, 0xe0, 0x23, 0x00, 0x7f, 0x97, - 0x00, 0x88, 0xa1, 0x01, 0xf3, 0x51, 0x02, 0x44, 0xc8, 0x04, 0x80, 0x49, 0x02, 0x37, 0xce, 0xfc, - 0x8b, 0xae, 0xfe, 0x65, 0xf3, 0xf8, 0xa1, 0x07, 0x47, 0x58, 0x39, 0x3a, 0xaf, 0xed, 0x05, 0x33, - 0x00, 0x14, 0x2f, 0x13, 0xfb, 0xe9, 0x8c, 0xe2, 0xbf, 0x34, 0xec, 0xcd, 0xad, 0xf4, 0x24, 0x58, - 0x08, 0x63, 0x1a, 0x0c, 0x38, 0x1c, 0xfb, 0x67, 0x16, 0xf3, 0xb2, 0x51, 0x09, 0x3d, 0xca, 0x0b, - 0x92, 0xff, 0xf5, 0xae, 0x43, 0xf9, 0x77, 0xa0, 0xf7, 0x0a, 0x57, 0xf8, 0xa3, 0xbe, 0x00, 0xf0, - 0x81, 0xf8, 0x2b, 0x2e, 0xfc, 0x58, 0x30, 0x03, 0xd1, 0x16, 0xfe, 0xee, 0x39, 0x00, 0x3c, 0xe1, - 0x02, 0x6b, 0x2d, 0x00, 0xd9, 0x97, 0x00, 0x08, 0x9c, 0x06, 0x49, 0x5a, 0x03, 0x57, 0x8e, 0xfb, - 0x12, 0xdd, 0xfe, 0x82, 0xcb, 0xfa, 0x1d, 0x6d, 0x47, 0xd1, 0x85, 0x37, 0x7c, 0xa0, 0x04, 0xa5, - 0xb1, 0x10, 0xe9, 0x35, 0xf8, 0x38, 0x8a, 0xe9, 0xf5, 0x74, 0xef, 0xbd, 0x27, 0xf0, 0x58, 0x60, - 0x09, 0x96, 0xdd, 0x0e, 0xb1, 0xb1, 0xf9, 0xa4, 0xc1, 0xf2, 0x43, 0xd4, 0x09, 0x17, 0xc4, 0x09, - 0x77, 0x3d, 0xf6, 0x6e, 0xfd, 0xfa, 0x09, 0xa3, 0xf5, 0xb9, 0xfb, 0xf8, 0x3c, 0x33, 0x04, 0x10, - 0xc0, 0xf8, 0xf5, 0xb0, 0xfb, 0x92, 0xbc, 0x02, 0xa0, 0x24, 0xfe, 0x64, 0x32, 0x01, 0x8e, 0x52, - 0x02, 0x42, 0x47, 0xff, 0xb5, 0x21, 0x01, 0x2e, 0x0f, 0x07, 0x5d, 0x5f, 0x03, 0xa2, 0xf8, 0xfb, - 0xf6, 0x2f, 0xfe, 0x69, 0xdb, 0xfa, 0x92, 0x47, 0x4a, 0x52, 0x1a, 0x35, 0xce, 0xc5, 0xfb, 0x92, - 0x5d, 0x10, 0x0e, 0xad, 0xf9, 0x9d, 0x06, 0xe9, 0x5a, 0xa0, 0xf6, 0x71, 0x06, 0xf1, 0xc3, 0x27, - 0x04, 0x83, 0x6c, 0x10, 0x93, 0x0d, 0xfb, 0x00, 0x8f, 0xf1, 0x09, 0x8e, 0x08, 0xb9, 0x88, 0x09, - 0x47, 0x28, 0xf6, 0x9a, 0x1a, 0xfa, 0xf0, 0x5c, 0xf8, 0x41, 0xeb, 0xfa, 0x0b, 0xfb, 0x02, 0x24, - 0x2b, 0xf9, 0x05, 0x1a, 0xfc, 0xdc, 0x69, 0x03, 0x5e, 0x70, 0xfe, 0xea, 0xe1, 0xfe, 0x75, 0x8a, - 0x01, 0xf4, 0x6e, 0x01, 0x90, 0x15, 0x02, 0xa1, 0x31, 0x05, 0x7f, 0xb3, 0x02, 0xb2, 0x26, 0xfd, - 0xe1, 0x8d, 0xfd, 0x35, 0xa0, 0xfa, 0x60, 0x3c, 0x4a, 0xdd, 0xc1, 0x30, 0x28, 0x43, 0xf5, 0x2d, - 0xb6, 0x13, 0xb7, 0xf3, 0xfd, 0x1a, 0x76, 0xe7, 0xbf, 0x9f, 0xf7, 0xaa, 0xb1, 0xf4, 0x45, 0xdf, - 0x04, 0x78, 0x5c, 0x0b, 0x55, 0x43, 0xfa, 0xec, 0x85, 0xf4, 0xe4, 0x72, 0x07, 0x84, 0xf3, 0x08, - 0x9d, 0x76, 0xf5, 0xf7, 0x42, 0xfb, 0x51, 0x74, 0xfb, 0x69, 0x2e, 0xfb, 0xff, 0x3b, 0x02, 0xad, - 0xc9, 0xf8, 0x9a, 0x2e, 0xfd, 0x5d, 0x29, 0x04, 0x73, 0x32, 0xfd, 0x9c, 0xe5, 0xfd, 0xf9, 0xc4, - 0x01, 0x0f, 0x21, 0x02, 0x7f, 0x78, 0x02, 0xba, 0xde, 0x04, 0xe8, 0xda, 0x01, 0x8d, 0x21, 0xfd, - 0x9f, 0xcb, 0xfd, 0xe0, 0xe6, 0xfa, 0x9f, 0xff, 0x46, 0xcb, 0xe1, 0x2c, 0x57, 0xe9, 0xf1, 0x30, - 0x11, 0x17, 0xa9, 0x07, 0x03, 0xb1, 0x50, 0xe4, 0x32, 0x3c, 0xf9, 0x63, 0x67, 0xfa, 0x61, 0xec, - 0x00, 0x4e, 0x22, 0x07, 0x9a, 0xae, 0xfc, 0x80, 0xca, 0xf5, 0x4a, 0xbd, 0x05, 0xaf, 0xc7, 0x08, - 0x4c, 0x42, 0xf7, 0x5f, 0xea, 0xfb, 0xda, 0x72, 0xfc, 0xcf, 0x25, 0xfc, 0x53, 0x2f, 0x01, 0x10, - 0xad, 0xf9, 0x54, 0xed, 0xfd, 0x57, 0x76, 0x02, 0xd2, 0x32, 0xfd, 0x44, 0xdf, 0xfe, 0x86, 0x6e, - 0x01, 0x83, 0x21, 0x01, 0x6f, 0x21, 0x03, 0xf3, 0xa0, 0x05, 0x2f, 0xbc, 0x00, 0xce, 0x9c, 0xfc, - 0x8f, 0x40, 0xfe, 0x47, 0x04, 0xfc, 0x5b, 0xd9, 0x40, 0x50, 0xf2, 0x28, 0xf9, 0xfc, 0xf4, 0x34, - 0x74, 0x17, 0x52, 0x75, 0x02, 0x8b, 0x76, 0xe8, 0x50, 0xb7, 0xfc, 0x5d, 0xc9, 0xf7, 0x47, 0x87, - 0xfe, 0x8f, 0x10, 0x08, 0xb2, 0xba, 0xfc, 0xf3, 0xc9, 0xf5, 0x9b, 0xea, 0x04, 0x5a, 0x48, 0x09, - 0xc3, 0x6f, 0xf9, 0xdf, 0xe1, 0xfb, 0x9d, 0xc6, 0xfc, 0x23, 0x94, 0xfc, 0x51, 0x8b, 0x01, 0x89, - 0x92, 0xfa, 0xfb, 0xde, 0xfc, 0xec, 0x99, 0x01, 0x71, 0x07, 0xfe, 0xc3, 0x2a, 0xff, 0x3b, 0xc9, - 0x00, 0x49, 0x27, 0x01, 0xda, 0x50, 0x03, 0x8a, 0x07, 0x05, 0x55, 0xc9, 0x00, 0x74, 0x65, 0xfc, - 0x51, 0x09, 0xfe, 0xe0, 0x99, 0xfd, 0xba, 0xe6, 0x38, 0x4e, 0x8d, 0x26, 0xcb, 0x6e, 0xff, 0xc3, - 0x1a, 0x12, 0xa9, 0x16, 0xfa, 0xb4, 0x7a, 0xed, 0xb0, 0x7b, 0xff, 0x6d, 0x05, 0xff, 0x80, 0xa2, - 0xff, 0xab, 0xb4, 0xfe, 0xe0, 0xa5, 0xfb, 0xec, 0x6e, 0xf9, 0xe4, 0x66, 0x06, 0x07, 0x06, 0x06, - 0x25, 0xd4, 0xf7, 0x49, 0xb8, 0xff, 0x43, 0xc0, 0xfd, 0x2a, 0x0d, 0xfb, 0x30, 0x94, 0x01, 0x86, - 0xab, 0xfb, 0x13, 0xc8, 0xfc, 0xf1, 0xc9, 0x01, 0xe5, 0xd3, 0xfd, 0x2c, 0x7b, 0xfd, 0x18, 0xb5, - 0x01, 0xd7, 0xe8, 0x00, 0xd6, 0x46, 0xfe, 0xaa, 0x68, 0x02, 0xf8, 0xc6, 0x02, 0x7d, 0xf4, 0xfe, - 0x39, 0xbc, 0x00, 0x2c, 0x5d, 0xfe, 0x53, 0xed, 0x2f, 0x69, 0x14, 0x24, 0xa5, 0xdb, 0x04, 0xa8, - 0x56, 0x0f, 0x7f, 0xf2, 0xfa, 0xea, 0x33, 0xf4, 0xf4, 0xc6, 0xff, 0xe8, 0x4e, 0xfc, 0x14, 0x89, - 0xff, 0xdd, 0x5c, 0x00, 0x51, 0x5b, 0xfc, 0xc4, 0xf9, 0xf8, 0x68, 0x5a, 0x05, 0x07, 0xc0, 0x06, - 0x6b, 0xcb, 0xf9, 0x00, 0x54, 0xff, 0x9c, 0xed, 0xfd, 0x4d, 0x3c, 0xfc, 0x3a, 0x56, 0x01, 0x32, - 0x35, 0xfc, 0xb4, 0x4e, 0xfd, 0x44, 0x23, 0x01, 0xb3, 0x14, 0xfe, 0xe7, 0xef, 0xfd, 0x6d, 0x56, - 0x01, 0xd3, 0xa2, 0x00, 0x67, 0xe5, 0xfe, 0xf7, 0xaa, 0x02, 0xc5, 0x73, 0x02, 0x4e, 0x95, 0xff, - 0xbe, 0x7a, 0x00, 0x82, 0xb8, 0xfd, 0x4c, 0x53, 0x26, 0x86, 0xae, 0x22, 0x98, 0x52, 0x0a, 0xd3, - 0xa3, 0x0b, 0x98, 0x6f, 0xfc, 0x75, 0x54, 0xf9, 0x9c, 0x66, 0xff, 0x16, 0x0d, 0xfb, 0x5d, 0xdb, - 0xfe, 0xda, 0x42, 0x01, 0x64, 0xdb, 0xfc, 0xbb, 0xa4, 0xf9, 0xf5, 0x9b, 0x04, 0xc5, 0x94, 0x05, - 0xac, 0xa5, 0xfb, 0x76, 0x7d, 0xff, 0x99, 0x15, 0xfe, 0xc4, 0xf8, 0xfc, 0xb9, 0x76, 0x00, 0x36, - 0xf0, 0xfc, 0x48, 0x0b, 0xfe, 0x07, 0x95, 0x00, 0x2e, 0xc6, 0xfd, 0xa4, 0x2f, 0xfe, 0x18, 0x61, - 0x01, 0x6d, 0x3c, 0x00, 0x3d, 0x76, 0xff, 0x33, 0x4c, 0x02, 0xcf, 0xaa, 0x01, 0xd6, 0x56, 0x00, - 0x84, 0x73, 0x00, 0xf8, 0xd1, 0xfd, 0xe0, 0x17, 0x20, 0x0e, 0x4f, 0x20, 0x78, 0x52, 0x0b, 0x36, - 0x0f, 0x0b, 0xca, 0x59, 0xff, 0x97, 0x18, 0xfa, 0x45, 0xff, 0xfe, 0xdd, 0xc2, 0xfc, 0xbb, 0x20, - 0xff, 0x65, 0xb1, 0x00, 0x94, 0xfc, 0xfc, 0xee, 0x31, 0xfb, 0xba, 0x00, 0x04, 0xcf, 0xba, 0x04, - 0x04, 0xa7, 0xfc, 0xbd, 0x64, 0xff, 0xfa, 0xe7, 0xfe, 0x27, 0x56, 0xfd, 0x4f, 0x07, 0x00, 0x41, - 0xf4, 0xfd, 0xd4, 0x3a, 0xfe, 0xdb, 0xe6, 0xff, 0xc0, 0x52, 0xfe, 0x40, 0x0b, 0xff, 0xb0, 0x90, - 0x00, 0xf9, 0xc9, 0xff, 0xa3, 0x43, 0x00, 0x59, 0x00, 0x02, 0xf9, 0xc5, 0x01, 0x6a, 0x1e, 0x01, - 0x88, 0x5f, 0x00, 0xfd, 0xac, 0xfe, 0x49, 0x5a, 0x1c, 0xca, 0x19, 0x1d, 0xe4, 0xae, 0x0a, 0xe1, - 0x96, 0x0b, 0xb9, 0x22, 0x01, 0xa1, 0xf1, 0xf9, 0x6f, 0xf5, 0xfe, 0x55, 0xf0, 0xfe, 0x1a, 0x86, - 0xff, 0xde, 0x59, 0xff, 0xad, 0xae, 0xfd, 0xf3, 0xbb, 0xfc, 0x1f, 0x11, 0x03, 0xf5, 0x03, 0x04, - 0xc0, 0x0c, 0xfd, 0x4a, 0x9b, 0xff, 0xa1, 0xe6, 0xff, 0xdd, 0x67, 0xfd, 0x2a, 0x80, 0xff, 0x82, - 0xc8, 0xfe, 0x29, 0xd0, 0xfe, 0xa2, 0x81, 0xff, 0xfd, 0x91, 0xfe, 0x4a, 0x55, 0xff, 0x96, 0xdb, - 0xff, 0xf1, 0x0a, 0x00, 0x2c, 0x05, 0x01, 0x76, 0x03, 0x02, 0xa2, 0x96, 0x02, 0x04, 0xa1, 0x01, - 0x05, 0x15, 0x00, 0x17, 0x76, 0xff, 0xb8, 0xa9, 0x18, 0x6e, 0x03, 0x1a, 0x5a, 0x06, 0x0b, 0xcf, - 0xdd, 0x0b, 0xe0, 0x14, 0x02, 0x0e, 0xd3, 0xfa, 0xb2, 0xf3, 0xfe, 0x78, 0x22, 0x00, 0xec, 0x38, - 0x00, 0x3f, 0x0a, 0xff, 0xb9, 0x7f, 0xfe, 0x77, 0x52, 0xfd, 0xb4, 0x01, 0x02, 0x4c, 0xda, 0x03, - 0x9d, 0x2c, 0xfe, 0xdc, 0xcf, 0xff, 0x31, 0xeb, 0xff, 0x2d, 0xbe, 0xfd, 0x39, 0xf3, 0xff, 0xed, - 0xdc, 0xff, 0x0a, 0xc0, 0xfe, 0xf9, 0xcb, 0xfe, 0xdc, 0x86, 0xff, 0x5f, 0xc4, 0xff, 0x9c, 0x99, - 0xff, 0xe7, 0x2b, 0x01, 0xb3, 0xd1, 0x01, 0xe9, 0x50, 0x02, 0xcb, 0x27, 0x03, 0x51, 0x4e, 0x01, - 0x40, 0xb8, 0xff, 0x42, 0x98, 0xff, 0x70, 0x2a, 0x15, 0xc0, 0x2a, 0x17, 0x8b, 0x7e, 0x0b, 0xbb, - 0x07, 0x0c, 0x57, 0xe2, 0x02, 0x5c, 0xbc, 0xfb, 0x43, 0xb1, 0xfe, 0xd4, 0x25, 0x01, 0x43, 0x41, - 0x01, 0x8a, 0xc9, 0xfe, 0x12, 0xd1, 0xfe, 0x4a, 0xb7, 0xfd, 0xc8, 0x6c, 0x01, 0x7e, 0xcd, 0x03, - 0x5c, 0xca, 0xfe, 0x5e, 0xfe, 0xff, 0x8c, 0x3a, 0x00, 0xb6, 0x4c, 0xfe, 0x6d, 0x71, 0x00, 0xb4, - 0x21, 0x00, 0xe3, 0x8d, 0xfe, 0x7a, 0x47, 0xff, 0xa1, 0xaf, 0x00, 0x2c, 0x6b, 0x00, 0xea, 0x4c, - 0x00, 0x62, 0xa1, 0x01, 0x29, 0xcc, 0x01, 0xbe, 0xa9, 0x02, 0xb7, 0xa8, 0x02, 0xf2, 0xf1, 0xff, - 0xf2, 0x64, 0xff, 0xc9, 0x07, 0x00, 0x6a, 0x83, 0x12, 0x42, 0x7e, 0x15, 0xa2, 0x72, 0x0b, 0xdc, - 0xd9, 0x0a, 0x52, 0x89, 0x03, 0x38, 0x22, 0xfd, 0x80, 0xd2, 0xfe, 0x12, 0xba, 0x01, 0x70, 0x90, - 0x01, 0x85, 0xed, 0xfe, 0xf9, 0x86, 0xff, 0xe7, 0x07, 0xfe, 0x96, 0x9c, 0x00, 0x14, 0xb5, 0x03, - 0xb9, 0x28, 0x00, 0x06, 0x1a, 0x00, 0x41, 0xfa, 0xff, 0xa6, 0x28, 0xff, 0xf7, 0xc7, 0x00, 0xba, - 0x72, 0x00, 0xd6, 0xa4, 0xff, 0x3b, 0xc5, 0x00, 0x5c, 0x9f, 0x01, 0x3e, 0x2b, 0x00, 0xea, 0x46, - 0x00, 0xfc, 0x03, 0x02, 0xa0, 0x71, 0x01, 0x2a, 0x65, 0x01, 0x30, 0x86, 0x01, 0x02, 0x05, 0x00, - 0xe8, 0xd5, 0xff, 0x97, 0x1d, 0x00, 0xd3, 0x91, 0x0f, 0x69, 0xff, 0x12, 0x93, 0xfc, 0x0b, 0x29, - 0x99, 0x0b, 0x07, 0xf8, 0x03, 0x67, 0x44, 0xfd, 0x12, 0xca, 0xfe, 0x6b, 0x83, 0x02, 0x4e, 0x82, - 0x02, 0xdc, 0x0b, 0xff, 0x87, 0x56, 0xff, 0xfb, 0x63, 0xfe, 0x68, 0xbd, 0x00, 0x7a, 0xbf, 0x03, - 0x4f, 0xb0, 0x00, 0x16, 0x40, 0x00, 0xc9, 0x35, 0x00, 0xe2, 0x39, 0x00, 0x84, 0x17, 0x02, 0xa8, - 0xa1, 0x01, 0xad, 0xc0, 0x00, 0x84, 0xf6, 0x00, 0x89, 0xd5, 0x00, 0x97, 0x12, 0x00, 0x7d, 0x0b, - 0x00, 0x46, 0xc8, 0x00, 0x77, 0xe3, 0x00, 0x08, 0x32, 0x01, 0x67, 0x3b, 0x01, 0xcc, 0x0e, 0x00, - 0x7e, 0xdb, 0xff, 0xcb, 0x37, 0x00, 0xd7, 0x35, 0x0e, 0xdb, 0xfd, 0x11, 0x46, 0xe6, 0x0b, 0x6e, - 0x42, 0x0a, 0x33, 0x6c, 0x03, 0x31, 0x1e, 0xfe, 0x82, 0xb0, 0xff, 0xbc, 0xeb, 0x02, 0x85, 0x43, - 0x02, 0x1b, 0x6f, 0xff, 0xaa, 0xd0, 0xff, 0x08, 0xb0, 0xfe, 0x54, 0xfa, 0x00, 0x2b, 0xbe, 0x03, - 0x2f, 0xfa, 0x00, 0x35, 0xef, 0x00, 0xcb, 0x28, 0x02, 0x03, 0x2f, 0x02, 0x5c, 0x28, 0x02, 0xa9, - 0x18, 0x01, 0xd5, 0xbe, 0x00, 0x55, 0x81, 0x00, 0x7b, 0x64, 0xff, 0xf4, 0x31, 0xff, 0xa7, 0x1e, - 0x00, 0xb2, 0xba, 0x00, 0x40, 0x9c, 0x00, 0xa2, 0xc1, 0x00, 0xee, 0xbc, 0x00, 0xa7, 0x26, 0x00, - 0x97, 0x49, 0x00, 0xf6, 0xdf, 0xff, 0xaa, 0xba, 0x0c, 0x11, 0xbb, 0x10, 0x81, 0x0a, 0x0c, 0x74, - 0x20, 0x0a, 0x8e, 0xf3, 0x02, 0x31, 0x11, 0xfe, 0x82, 0x79, 0x00, 0x3a, 0xe0, 0x03, 0xb0, 0x49, - 0x02, 0xfd, 0x68, 0xff, 0xbb, 0x95, 0x00, 0x8a, 0xfe, 0xfe, 0x3b, 0xc1, 0x00, 0x19, 0x2d, 0x05, - 0x47, 0x4b, 0x03, 0xcc, 0xf0, 0x01, 0x59, 0x14, 0x02, 0xc1, 0x90, 0x01, 0xb2, 0xa7, 0x01, 0xd7, - 0xad, 0x00, 0x77, 0x4b, 0xff, 0x51, 0xe5, 0xfe, 0x41, 0x9a, 0xff, 0x89, 0xf8, 0xff, 0xbb, 0x8a, - 0xff, 0xcc, 0x10, 0x00, 0x70, 0x8d, 0x00, 0xef, 0xaa, 0x00, 0x56, 0xbf, 0x00, 0x98, 0x07, 0x00, - 0xc0, 0xe3, 0xff, 0xa7, 0x81, 0xff, 0xcd, 0x29, 0x0c, 0xc6, 0x72, 0x10, 0x35, 0xde, 0x0b, 0x55, - 0x11, 0x09, 0xdc, 0x29, 0x02, 0x25, 0xba, 0xfe, 0x76, 0x91, 0x01, 0x00, 0x84, 0x04, 0x9e, 0x72, - 0x02, 0xd8, 0xdb, 0xfe, 0xb2, 0x3b, 0x01, 0x2a, 0xf4, 0x01, 0xee, 0xf9, 0x02, 0x4f, 0x00, 0x05, - 0x3b, 0x40, 0x02, 0xa9, 0x71, 0x01, 0x7f, 0xc3, 0x01, 0xc1, 0x48, 0x00, 0xf0, 0xd9, 0xff, 0x39, - 0xcb, 0xff, 0x73, 0x47, 0xff, 0x72, 0xeb, 0xfe, 0x0e, 0x8f, 0xff, 0xdf, 0x82, 0xff, 0x4f, 0x47, - 0xff, 0x9f, 0xbc, 0x00, 0x49, 0x8f, 0x00, 0xfa, 0x7c, 0xff, 0x06, 0x2b, 0x00, 0x78, 0x51, 0x00, - 0x66, 0x87, 0xff, 0xbd, 0xd8, 0xfe, 0xbe, 0x9f, 0x0c, 0x4e, 0x3c, 0x11, 0xcc, 0x19, 0x0b, 0x26, - 0x69, 0x07, 0x51, 0xca, 0x01, 0x02, 0x0e, 0x00, 0x64, 0x7a, 0x02, 0xf4, 0x39, 0x04, 0x5b, 0x17, - 0x04, 0xb3, 0xa8, 0x01, 0xe5, 0xc1, 0x02, 0xe6, 0x54, 0x02, 0x79, 0x98, 0x01, 0xe4, 0x98, 0x03, - 0x7a, 0xe2, 0x01, 0x75, 0xea, 0xff, 0x0b, 0xea, 0xff, 0xaa, 0x08, 0x00, 0x5f, 0x03, 0x00, 0x02, - 0x69, 0xff, 0xd0, 0xaf, 0xfe, 0x42, 0xd0, 0xfe, 0x5c, 0x61, 0x00, 0x8f, 0x1b, 0x00, 0x71, 0x1a, - 0xff, 0x1e, 0xfc, 0xff, 0x1e, 0x9b, 0xff, 0x10, 0x59, 0xff, 0x63, 0x5a, 0x00, 0x75, 0x34, 0x00, - 0x7a, 0x3b, 0xff, 0x31, 0x5d, 0xfe, 0xd7, 0x3c, 0x0d, 0x2c, 0xef, 0x12, 0x51, 0x2c, 0x0a, 0x27, - 0x8f, 0x05, 0xe1, 0x68, 0x01, 0xba, 0x03, 0x01, 0x2b, 0xb6, 0x06, 0xfd, 0x6c, 0x07, 0x68, 0xe9, - 0x03, 0xd1, 0xc4, 0x00, 0x42, 0xcd, 0x01, 0xf9, 0xe9, 0x01, 0xe1, 0x6d, 0x00, 0x43, 0x7d, 0x01, - 0xa7, 0x97, 0x00, 0x9d, 0x07, 0x00, 0x02, 0x2c, 0x00, 0x80, 0x35, 0xff, 0x98, 0x7a, 0xff, 0x92, - 0x70, 0xff, 0x26, 0x73, 0xff, 0x53, 0x2f, 0x00, 0xa4, 0x1f, 0x00, 0x86, 0x0e, 0xff, 0x92, 0xac, - 0xfe, 0x3c, 0x9b, 0xff, 0x95, 0x96, 0xff, 0xfd, 0x6c, 0xff, 0xcb, 0x57, 0x00, 0x76, 0x0d, 0x00, - 0x7e, 0xa9, 0xfe, 0x5d, 0x5b, 0xfe, 0xd7, 0x69, 0x0d, 0x4c, 0x9f, 0x13, 0x71, 0x55, 0x09, 0x40, - 0x46, 0x04, 0xad, 0xc4, 0x04, 0x76, 0xed, 0x05, 0x35, 0x46, 0x07, 0x20, 0x7f, 0x05, 0x77, 0xed, - 0x02, 0xdf, 0x57, 0x00, 0x07, 0x8a, 0x00, 0x52, 0x83, 0x00, 0x9a, 0xae, 0xff, 0x4d, 0x18, 0x01, - 0xfb, 0x3c, 0x00, 0xb8, 0xaa, 0xff, 0x6c, 0x07, 0x00, 0xdf, 0xf2, 0xfe, 0x0c, 0xad, 0xff, 0x2d, - 0xe0, 0x00, 0x38, 0x15, 0x00, 0x6a, 0xea, 0xfe, 0x07, 0x2c, 0xff, 0x51, 0x57, 0xff, 0x23, 0xd5, - 0xfe, 0x14, 0xdd, 0xfe, 0x57, 0x48, 0xff, 0x70, 0x0b, 0x00, 0x2c, 0xf7, 0xff, 0xec, 0x67, 0xff, - 0xc6, 0x2b, 0xff, 0x97, 0xed, 0xfe, 0x13, 0x25, 0x0c, 0x1e, 0xa8, 0x12, 0x6a, 0x9e, 0x0c, 0x35, - 0x98, 0x08, 0x72, 0xa8, 0x04, 0x59, 0x52, 0x04, 0x53, 0x6e, 0x07, 0x62, 0x4f, 0x05, 0xef, 0xa3, - 0x01, 0x37, 0x58, 0xff, 0xbf, 0x15, 0x00, 0x61, 0xb5, 0x00, 0xb5, 0xc8, 0xff, 0x8b, 0x51, 0x00, - 0x52, 0xf0, 0xff, 0x38, 0xd9, 0xff, 0x10, 0x39, 0x00, 0x3c, 0x38, 0x00, 0xcc, 0xa6, 0x00, 0xc4, - 0x03, 0x00, 0x89, 0x5a, 0xff, 0x48, 0x4f, 0xff, 0x63, 0x5c, 0xff, 0x93, 0xf6, 0xfe, 0xbb, 0x72, - 0xfe, 0xf5, 0x09, 0xff, 0x31, 0x63, 0xff, 0xae, 0x9f, 0xff, 0x14, 0x21, 0x00, 0xc0, 0xfd, 0xff, - 0x75, 0x9a, 0xff, 0x2b, 0x1c, 0xff, 0x19, 0x3a, 0x0f, 0xcc, 0x90, 0x17, 0x45, 0xe2, 0x0b, 0xc3, - 0xd1, 0x03, 0x42, 0x0e, 0x04, 0x9d, 0x98, 0x05, 0x52, 0x12, 0x06, 0xae, 0xf9, 0x03, 0x0c, 0x36, - 0x01, 0x6c, 0xf6, 0xfe, 0xdc, 0x24, 0x00, 0x32, 0x9c, 0x00, 0x3d, 0x03, 0x00, 0xaf, 0xa8, 0x00, - 0x5a, 0x7b, 0xff, 0x5c, 0x09, 0x00, 0x81, 0xdb, 0x01, 0x54, 0x29, 0x01, 0xe1, 0x45, 0xff, 0xce, - 0x1d, 0xff, 0x62, 0x45, 0x00, 0xfc, 0x8c, 0xff, 0x79, 0xba, 0xfe, 0xf7, 0x8d, 0xfe, 0x35, 0xa8, - 0xfe, 0xdc, 0x35, 0xff, 0x3b, 0x29, 0xff, 0x9d, 0xec, 0xff, 0x38, 0xaa, 0x00, 0x8b, 0x4c, 0x00, - 0xd4, 0x74, 0xff, 0xc7, 0x8a, 0xfe, 0xfb, 0x13, 0x10, 0xcb, 0x7e, 0x19, 0x68, 0x06, 0x0b, 0xa8, - 0xf8, 0x00, 0x91, 0x83, 0x03, 0x66, 0x5d, 0x05, 0xc9, 0x3c, 0x05, 0xc8, 0x2d, 0x04, 0x54, 0x57, - 0x02, 0xf4, 0x32, 0xff, 0xc3, 0x65, 0xff, 0x34, 0x61, 0x01, 0x53, 0x64, 0x00, 0xb7, 0x44, 0x00, - 0x1e, 0x67, 0x00, 0xb1, 0xf3, 0x00, 0x6b, 0x04, 0x02, 0x2f, 0xa5, 0x00, 0x63, 0x8d, 0xff, 0x41, - 0xc3, 0xff, 0x3a, 0xef, 0xff, 0xce, 0x71, 0xff, 0x29, 0xc7, 0xfe, 0x40, 0xed, 0xfe, 0x20, 0x9b, - 0xfe, 0x19, 0xad, 0xfe, 0xf2, 0x7f, 0xff, 0x88, 0x2c, 0x00, 0x8c, 0xb5, 0x00, 0x13, 0x3e, 0x00, - 0x19, 0x8a, 0xff, 0x9a, 0xd8, 0xfe, 0x24, 0x17, 0x0c, 0x8f, 0x87, 0x16, 0xfd, 0x77, 0x0f, 0xee, - 0xf6, 0x03, 0xb6, 0xaf, 0x00, 0x5c, 0x97, 0x02, 0xc1, 0xa2, 0x04, 0x04, 0xbe, 0x05, 0x42, 0xa0, - 0x03, 0x12, 0x50, 0xff, 0xd0, 0x93, 0xff, 0xa1, 0xda, 0x01, 0x4b, 0x70, 0x01, 0xbc, 0x05, 0x00, - 0x92, 0x05, 0x00, 0xe6, 0xa8, 0x01, 0x5d, 0x35, 0x02, 0x4f, 0x57, 0x01, 0xe0, 0x20, 0x00, 0xd9, - 0x8c, 0xff, 0x5a, 0x0f, 0x00, 0xe0, 0x05, 0x00, 0x34, 0x27, 0xff, 0x3f, 0x96, 0xfe, 0x31, 0xe7, - 0xfe, 0x4f, 0x07, 0xff, 0x69, 0xfc, 0xfe, 0x0b, 0xd9, 0xff, 0x43, 0x8a, 0x00, 0x40, 0x6a, 0x00, - 0x0b, 0xc0, 0xff, 0x7b, 0x17, 0xff, 0xf0, 0x13, 0x0a, 0x63, 0xa8, 0x13, 0xf4, 0x44, 0x10, 0xf4, - 0xd8, 0x06, 0x31, 0x1c, 0x01, 0xfa, 0x4b, 0x01, 0x00, 0x33, 0x03, 0xba, 0xd1, 0x04, 0x38, 0x0d, - 0x04, 0xcb, 0x13, 0x00, 0xe9, 0x76, 0xff, 0x50, 0xca, 0x01, 0x9b, 0x4c, 0x02, 0xeb, 0x9e, 0x00, - 0x52, 0x17, 0x00, 0x61, 0x87, 0x01, 0x62, 0x92, 0x01, 0xa6, 0xa5, 0x01, 0x04, 0x5d, 0x01, 0xae, - 0x26, 0x00, 0x96, 0x4c, 0x00, 0x6c, 0xf8, 0xff, 0xae, 0x33, 0xff, 0x7f, 0x50, 0xff, 0x01, 0x67, - 0xff, 0xc9, 0xec, 0xfe, 0x26, 0xc6, 0xfe, 0xb5, 0xbc, 0xff, 0xd5, 0x76, 0x00, 0x68, 0x3b, 0x00, - 0xc0, 0x73, 0xff, 0xda, 0x22, 0xff, 0xe6, 0xfa, 0x09, 0x53, 0x32, 0x13, 0xbb, 0x5a, 0x0f, 0x79, - 0x10, 0x07, 0x9c, 0x2a, 0x02, 0x90, 0xfc, 0x00, 0xf6, 0x7c, 0x02, 0x70, 0xd5, 0x04, 0x0b, 0xfa, - 0x03, 0x29, 0x73, 0xff, 0xdc, 0x99, 0xfe, 0xed, 0x8d, 0x01, 0xf7, 0xa4, 0x02, 0x41, 0xf6, 0x00, - 0x40, 0x16, 0x00, 0x81, 0x77, 0x01, 0xe9, 0xd9, 0x01, 0x4a, 0x6b, 0x01, 0xbc, 0x18, 0x01, 0x17, - 0xbe, 0x00, 0x32, 0xea, 0x00, 0x2e, 0x6c, 0x00, 0xf7, 0x9f, 0xff, 0x34, 0x8e, 0xff, 0xe8, 0x7f, - 0xff, 0xfd, 0x5c, 0xff, 0x49, 0x91, 0xff, 0xfc, 0x92, 0xff, 0xa9, 0xdf, 0xff, 0xa1, 0x6f, 0x00, - 0x90, 0xa7, 0xff, 0xc6, 0xcf, 0xfe, 0x10, 0x6a, 0x0a, 0x5c, 0x46, 0x13, 0xd6, 0xb0, 0x0e, 0x31, - 0x20, 0x07, 0xce, 0xdd, 0x02, 0x88, 0xe6, 0x00, 0x76, 0xec, 0x01, 0xb7, 0xb4, 0x04, 0x30, 0x2b, - 0x04, 0xad, 0x7d, 0xff, 0xbc, 0x3b, 0xfe, 0x51, 0xe2, 0x00, 0x15, 0xf9, 0x01, 0x4a, 0x84, 0x00, - 0xa0, 0xe0, 0xff, 0x6e, 0x5c, 0x01, 0x09, 0x99, 0x01, 0x4f, 0x0e, 0x01, 0xe6, 0x8b, 0x01, 0x0e, - 0x36, 0x01, 0xa5, 0x42, 0x00, 0x60, 0x5e, 0x00, 0x03, 0x6b, 0x00, 0xcb, 0xf4, 0xff, 0x27, 0xd4, - 0xff, 0x83, 0xd6, 0xff, 0x91, 0xf2, 0xff, 0x9a, 0xe8, 0xff, 0x99, 0x1a, 0x00, 0xe2, 0x51, 0x00, - 0x8c, 0xb9, 0xff, 0xff, 0xf5, 0xfe, 0xb9, 0x5a, 0x0b, 0xff, 0x3c, 0x14, 0x75, 0x39, 0x0e, 0x3a, - 0xb6, 0x06, 0xe3, 0x1b, 0x03, 0xa4, 0xd6, 0x00, 0xf6, 0xe1, 0x01, 0x8b, 0xe6, 0x04, 0xa0, 0x23, - 0x04, 0x92, 0x24, 0xff, 0xb5, 0x26, 0xfe, 0x4c, 0xe8, 0x00, 0xba, 0xeb, 0x01, 0xb8, 0x6e, 0x00, - 0xde, 0xe9, 0xfe, 0xde, 0x51, 0x00, 0xfb, 0x4c, 0x01, 0xa6, 0x9f, 0x00, 0x84, 0x40, 0x01, 0xa0, - 0x9b, 0x01, 0xa6, 0x9d, 0x00, 0xf5, 0x36, 0x00, 0xd5, 0xf7, 0xff, 0x42, 0xa8, 0xff, 0x27, 0x96, - 0x00, 0x63, 0xa4, 0x00, 0x0a, 0xeb, 0xff, 0x25, 0x94, 0x00, 0x72, 0xd6, 0x00, 0xd9, 0x58, 0x00, - 0xb6, 0xeb, 0xff, 0x44, 0x3b, 0xff, 0x6b, 0x20, 0x0c, 0x55, 0x99, 0x15, 0xb5, 0x59, 0x0e, 0xad, - 0xf5, 0x05, 0x82, 0x5b, 0x03, 0x26, 0x1a, 0x01, 0x66, 0x6b, 0x01, 0xc0, 0xe6, 0x04, 0xea, 0x50, - 0x04, 0x51, 0xf4, 0xfe, 0x62, 0x00, 0xfe, 0x13, 0xac, 0x00, 0x5a, 0xd3, 0x01, 0x5a, 0xc9, 0x00, - 0x4e, 0xc7, 0xfe, 0xad, 0x7b, 0xff, 0xfe, 0xb1, 0x00, 0x98, 0xbd, 0xff, 0xe0, 0xf1, 0xff, 0x73, - 0xaa, 0x01, 0x29, 0x56, 0x01, 0x81, 0xd1, 0xff, 0xdf, 0x9e, 0xff, 0x0f, 0x94, 0xff, 0xdc, 0x28, - 0x00, 0x3b, 0xb5, 0x00, 0x07, 0x3c, 0x00, 0xaa, 0xde, 0x00, 0x67, 0x58, 0x01, 0x18, 0xb9, 0x00, - 0xa4, 0x70, 0x00, 0x94, 0xc4, 0xff, 0xc0, 0x2a, 0x0d, 0x5c, 0x4f, 0x17, 0x27, 0x7d, 0x0e, 0xef, - 0x40, 0x05, 0xef, 0xa5, 0x03, 0x3b, 0x1e, 0x01, 0x49, 0xe2, 0x00, 0x68, 0x05, 0x05, 0x39, 0x83, - 0x04, 0x93, 0x80, 0xfe, 0x32, 0x9b, 0xfd, 0xb9, 0xda, 0x00, 0xde, 0xc4, 0x01, 0x80, 0x96, 0x00, - 0xca, 0xfb, 0xfe, 0xe0, 0x22, 0xff, 0x71, 0x3b, 0x00, 0xe2, 0x8e, 0xff, 0x37, 0xc9, 0xfe, 0x28, - 0xa8, 0x00, 0x70, 0x77, 0x01, 0x09, 0xab, 0xff, 0xb6, 0x42, 0xff, 0x9b, 0x60, 0xff, 0xcd, 0xa7, - 0xff, 0x55, 0x96, 0x00, 0xd4, 0x4a, 0x00, 0x3b, 0x67, 0x00, 0xe1, 0x61, 0x01, 0x65, 0x50, 0x01, - 0xca, 0x90, 0x00, 0x94, 0x0f, 0x00, 0xb5, 0xa1, 0x0e, 0x38, 0x73, 0x19, 0x69, 0x9e, 0x0e, 0xd2, - 0x41, 0x04, 0x1d, 0xe0, 0x03, 0x24, 0x5e, 0x01, 0xa6, 0x5e, 0x00, 0x84, 0x13, 0x05, 0xc7, 0xbd, - 0x04, 0xf5, 0x26, 0xfe, 0xc7, 0x42, 0xfd, 0x6e, 0xf3, 0x00, 0x72, 0xc2, 0x01, 0x6e, 0x5d, 0x00, - 0x55, 0x42, 0xff, 0x45, 0x25, 0xff, 0x74, 0xb7, 0xff, 0x44, 0x7a, 0xff, 0x71, 0x70, 0xfe, 0x27, - 0xc2, 0xff, 0xd4, 0x6f, 0x01, 0x45, 0xf0, 0xff, 0xf1, 0x5e, 0xfe, 0x40, 0xc7, 0xfe, 0xcb, 0xc3, - 0xff, 0x4c, 0x58, 0x00, 0x23, 0x21, 0x00, 0x81, 0xfe, 0xff, 0x03, 0x22, 0x01, 0x01, 0x83, 0x01, - 0x00, 0x52, 0x00, 0x9e, 0x2e, 0x00, 0x15, 0x5b, 0x10, 0x6c, 0xf1, 0x1b, 0x25, 0xca, 0x0e, 0xb1, - 0x08, 0x03, 0xcd, 0xf9, 0x03, 0x18, 0x9b, 0x01, 0xb6, 0xd9, 0xff, 0xec, 0x57, 0x05, 0x7f, 0xd1, - 0x04, 0x86, 0x63, 0xfd, 0xf1, 0x31, 0xfd, 0x49, 0x44, 0x01, 0x3e, 0xab, 0x01, 0xeb, 0xef, 0xff, - 0x4f, 0x15, 0xff, 0x54, 0x86, 0xff, 0x0d, 0x98, 0xff, 0x2b, 0xf8, 0xfe, 0x8d, 0x50, 0xfe, 0x63, - 0x35, 0xff, 0x50, 0xff, 0x00, 0xf4, 0x94, 0x00, 0x5d, 0x52, 0xfe, 0xf4, 0xd3, 0xfd, 0xd3, 0x79, - 0xff, 0x9f, 0x27, 0x00, 0xbb, 0xe0, 0xff, 0x6b, 0xf0, 0xff, 0xcd, 0x93, 0x00, 0x82, 0xfe, 0x00, - 0x92, 0x78, 0x00, 0x41, 0x1a, 0x00, 0x24, 0x8d, 0x12, 0xe0, 0xb0, 0x1e, 0x65, 0x9c, 0x0e, 0xc6, - 0xcc, 0x01, 0xab, 0x1d, 0x04, 0x43, 0x7a, 0x01, 0x2e, 0x62, 0xff, 0x7c, 0xef, 0x05, 0x9b, 0xb2, - 0x04, 0x33, 0x43, 0xfc, 0x0d, 0x30, 0xfd, 0x47, 0xdf, 0x01, 0x08, 0x9f, 0x01, 0x58, 0x51, 0xff, - 0xc4, 0xc0, 0xfe, 0xd4, 0xbb, 0xff, 0xd2, 0x87, 0xff, 0x2e, 0x85, 0xfe, 0x13, 0x06, 0xfe, 0xa3, - 0x01, 0xff, 0x80, 0x79, 0x00, 0x24, 0xa2, 0x00, 0x26, 0xe4, 0xfe, 0x94, 0x64, 0xfd, 0xde, 0x05, - 0xff, 0x49, 0x41, 0x00, 0x03, 0x6e, 0xff, 0x09, 0x9d, 0xff, 0x49, 0x5b, 0x00, 0x55, 0x4e, 0x00, - 0xe8, 0x12, 0x00, 0x32, 0xf7, 0xff, 0x80, 0xb6, 0x14, 0xe9, 0x8f, 0x21, 0x32, 0xa6, 0x0e, 0x75, - 0x8b, 0x00, 0xb4, 0x01, 0x04, 0xb5, 0x0c, 0x01, 0x16, 0xdb, 0xfe, 0xfb, 0xb2, 0x06, 0xc8, 0x7c, - 0x04, 0x5b, 0xc6, 0xfa, 0xe6, 0x11, 0xfd, 0x0a, 0xa3, 0x02, 0x1c, 0x99, 0x01, 0x01, 0x87, 0xfe, - 0x34, 0x3a, 0xfe, 0x67, 0xe4, 0xff, 0x42, 0x79, 0xff, 0x3d, 0xec, 0xfd, 0x23, 0x79, 0xfd, 0x64, - 0xbf, 0xfe, 0xc8, 0x28, 0x00, 0x23, 0x5b, 0x00, 0xb5, 0x2f, 0xff, 0x91, 0x8a, 0xfd, 0xb3, 0x6f, - 0xfe, 0x8a, 0x32, 0x00, 0x60, 0x9e, 0xff, 0x74, 0x10, 0xff, 0xf5, 0x20, 0x00, 0x19, 0xbf, 0xff, - 0x58, 0xfd, 0xfe, 0x7c, 0xe0, 0xff, 0x6c, 0xe6, 0x16, 0xfb, 0x87, 0x24, 0x8f, 0x05, 0x0f, 0x97, - 0xbd, 0xff, 0x15, 0xf0, 0x03, 0x0f, 0x81, 0x00, 0xf6, 0x83, 0xfe, 0x61, 0xdc, 0x07, 0xd0, 0x82, - 0x04, 0x39, 0x40, 0xf9, 0xa6, 0x28, 0xfd, 0x52, 0xbd, 0x03, 0x5f, 0xd6, 0x01, 0xb3, 0x03, 0xfe, - 0x06, 0xc3, 0xfd, 0x00, 0x28, 0x00, 0xf9, 0xb7, 0xff, 0x43, 0x9b, 0xfd, 0x11, 0x21, 0xfd, 0xac, - 0x75, 0xfe, 0xce, 0xe4, 0xff, 0x2c, 0x6b, 0x00, 0x6a, 0x7b, 0xff, 0xf8, 0x09, 0xfe, 0x61, 0x8c, - 0xfe, 0xef, 0xb6, 0xff, 0xbd, 0x1d, 0x00, 0xe7, 0x8c, 0xff, 0x1b, 0x9e, 0xff, 0x52, 0xb9, 0xff, - 0x98, 0x91, 0xfe, 0x13, 0x1d, 0xff, 0x0c, 0x7b, 0x18, 0x64, 0x3d, 0x27, 0xd7, 0x45, 0x10, 0x2d, - 0x1c, 0xff, 0x55, 0x76, 0x03, 0xe9, 0xe4, 0xff, 0x30, 0xb2, 0xfd, 0x64, 0xd0, 0x08, 0x68, 0xe0, - 0x04, 0x20, 0x8e, 0xf7, 0x5c, 0xb8, 0xfc, 0x65, 0xc9, 0x04, 0xf9, 0x3b, 0x02, 0xbf, 0x64, 0xfd, - 0xd8, 0x1f, 0xfd, 0x0e, 0x25, 0x00, 0xe9, 0xd2, 0xff, 0xbf, 0x65, 0xfd, 0xed, 0xaf, 0xfc, 0x99, - 0xde, 0xfd, 0x9e, 0x52, 0xff, 0xff, 0x72, 0x00, 0x90, 0x92, 0xff, 0x15, 0x11, 0xfe, 0x73, 0x26, - 0xff, 0xd4, 0x75, 0xff, 0x99, 0xa4, 0xff, 0x0e, 0x4a, 0x00, 0xdf, 0x96, 0xff, 0xe3, 0xfa, 0xfe, - 0x3a, 0xa8, 0xfe, 0x75, 0xba, 0xfe, 0x78, 0xd7, 0x19, 0x9d, 0xfa, 0x29, 0x86, 0xd2, 0x11, 0xea, - 0xa9, 0xfe, 0xd3, 0xed, 0x02, 0xc8, 0x91, 0xff, 0xdd, 0x14, 0xfd, 0x21, 0x0d, 0x09, 0x99, 0x4a, - 0x05, 0x1c, 0x8b, 0xf6, 0x48, 0x0d, 0xfc, 0x95, 0x91, 0x05, 0x12, 0xe6, 0x02, 0x97, 0x0c, 0xfd, - 0x46, 0x6d, 0xfc, 0xb7, 0x1f, 0x00, 0xec, 0xf4, 0xff, 0x6b, 0x26, 0xfd, 0xfe, 0x92, 0xfc, 0xcc, - 0x71, 0xfd, 0xf6, 0x51, 0xfe, 0x02, 0x72, 0x00, 0x66, 0x41, 0x00, 0x48, 0x9b, 0xfd, 0xb3, 0x66, - 0xff, 0x3e, 0x5e, 0x00, 0x09, 0x0a, 0xff, 0xb9, 0x36, 0x00, 0xb0, 0x6d, 0x00, 0x94, 0xad, 0xfe, - 0x9b, 0xfc, 0xfd, 0x9c, 0xe1, 0xfe, 0xba, 0xb7, 0x1a, 0x5a, 0x8a, 0x2c, 0x31, 0x04, 0x14, 0x11, - 0x12, 0xfe, 0x25, 0x57, 0x02, 0x94, 0x01, 0x00, 0x60, 0x81, 0xfc, 0x89, 0x56, 0x08, 0x9b, 0x69, - 0x05, 0xf1, 0x8c, 0xf6, 0x3d, 0x5e, 0xfb, 0x28, 0x98, 0x05, 0x92, 0xa1, 0x03, 0x52, 0x07, 0xfd, - 0x43, 0xfb, 0xfb, 0xa7, 0xdd, 0xff, 0xa5, 0xf5, 0xff, 0x95, 0xe7, 0xfc, 0x58, 0x58, 0xfc, 0xd9, - 0x87, 0xfd, 0x90, 0x63, 0xfd, 0x9e, 0x5b, 0xff, 0x11, 0x1f, 0x01, 0x4b, 0x35, 0xfe, 0x6c, 0xa4, - 0xfe, 0xad, 0x18, 0x01, 0x78, 0x96, 0xff, 0x2d, 0x58, 0xff, 0x17, 0xf3, 0x00, 0x37, 0x6a, 0xff, - 0x61, 0x2d, 0xfd, 0xcd, 0x55, 0xfe, 0xf3, 0x88, 0x1c, 0xa9, 0xdc, 0x2e, 0x24, 0x93, 0x14, 0x06, - 0x00, 0xfe, 0x1d, 0xa7, 0x02, 0x22, 0xe1, 0xff, 0x7c, 0x06, 0xfc, 0xe5, 0x8f, 0x07, 0xda, 0xd4, - 0x04, 0x10, 0xcc, 0xf6, 0x61, 0x19, 0xfb, 0xc7, 0x44, 0x05, 0x3b, 0xf5, 0x03, 0x16, 0x16, 0xfd, - 0x63, 0xbe, 0xfb, 0xd8, 0x98, 0xff, 0xf1, 0xee, 0xff, 0xa1, 0x6d, 0xfc, 0x44, 0xf5, 0xfb, 0xba, - 0xc7, 0xfd, 0x12, 0xe1, 0xfc, 0x57, 0x1a, 0xfe, 0x92, 0xde, 0x00, 0x55, 0x8e, 0xff, 0x50, 0x8b, - 0xfe, 0x31, 0x7e, 0x00, 0x8c, 0xd3, 0x00, 0x7f, 0x15, 0xff, 0x8c, 0x3f, 0x00, 0xc6, 0x72, 0x00, - 0x17, 0x53, 0xfd, 0xd9, 0x46, 0xfd, 0xc3, 0x30, 0x20, 0x61, 0xc5, 0x30, 0x8e, 0x78, 0x12, 0xb3, - 0x97, 0xfe, 0x58, 0xa4, 0x04, 0x38, 0x6e, 0xff, 0x9e, 0xb6, 0xfa, 0xc3, 0x6c, 0x07, 0x74, 0x4d, - 0x04, 0x59, 0x67, 0xf6, 0x1d, 0xc8, 0xfb, 0x2b, 0xa6, 0x04, 0x32, 0x20, 0x04, 0xa4, 0x74, 0xfd, - 0x99, 0x28, 0xfb, 0xe4, 0xe1, 0xff, 0xc1, 0xb4, 0xff, 0x08, 0x34, 0xfc, 0x8b, 0xa9, 0xfb, 0xaf, - 0x74, 0xfd, 0xbb, 0x27, 0xfd, 0x2c, 0x49, 0xfd, 0xef, 0xcf, 0xff, 0xc2, 0x6b, 0x00, 0x8a, 0xdc, - 0xff, 0xbb, 0xcc, 0xff, 0x62, 0xe5, 0x00, 0x55, 0x3a, 0x00, 0x9e, 0x82, 0xff, 0x48, 0x5d, 0x00, - 0x9e, 0x6a, 0xfe, 0x73, 0xda, 0xfc, 0xa5, 0x58, 0x24, 0xa0, 0xea, 0x31, 0x9d, 0x73, 0x0e, 0x14, - 0x9f, 0x00, 0xae, 0xbc, 0x08, 0x43, 0x79, 0xfd, 0xa5, 0x23, 0xf8, 0x5e, 0x57, 0x08, 0x22, 0x77, - 0x04, 0xe9, 0x1b, 0xf5, 0xac, 0x2f, 0xfc, 0x12, 0x54, 0x04, 0xe1, 0xfe, 0x03, 0xda, 0xe6, 0xfd, - 0x3c, 0x72, 0xfa, 0xda, 0x0e, 0x00, 0x76, 0x68, 0xff, 0x2a, 0xf9, 0xfb, 0x3e, 0xb7, 0xfb, 0x89, - 0xb1, 0xfc, 0xf3, 0x35, 0xfd, 0xc0, 0x1c, 0xfd, 0x15, 0xc1, 0xfe, 0x8f, 0xfb, 0xff, 0x82, 0x61, - 0x01, 0x65, 0x7a, 0x00, 0x70, 0xed, 0xff, 0xc7, 0xfd, 0x00, 0x7d, 0xbe, 0xff, 0x03, 0xae, 0xff, - 0xab, 0x17, 0xff, 0xaf, 0x4b, 0xfd, 0xc3, 0xae, 0x27, 0x4b, 0xde, 0x31, 0x10, 0x3e, 0x0a, 0x3e, - 0x23, 0x05, 0x20, 0x0e, 0x0e, 0x9b, 0x06, 0xf9, 0x16, 0x15, 0xf5, 0xfc, 0x2f, 0x0b, 0xf1, 0x2e, - 0x05, 0x69, 0x65, 0xf2, 0x03, 0xec, 0xfb, 0xd2, 0x4c, 0x05, 0x67, 0x98, 0x03, 0xe2, 0x99, 0xfd, - 0x06, 0x2c, 0xfa, 0xc4, 0x47, 0x00, 0x5a, 0xf9, 0xfe, 0xec, 0x74, 0xfb, 0x5c, 0x05, 0xfc, 0xd5, - 0x3d, 0xfc, 0x99, 0xdd, 0xfc, 0x7f, 0x06, 0xfd, 0x4d, 0x27, 0xfe, 0x21, 0x0b, 0xff, 0x57, 0xf5, - 0x01, 0x11, 0xd3, 0x01, 0x63, 0x8c, 0xff, 0xb1, 0x09, 0x01, 0x93, 0x3b, 0x00, 0x63, 0x43, 0xff, - 0x5c, 0x11, 0xff, 0x5b, 0xe7, 0xfd, 0x4a, 0x42, 0x2a, 0x81, 0x88, 0x30, 0x36, 0x05, 0x07, 0x0a, - 0xcc, 0x0b, 0x49, 0xce, 0x12, 0x75, 0x0f, 0xf3, 0x60, 0x1f, 0xf3, 0x75, 0x9c, 0x0f, 0xb4, 0x5f, - 0x05, 0x6a, 0xac, 0xee, 0xca, 0xe4, 0xfb, 0xa4, 0x6a, 0x07, 0x94, 0xe4, 0x02, 0x85, 0x69, 0xfc, - 0x52, 0xad, 0xfa, 0x81, 0xd6, 0x00, 0xb8, 0x38, 0xfe, 0x5e, 0xdf, 0xfa, 0xfa, 0x81, 0xfc, 0x09, - 0x61, 0xfc, 0x10, 0x4f, 0xfc, 0x21, 0xcb, 0xfc, 0x4a, 0x3c, 0xfe, 0xe9, 0x4d, 0xfe, 0x5e, 0x9f, - 0x01, 0x6b, 0xa2, 0x02, 0x9e, 0x2b, 0x00, 0xfa, 0x6d, 0x01, 0x25, 0x82, 0x00, 0xfc, 0x27, 0xff, - 0xc1, 0xbd, 0xfe, 0x76, 0x7c, 0xfe, 0x18, 0xba, 0x30, 0x5a, 0x6f, 0x32, 0x5f, 0xf4, 0xff, 0xde, - 0x49, 0x0a, 0xc5, 0x1c, 0x17, 0x97, 0xb9, 0xf4, 0x68, 0xa5, 0xf1, 0x35, 0x41, 0x0e, 0x16, 0xb3, - 0x04, 0x86, 0xf6, 0xed, 0xdb, 0xc0, 0xfc, 0xfa, 0x10, 0x08, 0xdb, 0x8d, 0x01, 0xe6, 0x17, 0xfb, - 0x3a, 0x52, 0xfb, 0xcc, 0x47, 0x01, 0x84, 0xde, 0xfc, 0x47, 0x77, 0xfa, 0x34, 0x75, 0xfc, 0xea, - 0x68, 0xfc, 0x6c, 0x75, 0xfc, 0x08, 0x32, 0xfc, 0x35, 0x92, 0xfe, 0xab, 0xf6, 0xfd, 0x0e, 0xa0, - 0x00, 0x75, 0x57, 0x03, 0x0f, 0xf4, 0x00, 0x90, 0x2b, 0x01, 0x48, 0x7d, 0x00, 0xb7, 0xa4, 0xff, - 0x35, 0x86, 0xfe, 0x89, 0x50, 0xfe, 0x26, 0x1e, 0x37, 0x91, 0xdd, 0x34, 0xe9, 0x81, 0xf9, 0xf4, - 0x44, 0x07, 0x8c, 0x0b, 0x1a, 0x1e, 0x67, 0xf8, 0x3c, 0xee, 0xf0, 0x48, 0x96, 0x0b, 0x31, 0x6b, - 0x04, 0xd8, 0xdb, 0xed, 0x81, 0x6c, 0xfd, 0x3d, 0x7f, 0x08, 0x63, 0x9a, 0x00, 0x9f, 0xe0, 0xf9, - 0x36, 0x83, 0xfb, 0xe2, 0xf5, 0x01, 0xc1, 0x63, 0xfb, 0xb4, 0x31, 0xfa, 0x75, 0x85, 0xfc, 0x7b, - 0x22, 0xfc, 0xda, 0x5b, 0xfd, 0x0f, 0x7c, 0xfb, 0xff, 0xc2, 0xfe, 0x72, 0x8f, 0xfe, 0x44, 0x3a, - 0xff, 0x9a, 0x41, 0x03, 0x64, 0x13, 0x02, 0xe3, 0x5a, 0x01, 0xbd, 0x21, 0x00, 0x10, 0xfb, 0xff, - 0x8d, 0xea, 0xfe, 0x01, 0x4d, 0xfe, 0xec, 0x9d, 0x3c, 0x66, 0x70, 0x38, 0xd3, 0x14, 0xf4, 0xab, - 0xd5, 0x02, 0x54, 0x63, 0x1b, 0x54, 0x34, 0xfd, 0x19, 0x7d, 0xf1, 0x11, 0xcf, 0x07, 0xc7, 0x51, - 0x04, 0xf6, 0x5b, 0xee, 0xd5, 0xbc, 0xfd, 0x8f, 0x9d, 0x08, 0x20, 0xca, 0xff, 0xb2, 0x68, 0xf9, - 0x51, 0xdb, 0xfa, 0x96, 0x5d, 0x02, 0x5b, 0x83, 0xfa, 0x9a, 0x80, 0xf9, 0x37, 0xc9, 0xfc, 0xe3, - 0xb1, 0xfb, 0xe1, 0x7f, 0xfe, 0xbd, 0x3d, 0xfb, 0x9f, 0x4b, 0xfe, 0x77, 0xa3, 0xff, 0xc9, 0x63, - 0xfe, 0x38, 0x3e, 0x02, 0xf9, 0xb0, 0x02, 0xfe, 0x45, 0x02, 0x70, 0xb2, 0xff, 0x9c, 0xce, 0xff, - 0x1b, 0xf6, 0xff, 0xde, 0x19, 0xfe, 0x98, 0xf6, 0x42, 0xd5, 0xf5, 0x3a, 0x27, 0x09, 0xef, 0x06, - 0x3c, 0xff, 0xa8, 0x86, 0x1a, 0x02, 0x25, 0x01, 0xd0, 0x98, 0xf3, 0x52, 0x70, 0x04, 0x13, 0x28, - 0x03, 0x3d, 0x42, 0xef, 0x57, 0xbd, 0xfe, 0x73, 0xcc, 0x07, 0xbe, 0xe5, 0xfe, 0xfd, 0xba, 0xf9, - 0x14, 0xb5, 0xf9, 0x10, 0x03, 0x02, 0x46, 0x44, 0xfa, 0x91, 0xa4, 0xf8, 0x7d, 0xee, 0xfc, 0x67, - 0xbf, 0xfb, 0xef, 0x0c, 0xff, 0xdb, 0xb2, 0xfb, 0x53, 0xae, 0xfd, 0x5d, 0x2c, 0x00, 0x26, 0xd4, - 0xfe, 0x4d, 0xb0, 0x00, 0xf5, 0x93, 0x02, 0x72, 0x83, 0x03, 0x4d, 0x34, 0xff, 0xa8, 0xac, 0xff, - 0x89, 0xf8, 0x00, 0x8d, 0xd1, 0xfd, 0x8c, 0x56, 0x48, 0x96, 0x56, 0x3e, 0x5b, 0xa7, 0xea, 0x8c, - 0xd5, 0xfb, 0x5f, 0xd8, 0x18, 0x3c, 0x6a, 0x03, 0x53, 0xf6, 0xf6, 0x41, 0xad, 0x01, 0xf3, 0xa1, - 0x01, 0xfb, 0x9e, 0xf0, 0x03, 0x8e, 0xff, 0x7b, 0xaf, 0x06, 0xa3, 0xe9, 0xfd, 0x08, 0xcd, 0xfa, - 0xd8, 0x26, 0xf8, 0x3c, 0xf8, 0x00, 0x5a, 0xad, 0xfa, 0x7a, 0xa7, 0xf7, 0x12, 0x42, 0xfd, 0x7e, - 0x19, 0xfc, 0xa9, 0x17, 0xff, 0xc1, 0x61, 0xfc, 0xb3, 0x6c, 0xfd, 0x90, 0x20, 0x00, 0xd0, 0xbc, - 0xff, 0x54, 0xd7, 0xff, 0xd6, 0x71, 0x01, 0xfa, 0xb5, 0x04, 0x8b, 0x4e, 0xff, 0x85, 0xf8, 0xfe, - 0xd6, 0xbb, 0x01, 0x44, 0xef, 0xfd, 0xd6, 0xfa, 0x4c, 0x93, 0x23, 0x42, 0xd7, 0x01, 0xe7, 0xef, - 0x24, 0xf9, 0xdf, 0xbf, 0x16, 0xf5, 0x7a, 0x03, 0xd5, 0xe4, 0xfa, 0xbe, 0x01, 0x00, 0xfd, 0x06, - 0x00, 0xed, 0x40, 0xf2, 0x0b, 0xc5, 0xff, 0xcb, 0xc6, 0x05, 0x66, 0x10, 0xfd, 0x78, 0xb9, 0xfb, - 0x06, 0xf3, 0xf6, 0x28, 0x9f, 0xff, 0xfb, 0x2b, 0xfb, 0xc2, 0x31, 0xf7, 0x8b, 0xc2, 0xfd, 0x81, - 0x45, 0xfc, 0xb9, 0x04, 0xff, 0x46, 0x28, 0xfd, 0x41, 0x75, 0xfd, 0x65, 0xd1, 0xff, 0x7e, 0xa7, - 0x00, 0x0b, 0x0d, 0x00, 0xb3, 0xd7, 0xff, 0xc8, 0x8b, 0x05, 0x13, 0x02, 0x00, 0x05, 0x75, 0xfd, - 0xae, 0x14, 0x02, 0x77, 0x99, 0xfe, 0x79, 0x97, 0x52, 0x37, 0xdb, 0x43, 0x38, 0xde, 0xe3, 0xf8, - 0x88, 0xf8, 0xfa, 0xbe, 0x13, 0xae, 0x05, 0x02, 0xd9, 0x13, 0xfe, 0x4b, 0xc5, 0xff, 0x39, 0xd6, - 0xfe, 0xfb, 0x44, 0xf3, 0x7f, 0x02, 0x00, 0x3b, 0xe2, 0x04, 0x71, 0x63, 0xfc, 0xe9, 0x20, 0xfc, - 0x8a, 0x5d, 0xf6, 0x6a, 0x63, 0xfe, 0x6d, 0x4a, 0xfb, 0xe0, 0xc8, 0xf7, 0x31, 0xfe, 0xfd, 0x50, - 0xe6, 0xfb, 0x66, 0x5d, 0xff, 0xb2, 0xc5, 0xfd, 0xfe, 0x8a, 0xfd, 0x5c, 0xd7, 0xff, 0x26, 0x02, - 0x01, 0x22, 0x17, 0x01, 0xec, 0x09, 0xff, 0x7e, 0x10, 0x05, 0xf9, 0xbb, 0x00, 0xe7, 0x03, 0xfc, - 0xf9, 0x73, 0x01, 0x66, 0x2f, 0xff, 0x3f, 0x98, 0x56, 0xc3, 0x00, 0x46, 0x0a, 0x9a, 0xe2, 0xad, - 0xe6, 0xf7, 0xe9, 0x5c, 0x10, 0xff, 0x75, 0xff, 0x4c, 0x2b, 0x00, 0x0d, 0x7e, 0x00, 0x0d, 0x3c, - 0xfe, 0x03, 0x77, 0xf3, 0xd9, 0x12, 0x00, 0x2d, 0x06, 0x04, 0xc9, 0x3f, 0xfb, 0x55, 0x04, 0xfd, - 0x80, 0x20, 0xf6, 0x61, 0xe3, 0xfc, 0x70, 0x02, 0xfc, 0xc1, 0x88, 0xf8, 0x05, 0x99, 0xfd, 0x77, - 0x5e, 0xfb, 0x9a, 0xdd, 0xff, 0x98, 0x55, 0xfe, 0x1d, 0x8d, 0xfd, 0xae, 0xf3, 0xff, 0x05, 0x3b, - 0x01, 0xb2, 0xa7, 0x02, 0xf0, 0x7d, 0xfe, 0x05, 0x37, 0x03, 0xc4, 0x82, 0x01, 0xa6, 0x30, 0xfb, - 0x5a, 0x6e, 0xff, 0x45, 0xa9, 0xff, 0x8b, 0x53, 0x59, 0xe2, 0xfb, 0x47, 0x38, 0x13, 0xe3, 0xdc, - 0x15, 0xf8, 0x63, 0x69, 0x0c, 0xda, 0x03, 0xfc, 0x13, 0xe3, 0x01, 0x6b, 0xa8, 0x01, 0x89, 0xb8, - 0xfd, 0x74, 0x97, 0xf3, 0x5d, 0x38, 0x00, 0x89, 0x97, 0x02, 0xf2, 0x3a, 0xfa, 0x10, 0xe5, 0xfe, - 0x32, 0x23, 0xf6, 0x25, 0x86, 0xfb, 0x4e, 0xfa, 0xfc, 0x37, 0x1c, 0xf9, 0x3e, 0x02, 0xfd, 0xb2, - 0xb0, 0xfa, 0x37, 0xae, 0x00, 0xf8, 0xed, 0xfe, 0x75, 0x11, 0xfd, 0xb9, 0xf8, 0x00, 0x35, 0xa5, - 0x01, 0xa2, 0x0b, 0x03, 0xc9, 0x56, 0xfe, 0x98, 0x5d, 0x01, 0x3b, 0x88, 0x01, 0x5a, 0xfb, 0xfa, - 0xf5, 0x02, 0xfe, 0x8b, 0x83, 0xff, 0xc9, 0x25, 0x5b, 0x5e, 0x10, 0x49, 0x1c, 0x08, 0xe5, 0x61, - 0xa5, 0xf9, 0x4d, 0x4d, 0x07, 0x11, 0x0d, 0xf8, 0x5d, 0x6f, 0x03, 0x14, 0x43, 0x02, 0x05, 0x4b, - 0xfd, 0xaf, 0xb4, 0xf3, 0x51, 0x35, 0x00, 0xee, 0xb4, 0x00, 0x03, 0xa9, 0xf9, 0x7c, 0xc6, 0x01, - 0x6e, 0x22, 0xf6, 0xb2, 0x1e, 0xfa, 0x65, 0xff, 0xfd, 0xa1, 0x38, 0xf9, 0x10, 0x2c, 0xfc, 0x85, - 0xb8, 0xfa, 0x04, 0x1b, 0x01, 0xaa, 0xec, 0xfe, 0x62, 0xd6, 0xfd, 0xac, 0xc5, 0x01, 0x81, 0x97, - 0x00, 0x81, 0x3c, 0x03, 0x1f, 0xa9, 0xfe, 0xb0, 0x51, 0xff, 0x56, 0x00, 0x01, 0xb7, 0x18, 0xfc, - 0xd9, 0x7d, 0xfd, 0xc0, 0xf1, 0xfd, 0xc8, 0xd6, 0x5b, 0x4f, 0x96, 0x49, 0xe1, 0x43, 0xe8, 0x99, - 0xbc, 0xfb, 0x88, 0x99, 0x01, 0xe9, 0xc9, 0xf3, 0xc6, 0x6c, 0x04, 0xc7, 0x65, 0x02, 0x39, 0xa6, - 0xfc, 0x48, 0x86, 0xf3, 0x03, 0x24, 0x00, 0xda, 0xff, 0xfe, 0x6a, 0xd5, 0xf9, 0x15, 0x00, 0x05, - 0x04, 0xcd, 0xf5, 0x36, 0x08, 0xf9, 0x4f, 0x64, 0xfe, 0x9b, 0xb1, 0xf8, 0x04, 0x74, 0xfc, 0x9e, - 0x44, 0xfa, 0xc9, 0x2d, 0x01, 0x3e, 0x1a, 0x00, 0x1d, 0x4f, 0xfd, 0xac, 0x58, 0x01, 0xb2, 0x0c, - 0x00, 0x43, 0xef, 0x02, 0x42, 0x71, 0xfe, 0x4a, 0x48, 0xfe, 0x18, 0x73, 0x01, 0x8f, 0x29, 0xfc, - 0x7d, 0xa3, 0xfd, 0xd3, 0x86, 0xfe, 0x95, 0x5b, 0x5a, 0x4a, 0x79, 0x4a, 0x2e, 0x50, 0xed, 0xfb, - 0x17, 0xfe, 0x8b, 0xe8, 0xfc, 0x4e, 0x5f, 0xef, 0xb3, 0x7b, 0x04, 0x00, 0x8f, 0x02, 0xec, 0xee, - 0xfb, 0xf0, 0x55, 0xf3, 0xc5, 0xb2, 0x00, 0xa3, 0x92, 0xfe, 0xef, 0xe7, 0xf9, 0xb5, 0x43, 0x08, - 0xd6, 0x53, 0xf6, 0x77, 0x18, 0xf7, 0x45, 0xfb, 0xfe, 0x9f, 0xc5, 0xf8, 0x72, 0x72, 0xfc, 0x1a, - 0x3c, 0xfb, 0x89, 0x09, 0x01, 0xd2, 0x30, 0xff, 0xcd, 0x11, 0xfd, 0xf8, 0x8b, 0x01, 0x44, 0xae, - 0xfe, 0x4f, 0x81, 0x02, 0x80, 0xd8, 0xff, 0x24, 0xdc, 0xfd, 0xb4, 0x05, 0x01, 0xb3, 0xad, 0xfd, - 0x11, 0xcb, 0xfe, 0xe5, 0x01, 0xfe, 0xbe, 0x0f, 0x5a, 0x40, 0x5b, 0x48, 0x1a, 0x9b, 0xf2, 0xd1, - 0x0b, 0x01, 0x13, 0xe6, 0xf7, 0x02, 0xa0, 0xeb, 0xdb, 0x89, 0x02, 0xd3, 0x0b, 0x03, 0x1d, 0xca, - 0xfa, 0xd6, 0x64, 0xf3, 0x41, 0xc2, 0x02, 0xf0, 0x18, 0xfd, 0x01, 0x17, 0xfb, 0x76, 0xd6, 0x0a, - 0xe2, 0x0f, 0xf6, 0xe9, 0xe3, 0xf5, 0x5b, 0x50, 0xfe, 0xe7, 0x6e, 0xfa, 0x87, 0xac, 0xfd, 0xf2, - 0xb4, 0xf9, 0x84, 0xb9, 0xff, 0x8e, 0x40, 0xff, 0x4e, 0x85, 0xfc, 0x29, 0x97, 0x00, 0xd4, 0xa7, - 0xfe, 0x82, 0xf3, 0x02, 0xfe, 0xd9, 0xff, 0xbb, 0x5b, 0xfe, 0x6c, 0x33, 0x02, 0x9f, 0xf3, 0xfd, - 0x9e, 0x04, 0xfe, 0x99, 0x8f, 0xfe, 0xe8, 0x93, 0x56, 0x4c, 0x08, 0x48, 0xe2, 0xf0, 0xf8, 0xa0, - 0x31, 0x03, 0xb2, 0x8e, 0xf5, 0xcb, 0xc5, 0xe7, 0xbd, 0x97, 0xfe, 0x70, 0x7b, 0x03, 0x7a, 0xc4, - 0xfb, 0xe0, 0xe9, 0xf3, 0xf0, 0xb1, 0x03, 0xd0, 0x1e, 0xfd, 0xf7, 0xf2, 0xfb, 0xe6, 0xfc, 0x0c, - 0x88, 0xb5, 0xf5, 0xd9, 0x36, 0xf4, 0xb9, 0x22, 0x01, 0xe8, 0x2c, 0xfb, 0x00, 0x57, 0xfb, 0x5c, - 0xd9, 0xf9, 0x3a, 0xa1, 0xfe, 0x9e, 0x26, 0xfe, 0xda, 0xd3, 0xfc, 0x53, 0x08, 0x01, 0x74, 0x61, - 0xfe, 0x15, 0x9c, 0x02, 0x9e, 0xe5, 0x01, 0x6c, 0x87, 0xff, 0xe0, 0x75, 0x00, 0x7a, 0xf2, 0xfd, - 0xc0, 0xab, 0x00, 0x8c, 0xcf, 0xfd, 0xb9, 0x69, 0x53, 0x88, 0x58, 0x46, 0x90, 0x9e, 0xfe, 0x88, - 0x05, 0x05, 0x9b, 0x0c, 0xf4, 0x7e, 0x9c, 0xe4, 0xe5, 0x84, 0xf8, 0xa2, 0x06, 0x05, 0xbe, 0xe3, - 0xfe, 0x60, 0x60, 0xf3, 0x2b, 0xa3, 0x03, 0x76, 0x8c, 0xfe, 0x29, 0x26, 0xfd, 0xca, 0x37, 0x0b, - 0x66, 0xdc, 0xf7, 0x9f, 0x47, 0xf6, 0xa0, 0xbc, 0xfe, 0x9b, 0x2c, 0xfb, 0x78, 0x2b, 0xfb, 0xf9, - 0x57, 0xf8, 0xbc, 0xae, 0xfd, 0x14, 0xbb, 0xfe, 0x8e, 0x8c, 0xfd, 0xf1, 0xc6, 0xff, 0x34, 0xa3, - 0xff, 0xb8, 0x96, 0x04, 0x5a, 0x42, 0x00, 0xc5, 0x1c, 0xff, 0xfa, 0x04, 0x02, 0x23, 0xd5, 0xfd, - 0xd0, 0xc8, 0x00, 0xb2, 0xa8, 0xfd, 0x45, 0x71, 0x50, 0xb2, 0xc9, 0x44, 0x9a, 0x3c, 0x01, 0x44, - 0x39, 0x08, 0x45, 0x2d, 0xf4, 0x31, 0x4a, 0xdf, 0x98, 0xd5, 0xf4, 0x59, 0x43, 0x08, 0x86, 0xff, - 0xff, 0xee, 0x6b, 0xf3, 0x8e, 0xd8, 0x05, 0x67, 0xd0, 0xfc, 0x1e, 0x2b, 0xfd, 0x23, 0xe5, 0x0e, - 0xa3, 0x6a, 0xf7, 0x2f, 0x3e, 0xf5, 0x29, 0x7c, 0xff, 0xbb, 0x2e, 0xf9, 0x24, 0x3c, 0xfa, 0x77, - 0xf3, 0xf9, 0x2b, 0x20, 0xfd, 0x23, 0xeb, 0xfd, 0x4e, 0x88, 0xfe, 0x59, 0xcb, 0x01, 0x7d, 0xdf, - 0xff, 0x65, 0x4d, 0x02, 0xf6, 0x90, 0x00, 0x80, 0x3f, 0x01, 0xed, 0x9e, 0x01, 0x61, 0xf3, 0xfb, - 0x5a, 0xe8, 0x01, 0x6c, 0xf9, 0xff, 0x38, 0x0f, 0x50, 0xc6, 0x53, 0x3f, 0x08, 0xbe, 0x02, 0x67, - 0xc4, 0x0c, 0xa9, 0xf6, 0xf0, 0x69, 0x0e, 0xdd, 0xff, 0x8d, 0xf4, 0x42, 0x3b, 0x08, 0x6f, 0x55, - 0x02, 0x63, 0x78, 0xf5, 0xad, 0xce, 0x03, 0x10, 0xa6, 0xfc, 0x78, 0xa5, 0x00, 0x02, 0x81, 0x0d, - 0x7a, 0xfc, 0xf6, 0xd1, 0x89, 0xf6, 0x19, 0x85, 0xfc, 0x06, 0x73, 0xf8, 0x21, 0x2b, 0xfd, 0x6d, - 0xcd, 0xf9, 0x1c, 0xb4, 0xfa, 0xfb, 0xd2, 0x00, 0xc4, 0x37, 0x01, 0x4d, 0xd8, 0xfe, 0x7a, 0x33, - 0xff, 0xc9, 0x11, 0x04, 0xd9, 0x72, 0x00, 0xdc, 0xf3, 0xff, 0x04, 0xba, 0x01, 0xac, 0xea, 0xfc, - 0xb6, 0xa8, 0x01, 0x04, 0xca, 0x00, 0x6c, 0xbf, 0x4c, 0x98, 0xf6, 0x3a, 0x46, 0x65, 0x05, 0x81, - 0x85, 0x0e, 0xc3, 0xd8, 0xef, 0xb8, 0x64, 0xdd, 0x60, 0xcc, 0xf3, 0x8e, 0x54, 0x08, 0x21, 0xb1, - 0x02, 0x8d, 0x1a, 0xf9, 0xef, 0xd5, 0x03, 0xa0, 0xb5, 0xf7, 0xe2, 0x2f, 0x04, 0x46, 0xd2, 0x0e, - 0xcd, 0xa9, 0xf3, 0x04, 0xd1, 0xf6, 0x9d, 0x5e, 0xfc, 0x98, 0x7f, 0xf9, 0xc4, 0x6e, 0xfd, 0xe2, - 0xa3, 0xf9, 0x5e, 0x34, 0xfd, 0xb7, 0x21, 0x01, 0x85, 0x20, 0xff, 0x2f, 0x3e, 0xff, 0x1a, 0xd3, - 0x00, 0x97, 0x91, 0x02, 0x6c, 0x2e, 0xff, 0x72, 0xce, 0x00, 0x0f, 0x0f, 0x02, 0x75, 0x63, 0xfd, - 0xb3, 0x52, 0x01, 0xa7, 0x5c, 0x00, 0xe0, 0x68, 0x47, 0xa9, 0xe4, 0x38, 0x34, 0x4c, 0x07, 0x3e, - 0xdc, 0x0c, 0x5e, 0x56, 0xf0, 0xf7, 0xf6, 0xe2, 0x36, 0x7d, 0xf3, 0x88, 0xda, 0x02, 0xa7, 0xfa, - 0x07, 0x8f, 0x9f, 0xfd, 0xb2, 0x80, 0xfc, 0xbf, 0x2a, 0xf8, 0xf9, 0x3b, 0x08, 0xe5, 0xbb, 0x0a, - 0x16, 0xe6, 0xf2, 0x8c, 0x06, 0xfa, 0x4b, 0xa0, 0xfb, 0x70, 0x50, 0xf8, 0xa5, 0xe7, 0x00, 0x34, - 0x83, 0xfb, 0x2c, 0xc8, 0xfa, 0xfa, 0x07, 0x01, 0x13, 0xa6, 0x00, 0x80, 0x17, 0xff, 0x33, 0x7f, - 0xff, 0x7b, 0xea, 0x01, 0x08, 0x01, 0x00, 0x32, 0xd2, 0x00, 0xa0, 0xda, 0x01, 0x68, 0x07, 0xfe, - 0xde, 0x54, 0x01, 0xbc, 0x41, 0x00, 0x18, 0x83, 0x48, 0x73, 0x22, 0x36, 0xc1, 0x1c, 0xff, 0xaa, - 0x21, 0x0c, 0x7b, 0x26, 0xf3, 0x26, 0x6e, 0xe4, 0xa1, 0x92, 0xf9, 0xbd, 0xf8, 0x02, 0x62, 0x3f, - 0x03, 0xbe, 0x17, 0xff, 0x8a, 0x89, 0xfd, 0xc8, 0x16, 0xf7, 0xb1, 0x22, 0x08, 0xdb, 0x13, 0x09, - 0xba, 0xad, 0xf2, 0xc0, 0x75, 0xfb, 0x46, 0x34, 0xfc, 0xcd, 0x7f, 0xfa, 0x8f, 0xed, 0x01, 0x4a, - 0xad, 0xf9, 0x22, 0x24, 0xfb, 0x83, 0x6a, 0x03, 0xa4, 0xde, 0xff, 0x77, 0xd1, 0xfc, 0x6f, 0x0e, - 0x00, 0xb6, 0x6e, 0x02, 0x87, 0x03, 0x00, 0x47, 0xea, 0x00, 0xfa, 0xeb, 0x00, 0x5e, 0x98, 0xfe, - 0x9d, 0x88, 0x02, 0x29, 0xca, 0xff, 0x56, 0x1b, 0x45, 0x41, 0x95, 0x2f, 0x36, 0xc5, 0xfe, 0x82, - 0xb6, 0x0f, 0xf8, 0xcd, 0xf1, 0xa5, 0x49, 0xe9, 0x1b, 0x59, 0xfe, 0xd6, 0x9c, 0xfd, 0x89, 0x43, - 0x04, 0xa6, 0x4c, 0x01, 0x90, 0x39, 0xf9, 0x4e, 0x2a, 0xf7, 0xfa, 0x34, 0x0a, 0x46, 0xd4, 0x07, - 0x53, 0xb8, 0xf1, 0x0e, 0xfa, 0xfd, 0x74, 0x63, 0xfe, 0xae, 0x69, 0xfa, 0xaa, 0xb4, 0x01, 0x2f, - 0x96, 0xf9, 0x2b, 0x57, 0xfc, 0xcd, 0xa6, 0x03, 0x4b, 0x59, 0xfe, 0x27, 0xa4, 0xfc, 0x44, 0xd8, - 0x00, 0x61, 0x6e, 0x02, 0x53, 0x36, 0xff, 0x3d, 0xfd, 0x00, 0x6f, 0xf0, 0x01, 0xbe, 0xcb, 0xfe, - 0x3c, 0x01, 0x02, 0x78, 0x9d, 0xff, 0x37, 0xb6, 0x3f, 0xde, 0x14, 0x2a, 0x78, 0x0f, 0xff, 0x3d, - 0xa5, 0x11, 0x41, 0x19, 0xf6, 0x0d, 0x3f, 0xeb, 0x61, 0x89, 0xfd, 0xca, 0xb4, 0xff, 0x27, 0x67, - 0x03, 0x27, 0x3b, 0xfe, 0x6e, 0x7a, 0xf9, 0xf6, 0x3c, 0xf9, 0x1b, 0x65, 0x09, 0x87, 0x88, 0x05, - 0xa7, 0x5c, 0xf4, 0x6e, 0x6e, 0x00, 0xdd, 0xe8, 0xfd, 0x96, 0x93, 0xfa, 0xb2, 0xa0, 0x01, 0x98, - 0x8d, 0xfa, 0x52, 0xe7, 0xfc, 0x65, 0xa9, 0x02, 0xc1, 0xd2, 0xfd, 0x51, 0xfd, 0xfc, 0xd8, 0xbb, - 0x01, 0x03, 0x81, 0x01, 0xf5, 0x5d, 0xfe, 0x83, 0x2c, 0x02, 0x78, 0x93, 0x02, 0xe9, 0x8b, 0xfe, - 0x9f, 0x6a, 0x01, 0x79, 0x90, 0xff, 0x4b, 0xd7, 0x3c, 0x39, 0x02, 0x31, 0x64, 0xd6, 0x09, 0xa6, - 0xec, 0x08, 0xc3, 0x78, 0xe1, 0xb4, 0x04, 0xe1, 0xd4, 0x4f, 0x04, 0xea, 0xf0, 0x0d, 0xb3, 0xce, - 0x08, 0x9d, 0x06, 0xfb, 0x20, 0xaf, 0xf7, 0x5c, 0x1d, 0xf3, 0x39, 0x4d, 0x01, 0xbd, 0xa7, 0x07, - 0x6b, 0x28, 0xf8, 0x0d, 0x3f, 0x02, 0xe0, 0x4d, 0x02, 0xc5, 0x3e, 0xfb, 0xf8, 0x49, 0x02, 0x32, - 0x64, 0xff, 0xcf, 0xb0, 0xfe, 0x07, 0x29, 0x02, 0x8c, 0xd8, 0xfe, 0xd0, 0x97, 0xfd, 0x6f, 0x23, - 0xff, 0x41, 0x5e, 0xfd, 0x37, 0xe3, 0xfd, 0xad, 0x02, 0x02, 0x8d, 0x4a, 0xff, 0x94, 0x89, 0xfd, - 0xa5, 0x59, 0x03, 0x3d, 0x63, 0x01, 0xbf, 0x3c, 0x33, 0x99, 0xcb, 0x2e, 0x68, 0x9d, 0x0d, 0xc3, - 0xbc, 0x0a, 0x4c, 0x71, 0xe8, 0xc2, 0x27, 0xe0, 0xdc, 0xd3, 0xfe, 0x3f, 0x6b, 0x0b, 0xd5, 0xd4, - 0x07, 0xec, 0x00, 0x00, 0xa1, 0x35, 0xfb, 0x63, 0x85, 0xf3, 0xb1, 0x34, 0xfe, 0xcf, 0x47, 0x05, - 0x85, 0xae, 0xfb, 0xc9, 0x7a, 0x02, 0xde, 0x4b, 0x01, 0xf4, 0x08, 0xfc, 0xbb, 0x64, 0x02, 0xf9, - 0x48, 0x00, 0xd3, 0x4f, 0xfe, 0x91, 0xd6, 0x01, 0x04, 0x4e, 0x00, 0x6f, 0x2d, 0xfe, 0x9b, 0x41, - 0xff, 0xa0, 0xba, 0xfd, 0x07, 0x4c, 0xfd, 0x3a, 0xdf, 0x00, 0x2c, 0x7c, 0xfe, 0x15, 0xc1, 0xfd, - 0x5d, 0x11, 0x04, 0xab, 0xf1, 0x01, 0x74, 0x52, 0x2c, 0xaa, 0xa1, 0x2a, 0xfb, 0x89, 0x0e, 0xd0, - 0xd4, 0x0b, 0x3b, 0x8e, 0xed, 0x0f, 0xf2, 0xe3, 0x15, 0xf1, 0xfd, 0x14, 0x21, 0x08, 0xe5, 0xc4, - 0x05, 0x12, 0x17, 0x01, 0x68, 0xd6, 0xfc, 0xbc, 0x62, 0xf5, 0xe2, 0x19, 0xfd, 0x52, 0xcb, 0x04, - 0x98, 0x60, 0xfd, 0xad, 0x06, 0x01, 0xf9, 0xf8, 0x00, 0x97, 0xe3, 0xfc, 0x3e, 0xcc, 0x01, 0x43, - 0xac, 0x00, 0x89, 0x80, 0xfe, 0x1c, 0x23, 0x01, 0x4d, 0xab, 0x00, 0x99, 0xfc, 0xfe, 0xf6, 0xeb, - 0xfe, 0x9f, 0xc1, 0xfd, 0xed, 0xd4, 0xfd, 0x01, 0x2b, 0x00, 0x26, 0x60, 0xfe, 0xcb, 0xb4, 0xfe, - 0xe8, 0xc0, 0x03, 0xc0, 0x0e, 0x02, 0x3b, 0x77, 0x24, 0x60, 0x25, 0x26, 0x40, 0xdc, 0x10, 0x9a, - 0x24, 0x0c, 0x0b, 0xba, 0xf1, 0x42, 0x58, 0xe9, 0x27, 0x8b, 0xfc, 0x3b, 0xb8, 0x04, 0xfd, 0x22, - 0x05, 0x26, 0xc0, 0x01, 0xf9, 0x2a, 0xfe, 0x62, 0x75, 0xf7, 0x2f, 0x90, 0xfc, 0x8f, 0x34, 0x04, - 0xe9, 0x38, 0xfe, 0x2b, 0x0c, 0x00, 0x60, 0xed, 0x00, 0xd2, 0xaf, 0xfd, 0xd8, 0x48, 0x01, 0x27, - 0xf9, 0x00, 0x27, 0xf2, 0xfe, 0x36, 0xad, 0x00, 0xf6, 0x1d, 0x01, 0x3b, 0x9b, 0xff, 0x14, 0xa0, - 0xfe, 0x84, 0x02, 0xfe, 0xa1, 0x3f, 0xfe, 0x95, 0xf2, 0xff, 0x54, 0x47, 0xff, 0x2c, 0xc7, 0xff, - 0xbe, 0x03, 0x03, 0xca, 0xe2, 0x01, 0x30, 0x91, 0x1e, 0x0f, 0x0e, 0x23, 0x2b, 0xb4, 0x12, 0xc4, - 0xa2, 0x0b, 0xc9, 0xa2, 0xf4, 0x67, 0x84, 0xed, 0xe8, 0xa8, 0xfb, 0x3b, 0x1e, 0x03, 0xab, 0xc0, - 0x04, 0x12, 0xd0, 0x01, 0x69, 0x4a, 0xff, 0x8e, 0x4a, 0xf9, 0xeb, 0x85, 0xfc, 0x24, 0x46, 0x03, - 0x33, 0x93, 0xfe, 0x91, 0x0b, 0x00, 0x7e, 0x12, 0x01, 0xe9, 0x06, 0xfe, 0x71, 0xfa, 0x00, 0xae, - 0x79, 0x01, 0xb5, 0x75, 0xff, 0xa8, 0x75, 0x00, 0x6d, 0x59, 0x01, 0xff, 0xd1, 0xff, 0x7c, 0xb6, - 0xfe, 0x93, 0xdf, 0xfe, 0x0b, 0x31, 0xff, 0xf6, 0x09, 0x00, 0xbb, 0x92, 0xff, 0x73, 0x25, 0x00, - 0x2a, 0x39, 0x02, 0xc3, 0x5e, 0x01, 0x53, 0xc3, 0x18, 0xd8, 0x90, 0x1f, 0xe5, 0xca, 0x13, 0xfe, - 0xb5, 0x0b, 0x84, 0xd4, 0xf7, 0xb0, 0x89, 0xf0, 0x1c, 0xe6, 0xfa, 0x19, 0x23, 0x02, 0x71, 0x4b, - 0x04, 0x92, 0x27, 0x02, 0xdc, 0x1a, 0x00, 0x31, 0xa4, 0xfa, 0x0a, 0xd8, 0xfc, 0xcf, 0x83, 0x02, - 0x1b, 0xa5, 0xfe, 0xc0, 0xdd, 0xff, 0x6d, 0x5d, 0x01, 0x22, 0xae, 0xfe, 0xea, 0xbc, 0x00, 0xdb, - 0xac, 0x01, 0x4d, 0xf9, 0xff, 0xdc, 0x62, 0x00, 0x8b, 0x66, 0x01, 0x80, 0xa1, 0x00, 0xf0, 0xd1, - 0xff, 0x18, 0xdc, 0xff, 0xf9, 0x61, 0xff, 0xdf, 0x1e, 0xff, 0xd3, 0x66, 0xff, 0x84, 0x3c, 0x00, - 0xb9, 0x14, 0x01, 0x6a, 0xb7, 0x00, 0x0c, 0xe1, 0x14, 0x56, 0x91, 0x1c, 0x6e, 0x39, 0x14, 0x8b, - 0x8f, 0x0c, 0x1a, 0x21, 0xfa, 0xd1, 0x46, 0xf2, 0x8c, 0xbb, 0xfa, 0x09, 0xc6, 0x01, 0x62, 0x49, - 0x04, 0x4c, 0x97, 0x02, 0x93, 0x64, 0x00, 0x5e, 0xd3, 0xfb, 0x14, 0xac, 0xfd, 0xdd, 0xc8, 0x01, - 0xb8, 0x83, 0xfe, 0x97, 0x59, 0x00, 0x07, 0xd7, 0x01, 0xea, 0x18, 0xff, 0x9b, 0xfd, 0x00, 0xc5, - 0xc4, 0x01, 0x71, 0x38, 0x00, 0x4f, 0x92, 0x01, 0x03, 0x96, 0x02, 0x6e, 0xee, 0x00, 0x17, 0xdd, - 0xff, 0xb0, 0x0a, 0x00, 0xd2, 0x20, 0xff, 0x15, 0x37, 0xfe, 0x4d, 0x43, 0xff, 0x08, 0x73, 0x00, - 0x8d, 0x96, 0x00, 0xe1, 0xac, 0x00, 0x5d, 0x9d, 0x12, 0x80, 0xab, 0x1a, 0x87, 0x91, 0x13, 0xc9, - 0xc2, 0x0b, 0x60, 0xe5, 0xfa, 0x33, 0xf7, 0xf3, 0x3c, 0x91, 0xfb, 0x31, 0x75, 0x01, 0xcd, 0xc3, - 0x03, 0xa0, 0xad, 0x02, 0x2c, 0xc7, 0x00, 0xe0, 0xaf, 0xfc, 0x3f, 0xd5, 0xfd, 0xe4, 0x43, 0x01, - 0x3c, 0xb6, 0xfe, 0x27, 0xb8, 0x00, 0x71, 0x01, 0x02, 0xf3, 0x24, 0xff, 0xdf, 0x42, 0x01, 0x26, - 0xc5, 0x02, 0xc4, 0x61, 0x01, 0x64, 0xe1, 0x01, 0x43, 0x14, 0x02, 0x41, 0x67, 0x00, 0xbc, 0x7a, - 0xff, 0xed, 0x65, 0xff, 0x48, 0x1b, 0xfe, 0x03, 0x0b, 0xfe, 0xeb, 0xe6, 0xff, 0x4a, 0x08, 0x00, - 0x8c, 0x30, 0x00, 0xab, 0xb6, 0x00, 0xed, 0x55, 0x10, 0xe0, 0x2e, 0x18, 0x41, 0xf8, 0x12, 0x92, - 0xfb, 0x0b, 0x6c, 0xfe, 0xfb, 0xd4, 0x14, 0xf5, 0xe4, 0xe3, 0xfb, 0x3a, 0x86, 0x01, 0x75, 0xf8, - 0x03, 0xdc, 0xd3, 0x02, 0x3a, 0xec, 0x00, 0xa2, 0xac, 0xfd, 0x19, 0x59, 0xfe, 0x60, 0x03, 0x01, - 0x1c, 0x0d, 0xff, 0xc8, 0xb8, 0x00, 0xa8, 0x9b, 0x02, 0x5e, 0x51, 0x01, 0xbb, 0x60, 0x02, 0x74, - 0x80, 0x02, 0xe7, 0x12, 0x01, 0xdd, 0x41, 0x01, 0xe4, 0x49, 0x01, 0x4d, 0x67, 0xff, 0xe7, 0xc6, - 0xfe, 0x7a, 0x77, 0xff, 0xa1, 0x13, 0xfe, 0x6d, 0x41, 0xfe, 0xf2, 0x44, 0x00, 0xf8, 0x93, 0xff, - 0x6b, 0x44, 0xff, 0x1a, 0xa8, 0x00, 0xd5, 0xad, 0x0f, 0x8e, 0xa2, 0x17, 0x92, 0xd9, 0x11, 0xa7, - 0x6d, 0x0a, 0x27, 0x1a, 0xfc, 0xfc, 0x73, 0xf6, 0xfc, 0x21, 0xfd, 0x68, 0xf9, 0x01, 0x8f, 0x11, - 0x04, 0x81, 0xe0, 0x02, 0x19, 0x27, 0x01, 0x4a, 0xd7, 0xfe, 0xd8, 0xb3, 0xfe, 0x3a, 0x99, 0x00, - 0xae, 0x2a, 0x00, 0x51, 0x7f, 0x02, 0x27, 0xd0, 0x03, 0x70, 0x7d, 0x01, 0xa8, 0x68, 0x01, 0xd2, - 0xa3, 0x01, 0x2b, 0xb2, 0x00, 0xf9, 0xad, 0x00, 0x7d, 0x8c, 0x00, 0x1f, 0x51, 0xff, 0x11, 0x20, - 0xff, 0x49, 0x49, 0xff, 0xb1, 0x5b, 0xfe, 0xa7, 0xba, 0xfe, 0x5f, 0x62, 0xff, 0xb4, 0x9d, 0xff, - 0x27, 0x9d, 0x00, 0x22, 0x8c, 0x00, 0x73, 0x63, 0x0f, 0xbd, 0xeb, 0x16, 0x96, 0x9d, 0x10, 0x00, - 0xfe, 0x08, 0x71, 0xea, 0xfb, 0x3e, 0xe9, 0xf7, 0xd9, 0xd2, 0xfe, 0x17, 0x79, 0x02, 0x01, 0x12, - 0x04, 0x1f, 0x50, 0x03, 0x87, 0x98, 0x01, 0x1a, 0x77, 0xff, 0x2b, 0xd3, 0xff, 0x62, 0x56, 0x02, - 0xb6, 0x67, 0x01, 0x5f, 0x04, 0x02, 0x36, 0xa8, 0x02, 0x4d, 0x93, 0x00, 0x7e, 0x95, 0x00, 0x34, - 0xda, 0x00, 0x2a, 0x69, 0x00, 0xed, 0x9e, 0x00, 0x1a, 0x6d, 0x00, 0xd8, 0x68, 0xff, 0xcc, 0xd9, - 0xfe, 0x60, 0x15, 0xff, 0x0d, 0x65, 0xfe, 0x1d, 0x2e, 0xff, 0x65, 0xb3, 0x00, 0x95, 0x86, 0xff, - 0x95, 0x78, 0xff, 0x92, 0x40, 0x00, 0x36, 0x41, 0x0f, 0x72, 0xd5, 0x16, 0x91, 0x50, 0x0f, 0x24, - 0xb7, 0x07, 0x06, 0x94, 0xfc, 0x6a, 0x05, 0xf9, 0x4e, 0xeb, 0xff, 0x9f, 0x84, 0x03, 0x1d, 0x3a, - 0x04, 0xf3, 0x21, 0x03, 0xee, 0xc9, 0x02, 0xf7, 0xc8, 0x01, 0x86, 0x17, 0x00, 0x93, 0x0b, 0x01, - 0x28, 0xf0, 0x00, 0x98, 0x2a, 0x01, 0xfc, 0x95, 0x01, 0xee, 0x56, 0x00, 0x72, 0x5e, 0x00, 0x96, - 0xc8, 0x00, 0x5d, 0x9c, 0x00, 0xa2, 0x7b, 0x00, 0x4c, 0x10, 0x00, 0x29, 0x3e, 0xff, 0x76, 0xac, - 0xfe, 0x34, 0x53, 0xff, 0x2c, 0x08, 0x00, 0xe8, 0xbc, 0xff, 0x3e, 0x2d, 0xff, 0x45, 0x15, 0xff, - 0xf8, 0xb9, 0xff, 0xcc, 0x2e, 0x00, 0x8e, 0x5e, 0x0e, 0x4f, 0x4f, 0x16, 0x5a, 0xd0, 0x0e, 0x18, - 0x19, 0x07, 0xed, 0xbe, 0xfd, 0xff, 0xcf, 0xfa, 0xf5, 0x18, 0x01, 0x83, 0x38, 0x04, 0x37, 0x0e, - 0x05, 0xfd, 0xd8, 0x04, 0xea, 0x17, 0x03, 0x3b, 0x69, 0x00, 0x57, 0x48, 0xff, 0x66, 0x06, 0x00, - 0x1d, 0xd4, 0xff, 0x44, 0xc9, 0x00, 0xaf, 0x2f, 0x01, 0x14, 0x69, 0x00, 0xe8, 0x83, 0x00, 0xec, - 0x6f, 0x00, 0x8a, 0x64, 0x00, 0x35, 0x29, 0x00, 0xef, 0x04, 0x00, 0x17, 0x72, 0xff, 0x8f, 0x9c, - 0xff, 0x84, 0xbe, 0x00, 0xa0, 0x48, 0xff, 0xb3, 0x59, 0xfe, 0x9e, 0x2e, 0xff, 0x6a, 0x67, 0xff, - 0xac, 0x90, 0xff, 0xbd, 0x5c, 0xff, 0xf9, 0x31, 0x0e, 0x28, 0x4c, 0x16, 0xec, 0x13, 0x0e, 0xd5, - 0x47, 0x06, 0xec, 0x4f, 0xff, 0xdf, 0xe8, 0xfc, 0xb2, 0x10, 0x02, 0xc4, 0xb8, 0x05, 0x86, 0x86, - 0x05, 0x70, 0xfa, 0x02, 0xf2, 0xa7, 0x01, 0x82, 0x14, 0x00, 0xb9, 0xea, 0xfe, 0xec, 0xbf, 0xff, - 0xa3, 0x75, 0xff, 0xd4, 0x9f, 0x00, 0x13, 0x4c, 0x01, 0x2e, 0x2a, 0x00, 0x26, 0x39, 0x00, 0xf5, - 0x28, 0x00, 0x5e, 0xae, 0x00, 0x0e, 0x7a, 0x00, 0x6c, 0xa2, 0xff, 0x32, 0xe3, 0x00, 0x1e, 0xaa, - 0x00, 0x9e, 0xcd, 0xfe, 0xc6, 0xa9, 0xfe, 0x93, 0x1a, 0xff, 0x18, 0x1e, 0xff, 0x45, 0xdd, 0xfe, - 0x28, 0x37, 0xff, 0xb1, 0xf9, 0xff, 0x07, 0xa5, 0x0e, 0xd3, 0xa3, 0x16, 0x45, 0x7a, 0x0d, 0x2a, - 0xd4, 0x05, 0x20, 0x67, 0x00, 0x1f, 0x0d, 0xff, 0xee, 0x68, 0x03, 0xcf, 0xfd, 0x04, 0xe2, 0xd8, - 0x03, 0x03, 0xd8, 0x01, 0xe2, 0x04, 0x01, 0x81, 0xd9, 0xff, 0xac, 0x23, 0xff, 0x83, 0xd7, 0xff, - 0xac, 0x1a, 0xff, 0xbd, 0x6b, 0x00, 0x78, 0x54, 0x01, 0xd4, 0xb5, 0xff, 0x0c, 0xd0, 0xff, 0x07, - 0x08, 0x01, 0x77, 0x05, 0x01, 0x48, 0xd8, 0xff, 0x86, 0x1e, 0x01, 0x63, 0x8e, 0x01, 0xef, 0xca, - 0xfe, 0x3e, 0xad, 0xfe, 0xf2, 0x42, 0xff, 0xc3, 0xbe, 0xfe, 0x89, 0x8e, 0xfe, 0xaf, 0xe4, 0xfe, - 0xcd, 0xd5, 0xff, 0x84, 0x1d, 0xff, 0xd7, 0x7d, 0x0e, 0x2d, 0xbf, 0x17, 0x1c, 0xc4, 0x0e, 0x8f, - 0xca, 0x05, 0xb8, 0x7a, 0x00, 0xa4, 0x1c, 0xff, 0x7f, 0x9c, 0x02, 0x61, 0x1b, 0x04, 0x45, 0x53, - 0x03, 0xac, 0x60, 0x01, 0x0f, 0x17, 0x01, 0x18, 0x4d, 0x00, 0x02, 0x8b, 0xfe, 0xfc, 0xa7, 0xff, - 0x3b, 0xb1, 0xff, 0x0a, 0xd4, 0xff, 0xd7, 0xf2, 0x00, 0x01, 0x10, 0x00, 0x4f, 0x5b, 0x00, 0x7f, - 0x17, 0x01, 0x3d, 0x7c, 0x00, 0xec, 0x9b, 0x01, 0xfb, 0xe3, 0x01, 0x6a, 0x51, 0xff, 0x8e, 0xec, - 0xfe, 0xd3, 0xd7, 0xff, 0x01, 0xbf, 0xfe, 0xb4, 0xdf, 0xfd, 0x4c, 0xa8, 0xfe, 0xeb, 0x83, 0xff, - 0xd1, 0xf8, 0xfe, 0xfb, 0xc1, 0xfe, 0x6d, 0x5c, 0x0f, 0x65, 0x51, 0x19, 0x29, 0x84, 0x0f, 0xdf, - 0x15, 0x05, 0xca, 0x8a, 0xff, 0xbd, 0xc2, 0xfd, 0xc4, 0xf4, 0x00, 0x1e, 0x21, 0x04, 0x5c, 0x20, - 0x04, 0x55, 0x71, 0x01, 0x3f, 0x13, 0x01, 0x7a, 0x62, 0x00, 0x63, 0x52, 0xfe, 0x97, 0x32, 0xff, - 0xba, 0xca, 0xff, 0xaf, 0x47, 0x00, 0xed, 0xbb, 0x00, 0xa3, 0x4e, 0x00, 0x36, 0xe2, 0x00, 0x28, - 0x4d, 0x00, 0x15, 0x11, 0x01, 0x99, 0xf7, 0x02, 0x96, 0xbe, 0x00, 0xfc, 0xde, 0xfe, 0x1d, 0x9e, - 0xff, 0xfd, 0x9d, 0xff, 0x8c, 0x9e, 0xfe, 0x40, 0xe0, 0xfd, 0xe1, 0xd6, 0xfe, 0x3d, 0xfa, 0xfe, - 0x6e, 0x50, 0xfe, 0x8d, 0x92, 0xff, 0xea, 0x83, 0x0f, 0x0f, 0xbf, 0x1a, 0x27, 0x89, 0x10, 0xce, - 0x3d, 0x04, 0x13, 0x96, 0xfe, 0x90, 0xac, 0xfc, 0xc5, 0xd6, 0xff, 0xc1, 0xdf, 0x03, 0xc0, 0xe3, - 0x03, 0x6b, 0x6e, 0x01, 0x8c, 0xa6, 0x01, 0xcb, 0x7b, 0x00, 0x2a, 0xfe, 0xfd, 0x28, 0x47, 0xff, - 0x03, 0x15, 0x00, 0x71, 0x2c, 0x00, 0x2c, 0xad, 0x00, 0x71, 0x02, 0x01, 0xae, 0xac, 0x00, 0xfc, - 0x6d, 0xff, 0x65, 0x0f, 0x02, 0x61, 0x99, 0x03, 0x91, 0x05, 0x00, 0xc6, 0x02, 0xff, 0xde, 0x05, - 0x00, 0x6f, 0x6a, 0xff, 0x1c, 0x5b, 0xfe, 0x88, 0x73, 0xfe, 0xcf, 0x0f, 0xff, 0xd1, 0x2f, 0xfe, - 0x92, 0x16, 0xfe, 0xf5, 0xce, 0xff, 0x28, 0xbe, 0x0e, 0xb9, 0xfb, 0x1a, 0x5b, 0x2a, 0x12, 0x68, - 0x6d, 0x04, 0x4a, 0x7f, 0xfd, 0x9e, 0xfa, 0xfb, 0xb5, 0xca, 0xff, 0x30, 0x2c, 0x04, 0xfd, 0xbf, - 0x03, 0xe7, 0x97, 0x00, 0xd7, 0xa2, 0x00, 0x9b, 0x71, 0x00, 0xfc, 0xc3, 0xfe, 0x2b, 0x62, 0xff, - 0x87, 0xed, 0xff, 0xc9, 0xbb, 0x00, 0x2f, 0xf8, 0x00, 0x59, 0x5e, 0x00, 0x7c, 0x90, 0x00, 0x55, - 0xbf, 0xff, 0x7a, 0x7d, 0x01, 0x64, 0xa5, 0x03, 0xcd, 0xe9, 0x00, 0xdd, 0xfc, 0xfe, 0x80, 0xd2, - 0xff, 0xc8, 0x97, 0xff, 0xb5, 0x75, 0xfe, 0xc4, 0xae, 0xfe, 0xdf, 0x10, 0xff, 0x5a, 0x21, 0xfe, - 0x72, 0x43, 0xfe, 0x0c, 0xa7, 0xff, 0xb7, 0x8e, 0x0d, 0xce, 0xb0, 0x1a, 0x45, 0x2e, 0x14, 0x1b, - 0xc4, 0x05, 0xa2, 0xcc, 0xfc, 0x5e, 0xfc, 0xfa, 0x5d, 0x84, 0xff, 0x4b, 0x93, 0x04, 0x42, 0xb9, - 0x04, 0xb5, 0xe1, 0x00, 0xfc, 0x4e, 0xff, 0x09, 0x68, 0xff, 0x49, 0x75, 0xfe, 0xde, 0xd3, 0xfe, - 0x6c, 0x52, 0x00, 0xd8, 0xd1, 0x01, 0x65, 0x40, 0x01, 0xf5, 0x45, 0x00, 0xf5, 0xd8, 0x00, 0xf5, - 0x8a, 0xff, 0x0f, 0x6c, 0x00, 0x61, 0xd1, 0x03, 0xf5, 0x1d, 0x02, 0x96, 0x08, 0xff, 0x45, 0x94, - 0xff, 0x4c, 0x19, 0x00, 0x9f, 0x06, 0xff, 0xf6, 0xda, 0xfe, 0x0a, 0x2c, 0xff, 0x3e, 0x7c, 0xfe, - 0x2c, 0x6b, 0xfe, 0x0a, 0xa0, 0xff, 0x89, 0x4a, 0x0d, 0x98, 0xc0, 0x1a, 0x69, 0x35, 0x15, 0x52, - 0x83, 0x06, 0xc9, 0x5d, 0xfc, 0xdc, 0x2b, 0xfa, 0xb8, 0x1e, 0xff, 0x56, 0xf2, 0x04, 0xd1, 0x57, - 0x05, 0x05, 0x0f, 0x01, 0xb1, 0xea, 0xfe, 0x86, 0x03, 0xff, 0xda, 0x32, 0xfe, 0xd6, 0xdb, 0xfd, - 0x88, 0x2b, 0xff, 0xf3, 0x89, 0x01, 0x97, 0x01, 0x02, 0x49, 0xaf, 0x00, 0x6c, 0x93, 0x00, 0x73, - 0x21, 0x00, 0x72, 0xfd, 0xff, 0x79, 0x97, 0x02, 0x98, 0xdd, 0x02, 0x2e, 0xaa, 0xff, 0x34, 0xea, - 0xfe, 0x9c, 0xb4, 0xff, 0x56, 0x6f, 0xff, 0xa0, 0x81, 0xff, 0xb9, 0x77, 0xff, 0x64, 0x87, 0xfe, - 0xa8, 0x49, 0xfe, 0xda, 0xc2, 0xff, 0x61, 0xea, 0x0d, 0xb0, 0xb0, 0x1b, 0x4b, 0x90, 0x15, 0xb8, - 0xbd, 0x06, 0x35, 0xe2, 0xfb, 0xc5, 0x1e, 0xf9, 0x02, 0x3c, 0xff, 0x21, 0x7e, 0x05, 0x06, 0xaa, - 0x05, 0xbd, 0x44, 0x01, 0xe2, 0x73, 0xfe, 0x71, 0xd4, 0xfe, 0x23, 0x81, 0xfe, 0x41, 0x9e, 0xfd, - 0x0d, 0x84, 0xfe, 0x06, 0xae, 0x00, 0xe2, 0x75, 0x01, 0xbe, 0x97, 0x00, 0x78, 0x7d, 0x00, 0xa4, - 0xc2, 0x00, 0xce, 0x75, 0x00, 0x53, 0xca, 0x01, 0x33, 0xe8, 0x02, 0x5a, 0xad, 0x00, 0x56, 0x7a, - 0xfe, 0x84, 0xb5, 0xfe, 0x36, 0x7f, 0xff, 0x67, 0xe3, 0xff, 0x26, 0xfb, 0xff, 0xd3, 0x0f, 0xff, - 0x39, 0x73, 0xfe, 0xb8, 0xd1, 0xff, 0xa3, 0xca, 0x0e, 0x44, 0x18, 0x1d, 0xf8, 0x88, 0x16, 0xc3, - 0xd8, 0x06, 0xae, 0xef, 0xfa, 0x9a, 0x20, 0xf8, 0xbb, 0xf8, 0xfe, 0x12, 0x33, 0x06, 0xcf, 0x85, - 0x06, 0xc2, 0xe8, 0x00, 0xbd, 0xec, 0xfd, 0x13, 0xdb, 0xfe, 0x18, 0x91, 0xfe, 0x24, 0xba, 0xfd, - 0x07, 0x6b, 0xfe, 0x00, 0x27, 0x00, 0x41, 0x04, 0x01, 0x3a, 0x25, 0x00, 0xb4, 0x4b, 0xff, 0x71, - 0x6a, 0x00, 0x72, 0x2b, 0x01, 0x0d, 0x68, 0x01, 0x53, 0xcc, 0x02, 0x25, 0xf7, 0x01, 0xe5, 0x09, - 0xff, 0xe7, 0xb1, 0xfd, 0x87, 0x75, 0xfe, 0x33, 0xa9, 0xff, 0x01, 0x5b, 0x00, 0x9d, 0xbd, 0xff, - 0x49, 0x97, 0xfe, 0x56, 0xf0, 0xff, 0xaf, 0xb5, 0x0f, 0x5a, 0x09, 0x1f, 0x98, 0xa7, 0x17, 0x0c, - 0x18, 0x06, 0x13, 0xca, 0xf9, 0xf2, 0x8f, 0xf7, 0x74, 0xb9, 0xfe, 0xf8, 0xce, 0x06, 0xf3, 0x2b, - 0x07, 0x2a, 0x5e, 0x00, 0x75, 0x45, 0xfd, 0xf5, 0xb7, 0xfe, 0xf1, 0xa6, 0xfe, 0x54, 0xe1, 0xfd, - 0x77, 0x7b, 0xfe, 0xc4, 0xdf, 0xff, 0xed, 0x91, 0x00, 0x5d, 0x33, 0x00, 0xd8, 0xdd, 0xfe, 0x73, - 0x4b, 0xff, 0xca, 0xeb, 0x00, 0xc2, 0x54, 0x01, 0x3f, 0x1b, 0x02, 0x85, 0x42, 0x02, 0x5d, 0x65, - 0x00, 0x28, 0xea, 0xfd, 0x78, 0x6d, 0xfd, 0x97, 0xed, 0xfe, 0xce, 0x38, 0x00, 0x47, 0xe4, 0xff, - 0x4f, 0xa7, 0xfe, 0xfc, 0xe7, 0xff, 0x84, 0x59, 0x11, 0x65, 0xa4, 0x21, 0x9f, 0xe0, 0x18, 0x87, - 0x1d, 0x05, 0x91, 0x67, 0xf8, 0xce, 0x99, 0xf6, 0x19, 0x2a, 0xfe, 0x16, 0x27, 0x08, 0xfa, 0x44, - 0x08, 0x6f, 0x47, 0xff, 0xc1, 0x44, 0xfc, 0x48, 0x9a, 0xfe, 0x3d, 0xdf, 0xfe, 0xc6, 0xed, 0xfd, - 0x43, 0x89, 0xfe, 0xb1, 0xfd, 0xff, 0xcc, 0x47, 0x00, 0x84, 0x03, 0x00, 0x4c, 0xab, 0xfe, 0xaf, - 0xc5, 0xfe, 0x3c, 0x82, 0x00, 0xa8, 0xfb, 0x00, 0x0c, 0x49, 0x01, 0xad, 0xcc, 0x01, 0x67, 0x2b, - 0x01, 0x95, 0xa4, 0xfe, 0x20, 0x72, 0xfd, 0x2d, 0x63, 0xfe, 0x27, 0xa1, 0xff, 0x01, 0x03, 0x00, - 0x81, 0xb0, 0xfe, 0x4f, 0x89, 0xff, 0xfa, 0x55, 0x13, 0xc8, 0x63, 0x24, 0x14, 0x9b, 0x19, 0xaf, - 0xe1, 0x03, 0xc3, 0xfd, 0xf6, 0x95, 0x74, 0xf5, 0x35, 0xf8, 0xfd, 0x57, 0xaa, 0x09, 0x30, 0xfe, - 0x08, 0x2e, 0x29, 0xfe, 0xad, 0x44, 0xfb, 0xd9, 0x84, 0xfe, 0x7d, 0x24, 0xff, 0x95, 0xba, 0xfd, - 0xfe, 0x7c, 0xfe, 0x36, 0x4f, 0x00, 0x29, 0x1a, 0x00, 0x92, 0xc0, 0xff, 0x44, 0x7d, 0xfe, 0x00, - 0x87, 0xfe, 0x3b, 0x66, 0x00, 0xc1, 0xb3, 0x00, 0x02, 0xb9, 0x00, 0x42, 0x43, 0x01, 0xda, 0x47, - 0x01, 0xc3, 0x26, 0xff, 0xf4, 0x50, 0xfd, 0x88, 0x20, 0xfe, 0x1f, 0xa4, 0xff, 0xb3, 0x0a, 0x00, - 0xb7, 0xb7, 0xfe, 0x3c, 0x54, 0xff, 0x88, 0x77, 0x14, 0x58, 0xea, 0x27, 0x0b, 0xe2, 0x1b, 0x1a, - 0x99, 0x02, 0x5b, 0xfb, 0xf4, 0x63, 0x50, 0xf4, 0xbf, 0x89, 0xfd, 0xee, 0xdc, 0x0a, 0x1c, 0x4a, - 0x0a, 0x9a, 0x02, 0xfd, 0x94, 0xe9, 0xf9, 0x2e, 0x80, 0xfe, 0x30, 0x4b, 0xff, 0x23, 0xbc, 0xfd, - 0x92, 0x30, 0xfe, 0xba, 0x71, 0x00, 0x96, 0x3e, 0x00, 0x32, 0x28, 0xff, 0xe9, 0x6d, 0xfe, 0xa6, - 0x8c, 0xfe, 0xb0, 0xde, 0xff, 0x54, 0xa1, 0x00, 0xfc, 0x5c, 0x00, 0x1f, 0x6c, 0x00, 0x02, 0x4a, - 0x01, 0x7a, 0xa2, 0xff, 0x6a, 0x83, 0xfd, 0x5b, 0xe8, 0xfd, 0x78, 0x15, 0xff, 0x58, 0xc9, 0xff, - 0xf8, 0x57, 0xff, 0xc7, 0xa4, 0xff, 0xf5, 0xd8, 0x16, 0xe9, 0x72, 0x2b, 0x57, 0xa5, 0x1c, 0x8e, - 0xf6, 0x00, 0x22, 0xf5, 0xf2, 0xac, 0x36, 0xf3, 0x2a, 0x18, 0xfe, 0x45, 0x56, 0x0c, 0xbd, 0xe6, - 0x0a, 0x4b, 0x94, 0xfb, 0x1e, 0xb5, 0xf8, 0x1c, 0xda, 0xfe, 0x60, 0x91, 0xff, 0x26, 0x92, 0xfd, - 0x84, 0x07, 0xfe, 0xf3, 0xab, 0x00, 0x6e, 0x68, 0x00, 0x54, 0xaf, 0xfe, 0x03, 0x30, 0xfe, 0xd9, - 0xaa, 0xfe, 0x33, 0xd5, 0xff, 0x3d, 0x96, 0x00, 0x8c, 0xf9, 0xff, 0x4b, 0xda, 0xff, 0x09, 0x44, - 0x01, 0x33, 0xe0, 0xff, 0x15, 0xde, 0xfd, 0x2f, 0x07, 0xfe, 0x09, 0xe5, 0xfe, 0x38, 0x84, 0xff, - 0xa6, 0x10, 0xff, 0x58, 0x2a, 0x00, 0x4c, 0x86, 0x18, 0xab, 0xe8, 0x2e, 0xe9, 0x35, 0x1e, 0xf8, - 0xd7, 0xff, 0x1f, 0x02, 0xf1, 0x9c, 0xc0, 0xf1, 0xd0, 0x7c, 0xfe, 0x3e, 0xaa, 0x0d, 0x1e, 0x70, - 0x0b, 0x2e, 0x8f, 0xfa, 0xe9, 0x5d, 0xf7, 0x8f, 0x0b, 0xff, 0xce, 0x20, 0x00, 0xd9, 0x5b, 0xfd, - 0xea, 0xa3, 0xfd, 0x57, 0xd1, 0x00, 0xca, 0xc7, 0x00, 0xba, 0x5a, 0xfe, 0x21, 0xb6, 0xfd, 0xac, - 0xae, 0xfe, 0x60, 0xde, 0xff, 0xd9, 0x9a, 0x00, 0x33, 0xd2, 0xff, 0x91, 0x15, 0xff, 0x5a, 0xf9, - 0x00, 0x7f, 0x47, 0x00, 0x4b, 0x2e, 0xfe, 0x6d, 0x6c, 0xfe, 0x3a, 0xc9, 0xfe, 0x24, 0x48, 0xff, - 0x99, 0xee, 0xfe, 0xab, 0x04, 0x00, 0xa2, 0xb1, 0x1a, 0xdf, 0x81, 0x32, 0x88, 0xf2, 0x1f, 0x68, - 0xac, 0xfe, 0x47, 0x5b, 0xee, 0x60, 0xc6, 0xef, 0x3f, 0xaf, 0xfe, 0x3f, 0x19, 0x0f, 0x1f, 0xb8, - 0x0b, 0xe7, 0xdd, 0xf8, 0xef, 0x98, 0xf5, 0x0b, 0x30, 0xff, 0x56, 0xb5, 0x00, 0xb1, 0xfd, 0xfc, - 0x4a, 0x00, 0xfd, 0x4a, 0x7a, 0x00, 0x83, 0x0a, 0x01, 0x3b, 0x21, 0xfe, 0x21, 0x1c, 0xfd, 0x25, - 0x59, 0xfe, 0x29, 0x7e, 0xff, 0x26, 0xa0, 0x00, 0x62, 0xa4, 0xff, 0x19, 0x31, 0xfe, 0x59, 0x25, - 0x00, 0x2f, 0x55, 0x00, 0x6e, 0x81, 0xfe, 0xa2, 0xbb, 0xfe, 0x55, 0x0a, 0xff, 0x2c, 0xd3, 0xfe, - 0xec, 0xb6, 0xfe, 0x05, 0xa7, 0xff, 0x37, 0x2f, 0x1c, 0x9c, 0x81, 0x35, 0x9f, 0xbc, 0x21, 0xcf, - 0xf2, 0xfe, 0xea, 0x21, 0xed, 0x11, 0xb9, 0xed, 0xba, 0x06, 0xff, 0x01, 0x83, 0x10, 0x24, 0x0b, - 0x0c, 0xf9, 0x44, 0xf8, 0x3e, 0x28, 0xf4, 0xc4, 0x47, 0xff, 0x17, 0xde, 0x01, 0x80, 0xf9, 0xfc, - 0xbd, 0xa7, 0xfc, 0x06, 0x7c, 0x00, 0x84, 0x55, 0x01, 0xea, 0x1b, 0xfe, 0x51, 0x1c, 0xfd, 0xe0, - 0x79, 0xfe, 0x45, 0x3d, 0xff, 0xdc, 0xbd, 0x00, 0x5f, 0xd2, 0xff, 0xf5, 0xf3, 0xfd, 0x6c, 0x7b, - 0xff, 0x66, 0x62, 0x00, 0x93, 0x3a, 0xff, 0xcb, 0xec, 0xfe, 0x5c, 0xc7, 0xff, 0x1f, 0x04, 0xff, - 0x4e, 0x9d, 0xfe, 0xd9, 0xf7, 0xff, 0xf4, 0x44, 0x1f, 0x7a, 0x8f, 0x38, 0x85, 0xc1, 0x21, 0xca, - 0x67, 0xff, 0x4c, 0x46, 0xec, 0x17, 0xfd, 0xea, 0x9d, 0xa2, 0xff, 0x9f, 0x2b, 0x12, 0xd2, 0x66, - 0x0b, 0x38, 0x0e, 0xf7, 0x23, 0xef, 0xf2, 0xa8, 0x0e, 0xff, 0x40, 0xe3, 0x02, 0xa9, 0x17, 0xfd, - 0xb0, 0xdb, 0xfb, 0xc1, 0x82, 0x00, 0xa1, 0x95, 0x01, 0x1a, 0xaa, 0xfd, 0x8b, 0xfe, 0xfc, 0xf0, - 0x81, 0xfe, 0x6f, 0x19, 0xff, 0x4b, 0x9c, 0x00, 0x2d, 0xc3, 0xff, 0xbc, 0x01, 0xfe, 0x4f, 0x5b, - 0xfe, 0xb9, 0xc3, 0xff, 0x87, 0x49, 0x00, 0x43, 0x25, 0xff, 0x59, 0x0e, 0x00, 0xe3, 0xa0, 0xff, - 0x34, 0x65, 0xfe, 0xc6, 0x2a, 0x00, 0x7e, 0xbc, 0x22, 0x5f, 0x7b, 0x3b, 0xf3, 0x35, 0x20, 0x79, - 0xb5, 0xfe, 0x9d, 0x64, 0xec, 0x77, 0xb9, 0xe9, 0x57, 0x7a, 0x00, 0x97, 0xfc, 0x12, 0x54, 0xcf, - 0x09, 0x5a, 0x4c, 0xf6, 0xee, 0xac, 0xf2, 0xfe, 0x73, 0xfe, 0xe8, 0x6c, 0x03, 0x68, 0x82, 0xfd, - 0xfe, 0x24, 0xfb, 0xc3, 0x4a, 0x00, 0x3b, 0xde, 0x01, 0x66, 0x53, 0xfd, 0x57, 0xd6, 0xfc, 0x08, - 0x96, 0xfe, 0x8d, 0xfd, 0xfe, 0x30, 0x74, 0x00, 0x11, 0x81, 0xff, 0xaf, 0x61, 0xfe, 0x1f, 0xd9, - 0xfd, 0x2c, 0x66, 0xfe, 0x49, 0xf8, 0x00, 0x75, 0xfc, 0xff, 0x8e, 0xdb, 0xff, 0x2d, 0x48, 0x00, - 0xfc, 0x9a, 0xfe, 0x47, 0xd0, 0xff, 0x37, 0x56, 0x29, 0xe3, 0x16, 0x3f, 0x6b, 0xb0, 0x1a, 0x8c, - 0x8a, 0xfc, 0x89, 0xf2, 0xed, 0x9a, 0xf4, 0xe9, 0x51, 0x96, 0x01, 0xab, 0xfa, 0x12, 0x8b, 0x2a, - 0x07, 0x95, 0x25, 0xf5, 0x46, 0x89, 0xf3, 0x2d, 0xa2, 0xfd, 0x84, 0x3f, 0x03, 0x07, 0x77, 0xfe, - 0x2f, 0x67, 0xfa, 0x7c, 0xc0, 0xff, 0x15, 0xdb, 0x01, 0x84, 0x2c, 0xfd, 0xa8, 0xc7, 0xfc, 0xe2, - 0x8d, 0xfe, 0xad, 0x2c, 0xff, 0xbd, 0x1e, 0x00, 0xba, 0xf8, 0xfe, 0xb6, 0xa4, 0xfe, 0x48, 0xef, - 0xfd, 0x97, 0x08, 0xfd, 0x12, 0xb8, 0x00, 0xd7, 0x67, 0x01, 0xfc, 0x9a, 0xff, 0x2d, 0x8a, 0x00, - 0x7e, 0xcf, 0xff, 0xa0, 0x1c, 0xff, 0xd9, 0xb5, 0x2e, 0x58, 0x62, 0x40, 0xf0, 0x8d, 0x15, 0x9c, - 0xc6, 0xfd, 0x43, 0x29, 0xf1, 0xa8, 0x17, 0xe8, 0x05, 0xb0, 0x00, 0x85, 0x34, 0x14, 0xb9, 0x37, - 0x06, 0x48, 0x7b, 0xf3, 0x47, 0xcb, 0xf3, 0xd6, 0x77, 0xfd, 0x1a, 0x2d, 0x03, 0x9c, 0xef, 0xfe, - 0xfe, 0xe1, 0xf9, 0x76, 0x64, 0xff, 0x25, 0xa7, 0x01, 0xe7, 0x09, 0xfd, 0x35, 0xca, 0xfc, 0xd8, - 0xe6, 0xfe, 0x6d, 0x79, 0xff, 0x16, 0x8b, 0xff, 0x8b, 0xb8, 0xfe, 0x7c, 0xa8, 0xfe, 0xd3, 0x46, - 0xfe, 0x30, 0x7e, 0xfc, 0xc5, 0x9e, 0xff, 0xfe, 0xa7, 0x02, 0xfc, 0xfb, 0xff, 0x63, 0x2d, 0x00, - 0x6d, 0x09, 0x01, 0x8c, 0xff, 0xfe, 0x53, 0xee, 0x33, 0x4c, 0xeb, 0x40, 0x51, 0x0f, 0x10, 0xd8, - 0x0a, 0x00, 0x72, 0xde, 0xf4, 0x99, 0xd1, 0xe5, 0x9e, 0x88, 0xff, 0xe7, 0x6c, 0x15, 0x76, 0x75, - 0x05, 0xc3, 0x6f, 0xf1, 0x75, 0x13, 0xf4, 0xc1, 0xe7, 0xfd, 0x4b, 0xab, 0x02, 0xd3, 0xf1, 0xfe, - 0xa8, 0x9f, 0xf9, 0xa1, 0x2e, 0xff, 0x6a, 0x35, 0x01, 0xb2, 0x92, 0xfc, 0x79, 0xda, 0xfc, 0xb0, - 0xa6, 0xff, 0x2a, 0xdd, 0xff, 0x8c, 0x93, 0xfe, 0x14, 0xa1, 0xfe, 0xfc, 0xc9, 0xfe, 0xe9, 0x2b, - 0xfe, 0xa8, 0x6d, 0xfc, 0x31, 0x85, 0xfe, 0x82, 0x26, 0x03, 0xb0, 0xe9, 0x00, 0x17, 0xc0, 0xff, - 0xbd, 0xa5, 0x01, 0x94, 0x88, 0xff, 0xb5, 0x7a, 0x3b, 0x5e, 0x0b, 0x44, 0xb7, 0x0b, 0x07, 0xd3, - 0x9e, 0xfd, 0x7e, 0x94, 0xf9, 0x4c, 0xc1, 0xe7, 0xc0, 0x1d, 0xff, 0x9a, 0xb5, 0x13, 0x7b, 0x37, - 0x04, 0x9f, 0x04, 0xf0, 0x4e, 0x86, 0xf4, 0x65, 0x8f, 0xfe, 0x4a, 0xb2, 0x01, 0x6f, 0x34, 0xff, - 0x03, 0x40, 0xf9, 0x9b, 0x95, 0xfe, 0xcc, 0xc0, 0x00, 0x31, 0x39, 0xfc, 0xf0, 0x09, 0xfd, 0x47, - 0x09, 0x00, 0xbe, 0xca, 0x00, 0x8b, 0xeb, 0xfd, 0x01, 0x29, 0xfe, 0x37, 0xd1, 0xfe, 0xa2, 0xa5, - 0xfd, 0xd4, 0x0c, 0xfd, 0x74, 0xf5, 0xfd, 0x70, 0x71, 0x02, 0xb5, 0x03, 0x02, 0xae, 0x33, 0x00, - 0x42, 0x83, 0x01, 0x2e, 0x11, 0x00, 0x76, 0x6a, 0x43, 0x41, 0x12, 0x46, 0xe2, 0x71, 0xfe, 0xdd, - 0x12, 0xfb, 0x2c, 0x9e, 0xfc, 0x7c, 0x19, 0xeb, 0x06, 0xc1, 0xff, 0xfe, 0x12, 0x11, 0xda, 0x5a, - 0x03, 0xd1, 0x25, 0xef, 0x21, 0xb1, 0xf4, 0x07, 0x42, 0xff, 0x43, 0x2a, 0x01, 0x1d, 0x54, 0xff, - 0xdf, 0xb2, 0xf8, 0x99, 0x67, 0xfe, 0x55, 0x47, 0x00, 0x9a, 0xdd, 0xfb, 0x74, 0xb7, 0xfd, 0x48, - 0x49, 0x00, 0x2a, 0x97, 0x01, 0x5e, 0x83, 0xfd, 0x23, 0xb5, 0xfd, 0x8e, 0x16, 0xff, 0xf6, 0x14, - 0xfd, 0xf4, 0xad, 0xfd, 0xb9, 0x2b, 0xfe, 0xce, 0x9f, 0x01, 0x53, 0x6b, 0x02, 0x5f, 0x12, 0x01, - 0x30, 0x6c, 0x01, 0xf8, 0xdb, 0xff, 0x63, 0xc3, 0x4a, 0x36, 0x3e, 0x4a, 0xff, 0xd5, 0xf5, 0xf8, - 0x18, 0xf6, 0xb4, 0x84, 0xff, 0xe4, 0xdc, 0xef, 0x4e, 0xb8, 0x00, 0xa0, 0xfc, 0x0c, 0x31, 0x45, - 0x03, 0x7c, 0xdf, 0xee, 0xa6, 0xa2, 0xf3, 0x94, 0x0d, 0x00, 0x8e, 0x89, 0x00, 0xc4, 0x89, 0xff, - 0x78, 0xfb, 0xf7, 0xbc, 0xe4, 0xfd, 0x60, 0xfa, 0xff, 0xb7, 0x7e, 0xfb, 0xd7, 0xc0, 0xfe, 0x3f, - 0x36, 0x00, 0x5e, 0x6a, 0x02, 0x6d, 0x4d, 0xfd, 0xce, 0xc3, 0xfc, 0xf7, 0x9b, 0xff, 0x40, 0x94, - 0xfc, 0xab, 0x1b, 0xfe, 0x01, 0xd6, 0xfe, 0xb6, 0x08, 0x01, 0x81, 0xda, 0x01, 0xce, 0xbb, 0x01, - 0xd5, 0xed, 0x01, 0xd3, 0xbf, 0xfe, 0x87, 0x05, 0x51, 0xb8, 0x78, 0x4d, 0xfd, 0x7a, 0xef, 0x0f, - 0x80, 0xf1, 0x36, 0x4f, 0x00, 0xc6, 0x48, 0xf4, 0xb3, 0x0d, 0x02, 0x10, 0x76, 0x09, 0x7f, 0x97, - 0x03, 0xdf, 0xc2, 0xee, 0x6c, 0x52, 0xf2, 0xef, 0x83, 0x00, 0x86, 0x01, 0x00, 0x2b, 0xa3, 0xff, - 0x58, 0x9c, 0xf7, 0xbe, 0x7b, 0xfd, 0x4c, 0xc5, 0xff, 0x15, 0x7e, 0xfb, 0x52, 0xa5, 0xff, 0x8c, - 0xea, 0xff, 0xda, 0xeb, 0x02, 0x45, 0x4b, 0xfd, 0xc7, 0xf2, 0xfb, 0x9e, 0x1f, 0x00, 0x4d, 0x59, - 0xfc, 0x54, 0x30, 0xfe, 0x06, 0xdf, 0xff, 0x80, 0x0b, 0x01, 0x83, 0x7b, 0x00, 0x25, 0xb1, 0x01, - 0xd3, 0xbb, 0x02, 0xc5, 0xb6, 0xfd, 0x96, 0xf3, 0x57, 0xfa, 0xdd, 0x50, 0xd8, 0xd3, 0xe9, 0x69, - 0x29, 0xec, 0xb9, 0x43, 0xff, 0x62, 0xef, 0xf8, 0x03, 0xed, 0x03, 0x1a, 0x61, 0x06, 0xa7, 0x40, - 0x04, 0xdc, 0x58, 0xee, 0x12, 0xcd, 0xf0, 0x35, 0x83, 0x00, 0x82, 0x30, 0xff, 0x78, 0xfd, 0xff, - 0x08, 0x96, 0xf7, 0x21, 0x4e, 0xfd, 0xd3, 0xc4, 0xff, 0x0c, 0xb5, 0xfb, 0x9d, 0x70, 0x00, 0x0a, - 0x5a, 0xff, 0xf8, 0x5d, 0x03, 0xb4, 0x72, 0xfd, 0xd5, 0x61, 0xfb, 0x8e, 0xab, 0x00, 0x58, 0xef, - 0xfb, 0xa9, 0xae, 0xfe, 0xba, 0x32, 0x01, 0xb0, 0xac, 0x00, 0xc5, 0xf7, 0xfe, 0x21, 0xd3, 0x00, - 0x7c, 0x28, 0x03, 0x2b, 0x7f, 0xfd, 0x8d, 0xd5, 0x5c, 0x07, 0x2c, 0x54, 0xa5, 0x6a, 0xe6, 0xab, - 0xc1, 0xe7, 0x6c, 0x44, 0xfd, 0x4c, 0x3b, 0xfb, 0x8d, 0xe0, 0x05, 0x29, 0x21, 0x05, 0xcb, 0xa1, - 0x04, 0xb1, 0xe3, 0xed, 0x0c, 0x73, 0xef, 0x2c, 0xe2, 0xff, 0xd1, 0x4b, 0xfe, 0x54, 0xc8, 0x00, - 0x6d, 0x0e, 0xf8, 0x0d, 0x37, 0xfd, 0x94, 0x1f, 0x00, 0xd5, 0xcf, 0xfb, 0xe3, 0x8c, 0x00, 0x97, - 0xcc, 0xfe, 0xba, 0xb1, 0x03, 0xee, 0xf5, 0xfd, 0x64, 0x1c, 0xfb, 0x97, 0xb3, 0x00, 0xbe, 0x0c, - 0xfc, 0x7d, 0x5f, 0xff, 0x73, 0x51, 0x01, 0xd3, 0x34, 0x00, 0xbd, 0x2a, 0xfe, 0xdb, 0x55, 0xff, - 0x3d, 0x2f, 0x03, 0xc4, 0x3f, 0xfe, 0xf6, 0xf3, 0x60, 0x53, 0x35, 0x57, 0x37, 0x7c, 0xe4, 0x11, - 0xbe, 0xe4, 0x14, 0x01, 0xfa, 0xb1, 0xa9, 0xfb, 0x41, 0x70, 0x08, 0x39, 0xe2, 0x04, 0xeb, 0xc1, - 0x04, 0x05, 0x84, 0xed, 0xb5, 0x2c, 0xee, 0xd2, 0x9b, 0xfe, 0x34, 0x7c, 0xfd, 0x68, 0x83, 0x02, - 0x3d, 0xdd, 0xf8, 0x8b, 0x1f, 0xfd, 0xb3, 0xd4, 0x00, 0x76, 0xac, 0xfb, 0x3e, 0x24, 0x00, 0xdd, - 0x72, 0xfe, 0x18, 0x5b, 0x04, 0x19, 0xa2, 0xfe, 0xea, 0xce, 0xfa, 0x80, 0x04, 0x01, 0xef, 0x6a, - 0xfc, 0x35, 0x3b, 0xff, 0xaa, 0xe4, 0x00, 0x9b, 0xf5, 0xff, 0xe5, 0x72, 0xfd, 0x23, 0xfd, 0xfd, - 0x89, 0x6c, 0x03, 0x05, 0x59, 0xff, 0x7a, 0x59, 0x65, 0x39, 0xbc, 0x59, 0x48, 0x57, 0xe3, 0xdc, - 0x0e, 0xe3, 0x9a, 0x59, 0xf4, 0x32, 0x0b, 0xfa, 0x41, 0x03, 0x0c, 0xc8, 0x42, 0x05, 0x75, 0x89, - 0x04, 0xa8, 0xe8, 0xec, 0xfe, 0xb2, 0xec, 0x7a, 0x8e, 0xfc, 0x03, 0x41, 0xfd, 0xb7, 0x82, 0x05, - 0x19, 0x71, 0xf9, 0x64, 0x39, 0xfd, 0x26, 0x8a, 0x01, 0x32, 0xa9, 0xfa, 0xdf, 0xc7, 0xff, 0x3d, - 0xcd, 0xfe, 0xf9, 0xc3, 0x04, 0x9f, 0x11, 0xff, 0xa7, 0xa3, 0xfb, 0x37, 0x02, 0x01, 0x4c, 0x2b, - 0xfb, 0x43, 0xf6, 0xfe, 0x56, 0x70, 0x00, 0xd7, 0x11, 0xff, 0xe6, 0x4f, 0xfd, 0x48, 0xa6, 0xfd, - 0xe2, 0x4d, 0x03, 0x90, 0x28, 0x00, 0x6f, 0xaf, 0x68, 0x46, 0x87, 0x5a, 0x38, 0xbd, 0xe3, 0x5b, - 0x16, 0xe3, 0xe1, 0x2c, 0xee, 0x63, 0xe1, 0xf7, 0xeb, 0xbb, 0x0e, 0x1d, 0xc1, 0x05, 0x00, 0x22, - 0x04, 0x5b, 0x09, 0xec, 0x99, 0x0b, 0xec, 0x8c, 0x23, 0xfb, 0x67, 0xc3, 0xfd, 0x5a, 0x03, 0x08, - 0x79, 0xda, 0xf9, 0xd4, 0x61, 0xfd, 0xb1, 0x14, 0x01, 0xe9, 0x08, 0xfa, 0x16, 0x62, 0x00, 0x0b, - 0xcd, 0xfe, 0xcd, 0xd9, 0x04, 0x62, 0x4e, 0x00, 0xd5, 0xc9, 0xfb, 0x72, 0x4d, 0xff, 0x72, 0x75, - 0xfa, 0xc9, 0xd7, 0xfe, 0x33, 0x87, 0xff, 0xfe, 0xfb, 0xfe, 0x6c, 0x2d, 0xfe, 0xb1, 0x99, 0xfd, - 0xfe, 0x89, 0x02, 0xd2, 0xf3, 0x00, 0x5f, 0x48, 0x6a, 0xb3, 0x55, 0x5b, 0x1a, 0x9d, 0xe6, 0x9b, - 0xb8, 0xe3, 0x13, 0xf3, 0xe6, 0xcd, 0xf0, 0xf3, 0xb9, 0xc4, 0x10, 0xcd, 0xf8, 0x06, 0x69, 0xf1, - 0x02, 0x03, 0xa0, 0xeb, 0x5e, 0x11, 0xed, 0x3a, 0x95, 0xf9, 0x85, 0x14, 0xfe, 0x70, 0x24, 0x0b, - 0x05, 0x2b, 0xfa, 0x65, 0x46, 0xfc, 0x20, 0xee, 0x00, 0x15, 0x76, 0xfa, 0xd0, 0x92, 0x00, 0x2c, - 0x7b, 0xff, 0xbb, 0x63, 0x05, 0x1e, 0x87, 0xff, 0x7d, 0xfa, 0xfa, 0xfa, 0x5f, 0xfe, 0x0b, 0x47, - 0xf9, 0xb2, 0x8a, 0xfe, 0xc8, 0xe6, 0xff, 0xb2, 0x69, 0xff, 0x9c, 0xb3, 0xfe, 0xad, 0xb1, 0xfd, - 0xa6, 0x6f, 0x02, 0x49, 0x0b, 0x01, 0x5e, 0x29, 0x69, 0x1e, 0x19, 0x5d, 0x9d, 0x99, 0xea, 0xcd, - 0xe7, 0xe4, 0x88, 0xc4, 0xe1, 0x86, 0x29, 0xee, 0xde, 0xfa, 0x11, 0xfb, 0x0b, 0x08, 0x5c, 0x9b, - 0x01, 0x85, 0xaf, 0xed, 0x29, 0x26, 0xee, 0x53, 0x32, 0xf8, 0xa5, 0x92, 0xfe, 0x6c, 0x08, 0x0d, - 0x17, 0x1b, 0xfa, 0x55, 0x41, 0xfb, 0xdc, 0x9f, 0x01, 0x83, 0xf5, 0xfa, 0xbf, 0xcf, 0x01, 0x7b, - 0xb0, 0xff, 0xfa, 0xe6, 0x02, 0xad, 0x6b, 0xff, 0xdf, 0x14, 0xfb, 0xaa, 0xef, 0xfc, 0x42, 0x33, - 0xf9, 0xd4, 0x58, 0xff, 0x9a, 0x2f, 0x00, 0xae, 0x3f, 0xff, 0xff, 0x97, 0xff, 0x98, 0x52, 0xfe, - 0x31, 0x74, 0x01, 0x22, 0x35, 0x00, 0x81, 0x46, 0x69, 0x5d, 0xf9, 0x5a, 0x14, 0xc8, 0xef, 0x78, - 0x87, 0xe8, 0xa3, 0x5f, 0xda, 0x49, 0x4a, 0xe8, 0xe9, 0x3c, 0x11, 0xa6, 0x64, 0x09, 0x17, 0x99, - 0x02, 0x60, 0xb5, 0xef, 0x75, 0x25, 0xf0, 0xe6, 0xf8, 0xf6, 0xd8, 0xd1, 0xfe, 0x91, 0x22, 0x0e, - 0x51, 0x95, 0xf9, 0x47, 0xe6, 0xfa, 0xf9, 0xbc, 0x03, 0x59, 0xb7, 0xfc, 0x15, 0x1b, 0x00, 0x89, - 0x3c, 0xfe, 0xae, 0xa5, 0x01, 0xb6, 0xc0, 0xfe, 0x44, 0x81, 0xfb, 0xe6, 0xc6, 0xfc, 0x7e, 0xe1, - 0xf9, 0x96, 0xca, 0xff, 0x56, 0x2f, 0x00, 0x36, 0x02, 0x00, 0x73, 0xbf, 0xff, 0x19, 0xd1, 0xfd, - 0x4c, 0x77, 0x01, 0xab, 0x59, 0x00, 0xe0, 0x80, 0x66, 0x20, 0x88, 0x5a, 0x1f, 0x4a, 0xf5, 0xbd, - 0x8a, 0xeb, 0xbd, 0xe5, 0xd5, 0x5f, 0x89, 0xe1, 0x73, 0x6a, 0x0f, 0xc9, 0xa9, 0x0c, 0xa1, 0x70, - 0x04, 0xf7, 0x1c, 0xf1, 0x85, 0x16, 0xf2, 0x52, 0x6c, 0xf6, 0xf4, 0xf8, 0xfd, 0xeb, 0x0b, 0x0e, - 0x7c, 0x36, 0xfa, 0x7d, 0xec, 0xfc, 0xb8, 0xa0, 0x04, 0xc6, 0xeb, 0xfa, 0x48, 0x29, 0xff, 0x87, - 0xcf, 0xfd, 0x0b, 0x22, 0x00, 0x29, 0x9c, 0xff, 0xad, 0x8e, 0xfc, 0x6e, 0xa0, 0xfc, 0x11, 0x96, - 0xfa, 0x2e, 0x68, 0x00, 0x57, 0x37, 0x00, 0xe4, 0x2f, 0xff, 0x89, 0xf3, 0xff, 0xc4, 0xe5, 0xfe, - 0x7e, 0x36, 0x01, 0x4a, 0x9f, 0xff, 0x9c, 0x46, 0x65, 0x9b, 0x73, 0x57, 0x10, 0xef, 0xf8, 0xfd, - 0x75, 0xef, 0xba, 0x25, 0xd1, 0x0f, 0x4b, 0xdb, 0x41, 0xcc, 0x0e, 0x9b, 0x8d, 0x10, 0x24, 0x4c, - 0x05, 0x84, 0x28, 0xf2, 0xf4, 0x1d, 0xf5, 0x71, 0xb5, 0xf4, 0xb0, 0x0f, 0xfc, 0x54, 0x07, 0x10, - 0x41, 0xe9, 0xfb, 0x9d, 0x37, 0xfc, 0x96, 0x0d, 0x04, 0x7f, 0xc4, 0xf9, 0xf1, 0xc5, 0xfd, 0x64, - 0x60, 0xfe, 0xae, 0xf2, 0xff, 0xd1, 0xed, 0xff, 0xa8, 0x44, 0xfd, 0x73, 0x22, 0xfd, 0xf6, 0xd0, - 0xfb, 0x38, 0x86, 0xff, 0xac, 0x1e, 0xff, 0xc1, 0xd2, 0xff, 0xed, 0xc8, 0x00, 0x0d, 0x9a, 0xfe, - 0xe2, 0xac, 0x00, 0xd8, 0x01, 0x00, 0x5e, 0x76, 0x62, 0xae, 0xa9, 0x53, 0xe3, 0x50, 0xfc, 0xf9, - 0x18, 0xf4, 0x67, 0xa9, 0xcc, 0x1d, 0x7f, 0xd6, 0xbe, 0x33, 0x0f, 0x6d, 0x9c, 0x12, 0x6a, 0x42, - 0x07, 0x2d, 0xd1, 0xf4, 0xf2, 0xb1, 0xf5, 0x09, 0x80, 0xf2, 0xf3, 0x04, 0xfe, 0xdc, 0xe0, 0x10, - 0x70, 0x19, 0xfa, 0xb7, 0xf5, 0xfc, 0xda, 0x1f, 0x02, 0xb4, 0x13, 0xf8, 0xeb, 0xe2, 0xff, 0x84, - 0xc0, 0xfe, 0xbc, 0xdc, 0xfe, 0x85, 0x0f, 0x01, 0x47, 0xf9, 0xfe, 0xe2, 0x47, 0xfd, 0xa6, 0xe9, - 0xfa, 0x7e, 0x12, 0xff, 0x24, 0xe3, 0xff, 0x31, 0xc2, 0xff, 0x1a, 0x72, 0x00, 0xd3, 0xde, 0xfe, - 0x52, 0xcd, 0x00, 0x2f, 0x3a, 0x00, 0x8a, 0xa9, 0x5f, 0x04, 0xd5, 0x4e, 0xdd, 0x04, 0xff, 0x47, - 0x5a, 0xf6, 0x02, 0xa4, 0xcb, 0xd1, 0xf3, 0xd5, 0x35, 0x0f, 0x0d, 0x25, 0x2b, 0x15, 0xba, 0x29, - 0x09, 0x94, 0x62, 0xf4, 0xff, 0xd9, 0xf7, 0xc2, 0x84, 0xf2, 0xe2, 0x24, 0xfd, 0xed, 0xce, 0x10, - 0x84, 0xae, 0xf9, 0xa9, 0x4b, 0xfb, 0x29, 0x90, 0x01, 0xce, 0xc6, 0xf9, 0x37, 0x39, 0x00, 0x05, - 0x7a, 0xfe, 0x8c, 0xa2, 0xff, 0x18, 0x3a, 0x02, 0x5c, 0x74, 0xfe, 0xf2, 0x79, 0xfc, 0xa2, 0xf0, - 0xfb, 0x37, 0x68, 0xff, 0xb4, 0x0a, 0xff, 0xe5, 0x88, 0xff, 0xa4, 0x09, 0x01, 0x38, 0xf3, 0xfe, - 0xa2, 0xc3, 0x00, 0xdc, 0x23, 0x00, 0xf3, 0xe5, 0x59, 0xee, 0x5e, 0x49, 0x88, 0x70, 0x01, 0xfa, - 0xcf, 0xf9, 0x35, 0x44, 0xce, 0x66, 0x70, 0xd5, 0x02, 0x17, 0x0b, 0x42, 0xa5, 0x15, 0x82, 0x00, - 0x0a, 0xfb, 0x71, 0xf8, 0xf9, 0x93, 0xf7, 0x23, 0xc4, 0xef, 0x72, 0x57, 0xff, 0xbe, 0xeb, 0x0e, - 0x75, 0xa0, 0xf7, 0x62, 0x60, 0xfc, 0x54, 0xe7, 0x01, 0x7b, 0x56, 0xfa, 0x22, 0xbd, 0x00, 0xed, - 0x36, 0x00, 0x4d, 0x78, 0xff, 0x44, 0xc3, 0x00, 0x4e, 0x09, 0xff, 0xc8, 0x4d, 0xfd, 0x21, 0x7e, - 0xfc, 0xbb, 0x96, 0xfe, 0x46, 0x53, 0xfe, 0x02, 0x49, 0x00, 0x94, 0x84, 0x01, 0xd2, 0x64, 0xfe, - 0x4c, 0x33, 0x00, 0x1a, 0x32, 0x01, 0xef, 0x72, 0x54, 0x65, 0x9e, 0x43, 0x06, 0x55, 0x02, 0xba, - 0x2a, 0xfe, 0x55, 0x60, 0xd2, 0x41, 0x34, 0xd6, 0x03, 0x10, 0x08, 0xb6, 0xab, 0x15, 0x48, 0xef, - 0x0c, 0x11, 0x29, 0xf8, 0x81, 0xa7, 0xf6, 0x2c, 0x52, 0xf0, 0x57, 0xd5, 0xfe, 0x54, 0xd8, 0x0d, - 0x1a, 0x5a, 0xf7, 0xa5, 0x21, 0xfd, 0xe7, 0x0d, 0x02, 0x05, 0xcb, 0xfa, 0x09, 0xf7, 0x02, 0x97, - 0xb3, 0xff, 0xd5, 0x6e, 0xfd, 0xef, 0xe2, 0x01, 0x51, 0xf0, 0xff, 0x34, 0xd8, 0xfc, 0x85, 0xb1, - 0xfc, 0xfe, 0x42, 0xfe, 0xff, 0x38, 0xfe, 0xc5, 0x1b, 0x01, 0xe7, 0xf5, 0x00, 0xb8, 0x64, 0xfd, - 0x46, 0x57, 0x01, 0xcf, 0x0f, 0x02, 0x49, 0xa3, 0x4d, 0x6d, 0x9e, 0x3b, 0x5a, 0x5e, 0x03, 0x84, - 0x28, 0x05, 0xe4, 0x24, 0xd7, 0x25, 0x25, 0xd6, 0xea, 0x7c, 0x08, 0x92, 0x65, 0x15, 0xd4, 0x4c, - 0x0a, 0x66, 0x0e, 0xfa, 0x60, 0xf1, 0xf6, 0x27, 0xc1, 0xee, 0xd0, 0x18, 0x01, 0xf9, 0x8d, 0x0c, - 0x77, 0x25, 0xf6, 0x25, 0xa3, 0xfe, 0x5d, 0xbc, 0x02, 0x60, 0x8a, 0xfc, 0xcf, 0x91, 0x02, 0x10, - 0x2d, 0xfe, 0xb7, 0x1a, 0xfe, 0x83, 0xf6, 0x02, 0x4d, 0x7f, 0xff, 0x83, 0x47, 0xfc, 0x9c, 0xab, - 0xfd, 0x68, 0x4d, 0xfe, 0x89, 0x1d, 0xfe, 0x5e, 0x14, 0x01, 0xb2, 0x49, 0x00, 0x16, 0xd5, 0xfd, - 0xfa, 0xff, 0x01, 0x68, 0x0c, 0x02, 0xdc, 0x67, 0x45, 0xb7, 0x1c, 0x36, 0xac, 0x8b, 0x06, 0xb8, - 0x48, 0x08, 0x28, 0xdc, 0xda, 0x0f, 0x0e, 0xdb, 0x44, 0xff, 0x07, 0x57, 0x72, 0x10, 0x1c, 0x0d, - 0x0a, 0xea, 0x53, 0xfb, 0xd3, 0xe4, 0xf5, 0xce, 0x05, 0xf1, 0xba, 0x91, 0x01, 0x54, 0x2a, 0x0a, - 0xd2, 0x9b, 0xf6, 0x4e, 0x3c, 0x00, 0x6c, 0xaf, 0x03, 0x62, 0xb5, 0xfb, 0x43, 0xca, 0x01, 0x56, - 0xfd, 0xfe, 0x77, 0x80, 0xfe, 0xe0, 0xb7, 0x02, 0x3f, 0xec, 0xfe, 0x86, 0xae, 0xfc, 0xb0, 0xb5, - 0xfe, 0x8f, 0xf2, 0xfd, 0x57, 0x93, 0xfd, 0x40, 0x77, 0x01, 0xed, 0x5a, 0x00, 0xda, 0x65, 0xfd, - 0x96, 0x6d, 0x02, 0x73, 0x2a, 0x02, 0x64, 0xc4, 0x41, 0xf2, 0x61, 0x34, 0x21, 0x60, 0x03, 0x14, - 0x5b, 0x00, 0x8d, 0x02, 0xda, 0x73, 0xc4, 0xe6, 0xf1, 0x0f, 0x13, 0x68, 0x9c, 0x0d, 0xad, 0xba, - 0x01, 0x9e, 0xaa, 0xf8, 0x0c, 0x98, 0xfa, 0x7d, 0x2f, 0xf5, 0x62, 0xee, 0xfe, 0xa5, 0x7f, 0x09, - 0x25, 0x95, 0xf7, 0xea, 0x0f, 0xff, 0x28, 0xbd, 0x03, 0x1c, 0x15, 0xfc, 0x05, 0x0b, 0x01, 0x33, - 0x2a, 0xff, 0xaf, 0xc0, 0xff, 0xe5, 0x99, 0x01, 0x7f, 0xc2, 0xfe, 0x0f, 0x7e, 0xfd, 0x01, 0x90, - 0xfd, 0xeb, 0x26, 0xff, 0xbf, 0x07, 0xff, 0x10, 0xb9, 0xff, 0x38, 0x24, 0x00, 0xec, 0x86, 0xff, - 0xad, 0xd0, 0xff, 0x89, 0x4c, 0xfe, 0x30, 0x6c, 0x35, 0x65, 0xbf, 0x32, 0xdc, 0xba, 0x0e, 0xb2, - 0xc7, 0x04, 0xa7, 0x6f, 0xdc, 0xde, 0xfb, 0xe0, 0x6b, 0x37, 0x08, 0xf2, 0xf6, 0x0b, 0x28, 0x9e, - 0x08, 0xbc, 0x2e, 0x00, 0x6c, 0xd5, 0xfa, 0xad, 0x5c, 0xf4, 0x6b, 0xf9, 0xfb, 0x71, 0x5a, 0x05, - 0x95, 0x47, 0xfa, 0xef, 0xdc, 0x01, 0xfa, 0x4b, 0x04, 0x99, 0x9e, 0xfb, 0x3b, 0x1c, 0x01, 0xe7, - 0xc1, 0x00, 0xea, 0xc2, 0xfe, 0x04, 0x02, 0x01, 0x72, 0xd2, 0x00, 0x3b, 0x3c, 0xfe, 0xa8, 0x24, - 0xfe, 0xdf, 0x9b, 0x00, 0x05, 0x07, 0xfd, 0xc2, 0x5c, 0xfd, 0xa7, 0x54, 0x00, 0xc0, 0x93, 0xfe, - 0x2e, 0x65, 0x00, 0x28, 0x25, 0x01, 0x90, 0xdc, 0x2b, 0xd5, 0x78, 0x2d, 0x78, 0x80, 0x11, 0x6d, - 0xc5, 0x06, 0x6c, 0xdc, 0xe4, 0x75, 0x65, 0xe5, 0x39, 0xf9, 0x03, 0x58, 0xc3, 0x09, 0x43, 0x72, - 0x07, 0xea, 0x4d, 0x00, 0x78, 0x76, 0xfc, 0x36, 0x19, 0xf7, 0x72, 0xd3, 0xfb, 0x4f, 0x92, 0x03, - 0x76, 0x53, 0xfc, 0x81, 0xc1, 0x01, 0x8e, 0x50, 0x03, 0xa1, 0x71, 0xfc, 0x5f, 0xd8, 0x00, 0x86, - 0x17, 0x01, 0x09, 0xdc, 0xfe, 0x44, 0xe2, 0x00, 0x1e, 0x43, 0x01, 0x89, 0xc6, 0xfe, 0x7b, 0xf6, - 0xfe, 0xba, 0xab, 0x00, 0x6c, 0x43, 0xfd, 0x1b, 0xbe, 0xfd, 0xd5, 0x9a, 0x00, 0x66, 0x24, 0xff, - 0x2f, 0x06, 0x00, 0xa3, 0x23, 0x01, 0x4c, 0x2b, 0x24, 0x0b, 0xe3, 0x28, 0x0c, 0x9c, 0x12, 0x78, - 0x72, 0x08, 0x5a, 0xef, 0xeb, 0xfb, 0xe0, 0xe8, 0x0e, 0x66, 0x01, 0xa0, 0xbb, 0x07, 0xc0, 0xd8, - 0x05, 0xd2, 0xed, 0x00, 0xfe, 0x29, 0xfe, 0x27, 0x15, 0xf9, 0x24, 0xd4, 0xfb, 0x1a, 0xb5, 0x02, - 0xbe, 0xaf, 0xfd, 0xa9, 0x3c, 0x01, 0xf4, 0xaf, 0x02, 0xfd, 0x4f, 0xfd, 0xc1, 0xbe, 0x00, 0x48, - 0x39, 0x01, 0x87, 0x2c, 0xff, 0xe2, 0xdd, 0x00, 0xc5, 0x98, 0x01, 0x53, 0x9c, 0xff, 0x3a, 0x3a, - 0xff, 0x3d, 0xd4, 0x00, 0x2e, 0x80, 0xfe, 0x58, 0x31, 0xfe, 0x8d, 0x53, 0x00, 0x5e, 0x04, 0xff, - 0xd3, 0x88, 0xff, 0x7d, 0xf9, 0x00, 0xc1, 0x6c, 0x1e, 0x4b, 0xae, 0x24, 0x50, 0xeb, 0x12, 0x80, - 0x4b, 0x09, 0x02, 0xba, 0xf0, 0x64, 0x2d, 0xec, 0x1b, 0x18, 0x00, 0x11, 0xde, 0x05, 0x7e, 0x95, - 0x04, 0x1d, 0xa4, 0x01, 0x1b, 0x4c, 0xff, 0x20, 0x9c, 0xfa, 0xb4, 0x33, 0xfc, 0xf5, 0xfe, 0x01, - 0xa3, 0x79, 0xfe, 0x3b, 0xc0, 0x00, 0x1c, 0x4f, 0x02, 0xc0, 0x20, 0xfe, 0x2d, 0x8c, 0x00, 0x99, - 0x52, 0x01, 0xf4, 0x9d, 0xff, 0x80, 0xeb, 0x00, 0x7c, 0xd4, 0x01, 0x31, 0x7f, 0x00, 0x26, 0x08, - 0x00, 0x1b, 0x0c, 0x01, 0xa2, 0xde, 0xfe, 0x5d, 0xed, 0xfd, 0x61, 0x9e, 0xff, 0x3d, 0xe3, 0xfe, - 0x6b, 0xef, 0xfe, 0x26, 0x3c, 0x00, 0xda, 0x62, 0x1a, 0xc7, 0xb3, 0x21, 0xa9, 0x6a, 0x12, 0xa6, - 0x13, 0x09, 0x6a, 0x49, 0xf4, 0x43, 0x84, 0xef, 0x2e, 0xa2, 0xff, 0xb4, 0x7b, 0x04, 0xf6, 0x1b, - 0x04, 0xe0, 0x2b, 0x02, 0x5a, 0x00, 0x00, 0x37, 0x1e, 0xfc, 0x3c, 0xe1, 0xfc, 0x91, 0xb7, 0x01, - 0x9b, 0xee, 0xfe, 0x4b, 0xa5, 0x00, 0x33, 0x66, 0x02, 0x65, 0xce, 0xfe, 0xfb, 0xb7, 0x00, 0xe5, - 0x71, 0x01, 0x86, 0x44, 0x00, 0x7b, 0xec, 0x01, 0x6a, 0x8c, 0x02, 0x94, 0x00, 0x01, 0xc7, 0x13, - 0x00, 0x72, 0xab, 0x00, 0x32, 0xe8, 0xfe, 0xa5, 0xc6, 0xfd, 0xc8, 0x18, 0xff, 0x8d, 0xb2, 0xfe, - 0xcc, 0xc5, 0xfe, 0xa3, 0x37, 0x00, 0xe0, 0x65, 0x17, 0xb7, 0xd9, 0x1e, 0x1c, 0xd9, 0x11, 0x40, - 0x99, 0x08, 0x7a, 0x29, 0xf6, 0xc0, 0x04, 0xf2, 0xd0, 0x82, 0xff, 0x8c, 0x85, 0x03, 0x9e, 0x95, - 0x03, 0xcd, 0x63, 0x02, 0x35, 0x8d, 0x00, 0x69, 0x36, 0xfd, 0x88, 0x6f, 0xfd, 0x1b, 0x23, 0x01, - 0x00, 0x24, 0xff, 0x5d, 0xd9, 0x00, 0x72, 0x36, 0x02, 0x6b, 0x0e, 0xff, 0x92, 0xf9, 0x00, 0x3f, - 0x2a, 0x02, 0xd1, 0x19, 0x01, 0x9f, 0xe4, 0x01, 0xfc, 0xfa, 0x01, 0xa1, 0x65, 0x00, 0x42, 0x9d, - 0xff, 0xb9, 0x46, 0x00, 0x95, 0x92, 0xfe, 0x4f, 0x72, 0xfd, 0x93, 0xd8, 0xfe, 0x23, 0x9d, 0xfe, - 0xae, 0x5c, 0xfe, 0xb2, 0xf8, 0xff, 0x31, 0x5c, 0x15, 0xc0, 0x22, 0x1d, 0xa7, 0xe5, 0x10, 0xe9, - 0x7f, 0x07, 0x8f, 0xea, 0xf7, 0xfb, 0x62, 0xf4, 0x3b, 0xb3, 0xff, 0xb5, 0x2f, 0x03, 0x71, 0x94, - 0x03, 0x4d, 0xcb, 0x02, 0xd9, 0x06, 0x01, 0x95, 0x47, 0xfe, 0xf8, 0x21, 0xfe, 0x5c, 0xf8, 0x00, - 0x76, 0x98, 0xff, 0x1c, 0x13, 0x01, 0x45, 0x98, 0x02, 0xb2, 0x1f, 0x00, 0xc4, 0x4f, 0x01, 0xd4, - 0x1f, 0x02, 0xbd, 0xfc, 0x00, 0xc8, 0x4b, 0x01, 0x7d, 0x5d, 0x01, 0xd3, 0x3f, 0x00, 0xb9, 0x6c, - 0xff, 0x0b, 0x08, 0x00, 0x09, 0x00, 0xff, 0x31, 0x9e, 0xfd, 0x08, 0x6c, 0xfe, 0xb4, 0x80, 0xfe, - 0xe3, 0x94, 0xfe, 0xf7, 0xf3, 0xff, 0x57, 0x01, 0x14, 0xac, 0xf9, 0x1b, 0xee, 0xdb, 0x0f, 0xa7, - 0x2d, 0x06, 0x27, 0x47, 0xf9, 0x30, 0x65, 0xf6, 0xc7, 0x0c, 0x00, 0x54, 0x76, 0x03, 0x21, 0xd6, - 0x03, 0x21, 0x1b, 0x03, 0x57, 0x6d, 0x01, 0x5f, 0x17, 0xff, 0x52, 0xe2, 0xfe, 0xa0, 0xeb, 0x00, - 0x66, 0x4d, 0x00, 0x5c, 0xea, 0x01, 0x44, 0x91, 0x02, 0xe0, 0x04, 0x00, 0x69, 0x9d, 0x00, 0x1b, - 0x7d, 0x01, 0x9b, 0x0f, 0x01, 0x5d, 0xe1, 0x00, 0x6e, 0xc8, 0x00, 0x64, 0x67, 0x00, 0xbb, 0xb3, - 0xff, 0x54, 0xf4, 0xff, 0x9d, 0xf9, 0xfe, 0x60, 0xb2, 0xfd, 0x58, 0x7e, 0xfe, 0x5a, 0x4d, 0xfe, - 0x8d, 0xb3, 0xfe, 0x74, 0x21, 0x01, 0x86, 0xf8, 0x12, 0x14, 0x5d, 0x1b, 0xe0, 0xf5, 0x0e, 0xc9, - 0xa7, 0x04, 0x98, 0x55, 0xfa, 0xc3, 0x36, 0xf8, 0xa3, 0x86, 0x00, 0x3a, 0x27, 0x04, 0x89, 0x1d, - 0x04, 0x8f, 0x25, 0x03, 0xbf, 0xea, 0x01, 0x59, 0x72, 0xff, 0x6b, 0x91, 0xff, 0x76, 0x9b, 0x01, - 0xe5, 0x30, 0x00, 0x26, 0x44, 0x01, 0x16, 0xf5, 0x01, 0xeb, 0xb1, 0xff, 0x0c, 0xe8, 0xff, 0xd7, - 0xd9, 0x00, 0x64, 0x34, 0x01, 0x5d, 0xd0, 0x00, 0x50, 0x7d, 0x00, 0xbc, 0x89, 0x00, 0x63, 0xbb, - 0xff, 0x1b, 0x86, 0xff, 0xd8, 0x56, 0xff, 0xd9, 0x3b, 0xfe, 0x77, 0xb1, 0xfd, 0xc8, 0xf9, 0xfe, - 0x8c, 0x51, 0x00, 0xc7, 0x13, 0x00, 0xd2, 0x50, 0x12, 0x8c, 0x38, 0x1b, 0xf5, 0x49, 0x0e, 0x51, - 0xa5, 0x03, 0xc9, 0x5f, 0xfb, 0x2f, 0xd8, 0xf9, 0xbe, 0x34, 0x01, 0xf3, 0xdf, 0x04, 0xbc, 0xbe, - 0x04, 0x91, 0xf8, 0x02, 0xeb, 0x7c, 0x02, 0x84, 0x68, 0x00, 0x62, 0xff, 0xfe, 0x0d, 0x40, 0x01, - 0xf7, 0x22, 0x00, 0xbc, 0x9a, 0x00, 0x58, 0xca, 0x01, 0x3a, 0x98, 0xff, 0xb4, 0x7c, 0xff, 0x53, - 0x69, 0x00, 0x6a, 0x6c, 0x01, 0x2a, 0x63, 0x01, 0x90, 0x2d, 0x00, 0xcb, 0x44, 0x00, 0x7b, 0x46, - 0x00, 0xde, 0x16, 0x00, 0x5b, 0xfe, 0xfe, 0x8b, 0x7d, 0xfe, 0x29, 0x9d, 0xff, 0x93, 0xe1, 0xfe, - 0xa2, 0xa9, 0xfe, 0xe3, 0x00, 0x00, 0x53, 0x15, 0x12, 0xc9, 0x15, 0x1b, 0x08, 0xd4, 0x0d, 0x96, - 0x3f, 0x03, 0xfe, 0x5c, 0xfc, 0xa5, 0xdf, 0xfa, 0xa8, 0x83, 0x01, 0x7c, 0xff, 0x04, 0xde, 0x11, - 0x05, 0xd8, 0x60, 0x03, 0x18, 0x2d, 0x02, 0x0c, 0x4c, 0x00, 0xc8, 0x5b, 0xfe, 0x02, 0x1d, 0x00, - 0x87, 0x73, 0x00, 0xe0, 0x87, 0x00, 0x9f, 0x51, 0x01, 0x99, 0x9d, 0xff, 0x67, 0xf6, 0xfe, 0xf8, - 0x6f, 0x00, 0x27, 0x6b, 0x01, 0xc0, 0xf5, 0x00, 0x60, 0x4d, 0x00, 0xf6, 0x82, 0x00, 0x5e, 0x96, - 0x00, 0x04, 0x96, 0xff, 0x27, 0xa1, 0xff, 0x2c, 0x7c, 0x00, 0x15, 0x8c, 0xfe, 0x78, 0x50, 0xfd, - 0xc0, 0xd3, 0xfe, 0x19, 0xe4, 0xff, 0xdd, 0xb6, 0x11, 0x5f, 0x3b, 0x1b, 0x21, 0x52, 0x0e, 0xec, - 0x7a, 0x03, 0xe7, 0x2f, 0xfd, 0xa0, 0x51, 0xfb, 0xaf, 0xe9, 0x00, 0xdb, 0xc3, 0x04, 0x9b, 0xd4, - 0x04, 0xd6, 0x27, 0x03, 0xf8, 0x69, 0x02, 0x58, 0x04, 0x00, 0x0b, 0x17, 0xfe, 0x20, 0xcc, 0xff, - 0xd0, 0xc7, 0xff, 0x8d, 0x81, 0x00, 0x62, 0x57, 0x01, 0x7f, 0xb7, 0xff, 0x09, 0x2e, 0xff, 0x58, - 0x04, 0x00, 0x44, 0x4e, 0x01, 0xb1, 0xaf, 0x00, 0xdd, 0x25, 0x00, 0xe6, 0x2d, 0x01, 0x94, 0xf7, - 0xff, 0xaf, 0x41, 0x00, 0xfc, 0xcb, 0x01, 0xad, 0x04, 0xff, 0x17, 0x16, 0xfd, 0xa7, 0x4c, 0xfe, - 0xd9, 0xae, 0xfe, 0x2e, 0x2b, 0xff, 0x4f, 0xd4, 0x11, 0x52, 0x07, 0x1c, 0x0b, 0x07, 0x0f, 0x53, - 0x60, 0x03, 0x6b, 0x37, 0xfd, 0xe7, 0xa6, 0xfb, 0x43, 0x93, 0x00, 0x73, 0xc9, 0x03, 0x0e, 0x30, - 0x04, 0xed, 0x87, 0x02, 0xae, 0xfc, 0x01, 0xfd, 0xe9, 0x00, 0xde, 0x6a, 0xfe, 0x9c, 0x1b, 0xff, - 0x94, 0xc6, 0xff, 0xed, 0x15, 0x00, 0x1f, 0xdf, 0x00, 0x33, 0x40, 0x00, 0x5a, 0xbb, 0xff, 0x22, - 0x31, 0x00, 0xa3, 0x92, 0x00, 0xf9, 0x51, 0x00, 0x3a, 0xc4, 0x00, 0xf0, 0x2e, 0x00, 0xf0, 0x25, - 0x00, 0x0a, 0xbd, 0x02, 0xa2, 0xf0, 0x00, 0x60, 0x54, 0xfd, 0x37, 0xe7, 0xfd, 0x2c, 0x90, 0xfe, - 0x44, 0x70, 0xfe, 0xe8, 0x33, 0xff, 0x5c, 0x15, 0x12, 0x68, 0x41, 0x1d, 0x96, 0x10, 0x10, 0xa4, - 0xb9, 0x02, 0xb4, 0xac, 0xfc, 0x57, 0xcc, 0xfb, 0xd5, 0x56, 0x00, 0x29, 0xd6, 0x03, 0x1f, 0xc7, - 0x03, 0x67, 0x2e, 0x01, 0x95, 0x71, 0x01, 0x41, 0xcb, 0x00, 0xa4, 0x6c, 0xfe, 0x9f, 0xdf, 0xff, - 0x67, 0xe5, 0xff, 0xc0, 0xd2, 0xff, 0x74, 0x01, 0x01, 0xd0, 0xf9, 0xff, 0x32, 0xc7, 0xff, 0xa5, - 0xbe, 0x00, 0x72, 0xa9, 0x00, 0x2f, 0x26, 0x00, 0x79, 0x42, 0x00, 0x76, 0xc5, 0xff, 0xb3, 0x2b, - 0x01, 0xa1, 0x32, 0x03, 0xe7, 0xd9, 0xff, 0xe4, 0x6d, 0xfd, 0x92, 0x71, 0xfe, 0x00, 0x5f, 0xfe, - 0xf1, 0xb6, 0xfe, 0x19, 0xdc, 0xff, 0x50, 0x0c, 0x12, 0xff, 0xc7, 0x1e, 0x8c, 0x72, 0x11, 0x75, - 0x05, 0x02, 0x83, 0xed, 0xfb, 0x16, 0x2a, 0xfb, 0x5c, 0x08, 0x00, 0xbb, 0xae, 0x04, 0x5b, 0x01, - 0x04, 0x64, 0x8e, 0x00, 0x53, 0x96, 0x00, 0x5b, 0xc3, 0xff, 0x91, 0xc4, 0xfd, 0xe6, 0x76, 0xff, - 0x4a, 0x51, 0x00, 0xd6, 0xe7, 0x00, 0xab, 0x31, 0x01, 0x3e, 0xd8, 0xff, 0xe1, 0xd1, 0xff, 0x4a, - 0x50, 0x00, 0x80, 0x78, 0x00, 0xd4, 0xa0, 0x00, 0x80, 0x65, 0x00, 0x08, 0x36, 0xff, 0x25, 0x16, - 0x01, 0xeb, 0x74, 0x03, 0x9d, 0x54, 0xff, 0xea, 0x3d, 0xfd, 0x49, 0x02, 0xff, 0x80, 0x66, 0xfe, - 0x4a, 0xe7, 0xfe, 0x08, 0x9a, 0x00, 0xa1, 0x36, 0x12, 0xb5, 0x22, 0x20, 0x0a, 0x2c, 0x13, 0xef, - 0xb0, 0x01, 0x04, 0x9d, 0xfa, 0xd8, 0x5c, 0xfa, 0x69, 0xea, 0xff, 0xc3, 0x90, 0x05, 0x7c, 0x9a, - 0x04, 0x8e, 0x79, 0x00, 0xcf, 0x30, 0x00, 0x23, 0x31, 0xff, 0x24, 0x11, 0xfd, 0xcb, 0x48, 0xfe, - 0x44, 0xd5, 0xff, 0x77, 0x1e, 0x01, 0x74, 0x9b, 0x01, 0xca, 0xbb, 0x00, 0x7f, 0x2a, 0x00, 0x61, - 0x39, 0x00, 0x37, 0x39, 0x00, 0xb9, 0x57, 0x00, 0x2f, 0xa9, 0x00, 0xb0, 0x3e, 0xff, 0x10, 0xd7, - 0x00, 0x31, 0x74, 0x03, 0x00, 0x1d, 0xff, 0x50, 0x0e, 0xfd, 0x64, 0x31, 0xff, 0xe1, 0x80, 0xfe, - 0x0e, 0x41, 0xff, 0x2f, 0x22, 0x01, 0xe5, 0x77, 0x12, 0x3b, 0xf0, 0x21, 0xee, 0xc4, 0x14, 0xca, - 0x63, 0x01, 0x8f, 0x7d, 0xf9, 0x07, 0xfe, 0xf8, 0xcd, 0xd8, 0xff, 0xcd, 0x8f, 0x06, 0x32, 0x0a, - 0x05, 0x7f, 0x85, 0x00, 0xe5, 0xd0, 0xff, 0xed, 0xf2, 0xfe, 0x5e, 0xf1, 0xfc, 0x3b, 0xa8, 0xfd, - 0x69, 0x05, 0xff, 0x8b, 0x91, 0x00, 0xa5, 0x55, 0x01, 0xe3, 0x72, 0x00, 0x20, 0x65, 0x00, 0x7a, - 0x05, 0x01, 0xd3, 0xc0, 0x00, 0x77, 0x08, 0x00, 0xce, 0x88, 0x00, 0x88, 0x94, 0xff, 0x7d, 0xbd, - 0xff, 0x3b, 0x0e, 0x03, 0xb2, 0x63, 0x00, 0x8a, 0xa7, 0xfc, 0xd5, 0x3d, 0xfe, 0xed, 0xbc, 0xfe, - 0x53, 0x9e, 0xff, 0x38, 0x3e, 0x01, 0xa9, 0x06, 0x13, 0x25, 0xe8, 0x23, 0x60, 0xd0, 0x16, 0x65, - 0xcd, 0x00, 0xb7, 0x55, 0xf7, 0xf6, 0x3e, 0xf8, 0x76, 0x31, 0x00, 0x21, 0x2d, 0x07, 0xa1, 0xf5, - 0x05, 0xe2, 0x26, 0x00, 0xe9, 0xcb, 0xfe, 0x33, 0x4f, 0xff, 0x21, 0x0d, 0xfd, 0x4d, 0x0c, 0xfd, - 0x31, 0xe3, 0xfe, 0x16, 0x18, 0x00, 0xab, 0xbf, 0x00, 0xbd, 0xf9, 0xff, 0x81, 0x7c, 0xff, 0x3a, - 0xde, 0x00, 0xcb, 0x5b, 0x01, 0x70, 0x09, 0x00, 0xa0, 0xf7, 0x00, 0x4c, 0x65, 0x00, 0xa8, 0x83, - 0xfe, 0xab, 0xee, 0x01, 0x15, 0xa6, 0x01, 0xfc, 0xfb, 0xfc, 0x80, 0x5e, 0xfd, 0xd9, 0xbd, 0xfe, - 0x10, 0x74, 0xff, 0xd5, 0xf9, 0x00, 0xc4, 0xc8, 0x13, 0x2c, 0x3e, 0x26, 0x6a, 0x49, 0x19, 0x8f, - 0x58, 0x00, 0xda, 0xe5, 0xf4, 0x93, 0x24, 0xf7, 0x9d, 0x67, 0x00, 0xd9, 0x01, 0x08, 0xd7, 0xbf, - 0x06, 0x3e, 0x9b, 0xff, 0xed, 0xca, 0xfd, 0x3b, 0x88, 0xff, 0xa5, 0x94, 0xfd, 0x36, 0xb0, 0xfc, - 0xc7, 0xbf, 0xfe, 0x26, 0x03, 0x00, 0xbc, 0x33, 0x00, 0xa1, 0xc4, 0xff, 0xde, 0xfb, 0xfe, 0x5c, - 0x06, 0x00, 0x2f, 0x7c, 0x01, 0x1c, 0x23, 0x00, 0xc0, 0x2d, 0x00, 0xfe, 0x40, 0x01, 0x9b, 0x5b, - 0xff, 0x2c, 0x28, 0x00, 0x19, 0xeb, 0x01, 0xd8, 0x05, 0xff, 0xf4, 0xca, 0xfc, 0xdb, 0x71, 0xfd, - 0x2f, 0x3f, 0xff, 0x3f, 0x12, 0x01, 0xd7, 0x21, 0x14, 0x5f, 0xb3, 0x28, 0xc9, 0xdd, 0x1c, 0xb8, - 0x0c, 0x00, 0xa3, 0x09, 0xf2, 0x48, 0xf4, 0xf5, 0x9c, 0x42, 0x00, 0xf4, 0xf6, 0x08, 0x8e, 0xdc, - 0x07, 0x8f, 0xe9, 0xfe, 0x9f, 0x76, 0xfc, 0x42, 0x60, 0xff, 0x6e, 0x5b, 0xfe, 0xa9, 0x94, 0xfc, - 0xd9, 0x73, 0xfe, 0xd5, 0x4b, 0x00, 0x27, 0xd8, 0xff, 0xd1, 0x4e, 0xff, 0x8d, 0xb4, 0xfe, 0x49, - 0x5e, 0xff, 0x65, 0x59, 0x01, 0xd0, 0x92, 0x00, 0x4d, 0x56, 0xff, 0x3c, 0x77, 0x00, 0x43, 0x2c, - 0x00, 0xe3, 0x82, 0xff, 0x60, 0x28, 0x01, 0x10, 0x14, 0x01, 0x5e, 0x07, 0xfe, 0x6a, 0x8d, 0xfc, - 0x9a, 0x58, 0xfe, 0x09, 0x51, 0x00, 0xfb, 0xac, 0x14, 0x0b, 0x77, 0x2b, 0xdd, 0xbe, 0x20, 0x09, - 0xbc, 0xff, 0x26, 0xaf, 0xee, 0x7d, 0x99, 0xf4, 0x85, 0x6b, 0x00, 0xdc, 0x0a, 0x0a, 0xa1, 0x0f, - 0x09, 0x02, 0x17, 0xfe, 0xa1, 0xd1, 0xfa, 0x38, 0x2c, 0xff, 0xec, 0x25, 0xff, 0x1c, 0x91, 0xfc, - 0xd5, 0x13, 0xfe, 0x41, 0x83, 0x00, 0x1d, 0xee, 0xff, 0xd2, 0xea, 0xfe, 0x09, 0x49, 0xfe, 0xf5, - 0x1a, 0xff, 0xe2, 0xd6, 0x00, 0x34, 0xd0, 0x00, 0xaf, 0xda, 0xff, 0x17, 0x34, 0xff, 0xfa, 0x95, - 0xff, 0x19, 0xc9, 0xff, 0x20, 0xd6, 0xff, 0x1e, 0x6e, 0x01, 0xdf, 0xd6, 0x00, 0xfe, 0x5d, 0xfd, - 0x9d, 0xe0, 0xfc, 0xad, 0xb0, 0xff, 0xe3, 0xa5, 0x17, 0x21, 0x12, 0x30, 0x12, 0xc4, 0x21, 0x88, - 0xe1, 0xfc, 0x16, 0x85, 0xeb, 0x0c, 0x5f, 0xf3, 0xe1, 0xa9, 0x01, 0xf7, 0x0c, 0x0c, 0xa7, 0x22, - 0x09, 0x94, 0x3f, 0xfc, 0xdf, 0x62, 0xf9, 0x05, 0x21, 0xff, 0x70, 0x95, 0xff, 0x28, 0xa1, 0xfc, - 0xd0, 0xc9, 0xfd, 0xf6, 0x78, 0x00, 0xb1, 0x04, 0x00, 0x47, 0x79, 0xfe, 0xa7, 0xe0, 0xfd, 0xf8, - 0xff, 0xfe, 0x82, 0x7e, 0x00, 0x25, 0x97, 0x00, 0xca, 0x13, 0x00, 0x42, 0x03, 0xff, 0x71, 0x94, - 0xfe, 0x70, 0x37, 0xff, 0xda, 0x7e, 0xff, 0xf9, 0xc0, 0x00, 0xd3, 0xe1, 0x01, 0x59, 0x91, 0xff, - 0xf1, 0xed, 0xfc, 0x0f, 0x4a, 0xfe, 0xc6, 0x8b, 0x19, 0x3d, 0xdd, 0x33, 0x93, 0x8d, 0x24, 0xa4, - 0x94, 0xfb, 0xc1, 0xd2, 0xe7, 0xe7, 0x02, 0xf2, 0x5f, 0xce, 0x02, 0x0c, 0x6d, 0x0d, 0x69, 0x89, - 0x09, 0xdf, 0x14, 0xfb, 0x34, 0x82, 0xf7, 0xb8, 0xf7, 0xfe, 0x6e, 0xab, 0x00, 0xc4, 0x51, 0xfc, - 0xc0, 0x6a, 0xfd, 0xdb, 0xd2, 0x00, 0x4d, 0xd5, 0xff, 0x31, 0x20, 0xfe, 0x04, 0xd1, 0xfd, 0x4a, - 0xd1, 0xfe, 0x13, 0x34, 0x00, 0x28, 0xa5, 0x00, 0x63, 0xda, 0xff, 0xf0, 0x25, 0xff, 0x04, 0x72, - 0xfe, 0x83, 0xe5, 0xfd, 0x6f, 0x44, 0xff, 0x8c, 0xab, 0x00, 0xe5, 0x9c, 0x01, 0x6b, 0x54, 0x01, - 0xd0, 0xa2, 0xfe, 0x58, 0x63, 0xfd, 0x45, 0x6e, 0x1b, 0x97, 0x50, 0x37, 0xe8, 0x9d, 0x27, 0x9d, - 0xf1, 0xfa, 0x3e, 0xc9, 0xe3, 0x7d, 0x62, 0xf0, 0xbc, 0x2b, 0x04, 0xb9, 0xb2, 0x0e, 0x5c, 0xb1, - 0x09, 0xdf, 0xeb, 0xf9, 0x48, 0x93, 0xf5, 0xca, 0x6e, 0xfe, 0x58, 0x20, 0x02, 0x5b, 0x47, 0xfc, - 0x2b, 0x6c, 0xfc, 0x8c, 0x0c, 0x01, 0x4b, 0x05, 0x00, 0x37, 0xc1, 0xfd, 0x64, 0x5c, 0xfd, 0x27, - 0x07, 0xff, 0x7c, 0xf6, 0xff, 0xfb, 0x58, 0x00, 0x9d, 0xfd, 0xff, 0xa6, 0xaa, 0xfe, 0xac, 0xbb, - 0xfe, 0xea, 0x64, 0xfd, 0x21, 0xe8, 0xfd, 0x3e, 0xe6, 0x00, 0xc4, 0xac, 0x01, 0x24, 0x78, 0x01, - 0x92, 0x81, 0x00, 0x8a, 0x68, 0xfe, 0xe6, 0x59, 0x1f, 0xef, 0xc6, 0x3b, 0x5f, 0xab, 0x27, 0x10, - 0xd7, 0xf8, 0x52, 0xff, 0xe0, 0xd7, 0x0c, 0xef, 0x26, 0x2b, 0x06, 0x6d, 0x8d, 0x10, 0x81, 0xc7, - 0x08, 0xbb, 0xe3, 0xf7, 0x66, 0x7b, 0xf4, 0xe5, 0x51, 0xfe, 0xdb, 0xef, 0x02, 0x9a, 0x78, 0xfc, - 0x8d, 0xb1, 0xfb, 0x4f, 0x20, 0x01, 0x59, 0xf4, 0xff, 0x2d, 0xa2, 0xfd, 0x92, 0x3a, 0xfd, 0x1c, - 0xd6, 0xfe, 0x17, 0x60, 0x00, 0x3c, 0xfa, 0xff, 0x97, 0xa2, 0xff, 0x6c, 0xbb, 0xfe, 0xd3, 0x74, - 0xfe, 0xdb, 0x68, 0xfd, 0xbd, 0x5c, 0xfd, 0x51, 0x3a, 0x00, 0x90, 0x1b, 0x02, 0x24, 0xa9, 0x01, - 0x9f, 0xca, 0x00, 0xc8, 0x44, 0x00, 0x70, 0xb1, 0x22, 0xcd, 0x6e, 0x3f, 0xb8, 0xd2, 0x27, 0x78, - 0x45, 0xf8, 0xf6, 0x33, 0xdf, 0xe2, 0xf9, 0xec, 0xaa, 0xc8, 0x07, 0x9f, 0x39, 0x12, 0xc1, 0x9d, - 0x07, 0x33, 0x9c, 0xf6, 0x4b, 0x7c, 0xf3, 0x8a, 0xa0, 0xfd, 0x92, 0xcc, 0x03, 0xd1, 0xf3, 0xfc, - 0xe8, 0xbc, 0xfa, 0x7f, 0xf2, 0x00, 0xd1, 0x36, 0x00, 0xaa, 0x57, 0xfd, 0xff, 0x38, 0xfd, 0xb0, - 0xef, 0xfe, 0x5b, 0x85, 0x00, 0xef, 0xe0, 0xff, 0x1f, 0x29, 0xff, 0x77, 0xab, 0xfe, 0xfc, 0x45, - 0xfe, 0xf3, 0x72, 0xfd, 0x1a, 0x85, 0xfd, 0xa9, 0x53, 0xff, 0x20, 0xe6, 0x01, 0x2d, 0x69, 0x02, - 0x80, 0x9a, 0x00, 0xb8, 0xf3, 0x00, 0x94, 0x1d, 0x26, 0xab, 0xd5, 0x42, 0x67, 0xb0, 0x26, 0x7c, - 0xb7, 0xf7, 0x60, 0x04, 0xdf, 0xd2, 0xc8, 0xea, 0x31, 0x6f, 0x08, 0xa8, 0xc9, 0x13, 0xb2, 0x35, - 0x06, 0xae, 0x5d, 0xf5, 0xe0, 0xc7, 0xf2, 0x2c, 0xbd, 0xfc, 0x86, 0x4a, 0x04, 0xbe, 0x52, 0xfd, - 0xa0, 0xcb, 0xf9, 0x2e, 0x57, 0x00, 0xed, 0x58, 0x00, 0x71, 0x2f, 0xfd, 0xec, 0x22, 0xfd, 0xf2, - 0x23, 0xff, 0x25, 0x78, 0x00, 0x77, 0xe1, 0xff, 0xb5, 0x95, 0xfe, 0xa7, 0x25, 0xfe, 0x0e, 0x51, - 0xfe, 0x10, 0x26, 0xfd, 0x23, 0xfe, 0xfd, 0x4d, 0x3d, 0xff, 0x3f, 0x8b, 0x00, 0xec, 0xba, 0x02, - 0xce, 0x27, 0x01, 0x31, 0x5d, 0x00, 0x4f, 0x3a, 0x2c, 0x17, 0xb0, 0x46, 0x54, 0x0c, 0x22, 0x67, - 0x43, 0xf5, 0x53, 0x60, 0xe0, 0x36, 0x7a, 0xea, 0x66, 0x0e, 0x09, 0xb3, 0xdb, 0x14, 0x11, 0x97, - 0x04, 0xbe, 0x91, 0xf3, 0xae, 0x9b, 0xf2, 0x6f, 0xd0, 0xfc, 0x72, 0x46, 0x04, 0x7b, 0x36, 0xfd, - 0x8e, 0x67, 0xf9, 0x16, 0xe4, 0xff, 0x4a, 0x12, 0x00, 0x36, 0x5c, 0xfd, 0x79, 0x69, 0xfd, 0x8f, - 0x4a, 0xff, 0x8b, 0xda, 0x00, 0xd6, 0xd0, 0xff, 0xf0, 0xf0, 0xfd, 0x54, 0xd9, 0xfd, 0x44, 0x4a, - 0xfe, 0xfe, 0xec, 0xfc, 0x73, 0x6b, 0xfe, 0x2c, 0x30, 0x00, 0xd4, 0x84, 0xff, 0x69, 0xbd, 0x01, - 0x03, 0x1f, 0x02, 0xd1, 0xff, 0xff, 0x9a, 0x7c, 0x33, 0x3d, 0x82, 0x4a, 0x90, 0x2f, 0x1b, 0x4e, - 0x77, 0xf2, 0x88, 0xf3, 0xe2, 0x43, 0x71, 0xeb, 0xff, 0x99, 0x09, 0xc6, 0x95, 0x14, 0xca, 0xa9, - 0x03, 0x38, 0xfa, 0xf1, 0x96, 0x57, 0xf2, 0x27, 0x85, 0xfd, 0xdc, 0xaf, 0x03, 0x41, 0x42, 0xfd, - 0xf5, 0x13, 0xf9, 0x9b, 0x71, 0xff, 0x13, 0xf7, 0xff, 0xab, 0x70, 0xfd, 0x26, 0x1e, 0xfe, 0xb9, - 0x3c, 0xff, 0x0d, 0x7d, 0x01, 0x36, 0xc7, 0xff, 0x10, 0x2c, 0xfd, 0x45, 0x10, 0xfe, 0xb7, 0x06, - 0xfe, 0x3d, 0xf3, 0xfc, 0x98, 0xd4, 0xfe, 0x66, 0x3d, 0x01, 0x14, 0x42, 0xff, 0xc9, 0x16, 0x00, - 0x74, 0x87, 0x02, 0x49, 0x16, 0x00, 0xe2, 0xd7, 0x3a, 0x6c, 0x8b, 0x4e, 0xf4, 0x31, 0x13, 0xb1, - 0xc9, 0xee, 0x44, 0x09, 0xe6, 0xed, 0x25, 0xed, 0xf8, 0xab, 0x09, 0x30, 0x26, 0x13, 0xb9, 0x60, - 0x03, 0x1b, 0xa4, 0xf0, 0x4b, 0x90, 0xf1, 0x74, 0x45, 0xfe, 0xcf, 0x71, 0x02, 0xe9, 0x70, 0xfd, - 0xec, 0xe5, 0xf8, 0x3c, 0xb6, 0xfe, 0x2d, 0x28, 0x00, 0x35, 0x50, 0xfd, 0xa4, 0xcf, 0xfe, 0xd9, - 0x08, 0xff, 0xe7, 0xd5, 0x01, 0x7c, 0xc0, 0xff, 0xb4, 0x57, 0xfc, 0xa9, 0x9a, 0xfe, 0x91, 0x8d, - 0xfd, 0xfa, 0xf5, 0xfc, 0x0e, 0x65, 0xff, 0x9b, 0xa4, 0x01, 0xd8, 0x49, 0xff, 0xd3, 0x6c, 0xfe, - 0xa7, 0x03, 0x02, 0x77, 0x5d, 0x00, 0x6f, 0x05, 0x44, 0xbb, 0xbb, 0x51, 0x31, 0x96, 0x09, 0xb7, - 0xeb, 0xea, 0x72, 0xae, 0xe8, 0x93, 0x37, 0xf0, 0xb5, 0x01, 0x0a, 0x68, 0x13, 0x11, 0x7c, 0x60, - 0x03, 0xea, 0x1f, 0xef, 0xcf, 0x15, 0xf1, 0x0c, 0xc6, 0xfe, 0x39, 0x13, 0x01, 0x54, 0xca, 0xfd, - 0x65, 0x07, 0xf9, 0xbc, 0x89, 0xfe, 0x90, 0x30, 0x00, 0x8e, 0x76, 0xfd, 0x03, 0x5c, 0xff, 0x9a, - 0xbb, 0xfe, 0xe8, 0x3a, 0x02, 0x42, 0x88, 0xff, 0xda, 0x11, 0xfc, 0x9f, 0x2d, 0xff, 0x46, 0x27, - 0xfd, 0x85, 0x47, 0xfd, 0xa9, 0x07, 0x00, 0xec, 0x84, 0x01, 0xbd, 0xe9, 0xfe, 0x4d, 0x83, 0xfd, - 0x7c, 0x1f, 0x01, 0xe8, 0x3f, 0x00, 0x54, 0x91, 0x4d, 0xb6, 0x5b, 0x54, 0x70, 0xe9, 0xff, 0xd3, - 0x38, 0xe7, 0x4c, 0x69, 0xea, 0x42, 0x73, 0xf3, 0x2d, 0xba, 0x0a, 0xbb, 0xfb, 0x0e, 0x30, 0x91, - 0x03, 0xd4, 0x81, 0xed, 0xcf, 0x6b, 0xf0, 0x78, 0xd4, 0xfe, 0x02, 0xab, 0xff, 0x0e, 0xaa, 0xfe, - 0xe3, 0xcb, 0xf9, 0x07, 0x7a, 0xfe, 0x0f, 0x2a, 0x00, 0xd1, 0xd1, 0xfd, 0x2b, 0x59, 0xff, 0x78, - 0x59, 0xfe, 0x50, 0xd8, 0x02, 0x60, 0x5e, 0xff, 0x38, 0x37, 0xfc, 0x52, 0x90, 0xff, 0xa7, 0xeb, - 0xfc, 0xa6, 0xdb, 0xfd, 0xbf, 0x23, 0x00, 0x0a, 0xcc, 0x00, 0x48, 0x8a, 0xfe, 0xb6, 0x23, 0xfd, - 0xa3, 0x17, 0x00, 0x49, 0x21, 0x00, 0xc7, 0xef, 0x55, 0xd7, 0xf7, 0x56, 0x4f, 0x40, 0xf7, 0x73, - 0x11, 0xe4, 0x7c, 0x08, 0xeb, 0xa1, 0xe0, 0xf5, 0x36, 0x3c, 0x0c, 0x4b, 0xfa, 0x0c, 0xa1, 0xd7, - 0x03, 0x86, 0xbd, 0xeb, 0x0e, 0x60, 0xef, 0xc5, 0xc5, 0xfe, 0x62, 0x53, 0xfe, 0x87, 0xbb, 0x00, - 0xd5, 0x96, 0xfa, 0x04, 0x25, 0xfe, 0x92, 0xaa, 0x00, 0x35, 0x65, 0xfd, 0xfc, 0x00, 0xff, 0x66, - 0x58, 0xfe, 0x9f, 0x8f, 0x03, 0x42, 0x7c, 0xff, 0xce, 0x5a, 0xfc, 0x4c, 0xf0, 0xff, 0x0b, 0xa8, - 0xfc, 0x65, 0xcc, 0xfd, 0x26, 0xc3, 0xff, 0x76, 0x3c, 0x00, 0xcf, 0x47, 0xfe, 0x6f, 0xf2, 0xfc, - 0xc5, 0x95, 0xff, 0x3f, 0x58, 0x00, 0x39, 0x40, 0x5d, 0x40, 0x83, 0x59, 0x5b, 0x15, 0xf0, 0x0f, - 0x6b, 0xe1, 0xeb, 0xf2, 0xe9, 0x98, 0x45, 0xf7, 0xdb, 0xbf, 0x0e, 0x59, 0x1c, 0x0b, 0x21, 0xb9, - 0x03, 0x60, 0xd6, 0xe9, 0xae, 0x33, 0xee, 0x3d, 0xe1, 0xfe, 0x61, 0xbb, 0xfd, 0x05, 0x83, 0x03, - 0xe3, 0xd7, 0xfa, 0x51, 0x36, 0xfe, 0xff, 0x09, 0x01, 0x59, 0xee, 0xfb, 0x05, 0x75, 0xff, 0x66, - 0x95, 0xfe, 0x03, 0x39, 0x04, 0x0e, 0xdf, 0xff, 0xcb, 0x83, 0xfc, 0x15, 0x0d, 0x00, 0x0a, 0x34, - 0xfb, 0x9f, 0x81, 0xfd, 0x9c, 0xd0, 0xff, 0xce, 0xab, 0xff, 0x81, 0x11, 0xfe, 0x39, 0x9d, 0xfd, - 0x64, 0xde, 0xff, 0x7e, 0x8f, 0xff, 0xe2, 0x52, 0x63, 0xae, 0x96, 0x5b, 0x0d, 0xf7, 0xea, 0x55, - 0x40, 0xdf, 0xd3, 0x58, 0xe7, 0x40, 0xa3, 0xf7, 0x8b, 0x89, 0x11, 0x84, 0xb0, 0x09, 0xc9, 0xc6, - 0x02, 0x8c, 0xfe, 0xe7, 0x0b, 0x09, 0xee, 0xe3, 0x72, 0xff, 0xca, 0x72, 0xfd, 0xa8, 0x59, 0x06, - 0x66, 0x1f, 0xfb, 0x57, 0xda, 0xfd, 0xac, 0xde, 0x00, 0xdd, 0x07, 0xfb, 0x1d, 0xa1, 0x00, 0xb9, - 0xaf, 0xfe, 0xe5, 0xaf, 0x04, 0x68, 0x9b, 0x00, 0xc7, 0x02, 0xfc, 0xa9, 0x9a, 0xfe, 0x9a, 0x09, - 0xfa, 0x9e, 0xf4, 0xfd, 0xf8, 0x6d, 0xff, 0xe8, 0xae, 0xff, 0x15, 0xf0, 0xfe, 0x85, 0x2e, 0xfe, - 0x1d, 0x8e, 0xff, 0x13, 0xef, 0xfe, 0x25, 0x2b, 0x68, 0x25, 0x6e, 0x5c, 0x1a, 0x98, 0xe7, 0x4b, - 0x4d, 0xde, 0xe8, 0x02, 0xe4, 0xab, 0xc5, 0xf6, 0xf4, 0x1d, 0x14, 0xaf, 0xc7, 0x08, 0x80, 0x76, - 0x00, 0x7b, 0xba, 0xe7, 0xe7, 0xb8, 0xef, 0xca, 0xfa, 0xfe, 0x14, 0xde, 0xfd, 0xb4, 0x08, 0x09, - 0xa6, 0xa5, 0xfa, 0xc1, 0x08, 0xfd, 0x85, 0x1c, 0x01, 0x22, 0x7b, 0xfb, 0x92, 0x6d, 0x01, 0x5b, - 0xd8, 0xfe, 0x69, 0xda, 0x04, 0x37, 0xda, 0xff, 0x86, 0xb9, 0xfa, 0xac, 0xf9, 0xfd, 0xd1, 0x83, - 0xf9, 0x31, 0xe9, 0xfd, 0x19, 0x4c, 0x00, 0x9f, 0x8a, 0x00, 0x68, 0xf1, 0xfe, 0x66, 0x3d, 0xfe, - 0xe6, 0x07, 0x00, 0x5b, 0xa0, 0xfe, 0xd6, 0x87, 0x6a, 0xf5, 0x09, 0x5d, 0x79, 0x87, 0xe5, 0xad, - 0x01, 0xdf, 0x0f, 0xbb, 0xe0, 0x66, 0xeb, 0xf3, 0x0e, 0x22, 0x17, 0x6b, 0x6a, 0x07, 0x62, 0x91, - 0xfe, 0x7f, 0xba, 0xe9, 0x4c, 0xee, 0xf0, 0xa0, 0xea, 0xfe, 0x87, 0x5b, 0xfe, 0x15, 0x96, 0x0a, - 0xf6, 0xbc, 0xf9, 0xa7, 0x46, 0xfc, 0x63, 0xdb, 0x02, 0xad, 0xec, 0xfb, 0xa0, 0xcc, 0x01, 0x5a, - 0x34, 0xfe, 0xeb, 0xd9, 0x02, 0x84, 0x7c, 0xff, 0xf4, 0x9a, 0xfa, 0xb1, 0x72, 0xfd, 0xf2, 0x50, - 0xf9, 0xb9, 0x43, 0xff, 0x48, 0x92, 0x01, 0x54, 0xd3, 0xff, 0x25, 0x4c, 0xff, 0x10, 0x0e, 0xff, - 0x8a, 0x96, 0xff, 0x0c, 0xd1, 0xfd, 0xce, 0x0a, 0x6d, 0x07, 0x96, 0x5a, 0x66, 0xb8, 0xe5, 0x79, - 0x3d, 0xe1, 0x46, 0x95, 0xda, 0x64, 0xa4, 0xf0, 0xde, 0x02, 0x19, 0x56, 0x11, 0x08, 0x68, 0x34, - 0xfe, 0xde, 0x0b, 0xeb, 0x5b, 0x5b, 0xf3, 0xa1, 0xbb, 0xfd, 0x0a, 0x51, 0xfe, 0x7b, 0x9b, 0x0b, - 0xe3, 0x29, 0xf9, 0xe8, 0x58, 0xfd, 0x78, 0x4c, 0x04, 0xa8, 0xed, 0xfb, 0x1f, 0xf8, 0xff, 0x95, - 0xbf, 0xfc, 0x51, 0x61, 0x02, 0x4a, 0x3f, 0xff, 0xb6, 0xfc, 0xfa, 0xec, 0xa0, 0xfd, 0x3c, 0x13, - 0xfa, 0x24, 0xf5, 0xff, 0x4f, 0x50, 0x01, 0x7f, 0xde, 0xff, 0xe2, 0xa2, 0xff, 0xae, 0xe9, 0xfe, - 0x06, 0x85, 0xff, 0x4d, 0xb4, 0xfd, 0xc5, 0xfb, 0x6b, 0xa8, 0x1e, 0x59, 0xab, 0x90, 0xe7, 0x76, - 0xb6, 0xe3, 0x17, 0xe9, 0xd4, 0x99, 0x13, 0xeb, 0xf2, 0x4f, 0x1c, 0x48, 0x2c, 0x0a, 0xdd, 0x1d, - 0xfd, 0xe9, 0x83, 0xed, 0x70, 0x7f, 0xf5, 0xc1, 0xba, 0xfb, 0x75, 0x53, 0xfd, 0xdc, 0xa6, 0x0d, - 0xf2, 0xd1, 0xf9, 0x76, 0x98, 0xfd, 0x7f, 0xdc, 0x04, 0x2f, 0x52, 0xf9, 0x86, 0xa0, 0xfe, 0x92, - 0x6c, 0xfd, 0x23, 0x5b, 0x01, 0x7d, 0x9f, 0xff, 0x97, 0x72, 0xfc, 0xca, 0x12, 0xfe, 0x7b, 0xee, - 0xf9, 0xff, 0x1f, 0x00, 0xbc, 0x56, 0x01, 0x1a, 0x5d, 0xff, 0xdf, 0x08, 0x00, 0xf3, 0xf2, 0xfe, - 0xba, 0x7c, 0xff, 0x14, 0x89, 0xfd, 0x6d, 0xf5, 0x6b, 0xe6, 0x28, 0x53, 0x5c, 0x63, 0xe9, 0xfe, - 0xa3, 0xe7, 0x20, 0x55, 0xce, 0x7a, 0x6a, 0xe9, 0xc1, 0x75, 0x1f, 0xdf, 0xbf, 0x0a, 0x64, 0xef, - 0xfc, 0xed, 0xf1, 0xef, 0x42, 0x27, 0xf7, 0xe1, 0xf2, 0xf8, 0xf1, 0xd9, 0xfe, 0x87, 0x76, 0x0f, - 0x51, 0x80, 0xf8, 0xc7, 0xbf, 0xfd, 0x7d, 0x30, 0x03, 0x02, 0xc7, 0xf7, 0xe2, 0x8f, 0xff, 0xff, - 0xc2, 0xfd, 0x86, 0xb5, 0x00, 0xe3, 0xf0, 0x00, 0x40, 0xbb, 0xfd, 0xcf, 0x43, 0xfd, 0x60, 0x19, - 0xfa, 0x5e, 0x67, 0x00, 0x60, 0xe3, 0x00, 0xbc, 0x50, 0xff, 0x80, 0x14, 0x00, 0xb4, 0x04, 0xff, - 0x79, 0x9c, 0xff, 0xa0, 0x69, 0xfd, 0xaa, 0x71, 0x68, 0xcd, 0x12, 0x4e, 0x9e, 0x42, 0xec, 0x9b, - 0x3b, 0xeb, 0x1b, 0x95, 0xcb, 0x20, 0x1c, 0xe8, 0x63, 0x4f, 0x20, 0x90, 0x16, 0x0c, 0xf6, 0x9a, - 0xfd, 0x92, 0x28, 0xf1, 0xc4, 0xde, 0xf8, 0x03, 0x63, 0xf8, 0x6e, 0x16, 0xff, 0x55, 0x94, 0x0f, - 0x78, 0x51, 0xf7, 0xd6, 0x70, 0xfc, 0xf1, 0xb2, 0x02, 0x1b, 0xa5, 0xf8, 0x0b, 0xc0, 0xff, 0x13, - 0x5d, 0xfe, 0x57, 0x6e, 0x01, 0x30, 0x4e, 0x01, 0x3c, 0xef, 0xfd, 0x0d, 0xcb, 0xfc, 0x64, 0xc2, - 0xfa, 0xec, 0xaa, 0x00, 0xca, 0xf5, 0xff, 0x22, 0x4c, 0xff, 0xf6, 0x6f, 0x00, 0x9f, 0x15, 0xff, - 0x24, 0xdd, 0xff, 0x87, 0x6f, 0xfd, 0xdf, 0xf2, 0x60, 0xd9, 0x0e, 0x49, 0x14, 0x22, 0xf0, 0xd6, - 0xe3, 0xef, 0x30, 0xef, 0xcc, 0xa0, 0x1c, 0xe6, 0x15, 0xa7, 0x1f, 0xc9, 0xfd, 0x0c, 0x96, 0xcf, - 0xfd, 0x92, 0x00, 0xf4, 0x45, 0x23, 0xfa, 0x75, 0xde, 0xf6, 0xca, 0xef, 0xfe, 0x3f, 0xbc, 0x0e, - 0xb8, 0xa4, 0xf5, 0x56, 0x7f, 0xfc, 0x74, 0xbb, 0x03, 0xc0, 0x4e, 0xf8, 0x45, 0xc5, 0x00, 0xfa, - 0x02, 0x00, 0xa0, 0x4b, 0x00, 0x9f, 0x2d, 0x01, 0xef, 0x35, 0xfe, 0xb4, 0x1a, 0xfd, 0x96, 0x95, - 0xfb, 0xeb, 0x8a, 0xff, 0xda, 0xbc, 0xff, 0x01, 0xb6, 0xff, 0x2a, 0x4c, 0x00, 0xde, 0x62, 0xff, - 0xa8, 0xcd, 0xff, 0x23, 0x64, 0xfd, 0xdb, 0x34, 0x58, 0xe6, 0xcc, 0x41, 0x9c, 0xef, 0xf5, 0x05, - 0x97, 0xf5, 0xd8, 0x91, 0xcf, 0x34, 0x21, 0xe6, 0x28, 0x90, 0x1b, 0x46, 0x5b, 0x0d, 0x45, 0xbe, - 0x00, 0x86, 0x67, 0xf5, 0x2d, 0xf3, 0xf9, 0xc8, 0x8d, 0xf6, 0x4c, 0x5c, 0xfe, 0x8f, 0x57, 0x0c, - 0x18, 0x75, 0xf6, 0x1e, 0x6b, 0xfd, 0x97, 0xe2, 0x02, 0x05, 0x05, 0xfa, 0x5d, 0x08, 0x02, 0xbf, - 0x9d, 0xff, 0x5f, 0x4b, 0xff, 0x7a, 0x55, 0x01, 0x07, 0x43, 0xff, 0x4f, 0xe4, 0xfc, 0x34, 0x80, - 0xfb, 0x05, 0xa4, 0xff, 0xff, 0x9a, 0xff, 0x96, 0x9d, 0xff, 0x66, 0x6c, 0x00, 0xdf, 0x5e, 0xff, - 0x19, 0xce, 0xff, 0xa3, 0xf0, 0xfd, 0xdd, 0xcd, 0x4d, 0x8e, 0xad, 0x3a, 0x6f, 0x7a, 0xfc, 0xcc, - 0x45, 0xfb, 0x4f, 0x6b, 0xd4, 0x63, 0xca, 0xe5, 0xe4, 0xdd, 0x16, 0xb6, 0x06, 0x0f, 0x8b, 0x8a, - 0x01, 0x17, 0x26, 0xf6, 0x68, 0x31, 0xfb, 0xa8, 0x51, 0xf5, 0xce, 0xd7, 0xfd, 0x45, 0xbb, 0x0b, - 0xc1, 0xee, 0xf6, 0x11, 0xb5, 0xfd, 0x11, 0x91, 0x03, 0x41, 0x90, 0xfb, 0x99, 0xcc, 0x01, 0x1a, - 0x03, 0xff, 0x88, 0x2f, 0xff, 0x17, 0x2c, 0x02, 0x71, 0xff, 0xfe, 0x3d, 0x81, 0xfc, 0x10, 0xd9, - 0xfc, 0x3f, 0x7e, 0xff, 0xfd, 0x22, 0xff, 0xde, 0xd7, 0xff, 0x84, 0x49, 0x00, 0x24, 0x82, 0xff, - 0x5e, 0x06, 0x00, 0x52, 0xec, 0xfd, 0xdf, 0xd4, 0x3d, 0x20, 0xf6, 0x2d, 0xce, 0x4c, 0xf5, 0x9a, - 0xcf, 0xfa, 0x9c, 0x96, 0xf0, 0x4f, 0xab, 0xfe, 0x14, 0xf6, 0x11, 0x8b, 0x29, 0xfd, 0x72, 0xc1, - 0xf7, 0x51, 0x6b, 0xf9, 0x42, 0x7f, 0x02, 0x6d, 0xf7, 0xff, 0x63, 0xd2, 0xfe, 0x6b, 0xe7, 0x05, - 0x16, 0x66, 0xf8, 0x16, 0x42, 0xfd, 0xb9, 0x4d, 0x02, 0x76, 0xc3, 0xfa, 0x5c, 0x5a, 0xff, 0x4b, - 0x55, 0xff, 0x17, 0xfc, 0xfe, 0xa0, 0x20, 0x00, 0xef, 0x61, 0xff, 0xe0, 0x82, 0xfd, 0x4a, 0xad, - 0xfd, 0xf2, 0x08, 0x03, 0x0c, 0x48, 0x00, 0x47, 0x4b, 0xff, 0x53, 0x57, 0x01, 0xd4, 0xaf, 0xfd, - 0xef, 0xd7, 0xfe, 0xfb, 0x33, 0xff, 0x14, 0xf9, 0x34, 0x2f, 0xe9, 0x2b, 0x10, 0x46, 0xfb, 0x9a, - 0x33, 0xfb, 0x48, 0x5e, 0xf1, 0x90, 0x5f, 0xfd, 0xf3, 0x68, 0x10, 0xf0, 0x68, 0x00, 0x53, 0x64, - 0xf9, 0x4b, 0xe6, 0xf9, 0xa3, 0x58, 0x01, 0xc0, 0x18, 0xff, 0x06, 0xdb, 0xfe, 0xe3, 0x2a, 0x05, - 0x06, 0xca, 0xf9, 0x2d, 0x63, 0xfd, 0xcb, 0x24, 0x02, 0xf3, 0x3c, 0xfc, 0x84, 0x43, 0xff, 0x4e, - 0x83, 0xff, 0xcb, 0x8e, 0xff, 0xe1, 0x0e, 0x00, 0xcb, 0x66, 0xff, 0x3e, 0xb2, 0xfd, 0x5c, 0x76, - 0xfd, 0x18, 0x60, 0x02, 0x36, 0x9e, 0x00, 0x1f, 0x76, 0xff, 0x52, 0x84, 0x01, 0xd1, 0xa5, 0xfe, - 0x9f, 0xd3, 0xfe, 0x35, 0x36, 0xff, 0x47, 0x83, 0x2d, 0x29, 0x4e, 0x29, 0xdb, 0x48, 0x00, 0x63, - 0x0f, 0xfc, 0xdb, 0xc4, 0xf2, 0x56, 0xff, 0xfc, 0xff, 0x8e, 0x0e, 0x10, 0x72, 0x02, 0x3f, 0x06, - 0xfb, 0x81, 0xd8, 0xfa, 0xfe, 0x49, 0x00, 0x7c, 0xb6, 0xfe, 0xeb, 0x67, 0xff, 0x65, 0x50, 0x04, - 0xc1, 0x34, 0xfb, 0x86, 0xda, 0xfd, 0x0f, 0x15, 0x02, 0xb1, 0x93, 0xfd, 0x32, 0x5b, 0xff, 0xf4, - 0xe9, 0xff, 0xd0, 0x11, 0x00, 0x39, 0x25, 0x00, 0xec, 0x95, 0xff, 0x77, 0x1d, 0xfe, 0xda, 0xb0, - 0xfd, 0xf9, 0xdd, 0x01, 0x13, 0x19, 0x01, 0xdd, 0xdb, 0xff, 0xcc, 0x5a, 0x01, 0xb0, 0x37, 0xff, - 0x23, 0xea, 0xfe, 0xdf, 0x54, 0xff, 0xa6, 0x8a, 0x27, 0x71, 0x24, 0x27, 0xe4, 0x8c, 0x03, 0x14, - 0x92, 0xfc, 0xdc, 0x5b, 0xf4, 0xbc, 0x06, 0xfd, 0x25, 0xf0, 0x0c, 0x99, 0xac, 0x03, 0xce, 0xa4, - 0xfc, 0x7e, 0xba, 0xfb, 0xcf, 0x96, 0xff, 0xaf, 0xe0, 0xfe, 0xd4, 0xc3, 0xff, 0xc9, 0x89, 0x03, - 0xac, 0x68, 0xfc, 0x05, 0x93, 0xfe, 0x01, 0x24, 0x02, 0x4f, 0x7e, 0xfe, 0x7d, 0x9d, 0xff, 0xc1, - 0x3c, 0x00, 0xb5, 0x97, 0x00, 0x04, 0x52, 0x00, 0xc6, 0xbe, 0xff, 0xed, 0xce, 0xfe, 0x93, 0x29, - 0xfe, 0x2c, 0x76, 0x01, 0x2a, 0x3f, 0x01, 0x6b, 0x05, 0x00, 0xa9, 0x16, 0x01, 0x5a, 0x8a, 0xff, - 0xdd, 0x19, 0xff, 0x4b, 0x54, 0xff, 0x0f, 0x14, 0x23, 0xf2, 0x4b, 0x25, 0x10, 0x64, 0x05, 0x2c, - 0x79, 0xfc, 0xe4, 0xc5, 0xf5, 0x40, 0x5c, 0xfd, 0x7a, 0x5a, 0x0b, 0xb0, 0x43, 0x04, 0x44, 0xe4, - 0xfd, 0x01, 0x70, 0xfc, 0xd8, 0x50, 0xff, 0xf0, 0x13, 0xff, 0xb7, 0xc9, 0xff, 0xca, 0xe1, 0x02, - 0xc1, 0x73, 0xfd, 0xe7, 0x34, 0xff, 0xdf, 0xfb, 0x01, 0x1e, 0x10, 0xff, 0xe6, 0xe2, 0xff, 0x6e, - 0x5c, 0x00, 0xcb, 0xe8, 0x00, 0xe8, 0x8b, 0x00, 0xa8, 0xe9, 0xff, 0x86, 0x4d, 0xff, 0x01, 0x60, - 0xfe, 0xf2, 0xc6, 0x00, 0xe3, 0x13, 0x01, 0xbd, 0x16, 0x00, 0xfe, 0x91, 0x00, 0x70, 0x88, 0xff, - 0x65, 0x45, 0xff, 0x47, 0x62, 0xff, 0x37, 0xd6, 0x1f, 0x7e, 0xb1, 0x23, 0x7d, 0x56, 0x06, 0x5c, - 0x47, 0xfc, 0x34, 0x29, 0xf7, 0x04, 0xe1, 0xfd, 0x3f, 0xea, 0x09, 0xdb, 0xa1, 0x04, 0xa2, 0xf4, - 0xfe, 0xa3, 0x0f, 0xfd, 0x49, 0x6f, 0xff, 0x69, 0x41, 0xff, 0xa1, 0xd9, 0xff, 0x9b, 0xad, 0x02, - 0xb4, 0x37, 0xfe, 0xcf, 0xaf, 0xff, 0xc4, 0xee, 0x01, 0xc5, 0x7d, 0xff, 0xb2, 0x1a, 0x00, 0x41, - 0x80, 0x00, 0x2a, 0x41, 0x01, 0xbf, 0x9f, 0x00, 0xed, 0xd7, 0xff, 0x22, 0x98, 0xff, 0x7d, 0x79, - 0xfe, 0x3a, 0x17, 0x00, 0x96, 0xcb, 0x00, 0xe7, 0x13, 0x00, 0xb9, 0x23, 0x00, 0xc6, 0xb0, 0xff, - 0x95, 0x90, 0xff, 0x6a, 0x52, 0xff, 0xa9, 0x66, 0x1d, 0x2f, 0xa6, 0x22, 0xc7, 0xdb, 0x06, 0xa9, - 0x02, 0xfc, 0x49, 0x68, 0xf8, 0xdf, 0x59, 0xfe, 0xe5, 0xd0, 0x08, 0x9c, 0xfd, 0x04, 0x0c, 0xdf, - 0xff, 0xe3, 0x74, 0xfd, 0xf1, 0xeb, 0xff, 0x8c, 0xc3, 0xff, 0x3d, 0xb7, 0xff, 0x41, 0xca, 0x02, - 0xfd, 0xe1, 0xfe, 0x7d, 0xdc, 0xff, 0xd5, 0x0c, 0x02, 0x2c, 0xe0, 0xff, 0x78, 0x4e, 0x00, 0x5f, - 0x6f, 0x00, 0xe5, 0x54, 0x01, 0x23, 0xca, 0x00, 0x83, 0x9c, 0xff, 0xe6, 0xa4, 0xff, 0x62, 0xb2, - 0xfe, 0xaa, 0x79, 0xff, 0x2d, 0x77, 0x00, 0x12, 0x6d, 0x00, 0x3c, 0x07, 0x00, 0xce, 0xb1, 0xff, - 0x13, 0xbb, 0xff, 0x5e, 0x53, 0xff, 0xd0, 0xe8, 0x1b, 0xf3, 0xdf, 0x21, 0xfb, 0xf4, 0x06, 0xc8, - 0xa1, 0xfb, 0x71, 0x6e, 0xf9, 0xaa, 0x05, 0xff, 0xc7, 0x05, 0x08, 0xd6, 0x1c, 0x05, 0xb4, 0x84, - 0x00, 0x15, 0x97, 0xfd, 0xe3, 0x78, 0x00, 0x02, 0x9e, 0x00, 0xe8, 0x57, 0xff, 0x3d, 0xaa, 0x02, - 0x15, 0xaf, 0xff, 0x0d, 0xbb, 0xff, 0x6e, 0xfd, 0x01, 0x05, 0x3e, 0x00, 0x64, 0x0f, 0x00, 0x9b, - 0x2d, 0x00, 0x91, 0x52, 0x01, 0x92, 0xdc, 0x00, 0x0d, 0x6d, 0xff, 0x86, 0x4c, 0xff, 0x68, 0xde, - 0xfe, 0xb2, 0x71, 0xff, 0x76, 0x1a, 0x00, 0x04, 0x8f, 0x00, 0x09, 0x0f, 0x00, 0xe4, 0x7c, 0xff, - 0x2b, 0x09, 0x00, 0xf9, 0x81, 0xff, 0xa5, 0x74, 0x1a, 0x64, 0xad, 0x21, 0xd2, 0x5e, 0x07, 0x74, - 0x57, 0xfb, 0x82, 0x6e, 0xfa, 0xb5, 0x97, 0xff, 0xc9, 0x93, 0x07, 0xf0, 0xf2, 0x04, 0x29, 0xe5, - 0x00, 0xe0, 0xdf, 0xfd, 0xe6, 0x61, 0x00, 0x38, 0xb4, 0x01, 0x98, 0x8d, 0xff, 0xd5, 0xb5, 0x01, - 0xa1, 0x6d, 0x00, 0x49, 0x17, 0x00, 0x0d, 0x21, 0x01, 0x09, 0x47, 0x00, 0xc0, 0x53, 0x00, 0xd4, - 0xc5, 0xff, 0x09, 0xf9, 0x00, 0x66, 0xf7, 0x00, 0x3b, 0x95, 0xff, 0x1a, 0xf1, 0xfe, 0x3f, 0xcd, - 0xfe, 0xbd, 0xf7, 0xff, 0xb7, 0xca, 0xff, 0x03, 0x1a, 0x00, 0x77, 0x6e, 0x00, 0xa4, 0xc0, 0xff, - 0x47, 0xaf, 0xff, 0x0a, 0xba, 0xff, 0x0a, 0xde, 0x19, 0x3e, 0x4b, 0x21, 0xbf, 0xab, 0x07, 0x32, - 0x58, 0xfb, 0xcd, 0x23, 0xfb, 0xdd, 0x65, 0x00, 0x2e, 0x4a, 0x07, 0x38, 0xb6, 0x04, 0x07, 0xa2, - 0x00, 0x74, 0xe9, 0xfd, 0x68, 0x91, 0x00, 0xa1, 0xb4, 0x01, 0x03, 0x2c, 0x00, 0xb3, 0x95, 0x01, - 0x44, 0xcd, 0xff, 0x37, 0x93, 0x00, 0xdc, 0x1a, 0x01, 0x56, 0x65, 0xff, 0xc3, 0x61, 0x00, 0x06, - 0x1f, 0x00, 0xd4, 0x80, 0x00, 0x26, 0x81, 0x00, 0xf2, 0xe2, 0xff, 0xd4, 0x6d, 0xff, 0x9e, 0x78, - 0xfe, 0x9e, 0x9b, 0xff, 0x75, 0x03, 0x00, 0xc7, 0x14, 0x00, 0x57, 0x46, 0x00, 0x86, 0x68, 0xff, - 0xcd, 0x4f, 0x00, 0x8b, 0x25, 0x01, 0x09, 0x74, 0x19, 0xbe, 0x8d, 0x21, 0x5b, 0x01, 0x08, 0xb9, - 0x2e, 0xfb, 0x7d, 0xbb, 0xfb, 0xf4, 0xff, 0x00, 0xf6, 0x29, 0x07, 0xec, 0x74, 0x04, 0x69, 0x4c, - 0x00, 0xbe, 0x63, 0xfd, 0x50, 0x5d, 0x00, 0x8f, 0xcc, 0x01, 0x69, 0xcf, 0xff, 0xa3, 0xc5, 0x01, - 0x75, 0x2c, 0x00, 0xbd, 0xd8, 0xff, 0x6e, 0x21, 0x01, 0x13, 0xa6, 0xff, 0x9f, 0x76, 0xff, 0x4d, - 0x01, 0x00, 0x18, 0xef, 0x00, 0xcc, 0x13, 0x00, 0x76, 0x83, 0xff, 0x6d, 0xdc, 0xff, 0x83, 0xd4, - 0xfe, 0x44, 0xd5, 0xfe, 0xfd, 0xa2, 0xff, 0x12, 0xa3, 0x00, 0xeb, 0xa3, 0xff, 0xa3, 0x64, 0xff, - 0x83, 0xca, 0x01, 0xb8, 0xaa, 0x00, 0xe5, 0xbd, 0x19, 0xa5, 0x44, 0x22, 0x5a, 0x1a, 0x08, 0xa7, - 0xad, 0xfa, 0xf5, 0x28, 0xfc, 0xcc, 0xe3, 0x01, 0x71, 0x90, 0x07, 0x59, 0x52, 0x04, 0x5d, 0xf1, - 0xff, 0xf8, 0x17, 0xfd, 0xef, 0xc0, 0xff, 0x56, 0x93, 0x01, 0x54, 0xd9, 0xff, 0xbb, 0x54, 0x01, - 0xf1, 0x6b, 0x00, 0xf8, 0x94, 0x00, 0x6b, 0xed, 0x00, 0x06, 0x47, 0xff, 0x0b, 0xe6, 0xff, 0xa6, - 0xd5, 0xff, 0x04, 0x54, 0x00, 0x01, 0x98, 0x00, 0x22, 0xd0, 0xff, 0xe3, 0x83, 0xff, 0x70, 0xda, - 0xfe, 0xbb, 0x28, 0xff, 0xcb, 0xdb, 0xff, 0x00, 0xca, 0xff, 0x79, 0x81, 0xff, 0x71, 0x1a, 0x01, - 0x66, 0x88, 0x01, 0xdd, 0x70, 0xff, 0xb9, 0x4c, 0x1a, 0x85, 0x65, 0x23, 0xb7, 0x42, 0x08, 0xf7, - 0x83, 0xf9, 0x09, 0x00, 0xfc, 0xd0, 0xb0, 0x02, 0xb5, 0xf2, 0x07, 0x7d, 0x8c, 0x04, 0x26, 0x8a, - 0xff, 0x47, 0x2a, 0xfc, 0x82, 0x67, 0xff, 0x96, 0x58, 0x01, 0xe6, 0x02, 0xff, 0x5e, 0xc5, 0x00, - 0x86, 0x69, 0x00, 0x9f, 0x6f, 0x00, 0xe3, 0x3d, 0x01, 0xd4, 0x9c, 0xff, 0x60, 0x4f, 0xff, 0x37, - 0xc2, 0xff, 0x07, 0x95, 0x00, 0xf4, 0xd2, 0xff, 0xb9, 0x96, 0xff, 0x2a, 0xfb, 0xff, 0xf7, 0x6e, - 0xfe, 0x3b, 0x04, 0xff, 0x2c, 0x2d, 0x00, 0x5d, 0x53, 0xff, 0x4b, 0x91, 0xff, 0x78, 0x82, 0x01, - 0xc5, 0xc6, 0x00, 0x41, 0x33, 0xff, 0xef, 0xf0, 0x1a, 0xe2, 0x13, 0x25, 0x1d, 0xba, 0x08, 0xfa, - 0x49, 0xf8, 0x33, 0xa3, 0xfb, 0x9c, 0x45, 0x03, 0xba, 0x71, 0x08, 0xff, 0xd5, 0x04, 0xa0, 0x72, - 0xff, 0xea, 0x89, 0xfb, 0x4b, 0xd6, 0xfe, 0x15, 0x6d, 0x01, 0xe2, 0xbb, 0xfe, 0x3c, 0xe1, 0xff, - 0x86, 0xe6, 0xff, 0xf8, 0x86, 0x00, 0xed, 0x38, 0x01, 0x92, 0x71, 0xff, 0xc3, 0xca, 0xff, 0x22, - 0xff, 0xff, 0xaa, 0x41, 0x00, 0x0b, 0xe8, 0xff, 0xb4, 0x73, 0xff, 0x96, 0x61, 0xff, 0x12, 0x50, - 0xfe, 0x28, 0x83, 0xff, 0xf4, 0x4f, 0x00, 0xf4, 0xfd, 0xfe, 0x18, 0xea, 0xff, 0xf3, 0xd3, 0x01, - 0xf2, 0x0d, 0x00, 0x85, 0xbf, 0xfe, 0x7a, 0xee, 0x1b, 0xc8, 0x30, 0x27, 0x70, 0x30, 0x09, 0x0a, - 0xa9, 0xf6, 0x55, 0x3d, 0xfb, 0x48, 0x0c, 0x04, 0x0a, 0xd3, 0x08, 0x81, 0x38, 0x05, 0x26, 0x35, - 0xff, 0x09, 0xde, 0xfa, 0x71, 0xe9, 0xfe, 0x8b, 0x91, 0x01, 0x5e, 0x51, 0xfe, 0xde, 0x61, 0xff, - 0x2c, 0x94, 0xff, 0xc0, 0x28, 0x00, 0x57, 0xf0, 0x00, 0x81, 0x54, 0xff, 0xbc, 0x86, 0xff, 0x0c, - 0x2f, 0x00, 0x19, 0xe6, 0x00, 0xa6, 0xe0, 0xff, 0x3a, 0x22, 0xff, 0xc1, 0x69, 0xff, 0xf7, 0x0d, - 0xfe, 0xbc, 0x12, 0xff, 0x36, 0xb6, 0x00, 0x23, 0x87, 0xff, 0x35, 0xb3, 0xff, 0xa5, 0xe3, 0x01, - 0xbf, 0x38, 0x00, 0x6d, 0x66, 0xfe, 0xcf, 0x98, 0x1d, 0x85, 0x5c, 0x29, 0x19, 0x25, 0x09, 0xab, - 0x07, 0xf5, 0x29, 0xca, 0xfa, 0x7d, 0xf1, 0x04, 0xfc, 0x42, 0x09, 0x9c, 0x19, 0x05, 0x11, 0xb1, - 0xfe, 0xbc, 0x0e, 0xfa, 0x24, 0x1a, 0xff, 0x01, 0x20, 0x02, 0xea, 0x03, 0xfe, 0xe9, 0xbf, 0xfe, - 0x34, 0x0b, 0xff, 0xce, 0x11, 0x00, 0x97, 0xca, 0x00, 0x7e, 0x99, 0xfe, 0xb7, 0x13, 0xff, 0x7a, - 0x29, 0x00, 0xdd, 0xe3, 0x00, 0xf1, 0xec, 0xff, 0x4a, 0x4c, 0xff, 0x4f, 0x64, 0xff, 0x33, 0xd2, - 0xfd, 0x50, 0x08, 0xff, 0xb4, 0xae, 0x00, 0x6e, 0x61, 0xff, 0xb9, 0x76, 0xff, 0x68, 0x12, 0x02, - 0xfa, 0xd7, 0x00, 0x24, 0xfd, 0xfd, 0xac, 0x9d, 0x1f, 0xa7, 0xdc, 0x2b, 0x00, 0xbd, 0x08, 0x97, - 0x01, 0xf3, 0x3c, 0x65, 0xfa, 0xec, 0xe4, 0x05, 0x4c, 0xb4, 0x09, 0xff, 0xbc, 0x04, 0xcb, 0xdb, - 0xfd, 0xbb, 0x22, 0xf9, 0xf1, 0x2a, 0xff, 0x3e, 0xcd, 0x02, 0x85, 0xc1, 0xfd, 0x71, 0xfb, 0xfd, - 0x4e, 0xaa, 0xfe, 0xde, 0xc5, 0xff, 0xe1, 0x60, 0x00, 0xa8, 0x37, 0xfe, 0xed, 0x81, 0xfe, 0xdf, - 0x97, 0xff, 0xa6, 0xbb, 0x00, 0x6f, 0x94, 0xff, 0x35, 0xf3, 0xfe, 0x2e, 0xa1, 0xff, 0x1d, 0x13, - 0xfe, 0x22, 0xdd, 0xfe, 0x23, 0x9b, 0x00, 0x3c, 0xb7, 0xff, 0x43, 0x9b, 0xfe, 0x70, 0xfd, 0x00, - 0xba, 0x07, 0x02, 0xce, 0x8f, 0xfe, 0x9d, 0x8f, 0x22, 0x73, 0xc3, 0x2e, 0xc4, 0xe7, 0x07, 0x5e, - 0xfd, 0xf0, 0x76, 0x43, 0xfa, 0xfa, 0x55, 0x07, 0xc1, 0x5d, 0x0a, 0x04, 0x41, 0x04, 0x6e, 0xe0, - 0xfc, 0xa9, 0x56, 0xf8, 0x66, 0xca, 0xff, 0x93, 0xb0, 0x03, 0xaa, 0xbc, 0xfd, 0xbf, 0x67, 0xfd, - 0xf8, 0x51, 0xfe, 0x06, 0x0e, 0x00, 0x64, 0x48, 0x00, 0xfc, 0x9e, 0xfd, 0x2f, 0x58, 0xfe, 0xea, - 0xb5, 0xff, 0x48, 0x50, 0x00, 0x9b, 0x2e, 0xff, 0x27, 0xd5, 0xfe, 0x44, 0x6f, 0xff, 0x17, 0xb8, - 0xfe, 0xea, 0x78, 0xff, 0x75, 0x72, 0x00, 0x52, 0x2b, 0x00, 0x91, 0xa5, 0xfe, 0x8f, 0xb5, 0xff, - 0xb8, 0x0b, 0x02, 0x8c, 0xf9, 0xff, 0xd4, 0xdd, 0x25, 0x7b, 0x80, 0x31, 0xbf, 0xc7, 0x06, 0x12, - 0x0d, 0xef, 0xd1, 0xfe, 0xf9, 0xed, 0xc0, 0x08, 0x3e, 0xe3, 0x0a, 0x4e, 0x7c, 0x03, 0x76, 0x96, - 0xfb, 0x5d, 0x48, 0xf7, 0xe5, 0x7c, 0x00, 0xc0, 0x85, 0x04, 0x55, 0xa2, 0xfd, 0x47, 0xb8, 0xfc, - 0x3f, 0xc0, 0xfd, 0x0f, 0x21, 0x00, 0x3c, 0x3b, 0x00, 0x07, 0x2a, 0xfd, 0x9f, 0xb8, 0xfd, 0x97, - 0xd7, 0xff, 0x70, 0x24, 0x00, 0x26, 0x4c, 0xfe, 0x7b, 0xba, 0xfe, 0x44, 0x0a, 0xff, 0xf3, 0xb8, - 0xfe, 0x89, 0x74, 0x00, 0xd3, 0x6c, 0x00, 0x19, 0x06, 0x00, 0x76, 0x0d, 0xff, 0x11, 0xce, 0xfe, - 0xd8, 0xf7, 0x00, 0xac, 0x14, 0x01, 0x35, 0x29, 0x29, 0xa6, 0xba, 0x34, 0x62, 0xcd, 0x05, 0xb5, - 0x23, 0xed, 0xda, 0xb4, 0xf9, 0xad, 0x0a, 0x0a, 0x6c, 0xae, 0x0b, 0x71, 0x96, 0x02, 0x54, 0x73, - 0xfa, 0x3a, 0x50, 0xf6, 0x03, 0x00, 0x01, 0x2b, 0xa8, 0x05, 0x34, 0x7b, 0xfd, 0x76, 0x30, 0xfc, - 0x3e, 0x5b, 0xfd, 0xff, 0x13, 0x00, 0x07, 0x28, 0x00, 0xd6, 0xed, 0xfc, 0x99, 0x57, 0xfd, 0x21, - 0xc1, 0xff, 0x8f, 0x58, 0x00, 0xee, 0x8c, 0xfd, 0x40, 0x78, 0xfe, 0xf5, 0x12, 0xff, 0x99, 0x71, - 0xfe, 0xff, 0x40, 0x01, 0x19, 0xdb, 0x00, 0xb1, 0xcd, 0xff, 0x72, 0x41, 0xff, 0x69, 0xb1, 0xfe, - 0xd1, 0xb6, 0xff, 0x43, 0x0d, 0x01, 0x57, 0xbd, 0x2b, 0xd3, 0x2b, 0x38, 0x3c, 0x88, 0x05, 0x13, - 0xb6, 0xeb, 0x73, 0x47, 0xf9, 0xea, 0xaa, 0x0a, 0xe3, 0xbc, 0x0c, 0xe1, 0xbc, 0x01, 0x5b, 0x86, - 0xf9, 0x52, 0xab, 0xf5, 0x9d, 0xff, 0x00, 0x0c, 0xd6, 0x06, 0x8a, 0x56, 0xfd, 0x57, 0xb5, 0xfb, - 0x41, 0x21, 0xfd, 0xd8, 0xfb, 0xff, 0xb1, 0x1d, 0x00, 0x4e, 0x8c, 0xfc, 0x6b, 0x3f, 0xfd, 0x0e, - 0x7a, 0xff, 0x7a, 0x8a, 0x00, 0xd4, 0x52, 0xfd, 0x41, 0x01, 0xfe, 0xcf, 0x5a, 0xff, 0x4f, 0x23, - 0xfe, 0x64, 0xba, 0x01, 0x58, 0x7d, 0x01, 0xd1, 0xa2, 0xff, 0x2a, 0x53, 0xff, 0x8d, 0xaa, 0xfe, - 0xb9, 0x0f, 0xff, 0xec, 0x1c, 0x00, 0x6c, 0xc8, 0x2e, 0x85, 0x52, 0x3b, 0xff, 0xcf, 0x04, 0x4f, - 0xb6, 0xea, 0x6a, 0xca, 0xf8, 0x62, 0xd7, 0x0a, 0xc4, 0x88, 0x0d, 0x4f, 0xe0, 0x00, 0xf4, 0x98, - 0xf8, 0xbc, 0x18, 0xf5, 0x02, 0xf6, 0x00, 0x93, 0xa8, 0x07, 0x68, 0x21, 0xfd, 0xae, 0x1e, 0xfb, - 0xa0, 0xed, 0xfc, 0x05, 0xe4, 0xff, 0xa9, 0xfc, 0xff, 0x54, 0x30, 0xfc, 0x26, 0xfe, 0xfc, 0x7f, - 0x29, 0xff, 0x83, 0x86, 0x00, 0x12, 0x43, 0xfd, 0x10, 0xad, 0xfd, 0xb2, 0x9f, 0xff, 0x46, 0x0d, - 0xfe, 0xbf, 0xab, 0x01, 0x8d, 0xff, 0x01, 0xc0, 0xa7, 0xff, 0xb6, 0x2a, 0xff, 0xb0, 0x75, 0xfe, - 0x91, 0xb1, 0xfe, 0x96, 0x17, 0xff, 0x2b, 0x9a, 0x32, 0xac, 0x8e, 0x3d, 0x12, 0x67, 0x03, 0x58, - 0x8a, 0xea, 0xfd, 0x8a, 0xf8, 0x69, 0xa3, 0x0a, 0xa2, 0xd5, 0x0d, 0x37, 0x2e, 0x00, 0xa9, 0xea, - 0xf7, 0xd1, 0x9d, 0xf4, 0x01, 0x08, 0x01, 0xff, 0x04, 0x08, 0xec, 0xe5, 0xfc, 0xac, 0xa2, 0xfa, - 0x90, 0xb7, 0xfc, 0x88, 0xd8, 0xff, 0x78, 0xc4, 0xff, 0x8f, 0xf8, 0xfb, 0xa5, 0xb7, 0xfc, 0xf8, - 0xcf, 0xfe, 0x67, 0x55, 0x00, 0x7c, 0x63, 0xfd, 0x4c, 0xa4, 0xfd, 0x80, 0xaa, 0xff, 0xe8, 0x67, - 0xfe, 0xaa, 0x8b, 0x01, 0xa1, 0xfe, 0x01, 0xea, 0xce, 0xff, 0x7f, 0x20, 0xff, 0x05, 0x22, 0xfe, - 0xd1, 0x3f, 0xfe, 0x61, 0xa5, 0xfe, 0xa9, 0x5a, 0x36, 0xcb, 0xf4, 0x3f, 0x39, 0x8d, 0x01, 0x07, - 0x9d, 0xea, 0x60, 0xdf, 0xf8, 0x7d, 0xb7, 0x09, 0xee, 0xc7, 0x0d, 0xa6, 0xbe, 0xff, 0xec, 0x8b, - 0xf7, 0x4b, 0x38, 0xf4, 0x91, 0xd3, 0x00, 0x87, 0x4b, 0x08, 0x2b, 0xa2, 0xfc, 0xf6, 0x68, 0xfa, - 0x0a, 0x9c, 0xfc, 0xed, 0x96, 0xff, 0x5c, 0xa6, 0xff, 0x3c, 0xe2, 0xfb, 0x5e, 0x6e, 0xfc, 0x6f, - 0x74, 0xfe, 0x5b, 0x32, 0x00, 0x76, 0xb3, 0xfd, 0x32, 0xc4, 0xfd, 0x20, 0x94, 0xff, 0x8a, 0xea, - 0xfe, 0xd8, 0x85, 0x01, 0xc3, 0x9d, 0x01, 0xba, 0xf3, 0xff, 0xe9, 0x39, 0xff, 0xad, 0xd2, 0xfd, - 0xf0, 0xac, 0xfd, 0xe9, 0xa0, 0xfe, 0x2c, 0x18, 0x3a, 0x3e, 0x93, 0x42, 0x5d, 0x6d, 0xfe, 0x9c, - 0x7e, 0xea, 0x5f, 0x16, 0xfa, 0x37, 0x0e, 0x08, 0xec, 0x7a, 0x0d, 0xcb, 0x7c, 0xff, 0xbc, 0x44, - 0xf7, 0x8e, 0xbb, 0xf3, 0x46, 0x42, 0x00, 0xa6, 0x68, 0x08, 0x65, 0x30, 0xfc, 0xa6, 0xa8, 0xfa, - 0xba, 0x61, 0xfc, 0x04, 0x17, 0xff, 0xe9, 0xa6, 0xff, 0xdd, 0x8e, 0xfb, 0xc9, 0x56, 0xfc, 0xd3, - 0xe9, 0xfd, 0xef, 0x24, 0x00, 0xdd, 0x2d, 0xfe, 0x32, 0xab, 0xfd, 0x30, 0x92, 0xff, 0xb2, 0x3e, - 0xff, 0xae, 0x5a, 0x01, 0xe3, 0xfd, 0x00, 0x96, 0x1f, 0x00, 0x78, 0x3b, 0xff, 0x01, 0x66, 0xfd, - 0x8b, 0x76, 0xfd, 0xf4, 0x7f, 0xfe, 0x84, 0xd1, 0x3f, 0x71, 0x47, 0x44, 0xfe, 0xd0, 0xf8, 0xd5, - 0xfb, 0xea, 0x91, 0x30, 0xfc, 0x16, 0x70, 0x06, 0x22, 0xeb, 0x0c, 0xcd, 0xf1, 0xfe, 0x6f, 0xed, - 0xf6, 0x44, 0x19, 0xf3, 0x53, 0x3d, 0x00, 0x3e, 0x52, 0x08, 0x9e, 0x99, 0xfb, 0x75, 0xad, 0xfb, - 0x25, 0xf6, 0xfb, 0x63, 0xca, 0xfe, 0x14, 0xb8, 0xff, 0xce, 0xde, 0xfa, 0xce, 0x9c, 0xfc, 0x86, - 0x90, 0xfd, 0x55, 0x68, 0x00, 0xad, 0x69, 0xfe, 0x28, 0x99, 0xfd, 0xe3, 0xfe, 0xff, 0x9d, 0xe4, - 0xfe, 0xb1, 0x44, 0x01, 0xc2, 0xab, 0x00, 0xf0, 0x16, 0x00, 0x2e, 0x2f, 0xff, 0x26, 0x17, 0xfd, - 0xa5, 0xf0, 0xfd, 0x47, 0x0a, 0xfe, 0xc7, 0x45, 0x47, 0xac, 0x86, 0x44, 0xa1, 0x37, 0xf1, 0x1a, - 0x6a, 0xec, 0x9e, 0x2d, 0xfe, 0x00, 0x2c, 0x05, 0x99, 0x55, 0x0c, 0xde, 0xc7, 0xfd, 0x72, 0x9d, - 0xf6, 0x21, 0x38, 0xf2, 0x7c, 0xdc, 0x00, 0x0b, 0x39, 0x08, 0xd6, 0xf2, 0xfa, 0x93, 0x10, 0xfd, - 0xdb, 0x7a, 0xfb, 0x2f, 0xb4, 0xfe, 0x2f, 0x89, 0xff, 0x89, 0x27, 0xfa, 0xd0, 0x40, 0xfd, 0x56, - 0x9e, 0xfd, 0xa3, 0x75, 0x00, 0xb8, 0x51, 0xfe, 0x1d, 0x09, 0xfe, 0x40, 0xd3, 0xff, 0xc8, 0x0f, - 0xfe, 0x7e, 0xeb, 0x01, 0xa6, 0x43, 0x00, 0x3d, 0xb1, 0xff, 0x8d, 0x93, 0xff, 0x8d, 0x27, 0xfd, - 0x5b, 0x20, 0xfe, 0x3e, 0x56, 0xfd, 0x68, 0x88, 0x4e, 0xff, 0xce, 0x43, 0x2d, 0x9d, 0xe9, 0x96, - 0x45, 0xee, 0x55, 0xac, 0xff, 0x76, 0x36, 0x04, 0xd7, 0xb9, 0x0b, 0x93, 0x1a, 0xfc, 0x8e, 0x4d, - 0xf6, 0xaf, 0x3c, 0xf1, 0x0b, 0xe8, 0x01, 0x66, 0x59, 0x08, 0x6d, 0x1c, 0xfa, 0xb4, 0xba, 0xfe, - 0x48, 0x15, 0xfb, 0x05, 0x62, 0xfe, 0xc6, 0x40, 0xff, 0xc6, 0xc1, 0xf9, 0x17, 0x7f, 0xfe, 0x89, - 0x32, 0xfd, 0xed, 0x06, 0x00, 0x73, 0xec, 0xfe, 0x1f, 0x93, 0xfd, 0x82, 0xe9, 0xfe, 0x06, 0x54, - 0xfe, 0xc6, 0x49, 0x02, 0xd8, 0x77, 0xff, 0x12, 0x08, 0x00, 0x9d, 0x54, 0x00, 0x4d, 0x93, 0xfc, - 0x3e, 0xd8, 0xfd, 0x9d, 0xae, 0xfd, 0x8d, 0x35, 0x55, 0x78, 0x64, 0x42, 0x7f, 0xa3, 0xe2, 0xba, - 0x7e, 0xf0, 0xb4, 0xac, 0x00, 0xe0, 0x58, 0x03, 0x18, 0x46, 0x0b, 0xe5, 0x43, 0xfa, 0x80, 0xe5, - 0xf5, 0xb5, 0xf1, 0xf0, 0x9f, 0x94, 0x03, 0x6a, 0x09, 0x08, 0xbd, 0x8b, 0xf9, 0x19, 0xeb, 0x00, - 0xa1, 0x47, 0xfa, 0xe8, 0xf0, 0xfd, 0xdf, 0xaa, 0xff, 0xb2, 0x11, 0xfa, 0xe6, 0x1e, 0xff, 0x24, - 0x88, 0xfc, 0xfa, 0x3d, 0x00, 0x13, 0x72, 0xfe, 0x31, 0xda, 0xfc, 0x8e, 0x2f, 0xff, 0xdf, 0x14, - 0xfe, 0x5e, 0x8d, 0x02, 0x0d, 0xe6, 0xff, 0x1f, 0x88, 0x00, 0xa7, 0x33, 0x00, 0x1d, 0xfa, 0xfb, - 0x63, 0x99, 0xfe, 0x78, 0xdf, 0xfd, 0x77, 0x45, 0x5a, 0x32, 0xda, 0x40, 0x77, 0xff, 0xdc, 0x80, - 0xe2, 0xf2, 0x19, 0xb3, 0x00, 0x86, 0xfd, 0x01, 0x50, 0x9e, 0x0b, 0x9e, 0x41, 0xf8, 0x9f, 0x8d, - 0xf5, 0x71, 0xbb, 0xf1, 0xe2, 0xb7, 0x04, 0x50, 0x81, 0x07, 0xf1, 0x9d, 0xf9, 0x21, 0xdd, 0x02, - 0x50, 0xf0, 0xf8, 0x4a, 0x2e, 0xfe, 0x25, 0x1b, 0x01, 0xff, 0x51, 0xf9, 0x38, 0xaa, 0xff, 0xa5, - 0x37, 0xfc, 0x75, 0xed, 0xfe, 0x7d, 0xb7, 0xfe, 0xe4, 0xef, 0xfc, 0x83, 0x5d, 0xfe, 0x84, 0x63, - 0xfe, 0x9a, 0xeb, 0x03, 0x0a, 0x05, 0x00, 0xb2, 0x10, 0x00, 0xbc, 0x7a, 0x00, 0x1a, 0x3f, 0xfc, - 0x4f, 0x8c, 0xfe, 0x33, 0x7c, 0xfd, 0x39, 0x93, 0x5d, 0x0e, 0x20, 0x3e, 0xfe, 0xd1, 0xd9, 0xf4, - 0x8a, 0xf5, 0x8a, 0xdc, 0xfe, 0x1d, 0xec, 0x00, 0xca, 0xa3, 0x0c, 0xad, 0xd2, 0xf6, 0x5d, 0x5d, - 0xf5, 0x0a, 0xbc, 0xf2, 0xe3, 0xc8, 0x05, 0x83, 0x9f, 0x06, 0x3f, 0xfb, 0xf9, 0xce, 0x41, 0x04, - 0x44, 0x5a, 0xf8, 0x67, 0xfc, 0xfe, 0xd0, 0x7d, 0x01, 0x76, 0x2e, 0xf9, 0xa9, 0x52, 0xff, 0x42, - 0xea, 0xfa, 0x73, 0x45, 0xff, 0x72, 0xc7, 0xfe, 0xa5, 0x4a, 0xfc, 0xe0, 0xad, 0xfe, 0x45, 0x57, - 0xff, 0xba, 0x6e, 0x04, 0x39, 0x7d, 0xff, 0x02, 0x7e, 0x00, 0x07, 0xeb, 0x00, 0x37, 0x9f, 0xfb, - 0x2c, 0x7e, 0xfe, 0xac, 0x7a, 0xfd, 0xfc, 0xb8, 0x5e, 0x72, 0x95, 0x3a, 0x25, 0xbb, 0xd9, 0x71, - 0xc3, 0xf7, 0xab, 0x2b, 0xfb, 0xc0, 0x57, 0x00, 0xac, 0xa0, 0x0e, 0x87, 0x1b, 0xf6, 0x0e, 0xa1, - 0xf4, 0x41, 0x40, 0xf4, 0x06, 0xe4, 0x06, 0x64, 0xa8, 0x04, 0x54, 0xc2, 0xfa, 0xb4, 0x8e, 0x06, - 0x61, 0x74, 0xf7, 0xbb, 0x1c, 0xff, 0x49, 0x8a, 0x02, 0xce, 0x9e, 0xf7, 0x3b, 0x9a, 0xfe, 0x20, - 0xcc, 0xfb, 0x0b, 0x84, 0xfe, 0xa0, 0xcf, 0xfe, 0x3e, 0x36, 0xfd, 0x9e, 0xc5, 0xfe, 0x49, 0x6f, - 0xff, 0x8d, 0x8e, 0x04, 0x0b, 0xf0, 0xff, 0x9e, 0x71, 0x00, 0x1d, 0xaf, 0x00, 0xe5, 0x7b, 0xfb, - 0x5b, 0x53, 0xfe, 0x56, 0xc7, 0xfd, 0xc5, 0xa3, 0x5c, 0x13, 0xe8, 0x37, 0x58, 0xf4, 0xdb, 0xcc, - 0xf2, 0xf8, 0xf6, 0x09, 0xf7, 0x6e, 0x40, 0x00, 0x9c, 0x5c, 0x11, 0x4b, 0x6f, 0xf5, 0x28, 0x43, - 0xf4, 0xa6, 0x2a, 0xf6, 0x22, 0x68, 0x06, 0x9d, 0x0e, 0x03, 0xc9, 0xc1, 0xfc, 0xf2, 0x8d, 0x07, - 0x66, 0xaa, 0xf6, 0xdc, 0x79, 0xff, 0xcc, 0xc7, 0x01, 0x01, 0x01, 0xf7, 0x10, 0x1b, 0xff, 0xe5, - 0xad, 0xfb, 0xb4, 0x88, 0xfe, 0x49, 0xba, 0xff, 0x6b, 0xb9, 0xfd, 0x2c, 0x3b, 0xfe, 0x64, 0x5a, - 0xff, 0x06, 0x2a, 0x05, 0x33, 0xbf, 0xff, 0x49, 0x0e, 0x00, 0xfe, 0xbe, 0x00, 0xab, 0x51, 0xfb, - 0xa4, 0x98, 0xfe, 0xf6, 0xe6, 0xfd, 0x29, 0xb1, 0x57, 0xdf, 0xa2, 0x35, 0x56, 0x58, 0xe0, 0x93, - 0x46, 0xf9, 0xde, 0xbc, 0xf3, 0xc5, 0x54, 0x00, 0xb3, 0x3f, 0x13, 0x26, 0x1a, 0xf6, 0x34, 0x67, - 0xf4, 0x69, 0xfe, 0xf6, 0x25, 0xff, 0x05, 0x4e, 0x8c, 0x02, 0x50, 0x6b, 0xfd, 0xed, 0x63, 0x08, - 0xb7, 0x73, 0xf6, 0x51, 0x0b, 0xfe, 0xca, 0x49, 0x02, 0x67, 0x41, 0xf7, 0xdc, 0xc4, 0xfe, 0x1e, - 0xcb, 0xfc, 0xbb, 0xdd, 0xfe, 0x90, 0x2c, 0x00, 0xb6, 0xcf, 0xfd, 0x1f, 0xee, 0xfd, 0x74, 0x5e, - 0xff, 0xd4, 0x0d, 0x05, 0x10, 0xa0, 0xff, 0x46, 0x6d, 0xff, 0x94, 0x32, 0x01, 0x29, 0xb3, 0xfb, - 0x9e, 0x5e, 0xfe, 0x26, 0x1d, 0xfe, 0x83, 0x19, 0x51, 0xbc, 0x58, 0x32, 0x7d, 0xd5, 0xe6, 0x9c, - 0xb0, 0xf9, 0xc3, 0x21, 0xf1, 0x75, 0x7e, 0x00, 0x86, 0xcc, 0x13, 0x15, 0x22, 0xf8, 0x6f, 0x54, - 0xf4, 0x7f, 0x55, 0xf8, 0x98, 0xd1, 0x05, 0xaf, 0x98, 0x00, 0xed, 0x16, 0xff, 0xc3, 0xfd, 0x07, - 0x49, 0xcb, 0xf5, 0x56, 0x33, 0xfe, 0x6b, 0x22, 0x02, 0xf7, 0x16, 0xf8, 0x24, 0x01, 0xff, 0x85, - 0xf3, 0xfd, 0x8f, 0x3a, 0xff, 0xe1, 0xd0, 0xff, 0x81, 0x5f, 0xfe, 0x65, 0xd7, 0xfd, 0x1a, 0x0a, - 0xff, 0x55, 0x7d, 0x04, 0xaa, 0x5e, 0xff, 0x08, 0x9b, 0xff, 0xfb, 0x71, 0x01, 0x31, 0xf5, 0xfb, - 0x2a, 0x55, 0xfe, 0xfb, 0xb0, 0xfe, 0xcd, 0x34, 0x48, 0x4b, 0x1b, 0x30, 0xba, 0xd5, 0xed, 0x8b, - 0xf6, 0xf9, 0x65, 0x03, 0xf0, 0x17, 0xd3, 0xff, 0xd4, 0xa7, 0x13, 0x2d, 0x3a, 0xfa, 0xd9, 0xbb, - 0xf5, 0xe3, 0x5f, 0xf9, 0xa6, 0xe7, 0x03, 0xd2, 0x4c, 0x00, 0x4f, 0x5b, 0xff, 0xe0, 0x98, 0x06, - 0x91, 0xff, 0xf6, 0x58, 0x9c, 0xfd, 0xce, 0x35, 0x02, 0xcc, 0x71, 0xf9, 0xe4, 0x16, 0xff, 0xc8, - 0x08, 0xff, 0x4b, 0xec, 0xfe, 0x51, 0xb8, 0xff, 0x50, 0x26, 0xff, 0xb5, 0xa9, 0xfd, 0x99, 0x2b, - 0xfe, 0x41, 0xbc, 0x03, 0x0b, 0xda, 0xff, 0x7e, 0x77, 0xff, 0x3f, 0x6d, 0x01, 0x8b, 0x8f, 0xfc, - 0x0e, 0x9b, 0xfe, 0x81, 0x28, 0xff, 0xdf, 0x33, 0x3b, 0x5e, 0xb1, 0x2e, 0x7b, 0xfa, 0xf3, 0x4a, - 0xc8, 0xf8, 0x13, 0x96, 0xf9, 0x7e, 0xa5, 0x00, 0xd6, 0x5c, 0x09, 0x6f, 0x67, 0xfa, 0xfe, 0xa8, - 0xf7, 0xee, 0xaf, 0xf9, 0x66, 0x14, 0x04, 0x6c, 0x2c, 0x02, 0xfe, 0x4e, 0xff, 0x06, 0xfc, 0x04, - 0x8d, 0xdd, 0xfa, 0x82, 0xea, 0xfe, 0x74, 0x5f, 0x02, 0x12, 0xfc, 0xfb, 0x34, 0xb1, 0xfe, 0xe5, - 0xd2, 0xfe, 0x29, 0xcb, 0xff, 0xe3, 0x59, 0xff, 0x5e, 0x97, 0xfe, 0xf8, 0x8a, 0xfe, 0xc7, 0xa7, - 0xfe, 0x18, 0x53, 0x02, 0x4c, 0x86, 0xff, 0x87, 0x19, 0xff, 0xca, 0x37, 0x01, 0xb1, 0x15, 0xfe, - 0x89, 0x48, 0xfe, 0xa9, 0xb6, 0xfe, 0x75, 0x5e, 0x32, 0xf6, 0x6c, 0x2c, 0x22, 0x36, 0xfa, 0xe9, - 0x93, 0xf8, 0xee, 0xc6, 0xf8, 0xe0, 0x91, 0x00, 0x5d, 0x96, 0x09, 0xf8, 0xf0, 0xfc, 0x82, 0x6d, - 0xf9, 0xc4, 0x29, 0xfa, 0xae, 0x22, 0x02, 0xbf, 0x0b, 0x02, 0x68, 0x83, 0xff, 0xa5, 0x05, 0x04, - 0x3f, 0x4f, 0xfc, 0xbf, 0x76, 0xfe, 0xfb, 0x12, 0x02, 0x3e, 0x6d, 0xfd, 0xe8, 0x33, 0xff, 0x34, - 0xb6, 0xff, 0x1a, 0x0d, 0x00, 0x83, 0xac, 0xff, 0x1e, 0x1e, 0xff, 0x38, 0x5f, 0xfe, 0x53, 0x27, - 0xfe, 0x76, 0xbb, 0x01, 0xaf, 0xdb, 0xff, 0xd9, 0x1d, 0xff, 0xff, 0x41, 0x01, 0x50, 0xe5, 0xfe, - 0x87, 0x9c, 0xfe, 0xe1, 0xf4, 0xfe, 0xe1, 0x1c, 0x2b, 0x6f, 0x1b, 0x2a, 0x6d, 0xbf, 0xfe, 0x4d, - 0xa5, 0xf8, 0xd6, 0xe1, 0xf8, 0xc2, 0x62, 0x00, 0x04, 0xed, 0x08, 0xa2, 0x29, 0xff, 0x4e, 0x39, - 0xfb, 0xad, 0x73, 0xfa, 0x65, 0xf2, 0x00, 0xfc, 0xe4, 0x01, 0xa0, 0x80, 0xff, 0xa4, 0x81, 0x03, - 0xaf, 0xa1, 0xfd, 0x86, 0x72, 0xfe, 0xa1, 0xde, 0x01, 0x18, 0xc5, 0xfe, 0x7e, 0xaa, 0xff, 0x34, - 0xe3, 0xff, 0xd3, 0x9e, 0x00, 0x7f, 0x1d, 0x00, 0xe5, 0x37, 0xff, 0xaf, 0xad, 0xfe, 0x20, 0x04, - 0xfe, 0xcd, 0x06, 0x01, 0x61, 0x20, 0x00, 0xc2, 0x2b, 0xff, 0xdb, 0xe3, 0x00, 0xb2, 0x53, 0xff, - 0x4a, 0xf7, 0xfe, 0xb0, 0x0c, 0xff, 0xe7, 0xad, 0x25, 0xb8, 0x19, 0x28, 0x81, 0x8b, 0x01, 0x05, - 0x97, 0xf8, 0xdb, 0x61, 0xf9, 0x16, 0x3b, 0x00, 0x45, 0x12, 0x08, 0x26, 0xa2, 0x00, 0x96, 0x8f, - 0xfc, 0x49, 0xf0, 0xfa, 0xa1, 0x3e, 0x00, 0x85, 0xc6, 0x01, 0xdd, 0x8e, 0xff, 0xbd, 0xee, 0x02, - 0xfb, 0xba, 0xfe, 0x11, 0xdb, 0xfe, 0xed, 0x8a, 0x01, 0x90, 0x8e, 0xff, 0x7a, 0xee, 0xff, 0x19, - 0xe7, 0xff, 0xf0, 0xfe, 0x00, 0xcb, 0x5c, 0x00, 0xa1, 0x57, 0xff, 0x8c, 0xe3, 0xfe, 0x37, 0xe9, - 0xfd, 0x26, 0x4d, 0x00, 0x81, 0xfc, 0xff, 0xf9, 0x0c, 0xff, 0x14, 0x3a, 0x00, 0x3b, 0x99, 0xff, - 0x98, 0x64, 0xff, 0xe2, 0x15, 0xff, 0xf3, 0x35, 0x22, 0xed, 0x7f, 0x26, 0xc3, 0x23, 0x03, 0xd3, - 0x94, 0xf8, 0x2f, 0x1b, 0xfa, 0x2f, 0x71, 0x00, 0xd7, 0x57, 0x07, 0xd1, 0x99, 0x01, 0x14, 0x90, - 0xfd, 0x70, 0x88, 0xfb, 0x7f, 0x08, 0x00, 0x6b, 0xcc, 0x01, 0x9c, 0x01, 0x00, 0x50, 0x9e, 0x02, - 0x1a, 0x71, 0xff, 0x69, 0xa8, 0xff, 0xdd, 0x5f, 0x01, 0x64, 0xbc, 0xff, 0x62, 0x43, 0x00, 0x2b, - 0x17, 0x00, 0xd3, 0x14, 0x01, 0x6b, 0x6d, 0x00, 0xbd, 0x7e, 0xff, 0xc5, 0x2a, 0xff, 0x25, 0xdd, - 0xfd, 0xa1, 0xa2, 0xff, 0x5c, 0xc3, 0xff, 0x81, 0xff, 0xfe, 0xfa, 0xfd, 0xff, 0xc4, 0x0d, 0x00, - 0x76, 0xba, 0xff, 0xe9, 0xec, 0xfe, 0xe5, 0xd3, 0x1f, 0xba, 0x7e, 0x25, 0xb3, 0x36, 0x04, 0x0b, - 0x75, 0xf8, 0x94, 0xde, 0xfa, 0x35, 0xe0, 0x00, 0x63, 0xaf, 0x06, 0x0d, 0x36, 0x02, 0x67, 0x18, - 0xfe, 0x65, 0x9a, 0xfb, 0xec, 0x16, 0x00, 0xd5, 0xe2, 0x01, 0xd1, 0x43, 0x00, 0x94, 0xbb, 0x02, - 0xd3, 0x9f, 0xff, 0xac, 0x00, 0x00, 0x92, 0xbe, 0x01, 0x04, 0x88, 0xff, 0x03, 0xdd, 0xff, 0x14, - 0x44, 0x00, 0x91, 0x28, 0x01, 0xd6, 0x15, 0x00, 0x64, 0x4a, 0xff, 0x5e, 0x94, 0xff, 0x42, 0xe4, - 0xfd, 0x19, 0xc7, 0xfe, 0x37, 0xa6, 0xff, 0x79, 0x6b, 0xff, 0xce, 0xd8, 0xff, 0xb0, 0xb7, 0xff, - 0x25, 0xc9, 0xff, 0xa2, 0xa2, 0xff, 0x91, 0x93, 0x1e, 0xf2, 0x14, 0x25, 0x1b, 0xc2, 0x04, 0x79, - 0x4b, 0xf8, 0xd9, 0x9f, 0xfb, 0x07, 0xbf, 0x01, 0xf5, 0x47, 0x06, 0xfc, 0x22, 0x02, 0xf7, 0x7d, - 0xfe, 0xdc, 0x3d, 0xfb, 0x83, 0xbe, 0xff, 0x73, 0x59, 0x02, 0x0f, 0xff, 0xff, 0x3b, 0x7b, 0x02, - 0xa0, 0x64, 0x00, 0x6e, 0xf4, 0xff, 0x2b, 0x8d, 0x01, 0xd2, 0xf9, 0xff, 0x1a, 0x64, 0xff, 0x4e, - 0x7d, 0xff, 0x1a, 0x5e, 0x01, 0x68, 0x4e, 0x00, 0x3a, 0xa8, 0xfe, 0xc8, 0x26, 0xff, 0xc1, 0x79, - 0xfe, 0x5e, 0xfe, 0xfe, 0x05, 0x10, 0xff, 0xb0, 0x66, 0xff, 0x12, 0xcd, 0xff, 0x35, 0x66, 0xff, - 0x91, 0x32, 0x00, 0x99, 0x69, 0xff, 0x79, 0x86, 0x1e, 0x28, 0x6e, 0x25, 0x07, 0x9b, 0x04, 0x32, - 0xd3, 0xf7, 0xf7, 0x64, 0xfc, 0xb0, 0xc3, 0x02, 0x45, 0xa2, 0x06, 0x76, 0xcc, 0x01, 0xb1, 0xf5, - 0xfd, 0x16, 0x44, 0xfb, 0x09, 0x54, 0xff, 0xd1, 0xe5, 0x01, 0x53, 0xfb, 0xff, 0xc1, 0x00, 0x02, - 0xb5, 0x6b, 0x00, 0x94, 0xa9, 0x00, 0xd9, 0x9c, 0x01, 0x1d, 0x9f, 0xff, 0x53, 0x9a, 0xff, 0xee, - 0x89, 0xff, 0x45, 0x89, 0x00, 0x66, 0x03, 0x00, 0xd5, 0x02, 0xff, 0xa7, 0xed, 0xfe, 0xd3, 0x10, - 0xfe, 0x36, 0x63, 0xff, 0x04, 0xbf, 0xff, 0xca, 0xbe, 0xfe, 0x54, 0x20, 0xff, 0x5c, 0x16, 0x00, - 0x83, 0xbe, 0xff, 0xcc, 0x2c, 0xff, 0x31, 0xd3, 0x1e, 0x8f, 0xad, 0x26, 0x98, 0xd7, 0x04, 0xd0, - 0xda, 0xf6, 0x43, 0xef, 0xfc, 0xbd, 0xf1, 0x03, 0xe3, 0x11, 0x07, 0xbe, 0xd9, 0x01, 0x43, 0x6c, - 0xfd, 0x88, 0x8f, 0xfa, 0x92, 0x33, 0xff, 0x1e, 0xf5, 0x01, 0x6b, 0x25, 0xff, 0xb8, 0x4e, 0x01, - 0x60, 0x93, 0x00, 0x84, 0x88, 0x00, 0x1a, 0xf0, 0x01, 0x22, 0x2f, 0x00, 0xd3, 0x6c, 0xff, 0x5c, - 0xb3, 0xff, 0x6e, 0xe0, 0x00, 0x24, 0x51, 0xff, 0xf6, 0x2d, 0xfe, 0x87, 0x4b, 0xff, 0xcb, 0x8f, - 0xfe, 0x50, 0x1b, 0xff, 0xde, 0x75, 0xff, 0xab, 0x44, 0xff, 0xbd, 0xcd, 0xff, 0x4e, 0x0d, 0xff, - 0x1b, 0x17, 0xff, 0x17, 0xea, 0x00, 0x69, 0x78, 0x20, 0x85, 0x53, 0x28, 0x2f, 0x51, 0x04, 0x3a, - 0xac, 0xf5, 0x48, 0x40, 0xfd, 0xb8, 0x2a, 0x05, 0xe5, 0x97, 0x07, 0x60, 0x9e, 0x01, 0x80, 0x05, - 0xfd, 0xf6, 0xfd, 0xf9, 0xc1, 0xe3, 0xfe, 0x61, 0x17, 0x02, 0x34, 0xdf, 0xfe, 0xc4, 0x74, 0x00, - 0xc1, 0xd7, 0xff, 0x8d, 0x83, 0x00, 0x4f, 0x12, 0x02, 0xde, 0xd5, 0xff, 0x3a, 0xa5, 0xff, 0x48, - 0x78, 0x00, 0xb7, 0xf6, 0x00, 0x99, 0x06, 0xff, 0x3a, 0x12, 0xfe, 0xa9, 0xc2, 0xfe, 0x1c, 0x03, - 0xfe, 0x49, 0x9b, 0xff, 0x14, 0xe8, 0xff, 0xd3, 0x02, 0xff, 0xca, 0xbc, 0xff, 0x7b, 0x41, 0xff, - 0xa0, 0x73, 0xff, 0x01, 0xd0, 0x00, 0x43, 0xce, 0x22, 0x7d, 0xaf, 0x2a, 0x8c, 0x54, 0x03, 0x08, - 0xf3, 0xf3, 0x36, 0xc8, 0xfd, 0x74, 0x53, 0x06, 0x12, 0xb7, 0x07, 0x95, 0x36, 0x01, 0x1b, 0x45, - 0xfc, 0x9a, 0x60, 0xf9, 0x65, 0x13, 0xff, 0x0d, 0x54, 0x02, 0x2d, 0x76, 0xfe, 0xba, 0x92, 0xff, - 0xb1, 0x4c, 0xff, 0x84, 0x67, 0x00, 0x57, 0x9b, 0x01, 0xc2, 0x4b, 0xff, 0x1e, 0x5e, 0xff, 0xc8, - 0x91, 0x00, 0xc3, 0x50, 0x01, 0xd0, 0x09, 0xff, 0x9d, 0x0c, 0xfe, 0xd3, 0x8c, 0xfe, 0x74, 0xb7, - 0xfd, 0x9c, 0x73, 0xff, 0xc7, 0x87, 0xff, 0xb0, 0x4e, 0xff, 0xef, 0x16, 0x00, 0xb7, 0xe4, 0xfe, - 0x5f, 0x41, 0xff, 0x05, 0xe3, 0x00, 0x01, 0xe7, 0x25, 0xe0, 0x6c, 0x2d, 0x78, 0xd4, 0x01, 0xd7, - 0x40, 0xf2, 0x61, 0x77, 0xfe, 0x5a, 0x8b, 0x07, 0xed, 0x94, 0x07, 0xeb, 0x36, 0x00, 0x2d, 0x86, - 0xfb, 0xaa, 0xbf, 0xf8, 0x48, 0xb0, 0xff, 0xed, 0xf8, 0x02, 0x32, 0xbb, 0xfd, 0x26, 0xf1, 0xfe, - 0x8f, 0xb0, 0xfe, 0x07, 0x4f, 0x00, 0xaa, 0xb2, 0x01, 0x12, 0x5c, 0xfe, 0xbe, 0xb6, 0xfe, 0x06, - 0x92, 0x00, 0x6d, 0x21, 0x01, 0x78, 0xa9, 0xfe, 0x15, 0x42, 0xfe, 0x72, 0xd4, 0xfe, 0x8b, 0x95, - 0xfd, 0x85, 0xe0, 0xff, 0x62, 0x6f, 0xff, 0x30, 0x76, 0xfe, 0x83, 0xff, 0xff, 0x78, 0x58, 0xff, - 0xcc, 0x10, 0xff, 0xb4, 0xea, 0xff, 0xaf, 0xe0, 0x29, 0x6c, 0x7d, 0x30, 0x10, 0xbf, 0xff, 0x67, - 0xc2, 0xf0, 0x84, 0x6a, 0xff, 0xa7, 0xa0, 0x08, 0xa2, 0x68, 0x07, 0xcf, 0xce, 0xfe, 0xf8, 0x8c, - 0xfa, 0x94, 0x56, 0xf8, 0x5e, 0x96, 0x00, 0x39, 0xff, 0x03, 0x27, 0xf3, 0xfc, 0x3d, 0x18, 0xfe, - 0xb4, 0x71, 0xfe, 0x31, 0x54, 0x00, 0x03, 0x99, 0x01, 0x16, 0xec, 0xfd, 0x79, 0x3c, 0xfe, 0x78, - 0x02, 0x00, 0x68, 0x02, 0x01, 0x29, 0x49, 0xfe, 0x19, 0xe4, 0xfd, 0x03, 0x59, 0xff, 0x84, 0xd7, - 0xfd, 0x2b, 0x46, 0x00, 0xce, 0xf9, 0xff, 0xc2, 0x14, 0xfe, 0x73, 0x79, 0xff, 0x25, 0x27, 0xff, - 0x67, 0xde, 0xfe, 0xfe, 0x53, 0xff, 0xe6, 0x5a, 0x2e, 0xf3, 0xd5, 0x33, 0x4c, 0x8f, 0xfd, 0xa1, - 0xc5, 0xef, 0xc1, 0x66, 0x00, 0xda, 0x38, 0x09, 0x1d, 0x41, 0x07, 0x8c, 0x79, 0xfd, 0x27, 0xaf, - 0xf9, 0xa7, 0x18, 0xf8, 0xce, 0x9d, 0x01, 0x02, 0x1d, 0x05, 0x24, 0x57, 0xfc, 0xb2, 0x6c, 0xfd, - 0xc6, 0x3a, 0xfe, 0x4d, 0xa2, 0x00, 0xdb, 0x82, 0x01, 0x1d, 0x61, 0xfd, 0xc3, 0x46, 0xfe, 0x0b, - 0x9a, 0xff, 0x0b, 0x93, 0x00, 0xa9, 0x3b, 0xfe, 0x2d, 0xbb, 0xfd, 0x5e, 0x88, 0xff, 0x43, 0x5e, - 0xfe, 0xa8, 0xac, 0x00, 0x5d, 0x52, 0x00, 0x59, 0x66, 0xfe, 0xfe, 0x5d, 0xff, 0x78, 0xce, 0xfe, - 0x6b, 0x53, 0xfe, 0x0e, 0xc8, 0xfe, 0x30, 0x42, 0x33, 0xcd, 0x05, 0x37, 0x11, 0xea, 0xfa, 0x2f, - 0x21, 0xef, 0x91, 0x01, 0x01, 0x71, 0xd8, 0x08, 0x20, 0xd8, 0x06, 0x09, 0x3e, 0xfc, 0x56, 0xe5, - 0xf8, 0x0c, 0xb6, 0xf7, 0xc9, 0x66, 0x02, 0x8a, 0xd4, 0x05, 0xd1, 0x86, 0xfb, 0x4e, 0xf8, 0xfc, - 0x12, 0xec, 0xfd, 0x5c, 0xa7, 0x00, 0x6a, 0x5e, 0x01, 0xcf, 0xc1, 0xfc, 0x25, 0xf9, 0xfd, 0x71, - 0x1c, 0xff, 0x3e, 0x59, 0x00, 0x59, 0x12, 0xfe, 0x70, 0x85, 0xfd, 0x9f, 0xa8, 0xff, 0x59, 0xa4, - 0xfe, 0x89, 0xb9, 0x00, 0x0a, 0x3e, 0x00, 0x88, 0xd2, 0xfe, 0x8e, 0x47, 0xff, 0xff, 0x5b, 0xfe, - 0x2d, 0xe2, 0xfd, 0x27, 0x06, 0xfe, 0x63, 0x3c, 0x38, 0xc5, 0x3c, 0x3a, 0xc3, 0x16, 0xf8, 0x98, - 0x0a, 0xef, 0x79, 0x93, 0x01, 0x81, 0x92, 0x07, 0x37, 0x7a, 0x06, 0x0f, 0x80, 0xfb, 0xc5, 0x81, - 0xf8, 0x65, 0x65, 0xf7, 0x59, 0xd9, 0x02, 0x37, 0x6c, 0x06, 0xaf, 0xe3, 0xfa, 0xe6, 0xea, 0xfc, - 0xb7, 0xc3, 0xfd, 0x26, 0x89, 0x00, 0x84, 0x57, 0x01, 0x65, 0x54, 0xfc, 0x56, 0xa9, 0xfd, 0x87, - 0xa2, 0xfe, 0x87, 0x6e, 0x00, 0xf2, 0x27, 0xfe, 0x01, 0x84, 0xfd, 0x2d, 0xfa, 0xff, 0x0a, 0xb8, - 0xfe, 0x41, 0xb0, 0x00, 0x75, 0x05, 0x00, 0x07, 0x3f, 0xff, 0xdc, 0x73, 0xff, 0xc1, 0xe5, 0xfd, - 0x02, 0xe5, 0xfd, 0x3f, 0x60, 0xfd, 0x1e, 0xda, 0x3d, 0xdc, 0x9b, 0x3c, 0xdb, 0x0d, 0xf4, 0x92, - 0x66, 0xef, 0x82, 0x0f, 0x02, 0x0d, 0x83, 0x05, 0xa3, 0xc3, 0x05, 0xcf, 0xc9, 0xfa, 0x7e, 0x25, - 0xf8, 0x61, 0xd6, 0xf6, 0x20, 0xff, 0x02, 0x2b, 0x8c, 0x06, 0x81, 0x50, 0xfa, 0xce, 0x2b, 0xfd, - 0x65, 0x69, 0xfd, 0xda, 0x3f, 0x00, 0x58, 0x1d, 0x01, 0xe0, 0xca, 0xfb, 0xe8, 0x58, 0xfd, 0xc6, - 0x37, 0xfe, 0x86, 0x76, 0x00, 0x88, 0xfb, 0xfd, 0x7a, 0xa3, 0xfd, 0xd9, 0x13, 0x00, 0x2a, 0x48, - 0xfe, 0x8a, 0xb9, 0x00, 0x92, 0x8c, 0xff, 0x16, 0x34, 0xff, 0xab, 0xbf, 0xff, 0x11, 0x7b, 0xfd, - 0x68, 0xe4, 0xfd, 0x12, 0xac, 0xfc, 0x0b, 0x40, 0x44, 0x21, 0xff, 0x3d, 0x5f, 0xa4, 0xee, 0x69, - 0x75, 0xf0, 0x97, 0xec, 0x02, 0x6b, 0x69, 0x03, 0x22, 0xea, 0x04, 0x3a, 0xed, 0xf9, 0xcb, 0x1e, - 0xf8, 0x15, 0x17, 0xf6, 0xed, 0x66, 0x03, 0x39, 0xf2, 0x06, 0xea, 0x9d, 0xf9, 0x7b, 0x0b, 0xfe, - 0x4e, 0x4b, 0xfd, 0xe7, 0xea, 0xff, 0xa3, 0xd9, 0x00, 0xa0, 0x59, 0xfb, 0xbd, 0xd8, 0xfd, 0xc9, - 0xb1, 0xfd, 0x01, 0x24, 0x00, 0xe2, 0x7f, 0xfe, 0x5e, 0x7a, 0xfd, 0x5c, 0x91, 0xff, 0x9c, 0x57, - 0xfe, 0x2a, 0xe7, 0x00, 0x78, 0xec, 0xfe, 0x02, 0x64, 0xff, 0xcf, 0x75, 0x00, 0xfc, 0x01, 0xfd, - 0x56, 0x92, 0xfd, 0xbb, 0xd1, 0xfc, 0x9a, 0x03, 0x4b, 0x26, 0x9b, 0x3d, 0xb2, 0x8c, 0xe8, 0x3c, - 0x85, 0xf2, 0x34, 0xe8, 0x03, 0x1e, 0xbc, 0x01, 0x46, 0xb4, 0x03, 0x6b, 0xf2, 0xf8, 0x55, 0x30, - 0xf8, 0x21, 0x4d, 0xf5, 0xc0, 0xeb, 0x04, 0x4f, 0xfe, 0x06, 0xbf, 0xda, 0xf8, 0xb5, 0xe3, 0xff, - 0xf3, 0xf6, 0xfc, 0xa6, 0x7c, 0xff, 0x84, 0xdd, 0x00, 0xff, 0xc6, 0xfb, 0xb1, 0x3c, 0xfe, 0xfa, - 0x8a, 0xfc, 0x4d, 0xad, 0x00, 0xb1, 0x77, 0xfe, 0x4f, 0x8d, 0xfc, 0x14, 0xeb, 0xff, 0x9d, 0x42, - 0xfe, 0xc0, 0xd0, 0x00, 0xf3, 0x38, 0xff, 0x83, 0x04, 0x00, 0x31, 0x9f, 0x00, 0xc9, 0x52, 0xfc, - 0x23, 0xe6, 0xfd, 0x75, 0x70, 0xfd, 0x36, 0xda, 0x4f, 0xd6, 0xa1, 0x3c, 0xe4, 0x35, 0xe3, 0x7d, - 0xa8, 0xf4, 0x93, 0x9b, 0x04, 0x3c, 0xb7, 0xff, 0x2a, 0xfa, 0x02, 0x7d, 0xa6, 0xf7, 0x34, 0xf0, - 0xf7, 0xa5, 0x83, 0xf5, 0xdf, 0x01, 0x06, 0xf4, 0xa9, 0x06, 0x71, 0xdb, 0xf8, 0x0e, 0xac, 0x01, - 0xc2, 0xe4, 0xfb, 0xdd, 0x75, 0xff, 0x71, 0x0a, 0x02, 0x8c, 0x2f, 0xfb, 0xe9, 0x52, 0xfe, 0xc1, - 0x40, 0xfc, 0xda, 0xa6, 0xff, 0xc3, 0x4b, 0xfe, 0xc1, 0x9f, 0xfc, 0x63, 0x43, 0xff, 0x34, 0x4f, - 0xfe, 0x87, 0xf5, 0x01, 0x52, 0x63, 0xff, 0x2d, 0xcd, 0xff, 0x3d, 0xce, 0x00, 0x93, 0x7f, 0xfc, - 0xd0, 0xdf, 0xfd, 0x30, 0x02, 0xfd, 0x3a, 0x53, 0x52, 0xbc, 0xec, 0x39, 0xc4, 0xc4, 0xe0, 0x98, - 0x51, 0xf7, 0x78, 0x93, 0x03, 0xd8, 0xa2, 0xfe, 0x14, 0xfd, 0x02, 0x92, 0x9f, 0xf6, 0xeb, 0x0a, - 0xf8, 0x87, 0xfc, 0xf5, 0x68, 0xfc, 0x06, 0x34, 0x4a, 0x06, 0x8b, 0x4e, 0xf9, 0xe2, 0xe0, 0x02, - 0x8d, 0xa6, 0xfb, 0xb4, 0x29, 0x00, 0x16, 0x08, 0x02, 0xac, 0x52, 0xfb, 0x9e, 0x51, 0xfe, 0x88, - 0xca, 0xfa, 0x99, 0xc4, 0xff, 0xe6, 0x5d, 0xfe, 0x21, 0xfb, 0xfb, 0xcc, 0x9d, 0xff, 0x60, 0x46, - 0xff, 0xfa, 0x6d, 0x02, 0xa5, 0x0e, 0xff, 0xd5, 0x5d, 0x00, 0x70, 0x49, 0x01, 0x16, 0xf4, 0xfb, - 0x32, 0x97, 0xfd, 0x24, 0x14, 0xfd, 0xd4, 0x34, 0x51, 0xb4, 0xe7, 0x36, 0xc3, 0xf3, 0xe1, 0xe0, - 0xf4, 0xf8, 0x80, 0x1a, 0x01, 0xe4, 0x85, 0xfe, 0x86, 0x70, 0x04, 0x1a, 0x60, 0xf6, 0x8b, 0x76, - 0xf7, 0x01, 0x1c, 0xf7, 0xb4, 0xaf, 0x07, 0x34, 0xc3, 0x04, 0xa6, 0x93, 0xfa, 0xf3, 0x0a, 0x05, - 0xc7, 0xab, 0xfa, 0x39, 0x4a, 0x00, 0x1b, 0x1a, 0x03, 0x62, 0x0b, 0xfa, 0xdd, 0xff, 0xfd, 0x5b, - 0x8e, 0xfb, 0xc7, 0xcf, 0xfe, 0x81, 0xab, 0xfe, 0xf7, 0x03, 0xfd, 0x7d, 0x6d, 0xff, 0xc1, 0x71, - 0xff, 0x7e, 0xeb, 0x02, 0xe3, 0x8d, 0xff, 0x09, 0x48, 0x00, 0x9d, 0xea, 0x00, 0xac, 0xff, 0xfb, - 0xb5, 0xaa, 0xfd, 0x24, 0x4d, 0xfd, 0xc6, 0x84, 0x4c, 0x46, 0xaf, 0x33, 0x88, 0x62, 0xe6, 0xe3, - 0x70, 0xf9, 0x8b, 0xc6, 0xfd, 0x93, 0x84, 0xff, 0x80, 0x78, 0x06, 0x27, 0x96, 0xf6, 0x09, 0x27, - 0xf7, 0x9b, 0x31, 0xf8, 0x6f, 0xbf, 0x06, 0xed, 0xe6, 0x03, 0x48, 0xcb, 0xfc, 0x7f, 0x40, 0x05, - 0x90, 0xad, 0xfa, 0x17, 0x34, 0x00, 0xd9, 0x37, 0x02, 0x00, 0x80, 0xfa, 0x67, 0xfc, 0xfd, 0xd2, - 0xe9, 0xfb, 0xee, 0x53, 0xff, 0x17, 0x21, 0xff, 0x23, 0x82, 0xfd, 0x97, 0xd6, 0xfe, 0xf9, 0xa6, - 0xff, 0xff, 0x81, 0x03, 0x79, 0x25, 0xff, 0x1d, 0xc6, 0xff, 0xfa, 0x00, 0x01, 0x30, 0x5b, 0xfc, - 0xd7, 0xe6, 0xfd, 0x24, 0x86, 0xfd, 0xed, 0xa0, 0x44, 0xde, 0x43, 0x31, 0x77, 0xcf, 0xec, 0xd0, - 0xe1, 0xf8, 0xa8, 0x0f, 0xfb, 0x91, 0x45, 0x00, 0x5b, 0x34, 0x08, 0xff, 0x21, 0xf8, 0x77, 0xf7, - 0xf6, 0xb6, 0x9b, 0xf8, 0x57, 0xe5, 0x05, 0xb7, 0xf5, 0x02, 0x95, 0xd9, 0xfd, 0x42, 0xf6, 0x05, - 0xd3, 0x46, 0xfa, 0x18, 0x10, 0xff, 0xc4, 0xd0, 0x02, 0x82, 0xa3, 0xfa, 0xd4, 0x25, 0xfe, 0x9c, - 0x9d, 0xfd, 0x4f, 0x46, 0xff, 0xaa, 0x64, 0xff, 0x17, 0xd2, 0xfd, 0xe8, 0x89, 0xfe, 0x18, 0x8a, - 0xff, 0x99, 0xc3, 0x02, 0x33, 0x22, 0xff, 0x0b, 0x70, 0xff, 0x53, 0x01, 0x01, 0x0d, 0x22, 0xfd, - 0xbb, 0xee, 0xfd, 0xd6, 0xf4, 0xfd, 0x0f, 0xa2, 0x36, 0xb3, 0xb8, 0x2d, 0xbd, 0xc9, 0xf2, 0x02, - 0xbb, 0xf8, 0xae, 0x4f, 0x03, 0xdf, 0xa4, 0x02, 0x3a, 0x58, 0x03, 0x53, 0x70, 0xfa, 0x9a, 0xa9, - 0xf9, 0xde, 0x12, 0xfa, 0x74, 0xb8, 0x04, 0xfd, 0x11, 0x04, 0xb5, 0x94, 0xfd, 0xac, 0x72, 0x02, - 0x14, 0xa7, 0xfd, 0x26, 0x9e, 0x00, 0x54, 0xa4, 0x01, 0xc9, 0x9f, 0xfc, 0x7a, 0x64, 0xfe, 0x2e, - 0x00, 0xfd, 0x78, 0x2a, 0xff, 0x2c, 0x56, 0xff, 0x64, 0x64, 0xfe, 0xa4, 0x5d, 0xff, 0x30, 0x8c, - 0xff, 0x7a, 0x43, 0x02, 0x62, 0xcb, 0xff, 0x63, 0x9e, 0xff, 0x03, 0x9d, 0x00, 0xc5, 0x89, 0xfd, - 0x1a, 0xef, 0xfd, 0xab, 0xf7, 0xfd, 0x75, 0xde, 0x31, 0xe8, 0x31, 0x2d, 0x28, 0x33, 0xf6, 0x08, - 0xf8, 0xf5, 0x5a, 0xa0, 0x00, 0x98, 0x24, 0x04, 0xae, 0xbe, 0x05, 0xf2, 0x2a, 0xfc, 0x85, 0xf3, - 0xf9, 0xe2, 0xfe, 0xf8, 0x43, 0x5a, 0x02, 0x5e, 0xeb, 0x03, 0x95, 0xa1, 0xfe, 0xb9, 0xc1, 0x02, - 0x7e, 0x64, 0xfe, 0x36, 0x6b, 0x00, 0x1a, 0x6f, 0x02, 0xff, 0xa8, 0xfd, 0x2c, 0x98, 0xfe, 0xf5, - 0x9b, 0xfe, 0xdb, 0xe9, 0xff, 0x25, 0x3a, 0xff, 0x61, 0xab, 0xfe, 0x12, 0xdd, 0xfe, 0xac, 0xb7, - 0xfe, 0xd0, 0x1c, 0x02, 0xf9, 0xe7, 0xff, 0x68, 0xfe, 0xfe, 0xc8, 0xc2, 0x00, 0xc3, 0x76, 0xfe, - 0xc3, 0x30, 0xfe, 0x98, 0x5d, 0xfe, 0xef, 0xe5, 0x2d, 0xeb, 0xe8, 0x2c, 0xc3, 0x5c, 0xf9, 0x9f, - 0x25, 0xf4, 0x9f, 0x6c, 0xfe, 0x68, 0x30, 0x04, 0xd2, 0xbb, 0x06, 0x2a, 0x12, 0xfe, 0x68, 0xfc, - 0xfa, 0x55, 0xca, 0xf8, 0xcc, 0xd2, 0x00, 0xc8, 0x63, 0x03, 0x07, 0x19, 0xff, 0xfe, 0xd5, 0x02, - 0x88, 0x16, 0xff, 0x77, 0x73, 0x00, 0xac, 0xa4, 0x02, 0xaa, 0xae, 0xfe, 0xde, 0xdd, 0xfe, 0x86, - 0x1c, 0xff, 0xe0, 0xaa, 0x00, 0x84, 0x3e, 0xff, 0xa5, 0xa3, 0xfe, 0x7d, 0x08, 0xff, 0xcb, 0xda, - 0xfd, 0xab, 0x2e, 0x01, 0xc5, 0x4a, 0x00, 0x5f, 0xc0, 0xfe, 0xac, 0x33, 0x00, 0xed, 0x26, 0xff, - 0x65, 0xad, 0xfe, 0x17, 0x59, 0xfe, 0x1b, 0x87, 0x2b, 0xe9, 0x0d, 0x2d, 0x17, 0x2d, 0xfb, 0x28, - 0x2e, 0xf3, 0xc3, 0xc7, 0xfd, 0xf5, 0x50, 0x04, 0xa8, 0x0d, 0x07, 0xae, 0xcb, 0xfe, 0x78, 0x6c, - 0xfb, 0xc3, 0xf4, 0xf8, 0x95, 0x29, 0x00, 0xe5, 0xff, 0x02, 0xf3, 0xe7, 0xfe, 0xe4, 0xa0, 0x02, - 0x68, 0x62, 0xff, 0x3f, 0x88, 0x00, 0x12, 0xf9, 0x02, 0x2b, 0x01, 0xff, 0xc5, 0x14, 0xff, 0x91, - 0x7f, 0xff, 0xe3, 0xa7, 0x00, 0x5b, 0xef, 0xfe, 0xba, 0x58, 0xfe, 0xc0, 0x4c, 0xff, 0xfe, 0x7a, - 0xfd, 0x1c, 0x0a, 0x00, 0x9c, 0x79, 0x00, 0x32, 0x12, 0xff, 0xea, 0xd1, 0xff, 0x48, 0x21, 0xff, - 0x16, 0xf7, 0xfe, 0x5e, 0x9f, 0xfe, 0xf0, 0x50, 0x2b, 0xcb, 0x6a, 0x2d, 0x20, 0x1f, 0xfb, 0x55, - 0xbb, 0xf2, 0xff, 0x07, 0xff, 0x1e, 0x74, 0x05, 0x5d, 0x15, 0x07, 0x74, 0x80, 0xfe, 0xab, 0xd3, - 0xfa, 0x25, 0xfe, 0xf8, 0xf2, 0x44, 0x00, 0x95, 0x21, 0x03, 0xa0, 0x72, 0xfe, 0x27, 0x83, 0x01, - 0xb3, 0xa5, 0xff, 0x54, 0xa3, 0x00, 0xb6, 0xa1, 0x02, 0x38, 0x6c, 0xff, 0x79, 0x4c, 0xff, 0xdb, - 0xcc, 0xff, 0xd5, 0xce, 0x00, 0xb3, 0x7e, 0xfe, 0xff, 0xa7, 0xfd, 0x47, 0xe8, 0xfe, 0xa2, 0xe0, - 0xfd, 0x65, 0xf6, 0xff, 0xe9, 0xfa, 0xff, 0xf0, 0x5d, 0xff, 0x91, 0xff, 0xff, 0xfc, 0xf5, 0xfe, - 0x5a, 0x2f, 0xff, 0x73, 0x85, 0xfe, 0xe1, 0x5e, 0x2d, 0x3a, 0x74, 0x2d, 0xc9, 0x48, 0xf9, 0xc0, - 0x71, 0xf3, 0xed, 0x76, 0x01, 0x5b, 0xeb, 0x06, 0xdd, 0x79, 0x06, 0x46, 0x32, 0xfd, 0x52, 0x2a, - 0xfa, 0x5f, 0x17, 0xf9, 0x28, 0x06, 0x01, 0xa9, 0x54, 0x03, 0xd0, 0xe8, 0xfd, 0x95, 0x7c, 0x00, - 0x80, 0xd2, 0xfe, 0x93, 0x03, 0x01, 0x8b, 0x66, 0x02, 0x3a, 0x5f, 0xfe, 0x58, 0xbb, 0xff, 0xc5, - 0x8f, 0x00, 0x5b, 0x5d, 0x00, 0x1a, 0x35, 0xfe, 0x80, 0x96, 0xfd, 0x6b, 0x48, 0xfe, 0x6d, 0xb5, - 0xfd, 0x38, 0x7e, 0x00, 0xa1, 0x4b, 0x00, 0x21, 0x29, 0xff, 0xa8, 0xbf, 0xff, 0xeb, 0x3d, 0xff, - 0x64, 0x28, 0xff, 0x71, 0x14, 0xfe, 0x37, 0x51, 0x30, 0x1f, 0x66, 0x2e, 0x31, 0x69, 0xf7, 0x21, - 0xb8, 0xf4, 0x88, 0xf5, 0x03, 0xa8, 0xdc, 0x06, 0xe9, 0xe8, 0x04, 0xcd, 0xd7, 0xfb, 0xa6, 0xcf, - 0xf9, 0x7c, 0xda, 0xf9, 0xf1, 0x73, 0x02, 0xcb, 0xdb, 0x03, 0x85, 0xeb, 0xfc, 0xfa, 0x4e, 0xff, - 0xeb, 0xb6, 0xfe, 0x9c, 0xee, 0x00, 0xe8, 0x74, 0x01, 0x78, 0xc6, 0xfd, 0x2a, 0x38, 0xff, 0x13, - 0x27, 0x00, 0x91, 0x55, 0x00, 0x5e, 0xe9, 0xfd, 0x33, 0xbd, 0xfd, 0x98, 0x93, 0xfe, 0x14, 0xec, - 0xfd, 0xf5, 0x7e, 0x00, 0xda, 0xee, 0xff, 0x34, 0xab, 0xff, 0x3e, 0xed, 0xff, 0x0f, 0x99, 0xfe, - 0x22, 0xe2, 0xfe, 0xfe, 0xd0, 0xfd, 0x8d, 0x81, 0x34, 0xc7, 0x4e, 0x30, 0x39, 0x55, 0xf5, 0xc5, - 0xd7, 0xf5, 0x3c, 0xd2, 0x04, 0xd2, 0xbf, 0x04, 0xcb, 0x11, 0x03, 0x20, 0x40, 0xfb, 0x85, 0x37, - 0xfa, 0x38, 0xf9, 0xfa, 0x11, 0x6f, 0x04, 0x69, 0x24, 0x04, 0x7b, 0x88, 0xfb, 0x3d, 0xcf, 0xfe, - 0xdf, 0xa7, 0xfe, 0x2b, 0x8c, 0x00, 0x71, 0x4b, 0x00, 0x5b, 0x29, 0xfd, 0xf9, 0x86, 0xfe, 0xd6, - 0x98, 0xfe, 0x3a, 0x45, 0x00, 0x87, 0x1b, 0xfe, 0xfe, 0xa8, 0xfd, 0x33, 0x66, 0xff, 0x2b, 0x70, - 0xfe, 0xb3, 0x4a, 0x00, 0x33, 0x94, 0xff, 0xcf, 0x02, 0x00, 0xcd, 0x2b, 0x00, 0x0f, 0xb9, 0xfd, - 0xe4, 0x6f, 0xfe, 0x80, 0xdc, 0xfd, 0x14, 0x8e, 0x39, 0x11, 0x44, 0x33, 0xc4, 0x51, 0xf2, 0xff, - 0xc3, 0xf5, 0x72, 0x19, 0x04, 0x46, 0x5c, 0x01, 0x8c, 0x0e, 0x02, 0xea, 0x85, 0xfb, 0x9f, 0xe4, - 0xfa, 0xaa, 0xcd, 0xfb, 0x9c, 0x27, 0x06, 0x02, 0x3e, 0x04, 0xfa, 0xfd, 0xf9, 0xf9, 0x87, 0xff, - 0x39, 0x68, 0xfe, 0x9d, 0x20, 0xff, 0xc7, 0x2c, 0x00, 0xe8, 0x7b, 0xfc, 0xb0, 0xf4, 0xfc, 0x59, - 0xa0, 0xfd, 0x7c, 0x7d, 0x00, 0xc1, 0x16, 0xfe, 0x17, 0x9a, 0xfd, 0xdb, 0x14, 0x00, 0xec, 0x86, - 0xfe, 0x88, 0x2a, 0x00, 0xda, 0xe1, 0xff, 0x4e, 0x23, 0x00, 0xf1, 0xbb, 0xff, 0x99, 0x21, 0xfd, - 0xd7, 0x7c, 0xfe, 0x85, 0x7e, 0xfd, 0x38, 0x69, 0x3e, 0xa8, 0x0a, 0x34, 0xdf, 0xfa, 0xee, 0xa6, - 0xbb, 0xf6, 0x60, 0x7c, 0x03, 0x07, 0xd7, 0xfe, 0xcf, 0x9c, 0x01, 0x8a, 0xd9, 0xfb, 0x91, 0x75, - 0xfb, 0x8f, 0x65, 0xfc, 0x61, 0x88, 0x07, 0x90, 0x0b, 0x04, 0xdd, 0x98, 0xf9, 0xa9, 0xe1, 0x00, - 0x1a, 0xc3, 0xfd, 0xc3, 0x74, 0xfe, 0x91, 0x92, 0x00, 0x70, 0xbe, 0xfb, 0xdf, 0x2e, 0xfc, 0x1e, - 0x0d, 0xfd, 0x5d, 0x73, 0x00, 0x3a, 0x8c, 0xfe, 0xdd, 0x95, 0xfd, 0x6c, 0x49, 0x00, 0x00, 0x07, - 0xff, 0xb1, 0x77, 0x00, 0xb7, 0x4b, 0x00, 0x71, 0x3c, 0x00, 0x17, 0x72, 0xff, 0x05, 0x47, 0xfd, - 0xde, 0x52, 0xfe, 0x66, 0xd8, 0xfc, 0x45, 0x28, 0x3f, 0x10, 0x37, 0x33, 0xd7, 0xbd, 0xed, 0x79, - 0xf9, 0xf7, 0x9c, 0xc8, 0x03, 0x59, 0x24, 0xfe, 0x41, 0x21, 0x01, 0xc1, 0x1f, 0xfb, 0x5c, 0x4b, - 0xfb, 0x0f, 0x1e, 0xfc, 0x49, 0xbf, 0x07, 0x60, 0x6d, 0x04, 0xe6, 0xd0, 0xf9, 0x34, 0x80, 0x01, - 0xc3, 0x18, 0xfe, 0x61, 0x68, 0xfe, 0x8b, 0x5c, 0x00, 0xe8, 0x65, 0xfc, 0x8a, 0xfe, 0xfb, 0x9c, - 0xb4, 0xfb, 0x2f, 0xb7, 0x00, 0xc6, 0x8e, 0xfe, 0xe3, 0x13, 0xfd, 0xff, 0xe7, 0x00, 0x4a, 0x99, - 0xff, 0x4d, 0xac, 0x00, 0xfb, 0x40, 0x00, 0xea, 0x75, 0x00, 0xed, 0xbf, 0xff, 0xef, 0xc3, 0xfc, - 0x62, 0xf6, 0xfd, 0x0a, 0x10, 0xfd, 0x9f, 0x65, 0x3c, 0xa5, 0x28, 0x30, 0x52, 0x28, 0xef, 0xa2, - 0x45, 0xf9, 0x1c, 0x1e, 0x04, 0x93, 0xed, 0xff, 0x7f, 0x5d, 0x01, 0x41, 0x58, 0xfa, 0x65, 0x79, - 0xfa, 0x12, 0x30, 0xfb, 0x46, 0x2b, 0x07, 0x64, 0x3c, 0x04, 0x1f, 0x38, 0xfb, 0x89, 0x69, 0x02, - 0x01, 0xbb, 0xfd, 0x16, 0x69, 0xff, 0x7e, 0x39, 0x01, 0x0a, 0x42, 0xfc, 0x45, 0xf4, 0xfc, 0xc9, - 0xf5, 0xfb, 0xce, 0x78, 0xff, 0x5a, 0xed, 0xfe, 0x47, 0xcb, 0xfd, 0xa0, 0x6d, 0x00, 0x95, 0xe9, - 0xff, 0x93, 0x35, 0x01, 0xf1, 0x39, 0x00, 0x70, 0x69, 0x00, 0x71, 0xcf, 0xff, 0xff, 0xee, 0xfc, - 0x9a, 0xdf, 0xfd, 0xa0, 0x8a, 0xfd, 0xb0, 0x52, 0x2e, 0x93, 0xd3, 0x2c, 0x54, 0xc5, 0xf8, 0x09, - 0x08, 0xf8, 0xd7, 0xba, 0x05, 0xf8, 0xec, 0x02, 0x9b, 0x50, 0x01, 0x84, 0xd1, 0xfc, 0xf4, 0x58, - 0xfb, 0x8b, 0x69, 0xfd, 0x73, 0xbe, 0x05, 0x61, 0xf0, 0x03, 0x63, 0xe7, 0xfc, 0xa2, 0xd9, 0xff, - 0xfd, 0x5f, 0xff, 0xce, 0x20, 0x00, 0xb2, 0x7f, 0x00, 0x74, 0x5e, 0xfe, 0x2f, 0x97, 0xfd, 0xc7, - 0x12, 0xfd, 0x22, 0xfc, 0xff, 0xdc, 0x9f, 0xfe, 0x28, 0x97, 0xfd, 0xa0, 0x13, 0x00, 0xf9, 0x02, - 0x00, 0x2d, 0x21, 0x01, 0x29, 0x42, 0x01, 0xbc, 0xfc, 0x00, 0xa8, 0x99, 0xff, 0x87, 0xca, 0xfc, - 0x67, 0xd5, 0xfc, 0x9f, 0x47, 0xfd, 0x14, 0x12, 0x13, 0x14, 0x16, 0x14, 0x13, 0x13, 0x12, 0x11, - 0x11, 0x11, 0x11, 0x10, 0x12, 0x13, 0x13, 0x14, 0x15, 0x18, 0x16, 0x15, 0x14, 0x13, 0x12, 0x12, - 0x11, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x10, 0x0e, 0x10, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x15, 0x16, 0x1a, 0x17, 0x16, 0x15, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, - 0x0d, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0d, - 0x0f, 0x10, 0x11, 0x12, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, - 0x14, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0b, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x11, 0x13, 0x14, 0x15, 0x16, 0x16, 0x17, 0x18, 0x1d, 0x1a, 0x19, 0x18, 0x17, 0x16, - 0x16, 0x15, 0x14, 0x13, 0x11, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, - 0x07, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x07, 0x07, 0x08, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x20, 0x1c, 0x1b, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x11, - 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x05, 0x04, 0x04, 0x04, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, - 0x0a, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, - 0x23, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x13, 0x13, - 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x05, 0x04, 0x03, - 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, - 0x04, 0x04, 0x05, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, - 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1c, 0x1b, 0x1a, 0x1a, 0x19, - 0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x13, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, - 0x09, 0x08, 0x07, 0x05, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x07, 0x08, 0x09, 0x09, - 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1c, - 0x1d, 0x1e, 0x21, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x11, - 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x04, 0x03, 0x03, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x03, 0x04, 0x04, 0x05, 0x07, 0x08, 0x08, 0x09, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1e, 0x20, 0x21, 0x22, 0x1d, 0x1c, 0x1b, 0x1a, - 0x19, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x13, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, - 0x09, 0x08, 0x07, 0x07, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x07, 0x08, 0x09, 0x0a, - 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, - 0x1d, 0x1e, 0x20, 0x20, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, - 0x13, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x05, 0x05, - 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, - 0x05, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, - 0x11, 0x13, 0x15, 0x16, 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, - 0x13, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x05, 0x05, 0x04, 0x03, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, - 0x05, 0x05, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x18, - 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x15, 0x15, 0x13, 0x11, 0x10, 0x0f, - 0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x07, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x11, 0x13, 0x13, 0x13, 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, - 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x07, 0x04, 0x05, 0x07, 0x08, 0x09, 0x09, 0x0a, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x0c, 0x0d, 0x0e, - 0x0f, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x09, 0x09, - 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x08, - 0x08, 0x05, -}; diff --git a/build/hrtf_default.h b/build/hrtf_default.h new file mode 100644 index 0000000..06081f8 --- /dev/null +++ b/build/hrtf_default.h @@ -0,0 +1,5025 @@ +static const unsigned char hrtf_default[] = { + 0x4d, 0x69, 0x6e, 0x50, 0x48, 0x52, 0x30, 0x32, 0x44, 0xac, 0x00, 0x00, 0x01, 0x00, 0x20, 0x01, + 0x78, 0x05, 0x13, 0x01, 0x0c, 0x18, 0x24, 0x2d, 0x38, 0x3c, 0x48, 0x48, 0x48, 0x48, 0x48, 0x3c, + 0x38, 0x2d, 0x24, 0x18, 0x0c, 0x01, 0xa3, 0x5d, 0x19, 0x97, 0xe7, 0x20, 0xbc, 0x3f, 0x0b, 0xff, + 0xcb, 0x08, 0xb7, 0xa4, 0x01, 0x86, 0x64, 0xff, 0x5e, 0x88, 0x02, 0xd3, 0xb5, 0xfb, 0x56, 0x51, + 0xf5, 0x75, 0xac, 0xfb, 0x2b, 0x52, 0x03, 0x59, 0x8d, 0xfe, 0x0f, 0x7e, 0xfc, 0xbe, 0x36, 0xfa, + 0xea, 0xfb, 0xfa, 0xf7, 0xcb, 0xfe, 0x75, 0x4f, 0xff, 0xd0, 0xbe, 0xfe, 0xde, 0x5a, 0xff, 0xd7, + 0x47, 0xff, 0x5f, 0x55, 0xfe, 0x4f, 0x20, 0xff, 0xc6, 0xf9, 0xfd, 0xae, 0x8b, 0xfe, 0x09, 0x42, + 0xfe, 0x89, 0x33, 0xfd, 0xc0, 0xe9, 0xfd, 0x75, 0xa4, 0xfe, 0x82, 0x1e, 0xff, 0x1e, 0xa0, 0xff, + 0x86, 0x03, 0x00, 0x76, 0x68, 0xff, 0x21, 0xe4, 0x1a, 0xd6, 0xe6, 0x1f, 0xf0, 0x6d, 0x08, 0xd4, + 0x60, 0x09, 0xfc, 0xab, 0x01, 0x90, 0xce, 0xfe, 0x2d, 0xa0, 0x02, 0x16, 0x00, 0xfc, 0xa7, 0xbc, + 0xf5, 0xdd, 0x49, 0xfb, 0xf6, 0x31, 0x03, 0xe8, 0x05, 0xff, 0x56, 0xcc, 0xfc, 0x13, 0x20, 0xfb, + 0x4b, 0x98, 0xfb, 0xeb, 0xc5, 0xfd, 0xdb, 0x05, 0xff, 0x0c, 0x22, 0xff, 0xbb, 0x2a, 0xff, 0x38, + 0x25, 0xff, 0x73, 0x2a, 0xfe, 0x07, 0xf0, 0xfe, 0xe9, 0x04, 0xfe, 0x0c, 0x97, 0xfe, 0xc8, 0x68, + 0xfe, 0x1a, 0x87, 0xfd, 0xa3, 0x0a, 0xfe, 0xcc, 0xff, 0xfe, 0x16, 0x7c, 0xff, 0x2a, 0xbc, 0xff, + 0xa7, 0x08, 0x00, 0x86, 0x57, 0xff, 0xbb, 0x47, 0x19, 0x2c, 0x52, 0x1e, 0x08, 0x38, 0x08, 0x5b, + 0x44, 0x08, 0x2a, 0x93, 0x01, 0x19, 0xa7, 0xff, 0x44, 0xa4, 0x02, 0xbb, 0xad, 0xfb, 0xac, 0x21, + 0xf6, 0xd0, 0x62, 0xfc, 0x7b, 0x1f, 0x03, 0x7a, 0x49, 0xfe, 0xa8, 0xe6, 0xfc, 0x65, 0x46, 0xfb, + 0x27, 0x2f, 0xfc, 0x05, 0xeb, 0xfe, 0x46, 0x21, 0xff, 0xdb, 0x23, 0xff, 0xaf, 0xa5, 0xff, 0xd7, + 0x42, 0xff, 0xd9, 0x59, 0xfe, 0x65, 0x43, 0xff, 0xde, 0x20, 0xfe, 0x9f, 0xa5, 0xfe, 0x94, 0x3f, + 0xfe, 0x3d, 0x69, 0xfd, 0x4d, 0x38, 0xfe, 0x0f, 0xd3, 0xfe, 0xc8, 0x44, 0xff, 0x21, 0xbb, 0xff, + 0x4b, 0x14, 0x00, 0xe4, 0x73, 0xff, 0xdf, 0x1d, 0x18, 0xd8, 0xc1, 0x1c, 0xc6, 0x97, 0x07, 0x28, + 0xa9, 0x07, 0x38, 0x44, 0x01, 0xf0, 0xbb, 0xff, 0xaa, 0xba, 0x02, 0xb2, 0xdb, 0xfb, 0xe7, 0x8b, + 0xf6, 0xe0, 0x27, 0xfd, 0xe0, 0xa2, 0x03, 0xc8, 0x75, 0xfe, 0x52, 0x42, 0xfd, 0xa4, 0x8b, 0xfb, + 0x42, 0x51, 0xfc, 0x59, 0x72, 0xff, 0x62, 0x6f, 0xff, 0x52, 0xe4, 0xfe, 0xc4, 0x86, 0xff, 0xbe, + 0x61, 0xff, 0xc2, 0x89, 0xfe, 0xe2, 0x6b, 0xff, 0x80, 0x41, 0xfe, 0x37, 0xdc, 0xfe, 0x08, 0x7e, + 0xfe, 0xf5, 0x88, 0xfd, 0x3c, 0x47, 0xfe, 0x20, 0xdf, 0xfe, 0x1e, 0x49, 0xff, 0x78, 0xbd, 0xff, + 0x4d, 0x0f, 0x00, 0x7a, 0x72, 0xff, 0xcd, 0xd8, 0x17, 0xe2, 0x74, 0x1c, 0x94, 0x7d, 0x07, 0xf3, + 0x8d, 0x07, 0x7e, 0x49, 0x01, 0xc4, 0xf0, 0xff, 0xc9, 0x07, 0x03, 0x32, 0x30, 0xfc, 0xf5, 0xdb, + 0xf6, 0x3d, 0x71, 0xfd, 0x4c, 0xd4, 0x03, 0x27, 0x88, 0xfe, 0x01, 0x22, 0xfd, 0x01, 0x49, 0xfb, + 0xed, 0x39, 0xfc, 0xeb, 0x90, 0xff, 0x30, 0x81, 0xff, 0x03, 0xde, 0xfe, 0x61, 0x86, 0xff, 0x06, + 0x6a, 0xff, 0xf3, 0x8f, 0xfe, 0x68, 0x77, 0xff, 0xb2, 0x57, 0xfe, 0x8a, 0xfe, 0xfe, 0xc4, 0xaa, + 0xfe, 0xa3, 0xa7, 0xfd, 0x96, 0x56, 0xfe, 0xd3, 0xde, 0xfe, 0x60, 0x2f, 0xff, 0x8a, 0x9d, 0xff, + 0x8d, 0xf3, 0xff, 0xcf, 0x5c, 0xff, 0x02, 0x3e, 0x18, 0xf4, 0x05, 0x1d, 0x70, 0x92, 0x07, 0xeb, + 0x55, 0x07, 0x3e, 0xee, 0x00, 0xd3, 0xa1, 0xff, 0xa6, 0xcc, 0x02, 0xed, 0xde, 0xfb, 0xd2, 0x53, + 0xf6, 0xed, 0xea, 0xfc, 0x84, 0xd5, 0x03, 0x50, 0xc0, 0xfe, 0x4e, 0x29, 0xfd, 0x81, 0x2a, 0xfb, + 0xa2, 0x15, 0xfc, 0x7d, 0x91, 0xff, 0x44, 0xb2, 0xff, 0xa6, 0x13, 0xff, 0x5e, 0xa9, 0xff, 0x12, + 0x90, 0xff, 0xfa, 0xab, 0xfe, 0x31, 0x7d, 0xff, 0xd6, 0x4f, 0xfe, 0x50, 0xe7, 0xfe, 0x93, 0x8f, + 0xfe, 0x94, 0x96, 0xfd, 0x23, 0x5a, 0xfe, 0xec, 0xff, 0xfe, 0xab, 0x6c, 0xff, 0x19, 0xe4, 0xff, + 0x5f, 0x21, 0x00, 0x05, 0x64, 0xff, 0x21, 0xb8, 0x19, 0x8b, 0xa7, 0x1e, 0xee, 0xbc, 0x07, 0x58, + 0xb2, 0x07, 0x4e, 0x00, 0x01, 0x51, 0x9b, 0xff, 0x30, 0xc2, 0x02, 0x17, 0x32, 0xfb, 0x8d, 0x41, + 0xf5, 0xae, 0x39, 0xfc, 0x59, 0x0b, 0x04, 0x95, 0xa8, 0xfe, 0x4c, 0x93, 0xfc, 0x31, 0x8c, 0xfa, + 0x4f, 0xab, 0xfb, 0x8d, 0x5d, 0xff, 0xd7, 0x96, 0xff, 0xcf, 0xf0, 0xfe, 0x53, 0x9b, 0xff, 0x7c, + 0x8d, 0xff, 0x51, 0x82, 0xfe, 0x91, 0x6f, 0xff, 0x5b, 0x4c, 0xfe, 0x51, 0xea, 0xfe, 0xd1, 0x8d, + 0xfe, 0xc9, 0x8e, 0xfd, 0x60, 0x5a, 0xfe, 0x57, 0x0c, 0xff, 0xc7, 0x6a, 0xff, 0xc4, 0xd4, 0xff, + 0xc1, 0x25, 0x00, 0xa6, 0x7d, 0xff, 0xe0, 0xb3, 0x1a, 0x77, 0x75, 0x20, 0xcc, 0x8d, 0x08, 0xc9, + 0x0a, 0x08, 0x74, 0x16, 0x01, 0xa6, 0x20, 0xff, 0xe9, 0x96, 0x02, 0x3d, 0xbd, 0xfa, 0x39, 0xf1, + 0xf4, 0x74, 0x36, 0xfc, 0x69, 0x54, 0x03, 0xca, 0x2e, 0xfe, 0x8a, 0xbd, 0xfc, 0x9a, 0x96, 0xfa, + 0x9c, 0x8d, 0xfb, 0x91, 0x1b, 0xff, 0x3a, 0x59, 0xff, 0xc3, 0x27, 0xff, 0x21, 0xab, 0xff, 0x7a, + 0x56, 0xff, 0xfa, 0x59, 0xfe, 0x7f, 0x47, 0xff, 0x1b, 0x23, 0xfe, 0xe7, 0xc2, 0xfe, 0x80, 0x5a, + 0xfe, 0x35, 0x6b, 0xfd, 0x1e, 0x3f, 0xfe, 0x27, 0xdc, 0xfe, 0x34, 0x59, 0xff, 0x74, 0xca, 0xff, + 0xa4, 0x22, 0x00, 0xee, 0x76, 0xff, 0x82, 0xe7, 0x1b, 0x1a, 0xfe, 0x20, 0xcd, 0x4c, 0x08, 0x4c, + 0xff, 0x08, 0x29, 0xb7, 0x01, 0x58, 0x0b, 0xff, 0x22, 0x01, 0x02, 0x11, 0xdc, 0xf9, 0x05, 0x33, + 0xf5, 0xb0, 0xde, 0xfd, 0x6d, 0xff, 0x02, 0xff, 0x16, 0xfc, 0x8f, 0x15, 0xfc, 0x1c, 0x0f, 0xfb, + 0xb8, 0x99, 0xfc, 0x04, 0xb3, 0xff, 0xa0, 0xd8, 0xfe, 0x5c, 0xbd, 0xfe, 0x5f, 0xcd, 0xff, 0xc4, + 0x49, 0xff, 0x26, 0x5e, 0xfe, 0xa1, 0x61, 0xff, 0xa4, 0xf7, 0xfd, 0x65, 0xa3, 0xfe, 0x43, 0x0d, + 0xfe, 0x54, 0x1f, 0xfd, 0x8d, 0x2d, 0xfe, 0x27, 0xab, 0xfe, 0x31, 0x0a, 0xff, 0xdb, 0xa8, 0xff, + 0xcb, 0x0d, 0x00, 0x70, 0x4f, 0xff, 0x07, 0x93, 0x1e, 0xe4, 0x0d, 0x23, 0x7a, 0x5d, 0x06, 0x69, + 0x54, 0x07, 0x70, 0x36, 0x00, 0x9d, 0x25, 0xff, 0x40, 0xc4, 0x03, 0x01, 0x21, 0xfa, 0x60, 0x67, + 0xf4, 0xb7, 0x8e, 0xfe, 0x1b, 0x2e, 0x05, 0xc5, 0x2a, 0xfc, 0x2f, 0xb3, 0xfa, 0x68, 0xe2, 0xf9, + 0xb4, 0x73, 0xfc, 0x21, 0x41, 0x00, 0x4f, 0xa3, 0xfe, 0x67, 0x04, 0xfe, 0x67, 0xa6, 0xff, 0x68, + 0x52, 0xff, 0x53, 0xfa, 0xfd, 0xb4, 0x60, 0xff, 0xb9, 0xe8, 0xfd, 0x44, 0xb3, 0xfe, 0xe4, 0x09, + 0xfe, 0x64, 0xc1, 0xfc, 0x60, 0x0e, 0xfe, 0x6c, 0xcc, 0xfe, 0xf9, 0x17, 0xff, 0xf1, 0xa3, 0xff, + 0x58, 0x12, 0x00, 0x75, 0x3f, 0xff, 0xc3, 0x6c, 0x1f, 0xc8, 0x0c, 0x24, 0x46, 0xee, 0x06, 0x31, + 0xe2, 0x06, 0xa6, 0x0f, 0xff, 0x5c, 0x17, 0xff, 0xed, 0x1c, 0x04, 0xd4, 0xbf, 0xfa, 0x06, 0x57, + 0xf3, 0x97, 0x53, 0xfd, 0xc3, 0x67, 0x06, 0x6b, 0x15, 0xfe, 0xcc, 0xd2, 0xfa, 0x49, 0xed, 0xf7, + 0x8e, 0x3d, 0xfb, 0x4b, 0xc0, 0x00, 0xec, 0xbf, 0xff, 0x70, 0xd3, 0xfd, 0xd1, 0x0f, 0xff, 0xd7, + 0x31, 0xff, 0xe1, 0xcf, 0xfd, 0x30, 0x34, 0xff, 0x04, 0xa8, 0xfd, 0x6c, 0xb5, 0xfe, 0x53, 0x29, + 0xfe, 0x0b, 0xe6, 0xfc, 0xd6, 0xfa, 0xfd, 0x80, 0xe2, 0xfe, 0xd8, 0x37, 0xff, 0x20, 0x9e, 0xff, + 0x46, 0xf9, 0xff, 0x57, 0x1a, 0xff, 0x33, 0x58, 0x1e, 0xfe, 0x8c, 0x23, 0x88, 0x16, 0x09, 0xfd, + 0x0d, 0x08, 0x9c, 0x8c, 0xff, 0x4b, 0xe8, 0xfe, 0xec, 0x08, 0x03, 0xfc, 0x06, 0xfb, 0xdc, 0xa8, + 0xf2, 0xf1, 0x6a, 0xfb, 0xe9, 0x53, 0x05, 0xdc, 0x21, 0xff, 0x4a, 0x9c, 0xfd, 0xcc, 0x55, 0xf8, + 0x13, 0x1f, 0xf9, 0xfe, 0x0d, 0x00, 0x61, 0x61, 0x00, 0x18, 0xce, 0xfe, 0x47, 0x3a, 0xff, 0x31, + 0x0f, 0xff, 0x0e, 0x1f, 0xfe, 0xde, 0x36, 0xff, 0x93, 0xa0, 0xfd, 0x5a, 0xd2, 0xfe, 0x0a, 0x27, + 0xfe, 0xdd, 0x9b, 0xfc, 0x3d, 0xe0, 0xfd, 0x74, 0x93, 0xfe, 0xad, 0x3b, 0xff, 0xe8, 0xcc, 0xff, + 0x72, 0x25, 0x00, 0x25, 0x68, 0xff, 0xa4, 0xfd, 0x1c, 0xd5, 0x6b, 0x22, 0xc7, 0x9e, 0x08, 0xf1, + 0xc7, 0x08, 0xde, 0xf0, 0x00, 0xb2, 0xc8, 0xfe, 0x08, 0x4f, 0x02, 0x7a, 0xf8, 0xfa, 0x1c, 0xba, + 0xf4, 0xcb, 0xe1, 0xfa, 0xb0, 0x59, 0x04, 0x3f, 0x03, 0xff, 0x4c, 0x7b, 0xfc, 0x38, 0xd2, 0xfa, + 0xfa, 0x7e, 0xf9, 0x0a, 0x67, 0xfd, 0x2e, 0xe4, 0xff, 0xb5, 0x52, 0xff, 0x48, 0x9f, 0xff, 0xb8, + 0xa2, 0xff, 0x90, 0x6b, 0xfe, 0x21, 0xe7, 0xfe, 0xf7, 0x7a, 0xfd, 0x79, 0x4e, 0xfe, 0x71, 0x8d, + 0xfe, 0x48, 0x46, 0xfd, 0xfc, 0xcb, 0xfd, 0x7a, 0xc1, 0xfe, 0x74, 0x3c, 0xff, 0xa9, 0xce, 0xff, + 0x45, 0x1b, 0x00, 0x29, 0x62, 0xff, 0xc7, 0x24, 0x1c, 0x0f, 0x56, 0x1e, 0x3a, 0xd2, 0x05, 0xd9, + 0xb4, 0x0a, 0xfe, 0xb4, 0x01, 0xe3, 0xfa, 0xfd, 0xed, 0xc5, 0x02, 0x4d, 0x98, 0xfc, 0x69, 0x48, + 0xf6, 0xe6, 0x5f, 0xfa, 0xc9, 0xff, 0x02, 0x2e, 0xf0, 0xff, 0xe4, 0x10, 0xfd, 0x87, 0x3d, 0xfc, + 0x2c, 0x10, 0xfc, 0x69, 0x28, 0xfc, 0xe6, 0xf9, 0xfe, 0x20, 0xc3, 0xff, 0xf7, 0xca, 0xfe, 0x52, + 0x07, 0xff, 0x21, 0x04, 0xfe, 0x92, 0xb4, 0xfe, 0xa2, 0x2c, 0xfe, 0x01, 0x9b, 0xfe, 0x70, 0x9b, + 0xfe, 0x37, 0xef, 0xfd, 0xa6, 0x13, 0xfe, 0xaf, 0x68, 0xff, 0xc0, 0xda, 0xff, 0x53, 0xc3, 0xff, + 0x7d, 0x05, 0x00, 0xf0, 0x45, 0xff, 0xb2, 0xda, 0x19, 0xa9, 0xbf, 0x1c, 0x75, 0x88, 0x06, 0x2c, + 0xce, 0x09, 0x64, 0x7f, 0x01, 0xa0, 0xb9, 0xfe, 0x42, 0xb1, 0x02, 0x18, 0xf5, 0xfb, 0xcd, 0x11, + 0xf7, 0xf8, 0xe7, 0xfb, 0x56, 0x2e, 0x02, 0x2f, 0xa5, 0xfe, 0x3b, 0x5f, 0xfd, 0x69, 0x88, 0xfc, + 0x7f, 0x29, 0xfd, 0xa6, 0xc4, 0xfd, 0x73, 0x30, 0xfe, 0x48, 0x84, 0xff, 0x95, 0xea, 0xff, 0xac, + 0x2a, 0xff, 0xbd, 0x1d, 0xfe, 0x85, 0x1d, 0xff, 0x6f, 0x57, 0xfe, 0x84, 0xcc, 0xfe, 0xc0, 0x70, + 0xfe, 0x9e, 0xcf, 0xfd, 0x67, 0x84, 0xfe, 0x4d, 0x18, 0xff, 0xb4, 0x58, 0xff, 0x2c, 0x9e, 0xff, + 0x2c, 0x17, 0x00, 0x14, 0x7a, 0xff, 0x80, 0x71, 0x18, 0x84, 0x29, 0x1b, 0x98, 0xce, 0x05, 0x24, + 0x3c, 0x08, 0x76, 0xcd, 0x01, 0x0f, 0xf7, 0xff, 0x4d, 0x92, 0x02, 0x21, 0xd7, 0xfb, 0xb2, 0x47, + 0xf7, 0xac, 0xc9, 0xfc, 0x5b, 0x84, 0x02, 0xe1, 0x40, 0xfe, 0xf6, 0x82, 0xfd, 0x96, 0x90, 0xfc, + 0x8a, 0x5f, 0xfd, 0x59, 0x9e, 0xfe, 0xc0, 0xe3, 0xfe, 0x9f, 0xbb, 0xff, 0x71, 0xe4, 0xff, 0x79, + 0x28, 0xff, 0xff, 0x66, 0xfe, 0x33, 0x66, 0xff, 0x94, 0x54, 0xfe, 0x75, 0xb3, 0xfe, 0x46, 0x38, + 0xfe, 0x1c, 0xb6, 0xfd, 0x8c, 0x85, 0xfe, 0x62, 0xf5, 0xfe, 0xce, 0x67, 0xff, 0x36, 0xd1, 0xff, + 0x45, 0x21, 0x00, 0xd4, 0x83, 0xff, 0xd7, 0x24, 0x17, 0x30, 0x98, 0x19, 0x67, 0x21, 0x05, 0xd9, + 0xa6, 0x07, 0x2b, 0xc0, 0x01, 0x3d, 0xfb, 0xff, 0x5a, 0x80, 0x02, 0x40, 0xf5, 0xfb, 0x17, 0xb1, + 0xf7, 0xe0, 0x9a, 0xfd, 0xd5, 0xb2, 0x02, 0xcf, 0xfe, 0xfd, 0xae, 0xe1, 0xfd, 0xd0, 0xe8, 0xfc, + 0x1a, 0x72, 0xfd, 0x25, 0x47, 0xff, 0xf8, 0x3d, 0xff, 0xbc, 0x54, 0xff, 0x1a, 0xbb, 0xff, 0xd0, + 0x47, 0xff, 0x99, 0x88, 0xfe, 0x76, 0x72, 0xff, 0x06, 0x6b, 0xfe, 0xb1, 0xfe, 0xfe, 0x17, 0x92, + 0xfe, 0x62, 0xe0, 0xfd, 0x0f, 0x6f, 0xfe, 0x5d, 0xdd, 0xfe, 0xb2, 0x69, 0xff, 0xfb, 0xd5, 0xff, + 0x51, 0x1a, 0x00, 0x1a, 0x79, 0xff, 0x51, 0xc5, 0x15, 0x73, 0xe6, 0x17, 0xee, 0xd3, 0x04, 0x72, + 0x0a, 0x07, 0x58, 0x46, 0x01, 0x5f, 0x3f, 0x00, 0xe7, 0xc0, 0x02, 0x1a, 0x3a, 0xfc, 0x5c, 0x2e, + 0xf8, 0x94, 0x6f, 0xfe, 0xda, 0x78, 0x03, 0xc4, 0x7e, 0xfe, 0x2c, 0x47, 0xfe, 0x0a, 0x15, 0xfd, + 0x06, 0x99, 0xfd, 0x98, 0xca, 0xff, 0x54, 0x70, 0xff, 0xc0, 0x11, 0xff, 0x63, 0xae, 0xff, 0x08, + 0x79, 0xff, 0xb5, 0xcc, 0xfe, 0x34, 0xb5, 0xff, 0x6b, 0x93, 0xfe, 0x0a, 0x27, 0xff, 0xcc, 0xb7, + 0xfe, 0x87, 0xec, 0xfd, 0x06, 0x9e, 0xfe, 0x70, 0x0c, 0xff, 0x24, 0x6e, 0xff, 0x30, 0xd5, 0xff, + 0x13, 0x15, 0x00, 0xf6, 0x81, 0xff, 0x5e, 0x30, 0x15, 0xc5, 0xe6, 0x16, 0x98, 0x0e, 0x04, 0x2c, + 0x50, 0x06, 0x07, 0xfa, 0x00, 0x57, 0x67, 0x00, 0x68, 0x44, 0x03, 0x41, 0x21, 0xfd, 0xe2, 0x2d, + 0xf9, 0x8f, 0x59, 0xff, 0x1f, 0x24, 0x04, 0xc8, 0xda, 0xfe, 0xe3, 0x38, 0xfe, 0x57, 0xc1, 0xfc, + 0xb3, 0x6b, 0xfd, 0x6f, 0xf3, 0xff, 0xdc, 0xa5, 0xff, 0x7e, 0x26, 0xff, 0x11, 0xbe, 0xff, 0x04, + 0x8b, 0xff, 0x08, 0xc9, 0xfe, 0x2a, 0xab, 0xff, 0xa3, 0xad, 0xfe, 0xab, 0x57, 0xff, 0x4c, 0xe1, + 0xfe, 0xe0, 0x0b, 0xfe, 0xb8, 0xcc, 0xfe, 0x8b, 0x41, 0xff, 0x6c, 0x89, 0xff, 0x0d, 0xcc, 0xff, + 0x22, 0xe8, 0xff, 0x90, 0x42, 0xff, 0xaa, 0x26, 0x15, 0x43, 0x49, 0x17, 0x80, 0xae, 0x04, 0x67, + 0xd4, 0x06, 0x8c, 0x5a, 0x01, 0x96, 0xb7, 0x00, 0x02, 0x63, 0x03, 0x9e, 0xe5, 0xfc, 0x40, 0xcd, + 0xf8, 0x44, 0x00, 0xff, 0x82, 0xd4, 0x03, 0xf5, 0x99, 0xfe, 0x13, 0xf7, 0xfd, 0xe6, 0x84, 0xfc, + 0xbe, 0x76, 0xfd, 0x51, 0x18, 0x00, 0xe0, 0x90, 0xff, 0xd1, 0xfd, 0xfe, 0x0a, 0xaf, 0xff, 0x40, + 0x8c, 0xff, 0x9a, 0xd8, 0xfe, 0xd1, 0xcd, 0xff, 0x0c, 0xc3, 0xfe, 0x72, 0x6f, 0xff, 0x89, 0x14, + 0xff, 0xd9, 0x25, 0xfe, 0xfd, 0xb7, 0xfe, 0xfa, 0x06, 0xff, 0xe3, 0x32, 0xff, 0x27, 0x93, 0xff, + 0xb9, 0xde, 0xff, 0x7b, 0x58, 0xff, 0x92, 0x63, 0x15, 0x9f, 0x76, 0x17, 0x37, 0x6d, 0x04, 0xe5, + 0x68, 0x06, 0x06, 0x0c, 0x01, 0xf6, 0x9a, 0x00, 0x74, 0x6d, 0x03, 0x41, 0xe9, 0xfc, 0x0b, 0x92, + 0xf8, 0x0e, 0xcd, 0xfe, 0xb3, 0xee, 0x03, 0x8e, 0xa1, 0xfe, 0x07, 0xc4, 0xfd, 0x5c, 0x3c, 0xfc, + 0x35, 0x3c, 0xfd, 0xe6, 0x44, 0x00, 0x98, 0x18, 0x00, 0x11, 0x6d, 0xff, 0x8f, 0xde, 0xff, 0x95, + 0x8f, 0xff, 0xfe, 0xc3, 0xfe, 0x1a, 0x9f, 0xff, 0x4c, 0x88, 0xfe, 0x5a, 0x38, 0xff, 0x01, 0xf4, + 0xfe, 0x7d, 0x4b, 0xfe, 0x2b, 0x11, 0xff, 0x2a, 0x51, 0xff, 0x3a, 0x56, 0xff, 0xf8, 0x89, 0xff, + 0xa4, 0xbe, 0xff, 0x6a, 0x3e, 0xff, 0x23, 0x0f, 0x16, 0xc8, 0x79, 0x18, 0xf1, 0xb3, 0x04, 0xdb, + 0x4b, 0x06, 0x85, 0x98, 0x00, 0xdf, 0x1c, 0x00, 0xc6, 0xf2, 0x02, 0xc6, 0x3c, 0xfc, 0x69, 0xac, + 0xf7, 0x6f, 0xf3, 0xfd, 0x34, 0xff, 0x03, 0x6a, 0x1c, 0xff, 0xee, 0xf7, 0xfd, 0x02, 0x3c, 0xfc, + 0xef, 0x2b, 0xfd, 0x50, 0x24, 0x00, 0xec, 0x01, 0x00, 0x18, 0x6b, 0xff, 0x8e, 0xef, 0xff, 0x01, + 0xd9, 0xff, 0xb5, 0x0d, 0xff, 0xa7, 0xd2, 0xff, 0xf9, 0xae, 0xfe, 0x3f, 0x3c, 0xff, 0xc3, 0xdc, + 0xfe, 0xae, 0x06, 0xfe, 0x59, 0xc5, 0xfe, 0x38, 0x52, 0xff, 0x41, 0xb6, 0xff, 0x6a, 0x23, 0x00, + 0x26, 0x33, 0x00, 0x1c, 0x5b, 0xff, 0x6b, 0x4c, 0x17, 0x51, 0xe4, 0x19, 0xab, 0xfb, 0x04, 0x90, + 0xb3, 0x06, 0x50, 0xaa, 0x00, 0xb9, 0x1a, 0x00, 0xcb, 0xe4, 0x02, 0x8f, 0x9a, 0xfb, 0xda, 0x7b, + 0xf6, 0xdf, 0xf3, 0xfc, 0x16, 0x14, 0x04, 0x17, 0x09, 0xff, 0x39, 0x50, 0xfd, 0xe5, 0x9b, 0xfb, + 0xdb, 0xc7, 0xfc, 0x3d, 0x15, 0x00, 0xc4, 0x2a, 0x00, 0x95, 0x7a, 0xff, 0x6a, 0x17, 0x00, 0x52, + 0x0c, 0x00, 0xab, 0xfe, 0xfe, 0x23, 0xc6, 0xff, 0x7e, 0xa3, 0xfe, 0x73, 0x41, 0xff, 0xcc, 0xfa, + 0xfe, 0x72, 0x24, 0xfe, 0xe6, 0xed, 0xfe, 0xf2, 0x7e, 0xff, 0xdd, 0xa2, 0xff, 0xe1, 0xe9, 0xff, + 0x85, 0x18, 0x00, 0x37, 0x88, 0xff, 0xb0, 0x73, 0x19, 0xbe, 0xcd, 0x1b, 0x25, 0x9a, 0x04, 0x84, + 0x0e, 0x07, 0x25, 0xa7, 0x00, 0x98, 0x07, 0x00, 0x57, 0xdc, 0x02, 0xd4, 0xb2, 0xfa, 0x92, 0x67, + 0xf5, 0x5e, 0xac, 0xfc, 0xc7, 0xb0, 0x04, 0x07, 0xd9, 0xfe, 0x6b, 0xa5, 0xfc, 0x36, 0xfb, 0xfa, + 0x96, 0x66, 0xfc, 0x4b, 0xcd, 0xff, 0x18, 0xd3, 0xff, 0x8d, 0x23, 0xff, 0x8d, 0xd9, 0xff, 0x83, + 0xd7, 0xff, 0xf1, 0xae, 0xfe, 0x34, 0xbf, 0xff, 0x64, 0xab, 0xfe, 0x51, 0x44, 0xff, 0xec, 0xd7, + 0xfe, 0x41, 0xf5, 0xfd, 0x21, 0xc8, 0xfe, 0xc8, 0x6e, 0xff, 0x62, 0xae, 0xff, 0x8e, 0x00, 0x00, + 0x95, 0x41, 0x00, 0xf0, 0x94, 0xff, 0x92, 0x33, 0x1b, 0xe3, 0x10, 0x1e, 0xce, 0xa6, 0x04, 0xc4, + 0x17, 0x07, 0x59, 0xa2, 0x00, 0x8f, 0xc1, 0xff, 0x5c, 0xdf, 0x02, 0x29, 0xc9, 0xf9, 0x75, 0x9d, + 0xf4, 0xc2, 0xa0, 0xfc, 0x72, 0xa4, 0x04, 0x19, 0xb7, 0xfe, 0xca, 0x95, 0xfc, 0xd7, 0x89, 0xfa, + 0xfd, 0x18, 0xfc, 0x24, 0xa4, 0xff, 0xf9, 0xae, 0xff, 0x65, 0x46, 0xff, 0xc8, 0xb6, 0xff, 0xdd, + 0xad, 0xff, 0xa9, 0x8c, 0xfe, 0x52, 0x83, 0xff, 0x20, 0x4b, 0xfe, 0xe3, 0xfe, 0xfe, 0xc4, 0x92, + 0xfe, 0x47, 0xc2, 0xfd, 0x2a, 0xb7, 0xfe, 0x56, 0x61, 0xff, 0x75, 0xba, 0xff, 0x73, 0xfb, 0xff, + 0x83, 0x4b, 0x00, 0x93, 0x8d, 0xff, 0xee, 0xb5, 0x1b, 0x5b, 0xab, 0x1f, 0x93, 0xf3, 0x05, 0x4a, + 0x98, 0x07, 0x12, 0xbe, 0x00, 0x5b, 0xe6, 0xfe, 0x6c, 0x9b, 0x02, 0x50, 0xb4, 0xf9, 0xcd, 0xd0, + 0xf4, 0x49, 0xbd, 0xfc, 0x93, 0x0e, 0x03, 0x39, 0xf5, 0xfd, 0x66, 0x2b, 0xfd, 0xcb, 0x08, 0xfb, + 0xdf, 0x1e, 0xfc, 0x02, 0x3e, 0xff, 0xab, 0x58, 0xff, 0x22, 0xb4, 0xff, 0x16, 0xef, 0xff, 0xf6, + 0x53, 0xff, 0xaa, 0x61, 0xfe, 0x53, 0x6f, 0xff, 0x8d, 0x58, 0xfe, 0x06, 0xf6, 0xfe, 0xc7, 0x6d, + 0xfe, 0x9b, 0xb2, 0xfd, 0x4a, 0x94, 0xfe, 0x4f, 0x08, 0xff, 0x0f, 0x94, 0xff, 0x7e, 0xee, 0xff, + 0x9a, 0x3d, 0x00, 0x86, 0x86, 0xff, 0x9e, 0x61, 0x1c, 0xc0, 0x35, 0x20, 0x61, 0x90, 0x06, 0x89, + 0xec, 0x08, 0xb7, 0xa4, 0x01, 0x43, 0x88, 0xfe, 0x0b, 0x84, 0x01, 0xc5, 0xdb, 0xf8, 0x90, 0x2b, + 0xf5, 0x4d, 0x28, 0xfe, 0x70, 0xe8, 0x01, 0x17, 0xf1, 0xfb, 0x58, 0x32, 0xfd, 0x39, 0xfe, 0xfb, + 0xfe, 0x3e, 0xfd, 0x36, 0x4a, 0xff, 0x35, 0x64, 0xfe, 0x1c, 0x56, 0xff, 0x65, 0x31, 0x00, 0x1b, + 0x66, 0xff, 0xc9, 0xa4, 0xfe, 0x3f, 0x91, 0xff, 0x6a, 0x3b, 0xfe, 0x4b, 0xdc, 0xfe, 0x57, 0x20, + 0xfe, 0xfe, 0x72, 0xfd, 0xac, 0x79, 0xfe, 0xd2, 0xb0, 0xfe, 0x41, 0x3a, 0xff, 0xe1, 0xd1, 0xff, + 0x13, 0x33, 0x00, 0xe0, 0x76, 0xff, 0x90, 0x78, 0x1e, 0xf7, 0x8d, 0x20, 0x7e, 0x33, 0x05, 0x7d, + 0xda, 0x09, 0xb0, 0xea, 0x01, 0xa6, 0x84, 0xfe, 0x41, 0x47, 0x01, 0xd2, 0xd9, 0xf7, 0xc7, 0xa9, + 0xf5, 0x16, 0x7c, 0x00, 0x37, 0xd2, 0x01, 0x05, 0x39, 0xf9, 0x84, 0x42, 0xfc, 0x51, 0x54, 0xfc, + 0xe7, 0x66, 0xfe, 0x45, 0x4c, 0x00, 0xc3, 0x02, 0xfe, 0x25, 0xe2, 0xfe, 0x94, 0x5d, 0x00, 0x7f, + 0x2e, 0xff, 0x69, 0x6e, 0xfe, 0x52, 0xaa, 0xff, 0x40, 0xed, 0xfd, 0xa1, 0xb9, 0xfe, 0xdd, 0xc5, + 0xfd, 0xa5, 0x1a, 0xfd, 0x7b, 0x82, 0xfe, 0xc0, 0x9d, 0xfe, 0xb4, 0xec, 0xfe, 0x62, 0xb8, 0xff, + 0x4c, 0x18, 0x00, 0x2e, 0x32, 0xff, 0x09, 0x7c, 0x21, 0xc1, 0x38, 0x23, 0x34, 0x72, 0x02, 0x3a, + 0xb0, 0x07, 0xb4, 0xe7, 0x00, 0xbc, 0xa2, 0xfe, 0xf8, 0x91, 0x03, 0x04, 0xfd, 0xf7, 0xab, 0x7b, + 0xf4, 0xc7, 0xa7, 0x01, 0xcb, 0xfb, 0x03, 0xd6, 0x95, 0xf8, 0xdb, 0x94, 0xfa, 0x8c, 0xbd, 0xfb, + 0x31, 0xb4, 0xfe, 0x87, 0x21, 0x01, 0x8b, 0xcd, 0xfd, 0x72, 0x25, 0xfe, 0xbc, 0x6a, 0x00, 0x93, + 0x52, 0xff, 0xab, 0x07, 0xfe, 0x02, 0xaa, 0xff, 0xd6, 0xd3, 0xfd, 0xb8, 0xac, 0xfe, 0xb1, 0xa5, + 0xfd, 0x32, 0xa5, 0xfc, 0x18, 0x82, 0xfe, 0x9d, 0xc2, 0xfe, 0x5f, 0xc9, 0xfe, 0x02, 0x8b, 0xff, + 0xe9, 0x3c, 0x00, 0x8e, 0x4e, 0xff, 0x9b, 0x9a, 0x24, 0x6c, 0x88, 0x24, 0x0f, 0x23, 0x00, 0x4c, + 0x8b, 0x06, 0x76, 0xf6, 0xfe, 0xe1, 0x33, 0xff, 0x27, 0x51, 0x05, 0xf6, 0xf7, 0xf7, 0x82, 0xbc, + 0xf3, 0x26, 0x49, 0x02, 0x42, 0xa6, 0x06, 0xb9, 0xc5, 0xf8, 0x81, 0x07, 0xf9, 0xb8, 0x05, 0xfa, + 0x89, 0x69, 0xfe, 0x8b, 0xa1, 0x01, 0x8c, 0x60, 0xfd, 0x8c, 0x46, 0xfd, 0x2f, 0x39, 0x00, 0xd8, + 0x4f, 0xff, 0x3d, 0x87, 0xfd, 0x66, 0xc4, 0xff, 0x8c, 0xcc, 0xfd, 0x5a, 0xe2, 0xfe, 0xd0, 0xb9, + 0xfd, 0x9f, 0x43, 0xfc, 0x8e, 0x55, 0xfe, 0x41, 0xf4, 0xfe, 0x5e, 0x03, 0xff, 0xc0, 0xa8, 0xff, + 0xf2, 0x23, 0x00, 0x41, 0x0c, 0xff, 0xc2, 0x38, 0x26, 0x3a, 0xcc, 0x25, 0x1c, 0xf4, 0xff, 0xd4, + 0x6b, 0x05, 0x85, 0x4a, 0xfd, 0x39, 0xb1, 0xff, 0x7e, 0x64, 0x06, 0x00, 0xb5, 0xf8, 0x10, 0x50, + 0xf2, 0xb2, 0x57, 0x01, 0x2e, 0xf4, 0x08, 0xe2, 0x6d, 0xfa, 0xce, 0x68, 0xf8, 0x1b, 0x77, 0xf7, + 0xc3, 0x47, 0xfd, 0xef, 0xba, 0x02, 0x01, 0x23, 0xfe, 0x30, 0xaf, 0xfc, 0x99, 0x9b, 0xff, 0xdd, + 0x14, 0xff, 0xb4, 0x7e, 0xfd, 0x76, 0xc7, 0xff, 0x97, 0x66, 0xfd, 0xa2, 0xd3, 0xfe, 0x35, 0xe2, + 0xfd, 0xf2, 0x5b, 0xfc, 0xbe, 0x70, 0xfe, 0x30, 0x3b, 0xff, 0x9d, 0x21, 0xff, 0x79, 0xbd, 0xff, + 0x35, 0x04, 0x00, 0x27, 0xd4, 0xfe, 0xbf, 0x8e, 0x26, 0x22, 0x94, 0x26, 0x81, 0x24, 0x01, 0x77, + 0x58, 0x05, 0xc4, 0x6f, 0xfc, 0x39, 0x68, 0xff, 0xcc, 0x24, 0x06, 0xe4, 0x4b, 0xf9, 0xb3, 0x1c, + 0xf1, 0x72, 0xc0, 0xff, 0xa1, 0xd3, 0x09, 0x00, 0xd8, 0xfc, 0xeb, 0xc0, 0xf8, 0x22, 0x77, 0xf5, + 0xba, 0x2e, 0xfc, 0x32, 0x24, 0x03, 0x73, 0xce, 0xff, 0xbf, 0x83, 0xfc, 0x64, 0xe9, 0xfe, 0x50, + 0x30, 0xff, 0xfb, 0x30, 0xfd, 0xa6, 0x6a, 0xff, 0x1b, 0x45, 0xfd, 0x41, 0xfa, 0xfe, 0x42, 0x02, + 0xfe, 0xe1, 0x8e, 0xfc, 0xde, 0x1d, 0xfe, 0x02, 0x2c, 0xff, 0x8d, 0x46, 0xff, 0x0f, 0x92, 0xff, + 0x98, 0xeb, 0xff, 0x2c, 0xbe, 0xfe, 0xd6, 0x9a, 0x25, 0xb7, 0xb4, 0x26, 0x10, 0xba, 0x03, 0x9c, + 0x8c, 0x06, 0xb1, 0x37, 0xfc, 0x3d, 0xf2, 0xfe, 0x24, 0x48, 0x05, 0xb9, 0x68, 0xf9, 0x3c, 0x21, + 0xf0, 0xd4, 0xb2, 0xfd, 0xd6, 0x39, 0x09, 0xf6, 0x18, 0xff, 0x36, 0xae, 0xfb, 0x2c, 0x68, 0xf4, + 0x19, 0x22, 0xfa, 0x77, 0x2b, 0x03, 0xc2, 0x27, 0x01, 0x82, 0x73, 0xfd, 0xb5, 0x34, 0xfe, 0x46, + 0x19, 0xff, 0x06, 0x7a, 0xfd, 0x44, 0x4e, 0xff, 0x1c, 0x7b, 0xfd, 0x23, 0x50, 0xff, 0xaa, 0xfa, + 0xfd, 0x89, 0x56, 0xfc, 0xcd, 0xef, 0xfd, 0xf5, 0xb6, 0xfe, 0x99, 0x50, 0xff, 0xd9, 0x6f, 0xff, + 0x1f, 0x06, 0x00, 0xef, 0x22, 0xff, 0x78, 0x13, 0x24, 0x0c, 0xbd, 0x25, 0xea, 0x40, 0x06, 0x35, + 0x6e, 0x07, 0x8a, 0x32, 0xfd, 0x93, 0xd4, 0xfe, 0x77, 0xb6, 0x03, 0x36, 0x3e, 0xfa, 0x1b, 0x7c, + 0xef, 0x8e, 0x8e, 0xfb, 0xdb, 0xe6, 0x07, 0x4d, 0x95, 0xff, 0x68, 0xdf, 0xfe, 0x5b, 0x99, 0xf5, + 0x91, 0x29, 0xf7, 0xf4, 0x22, 0x02, 0x06, 0x7b, 0x01, 0x34, 0x98, 0xfe, 0xbd, 0x01, 0xff, 0x58, + 0xd1, 0xfe, 0x0d, 0xf0, 0xfd, 0xd0, 0x5a, 0xff, 0x3a, 0x32, 0xfd, 0xc4, 0x3e, 0xff, 0xe6, 0xf4, + 0xfd, 0xc3, 0xe4, 0xfb, 0xd3, 0xf5, 0xfd, 0xf7, 0x7e, 0xfe, 0x25, 0x66, 0xff, 0x7b, 0xfd, 0xff, + 0xbe, 0x43, 0x00, 0xbf, 0x63, 0xff, 0x45, 0x4a, 0x22, 0x7e, 0x85, 0x24, 0x02, 0xb3, 0x06, 0xb2, + 0x0d, 0x09, 0xd7, 0x65, 0xfe, 0x4b, 0x37, 0xfe, 0x9c, 0x7c, 0x03, 0xb1, 0x53, 0xfa, 0xcc, 0x7f, + 0xf0, 0x18, 0xd2, 0xf9, 0x3e, 0x34, 0x07, 0xc1, 0x50, 0xff, 0xf1, 0xf0, 0xfe, 0x3d, 0xd5, 0xf8, + 0x27, 0x0a, 0xf5, 0xcf, 0x80, 0xff, 0x73, 0x00, 0x02, 0xc0, 0x91, 0xff, 0x2d, 0xbd, 0xff, 0x02, + 0xe5, 0xfe, 0xf6, 0x14, 0xfe, 0x82, 0xac, 0xff, 0x89, 0x01, 0xfd, 0x50, 0x04, 0xfe, 0x72, 0x6b, + 0xfe, 0xf7, 0x35, 0xfc, 0xdb, 0xe5, 0xfd, 0x73, 0xe7, 0xfe, 0xc4, 0x60, 0xff, 0x3c, 0x2d, 0x00, + 0x17, 0x3a, 0x00, 0x79, 0x5d, 0xff, 0x6f, 0xf7, 0x20, 0x26, 0x87, 0x23, 0x67, 0x84, 0x05, 0x34, + 0x3f, 0x09, 0xc0, 0x31, 0x00, 0x83, 0x24, 0xfe, 0xb4, 0x0f, 0x02, 0xf1, 0x51, 0xfa, 0x5d, 0x42, + 0xf4, 0xaa, 0xbd, 0xf9, 0x0c, 0xc8, 0x05, 0x9e, 0x97, 0xff, 0xa1, 0x53, 0xfc, 0xa4, 0xa1, 0xfb, + 0x22, 0x55, 0xf7, 0xea, 0xe7, 0xfb, 0x90, 0x1a, 0x01, 0x3e, 0xf5, 0xff, 0xf7, 0xc5, 0xff, 0xd5, + 0x05, 0x00, 0x91, 0x74, 0xfe, 0xfc, 0x8b, 0xfe, 0x68, 0xf1, 0xfc, 0x88, 0x1b, 0xfe, 0x0d, 0x06, + 0xff, 0xeb, 0x50, 0xfd, 0xa7, 0x95, 0xfd, 0x26, 0xec, 0xfe, 0x1a, 0x5b, 0xff, 0xb0, 0x00, 0x00, + 0xdc, 0x2b, 0x00, 0xdb, 0x58, 0xff, 0xf7, 0x01, 0x1f, 0xff, 0x0a, 0x21, 0x38, 0x48, 0x05, 0xc5, + 0x10, 0x0a, 0x06, 0x31, 0x01, 0x85, 0x11, 0xfe, 0x77, 0x0d, 0x02, 0x3d, 0x1b, 0xfb, 0xa9, 0x60, + 0xf5, 0x94, 0xff, 0xf9, 0x71, 0xec, 0x04, 0x77, 0x8a, 0x00, 0xce, 0xd0, 0xfb, 0xf6, 0xe5, 0xfb, + 0x56, 0x7f, 0xfa, 0x37, 0x0a, 0xfb, 0x10, 0x88, 0xff, 0xbf, 0xee, 0xff, 0xfa, 0xf0, 0xfe, 0x98, + 0x87, 0xff, 0xee, 0xa0, 0xfe, 0x66, 0xf8, 0xfe, 0x54, 0xa6, 0xfd, 0x49, 0x34, 0xfe, 0x7d, 0xdd, + 0xfe, 0x75, 0xe6, 0xfd, 0xa4, 0x8e, 0xfd, 0x53, 0x02, 0xff, 0xab, 0x8c, 0xff, 0x9c, 0xd0, 0xff, + 0x26, 0x4e, 0x00, 0x43, 0x4d, 0xff, 0x56, 0x0a, 0x1d, 0x97, 0x3f, 0x1c, 0x2f, 0xa1, 0x03, 0x46, + 0xc7, 0x0c, 0x9f, 0x95, 0x01, 0xb6, 0xdb, 0xfc, 0x1b, 0x0b, 0x03, 0xb4, 0x8d, 0xfd, 0x85, 0xe2, + 0xf6, 0xca, 0xca, 0xf8, 0x25, 0xdf, 0x02, 0x9a, 0x69, 0x01, 0xde, 0x27, 0xfd, 0xf6, 0x99, 0xfd, + 0x33, 0x4f, 0xfc, 0x05, 0xe4, 0xf9, 0xfe, 0x5e, 0xff, 0x47, 0x9c, 0x00, 0xc6, 0x22, 0xfe, 0x7e, + 0xfb, 0xfe, 0x54, 0xe2, 0xfd, 0xe9, 0x69, 0xfe, 0xb4, 0x79, 0xfe, 0xd4, 0x8d, 0xfe, 0x89, 0xde, + 0xfe, 0x42, 0x6c, 0xfe, 0xa2, 0xfa, 0xfd, 0xe9, 0xe7, 0xff, 0x79, 0x37, 0x00, 0xcf, 0xb1, 0xff, + 0x17, 0xfe, 0xff, 0x27, 0x36, 0xff, 0x45, 0x1b, 0x1a, 0x04, 0xf0, 0x1a, 0x5c, 0x58, 0x05, 0xa0, + 0xd7, 0x0b, 0x73, 0x36, 0x01, 0x3f, 0x2f, 0xfd, 0x4d, 0xbe, 0x02, 0x21, 0xa5, 0xfc, 0x1f, 0x13, + 0xf8, 0xae, 0xce, 0xfa, 0x96, 0x2a, 0x01, 0x74, 0xc4, 0xff, 0x12, 0xe9, 0xfd, 0xab, 0x2f, 0xfe, + 0x08, 0xcd, 0xfd, 0xec, 0x8c, 0xfb, 0xbc, 0xa3, 0xfd, 0x3c, 0x3f, 0x00, 0xde, 0xf7, 0xff, 0x0e, + 0x32, 0xff, 0xc3, 0xdf, 0xfd, 0xc8, 0xcf, 0xfe, 0xb7, 0xa3, 0xfe, 0x44, 0xf3, 0xfe, 0x18, 0xd7, + 0xfe, 0xb7, 0x54, 0xfe, 0x1d, 0x79, 0xfe, 0x07, 0x59, 0xff, 0x54, 0xb2, 0xff, 0xd0, 0x90, 0xff, + 0x95, 0x08, 0x00, 0xd0, 0x76, 0xff, 0x0e, 0x44, 0x18, 0x0a, 0x0b, 0x19, 0x4c, 0xfd, 0x04, 0x3e, + 0x23, 0x0a, 0x2c, 0x95, 0x01, 0xf0, 0x43, 0xff, 0x39, 0x9c, 0x02, 0x9b, 0x56, 0xfc, 0xee, 0x90, + 0xf8, 0xdb, 0xb6, 0xfb, 0xf0, 0x45, 0x01, 0x66, 0x05, 0xff, 0xe8, 0x07, 0xfe, 0x09, 0xf0, 0xfd, + 0xe8, 0x51, 0xfe, 0xd4, 0x11, 0xfd, 0x63, 0xfe, 0xfd, 0x0c, 0x7c, 0x00, 0x1e, 0x1a, 0x00, 0xf6, + 0xf5, 0xfe, 0x8d, 0x3f, 0xfe, 0xec, 0x51, 0xff, 0xdd, 0xa9, 0xfe, 0x15, 0xbb, 0xfe, 0x80, 0x4e, + 0xfe, 0x52, 0x22, 0xfe, 0x2d, 0xd8, 0xfe, 0xfe, 0x20, 0xff, 0x2b, 0x4e, 0xff, 0xdc, 0xaf, 0xff, + 0x5a, 0x38, 0x00, 0x99, 0x9c, 0xff, 0xf7, 0xb1, 0x16, 0xd6, 0x96, 0x17, 0x1a, 0x4a, 0x04, 0x8e, + 0x8d, 0x08, 0x5f, 0x45, 0x02, 0xf7, 0x3f, 0x00, 0xc7, 0x46, 0x02, 0xb8, 0x4b, 0xfc, 0x71, 0xc1, + 0xf8, 0xb6, 0xb8, 0xfc, 0xd0, 0x87, 0x01, 0x2e, 0x9e, 0xfe, 0x54, 0x47, 0xfe, 0xa1, 0x11, 0xfe, + 0x3b, 0x7c, 0xfe, 0xf4, 0xd4, 0xfd, 0x8d, 0xb2, 0xfe, 0x1c, 0x92, 0x00, 0x3e, 0x07, 0x00, 0xc7, + 0xf8, 0xfe, 0xed, 0x83, 0xfe, 0x84, 0x85, 0xff, 0x47, 0x98, 0xfe, 0xbe, 0xae, 0xfe, 0x39, 0x2f, + 0xfe, 0x43, 0x1f, 0xfe, 0x5f, 0xca, 0xfe, 0x3e, 0x0a, 0xff, 0x68, 0x8a, 0xff, 0x5e, 0xe2, 0xff, + 0x23, 0x2b, 0x00, 0x51, 0x9a, 0xff, 0x8a, 0x40, 0x15, 0x27, 0xf0, 0x15, 0x6b, 0xa3, 0x03, 0xdc, + 0xf7, 0x07, 0x33, 0x76, 0x02, 0x5f, 0x43, 0x00, 0x75, 0x1d, 0x02, 0x87, 0x70, 0xfc, 0x18, 0x31, + 0xf9, 0xd6, 0xac, 0xfd, 0x7b, 0xa4, 0x01, 0x6c, 0x40, 0xfe, 0xfc, 0xb1, 0xfe, 0x14, 0x65, 0xfe, + 0xa5, 0x83, 0xfe, 0x7b, 0x98, 0xfe, 0x1d, 0x2f, 0xff, 0xb6, 0x1a, 0x00, 0xf5, 0xce, 0xff, 0xe1, + 0x1d, 0xff, 0x7f, 0xb5, 0xfe, 0x19, 0x97, 0xff, 0x98, 0x94, 0xfe, 0x26, 0xe4, 0xfe, 0x61, 0x86, + 0xfe, 0x5f, 0x5e, 0xfe, 0x52, 0xbf, 0xfe, 0xf8, 0xe8, 0xfe, 0x12, 0x89, 0xff, 0x26, 0xf4, 0xff, + 0x85, 0x2b, 0x00, 0xd8, 0x85, 0xff, 0x95, 0x8c, 0x13, 0x81, 0x66, 0x14, 0x0a, 0x74, 0x03, 0x47, + 0x31, 0x07, 0xc5, 0x01, 0x02, 0xda, 0x97, 0x00, 0x44, 0x5f, 0x02, 0xe7, 0x92, 0xfc, 0x55, 0x93, + 0xf9, 0xef, 0x65, 0xfe, 0x38, 0x04, 0x02, 0x78, 0x6c, 0xfe, 0x02, 0x41, 0xff, 0xaa, 0x9b, 0xfe, + 0x7d, 0x92, 0xfe, 0x2f, 0x4c, 0xff, 0x89, 0x44, 0xff, 0xba, 0xa4, 0xff, 0xed, 0xd0, 0xff, 0x24, + 0x4b, 0xff, 0x2a, 0xd5, 0xfe, 0xe1, 0xd2, 0xff, 0xb7, 0xf7, 0xfe, 0x25, 0x43, 0xff, 0x20, 0xaf, + 0xfe, 0x1d, 0x44, 0xfe, 0x84, 0xbf, 0xfe, 0x46, 0x06, 0xff, 0x61, 0x96, 0xff, 0xd9, 0xe0, 0xff, + 0x0d, 0x12, 0x00, 0xbf, 0x9e, 0xff, 0xbf, 0x1c, 0x12, 0xc0, 0x8f, 0x12, 0x53, 0x4f, 0x03, 0x05, + 0xb9, 0x06, 0x0b, 0x9f, 0x01, 0x80, 0xd9, 0x00, 0xc0, 0x87, 0x02, 0x4a, 0xeb, 0xfc, 0xe4, 0x37, + 0xfa, 0x09, 0x5b, 0xff, 0x01, 0xd1, 0x02, 0x32, 0xd3, 0xfe, 0xf9, 0x89, 0xff, 0x12, 0xcb, 0xfe, + 0x23, 0xc2, 0xfe, 0x40, 0xcb, 0xff, 0xe0, 0x63, 0xff, 0x16, 0x50, 0xff, 0x1f, 0xce, 0xff, 0xf5, + 0x8e, 0xff, 0x6c, 0x21, 0xff, 0x2f, 0xf7, 0xff, 0xff, 0xf2, 0xfe, 0x67, 0x67, 0xff, 0x3e, 0xf1, + 0xfe, 0x35, 0x61, 0xfe, 0x6a, 0xe8, 0xfe, 0x71, 0x2c, 0xff, 0x55, 0x90, 0xff, 0xc6, 0xe7, 0xff, + 0x60, 0x15, 0x00, 0xaf, 0x99, 0xff, 0x7f, 0x68, 0x11, 0x00, 0x7e, 0x11, 0x27, 0xa4, 0x02, 0x4b, + 0xcc, 0x05, 0x39, 0x1e, 0x01, 0x9d, 0xf3, 0x00, 0x96, 0x0d, 0x03, 0xbb, 0xcf, 0xfd, 0x26, 0x18, + 0xfb, 0x20, 0x5c, 0x00, 0xa1, 0xc1, 0x03, 0x2c, 0x6f, 0xff, 0x41, 0xa2, 0xff, 0x37, 0x8c, 0xfe, + 0xe4, 0x90, 0xfe, 0xe7, 0xe1, 0xff, 0x61, 0x87, 0xff, 0x71, 0x63, 0xff, 0x16, 0x04, 0x00, 0x23, + 0xb8, 0xff, 0x5d, 0x17, 0xff, 0x4b, 0xeb, 0xff, 0x43, 0x18, 0xff, 0xcb, 0x96, 0xff, 0xa2, 0x0b, + 0xff, 0xcb, 0x76, 0xfe, 0x49, 0x22, 0xff, 0x72, 0x72, 0xff, 0xac, 0xb5, 0xff, 0x28, 0xf4, 0xff, + 0x65, 0xf2, 0xff, 0x2b, 0x4d, 0xff, 0x45, 0xea, 0x10, 0x4b, 0xcf, 0x10, 0x7d, 0x22, 0x02, 0x54, + 0xcf, 0x05, 0xcc, 0xa8, 0x01, 0x8a, 0x73, 0x01, 0xa7, 0x81, 0x03, 0xd4, 0x72, 0xfe, 0x3f, 0xe7, + 0xfb, 0xdc, 0xd8, 0x00, 0x37, 0xbe, 0x03, 0xdd, 0x19, 0xff, 0xac, 0xfd, 0xfe, 0xfa, 0xf2, 0xfd, + 0x34, 0x99, 0xfe, 0xb8, 0x5a, 0x00, 0x6b, 0xce, 0xff, 0x12, 0x56, 0xff, 0xeb, 0xbb, 0xff, 0xba, + 0x96, 0xff, 0x20, 0x25, 0xff, 0x0c, 0xf9, 0xff, 0x4c, 0x2f, 0xff, 0xd0, 0xd1, 0xff, 0x97, 0x5a, + 0xff, 0xaa, 0x9c, 0xfe, 0xec, 0x2b, 0xff, 0xad, 0x6a, 0xff, 0x83, 0x91, 0xff, 0xeb, 0xad, 0xff, + 0x50, 0xb2, 0xff, 0xd5, 0x3a, 0xff, 0xb0, 0x0c, 0x11, 0xcd, 0xa3, 0x11, 0xf1, 0x30, 0x03, 0xc2, + 0x64, 0x06, 0x35, 0xcd, 0x01, 0x88, 0xa3, 0x01, 0x31, 0x84, 0x03, 0xb0, 0xee, 0xfd, 0x87, 0x23, + 0xfb, 0xfa, 0x30, 0x00, 0x0d, 0x4f, 0x03, 0xfc, 0xed, 0xfe, 0x9a, 0xfa, 0xfe, 0xca, 0xe4, 0xfd, + 0x24, 0xa6, 0xfe, 0x3e, 0x58, 0x00, 0x51, 0x8b, 0xff, 0xbd, 0x26, 0xff, 0x5e, 0xd3, 0xff, 0xd8, + 0xaf, 0xff, 0xbf, 0x31, 0xff, 0xcb, 0x1e, 0x00, 0x6b, 0x3f, 0xff, 0x66, 0xd9, 0xff, 0xc8, 0x80, + 0xff, 0xa3, 0xaf, 0xfe, 0x85, 0x08, 0xff, 0x6c, 0x1d, 0xff, 0xcf, 0x2b, 0xff, 0x1a, 0x83, 0xff, + 0x5a, 0xc6, 0xff, 0x48, 0x5e, 0xff, 0x97, 0x53, 0x11, 0x2e, 0xcc, 0x11, 0x40, 0xf2, 0x02, 0xb5, + 0x0c, 0x06, 0x17, 0xa6, 0x01, 0x14, 0xae, 0x01, 0xde, 0xa4, 0x03, 0xc9, 0xf2, 0xfd, 0xba, 0xd5, + 0xfa, 0x0c, 0xd3, 0xff, 0x0f, 0x39, 0x03, 0xc0, 0xe2, 0xfe, 0x0d, 0xbf, 0xfe, 0x81, 0xb0, 0xfd, + 0x16, 0x97, 0xfe, 0x3e, 0xa6, 0x00, 0x22, 0x28, 0x00, 0x8f, 0x85, 0xff, 0x80, 0xce, 0xff, 0xc1, + 0x93, 0xff, 0x1e, 0x1f, 0xff, 0x39, 0xe0, 0xff, 0x9e, 0xf2, 0xfe, 0xa7, 0xb1, 0xff, 0xa8, 0x87, + 0xff, 0xf2, 0x06, 0xff, 0x2c, 0x6b, 0xff, 0x55, 0x36, 0xff, 0x9f, 0x1d, 0xff, 0xc3, 0x5b, 0xff, + 0x0e, 0xa3, 0xff, 0x59, 0x5a, 0xff, 0x37, 0xc2, 0x11, 0x64, 0x3c, 0x12, 0xf6, 0xa8, 0x02, 0x5d, + 0x68, 0x05, 0x86, 0xde, 0x00, 0x1a, 0x27, 0x01, 0xb0, 0x72, 0x03, 0xe8, 0xe0, 0xfd, 0x3b, 0x8e, + 0xfa, 0x1d, 0xb7, 0xff, 0x28, 0xc1, 0x03, 0x33, 0x5c, 0xff, 0x85, 0xda, 0xfe, 0x48, 0x3b, 0xfd, + 0x97, 0xec, 0xfd, 0x3d, 0x87, 0x00, 0x8b, 0x6a, 0x00, 0xfd, 0x04, 0x00, 0xd3, 0x71, 0x00, 0x8c, + 0xdb, 0xff, 0xfb, 0x16, 0xff, 0xfe, 0xe9, 0xff, 0xdc, 0xde, 0xfe, 0x97, 0x58, 0xff, 0xf3, 0x32, + 0xff, 0x28, 0xbf, 0xfe, 0x07, 0x76, 0xff, 0xa4, 0xd6, 0xff, 0x59, 0xd1, 0xff, 0xda, 0xba, 0xff, + 0xaa, 0x93, 0xff, 0x64, 0x08, 0xff, 0x55, 0x9b, 0x12, 0xc2, 0x7c, 0x13, 0x0a, 0xf9, 0x02, 0x83, + 0x78, 0x05, 0x74, 0x9d, 0x00, 0xc5, 0xc3, 0x00, 0x1b, 0xe5, 0x02, 0x63, 0xe5, 0xfc, 0x4d, 0x58, + 0xf9, 0xad, 0xa1, 0xfe, 0x19, 0xd2, 0x03, 0x78, 0xc5, 0xff, 0x3c, 0xe0, 0xfe, 0x33, 0x67, 0xfd, + 0x50, 0x35, 0xfe, 0xe6, 0x7c, 0x00, 0xda, 0x4a, 0x00, 0x26, 0xca, 0xff, 0x7e, 0x2a, 0x00, 0x78, + 0x25, 0x00, 0x60, 0x7c, 0xff, 0x9d, 0x1b, 0x00, 0xd2, 0x1b, 0xff, 0xda, 0x85, 0xff, 0x0e, 0x2c, + 0xff, 0x2c, 0x86, 0xfe, 0x34, 0x26, 0xff, 0xb4, 0x9b, 0xff, 0x14, 0xfd, 0xff, 0x6a, 0x5e, 0x00, + 0x2b, 0x38, 0x00, 0x76, 0x50, 0xff, 0xec, 0xec, 0x13, 0x2e, 0xf6, 0x14, 0x4b, 0x2b, 0x03, 0x8f, + 0xd7, 0x05, 0x5a, 0xa1, 0x00, 0xcd, 0xac, 0x00, 0xae, 0xbd, 0x02, 0xe4, 0x21, 0xfc, 0xc0, 0x13, + 0xf8, 0xdb, 0x91, 0xfd, 0x5a, 0xec, 0x03, 0xe5, 0xa9, 0xff, 0x11, 0x30, 0xfe, 0x5d, 0xdb, 0xfc, + 0x6a, 0xf3, 0xfd, 0x7c, 0xa7, 0x00, 0x01, 0x9d, 0x00, 0x0b, 0xe1, 0xff, 0xc1, 0x57, 0x00, 0xfd, + 0x31, 0x00, 0x00, 0x4c, 0xff, 0x08, 0x27, 0x00, 0x81, 0x11, 0xff, 0xbc, 0x96, 0xff, 0xf2, 0x5d, + 0xff, 0xfd, 0xa6, 0xfe, 0x5e, 0x40, 0xff, 0xb3, 0xc8, 0xff, 0x49, 0xe6, 0xff, 0x48, 0xff, 0xff, + 0x79, 0x3a, 0x00, 0x88, 0xc2, 0xff, 0xec, 0xf5, 0x15, 0xa5, 0x8e, 0x16, 0xb9, 0xe1, 0x02, 0xdb, + 0x5a, 0x06, 0x27, 0x97, 0x00, 0x97, 0xc6, 0x00, 0xc6, 0xce, 0x02, 0x21, 0x5a, 0xfb, 0xa9, 0xc7, + 0xf6, 0x5e, 0xe6, 0xfc, 0x8a, 0x8f, 0x04, 0x81, 0x80, 0xff, 0x9b, 0x58, 0xfd, 0x1c, 0x1e, 0xfc, + 0xbd, 0x68, 0xfd, 0x68, 0x45, 0x00, 0xb4, 0x5b, 0x00, 0xe9, 0xa3, 0xff, 0xb7, 0x59, 0x00, 0xa2, + 0x59, 0x00, 0xab, 0x3d, 0xff, 0xe8, 0x25, 0x00, 0x70, 0x1b, 0xff, 0x07, 0x84, 0xff, 0x22, 0x4c, + 0xff, 0x9b, 0xb8, 0xfe, 0x93, 0x4d, 0xff, 0xb3, 0xdf, 0xff, 0xf7, 0xdc, 0xff, 0x1b, 0xf6, 0xff, + 0xb8, 0x21, 0x00, 0xf6, 0x91, 0xff, 0xb3, 0x6c, 0x18, 0xc9, 0x79, 0x18, 0x8f, 0x15, 0x02, 0x2a, + 0xc9, 0x06, 0x9b, 0x8d, 0x00, 0x90, 0x9b, 0x00, 0x21, 0xc3, 0x02, 0xb1, 0x46, 0xfa, 0xc8, 0xc7, + 0xf5, 0x19, 0xed, 0xfc, 0xac, 0x49, 0x05, 0x42, 0x2d, 0xff, 0x5e, 0xa9, 0xfc, 0x06, 0x89, 0xfb, + 0xef, 0x27, 0xfd, 0x70, 0x12, 0x00, 0x8d, 0x0d, 0x00, 0x9c, 0x59, 0xff, 0x07, 0x14, 0x00, 0xc9, + 0x27, 0x00, 0x3d, 0xda, 0xfe, 0x53, 0x0e, 0x00, 0x1a, 0x1a, 0xff, 0x7d, 0x94, 0xff, 0x0c, 0x22, + 0xff, 0x48, 0x69, 0xfe, 0xad, 0x2e, 0xff, 0x25, 0xcc, 0xff, 0x86, 0xe9, 0xff, 0x37, 0x24, 0x00, + 0x53, 0x58, 0x00, 0xaf, 0xb0, 0xff, 0x6f, 0xa1, 0x1a, 0x28, 0xc6, 0x1a, 0xe7, 0x80, 0x01, 0x32, + 0xe5, 0x06, 0x85, 0xae, 0x00, 0x7f, 0x59, 0x00, 0x23, 0xc2, 0x02, 0x67, 0x2e, 0xf9, 0x36, 0xe2, + 0xf4, 0x3d, 0x14, 0xfd, 0xf8, 0xa4, 0x05, 0xd9, 0xff, 0xfe, 0xc6, 0x5c, 0xfc, 0x29, 0x0a, 0xfb, + 0x96, 0xf8, 0xfc, 0x3b, 0x05, 0x00, 0x3e, 0xd4, 0xff, 0xfe, 0x3f, 0xff, 0x52, 0xf1, 0xff, 0xaf, + 0x1c, 0x00, 0x81, 0xb3, 0xfe, 0x89, 0xc7, 0xff, 0x2a, 0xb8, 0xfe, 0x32, 0x66, 0xff, 0x72, 0xe1, + 0xfe, 0x95, 0x37, 0xfe, 0x2d, 0x1f, 0xff, 0x52, 0xb8, 0xff, 0xce, 0xee, 0xff, 0x7b, 0x2e, 0x00, + 0xda, 0x81, 0x00, 0xcc, 0xb9, 0xff, 0xe6, 0xe3, 0x1b, 0x60, 0x12, 0x1d, 0xa0, 0x24, 0x02, 0xd6, + 0xde, 0x06, 0x52, 0x6a, 0x00, 0x6c, 0xc0, 0xff, 0xf4, 0xf1, 0x02, 0xad, 0x82, 0xf8, 0x75, 0x8e, + 0xf4, 0xed, 0xf4, 0xfc, 0x22, 0x80, 0x04, 0x81, 0xcc, 0xfe, 0x00, 0xf9, 0xfc, 0x97, 0xcf, 0xfa, + 0x3d, 0x73, 0xfc, 0x2f, 0xba, 0xff, 0xd5, 0xd1, 0xff, 0x10, 0xec, 0xff, 0xa2, 0xd2, 0xff, 0xb2, + 0xb5, 0xff, 0x7c, 0x99, 0xfe, 0x49, 0x93, 0xff, 0x97, 0x6f, 0xfe, 0xf1, 0x19, 0xff, 0xc1, 0xa2, + 0xfe, 0x45, 0x17, 0xfe, 0xf9, 0x0f, 0xff, 0xfb, 0x90, 0xff, 0x0f, 0x03, 0x00, 0x20, 0x1b, 0x00, + 0xab, 0x66, 0x00, 0x3f, 0x93, 0xff, 0x43, 0x4c, 0x1c, 0x50, 0xa0, 0x1e, 0x78, 0x92, 0x03, 0x27, + 0x69, 0x07, 0xd4, 0x96, 0x00, 0x5f, 0xa6, 0xfe, 0x06, 0x91, 0x02, 0xf2, 0xa0, 0xf8, 0x4b, 0xfb, + 0xf4, 0xd7, 0x2a, 0xfd, 0x65, 0x79, 0x02, 0x13, 0xff, 0xfd, 0xb9, 0xc0, 0xfd, 0x9b, 0x84, 0xfb, + 0x96, 0xa9, 0xfc, 0xe5, 0x2b, 0xff, 0x32, 0x5a, 0xff, 0xe7, 0x6b, 0x00, 0xb9, 0x1a, 0x00, 0x26, + 0x41, 0xff, 0x8b, 0x71, 0xfe, 0x27, 0x96, 0xff, 0x30, 0x9d, 0xfe, 0x06, 0x20, 0xff, 0xde, 0x7c, + 0xfe, 0xb6, 0x0d, 0xfe, 0x3a, 0xe4, 0xfe, 0x99, 0x27, 0xff, 0x3c, 0xd2, 0xff, 0x24, 0x0b, 0x00, + 0x65, 0x55, 0x00, 0xdb, 0x98, 0xff, 0x03, 0xd7, 0x1c, 0x15, 0x53, 0x1f, 0x3c, 0x95, 0x04, 0xb0, + 0xca, 0x08, 0xf1, 0x68, 0x01, 0xd7, 0xf7, 0xfd, 0x1d, 0x5e, 0x01, 0xad, 0xe2, 0xf7, 0xb7, 0x75, + 0xf5, 0x52, 0xa6, 0xfe, 0xf0, 0xd8, 0x00, 0xa9, 0xdf, 0xfb, 0xdf, 0x36, 0xfe, 0x2e, 0xc9, 0xfc, + 0x8b, 0xae, 0xfd, 0x35, 0xef, 0xfe, 0xb2, 0x3c, 0xfe, 0x97, 0x20, 0x00, 0xa0, 0x69, 0x00, 0xa8, + 0x68, 0xff, 0xec, 0xd8, 0xfe, 0x8b, 0x9b, 0xff, 0x56, 0x69, 0xfe, 0x47, 0x12, 0xff, 0x91, 0x41, + 0xfe, 0xe9, 0xd9, 0xfd, 0xfc, 0xcb, 0xfe, 0x13, 0xb3, 0xfe, 0x27, 0x76, 0xff, 0x8a, 0xfc, 0xff, + 0xda, 0x55, 0x00, 0x45, 0x90, 0xff, 0x80, 0x61, 0x1e, 0x1a, 0x5f, 0x1f, 0x26, 0x0f, 0x04, 0x6a, + 0x68, 0x0a, 0x05, 0x30, 0x02, 0x34, 0xb2, 0xfd, 0x05, 0x37, 0x00, 0xa3, 0xf4, 0xf6, 0x8d, 0x1a, + 0xf6, 0x1a, 0x99, 0x00, 0x23, 0xad, 0xff, 0x03, 0x4e, 0xf9, 0x05, 0x2a, 0xfe, 0xc6, 0x76, 0xfd, + 0x71, 0x2c, 0xff, 0xb1, 0x4a, 0xff, 0x91, 0x35, 0xfd, 0x20, 0xe2, 0xff, 0x66, 0xc9, 0x00, 0x9b, + 0x24, 0xff, 0xdc, 0xe0, 0xfe, 0x50, 0xde, 0xff, 0x05, 0x3e, 0xfe, 0x16, 0xf4, 0xfe, 0x73, 0xb5, + 0xfd, 0x58, 0x7f, 0xfd, 0x8f, 0xc4, 0xfe, 0xf7, 0x7c, 0xfe, 0x31, 0x24, 0xff, 0x02, 0xe2, 0xff, + 0x28, 0x29, 0x00, 0x51, 0x4c, 0xff, 0xfa, 0x07, 0x21, 0x46, 0x8f, 0x1f, 0xcd, 0x16, 0x02, 0xb4, + 0x70, 0x0b, 0x95, 0x20, 0x02, 0x43, 0xbd, 0xfd, 0x86, 0x5d, 0x00, 0xb9, 0xbb, 0xf5, 0xf0, 0xd4, + 0xf6, 0x84, 0x6a, 0x03, 0x16, 0x8f, 0xff, 0x4b, 0x20, 0xf6, 0x47, 0x33, 0xfd, 0x54, 0xf2, 0xfd, + 0x62, 0x4d, 0x00, 0x83, 0x7e, 0x00, 0xd4, 0xd4, 0xfc, 0x79, 0x4b, 0xff, 0xd6, 0x05, 0x01, 0x23, + 0xea, 0xfe, 0xeb, 0x8e, 0xfe, 0xc1, 0xf8, 0xff, 0xa7, 0xd8, 0xfd, 0xfa, 0xce, 0xfe, 0x14, 0x6a, + 0xfd, 0xde, 0x2c, 0xfd, 0x65, 0xe6, 0xfe, 0x1a, 0x75, 0xfe, 0xd8, 0xc9, 0xfe, 0x23, 0xd2, 0xff, + 0x66, 0x21, 0x00, 0x45, 0x10, 0xff, 0xce, 0x62, 0x24, 0xde, 0xdb, 0x21, 0xec, 0xd0, 0xfe, 0x9c, + 0xc6, 0x09, 0x8d, 0x8a, 0x01, 0xf2, 0xee, 0xfd, 0xf3, 0x5a, 0x02, 0x6c, 0x87, 0xf5, 0xed, 0xdf, + 0xf5, 0x69, 0x21, 0x05, 0x49, 0x8f, 0x01, 0xdf, 0xb1, 0xf4, 0x66, 0x64, 0xfb, 0x7a, 0xae, 0xfd, + 0x52, 0xfe, 0x00, 0x4a, 0x75, 0x01, 0x5d, 0x73, 0xfc, 0xd8, 0xac, 0xfe, 0x6e, 0x3e, 0x01, 0xb9, + 0xd3, 0xfe, 0x11, 0x12, 0xfe, 0xc7, 0x31, 0x00, 0xba, 0xb4, 0xfd, 0xf5, 0xa0, 0xfe, 0x44, 0x33, + 0xfd, 0xb2, 0xc4, 0xfc, 0x46, 0xf4, 0xfe, 0x34, 0x9a, 0xfe, 0xc8, 0xa4, 0xfe, 0xe1, 0xa1, 0xff, + 0xd8, 0x3a, 0x00, 0x0c, 0x1a, 0xff, 0x8b, 0x8d, 0x28, 0xcc, 0x10, 0x24, 0x1e, 0xcc, 0xfa, 0x59, + 0xc2, 0x07, 0x0d, 0xd1, 0xff, 0xa0, 0xa9, 0xfe, 0x85, 0x67, 0x05, 0x1a, 0x26, 0xf5, 0x57, 0x7c, + 0xf4, 0xea, 0x6f, 0x06, 0x54, 0x7d, 0x04, 0x29, 0x5e, 0xf4, 0xb0, 0x53, 0xf9, 0x3e, 0x73, 0xfc, + 0x08, 0x50, 0x01, 0xb0, 0x33, 0x02, 0xdf, 0xa2, 0xfb, 0x0b, 0x83, 0xfd, 0x5d, 0x81, 0x01, 0x44, + 0x3a, 0xff, 0x65, 0x69, 0xfd, 0xe0, 0x27, 0x00, 0x21, 0xb9, 0xfd, 0x08, 0xd9, 0xfe, 0x97, 0x39, + 0xfd, 0x15, 0x39, 0xfc, 0x0a, 0xdb, 0xfe, 0xed, 0xaf, 0xfe, 0xd1, 0xa1, 0xfe, 0x86, 0xb8, 0xff, + 0xa4, 0x66, 0x00, 0xaa, 0x04, 0xff, 0x40, 0x8c, 0x2b, 0x42, 0x15, 0x25, 0xe8, 0x8a, 0xf8, 0x76, + 0xd3, 0x06, 0xb1, 0xc7, 0xfd, 0x67, 0x8c, 0xff, 0x98, 0x27, 0x07, 0xbd, 0x13, 0xf5, 0x55, 0x7d, + 0xf3, 0xaf, 0xe9, 0x06, 0xa5, 0x76, 0x07, 0x44, 0x53, 0xf4, 0x99, 0xbd, 0xf7, 0x55, 0xad, 0xfa, + 0xab, 0xd1, 0x00, 0xec, 0xc8, 0x02, 0x43, 0x76, 0xfb, 0xe2, 0xaa, 0xfc, 0x2e, 0x1f, 0x01, 0x59, + 0x2c, 0xff, 0x7a, 0xfb, 0xfc, 0x4d, 0x56, 0x00, 0xd1, 0x9b, 0xfd, 0x9b, 0x1b, 0xff, 0xe6, 0x4c, + 0xfd, 0x8f, 0xbe, 0xfb, 0xee, 0xc6, 0xfe, 0xa9, 0x13, 0xff, 0x7e, 0xde, 0xfe, 0x3b, 0xb2, 0xff, + 0xa0, 0x38, 0x00, 0xd4, 0xcc, 0xfe, 0x84, 0x88, 0x2d, 0x74, 0x7f, 0x26, 0xfe, 0x9e, 0xf7, 0xe5, + 0x76, 0x05, 0xc8, 0xe0, 0xfb, 0xa1, 0x81, 0x00, 0xd8, 0xb5, 0x08, 0xa9, 0x85, 0xf5, 0xbd, 0xce, + 0xf1, 0xc0, 0x2b, 0x06, 0x35, 0x68, 0x0a, 0x1a, 0xa8, 0xf5, 0x3d, 0xb5, 0xf6, 0x03, 0xcb, 0xf7, + 0x61, 0xde, 0xff, 0x2c, 0x41, 0x04, 0x55, 0xe6, 0xfb, 0xb0, 0xe2, 0xfb, 0x42, 0x69, 0x00, 0x17, + 0xff, 0xfe, 0x63, 0xf5, 0xfc, 0xde, 0x72, 0x00, 0xcf, 0x43, 0xfd, 0xcc, 0x09, 0xff, 0x36, 0x5d, + 0xfd, 0xcc, 0xcc, 0xfb, 0xf8, 0xf9, 0xfe, 0xa2, 0x67, 0xff, 0x43, 0xff, 0xfe, 0xaf, 0xaf, 0xff, + 0x8c, 0x18, 0x00, 0xc1, 0x9a, 0xfe, 0xe1, 0xd7, 0x2e, 0xd4, 0x4e, 0x27, 0x4c, 0x72, 0xf8, 0x4d, + 0x9f, 0x04, 0x56, 0x93, 0xfa, 0xee, 0xc2, 0x00, 0x30, 0xea, 0x08, 0xfe, 0x9d, 0xf6, 0x8e, 0x0c, + 0xf0, 0x25, 0xf2, 0x04, 0xef, 0x7c, 0x0c, 0x29, 0xde, 0xf7, 0x34, 0x19, 0xf6, 0x67, 0x2f, 0xf5, + 0xae, 0x03, 0xff, 0x19, 0x5b, 0x05, 0x5d, 0x5a, 0xfd, 0x5f, 0x2d, 0xfb, 0x1a, 0xea, 0xff, 0xb4, + 0xec, 0xfe, 0xb7, 0xe5, 0xfc, 0xe8, 0x2d, 0x00, 0x89, 0xb8, 0xfc, 0x9b, 0x34, 0xff, 0x01, 0xb0, + 0xfd, 0x54, 0x03, 0xfc, 0x9d, 0xcd, 0xfe, 0x16, 0x8d, 0xff, 0xb3, 0x1a, 0xff, 0x3b, 0xd6, 0xff, + 0xb3, 0xdf, 0xff, 0x7f, 0x5a, 0xfe, 0xe2, 0xe5, 0x2e, 0x6a, 0x2d, 0x28, 0xda, 0xd3, 0xf9, 0x30, + 0x8d, 0x04, 0x00, 0xb3, 0xf9, 0x28, 0x70, 0x00, 0x7f, 0x89, 0x08, 0x84, 0x2d, 0xf7, 0xa7, 0xb4, + 0xee, 0x7d, 0x1e, 0x03, 0x05, 0x75, 0x0d, 0x50, 0xa4, 0xfa, 0x0f, 0x65, 0xf6, 0x96, 0xe8, 0xf2, + 0x53, 0xf6, 0xfd, 0xa4, 0xdc, 0x05, 0x71, 0x50, 0xff, 0xbf, 0xd7, 0xfa, 0xa7, 0x06, 0xff, 0x25, + 0x3e, 0xff, 0x52, 0x6f, 0xfc, 0xb2, 0xce, 0xff, 0xd5, 0xc6, 0xfc, 0x8b, 0x61, 0xff, 0x7d, 0xc4, + 0xfd, 0x27, 0x30, 0xfc, 0x44, 0x57, 0xfe, 0xd3, 0x7e, 0xff, 0x17, 0x46, 0xff, 0xe7, 0x7c, 0xff, + 0x96, 0xdc, 0xff, 0xf4, 0x52, 0xfe, 0x72, 0xd7, 0x2d, 0x69, 0xce, 0x28, 0x92, 0x97, 0xfc, 0x41, + 0x98, 0x05, 0x55, 0x11, 0xf9, 0x62, 0xe6, 0xff, 0x01, 0xc9, 0x07, 0x07, 0x38, 0xf7, 0xe0, 0xad, + 0xed, 0xa4, 0xd3, 0x00, 0x30, 0x60, 0x0d, 0xb0, 0xa0, 0xfd, 0x8d, 0x1a, 0xf9, 0x41, 0xea, 0xf0, + 0xe6, 0xe8, 0xfb, 0x63, 0x52, 0x06, 0xb2, 0x26, 0x01, 0xb9, 0x9b, 0xfb, 0x7d, 0xcd, 0xfd, 0xf4, + 0x66, 0xff, 0x37, 0x8d, 0xfc, 0x02, 0xa7, 0xff, 0x4a, 0x2d, 0xfd, 0x65, 0xc2, 0xff, 0x06, 0xa0, + 0xfd, 0x02, 0xf4, 0xfb, 0xf4, 0x34, 0xfe, 0x3f, 0x06, 0xff, 0x59, 0x65, 0xff, 0xff, 0x27, 0xff, + 0x4a, 0x02, 0x00, 0xd0, 0xb0, 0xfe, 0x6b, 0x5f, 0x2c, 0xa3, 0x8c, 0x28, 0xae, 0xfc, 0xff, 0xf4, + 0x5f, 0x06, 0x5d, 0x5a, 0xf9, 0x3a, 0x56, 0xff, 0xaf, 0x77, 0x06, 0x43, 0x37, 0xf8, 0x54, 0x39, + 0xec, 0x19, 0x9b, 0xfe, 0xda, 0x42, 0x0c, 0x47, 0x6b, 0xff, 0x36, 0x1a, 0xfd, 0x21, 0x56, 0xf0, + 0x67, 0x03, 0xf9, 0x75, 0x54, 0x06, 0x6f, 0xef, 0x01, 0x9c, 0xd5, 0xfc, 0x09, 0xbf, 0xfd, 0xe1, + 0xf5, 0xfe, 0x3f, 0x6e, 0xfd, 0x87, 0x80, 0xff, 0x70, 0xea, 0xfc, 0x74, 0x21, 0x00, 0x22, 0xbf, + 0xfd, 0x9a, 0x84, 0xfb, 0x14, 0x10, 0xfe, 0xce, 0x6c, 0xfe, 0x26, 0x7b, 0xff, 0x0e, 0x92, 0xff, + 0x77, 0x2b, 0x00, 0xe7, 0x34, 0xff, 0x87, 0xa4, 0x2a, 0x1a, 0x43, 0x27, 0x1c, 0xc7, 0x02, 0xf9, + 0x0b, 0x07, 0xa4, 0x8b, 0xfa, 0x40, 0x48, 0xff, 0x1a, 0x7d, 0x04, 0x5b, 0x51, 0xf9, 0xfe, 0xb8, + 0xeb, 0x4b, 0x44, 0xfc, 0xce, 0x0c, 0x0b, 0xa8, 0xc2, 0xff, 0x22, 0x50, 0x00, 0x2a, 0xd5, 0xf1, + 0x52, 0x4e, 0xf5, 0xde, 0x33, 0x05, 0x10, 0x6a, 0x02, 0xa4, 0x0e, 0xfe, 0x2a, 0xbe, 0xfe, 0x7a, + 0x94, 0xfe, 0x1a, 0xcb, 0xfd, 0x67, 0x8b, 0xff, 0x2b, 0xa9, 0xfc, 0x1c, 0xdb, 0xff, 0x25, 0x9f, + 0xfd, 0x0d, 0x0f, 0xfb, 0xae, 0x36, 0xfe, 0x21, 0x5f, 0xfe, 0x02, 0xa1, 0xff, 0xf8, 0x2e, 0x00, + 0xdc, 0x5c, 0x00, 0xdc, 0x5b, 0xff, 0x5a, 0x70, 0x28, 0xd1, 0xbb, 0x25, 0xf8, 0x23, 0x04, 0x95, + 0x57, 0x09, 0x85, 0x1b, 0xfb, 0x7a, 0x8b, 0xfe, 0xd5, 0x1b, 0x04, 0x1a, 0x75, 0xf9, 0xb3, 0xba, + 0xec, 0x02, 0xaf, 0xf9, 0xfb, 0x35, 0x0a, 0x17, 0xe2, 0xff, 0x98, 0x56, 0x01, 0xbe, 0xe8, 0xf4, + 0x9d, 0xd5, 0xf1, 0x9a, 0xe3, 0x02, 0x16, 0x89, 0x03, 0x7e, 0x0d, 0xff, 0x56, 0x45, 0xff, 0x62, + 0xab, 0xfe, 0x8b, 0x13, 0xfe, 0xd4, 0xc7, 0xff, 0x51, 0x5f, 0xfc, 0x27, 0x7f, 0xfe, 0x56, 0x2c, + 0xfe, 0xcd, 0x52, 0xfb, 0xe8, 0x0f, 0xfe, 0x29, 0x99, 0xfe, 0xbc, 0xb5, 0xff, 0x2f, 0xa4, 0x00, + 0x3f, 0x36, 0x00, 0x80, 0x48, 0xff, 0xc9, 0x03, 0x27, 0x30, 0xfa, 0x24, 0x43, 0x2c, 0x03, 0x49, + 0x34, 0x0a, 0x3a, 0x36, 0xfd, 0xa5, 0xe4, 0xfc, 0x3b, 0xc1, 0x03, 0xd4, 0x5c, 0xfa, 0x17, 0x2a, + 0xef, 0x97, 0x90, 0xf8, 0x52, 0x3f, 0x09, 0xa6, 0x64, 0xff, 0xd8, 0x32, 0xff, 0x5d, 0x89, 0xf9, + 0x83, 0x81, 0xf1, 0x0d, 0xa2, 0xfe, 0x09, 0xdd, 0x03, 0x8f, 0x00, 0x00, 0x7a, 0x2e, 0x00, 0xb8, + 0x22, 0xff, 0x20, 0xe7, 0xfd, 0x54, 0x75, 0xff, 0x72, 0x33, 0xfc, 0xb4, 0xd2, 0xfd, 0xb8, 0xed, + 0xfe, 0xf5, 0xf1, 0xfb, 0x50, 0x16, 0xfe, 0xba, 0x41, 0xff, 0x8f, 0x45, 0xff, 0x3f, 0x77, 0x00, + 0xca, 0x37, 0x00, 0x5b, 0x33, 0xff, 0x81, 0x4f, 0x25, 0x45, 0x21, 0x24, 0x48, 0xfe, 0x01, 0xf0, + 0x52, 0x0a, 0x44, 0x4d, 0xff, 0x50, 0x76, 0xfd, 0x06, 0xcb, 0x01, 0x72, 0xcd, 0xf9, 0x17, 0xe6, + 0xf3, 0x25, 0x24, 0xf8, 0x70, 0xc8, 0x07, 0x55, 0x3b, 0x00, 0xb3, 0xf3, 0xfb, 0x27, 0xb7, 0xfc, + 0x28, 0x54, 0xf4, 0x54, 0x76, 0xfa, 0x8b, 0x16, 0x03, 0xd9, 0x7e, 0x00, 0xbe, 0xc4, 0xff, 0xb7, + 0x7a, 0x00, 0x73, 0x6c, 0xfe, 0xba, 0x0b, 0xfe, 0x73, 0x65, 0xfc, 0x25, 0xf6, 0xfd, 0x60, 0xb1, + 0xff, 0x95, 0x46, 0xfd, 0xb6, 0x43, 0xfd, 0x93, 0x2d, 0xff, 0x59, 0x77, 0xff, 0x73, 0x36, 0x00, + 0x48, 0x33, 0x00, 0x3e, 0x4e, 0xff, 0x7c, 0x5b, 0x23, 0x14, 0xb0, 0x21, 0xe1, 0xde, 0x01, 0x8e, + 0x54, 0x0b, 0x68, 0x89, 0x00, 0xa2, 0x5c, 0xfd, 0xe4, 0x76, 0x01, 0x98, 0x2e, 0xfa, 0x25, 0x49, + 0xf5, 0x0d, 0xeb, 0xf8, 0x5e, 0xd6, 0x06, 0xfb, 0x1a, 0x01, 0xa1, 0x0b, 0xfb, 0xdf, 0x4c, 0xfd, + 0x3f, 0xf7, 0xf7, 0x10, 0x7e, 0xf8, 0x59, 0x2f, 0x01, 0x46, 0xc1, 0x00, 0x6f, 0xf9, 0xfe, 0x89, + 0x5c, 0x00, 0xee, 0xef, 0xfe, 0xa2, 0x6b, 0xfe, 0xe8, 0xac, 0xfc, 0x3a, 0xfe, 0xfd, 0xae, 0x0f, + 0x00, 0x12, 0x12, 0xfe, 0x9f, 0xb4, 0xfc, 0x96, 0x1d, 0xff, 0xf2, 0xcd, 0xff, 0x0d, 0xf7, 0xff, + 0x6a, 0x5d, 0x00, 0x26, 0x52, 0xff, 0xf5, 0x5b, 0x20, 0xab, 0xdd, 0x1e, 0xc4, 0x9e, 0x02, 0x94, + 0x45, 0x0c, 0xe5, 0x07, 0x01, 0x87, 0xe6, 0xfc, 0x54, 0x32, 0x02, 0x18, 0x20, 0xfc, 0x8a, 0x14, + 0xf6, 0x80, 0x0f, 0xf8, 0xa5, 0x28, 0x05, 0x6a, 0x6e, 0x02, 0xff, 0x7e, 0xfb, 0xe7, 0x3e, 0xfd, + 0xb7, 0xd6, 0xfa, 0x14, 0x96, 0xf8, 0xb8, 0x1a, 0x00, 0xe1, 0xc8, 0x00, 0x9d, 0xfc, 0xfd, 0x72, + 0x5b, 0xff, 0xeb, 0x8c, 0xfe, 0x19, 0xcd, 0xfe, 0xfd, 0x34, 0xfe, 0xc1, 0x20, 0xfe, 0x4b, 0xd8, + 0xfe, 0x1f, 0x65, 0xfe, 0x3e, 0x8d, 0xfd, 0x91, 0x8b, 0xff, 0xdc, 0xdc, 0xff, 0x83, 0xc4, 0xff, + 0x80, 0x60, 0x00, 0x43, 0x2c, 0xff, 0x26, 0x7d, 0x1d, 0xb4, 0xb6, 0x19, 0x4a, 0x10, 0x02, 0x53, + 0x87, 0x0f, 0x32, 0x22, 0x01, 0x21, 0x6c, 0xfb, 0xf3, 0x86, 0x03, 0x78, 0xec, 0xfe, 0xf5, 0x71, + 0xf7, 0x67, 0x68, 0xf6, 0xc1, 0x01, 0x03, 0x87, 0x88, 0x03, 0xe1, 0xe0, 0xfc, 0xa5, 0x4b, 0xff, + 0xc2, 0x3b, 0xfc, 0xae, 0xed, 0xf6, 0x15, 0x72, 0x00, 0xc4, 0x98, 0x01, 0x97, 0x18, 0xfd, 0x46, + 0x17, 0xff, 0x2e, 0xc1, 0xfd, 0xa1, 0x0b, 0xfe, 0x06, 0xf7, 0xfe, 0x2e, 0x62, 0xfe, 0xe8, 0x39, + 0xff, 0x3e, 0xfd, 0xfe, 0x43, 0xb4, 0xfd, 0x08, 0x8a, 0x00, 0x7b, 0x8c, 0x00, 0x49, 0x84, 0xff, + 0xff, 0xf7, 0xff, 0xcb, 0x29, 0xff, 0x69, 0xb1, 0x19, 0x6e, 0xb7, 0x18, 0x9e, 0xea, 0x04, 0xe2, + 0x23, 0x0e, 0x46, 0x8f, 0x00, 0xad, 0x77, 0xfb, 0x2d, 0x03, 0x03, 0x16, 0xb9, 0xfd, 0xdf, 0x31, + 0xf9, 0xfa, 0x00, 0xf9, 0xa5, 0x29, 0x00, 0x0a, 0x9d, 0x01, 0xd7, 0x47, 0xfe, 0x8d, 0x23, 0x00, + 0xf5, 0x1d, 0xfe, 0x17, 0x99, 0xf8, 0x1b, 0xb1, 0xfd, 0x4e, 0x50, 0x01, 0x75, 0xc8, 0xff, 0xf4, + 0x4d, 0xff, 0x4e, 0xa0, 0xfd, 0x25, 0x79, 0xfe, 0x67, 0x1f, 0xff, 0xba, 0x01, 0xff, 0xfe, 0x4d, + 0xff, 0xa4, 0xde, 0xfe, 0x56, 0x36, 0xfe, 0x5a, 0xa2, 0xff, 0xd5, 0x19, 0x00, 0xda, 0x76, 0xff, + 0x4a, 0xf9, 0xff, 0x31, 0x7e, 0xff, 0x24, 0x44, 0x17, 0x77, 0xc7, 0x16, 0x82, 0xd3, 0x04, 0xa7, + 0x60, 0x0c, 0xcc, 0x46, 0x01, 0xeb, 0xcd, 0xfd, 0x4c, 0xbf, 0x02, 0x9e, 0x4e, 0xfd, 0xfe, 0xf8, + 0xf9, 0xb9, 0xfe, 0xf9, 0x6a, 0xf2, 0xff, 0xd8, 0xa3, 0x00, 0xe9, 0x82, 0xfe, 0x14, 0xc5, 0xff, + 0x32, 0xfb, 0xfe, 0x19, 0xa1, 0xfa, 0x65, 0x7a, 0xfd, 0x24, 0x8f, 0x01, 0x9b, 0x23, 0x00, 0xdc, + 0xb5, 0xfe, 0xdf, 0x0a, 0xfe, 0x5b, 0x1f, 0xff, 0x44, 0x21, 0xff, 0x6e, 0xc1, 0xfe, 0x74, 0x9a, + 0xfe, 0xf6, 0xc1, 0xfe, 0x23, 0xf6, 0xfe, 0x4c, 0x61, 0xff, 0x44, 0x68, 0xff, 0x71, 0x80, 0xff, + 0x24, 0x3f, 0x00, 0x48, 0xa9, 0xff, 0xb0, 0x61, 0x15, 0x89, 0xff, 0x14, 0xa9, 0x71, 0x04, 0x14, + 0x34, 0x0a, 0xf7, 0x1a, 0x02, 0xbf, 0xd2, 0xff, 0xc8, 0x15, 0x02, 0xd9, 0x19, 0xfd, 0x5d, 0x48, + 0xfa, 0xaa, 0x0c, 0xfb, 0xe9, 0x20, 0x00, 0x83, 0xf1, 0xff, 0x42, 0xbf, 0xfe, 0x2e, 0x95, 0xff, + 0x45, 0x65, 0xff, 0x83, 0xcd, 0xfb, 0xe9, 0x0e, 0xfe, 0x4d, 0xbe, 0x01, 0x31, 0x09, 0x00, 0x64, + 0xb5, 0xfe, 0x60, 0x88, 0xfe, 0x15, 0x63, 0xff, 0x99, 0x01, 0xff, 0x10, 0x98, 0xfe, 0xd5, 0x2d, + 0xfe, 0xd4, 0x8e, 0xfe, 0x36, 0xf9, 0xfe, 0x74, 0x29, 0xff, 0x9f, 0x80, 0xff, 0x59, 0xbf, 0xff, + 0x1e, 0x38, 0x00, 0xf8, 0xc2, 0xff, 0x18, 0x52, 0x13, 0xbd, 0x6f, 0x13, 0xb2, 0xba, 0x03, 0xae, + 0x9d, 0x08, 0xa0, 0x46, 0x03, 0x86, 0x8f, 0x00, 0x16, 0xa1, 0x01, 0x99, 0x36, 0xfd, 0xe1, 0x9d, + 0xfa, 0x03, 0x5d, 0xfc, 0x36, 0x46, 0x00, 0x79, 0x6d, 0xff, 0x03, 0x40, 0xff, 0x3b, 0xe4, 0xff, + 0x3a, 0x71, 0xff, 0xd6, 0xbe, 0xfc, 0x91, 0xed, 0xfe, 0xda, 0xa0, 0x01, 0x61, 0xf5, 0xff, 0xad, + 0xb8, 0xfe, 0xab, 0xc3, 0xfe, 0x96, 0xb4, 0xff, 0xbd, 0xec, 0xfe, 0x6f, 0x8c, 0xfe, 0x27, 0x30, + 0xfe, 0xcc, 0xba, 0xfe, 0x62, 0x04, 0xff, 0x7a, 0x09, 0xff, 0x5f, 0xbc, 0xff, 0xb8, 0xff, 0xff, + 0x03, 0x35, 0x00, 0x50, 0xb3, 0xff, 0x3d, 0xab, 0x11, 0xa8, 0x98, 0x11, 0xa5, 0x3c, 0x03, 0x03, + 0x35, 0x08, 0x81, 0x5d, 0x03, 0x5d, 0x69, 0x00, 0x59, 0x7b, 0x01, 0xc4, 0x6a, 0xfd, 0x28, 0x27, + 0xfb, 0x01, 0x62, 0xfd, 0x98, 0x3b, 0x00, 0x27, 0xfb, 0xfe, 0xf9, 0xcd, 0xff, 0xaa, 0x33, 0x00, + 0x52, 0x6f, 0xff, 0x86, 0xa8, 0xfd, 0x61, 0x49, 0xff, 0xb1, 0xe0, 0x00, 0xc9, 0xba, 0xff, 0xd9, + 0xfa, 0xfe, 0x6c, 0xfc, 0xfe, 0x57, 0xad, 0xff, 0x01, 0xe8, 0xfe, 0x0d, 0xe1, 0xfe, 0x11, 0xa4, + 0xfe, 0xf2, 0xf8, 0xfe, 0x22, 0xe1, 0xfe, 0x34, 0xe2, 0xfe, 0x22, 0xb4, 0xff, 0xf2, 0x08, 0x00, + 0xf9, 0x2f, 0x00, 0x61, 0x9a, 0xff, 0x3c, 0xa4, 0x0f, 0xdf, 0xfb, 0x0f, 0x8c, 0x30, 0x03, 0x57, + 0x5e, 0x07, 0xbf, 0xf6, 0x02, 0x2c, 0xca, 0x00, 0xd9, 0xb2, 0x01, 0x62, 0x8d, 0xfd, 0x97, 0xa1, + 0xfb, 0xde, 0x32, 0xfe, 0x2d, 0x7b, 0x00, 0x39, 0x06, 0xff, 0xfd, 0x77, 0x00, 0x43, 0x6d, 0x00, + 0xb9, 0x76, 0xff, 0xb7, 0x80, 0xfe, 0x90, 0x3e, 0xff, 0x22, 0x45, 0x00, 0xda, 0xd3, 0xff, 0xaa, + 0x32, 0xff, 0x29, 0x13, 0xff, 0xe9, 0xdd, 0xff, 0xda, 0x53, 0xff, 0x8c, 0x54, 0xff, 0x46, 0xd8, + 0xfe, 0xe7, 0xd2, 0xfe, 0xd7, 0xce, 0xfe, 0x96, 0xfd, 0xfe, 0x15, 0xc3, 0xff, 0x29, 0xef, 0xff, + 0xa3, 0x13, 0x00, 0x07, 0xb7, 0xff, 0x82, 0xac, 0x0d, 0x91, 0xfe, 0x0d, 0x63, 0x6c, 0x03, 0x52, + 0xb1, 0x06, 0xaf, 0x89, 0x02, 0x28, 0x56, 0x01, 0x45, 0xdd, 0x01, 0x38, 0xd6, 0xfd, 0xb4, 0x30, + 0xfc, 0x41, 0x20, 0xff, 0xb7, 0x3b, 0x01, 0x21, 0x64, 0xff, 0x35, 0xe6, 0x00, 0xdf, 0x90, 0x00, + 0x29, 0xa1, 0xff, 0x5f, 0x39, 0xff, 0x19, 0x63, 0xff, 0xbf, 0xd4, 0xff, 0x01, 0xc8, 0xff, 0x2f, + 0x75, 0xff, 0xdc, 0x78, 0xff, 0x32, 0x2e, 0x00, 0xd6, 0x60, 0xff, 0xef, 0x78, 0xff, 0xa4, 0x0a, + 0xff, 0xaf, 0xdd, 0xfe, 0xc9, 0x09, 0xff, 0xe4, 0x2d, 0xff, 0x38, 0xb2, 0xff, 0xb2, 0xea, 0xff, + 0x69, 0x0f, 0x00, 0x08, 0xca, 0xff, 0xe9, 0x3b, 0x0c, 0x6e, 0x4d, 0x0c, 0x82, 0x22, 0x03, 0x9a, + 0xdf, 0x05, 0xa6, 0x0d, 0x02, 0xaa, 0x87, 0x01, 0xe3, 0x44, 0x02, 0x1f, 0x50, 0xfe, 0xd7, 0x1b, + 0xfd, 0x6b, 0x76, 0x00, 0x9e, 0x3f, 0x02, 0xb8, 0x02, 0x00, 0xa8, 0x01, 0x01, 0xe2, 0xb1, 0x00, + 0x01, 0xd4, 0xff, 0x5c, 0x8c, 0xff, 0x96, 0x4b, 0xff, 0xa8, 0x7b, 0xff, 0x0e, 0x15, 0x00, 0x9b, + 0xde, 0xff, 0x97, 0x75, 0xff, 0x25, 0x18, 0x00, 0x8f, 0x8d, 0xff, 0x7c, 0xc0, 0xff, 0x65, 0x3f, + 0xff, 0xd3, 0xeb, 0xfe, 0x7e, 0x39, 0xff, 0xef, 0x55, 0xff, 0xe3, 0xbf, 0xff, 0xf1, 0x03, 0x00, + 0xaa, 0x0d, 0x00, 0x2f, 0xa7, 0xff, 0xb7, 0xab, 0x0b, 0x24, 0x4a, 0x0b, 0x03, 0x53, 0x02, 0x59, + 0xf9, 0x04, 0x3d, 0xc7, 0x01, 0x20, 0xd0, 0x01, 0x2e, 0xf3, 0x02, 0x91, 0xa4, 0xff, 0xc4, 0x1a, + 0xfe, 0xa4, 0x47, 0x01, 0x9e, 0xfc, 0x02, 0x14, 0x5b, 0x00, 0x5f, 0xe6, 0x00, 0x99, 0x19, 0x00, + 0x85, 0x74, 0xff, 0xc1, 0xb5, 0xff, 0x6d, 0xaa, 0xff, 0x46, 0xc0, 0xff, 0x4d, 0x21, 0x00, 0x4f, + 0xd5, 0xff, 0xe1, 0x74, 0xff, 0x85, 0x19, 0x00, 0x7e, 0xa6, 0xff, 0xdb, 0xe6, 0xff, 0x44, 0x5c, + 0xff, 0x7d, 0x10, 0xff, 0xcd, 0x7d, 0xff, 0xf9, 0xaa, 0xff, 0x72, 0xdf, 0xff, 0x4e, 0xf1, 0xff, + 0x77, 0xc4, 0xff, 0x6d, 0x3f, 0xff, 0x3a, 0x16, 0x0b, 0x41, 0xa0, 0x0a, 0x46, 0xe7, 0x01, 0x99, + 0x32, 0x05, 0xf5, 0x8b, 0x02, 0xcf, 0x5b, 0x02, 0x3f, 0x5e, 0x03, 0x61, 0x35, 0x00, 0x59, 0xe5, + 0xfe, 0xdb, 0xb1, 0x01, 0x9f, 0xd5, 0x02, 0xde, 0xe2, 0xff, 0xcc, 0x19, 0x00, 0x0b, 0x79, 0xff, + 0xb0, 0xa5, 0xff, 0x77, 0x4f, 0x00, 0xd1, 0xe6, 0xff, 0xb5, 0x99, 0xff, 0x48, 0xc3, 0xff, 0x46, + 0xb5, 0xff, 0x1a, 0x8f, 0xff, 0x6b, 0x2d, 0x00, 0xc7, 0xc0, 0xff, 0x11, 0x2d, 0x00, 0x0e, 0xba, + 0xff, 0x70, 0x30, 0xff, 0xef, 0x7a, 0xff, 0xeb, 0x92, 0xff, 0xf6, 0xa8, 0xff, 0x2b, 0x9d, 0xff, + 0x3a, 0x85, 0xff, 0x0c, 0x3f, 0xff, 0x12, 0x30, 0x0b, 0x82, 0x85, 0x0b, 0x6c, 0xf8, 0x02, 0x21, + 0xca, 0x05, 0x01, 0xc9, 0x02, 0xec, 0x9b, 0x02, 0xb5, 0x55, 0x03, 0x45, 0x96, 0xff, 0xc3, 0x19, + 0xfe, 0x6a, 0x1c, 0x01, 0xef, 0x76, 0x02, 0x79, 0xb2, 0xff, 0x27, 0xfa, 0xff, 0xc1, 0x56, 0xff, + 0xd1, 0xc3, 0xff, 0x45, 0x5e, 0x00, 0xd9, 0x9f, 0xff, 0x82, 0x66, 0xff, 0x31, 0xd5, 0xff, 0x6b, + 0xc6, 0xff, 0x37, 0xa2, 0xff, 0x94, 0x5e, 0x00, 0x93, 0xd0, 0xff, 0xc3, 0x3a, 0x00, 0x8e, 0xf0, + 0xff, 0xc9, 0x3f, 0xff, 0xbc, 0x4c, 0xff, 0x22, 0x3b, 0xff, 0x66, 0x37, 0xff, 0x52, 0x74, 0xff, + 0x61, 0x9d, 0xff, 0xc9, 0x68, 0xff, 0x0d, 0xae, 0x0b, 0x9c, 0x19, 0x0c, 0xa8, 0x4f, 0x03, 0x65, + 0xb3, 0x05, 0xb5, 0x8d, 0x02, 0x76, 0xb2, 0x02, 0x66, 0x79, 0x03, 0xac, 0x6d, 0xff, 0x54, 0x77, + 0xfd, 0xbd, 0x21, 0x00, 0xce, 0xea, 0x01, 0x05, 0xe1, 0xff, 0x2a, 0x28, 0x00, 0x10, 0x4f, 0xff, + 0x80, 0xc5, 0xff, 0x7f, 0x84, 0x00, 0x9b, 0xeb, 0xff, 0x19, 0x98, 0xff, 0x30, 0xcc, 0xff, 0xe1, + 0xac, 0xff, 0xa7, 0xa5, 0xff, 0xd9, 0x33, 0x00, 0xc5, 0x7d, 0xff, 0x09, 0x25, 0x00, 0xca, 0x3e, + 0x00, 0x8f, 0xac, 0xff, 0xd8, 0x53, 0xff, 0x10, 0xf7, 0xfe, 0x08, 0x0a, 0xff, 0x45, 0x56, 0xff, + 0x32, 0x94, 0xff, 0x89, 0x7e, 0xff, 0x8e, 0xd1, 0x0b, 0x33, 0x16, 0x0c, 0x2b, 0x9f, 0x02, 0x5b, + 0x12, 0x05, 0xea, 0x44, 0x02, 0x81, 0x9a, 0x02, 0xdf, 0x8a, 0x03, 0xfb, 0x6c, 0xff, 0xa3, 0x43, + 0xfd, 0xd2, 0x81, 0x00, 0xca, 0x99, 0x02, 0x2d, 0x98, 0xff, 0x6a, 0x85, 0xff, 0xf4, 0xdf, 0xfe, + 0x94, 0x73, 0xff, 0x9b, 0xe7, 0x00, 0x71, 0xbe, 0x00, 0x95, 0x14, 0x00, 0xaa, 0x07, 0x00, 0x97, + 0xbb, 0xff, 0x5d, 0x6a, 0xff, 0x41, 0xf1, 0xff, 0xea, 0x59, 0xff, 0x42, 0xdc, 0xff, 0x7d, 0xc7, + 0xff, 0x6e, 0xc9, 0xff, 0xba, 0x18, 0x00, 0x1e, 0x90, 0xff, 0x57, 0x28, 0xff, 0xd1, 0x31, 0xff, + 0x2a, 0x65, 0xff, 0x97, 0x52, 0xff, 0x7d, 0x8c, 0x0c, 0xd2, 0xf1, 0x0c, 0x46, 0x7b, 0x02, 0x76, + 0x6f, 0x04, 0xff, 0x4b, 0x01, 0xb2, 0xed, 0x01, 0x12, 0x2a, 0x03, 0x6b, 0x16, 0xff, 0x49, 0xb5, + 0xfc, 0x5f, 0xff, 0xff, 0xc1, 0x25, 0x03, 0xb5, 0x7b, 0x00, 0x02, 0xe3, 0xff, 0x60, 0x7a, 0xfe, + 0x41, 0xdc, 0xfe, 0xfb, 0x8f, 0x00, 0xa3, 0xa0, 0x00, 0x84, 0x7f, 0x00, 0xba, 0xb2, 0x00, 0xa1, + 0x1e, 0x00, 0xaf, 0x9b, 0xff, 0x59, 0x22, 0x00, 0xba, 0x4d, 0xff, 0xd1, 0x98, 0xff, 0x69, 0x82, + 0xff, 0x21, 0x3f, 0xff, 0xbb, 0xcf, 0xff, 0xd4, 0x20, 0x00, 0x08, 0x19, 0x00, 0xbf, 0xe3, 0xff, + 0x02, 0x7e, 0xff, 0x2d, 0xfa, 0xfe, 0x79, 0xa7, 0x0d, 0x68, 0x5f, 0x0e, 0xaf, 0xad, 0x02, 0xb2, + 0x88, 0x04, 0x3d, 0x07, 0x01, 0xf0, 0x82, 0x01, 0xce, 0x90, 0x02, 0xfc, 0xf6, 0xfd, 0x5d, 0x4d, + 0xfb, 0x9e, 0xce, 0xfe, 0x1e, 0x5c, 0x03, 0xd2, 0xe1, 0x00, 0xec, 0xcc, 0xff, 0xeb, 0xaa, 0xfe, + 0x3a, 0x28, 0xff, 0xa7, 0x95, 0x00, 0xf1, 0x9c, 0x00, 0xa1, 0x32, 0x00, 0xb5, 0x55, 0x00, 0x8d, + 0x79, 0x00, 0x1e, 0xf9, 0xff, 0xf4, 0x51, 0x00, 0x04, 0x9d, 0xff, 0x8c, 0xbd, 0xff, 0x9d, 0x81, + 0xff, 0xcc, 0x16, 0xff, 0x51, 0x76, 0xff, 0x54, 0xde, 0xff, 0x04, 0x43, 0x00, 0x05, 0x95, 0x00, + 0x9c, 0x2f, 0x00, 0x53, 0x47, 0xff, 0x71, 0x31, 0x0f, 0x68, 0xfd, 0x0f, 0x60, 0xbf, 0x02, 0x47, + 0xec, 0x04, 0xb5, 0xfd, 0x00, 0xd1, 0x5a, 0x01, 0x76, 0x55, 0x02, 0x6a, 0x08, 0xfd, 0xba, 0xdf, + 0xf9, 0x20, 0xa5, 0xfd, 0x28, 0x90, 0x03, 0x6f, 0xbd, 0x00, 0x1c, 0x06, 0xff, 0x3a, 0x2a, 0xfe, + 0x21, 0xfd, 0xfe, 0x99, 0xed, 0x00, 0x94, 0x0b, 0x01, 0x12, 0x43, 0x00, 0xd3, 0x84, 0x00, 0xe5, + 0x6a, 0x00, 0x32, 0xb3, 0xff, 0xbd, 0x77, 0x00, 0x04, 0x91, 0xff, 0x75, 0xd8, 0xff, 0xaa, 0xc4, + 0xff, 0xf1, 0x38, 0xff, 0xc4, 0x84, 0xff, 0x98, 0x0e, 0x00, 0xdc, 0x23, 0x00, 0x06, 0x17, 0x00, + 0x9a, 0x55, 0x00, 0x27, 0xf2, 0xff, 0xa5, 0x40, 0x11, 0x6c, 0x7d, 0x11, 0xa2, 0x6e, 0x02, 0x76, + 0x8d, 0x05, 0x08, 0xef, 0x00, 0xdc, 0x79, 0x01, 0x88, 0x6e, 0x02, 0x41, 0x35, 0xfc, 0xbe, 0x6d, + 0xf8, 0xcc, 0xe3, 0xfc, 0xfa, 0x4a, 0x04, 0x44, 0x8a, 0x00, 0x0f, 0x06, 0xfe, 0xf5, 0x5d, 0xfd, + 0xdf, 0x72, 0xfe, 0x2b, 0x9b, 0x00, 0x8e, 0xfd, 0x00, 0x13, 0x31, 0x00, 0xcd, 0xb1, 0x00, 0x73, + 0xde, 0x00, 0xba, 0xab, 0xff, 0xc9, 0x46, 0x00, 0x90, 0x8a, 0xff, 0x55, 0xcd, 0xff, 0xe6, 0xc6, + 0xff, 0x95, 0x53, 0xff, 0x78, 0xc6, 0xff, 0xbf, 0x3a, 0x00, 0xae, 0xf8, 0xff, 0x3c, 0x0a, 0x00, + 0x3c, 0x12, 0x00, 0xbf, 0xc5, 0xff, 0x9c, 0x39, 0x14, 0xde, 0x4e, 0x13, 0x6e, 0x66, 0x01, 0x62, + 0x3e, 0x06, 0x8b, 0xbb, 0x00, 0x17, 0x80, 0x01, 0xf7, 0x69, 0x02, 0x06, 0x07, 0xfb, 0xee, 0x20, + 0xf7, 0xad, 0xa9, 0xfc, 0xde, 0x44, 0x05, 0x5a, 0x0e, 0x00, 0xad, 0x18, 0xfd, 0x7d, 0xb5, 0xfc, + 0xd3, 0x06, 0xfe, 0xdf, 0x3e, 0x00, 0xda, 0x97, 0x00, 0x1e, 0xc1, 0xff, 0x28, 0x83, 0x00, 0x79, + 0xac, 0x00, 0xb6, 0x55, 0xff, 0x79, 0x70, 0x00, 0xb8, 0xa5, 0xff, 0x4c, 0xcc, 0xff, 0x95, 0x9b, + 0xff, 0xc6, 0x33, 0xff, 0xbd, 0x9c, 0xff, 0x3f, 0x3c, 0x00, 0x8a, 0x0f, 0x00, 0xc8, 0x13, 0x00, + 0x07, 0x34, 0x00, 0xfc, 0xaa, 0xff, 0xaf, 0x43, 0x17, 0x15, 0x7c, 0x15, 0xaa, 0x10, 0x00, 0x81, + 0xd8, 0x06, 0x0d, 0xb8, 0x00, 0x54, 0x2b, 0x01, 0x1c, 0x66, 0x02, 0xca, 0xa2, 0xf9, 0xa6, 0x1e, + 0xf6, 0x14, 0xf4, 0xfc, 0x7c, 0x13, 0x06, 0x95, 0xa4, 0xff, 0x8e, 0x69, 0xfc, 0x2f, 0x0b, 0xfc, + 0xe6, 0xde, 0xfd, 0x9f, 0x2a, 0x00, 0xa7, 0x2c, 0x00, 0xf7, 0x92, 0xff, 0xf4, 0x39, 0x00, 0xf5, + 0x63, 0x00, 0x2d, 0xf9, 0xfe, 0x67, 0x58, 0x00, 0xb9, 0x8b, 0xff, 0x92, 0xb9, 0xff, 0xe0, 0x5c, + 0xff, 0xb7, 0xe9, 0xfe, 0xa2, 0x77, 0xff, 0x34, 0x16, 0x00, 0xcb, 0x20, 0x00, 0x99, 0x43, 0x00, + 0x9b, 0x8b, 0x00, 0x34, 0xf2, 0xff, 0xe6, 0xd4, 0x19, 0x7e, 0xed, 0x17, 0x35, 0x1b, 0xff, 0x69, + 0xfe, 0x06, 0x0e, 0xdc, 0x00, 0x71, 0xdf, 0x00, 0xc5, 0x6f, 0x02, 0xf7, 0x59, 0xf8, 0x26, 0x3a, + 0xf5, 0xb7, 0x46, 0xfd, 0xad, 0x67, 0x06, 0x0c, 0x5d, 0xff, 0xab, 0x22, 0xfc, 0xc7, 0x8c, 0xfb, + 0x09, 0xb7, 0xfd, 0x88, 0x19, 0x00, 0x55, 0xfe, 0xff, 0xc8, 0x76, 0xff, 0x77, 0x18, 0x00, 0x82, + 0x76, 0x00, 0xb5, 0xc9, 0xfe, 0xf6, 0xf7, 0xff, 0xf2, 0x14, 0xff, 0xe6, 0x9f, 0xff, 0x03, 0x16, + 0xff, 0x66, 0xad, 0xfe, 0x29, 0x7a, 0xff, 0xd7, 0x0a, 0x00, 0xf2, 0x27, 0x00, 0x05, 0x4f, 0x00, + 0x65, 0xa8, 0x00, 0x3c, 0xd9, 0xff, 0xe9, 0x98, 0x1b, 0xbc, 0x99, 0x1a, 0xa4, 0x58, 0xff, 0x3a, + 0xd0, 0x06, 0x4d, 0x7b, 0x00, 0x53, 0x53, 0x00, 0x85, 0xb9, 0x02, 0xac, 0x4d, 0xf7, 0x83, 0xd0, + 0xf4, 0x9a, 0x2e, 0xfd, 0x34, 0x37, 0x05, 0xc3, 0x5d, 0xff, 0x3b, 0xca, 0xfc, 0xba, 0xfa, 0xfa, + 0x97, 0x29, 0xfd, 0x27, 0xcb, 0xff, 0x19, 0x10, 0x00, 0xd8, 0x59, 0x00, 0xf6, 0xbb, 0xff, 0x46, + 0xf9, 0xff, 0xea, 0xbd, 0xfe, 0x8d, 0xc0, 0xff, 0x55, 0xa9, 0xfe, 0x76, 0x38, 0xff, 0xd5, 0xcb, + 0xfe, 0xb1, 0x87, 0xfe, 0x46, 0x74, 0xff, 0xb1, 0xfa, 0xff, 0x5c, 0x50, 0x00, 0xca, 0x1e, 0x00, + 0x61, 0x7c, 0x00, 0x70, 0xaa, 0xff, 0xa9, 0x23, 0x1c, 0x09, 0xaf, 0x1c, 0x75, 0xb2, 0x00, 0x25, + 0x16, 0x07, 0xf0, 0x80, 0x00, 0x07, 0x07, 0xff, 0x9c, 0xcf, 0x02, 0xe6, 0x61, 0xf7, 0x7e, 0x23, + 0xf5, 0x87, 0x34, 0xfd, 0x76, 0xee, 0x02, 0x63, 0xda, 0xfe, 0x09, 0xf0, 0xfd, 0x8a, 0x8e, 0xfb, + 0x9c, 0xd3, 0xfc, 0x64, 0x5f, 0xff, 0x48, 0xc5, 0xff, 0xdb, 0xf3, 0x00, 0xf5, 0xf8, 0xff, 0x16, + 0x7d, 0xff, 0x83, 0x9d, 0xfe, 0x21, 0x9c, 0xff, 0x5e, 0xd2, 0xfe, 0x2a, 0x3b, 0xff, 0x2e, 0xa7, + 0xfe, 0x46, 0x85, 0xfe, 0xec, 0x43, 0xff, 0x2f, 0x6b, 0xff, 0xd4, 0x36, 0x00, 0x88, 0x38, 0x00, + 0x1e, 0x81, 0x00, 0xc9, 0xa0, 0xff, 0xeb, 0x9b, 0x1c, 0x7e, 0xf8, 0x1d, 0xf3, 0x4e, 0x02, 0x82, + 0x21, 0x08, 0x31, 0xfa, 0x00, 0x7b, 0xb6, 0xfd, 0x8b, 0xc7, 0x01, 0x2e, 0x46, 0xf7, 0xe9, 0xc4, + 0xf5, 0x9a, 0x3d, 0xfe, 0xd1, 0x66, 0x00, 0x1e, 0x21, 0xfd, 0xe1, 0x01, 0xff, 0x53, 0xdb, 0xfc, + 0x05, 0x95, 0xfd, 0x57, 0x9d, 0xfe, 0xf3, 0xc4, 0xfe, 0x19, 0x3e, 0x01, 0xa4, 0x41, 0x00, 0xde, + 0x45, 0xff, 0xea, 0xe2, 0xfe, 0xbd, 0x94, 0xff, 0x43, 0xbe, 0xfe, 0x81, 0x4f, 0xff, 0x20, 0x77, + 0xfe, 0xde, 0x65, 0xfe, 0xc7, 0x1d, 0xff, 0x8d, 0xe0, 0xfe, 0xce, 0xea, 0xff, 0x21, 0x23, 0x00, + 0x77, 0x68, 0x00, 0xfa, 0x9c, 0xff, 0x41, 0x6c, 0x1d, 0x8c, 0x7f, 0x1e, 0xaf, 0x04, 0x03, 0x23, + 0xb8, 0x09, 0x31, 0xdc, 0x01, 0x32, 0x01, 0xfd, 0xd8, 0x71, 0x00, 0xe4, 0x5f, 0xf6, 0x96, 0x8f, + 0xf6, 0xac, 0xfd, 0xff, 0x41, 0x5a, 0xfe, 0x65, 0x11, 0xfb, 0x2a, 0x9b, 0xff, 0xa7, 0x1b, 0xfe, + 0x6c, 0xd3, 0xfe, 0x6e, 0x3f, 0xfe, 0x86, 0x74, 0xfd, 0x01, 0x09, 0x01, 0xc8, 0xce, 0x00, 0x8f, + 0x48, 0xff, 0xde, 0x2c, 0xff, 0xe7, 0xc7, 0xff, 0x77, 0xaa, 0xfe, 0xe2, 0x15, 0xff, 0x35, 0x13, + 0xfe, 0x12, 0x2f, 0xfe, 0x1e, 0x07, 0xff, 0xa7, 0x7d, 0xfe, 0xb8, 0x87, 0xff, 0xcf, 0x11, 0x00, + 0x00, 0x73, 0x00, 0x8c, 0xab, 0xff, 0xf4, 0x85, 0x1f, 0xc8, 0x33, 0x1e, 0x59, 0x22, 0x02, 0x17, + 0xdc, 0x0b, 0xb3, 0x7e, 0x02, 0xfd, 0x92, 0xfc, 0x2b, 0x14, 0xff, 0x61, 0x71, 0xf5, 0xf2, 0x7c, + 0xf7, 0xa0, 0x61, 0x02, 0xee, 0xb0, 0xfc, 0x86, 0xd9, 0xf7, 0xa1, 0xeb, 0xff, 0xb9, 0xdf, 0xfe, + 0x89, 0x9b, 0x00, 0xa0, 0x96, 0xfe, 0x2d, 0x29, 0xfc, 0x18, 0xea, 0x00, 0x0c, 0x40, 0x01, 0xdf, + 0xd5, 0xfe, 0xb1, 0x3d, 0xff, 0x5a, 0x11, 0x00, 0x66, 0x57, 0xfe, 0xae, 0x09, 0xff, 0xc2, 0x63, + 0xfd, 0xa5, 0xcd, 0xfd, 0x46, 0x12, 0xff, 0xa1, 0x3c, 0xfe, 0x41, 0x2f, 0xff, 0x01, 0x00, 0x00, + 0x78, 0x2f, 0x00, 0x72, 0x43, 0xff, 0x2f, 0x9b, 0x22, 0xcd, 0xea, 0x1d, 0x7d, 0xeb, 0xff, 0xbb, + 0x99, 0x0d, 0x65, 0x4c, 0x02, 0xe1, 0x91, 0xfc, 0x71, 0x2e, 0xff, 0xf0, 0xf9, 0xf3, 0x3d, 0x8e, + 0xf8, 0x0f, 0xa9, 0x05, 0x82, 0x01, 0xfc, 0x36, 0xf7, 0xf3, 0x60, 0x58, 0xff, 0x9d, 0xb2, 0xff, + 0xf0, 0x00, 0x02, 0x56, 0xc9, 0xff, 0x02, 0x6d, 0xfb, 0xc9, 0x5c, 0x00, 0xe1, 0x9f, 0x01, 0x8b, + 0x81, 0xfe, 0xce, 0x04, 0xff, 0x7d, 0x3c, 0x00, 0x38, 0xc0, 0xfd, 0x4f, 0xec, 0xfe, 0x6b, 0x23, + 0xfd, 0xca, 0x86, 0xfd, 0x76, 0x3a, 0xff, 0x62, 0x21, 0xfe, 0x60, 0xcf, 0xfe, 0xd5, 0xf8, 0xff, + 0xe0, 0x1e, 0x00, 0x3d, 0x0a, 0xff, 0x02, 0x88, 0x26, 0x31, 0x5f, 0x1f, 0x38, 0x1e, 0xfc, 0x0b, + 0x0e, 0x0d, 0x57, 0xf1, 0x01, 0x3b, 0xd9, 0xfc, 0xa6, 0xa5, 0x00, 0x92, 0x0b, 0xf3, 0x60, 0x60, + 0xf8, 0xb2, 0x60, 0x08, 0x47, 0x3e, 0xfd, 0x36, 0x38, 0xf1, 0xd7, 0xaf, 0xfd, 0xa0, 0xd7, 0xff, + 0x3d, 0xfa, 0x02, 0x38, 0x13, 0x01, 0x38, 0xf0, 0xfa, 0x15, 0x9d, 0xff, 0xb4, 0x00, 0x02, 0x43, + 0x3a, 0xfe, 0x33, 0x57, 0xfe, 0x3b, 0x97, 0x00, 0x64, 0x8e, 0xfd, 0x70, 0xb3, 0xfe, 0xf2, 0xb8, + 0xfc, 0x00, 0x0c, 0xfd, 0xce, 0x72, 0xff, 0x55, 0x47, 0xfe, 0xcb, 0x79, 0xfe, 0xe0, 0xd5, 0xff, + 0x39, 0x39, 0x00, 0x1c, 0xdb, 0xfe, 0x82, 0xd6, 0x2a, 0x16, 0x91, 0x22, 0x00, 0x07, 0xf7, 0x26, + 0x69, 0x0a, 0xf9, 0x01, 0x01, 0x9c, 0x6d, 0xfd, 0xc4, 0x92, 0x04, 0xd1, 0x88, 0xf2, 0x06, 0x16, + 0xf6, 0xb7, 0x1f, 0x0a, 0x55, 0x64, 0x00, 0x28, 0x25, 0xf0, 0x58, 0x76, 0xfb, 0xc8, 0x61, 0xff, + 0xb4, 0x52, 0x03, 0x6f, 0x07, 0x02, 0xbe, 0x5c, 0xfa, 0x7d, 0x85, 0xfe, 0xb0, 0x49, 0x02, 0xa7, + 0xa6, 0xfe, 0x46, 0xbf, 0xfd, 0xff, 0x93, 0x00, 0x3e, 0x73, 0xfd, 0xf7, 0xc9, 0xfe, 0xf6, 0xab, + 0xfc, 0x7a, 0x5c, 0xfc, 0x7d, 0x97, 0xff, 0xfe, 0x7d, 0xfe, 0x7c, 0x3e, 0xfe, 0x74, 0xa0, 0xff, + 0x60, 0x92, 0x00, 0x79, 0x12, 0xff, 0xa6, 0x33, 0x30, 0xf5, 0x9a, 0x23, 0xd4, 0x24, 0xf2, 0x14, + 0x6a, 0x09, 0x50, 0xca, 0xfe, 0xed, 0xd2, 0xfe, 0x17, 0x5b, 0x07, 0xee, 0x82, 0xf1, 0xe8, 0x33, + 0xf5, 0x93, 0xee, 0x0b, 0x1d, 0xbf, 0x03, 0x53, 0x3f, 0xef, 0x0e, 0xe7, 0xf8, 0x18, 0xd3, 0xfd, + 0x3a, 0x30, 0x04, 0xea, 0xc2, 0x02, 0xd1, 0xeb, 0xf8, 0xc6, 0x57, 0xfd, 0xa0, 0xe1, 0x02, 0xaa, + 0xd8, 0xfe, 0x83, 0xc5, 0xfc, 0xbc, 0xdd, 0x00, 0xce, 0x7e, 0xfd, 0xc1, 0x0b, 0xff, 0xf5, 0xaf, + 0xfc, 0xd6, 0xd1, 0xfb, 0xda, 0x61, 0xff, 0x1b, 0x8f, 0xfe, 0x73, 0x71, 0xfe, 0xa1, 0xe8, 0xff, + 0xb5, 0x8b, 0x00, 0xab, 0xb0, 0xfe, 0x9a, 0x81, 0x33, 0x27, 0x67, 0x24, 0xaa, 0x9f, 0xef, 0xce, + 0x99, 0x08, 0xdf, 0x71, 0xfc, 0xf2, 0x32, 0x00, 0x19, 0x40, 0x09, 0xc5, 0x4b, 0xf1, 0xa4, 0xe4, + 0xf3, 0x62, 0x73, 0x0c, 0x6d, 0x51, 0x07, 0xde, 0xd9, 0xee, 0xe5, 0x20, 0xf7, 0xce, 0xd5, 0xfb, + 0x8a, 0x9b, 0x03, 0x76, 0x92, 0x03, 0xd3, 0xdb, 0xf8, 0x2e, 0x5f, 0xfc, 0x60, 0x5b, 0x02, 0x14, + 0xcf, 0xfe, 0xb2, 0x5b, 0xfc, 0x71, 0x22, 0x01, 0x56, 0x49, 0xfd, 0x50, 0x64, 0xff, 0x3a, 0xbd, + 0xfc, 0x3b, 0x38, 0xfb, 0xad, 0x69, 0xff, 0x91, 0x1f, 0xff, 0x29, 0xa9, 0xfe, 0xfe, 0xc4, 0xff, + 0xb8, 0x4f, 0x00, 0xea, 0x7e, 0xfe, 0xfe, 0x32, 0x36, 0x2f, 0xa8, 0x25, 0x04, 0x27, 0xee, 0x18, + 0x26, 0x07, 0xc9, 0x2d, 0xfa, 0x8a, 0xcb, 0x01, 0x6d, 0x14, 0x0b, 0x44, 0x7f, 0xf1, 0x24, 0xd4, + 0xf1, 0x8d, 0xf9, 0x0b, 0xaf, 0xfa, 0x0a, 0xe2, 0xf1, 0xef, 0x50, 0xba, 0xf5, 0x77, 0x6d, 0xf8, + 0x2f, 0xea, 0x02, 0x59, 0x76, 0x05, 0x0c, 0x20, 0xf9, 0x42, 0x5d, 0xfb, 0xd8, 0x9d, 0x01, 0x33, + 0xac, 0xfe, 0x71, 0x59, 0xfc, 0xa0, 0x4a, 0x01, 0x7c, 0xe3, 0xfc, 0xcf, 0x68, 0xff, 0x65, 0xc1, + 0xfc, 0xe1, 0x3e, 0xfb, 0xaf, 0xb1, 0xff, 0x9e, 0x85, 0xff, 0x06, 0xc2, 0xfe, 0xa0, 0xba, 0xff, + 0x04, 0x28, 0x00, 0x8a, 0x49, 0xfe, 0x15, 0xf8, 0x37, 0x08, 0xb9, 0x26, 0x9b, 0x83, 0xee, 0xac, + 0xae, 0x05, 0x45, 0x9b, 0xf8, 0xfb, 0x99, 0x02, 0xff, 0xb1, 0x0b, 0x13, 0xbb, 0xf2, 0xef, 0x73, + 0xef, 0x2e, 0xce, 0x0a, 0xa5, 0x3d, 0x0e, 0x07, 0xec, 0xf1, 0xb8, 0x64, 0xf4, 0xd2, 0x3d, 0xf5, + 0x6b, 0x33, 0x02, 0xe8, 0x44, 0x07, 0xaa, 0x44, 0xfa, 0xdd, 0x3d, 0xfa, 0xed, 0x1e, 0x01, 0xa1, + 0x8f, 0xfe, 0x75, 0x67, 0xfc, 0x59, 0x25, 0x01, 0xb8, 0x22, 0xfc, 0xb9, 0x89, 0xff, 0x17, 0x3d, + 0xfd, 0x2d, 0x60, 0xfb, 0xf2, 0x9d, 0xff, 0x10, 0xd2, 0xff, 0x9f, 0xca, 0xfe, 0x40, 0xf5, 0xff, + 0xe1, 0xe6, 0xff, 0xbf, 0xf6, 0xfd, 0xf5, 0xcd, 0x38, 0xd8, 0xab, 0x27, 0x6e, 0xb1, 0xef, 0x68, + 0x02, 0x05, 0xbc, 0x76, 0xf7, 0xcc, 0x84, 0x02, 0xed, 0x99, 0x0b, 0x9c, 0xca, 0xf3, 0x8e, 0x68, + 0xed, 0x97, 0x52, 0x09, 0x46, 0x29, 0x10, 0xa9, 0xc2, 0xf4, 0x53, 0xb4, 0xf3, 0x48, 0x77, 0xf2, + 0xbc, 0x90, 0x01, 0x86, 0x31, 0x08, 0xc6, 0x51, 0xfc, 0x45, 0x57, 0xf9, 0xf1, 0x6b, 0x00, 0x53, + 0xd5, 0xfe, 0xe8, 0x0d, 0xfc, 0x3e, 0xa5, 0x00, 0x7b, 0xec, 0xfb, 0xd4, 0xdd, 0xff, 0xc3, 0x4c, + 0xfd, 0x83, 0xc3, 0xfb, 0xca, 0x20, 0xff, 0x92, 0xce, 0xff, 0x6b, 0x1c, 0xff, 0x37, 0xd3, 0xff, + 0xce, 0xa5, 0xff, 0xa1, 0xd8, 0xfd, 0xf7, 0x34, 0x38, 0xdc, 0xee, 0x28, 0xd2, 0xc0, 0xf1, 0x6a, + 0x20, 0x05, 0xfa, 0x66, 0xf6, 0x87, 0x1a, 0x02, 0x73, 0x0d, 0x0b, 0x38, 0x3d, 0xf4, 0x2a, 0xf3, + 0xeb, 0x74, 0xd6, 0x06, 0x03, 0x52, 0x11, 0xe3, 0x52, 0xf8, 0x1b, 0x8e, 0xf4, 0x93, 0x7c, 0xef, + 0x3d, 0x2b, 0x00, 0xd5, 0x0b, 0x09, 0xe8, 0xc2, 0xfe, 0xca, 0x03, 0xf9, 0x74, 0x0f, 0xff, 0x25, + 0x76, 0xff, 0x4f, 0x74, 0xfb, 0xff, 0x66, 0x00, 0x62, 0x41, 0xfc, 0x2c, 0x1a, 0x00, 0x8f, 0x54, + 0xfd, 0xad, 0xb3, 0xfb, 0xc4, 0xaf, 0xfe, 0x55, 0xb1, 0xff, 0xc5, 0x40, 0xff, 0x33, 0x3e, 0xff, + 0xf5, 0xe2, 0xff, 0x18, 0xe5, 0xfd, 0xc2, 0xfc, 0x36, 0xac, 0x9f, 0x29, 0x09, 0x14, 0xf5, 0x03, + 0xfc, 0x05, 0x45, 0x89, 0xf5, 0xda, 0x9c, 0x01, 0xaa, 0x20, 0x0a, 0xaf, 0x6d, 0xf4, 0xeb, 0xac, + 0xea, 0x2a, 0x4f, 0x04, 0x3f, 0x6a, 0x11, 0xa4, 0xd7, 0xfb, 0x4c, 0x78, 0xf7, 0xd0, 0xca, 0xec, + 0xf6, 0xfd, 0xfd, 0x04, 0xd5, 0x09, 0x6f, 0xd0, 0x00, 0x19, 0xb5, 0xf9, 0x06, 0x89, 0xfd, 0xbc, + 0xc6, 0xff, 0xdf, 0xa6, 0xfb, 0x17, 0x2d, 0x00, 0x21, 0xc2, 0xfc, 0xa3, 0x75, 0x00, 0xc7, 0x1b, + 0xfd, 0x3a, 0x7a, 0xfb, 0x63, 0x82, 0xfe, 0xbb, 0x26, 0xff, 0xec, 0x77, 0xff, 0xde, 0xd9, 0xfe, + 0x8d, 0x17, 0x00, 0x35, 0x5e, 0xfe, 0x73, 0x4c, 0x35, 0x7b, 0x7e, 0x29, 0xa0, 0x49, 0xf9, 0x3c, + 0x86, 0x06, 0x7a, 0x95, 0xf5, 0xf3, 0xe6, 0x00, 0x97, 0xae, 0x08, 0x72, 0xc0, 0xf5, 0x06, 0xbf, + 0xe8, 0x74, 0xd9, 0x01, 0x88, 0x6b, 0x10, 0x4e, 0x58, 0xfe, 0x60, 0x01, 0xfc, 0x5c, 0x4c, 0xeb, + 0x9b, 0xb9, 0xfa, 0xac, 0x54, 0x0a, 0xd5, 0xd2, 0x01, 0x69, 0x0c, 0xfb, 0x4c, 0x24, 0xfd, 0x73, + 0x4c, 0xff, 0xa7, 0xce, 0xfc, 0xd9, 0xd3, 0xff, 0xb8, 0x83, 0xfc, 0x1f, 0xf9, 0x00, 0x87, 0x33, + 0xfd, 0x62, 0xf6, 0xfa, 0x1a, 0x59, 0xfe, 0x1f, 0x72, 0xfe, 0xd4, 0xa5, 0xff, 0xdc, 0x47, 0xff, + 0x56, 0x3b, 0x00, 0x35, 0xfe, 0xfe, 0x9f, 0x25, 0x33, 0x54, 0x42, 0x29, 0x3a, 0x92, 0xfc, 0x46, + 0x32, 0x06, 0xa8, 0x58, 0xf7, 0x7c, 0x80, 0x00, 0x7a, 0x65, 0x06, 0x45, 0x58, 0xf7, 0xaa, 0x5e, + 0xe7, 0x21, 0x90, 0xff, 0x37, 0x3a, 0x0f, 0x26, 0x24, 0xff, 0x5f, 0x37, 0x00, 0xcc, 0xd4, 0xeb, + 0xc8, 0x7a, 0xf6, 0xf7, 0x02, 0x0a, 0x2c, 0x63, 0x02, 0xcf, 0x6e, 0xfc, 0x8b, 0xea, 0xfd, 0xff, + 0x92, 0xfe, 0xcb, 0x60, 0xfd, 0x3c, 0xdb, 0xff, 0x40, 0x38, 0xfc, 0xe1, 0xe3, 0x00, 0x6f, 0x14, + 0xfd, 0x18, 0x79, 0xfa, 0x53, 0x8e, 0xfe, 0x00, 0xee, 0xfd, 0x8d, 0xfb, 0xff, 0x13, 0xf0, 0xff, + 0x14, 0x40, 0x00, 0x42, 0x75, 0xff, 0x2c, 0xe3, 0x30, 0x09, 0xd0, 0x26, 0xe2, 0x4a, 0x00, 0x26, + 0x37, 0x08, 0xda, 0x93, 0xf7, 0xae, 0x1a, 0x00, 0xf8, 0xa7, 0x04, 0xd2, 0xa4, 0xf8, 0x4c, 0x9f, + 0xe7, 0x90, 0xf9, 0xfb, 0x28, 0x4f, 0x0e, 0x24, 0xca, 0xff, 0x0e, 0x3a, 0x03, 0x4f, 0x32, 0xee, + 0x43, 0x43, 0xf1, 0x0e, 0x84, 0x08, 0x9e, 0xab, 0x03, 0xa8, 0xc6, 0xfd, 0x8d, 0xda, 0xfe, 0xd7, + 0x4f, 0xfe, 0x3b, 0xf0, 0xfd, 0xc6, 0xcc, 0xff, 0x09, 0xcb, 0xfb, 0x5a, 0x23, 0x00, 0x8b, 0x53, + 0xfd, 0x7d, 0x0e, 0xfa, 0xa3, 0xa9, 0xfe, 0x32, 0x4a, 0xfe, 0x5e, 0xfc, 0xff, 0xb9, 0xbc, 0x00, + 0xcc, 0x68, 0x00, 0x96, 0x3c, 0xff, 0x41, 0x44, 0x2e, 0x8b, 0xed, 0x25, 0x51, 0xe7, 0x00, 0x56, + 0x83, 0x0a, 0x97, 0x9e, 0xf8, 0x34, 0xc0, 0xfe, 0xda, 0xec, 0x04, 0xe9, 0x88, 0xf8, 0xe5, 0x3b, + 0xe9, 0x9a, 0x3a, 0xf9, 0xb5, 0xff, 0x0d, 0x93, 0x93, 0xff, 0xf7, 0x0c, 0x03, 0xcc, 0xde, 0xf2, + 0x0d, 0x46, 0xed, 0x16, 0x85, 0x05, 0x53, 0x62, 0x05, 0x1d, 0xcc, 0xfe, 0x76, 0x65, 0xff, 0x7e, + 0x4a, 0xfe, 0xa1, 0x15, 0xfe, 0xe9, 0x41, 0x00, 0xa9, 0x6e, 0xfb, 0xef, 0x45, 0xfe, 0x7a, 0x88, + 0xfe, 0x35, 0x7d, 0xfa, 0x82, 0x61, 0xfe, 0xa8, 0xd3, 0xfe, 0x56, 0xdd, 0xff, 0x8e, 0xfa, 0x00, + 0x2f, 0x29, 0x00, 0x38, 0x41, 0xff, 0x68, 0xa0, 0x2c, 0x8b, 0x17, 0x25, 0x76, 0xc3, 0xff, 0x0b, + 0xbc, 0x0b, 0xe6, 0xfa, 0xfa, 0x8c, 0x49, 0xfc, 0x51, 0x96, 0x04, 0x6b, 0xf2, 0xf9, 0x04, 0x54, + 0xec, 0x22, 0x80, 0xf7, 0xe2, 0xb3, 0x0c, 0x93, 0x45, 0xff, 0x2a, 0x60, 0x00, 0x2b, 0xbd, 0xf8, + 0xd4, 0x9a, 0xec, 0x88, 0x23, 0x00, 0xc3, 0x57, 0x06, 0xf0, 0xd7, 0xff, 0x1a, 0x54, 0x00, 0x6e, + 0xf0, 0xfe, 0x98, 0xc2, 0xfd, 0xca, 0xa0, 0xff, 0x42, 0x51, 0xfb, 0x15, 0xb4, 0xfd, 0x5f, 0x72, + 0xff, 0x19, 0x37, 0xfb, 0x24, 0x55, 0xfe, 0xcd, 0x86, 0xff, 0x70, 0x3c, 0xff, 0xc9, 0xdc, 0x00, + 0xd6, 0x29, 0x00, 0x42, 0x1b, 0xff, 0xa3, 0xb3, 0x2a, 0x02, 0xa6, 0x24, 0xfc, 0x34, 0xfe, 0x29, + 0xe1, 0x0b, 0x3c, 0x8f, 0xfd, 0xc2, 0xb5, 0xfc, 0xee, 0xbf, 0x01, 0x0e, 0xdd, 0xf9, 0xd6, 0x82, + 0xf2, 0x0f, 0xa3, 0xf5, 0x51, 0x53, 0x0b, 0xab, 0x41, 0x00, 0x31, 0xee, 0xfb, 0x8b, 0xa6, 0xfd, + 0xd7, 0x1e, 0xef, 0xff, 0x86, 0xfa, 0x13, 0x40, 0x06, 0x72, 0x8e, 0x00, 0x0b, 0xf4, 0xff, 0x56, + 0xcc, 0x00, 0x21, 0xfd, 0xfd, 0xc9, 0x97, 0xfd, 0x97, 0xec, 0xfb, 0x39, 0xb4, 0xfd, 0xba, 0x60, + 0x00, 0xb3, 0xc4, 0xfc, 0x46, 0x2a, 0xfd, 0xb0, 0x9d, 0xff, 0x58, 0x65, 0xff, 0xa9, 0x89, 0x00, + 0xba, 0x24, 0x00, 0xeb, 0x36, 0xff, 0x97, 0x28, 0x28, 0xae, 0x56, 0x22, 0x4f, 0x16, 0xfe, 0xdc, + 0xfa, 0x0c, 0x28, 0x7b, 0xff, 0x19, 0xb8, 0xfc, 0x86, 0x01, 0x01, 0xfb, 0x0f, 0xf9, 0x07, 0xe0, + 0xf5, 0xe1, 0xbd, 0xf6, 0xcc, 0xf8, 0x08, 0xfe, 0x1c, 0x02, 0xdb, 0xdb, 0xf9, 0xe5, 0x46, 0xff, + 0xc5, 0xa6, 0xf3, 0x62, 0x54, 0xf6, 0x5d, 0xc3, 0x04, 0x30, 0x34, 0x01, 0x35, 0xb5, 0xfe, 0xcb, + 0x6f, 0x01, 0x29, 0x00, 0xff, 0x8a, 0x3a, 0xfd, 0xc3, 0xeb, 0xfb, 0x1c, 0x20, 0xfe, 0x53, 0x0d, + 0x01, 0x13, 0xeb, 0xfd, 0xbd, 0x0b, 0xfc, 0x2e, 0x7e, 0xff, 0x47, 0xec, 0xff, 0x4b, 0x2a, 0x00, + 0xee, 0x55, 0x00, 0xcd, 0x58, 0xff, 0x21, 0x65, 0x25, 0xd1, 0x49, 0x1f, 0xce, 0xe5, 0xfe, 0x3d, + 0x32, 0x0e, 0x58, 0x1c, 0x00, 0xb4, 0x0a, 0xfc, 0xfd, 0x72, 0x01, 0xe9, 0x3a, 0xfb, 0xc9, 0xeb, + 0xf5, 0x04, 0x2d, 0xf6, 0x01, 0x67, 0x08, 0x99, 0x80, 0x03, 0xc0, 0x68, 0xf9, 0x6c, 0x3b, 0xff, + 0x79, 0xcc, 0xf7, 0x8d, 0x1f, 0xf5, 0xd3, 0xb3, 0x02, 0x39, 0x9c, 0x01, 0xfa, 0x99, 0xfd, 0x31, + 0x75, 0x00, 0x33, 0x0d, 0xff, 0x71, 0x45, 0xfe, 0xc2, 0x2e, 0xfd, 0x21, 0xb8, 0xfd, 0x26, 0x5f, + 0x00, 0xf4, 0x9d, 0xfe, 0xaa, 0x3f, 0xfc, 0x94, 0xc6, 0xff, 0xe2, 0x03, 0x00, 0x55, 0xdd, 0xff, + 0x36, 0xa0, 0x00, 0xd4, 0x19, 0xff, 0x5d, 0x83, 0x21, 0xdc, 0x52, 0x1c, 0x7b, 0x8e, 0x00, 0xc2, + 0x39, 0x0f, 0xc1, 0x6a, 0x00, 0xc6, 0x74, 0xfb, 0x5c, 0x81, 0x02, 0x04, 0x77, 0xfd, 0xd1, 0xac, + 0xf6, 0x35, 0x6d, 0xf5, 0xa2, 0xc2, 0x05, 0xf6, 0xaf, 0x04, 0x2a, 0xec, 0xfa, 0xd9, 0xf3, 0xfe, + 0x69, 0x7b, 0xfa, 0x33, 0x8a, 0xf5, 0x09, 0x82, 0x01, 0x3c, 0xbc, 0x01, 0xd2, 0xc2, 0xfc, 0x75, + 0x7b, 0xff, 0xdb, 0x7c, 0xfe, 0x83, 0x7a, 0xfe, 0x97, 0xcd, 0xfe, 0x31, 0xe8, 0xfd, 0x5d, 0x04, + 0xff, 0x05, 0xf6, 0xfe, 0xdc, 0x54, 0xfd, 0x0c, 0x28, 0x00, 0x94, 0x2c, 0x00, 0x22, 0xa5, 0xff, + 0x81, 0x65, 0x00, 0xcf, 0x14, 0xff, 0x02, 0x63, 0x1d, 0x08, 0xd9, 0x16, 0xcf, 0x52, 0x01, 0x2a, + 0xd3, 0x12, 0x61, 0x32, 0x00, 0xc0, 0xb0, 0xf9, 0x5e, 0x54, 0x04, 0xd4, 0xbb, 0x00, 0x33, 0xd7, + 0xf7, 0xa6, 0x1a, 0xf3, 0xe1, 0xa7, 0x03, 0x5b, 0x57, 0x06, 0x77, 0x00, 0xfc, 0xe0, 0x78, 0x01, + 0x11, 0xb3, 0xfb, 0xc1, 0x40, 0xf3, 0xe3, 0x78, 0x02, 0x0e, 0x91, 0x02, 0x9d, 0x96, 0xfb, 0x09, + 0x79, 0xff, 0x58, 0x96, 0xfd, 0x22, 0x96, 0xfd, 0xcd, 0xb1, 0xff, 0x38, 0x06, 0xfe, 0xff, 0xb9, + 0xff, 0xae, 0x9e, 0xff, 0x75, 0x34, 0xfd, 0xfb, 0x5f, 0x01, 0xd8, 0xcf, 0x00, 0xc9, 0x38, 0xff, + 0x2b, 0xfa, 0xff, 0x27, 0x21, 0xff, 0x38, 0xbd, 0x18, 0x53, 0x80, 0x16, 0x74, 0x77, 0x05, 0x1c, + 0xc0, 0x10, 0xa2, 0x63, 0xff, 0x9a, 0x4b, 0xf9, 0x3e, 0xa9, 0x03, 0xf5, 0x40, 0xff, 0x1d, 0x42, + 0xfa, 0x2e, 0x3c, 0xf6, 0x34, 0x59, 0xff, 0xaf, 0x66, 0x04, 0x1a, 0x37, 0xfe, 0x62, 0x87, 0x02, + 0x44, 0xea, 0xfd, 0x87, 0xb2, 0xf4, 0x21, 0x92, 0xfe, 0x70, 0x90, 0x02, 0xd7, 0x41, 0xff, 0x11, + 0x96, 0xff, 0xe2, 0x44, 0xfd, 0x89, 0x07, 0xfe, 0xfc, 0xd8, 0xff, 0x1d, 0xf1, 0xfe, 0xf8, 0xf0, + 0xff, 0x17, 0x6e, 0xff, 0x4d, 0xa8, 0xfd, 0xc2, 0x13, 0x00, 0x71, 0x98, 0x00, 0x23, 0x3d, 0xff, + 0x75, 0xe5, 0xff, 0x57, 0x8e, 0xff, 0x6e, 0xbf, 0x15, 0xfe, 0xda, 0x14, 0xb2, 0xa4, 0x05, 0x81, + 0x1d, 0x0f, 0x83, 0x74, 0x00, 0x37, 0x89, 0xfb, 0x8c, 0x5c, 0x03, 0xc7, 0xb7, 0xfe, 0x6c, 0x5a, + 0xfb, 0xf6, 0x2e, 0xf7, 0xb0, 0xae, 0xfe, 0x4f, 0x54, 0x03, 0x28, 0x91, 0xfe, 0xa4, 0x07, 0x02, + 0xe7, 0x36, 0xff, 0x3f, 0x25, 0xf7, 0x1a, 0x6f, 0xfd, 0x58, 0xf5, 0x02, 0x4c, 0xef, 0xff, 0xf8, + 0x6d, 0xfe, 0x3f, 0xc3, 0xfd, 0x57, 0xcb, 0xfe, 0x47, 0xd3, 0xff, 0xd8, 0xb3, 0xfe, 0x95, 0x13, + 0xff, 0x60, 0x7a, 0xff, 0xe0, 0xd6, 0xfe, 0xb1, 0xc5, 0xff, 0xa0, 0x8c, 0xff, 0xbb, 0x27, 0xff, + 0xa2, 0x47, 0x00, 0xa0, 0xb7, 0xff, 0x2b, 0x56, 0x13, 0xf3, 0xa6, 0x12, 0x02, 0xc3, 0x05, 0xd1, + 0x88, 0x0c, 0x07, 0x84, 0x01, 0x93, 0x8f, 0xfe, 0x65, 0x3b, 0x02, 0x55, 0x79, 0xfe, 0x21, 0x0f, + 0xfc, 0x3a, 0x4e, 0xf8, 0xa4, 0xbe, 0xfe, 0xf4, 0x41, 0x02, 0x62, 0x09, 0xff, 0xfa, 0xa1, 0x01, + 0xf2, 0xd8, 0xff, 0x25, 0xef, 0xf8, 0xe1, 0xdb, 0xfd, 0xa8, 0x2b, 0x03, 0xd8, 0xd3, 0xff, 0x2a, + 0x5f, 0xfe, 0xc6, 0x6c, 0xfe, 0xcf, 0x55, 0xff, 0xd3, 0xa7, 0xff, 0x37, 0x5a, 0xfe, 0x56, 0x78, + 0xfe, 0x71, 0x53, 0xff, 0x83, 0x36, 0xff, 0xb8, 0x3c, 0xff, 0x50, 0x42, 0xff, 0x07, 0xa3, 0xff, + 0x05, 0x74, 0x00, 0xee, 0xdb, 0xff, 0x21, 0x60, 0x11, 0x2f, 0x32, 0x11, 0x44, 0x58, 0x05, 0x3e, + 0x34, 0x0a, 0x94, 0xe4, 0x02, 0xcc, 0x21, 0x00, 0x85, 0x44, 0x01, 0x01, 0x6d, 0xfe, 0x27, 0x35, + 0xfc, 0x24, 0x7c, 0xf9, 0xd9, 0xcd, 0xfe, 0x71, 0xa0, 0x01, 0x33, 0x55, 0xff, 0xe7, 0x7b, 0x01, + 0x1e, 0x41, 0x00, 0xa8, 0xda, 0xf9, 0x8e, 0x68, 0xfe, 0xcb, 0x40, 0x03, 0x43, 0xaa, 0xff, 0x60, + 0x6f, 0xfe, 0xf2, 0xe8, 0xfe, 0x3b, 0x5a, 0xff, 0x23, 0x7a, 0xff, 0x06, 0x51, 0xfe, 0x25, 0x1c, + 0xfe, 0x3c, 0x25, 0xff, 0xce, 0x04, 0xff, 0x00, 0x2f, 0xff, 0x8c, 0xb2, 0xff, 0x39, 0xc0, 0xff, + 0xc9, 0x38, 0x00, 0xa1, 0xf6, 0xff, 0x6f, 0xec, 0x0e, 0xda, 0xb2, 0x0f, 0x63, 0xaf, 0x04, 0x7f, + 0xa7, 0x08, 0xfd, 0x7d, 0x04, 0xb8, 0x8c, 0x00, 0x7f, 0xbf, 0x00, 0x6d, 0xb0, 0xfe, 0x94, 0xa0, + 0xfc, 0x36, 0x02, 0xfb, 0x45, 0xc4, 0xfe, 0x39, 0x09, 0x01, 0xff, 0x12, 0x00, 0xb6, 0xe0, 0x01, + 0xfa, 0x28, 0x00, 0xa6, 0xf6, 0xfa, 0xc5, 0x59, 0xff, 0x81, 0xea, 0x02, 0xf5, 0x9f, 0xff, 0xfb, + 0x72, 0xfe, 0x41, 0x1c, 0xff, 0x8f, 0xc4, 0xff, 0x46, 0x5a, 0xff, 0x12, 0x47, 0xfe, 0x8c, 0x3a, + 0xfe, 0x0d, 0x71, 0xff, 0xb4, 0x1a, 0xff, 0xc3, 0x02, 0xff, 0x56, 0xf0, 0xff, 0x96, 0x0a, 0x00, + 0x6b, 0x39, 0x00, 0xbf, 0xd9, 0xff, 0xb0, 0x1e, 0x0d, 0x2e, 0xc3, 0x0d, 0xee, 0x4f, 0x04, 0x3d, + 0x54, 0x08, 0x1c, 0xb5, 0x04, 0x12, 0x46, 0x00, 0x80, 0x8f, 0x00, 0x0a, 0xf5, 0xfe, 0x6c, 0x33, + 0xfd, 0x67, 0x24, 0xfc, 0x10, 0x92, 0xfe, 0xb8, 0x80, 0x00, 0x6c, 0xbc, 0x00, 0xc2, 0x22, 0x02, + 0x0c, 0x1d, 0x00, 0x7e, 0x05, 0xfc, 0xa1, 0xbe, 0xff, 0xf6, 0xfa, 0x01, 0xbc, 0x5f, 0xff, 0xa4, + 0xcb, 0xfe, 0x5a, 0x62, 0xff, 0xbd, 0xb0, 0xff, 0x28, 0x3d, 0xff, 0x7d, 0x9a, 0xfe, 0x39, 0xba, + 0xfe, 0xa8, 0xc0, 0xff, 0xb8, 0xf2, 0xfe, 0x59, 0xcf, 0xfe, 0xe2, 0xe3, 0xff, 0xbf, 0x1e, 0x00, + 0x22, 0x37, 0x00, 0xf5, 0xb3, 0xff, 0xe5, 0xf2, 0x0a, 0x12, 0x31, 0x0c, 0x1d, 0x4e, 0x04, 0x84, + 0xa9, 0x07, 0x32, 0x74, 0x04, 0x40, 0x70, 0x00, 0x20, 0xa3, 0x00, 0x79, 0x22, 0xff, 0xd6, 0xd4, + 0xfd, 0xa1, 0xf9, 0xfc, 0xb3, 0x68, 0xfe, 0xf1, 0x2e, 0x00, 0xaf, 0x91, 0x01, 0x0a, 0x76, 0x02, + 0xb5, 0x0f, 0x00, 0xba, 0xfc, 0xfc, 0xf7, 0x71, 0xff, 0x6e, 0x30, 0x01, 0xa4, 0xa6, 0xff, 0x4a, + 0x09, 0xff, 0x9f, 0x55, 0xff, 0xd7, 0xa6, 0xff, 0xec, 0xac, 0xff, 0x1e, 0x43, 0xff, 0xfc, 0x18, + 0xff, 0xfe, 0x86, 0xff, 0xe1, 0x96, 0xfe, 0xa5, 0xde, 0xfe, 0xcb, 0xfe, 0xff, 0x81, 0xfc, 0xff, + 0xb1, 0x19, 0x00, 0x32, 0xc6, 0xff, 0x41, 0x69, 0x08, 0x6c, 0xac, 0x0a, 0x29, 0xbe, 0x04, 0xc0, + 0x37, 0x06, 0xc9, 0xf8, 0x03, 0xb5, 0x72, 0x01, 0xf0, 0x04, 0x01, 0xc8, 0x2c, 0xff, 0x87, 0x2f, + 0xfe, 0x22, 0xe3, 0xfd, 0x84, 0x22, 0xff, 0x96, 0xc4, 0x00, 0x65, 0x2f, 0x02, 0x90, 0x5a, 0x02, + 0xc4, 0x29, 0x00, 0x52, 0xef, 0xfd, 0xef, 0x7f, 0xff, 0x6e, 0xb1, 0x00, 0x9f, 0xb6, 0xff, 0xf3, + 0x3f, 0xff, 0x70, 0x9b, 0xff, 0x43, 0x43, 0x00, 0x4a, 0x28, 0x00, 0x2b, 0x61, 0xff, 0x21, 0xf0, + 0xfe, 0xfa, 0x61, 0xff, 0x88, 0x07, 0xff, 0x7b, 0x1e, 0xff, 0xc1, 0xf4, 0xff, 0x27, 0xe2, 0xff, + 0xa4, 0xfe, 0xff, 0xf8, 0x08, 0x00, 0xb5, 0x64, 0x06, 0xf4, 0x54, 0x08, 0xf2, 0x58, 0x05, 0xe2, + 0xdf, 0x05, 0x63, 0xa7, 0x03, 0xaa, 0xe0, 0x01, 0x75, 0xec, 0x00, 0x60, 0xad, 0xff, 0x37, 0xf7, + 0xfe, 0xaa, 0xea, 0xfe, 0x06, 0xde, 0xff, 0xc8, 0xe2, 0x00, 0xc7, 0x7f, 0x02, 0x08, 0x9c, 0x02, + 0x44, 0x63, 0x00, 0x45, 0x9f, 0xfe, 0x4e, 0x91, 0xff, 0xd4, 0x29, 0x00, 0x10, 0xaf, 0xff, 0x22, + 0x9d, 0xff, 0x42, 0x21, 0x00, 0xac, 0x55, 0x00, 0x05, 0xd3, 0xff, 0xd8, 0x90, 0xff, 0x4f, 0x6a, + 0xff, 0x3d, 0x87, 0xff, 0x6c, 0x26, 0xff, 0x77, 0x40, 0xff, 0x77, 0xcf, 0xff, 0xb5, 0xf1, 0xff, + 0x66, 0x0b, 0x00, 0xc0, 0xfd, 0xff, 0x44, 0xde, 0x04, 0x5e, 0xcb, 0x06, 0xc8, 0x08, 0x05, 0x5c, + 0xcd, 0x04, 0xea, 0x2d, 0x03, 0xc8, 0x1d, 0x02, 0x71, 0x83, 0x01, 0xbd, 0x28, 0x00, 0x17, 0x02, + 0x00, 0x5b, 0x6c, 0x00, 0x16, 0xea, 0x00, 0x19, 0x98, 0x01, 0x49, 0x75, 0x02, 0x78, 0xb5, 0x02, + 0x6f, 0x97, 0x00, 0x1d, 0xdc, 0xfe, 0x6a, 0x5a, 0xff, 0xb3, 0xd3, 0xff, 0xb5, 0x33, 0x00, 0x70, + 0x0e, 0x00, 0x52, 0xe1, 0xff, 0xe1, 0x30, 0x00, 0x1f, 0x33, 0x00, 0x29, 0xe4, 0xff, 0xe2, 0x86, + 0xff, 0xe1, 0x87, 0xff, 0xad, 0x61, 0xff, 0xf3, 0x68, 0xff, 0x14, 0xe8, 0xff, 0x48, 0x10, 0x00, + 0x71, 0x00, 0x00, 0xfd, 0xcd, 0xff, 0x01, 0x4f, 0x04, 0xf1, 0xc7, 0x05, 0x5e, 0x40, 0x04, 0x0e, + 0xb6, 0x03, 0xf1, 0xd5, 0x02, 0x60, 0x6f, 0x02, 0xcf, 0x3f, 0x02, 0xaa, 0xa6, 0x01, 0x5b, 0xd7, + 0x00, 0x71, 0x3f, 0x01, 0x7d, 0xd9, 0x01, 0x6f, 0x07, 0x02, 0x73, 0x67, 0x02, 0xe8, 0x03, 0x02, + 0xb6, 0x1f, 0x00, 0x2f, 0xff, 0xfe, 0x5c, 0xc9, 0xff, 0x4a, 0x2f, 0x00, 0x21, 0x49, 0x00, 0xd8, + 0xfd, 0xff, 0x48, 0xe3, 0xff, 0xe3, 0x37, 0x00, 0xaa, 0x4b, 0x00, 0x6d, 0x01, 0x00, 0x14, 0x97, + 0xff, 0x64, 0xae, 0xff, 0xb3, 0xb5, 0xff, 0x80, 0xd2, 0xff, 0x4b, 0x09, 0x00, 0xbe, 0x04, 0x00, + 0x8d, 0xae, 0xff, 0x2d, 0x4e, 0xff, 0x68, 0x74, 0x03, 0x8e, 0x81, 0x04, 0x10, 0x5b, 0x03, 0x5a, + 0xb3, 0x03, 0x2b, 0x77, 0x03, 0xae, 0xff, 0x02, 0x44, 0x01, 0x03, 0x40, 0xec, 0x02, 0x14, 0x5d, + 0x02, 0x52, 0xc3, 0x01, 0xfb, 0x7e, 0x01, 0x66, 0x87, 0x01, 0xda, 0xa7, 0x01, 0x62, 0x5a, 0x01, + 0x4e, 0x4a, 0x00, 0xfd, 0xb4, 0xff, 0xd5, 0x22, 0x00, 0x71, 0x0d, 0x00, 0x1f, 0xdf, 0xff, 0xbf, + 0xed, 0xff, 0x37, 0xeb, 0xff, 0x05, 0x27, 0x00, 0x00, 0x6b, 0x00, 0xae, 0x56, 0x00, 0xbd, 0xeb, + 0xff, 0xbe, 0xd9, 0xff, 0x72, 0xc9, 0xff, 0xf9, 0xd9, 0xff, 0xb0, 0xf5, 0xff, 0x53, 0x9b, 0xff, + 0x5a, 0x55, 0xff, 0x01, 0x38, 0xff, 0x41, 0x21, 0x03, 0x3e, 0xea, 0x04, 0x7f, 0xe0, 0x03, 0x22, + 0x96, 0x04, 0xb8, 0xaf, 0x04, 0xf0, 0x6c, 0x03, 0xf9, 0xc6, 0x02, 0x3a, 0x48, 0x02, 0x5e, 0xee, + 0x01, 0x6d, 0xdb, 0x01, 0x5e, 0x7f, 0x01, 0xd0, 0xff, 0x00, 0x09, 0xa3, 0x00, 0xf8, 0xd9, 0x00, + 0xeb, 0xd5, 0x00, 0xa0, 0x41, 0x00, 0xc3, 0x06, 0x00, 0x6d, 0xba, 0xff, 0x64, 0x82, 0xff, 0xdd, + 0xc8, 0xff, 0x74, 0x3b, 0x00, 0xf1, 0x79, 0x00, 0x10, 0x7f, 0x00, 0x11, 0x93, 0x00, 0x37, 0x63, + 0x00, 0xe8, 0xcd, 0xff, 0xdf, 0x91, 0xff, 0x80, 0x81, 0xff, 0xad, 0x74, 0xff, 0xd7, 0x61, 0xff, + 0x69, 0x4c, 0xff, 0x15, 0x76, 0xff, 0x79, 0x99, 0x03, 0xd5, 0x66, 0x06, 0xd1, 0x6c, 0x05, 0x40, + 0xd4, 0x04, 0xe7, 0x0d, 0x04, 0xea, 0x8a, 0x03, 0xd3, 0xd4, 0x02, 0x1f, 0x88, 0x01, 0x2b, 0xcd, + 0x00, 0x6e, 0xc6, 0x00, 0xe4, 0xdf, 0x00, 0xf3, 0x1f, 0x01, 0x7f, 0x3f, 0x01, 0x80, 0x02, 0x01, + 0xa7, 0xab, 0x00, 0x99, 0xe6, 0xff, 0x06, 0x88, 0xff, 0x40, 0xa6, 0xff, 0x2e, 0xfe, 0xff, 0xbe, + 0x04, 0x00, 0xed, 0x1d, 0x00, 0x87, 0x97, 0x00, 0x1d, 0x83, 0x00, 0x1b, 0x7b, 0x00, 0xaa, 0x6f, + 0x00, 0x58, 0xe9, 0xff, 0x67, 0x5c, 0xff, 0x2c, 0x20, 0xff, 0xe0, 0x08, 0xff, 0xfe, 0x57, 0xff, + 0x5b, 0x8e, 0xff, 0x49, 0x93, 0xff, 0xac, 0x30, 0x04, 0x35, 0xb1, 0x06, 0x7c, 0x52, 0x05, 0xf1, + 0x8d, 0x04, 0xcf, 0xee, 0x03, 0x0b, 0xae, 0x03, 0xa9, 0x01, 0x03, 0x09, 0x84, 0x01, 0xdf, 0x3e, + 0x00, 0x44, 0xc4, 0xff, 0xe6, 0x6d, 0x00, 0x07, 0x74, 0x01, 0x4d, 0x47, 0x01, 0x1c, 0xe1, 0x00, + 0x20, 0xbe, 0x00, 0x98, 0x3e, 0x00, 0x23, 0x1e, 0x00, 0x64, 0xea, 0xff, 0x98, 0xbe, 0xff, 0x1d, + 0xcc, 0xff, 0xb0, 0x31, 0x00, 0xee, 0x4b, 0x00, 0x18, 0x0c, 0x00, 0x44, 0x71, 0x00, 0xa9, 0xe5, + 0x00, 0x81, 0x76, 0x00, 0x4f, 0x65, 0xff, 0xde, 0xd8, 0xfe, 0xbb, 0xf4, 0xfe, 0x92, 0x35, 0xff, + 0xb1, 0x6f, 0xff, 0x0b, 0xac, 0xff, 0xf9, 0x32, 0x04, 0xd7, 0x83, 0x06, 0xe3, 0x6e, 0x04, 0xe5, + 0xf6, 0x03, 0xd3, 0xdd, 0x03, 0x7a, 0xb5, 0x03, 0x34, 0x22, 0x03, 0x15, 0x7d, 0x01, 0xc5, 0x10, + 0x00, 0xfc, 0x73, 0x00, 0xd9, 0x38, 0x01, 0x2f, 0xbe, 0x00, 0xe1, 0x5b, 0x00, 0xcb, 0x8a, 0x00, + 0x57, 0x8f, 0x00, 0x21, 0xd8, 0x00, 0x46, 0x23, 0x01, 0xd2, 0x4f, 0x00, 0x28, 0xd1, 0xff, 0xc6, + 0xd1, 0xff, 0x18, 0xe0, 0xff, 0x26, 0xf1, 0xff, 0x4d, 0xf3, 0xff, 0x0f, 0x2d, 0x00, 0x4f, 0x4b, + 0x00, 0x8e, 0xc0, 0x00, 0x72, 0x80, 0x00, 0x08, 0x63, 0xff, 0xb0, 0xd2, 0xfe, 0xa4, 0xea, 0xfe, + 0x87, 0x42, 0xff, 0x92, 0x8e, 0xff, 0x51, 0x08, 0x05, 0x06, 0x29, 0x07, 0x32, 0xff, 0x03, 0xce, + 0x0c, 0x03, 0x45, 0x9b, 0x02, 0x03, 0x00, 0x03, 0xff, 0xf9, 0x02, 0xf7, 0x8d, 0x01, 0xec, 0xae, + 0xff, 0x11, 0x29, 0x00, 0xdb, 0xff, 0x01, 0x1a, 0xb1, 0x01, 0x87, 0xc3, 0x00, 0xee, 0xa3, 0xff, + 0xa0, 0x68, 0xff, 0x2e, 0xb9, 0x00, 0x7a, 0x59, 0x01, 0x15, 0x11, 0x01, 0xaf, 0xe9, 0x00, 0x5c, + 0x07, 0x00, 0x30, 0xbf, 0xff, 0x52, 0x34, 0x00, 0x64, 0xcc, 0xff, 0x98, 0x8c, 0xff, 0x6c, 0x12, + 0x00, 0x5c, 0x43, 0x00, 0x01, 0x44, 0x00, 0x33, 0x78, 0x00, 0x9a, 0xfd, 0xff, 0x69, 0x63, 0xff, + 0x51, 0xfa, 0xfe, 0x5f, 0xf9, 0xfe, 0x3e, 0xdc, 0x05, 0xf4, 0x7a, 0x08, 0xd2, 0x08, 0x04, 0xfb, + 0xc4, 0x02, 0xba, 0x0e, 0x02, 0x76, 0x81, 0x02, 0x52, 0x46, 0x02, 0x7d, 0x6f, 0x00, 0xcb, 0xb1, + 0xfe, 0x85, 0x3e, 0xff, 0x68, 0x85, 0x02, 0x40, 0x97, 0x02, 0x3e, 0xd8, 0x00, 0x1a, 0xee, 0xff, + 0x7b, 0xd6, 0xff, 0x1a, 0x0c, 0x00, 0x5a, 0xad, 0x00, 0x53, 0x0a, 0x01, 0xa7, 0xd8, 0x00, 0x93, + 0xa6, 0x00, 0xff, 0x7e, 0x00, 0xac, 0x43, 0x00, 0xd4, 0xdb, 0xff, 0xb8, 0xe8, 0xff, 0x14, 0xb5, + 0xff, 0x55, 0x82, 0xff, 0xb8, 0xfc, 0xff, 0xc2, 0x5d, 0x00, 0xff, 0xa1, 0x00, 0x71, 0x6c, 0x00, + 0x24, 0x95, 0xff, 0x34, 0xec, 0xfe, 0x0f, 0x7e, 0x07, 0xe2, 0x14, 0x0a, 0x1c, 0x0f, 0x04, 0x01, + 0x30, 0x03, 0x49, 0xf0, 0x01, 0x8f, 0x1e, 0x02, 0x71, 0xb7, 0x01, 0xc1, 0x2b, 0xff, 0xbf, 0xd9, + 0xfc, 0x08, 0xdd, 0xfd, 0xe5, 0xd0, 0x02, 0xef, 0x96, 0x02, 0x47, 0x7d, 0x00, 0x08, 0x1c, 0x00, + 0xb9, 0x0b, 0x00, 0xd0, 0x9a, 0x00, 0x16, 0x3a, 0x01, 0xc8, 0x6d, 0x00, 0xd4, 0x35, 0x00, 0x54, + 0xf5, 0x00, 0x62, 0x86, 0x00, 0x29, 0x84, 0x00, 0x99, 0x6b, 0x00, 0xaf, 0xd2, 0xff, 0x95, 0xfb, + 0xff, 0x88, 0xd4, 0xff, 0x05, 0x87, 0xff, 0x4b, 0xfe, 0xff, 0x22, 0x7d, 0x00, 0xc1, 0xf3, 0x00, + 0x73, 0x5a, 0x00, 0x22, 0x6f, 0xff, 0xf0, 0x49, 0x09, 0x23, 0xb7, 0x0b, 0x53, 0xdc, 0x03, 0xf0, + 0xa3, 0x03, 0x8e, 0xd9, 0x01, 0x0e, 0x07, 0x02, 0x04, 0x97, 0x01, 0x31, 0x3a, 0xfe, 0x12, 0x7b, + 0xfb, 0xc9, 0xd3, 0xfc, 0x23, 0x3c, 0x03, 0xe3, 0x51, 0x02, 0xda, 0x70, 0xff, 0xec, 0x68, 0xff, + 0x2b, 0xcc, 0xff, 0x8e, 0xf6, 0x00, 0x6a, 0xa1, 0x01, 0x2a, 0xac, 0x00, 0x7b, 0xb8, 0x00, 0xce, + 0xb8, 0x00, 0x29, 0x1a, 0x00, 0xa1, 0xb4, 0x00, 0x75, 0x1c, 0x00, 0x42, 0x07, 0x00, 0xca, 0x44, + 0x00, 0xee, 0xde, 0xff, 0x94, 0xc2, 0xff, 0xce, 0x69, 0x00, 0x04, 0x51, 0x00, 0xb2, 0x04, 0x00, + 0x45, 0x65, 0x00, 0x83, 0x40, 0x00, 0xdb, 0x84, 0x0b, 0xc1, 0x13, 0x0d, 0x72, 0x62, 0x03, 0xe3, + 0x69, 0x04, 0xd6, 0xb7, 0x01, 0x3e, 0x32, 0x02, 0x9f, 0xb8, 0x01, 0xf9, 0x53, 0xfd, 0xf3, 0xee, + 0xf9, 0xd4, 0x25, 0xfc, 0xfa, 0x29, 0x04, 0x43, 0x06, 0x02, 0x6b, 0x52, 0xfe, 0x62, 0x9f, 0xfe, + 0x0d, 0x44, 0xff, 0xee, 0x9f, 0x00, 0x41, 0xa5, 0x01, 0x8c, 0xa1, 0x00, 0xd8, 0xf1, 0x00, 0x53, + 0x64, 0x01, 0xbf, 0x0d, 0x00, 0x57, 0x5e, 0x00, 0xfe, 0x1e, 0x00, 0xb6, 0xfa, 0xff, 0xaf, 0x49, + 0x00, 0xf9, 0xfe, 0xff, 0xc3, 0x20, 0x00, 0xf4, 0x90, 0x00, 0x2b, 0x0c, 0x00, 0xff, 0x14, 0x00, + 0xe1, 0x00, 0x00, 0x86, 0x03, 0x00, 0x86, 0xea, 0x0e, 0xca, 0xbc, 0x0e, 0xef, 0x1a, 0x02, 0xb3, + 0x59, 0x05, 0xfc, 0x5d, 0x01, 0xd4, 0x5d, 0x02, 0xad, 0xb3, 0x01, 0xd6, 0x07, 0xfc, 0x40, 0x6e, + 0xf8, 0xb5, 0xcf, 0xfb, 0xfe, 0x5f, 0x05, 0x03, 0x66, 0x01, 0x22, 0x44, 0xfd, 0xb3, 0xed, 0xfd, + 0x6f, 0xc0, 0xfe, 0xa8, 0x3a, 0x00, 0x8b, 0x27, 0x01, 0xdf, 0x29, 0x00, 0xc7, 0xe3, 0x00, 0x62, + 0x21, 0x01, 0xbf, 0xd7, 0xff, 0xcb, 0xbd, 0x00, 0xb0, 0x37, 0x00, 0xb7, 0xcc, 0xff, 0xf4, 0x20, + 0x00, 0x9c, 0x1a, 0x00, 0x00, 0xda, 0xff, 0x8a, 0xa1, 0x00, 0x54, 0x28, 0x00, 0x1c, 0xf3, 0xff, + 0x74, 0x26, 0x00, 0x8e, 0xca, 0xff, 0x5a, 0x46, 0x12, 0x85, 0x5f, 0x10, 0x31, 0x6a, 0x00, 0xdc, + 0x4e, 0x06, 0x55, 0x12, 0x01, 0x1b, 0x32, 0x02, 0x18, 0xaa, 0x01, 0x7e, 0x98, 0xfa, 0x7a, 0x83, + 0xf7, 0x14, 0x43, 0xfc, 0x98, 0x59, 0x06, 0xfa, 0x92, 0x00, 0x19, 0x71, 0xfc, 0x38, 0x75, 0xfd, + 0x78, 0x9c, 0xfe, 0x6c, 0xf5, 0xff, 0xe5, 0xee, 0x00, 0x92, 0xc4, 0xff, 0x2f, 0x8b, 0x00, 0xd7, + 0x0f, 0x01, 0xff, 0x2d, 0xff, 0x96, 0xac, 0x00, 0xcb, 0x4f, 0x00, 0x24, 0x1f, 0x00, 0x78, 0xde, + 0xff, 0x84, 0x82, 0xff, 0x95, 0xe8, 0xff, 0x77, 0x95, 0x00, 0x64, 0x3c, 0x00, 0x83, 0x52, 0x00, + 0x26, 0x4b, 0x00, 0x6c, 0xd5, 0xff, 0xb0, 0xd4, 0x15, 0xa5, 0xcf, 0x12, 0x15, 0x80, 0xfe, 0x1b, + 0x21, 0x07, 0xcd, 0x22, 0x01, 0x6b, 0xa3, 0x01, 0x79, 0xc1, 0x01, 0x2b, 0xdf, 0xf8, 0xd5, 0x86, + 0xf6, 0xea, 0xbc, 0xfc, 0x2c, 0x20, 0x07, 0xcb, 0x37, 0x00, 0xce, 0xd3, 0xfb, 0x15, 0x9d, 0xfc, + 0x3a, 0x92, 0xfe, 0x19, 0x12, 0x00, 0xf6, 0x3c, 0x00, 0x43, 0xda, 0xff, 0xe4, 0x47, 0x00, 0x0b, + 0x94, 0x00, 0x58, 0x13, 0xff, 0xe7, 0x9f, 0x00, 0x99, 0x05, 0x00, 0x02, 0xb0, 0xff, 0x40, 0x97, + 0xff, 0x0f, 0x7e, 0xff, 0xbd, 0x9c, 0xff, 0x38, 0x56, 0x00, 0x8a, 0x59, 0x00, 0xad, 0x5d, 0x00, + 0xcc, 0xdc, 0x00, 0xba, 0x50, 0x00, 0x42, 0x80, 0x18, 0xa2, 0x39, 0x15, 0xb5, 0x47, 0xfd, 0x55, + 0x3f, 0x07, 0xcb, 0x4b, 0x01, 0xd2, 0x5c, 0x01, 0xc6, 0xd6, 0x01, 0xe6, 0x80, 0xf7, 0x75, 0xc0, + 0xf5, 0xe4, 0x39, 0xfd, 0xab, 0x44, 0x07, 0x71, 0xda, 0xff, 0x8d, 0xb0, 0xfb, 0x4f, 0x37, 0xfc, + 0x06, 0x6f, 0xfe, 0x15, 0xf2, 0xff, 0x50, 0x3d, 0x00, 0xa0, 0xad, 0xff, 0x8d, 0x32, 0x00, 0x7a, + 0xe9, 0x00, 0x62, 0xce, 0xfe, 0xc1, 0x14, 0x00, 0x77, 0x78, 0xff, 0x0b, 0xca, 0xff, 0xc3, 0x46, + 0xff, 0x6d, 0x2d, 0xff, 0x56, 0xca, 0xff, 0x5e, 0x5c, 0x00, 0x8b, 0x5b, 0x00, 0xe9, 0x69, 0x00, + 0x3e, 0xce, 0x00, 0x0a, 0xf2, 0xff, 0x20, 0x9e, 0x1a, 0x5e, 0x18, 0x18, 0x29, 0x29, 0xfd, 0xf0, + 0xf5, 0x06, 0xf3, 0xc9, 0x00, 0x7a, 0xde, 0x00, 0x24, 0x3e, 0x02, 0xff, 0x20, 0xf6, 0x92, 0x69, + 0xf5, 0xee, 0x1f, 0xfd, 0x81, 0xe5, 0x05, 0x60, 0x1f, 0x00, 0x71, 0x6e, 0xfc, 0x88, 0x4b, 0xfb, + 0x49, 0xe5, 0xfd, 0xce, 0xa0, 0xff, 0x20, 0x67, 0x00, 0x3f, 0xdb, 0x00, 0x90, 0x84, 0xff, 0x86, + 0x50, 0x00, 0xb1, 0xdd, 0xfe, 0xf2, 0xe1, 0xff, 0x80, 0xf3, 0xfe, 0xdb, 0x46, 0xff, 0x12, 0xfc, + 0xfe, 0x7b, 0x0c, 0xff, 0xdc, 0xc9, 0xff, 0x7c, 0x5d, 0x00, 0xc5, 0x95, 0x00, 0xe4, 0x13, 0x00, + 0x7c, 0x97, 0x00, 0x05, 0xc6, 0xff, 0x63, 0x48, 0x1b, 0xa7, 0xa5, 0x1a, 0xfa, 0x38, 0xfe, 0xbe, + 0xf0, 0x06, 0xe7, 0xb0, 0x00, 0xcf, 0x77, 0xff, 0x03, 0xe7, 0x02, 0xa0, 0x07, 0xf6, 0x99, 0x9c, + 0xf5, 0x74, 0xf4, 0xfc, 0x76, 0x86, 0x03, 0x04, 0xfe, 0xff, 0x09, 0xdd, 0xfd, 0x00, 0x9d, 0xfb, + 0x40, 0xf6, 0xfc, 0xb2, 0x8c, 0xff, 0x82, 0x48, 0x00, 0x8d, 0x7b, 0x01, 0x59, 0xaf, 0xff, 0xb1, + 0xd8, 0xff, 0x80, 0xc5, 0xfe, 0x16, 0x8e, 0xff, 0xd6, 0x1e, 0xff, 0x9b, 0x47, 0xff, 0x39, 0xdc, + 0xfe, 0x31, 0x11, 0xff, 0x00, 0x96, 0xff, 0xef, 0xa9, 0xff, 0xc3, 0xa1, 0x00, 0x43, 0x58, 0x00, + 0x50, 0xac, 0x00, 0x72, 0xa4, 0xff, 0x3e, 0xca, 0x1b, 0x19, 0x5b, 0x1c, 0x84, 0xe6, 0xff, 0x25, + 0x6e, 0x07, 0x44, 0xe6, 0x00, 0xef, 0xce, 0xfd, 0x75, 0x50, 0x02, 0x54, 0x7c, 0xf6, 0x0b, 0x56, + 0xf6, 0x6d, 0x48, 0xfd, 0xc6, 0x64, 0x00, 0xb1, 0x6c, 0xff, 0x60, 0x12, 0xff, 0xe7, 0x81, 0xfc, + 0x02, 0x9a, 0xfd, 0x7c, 0x51, 0xfe, 0x20, 0xa6, 0xff, 0xdd, 0x6d, 0x02, 0x1a, 0xe9, 0xff, 0xdd, + 0x00, 0xff, 0x37, 0xbe, 0xfe, 0x2d, 0xd2, 0xff, 0x91, 0x65, 0xff, 0x43, 0x3c, 0xff, 0x72, 0x9b, + 0xfe, 0x5a, 0x0e, 0xff, 0xed, 0x57, 0xff, 0xe4, 0x41, 0xff, 0xed, 0x67, 0x00, 0xbb, 0x24, 0x00, + 0xe5, 0x81, 0x00, 0xa4, 0xcb, 0xff, 0x44, 0x5a, 0x1c, 0x20, 0x72, 0x1d, 0x4f, 0x89, 0x01, 0xe2, + 0xe1, 0x08, 0x27, 0x7f, 0x01, 0xa2, 0x5a, 0xfc, 0xc8, 0xed, 0x00, 0x5a, 0x0e, 0xf6, 0xa6, 0x10, + 0xf7, 0x71, 0x22, 0xff, 0x17, 0x7b, 0xfd, 0x9a, 0xca, 0xfc, 0x46, 0xc0, 0x00, 0x4c, 0x40, 0xfe, + 0xd3, 0x54, 0xfe, 0xa0, 0xa0, 0xfd, 0xbd, 0x39, 0xfe, 0x24, 0x6a, 0x02, 0xb6, 0x3c, 0x00, 0x87, + 0x47, 0xff, 0x00, 0x74, 0xff, 0x00, 0x69, 0xff, 0x0a, 0xf4, 0xfe, 0x75, 0x7b, 0xff, 0xcf, 0x68, + 0xfe, 0x72, 0xd7, 0xfe, 0x59, 0x47, 0xff, 0x8c, 0x78, 0xfe, 0x1e, 0x1b, 0x00, 0x1b, 0x3b, 0x00, + 0x3e, 0x79, 0x00, 0x71, 0xa2, 0xff, 0x1d, 0x70, 0x1d, 0x40, 0xab, 0x1d, 0x92, 0xe2, 0x01, 0x3a, + 0xb5, 0x0a, 0x9b, 0x5d, 0x02, 0xa7, 0xaa, 0xfb, 0x53, 0x80, 0xff, 0x00, 0x09, 0xf5, 0x07, 0x36, + 0xf8, 0x6f, 0x05, 0x01, 0xec, 0x0d, 0xfb, 0xa6, 0xff, 0xfa, 0x11, 0x65, 0x01, 0xb0, 0x65, 0xff, + 0xda, 0xcc, 0xff, 0xd8, 0x16, 0xfd, 0x60, 0xc8, 0xfc, 0xf0, 0x57, 0x02, 0xa2, 0x06, 0x01, 0x34, + 0x10, 0xff, 0x75, 0x9e, 0xff, 0x90, 0xdb, 0xff, 0x86, 0xfb, 0xfe, 0x2a, 0x06, 0xff, 0xf2, 0xe6, + 0xfd, 0x6c, 0xa9, 0xfe, 0xa8, 0x33, 0xff, 0xb3, 0x32, 0xfe, 0x5c, 0xae, 0xff, 0x1d, 0x28, 0x00, + 0xd3, 0x90, 0x00, 0xf5, 0xc9, 0xff, 0xe6, 0xe9, 0x1f, 0x33, 0xf6, 0x1c, 0xbf, 0xdf, 0x00, 0x5e, + 0x5a, 0x0d, 0x63, 0xd1, 0x02, 0xa2, 0x11, 0xfb, 0xf8, 0xd6, 0xfd, 0xe6, 0x42, 0xf4, 0x11, 0x5e, + 0xf9, 0x13, 0x99, 0x03, 0xac, 0xc7, 0xf8, 0x66, 0x79, 0xf7, 0xf4, 0x48, 0x02, 0xe8, 0x1d, 0x00, + 0xed, 0xcf, 0x01, 0x01, 0x3c, 0xfd, 0x73, 0x3a, 0xfb, 0x7a, 0x70, 0x02, 0x92, 0x81, 0x01, 0x43, + 0x6e, 0xfe, 0xc9, 0xc2, 0xff, 0x89, 0x2b, 0x00, 0xee, 0x91, 0xfe, 0x1b, 0x14, 0xff, 0x67, 0x03, + 0xfd, 0x35, 0x48, 0xfe, 0x6b, 0x53, 0xff, 0xfc, 0xe3, 0xfd, 0x1c, 0x53, 0xff, 0x93, 0x20, 0x00, + 0xc0, 0x34, 0x00, 0xdc, 0x3f, 0xff, 0xf3, 0x1d, 0x23, 0x19, 0xfa, 0x1b, 0x0e, 0xe6, 0xfe, 0xa1, + 0x05, 0x10, 0xa9, 0x5d, 0x02, 0xd6, 0xf0, 0xfa, 0xc8, 0xce, 0xfd, 0x07, 0xb0, 0xf2, 0x16, 0xc7, + 0xfa, 0x76, 0x1a, 0x07, 0xf3, 0x46, 0xf7, 0x54, 0x17, 0xf3, 0xf4, 0x73, 0x02, 0x4f, 0x4e, 0x01, + 0x52, 0x7c, 0x03, 0xe9, 0x2a, 0xfe, 0xeb, 0x08, 0xfa, 0xbe, 0x2e, 0x02, 0xac, 0xf9, 0x01, 0x4e, + 0xf7, 0xfd, 0x63, 0xdc, 0xff, 0x06, 0x58, 0x00, 0x99, 0xa9, 0xfd, 0xe8, 0x0f, 0xff, 0x96, 0xee, + 0xfc, 0x70, 0x23, 0xfe, 0x21, 0x68, 0xff, 0x7a, 0xa6, 0xfd, 0xfa, 0x09, 0xff, 0xbe, 0x1e, 0x00, + 0x8d, 0x0d, 0x00, 0xd5, 0x24, 0xff, 0x39, 0x65, 0x27, 0x1e, 0xc9, 0x1b, 0x04, 0x39, 0xfb, 0x7a, + 0x5e, 0x11, 0x4b, 0xce, 0x01, 0x96, 0x61, 0xfb, 0x20, 0x4b, 0xfe, 0xfa, 0xb9, 0xf0, 0x14, 0x3b, + 0xfc, 0x70, 0xd9, 0x0a, 0xf1, 0xb6, 0xf6, 0x12, 0xfb, 0xee, 0x81, 0xa2, 0x01, 0xad, 0xcf, 0x01, + 0x10, 0x73, 0x04, 0xfe, 0xf0, 0xff, 0xea, 0x87, 0xf9, 0x4c, 0x03, 0x01, 0x77, 0x8c, 0x02, 0x55, + 0x9e, 0xfd, 0x6c, 0xe5, 0xfe, 0xc3, 0xae, 0x00, 0x73, 0x7d, 0xfd, 0xbf, 0xf0, 0xfe, 0x34, 0x2d, + 0xfc, 0x06, 0x84, 0xfd, 0xea, 0xf5, 0xff, 0x4e, 0xbe, 0xfd, 0x0f, 0x51, 0xfe, 0x44, 0x35, 0x00, + 0xc9, 0x2e, 0x00, 0x75, 0x8c, 0xfe, 0xf5, 0x11, 0x2c, 0x2c, 0x48, 0x1e, 0x22, 0xd2, 0xf5, 0xc5, + 0xc2, 0x0f, 0xbb, 0xac, 0x01, 0xf0, 0xa9, 0xfb, 0xb6, 0x25, 0x01, 0xd3, 0x35, 0xf0, 0xc8, 0x89, + 0xfa, 0x62, 0x48, 0x0d, 0x51, 0x72, 0xf9, 0x02, 0x96, 0xec, 0xeb, 0x69, 0xff, 0x5d, 0x0e, 0x02, + 0x80, 0xa6, 0x05, 0x48, 0xcc, 0x00, 0xe9, 0x8e, 0xf8, 0xf6, 0xa8, 0x00, 0x9b, 0x09, 0x03, 0xc3, + 0x36, 0xfd, 0xd0, 0x6a, 0xfe, 0x8b, 0x59, 0x01, 0x65, 0x1a, 0xfd, 0xb4, 0x9b, 0xfe, 0x58, 0x11, + 0xfc, 0x8e, 0x2b, 0xfd, 0x16, 0x05, 0x00, 0x49, 0xec, 0xfd, 0x47, 0x43, 0xfe, 0xfa, 0xe3, 0xff, + 0x56, 0x52, 0x00, 0xae, 0xb8, 0xfe, 0x27, 0x15, 0x31, 0x81, 0x91, 0x21, 0x62, 0x37, 0xef, 0x91, + 0x2b, 0x0d, 0x8b, 0xaa, 0x00, 0x04, 0xac, 0xfc, 0x68, 0x41, 0x06, 0x35, 0xca, 0xee, 0xcc, 0xa3, + 0xf7, 0x7a, 0x87, 0x0f, 0x6d, 0x0d, 0xfd, 0x39, 0x48, 0xeb, 0x3c, 0xfc, 0xfc, 0x20, 0x9e, 0x01, + 0x54, 0xbc, 0x05, 0xdf, 0xea, 0x01, 0xa8, 0xdb, 0xf7, 0x74, 0x1f, 0xff, 0x45, 0x81, 0x03, 0xee, + 0x0b, 0xfe, 0x41, 0x90, 0xfd, 0xb8, 0x23, 0x01, 0xf3, 0x1a, 0xfd, 0x6b, 0xef, 0xfe, 0xd1, 0x03, + 0xfc, 0xd4, 0x31, 0xfc, 0xb2, 0x5f, 0x00, 0xf2, 0x28, 0xfe, 0x56, 0xdb, 0xfd, 0xa5, 0xbd, 0xff, + 0x97, 0xe1, 0x00, 0xa9, 0xed, 0xfe, 0x84, 0x97, 0x37, 0xcd, 0x89, 0x21, 0x27, 0x77, 0xe9, 0xc2, + 0x0e, 0x0d, 0x03, 0x06, 0xfe, 0xa6, 0xbd, 0xfe, 0xec, 0xf9, 0x08, 0xa5, 0x20, 0xed, 0xe4, 0x25, + 0xf7, 0xee, 0xcf, 0x11, 0x95, 0x91, 0x00, 0x74, 0xc4, 0xe9, 0xba, 0x1b, 0xfa, 0x89, 0x08, 0x00, + 0x7f, 0x3e, 0x07, 0x64, 0x90, 0x02, 0x61, 0xd2, 0xf5, 0xb6, 0x0b, 0xfe, 0x5e, 0x80, 0x04, 0x52, + 0x12, 0xfe, 0x66, 0x57, 0xfc, 0xa1, 0xb7, 0x01, 0x67, 0x22, 0xfd, 0x8d, 0x33, 0xff, 0xd6, 0xfc, + 0xfb, 0xbb, 0xa8, 0xfb, 0xe5, 0x1e, 0x00, 0xbd, 0x30, 0xfe, 0x03, 0x2b, 0xfe, 0x0c, 0x26, 0x00, + 0xb7, 0xbb, 0x00, 0x1a, 0x61, 0xfe, 0x83, 0x19, 0x3b, 0x85, 0x1f, 0x22, 0x90, 0x50, 0xe6, 0xdc, + 0xab, 0x0c, 0x05, 0xaf, 0xfb, 0x6c, 0x3c, 0x00, 0x9c, 0xd6, 0x0a, 0x18, 0xa9, 0xec, 0xd8, 0xef, + 0xf5, 0x20, 0xa9, 0x12, 0xa6, 0x8a, 0x04, 0x39, 0x57, 0xe8, 0xd0, 0xfc, 0xf7, 0x7a, 0xbf, 0xfe, + 0xe0, 0xc0, 0x06, 0x65, 0x2a, 0x03, 0xeb, 0x9e, 0xf5, 0x7f, 0xf7, 0xfc, 0x33, 0x1f, 0x04, 0xce, + 0x2c, 0xfe, 0xbe, 0xb3, 0xfb, 0x44, 0x1d, 0x02, 0xde, 0xdd, 0xfc, 0xc8, 0xab, 0xff, 0x2e, 0x22, + 0xfc, 0x06, 0xc0, 0xfa, 0x77, 0x13, 0x00, 0x98, 0xdc, 0xfe, 0xbf, 0x66, 0xfe, 0x90, 0xee, 0xff, + 0x5d, 0x77, 0x00, 0x24, 0x2e, 0xfe, 0x3b, 0x8f, 0x3f, 0x49, 0x2e, 0x22, 0xf5, 0xdf, 0xe3, 0xfd, + 0x9b, 0x0b, 0x43, 0x79, 0xf8, 0x15, 0x35, 0x03, 0x35, 0x06, 0x0d, 0xa6, 0x0f, 0xec, 0x9f, 0xd6, + 0xf3, 0x71, 0x3a, 0x13, 0xb0, 0x8f, 0x08, 0xa7, 0xb1, 0xe8, 0x81, 0x89, 0xf6, 0x56, 0xb9, 0xfa, + 0x83, 0xa0, 0x06, 0xa4, 0x39, 0x05, 0x4c, 0x77, 0xf5, 0x35, 0xd7, 0xfb, 0x14, 0x70, 0x03, 0x17, + 0xfc, 0xfd, 0x23, 0xb3, 0xfb, 0xed, 0x62, 0x02, 0x42, 0x8f, 0xfc, 0x68, 0xf9, 0xff, 0xb2, 0xc4, + 0xfb, 0x4d, 0xaa, 0xfa, 0xe2, 0xa4, 0x00, 0x24, 0x65, 0xff, 0xbc, 0x64, 0xfe, 0xfc, 0xd4, 0xff, + 0x2a, 0x47, 0x00, 0x80, 0x04, 0xfe, 0xa5, 0x04, 0x41, 0xd2, 0x5f, 0x24, 0x58, 0xbd, 0xe2, 0x68, + 0xbc, 0x09, 0xf3, 0x09, 0xf7, 0x14, 0x5c, 0x04, 0x5d, 0x79, 0x0e, 0x12, 0xb7, 0xec, 0x28, 0x29, + 0xf1, 0x9e, 0x08, 0x12, 0x7e, 0x04, 0x0d, 0xac, 0xda, 0xe9, 0xdc, 0x7e, 0xf4, 0xbd, 0x72, 0xf7, + 0xf2, 0x15, 0x06, 0xa0, 0xa5, 0x07, 0x8f, 0xb7, 0xf5, 0x74, 0x9d, 0xfa, 0x3b, 0xb8, 0x02, 0x83, + 0x14, 0xfe, 0x49, 0xb6, 0xfb, 0x59, 0x75, 0x02, 0xfb, 0xe3, 0xfb, 0x47, 0xca, 0xff, 0xfb, 0x37, + 0xfc, 0x82, 0xd2, 0xfa, 0xbe, 0xab, 0x00, 0x27, 0xac, 0xff, 0x26, 0x86, 0xfe, 0xf4, 0xd2, 0xff, + 0xdb, 0x20, 0x00, 0x89, 0xbd, 0xfd, 0xc2, 0x51, 0x43, 0x48, 0xb5, 0x24, 0x8c, 0xbc, 0xe3, 0x90, + 0x1a, 0x08, 0x9e, 0x61, 0xf5, 0x53, 0x7a, 0x05, 0x81, 0x9a, 0x0e, 0xf3, 0x61, 0xee, 0x42, 0x2f, + 0xee, 0x3b, 0x26, 0x11, 0x4f, 0x93, 0x10, 0xf1, 0xf5, 0xeb, 0x1d, 0xdb, 0xf2, 0x2d, 0xf1, 0xf3, + 0x3a, 0xcc, 0x05, 0x5d, 0xa3, 0x09, 0xc9, 0x2a, 0xf7, 0x96, 0x15, 0xf9, 0xdb, 0x7b, 0x02, 0xda, + 0xee, 0xfd, 0xb7, 0xd1, 0xfb, 0x66, 0x28, 0x02, 0xcb, 0xf7, 0xfa, 0xdb, 0x43, 0x00, 0x11, 0xc9, + 0xfc, 0x49, 0xdd, 0xfa, 0x53, 0x80, 0x00, 0xf0, 0x0f, 0x00, 0x56, 0x73, 0xfe, 0xf6, 0x37, 0x00, + 0xdf, 0xb7, 0xff, 0xb9, 0x61, 0xfd, 0xa4, 0x1d, 0x44, 0x54, 0xc3, 0x25, 0xc0, 0xf2, 0xe4, 0x4f, + 0x44, 0x07, 0xd5, 0x42, 0xf4, 0x25, 0x5e, 0x05, 0x7e, 0x7e, 0x0e, 0x49, 0x8e, 0xef, 0x00, 0xc1, + 0xeb, 0x50, 0xbb, 0x0f, 0x34, 0xca, 0x12, 0x27, 0x04, 0xef, 0x1b, 0xb3, 0xf1, 0x8d, 0xfe, 0xf0, + 0x73, 0x7c, 0x05, 0xde, 0x9d, 0x0a, 0x94, 0x79, 0xf9, 0xf1, 0xcb, 0xf7, 0xed, 0xca, 0x01, 0xba, + 0x66, 0xfe, 0x21, 0x50, 0xfb, 0x7e, 0x94, 0x01, 0xe1, 0xe4, 0xfa, 0x1d, 0xac, 0x00, 0x2a, 0xb4, + 0xfc, 0x46, 0x65, 0xfb, 0x71, 0xd1, 0xff, 0x94, 0x0d, 0x00, 0x2a, 0xe8, 0xfe, 0x49, 0xf3, 0xff, + 0x65, 0x6f, 0xff, 0x32, 0x53, 0xfd, 0x7e, 0xca, 0x43, 0x8c, 0x04, 0x27, 0x3e, 0xc9, 0xe6, 0x87, + 0xe3, 0x06, 0x41, 0x1a, 0xf3, 0x59, 0x31, 0x05, 0x15, 0xdf, 0x0d, 0xd4, 0x4b, 0xf0, 0x4a, 0xe6, + 0xe9, 0x1a, 0x55, 0x0d, 0xf4, 0x8b, 0x14, 0xc2, 0xae, 0xf2, 0xa8, 0x8e, 0xf1, 0x87, 0xb6, 0xed, + 0x57, 0x9d, 0x04, 0x8f, 0x9b, 0x0b, 0x41, 0x18, 0xfc, 0x2d, 0xc7, 0xf6, 0xf8, 0x89, 0x00, 0xdb, + 0x46, 0xff, 0x41, 0x63, 0xfa, 0x3e, 0x5d, 0x01, 0xb3, 0x3a, 0xfb, 0xce, 0xc6, 0x00, 0xdc, 0xd4, + 0xfc, 0x6e, 0x71, 0xfb, 0x34, 0x1d, 0xff, 0x3b, 0x31, 0x00, 0x3e, 0x06, 0xff, 0xd5, 0x41, 0xff, + 0x8e, 0xc2, 0xff, 0x36, 0x48, 0xfd, 0x19, 0x0b, 0x42, 0x34, 0x56, 0x29, 0x47, 0xee, 0xe9, 0x6e, + 0x6e, 0x07, 0xe6, 0xba, 0xf1, 0x0a, 0x6d, 0x04, 0x29, 0x72, 0x0d, 0x9c, 0x69, 0xf0, 0xa8, 0x8d, + 0xe8, 0x56, 0x0b, 0x0a, 0x45, 0xea, 0x15, 0xa5, 0x32, 0xf7, 0xfc, 0xe2, 0xf3, 0xc0, 0x99, 0xe9, + 0x86, 0x90, 0x02, 0xef, 0x39, 0x0d, 0xdf, 0xd7, 0xfe, 0x87, 0xff, 0xf6, 0xaa, 0x58, 0xfe, 0x75, + 0x44, 0x00, 0xcb, 0x0a, 0xfa, 0x3e, 0x42, 0x01, 0xe0, 0xda, 0xfb, 0x47, 0x58, 0x01, 0x9a, 0x76, + 0xfc, 0xf9, 0x01, 0xfb, 0x39, 0x40, 0xff, 0x3e, 0x80, 0xff, 0x17, 0x5f, 0xff, 0x50, 0x9a, 0xfe, + 0x5d, 0x34, 0x00, 0xa2, 0x7b, 0xfd, 0x87, 0x19, 0x41, 0x62, 0x9b, 0x28, 0xf4, 0x46, 0xee, 0xe6, + 0xe8, 0x07, 0x44, 0x00, 0xf1, 0xb4, 0x68, 0x04, 0x8c, 0xc1, 0x0b, 0x1c, 0x09, 0xf1, 0x2e, 0xe6, + 0xe6, 0xa4, 0x13, 0x08, 0xc7, 0x3c, 0x15, 0xe7, 0x81, 0xfa, 0xac, 0x53, 0xf7, 0xf6, 0xf5, 0xe6, + 0xba, 0x71, 0x00, 0x7f, 0xde, 0x0d, 0x8f, 0x64, 0x00, 0x7a, 0xdb, 0xf7, 0x93, 0xfc, 0xfc, 0xf7, + 0x54, 0x00, 0x53, 0xda, 0xfa, 0x68, 0xc1, 0x00, 0x98, 0x6f, 0xfc, 0xc5, 0x63, 0x01, 0xbc, 0x3f, + 0xfc, 0xd3, 0x0c, 0xfb, 0x49, 0xb2, 0xfe, 0xa8, 0x07, 0xff, 0x99, 0xa8, 0xff, 0xbe, 0x56, 0xfe, + 0xd7, 0x4d, 0x00, 0xbd, 0x5e, 0xfe, 0xfc, 0xa1, 0x3e, 0xee, 0x26, 0x29, 0x6b, 0x54, 0xf3, 0xc2, + 0xad, 0x07, 0x44, 0x6a, 0xf1, 0x67, 0x27, 0x03, 0x44, 0x4a, 0x0a, 0xa2, 0x57, 0xf3, 0xce, 0x18, + 0xe4, 0x99, 0x3f, 0x05, 0xa6, 0x5e, 0x14, 0x75, 0x4b, 0xfd, 0x71, 0xe4, 0xfc, 0x8a, 0xd0, 0xe4, + 0x1f, 0x35, 0xfc, 0x00, 0x18, 0x0f, 0x90, 0x2d, 0x01, 0x58, 0x8a, 0xf9, 0x0c, 0xc3, 0xfc, 0xa2, + 0x8c, 0xff, 0x98, 0x8c, 0xfc, 0xff, 0x28, 0x00, 0xf7, 0xc4, 0xfb, 0xf9, 0x52, 0x02, 0xea, 0x6a, + 0xfc, 0x69, 0x19, 0xfa, 0x0e, 0xd5, 0xfe, 0x6c, 0x12, 0xfe, 0x30, 0xf8, 0xff, 0x3f, 0x33, 0xff, + 0x85, 0x67, 0x00, 0x41, 0xf5, 0xfe, 0x09, 0x2e, 0x3c, 0xaa, 0x36, 0x29, 0x55, 0xc2, 0xf6, 0xd7, + 0xa0, 0x06, 0x9d, 0xe7, 0xf3, 0xb3, 0x89, 0x02, 0x49, 0x8b, 0x07, 0x4f, 0x6e, 0xf5, 0x9f, 0x6d, + 0xe2, 0x62, 0x02, 0x03, 0xf0, 0x44, 0x13, 0xb1, 0x03, 0xfe, 0xe8, 0x6b, 0x01, 0x62, 0x30, 0xe5, + 0xb2, 0x42, 0xf7, 0x74, 0x2c, 0x0f, 0xe0, 0xc7, 0x01, 0xfd, 0xfe, 0xfa, 0xaa, 0x9d, 0xfd, 0x67, + 0x95, 0xfe, 0xe1, 0x1d, 0xfd, 0xec, 0x39, 0x00, 0x7e, 0x81, 0xfb, 0x71, 0x16, 0x02, 0xa8, 0x38, + 0xfc, 0xfe, 0xa6, 0xf9, 0xac, 0x2a, 0xff, 0x83, 0x78, 0xfd, 0x04, 0x7b, 0x00, 0x38, 0xda, 0xff, + 0xed, 0x48, 0x00, 0x84, 0x84, 0xff, 0x99, 0xde, 0x39, 0x77, 0x5b, 0x26, 0x4d, 0x16, 0xfc, 0x2a, + 0xe2, 0x07, 0x3f, 0x1b, 0xf4, 0x2d, 0x46, 0x02, 0x97, 0xf3, 0x04, 0x0c, 0xc5, 0xf7, 0x28, 0x03, + 0xe2, 0x97, 0xef, 0xfe, 0x16, 0xa7, 0x12, 0x23, 0xf3, 0xfe, 0xb0, 0x62, 0x05, 0xcb, 0xfc, 0xe6, + 0xd9, 0xf0, 0xf0, 0x1b, 0x7c, 0x0e, 0x7a, 0x24, 0x03, 0xd4, 0x8b, 0xfc, 0xb1, 0xc1, 0xfe, 0x49, + 0xf0, 0xfd, 0x33, 0xe7, 0xfd, 0x85, 0xf4, 0xff, 0x65, 0x07, 0xfb, 0xbf, 0xb8, 0x01, 0xab, 0x47, + 0xfc, 0xd7, 0xd8, 0xf8, 0x8a, 0x90, 0xff, 0x44, 0xf2, 0xfd, 0xce, 0x54, 0x00, 0x7c, 0xd6, 0x00, + 0xe7, 0x96, 0x00, 0x49, 0x27, 0xff, 0x83, 0x6d, 0x36, 0x5a, 0x2c, 0x25, 0xb9, 0x22, 0xfe, 0x73, + 0x50, 0x0b, 0xdd, 0x74, 0xf3, 0x40, 0x1c, 0x01, 0xa3, 0x3c, 0x05, 0xbe, 0x72, 0xf7, 0x7e, 0xca, + 0xe3, 0x90, 0xb1, 0xfa, 0x2f, 0x5e, 0x12, 0xed, 0x7d, 0xff, 0xc7, 0x9f, 0x06, 0x00, 0xd6, 0xea, + 0x10, 0xe8, 0xea, 0x9e, 0xa6, 0x0c, 0x9f, 0xb0, 0x05, 0xf0, 0x30, 0xfd, 0x31, 0xce, 0xfe, 0x1c, + 0x41, 0xfe, 0x16, 0x3c, 0xfe, 0x3e, 0x3a, 0x00, 0x64, 0x90, 0xfa, 0xee, 0x7f, 0xff, 0x1f, 0xbd, + 0xfd, 0x44, 0x4c, 0xf9, 0xf8, 0x07, 0xff, 0x3a, 0x10, 0xfe, 0x2f, 0xa0, 0x00, 0xfc, 0x81, 0x01, + 0xb3, 0xe0, 0xff, 0xc9, 0x32, 0xff, 0xb1, 0x0d, 0x34, 0xd6, 0x42, 0x25, 0x40, 0x47, 0xfd, 0xa2, + 0xa1, 0x0c, 0xe0, 0x58, 0xf6, 0x4b, 0xc2, 0xfe, 0xce, 0x07, 0x06, 0x61, 0x7a, 0xf7, 0xef, 0xbd, + 0xe5, 0x0d, 0x86, 0xf8, 0x31, 0xd9, 0x12, 0x27, 0x43, 0xfe, 0x1b, 0x92, 0x04, 0x61, 0x2d, 0xf2, + 0x46, 0xd1, 0xe6, 0x08, 0x84, 0x08, 0x73, 0xc4, 0x07, 0x36, 0x70, 0xfe, 0xbb, 0xdf, 0xff, 0x68, + 0x9d, 0xfd, 0x0b, 0x32, 0xfe, 0x1b, 0x08, 0x01, 0xc2, 0x13, 0xfa, 0xf2, 0xa1, 0xfd, 0x34, 0x9b, + 0xff, 0xf8, 0x6b, 0xf9, 0xf4, 0xde, 0xfe, 0xbe, 0x6e, 0xff, 0x03, 0xbb, 0xff, 0xe5, 0x4d, 0x01, + 0xd3, 0x15, 0x00, 0x92, 0x45, 0xff, 0x78, 0x7d, 0x32, 0xe9, 0x0d, 0x24, 0xf7, 0xe2, 0xfb, 0x8e, + 0x50, 0x0e, 0x85, 0xa0, 0xf8, 0xd5, 0x29, 0xfb, 0x5a, 0x84, 0x05, 0x35, 0x15, 0xfa, 0x5a, 0xe3, + 0xe9, 0xcc, 0xfe, 0xf5, 0x8d, 0x9e, 0x10, 0xc7, 0xb7, 0xfe, 0x0e, 0xfc, 0x00, 0x42, 0x10, 0xf9, + 0x48, 0xb4, 0xe6, 0xba, 0x67, 0x01, 0x52, 0x78, 0x09, 0x12, 0x53, 0xff, 0xfb, 0xb4, 0x00, 0xff, + 0xfa, 0xfe, 0xe5, 0x7d, 0xfd, 0x68, 0x7b, 0xff, 0x52, 0x4c, 0xfa, 0xf7, 0xbb, 0xfd, 0x07, 0x47, + 0x00, 0x7d, 0x75, 0xfa, 0xaf, 0xb9, 0xfe, 0x7d, 0xe7, 0xff, 0xe6, 0xf6, 0xfe, 0xf9, 0x5c, 0x01, + 0x1d, 0xfc, 0xff, 0xb8, 0xf4, 0xfe, 0x47, 0x2d, 0x30, 0x58, 0x13, 0x24, 0xda, 0x0d, 0xfa, 0x7f, + 0x63, 0x0e, 0xfc, 0xae, 0xfb, 0x0c, 0x1d, 0xfc, 0xf3, 0x94, 0x01, 0x21, 0xec, 0xf9, 0x73, 0x9a, + 0xf1, 0x97, 0xd0, 0xf2, 0x74, 0x9e, 0x0f, 0xa1, 0x2b, 0x00, 0x39, 0x5f, 0xfb, 0xc4, 0x37, 0xff, + 0xac, 0x49, 0xe9, 0x0c, 0xc6, 0xfa, 0xbd, 0xf9, 0x09, 0x87, 0x16, 0x00, 0x2a, 0xe7, 0xff, 0x23, + 0x5a, 0x01, 0xac, 0x9d, 0xfd, 0x19, 0xf1, 0xfc, 0xde, 0x77, 0xfb, 0x7e, 0x92, 0xfd, 0x35, 0x6f, + 0x01, 0x69, 0x3c, 0xfc, 0x53, 0xe0, 0xfc, 0xc8, 0x24, 0x00, 0x01, 0x52, 0xff, 0xe3, 0xdf, 0x00, + 0x11, 0x08, 0x00, 0xd8, 0x2c, 0xff, 0xe5, 0x29, 0x2d, 0xa1, 0x10, 0x22, 0xab, 0xf7, 0xf9, 0xf3, + 0x94, 0x0f, 0x4c, 0x1e, 0xfe, 0xbd, 0x06, 0xfc, 0x53, 0x79, 0x00, 0x28, 0x40, 0xf8, 0x93, 0xd6, + 0xf6, 0xdb, 0xb1, 0xf3, 0x01, 0x09, 0x0c, 0x55, 0x29, 0x03, 0xcb, 0x1a, 0xf8, 0x8a, 0xfa, 0x01, + 0x90, 0x46, 0xee, 0xb4, 0x7d, 0xf4, 0x26, 0x5d, 0x09, 0x18, 0xfe, 0x00, 0x58, 0x38, 0xfe, 0x39, + 0xbb, 0x02, 0x23, 0xde, 0xfe, 0x82, 0xda, 0xfb, 0xd9, 0x63, 0xfb, 0x6e, 0x5c, 0xfe, 0x8c, 0x43, + 0x02, 0x73, 0x99, 0xfd, 0x6e, 0x34, 0xfb, 0x09, 0x1b, 0x00, 0xa3, 0x03, 0x00, 0x09, 0x5a, 0x00, + 0xfd, 0x46, 0x00, 0x23, 0x65, 0xff, 0xaf, 0xb2, 0x2a, 0xd5, 0xd4, 0x1e, 0x39, 0x16, 0xfb, 0x70, + 0x10, 0x11, 0x6f, 0xad, 0xfe, 0xbf, 0x2a, 0xfb, 0xbd, 0xa2, 0x00, 0x52, 0x9c, 0xfa, 0xdf, 0x05, + 0xf6, 0x8f, 0x1b, 0xf4, 0xff, 0x0b, 0x0c, 0xfc, 0xa2, 0x03, 0x2e, 0xc9, 0xf7, 0x4c, 0xea, 0x01, + 0xbe, 0xee, 0xf2, 0x70, 0x4c, 0xf2, 0x53, 0x98, 0x06, 0x35, 0xf6, 0x01, 0x19, 0x4e, 0xfd, 0xa2, + 0xe7, 0x01, 0x82, 0x32, 0xff, 0xb8, 0x43, 0xfd, 0xc8, 0xed, 0xfb, 0xd5, 0xb2, 0xfd, 0x5f, 0x87, + 0x02, 0xea, 0x47, 0xfe, 0xc7, 0xa6, 0xfa, 0x32, 0x5c, 0x00, 0x1c, 0x51, 0x00, 0xc0, 0xf0, 0xff, + 0x6f, 0xa8, 0x00, 0x7e, 0x27, 0xff, 0xee, 0x92, 0x26, 0xd1, 0xf5, 0x1b, 0x76, 0xba, 0xfc, 0x10, + 0xfc, 0x11, 0xe8, 0x37, 0xff, 0x57, 0x53, 0xfa, 0xb4, 0xdf, 0x01, 0x5c, 0x12, 0xfd, 0xc7, 0x95, + 0xf6, 0x03, 0xf7, 0xf1, 0x19, 0xa5, 0x0a, 0xf6, 0xfd, 0x06, 0x25, 0x83, 0xf6, 0xe5, 0x0e, 0x02, + 0xbf, 0xc1, 0xf7, 0xe6, 0xad, 0xf0, 0x52, 0x55, 0x05, 0x02, 0x62, 0x02, 0x11, 0x61, 0xfb, 0x35, + 0xc3, 0x00, 0xdf, 0x2e, 0xff, 0x16, 0x19, 0xfe, 0x4b, 0x4c, 0xfe, 0x8a, 0x1b, 0xfd, 0xc9, 0x6b, + 0x00, 0x69, 0x77, 0xff, 0x03, 0xc2, 0xfb, 0x8b, 0xb8, 0x00, 0x60, 0x0b, 0x00, 0x7e, 0xab, 0xff, + 0x45, 0x05, 0x01, 0xb1, 0xb6, 0xfe, 0x42, 0xf6, 0x21, 0x23, 0x28, 0x19, 0x1f, 0x6c, 0xff, 0x90, + 0xe7, 0x12, 0x10, 0x39, 0xff, 0x18, 0xb6, 0xf9, 0x32, 0x31, 0x03, 0x6c, 0x6b, 0xff, 0x23, 0x21, + 0xf7, 0x99, 0xcb, 0xf1, 0x26, 0xc7, 0x06, 0xa5, 0xa5, 0x07, 0x3d, 0xdf, 0xf9, 0xa6, 0x1a, 0x01, + 0xa2, 0xbf, 0xf9, 0x35, 0xe2, 0xf1, 0x7f, 0xd7, 0x03, 0x1a, 0xa0, 0x02, 0xdb, 0x01, 0xfb, 0x4a, + 0xde, 0xff, 0x07, 0x5a, 0xfe, 0x59, 0x11, 0xfe, 0x14, 0xc0, 0xff, 0x1b, 0x78, 0xfd, 0xd8, 0x37, + 0xff, 0xf1, 0xa8, 0xff, 0x81, 0xfa, 0xfc, 0x6a, 0xf4, 0x00, 0x36, 0x71, 0x00, 0x75, 0x66, 0xff, + 0x83, 0x68, 0x00, 0x41, 0x03, 0xff, 0x1f, 0xa2, 0x22, 0xa1, 0x3d, 0x16, 0x79, 0x9e, 0xff, 0xa0, + 0x1f, 0x17, 0x10, 0xad, 0xf9, 0x64, 0xc9, 0xf6, 0xf5, 0xd4, 0x03, 0x3c, 0x0b, 0xfc, 0xce, 0xd4, + 0xf1, 0x7b, 0xa4, 0xf4, 0x51, 0x29, 0x11, 0x76, 0x8f, 0x04, 0xcb, 0xf3, 0xfa, 0x74, 0xd3, 0x09, + 0x0b, 0xf9, 0xfa, 0xd2, 0x80, 0xf3, 0xa0, 0x11, 0x05, 0xd8, 0x55, 0x00, 0x1c, 0x3a, 0xf9, 0xf3, + 0x17, 0xfd, 0x94, 0x1a, 0xfb, 0x56, 0x57, 0xfe, 0x49, 0x14, 0xfe, 0x84, 0xc3, 0xfb, 0x90, 0x99, + 0xff, 0x81, 0x08, 0xfe, 0x35, 0xac, 0xfd, 0x20, 0x6d, 0x01, 0x92, 0x9a, 0xff, 0xd7, 0xa5, 0xfe, + 0x61, 0xd7, 0x00, 0x03, 0xee, 0xff, 0x7f, 0xe6, 0x1c, 0xcf, 0xe4, 0x15, 0x98, 0x4c, 0x02, 0x49, + 0x84, 0x14, 0xe1, 0xae, 0xfd, 0xf5, 0x2b, 0xf5, 0xd3, 0x52, 0x00, 0x93, 0x71, 0xfc, 0xb3, 0x93, + 0xf5, 0x01, 0x52, 0xf8, 0xdd, 0xbd, 0x0b, 0xeb, 0x9d, 0x05, 0x32, 0xa6, 0xfd, 0x08, 0x49, 0x06, + 0x24, 0x91, 0xfc, 0xc9, 0x78, 0xf4, 0x74, 0x64, 0x00, 0x3c, 0x36, 0x00, 0x06, 0x99, 0xfb, 0x8b, + 0x26, 0xff, 0x74, 0xcb, 0xfb, 0x3c, 0x62, 0xfe, 0xb3, 0x23, 0x00, 0x03, 0x2a, 0xfb, 0x7d, 0xc3, + 0xff, 0x6c, 0x1d, 0xff, 0xa8, 0xf2, 0xfb, 0x6b, 0xf6, 0xff, 0xf6, 0xe4, 0xff, 0xab, 0x46, 0xff, + 0x9b, 0x26, 0x00, 0x27, 0xce, 0xff, 0x51, 0x94, 0x18, 0xe3, 0xcf, 0x13, 0x06, 0x07, 0x04, 0x4c, + 0xb6, 0x12, 0xf7, 0xf9, 0xfe, 0x95, 0xcc, 0xf7, 0x5a, 0x75, 0x00, 0x93, 0x58, 0xfc, 0x2b, 0x3a, + 0xf8, 0x16, 0xcd, 0xf9, 0xc9, 0x46, 0x08, 0x45, 0x0b, 0x05, 0xfb, 0xf0, 0xfd, 0xe0, 0xb6, 0x04, + 0x7f, 0x8f, 0xfd, 0xb3, 0x21, 0xf6, 0xa5, 0xb6, 0xff, 0x87, 0xb1, 0xff, 0x97, 0xb9, 0xfc, 0xb8, + 0xc6, 0xff, 0xa0, 0xd3, 0xfc, 0xb8, 0x38, 0xff, 0x28, 0x02, 0x00, 0x2a, 0xe4, 0xfb, 0x48, 0xdb, + 0xff, 0xd9, 0x00, 0xff, 0x51, 0x35, 0xfc, 0xa7, 0x4a, 0xff, 0x40, 0x5b, 0xff, 0x4f, 0x47, 0xff, + 0x96, 0x06, 0x00, 0x4f, 0x93, 0xff, 0x8f, 0x52, 0x14, 0xeb, 0xd3, 0x11, 0xc4, 0xbb, 0x05, 0x44, + 0x9b, 0x10, 0x00, 0x2d, 0x00, 0x37, 0x58, 0xfa, 0x25, 0x58, 0x00, 0x3a, 0x12, 0xfd, 0x18, 0x8d, + 0xfa, 0x58, 0x98, 0xfa, 0xdf, 0xcc, 0x05, 0x1e, 0xe0, 0x03, 0x43, 0x26, 0xfe, 0x1e, 0x8b, 0x03, + 0x0e, 0x2e, 0xfe, 0x0b, 0x03, 0xf8, 0x6a, 0xab, 0xfe, 0xc8, 0xaf, 0xff, 0x20, 0x6d, 0xfd, 0x43, + 0x9e, 0xff, 0x61, 0xaf, 0xfe, 0x2e, 0x7d, 0x00, 0xc5, 0x18, 0x00, 0x67, 0x93, 0xfc, 0x76, 0x81, + 0xff, 0xe7, 0x9b, 0xfe, 0xdc, 0xa3, 0xfc, 0xa6, 0xa9, 0xfe, 0xed, 0x8d, 0xfe, 0x89, 0xd6, 0xfe, + 0xa1, 0x06, 0x00, 0xe7, 0xf9, 0xff, 0xcb, 0xdd, 0x10, 0xda, 0x48, 0x10, 0x61, 0x9f, 0x06, 0x9d, + 0x6c, 0x0e, 0xb6, 0xae, 0x01, 0xea, 0xf6, 0xfb, 0x94, 0x2f, 0x00, 0xc0, 0xd2, 0xfe, 0xb5, 0x00, + 0xfc, 0x70, 0x17, 0xfb, 0x15, 0x16, 0x04, 0xaf, 0xc4, 0x02, 0x0d, 0x4d, 0xfe, 0xb9, 0x87, 0x02, + 0x72, 0x14, 0xff, 0x21, 0x33, 0xf9, 0x4b, 0x0a, 0xfe, 0x1c, 0xfd, 0xff, 0x82, 0xe9, 0xfd, 0x83, + 0x61, 0x00, 0x22, 0x78, 0x00, 0xc8, 0x02, 0x01, 0x6c, 0xd5, 0xff, 0x55, 0x2a, 0xfd, 0x28, 0x06, + 0xff, 0xb0, 0x50, 0xfe, 0x60, 0x08, 0xfd, 0x0c, 0x1a, 0xfe, 0x2c, 0x5d, 0xfe, 0xb9, 0xd3, 0xfe, + 0x64, 0xe2, 0xff, 0xb8, 0x00, 0x00, 0xa5, 0x12, 0x0e, 0xe8, 0x1a, 0x0f, 0x29, 0x8b, 0x06, 0x07, + 0x75, 0x0c, 0xcb, 0x05, 0x03, 0x67, 0xd6, 0xfc, 0xd1, 0xc9, 0x00, 0xc8, 0x2a, 0x00, 0x82, 0xd4, + 0xfc, 0xfa, 0xd7, 0xfb, 0x03, 0x63, 0x02, 0x86, 0xbc, 0x01, 0x79, 0x84, 0xfe, 0x64, 0xe8, 0x01, + 0xa3, 0x7a, 0xff, 0x3e, 0x40, 0xfa, 0x0d, 0xf6, 0xfd, 0xa9, 0x3f, 0x00, 0xcb, 0x57, 0xff, 0x96, + 0x4f, 0x01, 0x19, 0xb3, 0x00, 0xc5, 0x83, 0x00, 0x92, 0xdb, 0xff, 0xc8, 0x9a, 0xfd, 0x8f, 0x97, + 0xfe, 0x35, 0x2a, 0xfe, 0xb1, 0x3f, 0xfd, 0x0e, 0x72, 0xfe, 0x1d, 0x79, 0xfe, 0x9b, 0xc5, 0xfe, + 0x0c, 0xaa, 0xff, 0x59, 0xbd, 0xff, 0xa8, 0x60, 0x0c, 0xc2, 0xe7, 0x0d, 0x59, 0x06, 0x06, 0x8b, + 0xd2, 0x0a, 0xed, 0x3f, 0x03, 0x26, 0xcd, 0xfd, 0xaa, 0x90, 0x01, 0xf7, 0x79, 0x00, 0xf1, 0x95, + 0xfd, 0xfe, 0x71, 0xfc, 0x3f, 0xc0, 0x00, 0x1f, 0xe9, 0x00, 0x86, 0xe4, 0xfe, 0x79, 0xad, 0x01, + 0x0e, 0x7c, 0xff, 0x68, 0x20, 0xfb, 0xd8, 0xa4, 0xfe, 0xcf, 0xcc, 0x00, 0xd5, 0x5e, 0x00, 0x5a, + 0x79, 0x01, 0xe0, 0x1c, 0x00, 0xec, 0x02, 0x00, 0xa8, 0x9c, 0xff, 0xa8, 0x9f, 0xfd, 0x9b, 0x72, + 0xfe, 0x2c, 0xbf, 0xfe, 0x1b, 0xff, 0xfd, 0xe8, 0x3d, 0xfe, 0xd2, 0x52, 0xfe, 0x89, 0xe5, 0xfe, + 0x0f, 0xab, 0xff, 0x50, 0xcd, 0xff, 0x79, 0x69, 0x0b, 0x80, 0x3e, 0x0c, 0xe4, 0xb1, 0x05, 0xf9, + 0x9d, 0x09, 0xad, 0x0a, 0x03, 0x60, 0x5f, 0xff, 0xeb, 0x1c, 0x02, 0xf0, 0xa9, 0x00, 0xf7, 0x60, + 0xfe, 0x51, 0xdd, 0xfc, 0xbc, 0xb8, 0xff, 0x08, 0x9e, 0x00, 0xef, 0x98, 0xff, 0x1f, 0xae, 0x01, + 0x33, 0x15, 0x00, 0x44, 0x4a, 0xfc, 0x3d, 0x22, 0xff, 0x5e, 0x63, 0x01, 0xaf, 0x08, 0x01, 0x67, + 0xf9, 0x00, 0xf5, 0xa0, 0xff, 0xf0, 0xe3, 0xff, 0x07, 0x51, 0xff, 0xe6, 0x47, 0xfe, 0xaa, 0x77, + 0xff, 0x5d, 0x2b, 0xff, 0xf0, 0xf9, 0xfd, 0x16, 0x40, 0xfe, 0xcc, 0xb9, 0xfe, 0xd8, 0x3f, 0xff, + 0xb5, 0xe7, 0xff, 0xb5, 0x1a, 0x00, 0x2d, 0x4f, 0x0a, 0x31, 0xf0, 0x0a, 0x94, 0x4e, 0x05, 0x74, + 0x2c, 0x08, 0x4d, 0x3b, 0x03, 0x9e, 0xa8, 0x00, 0xef, 0x25, 0x02, 0x0e, 0xd3, 0x00, 0x87, 0xf1, + 0xfe, 0xf6, 0x07, 0xfd, 0x7b, 0x2e, 0xff, 0x73, 0x72, 0x00, 0xc7, 0xc4, 0x00, 0xc4, 0x6b, 0x02, + 0xe0, 0x1e, 0x00, 0x33, 0xd3, 0xfc, 0x3f, 0x68, 0xff, 0x98, 0xe4, 0x01, 0xfc, 0x2b, 0x01, 0x6b, + 0x24, 0x00, 0xcb, 0x35, 0xff, 0x6e, 0x24, 0x00, 0xa6, 0x09, 0x00, 0x36, 0xef, 0xfe, 0xb5, 0x7e, + 0xff, 0x7b, 0x3f, 0xff, 0xb1, 0x37, 0xfe, 0x7f, 0x6f, 0xfe, 0xa6, 0x44, 0xff, 0x72, 0xce, 0xff, + 0x43, 0x4d, 0x00, 0x73, 0x34, 0x00, 0x33, 0xa5, 0x08, 0x0f, 0x51, 0x0a, 0x7a, 0xd1, 0x04, 0xb5, + 0x5c, 0x06, 0xed, 0xee, 0x03, 0xc9, 0xc4, 0x01, 0x50, 0x03, 0x02, 0x39, 0xbb, 0x00, 0x6b, 0x3e, + 0xff, 0x4b, 0x3c, 0xfd, 0xcf, 0x85, 0xff, 0x37, 0xd9, 0x01, 0x6e, 0x4b, 0x01, 0xf2, 0xc7, 0x01, + 0xe5, 0x2f, 0x00, 0x99, 0x7a, 0xfd, 0x16, 0x95, 0xff, 0xa2, 0xf9, 0x01, 0x8a, 0xca, 0x00, 0xc7, + 0xac, 0xff, 0x34, 0xe0, 0xff, 0x1d, 0x69, 0x00, 0x26, 0x3d, 0x00, 0x14, 0x4a, 0xff, 0xf9, 0x29, + 0xff, 0x99, 0x49, 0xff, 0x48, 0xe1, 0xfe, 0xb1, 0x20, 0xff, 0x83, 0xd6, 0xff, 0xe1, 0x43, 0x00, + 0xd8, 0xd5, 0xff, 0x56, 0x2d, 0xff, 0xde, 0x52, 0x06, 0x9d, 0xc7, 0x08, 0xff, 0x20, 0x05, 0xac, + 0xd1, 0x05, 0x79, 0x78, 0x04, 0x86, 0xea, 0x01, 0xfc, 0xaf, 0x01, 0x3e, 0x00, 0x01, 0x08, 0x5d, + 0x00, 0xe4, 0x3e, 0xff, 0x8e, 0x9d, 0xff, 0x89, 0xaf, 0x01, 0x2a, 0xd1, 0x01, 0x6c, 0x18, 0x01, + 0x6a, 0x44, 0x00, 0xcd, 0x7e, 0xfe, 0xbb, 0x54, 0xff, 0x66, 0xa3, 0x01, 0x8b, 0x1d, 0x01, 0xe6, + 0xe4, 0xff, 0xd7, 0x14, 0x00, 0xf6, 0x78, 0x00, 0x77, 0x24, 0x00, 0xb9, 0x62, 0xff, 0x8f, 0xa4, + 0xff, 0x5f, 0xdd, 0xff, 0x4d, 0x73, 0xff, 0x86, 0xcf, 0xff, 0x58, 0xec, 0xff, 0xb3, 0x6d, 0xff, + 0xfb, 0x24, 0xff, 0x2e, 0x21, 0xff, 0x4e, 0xf7, 0x04, 0xfe, 0x28, 0x08, 0xf3, 0x25, 0x05, 0x56, + 0xc1, 0x03, 0xaa, 0xc8, 0x03, 0xf5, 0x66, 0x03, 0xa2, 0x59, 0x02, 0x25, 0x4c, 0x01, 0x1a, 0x0f, + 0x01, 0x32, 0xc5, 0x00, 0x79, 0x9d, 0x00, 0xdd, 0x3e, 0x01, 0x9b, 0x3e, 0x01, 0xf3, 0x59, 0x00, + 0xdd, 0x3b, 0x00, 0x42, 0x67, 0xff, 0x82, 0xb2, 0xff, 0x4d, 0x6e, 0x01, 0xe7, 0x1a, 0x01, 0x57, + 0x19, 0x00, 0x12, 0xec, 0xff, 0xeb, 0x44, 0x00, 0x9a, 0x61, 0x00, 0xb8, 0x32, 0x00, 0x55, 0x0d, + 0x00, 0xaf, 0x27, 0x00, 0x48, 0x0d, 0x00, 0xa4, 0x47, 0xff, 0x06, 0x06, 0xff, 0x94, 0x2c, 0xff, + 0xf7, 0x57, 0xff, 0xd4, 0x75, 0xff, 0x8b, 0x38, 0x04, 0xa9, 0x4f, 0x06, 0x10, 0x4f, 0x04, 0x31, + 0xa2, 0x03, 0x77, 0x2d, 0x04, 0x1f, 0xcc, 0x03, 0xb9, 0x44, 0x03, 0x9d, 0xb1, 0x02, 0x11, 0x89, + 0x01, 0x60, 0x23, 0x01, 0x80, 0xcd, 0x00, 0xcd, 0x8a, 0x00, 0x56, 0xc6, 0x00, 0xc5, 0x63, 0x00, + 0xa6, 0xa4, 0xff, 0x03, 0x06, 0x00, 0xb9, 0xd4, 0x00, 0x4d, 0xe9, 0x00, 0xa5, 0x92, 0x00, 0x83, + 0x0a, 0x00, 0xbd, 0x0b, 0x00, 0xf3, 0xbe, 0x00, 0x9e, 0x02, 0x01, 0x95, 0x8e, 0x00, 0x6b, 0x42, + 0x00, 0x53, 0xba, 0xff, 0xe4, 0x20, 0xff, 0xa7, 0x1c, 0xff, 0x34, 0x30, 0xff, 0xaf, 0x3f, 0xff, + 0x86, 0x82, 0xff, 0xff, 0x7a, 0xff, 0x23, 0xe8, 0x03, 0x86, 0xc2, 0x04, 0x78, 0xfb, 0x03, 0x02, + 0x48, 0x05, 0x0d, 0x12, 0x05, 0xab, 0x15, 0x04, 0x2c, 0xc4, 0x02, 0x5d, 0x55, 0x02, 0xfb, 0x4c, + 0x02, 0xe7, 0x22, 0x01, 0xa6, 0x83, 0x00, 0x2a, 0x3e, 0x00, 0xed, 0x09, 0x00, 0xad, 0x41, 0x00, + 0x78, 0x3e, 0x00, 0xa5, 0x45, 0x00, 0x90, 0xa8, 0x00, 0xc0, 0x76, 0x00, 0x24, 0x83, 0x00, 0x65, + 0xea, 0x00, 0xed, 0xcd, 0x00, 0x12, 0xab, 0x00, 0x1a, 0xa7, 0x00, 0xe7, 0x57, 0x00, 0x95, 0xb6, + 0xff, 0x76, 0x3f, 0xff, 0x79, 0xed, 0xfe, 0x9a, 0x1b, 0xff, 0x97, 0x62, 0xff, 0x2c, 0x50, 0xff, + 0x02, 0x5a, 0xff, 0xfc, 0x4f, 0xff, 0xff, 0x13, 0x05, 0x7b, 0x83, 0x06, 0xaf, 0x64, 0x04, 0xec, + 0x33, 0x05, 0xcd, 0xe8, 0x04, 0xe3, 0x09, 0x04, 0x0d, 0x7f, 0x02, 0xba, 0x02, 0x01, 0x03, 0xaa, + 0x00, 0x88, 0xae, 0x00, 0x88, 0xde, 0x00, 0x7a, 0x5d, 0x00, 0x1c, 0x0e, 0x00, 0x59, 0x53, 0x00, + 0xf7, 0x94, 0x00, 0x9e, 0x03, 0x00, 0xe3, 0xf9, 0xff, 0xe4, 0xcb, 0x00, 0xa1, 0x5a, 0x01, 0x57, + 0x92, 0x01, 0x38, 0x14, 0x01, 0xa3, 0x36, 0x00, 0xdb, 0x8b, 0xff, 0x3a, 0x54, 0xff, 0x29, 0x39, + 0xff, 0x66, 0x2c, 0xff, 0xb4, 0x4b, 0xff, 0xcf, 0x51, 0xff, 0x3f, 0x3e, 0xff, 0x8a, 0x43, 0xff, + 0x84, 0x27, 0xff, 0xf1, 0x1d, 0xff, 0xce, 0x5f, 0x04, 0xd7, 0x83, 0x06, 0x69, 0x46, 0x05, 0x1c, + 0x85, 0x05, 0x4e, 0xe3, 0x04, 0xe1, 0xd7, 0x03, 0x19, 0xed, 0x01, 0xca, 0xb6, 0x00, 0x06, 0xa5, + 0x00, 0xf1, 0x89, 0x00, 0x9a, 0xe9, 0x00, 0xc1, 0xfe, 0x00, 0xa5, 0xaf, 0x00, 0x5d, 0x36, 0x00, + 0x77, 0xca, 0xff, 0xfe, 0xd5, 0xff, 0x7d, 0x8b, 0x00, 0x58, 0xe5, 0x00, 0xd8, 0x5d, 0x01, 0x6f, + 0xc5, 0x01, 0xcd, 0x3a, 0x01, 0x86, 0x61, 0x00, 0x79, 0x64, 0xff, 0xd8, 0xcc, 0xfe, 0x0d, 0x05, + 0xff, 0x85, 0x2c, 0xff, 0x72, 0x5c, 0xff, 0xad, 0x6e, 0xff, 0xe4, 0x3f, 0xff, 0xcf, 0x62, 0xff, + 0x9e, 0x2e, 0xff, 0xcb, 0x01, 0xff, 0x92, 0x3a, 0x05, 0xdc, 0x43, 0x07, 0x0e, 0x51, 0x04, 0xb6, + 0x04, 0x05, 0x55, 0xea, 0x03, 0x8e, 0xe8, 0x02, 0x87, 0x68, 0x02, 0x7a, 0xb7, 0x00, 0xf8, 0x38, + 0x00, 0x4d, 0x35, 0x01, 0x9b, 0x74, 0x01, 0x1e, 0xe3, 0x00, 0x85, 0xfa, 0x00, 0xde, 0xb0, 0xff, + 0xc8, 0x77, 0xff, 0x75, 0x56, 0x00, 0xd8, 0x8d, 0x00, 0x29, 0xb9, 0x00, 0x2e, 0x5b, 0x01, 0x19, + 0xd7, 0x01, 0x84, 0x23, 0x01, 0xab, 0x79, 0x00, 0x6a, 0x6b, 0xff, 0xea, 0xb7, 0xfe, 0xb2, 0x0b, + 0xff, 0xd3, 0x1b, 0xff, 0x8d, 0xf2, 0xfe, 0x46, 0x7e, 0xff, 0x24, 0x7f, 0xff, 0x73, 0x3c, 0xff, + 0xdf, 0x60, 0xff, 0x2b, 0x13, 0xff, 0x22, 0x27, 0x05, 0x22, 0xd2, 0x06, 0xd8, 0xba, 0x03, 0x50, + 0x41, 0x04, 0x73, 0x76, 0x03, 0x57, 0x11, 0x03, 0x0c, 0x50, 0x02, 0xf8, 0xf6, 0x00, 0xf1, 0xa9, + 0x00, 0x92, 0x38, 0x01, 0x23, 0x61, 0x01, 0xe6, 0x35, 0x01, 0x03, 0x42, 0x01, 0x8d, 0xfa, 0xff, + 0x74, 0x26, 0x00, 0x22, 0x82, 0x00, 0x0c, 0x54, 0x00, 0xa6, 0x6c, 0x00, 0x30, 0xc0, 0x00, 0x9c, + 0x23, 0x01, 0xf2, 0x97, 0x01, 0x3b, 0xe5, 0x01, 0x8a, 0x2a, 0x00, 0xba, 0x25, 0xff, 0x62, 0xf4, + 0xfe, 0x18, 0xa4, 0xfe, 0x10, 0x3a, 0xff, 0xaa, 0x6d, 0xff, 0xcc, 0x58, 0xff, 0xa1, 0x6c, 0xff, + 0xbc, 0x7f, 0xff, 0x0b, 0x44, 0xff, 0x27, 0xda, 0x05, 0xda, 0x90, 0x07, 0x84, 0x59, 0x03, 0xa7, + 0x4f, 0x03, 0xe5, 0xa9, 0x02, 0xbd, 0x9a, 0x02, 0xeb, 0x3c, 0x02, 0xbf, 0xb4, 0x00, 0xda, 0xea, + 0xff, 0x0b, 0x2a, 0x01, 0x93, 0x29, 0x02, 0x29, 0x49, 0x01, 0x6a, 0xa6, 0x00, 0x37, 0xb2, 0x00, + 0x1f, 0x86, 0x00, 0x63, 0x32, 0x00, 0xe8, 0x3a, 0x01, 0x79, 0x89, 0x00, 0x80, 0x41, 0x00, 0xdb, + 0xee, 0x00, 0x3c, 0x97, 0x00, 0xaf, 0x2d, 0x01, 0xd6, 0xa5, 0x01, 0x49, 0x0f, 0x01, 0x38, 0x2e, + 0xff, 0x82, 0x7e, 0xfe, 0xff, 0xd2, 0xfe, 0x2f, 0x24, 0xff, 0x92, 0x7e, 0xff, 0x86, 0x8e, 0xff, + 0x38, 0x93, 0xff, 0x88, 0x54, 0xff, 0x46, 0x23, 0x07, 0xa8, 0x2b, 0x09, 0x4a, 0x46, 0x03, 0x5c, + 0x39, 0x03, 0x1b, 0x83, 0x01, 0x55, 0x5c, 0x01, 0xbf, 0x43, 0x02, 0x7b, 0x48, 0x00, 0x96, 0xf7, + 0xfe, 0xf4, 0x7f, 0x00, 0xe9, 0x73, 0x02, 0x9b, 0x4e, 0x01, 0x2e, 0x19, 0x01, 0x3e, 0xaa, 0x00, + 0x12, 0xec, 0xff, 0x8c, 0xe3, 0x00, 0x0c, 0x4b, 0x01, 0x0d, 0xa0, 0x00, 0xa0, 0x33, 0x01, 0xee, + 0xd2, 0x00, 0xee, 0xe2, 0xff, 0x0d, 0xf2, 0x00, 0xe0, 0x13, 0x01, 0xf9, 0xed, 0x00, 0x1f, 0xfd, + 0x00, 0x7e, 0xbb, 0xff, 0xcb, 0xb5, 0xfe, 0x5b, 0xff, 0xfe, 0xe5, 0x68, 0xff, 0xd2, 0x6e, 0xff, + 0x7d, 0x9c, 0xff, 0x47, 0x8a, 0xff, 0x58, 0x44, 0x08, 0x90, 0xda, 0x09, 0x95, 0x47, 0x03, 0x81, + 0xd5, 0x03, 0x76, 0xfa, 0x01, 0x03, 0xa7, 0x01, 0x34, 0x99, 0x01, 0x79, 0x88, 0xfe, 0x89, 0xf9, + 0xfc, 0xa5, 0x59, 0x00, 0xd7, 0x58, 0x03, 0x83, 0xa6, 0x00, 0xc8, 0xbe, 0x00, 0xf9, 0x75, 0x00, + 0xbc, 0xe3, 0xff, 0x97, 0x05, 0x01, 0x38, 0xa1, 0x00, 0xcf, 0xf8, 0x00, 0x3b, 0xe1, 0x01, 0xbc, + 0xde, 0x00, 0x9e, 0x41, 0x00, 0xc2, 0x8b, 0x00, 0x56, 0xf8, 0xff, 0x47, 0xc2, 0x00, 0x85, 0xdd, + 0x00, 0x6e, 0x29, 0x00, 0xf4, 0x75, 0x00, 0x0a, 0xec, 0xff, 0xc6, 0xe5, 0xfe, 0xde, 0xd1, 0xfe, + 0x93, 0x9a, 0xff, 0xd3, 0x8a, 0xff, 0x6a, 0x0b, 0x0a, 0x75, 0x86, 0x0b, 0xe6, 0xe3, 0x02, 0x98, + 0x21, 0x04, 0x07, 0x1f, 0x02, 0x43, 0x91, 0x01, 0xc1, 0x33, 0x01, 0x25, 0x2e, 0xfd, 0x29, 0xa3, + 0xfb, 0x23, 0x48, 0x00, 0x18, 0xf8, 0x03, 0x65, 0x30, 0x00, 0x7d, 0xac, 0xff, 0x60, 0x60, 0xff, + 0x3f, 0xb3, 0xff, 0x56, 0x37, 0x01, 0xbb, 0x2c, 0x01, 0xea, 0xf8, 0x00, 0xcb, 0x0b, 0x01, 0x27, + 0x0a, 0x01, 0xbf, 0x41, 0x00, 0x7b, 0xce, 0x00, 0xdb, 0xa6, 0x00, 0xd7, 0x1a, 0x00, 0x34, 0xee, + 0xff, 0xb5, 0xec, 0xff, 0x3d, 0x84, 0x00, 0xc1, 0xab, 0x00, 0x72, 0x2e, 0x00, 0xed, 0x6b, 0xff, + 0x7a, 0xfd, 0xfe, 0xd7, 0x05, 0xff, 0xce, 0x42, 0x0c, 0x9e, 0xc5, 0x0d, 0x17, 0x74, 0x02, 0xcd, + 0x0e, 0x04, 0x8d, 0xab, 0x01, 0xea, 0x53, 0x01, 0xa2, 0x88, 0x01, 0xbf, 0x0a, 0xfc, 0x57, 0x16, + 0xfa, 0x12, 0x8e, 0x00, 0xf1, 0x9c, 0x04, 0x87, 0x81, 0xff, 0x33, 0x2e, 0xff, 0xe3, 0xa9, 0xfe, + 0x4d, 0xe6, 0xfe, 0xdd, 0xf4, 0x00, 0x45, 0x08, 0x01, 0xaf, 0xe7, 0x00, 0xb7, 0x86, 0x01, 0xb5, + 0xc9, 0x00, 0x5b, 0x49, 0xff, 0xa5, 0x25, 0x01, 0xfe, 0xb7, 0x00, 0x18, 0x40, 0x00, 0x52, 0x6c, + 0x00, 0x99, 0x25, 0xff, 0xb0, 0xc2, 0xff, 0x61, 0xbd, 0x00, 0xb5, 0x65, 0x00, 0xbd, 0xfc, 0xff, + 0x3f, 0x58, 0x00, 0xa4, 0xbf, 0xff, 0x10, 0x0f, 0x0f, 0xc0, 0xba, 0x0f, 0x18, 0x89, 0x01, 0x4a, + 0x32, 0x04, 0xf1, 0x9f, 0x01, 0x37, 0x4c, 0x01, 0x15, 0x43, 0x01, 0x70, 0x84, 0xfa, 0x96, 0x06, + 0xf9, 0x66, 0x80, 0x01, 0x00, 0xfd, 0x04, 0x14, 0xd1, 0xfe, 0xb8, 0xd4, 0xfe, 0xc6, 0xbd, 0xfd, + 0x90, 0x9b, 0xfe, 0xd5, 0xe0, 0x00, 0x1b, 0x74, 0x00, 0x9c, 0xc6, 0x00, 0x93, 0x63, 0x01, 0x86, + 0x2e, 0x00, 0xfc, 0x69, 0xff, 0x9b, 0x02, 0x01, 0xad, 0xe6, 0xff, 0x16, 0xa9, 0x00, 0x3e, 0x4e, + 0x00, 0x1f, 0x1c, 0xff, 0x0c, 0x0f, 0x00, 0xcf, 0xbb, 0xff, 0xc4, 0xef, 0xff, 0x31, 0xa7, 0x00, + 0xb3, 0xff, 0x00, 0xd3, 0x31, 0x00, 0x9a, 0xef, 0x11, 0x6c, 0xb2, 0x11, 0xa3, 0x8d, 0x00, 0x17, + 0x81, 0x04, 0x9d, 0xc4, 0x01, 0x80, 0x50, 0x01, 0x86, 0xcb, 0x00, 0x06, 0x84, 0xf8, 0xca, 0x23, + 0xf8, 0xb0, 0x0a, 0x03, 0xab, 0x6c, 0x05, 0xb1, 0x1d, 0xfe, 0x3d, 0x94, 0xfe, 0x32, 0xbd, 0xfc, + 0x6e, 0x49, 0xfe, 0xf3, 0xff, 0x00, 0x46, 0x54, 0x00, 0xd5, 0x9e, 0x00, 0x4d, 0xec, 0x00, 0x1b, + 0xbf, 0xff, 0x58, 0x10, 0xff, 0x65, 0x07, 0x01, 0x76, 0xec, 0xff, 0x5a, 0x01, 0x00, 0x16, 0xd8, + 0xff, 0xc8, 0xff, 0xfe, 0x9f, 0xad, 0xff, 0xcb, 0x55, 0x00, 0x10, 0x33, 0x00, 0x49, 0xe4, 0xff, + 0x98, 0xdf, 0x00, 0x3b, 0xa7, 0x00, 0x3c, 0xfb, 0x14, 0x63, 0xf0, 0x13, 0x86, 0xaf, 0xff, 0x2e, + 0xa5, 0x04, 0x96, 0x4e, 0x01, 0x51, 0x1b, 0x01, 0x43, 0x75, 0x00, 0xb8, 0x93, 0xf6, 0x6b, 0xc0, + 0xf7, 0xeb, 0x56, 0x04, 0x23, 0x64, 0x05, 0x5a, 0xc9, 0xfd, 0xfb, 0x7d, 0xfe, 0xcf, 0xbf, 0xfb, + 0x05, 0xf5, 0xfd, 0xcd, 0xf4, 0x00, 0xfb, 0x41, 0x00, 0x62, 0xd0, 0x00, 0xb9, 0x90, 0x00, 0xec, + 0x11, 0xff, 0xf7, 0xc4, 0xfe, 0x2b, 0xff, 0x00, 0x2f, 0xb4, 0xff, 0x75, 0xee, 0xff, 0xac, 0x12, + 0xff, 0xde, 0x51, 0xfe, 0xd5, 0xa7, 0xff, 0xd4, 0x57, 0x00, 0xcb, 0x05, 0x00, 0x07, 0xfc, 0xff, + 0x5c, 0x36, 0x01, 0x1e, 0x36, 0x00, 0x84, 0x67, 0x17, 0x7b, 0x8d, 0x16, 0xdc, 0x5c, 0xff, 0x50, + 0x9e, 0x04, 0x5a, 0xd3, 0x00, 0x1a, 0x56, 0x00, 0x7a, 0x4a, 0x00, 0xdf, 0x06, 0xf5, 0xf0, 0x95, + 0xf7, 0x66, 0x26, 0x05, 0xf3, 0xda, 0x04, 0x15, 0xb8, 0xfd, 0x66, 0x8a, 0xfe, 0x95, 0x4b, 0xfb, + 0xe6, 0x71, 0xfd, 0xfc, 0x81, 0x00, 0xbc, 0x5b, 0x00, 0x27, 0x04, 0x01, 0x95, 0x3c, 0x00, 0xe5, + 0xba, 0xfe, 0x4d, 0x61, 0xfe, 0x2e, 0x06, 0x01, 0xf1, 0x4c, 0xff, 0xc4, 0x56, 0xff, 0xc7, 0x33, + 0xff, 0x07, 0x15, 0xfe, 0x5b, 0x40, 0xff, 0x01, 0xc8, 0xff, 0x62, 0xdd, 0xff, 0x87, 0x31, 0x00, + 0xda, 0xee, 0x00, 0x86, 0x40, 0x00, 0xe7, 0xaf, 0x18, 0x1d, 0xa8, 0x19, 0x8b, 0x33, 0x00, 0x6d, + 0x4e, 0x04, 0xab, 0xed, 0x00, 0x05, 0x01, 0xff, 0x5a, 0xe5, 0xff, 0xd7, 0x87, 0xf4, 0x4d, 0x8d, + 0xf7, 0x6a, 0x5e, 0x05, 0xd6, 0x16, 0x04, 0x17, 0xd2, 0xfd, 0x1d, 0x8a, 0xfe, 0x74, 0x69, 0xfb, + 0xa5, 0x49, 0xfd, 0x31, 0xa5, 0xff, 0x35, 0x2d, 0x00, 0x85, 0x8e, 0x01, 0xf9, 0x10, 0x00, 0xd6, + 0xa8, 0xfe, 0xf4, 0x0b, 0xfe, 0xc7, 0x4e, 0x00, 0x6d, 0xe4, 0xff, 0xdc, 0x1f, 0xff, 0x0a, 0xb0, + 0xfe, 0x75, 0x0f, 0xfe, 0xd9, 0xc5, 0xfe, 0x01, 0x11, 0x00, 0x01, 0xa2, 0xff, 0x08, 0x8e, 0xff, + 0x64, 0xfd, 0x00, 0x36, 0xfc, 0xff, 0xf6, 0x4b, 0x18, 0x8e, 0x92, 0x1c, 0xb8, 0xed, 0x02, 0x9c, + 0xa4, 0x03, 0xb4, 0x40, 0x01, 0xa0, 0xe2, 0xfd, 0x43, 0xbd, 0xfe, 0x1a, 0xae, 0xf4, 0xdf, 0x92, + 0xf7, 0x31, 0xae, 0x04, 0x79, 0x64, 0x03, 0x4f, 0x11, 0xfe, 0x94, 0x28, 0xfe, 0x2e, 0xb3, 0xfb, + 0x99, 0x42, 0xfd, 0xd9, 0xcc, 0xfe, 0x71, 0xe8, 0xff, 0x88, 0xa9, 0x01, 0x71, 0x39, 0x00, 0x45, + 0x45, 0xfe, 0xb8, 0xc8, 0xfd, 0x7c, 0x56, 0x00, 0x3c, 0xe3, 0xff, 0x7e, 0x11, 0xff, 0x39, 0x28, + 0xfe, 0xee, 0x0b, 0xfe, 0x7f, 0xa1, 0xfe, 0x80, 0x8e, 0xff, 0x97, 0x84, 0xff, 0x14, 0x2a, 0xff, + 0x9e, 0xe5, 0x00, 0xd8, 0x5d, 0x00, 0xf6, 0x73, 0x17, 0x1c, 0x1e, 0x1e, 0x9b, 0xcf, 0x06, 0x5f, + 0x19, 0x04, 0xe0, 0x27, 0x01, 0x0d, 0x79, 0xfd, 0xe5, 0xae, 0xfd, 0x12, 0xc1, 0xf4, 0x66, 0x85, + 0xf7, 0x2d, 0x99, 0x03, 0x1f, 0xa9, 0x02, 0x02, 0xbb, 0xfe, 0x4d, 0xc6, 0xfd, 0x0a, 0xb2, 0xfb, + 0x79, 0xa3, 0xfd, 0x34, 0xe0, 0xfd, 0xcd, 0xab, 0xff, 0xd7, 0xad, 0x01, 0xa8, 0xac, 0xff, 0xb5, + 0x64, 0xff, 0x1e, 0xd5, 0xfd, 0xf0, 0x52, 0xff, 0x0c, 0xfb, 0xff, 0xd0, 0xf3, 0xfe, 0x3e, 0x89, + 0xfe, 0xd8, 0xfa, 0xfd, 0xd3, 0xfe, 0xfd, 0x94, 0xe7, 0xfe, 0x9e, 0x58, 0xff, 0x36, 0xa6, 0xff, + 0x96, 0x2d, 0x01, 0xea, 0x32, 0x00, 0x41, 0xc3, 0x17, 0x73, 0x01, 0x1e, 0xe8, 0x5f, 0x09, 0x3e, + 0x73, 0x06, 0x8d, 0xae, 0x00, 0xb9, 0x64, 0xfd, 0xbd, 0x70, 0xfd, 0x85, 0xca, 0xf4, 0x78, 0xcf, + 0xf7, 0xbd, 0xfe, 0x01, 0x04, 0x2f, 0x01, 0x6c, 0xcd, 0xff, 0x9a, 0xb1, 0xfd, 0x45, 0x62, 0xfb, + 0x58, 0x22, 0xfe, 0xbf, 0x3f, 0xfd, 0x59, 0xcb, 0xfe, 0x01, 0x19, 0x02, 0xfb, 0x12, 0x00, 0x12, + 0xf7, 0xfe, 0x48, 0x64, 0xfe, 0xae, 0x5b, 0xff, 0x54, 0x04, 0x00, 0xd5, 0xc4, 0xfe, 0x14, 0x0b, + 0xfe, 0x59, 0xf8, 0xfd, 0x64, 0x79, 0xfd, 0x2e, 0x20, 0xff, 0x79, 0xd7, 0xff, 0x26, 0x8c, 0xff, + 0xe6, 0xaa, 0x00, 0x21, 0x40, 0x00, 0xec, 0xeb, 0x18, 0x46, 0x49, 0x1d, 0x02, 0xeb, 0x09, 0x32, + 0xc8, 0x09, 0xf6, 0xd4, 0x00, 0x12, 0x9f, 0xfc, 0xe2, 0x5a, 0xfd, 0xf8, 0xf7, 0xf4, 0xb4, 0xc2, + 0xf8, 0xa8, 0x3c, 0x00, 0x8a, 0x0f, 0xfe, 0x84, 0x8f, 0x00, 0xa4, 0x28, 0xfe, 0xba, 0x7e, 0xfb, + 0x2e, 0xdd, 0xfe, 0x0a, 0x92, 0xfb, 0xa2, 0xec, 0xfe, 0x45, 0x9b, 0x02, 0x3d, 0x66, 0xff, 0xbf, + 0x77, 0xff, 0x3b, 0x97, 0xfe, 0x62, 0x03, 0xff, 0x2d, 0x12, 0x00, 0x71, 0xc5, 0xfe, 0x31, 0x77, + 0xfd, 0x13, 0x30, 0xfe, 0xe1, 0x98, 0xfd, 0x79, 0x9f, 0xfe, 0xcf, 0x3a, 0xff, 0x6e, 0x92, 0xff, + 0xb3, 0x50, 0x01, 0x79, 0x45, 0x00, 0xd8, 0xfd, 0x1a, 0x4a, 0x71, 0x1c, 0xe0, 0x00, 0x09, 0x97, + 0xc5, 0x0c, 0x98, 0x8e, 0x01, 0xb0, 0x25, 0xfc, 0x71, 0x64, 0xfd, 0x7e, 0x79, 0xf5, 0xc1, 0x6b, + 0xfa, 0xa1, 0x4b, 0xff, 0xa0, 0x7f, 0xf9, 0xe4, 0x6e, 0x00, 0x17, 0x67, 0xff, 0xdf, 0x9c, 0xfa, + 0x84, 0x5a, 0x00, 0xa8, 0x9e, 0xfb, 0x15, 0xb1, 0xfd, 0x38, 0x1c, 0x03, 0xb4, 0x6f, 0xff, 0x3a, + 0x95, 0xff, 0x80, 0xd8, 0xfe, 0xae, 0x74, 0xfe, 0xbb, 0x16, 0x00, 0x05, 0xf6, 0xfe, 0x8a, 0x3f, + 0xfd, 0x68, 0xa6, 0xfe, 0xa0, 0x7b, 0xfd, 0x34, 0x01, 0xfe, 0x55, 0x48, 0xff, 0xa7, 0x91, 0xff, + 0xfb, 0xe3, 0x00, 0x32, 0xd5, 0xff, 0x01, 0x66, 0x1e, 0xce, 0x5d, 0x1b, 0x7b, 0xc3, 0x06, 0x5a, + 0x93, 0x0f, 0x89, 0x5a, 0x01, 0x42, 0x20, 0xfc, 0xbe, 0xb6, 0xfd, 0x19, 0xd3, 0xf5, 0xb6, 0x0d, + 0xfd, 0x4a, 0xa7, 0xfe, 0xe2, 0x56, 0xf4, 0xb9, 0xd5, 0xff, 0x07, 0x2c, 0x00, 0xef, 0xca, 0xf9, + 0x10, 0x0c, 0x02, 0xfe, 0x6c, 0xfb, 0x96, 0x89, 0xfd, 0x26, 0xb8, 0x03, 0x8c, 0x82, 0xfe, 0x42, + 0x4d, 0xff, 0x68, 0x9d, 0xff, 0xb6, 0x9a, 0xfe, 0x26, 0xdc, 0xff, 0x5b, 0xf3, 0xfe, 0xfa, 0xb8, + 0xfc, 0x99, 0xce, 0xfe, 0xc5, 0xff, 0xfd, 0x7e, 0xed, 0xfd, 0xf6, 0x91, 0xfe, 0xe3, 0x2a, 0xff, + 0xba, 0xe4, 0x00, 0xbd, 0xb7, 0xff, 0x4a, 0xf5, 0x21, 0x67, 0x8e, 0x1a, 0xea, 0x8a, 0x03, 0xcb, + 0xb7, 0x12, 0x7a, 0xb7, 0x00, 0xc9, 0x9a, 0xfb, 0x82, 0x2b, 0xff, 0xc2, 0x45, 0xf6, 0x80, 0xfc, + 0xff, 0x52, 0x7c, 0xff, 0x23, 0xd5, 0xee, 0xee, 0x4c, 0xfd, 0xba, 0xa6, 0x02, 0x0d, 0xa9, 0xf8, + 0xa4, 0xa0, 0x02, 0xb7, 0xd4, 0xfc, 0xa7, 0xba, 0xfc, 0x2a, 0xdc, 0x03, 0x44, 0x22, 0xfe, 0x88, + 0x11, 0xff, 0xf4, 0x82, 0x00, 0x6f, 0xf9, 0xfe, 0x40, 0x5c, 0xff, 0x18, 0xf8, 0xfe, 0x1d, 0xb5, + 0xfc, 0xd4, 0xd7, 0xfe, 0xbf, 0xf1, 0xfd, 0x7d, 0x72, 0xfd, 0x36, 0x60, 0xfe, 0xb5, 0x84, 0xff, + 0x7d, 0xfc, 0x00, 0x91, 0xbe, 0xfe, 0xba, 0xe5, 0x25, 0x94, 0xa2, 0x1a, 0xc9, 0xc5, 0xfe, 0x06, + 0xbe, 0x15, 0x65, 0x5b, 0x00, 0x1e, 0x4f, 0xf9, 0x0f, 0xff, 0x00, 0x29, 0x49, 0xf6, 0x47, 0x9d, + 0x03, 0xac, 0xc5, 0x01, 0xa5, 0xfc, 0xe8, 0x23, 0x6c, 0xf9, 0xfd, 0xf2, 0x04, 0x31, 0x38, 0xf9, + 0xcc, 0x44, 0x02, 0x9d, 0x68, 0xfd, 0x30, 0x5e, 0xfc, 0x4c, 0xdd, 0x03, 0x61, 0x36, 0xfe, 0xd4, + 0x71, 0xfe, 0x0a, 0xaa, 0x00, 0x07, 0xba, 0xff, 0x8a, 0x58, 0xff, 0x5b, 0x13, 0xff, 0xb3, 0x4e, + 0xfc, 0xcd, 0xf8, 0xfd, 0xb6, 0x1a, 0xfe, 0xe7, 0xd7, 0xfd, 0x10, 0x0e, 0xfe, 0xcc, 0x0b, 0xff, + 0x42, 0x69, 0x00, 0x03, 0x75, 0xfe, 0x03, 0xdd, 0x29, 0xe6, 0xb6, 0x1c, 0xfa, 0xf0, 0xf8, 0x58, + 0x52, 0x16, 0x00, 0xb5, 0x01, 0x81, 0x4d, 0xf7, 0x6a, 0xce, 0x02, 0xe9, 0x18, 0xf6, 0x24, 0x98, + 0x06, 0xc5, 0x85, 0x05, 0xda, 0x6e, 0xe5, 0x45, 0x75, 0xf4, 0x19, 0x1d, 0x06, 0x58, 0xfb, 0xfa, + 0x4f, 0xba, 0x01, 0x3e, 0x7d, 0xfe, 0xc7, 0x13, 0xfc, 0x8d, 0x68, 0x03, 0x8e, 0x5d, 0xfe, 0xf3, + 0xf1, 0xfd, 0x28, 0x50, 0x00, 0xa6, 0x14, 0x01, 0x16, 0xda, 0xff, 0x76, 0x43, 0xfe, 0x03, 0x1b, + 0xfc, 0x86, 0xce, 0xfd, 0xf5, 0x88, 0xfe, 0xb1, 0xeb, 0xfd, 0x30, 0xb7, 0xfc, 0xea, 0xe6, 0xfe, + 0x29, 0x70, 0x01, 0x07, 0x42, 0xfe, 0x85, 0x9d, 0x2f, 0x2b, 0x81, 0x1f, 0x3a, 0x35, 0xf2, 0x92, + 0x53, 0x13, 0xa1, 0xb7, 0x02, 0xcc, 0x0c, 0xf7, 0xfd, 0x09, 0x05, 0x54, 0x11, 0xf5, 0xc5, 0xff, + 0x06, 0x19, 0xb1, 0x09, 0x1a, 0x79, 0xe4, 0x21, 0x03, 0xf0, 0xdc, 0x25, 0x05, 0xda, 0x3d, 0xfd, + 0xa8, 0x04, 0x02, 0x3c, 0x43, 0xff, 0x74, 0x97, 0xfb, 0xe2, 0x57, 0x02, 0xe4, 0x86, 0xfe, 0xd7, + 0x56, 0xfd, 0xb8, 0x35, 0x00, 0x8b, 0xbf, 0x01, 0xf0, 0xe1, 0xff, 0x62, 0x8e, 0xfd, 0x5e, 0x40, + 0xfc, 0xfd, 0x8b, 0xfd, 0x1b, 0xd6, 0xfd, 0x50, 0x02, 0xfe, 0xfa, 0xa8, 0xfc, 0x1f, 0x23, 0xff, + 0x51, 0xca, 0x01, 0x8c, 0xd7, 0xfd, 0xce, 0x19, 0x35, 0xa5, 0x73, 0x21, 0xf4, 0xf7, 0xec, 0xc4, + 0xc7, 0x10, 0xbb, 0xd3, 0x02, 0x06, 0x2b, 0xf7, 0xb7, 0x04, 0x07, 0x8c, 0x6a, 0xf3, 0xdb, 0x5e, + 0x07, 0xf6, 0x86, 0x0f, 0xbb, 0x3b, 0xe3, 0xc4, 0x68, 0xec, 0x93, 0x1f, 0x04, 0x5a, 0xe5, 0xfe, + 0xb7, 0x37, 0x03, 0xbc, 0x1e, 0xff, 0x0c, 0x85, 0xfb, 0xfe, 0xf5, 0x00, 0x32, 0xc2, 0xfe, 0x6f, + 0x55, 0xfd, 0x62, 0xe4, 0xff, 0x2c, 0x96, 0x01, 0xb0, 0x05, 0x00, 0x30, 0x90, 0xfd, 0xa7, 0xb3, + 0xfb, 0x11, 0xfa, 0xfc, 0xe2, 0x71, 0xfd, 0x2e, 0xf4, 0xfe, 0x2d, 0xf3, 0xfc, 0xa8, 0x0d, 0xff, + 0xa9, 0xcf, 0x01, 0x7c, 0xd3, 0xfd, 0x45, 0xc8, 0x3a, 0xec, 0xda, 0x24, 0x2e, 0xf1, 0xe6, 0x3d, + 0x7e, 0x0b, 0x67, 0xcc, 0x00, 0xb1, 0x8a, 0xfa, 0xab, 0x11, 0x0a, 0xff, 0xad, 0xef, 0x09, 0x9a, + 0x06, 0x4d, 0x75, 0x13, 0xee, 0xa0, 0xe3, 0x51, 0x6e, 0xeb, 0x75, 0xa3, 0x02, 0x69, 0x6a, 0xfe, + 0xc1, 0x11, 0x04, 0xf8, 0xa9, 0xff, 0xd0, 0xff, 0xfa, 0xdd, 0xcc, 0xff, 0xc2, 0xcb, 0xfe, 0x3e, + 0xe9, 0xfc, 0x67, 0x31, 0xff, 0xf6, 0x9a, 0x01, 0xfa, 0xe4, 0xff, 0xe9, 0xe1, 0xfc, 0x2d, 0xf9, + 0xfa, 0x15, 0x86, 0xfc, 0x70, 0x76, 0xfd, 0x18, 0xd0, 0xff, 0xa4, 0x27, 0xfd, 0xc1, 0xc7, 0xfe, + 0x3c, 0x0f, 0x02, 0x14, 0x07, 0xfe, 0x7a, 0x87, 0x40, 0x4e, 0x5b, 0x27, 0x29, 0xac, 0xe2, 0x12, + 0xa6, 0x07, 0xd5, 0x0c, 0xfe, 0x7c, 0x38, 0xff, 0xbd, 0x8d, 0x0b, 0xd1, 0x83, 0xec, 0x37, 0xa4, + 0x07, 0xa8, 0xee, 0x15, 0x09, 0x96, 0xe6, 0xb0, 0x42, 0xeb, 0x6f, 0xa7, 0x00, 0xaf, 0x20, 0xfd, + 0x6f, 0x5e, 0x05, 0x48, 0x8e, 0x01, 0xa2, 0x5a, 0xfa, 0x1a, 0x8a, 0xfe, 0x14, 0xfa, 0xfe, 0xf7, + 0x17, 0xfd, 0x9a, 0xa7, 0xfe, 0x3a, 0xb2, 0x01, 0x17, 0x5a, 0xff, 0x67, 0xf8, 0xfc, 0xb5, 0xcf, + 0xfa, 0xc0, 0x04, 0xfc, 0x74, 0xbe, 0xfd, 0x6e, 0x84, 0x00, 0x72, 0x7f, 0xfd, 0xd2, 0x00, 0xff, + 0x88, 0xce, 0x02, 0xdf, 0xc9, 0xfd, 0xf9, 0x4d, 0x45, 0xc2, 0x54, 0x29, 0x65, 0x63, 0xdf, 0x45, + 0x60, 0x04, 0xec, 0x44, 0xfb, 0xa0, 0x85, 0x02, 0xc6, 0x5a, 0x0b, 0x36, 0xf1, 0xea, 0x97, 0xcf, + 0x07, 0x9f, 0xff, 0x17, 0x98, 0x41, 0xea, 0x96, 0x32, 0xea, 0x8f, 0x29, 0xff, 0x21, 0x02, 0xfb, + 0x43, 0xf3, 0x06, 0xb3, 0x1d, 0x03, 0x8f, 0xcd, 0xf8, 0xa9, 0xdd, 0xfd, 0xd1, 0x4d, 0xff, 0x55, + 0xf7, 0xfc, 0x76, 0xba, 0xfd, 0xc4, 0x6d, 0x01, 0xf4, 0xcf, 0xfe, 0xde, 0xae, 0xfd, 0x44, 0x5a, + 0xfa, 0xac, 0x12, 0xfb, 0xc2, 0x0a, 0xfe, 0x2d, 0xfb, 0x00, 0x1b, 0xf0, 0xfd, 0xac, 0x59, 0xff, + 0xe2, 0xd5, 0x02, 0x80, 0x46, 0xfd, 0x5b, 0x4f, 0x49, 0xba, 0xef, 0x2a, 0x96, 0x5f, 0xdd, 0x95, + 0xe9, 0x01, 0xdb, 0xe1, 0xf8, 0x84, 0x3d, 0x04, 0x9a, 0xbc, 0x0a, 0x56, 0x19, 0xeb, 0xd6, 0x9f, + 0x06, 0xcd, 0xaf, 0x19, 0xd3, 0xd7, 0xee, 0x43, 0x1d, 0xe9, 0xd2, 0x3e, 0xfe, 0xdd, 0x86, 0xf8, + 0x92, 0x07, 0x08, 0x01, 0x99, 0x04, 0x7d, 0x86, 0xf7, 0x34, 0xbf, 0xfd, 0x0d, 0xca, 0xff, 0xad, + 0x26, 0xfc, 0x55, 0xe4, 0xfc, 0x03, 0xa9, 0x01, 0xe3, 0x70, 0xfe, 0xee, 0x57, 0xfe, 0xb8, 0xcd, + 0xf9, 0x3d, 0x4c, 0xfa, 0x99, 0x5e, 0xfe, 0x7e, 0x5e, 0x01, 0xed, 0x7c, 0xfe, 0x24, 0x74, 0xff, + 0x7a, 0x53, 0x02, 0x60, 0x51, 0xfd, 0x57, 0x05, 0x4b, 0x70, 0xc4, 0x2d, 0x74, 0x58, 0xdc, 0xb3, + 0x02, 0x00, 0x92, 0xed, 0xf6, 0xc1, 0x19, 0x04, 0xc7, 0x3b, 0x0a, 0xc8, 0xdd, 0xeb, 0xe3, 0xcd, + 0x03, 0x10, 0x1d, 0x1b, 0xfc, 0xbe, 0xf4, 0xa6, 0xda, 0xe7, 0xba, 0x21, 0xfd, 0xdd, 0x0d, 0xf6, + 0x6d, 0xe0, 0x07, 0x87, 0x7d, 0x06, 0xd3, 0xca, 0xf6, 0x5d, 0x9c, 0xfd, 0x93, 0xfe, 0xff, 0xfe, + 0x1b, 0xfb, 0x98, 0x39, 0xfc, 0x70, 0x33, 0x02, 0x4f, 0xad, 0xfd, 0xef, 0xba, 0xfe, 0x54, 0xda, + 0xf9, 0xd9, 0x97, 0xf9, 0x0b, 0x81, 0xfe, 0x33, 0x9d, 0x01, 0x34, 0xbd, 0xfe, 0x4d, 0x28, 0xff, + 0xc9, 0xf4, 0x01, 0xa8, 0x5c, 0xfd, 0xff, 0x58, 0x4d, 0xbe, 0x42, 0x2e, 0x71, 0x3c, 0xdd, 0xdb, + 0x18, 0xff, 0xbb, 0xd2, 0xf4, 0x0d, 0xd1, 0x03, 0x52, 0x25, 0x09, 0x91, 0x2e, 0xec, 0x78, 0x5b, + 0x01, 0xf5, 0x8e, 0x1c, 0x52, 0xaf, 0xf9, 0x13, 0x19, 0xe8, 0xe6, 0x78, 0xfb, 0x6f, 0xd8, 0xf3, + 0x86, 0xd9, 0x07, 0xb8, 0x80, 0x07, 0x25, 0x49, 0xf7, 0xa3, 0x25, 0xfd, 0x24, 0x39, 0x00, 0xf9, + 0x3d, 0xfa, 0x70, 0x0c, 0xfc, 0x0a, 0x55, 0x02, 0x9a, 0xe8, 0xfc, 0x2c, 0x36, 0xff, 0x34, 0x34, + 0xfa, 0x26, 0x70, 0xf9, 0x76, 0x87, 0xfe, 0x29, 0xb4, 0x01, 0xc4, 0x3a, 0xfe, 0x45, 0x3b, 0xff, + 0x10, 0x8c, 0x01, 0x3a, 0x3a, 0xfd, 0x35, 0xb7, 0x4d, 0x26, 0x62, 0x2f, 0x40, 0x45, 0xdf, 0x94, + 0x6e, 0xfe, 0x9d, 0x7c, 0xf2, 0x2a, 0xca, 0x02, 0xf8, 0xe9, 0x08, 0xa5, 0x28, 0xeb, 0x88, 0xb1, + 0xfe, 0x9c, 0xd5, 0x1d, 0xdf, 0xb5, 0xfd, 0x91, 0x7a, 0xe9, 0x53, 0xb1, 0xf9, 0x9d, 0xff, 0xf1, + 0xa0, 0xd4, 0x06, 0x82, 0x24, 0x08, 0x01, 0xbe, 0xf8, 0x70, 0xe3, 0xfb, 0xe2, 0x4e, 0x00, 0x60, + 0x53, 0xfa, 0xfe, 0x51, 0xfb, 0x6d, 0xdf, 0x01, 0x88, 0x94, 0xfc, 0xa8, 0xae, 0xff, 0x53, 0xba, + 0xfa, 0x2a, 0xa7, 0xf9, 0x73, 0x05, 0xfe, 0x7d, 0x42, 0x01, 0xa8, 0xd3, 0xfd, 0xbf, 0xf8, 0xfe, + 0xc7, 0x4e, 0x01, 0x48, 0x61, 0xfd, 0xb2, 0x59, 0x4c, 0x5f, 0x5c, 0x31, 0x8c, 0xa5, 0xe2, 0x94, + 0x88, 0xfe, 0x60, 0x79, 0xef, 0x53, 0x97, 0x01, 0xc6, 0x4a, 0x0a, 0x30, 0xd3, 0xe8, 0x5d, 0x2b, + 0xfc, 0x58, 0x5c, 0x1e, 0xa9, 0x22, 0x01, 0x1c, 0x8f, 0xec, 0xab, 0xb1, 0xf8, 0x86, 0x34, 0xf0, + 0xd3, 0xc4, 0x04, 0x2d, 0x9e, 0x08, 0xd4, 0xf8, 0xfa, 0x6e, 0xbd, 0xfa, 0x48, 0xe1, 0xff, 0xcb, + 0x21, 0xfb, 0xcf, 0x70, 0xfa, 0x73, 0x85, 0x01, 0x93, 0xb1, 0xfc, 0x9b, 0x24, 0x00, 0x50, 0xe1, + 0xfb, 0xd8, 0x26, 0xf9, 0x3c, 0x32, 0xfd, 0x91, 0x14, 0x01, 0xf0, 0x30, 0xfd, 0xdf, 0x3e, 0xff, + 0x45, 0xa4, 0x01, 0x28, 0x33, 0xfd, 0xd0, 0x72, 0x49, 0x8a, 0x9c, 0x33, 0x2f, 0x6b, 0xe7, 0x78, + 0x2d, 0xff, 0x4c, 0x72, 0xec, 0x1e, 0x2e, 0x00, 0x1c, 0x47, 0x0c, 0x17, 0x39, 0xe6, 0x9d, 0x52, + 0xf9, 0x4f, 0x7a, 0x1e, 0xd1, 0xd2, 0x03, 0x4c, 0xda, 0xf0, 0xcf, 0x7d, 0xf9, 0x38, 0x46, 0xed, + 0x12, 0x79, 0x02, 0x11, 0x24, 0x09, 0x45, 0xa6, 0xfc, 0x79, 0xb7, 0xfa, 0x40, 0xc9, 0xfe, 0x5a, + 0xa4, 0xfb, 0xe6, 0x56, 0xfa, 0x8f, 0x78, 0x01, 0xce, 0x4c, 0xfd, 0x40, 0xaf, 0x00, 0x80, 0xf2, + 0xfb, 0x93, 0x17, 0xf9, 0x4e, 0x5d, 0xfc, 0x0c, 0x10, 0x00, 0xd7, 0x29, 0xfe, 0x59, 0x91, 0xff, + 0x85, 0xb7, 0x01, 0x06, 0x48, 0xfd, 0xee, 0x4d, 0x46, 0x11, 0x69, 0x34, 0xf5, 0x4c, 0xed, 0x78, + 0x01, 0x00, 0x54, 0xf1, 0xe9, 0x88, 0x3c, 0xff, 0x4c, 0x43, 0x0d, 0xfb, 0x10, 0xe5, 0x32, 0x59, + 0xf5, 0xdb, 0x4e, 0x1e, 0xe7, 0x85, 0x06, 0x6e, 0x62, 0xf4, 0xdd, 0x7d, 0xfc, 0xfe, 0x8c, 0xe9, + 0x6e, 0x1a, 0x00, 0x89, 0xe4, 0x09, 0x14, 0x05, 0xfd, 0xd5, 0x5a, 0xfb, 0x93, 0xa5, 0xfd, 0x54, + 0x36, 0xfb, 0x3b, 0x7d, 0xfb, 0x9d, 0x5d, 0x02, 0x04, 0xd9, 0xfc, 0xfe, 0x08, 0x01, 0x9a, 0x1a, + 0xfc, 0x43, 0x57, 0xf8, 0x19, 0x55, 0xfc, 0x33, 0xb2, 0xff, 0x7d, 0xf2, 0xfe, 0x0a, 0xd6, 0xff, + 0x91, 0xd7, 0x01, 0x4d, 0x9a, 0xfd, 0xe8, 0x8c, 0x41, 0x1c, 0xd8, 0x35, 0x96, 0xbf, 0xf3, 0x36, + 0x91, 0x00, 0x2f, 0xeb, 0xe8, 0x8f, 0xaf, 0xfc, 0xb4, 0xd7, 0x0c, 0xe7, 0xb1, 0xe7, 0x78, 0x6f, + 0xef, 0xe5, 0x70, 0x1c, 0x2f, 0x52, 0x0b, 0xfe, 0xd7, 0xf5, 0x89, 0xc5, 0x01, 0x4d, 0xbf, 0xe6, + 0x48, 0xee, 0xfb, 0x47, 0xe5, 0x0a, 0xb2, 0x3d, 0xfc, 0xf8, 0x68, 0xfc, 0x49, 0x83, 0xfd, 0xc6, + 0x42, 0xfa, 0xbd, 0xe2, 0xfc, 0xb3, 0xcb, 0x02, 0x74, 0x0b, 0xfc, 0xd1, 0x00, 0x02, 0x46, 0x5f, + 0xfb, 0x25, 0xeb, 0xf7, 0x5a, 0xc3, 0xfd, 0xbb, 0xc4, 0xfe, 0xc5, 0x93, 0xff, 0xa2, 0x6e, 0x00, + 0xd8, 0x88, 0x01, 0xa5, 0x7e, 0xfd, 0xab, 0x3b, 0x3e, 0xcd, 0x9e, 0x34, 0xb1, 0x13, 0xfa, 0xd6, + 0x36, 0x01, 0x57, 0x1b, 0xe8, 0xca, 0xea, 0xfa, 0xf2, 0x96, 0x09, 0xf8, 0x6b, 0xec, 0x0f, 0x0e, + 0xeb, 0x33, 0x61, 0x18, 0xba, 0x41, 0x10, 0x15, 0x8f, 0xf6, 0x32, 0xd3, 0x06, 0x77, 0x9e, 0xe6, + 0x94, 0xfe, 0xf5, 0xb3, 0x23, 0x0b, 0xd1, 0x5f, 0xfb, 0x61, 0xc9, 0xfc, 0xe5, 0x29, 0xff, 0x40, + 0x47, 0xf9, 0x0c, 0x40, 0xfc, 0xe2, 0xb9, 0x03, 0xa7, 0xac, 0xfb, 0xdd, 0x67, 0x01, 0xb1, 0x50, + 0xfc, 0x7d, 0x6e, 0xf7, 0x16, 0xd0, 0xfe, 0x98, 0x30, 0xff, 0xe8, 0x48, 0xff, 0x93, 0x6b, 0x00, + 0x4c, 0x57, 0x01, 0x3a, 0xbf, 0xfd, 0x93, 0xe9, 0x3b, 0x68, 0x63, 0x32, 0x07, 0x41, 0xfe, 0x04, + 0x53, 0x03, 0xce, 0x20, 0xe9, 0x29, 0xf4, 0xf8, 0xd0, 0x2e, 0x06, 0x18, 0xa7, 0xef, 0xb8, 0xd1, + 0xe9, 0xfb, 0xae, 0x13, 0x76, 0xbd, 0x14, 0xc2, 0x31, 0xf8, 0x48, 0x24, 0x09, 0x4e, 0x2e, 0xea, + 0x4b, 0x64, 0xef, 0xc4, 0xb0, 0x0a, 0xe4, 0x92, 0xfb, 0xd7, 0x3e, 0xfc, 0xb5, 0x97, 0x00, 0xf7, + 0x41, 0xf9, 0x6f, 0x3f, 0xfc, 0x84, 0x25, 0x03, 0x27, 0x7d, 0xfb, 0xbc, 0x79, 0x01, 0x5a, 0xdc, + 0xfd, 0xe2, 0x41, 0xf7, 0x88, 0x02, 0x00, 0xa4, 0x3e, 0xff, 0x84, 0xa5, 0xfe, 0x4c, 0x0d, 0x01, + 0x31, 0xfc, 0x00, 0xee, 0x8a, 0xfd, 0x23, 0x39, 0x3a, 0x23, 0x39, 0x31, 0x19, 0xf5, 0xfd, 0x71, + 0x54, 0x06, 0xac, 0x26, 0xec, 0xc4, 0xc0, 0xf4, 0xd1, 0x96, 0x04, 0x47, 0xfa, 0xf1, 0x30, 0x4f, + 0xe8, 0xd9, 0x30, 0x10, 0xdc, 0xf2, 0x18, 0xe3, 0x8c, 0xf9, 0x9a, 0x55, 0x09, 0xce, 0x13, 0xef, + 0xa5, 0x95, 0xe9, 0x96, 0xec, 0x09, 0xdb, 0xeb, 0xfc, 0x49, 0xef, 0xf9, 0xc8, 0x82, 0x01, 0xe2, + 0x9e, 0xf9, 0x9e, 0xe9, 0xfb, 0x8f, 0x1e, 0x03, 0x51, 0x0b, 0xfb, 0xf8, 0x13, 0x01, 0x43, 0x0f, + 0x00, 0x27, 0xea, 0xf7, 0x0f, 0x67, 0xff, 0x31, 0x87, 0xff, 0x0f, 0xfc, 0xfe, 0x0b, 0x98, 0x00, + 0xb8, 0xa1, 0x00, 0x08, 0xe4, 0xfd, 0xd6, 0xc7, 0x3a, 0xb4, 0xa5, 0x2d, 0x9e, 0x23, 0xfc, 0x47, + 0xf5, 0x0a, 0x0e, 0x63, 0xec, 0xf8, 0xd5, 0xf1, 0x53, 0x01, 0x05, 0xcc, 0xa8, 0xf3, 0xb7, 0x4b, + 0xe7, 0xad, 0x84, 0x0c, 0x5a, 0xa2, 0x1b, 0x16, 0x22, 0xfb, 0x39, 0xe4, 0x09, 0x64, 0x8c, 0xf2, + 0x14, 0xd8, 0xe6, 0x09, 0x18, 0x07, 0x5c, 0xd0, 0xfe, 0x7f, 0xd8, 0xf9, 0xf0, 0xde, 0xff, 0x81, + 0x60, 0xf9, 0xd0, 0x69, 0xfb, 0x2b, 0x5e, 0x04, 0xef, 0x7a, 0xfb, 0x9a, 0x03, 0x00, 0x71, 0x91, + 0x01, 0x6a, 0x7a, 0xf8, 0x61, 0x32, 0xff, 0x8f, 0xac, 0xff, 0xcb, 0x73, 0xfe, 0xca, 0xb2, 0x00, + 0xd1, 0x97, 0x00, 0xe0, 0xb4, 0xfd, 0x5c, 0x69, 0x38, 0x2e, 0x5d, 0x2a, 0xec, 0x33, 0xfd, 0x85, + 0x74, 0x0f, 0x6a, 0x14, 0xea, 0x64, 0xf9, 0xf0, 0xdb, 0x8e, 0x07, 0x82, 0xbe, 0xf3, 0x1c, 0x78, + 0xe8, 0x84, 0x8a, 0x05, 0x27, 0x40, 0x1c, 0x7e, 0xfd, 0xfe, 0xb1, 0x53, 0x09, 0x93, 0x8f, 0xf8, + 0x4c, 0x3c, 0xe4, 0xd6, 0xf4, 0x02, 0xd7, 0x73, 0x01, 0x93, 0x5b, 0xfa, 0xfa, 0x6c, 0xfe, 0x1b, + 0x35, 0xf8, 0x71, 0x2d, 0xfa, 0x7f, 0x72, 0x05, 0xf9, 0x22, 0xfd, 0xe0, 0xf0, 0xfe, 0x89, 0x30, + 0x03, 0x6f, 0xfd, 0xf7, 0xc6, 0xa9, 0xfd, 0xb5, 0x76, 0x01, 0x55, 0x48, 0xfe, 0x52, 0x49, 0x00, + 0xbb, 0x2d, 0x00, 0x02, 0xa0, 0xfd, 0x94, 0x25, 0x34, 0x58, 0xdf, 0x26, 0x35, 0xf2, 0xfe, 0x55, + 0x86, 0x12, 0x26, 0x6c, 0xeb, 0x5d, 0x7e, 0xf0, 0xe5, 0xa0, 0x07, 0xe2, 0xdb, 0xf5, 0x15, 0xa0, + 0xe8, 0xeb, 0x0f, 0xff, 0x02, 0xf3, 0x1a, 0x8b, 0x91, 0x02, 0xa4, 0x5c, 0x08, 0x07, 0x7e, 0xfe, + 0x41, 0x34, 0xe5, 0x96, 0xc3, 0xfd, 0x1b, 0xdf, 0x03, 0xdb, 0xf2, 0xf9, 0xc6, 0xaa, 0xfd, 0x18, + 0xb8, 0xf8, 0x85, 0x06, 0xf8, 0xf0, 0x5f, 0x04, 0xb6, 0x2e, 0xfe, 0x9d, 0xb0, 0x00, 0x84, 0xe3, + 0x03, 0xe1, 0xcf, 0xf5, 0x2d, 0xca, 0xfc, 0x0b, 0xae, 0x03, 0x64, 0x3c, 0xfe, 0x7e, 0x53, 0xff, + 0x4a, 0xfc, 0xff, 0x53, 0x24, 0xfe, 0x98, 0x7e, 0x32, 0x4f, 0x2c, 0x22, 0xf2, 0xa5, 0xfa, 0x19, + 0x11, 0x17, 0xa8, 0xe4, 0xf1, 0xbe, 0x8d, 0xf0, 0x62, 0x06, 0x06, 0x8e, 0x14, 0xf5, 0xd6, 0xa7, + 0xe9, 0xef, 0xc2, 0xfa, 0xd7, 0x03, 0x1b, 0xe1, 0x20, 0x05, 0xc9, 0x40, 0x03, 0x38, 0xb4, 0x03, + 0xf5, 0x0e, 0xea, 0xfd, 0xcb, 0xf9, 0x1d, 0xe0, 0x04, 0xcc, 0xf0, 0xfa, 0x18, 0xf4, 0xfb, 0x67, + 0xe9, 0xf8, 0x7d, 0x7e, 0xf7, 0xa5, 0x30, 0x02, 0x18, 0x58, 0xff, 0xbf, 0xf7, 0x00, 0xad, 0xfc, + 0x03, 0xf3, 0x13, 0xf6, 0xac, 0x7a, 0xfb, 0x19, 0xbe, 0x04, 0x68, 0xb0, 0xfe, 0x43, 0xc0, 0xfe, + 0x50, 0xd7, 0xff, 0xe9, 0xba, 0xfe, 0xcf, 0x1c, 0x2f, 0xf6, 0x86, 0x1e, 0xc8, 0xf3, 0xfa, 0xf8, + 0x1b, 0x19, 0x6d, 0x3c, 0xf4, 0x7d, 0x9d, 0xf0, 0x09, 0x21, 0x06, 0xae, 0x00, 0xf8, 0x8c, 0xdd, + 0xea, 0x95, 0xa1, 0xf6, 0xb7, 0xae, 0x19, 0x00, 0xad, 0x05, 0xa1, 0x72, 0xfd, 0x4f, 0x2b, 0x0a, + 0xa4, 0x26, 0xf1, 0xc2, 0xdb, 0xf3, 0xcd, 0xc0, 0x06, 0x47, 0xf2, 0xfb, 0xec, 0x8f, 0xf9, 0x47, + 0x33, 0xfb, 0x0b, 0x18, 0xf8, 0xca, 0x03, 0x00, 0xf0, 0x63, 0xfe, 0x47, 0x6d, 0xff, 0x2f, 0x9f, + 0x04, 0x32, 0x5c, 0xf9, 0x9b, 0x1e, 0xfa, 0x84, 0x19, 0x03, 0x87, 0x11, 0x00, 0x6c, 0x13, 0xff, + 0xde, 0xef, 0xff, 0xb0, 0xd0, 0xfe, 0x64, 0xe5, 0x2a, 0xcb, 0x72, 0x1b, 0xf1, 0xc4, 0xfc, 0x1a, + 0xac, 0x18, 0x29, 0x69, 0xf5, 0x1c, 0xc6, 0xf2, 0xac, 0x13, 0x05, 0xa2, 0xe3, 0xf9, 0x30, 0x1f, + 0xed, 0xf5, 0x3a, 0xf4, 0xb4, 0xbb, 0x17, 0xcb, 0x72, 0x04, 0x92, 0x0a, 0xfb, 0xf0, 0x6d, 0x0c, + 0xa9, 0xae, 0xf5, 0x25, 0x99, 0xf2, 0x81, 0xa2, 0x06, 0xc8, 0xdd, 0xfc, 0x89, 0x6c, 0xf8, 0x45, + 0x74, 0xfc, 0x57, 0x1c, 0xf9, 0x0b, 0x39, 0xff, 0xa5, 0x29, 0xfd, 0x67, 0x10, 0xfd, 0xa1, 0xbf, + 0x03, 0xb8, 0x5d, 0xfc, 0xdc, 0x31, 0xfb, 0x6c, 0x72, 0x01, 0x73, 0x53, 0xff, 0x8a, 0x86, 0xff, + 0x8d, 0x19, 0x01, 0x7a, 0xf0, 0xfe, 0x92, 0x76, 0x27, 0xd2, 0x54, 0x18, 0xef, 0xab, 0xfd, 0x55, + 0xb2, 0x18, 0x1f, 0xd8, 0xf6, 0x70, 0xde, 0xf4, 0x88, 0xb7, 0x04, 0x81, 0x6c, 0xfa, 0x52, 0xd1, + 0xef, 0xaa, 0x15, 0xf4, 0x30, 0x59, 0x14, 0xa2, 0xb1, 0x04, 0x6a, 0x9a, 0xfa, 0xd8, 0x5a, 0x0b, + 0x32, 0x46, 0xf8, 0x16, 0xb0, 0xf3, 0xe7, 0x3d, 0x06, 0x61, 0xad, 0xfd, 0x09, 0x17, 0xf9, 0x78, + 0xb3, 0xfc, 0x4a, 0xe9, 0xf9, 0x84, 0xeb, 0xfe, 0xa2, 0x51, 0xfd, 0xb1, 0xff, 0xfb, 0x44, 0x5e, + 0x01, 0x29, 0x66, 0xfd, 0xd6, 0x32, 0xfd, 0x6a, 0x8b, 0x01, 0x49, 0x76, 0xfe, 0xb5, 0x23, 0xff, + 0x4d, 0xc1, 0x01, 0xba, 0x4e, 0xff, 0xeb, 0x27, 0x28, 0xe5, 0x4b, 0x18, 0xd3, 0xfb, 0xf2, 0xb9, + 0x87, 0x19, 0x57, 0xed, 0x01, 0x5f, 0x32, 0xf1, 0x64, 0xb6, 0xff, 0x6d, 0xc0, 0xfd, 0x90, 0x63, + 0xf2, 0xa7, 0x3c, 0xf5, 0xca, 0xc7, 0x14, 0x81, 0xc9, 0xfe, 0x7d, 0x52, 0xf6, 0xbf, 0x4b, 0x09, + 0xc1, 0x72, 0xfd, 0x66, 0x83, 0xf9, 0xa1, 0xfe, 0x08, 0x2c, 0x28, 0x02, 0x5c, 0x39, 0xfc, 0x7b, + 0x14, 0x00, 0xf3, 0x9e, 0xfb, 0xa7, 0x74, 0xfe, 0xbe, 0xbe, 0xf9, 0xa1, 0x17, 0xf8, 0xc3, 0x72, + 0xfe, 0x00, 0x28, 0xfd, 0x8c, 0x86, 0xfb, 0xb7, 0x7b, 0xff, 0x9c, 0x52, 0xff, 0xaf, 0x0c, 0x00, + 0x75, 0x7f, 0x01, 0xa4, 0xde, 0xfe, 0x8b, 0x98, 0x21, 0x5f, 0x07, 0x18, 0xed, 0x42, 0xf9, 0xfd, + 0x28, 0x16, 0x6e, 0xf8, 0x00, 0x34, 0xb5, 0xf2, 0xe0, 0x29, 0x00, 0x5c, 0x2b, 0xfd, 0x6d, 0xa5, + 0xf4, 0x76, 0x40, 0xf6, 0x77, 0xa6, 0x0f, 0xd0, 0x30, 0x01, 0xf6, 0xd1, 0xf9, 0xc4, 0xaa, 0x07, + 0xc6, 0x2f, 0xfd, 0x99, 0xcc, 0xf9, 0xe0, 0x91, 0x06, 0xf8, 0xc6, 0x01, 0x0a, 0x7a, 0xfd, 0xf2, + 0xc7, 0xff, 0xc3, 0x9b, 0xfb, 0x4a, 0xc7, 0xfe, 0x66, 0x3f, 0xfb, 0x39, 0x7e, 0xf9, 0x6b, 0xc9, + 0xfe, 0xe7, 0xea, 0xfc, 0x88, 0x06, 0xfc, 0xcc, 0x73, 0xff, 0x38, 0x05, 0xff, 0xab, 0x5a, 0xff, + 0xe9, 0x13, 0x01, 0x7b, 0x92, 0xff, 0xeb, 0x2f, 0x1c, 0xf3, 0x18, 0x16, 0x7c, 0x45, 0xfd, 0x33, + 0xd8, 0x13, 0x51, 0x63, 0x01, 0x77, 0xbd, 0xf5, 0x01, 0x35, 0x01, 0x8b, 0x38, 0xfd, 0x3f, 0x71, + 0xf5, 0x37, 0x6f, 0xf7, 0xc7, 0x6f, 0x0c, 0xdc, 0x9e, 0x01, 0x19, 0xd1, 0xfb, 0x4f, 0x29, 0x06, + 0x50, 0xd4, 0xfd, 0x3a, 0x61, 0xfa, 0xc9, 0xb5, 0x04, 0x33, 0x03, 0x02, 0xa4, 0x9c, 0xfd, 0x2c, + 0x7d, 0xff, 0x7b, 0x71, 0xfc, 0xaf, 0x58, 0xfe, 0x0a, 0x8a, 0xfc, 0x51, 0x46, 0xfb, 0x1f, 0xeb, + 0xfe, 0x3b, 0xbb, 0xfd, 0x42, 0x6b, 0xfc, 0x0c, 0x16, 0xff, 0x33, 0x57, 0xff, 0x64, 0xe3, 0xfe, + 0x58, 0x1d, 0x00, 0x39, 0x60, 0xff, 0x78, 0x71, 0x17, 0x64, 0xd4, 0x13, 0xb5, 0xba, 0x00, 0x60, + 0x09, 0x12, 0xf2, 0x6d, 0x01, 0x60, 0x8d, 0xf8, 0x5e, 0xa8, 0x02, 0xa7, 0x33, 0xfd, 0xb0, 0xf8, + 0xf5, 0x70, 0xc6, 0xf8, 0x7f, 0xf3, 0x09, 0x14, 0x31, 0x02, 0x0e, 0xab, 0xfc, 0x2c, 0xc9, 0x04, + 0x9f, 0x03, 0xff, 0xaf, 0x4d, 0xfa, 0x0e, 0x3d, 0x03, 0x45, 0x69, 0x02, 0x69, 0xd4, 0xfd, 0xab, + 0x4a, 0xff, 0xce, 0xef, 0xfc, 0x16, 0x71, 0xfe, 0x1b, 0x41, 0xfd, 0x75, 0xe1, 0xfc, 0x27, 0xf0, + 0xff, 0x90, 0xfc, 0xfd, 0x10, 0xa9, 0xfc, 0x52, 0x2b, 0xff, 0x04, 0x63, 0xff, 0x9d, 0xa4, 0xfe, + 0x96, 0x75, 0xff, 0x1a, 0xf3, 0xfe, 0x54, 0x19, 0x14, 0xb0, 0xf3, 0x11, 0x8f, 0x17, 0x02, 0xe9, + 0x24, 0x10, 0x1f, 0x87, 0x02, 0xf8, 0xe0, 0xfa, 0x1e, 0x87, 0x02, 0x99, 0x8b, 0xfd, 0x50, 0x7f, + 0xf7, 0xba, 0x47, 0xf9, 0x62, 0x43, 0x08, 0xa4, 0x02, 0x03, 0xbf, 0x61, 0xfc, 0xb0, 0xa9, 0x03, + 0x72, 0xbb, 0xff, 0xba, 0x95, 0xfa, 0xb2, 0x67, 0x02, 0x56, 0x17, 0x02, 0xb0, 0x2b, 0xfe, 0x5f, + 0x1b, 0xff, 0xf1, 0x4c, 0xfd, 0x3d, 0xb9, 0xfe, 0x67, 0x87, 0xfe, 0x26, 0x1f, 0xfe, 0x06, 0xe2, + 0xff, 0x90, 0x4d, 0xfe, 0x37, 0x39, 0xfd, 0x3f, 0x52, 0xff, 0x63, 0xfa, 0xfe, 0x26, 0x2f, 0xfe, + 0x0f, 0x28, 0xff, 0x20, 0xd2, 0xfe, 0x33, 0xe9, 0x11, 0x0d, 0x7b, 0x10, 0x24, 0x2d, 0x02, 0x20, + 0x27, 0x0e, 0x13, 0x5a, 0x04, 0xb3, 0xfe, 0xfc, 0x34, 0x21, 0x01, 0xf7, 0x1d, 0xfe, 0xc1, 0xdd, + 0xf9, 0xee, 0xd6, 0xf9, 0xf2, 0xbe, 0x06, 0xf4, 0x52, 0x03, 0x63, 0x8e, 0xfc, 0xb7, 0x5a, 0x02, + 0x39, 0xd5, 0xff, 0x9e, 0xd9, 0xfb, 0x1d, 0xc3, 0x01, 0x39, 0x77, 0x01, 0x2b, 0x76, 0xfe, 0x9c, + 0x18, 0xff, 0x0d, 0x31, 0xfe, 0xdc, 0xcb, 0xff, 0x3c, 0x88, 0xff, 0x98, 0x41, 0xfe, 0xef, 0x80, + 0xff, 0x86, 0xe9, 0xfe, 0xb3, 0xe1, 0xfd, 0xaa, 0xe7, 0xfe, 0xd6, 0x7b, 0xfe, 0x94, 0x33, 0xfe, + 0xbe, 0x6b, 0xff, 0xa1, 0xa7, 0xfe, 0x13, 0x13, 0x0f, 0xc3, 0xe5, 0x0e, 0xdf, 0x39, 0x03, 0xdf, + 0xa3, 0x0c, 0x5d, 0xea, 0x04, 0xd7, 0x82, 0xfe, 0x15, 0xe8, 0x00, 0x9e, 0x87, 0xfe, 0x10, 0x54, + 0xfb, 0x72, 0xc6, 0xfa, 0x3a, 0x30, 0x05, 0x84, 0xa7, 0x02, 0x66, 0x17, 0xfd, 0x9e, 0x65, 0x01, + 0x0e, 0xdd, 0xff, 0x34, 0xcc, 0xfc, 0xb3, 0xea, 0x00, 0xcb, 0xf9, 0x00, 0x42, 0xd9, 0xfe, 0xc7, + 0xfc, 0xff, 0x35, 0x28, 0xff, 0x77, 0xef, 0xff, 0x4d, 0xbd, 0xff, 0xc3, 0x41, 0xfe, 0x24, 0x3e, + 0xff, 0x50, 0x04, 0xff, 0x95, 0x09, 0xfe, 0x65, 0x80, 0xfe, 0x2b, 0x81, 0xfe, 0x72, 0x95, 0xfe, + 0x6a, 0x4f, 0xff, 0xb1, 0xa4, 0xfe, 0x4d, 0xd4, 0x0c, 0x55, 0x60, 0x0d, 0x44, 0x2c, 0x04, 0x00, + 0x44, 0x0b, 0x54, 0x3e, 0x05, 0x75, 0xb8, 0xff, 0xc1, 0xb2, 0x00, 0xf6, 0x2e, 0xff, 0x4d, 0xbd, + 0xfc, 0x43, 0xd3, 0xfb, 0x85, 0x5b, 0x03, 0x21, 0x18, 0x02, 0x17, 0xe1, 0xfd, 0xae, 0x8a, 0x00, + 0xb3, 0x08, 0x00, 0x8f, 0x7e, 0xfd, 0x37, 0x63, 0x00, 0x2f, 0x58, 0x01, 0xc7, 0xf9, 0xff, 0x84, + 0x05, 0x00, 0x42, 0x69, 0xff, 0xf9, 0x64, 0x00, 0x03, 0xa9, 0xff, 0xc1, 0x07, 0xfe, 0xe1, 0xf5, + 0xfe, 0x31, 0x00, 0xff, 0x44, 0x44, 0xfe, 0x24, 0xd0, 0xfe, 0xfb, 0xc0, 0xfe, 0x4b, 0xc1, 0xfe, + 0xee, 0x76, 0xff, 0x52, 0xed, 0xfe, 0xf0, 0x87, 0x0a, 0x19, 0xf9, 0x0b, 0x20, 0x23, 0x05, 0x10, + 0x75, 0x0a, 0x44, 0xe0, 0x04, 0xf8, 0x3d, 0x00, 0x3c, 0x89, 0x01, 0x80, 0xd6, 0xff, 0xed, 0x7f, + 0xfd, 0xa8, 0x66, 0xfc, 0x2c, 0x26, 0x02, 0xc3, 0x87, 0x01, 0xae, 0xe5, 0xfd, 0x0f, 0x88, 0x00, + 0x94, 0x7a, 0x00, 0x32, 0xee, 0xfd, 0xe3, 0xdc, 0x00, 0xc0, 0xa6, 0x01, 0x30, 0xc2, 0xff, 0xcf, + 0x08, 0x00, 0xba, 0xff, 0xff, 0xac, 0x63, 0x00, 0xa8, 0x0f, 0xff, 0x76, 0xa9, 0xfd, 0xcc, 0x0c, + 0xff, 0xe9, 0x7d, 0xff, 0xf7, 0xa8, 0xfe, 0xba, 0xd1, 0xfe, 0x42, 0xe7, 0xfe, 0x55, 0x40, 0xff, + 0x72, 0xc3, 0xff, 0xe8, 0x3e, 0xff, 0xd1, 0x3c, 0x09, 0x99, 0x00, 0x0b, 0x84, 0x1c, 0x05, 0x28, + 0x83, 0x09, 0x34, 0xb9, 0x04, 0x3f, 0x83, 0x00, 0xd9, 0xe3, 0x01, 0x77, 0x86, 0x00, 0x1b, 0x51, + 0xfe, 0xb4, 0x95, 0xfc, 0x7d, 0x06, 0x01, 0x05, 0x0b, 0x01, 0x13, 0x2e, 0xfe, 0xb5, 0xf3, 0x00, + 0x23, 0x82, 0x01, 0xa8, 0x95, 0xfe, 0xf2, 0x40, 0x00, 0xa3, 0x55, 0x01, 0xb4, 0xff, 0xff, 0xc3, + 0x42, 0x00, 0xb2, 0x15, 0x00, 0x63, 0x9a, 0xff, 0x08, 0x61, 0xfe, 0x64, 0x6d, 0xfe, 0x65, 0xb4, + 0xff, 0x01, 0x7f, 0xff, 0x35, 0xca, 0xfe, 0xc4, 0xfb, 0xfe, 0xa9, 0x6d, 0xff, 0x7e, 0xc8, 0xff, + 0x66, 0x85, 0xff, 0xbe, 0x88, 0xfe, 0x73, 0xc3, 0x08, 0x09, 0xe7, 0x09, 0x17, 0xc0, 0x04, 0x7a, + 0xf2, 0x08, 0x0b, 0x11, 0x04, 0x20, 0xe1, 0x00, 0x7c, 0x85, 0x02, 0xf8, 0x0f, 0x01, 0xa8, 0x90, + 0xfe, 0x30, 0xaa, 0xfc, 0xf0, 0x7e, 0x00, 0xa0, 0xa2, 0x00, 0xca, 0xaa, 0xff, 0x02, 0x52, 0x02, + 0xc4, 0xec, 0x00, 0xf8, 0x46, 0xfe, 0x73, 0x4f, 0x00, 0x02, 0x2d, 0x01, 0x48, 0x57, 0x00, 0x21, + 0x1b, 0x00, 0xfe, 0x6d, 0xff, 0x7d, 0x5c, 0xff, 0x53, 0x16, 0xff, 0x7c, 0x3a, 0xff, 0xdc, 0xd6, + 0xff, 0xbc, 0x9a, 0xff, 0xaa, 0x08, 0xff, 0x6a, 0x85, 0xff, 0x61, 0x92, 0xff, 0xcb, 0x21, 0xff, + 0x1e, 0xdf, 0xfe, 0x4e, 0x51, 0xfe, 0xfb, 0x60, 0x08, 0x48, 0x18, 0x09, 0xeb, 0x2d, 0x04, 0x26, + 0x22, 0x08, 0x72, 0xc3, 0x03, 0x84, 0x5b, 0x01, 0x3f, 0x2a, 0x03, 0x2b, 0x24, 0x01, 0x3e, 0xae, + 0xfe, 0xc4, 0x0e, 0xfd, 0x73, 0x96, 0x00, 0x90, 0xe8, 0x01, 0xdc, 0x72, 0x00, 0x94, 0xcd, 0x01, + 0xd4, 0xb9, 0x00, 0xf7, 0x4d, 0xfe, 0x90, 0x35, 0x00, 0x1b, 0x44, 0x01, 0x9b, 0x0d, 0x00, 0x3b, + 0xd2, 0xff, 0x96, 0xe6, 0xff, 0xe1, 0xc5, 0xff, 0x94, 0xac, 0xff, 0xc5, 0x92, 0xff, 0x8c, 0x1d, + 0x00, 0x2f, 0xfc, 0xff, 0xda, 0x0a, 0xff, 0x7a, 0x0e, 0xff, 0xd9, 0xfc, 0xfe, 0x1c, 0xe3, 0xfe, + 0xdb, 0xe9, 0xfe, 0xb9, 0xdd, 0xfe, 0xe8, 0xbf, 0x07, 0x88, 0x23, 0x08, 0x00, 0x95, 0x03, 0x96, + 0x79, 0x07, 0xf8, 0xc2, 0x03, 0x31, 0xe4, 0x01, 0x67, 0x71, 0x03, 0x4c, 0x2e, 0x01, 0x4a, 0x49, + 0xff, 0x70, 0xbd, 0xfe, 0x00, 0xc0, 0x00, 0xbb, 0x58, 0x01, 0x01, 0x0f, 0x01, 0x1f, 0x83, 0x01, + 0x63, 0x4f, 0x00, 0x14, 0x5b, 0xfe, 0xac, 0xb2, 0xff, 0x3f, 0x2e, 0x01, 0x82, 0xa3, 0x00, 0xfc, + 0x6d, 0x00, 0xf5, 0xe7, 0xff, 0x2a, 0xd0, 0xff, 0xa8, 0x33, 0x00, 0x37, 0x4a, 0x00, 0x03, 0x40, + 0x00, 0x47, 0x1e, 0xff, 0xbc, 0x34, 0xfe, 0x2f, 0xd9, 0xfe, 0x11, 0x31, 0xff, 0x1a, 0x46, 0xff, + 0xa0, 0x2f, 0xff, 0x66, 0xae, 0xfe, 0x50, 0x55, 0x07, 0x98, 0xea, 0x07, 0xcf, 0xe0, 0x02, 0x47, + 0x83, 0x05, 0x65, 0xf8, 0x03, 0x11, 0x66, 0x03, 0xe6, 0xc1, 0x03, 0xbc, 0xe0, 0x01, 0x63, 0x5c, + 0x00, 0x9f, 0xb8, 0xfe, 0x8e, 0xc7, 0x00, 0xf6, 0xe2, 0x01, 0x12, 0xb1, 0x00, 0x30, 0xb5, 0x00, + 0x4e, 0xad, 0xff, 0x78, 0x5f, 0xfe, 0x60, 0xa2, 0x00, 0x8c, 0xf6, 0x01, 0x71, 0x94, 0x00, 0xf4, + 0x1e, 0x00, 0xb9, 0x35, 0x00, 0x48, 0xda, 0x00, 0x7a, 0xc2, 0x00, 0x11, 0x7c, 0xff, 0x76, 0xe9, + 0xfe, 0xec, 0xab, 0xfe, 0x2f, 0xa8, 0xfe, 0xaa, 0x41, 0xff, 0xf1, 0x81, 0xff, 0x8a, 0x1f, 0xff, + 0xcb, 0xe1, 0xfe, 0x8d, 0xc9, 0xfe, 0xe7, 0xaf, 0x05, 0x7f, 0x3b, 0x07, 0x7d, 0x1b, 0x03, 0x53, + 0xf8, 0x04, 0xa6, 0x52, 0x04, 0x3c, 0x96, 0x03, 0x52, 0x59, 0x05, 0x45, 0x26, 0x03, 0xe3, 0xa6, + 0x00, 0x80, 0x36, 0xff, 0xfd, 0xc6, 0xff, 0xe0, 0x4c, 0x01, 0xe4, 0xc1, 0x00, 0xec, 0x30, 0x00, + 0x60, 0xb2, 0xff, 0x07, 0x88, 0xff, 0x48, 0x11, 0x01, 0x21, 0xff, 0x01, 0xf1, 0xf0, 0x00, 0x66, + 0x51, 0x00, 0x26, 0xb2, 0x00, 0x64, 0xd7, 0x00, 0xe8, 0xed, 0xff, 0xed, 0xc0, 0xfe, 0xc5, 0xe2, + 0xfe, 0xef, 0xfd, 0xfe, 0xd9, 0xf7, 0xfe, 0x21, 0x6e, 0xff, 0x5e, 0x4a, 0xff, 0x0e, 0x0b, 0xff, + 0xc5, 0xe9, 0xfe, 0xe8, 0xe1, 0xfe, 0xcc, 0xe3, 0x04, 0xd6, 0x1f, 0x07, 0x72, 0x02, 0x04, 0xe5, + 0xe8, 0x04, 0xe7, 0x99, 0x05, 0x1c, 0x3e, 0x04, 0x90, 0x90, 0x03, 0x10, 0x1d, 0x03, 0xd9, 0x56, + 0x01, 0x95, 0x8f, 0xff, 0xf8, 0x5c, 0xff, 0x1f, 0x88, 0xff, 0xf6, 0xfd, 0xff, 0xdc, 0x4a, 0x01, + 0xb2, 0x3d, 0x01, 0x1d, 0x54, 0x00, 0xde, 0xff, 0x00, 0x0d, 0x9d, 0x01, 0xab, 0x1e, 0x01, 0xdb, + 0x6d, 0x00, 0x98, 0x39, 0x00, 0x2e, 0xe4, 0xff, 0x88, 0x34, 0xff, 0xcd, 0xf7, 0xfe, 0x18, 0x18, + 0xff, 0xdd, 0xf8, 0xfe, 0xc7, 0xed, 0xfe, 0xa8, 0x45, 0xff, 0xc2, 0x73, 0xff, 0x22, 0x2a, 0xff, + 0x89, 0xdb, 0xfe, 0x14, 0x15, 0xff, 0x7a, 0xf8, 0x03, 0x6f, 0x1f, 0x07, 0xa4, 0x7c, 0x05, 0x1f, + 0xf2, 0x04, 0xb9, 0x9e, 0x05, 0x51, 0x6a, 0x05, 0x13, 0xe2, 0x03, 0xdb, 0xb6, 0x01, 0xa5, 0x09, + 0x00, 0xdd, 0x53, 0xff, 0x0d, 0x9c, 0xff, 0xc5, 0x4d, 0x00, 0x6b, 0x79, 0x00, 0x71, 0xc7, 0x00, + 0xb9, 0x7b, 0x01, 0xed, 0x9f, 0x01, 0x43, 0x50, 0x01, 0x83, 0x2d, 0x01, 0x7b, 0xa3, 0x00, 0x60, + 0xf7, 0xff, 0xe4, 0x9c, 0xff, 0x5c, 0x84, 0xff, 0xae, 0x55, 0xff, 0x97, 0x19, 0xff, 0x86, 0x32, + 0xff, 0x08, 0x1d, 0xff, 0x50, 0xd5, 0xfe, 0x13, 0xff, 0xfe, 0x1f, 0x65, 0xff, 0x57, 0x5b, 0xff, + 0x09, 0x5e, 0xff, 0x09, 0x47, 0xff, 0xe9, 0x17, 0x05, 0x2e, 0x7c, 0x07, 0x6c, 0x86, 0x04, 0xf5, + 0xf5, 0x05, 0x04, 0xc0, 0x05, 0xfb, 0x11, 0x04, 0x8a, 0x2b, 0x04, 0x01, 0xc8, 0x01, 0x4a, 0xda, + 0xfe, 0xd2, 0x07, 0xff, 0x4a, 0x8f, 0x00, 0xf2, 0x8f, 0x00, 0x64, 0xb3, 0x00, 0x25, 0x4e, 0x01, + 0xcd, 0x3f, 0x01, 0x63, 0xdb, 0x01, 0xe5, 0x27, 0x02, 0x7b, 0xae, 0x00, 0x98, 0x6a, 0xff, 0xdd, + 0x6d, 0xff, 0x9d, 0x9c, 0xff, 0x5a, 0x95, 0xff, 0xf6, 0x88, 0xff, 0x6b, 0x30, 0xff, 0xb8, 0xfb, + 0xfe, 0x35, 0xf9, 0xfe, 0x23, 0x0a, 0xff, 0xed, 0x74, 0xff, 0x5d, 0x41, 0xff, 0xab, 0x24, 0xff, + 0x01, 0x80, 0xff, 0x14, 0x78, 0xff, 0xbd, 0x05, 0x05, 0x83, 0x6e, 0x07, 0x26, 0x23, 0x05, 0x92, + 0x67, 0x05, 0x1a, 0xe4, 0x04, 0x30, 0x9a, 0x03, 0xb7, 0x2b, 0x03, 0x8c, 0x21, 0x02, 0xa1, 0x2e, + 0x00, 0x62, 0xf9, 0xff, 0x9b, 0xa3, 0x00, 0xab, 0x6f, 0x00, 0x6c, 0x82, 0x00, 0x24, 0x17, 0x01, + 0x0e, 0xc0, 0x01, 0x05, 0x35, 0x02, 0xa2, 0xd3, 0x01, 0x20, 0x2b, 0x00, 0x2a, 0x5e, 0xff, 0x14, + 0x69, 0xff, 0x91, 0x54, 0xff, 0x74, 0x91, 0xff, 0xb3, 0x9e, 0xff, 0x24, 0x7d, 0xff, 0xf3, 0x0d, + 0xff, 0x1f, 0xc6, 0xfe, 0xd2, 0x07, 0xff, 0x11, 0x63, 0xff, 0x71, 0x5c, 0xff, 0x73, 0x69, 0xff, + 0x90, 0x6a, 0xff, 0x47, 0x51, 0xff, 0xdc, 0x7c, 0x05, 0x7d, 0x31, 0x08, 0x86, 0x0a, 0x04, 0xd0, + 0x84, 0x03, 0x1d, 0x10, 0x04, 0xea, 0x3c, 0x03, 0xc4, 0xc8, 0x02, 0x34, 0x30, 0x03, 0x19, 0x81, + 0x01, 0x9e, 0xfd, 0xff, 0x77, 0x02, 0x01, 0x0f, 0x88, 0x00, 0x4f, 0x58, 0x00, 0xc2, 0x71, 0x01, + 0xe7, 0xbe, 0x01, 0xe5, 0x47, 0x01, 0x40, 0xeb, 0x01, 0xcb, 0x37, 0x01, 0x8d, 0x0e, 0xff, 0xec, + 0xca, 0xfe, 0xca, 0x8b, 0xff, 0xcf, 0xc7, 0xff, 0xc3, 0x55, 0xff, 0x8e, 0x66, 0xff, 0x55, 0x52, + 0xff, 0x19, 0x04, 0xff, 0x36, 0xe9, 0xfe, 0x0a, 0x01, 0xff, 0xa9, 0x69, 0xff, 0xac, 0x9f, 0xff, + 0x4b, 0x78, 0xff, 0xb1, 0x3c, 0xff, 0x6f, 0xb9, 0x05, 0xaa, 0xd7, 0x07, 0x1b, 0x0d, 0x03, 0xb6, + 0x64, 0x02, 0xbb, 0xc2, 0x02, 0xde, 0x23, 0x03, 0x7c, 0xf9, 0x03, 0xcf, 0x00, 0x03, 0xc0, 0x4f, + 0x01, 0xb0, 0xa2, 0x01, 0xcf, 0x48, 0x01, 0x61, 0xd9, 0xff, 0xaa, 0xe1, 0x00, 0xb9, 0x9b, 0x01, + 0x92, 0x8e, 0x01, 0x06, 0xa4, 0x01, 0x0b, 0xaa, 0x01, 0x9a, 0x71, 0x01, 0x2a, 0x70, 0x00, 0xcf, + 0x38, 0xff, 0x3b, 0xc3, 0xfe, 0x78, 0x61, 0xff, 0x1a, 0xc7, 0xff, 0xbf, 0xde, 0xff, 0x80, 0x43, + 0xff, 0x94, 0x01, 0xff, 0x39, 0x30, 0xff, 0x1e, 0x03, 0xff, 0x33, 0x1f, 0xff, 0xd1, 0x5f, 0xff, + 0x51, 0xc0, 0xff, 0x36, 0x8a, 0xff, 0x41, 0xdc, 0x05, 0x6a, 0xbb, 0x07, 0xa0, 0xfe, 0x02, 0x8a, + 0x84, 0x02, 0xde, 0xa8, 0x02, 0x11, 0x6c, 0x02, 0x2f, 0x8f, 0x02, 0x74, 0x0c, 0x02, 0x2d, 0x53, + 0x01, 0x78, 0x0f, 0x02, 0xf5, 0x27, 0x02, 0xbc, 0x35, 0x01, 0x0a, 0x7c, 0x00, 0x55, 0xcd, 0x00, + 0x66, 0x2f, 0x02, 0xd6, 0xd3, 0x01, 0xbc, 0x60, 0x01, 0xb0, 0x77, 0x01, 0xf1, 0x8f, 0x01, 0x50, + 0x5d, 0x00, 0xd7, 0x90, 0xff, 0xf2, 0x29, 0xff, 0x90, 0xa6, 0xfe, 0xa7, 0xe8, 0xff, 0x52, 0xff, + 0xff, 0xce, 0x41, 0xff, 0xec, 0x33, 0xff, 0xc3, 0x67, 0xff, 0xb0, 0x0e, 0xff, 0xd4, 0x32, 0xff, + 0x03, 0x97, 0xff, 0xc9, 0x86, 0xff, 0xfa, 0xeb, 0x05, 0xb2, 0x1d, 0x08, 0x8d, 0xe8, 0x02, 0xea, + 0x4e, 0x02, 0x31, 0x5a, 0x03, 0x74, 0x13, 0x03, 0xf6, 0x09, 0x02, 0x93, 0x0c, 0x00, 0xc1, 0x0e, + 0xff, 0x8a, 0x50, 0x02, 0x89, 0xa8, 0x03, 0x74, 0x15, 0x01, 0x07, 0x8b, 0x00, 0x3f, 0x16, 0x01, + 0xed, 0x60, 0x01, 0x93, 0xca, 0x01, 0x25, 0xf7, 0x01, 0x8e, 0x48, 0x01, 0xfd, 0x66, 0x01, 0xb7, + 0xc9, 0x01, 0x62, 0xc4, 0x00, 0x78, 0x78, 0xff, 0x1e, 0x41, 0xff, 0x50, 0x1c, 0xff, 0x6f, 0xd6, + 0xfe, 0x85, 0xe5, 0xff, 0xb6, 0xf4, 0xff, 0x33, 0x44, 0xff, 0xd4, 0x5d, 0xff, 0x6b, 0x41, 0xff, + 0x07, 0x3d, 0xff, 0x9f, 0x7f, 0xff, 0xf2, 0xef, 0x06, 0x9c, 0xc5, 0x08, 0x44, 0x8b, 0x02, 0x61, + 0x82, 0x02, 0xae, 0x6a, 0x03, 0xa1, 0x46, 0x03, 0xa4, 0xf4, 0x01, 0x22, 0xaf, 0xfe, 0x64, 0x09, + 0xfe, 0xf3, 0xa1, 0x01, 0xa0, 0xcd, 0x02, 0x89, 0x4d, 0x01, 0x2a, 0xfd, 0x00, 0xa8, 0x1c, 0x00, + 0xc9, 0x33, 0x01, 0x13, 0x25, 0x02, 0xa4, 0x26, 0x01, 0x34, 0x4d, 0x01, 0xbf, 0xf0, 0x01, 0xb5, + 0x1e, 0x01, 0xd3, 0x35, 0x01, 0xaf, 0x6d, 0x01, 0x24, 0x88, 0xff, 0xfd, 0xf6, 0xfe, 0x2f, 0xde, + 0xfe, 0x0a, 0xc6, 0xfe, 0xa1, 0x8a, 0xff, 0xd6, 0xed, 0xff, 0xe4, 0x93, 0xff, 0x64, 0x3c, 0xff, + 0xd7, 0x4e, 0xff, 0xda, 0x09, 0xff, 0x43, 0x24, 0x08, 0x50, 0x50, 0x0a, 0xb6, 0xc7, 0x02, 0xc5, + 0x63, 0x02, 0x96, 0xd1, 0x02, 0xbf, 0xe8, 0x02, 0x4b, 0xeb, 0x01, 0xba, 0x18, 0xfe, 0xf4, 0x19, + 0xfd, 0xb8, 0xdc, 0x01, 0x6a, 0xf3, 0x02, 0x33, 0xe0, 0xff, 0xed, 0x44, 0x00, 0x7d, 0x53, 0x00, + 0x49, 0x16, 0x01, 0xe7, 0x71, 0x01, 0xac, 0x17, 0x01, 0x5b, 0x89, 0x01, 0xb9, 0x62, 0x01, 0x75, + 0x6f, 0x01, 0x41, 0x6a, 0x01, 0xe4, 0xf5, 0x00, 0xa2, 0xdc, 0x00, 0x1d, 0x60, 0x00, 0xbc, 0xad, + 0xfe, 0x7f, 0xdb, 0xfe, 0x01, 0x5b, 0xff, 0xb3, 0x03, 0xff, 0x76, 0x81, 0xff, 0x14, 0xe7, 0xff, + 0x9c, 0x8e, 0xff, 0x3f, 0x10, 0xff, 0x64, 0xa4, 0x09, 0x7d, 0xae, 0x0b, 0x0c, 0x8e, 0x02, 0x72, + 0x94, 0x02, 0x74, 0xcc, 0x02, 0x73, 0xf2, 0x02, 0x8e, 0xa6, 0x01, 0x6d, 0x9b, 0xfc, 0x1f, 0x74, + 0xfc, 0x33, 0x8c, 0x02, 0x6f, 0x11, 0x03, 0x74, 0x75, 0xff, 0x71, 0x83, 0xff, 0xdd, 0xfb, 0xfe, + 0x3e, 0xe7, 0x00, 0x72, 0xc3, 0x01, 0x08, 0xd9, 0x00, 0xdb, 0x14, 0x01, 0x80, 0x29, 0x01, 0x91, + 0xfe, 0x00, 0x96, 0x09, 0x01, 0x05, 0xc0, 0x01, 0x0a, 0xbd, 0x00, 0x03, 0x7a, 0x00, 0xcd, 0x5a, + 0x00, 0x58, 0x79, 0xff, 0xae, 0xfc, 0xfe, 0x8b, 0xff, 0xfe, 0x9d, 0x3f, 0xff, 0xfd, 0x3d, 0xff, + 0x0c, 0xb1, 0xff, 0x38, 0x91, 0xff, 0x6e, 0x6a, 0x0b, 0xa6, 0x00, 0x0d, 0x0e, 0x11, 0x02, 0xee, + 0x0a, 0x03, 0x5c, 0x1c, 0x03, 0x45, 0xf8, 0x02, 0x37, 0x35, 0x01, 0x39, 0x3f, 0xfb, 0xfc, 0xfb, + 0xfb, 0x74, 0x5a, 0x03, 0x62, 0x02, 0x03, 0xe0, 0xf1, 0xfe, 0xe3, 0x58, 0xff, 0x0e, 0x81, 0xfe, + 0x61, 0x3e, 0x00, 0x88, 0xff, 0x00, 0x0e, 0x00, 0x01, 0x63, 0x6d, 0x01, 0x12, 0xc2, 0x00, 0xde, + 0x40, 0x00, 0xd8, 0xc8, 0x00, 0x0f, 0x71, 0x01, 0x76, 0xab, 0x00, 0xcf, 0x28, 0x01, 0x62, 0x17, + 0x00, 0xb4, 0x56, 0x00, 0xcc, 0x88, 0x00, 0x93, 0x07, 0xff, 0x7c, 0x0d, 0xff, 0x5e, 0x4c, 0xff, + 0xf4, 0x41, 0xff, 0x62, 0x0e, 0xff, 0x3b, 0x7e, 0x0d, 0x75, 0x94, 0x0e, 0x66, 0x82, 0x01, 0x4e, + 0x55, 0x03, 0xc9, 0x18, 0x03, 0x19, 0xa8, 0x02, 0xe0, 0xa5, 0x00, 0x43, 0xeb, 0xf9, 0x29, 0x3b, + 0xfc, 0xad, 0x5e, 0x04, 0xe0, 0x63, 0x02, 0x86, 0x26, 0xfe, 0x4a, 0xf5, 0xfe, 0x39, 0x2e, 0xfe, + 0xf1, 0x5c, 0x00, 0xb7, 0x9b, 0x00, 0x2a, 0x1e, 0x00, 0x25, 0x60, 0x01, 0xb4, 0xd4, 0x00, 0x64, + 0xfd, 0xff, 0xf5, 0x43, 0x00, 0xb9, 0xaa, 0x00, 0x87, 0x82, 0x00, 0xdd, 0xbc, 0x00, 0xb9, 0x1c, + 0x00, 0xdb, 0xbd, 0x00, 0x7c, 0x65, 0x00, 0x60, 0x3c, 0x00, 0x41, 0x13, 0x00, 0xc8, 0x0c, 0xff, + 0xf9, 0x2c, 0xff, 0x33, 0x03, 0xff, 0x91, 0xc0, 0x0f, 0xee, 0x0a, 0x10, 0xe7, 0xdf, 0x00, 0xc8, + 0xfc, 0x03, 0xe3, 0x53, 0x03, 0x0c, 0x20, 0x02, 0x19, 0xa3, 0xff, 0x92, 0x8a, 0xf8, 0xb9, 0xfa, + 0xfc, 0x7f, 0xb5, 0x05, 0x93, 0xb8, 0x01, 0x4c, 0x8f, 0xfd, 0x24, 0x6e, 0xfe, 0x54, 0xa4, 0xfd, + 0x03, 0x92, 0x00, 0xd1, 0x49, 0x00, 0x43, 0x2d, 0x00, 0xf2, 0x42, 0x01, 0x2e, 0x29, 0x00, 0xde, + 0xdc, 0xff, 0x23, 0x2f, 0x00, 0xe1, 0x87, 0x00, 0x8e, 0xe9, 0xff, 0xfa, 0x35, 0x00, 0x1a, 0xa7, + 0xff, 0x0a, 0x76, 0x00, 0x24, 0xcf, 0x00, 0x71, 0x5d, 0x00, 0xba, 0x63, 0x00, 0x58, 0x6f, 0x00, + 0x6e, 0xce, 0xff, 0x06, 0x6d, 0xfe, 0xcc, 0x17, 0x12, 0x40, 0xa3, 0x11, 0xee, 0x37, 0x00, 0x6b, + 0xb8, 0x04, 0xe1, 0x84, 0x03, 0x12, 0x65, 0x01, 0xc0, 0x59, 0xfe, 0xc3, 0x42, 0xf7, 0x71, 0x3a, + 0xfe, 0x53, 0xca, 0x06, 0x98, 0xdc, 0x00, 0x4b, 0x29, 0xfd, 0x83, 0x29, 0xfe, 0xca, 0x2f, 0xfd, + 0xc9, 0x96, 0x00, 0xe4, 0xc0, 0xff, 0xa2, 0xfc, 0xff, 0x33, 0xc7, 0x01, 0x04, 0xdf, 0xff, 0xc2, + 0x4d, 0xff, 0x3c, 0xeb, 0xff, 0x47, 0x60, 0x00, 0x97, 0xe1, 0xff, 0x0c, 0xf8, 0xff, 0xe8, 0xa9, + 0xfe, 0xaf, 0x28, 0x00, 0x2a, 0x8b, 0x00, 0x8f, 0x05, 0x00, 0x48, 0x0f, 0x01, 0x09, 0x4c, 0x00, + 0x20, 0x10, 0x00, 0xd0, 0xd8, 0xff, 0x7e, 0x2f, 0x14, 0x4e, 0xc5, 0x13, 0x0e, 0xad, 0xff, 0x90, + 0x17, 0x05, 0xf2, 0x9d, 0x03, 0x27, 0x68, 0x00, 0x32, 0x14, 0xfd, 0xdb, 0x2c, 0xf6, 0x56, 0x9d, + 0xff, 0x7f, 0x8c, 0x07, 0x51, 0xcc, 0xff, 0xca, 0xe8, 0xfc, 0x47, 0xdc, 0xfd, 0x26, 0x15, 0xfd, + 0x8b, 0xb3, 0x00, 0x4f, 0xfd, 0xfe, 0x44, 0xa1, 0xff, 0x89, 0x08, 0x02, 0xa2, 0xba, 0xff, 0x70, + 0x4a, 0xff, 0x67, 0x95, 0xff, 0xb0, 0xd5, 0xff, 0x7e, 0xe0, 0xff, 0x4e, 0xbb, 0xff, 0x55, 0x65, + 0xfe, 0xbc, 0xb6, 0xff, 0x21, 0xc8, 0xff, 0x81, 0x0d, 0x00, 0xe9, 0x43, 0x00, 0x6a, 0x1e, 0x00, + 0xfd, 0xe5, 0x00, 0xb4, 0xc4, 0xff, 0xcd, 0x04, 0x16, 0x45, 0x04, 0x16, 0x53, 0x89, 0xff, 0xd8, + 0x44, 0x05, 0x7f, 0xd8, 0x03, 0xc6, 0x6b, 0xff, 0x1f, 0xbc, 0xfb, 0xda, 0x26, 0xf5, 0xbc, 0x1a, + 0x01, 0x8f, 0x11, 0x08, 0x71, 0xd5, 0xfe, 0x11, 0xbd, 0xfc, 0x1a, 0x6c, 0xfd, 0x0f, 0x37, 0xfd, + 0x6f, 0xe9, 0x00, 0x4a, 0x72, 0xfe, 0x3c, 0x2c, 0xff, 0x06, 0x00, 0x02, 0xdd, 0x88, 0xff, 0x6c, + 0x62, 0xff, 0x81, 0x98, 0xff, 0xe2, 0x70, 0xff, 0x33, 0x99, 0xff, 0xa8, 0x8c, 0xff, 0x60, 0x15, + 0xfe, 0x2f, 0xb7, 0xff, 0x87, 0xb3, 0xff, 0xde, 0x98, 0xfe, 0xb0, 0x17, 0x00, 0xc2, 0xaa, 0x00, + 0x01, 0x63, 0x00, 0xac, 0x08, 0x00, 0x71, 0xe8, 0x16, 0x19, 0x9e, 0x18, 0x9c, 0x4f, 0x00, 0xe0, + 0xca, 0x04, 0x47, 0x6f, 0x04, 0x95, 0x71, 0xfe, 0xfa, 0x8e, 0xfa, 0x3e, 0x4e, 0xf4, 0x5b, 0xd9, + 0x01, 0x21, 0x8d, 0x08, 0xb3, 0x31, 0xfe, 0x6b, 0xaf, 0xfc, 0x7f, 0xbb, 0xfc, 0x1f, 0x51, 0xfd, + 0x7b, 0x1f, 0x01, 0xc6, 0x29, 0xfe, 0x20, 0xfc, 0xfe, 0x71, 0xaa, 0x01, 0x39, 0x26, 0xff, 0xd0, + 0x5d, 0xff, 0xe3, 0xa6, 0xff, 0x8f, 0x56, 0xff, 0xe0, 0x7b, 0xff, 0xc9, 0x02, 0xff, 0x79, 0x3e, + 0xfe, 0xa7, 0x36, 0xff, 0x00, 0xb9, 0xfe, 0x5a, 0x43, 0xff, 0x43, 0xfd, 0xff, 0x5b, 0xe3, 0xff, + 0x74, 0x53, 0x00, 0x29, 0xd1, 0xff, 0x71, 0x82, 0x16, 0xdd, 0x49, 0x1b, 0x99, 0xa2, 0x02, 0x8e, + 0xb7, 0x03, 0x47, 0x1d, 0x05, 0xf8, 0xf6, 0xfd, 0x32, 0x82, 0xf9, 0x59, 0xea, 0xf3, 0x46, 0x72, + 0x01, 0x2e, 0xdc, 0x08, 0xd0, 0x21, 0xfe, 0xa9, 0xb6, 0xfc, 0x70, 0x20, 0xfc, 0x9c, 0x15, 0xfd, + 0x90, 0x3d, 0x01, 0x83, 0x19, 0xfe, 0xba, 0xdb, 0xfe, 0x0a, 0x8d, 0x01, 0x5c, 0xd9, 0xfe, 0x18, + 0xef, 0xfe, 0x94, 0xbb, 0xff, 0xf0, 0x1f, 0xff, 0xf5, 0xa2, 0xff, 0xa1, 0x14, 0xff, 0xe5, 0x25, + 0xfd, 0x34, 0xe0, 0xfe, 0x22, 0x42, 0xff, 0x34, 0xd9, 0xfe, 0x3c, 0xc9, 0xff, 0xa6, 0xf0, 0xff, + 0x08, 0x02, 0x00, 0x01, 0x9c, 0xff, 0x9d, 0x89, 0x15, 0x35, 0xff, 0x1c, 0xa7, 0x3c, 0x06, 0xbb, + 0x08, 0x03, 0xfb, 0x0a, 0x05, 0x1f, 0x3b, 0xfe, 0xfa, 0x71, 0xf8, 0xdc, 0xe5, 0xf3, 0xe2, 0x65, + 0x00, 0x14, 0x8f, 0x08, 0x4f, 0x70, 0xfe, 0x52, 0xbd, 0xfc, 0x78, 0xd3, 0xfb, 0xcd, 0x8b, 0xfc, + 0xd8, 0x37, 0x01, 0xef, 0x03, 0xfe, 0x1b, 0xb8, 0xfe, 0xbb, 0x87, 0x01, 0xb0, 0xd1, 0xfe, 0x3a, + 0x8d, 0xfe, 0xef, 0x3b, 0xff, 0xfc, 0x5f, 0xff, 0xcd, 0xa0, 0xff, 0x7d, 0xf1, 0xfd, 0x5b, 0x61, + 0xfd, 0xa9, 0x03, 0xff, 0x26, 0xc3, 0xfe, 0xed, 0xc5, 0xfe, 0xab, 0x7e, 0xff, 0x2a, 0xf3, 0xff, + 0xbe, 0x34, 0x00, 0x55, 0xe6, 0xff, 0x85, 0x2c, 0x15, 0x05, 0x5b, 0x1d, 0x22, 0x63, 0x09, 0xc2, + 0x3b, 0x04, 0xb9, 0x19, 0x04, 0x1f, 0x96, 0xfe, 0x72, 0xea, 0xf7, 0xb7, 0xbd, 0xf3, 0x79, 0xe2, + 0xff, 0xb4, 0xa2, 0x07, 0xff, 0x83, 0xfe, 0x96, 0xdb, 0xfc, 0x58, 0xaf, 0xfb, 0x52, 0x34, 0xfc, + 0xe9, 0x0e, 0x01, 0x9d, 0xbe, 0xfd, 0x58, 0xa8, 0xfe, 0x12, 0x8a, 0x01, 0xbc, 0xef, 0xfe, 0xa3, + 0x60, 0xfe, 0xb3, 0x4c, 0xff, 0x00, 0x91, 0xfe, 0x5c, 0xee, 0xfe, 0x4a, 0xdf, 0xfe, 0x1b, 0xeb, + 0xfc, 0xb2, 0x82, 0xfe, 0x7f, 0xaa, 0xfe, 0x02, 0xaa, 0xfe, 0x2a, 0x79, 0xff, 0xa1, 0x22, 0x00, + 0xca, 0x5f, 0x00, 0x5d, 0x65, 0xff, 0x78, 0x81, 0x15, 0x60, 0x29, 0x1d, 0x21, 0xfa, 0x0a, 0x95, + 0xc9, 0x06, 0x7c, 0xac, 0x03, 0x6e, 0x06, 0xfe, 0x89, 0x1a, 0xf8, 0xbc, 0xb1, 0xf3, 0x27, 0x7e, + 0xff, 0x77, 0x9a, 0x06, 0xf1, 0x6c, 0xfe, 0xe0, 0xe5, 0xfc, 0x1a, 0x50, 0xfb, 0x0e, 0x30, 0xfc, + 0x8e, 0xec, 0x00, 0xab, 0x57, 0xfd, 0xfc, 0x90, 0xfe, 0x7f, 0x7d, 0x01, 0x7d, 0x14, 0xff, 0x10, + 0x2a, 0xff, 0x12, 0x07, 0xfe, 0x70, 0x15, 0xfe, 0xe2, 0x96, 0xff, 0xc3, 0x61, 0xfe, 0x8c, 0x0a, + 0xfd, 0x7e, 0x11, 0xfe, 0xb6, 0x3e, 0xfe, 0x11, 0xcc, 0xfe, 0x4b, 0xd9, 0xff, 0x21, 0x1b, 0x00, + 0xea, 0xc1, 0xff, 0x6c, 0x52, 0xff, 0x73, 0xa3, 0x16, 0xf2, 0x8e, 0x1c, 0x4d, 0x19, 0x0b, 0xd3, + 0x43, 0x09, 0xcb, 0x83, 0x04, 0x96, 0x45, 0xfd, 0xd5, 0x14, 0xf8, 0xf0, 0xcd, 0xf4, 0xfc, 0x0d, + 0xff, 0x6d, 0x34, 0x05, 0xe8, 0x3d, 0xfe, 0x61, 0x6a, 0xfd, 0xec, 0x67, 0xfa, 0xfc, 0xf9, 0xfb, + 0x7f, 0x0d, 0x01, 0x6c, 0xb4, 0xfc, 0xe8, 0x5c, 0xfe, 0xaf, 0xb4, 0x01, 0xd2, 0x4f, 0xff, 0x5f, + 0x65, 0xfe, 0x7b, 0xbc, 0xfe, 0x04, 0x28, 0xfe, 0x2e, 0xce, 0xfe, 0xba, 0x7b, 0xfe, 0x06, 0x1a, + 0xfd, 0x05, 0x39, 0xfe, 0x74, 0xbf, 0xfd, 0xb2, 0xf6, 0xfe, 0x05, 0xac, 0xff, 0xab, 0x8d, 0xff, + 0x1b, 0x2e, 0x00, 0xf2, 0xeb, 0xff, 0x27, 0x15, 0x19, 0xea, 0x77, 0x1b, 0x81, 0x42, 0x0a, 0x30, + 0x8d, 0x0b, 0xb1, 0x11, 0x05, 0xe9, 0x4c, 0xfd, 0x55, 0x0a, 0xf7, 0x6d, 0x9a, 0xf6, 0x8b, 0x83, + 0xff, 0x82, 0x91, 0x02, 0x9a, 0xea, 0xfd, 0x4c, 0xa1, 0xfe, 0x9c, 0xcb, 0xf9, 0x67, 0x24, 0xfb, + 0xa0, 0x51, 0x01, 0xac, 0x89, 0xfb, 0x07, 0x21, 0xff, 0x14, 0x51, 0x01, 0x71, 0x33, 0xfe, 0xab, + 0x17, 0x00, 0xd6, 0x84, 0xfe, 0xa3, 0xb0, 0xfd, 0x3c, 0x04, 0xff, 0x21, 0x2c, 0xfe, 0x16, 0xfc, + 0xfc, 0xfd, 0xb6, 0xfe, 0x6c, 0xb0, 0xfd, 0x46, 0x34, 0xfe, 0x3a, 0x3e, 0xff, 0x85, 0x05, 0x00, + 0x58, 0x98, 0x00, 0x51, 0x5c, 0xff, 0x13, 0x4b, 0x1c, 0x70, 0x38, 0x1a, 0xca, 0x3f, 0x08, 0xab, + 0x33, 0x0e, 0x01, 0x9b, 0x04, 0x40, 0xf5, 0xfd, 0x59, 0x6c, 0xf6, 0xa7, 0x00, 0xf8, 0xe6, 0x6c, + 0x01, 0xc0, 0xdc, 0xfe, 0x50, 0xc2, 0xfc, 0x21, 0x65, 0x00, 0x68, 0xd0, 0xf9, 0xdb, 0x21, 0xfa, + 0x4c, 0xf5, 0x00, 0x87, 0x24, 0xfb, 0xb3, 0x83, 0xfe, 0x49, 0xa4, 0x00, 0xcc, 0xdf, 0xfe, 0x20, + 0x83, 0x00, 0x06, 0x53, 0xfe, 0x32, 0xdf, 0xfd, 0x40, 0xef, 0xfe, 0x48, 0x28, 0xfe, 0x63, 0xe2, + 0xfc, 0xb0, 0x21, 0xff, 0x70, 0xf7, 0xfc, 0x00, 0xde, 0xfd, 0x0d, 0xea, 0xff, 0xca, 0xb7, 0xff, + 0x2a, 0xe2, 0xff, 0x88, 0x78, 0xff, 0x6b, 0xc0, 0x1f, 0x08, 0x8d, 0x19, 0x92, 0xf6, 0x04, 0x2a, + 0x60, 0x11, 0xdf, 0xe8, 0x03, 0x26, 0xc5, 0xfd, 0x1c, 0x63, 0xf7, 0xff, 0xfe, 0xf8, 0x44, 0x40, + 0x04, 0x02, 0x87, 0xfb, 0x7f, 0xf2, 0xf9, 0x48, 0x91, 0x02, 0x0a, 0xaf, 0xfa, 0x8f, 0x28, 0xf9, + 0xe8, 0x53, 0x01, 0x06, 0x05, 0xf9, 0x09, 0x29, 0xfe, 0x8a, 0xc6, 0x01, 0x74, 0x2f, 0xfd, 0x2d, + 0x09, 0x02, 0xb3, 0xbd, 0xfe, 0xcc, 0x67, 0xfd, 0xa9, 0x24, 0xff, 0x49, 0x74, 0xfe, 0xf0, 0x07, + 0xfd, 0x50, 0xab, 0xfe, 0x2a, 0x02, 0xfd, 0x3b, 0x1e, 0xfe, 0x74, 0xf1, 0xff, 0x80, 0x38, 0xff, + 0x45, 0xe4, 0xff, 0x7a, 0x3a, 0xff, 0xad, 0xfd, 0x22, 0x5a, 0xe3, 0x19, 0x0f, 0x6c, 0x00, 0x31, + 0x30, 0x14, 0x31, 0x12, 0x04, 0xeb, 0xc9, 0xfb, 0xa9, 0x20, 0xf9, 0xcc, 0x69, 0xfa, 0x1e, 0x2e, + 0x07, 0x6d, 0x4d, 0xf9, 0x07, 0x7d, 0xf5, 0x37, 0xc0, 0x03, 0x7a, 0xab, 0xfc, 0x60, 0x44, 0xf9, + 0xae, 0xb1, 0xff, 0x4c, 0xeb, 0xf7, 0xfa, 0x58, 0xfe, 0x23, 0x12, 0x01, 0x0a, 0xc0, 0xfc, 0xfa, + 0xe2, 0x02, 0x44, 0x50, 0xff, 0x2a, 0xee, 0xfc, 0xe8, 0x17, 0xff, 0x3f, 0xda, 0xfe, 0xc3, 0x0f, + 0xfd, 0xa3, 0xc0, 0xfe, 0xa2, 0xda, 0xfc, 0xa8, 0xd7, 0xfd, 0xd8, 0x36, 0x00, 0xe2, 0x36, 0xff, + 0xb4, 0x8a, 0xff, 0x09, 0xd3, 0xfe, 0x2c, 0x24, 0x27, 0xec, 0xc4, 0x1a, 0xec, 0x12, 0xfb, 0x5d, + 0x39, 0x15, 0xf4, 0x3c, 0x05, 0x61, 0x89, 0xf9, 0x09, 0x67, 0xfa, 0x21, 0x61, 0xfc, 0x28, 0x1a, + 0x0a, 0x9e, 0x99, 0xf8, 0x96, 0x2b, 0xf0, 0xbd, 0x3d, 0x03, 0x6f, 0x7b, 0x00, 0x39, 0x3d, 0xf8, + 0x2e, 0xdc, 0xfe, 0xce, 0xa2, 0xf7, 0x4a, 0xe7, 0xfc, 0xb0, 0xfc, 0x01, 0x49, 0xb9, 0xfb, 0x38, + 0x30, 0x03, 0xe0, 0x41, 0x00, 0x6f, 0x6e, 0xfc, 0xed, 0x2b, 0xff, 0x6a, 0xd3, 0xfe, 0x9b, 0x0c, + 0xfd, 0xdb, 0x3c, 0xff, 0x7a, 0xfa, 0xfc, 0x77, 0x34, 0xfd, 0x8a, 0xb8, 0x00, 0x1a, 0x2d, 0xff, + 0xf7, 0x31, 0xff, 0x4f, 0x69, 0xfe, 0xd6, 0x61, 0x2c, 0x67, 0x4f, 0x1e, 0x85, 0xba, 0xf3, 0x02, + 0xa5, 0x11, 0x01, 0x0f, 0x08, 0xfb, 0x2c, 0xfa, 0x61, 0xe0, 0xfb, 0x35, 0x83, 0xfc, 0xe4, 0xd2, + 0x0b, 0x71, 0xa8, 0xfa, 0xba, 0x65, 0xeb, 0x0d, 0x9f, 0x01, 0x55, 0x98, 0x03, 0x02, 0x29, 0xf8, + 0x2e, 0x72, 0xfe, 0xc1, 0xd4, 0xf6, 0x7b, 0xb0, 0xfc, 0x8c, 0x60, 0x02, 0x32, 0x7d, 0xfb, 0xdd, + 0xd9, 0x02, 0xa2, 0xb6, 0x00, 0xfd, 0x01, 0xfd, 0x81, 0xde, 0xfe, 0x86, 0x8f, 0xfe, 0xa5, 0xea, + 0xfc, 0x5b, 0xe6, 0xff, 0xcf, 0x83, 0xfd, 0x25, 0xfb, 0xfc, 0xb5, 0x7c, 0x00, 0x81, 0x77, 0xff, + 0x11, 0x0a, 0xff, 0x2f, 0xff, 0xfd, 0x8f, 0xa1, 0x31, 0xff, 0x2a, 0x22, 0xc8, 0x71, 0xec, 0x88, + 0x2e, 0x0c, 0xb7, 0xd7, 0x0a, 0x76, 0x3b, 0xfc, 0x80, 0x1c, 0xfd, 0xb2, 0xe6, 0xfb, 0x3e, 0x77, + 0x0c, 0x12, 0x38, 0xfd, 0x3a, 0x77, 0xe8, 0x24, 0x7e, 0xfe, 0xd6, 0x2f, 0x05, 0x01, 0xc4, 0xf9, + 0xb2, 0x8a, 0xfd, 0xa7, 0x81, 0xf6, 0x79, 0x53, 0xfc, 0x75, 0x35, 0x02, 0xc0, 0xc0, 0xfb, 0x19, + 0x5a, 0x02, 0x2b, 0x18, 0x01, 0xd2, 0x25, 0xfd, 0xb7, 0x58, 0xfe, 0x21, 0x3f, 0xfe, 0x6c, 0x28, + 0xfd, 0xed, 0x15, 0x00, 0x3c, 0xc7, 0xfd, 0x93, 0xe6, 0xfc, 0x22, 0x1b, 0x00, 0x94, 0xf7, 0xff, + 0xa5, 0x16, 0xff, 0xb8, 0x4a, 0xfd, 0xa7, 0xa5, 0x36, 0x9e, 0xef, 0x25, 0x8a, 0xf3, 0xe5, 0xe4, + 0x7f, 0x06, 0x18, 0xa0, 0x0c, 0x7b, 0x84, 0xff, 0xb1, 0x51, 0xfe, 0xb3, 0x18, 0xfb, 0x58, 0x93, + 0x0c, 0x0f, 0x14, 0x00, 0x47, 0x07, 0xe7, 0x23, 0xf0, 0xfa, 0x47, 0x92, 0x05, 0xdd, 0x3c, 0xfc, + 0xc1, 0x1c, 0xfd, 0x85, 0x0d, 0xf6, 0xac, 0xa3, 0xfc, 0x5e, 0x7b, 0x01, 0xc4, 0xed, 0xfb, 0xda, + 0x74, 0x02, 0x79, 0x09, 0x01, 0x7e, 0x0e, 0xfd, 0xb4, 0x34, 0xfe, 0xf4, 0x14, 0xfe, 0x22, 0x51, + 0xfd, 0x42, 0xf7, 0xff, 0x6d, 0xa7, 0xfd, 0x16, 0x5c, 0xfd, 0x94, 0x00, 0x00, 0xc5, 0x48, 0x00, + 0x50, 0xe3, 0xfe, 0x18, 0xbc, 0xfc, 0x0c, 0xe2, 0x3c, 0xca, 0xeb, 0x26, 0xfe, 0x5a, 0xe0, 0xa8, + 0x95, 0x02, 0x98, 0x6e, 0x0c, 0xb2, 0x0e, 0x03, 0x4d, 0xd2, 0xfe, 0xfa, 0xc1, 0xf9, 0xab, 0xa1, + 0x0d, 0xfd, 0xc3, 0x02, 0xb1, 0x0a, 0xe5, 0x22, 0xd1, 0xf7, 0x50, 0xb8, 0x05, 0x12, 0xea, 0xfd, + 0xc8, 0xd9, 0xfd, 0x7b, 0x51, 0xf5, 0x84, 0x54, 0xfd, 0xf5, 0x06, 0x00, 0x56, 0xb8, 0xfb, 0x42, + 0x50, 0x03, 0xae, 0x6d, 0x00, 0xca, 0xbf, 0xfc, 0xcc, 0x3d, 0xfe, 0xd8, 0x21, 0xfe, 0x9c, 0x9a, + 0xfc, 0x45, 0xec, 0xff, 0xe4, 0x93, 0xfd, 0xcd, 0xdf, 0xfd, 0xde, 0xc0, 0xff, 0x96, 0x16, 0x00, + 0xd9, 0xf5, 0xfe, 0x03, 0x81, 0xfc, 0xd3, 0x4a, 0x42, 0x49, 0xf2, 0x27, 0xe8, 0xca, 0xdb, 0xf1, + 0xa8, 0x00, 0xa0, 0x2d, 0x0b, 0x78, 0xec, 0x05, 0x9e, 0x32, 0xff, 0xaf, 0xf8, 0xf7, 0x83, 0xd1, + 0x10, 0x29, 0xcf, 0x05, 0x79, 0xef, 0xe1, 0xc2, 0xd0, 0xf5, 0x43, 0x12, 0x06, 0x30, 0x79, 0xfe, + 0x5d, 0x61, 0x00, 0xec, 0x35, 0xf5, 0xdc, 0xc9, 0xfc, 0x0a, 0xff, 0xfe, 0xd8, 0xdb, 0xfb, 0xce, + 0x2d, 0x04, 0x8c, 0x9b, 0xff, 0xb3, 0xc8, 0xfc, 0x6e, 0xb3, 0xfe, 0x1c, 0x10, 0xfe, 0x8f, 0x8f, + 0xfb, 0xf9, 0x40, 0x00, 0x87, 0xc6, 0xfd, 0x93, 0xdb, 0xfd, 0xfb, 0xae, 0xff, 0x80, 0x16, 0x00, + 0xdd, 0x52, 0xff, 0x75, 0x39, 0xfc, 0x1e, 0xf4, 0x46, 0x76, 0x6a, 0x28, 0x50, 0xee, 0xd7, 0x86, + 0x76, 0x00, 0xb9, 0xb2, 0x08, 0x33, 0x44, 0x07, 0xc9, 0x2b, 0xff, 0xcc, 0x78, 0xf5, 0xac, 0xe4, + 0x15, 0x68, 0x56, 0x07, 0x05, 0xa5, 0xde, 0x4e, 0x42, 0xf5, 0x1b, 0xa8, 0x04, 0xa0, 0x1f, 0xff, + 0x4f, 0x55, 0x03, 0x82, 0x33, 0xf5, 0xa8, 0x56, 0xfb, 0xdb, 0x6f, 0xfe, 0x55, 0x23, 0xfc, 0x5e, + 0xef, 0x03, 0xfa, 0xdd, 0xfe, 0x73, 0x0e, 0xfd, 0xb1, 0x3d, 0xff, 0x45, 0x95, 0xfd, 0x88, 0xa0, + 0xfa, 0x28, 0x20, 0x00, 0x5a, 0xfe, 0xfd, 0xf4, 0xba, 0xfd, 0x9e, 0x86, 0xff, 0x9d, 0x3b, 0x00, + 0x85, 0x32, 0xff, 0xb6, 0x1d, 0xfc, 0xb5, 0xeb, 0x4a, 0xaf, 0xca, 0x28, 0xd3, 0x0a, 0xd5, 0xda, + 0x6f, 0x01, 0xac, 0xbe, 0x05, 0x97, 0x87, 0x07, 0x99, 0xc5, 0xfe, 0x39, 0x32, 0xf3, 0x65, 0x7b, + 0x1b, 0x47, 0xce, 0x07, 0xd8, 0x09, 0xdd, 0xc5, 0x09, 0xf5, 0x7a, 0x3c, 0x02, 0x7d, 0x3d, 0x00, + 0xb6, 0xcb, 0x05, 0xc3, 0xc0, 0xf5, 0xf8, 0xbe, 0xf9, 0x7d, 0xa7, 0xfe, 0x93, 0x04, 0xfc, 0xd4, + 0xbb, 0x02, 0xdb, 0xdc, 0xfe, 0x9d, 0x8c, 0xfd, 0xd9, 0xa3, 0xff, 0x24, 0x00, 0xfd, 0xb1, 0xea, + 0xf9, 0x2d, 0xd0, 0xff, 0x73, 0x63, 0xfe, 0x8b, 0x8c, 0xfd, 0xac, 0x84, 0xff, 0x8e, 0x1c, 0x00, + 0xdf, 0x1c, 0xff, 0xc7, 0x7f, 0xfc, 0xb3, 0x06, 0x4f, 0x5c, 0x8f, 0x28, 0x1a, 0x33, 0xd3, 0xfc, + 0xc3, 0x02, 0x2e, 0x9d, 0x02, 0xc2, 0xc5, 0x07, 0x29, 0xa1, 0xfd, 0xbc, 0xc4, 0xf1, 0xf8, 0x0b, + 0x20, 0x6a, 0x03, 0x08, 0xd1, 0xa2, 0xdd, 0xb4, 0x34, 0xf4, 0x61, 0x19, 0x00, 0x56, 0xf4, 0x00, + 0x61, 0xf3, 0x07, 0xd5, 0xcc, 0xf6, 0x2b, 0x7f, 0xf8, 0xb3, 0x5f, 0xff, 0x21, 0x6d, 0xfb, 0x3e, + 0x10, 0x01, 0xef, 0x5b, 0xff, 0x5a, 0x7e, 0xfe, 0x9d, 0x76, 0xff, 0x78, 0x87, 0xfc, 0x4e, 0x84, + 0xf9, 0x01, 0xad, 0xff, 0x58, 0xcf, 0xfe, 0xa1, 0x5a, 0xfd, 0x8d, 0x55, 0xff, 0xb1, 0x54, 0x00, + 0x1e, 0x48, 0xff, 0x75, 0x57, 0xfc, 0x1b, 0x62, 0x51, 0x97, 0x0a, 0x2a, 0xdf, 0x9a, 0xd1, 0xb7, + 0x3e, 0x03, 0x09, 0xe8, 0xff, 0x93, 0xd7, 0x07, 0x47, 0x2c, 0xfc, 0x8f, 0x89, 0xf0, 0xb9, 0x19, + 0x22, 0x18, 0x30, 0x09, 0x63, 0xe5, 0xdf, 0xde, 0x68, 0xf2, 0xc3, 0x58, 0xfe, 0xcf, 0xb3, 0x00, + 0x25, 0xd2, 0x09, 0xd8, 0x17, 0xf8, 0xb7, 0x61, 0xf7, 0xe5, 0x51, 0x00, 0x17, 0x52, 0xfa, 0x0e, + 0x36, 0xff, 0x8b, 0xee, 0xff, 0x32, 0x8a, 0xff, 0x00, 0xad, 0xfe, 0xe8, 0x60, 0xfc, 0x8a, 0x12, + 0xf9, 0xd6, 0xb6, 0xff, 0x56, 0x4a, 0xff, 0xf2, 0x8a, 0xfc, 0x95, 0x7a, 0xff, 0x2b, 0xcd, 0x00, + 0x62, 0xf6, 0xfe, 0xb3, 0xcc, 0xfb, 0x90, 0xcd, 0x53, 0x14, 0xfd, 0x2a, 0x7e, 0x1a, 0xd1, 0xdb, + 0xe7, 0x02, 0x23, 0x86, 0xfd, 0x16, 0x57, 0x08, 0x5f, 0x0d, 0xfa, 0xfb, 0xd6, 0xef, 0xa0, 0x7d, + 0x22, 0xa9, 0xa8, 0x0a, 0x09, 0x38, 0xe3, 0x02, 0x83, 0xf0, 0xf9, 0x05, 0xfd, 0xc0, 0xb2, 0xff, + 0xa0, 0xbd, 0x0b, 0x01, 0x37, 0xf9, 0x32, 0xc4, 0xf6, 0x12, 0x25, 0x01, 0xad, 0x37, 0xf9, 0xac, + 0x84, 0xfd, 0x21, 0x78, 0x00, 0x0a, 0x32, 0x00, 0x12, 0x0b, 0xfe, 0x8a, 0x89, 0xfc, 0xcd, 0x51, + 0xf8, 0x75, 0x48, 0x00, 0x8c, 0x60, 0xff, 0xeb, 0xe0, 0xfb, 0x7a, 0x10, 0x00, 0x3d, 0xb1, 0x00, + 0x22, 0x7c, 0xfe, 0x39, 0x92, 0xfb, 0xe4, 0xbf, 0x55, 0x01, 0xb0, 0x2b, 0xe3, 0xb6, 0xd1, 0x66, + 0xfb, 0x01, 0x05, 0xa6, 0xfb, 0x85, 0xad, 0x08, 0xe7, 0x24, 0xf8, 0x41, 0x0d, 0xef, 0xbe, 0x44, + 0x21, 0x4d, 0xe3, 0x0c, 0xa9, 0xb7, 0xe6, 0x25, 0x0f, 0xef, 0x9f, 0x0c, 0xfc, 0x1e, 0x3e, 0xfe, + 0x9a, 0x5c, 0x0d, 0xe7, 0x34, 0xfa, 0x62, 0xa8, 0xf6, 0x57, 0x6f, 0x01, 0xf1, 0x7a, 0xf8, 0x6c, + 0x39, 0xfc, 0x00, 0xaa, 0x00, 0xa5, 0x76, 0x00, 0x2c, 0xa4, 0xfd, 0xaa, 0xf9, 0xfc, 0xcd, 0xc4, + 0xf7, 0x76, 0x69, 0x00, 0x18, 0x75, 0xff, 0x46, 0xf3, 0xfb, 0x3d, 0x08, 0x00, 0xb1, 0x2a, 0x00, + 0x70, 0x4a, 0xfe, 0x67, 0x6d, 0xfb, 0xdb, 0xfd, 0x55, 0xde, 0xf0, 0x2d, 0x91, 0xed, 0xd2, 0x82, + 0x81, 0x00, 0xac, 0x4f, 0xfa, 0xc3, 0xfd, 0x07, 0x56, 0x20, 0xf8, 0x3c, 0xc0, 0xec, 0x8b, 0xb7, + 0x1e, 0x1a, 0x8a, 0x10, 0xa3, 0xb9, 0xe9, 0xde, 0x89, 0xee, 0x98, 0xfd, 0xfa, 0x59, 0xd3, 0xfc, + 0x5f, 0x48, 0x0e, 0xc7, 0x5f, 0xfb, 0xcf, 0x05, 0xf7, 0x12, 0xfe, 0x00, 0x6b, 0x1b, 0xf8, 0x2a, + 0x7d, 0xfb, 0x37, 0x77, 0x00, 0x99, 0x60, 0x00, 0x9e, 0x65, 0xfd, 0x9d, 0xc0, 0xfd, 0x3f, 0x7e, + 0xf7, 0xd1, 0xbf, 0xff, 0x4d, 0x08, 0x00, 0xd8, 0xfa, 0xfb, 0xcc, 0x81, 0xff, 0x71, 0xda, 0xff, + 0x1c, 0xf7, 0xfd, 0xa4, 0xd4, 0xfb, 0x02, 0x88, 0x54, 0x13, 0x1f, 0x31, 0x2c, 0x46, 0xd5, 0x2a, + 0x29, 0xff, 0x2e, 0x09, 0xf9, 0xb3, 0x30, 0x06, 0xdd, 0x25, 0xfa, 0xda, 0xbd, 0xe8, 0x1b, 0x53, + 0x1b, 0x7d, 0x53, 0x15, 0x36, 0x1a, 0xec, 0x6e, 0x30, 0xef, 0x10, 0xdb, 0xf9, 0x38, 0x5a, 0xfb, + 0x96, 0x57, 0x0e, 0x00, 0xf3, 0xfc, 0xb4, 0xe5, 0xf7, 0x7e, 0xe1, 0xff, 0x9e, 0xea, 0xf7, 0x3e, + 0x3f, 0xfb, 0x33, 0x5e, 0x00, 0x94, 0x9a, 0xff, 0x61, 0xa7, 0xfd, 0x00, 0x7b, 0xfe, 0xd4, 0x51, + 0xf7, 0xff, 0x32, 0xff, 0x52, 0xdd, 0xff, 0xa8, 0x30, 0xfc, 0xe8, 0x0e, 0xff, 0x31, 0x65, 0xff, + 0x07, 0x38, 0xfe, 0xe0, 0xd5, 0xfc, 0xaa, 0x9b, 0x51, 0xf1, 0x90, 0x34, 0xac, 0xe1, 0xd8, 0x92, + 0x70, 0xfe, 0x3d, 0x97, 0xf7, 0x32, 0xd4, 0x03, 0xf6, 0x45, 0xfd, 0xe9, 0x65, 0xe3, 0x35, 0x80, + 0x17, 0x9a, 0xb7, 0x1a, 0x8d, 0x2f, 0xee, 0x4d, 0x84, 0xf0, 0x20, 0x66, 0xf9, 0x9a, 0x8f, 0xf9, + 0x71, 0x90, 0x0d, 0xf4, 0x21, 0xff, 0x63, 0xee, 0xf8, 0xf3, 0x73, 0xfe, 0x98, 0xa1, 0xf7, 0xf6, + 0xc6, 0xfb, 0x37, 0x21, 0x00, 0x3a, 0x86, 0xfe, 0x0a, 0x1c, 0xfe, 0xec, 0x0c, 0xff, 0xd3, 0x57, + 0xf7, 0x9d, 0x4c, 0xfe, 0x5f, 0xa6, 0xff, 0xd9, 0x44, 0xfc, 0x10, 0xaa, 0xfe, 0x07, 0xb7, 0xff, + 0xf8, 0xda, 0xfe, 0xc4, 0x72, 0xfd, 0x45, 0x67, 0x4d, 0x72, 0x8b, 0x37, 0xa7, 0x2b, 0xde, 0x0f, + 0x2f, 0xfe, 0xf5, 0xb0, 0xf5, 0x54, 0xa3, 0x01, 0xd1, 0x53, 0x00, 0xac, 0x02, 0xde, 0x21, 0xbb, + 0x12, 0xdb, 0xd1, 0x1f, 0xcb, 0xa2, 0xf0, 0x44, 0x19, 0xf2, 0xf4, 0x1d, 0xfa, 0xbd, 0x04, 0xf7, + 0xcd, 0xfb, 0x0b, 0xb4, 0xd5, 0x01, 0xab, 0xb3, 0xf9, 0xca, 0xfe, 0xfc, 0x95, 0xe2, 0xf7, 0xde, + 0xf1, 0xfb, 0xdf, 0x1e, 0x00, 0x95, 0x7f, 0xfd, 0xef, 0xfe, 0xfd, 0x0f, 0xc6, 0xff, 0x73, 0xd4, + 0xf6, 0x00, 0xef, 0xfd, 0x07, 0xea, 0xfe, 0x9a, 0x32, 0xfc, 0x1b, 0x67, 0xff, 0x5f, 0x09, 0x00, + 0xd0, 0x4d, 0xff, 0x1a, 0x34, 0xfe, 0x95, 0x8b, 0x48, 0x26, 0x23, 0x3a, 0x1b, 0xb6, 0xe4, 0x5c, + 0xff, 0xfd, 0xcc, 0xa0, 0xf3, 0xe6, 0x50, 0x00, 0x63, 0xc1, 0x02, 0x4c, 0x3b, 0xda, 0x28, 0x5f, + 0x0c, 0x3f, 0xce, 0x23, 0xb5, 0xbf, 0xf4, 0xcb, 0x04, 0xf3, 0x3e, 0xdc, 0xfc, 0x03, 0xae, 0xf3, + 0x17, 0x01, 0x0a, 0xb4, 0xc1, 0x04, 0x42, 0xf4, 0xf9, 0x03, 0xc8, 0xfc, 0xda, 0xfc, 0xf7, 0xbd, + 0xee, 0xfb, 0x90, 0x2b, 0x00, 0x62, 0x4d, 0xfd, 0x47, 0x61, 0xfc, 0x09, 0x93, 0x00, 0x75, 0x45, + 0xf7, 0x07, 0x86, 0xfc, 0x80, 0x01, 0xff, 0x6c, 0xab, 0xfc, 0xa7, 0x27, 0x00, 0x8a, 0x67, 0x00, + 0x99, 0x32, 0x00, 0x91, 0x8a, 0xfe, 0x18, 0x0a, 0x44, 0x73, 0xb9, 0x3b, 0xe3, 0x7a, 0xea, 0xf3, + 0x0d, 0xfe, 0xb0, 0xfe, 0xf2, 0x7e, 0x66, 0xfe, 0xa1, 0x25, 0x03, 0x70, 0xe7, 0xd9, 0x2d, 0xc1, + 0x04, 0x52, 0xd5, 0x24, 0x8c, 0x6a, 0xfb, 0x31, 0xb3, 0xf2, 0x08, 0x31, 0x00, 0x93, 0x38, 0xf1, + 0xa6, 0x86, 0x06, 0x44, 0x28, 0x08, 0xbf, 0xbe, 0xf9, 0x37, 0x3a, 0xfd, 0xba, 0x51, 0xf8, 0x61, + 0xd6, 0xfa, 0x6f, 0x8c, 0x00, 0xad, 0x06, 0xfd, 0xbc, 0x5f, 0xfa, 0x47, 0xf7, 0x00, 0x6f, 0x74, + 0xf7, 0xbd, 0x10, 0xfc, 0x0a, 0xb8, 0xff, 0x54, 0x6c, 0xfc, 0xa9, 0x22, 0x01, 0xcb, 0x5c, 0x01, + 0xd0, 0x30, 0x00, 0xa5, 0x01, 0xfe, 0x5a, 0xcb, 0x40, 0xb7, 0xfe, 0x3b, 0x4b, 0xb4, 0xed, 0xc2, + 0xd5, 0xfe, 0x79, 0x3c, 0xf5, 0x0e, 0xe9, 0xfa, 0x2a, 0xaf, 0x00, 0x1c, 0xee, 0xdc, 0x83, 0x8e, + 0xfd, 0x40, 0xfe, 0x22, 0x51, 0xee, 0x02, 0xce, 0x41, 0xf2, 0x0d, 0x9c, 0x02, 0xb1, 0x4c, 0xf0, + 0x36, 0x67, 0x02, 0x7a, 0xf3, 0x0a, 0x0d, 0x53, 0xfa, 0x3c, 0x3b, 0xfd, 0xc8, 0x51, 0xf9, 0xb7, + 0xc2, 0xf8, 0xad, 0x8d, 0xff, 0x6a, 0x2c, 0xfe, 0xcd, 0x25, 0xf8, 0xee, 0xc4, 0xff, 0x3f, 0x0b, + 0xf9, 0xb0, 0x0d, 0xfc, 0x75, 0x3f, 0x00, 0xd9, 0x57, 0xfc, 0x8c, 0xe1, 0x01, 0x19, 0xca, 0x01, + 0x65, 0xcb, 0xff, 0x95, 0xdb, 0xfd, 0x2a, 0xb5, 0x3f, 0x9c, 0x60, 0x39, 0x86, 0x96, 0xef, 0xf3, + 0x95, 0x01, 0x17, 0x0b, 0xf8, 0xd0, 0xf1, 0xf7, 0xea, 0x5c, 0xfc, 0xda, 0x43, 0xe1, 0xe7, 0x1f, + 0xf8, 0x72, 0xe9, 0x20, 0xb5, 0x3e, 0x08, 0xbf, 0x99, 0xf2, 0x12, 0x1f, 0x05, 0x6d, 0xda, 0xee, + 0x69, 0x47, 0x00, 0x13, 0x51, 0x0c, 0x22, 0xa3, 0xfb, 0x03, 0xd7, 0xfd, 0x49, 0x70, 0xf9, 0xe0, + 0xb2, 0xf6, 0x5a, 0x08, 0xff, 0xad, 0x37, 0xfe, 0x7c, 0x6a, 0xf6, 0xfd, 0x2d, 0x00, 0xfc, 0xa9, + 0xf9, 0x74, 0x9b, 0xfc, 0xc4, 0xed, 0x00, 0xb7, 0x1c, 0xfc, 0x95, 0x5b, 0x02, 0x6f, 0xe7, 0x01, + 0x14, 0x79, 0xff, 0xa4, 0xb6, 0xfd, 0xbb, 0xf0, 0x3e, 0x4e, 0x53, 0x36, 0x37, 0x3c, 0xf0, 0x58, + 0x2f, 0x05, 0x1a, 0xea, 0xfa, 0xf0, 0x85, 0xf4, 0x9c, 0xbb, 0xf8, 0x88, 0xb8, 0xe6, 0xb2, 0x8c, + 0xf2, 0x2b, 0x8e, 0x1e, 0x60, 0xa7, 0x0d, 0xc4, 0xa5, 0xf0, 0x44, 0x82, 0x08, 0x4c, 0xff, 0xee, + 0x62, 0x20, 0xfd, 0xdd, 0xac, 0x0e, 0x5b, 0xb3, 0xfc, 0xff, 0xa5, 0xfd, 0x25, 0xc3, 0xf9, 0x60, + 0x4f, 0xf6, 0x7a, 0xe0, 0xfc, 0xe4, 0xcb, 0xfd, 0x96, 0xf7, 0xf5, 0xa4, 0xae, 0x00, 0x33, 0x23, + 0xfb, 0xbe, 0xc4, 0xfb, 0xe2, 0x7a, 0x01, 0x52, 0x9a, 0xfc, 0x38, 0x81, 0x02, 0xea, 0x5e, 0x01, + 0x34, 0x32, 0xff, 0xe1, 0x7d, 0xfe, 0x05, 0x82, 0x3f, 0x94, 0xed, 0x32, 0x48, 0xed, 0xee, 0x6f, + 0x21, 0x08, 0x57, 0x4d, 0xfd, 0x01, 0xbe, 0xf1, 0x07, 0x92, 0xf6, 0x09, 0x29, 0xed, 0x74, 0x35, + 0xef, 0xe7, 0xcc, 0x18, 0x2a, 0xa0, 0x13, 0xc6, 0xd8, 0xed, 0x9c, 0x1c, 0x09, 0xa2, 0xdd, 0xf3, + 0x62, 0xe1, 0xf7, 0xc6, 0x9b, 0x11, 0x5a, 0xcd, 0xfd, 0x9d, 0x97, 0xfb, 0xcf, 0x2d, 0xfc, 0xf9, + 0xb7, 0xf5, 0x0b, 0xcd, 0xfa, 0xde, 0x81, 0xfd, 0x46, 0xbe, 0xf5, 0x39, 0xcd, 0x00, 0x59, 0x7d, + 0xfd, 0xf1, 0x0b, 0xfa, 0x51, 0x9d, 0x01, 0x3c, 0xbe, 0xfd, 0x58, 0x62, 0x01, 0xf3, 0xd7, 0x01, + 0xaa, 0x0c, 0xff, 0x47, 0xbd, 0xfe, 0x38, 0x74, 0x3e, 0xdc, 0x8f, 0x30, 0xba, 0xf3, 0xed, 0xb4, + 0x33, 0x0b, 0x7b, 0x0b, 0xff, 0x22, 0xd5, 0xef, 0xd1, 0x6f, 0xf5, 0x49, 0x30, 0xf1, 0xc9, 0xe0, + 0xed, 0xe9, 0x48, 0x12, 0xbc, 0x1f, 0x19, 0xa6, 0x0f, 0xee, 0x15, 0x05, 0x05, 0xb1, 0x60, 0xfa, + 0x01, 0x5f, 0xf4, 0xbe, 0x16, 0x11, 0xe0, 0x46, 0x02, 0xb8, 0xc8, 0xf8, 0x08, 0x45, 0xfd, 0x4e, + 0xbb, 0xf6, 0xf0, 0x71, 0xf9, 0x41, 0x5f, 0xfd, 0xa6, 0x25, 0xf5, 0x04, 0x4f, 0x00, 0x45, 0x0c, + 0xff, 0xfd, 0x9e, 0xf9, 0xc7, 0xca, 0x00, 0xf3, 0x5b, 0xfe, 0x90, 0xd8, 0x00, 0x55, 0x30, 0x02, + 0xed, 0x8c, 0xff, 0xe3, 0x68, 0xfe, 0x82, 0x5a, 0x3d, 0xb1, 0xbe, 0x2c, 0x5b, 0xb5, 0xed, 0xe0, + 0x16, 0x0f, 0x3d, 0xa3, 0xfe, 0x19, 0x4a, 0xef, 0x8e, 0xcf, 0xf6, 0x42, 0x5d, 0xf2, 0x8a, 0xe4, + 0xec, 0x79, 0x1b, 0x0e, 0x6d, 0xdc, 0x1b, 0xb4, 0x15, 0xef, 0x15, 0xab, 0x01, 0x39, 0xac, 0xfc, + 0x79, 0x0a, 0xf5, 0xa0, 0xe7, 0x0f, 0x9b, 0xac, 0x04, 0x1b, 0x60, 0xf8, 0x6a, 0x15, 0xfd, 0xa7, + 0x7f, 0xf8, 0x8f, 0x74, 0xf8, 0x77, 0x56, 0xfe, 0xe2, 0xb3, 0xf4, 0xfc, 0x9f, 0xfd, 0x39, 0xcc, + 0xff, 0x50, 0x66, 0xfa, 0xa9, 0x86, 0x00, 0xc2, 0x2f, 0xfe, 0x47, 0x62, 0x00, 0xbb, 0x35, 0x02, + 0xeb, 0xec, 0xff, 0xc2, 0xa9, 0xfe, 0x04, 0x32, 0x3c, 0xff, 0xc0, 0x29, 0xc2, 0xe6, 0xec, 0xca, + 0x28, 0x12, 0x62, 0x20, 0xfd, 0x9f, 0xe6, 0xed, 0x5e, 0xef, 0xfa, 0x58, 0xfb, 0xf4, 0xb6, 0x7f, + 0xea, 0x3b, 0x26, 0x09, 0xe1, 0x5a, 0x1f, 0x63, 0xf3, 0xee, 0xb0, 0xbb, 0xfd, 0x63, 0x9e, 0x01, + 0x27, 0xe8, 0xf3, 0x65, 0x7d, 0x0d, 0x99, 0xe1, 0x07, 0xbd, 0xc2, 0xf8, 0x1e, 0xf1, 0xfc, 0x94, + 0x81, 0xf9, 0x7a, 0x3c, 0xf8, 0xb0, 0xcc, 0xff, 0xf0, 0x54, 0xf5, 0x5b, 0x4f, 0xf9, 0x32, 0x16, + 0xff, 0x39, 0xe2, 0xfb, 0x78, 0xdf, 0x00, 0x95, 0x28, 0xff, 0x5e, 0x7f, 0xfe, 0x2b, 0x54, 0x01, + 0x8c, 0x65, 0x01, 0xfa, 0x91, 0xff, 0xa8, 0x0b, 0x3a, 0x11, 0x7d, 0x28, 0xbd, 0xac, 0xe9, 0x87, + 0x53, 0x15, 0x76, 0x6b, 0xff, 0xf6, 0x55, 0xea, 0x67, 0x40, 0xfe, 0x4f, 0x66, 0xf8, 0x17, 0xfc, + 0xe9, 0x69, 0x1d, 0x02, 0x13, 0x55, 0x21, 0x48, 0x9d, 0xf2, 0xf1, 0x33, 0xf8, 0xa6, 0x40, 0x06, + 0xa4, 0x3d, 0xf4, 0xf6, 0xe4, 0x07, 0x2f, 0x8d, 0x0c, 0x29, 0x25, 0xfa, 0x24, 0x07, 0xfc, 0x68, + 0xa9, 0xfb, 0x8d, 0xd2, 0xf6, 0x0a, 0x9b, 0x01, 0x56, 0xf3, 0xf6, 0x15, 0x01, 0xf5, 0xb8, 0x09, + 0xfe, 0xbf, 0xbd, 0xfc, 0x6d, 0x9d, 0x00, 0xcc, 0x2a, 0x01, 0x86, 0x8f, 0xfd, 0x6b, 0x12, 0xff, + 0x11, 0xfa, 0x02, 0x83, 0x8b, 0x00, 0x8c, 0x8f, 0x38, 0xe3, 0x5e, 0x25, 0xea, 0x71, 0xe8, 0xca, + 0x51, 0x17, 0xa7, 0x2d, 0x02, 0x85, 0xfd, 0xe9, 0xf9, 0x00, 0xfd, 0xe8, 0x38, 0xfd, 0x22, 0xb5, + 0xeb, 0xd1, 0x11, 0xfa, 0x8a, 0x8d, 0x22, 0x1a, 0xe3, 0xf6, 0x2b, 0xa3, 0xf4, 0x8c, 0xa0, 0x08, + 0x3b, 0x06, 0xf6, 0x66, 0x40, 0x03, 0xae, 0x6c, 0x0d, 0x47, 0xe6, 0xfd, 0xce, 0x17, 0xfc, 0x89, + 0x98, 0xfc, 0x73, 0x57, 0xf7, 0xe7, 0x34, 0x01, 0x4b, 0x2e, 0xf8, 0xf1, 0x40, 0xf4, 0xb1, 0xfa, + 0xfc, 0xad, 0xe8, 0xfb, 0x24, 0x1f, 0x00, 0xf0, 0xbf, 0x02, 0x94, 0x16, 0xfe, 0xec, 0x51, 0xfe, + 0x0f, 0x57, 0x02, 0xdb, 0xf2, 0x00, 0xac, 0xf6, 0x35, 0x95, 0xa9, 0x21, 0xf1, 0xb9, 0xe8, 0x37, + 0xc6, 0x19, 0xc3, 0x8f, 0x02, 0x4b, 0xa7, 0xea, 0x77, 0x3a, 0xfe, 0xf0, 0x9b, 0xfd, 0x18, 0x46, + 0xed, 0xb7, 0x7d, 0xf7, 0xb5, 0xc4, 0x1f, 0x99, 0x40, 0xf9, 0x84, 0x84, 0xf4, 0x41, 0x06, 0x0a, + 0x1a, 0xf4, 0xf6, 0xdd, 0xd9, 0xff, 0xe8, 0xe4, 0x0c, 0x44, 0xc6, 0xff, 0xf6, 0xb2, 0xfd, 0xcb, + 0x2d, 0xfd, 0x90, 0x40, 0xf8, 0xab, 0x19, 0x00, 0x33, 0x1a, 0xf8, 0xf0, 0xb4, 0xf5, 0x49, 0xa4, + 0xfc, 0x21, 0x23, 0xfb, 0xec, 0x65, 0xfe, 0x77, 0xf3, 0x02, 0x9c, 0x0b, 0xff, 0xa4, 0x3c, 0xff, + 0xec, 0x42, 0x01, 0x8f, 0xa8, 0xff, 0x22, 0x64, 0x32, 0xce, 0x85, 0x1d, 0xcd, 0x51, 0xeb, 0x83, + 0x41, 0x1b, 0x9e, 0x87, 0x01, 0x2f, 0xe0, 0xec, 0xe7, 0x39, 0xff, 0x3f, 0xea, 0xfc, 0xd9, 0xc8, + 0xee, 0xf3, 0xe8, 0xf6, 0x77, 0x36, 0x1c, 0x88, 0x71, 0xfa, 0x2f, 0x3d, 0xf5, 0x33, 0x03, 0x0b, + 0xa5, 0xa7, 0xf8, 0x8d, 0x3a, 0xfc, 0xba, 0xa2, 0x0c, 0x3b, 0xca, 0x00, 0xba, 0x0a, 0xfd, 0x5e, + 0xd0, 0xff, 0x1d, 0x99, 0xf8, 0x0a, 0x01, 0xff, 0x38, 0xb9, 0xf8, 0xc1, 0xb8, 0xf5, 0x7f, 0x12, + 0xfe, 0xd0, 0x70, 0xfb, 0x0a, 0x53, 0xfc, 0x02, 0xbd, 0x01, 0x94, 0xba, 0xff, 0x59, 0x12, 0x00, + 0x4b, 0x6a, 0x01, 0xec, 0xe6, 0xfe, 0x6e, 0xb0, 0x2d, 0x3c, 0x40, 0x1a, 0xac, 0x23, 0xef, 0x9c, + 0x42, 0x1b, 0xf8, 0x20, 0x01, 0x29, 0x37, 0xef, 0x8d, 0xb0, 0xff, 0x77, 0x26, 0xfd, 0x2b, 0x69, + 0xf0, 0x4d, 0x15, 0xf6, 0xc5, 0xcb, 0x18, 0xba, 0x68, 0xfc, 0xc9, 0x85, 0xf5, 0x5d, 0xb9, 0x0a, + 0x19, 0x80, 0xfb, 0x80, 0xec, 0xf9, 0x31, 0xf0, 0x0a, 0xac, 0x25, 0x02, 0xc3, 0x22, 0xfc, 0xb5, + 0x63, 0x00, 0x77, 0xbe, 0xfa, 0xb8, 0x18, 0xfe, 0x37, 0x27, 0xf9, 0x1e, 0xd2, 0xf6, 0x36, 0x4c, + 0xfe, 0x4f, 0xd1, 0xfc, 0xd6, 0x39, 0xfb, 0xa5, 0x46, 0x00, 0xa4, 0xb4, 0xff, 0xde, 0x45, 0x00, + 0xa8, 0xf3, 0x01, 0x5f, 0xda, 0xfe, 0x9f, 0xa9, 0x2c, 0x1c, 0x6f, 0x14, 0x4b, 0xa3, 0xec, 0x11, + 0x24, 0x21, 0x47, 0x26, 0x06, 0x4e, 0x7c, 0xe9, 0xdd, 0x11, 0xfd, 0xcd, 0x2d, 0x01, 0x51, 0x40, + 0xf3, 0xd0, 0x20, 0xfb, 0x54, 0x9d, 0x11, 0x7e, 0x14, 0xf7, 0xc9, 0xb6, 0xf9, 0x3f, 0x17, 0x09, + 0x3a, 0x9f, 0xfb, 0x27, 0x9c, 0xfd, 0x66, 0xd4, 0x06, 0xa7, 0x23, 0xff, 0xba, 0x8f, 0xff, 0x39, + 0xb6, 0x01, 0x2e, 0x3d, 0xfe, 0xf7, 0x2c, 0x03, 0xdf, 0x3c, 0xfd, 0xc3, 0xba, 0xfb, 0xca, 0x9a, + 0x00, 0x31, 0xbd, 0xfc, 0x8b, 0x32, 0xfc, 0x6e, 0x08, 0xff, 0x71, 0xa2, 0xfb, 0xcd, 0x73, 0xfc, + 0x0e, 0xda, 0xfe, 0xa4, 0x19, 0xfe, 0x38, 0x4f, 0x26, 0x96, 0x3d, 0x13, 0x90, 0x7c, 0xf1, 0xa6, + 0xd6, 0x1c, 0xca, 0xf1, 0x05, 0x2f, 0x48, 0xee, 0xf2, 0xb6, 0xfd, 0x18, 0x18, 0x00, 0xec, 0x62, + 0xf5, 0xd1, 0x16, 0xfb, 0x3a, 0xb6, 0x0e, 0x41, 0x3b, 0xf9, 0x8b, 0xe2, 0xf9, 0xa3, 0xbb, 0x07, + 0x85, 0x74, 0xfc, 0x9e, 0x0c, 0xfd, 0x71, 0x05, 0x06, 0x71, 0xd3, 0xff, 0x5c, 0x44, 0xff, 0x1c, + 0x33, 0x01, 0x6d, 0xda, 0xfe, 0xeb, 0xac, 0x02, 0x76, 0x11, 0xfd, 0x09, 0x28, 0xfc, 0xf3, 0x8c, + 0x00, 0x20, 0xd3, 0xfc, 0xb6, 0xee, 0xfc, 0x01, 0x9a, 0xff, 0xe6, 0xbe, 0xfc, 0xb5, 0x2a, 0xfd, + 0xbd, 0x5c, 0xfe, 0x6a, 0x4f, 0xfe, 0x78, 0x80, 0x20, 0xc5, 0xb3, 0x12, 0x22, 0xdb, 0xf5, 0x0e, + 0xff, 0x17, 0x00, 0xd7, 0x06, 0x6e, 0xf5, 0xf2, 0x09, 0x51, 0xfd, 0x06, 0xce, 0xff, 0x3a, 0x58, + 0xf7, 0xa9, 0xe9, 0xfa, 0xf3, 0x80, 0x0c, 0x40, 0x55, 0xfb, 0x33, 0xfc, 0xf9, 0x9d, 0x4f, 0x06, + 0x56, 0xf2, 0xfd, 0xf0, 0xf4, 0xfc, 0x37, 0xf4, 0x04, 0xd5, 0xa4, 0x00, 0x19, 0x6e, 0xff, 0xb2, + 0xca, 0x00, 0x00, 0x0a, 0xff, 0x12, 0x3a, 0x02, 0x94, 0xc0, 0xfd, 0xaf, 0x4a, 0xfc, 0x60, 0x10, + 0x00, 0x02, 0x87, 0xfd, 0xc9, 0x5e, 0xfd, 0x9a, 0x4e, 0x00, 0xd5, 0xc6, 0xfd, 0xfb, 0x8d, 0xfd, + 0xf6, 0x91, 0xfe, 0x7d, 0x61, 0xfe, 0x3c, 0x4f, 0x1b, 0x8f, 0xff, 0x11, 0x4a, 0x16, 0xf9, 0x93, + 0xa5, 0x13, 0x06, 0x20, 0x08, 0x20, 0x7f, 0xf6, 0xa3, 0xf0, 0xfc, 0x7c, 0x1e, 0x00, 0x68, 0xd0, + 0xf8, 0xeb, 0xc2, 0xfa, 0x5c, 0x79, 0x0a, 0x67, 0xeb, 0xfc, 0xc0, 0x07, 0xfa, 0x96, 0xe3, 0x04, + 0x80, 0x01, 0xff, 0x65, 0x3f, 0xfd, 0x38, 0x09, 0x04, 0x61, 0xb6, 0x00, 0x5f, 0xb9, 0xff, 0x0e, + 0xb1, 0x00, 0xb8, 0xca, 0xfe, 0xea, 0xcb, 0x01, 0x5e, 0x2c, 0xfe, 0xe9, 0x93, 0xfc, 0x56, 0xc6, + 0xff, 0x02, 0x5f, 0xfe, 0xf1, 0xfd, 0xfd, 0xdb, 0xd6, 0xff, 0xb7, 0x80, 0xfe, 0x12, 0x37, 0xfe, + 0x4a, 0xc0, 0xfe, 0xa8, 0x5b, 0xfe, 0x0e, 0xef, 0x16, 0x0e, 0x1f, 0x11, 0x97, 0x86, 0xfb, 0x79, + 0x74, 0x10, 0xf6, 0x1e, 0x09, 0xa5, 0x24, 0xf9, 0x1d, 0x64, 0xfd, 0x56, 0xc7, 0x00, 0xcc, 0xda, + 0xf9, 0x64, 0xcf, 0xfa, 0x05, 0xf0, 0x08, 0x7a, 0x03, 0xfe, 0x65, 0x30, 0xfa, 0xd1, 0xf5, 0x03, + 0x98, 0xef, 0xff, 0x53, 0xcb, 0xfd, 0x69, 0x0a, 0x03, 0x07, 0x00, 0x01, 0x92, 0x43, 0x00, 0x85, + 0x44, 0x00, 0xf8, 0xfc, 0xfe, 0x37, 0x73, 0x01, 0x53, 0x75, 0xfe, 0xbc, 0x54, 0xfd, 0x2a, 0x4a, + 0x00, 0x05, 0xd4, 0xfe, 0x3f, 0x16, 0xfe, 0x8f, 0xd3, 0xff, 0x3d, 0xdc, 0xfe, 0x3c, 0xb2, 0xfe, + 0xb6, 0xe0, 0xfe, 0x57, 0xba, 0xfe, 0x2a, 0x25, 0x13, 0x2c, 0x03, 0x10, 0xa1, 0x3e, 0xfd, 0xb0, + 0x29, 0x0e, 0x86, 0xd8, 0x09, 0x04, 0x11, 0xfb, 0x5a, 0x12, 0xfe, 0x04, 0x51, 0x01, 0x91, 0xa7, + 0xfa, 0x90, 0xdd, 0xfa, 0x6b, 0x93, 0x07, 0xe8, 0xab, 0xfe, 0x78, 0x80, 0xfa, 0xc7, 0x43, 0x03, + 0x24, 0xab, 0x00, 0x7d, 0x01, 0xfe, 0xbd, 0x6d, 0x02, 0x90, 0x90, 0x01, 0x50, 0xed, 0xff, 0x2e, + 0x02, 0x00, 0xf6, 0x62, 0xff, 0xb1, 0x4c, 0x01, 0x1e, 0x04, 0xff, 0x10, 0xf2, 0xfd, 0xb2, 0x62, + 0x00, 0x16, 0x21, 0xff, 0xc7, 0x4c, 0xfe, 0xf9, 0x97, 0xff, 0xa2, 0xe3, 0xfe, 0xa5, 0xcf, 0xfe, + 0xbe, 0x4a, 0xff, 0xf7, 0x07, 0xff, 0x44, 0x49, 0x10, 0x49, 0x29, 0x0e, 0x0e, 0x9f, 0xfe, 0xf1, + 0xf6, 0x0c, 0x0e, 0xde, 0x09, 0x53, 0x90, 0xfc, 0xa6, 0xe5, 0xfe, 0xc3, 0xbb, 0x01, 0xcb, 0xf6, + 0xfa, 0x64, 0x2f, 0xfb, 0xc1, 0x5a, 0x06, 0x9a, 0x24, 0xff, 0xc3, 0xde, 0xfa, 0x3d, 0xb3, 0x02, + 0x41, 0x36, 0x01, 0xb5, 0x3a, 0xfe, 0x6a, 0x49, 0x02, 0x83, 0x4a, 0x01, 0xf7, 0xa8, 0xff, 0x01, + 0x5a, 0x00, 0x24, 0xf9, 0xff, 0x5c, 0x31, 0x01, 0x00, 0x13, 0xff, 0x4e, 0x81, 0xfe, 0xf2, 0x97, + 0x00, 0x5c, 0x10, 0xff, 0xc1, 0x2c, 0xfe, 0xdf, 0x53, 0xff, 0xed, 0xe4, 0xfe, 0x7b, 0x21, 0xff, + 0x61, 0xae, 0xff, 0xb6, 0x62, 0xff, 0x0f, 0x2c, 0x0e, 0x4d, 0xea, 0x0c, 0xc7, 0xf9, 0xff, 0xa4, + 0x82, 0x0b, 0xf7, 0xda, 0x08, 0x83, 0xec, 0xfd, 0x8a, 0x01, 0x00, 0x08, 0xd1, 0x01, 0x4e, 0x74, + 0xfb, 0xc2, 0x9a, 0xfb, 0xd7, 0x2b, 0x05, 0x80, 0x2f, 0xff, 0xb4, 0x7c, 0xfb, 0xb1, 0xfd, 0x02, + 0xf8, 0x4c, 0x01, 0xce, 0x74, 0xfe, 0x0c, 0x10, 0x02, 0x1d, 0xca, 0x00, 0x8f, 0x70, 0x00, 0x55, + 0xfa, 0x00, 0xca, 0xcf, 0xff, 0x9b, 0x10, 0x01, 0x73, 0x8f, 0xff, 0xe0, 0xb8, 0xfe, 0x8f, 0xff, + 0xff, 0x7f, 0xfe, 0xfe, 0x04, 0x4b, 0xfe, 0x6a, 0x5d, 0xff, 0x59, 0x5f, 0xff, 0x1a, 0x75, 0xff, + 0x9f, 0x92, 0xff, 0xb0, 0xf0, 0xfe, 0xdb, 0xf6, 0x0b, 0x43, 0xd8, 0x0b, 0xff, 0xdf, 0x00, 0x05, + 0x39, 0x0a, 0xea, 0xbd, 0x08, 0xeb, 0x6f, 0xff, 0xae, 0x1e, 0x00, 0x5e, 0x6f, 0x01, 0x5d, 0x98, + 0xfc, 0x46, 0x9e, 0xfb, 0x9f, 0xbe, 0x03, 0x37, 0xfd, 0xff, 0x73, 0x9d, 0xfc, 0xcf, 0x23, 0x02, + 0xb0, 0x27, 0x01, 0x75, 0x58, 0xff, 0x56, 0xe0, 0x01, 0x6f, 0x3b, 0x01, 0x4a, 0xe6, 0x00, 0xd2, + 0xa2, 0x00, 0x93, 0xdf, 0xff, 0x79, 0x01, 0x01, 0x80, 0x8d, 0xff, 0x5e, 0x8c, 0xfe, 0x94, 0x92, + 0xff, 0xed, 0x19, 0xff, 0x5c, 0xb6, 0xfe, 0xef, 0xb5, 0xff, 0x8b, 0x73, 0xff, 0x64, 0xe0, 0xfe, + 0x9c, 0xfa, 0xfe, 0x40, 0xd7, 0xfe, 0xfb, 0xe6, 0x09, 0x43, 0xa6, 0x0a, 0xd7, 0x1d, 0x02, 0x9b, + 0x03, 0x09, 0xf4, 0x7c, 0x08, 0x37, 0x1b, 0x01, 0x6d, 0xf6, 0xff, 0xae, 0xe6, 0x00, 0xc2, 0x9c, + 0xfd, 0x8d, 0x33, 0xfc, 0x06, 0xb6, 0x02, 0x62, 0x6b, 0x00, 0xde, 0x46, 0xfd, 0x3e, 0x9c, 0x01, + 0xf6, 0xee, 0x01, 0xc5, 0xb2, 0x00, 0xcc, 0x93, 0x01, 0x91, 0xf1, 0x00, 0xa6, 0x1d, 0x01, 0x16, + 0x8b, 0x00, 0x9e, 0xeb, 0xff, 0xb1, 0xae, 0x00, 0x54, 0x4d, 0xff, 0xd8, 0x7e, 0xfe, 0x00, 0xf0, + 0xff, 0x17, 0xa4, 0xff, 0x2c, 0xd3, 0xfe, 0x51, 0x46, 0xff, 0x83, 0xb4, 0xfe, 0x4e, 0xc3, 0xfe, + 0x1d, 0x37, 0xff, 0x7d, 0x33, 0xff, 0x73, 0x98, 0x08, 0x07, 0x02, 0x0a, 0x3e, 0x01, 0x03, 0xa8, + 0xb2, 0x07, 0x12, 0x52, 0x08, 0x2d, 0xd9, 0x01, 0x35, 0x50, 0xff, 0xc9, 0x05, 0x01, 0x44, 0xe7, + 0xfe, 0xdb, 0x76, 0xfc, 0x3a, 0x61, 0x01, 0xbb, 0x10, 0x01, 0x6d, 0x9a, 0xfe, 0x5d, 0x47, 0x02, + 0x42, 0xd5, 0x02, 0x93, 0x89, 0x00, 0x72, 0xfd, 0x00, 0x30, 0x37, 0x01, 0x72, 0xe6, 0x00, 0x60, + 0x4c, 0x00, 0x7b, 0xc2, 0xff, 0x3e, 0x47, 0x00, 0xa3, 0xce, 0xff, 0x8a, 0x4a, 0xff, 0xb1, 0xc8, + 0xff, 0x40, 0xe3, 0xfe, 0x2e, 0x5d, 0xfe, 0x07, 0x08, 0xff, 0x45, 0x19, 0xff, 0x59, 0x25, 0xff, + 0xc0, 0x57, 0xff, 0xd3, 0x40, 0xff, 0x75, 0xd0, 0x06, 0xfc, 0x49, 0x09, 0x2e, 0x17, 0x04, 0xda, + 0x6b, 0x06, 0x12, 0xfe, 0x07, 0xd8, 0xa7, 0x02, 0x76, 0xc5, 0xff, 0xd9, 0x0e, 0x01, 0xac, 0x98, + 0xfe, 0xb0, 0xe5, 0xfc, 0xb3, 0x9f, 0x01, 0x0f, 0x75, 0x02, 0xe2, 0x01, 0x00, 0x4c, 0xed, 0x01, + 0x52, 0x7a, 0x02, 0xb3, 0x70, 0x00, 0x0f, 0xf9, 0x00, 0x6f, 0x23, 0x01, 0x8d, 0x58, 0x00, 0x18, + 0x13, 0x00, 0x38, 0x3c, 0x00, 0x8c, 0xb6, 0x00, 0xca, 0xe7, 0xff, 0xf9, 0xc5, 0xfe, 0x85, 0xb5, + 0xfe, 0x6d, 0xba, 0xfe, 0x52, 0xd5, 0xfe, 0x7e, 0x3d, 0xff, 0x92, 0x4b, 0xff, 0x92, 0x34, 0xff, + 0x93, 0x18, 0xff, 0xba, 0x0b, 0xff, 0xe7, 0xe7, 0x05, 0x65, 0x26, 0x09, 0x67, 0x08, 0x04, 0x00, + 0x63, 0x05, 0x5f, 0x39, 0x08, 0xf0, 0xd5, 0x02, 0x7b, 0x25, 0xff, 0xe3, 0xe3, 0x00, 0x3d, 0x9a, + 0xff, 0x05, 0xb3, 0xfe, 0x7a, 0x7b, 0x02, 0xca, 0x68, 0x02, 0xd7, 0x46, 0x00, 0x09, 0x0b, 0x02, + 0x5f, 0x12, 0x02, 0x06, 0x41, 0x00, 0x67, 0x6f, 0x00, 0x51, 0xc9, 0x00, 0x11, 0xfb, 0x00, 0x55, + 0xa0, 0x00, 0x10, 0x24, 0x00, 0x0b, 0xda, 0xff, 0xf2, 0xd9, 0xfe, 0x10, 0x80, 0xfe, 0xb6, 0x12, + 0xff, 0x6b, 0x2b, 0xff, 0x9c, 0x04, 0xff, 0xf3, 0x29, 0xff, 0x8e, 0x05, 0xff, 0x6e, 0xfd, 0xfe, + 0x90, 0x2d, 0xff, 0xc9, 0x23, 0xff, 0x15, 0x91, 0x05, 0x32, 0x41, 0x08, 0xaa, 0x51, 0x04, 0x2a, + 0xfb, 0x05, 0x5f, 0x31, 0x06, 0x99, 0xc8, 0x01, 0x66, 0xef, 0x00, 0xb7, 0xa3, 0x02, 0xfc, 0x98, + 0x00, 0xcc, 0x3c, 0xff, 0xc2, 0x8e, 0x02, 0x1d, 0x30, 0x02, 0x0c, 0xa1, 0x00, 0xe7, 0x34, 0x02, + 0x0a, 0x39, 0x01, 0x78, 0xaa, 0xff, 0xd3, 0x17, 0x01, 0x59, 0xb7, 0x01, 0x7a, 0xb2, 0x00, 0xdd, + 0xa5, 0xff, 0xfe, 0x0d, 0xff, 0xb0, 0x73, 0xff, 0x74, 0x56, 0xff, 0xcc, 0xef, 0xfe, 0x43, 0x37, + 0xff, 0xea, 0x1f, 0xff, 0x15, 0xca, 0xfe, 0xc8, 0xe3, 0xfe, 0x86, 0x30, 0xff, 0x97, 0x15, 0xff, + 0x16, 0x3d, 0xff, 0xef, 0x4b, 0xff, 0x6a, 0xa5, 0x05, 0xcb, 0x6f, 0x07, 0x9a, 0x8a, 0x03, 0x63, + 0x77, 0x05, 0x62, 0xd0, 0x05, 0x6a, 0x76, 0x03, 0xcc, 0xdf, 0x02, 0x49, 0xb4, 0x02, 0x26, 0x48, + 0x00, 0x67, 0x67, 0xff, 0xdd, 0x02, 0x03, 0x90, 0xa6, 0x02, 0x09, 0x19, 0x00, 0xae, 0xf4, 0x00, + 0x38, 0xa7, 0x01, 0x49, 0xe5, 0x00, 0x96, 0xed, 0x00, 0x64, 0x90, 0x00, 0x8e, 0x2a, 0xff, 0xc7, + 0xf7, 0xfe, 0xf1, 0xc0, 0xff, 0x5c, 0x01, 0x00, 0x1c, 0x39, 0xff, 0xd8, 0xc6, 0xfe, 0x66, 0xf5, + 0xfe, 0x73, 0xd2, 0xfe, 0xdd, 0xc3, 0xfe, 0x3b, 0x02, 0xff, 0x42, 0x3a, 0xff, 0x27, 0x57, 0xff, + 0x16, 0x52, 0xff, 0xd6, 0x23, 0xff, 0x48, 0x88, 0x04, 0xdb, 0x95, 0x06, 0x46, 0x1f, 0x04, 0xd2, + 0x41, 0x06, 0xfe, 0x1c, 0x07, 0x71, 0xa6, 0x03, 0xc8, 0x6f, 0x02, 0x86, 0x20, 0x03, 0x80, 0x02, + 0x01, 0xe0, 0x16, 0x00, 0xac, 0x93, 0x02, 0x3a, 0xea, 0x01, 0x80, 0x51, 0x00, 0xdf, 0xec, 0x01, + 0x02, 0xbb, 0x01, 0xd4, 0xac, 0xff, 0x1f, 0x82, 0xff, 0xf9, 0xc9, 0xff, 0x32, 0xa8, 0xff, 0xb5, + 0xc9, 0xff, 0x24, 0xd9, 0xff, 0x5c, 0xa5, 0xff, 0xcb, 0xe1, 0xfe, 0x47, 0xa0, 0xfe, 0x6a, 0xe2, + 0xfe, 0x36, 0xe3, 0xfe, 0x17, 0xdb, 0xfe, 0xf9, 0x3e, 0xff, 0x23, 0x7e, 0xff, 0xac, 0x41, 0xff, + 0xc1, 0x3a, 0xff, 0xa1, 0x38, 0xff, 0x21, 0x57, 0x05, 0xe4, 0xb4, 0x08, 0x7f, 0xfb, 0x05, 0x92, + 0x71, 0x05, 0xb4, 0x29, 0x05, 0xcf, 0xa5, 0x03, 0x7d, 0xe6, 0x02, 0xcb, 0x9f, 0x02, 0xc8, 0x36, + 0x01, 0x92, 0xbd, 0x00, 0xf5, 0xe1, 0x01, 0x1e, 0x98, 0x02, 0xbd, 0x43, 0x01, 0x56, 0x8c, 0xff, + 0xaa, 0x92, 0xff, 0x24, 0x96, 0xff, 0x61, 0xef, 0xff, 0x8b, 0x36, 0x00, 0x58, 0xdf, 0xff, 0x71, + 0xa9, 0xff, 0x88, 0x39, 0xff, 0x6e, 0x1a, 0xff, 0x26, 0xe4, 0xfe, 0xc0, 0xb1, 0xfe, 0x96, 0xdb, + 0xfe, 0x84, 0x1f, 0xff, 0x97, 0x3a, 0xff, 0x68, 0x2d, 0xff, 0x7a, 0x7d, 0xff, 0x6d, 0x72, 0xff, + 0xe5, 0x3c, 0xff, 0x9d, 0x21, 0xff, 0x5e, 0x52, 0x05, 0x75, 0xc9, 0x08, 0xc9, 0x0f, 0x06, 0x9b, + 0xfe, 0x04, 0x7f, 0xe8, 0x04, 0x4a, 0x26, 0x04, 0x6e, 0x8b, 0x03, 0x30, 0x34, 0x03, 0x43, 0x0f, + 0x02, 0x37, 0xf8, 0x00, 0x1e, 0x9e, 0x01, 0x32, 0x5c, 0x02, 0xef, 0x44, 0x00, 0x37, 0x93, 0xfe, + 0x1e, 0x62, 0xff, 0xdf, 0x12, 0x00, 0x14, 0x5f, 0x00, 0x50, 0x46, 0x00, 0xe4, 0xa8, 0xff, 0x77, + 0x38, 0xff, 0xc0, 0x40, 0xff, 0x4b, 0x4e, 0xff, 0xa7, 0xde, 0xfe, 0xbf, 0xc5, 0xfe, 0x64, 0x0c, + 0xff, 0x9e, 0x25, 0xff, 0x99, 0x21, 0xff, 0x72, 0x4b, 0xff, 0x64, 0x8c, 0xff, 0x9d, 0x79, 0xff, + 0xe5, 0x57, 0xff, 0x7f, 0x25, 0xff, 0x23, 0x1c, 0x05, 0x9f, 0xa0, 0x07, 0x46, 0x86, 0x04, 0x7f, + 0x71, 0x04, 0x9a, 0x9a, 0x04, 0x68, 0x42, 0x04, 0xaa, 0x7a, 0x04, 0x87, 0x2a, 0x05, 0xb1, 0x96, + 0x03, 0x43, 0xb8, 0x01, 0x32, 0x5b, 0x01, 0x38, 0x6b, 0x00, 0xdf, 0x4f, 0x00, 0xba, 0xb4, 0xff, + 0x17, 0x32, 0xff, 0x58, 0xdd, 0xff, 0xa5, 0x79, 0x00, 0x04, 0x11, 0x00, 0xda, 0x72, 0xff, 0x4a, + 0x81, 0xff, 0x57, 0x59, 0xff, 0x6a, 0x3a, 0xff, 0xf4, 0x03, 0xff, 0x9d, 0xe8, 0xfe, 0xe1, 0x1e, + 0xff, 0x1b, 0x24, 0xff, 0x9f, 0xfd, 0xfe, 0x08, 0x48, 0xff, 0xc7, 0x92, 0xff, 0xe1, 0x70, 0xff, + 0x9d, 0x64, 0xff, 0x77, 0x42, 0xff, 0x4a, 0x88, 0x05, 0xe2, 0xf2, 0x07, 0x14, 0x05, 0x04, 0x72, + 0xa4, 0x03, 0xb7, 0x5c, 0x03, 0x95, 0x51, 0x03, 0xbd, 0xec, 0x04, 0xef, 0x73, 0x05, 0x3c, 0x8b, + 0x03, 0xd6, 0xfd, 0x01, 0x76, 0x6e, 0x01, 0x38, 0x6b, 0x01, 0x9c, 0xbc, 0x01, 0x75, 0xf2, 0xff, + 0xe9, 0x57, 0xff, 0xb4, 0xb0, 0xff, 0xae, 0x8e, 0xff, 0xd8, 0x01, 0x00, 0x19, 0xd6, 0xff, 0x80, + 0x49, 0xff, 0xbb, 0xf3, 0xfe, 0x9c, 0x53, 0xff, 0x03, 0x57, 0xff, 0xb4, 0x05, 0xff, 0x04, 0x46, + 0xff, 0x00, 0x6e, 0xff, 0x07, 0x4f, 0xff, 0x08, 0x3a, 0xff, 0xcb, 0x58, 0xff, 0x73, 0x71, 0xff, + 0x26, 0x45, 0xff, 0x3d, 0x2b, 0xff, 0xa6, 0xce, 0x05, 0x1d, 0xb3, 0x07, 0xe0, 0xf4, 0x02, 0x4b, + 0x20, 0x03, 0x1e, 0x81, 0x03, 0x51, 0x85, 0x02, 0xbb, 0x7c, 0x02, 0xc8, 0xd2, 0x03, 0xa1, 0x65, + 0x04, 0x25, 0x92, 0x03, 0xe3, 0xe8, 0x02, 0x69, 0x2d, 0x02, 0x5b, 0xcf, 0x01, 0x13, 0x50, 0x02, + 0xe5, 0x90, 0x00, 0x43, 0x29, 0xfe, 0x9a, 0x1d, 0xff, 0xa2, 0xac, 0xff, 0x9e, 0xd9, 0xff, 0x27, + 0xc9, 0xff, 0x45, 0x2b, 0xff, 0x45, 0x35, 0xff, 0x41, 0x54, 0xff, 0xdf, 0x4d, 0xff, 0x90, 0x5e, + 0xff, 0xc7, 0x77, 0xff, 0x0e, 0x3f, 0xff, 0xaa, 0x7d, 0xff, 0xf0, 0x40, 0xff, 0x9b, 0x26, 0xff, + 0xcd, 0x77, 0xff, 0x96, 0x21, 0xff, 0x33, 0x74, 0x05, 0xcf, 0x75, 0x07, 0x88, 0xf2, 0x02, 0x7e, + 0xee, 0x02, 0x50, 0xaa, 0x03, 0x42, 0x33, 0x03, 0xfb, 0x1f, 0x02, 0xd1, 0x01, 0x01, 0x3c, 0xa0, + 0x01, 0xfc, 0x6c, 0x03, 0xad, 0x14, 0x04, 0x85, 0xfb, 0x02, 0xea, 0x2b, 0x02, 0xc0, 0x58, 0x02, + 0x47, 0xec, 0x02, 0x86, 0x3a, 0x01, 0x97, 0xb9, 0xfe, 0x09, 0xad, 0xfe, 0xa4, 0x51, 0xff, 0x18, + 0xa1, 0xff, 0xcb, 0xdd, 0xff, 0x59, 0x98, 0xff, 0xd5, 0x06, 0xff, 0x66, 0x43, 0xff, 0x20, 0x98, + 0xff, 0xdc, 0x3b, 0xff, 0xbd, 0x4e, 0xff, 0xf7, 0xa1, 0xff, 0x8e, 0x58, 0xff, 0x9b, 0x26, 0xff, + 0xd1, 0x31, 0xff, 0xdc, 0x4a, 0xff, 0x41, 0xe8, 0x05, 0x95, 0x7c, 0x07, 0xb0, 0xe0, 0x01, 0x7f, + 0x22, 0x02, 0x26, 0x62, 0x03, 0xf1, 0x0b, 0x03, 0x39, 0x45, 0x02, 0x82, 0xbf, 0x00, 0x66, 0x0b, + 0x00, 0x20, 0xd1, 0x01, 0xc2, 0xf7, 0x02, 0x36, 0x78, 0x02, 0xf5, 0x29, 0x03, 0xa7, 0xaf, 0x03, + 0x25, 0xb0, 0x03, 0xb3, 0xb0, 0x02, 0x75, 0x5e, 0x01, 0xfe, 0x54, 0x00, 0x46, 0x05, 0xff, 0x15, + 0x70, 0xfe, 0x52, 0x28, 0xff, 0xb0, 0xb1, 0xff, 0xc0, 0x70, 0xff, 0xaa, 0x3e, 0xff, 0x11, 0x38, + 0xff, 0x48, 0x41, 0xff, 0x27, 0x5d, 0xff, 0x87, 0xc8, 0xff, 0x24, 0x7d, 0xff, 0xc6, 0x3f, 0xff, + 0xdb, 0x64, 0xff, 0xc3, 0x44, 0xff, 0xde, 0x9a, 0x06, 0x92, 0x2f, 0x08, 0x7e, 0xe9, 0x01, 0x51, + 0xb5, 0x02, 0x07, 0xb1, 0x03, 0x71, 0x93, 0x02, 0xd1, 0xaf, 0x01, 0x67, 0xae, 0xff, 0x6d, 0x0c, + 0x00, 0xb3, 0xa0, 0x02, 0xaa, 0x88, 0x01, 0xb9, 0x37, 0x00, 0x30, 0x93, 0x01, 0xb8, 0x7f, 0x02, + 0xa0, 0xee, 0x03, 0xe3, 0x5e, 0x03, 0xc1, 0x4c, 0x02, 0x7e, 0x77, 0x02, 0x43, 0x2e, 0x01, 0xb0, + 0x74, 0xff, 0xee, 0xae, 0xfe, 0xd6, 0x7f, 0xfe, 0x55, 0xe5, 0xfe, 0x7a, 0xae, 0xff, 0x57, 0xa0, + 0xff, 0xd8, 0x22, 0xff, 0x08, 0x2c, 0xff, 0x38, 0xaf, 0xff, 0x13, 0x8c, 0xff, 0xca, 0x5a, 0xff, + 0xb7, 0x88, 0xff, 0xff, 0x3e, 0xff, 0x88, 0x5b, 0x07, 0x93, 0x78, 0x08, 0xe2, 0xa7, 0x01, 0x94, + 0xaf, 0x03, 0x49, 0xd2, 0x04, 0xf3, 0x25, 0x03, 0x3f, 0xc8, 0x00, 0xf1, 0x8d, 0xfd, 0xa9, 0xb5, + 0xff, 0xe1, 0xac, 0x03, 0x55, 0x6d, 0x01, 0xf6, 0x74, 0xff, 0x80, 0x2a, 0x00, 0x04, 0x00, 0x01, + 0x65, 0x92, 0x02, 0x79, 0xb8, 0x01, 0x05, 0x50, 0x02, 0xde, 0x5a, 0x03, 0xd4, 0x4f, 0x02, 0x56, + 0x81, 0x01, 0x19, 0x75, 0x00, 0x2b, 0x41, 0xff, 0xd8, 0x37, 0xfe, 0x4f, 0x87, 0xfe, 0xcb, 0x49, + 0xff, 0x82, 0x7b, 0xff, 0x90, 0x8b, 0xff, 0x23, 0x78, 0xff, 0x37, 0x44, 0xff, 0xc9, 0x5b, 0xff, + 0x05, 0x9a, 0xff, 0x5a, 0x4f, 0xff, 0x46, 0xe2, 0x08, 0x2e, 0x83, 0x0a, 0xc6, 0xa6, 0x01, 0xae, + 0x0c, 0x03, 0x27, 0x52, 0x04, 0x5a, 0x34, 0x03, 0xb9, 0x00, 0x01, 0x13, 0xdc, 0xfc, 0x7e, 0x89, + 0xff, 0xf8, 0x89, 0x03, 0x70, 0xbe, 0x00, 0xc9, 0x2b, 0xff, 0x48, 0x2e, 0x00, 0x2b, 0x86, 0x00, + 0x55, 0x5c, 0x01, 0x1d, 0xf0, 0x00, 0xb2, 0x15, 0x01, 0xeb, 0x2a, 0x02, 0xb1, 0x7e, 0x02, 0x16, + 0x01, 0x02, 0x3f, 0x36, 0x01, 0x43, 0xd2, 0x00, 0xc4, 0x03, 0x00, 0x93, 0x0d, 0xff, 0x6d, 0x71, + 0xfe, 0x1e, 0xbb, 0xfe, 0x33, 0x56, 0xff, 0xa3, 0xe2, 0xff, 0x48, 0xb8, 0xff, 0x38, 0x19, 0xff, + 0x41, 0x2e, 0xff, 0x71, 0x6e, 0xff, 0x4a, 0x3b, 0x0a, 0x89, 0x9e, 0x0b, 0xd5, 0x58, 0x01, 0xb8, + 0xa8, 0x03, 0x89, 0x42, 0x05, 0xed, 0xdb, 0x02, 0xe0, 0xb5, 0xff, 0xce, 0xab, 0xfb, 0xc4, 0x88, + 0x00, 0xa0, 0x6e, 0x04, 0xd8, 0x8d, 0xff, 0x68, 0x61, 0xfe, 0x59, 0xb8, 0xff, 0x1a, 0x82, 0x00, + 0x64, 0xb1, 0x01, 0xbd, 0x1a, 0x00, 0xc6, 0x07, 0x00, 0x72, 0x61, 0x01, 0xf7, 0xf4, 0x00, 0x97, + 0x17, 0x01, 0x9c, 0xba, 0x01, 0x5e, 0x66, 0x01, 0x1e, 0xff, 0x00, 0x8f, 0x9d, 0x00, 0xd0, 0x98, + 0xff, 0x7c, 0xee, 0xfe, 0xa7, 0x95, 0xfe, 0xd9, 0x67, 0xff, 0xb1, 0x9f, 0xff, 0x11, 0x50, 0xff, + 0x24, 0x6b, 0xff, 0x93, 0x09, 0xff, 0x40, 0xb3, 0x0b, 0xe4, 0xbb, 0x0c, 0x3e, 0x06, 0x01, 0x5d, + 0x61, 0x04, 0xda, 0x28, 0x06, 0x37, 0xb8, 0x02, 0x1e, 0x2d, 0xfe, 0x78, 0x94, 0xfa, 0x59, 0xbc, + 0x01, 0xc6, 0xad, 0x04, 0x08, 0xbe, 0xfe, 0x7a, 0x61, 0xfe, 0x54, 0x2b, 0xff, 0x16, 0x1e, 0x00, + 0x3e, 0xc0, 0x01, 0xb5, 0xd1, 0xff, 0xa3, 0xf3, 0xff, 0xda, 0xbf, 0x00, 0x16, 0x15, 0x00, 0x47, + 0x77, 0x00, 0x25, 0x45, 0x00, 0x19, 0xef, 0x00, 0x6b, 0x7d, 0x01, 0x68, 0xcf, 0x00, 0x99, 0xce, + 0x00, 0x0e, 0x8c, 0x00, 0xc4, 0x67, 0xff, 0x68, 0x5d, 0xff, 0xf3, 0x18, 0xff, 0x64, 0xf9, 0xfe, + 0x29, 0x4b, 0xff, 0x33, 0x45, 0xff, 0x47, 0xc5, 0x0d, 0x1f, 0xd7, 0x0e, 0x26, 0xae, 0x00, 0x27, + 0x04, 0x04, 0x7e, 0x18, 0x06, 0x62, 0x53, 0x02, 0xd3, 0x3c, 0xfd, 0xdc, 0x6b, 0xfa, 0x64, 0xd5, + 0x02, 0xd6, 0x27, 0x04, 0xd2, 0xa5, 0xfd, 0x21, 0x9a, 0xfe, 0x33, 0x22, 0xff, 0xe7, 0xfd, 0xff, + 0xa7, 0x9f, 0x01, 0xcb, 0x4c, 0xff, 0x50, 0xda, 0xff, 0xa5, 0xb9, 0x00, 0x00, 0x9b, 0xff, 0x7e, + 0xd2, 0xff, 0x80, 0xd1, 0xff, 0x4f, 0x38, 0x00, 0x6d, 0x64, 0x00, 0x52, 0x80, 0x00, 0x48, 0x06, + 0x01, 0xcb, 0xec, 0x00, 0x13, 0x9c, 0x00, 0x74, 0xb7, 0x00, 0x66, 0x82, 0xff, 0x34, 0xc1, 0xfe, + 0x95, 0x14, 0xff, 0xdd, 0xc6, 0xfe, 0x20, 0x27, 0x0f, 0x0f, 0xdd, 0x0f, 0x66, 0x79, 0x00, 0xc0, + 0x71, 0x05, 0x32, 0x65, 0x07, 0xa6, 0x25, 0x01, 0xed, 0xbe, 0xfa, 0xe6, 0x5b, 0xfa, 0x7c, 0xcc, + 0x04, 0x9d, 0xb6, 0x03, 0x3f, 0xa9, 0xfc, 0x40, 0xa4, 0xfe, 0x0a, 0xd0, 0xfe, 0xda, 0x18, 0x00, + 0x2c, 0x8a, 0x01, 0x54, 0xb9, 0xfe, 0xd3, 0xe4, 0xff, 0xdd, 0xb4, 0x00, 0x8f, 0x15, 0xff, 0x67, + 0xc9, 0xff, 0x46, 0x4f, 0xff, 0x38, 0x9f, 0xff, 0x6e, 0x62, 0x00, 0x26, 0x68, 0xff, 0x92, 0x06, + 0x00, 0x97, 0xf9, 0x00, 0x9e, 0x9f, 0x00, 0x2e, 0x56, 0x01, 0x29, 0xcf, 0x00, 0x1a, 0xaf, 0xff, + 0x37, 0x46, 0xff, 0x9d, 0xa7, 0xfe, 0x2f, 0xb9, 0x10, 0xce, 0xce, 0x11, 0xe0, 0x63, 0x00, 0x13, + 0xad, 0x05, 0x31, 0x0a, 0x08, 0x63, 0x47, 0x00, 0x39, 0xe2, 0xf8, 0xef, 0xbd, 0xfa, 0x70, 0x70, + 0x06, 0xcd, 0x9a, 0x02, 0x3b, 0xbe, 0xfb, 0x9e, 0x02, 0xff, 0x77, 0xa9, 0xfe, 0xfe, 0x4b, 0x00, + 0x27, 0x8d, 0x01, 0x91, 0x2a, 0xfe, 0x74, 0xaf, 0xff, 0x5c, 0xa8, 0x00, 0x25, 0xc6, 0xfe, 0xb2, + 0xc4, 0xff, 0xc9, 0x24, 0xff, 0x25, 0x59, 0xff, 0x24, 0x02, 0x00, 0xb1, 0xd6, 0xfe, 0xf6, 0xd5, + 0xff, 0x22, 0x49, 0x00, 0x6b, 0x0f, 0x00, 0x38, 0x2e, 0x01, 0xdb, 0xc4, 0x00, 0x80, 0x54, 0x00, + 0x6b, 0x5e, 0x00, 0x8d, 0x53, 0xff, 0xa6, 0xdd, 0x11, 0x58, 0xe5, 0x13, 0x83, 0xba, 0x00, 0xf5, + 0x9e, 0x05, 0xe0, 0xb0, 0x08, 0x1b, 0x7f, 0xff, 0x30, 0xf6, 0xf6, 0x49, 0x1b, 0xfb, 0x09, 0x01, + 0x08, 0x80, 0x8a, 0x01, 0x31, 0x9e, 0xfa, 0xbc, 0x60, 0xff, 0x82, 0x8c, 0xfe, 0xa7, 0x58, 0x00, + 0xd6, 0x9e, 0x01, 0x61, 0xd0, 0xfd, 0xb7, 0x82, 0xff, 0xc3, 0x82, 0x00, 0xf5, 0x64, 0xfe, 0x13, + 0x87, 0xff, 0x27, 0xea, 0xfe, 0xb9, 0x29, 0xff, 0xe5, 0x22, 0x00, 0xf2, 0x5e, 0xfe, 0x7d, 0x31, + 0xff, 0x62, 0x25, 0x00, 0xc8, 0xc5, 0xff, 0x1b, 0x8c, 0x00, 0x52, 0x58, 0x00, 0x25, 0xef, 0xff, + 0x5f, 0x64, 0x00, 0x5e, 0x44, 0x00, 0x33, 0xe6, 0x12, 0x79, 0x72, 0x16, 0xfb, 0x6d, 0x01, 0xa2, + 0x9f, 0x04, 0x9d, 0xfa, 0x08, 0x91, 0x1e, 0xff, 0x39, 0x9d, 0xf5, 0xf0, 0x6e, 0xfb, 0xe6, 0xc2, + 0x08, 0x6f, 0xef, 0x00, 0xf2, 0xaf, 0xf9, 0x74, 0x40, 0xff, 0x02, 0xbd, 0xfe, 0x22, 0x2f, 0x00, + 0x33, 0xc5, 0x01, 0x93, 0xb6, 0xfd, 0xed, 0x2b, 0xff, 0xff, 0x76, 0x00, 0x93, 0x36, 0xfe, 0x35, + 0x2f, 0xff, 0xf0, 0x9d, 0xfe, 0xcd, 0xe4, 0xfe, 0x8e, 0xe9, 0xff, 0xd5, 0x5d, 0xfe, 0x39, 0x04, + 0xff, 0x7a, 0xb5, 0xff, 0x28, 0x82, 0xff, 0x90, 0x70, 0x00, 0x7a, 0xfa, 0xff, 0x12, 0x85, 0xff, + 0xf2, 0xde, 0xff, 0x87, 0x5a, 0xff, 0x51, 0x66, 0x13, 0x84, 0xc4, 0x18, 0xe8, 0xa2, 0x02, 0xe8, + 0x11, 0x04, 0xc4, 0x1f, 0x09, 0x3e, 0xae, 0xfe, 0x64, 0x96, 0xf4, 0x15, 0x93, 0xfb, 0xae, 0x4e, + 0x09, 0x0a, 0x9c, 0x00, 0xfb, 0x0f, 0xf9, 0x3f, 0xbf, 0xfe, 0x22, 0xdb, 0xfe, 0x2f, 0x22, 0x00, + 0xb4, 0xca, 0x01, 0x90, 0xed, 0xfd, 0xa3, 0x9f, 0xfe, 0x39, 0x60, 0x00, 0xa4, 0x62, 0xfe, 0x0a, + 0xfd, 0xfe, 0xeb, 0x49, 0xfe, 0xb3, 0x6a, 0xfe, 0x34, 0xae, 0xff, 0x83, 0x3a, 0xfe, 0xb2, 0xe6, + 0xfe, 0xab, 0x91, 0xff, 0xcd, 0x60, 0xff, 0xbe, 0x25, 0x00, 0xa7, 0x40, 0x00, 0x8b, 0xef, 0xfe, + 0x50, 0xc0, 0xfe, 0x62, 0x94, 0xff, 0x16, 0x80, 0x13, 0xe0, 0xce, 0x1a, 0x5d, 0x54, 0x04, 0xcb, + 0xc8, 0x03, 0x56, 0x0d, 0x09, 0x29, 0x53, 0xfe, 0xce, 0x35, 0xf4, 0xd2, 0x3a, 0xfb, 0x45, 0x76, + 0x09, 0xf8, 0xc9, 0x00, 0x54, 0x6a, 0xf8, 0x1a, 0x71, 0xfe, 0x32, 0xbf, 0xfe, 0x3a, 0xdf, 0xff, + 0xa9, 0xf0, 0x01, 0xd7, 0x1a, 0xfe, 0xd6, 0x27, 0xfe, 0x64, 0x3f, 0x00, 0x94, 0x8a, 0xfe, 0x8e, + 0xdd, 0xfe, 0x88, 0x39, 0xfe, 0xd9, 0xf2, 0xfd, 0x38, 0x6d, 0xff, 0x76, 0xf9, 0xfd, 0x2e, 0x8b, + 0xfe, 0x66, 0x5f, 0xff, 0xbd, 0x82, 0xff, 0x80, 0x88, 0x00, 0x17, 0x1d, 0xff, 0xa5, 0xa7, 0xfe, + 0x64, 0x22, 0xff, 0x07, 0xf2, 0xfe, 0xdf, 0x33, 0x14, 0x4a, 0xe3, 0x1c, 0xb4, 0xd8, 0x05, 0x14, + 0xd3, 0x02, 0xa6, 0x2e, 0x08, 0xa8, 0x8c, 0xfe, 0x4e, 0xe9, 0xf4, 0xaf, 0xa3, 0xfa, 0x2c, 0x45, + 0x08, 0x76, 0x58, 0x01, 0xab, 0x57, 0xf8, 0x0c, 0xdf, 0xfd, 0x2c, 0x03, 0xff, 0xb0, 0x4b, 0xff, + 0xf8, 0x8c, 0x01, 0x8c, 0xcc, 0xfe, 0xe1, 0xc0, 0xfd, 0xd0, 0xa4, 0xff, 0x8b, 0xe3, 0xfe, 0x2d, + 0xc5, 0xfe, 0x88, 0xef, 0xfd, 0x84, 0xe2, 0xfd, 0xb4, 0x4b, 0xff, 0x00, 0xb2, 0xfd, 0xe9, 0xe0, + 0xfd, 0x0f, 0x97, 0xff, 0x7a, 0x6e, 0xff, 0x9f, 0x60, 0xff, 0xba, 0xa1, 0xff, 0xe6, 0xc9, 0xfe, + 0xab, 0x6e, 0xfe, 0xfa, 0x11, 0xff, 0xbb, 0xad, 0x14, 0xca, 0xc7, 0x1d, 0xe7, 0x28, 0x08, 0x76, + 0xb2, 0x02, 0x16, 0xa8, 0x06, 0x67, 0x64, 0x00, 0xd3, 0xb2, 0xf5, 0xa8, 0x26, 0xf9, 0x9a, 0x66, + 0x07, 0x7e, 0xfa, 0x01, 0x97, 0xe9, 0xf8, 0x16, 0xb4, 0xfd, 0xa2, 0x7b, 0xfe, 0x4b, 0x00, 0xff, + 0x30, 0x64, 0x01, 0xf3, 0x18, 0xff, 0x5f, 0x1f, 0xfe, 0xa7, 0xd2, 0xfe, 0xb1, 0x6b, 0xfe, 0xf7, + 0x3b, 0xff, 0x59, 0x69, 0xfe, 0x0c, 0x84, 0xfd, 0xde, 0xce, 0xfe, 0x45, 0x11, 0xfe, 0x9b, 0x5b, + 0xfe, 0x50, 0x99, 0xfe, 0x5d, 0x5e, 0xfe, 0xd6, 0x19, 0x00, 0x61, 0x51, 0xff, 0x2e, 0xaa, 0xfe, + 0xae, 0xce, 0xfe, 0xef, 0xc7, 0xfe, 0x7f, 0x2b, 0x16, 0xb2, 0xf2, 0x1c, 0xd3, 0xca, 0x08, 0x17, + 0x51, 0x05, 0x59, 0xf0, 0x05, 0xff, 0xce, 0x00, 0x3c, 0x92, 0xf5, 0x0f, 0xb8, 0xf8, 0x63, 0xa4, + 0x06, 0x6d, 0xa4, 0x01, 0x66, 0x22, 0xfa, 0x9a, 0x42, 0xfd, 0xda, 0xd4, 0xfd, 0x79, 0x33, 0xff, + 0xcc, 0x2a, 0x01, 0x92, 0xef, 0xfe, 0x0e, 0x72, 0xfe, 0xaf, 0x16, 0xfe, 0xa7, 0xfd, 0xfd, 0xd3, + 0xc2, 0xff, 0xb7, 0x29, 0xfe, 0xdf, 0x47, 0xfd, 0x20, 0xad, 0xfe, 0x30, 0xbb, 0xfe, 0xa7, 0xf4, + 0xfd, 0x77, 0xdc, 0xfd, 0x09, 0x77, 0xfe, 0x0d, 0x53, 0xff, 0x35, 0x79, 0xff, 0x5e, 0xd8, 0xfe, + 0x8e, 0x96, 0xfe, 0x86, 0xb7, 0xfe, 0x41, 0xee, 0x17, 0x4e, 0x18, 0x1b, 0x9d, 0x96, 0x08, 0x9c, + 0x87, 0x09, 0x84, 0xa7, 0x05, 0xf0, 0xda, 0x00, 0x71, 0x65, 0xf5, 0x94, 0xd7, 0xf8, 0x69, 0x0c, + 0x06, 0x1c, 0xd2, 0xff, 0x6f, 0x03, 0xfc, 0x8c, 0xb0, 0xfd, 0x35, 0xb1, 0xfc, 0x74, 0x9d, 0xff, + 0x78, 0xd4, 0x00, 0xe6, 0x6a, 0xfe, 0x8c, 0x15, 0xff, 0x76, 0xc3, 0xfd, 0xdb, 0x71, 0xfd, 0x68, + 0xcd, 0xff, 0x88, 0x67, 0xfd, 0x81, 0x01, 0xfe, 0xf1, 0xdc, 0xfe, 0x64, 0x85, 0xfd, 0x9d, 0xbf, + 0xfe, 0x97, 0xf4, 0xfd, 0x62, 0x8d, 0xfd, 0x3e, 0x86, 0xff, 0x0a, 0x5d, 0xff, 0x7f, 0xaa, 0xfe, + 0xf1, 0x9f, 0xfe, 0x2a, 0xd8, 0xfe, 0x5c, 0x4d, 0x1a, 0x46, 0x29, 0x18, 0x29, 0x12, 0x06, 0x15, + 0xf7, 0x0f, 0xd4, 0x82, 0x07, 0x17, 0x3c, 0xfe, 0xaf, 0x73, 0xf5, 0xc8, 0xd8, 0xfa, 0x29, 0x51, + 0x04, 0xa9, 0xb7, 0xfc, 0x22, 0xcb, 0xfe, 0x52, 0xad, 0xfe, 0x04, 0x13, 0xfb, 0x5d, 0xd2, 0xff, + 0x99, 0x76, 0x00, 0x9b, 0x3f, 0xfe, 0x6c, 0x9e, 0xff, 0x45, 0x55, 0xfd, 0xc1, 0xc1, 0xfc, 0x94, + 0xa3, 0xff, 0x10, 0x71, 0xfd, 0xde, 0xeb, 0xfd, 0xb3, 0xad, 0xfd, 0x68, 0x05, 0xfe, 0x32, 0x33, + 0xff, 0xd2, 0x93, 0xfd, 0x2e, 0xd1, 0xfd, 0x9a, 0xf1, 0xfe, 0x3e, 0x51, 0xff, 0x70, 0x00, 0xff, + 0x33, 0x09, 0xff, 0xf7, 0x51, 0xfe, 0xf9, 0xb4, 0x1d, 0x97, 0xb3, 0x17, 0x17, 0xe7, 0x01, 0xcb, + 0x8f, 0x13, 0x3b, 0x54, 0x09, 0xe6, 0x40, 0xfb, 0x86, 0x27, 0xf7, 0xd0, 0xbb, 0xfe, 0x7c, 0xc3, + 0x01, 0x43, 0x91, 0xf7, 0xad, 0x42, 0x01, 0x16, 0xae, 0x01, 0x0f, 0xcc, 0xf9, 0xfc, 0x85, 0xff, + 0x25, 0xe6, 0xff, 0x8a, 0x0d, 0xfe, 0x07, 0xab, 0x00, 0xdb, 0xcc, 0xfc, 0x23, 0xd9, 0xfb, 0x89, + 0x9f, 0x00, 0x88, 0x0b, 0xfc, 0x15, 0x06, 0xfd, 0x38, 0x02, 0xff, 0xdd, 0xe0, 0xfc, 0x73, 0x86, + 0xff, 0x90, 0x09, 0xfe, 0xde, 0xbb, 0xfd, 0xc7, 0x21, 0xff, 0x3f, 0x38, 0xff, 0xfc, 0x80, 0xff, + 0x51, 0xeb, 0xfe, 0xac, 0xa5, 0xfd, 0xd3, 0x21, 0x21, 0xb9, 0x40, 0x18, 0x84, 0xc2, 0xfc, 0x21, + 0x7f, 0x15, 0xc4, 0x86, 0x0c, 0x40, 0x27, 0xf8, 0x7e, 0xc3, 0xf7, 0xb9, 0xcc, 0x03, 0x10, 0x97, + 0x00, 0x56, 0x00, 0xf1, 0x4c, 0xa9, 0x01, 0x2e, 0x32, 0x06, 0xae, 0x70, 0xf9, 0xa4, 0x99, 0xfe, + 0xfa, 0x59, 0xff, 0xb3, 0x4a, 0xfd, 0x1c, 0xbd, 0x01, 0xb8, 0xb1, 0xfc, 0xb2, 0xc0, 0xfb, 0xec, + 0xb9, 0xff, 0x6e, 0xdb, 0xfa, 0xb0, 0x7a, 0xfd, 0x68, 0x94, 0xfe, 0x08, 0xb5, 0xfc, 0xe5, 0xd7, + 0xff, 0x37, 0xdc, 0xfd, 0x54, 0xe3, 0xfd, 0xa7, 0xf9, 0xff, 0x66, 0x5a, 0xff, 0x08, 0xa1, 0xfe, + 0x4a, 0xf8, 0xfe, 0x5f, 0x6f, 0xfe, 0x5f, 0x40, 0x24, 0x78, 0xd0, 0x19, 0x28, 0x76, 0xf7, 0xd9, + 0x8d, 0x15, 0x28, 0xc3, 0x10, 0x76, 0xf7, 0xf5, 0x5b, 0x57, 0xf7, 0x0e, 0xfc, 0x08, 0x27, 0x54, + 0x01, 0x49, 0xd2, 0xea, 0xc9, 0x40, 0xff, 0x7f, 0xd6, 0x0a, 0x1f, 0x40, 0xfb, 0x75, 0x3d, 0xfd, + 0xc9, 0xd6, 0xfe, 0xdf, 0x36, 0xfc, 0x93, 0x60, 0x02, 0x3d, 0x0d, 0xfe, 0x93, 0x3e, 0xfa, 0x1e, + 0x47, 0xff, 0xb7, 0x03, 0xfb, 0x58, 0xda, 0xfb, 0x6b, 0x59, 0xff, 0xd9, 0xf0, 0xfc, 0x3b, 0x65, + 0xff, 0xb7, 0x24, 0xfe, 0x8d, 0x13, 0xfe, 0xd7, 0xdc, 0x00, 0x0d, 0x1d, 0xff, 0x55, 0xed, 0xfd, + 0x85, 0x9b, 0xff, 0xe1, 0xdb, 0xfe, 0xd5, 0x2a, 0x28, 0xce, 0x74, 0x1c, 0xaf, 0x40, 0xf1, 0x52, + 0x70, 0x12, 0xba, 0xa3, 0x15, 0x71, 0x6e, 0xf6, 0x0a, 0x46, 0xf5, 0x3a, 0x24, 0x0c, 0x1c, 0x43, + 0x03, 0xec, 0xec, 0xe6, 0x83, 0x08, 0xfb, 0xea, 0x63, 0x0d, 0xa4, 0xac, 0xfe, 0xd9, 0x87, 0xfc, + 0xef, 0xbe, 0xfd, 0xfc, 0xfe, 0xfa, 0x10, 0x7b, 0x03, 0x50, 0xe2, 0xfd, 0x05, 0xe3, 0xf8, 0x87, + 0x29, 0x00, 0xd3, 0x0f, 0xfa, 0x11, 0xc5, 0xfa, 0x31, 0x7d, 0xff, 0x73, 0x49, 0xfd, 0xe8, 0x89, + 0xff, 0x87, 0x03, 0xfe, 0xb2, 0x31, 0xfe, 0x40, 0x0a, 0x01, 0x6a, 0x21, 0xff, 0xe5, 0xe7, 0xfd, + 0xa9, 0xb3, 0xff, 0x3f, 0xce, 0xfe, 0xaa, 0x66, 0x2c, 0x7d, 0xcb, 0x1e, 0x03, 0xae, 0xeb, 0xb1, + 0x0a, 0x0f, 0x5a, 0x0a, 0x19, 0x52, 0x0e, 0xf8, 0x6c, 0x91, 0xf3, 0xaa, 0x0c, 0x0f, 0x0d, 0x29, + 0x05, 0x4c, 0x38, 0xe4, 0xd1, 0xaa, 0xf6, 0xd1, 0x19, 0x0e, 0x5a, 0xff, 0x02, 0x97, 0x14, 0xfd, + 0x8b, 0xda, 0xfb, 0x65, 0x64, 0xfa, 0x26, 0x0d, 0x04, 0x40, 0x2e, 0xfd, 0xe2, 0xdc, 0xf8, 0xab, + 0xee, 0xff, 0xc1, 0x1b, 0xfa, 0x7c, 0xfe, 0xf9, 0x0d, 0xea, 0xfe, 0xb8, 0x19, 0xfe, 0xfb, 0xc1, + 0xff, 0xff, 0x11, 0xfe, 0x89, 0xcc, 0xfd, 0x3b, 0x19, 0x01, 0x75, 0x59, 0xff, 0x30, 0x41, 0xfe, + 0xae, 0x72, 0xff, 0x47, 0xdd, 0xfe, 0x96, 0x7d, 0x32, 0x96, 0xb6, 0x1f, 0x26, 0xe5, 0xe5, 0x55, + 0xf3, 0x0b, 0xd6, 0xcf, 0x1a, 0x49, 0xc2, 0xfa, 0x9b, 0x8e, 0xf2, 0x9d, 0x23, 0x11, 0x09, 0x1c, + 0x06, 0x08, 0xbf, 0xe2, 0xb8, 0x88, 0xf3, 0xfe, 0x41, 0x0d, 0x74, 0x01, 0x07, 0xd5, 0x6c, 0xfe, + 0x94, 0x2b, 0xfa, 0xda, 0x7a, 0xf9, 0xf8, 0xbb, 0x04, 0xb5, 0x86, 0xfc, 0x02, 0x78, 0xf8, 0x86, + 0x3a, 0x00, 0xc0, 0xd0, 0xf9, 0x9f, 0xe5, 0xf9, 0x1a, 0xae, 0xfe, 0xae, 0x5a, 0xfe, 0x2b, 0x15, + 0x00, 0xbd, 0x33, 0xfe, 0xb8, 0x2b, 0xfd, 0x6f, 0x37, 0x01, 0x8e, 0xdc, 0xff, 0xd3, 0x33, 0xfe, + 0x50, 0x55, 0xff, 0xb0, 0xd2, 0xfe, 0x62, 0x4b, 0x39, 0x66, 0xa8, 0x20, 0x0f, 0x26, 0xdf, 0x10, + 0x73, 0x08, 0x50, 0xc3, 0x1b, 0x22, 0xa8, 0xfe, 0xae, 0x00, 0xf2, 0xeb, 0x19, 0x11, 0xfd, 0xa6, + 0x06, 0x29, 0xa0, 0xe2, 0x6a, 0x69, 0xf1, 0x52, 0x2b, 0x0b, 0xd3, 0xa7, 0x09, 0x9e, 0x83, 0x00, + 0x33, 0x0b, 0xf9, 0x45, 0xcf, 0xf7, 0x9f, 0xa2, 0x05, 0xb4, 0xc9, 0xfb, 0x88, 0xbe, 0xf7, 0x90, + 0xad, 0x00, 0x0e, 0x4a, 0xf9, 0x8a, 0x78, 0xfa, 0x77, 0x16, 0xfe, 0x3e, 0x74, 0xfe, 0x65, 0x6f, + 0x00, 0x3f, 0xe1, 0xfd, 0x3f, 0xbc, 0xfc, 0x64, 0x72, 0x01, 0x2e, 0x36, 0x00, 0x43, 0xd0, 0xfd, + 0xfa, 0x32, 0xff, 0xd0, 0xab, 0xfe, 0xba, 0x1e, 0x3f, 0xc1, 0xde, 0x22, 0x17, 0x80, 0xd8, 0xda, + 0xff, 0x05, 0xbe, 0xa5, 0x1b, 0x28, 0x66, 0x02, 0x99, 0x70, 0xf2, 0x05, 0x44, 0x10, 0xd5, 0xc3, + 0x08, 0x19, 0xe2, 0xe2, 0x59, 0xa2, 0xef, 0xad, 0xd2, 0x08, 0xf7, 0x2e, 0x0b, 0xc1, 0xb9, 0x03, + 0x74, 0x74, 0xf8, 0xe5, 0x5a, 0xf6, 0xb7, 0x5e, 0x06, 0x12, 0x4b, 0xfb, 0x9c, 0x81, 0xf7, 0xd6, + 0x55, 0x01, 0x1a, 0x11, 0xf9, 0x31, 0xbf, 0xfa, 0x1b, 0x22, 0xfe, 0x49, 0x73, 0xfe, 0xa4, 0x8e, + 0x00, 0x33, 0xa2, 0xfd, 0xc0, 0xe5, 0xfc, 0x8e, 0xea, 0x01, 0x06, 0xec, 0xff, 0xfb, 0x87, 0xfd, + 0xcc, 0x71, 0xff, 0xf9, 0xad, 0xfe, 0xc3, 0xf0, 0x45, 0xe4, 0x1e, 0x22, 0xa4, 0x02, 0xd3, 0x6e, + 0xf0, 0x05, 0xcb, 0xcd, 0x19, 0x01, 0x91, 0x03, 0xd1, 0x69, 0xf3, 0x9a, 0xd4, 0x0f, 0x2e, 0x8a, + 0x0b, 0x9a, 0x62, 0xe2, 0x04, 0x4d, 0xed, 0x24, 0x49, 0x07, 0x6e, 0x7d, 0x0b, 0xe0, 0x7a, 0x06, + 0x50, 0xe8, 0xf7, 0x68, 0xe4, 0xf5, 0x07, 0x2e, 0x06, 0xdb, 0xea, 0xf9, 0x78, 0x7b, 0xf8, 0x57, + 0xe5, 0x01, 0x2d, 0x33, 0xf8, 0x91, 0x99, 0xfa, 0x70, 0xc4, 0xfe, 0x7a, 0xfe, 0xfd, 0xdb, 0x4f, + 0x00, 0x1c, 0x7c, 0xfd, 0x24, 0x69, 0xfd, 0xfc, 0x30, 0x02, 0x9a, 0xe6, 0xfe, 0x11, 0x9d, 0xfd, + 0x79, 0x94, 0xff, 0x35, 0xb0, 0xfe, 0x1a, 0x12, 0x4a, 0x78, 0xe3, 0x23, 0xed, 0x2c, 0xce, 0x06, + 0xd4, 0x06, 0x65, 0x18, 0x17, 0xc0, 0x23, 0x03, 0x7c, 0x74, 0xf4, 0x95, 0xe4, 0x0e, 0xcc, 0x19, + 0x11, 0x51, 0xf0, 0xe1, 0x78, 0x22, 0xe9, 0x24, 0x79, 0x06, 0x1c, 0xd1, 0x0b, 0x72, 0xb8, 0x07, + 0x27, 0x01, 0xf9, 0x18, 0x20, 0xf6, 0x67, 0x67, 0x04, 0xb1, 0x86, 0xf9, 0xbe, 0xe7, 0xf9, 0xa9, + 0xf3, 0x01, 0xe5, 0x8c, 0xf7, 0xe5, 0x7a, 0xfa, 0xea, 0x3e, 0xff, 0x72, 0x54, 0xfd, 0x13, 0x09, + 0x00, 0x7a, 0xe1, 0xfd, 0xb5, 0xb9, 0xfd, 0xa1, 0x49, 0x02, 0xaf, 0x02, 0xfe, 0x4d, 0xc2, 0xfd, + 0xd5, 0xd0, 0xff, 0xbb, 0x67, 0xfe, 0xb3, 0xae, 0x4e, 0x8a, 0x3d, 0x23, 0x32, 0x71, 0xcb, 0x64, + 0x3b, 0x09, 0x27, 0x6b, 0x13, 0x82, 0x26, 0x01, 0x40, 0x66, 0xf4, 0x98, 0x2a, 0x0f, 0x18, 0x31, + 0x17, 0x54, 0x37, 0xe1, 0xcf, 0xcb, 0xe4, 0x82, 0x1e, 0x06, 0x01, 0xf1, 0x0b, 0xc7, 0x81, 0x07, + 0xeb, 0x62, 0xfb, 0xd7, 0x64, 0xf6, 0xc0, 0x19, 0x02, 0xfb, 0x08, 0xfa, 0x29, 0xe4, 0xfa, 0x00, + 0xc9, 0x01, 0x60, 0xbe, 0xf6, 0x26, 0x16, 0xfb, 0x4f, 0x41, 0xff, 0xf2, 0x4c, 0xfc, 0x92, 0xf7, + 0xff, 0x59, 0x7b, 0xfe, 0xb0, 0xfb, 0xfd, 0xa7, 0x24, 0x02, 0x72, 0x73, 0xfd, 0x7d, 0xab, 0xfd, + 0x6c, 0x3c, 0x00, 0x9b, 0xa9, 0xfd, 0xaf, 0xd6, 0x51, 0x0d, 0x33, 0x23, 0x1b, 0x5a, 0xca, 0xff, + 0xb7, 0x0b, 0xfd, 0xb6, 0x0f, 0xb9, 0xee, 0xfe, 0x39, 0xb8, 0xf2, 0xe6, 0x04, 0x10, 0x2a, 0xac, + 0x1d, 0xa6, 0xed, 0xe0, 0x82, 0x45, 0xe1, 0xee, 0x45, 0x05, 0x8d, 0x97, 0x0b, 0xbf, 0xcc, 0x06, + 0x8b, 0xf5, 0xfe, 0xe9, 0xe8, 0xf5, 0xbb, 0x48, 0x00, 0x82, 0xa5, 0xfb, 0xcc, 0x9d, 0xfa, 0x3c, + 0xc4, 0x01, 0x8d, 0x46, 0xf6, 0x96, 0x13, 0xfc, 0x6d, 0xdc, 0xfe, 0x61, 0x5d, 0xfb, 0xb3, 0xc6, + 0xff, 0x18, 0x45, 0xff, 0x2e, 0x56, 0xfe, 0x15, 0x9d, 0x01, 0x2e, 0x7f, 0xfd, 0x22, 0x7a, 0xfd, + 0xeb, 0x55, 0x00, 0x1e, 0x90, 0xfc, 0x78, 0xe7, 0x52, 0xeb, 0xca, 0x24, 0xb2, 0x63, 0xca, 0xd3, + 0x26, 0x0d, 0x88, 0x02, 0x0d, 0x8c, 0x50, 0xfd, 0x32, 0x89, 0xef, 0x28, 0x38, 0x10, 0xf8, 0x78, + 0x23, 0x7c, 0x00, 0xe2, 0xbc, 0x96, 0xdf, 0x5e, 0xf9, 0x02, 0x59, 0xe2, 0x0a, 0x0f, 0xf2, 0x05, + 0xea, 0x99, 0x02, 0x0f, 0xa5, 0xf5, 0x96, 0xa1, 0xfe, 0x1b, 0xeb, 0xfd, 0x00, 0xa2, 0xf9, 0x16, + 0x70, 0x01, 0x7c, 0xaf, 0xf6, 0xe6, 0xff, 0xfc, 0x4e, 0x0d, 0xfe, 0xd1, 0xbd, 0xfa, 0x90, 0x8c, + 0xff, 0x12, 0xf9, 0xff, 0xad, 0x9a, 0xfe, 0x9c, 0xd2, 0x00, 0x63, 0x57, 0xfe, 0x55, 0xd0, 0xfc, + 0xa6, 0x9e, 0xff, 0xdc, 0x38, 0xfc, 0xf7, 0x30, 0x54, 0x2d, 0xdb, 0x26, 0x4e, 0x67, 0xca, 0xfd, + 0xed, 0x0c, 0x25, 0x82, 0x0b, 0x8a, 0x6f, 0xfc, 0xda, 0x3b, 0xeb, 0xee, 0xbd, 0x0f, 0x49, 0xd3, + 0x27, 0xf9, 0x3d, 0xe4, 0x39, 0x57, 0xdf, 0xdb, 0x52, 0xff, 0xed, 0x59, 0x0a, 0xa8, 0xb0, 0x05, + 0x05, 0x06, 0x05, 0x00, 0x4b, 0xf6, 0x75, 0x55, 0xfd, 0x3c, 0x6c, 0xff, 0x25, 0x00, 0xf9, 0x31, + 0xb6, 0x00, 0xaa, 0x8f, 0xf7, 0xff, 0x71, 0xfd, 0xf4, 0x35, 0xfd, 0x5b, 0x70, 0xfa, 0xaf, 0x57, + 0xff, 0x01, 0x55, 0x00, 0xa0, 0xa7, 0xfe, 0xbd, 0xb6, 0x00, 0x3b, 0xbb, 0xfe, 0x3d, 0x97, 0xfb, + 0x65, 0x35, 0xff, 0x63, 0x42, 0xfc, 0xb9, 0xf9, 0x54, 0x06, 0x11, 0x28, 0x53, 0xf7, 0xcb, 0xb5, + 0xe6, 0x0b, 0x4b, 0xb2, 0x0a, 0x76, 0xdc, 0xfb, 0x0e, 0x50, 0xe7, 0x1f, 0x52, 0x0e, 0x35, 0xa5, + 0x29, 0x17, 0x5c, 0xe8, 0x6b, 0x3a, 0xe0, 0x7c, 0x20, 0xfb, 0xb5, 0x80, 0x09, 0x18, 0x32, 0x06, + 0xa1, 0xaf, 0x05, 0x10, 0x84, 0xf7, 0x1e, 0x29, 0xfd, 0xbb, 0x77, 0xff, 0xc8, 0x3a, 0xf9, 0x2b, + 0x0a, 0x00, 0x08, 0x8b, 0xf8, 0x3d, 0x70, 0xfd, 0x91, 0x8e, 0xfc, 0x58, 0x66, 0xfa, 0x7f, 0x02, + 0xff, 0x20, 0x47, 0x00, 0xb0, 0x04, 0xff, 0x56, 0x90, 0x00, 0xe6, 0xb3, 0xfd, 0x87, 0xa4, 0xfb, + 0xc9, 0x86, 0xfe, 0x77, 0x25, 0xfc, 0x66, 0xbe, 0x53, 0xff, 0xf0, 0x2a, 0x1f, 0x65, 0xce, 0x7d, + 0x26, 0x0a, 0x8b, 0x93, 0x0a, 0x2f, 0xc4, 0xfa, 0x4a, 0x66, 0xe5, 0x4b, 0x38, 0x0a, 0x4d, 0x6d, + 0x2a, 0x27, 0x97, 0xee, 0x18, 0x25, 0xe1, 0xaf, 0x0c, 0xf7, 0x8e, 0x42, 0x08, 0x75, 0x6f, 0x07, + 0x67, 0x11, 0x05, 0x94, 0x31, 0xf9, 0x28, 0x18, 0xfe, 0x3a, 0x6e, 0xfe, 0x65, 0xc8, 0xf9, 0xf6, + 0x4a, 0x00, 0x83, 0x18, 0xf9, 0x28, 0x11, 0xfd, 0x7b, 0x3f, 0xfc, 0x49, 0x1a, 0xfa, 0x6a, 0xf1, + 0xfe, 0x71, 0x7d, 0x00, 0xc7, 0x84, 0xfe, 0x02, 0xe7, 0xff, 0x09, 0x47, 0xfd, 0x00, 0xcd, 0xfb, + 0x61, 0xf3, 0xfd, 0x89, 0xe7, 0xfc, 0x6a, 0x01, 0x51, 0x3d, 0xe3, 0x2e, 0x3e, 0xbd, 0xd1, 0x10, + 0x15, 0x08, 0x9c, 0x3b, 0x0a, 0xf5, 0xda, 0xf9, 0xab, 0x8f, 0xe5, 0x6c, 0x6b, 0x03, 0xe6, 0x7d, + 0x2a, 0x5f, 0xf8, 0xf5, 0xbd, 0x13, 0xe2, 0x92, 0x48, 0xf4, 0x10, 0x30, 0x06, 0x43, 0xd9, 0x08, + 0xd2, 0xc9, 0x03, 0xd6, 0x1f, 0xfb, 0x1b, 0xf5, 0xff, 0x21, 0x93, 0xfc, 0xe6, 0x07, 0xfb, 0x1c, + 0xe7, 0x00, 0x1c, 0x66, 0xf9, 0x02, 0x69, 0xfc, 0xdf, 0xd9, 0xfb, 0x6f, 0x2b, 0xfa, 0x90, 0x45, + 0xff, 0x60, 0xc9, 0xff, 0x59, 0x11, 0xfd, 0xe3, 0x91, 0x00, 0xda, 0x8e, 0xfc, 0x69, 0x2e, 0xfc, + 0xaa, 0x99, 0xfe, 0x97, 0xc1, 0xfc, 0xb1, 0x0a, 0x4d, 0x2c, 0x73, 0x33, 0x79, 0x1b, 0xd6, 0xf0, + 0xef, 0x04, 0x5a, 0xea, 0x08, 0xfc, 0x95, 0xfa, 0x2b, 0x7c, 0xe7, 0xfa, 0x18, 0xfa, 0x7c, 0x40, + 0x29, 0xa1, 0xb5, 0xfd, 0x51, 0x74, 0xe3, 0x25, 0x5a, 0xf3, 0x9e, 0x02, 0x03, 0x9e, 0x21, 0x09, + 0x4c, 0x28, 0x03, 0xd2, 0x78, 0xfc, 0xae, 0x81, 0x02, 0xa6, 0xe1, 0xfa, 0xc7, 0x05, 0xfc, 0xa4, + 0xe6, 0x01, 0x52, 0x46, 0xf9, 0x4f, 0x8a, 0xfb, 0x77, 0xa0, 0xfb, 0xcd, 0xc1, 0xfa, 0x7d, 0xfa, + 0xfd, 0x60, 0xe3, 0xfe, 0xfb, 0x6a, 0xfc, 0xc2, 0xf5, 0x00, 0x20, 0xa2, 0xfc, 0xec, 0xdb, 0xfc, + 0x30, 0xb5, 0xfe, 0xf1, 0x4d, 0xfc, 0x30, 0x29, 0x49, 0x6e, 0x17, 0x35, 0xd0, 0xae, 0xdc, 0x48, + 0x90, 0x03, 0xb0, 0xf4, 0x05, 0x6a, 0xdd, 0xfb, 0xe1, 0x31, 0xe8, 0xe9, 0x93, 0xf1, 0xdf, 0x9e, + 0x27, 0x6f, 0xd1, 0x04, 0xe6, 0xca, 0xe4, 0x33, 0xde, 0xf3, 0x4e, 0xac, 0xff, 0x55, 0xcf, 0x06, + 0x1a, 0x56, 0x05, 0xc3, 0x49, 0xfc, 0xd6, 0xde, 0x04, 0xcd, 0x17, 0xfb, 0xb4, 0x16, 0xfb, 0x20, + 0xe4, 0x03, 0x37, 0x9b, 0xf8, 0xc0, 0xf9, 0xfa, 0x9f, 0xab, 0xfb, 0x40, 0xb2, 0xf9, 0xff, 0x9f, + 0xfc, 0x5d, 0xa1, 0xfe, 0xf2, 0xea, 0xfb, 0x59, 0xc0, 0x01, 0xd4, 0x7b, 0xfd, 0x70, 0x35, 0xfc, + 0x4b, 0x4e, 0xff, 0x75, 0x6c, 0xfc, 0x2f, 0xee, 0x43, 0xd5, 0xe5, 0x35, 0x29, 0xda, 0xe4, 0x18, + 0x6a, 0x03, 0x07, 0xff, 0x02, 0x84, 0x07, 0xfd, 0xa1, 0x55, 0xe8, 0xab, 0x7f, 0xe9, 0xb0, 0x60, + 0x25, 0x78, 0x70, 0x0c, 0x4b, 0xdc, 0xe5, 0xfb, 0x98, 0xf4, 0x4f, 0x05, 0xfe, 0x13, 0x99, 0x01, + 0xf5, 0x21, 0x09, 0x13, 0x95, 0xfc, 0x52, 0xeb, 0x04, 0xee, 0x80, 0xfe, 0x35, 0xd3, 0xf8, 0x37, + 0xf4, 0x04, 0xdf, 0xbc, 0xf9, 0x80, 0x78, 0xf9, 0x14, 0x5b, 0xfb, 0x1b, 0xe8, 0xf8, 0x77, 0xe7, + 0xfa, 0xc7, 0x15, 0xff, 0x49, 0x43, 0xfc, 0x6b, 0xc1, 0x01, 0x22, 0xa7, 0xfe, 0x39, 0x8f, 0xfb, + 0x5c, 0xd1, 0xff, 0x2a, 0x1d, 0xfc, 0xdb, 0x5b, 0x3f, 0x70, 0xec, 0x36, 0xd3, 0xb6, 0xec, 0x72, + 0x45, 0x01, 0x70, 0x0c, 0xff, 0xbc, 0xd6, 0xff, 0xfd, 0x31, 0xeb, 0x8d, 0x4c, 0xe2, 0x01, 0x84, + 0x1f, 0xde, 0x9c, 0x13, 0xb7, 0xc2, 0xe7, 0x66, 0x18, 0xf5, 0x12, 0xbf, 0xff, 0x59, 0xbf, 0xfa, + 0x43, 0xb5, 0x0a, 0x5f, 0xe4, 0xff, 0x57, 0xd6, 0x02, 0x07, 0x45, 0x02, 0xd0, 0x76, 0xf8, 0xee, + 0x41, 0x03, 0x5a, 0xb5, 0xfb, 0xfa, 0x97, 0xf8, 0x32, 0x68, 0xfa, 0xea, 0xe9, 0xf8, 0xfc, 0xea, + 0xf9, 0xcf, 0x21, 0xff, 0x02, 0x41, 0xfd, 0x97, 0x05, 0x01, 0x67, 0xbd, 0xff, 0x60, 0x49, 0xfb, + 0xe1, 0x41, 0xff, 0x7d, 0xd7, 0xfc, 0x99, 0x7e, 0x3c, 0x7b, 0x07, 0x37, 0x69, 0x17, 0xef, 0xb8, + 0x43, 0x03, 0x51, 0x26, 0x00, 0xbd, 0x74, 0xfb, 0x41, 0xab, 0xed, 0x74, 0x68, 0xe1, 0xb5, 0xe2, + 0x16, 0xea, 0xfd, 0x18, 0x02, 0x87, 0xeb, 0xe3, 0x65, 0xf3, 0xfd, 0x6d, 0x03, 0x48, 0xd9, 0xf5, + 0x31, 0xd9, 0x08, 0x3c, 0x27, 0x05, 0x64, 0xcc, 0x00, 0xe9, 0x3d, 0x03, 0x24, 0x4f, 0xfa, 0x38, + 0x3b, 0x00, 0x9e, 0x94, 0xfd, 0x72, 0x25, 0xf9, 0x59, 0xcc, 0xf8, 0x5e, 0xb1, 0xfa, 0xe4, 0xae, + 0xf8, 0xfc, 0xb0, 0xfe, 0x8e, 0x49, 0xfe, 0x20, 0x34, 0x00, 0x00, 0xa2, 0xff, 0xf3, 0xba, 0xfb, + 0xe0, 0xd6, 0xfe, 0x42, 0x25, 0xfd, 0x42, 0xbb, 0x3d, 0x37, 0x52, 0x34, 0x0b, 0x83, 0xed, 0xa8, + 0x1a, 0x07, 0x92, 0x16, 0x02, 0xd9, 0xb6, 0xf5, 0x81, 0xe9, 0xed, 0x72, 0xca, 0xe5, 0xcd, 0xbc, + 0x0e, 0x53, 0xec, 0x19, 0xa6, 0x9b, 0xf0, 0x28, 0x76, 0xf1, 0x31, 0xe6, 0x06, 0x6d, 0x1d, 0xf4, + 0x09, 0x44, 0x06, 0x48, 0x64, 0x07, 0x04, 0x75, 0x00, 0x24, 0x6e, 0x02, 0xd4, 0xc7, 0xfb, 0xb0, + 0x90, 0xff, 0xab, 0xa3, 0xfc, 0x26, 0x82, 0xfb, 0xdb, 0x56, 0xf8, 0xdb, 0x17, 0xfc, 0x45, 0xdd, + 0xf8, 0x6c, 0x88, 0xfc, 0x1c, 0xcd, 0xfe, 0x00, 0x77, 0xff, 0x08, 0xf9, 0xff, 0x54, 0xb5, 0xfb, + 0xec, 0x5b, 0xfe, 0x39, 0x6b, 0xfd, 0xdf, 0x4a, 0x3d, 0x66, 0x21, 0x33, 0x93, 0xf4, 0xeb, 0x6e, + 0x32, 0x0a, 0x9b, 0x33, 0x04, 0x7c, 0x1a, 0xf1, 0x51, 0x7a, 0xef, 0xfd, 0x50, 0xe9, 0xea, 0xf5, + 0x06, 0x05, 0x78, 0x19, 0xec, 0xcb, 0xf7, 0x72, 0x89, 0xee, 0x63, 0xe9, 0x09, 0x35, 0x97, 0xf4, + 0x0f, 0x73, 0x02, 0x94, 0xce, 0x09, 0x5b, 0x43, 0xfd, 0xb3, 0x2b, 0x04, 0xa2, 0xa1, 0xfc, 0x4b, + 0xc4, 0xfd, 0x64, 0xb4, 0xfe, 0x91, 0x6c, 0xfd, 0x2f, 0xd6, 0xf8, 0xcd, 0x18, 0xfd, 0xfb, 0x4a, + 0xf9, 0x42, 0x03, 0xfa, 0x23, 0x9c, 0xfe, 0x1d, 0x9c, 0xfe, 0x75, 0xfb, 0x00, 0xf7, 0xfc, 0xfb, + 0x84, 0xab, 0xfc, 0x98, 0x09, 0xfe, 0x6d, 0x55, 0x3f, 0x01, 0xc7, 0x2d, 0x28, 0x00, 0xeb, 0x99, + 0xc8, 0x0e, 0xf1, 0xc7, 0x02, 0x3b, 0x1c, 0xef, 0xa1, 0x37, 0xf1, 0xcc, 0x87, 0xeb, 0x52, 0x9c, + 0x00, 0x73, 0x9d, 0x19, 0xe0, 0x1c, 0xfd, 0x76, 0x62, 0xec, 0xaf, 0xa9, 0x0a, 0xb5, 0x26, 0xf8, + 0xda, 0xf2, 0xfd, 0xd2, 0x47, 0x09, 0x6a, 0x3e, 0xfe, 0xc6, 0x83, 0x00, 0x04, 0x6b, 0xff, 0x3c, + 0x40, 0xfe, 0xfc, 0xf0, 0xff, 0xcd, 0xa6, 0xff, 0xda, 0x77, 0xf8, 0xb2, 0x4b, 0xfd, 0xfe, 0x93, + 0xfa, 0x58, 0x0d, 0xf9, 0x8b, 0xfb, 0xfb, 0x2d, 0xe8, 0xfe, 0x91, 0x86, 0x00, 0x3e, 0x87, 0xfc, + 0x4c, 0x55, 0xfc, 0xc0, 0xb2, 0xfd, 0x17, 0x85, 0x40, 0xb9, 0xc3, 0x2b, 0x31, 0x86, 0xe5, 0x6c, + 0xcd, 0x12, 0x8a, 0x55, 0x06, 0xaf, 0xbd, 0xe9, 0x53, 0xd0, 0xf1, 0xe5, 0xf1, 0xf1, 0x3d, 0x25, + 0xfc, 0x15, 0xc9, 0x13, 0x74, 0xf6, 0x04, 0x89, 0xc2, 0xeb, 0x9c, 0xfb, 0x07, 0xc6, 0xe5, 0xfc, + 0x31, 0x01, 0xfb, 0x98, 0xbf, 0x07, 0xa0, 0x98, 0xfe, 0xfb, 0xbd, 0xfd, 0x92, 0x3a, 0x01, 0x65, + 0xef, 0x01, 0xc8, 0x31, 0xff, 0xd2, 0xf2, 0x00, 0x20, 0x65, 0xf9, 0x10, 0x50, 0xfc, 0xe1, 0x4f, + 0xfc, 0x93, 0xe4, 0xf8, 0xa3, 0x7f, 0xfa, 0x22, 0x6d, 0xfd, 0xf3, 0x67, 0xff, 0xbe, 0x21, 0xfd, + 0xef, 0xe4, 0xfd, 0x35, 0x79, 0xfd, 0x32, 0x64, 0x41, 0x65, 0x02, 0x29, 0xa4, 0x73, 0xdf, 0xcf, + 0x88, 0x18, 0x17, 0xb1, 0x09, 0xb8, 0x56, 0xe3, 0xfe, 0x70, 0xf3, 0x70, 0xca, 0xf8, 0xff, 0x5c, + 0xf8, 0xc4, 0x03, 0x0d, 0xe5, 0xa6, 0x0b, 0xc2, 0x53, 0xec, 0x2a, 0x93, 0x04, 0x2d, 0xd7, 0x00, + 0xe7, 0x94, 0xf8, 0xf6, 0xa6, 0x06, 0x28, 0x2c, 0xff, 0x8d, 0xd2, 0xfc, 0x6d, 0x14, 0x02, 0xc5, + 0xfb, 0x02, 0x50, 0x98, 0x00, 0x9a, 0x6b, 0x01, 0x48, 0xc8, 0xf9, 0x10, 0x6e, 0xfc, 0xdb, 0xa1, + 0xfc, 0x99, 0x5d, 0xf9, 0x7f, 0xaa, 0xfa, 0xac, 0xc9, 0xfb, 0x34, 0xab, 0xfc, 0x8c, 0xfb, 0xfd, + 0x7f, 0xc0, 0xff, 0x25, 0xbd, 0xfd, 0xbc, 0x66, 0x42, 0x72, 0xd3, 0x23, 0xa1, 0x74, 0xdb, 0x77, + 0x75, 0x1f, 0x21, 0x06, 0x0a, 0xb6, 0x38, 0xdf, 0xef, 0xf7, 0xf5, 0xd4, 0x79, 0xfd, 0x34, 0x88, + 0xf6, 0x87, 0x5b, 0x06, 0x14, 0x67, 0x0f, 0x9b, 0xcb, 0xee, 0x5d, 0x58, 0x02, 0x0f, 0xbe, 0x01, + 0x61, 0xb2, 0xf6, 0x9e, 0xc9, 0x07, 0xc5, 0x5d, 0x00, 0x06, 0x22, 0xfb, 0x58, 0xc6, 0x03, 0x88, + 0xb6, 0x01, 0xc8, 0xd6, 0x00, 0x7d, 0x64, 0x04, 0xf6, 0x9b, 0xf8, 0x38, 0x18, 0xfd, 0x36, 0x27, + 0xfd, 0x95, 0x88, 0xf8, 0x51, 0x77, 0xfc, 0x32, 0x3a, 0xfb, 0xcd, 0xb7, 0xf9, 0xdc, 0xe7, 0xfd, + 0x5a, 0xa5, 0x00, 0x9e, 0x7b, 0xfe, 0x60, 0x92, 0x42, 0xc6, 0x3e, 0x1d, 0xdb, 0xb6, 0xda, 0xbf, + 0xef, 0x25, 0x15, 0xdd, 0x07, 0x0b, 0xc7, 0xdd, 0x36, 0x17, 0xf9, 0x36, 0xda, 0x00, 0x01, 0x29, + 0xf3, 0xf5, 0x36, 0x02, 0x77, 0x83, 0x13, 0x4f, 0x27, 0xef, 0x77, 0xa5, 0xff, 0x29, 0x84, 0x04, + 0x9c, 0xf2, 0xf5, 0xe1, 0xea, 0x05, 0x76, 0x15, 0x04, 0x04, 0x11, 0xfb, 0xa9, 0xc5, 0x01, 0x9a, + 0x63, 0x02, 0x18, 0x0d, 0x00, 0x28, 0x23, 0x05, 0x2f, 0xe2, 0xfa, 0xe1, 0x9f, 0xfb, 0xc2, 0x4d, + 0xfe, 0x7d, 0xd2, 0xf8, 0xd3, 0xe8, 0xfb, 0x53, 0x4a, 0xfd, 0x81, 0x30, 0xf8, 0x2c, 0x29, 0xfc, + 0x8c, 0xb4, 0x00, 0x29, 0x59, 0xff, 0x01, 0x93, 0x3f, 0xf3, 0x19, 0x18, 0x13, 0x19, 0xde, 0x56, + 0xac, 0x28, 0x2e, 0x90, 0x04, 0xde, 0x74, 0xe0, 0x18, 0x0c, 0xfc, 0xab, 0xe3, 0xff, 0xb7, 0x8e, + 0xf1, 0xa8, 0x44, 0x01, 0xd1, 0x64, 0x14, 0x8d, 0xd9, 0xee, 0xad, 0x4d, 0xfe, 0xd6, 0x91, 0x07, + 0x7a, 0x8a, 0xf5, 0x4f, 0x55, 0x03, 0xe5, 0x16, 0x07, 0x21, 0xd9, 0xfb, 0x15, 0x0f, 0x00, 0x38, + 0x2f, 0x02, 0xb8, 0x73, 0xff, 0xe9, 0x18, 0x05, 0x9d, 0x10, 0xfc, 0x9d, 0x9c, 0xfb, 0xae, 0x34, + 0xff, 0x90, 0x5b, 0xf9, 0xe2, 0x48, 0xfb, 0x00, 0x39, 0xfe, 0x05, 0x27, 0xf9, 0xeb, 0x01, 0xfb, + 0x97, 0x2c, 0xff, 0x9c, 0x90, 0xff, 0xd9, 0x20, 0x3a, 0xc9, 0x42, 0x15, 0xd0, 0x6b, 0xe3, 0xcf, + 0x8a, 0x27, 0x4d, 0x9f, 0x03, 0xda, 0x8e, 0xe4, 0x29, 0xfb, 0xfb, 0x2c, 0xf2, 0xff, 0xb1, 0x4e, + 0xf2, 0xae, 0x7c, 0xfe, 0x79, 0x15, 0x14, 0x34, 0x66, 0xf1, 0x5b, 0x55, 0xfc, 0xf3, 0x84, 0x08, + 0x19, 0xde, 0xf7, 0xa0, 0x38, 0x01, 0xa3, 0xea, 0x06, 0x7a, 0x1f, 0xfd, 0xf1, 0xb9, 0x00, 0x09, + 0xe4, 0x00, 0xac, 0x86, 0xfe, 0x31, 0xc0, 0x05, 0xd6, 0x61, 0xfb, 0xa9, 0x5e, 0xfc, 0x27, 0xb4, + 0x00, 0x4b, 0x5f, 0xf9, 0xfa, 0xae, 0xfb, 0xc2, 0x82, 0xfe, 0x9e, 0x05, 0xfa, 0x05, 0x7b, 0xfb, + 0x61, 0x2f, 0xfe, 0xe3, 0x8d, 0xfe, 0xef, 0x7f, 0x33, 0xa8, 0x88, 0x14, 0xb2, 0xfd, 0xe7, 0x0c, + 0xbf, 0x24, 0xb2, 0x22, 0x05, 0xcb, 0xa2, 0xe6, 0xf1, 0x06, 0xfc, 0xc5, 0x81, 0x01, 0x6e, 0x67, + 0xf2, 0x3c, 0xdf, 0xfb, 0xf8, 0xac, 0x13, 0x4a, 0x80, 0xf4, 0x24, 0x27, 0xfa, 0xf4, 0x28, 0x09, + 0xef, 0x5f, 0xfa, 0x34, 0xf6, 0xfe, 0xa6, 0xa8, 0x06, 0x14, 0x51, 0xfe, 0xff, 0x60, 0x00, 0x32, + 0x46, 0x01, 0x0e, 0xfe, 0xfd, 0x84, 0x56, 0x04, 0x3d, 0xb8, 0xfc, 0x21, 0xc9, 0xfb, 0xb3, 0xfc, + 0x00, 0x19, 0x45, 0xfb, 0x1d, 0x87, 0xfb, 0x56, 0x12, 0xff, 0xd9, 0x88, 0xfa, 0x94, 0xf2, 0xfb, + 0xcb, 0x89, 0xfe, 0x9c, 0x00, 0xfe, 0xbd, 0xbb, 0x29, 0x23, 0xa5, 0x0f, 0x47, 0x9f, 0xf1, 0xf7, + 0x3e, 0x25, 0x12, 0xe2, 0x02, 0x94, 0xb0, 0xe7, 0x6e, 0xf9, 0xff, 0x60, 0x19, 0x01, 0x00, 0x2d, + 0xf6, 0x16, 0x0d, 0x00, 0xe1, 0x55, 0x06, 0x09, 0x71, 0xf6, 0x20, 0x82, 0x04, 0x36, 0xbf, 0x05, + 0x5c, 0x61, 0xf9, 0x13, 0xfa, 0xfe, 0xef, 0x22, 0x03, 0x6b, 0x52, 0xfe, 0x4f, 0x97, 0xfd, 0xb6, + 0x99, 0x00, 0x96, 0x80, 0xff, 0xaf, 0x08, 0x00, 0xdd, 0xb3, 0xfe, 0xf5, 0xf5, 0x01, 0xad, 0x31, + 0x02, 0xcc, 0x73, 0x00, 0xe2, 0xbf, 0x00, 0x6e, 0xd2, 0xfe, 0x61, 0x39, 0xfd, 0x1d, 0xd1, 0xfe, + 0x2d, 0xa5, 0xfd, 0x19, 0x17, 0xfc, 0x70, 0xa0, 0x23, 0x82, 0x74, 0x0f, 0xb6, 0x79, 0xf5, 0x79, + 0xf9, 0x1f, 0xb4, 0x11, 0x04, 0x07, 0x56, 0xec, 0xca, 0x6f, 0xff, 0x4b, 0x35, 0x00, 0xc7, 0x78, + 0xf7, 0x9b, 0x11, 0x00, 0x13, 0xdb, 0x05, 0x38, 0x35, 0xf8, 0x83, 0x29, 0x03, 0x55, 0x16, 0x05, + 0x51, 0xc6, 0xfa, 0x89, 0x42, 0xfe, 0x92, 0x27, 0x02, 0xec, 0xde, 0xfe, 0x39, 0xe5, 0xfd, 0xbd, + 0xf4, 0xff, 0x3f, 0xb7, 0xff, 0x27, 0xe3, 0x00, 0xef, 0xff, 0xfe, 0xf6, 0xf2, 0x00, 0xc9, 0x32, + 0x02, 0x71, 0x88, 0x00, 0x6d, 0xfa, 0xff, 0xfb, 0xea, 0xfe, 0x8b, 0xc7, 0xfd, 0x45, 0x87, 0xfe, + 0xd7, 0x10, 0xfe, 0x9a, 0x6f, 0xfd, 0x2a, 0x98, 0x1e, 0x16, 0x5e, 0x0f, 0x44, 0x65, 0xf8, 0x46, + 0x4f, 0x1b, 0x0f, 0xae, 0x05, 0x1c, 0xe5, 0xef, 0xdd, 0xbc, 0xfe, 0xa7, 0x2d, 0x00, 0x42, 0xcf, + 0xf8, 0x33, 0xdf, 0xff, 0xa5, 0x87, 0x05, 0x88, 0x06, 0xfa, 0xa8, 0xae, 0x01, 0xa1, 0xb3, 0x04, + 0x2c, 0x51, 0xfc, 0xee, 0x95, 0xfd, 0x5d, 0xbe, 0x01, 0x74, 0x59, 0xff, 0xad, 0x28, 0xfe, 0x12, + 0xee, 0xff, 0x0d, 0x16, 0x00, 0x2a, 0x14, 0x01, 0xc7, 0x16, 0xff, 0xcd, 0xf3, 0x00, 0xb4, 0x87, + 0x01, 0x3d, 0x1c, 0x00, 0xc5, 0x72, 0x00, 0x9d, 0x59, 0xff, 0xba, 0xe3, 0xfd, 0x75, 0x8e, 0xfe, + 0x75, 0x97, 0xfe, 0x0b, 0x3d, 0xfe, 0x27, 0x79, 0x1a, 0x81, 0xfe, 0x0e, 0x62, 0x2a, 0xfa, 0xef, + 0xba, 0x17, 0x43, 0xba, 0x06, 0xc9, 0x9e, 0xf2, 0x98, 0xbe, 0xfe, 0x5f, 0x48, 0x00, 0xfa, 0x07, + 0xfa, 0xf8, 0xba, 0xff, 0x12, 0x4d, 0x05, 0x5b, 0x0f, 0xfb, 0x6b, 0xa4, 0x00, 0x5b, 0x83, 0x04, + 0xa6, 0xf6, 0xfc, 0x9e, 0x6f, 0xfd, 0x4c, 0x84, 0x01, 0x3c, 0xc8, 0xff, 0x1a, 0x64, 0xfe, 0x58, + 0x11, 0x00, 0x8e, 0x94, 0x00, 0x5e, 0x9f, 0x00, 0xad, 0x5b, 0xff, 0xd8, 0xd4, 0x00, 0xf1, 0xcf, + 0x00, 0xa5, 0x25, 0x00, 0xad, 0xd7, 0x00, 0x66, 0xd2, 0xff, 0x50, 0x16, 0xfe, 0xd4, 0xd9, 0xfe, + 0x74, 0xea, 0xfe, 0xb1, 0x66, 0xfe, 0xc1, 0x45, 0x17, 0x4f, 0xff, 0x0d, 0xc8, 0x87, 0xfb, 0xf9, + 0xfe, 0x14, 0x45, 0xe8, 0x06, 0xf0, 0x4b, 0xf5, 0x2b, 0xcc, 0xfe, 0x73, 0x83, 0x00, 0x42, 0x3a, + 0xfb, 0xd6, 0x7b, 0xff, 0x0a, 0xf6, 0x04, 0x2d, 0xbd, 0xfb, 0xc4, 0x0f, 0x00, 0xe7, 0xfb, 0x03, + 0xb4, 0x80, 0xfd, 0x2d, 0x85, 0xfd, 0x55, 0x7a, 0x01, 0xbc, 0x14, 0x00, 0xd7, 0x9b, 0xfe, 0x33, + 0x88, 0x00, 0xab, 0x5e, 0x00, 0xfb, 0x50, 0x00, 0xa9, 0xa8, 0xff, 0x6b, 0x63, 0x00, 0x82, 0xdc, + 0x00, 0xeb, 0x60, 0x00, 0x6f, 0xdb, 0x00, 0x10, 0x36, 0x00, 0xac, 0x83, 0xfe, 0xfb, 0xf8, 0xfe, + 0xcd, 0x17, 0xff, 0x8d, 0x8d, 0xfe, 0xc4, 0x7c, 0x14, 0x39, 0xfc, 0x0c, 0x34, 0xe0, 0xfc, 0x92, + 0x32, 0x12, 0x8b, 0x12, 0x07, 0xdf, 0xee, 0xf7, 0x1b, 0xe6, 0xfe, 0x97, 0xeb, 0x00, 0xba, 0xfd, + 0xfb, 0xfb, 0x8b, 0xff, 0xde, 0x80, 0x04, 0xbb, 0x1d, 0xfc, 0x98, 0xd2, 0xff, 0xa7, 0x98, 0x03, + 0x09, 0xee, 0xfd, 0x33, 0xb3, 0xfd, 0x49, 0xab, 0x01, 0xe1, 0x4a, 0x00, 0xd0, 0x30, 0xff, 0xa6, + 0x67, 0x00, 0x1f, 0x0f, 0x00, 0x20, 0x9f, 0x00, 0x78, 0xa9, 0xff, 0x31, 0x7a, 0x00, 0xa1, 0x09, + 0x01, 0x8e, 0x92, 0x00, 0x5b, 0xe4, 0x00, 0x9e, 0x40, 0x00, 0xe5, 0xf1, 0xfe, 0xaa, 0x42, 0xff, + 0x1b, 0x4c, 0xff, 0xff, 0xc4, 0xfe, 0xce, 0xb5, 0x11, 0x18, 0xb5, 0x0b, 0x96, 0x10, 0xfe, 0xd4, + 0x37, 0x10, 0x1b, 0x95, 0x07, 0xcb, 0xe6, 0xf9, 0x09, 0xf5, 0xfe, 0xb2, 0x3a, 0x01, 0xd1, 0xd7, + 0xfc, 0x7d, 0x86, 0xff, 0x69, 0xb4, 0x03, 0x65, 0xaf, 0xfc, 0x95, 0xcb, 0xff, 0x60, 0x0b, 0x03, + 0x09, 0x40, 0xfe, 0xbc, 0x82, 0xfe, 0xf1, 0xa6, 0x01, 0xbd, 0x43, 0x00, 0xdd, 0x91, 0xff, 0x42, + 0x41, 0x00, 0x9b, 0x6f, 0x00, 0x65, 0xd1, 0x00, 0x75, 0xb1, 0xff, 0x9c, 0x96, 0x00, 0xf5, 0x32, + 0x01, 0x40, 0x9f, 0x00, 0xe8, 0xe5, 0x00, 0xa4, 0x55, 0x00, 0x61, 0x44, 0xff, 0x95, 0xc5, 0xff, + 0x4f, 0x3f, 0xff, 0x36, 0x45, 0xfe, 0xb1, 0x13, 0x0f, 0x22, 0xef, 0x0a, 0x96, 0x05, 0xff, 0xcf, + 0x23, 0x0e, 0x13, 0xe1, 0x07, 0x3e, 0xc2, 0xfb, 0x03, 0x2f, 0xff, 0xb3, 0x71, 0x01, 0x26, 0x6e, + 0xfd, 0x81, 0x44, 0xff, 0xbb, 0x37, 0x03, 0x69, 0x4b, 0xfd, 0xf4, 0xa9, 0xff, 0x83, 0x8f, 0x02, + 0x0b, 0xf8, 0xfe, 0xa4, 0xe1, 0xfe, 0x8a, 0x51, 0x01, 0xa2, 0xc6, 0x00, 0x43, 0xd1, 0xff, 0xa2, + 0x87, 0x00, 0x4e, 0xbb, 0x00, 0x7f, 0xa4, 0x00, 0x3a, 0x00, 0x00, 0xf1, 0xad, 0x00, 0xde, 0x2e, + 0x01, 0xe9, 0xa5, 0x00, 0xde, 0xd5, 0x00, 0xce, 0x98, 0x00, 0x71, 0x7a, 0xff, 0x2e, 0x3c, 0xff, + 0x83, 0x93, 0xfe, 0x6f, 0x00, 0xfe, 0x23, 0xf5, 0x0c, 0x7e, 0x12, 0x0a, 0xf1, 0xca, 0xff, 0x15, + 0x88, 0x0c, 0x06, 0x00, 0x08, 0xd5, 0x57, 0xfd, 0x7a, 0x89, 0xff, 0xa8, 0x83, 0x01, 0x6a, 0xda, + 0xfd, 0xed, 0x32, 0xff, 0xf5, 0xd9, 0x02, 0x2b, 0x11, 0xfe, 0xbb, 0x97, 0xff, 0xa3, 0x06, 0x02, + 0xa6, 0x9d, 0xff, 0x26, 0x59, 0xff, 0x7e, 0x8d, 0x01, 0xbd, 0x51, 0x01, 0xc3, 0x2f, 0x00, 0x11, + 0xc7, 0x00, 0x4d, 0xc0, 0x00, 0x1e, 0xbf, 0x00, 0x4b, 0x4b, 0x00, 0x4c, 0xcc, 0x00, 0xbe, 0x1c, + 0x01, 0x75, 0xcc, 0x00, 0x0c, 0xd6, 0x00, 0xc0, 0xe4, 0xff, 0xd5, 0xea, 0xfe, 0x36, 0xdc, 0xfe, + 0x02, 0x8f, 0xfe, 0x3f, 0x26, 0xfe, 0x0e, 0x32, 0x0b, 0xf3, 0x4a, 0x09, 0x57, 0x92, 0x00, 0x50, + 0x36, 0x0b, 0x3a, 0xaf, 0x07, 0x64, 0x5c, 0xfe, 0x47, 0x32, 0x00, 0xa5, 0x84, 0x01, 0x6a, 0xdb, + 0xfd, 0x85, 0x70, 0xff, 0x30, 0xea, 0x02, 0x33, 0x37, 0xfe, 0x43, 0x08, 0xff, 0x3b, 0x50, 0x02, + 0xbe, 0x88, 0x00, 0x2c, 0xe1, 0xff, 0x9d, 0x08, 0x02, 0xeb, 0x60, 0x01, 0xc7, 0x5f, 0x00, 0xee, + 0x1b, 0x01, 0xce, 0xca, 0x00, 0x5b, 0xdd, 0x00, 0x5b, 0x79, 0x00, 0x0a, 0xca, 0x00, 0x42, 0xb7, + 0x00, 0x31, 0x0c, 0x00, 0xd4, 0x1c, 0x00, 0x51, 0x6e, 0xff, 0xff, 0xda, 0xfe, 0x25, 0xc0, 0xfe, + 0x77, 0x48, 0xfe, 0xf5, 0xf3, 0xfd, 0x6c, 0x6e, 0x0a, 0xf7, 0x3f, 0x09, 0x0b, 0xe4, 0x00, 0x03, + 0x7f, 0x09, 0xfe, 0x06, 0x07, 0x34, 0x1b, 0xff, 0xa6, 0xbf, 0x00, 0x26, 0xab, 0x01, 0x66, 0xeb, + 0xfd, 0xbc, 0x55, 0xff, 0xf7, 0xa2, 0x02, 0xba, 0xb6, 0xfe, 0x75, 0x65, 0xff, 0x1f, 0x25, 0x03, + 0xda, 0x5d, 0x01, 0x7c, 0xfa, 0xff, 0x05, 0x36, 0x02, 0xfb, 0xce, 0x01, 0xb2, 0xef, 0x00, 0x95, + 0xfc, 0x00, 0xbe, 0xad, 0x00, 0x08, 0xf2, 0x00, 0xc3, 0x11, 0x00, 0x09, 0xb2, 0xff, 0x6b, 0xdc, + 0xff, 0xe3, 0xf6, 0xff, 0xa7, 0xde, 0xff, 0x80, 0x45, 0xff, 0xf5, 0x52, 0xfe, 0xb4, 0x38, 0xfe, + 0xe7, 0x83, 0xfe, 0x2f, 0x33, 0xfe, 0x6c, 0x0d, 0x09, 0x34, 0x10, 0x08, 0xa6, 0x84, 0x01, 0x7c, + 0x7d, 0x09, 0xeb, 0xa4, 0x06, 0x55, 0xa6, 0xff, 0x4e, 0x59, 0x01, 0xd9, 0x32, 0x01, 0x9f, 0xd2, + 0xfd, 0xe4, 0xe0, 0xff, 0xbe, 0xe7, 0x02, 0xf3, 0x6e, 0xff, 0x4d, 0x29, 0x00, 0xed, 0x34, 0x03, + 0x63, 0xa0, 0x01, 0x7f, 0x1c, 0x01, 0x6c, 0xb8, 0x02, 0xa4, 0xc1, 0x01, 0x1d, 0xb6, 0x00, 0xe9, + 0xb5, 0x00, 0x46, 0x69, 0x00, 0x24, 0xcb, 0xff, 0x91, 0x29, 0xff, 0x83, 0x62, 0xff, 0x14, 0xde, + 0xff, 0xd7, 0xf5, 0xff, 0x07, 0x48, 0xff, 0x23, 0xce, 0xfe, 0xc7, 0x52, 0xfe, 0x6e, 0xa7, 0xfe, + 0x80, 0xb3, 0xfe, 0xce, 0x30, 0xfe, 0x1e, 0x6e, 0x08, 0xa1, 0xf4, 0x07, 0xde, 0xe6, 0x01, 0xa2, + 0xb1, 0x08, 0x1d, 0x3c, 0x06, 0x7b, 0xd2, 0xff, 0xad, 0xe9, 0x00, 0xff, 0x86, 0x01, 0x40, 0x24, + 0xff, 0xd0, 0x48, 0x00, 0xfd, 0x03, 0x03, 0x1d, 0x12, 0x00, 0xb1, 0xf2, 0x00, 0x5a, 0x17, 0x04, + 0x11, 0x9c, 0x02, 0x0f, 0x4d, 0x01, 0x0a, 0x3b, 0x02, 0xa4, 0x61, 0x01, 0x49, 0xf1, 0xff, 0xe7, + 0xa2, 0xff, 0x11, 0x56, 0xff, 0xf0, 0x9d, 0xff, 0xd2, 0x2a, 0xff, 0x07, 0x43, 0xff, 0xb5, 0xd5, + 0xff, 0xf8, 0x5d, 0xff, 0x79, 0x1b, 0xff, 0x24, 0xfe, 0xfe, 0x2c, 0xa6, 0xfe, 0x2b, 0xca, 0xfe, + 0xed, 0xae, 0xfe, 0x74, 0x58, 0xfe, 0x20, 0x39, 0x07, 0x16, 0x5d, 0x07, 0x17, 0xd8, 0x02, 0x32, + 0xe9, 0x07, 0x56, 0x4f, 0x05, 0x19, 0x09, 0x01, 0x3f, 0xa3, 0x01, 0x04, 0xdb, 0x01, 0x0e, 0x0b, + 0x00, 0xbe, 0x44, 0x00, 0x52, 0x43, 0x03, 0xe4, 0xa3, 0x01, 0x10, 0x0c, 0x02, 0x9a, 0xf3, 0x03, + 0x00, 0x57, 0x02, 0xec, 0x05, 0x01, 0x43, 0x32, 0x01, 0x2e, 0xcb, 0xff, 0x73, 0xf2, 0xfe, 0xa8, + 0x98, 0xff, 0x72, 0x55, 0xff, 0x56, 0x39, 0xff, 0x6b, 0xbc, 0xfe, 0x5f, 0x1c, 0xff, 0x47, 0xd8, + 0xff, 0x62, 0x77, 0xff, 0x6d, 0x2a, 0xff, 0x07, 0xdf, 0xfe, 0x90, 0xb6, 0xfe, 0x54, 0xe1, 0xfe, + 0xc9, 0x8e, 0xfe, 0x09, 0x76, 0xfe, 0x35, 0x9c, 0x06, 0xe3, 0xc8, 0x06, 0x05, 0xc5, 0x02, 0x9e, + 0x71, 0x07, 0x54, 0x48, 0x06, 0x10, 0x50, 0x02, 0x40, 0x9f, 0x01, 0xb4, 0x1b, 0x02, 0xbb, 0x4f, + 0x01, 0x31, 0x6f, 0x01, 0xbd, 0x77, 0x03, 0x45, 0x8c, 0x02, 0x8d, 0x67, 0x02, 0x05, 0xeb, 0x02, + 0x93, 0x39, 0x01, 0x2f, 0x93, 0xff, 0xe5, 0xef, 0xff, 0x08, 0xbf, 0xff, 0x10, 0x59, 0xff, 0x23, + 0x09, 0xff, 0x8e, 0x8e, 0xfe, 0xe6, 0x01, 0xff, 0x7d, 0x4e, 0xff, 0xef, 0xb5, 0xff, 0x69, 0x93, + 0xff, 0xd0, 0x11, 0xff, 0x58, 0x18, 0xff, 0x07, 0x32, 0xff, 0xa3, 0xd8, 0xfe, 0xe0, 0x90, 0xfe, + 0xad, 0xaf, 0xfe, 0xd9, 0xe0, 0xfe, 0xed, 0xf4, 0x05, 0xcb, 0xc5, 0x07, 0x4d, 0x5e, 0x04, 0x52, + 0xa5, 0x06, 0x2d, 0x17, 0x06, 0x7d, 0xcf, 0x02, 0x08, 0xa6, 0x02, 0x13, 0x85, 0x03, 0x9a, 0xce, + 0x01, 0xe9, 0xec, 0x01, 0x54, 0x83, 0x03, 0x91, 0x5f, 0x01, 0x3b, 0xea, 0x00, 0x2e, 0xb0, 0x01, + 0x56, 0x1f, 0x00, 0x15, 0x26, 0xff, 0x99, 0x96, 0xff, 0x95, 0x45, 0xff, 0x76, 0xbe, 0xfe, 0xd1, + 0xdd, 0xfe, 0x71, 0xf0, 0xfe, 0xa4, 0x37, 0xff, 0x63, 0x7a, 0xff, 0x67, 0x9b, 0xff, 0x64, 0x52, + 0xff, 0x32, 0xf2, 0xfe, 0xca, 0x13, 0xff, 0x31, 0xf6, 0xfe, 0x81, 0xd9, 0xfe, 0x05, 0xd9, 0xfe, + 0x68, 0xde, 0xfe, 0x4d, 0xfc, 0xfe, 0x79, 0x62, 0x05, 0xaf, 0x0b, 0x08, 0x9a, 0x12, 0x05, 0xc9, + 0xd5, 0x06, 0x79, 0x1f, 0x08, 0x4c, 0x0c, 0x05, 0xaa, 0x9f, 0x02, 0x3c, 0xfe, 0x02, 0xbe, 0x0e, + 0x02, 0x2e, 0x03, 0x01, 0x71, 0x78, 0x01, 0x6a, 0x60, 0x00, 0xbc, 0x5a, 0x00, 0xaa, 0x28, 0x01, + 0xec, 0xf7, 0xff, 0x7e, 0xd1, 0xfe, 0x6f, 0x0e, 0xff, 0x6c, 0xf4, 0xfe, 0xdf, 0xb3, 0xfe, 0xcb, + 0x0f, 0xff, 0xec, 0x26, 0xff, 0x18, 0x5c, 0xff, 0x66, 0x63, 0xff, 0xd7, 0x32, 0xff, 0xca, 0x14, + 0xff, 0xd6, 0x13, 0xff, 0x1c, 0x34, 0xff, 0x72, 0x0a, 0xff, 0xae, 0xd2, 0xfe, 0xd1, 0xc4, 0xfe, + 0xff, 0x01, 0xff, 0x2a, 0x33, 0xff, 0x10, 0xfb, 0x05, 0x5d, 0x99, 0x09, 0x78, 0xb8, 0x06, 0x10, + 0xf5, 0x07, 0x72, 0x89, 0x07, 0xb6, 0x7e, 0x04, 0xe5, 0xa1, 0x03, 0xf2, 0xcb, 0x02, 0xf5, 0x26, + 0x00, 0x29, 0x25, 0xff, 0xaf, 0x2a, 0x01, 0x4a, 0xd7, 0x00, 0xea, 0x7d, 0xff, 0x1d, 0x71, 0x00, + 0x82, 0xf7, 0xff, 0x53, 0x29, 0xfe, 0x7a, 0x15, 0xff, 0xb3, 0x9a, 0xff, 0x8c, 0xbc, 0xfe, 0x96, + 0x01, 0xff, 0x73, 0x43, 0xff, 0x4f, 0x36, 0xff, 0x29, 0x65, 0xff, 0x71, 0x3e, 0xff, 0x8e, 0x04, + 0xff, 0x7a, 0x1f, 0xff, 0x91, 0x0c, 0xff, 0xae, 0x1c, 0xff, 0x07, 0x19, 0xff, 0xbf, 0xe2, 0xfe, + 0x06, 0x0c, 0xff, 0x22, 0x35, 0xff, 0xca, 0x1c, 0x07, 0xde, 0x59, 0x0c, 0x98, 0x4e, 0x08, 0x1b, + 0x64, 0x06, 0x15, 0xc9, 0x05, 0xc5, 0xe4, 0x03, 0x8e, 0xdd, 0x02, 0xef, 0x02, 0x02, 0xe2, 0x8c, + 0x00, 0x23, 0x2e, 0x00, 0xbc, 0x44, 0x00, 0xe1, 0x53, 0xff, 0xb7, 0xc3, 0xff, 0x61, 0x2f, 0x00, + 0x82, 0x4b, 0xff, 0x46, 0xd5, 0xfe, 0x84, 0x3f, 0xff, 0xcd, 0x23, 0xff, 0x46, 0x0d, 0xff, 0x77, + 0x4a, 0xff, 0x8a, 0x06, 0xff, 0x28, 0x41, 0xff, 0xfe, 0x2f, 0xff, 0x8a, 0x1e, 0xff, 0x90, 0x25, + 0xff, 0x59, 0x12, 0xff, 0x55, 0x12, 0xff, 0x5d, 0x0e, 0xff, 0xaa, 0x1b, 0xff, 0xdf, 0x0a, 0xff, + 0x57, 0x3d, 0xff, 0xe3, 0x2c, 0xff, 0x78, 0xd4, 0x07, 0x99, 0x74, 0x0c, 0x6b, 0x86, 0x07, 0xe2, + 0x48, 0x05, 0xc7, 0x7e, 0x04, 0x34, 0xbc, 0x03, 0x20, 0xcb, 0x03, 0xb9, 0x4d, 0x02, 0x57, 0xbb, + 0x00, 0x52, 0xba, 0x01, 0xe9, 0xbb, 0x00, 0x4b, 0x14, 0xff, 0x1a, 0x11, 0xff, 0x9a, 0x82, 0xff, + 0xee, 0x57, 0x00, 0x13, 0x7c, 0xff, 0x9c, 0x65, 0xfe, 0x93, 0x2d, 0xff, 0x32, 0xd5, 0xff, 0x6f, + 0x2e, 0xff, 0x56, 0x2f, 0xff, 0xd0, 0x3c, 0xff, 0x61, 0xf8, 0xfe, 0x10, 0x39, 0xff, 0x61, 0x0f, + 0xff, 0xda, 0x24, 0xff, 0x74, 0x34, 0xff, 0x92, 0x2d, 0xff, 0x0c, 0x2f, 0xff, 0x94, 0x29, 0xff, + 0x95, 0x50, 0xff, 0xb6, 0x4e, 0xff, 0x90, 0x10, 0x07, 0xf2, 0x23, 0x0b, 0xc4, 0x7c, 0x06, 0xf6, + 0x66, 0x04, 0x42, 0x3f, 0x04, 0x8f, 0x2b, 0x03, 0x44, 0x0c, 0x03, 0x69, 0xb1, 0x03, 0xe0, 0x36, + 0x02, 0xcd, 0xda, 0x01, 0x25, 0x72, 0x02, 0x1c, 0x34, 0x00, 0x5a, 0x4c, 0xff, 0xbf, 0xf6, 0xff, + 0x0c, 0x89, 0xff, 0x97, 0x0e, 0xff, 0xbe, 0x9b, 0xff, 0xaf, 0xa0, 0xff, 0x4b, 0x04, 0xff, 0x14, + 0x7e, 0xff, 0x8e, 0x9c, 0xff, 0x77, 0xed, 0xfe, 0xd2, 0xcc, 0xfe, 0x8c, 0x2b, 0xff, 0xd3, 0x28, + 0xff, 0x3c, 0x35, 0xff, 0x27, 0x53, 0xff, 0xff, 0x57, 0xff, 0x02, 0x62, 0xff, 0xe2, 0x3c, 0xff, + 0x04, 0x42, 0xff, 0x11, 0x43, 0xff, 0x02, 0x5c, 0x06, 0x1c, 0x2a, 0x09, 0x90, 0x52, 0x05, 0xa6, + 0x95, 0x04, 0x55, 0x9b, 0x03, 0x96, 0x9d, 0x02, 0x74, 0xba, 0x02, 0x75, 0xc6, 0x01, 0x96, 0xcd, + 0x01, 0x3e, 0xe2, 0x03, 0xab, 0x83, 0x03, 0x6d, 0x31, 0x02, 0x3c, 0x76, 0x01, 0x1b, 0x2c, 0x00, + 0xf9, 0x4f, 0x00, 0x13, 0x9c, 0xff, 0x40, 0xa8, 0xfe, 0x34, 0x4e, 0xff, 0xd5, 0xdf, 0xff, 0xfb, + 0x52, 0xff, 0xa4, 0xaf, 0xfe, 0xc1, 0x29, 0xff, 0x28, 0x5b, 0xff, 0xcd, 0xff, 0xfe, 0xaa, 0x25, + 0xff, 0xd0, 0x6d, 0xff, 0x75, 0x78, 0xff, 0x9d, 0x7d, 0xff, 0xd6, 0x3a, 0xff, 0x92, 0x22, 0xff, + 0xc6, 0x17, 0xff, 0xa7, 0x3d, 0xff, 0x0b, 0x48, 0x05, 0xa7, 0xae, 0x06, 0x9b, 0x53, 0x03, 0x9d, + 0x84, 0x04, 0x0e, 0xb5, 0x04, 0x8d, 0xa2, 0x03, 0x71, 0x47, 0x01, 0x00, 0x95, 0xff, 0x9c, 0xc6, + 0x01, 0xbb, 0x48, 0x03, 0xa3, 0xf6, 0x02, 0x52, 0xd2, 0x03, 0xf2, 0xbc, 0x03, 0xeb, 0x04, 0x03, + 0x01, 0x89, 0x02, 0x3b, 0x45, 0x00, 0x62, 0x97, 0xff, 0x4e, 0xb4, 0xff, 0x41, 0xbe, 0xfe, 0xcc, + 0xf8, 0xfe, 0x50, 0xa5, 0xff, 0x6a, 0x39, 0xff, 0x76, 0xe3, 0xfe, 0xd5, 0x63, 0xff, 0x78, 0x9a, + 0xff, 0x20, 0x6e, 0xff, 0x42, 0x41, 0xff, 0xee, 0x9e, 0xff, 0x17, 0x85, 0xff, 0x77, 0x2e, 0xff, + 0x72, 0x2a, 0xff, 0x1d, 0x2d, 0xff, 0xd2, 0x0b, 0x06, 0xe6, 0x8d, 0x07, 0xd0, 0x49, 0x02, 0x85, + 0xe3, 0x02, 0x04, 0x0d, 0x04, 0xa5, 0x4d, 0x03, 0x37, 0x2d, 0x01, 0x73, 0x8c, 0xff, 0x96, 0x4b, + 0x01, 0x7d, 0x88, 0x02, 0x7f, 0xab, 0x01, 0xd6, 0x15, 0x02, 0x8e, 0x5e, 0x03, 0x00, 0x38, 0x04, + 0xe8, 0x28, 0x04, 0x18, 0x24, 0x02, 0x13, 0x20, 0x01, 0x82, 0x94, 0x00, 0x7a, 0x99, 0xff, 0xa9, + 0x2b, 0xff, 0x57, 0xa2, 0xfe, 0xaa, 0x25, 0xff, 0xac, 0xb6, 0xff, 0x78, 0x3e, 0xff, 0x12, 0x04, + 0xff, 0x8a, 0xb4, 0xff, 0xaa, 0xcc, 0xff, 0x35, 0x63, 0xff, 0x5a, 0x32, 0xff, 0xc2, 0x12, 0xff, + 0x49, 0x58, 0xff, 0x78, 0x4a, 0xff, 0x12, 0x95, 0x06, 0x80, 0x32, 0x08, 0xfc, 0xcb, 0x02, 0xba, + 0x33, 0x03, 0x1c, 0x09, 0x04, 0x33, 0x21, 0x03, 0xe3, 0x6a, 0x00, 0x94, 0xe3, 0xfe, 0x43, 0x10, + 0x02, 0xcc, 0xe0, 0x02, 0x3d, 0x19, 0x00, 0xa3, 0xa1, 0x00, 0xf2, 0x9d, 0x01, 0x31, 0x22, 0x02, + 0x70, 0x83, 0x03, 0xe6, 0xc2, 0x02, 0x7e, 0x65, 0x02, 0x95, 0x8c, 0x02, 0x04, 0xf8, 0x00, 0x83, + 0xbc, 0xff, 0xba, 0x77, 0xff, 0xdb, 0xfc, 0xfe, 0xd1, 0xd8, 0xfe, 0xaa, 0x35, 0xff, 0xb8, 0x83, + 0xff, 0x3d, 0x79, 0xff, 0xab, 0x2f, 0xff, 0x8b, 0xa2, 0xff, 0xd6, 0xa4, 0xff, 0xe4, 0xe2, 0xfe, + 0x61, 0x17, 0xff, 0x8c, 0x7c, 0xff, 0x85, 0x98, 0x07, 0x9c, 0x21, 0x09, 0x87, 0x89, 0x02, 0x90, + 0xba, 0x03, 0xc3, 0x05, 0x05, 0x52, 0xf7, 0x02, 0x2c, 0x6a, 0xff, 0x06, 0x36, 0xfe, 0x2b, 0xa8, + 0x02, 0x01, 0xce, 0x02, 0x49, 0x78, 0xff, 0xb1, 0x68, 0x00, 0xaa, 0xde, 0x00, 0x15, 0x2a, 0x01, + 0xa7, 0xa6, 0x01, 0xe3, 0xac, 0x00, 0x56, 0xe8, 0x01, 0xe4, 0xf0, 0x02, 0x94, 0xd6, 0x01, 0x74, + 0x82, 0x01, 0x5e, 0xaa, 0x00, 0x80, 0x5c, 0xff, 0xc6, 0x9d, 0xff, 0xdf, 0x28, 0xff, 0x5a, 0xd6, + 0xfe, 0xfb, 0x97, 0xff, 0x8a, 0xa5, 0xff, 0xdb, 0x50, 0xff, 0xca, 0x05, 0xff, 0x83, 0x3f, 0xff, + 0x63, 0x5c, 0xff, 0x3e, 0x30, 0xff, 0xb0, 0x8b, 0x08, 0x2d, 0xba, 0x0a, 0x23, 0xd2, 0x02, 0x8c, + 0x83, 0x03, 0xb6, 0x39, 0x05, 0xeb, 0xf9, 0x02, 0x96, 0xac, 0xfe, 0xf8, 0x15, 0xfe, 0x98, 0x5a, + 0x03, 0xdc, 0x2f, 0x02, 0x3e, 0xac, 0xfe, 0xb1, 0x83, 0x00, 0x18, 0xb1, 0x00, 0x9f, 0xeb, 0x00, + 0xc3, 0x6e, 0x01, 0xf5, 0x8e, 0xff, 0xe9, 0x38, 0x00, 0xdd, 0x9a, 0x01, 0xc6, 0x5d, 0x01, 0x7d, + 0x9b, 0x01, 0x79, 0x59, 0x01, 0xfe, 0xfe, 0x00, 0x48, 0x81, 0x00, 0x35, 0xa4, 0xff, 0xb2, 0x95, + 0xff, 0x99, 0xb8, 0xff, 0x92, 0x38, 0xff, 0xa9, 0x5b, 0xff, 0xbb, 0x5b, 0xff, 0xe1, 0xd6, 0xfe, + 0x07, 0xf9, 0xfe, 0x58, 0x5f, 0xff, 0x2b, 0x91, 0x09, 0xf1, 0xfc, 0x0b, 0x64, 0xe1, 0x02, 0xd3, + 0xe0, 0x03, 0x1b, 0xf2, 0x05, 0x07, 0x96, 0x02, 0xb0, 0x51, 0xfd, 0x40, 0x31, 0xfe, 0x0c, 0x39, + 0x04, 0x54, 0x8c, 0x01, 0x14, 0x2f, 0xfe, 0xd7, 0x65, 0x00, 0xf8, 0x5c, 0x00, 0xa8, 0xb6, 0x00, + 0xa6, 0x71, 0x01, 0x13, 0x64, 0xff, 0x86, 0xb5, 0xff, 0xab, 0xcf, 0x00, 0x20, 0xfc, 0xff, 0xf7, + 0x56, 0x00, 0xb6, 0xc3, 0x00, 0x03, 0x04, 0x01, 0x01, 0x37, 0x01, 0x00, 0xe2, 0x00, 0xb2, 0x7f, + 0x00, 0xb4, 0x2d, 0x00, 0xac, 0xf9, 0xff, 0xce, 0x8b, 0xff, 0x0c, 0xd6, 0xfe, 0xf7, 0xcf, 0xfe, + 0xac, 0x2c, 0xff, 0xcf, 0x0c, 0xff, 0x24, 0x28, 0x0b, 0xe9, 0xd2, 0x0d, 0x9d, 0xaa, 0x02, 0x3e, + 0x85, 0x03, 0x71, 0x48, 0x06, 0xbe, 0x25, 0x02, 0x35, 0x84, 0xfc, 0x2f, 0xc0, 0xfe, 0xc9, 0x63, + 0x04, 0x13, 0x97, 0x00, 0xa4, 0xf0, 0xfd, 0x60, 0x83, 0x00, 0x06, 0x26, 0x00, 0xbc, 0x82, 0x00, + 0x7a, 0x42, 0x01, 0x54, 0x30, 0xff, 0x33, 0x9c, 0xff, 0xe2, 0x95, 0x00, 0xbe, 0x75, 0xff, 0x4d, + 0xc0, 0xff, 0xc2, 0x8f, 0xff, 0x30, 0xdf, 0xff, 0x5f, 0xb9, 0x00, 0x72, 0xa6, 0x00, 0x9b, 0x49, + 0x01, 0xf7, 0x8d, 0x01, 0xfe, 0x87, 0x00, 0xf8, 0xe3, 0xff, 0x77, 0x86, 0xff, 0x85, 0xcc, 0xfe, + 0x81, 0xc0, 0xfe, 0xb1, 0x27, 0xff, 0xbb, 0x71, 0x0c, 0xa6, 0x53, 0x0f, 0xd1, 0xc5, 0x02, 0x0d, + 0xac, 0x03, 0x87, 0xd8, 0x06, 0x67, 0x88, 0x01, 0x93, 0x30, 0xfb, 0x11, 0xa0, 0xff, 0x73, 0x20, + 0x05, 0x60, 0x58, 0xff, 0x0b, 0xac, 0xfd, 0x4f, 0xbc, 0x00, 0xdf, 0xba, 0xff, 0xe8, 0x6a, 0x00, + 0x85, 0x67, 0x01, 0xff, 0x06, 0xff, 0xf9, 0x61, 0xff, 0x71, 0x75, 0x00, 0xb1, 0x56, 0xff, 0x31, + 0x89, 0xff, 0xa4, 0x1d, 0xff, 0x70, 0x56, 0xff, 0x80, 0x9d, 0xff, 0x0a, 0xab, 0xff, 0xe0, 0xf9, + 0x00, 0x48, 0x89, 0x01, 0x0d, 0x54, 0x01, 0x47, 0xe3, 0x00, 0x81, 0xf0, 0xff, 0xe9, 0x62, 0xff, + 0x33, 0x83, 0xff, 0xf2, 0x06, 0xff, 0x71, 0x01, 0x0e, 0xfe, 0xd8, 0x10, 0xf8, 0x78, 0x02, 0xf2, + 0x00, 0x04, 0xc2, 0x87, 0x07, 0xb8, 0x51, 0x00, 0xfc, 0xf5, 0xf9, 0x0d, 0x0f, 0x01, 0x60, 0x5e, + 0x05, 0x70, 0xf9, 0xfd, 0x48, 0x8c, 0xfd, 0x3f, 0xda, 0x00, 0x6d, 0xa1, 0xff, 0x77, 0x12, 0x00, + 0x84, 0x3e, 0x01, 0x5c, 0xfb, 0xfe, 0x7c, 0x39, 0xff, 0xba, 0x66, 0x00, 0x3a, 0x35, 0xff, 0x72, + 0x51, 0xff, 0xf5, 0xcd, 0xfe, 0xa9, 0xfc, 0xfe, 0x18, 0x47, 0xff, 0x3d, 0x1a, 0xff, 0x5e, 0x22, + 0x00, 0xea, 0xd4, 0x00, 0x4d, 0xcd, 0x00, 0xe7, 0xc3, 0x00, 0xe9, 0xce, 0x00, 0xa0, 0x21, 0x00, + 0xce, 0xcf, 0xff, 0x85, 0x7c, 0xff, 0x46, 0x33, 0x0f, 0x00, 0x1a, 0x12, 0x9a, 0xe2, 0x02, 0x08, + 0x6f, 0x04, 0xe8, 0x0b, 0x08, 0x9b, 0x7c, 0xff, 0x19, 0x74, 0xf8, 0xb0, 0x6c, 0x02, 0xf4, 0x2c, + 0x06, 0x58, 0x6a, 0xfc, 0xfd, 0x4d, 0xfd, 0x07, 0x2e, 0x01, 0xe8, 0x93, 0xff, 0x09, 0xd4, 0xff, + 0xad, 0x16, 0x01, 0xd5, 0x01, 0xff, 0x42, 0xe7, 0xfe, 0x2f, 0x6f, 0x00, 0x32, 0x5c, 0xff, 0x55, + 0x13, 0xff, 0x83, 0x90, 0xfe, 0x01, 0xe8, 0xfe, 0xf5, 0x0d, 0xff, 0xb5, 0xcd, 0xfe, 0x8c, 0xd6, + 0xff, 0x25, 0x36, 0x00, 0xeb, 0x43, 0x00, 0xfe, 0x42, 0x00, 0x70, 0x4d, 0x00, 0x16, 0x26, 0x00, + 0x2e, 0x68, 0x00, 0x1a, 0x0f, 0x00, 0xc0, 0x4d, 0x10, 0x12, 0xb5, 0x13, 0x19, 0x50, 0x03, 0x82, + 0x80, 0x04, 0x32, 0x7a, 0x08, 0x43, 0x1b, 0xff, 0xfc, 0x10, 0xf7, 0xa4, 0x67, 0x03, 0x16, 0xe3, + 0x06, 0x6d, 0x08, 0xfb, 0xd0, 0x49, 0xfd, 0xe3, 0x79, 0x01, 0x07, 0x5e, 0xff, 0x26, 0xad, 0xff, + 0x84, 0xd8, 0x00, 0x4a, 0x3c, 0xff, 0x1f, 0xd9, 0xfe, 0x2f, 0x00, 0x00, 0x7d, 0x78, 0xff, 0xa2, + 0xf9, 0xfe, 0x27, 0x74, 0xfe, 0x53, 0x02, 0xff, 0x91, 0xc8, 0xfe, 0xaf, 0x82, 0xfe, 0xec, 0x93, + 0xff, 0x1a, 0x03, 0x00, 0x4b, 0x37, 0x00, 0x25, 0xc4, 0xff, 0x35, 0x9f, 0xff, 0xf1, 0x8c, 0xff, + 0x7b, 0x07, 0x00, 0x9f, 0x5b, 0x00, 0x24, 0x19, 0x12, 0x11, 0xb8, 0x15, 0x0b, 0x61, 0x02, 0xa6, + 0xe2, 0x04, 0x19, 0xed, 0x08, 0x5c, 0xdf, 0xfd, 0x60, 0x05, 0xf7, 0x3b, 0x0b, 0x04, 0x82, 0x9b, + 0x06, 0x78, 0x43, 0xfa, 0xb1, 0x68, 0xfd, 0xa7, 0xa3, 0x01, 0x57, 0x2a, 0xff, 0x95, 0x57, 0xff, + 0x92, 0xd1, 0x00, 0x9f, 0x80, 0xff, 0xe8, 0x8a, 0xfe, 0xac, 0xaa, 0xff, 0x09, 0x88, 0xff, 0x03, + 0xe8, 0xfe, 0xfb, 0x4c, 0xfe, 0x9b, 0xfc, 0xfe, 0x99, 0x84, 0xfe, 0x0c, 0x52, 0xfe, 0xe9, 0xbb, + 0xff, 0xe9, 0xc0, 0xff, 0xcd, 0xf5, 0xff, 0x00, 0x86, 0xff, 0xf8, 0x2b, 0xff, 0x4e, 0x5a, 0xff, + 0x31, 0xa7, 0xff, 0x73, 0x95, 0xff, 0xdb, 0x72, 0x13, 0xbf, 0x37, 0x17, 0x18, 0x41, 0x02, 0x4f, + 0x82, 0x05, 0x2e, 0x31, 0x09, 0x6b, 0xf5, 0xfc, 0xd1, 0xae, 0xf6, 0x13, 0x45, 0x04, 0x75, 0xe6, + 0x06, 0xb8, 0x95, 0xf9, 0x01, 0x10, 0xfd, 0xf6, 0xe4, 0x01, 0x07, 0x10, 0xff, 0x2c, 0x12, 0xff, + 0x58, 0xd1, 0x00, 0xfe, 0xa5, 0xff, 0x16, 0x31, 0xfe, 0x34, 0x5d, 0xff, 0x14, 0xa9, 0xff, 0x92, + 0x01, 0xff, 0x69, 0xeb, 0xfd, 0x7a, 0x9a, 0xfe, 0x38, 0x9b, 0xfe, 0xe5, 0x4b, 0xfe, 0xf2, 0x9f, + 0xff, 0xe6, 0xb0, 0xff, 0x14, 0x88, 0xff, 0x5b, 0x68, 0xff, 0x41, 0x24, 0xff, 0xeb, 0x07, 0xff, + 0xf4, 0x56, 0xff, 0x52, 0x34, 0xff, 0x6b, 0x13, 0x14, 0xdf, 0x4b, 0x18, 0xcf, 0xd9, 0x02, 0x61, + 0x95, 0x06, 0x89, 0x83, 0x09, 0x97, 0x05, 0xfc, 0xad, 0x6d, 0xf6, 0xbf, 0x29, 0x04, 0xb4, 0x34, + 0x07, 0x30, 0x71, 0xf9, 0xc8, 0x4d, 0xfc, 0x84, 0xf8, 0x01, 0x7f, 0x5c, 0xff, 0x8b, 0xde, 0xfe, + 0x4c, 0x63, 0x00, 0x61, 0xec, 0xff, 0x31, 0x2c, 0xfe, 0x52, 0xe8, 0xfe, 0x22, 0xde, 0xff, 0x1e, + 0xb9, 0xfe, 0x83, 0x8d, 0xfd, 0xb1, 0xa6, 0xfe, 0xa1, 0x9a, 0xfe, 0xd5, 0x41, 0xfe, 0x9c, 0x21, + 0xff, 0x0a, 0x60, 0xff, 0xdc, 0xff, 0xff, 0x13, 0x5c, 0xff, 0x2d, 0xb1, 0xfe, 0xe5, 0xc3, 0xfe, + 0x99, 0x56, 0xff, 0x8f, 0x09, 0xff, 0x28, 0x99, 0x14, 0x4c, 0x28, 0x19, 0xf7, 0x10, 0x04, 0xd5, + 0x16, 0x07, 0x11, 0x26, 0x09, 0x70, 0x85, 0xfc, 0xfa, 0x7c, 0xf6, 0xa2, 0xf5, 0x02, 0xfa, 0x5e, + 0x07, 0xee, 0xc1, 0xf9, 0xa6, 0x71, 0xfb, 0x0e, 0x57, 0x02, 0x1d, 0x8c, 0xff, 0xd3, 0x46, 0xfe, + 0xa5, 0x42, 0x00, 0x37, 0xf6, 0xff, 0x40, 0xd1, 0xfe, 0x96, 0x93, 0xfe, 0x95, 0xf8, 0xfe, 0x86, + 0xf3, 0xfe, 0x05, 0x74, 0xfd, 0x80, 0x6a, 0xfe, 0xe4, 0xae, 0xfe, 0x52, 0xfc, 0xfd, 0x2a, 0xba, + 0xfe, 0x5e, 0x6a, 0xff, 0x54, 0x0c, 0x00, 0x50, 0x6a, 0xff, 0x0e, 0xa3, 0xfe, 0x72, 0x9c, 0xfe, + 0x55, 0xe1, 0xfe, 0x59, 0x76, 0xfe, 0x6d, 0x42, 0x15, 0x1c, 0x4a, 0x19, 0xe1, 0xaa, 0x05, 0x96, + 0xb4, 0x07, 0xc7, 0x14, 0x08, 0x84, 0x24, 0xfe, 0x16, 0xc6, 0xf6, 0x03, 0x21, 0x01, 0x93, 0x0a, + 0x07, 0xb0, 0x8c, 0xfa, 0x90, 0x31, 0xfb, 0x0f, 0xd7, 0x01, 0x97, 0xe7, 0xff, 0xb2, 0xf4, 0xfd, + 0x01, 0xbc, 0xff, 0xe8, 0x7c, 0x00, 0x7e, 0x58, 0xff, 0x24, 0xfb, 0xfd, 0x32, 0x62, 0xfe, 0xd6, + 0x22, 0xff, 0xb8, 0x59, 0xfd, 0xca, 0x30, 0xfe, 0xeb, 0x05, 0xfe, 0xbb, 0x0b, 0xfe, 0x07, 0x1e, + 0xff, 0xb3, 0xeb, 0xfe, 0x21, 0xea, 0xff, 0xdf, 0xa9, 0xff, 0xc1, 0xc2, 0xfe, 0x68, 0x10, 0xfe, + 0x34, 0x63, 0xfe, 0xec, 0x72, 0xfe, 0x99, 0x46, 0x16, 0xc8, 0x25, 0x18, 0xe4, 0xa5, 0x06, 0xe2, + 0x06, 0x0a, 0xf6, 0x75, 0x07, 0xea, 0x76, 0xfe, 0xd3, 0xc3, 0xf6, 0x3e, 0xb1, 0x00, 0xd5, 0xdc, + 0x05, 0x4c, 0xcf, 0xfa, 0x10, 0xf4, 0xfb, 0xb5, 0x75, 0x00, 0x0a, 0xd5, 0xff, 0xc5, 0xa5, 0xfe, + 0x7f, 0xf5, 0xfe, 0xbe, 0x56, 0x00, 0x22, 0x05, 0x00, 0x36, 0x9e, 0xfd, 0xba, 0xf0, 0xfd, 0xb9, + 0x7b, 0xff, 0xb8, 0xb3, 0xfc, 0xdc, 0x7c, 0xfd, 0x0f, 0xcb, 0xfd, 0x54, 0x2d, 0xfe, 0x2b, 0x1a, + 0xff, 0x01, 0x9d, 0xfe, 0x10, 0xc0, 0xff, 0x6b, 0xee, 0xff, 0xaf, 0x6b, 0xfe, 0x43, 0x8b, 0xfd, + 0x39, 0x8c, 0xfe, 0xf4, 0xa5, 0xfd, 0xff, 0x52, 0x17, 0xea, 0x08, 0x16, 0xbe, 0x72, 0x06, 0x08, + 0xb0, 0x0e, 0xd2, 0xc7, 0x08, 0xd2, 0x57, 0xfc, 0x04, 0x5f, 0xf6, 0x8a, 0x61, 0x03, 0xc8, 0xc7, + 0x03, 0x57, 0x5b, 0xf9, 0x1f, 0x91, 0xfe, 0xe3, 0x3e, 0xff, 0x27, 0xcc, 0xfe, 0x31, 0x60, 0x00, + 0x65, 0x0c, 0xfe, 0x11, 0xb4, 0xff, 0x51, 0x44, 0x01, 0xf9, 0x8e, 0xfd, 0x3b, 0xde, 0xfd, 0xc4, + 0xa7, 0xff, 0x00, 0xfa, 0xfb, 0x75, 0x49, 0xfd, 0x96, 0xae, 0xfd, 0xb1, 0xd2, 0xfd, 0x68, 0x4f, + 0xff, 0x67, 0x7c, 0xfe, 0x77, 0xcb, 0xff, 0xaf, 0x69, 0xff, 0xd7, 0xc0, 0xfe, 0x71, 0xb0, 0xfd, + 0x10, 0xd6, 0xfd, 0x05, 0xcf, 0xfd, 0x3c, 0xc2, 0x19, 0x23, 0x93, 0x14, 0x9a, 0x83, 0x03, 0xc5, + 0x68, 0x13, 0x44, 0x9f, 0x0a, 0x66, 0xc4, 0xf8, 0x70, 0x8d, 0xf7, 0x70, 0x6d, 0x06, 0xbf, 0xf4, + 0xff, 0x94, 0xb0, 0xf7, 0x16, 0xeb, 0x01, 0xee, 0xc5, 0xfe, 0xf8, 0xb1, 0xfc, 0x9b, 0x43, 0x01, + 0x09, 0x33, 0xfe, 0xf5, 0xe1, 0xfe, 0x2b, 0x2c, 0x02, 0x3c, 0x75, 0xfd, 0x97, 0x8e, 0xfd, 0xd0, + 0xc4, 0xff, 0xcf, 0xe1, 0xfb, 0x66, 0xea, 0xfc, 0x9f, 0xbd, 0xfc, 0x1e, 0xc6, 0xfd, 0x05, 0xc1, + 0xff, 0xfe, 0x07, 0xfe, 0xd5, 0x1a, 0xff, 0x11, 0x98, 0xff, 0x27, 0x97, 0xfe, 0x8a, 0xa0, 0xfd, + 0x79, 0x3c, 0xfe, 0x22, 0x51, 0xfd, 0xc8, 0xcf, 0x1c, 0xb6, 0x7a, 0x14, 0x23, 0x43, 0xff, 0x49, + 0xf1, 0x15, 0x99, 0xd4, 0x0d, 0x1c, 0xec, 0xf5, 0x52, 0x5c, 0xf8, 0x9e, 0xd8, 0x09, 0x37, 0x3f, + 0xfc, 0x13, 0x53, 0xf5, 0x6e, 0x71, 0x05, 0xea, 0x6d, 0xff, 0x81, 0x1d, 0xfa, 0xb1, 0x5b, 0x01, + 0x22, 0x82, 0xff, 0x72, 0xb8, 0xfd, 0x51, 0xb1, 0x02, 0x0b, 0xfc, 0xfd, 0x05, 0x03, 0xfd, 0xb2, + 0x10, 0x00, 0x77, 0x06, 0xfc, 0xa9, 0x54, 0xfc, 0x28, 0x2d, 0xfc, 0xab, 0xf8, 0xfd, 0xf9, 0x8c, + 0xff, 0xb8, 0x78, 0xfd, 0x2f, 0xaf, 0xfe, 0xc1, 0xbb, 0xff, 0xfc, 0x86, 0xfe, 0x46, 0xdc, 0xfd, + 0x32, 0x5d, 0xfe, 0x56, 0xed, 0xfc, 0xb4, 0x5f, 0x1f, 0xae, 0x1d, 0x16, 0x08, 0x5a, 0xfa, 0x76, + 0x15, 0x16, 0xaa, 0x7b, 0x12, 0x16, 0x55, 0xf4, 0x98, 0x31, 0xf8, 0xb7, 0x79, 0x0d, 0x53, 0xaa, + 0xf9, 0x29, 0xaa, 0xf1, 0xff, 0x70, 0x08, 0x99, 0xad, 0x01, 0x8f, 0xe2, 0xf7, 0xf2, 0xdc, 0xff, + 0x12, 0x52, 0x01, 0xaf, 0x5f, 0xfd, 0xaa, 0x60, 0x02, 0x6e, 0x1c, 0xff, 0xac, 0x5c, 0xfc, 0x1a, + 0x52, 0x00, 0xc9, 0x21, 0xfc, 0xc1, 0x5d, 0xfc, 0xb5, 0xe9, 0xfb, 0xd2, 0x37, 0xfd, 0xbb, 0x6a, + 0xff, 0xf1, 0x46, 0xfd, 0xbc, 0x4b, 0xfe, 0x6b, 0x85, 0xff, 0x89, 0x0b, 0xff, 0xa8, 0xb3, 0xfd, + 0xb8, 0xab, 0xfe, 0xd5, 0x39, 0xfd, 0x27, 0x01, 0x22, 0x6f, 0xff, 0x17, 0xda, 0xe7, 0xf5, 0x5c, + 0x4a, 0x14, 0xf2, 0xd2, 0x16, 0x9d, 0x0e, 0xf4, 0x75, 0x88, 0xf7, 0xa1, 0x01, 0x11, 0x0a, 0xc3, + 0xf7, 0x69, 0x4d, 0xed, 0x81, 0x2c, 0x0a, 0xf9, 0xd8, 0x04, 0xea, 0xa0, 0xf6, 0x22, 0x3a, 0xfd, + 0xd5, 0x3a, 0x02, 0x65, 0x23, 0xfe, 0xec, 0xa2, 0x01, 0xa5, 0x02, 0x00, 0xca, 0x1b, 0xfc, 0x8a, + 0xdc, 0xff, 0xba, 0xb2, 0xfc, 0x52, 0x38, 0xfc, 0xa0, 0x76, 0xfb, 0x49, 0xac, 0xfc, 0xd7, 0xc0, + 0xfe, 0xdc, 0x11, 0xfd, 0x75, 0x76, 0xfe, 0x0e, 0x0f, 0xff, 0x7c, 0x18, 0xff, 0xe5, 0xdb, 0xfd, + 0x45, 0x12, 0xff, 0xcb, 0xa3, 0xfd, 0xcd, 0x9e, 0x25, 0xc7, 0xf3, 0x18, 0x83, 0x3a, 0xf2, 0x13, + 0x2c, 0x12, 0xd7, 0x5e, 0x19, 0x1e, 0xb0, 0xf4, 0x6b, 0xa0, 0xf7, 0xd5, 0x80, 0x14, 0x17, 0xb3, + 0xf5, 0x45, 0x92, 0xe9, 0xe8, 0x96, 0x0a, 0x90, 0x11, 0x08, 0x5b, 0xda, 0xf6, 0x91, 0x5d, 0xfa, + 0xfe, 0xed, 0x01, 0x88, 0x78, 0xff, 0x8b, 0x79, 0x01, 0xd5, 0x4c, 0x00, 0x21, 0x79, 0xfc, 0x36, + 0x28, 0xff, 0x84, 0x3d, 0xfd, 0xb5, 0xd8, 0xfb, 0x9f, 0x31, 0xfb, 0x98, 0x55, 0xfc, 0x1f, 0x03, + 0xfe, 0x8b, 0x20, 0xfd, 0xc9, 0x66, 0xfe, 0x76, 0x19, 0xff, 0xba, 0xc2, 0xfe, 0xb4, 0x48, 0xfe, + 0x44, 0x79, 0xff, 0xa1, 0xa5, 0xfd, 0x0a, 0x83, 0x29, 0xec, 0xaa, 0x19, 0xcc, 0xdc, 0xee, 0x33, + 0x79, 0x10, 0xdb, 0xe7, 0x19, 0x36, 0xc1, 0xf5, 0x23, 0xbb, 0xf8, 0xab, 0xc5, 0x17, 0xf9, 0xc6, + 0xf3, 0x55, 0x9b, 0xe6, 0x51, 0xc3, 0x09, 0xd3, 0xa7, 0x0a, 0x06, 0x7f, 0xf8, 0x14, 0xdf, 0xf7, + 0x28, 0x94, 0x00, 0x54, 0x7d, 0x00, 0x70, 0x51, 0x02, 0xb5, 0x1b, 0x00, 0xad, 0x1d, 0xfd, 0x57, + 0xbd, 0xfe, 0xb0, 0xc7, 0xfc, 0xa6, 0x1f, 0xfc, 0xf2, 0xc9, 0xfa, 0x47, 0xea, 0xfb, 0x8f, 0xfc, + 0xfd, 0x8a, 0xd5, 0xfc, 0x91, 0x25, 0xfe, 0x1d, 0xb8, 0xff, 0x4c, 0xa1, 0xfe, 0x15, 0x1c, 0xfe, + 0x56, 0xc7, 0xff, 0xa9, 0xc2, 0xfd, 0xfb, 0xae, 0x2e, 0x53, 0xd5, 0x18, 0x88, 0xbc, 0xeb, 0x93, + 0x10, 0x10, 0x61, 0x93, 0x18, 0xd9, 0x84, 0xf5, 0x39, 0x9d, 0xfb, 0x49, 0xea, 0x1a, 0x99, 0xd6, + 0xf0, 0xad, 0xf3, 0xe4, 0x8d, 0x8f, 0x08, 0xef, 0xda, 0x0b, 0x33, 0x8b, 0xfa, 0x32, 0x76, 0xf6, + 0xba, 0xab, 0xfe, 0x49, 0x9e, 0x00, 0xee, 0xe7, 0x03, 0x50, 0xdc, 0xff, 0x35, 0xce, 0xfd, 0x8b, + 0xed, 0xfd, 0xad, 0xfc, 0xfb, 0x48, 0xcc, 0xfc, 0x24, 0xd9, 0xf9, 0xf2, 0x56, 0xfc, 0xa8, 0x84, + 0xfd, 0xcc, 0x5b, 0xfc, 0xfa, 0x94, 0xfe, 0xc0, 0x22, 0x00, 0x82, 0x86, 0xfe, 0xc6, 0xb5, 0xfd, + 0x13, 0xac, 0xff, 0x04, 0x00, 0xfe, 0x82, 0x97, 0x33, 0x2c, 0x86, 0x18, 0xcc, 0x69, 0xe8, 0x9f, + 0x89, 0x10, 0x88, 0x60, 0x16, 0xe2, 0xa7, 0xf4, 0x8b, 0xfc, 0xfe, 0x35, 0x2e, 0x1e, 0x56, 0xba, + 0xee, 0x09, 0x56, 0xe3, 0x2a, 0x6b, 0x07, 0xce, 0x56, 0x0c, 0x8b, 0x6d, 0xfc, 0x1c, 0x3d, 0xf6, + 0x7c, 0xd3, 0xfc, 0xa5, 0xe2, 0xff, 0xa0, 0xba, 0x05, 0xc7, 0x5e, 0x00, 0x66, 0xf5, 0xfd, 0xbd, + 0x29, 0xfd, 0x30, 0x88, 0xfb, 0x87, 0x12, 0xfd, 0x4e, 0xbd, 0xf9, 0x5d, 0x8c, 0xfc, 0x03, 0xdb, + 0xfc, 0x2f, 0x7b, 0xfc, 0x65, 0xf1, 0xfe, 0x31, 0xa0, 0x00, 0x2c, 0x70, 0xfe, 0x0f, 0xf4, 0xfc, + 0x46, 0xab, 0xff, 0x32, 0x88, 0xfe, 0xf5, 0x62, 0x39, 0x4b, 0xfd, 0x18, 0x19, 0x09, 0xe3, 0xbc, + 0x0d, 0x10, 0x23, 0xe4, 0x15, 0x5b, 0xcf, 0xf4, 0xe7, 0x7c, 0x00, 0xed, 0x59, 0x1f, 0x75, 0x76, + 0xee, 0x3f, 0x83, 0xe2, 0x00, 0x90, 0x06, 0xf2, 0x1c, 0x0c, 0xe1, 0xda, 0xfc, 0xe8, 0xe5, 0xf6, + 0x3f, 0xe2, 0xfb, 0x17, 0x85, 0xfe, 0x0b, 0x63, 0x07, 0xfc, 0x3a, 0x01, 0x48, 0xcb, 0xfc, 0xda, + 0x47, 0xfd, 0xa3, 0x79, 0xfb, 0x8a, 0xa8, 0xfc, 0x3f, 0x09, 0xfa, 0xe8, 0x31, 0xfc, 0x03, 0xf6, + 0xfc, 0x5d, 0xce, 0xfc, 0xc0, 0xcd, 0xfe, 0x5e, 0x10, 0x01, 0x27, 0x3b, 0xfe, 0x00, 0x4d, 0xfc, + 0x8e, 0xd7, 0xff, 0x3f, 0x06, 0xff, 0x14, 0x9a, 0x3e, 0x4f, 0x40, 0x1a, 0x57, 0x77, 0xdd, 0xe8, + 0xd6, 0x0f, 0x62, 0x6a, 0x15, 0xa7, 0xcc, 0xf4, 0xa1, 0x0d, 0x01, 0xeb, 0x44, 0x20, 0xd5, 0xdb, + 0xef, 0x89, 0x09, 0xe1, 0x04, 0xfd, 0x05, 0xce, 0x1c, 0x0c, 0x16, 0x43, 0xfc, 0x6c, 0xe5, 0xf7, + 0xe1, 0x0b, 0xfc, 0xff, 0x6d, 0xfc, 0x28, 0x82, 0x08, 0x91, 0x89, 0x02, 0x99, 0x2a, 0xfb, 0x39, + 0x21, 0xfe, 0x8b, 0x7f, 0xfb, 0xc9, 0x0d, 0xfc, 0x7f, 0x87, 0xfa, 0xd7, 0xed, 0xfb, 0x84, 0x41, + 0xfd, 0x29, 0x09, 0xfd, 0xa5, 0xcb, 0xfe, 0xfb, 0x18, 0x01, 0x37, 0xfd, 0xfd, 0x72, 0x06, 0xfc, + 0x9e, 0x46, 0x00, 0x38, 0x14, 0xff, 0xb9, 0x9b, 0x43, 0x64, 0xdc, 0x1a, 0x87, 0x31, 0xd9, 0x52, + 0xeb, 0x0f, 0xd5, 0x93, 0x14, 0x3b, 0x3b, 0xf4, 0x98, 0xe5, 0x00, 0x0d, 0x47, 0x21, 0x3c, 0x52, + 0xf2, 0x4f, 0x4b, 0xdf, 0x77, 0x52, 0x05, 0x05, 0x4d, 0x0c, 0xd3, 0x41, 0xfb, 0x6b, 0x0c, 0xf9, + 0x31, 0xc7, 0xfc, 0x52, 0x19, 0xfa, 0xa7, 0xd8, 0x08, 0x18, 0xe4, 0x03, 0xa1, 0x16, 0xfa, 0x2d, + 0x0a, 0xff, 0x23, 0x6c, 0xfb, 0x9d, 0x98, 0xfb, 0x58, 0x42, 0xfb, 0xd7, 0xaf, 0xfb, 0x59, 0x47, + 0xfd, 0xfc, 0x72, 0xfd, 0xee, 0xb5, 0xfe, 0x8e, 0xf6, 0x00, 0xc9, 0xb0, 0xfd, 0xe0, 0xef, 0xfb, + 0x5c, 0x06, 0x01, 0x10, 0x6d, 0xfe, 0xef, 0x93, 0x46, 0x31, 0xe8, 0x1c, 0xed, 0xf4, 0xd5, 0xaf, + 0xc0, 0x0f, 0x61, 0x6d, 0x13, 0x41, 0x90, 0xf3, 0x46, 0xf6, 0xfe, 0x3c, 0xb1, 0x22, 0xfd, 0x1d, + 0xf6, 0x96, 0x24, 0xdd, 0x52, 0x17, 0x04, 0x10, 0x54, 0x0c, 0x12, 0xc5, 0xfa, 0xcb, 0xce, 0xf9, + 0x0c, 0x87, 0xfd, 0x27, 0x08, 0xf8, 0x7f, 0xfc, 0x07, 0xfa, 0x3d, 0x05, 0xc4, 0xe7, 0xf9, 0x02, + 0x4b, 0xff, 0x38, 0xb5, 0xfb, 0x28, 0x77, 0xfb, 0xd0, 0xac, 0xfb, 0xb3, 0x70, 0xfb, 0x18, 0x3b, + 0xfd, 0xf9, 0xc0, 0xfd, 0xbf, 0x9b, 0xfe, 0x12, 0x88, 0x00, 0x4a, 0x95, 0xfd, 0x57, 0x0a, 0xfc, + 0xa7, 0x1b, 0x01, 0x60, 0xb8, 0xfd, 0xba, 0xf8, 0x48, 0x83, 0x71, 0x1e, 0x02, 0xac, 0xd4, 0xec, + 0x4b, 0x0f, 0x0e, 0x43, 0x12, 0xac, 0x90, 0xf2, 0x39, 0xdf, 0xfb, 0x95, 0x97, 0x24, 0x49, 0xd4, + 0xf9, 0x6f, 0xdd, 0xdb, 0xd7, 0xb1, 0x02, 0x3b, 0x90, 0x0b, 0x1b, 0x47, 0xfb, 0xa7, 0x64, 0xfa, + 0xb0, 0xc7, 0xfd, 0x4a, 0xd1, 0xf6, 0x86, 0x78, 0x06, 0xb7, 0xf6, 0x05, 0x6a, 0xf2, 0xfa, 0x5e, + 0xcd, 0xfe, 0x14, 0x71, 0xfc, 0x0f, 0x0d, 0xfc, 0xdd, 0x35, 0xfb, 0xe5, 0xa9, 0xfb, 0xc0, 0x2c, + 0xfd, 0x3f, 0xfb, 0xfd, 0x4a, 0x6b, 0xfe, 0xc8, 0xe5, 0xff, 0x95, 0xdb, 0xfd, 0x92, 0xfe, 0xfb, + 0xe7, 0x50, 0x00, 0xf2, 0xbe, 0xfd, 0x85, 0xcf, 0x4a, 0x65, 0x22, 0x1f, 0x79, 0x7f, 0xd5, 0x44, + 0xac, 0x0e, 0x5b, 0x45, 0x11, 0x3b, 0x21, 0xf1, 0x88, 0x23, 0xf8, 0x21, 0x9d, 0x26, 0x82, 0xfb, + 0xfc, 0xee, 0x05, 0xdc, 0x89, 0x26, 0x01, 0x1d, 0xd8, 0x09, 0x1c, 0xc9, 0xfc, 0xb2, 0x23, 0xfb, + 0xa1, 0x20, 0xfd, 0x06, 0x52, 0xf6, 0x36, 0x13, 0x05, 0x5c, 0xa9, 0x05, 0xc6, 0x18, 0xfd, 0x21, + 0xfd, 0xfd, 0xbd, 0x28, 0xfd, 0x05, 0x7a, 0xfd, 0xa1, 0x1c, 0xfa, 0x02, 0x52, 0xfc, 0x12, 0x27, + 0xfd, 0x66, 0x11, 0xfe, 0x98, 0xf0, 0xfd, 0x57, 0x9e, 0xff, 0xca, 0xc1, 0xfd, 0x0b, 0xa5, 0xfb, + 0x13, 0xf4, 0xff, 0x69, 0xa6, 0xfd, 0x6f, 0xc8, 0x4a, 0x63, 0xc6, 0x20, 0xae, 0xde, 0xd7, 0x66, + 0x0d, 0x0e, 0x14, 0x3e, 0x10, 0x02, 0x0f, 0xef, 0x7b, 0x48, 0xf4, 0xa4, 0xf5, 0x27, 0x92, 0x7f, + 0x00, 0xa5, 0x1c, 0xdd, 0xa1, 0x0b, 0xff, 0x82, 0x9e, 0x07, 0x45, 0x38, 0xff, 0x91, 0x0b, 0xfc, + 0xba, 0x8d, 0xfb, 0x3e, 0x5c, 0xf6, 0xdd, 0x4d, 0x04, 0x1e, 0x2a, 0x04, 0x84, 0xd1, 0xff, 0x86, + 0xb1, 0xfd, 0xfe, 0x1e, 0xfd, 0x11, 0xa1, 0xff, 0xe8, 0x33, 0xf9, 0x1a, 0xcb, 0xfc, 0x26, 0x56, + 0xfd, 0x71, 0x9c, 0xfd, 0x44, 0xd3, 0xfd, 0x98, 0xb5, 0xfe, 0x68, 0x17, 0xfd, 0xad, 0x7d, 0xfc, + 0xd7, 0x4c, 0xff, 0x47, 0x3a, 0xfd, 0x3a, 0x5a, 0x49, 0xae, 0x1b, 0x23, 0x75, 0x00, 0xdb, 0xa7, + 0x4b, 0x0d, 0xae, 0x42, 0x0f, 0x3a, 0x61, 0xed, 0x94, 0x84, 0xf0, 0x0d, 0xe0, 0x26, 0x3a, 0xa6, + 0x04, 0x9f, 0x47, 0xdf, 0x95, 0xae, 0xfc, 0x9c, 0x18, 0x05, 0x4d, 0xb0, 0x01, 0x62, 0xf1, 0xfc, + 0x52, 0xa5, 0xf9, 0x65, 0x0a, 0xf7, 0xe8, 0xc6, 0x03, 0x6c, 0xc4, 0x01, 0xfd, 0x11, 0x02, 0x4f, + 0xec, 0xfe, 0x7d, 0x0c, 0xfc, 0xb4, 0xb0, 0x01, 0x69, 0x74, 0xf9, 0x86, 0x57, 0xfc, 0xfa, 0xe1, + 0xfd, 0x38, 0x55, 0xfd, 0x5d, 0x56, 0xfc, 0xd9, 0x9d, 0xfd, 0x96, 0x6f, 0xfd, 0x77, 0xcf, 0xfc, + 0x2c, 0x28, 0xff, 0x60, 0xf9, 0xfc, 0x74, 0xa4, 0x46, 0x73, 0x42, 0x25, 0x9d, 0x78, 0xdf, 0x85, + 0xb2, 0x0d, 0x9d, 0x7d, 0x0d, 0x9e, 0x9b, 0xeb, 0x8d, 0x20, 0xed, 0x27, 0x20, 0x24, 0x0b, 0xc0, + 0x09, 0x82, 0xa2, 0xe1, 0xcd, 0x0b, 0xfa, 0x11, 0x07, 0x03, 0x21, 0x99, 0x03, 0x47, 0x08, 0xfe, + 0xa9, 0x40, 0xf8, 0x8a, 0xb7, 0xf7, 0x09, 0x60, 0x03, 0xb5, 0x6f, 0xff, 0xa5, 0x17, 0x03, 0xe2, + 0x8a, 0x01, 0x39, 0xe4, 0xfa, 0xd9, 0xad, 0x02, 0x7c, 0x35, 0xfb, 0x08, 0x67, 0xfb, 0x80, 0x87, + 0xfe, 0xc4, 0x02, 0xfc, 0xc2, 0xd9, 0xfa, 0x2d, 0xa8, 0xfd, 0x1a, 0xc7, 0xfc, 0x4a, 0xa7, 0xfd, + 0x21, 0xb1, 0xff, 0xba, 0xa0, 0xfc, 0xee, 0x85, 0x43, 0x03, 0xce, 0x27, 0x57, 0xc9, 0xe3, 0x93, + 0x4a, 0x0d, 0x72, 0xe8, 0x0b, 0xb0, 0xb6, 0xec, 0xcb, 0x3d, 0xe9, 0x49, 0x2a, 0x1e, 0x67, 0xd2, + 0x0f, 0x38, 0x39, 0xe4, 0x3f, 0x18, 0xf8, 0xc3, 0xdb, 0x01, 0x73, 0x5a, 0x03, 0x92, 0xae, 0xff, + 0x5d, 0x45, 0xf8, 0x0b, 0xec, 0xf7, 0x92, 0x43, 0x03, 0x57, 0x3a, 0xfd, 0xdb, 0xfe, 0x02, 0xb7, + 0x7e, 0x04, 0x91, 0x1a, 0xfb, 0x63, 0x0e, 0x02, 0x6f, 0x87, 0xfd, 0x34, 0x43, 0xfb, 0xa5, 0xd6, + 0xfc, 0x0f, 0x50, 0xfc, 0xbc, 0x00, 0xfa, 0x66, 0xc8, 0xfc, 0xee, 0xa7, 0xfc, 0x99, 0x97, 0xfe, + 0x62, 0xa7, 0x00, 0x4e, 0x71, 0xfc, 0x90, 0xc8, 0x40, 0x41, 0x23, 0x2a, 0x64, 0xe2, 0xe6, 0xba, + 0x79, 0x0d, 0xc4, 0xb9, 0x09, 0x2d, 0x8e, 0xee, 0x37, 0x45, 0xe7, 0x68, 0x6d, 0x15, 0x6b, 0x0d, + 0x15, 0xe2, 0xd1, 0xe7, 0x2a, 0x2a, 0xf6, 0x9d, 0x74, 0x01, 0x40, 0x1d, 0x02, 0x23, 0x9e, 0x00, + 0x1e, 0xe7, 0xf9, 0x78, 0xed, 0xf7, 0x48, 0x98, 0x02, 0x14, 0x48, 0xfc, 0xef, 0xc0, 0x01, 0x5b, + 0x83, 0x06, 0x4b, 0x43, 0xfc, 0x9a, 0x85, 0x01, 0x9a, 0x6d, 0xfe, 0xc6, 0xe4, 0xfa, 0x24, 0xd2, + 0xfb, 0xe9, 0xdc, 0xfc, 0x17, 0xc8, 0xf9, 0xc8, 0xf2, 0xfb, 0xd5, 0x91, 0xfc, 0xf2, 0x44, 0xff, + 0x84, 0x59, 0x01, 0x1a, 0x54, 0xfc, 0xd6, 0x0f, 0x3f, 0xdf, 0xd3, 0x2a, 0x51, 0x90, 0xe9, 0x01, + 0xff, 0x0e, 0x3d, 0x54, 0x07, 0xba, 0x2a, 0xef, 0x3f, 0x5e, 0xe7, 0x0a, 0xf2, 0x0c, 0xa6, 0xb2, + 0x17, 0xef, 0xb3, 0xec, 0xf2, 0xf0, 0xf3, 0x02, 0x8d, 0x01, 0x0e, 0x8e, 0x01, 0x90, 0xf7, 0xff, + 0x73, 0xf9, 0xfc, 0x4f, 0xec, 0xf7, 0xc6, 0x90, 0x01, 0xde, 0xe8, 0xfc, 0xd9, 0x34, 0xff, 0xc8, + 0x7e, 0x07, 0x33, 0x40, 0xfe, 0x54, 0x6f, 0x00, 0x1f, 0x28, 0xfe, 0xc8, 0xa9, 0xfb, 0x7e, 0x56, + 0xfb, 0xff, 0xb5, 0xfd, 0x4b, 0x5e, 0xfa, 0x2a, 0x1e, 0xfb, 0x4c, 0x1f, 0xfd, 0xdc, 0x6e, 0xfe, + 0xe4, 0x3c, 0x01, 0x63, 0x2e, 0xfd, 0x2e, 0x71, 0x3d, 0x8b, 0x8b, 0x2b, 0x4e, 0x7e, 0xeb, 0x53, + 0x01, 0x11, 0x0c, 0xea, 0x05, 0x12, 0x1b, 0xee, 0x12, 0x98, 0xe9, 0xa2, 0x09, 0x05, 0x4b, 0xae, + 0x17, 0xd2, 0x6c, 0xf3, 0xe0, 0x14, 0xf1, 0xdd, 0x83, 0x01, 0x5d, 0x13, 0x03, 0x79, 0xbf, 0xfd, + 0x2a, 0x2f, 0x00, 0xf2, 0x5b, 0xf9, 0xfd, 0xd1, 0xff, 0xe4, 0x8b, 0xfe, 0x2b, 0x2b, 0xfc, 0x8a, + 0xd9, 0x06, 0x38, 0xa8, 0x00, 0x1a, 0xdd, 0xfe, 0xc9, 0x59, 0xfe, 0x00, 0x24, 0xfd, 0x8c, 0xc2, + 0xfb, 0xb5, 0x53, 0xfe, 0xc7, 0xec, 0xfb, 0x53, 0x3a, 0xfb, 0x00, 0xf5, 0xfb, 0x38, 0x0a, 0xfd, + 0x5f, 0x8d, 0x01, 0x28, 0x64, 0xfe, 0xdf, 0x64, 0x3a, 0x62, 0xa9, 0x2c, 0x72, 0xa6, 0xee, 0xce, + 0xcd, 0x10, 0x36, 0x1e, 0x05, 0x0b, 0xc5, 0xee, 0xb8, 0xf2, 0xea, 0x7d, 0x37, 0xfd, 0x6d, 0x29, + 0x17, 0xfe, 0xb9, 0xf9, 0x17, 0x75, 0xee, 0xe3, 0x74, 0x01, 0x36, 0x09, 0x05, 0xff, 0x6a, 0xfb, + 0xe6, 0xc3, 0x02, 0xe7, 0xb7, 0xfb, 0x8c, 0x20, 0xfd, 0xe0, 0x3a, 0x00, 0x02, 0x55, 0xfa, 0x7d, + 0xf4, 0x02, 0x7a, 0xd9, 0x02, 0x47, 0x3d, 0xff, 0x12, 0xdd, 0xfd, 0x1d, 0x41, 0xff, 0x1a, 0x8e, + 0xfc, 0xea, 0x6b, 0xff, 0x3b, 0x19, 0xfd, 0x1b, 0xe5, 0xfa, 0x63, 0x38, 0xfb, 0x6c, 0x87, 0xfb, + 0x18, 0x69, 0x00, 0x40, 0x67, 0xff, 0x2e, 0x54, 0x38, 0xcf, 0xff, 0x2b, 0xce, 0x29, 0xf2, 0x66, + 0x1c, 0x10, 0xc0, 0x81, 0x03, 0x57, 0x15, 0xf1, 0xed, 0xdc, 0xea, 0x0e, 0x49, 0xf7, 0xe9, 0xea, + 0x15, 0xe5, 0x09, 0xfe, 0xc5, 0xca, 0xed, 0xfb, 0x33, 0x01, 0xd5, 0x10, 0x06, 0xb3, 0xc7, 0xfa, + 0x58, 0xe1, 0x04, 0x50, 0x77, 0xfb, 0x24, 0x00, 0xfc, 0xd9, 0xe4, 0x01, 0x5f, 0x13, 0xf8, 0xab, + 0xbe, 0xff, 0x7b, 0xd3, 0x02, 0x54, 0xee, 0x00, 0xb4, 0x5e, 0xfe, 0xdf, 0xfc, 0x00, 0xac, 0xc8, + 0xfd, 0x87, 0x6f, 0xff, 0x94, 0x61, 0xfe, 0x85, 0xe6, 0xfa, 0xef, 0x20, 0xfb, 0x77, 0x7b, 0xf9, + 0xe1, 0x38, 0xfe, 0xb2, 0xfc, 0xff, 0x7d, 0xd1, 0x37, 0x4e, 0xba, 0x29, 0xac, 0x9d, 0xf4, 0x1f, + 0x24, 0x11, 0x5a, 0x1f, 0x01, 0xcd, 0x6d, 0xf3, 0x21, 0x0f, 0xec, 0x72, 0x44, 0xf2, 0xd5, 0xf0, + 0x13, 0xaa, 0xab, 0x02, 0x87, 0x4c, 0xed, 0x0a, 0xb3, 0x00, 0x0a, 0x3c, 0x09, 0x70, 0x7b, 0xf9, + 0x3d, 0x12, 0x05, 0xb4, 0x02, 0xfc, 0xdb, 0xe1, 0xfa, 0x18, 0xec, 0x02, 0x73, 0x52, 0xf7, 0xaf, + 0xa5, 0xfe, 0xde, 0xc8, 0x00, 0xca, 0xa4, 0x01, 0xc8, 0x9b, 0x02, 0xf0, 0xbd, 0x00, 0x78, 0xe2, + 0xfd, 0x6c, 0x4d, 0x01, 0x5d, 0xfb, 0xfe, 0x16, 0xfb, 0xfa, 0xd3, 0x25, 0xfb, 0xbf, 0xce, 0xf8, + 0xb8, 0xb0, 0xfb, 0x5c, 0x14, 0xff, 0x4f, 0x7a, 0x38, 0xe6, 0x72, 0x26, 0xf7, 0xc2, 0xf4, 0x54, + 0x88, 0x13, 0x26, 0x66, 0xff, 0xc0, 0xd0, 0xf3, 0x6c, 0x88, 0xed, 0x57, 0xda, 0xef, 0x2d, 0x80, + 0x10, 0x6e, 0x55, 0x06, 0x81, 0xa0, 0xee, 0x21, 0x44, 0xff, 0xaf, 0x2a, 0x0c, 0xfd, 0x6f, 0xf8, + 0x49, 0xb9, 0x02, 0xb1, 0xc1, 0xfd, 0x15, 0xbd, 0xf9, 0xc9, 0xa8, 0x02, 0xac, 0x17, 0xf9, 0xab, + 0xf4, 0xfc, 0xf3, 0x47, 0x01, 0x7a, 0x55, 0x00, 0x0d, 0x44, 0x03, 0x0b, 0xeb, 0x03, 0x63, 0xfc, + 0xfc, 0xf6, 0x5f, 0x02, 0x1b, 0x0d, 0x00, 0xdd, 0x2e, 0xfa, 0x65, 0x8c, 0xfb, 0x4d, 0x3f, 0xf9, + 0x81, 0xa0, 0xf9, 0xed, 0x8f, 0xfd, 0xca, 0xa5, 0x39, 0x2f, 0x04, 0x24, 0x45, 0x12, 0xf0, 0xbc, + 0xeb, 0x18, 0x4e, 0xb6, 0x00, 0x5c, 0xdd, 0xee, 0x9c, 0x81, 0xf0, 0x6e, 0xeb, 0xf0, 0x6e, 0x4f, + 0x0c, 0x62, 0x2a, 0x08, 0x27, 0xc2, 0xf1, 0x73, 0x54, 0xfd, 0x98, 0xd0, 0x0d, 0xe2, 0xce, 0xf7, + 0x3c, 0x58, 0xff, 0x15, 0x6b, 0x00, 0xe6, 0x71, 0xf9, 0x92, 0x0f, 0x01, 0xf8, 0xe0, 0xfb, 0x72, + 0xed, 0xfd, 0xed, 0xa2, 0x00, 0x1c, 0x53, 0xff, 0xe8, 0xb3, 0x00, 0xfd, 0xb5, 0x07, 0x4f, 0xa6, + 0xfe, 0x29, 0x19, 0x00, 0x51, 0x19, 0x03, 0xcb, 0x2f, 0xf9, 0x2e, 0x9d, 0xfa, 0x5e, 0xce, 0xfb, + 0x97, 0xaf, 0xf8, 0x30, 0x3b, 0xfb, 0xc4, 0xd5, 0x3c, 0xcd, 0x0a, 0x1f, 0xae, 0x1a, 0xe9, 0x91, + 0x2a, 0x22, 0x76, 0x30, 0x01, 0x3c, 0x22, 0xe6, 0x0d, 0x1b, 0xf5, 0x58, 0x14, 0xf6, 0xdf, 0x46, + 0x06, 0x25, 0x10, 0x08, 0x38, 0x39, 0xf7, 0x3a, 0x14, 0xf9, 0x41, 0x60, 0x0e, 0x3e, 0x7c, 0xf9, + 0x3d, 0x86, 0xfa, 0x93, 0xa4, 0x02, 0xe5, 0x74, 0xfb, 0xa0, 0xcc, 0xfe, 0x60, 0xac, 0xfd, 0x0d, + 0xae, 0x00, 0xbb, 0xce, 0xfe, 0x9a, 0x92, 0xfe, 0x4b, 0xc8, 0xff, 0x6a, 0x35, 0x06, 0x84, 0x56, + 0x02, 0x9a, 0x49, 0x00, 0x1c, 0xb0, 0x01, 0x7c, 0x25, 0xfb, 0x88, 0xdf, 0xf9, 0x17, 0x33, 0xfc, + 0x9e, 0x01, 0xfa, 0x4b, 0xb0, 0xf9, 0x79, 0x61, 0x3f, 0x7d, 0x7b, 0x18, 0x86, 0x28, 0xe6, 0x74, + 0x6d, 0x29, 0x69, 0x1f, 0xfe, 0xa2, 0x0a, 0xe3, 0x19, 0xba, 0xf9, 0x02, 0x4d, 0xf9, 0x9b, 0xe7, + 0x01, 0xe5, 0x04, 0x07, 0x38, 0x17, 0xfb, 0xc4, 0xe3, 0xf6, 0x2d, 0xc4, 0x0d, 0x1a, 0x80, 0xfa, + 0x50, 0x39, 0xf8, 0x43, 0x8a, 0x03, 0xef, 0x69, 0xfe, 0x8c, 0xc5, 0xfd, 0x81, 0xe1, 0xfd, 0x1a, + 0xd5, 0x01, 0x51, 0x47, 0xff, 0x86, 0x11, 0xfe, 0x62, 0xfc, 0xfd, 0x78, 0x5a, 0x05, 0x01, 0x50, + 0x03, 0x63, 0xce, 0x01, 0x86, 0x0e, 0x01, 0x63, 0xaa, 0xfc, 0x20, 0x65, 0xfa, 0xb3, 0x9e, 0xfa, + 0x89, 0xe8, 0xfb, 0x86, 0x88, 0xfa, 0xbe, 0xeb, 0x3f, 0x35, 0x55, 0x13, 0x5b, 0x86, 0xe4, 0x40, + 0x34, 0x2e, 0xe2, 0xd4, 0xfc, 0x6f, 0xf9, 0xdf, 0x44, 0xba, 0xfd, 0x9f, 0xdd, 0xfe, 0xf9, 0x4c, + 0xfb, 0x8a, 0x41, 0x04, 0xff, 0x96, 0x01, 0x6c, 0x4e, 0xf4, 0x0d, 0xa5, 0x0a, 0x43, 0x09, 0xfe, + 0xe3, 0xd6, 0xf7, 0x06, 0x3a, 0x02, 0xef, 0x93, 0x00, 0xad, 0x98, 0xfe, 0x52, 0xe9, 0xfd, 0x54, + 0xd8, 0x00, 0x0b, 0x7e, 0xff, 0x83, 0xb0, 0xff, 0x1e, 0xef, 0xfb, 0x18, 0x81, 0x04, 0xab, 0x13, + 0x04, 0x3e, 0x88, 0x00, 0x3b, 0x10, 0x03, 0x59, 0xaa, 0xfd, 0x83, 0xac, 0xf9, 0xea, 0xc0, 0xfb, + 0x63, 0xf1, 0xfb, 0xec, 0x08, 0xfb, 0xd7, 0xb1, 0x3c, 0xe8, 0x07, 0x10, 0x67, 0x31, 0xe6, 0xf5, + 0x12, 0x30, 0xd8, 0x73, 0xfc, 0x03, 0x53, 0xdf, 0xdf, 0xf9, 0x00, 0x60, 0x97, 0x00, 0xb9, 0x27, + 0xf7, 0xb4, 0xb3, 0x03, 0x22, 0x5c, 0x04, 0xad, 0x7a, 0xf2, 0x06, 0x21, 0x09, 0x0e, 0x63, 0x01, + 0x9e, 0x33, 0xf7, 0x7f, 0xe1, 0x01, 0x7c, 0x85, 0x01, 0x71, 0x17, 0xfe, 0x14, 0x2f, 0xff, 0x16, + 0xf1, 0xff, 0x9c, 0xd9, 0xfe, 0xfd, 0xc4, 0x00, 0xe4, 0x3e, 0xfc, 0x46, 0x0b, 0x03, 0xc8, 0x59, + 0x03, 0x8a, 0xf6, 0x00, 0xff, 0xef, 0x02, 0x6a, 0xb6, 0xfe, 0xd4, 0x16, 0xfa, 0x47, 0xd8, 0xfc, + 0xe0, 0x8b, 0xfc, 0x8d, 0xfd, 0xf9, 0xda, 0x81, 0x36, 0xec, 0xca, 0x0e, 0xcc, 0x2a, 0xea, 0x8a, + 0x79, 0x2e, 0xb1, 0xec, 0xfd, 0x7a, 0x77, 0xe1, 0x08, 0xbc, 0x00, 0x2a, 0x37, 0x01, 0x63, 0x9e, + 0xf6, 0x7e, 0xd0, 0x01, 0xf9, 0x24, 0x05, 0xa3, 0x63, 0xf3, 0x65, 0xb0, 0x07, 0xd0, 0x18, 0x03, + 0x91, 0x16, 0xf8, 0xa3, 0x3a, 0x01, 0xcd, 0xae, 0x01, 0x80, 0x1a, 0xfe, 0x31, 0xf8, 0xfe, 0xb4, + 0x47, 0x00, 0x82, 0xca, 0xfe, 0x28, 0x1d, 0x00, 0xfd, 0x99, 0xfd, 0x71, 0x86, 0x02, 0x76, 0x0a, + 0x02, 0x3c, 0x72, 0x01, 0xcb, 0x46, 0x02, 0xff, 0x8d, 0xfe, 0x96, 0x13, 0xfc, 0x39, 0x74, 0xfd, + 0x86, 0xc9, 0xfc, 0x6e, 0x7f, 0xfa, 0x2f, 0xbb, 0x2f, 0x9d, 0x78, 0x0f, 0x04, 0xa9, 0xed, 0xd3, + 0x1d, 0x2a, 0x3c, 0x2b, 0x01, 0xc6, 0xda, 0xe3, 0x91, 0x21, 0x00, 0x2c, 0xf5, 0x01, 0x68, 0xf2, + 0xf5, 0xa9, 0x38, 0x00, 0x72, 0x38, 0x06, 0x9c, 0xf2, 0xf4, 0x42, 0xa0, 0x05, 0xde, 0x20, 0x05, + 0x1d, 0x9e, 0xf8, 0x72, 0xb6, 0xff, 0xe2, 0xe5, 0x02, 0x8a, 0x26, 0xfe, 0xdf, 0xca, 0xfd, 0xbc, + 0xcd, 0x00, 0x4e, 0x53, 0xff, 0xaa, 0x77, 0xff, 0x11, 0x47, 0xfe, 0xe5, 0xab, 0x02, 0x3b, 0xf4, + 0x01, 0xed, 0x71, 0x00, 0x38, 0xda, 0x01, 0x71, 0xba, 0xfe, 0x3e, 0x90, 0xfc, 0x33, 0xba, 0xfe, + 0xc7, 0xf2, 0xfc, 0x8a, 0x1e, 0xfb, 0x07, 0x4a, 0x2a, 0x31, 0x5e, 0x13, 0xdc, 0x8b, 0xf3, 0xfc, + 0xcd, 0x1d, 0x23, 0xfb, 0xfe, 0xc7, 0x62, 0xeb, 0xbf, 0x01, 0x00, 0xbc, 0x1a, 0xfe, 0xa8, 0x85, + 0xfd, 0x46, 0xcb, 0x00, 0x86, 0xf5, 0xfd, 0x59, 0x07, 0xfd, 0xa8, 0x24, 0x06, 0xb3, 0x1b, 0x00, + 0x84, 0x8e, 0xfb, 0xf3, 0x0c, 0xff, 0x1c, 0xf9, 0x00, 0x47, 0xba, 0xfe, 0xea, 0x47, 0xfc, 0x15, + 0x34, 0x00, 0x70, 0x86, 0x00, 0x76, 0x6f, 0x00, 0xa4, 0x14, 0x00, 0x3d, 0x7b, 0x00, 0x7e, 0x19, + 0x00, 0xc1, 0xa2, 0x01, 0x50, 0x11, 0x01, 0xbe, 0xa1, 0xff, 0x07, 0xf2, 0xff, 0xfa, 0xa6, 0xff, + 0xce, 0x13, 0xff, 0x6c, 0x86, 0xff, 0x39, 0xc6, 0x23, 0xfd, 0xd6, 0x11, 0x77, 0x61, 0xf8, 0xca, + 0xd0, 0x1b, 0x07, 0x30, 0xff, 0xbe, 0x70, 0xee, 0xcf, 0x0a, 0x00, 0xb6, 0x61, 0xfd, 0xbf, 0x31, + 0xfe, 0x08, 0x14, 0x01, 0x57, 0xf2, 0xfd, 0x36, 0x3b, 0xfd, 0x84, 0x1e, 0x06, 0xc1, 0x7e, 0x00, + 0x56, 0xa3, 0xfb, 0x36, 0xf8, 0xfe, 0x96, 0x96, 0x00, 0xac, 0xe5, 0xfe, 0xb2, 0xd9, 0xfc, 0xd4, + 0x34, 0x00, 0x03, 0x1f, 0x00, 0x88, 0x32, 0x00, 0x9c, 0x5b, 0x00, 0xa6, 0x90, 0x00, 0x0b, 0x8a, + 0x00, 0x77, 0xa3, 0x01, 0x7f, 0xc8, 0x00, 0x4c, 0x88, 0xff, 0xdf, 0x29, 0x00, 0xe0, 0xde, 0xff, + 0x63, 0xc0, 0xfe, 0x78, 0x88, 0xff, 0x60, 0xc8, 0x1d, 0x8b, 0xdc, 0x10, 0xfb, 0x19, 0xfd, 0xbf, + 0x1b, 0x18, 0x14, 0xe0, 0xff, 0x1e, 0xc2, 0xf2, 0x85, 0xa4, 0xfe, 0xf5, 0x86, 0xfc, 0xa5, 0x7d, + 0xff, 0x21, 0x7e, 0x01, 0xe5, 0x73, 0xfd, 0x0d, 0xc8, 0xfd, 0x4e, 0xd9, 0x05, 0xd4, 0x9d, 0x00, + 0x87, 0x46, 0xfc, 0x83, 0xb6, 0xfe, 0x26, 0x91, 0x00, 0x05, 0xee, 0xfe, 0x06, 0x2d, 0xfd, 0xcf, + 0x49, 0x00, 0xc4, 0x04, 0x00, 0x2d, 0xf9, 0xff, 0x01, 0x5d, 0x00, 0x4b, 0xc4, 0x00, 0xe6, 0xf8, + 0x00, 0xb9, 0x57, 0x01, 0xc4, 0x37, 0x00, 0x40, 0xea, 0xff, 0x22, 0x39, 0x00, 0xcb, 0xc4, 0xff, + 0xd7, 0x71, 0xff, 0xab, 0xbf, 0xff, 0x0f, 0x01, 0x19, 0x3c, 0x8a, 0x10, 0x2e, 0x8f, 0xff, 0xb3, + 0x32, 0x14, 0x22, 0xa9, 0x01, 0x38, 0xa9, 0xf5, 0x96, 0xc0, 0xfd, 0xe1, 0x9a, 0xfc, 0x9b, 0x30, + 0x00, 0x57, 0x92, 0x01, 0x86, 0xaf, 0xfd, 0xfd, 0x4b, 0xfe, 0xc7, 0xb8, 0x04, 0xfa, 0xfe, 0x00, + 0xc3, 0x07, 0xfd, 0xc5, 0x61, 0xfe, 0xf1, 0x5b, 0x00, 0xc2, 0x2f, 0xff, 0xf0, 0x90, 0xfd, 0xdb, + 0x37, 0x00, 0x0d, 0x13, 0x00, 0x41, 0xfb, 0xff, 0x9f, 0x20, 0x00, 0x51, 0x10, 0x01, 0x65, 0x60, + 0x01, 0xe7, 0x4f, 0x00, 0xf6, 0x2a, 0x00, 0x70, 0xd6, 0x00, 0xae, 0x05, 0x00, 0x4f, 0x7f, 0xff, + 0x98, 0x65, 0x00, 0x98, 0x56, 0x00, 0x57, 0xf3, 0x15, 0xbd, 0x4b, 0x10, 0x58, 0xde, 0xff, 0x04, + 0x5f, 0x11, 0x86, 0x5c, 0x03, 0xaa, 0xd7, 0xf6, 0xac, 0xe1, 0xfd, 0x31, 0xe3, 0xfd, 0x65, 0xfe, + 0xff, 0x86, 0x16, 0x01, 0xcc, 0xf4, 0xfe, 0x87, 0xb0, 0xfe, 0xc9, 0x19, 0x03, 0xe6, 0x8f, 0x01, + 0x56, 0xde, 0xfd, 0x52, 0xd6, 0xfd, 0x3c, 0x42, 0x00, 0x36, 0xc1, 0xff, 0x5d, 0xfc, 0xfd, 0xa2, + 0xfa, 0xff, 0xf7, 0x53, 0x00, 0x60, 0x07, 0x00, 0x62, 0x09, 0x00, 0x7f, 0x90, 0x01, 0x03, 0xef, + 0x00, 0xdf, 0x0c, 0x00, 0xc0, 0xe2, 0x00, 0x88, 0xf2, 0x00, 0x25, 0xf8, 0xff, 0x20, 0x31, 0x00, + 0x9c, 0x07, 0x01, 0xad, 0x21, 0x00, 0xc4, 0x36, 0x14, 0x55, 0xbe, 0x0f, 0x7c, 0x72, 0xff, 0x57, + 0x2e, 0x0f, 0xd3, 0xda, 0x03, 0xcd, 0x1b, 0xf8, 0xbc, 0xe5, 0xfe, 0xa3, 0x97, 0xfe, 0x15, 0x95, + 0xff, 0x5d, 0x10, 0x01, 0xec, 0x26, 0x00, 0x94, 0x97, 0xfe, 0x05, 0x28, 0x02, 0xb4, 0xe7, 0x01, + 0x38, 0xf2, 0xfd, 0xaa, 0x01, 0xfe, 0xec, 0x7f, 0x00, 0x31, 0xee, 0xff, 0xf9, 0x2e, 0xfe, 0x4f, + 0x30, 0x00, 0xfc, 0x83, 0x00, 0x4f, 0xab, 0xff, 0x83, 0xcc, 0x00, 0xcc, 0xbc, 0x01, 0x23, 0x61, + 0x00, 0x24, 0x78, 0x00, 0xf4, 0x4f, 0x01, 0xc0, 0x38, 0x01, 0x85, 0x53, 0x00, 0x64, 0xbc, 0x00, + 0xef, 0xad, 0x00, 0xf2, 0x73, 0xff, 0x9f, 0x5d, 0x12, 0xcb, 0xb7, 0x0e, 0x54, 0x71, 0xff, 0xdd, + 0xa6, 0x0d, 0x43, 0xfc, 0x03, 0x75, 0x71, 0xf9, 0x69, 0xa5, 0xff, 0x51, 0xe6, 0xfe, 0xd5, 0x6a, + 0xff, 0x72, 0x5b, 0x01, 0xe8, 0xb4, 0x00, 0xad, 0x55, 0xfe, 0xa9, 0x99, 0x01, 0x35, 0xc6, 0x01, + 0x55, 0x69, 0xfe, 0xac, 0x61, 0xfe, 0x1c, 0x5d, 0x00, 0x2c, 0x00, 0x00, 0x36, 0x7e, 0xfe, 0xcb, + 0x73, 0x00, 0x84, 0x44, 0x00, 0x58, 0x54, 0x00, 0xcb, 0x99, 0x01, 0xfc, 0xc4, 0x00, 0xb9, 0x8f, + 0x00, 0x6f, 0x7a, 0x01, 0x05, 0xa8, 0x01, 0xd4, 0x0d, 0x01, 0x98, 0x31, 0x00, 0xf8, 0x7f, 0x00, + 0x38, 0xd2, 0xff, 0x02, 0x34, 0xff, 0x43, 0x66, 0x10, 0xd8, 0x38, 0x0d, 0x03, 0x0a, 0x00, 0x35, + 0xd5, 0x0c, 0x4e, 0xf0, 0x03, 0x3a, 0xac, 0xfa, 0xc2, 0xff, 0xff, 0xed, 0x6f, 0xff, 0x64, 0xdd, + 0xff, 0x8d, 0x42, 0x01, 0xb7, 0x80, 0x00, 0x5b, 0x75, 0xfe, 0x4f, 0xba, 0x01, 0xaa, 0x8d, 0x01, + 0xd0, 0x95, 0xfe, 0x3b, 0xcb, 0xfe, 0xc9, 0x6f, 0x00, 0x35, 0xe1, 0xff, 0xe7, 0x11, 0xff, 0xcf, + 0xdb, 0x00, 0x3b, 0x7d, 0x00, 0xa8, 0x34, 0x01, 0xe7, 0x60, 0x01, 0x8a, 0xda, 0x00, 0xae, 0x78, + 0x01, 0x6d, 0x95, 0x01, 0x79, 0x5b, 0x01, 0x22, 0x66, 0x00, 0xa1, 0xd7, 0xff, 0x74, 0x12, 0x00, + 0xb5, 0x96, 0xff, 0xcd, 0x32, 0xff, 0x14, 0xc9, 0x0e, 0x65, 0x83, 0x0c, 0x22, 0x60, 0x00, 0x76, + 0x04, 0x0b, 0x4f, 0x08, 0x04, 0x98, 0x35, 0xfc, 0x2e, 0xa5, 0x00, 0x39, 0x92, 0xff, 0xb9, 0xa3, + 0xff, 0x4c, 0x6a, 0x01, 0xc7, 0xce, 0x00, 0x91, 0xba, 0xfe, 0xb6, 0x47, 0x01, 0x26, 0x5d, 0x01, + 0xe3, 0x0c, 0xff, 0x2e, 0x0f, 0xff, 0xa2, 0x62, 0x00, 0xa7, 0x5d, 0x00, 0x82, 0x06, 0x00, 0x32, + 0xdc, 0x00, 0xb1, 0x37, 0x01, 0x3b, 0x0e, 0x02, 0xcb, 0x34, 0x01, 0xd7, 0x35, 0x01, 0x12, 0x39, + 0x01, 0x6d, 0xb4, 0x00, 0x90, 0xd2, 0x00, 0xec, 0x14, 0x00, 0x07, 0xa0, 0xff, 0xe6, 0xd9, 0xff, + 0x4e, 0x96, 0xff, 0xe9, 0xde, 0xfe, 0xe7, 0xd1, 0x0c, 0x07, 0x50, 0x0b, 0xb9, 0xff, 0x00, 0x92, + 0x45, 0x0a, 0x11, 0x74, 0x04, 0x3d, 0x28, 0xfd, 0x5a, 0xa1, 0x00, 0xf3, 0xdb, 0xff, 0xad, 0x27, + 0x00, 0x96, 0x5e, 0x01, 0x58, 0x85, 0x00, 0x07, 0x01, 0xff, 0x0f, 0x3a, 0x01, 0xff, 0x2e, 0x01, + 0xad, 0x77, 0xff, 0x16, 0x8a, 0xff, 0x97, 0xb0, 0x00, 0xf2, 0x0d, 0x01, 0x50, 0xb2, 0x00, 0x6e, + 0x8e, 0x01, 0x08, 0x17, 0x02, 0x2d, 0xe7, 0x01, 0x4f, 0xb9, 0x00, 0x6d, 0x5f, 0x00, 0x91, 0x5d, + 0x00, 0x27, 0x78, 0x00, 0x5c, 0x94, 0x00, 0x49, 0x15, 0x00, 0xea, 0x6e, 0xff, 0x9f, 0x6c, 0xff, + 0x91, 0x5f, 0xff, 0x1b, 0xb1, 0xfe, 0x34, 0xe9, 0x0a, 0xeb, 0x3f, 0x0a, 0x54, 0xf8, 0x01, 0x51, + 0x77, 0x09, 0xe3, 0x2c, 0x04, 0x9a, 0x53, 0xfe, 0xaf, 0x36, 0x01, 0x09, 0xc0, 0xff, 0x26, 0x41, + 0x00, 0x74, 0x83, 0x01, 0xd0, 0x59, 0x00, 0x25, 0x0f, 0xff, 0xb1, 0x59, 0x01, 0x9a, 0x84, 0x01, + 0xe8, 0xff, 0xff, 0x82, 0xe1, 0xff, 0x97, 0x6b, 0x01, 0x56, 0x45, 0x02, 0xa9, 0x5d, 0x01, 0x7b, + 0xdc, 0x01, 0x77, 0xba, 0x01, 0xee, 0x56, 0x00, 0x47, 0xd2, 0xff, 0xef, 0x3f, 0x00, 0x6d, 0x16, + 0x00, 0x9e, 0x5f, 0x00, 0x99, 0x58, 0x00, 0x78, 0x89, 0xff, 0x7b, 0x35, 0xff, 0xb1, 0x6c, 0xff, + 0x77, 0x0a, 0xff, 0x46, 0x60, 0xfe, 0xf0, 0xe1, 0x09, 0x8b, 0xf4, 0x09, 0x4b, 0xfe, 0x01, 0x97, + 0xf1, 0x07, 0x6d, 0xa2, 0x04, 0xad, 0xce, 0xff, 0x74, 0x0b, 0x01, 0x96, 0xaa, 0xff, 0x67, 0x69, + 0x00, 0xa4, 0x7e, 0x01, 0x15, 0xdd, 0x00, 0x1e, 0xb7, 0xff, 0xed, 0x63, 0x01, 0x01, 0xbc, 0x01, + 0xf3, 0x0d, 0x01, 0x67, 0x6c, 0x01, 0xc2, 0x6b, 0x02, 0xf6, 0x5e, 0x02, 0x25, 0xe1, 0x00, 0xc2, + 0xb5, 0x00, 0x32, 0x86, 0x00, 0x07, 0x0d, 0x00, 0x8f, 0xdd, 0xff, 0x20, 0x07, 0x00, 0xcc, 0xe1, + 0xff, 0x98, 0x09, 0x00, 0x00, 0x04, 0x00, 0x9c, 0x5e, 0xff, 0xa4, 0x23, 0xff, 0x64, 0x33, 0xff, + 0x4c, 0xb3, 0xfe, 0x20, 0x65, 0xfe, 0xad, 0xab, 0x07, 0xc4, 0x83, 0x08, 0xe5, 0x9f, 0x03, 0x49, + 0x1c, 0x08, 0xa9, 0x43, 0x04, 0xc0, 0x7e, 0x00, 0xc6, 0x43, 0x01, 0xd3, 0xcb, 0xff, 0xec, 0x22, + 0x01, 0x50, 0xc3, 0x01, 0x85, 0xa6, 0x00, 0xa9, 0x69, 0x00, 0xff, 0xbd, 0x02, 0xb5, 0xe2, 0x02, + 0xd6, 0xa8, 0x01, 0xe9, 0xaf, 0x01, 0x17, 0xfd, 0x01, 0x5d, 0x03, 0x01, 0xbe, 0xf8, 0xff, 0x37, + 0x6e, 0x00, 0x6f, 0x39, 0x00, 0x8b, 0x25, 0x00, 0x74, 0x99, 0xff, 0x4b, 0x6b, 0xff, 0xfb, 0xa7, + 0xff, 0x49, 0xbd, 0xff, 0x2b, 0xd6, 0xff, 0xc1, 0x56, 0xff, 0x33, 0xf8, 0xfe, 0x04, 0xe6, 0xfe, + 0xdb, 0x9b, 0xfe, 0x4d, 0xb3, 0xfe, 0xb3, 0x50, 0x07, 0xe2, 0x1a, 0x09, 0xc0, 0x8e, 0x03, 0xea, + 0x18, 0x06, 0x8d, 0x95, 0x04, 0x62, 0x72, 0x01, 0xc7, 0x4e, 0x01, 0x35, 0x0d, 0x00, 0x23, 0x5e, + 0x01, 0x32, 0xe8, 0x02, 0x0c, 0x33, 0x02, 0xcf, 0xd1, 0x01, 0xd1, 0x0c, 0x03, 0x8c, 0xc0, 0x02, + 0x3b, 0x31, 0x01, 0x99, 0xeb, 0xff, 0x98, 0x64, 0x00, 0x67, 0xfa, 0x00, 0xe2, 0x88, 0x00, 0xd9, + 0x27, 0x00, 0xff, 0x70, 0xff, 0x87, 0x5b, 0xff, 0x47, 0x5b, 0xff, 0xf2, 0x74, 0xff, 0x5a, 0x7a, + 0xff, 0x91, 0x80, 0xff, 0x99, 0x4b, 0xff, 0xa0, 0x0d, 0xff, 0xb2, 0x37, 0xff, 0x3c, 0xda, 0xfe, + 0xec, 0xca, 0xfe, 0x09, 0xc9, 0xfe, 0x41, 0xe2, 0x05, 0xec, 0x02, 0x08, 0x6b, 0x86, 0x04, 0x03, + 0x9e, 0x06, 0x2d, 0xf1, 0x04, 0xc1, 0x8e, 0x01, 0x8b, 0xb2, 0x01, 0x5a, 0xa8, 0x01, 0xa9, 0x35, + 0x03, 0x0e, 0xee, 0x03, 0x16, 0xcb, 0x02, 0x9d, 0xfd, 0x01, 0x60, 0x6d, 0x01, 0x64, 0xb6, 0x00, + 0xba, 0x06, 0x00, 0xba, 0x3a, 0x00, 0xbe, 0x06, 0x01, 0x03, 0xdb, 0x00, 0xa6, 0x9b, 0xff, 0x44, + 0x47, 0xff, 0x88, 0xd1, 0xff, 0x56, 0x2c, 0xff, 0x38, 0xc4, 0xfe, 0xd5, 0x27, 0xff, 0xe5, 0x5c, + 0xff, 0xa8, 0x69, 0xff, 0x26, 0x33, 0xff, 0x83, 0x5e, 0xff, 0x1a, 0x2e, 0xff, 0xe9, 0xfe, 0xfe, + 0xb6, 0xe7, 0xfe, 0x6c, 0xc3, 0xfe, 0x43, 0x53, 0x06, 0xa7, 0xa6, 0x09, 0x48, 0x26, 0x05, 0x69, + 0xc4, 0x04, 0x62, 0x1a, 0x04, 0x58, 0xbc, 0x03, 0x1e, 0x21, 0x05, 0x5f, 0xc0, 0x03, 0xcc, 0xba, + 0x02, 0x5c, 0x6a, 0x02, 0xa4, 0xe0, 0x00, 0x2f, 0xd2, 0xff, 0x79, 0x2b, 0x00, 0x6c, 0xc3, 0x00, + 0xf6, 0x10, 0x01, 0xb0, 0x34, 0x00, 0x58, 0xa5, 0xff, 0xbb, 0x3d, 0x00, 0x6b, 0xad, 0xff, 0xf4, + 0x1d, 0xff, 0x9b, 0x0e, 0xff, 0x07, 0x81, 0xfe, 0x8b, 0xcd, 0xfe, 0xf1, 0x81, 0xff, 0x4c, 0x62, + 0xff, 0xc2, 0x39, 0xff, 0xc4, 0x78, 0xff, 0x2c, 0x91, 0xff, 0x1a, 0x14, 0xff, 0xed, 0xc3, 0xfe, + 0x37, 0xef, 0xfe, 0x86, 0xe9, 0xfe, 0xba, 0xb6, 0x06, 0x16, 0x98, 0x09, 0x78, 0x24, 0x06, 0x9d, + 0x9c, 0x07, 0xcb, 0x55, 0x06, 0x7c, 0xfb, 0x04, 0x44, 0x18, 0x05, 0x2f, 0xf7, 0x01, 0x9d, 0xfe, + 0xff, 0x90, 0x4f, 0x00, 0x83, 0x2b, 0x00, 0x54, 0x28, 0x00, 0xab, 0x66, 0x00, 0x6a, 0x57, 0x00, + 0xea, 0xb0, 0x00, 0x99, 0xb2, 0xff, 0x65, 0x71, 0xff, 0x78, 0xfd, 0xff, 0x9e, 0x0d, 0xff, 0xed, + 0xc5, 0xfe, 0x0d, 0xbf, 0xfe, 0xf5, 0x69, 0xfe, 0xb9, 0x00, 0xff, 0x24, 0xb1, 0xff, 0xa5, 0x90, + 0xff, 0x9b, 0x42, 0xff, 0xc2, 0x5b, 0xff, 0xfe, 0x75, 0xff, 0x99, 0x19, 0xff, 0x01, 0xdd, 0xfe, + 0xdf, 0xdc, 0xfe, 0xb0, 0xcf, 0xfe, 0xec, 0xcd, 0x07, 0x5f, 0x42, 0x0c, 0x64, 0x05, 0x0a, 0xc3, + 0x86, 0x09, 0x70, 0x2f, 0x05, 0xa8, 0xa6, 0x02, 0x3e, 0x88, 0x01, 0x4c, 0xfc, 0xff, 0xc3, 0xf7, + 0xff, 0x4b, 0x7b, 0x00, 0xd5, 0x42, 0x00, 0x38, 0x94, 0xff, 0x90, 0xcd, 0xff, 0x8d, 0x18, 0x00, + 0x01, 0x99, 0x00, 0xc3, 0x7d, 0xff, 0xb2, 0x17, 0xff, 0x8f, 0x5b, 0xff, 0xdf, 0x99, 0xfe, 0x65, + 0x9e, 0xfe, 0xf7, 0xc1, 0xfe, 0x31, 0x0b, 0xff, 0x8f, 0x39, 0xff, 0x31, 0x4c, 0xff, 0xe4, 0x58, + 0xff, 0x67, 0x90, 0xff, 0x0e, 0x89, 0xff, 0x11, 0x30, 0xff, 0xca, 0xee, 0xfe, 0xe0, 0xd0, 0xfe, + 0xa4, 0xed, 0xfe, 0x47, 0xda, 0xfe, 0xde, 0x5f, 0x09, 0x12, 0xdd, 0x10, 0x5e, 0xa3, 0x0c, 0x21, + 0x98, 0x05, 0xa4, 0x82, 0x00, 0x81, 0x57, 0x01, 0x1e, 0xcd, 0x02, 0x4e, 0xf6, 0x01, 0xa1, 0x42, + 0xff, 0x81, 0xb9, 0xfe, 0x49, 0xf9, 0xff, 0x41, 0x2c, 0x00, 0xbd, 0xfe, 0xff, 0x43, 0x61, 0xff, + 0x02, 0x17, 0x00, 0x6b, 0xac, 0xff, 0x3d, 0xe1, 0xfe, 0xf8, 0xdc, 0xfe, 0xdf, 0xac, 0xfe, 0xb3, + 0x1f, 0xff, 0x7e, 0xed, 0xfe, 0x0f, 0xe7, 0xfe, 0xcc, 0xfe, 0xfe, 0x65, 0x63, 0xff, 0x3b, 0x7a, + 0xff, 0x41, 0x6a, 0xff, 0x6d, 0x97, 0xff, 0x34, 0x22, 0xff, 0xbe, 0xf3, 0xfe, 0xe6, 0xc1, 0xfe, + 0xec, 0xe2, 0xfe, 0x2e, 0x1d, 0xff, 0x0a, 0x0a, 0x0a, 0x07, 0xdf, 0x10, 0xf3, 0xbf, 0x08, 0xac, + 0x22, 0x03, 0x33, 0x01, 0x02, 0x3f, 0x0f, 0x04, 0xbd, 0xcd, 0x04, 0xbd, 0x0e, 0x01, 0xfe, 0x98, + 0xfe, 0xce, 0x00, 0x00, 0x4f, 0x39, 0x00, 0x7c, 0xed, 0xfe, 0xeb, 0x1a, 0x00, 0xa4, 0xa3, 0xff, + 0x9e, 0x72, 0xff, 0xf3, 0x81, 0xff, 0xe9, 0xd6, 0xfe, 0x06, 0x43, 0xff, 0xe6, 0x11, 0xff, 0x15, + 0xd5, 0xfe, 0x61, 0x10, 0xff, 0xc8, 0xe8, 0xfe, 0x97, 0xab, 0xfe, 0x01, 0x55, 0xff, 0xed, 0x81, + 0xff, 0x0f, 0x46, 0xff, 0xbc, 0x69, 0xff, 0x9e, 0x2f, 0xff, 0xce, 0x15, 0xff, 0x03, 0x07, 0xff, + 0x5d, 0xe0, 0xfe, 0xa5, 0xf7, 0xfe, 0x0a, 0x19, 0x06, 0x95, 0x40, 0x09, 0x86, 0x26, 0x05, 0x0b, + 0x45, 0x05, 0x1a, 0x18, 0x06, 0x7c, 0x17, 0x06, 0x18, 0x8b, 0x05, 0x13, 0x9e, 0x02, 0xaf, 0x5a, + 0x01, 0xf8, 0xe2, 0x01, 0xd0, 0xec, 0x00, 0xbe, 0x90, 0xff, 0x7e, 0x3f, 0xff, 0x33, 0xc3, 0xff, + 0x99, 0xf2, 0xff, 0xe0, 0xfd, 0xfe, 0xaa, 0xfc, 0xfe, 0x67, 0x76, 0xff, 0x3f, 0x63, 0xff, 0xa6, + 0x7d, 0xff, 0xbd, 0xe7, 0xfe, 0xf5, 0xd0, 0xfe, 0xeb, 0x35, 0xff, 0x0a, 0xfa, 0xfe, 0x37, 0xf0, + 0xfe, 0xf6, 0x52, 0xff, 0xc6, 0x35, 0xff, 0xed, 0x1b, 0xff, 0x67, 0x86, 0xff, 0xcf, 0x59, 0xff, + 0x6a, 0xf5, 0xfe, 0xe9, 0xe9, 0xfe, 0xb2, 0xcf, 0x04, 0x62, 0xa9, 0x06, 0x69, 0x03, 0x03, 0x79, + 0x82, 0x03, 0xf9, 0x55, 0x05, 0xdb, 0x7b, 0x05, 0x85, 0x36, 0x04, 0x16, 0x41, 0x03, 0x3f, 0x16, + 0x04, 0xd0, 0x13, 0x04, 0x5f, 0xe1, 0x02, 0xca, 0x94, 0x01, 0x02, 0xd9, 0x00, 0x1d, 0x9a, 0x00, + 0xce, 0xa4, 0xff, 0x3c, 0x14, 0xff, 0xc7, 0x69, 0xff, 0x6c, 0x10, 0xff, 0xea, 0xf0, 0xfe, 0x2b, + 0xbc, 0xff, 0x17, 0x3f, 0xff, 0xf4, 0x2a, 0xff, 0x21, 0x87, 0xff, 0x15, 0x13, 0xff, 0xdd, 0x1c, + 0xff, 0xcb, 0x44, 0xff, 0xba, 0x08, 0xff, 0x31, 0xd2, 0xfe, 0xe4, 0x26, 0xff, 0x71, 0x56, 0xff, + 0x60, 0x40, 0xff, 0x77, 0x5b, 0xff, 0x9c, 0x47, 0x05, 0xf7, 0x42, 0x07, 0xa9, 0x5d, 0x03, 0xb2, + 0x9c, 0x03, 0x49, 0x83, 0x04, 0x20, 0x5e, 0x03, 0x33, 0xe1, 0x01, 0xe2, 0x94, 0x01, 0x3f, 0x46, + 0x03, 0x27, 0x49, 0x04, 0x18, 0x65, 0x03, 0xf4, 0xa4, 0x02, 0xb3, 0x79, 0x02, 0x2b, 0x0f, 0x02, + 0x37, 0xeb, 0x00, 0xb2, 0xb4, 0xff, 0x94, 0x6d, 0xff, 0xcb, 0x58, 0xff, 0x04, 0x46, 0xff, 0xbf, + 0x22, 0xff, 0x44, 0xf2, 0xfe, 0x74, 0x43, 0xff, 0xef, 0xa0, 0xff, 0x8b, 0x53, 0xff, 0xd3, 0x2b, + 0xff, 0x76, 0x5e, 0xff, 0x3e, 0xf6, 0xfe, 0xac, 0xf4, 0xfe, 0xf9, 0x33, 0xff, 0xb1, 0xef, 0xfe, + 0x6c, 0x1d, 0xff, 0xbb, 0x71, 0xff, 0x13, 0xf8, 0x05, 0x5e, 0xe8, 0x07, 0xa0, 0xa6, 0x02, 0xc0, + 0x55, 0x03, 0xb9, 0xc1, 0x04, 0xe9, 0x24, 0x03, 0x90, 0xc2, 0x00, 0xf0, 0x3c, 0x00, 0x90, 0x89, + 0x02, 0x3f, 0x16, 0x03, 0x85, 0xe5, 0x01, 0xac, 0xa5, 0x02, 0xe0, 0x99, 0x03, 0xc1, 0x2d, 0x03, + 0x76, 0x50, 0x02, 0xe1, 0xea, 0x00, 0x7f, 0x74, 0x00, 0xcc, 0xe8, 0xff, 0xf5, 0x46, 0xff, 0xe4, + 0x87, 0xff, 0x1b, 0xf8, 0xfe, 0x34, 0xe7, 0xfe, 0x67, 0x94, 0xff, 0xef, 0x51, 0xff, 0xbe, 0x8b, + 0xff, 0x00, 0xc9, 0xff, 0x9c, 0x17, 0xff, 0x8d, 0x0e, 0xff, 0xb0, 0x36, 0xff, 0x87, 0xda, 0xfe, + 0x63, 0x14, 0xff, 0xb3, 0x37, 0xff, 0x61, 0x93, 0x06, 0x96, 0x39, 0x09, 0x28, 0x1a, 0x03, 0xae, + 0x2b, 0x03, 0xc1, 0x99, 0x04, 0xe9, 0x41, 0x02, 0x4a, 0x28, 0x00, 0x0e, 0xde, 0x00, 0x4c, 0xa9, + 0x02, 0x18, 0x9e, 0x01, 0xdf, 0x86, 0x00, 0x47, 0x74, 0x01, 0x0f, 0x05, 0x02, 0x84, 0xa6, 0x02, + 0x1b, 0x0c, 0x03, 0x41, 0xf1, 0x01, 0x0f, 0x61, 0x01, 0xca, 0xe5, 0x00, 0x73, 0x4a, 0x00, 0x1a, + 0x1b, 0x00, 0xf1, 0x2d, 0xff, 0x56, 0x2a, 0xff, 0x18, 0x6a, 0xff, 0xab, 0xf6, 0xfe, 0x1b, 0x7f, + 0xff, 0x95, 0xcc, 0xff, 0x05, 0x54, 0xff, 0x9f, 0x53, 0xff, 0x97, 0x3f, 0xff, 0x5d, 0xe8, 0xfe, + 0xa1, 0x0f, 0xff, 0x5e, 0x3a, 0xff, 0x0c, 0x04, 0x07, 0x54, 0xda, 0x09, 0x30, 0x81, 0x03, 0x77, + 0xa7, 0x03, 0x3b, 0x63, 0x05, 0x15, 0xd9, 0x01, 0xd4, 0xa5, 0xfe, 0x98, 0xdc, 0x00, 0x58, 0x39, + 0x03, 0xaf, 0x36, 0x01, 0x75, 0x2c, 0x00, 0x98, 0x03, 0x01, 0x14, 0xf1, 0x00, 0x27, 0x3b, 0x01, + 0xc4, 0x85, 0x01, 0x0a, 0x3f, 0x01, 0xf6, 0xe9, 0x01, 0xb6, 0xfe, 0x01, 0xb1, 0x17, 0x01, 0x2f, + 0xb1, 0x00, 0xcc, 0x5c, 0x00, 0xda, 0xd3, 0xff, 0x6b, 0x64, 0xff, 0xb7, 0x48, 0xff, 0xdc, 0x5d, + 0xff, 0xc0, 0x68, 0xff, 0x6e, 0x5f, 0xff, 0xdb, 0x59, 0xff, 0x19, 0x64, 0xff, 0xca, 0x35, 0xff, + 0x30, 0x09, 0xff, 0x30, 0x1f, 0xff, 0x04, 0xdb, 0x07, 0xc5, 0xfa, 0x0a, 0x86, 0xf0, 0x03, 0x0c, + 0x87, 0x03, 0xee, 0x69, 0x05, 0xc2, 0x9e, 0x01, 0x5f, 0xdb, 0xfd, 0x36, 0x3c, 0x01, 0x67, 0x4e, + 0x03, 0x1a, 0x22, 0x00, 0x96, 0xef, 0xff, 0x5d, 0x46, 0x01, 0x2c, 0xdc, 0x00, 0xf9, 0x7b, 0x00, + 0xdc, 0xc3, 0x00, 0x56, 0x2a, 0x00, 0x16, 0x1a, 0x00, 0xee, 0x33, 0x01, 0x79, 0xa9, 0x01, 0xa1, + 0x66, 0x01, 0xce, 0xe7, 0x00, 0x82, 0x9a, 0x00, 0x23, 0x30, 0x00, 0x40, 0xa9, 0xff, 0x4e, 0x83, + 0xff, 0x44, 0x97, 0xff, 0x60, 0x50, 0xff, 0xed, 0x03, 0xff, 0x0f, 0x28, 0xff, 0x0e, 0x56, 0xff, + 0x14, 0x3d, 0xff, 0x72, 0x0c, 0xff, 0x8f, 0x96, 0x08, 0x64, 0x2f, 0x0c, 0xe9, 0x6d, 0x04, 0x93, + 0x64, 0x03, 0x77, 0xb7, 0x05, 0x81, 0x8a, 0x01, 0x2c, 0xfa, 0xfc, 0x54, 0x87, 0x01, 0x25, 0x85, + 0x03, 0xa9, 0x66, 0xff, 0x16, 0xaa, 0xff, 0xa7, 0x78, 0x01, 0x01, 0xc6, 0x00, 0xd7, 0x41, 0x00, + 0x82, 0xa0, 0x00, 0x6c, 0xd1, 0xff, 0x98, 0x97, 0xff, 0xf1, 0x0d, 0x00, 0x2d, 0x30, 0x00, 0xcf, + 0xc1, 0x00, 0xfc, 0x24, 0x01, 0x32, 0x7b, 0x01, 0xc0, 0xdd, 0x00, 0x69, 0x41, 0x00, 0x33, 0x51, + 0x00, 0xe1, 0xf6, 0xff, 0x87, 0x8a, 0xff, 0x67, 0x51, 0xff, 0x8a, 0x1b, 0xff, 0xdf, 0xfe, 0xfe, + 0xc4, 0x51, 0xff, 0xc3, 0x2a, 0xff, 0x3c, 0xe0, 0x09, 0xff, 0xca, 0x0d, 0x30, 0x5e, 0x04, 0xa3, + 0xf6, 0x02, 0x8b, 0xc0, 0x05, 0x2b, 0x57, 0x01, 0x51, 0x9c, 0xfc, 0xbb, 0xfd, 0x01, 0x2a, 0x37, + 0x03, 0xa5, 0x56, 0xfe, 0x92, 0x9e, 0xff, 0x03, 0xc6, 0x01, 0x65, 0xc7, 0x00, 0x4a, 0xe3, 0xff, + 0x8d, 0x52, 0x00, 0x23, 0xc2, 0xff, 0xb0, 0x5f, 0xff, 0x08, 0xbc, 0xff, 0xb1, 0xbb, 0xff, 0x49, + 0xc6, 0xff, 0xb2, 0xa4, 0xff, 0x42, 0xc0, 0x00, 0x7b, 0x45, 0x01, 0x19, 0xfd, 0x00, 0x49, 0xbd, + 0x00, 0x62, 0x66, 0x00, 0x77, 0x39, 0x00, 0xb2, 0xaf, 0xff, 0xd9, 0x37, 0xff, 0x14, 0x13, 0xff, + 0x55, 0x40, 0xff, 0x9c, 0xfb, 0xfe, 0x92, 0xea, 0x0a, 0x4c, 0x16, 0x0f, 0x38, 0x9a, 0x04, 0x43, + 0xfa, 0x02, 0x83, 0xea, 0x05, 0x57, 0xcc, 0x00, 0xe8, 0x1a, 0xfc, 0x28, 0xda, 0x02, 0xa6, 0x32, + 0x03, 0x80, 0x2f, 0xfd, 0x43, 0x4c, 0xff, 0xd6, 0xf7, 0x01, 0x4d, 0xcf, 0x00, 0x09, 0xef, 0xff, + 0xc9, 0x18, 0x00, 0xb7, 0x75, 0xff, 0xd1, 0x44, 0xff, 0xee, 0xa2, 0xff, 0xcb, 0xa6, 0xff, 0xc6, + 0x7e, 0xff, 0x4c, 0x1a, 0xff, 0xd2, 0xb0, 0xff, 0x65, 0x1d, 0x00, 0xc8, 0x79, 0x00, 0x99, 0x10, + 0x01, 0x27, 0xed, 0x00, 0xf9, 0x9e, 0x00, 0xdb, 0x49, 0x00, 0x3f, 0xc9, 0xff, 0x25, 0x4a, 0xff, + 0x41, 0x51, 0xff, 0xf1, 0x3a, 0xff, 0xe0, 0x3f, 0x0c, 0x9c, 0x6c, 0x10, 0x8a, 0x80, 0x04, 0x98, + 0x48, 0x03, 0xef, 0x2a, 0x06, 0x7d, 0xe0, 0xff, 0xc6, 0xe9, 0xfb, 0x09, 0x08, 0x04, 0x80, 0xfc, + 0x02, 0xca, 0x11, 0xfc, 0xd3, 0x31, 0xff, 0x1a, 0x39, 0x02, 0x03, 0xca, 0x00, 0x99, 0xd2, 0xff, + 0x17, 0x01, 0x00, 0x64, 0x79, 0xff, 0xac, 0x2d, 0xff, 0xab, 0x76, 0xff, 0x44, 0xbd, 0xff, 0xb1, + 0x6a, 0xff, 0xc8, 0xf9, 0xfe, 0xd2, 0x6a, 0xff, 0xea, 0x9d, 0xff, 0x9b, 0xbd, 0xff, 0xfb, 0x0f, + 0x00, 0xce, 0x86, 0x00, 0xde, 0xeb, 0x00, 0x1e, 0xb4, 0x00, 0x53, 0x2b, 0x00, 0xf0, 0xdd, 0xff, + 0x44, 0xf8, 0xff, 0x17, 0x77, 0xff, 0x10, 0xc0, 0x0d, 0x59, 0x9f, 0x11, 0xdc, 0x26, 0x04, 0x2f, + 0xf3, 0x03, 0x33, 0x57, 0x06, 0xbd, 0x73, 0xfe, 0x99, 0xcf, 0xfb, 0xb5, 0x55, 0x05, 0x35, 0xa2, + 0x02, 0x95, 0x0c, 0xfb, 0x73, 0xee, 0xfe, 0xee, 0x3f, 0x02, 0xe7, 0xe7, 0x00, 0x62, 0xaa, 0xff, + 0x38, 0xdd, 0xff, 0xe0, 0x4c, 0xff, 0xf3, 0xf6, 0xfe, 0x19, 0x41, 0xff, 0xf1, 0xef, 0xff, 0x8d, + 0x50, 0xff, 0x51, 0xd0, 0xfe, 0xd1, 0x5f, 0xff, 0x90, 0x02, 0xff, 0x62, 0xb6, 0xff, 0x43, 0xe8, + 0xff, 0x34, 0x8a, 0xff, 0xa6, 0xd8, 0xff, 0xba, 0x43, 0x00, 0x4f, 0x6e, 0x00, 0xa6, 0x58, 0x00, + 0x10, 0x25, 0x00, 0x36, 0xd9, 0xff, 0x7e, 0x70, 0x0f, 0x12, 0xea, 0x12, 0x08, 0xa7, 0x03, 0x83, + 0x80, 0x04, 0x65, 0x7c, 0x06, 0x91, 0x25, 0xfd, 0x89, 0xcf, 0xfb, 0xd3, 0x6d, 0x06, 0x6a, 0x25, + 0x02, 0xc4, 0x5a, 0xfa, 0xdd, 0xd3, 0xfe, 0x04, 0x0b, 0x02, 0xfd, 0xda, 0x00, 0x17, 0x88, 0xff, + 0xa5, 0x1b, 0x00, 0x17, 0x22, 0xff, 0x08, 0x66, 0xfe, 0xde, 0x20, 0xff, 0x9d, 0xfb, 0xff, 0xab, + 0x6f, 0xff, 0x8f, 0xb4, 0xfe, 0x46, 0x3e, 0xff, 0xdb, 0xc1, 0xfe, 0xec, 0x9d, 0xff, 0x69, 0xe0, + 0xff, 0xab, 0x4d, 0xff, 0x80, 0x5a, 0xff, 0x99, 0x4e, 0xff, 0xef, 0xab, 0xff, 0x39, 0x07, 0x00, + 0xfb, 0x51, 0x00, 0x18, 0x16, 0x00, 0xf3, 0xc8, 0x10, 0xd2, 0x3f, 0x14, 0x08, 0xc2, 0x03, 0xa4, + 0xc0, 0x04, 0x04, 0xb6, 0x06, 0x94, 0x50, 0xfc, 0x6c, 0x5f, 0xfb, 0x90, 0xab, 0x07, 0x17, 0x23, + 0x02, 0x57, 0x60, 0xf9, 0xd7, 0xee, 0xfe, 0x47, 0xf7, 0x01, 0xb5, 0xb7, 0x00, 0x9f, 0x91, 0xff, + 0x08, 0x0a, 0x00, 0x60, 0x68, 0xff, 0x3b, 0x2a, 0xfe, 0x4a, 0xb7, 0xfe, 0x14, 0x30, 0x00, 0x6b, + 0x50, 0xff, 0xbd, 0x7a, 0xfe, 0x6a, 0xb0, 0xff, 0xe0, 0xbe, 0xfe, 0x22, 0x42, 0xff, 0x7a, 0xf5, + 0xff, 0x1a, 0x3b, 0xff, 0x6f, 0x4d, 0xff, 0x86, 0x29, 0xff, 0x8e, 0xe7, 0xfe, 0x20, 0x36, 0xff, + 0x9a, 0xda, 0xff, 0x14, 0x12, 0x00, 0xf9, 0xee, 0x11, 0xbe, 0x6e, 0x15, 0x45, 0xde, 0x03, 0x76, + 0x7a, 0x05, 0x31, 0xee, 0x06, 0x38, 0xc7, 0xfa, 0xbc, 0x28, 0xfb, 0x76, 0xe7, 0x08, 0x42, 0xed, + 0x01, 0x26, 0xa0, 0xf8, 0x1f, 0xc7, 0xfe, 0x32, 0xe6, 0x01, 0x93, 0x8e, 0x00, 0xdc, 0x5f, 0xff, + 0xa0, 0xf5, 0xff, 0x4b, 0x9a, 0xff, 0x2c, 0x03, 0xfe, 0x0a, 0x59, 0xfe, 0x2f, 0x34, 0x00, 0x7a, + 0x33, 0xff, 0x22, 0x28, 0xfe, 0x77, 0xaa, 0xff, 0x93, 0xee, 0xfe, 0x85, 0x22, 0xff, 0xe1, 0xb4, + 0xff, 0x80, 0x6e, 0xff, 0x3c, 0x36, 0xff, 0x94, 0xc2, 0xfe, 0xcd, 0xa0, 0xfe, 0x04, 0xf3, 0xfe, + 0x82, 0x8a, 0xff, 0x60, 0x3c, 0xff, 0x57, 0xf8, 0x12, 0xb2, 0xd8, 0x16, 0xef, 0x35, 0x04, 0xd4, + 0x77, 0x05, 0x66, 0x65, 0x07, 0xf6, 0x2a, 0xfa, 0xce, 0x92, 0xfa, 0x36, 0x8d, 0x09, 0x7e, 0x0d, + 0x02, 0x33, 0x4d, 0xf8, 0xa8, 0x8e, 0xfe, 0x70, 0xe1, 0x01, 0xf9, 0x44, 0x00, 0xaf, 0x4f, 0xff, + 0x37, 0xfa, 0xff, 0x46, 0xa8, 0xff, 0xc3, 0x35, 0xfe, 0xb9, 0xc2, 0xfd, 0x18, 0x2a, 0x00, 0x83, + 0xa8, 0xff, 0x4e, 0xc5, 0xfd, 0xa1, 0x53, 0xff, 0x70, 0xfe, 0xfe, 0x89, 0x3e, 0xff, 0x5b, 0xb6, + 0xff, 0x91, 0x63, 0xff, 0xf7, 0x3f, 0xff, 0xfe, 0x80, 0xfe, 0x95, 0x7e, 0xfe, 0x2a, 0xe1, 0xfe, + 0xda, 0x4e, 0xff, 0x56, 0xd1, 0xfe, 0x26, 0xa8, 0x13, 0x5e, 0xbe, 0x18, 0x18, 0xdf, 0x04, 0xbc, + 0x54, 0x04, 0x9d, 0x0b, 0x08, 0x53, 0xcb, 0xfa, 0xc3, 0x6f, 0xf9, 0x23, 0x37, 0x09, 0x5a, 0x70, + 0x02, 0xbc, 0xaa, 0xf8, 0x84, 0x08, 0xfe, 0x97, 0x8b, 0x01, 0x5f, 0x53, 0x00, 0x96, 0x02, 0xff, + 0xfc, 0x15, 0x00, 0xa0, 0xb4, 0xff, 0x2a, 0x3c, 0xfe, 0x3c, 0x85, 0xfd, 0xd9, 0xd4, 0xff, 0xbc, + 0xec, 0xff, 0xa2, 0xee, 0xfd, 0x74, 0xcd, 0xfe, 0xea, 0xba, 0xfe, 0xf0, 0x98, 0xff, 0xf7, 0x9f, + 0xff, 0xeb, 0x09, 0xff, 0xc8, 0x50, 0xff, 0x97, 0x98, 0xfe, 0x0a, 0x69, 0xfe, 0x9d, 0xae, 0xfe, + 0x7a, 0xd8, 0xfe, 0x46, 0xd7, 0xfe, 0x45, 0x2b, 0x14, 0x62, 0xe5, 0x19, 0xb0, 0x21, 0x06, 0xf0, + 0xc9, 0x03, 0x5c, 0x22, 0x08, 0xb4, 0xec, 0xfb, 0xde, 0x2f, 0xf8, 0x52, 0x7d, 0x08, 0x04, 0x03, + 0x03, 0xa2, 0x0d, 0xf9, 0x9a, 0xbe, 0xfd, 0x88, 0xf7, 0x00, 0x2e, 0x66, 0x00, 0x87, 0xe1, 0xfe, + 0x17, 0xdf, 0xff, 0xbb, 0xdb, 0xff, 0x36, 0x62, 0xfe, 0x77, 0x46, 0xfd, 0xaa, 0x89, 0xff, 0xe0, + 0x08, 0x00, 0xbf, 0xd1, 0xfd, 0xda, 0xd5, 0xfe, 0xd4, 0x9a, 0xfe, 0x58, 0x49, 0xff, 0x7c, 0xb6, + 0xff, 0xa7, 0xdd, 0xfe, 0xe9, 0x0a, 0xff, 0xfa, 0xe7, 0xfe, 0x45, 0x27, 0xfe, 0x3e, 0x43, 0xfe, + 0xe6, 0x0e, 0xff, 0x64, 0xbf, 0xfe, 0xd6, 0x7a, 0x15, 0xef, 0xe9, 0x19, 0xa4, 0xc4, 0x06, 0xfc, + 0x09, 0x05, 0x7c, 0xf2, 0x07, 0xfe, 0x0d, 0xfc, 0x94, 0xb2, 0xf7, 0x2b, 0x3c, 0x08, 0x34, 0xb1, + 0x02, 0x39, 0xb0, 0xf9, 0x77, 0xdf, 0xfd, 0x56, 0x3b, 0x00, 0x3c, 0x97, 0x00, 0x21, 0xc7, 0xfe, + 0x13, 0x73, 0xff, 0x46, 0x32, 0x00, 0x58, 0xe2, 0xfe, 0xca, 0xee, 0xfc, 0xc2, 0x1e, 0xff, 0x4a, + 0x47, 0x00, 0x32, 0xe7, 0xfd, 0xf6, 0xb0, 0xfe, 0xdc, 0x9b, 0xfe, 0x02, 0x15, 0xff, 0xec, 0x9e, + 0xff, 0x08, 0xf7, 0xfe, 0x70, 0xfa, 0xfe, 0xfc, 0x93, 0xfe, 0xf2, 0x06, 0xfe, 0x7c, 0x20, 0xfe, + 0xe0, 0x7e, 0xff, 0xc0, 0xa9, 0xfe, 0x11, 0x9d, 0x17, 0x1b, 0xfe, 0x18, 0x5a, 0x2a, 0x06, 0x3f, + 0xe6, 0x07, 0xb6, 0xfe, 0x07, 0x57, 0xd7, 0xfa, 0x67, 0xe4, 0xf7, 0xd8, 0x65, 0x08, 0x31, 0x25, + 0x01, 0x96, 0x8f, 0xfa, 0xc8, 0x8e, 0xfe, 0x73, 0x49, 0xff, 0xc8, 0x6e, 0x00, 0xb2, 0xb9, 0xfe, + 0x95, 0x1a, 0xff, 0x58, 0x34, 0x00, 0x96, 0x98, 0xff, 0x70, 0x8d, 0xfc, 0xcc, 0x88, 0xfe, 0xe5, + 0x7e, 0x00, 0xca, 0x4a, 0xfe, 0xb7, 0x26, 0xfe, 0xfb, 0x73, 0xfe, 0x07, 0x3c, 0xff, 0x21, 0x4e, + 0xff, 0xf7, 0x0c, 0xff, 0xb3, 0xeb, 0xfe, 0xc3, 0x09, 0xfe, 0xd2, 0xc3, 0xfd, 0x86, 0x96, 0xfe, + 0xdc, 0x4c, 0xff, 0xe7, 0x7a, 0xfe, 0x73, 0xfc, 0x18, 0x37, 0xf7, 0x17, 0x03, 0xcc, 0x05, 0xc4, + 0x9d, 0x0a, 0xbc, 0xab, 0x09, 0xe9, 0x73, 0xf9, 0x69, 0xf1, 0xf6, 0x26, 0x03, 0x0a, 0xbd, 0x00, + 0xff, 0x0c, 0x84, 0xfa, 0x71, 0xb8, 0x00, 0xee, 0x84, 0xfe, 0xe3, 0x33, 0xff, 0x01, 0x42, 0xff, + 0x12, 0x14, 0xff, 0x5b, 0x75, 0xff, 0x6e, 0x0f, 0x01, 0xf7, 0x1e, 0xfc, 0x98, 0xcf, 0xfd, 0xe2, + 0xff, 0x00, 0x5e, 0x78, 0xfe, 0x93, 0xff, 0xfd, 0x2d, 0x15, 0xfe, 0x8c, 0x78, 0xff, 0x25, 0x25, + 0xff, 0x01, 0xfa, 0xfe, 0xce, 0xb7, 0xfe, 0xb5, 0x04, 0xfe, 0xf9, 0xc1, 0xfd, 0x50, 0x6f, 0xfe, + 0x04, 0x23, 0xff, 0xb8, 0x7c, 0xfe, 0xa1, 0xc9, 0x1a, 0x86, 0x46, 0x16, 0xeb, 0xb9, 0x03, 0x2b, + 0xec, 0x0f, 0x86, 0x3d, 0x0b, 0xc6, 0xce, 0xf5, 0x8c, 0x4a, 0xf8, 0x2e, 0x4c, 0x0c, 0x18, 0xeb, + 0xfa, 0x75, 0x2d, 0xfa, 0xa5, 0xbd, 0x03, 0x15, 0x2e, 0xfe, 0x58, 0x08, 0xfe, 0xd2, 0xd3, 0xfe, + 0x22, 0x94, 0xff, 0xc6, 0xac, 0xfe, 0x40, 0xd6, 0x01, 0x4b, 0xca, 0xfc, 0xa3, 0xa9, 0xfc, 0x13, + 0x1d, 0x01, 0xbf, 0xdd, 0xfe, 0xfd, 0x04, 0xfe, 0x37, 0xf9, 0xfd, 0x6d, 0x76, 0xff, 0x21, 0xca, + 0xfe, 0x85, 0xea, 0xfe, 0x3f, 0x82, 0xfe, 0xfb, 0x8e, 0xfe, 0x37, 0x85, 0xfd, 0xf3, 0x96, 0xfd, + 0x72, 0x93, 0xff, 0xec, 0x0b, 0xfe, 0xd9, 0x01, 0x1d, 0xff, 0x3d, 0x16, 0xf0, 0x21, 0x00, 0xe7, + 0xd3, 0x12, 0x4c, 0xf2, 0x0d, 0x86, 0x8c, 0xf3, 0x79, 0x6c, 0xf9, 0x2d, 0x28, 0x0e, 0x3b, 0xec, + 0xf6, 0x0e, 0x23, 0xf9, 0x06, 0x1e, 0x07, 0xb0, 0x3d, 0xfe, 0xf3, 0xbd, 0xfc, 0xd7, 0x3f, 0xfe, + 0x78, 0x68, 0x00, 0xde, 0xe1, 0xfd, 0x70, 0x95, 0x01, 0x13, 0x53, 0xfe, 0xf6, 0xa5, 0xfb, 0x21, + 0xbb, 0x00, 0xf2, 0x8d, 0xff, 0xa1, 0x01, 0xfe, 0x62, 0xeb, 0xfd, 0xf7, 0x90, 0xff, 0x82, 0xa4, + 0xfe, 0xed, 0x87, 0xfe, 0xf7, 0x81, 0xfe, 0xb0, 0x83, 0xfe, 0x1d, 0xb1, 0xfd, 0x05, 0x54, 0xfd, + 0xb8, 0xf5, 0xfe, 0x36, 0xd2, 0xfd, 0xd6, 0x34, 0x20, 0x3a, 0x29, 0x17, 0x69, 0x96, 0xfb, 0xe1, + 0xcd, 0x12, 0x6f, 0xd9, 0x11, 0x5a, 0xd1, 0xf2, 0xa5, 0xbb, 0xf9, 0x63, 0x7d, 0x0f, 0x83, 0xae, + 0xf3, 0xc5, 0xc2, 0xf7, 0xf5, 0xdd, 0x09, 0xea, 0xf5, 0xfe, 0xff, 0x53, 0xfb, 0x48, 0x9f, 0xfd, + 0xfb, 0x4c, 0x01, 0x93, 0x92, 0xfd, 0xd2, 0x34, 0x00, 0x7d, 0xd7, 0xff, 0x21, 0xb0, 0xfb, 0xfe, + 0x7a, 0xff, 0x1a, 0x73, 0x00, 0xad, 0x05, 0xfe, 0x9e, 0xe1, 0xfd, 0xa6, 0x13, 0x00, 0x77, 0x25, + 0xfe, 0xfa, 0x63, 0xfe, 0x58, 0x72, 0xfe, 0x69, 0xc2, 0xfd, 0xaf, 0x47, 0xfe, 0x05, 0x66, 0xfd, + 0x52, 0xae, 0xfd, 0xfb, 0x18, 0xfe, 0x62, 0xa6, 0x23, 0x54, 0x60, 0x18, 0xa4, 0xe8, 0xf6, 0xea, + 0xfb, 0x11, 0xec, 0xe1, 0x14, 0x3b, 0x44, 0xf3, 0xc0, 0x8a, 0xfa, 0x60, 0x10, 0x10, 0xeb, 0x16, + 0xf1, 0x5c, 0x08, 0xf6, 0xec, 0xa2, 0x0b, 0xc7, 0xa4, 0x00, 0x11, 0x07, 0xfa, 0x59, 0xa8, 0xfc, + 0x88, 0x17, 0x02, 0xef, 0xa6, 0xfd, 0xa2, 0xc1, 0xfe, 0xad, 0x4c, 0x00, 0x47, 0xd0, 0xfc, 0x8b, + 0x1f, 0xfe, 0x27, 0x9d, 0x00, 0x86, 0xa1, 0xfe, 0x5f, 0xd6, 0xfd, 0x3a, 0xb2, 0x00, 0x03, 0xbd, + 0xfd, 0x4e, 0x1b, 0xfe, 0x78, 0x22, 0xfe, 0x22, 0x66, 0xfd, 0x86, 0x2c, 0xfe, 0xab, 0x62, 0xfd, + 0xb0, 0x85, 0xfd, 0x99, 0xdd, 0xfd, 0x44, 0x94, 0x26, 0xe8, 0x28, 0x1a, 0x63, 0x92, 0xf3, 0x6c, + 0xc6, 0x0e, 0xce, 0x95, 0x17, 0xed, 0x7e, 0xf5, 0x2d, 0xab, 0xfa, 0x04, 0x21, 0x11, 0xfe, 0xdf, + 0xee, 0x3a, 0x1b, 0xf4, 0x5b, 0x5d, 0x0c, 0xe1, 0xd8, 0x02, 0xa8, 0x71, 0xf9, 0xf0, 0x37, 0xfb, + 0xb6, 0xc1, 0x02, 0x36, 0x0d, 0xfe, 0x8a, 0xa4, 0xfd, 0x7f, 0x9f, 0xff, 0x48, 0x71, 0xfe, 0x68, + 0x70, 0xfd, 0xc2, 0xde, 0xff, 0x8c, 0xc5, 0xff, 0x0e, 0xd3, 0xfd, 0x33, 0x4e, 0x01, 0xba, 0x9d, + 0xfd, 0xb5, 0x89, 0xfd, 0xa7, 0xfb, 0xfd, 0x0b, 0x01, 0xfd, 0x7a, 0x9d, 0xfd, 0xa2, 0x89, 0xfd, + 0xc6, 0x25, 0xfe, 0xc6, 0x61, 0xfd, 0x1d, 0x13, 0x29, 0x17, 0x6a, 0x1c, 0x70, 0x34, 0xf1, 0x0f, + 0x97, 0x0a, 0x5b, 0xe6, 0x18, 0xcf, 0x89, 0xf8, 0xb9, 0x20, 0xfb, 0x42, 0x62, 0x12, 0xc0, 0xd8, + 0xec, 0x86, 0x4c, 0xf2, 0x5c, 0x41, 0x0c, 0x24, 0xda, 0x04, 0x74, 0xa3, 0xf9, 0x08, 0xb4, 0xf9, + 0xae, 0xf1, 0x02, 0x36, 0x99, 0xfe, 0x41, 0x23, 0xfd, 0x08, 0x2c, 0xfe, 0xa7, 0x9d, 0xff, 0xce, + 0xb7, 0xfd, 0x9b, 0xcb, 0xfe, 0x26, 0xb7, 0x00, 0x70, 0x64, 0xfe, 0xe3, 0x50, 0x01, 0xe1, 0x91, + 0xfd, 0xa7, 0x66, 0xfd, 0x4f, 0xab, 0xfd, 0xb6, 0x54, 0xfc, 0x51, 0x3e, 0xfd, 0x08, 0x9e, 0xfd, + 0x65, 0xb4, 0xfe, 0x80, 0x8a, 0xfd, 0x11, 0x8d, 0x2d, 0x4b, 0x8e, 0x1c, 0xc1, 0x5d, 0xee, 0x27, + 0x1d, 0x09, 0x05, 0xc1, 0x17, 0x23, 0x67, 0xf9, 0xd1, 0x2b, 0xff, 0x1a, 0x79, 0x12, 0xad, 0xae, + 0xe9, 0x34, 0x55, 0xf2, 0x1c, 0xc6, 0x0b, 0x8c, 0xdb, 0x05, 0xe9, 0xef, 0xf9, 0xa9, 0xe8, 0xf8, + 0x01, 0xc0, 0x02, 0xbe, 0xc3, 0xfe, 0x41, 0x33, 0xfd, 0xd9, 0xd5, 0xfc, 0xd1, 0xb2, 0xff, 0xab, + 0x84, 0xfe, 0xa6, 0x4f, 0xfe, 0x9c, 0x0c, 0x01, 0xae, 0x9f, 0xff, 0x16, 0xab, 0x00, 0x50, 0x5b, + 0xfd, 0x8f, 0xf3, 0xfd, 0x16, 0xdf, 0xfc, 0x6a, 0xea, 0xfb, 0xea, 0xe8, 0xfc, 0x85, 0x75, 0xfd, + 0xad, 0x3f, 0xff, 0xcb, 0x72, 0xfe, 0x13, 0xe2, 0x30, 0x44, 0x61, 0x1e, 0x70, 0x1c, 0xeb, 0xd7, + 0x1f, 0x08, 0x09, 0xdb, 0x15, 0x3f, 0xd5, 0xf9, 0x4a, 0x05, 0x03, 0xf6, 0x8c, 0x13, 0xd7, 0x26, + 0xe7, 0xf8, 0x87, 0xf1, 0xd6, 0xe2, 0x0b, 0x0c, 0x1e, 0x06, 0x15, 0x85, 0xfa, 0x2b, 0xa9, 0xf8, + 0x91, 0x09, 0x02, 0x92, 0xdc, 0xfe, 0x92, 0x90, 0xfd, 0x25, 0x0c, 0xfc, 0x04, 0xe7, 0xfe, 0xd5, + 0x29, 0xff, 0x1c, 0xc7, 0xfe, 0x9f, 0x4b, 0x01, 0x33, 0x7c, 0x00, 0x19, 0x00, 0x00, 0xb1, 0x90, + 0xfd, 0xd8, 0x3c, 0xfe, 0x76, 0x56, 0xfc, 0x03, 0xc8, 0xfb, 0xfd, 0x56, 0xfc, 0xb9, 0x5e, 0xfd, + 0x70, 0xd1, 0xff, 0x4c, 0x7a, 0xff, 0x3b, 0x20, 0x35, 0xbe, 0xc3, 0x1e, 0x10, 0x57, 0xe8, 0xbf, + 0xb1, 0x07, 0x83, 0xe3, 0x13, 0xf6, 0x3b, 0xf8, 0x8d, 0x6a, 0x07, 0x42, 0xfd, 0x14, 0xd3, 0x5c, + 0xe4, 0x92, 0xfc, 0xf0, 0x2e, 0x4c, 0x0c, 0xe6, 0xc0, 0x05, 0x58, 0x74, 0xfa, 0xd4, 0x61, 0xf9, + 0x09, 0xd8, 0x00, 0x7f, 0x63, 0xfe, 0x27, 0x43, 0xfe, 0x8c, 0x92, 0xfb, 0xb9, 0xe2, 0xfd, 0xe5, + 0xe5, 0xfe, 0xab, 0xfe, 0xff, 0x28, 0x0d, 0x02, 0x11, 0x16, 0x00, 0x60, 0xc3, 0xff, 0xbb, 0x1c, + 0xfe, 0x53, 0xe9, 0xfd, 0xc8, 0x35, 0xfc, 0x62, 0x99, 0xfb, 0xbe, 0xac, 0xfb, 0xdb, 0x83, 0xfd, + 0x53, 0xf5, 0xff, 0x12, 0x69, 0x00, 0xd8, 0xed, 0x37, 0xea, 0x10, 0x21, 0x5b, 0x84, 0xe5, 0x1b, + 0xfa, 0x06, 0x85, 0x6a, 0x12, 0x3e, 0x78, 0xf6, 0xf3, 0x99, 0x09, 0xc3, 0x34, 0x18, 0x44, 0xbb, + 0xe2, 0xa5, 0x4f, 0xef, 0xfb, 0x14, 0x0d, 0x59, 0x27, 0x05, 0x5f, 0x73, 0xfa, 0x73, 0x60, 0xfa, + 0x29, 0xc0, 0xff, 0xc6, 0x53, 0xfd, 0x87, 0x5f, 0xff, 0x13, 0x57, 0xfb, 0x34, 0x0d, 0xfd, 0x14, + 0x46, 0xfe, 0x73, 0xec, 0x00, 0x29, 0xeb, 0x03, 0xef, 0xb2, 0xfe, 0x85, 0xea, 0xff, 0xed, 0x26, + 0xff, 0x1c, 0x15, 0xfd, 0x89, 0xb5, 0xfc, 0x45, 0x4e, 0xfb, 0xc7, 0x36, 0xfb, 0x6c, 0x78, 0xfd, + 0x8f, 0xf6, 0xff, 0xcd, 0xe7, 0x00, 0x90, 0xe5, 0x3a, 0xd0, 0x99, 0x22, 0xc2, 0xae, 0xe3, 0x7d, + 0xdb, 0x05, 0x0f, 0x9a, 0x11, 0xf0, 0xf5, 0xf3, 0x29, 0x72, 0x0a, 0xfe, 0xcb, 0x1b, 0xab, 0x99, + 0xe1, 0x80, 0x1f, 0xee, 0x70, 0x41, 0x0d, 0x38, 0x82, 0x04, 0x63, 0x68, 0xfa, 0xa8, 0x67, 0xfb, + 0x3d, 0xbe, 0xfe, 0x71, 0xfc, 0xfb, 0x2a, 0x77, 0x00, 0xa5, 0xfa, 0xfa, 0x30, 0xe1, 0xfc, 0xac, + 0x56, 0xfd, 0x72, 0x2b, 0x01, 0xfd, 0x42, 0x06, 0x0f, 0x5a, 0xfd, 0xf4, 0xc3, 0xff, 0x59, 0x8d, + 0x00, 0xd0, 0x2b, 0xfc, 0x5c, 0x2c, 0xfd, 0x98, 0x73, 0xfb, 0x9e, 0x4e, 0xfa, 0x9b, 0x79, 0xfd, + 0xd7, 0x83, 0xff, 0xec, 0x00, 0x01, 0x1f, 0x63, 0x3d, 0xa1, 0xec, 0x23, 0x88, 0xeb, 0xe2, 0x8e, + 0x4b, 0x04, 0x9f, 0x75, 0x11, 0x89, 0x35, 0xf1, 0x51, 0xcb, 0x09, 0xc0, 0x7b, 0x1f, 0x47, 0x51, + 0xe1, 0xd2, 0xbd, 0xed, 0x75, 0x67, 0x0c, 0x1f, 0xc6, 0x03, 0xc6, 0xf5, 0xfa, 0x62, 0xf8, 0xfb, + 0x38, 0xc9, 0xfd, 0xcd, 0xfc, 0xfa, 0xd0, 0x21, 0x01, 0x83, 0xa3, 0xfa, 0xb5, 0x59, 0xfd, 0x35, + 0x68, 0xfc, 0x45, 0xa3, 0x00, 0xe6, 0x55, 0x08, 0x41, 0x23, 0xfd, 0xf8, 0xf1, 0xfe, 0xca, 0x2a, + 0x02, 0xe9, 0xeb, 0xfb, 0x1d, 0x0e, 0xfd, 0xef, 0x10, 0xfc, 0x39, 0x25, 0xf9, 0x71, 0x2b, 0xfd, + 0x63, 0xc4, 0xfe, 0xd7, 0xde, 0x00, 0x29, 0x92, 0x3f, 0x0d, 0xdb, 0x24, 0x27, 0x78, 0xe2, 0x6c, + 0xea, 0x03, 0xbf, 0x5e, 0x10, 0x3f, 0xe4, 0xee, 0xd5, 0x79, 0x08, 0xd0, 0xcb, 0x21, 0x88, 0x25, + 0xe2, 0x74, 0x2f, 0xee, 0x32, 0x08, 0x0b, 0x68, 0x59, 0x02, 0x46, 0x61, 0xfc, 0xb6, 0x01, 0xfc, + 0xa8, 0x7b, 0xfc, 0xe7, 0xc4, 0xfa, 0xf8, 0x49, 0x01, 0xdb, 0x67, 0xfa, 0x33, 0x08, 0xfe, 0xd1, + 0xb8, 0xfb, 0x80, 0xa0, 0xff, 0x45, 0x60, 0x09, 0x4c, 0x2f, 0xfe, 0xcd, 0x18, 0xfe, 0x56, 0x38, + 0x03, 0x4d, 0xcc, 0xfc, 0x27, 0x2c, 0xfc, 0xd4, 0xa3, 0xfc, 0xd1, 0x04, 0xf8, 0x67, 0x8c, 0xfc, + 0x90, 0x0f, 0xfe, 0xe6, 0x30, 0x00, 0x3b, 0xaf, 0x41, 0x0c, 0x8a, 0x25, 0xdc, 0x36, 0xe2, 0x6a, + 0x1e, 0x05, 0x6f, 0xfc, 0x0d, 0x77, 0x25, 0xed, 0x50, 0x54, 0x07, 0xfb, 0x32, 0x22, 0xf2, 0x68, + 0xe4, 0xfb, 0x0b, 0xef, 0x11, 0x3b, 0x09, 0x1d, 0xc9, 0x00, 0x59, 0x5e, 0xfe, 0x69, 0xea, 0xfb, + 0x38, 0xff, 0xfa, 0x4d, 0x35, 0xfb, 0x8d, 0xb2, 0x01, 0xe8, 0xf8, 0xf9, 0x06, 0xe6, 0xfe, 0xa1, + 0x88, 0xfb, 0x1c, 0x54, 0xfe, 0x91, 0x3b, 0x09, 0xda, 0x4c, 0x00, 0xe0, 0x43, 0xfe, 0xf3, 0xf8, + 0x02, 0x2d, 0xbc, 0xfe, 0x5c, 0x0b, 0xfb, 0xac, 0x48, 0xfc, 0xda, 0xcc, 0xf7, 0x6d, 0xdd, 0xfb, + 0x30, 0x0f, 0xfd, 0xb4, 0x97, 0xff, 0xf0, 0xe1, 0x40, 0x18, 0x57, 0x28, 0xaf, 0x3a, 0xe4, 0x4a, + 0x4a, 0x03, 0x81, 0xa5, 0x0d, 0x49, 0xc1, 0xeb, 0x25, 0xb0, 0x03, 0xe2, 0xcb, 0x22, 0xdd, 0x14, + 0xe8, 0x88, 0x7c, 0xef, 0xb5, 0x96, 0x06, 0xd8, 0xe6, 0xff, 0x6d, 0xf9, 0xff, 0x91, 0xb1, 0xfb, + 0x17, 0x0b, 0xfa, 0xd3, 0x47, 0xfb, 0xf0, 0xa9, 0x02, 0xf4, 0x51, 0xf9, 0xcd, 0x2d, 0xff, 0xa6, + 0x85, 0xfc, 0xaa, 0x42, 0xfc, 0xbc, 0xb4, 0x07, 0xf8, 0xad, 0x03, 0xe5, 0x22, 0xff, 0xed, 0x6f, + 0x01, 0x92, 0xfd, 0x00, 0x85, 0xae, 0xf9, 0x5c, 0xd3, 0xfb, 0x5f, 0x5b, 0xf8, 0x43, 0x7c, 0xfa, + 0x71, 0xda, 0xfc, 0xc3, 0x62, 0xfe, 0xc6, 0xda, 0x3d, 0xbc, 0x26, 0x2c, 0x67, 0xf0, 0xe8, 0xfa, + 0x55, 0xff, 0xe0, 0x16, 0x0e, 0x30, 0xf4, 0xeb, 0x91, 0x5d, 0xfd, 0x3d, 0x32, 0x23, 0xda, 0x89, + 0xed, 0x77, 0xc6, 0xee, 0x72, 0xa2, 0x04, 0x75, 0xd3, 0xfe, 0x03, 0xe5, 0x00, 0x64, 0x60, 0xfc, + 0x16, 0x1b, 0xf9, 0x2a, 0xac, 0xfb, 0x71, 0x4d, 0x03, 0x91, 0xf8, 0xf8, 0x46, 0x37, 0xff, 0x88, + 0xa3, 0xfd, 0xd7, 0xf3, 0xfa, 0x15, 0x1e, 0x05, 0x45, 0x7d, 0x06, 0xee, 0x63, 0x01, 0x97, 0xff, + 0xfe, 0xfc, 0xff, 0x01, 0xa2, 0x42, 0xfa, 0xfb, 0xd7, 0xfa, 0xb7, 0xf0, 0xf8, 0x55, 0xf4, 0xf9, + 0x58, 0x8a, 0xfc, 0x18, 0x77, 0xfd, 0xef, 0x32, 0x3c, 0x6c, 0xc4, 0x2d, 0x17, 0xe3, 0xec, 0x4c, + 0xfd, 0xfe, 0xa9, 0xaa, 0x0b, 0x9a, 0x2f, 0xed, 0x6d, 0x7f, 0xf8, 0xa7, 0xdd, 0x20, 0xa4, 0xcc, + 0xf3, 0x35, 0xcd, 0xed, 0xd2, 0xc8, 0x03, 0x8c, 0x6f, 0xfd, 0xf7, 0x15, 0x01, 0x18, 0xf6, 0xfd, + 0x82, 0x80, 0xf8, 0xb6, 0xec, 0xfb, 0x7c, 0xc9, 0x03, 0x92, 0xc0, 0xf8, 0x1c, 0x52, 0xff, 0x68, + 0xa7, 0xfe, 0x07, 0x81, 0xfa, 0xfd, 0x5a, 0x03, 0x72, 0x5a, 0x06, 0x6a, 0xe3, 0x03, 0x16, 0xb7, + 0xfd, 0x90, 0xd9, 0x01, 0xa6, 0xcd, 0xfb, 0xdf, 0x24, 0xfa, 0xb7, 0x83, 0xf9, 0x46, 0x0a, 0xfa, + 0xd7, 0xc6, 0xfc, 0x86, 0x9b, 0xfc, 0x4f, 0xad, 0x3c, 0x89, 0x4d, 0x2d, 0xef, 0xb3, 0xed, 0x3c, + 0x0a, 0x04, 0x3c, 0xb0, 0x06, 0xd5, 0x9d, 0xec, 0x82, 0x0a, 0xf8, 0xd4, 0x8f, 0x1b, 0x7f, 0xb7, + 0xf8, 0x4d, 0xc6, 0xee, 0x08, 0x3f, 0x02, 0xd5, 0x23, 0xfc, 0x9f, 0xf2, 0x01, 0x26, 0xa0, 0xfe, + 0x84, 0x41, 0xf9, 0xe9, 0x98, 0xfb, 0x95, 0x89, 0x03, 0x79, 0xd5, 0xf9, 0xe4, 0x70, 0xfe, 0xa3, + 0x5c, 0x00, 0xb0, 0xa4, 0xfa, 0x77, 0xce, 0x01, 0x0b, 0x9d, 0x03, 0xdf, 0x87, 0x05, 0xbe, 0x4e, + 0xff, 0x7d, 0x25, 0x00, 0x7a, 0xf2, 0xfd, 0x31, 0x2b, 0xfa, 0xb7, 0x92, 0xf9, 0xf4, 0x89, 0xfb, + 0x29, 0x9c, 0xfc, 0xd0, 0xd4, 0xfa, 0xf8, 0xd9, 0x3c, 0xf3, 0x10, 0x2d, 0x5e, 0x79, 0xed, 0xf0, + 0x2a, 0x0a, 0x5f, 0x31, 0x02, 0x62, 0x85, 0xea, 0x95, 0x87, 0xf9, 0xb7, 0x24, 0x15, 0x14, 0xa9, + 0xfc, 0xa7, 0x1e, 0xf1, 0xde, 0x69, 0xff, 0x99, 0xe7, 0xfb, 0x35, 0x74, 0x03, 0x4b, 0x2a, 0xfe, + 0xa6, 0xf8, 0xfa, 0x6d, 0xd7, 0xfa, 0xd8, 0x75, 0x02, 0x0c, 0x89, 0xfc, 0x8c, 0xbf, 0xfc, 0xff, + 0x23, 0x02, 0x1e, 0x2a, 0xfb, 0x63, 0xa5, 0xfe, 0xb7, 0x89, 0x01, 0xe3, 0xe9, 0x05, 0x6a, 0xb6, + 0x01, 0x53, 0x07, 0x00, 0x32, 0x58, 0xfe, 0x77, 0xc9, 0xfb, 0xa3, 0x59, 0xfa, 0xe5, 0x53, 0xfb, + 0x0d, 0x85, 0xfc, 0x70, 0x8e, 0xfa, 0xa1, 0x6b, 0x3c, 0xaf, 0xa8, 0x2c, 0xf6, 0x58, 0xee, 0xfc, + 0x48, 0x0e, 0x80, 0x74, 0xff, 0x9d, 0x35, 0xe8, 0xec, 0x7e, 0xfa, 0xef, 0x2f, 0x0f, 0x26, 0xa2, + 0xff, 0xfd, 0x09, 0xf4, 0x38, 0x0a, 0xfc, 0x06, 0xbf, 0xfc, 0xcf, 0x33, 0x05, 0x19, 0xd5, 0xfc, + 0x42, 0xb2, 0xfc, 0xd0, 0xd7, 0xfa, 0xd9, 0x57, 0x00, 0xed, 0x5c, 0x00, 0xc5, 0x54, 0xfb, 0xc0, + 0xfd, 0x00, 0x69, 0xf1, 0xfc, 0x30, 0x2d, 0xfc, 0x5c, 0x38, 0xff, 0xc5, 0xeb, 0x05, 0x12, 0xad, + 0x03, 0xa1, 0x46, 0x01, 0x2d, 0xe0, 0xfe, 0xa2, 0x38, 0xfd, 0x07, 0x7a, 0xfa, 0x2d, 0x0c, 0xfb, + 0x7d, 0x50, 0xfd, 0x0b, 0x7f, 0xfa, 0x86, 0xba, 0x3a, 0x5e, 0xaf, 0x2c, 0x18, 0xcf, 0xf0, 0xd3, + 0x9c, 0x0f, 0x72, 0xa8, 0xfe, 0x26, 0x74, 0xe7, 0x31, 0x1f, 0xf9, 0x8c, 0x69, 0x0a, 0xbd, 0x6f, + 0x02, 0x5d, 0x4a, 0xf6, 0x1b, 0xdb, 0xf9, 0x3e, 0xc0, 0xfd, 0x7f, 0x8e, 0x06, 0x52, 0x19, 0xfc, + 0x8a, 0x30, 0xfd, 0xb7, 0x2f, 0xfc, 0x87, 0xcc, 0xfe, 0x14, 0x9d, 0x01, 0xe0, 0x86, 0xfb, 0x5e, + 0x4c, 0xfe, 0x98, 0xf2, 0xfd, 0xed, 0x37, 0xfd, 0x6e, 0xc4, 0xfc, 0xb6, 0x4a, 0x04, 0x10, 0x37, + 0x05, 0x34, 0xf0, 0x04, 0x27, 0x23, 0xfe, 0x77, 0xbe, 0xfc, 0xce, 0x50, 0xfd, 0x69, 0x55, 0xfa, + 0x87, 0xd6, 0xfc, 0xc8, 0x32, 0xfb, 0x40, 0xc7, 0x38, 0xf7, 0x95, 0x2c, 0xdb, 0x4c, 0xf3, 0x0d, + 0x41, 0x10, 0x38, 0x4f, 0xfe, 0xe5, 0x04, 0xe8, 0xdd, 0x02, 0xf7, 0x37, 0x9a, 0x05, 0x4a, 0x9f, + 0x05, 0x25, 0x7c, 0xf8, 0x05, 0xc2, 0xf7, 0xc6, 0xa0, 0xff, 0x17, 0x01, 0x07, 0xba, 0xc5, 0xfb, + 0x95, 0x48, 0xfe, 0x9c, 0xb2, 0xfc, 0x7c, 0x8e, 0xfd, 0x9c, 0x96, 0x01, 0x39, 0x92, 0xfb, 0x3f, + 0xae, 0xfc, 0x4b, 0x3e, 0xfe, 0x4b, 0xde, 0xff, 0xf4, 0xf4, 0xfa, 0xe4, 0x85, 0x03, 0x52, 0x6c, + 0x05, 0xde, 0x78, 0x05, 0x78, 0xb8, 0x00, 0xd2, 0x11, 0xfc, 0x09, 0x90, 0xfe, 0x3f, 0x71, 0xfa, + 0x06, 0xef, 0xfc, 0x3f, 0xa2, 0xfb, 0xcd, 0x9f, 0x38, 0x12, 0x88, 0x29, 0x4e, 0x0f, 0xf6, 0xe2, + 0x3c, 0x11, 0x02, 0x8f, 0xfc, 0x7f, 0x33, 0xea, 0xab, 0x7f, 0xf4, 0xd9, 0x3e, 0x01, 0xa9, 0x49, + 0x08, 0x1d, 0x22, 0xfb, 0xbf, 0x8d, 0xf5, 0x52, 0x20, 0x01, 0x8e, 0x73, 0x08, 0xd3, 0x15, 0xfb, + 0x39, 0x6e, 0xfe, 0x1a, 0x58, 0xfc, 0x51, 0x65, 0xfd, 0xff, 0x2f, 0x00, 0xa2, 0x32, 0xfb, 0xef, + 0xfe, 0xfd, 0x99, 0xf2, 0xfc, 0x8a, 0x4c, 0x01, 0x08, 0xef, 0xfd, 0x98, 0x5f, 0x01, 0x46, 0xd9, + 0x02, 0x7e, 0x91, 0x05, 0xef, 0x3c, 0x04, 0xf0, 0xc2, 0xfb, 0xb9, 0x57, 0xfd, 0x16, 0x0a, 0xfd, + 0xa8, 0xce, 0xfc, 0xed, 0x34, 0xfb, 0xa3, 0xe1, 0x35, 0xce, 0x27, 0x28, 0x95, 0x31, 0xfa, 0x47, + 0x34, 0x10, 0xa3, 0x57, 0xfb, 0xce, 0x31, 0xef, 0x0c, 0xfd, 0xef, 0x4f, 0x56, 0xfc, 0x97, 0x3f, + 0x0d, 0x55, 0x7d, 0xfc, 0x22, 0x59, 0xf3, 0xc5, 0xdd, 0x03, 0xa1, 0x4f, 0x08, 0xde, 0x8e, 0xfa, + 0x9b, 0x0a, 0xff, 0x62, 0x3e, 0xfa, 0x3c, 0xba, 0xfd, 0xbe, 0xf6, 0x00, 0x83, 0xcc, 0xf8, 0x9d, + 0xeb, 0xff, 0x87, 0x91, 0xfe, 0x57, 0xbf, 0xff, 0x55, 0x33, 0x01, 0x4c, 0xef, 0x00, 0x20, 0xf9, + 0xff, 0xda, 0xd3, 0x04, 0x21, 0x21, 0x04, 0xf7, 0x98, 0xfe, 0x73, 0x9e, 0xfd, 0x5b, 0xd5, 0xfc, + 0x8d, 0x53, 0xfe, 0x5b, 0x13, 0xfb, 0xca, 0x2d, 0x35, 0x90, 0x0a, 0x25, 0xf5, 0x29, 0xfd, 0xbd, + 0x9b, 0x0f, 0x06, 0x51, 0xf8, 0x63, 0xf6, 0xf4, 0xb5, 0xcb, 0xee, 0x13, 0x06, 0xf6, 0x04, 0xee, + 0x10, 0x34, 0xd5, 0xff, 0x39, 0x39, 0xf1, 0x6d, 0x34, 0x05, 0xe8, 0x6f, 0x08, 0x8d, 0x75, 0xf9, + 0xe4, 0xa4, 0xfe, 0x38, 0x71, 0xf9, 0x03, 0xe0, 0xfe, 0x43, 0x7a, 0x00, 0xe2, 0xdc, 0xf7, 0x48, + 0xf7, 0x01, 0xbf, 0x68, 0x00, 0xb8, 0xd2, 0xfd, 0xfa, 0x57, 0x02, 0x71, 0xe5, 0x02, 0x74, 0x31, + 0xfe, 0xe1, 0x6e, 0x02, 0x49, 0x90, 0x02, 0x79, 0x1d, 0x01, 0x6f, 0xcf, 0xff, 0x79, 0xeb, 0xfb, + 0xea, 0x4c, 0xff, 0x74, 0x4f, 0xfc, 0x58, 0x19, 0x38, 0xe2, 0x67, 0x21, 0xcc, 0xfd, 0xf8, 0xfb, + 0x09, 0x13, 0xf9, 0xff, 0xf6, 0xdc, 0x5a, 0xf4, 0xce, 0x29, 0xf1, 0xc5, 0x8f, 0xf5, 0x14, 0xe3, + 0x0f, 0xe4, 0x56, 0x01, 0xd0, 0xc4, 0xf2, 0x78, 0x45, 0x04, 0x25, 0x56, 0x08, 0x34, 0x52, 0xf8, + 0xe6, 0xbc, 0xfd, 0x2c, 0x90, 0xfa, 0x64, 0x2b, 0xff, 0xef, 0xec, 0x00, 0xa5, 0x42, 0xf8, 0x6b, + 0xe6, 0x01, 0x77, 0x3a, 0x01, 0x2b, 0xf3, 0xfe, 0x84, 0x3f, 0x02, 0x46, 0x84, 0x02, 0x89, 0x6d, + 0xfe, 0x6f, 0xbe, 0x00, 0xae, 0xd4, 0x01, 0xca, 0xa7, 0x00, 0x97, 0x5f, 0x01, 0x54, 0x1e, 0xfe, + 0x7b, 0xc9, 0xfd, 0xf2, 0x40, 0xfe, 0x44, 0xcb, 0x3a, 0x4a, 0x9a, 0x1c, 0x9a, 0x6a, 0xf3, 0x45, + 0xa7, 0x19, 0x7f, 0xf4, 0xf5, 0xea, 0x99, 0xef, 0x73, 0x09, 0xf6, 0x1c, 0x71, 0xf7, 0xdb, 0x96, + 0x0c, 0xe3, 0x94, 0x02, 0x57, 0x51, 0xf3, 0xd9, 0x39, 0x02, 0x52, 0x7c, 0x09, 0x7f, 0xd7, 0xf7, + 0xfc, 0x89, 0xfb, 0xfb, 0x98, 0xfc, 0xec, 0x30, 0x00, 0x53, 0xbc, 0x00, 0x20, 0xeb, 0xf8, 0x62, + 0xd2, 0x00, 0xb6, 0xbb, 0x01, 0xb9, 0x8f, 0x00, 0xbe, 0x22, 0x01, 0xce, 0xc8, 0x01, 0x21, 0x4b, + 0xff, 0x04, 0x76, 0xff, 0xa1, 0x22, 0x01, 0x4c, 0x50, 0x00, 0x68, 0xd8, 0x00, 0xf7, 0xbd, 0x00, + 0x17, 0xa1, 0xfd, 0xa9, 0x0c, 0xfe, 0x01, 0xdf, 0x39, 0x35, 0x82, 0x18, 0x89, 0x0f, 0xf0, 0xa1, + 0x99, 0x20, 0x60, 0xf0, 0xf6, 0x27, 0xc8, 0xe9, 0xa3, 0x1d, 0xfa, 0xdb, 0x60, 0xfc, 0xed, 0x1c, + 0x08, 0xf9, 0x9a, 0x00, 0x03, 0x3f, 0xf6, 0x16, 0x7d, 0x00, 0xad, 0x7d, 0x09, 0x1a, 0x84, 0xf8, + 0x91, 0xa0, 0xfa, 0x35, 0xb5, 0xfe, 0x63, 0x0d, 0x00, 0x05, 0xe5, 0xff, 0xfd, 0x76, 0xfa, 0x54, + 0x3c, 0x01, 0xa0, 0x62, 0x00, 0xc8, 0xe5, 0x00, 0x38, 0xa8, 0x01, 0xa2, 0x6c, 0x01, 0x44, 0x10, + 0xff, 0xdb, 0x1b, 0x00, 0xc3, 0xf3, 0xff, 0x0e, 0x4a, 0xff, 0x0f, 0x2d, 0x02, 0xa1, 0x4d, 0x00, + 0x17, 0xf5, 0xfe, 0xbc, 0xe6, 0xfe, 0x98, 0x40, 0x38, 0xde, 0xe9, 0x14, 0x0f, 0xf1, 0xee, 0xbf, + 0xcf, 0x24, 0x72, 0x51, 0xf7, 0x80, 0xd7, 0xe5, 0x26, 0x24, 0xff, 0x66, 0x27, 0xfe, 0x52, 0xe4, + 0x02, 0x46, 0x99, 0x01, 0x61, 0x19, 0xf8, 0xbc, 0x04, 0xfe, 0x5e, 0x8d, 0x09, 0x15, 0x87, 0xfa, + 0x97, 0x60, 0xfa, 0x81, 0xef, 0xff, 0xd9, 0x19, 0x00, 0x62, 0x80, 0xfe, 0xb0, 0x3e, 0xfc, 0x15, + 0x75, 0x01, 0x31, 0x05, 0xff, 0xa6, 0xa4, 0x00, 0xd4, 0x1d, 0x02, 0x63, 0x4a, 0x01, 0x24, 0xc2, + 0xfe, 0xc1, 0x4e, 0x00, 0x64, 0x30, 0x00, 0xbb, 0x2d, 0xff, 0x84, 0xa0, 0x01, 0x63, 0x59, 0x00, + 0x15, 0x50, 0xff, 0x54, 0xfc, 0xff, 0x7f, 0xe7, 0x34, 0xb7, 0xdb, 0x13, 0x07, 0x67, 0xef, 0x17, + 0xda, 0x22, 0xf3, 0xce, 0xf8, 0xea, 0x33, 0xe9, 0x67, 0x6a, 0x00, 0x1c, 0xf7, 0xfb, 0x57, 0x58, + 0x01, 0xb8, 0x1d, 0x02, 0x9f, 0xa2, 0xf9, 0xe2, 0xdd, 0xfc, 0xa7, 0xf1, 0x08, 0xa5, 0x6c, 0xfc, + 0x0f, 0xb6, 0xfa, 0x7c, 0x5b, 0x00, 0xd3, 0xe9, 0xff, 0xcd, 0x62, 0xfe, 0x70, 0xa4, 0xfc, 0x30, + 0xd9, 0x00, 0xe6, 0xa2, 0xff, 0x70, 0xa6, 0x00, 0x71, 0xf7, 0x00, 0xe6, 0x82, 0x01, 0x4e, 0x0f, + 0xff, 0xd6, 0xe2, 0xff, 0xfa, 0x57, 0x01, 0xd6, 0xcf, 0xff, 0x1d, 0xf6, 0xff, 0xac, 0x33, 0x00, + 0xcc, 0xc9, 0xff, 0xd8, 0xe2, 0xff, 0x38, 0x69, 0x30, 0x91, 0x78, 0x13, 0x0d, 0xe3, 0xf0, 0x71, + 0xec, 0x1f, 0x83, 0x14, 0xfc, 0x2f, 0xf9, 0xea, 0x1d, 0x8f, 0xff, 0x90, 0x22, 0xfd, 0x91, 0x3a, + 0xff, 0x7d, 0x2b, 0x01, 0xcd, 0x1c, 0xfc, 0xa4, 0xe2, 0xfc, 0x16, 0x69, 0x07, 0x15, 0x38, 0xfe, + 0x62, 0x96, 0xfb, 0x63, 0x68, 0xff, 0xbc, 0x86, 0x00, 0xa2, 0xcb, 0xfe, 0xb6, 0xf7, 0xfb, 0xc9, + 0x70, 0x00, 0x70, 0xa3, 0x00, 0xc6, 0x84, 0x00, 0x58, 0x02, 0x00, 0x7d, 0x1b, 0x01, 0x76, 0x92, + 0xff, 0xbd, 0xb3, 0x00, 0x48, 0x6b, 0x01, 0xdf, 0xf6, 0xff, 0x34, 0x9e, 0xff, 0xa7, 0x6d, 0xff, + 0x08, 0x0a, 0x00, 0x0d, 0xad, 0xff, 0x1e, 0xa2, 0x26, 0x09, 0x0e, 0x16, 0x91, 0xc7, 0xfd, 0x6b, + 0x44, 0x0f, 0xad, 0xd8, 0xf8, 0xd2, 0x48, 0xf9, 0xa5, 0x83, 0xfb, 0x45, 0x50, 0xfb, 0x26, 0xb2, + 0x04, 0xeb, 0xe9, 0xff, 0xe3, 0x78, 0xf9, 0xd5, 0x9c, 0x02, 0x71, 0xa4, 0x05, 0xbd, 0x6d, 0xfc, + 0x04, 0xda, 0xfd, 0xf5, 0xdd, 0xfc, 0x48, 0x83, 0x00, 0x2c, 0x23, 0xff, 0xdc, 0x9e, 0xfb, 0x99, + 0xf6, 0x00, 0xd2, 0x34, 0xff, 0xcb, 0xf3, 0xfe, 0xfd, 0xcf, 0x00, 0x3a, 0x20, 0x01, 0x7c, 0xa7, + 0x01, 0xc7, 0x0e, 0x03, 0xdc, 0x52, 0xff, 0x5a, 0xef, 0xfd, 0x39, 0x4e, 0xff, 0xd7, 0x40, 0xfe, + 0x69, 0x70, 0xff, 0x9c, 0xf5, 0x00, 0xff, 0x80, 0x21, 0x65, 0xbb, 0x15, 0x91, 0xa3, 0xfe, 0x99, + 0xd9, 0x0d, 0x0a, 0x42, 0xfc, 0x28, 0x79, 0xf8, 0xf1, 0x74, 0xfc, 0xd8, 0x6a, 0xfc, 0xa2, 0x8c, + 0x02, 0xd7, 0x41, 0x00, 0x27, 0xd5, 0xfa, 0x66, 0xff, 0x01, 0x16, 0xf6, 0x04, 0xf4, 0x7c, 0xfd, + 0x54, 0xc1, 0xfd, 0x09, 0x25, 0xfd, 0x18, 0x97, 0x00, 0x1b, 0xc0, 0xfe, 0x31, 0xf6, 0xfb, 0x39, + 0xfd, 0x00, 0x84, 0xdf, 0xfe, 0xed, 0xcc, 0xfe, 0x73, 0x46, 0x01, 0xad, 0x12, 0x01, 0x3f, 0x68, + 0x01, 0xc7, 0x32, 0x02, 0xde, 0x23, 0xff, 0xc3, 0x15, 0xff, 0xa1, 0x5f, 0xff, 0xa2, 0xfc, 0xfd, + 0x86, 0xd9, 0xff, 0x73, 0xec, 0x00, 0xb9, 0x45, 0x1d, 0x08, 0xf1, 0x14, 0x08, 0x9d, 0xff, 0x1c, + 0x9b, 0x0d, 0x04, 0xd0, 0xfd, 0x8f, 0x2d, 0xf8, 0x54, 0xf1, 0xfd, 0x77, 0xc0, 0xfc, 0x05, 0x7a, + 0x01, 0xe2, 0x59, 0x00, 0xb9, 0x1a, 0xfc, 0x13, 0xe8, 0x01, 0x9e, 0x1f, 0x04, 0x49, 0x52, 0xfe, + 0xf5, 0x1c, 0xfe, 0x1e, 0xbe, 0xfd, 0xc9, 0x33, 0x00, 0x2f, 0xa1, 0xfe, 0xc1, 0xe2, 0xfc, 0x85, + 0x9a, 0x00, 0x63, 0xba, 0xfe, 0x8e, 0x3c, 0xff, 0xcb, 0x2c, 0x01, 0x00, 0x29, 0x01, 0xf9, 0x7b, + 0x01, 0xde, 0x28, 0x01, 0xae, 0x3a, 0xff, 0x7f, 0x2b, 0x00, 0x8c, 0x9a, 0xff, 0xdf, 0x1d, 0xfe, + 0x75, 0x08, 0x00, 0xcf, 0x29, 0x01, 0xd7, 0x0a, 0x19, 0xb3, 0x6e, 0x13, 0x0d, 0x12, 0x02, 0xc4, + 0xaf, 0x0c, 0xe5, 0xff, 0xfd, 0x2d, 0xe8, 0xf9, 0xb3, 0x4b, 0xfe, 0x3a, 0xba, 0xfc, 0xfc, 0x7b, + 0x01, 0xf4, 0x36, 0x00, 0x0f, 0xde, 0xfc, 0xf8, 0xc2, 0x01, 0x3b, 0xb9, 0x03, 0xaa, 0xb1, 0xfe, + 0xf7, 0x6f, 0xfe, 0xdb, 0x69, 0xfe, 0xe2, 0xba, 0xff, 0x0c, 0xbe, 0xfe, 0xfd, 0x6c, 0xfd, 0xfe, + 0x3f, 0x00, 0xe4, 0x17, 0xff, 0x40, 0x67, 0xff, 0x17, 0xde, 0x00, 0x0d, 0x4a, 0x01, 0x24, 0x47, + 0x01, 0x86, 0x77, 0x00, 0x7c, 0xe5, 0xff, 0x1a, 0xb9, 0x00, 0xdb, 0xe7, 0xff, 0x06, 0xc1, 0xfe, + 0x50, 0xf4, 0xff, 0x74, 0x78, 0x01, 0x12, 0xa2, 0x14, 0x35, 0x18, 0x12, 0xa9, 0x19, 0x05, 0x01, + 0xbd, 0x0a, 0x61, 0x7c, 0xfe, 0xa9, 0x8a, 0xfc, 0x39, 0xdb, 0xfd, 0x4e, 0x8a, 0xfc, 0x00, 0xf4, + 0x01, 0xd7, 0x7b, 0x00, 0xc5, 0xf9, 0xfc, 0xeb, 0x9e, 0x01, 0x8e, 0x79, 0x03, 0xff, 0xee, 0xfe, + 0x50, 0x24, 0xff, 0xab, 0x9e, 0xfe, 0x17, 0x4d, 0xff, 0xde, 0x14, 0xff, 0x0c, 0x01, 0xfe, 0x4b, + 0xf8, 0xff, 0x54, 0x3c, 0xff, 0x91, 0xa5, 0xff, 0xd5, 0x97, 0x00, 0xa9, 0x47, 0x01, 0xd6, 0xe6, + 0x00, 0x67, 0x8b, 0x00, 0xdc, 0xc1, 0x00, 0x33, 0x22, 0x01, 0x30, 0x5f, 0x00, 0xc0, 0xff, 0xfe, + 0x1c, 0x23, 0x00, 0x3d, 0x3a, 0x01, 0x9a, 0x4f, 0x10, 0xcb, 0x95, 0x10, 0x0c, 0xcc, 0x07, 0xc8, + 0x50, 0x09, 0xa1, 0x50, 0xff, 0x2f, 0x9b, 0xfe, 0x95, 0x72, 0xfd, 0xf6, 0x79, 0xfc, 0x35, 0x85, + 0x02, 0x10, 0xbf, 0x00, 0x5d, 0xfd, 0xfc, 0xaa, 0x3a, 0x01, 0x06, 0x25, 0x03, 0xe5, 0xee, 0xff, + 0xba, 0x77, 0xff, 0x1e, 0x14, 0xfe, 0x2a, 0x80, 0xff, 0x48, 0xe5, 0xff, 0x63, 0x0d, 0xfe, 0xa0, + 0x9c, 0xff, 0x58, 0x93, 0xff, 0x0c, 0x8f, 0xff, 0x75, 0xc8, 0x00, 0x84, 0x3d, 0x01, 0x22, 0x83, + 0x00, 0xab, 0x41, 0x01, 0x08, 0xc3, 0x01, 0xcf, 0x86, 0x01, 0x43, 0x22, 0x00, 0x55, 0x05, 0xff, + 0x05, 0x50, 0x00, 0x4f, 0xa0, 0x00, 0xc6, 0xd5, 0x0d, 0x10, 0x7e, 0x0f, 0xe1, 0x51, 0x08, 0x1a, + 0x1b, 0x08, 0xbe, 0x03, 0x00, 0x4f, 0x94, 0xff, 0x56, 0xfe, 0xfd, 0xc0, 0xe9, 0xfc, 0xc2, 0x0e, + 0x02, 0x5c, 0xde, 0x00, 0xf2, 0xc0, 0xfd, 0x3a, 0xfb, 0x00, 0xc1, 0x76, 0x02, 0xb6, 0x79, 0x00, + 0x15, 0xb5, 0xff, 0x90, 0xe0, 0xfd, 0x97, 0xf1, 0xff, 0xe4, 0x46, 0x00, 0xa0, 0xe4, 0xfd, 0xbb, + 0x77, 0xff, 0x98, 0xe0, 0xff, 0xbe, 0xd8, 0xff, 0xce, 0xf4, 0x00, 0x79, 0x31, 0x01, 0x4f, 0xe9, + 0x00, 0x3c, 0x26, 0x02, 0xa7, 0x3e, 0x02, 0xef, 0x05, 0x01, 0xc4, 0x6a, 0xff, 0x3e, 0x2d, 0xff, + 0xed, 0x15, 0x00, 0x08, 0x4d, 0x00, 0x7c, 0x2f, 0x0c, 0xb6, 0x3f, 0x0e, 0x1a, 0x60, 0x08, 0x9d, + 0x8e, 0x07, 0xd8, 0x21, 0x00, 0x2b, 0x79, 0x00, 0x31, 0xf7, 0xfe, 0xb9, 0xe9, 0xfc, 0x8c, 0xb8, + 0x01, 0x07, 0x66, 0x01, 0xf2, 0x7d, 0xfe, 0x21, 0x68, 0x00, 0x09, 0xfe, 0x01, 0xf4, 0x3e, 0x01, + 0x92, 0xd2, 0xff, 0x7f, 0xf1, 0xfd, 0x55, 0x59, 0x00, 0x35, 0x3b, 0x00, 0x3c, 0x06, 0xfe, 0x06, + 0xf3, 0xff, 0xbe, 0xf3, 0xff, 0x19, 0x62, 0x00, 0xba, 0xd1, 0x01, 0xb6, 0x5b, 0x01, 0xf2, 0x5e, + 0x01, 0x44, 0x75, 0x02, 0x87, 0xb7, 0x01, 0xbb, 0x34, 0x00, 0xda, 0x38, 0xff, 0xf6, 0x2b, 0xff, + 0x6b, 0x44, 0x00, 0x21, 0x89, 0x00, 0x59, 0x07, 0x0b, 0xd5, 0xbe, 0x0c, 0x06, 0xe5, 0x07, 0x9e, + 0xa1, 0x07, 0x62, 0x95, 0x00, 0xf9, 0x7b, 0x00, 0x11, 0x15, 0xff, 0xa2, 0xac, 0xfd, 0x09, 0xe8, + 0x01, 0xde, 0x26, 0x01, 0xc1, 0x78, 0xfe, 0x26, 0x60, 0x00, 0x25, 0x23, 0x02, 0xef, 0x52, 0x01, + 0x7c, 0x98, 0xff, 0x52, 0x1a, 0xfe, 0xc9, 0xaf, 0x00, 0x5f, 0x46, 0x00, 0x38, 0x2e, 0xfe, 0x02, + 0x67, 0x00, 0x41, 0xa7, 0x00, 0x1b, 0x67, 0x01, 0x19, 0x06, 0x02, 0x16, 0xc3, 0x00, 0x5e, 0x5a, + 0x01, 0xce, 0x12, 0x02, 0x96, 0x98, 0x00, 0x53, 0x96, 0xff, 0x20, 0x94, 0xff, 0x5c, 0x8b, 0xff, + 0xe1, 0xec, 0xff, 0x44, 0xe4, 0xff, 0xaf, 0xb6, 0x0a, 0x6a, 0x3e, 0x0c, 0xa9, 0xc9, 0x06, 0x9a, + 0xb1, 0x06, 0xc3, 0xea, 0x00, 0x10, 0xd2, 0x00, 0x6d, 0x94, 0xff, 0x27, 0x32, 0xfe, 0xf8, 0xaf, + 0x01, 0x8e, 0x0f, 0x01, 0x53, 0xe8, 0xfe, 0xac, 0xdd, 0x00, 0x00, 0xf2, 0x01, 0xef, 0x95, 0x00, + 0x67, 0xfa, 0xff, 0xc1, 0x12, 0xff, 0x3f, 0x80, 0x00, 0xe3, 0x5f, 0x00, 0x2e, 0x75, 0xff, 0xe2, + 0x69, 0x01, 0x61, 0x5d, 0x01, 0x59, 0x6e, 0x01, 0x2d, 0xf5, 0x00, 0x0c, 0x6c, 0x00, 0x24, 0x30, + 0x01, 0xff, 0x2e, 0x01, 0x89, 0x5c, 0x00, 0x02, 0xc8, 0xff, 0x5d, 0x7b, 0xff, 0xbd, 0x57, 0xff, + 0x86, 0xe7, 0xff, 0x7b, 0xc9, 0xff, 0xc7, 0xc7, 0x09, 0x8f, 0x28, 0x0b, 0xc8, 0x80, 0x06, 0xf0, + 0xb2, 0x06, 0x8f, 0x42, 0x01, 0xb8, 0xdb, 0x00, 0xb5, 0xae, 0xff, 0xbc, 0xbc, 0xfe, 0x96, 0xe3, + 0x01, 0x2e, 0x34, 0x01, 0x19, 0x07, 0xff, 0x1a, 0xc2, 0x00, 0x86, 0xe9, 0x01, 0x78, 0xc9, 0x00, + 0xb9, 0x58, 0x00, 0x87, 0x9f, 0xff, 0xec, 0x44, 0x01, 0x52, 0x71, 0x01, 0xa0, 0x53, 0x00, 0x17, + 0x2e, 0x01, 0x79, 0x10, 0x01, 0x0c, 0xa7, 0x00, 0x5d, 0x04, 0x00, 0x9b, 0x7a, 0x00, 0xeb, 0x02, + 0x01, 0xa3, 0x08, 0x01, 0x30, 0x20, 0x00, 0xfd, 0x7a, 0xff, 0x34, 0x80, 0xff, 0x87, 0x5a, 0xff, + 0x15, 0xdb, 0xff, 0xe8, 0x77, 0xff, 0x1b, 0x0f, 0x09, 0xe6, 0x81, 0x0a, 0xaf, 0x32, 0x06, 0xb4, + 0x61, 0x06, 0x99, 0x7e, 0x01, 0xae, 0xbb, 0x00, 0x8a, 0xf5, 0xff, 0xd5, 0x9b, 0xff, 0x14, 0x07, + 0x02, 0x98, 0xd8, 0x00, 0x3d, 0x1f, 0xff, 0x2f, 0x78, 0x01, 0xa7, 0xcd, 0x01, 0x28, 0xcb, 0x00, + 0x1c, 0xe3, 0x01, 0xe3, 0x0a, 0x01, 0x82, 0x77, 0x01, 0xda, 0x57, 0x01, 0xed, 0xec, 0xff, 0x39, + 0x82, 0x00, 0x15, 0x88, 0x00, 0xb0, 0xc2, 0xff, 0x98, 0x3b, 0x00, 0x30, 0xf3, 0x00, 0x8b, 0x6e, + 0x00, 0xe3, 0x84, 0x00, 0xce, 0xff, 0xff, 0x24, 0x83, 0xff, 0xc9, 0x68, 0xff, 0x43, 0x57, 0xff, + 0xd6, 0x9d, 0xff, 0xf6, 0x49, 0xff, 0x9e, 0xb5, 0x08, 0x0e, 0x51, 0x0a, 0x88, 0xf4, 0x05, 0x30, + 0x74, 0x05, 0x8b, 0x29, 0x01, 0xac, 0x51, 0x01, 0x9b, 0xe1, 0x00, 0x9f, 0x79, 0xff, 0x3d, 0x92, + 0x01, 0xa9, 0x7d, 0x01, 0xab, 0xc0, 0xff, 0x7e, 0x7b, 0x01, 0x5a, 0xd7, 0x02, 0x3f, 0x6e, 0x02, + 0xaa, 0x6c, 0x02, 0x42, 0xae, 0x00, 0x47, 0x6a, 0x00, 0x06, 0x78, 0x00, 0x36, 0x69, 0xff, 0xf5, + 0x37, 0x00, 0xae, 0x61, 0x00, 0x44, 0xc4, 0xff, 0xbc, 0x26, 0x00, 0x46, 0x79, 0x00, 0x79, 0x74, + 0x00, 0x2a, 0x2f, 0x00, 0x5f, 0x97, 0xff, 0x8e, 0x5b, 0xff, 0x56, 0x4c, 0xff, 0xa5, 0x66, 0xff, + 0x5d, 0x51, 0xff, 0x27, 0x03, 0xff, 0x30, 0x10, 0x08, 0x9d, 0x5e, 0x09, 0x12, 0x18, 0x06, 0xc6, + 0x0e, 0x06, 0x99, 0x71, 0x01, 0xf7, 0xbc, 0x00, 0x7a, 0xab, 0x00, 0x9a, 0xf8, 0x00, 0x40, 0x11, + 0x02, 0xab, 0x1f, 0x01, 0xe2, 0x47, 0x01, 0x80, 0x68, 0x03, 0x11, 0x4e, 0x03, 0x86, 0xcd, 0x01, + 0x4a, 0x70, 0x01, 0xe1, 0x8b, 0xff, 0x64, 0xac, 0xff, 0xa9, 0x22, 0x00, 0x38, 0xa6, 0xff, 0x40, + 0x67, 0x00, 0x09, 0xcb, 0xff, 0xf9, 0xae, 0xff, 0xdb, 0x3a, 0x00, 0x2c, 0x72, 0x00, 0x65, 0x18, + 0x00, 0xf8, 0xa9, 0xff, 0x11, 0x82, 0xff, 0xba, 0x32, 0xff, 0xee, 0x6b, 0xff, 0xf0, 0x46, 0xff, + 0x5c, 0xfb, 0xfe, 0x7d, 0xe8, 0xfe, 0x09, 0xd0, 0x07, 0x61, 0xc9, 0x09, 0x08, 0x7d, 0x06, 0x81, + 0x00, 0x05, 0x22, 0x90, 0x00, 0xfd, 0xad, 0x01, 0x73, 0xcb, 0x01, 0x13, 0x73, 0x01, 0xcf, 0x4f, + 0x03, 0xa9, 0x42, 0x03, 0xc2, 0x07, 0x02, 0xca, 0x8d, 0x02, 0x25, 0x20, 0x02, 0x4b, 0x3a, 0x00, + 0x22, 0x34, 0x00, 0x28, 0x67, 0xff, 0x70, 0xff, 0xff, 0x11, 0x19, 0x00, 0x0a, 0x66, 0xff, 0xe1, + 0x13, 0x00, 0xae, 0xec, 0xff, 0xaf, 0xe3, 0xff, 0xb8, 0x11, 0x00, 0xe7, 0x22, 0x00, 0x17, 0x6a, + 0xff, 0x1b, 0x82, 0xff, 0x31, 0x77, 0xff, 0x2c, 0x31, 0xff, 0x0d, 0x6d, 0xff, 0xea, 0xed, 0xfe, + 0xbc, 0xe9, 0xfe, 0x3d, 0xfc, 0xfe, 0x55, 0xce, 0x07, 0x2c, 0xbe, 0x09, 0x05, 0x85, 0x06, 0xdc, + 0xf1, 0x04, 0xf7, 0x81, 0x00, 0xd4, 0x06, 0x02, 0x67, 0x2f, 0x04, 0xf2, 0x88, 0x04, 0x2e, 0x43, + 0x03, 0xb2, 0x0e, 0x02, 0x4a, 0x19, 0x01, 0x37, 0xac, 0x00, 0x35, 0x0d, 0x01, 0xb7, 0xba, 0xff, + 0xa9, 0x17, 0x00, 0x6d, 0xd2, 0xff, 0xb2, 0x4b, 0xff, 0x4b, 0xc9, 0xff, 0x61, 0xd2, 0xff, 0xb3, + 0xfe, 0xff, 0x57, 0xeb, 0xff, 0xbd, 0xad, 0xff, 0x27, 0x90, 0xff, 0x7d, 0xd2, 0xff, 0xa1, 0x3e, + 0xff, 0x1a, 0x35, 0xff, 0xc1, 0x67, 0xff, 0x1e, 0x32, 0xff, 0x34, 0x44, 0xff, 0x39, 0x02, 0xff, + 0x34, 0xda, 0xfe, 0xcf, 0x14, 0xff, 0x25, 0x8b, 0x07, 0x8d, 0x7c, 0x09, 0xe9, 0x7d, 0x06, 0x10, + 0xae, 0x05, 0xaa, 0xfb, 0x02, 0xac, 0xe6, 0x03, 0x80, 0x75, 0x04, 0x88, 0xc0, 0x04, 0x69, 0x74, + 0x02, 0x5f, 0x54, 0xff, 0xcb, 0x50, 0xff, 0x1e, 0xf9, 0x00, 0x77, 0x0f, 0x01, 0x3f, 0x49, 0xff, + 0x4a, 0x8f, 0xff, 0x24, 0x8f, 0xff, 0x70, 0x83, 0xff, 0xe2, 0xb5, 0xff, 0x27, 0xc2, 0xff, 0x29, + 0xde, 0xff, 0x07, 0x78, 0xff, 0x56, 0x77, 0xff, 0x71, 0x85, 0xff, 0xac, 0x3a, 0xff, 0x62, 0xe6, + 0xfe, 0xa5, 0x45, 0xff, 0xba, 0x38, 0xff, 0xe7, 0x50, 0xff, 0xbe, 0x48, 0xff, 0xf5, 0xd3, 0xfe, + 0x48, 0x15, 0xff, 0x12, 0x3b, 0xff, 0xb0, 0xcc, 0x06, 0x6c, 0xe2, 0x0a, 0xa4, 0x2d, 0x09, 0x3f, + 0x06, 0x07, 0xd0, 0xbe, 0x03, 0xd4, 0xbc, 0x03, 0xaa, 0x2d, 0x04, 0xf8, 0x9c, 0x02, 0x12, 0x06, + 0x00, 0xd8, 0x12, 0x00, 0xf0, 0xee, 0xff, 0xd9, 0x2d, 0x00, 0x8f, 0x98, 0x00, 0x8f, 0x5b, 0xff, + 0x22, 0x00, 0x00, 0x58, 0x91, 0xff, 0xc0, 0x4b, 0xff, 0xb6, 0x05, 0x00, 0x6f, 0x9a, 0xff, 0x57, + 0x8d, 0xff, 0x44, 0xbb, 0xff, 0xc5, 0x82, 0xff, 0xbe, 0x0f, 0xff, 0xeb, 0x01, 0xff, 0x66, 0x0e, + 0xff, 0xf9, 0x70, 0xff, 0x00, 0x7a, 0xff, 0xb2, 0x63, 0xff, 0x88, 0x50, 0xff, 0x70, 0x0c, 0xff, + 0x6a, 0x3c, 0xff, 0x27, 0x3b, 0xff, 0xcc, 0x9a, 0x08, 0x47, 0xdc, 0x0f, 0x07, 0x75, 0x0a, 0x09, + 0xfd, 0x03, 0x77, 0x0a, 0x02, 0xbf, 0xa7, 0x03, 0xfa, 0x0b, 0x02, 0xd2, 0x08, 0x01, 0xd6, 0x96, + 0x01, 0x29, 0xc6, 0xff, 0x2b, 0x06, 0xff, 0x53, 0xd9, 0xff, 0xe8, 0x38, 0x01, 0xae, 0xde, 0xff, + 0x61, 0x04, 0xff, 0x07, 0xd2, 0xff, 0xe1, 0x7a, 0xff, 0x5f, 0x44, 0xff, 0xbd, 0xbc, 0xff, 0x41, + 0xd7, 0xff, 0xd3, 0x7a, 0xff, 0x1f, 0x2c, 0xff, 0x7b, 0xe9, 0xfe, 0x94, 0x0c, 0xff, 0xca, 0x55, + 0xff, 0xea, 0x75, 0xff, 0x6d, 0x86, 0xff, 0x57, 0x69, 0xff, 0x3e, 0x37, 0xff, 0x8b, 0x23, 0xff, + 0x84, 0x28, 0xff, 0x36, 0x12, 0xff, 0x6c, 0x04, 0x0a, 0xd3, 0x0f, 0x10, 0x95, 0x5f, 0x09, 0x10, + 0xc1, 0x04, 0x0d, 0x08, 0x01, 0x20, 0xee, 0x00, 0x4c, 0x64, 0x03, 0x66, 0xe5, 0x02, 0xa4, 0xc4, + 0xff, 0x5a, 0x7b, 0xff, 0xb1, 0xae, 0x00, 0x27, 0xd7, 0xff, 0x34, 0x5f, 0x00, 0x13, 0x2c, 0x00, + 0x6c, 0x93, 0xff, 0xc7, 0x52, 0xff, 0x82, 0x1e, 0xff, 0x35, 0x40, 0xff, 0x82, 0xad, 0xff, 0x63, + 0xca, 0xff, 0xd9, 0x6e, 0xff, 0xd5, 0x59, 0xff, 0xd9, 0xd5, 0xfe, 0xd1, 0x2a, 0xff, 0xdb, 0x6b, + 0xff, 0x73, 0x59, 0xff, 0x5b, 0x53, 0xff, 0x93, 0x54, 0xff, 0xc0, 0x49, 0xff, 0xef, 0x23, 0xff, + 0xed, 0x0a, 0xff, 0xe6, 0x1b, 0xff, 0x7b, 0x83, 0x07, 0x25, 0x7f, 0x0d, 0xb8, 0x2e, 0x0a, 0x86, + 0x7d, 0x05, 0x78, 0x25, 0x01, 0xe2, 0xb9, 0x01, 0xde, 0xb4, 0x03, 0x58, 0xba, 0x02, 0x19, 0x9b, + 0x00, 0x43, 0xfb, 0xff, 0x82, 0xec, 0x00, 0xa7, 0xe9, 0x00, 0xee, 0x74, 0x00, 0x15, 0xe5, 0xff, + 0x35, 0x17, 0x00, 0x93, 0x72, 0xff, 0x40, 0x0f, 0xff, 0xb9, 0x43, 0xff, 0xbf, 0x31, 0xff, 0x3c, + 0x77, 0xff, 0x9a, 0xe9, 0xff, 0x5f, 0x82, 0xff, 0xfb, 0xf0, 0xfe, 0x88, 0x89, 0xff, 0x27, 0x67, + 0xff, 0x1d, 0x37, 0xff, 0x17, 0x29, 0xff, 0x81, 0x30, 0xff, 0x0c, 0x2f, 0xff, 0x9f, 0x22, 0xff, + 0x48, 0x3b, 0xff, 0xce, 0x1b, 0xff, 0xe5, 0x29, 0x07, 0xd7, 0xe1, 0x0c, 0x99, 0xf5, 0x07, 0x4e, + 0xa0, 0x03, 0xdc, 0x82, 0x02, 0xa0, 0xc6, 0x02, 0x00, 0xe4, 0x02, 0xce, 0x92, 0x02, 0xb6, 0x0d, + 0x02, 0x01, 0xb0, 0x00, 0x0f, 0x9d, 0x00, 0x8c, 0xd0, 0x01, 0xa7, 0x82, 0x01, 0x67, 0x4f, 0x00, + 0xac, 0x1b, 0x00, 0x12, 0xe8, 0xff, 0x15, 0x75, 0xff, 0x1e, 0xe7, 0xfe, 0xb9, 0x47, 0xff, 0x65, + 0x82, 0xff, 0xbc, 0x5c, 0xff, 0x0d, 0xa6, 0xff, 0x28, 0xa8, 0xff, 0x70, 0xa3, 0xff, 0x44, 0x8d, + 0xff, 0xfb, 0x8c, 0xff, 0x09, 0x29, 0xff, 0x9c, 0xef, 0xfe, 0x84, 0xfc, 0xfe, 0xb6, 0x1e, 0xff, + 0xd8, 0x3e, 0xff, 0x7e, 0x25, 0xff, 0x50, 0xd0, 0x06, 0x76, 0x14, 0x0c, 0x58, 0x97, 0x06, 0x71, + 0xec, 0x02, 0x91, 0x89, 0x03, 0xbb, 0x67, 0x02, 0xe2, 0x41, 0x01, 0xf4, 0xc2, 0x02, 0x47, 0x9e, + 0x02, 0x8b, 0x1f, 0x01, 0x02, 0xa6, 0x01, 0x68, 0xcc, 0x01, 0x76, 0x6f, 0x01, 0xd2, 0xa1, 0x01, + 0xb7, 0x24, 0x01, 0x6e, 0xd1, 0xff, 0xc7, 0xd7, 0xff, 0xd9, 0xd2, 0xff, 0x94, 0xf4, 0xfe, 0x97, + 0x0c, 0xff, 0x0a, 0xa4, 0xff, 0xac, 0xa2, 0xff, 0x69, 0x3c, 0xff, 0x56, 0x07, 0x00, 0x91, 0x24, + 0x00, 0x78, 0x7b, 0xff, 0x96, 0x7c, 0xff, 0xb6, 0x2c, 0xff, 0x5c, 0xd7, 0xfe, 0x84, 0xd8, 0xfe, + 0x8f, 0x0e, 0xff, 0xe9, 0x3f, 0xff, 0x1b, 0x65, 0x06, 0xf1, 0x12, 0x0b, 0x3d, 0x34, 0x06, 0x79, + 0x65, 0x03, 0xac, 0xe7, 0x03, 0x9f, 0xbb, 0x01, 0x49, 0x54, 0x00, 0xb0, 0xa8, 0x02, 0x24, 0x58, + 0x02, 0x4e, 0x99, 0x00, 0x75, 0x70, 0x01, 0x16, 0x68, 0x02, 0x1b, 0x35, 0x02, 0xce, 0x7a, 0x01, + 0x21, 0x27, 0x01, 0x0d, 0x1c, 0x01, 0x26, 0x93, 0x00, 0xba, 0xc9, 0xff, 0x5c, 0xb2, 0xff, 0x52, + 0x78, 0xff, 0xbb, 0x25, 0xff, 0x02, 0x56, 0xff, 0x64, 0xa0, 0xff, 0xfe, 0xc4, 0xff, 0xe3, 0xc0, + 0xff, 0xaf, 0x12, 0x00, 0x23, 0xc4, 0xff, 0x13, 0x2f, 0xff, 0x19, 0x30, 0xff, 0x26, 0xf4, 0xfe, + 0xcc, 0xb1, 0xfe, 0x60, 0xfc, 0xfe, 0xb9, 0x82, 0x06, 0x96, 0x14, 0x0b, 0x1b, 0x21, 0x06, 0x3c, + 0x52, 0x03, 0x7b, 0xf0, 0x03, 0x9a, 0x7f, 0x01, 0x4c, 0xda, 0xff, 0x00, 0xc0, 0x02, 0x5c, 0x64, + 0x02, 0x56, 0xcb, 0xff, 0x98, 0x88, 0x00, 0x99, 0x44, 0x02, 0x7a, 0x03, 0x02, 0x53, 0xa8, 0x01, + 0x70, 0xed, 0x01, 0x23, 0xe4, 0x00, 0x55, 0x7d, 0x00, 0x96, 0x0a, 0x01, 0xe6, 0x7a, 0x00, 0x46, + 0x68, 0xff, 0xcd, 0xc2, 0xff, 0xdf, 0xf5, 0xff, 0xe9, 0x2e, 0xff, 0xe1, 0x90, 0xff, 0xd6, 0x26, + 0x00, 0xd4, 0xe0, 0xff, 0x07, 0x8b, 0xff, 0xdb, 0xa8, 0xff, 0x12, 0x6c, 0xff, 0x43, 0x11, 0xff, + 0x99, 0x12, 0xff, 0x91, 0xea, 0xfe, 0xc4, 0x8d, 0x06, 0x5e, 0xf8, 0x0a, 0x73, 0x3b, 0x06, 0x8f, + 0x22, 0x04, 0x5d, 0x47, 0x04, 0x38, 0x87, 0x00, 0xc9, 0x53, 0xff, 0xe9, 0x71, 0x03, 0x25, 0x6e, + 0x02, 0xa2, 0x1a, 0xff, 0x51, 0x35, 0x00, 0x58, 0xd5, 0x01, 0x37, 0x59, 0x01, 0xae, 0x08, 0x01, + 0x90, 0xaf, 0x01, 0x85, 0x26, 0x01, 0xaa, 0x95, 0x00, 0x48, 0xc5, 0x00, 0x52, 0xce, 0x00, 0xe6, + 0x6f, 0x00, 0x97, 0x04, 0x00, 0xff, 0x0d, 0x00, 0xfe, 0x15, 0x00, 0x05, 0xe7, 0xff, 0xd2, 0xb5, + 0xff, 0x4a, 0xd2, 0xff, 0x3c, 0xc6, 0xff, 0xfa, 0x60, 0xff, 0xb3, 0x35, 0xff, 0xf2, 0x6d, 0xff, + 0x54, 0x41, 0xff, 0x8b, 0x1d, 0xff, 0x35, 0xf4, 0x06, 0x37, 0xbb, 0x0b, 0x11, 0x6a, 0x06, 0x66, + 0xdf, 0x03, 0xb1, 0x4c, 0x04, 0xf7, 0x7c, 0x00, 0x28, 0x1b, 0xff, 0xc1, 0x59, 0x03, 0x00, 0x6d, + 0x02, 0x81, 0xe9, 0xfe, 0xc4, 0xeb, 0xff, 0xd5, 0x7c, 0x01, 0x4e, 0x25, 0x01, 0xd3, 0xc0, 0x00, + 0xcc, 0xf3, 0x00, 0x26, 0xa3, 0x00, 0x48, 0x11, 0x00, 0xd0, 0x7e, 0x00, 0x3f, 0x1b, 0x01, 0x2b, + 0x70, 0x00, 0x32, 0x0a, 0x00, 0x2a, 0xb9, 0x00, 0x81, 0x85, 0x00, 0x6c, 0x38, 0x00, 0x73, 0x71, + 0x00, 0xe3, 0x16, 0x00, 0x44, 0x76, 0xff, 0x95, 0x3f, 0xff, 0x9c, 0x33, 0xff, 0x71, 0x26, 0xff, + 0x83, 0x2b, 0xff, 0xad, 0x55, 0xff, 0x9c, 0x8e, 0x07, 0x30, 0x60, 0x0c, 0xdd, 0x83, 0x06, 0xac, + 0x3c, 0x04, 0xb2, 0x5e, 0x04, 0x5d, 0xe0, 0xff, 0xea, 0x02, 0xff, 0x58, 0xc7, 0x03, 0x3f, 0x42, + 0x02, 0x18, 0x90, 0xfe, 0x17, 0xd3, 0xff, 0x57, 0x89, 0x01, 0x33, 0xe3, 0x00, 0x68, 0x48, 0x00, + 0xd6, 0x28, 0x01, 0x44, 0x8d, 0x00, 0xdc, 0x34, 0xff, 0x15, 0x9b, 0xff, 0x65, 0xb5, 0x00, 0x98, + 0x82, 0x00, 0x22, 0x0e, 0x00, 0xaf, 0xa7, 0x00, 0x6d, 0xce, 0x00, 0xa4, 0xe8, 0x00, 0x11, 0xcb, + 0x00, 0x04, 0x90, 0x00, 0x1a, 0x42, 0x00, 0x81, 0x61, 0xff, 0xbe, 0xca, 0xfe, 0xcd, 0x00, 0xff, + 0x16, 0x48, 0xff, 0x4c, 0x21, 0xff, 0x7d, 0x6f, 0x08, 0xb1, 0x73, 0x0d, 0xb4, 0x74, 0x06, 0x38, + 0x09, 0x04, 0xc7, 0x6d, 0x04, 0x40, 0xb6, 0xff, 0xa8, 0xfa, 0xfe, 0x28, 0xc4, 0x03, 0x39, 0xfd, + 0x01, 0x63, 0x5f, 0xfe, 0xe9, 0xef, 0xff, 0xd9, 0x5d, 0x01, 0xe7, 0xa5, 0x00, 0x23, 0x19, 0x00, + 0x46, 0xec, 0x00, 0x83, 0xc2, 0x00, 0xd9, 0x39, 0xff, 0x6f, 0xf2, 0xfe, 0x45, 0xb2, 0xff, 0x0f, + 0x18, 0x00, 0x26, 0xc1, 0xff, 0xc7, 0x2e, 0x00, 0xe0, 0x07, 0x01, 0x9f, 0x0c, 0x01, 0x91, 0xfb, + 0x00, 0x25, 0x15, 0x01, 0x34, 0xa6, 0x00, 0x04, 0xe2, 0xff, 0x27, 0x37, 0xff, 0xdf, 0xf0, 0xfe, + 0xf5, 0xf6, 0xfe, 0xee, 0x13, 0xff, 0x72, 0xfd, 0x08, 0x23, 0x80, 0x0e, 0x52, 0xd7, 0x06, 0x60, + 0xc7, 0x03, 0xe6, 0x85, 0x04, 0xfe, 0xa2, 0xff, 0xbb, 0xa3, 0xfe, 0x85, 0x19, 0x04, 0x09, 0xdb, + 0x01, 0x88, 0xd3, 0xfd, 0x6c, 0xf5, 0xff, 0xbf, 0x70, 0x01, 0xdf, 0x8a, 0x00, 0x52, 0xc9, 0xff, + 0x3b, 0x85, 0x00, 0x0d, 0xf6, 0x00, 0x11, 0x8c, 0xff, 0x4e, 0xa0, 0xfe, 0x58, 0x4e, 0xff, 0xaa, + 0x8e, 0xff, 0x53, 0x1a, 0xff, 0xc5, 0xa7, 0xff, 0xb6, 0x74, 0x00, 0xbc, 0x04, 0x01, 0xeb, 0x25, + 0x01, 0xf2, 0x0e, 0x01, 0x96, 0xfd, 0x00, 0xd2, 0x48, 0x00, 0x02, 0x9a, 0xff, 0xb8, 0x5d, 0xff, + 0x20, 0x2e, 0xff, 0x22, 0x07, 0xff, 0x1c, 0x02, 0x0a, 0x23, 0xe3, 0x0f, 0x74, 0xc5, 0x06, 0xd8, + 0x3d, 0x03, 0x04, 0xc1, 0x04, 0xe4, 0xa6, 0xff, 0x3a, 0x69, 0xfe, 0x8e, 0x43, 0x04, 0x17, 0xba, + 0x01, 0xde, 0x87, 0xfd, 0xb9, 0x00, 0x00, 0x47, 0x4a, 0x01, 0xee, 0x56, 0x00, 0x6f, 0xd3, 0xff, + 0x3b, 0x35, 0x00, 0x9d, 0xe4, 0x00, 0x46, 0xb9, 0xff, 0xf0, 0xb9, 0xfe, 0x7d, 0x19, 0xff, 0x0a, + 0x45, 0xff, 0xba, 0x02, 0xff, 0x39, 0x0e, 0xff, 0xbe, 0xc3, 0xff, 0xda, 0xbd, 0x00, 0x29, 0xf7, + 0x00, 0xf2, 0xc9, 0x00, 0x48, 0x10, 0x01, 0xd4, 0x7d, 0x00, 0x34, 0xc7, 0xff, 0xd7, 0xc3, 0xff, + 0xed, 0x81, 0xff, 0xa0, 0x4e, 0xff, 0x4c, 0x3f, 0x0b, 0x89, 0x46, 0x11, 0x28, 0x8a, 0x06, 0x3f, + 0xdd, 0x02, 0xb4, 0xee, 0x04, 0x4f, 0x48, 0xff, 0xaa, 0x69, 0xfe, 0xd2, 0xa7, 0x04, 0xfc, 0x3b, + 0x01, 0x73, 0x2c, 0xfd, 0xb7, 0x30, 0x00, 0x17, 0x63, 0x01, 0x38, 0xed, 0xff, 0x2c, 0x77, 0xff, + 0xda, 0x2b, 0x00, 0xc8, 0xc9, 0x00, 0x39, 0xcf, 0xff, 0xc4, 0xbf, 0xfe, 0xa2, 0xf6, 0xfe, 0x4f, + 0x30, 0xff, 0x02, 0xe6, 0xfe, 0x7b, 0xd8, 0xfe, 0x05, 0x6f, 0xff, 0x15, 0x3c, 0x00, 0xe9, 0xaa, + 0x00, 0x17, 0x69, 0x00, 0x63, 0x99, 0x00, 0x0b, 0x6c, 0x00, 0xac, 0xd7, 0xff, 0x6d, 0xcc, 0xff, + 0x21, 0xaa, 0xff, 0xd5, 0xb0, 0xff, 0x38, 0xaf, 0x0c, 0xb9, 0xce, 0x12, 0x94, 0x1c, 0x06, 0xd8, + 0x8c, 0x02, 0xfb, 0x21, 0x05, 0x13, 0xc4, 0xfe, 0x43, 0x93, 0xfe, 0x62, 0x22, 0x05, 0xbb, 0xa2, + 0x00, 0x22, 0xeb, 0xfc, 0xad, 0x6f, 0x00, 0x80, 0x6d, 0x01, 0xdf, 0xaf, 0xff, 0x55, 0x2f, 0xff, + 0x43, 0xff, 0xff, 0x69, 0xa3, 0x00, 0xa8, 0xc6, 0xff, 0x26, 0xf7, 0xfe, 0x83, 0x10, 0xff, 0xc7, + 0xeb, 0xfe, 0xcb, 0xc6, 0xfe, 0x4f, 0xf0, 0xfe, 0x26, 0x76, 0xff, 0x97, 0xce, 0xff, 0x2a, 0x74, + 0x00, 0x19, 0x3c, 0x00, 0x02, 0x1f, 0x00, 0xff, 0x25, 0x00, 0x0b, 0x60, 0xff, 0xf1, 0xa7, 0xff, + 0xc9, 0xf1, 0xff, 0x4a, 0xd6, 0xff, 0xa3, 0x0a, 0x0e, 0xd4, 0x52, 0x14, 0xe1, 0xce, 0x05, 0x48, + 0x4f, 0x02, 0xc2, 0x59, 0x05, 0xc2, 0x03, 0xfe, 0x1e, 0xad, 0xfe, 0x7a, 0xe1, 0x05, 0x79, 0xfb, + 0xff, 0x15, 0x82, 0xfc, 0xea, 0xb4, 0x00, 0x2f, 0x89, 0x01, 0x43, 0x83, 0xff, 0x98, 0xd5, 0xfe, + 0x81, 0xbf, 0xff, 0xc4, 0x85, 0x00, 0x8a, 0xac, 0xff, 0xf0, 0xf5, 0xfe, 0xd7, 0x31, 0xff, 0x4c, + 0xd9, 0xfe, 0x4f, 0xa3, 0xfe, 0xc9, 0xd4, 0xfe, 0x54, 0xb4, 0xff, 0x4c, 0xa3, 0xff, 0xba, 0xf6, + 0xff, 0x8f, 0x80, 0x00, 0xc2, 0xd1, 0xff, 0xce, 0x94, 0xff, 0x4f, 0x1c, 0xff, 0xa0, 0x38, 0xff, + 0x26, 0xa8, 0xff, 0xe5, 0xd4, 0xff, 0xdb, 0x4e, 0x0f, 0x14, 0xfd, 0x15, 0xd4, 0xa1, 0x05, 0x1c, + 0xdb, 0x01, 0x08, 0xa7, 0x05, 0xdd, 0x3e, 0xfd, 0x53, 0x8d, 0xfe, 0x17, 0xa4, 0x06, 0x5a, 0x6d, + 0xff, 0x54, 0x1f, 0xfc, 0xb8, 0xe9, 0x00, 0x6c, 0x7e, 0x01, 0x76, 0x74, 0xff, 0xee, 0xa1, 0xfe, + 0xde, 0x44, 0xff, 0xe0, 0x5c, 0x00, 0xac, 0xa9, 0xff, 0xb7, 0xe9, 0xfe, 0xc9, 0x27, 0xff, 0xba, + 0xbc, 0xfe, 0xc3, 0xa2, 0xfe, 0x87, 0xb1, 0xfe, 0x52, 0xc7, 0xff, 0x86, 0xd9, 0xff, 0x61, 0x81, + 0xff, 0xaa, 0x61, 0x00, 0x3e, 0x01, 0x00, 0x5d, 0x24, 0xff, 0xe4, 0xe8, 0xfe, 0xcf, 0xe2, 0xfe, + 0xf0, 0x0c, 0xff, 0xbe, 0x94, 0xff, 0x9d, 0x50, 0x10, 0xbd, 0xba, 0x17, 0x8b, 0xc2, 0x05, 0x84, + 0x38, 0x01, 0xb3, 0x05, 0x06, 0x51, 0xc5, 0xfc, 0x91, 0x3f, 0xfe, 0x46, 0x4d, 0x07, 0x07, 0x17, + 0xff, 0x21, 0xd6, 0xfb, 0xc3, 0x2a, 0x01, 0x84, 0x91, 0x01, 0x84, 0x2c, 0xff, 0xd4, 0xa4, 0xfe, + 0x34, 0x07, 0xff, 0x8b, 0xea, 0xff, 0xa5, 0xa9, 0xff, 0x3f, 0xea, 0xfe, 0xae, 0x3a, 0xff, 0x9f, + 0xb6, 0xfe, 0x49, 0x83, 0xfe, 0x2f, 0x84, 0xfe, 0x87, 0xcf, 0xff, 0xea, 0x5d, 0x00, 0x65, 0x74, + 0xff, 0x25, 0xb9, 0xff, 0xfd, 0x2e, 0x00, 0x80, 0x4f, 0xff, 0x1f, 0xa7, 0xfe, 0x95, 0xc5, 0xfe, + 0x73, 0x79, 0xfe, 0xa0, 0x38, 0xff, 0x41, 0xdc, 0x11, 0xe3, 0x31, 0x19, 0x9d, 0x6a, 0x05, 0xdc, + 0x19, 0x01, 0xfd, 0x12, 0x06, 0xe6, 0x02, 0xfc, 0x22, 0x4f, 0xfe, 0x3e, 0x95, 0x07, 0x23, 0x67, + 0xfe, 0x23, 0x05, 0xfc, 0x62, 0x53, 0x01, 0xbe, 0x70, 0x01, 0x70, 0xe8, 0xfe, 0xcd, 0x87, 0xfe, + 0xd2, 0x19, 0xff, 0x67, 0x47, 0xff, 0x45, 0x5b, 0xff, 0xab, 0x07, 0xff, 0xc8, 0x5e, 0xff, 0x44, + 0x9e, 0xfe, 0x9c, 0x4f, 0xfe, 0x7d, 0x5d, 0xfe, 0xf6, 0xc4, 0xff, 0x8c, 0x86, 0x00, 0x51, 0xcb, + 0xff, 0x07, 0x6d, 0xff, 0x71, 0xa6, 0xff, 0x30, 0x9e, 0xff, 0xd4, 0x7b, 0xfe, 0x79, 0x8e, 0xfe, + 0x6a, 0x66, 0xfe, 0x3d, 0xb0, 0xfe, 0x22, 0xc0, 0x13, 0x4c, 0x42, 0x1a, 0x35, 0xd9, 0x04, 0x8e, + 0xc3, 0x01, 0x67, 0xc0, 0x05, 0xb0, 0x48, 0xfb, 0x3b, 0x95, 0xfe, 0x15, 0xa3, 0x07, 0x20, 0xb2, + 0xfd, 0x4a, 0x5a, 0xfc, 0xa7, 0x9f, 0x01, 0x83, 0x49, 0x01, 0x8e, 0xbd, 0xfe, 0xa2, 0x3e, 0xfe, + 0xf3, 0x7f, 0xff, 0xe8, 0xae, 0xfe, 0x31, 0xdd, 0xfe, 0x7d, 0x37, 0xff, 0xd5, 0x71, 0xff, 0xa5, + 0xc5, 0xfe, 0xa7, 0x1b, 0xfe, 0xf1, 0x37, 0xfe, 0xfd, 0xe4, 0xff, 0xe5, 0x6d, 0x00, 0x2a, 0xe3, + 0xff, 0x36, 0xee, 0xff, 0x24, 0x28, 0xff, 0x35, 0x3e, 0xff, 0x79, 0xa7, 0xfe, 0x98, 0x75, 0xfe, + 0xbc, 0x5c, 0xfe, 0x41, 0x6d, 0xfe, 0x0b, 0x44, 0x15, 0xe8, 0x0b, 0x1b, 0x16, 0xde, 0x04, 0x2c, + 0x7d, 0x02, 0x3a, 0x7a, 0x05, 0x33, 0xfb, 0xfa, 0xd1, 0x58, 0xfe, 0xc4, 0x88, 0x07, 0xf0, 0x6d, + 0xfd, 0xf9, 0x9d, 0xfc, 0x73, 0x9a, 0x01, 0x21, 0x5d, 0x01, 0xdf, 0xe2, 0xfe, 0xba, 0xa9, 0xfd, + 0xac, 0xc9, 0xff, 0xc4, 0x87, 0xfe, 0x40, 0x49, 0xfe, 0x57, 0x20, 0xff, 0x7f, 0x8e, 0xff, 0xe5, + 0xfa, 0xfe, 0xd1, 0x40, 0xfe, 0x35, 0xef, 0xfd, 0x7e, 0xce, 0xff, 0xac, 0xa9, 0x00, 0x03, 0xb5, + 0xff, 0x4d, 0x50, 0x00, 0x4d, 0x36, 0xff, 0x15, 0xbe, 0xfe, 0x91, 0xa6, 0xfe, 0x61, 0x6f, 0xfe, + 0x38, 0x42, 0xfe, 0xf8, 0x74, 0xfe, 0xcd, 0x7c, 0x16, 0x3e, 0x80, 0x1b, 0x74, 0x46, 0x05, 0x47, + 0x54, 0x03, 0x97, 0x5b, 0x05, 0x66, 0x02, 0xfb, 0x05, 0x88, 0xfd, 0x77, 0x67, 0x07, 0xe0, 0x58, + 0xfd, 0x6e, 0xc5, 0xfc, 0x21, 0xa4, 0x01, 0xe0, 0x2b, 0x01, 0x79, 0x48, 0xff, 0xb4, 0x4c, 0xfd, + 0xec, 0x8d, 0xff, 0x1c, 0xb5, 0xfe, 0x23, 0xec, 0xfd, 0x07, 0x79, 0xfe, 0x12, 0xca, 0xff, 0x54, + 0x3e, 0xff, 0x8a, 0x64, 0xfe, 0x98, 0xe3, 0xfd, 0x25, 0x48, 0xff, 0xa2, 0x3a, 0x01, 0xf2, 0x97, + 0xff, 0x6d, 0x0f, 0x00, 0xd8, 0x90, 0xff, 0x4c, 0xac, 0xfe, 0x9f, 0x67, 0xfe, 0x4a, 0x2a, 0xfe, + 0x87, 0x3f, 0xfe, 0xd3, 0x83, 0xfe, 0xf7, 0xf0, 0x17, 0x52, 0x71, 0x1b, 0x2b, 0x54, 0x05, 0x6a, + 0xa7, 0x04, 0x39, 0xd2, 0x05, 0xd0, 0x86, 0xfa, 0xc2, 0x93, 0xfc, 0x58, 0x9e, 0x07, 0xe8, 0xe6, + 0xfc, 0x44, 0xc8, 0xfc, 0x6c, 0xfb, 0x01, 0xbf, 0xd3, 0x00, 0x4d, 0x54, 0xff, 0xa1, 0x84, 0xfd, + 0xe1, 0x1f, 0xff, 0x16, 0x96, 0xfe, 0x56, 0x07, 0xfe, 0x82, 0x9e, 0xfd, 0x08, 0xab, 0xff, 0x1e, + 0xc7, 0xff, 0xcc, 0x55, 0xfe, 0x38, 0x0a, 0xfe, 0xb7, 0xf9, 0xfe, 0xee, 0x3c, 0x01, 0xad, 0x00, + 0x00, 0xa5, 0x80, 0xff, 0x99, 0xa9, 0xff, 0x94, 0x0b, 0xff, 0xfc, 0x11, 0xfe, 0x57, 0xd3, 0xfd, + 0xf3, 0x63, 0xfe, 0x56, 0x60, 0xfe, 0x16, 0x25, 0x1a, 0xc3, 0xc9, 0x1a, 0x77, 0x0e, 0x04, 0x68, + 0x57, 0x07, 0x01, 0xdb, 0x06, 0x2e, 0xc2, 0xf8, 0x00, 0x56, 0xfc, 0xee, 0x28, 0x08, 0xf1, 0xde, + 0xfb, 0x1e, 0xd3, 0xfc, 0xc7, 0x72, 0x02, 0x03, 0xac, 0x00, 0xbf, 0xfe, 0xfe, 0x58, 0xeb, 0xfd, + 0x30, 0x25, 0xff, 0xdb, 0xf2, 0xfd, 0x85, 0x49, 0xfe, 0xbf, 0x46, 0xfd, 0xac, 0xfc, 0xfe, 0xed, + 0x3a, 0x00, 0xbd, 0x93, 0xfe, 0xa4, 0x04, 0xfe, 0x54, 0x46, 0xff, 0x3f, 0xce, 0x00, 0x77, 0x42, + 0x00, 0x0f, 0x95, 0xff, 0xee, 0x6b, 0xff, 0x04, 0x29, 0xff, 0xdc, 0x05, 0xfe, 0x15, 0xbd, 0xfd, + 0x38, 0x6d, 0xfe, 0x7a, 0x31, 0xfe, 0x82, 0x17, 0x1c, 0x21, 0xc3, 0x19, 0x06, 0x82, 0x02, 0xa0, + 0x50, 0x0b, 0xc3, 0x22, 0x08, 0xe3, 0xd7, 0xf5, 0xc9, 0xfd, 0xfc, 0xaa, 0x63, 0x09, 0x15, 0xf1, + 0xf9, 0x11, 0x9e, 0xfc, 0xb6, 0x6b, 0x03, 0x59, 0xbc, 0x00, 0x58, 0x7c, 0xfe, 0xa6, 0x02, 0xfe, + 0x4a, 0xa3, 0xff, 0x8d, 0x8d, 0xfd, 0xaa, 0x41, 0xfe, 0x9b, 0x41, 0xfd, 0xb6, 0x1b, 0xfe, 0xf1, + 0x41, 0x00, 0x49, 0x90, 0xff, 0x9d, 0x9d, 0xfd, 0xd9, 0x97, 0xff, 0xaf, 0xca, 0x00, 0x91, 0x0a, + 0x00, 0x30, 0x47, 0x00, 0x1a, 0xf6, 0xfe, 0xe6, 0xff, 0xfe, 0x33, 0x7a, 0xfe, 0x16, 0xcc, 0xfd, + 0xfe, 0xf2, 0xfd, 0x42, 0x78, 0xfe, 0x41, 0xd5, 0x1c, 0xa4, 0xd3, 0x18, 0xb3, 0xb7, 0x01, 0xca, + 0x60, 0x0f, 0x41, 0x63, 0x09, 0x4f, 0xa1, 0xf2, 0xaa, 0x70, 0xfe, 0xea, 0x5d, 0x0b, 0xdf, 0xc0, + 0xf6, 0x1b, 0xe6, 0xfb, 0xc8, 0x30, 0x05, 0xed, 0xee, 0x00, 0x0c, 0xac, 0xfd, 0xae, 0xbc, 0xfd, + 0xcf, 0x65, 0x00, 0x49, 0x81, 0xfd, 0xf3, 0xff, 0xfd, 0x09, 0x54, 0xfd, 0x67, 0x44, 0xfd, 0x27, + 0xa7, 0xff, 0x3b, 0xb9, 0x00, 0xcb, 0x93, 0xfd, 0xe4, 0x60, 0xff, 0x5e, 0x31, 0x01, 0xb6, 0xa4, + 0xff, 0xbe, 0xe3, 0x00, 0x24, 0xeb, 0xfe, 0xb3, 0xb1, 0xfe, 0xb4, 0xcb, 0xfe, 0x67, 0xe4, 0xfd, + 0x61, 0x7d, 0xfd, 0xbe, 0xd6, 0xfe, 0x8b, 0x82, 0x1e, 0x8f, 0x34, 0x1a, 0x7b, 0xa4, 0xfe, 0xc8, + 0x5f, 0x0f, 0xf9, 0xec, 0x0c, 0x1c, 0x0a, 0xf2, 0x0c, 0x66, 0xfd, 0xae, 0x76, 0x0c, 0x02, 0x05, + 0xf5, 0xaa, 0x0b, 0xfb, 0xb1, 0x7c, 0x06, 0xd8, 0xcc, 0x00, 0x06, 0xdc, 0xfc, 0x1d, 0xa8, 0xfd, + 0x5e, 0x21, 0x01, 0x98, 0x0e, 0xfd, 0xcc, 0x91, 0xfd, 0x88, 0xce, 0xfd, 0xd2, 0xe2, 0xfc, 0x27, + 0x66, 0xfe, 0x68, 0x03, 0x01, 0x06, 0x99, 0xfe, 0x47, 0xcb, 0xfe, 0x42, 0x6b, 0x01, 0xcd, 0xb7, + 0xff, 0x94, 0xe9, 0x00, 0x3a, 0x25, 0xff, 0xa6, 0x80, 0xfe, 0x91, 0xd8, 0xfe, 0xef, 0xd1, 0xfd, + 0x66, 0x42, 0xfd, 0x7d, 0xb1, 0xfe, 0x05, 0x7e, 0x21, 0x55, 0x80, 0x1b, 0x19, 0x58, 0xfb, 0x54, + 0x6b, 0x0d, 0x12, 0x88, 0x10, 0x81, 0x06, 0xf3, 0x16, 0x45, 0xfc, 0xa0, 0x87, 0x0c, 0xdc, 0xfe, + 0xf3, 0x10, 0x86, 0xfa, 0xd6, 0x52, 0x07, 0xb6, 0xf9, 0x00, 0x9a, 0xc1, 0xfb, 0x94, 0xb5, 0xfd, + 0xe7, 0xe8, 0x01, 0xbc, 0xbc, 0xfc, 0xbf, 0xf5, 0xfc, 0x78, 0x31, 0xfe, 0xb2, 0x15, 0xfd, 0x6a, + 0x62, 0xfd, 0x2d, 0x66, 0x00, 0xcd, 0xc7, 0xff, 0xd7, 0xd7, 0xfe, 0xc2, 0x19, 0x01, 0x1c, 0x52, + 0x00, 0x33, 0xce, 0x00, 0x0a, 0x46, 0xff, 0x43, 0xc3, 0xfe, 0xd9, 0xbb, 0xfe, 0x31, 0x92, 0xfd, + 0x0d, 0x39, 0xfd, 0x19, 0x53, 0xfe, 0xbc, 0x6a, 0x24, 0x90, 0x09, 0x1d, 0x58, 0xf5, 0xf7, 0xb5, + 0x2c, 0x0b, 0x99, 0xb1, 0x12, 0xb3, 0x6d, 0xf5, 0x3a, 0xa4, 0xfb, 0x8c, 0xc0, 0x0b, 0x2c, 0x9a, + 0xf3, 0xab, 0xff, 0xf9, 0xb7, 0xd6, 0x07, 0x3d, 0x60, 0x01, 0x7d, 0x9f, 0xfa, 0x48, 0xa1, 0xfd, + 0xce, 0x75, 0x02, 0xd9, 0x8b, 0xfc, 0x91, 0x5f, 0xfc, 0x0e, 0x48, 0xfe, 0xe0, 0x75, 0xfd, 0x38, + 0xcd, 0xfc, 0x4c, 0x38, 0xff, 0x33, 0x9e, 0x00, 0x28, 0x82, 0xff, 0x83, 0x66, 0x00, 0x93, 0xfe, + 0x00, 0x68, 0xf3, 0x00, 0xb0, 0x50, 0xff, 0x6a, 0x49, 0xff, 0xd2, 0x7d, 0xfe, 0x2c, 0x21, 0xfd, + 0x4c, 0x58, 0xfd, 0x71, 0x04, 0xfe, 0xe0, 0x14, 0x27, 0x2e, 0x13, 0x1f, 0x16, 0x4e, 0xf5, 0xe9, + 0x15, 0x08, 0x33, 0xf5, 0x13, 0x81, 0x82, 0xf8, 0x20, 0x99, 0xfb, 0x40, 0x95, 0x0a, 0xd1, 0x46, + 0xf3, 0xc1, 0xc8, 0xf9, 0xc7, 0xc7, 0x07, 0x8f, 0x0d, 0x02, 0x06, 0xb4, 0xf9, 0xf6, 0x5b, 0xfd, + 0xd4, 0xec, 0x02, 0xdd, 0x73, 0xfc, 0x30, 0x1f, 0xfc, 0x93, 0x06, 0xfe, 0x45, 0x05, 0xfe, 0x4a, + 0xab, 0xfc, 0x6e, 0x09, 0xfe, 0x53, 0xb7, 0x00, 0x60, 0x96, 0x00, 0x43, 0xec, 0xff, 0xff, 0x38, + 0x01, 0xd2, 0x80, 0x01, 0x09, 0x83, 0xff, 0xe9, 0xbd, 0xff, 0xe8, 0x37, 0xfe, 0x3b, 0xca, 0xfc, + 0x9f, 0x4f, 0xfd, 0x84, 0xd1, 0xfd, 0xb0, 0x83, 0x29, 0x2d, 0x5f, 0x21, 0x76, 0x4c, 0xf3, 0x66, + 0x7d, 0x04, 0x61, 0x68, 0x14, 0x73, 0x41, 0xfb, 0x8c, 0x81, 0xfc, 0xef, 0x74, 0x09, 0xce, 0x6b, + 0xf2, 0x12, 0x2c, 0xfa, 0x9f, 0x52, 0x07, 0x6e, 0x78, 0x02, 0x08, 0x50, 0xf9, 0x0c, 0xce, 0xfc, + 0x4b, 0x17, 0x03, 0xd6, 0x6c, 0xfc, 0x16, 0x11, 0xfc, 0x36, 0x92, 0xfd, 0x46, 0x78, 0xfe, 0x13, + 0xd3, 0xfc, 0xcb, 0x59, 0xfd, 0x00, 0xf7, 0xff, 0xa7, 0x7a, 0x01, 0xec, 0x26, 0x00, 0x23, 0xea, + 0x00, 0x31, 0x34, 0x02, 0xab, 0xf7, 0xff, 0x66, 0xe8, 0xff, 0x72, 0xf0, 0xfd, 0xd7, 0xbb, 0xfc, + 0x3e, 0x16, 0xfd, 0x39, 0x77, 0xfd, 0x48, 0x60, 0x2b, 0x48, 0x26, 0x24, 0x9e, 0xa9, 0xf1, 0x80, + 0xe5, 0x00, 0xa8, 0x32, 0x14, 0xb5, 0x28, 0xfd, 0x2b, 0x1f, 0xfe, 0xd4, 0xef, 0x08, 0x29, 0xde, + 0xf0, 0x60, 0x0a, 0xfb, 0x0f, 0xd9, 0x06, 0x2a, 0x31, 0x02, 0x03, 0x98, 0xf9, 0x64, 0x22, 0xfc, + 0xcf, 0xb8, 0x02, 0x00, 0x7d, 0xfc, 0xa7, 0x38, 0xfc, 0x79, 0xfc, 0xfc, 0xe0, 0xcb, 0xfe, 0x4d, + 0x24, 0xfd, 0x2b, 0x2c, 0xfd, 0x84, 0xdf, 0xfe, 0x4e, 0xb8, 0x01, 0x9b, 0xcd, 0x00, 0x18, 0xa0, + 0x00, 0xb5, 0xcf, 0x02, 0xda, 0x8d, 0x00, 0xe5, 0xde, 0xff, 0xe4, 0xcb, 0xfd, 0x55, 0xd8, 0xfc, + 0x0e, 0xcb, 0xfc, 0xf6, 0x0c, 0xfd, 0xb4, 0xdb, 0x2d, 0xaa, 0x7c, 0x26, 0x76, 0x74, 0xef, 0x5c, + 0xee, 0xfe, 0xd4, 0x0b, 0x13, 0x01, 0xae, 0xfd, 0xb6, 0x98, 0x00, 0xf2, 0xf5, 0x08, 0x1a, 0xc5, + 0xee, 0x01, 0x49, 0xfc, 0x87, 0xc8, 0x06, 0x9d, 0x10, 0x01, 0xd0, 0x56, 0xfa, 0x79, 0xca, 0xfb, + 0x82, 0xd9, 0x01, 0x61, 0x67, 0xfc, 0x43, 0xcc, 0xfc, 0x1f, 0x48, 0xfc, 0x72, 0x2a, 0xff, 0x21, + 0x9e, 0xfd, 0x34, 0x1f, 0xfd, 0x9f, 0x2f, 0xfe, 0xfe, 0x56, 0x01, 0x3d, 0x62, 0x01, 0x98, 0x9d, + 0x00, 0x72, 0x9b, 0x03, 0xb7, 0x0d, 0x01, 0xb3, 0x92, 0xff, 0x1e, 0xf1, 0xfd, 0xfa, 0xde, 0xfc, + 0x88, 0x8d, 0xfc, 0x2c, 0xb6, 0xfc, 0x4f, 0x9a, 0x32, 0x41, 0x50, 0x26, 0xe6, 0x08, 0xec, 0x8b, + 0x40, 0x00, 0x46, 0x2e, 0x10, 0x15, 0xdf, 0xfc, 0x6f, 0x1e, 0x04, 0x35, 0x47, 0x08, 0x1d, 0xde, + 0xec, 0xcd, 0xfc, 0xfd, 0x59, 0xc3, 0x06, 0x23, 0x38, 0xff, 0x73, 0x52, 0xfb, 0x02, 0xa0, 0xfb, + 0x12, 0x9b, 0x00, 0xa8, 0x39, 0xfc, 0xe2, 0x44, 0xfd, 0x7b, 0xea, 0xfb, 0xf6, 0x60, 0xff, 0xb9, + 0x2b, 0xfe, 0x2d, 0xfe, 0xfc, 0xf8, 0xee, 0xfd, 0x14, 0xc8, 0x00, 0x3c, 0x81, 0x01, 0x83, 0xb7, + 0x00, 0xb5, 0xb2, 0x04, 0x81, 0x7b, 0x01, 0x2d, 0xcb, 0xfe, 0x6d, 0x58, 0xfe, 0x61, 0xa6, 0xfc, + 0x5e, 0x3c, 0xfc, 0x61, 0xa3, 0xfc, 0x73, 0x25, 0x37, 0x3b, 0x18, 0x26, 0x33, 0xda, 0xe8, 0x58, + 0x5e, 0x02, 0x1f, 0x85, 0x0c, 0x32, 0x0b, 0xfc, 0x35, 0xfc, 0x06, 0xd7, 0xca, 0x07, 0x99, 0xf3, + 0xeb, 0x9d, 0x14, 0xff, 0x30, 0xad, 0x06, 0xbb, 0x6a, 0xfd, 0x9e, 0xbb, 0xfc, 0x31, 0xfb, 0xfa, + 0xae, 0x6f, 0xff, 0x64, 0x5e, 0xfc, 0x26, 0x4c, 0xfd, 0xc7, 0x3c, 0xfc, 0x69, 0x57, 0xff, 0x56, + 0x95, 0xfe, 0x8a, 0x4e, 0xfd, 0x3f, 0x82, 0xfd, 0xed, 0x77, 0x00, 0x31, 0x66, 0x01, 0x28, 0x8e, + 0x00, 0x42, 0x12, 0x06, 0x04, 0x0b, 0x02, 0x10, 0xc6, 0xfd, 0x46, 0xaf, 0xfe, 0xa9, 0x79, 0xfc, + 0xa9, 0xbb, 0xfb, 0x11, 0xf2, 0xfc, 0x65, 0x99, 0x3a, 0x4f, 0x80, 0x26, 0x3b, 0xae, 0xe6, 0x21, + 0x28, 0x04, 0xaa, 0x15, 0x09, 0xed, 0x06, 0xfb, 0x08, 0xfa, 0x08, 0x53, 0xad, 0x07, 0xc8, 0x32, + 0xec, 0x88, 0x87, 0xff, 0x1d, 0x32, 0x06, 0x92, 0x58, 0xfc, 0x07, 0xfa, 0xfd, 0x38, 0x37, 0xfa, + 0x22, 0x61, 0xfe, 0x69, 0xba, 0xfc, 0xee, 0x6f, 0xfd, 0x4d, 0x93, 0xfc, 0x48, 0x4e, 0xff, 0xcb, + 0xe6, 0xfe, 0xf9, 0xe5, 0xfd, 0x06, 0x1f, 0xfd, 0xfe, 0x37, 0x00, 0x8a, 0x91, 0x01, 0x68, 0xfd, + 0xff, 0x9a, 0x2d, 0x07, 0xd2, 0xe8, 0x02, 0x8a, 0xe8, 0xfc, 0x69, 0x93, 0xfe, 0x9c, 0x97, 0xfc, + 0x93, 0x5c, 0xfb, 0xfc, 0x68, 0xfd, 0xc1, 0xb8, 0x3c, 0xc7, 0x7f, 0x27, 0xa7, 0xca, 0xe5, 0x67, + 0xee, 0x04, 0x34, 0x0f, 0x06, 0x2f, 0x96, 0xf9, 0x90, 0xe9, 0x09, 0xf8, 0xd3, 0x07, 0x17, 0x18, + 0xed, 0x69, 0x59, 0xff, 0x18, 0x4f, 0x05, 0x3a, 0xaa, 0xfb, 0xed, 0xe0, 0xfe, 0x75, 0x87, 0xf9, + 0x0e, 0x2f, 0xfd, 0xd8, 0x3f, 0xfd, 0x3e, 0xd2, 0xfd, 0x9f, 0x2e, 0xfc, 0x4f, 0x8f, 0xff, 0xf0, + 0x0a, 0xff, 0x17, 0x44, 0xfe, 0x6c, 0x2c, 0xfd, 0x18, 0x97, 0xff, 0x05, 0x54, 0x02, 0x70, 0x09, + 0xff, 0x9c, 0xed, 0x06, 0xbc, 0x0b, 0x04, 0x56, 0xb8, 0xfc, 0xb0, 0x96, 0xfd, 0xd6, 0xf5, 0xfc, + 0x87, 0x7d, 0xfb, 0x35, 0x64, 0xfd, 0x36, 0x9d, 0x3d, 0x6d, 0xd3, 0x28, 0x0f, 0x8c, 0xe6, 0xd8, + 0xd7, 0x04, 0x77, 0x90, 0x03, 0xa2, 0xec, 0xf7, 0xeb, 0xf9, 0x09, 0xe7, 0x42, 0x08, 0x10, 0x67, + 0xee, 0x83, 0x06, 0xff, 0xdc, 0x31, 0x04, 0x16, 0x2a, 0xfb, 0x2c, 0xb5, 0xff, 0x20, 0x16, 0xf9, + 0x56, 0x2a, 0xfc, 0x01, 0xe4, 0xfd, 0x8c, 0x47, 0xfe, 0xd9, 0x52, 0xfb, 0x61, 0x1b, 0x00, 0x18, + 0x2b, 0xff, 0xcd, 0x3f, 0xfe, 0xab, 0x06, 0xfe, 0xb4, 0xc9, 0xfe, 0x64, 0x58, 0x03, 0x1b, 0x0f, + 0xfe, 0x1e, 0x0f, 0x05, 0x2a, 0x51, 0x05, 0x6c, 0x8e, 0xfd, 0x8a, 0x6f, 0xfc, 0xa0, 0x5b, 0xfd, + 0x0d, 0x13, 0xfc, 0x50, 0x44, 0xfd, 0x4c, 0x1a, 0x3d, 0xf7, 0xd6, 0x2a, 0x6a, 0xa9, 0xe8, 0xe2, + 0x28, 0x04, 0x8e, 0x57, 0x01, 0xeb, 0x73, 0xf6, 0xa2, 0xfe, 0x08, 0xb5, 0xf6, 0x08, 0xe2, 0x18, + 0xf0, 0x08, 0x6e, 0xfe, 0x3b, 0x49, 0x03, 0x27, 0x65, 0xfa, 0xfb, 0xdf, 0x00, 0x4e, 0x00, 0xf9, + 0xa2, 0x78, 0xfb, 0x7a, 0x51, 0xfe, 0x93, 0xa6, 0xfe, 0xef, 0x85, 0xfa, 0x6f, 0x87, 0x00, 0x4e, + 0x98, 0xff, 0xc1, 0xae, 0xfd, 0x43, 0xf7, 0xff, 0x14, 0xed, 0xfd, 0xdc, 0x6b, 0x03, 0x43, 0xea, + 0xfd, 0x70, 0x4c, 0x02, 0x86, 0x99, 0x05, 0x86, 0x96, 0xff, 0x01, 0x45, 0xfc, 0xd1, 0xdc, 0xfc, + 0xcb, 0x5e, 0xfd, 0x08, 0x89, 0xfd, 0xfd, 0x74, 0x3c, 0x4b, 0xc4, 0x2b, 0x10, 0x38, 0xec, 0x87, + 0x52, 0x03, 0xf1, 0x3e, 0xff, 0x4c, 0x20, 0xf5, 0x79, 0x19, 0x07, 0x1a, 0x09, 0x0a, 0xf0, 0x54, + 0xf1, 0xd6, 0x37, 0xfe, 0x6a, 0x4e, 0x02, 0x03, 0x85, 0xf9, 0x06, 0x68, 0x02, 0x24, 0x4c, 0xf9, + 0xac, 0xd5, 0xfa, 0xa2, 0x6a, 0xfe, 0x0f, 0x00, 0xff, 0x18, 0xca, 0xf9, 0x87, 0xfe, 0x00, 0x08, + 0xdd, 0xff, 0xbc, 0x76, 0xfd, 0x54, 0x1d, 0x02, 0x68, 0x72, 0xfc, 0x72, 0xd0, 0x02, 0x54, 0xdd, + 0xfe, 0x72, 0x3b, 0xff, 0x7a, 0xc0, 0x04, 0x3a, 0x66, 0x02, 0x4c, 0xba, 0xfc, 0x29, 0x77, 0xfc, + 0xbc, 0x1b, 0xff, 0x68, 0xe7, 0xfc, 0x63, 0x1c, 0x3b, 0xf5, 0xa0, 0x2c, 0xd5, 0x2f, 0xf0, 0x09, + 0x75, 0x02, 0x3d, 0xa0, 0xfd, 0xad, 0x3c, 0xf3, 0xd5, 0xda, 0x04, 0x8d, 0x1d, 0x0b, 0x9d, 0xf7, + 0xf1, 0x07, 0x47, 0xfe, 0xaf, 0x47, 0x01, 0xa7, 0xc5, 0xf8, 0xb5, 0x49, 0x04, 0x95, 0x89, 0xf9, + 0xe0, 0x46, 0xfa, 0xf1, 0x05, 0xfe, 0xba, 0x35, 0xff, 0x52, 0xae, 0xf9, 0x12, 0x89, 0x00, 0x30, + 0x22, 0x01, 0xb4, 0x01, 0xfd, 0x04, 0x96, 0x02, 0x81, 0x21, 0xfc, 0xe2, 0x3f, 0x01, 0x71, 0x18, + 0x00, 0xda, 0xad, 0xfd, 0x35, 0x89, 0x02, 0xcd, 0x3d, 0x04, 0xc5, 0xec, 0xfe, 0xdc, 0x69, 0xfc, + 0x78, 0x30, 0xff, 0x4c, 0xbb, 0xfc, 0x9f, 0x7b, 0x39, 0x76, 0x7a, 0x2d, 0x1a, 0xaf, 0xf3, 0x1d, + 0x20, 0x03, 0xdc, 0xfb, 0xfb, 0x43, 0x1e, 0xf1, 0xff, 0x3b, 0x03, 0x78, 0x3c, 0x0b, 0x24, 0xfd, + 0xf2, 0x42, 0x52, 0xfe, 0x2d, 0xea, 0x00, 0xb9, 0x7f, 0xf8, 0x66, 0x2d, 0x06, 0xa7, 0x0e, 0xfa, + 0x95, 0x7d, 0xf9, 0xbf, 0xee, 0xfd, 0xa1, 0x1a, 0xff, 0x77, 0x5c, 0xfa, 0xf5, 0x5b, 0x00, 0x10, + 0xd9, 0x01, 0x6f, 0x12, 0xfc, 0x43, 0xbd, 0x02, 0x84, 0x9e, 0xfc, 0x2c, 0x4d, 0xff, 0xdd, 0xea, + 0x01, 0x11, 0xbf, 0xfd, 0x1b, 0x75, 0xff, 0x1d, 0xa0, 0x05, 0x35, 0x7e, 0x01, 0x7c, 0x0d, 0xfc, + 0x38, 0x61, 0xff, 0x5d, 0xc6, 0xfd, 0xaf, 0x2a, 0x37, 0x7e, 0xaa, 0x2e, 0x56, 0xb3, 0xf6, 0x68, + 0x32, 0x04, 0x55, 0xf0, 0xfa, 0xd6, 0x96, 0xee, 0xd0, 0xb2, 0x01, 0x86, 0x98, 0x0a, 0xc4, 0x43, + 0xf4, 0x04, 0x7b, 0xfe, 0x5d, 0xb7, 0x00, 0x5b, 0xdc, 0xf8, 0x48, 0x8d, 0x07, 0x4e, 0x69, 0xfa, + 0xdb, 0x13, 0xf9, 0xfa, 0x52, 0xfd, 0x56, 0x5e, 0xff, 0xf5, 0x51, 0xfc, 0x79, 0x3a, 0xfe, 0x8f, + 0x0d, 0x02, 0x76, 0x45, 0xfc, 0x70, 0x4c, 0x01, 0x5a, 0x02, 0xfe, 0xed, 0xe9, 0xfe, 0x7f, 0x55, + 0x01, 0x4a, 0x41, 0x00, 0x32, 0x25, 0xfe, 0xee, 0x18, 0x03, 0x21, 0x83, 0x03, 0xfa, 0xc4, 0xfd, + 0x7c, 0x58, 0xff, 0x44, 0x80, 0xfd, 0x21, 0x61, 0x35, 0x29, 0x94, 0x2e, 0x3e, 0xbd, 0xf9, 0x18, + 0x12, 0x05, 0x32, 0x78, 0xfa, 0x42, 0x4d, 0xec, 0xfa, 0x9a, 0xff, 0x00, 0x9b, 0x09, 0x61, 0xe5, + 0xf5, 0x6d, 0xde, 0xfe, 0x09, 0x85, 0x00, 0xab, 0xac, 0xf9, 0xbc, 0x5f, 0x08, 0x87, 0xd0, 0xfa, + 0x8b, 0xe4, 0xf7, 0x23, 0x7c, 0xfe, 0x86, 0x69, 0xff, 0x7e, 0x41, 0xfc, 0x5b, 0x44, 0xfd, 0xa9, + 0x1e, 0x01, 0xaf, 0x86, 0xfc, 0x0a, 0xfe, 0x00, 0xb2, 0xc5, 0xfe, 0xd9, 0xfd, 0xfe, 0x66, 0x03, + 0x01, 0x84, 0x39, 0x03, 0xc2, 0x56, 0xfd, 0xe1, 0xe8, 0xfe, 0x3d, 0x64, 0x05, 0x7f, 0x46, 0xff, + 0x3d, 0xdc, 0xfe, 0x4e, 0xe1, 0xfd, 0x74, 0x5b, 0x34, 0x52, 0x48, 0x2d, 0x11, 0x29, 0xfc, 0xc3, + 0xc5, 0x06, 0x09, 0xb9, 0xf9, 0x6d, 0xa3, 0xea, 0x87, 0x66, 0xfd, 0xa9, 0xf0, 0x07, 0xf0, 0xcb, + 0xf8, 0x27, 0x59, 0xff, 0x2f, 0x29, 0xff, 0x68, 0x7c, 0xfc, 0x43, 0xb7, 0x07, 0x0a, 0x46, 0xfa, + 0x2f, 0xe2, 0xf9, 0x63, 0xce, 0xfd, 0x50, 0x80, 0xfe, 0xbe, 0x0d, 0xfd, 0x72, 0x76, 0xfb, 0x76, + 0x2a, 0x00, 0xb8, 0x4d, 0xfe, 0x2c, 0x6c, 0x00, 0xb2, 0x31, 0xfe, 0xa4, 0xc1, 0x01, 0x57, 0xa0, + 0x00, 0x36, 0x4b, 0x02, 0x60, 0x2d, 0x00, 0xee, 0x7f, 0xfc, 0xdb, 0xb5, 0x02, 0x27, 0xad, 0x00, + 0x96, 0x2e, 0x00, 0x90, 0x6f, 0xfe, 0xc5, 0x35, 0x33, 0xa1, 0x18, 0x2c, 0x34, 0xbd, 0xfd, 0x5e, + 0x93, 0x08, 0x66, 0x27, 0xf9, 0xdc, 0x49, 0xe9, 0x39, 0x92, 0xfa, 0x4d, 0x7d, 0x07, 0x5f, 0x5e, + 0xfb, 0x33, 0xc2, 0xff, 0x95, 0x80, 0xfe, 0xcd, 0xc3, 0xfd, 0xbd, 0xca, 0x07, 0xc4, 0xf0, 0xfa, + 0xae, 0x11, 0xfa, 0x69, 0x4e, 0xfd, 0x8f, 0xe3, 0xfd, 0x48, 0x53, 0xfc, 0x64, 0xed, 0xfa, 0x17, + 0xd8, 0x00, 0x3d, 0xd6, 0xfd, 0x00, 0xdb, 0x00, 0xf4, 0xea, 0xff, 0x46, 0x51, 0x01, 0xa6, 0x79, + 0x00, 0xfd, 0xa3, 0x02, 0x5b, 0x19, 0x02, 0x59, 0x6a, 0xfb, 0x0b, 0x29, 0xff, 0x7d, 0xdb, 0x00, + 0x92, 0xdb, 0x01, 0x0d, 0x2c, 0xff, 0xb7, 0x81, 0x33, 0x82, 0xd6, 0x28, 0x65, 0x46, 0xff, 0x6a, + 0xd1, 0x0a, 0xa1, 0x4e, 0xf7, 0x09, 0x00, 0xe9, 0x56, 0x13, 0xf9, 0x86, 0xc7, 0x05, 0x1b, 0x66, + 0xff, 0xde, 0xe8, 0xff, 0x07, 0xee, 0xfb, 0xcd, 0x8e, 0x01, 0xf4, 0x23, 0x07, 0x98, 0xf8, 0xf9, + 0x78, 0xe1, 0xfb, 0xca, 0x89, 0xfb, 0xcf, 0x89, 0xfc, 0x0f, 0x97, 0xfd, 0x61, 0xee, 0xfa, 0x79, + 0x97, 0xff, 0x57, 0xa9, 0xff, 0x2f, 0xdb, 0x01, 0x17, 0x0d, 0xff, 0x12, 0xe5, 0x00, 0xe4, 0x32, + 0x02, 0x5b, 0xd2, 0x02, 0xe5, 0xb8, 0x00, 0x16, 0x60, 0xfd, 0xe4, 0x58, 0xfd, 0x8d, 0x2b, 0xfe, + 0x79, 0xff, 0x02, 0xde, 0x60, 0x00, 0x4f, 0xca, 0x32, 0x4d, 0xe9, 0x25, 0xe9, 0x72, 0x00, 0x3e, + 0xf7, 0x0c, 0x0d, 0x61, 0xf5, 0x05, 0xa4, 0xe9, 0x26, 0xce, 0xf7, 0xd5, 0x8f, 0x04, 0x04, 0x38, + 0x02, 0x48, 0x74, 0x00, 0xe3, 0x74, 0xfa, 0x3b, 0xce, 0x02, 0xe2, 0x5a, 0x07, 0x54, 0xaa, 0xf9, + 0xbb, 0xc5, 0xfb, 0x2a, 0xa1, 0xf9, 0xa5, 0xc4, 0xfd, 0x90, 0xe9, 0xfd, 0xf5, 0x7e, 0xf9, 0xf0, + 0xe8, 0x01, 0x23, 0x11, 0x00, 0x6f, 0x06, 0x00, 0x12, 0x4d, 0x00, 0xf7, 0x37, 0x01, 0x0c, 0x9b, + 0x01, 0x4f, 0x86, 0x03, 0x7a, 0xf1, 0xff, 0x89, 0x4f, 0xfe, 0x93, 0xc1, 0xfd, 0x30, 0x19, 0xfb, + 0x01, 0x61, 0x02, 0xe9, 0x71, 0x01, 0x92, 0x2b, 0x30, 0x33, 0x5c, 0x23, 0x7b, 0xb1, 0x03, 0x16, + 0x65, 0x0d, 0xe7, 0xda, 0xf2, 0xbb, 0x9f, 0xee, 0x0e, 0xcd, 0xf4, 0x22, 0xaf, 0x00, 0x9a, 0x35, + 0x09, 0x75, 0xa4, 0xff, 0x63, 0x76, 0xf6, 0x9b, 0x24, 0x06, 0x93, 0xd5, 0x06, 0x85, 0xbb, 0xf8, + 0x07, 0x08, 0xfc, 0xef, 0x45, 0xf9, 0x1d, 0xe6, 0xfd, 0x95, 0x7e, 0xfe, 0xc8, 0x82, 0xfa, 0x85, + 0x04, 0x02, 0x52, 0x45, 0xff, 0x45, 0xc5, 0xff, 0x6d, 0xe2, 0x01, 0x48, 0x21, 0x00, 0x89, 0xc2, + 0x00, 0xd6, 0xe8, 0x04, 0xf8, 0x24, 0x00, 0xe2, 0x68, 0xfd, 0x0e, 0xef, 0xfe, 0xb5, 0xa6, 0xfa, + 0x01, 0xb3, 0xff, 0x30, 0xe9, 0x01, 0x00, 0x8b, 0x30, 0x78, 0x5f, 0x21, 0x8d, 0x0a, 0x03, 0x30, + 0x5b, 0x0a, 0xbd, 0x58, 0xf3, 0xd7, 0xbc, 0xf3, 0xee, 0x43, 0xf3, 0x3c, 0x58, 0xff, 0x36, 0x9e, + 0x0b, 0x94, 0x00, 0xff, 0xab, 0x16, 0xf6, 0x31, 0x75, 0x06, 0x85, 0x7c, 0x05, 0x1c, 0x43, 0xf9, + 0xf7, 0xb3, 0xfc, 0xe5, 0xd5, 0xf7, 0xe4, 0xbe, 0xff, 0x6c, 0xd7, 0xff, 0xf7, 0x1b, 0xfa, 0x32, + 0xc7, 0x01, 0x64, 0x1a, 0xff, 0x03, 0x74, 0x00, 0x07, 0x8f, 0x01, 0x10, 0x90, 0xff, 0xc0, 0x2d, + 0x01, 0xbc, 0x1b, 0x05, 0x9c, 0x3f, 0x00, 0x64, 0x7f, 0xfd, 0x5d, 0x6f, 0xfe, 0x7a, 0x29, 0xfb, + 0x2c, 0x14, 0xff, 0x32, 0x8f, 0x01, 0xa8, 0x7c, 0x32, 0xe2, 0x1a, 0x1f, 0xf0, 0x78, 0xfd, 0x40, + 0x8b, 0x0b, 0xb6, 0x12, 0xf3, 0x83, 0xbd, 0xf5, 0xf4, 0x54, 0xf7, 0xa0, 0xf1, 0xfb, 0x1f, 0x60, + 0x0b, 0x6f, 0x61, 0x00, 0xd2, 0x5e, 0xf5, 0x9b, 0x91, 0x05, 0xe1, 0x68, 0x05, 0x55, 0x04, 0xf9, + 0x51, 0x83, 0xfc, 0xf8, 0x1c, 0xfa, 0x0c, 0xd7, 0xff, 0x45, 0x67, 0xff, 0x55, 0x9b, 0xfa, 0xe9, + 0x04, 0x02, 0x8f, 0x9c, 0xff, 0x87, 0x08, 0xff, 0xe5, 0xe6, 0x00, 0x55, 0x0c, 0x01, 0xff, 0x8e, + 0x01, 0x80, 0xbd, 0x03, 0x9b, 0x62, 0x00, 0x80, 0xfa, 0xfd, 0xed, 0xbf, 0xfd, 0x0b, 0xe7, 0xfb, + 0x72, 0x6b, 0xff, 0x02, 0x86, 0x00, 0xdc, 0x66, 0x32, 0xb7, 0xd2, 0x1b, 0x7e, 0xce, 0xf9, 0xf4, + 0x29, 0x0f, 0x9d, 0x2c, 0xf4, 0x1a, 0xf3, 0xf4, 0x66, 0x4b, 0xf9, 0x70, 0xc4, 0xfd, 0x7d, 0xac, + 0x08, 0xe0, 0xc4, 0xfe, 0x1b, 0x7f, 0xf7, 0xba, 0xde, 0x04, 0x8e, 0x11, 0x05, 0x66, 0x84, 0xf8, + 0x37, 0xe8, 0xfd, 0x9b, 0xb7, 0xfb, 0xda, 0x81, 0xff, 0xff, 0xf1, 0xfe, 0x92, 0xe9, 0xfa, 0x5e, + 0xd8, 0x02, 0x9c, 0x01, 0xff, 0xed, 0x3d, 0xfe, 0x0f, 0x09, 0x01, 0x4a, 0x81, 0x01, 0x1b, 0xca, + 0x01, 0x85, 0x62, 0x03, 0x4b, 0xea, 0xff, 0x4f, 0x24, 0xfe, 0x9c, 0xd6, 0xfd, 0xc5, 0x6a, 0xfc, + 0xde, 0x14, 0x00, 0x39, 0x1d, 0x00, 0x60, 0x24, 0x30, 0x85, 0x3d, 0x19, 0x06, 0xee, 0xf7, 0xba, + 0xc2, 0x12, 0xdc, 0x8c, 0xf5, 0x5c, 0xf2, 0xf2, 0xe1, 0x3f, 0xfd, 0xfe, 0xc4, 0xfd, 0x6e, 0xbc, + 0x04, 0x2b, 0xd6, 0xff, 0x22, 0xa2, 0xf8, 0x66, 0xbf, 0x03, 0x57, 0x0f, 0x05, 0x0c, 0xba, 0xf9, + 0x58, 0x35, 0xfe, 0x99, 0xa6, 0xfc, 0x0d, 0x78, 0xff, 0xac, 0x9f, 0xfe, 0x7b, 0xf3, 0xfb, 0x77, + 0xf7, 0x01, 0xea, 0x9e, 0xfe, 0x0b, 0xef, 0xfe, 0xff, 0xde, 0x00, 0x80, 0xd5, 0x00, 0x1e, 0x63, + 0x02, 0x81, 0x99, 0x03, 0xcb, 0x1b, 0xff, 0x67, 0x18, 0xfe, 0x01, 0x67, 0xfe, 0x74, 0xfd, 0xfc, + 0x6d, 0x02, 0x00, 0xb2, 0xe7, 0x00, 0x8f, 0xff, 0x2b, 0x74, 0x0c, 0x17, 0xb6, 0x2d, 0xfa, 0xfb, + 0x44, 0x12, 0x57, 0x42, 0xf6, 0xf8, 0x47, 0xf6, 0x5e, 0x65, 0xfd, 0x79, 0x54, 0xfb, 0xfc, 0x0f, + 0x05, 0x03, 0xfd, 0xff, 0x12, 0xab, 0xf8, 0xf0, 0x28, 0x03, 0xf2, 0x92, 0x05, 0xf1, 0x04, 0xfb, + 0x98, 0x0f, 0xfe, 0x4e, 0x0c, 0xfd, 0x11, 0x98, 0xff, 0xdc, 0x34, 0xff, 0x1b, 0xda, 0xfb, 0x72, + 0x0b, 0x01, 0xb8, 0x09, 0xff, 0xe8, 0x3e, 0xff, 0xb0, 0x72, 0x00, 0x0b, 0xde, 0x00, 0xdb, 0x70, + 0x02, 0x50, 0x37, 0x03, 0xc3, 0x39, 0xff, 0xb9, 0xc0, 0xfd, 0x02, 0xde, 0xfe, 0xd4, 0xfb, 0xfd, + 0xec, 0x8d, 0xff, 0xaa, 0xf4, 0x00, 0xd5, 0xa0, 0x26, 0x4c, 0x78, 0x16, 0xa6, 0xae, 0x00, 0x69, + 0xb9, 0x0b, 0x73, 0x77, 0xf4, 0xb5, 0x93, 0xf9, 0xfc, 0x44, 0x00, 0xda, 0x6e, 0xff, 0x35, 0x64, + 0xff, 0x82, 0xcc, 0xfd, 0xd7, 0x17, 0xfb, 0xf7, 0x42, 0x04, 0x45, 0x34, 0x03, 0x96, 0xa4, 0xfa, + 0x75, 0xa5, 0x00, 0x81, 0xcb, 0xfc, 0x6a, 0xd0, 0xfe, 0x8f, 0xd2, 0xff, 0x94, 0x27, 0xfc, 0x8a, + 0xf6, 0x00, 0xd1, 0x2c, 0xff, 0x21, 0x14, 0xfe, 0x89, 0xfa, 0x00, 0xd8, 0x93, 0x00, 0x10, 0xea, + 0xfe, 0xb0, 0x3d, 0x02, 0xdf, 0xe7, 0x00, 0x83, 0x82, 0xff, 0x2c, 0x55, 0x00, 0xa2, 0x93, 0xfd, + 0x83, 0x36, 0xff, 0x8c, 0x7a, 0xff, 0xae, 0x8b, 0x20, 0xbe, 0xa2, 0x15, 0xec, 0xc9, 0x03, 0x5d, + 0x3b, 0x09, 0x25, 0x6e, 0xf7, 0x4d, 0xa9, 0xfc, 0x2d, 0xb2, 0xfe, 0x3d, 0x86, 0xfe, 0x37, 0x6c, + 0x00, 0xcb, 0x6f, 0xfe, 0xa7, 0xe6, 0xfa, 0xab, 0x80, 0x03, 0xe3, 0xda, 0x03, 0x14, 0xc6, 0xfb, + 0xeb, 0x39, 0x00, 0xe5, 0x55, 0xfd, 0x60, 0x3e, 0xff, 0x00, 0xb5, 0xff, 0xd8, 0xca, 0xfc, 0x0d, + 0x9f, 0x00, 0x90, 0x2c, 0xff, 0x5a, 0x6e, 0xfe, 0xb9, 0xc2, 0x00, 0xec, 0x66, 0x00, 0xd3, 0x60, + 0xff, 0xed, 0x40, 0x02, 0x55, 0xd9, 0x00, 0x91, 0xe7, 0xff, 0x3d, 0xc5, 0xff, 0xcf, 0xc5, 0xfd, + 0x09, 0x0c, 0x00, 0x1c, 0xfd, 0xff, 0xea, 0x05, 0x1a, 0x62, 0x9b, 0x15, 0x4d, 0x9a, 0x06, 0x52, + 0x76, 0x06, 0xdb, 0x7e, 0xfa, 0x7c, 0x6a, 0xfe, 0x29, 0xd2, 0xfd, 0x92, 0xce, 0xfd, 0xc4, 0xce, + 0x00, 0xed, 0xdb, 0xfe, 0x31, 0x5b, 0xfb, 0xcd, 0x02, 0x03, 0x84, 0x37, 0x03, 0xd2, 0x09, 0xfd, + 0x4b, 0x0f, 0x00, 0xe3, 0xce, 0xfd, 0x9d, 0x34, 0xff, 0x3b, 0x75, 0xff, 0x8a, 0x9e, 0xfd, 0xa8, + 0x62, 0x00, 0x17, 0xe7, 0xfe, 0xa3, 0x89, 0xfe, 0x78, 0xd5, 0x00, 0x55, 0x21, 0x00, 0x56, 0xcc, + 0xff, 0x30, 0xc3, 0x01, 0x3d, 0xaa, 0x00, 0xcb, 0x5e, 0x00, 0x82, 0x93, 0xff, 0xd2, 0x41, 0xfe, + 0x8b, 0x8b, 0x00, 0x26, 0x85, 0x00, 0x63, 0xc8, 0x15, 0xd1, 0x72, 0x14, 0xa5, 0x00, 0x07, 0xae, + 0x8d, 0x06, 0x2c, 0x8d, 0xfc, 0xa6, 0xf5, 0xfd, 0x2f, 0x8d, 0xfe, 0x4c, 0x77, 0xfe, 0xda, 0x7f, + 0x00, 0xdd, 0xb7, 0xfe, 0x80, 0x6b, 0xfc, 0x99, 0x9f, 0x02, 0x2d, 0xc5, 0x02, 0xf5, 0xa5, 0xfd, + 0xe7, 0x02, 0x00, 0x5c, 0x80, 0xfe, 0x50, 0x02, 0xff, 0xb1, 0xa8, 0xff, 0xb3, 0x33, 0xfe, 0x5d, + 0xe9, 0xff, 0x41, 0x0f, 0xff, 0x5b, 0x30, 0xff, 0x5b, 0x58, 0x00, 0xfd, 0xdb, 0xff, 0xbe, 0x51, + 0x00, 0xf6, 0x74, 0x01, 0xb4, 0x03, 0x01, 0x3c, 0xaa, 0x00, 0xe3, 0xa6, 0xff, 0xfc, 0x47, 0xff, + 0x28, 0xf2, 0x00, 0xee, 0x05, 0x00, 0xb6, 0x3d, 0x13, 0x19, 0x76, 0x12, 0x71, 0xb6, 0x06, 0x9c, + 0x3a, 0x07, 0x72, 0x81, 0xfd, 0x61, 0x73, 0xfd, 0xfd, 0x86, 0xff, 0x43, 0x75, 0xff, 0x02, 0xad, + 0xff, 0xbb, 0xcb, 0xfe, 0xb0, 0x93, 0xfd, 0x91, 0x02, 0x02, 0xed, 0x5f, 0x02, 0x93, 0xe2, 0xfd, + 0xa4, 0x45, 0x00, 0xb7, 0x21, 0xff, 0x4d, 0xaf, 0xfe, 0xc1, 0xbd, 0xff, 0x0a, 0xde, 0xfe, 0x4b, + 0xbf, 0xff, 0xd3, 0x14, 0xff, 0x61, 0x76, 0xff, 0x7e, 0xe1, 0xff, 0x04, 0x10, 0x00, 0x48, 0xc4, + 0x00, 0x60, 0x80, 0x01, 0x75, 0xad, 0x01, 0xd7, 0xaa, 0x00, 0xf6, 0xbd, 0xff, 0xeb, 0xe4, 0xff, + 0x4e, 0x8e, 0x00, 0xdf, 0x64, 0xff, 0x1a, 0xbc, 0x10, 0x3f, 0x9a, 0x10, 0xed, 0x13, 0x07, 0x06, + 0x67, 0x07, 0x9e, 0x58, 0xfe, 0x84, 0xa0, 0xfd, 0x24, 0xe9, 0xff, 0x51, 0x46, 0x00, 0x5e, 0x82, + 0xff, 0xc6, 0x29, 0xff, 0x10, 0x1a, 0xfe, 0xce, 0x4b, 0x01, 0x82, 0x5b, 0x02, 0xa7, 0x9c, 0xfe, + 0xeb, 0x48, 0x00, 0x8d, 0x3f, 0xff, 0xcd, 0xe6, 0xfe, 0xd9, 0x4b, 0x00, 0x22, 0x4f, 0xff, 0xb1, + 0x28, 0xff, 0x3b, 0x82, 0xff, 0x8e, 0xe7, 0xff, 0x1a, 0xaf, 0xff, 0x35, 0xd8, 0x00, 0x6c, 0x38, + 0x01, 0xd6, 0xc3, 0x01, 0x87, 0xf0, 0x01, 0x0d, 0x4d, 0x00, 0x82, 0xb8, 0xff, 0xc7, 0xda, 0xff, + 0xdb, 0x23, 0x00, 0xd0, 0x24, 0xff, 0xbe, 0x5b, 0x0e, 0x85, 0xe7, 0x0e, 0x4e, 0x81, 0x07, 0x20, + 0x77, 0x07, 0x04, 0x25, 0xff, 0x57, 0xc5, 0xfd, 0xd6, 0x11, 0x00, 0x07, 0x37, 0x01, 0x31, 0x7f, + 0xff, 0x20, 0x3d, 0xff, 0xfb, 0x6f, 0xfe, 0x39, 0xe7, 0x00, 0xcc, 0x60, 0x02, 0xa0, 0x00, 0xff, + 0x5d, 0x61, 0x00, 0x38, 0x8a, 0xff, 0x45, 0x45, 0xff, 0x55, 0x96, 0x00, 0xa9, 0x45, 0xff, 0xb1, + 0x3d, 0xff, 0x8c, 0x49, 0x00, 0x10, 0x63, 0x00, 0xad, 0x27, 0x00, 0x4e, 0x22, 0x01, 0xc2, 0x39, + 0x01, 0x76, 0xfa, 0x01, 0x57, 0x51, 0x01, 0x0e, 0x8b, 0xff, 0x41, 0xdd, 0xff, 0xd2, 0x09, 0x00, + 0xf0, 0xe2, 0xff, 0xb3, 0xf6, 0xfe, 0x65, 0x8e, 0x0c, 0x24, 0xf2, 0x0d, 0x8e, 0x5d, 0x07, 0x5b, + 0xc4, 0x06, 0xe7, 0x15, 0x00, 0x6d, 0x41, 0xfe, 0x8a, 0x41, 0x00, 0x02, 0x96, 0x01, 0xe6, 0x89, + 0xff, 0xab, 0xa8, 0xff, 0x70, 0xbc, 0xfe, 0x4b, 0x5b, 0x00, 0xc8, 0x66, 0x02, 0xef, 0xe7, 0xff, + 0xdd, 0x38, 0x00, 0x9c, 0xa6, 0xff, 0x86, 0xd1, 0xff, 0x41, 0xab, 0x00, 0xc1, 0xd0, 0xff, 0xef, + 0x32, 0x00, 0x0e, 0x19, 0x01, 0x91, 0x49, 0x00, 0x94, 0x1d, 0x00, 0x91, 0x62, 0x01, 0x4a, 0xe7, + 0x00, 0x95, 0x0c, 0x01, 0x01, 0xc6, 0x00, 0x75, 0xcc, 0xff, 0xe1, 0x0e, 0x00, 0xa6, 0xef, 0xff, + 0xb7, 0x83, 0xff, 0x45, 0x19, 0xff, 0x63, 0x8d, 0x0a, 0xce, 0x72, 0x0c, 0x91, 0xe5, 0x07, 0x96, + 0x2c, 0x07, 0xbc, 0x59, 0x00, 0xa1, 0x35, 0xfe, 0x9b, 0x80, 0x00, 0xe9, 0x4a, 0x02, 0x30, 0xcd, + 0xff, 0x8d, 0x7f, 0xff, 0xce, 0xf3, 0xfe, 0x06, 0x73, 0x00, 0x8d, 0x74, 0x02, 0x1b, 0x42, 0x00, + 0x33, 0x44, 0x00, 0xb9, 0xfb, 0xff, 0x0f, 0xaf, 0x00, 0x1e, 0x80, 0x01, 0x6a, 0x9e, 0x00, 0x88, + 0x9a, 0x00, 0x64, 0xa0, 0x00, 0x52, 0x20, 0x00, 0x38, 0x01, 0x00, 0x6a, 0x8a, 0x00, 0x94, 0x9b, + 0x00, 0xca, 0xdf, 0x00, 0x92, 0xa5, 0x00, 0xba, 0xd5, 0xff, 0x53, 0x19, 0x00, 0xc8, 0xea, 0xff, + 0xb8, 0x48, 0xff, 0x3a, 0x4e, 0xff, 0x95, 0xa6, 0x09, 0xe0, 0xd7, 0x0b, 0xde, 0xc2, 0x07, 0x28, + 0x2e, 0x06, 0x2d, 0x73, 0x00, 0x47, 0xd5, 0xfe, 0x1c, 0x06, 0x01, 0x4b, 0x30, 0x02, 0x34, 0xec, + 0xff, 0xb1, 0xd9, 0xff, 0x39, 0x2a, 0xff, 0xee, 0x99, 0x00, 0x66, 0x78, 0x02, 0x1e, 0x78, 0x00, + 0xab, 0xe5, 0x00, 0x1f, 0x80, 0x01, 0x02, 0x84, 0x01, 0xe1, 0x27, 0x01, 0x9b, 0x7c, 0x00, 0x32, + 0x7e, 0x00, 0x9f, 0xbe, 0xff, 0x65, 0x6a, 0xff, 0x69, 0x0a, 0x00, 0x64, 0x7f, 0x00, 0x72, 0x68, + 0x00, 0x9f, 0x8c, 0x00, 0x60, 0x62, 0x00, 0x2d, 0x13, 0x00, 0x1c, 0x30, 0x00, 0x20, 0x81, 0xff, + 0x61, 0x41, 0xff, 0x7d, 0x38, 0xff, 0xcb, 0xa5, 0x08, 0x7d, 0x14, 0x0b, 0xc1, 0xe8, 0x07, 0x91, + 0xf8, 0x05, 0xe1, 0x30, 0x00, 0xd4, 0x07, 0xff, 0xd4, 0xbe, 0x01, 0x84, 0x73, 0x02, 0xca, 0xce, + 0xff, 0xb7, 0x4a, 0x00, 0xed, 0x75, 0xff, 0x78, 0x6f, 0x00, 0x49, 0x87, 0x03, 0x38, 0xf6, 0x01, + 0x27, 0x5b, 0x01, 0x89, 0x4b, 0x01, 0x57, 0x11, 0x01, 0x02, 0xed, 0x00, 0x98, 0xd6, 0xff, 0x1d, + 0x42, 0xff, 0xbe, 0x93, 0xff, 0xfc, 0x01, 0x00, 0x92, 0xb0, 0xff, 0xd8, 0x10, 0x00, 0x54, 0x61, + 0x00, 0xea, 0x7d, 0x00, 0x70, 0x65, 0x00, 0x96, 0xe7, 0xff, 0x33, 0xe8, 0xff, 0x10, 0x4b, 0xff, + 0x5a, 0x25, 0xff, 0xfe, 0x2d, 0xff, 0x55, 0x43, 0x08, 0x89, 0xec, 0x0a, 0xd6, 0xb4, 0x07, 0xde, + 0x2b, 0x05, 0xb8, 0xfe, 0xff, 0xdb, 0xbc, 0xff, 0x13, 0x55, 0x02, 0x8b, 0xb5, 0x02, 0x14, 0x88, + 0xff, 0x79, 0x68, 0x00, 0x2c, 0x5d, 0x01, 0x32, 0xfa, 0x01, 0x02, 0x57, 0x03, 0x8b, 0x44, 0x01, + 0x88, 0x1f, 0x01, 0x44, 0xeb, 0x00, 0x22, 0xf1, 0xff, 0x3a, 0xed, 0xff, 0x1d, 0xac, 0xff, 0xfd, + 0x48, 0xff, 0xfb, 0x92, 0xff, 0x9f, 0xbc, 0xff, 0x65, 0x7b, 0xff, 0xde, 0x86, 0x00, 0xfa, 0x42, + 0x00, 0x87, 0xab, 0xff, 0x4c, 0x41, 0x00, 0x23, 0x07, 0x00, 0xec, 0x6d, 0xff, 0x67, 0x27, 0xff, + 0xd7, 0x34, 0xff, 0x75, 0xe5, 0xfe, 0xbc, 0x91, 0x08, 0xce, 0x6a, 0x0b, 0xc2, 0xf8, 0x06, 0x24, + 0x2b, 0x04, 0xf5, 0x33, 0x00, 0x62, 0xc1, 0x00, 0xb8, 0x56, 0x02, 0x21, 0x24, 0x03, 0x11, 0x74, + 0x01, 0xb1, 0x9f, 0x01, 0x2a, 0xbb, 0x01, 0xa4, 0x10, 0x01, 0x90, 0x72, 0x02, 0xc3, 0xfc, 0x00, + 0xb8, 0xe0, 0xff, 0xc0, 0xf9, 0xff, 0xe2, 0x0c, 0x00, 0xd5, 0xd7, 0xff, 0x59, 0x4b, 0xff, 0x8d, + 0x08, 0xff, 0x42, 0x07, 0x00, 0xb5, 0x35, 0x00, 0xb5, 0x63, 0xff, 0x60, 0x00, 0x00, 0xdd, 0xa7, + 0xff, 0x3b, 0xaf, 0xff, 0xd3, 0x52, 0x00, 0x73, 0xe7, 0xff, 0x6b, 0x25, 0xff, 0x6d, 0xea, 0xfe, + 0x52, 0x4a, 0xff, 0x72, 0xf9, 0xfe, 0x5b, 0xf8, 0x08, 0x21, 0x86, 0x0c, 0xe0, 0xfd, 0x05, 0x85, + 0x34, 0x03, 0x98, 0x21, 0x00, 0xea, 0x67, 0x02, 0xe4, 0x5d, 0x05, 0xfb, 0xb4, 0x03, 0xe4, 0xe3, + 0x00, 0x41, 0xf3, 0x00, 0x28, 0x6c, 0x01, 0xb3, 0x4c, 0x00, 0xc0, 0x05, 0x01, 0xa1, 0x40, 0x00, + 0x86, 0x1b, 0x00, 0xc6, 0xe6, 0xff, 0xea, 0x71, 0xff, 0xbb, 0xb8, 0xff, 0x11, 0x88, 0xff, 0xd1, + 0xfa, 0xff, 0xda, 0x2b, 0x00, 0x8d, 0x78, 0xff, 0xd2, 0x15, 0xff, 0x5b, 0xbf, 0xff, 0xeb, 0xac, + 0xff, 0x51, 0xb6, 0xff, 0x69, 0x52, 0x00, 0xc2, 0xa9, 0xff, 0x10, 0xdc, 0xfe, 0x38, 0x27, 0xff, + 0x5f, 0x7c, 0xff, 0x9c, 0x36, 0xff, 0x56, 0x18, 0x09, 0x48, 0xf7, 0x0c, 0xd4, 0x2a, 0x05, 0xbe, + 0xee, 0x02, 0xa1, 0x5e, 0x03, 0xf8, 0xa0, 0x04, 0xdd, 0x77, 0x04, 0xcc, 0xae, 0x02, 0x60, 0xa0, + 0x00, 0xe5, 0x36, 0x00, 0x9c, 0x70, 0x00, 0xf3, 0xc7, 0xff, 0x3c, 0xc3, 0x00, 0x35, 0x01, 0x00, + 0x4d, 0xe4, 0xff, 0x57, 0xcf, 0xff, 0x33, 0x47, 0xff, 0x07, 0x54, 0x00, 0x5e, 0x68, 0x00, 0x96, + 0x6f, 0xff, 0x57, 0x56, 0xff, 0x9c, 0x96, 0xff, 0xf0, 0x37, 0xff, 0x85, 0x3c, 0xff, 0x6a, 0x92, + 0xff, 0x5b, 0x17, 0x00, 0x31, 0xd8, 0xff, 0x11, 0x88, 0xff, 0x70, 0x56, 0xff, 0x2c, 0x54, 0xff, + 0xc1, 0x59, 0xff, 0x32, 0x28, 0xff, 0x99, 0x3b, 0x08, 0x24, 0x7d, 0x0c, 0x2d, 0xda, 0x07, 0x10, + 0x3b, 0x05, 0x96, 0x7c, 0x02, 0xa4, 0x12, 0x04, 0x63, 0xac, 0x04, 0x1e, 0xff, 0x01, 0xa7, 0xd4, + 0xff, 0x5d, 0xd6, 0xff, 0x3e, 0x85, 0x00, 0xa0, 0xde, 0xff, 0x26, 0x38, 0x00, 0x50, 0xe6, 0xff, + 0x88, 0xfb, 0xff, 0x1f, 0x22, 0x00, 0xd0, 0x47, 0x00, 0x27, 0x54, 0x00, 0x6f, 0xaa, 0xff, 0x68, + 0x88, 0xff, 0x43, 0x8f, 0xff, 0xc3, 0x5e, 0xff, 0xf0, 0xf1, 0xfe, 0xc0, 0x5d, 0xff, 0x88, 0x96, + 0xff, 0xab, 0xd3, 0xff, 0xb3, 0x1b, 0x00, 0xb1, 0xe4, 0xff, 0x1d, 0x95, 0xff, 0x90, 0x39, 0xff, + 0x09, 0x0b, 0xff, 0x4c, 0x2c, 0xff, 0xb9, 0x52, 0x0a, 0xac, 0xac, 0x0f, 0x35, 0x80, 0x06, 0xb4, + 0x5f, 0x02, 0x3c, 0x14, 0x03, 0x78, 0x2c, 0x04, 0x6e, 0x79, 0x03, 0x50, 0x95, 0x01, 0xd2, 0x89, + 0xff, 0xd9, 0xd4, 0xff, 0x94, 0x79, 0x00, 0xff, 0x01, 0x00, 0x4e, 0x6d, 0x00, 0xb0, 0x8f, 0xff, + 0xea, 0x5f, 0x00, 0xb2, 0x4f, 0x01, 0x7a, 0x3b, 0x00, 0x25, 0x3a, 0xff, 0xec, 0xef, 0xff, 0x2a, + 0xf9, 0xff, 0x4e, 0x31, 0xff, 0xb4, 0x0a, 0xff, 0xca, 0x11, 0xff, 0x17, 0x78, 0xff, 0xb8, 0x72, + 0xff, 0xab, 0x1c, 0x00, 0x7e, 0x6e, 0x00, 0x83, 0x04, 0x00, 0xf7, 0x48, 0xff, 0xfd, 0xfb, 0xfe, + 0x6b, 0x2c, 0xff, 0x3d, 0x00, 0xff, 0x4d, 0xe6, 0x0a, 0x94, 0xef, 0x10, 0x52, 0x75, 0x05, 0x01, + 0xb9, 0x00, 0x50, 0x10, 0x03, 0x1d, 0xb5, 0x03, 0x2f, 0x34, 0x03, 0x06, 0x34, 0x02, 0x08, 0x04, + 0x00, 0x11, 0x4e, 0xff, 0x78, 0xe1, 0x00, 0xf6, 0x4b, 0x00, 0xbe, 0x31, 0x00, 0x0a, 0x45, 0x00, + 0x40, 0xe1, 0x00, 0x96, 0x3b, 0x01, 0xf7, 0xf7, 0xff, 0x3e, 0xbd, 0xff, 0x7c, 0xee, 0xff, 0x53, + 0xcc, 0xff, 0xad, 0x37, 0xff, 0xf8, 0x42, 0xff, 0x47, 0x12, 0xff, 0x67, 0x1e, 0xff, 0x8c, 0xb8, + 0xff, 0x0c, 0x38, 0x00, 0x69, 0x76, 0x00, 0x42, 0xf4, 0xff, 0x0d, 0x7d, 0xff, 0x31, 0xf8, 0xfe, + 0xea, 0x0b, 0xff, 0x00, 0x16, 0xff, 0xf0, 0x32, 0x08, 0x22, 0x53, 0x0f, 0x68, 0xeb, 0x08, 0x22, + 0x84, 0x01, 0x4e, 0xc0, 0x00, 0x58, 0x71, 0x02, 0x9d, 0xa9, 0x03, 0x40, 0x61, 0x03, 0xe2, 0x38, + 0x00, 0x17, 0x67, 0xff, 0xe8, 0x27, 0x01, 0x62, 0x01, 0x01, 0x3e, 0xf8, 0xff, 0x5b, 0x26, 0x00, + 0x12, 0x55, 0x01, 0xdb, 0x5d, 0x01, 0xca, 0x91, 0x00, 0xad, 0xc7, 0xff, 0xdc, 0xde, 0xff, 0xe1, + 0x1c, 0x00, 0x68, 0x92, 0xff, 0x28, 0x0f, 0xff, 0xc4, 0x3c, 0xff, 0x93, 0x56, 0xff, 0xe7, 0x59, + 0xff, 0x78, 0x0a, 0x00, 0xac, 0x63, 0x00, 0xe6, 0x23, 0x00, 0xfe, 0x94, 0xff, 0x4e, 0x47, 0xff, + 0x7f, 0x26, 0xff, 0x73, 0x08, 0xff, 0x8d, 0xd5, 0x06, 0xc1, 0x7d, 0x0d, 0x5c, 0xf4, 0x09, 0xc6, + 0x34, 0x03, 0x6d, 0x6f, 0x00, 0x27, 0x79, 0x01, 0x95, 0xc8, 0x02, 0x8e, 0x51, 0x03, 0x51, 0xcd, + 0x00, 0x55, 0x71, 0xff, 0x7e, 0x0d, 0x01, 0x21, 0x94, 0x01, 0xe6, 0x57, 0x00, 0x66, 0x2f, 0x00, + 0x1d, 0x26, 0x01, 0x2f, 0x02, 0x01, 0x3b, 0x2d, 0x01, 0x8d, 0x74, 0x00, 0xed, 0x15, 0x00, 0x91, + 0x27, 0x00, 0x94, 0x86, 0xff, 0x22, 0x82, 0xff, 0xb5, 0x99, 0xff, 0x69, 0x42, 0xff, 0xde, 0x36, + 0xff, 0x2e, 0xfa, 0xff, 0xa9, 0x53, 0x00, 0x9f, 0xf8, 0xff, 0xcc, 0x70, 0xff, 0xaa, 0x87, 0xff, + 0x88, 0x72, 0xff, 0x03, 0x1b, 0xff, 0x30, 0xc4, 0x06, 0xe8, 0x23, 0x0d, 0x8b, 0x60, 0x09, 0x69, + 0xa4, 0x03, 0x08, 0xeb, 0x00, 0x20, 0xf5, 0x00, 0x41, 0x96, 0x02, 0xea, 0x5b, 0x03, 0x71, 0x7d, + 0x00, 0x72, 0xd7, 0xfe, 0x3f, 0xd4, 0x00, 0x67, 0xce, 0x01, 0x34, 0x91, 0x00, 0x1e, 0x25, 0x00, + 0x81, 0x2c, 0x01, 0x15, 0x26, 0x01, 0xd3, 0xe3, 0x00, 0xfb, 0x94, 0x00, 0xaa, 0x91, 0x00, 0xea, + 0x77, 0x00, 0x7c, 0xd4, 0xff, 0x64, 0xb0, 0xff, 0x44, 0xab, 0xff, 0xbb, 0x91, 0xff, 0x9a, 0xb8, + 0xff, 0xa3, 0xb5, 0xff, 0x5b, 0x11, 0x00, 0x09, 0x34, 0x00, 0x92, 0x66, 0xff, 0xc0, 0x33, 0xff, + 0x49, 0x48, 0xff, 0xb7, 0x70, 0xff, 0xbb, 0x0e, 0x07, 0xb9, 0x23, 0x0d, 0xd2, 0xee, 0x08, 0x9d, + 0xe3, 0x03, 0x9d, 0x45, 0x01, 0x07, 0xaa, 0x00, 0xc9, 0x52, 0x02, 0x4b, 0x73, 0x03, 0x15, 0x92, + 0x00, 0xc8, 0xa7, 0xfe, 0x77, 0x62, 0x00, 0x0b, 0x5a, 0x01, 0x34, 0x46, 0x00, 0x7c, 0x05, 0x00, + 0x2e, 0x19, 0x01, 0x5d, 0xe9, 0x00, 0x3b, 0xd0, 0x00, 0x3d, 0x11, 0x01, 0x43, 0x62, 0x00, 0x7f, + 0x2a, 0x00, 0x80, 0x54, 0x00, 0xe2, 0x00, 0x00, 0x4f, 0xe3, 0xff, 0x46, 0xe3, 0xff, 0x14, 0xf9, + 0xff, 0xd8, 0xee, 0xff, 0x2c, 0x28, 0x00, 0xe6, 0x1c, 0x00, 0x5d, 0x8d, 0xff, 0x2d, 0x18, 0xff, + 0x0c, 0x08, 0xff, 0xe7, 0x3b, 0xff, 0xef, 0xb1, 0x07, 0xcb, 0xb8, 0x0d, 0xd7, 0x83, 0x08, 0x6c, + 0xc6, 0x03, 0x2f, 0x67, 0x01, 0x1d, 0x92, 0x00, 0x97, 0x67, 0x02, 0xc2, 0x86, 0x03, 0x34, 0x5d, + 0x00, 0xb5, 0x8b, 0xfe, 0x2a, 0x69, 0x00, 0xc7, 0x50, 0x01, 0xa8, 0x31, 0x00, 0x88, 0x4a, 0xff, + 0x81, 0x85, 0x00, 0x3e, 0xbe, 0x00, 0x65, 0x79, 0x00, 0x45, 0x1f, 0x01, 0xf9, 0xb5, 0x00, 0xac, + 0x2a, 0x00, 0x1e, 0x0e, 0x00, 0x98, 0xbf, 0xff, 0xfe, 0x5b, 0x00, 0x6b, 0x6a, 0x00, 0x9c, 0xf3, + 0xff, 0x89, 0x80, 0x00, 0xc9, 0x79, 0x00, 0xc0, 0x21, 0x00, 0xa6, 0xbc, 0xff, 0xfa, 0x41, 0xff, + 0x2f, 0x08, 0xff, 0xef, 0xfc, 0xfe, 0x87, 0x38, 0x08, 0x53, 0x9e, 0x0e, 0xd7, 0x67, 0x08, 0xf8, + 0x5f, 0x03, 0xc3, 0xbb, 0x01, 0x48, 0x77, 0x00, 0x0d, 0x31, 0x02, 0x42, 0xaf, 0x03, 0x4f, 0x4a, + 0x00, 0xc9, 0x6d, 0xfe, 0x0c, 0x44, 0x00, 0x6b, 0x3d, 0x01, 0x8a, 0x70, 0x00, 0xea, 0x19, 0xff, + 0x6a, 0xf3, 0xff, 0xca, 0x5b, 0x00, 0x83, 0xa8, 0xff, 0xc7, 0x95, 0x00, 0x11, 0x3a, 0x01, 0x3c, + 0x22, 0x00, 0xe0, 0xb9, 0xff, 0xb1, 0xb7, 0xff, 0xd7, 0x11, 0x00, 0xd7, 0x79, 0x00, 0x83, 0x27, + 0x00, 0x33, 0xbc, 0x00, 0x30, 0xcf, 0x00, 0x18, 0x63, 0x00, 0x6a, 0x27, 0x00, 0x5a, 0x6b, 0xff, + 0xd5, 0xf8, 0xfe, 0x0b, 0x27, 0xff, 0xf5, 0xec, 0x08, 0x80, 0xbd, 0x0f, 0x7c, 0x47, 0x08, 0x29, + 0x0a, 0x03, 0xc1, 0x02, 0x02, 0x5f, 0x35, 0x00, 0x69, 0x06, 0x02, 0x28, 0xe6, 0x03, 0x8f, 0x19, + 0x00, 0x42, 0x18, 0xfe, 0xfa, 0x5c, 0x00, 0xfc, 0x35, 0x01, 0x8d, 0x52, 0x00, 0x95, 0x3a, 0xff, + 0x7c, 0x9d, 0xff, 0x07, 0x2b, 0x00, 0x37, 0x51, 0xff, 0xd2, 0xa7, 0xff, 0xd0, 0x12, 0x01, 0xde, + 0x2a, 0x00, 0x2f, 0x75, 0xff, 0x10, 0x97, 0xff, 0x1c, 0xbc, 0xff, 0xfb, 0x67, 0x00, 0xee, 0x27, + 0x00, 0xc5, 0x69, 0x00, 0x3d, 0x05, 0x01, 0x44, 0xb3, 0x00, 0x29, 0x30, 0x00, 0x3a, 0xeb, 0xff, + 0x86, 0x79, 0xff, 0xdf, 0x00, 0xff, 0x63, 0xeb, 0x09, 0xa1, 0x21, 0x11, 0xdc, 0x18, 0x08, 0xfd, + 0x82, 0x02, 0xf4, 0x58, 0x02, 0xa4, 0x12, 0x00, 0x1a, 0xcf, 0x01, 0x3a, 0x1d, 0x04, 0xcb, 0xf6, + 0xff, 0x3e, 0xd1, 0xfd, 0xd5, 0x66, 0x00, 0x9e, 0x36, 0x01, 0x60, 0x2e, 0x00, 0x50, 0x72, 0xff, + 0x7c, 0x7d, 0xff, 0xeb, 0xe0, 0xff, 0xa9, 0x4b, 0xff, 0x9a, 0x25, 0xff, 0x9c, 0xba, 0x00, 0x23, + 0x72, 0x00, 0x15, 0x03, 0xff, 0x64, 0x15, 0xff, 0xc0, 0xce, 0xff, 0xe2, 0x3c, 0x00, 0x60, 0x0c, + 0x00, 0x9c, 0x18, 0x00, 0x79, 0xfe, 0x00, 0x5f, 0xbd, 0x00, 0xb2, 0x0a, 0x00, 0xe3, 0x3f, 0x00, + 0xd4, 0xd3, 0xff, 0x83, 0x69, 0xff, 0xb7, 0x16, 0x0b, 0x9e, 0xc0, 0x12, 0x9e, 0xe5, 0x07, 0x75, + 0xd3, 0x01, 0xc9, 0xa4, 0x02, 0x06, 0xeb, 0xff, 0x20, 0xac, 0x01, 0x3e, 0x62, 0x04, 0x4a, 0x83, + 0xff, 0x0f, 0xa4, 0xfd, 0xdc, 0x9f, 0x00, 0xa9, 0x29, 0x01, 0x1c, 0xe2, 0xff, 0x0c, 0x66, 0xff, + 0x3e, 0xbc, 0xff, 0x6b, 0xa1, 0xff, 0xef, 0x0f, 0xff, 0x4d, 0xfd, 0xfe, 0x6e, 0x40, 0x00, 0x56, + 0xb5, 0x00, 0x49, 0x32, 0xff, 0xaa, 0x72, 0xfe, 0xb8, 0x95, 0xff, 0x58, 0x1a, 0x00, 0x07, 0xe7, + 0xff, 0x12, 0x05, 0x00, 0x11, 0x8a, 0x00, 0xd0, 0x94, 0x00, 0x2b, 0x28, 0x00, 0x20, 0x04, 0x00, + 0xb4, 0xdf, 0xff, 0x97, 0xb6, 0xff, 0x29, 0x94, 0x0c, 0x1f, 0x80, 0x14, 0x1e, 0x75, 0x07, 0xe3, + 0x34, 0x01, 0xa7, 0xd8, 0x02, 0xc9, 0x92, 0xff, 0x9d, 0xc0, 0x01, 0xce, 0xab, 0x04, 0x13, 0xcb, + 0xfe, 0xcd, 0x6f, 0xfd, 0xfa, 0x0b, 0x01, 0xfe, 0x24, 0x01, 0x15, 0x75, 0xff, 0x3c, 0x3e, 0xff, + 0x8f, 0xe2, 0xff, 0x4c, 0x78, 0xff, 0x3e, 0xc4, 0xfe, 0x9d, 0xde, 0xfe, 0xbb, 0xf8, 0xff, 0x27, + 0x88, 0x00, 0xde, 0x9b, 0xff, 0xa3, 0x40, 0xfe, 0x5c, 0x40, 0xff, 0x52, 0x2a, 0x00, 0x51, 0x91, + 0xff, 0x1e, 0xdd, 0xff, 0xe6, 0x48, 0x00, 0xbe, 0x21, 0x00, 0x7f, 0x03, 0x00, 0x1b, 0xf1, 0xff, + 0x02, 0xda, 0xff, 0x7d, 0x88, 0xff, 0xe8, 0x0b, 0x0e, 0x2c, 0x58, 0x16, 0x5f, 0x26, 0x07, 0x83, + 0x85, 0x00, 0x11, 0xda, 0x02, 0x5c, 0x12, 0xff, 0x18, 0xe8, 0x01, 0x88, 0xff, 0x04, 0x6b, 0xd9, + 0xfd, 0x84, 0x1a, 0xfd, 0x04, 0x92, 0x01, 0xd1, 0x25, 0x01, 0x07, 0xe9, 0xfe, 0x09, 0xf7, 0xfe, + 0xf1, 0x05, 0x00, 0x19, 0x4a, 0xff, 0xfd, 0x52, 0xfe, 0xc5, 0x9b, 0xfe, 0x8f, 0xcd, 0xff, 0x8e, + 0x49, 0x00, 0x06, 0xb9, 0xff, 0xa2, 0x6b, 0xfe, 0x65, 0xdd, 0xfe, 0x50, 0x25, 0x00, 0xd3, 0xa3, + 0xff, 0x48, 0x79, 0xff, 0x68, 0x2e, 0x00, 0x0a, 0x7f, 0xff, 0xc2, 0x8e, 0xff, 0x4e, 0x08, 0x00, + 0x8d, 0x9f, 0xff, 0xe3, 0x65, 0xff, 0xb4, 0x87, 0x0f, 0xb1, 0x43, 0x18, 0x2d, 0x1a, 0x07, 0x29, + 0x18, 0x00, 0xac, 0xcb, 0x02, 0xa9, 0x91, 0xfe, 0x3a, 0x49, 0x02, 0x8d, 0x8f, 0x05, 0xa5, 0xe7, + 0xfc, 0x86, 0xdc, 0xfc, 0x14, 0x54, 0x02, 0x24, 0x54, 0x01, 0xc7, 0x8b, 0xfe, 0x4b, 0xb6, 0xfe, + 0xf8, 0x45, 0x00, 0xca, 0x51, 0xff, 0xff, 0x0e, 0xfe, 0x09, 0x6a, 0xfe, 0xe3, 0x97, 0xff, 0x3e, + 0x40, 0x00, 0x20, 0xe5, 0xff, 0xb2, 0xbe, 0xfe, 0xa4, 0xf8, 0xfe, 0x51, 0xd3, 0xff, 0x57, 0x0f, + 0x00, 0x4f, 0xa0, 0xff, 0xa6, 0xdc, 0xff, 0x69, 0x83, 0xff, 0xa9, 0x03, 0xff, 0x8e, 0xdd, 0xff, + 0x01, 0xc3, 0xff, 0x41, 0x4d, 0xff, 0x0f, 0x9b, 0x10, 0xea, 0x14, 0x1a, 0x5a, 0xab, 0x07, 0x17, + 0x93, 0xff, 0x9b, 0x90, 0x02, 0x88, 0xee, 0xfd, 0x3e, 0x55, 0x02, 0x6d, 0x49, 0x06, 0xa9, 0xfd, + 0xfb, 0x65, 0x41, 0xfc, 0x3e, 0x01, 0x03, 0x7e, 0x9e, 0x01, 0xcb, 0x19, 0xfe, 0x94, 0x56, 0xfe, + 0x2c, 0x54, 0x00, 0x55, 0x55, 0xff, 0x7d, 0xd5, 0xfd, 0xa9, 0x11, 0xfe, 0x55, 0x27, 0xff, 0xb8, + 0x21, 0x00, 0xec, 0x00, 0x00, 0x9d, 0xb9, 0xfe, 0x91, 0x5f, 0xff, 0x8f, 0xa0, 0xff, 0x42, 0xd5, + 0xff, 0x3b, 0x28, 0x00, 0xde, 0x8e, 0xff, 0x82, 0x35, 0xff, 0x0c, 0x13, 0xff, 0x71, 0x3f, 0xff, + 0xea, 0x94, 0xff, 0x89, 0x73, 0xff, 0xe3, 0x87, 0x11, 0xd9, 0xf1, 0x1b, 0x3a, 0x71, 0x08, 0x88, + 0x20, 0xff, 0xf6, 0x52, 0x02, 0x2f, 0x96, 0xfd, 0x09, 0x23, 0x02, 0xcb, 0xb5, 0x06, 0x12, 0x90, + 0xfb, 0x0f, 0x9e, 0xfb, 0xd4, 0x75, 0x03, 0x60, 0x16, 0x02, 0xdf, 0xd3, 0xfd, 0xd9, 0xe8, 0xfd, + 0x8b, 0x67, 0x00, 0x94, 0x54, 0xff, 0x6a, 0xab, 0xfd, 0xe9, 0xf9, 0xfd, 0xe5, 0x8c, 0xfe, 0x46, + 0xd0, 0xff, 0x81, 0x80, 0x00, 0x1e, 0x82, 0xfe, 0x46, 0x79, 0xff, 0x9a, 0x3a, 0x00, 0x1d, 0x59, + 0xff, 0x0e, 0x57, 0x00, 0x00, 0xfb, 0xff, 0x1b, 0xc0, 0xfe, 0xc0, 0xe5, 0xfe, 0x40, 0x4c, 0xff, + 0xa9, 0x18, 0xff, 0xc1, 0xa9, 0xff, 0x28, 0x22, 0x12, 0x58, 0xbf, 0x1d, 0x69, 0xa1, 0x09, 0x3e, + 0x74, 0xfe, 0x6a, 0x4f, 0x02, 0x16, 0xa8, 0xfd, 0x1d, 0x8a, 0x01, 0xfc, 0x98, 0x06, 0x3d, 0xaf, + 0xfb, 0xcf, 0x33, 0xfb, 0xb7, 0x60, 0x03, 0xf1, 0x96, 0x02, 0x87, 0xc6, 0xfd, 0x5c, 0x9d, 0xfd, + 0x1e, 0x47, 0x00, 0xae, 0x52, 0xff, 0x45, 0x6d, 0xfd, 0x08, 0x00, 0xfe, 0x68, 0x47, 0xfe, 0xff, + 0xe6, 0xfe, 0x05, 0xcc, 0x00, 0xd0, 0x15, 0xff, 0x85, 0xf4, 0xfe, 0xa0, 0xc2, 0x00, 0xe5, 0x8e, + 0xff, 0x58, 0xd1, 0xff, 0xfd, 0x9a, 0x00, 0x1c, 0xd2, 0xfe, 0x02, 0x40, 0xfe, 0x2c, 0x50, 0xff, + 0xa3, 0xf7, 0xfe, 0xf0, 0x8d, 0xff, 0x96, 0x5d, 0x13, 0x7a, 0x40, 0x1f, 0x28, 0xd3, 0x09, 0x97, + 0x7d, 0xfe, 0xa6, 0x77, 0x02, 0x47, 0x6e, 0xfd, 0x65, 0x1e, 0x01, 0xa8, 0x0e, 0x06, 0x0f, 0xbd, + 0xfb, 0x7a, 0x25, 0xfb, 0x75, 0x18, 0x03, 0x6a, 0xd1, 0x02, 0x61, 0xc9, 0xfd, 0x34, 0x72, 0xfd, + 0xa0, 0x20, 0x00, 0xb2, 0x45, 0xff, 0x04, 0xff, 0xfc, 0xb7, 0x09, 0xfe, 0x45, 0x3a, 0xfe, 0xf3, + 0x20, 0xfe, 0x7c, 0x57, 0x00, 0x01, 0xf2, 0xff, 0x77, 0xf8, 0xfe, 0x65, 0x64, 0x00, 0x28, 0x69, + 0x00, 0x68, 0x5a, 0xff, 0x02, 0x85, 0x00, 0xdd, 0x83, 0xff, 0x3d, 0xce, 0xfd, 0xcc, 0xcb, 0xfe, + 0xc3, 0x16, 0xff, 0x26, 0x49, 0xff, 0x2d, 0xd5, 0x15, 0x2d, 0x3c, 0x20, 0xe2, 0x6a, 0x08, 0x4e, + 0x83, 0xff, 0x9e, 0x50, 0x03, 0xd0, 0x9d, 0xfc, 0x6d, 0xa2, 0x00, 0xb6, 0xf6, 0x05, 0x3d, 0x3b, + 0xfb, 0xfb, 0x9d, 0xfb, 0xdf, 0xbf, 0x02, 0xd2, 0xe8, 0x02, 0x13, 0xf9, 0xfd, 0x52, 0x1b, 0xfd, + 0x06, 0x56, 0x00, 0x56, 0x02, 0xff, 0xb3, 0xec, 0xfc, 0x03, 0xb3, 0xfd, 0x29, 0x59, 0xfe, 0x97, + 0xe0, 0xfd, 0xc8, 0x81, 0xff, 0x76, 0x52, 0x00, 0x09, 0xec, 0xff, 0xe0, 0xe1, 0xff, 0x0a, 0xa8, + 0x00, 0x20, 0xeb, 0xff, 0xf9, 0xe2, 0xff, 0x04, 0xf6, 0xff, 0x04, 0x2f, 0xfe, 0xca, 0x11, 0xfe, + 0x82, 0xef, 0xfe, 0x08, 0x66, 0xff, 0x79, 0xa4, 0x18, 0x46, 0x8e, 0x20, 0x97, 0xee, 0x05, 0x8a, + 0x11, 0x02, 0x2f, 0xbf, 0x04, 0x87, 0x67, 0xfa, 0x9c, 0x3f, 0x00, 0x7b, 0xaa, 0x06, 0x16, 0x57, + 0xfa, 0x5a, 0xb4, 0xfb, 0x8d, 0xa4, 0x02, 0x42, 0xcb, 0x02, 0x9f, 0x3a, 0xfe, 0xc8, 0xa3, 0xfc, + 0x9f, 0x85, 0x00, 0x5b, 0xa5, 0xfe, 0x05, 0x05, 0xfd, 0x89, 0x5d, 0xfd, 0xa6, 0x1c, 0xfe, 0x74, + 0xf1, 0xfd, 0xa1, 0xe0, 0xfe, 0x20, 0xdf, 0xff, 0x06, 0xe8, 0x00, 0x4c, 0x47, 0x00, 0x3e, 0x10, + 0x00, 0xa7, 0x95, 0x00, 0x86, 0xab, 0xff, 0x73, 0xd1, 0xff, 0x01, 0xc3, 0xfe, 0x65, 0xdf, 0xfd, + 0x93, 0x4d, 0xfe, 0xcc, 0x6b, 0xff, 0x91, 0xe5, 0x1a, 0x90, 0x12, 0x20, 0x77, 0x9d, 0x03, 0x72, + 0x81, 0x06, 0x0f, 0xed, 0x05, 0x4a, 0xa2, 0xf6, 0x4b, 0xbf, 0x00, 0x53, 0x47, 0x08, 0xee, 0xc8, + 0xf8, 0x6d, 0x08, 0xfb, 0xf9, 0x5f, 0x03, 0x9d, 0x87, 0x02, 0xcd, 0x09, 0xfe, 0x96, 0x7a, 0xfc, + 0xd4, 0xad, 0x00, 0x73, 0x27, 0xfe, 0x23, 0x01, 0xfd, 0x2c, 0x5b, 0xfd, 0x0c, 0xbf, 0xfd, 0x24, + 0xe4, 0xfd, 0x86, 0x94, 0xfe, 0x45, 0x34, 0xff, 0x7e, 0x39, 0x01, 0x88, 0x29, 0x01, 0x27, 0xbb, + 0xff, 0xd8, 0xcb, 0x00, 0x9a, 0xce, 0xff, 0x0f, 0x88, 0xff, 0xfa, 0xfe, 0xfe, 0xed, 0x45, 0xfe, + 0xc3, 0xf2, 0xfd, 0x91, 0xce, 0xfe, 0xfe, 0xa3, 0x1c, 0x10, 0xc6, 0x1e, 0x09, 0x4b, 0x02, 0x0f, + 0x12, 0x0c, 0x62, 0x23, 0x06, 0xd5, 0x84, 0xf2, 0xd6, 0x85, 0x02, 0x0d, 0x12, 0x0a, 0xbc, 0x77, + 0xf6, 0xe2, 0x50, 0xfa, 0x6e, 0xe1, 0x04, 0xb5, 0x1a, 0x02, 0x77, 0x4a, 0xfd, 0x69, 0xee, 0xfc, + 0x97, 0xdb, 0x00, 0x9f, 0x83, 0xfd, 0x1a, 0xf6, 0xfc, 0x85, 0xb0, 0xfd, 0x5f, 0x7f, 0xfd, 0x66, + 0x99, 0xfd, 0x5a, 0xa9, 0xfe, 0x5f, 0xc8, 0xfe, 0xff, 0xf0, 0x00, 0xb8, 0xba, 0x01, 0x98, 0x1b, + 0x00, 0xc1, 0x10, 0x01, 0x4f, 0xec, 0xff, 0x81, 0x5b, 0xff, 0xb4, 0xf7, 0xfe, 0x8e, 0x02, 0xff, + 0x0b, 0x05, 0xfe, 0x06, 0x49, 0xfe, 0xba, 0x0c, 0x21, 0xd1, 0x57, 0x1f, 0x19, 0x7d, 0xfd, 0xc6, + 0xa4, 0x0c, 0xb4, 0xdc, 0x08, 0x91, 0x75, 0xf2, 0x85, 0x58, 0x01, 0x18, 0x8d, 0x09, 0x31, 0xe9, + 0xf5, 0x77, 0xa9, 0xfa, 0x3a, 0x76, 0x05, 0xb9, 0x36, 0x01, 0x8d, 0x77, 0xfc, 0xfd, 0x80, 0xfd, + 0xc9, 0xcf, 0x00, 0x39, 0xa1, 0xfc, 0x73, 0xf5, 0xfc, 0x31, 0x92, 0xfd, 0x8e, 0xb5, 0xfd, 0xcf, + 0x41, 0xfd, 0x48, 0xbb, 0xfe, 0xbd, 0xb6, 0xfe, 0xb9, 0x3a, 0x00, 0xae, 0x3e, 0x02, 0x90, 0x8a, + 0x00, 0xf7, 0xd7, 0x00, 0x57, 0x11, 0x00, 0x4c, 0x92, 0xff, 0x89, 0xaf, 0xfe, 0xe2, 0x33, 0xff, + 0x15, 0x31, 0xfe, 0xc7, 0x86, 0xfe, 0xc4, 0x63, 0x25, 0xad, 0x55, 0x20, 0xaf, 0xeb, 0xf8, 0x48, + 0xe5, 0x0b, 0x27, 0x7a, 0x0b, 0x35, 0xe7, 0xf3, 0x69, 0x8f, 0xff, 0x33, 0xcd, 0x08, 0x88, 0xe2, + 0xf5, 0x61, 0xf7, 0xfa, 0x1d, 0xdb, 0x05, 0xcb, 0x96, 0x00, 0xfd, 0xa8, 0xfb, 0xfc, 0xd3, 0xfd, + 0x1b, 0xef, 0x00, 0xb3, 0x9c, 0xfb, 0x64, 0x2f, 0xfd, 0x95, 0x3e, 0xfd, 0x83, 0x2b, 0xfe, 0x1d, + 0x27, 0xfd, 0x62, 0x86, 0xfe, 0x7d, 0x45, 0xff, 0x33, 0x4f, 0xff, 0x0f, 0x3d, 0x02, 0xa2, 0x46, + 0x01, 0x91, 0xd0, 0x00, 0x76, 0xeb, 0xff, 0xcc, 0xeb, 0xff, 0x19, 0xc7, 0xfe, 0x4f, 0x3a, 0xff, + 0x0e, 0x62, 0xfe, 0xcc, 0x15, 0xff, 0x30, 0x12, 0x29, 0xc3, 0x42, 0x22, 0x87, 0xb7, 0xf4, 0xd9, + 0xf8, 0x09, 0xe9, 0x82, 0x0d, 0x73, 0xa5, 0xf6, 0x11, 0x93, 0xfd, 0xa1, 0xab, 0x07, 0xb9, 0x62, + 0xf6, 0x46, 0x1f, 0xfb, 0x0e, 0x01, 0x06, 0x4e, 0x10, 0x00, 0xe5, 0x4e, 0xfb, 0x8b, 0x7c, 0xfd, + 0xe1, 0x29, 0x01, 0xbe, 0xc2, 0xfa, 0x4d, 0x38, 0xfd, 0x11, 0x0b, 0xfd, 0x97, 0x84, 0xfe, 0xc8, + 0x82, 0xfd, 0x0f, 0xf4, 0xfd, 0xa0, 0xff, 0xff, 0x64, 0xd3, 0xfe, 0x1a, 0x93, 0x01, 0x11, 0xcd, + 0x01, 0xde, 0x48, 0x01, 0x0a, 0x78, 0xff, 0x8d, 0x40, 0x00, 0xc7, 0x33, 0xff, 0xd9, 0xec, 0xfe, + 0xba, 0xf2, 0xfe, 0x5f, 0x4a, 0xff, 0x10, 0x60, 0x2d, 0x36, 0x61, 0x23, 0xf4, 0x1f, 0xf1, 0xd4, + 0x03, 0x08, 0xca, 0xff, 0x0d, 0x2a, 0xb7, 0xf9, 0x4b, 0x85, 0xfc, 0xd9, 0xf2, 0x05, 0x2f, 0xcc, + 0xf6, 0xf5, 0xde, 0xfb, 0xb9, 0x9e, 0x05, 0x82, 0x6b, 0xff, 0x03, 0x81, 0xfb, 0x39, 0xa4, 0xfc, + 0xbd, 0x22, 0x01, 0xa6, 0x4f, 0xfa, 0x72, 0xee, 0xfc, 0x46, 0x29, 0xfd, 0x64, 0xaf, 0xfe, 0x1c, + 0xfc, 0xfd, 0x57, 0xa1, 0xfd, 0xf0, 0x2d, 0x00, 0x1c, 0x38, 0xff, 0x90, 0x7a, 0x00, 0x48, 0xf9, + 0x01, 0x97, 0xef, 0x01, 0xe0, 0xf9, 0xfe, 0xf1, 0x9b, 0x00, 0x43, 0x93, 0xff, 0x1a, 0x9b, 0xfe, + 0xd6, 0xa0, 0xff, 0x41, 0x2f, 0xff, 0x66, 0xfe, 0x30, 0x0b, 0x2f, 0x25, 0xc8, 0xd3, 0xed, 0x51, + 0x32, 0x06, 0x89, 0x6a, 0x0d, 0x64, 0x7c, 0xfc, 0xab, 0x7a, 0xfc, 0xe4, 0xf2, 0x03, 0x11, 0x74, + 0xf7, 0x7b, 0x97, 0xfc, 0x58, 0x06, 0x05, 0x29, 0xb5, 0xfe, 0x77, 0x34, 0xfc, 0x32, 0x5c, 0xfb, + 0x98, 0xe6, 0x00, 0x4d, 0x3e, 0xfa, 0x69, 0x78, 0xfc, 0x8f, 0x9f, 0xfd, 0x9f, 0xa3, 0xfe, 0x4f, + 0x64, 0xfe, 0x9d, 0xa4, 0xfd, 0x86, 0x04, 0x00, 0xd7, 0xda, 0xff, 0xfe, 0xd7, 0xff, 0xf5, 0x65, + 0x01, 0xb4, 0xd1, 0x02, 0x83, 0xa3, 0xfe, 0x3a, 0x89, 0x00, 0x56, 0x0f, 0x00, 0x24, 0x68, 0xfe, + 0xfc, 0xf0, 0xff, 0xd6, 0x44, 0xff, 0x25, 0x1f, 0x34, 0xf7, 0x56, 0x27, 0x94, 0xfe, 0xea, 0xba, + 0xd7, 0x04, 0x0b, 0xe8, 0x0b, 0x88, 0x55, 0xfe, 0xaf, 0x77, 0xfd, 0x95, 0xfd, 0x01, 0x2c, 0x50, + 0xf8, 0x99, 0xfa, 0xfc, 0x0e, 0x7b, 0x04, 0xbd, 0x1a, 0xfe, 0x25, 0xd5, 0xfc, 0x8d, 0x48, 0xfa, + 0x15, 0x6c, 0x00, 0x57, 0x69, 0xfa, 0x3d, 0x4a, 0xfc, 0xe5, 0x11, 0xfe, 0xbc, 0x73, 0xfe, 0x85, + 0xd4, 0xfe, 0xe8, 0xd3, 0xfd, 0x0a, 0xc5, 0xff, 0xfb, 0x6c, 0x00, 0x7c, 0xf0, 0xff, 0x5f, 0x5c, + 0x00, 0x8e, 0xb8, 0x03, 0x41, 0x79, 0xfe, 0x9f, 0xcd, 0xff, 0xa8, 0xb3, 0x00, 0x15, 0x59, 0xfe, + 0x41, 0xeb, 0xff, 0xc4, 0xd0, 0xff, 0x62, 0xf9, 0x37, 0x0e, 0xf8, 0x27, 0xec, 0x14, 0xe9, 0xfe, + 0x57, 0x04, 0x17, 0x7f, 0x09, 0x2d, 0x32, 0xff, 0x04, 0xd4, 0xfe, 0xa2, 0xd5, 0x00, 0x30, 0xc0, + 0xf8, 0x17, 0x55, 0xfd, 0x0a, 0xf0, 0x03, 0xf9, 0x9e, 0xfd, 0x69, 0x1e, 0xfd, 0xac, 0xb8, 0xf9, + 0x4e, 0xc1, 0xff, 0xcb, 0xb3, 0xfa, 0xf4, 0xa1, 0xfc, 0x2f, 0xfb, 0xfd, 0x9c, 0x61, 0xfe, 0x45, + 0x55, 0xff, 0x6f, 0xea, 0xfd, 0x0f, 0xcf, 0xff, 0xcd, 0x9d, 0x00, 0xa1, 0xa4, 0x00, 0xed, 0xa9, + 0xff, 0x5e, 0xbd, 0x03, 0x69, 0x99, 0xfe, 0x8d, 0xb4, 0xfe, 0x22, 0xe5, 0x00, 0x61, 0x8f, 0xfe, + 0xdc, 0x3b, 0x00, 0x36, 0x2f, 0x00, 0xbe, 0xb8, 0x3a, 0xcb, 0x17, 0x29, 0x5d, 0x43, 0xe8, 0xc4, + 0xa4, 0x03, 0xc7, 0xc3, 0x06, 0x02, 0x13, 0xff, 0x37, 0x34, 0x00, 0x4e, 0x70, 0x00, 0x99, 0xc7, + 0xf8, 0x90, 0x6c, 0xfd, 0x92, 0x75, 0x03, 0x5b, 0xd2, 0xfc, 0x9c, 0xc4, 0xfd, 0xdf, 0x48, 0xf9, + 0x3b, 0x01, 0xff, 0xae, 0x74, 0xfb, 0xce, 0xc2, 0xfc, 0x7c, 0x92, 0xfd, 0x2e, 0x62, 0xfe, 0x3b, + 0xdc, 0xff, 0xf0, 0xeb, 0xfd, 0x2b, 0xea, 0xff, 0xe5, 0xb6, 0x00, 0xb5, 0xb9, 0x01, 0x81, 0xfd, + 0xfe, 0x8a, 0xd7, 0x02, 0xfa, 0x27, 0xff, 0xf9, 0x76, 0xfd, 0x52, 0x3b, 0x00, 0x28, 0x7e, 0xff, + 0x19, 0xa4, 0x00, 0x1f, 0x46, 0x00, 0x5c, 0x97, 0x3c, 0x6d, 0x44, 0x2a, 0xeb, 0xa2, 0xe8, 0xd7, + 0x32, 0x03, 0x8e, 0x7e, 0x03, 0x97, 0x70, 0xfe, 0xf4, 0xaa, 0x01, 0x9e, 0x47, 0x00, 0x5d, 0xb4, + 0xf8, 0xef, 0x9d, 0xfd, 0x4f, 0x9e, 0x02, 0x47, 0x15, 0xfc, 0x97, 0x13, 0xff, 0x6e, 0xf3, 0xf8, + 0x9f, 0x67, 0xfe, 0xf6, 0x48, 0xfc, 0x11, 0xbd, 0xfc, 0xf7, 0x08, 0xfd, 0x5d, 0x73, 0xfe, 0x89, + 0x95, 0x00, 0x55, 0x8e, 0xfd, 0x4a, 0x81, 0x00, 0x80, 0x07, 0x01, 0xe1, 0x04, 0x02, 0xa0, 0xae, + 0xfe, 0x0c, 0xb6, 0x01, 0x01, 0x6d, 0xff, 0x15, 0xd3, 0xfc, 0x44, 0x93, 0xff, 0x2e, 0xd7, 0xff, + 0x50, 0x5e, 0x01, 0x69, 0x22, 0x01, 0x95, 0xd3, 0x3d, 0xbb, 0xf1, 0x2a, 0x32, 0x39, 0xea, 0x3f, + 0x33, 0x03, 0xfa, 0x55, 0xff, 0xfe, 0xc6, 0xfd, 0xb1, 0xbf, 0x02, 0x56, 0x0b, 0x00, 0x39, 0xa9, + 0xf8, 0xfe, 0xbc, 0xfd, 0x30, 0x77, 0x01, 0xd0, 0xa0, 0xfb, 0x9b, 0x08, 0x01, 0xe4, 0x8b, 0xf8, + 0x1c, 0xd6, 0xfd, 0x9a, 0x0c, 0xfd, 0x02, 0x58, 0xfc, 0xa2, 0xb7, 0xfc, 0x90, 0xba, 0xfe, 0xab, + 0xa7, 0x00, 0x62, 0xe0, 0xfd, 0x85, 0x2f, 0x01, 0xf6, 0x57, 0x00, 0xb2, 0x32, 0x02, 0x2b, 0xb2, + 0xfe, 0x52, 0x49, 0x00, 0x4a, 0x9e, 0xff, 0x48, 0x53, 0xfd, 0x62, 0xa3, 0xfe, 0x90, 0x6b, 0xff, + 0xfd, 0xb7, 0x02, 0x6b, 0xaf, 0x01, 0x1c, 0x47, 0x3e, 0xb6, 0x61, 0x2b, 0x6e, 0xb7, 0xec, 0xcf, + 0x46, 0x03, 0x87, 0xca, 0xfa, 0x0d, 0xe9, 0xfc, 0x07, 0x62, 0x03, 0x4c, 0xac, 0xff, 0xb6, 0x62, + 0xf8, 0xbb, 0xd0, 0xfd, 0x29, 0x60, 0x00, 0xd2, 0xb2, 0xfb, 0x53, 0x26, 0x03, 0x3d, 0xfc, 0xf7, + 0xa2, 0x70, 0xfd, 0xc1, 0x27, 0xfd, 0x61, 0x19, 0xfc, 0x0a, 0xdc, 0xfc, 0xb2, 0x4e, 0xfe, 0x46, + 0x81, 0x01, 0x2e, 0xbc, 0xfd, 0xab, 0xda, 0x00, 0x10, 0xfa, 0xff, 0xf4, 0x07, 0x02, 0x37, 0x6f, + 0xfe, 0x93, 0xb8, 0xff, 0xdf, 0x0c, 0x00, 0x3e, 0x27, 0xfd, 0xca, 0x26, 0xff, 0x44, 0xde, 0xfe, + 0xa0, 0xb1, 0x01, 0xa5, 0xcd, 0x02, 0x86, 0x39, 0x3d, 0x4a, 0x51, 0x2c, 0x1e, 0x37, 0xf0, 0xa3, + 0x99, 0x03, 0xb5, 0xda, 0xf6, 0x79, 0x7a, 0xfb, 0x46, 0xbe, 0x03, 0x97, 0x59, 0xff, 0x9f, 0x07, + 0xf8, 0x4c, 0x36, 0xfe, 0x5f, 0x24, 0x00, 0xb6, 0xc0, 0xfb, 0xb3, 0x56, 0x05, 0xcf, 0xe6, 0xf7, + 0x23, 0x63, 0xfc, 0xd7, 0xc7, 0xfd, 0x92, 0xd0, 0xfb, 0x7a, 0x61, 0xfd, 0xfa, 0x90, 0xfe, 0xc3, + 0xfb, 0x00, 0xcc, 0x5e, 0xfd, 0xe1, 0x12, 0x01, 0x58, 0x13, 0xff, 0x36, 0xd1, 0x01, 0xd2, 0x54, + 0xff, 0xc8, 0x33, 0xff, 0x3b, 0x33, 0x00, 0xa3, 0x48, 0xfe, 0x54, 0x71, 0xff, 0x85, 0xd0, 0xfd, + 0xbc, 0x7d, 0x00, 0x86, 0x99, 0x03, 0xfc, 0x21, 0x3d, 0xb7, 0x06, 0x2b, 0x93, 0x7e, 0xf4, 0xb9, + 0xab, 0x03, 0x66, 0x64, 0xf3, 0x5a, 0x71, 0xf9, 0xc4, 0x75, 0x03, 0xf6, 0x35, 0xff, 0x36, 0x5e, + 0xf7, 0x69, 0xc1, 0xff, 0xfb, 0x51, 0xff, 0x9d, 0x74, 0xfc, 0xf5, 0xfe, 0x06, 0xcf, 0x88, 0xf7, + 0x20, 0x8a, 0xfb, 0x8a, 0xcf, 0xfd, 0x62, 0x31, 0xfd, 0x16, 0x35, 0xfd, 0x7a, 0x4f, 0xfd, 0x2e, + 0xdf, 0x00, 0xb5, 0x24, 0xfd, 0x6f, 0x6a, 0x00, 0x17, 0x00, 0xff, 0xbf, 0x21, 0x02, 0xfe, 0x4e, + 0xff, 0xa5, 0xb3, 0xff, 0x71, 0xea, 0x00, 0xc4, 0x19, 0xfe, 0xaf, 0x1f, 0xff, 0xe6, 0xc6, 0xfe, + 0xe1, 0x29, 0xff, 0x63, 0x41, 0x01, 0x1b, 0xc1, 0x3a, 0x0c, 0x53, 0x2b, 0xd7, 0xcc, 0xf8, 0xd6, + 0xf6, 0x03, 0x4f, 0x73, 0xf1, 0x7e, 0x69, 0xf6, 0x57, 0x49, 0x02, 0xe5, 0x2d, 0x00, 0xa1, 0x94, + 0xf7, 0xc0, 0x7c, 0x00, 0x8e, 0x53, 0xff, 0xc4, 0x0e, 0xfd, 0xea, 0x62, 0x08, 0x77, 0xf6, 0xf6, + 0x4d, 0xf2, 0xfa, 0x01, 0x0e, 0x00, 0x19, 0x2f, 0xfc, 0x82, 0x87, 0xfc, 0x7e, 0x20, 0xfd, 0x6f, + 0xde, 0xff, 0x84, 0x32, 0xfd, 0x1c, 0xc0, 0x00, 0xe8, 0xd5, 0xfe, 0xc5, 0xf4, 0x01, 0xd8, 0xcc, + 0x00, 0x0b, 0x06, 0x00, 0xe3, 0xab, 0xff, 0x63, 0x25, 0xff, 0x34, 0x28, 0x00, 0xae, 0x80, 0xfd, + 0xfc, 0x75, 0xff, 0xfe, 0x35, 0xff, 0x94, 0xa4, 0x38, 0xfd, 0x9c, 0x2a, 0x67, 0xd6, 0xfc, 0xeb, + 0x08, 0x04, 0x4a, 0x7c, 0xf0, 0x08, 0xbd, 0xf2, 0x35, 0x76, 0x00, 0xef, 0xe9, 0x02, 0x06, 0xa4, + 0xf7, 0xf5, 0x4c, 0x00, 0x6f, 0x25, 0x00, 0x01, 0xf1, 0xfd, 0x7e, 0x2d, 0x07, 0x41, 0xe6, 0xf8, + 0x01, 0x64, 0xfb, 0x4a, 0xa6, 0xfe, 0x18, 0x90, 0xfc, 0x83, 0xc4, 0xfb, 0x3f, 0x3f, 0xfc, 0xdb, + 0xe1, 0xff, 0xa1, 0xe7, 0xfd, 0x77, 0xf8, 0xff, 0x6b, 0x8b, 0xff, 0xd1, 0x3b, 0x03, 0x6d, 0x8d, + 0xff, 0xdc, 0x38, 0x00, 0xb6, 0x7f, 0x00, 0xd0, 0xe5, 0xfe, 0xce, 0x64, 0x00, 0x2a, 0xfe, 0xfc, + 0xdd, 0x29, 0x00, 0x47, 0x75, 0xfe, 0x98, 0x8f, 0x36, 0xb0, 0xe2, 0x29, 0x05, 0xd3, 0xfe, 0xdf, + 0xf6, 0x05, 0xe8, 0x2b, 0xef, 0xd7, 0xb7, 0xee, 0xad, 0xc1, 0x00, 0xdb, 0xe7, 0x04, 0x7a, 0x34, + 0xf7, 0xa4, 0xea, 0x01, 0x73, 0x32, 0xff, 0x63, 0xe8, 0xfd, 0xce, 0x90, 0x09, 0xfa, 0x3f, 0xf8, + 0xa6, 0x1e, 0xfb, 0x13, 0xc2, 0xfe, 0x7c, 0xec, 0xfa, 0xfe, 0x66, 0xfc, 0x87, 0x99, 0xfc, 0xa5, + 0x19, 0xff, 0x55, 0x4e, 0xfe, 0x62, 0x4e, 0x01, 0x7f, 0xd6, 0xff, 0xca, 0xab, 0x01, 0x2f, 0x16, + 0x00, 0x97, 0x73, 0x01, 0xc8, 0xaf, 0xff, 0xa6, 0x17, 0xfe, 0x28, 0x28, 0x02, 0x17, 0xe7, 0xfc, + 0xbf, 0xdb, 0xfe, 0x08, 0xff, 0xff, 0x07, 0x62, 0x36, 0x8a, 0x21, 0x26, 0xdf, 0x10, 0x01, 0xbf, + 0xa3, 0x07, 0x86, 0x85, 0xec, 0xa0, 0x22, 0xee, 0xf4, 0x83, 0x00, 0xf6, 0xd2, 0x05, 0x1d, 0x11, + 0xf9, 0xc2, 0xfe, 0x00, 0x78, 0xa9, 0xfe, 0xb1, 0x46, 0x00, 0xea, 0x76, 0x08, 0x27, 0x6d, 0xf8, + 0x5a, 0x5e, 0xfb, 0x0d, 0x9c, 0xfc, 0x22, 0xdc, 0xfb, 0xd5, 0xd4, 0xfd, 0x51, 0xec, 0xfa, 0x66, + 0xc3, 0xff, 0xa9, 0xda, 0x00, 0x79, 0x9c, 0xff, 0xf0, 0x32, 0xff, 0x8d, 0xde, 0x02, 0x96, 0xd1, + 0xff, 0xef, 0xa6, 0x00, 0x53, 0x20, 0x00, 0x5c, 0x6c, 0xfe, 0x1e, 0x24, 0x02, 0x9d, 0x9b, 0xfd, + 0x61, 0xda, 0xfd, 0x8e, 0x5d, 0x00, 0x1d, 0x27, 0x34, 0x27, 0x77, 0x23, 0xbc, 0x5e, 0x03, 0xf5, + 0xe6, 0x07, 0x15, 0x2b, 0xec, 0x92, 0x13, 0xee, 0xb1, 0x34, 0x00, 0xa4, 0xf3, 0x05, 0x38, 0xce, + 0xfa, 0x1c, 0x35, 0x02, 0xba, 0x1a, 0xfb, 0x73, 0x92, 0x02, 0x9a, 0xf9, 0x08, 0x6e, 0x74, 0xf6, + 0x2c, 0xb3, 0xfb, 0x0e, 0x93, 0xfc, 0x0e, 0xb6, 0xfc, 0x77, 0x6d, 0xfd, 0x74, 0x09, 0xfc, 0x86, + 0xce, 0x00, 0xbd, 0x7e, 0xff, 0x94, 0x8e, 0xff, 0x98, 0x59, 0x00, 0x13, 0xcc, 0x01, 0xae, 0x2f, + 0xff, 0x78, 0x3f, 0x01, 0x48, 0x4e, 0x00, 0xcf, 0xae, 0xfe, 0x3c, 0x97, 0x01, 0xd6, 0x42, 0xfe, + 0x44, 0x53, 0xfe, 0x82, 0xa2, 0xfe, 0xa7, 0x7d, 0x30, 0x17, 0x86, 0x22, 0x2d, 0x62, 0x04, 0x8d, + 0x8b, 0x06, 0x7d, 0x10, 0xee, 0x46, 0x20, 0xf1, 0x76, 0xd3, 0xfc, 0x67, 0x46, 0x06, 0x56, 0xcc, + 0xff, 0x14, 0x10, 0xfe, 0xa5, 0x69, 0xfa, 0x1f, 0x71, 0x05, 0x67, 0x0f, 0x06, 0xaf, 0xac, 0xf6, + 0xa4, 0x84, 0xfd, 0x87, 0x5c, 0xfb, 0x32, 0x3c, 0xfd, 0x6e, 0xff, 0xff, 0xab, 0x28, 0xfb, 0x67, + 0xec, 0xff, 0x4d, 0x93, 0x00, 0x10, 0x9f, 0xff, 0x9b, 0x7a, 0xff, 0xff, 0x61, 0x01, 0x65, 0xc6, + 0xff, 0x75, 0x15, 0x01, 0x36, 0x65, 0x00, 0x62, 0x07, 0xff, 0x30, 0x71, 0x01, 0x85, 0x74, 0xfe, + 0xf1, 0x9e, 0xfe, 0x84, 0x02, 0xfe, 0x9b, 0x2e, 0x31, 0xb7, 0x3a, 0x20, 0x22, 0x15, 0xff, 0x0e, + 0x9d, 0x07, 0xce, 0x2b, 0xef, 0x74, 0xa3, 0xf3, 0x8f, 0xd4, 0xff, 0x95, 0x27, 0x03, 0x9f, 0x8c, + 0xff, 0x7a, 0x4d, 0xff, 0xf5, 0x9f, 0xf9, 0x71, 0x67, 0x05, 0xc9, 0xe1, 0x04, 0xf9, 0xd9, 0xf6, + 0xbd, 0x55, 0xfe, 0x4d, 0xf9, 0xfb, 0xf6, 0xd6, 0xfe, 0x27, 0x71, 0xff, 0xa1, 0x71, 0xfa, 0x8a, + 0x7a, 0x01, 0xab, 0xb3, 0x00, 0x1e, 0xf4, 0xfd, 0x26, 0xc8, 0xff, 0x95, 0xb1, 0x01, 0xc6, 0xd6, + 0xff, 0x69, 0xf8, 0x00, 0xa4, 0xe4, 0xff, 0x8e, 0xd4, 0xff, 0x47, 0xca, 0x01, 0x2f, 0x9a, 0xfd, + 0x5a, 0x62, 0xfe, 0x30, 0xf8, 0xfe, 0x66, 0xd9, 0x2e, 0x64, 0xe5, 0x1b, 0x26, 0xdf, 0xff, 0xf9, + 0x32, 0x09, 0x2b, 0xc1, 0xee, 0x86, 0xaf, 0xf8, 0xa0, 0xa7, 0xfe, 0x9d, 0x45, 0x01, 0x8e, 0x16, + 0x02, 0xd2, 0xbf, 0xfc, 0xc6, 0x2e, 0xf9, 0x6b, 0xd8, 0x06, 0x2c, 0xf2, 0x03, 0x7e, 0x84, 0xf6, + 0x91, 0x57, 0x00, 0x9f, 0xd3, 0xfc, 0x5f, 0xaa, 0xfe, 0x01, 0x43, 0xff, 0x91, 0xe7, 0xfa, 0x0d, + 0x19, 0x02, 0x06, 0xc5, 0xff, 0xb7, 0xa3, 0xfd, 0xaf, 0x53, 0x00, 0x60, 0xa8, 0x01, 0x02, 0x4f, + 0xff, 0xcb, 0x38, 0x01, 0x25, 0x86, 0x00, 0x23, 0xad, 0xff, 0x1c, 0x80, 0x01, 0xb3, 0x9e, 0xfd, + 0x7a, 0x7e, 0xfe, 0x24, 0x24, 0xff, 0x5c, 0x3b, 0x2b, 0x07, 0x74, 0x18, 0xf5, 0x7d, 0x00, 0xc9, + 0xcc, 0x0a, 0x40, 0xc3, 0xf1, 0xf5, 0x84, 0xf8, 0x31, 0x43, 0xff, 0x24, 0xe6, 0x01, 0xdc, 0xf7, + 0xff, 0x64, 0x5c, 0xfc, 0x71, 0xa4, 0xfa, 0x04, 0x56, 0x06, 0xb8, 0x8b, 0x02, 0xcb, 0xa5, 0xf8, + 0x7a, 0x62, 0x01, 0x29, 0x84, 0xfc, 0x12, 0xc8, 0xfe, 0xa5, 0x6d, 0xff, 0x9a, 0xb1, 0xfb, 0x8c, + 0x9b, 0x01, 0xd2, 0x4a, 0xff, 0x7e, 0xc6, 0xfd, 0x7d, 0xf2, 0x00, 0x0f, 0xfe, 0x00, 0x8e, 0xe9, + 0xfe, 0xee, 0x19, 0x02, 0x61, 0xb5, 0x00, 0xc1, 0x64, 0xff, 0x03, 0x30, 0x01, 0x10, 0xc9, 0xfd, + 0xb9, 0x71, 0xfe, 0x60, 0x65, 0xff, 0xb2, 0x46, 0x29, 0xb2, 0xed, 0x1d, 0x15, 0x50, 0x06, 0x4b, + 0x3f, 0x01, 0xe2, 0xf5, 0xe4, 0xcf, 0xd0, 0xf6, 0x28, 0xf6, 0x07, 0x35, 0xb4, 0x08, 0xa5, 0xa9, + 0xfe, 0xa3, 0xe2, 0xfa, 0x4a, 0x20, 0xf7, 0xf8, 0xae, 0x00, 0x2c, 0x65, 0x04, 0x9f, 0xbf, 0xfa, + 0xb1, 0x1e, 0x03, 0x8a, 0x0f, 0xff, 0x17, 0x75, 0xfe, 0x80, 0x9b, 0x01, 0x07, 0x41, 0xfe, 0x77, + 0x45, 0x01, 0xda, 0xcf, 0xff, 0x7c, 0x50, 0xfe, 0x6a, 0x5d, 0xff, 0x52, 0x30, 0xfe, 0xe6, 0xe7, + 0xfe, 0x60, 0x74, 0x01, 0x3f, 0x8b, 0xfe, 0xff, 0xbc, 0xff, 0x15, 0x93, 0x02, 0xc3, 0x2c, 0xff, + 0x5d, 0x9a, 0x00, 0x0b, 0xb6, 0xff, 0xfe, 0xc0, 0x22, 0x9c, 0x34, 0x1d, 0xc5, 0x76, 0x08, 0x96, + 0x61, 0x03, 0x64, 0xf6, 0xe8, 0x64, 0x82, 0xf3, 0xe2, 0x99, 0x05, 0xe7, 0x31, 0x07, 0x79, 0x17, + 0x01, 0xe1, 0xd0, 0xfd, 0x45, 0x9e, 0xf7, 0x68, 0x9d, 0xfe, 0x76, 0x16, 0x03, 0x5e, 0x2c, 0xfd, + 0x12, 0x9c, 0x02, 0x5a, 0xee, 0xfe, 0x4c, 0xcf, 0xfe, 0xf6, 0xe9, 0x01, 0x76, 0x89, 0xfe, 0x3f, + 0xb9, 0x00, 0xdb, 0xaa, 0x00, 0x11, 0xd7, 0xfe, 0x27, 0x6f, 0xff, 0x6e, 0x6c, 0xfe, 0xfe, 0x6a, + 0xfe, 0x79, 0xb2, 0x00, 0x2d, 0x28, 0xfe, 0xda, 0x22, 0x00, 0x2c, 0xf6, 0x02, 0x4c, 0xb9, 0xff, + 0x5b, 0x18, 0x01, 0x4b, 0xbe, 0xff, 0xde, 0x12, 0x1e, 0xa9, 0xd3, 0x1a, 0x33, 0x24, 0x09, 0x6d, + 0xaa, 0x04, 0xf6, 0xd0, 0xec, 0x37, 0x83, 0xf4, 0xe3, 0xfb, 0x03, 0x26, 0x0d, 0x05, 0x5c, 0x6d, + 0x01, 0xa6, 0xd3, 0xfe, 0x9f, 0xff, 0xf8, 0xd1, 0xe0, 0xfd, 0xa1, 0xf5, 0x02, 0x92, 0x15, 0xfe, + 0x29, 0x73, 0x01, 0xca, 0x48, 0xff, 0x1f, 0xee, 0xfe, 0x44, 0xb1, 0x01, 0xef, 0xf5, 0xfe, 0xc6, + 0x49, 0x00, 0xd2, 0xb4, 0x00, 0x35, 0x6e, 0xff, 0x93, 0x3f, 0xff, 0x88, 0x76, 0xfe, 0xe8, 0xb6, + 0xfe, 0xff, 0x22, 0x00, 0x76, 0x6f, 0xfe, 0x96, 0x89, 0x00, 0x90, 0xa1, 0x02, 0x5d, 0x48, 0x00, + 0xe1, 0xf5, 0x00, 0x86, 0x93, 0xff, 0x8e, 0xbd, 0x18, 0x28, 0x60, 0x18, 0xed, 0xaf, 0x0a, 0x9c, + 0x02, 0x05, 0xe6, 0xcc, 0xf0, 0x8c, 0x40, 0xf6, 0x1e, 0xa9, 0x01, 0xdf, 0xd5, 0x03, 0x07, 0xd0, + 0x01, 0xc2, 0x86, 0xff, 0x39, 0x7d, 0xfa, 0x16, 0x89, 0xfd, 0x54, 0xaf, 0x02, 0x4c, 0x85, 0xfe, + 0xfa, 0xb4, 0x00, 0xf5, 0xaa, 0xff, 0x52, 0x16, 0xff, 0x0b, 0x71, 0x01, 0x5e, 0x73, 0xff, 0x90, + 0x0d, 0x00, 0xb0, 0xd3, 0x00, 0x48, 0xea, 0xff, 0x4d, 0x11, 0xff, 0xa1, 0xa6, 0xfe, 0x64, 0xef, + 0xfe, 0xce, 0x0a, 0x00, 0xcd, 0x4b, 0xff, 0xae, 0xc5, 0x00, 0xdb, 0x14, 0x02, 0x3a, 0x87, 0x00, + 0x39, 0x9e, 0x00, 0x65, 0x7b, 0xff, 0x62, 0xbd, 0x14, 0xea, 0xbc, 0x16, 0xae, 0xcf, 0x0b, 0x31, + 0xc1, 0x04, 0x3f, 0xd4, 0xf3, 0x7d, 0x8f, 0xf7, 0x60, 0x5e, 0x00, 0x8e, 0x53, 0x03, 0x89, 0xc6, + 0x01, 0x90, 0x14, 0x00, 0xcc, 0xc7, 0xfb, 0x14, 0x88, 0xfd, 0x72, 0x1d, 0x02, 0xdb, 0xc8, 0xfe, + 0x0f, 0xa5, 0x00, 0xf7, 0xe6, 0xff, 0xb0, 0x19, 0xff, 0x69, 0x68, 0x01, 0x80, 0xf9, 0xff, 0x01, + 0xf9, 0xff, 0xe7, 0xe6, 0x00, 0x90, 0x17, 0x00, 0x0c, 0x1e, 0xff, 0x31, 0x40, 0xff, 0x75, 0x83, + 0xff, 0x07, 0x0d, 0x00, 0xc7, 0x9d, 0xff, 0xb4, 0xb9, 0x00, 0x67, 0x79, 0x01, 0x95, 0x74, 0x00, + 0x51, 0x5e, 0x00, 0x1f, 0x5d, 0xff, 0x2d, 0xcc, 0x10, 0xbf, 0xc8, 0x14, 0xb0, 0x84, 0x0c, 0x77, + 0x0f, 0x05, 0x09, 0x96, 0xf6, 0xfa, 0x4c, 0xf8, 0x9b, 0x90, 0xff, 0xf7, 0xde, 0x02, 0x2d, 0xdc, + 0x01, 0x3f, 0x8f, 0x00, 0x1d, 0xb1, 0xfc, 0x6e, 0xc4, 0xfd, 0xfd, 0xa1, 0x01, 0x57, 0xd9, 0xfe, + 0x82, 0x82, 0x00, 0x57, 0x4c, 0x00, 0xb1, 0x4a, 0xff, 0xb3, 0x43, 0x01, 0xc0, 0x5c, 0x00, 0x04, + 0x08, 0x00, 0x9a, 0xdc, 0x00, 0x3f, 0x91, 0x00, 0x99, 0xdf, 0xff, 0x78, 0xe8, 0xff, 0x78, 0x88, + 0xff, 0xae, 0x6b, 0xff, 0xf7, 0xb7, 0xff, 0x77, 0x71, 0x00, 0x80, 0xb3, 0x00, 0x91, 0x51, 0x00, + 0x92, 0x39, 0x00, 0x43, 0x94, 0xff, 0x57, 0x29, 0x0e, 0x61, 0xff, 0x12, 0xfe, 0xf2, 0x0c, 0xe9, + 0xce, 0x05, 0xbb, 0x4f, 0xf8, 0x6b, 0xca, 0xf8, 0x6f, 0x4c, 0xff, 0x37, 0xba, 0x02, 0x8d, 0x21, + 0x02, 0x13, 0xbc, 0x00, 0x78, 0x6c, 0xfd, 0x5d, 0x59, 0xfe, 0x3d, 0x21, 0x01, 0xcc, 0xdb, 0xfe, + 0x39, 0xda, 0x00, 0xb2, 0x9c, 0x00, 0x41, 0x88, 0xff, 0xa2, 0x61, 0x01, 0x22, 0x6b, 0x00, 0x1a, + 0xa0, 0x00, 0x5e, 0xc4, 0x01, 0xbf, 0xd6, 0x00, 0x25, 0xe7, 0xff, 0x9e, 0x07, 0x00, 0xbd, 0x49, + 0xff, 0xc3, 0xd5, 0xfe, 0x56, 0xd1, 0xff, 0x36, 0x63, 0x00, 0xfb, 0x68, 0x00, 0xe5, 0x85, 0x00, + 0x16, 0x35, 0x00, 0x64, 0x66, 0xff, 0x7a, 0x9f, 0x0c, 0x17, 0xd3, 0x11, 0xf4, 0x7d, 0x0c, 0x42, + 0x6d, 0x05, 0xb3, 0x3a, 0xf9, 0x79, 0xc1, 0xf9, 0xcf, 0x6e, 0xff, 0x54, 0x4d, 0x02, 0x55, 0x18, + 0x02, 0xe1, 0xef, 0x00, 0xd9, 0xff, 0xfd, 0xef, 0x78, 0xfe, 0x85, 0xcc, 0x00, 0x82, 0x0b, 0xff, + 0x04, 0x13, 0x01, 0xd8, 0xaf, 0x00, 0xa6, 0x94, 0xff, 0xa1, 0xcc, 0x01, 0xc6, 0x42, 0x01, 0xaa, + 0x0e, 0x01, 0x77, 0x82, 0x01, 0xfe, 0x74, 0x00, 0x80, 0xa5, 0xff, 0x2b, 0x94, 0xff, 0x5b, 0x9c, + 0xfe, 0x6e, 0xea, 0xfe, 0xb7, 0x1e, 0x00, 0xd1, 0xed, 0xff, 0xd9, 0x6b, 0x00, 0xd9, 0x26, 0x00, + 0x1d, 0xbe, 0xff, 0xbf, 0x15, 0x00, 0x24, 0x14, 0x0b, 0x18, 0x3d, 0x10, 0x37, 0x3d, 0x0c, 0xda, + 0xb5, 0x05, 0x05, 0x1b, 0xfa, 0xf8, 0x41, 0xfa, 0xdc, 0x83, 0xff, 0x0b, 0x63, 0x02, 0xd3, 0x3f, + 0x02, 0xae, 0xf8, 0x00, 0xac, 0x9f, 0xfe, 0xa6, 0xd6, 0xfe, 0xdf, 0xa4, 0x00, 0x2f, 0x4a, 0xff, + 0x3e, 0x08, 0x01, 0xd7, 0x83, 0x01, 0x27, 0xfc, 0x00, 0x7d, 0xef, 0x01, 0x63, 0x0b, 0x01, 0xe7, + 0xb7, 0x00, 0xca, 0xfc, 0x00, 0xdf, 0xcc, 0xff, 0x08, 0x24, 0xff, 0xf0, 0xa1, 0xff, 0x48, 0x94, + 0xfe, 0x1a, 0x22, 0xff, 0x86, 0x3e, 0x00, 0x31, 0x6a, 0xff, 0x00, 0xf7, 0xff, 0xe1, 0x97, 0x00, + 0x82, 0x21, 0x00, 0x6a, 0xee, 0xff, 0x8f, 0xa1, 0x0a, 0x68, 0xdf, 0x0f, 0x60, 0x59, 0x0b, 0x70, + 0xda, 0x04, 0x39, 0x9a, 0xfa, 0xae, 0x3c, 0xfb, 0x62, 0x16, 0x00, 0x1d, 0x7a, 0x02, 0x71, 0x50, + 0x02, 0xf0, 0x08, 0x01, 0xfc, 0x5f, 0xff, 0x1e, 0x1b, 0xff, 0x82, 0x65, 0x00, 0xbf, 0x31, 0x00, + 0x15, 0x2e, 0x02, 0x6a, 0x25, 0x02, 0x95, 0xba, 0x00, 0xd5, 0x33, 0x01, 0x09, 0xb4, 0x00, 0x46, + 0x67, 0x00, 0x53, 0x78, 0x00, 0x9d, 0xa7, 0xff, 0x91, 0x62, 0xff, 0xb2, 0x80, 0xff, 0x37, 0xd9, + 0xfe, 0xcd, 0x47, 0xff, 0xf1, 0x98, 0xff, 0x69, 0xfb, 0xff, 0x29, 0x89, 0x00, 0xa6, 0x15, 0x00, + 0x97, 0xeb, 0xff, 0x8d, 0x1a, 0x00, 0xe7, 0x71, 0x0a, 0x2a, 0x5a, 0x0f, 0xc5, 0x74, 0x0a, 0x79, + 0xfe, 0x03, 0x47, 0xed, 0xfa, 0x89, 0x71, 0xfc, 0xe8, 0xdb, 0x00, 0xec, 0x77, 0x02, 0xfe, 0x8b, + 0x02, 0xf5, 0x55, 0x01, 0x35, 0xc7, 0xff, 0xd2, 0xd8, 0xff, 0xbd, 0x98, 0x01, 0xb8, 0xde, 0x00, + 0x02, 0xa7, 0x01, 0x32, 0x64, 0x01, 0xf4, 0x29, 0x00, 0x7c, 0xa0, 0x00, 0xd3, 0x58, 0x00, 0x9b, + 0x5e, 0x00, 0xaa, 0x5e, 0x00, 0x17, 0xb7, 0xff, 0xac, 0x36, 0xff, 0x30, 0x60, 0xff, 0xf4, 0xdf, + 0xfe, 0x1b, 0xbf, 0xff, 0x67, 0x61, 0x00, 0xa2, 0x6f, 0xff, 0x62, 0x02, 0x00, 0x02, 0x08, 0x00, + 0x02, 0x27, 0x00, 0xdb, 0x45, 0x00, 0x1e, 0x59, 0x0a, 0xfc, 0x42, 0x0f, 0x61, 0x6e, 0x09, 0x76, + 0x76, 0x03, 0x4d, 0xa0, 0xfb, 0x5d, 0x26, 0xfd, 0x0a, 0xa7, 0x01, 0x2e, 0xd5, 0x02, 0xa1, 0x61, + 0x02, 0x16, 0xe2, 0x01, 0xe9, 0x5c, 0x01, 0x6a, 0x15, 0x00, 0x17, 0xba, 0x00, 0x52, 0x99, 0x00, + 0x73, 0xf0, 0x00, 0xb7, 0xda, 0x00, 0x6b, 0x12, 0x00, 0xf0, 0x79, 0x00, 0xcd, 0x73, 0x00, 0x14, + 0x60, 0x00, 0xcf, 0x1f, 0x00, 0x9e, 0x95, 0xff, 0x3a, 0x18, 0xff, 0x3e, 0x92, 0xff, 0xdd, 0x06, + 0x00, 0xe8, 0xbc, 0xff, 0x24, 0x5f, 0xff, 0x92, 0x80, 0xff, 0xc1, 0x08, 0x00, 0xf8, 0x0c, 0x00, + 0xab, 0x0e, 0x00, 0x1f, 0x63, 0x00, 0x57, 0xbe, 0x09, 0x3e, 0xf3, 0x0e, 0x41, 0x02, 0x09, 0xe5, + 0x49, 0x03, 0xa8, 0xbf, 0xfc, 0x93, 0x2f, 0xfe, 0x7b, 0x46, 0x02, 0xb4, 0x3f, 0x03, 0x58, 0x71, + 0x03, 0x71, 0x6b, 0x02, 0xab, 0x77, 0x00, 0x19, 0x86, 0xff, 0xfc, 0x01, 0x00, 0x1e, 0xec, 0xff, + 0x71, 0xb6, 0x00, 0xa3, 0xa0, 0x00, 0xa6, 0x3f, 0x00, 0x44, 0x5d, 0x00, 0x5d, 0x42, 0x00, 0x0a, + 0x2f, 0x00, 0x51, 0x06, 0x00, 0xa2, 0xb4, 0xff, 0x6c, 0xaf, 0xff, 0x65, 0x82, 0x00, 0xff, 0x56, + 0xff, 0x5f, 0xfb, 0xfe, 0xc3, 0x86, 0xff, 0x37, 0xa7, 0xff, 0x72, 0xa1, 0xff, 0x7e, 0xcf, 0xff, + 0xbd, 0x98, 0x00, 0x8a, 0xe2, 0xff, 0x00, 0xa1, 0x09, 0xf8, 0xed, 0x0e, 0x99, 0x64, 0x08, 0xf2, + 0x10, 0x03, 0x80, 0x3a, 0xfe, 0xcb, 0x2f, 0xff, 0xbd, 0x0f, 0x03, 0x5b, 0x15, 0x04, 0x57, 0x85, + 0x02, 0x0e, 0x3e, 0x01, 0x40, 0x37, 0x00, 0xd1, 0x44, 0xff, 0x08, 0xd5, 0xff, 0xf2, 0xa7, 0xff, + 0x86, 0xb0, 0x00, 0x9a, 0xa2, 0x00, 0xb2, 0x0a, 0x00, 0xb9, 0x29, 0x00, 0xac, 0x3e, 0x00, 0xbf, + 0x87, 0x00, 0xea, 0xc1, 0xff, 0x53, 0x78, 0x00, 0xb8, 0x81, 0x00, 0x09, 0x2b, 0xff, 0x44, 0x22, + 0xff, 0xc1, 0x6b, 0xff, 0x48, 0x5a, 0xff, 0x01, 0x3d, 0xff, 0x3d, 0xc2, 0xff, 0xa5, 0xf9, 0xff, + 0x62, 0xd6, 0xff, 0x3b, 0x16, 0x00, 0x62, 0xef, 0x09, 0x2f, 0x1d, 0x0f, 0x28, 0xea, 0x07, 0xf8, + 0xfc, 0x02, 0x0d, 0x53, 0xff, 0x81, 0x92, 0x00, 0x5a, 0x3c, 0x03, 0x1a, 0x07, 0x03, 0x17, 0x9c, + 0x01, 0xef, 0xc2, 0x00, 0xfd, 0x04, 0x00, 0x81, 0x6a, 0xff, 0xa7, 0xdf, 0xff, 0x69, 0x66, 0xff, + 0xe8, 0x9d, 0x00, 0x76, 0x98, 0x00, 0x0f, 0x9e, 0xff, 0x3c, 0x51, 0x00, 0xea, 0xdb, 0x00, 0xd2, + 0x14, 0x00, 0x75, 0x69, 0x00, 0xba, 0x37, 0x01, 0x28, 0x41, 0xff, 0xb8, 0x22, 0xff, 0x6f, 0x76, + 0xff, 0x77, 0x1c, 0xff, 0x27, 0x03, 0xff, 0xf2, 0x8a, 0xff, 0x76, 0xc9, 0xff, 0x99, 0x2e, 0xff, + 0x1d, 0x12, 0x00, 0xb7, 0x94, 0x00, 0x82, 0xd4, 0x09, 0x46, 0xf1, 0x0f, 0x9e, 0xa2, 0x08, 0x9e, + 0xdf, 0x02, 0x98, 0x7a, 0xff, 0xdb, 0x58, 0x00, 0xd1, 0x94, 0x02, 0xf1, 0x97, 0x02, 0x0e, 0x4a, + 0x01, 0x16, 0xb0, 0x00, 0x7d, 0x5c, 0x00, 0xb2, 0x05, 0xff, 0x04, 0xd0, 0xff, 0xce, 0xb8, 0xff, + 0x0d, 0x1d, 0x00, 0x78, 0x8e, 0x00, 0x6e, 0xea, 0xff, 0xe3, 0xa5, 0x00, 0x50, 0x75, 0x00, 0xb6, + 0xb9, 0x00, 0x11, 0x77, 0x01, 0x0c, 0xc7, 0xff, 0x7b, 0x39, 0xff, 0x40, 0xe5, 0xff, 0x73, 0x05, + 0xff, 0x73, 0x98, 0xfe, 0x93, 0x54, 0xff, 0x90, 0x9f, 0xff, 0xbf, 0x1a, 0xff, 0xb1, 0x82, 0xff, + 0x24, 0x6a, 0x00, 0x45, 0xd9, 0x00, 0x56, 0x6c, 0x0a, 0xe3, 0x00, 0x11, 0x34, 0xf4, 0x08, 0x00, + 0x45, 0x02, 0x83, 0xd4, 0xfe, 0x9d, 0x32, 0xff, 0x33, 0xf8, 0x01, 0x3c, 0x21, 0x03, 0x1c, 0x79, + 0x01, 0x47, 0xa6, 0x00, 0xf0, 0x6c, 0x00, 0x1f, 0xe1, 0xfe, 0x10, 0x82, 0xff, 0x63, 0xde, 0xff, + 0x84, 0x56, 0x00, 0x6a, 0x61, 0x00, 0xd7, 0x56, 0x00, 0xf4, 0x83, 0x00, 0x35, 0x37, 0x00, 0x15, + 0xd4, 0x01, 0x30, 0x05, 0x01, 0xf4, 0x43, 0xff, 0xbf, 0xb5, 0xff, 0x73, 0xba, 0xff, 0x41, 0xf6, + 0xfe, 0xce, 0x9d, 0xfe, 0x68, 0x66, 0xff, 0xa1, 0x0a, 0xff, 0x1d, 0x24, 0xff, 0xf8, 0x39, 0x00, + 0x73, 0x96, 0x00, 0xd9, 0x4f, 0x00, 0xbc, 0x86, 0x0a, 0x6e, 0x07, 0x12, 0x61, 0x68, 0x09, 0xc1, + 0x8f, 0x01, 0x12, 0x3a, 0xfe, 0xd8, 0x58, 0xfe, 0xef, 0x88, 0x01, 0x48, 0x07, 0x03, 0xd0, 0x58, + 0x01, 0xb2, 0x01, 0x01, 0x65, 0x8d, 0x00, 0x25, 0xa8, 0xfe, 0xb5, 0x94, 0xff, 0xde, 0x0b, 0x00, + 0x6d, 0x34, 0x00, 0x7b, 0x86, 0x00, 0xe4, 0xbc, 0x00, 0x5c, 0xe7, 0xff, 0x14, 0x58, 0x00, 0x90, + 0x98, 0x02, 0xe7, 0x98, 0x00, 0x71, 0x41, 0xff, 0x8f, 0xff, 0xff, 0xe6, 0x94, 0xff, 0x04, 0xd5, + 0xfe, 0x6f, 0x13, 0xff, 0xb5, 0x46, 0xff, 0xa8, 0x90, 0xfe, 0x5b, 0x2f, 0xff, 0xe6, 0x8b, 0x00, + 0x38, 0xf6, 0x00, 0xc4, 0xb4, 0xff, 0x05, 0x01, 0x0a, 0x92, 0x4f, 0x12, 0xab, 0x78, 0x0a, 0xaa, + 0x54, 0x01, 0x07, 0x83, 0xfd, 0xa5, 0x12, 0xfe, 0x78, 0xaf, 0x01, 0xcd, 0x18, 0x03, 0x4c, 0xe8, + 0x00, 0x13, 0x48, 0x00, 0x15, 0x6d, 0x00, 0x2c, 0x2d, 0xff, 0xf9, 0x9e, 0xff, 0xa8, 0xfe, 0xff, + 0xea, 0xa4, 0x00, 0x5e, 0x7a, 0x00, 0xe6, 0x52, 0x00, 0xa8, 0x1e, 0x00, 0xb7, 0x31, 0x00, 0x62, + 0x58, 0x02, 0xd6, 0x31, 0x01, 0x2c, 0x56, 0xff, 0x03, 0xd9, 0xff, 0x6a, 0xb3, 0xff, 0x7d, 0xe8, + 0xfe, 0x66, 0x3a, 0xff, 0x76, 0x38, 0xff, 0x1a, 0x9c, 0xfe, 0xec, 0x3b, 0xff, 0x58, 0x53, 0x00, + 0x60, 0xdf, 0x00, 0x75, 0xce, 0xff, 0x65, 0x31, 0x09, 0xb8, 0x44, 0x12, 0xa9, 0xee, 0x0b, 0x20, + 0xd7, 0x01, 0x53, 0xcf, 0xfc, 0xb0, 0x9a, 0xfd, 0x9f, 0xbd, 0x01, 0x65, 0xa7, 0x03, 0x2b, 0x5e, + 0x01, 0xe7, 0x8c, 0xff, 0x75, 0xa1, 0xff, 0x07, 0xf9, 0xfe, 0xae, 0x3f, 0xff, 0x5f, 0x66, 0x00, + 0x9c, 0x4d, 0x01, 0xa9, 0x80, 0x00, 0x40, 0x5b, 0x00, 0x2b, 0x45, 0x00, 0x92, 0x99, 0xff, 0xd5, + 0x0e, 0x02, 0x12, 0x02, 0x02, 0x96, 0x7e, 0xff, 0x77, 0xa9, 0xff, 0x10, 0x0e, 0x00, 0xd4, 0x43, + 0xff, 0x75, 0x4d, 0xff, 0x25, 0x59, 0xff, 0x81, 0xd6, 0xfe, 0x84, 0x3e, 0xff, 0x8e, 0x56, 0x00, + 0xb4, 0xd9, 0x00, 0xb0, 0xc6, 0xff, 0xd7, 0x02, 0x09, 0xdf, 0x5d, 0x12, 0x1c, 0xaf, 0x0c, 0x15, + 0x22, 0x02, 0xf4, 0x57, 0xfc, 0x3b, 0x20, 0xfd, 0x85, 0xc0, 0x01, 0x16, 0x14, 0x04, 0x96, 0x9a, + 0x01, 0x79, 0x58, 0xff, 0xb6, 0x57, 0xff, 0xcc, 0xcc, 0xfe, 0x9a, 0x90, 0xfe, 0x69, 0xab, 0xff, + 0x38, 0x4e, 0x01, 0x79, 0x13, 0x01, 0x89, 0x53, 0x00, 0xa4, 0x5b, 0x00, 0x7f, 0xcf, 0xff, 0xdf, + 0x20, 0x01, 0xbe, 0x38, 0x02, 0x63, 0x0d, 0x00, 0xaf, 0x3c, 0xff, 0x95, 0xcd, 0xff, 0x91, 0x98, + 0xff, 0x59, 0xb4, 0xff, 0x4c, 0x7d, 0xff, 0x7f, 0xcd, 0xfe, 0xb5, 0x36, 0xff, 0x9f, 0x76, 0x00, + 0xfe, 0xb6, 0x00, 0x02, 0xf0, 0xff, 0x19, 0x6e, 0x09, 0xcf, 0xfb, 0x12, 0x8d, 0xe0, 0x0c, 0x59, + 0x3e, 0x02, 0xc2, 0xc0, 0xfb, 0x38, 0xb1, 0xfc, 0x5a, 0x1e, 0x02, 0xd7, 0x52, 0x04, 0xd3, 0xcf, + 0x01, 0x42, 0x1c, 0xff, 0x88, 0x27, 0xff, 0xb2, 0x02, 0xff, 0xf3, 0x5f, 0xfe, 0x97, 0x33, 0xff, + 0xd4, 0xb9, 0x00, 0x90, 0xd8, 0x00, 0x66, 0x41, 0x00, 0x27, 0x7e, 0x00, 0x3c, 0x5a, 0x00, 0xca, + 0xc8, 0x00, 0x66, 0xfd, 0x01, 0x09, 0xc1, 0x00, 0x92, 0x01, 0xff, 0x53, 0x24, 0xff, 0xaa, 0xb4, + 0xff, 0x6e, 0xf6, 0xff, 0x20, 0xe2, 0xff, 0x0f, 0x10, 0xff, 0xa4, 0x46, 0xff, 0x8c, 0x72, 0x00, + 0x9e, 0xab, 0x00, 0xdf, 0x2e, 0x00, 0xdf, 0x05, 0x0a, 0x30, 0xee, 0x13, 0xd3, 0x73, 0x0d, 0x23, + 0x1c, 0x02, 0x81, 0xff, 0xfa, 0x0c, 0x36, 0xfc, 0x7a, 0x48, 0x02, 0x20, 0x03, 0x05, 0xb2, 0xcf, + 0x01, 0x85, 0xaf, 0xfe, 0x3b, 0x26, 0xff, 0x27, 0x0d, 0xff, 0x4c, 0x73, 0xfe, 0x9b, 0x16, 0xff, + 0x40, 0x57, 0x00, 0x9f, 0x9b, 0x00, 0x45, 0xbc, 0xff, 0xe1, 0xc7, 0xff, 0x61, 0xba, 0x00, 0x81, + 0xcc, 0x00, 0xc4, 0xb6, 0x01, 0xf2, 0x8d, 0x01, 0xba, 0x72, 0xff, 0xe0, 0x6e, 0xfe, 0x92, 0x10, + 0xff, 0x73, 0xe7, 0xff, 0x79, 0x3e, 0x00, 0x33, 0x6d, 0xff, 0x52, 0x44, 0xff, 0x6f, 0xae, 0x00, + 0x9d, 0xb1, 0x00, 0x47, 0x3c, 0x00, 0x22, 0xa5, 0x0a, 0x79, 0x42, 0x15, 0xe9, 0xfb, 0x0d, 0x38, + 0x65, 0x01, 0x26, 0x5d, 0xfa, 0x88, 0xea, 0xfb, 0x7b, 0x63, 0x02, 0xd7, 0x98, 0x05, 0x48, 0xa9, + 0x01, 0xdf, 0x2e, 0xfe, 0xf7, 0x06, 0xff, 0xf6, 0x1a, 0xff, 0x0b, 0x8e, 0xfe, 0xfc, 0x1b, 0xff, + 0xde, 0x15, 0x00, 0x85, 0x66, 0x00, 0x41, 0xc4, 0xff, 0x80, 0x22, 0xff, 0x97, 0x41, 0x00, 0x82, + 0xd7, 0x00, 0xf7, 0x47, 0x01, 0x31, 0x99, 0x01, 0xc6, 0x5d, 0x00, 0xa4, 0x8a, 0xfe, 0x51, 0x57, + 0xfe, 0x9a, 0x81, 0xff, 0xd9, 0x3b, 0x00, 0xcb, 0x88, 0xff, 0xf5, 0x40, 0xff, 0x8f, 0xae, 0x00, + 0xa7, 0x9a, 0x00, 0xb2, 0x50, 0x00, 0x47, 0xc2, 0x0b, 0x60, 0x01, 0x17, 0x49, 0x88, 0x0e, 0xc8, + 0x81, 0x00, 0x49, 0x90, 0xf9, 0x5e, 0x49, 0xfb, 0xae, 0xa7, 0x02, 0xeb, 0xb9, 0x06, 0x94, 0x42, + 0x01, 0xdb, 0x61, 0xfd, 0x32, 0xe5, 0xfe, 0x76, 0x41, 0xff, 0x4a, 0x93, 0xfe, 0x69, 0x2c, 0xff, + 0x82, 0x1a, 0x00, 0xba, 0x2e, 0x00, 0x21, 0xb0, 0xff, 0xdf, 0xdf, 0xfe, 0x5c, 0xe9, 0xff, 0xf9, + 0xa2, 0x00, 0x30, 0xcc, 0x00, 0xdf, 0x2e, 0x01, 0x8a, 0xdc, 0x00, 0x4d, 0x04, 0xff, 0x98, 0x4e, + 0xfe, 0x3e, 0x13, 0xff, 0xc4, 0xf7, 0xff, 0xf1, 0xae, 0xff, 0x93, 0x1c, 0xff, 0xd4, 0x6c, 0x00, + 0xd7, 0x5f, 0x00, 0xb4, 0x2e, 0x00, 0xb4, 0x1c, 0x0d, 0x74, 0xcd, 0x18, 0x13, 0xba, 0x0e, 0xa2, + 0x88, 0xff, 0xb2, 0xae, 0xf8, 0xe7, 0xa9, 0xfa, 0x65, 0x37, 0x03, 0x4e, 0xaa, 0x07, 0x20, 0xc2, + 0x00, 0x03, 0x9a, 0xfc, 0x74, 0xc5, 0xfe, 0x0f, 0x72, 0xff, 0x89, 0x6b, 0xfe, 0x8b, 0x35, 0xff, + 0x1b, 0x44, 0x00, 0x90, 0xfd, 0xff, 0x83, 0x8e, 0xff, 0xbb, 0xb7, 0xfe, 0xd7, 0xcc, 0xff, 0xd2, + 0x83, 0x00, 0xf0, 0x71, 0x00, 0x2e, 0xcc, 0x00, 0x20, 0xe7, 0x00, 0xc8, 0x5b, 0xff, 0xe7, 0x2a, + 0xfe, 0x27, 0xf3, 0xfe, 0x3d, 0xfb, 0xff, 0xd0, 0xb8, 0xff, 0xae, 0x0c, 0xff, 0xb7, 0x4b, 0x00, + 0x87, 0x12, 0x00, 0x98, 0x74, 0xff, 0xcd, 0xdd, 0x0d, 0x92, 0x44, 0x1b, 0x14, 0xd2, 0x0f, 0x24, + 0x4f, 0xfe, 0x76, 0x85, 0xf7, 0x43, 0x13, 0xfa, 0x7c, 0x74, 0x03, 0x02, 0xd0, 0x08, 0x36, 0x72, + 0x00, 0x13, 0x87, 0xfb, 0xbd, 0xb1, 0xfe, 0xd5, 0x8b, 0xff, 0xbb, 0x6a, 0xfe, 0xf9, 0x00, 0xff, + 0x0a, 0x74, 0x00, 0x74, 0xe2, 0xff, 0x1f, 0x38, 0xff, 0x7c, 0xd4, 0xfe, 0x6b, 0x89, 0xff, 0xee, + 0x55, 0x00, 0xd5, 0x55, 0x00, 0x2d, 0x34, 0x00, 0x8f, 0xe1, 0x00, 0x0f, 0xad, 0xff, 0xc4, 0x46, + 0xfe, 0x8a, 0xbb, 0xfe, 0x17, 0x9b, 0xff, 0xa3, 0xc7, 0xff, 0xe7, 0x88, 0xff, 0x7f, 0x0f, 0x00, + 0x59, 0xc8, 0xff, 0x40, 0x0a, 0xff, 0xfa, 0x7a, 0x0f, 0x2a, 0x95, 0x1d, 0xef, 0xf1, 0x0f, 0x57, + 0x07, 0xfd, 0x5f, 0x45, 0xf6, 0x40, 0xd3, 0xf9, 0x41, 0x46, 0x04, 0x47, 0x9f, 0x09, 0xf3, 0xd2, + 0xff, 0x3b, 0x83, 0xfa, 0x16, 0xdc, 0xfe, 0xb3, 0xbd, 0xff, 0xc8, 0x4c, 0xfe, 0x4b, 0xeb, 0xfe, + 0xdc, 0xa8, 0x00, 0xca, 0xd7, 0xff, 0xac, 0xe1, 0xfe, 0x12, 0xd8, 0xfe, 0x21, 0x8f, 0xff, 0xa0, + 0x4e, 0x00, 0xf9, 0x26, 0x00, 0x95, 0xcb, 0xff, 0x72, 0xd8, 0x00, 0xac, 0xd7, 0xff, 0x4d, 0x84, + 0xfe, 0x28, 0xc0, 0xfe, 0xd1, 0x77, 0xff, 0x9e, 0x8b, 0xff, 0xca, 0x94, 0xff, 0x35, 0x76, 0x00, + 0xfb, 0x9c, 0xff, 0x64, 0xec, 0xfe, 0x00, 0x9d, 0x10, 0x6b, 0xed, 0x1f, 0x9b, 0x9d, 0x10, 0x98, + 0x05, 0xfc, 0xa5, 0xf1, 0xf4, 0x00, 0x58, 0xf9, 0xf6, 0x0a, 0x05, 0x08, 0x4b, 0x0a, 0xdd, 0x6e, + 0xff, 0xa2, 0x82, 0xf9, 0x12, 0xdf, 0xfe, 0x68, 0x22, 0x00, 0xea, 0x20, 0xfe, 0xa4, 0xb0, 0xfe, + 0x93, 0xd9, 0x00, 0xb5, 0xfa, 0xff, 0x4c, 0x84, 0xfe, 0x99, 0xb3, 0xfe, 0xce, 0x9c, 0xff, 0x86, + 0x4e, 0x00, 0x33, 0x1e, 0x00, 0xf4, 0x4f, 0xff, 0xe7, 0x9b, 0x00, 0xbd, 0x1e, 0x00, 0x20, 0xbb, + 0xfe, 0x9a, 0xfc, 0xfe, 0x01, 0x4c, 0xff, 0x36, 0x75, 0xff, 0xae, 0x6d, 0xff, 0x3c, 0x94, 0x00, + 0x65, 0xb3, 0xff, 0x06, 0xde, 0xfe, 0x20, 0x15, 0x12, 0x1e, 0x58, 0x22, 0x32, 0x6d, 0x11, 0x5b, + 0xd6, 0xfa, 0xd7, 0x21, 0xf3, 0x44, 0x9d, 0xf8, 0x11, 0xce, 0x05, 0xbc, 0xf2, 0x0a, 0x0f, 0x9d, + 0xfe, 0x45, 0x2b, 0xf8, 0xdb, 0xd1, 0xfe, 0x49, 0x8c, 0x00, 0x63, 0xd8, 0xfd, 0xae, 0x44, 0xfe, + 0x81, 0xb9, 0x00, 0x6d, 0x25, 0x00, 0xb6, 0x28, 0xfe, 0x70, 0x68, 0xfe, 0x7c, 0x5a, 0xff, 0xbe, + 0x39, 0x00, 0x62, 0x18, 0x00, 0x3e, 0xc1, 0xfe, 0xdd, 0x07, 0x00, 0xf7, 0x2a, 0x00, 0xf1, 0xf1, + 0xfe, 0x40, 0x38, 0xff, 0x99, 0x54, 0xff, 0x03, 0x21, 0xff, 0xb6, 0x53, 0xff, 0x25, 0x42, 0x00, + 0xc0, 0xda, 0xff, 0x1b, 0x9b, 0xfe, 0xd4, 0x16, 0x13, 0x8c, 0x61, 0x24, 0x31, 0x69, 0x12, 0xbf, + 0xcf, 0xfa, 0xf6, 0xe4, 0xf1, 0xd0, 0xc5, 0xf7, 0x3c, 0xba, 0x06, 0x03, 0x74, 0x0b, 0x83, 0x6a, + 0xfe, 0xfd, 0x36, 0xf7, 0xcc, 0xb4, 0xfe, 0x64, 0x57, 0x01, 0x0a, 0xcb, 0xfd, 0x15, 0x0f, 0xfe, + 0xb3, 0xcb, 0x00, 0x53, 0x50, 0x00, 0x71, 0x14, 0xfe, 0xcb, 0x84, 0xfe, 0xf7, 0x41, 0xff, 0x8d, + 0x30, 0x00, 0xf9, 0x41, 0x00, 0x23, 0xa3, 0xfe, 0x6a, 0x96, 0xff, 0xc7, 0x3a, 0x00, 0x69, 0x67, + 0xff, 0xcd, 0x5e, 0xff, 0x40, 0xdc, 0xff, 0xb8, 0x03, 0xff, 0x8c, 0x82, 0xff, 0x34, 0x22, 0x00, + 0x70, 0xd1, 0xff, 0x6e, 0xde, 0xfe, 0xc5, 0x2e, 0x15, 0x18, 0x44, 0x26, 0x5f, 0x4e, 0x12, 0xa4, + 0x30, 0xfb, 0x50, 0x8b, 0xf0, 0xfb, 0xa8, 0xf6, 0x26, 0x04, 0x08, 0xb1, 0x92, 0x0b, 0xae, 0x98, + 0xfd, 0xde, 0x60, 0xf6, 0x55, 0x6b, 0xfe, 0x32, 0x09, 0x02, 0x1c, 0xcd, 0xfd, 0x84, 0x8d, 0xfd, + 0x0b, 0xf2, 0x00, 0x47, 0x52, 0x00, 0xad, 0xc8, 0xfd, 0x32, 0x93, 0xfe, 0x6d, 0x2c, 0xff, 0x94, + 0x1e, 0x00, 0xc5, 0x2a, 0x00, 0x94, 0xb8, 0xfe, 0x4e, 0xdc, 0xfe, 0x30, 0xdc, 0xff, 0x85, 0x21, + 0x00, 0xda, 0x65, 0xff, 0x2f, 0x3b, 0x00, 0x16, 0x30, 0xff, 0x76, 0x6b, 0xff, 0x9c, 0x4c, 0x00, + 0x25, 0x8f, 0xff, 0x16, 0xe0, 0xfe, 0x8a, 0x88, 0x17, 0x45, 0xfb, 0x27, 0xaa, 0x0c, 0x11, 0x44, + 0x26, 0xfb, 0xe2, 0x2c, 0xf0, 0x13, 0x3a, 0xf6, 0x1a, 0x06, 0x09, 0x4f, 0xf4, 0x0a, 0xcd, 0xc1, + 0xfc, 0x89, 0x45, 0xf6, 0x56, 0xf8, 0xfd, 0xc7, 0x63, 0x02, 0x39, 0x06, 0xfe, 0x6b, 0x0c, 0xfd, + 0xfc, 0xf2, 0x00, 0x3d, 0x68, 0x00, 0x5e, 0x81, 0xfd, 0x3a, 0xa0, 0xfe, 0x4b, 0x20, 0xff, 0xc1, + 0x0c, 0x00, 0x67, 0xf5, 0xff, 0xde, 0xee, 0xfe, 0x99, 0x94, 0xfe, 0x2d, 0xf5, 0xfe, 0xb4, 0xbd, + 0x00, 0x37, 0xc0, 0xff, 0x83, 0x33, 0x00, 0x39, 0xb0, 0xff, 0xe7, 0x39, 0xff, 0xb5, 0x5d, 0x00, + 0x41, 0xb7, 0xff, 0x35, 0x93, 0xfe, 0x37, 0x01, 0x1c, 0xb4, 0xcd, 0x29, 0xbf, 0x0e, 0x0d, 0x0e, + 0xdb, 0xfa, 0xbd, 0xed, 0xf0, 0xcf, 0x86, 0xf6, 0x56, 0xb6, 0x09, 0xb1, 0xaa, 0x09, 0x99, 0x60, + 0xfb, 0xf6, 0xd3, 0xf6, 0xa9, 0x88, 0xfd, 0xd3, 0x3d, 0x02, 0x5f, 0x9e, 0xfe, 0xf8, 0x74, 0xfc, + 0xf5, 0xbb, 0x00, 0xe7, 0x5c, 0x00, 0x48, 0x6e, 0xfd, 0xeb, 0x93, 0xfe, 0x2a, 0x37, 0xff, 0x8a, + 0xfb, 0xff, 0x4d, 0x8c, 0xff, 0xf9, 0x08, 0xff, 0xe0, 0xae, 0xfe, 0xb8, 0x03, 0xfe, 0xb5, 0xca, + 0x00, 0x76, 0x98, 0x00, 0xe3, 0xd6, 0xff, 0xf3, 0x5f, 0x00, 0x57, 0x72, 0xff, 0x35, 0xe2, 0xff, + 0x61, 0x32, 0x00, 0xed, 0x4b, 0xfe, 0x3b, 0xa8, 0x1f, 0xff, 0x17, 0x2a, 0xe5, 0xd3, 0x09, 0x00, + 0xe2, 0xfc, 0x45, 0xd7, 0xf1, 0x0a, 0xfa, 0xf4, 0x15, 0x37, 0x0a, 0x64, 0xc3, 0x09, 0xea, 0x0f, + 0xfa, 0x5d, 0xd1, 0xf6, 0xee, 0x7e, 0xfd, 0x88, 0x2e, 0x02, 0xb0, 0xe6, 0xfe, 0x0f, 0x11, 0xfc, + 0xec, 0x8c, 0x00, 0x85, 0x38, 0x00, 0xfd, 0x62, 0xfd, 0xd3, 0xaa, 0xfe, 0xb9, 0x8a, 0xff, 0x50, + 0xbd, 0xff, 0x17, 0x46, 0xff, 0x96, 0x0a, 0xff, 0x79, 0xe6, 0xfe, 0x21, 0x9d, 0xfd, 0xd3, 0x2f, + 0x00, 0xd7, 0x96, 0x01, 0xca, 0xa9, 0xff, 0xf3, 0xa0, 0x00, 0xa5, 0x08, 0x00, 0x0b, 0x75, 0xff, + 0xaf, 0x70, 0x00, 0x01, 0x52, 0xfe, 0x91, 0x33, 0x23, 0xcb, 0xd8, 0x29, 0x1b, 0x87, 0x06, 0x9c, + 0xab, 0xff, 0xd9, 0xc6, 0xf2, 0xa7, 0x29, 0xf3, 0xd4, 0x9e, 0x0a, 0x20, 0xfe, 0x09, 0x67, 0x9b, + 0xf8, 0xd6, 0xae, 0xf6, 0x8a, 0xe3, 0xfd, 0x39, 0xd8, 0x01, 0x8b, 0xe7, 0xfe, 0x7f, 0xe0, 0xfb, + 0x7a, 0x67, 0x00, 0x60, 0xdb, 0xff, 0x83, 0x33, 0xfd, 0x82, 0xf1, 0xfe, 0x06, 0x15, 0x00, 0xed, + 0x45, 0xff, 0x35, 0xfe, 0xfe, 0xad, 0x31, 0xff, 0x3b, 0xcf, 0xfe, 0xf4, 0x8c, 0xfd, 0x61, 0x75, + 0xff, 0x10, 0x34, 0x02, 0x59, 0xf1, 0xff, 0xdf, 0x7a, 0x00, 0xbb, 0xa4, 0x00, 0x0e, 0x5b, 0xff, + 0x06, 0x3c, 0x00, 0xb9, 0x83, 0xfe, 0xa1, 0x4c, 0x28, 0x2a, 0x21, 0x2b, 0xcb, 0x34, 0x00, 0x9e, + 0x1f, 0x00, 0xed, 0x99, 0xf5, 0xca, 0xaa, 0xf3, 0xea, 0xb2, 0x09, 0x7d, 0x07, 0x09, 0x84, 0xa2, + 0xf7, 0xb8, 0xa6, 0xf6, 0x50, 0x78, 0xfe, 0xb6, 0x31, 0x01, 0x85, 0x19, 0xff, 0x6e, 0x85, 0xfb, + 0xb6, 0x13, 0x00, 0xf6, 0x7d, 0xff, 0x84, 0x2c, 0xfd, 0x12, 0x11, 0xff, 0x59, 0xaf, 0x00, 0x0a, + 0x39, 0xff, 0x08, 0x78, 0xfe, 0x21, 0x47, 0xff, 0xe0, 0x6e, 0xfe, 0xf6, 0xfa, 0xfd, 0x80, 0xef, + 0xfe, 0xb1, 0x01, 0x02, 0x37, 0xbc, 0x00, 0x26, 0x7c, 0x00, 0x50, 0xc4, 0x00, 0x83, 0xa6, 0xff, + 0x13, 0xc5, 0xff, 0x89, 0x92, 0xfe, 0x94, 0xb6, 0x2d, 0xbc, 0x9c, 0x2b, 0xa2, 0x67, 0xfa, 0xd6, + 0xec, 0xff, 0x8d, 0xe8, 0xf7, 0x82, 0x7b, 0xf5, 0xcf, 0x8d, 0x08, 0xf5, 0xda, 0x07, 0xe2, 0x34, + 0xf7, 0x54, 0x75, 0xf6, 0x95, 0x0e, 0xff, 0x83, 0xd1, 0x00, 0xfe, 0x32, 0xff, 0x28, 0x18, 0xfb, + 0x62, 0x0a, 0x00, 0x91, 0x00, 0xff, 0xda, 0x59, 0xfd, 0xd5, 0x5b, 0xff, 0x54, 0x16, 0x01, 0x41, + 0x53, 0xff, 0x9f, 0xf8, 0xfd, 0x16, 0x83, 0xff, 0x1b, 0x0a, 0xfe, 0xd1, 0x71, 0xfe, 0x4b, 0xec, + 0xfe, 0x05, 0x8e, 0x01, 0x44, 0x3a, 0x01, 0xbf, 0xe1, 0x00, 0x39, 0x80, 0x00, 0xb3, 0xd8, 0xff, + 0xdd, 0xb9, 0xff, 0xef, 0x36, 0xfe, 0x88, 0xac, 0x32, 0x10, 0xa9, 0x2d, 0x4a, 0x08, 0xf4, 0xf4, + 0x5d, 0xfe, 0x0a, 0xa0, 0xfa, 0x46, 0x39, 0xf8, 0x21, 0xb6, 0x06, 0x53, 0x7e, 0x06, 0xe3, 0x93, + 0xf7, 0x84, 0x7e, 0xf5, 0x22, 0x9a, 0xff, 0x94, 0x67, 0x00, 0xb5, 0x5c, 0xff, 0x8d, 0x7c, 0xfa, + 0x4b, 0xe4, 0xff, 0x2a, 0x94, 0xfe, 0x2e, 0xa3, 0xfd, 0x99, 0xb7, 0xff, 0x9d, 0x44, 0x01, 0x2d, + 0xad, 0xff, 0x34, 0x2a, 0xfd, 0x10, 0xd7, 0xff, 0x3e, 0xb8, 0xfd, 0xba, 0xc6, 0xfe, 0x09, 0x43, + 0xff, 0xcd, 0x14, 0x01, 0x06, 0x07, 0x01, 0x6f, 0x8e, 0x01, 0x4b, 0x2d, 0x00, 0x96, 0x78, 0xff, + 0xea, 0x21, 0x00, 0x19, 0xc3, 0xfd, 0xda, 0xec, 0x36, 0x67, 0x36, 0x2f, 0x3c, 0x54, 0xef, 0x40, + 0x4e, 0xfc, 0x3b, 0x37, 0xfc, 0x7d, 0x15, 0xfb, 0xca, 0x2f, 0x05, 0xaf, 0x7b, 0x05, 0xeb, 0x19, + 0xf8, 0x5a, 0x6d, 0xf4, 0x6f, 0xe4, 0xff, 0x35, 0x0d, 0x00, 0x41, 0x75, 0xff, 0xb5, 0x23, 0xfa, + 0xd5, 0xbb, 0xff, 0xa5, 0x58, 0xfe, 0x41, 0x07, 0xfe, 0x80, 0xef, 0xff, 0x89, 0x3b, 0x01, 0xc5, + 0x08, 0x00, 0x09, 0x84, 0xfc, 0x2e, 0x22, 0x00, 0xe8, 0x96, 0xfd, 0x84, 0xdf, 0xfe, 0x18, 0xf1, + 0xff, 0xa9, 0xd7, 0x00, 0x0f, 0x24, 0x00, 0x81, 0x0d, 0x02, 0x3d, 0x1b, 0x00, 0x79, 0xd5, 0xfe, + 0x1d, 0x87, 0x00, 0xd3, 0xde, 0xfd, 0x9f, 0xaa, 0x3b, 0x8c, 0xd9, 0x30, 0x2d, 0x1f, 0xeb, 0x18, + 0x48, 0xf9, 0xea, 0x02, 0xfd, 0x16, 0x5f, 0xfe, 0x7c, 0xee, 0x03, 0x68, 0xcd, 0x04, 0x3c, 0x84, + 0xf8, 0x27, 0x30, 0xf3, 0x54, 0xe8, 0xff, 0x12, 0x7b, 0xff, 0xe9, 0xbf, 0xff, 0xe7, 0x02, 0xfa, + 0xd8, 0xb8, 0xff, 0x45, 0x44, 0xfe, 0xf6, 0x7f, 0xfe, 0xad, 0xfd, 0xff, 0xbd, 0x14, 0x01, 0x71, + 0x77, 0x00, 0x73, 0x07, 0xfc, 0xda, 0x7d, 0x00, 0x68, 0x52, 0xfd, 0x3b, 0x45, 0xff, 0x29, 0xbd, + 0x00, 0x48, 0x5d, 0x00, 0xe7, 0x16, 0xff, 0xe8, 0xe5, 0x01, 0xdb, 0x51, 0x00, 0x0b, 0x66, 0xfe, + 0x4f, 0xb4, 0x00, 0x52, 0x90, 0xfe, 0x8a, 0xfd, 0x3e, 0x46, 0xac, 0x32, 0x66, 0x60, 0xe8, 0x4b, + 0x95, 0xf6, 0x54, 0xa7, 0xfc, 0x4f, 0x7c, 0x00, 0x95, 0xc5, 0x03, 0xf8, 0x81, 0x04, 0x54, 0xa5, + 0xf8, 0x4a, 0x31, 0xf2, 0xbe, 0x7c, 0xff, 0x37, 0xde, 0xfe, 0x7d, 0x54, 0x00, 0xcc, 0x33, 0xfa, + 0xf0, 0xbf, 0xff, 0x04, 0x76, 0xfe, 0x1d, 0x98, 0xfe, 0x56, 0xd5, 0xff, 0xf8, 0xea, 0x00, 0xdb, + 0xf9, 0x00, 0x73, 0xde, 0xfb, 0x3f, 0x82, 0x00, 0x3c, 0x5e, 0xfd, 0xbd, 0xc3, 0xff, 0x3d, 0xb6, + 0x00, 0xae, 0x10, 0x00, 0xe0, 0x51, 0xfe, 0x5b, 0x25, 0x01, 0xff, 0xcb, 0x00, 0x37, 0x87, 0xfe, + 0x2b, 0x9e, 0x00, 0x28, 0x17, 0xff, 0xd3, 0xc8, 0x41, 0x00, 0x6b, 0x34, 0x47, 0xc4, 0xe6, 0x0c, + 0x72, 0xf4, 0xd0, 0xf3, 0xfa, 0xd4, 0x06, 0x02, 0x7c, 0x76, 0x04, 0xb5, 0x4b, 0x04, 0x05, 0xaf, + 0xf8, 0xd2, 0x57, 0xf1, 0x1d, 0xa5, 0xfe, 0x6f, 0x4a, 0xfe, 0x7e, 0x8b, 0x01, 0x3e, 0x8a, 0xfa, + 0x98, 0xd6, 0xff, 0x26, 0xd7, 0xfe, 0xcc, 0x54, 0xfe, 0xcc, 0x8f, 0xff, 0x26, 0x02, 0x01, 0xe3, + 0xa0, 0x01, 0xba, 0xb5, 0xfb, 0xaa, 0xa9, 0x00, 0xac, 0x9e, 0xfd, 0x86, 0xac, 0xff, 0x49, 0x68, + 0x00, 0xf3, 0xeb, 0xff, 0x2c, 0x98, 0xfd, 0x3e, 0x85, 0x00, 0xc6, 0x71, 0x01, 0x2c, 0xee, 0xfe, + 0x95, 0x75, 0x00, 0x4d, 0x7f, 0xff, 0xb5, 0xc6, 0x44, 0x1e, 0xcc, 0x35, 0xa3, 0xf8, 0xe5, 0x53, + 0xa6, 0xf2, 0x28, 0x30, 0xf7, 0x1c, 0x3f, 0x03, 0xb0, 0xf4, 0x05, 0x04, 0xfd, 0x03, 0x41, 0x83, + 0xf8, 0xf7, 0x64, 0xf0, 0xf7, 0x4c, 0xfd, 0x67, 0x0c, 0xfe, 0x25, 0x97, 0x03, 0x3a, 0xa5, 0xfa, + 0x5b, 0x2f, 0x00, 0x23, 0xec, 0xfe, 0x8f, 0xa3, 0xfd, 0x01, 0xab, 0xff, 0xa9, 0x46, 0x01, 0xa4, + 0xe7, 0x01, 0xe8, 0x36, 0xfc, 0x10, 0xd4, 0x00, 0x74, 0xc4, 0xfc, 0x8c, 0x85, 0xff, 0x24, 0x01, + 0x00, 0xbe, 0x6c, 0xff, 0xce, 0x85, 0xfd, 0x92, 0x3f, 0x00, 0x4e, 0xae, 0x01, 0x72, 0x8d, 0xff, + 0x3f, 0xb2, 0x00, 0x66, 0x7c, 0xff, 0x4c, 0x0d, 0x47, 0xe0, 0x1c, 0x36, 0xf1, 0x8a, 0xe6, 0x51, + 0x86, 0xf1, 0x52, 0xfd, 0xf2, 0x18, 0xfe, 0x03, 0x0f, 0x25, 0x07, 0x3d, 0xd0, 0x03, 0xce, 0xfc, + 0xf7, 0x65, 0xf0, 0xef, 0x46, 0x63, 0xfc, 0x7b, 0x51, 0xfe, 0xb7, 0x41, 0x05, 0xba, 0xc4, 0xfa, + 0xaa, 0x52, 0x00, 0x48, 0x5f, 0xfe, 0x52, 0xa2, 0xfd, 0xb7, 0xf9, 0xff, 0x14, 0x24, 0x01, 0x6b, + 0x8e, 0x02, 0x70, 0xa9, 0xfc, 0x66, 0xbc, 0xff, 0xc8, 0x3b, 0xfc, 0x9e, 0x6a, 0xff, 0x47, 0x64, + 0xff, 0x49, 0x90, 0xff, 0x40, 0x0e, 0xfe, 0x0b, 0xdc, 0xff, 0x4b, 0x8e, 0x01, 0x7b, 0x7f, 0x00, + 0x92, 0xae, 0x00, 0x5e, 0xd1, 0xfe, 0x1c, 0x1f, 0x48, 0x32, 0xaf, 0x36, 0x73, 0xb6, 0xe8, 0xcb, + 0x6a, 0xf0, 0x57, 0xd8, 0xed, 0x88, 0xa6, 0x03, 0x93, 0x9a, 0x08, 0x2f, 0x8b, 0x03, 0xa6, 0x3c, + 0xf7, 0xf0, 0xb9, 0xf0, 0xfd, 0x77, 0xfb, 0xf2, 0x79, 0xfe, 0xed, 0x51, 0x07, 0xa9, 0xb2, 0xfa, + 0x05, 0xa6, 0xff, 0xa8, 0x7e, 0xfe, 0xb8, 0xda, 0xfd, 0xf7, 0x34, 0x00, 0x2f, 0xb5, 0x01, 0x2f, + 0x45, 0x02, 0x13, 0x0f, 0xfc, 0x98, 0x27, 0xff, 0xdb, 0x6c, 0xfb, 0x07, 0x3b, 0xff, 0xbf, 0xaa, + 0xff, 0x7a, 0xdc, 0xff, 0xc5, 0x60, 0xfe, 0x64, 0xca, 0xff, 0xc5, 0x95, 0x01, 0x40, 0x82, 0x00, + 0xc4, 0xd8, 0x00, 0xc5, 0xf4, 0xfe, 0xdd, 0x48, 0x47, 0x33, 0x2f, 0x38, 0x6d, 0x43, 0xeb, 0xc4, + 0x3d, 0xf0, 0xe9, 0x40, 0xe9, 0xf0, 0xdb, 0x01, 0xda, 0x28, 0x0a, 0x5c, 0xcc, 0x02, 0x25, 0xe0, + 0xf7, 0xca, 0x01, 0xf2, 0x1b, 0x7b, 0xfa, 0xeb, 0xd5, 0xfe, 0x4a, 0x82, 0x08, 0xca, 0x78, 0xfa, + 0x93, 0x24, 0xff, 0x56, 0x1e, 0xff, 0x5e, 0x2f, 0xfe, 0x78, 0x2a, 0x01, 0x26, 0x68, 0x00, 0x03, + 0x89, 0x01, 0xa8, 0x62, 0xfc, 0x9e, 0x35, 0xfe, 0x9b, 0x4d, 0xfb, 0x66, 0xc7, 0xff, 0xfe, 0xc9, + 0xff, 0x84, 0xd5, 0xff, 0x1e, 0x21, 0xff, 0x21, 0xc1, 0xff, 0x3a, 0xc3, 0x00, 0x64, 0xad, 0x00, + 0xe9, 0xf0, 0x01, 0xbc, 0x55, 0xfe, 0x00, 0x71, 0x47, 0xea, 0xda, 0x36, 0xeb, 0x9a, 0xef, 0xec, + 0x73, 0xf0, 0x0a, 0xa5, 0xe3, 0x06, 0x9c, 0xff, 0xd6, 0xad, 0x0a, 0x88, 0x9c, 0x03, 0x1c, 0xe4, + 0xf8, 0x7d, 0xa6, 0xf3, 0xa5, 0xd0, 0xf9, 0xe1, 0xed, 0xfe, 0x99, 0x38, 0x09, 0xf6, 0x00, 0xfa, + 0x62, 0x3a, 0xff, 0x19, 0xe5, 0x00, 0xe3, 0x4f, 0xfe, 0x38, 0xd0, 0xff, 0x3a, 0xa8, 0xff, 0xd6, + 0xc5, 0x00, 0x90, 0xa6, 0xfc, 0xb8, 0x1d, 0xfe, 0xf2, 0xbb, 0xfb, 0xfa, 0x0c, 0x00, 0x0b, 0xd9, + 0xff, 0x3e, 0x5a, 0x00, 0x11, 0x06, 0xff, 0x43, 0x7d, 0xff, 0xe0, 0xe6, 0x00, 0x54, 0xac, 0x00, + 0x07, 0x3b, 0x02, 0x8c, 0x68, 0xfe, 0x2d, 0x82, 0x45, 0xdf, 0xfd, 0x36, 0xc7, 0x85, 0xf3, 0xb5, + 0x2f, 0xf1, 0x83, 0x68, 0xdf, 0x09, 0x19, 0xfc, 0xc9, 0xb2, 0x0b, 0xd9, 0x99, 0x05, 0xc4, 0x8f, + 0xf9, 0x09, 0x2b, 0xf5, 0x8a, 0x8e, 0xf9, 0x6d, 0x65, 0xfe, 0x2d, 0x1f, 0x09, 0x98, 0xa0, 0xfa, + 0xf9, 0x99, 0x00, 0x82, 0xdb, 0x00, 0x71, 0xfd, 0xfc, 0xc9, 0xb3, 0xff, 0xc5, 0xb3, 0xfe, 0xe6, + 0xc0, 0x00, 0x71, 0x96, 0xfd, 0x47, 0x05, 0xfe, 0x93, 0x30, 0xfc, 0x0f, 0x73, 0x00, 0x80, 0xce, + 0xff, 0xa6, 0xc8, 0xff, 0xb3, 0x87, 0xff, 0xcb, 0xeb, 0xff, 0xe6, 0x73, 0x00, 0xc3, 0x6f, 0x00, + 0x51, 0xd3, 0x02, 0xe3, 0x79, 0xfe, 0x1d, 0xba, 0x44, 0x0d, 0x0c, 0x35, 0xf6, 0xc8, 0xf6, 0x65, + 0x50, 0xf2, 0x93, 0x14, 0xdb, 0xdb, 0x2d, 0xf9, 0x51, 0x83, 0x0d, 0x75, 0x3e, 0x07, 0x8e, 0xb0, + 0xf9, 0xfc, 0x59, 0xf7, 0x50, 0xc8, 0xf8, 0x08, 0x06, 0xfd, 0xf6, 0x90, 0x0a, 0x70, 0x82, 0xfb, + 0xcd, 0xfd, 0xff, 0xec, 0x86, 0x00, 0x44, 0xdc, 0xfb, 0xd6, 0x84, 0xff, 0xf0, 0xeb, 0xfe, 0x20, + 0xac, 0x00, 0x1c, 0x2a, 0xfe, 0xaf, 0x48, 0xfe, 0x04, 0x0d, 0xfd, 0x9f, 0xcb, 0xff, 0x26, 0x37, + 0xff, 0x3c, 0x56, 0x00, 0x66, 0xef, 0xff, 0xfc, 0x76, 0xff, 0xa6, 0x75, 0x00, 0x14, 0x90, 0x00, + 0xc7, 0xc9, 0x02, 0x38, 0x75, 0xfe, 0x7c, 0xbb, 0x42, 0x62, 0xcc, 0x32, 0xd2, 0xd6, 0xf9, 0xa9, + 0x13, 0xf4, 0x73, 0xda, 0xd6, 0xf0, 0xb8, 0xf7, 0x4b, 0x92, 0x0e, 0x1d, 0xb0, 0x08, 0x91, 0x40, + 0xfb, 0x26, 0x68, 0xf8, 0x50, 0x27, 0xf7, 0x47, 0x5b, 0xfe, 0x2a, 0xdd, 0x0a, 0x29, 0x8d, 0xfa, + 0x33, 0x5d, 0x00, 0x49, 0xb3, 0xfe, 0xc9, 0xf8, 0xfb, 0xbe, 0xca, 0x00, 0x6e, 0x30, 0xfe, 0x15, + 0xe9, 0x00, 0xec, 0x6e, 0xff, 0xd0, 0x87, 0xfe, 0x20, 0x78, 0xfc, 0xc4, 0x80, 0xff, 0xe2, 0xc4, + 0xff, 0x55, 0x1b, 0x00, 0xc2, 0xe6, 0xff, 0x3b, 0x95, 0xff, 0x7b, 0xa1, 0x00, 0xc3, 0x73, 0x00, + 0xd7, 0x72, 0x02, 0xb7, 0x8f, 0xfe, 0xac, 0xe4, 0x40, 0x25, 0xbf, 0x2f, 0xd4, 0x57, 0xfc, 0x2b, + 0x92, 0xf4, 0xdb, 0x78, 0xd6, 0x24, 0x99, 0xf6, 0x81, 0x8b, 0x0e, 0xf3, 0xed, 0x0a, 0x4e, 0xdf, + 0xfa, 0x93, 0xac, 0xf9, 0xc2, 0x68, 0xf7, 0xc1, 0xbf, 0xfd, 0x9f, 0xd1, 0x0a, 0xf1, 0x2b, 0xfa, + 0xec, 0x26, 0xff, 0x6f, 0x01, 0xff, 0x82, 0xef, 0xfc, 0x87, 0x98, 0x00, 0xd5, 0x61, 0xfe, 0x50, + 0xc5, 0x01, 0xd9, 0x63, 0xff, 0x51, 0xdd, 0xfd, 0xab, 0x1e, 0xfd, 0x91, 0xb2, 0xff, 0x83, 0x2e, + 0xff, 0xb2, 0x1f, 0x00, 0x2e, 0x45, 0x00, 0xc5, 0x83, 0xff, 0x9d, 0xab, 0x00, 0xe8, 0x34, 0x00, + 0x85, 0x7a, 0x02, 0x73, 0x9d, 0xfe, 0x78, 0x03, 0x3d, 0x29, 0x73, 0x2c, 0xe8, 0x88, 0xfe, 0x05, + 0xae, 0xf6, 0xdf, 0xd6, 0xd7, 0xeb, 0x32, 0xf5, 0x00, 0x46, 0x0e, 0xe4, 0x3b, 0x0b, 0x69, 0x21, + 0xfd, 0x19, 0x87, 0xfa, 0x70, 0x44, 0xf5, 0x2d, 0x36, 0xff, 0xbf, 0x56, 0x09, 0xd0, 0x38, 0xf9, + 0xb7, 0xda, 0xff, 0x03, 0x3d, 0xff, 0xc8, 0x41, 0xfd, 0x30, 0x60, 0x01, 0xf6, 0x1d, 0xff, 0x3e, + 0xac, 0x00, 0x89, 0x83, 0xff, 0x34, 0x73, 0xfe, 0x0e, 0x85, 0xfd, 0x82, 0x1c, 0xff, 0x0a, 0xd5, + 0xfe, 0x30, 0xb1, 0x00, 0x7a, 0x66, 0x00, 0x37, 0xf4, 0xfe, 0x02, 0xd5, 0x00, 0x65, 0xd5, 0x00, + 0x24, 0xaa, 0x01, 0x2d, 0x8a, 0xfe, 0x7b, 0x49, 0x39, 0xf6, 0xe2, 0x28, 0xc2, 0xcc, 0xff, 0xa1, + 0xc5, 0xf9, 0x7d, 0x17, 0xda, 0x24, 0x44, 0xf4, 0xa5, 0xbf, 0x0c, 0xc8, 0x0e, 0x0d, 0x03, 0xaa, + 0xfd, 0x08, 0xb9, 0xf9, 0x07, 0x9a, 0xf5, 0xf2, 0xe7, 0xfe, 0xb7, 0x9c, 0x08, 0xcc, 0x2a, 0xf9, + 0x02, 0x61, 0x00, 0x60, 0x2c, 0xff, 0xa8, 0x36, 0xfe, 0xfb, 0x51, 0x02, 0x8c, 0x9f, 0xfd, 0x5b, + 0xc3, 0x00, 0x66, 0x6e, 0x00, 0x5a, 0x24, 0xfe, 0x36, 0xa7, 0xfd, 0x54, 0xdc, 0xfe, 0xcc, 0xe1, + 0xfe, 0xa4, 0x2a, 0x01, 0x2e, 0xb7, 0xff, 0x6e, 0xc5, 0xfe, 0x43, 0xe2, 0x01, 0x08, 0x75, 0x00, + 0x6d, 0xe1, 0x00, 0x20, 0x05, 0xff, 0x7a, 0xa4, 0x34, 0x3b, 0xd9, 0x23, 0x74, 0x93, 0x01, 0xe8, + 0x9d, 0xfe, 0x24, 0xfd, 0xdb, 0x55, 0xf2, 0xf3, 0x94, 0x51, 0x0d, 0x79, 0x60, 0x0b, 0xd3, 0xfa, + 0xfd, 0xd6, 0xa3, 0xfa, 0x9f, 0x4e, 0xf4, 0x50, 0x71, 0x00, 0x10, 0x8d, 0x07, 0xe8, 0xc6, 0xf8, + 0xcc, 0x49, 0x01, 0x56, 0xd4, 0xff, 0x4d, 0x1f, 0xff, 0x53, 0x3c, 0x01, 0xde, 0x77, 0xfd, 0x94, + 0x9a, 0x01, 0xd6, 0x64, 0x00, 0xc1, 0xa1, 0xfd, 0x60, 0x4c, 0xfe, 0xb6, 0xda, 0xfe, 0x8e, 0xe0, + 0xfe, 0xa1, 0xff, 0x00, 0xdc, 0x69, 0xff, 0x28, 0x42, 0xff, 0xbb, 0x25, 0x02, 0xa0, 0x16, 0x00, + 0x96, 0x72, 0x00, 0xa7, 0x56, 0xff, 0x76, 0x05, 0x2f, 0x77, 0xbf, 0x20, 0x05, 0x14, 0x04, 0x6d, + 0x8d, 0x00, 0x9e, 0x17, 0xdf, 0x24, 0x30, 0xf6, 0xcb, 0xa5, 0x0a, 0xbf, 0x9b, 0x09, 0x5d, 0x35, + 0xff, 0x79, 0xed, 0xf9, 0x11, 0x9c, 0xf5, 0xb7, 0xd9, 0x00, 0xd9, 0xfb, 0x05, 0xdd, 0x57, 0xf9, + 0x93, 0x56, 0x02, 0xb9, 0x1e, 0x00, 0x38, 0x4b, 0xfe, 0xd9, 0x56, 0x01, 0x32, 0xfc, 0xfd, 0xd3, + 0x87, 0x01, 0x12, 0x07, 0x00, 0x94, 0xbe, 0xfd, 0x28, 0x0a, 0xff, 0x29, 0x92, 0xfe, 0x99, 0x99, + 0xfe, 0xf4, 0x4a, 0x01, 0x3c, 0x4a, 0xff, 0xbb, 0x1f, 0xff, 0x15, 0x8a, 0x02, 0x07, 0xaf, 0xff, + 0xa1, 0x4d, 0x00, 0x10, 0x8a, 0xff, 0x1c, 0x96, 0x2c, 0xd5, 0xaf, 0x1f, 0x76, 0x3c, 0x01, 0xa0, + 0x74, 0xfb, 0x0e, 0xd8, 0xe1, 0xb5, 0x7e, 0xff, 0xea, 0x6d, 0x0d, 0x26, 0x11, 0x04, 0x96, 0x05, + 0xfc, 0xad, 0x2f, 0xfc, 0x27, 0xfe, 0xf8, 0xa9, 0x06, 0xff, 0xbb, 0xd2, 0x05, 0x7c, 0xac, 0xf9, + 0x16, 0xa8, 0x01, 0x21, 0x59, 0x00, 0x41, 0x4a, 0xfe, 0x63, 0xd3, 0x00, 0xee, 0xe5, 0xfe, 0x5e, + 0x3e, 0x01, 0x54, 0x8a, 0xff, 0x26, 0x64, 0xfe, 0xba, 0x4c, 0xfe, 0x41, 0x70, 0xff, 0xcc, 0x56, + 0xff, 0x0e, 0xf9, 0xff, 0x1b, 0xef, 0xff, 0xf3, 0xca, 0xff, 0xf8, 0x6a, 0xff, 0xc1, 0x6c, 0xff, + 0xfe, 0x33, 0x02, 0x39, 0x9b, 0xff, 0x53, 0x2f, 0x24, 0xe9, 0xde, 0x1f, 0xad, 0x97, 0x08, 0x15, + 0xa9, 0xfd, 0x89, 0x69, 0xe2, 0x97, 0xa9, 0xf8, 0x05, 0xdd, 0x08, 0x88, 0xf0, 0x06, 0xa1, 0xd0, + 0x01, 0x17, 0x3e, 0xfd, 0xf3, 0x58, 0xf8, 0x52, 0x1b, 0xfd, 0x74, 0x39, 0x03, 0x31, 0xed, 0xfb, + 0x52, 0x0e, 0x03, 0x95, 0x85, 0x00, 0x6b, 0xd3, 0xfd, 0xbe, 0xab, 0x01, 0xa3, 0x12, 0xff, 0x69, + 0x51, 0x00, 0x5a, 0xb9, 0x00, 0x39, 0x1a, 0xff, 0x6b, 0xa0, 0xfe, 0x2a, 0x66, 0x00, 0x9d, 0xb2, + 0xfd, 0x95, 0xd4, 0xfe, 0xe8, 0xfd, 0xff, 0xa8, 0x27, 0xff, 0xe7, 0xdb, 0x00, 0x8c, 0xd2, 0x00, + 0xcf, 0x14, 0x02, 0xa3, 0xdf, 0xff, 0x41, 0xb9, 0x1d, 0x00, 0xfd, 0x1c, 0xff, 0x7a, 0x0a, 0x82, + 0xc3, 0xff, 0x45, 0xa2, 0xe8, 0x8d, 0x2f, 0xf8, 0xbb, 0x5c, 0x06, 0xe4, 0x0a, 0x06, 0x04, 0x92, + 0x01, 0xa9, 0x1f, 0xfe, 0xde, 0x3b, 0xfa, 0x79, 0x0c, 0xfd, 0x77, 0x2e, 0x02, 0xb3, 0x60, 0xfd, + 0x65, 0x79, 0x02, 0x76, 0x63, 0x00, 0x44, 0x29, 0xfe, 0x83, 0x89, 0x01, 0x63, 0x62, 0xff, 0xdc, + 0x21, 0x00, 0x3e, 0xfe, 0x00, 0x6c, 0x6e, 0xff, 0x44, 0x31, 0xff, 0xfd, 0x6d, 0x00, 0x79, 0xe7, + 0xfd, 0x40, 0x09, 0xff, 0x3f, 0x47, 0x00, 0x42, 0x57, 0xff, 0x51, 0x8f, 0x00, 0xaf, 0x03, 0x01, + 0x68, 0xae, 0x01, 0x5d, 0xf2, 0xff, 0x90, 0x81, 0x18, 0xe4, 0x64, 0x1a, 0x40, 0x45, 0x0b, 0xbe, + 0xbb, 0x01, 0xb3, 0x9c, 0xed, 0x69, 0x15, 0xf8, 0xd8, 0xaa, 0x04, 0x1b, 0xc4, 0x04, 0xea, 0x86, + 0x01, 0xda, 0x32, 0xff, 0x5a, 0x9e, 0xfb, 0x07, 0x14, 0xfd, 0x80, 0xb5, 0x01, 0x66, 0x45, 0xfe, + 0x92, 0xd1, 0x01, 0xf0, 0x6d, 0x00, 0x32, 0x90, 0xfe, 0x32, 0x65, 0x01, 0xd5, 0xa9, 0xff, 0xbb, + 0x24, 0x00, 0x23, 0x23, 0x01, 0x5a, 0xf9, 0xff, 0xdd, 0x68, 0xff, 0xa1, 0x8e, 0x00, 0x13, 0xc3, + 0xfe, 0x48, 0x26, 0xff, 0xc6, 0x22, 0x00, 0xcd, 0x28, 0xff, 0xb8, 0x49, 0x00, 0xa7, 0xe4, 0x00, + 0xee, 0x4f, 0x01, 0xf0, 0x1c, 0x00, 0x17, 0x9f, 0x14, 0xa6, 0xe4, 0x17, 0xed, 0x96, 0x0b, 0xcc, + 0xd6, 0x02, 0x86, 0x3f, 0xf1, 0x94, 0xa2, 0xf8, 0x73, 0x6a, 0x03, 0x36, 0x9b, 0x03, 0x8e, 0xab, + 0x01, 0x10, 0xf4, 0xff, 0x1e, 0xa5, 0xfc, 0x2b, 0x5a, 0xfd, 0x05, 0x4b, 0x01, 0xde, 0xcb, 0xfe, + 0x32, 0x48, 0x01, 0x6e, 0x92, 0x00, 0x3f, 0xe5, 0xfe, 0x26, 0x34, 0x01, 0xfc, 0xfb, 0xff, 0xb7, + 0x3d, 0x00, 0xfb, 0x39, 0x01, 0x84, 0x84, 0x00, 0x6c, 0xfa, 0xff, 0x55, 0xb4, 0x00, 0x92, 0x00, + 0xff, 0xd5, 0xd5, 0xfe, 0x72, 0xc3, 0xff, 0xde, 0x0c, 0xff, 0x1d, 0xb3, 0xff, 0x00, 0xb9, 0x00, + 0xb9, 0x72, 0x01, 0x5a, 0x13, 0x00, 0x65, 0xe1, 0x11, 0x43, 0x1a, 0x16, 0x72, 0x3e, 0x0b, 0x74, + 0x34, 0x03, 0xb5, 0x32, 0xf4, 0x13, 0xaa, 0xf9, 0x35, 0x88, 0x02, 0x70, 0xf6, 0x02, 0x5e, 0xeb, + 0x01, 0x66, 0x5f, 0x00, 0x07, 0xa2, 0xfd, 0x03, 0xd5, 0xfd, 0x70, 0x22, 0x01, 0xb2, 0x19, 0xff, + 0x86, 0x23, 0x01, 0xbd, 0xd4, 0x00, 0xf3, 0x41, 0xff, 0x60, 0x38, 0x01, 0xb6, 0x44, 0x00, 0x59, + 0xe3, 0x00, 0x47, 0xc7, 0x01, 0x24, 0xdf, 0x00, 0xb8, 0x09, 0x00, 0x01, 0x73, 0x00, 0x6d, 0x0d, + 0xff, 0x4b, 0xa5, 0xfe, 0xe1, 0x73, 0xff, 0xc5, 0xf7, 0xfe, 0xcb, 0x96, 0xff, 0x70, 0xd9, 0x00, + 0x98, 0x8b, 0x01, 0x0e, 0x16, 0x00, 0xf2, 0xdd, 0x0f, 0x45, 0x51, 0x14, 0x67, 0xee, 0x0a, 0xc9, + 0x19, 0x03, 0x6b, 0x06, 0xf6, 0x64, 0x93, 0xfa, 0x95, 0xf8, 0x01, 0x2a, 0x6f, 0x02, 0x99, 0xf3, + 0x01, 0xbb, 0xb0, 0x00, 0xec, 0x59, 0xfe, 0xbf, 0x38, 0xfe, 0x13, 0xc1, 0x00, 0x62, 0x4f, 0xff, + 0xd5, 0x2a, 0x01, 0x02, 0xc9, 0x00, 0xd4, 0x74, 0xff, 0x0c, 0x7e, 0x01, 0xb1, 0xe9, 0x00, 0xa4, + 0x10, 0x01, 0xaf, 0x70, 0x01, 0xc9, 0x73, 0x00, 0x10, 0xb8, 0xff, 0x35, 0x2f, 0x00, 0x36, 0xd4, + 0xfe, 0xbc, 0x6b, 0xfe, 0xec, 0x54, 0xff, 0xdc, 0xda, 0xfe, 0xd9, 0x46, 0xff, 0x0e, 0xe2, 0x00, + 0x8f, 0x55, 0x01, 0x33, 0xcc, 0xff, 0x12, 0x7d, 0x0e, 0xfc, 0x3e, 0x13, 0x87, 0x37, 0x0a, 0x4a, + 0xb4, 0x02, 0x82, 0xc2, 0xf7, 0x60, 0x80, 0xfb, 0x4b, 0xc5, 0x01, 0xe0, 0x50, 0x02, 0x76, 0x2d, + 0x02, 0x72, 0xfb, 0x00, 0xbf, 0x08, 0xff, 0xcf, 0xb5, 0xfe, 0xd4, 0xa6, 0x00, 0xcb, 0xa6, 0xff, + 0x85, 0x40, 0x01, 0x54, 0x42, 0x01, 0x01, 0x0e, 0x00, 0x85, 0x80, 0x01, 0x00, 0xe6, 0x00, 0xfa, + 0xc2, 0x00, 0x4e, 0xfa, 0x00, 0xed, 0x50, 0x00, 0x8e, 0x99, 0xff, 0x60, 0x08, 0x00, 0x6e, 0x25, + 0xff, 0x1a, 0x6c, 0xfe, 0xd4, 0x0d, 0xff, 0x35, 0xe7, 0xfe, 0xd6, 0x65, 0xff, 0xb2, 0xb7, 0x00, + 0x98, 0x99, 0x01, 0x45, 0x5e, 0x00, 0x9b, 0x93, 0x0d, 0x5d, 0x81, 0x12, 0xfd, 0x68, 0x09, 0x74, + 0x22, 0x02, 0x88, 0x33, 0xf9, 0x48, 0x4e, 0xfc, 0xc0, 0xe4, 0x01, 0x41, 0x84, 0x02, 0xe2, 0x5d, + 0x02, 0x65, 0x3b, 0x01, 0xc0, 0x8c, 0xff, 0xae, 0x39, 0xff, 0xd5, 0x9f, 0x00, 0x77, 0x38, 0x00, + 0x73, 0xac, 0x01, 0x17, 0x30, 0x01, 0xe1, 0xdf, 0xff, 0x08, 0xe9, 0x00, 0x76, 0xd2, 0x00, 0x10, + 0xa4, 0x00, 0x53, 0x87, 0x00, 0xeb, 0x5a, 0x00, 0x68, 0xcc, 0xff, 0x5a, 0xfa, 0xff, 0x22, 0x24, + 0xff, 0x8b, 0x7b, 0xfe, 0xae, 0x10, 0xff, 0x95, 0xbd, 0xfe, 0xc1, 0xe0, 0xff, 0xce, 0x4f, 0x01, + 0xc4, 0xf6, 0x00, 0xef, 0x0a, 0x00, 0x6d, 0xdf, 0x0c, 0x91, 0x22, 0x12, 0xc4, 0xa1, 0x08, 0x6e, + 0x68, 0x01, 0x26, 0x6f, 0xfa, 0xab, 0x12, 0xfd, 0xbf, 0x39, 0x02, 0xe3, 0xe6, 0x02, 0x1d, 0x58, + 0x02, 0xa6, 0x88, 0x01, 0x5b, 0xcc, 0xff, 0xd0, 0xad, 0xff, 0x0f, 0x11, 0x01, 0x3d, 0x11, 0x00, + 0xd6, 0x33, 0x01, 0xf4, 0xda, 0x00, 0xf2, 0x98, 0xff, 0x56, 0x57, 0x00, 0x2e, 0xbd, 0x00, 0xa7, + 0xb5, 0x00, 0x0b, 0x4f, 0x00, 0xeb, 0x68, 0x00, 0x0b, 0xd6, 0xff, 0xaf, 0xb0, 0xff, 0x03, 0x7a, + 0xff, 0x86, 0xa7, 0xfe, 0x46, 0x91, 0xfe, 0xdb, 0xc7, 0xff, 0x1e, 0x34, 0x00, 0xa3, 0x0f, 0x00, + 0x36, 0x7d, 0x00, 0x10, 0x56, 0x00, 0x97, 0x6b, 0x0c, 0x53, 0x11, 0x12, 0xb5, 0x06, 0x08, 0x73, + 0x02, 0x01, 0x9c, 0x80, 0xfb, 0x59, 0xe2, 0xfd, 0xbf, 0x9c, 0x02, 0x72, 0x74, 0x03, 0x90, 0x55, + 0x02, 0x69, 0xbc, 0x01, 0x50, 0x84, 0x00, 0xec, 0x4f, 0xff, 0xb0, 0xdd, 0x00, 0x98, 0xf5, 0xff, + 0x84, 0xc7, 0x00, 0x06, 0xd5, 0x00, 0x3e, 0x6d, 0xff, 0x52, 0x03, 0x00, 0x43, 0xa6, 0x00, 0x79, + 0x22, 0x01, 0xd8, 0x3c, 0x00, 0x11, 0x29, 0x00, 0xd2, 0x2e, 0x00, 0x04, 0x0f, 0x00, 0x7d, 0x31, + 0xff, 0x5b, 0x21, 0xff, 0x25, 0xbe, 0xff, 0x70, 0xfb, 0xfe, 0xb3, 0x8a, 0xff, 0x29, 0x2f, 0x00, + 0x63, 0x3e, 0x00, 0x9c, 0x68, 0x00, 0x09, 0x45, 0x0c, 0x8c, 0xf8, 0x11, 0x6f, 0xa8, 0x07, 0x3d, + 0xf4, 0x00, 0x83, 0x59, 0xfc, 0x4c, 0x52, 0xfe, 0xdc, 0xbb, 0x02, 0x83, 0x93, 0x03, 0x46, 0xad, + 0x02, 0x7c, 0x98, 0x01, 0x8c, 0x6a, 0x00, 0xc3, 0xe5, 0xfe, 0x81, 0x23, 0x00, 0x43, 0x3f, 0x00, + 0x50, 0x8d, 0x00, 0x56, 0xac, 0x00, 0x7f, 0x4c, 0xff, 0xf2, 0xbf, 0xff, 0xdc, 0xcb, 0x00, 0xc4, + 0xd6, 0x00, 0x3f, 0x3f, 0x00, 0xe5, 0x50, 0x00, 0xec, 0x67, 0x00, 0xd0, 0xb4, 0xff, 0x38, 0xd7, + 0xff, 0x4b, 0x39, 0x00, 0x5f, 0x86, 0xfe, 0xf4, 0x7c, 0xfe, 0xba, 0xa2, 0xff, 0x75, 0x1c, 0x00, + 0x90, 0x13, 0x00, 0x1c, 0x2c, 0x00, 0xd9, 0x04, 0x0c, 0x22, 0x1e, 0x12, 0x5b, 0xf4, 0x07, 0xa9, + 0x2b, 0x01, 0xc8, 0xf8, 0xfc, 0x93, 0x39, 0xfe, 0x1f, 0x64, 0x02, 0x68, 0x7d, 0x03, 0x60, 0x73, + 0x02, 0xc1, 0xbc, 0x01, 0x3b, 0x47, 0x00, 0xa7, 0xb3, 0xfe, 0xa8, 0xe8, 0xff, 0xb0, 0xd1, 0xff, + 0xcd, 0x9d, 0x00, 0xff, 0xa2, 0x00, 0xfb, 0x7c, 0xff, 0x1e, 0xa7, 0xff, 0xb9, 0x94, 0x00, 0xf2, + 0xc3, 0x00, 0x0b, 0x03, 0x00, 0x9c, 0xc5, 0x00, 0x80, 0x07, 0x00, 0xfe, 0x3a, 0x00, 0xd1, 0x23, + 0x01, 0x3e, 0xd6, 0xfe, 0xd0, 0x2e, 0xfe, 0xb4, 0x0e, 0xff, 0x37, 0x2a, 0xff, 0xf6, 0xe2, 0xff, + 0x3f, 0x72, 0x00, 0x63, 0xf0, 0xff, 0x31, 0x17, 0x0c, 0x28, 0xb2, 0x12, 0xda, 0x53, 0x08, 0xfc, + 0x0d, 0x01, 0x3e, 0x1c, 0xfd, 0x0b, 0x54, 0xfe, 0xb6, 0xd8, 0x01, 0x6c, 0xef, 0x02, 0xc4, 0x12, + 0x02, 0x68, 0x56, 0x01, 0xde, 0xcd, 0x00, 0xa9, 0xf5, 0xfe, 0xaa, 0x71, 0xff, 0xfe, 0xd9, 0xff, + 0xaf, 0x35, 0x00, 0xa4, 0x8e, 0x00, 0x3f, 0xee, 0xff, 0x20, 0xed, 0xff, 0x12, 0x59, 0x00, 0x0f, + 0x42, 0x00, 0xc2, 0x6e, 0x00, 0xb0, 0x40, 0x00, 0x32, 0x07, 0x00, 0x30, 0xe4, 0x01, 0x89, 0x42, + 0x00, 0x14, 0x12, 0xfe, 0x5a, 0xd5, 0xfe, 0xe3, 0xf7, 0xfe, 0xe1, 0x17, 0xff, 0x68, 0x04, 0x00, + 0x39, 0x72, 0x00, 0xa0, 0x43, 0xff, 0x4e, 0x44, 0x0c, 0x8f, 0x92, 0x13, 0xb4, 0xd8, 0x08, 0x8b, + 0x76, 0x00, 0xd3, 0xff, 0xfc, 0xb7, 0x52, 0xfe, 0xc6, 0xbd, 0x01, 0xaa, 0xe9, 0x02, 0x6c, 0x3d, + 0x01, 0x99, 0xcf, 0x00, 0xd1, 0xbb, 0x00, 0xa2, 0xf3, 0xfe, 0xe5, 0xf7, 0xff, 0x5a, 0xd5, 0xff, + 0xfa, 0x1b, 0x00, 0x8c, 0x98, 0x00, 0xe1, 0xb9, 0xff, 0x93, 0x37, 0x00, 0x8c, 0x90, 0x00, 0x2f, + 0x2c, 0x00, 0x60, 0x29, 0x00, 0xd3, 0xe4, 0xff, 0x41, 0xad, 0x00, 0xc5, 0x28, 0x02, 0x96, 0x86, + 0xff, 0xf6, 0x57, 0xfe, 0xd9, 0x04, 0xff, 0x67, 0xe1, 0xfe, 0x50, 0x7a, 0xff, 0x04, 0x4a, 0x00, + 0x25, 0xf9, 0xff, 0xd5, 0xe8, 0xfe, 0x17, 0x3d, 0x0c, 0xe2, 0xb1, 0x14, 0xae, 0x87, 0x09, 0x06, + 0xd5, 0xff, 0x32, 0x99, 0xfc, 0x1f, 0xdd, 0xfd, 0x67, 0x03, 0x02, 0xed, 0x5c, 0x03, 0xc6, 0xe8, + 0x00, 0x2e, 0x45, 0x00, 0xa9, 0x06, 0x00, 0x38, 0x80, 0xfe, 0x85, 0xb4, 0xff, 0x32, 0x3d, 0x00, + 0xb9, 0xc3, 0x00, 0xfe, 0x8b, 0x00, 0x52, 0xbb, 0xff, 0x28, 0x18, 0x00, 0x16, 0x46, 0x00, 0xaa, + 0x65, 0x00, 0x91, 0x5f, 0x00, 0x6c, 0x8b, 0xff, 0x32, 0x96, 0x00, 0x4d, 0x53, 0x02, 0x19, 0x22, + 0xff, 0x86, 0x5f, 0xfe, 0x58, 0x5a, 0xff, 0x90, 0xd1, 0xfe, 0xaf, 0xdf, 0xff, 0x0c, 0x86, 0x00, + 0x57, 0x91, 0xff, 0xe8, 0xe4, 0xfe, 0x9d, 0x5a, 0x0c, 0x11, 0xb1, 0x15, 0x7f, 0x89, 0x0a, 0x9a, + 0x43, 0xff, 0x87, 0xce, 0xfb, 0x79, 0x7a, 0xfd, 0x03, 0x57, 0x02, 0x60, 0xf3, 0x03, 0xa4, 0xf3, + 0x00, 0xbc, 0x0a, 0x00, 0x90, 0xa4, 0xff, 0xac, 0x07, 0xfe, 0xad, 0xe8, 0xfe, 0xcd, 0x04, 0x00, + 0x14, 0xee, 0x00, 0xb5, 0xf3, 0x00, 0x0c, 0x44, 0x00, 0xb0, 0x1b, 0x00, 0x70, 0x2d, 0x00, 0xe2, + 0x25, 0x00, 0xa1, 0x7c, 0x00, 0x9d, 0x9e, 0xff, 0xe2, 0x6a, 0x00, 0x95, 0x52, 0x02, 0x06, 0xf7, + 0xfe, 0x7b, 0x4e, 0xfe, 0x41, 0x7c, 0xff, 0xf3, 0xe6, 0xfe, 0x81, 0x3c, 0x00, 0x47, 0xb9, 0x00, + 0xcc, 0x92, 0xff, 0xcf, 0xe2, 0xfe, 0x60, 0x87, 0x0c, 0xae, 0xfb, 0x16, 0xd4, 0x66, 0x0b, 0x06, + 0xd6, 0xfe, 0x28, 0xef, 0xfa, 0xfb, 0xcb, 0xfc, 0x41, 0xda, 0x02, 0xbe, 0x6b, 0x04, 0x2d, 0x0d, + 0x01, 0x2b, 0xd5, 0xff, 0x71, 0x73, 0xff, 0x5f, 0xf2, 0xfd, 0x61, 0x78, 0xfe, 0x71, 0x79, 0xff, + 0xc1, 0x9f, 0x00, 0xe8, 0xc2, 0x00, 0x9b, 0x29, 0x00, 0x73, 0x81, 0x00, 0x33, 0xb0, 0x00, 0x17, + 0x1b, 0x00, 0xd4, 0x46, 0x00, 0x5a, 0xe3, 0xff, 0x3f, 0xb8, 0xff, 0x3f, 0x1b, 0x02, 0x12, 0xcc, + 0xff, 0x66, 0xc6, 0xfd, 0x76, 0x15, 0xff, 0x2c, 0x2f, 0xff, 0xe1, 0x64, 0x00, 0x30, 0xc2, 0x00, + 0xbc, 0xc4, 0xff, 0x2e, 0x13, 0xff, 0x53, 0xe8, 0x0c, 0x1f, 0x64, 0x18, 0xa4, 0x92, 0x0c, 0x10, + 0xf3, 0xfd, 0xbc, 0xaa, 0xf9, 0xfe, 0xc0, 0xfc, 0xb3, 0x29, 0x03, 0xb2, 0x0a, 0x05, 0x81, 0x25, + 0x01, 0x8f, 0x12, 0xff, 0xb6, 0x9a, 0xff, 0xd6, 0x0a, 0xfe, 0x9c, 0x10, 0xfe, 0xc2, 0x65, 0xff, + 0xc0, 0x38, 0x00, 0xa8, 0x70, 0x00, 0x63, 0xb3, 0xff, 0x8b, 0x06, 0x00, 0x42, 0x04, 0x01, 0xa4, + 0x40, 0x00, 0x66, 0x67, 0x00, 0x8a, 0x84, 0x00, 0x72, 0xf6, 0xfe, 0x39, 0x66, 0x01, 0x44, 0xb8, + 0x00, 0x54, 0xb2, 0xfd, 0xca, 0x9e, 0xfe, 0xda, 0x42, 0xff, 0x3e, 0x24, 0x00, 0x7f, 0xd5, 0x00, + 0xeb, 0xf7, 0xff, 0x65, 0x06, 0xff, 0x7f, 0x6a, 0x0d, 0xcf, 0x0f, 0x1a, 0xdd, 0x03, 0x0e, 0xeb, + 0x11, 0xfd, 0x62, 0x29, 0xf8, 0x74, 0x82, 0xfc, 0x03, 0x89, 0x03, 0x05, 0xb6, 0x05, 0xcb, 0x0f, + 0x01, 0x5e, 0x57, 0xfe, 0xbb, 0xa5, 0xff, 0x40, 0x6b, 0xfe, 0x41, 0xcc, 0xfd, 0xae, 0x5c, 0xff, + 0xb2, 0x10, 0x00, 0x78, 0x1c, 0x00, 0x0f, 0x92, 0xff, 0x3b, 0x77, 0xff, 0xcf, 0xc9, 0x00, 0x55, + 0x7e, 0x00, 0x56, 0xe5, 0xff, 0x0f, 0xe3, 0x00, 0xc5, 0x9f, 0xff, 0xd7, 0x2c, 0x00, 0xc7, 0x35, + 0x01, 0x34, 0xd5, 0xfe, 0x1e, 0xd3, 0xfd, 0xde, 0xaa, 0xfe, 0x05, 0x2f, 0x00, 0x6d, 0xcc, 0x00, + 0x17, 0xd6, 0xff, 0xa0, 0x27, 0xff, 0x85, 0xa6, 0x0d, 0x8a, 0xe3, 0x1b, 0x49, 0x31, 0x10, 0xd5, + 0x12, 0xfc, 0x4f, 0x7a, 0xf6, 0xcc, 0x20, 0xfc, 0x9e, 0xc5, 0x03, 0x9f, 0xa4, 0x06, 0xa4, 0xf4, + 0x00, 0xe1, 0x68, 0xfd, 0xfd, 0x6a, 0xff, 0xfe, 0xf2, 0xfe, 0xab, 0xad, 0xfd, 0x08, 0x3e, 0xff, + 0x97, 0x35, 0x00, 0x85, 0xc1, 0xff, 0xf7, 0x5c, 0xff, 0x4c, 0x24, 0xff, 0xca, 0x72, 0x00, 0x4a, + 0xca, 0x00, 0x87, 0x91, 0xff, 0x58, 0x35, 0x00, 0x67, 0x29, 0x00, 0x24, 0xb0, 0xff, 0xc1, 0xe8, + 0x00, 0x59, 0x62, 0x00, 0x06, 0x1e, 0xfe, 0xfc, 0xf2, 0xfd, 0x5a, 0xa4, 0xff, 0xc0, 0x6e, 0x00, + 0x71, 0x05, 0x00, 0xe4, 0x30, 0xff, 0xa9, 0x05, 0x0e, 0xf4, 0xeb, 0x1d, 0xd8, 0x8f, 0x12, 0x32, + 0xf5, 0xfa, 0xcd, 0x77, 0xf4, 0x4d, 0xd3, 0xfb, 0x89, 0x2c, 0x04, 0x49, 0x9f, 0x07, 0x9a, 0xd6, + 0x00, 0xad, 0x40, 0xfc, 0x02, 0x24, 0xff, 0xaf, 0x7c, 0xff, 0xfe, 0x9f, 0xfd, 0x4e, 0x0a, 0xff, + 0x7f, 0x64, 0x00, 0x37, 0xb3, 0xff, 0x30, 0x0a, 0xff, 0xac, 0xf1, 0xfe, 0x78, 0x28, 0x00, 0xaa, + 0xb2, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x7e, 0xff, 0x69, 0xb0, 0xff, 0x15, 0xda, 0xff, 0xc4, 0xf9, + 0xff, 0xde, 0x1f, 0x01, 0x88, 0xe8, 0xff, 0xf7, 0xae, 0xfd, 0x10, 0xbb, 0xfe, 0x5f, 0x6c, 0x00, + 0x63, 0xa4, 0xff, 0x32, 0xf7, 0xfe, 0xca, 0x09, 0x10, 0x7b, 0xf5, 0x20, 0xfc, 0xaa, 0x12, 0x25, + 0xbd, 0xf8, 0x5c, 0xad, 0xf2, 0x36, 0xc4, 0xfb, 0x9b, 0x88, 0x05, 0xa5, 0x50, 0x08, 0xed, 0xd2, + 0xff, 0xb3, 0x1e, 0xfb, 0xe3, 0x03, 0xff, 0x2c, 0xca, 0xff, 0xd4, 0xa3, 0xfd, 0x79, 0xd9, 0xfe, + 0x08, 0x6c, 0x00, 0xe1, 0xaa, 0xff, 0xff, 0xa9, 0xfe, 0xcf, 0xd1, 0xfe, 0xc4, 0xff, 0xff, 0xc5, + 0x78, 0x00, 0xbb, 0x25, 0x00, 0xe2, 0x73, 0xff, 0x15, 0x04, 0xff, 0xa7, 0x7c, 0xff, 0xa5, 0xb2, + 0xff, 0x45, 0xc8, 0x00, 0xaf, 0x0e, 0x01, 0x5e, 0xcc, 0xfe, 0x90, 0x09, 0xfe, 0x51, 0xd4, 0xff, + 0xb3, 0xc5, 0xff, 0xb2, 0x8d, 0xfe, 0xa9, 0x50, 0x11, 0xa2, 0x94, 0x23, 0xfc, 0x28, 0x14, 0x76, + 0x25, 0xf7, 0xfb, 0x71, 0xf0, 0xb4, 0xcb, 0xfb, 0x43, 0x86, 0x06, 0xa7, 0xeb, 0x08, 0xd5, 0x55, + 0xff, 0x55, 0xd5, 0xf9, 0x36, 0xb5, 0xfe, 0x38, 0x8b, 0x00, 0xe8, 0x5d, 0xfd, 0x64, 0xb6, 0xfe, + 0xf0, 0x9d, 0x00, 0xa9, 0x71, 0xff, 0x4d, 0x82, 0xfe, 0x00, 0xc9, 0xfe, 0x56, 0xc6, 0xff, 0x4f, + 0x75, 0x00, 0xce, 0x0c, 0x00, 0x58, 0x79, 0xff, 0xf6, 0xfa, 0xfe, 0x6d, 0x95, 0xfe, 0xbf, 0xa7, + 0xff, 0x40, 0x96, 0x00, 0x1a, 0x38, 0x01, 0x7e, 0x4a, 0x00, 0xff, 0x60, 0xfe, 0x3d, 0xc8, 0xfe, + 0x3a, 0xce, 0xff, 0x3c, 0xa7, 0xfe, 0x7a, 0x96, 0x12, 0x63, 0xf7, 0x25, 0x94, 0xf6, 0x15, 0x67, + 0xda, 0xf5, 0xc3, 0xdf, 0xed, 0xdf, 0xd9, 0xfb, 0xdb, 0x95, 0x07, 0x09, 0x59, 0x09, 0xf8, 0xcc, + 0xfe, 0x6a, 0x8d, 0xf8, 0xc8, 0x25, 0xfe, 0x8c, 0x86, 0x01, 0xde, 0x3d, 0xfd, 0xd1, 0x22, 0xfe, + 0xd7, 0xdc, 0x00, 0x39, 0x70, 0xff, 0x2b, 0x29, 0xfe, 0xd5, 0xb4, 0xfe, 0x5c, 0xd8, 0xff, 0xa7, + 0x20, 0x00, 0x00, 0x2e, 0x00, 0x2f, 0x28, 0xff, 0xd1, 0x27, 0xff, 0x53, 0x31, 0xfe, 0x18, 0xd4, + 0xfe, 0x60, 0xdb, 0x00, 0x7c, 0x1d, 0x01, 0xc1, 0xd7, 0x00, 0xe0, 0xb5, 0xff, 0xa3, 0x58, 0xfe, + 0x60, 0xc5, 0xfe, 0x13, 0x19, 0xff, 0xeb, 0x3f, 0x15, 0xff, 0xc8, 0x28, 0xed, 0x91, 0x15, 0x36, + 0x46, 0xf4, 0xa3, 0x0d, 0xec, 0x02, 0x05, 0xfc, 0x93, 0x47, 0x09, 0xc5, 0x70, 0x09, 0x44, 0x72, + 0xfd, 0x7c, 0xa6, 0xf7, 0x36, 0xff, 0xfd, 0xa7, 0x10, 0x02, 0x6d, 0x4f, 0xfd, 0x3d, 0xae, 0xfd, + 0x75, 0xfb, 0x00, 0x4f, 0x4e, 0xff, 0xa4, 0x25, 0xfe, 0x12, 0x80, 0xfe, 0x5c, 0x05, 0x00, 0x1d, + 0x1a, 0x00, 0x48, 0xd4, 0xff, 0x16, 0x38, 0xff, 0xfb, 0xf6, 0xfe, 0x71, 0x35, 0xfe, 0xaa, 0x62, + 0xfe, 0x2f, 0x8d, 0x00, 0xf3, 0x7a, 0x01, 0x32, 0xd3, 0x00, 0xda, 0x74, 0x00, 0x31, 0x5e, 0xff, + 0xd0, 0xb5, 0xfd, 0x18, 0x94, 0xfe, 0x0b, 0x83, 0x17, 0xc3, 0x15, 0x2b, 0xd3, 0x6b, 0x15, 0x3d, + 0xd6, 0xf3, 0xc8, 0x6a, 0xea, 0x3b, 0xa4, 0xfb, 0xb2, 0xe9, 0x0a, 0x9a, 0x44, 0x09, 0x0e, 0x71, + 0xfc, 0xe7, 0xff, 0xf6, 0xc1, 0x6f, 0xfd, 0x6d, 0xa2, 0x02, 0xfc, 0x8e, 0xfd, 0xe3, 0x05, 0xfd, + 0xd9, 0x09, 0x01, 0xe0, 0x58, 0xff, 0xa1, 0xf9, 0xfd, 0x02, 0x94, 0xfe, 0xc2, 0x16, 0x00, 0xd7, + 0x24, 0x00, 0x16, 0x83, 0xff, 0xb5, 0x23, 0xff, 0x99, 0xda, 0xfe, 0x0f, 0x3f, 0xfe, 0xc2, 0x6c, + 0xfe, 0xe7, 0xe3, 0xff, 0xad, 0xaa, 0x01, 0xd0, 0x22, 0x01, 0x92, 0x5a, 0x00, 0xbe, 0x91, 0x00, + 0xfa, 0xff, 0xfd, 0x4e, 0x3c, 0xfd, 0xb2, 0xd1, 0x19, 0x6c, 0x28, 0x2d, 0xb1, 0x63, 0x14, 0x9b, + 0xdc, 0xf3, 0xab, 0xa3, 0xe9, 0x36, 0xae, 0xfa, 0x5a, 0x39, 0x0c, 0xb9, 0x03, 0x09, 0x7a, 0x57, + 0xfb, 0x42, 0x92, 0xf6, 0x76, 0xc7, 0xfc, 0xb0, 0xf3, 0x02, 0x72, 0xbf, 0xfd, 0x8d, 0x56, 0xfc, + 0x36, 0xca, 0x00, 0x0d, 0x6d, 0xff, 0x99, 0xcf, 0xfd, 0x09, 0xac, 0xfe, 0x3e, 0x1f, 0x00, 0xb0, + 0x22, 0x00, 0xd3, 0x3f, 0xff, 0x14, 0xb4, 0xfe, 0xdc, 0xe5, 0xfe, 0x58, 0x08, 0xfe, 0x87, 0xd0, + 0xfe, 0x19, 0x8b, 0xff, 0xf9, 0xf0, 0x00, 0x26, 0xb3, 0x01, 0x2d, 0x36, 0x00, 0xfe, 0xb7, 0x00, + 0xf1, 0x3f, 0xff, 0x93, 0x6b, 0xfc, 0x57, 0xfc, 0x1d, 0xe2, 0x34, 0x2f, 0xee, 0xe9, 0x10, 0x85, + 0x43, 0xf3, 0x82, 0x50, 0xea, 0x79, 0x6c, 0xfa, 0x6a, 0x2e, 0x0d, 0xea, 0x9a, 0x08, 0x4e, 0xe5, + 0xf9, 0x25, 0x49, 0xf6, 0x48, 0xd7, 0xfc, 0x46, 0xf2, 0x02, 0x69, 0xa7, 0xfd, 0xcb, 0x10, 0xfc, + 0x1b, 0x7c, 0x00, 0x59, 0x57, 0xff, 0x8e, 0xff, 0xfd, 0xf8, 0xcc, 0xfe, 0x7a, 0x4f, 0x00, 0xa0, + 0x45, 0x00, 0x0f, 0xd5, 0xfe, 0xea, 0x76, 0xfe, 0x12, 0xde, 0xfe, 0x37, 0xe5, 0xfd, 0xba, 0x30, + 0xff, 0xc3, 0x06, 0x00, 0xbc, 0xec, 0xff, 0xf5, 0xae, 0x01, 0x02, 0xa0, 0x00, 0x66, 0x43, 0x00, + 0x8e, 0x4d, 0x00, 0x78, 0xb6, 0xfc, 0x27, 0xee, 0x22, 0x3f, 0x0e, 0x31, 0x84, 0xf8, 0x0b, 0x3d, + 0xe1, 0xf2, 0x71, 0xdd, 0xeb, 0x16, 0xd2, 0xfa, 0x73, 0x56, 0x0d, 0x0c, 0x1b, 0x08, 0x50, 0xe9, + 0xf8, 0xcb, 0xca, 0xf5, 0xa1, 0x5f, 0xfd, 0xd0, 0x8f, 0x02, 0xd4, 0xb3, 0xfd, 0xb2, 0xc4, 0xfb, + 0xc5, 0x46, 0x00, 0x00, 0x3f, 0xff, 0x42, 0x4e, 0xfe, 0x2b, 0x0a, 0xff, 0x67, 0x70, 0x00, 0x9a, + 0x9d, 0x00, 0x0b, 0x37, 0xfe, 0xe1, 0x98, 0xfe, 0xa3, 0xad, 0xfe, 0xbd, 0xf3, 0xfd, 0x65, 0x7b, + 0xff, 0x32, 0xc3, 0x00, 0x6c, 0x35, 0xff, 0x9e, 0x07, 0x01, 0x2c, 0x15, 0x01, 0xff, 0xe8, 0xff, + 0x24, 0xc3, 0x00, 0x37, 0x8c, 0xfd, 0x09, 0xec, 0x27, 0xee, 0x03, 0x33, 0xb5, 0x23, 0x06, 0xb0, + 0x30, 0xf2, 0x9e, 0xe7, 0xed, 0xae, 0x7c, 0xfb, 0x92, 0xab, 0x0c, 0xe7, 0x91, 0x07, 0xb0, 0x61, + 0xf8, 0xfe, 0xeb, 0xf4, 0xb5, 0xef, 0xfd, 0x17, 0xbf, 0x01, 0x82, 0xe1, 0xfd, 0x57, 0x7a, 0xfb, + 0x39, 0xfa, 0xff, 0x23, 0x4b, 0xff, 0x9b, 0x71, 0xfe, 0x86, 0x51, 0xff, 0x40, 0x52, 0x00, 0x0d, + 0xf3, 0x00, 0x0d, 0x89, 0xfd, 0x6c, 0xef, 0xfe, 0xaa, 0x5f, 0xfe, 0xc8, 0x03, 0xfe, 0x8a, 0xce, + 0xff, 0x5f, 0x19, 0x01, 0x98, 0xd4, 0xfe, 0x28, 0xfa, 0xff, 0x6c, 0x37, 0x01, 0xb1, 0xcb, 0xff, + 0xc4, 0xcc, 0x00, 0x44, 0x6d, 0xfe, 0x6a, 0x2a, 0x2e, 0xfa, 0x30, 0x34, 0xd7, 0x76, 0xff, 0x88, + 0x49, 0xf1, 0x3a, 0x06, 0xf0, 0x4c, 0x14, 0xfd, 0x6f, 0x8b, 0x0b, 0x5c, 0x18, 0x07, 0x84, 0xcd, + 0xf7, 0x21, 0x2f, 0xf4, 0x5d, 0x68, 0xfe, 0xce, 0xd0, 0x00, 0x2a, 0x2e, 0xfe, 0xef, 0x72, 0xfb, + 0x17, 0xf4, 0xff, 0x86, 0x40, 0xff, 0x73, 0xc6, 0xfe, 0xc1, 0x5c, 0xff, 0xbe, 0x54, 0x00, 0x1d, + 0x15, 0x01, 0x83, 0x2d, 0xfd, 0x17, 0x5a, 0xff, 0xf8, 0x1c, 0xfe, 0xf8, 0x44, 0xfe, 0x00, 0x2a, + 0x00, 0xf6, 0xf9, 0x00, 0x8a, 0x79, 0xfe, 0x68, 0x49, 0xff, 0x99, 0xd6, 0x00, 0x20, 0xeb, 0xff, + 0xfa, 0x02, 0x01, 0xe9, 0x26, 0xff, 0xfe, 0xa8, 0x34, 0x3d, 0xf3, 0x34, 0x51, 0xe2, 0xf8, 0xe7, + 0x42, 0xf0, 0xdd, 0xa4, 0xf1, 0x50, 0x0a, 0xff, 0xa4, 0x71, 0x0a, 0x76, 0xbb, 0x06, 0xb3, 0x35, + 0xf7, 0x72, 0x56, 0xf3, 0x61, 0x96, 0xfe, 0x38, 0xd8, 0xff, 0x96, 0xd9, 0xfe, 0xc7, 0xd3, 0xfb, + 0x7e, 0xe8, 0xff, 0x3a, 0x48, 0xff, 0x85, 0x0d, 0xff, 0x05, 0x0d, 0xff, 0x95, 0x8a, 0x00, 0x36, + 0x34, 0x01, 0x5b, 0x1c, 0xfd, 0x32, 0xaf, 0xff, 0xa7, 0xf1, 0xfd, 0x8c, 0xad, 0xfe, 0x64, 0x22, + 0x00, 0xcd, 0x7d, 0x00, 0x9e, 0x4c, 0xfe, 0x0e, 0xd6, 0xfe, 0x1d, 0x46, 0x00, 0xf6, 0x51, 0x00, + 0x18, 0x4d, 0x01, 0x67, 0x9a, 0xff, 0xa2, 0x50, 0x3a, 0x54, 0xd6, 0x35, 0xcb, 0xf7, 0xf2, 0xa4, + 0x61, 0xef, 0x4e, 0x46, 0xf2, 0x61, 0x1a, 0x01, 0x32, 0xb0, 0x09, 0x99, 0x5b, 0x06, 0xbc, 0x9e, + 0xf6, 0x26, 0x37, 0xf2, 0x19, 0xad, 0xfe, 0x1a, 0xeb, 0xfe, 0x1a, 0x52, 0x00, 0x4f, 0x12, 0xfc, + 0xb0, 0xe2, 0xff, 0x8f, 0x73, 0xff, 0x09, 0xb5, 0xfe, 0x86, 0xe7, 0xfe, 0x57, 0xde, 0x00, 0x3a, + 0x7c, 0x01, 0xfd, 0x19, 0xfd, 0xa8, 0xfb, 0xff, 0x26, 0xc6, 0xfd, 0x71, 0xa3, 0xfe, 0xed, 0xd6, + 0xff, 0x3d, 0x24, 0x00, 0x8f, 0x2d, 0xfe, 0x26, 0x9b, 0xfe, 0x1f, 0x12, 0x00, 0x9d, 0xa7, 0x00, + 0x27, 0x18, 0x01, 0x5f, 0x52, 0x00, 0x58, 0x43, 0x3f, 0x8b, 0xca, 0x36, 0xdb, 0x19, 0xee, 0xd2, + 0x66, 0xee, 0xa3, 0x9c, 0xf1, 0x69, 0x36, 0x03, 0xa0, 0x7f, 0x09, 0x2a, 0xae, 0x05, 0xf7, 0xf1, + 0xf5, 0xe8, 0xf6, 0xf0, 0x11, 0xdf, 0xfe, 0x26, 0x77, 0xfe, 0x59, 0x3e, 0x02, 0x7f, 0xec, 0xfb, + 0xdb, 0x49, 0x00, 0x3a, 0x16, 0xff, 0x7b, 0x2b, 0xfe, 0xcf, 0x51, 0xff, 0xd7, 0x11, 0x01, 0xe2, + 0xf5, 0x01, 0xd9, 0x1d, 0xfd, 0xff, 0x2e, 0x00, 0xf5, 0xcd, 0xfc, 0xcb, 0x7a, 0xfe, 0x95, 0xcd, + 0xff, 0x88, 0xc4, 0xff, 0xea, 0x30, 0xfe, 0xbe, 0x26, 0xff, 0xdd, 0xc7, 0xff, 0x32, 0x5f, 0x00, + 0xcf, 0x53, 0x01, 0x57, 0xce, 0x00, 0x53, 0x66, 0x43, 0x3f, 0x91, 0x37, 0x7d, 0xb1, 0xea, 0x47, + 0x33, 0xed, 0x45, 0xef, 0xef, 0x3d, 0xf8, 0x04, 0xb3, 0xca, 0x09, 0xd1, 0xad, 0x04, 0x79, 0x02, + 0xf5, 0x5c, 0x5c, 0xf0, 0xdb, 0x70, 0xff, 0xec, 0x33, 0xfe, 0xf8, 0x37, 0x04, 0x60, 0xc3, 0xfb, + 0x34, 0x51, 0x00, 0x56, 0x8d, 0xfe, 0xa4, 0x35, 0xfe, 0x48, 0xed, 0xff, 0xa6, 0x0c, 0x01, 0x58, + 0x9b, 0x02, 0x04, 0xf1, 0xfc, 0x98, 0x4b, 0xff, 0x30, 0xf2, 0xfb, 0xd1, 0xcd, 0xfe, 0x5b, 0x75, + 0xff, 0x6f, 0xfe, 0xff, 0xa6, 0xba, 0xfe, 0x4a, 0x67, 0xff, 0x28, 0x3c, 0xff, 0x5b, 0x87, 0x00, + 0x2e, 0x4b, 0x01, 0xf5, 0x7e, 0x00, 0x91, 0xb1, 0x46, 0x3b, 0xaa, 0x37, 0xaa, 0xa4, 0xe8, 0xb1, + 0x66, 0xec, 0x21, 0x8e, 0xed, 0x74, 0x07, 0x06, 0x60, 0x80, 0x0a, 0x20, 0x1b, 0x03, 0x68, 0x47, + 0xf4, 0x1c, 0x73, 0xf1, 0xe3, 0x51, 0xff, 0xcd, 0x6a, 0xfe, 0x9d, 0xfc, 0x05, 0xf1, 0x2c, 0xfb, + 0xa5, 0x06, 0x00, 0x01, 0xb9, 0xfe, 0xd4, 0xb2, 0xfe, 0x54, 0x3e, 0x00, 0x9d, 0x26, 0x01, 0x42, + 0x60, 0x02, 0xaa, 0x09, 0xfc, 0x88, 0xd1, 0xfe, 0x47, 0x97, 0xfb, 0x40, 0xcb, 0xfe, 0x63, 0x18, + 0x00, 0xda, 0x76, 0x00, 0x62, 0xa5, 0xfe, 0x40, 0x9c, 0xff, 0x2c, 0x65, 0xff, 0xd8, 0xf4, 0xff, + 0x45, 0xee, 0x00, 0x2c, 0xee, 0x00, 0xc1, 0x39, 0x48, 0x45, 0xdc, 0x37, 0x9d, 0x6d, 0xe7, 0x30, + 0xc6, 0xec, 0x5f, 0x54, 0xea, 0xda, 0x71, 0x06, 0x04, 0x73, 0x0b, 0x5d, 0x2e, 0x01, 0x39, 0x14, + 0xf5, 0xe0, 0x94, 0xf2, 0x72, 0x44, 0xff, 0x31, 0xc6, 0xfe, 0xc7, 0xf4, 0x06, 0x16, 0x5c, 0xfa, + 0x81, 0xff, 0xff, 0x08, 0xd5, 0xff, 0x9e, 0xc2, 0xfe, 0x8c, 0x71, 0x00, 0xc9, 0xe0, 0xff, 0xa2, + 0xbf, 0x01, 0xa5, 0x08, 0xfc, 0x82, 0x78, 0xfe, 0xee, 0x6d, 0xfb, 0xf8, 0xbc, 0xff, 0xa0, 0xcb, + 0x00, 0x26, 0xef, 0xff, 0x6f, 0x35, 0xff, 0x51, 0xcf, 0xff, 0xd6, 0xe8, 0xfe, 0xbd, 0x89, 0xff, + 0xf4, 0x25, 0x01, 0xf2, 0xcd, 0x00, 0x9f, 0xf4, 0x49, 0x94, 0xf8, 0x35, 0x10, 0x6b, 0xe8, 0x9f, + 0xe0, 0xec, 0x81, 0xba, 0xe5, 0xe0, 0x66, 0x06, 0x2e, 0x7c, 0x0c, 0x93, 0x0d, 0x01, 0x60, 0x6c, + 0xf5, 0x22, 0x6a, 0xf4, 0x59, 0xb0, 0xfe, 0x38, 0xaf, 0xfe, 0x50, 0x93, 0x07, 0xdd, 0x04, 0xfa, + 0x82, 0xf7, 0x00, 0xe1, 0x8f, 0x00, 0xdd, 0x33, 0xfe, 0x7b, 0x16, 0xff, 0x06, 0x6b, 0xff, 0x53, + 0x79, 0x01, 0x01, 0x42, 0xfc, 0x37, 0x96, 0xfe, 0x04, 0xef, 0xfb, 0x64, 0x2a, 0x00, 0xa7, 0x9d, + 0x00, 0x26, 0x09, 0x00, 0xfb, 0x60, 0xff, 0x5d, 0xa6, 0xff, 0x54, 0xf0, 0xfe, 0x12, 0x4a, 0xff, + 0x30, 0x18, 0x01, 0x25, 0xb6, 0x00, 0x32, 0x2e, 0x49, 0xc1, 0x1e, 0x35, 0x7e, 0x16, 0xea, 0xd8, + 0x78, 0xed, 0xe5, 0x94, 0xe0, 0x5d, 0x8b, 0x05, 0x78, 0x33, 0x0f, 0x14, 0x95, 0x00, 0xd9, 0x3d, + 0xf6, 0xe6, 0x62, 0xf6, 0x58, 0x7d, 0xfd, 0x09, 0x00, 0xfe, 0x7c, 0xf0, 0x08, 0x6a, 0x4d, 0xfa, + 0x00, 0x53, 0x01, 0x48, 0x5a, 0x00, 0x0d, 0x38, 0xfc, 0x5a, 0x51, 0xff, 0x81, 0x21, 0xff, 0x02, + 0x38, 0x01, 0xcb, 0x44, 0xfd, 0xf7, 0xfc, 0xfe, 0x16, 0xd9, 0xfb, 0xc7, 0x47, 0x00, 0x5c, 0x92, + 0x00, 0xf0, 0xc3, 0xff, 0x97, 0xb7, 0xff, 0x9f, 0x84, 0xff, 0x0a, 0x04, 0xff, 0xbc, 0xef, 0xfe, + 0xbe, 0x55, 0x01, 0xcc, 0x77, 0x00, 0xca, 0x36, 0x49, 0x9c, 0x09, 0x31, 0xe9, 0xa3, 0xec, 0x2a, + 0x15, 0xee, 0x6c, 0x13, 0xdc, 0xcc, 0xc9, 0x06, 0x3a, 0x83, 0x10, 0x1b, 0x60, 0x00, 0xb1, 0x41, + 0xf7, 0x14, 0x1a, 0xf8, 0x0b, 0xaf, 0xfb, 0x02, 0xf0, 0xfe, 0x77, 0xfa, 0x09, 0x3b, 0x7b, 0xf9, + 0xb3, 0x5d, 0x01, 0xb8, 0xda, 0xfe, 0x97, 0xf9, 0xfb, 0x70, 0x03, 0x00, 0x20, 0xbf, 0xfe, 0x50, + 0x97, 0x01, 0x6c, 0x6f, 0xfe, 0x7e, 0x84, 0xfe, 0x1f, 0xec, 0xfb, 0xf6, 0x6d, 0x00, 0xf1, 0x4a, + 0x00, 0xf5, 0xc1, 0xff, 0x16, 0xc2, 0xff, 0xcb, 0x93, 0xff, 0x17, 0x0c, 0xff, 0x9d, 0xdf, 0xfe, + 0x72, 0x8b, 0x01, 0x1b, 0xfa, 0xff, 0xed, 0xcd, 0x46, 0xd6, 0xe5, 0x2d, 0x12, 0x5e, 0xef, 0x7f, + 0x47, 0xef, 0x93, 0xf3, 0xd9, 0x56, 0xd9, 0x06, 0xba, 0x43, 0x11, 0x09, 0x22, 0x01, 0x1c, 0xb8, + 0xf7, 0x4f, 0x7b, 0xf9, 0x87, 0x5d, 0xfb, 0xf6, 0x1d, 0xff, 0xff, 0xf1, 0x09, 0x16, 0xae, 0xf8, + 0x93, 0x78, 0x00, 0xe1, 0xf3, 0xfe, 0x40, 0x6e, 0xfc, 0x5c, 0x28, 0x00, 0x0f, 0x55, 0xff, 0x81, + 0xd9, 0x01, 0xae, 0xab, 0xfe, 0xb2, 0x31, 0xfe, 0xea, 0x54, 0xfc, 0x8b, 0x8f, 0x00, 0xe4, 0xb0, + 0xff, 0x7c, 0xde, 0xff, 0xb6, 0xf1, 0xff, 0xf2, 0xa1, 0xff, 0x09, 0x39, 0xff, 0x5d, 0xbd, 0xfe, + 0xfb, 0xaa, 0x01, 0x76, 0xea, 0xff, 0x3c, 0xa7, 0x41, 0x53, 0x21, 0x2b, 0x57, 0x75, 0xf2, 0x7e, + 0x02, 0xf2, 0x3f, 0xdb, 0xd9, 0x2b, 0x82, 0x05, 0x5a, 0xb6, 0x11, 0xe3, 0x4a, 0x01, 0x49, 0x12, + 0xf9, 0x57, 0xf1, 0xfa, 0xed, 0x51, 0xfa, 0xf4, 0x08, 0xff, 0xff, 0x43, 0x09, 0x42, 0xa9, 0xf7, + 0x24, 0xcf, 0x00, 0xbd, 0x69, 0xff, 0x28, 0x3f, 0xfc, 0x7a, 0x86, 0x01, 0x26, 0x37, 0xff, 0x8b, + 0x52, 0x01, 0x6b, 0xfa, 0xfe, 0x5f, 0x49, 0xfe, 0xd0, 0xf1, 0xfc, 0xba, 0xc2, 0xff, 0x31, 0xb5, + 0xff, 0xf6, 0x02, 0x00, 0xe6, 0xf3, 0xff, 0x9b, 0xc5, 0xff, 0x3f, 0x24, 0xff, 0x47, 0xcf, 0xfe, + 0x67, 0xe5, 0x01, 0x32, 0x89, 0xff, 0x53, 0xc0, 0x3b, 0x9e, 0xec, 0x26, 0x5e, 0x33, 0xf7, 0x5b, + 0xf6, 0xf4, 0x6a, 0x70, 0xdb, 0xf0, 0xc9, 0x03, 0x0b, 0x14, 0x10, 0x75, 0x28, 0x03, 0xc3, 0x5f, + 0xfa, 0x6c, 0xff, 0xfa, 0x39, 0x0f, 0xfa, 0xc6, 0xa9, 0xfe, 0xd3, 0xb1, 0x07, 0x75, 0x85, 0xf8, + 0x85, 0xf0, 0x00, 0x57, 0x47, 0xff, 0xef, 0xa6, 0xfd, 0x11, 0xb4, 0x01, 0x97, 0xa1, 0xfe, 0xd0, + 0x06, 0x01, 0xbc, 0xbd, 0xff, 0xd7, 0x3c, 0xfe, 0x35, 0xde, 0xfc, 0x67, 0xd1, 0xff, 0xdf, 0x9d, + 0xff, 0x8b, 0xf7, 0xff, 0x88, 0x0f, 0x00, 0x99, 0xad, 0xff, 0xa5, 0x61, 0xff, 0x55, 0xf4, 0xfe, + 0x76, 0xaa, 0x01, 0xf6, 0x9c, 0xff, 0x47, 0xbc, 0x34, 0x91, 0xf4, 0x22, 0x60, 0x3e, 0xfc, 0xbd, + 0x48, 0xf8, 0x89, 0x54, 0xde, 0x95, 0x19, 0x01, 0xf4, 0x2f, 0x0f, 0xd8, 0x7a, 0x04, 0x52, 0x7c, + 0xfa, 0xdb, 0x13, 0xfc, 0xee, 0x52, 0xf9, 0xcf, 0x46, 0xfe, 0xb0, 0x4f, 0x07, 0x9f, 0xeb, 0xf8, + 0xeb, 0x08, 0x01, 0x6b, 0x1c, 0x00, 0xa3, 0x44, 0xfe, 0xc0, 0x40, 0x01, 0x4d, 0x61, 0xfe, 0x89, + 0x71, 0x01, 0x8c, 0xd9, 0xff, 0x65, 0xd1, 0xfd, 0x7a, 0xc4, 0xfd, 0xfa, 0xad, 0xff, 0x01, 0x62, + 0xff, 0xec, 0x16, 0x00, 0x61, 0xf9, 0xff, 0x4d, 0xd8, 0xff, 0x6d, 0x74, 0xff, 0xcd, 0xe7, 0xfe, + 0xd6, 0xf2, 0x01, 0x7a, 0xdd, 0xff, 0x90, 0xe9, 0x29, 0xe1, 0x02, 0x1b, 0x26, 0x3d, 0xf7, 0x4c, + 0xa0, 0xfc, 0x37, 0xa4, 0xf4, 0x32, 0xdf, 0x08, 0x33, 0x3f, 0x05, 0x6d, 0x69, 0xfa, 0x09, 0xd2, + 0xfa, 0x2a, 0x88, 0x00, 0x78, 0x96, 0x00, 0x14, 0x2c, 0xff, 0xc6, 0x95, 0x03, 0x0a, 0x32, 0xfa, + 0x6f, 0x25, 0x00, 0xdf, 0xb2, 0xff, 0x76, 0x03, 0xfd, 0x84, 0x64, 0x00, 0x93, 0xda, 0xfe, 0x28, + 0x27, 0x00, 0x67, 0xa1, 0xff, 0x00, 0xa0, 0xfe, 0x77, 0x3c, 0xfe, 0x86, 0x20, 0x02, 0x99, 0xc8, + 0xff, 0x13, 0x0a, 0x00, 0x3a, 0x51, 0x00, 0x91, 0x38, 0xfe, 0x28, 0xd2, 0xff, 0x22, 0xb8, 0xfe, + 0x71, 0x54, 0xff, 0xcc, 0x10, 0x00, 0x8e, 0xe2, 0x23, 0x4a, 0x78, 0x1a, 0x25, 0xe9, 0xfa, 0x88, + 0x72, 0xfc, 0x1a, 0x3f, 0xf5, 0x58, 0x11, 0x07, 0x52, 0x42, 0x06, 0xb8, 0x38, 0xfc, 0xa1, 0x44, + 0xfb, 0xca, 0x01, 0x00, 0x6b, 0xdd, 0xff, 0x72, 0x30, 0xff, 0x2d, 0x29, 0x03, 0x4f, 0x32, 0xfb, + 0x78, 0xe9, 0xff, 0x8f, 0x16, 0x00, 0x2e, 0xb6, 0xfd, 0xc9, 0x28, 0x00, 0x79, 0x54, 0xff, 0x0f, + 0x2d, 0x00, 0xb8, 0xa1, 0xff, 0x1a, 0xb9, 0xfe, 0x89, 0x23, 0xfe, 0xb7, 0xac, 0x01, 0x99, 0x15, + 0x00, 0x4b, 0x0a, 0x00, 0x64, 0xac, 0x00, 0x8c, 0xb1, 0xfe, 0x94, 0xa8, 0xff, 0x33, 0xf6, 0xfe, + 0x3e, 0x55, 0xff, 0x7c, 0xd2, 0xff, 0xb0, 0xd9, 0x1e, 0xf7, 0x60, 0x19, 0x8b, 0x29, 0xfe, 0x83, + 0x9e, 0xfc, 0xf5, 0x64, 0xf6, 0xcc, 0xa4, 0x05, 0x76, 0x90, 0x06, 0xc9, 0xa1, 0xfd, 0x0c, 0x15, + 0xfc, 0xbb, 0x8b, 0xff, 0x13, 0x72, 0xff, 0x69, 0x8d, 0xff, 0x7d, 0xa7, 0x02, 0xa1, 0x41, 0xfc, + 0x80, 0xe6, 0xff, 0x49, 0x76, 0x00, 0xf5, 0x5e, 0xfe, 0x71, 0x22, 0x00, 0x7b, 0xcd, 0xff, 0x37, + 0x41, 0x00, 0x8e, 0xc0, 0xff, 0x7d, 0xf7, 0xfe, 0x3f, 0x54, 0xfe, 0x1d, 0x55, 0x01, 0x56, 0x7d, + 0x00, 0xfb, 0x27, 0x00, 0x2e, 0xb3, 0x00, 0xca, 0x0d, 0xff, 0xb7, 0x99, 0xff, 0x11, 0x37, 0xff, + 0x96, 0x43, 0xff, 0x6b, 0xbf, 0xff, 0x28, 0xce, 0x1a, 0xea, 0x6d, 0x18, 0xa5, 0x3c, 0x00, 0x55, + 0xd4, 0xfc, 0xd5, 0x9c, 0xf7, 0x0e, 0xa3, 0x04, 0x44, 0x83, 0x06, 0x29, 0xcd, 0xfe, 0x28, 0xea, + 0xfc, 0xb5, 0x36, 0xff, 0x42, 0x70, 0xff, 0x03, 0xcd, 0xff, 0xc5, 0x30, 0x02, 0xef, 0x2c, 0xfd, + 0xfc, 0x23, 0x00, 0x60, 0xb7, 0x00, 0x80, 0xe5, 0xfe, 0xbc, 0x34, 0x00, 0xda, 0x2f, 0x00, 0x3c, + 0x6f, 0x00, 0x60, 0xd5, 0xff, 0xfb, 0x60, 0xff, 0xda, 0xaf, 0xfe, 0x89, 0x0d, 0x01, 0xc3, 0xa5, + 0x00, 0x54, 0x2a, 0x00, 0x7d, 0x9a, 0x00, 0x7a, 0x54, 0xff, 0xf8, 0x97, 0xff, 0x5c, 0x53, 0xff, + 0x79, 0x6a, 0xff, 0x99, 0xbd, 0xff, 0xce, 0xc7, 0x17, 0xfa, 0x8a, 0x17, 0x33, 0x5b, 0x01, 0x23, + 0xc6, 0xfc, 0xa4, 0xc9, 0xf8, 0x05, 0xe5, 0x03, 0xf9, 0x25, 0x06, 0x1e, 0xa5, 0xff, 0x77, 0x8f, + 0xfd, 0x98, 0x1c, 0xff, 0xef, 0x83, 0xff, 0x09, 0xd3, 0xff, 0x0e, 0xcd, 0x01, 0x1d, 0xf9, 0xfd, + 0x19, 0x56, 0x00, 0xea, 0xbf, 0x00, 0x10, 0x4b, 0xff, 0x38, 0x42, 0x00, 0x20, 0x60, 0x00, 0x5c, + 0x9d, 0x00, 0x5c, 0xf0, 0xff, 0xbe, 0xad, 0xff, 0x68, 0xdd, 0xfe, 0x72, 0x95, 0x00, 0x1f, 0x9a, + 0x00, 0xa2, 0x1e, 0x00, 0x82, 0x47, 0x00, 0xdf, 0x76, 0xff, 0x4c, 0x9e, 0xff, 0x9f, 0x79, 0xff, + 0x97, 0x6b, 0xff, 0xf1, 0x67, 0xff, 0xe7, 0x95, 0x15, 0xcd, 0xb3, 0x16, 0x6c, 0xeb, 0x01, 0xf6, + 0xbb, 0xfc, 0x1e, 0xf1, 0xf9, 0x60, 0x59, 0x03, 0x8e, 0xb4, 0x05, 0x3f, 0x5c, 0x00, 0x50, 0x16, + 0xfe, 0x73, 0x3d, 0xff, 0x9d, 0x9f, 0xff, 0x68, 0xdd, 0xff, 0x05, 0xb3, 0x01, 0xe4, 0x89, 0xfe, + 0xb3, 0x83, 0x00, 0x8f, 0xcc, 0x00, 0xa4, 0x98, 0xff, 0x3f, 0x4f, 0x00, 0x87, 0x96, 0x00, 0x12, + 0xbe, 0x00, 0xe5, 0xe1, 0xff, 0x92, 0xd6, 0xff, 0x01, 0xf6, 0xfe, 0x8e, 0x1c, 0x00, 0x5e, 0x79, + 0x00, 0xd9, 0x0a, 0x00, 0x6a, 0x0a, 0x00, 0x44, 0xb5, 0xff, 0x21, 0xac, 0xff, 0xa9, 0x6b, 0xff, + 0x97, 0x63, 0xff, 0x13, 0x7a, 0xff, 0x78, 0xed, 0x13, 0xde, 0x2d, 0x16, 0x2a, 0x2c, 0x02, 0x45, + 0xb5, 0xfc, 0xe8, 0xee, 0xfa, 0xf0, 0xf4, 0x02, 0x7e, 0x5f, 0x05, 0xd5, 0x01, 0x01, 0x5d, 0x70, + 0xfe, 0x5c, 0x86, 0xff, 0x9e, 0x00, 0x00, 0xf1, 0xc6, 0xff, 0xcd, 0xd0, 0x01, 0x70, 0xf7, 0xfe, + 0x35, 0x92, 0x00, 0xaf, 0xf3, 0x00, 0xd3, 0xd7, 0xff, 0x00, 0x55, 0x00, 0x91, 0x91, 0x00, 0xb9, + 0xe1, 0x00, 0xee, 0xc6, 0xff, 0xf4, 0xcf, 0xff, 0x3e, 0x21, 0xff, 0x86, 0xae, 0xff, 0x38, 0x55, + 0x00, 0x2e, 0x41, 0x00, 0x34, 0xe9, 0xff, 0xc8, 0xd1, 0xff, 0x65, 0xb0, 0xff, 0xf9, 0x91, 0xff, + 0xc7, 0x7a, 0xff, 0x7d, 0x2f, 0xff, 0xe8, 0xeb, 0x12, 0xa6, 0xc0, 0x15, 0xe0, 0x2c, 0x02, 0x86, + 0x98, 0xfc, 0xa5, 0xd3, 0xfb, 0x96, 0xd1, 0x02, 0x3f, 0x0b, 0x05, 0x7c, 0x71, 0x01, 0xb7, 0x9e, + 0xfe, 0xf1, 0xc5, 0xff, 0xe0, 0xa1, 0x00, 0xdd, 0x88, 0xff, 0x18, 0xcc, 0x01, 0xdd, 0x76, 0xff, + 0x2c, 0x61, 0x00, 0x05, 0x15, 0x01, 0x0e, 0xf2, 0xff, 0xd2, 0x15, 0x00, 0xbf, 0x83, 0x00, 0x1e, + 0xec, 0x00, 0xc6, 0xb7, 0xff, 0x72, 0x8e, 0xff, 0x30, 0x3b, 0xff, 0xbc, 0xa5, 0xff, 0xe7, 0x1b, + 0x00, 0x9b, 0x63, 0x00, 0x9c, 0xd5, 0xff, 0x82, 0xc9, 0xff, 0xba, 0xf6, 0xff, 0x1b, 0x66, 0xff, + 0xe6, 0xa2, 0xff, 0xe1, 0x25, 0x00, 0xd4, 0xed, 0x11, 0x8c, 0xbd, 0x15, 0x6b, 0x52, 0x02, 0xc0, + 0x8f, 0xfc, 0x43, 0x9e, 0xfc, 0x14, 0xc9, 0x02, 0xf9, 0xc9, 0x04, 0x55, 0x8f, 0x01, 0x29, 0xec, + 0xfe, 0x8a, 0xab, 0xff, 0x2c, 0x4b, 0x01, 0x1d, 0xb7, 0xff, 0x99, 0x2f, 0x01, 0x3e, 0x15, 0x00, + 0x53, 0x55, 0x00, 0x2f, 0x98, 0x00, 0x9e, 0x2e, 0x00, 0x53, 0x04, 0x00, 0x1d, 0x32, 0x00, 0x86, + 0xe6, 0x00, 0xfc, 0xdc, 0xff, 0x31, 0x5b, 0xff, 0x6c, 0x27, 0xff, 0x8d, 0xff, 0xff, 0x8a, 0xd2, + 0xff, 0x98, 0x32, 0x00, 0x49, 0x26, 0x00, 0xf2, 0xc9, 0xff, 0x65, 0xc0, 0xff, 0x6c, 0x21, 0x00, + 0x0e, 0x3b, 0x00, 0x30, 0x72, 0xff, 0xa4, 0x89, 0x11, 0x32, 0x87, 0x15, 0xae, 0x85, 0x02, 0x25, + 0x97, 0xfc, 0x72, 0x4b, 0xfd, 0x20, 0xf6, 0x02, 0x68, 0x8c, 0x04, 0x69, 0x69, 0x01, 0x6f, 0xd8, + 0xfe, 0x4e, 0xd4, 0xff, 0x8f, 0x46, 0x01, 0x6a, 0x20, 0x00, 0x82, 0x0c, 0x01, 0x5a, 0xbe, 0xff, + 0x32, 0xba, 0x00, 0xfc, 0x46, 0x00, 0xde, 0xc1, 0xff, 0x2d, 0x4f, 0x00, 0x9c, 0x18, 0x00, 0x5b, + 0x7f, 0x00, 0x6d, 0xf2, 0xff, 0x86, 0xb9, 0xff, 0xc8, 0xf4, 0xfe, 0xb1, 0xc5, 0xff, 0xbe, 0xf9, + 0xff, 0x05, 0x26, 0x00, 0x52, 0x01, 0x00, 0xbb, 0xa9, 0xff, 0x61, 0xa8, 0x00, 0x6d, 0x6a, 0x00, + 0xcd, 0x82, 0xff, 0xcf, 0x9c, 0xff, 0xfa, 0x40, 0x11, 0xe5, 0xc0, 0x15, 0x85, 0xa8, 0x02, 0xdb, + 0x8e, 0xfc, 0xe5, 0xd2, 0xfd, 0x95, 0x20, 0x03, 0x8f, 0x60, 0x04, 0xb1, 0x39, 0x01, 0x8e, 0x83, + 0xfe, 0xbf, 0x9c, 0xff, 0x85, 0x5a, 0x01, 0xf1, 0xe1, 0xff, 0x1e, 0x38, 0x01, 0xa5, 0xe2, 0xff, + 0x13, 0x39, 0x00, 0x74, 0x87, 0x00, 0x40, 0x8d, 0xff, 0xe0, 0xcb, 0xff, 0x79, 0x69, 0x00, 0x72, + 0x62, 0x00, 0xba, 0x9b, 0xff, 0xa4, 0xf2, 0xff, 0x98, 0x3b, 0xff, 0x41, 0x3a, 0xff, 0x71, 0xd7, + 0xff, 0xa9, 0x70, 0x00, 0x71, 0x71, 0xff, 0xce, 0x3d, 0x00, 0x1d, 0x36, 0x01, 0xf6, 0x9d, 0xff, + 0x52, 0xbd, 0xff, 0x39, 0x8a, 0xff, 0x7d, 0x73, 0x11, 0x5f, 0x3c, 0x16, 0xfe, 0x98, 0x02, 0x04, + 0x4f, 0xfc, 0x84, 0x55, 0xfe, 0x73, 0x9c, 0x03, 0x1f, 0x73, 0x04, 0x5f, 0xfe, 0x00, 0x83, 0x53, + 0xfe, 0x5a, 0x3b, 0xff, 0xfd, 0x24, 0x01, 0xba, 0xea, 0xff, 0x37, 0xeb, 0x00, 0x7f, 0x29, 0x00, + 0x45, 0x9f, 0x00, 0x7d, 0x39, 0x00, 0x99, 0x8c, 0xff, 0x48, 0x06, 0x00, 0xbc, 0xf3, 0xff, 0x29, + 0x80, 0x00, 0x6c, 0xf3, 0xff, 0x2c, 0xb9, 0xff, 0x8b, 0x3b, 0xff, 0xe9, 0x73, 0xff, 0xf6, 0xed, + 0xff, 0x22, 0xc8, 0xff, 0x5a, 0xd8, 0xff, 0x44, 0x2c, 0x01, 0xf5, 0x51, 0x00, 0x8c, 0xa5, 0xff, + 0x50, 0x44, 0x00, 0xb2, 0x21, 0xff, 0xe7, 0xd5, 0x11, 0x84, 0xfd, 0x16, 0x0f, 0x7f, 0x02, 0x77, + 0x8b, 0xfb, 0x7e, 0x98, 0xfe, 0x81, 0x0e, 0x04, 0xef, 0xa3, 0x04, 0xfd, 0xf0, 0x00, 0xf4, 0xb7, + 0xfd, 0xe6, 0xe4, 0xfe, 0x10, 0x06, 0x01, 0xdc, 0x5a, 0xff, 0x37, 0x92, 0x00, 0x73, 0x28, 0x00, + 0xe9, 0x8a, 0x00, 0x71, 0x8e, 0x00, 0xf1, 0x7d, 0xff, 0x4b, 0xaa, 0xff, 0x52, 0x31, 0x00, 0x77, + 0x2c, 0x00, 0xa9, 0x99, 0xff, 0xeb, 0x0f, 0x00, 0xa5, 0xf8, 0xfe, 0xde, 0x61, 0xff, 0xb6, 0x18, + 0x00, 0x45, 0x70, 0xff, 0x3d, 0x17, 0x00, 0x70, 0x26, 0x01, 0x09, 0xcb, 0xff, 0x14, 0xd4, 0xff, + 0xb0, 0x02, 0x00, 0x57, 0x2c, 0xff, 0x5d, 0x45, 0x12, 0xb4, 0x22, 0x18, 0x14, 0x89, 0x02, 0x60, + 0xb8, 0xfa, 0x32, 0xad, 0xfe, 0x91, 0x76, 0x04, 0xcc, 0xe7, 0x04, 0x77, 0xff, 0x00, 0xe4, 0x63, + 0xfd, 0x73, 0x71, 0xfe, 0xbf, 0x0b, 0x01, 0x19, 0x2f, 0xff, 0x2b, 0xf6, 0xff, 0xb1, 0xe2, 0xff, + 0xe0, 0xa2, 0x00, 0x06, 0x75, 0x00, 0x89, 0x89, 0xff, 0x48, 0x09, 0x00, 0xd8, 0x09, 0x00, 0x5a, + 0x22, 0x00, 0x0d, 0x99, 0xff, 0x27, 0xab, 0xff, 0x53, 0xdb, 0xfe, 0xe4, 0xb9, 0xff, 0x1c, 0x1f, + 0x00, 0x83, 0x42, 0xff, 0x95, 0x71, 0x00, 0x61, 0x13, 0x01, 0x79, 0x42, 0xff, 0x1d, 0xce, 0xff, + 0x89, 0x02, 0x00, 0xfc, 0x2d, 0xff, 0xc9, 0xf0, 0x12, 0xe2, 0x8f, 0x19, 0x45, 0x80, 0x02, 0x05, + 0xa4, 0xf9, 0x4f, 0xda, 0xfe, 0xb1, 0xe5, 0x04, 0xcb, 0x24, 0x05, 0x3f, 0x13, 0x01, 0x00, 0xe9, + 0xfc, 0x7b, 0x64, 0xfe, 0x0a, 0x2c, 0x01, 0x34, 0xea, 0xfe, 0x30, 0xa0, 0xff, 0xd0, 0xad, 0xff, + 0x37, 0x5f, 0x00, 0x5c, 0x54, 0x00, 0xcc, 0x69, 0xff, 0x18, 0xf1, 0xff, 0x3e, 0x6e, 0x00, 0xf8, + 0x4d, 0x00, 0x48, 0x5a, 0xff, 0x50, 0xad, 0xff, 0x49, 0xb2, 0xfe, 0x79, 0x71, 0xff, 0x78, 0x74, + 0x00, 0x83, 0x84, 0xff, 0x2d, 0x45, 0x00, 0x60, 0x3c, 0x01, 0x57, 0x31, 0xff, 0x6e, 0x80, 0xff, + 0x37, 0xbb, 0xff, 0xf0, 0x43, 0xff, 0x55, 0x14, 0x14, 0x51, 0xf3, 0x1a, 0x24, 0x2d, 0x02, 0x36, + 0x95, 0xf8, 0x6f, 0xff, 0xfe, 0x7f, 0x77, 0x05, 0x29, 0x31, 0x05, 0x54, 0xda, 0x00, 0xa8, 0x58, + 0xfc, 0x41, 0x58, 0xfe, 0x78, 0x97, 0x01, 0xcc, 0xb7, 0xfe, 0x59, 0x33, 0xff, 0x15, 0x58, 0xff, + 0x89, 0x5e, 0x00, 0x91, 0x14, 0x00, 0x2f, 0xec, 0xfe, 0xf0, 0xd2, 0xff, 0x04, 0x6f, 0x00, 0x37, + 0x50, 0x00, 0x3e, 0x74, 0xff, 0x49, 0xb2, 0xff, 0xfc, 0x88, 0xfe, 0x43, 0x6c, 0xff, 0xcb, 0x6b, + 0x00, 0xe2, 0x67, 0xff, 0xf9, 0x21, 0x00, 0xd9, 0x8f, 0x01, 0x32, 0x5d, 0xff, 0x4c, 0xf0, 0xfe, + 0x3c, 0xaa, 0xff, 0x8e, 0x2d, 0xff, 0xaa, 0x75, 0x15, 0x58, 0x87, 0x1c, 0x98, 0x8c, 0x01, 0x18, + 0x59, 0xf7, 0xa7, 0x35, 0xff, 0x6c, 0x0e, 0x06, 0x4c, 0x2d, 0x05, 0xcb, 0x63, 0x00, 0x77, 0xae, + 0xfb, 0x4c, 0x35, 0xfe, 0x37, 0x12, 0x02, 0xc7, 0x8e, 0xfe, 0xff, 0xb0, 0xfe, 0xed, 0x1d, 0xff, + 0x2b, 0x25, 0x00, 0xf1, 0xcd, 0xff, 0x2e, 0xa2, 0xfe, 0x5b, 0x62, 0xff, 0x1a, 0x3a, 0x00, 0x3d, + 0x2a, 0x00, 0xe9, 0x27, 0xff, 0x4c, 0xd1, 0xff, 0x4b, 0xb6, 0xfe, 0x04, 0x4f, 0xff, 0xd3, 0x68, + 0x00, 0xaa, 0x92, 0xff, 0x8a, 0x44, 0xff, 0x4b, 0x69, 0x01, 0x87, 0x51, 0x00, 0xe1, 0x7b, 0xfe, + 0x2e, 0x37, 0xff, 0xf4, 0x3c, 0xff, 0x8c, 0x76, 0x17, 0xc4, 0x4e, 0x1e, 0x2f, 0xa4, 0x00, 0x3a, + 0x32, 0xf6, 0x9e, 0xa5, 0xff, 0x92, 0xf6, 0x06, 0x70, 0x23, 0x05, 0xfc, 0xd5, 0xff, 0xbc, 0xfe, + 0xfa, 0xa4, 0x70, 0xfe, 0x73, 0xb7, 0x02, 0x4f, 0x90, 0xfe, 0xad, 0x49, 0xfe, 0xb2, 0xf5, 0xfe, + 0xb4, 0x57, 0x00, 0x41, 0x94, 0xff, 0x5c, 0x49, 0xfe, 0x38, 0x74, 0xff, 0x6d, 0x1a, 0x00, 0x7f, + 0xd2, 0xff, 0x0f, 0x12, 0xff, 0xee, 0xaa, 0xff, 0x20, 0x1c, 0xff, 0x98, 0xb4, 0xff, 0x88, 0x4d, + 0x00, 0x32, 0xf4, 0xff, 0xd7, 0xf5, 0xfe, 0x18, 0xa6, 0x00, 0x4a, 0x03, 0x01, 0xf8, 0xf8, 0xfe, + 0x5f, 0xbb, 0xfe, 0x9c, 0x64, 0xff, 0x22, 0xb5, 0x19, 0xdc, 0xf0, 0x1f, 0xeb, 0x96, 0xff, 0xea, + 0x14, 0xf5, 0xe6, 0xfb, 0xff, 0x26, 0xde, 0x07, 0x36, 0xea, 0x04, 0xea, 0x19, 0xff, 0x20, 0x15, + 0xfa, 0x1e, 0xb3, 0xfe, 0x2c, 0x56, 0x03, 0x14, 0x84, 0xfe, 0xc6, 0xcc, 0xfd, 0x00, 0xa7, 0xfe, + 0xf9, 0x69, 0x00, 0x29, 0x77, 0xff, 0x0f, 0xdd, 0xfd, 0x54, 0x42, 0xff, 0x01, 0x3b, 0x00, 0xc6, + 0x3f, 0xff, 0xe4, 0xe2, 0xfe, 0x58, 0x76, 0xff, 0xdd, 0x0f, 0xff, 0x49, 0x5e, 0x00, 0xac, 0x33, + 0x00, 0x21, 0xfb, 0xff, 0x4d, 0x16, 0xff, 0xe1, 0xb8, 0xff, 0x3e, 0xfc, 0x00, 0x65, 0xdd, 0xff, + 0xc8, 0x43, 0xfe, 0xad, 0x38, 0xff, 0x34, 0xf2, 0x1b, 0xe0, 0xe8, 0x21, 0x9c, 0x95, 0xfe, 0x7f, + 0x03, 0xf4, 0x39, 0x3a, 0x00, 0xa0, 0xd4, 0x08, 0xb1, 0xc3, 0x04, 0x7d, 0x51, 0xfe, 0x48, 0x57, + 0xf9, 0x68, 0xca, 0xfe, 0x54, 0x28, 0x04, 0x98, 0x6e, 0xfe, 0x60, 0x71, 0xfd, 0xa5, 0x69, 0xfe, + 0x8d, 0x69, 0x00, 0x4f, 0x5d, 0xff, 0x54, 0xac, 0xfd, 0xce, 0x05, 0xff, 0x62, 0x67, 0x00, 0x47, + 0xef, 0xfe, 0xe1, 0x89, 0xfe, 0x0e, 0x8a, 0xff, 0x79, 0xd9, 0xfe, 0x03, 0xee, 0x00, 0xe6, 0x65, + 0x00, 0x12, 0xde, 0xff, 0x31, 0x42, 0xff, 0x40, 0x53, 0xff, 0xf7, 0x3a, 0x00, 0xc3, 0xd1, 0x00, + 0x19, 0xa3, 0xfe, 0x2b, 0x75, 0xfe, 0x42, 0xb0, 0x1d, 0x6a, 0x1a, 0x24, 0x48, 0x06, 0xfe, 0xd9, + 0x3a, 0xf3, 0xc6, 0x21, 0x00, 0x7c, 0x9a, 0x09, 0x1b, 0xd2, 0x04, 0xb7, 0x85, 0xfd, 0x22, 0xed, + 0xf8, 0x49, 0x96, 0xfe, 0xe9, 0xf3, 0x04, 0x69, 0x5d, 0xfe, 0x38, 0x22, 0xfd, 0xa9, 0x41, 0xfe, + 0xfd, 0x66, 0x00, 0x08, 0x3b, 0xff, 0x98, 0x7d, 0xfd, 0x44, 0xe8, 0xfe, 0xba, 0x5c, 0x00, 0x6d, + 0xfe, 0xfe, 0x57, 0x1f, 0xfe, 0x57, 0xba, 0xff, 0x12, 0xa5, 0xfe, 0x97, 0x49, 0x01, 0x7e, 0xbc, + 0x00, 0x4b, 0xc3, 0xff, 0x26, 0x51, 0xff, 0xc2, 0x34, 0xff, 0xba, 0x83, 0xff, 0x41, 0xf7, 0x00, + 0x19, 0xdb, 0xff, 0x74, 0xdb, 0xfd, 0x94, 0xba, 0x1f, 0xc0, 0x0e, 0x26, 0xae, 0x41, 0xfd, 0xef, + 0xc1, 0xf2, 0x17, 0xcf, 0xff, 0xf5, 0x21, 0x0a, 0x5c, 0xc6, 0x04, 0x7a, 0xc3, 0xfc, 0xed, 0x81, + 0xf8, 0x2f, 0x6e, 0xfe, 0x29, 0x7d, 0x05, 0x13, 0x44, 0xfe, 0xb8, 0xbb, 0xfc, 0xf1, 0x26, 0xfe, + 0x1c, 0x57, 0x00, 0x8e, 0x17, 0xff, 0x3c, 0x41, 0xfd, 0xca, 0xba, 0xfe, 0xf6, 0x39, 0x00, 0xdf, + 0x0a, 0xff, 0x4a, 0xdf, 0xfd, 0xa4, 0xde, 0xff, 0x96, 0x9c, 0xfe, 0x8a, 0x43, 0x01, 0xb4, 0x12, + 0x01, 0x7e, 0xb5, 0xff, 0x17, 0x37, 0xff, 0x6e, 0x0a, 0xff, 0xf3, 0x10, 0xff, 0x6d, 0x72, 0x00, + 0x60, 0xf9, 0x00, 0xf5, 0x21, 0xfe, 0xed, 0x54, 0x22, 0x06, 0x44, 0x27, 0xc3, 0x4a, 0xfc, 0x5d, + 0xcf, 0xf2, 0x59, 0x7d, 0xff, 0x0d, 0x48, 0x0a, 0xc8, 0xa1, 0x04, 0x18, 0x35, 0xfc, 0xd4, 0x29, + 0xf8, 0x91, 0x5c, 0xfe, 0x19, 0xc4, 0x05, 0x1f, 0x1b, 0xfe, 0x12, 0x6c, 0xfc, 0xa6, 0x07, 0xfe, + 0x57, 0x4d, 0x00, 0x1c, 0xea, 0xfe, 0xd3, 0x1e, 0xfd, 0xb3, 0x7d, 0xfe, 0x75, 0x0a, 0x00, 0xef, + 0x0f, 0xff, 0x42, 0xe9, 0xfd, 0xb3, 0xd7, 0xff, 0x86, 0xde, 0xfe, 0xac, 0x28, 0x01, 0x81, 0x1d, + 0x01, 0xc5, 0xc6, 0xff, 0x39, 0x28, 0xff, 0xc0, 0xba, 0xfe, 0x98, 0xd4, 0xfe, 0xc5, 0xf5, 0xff, + 0x79, 0x40, 0x01, 0xaf, 0x30, 0xff, 0xe4, 0xe0, 0x24, 0xe3, 0x92, 0x28, 0xfd, 0x00, 0xfb, 0x12, + 0x3f, 0xf3, 0x76, 0x3d, 0xff, 0xd2, 0xe6, 0x09, 0x5b, 0x8b, 0x04, 0xfb, 0xdb, 0xfb, 0xb7, 0xf4, + 0xf7, 0x36, 0x20, 0xfe, 0x2e, 0xf7, 0x05, 0x4f, 0xed, 0xfd, 0xbe, 0x4a, 0xfc, 0x07, 0xee, 0xfd, + 0x4e, 0x25, 0x00, 0xe5, 0xda, 0xfe, 0x5b, 0x05, 0xfd, 0xd4, 0x3d, 0xfe, 0xff, 0xdd, 0xff, 0x1f, + 0x2e, 0xff, 0xc1, 0x15, 0xfe, 0xed, 0xbe, 0xff, 0x2a, 0x36, 0xff, 0x95, 0x1d, 0x01, 0xb1, 0xe6, + 0x00, 0x19, 0xe6, 0xff, 0xe9, 0x2a, 0xff, 0x6e, 0x61, 0xfe, 0xbe, 0x9f, 0xfe, 0xf9, 0xce, 0xff, + 0x8a, 0xca, 0x00, 0x0d, 0x44, 0x00, 0x22, 0x66, 0x27, 0x0a, 0xfd, 0x29, 0x76, 0xc4, 0xf8, 0x81, + 0xfc, 0xf3, 0xfb, 0x33, 0xff, 0xf4, 0xfd, 0x08, 0x58, 0x8e, 0x04, 0x06, 0x93, 0xfb, 0xb1, 0xc2, + 0xf7, 0xae, 0xa5, 0xfd, 0xe8, 0x0a, 0x06, 0x39, 0xa2, 0xfd, 0x19, 0x7a, 0xfc, 0x95, 0xac, 0xfd, + 0x15, 0xed, 0xff, 0x43, 0xc9, 0xfe, 0x22, 0xdb, 0xfc, 0xf7, 0x10, 0xfe, 0x29, 0x90, 0xff, 0xc2, + 0x83, 0xff, 0x67, 0x17, 0xfe, 0x50, 0xb5, 0xff, 0xc6, 0x6c, 0xff, 0x1f, 0xfd, 0x00, 0x9c, 0x81, + 0x00, 0xb8, 0x17, 0x00, 0xec, 0x03, 0xff, 0xb6, 0x26, 0xfe, 0xa2, 0x81, 0xfe, 0x74, 0xa6, 0xff, + 0xb7, 0x21, 0x00, 0x04, 0xd1, 0x00, 0x31, 0x4e, 0x2b, 0x9c, 0x7e, 0x2a, 0xfe, 0x2b, 0xf5, 0x16, + 0x6b, 0xf5, 0x48, 0x88, 0xff, 0x13, 0xfe, 0x07, 0xe4, 0x58, 0x04, 0xe8, 0x35, 0xfb, 0xa6, 0x74, + 0xf7, 0xb5, 0x71, 0xfd, 0x74, 0x1b, 0x06, 0xa3, 0x30, 0xfd, 0xd2, 0x31, 0xfd, 0xb0, 0x37, 0xfd, + 0x27, 0xf7, 0xff, 0xc7, 0x88, 0xfe, 0xd8, 0xae, 0xfc, 0x0d, 0x1b, 0xfe, 0x37, 0x70, 0xff, 0x1b, + 0xd8, 0xff, 0x1d, 0xf7, 0xfd, 0xe4, 0x05, 0x00, 0xc6, 0x31, 0xff, 0x9f, 0xf2, 0x00, 0x4a, 0x40, + 0x00, 0xa0, 0x2b, 0x00, 0x40, 0xd0, 0xfe, 0x8d, 0x35, 0xfe, 0x9f, 0x9e, 0xfe, 0xab, 0x1f, 0xff, + 0x6a, 0xdc, 0xff, 0xd6, 0x01, 0x01, 0xfa, 0x5f, 0x30, 0x76, 0xcc, 0x29, 0x8f, 0xa0, 0xf0, 0x2a, + 0x7f, 0xf7, 0x0e, 0xab, 0xff, 0x78, 0x63, 0x07, 0xd7, 0xaa, 0x03, 0xcd, 0xd1, 0xfa, 0x2d, 0xf3, + 0xf6, 0x53, 0x99, 0xfd, 0xbf, 0x3b, 0x06, 0x09, 0xb5, 0xfc, 0x3b, 0x20, 0xfe, 0x70, 0xc0, 0xfc, + 0xf5, 0x19, 0x00, 0x53, 0x15, 0xfe, 0x0c, 0xa4, 0xfc, 0x25, 0x6e, 0xfe, 0x2d, 0x67, 0xff, 0x91, + 0xd4, 0xff, 0x3f, 0x24, 0xfe, 0xf7, 0x10, 0x00, 0x5a, 0x97, 0xfe, 0x0a, 0x67, 0x01, 0x00, 0xdc, + 0xff, 0xc0, 0x18, 0x00, 0xec, 0xfe, 0xfe, 0x9c, 0x53, 0xfe, 0x40, 0x78, 0xfe, 0xd6, 0xba, 0xfe, + 0x90, 0x0a, 0x00, 0xe9, 0x99, 0x00, 0xa4, 0x4c, 0x35, 0x18, 0x76, 0x28, 0xe1, 0x3b, 0xec, 0x94, + 0xae, 0xf9, 0x06, 0x8d, 0xff, 0x18, 0x18, 0x07, 0x87, 0xa0, 0x02, 0x88, 0x5b, 0xfa, 0x11, 0x5c, + 0xf6, 0x90, 0xfa, 0xfd, 0xb2, 0x8c, 0x06, 0x07, 0x1d, 0xfc, 0x05, 0x3d, 0xff, 0x40, 0x4f, 0xfc, + 0xf6, 0x10, 0x00, 0xd4, 0xa4, 0xfd, 0xe2, 0xf4, 0xfc, 0xe8, 0xe3, 0xfe, 0x53, 0xcc, 0xfe, 0xd9, + 0x2f, 0x00, 0x3d, 0x08, 0xfe, 0x01, 0x6a, 0xff, 0x7b, 0xb8, 0xfe, 0xa5, 0xa0, 0x01, 0x5c, 0x51, + 0xff, 0x92, 0x8b, 0x00, 0xa5, 0x3b, 0xff, 0x38, 0xdc, 0xfd, 0xbc, 0x8f, 0xfe, 0x44, 0xde, 0xfe, + 0xc1, 0x9b, 0xff, 0x9b, 0x1d, 0x00, 0x43, 0xd5, 0x39, 0x56, 0xb4, 0x26, 0x41, 0x5d, 0xe8, 0x70, + 0xe1, 0xfb, 0x3e, 0x2f, 0xff, 0x96, 0xf7, 0x06, 0xee, 0x8f, 0x01, 0x3e, 0xc3, 0xf9, 0x24, 0x0f, + 0xf6, 0x3f, 0xe8, 0xfe, 0xa7, 0x9a, 0x06, 0x72, 0xaf, 0xfb, 0xf9, 0xaa, 0x00, 0xaa, 0x8f, 0xfb, + 0x97, 0x14, 0x00, 0x4f, 0xcb, 0xfd, 0xff, 0x68, 0xfd, 0x08, 0xd0, 0xfe, 0xc3, 0x9a, 0xfe, 0xfb, + 0x33, 0x00, 0x3d, 0x61, 0xfd, 0x6a, 0x98, 0xff, 0x6a, 0x8d, 0xfe, 0x81, 0xd4, 0x01, 0x07, 0x98, + 0xff, 0xe4, 0xe1, 0x00, 0xdd, 0xe8, 0xfe, 0x35, 0xc8, 0xfd, 0x1b, 0x21, 0xff, 0x13, 0x65, 0xfe, + 0x83, 0x22, 0xff, 0x16, 0x32, 0x00, 0xcc, 0x3c, 0x3d, 0xe0, 0x0c, 0x25, 0x02, 0x50, 0xe5, 0x09, + 0xf6, 0xfd, 0xae, 0x12, 0xfe, 0xa6, 0x06, 0x07, 0xf3, 0xcb, 0x00, 0xf9, 0xeb, 0xf8, 0x61, 0x76, + 0xf6, 0xc6, 0xb9, 0xff, 0xb7, 0x5d, 0x06, 0x8f, 0xb8, 0xfb, 0x8c, 0xde, 0x01, 0xab, 0x88, 0xfa, + 0xe7, 0xc3, 0x00, 0xc3, 0x39, 0xfe, 0xc9, 0x10, 0xfd, 0x61, 0x3f, 0xff, 0xed, 0xaa, 0xfd, 0x69, + 0x14, 0x00, 0x13, 0x96, 0xfd, 0xf5, 0x12, 0xff, 0x05, 0xae, 0xfe, 0x3b, 0xc3, 0x02, 0x7f, 0x8b, + 0xff, 0x7b, 0xa9, 0x00, 0x2e, 0x29, 0xff, 0x54, 0xe0, 0xfd, 0x39, 0xfd, 0xfe, 0x9a, 0x13, 0xfe, + 0x74, 0x0c, 0xff, 0xa8, 0x25, 0x00, 0x40, 0x78, 0x3f, 0xe3, 0xca, 0x22, 0x32, 0x0a, 0xe4, 0x51, + 0x78, 0xff, 0xf1, 0x25, 0xfc, 0x94, 0x90, 0x07, 0x85, 0x71, 0x00, 0xbd, 0x4f, 0xf8, 0x6d, 0xf4, + 0xf6, 0xa8, 0x98, 0x00, 0x14, 0xdb, 0x05, 0xa2, 0xf2, 0xfb, 0xb8, 0xb3, 0x02, 0x8d, 0x2d, 0xfa, + 0x7e, 0x70, 0x01, 0xb3, 0x37, 0xfe, 0x20, 0x11, 0xfd, 0x82, 0x87, 0xfe, 0x58, 0x5e, 0xfd, 0x71, + 0x6a, 0x00, 0x41, 0x1b, 0xfd, 0x14, 0x33, 0xff, 0xd7, 0x4e, 0xff, 0x7b, 0x15, 0x03, 0xb8, 0x30, + 0xff, 0xdc, 0x19, 0x01, 0x08, 0x2f, 0xff, 0xff, 0x82, 0xfd, 0x61, 0x14, 0xff, 0xfb, 0xeb, 0xfd, + 0x30, 0xf4, 0xfe, 0x44, 0x21, 0x00, 0x5d, 0x4a, 0x40, 0xf4, 0x3a, 0x20, 0xed, 0xd5, 0xe4, 0x78, + 0xe5, 0xff, 0xef, 0x9f, 0xf9, 0x41, 0x9f, 0x08, 0x01, 0xd4, 0x00, 0x39, 0x86, 0xf7, 0xd5, 0x87, + 0xf7, 0x6e, 0xb6, 0x01, 0x04, 0x9d, 0x04, 0xf3, 0x66, 0xfc, 0xae, 0x25, 0x04, 0x3b, 0x72, 0xf9, + 0xa2, 0xea, 0x01, 0x27, 0x6d, 0xfe, 0xcb, 0xce, 0xfb, 0x76, 0xec, 0xfe, 0x70, 0x4f, 0xfd, 0xf5, + 0x0e, 0x00, 0x4a, 0xc0, 0xfd, 0xde, 0x53, 0xff, 0xa6, 0x5b, 0xff, 0x7b, 0x2e, 0x03, 0xa9, 0x7c, + 0xff, 0x05, 0xfb, 0x00, 0x0d, 0x16, 0xff, 0x7c, 0x59, 0xfd, 0xc9, 0x29, 0xff, 0x83, 0xf1, 0xfd, + 0x6b, 0xc4, 0xfe, 0xd2, 0x54, 0x00, 0x81, 0xd8, 0x3e, 0x84, 0xa3, 0x1e, 0xec, 0xb9, 0xe6, 0xb0, + 0x89, 0xff, 0xfd, 0x10, 0xf7, 0xdf, 0x2e, 0x0a, 0x35, 0x79, 0x01, 0x2e, 0xc8, 0xf6, 0xd5, 0x91, + 0xf8, 0x5c, 0xf1, 0x01, 0x41, 0x54, 0x03, 0x8f, 0xc0, 0xfd, 0xbd, 0xa5, 0x04, 0x46, 0x09, 0xf9, + 0xdf, 0x17, 0x02, 0x8e, 0xbb, 0xfd, 0x34, 0xcd, 0xfb, 0x7f, 0x23, 0xff, 0x2a, 0x22, 0xfd, 0x6e, + 0x8a, 0x00, 0xc5, 0x40, 0xfe, 0x38, 0x05, 0xff, 0x0f, 0x44, 0xff, 0xe6, 0x94, 0x03, 0x0b, 0x4c, + 0xff, 0x82, 0xc9, 0x00, 0xac, 0x1d, 0xff, 0x6e, 0x45, 0xfd, 0xe3, 0x72, 0xff, 0xf9, 0xb5, 0xfd, + 0x49, 0xdb, 0xfe, 0x08, 0x9e, 0x00, 0xd2, 0x72, 0x3b, 0x76, 0xa2, 0x1d, 0x49, 0xb6, 0xe9, 0xed, + 0xa0, 0xfe, 0x20, 0x55, 0xf5, 0x00, 0x2d, 0x0b, 0xcb, 0x5f, 0x02, 0x3c, 0xdf, 0xf6, 0x68, 0x08, + 0xf9, 0xc4, 0xee, 0x01, 0xb0, 0xd9, 0x02, 0xdc, 0x3b, 0xfe, 0x72, 0x29, 0x05, 0x1e, 0xbb, 0xf8, + 0x93, 0x42, 0x01, 0x35, 0x5f, 0xfe, 0x60, 0x7f, 0xfb, 0xf5, 0x86, 0xff, 0xc9, 0xa3, 0xfd, 0x47, + 0xbd, 0x00, 0xa5, 0x73, 0xfe, 0x52, 0xca, 0xfe, 0xea, 0x47, 0xff, 0x29, 0x81, 0x03, 0x07, 0x2d, + 0xff, 0x18, 0x6a, 0x00, 0xc1, 0x9b, 0xff, 0xc9, 0x3a, 0xfd, 0x4d, 0x7b, 0xff, 0x59, 0xcb, 0xfd, + 0x77, 0x36, 0xff, 0xfb, 0x90, 0x00, 0x86, 0x07, 0x37, 0xdd, 0x12, 0x1c, 0x44, 0x2d, 0xee, 0x56, + 0x75, 0xfd, 0x96, 0x76, 0xf4, 0xcf, 0x40, 0x0b, 0x71, 0x8a, 0x03, 0x47, 0x57, 0xf7, 0x50, 0x7e, + 0xf9, 0xf8, 0x5b, 0x02, 0x0d, 0x64, 0x01, 0x63, 0x4f, 0xff, 0x4f, 0xcc, 0x04, 0x76, 0x74, 0xf8, + 0x9d, 0x3e, 0x01, 0x19, 0x86, 0xfe, 0xea, 0xed, 0xfb, 0xc3, 0xe5, 0xff, 0x00, 0x5c, 0xfe, 0x8e, + 0x68, 0x00, 0x9e, 0xc7, 0xfe, 0x58, 0xcc, 0xfe, 0x0d, 0x11, 0xff, 0x58, 0x1c, 0x03, 0xf1, 0x10, + 0xff, 0xd6, 0x88, 0x00, 0xec, 0xd1, 0xff, 0x38, 0x4a, 0xfd, 0x66, 0x9b, 0xff, 0x26, 0x47, 0xfe, + 0xe7, 0x31, 0xff, 0xa1, 0x88, 0x00, 0x68, 0xfd, 0x30, 0x6f, 0x71, 0x1b, 0xa5, 0x9b, 0xf2, 0x88, + 0xb1, 0xfc, 0x48, 0x21, 0xf4, 0xd6, 0x90, 0x0a, 0xed, 0x85, 0x04, 0x59, 0x74, 0xf8, 0xe6, 0x71, + 0xfa, 0x9c, 0x63, 0x01, 0x32, 0xed, 0x00, 0x40, 0x86, 0xff, 0x88, 0xf0, 0x03, 0xa4, 0x4b, 0xf9, + 0x8b, 0x95, 0x00, 0x47, 0x2d, 0xff, 0x18, 0x61, 0xfc, 0x18, 0x4a, 0x00, 0x16, 0xb3, 0xfe, 0xff, + 0x05, 0x00, 0x66, 0x58, 0xff, 0x28, 0xc0, 0xfe, 0xdd, 0x83, 0xfe, 0x56, 0x9c, 0x02, 0xb6, 0x6e, + 0xff, 0x08, 0x51, 0x00, 0xec, 0x08, 0x00, 0x5b, 0x96, 0xfd, 0xe7, 0xdd, 0xff, 0xd8, 0x7b, 0xfe, + 0x01, 0x4d, 0xff, 0x37, 0x6a, 0x00, 0xcb, 0x28, 0x28, 0x84, 0xa7, 0x1b, 0x34, 0xa8, 0xf5, 0x98, + 0x17, 0xfd, 0x16, 0x08, 0xfb, 0x5d, 0x99, 0x05, 0x78, 0xfa, 0x00, 0x4c, 0x37, 0xfa, 0xc8, 0xce, + 0xfa, 0x1a, 0x6f, 0x01, 0xe3, 0x1a, 0x02, 0x9e, 0x87, 0xff, 0x99, 0x11, 0x03, 0xf7, 0x0e, 0xfc, + 0x3e, 0xc9, 0x00, 0x0a, 0x0a, 0x00, 0x04, 0x81, 0xfd, 0x4e, 0x9d, 0xff, 0xeb, 0x45, 0xff, 0x6e, + 0x09, 0x00, 0x64, 0xe3, 0xfe, 0x01, 0x32, 0xff, 0x46, 0xee, 0xfe, 0x8f, 0xa3, 0x01, 0x94, 0x51, + 0xff, 0xcc, 0xec, 0xff, 0x8d, 0x56, 0x00, 0x3d, 0x5f, 0xfe, 0x51, 0x39, 0xff, 0xdf, 0xcd, 0xfe, + 0x52, 0xed, 0xfe, 0xa2, 0xb4, 0xff, 0x78, 0x27, 0x22, 0xbd, 0xf8, 0x1a, 0xfb, 0x86, 0xf9, 0xcc, + 0x29, 0xfc, 0x9e, 0x04, 0xfb, 0x05, 0x46, 0x05, 0x6a, 0x2d, 0x02, 0x3e, 0xb3, 0xfb, 0x12, 0x84, + 0xfb, 0x84, 0x4d, 0x00, 0xc8, 0xcc, 0x01, 0x86, 0xaf, 0xff, 0xa4, 0x84, 0x02, 0x88, 0x08, 0xfd, + 0xb5, 0x2b, 0x00, 0x95, 0x68, 0x00, 0xe1, 0x43, 0xfe, 0xce, 0x01, 0x00, 0xc9, 0xbd, 0xff, 0x6a, + 0x16, 0x00, 0x04, 0x56, 0xff, 0xb4, 0x1a, 0xff, 0x58, 0xa0, 0xfe, 0xaf, 0x3b, 0x01, 0xb4, 0x99, + 0xff, 0x43, 0xd3, 0xff, 0xbe, 0x95, 0x00, 0x12, 0xd8, 0xfe, 0x02, 0x5c, 0xff, 0xdd, 0x00, 0xff, + 0x67, 0x0c, 0xff, 0x00, 0x8d, 0xff, 0xc4, 0x39, 0x1d, 0x2f, 0x11, 0x1a, 0x52, 0x60, 0xfc, 0x9f, + 0xb8, 0xfb, 0xf5, 0x6b, 0xfb, 0x3b, 0x91, 0x04, 0xa3, 0xdf, 0x02, 0xd3, 0x3e, 0xfd, 0xc1, 0x0a, + 0xfc, 0x9a, 0x97, 0xff, 0x6f, 0x95, 0x01, 0xc9, 0xad, 0xff, 0x4c, 0x41, 0x02, 0x18, 0xef, 0xfd, + 0x00, 0xe6, 0xff, 0x7b, 0xb0, 0x00, 0xad, 0x14, 0xff, 0x1d, 0x0f, 0x00, 0x73, 0x11, 0x00, 0x10, + 0x6f, 0x00, 0x8b, 0x73, 0xff, 0x9c, 0x45, 0xff, 0x63, 0x95, 0xfe, 0x0a, 0xc1, 0x00, 0x1b, 0xd9, + 0xff, 0xdd, 0xb8, 0xff, 0x42, 0x7a, 0x00, 0x3d, 0x36, 0xff, 0x3f, 0x75, 0xff, 0xc0, 0x2a, 0xff, + 0xeb, 0x45, 0xff, 0xa9, 0x4f, 0xff, 0xd6, 0x88, 0x19, 0xf0, 0x2d, 0x19, 0x79, 0x1d, 0xfe, 0x0b, + 0x76, 0xfb, 0x57, 0xf6, 0xfb, 0xf4, 0xdd, 0x03, 0xb5, 0x32, 0x03, 0x3b, 0x58, 0xfe, 0xd1, 0x91, + 0xfc, 0x14, 0x3a, 0xff, 0xca, 0x6a, 0x01, 0x13, 0xb8, 0xff, 0x9d, 0xec, 0x01, 0x9b, 0xbf, 0xfe, + 0x2a, 0xe9, 0xff, 0x8b, 0xb4, 0x00, 0xdf, 0x9c, 0xff, 0x6e, 0x04, 0x00, 0x51, 0x45, 0x00, 0x5c, + 0xa2, 0x00, 0x7d, 0x8d, 0xff, 0x7a, 0x65, 0xff, 0xfd, 0x8b, 0xfe, 0x60, 0x41, 0x00, 0x64, 0xd1, + 0xff, 0x8b, 0x84, 0xff, 0xcd, 0x24, 0x00, 0x95, 0x93, 0xff, 0x41, 0x8f, 0xff, 0x65, 0x45, 0xff, + 0x69, 0x4b, 0xff, 0xed, 0x27, 0xff, 0x20, 0x31, 0x17, 0x5b, 0x60, 0x18, 0x65, 0x23, 0xff, 0xc8, + 0x5a, 0xfb, 0xbf, 0xa5, 0xfc, 0x28, 0x6f, 0x03, 0xd2, 0x54, 0x03, 0x2b, 0x21, 0xff, 0xb3, 0x11, + 0xfd, 0x1f, 0x2e, 0xff, 0xe9, 0x5f, 0x01, 0xa7, 0x03, 0x00, 0xd8, 0xbb, 0x01, 0x68, 0x54, 0xff, + 0x70, 0x47, 0x00, 0x72, 0x94, 0x00, 0x15, 0xda, 0xff, 0x6e, 0x2c, 0x00, 0x83, 0x5e, 0x00, 0x2c, + 0xa9, 0x00, 0xa6, 0xa5, 0xff, 0x8b, 0x92, 0xff, 0x60, 0x8b, 0xfe, 0x96, 0xcc, 0xff, 0x6a, 0xb8, + 0xff, 0x15, 0x6d, 0xff, 0x5b, 0x17, 0x00, 0xbb, 0xf7, 0xff, 0xc3, 0x90, 0xff, 0x8d, 0x42, 0xff, + 0x1b, 0xab, 0xff, 0xed, 0x3f, 0xff, 0x14, 0x94, 0x15, 0x1e, 0xe5, 0x17, 0x4a, 0xcb, 0xff, 0x6f, + 0x40, 0xfb, 0x55, 0x5d, 0xfd, 0xd1, 0x30, 0x03, 0x86, 0x4e, 0x03, 0xcb, 0xa6, 0xff, 0x49, 0x27, + 0xfd, 0xc6, 0x38, 0xff, 0xc4, 0x6c, 0x01, 0x0c, 0x2f, 0x00, 0x35, 0xd0, 0x01, 0x30, 0x77, 0xff, + 0x6b, 0x8a, 0x00, 0x22, 0xbe, 0x00, 0xb2, 0x90, 0xff, 0xe2, 0x19, 0x00, 0x24, 0x85, 0x00, 0x7c, + 0x7f, 0x00, 0x28, 0x70, 0xff, 0x6f, 0xcf, 0xff, 0x3c, 0x99, 0xfe, 0x74, 0x38, 0xff, 0x07, 0xbb, + 0xff, 0xcf, 0xa9, 0xff, 0x80, 0xe6, 0xff, 0x54, 0xcd, 0xff, 0xf1, 0xd7, 0xff, 0xb5, 0xa2, 0xff, + 0x5a, 0x48, 0xff, 0xbe, 0xc3, 0xff, 0xf0, 0xba, 0x14, 0xb1, 0xb8, 0x17, 0x04, 0x19, 0x00, 0x61, + 0x2e, 0xfb, 0x0a, 0x1c, 0xfe, 0x6d, 0x5a, 0x03, 0x49, 0x04, 0x03, 0xee, 0xe6, 0xff, 0xca, 0x16, + 0xfd, 0x01, 0xe2, 0xfe, 0x52, 0xb9, 0x01, 0xe6, 0x03, 0x00, 0x63, 0xb2, 0x01, 0xfd, 0xf9, 0xff, + 0xf4, 0x5c, 0x00, 0x39, 0xcf, 0x00, 0xe6, 0xb5, 0xff, 0x1c, 0x82, 0xff, 0x17, 0x64, 0x00, 0x25, + 0xc2, 0x00, 0x74, 0x1f, 0xff, 0xf0, 0x6e, 0xff, 0x47, 0xf9, 0xfe, 0xf2, 0x56, 0xff, 0xe6, 0x56, + 0xff, 0x52, 0xba, 0xff, 0xde, 0xbd, 0xff, 0x1d, 0xc6, 0xff, 0xaa, 0x0e, 0x00, 0x0c, 0x4b, 0xff, + 0x9d, 0x58, 0x00, 0x2f, 0x7f, 0x00, 0x37, 0xb2, 0x14, 0xb1, 0xf6, 0x17, 0xa6, 0xe2, 0xff, 0x62, + 0x08, 0xfb, 0x21, 0xd5, 0xfe, 0x29, 0xd9, 0x03, 0x41, 0x04, 0x03, 0x87, 0x7d, 0xff, 0x02, 0x08, + 0xfd, 0x57, 0xb2, 0xfe, 0x46, 0x60, 0x01, 0x2b, 0x01, 0x00, 0xd0, 0x5d, 0x01, 0xaf, 0x19, 0x00, + 0x96, 0xce, 0x00, 0x83, 0xac, 0x00, 0xef, 0x98, 0xff, 0x72, 0xb9, 0xff, 0x90, 0x04, 0x00, 0x56, + 0x56, 0x00, 0x48, 0x59, 0xff, 0x7f, 0x59, 0xff, 0xe8, 0xae, 0xfe, 0x93, 0xa0, 0xff, 0xad, 0xbc, + 0xff, 0xc1, 0x1e, 0xff, 0xf7, 0x9c, 0xff, 0x91, 0x21, 0x00, 0x80, 0x74, 0xff, 0xd6, 0x28, 0x00, + 0x83, 0x07, 0x01, 0x3d, 0x4b, 0xff, 0xca, 0xe4, 0x14, 0x2b, 0xd4, 0x18, 0xa1, 0xcc, 0xff, 0xdc, + 0x85, 0xfa, 0x9f, 0x89, 0xff, 0x91, 0x6e, 0x04, 0x82, 0x28, 0x03, 0x7e, 0x4b, 0xff, 0xf9, 0x83, + 0xfc, 0xe0, 0x85, 0xfe, 0x11, 0x71, 0x01, 0xad, 0x75, 0xff, 0x7e, 0xee, 0x00, 0xd9, 0x37, 0x00, + 0xdf, 0xb4, 0x00, 0xec, 0x0f, 0x01, 0xd2, 0xc0, 0xff, 0xf3, 0x9f, 0xff, 0x99, 0x50, 0x00, 0xa6, + 0x1c, 0x00, 0x40, 0xaf, 0xfe, 0x51, 0x7e, 0xff, 0xdf, 0x0a, 0xff, 0xcc, 0x6c, 0xff, 0xf2, 0x96, + 0xff, 0x1a, 0x97, 0xff, 0xa4, 0xcd, 0xff, 0x09, 0x2f, 0xff, 0x2c, 0xec, 0xff, 0x00, 0x0a, 0x01, + 0x39, 0xf5, 0xff, 0x4c, 0x1e, 0xff, 0xe8, 0x05, 0x16, 0x29, 0xd5, 0x19, 0xb0, 0x3d, 0xff, 0xa6, + 0xe6, 0xf9, 0x20, 0x1d, 0x00, 0x17, 0x21, 0x05, 0x9a, 0x30, 0x03, 0x15, 0x0b, 0xff, 0x06, 0x2a, + 0xfc, 0xf7, 0x3b, 0xfe, 0x80, 0x86, 0x01, 0xec, 0x48, 0xff, 0x1a, 0x58, 0x00, 0x9e, 0xc7, 0xff, + 0x1c, 0xc9, 0x00, 0x4d, 0x09, 0x01, 0xed, 0x91, 0xff, 0xbc, 0x12, 0x00, 0x17, 0x9b, 0x00, 0xc9, + 0xed, 0xff, 0x19, 0x98, 0xfe, 0x98, 0x32, 0xff, 0xa3, 0xa2, 0xfe, 0x6d, 0xca, 0xff, 0x78, 0xd0, + 0xff, 0xec, 0x67, 0xff, 0xbd, 0xd2, 0xff, 0xd8, 0x60, 0xff, 0x26, 0x19, 0x00, 0xdf, 0x9e, 0x00, + 0x4c, 0x96, 0xff, 0x54, 0x30, 0xff, 0xca, 0x9d, 0x17, 0xb1, 0x44, 0x1b, 0x00, 0x44, 0xfe, 0x25, + 0x11, 0xf9, 0xfe, 0xd9, 0x00, 0x61, 0x9e, 0x05, 0x81, 0x08, 0x03, 0x54, 0x9f, 0xfe, 0x24, 0xa6, + 0xfb, 0x22, 0x43, 0xfe, 0xfe, 0xb7, 0x01, 0x1c, 0x05, 0xff, 0x88, 0xbd, 0xff, 0x55, 0x7b, 0xff, + 0x4b, 0xaf, 0x00, 0x4c, 0xa8, 0x00, 0xa8, 0x45, 0xff, 0x4e, 0xff, 0xff, 0x04, 0xd3, 0x00, 0x86, + 0x05, 0x00, 0xb4, 0x8f, 0xfe, 0x8e, 0x18, 0xff, 0x79, 0x6b, 0xfe, 0xff, 0xaf, 0xff, 0x6e, 0x92, + 0xff, 0x1d, 0xb6, 0xff, 0x59, 0xe3, 0xff, 0xb3, 0x1f, 0xff, 0x15, 0x0f, 0x00, 0xe9, 0xc2, 0x00, + 0xa6, 0x68, 0xff, 0xa5, 0x82, 0xfe, 0x23, 0xb9, 0x19, 0x53, 0xe4, 0x1c, 0x0f, 0xf3, 0xfc, 0x61, + 0x58, 0xf8, 0x15, 0xa4, 0x01, 0x3f, 0x1f, 0x06, 0x09, 0x7d, 0x02, 0x13, 0x0e, 0xfe, 0x0f, 0x27, + 0xfb, 0x2e, 0x7b, 0xfe, 0x79, 0x3f, 0x02, 0x6b, 0x8a, 0xfe, 0x44, 0x52, 0xff, 0x17, 0x14, 0xff, + 0xef, 0xbd, 0x00, 0xfa, 0x80, 0x00, 0x5a, 0x92, 0xfe, 0x16, 0xda, 0xff, 0xb9, 0xc9, 0x00, 0x51, + 0xc4, 0xff, 0x8c, 0x94, 0xfe, 0xf3, 0x57, 0xff, 0x91, 0x50, 0xfe, 0xb9, 0xfe, 0xff, 0x64, 0x65, + 0xff, 0x55, 0x31, 0xff, 0xd3, 0xfe, 0xff, 0xf9, 0x5d, 0xff, 0x58, 0x90, 0xff, 0x51, 0x71, 0x00, + 0x54, 0x15, 0x00, 0xda, 0x55, 0xfe, 0x76, 0x6e, 0x1c, 0x9a, 0xa5, 0x1e, 0xfd, 0x46, 0xfb, 0x5a, + 0xdf, 0xf7, 0xa5, 0x78, 0x02, 0xb7, 0x91, 0x06, 0x2d, 0xce, 0x01, 0x22, 0x35, 0xfd, 0xac, 0xc1, + 0xfa, 0x91, 0xe0, 0xfe, 0x6e, 0x0b, 0x03, 0x7f, 0x08, 0xfe, 0x1a, 0xc7, 0xfe, 0x40, 0xf2, 0xfe, + 0xff, 0xc5, 0x00, 0x93, 0x57, 0x00, 0xfe, 0x42, 0xfe, 0xe7, 0x79, 0xff, 0xa7, 0x91, 0x00, 0x29, + 0xa5, 0xff, 0xe8, 0x38, 0xfe, 0xc0, 0xa7, 0xff, 0xe8, 0x7e, 0xfe, 0xdf, 0x49, 0x00, 0xe4, 0xb1, + 0xff, 0x01, 0xdb, 0xfe, 0xaa, 0xb4, 0xff, 0x70, 0x47, 0xff, 0x7c, 0x4e, 0xff, 0x22, 0x15, 0x00, + 0xcd, 0x9d, 0x00, 0x1f, 0xba, 0xfe, 0xcc, 0x79, 0x1f, 0x9f, 0x8d, 0x20, 0xec, 0x94, 0xf9, 0xf0, + 0xc4, 0xf7, 0xed, 0x18, 0x03, 0x0b, 0xd3, 0x06, 0x11, 0x32, 0x01, 0xbf, 0x67, 0xfc, 0x56, 0x79, + 0xfa, 0x29, 0x5e, 0xff, 0x71, 0xe7, 0x03, 0x0c, 0xa4, 0xfd, 0x4f, 0x58, 0xfe, 0x75, 0xd9, 0xfe, + 0x8f, 0x01, 0x01, 0x02, 0x16, 0x00, 0x20, 0x10, 0xfe, 0x93, 0x6e, 0xff, 0x16, 0x2c, 0x00, 0xcf, + 0x94, 0xff, 0x35, 0x1d, 0xfe, 0x85, 0xbc, 0xff, 0x0c, 0xd8, 0xfe, 0x71, 0x8f, 0x00, 0xbe, 0xee, + 0xff, 0x3c, 0x07, 0xff, 0x2e, 0x8f, 0xff, 0xf7, 0xff, 0xfe, 0x9e, 0xe8, 0xfe, 0x8a, 0xc2, 0xff, + 0x94, 0xc7, 0x00, 0x68, 0xd5, 0xff, 0xd9, 0xcd, 0x22, 0xb1, 0x4c, 0x22, 0x73, 0xa9, 0xf7, 0xd2, + 0xe5, 0xf7, 0xd2, 0x30, 0x03, 0xa4, 0x9b, 0x06, 0x84, 0x96, 0x00, 0x79, 0xaf, 0xfb, 0xa0, 0x22, + 0xfa, 0x93, 0xb4, 0xff, 0x97, 0x80, 0x04, 0x07, 0x1a, 0xfd, 0x2a, 0x0f, 0xfe, 0x26, 0xa5, 0xfe, + 0x09, 0x13, 0x01, 0xbb, 0xd1, 0xff, 0xcb, 0xba, 0xfd, 0xef, 0x2e, 0xff, 0x23, 0xe6, 0xff, 0xe7, + 0x82, 0xff, 0x0f, 0xf1, 0xfd, 0x93, 0xcb, 0xff, 0xdd, 0x06, 0xff, 0x3a, 0x96, 0x00, 0x8d, 0xe9, + 0xff, 0x07, 0x51, 0xff, 0xd3, 0x58, 0xff, 0x14, 0xbe, 0xfe, 0x16, 0x7a, 0xfe, 0x30, 0x47, 0xff, + 0xb6, 0x6f, 0x00, 0xba, 0xb0, 0x00, 0x75, 0x29, 0x26, 0x54, 0x0f, 0x24, 0xd2, 0xa8, 0xf5, 0xfc, + 0x75, 0xf8, 0x57, 0xe8, 0x02, 0x4b, 0x02, 0x06, 0xe4, 0x3f, 0x00, 0x4d, 0x47, 0xfb, 0x13, 0xed, + 0xf9, 0x7f, 0xda, 0xff, 0x44, 0xf9, 0x04, 0xfa, 0xb0, 0xfc, 0xee, 0x08, 0xfe, 0x9a, 0x81, 0xfe, + 0xdf, 0x0e, 0x01, 0xbc, 0xb0, 0xff, 0xfd, 0x77, 0xfd, 0xbf, 0xe7, 0xfe, 0xad, 0xc1, 0xff, 0x41, + 0xa7, 0xff, 0x6b, 0xe3, 0xfd, 0xc9, 0x02, 0x00, 0x94, 0x15, 0xff, 0x01, 0x8f, 0x00, 0x62, 0xc8, + 0xff, 0x20, 0xad, 0xff, 0x21, 0x3f, 0xff, 0xa1, 0x8f, 0xfe, 0x4d, 0x59, 0xfe, 0xd5, 0xb4, 0xfe, + 0x17, 0x33, 0x00, 0xf6, 0x06, 0x01, 0xe1, 0xf5, 0x29, 0x2f, 0x22, 0x25, 0x74, 0x09, 0xf3, 0xf4, + 0x64, 0xf9, 0xfd, 0x49, 0x02, 0x7c, 0xf8, 0x04, 0x56, 0xd6, 0xff, 0x3c, 0xee, 0xfa, 0x14, 0x98, + 0xf9, 0xef, 0xce, 0xff, 0xb2, 0x21, 0x05, 0x17, 0x4e, 0xfc, 0x63, 0x34, 0xfe, 0xde, 0x35, 0xfe, + 0x30, 0xf1, 0x00, 0x15, 0x6b, 0xff, 0x4f, 0x2f, 0xfd, 0x42, 0xa2, 0xfe, 0x37, 0xa7, 0xff, 0x9d, + 0x9d, 0xff, 0xef, 0xde, 0xfd, 0x87, 0x25, 0x00, 0x77, 0xc8, 0xfe, 0x76, 0x95, 0x00, 0x37, 0x6e, + 0xff, 0xc2, 0xca, 0xff, 0x0a, 0x46, 0xff, 0xe3, 0x59, 0xfe, 0x33, 0x3d, 0xfe, 0x71, 0x0a, 0xfe, + 0xba, 0x21, 0x00, 0x4d, 0xdd, 0x00, 0x3a, 0x4c, 0x2e, 0x6d, 0x67, 0x25, 0x98, 0xba, 0xef, 0xa8, + 0xe9, 0xfa, 0x71, 0xba, 0x01, 0x42, 0xed, 0x03, 0xdf, 0x3c, 0xff, 0x55, 0xc0, 0xfa, 0x35, 0x3d, + 0xf9, 0x55, 0xd2, 0xff, 0x70, 0x88, 0x05, 0x5e, 0xd3, 0xfb, 0x8f, 0xcf, 0xfe, 0x46, 0x00, 0xfe, + 0xc7, 0xd2, 0x00, 0x39, 0x14, 0xff, 0x98, 0x36, 0xfd, 0x4d, 0xbb, 0xfe, 0x1f, 0x2a, 0xff, 0x53, + 0xe9, 0xff, 0xb0, 0xe4, 0xfd, 0xfe, 0xca, 0xff, 0xdb, 0xcb, 0xfe, 0x61, 0xb0, 0x00, 0x50, 0xff, + 0xfe, 0xf6, 0x1b, 0x00, 0x46, 0x8c, 0xff, 0x65, 0xea, 0xfd, 0x11, 0x45, 0xfe, 0x1c, 0xf8, 0xfd, + 0x70, 0xc5, 0xff, 0x3b, 0x8a, 0x00, 0x44, 0xe7, 0x32, 0xa7, 0x60, 0x24, 0xb0, 0x52, 0xec, 0xca, + 0xf7, 0xfc, 0x13, 0x48, 0x01, 0xf0, 0x05, 0x03, 0x1c, 0x4f, 0xfe, 0x09, 0xbd, 0xfa, 0x18, 0xba, + 0xf8, 0xd2, 0x87, 0x00, 0x34, 0xd7, 0x05, 0x4d, 0x43, 0xfb, 0x36, 0x0d, 0x00, 0x4c, 0x95, 0xfd, + 0x30, 0xb7, 0x00, 0x04, 0x0e, 0xff, 0xe0, 0xbe, 0xfd, 0x5c, 0x4c, 0xfe, 0x88, 0xf2, 0xfe, 0x80, + 0x4d, 0x00, 0x1b, 0x2e, 0xfd, 0xde, 0xf6, 0xff, 0x3b, 0xc3, 0xfe, 0xd0, 0xa4, 0x00, 0x99, 0x38, + 0xff, 0x34, 0x8d, 0x00, 0xaa, 0x69, 0xff, 0xfa, 0x97, 0xfd, 0x9a, 0xcc, 0xfe, 0xbe, 0xd3, 0xfd, + 0x86, 0x08, 0xff, 0x18, 0x8d, 0x00, 0xed, 0x29, 0x36, 0xea, 0x23, 0x23, 0x4c, 0x58, 0xe9, 0x82, + 0x07, 0xff, 0x2a, 0x86, 0x00, 0x25, 0x2e, 0x02, 0x8b, 0x8a, 0xfd, 0x53, 0x49, 0xfa, 0x42, 0xc1, + 0xf8, 0xe0, 0x3a, 0x01, 0x10, 0xbf, 0x05, 0x5f, 0x40, 0xfb, 0x09, 0x2b, 0x01, 0x46, 0xb9, 0xfc, + 0x64, 0x22, 0x01, 0x45, 0x76, 0xff, 0x53, 0x5b, 0xfd, 0xf5, 0x75, 0xfe, 0x71, 0x48, 0xfe, 0xc9, + 0xfc, 0xff, 0x26, 0x44, 0xfd, 0x6c, 0x95, 0xff, 0xcc, 0xb9, 0xfe, 0x44, 0x6d, 0x01, 0x84, 0x3b, + 0xff, 0x82, 0x79, 0x00, 0xc9, 0x8c, 0xff, 0x8d, 0xb0, 0xfd, 0xef, 0xa1, 0xfe, 0x2d, 0x8a, 0xfd, + 0xc4, 0xd4, 0xfe, 0x78, 0x54, 0x00, 0xb1, 0xd9, 0x37, 0xfe, 0xf8, 0x20, 0x7d, 0x80, 0xe8, 0x34, + 0x95, 0x00, 0x42, 0x34, 0xff, 0x2e, 0x29, 0x02, 0xd3, 0xfe, 0xfc, 0x42, 0x11, 0xfa, 0x11, 0xfe, + 0xf8, 0x33, 0xe9, 0x01, 0x07, 0x96, 0x05, 0x3c, 0x87, 0xfb, 0x54, 0xe9, 0x01, 0x43, 0x97, 0xfc, + 0x49, 0xa3, 0x01, 0xad, 0x4b, 0xff, 0x92, 0xa9, 0xfd, 0x2d, 0xc9, 0xfd, 0xdd, 0xce, 0xfd, 0xc2, + 0x47, 0x00, 0xd5, 0xcd, 0xfc, 0xf0, 0xb8, 0xff, 0x0b, 0x5f, 0xff, 0xc4, 0xb8, 0x01, 0x97, 0x06, + 0xff, 0x38, 0xfa, 0x00, 0x37, 0x9f, 0xff, 0x33, 0x4f, 0xfd, 0xf9, 0x94, 0xfe, 0x76, 0xa6, 0xfd, + 0x02, 0xb2, 0xfe, 0x30, 0x15, 0x00, 0x78, 0x1a, 0x37, 0x35, 0x01, 0x1f, 0x2b, 0xd4, 0xe9, 0x8c, + 0xd2, 0x00, 0xda, 0xa1, 0xfd, 0x58, 0xfe, 0x02, 0x00, 0x63, 0xfd, 0xe4, 0x92, 0xf9, 0x79, 0x5e, + 0xf9, 0xaf, 0xb6, 0x02, 0x59, 0x90, 0x04, 0x1c, 0x56, 0xfc, 0x35, 0x3f, 0x03, 0xd8, 0xd3, 0xfb, + 0xbc, 0x1b, 0x02, 0x58, 0x8f, 0xff, 0xc1, 0xac, 0xfc, 0xa9, 0x4d, 0xfe, 0xc8, 0x8d, 0xfd, 0xba, + 0x05, 0x00, 0x8c, 0x98, 0xfd, 0x61, 0xac, 0xff, 0x1e, 0x73, 0xff, 0xc5, 0x10, 0x02, 0x90, 0x55, + 0xff, 0x2d, 0xd3, 0x00, 0xe2, 0x72, 0xff, 0xc4, 0x5f, 0xfd, 0xa5, 0xa9, 0xfe, 0x38, 0xd0, 0xfd, + 0x6d, 0x9b, 0xfe, 0xc2, 0xfa, 0xff, 0xae, 0xf1, 0x33, 0x57, 0x49, 0x1d, 0xd1, 0x0b, 0xed, 0xa0, + 0xcd, 0xff, 0x42, 0x38, 0xfc, 0x43, 0x6c, 0x04, 0xe1, 0x27, 0xfe, 0xc6, 0x3d, 0xf9, 0xb4, 0xf0, + 0xf9, 0x88, 0x7d, 0x02, 0x08, 0xbe, 0x03, 0xae, 0xd2, 0xfd, 0xc6, 0x4c, 0x03, 0x76, 0xf1, 0xfb, + 0x61, 0xca, 0x01, 0x50, 0x3f, 0xff, 0x76, 0xf9, 0xfc, 0xaf, 0x46, 0xfe, 0x64, 0xfd, 0xfd, 0xc4, + 0x40, 0x00, 0x4a, 0x09, 0xfe, 0x7e, 0x53, 0xff, 0x6a, 0x8b, 0xff, 0x5d, 0x71, 0x02, 0xfc, 0x01, + 0xff, 0xeb, 0x8b, 0x00, 0x6b, 0x9d, 0xff, 0x3d, 0x94, 0xfd, 0x91, 0xd3, 0xfe, 0x9a, 0xe7, 0xfd, + 0x7e, 0xc1, 0xfe, 0x5f, 0x2a, 0x00, 0x52, 0x93, 0x2e, 0x9d, 0x74, 0x1c, 0xf2, 0x23, 0xf1, 0xe0, + 0x34, 0xfe, 0x95, 0x50, 0xfb, 0x0f, 0x53, 0x05, 0x00, 0x7a, 0xff, 0xff, 0x72, 0xf9, 0x41, 0x10, + 0xfa, 0x38, 0x35, 0x02, 0x63, 0xf4, 0x02, 0x2c, 0x86, 0xfe, 0x5d, 0xbe, 0x03, 0xf9, 0x86, 0xfb, + 0xd1, 0x33, 0x01, 0x1e, 0xd3, 0xff, 0x9c, 0xbe, 0xfc, 0x8a, 0x23, 0xff, 0x12, 0x83, 0xfe, 0xe3, + 0x28, 0x00, 0xdb, 0x67, 0xfe, 0x12, 0x18, 0xff, 0x7e, 0x7f, 0xff, 0x92, 0xed, 0x01, 0x3e, 0x0d, + 0xff, 0x56, 0x3a, 0x00, 0x2d, 0xe6, 0xff, 0x8e, 0xe9, 0xfd, 0xc4, 0xe2, 0xfe, 0x9f, 0x5d, 0xfe, + 0x45, 0xfc, 0xfe, 0xc8, 0xd5, 0xff, 0xdf, 0x10, 0x25, 0xa2, 0x3f, 0x1b, 0x3a, 0x6a, 0xf4, 0xe6, + 0xee, 0xfe, 0x70, 0x67, 0x01, 0x6e, 0x18, 0x03, 0x1f, 0xc3, 0xfe, 0x05, 0xa2, 0xfb, 0x45, 0x61, + 0xfb, 0xff, 0xa2, 0x01, 0x25, 0x75, 0x03, 0xb3, 0x68, 0xfe, 0x3e, 0x91, 0x01, 0xc9, 0x2d, 0xfe, + 0xf3, 0x54, 0x01, 0xc2, 0xb9, 0xff, 0x0a, 0xfe, 0xfd, 0x45, 0xa9, 0xfe, 0x3b, 0x69, 0xfe, 0xea, + 0x08, 0x00, 0x8c, 0xb7, 0xfe, 0xd5, 0xa5, 0xff, 0xf4, 0x8f, 0xff, 0x58, 0x98, 0x01, 0xca, 0x8e, + 0xff, 0x9d, 0x2a, 0x00, 0x64, 0xca, 0xff, 0xdc, 0x2d, 0xfe, 0x62, 0xc5, 0xfe, 0xfe, 0x8e, 0xfe, + 0xab, 0xe6, 0xfe, 0xd8, 0x62, 0xff, 0x26, 0xd1, 0x21, 0xc9, 0x64, 0x1b, 0x3a, 0x3d, 0xf6, 0xf0, + 0x5d, 0xfc, 0x9c, 0xbb, 0x00, 0xbf, 0x98, 0x04, 0x3b, 0x42, 0x00, 0x79, 0x2e, 0xfc, 0x48, 0xf9, + 0xfa, 0x99, 0x0f, 0x00, 0x78, 0x1d, 0x03, 0xa6, 0x21, 0xff, 0xe1, 0xca, 0x01, 0xe8, 0x9f, 0xfe, + 0xee, 0x2f, 0x01, 0x26, 0x8f, 0x00, 0x00, 0x4c, 0xfe, 0x2b, 0x41, 0xff, 0x8c, 0x64, 0xff, 0x87, + 0xf3, 0xff, 0x6c, 0xea, 0xfe, 0xb2, 0x62, 0xff, 0x99, 0x00, 0xff, 0xaf, 0x7f, 0x01, 0xc4, 0x98, + 0xff, 0x50, 0xb8, 0xff, 0xef, 0x2f, 0x00, 0xff, 0xa2, 0xfe, 0x16, 0xef, 0xfe, 0x0c, 0xd9, 0xfe, + 0x98, 0x0f, 0xff, 0xb5, 0x88, 0xff, 0xac, 0x1d, 0x1f, 0x5f, 0x9f, 0x1b, 0x1f, 0x01, 0xf8, 0x56, + 0x89, 0xfa, 0x37, 0xea, 0xff, 0xfb, 0xe1, 0x04, 0x98, 0x62, 0x01, 0xad, 0x2e, 0xfd, 0xa6, 0x1d, + 0xfb, 0x8e, 0x1e, 0xff, 0x2a, 0x9f, 0x02, 0x53, 0x6f, 0xff, 0xa3, 0xe0, 0x01, 0xd2, 0x14, 0xff, + 0x52, 0x1d, 0x01, 0x66, 0xf5, 0x00, 0x75, 0xd8, 0xfe, 0x36, 0x5f, 0xff, 0x59, 0xf7, 0xff, 0x1f, + 0x1a, 0x00, 0x09, 0xdc, 0xfe, 0x73, 0x82, 0xff, 0x8c, 0x7a, 0xfe, 0x24, 0xe1, 0x00, 0x78, 0xe8, + 0xff, 0x52, 0x60, 0xff, 0x69, 0x0f, 0x00, 0x59, 0x31, 0xff, 0x33, 0x03, 0xff, 0x75, 0x02, 0xff, + 0x4c, 0x6a, 0xff, 0xb9, 0x60, 0xff, 0xd6, 0x7f, 0x1d, 0x34, 0xf9, 0x1b, 0x67, 0xf6, 0xf8, 0x1f, + 0xad, 0xf9, 0xb7, 0xcc, 0xff, 0xf6, 0xf5, 0x04, 0x33, 0xd2, 0x01, 0x9f, 0x8b, 0xfd, 0xf4, 0x54, + 0xfb, 0x0f, 0xc1, 0xfe, 0xa9, 0x4f, 0x02, 0x22, 0x4d, 0xff, 0xa1, 0xc4, 0x01, 0x33, 0x46, 0xff, + 0xda, 0x2c, 0x01, 0x6a, 0x3b, 0x01, 0xfa, 0xfd, 0xfe, 0xf4, 0x99, 0xff, 0xbd, 0x19, 0x00, 0xe2, + 0xed, 0xff, 0xe4, 0xa0, 0xfe, 0x5a, 0xa4, 0xff, 0xba, 0x48, 0xfe, 0x27, 0x1c, 0x00, 0xff, 0x22, + 0x00, 0x2a, 0x74, 0xff, 0xab, 0xd3, 0xff, 0x1a, 0x49, 0xff, 0xe1, 0x3c, 0xff, 0xbd, 0x14, 0xff, + 0x0f, 0x7c, 0xff, 0xc6, 0x91, 0xff, 0x65, 0x5b, 0x1d, 0x4d, 0x3e, 0x1c, 0x7a, 0xca, 0xf8, 0xa8, + 0x9c, 0xf9, 0x45, 0xdb, 0x00, 0xe7, 0x51, 0x05, 0xa2, 0xba, 0x01, 0x15, 0x28, 0xfd, 0xfe, 0x36, + 0xfb, 0xbe, 0xdb, 0xfe, 0x5d, 0x63, 0x02, 0x39, 0x04, 0xff, 0x6e, 0x09, 0x01, 0x49, 0x8e, 0xff, + 0x1d, 0x12, 0x01, 0xb5, 0x2d, 0x01, 0xc9, 0x46, 0xff, 0x2c, 0xba, 0xff, 0x41, 0x51, 0x00, 0x76, + 0xbe, 0xff, 0x46, 0x2d, 0xfe, 0xfa, 0x4f, 0xff, 0x9a, 0x88, 0xfe, 0x5d, 0x0a, 0x00, 0x14, 0xd7, + 0xff, 0x23, 0xb9, 0xff, 0x00, 0xd1, 0xff, 0x4b, 0x44, 0xff, 0xb7, 0x5c, 0xff, 0x02, 0xd2, 0xfe, + 0x0c, 0x96, 0xff, 0x8f, 0x14, 0x00, 0x77, 0xc7, 0x1e, 0x53, 0x07, 0x1c, 0x34, 0xb9, 0xf7, 0x6e, + 0x91, 0xfa, 0x98, 0x77, 0x02, 0x23, 0xaa, 0x05, 0x47, 0xe7, 0x00, 0xb5, 0x80, 0xfc, 0x2a, 0x21, + 0xfb, 0xed, 0x51, 0xff, 0x4c, 0x9b, 0x02, 0x3e, 0xa7, 0xfe, 0x69, 0x54, 0x00, 0xcd, 0x1b, 0xff, + 0x1c, 0x62, 0x01, 0x73, 0xb2, 0x00, 0x60, 0xde, 0xfe, 0x82, 0x60, 0x00, 0x98, 0x4d, 0x00, 0x3f, + 0x6d, 0xff, 0x63, 0x29, 0xfe, 0x13, 0xef, 0xfe, 0x05, 0x5f, 0xfe, 0x61, 0x6b, 0x00, 0xff, 0xfe, + 0xff, 0xe6, 0x8b, 0xff, 0x72, 0xbc, 0xff, 0x42, 0x7c, 0xff, 0x7f, 0x1d, 0xff, 0x64, 0xac, 0xfe, + 0x02, 0x9e, 0xff, 0xf1, 0x2e, 0x00, 0x06, 0xcd, 0x20, 0x7e, 0x5f, 0x1c, 0xde, 0x9f, 0xf6, 0xae, + 0xfe, 0xfb, 0x13, 0xa9, 0x03, 0xfa, 0xfa, 0x04, 0xe3, 0xd3, 0xff, 0x9b, 0xf7, 0xfb, 0x6e, 0x70, + 0xfb, 0x7b, 0x41, 0x00, 0xfb, 0x17, 0x03, 0x07, 0xff, 0xfd, 0xfa, 0x90, 0xff, 0x3e, 0x1e, 0xff, + 0x05, 0x2b, 0x01, 0x60, 0x0e, 0x00, 0xc8, 0x8f, 0xfe, 0x17, 0xfe, 0xff, 0x14, 0x3c, 0x00, 0xfc, + 0x45, 0xff, 0x5b, 0x28, 0xfe, 0x3e, 0x29, 0xff, 0xc3, 0x80, 0xfe, 0xc2, 0x6a, 0x00, 0x55, 0xc7, + 0xff, 0xf2, 0xf9, 0xff, 0x38, 0x9a, 0xff, 0x38, 0x1e, 0xff, 0xc7, 0xf6, 0xfe, 0xcb, 0x86, 0xfe, + 0x12, 0xa3, 0xff, 0x3c, 0x22, 0x00, 0x5d, 0xa7, 0x23, 0xbb, 0x4a, 0x1d, 0x0f, 0x5d, 0xf5, 0x4e, + 0x2f, 0xfd, 0xf5, 0x63, 0x03, 0x0d, 0x68, 0x03, 0x0c, 0x08, 0xff, 0xfe, 0x07, 0xfc, 0xc9, 0x05, + 0xfc, 0xc6, 0x8f, 0x01, 0x1d, 0x80, 0x03, 0x5f, 0x0e, 0xfd, 0xdd, 0x44, 0xff, 0xdb, 0x12, 0xff, + 0x73, 0xc6, 0x00, 0x91, 0x45, 0xff, 0x9f, 0x51, 0xfe, 0x80, 0x14, 0xff, 0x16, 0xb0, 0xff, 0x1a, + 0x89, 0xff, 0x8a, 0x08, 0xfe, 0xd2, 0xa9, 0xff, 0xd8, 0xe0, 0xfe, 0x84, 0x45, 0x00, 0xec, 0x90, + 0xff, 0x93, 0x4c, 0x00, 0x44, 0x85, 0xff, 0x39, 0x7f, 0xfe, 0x6c, 0xf0, 0xfe, 0x84, 0x55, 0xfe, + 0x06, 0x48, 0xff, 0x3f, 0x34, 0x00, 0xb0, 0x0d, 0x27, 0xa4, 0xdd, 0x1e, 0x25, 0x49, 0xf3, 0xb5, + 0x9f, 0xfd, 0x7e, 0xde, 0x01, 0x62, 0xab, 0x01, 0x80, 0xf5, 0xfe, 0xf1, 0x6e, 0xfc, 0x6a, 0x7e, + 0xfc, 0x5f, 0xa9, 0x02, 0x78, 0xc9, 0x03, 0x64, 0x04, 0xfc, 0x37, 0xcb, 0xff, 0xeb, 0xab, 0xfe, + 0x73, 0xfa, 0xff, 0x6d, 0x40, 0xff, 0x79, 0x80, 0xfd, 0x45, 0x1a, 0xfe, 0x86, 0x8f, 0xff, 0xb4, + 0xac, 0xff, 0x0b, 0xe5, 0xfd, 0x32, 0x1a, 0x00, 0x34, 0xf8, 0xfe, 0xba, 0x31, 0x00, 0x19, 0xc9, + 0xff, 0xa3, 0x4f, 0x00, 0xaa, 0x21, 0xff, 0xe4, 0x3e, 0xfe, 0x91, 0xfc, 0xfe, 0x41, 0xb2, 0xfd, + 0xf7, 0xf5, 0xfe, 0x67, 0x6e, 0x00, 0x63, 0x5e, 0x2a, 0xaa, 0xe5, 0x1e, 0x57, 0x62, 0xf1, 0x1b, + 0x8a, 0xfe, 0xd0, 0x90, 0x00, 0xc3, 0x89, 0x00, 0xe5, 0x0b, 0xff, 0x9e, 0xca, 0xfc, 0x9b, 0xd4, + 0xfc, 0x9a, 0x8b, 0x03, 0x72, 0xd6, 0x03, 0x35, 0xb5, 0xfb, 0x7a, 0xb2, 0x00, 0xe9, 0x09, 0xfe, + 0xa9, 0xd1, 0xff, 0x67, 0x53, 0xff, 0x78, 0xde, 0xfc, 0x9f, 0xae, 0xfd, 0xd7, 0x4f, 0xff, 0xc8, + 0xf8, 0xff, 0x54, 0xf3, 0xfd, 0x51, 0x30, 0x00, 0x89, 0x4f, 0xff, 0xf0, 0x65, 0x00, 0x73, 0x11, + 0x00, 0x3f, 0x49, 0x00, 0xb1, 0xfe, 0xfe, 0xf4, 0x5d, 0xfe, 0xad, 0xa1, 0xfe, 0xfa, 0x6d, 0xfd, + 0xae, 0xf8, 0xfe, 0x58, 0x69, 0x00, 0x99, 0xda, 0x2a, 0xa2, 0x39, 0x1e, 0x2c, 0xce, 0xf0, 0xc3, + 0x80, 0xff, 0xb3, 0x4d, 0x00, 0xa9, 0x35, 0x00, 0xd2, 0x8c, 0xfe, 0xe6, 0x90, 0xfc, 0x18, 0xa9, + 0xfc, 0xd9, 0x99, 0x03, 0xd0, 0x1b, 0x04, 0x88, 0xdd, 0xfb, 0x0f, 0x1b, 0x01, 0x71, 0x3c, 0xfe, + 0xab, 0xb5, 0xff, 0x59, 0x57, 0xff, 0xa6, 0x50, 0xfd, 0x18, 0xeb, 0xfc, 0x83, 0xff, 0xfe, 0xbc, + 0x3c, 0x00, 0x1c, 0x89, 0xfd, 0xb8, 0x85, 0x00, 0x46, 0xb8, 0xff, 0xd7, 0x86, 0x00, 0x11, 0x0a, + 0x00, 0x63, 0x80, 0x00, 0x43, 0x0e, 0xff, 0x8a, 0xf0, 0xfd, 0x6c, 0xa0, 0xfe, 0x31, 0x8c, 0xfd, + 0x31, 0xc9, 0xfe, 0x62, 0x26, 0x00, 0xbd, 0xff, 0x28, 0x01, 0x5a, 0x1c, 0xa0, 0x18, 0xf2, 0x40, + 0xf4, 0xff, 0x8b, 0xf3, 0x00, 0x0d, 0x29, 0x01, 0xd2, 0x26, 0xfe, 0x43, 0x0e, 0xfc, 0xc4, 0x00, + 0xfc, 0x7b, 0x2c, 0x03, 0x97, 0xe8, 0x03, 0x5c, 0xc9, 0xfc, 0x13, 0xa6, 0x01, 0x8c, 0x09, 0xfe, + 0x91, 0x90, 0x00, 0x94, 0x95, 0xff, 0x0e, 0x73, 0xfd, 0x9c, 0x9d, 0xfd, 0x77, 0x59, 0xfe, 0xc9, + 0x07, 0x00, 0x9e, 0x2b, 0xfe, 0xc6, 0x3e, 0x00, 0xbe, 0xe2, 0xff, 0x42, 0xe2, 0x00, 0xde, 0xfe, + 0xff, 0x32, 0x7c, 0x00, 0xaa, 0x21, 0xff, 0x76, 0xfe, 0xfd, 0x61, 0xa6, 0xfe, 0x78, 0x1d, 0xfe, + 0x17, 0xb1, 0xfe, 0xa0, 0xb5, 0xff, 0x77, 0x72, 0x1f, 0xa3, 0x75, 0x1b, 0xc1, 0xdb, 0xf7, 0x24, + 0x51, 0xfe, 0x00, 0x8e, 0x03, 0x5a, 0x96, 0x01, 0x93, 0x47, 0xff, 0x25, 0xfb, 0xfc, 0x42, 0x55, + 0xfd, 0x51, 0xd9, 0x02, 0xbb, 0x4f, 0x03, 0xa0, 0xf8, 0xfd, 0xd4, 0xf2, 0xff, 0x88, 0x7e, 0xff, + 0xb4, 0x61, 0x00, 0x07, 0xd8, 0xff, 0xc3, 0xa6, 0xfe, 0xa2, 0xfb, 0xfd, 0x74, 0x1e, 0xff, 0x57, + 0xd1, 0xff, 0x6d, 0x17, 0xfe, 0x19, 0xf5, 0xff, 0x22, 0xf7, 0xff, 0x12, 0xd5, 0x00, 0x06, 0xc4, + 0x00, 0x9b, 0xaa, 0x00, 0x16, 0x0e, 0xff, 0x74, 0xa7, 0xfd, 0xab, 0x04, 0xfe, 0xd3, 0x8a, 0xfe, + 0x64, 0xdc, 0xff, 0xbd, 0x92, 0x00, 0x06, 0x09, 0x0a, 0x0a, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, + 0x07, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, + 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, + 0x10, 0x11, 0x11, 0x12, 0x14, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, + 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x17, 0x15, 0x15, 0x14, 0x13, 0x12, + 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x1b, 0x18, 0x17, 0x16, 0x15, 0x15, + 0x14, 0x13, 0x12, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, + 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x07, + 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, + 0x10, 0x0f, 0x0e, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x1f, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, + 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, + 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, + 0x04, 0x05, 0x05, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x1b, 0x1b, 0x1a, 0x19, 0x19, 0x18, 0x17, + 0x16, 0x16, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, + 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x04, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, + 0x09, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1f, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, + 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x03, + 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, + 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x1b, 0x1a, 0x19, 0x18, + 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, + 0x08, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, + 0x1b, 0x1d, 0x1d, 0x1d, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, + 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x05, 0x05, + 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, + 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, + 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, + 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, + 0x05, 0x06, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x18, 0x18, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, + 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, + 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x0d, 0x0e, + 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x08, + 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x08, 0x09, 0x0a, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x07, + 0x08, 0x06, +}; diff --git a/build/version.h b/build/version.h index 6210fde..17bddd8 100644 --- a/build/version.h +++ b/build/version.h @@ -1,8 +1,9 @@ /* Define to the library version */ -#define ALSOFT_VERSION "1.19.0" +#define ALSOFT_VERSION "1.20.1" +#define ALSOFT_VERSION_NUM 1,20,1,0 /* Define the branch being built */ -#define ALSOFT_GIT_BRANCH "master" +#define ALSOFT_GIT_BRANCH "UNKNOWN" /* Define the hash of the head commit */ -#define ALSOFT_GIT_COMMIT_HASH "96aacac" +#define ALSOFT_GIT_COMMIT_HASH "unknown" diff --git a/common/albyte.h b/common/albyte.h new file mode 100644 index 0000000..2386463 --- /dev/null +++ b/common/albyte.h @@ -0,0 +1,99 @@ +#ifndef AL_BYTE_H +#define AL_BYTE_H + +#include +#include +#include + +namespace al { + +/* The "canonical" way to store raw byte data. Like C++17's std::byte, it's not + * treated as a character type and does not work with arithmatic ops. Only + * bitwise ops are allowed. + */ +enum class byte : unsigned char { }; + +#define REQUIRES(...) typename std::enable_if<(__VA_ARGS__),bool>::type = true + +template::value)> +inline constexpr T to_integer(al::byte b) noexcept { return T(b); } + + +template::value)> +inline constexpr al::byte operator<<(al::byte lhs, T rhs) noexcept +{ return al::byte(to_integer(lhs) << rhs); } + +template::value)> +inline constexpr al::byte operator>>(al::byte lhs, T rhs) noexcept +{ return al::byte(to_integer(lhs) >> rhs); } + +template::value)> +inline al::byte& operator<<=(al::byte &lhs, T rhs) noexcept +{ lhs = lhs << rhs; return lhs; } + +template::value)> +inline al::byte& operator>>=(al::byte &lhs, T rhs) noexcept +{ lhs = lhs >> rhs; return lhs; } + +#define AL_DECL_OP(op) \ +template::value)> \ +inline constexpr al::byte operator op (al::byte lhs, T rhs) noexcept \ +{ return al::byte(to_integer(lhs) op static_cast(rhs)); } \ +template::value)> \ +inline al::byte& operator op##= (al::byte &lhs, T rhs) noexcept \ +{ lhs = lhs op rhs; return lhs; } \ +inline constexpr al::byte operator op (al::byte lhs, al::byte rhs) noexcept \ +{ return al::byte(lhs op to_integer(rhs)); } \ +inline al::byte& operator op##= (al::byte &lhs, al::byte rhs) noexcept \ +{ lhs = lhs op rhs; return lhs; } + +AL_DECL_OP(|) +AL_DECL_OP(&) +AL_DECL_OP(^) + +#undef AL_DECL_OP + +inline constexpr al::byte operator~(al::byte b) noexcept +{ return al::byte(~to_integer(b)); } + + +template +class bitfield { + static constexpr size_t bits_per_byte{std::numeric_limits::digits}; + static constexpr size_t NumElems{(N+bits_per_byte-1) / bits_per_byte}; + + byte vals[NumElems]{}; + +public: + template + inline void set() noexcept + { + static_assert(b < N, "Bit index out of range"); + vals[b/bits_per_byte] |= 1 << (b%bits_per_byte); + } + template + inline void unset() noexcept + { + static_assert(b < N, "Bit index out of range"); + vals[b/bits_per_byte] &= ~(1 << (b%bits_per_byte)); + } + template + inline bool get() const noexcept + { + static_assert(b < N, "Bit index out of range"); + return (vals[b/bits_per_byte] & (1 << (b%bits_per_byte))) != byte{}; + } + + template 0)> + void set() noexcept + { + set(); + set(); + } +}; + +#undef REQUIRES + +} // namespace al + +#endif /* AL_BYTE_H */ diff --git a/common/alcomplex.c b/common/alcomplex.c deleted file mode 100644 index d4045ae..0000000 --- a/common/alcomplex.c +++ /dev/null @@ -1,92 +0,0 @@ - -#include "config.h" - -#include "alcomplex.h" -#include "math_defs.h" - - -extern inline ALcomplex complex_add(ALcomplex a, ALcomplex b); -extern inline ALcomplex complex_sub(ALcomplex a, ALcomplex b); -extern inline ALcomplex complex_mult(ALcomplex a, ALcomplex b); - -void complex_fft(ALcomplex *FFTBuffer, ALsizei FFTSize, ALdouble Sign) -{ - ALsizei i, j, k, mask, step, step2; - ALcomplex temp, u, w; - ALdouble arg; - - /* Bit-reversal permutation applied to a sequence of FFTSize items */ - for(i = 1;i < FFTSize-1;i++) - { - for(mask = 0x1, j = 0;mask < FFTSize;mask <<= 1) - { - if((i&mask) != 0) - j++; - j <<= 1; - } - j >>= 1; - - if(i < j) - { - temp = FFTBuffer[i]; - FFTBuffer[i] = FFTBuffer[j]; - FFTBuffer[j] = temp; - } - } - - /* Iterative form of Danielson–Lanczos lemma */ - for(i = 1, step = 2;i < FFTSize;i<<=1, step<<=1) - { - step2 = step >> 1; - arg = M_PI / step2; - - w.Real = cos(arg); - w.Imag = sin(arg) * Sign; - - u.Real = 1.0; - u.Imag = 0.0; - - for(j = 0;j < step2;j++) - { - for(k = j;k < FFTSize;k+=step) - { - temp = complex_mult(FFTBuffer[k+step2], u); - FFTBuffer[k+step2] = complex_sub(FFTBuffer[k], temp); - FFTBuffer[k] = complex_add(FFTBuffer[k], temp); - } - - u = complex_mult(u, w); - } - } -} - -void complex_hilbert(ALcomplex *Buffer, ALsizei size) -{ - const ALdouble inverse_size = 1.0/(ALdouble)size; - ALsizei todo, i; - - for(i = 0;i < size;i++) - Buffer[i].Imag = 0.0; - - complex_fft(Buffer, size, 1.0); - - todo = size >> 1; - Buffer[0].Real *= inverse_size; - Buffer[0].Imag *= inverse_size; - for(i = 1;i < todo;i++) - { - Buffer[i].Real *= 2.0*inverse_size; - Buffer[i].Imag *= 2.0*inverse_size; - } - Buffer[i].Real *= inverse_size; - Buffer[i].Imag *= inverse_size; - i++; - - for(;i < size;i++) - { - Buffer[i].Real = 0.0; - Buffer[i].Imag = 0.0; - } - - complex_fft(Buffer, size, -1.0); -} diff --git a/common/alcomplex.cpp b/common/alcomplex.cpp new file mode 100644 index 0000000..e5cbe8a --- /dev/null +++ b/common/alcomplex.cpp @@ -0,0 +1,73 @@ + +#include "config.h" + +#include "alcomplex.h" + +#include +#include +#include +#include + +#include "math_defs.h" + + +void complex_fft(const al::span> buffer, const double sign) +{ + const size_t fftsize{buffer.size()}; + /* Bit-reversal permutation applied to a sequence of FFTSize items */ + for(size_t i{1u};i < fftsize-1;i++) + { + size_t j{0u}; + for(size_t mask{1u};mask < fftsize;mask <<= 1) + { + if((i&mask) != 0) + j++; + j <<= 1; + } + j >>= 1; + + if(i < j) + std::swap(buffer[i], buffer[j]); + } + + /* Iterative form of Danielson–Lanczos lemma */ + size_t step{2u}; + for(size_t i{1u};i < fftsize;i<<=1, step<<=1) + { + const size_t step2{step >> 1}; + double arg{al::MathDefs::Pi() / static_cast(step2)}; + + std::complex w{std::cos(arg), std::sin(arg)*sign}; + std::complex u{1.0, 0.0}; + for(size_t j{0};j < step2;j++) + { + for(size_t k{j};k < fftsize;k+=step) + { + std::complex temp{buffer[k+step2] * u}; + buffer[k+step2] = buffer[k] - temp; + buffer[k] += temp; + } + + u *= w; + } + } +} + +void complex_hilbert(const al::span> buffer) +{ + complex_fft(buffer, 1.0); + + const double inverse_size = 1.0/static_cast(buffer.size()); + auto bufiter = buffer.begin(); + const auto halfiter = bufiter + (buffer.size()>>1); + + *bufiter *= inverse_size; ++bufiter; + bufiter = std::transform(bufiter, halfiter, bufiter, + [inverse_size](const std::complex &c) -> std::complex + { return c * (2.0*inverse_size); }); + *bufiter *= inverse_size; ++bufiter; + + std::fill(bufiter, buffer.end(), std::complex{}); + + complex_fft(buffer, -1.0); +} diff --git a/common/alcomplex.h b/common/alcomplex.h index 2418ce7..12b8643 100644 --- a/common/alcomplex.h +++ b/common/alcomplex.h @@ -1,71 +1,25 @@ #ifndef ALCOMPLEX_H #define ALCOMPLEX_H -#include "AL/al.h" +#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct ALcomplex { - ALdouble Real; - ALdouble Imag; -} ALcomplex; - -/** Addition of two complex numbers. */ -inline ALcomplex complex_add(ALcomplex a, ALcomplex b) -{ - ALcomplex result; - - result.Real = a.Real + b.Real; - result.Imag = a.Imag + b.Imag; - - return result; -} - -/** Subtraction of two complex numbers. */ -inline ALcomplex complex_sub(ALcomplex a, ALcomplex b) -{ - ALcomplex result; - - result.Real = a.Real - b.Real; - result.Imag = a.Imag - b.Imag; - - return result; -} - -/** Multiplication of two complex numbers. */ -inline ALcomplex complex_mult(ALcomplex a, ALcomplex b) -{ - ALcomplex result; - - result.Real = a.Real*b.Real - a.Imag*b.Imag; - result.Imag = a.Imag*b.Real + a.Real*b.Imag; - - return result; -} +#include "alspan.h" /** * Iterative implementation of 2-radix FFT (In-place algorithm). Sign = -1 is - * FFT and 1 is iFFT (inverse). Fills FFTBuffer[0...FFTSize-1] with the - * Discrete Fourier Transform (DFT) of the time domain data stored in - * FFTBuffer[0...FFTSize-1]. FFTBuffer is an array of complex numbers, FFTSize - * MUST BE power of two. + * FFT and 1 is iFFT (inverse). Fills the buffer with the Discrete Fourier + * Transform (DFT) of the time domain data stored in the buffer. The buffer is + * an array of complex numbers, and MUST BE power of two. */ -void complex_fft(ALcomplex *FFTBuffer, ALsizei FFTSize, ALdouble Sign); +void complex_fft(const al::span> buffer, const double sign); /** * Calculate the complex helical sequence (discrete-time analytical signal) of * the given input using the discrete Hilbert transform (In-place algorithm). - * Fills Buffer[0...size-1] with the discrete-time analytical signal stored in - * Buffer[0...size-1]. Buffer is an array of complex numbers, size MUST BE - * power of two. + * Fills the buffer with the discrete-time analytical signal stored in the + * buffer. The buffer is an array of complex numbers and MUST BE power of two, + * and the imaginary components should be cleared to 0. */ -void complex_hilbert(ALcomplex *Buffer, ALsizei size); - -#ifdef __cplusplus -} // extern "C" -#endif +void complex_hilbert(const al::span> buffer); #endif /* ALCOMPLEX_H */ diff --git a/common/alexcpt.cpp b/common/alexcpt.cpp new file mode 100644 index 0000000..5055e34 --- /dev/null +++ b/common/alexcpt.cpp @@ -0,0 +1,30 @@ + +#include "config.h" + +#include "alexcpt.h" + +#include +#include + +#include "opthelpers.h" + + +namespace al { + +backend_exception::backend_exception(ALCenum code, const char *msg, ...) : mErrorCode{code} +{ + va_list args, args2; + va_start(args, msg); + va_copy(args2, args); + int msglen{std::vsnprintf(nullptr, 0, msg, args)}; + if LIKELY(msglen > 0) + { + mMessage.resize(static_cast(msglen)+1); + std::vsnprintf(&mMessage[0], mMessage.length(), msg, args2); + mMessage.pop_back(); + } + va_end(args2); + va_end(args); +} + +} // namespace al diff --git a/common/alexcpt.h b/common/alexcpt.h new file mode 100644 index 0000000..ff09bab --- /dev/null +++ b/common/alexcpt.h @@ -0,0 +1,36 @@ +#ifndef ALEXCPT_H +#define ALEXCPT_H + +#include +#include + +#include "AL/alc.h" + + +#ifdef __GNUC__ +#define ALEXCPT_FORMAT(x, y, z) __attribute__((format(x, (y), (z)))) +#else +#define ALEXCPT_FORMAT(x, y, z) +#endif + + +namespace al { + +class backend_exception final : public std::exception { + std::string mMessage; + ALCenum mErrorCode; + +public: + backend_exception(ALCenum code, const char *msg, ...) ALEXCPT_FORMAT(printf, 3,4); + + const char *what() const noexcept override { return mMessage.c_str(); } + ALCenum errorCode() const noexcept { return mErrorCode; } +}; + +} // namespace al + +#define START_API_FUNC try + +#define END_API_FUNC catch(...) { std::terminate(); } + +#endif /* ALEXCPT_H */ diff --git a/common/alfstream.cpp b/common/alfstream.cpp new file mode 100644 index 0000000..7378c67 --- /dev/null +++ b/common/alfstream.cpp @@ -0,0 +1,147 @@ + +#include "config.h" + +#include "alfstream.h" + +#include "strutils.h" + +#ifdef _WIN32 + +namespace al { + +auto filebuf::underflow() -> int_type +{ + if(mFile != INVALID_HANDLE_VALUE && gptr() == egptr()) + { + // Read in the next chunk of data, and set the pointers on success + DWORD got{}; + if(ReadFile(mFile, mBuffer.data(), static_cast(mBuffer.size()), &got, nullptr)) + setg(mBuffer.data(), mBuffer.data(), mBuffer.data()+got); + } + if(gptr() == egptr()) + return traits_type::eof(); + return traits_type::to_int_type(*gptr()); +} + +auto filebuf::seekoff(off_type offset, std::ios_base::seekdir whence, std::ios_base::openmode mode) -> pos_type +{ + if(mFile == INVALID_HANDLE_VALUE || (mode&std::ios_base::out) || !(mode&std::ios_base::in)) + return traits_type::eof(); + + LARGE_INTEGER fpos{}; + switch(whence) + { + case std::ios_base::beg: + fpos.QuadPart = offset; + if(!SetFilePointerEx(mFile, fpos, &fpos, FILE_BEGIN)) + return traits_type::eof(); + break; + + case std::ios_base::cur: + // If the offset remains in the current buffer range, just + // update the pointer. + if((offset >= 0 && offset < off_type(egptr()-gptr())) || + (offset < 0 && -offset <= off_type(gptr()-eback()))) + { + // Get the current file offset to report the correct read + // offset. + fpos.QuadPart = 0; + if(!SetFilePointerEx(mFile, fpos, &fpos, FILE_CURRENT)) + return traits_type::eof(); + setg(eback(), gptr()+offset, egptr()); + return fpos.QuadPart - off_type(egptr()-gptr()); + } + // Need to offset for the file offset being at egptr() while + // the requested offset is relative to gptr(). + offset -= off_type(egptr()-gptr()); + fpos.QuadPart = offset; + if(!SetFilePointerEx(mFile, fpos, &fpos, FILE_CURRENT)) + return traits_type::eof(); + break; + + case std::ios_base::end: + fpos.QuadPart = offset; + if(!SetFilePointerEx(mFile, fpos, &fpos, FILE_END)) + return traits_type::eof(); + break; + + default: + return traits_type::eof(); + } + setg(nullptr, nullptr, nullptr); + return fpos.QuadPart; +} + +auto filebuf::seekpos(pos_type pos, std::ios_base::openmode mode) -> pos_type +{ + // Simplified version of seekoff + if(mFile == INVALID_HANDLE_VALUE || (mode&std::ios_base::out) || !(mode&std::ios_base::in)) + return traits_type::eof(); + + LARGE_INTEGER fpos{}; + fpos.QuadPart = pos; + if(!SetFilePointerEx(mFile, fpos, &fpos, FILE_BEGIN)) + return traits_type::eof(); + + setg(nullptr, nullptr, nullptr); + return fpos.QuadPart; +} + +filebuf::~filebuf() +{ + if(mFile != INVALID_HANDLE_VALUE) + CloseHandle(mFile); + mFile = INVALID_HANDLE_VALUE; +} + +bool filebuf::open(const wchar_t *filename, std::ios_base::openmode mode) +{ + if((mode&std::ios_base::out) || !(mode&std::ios_base::in)) + return false; + HANDLE f{CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, nullptr)}; + if(f == INVALID_HANDLE_VALUE) return false; + + if(mFile != INVALID_HANDLE_VALUE) + CloseHandle(mFile); + mFile = f; + + setg(nullptr, nullptr, nullptr); + return true; +} +bool filebuf::open(const char *filename, std::ios_base::openmode mode) +{ + std::wstring wname{utf8_to_wstr(filename)}; + return open(wname.c_str(), mode); +} + + +ifstream::ifstream(const wchar_t *filename, std::ios_base::openmode mode) + : std::istream{nullptr} +{ + init(&mStreamBuf); + + // Set the failbit if the file failed to open. + if((mode&std::ios_base::out) || !mStreamBuf.open(filename, mode|std::ios_base::in)) + clear(failbit); +} + +ifstream::ifstream(const char *filename, std::ios_base::openmode mode) + : std::istream{nullptr} +{ + init(&mStreamBuf); + + // Set the failbit if the file failed to open. + if((mode&std::ios_base::out) || !mStreamBuf.open(filename, mode|std::ios_base::in)) + clear(failbit); +} + +/* This is only here to ensure the compiler doesn't define an implicit + * destructor, which it tries to automatically inline and subsequently complain + * it can't inline without excessive code growth. + */ +ifstream::~ifstream() { } + +} // namespace al + +#endif diff --git a/common/alfstream.h b/common/alfstream.h new file mode 100644 index 0000000..046a6e2 --- /dev/null +++ b/common/alfstream.h @@ -0,0 +1,70 @@ +#ifndef AL_FSTREAM_H +#define AL_FSTREAM_H + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +#include + +#include +#include +#include + + +namespace al { + +// Windows' std::ifstream fails with non-ANSI paths since the standard only +// specifies names using const char* (or std::string). MSVC has a non-standard +// extension using const wchar_t* (or std::wstring?) to handle Unicode paths, +// but not all Windows compilers support it. So we have to make our own istream +// that accepts UTF-8 paths and forwards to Unicode-aware I/O functions. +class filebuf final : public std::streambuf { + std::array mBuffer; + HANDLE mFile{INVALID_HANDLE_VALUE}; + + int_type underflow() override; + pos_type seekoff(off_type offset, std::ios_base::seekdir whence, std::ios_base::openmode mode) override; + pos_type seekpos(pos_type pos, std::ios_base::openmode mode) override; + +public: + filebuf() = default; + ~filebuf() override; + + bool open(const wchar_t *filename, std::ios_base::openmode mode); + bool open(const char *filename, std::ios_base::openmode mode); + + bool is_open() const noexcept { return mFile != INVALID_HANDLE_VALUE; } +}; + +// Inherit from std::istream to use our custom streambuf +class ifstream final : public std::istream { + filebuf mStreamBuf; + +public: + ifstream(const wchar_t *filename, std::ios_base::openmode mode = std::ios_base::in); + ifstream(const std::wstring &filename, std::ios_base::openmode mode = std::ios_base::in) + : ifstream(filename.c_str(), mode) { } + ifstream(const char *filename, std::ios_base::openmode mode = std::ios_base::in); + ifstream(const std::string &filename, std::ios_base::openmode mode = std::ios_base::in) + : ifstream(filename.c_str(), mode) { } + ~ifstream() override; + + bool is_open() const noexcept { return mStreamBuf.is_open(); } +}; + +} // namespace al + +#else /* _WIN32 */ + +#include + +namespace al { + +using filebuf = std::filebuf; +using ifstream = std::ifstream; + +} // namespace al + +#endif /* _WIN32 */ + +#endif /* AL_FSTREAM_H */ diff --git a/common/align.h b/common/align.h deleted file mode 100644 index e2dc81d..0000000 --- a/common/align.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef AL_ALIGN_H -#define AL_ALIGN_H - -#if defined(HAVE_STDALIGN_H) && defined(HAVE_C11_ALIGNAS) -#include -#endif - -#ifndef alignas -#if defined(IN_IDE_PARSER) -/* KDevelop has problems with our align macro, so just use nothing for parsing. */ -#define alignas(x) -#elif defined(HAVE_C11_ALIGNAS) -#define alignas _Alignas -#else -/* NOTE: Our custom ALIGN macro can't take a type name like alignas can. For - * maximum compatibility, only provide constant integer values to alignas. */ -#define alignas(_x) ALIGN(_x) -#endif -#endif - -#endif /* AL_ALIGN_H */ diff --git a/common/almalloc.c b/common/almalloc.c deleted file mode 100644 index 0d982ca..0000000 --- a/common/almalloc.c +++ /dev/null @@ -1,110 +0,0 @@ - -#include "config.h" - -#include "almalloc.h" - -#include -#include -#ifdef HAVE_MALLOC_H -#include -#endif -#ifdef HAVE_WINDOWS_H -#include -#else -#include -#endif - - -#ifdef __GNUC__ -#define LIKELY(x) __builtin_expect(!!(x), !0) -#define UNLIKELY(x) __builtin_expect(!!(x), 0) -#else -#define LIKELY(x) (!!(x)) -#define UNLIKELY(x) (!!(x)) -#endif - - -void *al_malloc(size_t alignment, size_t size) -{ -#if defined(HAVE_ALIGNED_ALLOC) - size = (size+(alignment-1))&~(alignment-1); - return aligned_alloc(alignment, size); -#elif defined(HAVE_POSIX_MEMALIGN) - void *ret; - if(posix_memalign(&ret, alignment, size) == 0) - return ret; - return NULL; -#elif defined(HAVE__ALIGNED_MALLOC) - return _aligned_malloc(size, alignment); -#else - char *ret = malloc(size+alignment); - if(ret != NULL) - { - *(ret++) = 0x00; - while(((ptrdiff_t)ret&(alignment-1)) != 0) - *(ret++) = 0x55; - } - return ret; -#endif -} - -void *al_calloc(size_t alignment, size_t size) -{ - void *ret = al_malloc(alignment, size); - if(ret) memset(ret, 0, size); - return ret; -} - -void al_free(void *ptr) -{ -#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) - free(ptr); -#elif defined(HAVE__ALIGNED_MALLOC) - _aligned_free(ptr); -#else - if(ptr != NULL) - { - char *finder = ptr; - do { - --finder; - } while(*finder == 0x55); - free(finder); - } -#endif -} - -size_t al_get_page_size(void) -{ - static size_t psize = 0; - if(UNLIKELY(!psize)) - { -#ifdef HAVE_SYSCONF -#if defined(_SC_PAGESIZE) - if(!psize) psize = sysconf(_SC_PAGESIZE); -#elif defined(_SC_PAGE_SIZE) - if(!psize) psize = sysconf(_SC_PAGE_SIZE); -#endif -#endif /* HAVE_SYSCONF */ -#ifdef _WIN32 - if(!psize) - { - SYSTEM_INFO sysinfo; - memset(&sysinfo, 0, sizeof(sysinfo)); - - GetSystemInfo(&sysinfo); - psize = sysinfo.dwPageSize; - } -#endif - if(!psize) psize = DEF_ALIGN; - } - return psize; -} - -int al_is_sane_alignment_allocator(void) -{ -#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) || defined(HAVE__ALIGNED_MALLOC) - return 1; -#else - return 0; -#endif -} diff --git a/common/almalloc.cpp b/common/almalloc.cpp new file mode 100644 index 0000000..842fb40 --- /dev/null +++ b/common/almalloc.cpp @@ -0,0 +1,67 @@ + +#include "config.h" + +#include "almalloc.h" + +#include +#include +#include +#include +#ifdef HAVE_MALLOC_H +#include +#endif + + +#define ALIGNED_ALLOC_AVAILABLE (__STDC_VERSION__ >= 201112L || __cplusplus >= 201703L) + +void *al_malloc(size_t alignment, size_t size) +{ + assert((alignment & (alignment-1)) == 0); + alignment = std::max(alignment, alignof(std::max_align_t)); + +#if ALIGNED_ALLOC_AVAILABLE + size = (size+(alignment-1))&~(alignment-1); + return aligned_alloc(alignment, size); +#elif defined(HAVE_POSIX_MEMALIGN) + void *ret; + if(posix_memalign(&ret, alignment, size) == 0) + return ret; + return nullptr; +#elif defined(HAVE__ALIGNED_MALLOC) + return _aligned_malloc(size, alignment); +#else + auto *ret = static_cast(malloc(size+alignment)); + if(ret != nullptr) + { + *(ret++) = 0x00; + while((reinterpret_cast(ret)&(alignment-1)) != 0) + *(ret++) = 0x55; + } + return ret; +#endif +} + +void *al_calloc(size_t alignment, size_t size) +{ + void *ret = al_malloc(alignment, size); + if(ret) memset(ret, 0, size); + return ret; +} + +void al_free(void *ptr) noexcept +{ +#if ALIGNED_ALLOC_AVAILABLE || defined(HAVE_POSIX_MEMALIGN) + free(ptr); +#elif defined(HAVE__ALIGNED_MALLOC) + _aligned_free(ptr); +#else + if(ptr != nullptr) + { + auto *finder = static_cast(ptr); + do { + --finder; + } while(*finder == 0x55); + free(finder); + } +#endif +} diff --git a/common/almalloc.h b/common/almalloc.h index a4297cf..1a1e255 100644 --- a/common/almalloc.h +++ b/common/almalloc.h @@ -1,30 +1,310 @@ #ifndef AL_MALLOC_H #define AL_MALLOC_H -#include +#include +#include +#include +#include +#include +#include +#include +#include -#ifdef __cplusplus -extern "C" { -#endif +#include "pragmadefs.h" -/* Minimum alignment required by posix_memalign. */ -#define DEF_ALIGN sizeof(void*) void *al_malloc(size_t alignment, size_t size); void *al_calloc(size_t alignment, size_t size); -void al_free(void *ptr); +void al_free(void *ptr) noexcept; + + +#define DEF_NEWDEL(T) \ + void *operator new(size_t size) \ + { \ + void *ret = al_malloc(alignof(T), size); \ + if(!ret) throw std::bad_alloc(); \ + return ret; \ + } \ + void operator delete(void *block) noexcept { al_free(block); } + +#define DEF_PLACE_NEWDEL() \ + void *operator new(size_t /*size*/, void *ptr) noexcept { return ptr; } \ + void operator delete(void *block, void*) noexcept { al_free(block); } \ + void operator delete(void *block) noexcept { al_free(block); } + +struct FamCount { size_t mCount; }; + +#define DEF_FAM_NEWDEL(T, FamMem) \ + static constexpr size_t Sizeof(size_t count) noexcept \ + { return decltype(FamMem)::Sizeof(count, offsetof(T, FamMem)); } \ + \ + void *operator new(size_t /*size*/, FamCount fam) \ + { \ + if(void *ret{al_malloc(alignof(T), T::Sizeof(fam.mCount))}) \ + return ret; \ + throw std::bad_alloc(); \ + } \ + void operator delete(void *block, FamCount) { al_free(block); } \ + void operator delete(void *block) noexcept { al_free(block); } + + +namespace al { + +#define REQUIRES(...) typename std::enable_if<(__VA_ARGS__),int>::type = 0 + +template +struct allocator { + using value_type = T; + using reference = T&; + using const_reference = const T&; + using pointer = T*; + using const_pointer = const T*; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using is_always_equal = std::true_type; + + template + struct rebind { + using other = allocator; + }; + + allocator() = default; + template + constexpr allocator(const allocator&) noexcept { } + + T *allocate(std::size_t n) + { + if(n > std::numeric_limits::max()/sizeof(T)) throw std::bad_alloc(); + if(auto p = static_cast(al_malloc(alignment, n*sizeof(T)))) return p; + throw std::bad_alloc(); + } + void deallocate(T *p, std::size_t) noexcept { al_free(p); } +}; +template +bool operator==(const allocator&, const allocator&) noexcept { return true; } +template +bool operator!=(const allocator&, const allocator&) noexcept { return false; } -size_t al_get_page_size(void); +template +inline T* assume_aligned(T *ptr) noexcept +{ + static_assert((alignment & (alignment-1)) == 0, "alignment must be a power of 2"); +#ifdef __GNUC__ + return static_cast(__builtin_assume_aligned(ptr, alignment)); +#elif defined(_MSC_VER) + auto ptrval = reinterpret_cast(ptr); + if((ptrval&(alignment-1)) != 0) __assume(0); + return reinterpret_cast(ptrval); +#else + return ptr; +#endif +} -/** - * Returns non-0 if the allocation function has direct alignment handling. - * Otherwise, the standard malloc is used with an over-allocation and pointer - * offset strategy. +/* At least VS 2015 complains that 'ptr' is unused when the given type's + * destructor is trivial (a no-op). So disable that warning for this call. */ -int al_is_sane_alignment_allocator(void); +DIAGNOSTIC_PUSH +msc_pragma(warning(disable : 4100)) +template +inline void destroy_at(T *ptr) { ptr->~T(); } +DIAGNOSTIC_POP -#ifdef __cplusplus +template +inline void destroy(T first, const T end) +{ + while(first != end) + { + al::destroy_at(std::addressof(*first)); + ++first; + } } -#endif + +template::value)> +inline T destroy_n(T first, N count) +{ + if(count != 0) + { + do { + al::destroy_at(std::addressof(*first)); + ++first; + } while(--count); + } + return first; +} + + +template +inline void uninitialized_default_construct(T first, const T last) +{ + using ValueT = typename std::iterator_traits::value_type; + T current{first}; + try { + while(current != last) + { + ::new (static_cast(std::addressof(*current))) ValueT; + ++current; + } + } + catch(...) { + al::destroy(first, current); + throw; + } +} + +template::value)> +inline T uninitialized_default_construct_n(T first, N count) +{ + using ValueT = typename std::iterator_traits::value_type; + T current{first}; + if(count != 0) + { + try { + do { + ::new (static_cast(std::addressof(*current))) ValueT; + ++current; + } while(--count); + } + catch(...) { + al::destroy(first, current); + throw; + } + } + return current; +} + + +template +inline T1 uninitialized_move(T0 first, const T0 last, const T1 output) +{ + using ValueT = typename std::iterator_traits::value_type; + T1 current{output}; + try { + while(first != last) + { + ::new (static_cast(std::addressof(*current))) ValueT{std::move(*first)}; + ++current; + ++first; + } + } + catch(...) { + al::destroy(output, current); + throw; + } + return current; +} + +template::value)> +inline T1 uninitialized_move_n(T0 first, N count, const T1 output) +{ + using ValueT = typename std::iterator_traits::value_type; + T1 current{output}; + if(count != 0) + { + try { + do { + ::new (static_cast(std::addressof(*current))) ValueT{std::move(*first)}; + ++current; + ++first; + } while(--count); + } + catch(...) { + al::destroy(output, current); + throw; + } + } + return current; +} + + +/* std::make_unique was added with C++14, so until we rely on that, make our + * own version. + */ +template +std::unique_ptr make_unique(ArgsT&&...args) +{ return std::unique_ptr{new T{std::forward(args)...}}; } + + +/* A flexible array type. Used either standalone or at the end of a parent + * struct, with placement new, to have a run-time-sized array that's embedded + * with its size. + */ +template +struct FlexArray { + using element_type = T; + using value_type = typename std::remove_cv::type; + using index_type = size_t; + using difference_type = ptrdiff_t; + + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + + const index_type mSize; +DIAGNOSTIC_PUSH +std_pragma("GCC diagnostic ignored \"-Wpedantic\"") +msc_pragma(warning(disable : 4200)) + alignas(alignment) element_type mArray[0]; +DIAGNOSTIC_POP + + static std::unique_ptr Create(index_type count) + { + void *ptr{al_calloc(alignof(FlexArray), Sizeof(count))}; + return std::unique_ptr{new (ptr) FlexArray{count}}; + } + static constexpr index_type Sizeof(index_type count, index_type base=0u) noexcept + { + return base + + std::max(offsetof(FlexArray, mArray) + sizeof(T)*count, sizeof(FlexArray)); + } + + FlexArray(index_type size) : mSize{size} + { al::uninitialized_default_construct_n(mArray, mSize); } + ~FlexArray() { al::destroy_n(mArray, mSize); } + + FlexArray(const FlexArray&) = delete; + FlexArray& operator=(const FlexArray&) = delete; + + index_type size() const noexcept { return mSize; } + bool empty() const noexcept { return mSize == 0; } + + pointer data() noexcept { return mArray; } + const_pointer data() const noexcept { return mArray; } + + reference operator[](index_type i) noexcept { return mArray[i]; } + const_reference operator[](index_type i) const noexcept { return mArray[i]; } + + reference front() noexcept { return mArray[0]; } + const_reference front() const noexcept { return mArray[0]; } + + reference back() noexcept { return mArray[mSize-1]; } + const_reference back() const noexcept { return mArray[mSize-1]; } + + iterator begin() noexcept { return mArray; } + const_iterator begin() const noexcept { return mArray; } + const_iterator cbegin() const noexcept { return mArray; } + iterator end() noexcept { return mArray + mSize; } + const_iterator end() const noexcept { return mArray + mSize; } + const_iterator cend() const noexcept { return mArray + mSize; } + + reverse_iterator rbegin() noexcept { return end(); } + const_reverse_iterator rbegin() const noexcept { return end(); } + const_reverse_iterator crbegin() const noexcept { return cend(); } + reverse_iterator rend() noexcept { return begin(); } + const_reverse_iterator rend() const noexcept { return begin(); } + const_reverse_iterator crend() const noexcept { return cbegin(); } + + DEF_PLACE_NEWDEL() +}; + +#undef REQUIRES + +} // namespace al #endif /* AL_MALLOC_H */ diff --git a/common/alnumeric.h b/common/alnumeric.h new file mode 100644 index 0000000..9158b76 --- /dev/null +++ b/common/alnumeric.h @@ -0,0 +1,347 @@ +#ifndef AL_NUMERIC_H +#define AL_NUMERIC_H + +#include +#include +#ifdef HAVE_INTRIN_H +#include +#endif +#ifdef HAVE_SSE_INTRINSICS +#include +#endif + +#include "opthelpers.h" + + +inline constexpr int64_t operator "" _i64(unsigned long long int n) noexcept { return static_cast(n); } +inline constexpr uint64_t operator "" _u64(unsigned long long int n) noexcept { return static_cast(n); } + + +constexpr inline float minf(float a, float b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline float maxf(float a, float b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline float clampf(float val, float min, float max) noexcept +{ return minf(max, maxf(min, val)); } + +constexpr inline double mind(double a, double b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline double maxd(double a, double b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline double clampd(double val, double min, double max) noexcept +{ return mind(max, maxd(min, val)); } + +constexpr inline unsigned int minu(unsigned int a, unsigned int b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline unsigned int maxu(unsigned int a, unsigned int b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline unsigned int clampu(unsigned int val, unsigned int min, unsigned int max) noexcept +{ return minu(max, maxu(min, val)); } + +constexpr inline int mini(int a, int b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline int maxi(int a, int b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline int clampi(int val, int min, int max) noexcept +{ return mini(max, maxi(min, val)); } + +constexpr inline int64_t mini64(int64_t a, int64_t b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline int64_t maxi64(int64_t a, int64_t b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline int64_t clampi64(int64_t val, int64_t min, int64_t max) noexcept +{ return mini64(max, maxi64(min, val)); } + +constexpr inline uint64_t minu64(uint64_t a, uint64_t b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline uint64_t maxu64(uint64_t a, uint64_t b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline uint64_t clampu64(uint64_t val, uint64_t min, uint64_t max) noexcept +{ return minu64(max, maxu64(min, val)); } + +constexpr inline size_t minz(size_t a, size_t b) noexcept +{ return ((a > b) ? b : a); } +constexpr inline size_t maxz(size_t a, size_t b) noexcept +{ return ((a > b) ? a : b); } +constexpr inline size_t clampz(size_t val, size_t min, size_t max) noexcept +{ return minz(max, maxz(min, val)); } + + +/** Find the next power-of-2 for non-power-of-2 numbers. */ +inline uint32_t NextPowerOf2(uint32_t value) noexcept +{ + if(value > 0) + { + value--; + value |= value>>1; + value |= value>>2; + value |= value>>4; + value |= value>>8; + value |= value>>16; + } + return value+1; +} + +/** Round up a value to the next multiple. */ +inline size_t RoundUp(size_t value, size_t r) noexcept +{ + value += r-1; + return value - (value%r); +} + + +/* Define CTZ macros (count trailing zeros), and POPCNT macros (population + * count/count 1 bits), for 32- and 64-bit integers. The CTZ macros' results + * are *UNDEFINED* if the value is 0. + */ +#ifdef __GNUC__ + +#define POPCNT32 __builtin_popcount +#define CTZ32 __builtin_ctz +#if SIZEOF_LONG == 8 +#define POPCNT64 __builtin_popcountl +#define CTZ64 __builtin_ctzl +#else +#define POPCNT64 __builtin_popcountll +#define CTZ64 __builtin_ctzll +#endif + +#else + +/* There be black magics here. The popcnt method is derived from + * https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel + * while the ctz-utilizing-popcnt algorithm is shown here + * http://www.hackersdelight.org/hdcodetxt/ntz.c.txt + * as the ntz2 variant. These likely aren't the most efficient methods, but + * they're good enough if the GCC built-ins aren't available. + */ +inline int fallback_popcnt32(uint32_t v) +{ + v = v - ((v >> 1) & 0x55555555u); + v = (v & 0x33333333u) + ((v >> 2) & 0x33333333u); + v = (v + (v >> 4)) & 0x0f0f0f0fu; + return (int)((v * 0x01010101u) >> 24); +} +#define POPCNT32 fallback_popcnt32 +inline int fallback_popcnt64(uint64_t v) +{ + v = v - ((v >> 1) & 0x5555555555555555_u64); + v = (v & 0x3333333333333333_u64) + ((v >> 2) & 0x3333333333333333_u64); + v = (v + (v >> 4)) & 0x0f0f0f0f0f0f0f0f_u64; + return (int)((v * 0x0101010101010101_u64) >> 56); +} +#define POPCNT64 fallback_popcnt64 + +#if defined(HAVE_BITSCANFORWARD64_INTRINSIC) + +inline int msvc64_ctz32(uint32_t v) +{ + unsigned long idx = 32; + _BitScanForward(&idx, v); + return (int)idx; +} +#define CTZ32 msvc64_ctz32 +inline int msvc64_ctz64(uint64_t v) +{ + unsigned long idx = 64; + _BitScanForward64(&idx, v); + return (int)idx; +} +#define CTZ64 msvc64_ctz64 + +#elif defined(HAVE_BITSCANFORWARD_INTRINSIC) + +inline int msvc_ctz32(uint32_t v) +{ + unsigned long idx = 32; + _BitScanForward(&idx, v); + return (int)idx; +} +#define CTZ32 msvc_ctz32 +inline int msvc_ctz64(uint64_t v) +{ + unsigned long idx = 64; + if(!_BitScanForward(&idx, (uint32_t)(v&0xffffffff))) + { + if(_BitScanForward(&idx, (uint32_t)(v>>32))) + idx += 32; + } + return (int)idx; +} +#define CTZ64 msvc_ctz64 + +#else + +inline int fallback_ctz32(uint32_t value) +{ return POPCNT32(~value & (value - 1)); } +#define CTZ32 fallback_ctz32 +inline int fallback_ctz64(uint64_t value) +{ return POPCNT64(~value & (value - 1)); } +#define CTZ64 fallback_ctz64 + +#endif +#endif + + +/** + * Fast float-to-int conversion. No particular rounding mode is assumed; the + * IEEE-754 default is round-to-nearest with ties-to-even, though an app could + * change it on its own threads. On some systems, a truncating conversion may + * always be the fastest method. + */ +inline int fastf2i(float f) noexcept +{ +#if defined(HAVE_SSE_INTRINSICS) + return _mm_cvt_ss2si(_mm_set_ss(f)); + +#elif defined(_MSC_VER) && defined(_M_IX86_FP) + + int i; + __asm fld f + __asm fistp i + return i; + +#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) + + int i; +#ifdef __SSE_MATH__ + __asm__("cvtss2si %1, %0" : "=r"(i) : "x"(f)); +#else + __asm__ __volatile__("fistpl %0" : "=m"(i) : "t"(f) : "st"); +#endif + return i; + +#else + + return static_cast(f); +#endif +} +inline unsigned int fastf2u(float f) noexcept +{ return static_cast(fastf2i(f)); } + +/** Converts float-to-int using standard behavior (truncation). */ +inline int float2int(float f) noexcept +{ +#if defined(HAVE_SSE_INTRINSICS) + return _mm_cvtt_ss2si(_mm_set_ss(f)); + +#elif ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ + !defined(__SSE_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0) + int sign, shift, mant; + union { + float f; + int i; + } conv; + + conv.f = f; + sign = (conv.i>>31) | 1; + shift = ((conv.i>>23)&0xff) - (127+23); + + /* Over/underflow */ + if UNLIKELY(shift >= 31 || shift < -23) + return 0; + + mant = (conv.i&0x7fffff) | 0x800000; + if LIKELY(shift < 0) + return (mant >> -shift) * sign; + return (mant << shift) * sign; + +#else + + return static_cast(f); +#endif +} +inline unsigned int float2uint(float f) noexcept +{ return static_cast(float2int(f)); } + +/** Converts double-to-int using standard behavior (truncation). */ +inline int double2int(double d) noexcept +{ +#if defined(HAVE_SSE_INTRINSICS) + return _mm_cvttsd_si32(_mm_set_sd(d)); + +#elif ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ + !defined(__SSE2_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP < 2) + + int sign, shift; + int64_t mant; + union { + double d; + int64_t i64; + } conv; + + conv.d = d; + sign = (conv.i64 >> 63) | 1; + shift = ((conv.i64 >> 52) & 0x7ff) - (1023 + 52); + + /* Over/underflow */ + if UNLIKELY(shift >= 63 || shift < -52) + return 0; + + mant = (conv.i64 & 0xfffffffffffff_i64) | 0x10000000000000_i64; + if LIKELY(shift < 0) + return (int)(mant >> -shift) * sign; + return (int)(mant << shift) * sign; + +#else + + return static_cast(d); +#endif +} + +/** + * Rounds a float to the nearest integral value, according to the current + * rounding mode. This is essentially an inlined version of rintf, although + * makes fewer promises (e.g. -0 or -0.25 rounded to 0 may result in +0). + */ +inline float fast_roundf(float f) noexcept +{ +#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ + !defined(__SSE_MATH__) + + float out; + __asm__ __volatile__("frndint" : "=t"(out) : "0"(f)); + return out; + +#else + + /* Integral limit, where sub-integral precision is not available for + * floats. + */ + static const float ilim[2]{ + 8388608.0f /* 0x1.0p+23 */, + -8388608.0f /* -0x1.0p+23 */ + }; + unsigned int sign, expo; + union { + float f; + unsigned int i; + } conv; + + conv.f = f; + sign = (conv.i>>31)&0x01; + expo = (conv.i>>23)&0xff; + + if UNLIKELY(expo >= 150/*+23*/) + { + /* An exponent (base-2) of 23 or higher is incapable of sub-integral + * precision, so it's already an integral value. We don't need to worry + * about infinity or NaN here. + */ + return f; + } + /* Adding the integral limit to the value (with a matching sign) forces a + * result that has no sub-integral precision, and is consequently forced to + * round to an integral value. Removing the integral limit then restores + * the initial value rounded to the integral. The compiler should not + * optimize this out because of non-associative rules on floating-point + * math (as long as you don't use -fassociative-math, + * -funsafe-math-optimizations, -ffast-math, or -Ofast, in which case this + * may break). + */ + f += ilim[sign]; + return f - ilim[sign]; +#endif +} + +#endif /* AL_NUMERIC_H */ diff --git a/common/aloptional.h b/common/aloptional.h new file mode 100644 index 0000000..269cba0 --- /dev/null +++ b/common/aloptional.h @@ -0,0 +1,149 @@ +#ifndef AL_OPTIONAL_H +#define AL_OPTIONAL_H + +#include +#include +#include + +#include "almalloc.h" + +namespace al { + +#define REQUIRES(...) bool rt_=true, typename std::enable_if::type = true + +struct nullopt_t { }; +struct in_place_t { }; + +constexpr nullopt_t nullopt{}; +constexpr in_place_t in_place{}; + +template +class optional { + bool mHasValue{false}; + union { + char mDummy[sizeof(T)]{}; + T mValue; + }; + + template + void DoConstruct(Args&& ...args) + { + ::new (std::addressof(mValue)) T{std::forward(args)...}; + mHasValue = true; + } + +public: + using value_type = T; + + optional() noexcept = default; + optional(nullopt_t) noexcept { } + template::value)> + optional(const optional &rhs) { if(rhs) DoConstruct(*rhs); } + template::value)> + optional(optional&& rhs) { if(rhs) DoConstruct(std::move(*rhs)); } + template::value)> + explicit optional(in_place_t, Args&& ...args) : mHasValue{true} + , mValue{std::forward(args)...} + { } + template&, Args...>::value)> + explicit optional(in_place_t, std::initializer_list il, Args&& ...args) + : mHasValue{true}, mValue{il, std::forward(args)...} + { } + template::value && + !std::is_same::type, in_place_t>::value && + !std::is_same::type, optional>::value && + std::is_constructible::value)> + constexpr explicit optional(U&& value) : mHasValue{true}, mValue{std::forward(value)} + { } + template::value && + !std::is_same::type, in_place_t>::value && + !std::is_same::type, optional>::value && + !std::is_constructible::value)> + constexpr optional(U&& value) : mHasValue{true}, mValue{std::forward(value)} + { } + ~optional() { if(mHasValue) al::destroy_at(std::addressof(mValue)); } + + optional& operator=(nullopt_t) noexcept { reset(); return *this; } + template::value && std::is_copy_assignable::value)> + optional& operator=(const optional &rhs) + { + if(!rhs) + reset(); + else if(*this) + mValue = *rhs; + else + DoConstruct(*rhs); + return *this; + } + template::value && std::is_move_assignable::value)> + optional& operator=(optional&& rhs) + { + if(!rhs) + reset(); + else if(*this) + mValue = std::move(*rhs); + else + DoConstruct(std::move(*rhs)); + return *this; + } + template::value && + std::is_assignable::value && + !std::is_same::type, optional>::value && + (!std::is_same::type, T>::value || + !std::is_scalar::value))> + optional& operator=(U&& rhs) + { + if(*this) + mValue = std::forward(rhs); + else + DoConstruct(std::forward(rhs)); + return *this; + } + + const T* operator->() const { return std::addressof(mValue); } + T* operator->() { return std::addressof(mValue); } + const T& operator*() const& { return mValue; } + T& operator*() & { return mValue; } + const T&& operator*() const&& { return std::move(mValue); } + T&& operator*() && { return std::move(mValue); } + + operator bool() const noexcept { return mHasValue; } + bool has_value() const noexcept { return mHasValue; } + + T& value() & { return mValue; } + const T& value() const& { return mValue; } + T&& value() && { return std::move(mValue); } + const T&& value() const&& { return std::move(mValue); } + + template + T value_or(U&& defval) const& + { return bool{*this} ? **this : static_cast(std::forward(defval)); } + template + T value_or(U&& defval) && + { return bool{*this} ? std::move(**this) : static_cast(std::forward(defval)); } + + void reset() noexcept + { + if(mHasValue) + al::destroy_at(std::addressof(mValue)); + mHasValue = false; + } +}; + +template +inline optional::type> make_optional(T&& arg) +{ return optional::type>{in_place, std::forward(arg)}; } + +template +inline optional make_optional(Args&& ...args) +{ return optional{in_place, std::forward(args)...}; } + +template +inline optional make_optional(std::initializer_list il, Args&& ...args) +{ return optional{in_place, il, std::forward(args)...}; } + +#undef REQUIRES + +} // namespace al + +#endif /* AL_SPAN_H */ diff --git a/common/alspan.h b/common/alspan.h new file mode 100644 index 0000000..046b7d7 --- /dev/null +++ b/common/alspan.h @@ -0,0 +1,297 @@ +#ifndef AL_SPAN_H +#define AL_SPAN_H + +#include +#include +#include +#include +#include + +namespace al { + +template +constexpr auto size(T &cont) -> decltype(cont.size()) +{ return cont.size(); } + +template +constexpr auto size(const T &cont) -> decltype(cont.size()) +{ return cont.size(); } + +template +constexpr size_t size(T (&)[N]) noexcept +{ return N; } + +template +constexpr size_t size(std::initializer_list list) noexcept +{ return list.size(); } + + +template +constexpr auto data(T &cont) -> decltype(cont.data()) +{ return cont.data(); } + +template +constexpr auto data(const T &cont) -> decltype(cont.data()) +{ return cont.data(); } + +template +constexpr T* data(T (&arr)[N]) noexcept +{ return arr; } + +template +constexpr const T* data(std::initializer_list list) noexcept +{ return list.begin(); } + + +template(-1)> +class span; + +namespace detail_ { + template + struct make_void { using type = void; }; + template + using void_t = typename make_void::type; + + template + struct is_span_ : std::false_type { }; + template + struct is_span_> : std::true_type { }; + template + using is_span = is_span_::type>; + + template + struct is_std_array_ : std::false_type { }; + template + struct is_std_array_> : std::true_type { }; + template + using is_std_array = is_std_array_::type>; + + template + struct has_size_and_data : std::false_type { }; + template + struct has_size_and_data())), decltype(al::data(std::declval()))>> + : std::true_type { }; + + template + using remove_pointer_t = typename std::remove_pointer::type; +} // namespace detail_ + +#define REQUIRES(...) bool rt_=true, typename std::enable_if::type = true +#define IS_VALID_CONTAINER(C) \ + !detail_::is_span::value && !detail_::is_std_array::value && \ + !std::is_array::value && detail_::has_size_and_data::value && \ + std::is_convertible()))>(*)[],element_type(*)[]>::value + +template +class span { + static constexpr size_t dynamic_extent{static_cast(-1)}; + +public: + using element_type = T; + using value_type = typename std::remove_cv::type; + using index_type = size_t; + using difference_type = ptrdiff_t; + + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static constexpr size_t extent{E}; + + template + constexpr span() noexcept { } + constexpr span(pointer ptr, index_type /*count*/) : mData{ptr} { } + constexpr span(pointer first, pointer /*last*/) : mData{first} { } + constexpr span(element_type (&arr)[E]) noexcept : span{al::data(arr), al::size(arr)} { } + constexpr span(std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } + template::value)> + constexpr span(const std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } + template + constexpr span(U &cont) : span{al::data(cont), al::size(cont)} { } + template + constexpr span(const U &cont) : span{al::data(cont), al::size(cont)} { } + template::value && std::is_convertible::value)> + constexpr span(const span &span_) noexcept : span{al::data(span_), al::size(span_)} { } + constexpr span(const span&) noexcept = default; + + span& operator=(const span &rhs) noexcept = default; + + constexpr reference front() const { return *mData; } + constexpr reference back() const { return *(mData+E-1); } + constexpr reference operator[](index_type idx) const { return mData[idx]; } + constexpr pointer data() const noexcept { return mData; } + + constexpr index_type size() const noexcept { return E; } + constexpr index_type size_bytes() const noexcept { return E * sizeof(value_type); } + constexpr bool empty() const noexcept { return E == 0; } + + constexpr iterator begin() const noexcept { return mData; } + constexpr iterator end() const noexcept { return mData+E; } + constexpr const_iterator cbegin() const noexcept { return mData; } + constexpr const_iterator cend() const noexcept { return mData+E; } + + constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; } + constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; } + constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator{cend()}; } + constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator{cbegin()}; } + + template + constexpr span first() const + { + static_assert(E >= C, "New size exceeds original capacity"); + return span{mData, C}; + } + + template + constexpr span last() const + { + static_assert(E >= C, "New size exceeds original capacity"); + return span{mData+(E-C), C}; + } + + template + constexpr span subspan() const + { + static_assert(E >= O, "Offset exceeds extent"); + static_assert(E-O >= RealC, "New size exceeds original capacity"); + return span{mData+O, RealC}; + } + + /* NOTE: Can't declare objects of a specialized template class prior to + * defining the specialization. As a result, these methods need to be + * defined later. + */ + constexpr span first(size_t count) const; + constexpr span last(size_t count) const; + constexpr span subspan(size_t offset, size_t count=dynamic_extent) const; + +private: + pointer mData{nullptr}; +}; + +template +class span(-1)> { + static constexpr size_t dynamic_extent{static_cast(-1)}; + +public: + using element_type = T; + using value_type = typename std::remove_cv::type; + using index_type = size_t; + using difference_type = ptrdiff_t; + + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static constexpr size_t extent{static_cast(-1)}; + + constexpr span() noexcept = default; + constexpr span(pointer ptr, index_type count) : mData{ptr}, mDataEnd{ptr+count} { } + constexpr span(pointer first, pointer last) : mData{first}, mDataEnd{last} { } + template + constexpr span(element_type (&arr)[N]) noexcept : span{al::data(arr), al::size(arr)} { } + template + constexpr span(std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } + template::value)> + constexpr span(const std::array &arr) noexcept : span{al::data(arr), al::size(arr)} { } + template + constexpr span(U &cont) : span{al::data(cont), al::size(cont)} { } + template + constexpr span(const U &cont) : span{al::data(cont), al::size(cont)} { } + template::value || extent != N) && std::is_convertible::value)> + constexpr span(const span &span_) noexcept : span{al::data(span_), al::size(span_)} { } + constexpr span(const span&) noexcept = default; + + span& operator=(const span &rhs) noexcept = default; + + constexpr reference front() const { return *mData; } + constexpr reference back() const { return *(mDataEnd-1); } + constexpr reference operator[](index_type idx) const { return mData[idx]; } + constexpr pointer data() const noexcept { return mData; } + + constexpr index_type size() const noexcept { return static_cast(mDataEnd-mData); } + constexpr index_type size_bytes() const noexcept + { return static_cast(mDataEnd-mData) * sizeof(value_type); } + constexpr bool empty() const noexcept { return mData == mDataEnd; } + + constexpr iterator begin() const noexcept { return mData; } + constexpr iterator end() const noexcept { return mDataEnd; } + constexpr const_iterator cbegin() const noexcept { return mData; } + constexpr const_iterator cend() const noexcept { return mDataEnd; } + + constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; } + constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; } + constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator{cend()}; } + constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator{cbegin()}; } + + template + constexpr span first() const + { return span{mData, C}; } + + constexpr span first(size_t count) const + { return (count >= size()) ? *this : span{mData, mData+count}; } + + template + constexpr span last() const + { return span{mDataEnd-C, C}; } + + constexpr span last(size_t count) const + { return (count >= size()) ? *this : span{mDataEnd-count, mDataEnd}; } + + template + constexpr span subspan() const + { return span{mData+O, (C!=dynamic_extent) ? mData+C : mDataEnd}; } + + constexpr span subspan(size_t offset, size_t count=dynamic_extent) const + { + return (offset > size()) ? span{} : + (count >= size()-offset) ? span{mData+offset, mDataEnd} : + span{mData+offset, mData+offset+count}; + } + +private: + pointer mData{nullptr}; + pointer mDataEnd{nullptr}; +}; + +template +constexpr inline auto span::first(size_t count) const -> span +{ + return (count >= size()) ? span{mData, extent} : + span{mData, count}; +} + +template +constexpr inline auto span::last(size_t count) const -> span +{ + return (count >= size()) ? span{mData, extent} : + span{mData+extent-count, count}; +} + +template +constexpr inline auto span::subspan(size_t offset, size_t count) const -> span +{ + return (offset > size()) ? span{} : + (count >= size()-offset) ? span{mData+offset, mData+extent} : + span{mData+offset, mData+offset+count}; +} + +#undef IS_VALID_CONTAINER +#undef REQUIRES + +} // namespace al + +#endif /* AL_SPAN_H */ diff --git a/common/alstring.cpp b/common/alstring.cpp new file mode 100644 index 0000000..4a84be1 --- /dev/null +++ b/common/alstring.cpp @@ -0,0 +1,45 @@ + +#include "config.h" + +#include "alstring.h" + +#include +#include + + +namespace { + +int to_upper(const char ch) +{ + using char8_traits = std::char_traits; + return std::toupper(char8_traits::to_int_type(ch)); +} + +} // namespace + +namespace al { + +int strcasecmp(const char *str0, const char *str1) noexcept +{ + do { + const int diff{to_upper(*str0) - to_upper(*str1)}; + if(diff < 0) return -1; + if(diff > 0) return 1; + } while(*(str0++) && *(str1++)); + return 0; +} + +int strncasecmp(const char *str0, const char *str1, std::size_t len) noexcept +{ + if(len > 0) + { + do { + const int diff{to_upper(*str0) - to_upper(*str1)}; + if(diff < 0) return -1; + if(diff > 0) return 1; + } while(--len && *(str0++) && *(str1++)); + } + return 0; +} + +} // namespace al diff --git a/common/alstring.h b/common/alstring.h new file mode 100644 index 0000000..194e54a --- /dev/null +++ b/common/alstring.h @@ -0,0 +1,29 @@ +#ifndef AL_STRING_H +#define AL_STRING_H + +#include +#include + +#include "almalloc.h" + + +namespace al { + +template> +using basic_string = std::basic_string>; + +using string = basic_string; +using wstring = basic_string; +using u16string = basic_string; +using u32string = basic_string; + + +/* These would be better served by using a string_view-like span/view with + * case-insensitive char traits. + */ +int strcasecmp(const char *str0, const char *str1) noexcept; +int strncasecmp(const char *str0, const char *str1, std::size_t len) noexcept; + +} // namespace al + +#endif /* AL_STRING_H */ diff --git a/common/atomic.c b/common/atomic.c deleted file mode 100644 index 7a8fe6d..0000000 --- a/common/atomic.c +++ /dev/null @@ -1,10 +0,0 @@ - -#include "config.h" - -#include "atomic.h" - - -extern inline void InitRef(RefCount *ptr, uint value); -extern inline uint ReadRef(RefCount *ptr); -extern inline uint IncrementRef(RefCount *ptr); -extern inline uint DecrementRef(RefCount *ptr); diff --git a/common/atomic.h b/common/atomic.h index 39daa1d..5e9b04c 100644 --- a/common/atomic.h +++ b/common/atomic.h @@ -1,439 +1,33 @@ #ifndef AL_ATOMIC_H #define AL_ATOMIC_H -#include "static_assert.h" -#include "bool.h" +#include -#ifdef __GNUC__ -/* This helps cast away the const-ness of a pointer without accidentally - * changing the pointer type. This is necessary due to Clang's inability to use - * atomic_load on a const _Atomic variable. - */ -#define CONST_CAST(T, V) __extension__({ \ - const T _tmp = (V); \ - (T)_tmp; \ -}) -#else -#define CONST_CAST(T, V) ((T)(V)) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* Atomics using C11 */ -#ifdef HAVE_C11_ATOMIC - -#include - -#define almemory_order memory_order -#define almemory_order_relaxed memory_order_relaxed -#define almemory_order_consume memory_order_consume -#define almemory_order_acquire memory_order_acquire -#define almemory_order_release memory_order_release -#define almemory_order_acq_rel memory_order_acq_rel -#define almemory_order_seq_cst memory_order_seq_cst - -#define ATOMIC(T) T _Atomic -#define ATOMIC_FLAG atomic_flag - -#define ATOMIC_INIT atomic_init -#define ATOMIC_INIT_STATIC ATOMIC_VAR_INIT -/*#define ATOMIC_FLAG_INIT ATOMIC_FLAG_INIT*/ - -#define ATOMIC_LOAD atomic_load_explicit -#define ATOMIC_STORE atomic_store_explicit - -#define ATOMIC_ADD atomic_fetch_add_explicit -#define ATOMIC_SUB atomic_fetch_sub_explicit - -#define ATOMIC_EXCHANGE atomic_exchange_explicit -#define ATOMIC_COMPARE_EXCHANGE_STRONG atomic_compare_exchange_strong_explicit -#define ATOMIC_COMPARE_EXCHANGE_WEAK atomic_compare_exchange_weak_explicit - -#define ATOMIC_FLAG_TEST_AND_SET atomic_flag_test_and_set_explicit -#define ATOMIC_FLAG_CLEAR atomic_flag_clear_explicit - -#define ATOMIC_THREAD_FENCE atomic_thread_fence - -/* Atomics using GCC intrinsics */ -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && !defined(__QNXNTO__) - -enum almemory_order { - almemory_order_relaxed, - almemory_order_consume, - almemory_order_acquire, - almemory_order_release, - almemory_order_acq_rel, - almemory_order_seq_cst -}; - -#define ATOMIC(T) struct { T volatile value; } -#define ATOMIC_FLAG ATOMIC(int) - -#define ATOMIC_INIT(_val, _newval) do { (_val)->value = (_newval); } while(0) -#define ATOMIC_INIT_STATIC(_newval) {(_newval)} -#define ATOMIC_FLAG_INIT ATOMIC_INIT_STATIC(0) - -#define ATOMIC_LOAD(_val, _MO) __extension__({ \ - __typeof((_val)->value) _r = (_val)->value; \ - __asm__ __volatile__("" ::: "memory"); \ - _r; \ -}) -#define ATOMIC_STORE(_val, _newval, _MO) do { \ - __asm__ __volatile__("" ::: "memory"); \ - (_val)->value = (_newval); \ -} while(0) - -#define ATOMIC_ADD(_val, _incr, _MO) __sync_fetch_and_add(&(_val)->value, (_incr)) -#define ATOMIC_SUB(_val, _decr, _MO) __sync_fetch_and_sub(&(_val)->value, (_decr)) - -#define ATOMIC_EXCHANGE(_val, _newval, _MO) __extension__({ \ - __asm__ __volatile__("" ::: "memory"); \ - __sync_lock_test_and_set(&(_val)->value, (_newval)); \ -}) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(_val, _oldval, _newval, _MO1, _MO2) __extension__({ \ - __typeof(*(_oldval)) _o = *(_oldval); \ - *(_oldval) = __sync_val_compare_and_swap(&(_val)->value, _o, (_newval)); \ - *(_oldval) == _o; \ -}) - -#define ATOMIC_FLAG_TEST_AND_SET(_val, _MO) __extension__({ \ - __asm__ __volatile__("" ::: "memory"); \ - __sync_lock_test_and_set(&(_val)->value, 1); \ -}) -#define ATOMIC_FLAG_CLEAR(_val, _MO) __extension__({ \ - __sync_lock_release(&(_val)->value); \ - __asm__ __volatile__("" ::: "memory"); \ -}) - - -#define ATOMIC_THREAD_FENCE(order) do { \ - enum { must_be_constant = (order) }; \ - const int _o = must_be_constant; \ - if(_o > almemory_order_relaxed) \ - __asm__ __volatile__("" ::: "memory"); \ -} while(0) - -/* Atomics using x86/x86-64 GCC inline assembly */ -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -#define WRAP_ADD(S, ret, dest, incr) __asm__ __volatile__( \ - "lock; xadd"S" %0,(%1)" \ - : "=r" (ret) \ - : "r" (dest), "0" (incr) \ - : "memory" \ -) -#define WRAP_SUB(S, ret, dest, decr) __asm__ __volatile__( \ - "lock; xadd"S" %0,(%1)" \ - : "=r" (ret) \ - : "r" (dest), "0" (-(decr)) \ - : "memory" \ -) - -#define WRAP_XCHG(S, ret, dest, newval) __asm__ __volatile__( \ - "lock; xchg"S" %0,(%1)" \ - : "=r" (ret) \ - : "r" (dest), "0" (newval) \ - : "memory" \ -) -#define WRAP_CMPXCHG(S, ret, dest, oldval, newval) __asm__ __volatile__( \ - "lock; cmpxchg"S" %2,(%1)" \ - : "=a" (ret) \ - : "r" (dest), "r" (newval), "0" (oldval) \ - : "memory" \ -) - - -enum almemory_order { - almemory_order_relaxed, - almemory_order_consume, - almemory_order_acquire, - almemory_order_release, - almemory_order_acq_rel, - almemory_order_seq_cst -}; - -#define ATOMIC(T) struct { T volatile value; } - -#define ATOMIC_INIT(_val, _newval) do { (_val)->value = (_newval); } while(0) -#define ATOMIC_INIT_STATIC(_newval) {(_newval)} - -#define ATOMIC_LOAD(_val, _MO) __extension__({ \ - __typeof((_val)->value) _r = (_val)->value; \ - __asm__ __volatile__("" ::: "memory"); \ - _r; \ -}) -#define ATOMIC_STORE(_val, _newval, _MO) do { \ - __asm__ __volatile__("" ::: "memory"); \ - (_val)->value = (_newval); \ -} while(0) - -#define ATOMIC_ADD(_val, _incr, _MO) __extension__({ \ - static_assert(sizeof((_val)->value)==4 || sizeof((_val)->value)==8, "Unsupported size!"); \ - __typeof((_val)->value) _r; \ - if(sizeof((_val)->value) == 4) WRAP_ADD("l", _r, &(_val)->value, _incr); \ - else if(sizeof((_val)->value) == 8) WRAP_ADD("q", _r, &(_val)->value, _incr); \ - _r; \ -}) -#define ATOMIC_SUB(_val, _decr, _MO) __extension__({ \ - static_assert(sizeof((_val)->value)==4 || sizeof((_val)->value)==8, "Unsupported size!"); \ - __typeof((_val)->value) _r; \ - if(sizeof((_val)->value) == 4) WRAP_SUB("l", _r, &(_val)->value, _decr); \ - else if(sizeof((_val)->value) == 8) WRAP_SUB("q", _r, &(_val)->value, _decr); \ - _r; \ -}) - -#define ATOMIC_EXCHANGE(_val, _newval, _MO) __extension__({ \ - __typeof((_val)->value) _r; \ - if(sizeof((_val)->value) == 4) WRAP_XCHG("l", _r, &(_val)->value, (_newval)); \ - else if(sizeof((_val)->value) == 8) WRAP_XCHG("q", _r, &(_val)->value, (_newval)); \ - _r; \ -}) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(_val, _oldval, _newval, _MO1, _MO2) __extension__({ \ - __typeof(*(_oldval)) _old = *(_oldval); \ - if(sizeof((_val)->value) == 4) WRAP_CMPXCHG("l", *(_oldval), &(_val)->value, _old, (_newval)); \ - else if(sizeof((_val)->value) == 8) WRAP_CMPXCHG("q", *(_oldval), &(_val)->value, _old, (_newval)); \ - *(_oldval) == _old; \ -}) - -#define ATOMIC_EXCHANGE_PTR(_val, _newval, _MO) __extension__({ \ - void *_r; \ - if(sizeof(void*) == 4) WRAP_XCHG("l", _r, &(_val)->value, (_newval)); \ - else if(sizeof(void*) == 8) WRAP_XCHG("q", _r, &(_val)->value, (_newval));\ - _r; \ -}) -#define ATOMIC_COMPARE_EXCHANGE_PTR_STRONG(_val, _oldval, _newval, _MO1, _MO2) __extension__({ \ - void *_old = *(_oldval); \ - if(sizeof(void*) == 4) WRAP_CMPXCHG("l", *(_oldval), &(_val)->value, _old, (_newval)); \ - else if(sizeof(void*) == 8) WRAP_CMPXCHG("q", *(_oldval), &(_val)->value, _old, (_newval)); \ - *(_oldval) == _old; \ -}) - -#define ATOMIC_THREAD_FENCE(order) do { \ - enum { must_be_constant = (order) }; \ - const int _o = must_be_constant; \ - if(_o > almemory_order_relaxed) \ - __asm__ __volatile__("" ::: "memory"); \ -} while(0) - -/* Atomics using Windows methods */ -#elif defined(_WIN32) - -#define WIN32_LEAN_AND_MEAN -#include - -/* NOTE: This mess is *extremely* touchy. It lacks quite a bit of safety - * checking due to the lack of multi-statement expressions, typeof(), and C99 - * compound literals. It is incapable of properly exchanging floats, which get - * casted to LONG/int, and could cast away potential warnings. - * - * Unfortunately, it's the only semi-safe way that doesn't rely on C99 (because - * MSVC). - */ - -inline LONG AtomicAdd32(volatile LONG *dest, LONG incr) -{ - return InterlockedExchangeAdd(dest, incr); -} -inline LONGLONG AtomicAdd64(volatile LONGLONG *dest, LONGLONG incr) -{ - return InterlockedExchangeAdd64(dest, incr); -} -inline LONG AtomicSub32(volatile LONG *dest, LONG decr) -{ - return InterlockedExchangeAdd(dest, -decr); -} -inline LONGLONG AtomicSub64(volatile LONGLONG *dest, LONGLONG decr) -{ - return InterlockedExchangeAdd64(dest, -decr); -} - -inline LONG AtomicSwap32(volatile LONG *dest, LONG newval) -{ - return InterlockedExchange(dest, newval); -} -inline LONGLONG AtomicSwap64(volatile LONGLONG *dest, LONGLONG newval) -{ - return InterlockedExchange64(dest, newval); -} -inline void *AtomicSwapPtr(void *volatile *dest, void *newval) -{ - return InterlockedExchangePointer(dest, newval); -} - -inline bool CompareAndSwap32(volatile LONG *dest, LONG newval, LONG *oldval) -{ - LONG old = *oldval; - *oldval = InterlockedCompareExchange(dest, newval, *oldval); - return old == *oldval; -} -inline bool CompareAndSwap64(volatile LONGLONG *dest, LONGLONG newval, LONGLONG *oldval) -{ - LONGLONG old = *oldval; - *oldval = InterlockedCompareExchange64(dest, newval, *oldval); - return old == *oldval; -} -inline bool CompareAndSwapPtr(void *volatile *dest, void *newval, void **oldval) -{ - void *old = *oldval; - *oldval = InterlockedCompareExchangePointer(dest, newval, *oldval); - return old == *oldval; -} - -#define WRAP_ADDSUB(T, _func, _ptr, _amnt) _func((T volatile*)(_ptr), (_amnt)) -#define WRAP_XCHG(T, _func, _ptr, _newval) _func((T volatile*)(_ptr), (_newval)) -#define WRAP_CMPXCHG(T, _func, _ptr, _newval, _oldval) _func((T volatile*)(_ptr), (_newval), (T*)(_oldval)) - - -enum almemory_order { - almemory_order_relaxed, - almemory_order_consume, - almemory_order_acquire, - almemory_order_release, - almemory_order_acq_rel, - almemory_order_seq_cst -}; - -#define ATOMIC(T) struct { T volatile value; } - -#define ATOMIC_INIT(_val, _newval) do { (_val)->value = (_newval); } while(0) -#define ATOMIC_INIT_STATIC(_newval) {(_newval)} - -#define ATOMIC_LOAD(_val, _MO) ((_val)->value) -#define ATOMIC_STORE(_val, _newval, _MO) do { \ - (_val)->value = (_newval); \ -} while(0) - -int _al_invalid_atomic_size(); /* not defined */ -void *_al_invalid_atomic_ptr_size(); /* not defined */ - -#define ATOMIC_ADD(_val, _incr, _MO) \ - ((sizeof((_val)->value)==4) ? WRAP_ADDSUB(LONG, AtomicAdd32, &(_val)->value, (_incr)) : \ - (sizeof((_val)->value)==8) ? WRAP_ADDSUB(LONGLONG, AtomicAdd64, &(_val)->value, (_incr)) : \ - _al_invalid_atomic_size()) -#define ATOMIC_SUB(_val, _decr, _MO) \ - ((sizeof((_val)->value)==4) ? WRAP_ADDSUB(LONG, AtomicSub32, &(_val)->value, (_decr)) : \ - (sizeof((_val)->value)==8) ? WRAP_ADDSUB(LONGLONG, AtomicSub64, &(_val)->value, (_decr)) : \ - _al_invalid_atomic_size()) -#define ATOMIC_EXCHANGE(_val, _newval, _MO) \ - ((sizeof((_val)->value)==4) ? WRAP_XCHG(LONG, AtomicSwap32, &(_val)->value, (_newval)) : \ - (sizeof((_val)->value)==8) ? WRAP_XCHG(LONGLONG, AtomicSwap64, &(_val)->value, (_newval)) : \ - (LONG)_al_invalid_atomic_size()) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(_val, _oldval, _newval, _MO1, _MO2) \ - ((sizeof((_val)->value)==4) ? WRAP_CMPXCHG(LONG, CompareAndSwap32, &(_val)->value, (_newval), (_oldval)) : \ - (sizeof((_val)->value)==8) ? WRAP_CMPXCHG(LONGLONG, CompareAndSwap64, &(_val)->value, (_newval), (_oldval)) : \ - (bool)_al_invalid_atomic_size()) +using RefCount = std::atomic; -#define ATOMIC_EXCHANGE_PTR(_val, _newval, _MO) \ - ((sizeof((_val)->value)==sizeof(void*)) ? AtomicSwapPtr((void*volatile*)&(_val)->value, (_newval)) : \ - _al_invalid_atomic_ptr_size()) -#define ATOMIC_COMPARE_EXCHANGE_PTR_STRONG(_val, _oldval, _newval, _MO1, _MO2)\ - ((sizeof((_val)->value)==sizeof(void*)) ? CompareAndSwapPtr((void*volatile*)&(_val)->value, (_newval), (void**)(_oldval)) : \ - (bool)_al_invalid_atomic_size()) - -#define ATOMIC_THREAD_FENCE(order) do { \ - enum { must_be_constant = (order) }; \ - const int _o = must_be_constant; \ - if(_o > almemory_order_relaxed) \ - _ReadWriteBarrier(); \ -} while(0) - -#else - -#error "No atomic functions available on this platform!" - -#define ATOMIC(T) T - -#define ATOMIC_INIT(_val, _newval) ((void)0) -#define ATOMIC_INIT_STATIC(_newval) (0) - -#define ATOMIC_LOAD(...) (0) -#define ATOMIC_STORE(...) ((void)0) - -#define ATOMIC_ADD(...) (0) -#define ATOMIC_SUB(...) (0) - -#define ATOMIC_EXCHANGE(...) (0) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(...) (0) - -#define ATOMIC_THREAD_FENCE(...) ((void)0) -#endif - -/* If no PTR xchg variants are provided, the normal ones can handle it. */ -#ifndef ATOMIC_EXCHANGE_PTR -#define ATOMIC_EXCHANGE_PTR ATOMIC_EXCHANGE -#define ATOMIC_COMPARE_EXCHANGE_PTR_STRONG ATOMIC_COMPARE_EXCHANGE_STRONG -#define ATOMIC_COMPARE_EXCHANGE_PTR_WEAK ATOMIC_COMPARE_EXCHANGE_WEAK -#endif - -/* If no weak cmpxchg is provided (not all systems will have one), substitute a - * strong cmpxchg. */ -#ifndef ATOMIC_COMPARE_EXCHANGE_WEAK -#define ATOMIC_COMPARE_EXCHANGE_WEAK ATOMIC_COMPARE_EXCHANGE_STRONG -#endif -#ifndef ATOMIC_COMPARE_EXCHANGE_PTR_WEAK -#define ATOMIC_COMPARE_EXCHANGE_PTR_WEAK ATOMIC_COMPARE_EXCHANGE_PTR_STRONG -#endif - -/* If no ATOMIC_FLAG is defined, simulate one with an atomic int using exchange - * and store ops. - */ -#ifndef ATOMIC_FLAG -#define ATOMIC_FLAG ATOMIC(int) -#define ATOMIC_FLAG_INIT ATOMIC_INIT_STATIC(0) -#define ATOMIC_FLAG_TEST_AND_SET(_val, _MO) ATOMIC_EXCHANGE(_val, 1, _MO) -#define ATOMIC_FLAG_CLEAR(_val, _MO) ATOMIC_STORE(_val, 0, _MO) -#endif - - -#define ATOMIC_LOAD_SEQ(_val) ATOMIC_LOAD(_val, almemory_order_seq_cst) -#define ATOMIC_STORE_SEQ(_val, _newval) ATOMIC_STORE(_val, _newval, almemory_order_seq_cst) - -#define ATOMIC_ADD_SEQ(_val, _incr) ATOMIC_ADD(_val, _incr, almemory_order_seq_cst) -#define ATOMIC_SUB_SEQ(_val, _decr) ATOMIC_SUB(_val, _decr, almemory_order_seq_cst) - -#define ATOMIC_EXCHANGE_SEQ(_val, _newval) ATOMIC_EXCHANGE(_val, _newval, almemory_order_seq_cst) -#define ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(_val, _oldval, _newval) \ - ATOMIC_COMPARE_EXCHANGE_STRONG(_val, _oldval, _newval, almemory_order_seq_cst, almemory_order_seq_cst) -#define ATOMIC_COMPARE_EXCHANGE_WEAK_SEQ(_val, _oldval, _newval) \ - ATOMIC_COMPARE_EXCHANGE_WEAK(_val, _oldval, _newval, almemory_order_seq_cst, almemory_order_seq_cst) - -#define ATOMIC_EXCHANGE_PTR_SEQ(_val, _newval) ATOMIC_EXCHANGE_PTR(_val, _newval, almemory_order_seq_cst) -#define ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(_val, _oldval, _newval) \ - ATOMIC_COMPARE_EXCHANGE_PTR_STRONG(_val, _oldval, _newval, almemory_order_seq_cst, almemory_order_seq_cst) -#define ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(_val, _oldval, _newval) \ - ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(_val, _oldval, _newval, almemory_order_seq_cst, almemory_order_seq_cst) - - -typedef unsigned int uint; -typedef ATOMIC(uint) RefCount; - -inline void InitRef(RefCount *ptr, uint value) -{ ATOMIC_INIT(ptr, value); } -inline uint ReadRef(RefCount *ptr) -{ return ATOMIC_LOAD(ptr, almemory_order_acquire); } -inline uint IncrementRef(RefCount *ptr) -{ return ATOMIC_ADD(ptr, 1, almemory_order_acq_rel)+1; } -inline uint DecrementRef(RefCount *ptr) -{ return ATOMIC_SUB(ptr, 1, almemory_order_acq_rel)-1; } +inline void InitRef(RefCount &ref, unsigned int value) +{ ref.store(value, std::memory_order_relaxed); } +inline unsigned int ReadRef(RefCount &ref) +{ return ref.load(std::memory_order_acquire); } +inline unsigned int IncrementRef(RefCount &ref) +{ return ref.fetch_add(1u, std::memory_order_acq_rel)+1u; } +inline unsigned int DecrementRef(RefCount &ref) +{ return ref.fetch_sub(1u, std::memory_order_acq_rel)-1u; } /* WARNING: A livelock is theoretically possible if another thread keeps * changing the head without giving this a chance to actually swap in the new * one (practically impossible with this little code, but...). */ -#define ATOMIC_REPLACE_HEAD(T, _head, _entry) do { \ - T _first = ATOMIC_LOAD(_head, almemory_order_acquire); \ - do { \ - ATOMIC_STORE(&(_entry)->next, _first, almemory_order_relaxed); \ - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(_head, &_first, _entry, \ - almemory_order_acq_rel, almemory_order_acquire) == 0); \ -} while(0) - -#ifdef __cplusplus +template +inline void AtomicReplaceHead(std::atomic &head, T newhead) +{ + T first_ = head.load(std::memory_order_acquire); + do { + newhead->next.store(first_, std::memory_order_relaxed); + } while(!head.compare_exchange_weak(first_, newhead, + std::memory_order_acq_rel, std::memory_order_acquire)); } -#endif #endif /* AL_ATOMIC_H */ diff --git a/common/bool.h b/common/bool.h deleted file mode 100644 index 6f714d0..0000000 --- a/common/bool.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef AL_BOOL_H -#define AL_BOOL_H - -#ifdef HAVE_STDBOOL_H -#include -#endif - -#ifndef bool -#ifdef HAVE_C99_BOOL -#define bool _Bool -#else -#define bool int -#endif -#define false 0 -#define true 1 -#endif - -#endif /* AL_BOOL_H */ diff --git a/common/dynload.cpp b/common/dynload.cpp new file mode 100644 index 0000000..f1c2a7e --- /dev/null +++ b/common/dynload.cpp @@ -0,0 +1,44 @@ + +#include "config.h" + +#include "dynload.h" + +#include "strutils.h" + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include + +void *LoadLib(const char *name) +{ + std::wstring wname{utf8_to_wstr(name)}; + return LoadLibraryW(wname.c_str()); +} +void CloseLib(void *handle) +{ FreeLibrary(static_cast(handle)); } +void *GetSymbol(void *handle, const char *name) +{ return reinterpret_cast(GetProcAddress(static_cast(handle), name)); } + +#elif defined(HAVE_DLFCN_H) + +#include + +void *LoadLib(const char *name) +{ + dlerror(); + void *handle{dlopen(name, RTLD_NOW)}; + const char *err{dlerror()}; + if(err) handle = nullptr; + return handle; +} +void CloseLib(void *handle) +{ dlclose(handle); } +void *GetSymbol(void *handle, const char *name) +{ + dlerror(); + void *sym{dlsym(handle, name)}; + const char *err{dlerror()}; + if(err) sym = nullptr; + return sym; +} +#endif diff --git a/common/dynload.h b/common/dynload.h new file mode 100644 index 0000000..bd9e86f --- /dev/null +++ b/common/dynload.h @@ -0,0 +1,14 @@ +#ifndef AL_DYNLOAD_H +#define AL_DYNLOAD_H + +#if defined(_WIN32) || defined(HAVE_DLFCN_H) + +#define HAVE_DYNLOAD + +void *LoadLib(const char *name); +void CloseLib(void *handle); +void *GetSymbol(void *handle, const char *name); + +#endif + +#endif /* AL_DYNLOAD_H */ diff --git a/common/endiantest.h b/common/endiantest.h new file mode 100644 index 0000000..0a20eb9 --- /dev/null +++ b/common/endiantest.h @@ -0,0 +1,14 @@ +#ifndef AL_ENDIANTEST_H +#define AL_ENDIANTEST_H + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) +#define IS_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#else +static const union { + unsigned int u; + unsigned char b[sizeof(unsigned int)]; +} EndianTest = { 1 }; +#define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1) +#endif + +#endif /* AL_ENDIANTEST_H */ diff --git a/common/intrusive_ptr.h b/common/intrusive_ptr.h new file mode 100644 index 0000000..595c831 --- /dev/null +++ b/common/intrusive_ptr.h @@ -0,0 +1,120 @@ +#ifndef INTRUSIVE_PTR_H +#define INTRUSIVE_PTR_H + +#include "atomic.h" +#include "opthelpers.h" + + +namespace al { + +template +class intrusive_ref { + RefCount mRef{1u}; + +public: + unsigned int add_ref() noexcept { return IncrementRef(mRef); } + unsigned int release() noexcept + { + auto ref = DecrementRef(mRef); + if UNLIKELY(ref == 0) + delete static_cast(this); + return ref; + } + + /** + * Release only if doing so would not bring the object to 0 references and + * delete it. Returns false if the object could not be released. + * + * NOTE: The caller is responsible for handling a failed release, as it + * means the object has no other references and needs to be be deleted + * somehow. + */ + bool releaseIfNoDelete() noexcept + { + auto val = mRef.load(std::memory_order_acquire); + while(val > 1 && !mRef.compare_exchange_strong(val, val-1, std::memory_order_acq_rel)) + { + /* val was updated with the current value on failure, so just try + * again. + */ + } + + return val >= 2; + } +}; + + +template +class intrusive_ptr { + T *mPtr{nullptr}; + +public: + intrusive_ptr() noexcept = default; + intrusive_ptr(const intrusive_ptr &rhs) noexcept : mPtr{rhs.mPtr} + { if(mPtr) mPtr->add_ref(); } + intrusive_ptr(intrusive_ptr&& rhs) noexcept : mPtr{rhs.mPtr} + { rhs.mPtr = nullptr; } + intrusive_ptr(std::nullptr_t) noexcept { } + explicit intrusive_ptr(T *ptr) noexcept : mPtr{ptr} { } + ~intrusive_ptr() { if(mPtr) mPtr->release(); } + + intrusive_ptr& operator=(const intrusive_ptr &rhs) noexcept + { + if(rhs.mPtr) rhs.mPtr->add_ref(); + if(mPtr) mPtr->release(); + mPtr = rhs.mPtr; + return *this; + } + intrusive_ptr& operator=(intrusive_ptr&& rhs) noexcept + { + if(mPtr) + mPtr->release(); + mPtr = rhs.mPtr; + rhs.mPtr = nullptr; + return *this; + } + + operator bool() const noexcept { return mPtr != nullptr; } + + T& operator*() const noexcept { return *mPtr; } + T* operator->() const noexcept { return mPtr; } + T* get() const noexcept { return mPtr; } + + void reset() noexcept + { + if(mPtr) + mPtr->release(); + mPtr = nullptr; + } + + T* release() noexcept + { + T *ret{mPtr}; + mPtr = nullptr; + return ret; + } + + void swap(intrusive_ptr &rhs) noexcept { std::swap(mPtr, rhs.mPtr); } + void swap(intrusive_ptr&& rhs) noexcept { std::swap(mPtr, rhs.mPtr); } +}; + +#define AL_DECL_OP(op) \ +template \ +inline bool operator op(const intrusive_ptr &lhs, const T *rhs) noexcept \ +{ return lhs.get() op rhs; } \ +template \ +inline bool operator op(const T *lhs, const intrusive_ptr &rhs) noexcept \ +{ return lhs op rhs.get(); } + +AL_DECL_OP(==) +AL_DECL_OP(!=) +AL_DECL_OP(<=) +AL_DECL_OP(>=) +AL_DECL_OP(<) +AL_DECL_OP(>) + +#undef AL_DECL_OP + +} // namespace al + +#endif /* INTRUSIVE_PTR_H */ diff --git a/common/math_defs.h b/common/math_defs.h index 99cc62e..0362a95 100644 --- a/common/math_defs.h +++ b/common/math_defs.h @@ -2,58 +2,31 @@ #define AL_MATH_DEFS_H #include -#ifdef HAVE_FLOAT_H -#include -#endif #ifndef M_PI -#define M_PI (3.14159265358979323846) +#define M_PI 3.14159265358979323846 #endif -#define F_PI (3.14159265358979323846f) -#define F_PI_2 (1.57079632679489661923f) -#define F_TAU (6.28318530717958647692f) +constexpr inline float Deg2Rad(float x) noexcept { return x * static_cast(M_PI/180.0); } +constexpr inline float Rad2Deg(float x) noexcept { return x * static_cast(180.0/M_PI); } -#ifndef FLT_EPSILON -#define FLT_EPSILON (1.19209290e-07f) -#endif +namespace al { -#ifndef HUGE_VALF -static const union msvc_inf_hack { - unsigned char b[4]; - float f; -} msvc_inf_union = {{ 0x00, 0x00, 0x80, 0x7F }}; -#define HUGE_VALF (msvc_inf_union.f) -#endif +template +struct MathDefs { }; -#ifndef HAVE_LOG2F -static inline float log2f(float f) -{ - return logf(f) / logf(2.0f); -} -#endif +template<> +struct MathDefs { + static constexpr inline float Pi() noexcept { return static_cast(M_PI); } + static constexpr inline float Tau() noexcept { return static_cast(M_PI * 2.0); } +}; -#ifndef HAVE_CBRTF -static inline float cbrtf(float f) -{ - return powf(f, 1.0f/3.0f); -} -#endif - -#ifndef HAVE_COPYSIGNF -static inline float copysignf(float x, float y) -{ - union { - float f; - unsigned int u; - } ux = { x }, uy = { y }; - ux.u &= 0x7fffffffu; - ux.u |= (uy.u&0x80000000u); - return ux.f; -} -#endif +template<> +struct MathDefs { + static constexpr inline double Pi() noexcept { return M_PI; } + static constexpr inline double Tau() noexcept { return M_PI * 2.0; } +}; -#define DEG2RAD(x) ((float)(x) * (float)(M_PI/180.0)) -#define RAD2DEG(x) ((float)(x) * (float)(180.0/M_PI)) +} // namespace al #endif /* AL_MATH_DEFS_H */ diff --git a/common/opthelpers.h b/common/opthelpers.h new file mode 100644 index 0000000..58578c1 --- /dev/null +++ b/common/opthelpers.h @@ -0,0 +1,39 @@ +#ifndef OPTHELPERS_H +#define OPTHELPERS_H + +#ifdef __has_builtin +#define HAS_BUILTIN __has_builtin +#else +#define HAS_BUILTIN(x) (0) +#endif + +#ifdef __GNUC__ +/* LIKELY optimizes the case where the condition is true. The condition is not + * required to be true, but it can result in more optimal code for the true + * path at the expense of a less optimal false path. + */ +#define LIKELY(x) (__builtin_expect(!!(x), !false)) +/* The opposite of LIKELY, optimizing the case where the condition is false. */ +#define UNLIKELY(x) (__builtin_expect(!!(x), false)) +/* Unlike LIKELY, ASSUME requires the condition to be true or else it invokes + * undefined behavior. It's essentially an assert without actually checking the + * condition at run-time, allowing for stronger optimizations than LIKELY. + */ +#if HAS_BUILTIN(__builtin_assume) +#define ASSUME __builtin_assume +#else +#define ASSUME(x) do { if(!(x)) __builtin_unreachable(); } while(0) +#endif + +#else /* __GNUC__ */ + +#define LIKELY(x) (!!(x)) +#define UNLIKELY(x) (!!(x)) +#ifdef _MSC_VER +#define ASSUME __assume +#else +#define ASSUME(x) ((void)0) +#endif /* _MSC_VER */ +#endif /* __GNUC__ */ + +#endif /* OPTHELPERS_H */ diff --git a/common/polyphase_resampler.cpp b/common/polyphase_resampler.cpp new file mode 100644 index 0000000..b205fe8 --- /dev/null +++ b/common/polyphase_resampler.cpp @@ -0,0 +1,227 @@ + +#include "polyphase_resampler.h" + +#include +#include + +#include "opthelpers.h" + + +namespace { + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#define EPSILON 1e-9 + +using uint = unsigned int; + +/* This is the normalized cardinal sine (sinc) function. + * + * sinc(x) = { 1, x = 0 + * { sin(pi x) / (pi x), otherwise. + */ +double Sinc(const double x) +{ + if UNLIKELY(std::abs(x) < EPSILON) + return 1.0; + return std::sin(M_PI * x) / (M_PI * x); +} + +/* The zero-order modified Bessel function of the first kind, used for the + * Kaiser window. + * + * I_0(x) = sum_{k=0}^inf (1 / k!)^2 (x / 2)^(2 k) + * = sum_{k=0}^inf ((x / 2)^k / k!)^2 + */ +double BesselI_0(const double x) +{ + double term, sum, x2, y, last_sum; + int k; + + // Start at k=1 since k=0 is trivial. + term = 1.0; + sum = 1.0; + x2 = x/2.0; + k = 1; + + // Let the integration converge until the term of the sum is no longer + // significant. + do { + y = x2 / k; + k++; + last_sum = sum; + term *= y * y; + sum += term; + } while(sum != last_sum); + return sum; +} + +/* Calculate a Kaiser window from the given beta value and a normalized k + * [-1, 1]. + * + * w(k) = { I_0(B sqrt(1 - k^2)) / I_0(B), -1 <= k <= 1 + * { 0, elsewhere. + * + * Where k can be calculated as: + * + * k = i / l, where -l <= i <= l. + * + * or: + * + * k = 2 i / M - 1, where 0 <= i <= M. + */ +double Kaiser(const double b, const double k) +{ + if(!(k >= -1.0 && k <= 1.0)) + return 0.0; + return BesselI_0(b * std::sqrt(1.0 - k*k)) / BesselI_0(b); +} + +// Calculates the greatest common divisor of a and b. +uint Gcd(uint x, uint y) +{ + while(y > 0) + { + uint z{y}; + y = x % y; + x = z; + } + return x; +} + +/* Calculates the size (order) of the Kaiser window. Rejection is in dB and + * the transition width is normalized frequency (0.5 is nyquist). + * + * M = { ceil((r - 7.95) / (2.285 2 pi f_t)), r > 21 + * { ceil(5.79 / 2 pi f_t), r <= 21. + * + */ +uint CalcKaiserOrder(const double rejection, const double transition) +{ + double w_t = 2.0 * M_PI * transition; + if LIKELY(rejection > 21.0) + return static_cast(std::ceil((rejection - 7.95) / (2.285 * w_t))); + return static_cast(std::ceil(5.79 / w_t)); +} + +// Calculates the beta value of the Kaiser window. Rejection is in dB. +double CalcKaiserBeta(const double rejection) +{ + if LIKELY(rejection > 50.0) + return 0.1102 * (rejection - 8.7); + if(rejection >= 21.0) + return (0.5842 * std::pow(rejection - 21.0, 0.4)) + + (0.07886 * (rejection - 21.0)); + return 0.0; +} + +/* Calculates a point on the Kaiser-windowed sinc filter for the given half- + * width, beta, gain, and cutoff. The point is specified in non-normalized + * samples, from 0 to M, where M = (2 l + 1). + * + * w(k) 2 p f_t sinc(2 f_t x) + * + * x -- centered sample index (i - l) + * k -- normalized and centered window index (x / l) + * w(k) -- window function (Kaiser) + * p -- gain compensation factor when sampling + * f_t -- normalized center frequency (or cutoff; 0.5 is nyquist) + */ +double SincFilter(const uint l, const double b, const double gain, const double cutoff, + const uint i) +{ + const double x{static_cast(i) - l}; + return Kaiser(b, x / l) * 2.0 * gain * cutoff * Sinc(2.0 * cutoff * x); +} + +} // namespace + +// Calculate the resampling metrics and build the Kaiser-windowed sinc filter +// that's used to cut frequencies above the destination nyquist. +void PPhaseResampler::init(const uint srcRate, const uint dstRate) +{ + const uint gcd{Gcd(srcRate, dstRate)}; + mP = dstRate / gcd; + mQ = srcRate / gcd; + + /* The cutoff is adjusted by half the transition width, so the transition + * ends before the nyquist (0.5). Both are scaled by the downsampling + * factor. + */ + double cutoff, width; + if(mP > mQ) + { + cutoff = 0.475 / mP; + width = 0.05 / mP; + } + else + { + cutoff = 0.475 / mQ; + width = 0.05 / mQ; + } + // A rejection of -180 dB is used for the stop band. Round up when + // calculating the left offset to avoid increasing the transition width. + const uint l{(CalcKaiserOrder(180.0, width)+1) / 2}; + const double beta{CalcKaiserBeta(180.0)}; + mM = l*2 + 1; + mL = l; + mF.resize(mM); + for(uint i{0};i < mM;i++) + mF[i] = SincFilter(l, beta, mP, cutoff, i); +} + +// Perform the upsample-filter-downsample resampling operation using a +// polyphase filter implementation. +void PPhaseResampler::process(const uint inN, const double *in, const uint outN, double *out) +{ + if UNLIKELY(outN == 0) + return; + + // Handle in-place operation. + std::vector workspace; + double *work{out}; + if UNLIKELY(work == in) + { + workspace.resize(outN); + work = workspace.data(); + } + + // Resample the input. + const uint p{mP}, q{mQ}, m{mM}, l{mL}; + const double *f{mF.data()}; + for(uint i{0};i < outN;i++) + { + // Input starts at l to compensate for the filter delay. This will + // drop any build-up from the first half of the filter. + size_t j_f{(l + q*i) % p}; + size_t j_s{(l + q*i) / p}; + + // Only take input when 0 <= j_s < inN. + double r{0.0}; + if LIKELY(j_f < m) + { + size_t filt_len{(m-j_f+p-1) / p}; + if LIKELY(j_s+1 > inN) + { + size_t skip{std::min(j_s+1 - inN, filt_len)}; + j_f += p*skip; + j_s -= skip; + filt_len -= skip; + } + if(size_t todo{std::min(j_s+1, filt_len)}) + { + do { + r += f[j_f] * in[j_s]; + j_f += p; + --j_s; + } while(--todo); + } + } + work[i] = r; + } + // Clean up after in-place operation. + if(work != out) + std::copy_n(work, outN, out); +} diff --git a/common/polyphase_resampler.h b/common/polyphase_resampler.h new file mode 100644 index 0000000..e9833d1 --- /dev/null +++ b/common/polyphase_resampler.h @@ -0,0 +1,45 @@ +#ifndef POLYPHASE_RESAMPLER_H +#define POLYPHASE_RESAMPLER_H + +#include + + +/* This is a polyphase sinc-filtered resampler. It is built for very high + * quality results, rather than real-time performance. + * + * Upsample Downsample + * + * p/q = 3/2 p/q = 3/5 + * + * M-+-+-+-> M-+-+-+-> + * -------------------+ ---------------------+ + * p s * f f f f|f| | p s * f f f f f | + * | 0 * 0 0 0|0|0 | | 0 * 0 0 0 0|0| | + * v 0 * 0 0|0|0 0 | v 0 * 0 0 0|0|0 | + * s * f|f|f f f | s * f f|f|f f | + * 0 * |0|0 0 0 0 | 0 * 0|0|0 0 0 | + * --------+=+--------+ 0 * |0|0 0 0 0 | + * d . d .|d|. d . d ----------+=+--------+ + * d . . . .|d|. . . . + * q-> + * q-+-+-+-> + * + * P_f(i,j) = q i mod p + pj + * P_s(i,j) = floor(q i / p) - j + * d[i=0..N-1] = sum_{j=0}^{floor((M - 1) / p)} { + * { f[P_f(i,j)] s[P_s(i,j)], P_f(i,j) < M + * { 0, P_f(i,j) >= M. } + */ + +struct PPhaseResampler { + using uint = unsigned int; + + void init(const uint srcRate, const uint dstRate); + void process(const uint inN, const double *in, const uint outN, double *out); + +private: + uint mP, mQ, mM, mL; + std::vector mF; +}; + +#endif /* POLYPHASE_RESAMPLER_H */ diff --git a/common/pragmadefs.h b/common/pragmadefs.h new file mode 100644 index 0000000..1d0af06 --- /dev/null +++ b/common/pragmadefs.h @@ -0,0 +1,21 @@ +#ifndef PRAGMADEFS_H +#define PRAGMADEFS_H + +#if defined(_MSC_VER) +#define DIAGNOSTIC_PUSH __pragma(warning(push)) +#define DIAGNOSTIC_POP __pragma(warning(pop)) +#define std_pragma(...) +#define msc_pragma __pragma +#else +#if defined(__GNUC__) || defined(__clang__) +#define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") +#define DIAGNOSTIC_POP _Pragma("GCC diagnostic push") +#else +#define DIAGNOSTIC_PUSH +#define DIAGNOSTIC_POP +#endif +#define std_pragma _Pragma +#define msc_pragma(...) +#endif + +#endif /* PRAGMADEFS_H */ diff --git a/common/rwlock.c b/common/rwlock.c deleted file mode 100644 index 67cf3ac..0000000 --- a/common/rwlock.c +++ /dev/null @@ -1,59 +0,0 @@ - -#include "config.h" - -#include "rwlock.h" - -#include "bool.h" -#include "atomic.h" -#include "threads.h" - - -/* A simple spinlock. Yield the thread while the given integer is set by - * another. Could probably be improved... */ -#define LOCK(l) do { \ - while(ATOMIC_FLAG_TEST_AND_SET(&(l), almemory_order_acq_rel) == true) \ - althrd_yield(); \ -} while(0) -#define UNLOCK(l) ATOMIC_FLAG_CLEAR(&(l), almemory_order_release) - - -void RWLockInit(RWLock *lock) -{ - InitRef(&lock->read_count, 0); - InitRef(&lock->write_count, 0); - ATOMIC_FLAG_CLEAR(&lock->read_lock, almemory_order_relaxed); - ATOMIC_FLAG_CLEAR(&lock->read_entry_lock, almemory_order_relaxed); - ATOMIC_FLAG_CLEAR(&lock->write_lock, almemory_order_relaxed); -} - -void ReadLock(RWLock *lock) -{ - LOCK(lock->read_entry_lock); - LOCK(lock->read_lock); - /* NOTE: ATOMIC_ADD returns the *old* value! */ - if(ATOMIC_ADD(&lock->read_count, 1, almemory_order_acq_rel) == 0) - LOCK(lock->write_lock); - UNLOCK(lock->read_lock); - UNLOCK(lock->read_entry_lock); -} - -void ReadUnlock(RWLock *lock) -{ - /* NOTE: ATOMIC_SUB returns the *old* value! */ - if(ATOMIC_SUB(&lock->read_count, 1, almemory_order_acq_rel) == 1) - UNLOCK(lock->write_lock); -} - -void WriteLock(RWLock *lock) -{ - if(ATOMIC_ADD(&lock->write_count, 1, almemory_order_acq_rel) == 0) - LOCK(lock->read_lock); - LOCK(lock->write_lock); -} - -void WriteUnlock(RWLock *lock) -{ - UNLOCK(lock->write_lock); - if(ATOMIC_SUB(&lock->write_count, 1, almemory_order_acq_rel) == 1) - UNLOCK(lock->read_lock); -} diff --git a/common/rwlock.h b/common/rwlock.h deleted file mode 100644 index 8e36fa1..0000000 --- a/common/rwlock.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef AL_RWLOCK_H -#define AL_RWLOCK_H - -#include "bool.h" -#include "atomic.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - RefCount read_count; - RefCount write_count; - ATOMIC_FLAG read_lock; - ATOMIC_FLAG read_entry_lock; - ATOMIC_FLAG write_lock; -} RWLock; -#define RWLOCK_STATIC_INITIALIZE { ATOMIC_INIT_STATIC(0), ATOMIC_INIT_STATIC(0), \ - ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT } - -void RWLockInit(RWLock *lock); -void ReadLock(RWLock *lock); -void ReadUnlock(RWLock *lock); -void WriteLock(RWLock *lock); -void WriteUnlock(RWLock *lock); - -#ifdef __cplusplus -} -#endif - -#endif /* AL_RWLOCK_H */ diff --git a/common/static_assert.h b/common/static_assert.h deleted file mode 100644 index bf0ce06..0000000 --- a/common/static_assert.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef AL_STATIC_ASSERT_H -#define AL_STATIC_ASSERT_H - -#include - - -#ifndef static_assert -#ifdef HAVE_C11_STATIC_ASSERT -#define static_assert _Static_assert -#else -#define CTASTR2(_pre,_post) _pre##_post -#define CTASTR(_pre,_post) CTASTR2(_pre,_post) -#if defined(__COUNTER__) -#define static_assert(_cond, _msg) typedef struct { int CTASTR(static_assert_failed_at_line_,__LINE__) : !!(_cond); } CTASTR(static_assertion_,__COUNTER__) -#else -#define static_assert(_cond, _msg) struct { int CTASTR(static_assert_failed_at_line_,__LINE__) : !!(_cond); } -#endif -#endif -#endif - -#endif /* AL_STATIC_ASSERT_H */ diff --git a/common/strutils.cpp b/common/strutils.cpp new file mode 100644 index 0000000..870a0ed --- /dev/null +++ b/common/strutils.cpp @@ -0,0 +1,62 @@ + +#include "config.h" + +#include "strutils.h" + +#include + + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include + +std::string wstr_to_utf8(const WCHAR *wstr) +{ + std::string ret; + + int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, nullptr, 0, nullptr, nullptr); + if(len > 0) + { + ret.resize(len); + WideCharToMultiByte(CP_UTF8, 0, wstr, -1, &ret[0], len, nullptr, nullptr); + ret.pop_back(); + } + + return ret; +} + +std::wstring utf8_to_wstr(const char *str) +{ + std::wstring ret; + + int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, nullptr, 0); + if(len > 0) + { + ret.resize(len); + MultiByteToWideChar(CP_UTF8, 0, str, -1, &ret[0], len); + ret.pop_back(); + } + + return ret; +} +#endif + +namespace al { + +al::optional getenv(const char *envname) +{ + const char *str{std::getenv(envname)}; + if(str && str[0] != '\0') return str; + return al::nullopt; +} + +#ifdef _WIN32 +al::optional getenv(const WCHAR *envname) +{ + const WCHAR *str{_wgetenv(envname)}; + if(str && str[0] != L'\0') return str; + return al::nullopt; +} +#endif + +} // namespace al diff --git a/common/strutils.h b/common/strutils.h new file mode 100644 index 0000000..0c7a0e2 --- /dev/null +++ b/common/strutils.h @@ -0,0 +1,24 @@ +#ifndef AL_STRUTILS_H +#define AL_STRUTILS_H + +#include + +#include "aloptional.h" + +#ifdef _WIN32 +#include + +std::string wstr_to_utf8(const wchar_t *wstr); +std::wstring utf8_to_wstr(const char *str); +#endif + +namespace al { + +al::optional getenv(const char *envname); +#ifdef _WIN32 +al::optional getenv(const wchar_t *envname); +#endif + +} // namespace al + +#endif /* AL_STRUTILS_H */ diff --git a/common/threads.c b/common/threads.c deleted file mode 100644 index 6cfe383..0000000 --- a/common/threads.c +++ /dev/null @@ -1,716 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include "threads.h" - -#include -#include -#include - -#include "uintmap.h" - - -extern inline althrd_t althrd_current(void); -extern inline int althrd_equal(althrd_t thr0, althrd_t thr1); -extern inline void althrd_exit(int res); -extern inline void althrd_yield(void); - -extern inline int almtx_lock(almtx_t *mtx); -extern inline int almtx_unlock(almtx_t *mtx); -extern inline int almtx_trylock(almtx_t *mtx); - -extern inline void *altss_get(altss_t tss_id); -extern inline int altss_set(altss_t tss_id, void *val); - - -#ifndef UNUSED -#if defined(__cplusplus) -#define UNUSED(x) -#elif defined(__GNUC__) -#define UNUSED(x) UNUSED_##x __attribute__((unused)) -#elif defined(__LCLINT__) -#define UNUSED(x) /*@unused@*/ x -#else -#define UNUSED(x) x -#endif -#endif - - -#define THREAD_STACK_SIZE (2*1024*1024) /* 2MB */ - -#ifdef _WIN32 - -#define WIN32_LEAN_AND_MEAN -#include -#include - - -/* An associative map of uint:void* pairs. The key is the unique Thread ID and - * the value is the thread HANDLE. The thread ID is passed around as the - * althrd_t since there is only one ID per thread, whereas a thread may be - * referenced by multiple different HANDLEs. This map allows retrieving the - * original handle which is needed to join the thread and get its return value. - */ -static UIntMap ThrdIdHandle = UINTMAP_STATIC_INITIALIZE; - -/* An associative map of uint:void* pairs. The key is the TLS index (given by - * TlsAlloc), and the value is the altss_dtor_t callback. When a thread exits, - * we iterate over the TLS indices for their thread-local value and call the - * destructor function with it if they're both not NULL. - */ -static UIntMap TlsDestructors = UINTMAP_STATIC_INITIALIZE; - - -void althrd_setname(althrd_t thr, const char *name) -{ -#if defined(_MSC_VER) -#define MS_VC_EXCEPTION 0x406D1388 -#pragma pack(push,8) - struct { - DWORD dwType; // Must be 0x1000. - LPCSTR szName; // Pointer to name (in user addr space). - DWORD dwThreadID; // Thread ID (-1=caller thread). - DWORD dwFlags; // Reserved for future use, must be zero. - } info; -#pragma pack(pop) - info.dwType = 0x1000; - info.szName = name; - info.dwThreadID = thr; - info.dwFlags = 0; - - __try { - RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info); - } - __except(EXCEPTION_CONTINUE_EXECUTION) { - } -#undef MS_VC_EXCEPTION -#else - (void)thr; - (void)name; -#endif -} - - -typedef struct thread_cntr { - althrd_start_t func; - void *arg; -} thread_cntr; - -static DWORD WINAPI althrd_starter(void *arg) -{ - thread_cntr cntr; - memcpy(&cntr, arg, sizeof(cntr)); - free(arg); - - return (DWORD)((*cntr.func)(cntr.arg)); -} - - -int althrd_create(althrd_t *thr, althrd_start_t func, void *arg) -{ - thread_cntr *cntr; - DWORD thrid; - HANDLE hdl; - - cntr = malloc(sizeof(*cntr)); - if(!cntr) return althrd_nomem; - - cntr->func = func; - cntr->arg = arg; - - hdl = CreateThread(NULL, THREAD_STACK_SIZE, althrd_starter, cntr, 0, &thrid); - if(!hdl) - { - free(cntr); - return althrd_error; - } - InsertUIntMapEntry(&ThrdIdHandle, thrid, hdl); - - *thr = thrid; - return althrd_success; -} - -int althrd_detach(althrd_t thr) -{ - HANDLE hdl = RemoveUIntMapKey(&ThrdIdHandle, thr); - if(!hdl) return althrd_error; - - CloseHandle(hdl); - return althrd_success; -} - -int althrd_join(althrd_t thr, int *res) -{ - DWORD code; - - HANDLE hdl = RemoveUIntMapKey(&ThrdIdHandle, thr); - if(!hdl) return althrd_error; - - WaitForSingleObject(hdl, INFINITE); - GetExitCodeThread(hdl, &code); - CloseHandle(hdl); - - if(res != NULL) - *res = (int)code; - return althrd_success; -} - -int althrd_sleep(const struct timespec *ts, struct timespec* UNUSED(rem)) -{ - DWORD msec; - - if(ts->tv_sec < 0 || ts->tv_sec >= (0x7fffffff / 1000) || - ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000) - return -2; - - msec = (DWORD)(ts->tv_sec * 1000); - msec += (DWORD)((ts->tv_nsec+999999) / 1000000); - Sleep(msec); - - return 0; -} - - -int almtx_init(almtx_t *mtx, int type) -{ - if(!mtx) return althrd_error; - - type &= ~almtx_recursive; - if(type != almtx_plain) - return althrd_error; - - InitializeCriticalSection(mtx); - return althrd_success; -} - -void almtx_destroy(almtx_t *mtx) -{ - DeleteCriticalSection(mtx); -} - -#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 -int alcnd_init(alcnd_t *cond) -{ - InitializeConditionVariable(cond); - return althrd_success; -} - -int alcnd_signal(alcnd_t *cond) -{ - WakeConditionVariable(cond); - return althrd_success; -} - -int alcnd_broadcast(alcnd_t *cond) -{ - WakeAllConditionVariable(cond); - return althrd_success; -} - -int alcnd_wait(alcnd_t *cond, almtx_t *mtx) -{ - if(SleepConditionVariableCS(cond, mtx, INFINITE) != 0) - return althrd_success; - return althrd_error; -} - -void alcnd_destroy(alcnd_t* UNUSED(cond)) -{ - /* Nothing to delete? */ -} - -#else - -/* WARNING: This is a rather poor implementation of condition variables, with - * known problems. However, it's simple, efficient, and good enough for now to - * not require Vista. Based on "Strategies for Implementing POSIX Condition - * Variables" by Douglas C. Schmidt and Irfan Pyarali: - * http://www.cs.wustl.edu/~schmidt/win32-cv-1.html - */ -/* A better solution may be using Wine's implementation. It requires internals - * (NtCreateKeyedEvent, NtReleaseKeyedEvent, and NtWaitForKeyedEvent) from - * ntdll, and implemention of exchange and compare-exchange for RefCounts. - */ - -typedef struct { - RefCount wait_count; - - HANDLE events[2]; -} _int_alcnd_t; -enum { - SIGNAL = 0, - BROADCAST = 1 -}; - -int alcnd_init(alcnd_t *cond) -{ - _int_alcnd_t *icond = calloc(1, sizeof(*icond)); - if(!icond) return althrd_nomem; - - InitRef(&icond->wait_count, 0); - - icond->events[SIGNAL] = CreateEventW(NULL, FALSE, FALSE, NULL); - icond->events[BROADCAST] = CreateEventW(NULL, TRUE, FALSE, NULL); - if(!icond->events[SIGNAL] || !icond->events[BROADCAST]) - { - if(icond->events[SIGNAL]) - CloseHandle(icond->events[SIGNAL]); - if(icond->events[BROADCAST]) - CloseHandle(icond->events[BROADCAST]); - free(icond); - return althrd_error; - } - - cond->Ptr = icond; - return althrd_success; -} - -int alcnd_signal(alcnd_t *cond) -{ - _int_alcnd_t *icond = cond->Ptr; - if(ReadRef(&icond->wait_count) > 0) - SetEvent(icond->events[SIGNAL]); - return althrd_success; -} - -int alcnd_broadcast(alcnd_t *cond) -{ - _int_alcnd_t *icond = cond->Ptr; - if(ReadRef(&icond->wait_count) > 0) - SetEvent(icond->events[BROADCAST]); - return althrd_success; -} - -int alcnd_wait(alcnd_t *cond, almtx_t *mtx) -{ - _int_alcnd_t *icond = cond->Ptr; - int res; - - IncrementRef(&icond->wait_count); - LeaveCriticalSection(mtx); - - res = WaitForMultipleObjects(2, icond->events, FALSE, INFINITE); - - if(DecrementRef(&icond->wait_count) == 0 && res == WAIT_OBJECT_0+BROADCAST) - ResetEvent(icond->events[BROADCAST]); - EnterCriticalSection(mtx); - - return althrd_success; -} - -void alcnd_destroy(alcnd_t *cond) -{ - _int_alcnd_t *icond = cond->Ptr; - CloseHandle(icond->events[SIGNAL]); - CloseHandle(icond->events[BROADCAST]); - free(icond); -} -#endif /* defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 */ - - -int alsem_init(alsem_t *sem, unsigned int initial) -{ - *sem = CreateSemaphore(NULL, initial, INT_MAX, NULL); - if(*sem != NULL) return althrd_success; - return althrd_error; -} - -void alsem_destroy(alsem_t *sem) -{ - CloseHandle(*sem); -} - -int alsem_post(alsem_t *sem) -{ - DWORD ret = ReleaseSemaphore(*sem, 1, NULL); - if(ret) return althrd_success; - return althrd_error; -} - -int alsem_wait(alsem_t *sem) -{ - DWORD ret = WaitForSingleObject(*sem, INFINITE); - if(ret == WAIT_OBJECT_0) return althrd_success; - return althrd_error; -} - -int alsem_trywait(alsem_t *sem) -{ - DWORD ret = WaitForSingleObject(*sem, 0); - if(ret == WAIT_OBJECT_0) return althrd_success; - if(ret == WAIT_TIMEOUT) return althrd_busy; - return althrd_error; -} - - -int altss_create(altss_t *tss_id, altss_dtor_t callback) -{ - DWORD key = TlsAlloc(); - if(key == TLS_OUT_OF_INDEXES) - return althrd_error; - - *tss_id = key; - if(callback != NULL) - InsertUIntMapEntry(&TlsDestructors, key, callback); - return althrd_success; -} - -void altss_delete(altss_t tss_id) -{ - RemoveUIntMapKey(&TlsDestructors, tss_id); - TlsFree(tss_id); -} - - -int altimespec_get(struct timespec *ts, int base) -{ - static_assert(sizeof(FILETIME) == sizeof(ULARGE_INTEGER), - "Size of FILETIME does not match ULARGE_INTEGER"); - if(base == AL_TIME_UTC) - { - union { - FILETIME ftime; - ULARGE_INTEGER ulint; - } systime; - GetSystemTimeAsFileTime(&systime.ftime); - /* FILETIME is in 100-nanosecond units, or 1/10th of a microsecond. */ - ts->tv_sec = systime.ulint.QuadPart/10000000; - ts->tv_nsec = (systime.ulint.QuadPart%10000000) * 100; - return base; - } - - return 0; -} - - -void alcall_once(alonce_flag *once, void (*callback)(void)) -{ - LONG ret; - while((ret=InterlockedExchange(once, 1)) == 1) - althrd_yield(); - if(ret == 0) - (*callback)(); - InterlockedExchange(once, 2); -} - - -void althrd_deinit(void) -{ - ResetUIntMap(&ThrdIdHandle); - ResetUIntMap(&TlsDestructors); -} - -void althrd_thread_detach(void) -{ - ALsizei i; - - LockUIntMapRead(&TlsDestructors); - for(i = 0;i < TlsDestructors.size;i++) - { - void *ptr = altss_get(TlsDestructors.keys[i]); - altss_dtor_t callback = (altss_dtor_t)TlsDestructors.values[i]; - if(ptr) - { - if(callback) callback(ptr); - altss_set(TlsDestructors.keys[i], NULL); - } - } - UnlockUIntMapRead(&TlsDestructors); -} - -#else - -#include -#include -#include -#ifdef HAVE_PTHREAD_NP_H -#include -#endif - - -extern inline int althrd_sleep(const struct timespec *ts, struct timespec *rem); -extern inline void alcall_once(alonce_flag *once, void (*callback)(void)); - -extern inline void althrd_deinit(void); -extern inline void althrd_thread_detach(void); - -void althrd_setname(althrd_t thr, const char *name) -{ -#if defined(HAVE_PTHREAD_SETNAME_NP) -#if defined(PTHREAD_SETNAME_NP_ONE_PARAM) - if(althrd_equal(thr, althrd_current())) - pthread_setname_np(name); -#elif defined(PTHREAD_SETNAME_NP_THREE_PARAMS) - pthread_setname_np(thr, "%s", (void*)name); -#else - pthread_setname_np(thr, name); -#endif -#elif defined(HAVE_PTHREAD_SET_NAME_NP) - pthread_set_name_np(thr, name); -#else - (void)thr; - (void)name; -#endif -} - - -typedef struct thread_cntr { - althrd_start_t func; - void *arg; -} thread_cntr; - -static void *althrd_starter(void *arg) -{ - thread_cntr cntr; - memcpy(&cntr, arg, sizeof(cntr)); - free(arg); - - return (void*)(intptr_t)((*cntr.func)(cntr.arg)); -} - - -int althrd_create(althrd_t *thr, althrd_start_t func, void *arg) -{ - thread_cntr *cntr; - pthread_attr_t attr; - size_t stackmult = 1; - int err; - - cntr = malloc(sizeof(*cntr)); - if(!cntr) return althrd_nomem; - - if(pthread_attr_init(&attr) != 0) - { - free(cntr); - return althrd_error; - } -retry_stacksize: - if(pthread_attr_setstacksize(&attr, THREAD_STACK_SIZE*stackmult) != 0) - { - pthread_attr_destroy(&attr); - free(cntr); - return althrd_error; - } - - cntr->func = func; - cntr->arg = arg; - if((err=pthread_create(thr, &attr, althrd_starter, cntr)) == 0) - { - pthread_attr_destroy(&attr); - return althrd_success; - } - - if(err == EINVAL) - { - /* If an invalid stack size, try increasing it (limit x4, 8MB). */ - if(stackmult < 4) - { - stackmult *= 2; - goto retry_stacksize; - } - /* If still nothing, try defaults and hope they're good enough. */ - if(pthread_create(thr, NULL, althrd_starter, cntr) == 0) - { - pthread_attr_destroy(&attr); - return althrd_success; - } - } - pthread_attr_destroy(&attr); - free(cntr); - return althrd_error; -} - -int althrd_detach(althrd_t thr) -{ - if(pthread_detach(thr) != 0) - return althrd_error; - return althrd_success; -} - -int althrd_join(althrd_t thr, int *res) -{ - void *code; - - if(pthread_join(thr, &code) != 0) - return althrd_error; - if(res != NULL) - *res = (int)(intptr_t)code; - return althrd_success; -} - - -int almtx_init(almtx_t *mtx, int type) -{ - int ret; - - if(!mtx) return althrd_error; - if((type&~almtx_recursive) != 0) - return althrd_error; - - if(type == almtx_plain) - ret = pthread_mutex_init(mtx, NULL); - else - { - pthread_mutexattr_t attr; - - ret = pthread_mutexattr_init(&attr); - if(ret) return althrd_error; - - if(type == almtx_recursive) - { - ret = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); -#ifdef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP - if(ret != 0) - ret = pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE); -#endif - } - else - ret = 1; - if(ret == 0) - ret = pthread_mutex_init(mtx, &attr); - pthread_mutexattr_destroy(&attr); - } - return ret ? althrd_error : althrd_success; -} - -void almtx_destroy(almtx_t *mtx) -{ - pthread_mutex_destroy(mtx); -} - -int alcnd_init(alcnd_t *cond) -{ - if(pthread_cond_init(cond, NULL) == 0) - return althrd_success; - return althrd_error; -} - -int alcnd_signal(alcnd_t *cond) -{ - if(pthread_cond_signal(cond) == 0) - return althrd_success; - return althrd_error; -} - -int alcnd_broadcast(alcnd_t *cond) -{ - if(pthread_cond_broadcast(cond) == 0) - return althrd_success; - return althrd_error; -} - -int alcnd_wait(alcnd_t *cond, almtx_t *mtx) -{ - if(pthread_cond_wait(cond, mtx) == 0) - return althrd_success; - return althrd_error; -} - -void alcnd_destroy(alcnd_t *cond) -{ - pthread_cond_destroy(cond); -} - - -int alsem_init(alsem_t *sem, unsigned int initial) -{ - if(sem_init(sem, 0, initial) == 0) - return althrd_success; - return althrd_error; -} - -void alsem_destroy(alsem_t *sem) -{ - sem_destroy(sem); -} - -int alsem_post(alsem_t *sem) -{ - if(sem_post(sem) == 0) - return althrd_success; - return althrd_error; -} - -int alsem_wait(alsem_t *sem) -{ - if(sem_wait(sem) == 0) return althrd_success; - if(errno == EINTR) return -2; - return althrd_error; -} - -int alsem_trywait(alsem_t *sem) -{ - if(sem_trywait(sem) == 0) return althrd_success; - if(errno == EWOULDBLOCK) return althrd_busy; - if(errno == EINTR) return -2; - return althrd_error; -} - - -int altss_create(altss_t *tss_id, altss_dtor_t callback) -{ - if(pthread_key_create(tss_id, callback) != 0) - return althrd_error; - return althrd_success; -} - -void altss_delete(altss_t tss_id) -{ - pthread_key_delete(tss_id); -} - - -int altimespec_get(struct timespec *ts, int base) -{ - if(base == AL_TIME_UTC) - { - int ret; -#if _POSIX_TIMERS > 0 - ret = clock_gettime(CLOCK_REALTIME, ts); - if(ret == 0) return base; -#else /* _POSIX_TIMERS > 0 */ - struct timeval tv; - ret = gettimeofday(&tv, NULL); - if(ret == 0) - { - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; - return base; - } -#endif - } - - return 0; -} - -#endif - - -void al_nssleep(unsigned long nsec) -{ - struct timespec ts, rem; - ts.tv_sec = nsec / 1000000000ul; - ts.tv_nsec = nsec % 1000000000ul; - - while(althrd_sleep(&ts, &rem) == -1) - ts = rem; -} diff --git a/common/threads.cpp b/common/threads.cpp new file mode 100644 index 0000000..ff01de4 --- /dev/null +++ b/common/threads.cpp @@ -0,0 +1,169 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "threads.h" + +#include + + +#ifdef _WIN32 + +#include + +void althrd_setname(const char *name) +{ +#if defined(_MSC_VER) +#define MS_VC_EXCEPTION 0x406D1388 +#pragma pack(push,8) + struct { + DWORD dwType; // Must be 0x1000. + LPCSTR szName; // Pointer to name (in user addr space). + DWORD dwThreadID; // Thread ID (-1=caller thread). + DWORD dwFlags; // Reserved for future use, must be zero. + } info; +#pragma pack(pop) + info.dwType = 0x1000; + info.szName = name; + info.dwThreadID = ~DWORD{0}; + info.dwFlags = 0; + + __try { + RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info); + } + __except(EXCEPTION_CONTINUE_EXECUTION) { + } +#undef MS_VC_EXCEPTION +#else + (void)name; +#endif +} + +namespace al { + +semaphore::semaphore(unsigned int initial) +{ + if(initial > static_cast(std::numeric_limits::max())) + throw std::system_error(std::make_error_code(std::errc::value_too_large)); + mSem = CreateSemaphore(nullptr, initial, std::numeric_limits::max(), nullptr); + if(mSem == nullptr) + throw std::system_error(std::make_error_code(std::errc::resource_unavailable_try_again)); +} + +semaphore::~semaphore() +{ CloseHandle(mSem); } + +void semaphore::post() +{ + if(!ReleaseSemaphore(mSem, 1, nullptr)) + throw std::system_error(std::make_error_code(std::errc::value_too_large)); +} + +void semaphore::wait() noexcept +{ WaitForSingleObject(mSem, INFINITE); } + +bool semaphore::try_wait() noexcept +{ return WaitForSingleObject(mSem, 0) == WAIT_OBJECT_0; } + +} // namespace al + +#else + +#if defined(HAVE_PTHREAD_SETNAME_NP) || defined(HAVE_PTHREAD_SET_NAME_NP) +#include +#ifdef HAVE_PTHREAD_NP_H +#include +#endif + +void althrd_setname(const char *name) +{ +#if defined(HAVE_PTHREAD_SET_NAME_NP) + pthread_set_name_np(pthread_self(), name); +#elif defined(PTHREAD_SETNAME_NP_ONE_PARAM) + pthread_setname_np(name); +#elif defined(PTHREAD_SETNAME_NP_THREE_PARAMS) + pthread_setname_np(pthread_self(), "%s", (void*)name); +#else + pthread_setname_np(pthread_self(), name); +#endif +} + +#else + +void althrd_setname(const char*) { } +#endif + +namespace al { + +#ifdef __APPLE__ + +semaphore::semaphore(unsigned int initial) +{ + mSem = dispatch_semaphore_create(initial); + if(!mSem) + throw std::system_error(std::make_error_code(std::errc::resource_unavailable_try_again)); +} + +semaphore::~semaphore() +{ dispatch_release(mSem); } + +void semaphore::post() +{ dispatch_semaphore_signal(mSem); } + +void semaphore::wait() noexcept +{ dispatch_semaphore_wait(mSem, DISPATCH_TIME_FOREVER); } + +bool semaphore::try_wait() noexcept +{ return dispatch_semaphore_wait(mSem, DISPATCH_TIME_NOW) == 0; } + +#else /* !__APPLE__ */ + +#include + +semaphore::semaphore(unsigned int initial) +{ + if(sem_init(&mSem, 0, initial) != 0) + throw std::system_error(std::make_error_code(std::errc::resource_unavailable_try_again)); +} + +semaphore::~semaphore() +{ sem_destroy(&mSem); } + +void semaphore::post() +{ + if(sem_post(&mSem) != 0) + throw std::system_error(std::make_error_code(std::errc::value_too_large)); +} + +void semaphore::wait() noexcept +{ + while(sem_wait(&mSem) == -1 && errno == EINTR) { + } +} + +bool semaphore::try_wait() noexcept +{ return sem_trywait(&mSem) == 0; } + +#endif /* __APPLE__ */ + +} // namespace al + +#endif /* _WIN32 */ diff --git a/common/threads.h b/common/threads.h index b0bebd8..ff571a6 100644 --- a/common/threads.h +++ b/common/threads.h @@ -1,8 +1,6 @@ #ifndef AL_THREADS_H #define AL_THREADS_H -#include - #if defined(__GNUC__) && defined(__i386__) /* force_align_arg_pointer is required for proper function arguments aligning * when SSE code is used. Some systems (Windows, QNX) do not guarantee our @@ -13,248 +11,41 @@ #define FORCE_ALIGN #endif -#ifdef __cplusplus -extern "C" { -#endif - -enum { - althrd_success = 0, - althrd_error, - althrd_nomem, - althrd_timedout, - althrd_busy -}; - -enum { - almtx_plain = 0, - almtx_recursive = 1, -}; - -typedef int (*althrd_start_t)(void*); -typedef void (*altss_dtor_t)(void*); - - -#define AL_TIME_UTC 1 - - #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include - - -#ifndef HAVE_STRUCT_TIMESPEC -struct timespec { - time_t tv_sec; - long tv_nsec; -}; -#endif - -typedef DWORD althrd_t; -typedef CRITICAL_SECTION almtx_t; -#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 -typedef CONDITION_VARIABLE alcnd_t; +#elif defined(__APPLE__) +#include #else -typedef struct { void *Ptr; } alcnd_t; +#include #endif -typedef HANDLE alsem_t; -typedef DWORD altss_t; -typedef LONG alonce_flag; - -#define AL_ONCE_FLAG_INIT 0 - -int althrd_sleep(const struct timespec *ts, struct timespec *rem); -void alcall_once(alonce_flag *once, void (*callback)(void)); - -void althrd_deinit(void); -void althrd_thread_detach(void); - - -inline althrd_t althrd_current(void) -{ - return GetCurrentThreadId(); -} - -inline int althrd_equal(althrd_t thr0, althrd_t thr1) -{ - return thr0 == thr1; -} - -inline void althrd_exit(int res) -{ - ExitThread(res); -} -inline void althrd_yield(void) -{ - SwitchToThread(); -} +void althrd_setname(const char *name); +namespace al { -inline int almtx_lock(almtx_t *mtx) -{ - if(!mtx) return althrd_error; - EnterCriticalSection(mtx); - return althrd_success; -} - -inline int almtx_unlock(almtx_t *mtx) -{ - if(!mtx) return althrd_error; - LeaveCriticalSection(mtx); - return althrd_success; -} - -inline int almtx_trylock(almtx_t *mtx) -{ - if(!mtx) return althrd_error; - if(!TryEnterCriticalSection(mtx)) - return althrd_busy; - return althrd_success; -} - - -inline void *altss_get(altss_t tss_id) -{ - return TlsGetValue(tss_id); -} - -inline int altss_set(altss_t tss_id, void *val) -{ - if(TlsSetValue(tss_id, val) == 0) - return althrd_error; - return althrd_success; -} - +class semaphore { +#ifdef _WIN32 + using native_type = HANDLE; +#elif defined(__APPLE__) + using native_type = dispatch_semaphore_t; #else - -#include -#include -#include -#include - - -typedef pthread_t althrd_t; -typedef pthread_mutex_t almtx_t; -typedef pthread_cond_t alcnd_t; -typedef sem_t alsem_t; -typedef pthread_key_t altss_t; -typedef pthread_once_t alonce_flag; - -#define AL_ONCE_FLAG_INIT PTHREAD_ONCE_INIT - - -inline althrd_t althrd_current(void) -{ - return pthread_self(); -} - -inline int althrd_equal(althrd_t thr0, althrd_t thr1) -{ - return pthread_equal(thr0, thr1); -} - -inline void althrd_exit(int res) -{ - pthread_exit((void*)(intptr_t)res); -} - -inline void althrd_yield(void) -{ - sched_yield(); -} - -inline int althrd_sleep(const struct timespec *ts, struct timespec *rem) -{ - int ret = nanosleep(ts, rem); - if(ret != 0) - { - ret = ((errno==EINTR) ? -1 : -2); - errno = 0; - } - return ret; -} - - -inline int almtx_lock(almtx_t *mtx) -{ - if(pthread_mutex_lock(mtx) != 0) - return althrd_error; - return althrd_success; -} - -inline int almtx_unlock(almtx_t *mtx) -{ - if(pthread_mutex_unlock(mtx) != 0) - return althrd_error; - return althrd_success; -} - -inline int almtx_trylock(almtx_t *mtx) -{ - int ret = pthread_mutex_trylock(mtx); - switch(ret) - { - case 0: return althrd_success; - case EBUSY: return althrd_busy; - } - return althrd_error; -} - - -inline void *altss_get(altss_t tss_id) -{ - return pthread_getspecific(tss_id); -} - -inline int altss_set(altss_t tss_id, void *val) -{ - if(pthread_setspecific(tss_id, val) != 0) - return althrd_error; - return althrd_success; -} - - -inline void alcall_once(alonce_flag *once, void (*callback)(void)) -{ - pthread_once(once, callback); -} - - -inline void althrd_deinit(void) { } -inline void althrd_thread_detach(void) { } - + using native_type = sem_t; #endif + native_type mSem; +public: + semaphore(unsigned int initial=0); + semaphore(const semaphore&) = delete; + ~semaphore(); -int althrd_create(althrd_t *thr, althrd_start_t func, void *arg); -int althrd_detach(althrd_t thr); -int althrd_join(althrd_t thr, int *res); -void althrd_setname(althrd_t thr, const char *name); + semaphore& operator=(const semaphore&) = delete; -int almtx_init(almtx_t *mtx, int type); -void almtx_destroy(almtx_t *mtx); - -int alcnd_init(alcnd_t *cond); -int alcnd_signal(alcnd_t *cond); -int alcnd_broadcast(alcnd_t *cond); -int alcnd_wait(alcnd_t *cond, almtx_t *mtx); -void alcnd_destroy(alcnd_t *cond); - -int alsem_init(alsem_t *sem, unsigned int initial); -void alsem_destroy(alsem_t *sem); -int alsem_post(alsem_t *sem); -int alsem_wait(alsem_t *sem); -int alsem_trywait(alsem_t *sem); - -int altss_create(altss_t *tss_id, altss_dtor_t callback); -void altss_delete(altss_t tss_id); - -int altimespec_get(struct timespec *ts, int base); - -void al_nssleep(unsigned long nsec); + void post(); + void wait() noexcept; + bool try_wait() noexcept; +}; -#ifdef __cplusplus -} -#endif +} // namespace al #endif /* AL_THREADS_H */ diff --git a/common/uintmap.c b/common/uintmap.c deleted file mode 100644 index 18d52d6..0000000 --- a/common/uintmap.c +++ /dev/null @@ -1,182 +0,0 @@ - -#include "config.h" - -#include "uintmap.h" - -#include -#include - -#include "almalloc.h" - - -extern inline void LockUIntMapRead(UIntMap *map); -extern inline void UnlockUIntMapRead(UIntMap *map); -extern inline void LockUIntMapWrite(UIntMap *map); -extern inline void UnlockUIntMapWrite(UIntMap *map); - - -void InitUIntMap(UIntMap *map, ALsizei limit) -{ - map->keys = NULL; - map->values = NULL; - map->size = 0; - map->capacity = 0; - map->limit = limit; - RWLockInit(&map->lock); -} - -void ResetUIntMap(UIntMap *map) -{ - WriteLock(&map->lock); - al_free(map->keys); - map->keys = NULL; - map->values = NULL; - map->size = 0; - map->capacity = 0; - WriteUnlock(&map->lock); -} - -ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value) -{ - ALsizei pos = 0; - - WriteLock(&map->lock); - if(map->size > 0) - { - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - } - - if(pos == map->size || map->keys[pos] != key) - { - if(map->size >= map->limit) - { - WriteUnlock(&map->lock); - return AL_OUT_OF_MEMORY; - } - - if(map->size == map->capacity) - { - ALuint *keys = NULL; - ALvoid **values; - ALsizei newcap, keylen; - - newcap = (map->capacity ? (map->capacity<<1) : 4); - if(map->limit > 0 && newcap > map->limit) - newcap = map->limit; - if(newcap > map->capacity) - { - /* Round the memory size for keys up to a multiple of the - * pointer size. - */ - keylen = newcap * sizeof(map->keys[0]); - keylen += sizeof(map->values[0]) - 1; - keylen -= keylen%sizeof(map->values[0]); - - keys = al_malloc(16, keylen + newcap*sizeof(map->values[0])); - } - if(!keys) - { - WriteUnlock(&map->lock); - return AL_OUT_OF_MEMORY; - } - values = (ALvoid**)((ALbyte*)keys + keylen); - - if(map->keys) - { - memcpy(keys, map->keys, map->size*sizeof(map->keys[0])); - memcpy(values, map->values, map->size*sizeof(map->values[0])); - } - al_free(map->keys); - map->keys = keys; - map->values = values; - map->capacity = newcap; - } - - if(pos < map->size) - { - memmove(&map->keys[pos+1], &map->keys[pos], - (map->size-pos)*sizeof(map->keys[0])); - memmove(&map->values[pos+1], &map->values[pos], - (map->size-pos)*sizeof(map->values[0])); - } - map->size++; - } - map->keys[pos] = key; - map->values[pos] = value; - WriteUnlock(&map->lock); - - return AL_NO_ERROR; -} - -ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key) -{ - ALvoid *ptr = NULL; - WriteLock(&map->lock); - if(map->size > 0) - { - ALsizei pos = 0; - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - if(pos < map->size && map->keys[pos] == key) - { - ptr = map->values[pos]; - if(pos < map->size-1) - { - memmove(&map->keys[pos], &map->keys[pos+1], - (map->size-1-pos)*sizeof(map->keys[0])); - memmove(&map->values[pos], &map->values[pos+1], - (map->size-1-pos)*sizeof(map->values[0])); - } - map->size--; - } - } - WriteUnlock(&map->lock); - return ptr; -} - -ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key) -{ - ALvoid *ptr = NULL; - ReadLock(&map->lock); - if(map->size > 0) - { - ALsizei pos = 0; - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - if(pos < map->size && map->keys[pos] == key) - ptr = map->values[pos]; - } - ReadUnlock(&map->lock); - return ptr; -} diff --git a/common/uintmap.h b/common/uintmap.h deleted file mode 100644 index 3286865..0000000 --- a/common/uintmap.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef AL_UINTMAP_H -#define AL_UINTMAP_H - -#include - -#include "AL/al.h" -#include "rwlock.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct UIntMap { - ALuint *keys; - /* Shares memory with keys. */ - ALvoid **values; - - ALsizei size; - ALsizei capacity; - ALsizei limit; - RWLock lock; -} UIntMap; -#define UINTMAP_STATIC_INITIALIZE_N(_n) { NULL, NULL, 0, 0, (_n), RWLOCK_STATIC_INITIALIZE } -#define UINTMAP_STATIC_INITIALIZE UINTMAP_STATIC_INITIALIZE_N(INT_MAX) - -void InitUIntMap(UIntMap *map, ALsizei limit); -void ResetUIntMap(UIntMap *map); -ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value); -ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key); -ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key); - -inline void LockUIntMapRead(UIntMap *map) { ReadLock(&map->lock); } -inline void UnlockUIntMapRead(UIntMap *map) { ReadUnlock(&map->lock); } -inline void LockUIntMapWrite(UIntMap *map) { WriteLock(&map->lock); } -inline void UnlockUIntMapWrite(UIntMap *map) { WriteUnlock(&map->lock); } - -#ifdef __cplusplus -} -#endif - -#endif /* AL_UINTMAP_H */ diff --git a/common/vecmat.h b/common/vecmat.h new file mode 100644 index 0000000..7186ec6 --- /dev/null +++ b/common/vecmat.h @@ -0,0 +1,86 @@ +#ifndef COMMON_VECMAT_H +#define COMMON_VECMAT_H + +#include +#include +#include +#include + + +namespace alu { + +class Vector { + alignas(16) std::array mVals; + +public: + Vector() noexcept = default; + constexpr Vector(float a, float b, float c, float d) noexcept + : mVals{{a, b, c, d}} + { } + + float& operator[](size_t idx) noexcept { return mVals[idx]; } + constexpr const float& operator[](size_t idx) const noexcept { return mVals[idx]; } + + Vector& operator+=(const Vector &rhs) noexcept + { + mVals[0] += rhs.mVals[0]; + mVals[1] += rhs.mVals[1]; + mVals[2] += rhs.mVals[2]; + mVals[3] += rhs.mVals[3]; + return *this; + } + + float normalize() + { + const float length{std::sqrt(mVals[0]*mVals[0] + mVals[1]*mVals[1] + mVals[2]*mVals[2])}; + if(length > std::numeric_limits::epsilon()) + { + float inv_length = 1.0f/length; + mVals[0] *= inv_length; + mVals[1] *= inv_length; + mVals[2] *= inv_length; + return length; + } + mVals[0] = mVals[1] = mVals[2] = 0.0f; + return 0.0f; + } +}; + +class Matrix { + alignas(16) std::array,4> mVals; + +public: + Matrix() noexcept = default; + constexpr Matrix(float aa, float ab, float ac, float ad, + float ba, float bb, float bc, float bd, + float ca, float cb, float cc, float cd, + float da, float db, float dc, float dd) noexcept + : mVals{{{{aa, ab, ac, ad}}, {{ba, bb, bc, bd}}, {{ca, cb, cc, cd}}, {{da, db, dc, dd}}}} + { } + + std::array& operator[](size_t idx) noexcept { return mVals[idx]; } + constexpr const std::array& operator[](size_t idx) const noexcept { return mVals[idx]; } + + void setRow(size_t idx, float a, float b, float c, float d) noexcept + { + mVals[idx][0] = a; + mVals[idx][1] = b; + mVals[idx][2] = c; + mVals[idx][3] = d; + } + + static const Matrix &Identity() noexcept + { + static constexpr Matrix identity{ + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + return identity; + } +}; + +} // namespace alu + +#endif /* COMMON_VECMAT_H */ diff --git a/common/vector.h b/common/vector.h new file mode 100644 index 0000000..1b69d6a --- /dev/null +++ b/common/vector.h @@ -0,0 +1,15 @@ +#ifndef AL_VECTOR_H +#define AL_VECTOR_H + +#include + +#include "almalloc.h" + +namespace al { + +template +using vector = std::vector>; + +} // namespace al + +#endif /* AL_VECTOR_H */ diff --git a/common/win_main_utf8.h b/common/win_main_utf8.h index faddc25..242d3b8 100644 --- a/common/win_main_utf8.h +++ b/common/win_main_utf8.h @@ -30,7 +30,7 @@ static FILE *my_fopen(const char *fname, const char *mode) return NULL; } - wname = calloc(sizeof(WCHAR), namelen+modelen); + wname = (WCHAR*)calloc(sizeof(WCHAR), namelen+modelen); wmode = wname + namelen; MultiByteToWideChar(CP_UTF8, 0, fname, -1, wname, namelen); MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, modelen); @@ -73,7 +73,7 @@ static void GetUnicodeArgs(int *argc, char ***argv) total += WideCharToMultiByte(CP_UTF8, 0, args[i], -1, NULL, 0, NULL, NULL); atexit(cleanup_arglist); - arglist = *argv = calloc(1, total); + arglist = *argv = (char**)calloc(1, total); (*argv)[0] = (char*)(*argv + nargs); for(i = 0;i < nargs-1;i++) { diff --git a/files.xml b/files.xml index bd321ae..4605bcd 100644 --- a/files.xml +++ b/files.xml @@ -2,73 +2,75 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -80,7 +82,7 @@ - +
@@ -95,15 +97,15 @@ - - - + + +
- + @@ -115,20 +117,18 @@
- - - + + + - - + - - +
@@ -142,7 +142,7 @@ - +
@@ -151,7 +151,7 @@ - + diff --git a/include/AL/alc.h b/include/AL/alc.h index 294e8b3..5786bad 100644 --- a/include/AL/alc.h +++ b/include/AL/alc.h @@ -31,9 +31,9 @@ extern "C" { #define ALC_VERSION_0_1 1 /** Opaque device handle */ -typedef struct ALCdevice_struct ALCdevice; +typedef struct ALCdevice ALCdevice; /** Opaque context handle */ -typedef struct ALCcontext_struct ALCcontext; +typedef struct ALCcontext ALCcontext; /** 8-bit boolean */ typedef char ALCboolean; diff --git a/include/AL/alext.h b/include/AL/alext.h index cd7f275..bfc7c10 100644 --- a/include/AL/alext.h +++ b/include/AL/alext.h @@ -509,6 +509,27 @@ ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, #endif #endif +#ifndef AL_SOFT_direct_channels_remix +#define AL_SOFT_direct_channels_remix 1 +#define AL_DROP_UNMATCHED_SOFT 0x0001 +#define AL_REMIX_UNMATCHED_SOFT 0x0002 +#endif + +#ifndef AL_SOFT_bformat_ex +#define AL_SOFT_bformat_ex 1 +#define AL_AMBISONIC_LAYOUT_SOFT 0x1997 +#define AL_AMBISONIC_SCALING_SOFT 0x1998 + +/* Ambisonic layouts */ +#define AL_FUMA_SOFT 0x0000 +#define AL_ACN_SOFT 0x0001 + +/* Ambisonic scalings (normalization) */ +/*#define AL_FUMA_SOFT*/ +#define AL_SN3D_SOFT 0x0001 +#define AL_N3D_SOFT 0x0002 +#endif + #ifdef __cplusplus } #endif diff --git a/include/AL/efx.h b/include/AL/efx.h index 5776698..3408565 100644 --- a/include/AL/efx.h +++ b/include/AL/efx.h @@ -1,6 +1,7 @@ #ifndef AL_EFX_H #define AL_EFX_H +#include #include "alc.h" #include "al.h" diff --git a/include/align.h b/include/align.h deleted file mode 100644 index e2dc81d..0000000 --- a/include/align.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef AL_ALIGN_H -#define AL_ALIGN_H - -#if defined(HAVE_STDALIGN_H) && defined(HAVE_C11_ALIGNAS) -#include -#endif - -#ifndef alignas -#if defined(IN_IDE_PARSER) -/* KDevelop has problems with our align macro, so just use nothing for parsing. */ -#define alignas(x) -#elif defined(HAVE_C11_ALIGNAS) -#define alignas _Alignas -#else -/* NOTE: Our custom ALIGN macro can't take a type name like alignas can. For - * maximum compatibility, only provide constant integer values to alignas. */ -#define alignas(_x) ALIGN(_x) -#endif -#endif - -#endif /* AL_ALIGN_H */ diff --git a/include/atomic.h b/include/atomic.h deleted file mode 100644 index 8eb6820..0000000 --- a/include/atomic.h +++ /dev/null @@ -1,334 +0,0 @@ -#ifndef AL_ATOMIC_H -#define AL_ATOMIC_H - -#include "static_assert.h" -#include "bool.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Atomics using C11 */ -#ifdef HAVE_C11_ATOMIC - -#include - -#define almemory_order memory_order -#define almemory_order_relaxed memory_order_relaxed -#define almemory_order_consume memory_order_consume -#define almemory_order_acquire memory_order_acquire -#define almemory_order_release memory_order_release -#define almemory_order_acq_rel memory_order_acq_rel -#define almemory_order_seq_cst memory_order_seq_cst - -#define ATOMIC(T) T _Atomic - -#define ATOMIC_INIT(_val, _newval) atomic_init((_val), (_newval)) -#define ATOMIC_INIT_STATIC(_newval) ATOMIC_VAR_INIT(_newval) - -#define PARAM2(f, a, b, ...) (f((a), (b))) -#define PARAM3(f, a, b, c, ...) (f((a), (b), (c))) -#define PARAM5(f, a, b, c, d, e, ...) (f((a), (b), (c), (d), (e))) - -#define ATOMIC_LOAD(...) PARAM2(atomic_load_explicit, __VA_ARGS__, memory_order_seq_cst) -#define ATOMIC_STORE(...) PARAM3(atomic_store_explicit, __VA_ARGS__, memory_order_seq_cst) - -#define ATOMIC_ADD(T, ...) PARAM3(atomic_fetch_add_explicit, __VA_ARGS__, memory_order_seq_cst) -#define ATOMIC_SUB(T, ...) PARAM3(atomic_fetch_sub_explicit, __VA_ARGS__, memory_order_seq_cst) - -#define ATOMIC_EXCHANGE(T, ...) PARAM3(atomic_exchange_explicit, __VA_ARGS__, memory_order_seq_cst) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(T, ...) \ - PARAM5(atomic_compare_exchange_strong_explicit, __VA_ARGS__, memory_order_seq_cst, memory_order_seq_cst) -#define ATOMIC_COMPARE_EXCHANGE_WEAK(T, ...) \ - PARAM5(atomic_compare_exchange_weak_explicit, __VA_ARGS__, memory_order_seq_cst, memory_order_seq_cst) - -/* Atomics using GCC intrinsics */ -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && !defined(__QNXNTO__) - -enum almemory_order { - almemory_order_relaxed, - almemory_order_consume, - almemory_order_acquire, - almemory_order_release, - almemory_order_acq_rel, - almemory_order_seq_cst -}; - -#define ATOMIC(T) struct { T volatile value; } - -#define ATOMIC_INIT(_val, _newval) do { (_val)->value = (_newval); } while(0) -#define ATOMIC_INIT_STATIC(_newval) {(_newval)} - -#define ATOMIC_LOAD(_val, ...) __extension__({ \ - __typeof((_val)->value) _r = (_val)->value; \ - __asm__ __volatile__("" ::: "memory"); \ - _r; \ -}) -#define ATOMIC_STORE(_val, _newval, ...) do { \ - __asm__ __volatile__("" ::: "memory"); \ - (_val)->value = (_newval); \ -} while(0) - -#define ATOMIC_ADD(T, _val, _incr, ...) __extension__({ \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - __sync_fetch_and_add(&(_val)->value, (_incr)); \ -}) -#define ATOMIC_SUB(T, _val, _decr, ...) __extension__({ \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - __sync_fetch_and_sub(&(_val)->value, (_decr)); \ -}) - -#define ATOMIC_EXCHANGE(T, _val, _newval, ...) __extension__({ \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - __sync_lock_test_and_set(&(_val)->value, (_newval)); \ -}) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(T, _val, _oldval, _newval, ...) __extension__({ \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - T _o = *(_oldval); \ - *(_oldval) = __sync_val_compare_and_swap(&(_val)->value, _o, (_newval)); \ - *(_oldval) == _o; \ -}) - -/* Atomics using x86/x86-64 GCC inline assembly */ -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -#define WRAP_ADD(ret, dest, incr) __asm__ __volatile__( \ - "lock; xaddl %0,(%1)" \ - : "=r" (ret) \ - : "r" (dest), "0" (incr) \ - : "memory" \ -) -#define WRAP_SUB(ret, dest, decr) __asm__ __volatile__( \ - "lock; xaddl %0,(%1)" \ - : "=r" (ret) \ - : "r" (dest), "0" (-(decr)) \ - : "memory" \ -) - -#define WRAP_XCHG(S, ret, dest, newval) __asm__ __volatile__( \ - "lock; xchg"S" %0,(%1)" \ - : "=r" (ret) \ - : "r" (dest), "0" (newval) \ - : "memory" \ -) -#define WRAP_CMPXCHG(S, ret, dest, oldval, newval) __asm__ __volatile__( \ - "lock; cmpxchg"S" %2,(%1)" \ - : "=a" (ret) \ - : "r" (dest), "r" (newval), "0" (oldval) \ - : "memory" \ -) - - -enum almemory_order { - almemory_order_relaxed, - almemory_order_consume, - almemory_order_acquire, - almemory_order_release, - almemory_order_acq_rel, - almemory_order_seq_cst -}; - -#define ATOMIC(T) struct { T volatile value; } - -#define ATOMIC_INIT(_val, _newval) do { (_val)->value = (_newval); } while(0) -#define ATOMIC_INIT_STATIC(_newval) {(_newval)} - -#define ATOMIC_LOAD(_val, ...) __extension__({ \ - __typeof((_val)->value) _r = (_val)->value; \ - __asm__ __volatile__("" ::: "memory"); \ - _r; \ -}) -#define ATOMIC_STORE(_val, _newval, ...) do { \ - __asm__ __volatile__("" ::: "memory"); \ - (_val)->value = (_newval); \ -} while(0) - -#define ATOMIC_ADD(T, _val, _incr, ...) __extension__({ \ - static_assert(sizeof(T)==4, "Type "#T" has incorrect size!"); \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - T _r; \ - WRAP_ADD(_r, &(_val)->value, (T)(_incr)); \ - _r; \ -}) -#define ATOMIC_SUB(T, _val, _decr, ...) __extension__({ \ - static_assert(sizeof(T)==4, "Type "#T" has incorrect size!"); \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - T _r; \ - WRAP_SUB(_r, &(_val)->value, (T)(_decr)); \ - _r; \ -}) - -#define ATOMIC_EXCHANGE(T, _val, _newval, ...) __extension__({ \ - static_assert(sizeof(T)==4 || sizeof(T)==8, "Type "#T" has incorrect size!"); \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - T _r; \ - if(sizeof(T) == 4) WRAP_XCHG("l", _r, &(_val)->value, (T)(_newval)); \ - else if(sizeof(T) == 8) WRAP_XCHG("q", _r, &(_val)->value, (T)(_newval)); \ - _r; \ -}) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(T, _val, _oldval, _newval, ...) __extension__({ \ - static_assert(sizeof(T)==4 || sizeof(T)==8, "Type "#T" has incorrect size!"); \ - static_assert(sizeof(T)==sizeof((_val)->value), "Type "#T" has incorrect size!"); \ - T _old = *(_oldval); \ - if(sizeof(T) == 4) WRAP_CMPXCHG("l", *(_oldval), &(_val)->value, _old, (T)(_newval)); \ - else if(sizeof(T) == 8) WRAP_CMPXCHG("q", *(_oldval), &(_val)->value, _old, (T)(_newval)); \ - *(_oldval) == _old; \ -}) - -/* Atomics using Windows methods */ -#elif defined(_WIN32) - -#define WIN32_LEAN_AND_MEAN -#include - -/* NOTE: This mess is *extremely* noisy, at least on GCC. It works by wrapping - * Windows' 32-bit and 64-bit atomic methods, which are then casted to use the - * given type based on its size (e.g. int and float use 32-bit atomics). This - * is fine for the swap and compare-and-swap methods, although the add and - * subtract methods only work properly for integer types. - * - * Despite how noisy it is, it's unfortunately the only way that doesn't rely - * on C99 (damn MSVC). - */ - -inline LONG AtomicAdd32(volatile LONG *dest, LONG incr) -{ - return InterlockedExchangeAdd(dest, incr); -} -inline LONG AtomicSub32(volatile LONG *dest, LONG decr) -{ - return InterlockedExchangeAdd(dest, -decr); -} - -inline LONG AtomicSwap32(volatile LONG *dest, LONG newval) -{ - return InterlockedExchange(dest, newval); -} -inline LONGLONG AtomicSwap64(volatile LONGLONG *dest, LONGLONG newval) -{ - return InterlockedExchange64(dest, newval); -} - -inline bool CompareAndSwap32(volatile LONG *dest, LONG newval, LONG *oldval) -{ - LONG old = *oldval; - *oldval = InterlockedCompareExchange(dest, newval, *oldval); - return old == *oldval; -} -inline bool CompareAndSwap64(volatile LONGLONG *dest, LONGLONG newval, LONGLONG *oldval) -{ - LONGLONG old = *oldval; - *oldval = InterlockedCompareExchange64(dest, newval, *oldval); - return old == *oldval; -} - -#define WRAP_ADDSUB(T, _func, _ptr, _amnt) ((T(*)(T volatile*,T))_func)((_ptr), (_amnt)) -#define WRAP_XCHG(T, _func, _ptr, _newval) ((T(*)(T volatile*,T))_func)((_ptr), (_newval)) -#define WRAP_CMPXCHG(T, _func, _ptr, _newval, _oldval) ((bool(*)(T volatile*,T,T*))_func)((_ptr), (_newval), (_oldval)) - - -enum almemory_order { - almemory_order_relaxed, - almemory_order_consume, - almemory_order_acquire, - almemory_order_release, - almemory_order_acq_rel, - almemory_order_seq_cst -}; - -#define ATOMIC(T) struct { T volatile value; } - -#define ATOMIC_INIT(_val, _newval) do { (_val)->value = (_newval); } while(0) -#define ATOMIC_INIT_STATIC(_newval) {(_newval)} - -#define ATOMIC_LOAD(_val, ...) ((_val)->value) -#define ATOMIC_STORE(_val, _newval, ...) do { \ - (_val)->value = (_newval); \ -} while(0) - -int _al_invalid_atomic_size(); /* not defined */ - -#define ATOMIC_ADD(T, _val, _incr, ...) \ - ((sizeof(T)==4) ? WRAP_ADDSUB(T, AtomicAdd32, &(_val)->value, (_incr)) : \ - (T)_al_invalid_atomic_size()) -#define ATOMIC_SUB(T, _val, _decr, ...) \ - ((sizeof(T)==4) ? WRAP_ADDSUB(T, AtomicSub32, &(_val)->value, (_decr)) : \ - (T)_al_invalid_atomic_size()) - -#define ATOMIC_EXCHANGE(T, _val, _newval, ...) \ - ((sizeof(T)==4) ? WRAP_XCHG(T, AtomicSwap32, &(_val)->value, (_newval)) : \ - (sizeof(T)==8) ? WRAP_XCHG(T, AtomicSwap64, &(_val)->value, (_newval)) : \ - (T)_al_invalid_atomic_size()) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(T, _val, _oldval, _newval, ...) \ - ((sizeof(T)==4) ? WRAP_CMPXCHG(T, CompareAndSwap32, &(_val)->value, (_newval), (_oldval)) : \ - (sizeof(T)==8) ? WRAP_CMPXCHG(T, CompareAndSwap64, &(_val)->value, (_newval), (_oldval)) : \ - (bool)_al_invalid_atomic_size()) - -#else - -#error "No atomic functions available on this platform!" - -#define ATOMIC(T) T - -#define ATOMIC_INIT_STATIC(_newval) (0) - -#define ATOMIC_LOAD_UNSAFE(_val) (0) -#define ATOMIC_STORE_UNSAFE(_val, _newval) ((void)0) - -#define ATOMIC_LOAD(_val, ...) (0) -#define ATOMIC_STORE(_val, _newval, ...) ((void)0) - -#define ATOMIC_ADD(T, _val, _incr, ...) (0) -#define ATOMIC_SUB(T, _val, _decr, ...) (0) - -#define ATOMIC_EXCHANGE(T, _val, _newval, ...) (0) -#define ATOMIC_COMPARE_EXCHANGE_STRONG(T, _val, _oldval, _newval, ...) (0) -#endif - -/* If no weak cmpxchg is provided (not all systems will have one), substitute a - * strong cmpxchg. */ -#ifndef ATOMIC_COMPARE_EXCHANGE_WEAK -#define ATOMIC_COMPARE_EXCHANGE_WEAK ATOMIC_COMPARE_EXCHANGE_STRONG -#endif - - -typedef unsigned int uint; -typedef ATOMIC(uint) RefCount; - -inline void InitRef(RefCount *ptr, uint value) -{ ATOMIC_INIT(ptr, value); } -inline uint ReadRef(RefCount *ptr) -{ return ATOMIC_LOAD(ptr); } -inline uint IncrementRef(RefCount *ptr) -{ return ATOMIC_ADD(uint, ptr, 1)+1; } -inline uint DecrementRef(RefCount *ptr) -{ return ATOMIC_SUB(uint, ptr, 1)-1; } - - -/* NOTE: Not atomic! */ -inline int ExchangeInt(volatile int *ptr, int newval) -{ - int old = *ptr; - *ptr = newval; - return old; -} - -typedef void *volatile XchgPtr; -/* NOTE: Not atomic! */ -inline void *ExchangePtr(XchgPtr *ptr, void *newval) -{ - void *old = *ptr; - *ptr = newval; - return old; -} - -/* This is *NOT* atomic, but is a handy utility macro to compare-and-swap non- - * atomic variables. */ -#define COMPARE_EXCHANGE(_val, _oldval, _newval) ((*(_val) == *(_oldval)) ? ((*(_val)=(_newval)),true) : ((*(_oldval)=*(_val)),false)) - - -#ifdef __cplusplus -} -#endif - -#endif /* AL_ATOMIC_H */ diff --git a/include/bool.h b/include/bool.h deleted file mode 100644 index 6f714d0..0000000 --- a/include/bool.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef AL_BOOL_H -#define AL_BOOL_H - -#ifdef HAVE_STDBOOL_H -#include -#endif - -#ifndef bool -#ifdef HAVE_C99_BOOL -#define bool _Bool -#else -#define bool int -#endif -#define false 0 -#define true 1 -#endif - -#endif /* AL_BOOL_H */ diff --git a/include/config-android.h b/include/config-android.h index 804359e..b85b4a8 100644 --- a/include/config-android.h +++ b/include/config-android.h @@ -2,27 +2,12 @@ #define AL_API __attribute__((visibility("protected"))) #define ALC_API __attribute__((visibility("protected"))) -#ifdef IN_IDE_PARSER -/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but - * recent versions (at least 4.5.1) do recognize GCC's __restrict. */ -#define restrict __restrict -#endif - -/* Define any available alignment declaration */ -#define ALIGN(x) __attribute__((aligned(x))) - -/* Define a built-in call indicating an aligned data pointer */ -#define ASSUME_ALIGNED(x, y) x +/* Define a restrict macro for non-aliased pointers */ +#define RESTRICT __restrict /* Define if HRTF data is embedded in the library */ #define ALSOFT_EMBED_HRTF_DATA -/* Define if we have the sysconf function */ -/* #undef HAVE_SYSCONF */ - -/* Define if we have the C11 aligned_alloc function */ -/* #undef HAVE_ALIGNED_ALLOC */ - /* Define if we have the posix_memalign function */ /* #undef HAVE_POSIX_MEMALIGN */ @@ -92,70 +77,12 @@ /* Define if we have the stat function */ #define HAVE_STAT -/* Define if we have the lrintf function */ -#define HAVE_LRINTF - -/* Define if we have the modff function */ -#define HAVE_MODFF - -/* Define if we have the log2f function */ -#if defined(HXCPP_ARM64) || defined(HXCPP_CPP11) // Not supporting in Android NDK platform < 18, define when increasing platform -#define HAVE_LOG2F -#else -/* undef HAVE_LOG2F */ -#endif - -/* Define if we have the cbrtf function */ -#define HAVE_CBRTF - -/* Define if we have the copysignf function */ -#define HAVE_COPYSIGNF - -/* Define if we have the strtof function */ -/* #undef HAVE_STRTOF */ - -/* Define if we have the strnlen function */ -#define HAVE_STRNLEN - -/* Define if we have the __int64 type */ -/* #undef HAVE___INT64 */ - /* Define to the size of a long int type */ #define SIZEOF_LONG 4 -/* Define to the size of a long long int type */ -#define SIZEOF_LONG_LONG 8 - -/* Define if we have C99 _Bool support */ -#define HAVE_C99_BOOL - -/* Define if we have C11 _Static_assert support */ -#define HAVE_C11_STATIC_ASSERT - -/* Define if we have C11 _Alignas support */ -#define HAVE_C11_ALIGNAS - -/* Define if we have C11 _Atomic support */ -#define HAVE_C11_ATOMIC - -/* Define if we have GCC's destructor attribute */ -#define HAVE_GCC_DESTRUCTOR - /* Define if we have GCC's format attribute */ #define HAVE_GCC_FORMAT -/* Define if we have stdint.h */ -#define HAVE_STDINT_H - -/* Define if we have stdbool.h */ -#define HAVE_STDBOOL_H - -/* Define if we have stdalign.h */ -#define HAVE_STDALIGN_H - -/* Define if we have windows.h */ -/* #undef HAVE_WINDOWS_H */ - /* Define if we have dlfcn.h */ #define HAVE_DLFCN_H @@ -168,9 +95,6 @@ /* Define if we have dirent.h */ #define HAVE_DIRENT_H -/* Define if we have strings.h */ -#define HAVE_STRINGS_H - /* Define if we have cpuid.h */ /* #undef HAVE_CPUID_H */ @@ -186,15 +110,6 @@ /* Define if we have initguid.h */ /* #undef HAVE_INITGUID_H */ -/* Define if we have ieeefp.h */ -/* #undef HAVE_IEEEFP_H */ - -/* Define if we have float.h */ -#define HAVE_FLOAT_H - -/* Define if we have fenv.h */ -#define HAVE_FENV_H - /* Define if we have GCC's __get_cpuid() */ /* #undef HAVE_GCC_GET_CPUID */ @@ -207,11 +122,8 @@ /* Define if we have the _BitScanForward() intrinsic */ /* #undef HAVE_BITSCANFORWARD_INTRINSIC */ -/* Define if we have _controlfp() */ -/* #undef HAVE__CONTROLFP */ - -/* Define if we have __control87_2() */ -/* #undef HAVE___CONTROL87_2 */ +/* Define if we have SSE intrinsics */ +/* #undef HAVE_SSE_INTRINSICS */ /* Define if we have pthread_setschedparam() */ #define HAVE_PTHREAD_SETSCHEDPARAM @@ -227,9 +139,3 @@ /* Define if we have pthread_set_name_np() */ /* #undef HAVE_PTHREAD_SET_NAME_NP */ - -/* Define if we have pthread_mutexattr_setkind_np() */ -/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ - -/* Define if we have pthread_mutex_timedlock() */ -/* #undef HAVE_PTHREAD_MUTEX_TIMEDLOCK */ diff --git a/include/config-linux-x86_64.h b/include/config-linux-x86_64.h index 2b544fb..380fe19 100644 --- a/include/config-linux-x86_64.h +++ b/include/config-linux-x86_64.h @@ -2,27 +2,12 @@ #define AL_API __attribute__((visibility("protected"))) #define ALC_API __attribute__((visibility("protected"))) -#ifdef IN_IDE_PARSER -/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but - * recent versions (at least 4.5.1) do recognize GCC's __restrict. */ -#define restrict __restrict -#endif - -/* Define any available alignment declaration */ -#define ALIGN(x) __attribute__((aligned(x))) - -/* Define a built-in call indicating an aligned data pointer */ -#define ASSUME_ALIGNED(x, y) x +/* Define a restrict macro for non-aliased pointers */ +#define RESTRICT __restrict /* Define if HRTF data is embedded in the library */ #define ALSOFT_EMBED_HRTF_DATA -/* Define if we have the sysconf function */ -/* #undef HAVE_SYSCONF */ - -/* Define if we have the C11 aligned_alloc function */ -/* #undef HAVE_ALIGNED_ALLOC */ - /* Define if we have the posix_memalign function */ #define HAVE_POSIX_MEMALIGN @@ -96,68 +81,12 @@ /* Define if we have the stat function */ #define HAVE_STAT -/* Define if we have the lrintf function */ -#define HAVE_LRINTF - -/* Define if we have the modff function */ -#define HAVE_MODFF - -/* Define if we have the log2f function */ -#define HAVE_LOG2F - -/* Define if we have the cbrtf function */ -#define HAVE_CBRTF - -/* Define if we have the copysignf function */ -#define HAVE_COPYSIGNF - -/* Define if we have the strtof function */ -#define HAVE_STRTOF - -/* Define if we have the strnlen function */ -/* #undef HAVE_STRNLEN */ - -/* Define if we have the __int64 type */ -/* #undef HAVE___INT64 */ - /* Define to the size of a long int type */ #define SIZEOF_LONG 8 -/* Define to the size of a long long int type */ -#define SIZEOF_LONG_LONG 8 - -#if __cplusplus > 199711L -/* Define if we have C99 _Bool support */ -#define HAVE_C99_BOOL - -/* Define if we have C11 _Static_assert support */ -#define HAVE_C11_STATIC_ASSERT - -/* Define if we have C11 _Alignas support */ -#define HAVE_C11_ALIGNAS - -/* Define if we have C11 _Atomic support */ -#define HAVE_C11_ATOMIC -#endif - -/* Define if we have GCC's destructor attribute */ -#define HAVE_GCC_DESTRUCTOR - /* Define if we have GCC's format attribute */ #define HAVE_GCC_FORMAT -/* Define if we have stdint.h */ -#define HAVE_STDINT_H - -/* Define if we have stdbool.h */ -#define HAVE_STDBOOL_H - -/* Define if we have stdalign.h */ -#define HAVE_STDALIGN_H - -/* Define if we have windows.h */ -/* #undef HAVE_WINDOWS_H */ - /* Define if we have dlfcn.h */ #define HAVE_DLFCN_H @@ -170,9 +99,6 @@ /* Define if we have dirent.h */ #define HAVE_DIRENT_H -/* Define if we have strings.h */ -#define HAVE_STRINGS_H - /* Define if we have cpuid.h */ #ifndef RASPBERRYPI #define HAVE_CPUID_H @@ -190,15 +116,6 @@ /* Define if we have initguid.h */ /* #undef HAVE_INITGUID_H */ -/* Define if we have ieeefp.h */ -/* #undef HAVE_IEEEFP_H */ - -/* Define if we have float.h */ -#define HAVE_FLOAT_H - -/* Define if we have fenv.h */ -#define HAVE_FENV_H - /* Define if we have GCC's __get_cpuid() */ #define HAVE_GCC_GET_CPUID @@ -211,11 +128,8 @@ /* Define if we have the _BitScanForward() intrinsic */ /* #undef HAVE_BITSCANFORWARD_INTRINSIC */ -/* Define if we have _controlfp() */ -/* #undef HAVE__CONTROLFP */ - -/* Define if we have __control87_2() */ -/* #undef HAVE___CONTROL87_2 */ +/* Define if we have SSE intrinsics */ +#define HAVE_SSE_INTRINSICS /* Define if we have pthread_setschedparam() */ #define HAVE_PTHREAD_SETSCHEDPARAM @@ -231,9 +145,3 @@ /* Define if we have pthread_set_name_np() */ /* #undef HAVE_PTHREAD_SET_NAME_NP */ - -/* Define if we have pthread_mutexattr_setkind_np() */ -/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ - -/* Define if we have pthread_mutex_timedlock() */ -#define HAVE_PTHREAD_MUTEX_TIMEDLOCK diff --git a/include/config-macos-x86_64.h b/include/config-macos-x86_64.h index 1d0c62a..473e215 100644 --- a/include/config-macos-x86_64.h +++ b/include/config-macos-x86_64.h @@ -2,27 +2,12 @@ #define AL_API __attribute__((visibility("default"))) #define ALC_API __attribute__((visibility("default"))) -#ifdef IN_IDE_PARSER -/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but - * recent versions (at least 4.5.1) do recognize GCC's __restrict. */ -#define restrict __restrict -#endif - -/* Define any available alignment declaration */ -#define ALIGN(x) __attribute__((aligned(x))) - -/* Define a built-in call indicating an aligned data pointer */ -#define ASSUME_ALIGNED(x, y) x +/* Define a restrict macro for non-aliased pointers */ +#define RESTRICT __restrict /* Define if HRTF data is embedded in the library */ #define ALSOFT_EMBED_HRTF_DATA -/* Define if we have the sysconf function */ -/* #undef HAVE_SYSCONF */ - -/* Define if we have the C11 aligned_alloc function */ -/* #undef HAVE_ALIGNED_ALLOC */ - /* Define if we have the posix_memalign function */ #define HAVE_POSIX_MEMALIGN @@ -92,66 +77,12 @@ /* Define if we have the stat function */ #define HAVE_STAT -/* Define if we have the lrintf function */ -#define HAVE_LRINTF - -/* Define if we have the modff function */ -#define HAVE_MODFF - -/* Define if we have the log2f function */ -#define HAVE_LOG2F - -/* Define if we have the cbrtf function */ -#define HAVE_CBRTF - -/* Define if we have the copysignf function */ -#define HAVE_COPYSIGNF - -/* Define if we have the strtof function */ -#define HAVE_STRTOF - -/* Define if we have the strnlen function */ -/* #undef HAVE_STRNLEN */ - -/* Define if we have the __int64 type */ -/* #undef HAVE___INT64 */ - /* Define to the size of a long int type */ #define SIZEOF_LONG 8 -/* Define to the size of a long long int type */ -#define SIZEOF_LONG_LONG 8 - -/* Define if we have C99 _Bool support */ -//#define HAVE_C99_BOOL - -/* Define if we have C11 _Static_assert support */ -//#define HAVE_C11_STATIC_ASSERT - -/* Define if we have C11 _Alignas support */ -//#define HAVE_C11_ALIGNAS - -/* Define if we have C11 _Atomic support */ -//#define HAVE_C11_ATOMIC - -/* Define if we have GCC's destructor attribute */ -#define HAVE_GCC_DESTRUCTOR - /* Define if we have GCC's format attribute */ #define HAVE_GCC_FORMAT -/* Define if we have stdint.h */ -#define HAVE_STDINT_H - -/* Define if we have stdbool.h */ -#define HAVE_STDBOOL_H - -/* Define if we have stdalign.h */ -#define HAVE_STDALIGN_H - -/* Define if we have windows.h */ -/* #undef HAVE_WINDOWS_H */ - /* Define if we have dlfcn.h */ #define HAVE_DLFCN_H @@ -164,9 +95,6 @@ /* Define if we have dirent.h */ #define HAVE_DIRENT_H -/* Define if we have strings.h */ -#define HAVE_STRINGS_H - /* Define if we have cpuid.h */ #define HAVE_CPUID_H @@ -182,15 +110,6 @@ /* Define if we have initguid.h */ /* #undef HAVE_INITGUID_H */ -/* Define if we have ieeefp.h */ -/* #undef HAVE_IEEEFP_H */ - -/* Define if we have float.h */ -#define HAVE_FLOAT_H - -/* Define if we have fenv.h */ -#define HAVE_FENV_H - /* Define if we have GCC's __get_cpuid() */ #define HAVE_GCC_GET_CPUID @@ -203,11 +122,8 @@ /* Define if we have the _BitScanForward() intrinsic */ /* #undef HAVE_BITSCANFORWARD_INTRINSIC */ -/* Define if we have _controlfp() */ -/* #undef HAVE__CONTROLFP */ - -/* Define if we have __control87_2() */ -/* #undef HAVE___CONTROL87_2 */ +/* Define if we have SSE intrinsics */ +#define HAVE_SSE_INTRINSICS /* Define if we have pthread_setschedparam() */ #define HAVE_PTHREAD_SETSCHEDPARAM @@ -223,9 +139,3 @@ /* Define if we have pthread_set_name_np() */ /* #undef HAVE_PTHREAD_SET_NAME_NP */ - -/* Define if we have pthread_mutexattr_setkind_np() */ -/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ - -/* Define if we have pthread_mutex_timedlock() */ -#define HAVE_PTHREAD_MUTEX_TIMEDLOCK diff --git a/include/config-windows-x86.h b/include/config-windows-x86.h index 915fbfc..0420787 100644 --- a/include/config-windows-x86.h +++ b/include/config-windows-x86.h @@ -2,16 +2,6 @@ #define AL_API __declspec(dllexport) #define ALC_API __declspec(dllexport) -#ifdef IN_IDE_PARSER -/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but - * recent versions (at least 4.5.1) do recognize GCC's __restrict. */ -#define restrict __restrict -#endif - -#ifndef inline -#define inline __inline -#endif - #if defined(_MSC_VER) && _MSC_VER <1900 #define snprintf _snprintf #endif @@ -23,15 +13,8 @@ #define isfinite _finite #endif -#if _MSC_VER >= 1900 -#define HAVE_STRUCT_TIMESPEC -#endif - -/* Define any available alignment declaration */ -#define ALIGN(x) __declspec(align(x)) - -/* Define a built-in call indicating an aligned data pointer */ -#define ASSUME_ALIGNED(x, y) x +/* Define a restrict macro for non-aliased pointers */ +#define RESTRICT __restrict /* Define if HRTF data is embedded in the library */ #define ALSOFT_EMBED_HRTF_DATA @@ -111,74 +94,12 @@ /* Define if we have the stat function */ #define HAVE_STAT -/* Define if we have the lrintf function */ -#if defined(_MSC_VER) && _MSC_VER >=1900 -#define HAVE_LRINTF -#endif - -/* Define if we have the modff function */ -#define HAVE_MODFF - -/* Define if we have the log2f function */ -/* #undef HAVE_LOG2F */ - -/* Define if we have the cbrtf function */ -/* #undef HAVE_CBRTF */ - -/* Define if we have the copysignf function */ -/* #undef HAVE_COPYSIGNF */ - -/* Define if we have the strtof function */ -#if defined(_MSC_VER) && _MSC_VER >=1900 -#define HAVE_STRTOF -#endif - -/* Define if we have the strnlen function */ -#define HAVE_STRNLEN - -/* Define if we have the __int64 type */ -/* #undef HAVE___INT64 */ - /* Define to the size of a long int type */ #define SIZEOF_LONG 4 -/* Define to the size of a long long int type */ -#define SIZEOF_LONG_LONG 8 - -/* Define if we have C99 _Bool support */ -#if defined(_MSC_VER) && _MSC_VER >=1900 - #define HAVE_C99_BOOL -#endif - -/* Define if we have C11 _Static_assert support */ -/* #undef HAVE_C11_STATIC_ASSERT */ - -/* Define if we have C11 _Alignas support */ -/* #undef HAVE_C11_ALIGNAS */ - -/* Define if we have C11 _Atomic support */ -/* #undef HAVE_C11_ATOMIC */ - -/* Define if we have GCC's destructor attribute */ -/* #undef HAVE_GCC_DESTRUCTOR */ - /* Define if we have GCC's format attribute */ /* #undef HAVE_GCC_FORMAT */ -/* Define if we have stdint.h */ -#define HAVE_STDINT_H - -/* Define if we have stdbool.h */ -#if defined(_MSC_VER) && _MSC_VER >=1900 - #define HAVE_STDBOOL_H -#endif - -/* Define if we have stdalign.h */ -/* #undef HAVE_STDALIGN_H */ - -/* Define if we have windows.h */ -#define HAVE_WINDOWS_H - /* Define if we have dlfcn.h */ /* #undef HAVE_DLFCN_H */ @@ -191,9 +112,6 @@ /* Define if we have dirent.h */ /* #undef HAVE_DIRENT_H */ -/* Define if we have strings.h */ -/* #undef HAVE_STRINGS_H */ - /* Define if we have cpuid.h */ /* #undef HAVE_CPUID_H */ @@ -209,17 +127,6 @@ /* Define if we have initguid.h */ /* #undef HAVE_INITGUID_H */ -/* Define if we have ieeefp.h */ -/* #undef HAVE_IEEEFP_H */ - -/* Define if we have float.h */ -#define HAVE_FLOAT_H - -/* Define if we have fenv.h */ -#if defined(_MSC_VER) && _MSC_VER >=1900 - #undef HAVE_FENV_H -#endif - /* Define if we have GCC's __get_cpuid() */ /* #undef HAVE_GCC_GET_CPUID */ @@ -232,11 +139,8 @@ /* Define if we have the _BitScanForward() intrinsic */ #define HAVE_BITSCANFORWARD_INTRINSIC -/* Define if we have _controlfp() */ -#define HAVE__CONTROLFP - -/* Define if we have __control87_2() */ -#define HAVE___CONTROL87_2 +/* Define if we have SSE intrinsics */ +#define HAVE_SSE_INTRINSICS /* Define if we have pthread_setschedparam() */ /* #undef HAVE_PTHREAD_SETSCHEDPARAM */ @@ -252,9 +156,3 @@ /* Define if we have pthread_set_name_np() */ /* #undef HAVE_PTHREAD_SET_NAME_NP */ - -/* Define if we have pthread_mutexattr_setkind_np() */ -/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ - -/* Define if we have pthread_mutex_timedlock() */ -/* #undef HAVE_PTHREAD_MUTEX_TIMEDLOCK */ diff --git a/include/config-windows-x86_64.h b/include/config-windows-x86_64.h index 3bd8c7c..400da77 100644 --- a/include/config-windows-x86_64.h +++ b/include/config-windows-x86_64.h @@ -2,31 +2,12 @@ #define AL_API __declspec(dllexport) #define ALC_API __declspec(dllexport) -#ifdef IN_IDE_PARSER -/* KDevelop's parser doesn't recognize the C99-standard restrict keyword, but - * recent versions (at least 4.5.1) do recognize GCC's __restrict. */ -#define restrict __restrict -#endif - -#if _MSC_VER >= 1900 -#define HAVE_STRUCT_TIMESPEC -#endif - -/* Define any available alignment declaration */ -#define ALIGN(x) __declspec(align(x)) - -/* Define a built-in call indicating an aligned data pointer */ -#define ASSUME_ALIGNED(x, y) x +/* Define a restrict macro for non-aliased pointers */ +#define RESTRICT __restrict /* Define if HRTF data is embedded in the library */ #define ALSOFT_EMBED_HRTF_DATA -/* Define if we have the sysconf function */ -/* #undef HAVE_SYSCONF */ - -/* Define if we have the C11 aligned_alloc function */ -/* #undef HAVE_ALIGNED_ALLOC */ - /* Define if we have the posix_memalign function */ /* #undef HAVE_POSIX_MEMALIGN */ @@ -67,7 +48,7 @@ #define HAVE_WASAPI /* Define if we have the DSound backend */ -/* #undef HAVE_DSOUND */ +#define HAVE_DSOUND /* Define if we have the Windows Multimedia backend */ #define HAVE_WINMM @@ -96,66 +77,12 @@ /* Define if we have the stat function */ #define HAVE_STAT -/* Define if we have the lrintf function */ -#define HAVE_LRINTF - -/* Define if we have the modff function */ -#define HAVE_MODFF - -/* Define if we have the log2f function */ -#define HAVE_LOG2F - -/* Define if we have the cbrtf function */ -#define HAVE_CBRTF - -/* Define if we have the copysignf function */ -#define HAVE_COPYSIGNF - -/* Define if we have the strtof function */ -#define HAVE_STRTOF - -/* Define if we have the strnlen function */ -#define HAVE_STRNLEN - -/* Define if we have the __int64 type */ -/* #undef HAVE___INT64 */ - /* Define to the size of a long int type */ #define SIZEOF_LONG 4 -/* Define to the size of a long long int type */ -#define SIZEOF_LONG_LONG 8 - -/* Define if we have C99 _Bool support */ -#define HAVE_C99_BOOL - -/* Define if we have C11 _Static_assert support */ -/* #undef HAVE_C11_STATIC_ASSERT */ - -/* Define if we have C11 _Alignas support */ -/* #undef HAVE_C11_ALIGNAS */ - -/* Define if we have C11 _Atomic support */ -/* #undef HAVE_C11_ATOMIC */ - -/* Define if we have GCC's destructor attribute */ -/* #undef HAVE_GCC_DESTRUCTOR */ - /* Define if we have GCC's format attribute */ /* #undef HAVE_GCC_FORMAT */ -/* Define if we have stdint.h */ -#define HAVE_STDINT_H - -/* Define if we have stdbool.h */ -#define HAVE_STDBOOL_H - -/* Define if we have stdalign.h */ -/* #undef HAVE_STDALIGN_H */ - -/* Define if we have windows.h */ -#define HAVE_WINDOWS_H - /* Define if we have dlfcn.h */ /* #undef HAVE_DLFCN_H */ @@ -168,9 +95,6 @@ /* Define if we have dirent.h */ /* #undef HAVE_DIRENT_H */ -/* Define if we have strings.h */ -/* #undef HAVE_STRINGS_H */ - /* Define if we have cpuid.h */ /* #undef HAVE_CPUID_H */ @@ -186,15 +110,6 @@ /* Define if we have initguid.h */ /* #undef HAVE_INITGUID_H */ -/* Define if we have ieeefp.h */ -/* #undef HAVE_IEEEFP_H */ - -/* Define if we have float.h */ -#define HAVE_FLOAT_H - -/* Define if we have fenv.h */ -#define HAVE_FENV_H - /* Define if we have GCC's __get_cpuid() */ /* #undef HAVE_GCC_GET_CPUID */ @@ -207,11 +122,8 @@ /* Define if we have the _BitScanForward() intrinsic */ #define HAVE_BITSCANFORWARD_INTRINSIC -/* Define if we have _controlfp() */ -#define HAVE__CONTROLFP - -/* Define if we have __control87_2() */ -/* #undef HAVE___CONTROL87_2 */ +/* Define if we have SSE intrinsics */ +#define HAVE_SSE_INTRINSICS /* Define if we have pthread_setschedparam() */ /* #undef HAVE_PTHREAD_SETSCHEDPARAM */ @@ -227,9 +139,3 @@ /* Define if we have pthread_set_name_np() */ /* #undef HAVE_PTHREAD_SET_NAME_NP */ - -/* Define if we have pthread_mutexattr_setkind_np() */ -/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ - -/* Define if we have pthread_mutex_timedlock() */ -/* #undef HAVE_PTHREAD_MUTEX_TIMEDLOCK */ diff --git a/include/static_assert.h b/include/static_assert.h deleted file mode 100644 index bf0ce06..0000000 --- a/include/static_assert.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef AL_STATIC_ASSERT_H -#define AL_STATIC_ASSERT_H - -#include - - -#ifndef static_assert -#ifdef HAVE_C11_STATIC_ASSERT -#define static_assert _Static_assert -#else -#define CTASTR2(_pre,_post) _pre##_post -#define CTASTR(_pre,_post) CTASTR2(_pre,_post) -#if defined(__COUNTER__) -#define static_assert(_cond, _msg) typedef struct { int CTASTR(static_assert_failed_at_line_,__LINE__) : !!(_cond); } CTASTR(static_assertion_,__COUNTER__) -#else -#define static_assert(_cond, _msg) struct { int CTASTR(static_assert_failed_at_line_,__LINE__) : !!(_cond); } -#endif -#endif -#endif - -#endif /* AL_STATIC_ASSERT_H */ diff --git a/router/al.c b/router/al.cpp similarity index 85% rename from router/al.c rename to router/al.cpp index 8dd888d..4c8b000 100644 --- a/router/al.c +++ b/router/al.cpp @@ -7,36 +7,36 @@ #include "router.h" -atomic_DriverIfacePtr CurrentCtxDriver = ATOMIC_INIT_STATIC(NULL); +std::atomic CurrentCtxDriver{nullptr}; #define DECL_THUNK1(R,n,T1) AL_API R AL_APIENTRY n(T1 a) \ { \ - DriverIface *iface = altss_get(ThreadCtxDriver); \ - if(!iface) iface = ATOMIC_LOAD(&CurrentCtxDriver, almemory_order_acquire);\ + DriverIface *iface = ThreadCtxDriver; \ + if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \ return iface->n(a); \ } #define DECL_THUNK2(R,n,T1,T2) AL_API R AL_APIENTRY n(T1 a, T2 b) \ { \ - DriverIface *iface = altss_get(ThreadCtxDriver); \ - if(!iface) iface = ATOMIC_LOAD(&CurrentCtxDriver, almemory_order_acquire);\ + DriverIface *iface = ThreadCtxDriver; \ + if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \ return iface->n(a, b); \ } #define DECL_THUNK3(R,n,T1,T2,T3) AL_API R AL_APIENTRY n(T1 a, T2 b, T3 c) \ { \ - DriverIface *iface = altss_get(ThreadCtxDriver); \ - if(!iface) iface = ATOMIC_LOAD(&CurrentCtxDriver, almemory_order_acquire);\ + DriverIface *iface = ThreadCtxDriver; \ + if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \ return iface->n(a, b, c); \ } #define DECL_THUNK4(R,n,T1,T2,T3,T4) AL_API R AL_APIENTRY n(T1 a, T2 b, T3 c, T4 d) \ { \ - DriverIface *iface = altss_get(ThreadCtxDriver); \ - if(!iface) iface = ATOMIC_LOAD(&CurrentCtxDriver, almemory_order_acquire);\ + DriverIface *iface = ThreadCtxDriver; \ + if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \ return iface->n(a, b, c, d); \ } #define DECL_THUNK5(R,n,T1,T2,T3,T4,T5) AL_API R AL_APIENTRY n(T1 a, T2 b, T3 c, T4 d, T5 e) \ { \ - DriverIface *iface = altss_get(ThreadCtxDriver); \ - if(!iface) iface = ATOMIC_LOAD(&CurrentCtxDriver, almemory_order_acquire);\ + DriverIface *iface = ThreadCtxDriver; \ + if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); \ return iface->n(a, b, c, d, e); \ } @@ -46,8 +46,8 @@ atomic_DriverIfacePtr CurrentCtxDriver = ATOMIC_INIT_STATIC(NULL); */ AL_API ALenum AL_APIENTRY alGetError(void) { - DriverIface *iface = altss_get(ThreadCtxDriver); - if(!iface) iface = ATOMIC_LOAD(&CurrentCtxDriver, almemory_order_acquire); + DriverIface *iface = ThreadCtxDriver; + if(!iface) iface = CurrentCtxDriver.load(std::memory_order_acquire); return iface ? iface->alGetError() : AL_NO_ERROR; } diff --git a/router/alc.c b/router/alc.cpp similarity index 58% rename from router/alc.c rename to router/alc.cpp index 946c7d4..c99e7c9 100644 --- a/router/alc.c +++ b/router/alc.cpp @@ -6,18 +6,21 @@ #include #include +#include +#include +#include + #include "AL/alc.h" +#include "alstring.h" #include "router.h" -#include "almalloc.h" - -#define COUNTOF(x) (sizeof(x)/sizeof(x[0])) -#define DECL(x) { #x, (ALCvoid*)(x) } -static const struct { +#define DECL(x) { #x, reinterpret_cast(x) } +struct FuncExportEntry { const ALCchar *funcName; ALCvoid *address; -} alcFunctions[] = { +}; +static const std::array alcFunctions{{ DECL(alcCreateContext), DECL(alcMakeContextCurrent), DECL(alcProcessContext), @@ -115,14 +118,15 @@ static const struct { DECL(alDopplerVelocity), DECL(alSpeedOfSound), DECL(alDistanceModel), -}; +}}; #undef DECL #define DECL(x) { #x, (x) } -static const struct { +struct EnumExportEntry { const ALCchar *enumName; ALCenum value; -} alcEnumerations[] = { +}; +static const std::array alcEnumerations{{ DECL(ALC_INVALID), DECL(ALC_FALSE), DECL(ALC_TRUE), @@ -228,7 +232,7 @@ static const struct { DECL(AL_LINEAR_DISTANCE_CLAMPED), DECL(AL_EXPONENT_DISTANCE), DECL(AL_EXPONENT_DISTANCE_CLAMPED), -}; +}}; #undef DECL static const ALCchar alcNoError[] = "No Error"; @@ -245,77 +249,54 @@ static const ALCint alcMajorVersion = 1; static const ALCint alcMinorVersion = 1; -static almtx_t EnumerationLock; -static almtx_t ContextSwitchLock; +static std::mutex EnumerationLock; +static std::mutex ContextSwitchLock; -static ATOMIC(ALCenum) LastError = ATOMIC_INIT_STATIC(ALC_NO_ERROR); -static PtrIntMap DeviceIfaceMap = PTRINTMAP_STATIC_INITIALIZE; -static PtrIntMap ContextIfaceMap = PTRINTMAP_STATIC_INITIALIZE; +static std::atomic LastError{ALC_NO_ERROR}; +static PtrIntMap DeviceIfaceMap; +static PtrIntMap ContextIfaceMap; typedef struct EnumeratedList { - ALCchar *Names; - ALCchar *NamesEnd; - ALCint *Indicies; - ALCsizei IndexSize; -} EnumeratedList; -static EnumeratedList DevicesList = { NULL, NULL, NULL, 0 }; -static EnumeratedList AllDevicesList = { NULL, NULL, NULL, 0 }; -static EnumeratedList CaptureDevicesList = { NULL, NULL, NULL, 0 }; - -static void ClearDeviceList(EnumeratedList *list) -{ - al_free(list->Names); - list->Names = NULL; - list->NamesEnd = NULL; + std::vector Names; + std::vector Indicies; - al_free(list->Indicies); - list->Indicies = NULL; - list->IndexSize = 0; -} + void clear() + { + Names.clear(); + Indicies.clear(); + } +} EnumeratedList; +static EnumeratedList DevicesList; +static EnumeratedList AllDevicesList; +static EnumeratedList CaptureDevicesList; static void AppendDeviceList(EnumeratedList *list, const ALCchar *names, ALint idx) { const ALCchar *name_end = names; - ALCsizei count = 0; - ALCchar *new_list; - ALCint *new_indicies; - size_t len; - ALCsizei i; + if(!name_end) return; - if(!name_end) - return; + ALCsizei count = 0; while(*name_end) { TRACE("Enumerated \"%s\", driver %d\n", name_end, idx); - count++; + ++count; name_end += strlen(name_end)+1; } if(names == name_end) return; - len = (list->NamesEnd - list->Names) + (name_end - names); - new_list = al_calloc(DEF_ALIGN, len + 1); - memcpy(new_list, list->Names, list->NamesEnd - list->Names); - memcpy(new_list + (list->NamesEnd - list->Names), names, name_end - names); - al_free(list->Names); - list->Names = new_list; - list->NamesEnd = list->Names + len; - - new_indicies = al_calloc(16, sizeof(ALCint)*(list->IndexSize + count)); - for(i = 0;i < list->IndexSize;i++) - new_indicies[i] = list->Indicies[i]; - for(i = 0;i < count;i++) - new_indicies[list->IndexSize+i] = idx; - al_free(list->Indicies); - list->Indicies = new_indicies; - list->IndexSize += count; + list->Names.reserve(list->Names.size() + (name_end - names) + 1); + list->Names.insert(list->Names.cend(), names, name_end); + + list->Indicies.reserve(list->Indicies.size() + count); + list->Indicies.insert(list->Indicies.cend(), count, idx); } static ALint GetDriverIndexForName(const EnumeratedList *list, const ALCchar *name) { - const ALCchar *devnames = list->Names; - const ALCint *index = list->Indicies; + const ALCchar *devnames = list->Names.data(); + const ALCint *index = list->Indicies.data(); while(devnames && *devnames) { @@ -327,30 +308,11 @@ static ALint GetDriverIndexForName(const EnumeratedList *list, const ALCchar *na return -1; } -void InitALC(void) -{ - almtx_init(&EnumerationLock, almtx_recursive); - almtx_init(&ContextSwitchLock, almtx_plain); -} - -void ReleaseALC(void) -{ - ClearDeviceList(&DevicesList); - ClearDeviceList(&AllDevicesList); - ClearDeviceList(&CaptureDevicesList); - - ResetPtrIntMap(&ContextIfaceMap); - ResetPtrIntMap(&DeviceIfaceMap); - - almtx_destroy(&ContextSwitchLock); - almtx_destroy(&EnumerationLock); -} - ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename) { - ALCdevice *device = NULL; - ALint idx; + ALCdevice *device = nullptr; + ALint idx = 0; /* Prior to the enumeration extension, apps would hardcode these names as a * quality hint for the wrapper driver. Ignore them since there's no sane @@ -360,51 +322,51 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename) strcmp(devicename, "DirectSound3D") == 0 || strcmp(devicename, "DirectSound") == 0 || strcmp(devicename, "MMSYSTEM") == 0)) - devicename = NULL; + devicename = nullptr; if(devicename) { - almtx_lock(&EnumerationLock); - if(!DevicesList.Names) - (void)alcGetString(NULL, ALC_DEVICE_SPECIFIER); - idx = GetDriverIndexForName(&DevicesList, devicename); - if(idx < 0) - { - if(!AllDevicesList.Names) - (void)alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); - idx = GetDriverIndexForName(&AllDevicesList, devicename); + { std::lock_guard _{EnumerationLock}; + if(DevicesList.Names.empty()) + (void)alcGetString(nullptr, ALC_DEVICE_SPECIFIER); + idx = GetDriverIndexForName(&DevicesList, devicename); + if(idx < 0) + { + if(AllDevicesList.Names.empty()) + (void)alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER); + idx = GetDriverIndexForName(&AllDevicesList, devicename); + } } - almtx_unlock(&EnumerationLock); + if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_VALUE); + LastError.store(ALC_INVALID_VALUE); TRACE("Failed to find driver for name \"%s\"\n", devicename); - return NULL; + return nullptr; } TRACE("Found driver %d for name \"%s\"\n", idx, devicename); device = DriverList[idx].alcOpenDevice(devicename); } else { - int i; - for(i = 0;i < DriverListSize;i++) + for(const auto &drv : DriverList) { - if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) { - idx = i; TRACE("Using default device from driver %d\n", idx); - device = DriverList[idx].alcOpenDevice(NULL); + device = drv.alcOpenDevice(nullptr); break; } + ++idx; } } if(device) { - if(InsertPtrIntMapEntry(&DeviceIfaceMap, device, idx) != ALC_NO_ERROR) + if(DeviceIfaceMap.insert(device, idx) != ALC_NO_ERROR) { DriverList[idx].alcCloseDevice(device); - device = NULL; + device = nullptr; } } @@ -415,14 +377,14 @@ ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) { ALint idx; - if(!device || (idx=LookupPtrIntMapKey(&DeviceIfaceMap, device)) < 0) + if(!device || (idx=DeviceIfaceMap.lookupByKey(device)) < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); return ALC_FALSE; } if(!DriverList[idx].alcCloseDevice(device)) return ALC_FALSE; - RemovePtrIntMapKey(&DeviceIfaceMap, device); + DeviceIfaceMap.removeByKey(device); return ALC_TRUE; } @@ -432,18 +394,18 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin ALCcontext *context; ALint idx; - if(!device || (idx=LookupPtrIntMapKey(&DeviceIfaceMap, device)) < 0) + if(!device || (idx=DeviceIfaceMap.lookupByKey(device)) < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); - return ALC_FALSE; + LastError.store(ALC_INVALID_DEVICE); + return nullptr; } context = DriverList[idx].alcCreateContext(device, attrlist); if(context) { - if(InsertPtrIntMapEntry(&ContextIfaceMap, context, idx) != ALC_NO_ERROR) + if(ContextIfaceMap.insert(context, idx) != ALC_NO_ERROR) { DriverList[idx].alcDestroyContext(context); - context = NULL; + context = nullptr; } } @@ -454,21 +416,17 @@ ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context) { ALint idx = -1; - almtx_lock(&ContextSwitchLock); + std::lock_guard _{ContextSwitchLock}; if(context) { - idx = LookupPtrIntMapKey(&ContextIfaceMap, context); + idx = ContextIfaceMap.lookupByKey(context); if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT); - almtx_unlock(&ContextSwitchLock); + LastError.store(ALC_INVALID_CONTEXT); return ALC_FALSE; } if(!DriverList[idx].alcMakeContextCurrent(context)) - { - almtx_unlock(&ContextSwitchLock); return ALC_FALSE; - } } /* Unset the context from the old driver if it's different from the new @@ -476,22 +434,21 @@ ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context) */ if(idx < 0) { - DriverIface *oldiface = altss_get(ThreadCtxDriver); - if(oldiface) oldiface->alcSetThreadContext(NULL); - oldiface = ATOMIC_EXCHANGE_PTR_SEQ(&CurrentCtxDriver, NULL); - if(oldiface) oldiface->alcMakeContextCurrent(NULL); + DriverIface *oldiface = ThreadCtxDriver; + if(oldiface) oldiface->alcSetThreadContext(nullptr); + oldiface = CurrentCtxDriver.exchange(nullptr); + if(oldiface) oldiface->alcMakeContextCurrent(nullptr); } else { - DriverIface *oldiface = altss_get(ThreadCtxDriver); + DriverIface *oldiface = ThreadCtxDriver; if(oldiface && oldiface != &DriverList[idx]) - oldiface->alcSetThreadContext(NULL); - oldiface = ATOMIC_EXCHANGE_PTR_SEQ(&CurrentCtxDriver, &DriverList[idx]); + oldiface->alcSetThreadContext(nullptr); + oldiface = CurrentCtxDriver.exchange(&DriverList[idx]); if(oldiface && oldiface != &DriverList[idx]) - oldiface->alcMakeContextCurrent(NULL); + oldiface->alcMakeContextCurrent(nullptr); } - almtx_unlock(&ContextSwitchLock); - altss_set(ThreadCtxDriver, NULL); + ThreadCtxDriver = nullptr; return ALC_TRUE; } @@ -500,55 +457,55 @@ ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context) { if(context) { - ALint idx = LookupPtrIntMapKey(&ContextIfaceMap, context); + ALint idx = ContextIfaceMap.lookupByKey(context); if(idx >= 0) return DriverList[idx].alcProcessContext(context); } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT); + LastError.store(ALC_INVALID_CONTEXT); } ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context) { if(context) { - ALint idx = LookupPtrIntMapKey(&ContextIfaceMap, context); + ALint idx = ContextIfaceMap.lookupByKey(context); if(idx >= 0) return DriverList[idx].alcSuspendContext(context); } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT); + LastError.store(ALC_INVALID_CONTEXT); } ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context) { ALint idx; - if(!context || (idx=LookupPtrIntMapKey(&ContextIfaceMap, context)) < 0) + if(!context || (idx=ContextIfaceMap.lookupByKey(context)) < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT); + LastError.store(ALC_INVALID_CONTEXT); return; } DriverList[idx].alcDestroyContext(context); - RemovePtrIntMapKey(&ContextIfaceMap, context); + ContextIfaceMap.removeByKey(context); } ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void) { - DriverIface *iface = altss_get(ThreadCtxDriver); - if(!iface) iface = ATOMIC_LOAD_SEQ(&CurrentCtxDriver); - return iface ? iface->alcGetCurrentContext() : NULL; + DriverIface *iface = ThreadCtxDriver; + if(!iface) iface = CurrentCtxDriver.load(); + return iface ? iface->alcGetCurrentContext() : nullptr; } ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context) { if(context) { - ALint idx = LookupPtrIntMapKey(&ContextIfaceMap, context); + ALint idx = ContextIfaceMap.lookupByKey(context); if(idx >= 0) return DriverList[idx].alcGetContextsDevice(context); } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT); - return NULL; + LastError.store(ALC_INVALID_CONTEXT); + return nullptr; } @@ -556,11 +513,11 @@ ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device) { if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx < 0) return ALC_INVALID_DEVICE; return DriverList[idx].alcGetError(device); } - return ATOMIC_EXCHANGE_SEQ(&LastError, ALC_NO_ERROR); + return LastError.exchange(ALC_NO_ERROR); } ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname) @@ -570,10 +527,10 @@ ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const A if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); return ALC_FALSE; } return DriverList[idx].alcIsExtensionPresent(device, extname); @@ -583,9 +540,9 @@ ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const A ptr = alcExtensionList; while(ptr && *ptr) { - if(strncasecmp(ptr, extname, len) == 0 && (ptr[len] == '\0' || isspace(ptr[len]))) + if(al::strncasecmp(ptr, extname, len) == 0 && (ptr[len] == '\0' || isspace(ptr[len]))) return ALC_TRUE; - if((ptr=strchr(ptr, ' ')) != NULL) + if((ptr=strchr(ptr, ' ')) != nullptr) { do { ++ptr; @@ -597,61 +554,53 @@ ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const A ALC_API void* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname) { - size_t i; - if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); - return NULL; + LastError.store(ALC_INVALID_DEVICE); + return nullptr; } return DriverList[idx].alcGetProcAddress(device, funcname); } - for(i = 0;i < COUNTOF(alcFunctions);i++) - { - if(strcmp(funcname, alcFunctions[i].funcName) == 0) - return alcFunctions[i].address; - } - return NULL; + auto iter = std::find_if(alcFunctions.cbegin(), alcFunctions.cend(), + [funcname](const FuncExportEntry &entry) -> bool + { return strcmp(funcname, entry.funcName) == 0; } + ); + return (iter != alcFunctions.cend()) ? iter->address : nullptr; } ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname) { - size_t i; - if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); return 0; } return DriverList[idx].alcGetEnumValue(device, enumname); } - for(i = 0;i < COUNTOF(alcEnumerations);i++) - { - if(strcmp(enumname, alcEnumerations[i].enumName) == 0) - return alcEnumerations[i].value; - } - return 0; + auto iter = std::find_if(alcEnumerations.cbegin(), alcEnumerations.cend(), + [enumname](const EnumExportEntry &entry) -> bool + { return strcmp(enumname, entry.enumName) == 0; } + ); + return (iter != alcEnumerations.cend()) ? iter->value : 0; } ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param) { - ALsizei i = 0; - if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); - return NULL; + LastError.store(ALC_INVALID_DEVICE); + return nullptr; } return DriverList[idx].alcGetString(device, param); } @@ -674,104 +623,135 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum para return alcExtensionList; case ALC_DEVICE_SPECIFIER: - almtx_lock(&EnumerationLock); - ClearDeviceList(&DevicesList); - for(i = 0;i < DriverListSize;i++) + { std::lock_guard _{EnumerationLock}; + DevicesList.clear(); + ALint idx = 0; + for(const auto &drv : DriverList) { /* Only enumerate names from drivers that support it. */ - if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) AppendDeviceList(&DevicesList, - DriverList[i].alcGetString(NULL, ALC_DEVICE_SPECIFIER), i + drv.alcGetString(nullptr, ALC_DEVICE_SPECIFIER), idx ); + idx++; } - almtx_unlock(&EnumerationLock); - return DevicesList.Names; + /* Ensure the list is double-null termianted. */ + if(DevicesList.Names.empty()) + DevicesList.Names.emplace_back('\0'); + DevicesList.Names.emplace_back('\0'); + return DevicesList.Names.data(); + } case ALC_ALL_DEVICES_SPECIFIER: - almtx_lock(&EnumerationLock); - ClearDeviceList(&AllDevicesList); - for(i = 0;i < DriverListSize;i++) + { std::lock_guard _{EnumerationLock}; + AllDevicesList.clear(); + ALint idx = 0; + for(const auto &drv : DriverList) { /* If the driver doesn't support ALC_ENUMERATE_ALL_EXT, substitute * standard enumeration. */ - if(DriverList[i].alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT")) + if(drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT")) AppendDeviceList(&AllDevicesList, - DriverList[i].alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER), i + drv.alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER), idx ); - else if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) + else if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) AppendDeviceList(&AllDevicesList, - DriverList[i].alcGetString(NULL, ALC_DEVICE_SPECIFIER), i + drv.alcGetString(nullptr, ALC_DEVICE_SPECIFIER), idx ); + ++idx; } - almtx_unlock(&EnumerationLock); - return AllDevicesList.Names; + /* Ensure the list is double-null termianted. */ + if(AllDevicesList.Names.empty()) + AllDevicesList.Names.emplace_back('\0'); + AllDevicesList.Names.emplace_back('\0'); + return AllDevicesList.Names.data(); + } case ALC_CAPTURE_DEVICE_SPECIFIER: - almtx_lock(&EnumerationLock); - ClearDeviceList(&CaptureDevicesList); - for(i = 0;i < DriverListSize;i++) + { std::lock_guard _{EnumerationLock}; + CaptureDevicesList.clear(); + ALint idx = 0; + for(const auto &drv : DriverList) { - if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_EXT_CAPTURE")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE")) AppendDeviceList(&CaptureDevicesList, - DriverList[i].alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER), i + drv.alcGetString(nullptr, ALC_CAPTURE_DEVICE_SPECIFIER), idx ); + ++idx; } - almtx_unlock(&EnumerationLock); - return CaptureDevicesList.Names; + /* Ensure the list is double-null termianted. */ + if(CaptureDevicesList.Names.empty()) + CaptureDevicesList.Names.emplace_back('\0'); + CaptureDevicesList.Names.emplace_back('\0'); + return CaptureDevicesList.Names.data(); + } case ALC_DEFAULT_DEVICE_SPECIFIER: - for(i = 0;i < DriverListSize;i++) - { - if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) - return DriverList[i].alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); - } + { + auto iter = std::find_if(DriverList.cbegin(), DriverList.cend(), + [](const DriverIface &drv) -> bool + { + return drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT"); + } + ); + if(iter != DriverList.cend()) + return iter->alcGetString(nullptr, ALC_DEFAULT_DEVICE_SPECIFIER); return ""; + } case ALC_DEFAULT_ALL_DEVICES_SPECIFIER: - for(i = 0;i < DriverListSize;i++) - { - if(DriverList[i].alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT")) - return DriverList[i].alcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER); - } + { + auto iter = std::find_if(DriverList.cbegin(), DriverList.cend(), + [](const DriverIface &drv) -> bool + { return drv.alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT") != ALC_FALSE; } + ); + if(iter != DriverList.cend()) + return iter->alcGetString(nullptr, ALC_DEFAULT_ALL_DEVICES_SPECIFIER); return ""; + } case ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER: - for(i = 0;i < DriverListSize;i++) - { - if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_EXT_CAPTURE")) - return DriverList[i].alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); - } + { + auto iter = std::find_if(DriverList.cbegin(), DriverList.cend(), + [](const DriverIface &drv) -> bool + { + return drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); + } + ); + if(iter != DriverList.cend()) + return iter->alcGetString(nullptr, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); return ""; + } default: - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_ENUM); + LastError.store(ALC_INVALID_ENUM); break; } - return NULL; + return nullptr; } ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) { if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); return; } return DriverList[idx].alcGetIntegerv(device, param, size, values); } - if(size <= 0 || values == NULL) + if(size <= 0 || values == nullptr) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_VALUE); + LastError.store(ALC_INVALID_VALUE); return; } @@ -790,7 +770,7 @@ ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsi values[0] = alcMinorVersion; return; } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_VALUE); + LastError.store(ALC_INVALID_VALUE); return; case ALC_ATTRIBUTES_SIZE: @@ -801,11 +781,11 @@ ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsi case ALC_MONO_SOURCES: case ALC_STEREO_SOURCES: case ALC_CAPTURE_SAMPLES: - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); return; default: - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_ENUM); + LastError.store(ALC_INVALID_ENUM); return; } } @@ -813,23 +793,24 @@ ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsi ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize) { - ALCdevice *device = NULL; - ALint idx; + ALCdevice *device = nullptr; + ALint idx = 0; if(devicename && devicename[0] == '\0') - devicename = NULL; + devicename = nullptr; if(devicename) { - almtx_lock(&EnumerationLock); - if(!CaptureDevicesList.Names) - (void)alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); - idx = GetDriverIndexForName(&CaptureDevicesList, devicename); - almtx_unlock(&EnumerationLock); + { std::lock_guard _{EnumerationLock}; + if(CaptureDevicesList.Names.empty()) + (void)alcGetString(nullptr, ALC_CAPTURE_DEVICE_SPECIFIER); + idx = GetDriverIndexForName(&CaptureDevicesList, devicename); + } + if(idx < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_VALUE); + LastError.store(ALC_INVALID_VALUE); TRACE("Failed to find driver for name \"%s\"\n", devicename); - return NULL; + return nullptr; } TRACE("Found driver %d for name \"%s\"\n", idx, devicename); device = DriverList[idx].alcCaptureOpenDevice( @@ -838,28 +819,27 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, } else { - int i; - for(i = 0;i < DriverListSize;i++) + for(const auto &drv : DriverList) { - if(DriverList[i].ALCVer >= MAKE_ALC_VER(1, 1) || - DriverList[i].alcIsExtensionPresent(NULL, "ALC_EXT_CAPTURE")) + if(drv.ALCVer >= MAKE_ALC_VER(1, 1) || + drv.alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE")) { - idx = i; TRACE("Using default capture device from driver %d\n", idx); - device = DriverList[idx].alcCaptureOpenDevice( - NULL, frequency, format, buffersize + device = drv.alcCaptureOpenDevice( + nullptr, frequency, format, buffersize ); break; } + ++idx; } } if(device) { - if(InsertPtrIntMapEntry(&DeviceIfaceMap, device, idx) != ALC_NO_ERROR) + if(DeviceIfaceMap.insert(device, idx) != ALC_NO_ERROR) { DriverList[idx].alcCaptureCloseDevice(device); - device = NULL; + device = nullptr; } } @@ -870,14 +850,14 @@ ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device) { ALint idx; - if(!device || (idx=LookupPtrIntMapKey(&DeviceIfaceMap, device)) < 0) + if(!device || (idx=DeviceIfaceMap.lookupByKey(device)) < 0) { - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); return ALC_FALSE; } if(!DriverList[idx].alcCaptureCloseDevice(device)) return ALC_FALSE; - RemovePtrIntMapKey(&DeviceIfaceMap, device); + DeviceIfaceMap.removeByKey(device); return ALC_TRUE; } @@ -885,33 +865,33 @@ ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) { if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx >= 0) return DriverList[idx].alcCaptureStart(device); } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); } ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device) { if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx >= 0) return DriverList[idx].alcCaptureStop(device); } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); } ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) { if(device) { - ALint idx = LookupPtrIntMapKey(&DeviceIfaceMap, device); + ALint idx = DeviceIfaceMap.lookupByKey(device); if(idx >= 0) return DriverList[idx].alcCaptureSamples(device, buffer, samples); } - ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_DEVICE); + LastError.store(ALC_INVALID_DEVICE); } @@ -922,35 +902,35 @@ ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context) if(!context) { - DriverIface *oldiface = altss_get(ThreadCtxDriver); - if(oldiface && !oldiface->alcSetThreadContext(NULL)) + DriverIface *oldiface = ThreadCtxDriver; + if(oldiface && !oldiface->alcSetThreadContext(nullptr)) return ALC_FALSE; - altss_set(ThreadCtxDriver, NULL); + ThreadCtxDriver = nullptr; return ALC_TRUE; } - idx = LookupPtrIntMapKey(&ContextIfaceMap, context); + idx = ContextIfaceMap.lookupByKey(context); if(idx >= 0) { if(DriverList[idx].alcSetThreadContext(context)) { - DriverIface *oldiface = altss_get(ThreadCtxDriver); + DriverIface *oldiface = ThreadCtxDriver; if(oldiface != &DriverList[idx]) { - altss_set(ThreadCtxDriver, &DriverList[idx]); - if(oldiface) oldiface->alcSetThreadContext(NULL); + ThreadCtxDriver = &DriverList[idx]; + if(oldiface) oldiface->alcSetThreadContext(nullptr); } return ALC_TRUE; } - err = DriverList[idx].alcGetError(NULL); + err = DriverList[idx].alcGetError(nullptr); } - ATOMIC_STORE_SEQ(&LastError, err); + LastError.store(err); return ALC_FALSE; } ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void) { - DriverIface *iface = altss_get(ThreadCtxDriver); + DriverIface *iface = ThreadCtxDriver; if(iface) return iface->alcGetThreadContext(); - return NULL; + return nullptr; } diff --git a/router/router.c b/router/router.cpp similarity index 50% rename from router/router.c rename to router/router.cpp index bff7377..85a75ae 100644 --- a/router/router.c +++ b/router/router.cpp @@ -3,22 +3,23 @@ #include "router.h" -#include -#include -#include +#include +#include +#include +#include #include "AL/alc.h" #include "AL/al.h" + #include "almalloc.h" +#include "strutils.h" #include "version.h" -DriverIface *DriverList = NULL; -int DriverListSize = 0; -static int DriverListSizeMax = 0; +std::vector DriverList; -altss_t ThreadCtxDriver; +thread_local DriverIface *ThreadCtxDriver; enum LogLevel LogLevel = LogLevel_Error; FILE *LogFile; @@ -26,95 +27,65 @@ FILE *LogFile; static void LoadDriverList(void); -BOOL APIENTRY DllMain(HINSTANCE UNUSED(module), DWORD reason, void* UNUSED(reserved)) +BOOL APIENTRY DllMain(HINSTANCE, DWORD reason, void*) { - const char *str; - int i; - switch(reason) { - case DLL_PROCESS_ATTACH: - LogFile = stderr; - str = getenv("ALROUTER_LOGFILE"); - if(str && *str != '\0') - { - FILE *f = fopen(str, "w"); - if(f == NULL) - ERR("Could not open log file: %s\n", str); - else - LogFile = f; - } - str = getenv("ALROUTER_LOGLEVEL"); - if(str && *str != '\0') - { - char *end = NULL; - long l = strtol(str, &end, 0); - if(!end || *end != '\0') - ERR("Invalid log level value: %s\n", str); - else if(l < LogLevel_None || l > LogLevel_Trace) - ERR("Log level out of range: %s\n", str); - else - LogLevel = l; - } - TRACE("Initializing router v0.1-%s %s\n", ALSOFT_GIT_COMMIT_HASH, ALSOFT_GIT_BRANCH); - LoadDriverList(); - - altss_create(&ThreadCtxDriver, NULL); - InitALC(); - break; + case DLL_PROCESS_ATTACH: + LogFile = stderr; + if(auto logfname = al::getenv("ALROUTER_LOGFILE")) + { + FILE *f = fopen(logfname->c_str(), "w"); + if(f == nullptr) + ERR("Could not open log file: %s\n", logfname->c_str()); + else + LogFile = f; + } + if(auto loglev = al::getenv("ALROUTER_LOGLEVEL")) + { + char *end = nullptr; + long l = strtol(loglev->c_str(), &end, 0); + if(!end || *end != '\0') + ERR("Invalid log level value: %s\n", loglev->c_str()); + else if(l < LogLevel_None || l > LogLevel_Trace) + ERR("Log level out of range: %s\n", loglev->c_str()); + else + LogLevel = static_cast(l); + } + TRACE("Initializing router v0.1-%s %s\n", ALSOFT_GIT_COMMIT_HASH, ALSOFT_GIT_BRANCH); + LoadDriverList(); - case DLL_THREAD_ATTACH: - break; - case DLL_THREAD_DETACH: - althrd_thread_detach(); - break; + break; - case DLL_PROCESS_DETACH: - ReleaseALC(); - altss_delete(ThreadCtxDriver); + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; - for(i = 0;i < DriverListSize;i++) - { - if(DriverList[i].Module) - FreeLibrary(DriverList[i].Module); - } - al_free(DriverList); - DriverList = NULL; - DriverListSize = 0; - DriverListSizeMax = 0; + case DLL_PROCESS_DETACH: + DriverList.clear(); - if(LogFile && LogFile != stderr) - fclose(LogFile); - LogFile = NULL; + if(LogFile && LogFile != stderr) + fclose(LogFile); + LogFile = nullptr; - althrd_deinit(); - break; + break; } return TRUE; } -#ifdef __GNUC__ -#define CAST_FUNC(x) (__typeof(x)) -#else -#define CAST_FUNC(x) (void*) -#endif - static void AddModule(HMODULE module, const WCHAR *name) { - DriverIface newdrv; - int err = 0; - int i; - - for(i = 0;i < DriverListSize;i++) + for(auto &drv : DriverList) { - if(DriverList[i].Module == module) + if(drv.Module == module) { - TRACE("Skipping already-loaded module %p\n", module); + TRACE("Skipping already-loaded module %p\n", decltype(std::declval()){module}); FreeLibrary(module); return; } - if(wcscmp(DriverList[i].Name, name) == 0) + if(drv.Name == name) { TRACE("Skipping similarly-named module %ls\n", name); FreeLibrary(module); @@ -122,22 +93,14 @@ static void AddModule(HMODULE module, const WCHAR *name) } } - if(DriverListSize == DriverListSizeMax) - { - int newmax = DriverListSizeMax ? DriverListSizeMax<<1 : 4; - void *newlist = al_calloc(DEF_ALIGN, sizeof(DriverList[0])*newmax); - if(!newlist) return; - - memcpy(newlist, DriverList, DriverListSize*sizeof(DriverList[0])); - al_free(DriverList); - DriverList = newlist; - DriverListSizeMax = newmax; - } + DriverList.emplace_back(name, module); + DriverIface &newdrv = DriverList.back(); - memset(&newdrv, 0, sizeof(newdrv)); /* Load required functions. */ + int err = 0; #define LOAD_PROC(x) do { \ - newdrv.x = CAST_FUNC(newdrv.x) GetProcAddress(module, #x); \ + newdrv.x = reinterpret_cast(reinterpret_cast( \ + GetProcAddress(module, #x))); \ if(!newdrv.x) \ { \ ERR("Failed to find entry point for %s in %ls\n", #x, name); \ @@ -241,63 +204,62 @@ static void AddModule(HMODULE module, const WCHAR *name) if(!err) { ALCint alc_ver[2] = { 0, 0 }; - wcsncpy(newdrv.Name, name, 32); - newdrv.Module = module; - newdrv.alcGetIntegerv(NULL, ALC_MAJOR_VERSION, 1, &alc_ver[0]); - newdrv.alcGetIntegerv(NULL, ALC_MINOR_VERSION, 1, &alc_ver[1]); - if(newdrv.alcGetError(NULL) == ALC_NO_ERROR) + newdrv.alcGetIntegerv(nullptr, ALC_MAJOR_VERSION, 1, &alc_ver[0]); + newdrv.alcGetIntegerv(nullptr, ALC_MINOR_VERSION, 1, &alc_ver[1]); + if(newdrv.alcGetError(nullptr) == ALC_NO_ERROR) newdrv.ALCVer = MAKE_ALC_VER(alc_ver[0], alc_ver[1]); else newdrv.ALCVer = MAKE_ALC_VER(1, 0); #undef LOAD_PROC #define LOAD_PROC(x) do { \ - newdrv.x = CAST_FUNC(newdrv.x) newdrv.alcGetProcAddress(NULL, #x); \ + newdrv.x = reinterpret_cast( \ + newdrv.alcGetProcAddress(nullptr, #x)); \ if(!newdrv.x) \ { \ ERR("Failed to find entry point for %s in %ls\n", #x, name); \ err = 1; \ } \ } while(0) - if(newdrv.alcIsExtensionPresent(NULL, "ALC_EXT_thread_local_context")) + if(newdrv.alcIsExtensionPresent(nullptr, "ALC_EXT_thread_local_context")) { LOAD_PROC(alcSetThreadContext); LOAD_PROC(alcGetThreadContext); } } - if(!err) + if(err) { - TRACE("Loaded module %p, %ls, ALC %d.%d\n", module, name, - newdrv.ALCVer>>8, newdrv.ALCVer&255); - DriverList[DriverListSize++] = newdrv; + DriverList.pop_back(); + return; } + TRACE("Loaded module %p, %ls, ALC %d.%d\n", decltype(std::declval()){module}, name, + newdrv.ALCVer>>8, newdrv.ALCVer&255); #undef LOAD_PROC } static void SearchDrivers(WCHAR *path) { - WCHAR srchPath[MAX_PATH+1] = L""; WIN32_FIND_DATAW fdata; - HANDLE srchHdl; TRACE("Searching for drivers in %ls...\n", path); - wcsncpy(srchPath, path, MAX_PATH); - wcsncat(srchPath, L"\\*oal.dll", MAX_PATH - lstrlenW(srchPath)); - srchHdl = FindFirstFileW(srchPath, &fdata); + std::wstring srchPath = path; + srchPath += L"\\*oal.dll"; + + HANDLE srchHdl = FindFirstFileW(srchPath.c_str(), &fdata); if(srchHdl != INVALID_HANDLE_VALUE) { do { HMODULE mod; - wcsncpy(srchPath, path, MAX_PATH); - wcsncat(srchPath, L"\\", MAX_PATH - lstrlenW(srchPath)); - wcsncat(srchPath, fdata.cFileName, MAX_PATH - lstrlenW(srchPath)); - TRACE("Found %ls\n", srchPath); + srchPath = path; + srchPath += L"\\"; + srchPath += fdata.cFileName; + TRACE("Found %ls\n", srchPath.c_str()); - mod = LoadLibraryW(srchPath); + mod = LoadLibraryW(srchPath.c_str()); if(!mod) - WARN("Could not load %ls\n", srchPath); + WARN("Could not load %ls\n", srchPath.c_str()); else AddModule(mod, fdata.cFileName); } while(FindNextFileW(srchHdl, &fdata)); @@ -307,7 +269,7 @@ static void SearchDrivers(WCHAR *path) static WCHAR *strrchrW(WCHAR *str, WCHAR ch) { - WCHAR *res = NULL; + WCHAR *res = nullptr; while(str && *str != '\0') { if(*str == ch) @@ -319,7 +281,7 @@ static WCHAR *strrchrW(WCHAR *str, WCHAR ch) static int GetLoadedModuleDirectory(const WCHAR *name, WCHAR *moddir, DWORD length) { - HMODULE module = NULL; + HMODULE module = nullptr; WCHAR *sep0, *sep1; if(name) @@ -359,7 +321,7 @@ void LoadDriverList(void) cwd_path[len-1] = '\0'; TRACE("Got current working directory %ls\n", cwd_path); - if(GetLoadedModuleDirectory(NULL, proc_path, MAX_PATH)) + if(GetLoadedModuleDirectory(nullptr, proc_path, MAX_PATH)) TRACE("Got proc path %ls\n", proc_path); GetSystemDirectoryW(sys_path, MAX_PATH); @@ -388,150 +350,90 @@ void LoadDriverList(void) } -void InitPtrIntMap(PtrIntMap *map) -{ - map->keys = NULL; - map->values = NULL; - map->size = 0; - map->capacity = 0; - RWLockInit(&map->lock); -} - -void ResetPtrIntMap(PtrIntMap *map) +PtrIntMap::~PtrIntMap() { - WriteLock(&map->lock); - al_free(map->keys); - map->keys = NULL; - map->values = NULL; - map->size = 0; - map->capacity = 0; - WriteUnlock(&map->lock); + std::lock_guard maplock{mLock}; + al_free(mKeys); + mKeys = nullptr; + mValues = nullptr; + mSize = 0; + mCapacity = 0; } -ALenum InsertPtrIntMapEntry(PtrIntMap *map, ALvoid *key, ALint value) +ALenum PtrIntMap::insert(ALvoid *key, ALint value) { - ALsizei pos = 0; + std::lock_guard maplock{mLock}; + auto iter = std::lower_bound(mKeys, mKeys+mSize, key); + auto pos = static_cast(std::distance(mKeys, iter)); - WriteLock(&map->lock); - if(map->size > 0) + if(pos == mSize || mKeys[pos] != key) { - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - } - - if(pos == map->size || map->keys[pos] != key) - { - if(map->size == map->capacity) + if(mSize == mCapacity) { - ALvoid **keys = NULL; - ALint *values; - ALsizei newcap; - - newcap = (map->capacity ? (map->capacity<<1) : 4); - if(newcap > map->capacity) - keys = al_calloc(16, (sizeof(map->keys[0])+sizeof(map->values[0]))*newcap); - if(!keys) - { - WriteUnlock(&map->lock); + ALvoid **newkeys{nullptr}; + ALsizei newcap{mCapacity ? (mCapacity<<1) : 4}; + if(newcap > mCapacity) + newkeys = static_cast( + al_calloc(16, (sizeof(mKeys[0])+sizeof(mValues[0]))*newcap) + ); + if(!newkeys) return AL_OUT_OF_MEMORY; - } - values = (ALint*)&keys[newcap]; + auto newvalues = reinterpret_cast(&newkeys[newcap]); - if(map->keys) + if(mKeys) { - memcpy(keys, map->keys, map->size*sizeof(map->keys[0])); - memcpy(values, map->values, map->size*sizeof(map->values[0])); + std::copy_n(mKeys, mSize, newkeys); + std::copy_n(mValues, mSize, newvalues); } - al_free(map->keys); - map->keys = keys; - map->values = values; - map->capacity = newcap; + al_free(mKeys); + mKeys = newkeys; + mValues = newvalues; + mCapacity = newcap; } - if(pos < map->size) + if(pos < mSize) { - memmove(&map->keys[pos+1], &map->keys[pos], - (map->size-pos)*sizeof(map->keys[0])); - memmove(&map->values[pos+1], &map->values[pos], - (map->size-pos)*sizeof(map->values[0])); + std::copy_backward(mKeys+pos, mKeys+mSize, mKeys+mSize+1); + std::copy_backward(mValues+pos, mValues+mSize, mValues+mSize+1); } - map->size++; + mSize++; } - map->keys[pos] = key; - map->values[pos] = value; - WriteUnlock(&map->lock); + mKeys[pos] = key; + mValues[pos] = value; return AL_NO_ERROR; } -ALint RemovePtrIntMapKey(PtrIntMap *map, ALvoid *key) +ALint PtrIntMap::removeByKey(ALvoid *key) { ALint ret = -1; - WriteLock(&map->lock); - if(map->size > 0) + + std::lock_guard maplock{mLock}; + auto iter = std::lower_bound(mKeys, mKeys+mSize, key); + auto pos = static_cast(std::distance(mKeys, iter)); + if(pos < mSize && mKeys[pos] == key) { - ALsizei pos = 0; - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - if(pos < map->size && map->keys[pos] == key) + ret = mValues[pos]; + if(pos+1 < mSize) { - ret = map->values[pos]; - if(pos < map->size-1) - { - memmove(&map->keys[pos], &map->keys[pos+1], - (map->size-1-pos)*sizeof(map->keys[0])); - memmove(&map->values[pos], &map->values[pos+1], - (map->size-1-pos)*sizeof(map->values[0])); - } - map->size--; + std::copy(mKeys+pos+1, mKeys+mSize, mKeys+pos); + std::copy(mValues+pos+1, mValues+mSize, mValues+pos); } + mSize--; } - WriteUnlock(&map->lock); + return ret; } -ALint LookupPtrIntMapKey(PtrIntMap *map, ALvoid *key) +ALint PtrIntMap::lookupByKey(ALvoid *key) { ALint ret = -1; - ReadLock(&map->lock); - if(map->size > 0) - { - ALsizei pos = 0; - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - if(pos < map->size && map->keys[pos] == key) - ret = map->values[pos]; - } - ReadUnlock(&map->lock); + + std::lock_guard maplock{mLock}; + auto iter = std::lower_bound(mKeys, mKeys+mSize, key); + auto pos = static_cast(std::distance(mKeys, iter)); + if(pos < mSize && mKeys[pos] == key) + ret = mValues[pos]; + return ret; } diff --git a/router/router.h b/router/router.h index 32a91dc..007b6a1 100644 --- a/router/router.h +++ b/router/router.h @@ -7,160 +7,155 @@ #include +#include +#include +#include +#include + #include "AL/alc.h" #include "AL/al.h" #include "AL/alext.h" -#include "atomic.h" -#include "rwlock.h" -#include "threads.h" - - -#ifndef UNUSED -#if defined(__cplusplus) -#define UNUSED(x) -#elif defined(__GNUC__) -#define UNUSED(x) UNUSED_##x __attribute__((unused)) -#elif defined(__LCLINT__) -#define UNUSED(x) /*@unused@*/ x -#else -#define UNUSED(x) x -#endif -#endif + #define MAKE_ALC_VER(major, minor) (((major)<<8) | (minor)) -typedef struct DriverIface { - WCHAR Name[32]; - HMODULE Module; - int ALCVer; - - LPALCCREATECONTEXT alcCreateContext; - LPALCMAKECONTEXTCURRENT alcMakeContextCurrent; - LPALCPROCESSCONTEXT alcProcessContext; - LPALCSUSPENDCONTEXT alcSuspendContext; - LPALCDESTROYCONTEXT alcDestroyContext; - LPALCGETCURRENTCONTEXT alcGetCurrentContext; - LPALCGETCONTEXTSDEVICE alcGetContextsDevice; - LPALCOPENDEVICE alcOpenDevice; - LPALCCLOSEDEVICE alcCloseDevice; - LPALCGETERROR alcGetError; - LPALCISEXTENSIONPRESENT alcIsExtensionPresent; - LPALCGETPROCADDRESS alcGetProcAddress; - LPALCGETENUMVALUE alcGetEnumValue; - LPALCGETSTRING alcGetString; - LPALCGETINTEGERV alcGetIntegerv; - LPALCCAPTUREOPENDEVICE alcCaptureOpenDevice; - LPALCCAPTURECLOSEDEVICE alcCaptureCloseDevice; - LPALCCAPTURESTART alcCaptureStart; - LPALCCAPTURESTOP alcCaptureStop; - LPALCCAPTURESAMPLES alcCaptureSamples; - - PFNALCSETTHREADCONTEXTPROC alcSetThreadContext; - PFNALCGETTHREADCONTEXTPROC alcGetThreadContext; - - LPALENABLE alEnable; - LPALDISABLE alDisable; - LPALISENABLED alIsEnabled; - LPALGETSTRING alGetString; - LPALGETBOOLEANV alGetBooleanv; - LPALGETINTEGERV alGetIntegerv; - LPALGETFLOATV alGetFloatv; - LPALGETDOUBLEV alGetDoublev; - LPALGETBOOLEAN alGetBoolean; - LPALGETINTEGER alGetInteger; - LPALGETFLOAT alGetFloat; - LPALGETDOUBLE alGetDouble; - LPALGETERROR alGetError; - LPALISEXTENSIONPRESENT alIsExtensionPresent; - LPALGETPROCADDRESS alGetProcAddress; - LPALGETENUMVALUE alGetEnumValue; - LPALLISTENERF alListenerf; - LPALLISTENER3F alListener3f; - LPALLISTENERFV alListenerfv; - LPALLISTENERI alListeneri; - LPALLISTENER3I alListener3i; - LPALLISTENERIV alListeneriv; - LPALGETLISTENERF alGetListenerf; - LPALGETLISTENER3F alGetListener3f; - LPALGETLISTENERFV alGetListenerfv; - LPALGETLISTENERI alGetListeneri; - LPALGETLISTENER3I alGetListener3i; - LPALGETLISTENERIV alGetListeneriv; - LPALGENSOURCES alGenSources; - LPALDELETESOURCES alDeleteSources; - LPALISSOURCE alIsSource; - LPALSOURCEF alSourcef; - LPALSOURCE3F alSource3f; - LPALSOURCEFV alSourcefv; - LPALSOURCEI alSourcei; - LPALSOURCE3I alSource3i; - LPALSOURCEIV alSourceiv; - LPALGETSOURCEF alGetSourcef; - LPALGETSOURCE3F alGetSource3f; - LPALGETSOURCEFV alGetSourcefv; - LPALGETSOURCEI alGetSourcei; - LPALGETSOURCE3I alGetSource3i; - LPALGETSOURCEIV alGetSourceiv; - LPALSOURCEPLAYV alSourcePlayv; - LPALSOURCESTOPV alSourceStopv; - LPALSOURCEREWINDV alSourceRewindv; - LPALSOURCEPAUSEV alSourcePausev; - LPALSOURCEPLAY alSourcePlay; - LPALSOURCESTOP alSourceStop; - LPALSOURCEREWIND alSourceRewind; - LPALSOURCEPAUSE alSourcePause; - LPALSOURCEQUEUEBUFFERS alSourceQueueBuffers; - LPALSOURCEUNQUEUEBUFFERS alSourceUnqueueBuffers; - LPALGENBUFFERS alGenBuffers; - LPALDELETEBUFFERS alDeleteBuffers; - LPALISBUFFER alIsBuffer; - LPALBUFFERF alBufferf; - LPALBUFFER3F alBuffer3f; - LPALBUFFERFV alBufferfv; - LPALBUFFERI alBufferi; - LPALBUFFER3I alBuffer3i; - LPALBUFFERIV alBufferiv; - LPALGETBUFFERF alGetBufferf; - LPALGETBUFFER3F alGetBuffer3f; - LPALGETBUFFERFV alGetBufferfv; - LPALGETBUFFERI alGetBufferi; - LPALGETBUFFER3I alGetBuffer3i; - LPALGETBUFFERIV alGetBufferiv; - LPALBUFFERDATA alBufferData; - LPALDOPPLERFACTOR alDopplerFactor; - LPALDOPPLERVELOCITY alDopplerVelocity; - LPALSPEEDOFSOUND alSpeedOfSound; - LPALDISTANCEMODEL alDistanceModel; -} DriverIface; - -extern DriverIface *DriverList; -extern int DriverListSize; - -extern altss_t ThreadCtxDriver; -typedef ATOMIC(DriverIface*) atomic_DriverIfacePtr; -extern atomic_DriverIfacePtr CurrentCtxDriver; - - -typedef struct PtrIntMap { - ALvoid **keys; - /* Shares memory with keys. */ - ALint *values; +struct DriverIface { + std::wstring Name; + HMODULE Module{nullptr}; + int ALCVer{0}; + + LPALCCREATECONTEXT alcCreateContext{nullptr}; + LPALCMAKECONTEXTCURRENT alcMakeContextCurrent{nullptr}; + LPALCPROCESSCONTEXT alcProcessContext{nullptr}; + LPALCSUSPENDCONTEXT alcSuspendContext{nullptr}; + LPALCDESTROYCONTEXT alcDestroyContext{nullptr}; + LPALCGETCURRENTCONTEXT alcGetCurrentContext{nullptr}; + LPALCGETCONTEXTSDEVICE alcGetContextsDevice{nullptr}; + LPALCOPENDEVICE alcOpenDevice{nullptr}; + LPALCCLOSEDEVICE alcCloseDevice{nullptr}; + LPALCGETERROR alcGetError{nullptr}; + LPALCISEXTENSIONPRESENT alcIsExtensionPresent{nullptr}; + LPALCGETPROCADDRESS alcGetProcAddress{nullptr}; + LPALCGETENUMVALUE alcGetEnumValue{nullptr}; + LPALCGETSTRING alcGetString{nullptr}; + LPALCGETINTEGERV alcGetIntegerv{nullptr}; + LPALCCAPTUREOPENDEVICE alcCaptureOpenDevice{nullptr}; + LPALCCAPTURECLOSEDEVICE alcCaptureCloseDevice{nullptr}; + LPALCCAPTURESTART alcCaptureStart{nullptr}; + LPALCCAPTURESTOP alcCaptureStop{nullptr}; + LPALCCAPTURESAMPLES alcCaptureSamples{nullptr}; + + PFNALCSETTHREADCONTEXTPROC alcSetThreadContext{nullptr}; + PFNALCGETTHREADCONTEXTPROC alcGetThreadContext{nullptr}; + + LPALENABLE alEnable{nullptr}; + LPALDISABLE alDisable{nullptr}; + LPALISENABLED alIsEnabled{nullptr}; + LPALGETSTRING alGetString{nullptr}; + LPALGETBOOLEANV alGetBooleanv{nullptr}; + LPALGETINTEGERV alGetIntegerv{nullptr}; + LPALGETFLOATV alGetFloatv{nullptr}; + LPALGETDOUBLEV alGetDoublev{nullptr}; + LPALGETBOOLEAN alGetBoolean{nullptr}; + LPALGETINTEGER alGetInteger{nullptr}; + LPALGETFLOAT alGetFloat{nullptr}; + LPALGETDOUBLE alGetDouble{nullptr}; + LPALGETERROR alGetError{nullptr}; + LPALISEXTENSIONPRESENT alIsExtensionPresent{nullptr}; + LPALGETPROCADDRESS alGetProcAddress{nullptr}; + LPALGETENUMVALUE alGetEnumValue{nullptr}; + LPALLISTENERF alListenerf{nullptr}; + LPALLISTENER3F alListener3f{nullptr}; + LPALLISTENERFV alListenerfv{nullptr}; + LPALLISTENERI alListeneri{nullptr}; + LPALLISTENER3I alListener3i{nullptr}; + LPALLISTENERIV alListeneriv{nullptr}; + LPALGETLISTENERF alGetListenerf{nullptr}; + LPALGETLISTENER3F alGetListener3f{nullptr}; + LPALGETLISTENERFV alGetListenerfv{nullptr}; + LPALGETLISTENERI alGetListeneri{nullptr}; + LPALGETLISTENER3I alGetListener3i{nullptr}; + LPALGETLISTENERIV alGetListeneriv{nullptr}; + LPALGENSOURCES alGenSources{nullptr}; + LPALDELETESOURCES alDeleteSources{nullptr}; + LPALISSOURCE alIsSource{nullptr}; + LPALSOURCEF alSourcef{nullptr}; + LPALSOURCE3F alSource3f{nullptr}; + LPALSOURCEFV alSourcefv{nullptr}; + LPALSOURCEI alSourcei{nullptr}; + LPALSOURCE3I alSource3i{nullptr}; + LPALSOURCEIV alSourceiv{nullptr}; + LPALGETSOURCEF alGetSourcef{nullptr}; + LPALGETSOURCE3F alGetSource3f{nullptr}; + LPALGETSOURCEFV alGetSourcefv{nullptr}; + LPALGETSOURCEI alGetSourcei{nullptr}; + LPALGETSOURCE3I alGetSource3i{nullptr}; + LPALGETSOURCEIV alGetSourceiv{nullptr}; + LPALSOURCEPLAYV alSourcePlayv{nullptr}; + LPALSOURCESTOPV alSourceStopv{nullptr}; + LPALSOURCEREWINDV alSourceRewindv{nullptr}; + LPALSOURCEPAUSEV alSourcePausev{nullptr}; + LPALSOURCEPLAY alSourcePlay{nullptr}; + LPALSOURCESTOP alSourceStop{nullptr}; + LPALSOURCEREWIND alSourceRewind{nullptr}; + LPALSOURCEPAUSE alSourcePause{nullptr}; + LPALSOURCEQUEUEBUFFERS alSourceQueueBuffers{nullptr}; + LPALSOURCEUNQUEUEBUFFERS alSourceUnqueueBuffers{nullptr}; + LPALGENBUFFERS alGenBuffers{nullptr}; + LPALDELETEBUFFERS alDeleteBuffers{nullptr}; + LPALISBUFFER alIsBuffer{nullptr}; + LPALBUFFERF alBufferf{nullptr}; + LPALBUFFER3F alBuffer3f{nullptr}; + LPALBUFFERFV alBufferfv{nullptr}; + LPALBUFFERI alBufferi{nullptr}; + LPALBUFFER3I alBuffer3i{nullptr}; + LPALBUFFERIV alBufferiv{nullptr}; + LPALGETBUFFERF alGetBufferf{nullptr}; + LPALGETBUFFER3F alGetBuffer3f{nullptr}; + LPALGETBUFFERFV alGetBufferfv{nullptr}; + LPALGETBUFFERI alGetBufferi{nullptr}; + LPALGETBUFFER3I alGetBuffer3i{nullptr}; + LPALGETBUFFERIV alGetBufferiv{nullptr}; + LPALBUFFERDATA alBufferData{nullptr}; + LPALDOPPLERFACTOR alDopplerFactor{nullptr}; + LPALDOPPLERVELOCITY alDopplerVelocity{nullptr}; + LPALSPEEDOFSOUND alSpeedOfSound{nullptr}; + LPALDISTANCEMODEL alDistanceModel{nullptr}; + + DriverIface(std::wstring name, HMODULE mod) + : Name(std::move(name)), Module(mod) + { } + ~DriverIface() + { + if(Module) + FreeLibrary(Module); + Module = nullptr; + } +}; - ALsizei size; - ALsizei capacity; - RWLock lock; -} PtrIntMap; -#define PTRINTMAP_STATIC_INITIALIZE { NULL, NULL, 0, 0, RWLOCK_STATIC_INITIALIZE } +extern std::vector DriverList; -void InitPtrIntMap(PtrIntMap *map); -void ResetPtrIntMap(PtrIntMap *map); -ALenum InsertPtrIntMapEntry(PtrIntMap *map, ALvoid *key, ALint value); -ALint RemovePtrIntMapKey(PtrIntMap *map, ALvoid *key); -ALint LookupPtrIntMapKey(PtrIntMap *map, ALvoid *key); +extern thread_local DriverIface *ThreadCtxDriver; +extern std::atomic CurrentCtxDriver; -void InitALC(void); -void ReleaseALC(void); +class PtrIntMap { + ALvoid **mKeys{nullptr}; + /* Shares memory with keys. */ + ALint *mValues{nullptr}; + + ALsizei mSize{0}; + ALsizei mCapacity{0}; + std::mutex mLock; + +public: + PtrIntMap() = default; + ~PtrIntMap(); + + ALenum insert(ALvoid *key, ALint value); + ALint removeByKey(ALvoid *key); + ALint lookupByKey(ALvoid *key); +}; enum LogLevel {