From df4e866a6e019f354f77936cf6af780c5b5e7e86 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 23 Jun 2021 22:34:42 +0700 Subject: [PATCH 0001/1112] bump nixpkgs - r297538.75bd996363c --- flake.lock | 6 +++--- flake.nix | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index 887c732..0a1250b 100644 --- a/flake.lock +++ b/flake.lock @@ -23,11 +23,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1624148921, - "narHash": "sha256-FAhKTXZV67C36hK5lPvZfsFt+QY1QSHYQXwGXqpOChs=", + "lastModified": 1624462271, + "narHash": "sha256-bn8TVHKAf66poL0M2v7NiZyoMh/4YhiM2uqw3X2Gt/M=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f2122ea5815648effdd97157c7bf4e9a1a6dbb34", + "rev": "75bd996363cee3a14a3535fff10fb96e19815817", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a2ad8b4..86e38f9 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,7 @@ outputs = inputs: with inputs; let - revCount = "296773"; + revCount = "297538"; base = { config, ... }: { system = { configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; From f788451498fc8248faef82a95219fd5a9dbe7973 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 23 Jun 2021 22:30:40 +0700 Subject: [PATCH 0002/1112] test --- .../0001-Revert-to-5.14-winepulse.drv.patch | 11241 ++++++++++++++++ .../0002-5.14-Latency-Fix.patch} | 45 +- ...h-from-invalid-context-in-Initialize.patch | 26 + ...he-last-used-locale-sortguid-mapping.patch | 87 + overlays/wine-osu.nix | 2 +- 5 files changed, 11384 insertions(+), 17 deletions(-) create mode 100644 overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch rename overlays/misc/{wine-lowlatency.patch => wine/0002-5.14-Latency-Fix.patch} (50%) create mode 100644 overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch create mode 100644 overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch diff --git a/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch b/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch new file mode 100644 index 0000000..db43ff8 --- /dev/null +++ b/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch @@ -0,0 +1,11241 @@ +From a57533f62c21da6029504267288d2cc429b17f9a Mon Sep 17 00:00:00 2001 +From: Sebastian 'gonX' Jensen +Date: Sun, 20 Jun 2021 17:00:22 +0200 +Subject: [PATCH 1/4] Revert to 5.14 winepulse.drv + +--- + dlls/mmdevapi/devenum.c | 3 +- + dlls/mmdevapi/tests/render.c | 29 +- + dlls/winealsa.drv/mmdevdrv.c | 177 +- + dlls/wineandroid.drv/mmdevdrv.c | 179 +- + dlls/winecoreaudio.drv/mmdevdrv.c | 177 +- + dlls/wineoss.drv/mmdevdrv.c | 177 +- + dlls/winepulse.drv/Makefile.in | 9 +- + dlls/winepulse.drv/mmdevdrv.c | 4195 ++++++++++++++++++++++++++--- + dlls/winepulse.drv/mult.c | 2015 -------------- + dlls/winepulse.drv/pulse.c | 1984 -------------- + dlls/winepulse.drv/unixlib.h | 211 -- + include/audioclient.idl | 8 - + 12 files changed, 4031 insertions(+), 5133 deletions(-) + delete mode 100644 dlls/winepulse.drv/mult.c + delete mode 100644 dlls/winepulse.drv/pulse.c + delete mode 100644 dlls/winepulse.drv/unixlib.h + +diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c +index b17572425f32b603ddec1cc592350b8440bde706..89ca13102804746d0caed9b4b72ee61ac84c8ad9 100644 +--- a/dlls/mmdevapi/devenum.c ++++ b/dlls/mmdevapi/devenum.c +@@ -554,8 +554,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls + return E_POINTER; + + if (IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)){ ++ IsEqualIID(riid, &IID_IAudioClient2)){ + hr = drvs.pGetAudioEndpoint(&This->devguid, iface, (IAudioClient**)ppv); + }else if (IsEqualIID(riid, &IID_IAudioEndpointVolume) || + IsEqualIID(riid, &IID_IAudioEndpointVolumeEx)) +diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c +index 495c1c6f496f73e7e9b2ba31735b66fd03690a22..2ae777b5ac585c02bf1a95073a9508831b887bda 100644 +--- a/dlls/mmdevapi/tests/render.c ++++ b/dlls/mmdevapi/tests/render.c +@@ -134,7 +134,6 @@ static void test_audioclient(void) + { + IAudioClient *ac; + IAudioClient2 *ac2; +- IAudioClient3 *ac3; + IUnknown *unk; + HRESULT hr; + ULONG ref; +@@ -144,14 +143,6 @@ static void test_audioclient(void) + BOOL offload_capable; + AudioClientProperties client_props; + +- hr = IMMDevice_Activate(dev, &IID_IAudioClient3, CLSCTX_INPROC_SERVER, +- NULL, (void**)&ac3); +- ok(hr == S_OK || +- broken(hr == E_NOINTERFACE) /* win8 */, +- "IAudioClient3 Activation failed with %08x\n", hr); +- if(hr == S_OK) +- IAudioClient3_Release(ac3); +- + hr = IMMDevice_Activate(dev, &IID_IAudioClient2, CLSCTX_INPROC_SERVER, + NULL, (void**)&ac2); + ok(hr == S_OK || +@@ -276,7 +267,6 @@ static void test_audioclient(void) + hr = IAudioClient2_SetClientProperties(ac2, NULL); + ok(hr == E_POINTER, "SetClientProperties with NULL props gave wrong error: %08x\n", hr); + +- /* invalid cbSize */ + client_props.cbSize = 0; + client_props.bIsOffload = FALSE; + client_props.eCategory = AudioCategory_BackgroundCapableMedia; +@@ -285,8 +275,7 @@ static void test_audioclient(void) + hr = IAudioClient2_SetClientProperties(ac2, &client_props); + ok(hr == E_INVALIDARG, "SetClientProperties with invalid cbSize gave wrong error: %08x\n", hr); + +- /* offload consistency */ +- client_props.cbSize = sizeof(client_props) - sizeof(client_props.Options); ++ client_props.cbSize = sizeof(client_props); + client_props.bIsOffload = TRUE; + + hr = IAudioClient2_SetClientProperties(ac2, &client_props); +@@ -295,31 +284,15 @@ static void test_audioclient(void) + else + ok(hr == S_OK, "SetClientProperties(offload) failed: %08x\n", hr); + +- /* disable offload */ + client_props.bIsOffload = FALSE; + hr = IAudioClient2_SetClientProperties(ac2, &client_props); + ok(hr == S_OK, "SetClientProperties failed: %08x\n", hr); + +- /* Options field added in Win 8.1 */ +- client_props.cbSize = sizeof(client_props); +- hr = IAudioClient2_SetClientProperties(ac2, &client_props); +- ok(hr == S_OK || +- broken(hr == E_INVALIDARG) /* <= win8 */, +- "SetClientProperties failed: %08x\n", hr); +- + IAudioClient2_Release(ac2); + } + else + win_skip("IAudioClient2 is not present on Win <= 7\n"); + +- hr = IAudioClient_QueryInterface(ac, &IID_IAudioClient3, (void**)&ac3); +- ok(hr == S_OK || +- broken(hr == E_NOINTERFACE) /* win8 */, +- "Failed to query IAudioClient3 interface: %08x\n", hr); +- +- if(hr == S_OK) +- IAudioClient3_Release(ac3); +- + test_uninitialized(ac); + + hr = IAudioClient_Initialize(ac, 3, 0, 5000000, 0, pwfx, NULL); +diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c +index 5f7d277ce9a354194123dbf3b01ef04f1c31db2d..636a04058056b4a83fd4657a0914c795c244463d 100644 +--- a/dlls/winealsa.drv/mmdevdrv.c ++++ b/dlls/winealsa.drv/mmdevdrv.c +@@ -90,7 +90,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -174,7 +174,7 @@ static const WCHAR drv_key_devicesW[] = {'S','o','f','t','w','a','r','e','\\', + 'w','i','n','e','a','l','s','a','.','d','r','v','\\','d','e','v','i','c','e','s',0}; + static const WCHAR guidW[] = {'g','u','i','d',0}; + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -187,9 +187,9 @@ static const IAudioSessionManager2Vtbl AudioSessionManager2_Vtbl; + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -831,7 +831,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + if(!This) + return E_OUTOFMEMORY; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -847,7 +847,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + return E_UNEXPECTED; + } + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -894,16 +894,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + This->parent = dev; + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -911,8 +911,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -925,18 +924,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + + ref = InterlockedDecrement(&This->ref); +@@ -953,7 +952,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) + CloseHandle(event); + } + +- IAudioClient3_Stop(iface); ++ IAudioClient2_Stop(iface); + IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); + This->lock.DebugInfo->Spare[0] = 0; +@@ -1282,12 +1281,12 @@ static void silence_buffer(ACImpl *This, BYTE *buffer, UINT32 frames) + memset(buffer, 0, frames * This->fmt->nBlockAlign); + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + snd_pcm_sw_params_t *sw_params = NULL; + snd_pcm_format_t format; + unsigned int rate, alsa_period_us; +@@ -1574,10 +1573,10 @@ exit: + return hr; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, out); + +@@ -1598,10 +1597,10 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, latency); + +@@ -1631,10 +1630,10 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, out); + +@@ -1658,11 +1657,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, + WAVEFORMATEX **out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + snd_pcm_format_mask_t *formats = NULL; + snd_pcm_format_t format; + HRESULT hr = S_OK; +@@ -1809,10 +1808,10 @@ exit: + return hr; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + snd_pcm_format_mask_t *formats; + unsigned int max_rate, max_channels; +@@ -1940,10 +1939,10 @@ exit: + return hr; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -2438,9 +2437,9 @@ static int alsa_rewind_best_effort(ACImpl *This) + return len; + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2506,9 +2505,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2534,9 +2533,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2581,10 +2580,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -2616,10 +2615,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -2700,10 +2699,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -2715,83 +2714,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -2811,9 +2769,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -2844,13 +2799,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -3010,13 +2965,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -3185,13 +3140,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -3303,13 +3258,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -3348,7 +3303,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -3396,7 +3351,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + EnterCriticalSection(&This->client->lock); + This->client->session_wrapper = NULL; + LeaveCriticalSection(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -3738,13 +3693,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/wineandroid.drv/mmdevdrv.c b/dlls/wineandroid.drv/mmdevdrv.c +index d9b7cde2c80af90cf44cfe33945a2a43fa41dd4b..aa32c49185501a58941c6065482928654541b6a2 100644 +--- a/dlls/wineandroid.drv/mmdevdrv.c ++++ b/dlls/wineandroid.drv/mmdevdrv.c +@@ -107,7 +107,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -174,7 +174,7 @@ static struct list g_sessions = LIST_INIT(g_sessions); + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -185,9 +185,9 @@ static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; + static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; + static const IAudioSessionManager2Vtbl AudioSessionManager2_Vtbl; + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -377,7 +377,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + if(!This) + return E_OUTOFMEMORY; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -385,7 +385,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + + This->dataflow = flow; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -398,16 +398,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + This->parent = dev; + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -415,8 +415,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -428,18 +427,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + + ref = InterlockedDecrement(&This->ref); +@@ -456,7 +455,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) + CloseHandle(event); + } + +- IAudioClient3_Stop(iface); ++ IAudioClient2_Stop(iface); + + IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); +@@ -786,12 +785,12 @@ static HRESULT try_open_capture_device(SLAndroidDataFormat_PCM_EX *pcm, unsigned + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + int i, num_buffers; + HRESULT hr; + SLresult sr; +@@ -1021,10 +1020,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *frames) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, frames); + +@@ -1047,10 +1046,10 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, latency); + +@@ -1073,10 +1072,10 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *numpad) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, numpad); + +@@ -1099,11 +1098,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, + WAVEFORMATEX **outpwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLAndroidDataFormat_PCM_EX pcm; + HRESULT hr; + +@@ -1135,7 +1134,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + + if(FAILED(hr)){ + if(outpwfx){ +- hr = IAudioClient3_GetMixFormat(iface, outpwfx); ++ hr = IAudioClient2_GetMixFormat(iface, outpwfx); + if(FAILED(hr)) + return hr; + return S_FALSE; +@@ -1149,10 +1148,10 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + return hr; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + + TRACE("(%p)->(%p)\n", This, pwfx); +@@ -1187,10 +1186,10 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -1344,9 +1343,9 @@ static void CALLBACK sl_period_callback(void *user, BOOLEAN timer) + SetEvent(This->event); + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLresult sr; + + TRACE("(%p)\n", This); +@@ -1398,9 +1397,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLresult sr; + + TRACE("(%p)\n", This); +@@ -1440,9 +1439,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLresult sr; + + TRACE("(%p)\n", This); +@@ -1497,10 +1496,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -1532,10 +1531,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -1616,10 +1615,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -1631,83 +1630,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -1727,9 +1685,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -1759,13 +1714,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -1926,13 +1881,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -2104,13 +2059,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -2200,13 +2155,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -2245,7 +2200,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -2293,7 +2248,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + EnterCriticalSection(&This->client->lock); + This->client->session_wrapper = NULL; + LeaveCriticalSection(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -2636,13 +2591,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c +index f07f4bae5fb211dabd23ddfc12c889aafb701ab9..03f8a0c030e8fe4ea3a33d8ecfffe428cb181843 100644 +--- a/dlls/winecoreaudio.drv/mmdevdrv.c ++++ b/dlls/winecoreaudio.drv/mmdevdrv.c +@@ -108,7 +108,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -151,7 +151,7 @@ struct ACImpl { + OSSpinLock lock; + }; + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -190,9 +190,9 @@ static struct list g_sessions = LIST_INIT(g_sessions); + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + static HRESULT ca_setvol(ACImpl *This, UINT32 index); + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -652,7 +652,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + if(!This) + return E_OUTOFMEMORY; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -672,7 +672,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + + This->lock = 0; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -688,16 +688,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + return AUDCLNT_E_DEVICE_INVALIDATED; + } + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -705,8 +705,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -719,18 +718,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedDecrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); +@@ -1276,12 +1275,12 @@ static HRESULT ca_setup_audiounit(EDataFlow dataflow, AudioComponentInstance uni + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + HRESULT hr; + OSStatus sc; + int i; +@@ -1480,10 +1479,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *frames) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, frames); + +@@ -1558,10 +1557,10 @@ static HRESULT ca_get_max_stream_latency(ACImpl *This, UInt32 *max) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + UInt32 latency, stream_latency, size; + AudioObjectPropertyAddress addr; + OSStatus sc; +@@ -1623,10 +1622,10 @@ static HRESULT AudioClient_GetCurrentPadding_nolock(ACImpl *This, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *numpad) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + HRESULT hr; + + TRACE("(%p)->(%p)\n", This, numpad); +@@ -1643,11 +1642,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return hr; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, + WAVEFORMATEX **outpwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + AudioStreamBasicDescription dev_desc; + AudioConverterRef converter; + AudioComponentInstance unit; +@@ -1710,7 +1709,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + + unsupported: + if(outpwfx){ +- hr = IAudioClient3_GetMixFormat(&This->IAudioClient3_iface, outpwfx); ++ hr = IAudioClient2_GetMixFormat(&This->IAudioClient2_iface, outpwfx); + if(FAILED(hr)) + return hr; + return S_FALSE; +@@ -1835,10 +1834,10 @@ static void convert_channel_layout(const AudioChannelLayout *ca_layout, WAVEFORM + fmt->dwChannelMask = ca_mask; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + OSStatus sc; + UInt32 size; +@@ -1954,10 +1953,10 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -1980,9 +1979,9 @@ void CALLBACK ca_period_cb(void *user, BOOLEAN timer) + SetEvent(This->event); + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2019,9 +2018,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2044,9 +2043,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2084,10 +2083,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -2119,10 +2118,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -2203,10 +2202,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -2218,83 +2217,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -2314,9 +2272,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -2347,13 +2302,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -2504,13 +2459,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -2672,13 +2627,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -2768,13 +2723,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -2813,7 +2768,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- IAudioClient3_AddRef(&client->IAudioClient3_iface); ++ AudioClient2_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -2861,7 +2816,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + OSSpinLockLock(&This->client->lock); + This->client->session_wrapper = NULL; + OSSpinLockUnlock(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -3256,13 +3211,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c +index db2c6b23914d5e49ed7f125f16749f1f4cee45d2..3a3cb57b642493f5bc2cc01f002300497e78a625 100644 +--- a/dlls/wineoss.drv/mmdevdrv.c ++++ b/dlls/wineoss.drv/mmdevdrv.c +@@ -90,7 +90,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -168,7 +168,7 @@ static struct list g_sessions = LIST_INIT(g_sessions); + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -179,9 +179,9 @@ static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; + static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; + static const IAudioSessionManager2Vtbl AudioSessionManager2_Vtbl; + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -605,7 +605,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + if(!This) + return E_OUTOFMEMORY; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -652,7 +652,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + TRACE("min_channels: %d\n", This->ai.min_channels); + TRACE("max_channels: %d\n", This->ai.max_channels); + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -665,16 +665,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + This->parent = dev; + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -682,8 +682,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -695,18 +694,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + + ref = InterlockedDecrement(&This->ref); +@@ -723,7 +722,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) + CloseHandle(event); + } + +- IAudioClient3_Stop(iface); ++ IAudioClient2_Stop(iface); + IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); + This->lock.DebugInfo->Spare[0] = 0; +@@ -1030,12 +1029,12 @@ static HRESULT get_audio_session(const GUID *sessionguid, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + int i; + HRESULT hr; + +@@ -1160,10 +1159,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *frames) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, frames); + +@@ -1186,10 +1185,10 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, latency); + +@@ -1212,10 +1211,10 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *numpad) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, numpad); + +@@ -1238,11 +1237,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, + WAVEFORMATEX **outpwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + int fd = -1; + HRESULT ret; + +@@ -1284,10 +1283,10 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + return ret; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + int formats; + +@@ -1377,10 +1376,10 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -1561,9 +1560,9 @@ static void CALLBACK oss_period_callback(void *user, BOOLEAN timer) + SetEvent(This->event); + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -1598,9 +1597,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -1624,9 +1623,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -1662,10 +1661,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -1697,10 +1696,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -1781,10 +1780,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -1796,83 +1795,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -1892,9 +1850,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -1924,13 +1879,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -2090,13 +2045,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -2266,13 +2221,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -2375,13 +2330,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -2420,7 +2375,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -2468,7 +2423,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + EnterCriticalSection(&This->client->lock); + This->client->session_wrapper = NULL; + LeaveCriticalSection(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -2811,13 +2766,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/winepulse.drv/Makefile.in b/dlls/winepulse.drv/Makefile.in +index 4bf053d4e54f1790ef08bba4ef8330bd41a1f133..3082ed8a69ef642da648b1311b601e6d69a60d7c 100644 +--- a/dlls/winepulse.drv/Makefile.in ++++ b/dlls/winepulse.drv/Makefile.in +@@ -1,11 +1,8 @@ + MODULE = winepulse.drv + IMPORTS = dxguid uuid winmm user32 advapi32 ole32 +-EXTRALIBS = $(PULSE_LIBS) $(PTHREAD_LIBS) -Wl,--subsystem,native ++EXTRALIBS = $(PULSE_LIBS) $(PTHREAD_LIBS) + EXTRAINCL = $(PULSE_CFLAGS) +- +-EXTRADLLFLAGS = -mno-cygwin ++EXTRADEFS = -DWINE_NO_NAMELESS_EXTENSION + + C_SRCS = \ +- mmdevdrv.c \ +- mult.c \ +- pulse.c ++ mmdevdrv.c +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 67a42de97f96278b32988bdad5d168547edbe8f8..07407089ac5af65eb13d6e00b6d0969a61ec5589 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -18,15 +18,28 @@ + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + ++#define NONAMELESSUNION + #define COBJMACROS ++#define _GNU_SOURCE ++ ++#include "config.h" ++#include ++#include + + #include +-#include ++#include ++#include ++#include ++#include ++ ++#include + + #include "windef.h" + #include "winbase.h" +-#include "winternl.h" ++#include "winnls.h" ++#include "winreg.h" + #include "wine/debug.h" ++#include "wine/unicode.h" + #include "wine/list.h" + + #include "ole2.h" +@@ -43,12 +56,8 @@ + #include "endpointvolume.h" + #include "audiopolicy.h" + +-#include "unixlib.h" +- + WINE_DEFAULT_DEBUG_CHANNEL(pulse); + +-static UINT64 pulse_handle; +- + #define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) + + /* From */ +@@ -59,33 +68,52 @@ enum DriverPriority { + Priority_Preferred + }; + +-static struct pulse_config pulse_config; ++static const REFERENCE_TIME MinimumPeriod = 30000; ++static const REFERENCE_TIME DefaultPeriod = 100000; ++ ++static pa_context *pulse_ctx; ++static pa_mainloop *pulse_ml; + + static HANDLE pulse_thread; ++static pthread_mutex_t pulse_lock; ++static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; + static struct list g_sessions = LIST_INIT(g_sessions); + ++static UINT g_phys_speakers_mask = 0; ++ ++/* Mixer format + period times */ ++static WAVEFORMATEXTENSIBLE pulse_fmt[2]; ++static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2]; ++ + static GUID pulse_render_guid = + { 0xfd47d9cc, 0x4218, 0x4135, { 0x9c, 0xe2, 0x0c, 0x19, 0x5c, 0x87, 0x40, 0x5b } }; + static GUID pulse_capture_guid = + { 0x25da76d0, 0x033c, 0x4235, { 0x90, 0x02, 0x19, 0xf4, 0x88, 0x94, 0xac, 0x6f } }; + +-static CRITICAL_SECTION session_cs; +-static CRITICAL_SECTION_DEBUG session_cs_debug = { +- 0, 0, &session_cs, +- { &session_cs_debug.ProcessLocksList, +- &session_cs_debug.ProcessLocksList }, +- 0, 0, { (DWORD_PTR)(__FILE__ ": session_cs") } +-}; +-static CRITICAL_SECTION session_cs = { &session_cs_debug, -1, 0, 0, 0, 0 }; ++static UINT8 mult_alaw_sample(UINT8, float); ++static UINT8 mult_ulaw_sample(UINT8, float); + + BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) + { + if (reason == DLL_PROCESS_ATTACH) { ++ pthread_mutexattr_t attr; ++ + DisableThreadLibraryCalls(dll); +- if (__wine_init_unix_lib(dll, reason, NULL, &pulse_handle)) +- return FALSE; ++ ++ pthread_mutexattr_init(&attr); ++ pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); ++ ++ if (pthread_mutex_init(&pulse_lock, &attr) != 0) ++ pthread_mutex_init(&pulse_lock, NULL); + } else if (reason == DLL_PROCESS_DETACH) { +- __wine_init_unix_lib(dll, reason, NULL, NULL); ++ if (pulse_thread) ++ SetThreadPriority(pulse_thread, 0); ++ if (pulse_ctx) { ++ pa_context_disconnect(pulse_ctx); ++ pa_context_unref(pulse_ctx); ++ } ++ if (pulse_ml) ++ pa_mainloop_quit(pulse_ml, 0); + if (pulse_thread) { + WaitForSingleObject(pulse_thread, INFINITE); + CloseHandle(pulse_thread); +@@ -121,8 +149,15 @@ typedef struct _AudioSessionWrapper { + AudioSession *session; + } AudioSessionWrapper; + ++typedef struct _ACPacket { ++ struct list entry; ++ UINT64 qpcpos; ++ BYTE *data; ++ UINT32 discont; ++} ACPacket; ++ + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -131,22 +166,36 @@ struct ACImpl { + IUnknown *marshal; + IMMDevice *parent; + struct list entry; +- float *vol; ++ float vol[PA_CHANNELS_MAX]; + + LONG ref; + EDataFlow dataflow; +- UINT32 channel_count; +- HANDLE timer; ++ DWORD flags; ++ AUDCLNT_SHAREMODE share; ++ HANDLE event; ++ ++ INT32 locked; ++ UINT32 bufsize_frames, bufsize_bytes, capture_period, pad, started, peek_ofs, wri_offs_bytes, lcl_offs_bytes; ++ UINT32 tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len; ++ BYTE *local_buffer, *tmp_buffer, *peek_buffer; ++ void *locked_ptr; ++ ++ pa_stream *stream; ++ pa_sample_spec ss; ++ pa_channel_map map; ++ pa_buffer_attr attr; + +- struct pulse_stream *pulse_stream; ++ INT64 clock_lastpos, clock_written; + + AudioSession *session; + AudioSessionWrapper *session_wrapper; ++ struct list packet_free_head; ++ struct list packet_filled_head; + }; + +-static const WCHAR defaultW[] = L"Pulseaudio"; ++static const WCHAR defaultW[] = {'P','u','l','s','e','a','u','d','i','o',0}; + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -158,9 +207,9 @@ static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -203,65 +252,896 @@ static inline ACImpl *impl_from_IAudioStreamVolume(IAudioStreamVolume *iface) + return CONTAINING_RECORD(iface, ACImpl, IAudioStreamVolume_iface); + } + +-static void pulse_call(enum unix_funcs code, void *params) ++/* Following pulseaudio design here, mainloop has the lock taken whenever ++ * it is handling something for pulse, and the lock is required whenever ++ * doing any pa_* call that can affect the state in any way ++ * ++ * pa_cond_wait is used when waiting on results, because the mainloop needs ++ * the same lock taken to affect the state ++ * ++ * This is basically the same as the pa_threaded_mainloop implementation, ++ * but that cannot be used because it uses pthread_create directly ++ * ++ * pa_threaded_mainloop_(un)lock -> pthread_mutex_(un)lock ++ * pa_threaded_mainloop_signal -> pthread_cond_broadcast ++ * pa_threaded_mainloop_wait -> pthread_cond_wait ++ */ ++ ++static int pulse_poll_func(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata) { ++ int r; ++ pthread_mutex_unlock(&pulse_lock); ++ r = poll(ufds, nfds, timeout); ++ pthread_mutex_lock(&pulse_lock); ++ return r; ++} ++ ++static DWORD CALLBACK pulse_mainloop_thread(void *tmp) { ++ int ret; ++ pulse_ml = pa_mainloop_new(); ++ pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); ++ pthread_mutex_lock(&pulse_lock); ++ pthread_cond_broadcast(&pulse_cond); ++ pa_mainloop_run(pulse_ml, &ret); ++ pthread_mutex_unlock(&pulse_lock); ++ pa_mainloop_free(pulse_ml); ++ return ret; ++} ++ ++static void pulse_contextcallback(pa_context *c, void *userdata) + { +- NTSTATUS status; +- status = __wine_unix_call(pulse_handle, code, params); +- assert(!status); ++ switch (pa_context_get_state(c)) { ++ default: ++ FIXME("Unhandled state: %i\n", pa_context_get_state(c)); ++ return; ++ ++ case PA_CONTEXT_CONNECTING: ++ case PA_CONTEXT_UNCONNECTED: ++ case PA_CONTEXT_AUTHORIZING: ++ case PA_CONTEXT_SETTING_NAME: ++ case PA_CONTEXT_TERMINATED: ++ TRACE("State change to %i\n", pa_context_get_state(c)); ++ return; ++ ++ case PA_CONTEXT_READY: ++ TRACE("Ready\n"); ++ break; ++ ++ case PA_CONTEXT_FAILED: ++ WARN("Context failed: %s\n", pa_strerror(pa_context_errno(c))); ++ break; ++ } ++ pthread_cond_broadcast(&pulse_cond); + } + +-static void pulse_release_stream(struct pulse_stream *stream, HANDLE timer) ++static void pulse_stream_state(pa_stream *s, void *user) + { +- struct release_stream_params params; +- params.stream = stream; +- params.timer = timer; +- pulse_call(release_stream, ¶ms); ++ pa_stream_state_t state = pa_stream_get_state(s); ++ TRACE("Stream state changed to %i\n", state); ++ pthread_cond_broadcast(&pulse_cond); + } + +-static DWORD CALLBACK pulse_mainloop_thread(void *event) ++static const enum pa_channel_position pulse_pos_from_wfx[] = { ++ 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_FRONT_LEFT_OF_CENTER, ++ PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, ++ PA_CHANNEL_POSITION_REAR_CENTER, ++ PA_CHANNEL_POSITION_SIDE_LEFT, ++ PA_CHANNEL_POSITION_SIDE_RIGHT, ++ PA_CHANNEL_POSITION_TOP_CENTER, ++ PA_CHANNEL_POSITION_TOP_FRONT_LEFT, ++ PA_CHANNEL_POSITION_TOP_FRONT_CENTER, ++ PA_CHANNEL_POSITION_TOP_FRONT_RIGHT, ++ PA_CHANNEL_POSITION_TOP_REAR_LEFT, ++ PA_CHANNEL_POSITION_TOP_REAR_CENTER, ++ PA_CHANNEL_POSITION_TOP_REAR_RIGHT ++}; ++ ++static DWORD pulse_channel_map_to_channel_mask(const pa_channel_map *map) + { +- struct main_loop_params params; +- params.event = event; +- pulse_call(main_loop, ¶ms); +- return 0; ++ int i; ++ DWORD mask = 0; ++ ++ for (i = 0; i < map->channels; ++i) { ++ switch (map->map[i]) { ++ default: FIXME("Unhandled channel %s\n", pa_channel_position_to_string(map->map[i])); break; ++ case PA_CHANNEL_POSITION_FRONT_LEFT: mask |= SPEAKER_FRONT_LEFT; break; ++ case PA_CHANNEL_POSITION_MONO: ++ case PA_CHANNEL_POSITION_FRONT_CENTER: mask |= SPEAKER_FRONT_CENTER; break; ++ case PA_CHANNEL_POSITION_FRONT_RIGHT: mask |= SPEAKER_FRONT_RIGHT; break; ++ case PA_CHANNEL_POSITION_REAR_LEFT: mask |= SPEAKER_BACK_LEFT; break; ++ case PA_CHANNEL_POSITION_REAR_CENTER: mask |= SPEAKER_BACK_CENTER; break; ++ case PA_CHANNEL_POSITION_REAR_RIGHT: mask |= SPEAKER_BACK_RIGHT; break; ++ case PA_CHANNEL_POSITION_LFE: mask |= SPEAKER_LOW_FREQUENCY; break; ++ case PA_CHANNEL_POSITION_SIDE_LEFT: mask |= SPEAKER_SIDE_LEFT; break; ++ case PA_CHANNEL_POSITION_SIDE_RIGHT: mask |= SPEAKER_SIDE_RIGHT; break; ++ case PA_CHANNEL_POSITION_TOP_CENTER: mask |= SPEAKER_TOP_CENTER; break; ++ case PA_CHANNEL_POSITION_TOP_FRONT_LEFT: mask |= SPEAKER_TOP_FRONT_LEFT; break; ++ case PA_CHANNEL_POSITION_TOP_FRONT_CENTER: mask |= SPEAKER_TOP_FRONT_CENTER; break; ++ case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT: mask |= SPEAKER_TOP_FRONT_RIGHT; break; ++ case PA_CHANNEL_POSITION_TOP_REAR_LEFT: mask |= SPEAKER_TOP_BACK_LEFT; break; ++ case PA_CHANNEL_POSITION_TOP_REAR_CENTER: mask |= SPEAKER_TOP_BACK_CENTER; break; ++ case PA_CHANNEL_POSITION_TOP_REAR_RIGHT: mask |= SPEAKER_TOP_BACK_RIGHT; break; ++ case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: mask |= SPEAKER_FRONT_LEFT_OF_CENTER; break; ++ case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: mask |= SPEAKER_FRONT_RIGHT_OF_CENTER; break; ++ } ++ } ++ ++ return mask; + } + +-static char *get_application_name(void) ++/* For most hardware on Windows, users must choose a configuration with an even ++ * number of channels (stereo, quad, 5.1, 7.1). Users can then disable ++ * channels, but those channels are still reported to applications from ++ * GetMixFormat! Some applications behave badly if given an odd number of ++ * channels (e.g. 2.1). Here, we find the nearest configuration that Windows ++ * would report for a given channel layout. */ ++static void convert_channel_map(const pa_channel_map *pa_map, WAVEFORMATEXTENSIBLE *fmt) + { ++ DWORD pa_mask = pulse_channel_map_to_channel_mask(pa_map); ++ ++ TRACE("got mask for PA: 0x%x\n", pa_mask); ++ ++ if (pa_map->channels == 1) ++ { ++ fmt->Format.nChannels = 1; ++ fmt->dwChannelMask = pa_mask; ++ return; ++ } ++ ++ /* compare against known configurations and find smallest configuration ++ * which is a superset of the given speakers */ ++ ++ if (pa_map->channels <= 2 && ++ (pa_mask & ~KSAUDIO_SPEAKER_STEREO) == 0) ++ { ++ fmt->Format.nChannels = 2; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_STEREO; ++ return; ++ } ++ ++ if (pa_map->channels <= 4 && ++ (pa_mask & ~KSAUDIO_SPEAKER_QUAD) == 0) ++ { ++ fmt->Format.nChannels = 4; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_QUAD; ++ return; ++ } ++ ++ if (pa_map->channels <= 4 && ++ (pa_mask & ~KSAUDIO_SPEAKER_SURROUND) == 0) ++ { ++ fmt->Format.nChannels = 4; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_SURROUND; ++ return; ++ } ++ ++ if (pa_map->channels <= 6 && ++ (pa_mask & ~KSAUDIO_SPEAKER_5POINT1) == 0) ++ { ++ fmt->Format.nChannels = 6; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1; ++ return; ++ } ++ ++ if (pa_map->channels <= 6 && ++ (pa_mask & ~KSAUDIO_SPEAKER_5POINT1_SURROUND) == 0) ++ { ++ fmt->Format.nChannels = 6; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1_SURROUND; ++ return; ++ } ++ ++ if (pa_map->channels <= 8 && ++ (pa_mask & ~KSAUDIO_SPEAKER_7POINT1) == 0) ++ { ++ fmt->Format.nChannels = 8; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1; ++ return; ++ } ++ ++ if (pa_map->channels <= 8 && ++ (pa_mask & ~KSAUDIO_SPEAKER_7POINT1_SURROUND) == 0) ++ { ++ fmt->Format.nChannels = 8; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1_SURROUND; ++ return; ++ } ++ ++ /* oddball format, report truthfully */ ++ fmt->Format.nChannels = pa_map->channels; ++ fmt->dwChannelMask = pa_mask; ++} ++ ++static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { ++ WAVEFORMATEX *wfx = &fmt->Format; ++ pa_stream *stream; ++ pa_channel_map map; ++ pa_sample_spec ss; ++ pa_buffer_attr attr; ++ int ret; ++ unsigned int length = 0; ++ ++ pa_channel_map_init_auto(&map, 2, PA_CHANNEL_MAP_ALSA); ++ ss.rate = 48000; ++ ss.format = PA_SAMPLE_FLOAT32LE; ++ ss.channels = map.channels; ++ ++ attr.maxlength = -1; ++ attr.tlength = -1; ++ attr.minreq = attr.fragsize = pa_frame_size(&ss); ++ attr.prebuf = 0; ++ ++ stream = pa_stream_new(pulse_ctx, "format test stream", &ss, &map); ++ if (stream) ++ pa_stream_set_state_callback(stream, pulse_stream_state, NULL); ++ if (!stream) ++ ret = -1; ++ else if (render) ++ ret = pa_stream_connect_playback(stream, NULL, &attr, ++ PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS, NULL, NULL); ++ else ++ ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS); ++ if (ret >= 0) { ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && ++ pa_stream_get_state(stream) == PA_STREAM_CREATING) ++ {} ++ if (pa_stream_get_state(stream) == PA_STREAM_READY) { ++ ss = *pa_stream_get_sample_spec(stream); ++ map = *pa_stream_get_channel_map(stream); ++ if (render) ++ length = pa_stream_get_buffer_attr(stream)->minreq; ++ else ++ length = pa_stream_get_buffer_attr(stream)->fragsize; ++ pa_stream_disconnect(stream); ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && ++ pa_stream_get_state(stream) == PA_STREAM_READY) ++ {} ++ } ++ } ++ ++ if (stream) ++ pa_stream_unref(stream); ++ ++ if (length) ++ pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss); ++ ++ if (pulse_min_period[!render] < MinimumPeriod) ++ pulse_min_period[!render] = MinimumPeriod; ++ ++ if (pulse_def_period[!render] < DefaultPeriod) ++ pulse_def_period[!render] = DefaultPeriod; ++ ++ wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; ++ wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); ++ ++ convert_channel_map(&map, fmt); ++ ++ wfx->wBitsPerSample = 8 * pa_sample_size_of_format(ss.format); ++ wfx->nSamplesPerSec = ss.rate; ++ wfx->nBlockAlign = wfx->nChannels * wfx->wBitsPerSample / 8; ++ wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign; ++ if (ss.format != PA_SAMPLE_S24_32LE) ++ fmt->Samples.wValidBitsPerSample = wfx->wBitsPerSample; ++ else ++ fmt->Samples.wValidBitsPerSample = 24; ++ if (ss.format == PA_SAMPLE_FLOAT32LE) ++ fmt->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; ++ else ++ fmt->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; ++} ++ ++static HRESULT pulse_connect(void) ++{ ++ int len; + WCHAR path[MAX_PATH], *name; +- size_t len; + char *str; + ++ if (!pulse_thread) ++ { ++ if (!(pulse_thread = CreateThread(NULL, 0, pulse_mainloop_thread, NULL, 0, NULL))) ++ { ++ ERR("Failed to create mainloop thread.\n"); ++ return E_FAIL; ++ } ++ SetThreadPriority(pulse_thread, THREAD_PRIORITY_TIME_CRITICAL); ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ } ++ ++ if (pulse_ctx && PA_CONTEXT_IS_GOOD(pa_context_get_state(pulse_ctx))) ++ return S_OK; ++ if (pulse_ctx) ++ pa_context_unref(pulse_ctx); ++ + GetModuleFileNameW(NULL, path, ARRAY_SIZE(path)); +- name = wcsrchr(path, '\\'); ++ name = strrchrW(path, '\\'); + if (!name) + name = path; + else + name++; +- len = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, NULL, NULL); +- if (!(str = malloc(len))) +- return NULL; ++ len = WideCharToMultiByte(CP_UNIXCP, 0, name, -1, NULL, 0, NULL, NULL); ++ str = pa_xmalloc(len); + WideCharToMultiByte(CP_UNIXCP, 0, name, -1, str, len, NULL, NULL); +- return str; ++ TRACE("Name: %s\n", str); ++ pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), str); ++ pa_xfree(str); ++ if (!pulse_ctx) { ++ ERR("Failed to create context\n"); ++ return E_FAIL; ++ } ++ ++ pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); ++ ++ TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); ++ if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) ++ goto fail; ++ ++ /* Wait for connection */ ++ while (pthread_cond_wait(&pulse_cond, &pulse_lock)) { ++ pa_context_state_t state = pa_context_get_state(pulse_ctx); ++ ++ if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) ++ goto fail; ++ ++ if (state == PA_CONTEXT_READY) ++ break; ++ } ++ ++ TRACE("Connected to server %s with protocol version: %i.\n", ++ pa_context_get_server(pulse_ctx), ++ pa_context_get_server_protocol_version(pulse_ctx)); ++ return S_OK; ++ ++fail: ++ pa_context_unref(pulse_ctx); ++ pulse_ctx = NULL; ++ return E_FAIL; + } + +-static DWORD WINAPI pulse_timer_cb(void *user) ++/* For default PulseAudio render device, OR together all of the ++ * PKEY_AudioEndpoint_PhysicalSpeakers values of the sinks. */ ++static void pulse_phys_speakers_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) + { +- struct timer_loop_params params; +- ACImpl *This = user; +- params.stream = This->pulse_stream; +- pulse_call(timer_loop, ¶ms); +- return 0; ++ if (i) ++ g_phys_speakers_mask |= pulse_channel_map_to_channel_mask(&i->channel_map); ++} ++ ++/* some poorly-behaved applications call audio functions during DllMain, so we ++ * have to do as much as possible without creating a new thread. this function ++ * sets up a synchronous connection to verify the server is running and query ++ * static data. */ ++static HRESULT pulse_test_connect(void) ++{ ++ int len, ret; ++ WCHAR path[MAX_PATH], *name; ++ char *str; ++ pa_operation *o; ++ ++ pulse_ml = pa_mainloop_new(); ++ ++ pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); ++ ++ GetModuleFileNameW(NULL, path, ARRAY_SIZE(path)); ++ name = strrchrW(path, '\\'); ++ if (!name) ++ name = path; ++ else ++ name++; ++ len = WideCharToMultiByte(CP_UNIXCP, 0, name, -1, NULL, 0, NULL, NULL); ++ str = pa_xmalloc(len); ++ WideCharToMultiByte(CP_UNIXCP, 0, name, -1, str, len, NULL, NULL); ++ TRACE("Name: %s\n", str); ++ pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), str); ++ pa_xfree(str); ++ if (!pulse_ctx) { ++ ERR("Failed to create context\n"); ++ pa_mainloop_free(pulse_ml); ++ pulse_ml = NULL; ++ return E_FAIL; ++ } ++ ++ pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); ++ ++ TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); ++ if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) ++ goto fail; ++ ++ /* Wait for connection */ ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0) { ++ pa_context_state_t state = pa_context_get_state(pulse_ctx); ++ ++ if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) ++ goto fail; ++ ++ if (state == PA_CONTEXT_READY) ++ break; ++ } ++ ++ if (pa_context_get_state(pulse_ctx) != PA_CONTEXT_READY) ++ goto fail; ++ ++ TRACE("Test-connected to server %s with protocol version: %i.\n", ++ pa_context_get_server(pulse_ctx), ++ pa_context_get_server_protocol_version(pulse_ctx)); ++ ++ pulse_probe_settings(1, &pulse_fmt[0]); ++ pulse_probe_settings(0, &pulse_fmt[1]); ++ ++ g_phys_speakers_mask = 0; ++ o = pa_context_get_sink_info_list(pulse_ctx, &pulse_phys_speakers_cb, NULL); ++ if (o) { ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && ++ pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ {} ++ pa_operation_unref(o); ++ } ++ ++ pa_context_unref(pulse_ctx); ++ pulse_ctx = NULL; ++ pa_mainloop_free(pulse_ml); ++ pulse_ml = NULL; ++ ++ return S_OK; ++ ++fail: ++ pa_context_unref(pulse_ctx); ++ pulse_ctx = NULL; ++ pa_mainloop_free(pulse_ml); ++ pulse_ml = NULL; ++ ++ return E_FAIL; ++} ++ ++static HRESULT pulse_stream_valid(ACImpl *This) { ++ if (!This->stream) ++ return AUDCLNT_E_NOT_INITIALIZED; ++ if (pa_stream_get_state(This->stream) != PA_STREAM_READY) ++ return AUDCLNT_E_DEVICE_INVALIDATED; ++ return S_OK; ++} ++ ++static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes) ++{ ++ memset(buffer, format == PA_SAMPLE_U8 ? 0x80 : 0, bytes); ++} ++ ++static void pulse_free_noop(void *buf) ++{ ++} ++ ++enum write_buffer_flags ++{ ++ WINEPULSE_WRITE_NOFREE = 0x01, ++ WINEPULSE_WRITE_SILENT = 0x02 ++}; ++ ++static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes, ++ enum write_buffer_flags flags) ++{ ++ float vol[PA_CHANNELS_MAX]; ++ BOOL adjust = FALSE; ++ UINT32 i, channels; ++ BYTE *end; ++ ++ if (!bytes) return 0; ++ if (This->session->mute || (flags & WINEPULSE_WRITE_SILENT)) ++ { ++ silence_buffer(This->ss.format, buffer, bytes); ++ goto write; ++ } ++ ++ /* Adjust the buffer based on the volume for each channel */ ++ channels = This->ss.channels; ++ for (i = 0; i < channels; i++) ++ { ++ vol[i] = This->vol[i] * This->session->master_vol * This->session->channel_vols[i]; ++ adjust |= vol[i] != 1.0f; ++ } ++ if (!adjust) goto write; ++ ++ end = buffer + bytes; ++ switch (This->ss.format) ++ { ++#ifndef WORDS_BIGENDIAN ++#define PROCESS_BUFFER(type) do \ ++{ \ ++ type *p = (type*)buffer; \ ++ do \ ++ { \ ++ for (i = 0; i < channels; i++) \ ++ p[i] = p[i] * vol[i]; \ ++ p += i; \ ++ } while ((BYTE*)p != end); \ ++} while (0) ++ case PA_SAMPLE_S16LE: ++ PROCESS_BUFFER(INT16); ++ break; ++ case PA_SAMPLE_S32LE: ++ PROCESS_BUFFER(INT32); ++ break; ++ case PA_SAMPLE_FLOAT32LE: ++ PROCESS_BUFFER(float); ++ break; ++#undef PROCESS_BUFFER ++ case PA_SAMPLE_S24_32LE: ++ { ++ UINT32 *p = (UINT32*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ { ++ p[i] = (INT32)((INT32)(p[i] << 8) * vol[i]); ++ p[i] >>= 8; ++ } ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ case PA_SAMPLE_S24LE: ++ { ++ /* do it 12 bytes at a time until it is no longer possible */ ++ UINT32 *q = (UINT32*)buffer; ++ BYTE *p; ++ ++ i = 0; ++ while (end - (BYTE*)q >= 12) ++ { ++ UINT32 v[4], k; ++ v[0] = q[0] << 8; ++ v[1] = q[1] << 16 | (q[0] >> 16 & ~0xff); ++ v[2] = q[2] << 24 | (q[1] >> 8 & ~0xff); ++ v[3] = q[2] & ~0xff; ++ for (k = 0; k < 4; k++) ++ { ++ v[k] = (INT32)((INT32)v[k] * vol[i]); ++ if (++i == channels) i = 0; ++ } ++ *q++ = v[0] >> 8 | (v[1] & ~0xff) << 16; ++ *q++ = v[1] >> 16 | (v[2] & ~0xff) << 8; ++ *q++ = v[2] >> 24 | (v[3] & ~0xff); ++ } ++ p = (BYTE*)q; ++ while (p != end) ++ { ++ UINT32 v = (INT32)((INT32)(p[0] << 8 | p[1] << 16 | p[2] << 24) * vol[i]); ++ *p++ = v >> 8 & 0xff; ++ *p++ = v >> 16 & 0xff; ++ *p++ = v >> 24; ++ if (++i == channels) i = 0; ++ } ++ break; ++ } ++#endif ++ case PA_SAMPLE_U8: ++ { ++ UINT8 *p = (UINT8*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ p[i] = (int)((p[i] - 128) * vol[i]) + 128; ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ case PA_SAMPLE_ALAW: ++ { ++ UINT8 *p = (UINT8*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ p[i] = mult_alaw_sample(p[i], vol[i]); ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ case PA_SAMPLE_ULAW: ++ { ++ UINT8 *p = (UINT8*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ p[i] = mult_ulaw_sample(p[i], vol[i]); ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ default: ++ TRACE("Unhandled format %i, not adjusting volume.\n", This->ss.format); ++ break; ++ } ++ ++write: ++ return pa_stream_write(This->stream, buffer, bytes, ++ (flags & WINEPULSE_WRITE_NOFREE) ? pulse_free_noop : NULL, ++ 0, PA_SEEK_RELATIVE); + } + +-static void set_stream_volumes(ACImpl *This) ++static void dump_attr(const pa_buffer_attr *attr) { ++ TRACE("maxlength: %u\n", attr->maxlength); ++ TRACE("minreq: %u\n", attr->minreq); ++ TRACE("fragsize: %u\n", attr->fragsize); ++ TRACE("tlength: %u\n", attr->tlength); ++ TRACE("prebuf: %u\n", attr->prebuf); ++} ++ ++static void pulse_op_cb(pa_stream *s, int success, void *user) { ++ TRACE("Success: %i\n", success); ++ *(int*)user = success; ++ pthread_cond_broadcast(&pulse_cond); ++} ++ ++static void pulse_attr_update(pa_stream *s, void *user) { ++ const pa_buffer_attr *attr = pa_stream_get_buffer_attr(s); ++ TRACE("New attributes or device moved:\n"); ++ dump_attr(attr); ++} ++ ++/* Here's the buffer setup: ++ * ++ * vvvvvvvv sent to HW already ++ * vvvvvvvv in Pulse buffer but rewindable ++ * [dddddddddddddddd] Pulse buffer ++ * [dddddddddddddddd--------] mmdevapi buffer ++ * ^^^^^^^^^^^^^^^^ pad ++ * ^ lcl_offs_bytes ++ * ^^^^^^^^^ held_bytes ++ * ^ wri_offs_bytes ++ * ++ * GetCurrentPadding is pad ++ * ++ * During pulse_wr_callback, we decrement pad, fill Pulse buffer, and move ++ * lcl_offs forward ++ * ++ * During Stop, we flush the Pulse buffer ++ */ ++static void pulse_wr_callback(pa_stream *s, size_t bytes, void *userdata) + { +- struct set_volumes_params params; +- params.stream = This->pulse_stream; +- params.master_volume = This->session->mute ? 0.0f : This->session->master_vol; +- params.volumes = This->vol; +- params.session_volumes = This->session->channel_vols; +- pulse_call(set_volumes, ¶ms); ++ ACImpl *This = userdata; ++ UINT32 oldpad = This->pad; ++ ++ if(This->local_buffer){ ++ UINT32 to_write; ++ BYTE *buf = This->local_buffer + This->lcl_offs_bytes; ++ ++ if(This->pad > bytes){ ++ This->clock_written += bytes; ++ This->pad -= bytes; ++ }else{ ++ This->clock_written += This->pad; ++ This->pad = 0; ++ } ++ ++ bytes = min(bytes, This->held_bytes); ++ ++ if(This->lcl_offs_bytes + bytes > This->bufsize_bytes){ ++ to_write = This->bufsize_bytes - This->lcl_offs_bytes; ++ TRACE("writing small chunk of %u bytes\n", to_write); ++ write_buffer(This, buf, to_write, 0); ++ This->held_bytes -= to_write; ++ to_write = bytes - to_write; ++ This->lcl_offs_bytes = 0; ++ buf = This->local_buffer; ++ }else ++ to_write = bytes; ++ ++ TRACE("writing main chunk of %u bytes\n", to_write); ++ write_buffer(This, buf, to_write, 0); ++ This->lcl_offs_bytes += to_write; ++ This->lcl_offs_bytes %= This->bufsize_bytes; ++ This->held_bytes -= to_write; ++ }else{ ++ if (bytes < This->bufsize_bytes) ++ This->pad = This->bufsize_bytes - bytes; ++ else ++ This->pad = 0; ++ ++ if (oldpad == This->pad) ++ return; ++ ++ assert(oldpad > This->pad); ++ ++ This->clock_written += oldpad - This->pad; ++ TRACE("New pad: %zu (-%zu)\n", This->pad / pa_frame_size(&This->ss), (oldpad - This->pad) / pa_frame_size(&This->ss)); ++ } ++ ++ if (This->event) ++ SetEvent(This->event); ++} ++ ++static void pulse_underflow_callback(pa_stream *s, void *userdata) ++{ ++ WARN("Underflow\n"); ++} ++ ++/* Latency is periodically updated even when nothing is played, ++ * because of PA_STREAM_AUTO_TIMING_UPDATE so use it as timer ++ * ++ * Perfect for passing all tests :) ++ */ ++static void pulse_latency_callback(pa_stream *s, void *userdata) ++{ ++ ACImpl *This = userdata; ++ if (!This->pad && This->event) ++ SetEvent(This->event); ++} ++ ++static void pulse_started_callback(pa_stream *s, void *userdata) ++{ ++ TRACE("(Re)started playing\n"); ++} ++ ++static void pulse_rd_loop(ACImpl *This, size_t bytes) ++{ ++ while (bytes >= This->capture_period) { ++ ACPacket *p, *next; ++ LARGE_INTEGER stamp, freq; ++ BYTE *dst, *src; ++ size_t src_len, copy, rem = This->capture_period; ++ if (!(p = (ACPacket*)list_head(&This->packet_free_head))) { ++ p = (ACPacket*)list_head(&This->packet_filled_head); ++ if (!p->discont) { ++ next = (ACPacket*)p->entry.next; ++ next->discont = 1; ++ } else ++ p = (ACPacket*)list_tail(&This->packet_filled_head); ++ assert(This->pad == This->bufsize_bytes); ++ } else { ++ assert(This->pad < This->bufsize_bytes); ++ This->pad += This->capture_period; ++ assert(This->pad <= This->bufsize_bytes); ++ } ++ QueryPerformanceCounter(&stamp); ++ QueryPerformanceFrequency(&freq); ++ p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; ++ p->discont = 0; ++ list_remove(&p->entry); ++ list_add_tail(&This->packet_filled_head, &p->entry); ++ ++ dst = p->data; ++ while (rem) { ++ if (This->peek_len) { ++ copy = min(rem, This->peek_len - This->peek_ofs); ++ ++ memcpy(dst, This->peek_buffer + This->peek_ofs, copy); ++ ++ rem -= copy; ++ dst += copy; ++ This->peek_ofs += copy; ++ if(This->peek_len == This->peek_ofs) ++ This->peek_len = 0; ++ } else { ++ pa_stream_peek(This->stream, (const void**)&src, &src_len); ++ ++ copy = min(rem, src_len); ++ ++ memcpy(dst, src, rem); ++ ++ dst += copy; ++ rem -= copy; ++ ++ if (copy < src_len) { ++ if (src_len > This->peek_buffer_len) { ++ HeapFree(GetProcessHeap(), 0, This->peek_buffer); ++ This->peek_buffer = HeapAlloc(GetProcessHeap(), 0, src_len); ++ This->peek_buffer_len = src_len; ++ } ++ ++ memcpy(This->peek_buffer, src + copy, src_len - copy); ++ This->peek_len = src_len - copy; ++ This->peek_ofs = 0; ++ } ++ ++ pa_stream_drop(This->stream); ++ } ++ } ++ ++ bytes -= This->capture_period; ++ } ++} ++ ++static void pulse_rd_drop(ACImpl *This, size_t bytes) ++{ ++ while (bytes >= This->capture_period) { ++ size_t src_len, copy, rem = This->capture_period; ++ while (rem) { ++ const void *src; ++ pa_stream_peek(This->stream, &src, &src_len); ++ assert(src_len); ++ assert(This->peek_ofs < src_len); ++ src_len -= This->peek_ofs; ++ assert(src_len <= bytes); ++ ++ copy = rem; ++ if (copy > src_len) ++ copy = src_len; ++ ++ src_len -= copy; ++ rem -= copy; ++ ++ if (!src_len) { ++ This->peek_ofs = 0; ++ pa_stream_drop(This->stream); ++ } else ++ This->peek_ofs += copy; ++ bytes -= copy; ++ } ++ } ++} ++ ++static void pulse_rd_callback(pa_stream *s, size_t bytes, void *userdata) ++{ ++ ACImpl *This = userdata; ++ ++ TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(s)->fragsize); ++ assert(bytes >= This->peek_ofs); ++ bytes -= This->peek_ofs; ++ if (bytes < This->capture_period) ++ return; ++ ++ if (This->started) ++ pulse_rd_loop(This, bytes); ++ else ++ pulse_rd_drop(This, bytes); ++ ++ if (This->event) ++ SetEvent(This->event); ++} ++ ++static HRESULT pulse_stream_connect(ACImpl *This, UINT32 period_bytes) { ++ int ret; ++ char buffer[64]; ++ static LONG number; ++ pa_buffer_attr attr; ++ if (This->stream) { ++ pa_stream_disconnect(This->stream); ++ while (pa_stream_get_state(This->stream) == PA_STREAM_READY) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_stream_unref(This->stream); ++ } ++ ret = InterlockedIncrement(&number); ++ sprintf(buffer, "audio stream #%i", ret); ++ This->stream = pa_stream_new(pulse_ctx, buffer, &This->ss, &This->map); ++ ++ if (!This->stream) { ++ WARN("pa_stream_new returned error %i\n", pa_context_errno(pulse_ctx)); ++ return AUDCLNT_E_ENDPOINT_CREATE_FAILED; ++ } ++ ++ pa_stream_set_state_callback(This->stream, pulse_stream_state, This); ++ pa_stream_set_buffer_attr_callback(This->stream, pulse_attr_update, This); ++ pa_stream_set_moved_callback(This->stream, pulse_attr_update, This); ++ ++ /* PulseAudio will fill in correct values */ ++ attr.minreq = attr.fragsize = period_bytes; ++ attr.maxlength = attr.tlength = This->bufsize_bytes; ++ attr.prebuf = pa_frame_size(&This->ss); ++ dump_attr(&attr); ++ if (This->dataflow == eRender) ++ ret = pa_stream_connect_playback(This->stream, NULL, &attr, ++ PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_AUTO_TIMING_UPDATE|PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_EARLY_REQUESTS, NULL, NULL); ++ else ++ ret = pa_stream_connect_record(This->stream, NULL, &attr, ++ PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_AUTO_TIMING_UPDATE|PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_EARLY_REQUESTS); ++ if (ret < 0) { ++ WARN("Returns %i\n", ret); ++ return AUDCLNT_E_ENDPOINT_CREATE_FAILED; ++ } ++ while (pa_stream_get_state(This->stream) == PA_STREAM_CREATING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ if (pa_stream_get_state(This->stream) != PA_STREAM_READY) ++ return AUDCLNT_E_ENDPOINT_CREATE_FAILED; ++ ++ if (This->dataflow == eRender) { ++ pa_stream_set_write_callback(This->stream, pulse_wr_callback, This); ++ pa_stream_set_underflow_callback(This->stream, pulse_underflow_callback, This); ++ pa_stream_set_started_callback(This->stream, pulse_started_callback, This); ++ } else ++ pa_stream_set_read_callback(This->stream, pulse_rd_callback, This); ++ return S_OK; + } + + HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID **keys, +@@ -301,19 +1181,17 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID ** + + int WINAPI AUDDRV_GetPriority(void) + { +- struct test_connect_params params; +- char *name; +- +- params.name = name = get_application_name(); +- params.config = &pulse_config; +- pulse_call(test_connect, ¶ms); +- free(name); +- return SUCCEEDED(params.result) ? Priority_Preferred : Priority_Unavailable; ++ HRESULT hr; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_test_connect(); ++ pthread_mutex_unlock(&pulse_lock); ++ return SUCCEEDED(hr) ? Priority_Preferred : Priority_Unavailable; + } + + HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) + { + ACImpl *This; ++ int i; + EDataFlow dataflow; + HRESULT hr; + +@@ -331,7 +1209,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + if (!This) + return E_OUTOFMEMORY; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -339,24 +1217,26 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; + This->dataflow = dataflow; + This->parent = dev; ++ for (i = 0; i < PA_CHANNELS_MAX; ++i) ++ This->vol[i] = 1.f; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient2_iface, &This->marshal); + if (hr) { + HeapFree(GetProcessHeap(), 0, This); + return hr; + } + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + +@@ -366,8 +1246,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + if (*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); +@@ -381,31 +1260,39 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedDecrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + if (!ref) { +- if (This->pulse_stream) { +- pulse_release_stream(This->pulse_stream, This->timer); +- This->pulse_stream = NULL; +- EnterCriticalSection(&session_cs); ++ if (This->stream) { ++ pthread_mutex_lock(&pulse_lock); ++ if (PA_STREAM_IS_GOOD(pa_stream_get_state(This->stream))) { ++ pa_stream_disconnect(This->stream); ++ while (PA_STREAM_IS_GOOD(pa_stream_get_state(This->stream))) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ } ++ pa_stream_unref(This->stream); ++ This->stream = NULL; + list_remove(&This->entry); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + } + IUnknown_Release(This->marshal); + IMMDevice_Release(This->parent); ++ HeapFree(GetProcessHeap(), 0, This->tmp_buffer); ++ HeapFree(GetProcessHeap(), 0, This->peek_buffer); ++ HeapFree(GetProcessHeap(), 0, This->local_buffer); + HeapFree(GetProcessHeap(), 0, This); + } + return ref; +@@ -466,6 +1353,32 @@ static WAVEFORMATEX *clone_format(const WAVEFORMATEX *fmt) + return ret; + } + ++static DWORD get_channel_mask(unsigned int channels) ++{ ++ switch(channels) { ++ case 0: ++ return 0; ++ case 1: ++ return KSAUDIO_SPEAKER_MONO; ++ case 2: ++ return KSAUDIO_SPEAKER_STEREO; ++ case 3: ++ return KSAUDIO_SPEAKER_STEREO | SPEAKER_LOW_FREQUENCY; ++ case 4: ++ return KSAUDIO_SPEAKER_QUAD; /* not _SURROUND */ ++ case 5: ++ return KSAUDIO_SPEAKER_QUAD | SPEAKER_LOW_FREQUENCY; ++ case 6: ++ return KSAUDIO_SPEAKER_5POINT1; /* not 5POINT1_SURROUND */ ++ case 7: ++ return KSAUDIO_SPEAKER_5POINT1 | SPEAKER_BACK_CENTER; ++ case 8: ++ return KSAUDIO_SPEAKER_7POINT1_SURROUND; /* Vista deprecates 7POINT1 */ ++ } ++ FIXME("Unknown speaker configuration: %u\n", channels); ++ return 0; ++} ++ + static void session_init_vols(AudioSession *session, UINT channels) + { + if (session->channel_count < channels) { +@@ -545,24 +1458,127 @@ static HRESULT get_audio_session(const GUID *sessionguid, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT pulse_spec_from_waveformat(ACImpl *This, const WAVEFORMATEX *fmt) ++{ ++ pa_channel_map_init(&This->map); ++ This->ss.rate = fmt->nSamplesPerSec; ++ This->ss.format = PA_SAMPLE_INVALID; ++ ++ switch(fmt->wFormatTag) { ++ case WAVE_FORMAT_IEEE_FLOAT: ++ if (!fmt->nChannels || fmt->nChannels > 2 || fmt->wBitsPerSample != 32) ++ break; ++ This->ss.format = PA_SAMPLE_FLOAT32LE; ++ pa_channel_map_init_auto(&This->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); ++ break; ++ case WAVE_FORMAT_PCM: ++ if (!fmt->nChannels || fmt->nChannels > 2) ++ break; ++ if (fmt->wBitsPerSample == 8) ++ This->ss.format = PA_SAMPLE_U8; ++ else if (fmt->wBitsPerSample == 16) ++ This->ss.format = PA_SAMPLE_S16LE; ++ else ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ pa_channel_map_init_auto(&This->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); ++ break; ++ case WAVE_FORMAT_EXTENSIBLE: { ++ WAVEFORMATEXTENSIBLE *wfe = (WAVEFORMATEXTENSIBLE*)fmt; ++ DWORD mask = wfe->dwChannelMask; ++ DWORD i = 0, j; ++ if (fmt->cbSize != (sizeof(*wfe) - sizeof(*fmt)) && fmt->cbSize != sizeof(*wfe)) ++ break; ++ if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) && ++ (!wfe->Samples.wValidBitsPerSample || wfe->Samples.wValidBitsPerSample == 32) && ++ fmt->wBitsPerSample == 32) ++ This->ss.format = PA_SAMPLE_FLOAT32LE; ++ else if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)) { ++ DWORD valid = wfe->Samples.wValidBitsPerSample; ++ if (!valid) ++ valid = fmt->wBitsPerSample; ++ if (!valid || valid > fmt->wBitsPerSample) ++ break; ++ switch (fmt->wBitsPerSample) { ++ case 8: ++ if (valid == 8) ++ This->ss.format = PA_SAMPLE_U8; ++ break; ++ case 16: ++ if (valid == 16) ++ This->ss.format = PA_SAMPLE_S16LE; ++ break; ++ case 24: ++ if (valid == 24) ++ This->ss.format = PA_SAMPLE_S24LE; ++ break; ++ case 32: ++ if (valid == 24) ++ This->ss.format = PA_SAMPLE_S24_32LE; ++ else if (valid == 32) ++ This->ss.format = PA_SAMPLE_S32LE; ++ break; ++ default: ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ } ++ This->map.channels = fmt->nChannels; ++ if (!mask || (mask & (SPEAKER_ALL|SPEAKER_RESERVED))) ++ mask = get_channel_mask(fmt->nChannels); ++ for (j = 0; j < ARRAY_SIZE(pulse_pos_from_wfx) && i < fmt->nChannels; ++j) { ++ if (mask & (1 << j)) ++ This->map.map[i++] = pulse_pos_from_wfx[j]; ++ } ++ ++ /* Special case for mono since pulse appears to map it differently */ ++ if (mask == SPEAKER_FRONT_CENTER) ++ This->map.map[0] = PA_CHANNEL_POSITION_MONO; ++ ++ if (i < fmt->nChannels || (mask & SPEAKER_RESERVED)) { ++ This->map.channels = 0; ++ ERR("Invalid channel mask: %i/%i and %x(%x)\n", i, fmt->nChannels, mask, wfe->dwChannelMask); ++ break; ++ } ++ break; ++ } ++ case WAVE_FORMAT_ALAW: ++ case WAVE_FORMAT_MULAW: ++ if (fmt->wBitsPerSample != 8) { ++ FIXME("Unsupported bpp %u for LAW\n", fmt->wBitsPerSample); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ if (fmt->nChannels != 1 && fmt->nChannels != 2) { ++ FIXME("Unsupported channels %u for LAW\n", fmt->nChannels); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ This->ss.format = fmt->wFormatTag == WAVE_FORMAT_MULAW ? PA_SAMPLE_ULAW : PA_SAMPLE_ALAW; ++ pa_channel_map_init_auto(&This->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); ++ break; ++ default: ++ WARN("Unhandled tag %x\n", fmt->wFormatTag); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ This->ss.channels = This->map.channels; ++ if (!pa_channel_map_valid(&This->map) || This->ss.format == PA_SAMPLE_INVALID) { ++ ERR("Invalid format! Channel spec valid: %i, format: %i\n", pa_channel_map_valid(&This->map), This->ss.format); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ return S_OK; ++} ++ ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct create_stream_params params; +- unsigned int i, channel_count; +- struct pulse_stream *stream; +- char *name; +- HRESULT hr; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; ++ UINT period_bytes; + + TRACE("(%p)->(%x, %x, %s, %s, %p, %s)\n", This, mode, flags, + wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); + + if (!fmt) + return E_POINTER; +- dump_fmt(fmt); + + if (mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) + return E_INVALIDARG; +@@ -583,134 +1599,223 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return E_INVALIDARG; + } + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + +- if (This->pulse_stream) { +- LeaveCriticalSection(&session_cs); +- return AUDCLNT_E_ALREADY_INITIALIZED; +- } +- +- if (!pulse_thread) +- { +- HANDLE event = CreateEventW(NULL, TRUE, FALSE, NULL); +- if (!(pulse_thread = CreateThread(NULL, 0, pulse_mainloop_thread, event, 0, NULL))) +- { +- ERR("Failed to create mainloop thread.\n"); +- LeaveCriticalSection(&session_cs); +- CloseHandle(event); +- return E_FAIL; +- } +- SetThreadPriority(pulse_thread, THREAD_PRIORITY_TIME_CRITICAL); +- WaitForSingleObject(event, INFINITE); +- CloseHandle(event); +- } +- +- params.name = name = get_application_name(); +- params.dataflow = This->dataflow; +- params.mode = mode; +- params.flags = flags; +- params.duration = duration; +- params.fmt = fmt; +- params.stream = &stream; +- params.channel_count = &channel_count; +- pulse_call(create_stream, ¶ms); +- free(name); +- if (FAILED(hr = params.result)) +- { +- LeaveCriticalSection(&session_cs); ++ hr = pulse_connect(); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); + return hr; + } + +- if (!(This->vol = malloc(channel_count * sizeof(*This->vol)))) +- { +- pulse_release_stream(stream, NULL); +- LeaveCriticalSection(&session_cs); +- return E_OUTOFMEMORY; ++ if (This->stream) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_ALREADY_INITIALIZED; + } +- for (i = 0; i < channel_count; i++) +- This->vol[i] = 1.f; + +- hr = get_audio_session(sessionguid, This->parent, channel_count, &This->session); ++ hr = pulse_spec_from_waveformat(This, fmt); ++ TRACE("Obtaining format returns %08x\n", hr); ++ dump_fmt(fmt); ++ + if (FAILED(hr)) +- { +- free(This->vol); +- This->vol = NULL; +- LeaveCriticalSection(&session_cs); +- pulse_release_stream(stream, NULL); +- return E_OUTOFMEMORY; +- } ++ goto exit; + +- This->pulse_stream = stream; +- This->channel_count = channel_count; +- list_add_tail(&This->session->clients, &This->entry); +- set_stream_volumes(This); ++ if (mode == AUDCLNT_SHAREMODE_SHARED) { ++ REFERENCE_TIME def = pulse_def_period[This->dataflow == eCapture]; ++ REFERENCE_TIME min = pulse_min_period[This->dataflow == eCapture]; + +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ /* Switch to low latency mode if below 2 default periods, ++ * which is 20 ms by default, this will increase the amount ++ * of interrupts but allows very low latency. In dsound I ++ * managed to get a total latency of ~8ms, which is well below ++ * default ++ */ ++ if (duration < 2 * def) ++ period = min; ++ else ++ period = def; ++ if (duration < 2 * period) ++ duration = 2 * period; ++ ++ /* Uh oh, really low latency requested.. */ ++ if (duration <= 2 * period) ++ period /= 2; ++ } ++ period_bytes = pa_frame_size(&This->ss) * MulDiv(period, This->ss.rate, 10000000); ++ ++ if (duration < 20000000) ++ This->bufsize_frames = ceil((duration / 10000000.) * fmt->nSamplesPerSec); ++ else ++ This->bufsize_frames = 2 * fmt->nSamplesPerSec; ++ This->bufsize_bytes = This->bufsize_frames * pa_frame_size(&This->ss); ++ ++ This->share = mode; ++ This->flags = flags; ++ hr = pulse_stream_connect(This, period_bytes); ++ if (SUCCEEDED(hr)) { ++ UINT32 unalign; ++ const pa_buffer_attr *attr = pa_stream_get_buffer_attr(This->stream); ++ This->attr = *attr; ++ /* Update frames according to new size */ ++ dump_attr(attr); ++ if (This->dataflow == eRender) { ++ if (attr->tlength < This->bufsize_bytes) { ++ TRACE("PulseAudio buffer too small (%u < %u), using tmp buffer\n", attr->tlength, This->bufsize_bytes); ++ ++ This->local_buffer = HeapAlloc(GetProcessHeap(), 0, This->bufsize_bytes); ++ if(!This->local_buffer) ++ hr = E_OUTOFMEMORY; ++ } ++ } else { ++ UINT32 i, capture_packets; ++ ++ This->capture_period = period_bytes = attr->fragsize; ++ if ((unalign = This->bufsize_bytes % period_bytes)) ++ This->bufsize_bytes += period_bytes - unalign; ++ This->bufsize_frames = This->bufsize_bytes / pa_frame_size(&This->ss); ++ ++ capture_packets = This->bufsize_bytes / This->capture_period; ++ ++ This->local_buffer = HeapAlloc(GetProcessHeap(), 0, This->bufsize_bytes + capture_packets * sizeof(ACPacket)); ++ if (!This->local_buffer) ++ hr = E_OUTOFMEMORY; ++ else { ++ ACPacket *cur_packet = (ACPacket*)((char*)This->local_buffer + This->bufsize_bytes); ++ BYTE *data = This->local_buffer; ++ silence_buffer(This->ss.format, This->local_buffer, This->bufsize_bytes); ++ list_init(&This->packet_free_head); ++ list_init(&This->packet_filled_head); ++ for (i = 0; i < capture_packets; ++i, ++cur_packet) { ++ list_add_tail(&This->packet_free_head, &cur_packet->entry); ++ cur_packet->data = data; ++ data += This->capture_period; ++ } ++ assert(!This->capture_period || This->bufsize_bytes == This->capture_period * capture_packets); ++ assert(!capture_packets || data - This->bufsize_bytes == This->local_buffer); ++ } ++ } ++ } ++ if (SUCCEEDED(hr)) ++ hr = get_audio_session(sessionguid, This->parent, fmt->nChannels, &This->session); ++ if (SUCCEEDED(hr)) ++ list_add_tail(&This->session->clients, &This->entry); ++ ++exit: ++ if (FAILED(hr)) { ++ HeapFree(GetProcessHeap(), 0, This->local_buffer); ++ This->local_buffer = NULL; ++ if (This->stream) { ++ pa_stream_disconnect(This->stream); ++ pa_stream_unref(This->stream); ++ This->stream = NULL; ++ } ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct get_buffer_size_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, out); + + if (!out) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.size = out; +- pulse_call(get_buffer_size, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (SUCCEEDED(hr)) ++ *out = This->bufsize_frames; ++ pthread_mutex_unlock(&pulse_lock); ++ ++ return hr; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct get_latency_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ const pa_buffer_attr *attr; ++ REFERENCE_TIME lat; ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, latency); + + if (!latency) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.latency = latency; +- pulse_call(get_latency, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ attr = pa_stream_get_buffer_attr(This->stream); ++ if (This->dataflow == eRender){ ++ lat = attr->minreq / pa_frame_size(&This->ss); ++ lat += pulse_def_period[0]; ++ }else ++ lat = attr->fragsize / pa_frame_size(&This->ss); ++ *latency = 10000000; ++ *latency *= lat; ++ *latency /= This->ss.rate; ++ pthread_mutex_unlock(&pulse_lock); ++ TRACE("Latency: %u ms\n", (DWORD)(*latency / 10000)); ++ return S_OK; ++} ++ ++static void ACImpl_GetRenderPad(ACImpl *This, UINT32 *out) ++{ ++ *out = This->pad / pa_frame_size(&This->ss); ++} ++ ++static void ACImpl_GetCapturePad(ACImpl *This, UINT32 *out) ++{ ++ ACPacket *packet = This->locked_ptr; ++ if (!packet && !list_empty(&This->packet_filled_head)) { ++ packet = (ACPacket*)list_head(&This->packet_filled_head); ++ This->locked_ptr = packet; ++ list_remove(&packet->entry); ++ } ++ if (out) ++ *out = This->pad / pa_frame_size(&This->ss); + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct get_current_padding_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, out); + + if (!out) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.padding = out; +- pulse_call(get_current_padding, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (This->dataflow == eRender) ++ ACImpl_GetRenderPad(This, out); ++ else ++ ACImpl_GetCapturePad(This, out); ++ pthread_mutex_unlock(&pulse_lock); ++ ++ TRACE("%p Pad: %u ms (%u)\n", This, MulDiv(*out, 1000, This->ss.rate), *out); ++ return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, + WAVEFORMATEX **out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + HRESULT hr = S_OK; + WAVEFORMATEX *closest = NULL; + BOOL exclusive; +@@ -859,27 +1964,28 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + return hr; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ WAVEFORMATEXTENSIBLE *fmt = &pulse_fmt[This->dataflow == eCapture]; + + TRACE("(%p)->(%p)\n", This, pwfx); + + if (!pwfx) + return E_POINTER; + +- *pwfx = clone_format(&pulse_config.modes[This->dataflow == eCapture].format.Format); ++ *pwfx = clone_format(&fmt->Format); + if (!*pwfx) + return E_OUTOFMEMORY; + dump_fmt(*pwfx); + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -887,90 +1993,187 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, + return E_POINTER; + + if (defperiod) +- *defperiod = pulse_config.modes[This->dataflow == eCapture].def_period; ++ *defperiod = pulse_def_period[This->dataflow == eCapture]; + if (minperiod) +- *minperiod = pulse_config.modes[This->dataflow == eCapture].min_period; ++ *minperiod = pulse_min_period[This->dataflow == eCapture]; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct start_params params; +- HRESULT hr; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; ++ int success; ++ pa_operation *o; + + TRACE("(%p)\n", This); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- pulse_call(start, ¶ms); +- if (FAILED(hr = params.result)) ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); + return hr; ++ } + +- if (!This->timer) { +- This->timer = CreateThread(NULL, 0, pulse_timer_cb, This, 0, NULL); +- SetThreadPriority(This->timer, THREAD_PRIORITY_TIME_CRITICAL); ++ if ((This->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !This->event) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_EVENTHANDLE_NOT_SET; + } + +- return S_OK; ++ if (This->started) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_NOT_STOPPED; ++ } ++ ++ if (pa_stream_is_corked(This->stream)) { ++ o = pa_stream_cork(This->stream, 0, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } else ++ success = 0; ++ if (!success) ++ hr = E_FAIL; ++ } ++ ++ if (SUCCEEDED(hr)) { ++ This->started = TRUE; ++ if (This->dataflow == eRender && This->event) ++ pa_stream_set_latency_update_callback(This->stream, pulse_latency_callback, This); ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct stop_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; ++ pa_operation *o; ++ int success; + + TRACE("(%p)\n", This); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (!This->started) { ++ pthread_mutex_unlock(&pulse_lock); ++ return S_FALSE; ++ } + +- params.stream = This->pulse_stream; +- pulse_call(stop, ¶ms); +- return params.result; ++ if (This->dataflow == eRender) { ++ o = pa_stream_cork(This->stream, 1, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } else ++ success = 0; ++ if (!success) ++ hr = E_FAIL; ++ } ++ if (SUCCEEDED(hr)) { ++ This->started = FALSE; ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct reset_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; + + TRACE("(%p)\n", This); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (This->started) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_NOT_STOPPED; ++ } ++ ++ if (This->locked) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_BUFFER_OPERATION_PENDING; ++ } ++ ++ if (This->dataflow == eRender) { ++ /* If there is still data in the render buffer it needs to be removed from the server */ ++ int success = 0; ++ if (This->pad) { ++ pa_operation *o = pa_stream_flush(This->stream, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } ++ } ++ if (success || !This->pad){ ++ This->clock_lastpos = This->clock_written = This->pad = 0; ++ This->wri_offs_bytes = This->lcl_offs_bytes = This->held_bytes = 0; ++ } ++ } else { ++ ACPacket *p; ++ This->clock_written += This->pad; ++ This->pad = 0; ++ ++ if ((p = This->locked_ptr)) { ++ This->locked_ptr = NULL; ++ list_add_tail(&This->packet_free_head, &p->entry); ++ } ++ list_move_tail(&This->packet_free_head, &This->packet_filled_head); ++ } ++ pthread_mutex_unlock(&pulse_lock); + +- params.stream = This->pulse_stream; +- pulse_call(reset, ¶ms); +- return params.result; ++ return hr; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct set_event_handle_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, event); + + if (!event) + return E_INVALIDARG; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.event = event; +- pulse_call(set_event_handle, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (!(This->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) ++ hr = AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED; ++ else if (This->event) ++ hr = HRESULT_FROM_WIN32(ERROR_INVALID_NAME); ++ else ++ This->event = event; ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -978,8 +2181,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_POINTER; + *ppv = NULL; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ pthread_mutex_unlock(&pulse_lock); ++ if (FAILED(hr)) ++ return hr; + + if (IsEqualIID(riid, &IID_IAudioRenderClient)) { + if (This->dataflow != eRender) +@@ -1018,10 +2224,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -1033,83 +2239,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -1129,9 +2294,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -1162,52 +2324,192 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); ++} ++ ++static void alloc_tmp_buffer(ACImpl *This, UINT32 bytes) ++{ ++ if(This->tmp_buffer_bytes >= bytes) ++ return; ++ ++ HeapFree(GetProcessHeap(), 0, This->tmp_buffer); ++ This->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, bytes); ++ This->tmp_buffer_bytes = bytes; + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, + UINT32 frames, BYTE **data) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- struct get_render_buffer_params params; ++ size_t avail, req, bytes = frames * pa_frame_size(&This->ss); ++ UINT32 pad; ++ HRESULT hr = S_OK; ++ int ret = -1; + + TRACE("(%p)->(%u, %p)\n", This, frames, data); + + if (!data) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + *data = NULL; + +- params.stream = This->pulse_stream; +- params.frames = frames; +- params.data = data; +- pulse_call(get_render_buffer, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr) || This->locked) { ++ pthread_mutex_unlock(&pulse_lock); ++ return FAILED(hr) ? hr : AUDCLNT_E_OUT_OF_ORDER; ++ } ++ if (!frames) { ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; ++ } ++ ++ ACImpl_GetRenderPad(This, &pad); ++ avail = This->bufsize_frames - pad; ++ if (avail < frames || bytes > This->bufsize_bytes) { ++ pthread_mutex_unlock(&pulse_lock); ++ WARN("Wanted to write %u, but only %zu available\n", frames, avail); ++ return AUDCLNT_E_BUFFER_TOO_LARGE; ++ } ++ ++ if(This->local_buffer){ ++ if(This->wri_offs_bytes + bytes > This->bufsize_bytes){ ++ alloc_tmp_buffer(This, bytes); ++ *data = This->tmp_buffer; ++ This->locked = -frames; ++ }else{ ++ *data = This->local_buffer + This->wri_offs_bytes; ++ This->locked = frames; ++ } ++ }else{ ++ req = bytes; ++ ret = pa_stream_begin_write(This->stream, &This->locked_ptr, &req); ++ if (ret < 0 || req < bytes) { ++ FIXME("%p Not using pulse locked data: %i %zu/%u %u/%u\n", This, ret, req/pa_frame_size(&This->ss), frames, pad, This->bufsize_frames); ++ if (ret >= 0) ++ pa_stream_cancel_write(This->stream); ++ alloc_tmp_buffer(This, bytes); ++ *data = This->tmp_buffer; ++ This->locked_ptr = NULL; ++ } else ++ *data = This->locked_ptr; ++ ++ This->locked = frames; ++ } ++ ++ silence_buffer(This->ss.format, *data, bytes); ++ ++ pthread_mutex_unlock(&pulse_lock); ++ ++ return hr; ++} ++ ++static void pulse_wrap_buffer(ACImpl *This, BYTE *buffer, UINT32 written_bytes) ++{ ++ UINT32 chunk_bytes = This->bufsize_bytes - This->wri_offs_bytes; ++ ++ if(written_bytes <= chunk_bytes){ ++ memcpy(This->local_buffer + This->wri_offs_bytes, buffer, written_bytes); ++ }else{ ++ memcpy(This->local_buffer + This->wri_offs_bytes, buffer, chunk_bytes); ++ memcpy(This->local_buffer, buffer + chunk_bytes, ++ written_bytes - chunk_bytes); ++ } + } + + static HRESULT WINAPI AudioRenderClient_ReleaseBuffer( + IAudioRenderClient *iface, UINT32 written_frames, DWORD flags) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- struct release_render_buffer_params params; ++ UINT32 written_bytes = written_frames * pa_frame_size(&This->ss); + + TRACE("(%p)->(%u, %x)\n", This, written_frames, flags); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ if (!This->locked || !written_frames) { ++ if (This->locked_ptr) ++ pa_stream_cancel_write(This->stream); ++ This->locked = 0; ++ This->locked_ptr = NULL; ++ pthread_mutex_unlock(&pulse_lock); ++ return written_frames ? AUDCLNT_E_OUT_OF_ORDER : S_OK; ++ } ++ ++ if (This->locked < written_frames) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_INVALID_SIZE; ++ } ++ ++ if(This->local_buffer){ ++ BYTE *buffer; ++ ++ if(This->locked >= 0) ++ buffer = This->local_buffer + This->wri_offs_bytes; ++ else ++ buffer = This->tmp_buffer; ++ ++ if(flags & AUDCLNT_BUFFERFLAGS_SILENT) ++ silence_buffer(This->ss.format, buffer, written_bytes); ++ ++ if(This->locked < 0) ++ pulse_wrap_buffer(This, buffer, written_bytes); ++ ++ This->wri_offs_bytes += written_bytes; ++ This->wri_offs_bytes %= This->bufsize_bytes; ++ ++ This->pad += written_bytes; ++ This->held_bytes += written_bytes; ++ ++ if(This->held_bytes == This->pad){ ++ int e; ++ UINT32 to_write = min(This->attr.tlength, written_bytes); ++ ++ /* nothing in PA, so send data immediately */ ++ ++ TRACE("pre-writing %u bytes\n", to_write); ++ ++ e = write_buffer(This, buffer, to_write, 0); ++ if(e) ++ ERR("pa_stream_write failed: 0x%x\n", e); ++ ++ This->lcl_offs_bytes += to_write; ++ This->lcl_offs_bytes %= This->bufsize_bytes; ++ This->held_bytes -= to_write; ++ } ++ ++ }else{ ++ enum write_buffer_flags wr_flags = 0; ++ ++ if (flags & AUDCLNT_BUFFERFLAGS_SILENT) wr_flags |= WINEPULSE_WRITE_SILENT; ++ if (!This->locked_ptr) wr_flags |= WINEPULSE_WRITE_NOFREE; ++ ++ write_buffer(This, This->locked_ptr ? This->locked_ptr : This->tmp_buffer, written_bytes, wr_flags); ++ This->pad += written_bytes; ++ } + +- params.stream = This->pulse_stream; +- params.written_frames = written_frames; +- params.flags = flags; +- pulse_call(release_render_buffer, ¶ms); +- return params.result; ++ if (!pa_stream_is_corked(This->stream)) { ++ int success; ++ pa_operation *o; ++ o = pa_stream_trigger(This->stream, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } ++ } ++ ++ This->locked = 0; ++ This->locked_ptr = NULL; ++ TRACE("Released %u, pad %zu\n", written_frames, This->pad / pa_frame_size(&This->ss)); ++ assert(This->pad <= This->bufsize_bytes); ++ ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; + } + + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl = { +@@ -1246,13 +2548,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -1260,63 +2562,98 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, + UINT64 *qpcpos) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- struct get_capture_buffer_params params; ++ HRESULT hr; ++ ACPacket *packet; + + TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags, + devpos, qpcpos); + + if (!data) + return E_POINTER; ++ + *data = NULL; ++ + if (!frames || !flags) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.data = data; +- params.frames = frames; +- params.flags = flags; +- params.devpos = devpos; +- params.qpcpos = qpcpos; +- pulse_call(get_capture_buffer, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr) || This->locked) { ++ pthread_mutex_unlock(&pulse_lock); ++ return FAILED(hr) ? hr : AUDCLNT_E_OUT_OF_ORDER; ++ } ++ ++ ACImpl_GetCapturePad(This, NULL); ++ if ((packet = This->locked_ptr)) { ++ *frames = This->capture_period / pa_frame_size(&This->ss); ++ *flags = 0; ++ if (packet->discont) ++ *flags |= AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY; ++ if (devpos) { ++ if (packet->discont) ++ *devpos = (This->clock_written + This->capture_period) / pa_frame_size(&This->ss); ++ else ++ *devpos = This->clock_written / pa_frame_size(&This->ss); ++ } ++ if (qpcpos) ++ *qpcpos = packet->qpcpos; ++ *data = packet->data; ++ } ++ else ++ *frames = 0; ++ This->locked = *frames; ++ pthread_mutex_unlock(&pulse_lock); ++ return *frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY; + } + + static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer( + IAudioCaptureClient *iface, UINT32 done) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- struct release_capture_buffer_params params; + + TRACE("(%p)->(%u)\n", This, done); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- params.done = done; +- pulse_call(release_capture_buffer, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ if (!This->locked && done) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_OUT_OF_ORDER; ++ } ++ if (done && This->locked != done) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_INVALID_SIZE; ++ } ++ if (done) { ++ ACPacket *packet = This->locked_ptr; ++ This->locked_ptr = NULL; ++ This->pad -= This->capture_period; ++ if (packet->discont) ++ This->clock_written += 2 * This->capture_period; ++ else ++ This->clock_written += This->capture_period; ++ list_add_tail(&This->packet_free_head, &packet->entry); ++ } ++ This->locked = 0; ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; + } + + static HRESULT WINAPI AudioCaptureClient_GetNextPacketSize( + IAudioCaptureClient *iface, UINT32 *frames) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- struct get_next_packet_size_params params; + + TRACE("(%p)->(%p)\n", This, frames); +- + if (!frames) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.frames = frames; +- pulse_call(get_next_packet_size, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ ACImpl_GetCapturePad(This, NULL); ++ if (This->locked_ptr) ++ *frames = This->capture_period / pa_frame_size(&This->ss); ++ else ++ *frames = 0; ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; + } + + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl = +@@ -1359,50 +2696,73 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) + { + ACImpl *This = impl_from_IAudioClock(iface); +- struct get_frequency_params params; ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, freq); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- params.freq = freq; +- pulse_call(get_frequency, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (SUCCEEDED(hr)) { ++ *freq = This->ss.rate; ++ if (This->share == AUDCLNT_SHAREMODE_SHARED) ++ *freq *= pa_frame_size(&This->ss); ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + + static HRESULT WINAPI AudioClock_GetPosition(IAudioClock *iface, UINT64 *pos, + UINT64 *qpctime) + { + ACImpl *This = impl_from_IAudioClock(iface); +- struct get_position_params params; ++ HRESULT hr; + + TRACE("(%p)->(%p, %p)\n", This, pos, qpctime); + + if (!pos) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.device = FALSE; +- params.pos = pos; +- params.qpctime = qpctime; +- pulse_call(get_position, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ *pos = This->clock_written; ++ ++ if (This->share == AUDCLNT_SHAREMODE_EXCLUSIVE) ++ *pos /= pa_frame_size(&This->ss); ++ ++ /* Make time never go backwards */ ++ if (*pos < This->clock_lastpos) ++ *pos = This->clock_lastpos; ++ else ++ This->clock_lastpos = *pos; ++ pthread_mutex_unlock(&pulse_lock); ++ ++ TRACE("%p Position: %u\n", This, (unsigned)*pos); ++ ++ if (qpctime) { ++ LARGE_INTEGER stamp, freq; ++ QueryPerformanceCounter(&stamp); ++ QueryPerformanceFrequency(&freq); ++ *qpctime = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; ++ } ++ ++ return S_OK; + } + + static HRESULT WINAPI AudioClock_GetCharacteristics(IAudioClock *iface, +@@ -1440,34 +2800,23 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, + UINT64 *pos, UINT64 *qpctime) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- struct get_position_params params; +- +- TRACE("(%p)->(%p, %p)\n", This, pos, qpctime); +- +- if (!pos) +- return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- params.device = TRUE; +- params.pos = pos; +- params.qpctime = qpctime; +- pulse_call(get_position, ¶ms); +- return params.result; ++ HRESULT hr = AudioClock_GetPosition(&This->IAudioClock_iface, pos, qpctime); ++ if (SUCCEEDED(hr) && This->share == AUDCLNT_SHAREMODE_SHARED) ++ *pos /= pa_frame_size(&This->ss); ++ return hr; + } + + static const IAudioClock2Vtbl AudioClock2_Vtbl = +@@ -1507,13 +2856,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +@@ -1526,7 +2875,7 @@ static HRESULT WINAPI AudioStreamVolume_GetChannelCount( + if (!out) + return E_POINTER; + +- *out = This->channel_count; ++ *out = This->ss.channels; + + return S_OK; + } +@@ -1540,6 +2889,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( + IAudioStreamVolume *iface, UINT32 count, const float *levels) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ HRESULT hr; + int i; + + TRACE("(%p)->(%d, %p)\n", This, count, levels); +@@ -1547,24 +2897,27 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( + if (!levels) + return E_POINTER; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (count != This->channel_count) ++ if (count != This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) ++ goto out; ++ + for (i = 0; i < count; ++i) + This->vol[i] = levels[i]; + +- set_stream_volumes(This); +- LeaveCriticalSection(&session_cs); +- return S_OK; ++out: ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + + static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( + IAudioStreamVolume *iface, UINT32 count, float *levels) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ HRESULT hr; + int i; + + TRACE("(%p)->(%d, %p)\n", This, count, levels); +@@ -1572,59 +2925,63 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( + if (!levels) + return E_POINTER; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (count != This->channel_count) ++ if (count != This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) ++ goto out; ++ + for (i = 0; i < count; ++i) + levels[i] = This->vol[i]; +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ ++out: ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + + static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( + IAudioStreamVolume *iface, UINT32 index, float level) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ HRESULT hr; ++ float volumes[PA_CHANNELS_MAX]; + + TRACE("(%p)->(%d, %f)\n", This, index, level); + + if (level < 0.f || level > 1.f) + return E_INVALIDARG; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (index >= This->channel_count) ++ if (index >= This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); +- This->vol[index] = level; +- set_stream_volumes(This); +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ hr = AudioStreamVolume_GetAllVolumes(iface, This->ss.channels, volumes); ++ volumes[index] = level; ++ if (SUCCEEDED(hr)) ++ hr = AudioStreamVolume_SetAllVolumes(iface, This->ss.channels, volumes); ++ return hr; + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelVolume( + IAudioStreamVolume *iface, UINT32 index, float *level) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ float volumes[PA_CHANNELS_MAX]; ++ HRESULT hr; + + TRACE("(%p)->(%d, %p)\n", This, index, level); + + if (!level) + return E_POINTER; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (index >= This->channel_count) ++ if (index >= This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); +- *level = This->vol[index]; +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ hr = AudioStreamVolume_GetAllVolumes(iface, This->ss.channels, volumes); ++ if (SUCCEEDED(hr)) ++ *level = volumes[index]; ++ return hr; + } + + static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl = +@@ -1657,7 +3014,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if (client) { + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -1703,7 +3060,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + if (!ref) { + if (This->client) { + This->client->session_wrapper = NULL; +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -1721,20 +3078,13 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, + if (!state) + return NULL_PTR_ERR; + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + if (list_empty(&This->session->clients)) { + *state = AudioSessionStateExpired; + goto out; + } + LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) { +- struct is_started_params params; +- +- if (!client->pulse_stream) +- continue; +- +- params.stream = client->pulse_stream; +- pulse_call(is_started, ¶ms); +- if (params.started) { ++ if (client->started) { + *state = AudioSessionStateActive; + goto out; + } +@@ -1742,7 +3092,7 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, + *state = AudioSessionStateInactive; + + out: +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + return S_OK; + } + +@@ -2106,7 +3456,6 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( + { + AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + + TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); + +@@ -2118,11 +3467,9 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( + + TRACE("PulseAudio does not support session volume control\n"); + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + session->master_vol = level; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + + return S_OK; + } +@@ -2148,18 +3495,13 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, + { + AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + + TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); + + if (context) + FIXME("Notifications not supported yet\n"); + +- EnterCriticalSection(&session_cs); + session->mute = mute; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); + + return S_OK; + } +@@ -2246,7 +3588,6 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( + { + AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + + TRACE("(%p)->(%d, %f, %s)\n", session, index, level, + wine_dbgstr_guid(context)); +@@ -2262,11 +3603,9 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( + + TRACE("PulseAudio does not support session volume control\n"); + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + session->channel_vols[index] = level; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + + return S_OK; + } +@@ -2296,7 +3635,6 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( + { + AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + int i; + + TRACE("(%p)->(%d, %p, %s)\n", session, count, levels, +@@ -2313,12 +3651,10 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( + + TRACE("PulseAudio does not support session volume control\n"); + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + for(i = 0; i < count; ++i) + session->channel_vols[i] = levels[i]; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + return S_OK; + } + +@@ -2375,10 +3711,2001 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI + + if (IsEqualGUID(guid, &pulse_render_guid) && IsEqualPropertyKey(*prop, PKEY_AudioEndpoint_PhysicalSpeakers)) { + out->vt = VT_UI4; +- out->ulVal = pulse_config.speakers_mask; ++ out->u.ulVal = g_phys_speakers_mask; + +- return out->ulVal ? S_OK : E_FAIL; ++ return out->u.ulVal ? S_OK : E_FAIL; + } + + return E_NOTIMPL; + } ++ ++ ++ ++/********************************************************************** ++ * A-law and u-law sample manipulation functions ++ * Multiply with the given volume (vol must be between 0...1 inclusive) ++ * ++ * These were taken from PulseAudio's sources but adjusted to directly ++ * fit our usage (since we use floats directly) so they should be exact. ++ */ ++static UINT8 mult_alaw_sample(UINT8 sample, float vol) ++{ ++ static const float decode_to_13bits_float[1 << 8] = ++ { ++ -688.0f, -656.0f, -752.0f, -720.0f, -560.0f, -528.0f, -624.0f, -592.0f, ++ -944.0f, -912.0f, -1008.0f, -976.0f, -816.0f, -784.0f, -880.0f, -848.0f, ++ -344.0f, -328.0f, -376.0f, -360.0f, -280.0f, -264.0f, -312.0f, -296.0f, ++ -472.0f, -456.0f, -504.0f, -488.0f, -408.0f, -392.0f, -440.0f, -424.0f, ++ -2752.0f, -2624.0f, -3008.0f, -2880.0f, -2240.0f, -2112.0f, -2496.0f, -2368.0f, ++ -3776.0f, -3648.0f, -4032.0f, -3904.0f, -3264.0f, -3136.0f, -3520.0f, -3392.0f, ++ -1376.0f, -1312.0f, -1504.0f, -1440.0f, -1120.0f, -1056.0f, -1248.0f, -1184.0f, ++ -1888.0f, -1824.0f, -2016.0f, -1952.0f, -1632.0f, -1568.0f, -1760.0f, -1696.0f, ++ -43.0f, -41.0f, -47.0f, -45.0f, -35.0f, -33.0f, -39.0f, -37.0f, ++ -59.0f, -57.0f, -63.0f, -61.0f, -51.0f, -49.0f, -55.0f, -53.0f, ++ -11.0f, -9.0f, -15.0f, -13.0f, -3.0f, -1.0f, -7.0f, -5.0f, ++ -27.0f, -25.0f, -31.0f, -29.0f, -19.0f, -17.0f, -23.0f, -21.0f, ++ -172.0f, -164.0f, -188.0f, -180.0f, -140.0f, -132.0f, -156.0f, -148.0f, ++ -236.0f, -228.0f, -252.0f, -244.0f, -204.0f, -196.0f, -220.0f, -212.0f, ++ -86.0f, -82.0f, -94.0f, -90.0f, -70.0f, -66.0f, -78.0f, -74.0f, ++ -118.0f, -114.0f, -126.0f, -122.0f, -102.0f, -98.0f, -110.0f, -106.0f, ++ 688.0f, 656.0f, 752.0f, 720.0f, 560.0f, 528.0f, 624.0f, 592.0f, ++ 944.0f, 912.0f, 1008.0f, 976.0f, 816.0f, 784.0f, 880.0f, 848.0f, ++ 344.0f, 328.0f, 376.0f, 360.0f, 280.0f, 264.0f, 312.0f, 296.0f, ++ 472.0f, 456.0f, 504.0f, 488.0f, 408.0f, 392.0f, 440.0f, 424.0f, ++ 2752.0f, 2624.0f, 3008.0f, 2880.0f, 2240.0f, 2112.0f, 2496.0f, 2368.0f, ++ 3776.0f, 3648.0f, 4032.0f, 3904.0f, 3264.0f, 3136.0f, 3520.0f, 3392.0f, ++ 1376.0f, 1312.0f, 1504.0f, 1440.0f, 1120.0f, 1056.0f, 1248.0f, 1184.0f, ++ 1888.0f, 1824.0f, 2016.0f, 1952.0f, 1632.0f, 1568.0f, 1760.0f, 1696.0f, ++ 43.0f, 41.0f, 47.0f, 45.0f, 35.0f, 33.0f, 39.0f, 37.0f, ++ 59.0f, 57.0f, 63.0f, 61.0f, 51.0f, 49.0f, 55.0f, 53.0f, ++ 11.0f, 9.0f, 15.0f, 13.0f, 3.0f, 1.0f, 7.0f, 5.0f, ++ 27.0f, 25.0f, 31.0f, 29.0f, 19.0f, 17.0f, 23.0f, 21.0f, ++ 172.0f, 164.0f, 188.0f, 180.0f, 140.0f, 132.0f, 156.0f, 148.0f, ++ 236.0f, 228.0f, 252.0f, 244.0f, 204.0f, 196.0f, 220.0f, 212.0f, ++ 86.0f, 82.0f, 94.0f, 90.0f, 70.0f, 66.0f, 78.0f, 74.0f, ++ 118.0f, 114.0f, 126.0f, 122.0f, 102.0f, 98.0f, 110.0f, 106.0f ++ }; ++ ++ static const UINT8 encode[1 << 13] = ++ { ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, ++ 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x68, 0x68, 0x68, 0x68, 0x68, ++ 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6e, 0x6e, ++ 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, ++ 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, ++ 0x6d, 0x6d, 0x6d, 0x6d, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, ++ 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, ++ 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x66, 0x66, 0x66, ++ 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, ++ 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x65, ++ 0x65, 0x65, 0x65, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x78, 0x78, ++ 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, ++ 0x7f, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x72, 0x72, 0x72, 0x72, ++ 0x73, 0x73, 0x73, 0x73, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, 0x76, ++ 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, ++ 0x75, 0x75, 0x4a, 0x4a, 0x4b, 0x4b, 0x48, 0x48, 0x49, 0x49, 0x4e, 0x4e, 0x4f, ++ 0x4f, 0x4c, 0x4c, 0x4d, 0x4d, 0x42, 0x42, 0x43, 0x43, 0x40, 0x40, 0x41, 0x41, ++ 0x46, 0x46, 0x47, 0x47, 0x44, 0x44, 0x45, 0x45, 0x5a, 0x5a, 0x5b, 0x5b, 0x58, ++ 0x58, 0x59, 0x59, 0x5e, 0x5e, 0x5f, 0x5f, 0x5c, 0x5c, 0x5d, 0x5d, 0x52, 0x52, ++ 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, ++ 0x55, 0xd5, 0xd5, 0xd4, 0xd4, 0xd7, 0xd7, 0xd6, 0xd6, 0xd1, 0xd1, 0xd0, 0xd0, ++ 0xd3, 0xd3, 0xd2, 0xd2, 0xdd, 0xdd, 0xdc, 0xdc, 0xdf, 0xdf, 0xde, 0xde, 0xd9, ++ 0xd9, 0xd8, 0xd8, 0xdb, 0xdb, 0xda, 0xda, 0xc5, 0xc5, 0xc4, 0xc4, 0xc7, 0xc7, ++ 0xc6, 0xc6, 0xc1, 0xc1, 0xc0, 0xc0, 0xc3, 0xc3, 0xc2, 0xc2, 0xcd, 0xcd, 0xcc, ++ 0xcc, 0xcf, 0xcf, 0xce, 0xce, 0xc9, 0xc9, 0xc8, 0xc8, 0xcb, 0xcb, 0xca, 0xca, ++ 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, ++ 0xf6, 0xf6, 0xf6, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf3, ++ 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, ++ 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf9, 0xf9, 0xf9, ++ 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xe5, ++ 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, ++ 0xe4, 0xe4, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, ++ 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, ++ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, ++ 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xed, 0xed, ++ 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, ++ 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, ++ 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, ++ 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, ++ 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa ++ }; ++ ++ return encode[(int)(vol * decode_to_13bits_float[sample]) + ARRAY_SIZE(encode) / 2]; ++} ++ ++static UINT8 mult_ulaw_sample(UINT8 sample, float vol) ++{ ++ static const float decode_to_14bits_float[1 << 8] = ++ { ++ -8031.0f, -7775.0f, -7519.0f, -7263.0f, -7007.0f, -6751.0f, -6495.0f, -6239.0f, ++ -5983.0f, -5727.0f, -5471.0f, -5215.0f, -4959.0f, -4703.0f, -4447.0f, -4191.0f, ++ -3999.0f, -3871.0f, -3743.0f, -3615.0f, -3487.0f, -3359.0f, -3231.0f, -3103.0f, ++ -2975.0f, -2847.0f, -2719.0f, -2591.0f, -2463.0f, -2335.0f, -2207.0f, -2079.0f, ++ -1983.0f, -1919.0f, -1855.0f, -1791.0f, -1727.0f, -1663.0f, -1599.0f, -1535.0f, ++ -1471.0f, -1407.0f, -1343.0f, -1279.0f, -1215.0f, -1151.0f, -1087.0f, -1023.0f, ++ -975.0f, -943.0f, -911.0f, -879.0f, -847.0f, -815.0f, -783.0f, -751.0f, ++ -719.0f, -687.0f, -655.0f, -623.0f, -591.0f, -559.0f, -527.0f, -495.0f, ++ -471.0f, -455.0f, -439.0f, -423.0f, -407.0f, -391.0f, -375.0f, -359.0f, ++ -343.0f, -327.0f, -311.0f, -295.0f, -279.0f, -263.0f, -247.0f, -231.0f, ++ -219.0f, -211.0f, -203.0f, -195.0f, -187.0f, -179.0f, -171.0f, -163.0f, ++ -155.0f, -147.0f, -139.0f, -131.0f, -123.0f, -115.0f, -107.0f, -99.0f, ++ -93.0f, -89.0f, -85.0f, -81.0f, -77.0f, -73.0f, -69.0f, -65.0f, ++ -61.0f, -57.0f, -53.0f, -49.0f, -45.0f, -41.0f, -37.0f, -33.0f, ++ -30.0f, -28.0f, -26.0f, -24.0f, -22.0f, -20.0f, -18.0f, -16.0f, ++ -14.0f, -12.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, ++ 8031.0f, 7775.0f, 7519.0f, 7263.0f, 7007.0f, 6751.0f, 6495.0f, 6239.0f, ++ 5983.0f, 5727.0f, 5471.0f, 5215.0f, 4959.0f, 4703.0f, 4447.0f, 4191.0f, ++ 3999.0f, 3871.0f, 3743.0f, 3615.0f, 3487.0f, 3359.0f, 3231.0f, 3103.0f, ++ 2975.0f, 2847.0f, 2719.0f, 2591.0f, 2463.0f, 2335.0f, 2207.0f, 2079.0f, ++ 1983.0f, 1919.0f, 1855.0f, 1791.0f, 1727.0f, 1663.0f, 1599.0f, 1535.0f, ++ 1471.0f, 1407.0f, 1343.0f, 1279.0f, 1215.0f, 1151.0f, 1087.0f, 1023.0f, ++ 975.0f, 943.0f, 911.0f, 879.0f, 847.0f, 815.0f, 783.0f, 751.0f, ++ 719.0f, 687.0f, 655.0f, 623.0f, 591.0f, 559.0f, 527.0f, 495.0f, ++ 471.0f, 455.0f, 439.0f, 423.0f, 407.0f, 391.0f, 375.0f, 359.0f, ++ 343.0f, 327.0f, 311.0f, 295.0f, 279.0f, 263.0f, 247.0f, 231.0f, ++ 219.0f, 211.0f, 203.0f, 195.0f, 187.0f, 179.0f, 171.0f, 163.0f, ++ 155.0f, 147.0f, 139.0f, 131.0f, 123.0f, 115.0f, 107.0f, 99.0f, ++ 93.0f, 89.0f, 85.0f, 81.0f, 77.0f, 73.0f, 69.0f, 65.0f, ++ 61.0f, 57.0f, 53.0f, 49.0f, 45.0f, 41.0f, 37.0f, 33.0f, ++ 30.0f, 28.0f, 26.0f, 24.0f, 22.0f, 20.0f, 18.0f, 16.0f, ++ 14.0f, 12.0f, 10.0f, 8.0f, 6.0f, 4.0f, 2.0f, 0.0f ++ }; ++ ++ static const UINT8 encode[1 << 14] = ++ { ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, ++ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, ++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, ++ 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, ++ 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, ++ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, ++ 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, ++ 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, ++ 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, ++ 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, ++ 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, ++ 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, ++ 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, ++ 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, ++ 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, ++ 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, ++ 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, ++ 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, ++ 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, ++ 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, ++ 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, ++ 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, ++ 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, ++ 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, ++ 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, ++ 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, ++ 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, ++ 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, ++ 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, ++ 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, ++ 0x66, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, ++ 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, ++ 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, ++ 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, ++ 0x77, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, ++ 0x7e, 0x7e, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, ++ 0xf9, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, ++ 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, ++ 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, ++ 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, ++ 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, ++ 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, ++ 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, ++ 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, ++ 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, ++ 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, ++ 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, ++ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, ++ 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, ++ 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, ++ 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, ++ 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, ++ 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, ++ 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, ++ 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, ++ 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, ++ 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, ++ 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, ++ 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, ++ 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, ++ 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, ++ 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, ++ 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, ++ 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, ++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, ++ 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, ++ 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, ++ 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, ++ 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, ++ 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, ++ 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, ++ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80 ++ }; ++ ++ return encode[(int)(vol * decode_to_14bits_float[sample]) + ARRAY_SIZE(encode) / 2]; ++} +diff --git a/dlls/winepulse.drv/mult.c b/dlls/winepulse.drv/mult.c +deleted file mode 100644 +index 26b5e83c9cafad674bf80747bae1f5992538ee1c..0000000000000000000000000000000000000000 +--- a/dlls/winepulse.drv/mult.c ++++ /dev/null +@@ -1,2015 +0,0 @@ +-/* +- * Copyright 2011-2012 Maarten Lankhorst +- * Copyright 2010-2011 Maarten Lankhorst for CodeWeavers +- * Copyright 2011 Andrew Eikum for CodeWeavers +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 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 +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +- */ +- +-#include +- +-#if 0 +-#pragma makedep unix +-#endif +- +- +-/********************************************************************** +- * A-law and u-law sample manipulation functions +- * Multiply with the given volume (vol must be between 0...1 inclusive) +- * +- * These were taken from PulseAudio's sources but adjusted to directly +- * fit our usage (since we use floats directly) so they should be exact. +- */ +-UINT8 mult_alaw_sample(UINT8 sample, float vol) +-{ +- static const float decode_to_13bits_float[1 << 8] = +- { +- -688.0f, -656.0f, -752.0f, -720.0f, -560.0f, -528.0f, -624.0f, -592.0f, +- -944.0f, -912.0f, -1008.0f, -976.0f, -816.0f, -784.0f, -880.0f, -848.0f, +- -344.0f, -328.0f, -376.0f, -360.0f, -280.0f, -264.0f, -312.0f, -296.0f, +- -472.0f, -456.0f, -504.0f, -488.0f, -408.0f, -392.0f, -440.0f, -424.0f, +- -2752.0f, -2624.0f, -3008.0f, -2880.0f, -2240.0f, -2112.0f, -2496.0f, -2368.0f, +- -3776.0f, -3648.0f, -4032.0f, -3904.0f, -3264.0f, -3136.0f, -3520.0f, -3392.0f, +- -1376.0f, -1312.0f, -1504.0f, -1440.0f, -1120.0f, -1056.0f, -1248.0f, -1184.0f, +- -1888.0f, -1824.0f, -2016.0f, -1952.0f, -1632.0f, -1568.0f, -1760.0f, -1696.0f, +- -43.0f, -41.0f, -47.0f, -45.0f, -35.0f, -33.0f, -39.0f, -37.0f, +- -59.0f, -57.0f, -63.0f, -61.0f, -51.0f, -49.0f, -55.0f, -53.0f, +- -11.0f, -9.0f, -15.0f, -13.0f, -3.0f, -1.0f, -7.0f, -5.0f, +- -27.0f, -25.0f, -31.0f, -29.0f, -19.0f, -17.0f, -23.0f, -21.0f, +- -172.0f, -164.0f, -188.0f, -180.0f, -140.0f, -132.0f, -156.0f, -148.0f, +- -236.0f, -228.0f, -252.0f, -244.0f, -204.0f, -196.0f, -220.0f, -212.0f, +- -86.0f, -82.0f, -94.0f, -90.0f, -70.0f, -66.0f, -78.0f, -74.0f, +- -118.0f, -114.0f, -126.0f, -122.0f, -102.0f, -98.0f, -110.0f, -106.0f, +- 688.0f, 656.0f, 752.0f, 720.0f, 560.0f, 528.0f, 624.0f, 592.0f, +- 944.0f, 912.0f, 1008.0f, 976.0f, 816.0f, 784.0f, 880.0f, 848.0f, +- 344.0f, 328.0f, 376.0f, 360.0f, 280.0f, 264.0f, 312.0f, 296.0f, +- 472.0f, 456.0f, 504.0f, 488.0f, 408.0f, 392.0f, 440.0f, 424.0f, +- 2752.0f, 2624.0f, 3008.0f, 2880.0f, 2240.0f, 2112.0f, 2496.0f, 2368.0f, +- 3776.0f, 3648.0f, 4032.0f, 3904.0f, 3264.0f, 3136.0f, 3520.0f, 3392.0f, +- 1376.0f, 1312.0f, 1504.0f, 1440.0f, 1120.0f, 1056.0f, 1248.0f, 1184.0f, +- 1888.0f, 1824.0f, 2016.0f, 1952.0f, 1632.0f, 1568.0f, 1760.0f, 1696.0f, +- 43.0f, 41.0f, 47.0f, 45.0f, 35.0f, 33.0f, 39.0f, 37.0f, +- 59.0f, 57.0f, 63.0f, 61.0f, 51.0f, 49.0f, 55.0f, 53.0f, +- 11.0f, 9.0f, 15.0f, 13.0f, 3.0f, 1.0f, 7.0f, 5.0f, +- 27.0f, 25.0f, 31.0f, 29.0f, 19.0f, 17.0f, 23.0f, 21.0f, +- 172.0f, 164.0f, 188.0f, 180.0f, 140.0f, 132.0f, 156.0f, 148.0f, +- 236.0f, 228.0f, 252.0f, 244.0f, 204.0f, 196.0f, 220.0f, 212.0f, +- 86.0f, 82.0f, 94.0f, 90.0f, 70.0f, 66.0f, 78.0f, 74.0f, +- 118.0f, 114.0f, 126.0f, 122.0f, 102.0f, 98.0f, 110.0f, 106.0f +- }; +- +- static const UINT8 encode[1 << 13] = +- { +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, +- 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x68, 0x68, 0x68, 0x68, 0x68, +- 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6e, 0x6e, +- 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, +- 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, +- 0x6d, 0x6d, 0x6d, 0x6d, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, +- 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, +- 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x66, 0x66, 0x66, +- 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, +- 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x65, +- 0x65, 0x65, 0x65, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x78, 0x78, +- 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, +- 0x7f, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x72, 0x72, 0x72, 0x72, +- 0x73, 0x73, 0x73, 0x73, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, 0x76, +- 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, +- 0x75, 0x75, 0x4a, 0x4a, 0x4b, 0x4b, 0x48, 0x48, 0x49, 0x49, 0x4e, 0x4e, 0x4f, +- 0x4f, 0x4c, 0x4c, 0x4d, 0x4d, 0x42, 0x42, 0x43, 0x43, 0x40, 0x40, 0x41, 0x41, +- 0x46, 0x46, 0x47, 0x47, 0x44, 0x44, 0x45, 0x45, 0x5a, 0x5a, 0x5b, 0x5b, 0x58, +- 0x58, 0x59, 0x59, 0x5e, 0x5e, 0x5f, 0x5f, 0x5c, 0x5c, 0x5d, 0x5d, 0x52, 0x52, +- 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, +- 0x55, 0xd5, 0xd5, 0xd4, 0xd4, 0xd7, 0xd7, 0xd6, 0xd6, 0xd1, 0xd1, 0xd0, 0xd0, +- 0xd3, 0xd3, 0xd2, 0xd2, 0xdd, 0xdd, 0xdc, 0xdc, 0xdf, 0xdf, 0xde, 0xde, 0xd9, +- 0xd9, 0xd8, 0xd8, 0xdb, 0xdb, 0xda, 0xda, 0xc5, 0xc5, 0xc4, 0xc4, 0xc7, 0xc7, +- 0xc6, 0xc6, 0xc1, 0xc1, 0xc0, 0xc0, 0xc3, 0xc3, 0xc2, 0xc2, 0xcd, 0xcd, 0xcc, +- 0xcc, 0xcf, 0xcf, 0xce, 0xce, 0xc9, 0xc9, 0xc8, 0xc8, 0xcb, 0xcb, 0xca, 0xca, +- 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, +- 0xf6, 0xf6, 0xf6, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf3, +- 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, +- 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf9, 0xf9, 0xf9, +- 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xe5, +- 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, +- 0xe4, 0xe4, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, +- 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, +- 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, +- 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xed, 0xed, +- 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, +- 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, +- 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, +- 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, +- 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa +- }; +- +- return encode[(int)(vol * decode_to_13bits_float[sample]) + ARRAY_SIZE(encode) / 2]; +-} +- +-UINT8 mult_ulaw_sample(UINT8 sample, float vol) +-{ +- static const float decode_to_14bits_float[1 << 8] = +- { +- -8031.0f, -7775.0f, -7519.0f, -7263.0f, -7007.0f, -6751.0f, -6495.0f, -6239.0f, +- -5983.0f, -5727.0f, -5471.0f, -5215.0f, -4959.0f, -4703.0f, -4447.0f, -4191.0f, +- -3999.0f, -3871.0f, -3743.0f, -3615.0f, -3487.0f, -3359.0f, -3231.0f, -3103.0f, +- -2975.0f, -2847.0f, -2719.0f, -2591.0f, -2463.0f, -2335.0f, -2207.0f, -2079.0f, +- -1983.0f, -1919.0f, -1855.0f, -1791.0f, -1727.0f, -1663.0f, -1599.0f, -1535.0f, +- -1471.0f, -1407.0f, -1343.0f, -1279.0f, -1215.0f, -1151.0f, -1087.0f, -1023.0f, +- -975.0f, -943.0f, -911.0f, -879.0f, -847.0f, -815.0f, -783.0f, -751.0f, +- -719.0f, -687.0f, -655.0f, -623.0f, -591.0f, -559.0f, -527.0f, -495.0f, +- -471.0f, -455.0f, -439.0f, -423.0f, -407.0f, -391.0f, -375.0f, -359.0f, +- -343.0f, -327.0f, -311.0f, -295.0f, -279.0f, -263.0f, -247.0f, -231.0f, +- -219.0f, -211.0f, -203.0f, -195.0f, -187.0f, -179.0f, -171.0f, -163.0f, +- -155.0f, -147.0f, -139.0f, -131.0f, -123.0f, -115.0f, -107.0f, -99.0f, +- -93.0f, -89.0f, -85.0f, -81.0f, -77.0f, -73.0f, -69.0f, -65.0f, +- -61.0f, -57.0f, -53.0f, -49.0f, -45.0f, -41.0f, -37.0f, -33.0f, +- -30.0f, -28.0f, -26.0f, -24.0f, -22.0f, -20.0f, -18.0f, -16.0f, +- -14.0f, -12.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, +- 8031.0f, 7775.0f, 7519.0f, 7263.0f, 7007.0f, 6751.0f, 6495.0f, 6239.0f, +- 5983.0f, 5727.0f, 5471.0f, 5215.0f, 4959.0f, 4703.0f, 4447.0f, 4191.0f, +- 3999.0f, 3871.0f, 3743.0f, 3615.0f, 3487.0f, 3359.0f, 3231.0f, 3103.0f, +- 2975.0f, 2847.0f, 2719.0f, 2591.0f, 2463.0f, 2335.0f, 2207.0f, 2079.0f, +- 1983.0f, 1919.0f, 1855.0f, 1791.0f, 1727.0f, 1663.0f, 1599.0f, 1535.0f, +- 1471.0f, 1407.0f, 1343.0f, 1279.0f, 1215.0f, 1151.0f, 1087.0f, 1023.0f, +- 975.0f, 943.0f, 911.0f, 879.0f, 847.0f, 815.0f, 783.0f, 751.0f, +- 719.0f, 687.0f, 655.0f, 623.0f, 591.0f, 559.0f, 527.0f, 495.0f, +- 471.0f, 455.0f, 439.0f, 423.0f, 407.0f, 391.0f, 375.0f, 359.0f, +- 343.0f, 327.0f, 311.0f, 295.0f, 279.0f, 263.0f, 247.0f, 231.0f, +- 219.0f, 211.0f, 203.0f, 195.0f, 187.0f, 179.0f, 171.0f, 163.0f, +- 155.0f, 147.0f, 139.0f, 131.0f, 123.0f, 115.0f, 107.0f, 99.0f, +- 93.0f, 89.0f, 85.0f, 81.0f, 77.0f, 73.0f, 69.0f, 65.0f, +- 61.0f, 57.0f, 53.0f, 49.0f, 45.0f, 41.0f, 37.0f, 33.0f, +- 30.0f, 28.0f, 26.0f, 24.0f, 22.0f, 20.0f, 18.0f, 16.0f, +- 14.0f, 12.0f, 10.0f, 8.0f, 6.0f, 4.0f, 2.0f, 0.0f +- }; +- +- static const UINT8 encode[1 << 14] = +- { +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, +- 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, +- 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, +- 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, +- 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, +- 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, +- 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, +- 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, +- 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, +- 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, +- 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, +- 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, +- 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, +- 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, +- 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, +- 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, +- 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, +- 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, +- 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, +- 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, +- 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, +- 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, +- 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, +- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, +- 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, +- 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, +- 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, +- 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, +- 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, +- 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, +- 0x66, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, +- 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, +- 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, +- 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, +- 0x77, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, +- 0x7e, 0x7e, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, +- 0xf9, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, +- 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, +- 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, +- 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, +- 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, +- 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, +- 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, +- 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, +- 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, +- 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, +- 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, +- 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, +- 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, +- 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, +- 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, +- 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, +- 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, +- 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, +- 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, +- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, +- 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, +- 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, +- 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, +- 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, +- 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, +- 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, +- 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, +- 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, +- 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, +- 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, +- 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, +- 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, +- 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, +- 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, +- 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, +- 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80 +- }; +- +- return encode[(int)(vol * decode_to_14bits_float[sample]) + ARRAY_SIZE(encode) / 2]; +-} +diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c +deleted file mode 100644 +index 55579ecda80bc557c00b2adba783d7d4b001f52e..0000000000000000000000000000000000000000 +--- a/dlls/winepulse.drv/pulse.c ++++ /dev/null +@@ -1,1984 +0,0 @@ +-/* +- * Copyright 2011-2012 Maarten Lankhorst +- * Copyright 2010-2011 Maarten Lankhorst for CodeWeavers +- * Copyright 2011 Andrew Eikum for CodeWeavers +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 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 +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +- */ +- +-#if 0 +-#pragma makedep unix +-#endif +- +-#define _NTSYSTEM_ +- +-#include +-#include +-#include +-#include +- +-#include +- +-#include "ntstatus.h" +-#define WIN32_NO_STATUS +-#include "winternl.h" +- +-#include "mmdeviceapi.h" +-#include "initguid.h" +-#include "audioclient.h" +- +-#include "unixlib.h" +- +-#include "wine/debug.h" +- +-WINE_DEFAULT_DEBUG_CHANNEL(pulse); +- +-struct pulse_stream +-{ +- EDataFlow dataflow; +- +- pa_stream *stream; +- pa_sample_spec ss; +- pa_channel_map map; +- pa_buffer_attr attr; +- +- DWORD flags; +- AUDCLNT_SHAREMODE share; +- HANDLE event; +- float vol[PA_CHANNELS_MAX]; +- BOOL mute; +- +- INT32 locked; +- BOOL started; +- SIZE_T bufsize_frames, alloc_size, real_bufsize_bytes, period_bytes; +- SIZE_T peek_ofs, read_offs_bytes, lcl_offs_bytes, pa_offs_bytes; +- SIZE_T tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len, pa_held_bytes; +- BYTE *local_buffer, *tmp_buffer, *peek_buffer; +- void *locked_ptr; +- BOOL please_quit, just_started, just_underran; +- pa_usec_t last_time, mmdev_period_usec; +- +- INT64 clock_lastpos, clock_written; +- +- struct list packet_free_head; +- struct list packet_filled_head; +-}; +- +-typedef struct _ACPacket +-{ +- struct list entry; +- UINT64 qpcpos; +- BYTE *data; +- UINT32 discont; +-} ACPacket; +- +-static pa_context *pulse_ctx; +-static pa_mainloop *pulse_ml; +- +-/* Mixer format + period times */ +-static WAVEFORMATEXTENSIBLE pulse_fmt[2]; +-static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2]; +- +-static UINT g_phys_speakers_mask = 0; +- +-static const REFERENCE_TIME MinimumPeriod = 30000; +-static const REFERENCE_TIME DefaultPeriod = 100000; +- +-static pthread_mutex_t pulse_mutex; +-static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; +- +-UINT8 mult_alaw_sample(UINT8, float); +-UINT8 mult_ulaw_sample(UINT8, float); +- +-static void pulse_lock(void) +-{ +- pthread_mutex_lock(&pulse_mutex); +-} +- +-static void pulse_unlock(void) +-{ +- pthread_mutex_unlock(&pulse_mutex); +-} +- +-static int pulse_cond_wait(void) +-{ +- return pthread_cond_wait(&pulse_cond, &pulse_mutex); +-} +- +-static void pulse_broadcast(void) +-{ +- pthread_cond_broadcast(&pulse_cond); +-} +- +-static void dump_attr(const pa_buffer_attr *attr) +-{ +- TRACE("maxlength: %u\n", attr->maxlength); +- TRACE("minreq: %u\n", attr->minreq); +- TRACE("fragsize: %u\n", attr->fragsize); +- TRACE("tlength: %u\n", attr->tlength); +- TRACE("prebuf: %u\n", attr->prebuf); +-} +- +-/* copied from kernelbase */ +-static int muldiv(int a, int b, int c) +-{ +- LONGLONG ret; +- +- if (!c) return -1; +- +- /* We want to deal with a positive divisor to simplify the logic. */ +- if (c < 0) +- { +- a = -a; +- c = -c; +- } +- +- /* If the result is positive, we "add" to round. else, we subtract to round. */ +- if ((a < 0 && b < 0) || (a >= 0 && b >= 0)) +- ret = (((LONGLONG)a * b) + (c / 2)) / c; +- else +- ret = (((LONGLONG)a * b) - (c / 2)) / c; +- +- if (ret > 2147483647 || ret < -2147483647) return -1; +- return ret; +-} +- +-/* Following pulseaudio design here, mainloop has the lock taken whenever +- * it is handling something for pulse, and the lock is required whenever +- * doing any pa_* call that can affect the state in any way +- * +- * pa_cond_wait is used when waiting on results, because the mainloop needs +- * the same lock taken to affect the state +- * +- * This is basically the same as the pa_threaded_mainloop implementation, +- * but that cannot be used because it uses pthread_create directly +- * +- * pa_threaded_mainloop_(un)lock -> pthread_mutex_(un)lock +- * pa_threaded_mainloop_signal -> pthread_cond_broadcast +- * pa_threaded_mainloop_wait -> pthread_cond_wait +- */ +-static int pulse_poll_func(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata) +-{ +- int r; +- pulse_unlock(); +- r = poll(ufds, nfds, timeout); +- pulse_lock(); +- return r; +-} +- +-static NTSTATUS pulse_main_loop(void *args) +-{ +- struct main_loop_params *params = args; +- int ret; +- pulse_lock(); +- pulse_ml = pa_mainloop_new(); +- pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); +- NtSetEvent(params->event, NULL); +- pa_mainloop_run(pulse_ml, &ret); +- pa_mainloop_free(pulse_ml); +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static void pulse_contextcallback(pa_context *c, void *userdata) +-{ +- switch (pa_context_get_state(c)) { +- default: +- FIXME("Unhandled state: %i\n", pa_context_get_state(c)); +- return; +- +- case PA_CONTEXT_CONNECTING: +- case PA_CONTEXT_UNCONNECTED: +- case PA_CONTEXT_AUTHORIZING: +- case PA_CONTEXT_SETTING_NAME: +- case PA_CONTEXT_TERMINATED: +- TRACE("State change to %i\n", pa_context_get_state(c)); +- return; +- +- case PA_CONTEXT_READY: +- TRACE("Ready\n"); +- break; +- +- case PA_CONTEXT_FAILED: +- WARN("Context failed: %s\n", pa_strerror(pa_context_errno(c))); +- break; +- } +- pulse_broadcast(); +-} +- +-static void pulse_stream_state(pa_stream *s, void *user) +-{ +- pa_stream_state_t state = pa_stream_get_state(s); +- TRACE("Stream state changed to %i\n", state); +- pulse_broadcast(); +-} +- +-static void pulse_attr_update(pa_stream *s, void *user) { +- const pa_buffer_attr *attr = pa_stream_get_buffer_attr(s); +- TRACE("New attributes or device moved:\n"); +- dump_attr(attr); +-} +- +-static void pulse_underflow_callback(pa_stream *s, void *userdata) +-{ +- struct pulse_stream *stream = userdata; +- WARN("%p: Underflow\n", userdata); +- stream->just_underran = TRUE; +- /* re-sync */ +- stream->pa_offs_bytes = stream->lcl_offs_bytes; +- stream->pa_held_bytes = stream->held_bytes; +-} +- +-static void pulse_started_callback(pa_stream *s, void *userdata) +-{ +- TRACE("%p: (Re)started playing\n", userdata); +-} +- +-static void pulse_op_cb(pa_stream *s, int success, void *user) +-{ +- TRACE("Success: %i\n", success); +- *(int*)user = success; +- pulse_broadcast(); +-} +- +-static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes) +-{ +- memset(buffer, format == PA_SAMPLE_U8 ? 0x80 : 0, bytes); +-} +- +-static BOOL pulse_stream_valid(struct pulse_stream *stream) +-{ +- return pa_stream_get_state(stream->stream) == PA_STREAM_READY; +-} +- +-static HRESULT pulse_connect(const char *name) +-{ +- if (pulse_ctx && PA_CONTEXT_IS_GOOD(pa_context_get_state(pulse_ctx))) +- return S_OK; +- if (pulse_ctx) +- pa_context_unref(pulse_ctx); +- +- pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), name); +- if (!pulse_ctx) { +- ERR("Failed to create context\n"); +- return E_FAIL; +- } +- +- pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); +- +- TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); +- if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) +- goto fail; +- +- /* Wait for connection */ +- while (pulse_cond_wait()) { +- pa_context_state_t state = pa_context_get_state(pulse_ctx); +- +- if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) +- goto fail; +- +- if (state == PA_CONTEXT_READY) +- break; +- } +- +- TRACE("Connected to server %s with protocol version: %i.\n", +- pa_context_get_server(pulse_ctx), +- pa_context_get_server_protocol_version(pulse_ctx)); +- return S_OK; +- +-fail: +- pa_context_unref(pulse_ctx); +- pulse_ctx = NULL; +- return E_FAIL; +-} +- +-static DWORD pulse_channel_map_to_channel_mask(const pa_channel_map *map) +-{ +- int i; +- DWORD mask = 0; +- +- for (i = 0; i < map->channels; ++i) { +- switch (map->map[i]) { +- default: FIXME("Unhandled channel %s\n", pa_channel_position_to_string(map->map[i])); break; +- case PA_CHANNEL_POSITION_FRONT_LEFT: mask |= SPEAKER_FRONT_LEFT; break; +- case PA_CHANNEL_POSITION_MONO: +- case PA_CHANNEL_POSITION_FRONT_CENTER: mask |= SPEAKER_FRONT_CENTER; break; +- case PA_CHANNEL_POSITION_FRONT_RIGHT: mask |= SPEAKER_FRONT_RIGHT; break; +- case PA_CHANNEL_POSITION_REAR_LEFT: mask |= SPEAKER_BACK_LEFT; break; +- case PA_CHANNEL_POSITION_REAR_CENTER: mask |= SPEAKER_BACK_CENTER; break; +- case PA_CHANNEL_POSITION_REAR_RIGHT: mask |= SPEAKER_BACK_RIGHT; break; +- case PA_CHANNEL_POSITION_LFE: mask |= SPEAKER_LOW_FREQUENCY; break; +- case PA_CHANNEL_POSITION_SIDE_LEFT: mask |= SPEAKER_SIDE_LEFT; break; +- case PA_CHANNEL_POSITION_SIDE_RIGHT: mask |= SPEAKER_SIDE_RIGHT; break; +- case PA_CHANNEL_POSITION_TOP_CENTER: mask |= SPEAKER_TOP_CENTER; break; +- case PA_CHANNEL_POSITION_TOP_FRONT_LEFT: mask |= SPEAKER_TOP_FRONT_LEFT; break; +- case PA_CHANNEL_POSITION_TOP_FRONT_CENTER: mask |= SPEAKER_TOP_FRONT_CENTER; break; +- case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT: mask |= SPEAKER_TOP_FRONT_RIGHT; break; +- case PA_CHANNEL_POSITION_TOP_REAR_LEFT: mask |= SPEAKER_TOP_BACK_LEFT; break; +- case PA_CHANNEL_POSITION_TOP_REAR_CENTER: mask |= SPEAKER_TOP_BACK_CENTER; break; +- case PA_CHANNEL_POSITION_TOP_REAR_RIGHT: mask |= SPEAKER_TOP_BACK_RIGHT; break; +- case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: mask |= SPEAKER_FRONT_LEFT_OF_CENTER; break; +- case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: mask |= SPEAKER_FRONT_RIGHT_OF_CENTER; break; +- } +- } +- +- return mask; +-} +- +-/* For default PulseAudio render device, OR together all of the +- * PKEY_AudioEndpoint_PhysicalSpeakers values of the sinks. */ +-static void pulse_phys_speakers_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) +-{ +- if (i) +- g_phys_speakers_mask |= pulse_channel_map_to_channel_mask(&i->channel_map); +-} +- +-/* For most hardware on Windows, users must choose a configuration with an even +- * number of channels (stereo, quad, 5.1, 7.1). Users can then disable +- * channels, but those channels are still reported to applications from +- * GetMixFormat! Some applications behave badly if given an odd number of +- * channels (e.g. 2.1). Here, we find the nearest configuration that Windows +- * would report for a given channel layout. */ +-static void convert_channel_map(const pa_channel_map *pa_map, WAVEFORMATEXTENSIBLE *fmt) +-{ +- DWORD pa_mask = pulse_channel_map_to_channel_mask(pa_map); +- +- TRACE("got mask for PA: 0x%x\n", pa_mask); +- +- if (pa_map->channels == 1) +- { +- fmt->Format.nChannels = 1; +- fmt->dwChannelMask = pa_mask; +- return; +- } +- +- /* compare against known configurations and find smallest configuration +- * which is a superset of the given speakers */ +- +- if (pa_map->channels <= 2 && +- (pa_mask & ~KSAUDIO_SPEAKER_STEREO) == 0) +- { +- fmt->Format.nChannels = 2; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_STEREO; +- return; +- } +- +- if (pa_map->channels <= 4 && +- (pa_mask & ~KSAUDIO_SPEAKER_QUAD) == 0) +- { +- fmt->Format.nChannels = 4; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_QUAD; +- return; +- } +- +- if (pa_map->channels <= 4 && +- (pa_mask & ~KSAUDIO_SPEAKER_SURROUND) == 0) +- { +- fmt->Format.nChannels = 4; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_SURROUND; +- return; +- } +- +- if (pa_map->channels <= 6 && +- (pa_mask & ~KSAUDIO_SPEAKER_5POINT1) == 0) +- { +- fmt->Format.nChannels = 6; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1; +- return; +- } +- +- if (pa_map->channels <= 6 && +- (pa_mask & ~KSAUDIO_SPEAKER_5POINT1_SURROUND) == 0) +- { +- fmt->Format.nChannels = 6; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1_SURROUND; +- return; +- } +- +- if (pa_map->channels <= 8 && +- (pa_mask & ~KSAUDIO_SPEAKER_7POINT1) == 0) +- { +- fmt->Format.nChannels = 8; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1; +- return; +- } +- +- if (pa_map->channels <= 8 && +- (pa_mask & ~KSAUDIO_SPEAKER_7POINT1_SURROUND) == 0) +- { +- fmt->Format.nChannels = 8; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1_SURROUND; +- return; +- } +- +- /* oddball format, report truthfully */ +- fmt->Format.nChannels = pa_map->channels; +- fmt->dwChannelMask = pa_mask; +-} +- +-static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { +- WAVEFORMATEX *wfx = &fmt->Format; +- pa_stream *stream; +- pa_channel_map map; +- pa_sample_spec ss; +- pa_buffer_attr attr; +- int ret; +- unsigned int length = 0; +- +- pa_channel_map_init_auto(&map, 2, PA_CHANNEL_MAP_ALSA); +- ss.rate = 48000; +- ss.format = PA_SAMPLE_FLOAT32LE; +- ss.channels = map.channels; +- +- attr.maxlength = -1; +- attr.tlength = -1; +- attr.minreq = attr.fragsize = pa_frame_size(&ss); +- attr.prebuf = 0; +- +- stream = pa_stream_new(pulse_ctx, "format test stream", &ss, &map); +- if (stream) +- pa_stream_set_state_callback(stream, pulse_stream_state, NULL); +- if (!stream) +- ret = -1; +- else if (render) +- ret = pa_stream_connect_playback(stream, NULL, &attr, +- PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS, NULL, NULL); +- else +- ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS); +- if (ret >= 0) { +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && +- pa_stream_get_state(stream) == PA_STREAM_CREATING) +- {} +- if (pa_stream_get_state(stream) == PA_STREAM_READY) { +- ss = *pa_stream_get_sample_spec(stream); +- map = *pa_stream_get_channel_map(stream); +- if (render) +- length = pa_stream_get_buffer_attr(stream)->minreq; +- else +- length = pa_stream_get_buffer_attr(stream)->fragsize; +- pa_stream_disconnect(stream); +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && +- pa_stream_get_state(stream) == PA_STREAM_READY) +- {} +- } +- } +- +- if (stream) +- pa_stream_unref(stream); +- +- if (length) +- pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss); +- +- if (pulse_min_period[!render] < MinimumPeriod) +- pulse_min_period[!render] = MinimumPeriod; +- +- if (pulse_def_period[!render] < DefaultPeriod) +- pulse_def_period[!render] = DefaultPeriod; +- +- wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; +- wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); +- +- convert_channel_map(&map, fmt); +- +- wfx->wBitsPerSample = 8 * pa_sample_size_of_format(ss.format); +- wfx->nSamplesPerSec = ss.rate; +- wfx->nBlockAlign = wfx->nChannels * wfx->wBitsPerSample / 8; +- wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign; +- if (ss.format != PA_SAMPLE_S24_32LE) +- fmt->Samples.wValidBitsPerSample = wfx->wBitsPerSample; +- else +- fmt->Samples.wValidBitsPerSample = 24; +- if (ss.format == PA_SAMPLE_FLOAT32LE) +- fmt->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; +- else +- fmt->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; +-} +- +-/* some poorly-behaved applications call audio functions during DllMain, so we +- * have to do as much as possible without creating a new thread. this function +- * sets up a synchronous connection to verify the server is running and query +- * static data. */ +-static NTSTATUS pulse_test_connect(void *args) +-{ +- struct test_connect_params *params = args; +- struct pulse_config *config = params->config; +- pa_operation *o; +- int ret; +- +- pulse_lock(); +- pulse_ml = pa_mainloop_new(); +- +- pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); +- +- pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), params->name); +- if (!pulse_ctx) { +- ERR("Failed to create context\n"); +- pa_mainloop_free(pulse_ml); +- pulse_ml = NULL; +- pulse_unlock(); +- params->result = E_FAIL; +- return STATUS_SUCCESS; +- } +- +- pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); +- +- TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); +- if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) +- goto fail; +- +- /* Wait for connection */ +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0) { +- pa_context_state_t state = pa_context_get_state(pulse_ctx); +- +- if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) +- goto fail; +- +- if (state == PA_CONTEXT_READY) +- break; +- } +- +- if (pa_context_get_state(pulse_ctx) != PA_CONTEXT_READY) +- goto fail; +- +- TRACE("Test-connected to server %s with protocol version: %i.\n", +- pa_context_get_server(pulse_ctx), +- pa_context_get_server_protocol_version(pulse_ctx)); +- +- pulse_probe_settings(1, &pulse_fmt[0]); +- pulse_probe_settings(0, &pulse_fmt[1]); +- +- g_phys_speakers_mask = 0; +- o = pa_context_get_sink_info_list(pulse_ctx, &pulse_phys_speakers_cb, NULL); +- if (o) { +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && +- pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- {} +- pa_operation_unref(o); +- } +- +- pa_context_unref(pulse_ctx); +- pulse_ctx = NULL; +- pa_mainloop_free(pulse_ml); +- pulse_ml = NULL; +- +- config->speakers_mask = g_phys_speakers_mask; +- config->modes[0].format = pulse_fmt[0]; +- config->modes[0].def_period = pulse_def_period[0]; +- config->modes[0].min_period = pulse_min_period[0]; +- config->modes[1].format = pulse_fmt[1]; +- config->modes[1].def_period = pulse_def_period[1]; +- config->modes[1].min_period = pulse_min_period[1]; +- +- pulse_unlock(); +- +- params->result = S_OK; +- return STATUS_SUCCESS; +- +-fail: +- pa_context_unref(pulse_ctx); +- pulse_ctx = NULL; +- pa_mainloop_free(pulse_ml); +- pulse_ml = NULL; +- pulse_unlock(); +- params->result = E_FAIL; +- return STATUS_SUCCESS; +-} +- +-static DWORD get_channel_mask(unsigned int channels) +-{ +- switch(channels) { +- case 0: +- return 0; +- case 1: +- return KSAUDIO_SPEAKER_MONO; +- case 2: +- return KSAUDIO_SPEAKER_STEREO; +- case 3: +- return KSAUDIO_SPEAKER_STEREO | SPEAKER_LOW_FREQUENCY; +- case 4: +- return KSAUDIO_SPEAKER_QUAD; /* not _SURROUND */ +- case 5: +- return KSAUDIO_SPEAKER_QUAD | SPEAKER_LOW_FREQUENCY; +- case 6: +- return KSAUDIO_SPEAKER_5POINT1; /* not 5POINT1_SURROUND */ +- case 7: +- return KSAUDIO_SPEAKER_5POINT1 | SPEAKER_BACK_CENTER; +- case 8: +- return KSAUDIO_SPEAKER_7POINT1_SURROUND; /* Vista deprecates 7POINT1 */ +- } +- FIXME("Unknown speaker configuration: %u\n", channels); +- return 0; +-} +- +-static const enum pa_channel_position pulse_pos_from_wfx[] = { +- 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_FRONT_LEFT_OF_CENTER, +- PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, +- PA_CHANNEL_POSITION_REAR_CENTER, +- PA_CHANNEL_POSITION_SIDE_LEFT, +- PA_CHANNEL_POSITION_SIDE_RIGHT, +- PA_CHANNEL_POSITION_TOP_CENTER, +- PA_CHANNEL_POSITION_TOP_FRONT_LEFT, +- PA_CHANNEL_POSITION_TOP_FRONT_CENTER, +- PA_CHANNEL_POSITION_TOP_FRONT_RIGHT, +- PA_CHANNEL_POSITION_TOP_REAR_LEFT, +- PA_CHANNEL_POSITION_TOP_REAR_CENTER, +- PA_CHANNEL_POSITION_TOP_REAR_RIGHT +-}; +- +-static HRESULT pulse_spec_from_waveformat(struct pulse_stream *stream, const WAVEFORMATEX *fmt) +-{ +- pa_channel_map_init(&stream->map); +- stream->ss.rate = fmt->nSamplesPerSec; +- stream->ss.format = PA_SAMPLE_INVALID; +- +- switch(fmt->wFormatTag) { +- case WAVE_FORMAT_IEEE_FLOAT: +- if (!fmt->nChannels || fmt->nChannels > 2 || fmt->wBitsPerSample != 32) +- break; +- stream->ss.format = PA_SAMPLE_FLOAT32LE; +- pa_channel_map_init_auto(&stream->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); +- break; +- case WAVE_FORMAT_PCM: +- if (!fmt->nChannels || fmt->nChannels > 2) +- break; +- if (fmt->wBitsPerSample == 8) +- stream->ss.format = PA_SAMPLE_U8; +- else if (fmt->wBitsPerSample == 16) +- stream->ss.format = PA_SAMPLE_S16LE; +- else +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- pa_channel_map_init_auto(&stream->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); +- break; +- case WAVE_FORMAT_EXTENSIBLE: { +- WAVEFORMATEXTENSIBLE *wfe = (WAVEFORMATEXTENSIBLE*)fmt; +- DWORD mask = wfe->dwChannelMask; +- DWORD i = 0, j; +- if (fmt->cbSize != (sizeof(*wfe) - sizeof(*fmt)) && fmt->cbSize != sizeof(*wfe)) +- break; +- if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) && +- (!wfe->Samples.wValidBitsPerSample || wfe->Samples.wValidBitsPerSample == 32) && +- fmt->wBitsPerSample == 32) +- stream->ss.format = PA_SAMPLE_FLOAT32LE; +- else if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)) { +- DWORD valid = wfe->Samples.wValidBitsPerSample; +- if (!valid) +- valid = fmt->wBitsPerSample; +- if (!valid || valid > fmt->wBitsPerSample) +- break; +- switch (fmt->wBitsPerSample) { +- case 8: +- if (valid == 8) +- stream->ss.format = PA_SAMPLE_U8; +- break; +- case 16: +- if (valid == 16) +- stream->ss.format = PA_SAMPLE_S16LE; +- break; +- case 24: +- if (valid == 24) +- stream->ss.format = PA_SAMPLE_S24LE; +- break; +- case 32: +- if (valid == 24) +- stream->ss.format = PA_SAMPLE_S24_32LE; +- else if (valid == 32) +- stream->ss.format = PA_SAMPLE_S32LE; +- break; +- default: +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- } +- stream->map.channels = fmt->nChannels; +- if (!mask || (mask & (SPEAKER_ALL|SPEAKER_RESERVED))) +- mask = get_channel_mask(fmt->nChannels); +- for (j = 0; j < ARRAY_SIZE(pulse_pos_from_wfx) && i < fmt->nChannels; ++j) { +- if (mask & (1 << j)) +- stream->map.map[i++] = pulse_pos_from_wfx[j]; +- } +- +- /* Special case for mono since pulse appears to map it differently */ +- if (mask == SPEAKER_FRONT_CENTER) +- stream->map.map[0] = PA_CHANNEL_POSITION_MONO; +- +- if (i < fmt->nChannels || (mask & SPEAKER_RESERVED)) { +- stream->map.channels = 0; +- ERR("Invalid channel mask: %i/%i and %x(%x)\n", i, fmt->nChannels, mask, wfe->dwChannelMask); +- break; +- } +- break; +- } +- case WAVE_FORMAT_ALAW: +- case WAVE_FORMAT_MULAW: +- if (fmt->wBitsPerSample != 8) { +- FIXME("Unsupported bpp %u for LAW\n", fmt->wBitsPerSample); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- if (fmt->nChannels != 1 && fmt->nChannels != 2) { +- FIXME("Unsupported channels %u for LAW\n", fmt->nChannels); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- stream->ss.format = fmt->wFormatTag == WAVE_FORMAT_MULAW ? PA_SAMPLE_ULAW : PA_SAMPLE_ALAW; +- pa_channel_map_init_auto(&stream->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); +- break; +- default: +- WARN("Unhandled tag %x\n", fmt->wFormatTag); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- stream->ss.channels = stream->map.channels; +- if (!pa_channel_map_valid(&stream->map) || stream->ss.format == PA_SAMPLE_INVALID) { +- ERR("Invalid format! Channel spec valid: %i, format: %i\n", +- pa_channel_map_valid(&stream->map), stream->ss.format); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- return S_OK; +-} +- +-static HRESULT pulse_stream_connect(struct pulse_stream *stream, UINT32 period_bytes) +-{ +- int ret; +- char buffer[64]; +- static LONG number; +- pa_buffer_attr attr; +- +- ret = InterlockedIncrement(&number); +- sprintf(buffer, "audio stream #%i", ret); +- stream->stream = pa_stream_new(pulse_ctx, buffer, &stream->ss, &stream->map); +- +- if (!stream->stream) { +- WARN("pa_stream_new returned error %i\n", pa_context_errno(pulse_ctx)); +- return AUDCLNT_E_ENDPOINT_CREATE_FAILED; +- } +- +- pa_stream_set_state_callback(stream->stream, pulse_stream_state, stream); +- pa_stream_set_buffer_attr_callback(stream->stream, pulse_attr_update, stream); +- pa_stream_set_moved_callback(stream->stream, pulse_attr_update, stream); +- +- /* PulseAudio will fill in correct values */ +- attr.minreq = attr.fragsize = period_bytes; +- attr.tlength = period_bytes * 3; +- attr.maxlength = stream->bufsize_frames * pa_frame_size(&stream->ss); +- attr.prebuf = pa_frame_size(&stream->ss); +- dump_attr(&attr); +- if (stream->dataflow == eRender) +- ret = pa_stream_connect_playback(stream->stream, NULL, &attr, +- PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_ADJUST_LATENCY, NULL, NULL); +- else +- ret = pa_stream_connect_record(stream->stream, NULL, &attr, +- PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_ADJUST_LATENCY); +- if (ret < 0) { +- WARN("Returns %i\n", ret); +- return AUDCLNT_E_ENDPOINT_CREATE_FAILED; +- } +- while (pa_stream_get_state(stream->stream) == PA_STREAM_CREATING) +- pulse_cond_wait(); +- if (pa_stream_get_state(stream->stream) != PA_STREAM_READY) +- return AUDCLNT_E_ENDPOINT_CREATE_FAILED; +- +- if (stream->dataflow == eRender) { +- pa_stream_set_underflow_callback(stream->stream, pulse_underflow_callback, stream); +- pa_stream_set_started_callback(stream->stream, pulse_started_callback, stream); +- } +- return S_OK; +-} +- +-static NTSTATUS pulse_create_stream(void *args) +-{ +- struct create_stream_params *params = args; +- REFERENCE_TIME period, duration = params->duration; +- struct pulse_stream *stream; +- unsigned int i, bufsize_bytes; +- HRESULT hr; +- +- pulse_lock(); +- +- if (FAILED(params->result = pulse_connect(params->name))) +- { +- pulse_unlock(); +- return STATUS_SUCCESS; +- } +- +- if (!(stream = calloc(1, sizeof(*stream)))) +- { +- pulse_unlock(); +- params->result = E_OUTOFMEMORY; +- return STATUS_SUCCESS; +- } +- +- stream->dataflow = params->dataflow; +- for (i = 0; i < ARRAY_SIZE(stream->vol); ++i) +- stream->vol[i] = 1.f; +- +- hr = pulse_spec_from_waveformat(stream, params->fmt); +- TRACE("Obtaining format returns %08x\n", hr); +- +- if (FAILED(hr)) +- goto exit; +- +- period = pulse_def_period[stream->dataflow == eCapture]; +- if (duration < 3 * period) +- duration = 3 * period; +- +- stream->period_bytes = pa_frame_size(&stream->ss) * muldiv(period, stream->ss.rate, 10000000); +- +- stream->bufsize_frames = ceil((duration / 10000000.) * params->fmt->nSamplesPerSec); +- bufsize_bytes = stream->bufsize_frames * pa_frame_size(&stream->ss); +- stream->mmdev_period_usec = period / 10; +- +- stream->share = params->mode; +- stream->flags = params->flags; +- hr = pulse_stream_connect(stream, stream->period_bytes); +- if (SUCCEEDED(hr)) { +- UINT32 unalign; +- const pa_buffer_attr *attr = pa_stream_get_buffer_attr(stream->stream); +- stream->attr = *attr; +- /* Update frames according to new size */ +- dump_attr(attr); +- if (stream->dataflow == eRender) { +- stream->alloc_size = stream->real_bufsize_bytes = +- stream->bufsize_frames * 2 * pa_frame_size(&stream->ss); +- if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, +- 0, &stream->real_bufsize_bytes, MEM_COMMIT, PAGE_READWRITE)) +- hr = E_OUTOFMEMORY; +- } else { +- UINT32 i, capture_packets; +- +- if ((unalign = bufsize_bytes % stream->period_bytes)) +- bufsize_bytes += stream->period_bytes - unalign; +- stream->bufsize_frames = bufsize_bytes / pa_frame_size(&stream->ss); +- stream->real_bufsize_bytes = bufsize_bytes; +- +- capture_packets = stream->real_bufsize_bytes / stream->period_bytes; +- +- stream->alloc_size = stream->real_bufsize_bytes + capture_packets * sizeof(ACPacket); +- if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, +- 0, &stream->alloc_size, MEM_COMMIT, PAGE_READWRITE)) +- hr = E_OUTOFMEMORY; +- else { +- ACPacket *cur_packet = (ACPacket*)((char*)stream->local_buffer + stream->real_bufsize_bytes); +- BYTE *data = stream->local_buffer; +- silence_buffer(stream->ss.format, stream->local_buffer, stream->real_bufsize_bytes); +- list_init(&stream->packet_free_head); +- list_init(&stream->packet_filled_head); +- for (i = 0; i < capture_packets; ++i, ++cur_packet) { +- list_add_tail(&stream->packet_free_head, &cur_packet->entry); +- cur_packet->data = data; +- data += stream->period_bytes; +- } +- } +- } +- } +- +- *params->channel_count = stream->ss.channels; +- *params->stream = stream; +- +-exit: +- if (FAILED(params->result = hr)) { +- free(stream->local_buffer); +- if (stream->stream) { +- pa_stream_disconnect(stream->stream); +- pa_stream_unref(stream->stream); +- free(stream); +- } +- } +- +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_release_stream(void *args) +-{ +- struct release_stream_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- if(params->timer) { +- stream->please_quit = TRUE; +- NtWaitForSingleObject(params->timer, FALSE, NULL); +- NtClose(params->timer); +- } +- +- pulse_lock(); +- if (PA_STREAM_IS_GOOD(pa_stream_get_state(stream->stream))) { +- pa_stream_disconnect(stream->stream); +- while (PA_STREAM_IS_GOOD(pa_stream_get_state(stream->stream))) +- pulse_cond_wait(); +- } +- pa_stream_unref(stream->stream); +- pulse_unlock(); +- +- if (stream->tmp_buffer) +- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, +- &stream->tmp_buffer_bytes, MEM_RELEASE); +- if (stream->local_buffer) +- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, +- &stream->alloc_size, MEM_RELEASE); +- free(stream->peek_buffer); +- free(stream); +- return STATUS_SUCCESS; +-} +- +-static int write_buffer(const struct pulse_stream *stream, BYTE *buffer, UINT32 bytes) +-{ +- const float *vol = stream->vol; +- UINT32 i, channels, mute = 0; +- BOOL adjust = FALSE; +- BYTE *end; +- +- if (!bytes) return 0; +- +- /* Adjust the buffer based on the volume for each channel */ +- channels = stream->ss.channels; +- for (i = 0; i < channels; i++) +- { +- adjust |= vol[i] != 1.0f; +- if (vol[i] == 0.0f) +- mute++; +- } +- if (mute == channels) +- { +- silence_buffer(stream->ss.format, buffer, bytes); +- goto write; +- } +- if (!adjust) goto write; +- +- end = buffer + bytes; +- switch (stream->ss.format) +- { +-#ifndef WORDS_BIGENDIAN +-#define PROCESS_BUFFER(type) do \ +-{ \ +- type *p = (type*)buffer; \ +- do \ +- { \ +- for (i = 0; i < channels; i++) \ +- p[i] = p[i] * vol[i]; \ +- p += i; \ +- } while ((BYTE*)p != end); \ +-} while (0) +- case PA_SAMPLE_S16LE: +- PROCESS_BUFFER(INT16); +- break; +- case PA_SAMPLE_S32LE: +- PROCESS_BUFFER(INT32); +- break; +- case PA_SAMPLE_FLOAT32LE: +- PROCESS_BUFFER(float); +- break; +-#undef PROCESS_BUFFER +- case PA_SAMPLE_S24_32LE: +- { +- UINT32 *p = (UINT32*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- { +- p[i] = (INT32)((INT32)(p[i] << 8) * vol[i]); +- p[i] >>= 8; +- } +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- case PA_SAMPLE_S24LE: +- { +- /* do it 12 bytes at a time until it is no longer possible */ +- UINT32 *q = (UINT32*)buffer; +- BYTE *p; +- +- i = 0; +- while (end - (BYTE*)q >= 12) +- { +- UINT32 v[4], k; +- v[0] = q[0] << 8; +- v[1] = q[1] << 16 | (q[0] >> 16 & ~0xff); +- v[2] = q[2] << 24 | (q[1] >> 8 & ~0xff); +- v[3] = q[2] & ~0xff; +- for (k = 0; k < 4; k++) +- { +- v[k] = (INT32)((INT32)v[k] * vol[i]); +- if (++i == channels) i = 0; +- } +- *q++ = v[0] >> 8 | (v[1] & ~0xff) << 16; +- *q++ = v[1] >> 16 | (v[2] & ~0xff) << 8; +- *q++ = v[2] >> 24 | (v[3] & ~0xff); +- } +- p = (BYTE*)q; +- while (p != end) +- { +- UINT32 v = (INT32)((INT32)(p[0] << 8 | p[1] << 16 | p[2] << 24) * vol[i]); +- *p++ = v >> 8 & 0xff; +- *p++ = v >> 16 & 0xff; +- *p++ = v >> 24; +- if (++i == channels) i = 0; +- } +- break; +- } +-#endif +- case PA_SAMPLE_U8: +- { +- UINT8 *p = (UINT8*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- p[i] = (int)((p[i] - 128) * vol[i]) + 128; +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- case PA_SAMPLE_ALAW: +- { +- UINT8 *p = (UINT8*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- p[i] = mult_alaw_sample(p[i], vol[i]); +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- case PA_SAMPLE_ULAW: +- { +- UINT8 *p = (UINT8*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- p[i] = mult_ulaw_sample(p[i], vol[i]); +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- default: +- TRACE("Unhandled format %i, not adjusting volume.\n", stream->ss.format); +- break; +- } +- +-write: +- return pa_stream_write(stream->stream, buffer, bytes, NULL, 0, PA_SEEK_RELATIVE); +-} +- +-static void pulse_write(struct pulse_stream *stream) +-{ +- /* write as much data to PA as we can */ +- UINT32 to_write; +- BYTE *buf = stream->local_buffer + stream->pa_offs_bytes; +- UINT32 bytes = pa_stream_writable_size(stream->stream); +- +- if (stream->just_underran) +- { +- /* prebuffer with silence if needed */ +- if(stream->pa_held_bytes < bytes){ +- to_write = bytes - stream->pa_held_bytes; +- TRACE("prebuffering %u frames of silence\n", +- (int)(to_write / pa_frame_size(&stream->ss))); +- buf = calloc(1, to_write); +- pa_stream_write(stream->stream, buf, to_write, NULL, 0, PA_SEEK_RELATIVE); +- free(buf); +- } +- +- stream->just_underran = FALSE; +- } +- +- buf = stream->local_buffer + stream->pa_offs_bytes; +- TRACE("held: %lu, avail: %u\n", stream->pa_held_bytes, bytes); +- bytes = min(stream->pa_held_bytes, bytes); +- +- if (stream->pa_offs_bytes + bytes > stream->real_bufsize_bytes) +- { +- to_write = stream->real_bufsize_bytes - stream->pa_offs_bytes; +- TRACE("writing small chunk of %u bytes\n", to_write); +- write_buffer(stream, buf, to_write); +- stream->pa_held_bytes -= to_write; +- to_write = bytes - to_write; +- stream->pa_offs_bytes = 0; +- buf = stream->local_buffer; +- } +- else +- to_write = bytes; +- +- TRACE("writing main chunk of %u bytes\n", to_write); +- write_buffer(stream, buf, to_write); +- stream->pa_offs_bytes += to_write; +- stream->pa_offs_bytes %= stream->real_bufsize_bytes; +- stream->pa_held_bytes -= to_write; +-} +- +-static void pulse_read(struct pulse_stream *stream) +-{ +- size_t bytes = pa_stream_readable_size(stream->stream); +- +- TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(stream->stream)->fragsize); +- +- bytes += stream->peek_len - stream->peek_ofs; +- +- while (bytes >= stream->period_bytes) +- { +- BYTE *dst = NULL, *src; +- size_t src_len, copy, rem = stream->period_bytes; +- +- if (stream->started) +- { +- LARGE_INTEGER stamp, freq; +- ACPacket *p, *next; +- +- if (!(p = (ACPacket*)list_head(&stream->packet_free_head))) +- { +- p = (ACPacket*)list_head(&stream->packet_filled_head); +- if (!p) return; +- if (!p->discont) { +- next = (ACPacket*)p->entry.next; +- next->discont = 1; +- } else +- p = (ACPacket*)list_tail(&stream->packet_filled_head); +- } +- else +- { +- stream->held_bytes += stream->period_bytes; +- } +- NtQueryPerformanceCounter(&stamp, &freq); +- p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; +- p->discont = 0; +- list_remove(&p->entry); +- list_add_tail(&stream->packet_filled_head, &p->entry); +- +- dst = p->data; +- } +- +- while (rem) +- { +- if (stream->peek_len) +- { +- copy = min(rem, stream->peek_len - stream->peek_ofs); +- +- if (dst) +- { +- memcpy(dst, stream->peek_buffer + stream->peek_ofs, copy); +- dst += copy; +- } +- +- rem -= copy; +- stream->peek_ofs += copy; +- if(stream->peek_len == stream->peek_ofs) +- stream->peek_len = stream->peek_ofs = 0; +- +- } +- else if (pa_stream_peek(stream->stream, (const void**)&src, &src_len) == 0 && src_len) +- { +- copy = min(rem, src_len); +- +- if (dst) { +- if(src) +- memcpy(dst, src, copy); +- else +- silence_buffer(stream->ss.format, dst, copy); +- +- dst += copy; +- } +- +- rem -= copy; +- +- if (copy < src_len) +- { +- if (src_len > stream->peek_buffer_len) +- { +- free(stream->peek_buffer); +- stream->peek_buffer = malloc(src_len); +- stream->peek_buffer_len = src_len; +- } +- +- if(src) +- memcpy(stream->peek_buffer, src + copy, src_len - copy); +- else +- silence_buffer(stream->ss.format, stream->peek_buffer, src_len - copy); +- +- stream->peek_len = src_len - copy; +- stream->peek_ofs = 0; +- } +- +- pa_stream_drop(stream->stream); +- } +- } +- +- bytes -= stream->period_bytes; +- } +-} +- +-static NTSTATUS pulse_timer_loop(void *args) +-{ +- struct timer_loop_params *params = args; +- struct pulse_stream *stream = params->stream; +- LARGE_INTEGER delay; +- UINT32 adv_bytes; +- int success; +- pa_operation *o; +- +- pulse_lock(); +- delay.QuadPart = -stream->mmdev_period_usec * 10; +- pa_stream_get_time(stream->stream, &stream->last_time); +- pulse_unlock(); +- +- while (!stream->please_quit) +- { +- pa_usec_t now, adv_usec = 0; +- int err; +- +- NtDelayExecution(FALSE, &delay); +- +- pulse_lock(); +- +- delay.QuadPart = -stream->mmdev_period_usec * 10; +- +- o = pa_stream_update_timing_info(stream->stream, pulse_op_cb, &success); +- if (o) +- { +- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- err = pa_stream_get_time(stream->stream, &now); +- if (err == 0) +- { +- TRACE("got now: %s, last time: %s\n", wine_dbgstr_longlong(now), wine_dbgstr_longlong(stream->last_time)); +- if (stream->started && (stream->dataflow == eCapture || stream->held_bytes)) +- { +- if(stream->just_underran) +- { +- stream->last_time = now; +- stream->just_started = TRUE; +- } +- +- if (stream->just_started) +- { +- /* let it play out a period to absorb some latency and get accurate timing */ +- pa_usec_t diff = now - stream->last_time; +- +- if (diff > stream->mmdev_period_usec) +- { +- stream->just_started = FALSE; +- stream->last_time = now; +- } +- } +- else +- { +- INT32 adjust = stream->last_time + stream->mmdev_period_usec - now; +- +- adv_usec = now - stream->last_time; +- +- if(adjust > ((INT32)(stream->mmdev_period_usec / 2))) +- adjust = stream->mmdev_period_usec / 2; +- else if(adjust < -((INT32)(stream->mmdev_period_usec / 2))) +- adjust = -1 * stream->mmdev_period_usec / 2; +- +- delay.QuadPart = -(stream->mmdev_period_usec + adjust) * 10; +- +- stream->last_time += stream->mmdev_period_usec; +- } +- +- if (stream->dataflow == eRender) +- { +- pulse_write(stream); +- +- /* regardless of what PA does, advance one period */ +- adv_bytes = min(stream->period_bytes, stream->held_bytes); +- stream->lcl_offs_bytes += adv_bytes; +- stream->lcl_offs_bytes %= stream->real_bufsize_bytes; +- stream->held_bytes -= adv_bytes; +- } +- else if(stream->dataflow == eCapture) +- { +- pulse_read(stream); +- } +- } +- else +- { +- stream->last_time = now; +- delay.QuadPart = -stream->mmdev_period_usec * 10; +- } +- } +- +- if (stream->event) +- NtSetEvent(stream->event, NULL); +- +- TRACE("%p after update, adv usec: %d, held: %u, delay usec: %u\n", +- stream, (int)adv_usec, +- (int)(stream->held_bytes/ pa_frame_size(&stream->ss)), +- (unsigned int)(-delay.QuadPart / 10)); +- +- pulse_unlock(); +- } +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_start(void *args) +-{ +- struct start_params *params = args; +- struct pulse_stream *stream = params->stream; +- int success; +- pa_operation *o; +- +- params->result = S_OK; +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +- } +- +- if ((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_EVENTHANDLE_NOT_SET; +- return STATUS_SUCCESS; +- } +- +- if (stream->started) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_NOT_STOPPED; +- return STATUS_SUCCESS; +- } +- +- pulse_write(stream); +- +- if (pa_stream_is_corked(stream->stream)) +- { +- o = pa_stream_cork(stream->stream, 0, pulse_op_cb, &success); +- if (o) +- { +- while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- else +- success = 0; +- if (!success) +- params->result = E_FAIL; +- } +- +- if (SUCCEEDED(params->result)) +- { +- stream->started = TRUE; +- stream->just_started = TRUE; +- } +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_stop(void *args) +-{ +- struct stop_params *params = args; +- struct pulse_stream *stream = params->stream; +- pa_operation *o; +- int success; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (!stream->started) +- { +- pulse_unlock(); +- params->result = S_FALSE; +- return STATUS_SUCCESS; +- } +- +- params->result = S_OK; +- if (stream->dataflow == eRender) +- { +- o = pa_stream_cork(stream->stream, 1, pulse_op_cb, &success); +- if (o) +- { +- while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- else +- success = 0; +- if (!success) +- params->result = E_FAIL; +- } +- if (SUCCEEDED(params->result)) +- stream->started = FALSE; +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_reset(void *args) +-{ +- struct reset_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (stream->started) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_NOT_STOPPED; +- return STATUS_SUCCESS; +- } +- +- if (stream->locked) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_BUFFER_OPERATION_PENDING; +- return STATUS_SUCCESS; +- } +- +- if (stream->dataflow == eRender) +- { +- /* If there is still data in the render buffer it needs to be removed from the server */ +- int success = 0; +- if (stream->held_bytes) +- { +- pa_operation *o = pa_stream_flush(stream->stream, pulse_op_cb, &success); +- if (o) +- { +- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- } +- if (success || !stream->held_bytes) +- { +- stream->clock_lastpos = stream->clock_written = 0; +- stream->pa_offs_bytes = stream->lcl_offs_bytes = 0; +- stream->held_bytes = stream->pa_held_bytes = 0; +- } +- } +- else +- { +- ACPacket *p; +- stream->clock_written += stream->held_bytes; +- stream->held_bytes = 0; +- +- if ((p = stream->locked_ptr)) +- { +- stream->locked_ptr = NULL; +- list_add_tail(&stream->packet_free_head, &p->entry); +- } +- list_move_tail(&stream->packet_free_head, &stream->packet_filled_head); +- } +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static BOOL alloc_tmp_buffer(struct pulse_stream *stream, SIZE_T bytes) +-{ +- if (stream->tmp_buffer_bytes >= bytes) +- return TRUE; +- +- if (stream->tmp_buffer) +- { +- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, +- &stream->tmp_buffer_bytes, MEM_RELEASE); +- stream->tmp_buffer = NULL; +- stream->tmp_buffer_bytes = 0; +- } +- if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, +- 0, &bytes, MEM_COMMIT, PAGE_READWRITE)) +- return FALSE; +- +- stream->tmp_buffer_bytes = bytes; +- return TRUE; +-} +- +-static UINT32 pulse_render_padding(struct pulse_stream *stream) +-{ +- return stream->held_bytes / pa_frame_size(&stream->ss); +-} +- +-static UINT32 pulse_capture_padding(struct pulse_stream *stream) +-{ +- ACPacket *packet = stream->locked_ptr; +- if (!packet && !list_empty(&stream->packet_filled_head)) +- { +- packet = (ACPacket*)list_head(&stream->packet_filled_head); +- stream->locked_ptr = packet; +- list_remove(&packet->entry); +- } +- return stream->held_bytes / pa_frame_size(&stream->ss); +-} +- +-static NTSTATUS pulse_get_render_buffer(void *args) +-{ +- struct get_render_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- size_t bytes; +- UINT32 wri_offs_bytes; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (stream->locked) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_OUT_OF_ORDER; +- return STATUS_SUCCESS; +- } +- +- if (!params->frames) +- { +- pulse_unlock(); +- *params->data = NULL; +- params->result = S_OK; +- return STATUS_SUCCESS; +- } +- +- if (stream->held_bytes / pa_frame_size(&stream->ss) + params->frames > stream->bufsize_frames) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_BUFFER_TOO_LARGE; +- return STATUS_SUCCESS; +- } +- +- bytes = params->frames * pa_frame_size(&stream->ss); +- wri_offs_bytes = (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes; +- if (wri_offs_bytes + bytes > stream->real_bufsize_bytes) +- { +- if (!alloc_tmp_buffer(stream, bytes)) +- { +- pulse_unlock(); +- params->result = E_OUTOFMEMORY; +- return STATUS_SUCCESS; +- } +- *params->data = stream->tmp_buffer; +- stream->locked = -bytes; +- } +- else +- { +- *params->data = stream->local_buffer + wri_offs_bytes; +- stream->locked = bytes; +- } +- +- silence_buffer(stream->ss.format, *params->data, bytes); +- +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static void pulse_wrap_buffer(struct pulse_stream *stream, BYTE *buffer, UINT32 written_bytes) +-{ +- UINT32 wri_offs_bytes = (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes; +- UINT32 chunk_bytes = stream->real_bufsize_bytes - wri_offs_bytes; +- +- if (written_bytes <= chunk_bytes) +- { +- memcpy(stream->local_buffer + wri_offs_bytes, buffer, written_bytes); +- } +- else +- { +- memcpy(stream->local_buffer + wri_offs_bytes, buffer, chunk_bytes); +- memcpy(stream->local_buffer, buffer + chunk_bytes, written_bytes - chunk_bytes); +- } +-} +- +-static NTSTATUS pulse_release_render_buffer(void *args) +-{ +- struct release_render_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- UINT32 written_bytes; +- BYTE *buffer; +- +- pulse_lock(); +- if (!stream->locked || !params->written_frames) +- { +- stream->locked = 0; +- pulse_unlock(); +- params->result = params->written_frames ? AUDCLNT_E_OUT_OF_ORDER : S_OK; +- return STATUS_SUCCESS; +- } +- +- if (params->written_frames * pa_frame_size(&stream->ss) > +- (stream->locked >= 0 ? stream->locked : -stream->locked)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_INVALID_SIZE; +- return STATUS_SUCCESS; +- } +- +- if (stream->locked >= 0) +- buffer = stream->local_buffer + (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes; +- else +- buffer = stream->tmp_buffer; +- +- written_bytes = params->written_frames * pa_frame_size(&stream->ss); +- if (params->flags & AUDCLNT_BUFFERFLAGS_SILENT) +- silence_buffer(stream->ss.format, buffer, written_bytes); +- +- if (stream->locked < 0) +- pulse_wrap_buffer(stream, buffer, written_bytes); +- +- stream->held_bytes += written_bytes; +- stream->pa_held_bytes += written_bytes; +- if (stream->pa_held_bytes > stream->real_bufsize_bytes) +- { +- stream->pa_offs_bytes += stream->pa_held_bytes - stream->real_bufsize_bytes; +- stream->pa_offs_bytes %= stream->real_bufsize_bytes; +- stream->pa_held_bytes = stream->real_bufsize_bytes; +- } +- stream->clock_written += written_bytes; +- stream->locked = 0; +- +- TRACE("Released %u, held %lu\n", params->written_frames, stream->held_bytes / pa_frame_size(&stream->ss)); +- +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_capture_buffer(void *args) +-{ +- struct get_capture_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- ACPacket *packet; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- if (stream->locked) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_OUT_OF_ORDER; +- return STATUS_SUCCESS; +- } +- +- pulse_capture_padding(stream); +- if ((packet = stream->locked_ptr)) +- { +- *params->frames = stream->period_bytes / pa_frame_size(&stream->ss); +- *params->flags = 0; +- if (packet->discont) +- *params->flags |= AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY; +- if (params->devpos) +- { +- if (packet->discont) +- *params->devpos = (stream->clock_written + stream->period_bytes) / pa_frame_size(&stream->ss); +- else +- *params->devpos = stream->clock_written / pa_frame_size(&stream->ss); +- } +- if (params->qpcpos) +- *params->qpcpos = packet->qpcpos; +- *params->data = packet->data; +- } +- else +- *params->frames = 0; +- stream->locked = *params->frames; +- pulse_unlock(); +- params->result = *params->frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_release_capture_buffer(void *args) +-{ +- struct release_capture_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!stream->locked && params->done) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_OUT_OF_ORDER; +- return STATUS_SUCCESS; +- } +- if (params->done && stream->locked != params->done) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_INVALID_SIZE; +- return STATUS_SUCCESS; +- } +- if (params->done) +- { +- ACPacket *packet = stream->locked_ptr; +- stream->locked_ptr = NULL; +- stream->held_bytes -= stream->period_bytes; +- if (packet->discont) +- stream->clock_written += 2 * stream->period_bytes; +- else +- stream->clock_written += stream->period_bytes; +- list_add_tail(&stream->packet_free_head, &packet->entry); +- } +- stream->locked = 0; +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_buffer_size(void *args) +-{ +- struct get_buffer_size_params *params = args; +- +- params->result = S_OK; +- +- pulse_lock(); +- if (!pulse_stream_valid(params->stream)) +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- else +- *params->size = params->stream->bufsize_frames; +- pulse_unlock(); +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_latency(void *args) +-{ +- struct get_latency_params *params = args; +- struct pulse_stream *stream = params->stream; +- const pa_buffer_attr *attr; +- REFERENCE_TIME lat; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- attr = pa_stream_get_buffer_attr(stream->stream); +- if (stream->dataflow == eRender) +- lat = attr->minreq / pa_frame_size(&stream->ss); +- else +- lat = attr->fragsize / pa_frame_size(&stream->ss); +- *params->latency = (lat * 10000000) / stream->ss.rate + pulse_def_period[0]; +- pulse_unlock(); +- TRACE("Latency: %u ms\n", (DWORD)(*params->latency / 10000)); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_current_padding(void *args) +-{ +- struct get_current_padding_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (stream->dataflow == eRender) +- *params->padding = pulse_render_padding(stream); +- else +- *params->padding = pulse_capture_padding(stream); +- pulse_unlock(); +- +- TRACE("%p Pad: %u ms (%u)\n", stream, muldiv(*params->padding, 1000, stream->ss.rate), +- *params->padding); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_next_packet_size(void *args) +-{ +- struct get_next_packet_size_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- pulse_capture_padding(stream); +- if (stream->locked_ptr) +- *params->frames = stream->period_bytes / pa_frame_size(&stream->ss); +- else +- *params->frames = 0; +- pulse_unlock(); +- params->result = S_OK; +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_frequency(void *args) +-{ +- struct get_frequency_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- *params->freq = stream->ss.rate; +- if (stream->share == AUDCLNT_SHAREMODE_SHARED) +- *params->freq *= pa_frame_size(&stream->ss); +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_position(void *args) +-{ +- struct get_position_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- *params->pos = stream->clock_written - stream->held_bytes; +- +- if (stream->share == AUDCLNT_SHAREMODE_EXCLUSIVE || params->device) +- *params->pos /= pa_frame_size(&stream->ss); +- +- /* Make time never go backwards */ +- if (*params->pos < stream->clock_lastpos) +- *params->pos = stream->clock_lastpos; +- else +- stream->clock_lastpos = *params->pos; +- pulse_unlock(); +- +- TRACE("%p Position: %u\n", stream, (unsigned)*params->pos); +- +- if (params->qpctime) +- { +- LARGE_INTEGER stamp, freq; +- NtQueryPerformanceCounter(&stamp, &freq); +- *params->qpctime = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; +- } +- +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_set_volumes(void *args) +-{ +- struct set_volumes_params *params = args; +- struct pulse_stream *stream = params->stream; +- unsigned int i; +- +- for (i = 0; i < stream->ss.channels; i++) +- stream->vol[i] = params->volumes[i] * params->master_volume * params->session_volumes[i]; +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_set_event_handle(void *args) +-{ +- struct set_event_handle_params *params = args; +- struct pulse_stream *stream = params->stream; +- HRESULT hr = S_OK; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- hr = AUDCLNT_E_DEVICE_INVALIDATED; +- else if (!(stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) +- hr = AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED; +- else if (stream->event) +- hr = HRESULT_FROM_WIN32(ERROR_INVALID_NAME); +- else +- stream->event = params->event; +- pulse_unlock(); +- +- params->result = hr; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_is_started(void *args) +-{ +- struct is_started_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- params->started = pulse_stream_valid(stream) && stream->started; +- pulse_unlock(); +- +- return STATUS_SUCCESS; +-} +- +-static const unixlib_entry_t unix_funcs[] = +-{ +- pulse_main_loop, +- pulse_create_stream, +- pulse_release_stream, +- pulse_start, +- pulse_stop, +- pulse_reset, +- pulse_timer_loop, +- pulse_get_render_buffer, +- pulse_release_render_buffer, +- pulse_get_capture_buffer, +- pulse_release_capture_buffer, +- pulse_get_buffer_size, +- pulse_get_latency, +- pulse_get_current_padding, +- pulse_get_next_packet_size, +- pulse_get_frequency, +- pulse_get_position, +- pulse_set_volumes, +- pulse_set_event_handle, +- pulse_test_connect, +- pulse_is_started, +-}; +- +-NTSTATUS CDECL __wine_init_unix_lib(HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out) +-{ +- pthread_mutexattr_t attr; +- +- switch (reason) +- { +- case DLL_PROCESS_ATTACH: +- pthread_mutexattr_init(&attr); +- pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); +- +- if (pthread_mutex_init(&pulse_mutex, &attr) != 0) +- pthread_mutex_init(&pulse_mutex, NULL); +- +- *(UINT64 *)ptr_out = (UINT_PTR)&unix_funcs; +- break; +- case DLL_PROCESS_DETACH: +- if (pulse_ctx) +- { +- pa_context_disconnect(pulse_ctx); +- pa_context_unref(pulse_ctx); +- } +- if (pulse_ml) +- pa_mainloop_quit(pulse_ml, 0); +- +- } +- +- return STATUS_SUCCESS; +-} +diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h +deleted file mode 100644 +index 9e7af57b716e8d3edc4793ead64b35d4993a4a94..0000000000000000000000000000000000000000 +--- a/dlls/winepulse.drv/unixlib.h ++++ /dev/null +@@ -1,211 +0,0 @@ +-/* +- * Copyright 2021 Jacek Caban for CodeWeavers +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 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 +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +- */ +- +-#include "wine/list.h" +- +-struct pulse_stream; +- +-struct pulse_config +-{ +- struct +- { +- WAVEFORMATEXTENSIBLE format; +- REFERENCE_TIME def_period; +- REFERENCE_TIME min_period; +- } modes[2]; +- unsigned int speakers_mask; +-}; +- +-struct main_loop_params +-{ +- HANDLE event; +-}; +- +-struct create_stream_params +-{ +- const char *name; +- EDataFlow dataflow; +- AUDCLNT_SHAREMODE mode; +- DWORD flags; +- REFERENCE_TIME duration; +- const WAVEFORMATEX *fmt; +- HRESULT result; +- UINT32 *channel_count; +- struct pulse_stream **stream; +-}; +- +-struct release_stream_params +-{ +- struct pulse_stream *stream; +- HANDLE timer; +- HRESULT result; +-}; +- +-struct start_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +-}; +- +-struct stop_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +-}; +- +-struct reset_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +-}; +- +-struct timer_loop_params +-{ +- struct pulse_stream *stream; +-}; +- +-struct get_render_buffer_params +-{ +- struct pulse_stream *stream; +- UINT32 frames; +- HRESULT result; +- BYTE **data; +-}; +- +-struct release_render_buffer_params +-{ +- struct pulse_stream *stream; +- UINT32 written_frames; +- DWORD flags; +- HRESULT result; +-}; +- +-struct get_capture_buffer_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- BYTE **data; +- UINT32 *frames; +- DWORD *flags; +- UINT64 *devpos; +- UINT64 *qpcpos; +-}; +- +-struct release_capture_buffer_params +-{ +- struct pulse_stream *stream; +- BOOL done; +- HRESULT result; +-}; +- +-struct get_buffer_size_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT32 *size; +-}; +- +-struct get_latency_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- REFERENCE_TIME *latency; +-}; +- +-struct get_current_padding_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT32 *padding; +-}; +- +-struct get_next_packet_size_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT32 *frames; +-}; +- +-struct get_frequency_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT64 *freq; +-}; +- +-struct get_position_params +-{ +- struct pulse_stream *stream; +- BOOL device; +- HRESULT result; +- UINT64 *pos; +- UINT64 *qpctime; +-}; +- +-struct set_volumes_params +-{ +- struct pulse_stream *stream; +- float master_volume; +- const float *volumes; +- const float *session_volumes; +-}; +- +-struct set_event_handle_params +-{ +- struct pulse_stream *stream; +- HANDLE event; +- HRESULT result; +-}; +- +-struct test_connect_params +-{ +- const char *name; +- HRESULT result; +- struct pulse_config *config; +-}; +- +-struct is_started_params +-{ +- struct pulse_stream *stream; +- BOOL started; +-}; +- +-enum unix_funcs +-{ +- main_loop, +- create_stream, +- release_stream, +- start, +- stop, +- reset, +- timer_loop, +- get_render_buffer, +- release_render_buffer, +- get_capture_buffer, +- release_capture_buffer, +- get_buffer_size, +- get_latency, +- get_current_padding, +- get_next_packet_size, +- get_frequency, +- get_position, +- set_volumes, +- set_event_handle, +- test_connect, +- is_started, +-}; +diff --git a/include/audioclient.idl b/include/audioclient.idl +index 754ae58f78c9a014c5990250fa739c711902c819..c69a4116789190bc5ed025dc32176dd8b2081c07 100644 +--- a/include/audioclient.idl ++++ b/include/audioclient.idl +@@ -128,14 +128,6 @@ typedef struct _AudioClientProperties + AUDCLNT_STREAMOPTIONS Options; + } AudioClientProperties; + +-typedef struct _Win8AudioClientProperties +-{ +- UINT32 cbSize; +- BOOL bIsOffload; +- AUDIO_STREAM_CATEGORY eCategory; +- /* Options field added in Win 8.1 */ +-} Win8AudioClientProperties; +- + [ + local, + pointer_default(unique), +-- +2.32.0 + diff --git a/overlays/misc/wine-lowlatency.patch b/overlays/misc/wine/0002-5.14-Latency-Fix.patch similarity index 50% rename from overlays/misc/wine-lowlatency.patch rename to overlays/misc/wine/0002-5.14-Latency-Fix.patch index dfe464f..518538f 100644 --- a/overlays/misc/wine-lowlatency.patch +++ b/overlays/misc/wine/0002-5.14-Latency-Fix.patch @@ -1,18 +1,27 @@ -diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c -index 55579ecda80..6f7ff732135 100644 ---- a/dlls/winepulse.drv/pulse.c -+++ b/dlls/winepulse.drv/pulse.c -@@ -93,9 +93,6 @@ static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2]; - - static UINT g_phys_speakers_mask = 0; +From 4a2c23db4eddd827ac81513af43bc92475ad7d3a Mon Sep 17 00:00:00 2001 +From: Sebastian 'gonX' Jensen +Date: Sun, 20 Jun 2021 17:02:15 +0200 +Subject: [PATCH 2/4] 5.14 Latency Fix + +--- + dlls/winepulse.drv/mmdevdrv.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 07407089ac5af65eb13d6e00b6d0969a61ec5589..3ed47e38c830987e4bcc2e9f5c59c7773fe686f1 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -68,9 +68,6 @@ enum DriverPriority { + Priority_Preferred + }; -static const REFERENCE_TIME MinimumPeriod = 30000; -static const REFERENCE_TIME DefaultPeriod = 100000; - - static pthread_mutex_t pulse_mutex; - static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; + static pa_context *pulse_ctx; + static pa_mainloop *pulse_ml; -@@ -481,11 +478,12 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { +@@ -510,11 +507,12 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { if (length) pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss); @@ -30,10 +39,11 @@ index 55579ecda80..6f7ff732135 100644 wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); -@@ -836,6 +834,13 @@ static NTSTATUS pulse_create_stream(void *args) - if (duration < 3 * period) - duration = 3 * period; - +@@ -1640,6 +1638,14 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + if (duration <= 2 * period) + period /= 2; + } ++ + const char* denv = getenv("STAGING_AUDIO_DURATION"); + if (denv) { + int val = atoi(denv); @@ -41,6 +51,9 @@ index 55579ecda80..6f7ff732135 100644 + printf("Staging audio duration set to %d.\n", val); + } + - stream->period_bytes = pa_frame_size(&stream->ss) * muldiv(period, stream->ss.rate, 10000000); + period_bytes = pa_frame_size(&This->ss) * MulDiv(period, This->ss.rate, 10000000); - stream->bufsize_frames = ceil((duration / 10000000.) * params->fmt->nSamplesPerSec); + if (duration < 20000000) +-- +2.32.0 + diff --git a/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch b/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch new file mode 100644 index 0000000..7800d50 --- /dev/null +++ b/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch @@ -0,0 +1,26 @@ +From e17fb0bda3c042beec05b918e2d171211742e01c Mon Sep 17 00:00:00 2001 +From: Torge Matthies +Date: Fri, 12 Feb 2021 13:58:35 +0100 +Subject: [PATCH 3/4] secur32: Fix crash from invalid context in + InitializeSecurityContextW. + +Signed-off-by: Torge Matthies +--- + dlls/secur32/schannel.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c +index 9c7e98b32a4c55588a78ac6c3811b89db9e09db7..b2baefbc8caaf370c9c0ec31b7daf4cc9bb7fbb8 100644 +--- a/dlls/secur32/schannel.c ++++ b/dlls/secur32/schannel.c +@@ -983,6 +983,7 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW( + unsigned char *ptr; + + ctx = schan_get_object(phContext->dwLower, SCHAN_HANDLE_CTX); ++ if (!ctx) return SEC_E_INVALID_HANDLE; + if (pInput) + { + idx = schan_find_sec_buffer_idx(pInput, 0, SECBUFFER_TOKEN); +-- +2.32.0 + diff --git a/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch b/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch new file mode 100644 index 0000000..22cd561 --- /dev/null +++ b/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch @@ -0,0 +1,87 @@ +From b1ac42097f6f6e038a2e1fac773bc31e829fb891 Mon Sep 17 00:00:00 2001 +From: Torge Matthies +Date: Mon, 5 Apr 2021 05:48:28 +0200 +Subject: [PATCH 4/4] kernelbase: Cache last used locale->sortguid mapping. + +get_language_sort reads from the registry, which is not particularly fast. +Staging's implementation of CompareStringEx calls this function, and if +CompareStringEx is used in a loop over many elements, it will slow down the +application by a lot (> 30 seconds vs a few hundred ms in osu!, depends +on the CPU and the number of installed beatmaps). + +Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50923 +Signed-off-by: Torge Matthies +--- + dlls/kernelbase/locale.c | 42 +++++++++++++++++++++++++++++++++++++++- + 1 file changed, 41 insertions(+), 1 deletion(-) + +diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c +index 89b3577505348a001577ba3549b8af2d1e6cb456..db97383f2858455f8c329f326d4b3f9f3ec606cb 100644 +--- a/dlls/kernelbase/locale.c ++++ b/dlls/kernelbase/locale.c +@@ -619,6 +619,21 @@ static CRITICAL_SECTION_DEBUG critsect_debug = + }; + static CRITICAL_SECTION locale_section = { &critsect_debug, -1, 0, 0, 0, 0 }; + ++static struct ++{ ++ WCHAR locale[LOCALE_NAME_MAX_LENGTH]; /* The locale name */ ++ const struct sortguid *guid; /* The cached associated GUID */ ++} sortguid_cache; ++ ++static CRITICAL_SECTION sortguid_cache_section; ++static CRITICAL_SECTION_DEBUG sortguid_cache_section_debug = ++{ ++ 0, 0, &sortguid_cache_section, ++ { &sortguid_cache_section_debug.ProcessLocksList, &sortguid_cache_section_debug.ProcessLocksList }, ++ 0, 0, { (DWORD_PTR)(__FILE__ ": sortguid_cache_section") } ++}; ++static CRITICAL_SECTION sortguid_cache_section = { &sortguid_cache_section_debug, -1, 0, 0, 0, 0 }; ++ + + static void init_sortkeys( DWORD *ptr ) + { +@@ -656,7 +671,7 @@ static const struct sortguid *find_sortguid( const GUID *guid ) + } + + +-static const struct sortguid *get_language_sort( const WCHAR *locale ) ++static const struct sortguid *get_language_sort_uncached( const WCHAR *locale ) + { + WCHAR *p, *end, buffer[LOCALE_NAME_MAX_LENGTH], guidstr[39]; + const struct sortguid *ret; +@@ -699,6 +714,31 @@ done: + } + + ++static const struct sortguid *get_language_sort( const WCHAR *locale ) ++{ ++ const struct sortguid *ret = NULL; ++ ++ if (!locale) return get_language_sort_uncached( locale ); ++ ++ RtlEnterCriticalSection( &sortguid_cache_section ); ++ ++ if (sortguid_cache.guid && !wcsncmp( sortguid_cache.locale, locale, LOCALE_NAME_MAX_LENGTH )) ++ { ++ ret = sortguid_cache.guid; ++ goto done; ++ } ++ ++ ret = get_language_sort_uncached( locale ); ++ ++ lstrcpynW( sortguid_cache.locale, locale, LOCALE_NAME_MAX_LENGTH ); ++ sortguid_cache.guid = ret; ++ ++done: ++ RtlLeaveCriticalSection( &sortguid_cache_section ); ++ return ret; ++} ++ ++ + static LCID locale_to_lcid( WCHAR *win_name ) + { + WCHAR *p; +-- +2.32.0 + diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix index ce0f2fb..3d0bd38 100644 --- a/overlays/wine-osu.nix +++ b/overlays/wine-osu.nix @@ -1,6 +1,6 @@ self: super: { wine-osu = (super.wineStaging.overrideDerivation(o: { - patches = (o.patches or []) ++ [ ./misc/wine-lowlatency.patch ]; + patches = (o.patches or []) ++ builtins.attrNames (builtins.readDir ./misc/wine); })).override { wineRelease = "staging"; wineBuild = "wineWow"; From 850eb049cdcc66853d620e4d0f5cbaf24a0c8282 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 23 Jun 2021 22:53:47 +0700 Subject: [PATCH 0003/1112] switch back to unstable rebuilds are pain --- flake.lock | 7 ++++--- flake.nix | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 0a1250b..5f307ab 100644 --- a/flake.lock +++ b/flake.lock @@ -23,15 +23,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1624462271, - "narHash": "sha256-bn8TVHKAf66poL0M2v7NiZyoMh/4YhiM2uqw3X2Gt/M=", + "lastModified": 1624271441, + "narHash": "sha256-26QNDCdRE5mPOWYJrPGpVzgrJ3ZxqvWOONfeMsjryz4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "75bd996363cee3a14a3535fff10fb96e19815817", + "rev": "7e567a3d092b7de69cdf5deaeb8d9526de230916", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 86e38f9..6cd5567 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs = { url = "github:NixOS/nixpkgs"; }; + nixpkgs = { url = "github:NixOS/nixpkgs/nixos-unstable"; }; home-manager = { url = "github:LavaDesu/home-manager/xsession-profilePath"; }; secrets = { url = "github:LavaDesu/flakes-secrets"; }; @@ -9,7 +9,7 @@ outputs = inputs: with inputs; let - revCount = "297538"; + revCount = "297098"; base = { config, ... }: { system = { configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; From 1ae26759661b76bb1e1f2d55994956c5e25bf118 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 23 Jun 2021 23:07:51 +0700 Subject: [PATCH 0004/1112] fix --- overlays/wine-osu.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix index 3d0bd38..78be721 100644 --- a/overlays/wine-osu.nix +++ b/overlays/wine-osu.nix @@ -1,6 +1,6 @@ self: super: { wine-osu = (super.wineStaging.overrideDerivation(o: { - patches = (o.patches or []) ++ builtins.attrNames (builtins.readDir ./misc/wine); + patches = (o.patches or []) ++ builtins.map (e: ./misc/wine + ("/" + e)) (builtins.attrNames (builtins.readDir ./misc/wine)); })).override { wineRelease = "staging"; wineBuild = "wineWow"; From 2f58a31d18dca8db119afa9b8e4b02dff90af3dc Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 23 Jun 2021 22:53:47 +0700 Subject: [PATCH 0005/1112] switch back to unstable rebuilds are pain --- flake.lock | 7 ++++--- flake.nix | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 887c732..5f307ab 100644 --- a/flake.lock +++ b/flake.lock @@ -23,15 +23,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1624148921, - "narHash": "sha256-FAhKTXZV67C36hK5lPvZfsFt+QY1QSHYQXwGXqpOChs=", + "lastModified": 1624271441, + "narHash": "sha256-26QNDCdRE5mPOWYJrPGpVzgrJ3ZxqvWOONfeMsjryz4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f2122ea5815648effdd97157c7bf4e9a1a6dbb34", + "rev": "7e567a3d092b7de69cdf5deaeb8d9526de230916", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index a2ad8b4..6cd5567 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs = { url = "github:NixOS/nixpkgs"; }; + nixpkgs = { url = "github:NixOS/nixpkgs/nixos-unstable"; }; home-manager = { url = "github:LavaDesu/home-manager/xsession-profilePath"; }; secrets = { url = "github:LavaDesu/flakes-secrets"; }; @@ -9,7 +9,7 @@ outputs = inputs: with inputs; let - revCount = "296773"; + revCount = "297098"; base = { config, ... }: { system = { configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; From 0de749a026e11a7ba44eed7366479cd46b6247a6 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 23 Jun 2021 22:30:40 +0700 Subject: [PATCH 0006/1112] update wine with gonX's patches --- .../0001-Revert-to-5.14-winepulse.drv.patch | 11241 ++++++++++++++++ .../0002-5.14-Latency-Fix.patch} | 45 +- ...h-from-invalid-context-in-Initialize.patch | 26 + ...he-last-used-locale-sortguid-mapping.patch | 87 + overlays/wine-osu.nix | 2 +- 5 files changed, 11384 insertions(+), 17 deletions(-) create mode 100644 overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch rename overlays/misc/{wine-lowlatency.patch => wine/0002-5.14-Latency-Fix.patch} (50%) create mode 100644 overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch create mode 100644 overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch diff --git a/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch b/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch new file mode 100644 index 0000000..db43ff8 --- /dev/null +++ b/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch @@ -0,0 +1,11241 @@ +From a57533f62c21da6029504267288d2cc429b17f9a Mon Sep 17 00:00:00 2001 +From: Sebastian 'gonX' Jensen +Date: Sun, 20 Jun 2021 17:00:22 +0200 +Subject: [PATCH 1/4] Revert to 5.14 winepulse.drv + +--- + dlls/mmdevapi/devenum.c | 3 +- + dlls/mmdevapi/tests/render.c | 29 +- + dlls/winealsa.drv/mmdevdrv.c | 177 +- + dlls/wineandroid.drv/mmdevdrv.c | 179 +- + dlls/winecoreaudio.drv/mmdevdrv.c | 177 +- + dlls/wineoss.drv/mmdevdrv.c | 177 +- + dlls/winepulse.drv/Makefile.in | 9 +- + dlls/winepulse.drv/mmdevdrv.c | 4195 ++++++++++++++++++++++++++--- + dlls/winepulse.drv/mult.c | 2015 -------------- + dlls/winepulse.drv/pulse.c | 1984 -------------- + dlls/winepulse.drv/unixlib.h | 211 -- + include/audioclient.idl | 8 - + 12 files changed, 4031 insertions(+), 5133 deletions(-) + delete mode 100644 dlls/winepulse.drv/mult.c + delete mode 100644 dlls/winepulse.drv/pulse.c + delete mode 100644 dlls/winepulse.drv/unixlib.h + +diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c +index b17572425f32b603ddec1cc592350b8440bde706..89ca13102804746d0caed9b4b72ee61ac84c8ad9 100644 +--- a/dlls/mmdevapi/devenum.c ++++ b/dlls/mmdevapi/devenum.c +@@ -554,8 +554,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls + return E_POINTER; + + if (IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)){ ++ IsEqualIID(riid, &IID_IAudioClient2)){ + hr = drvs.pGetAudioEndpoint(&This->devguid, iface, (IAudioClient**)ppv); + }else if (IsEqualIID(riid, &IID_IAudioEndpointVolume) || + IsEqualIID(riid, &IID_IAudioEndpointVolumeEx)) +diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c +index 495c1c6f496f73e7e9b2ba31735b66fd03690a22..2ae777b5ac585c02bf1a95073a9508831b887bda 100644 +--- a/dlls/mmdevapi/tests/render.c ++++ b/dlls/mmdevapi/tests/render.c +@@ -134,7 +134,6 @@ static void test_audioclient(void) + { + IAudioClient *ac; + IAudioClient2 *ac2; +- IAudioClient3 *ac3; + IUnknown *unk; + HRESULT hr; + ULONG ref; +@@ -144,14 +143,6 @@ static void test_audioclient(void) + BOOL offload_capable; + AudioClientProperties client_props; + +- hr = IMMDevice_Activate(dev, &IID_IAudioClient3, CLSCTX_INPROC_SERVER, +- NULL, (void**)&ac3); +- ok(hr == S_OK || +- broken(hr == E_NOINTERFACE) /* win8 */, +- "IAudioClient3 Activation failed with %08x\n", hr); +- if(hr == S_OK) +- IAudioClient3_Release(ac3); +- + hr = IMMDevice_Activate(dev, &IID_IAudioClient2, CLSCTX_INPROC_SERVER, + NULL, (void**)&ac2); + ok(hr == S_OK || +@@ -276,7 +267,6 @@ static void test_audioclient(void) + hr = IAudioClient2_SetClientProperties(ac2, NULL); + ok(hr == E_POINTER, "SetClientProperties with NULL props gave wrong error: %08x\n", hr); + +- /* invalid cbSize */ + client_props.cbSize = 0; + client_props.bIsOffload = FALSE; + client_props.eCategory = AudioCategory_BackgroundCapableMedia; +@@ -285,8 +275,7 @@ static void test_audioclient(void) + hr = IAudioClient2_SetClientProperties(ac2, &client_props); + ok(hr == E_INVALIDARG, "SetClientProperties with invalid cbSize gave wrong error: %08x\n", hr); + +- /* offload consistency */ +- client_props.cbSize = sizeof(client_props) - sizeof(client_props.Options); ++ client_props.cbSize = sizeof(client_props); + client_props.bIsOffload = TRUE; + + hr = IAudioClient2_SetClientProperties(ac2, &client_props); +@@ -295,31 +284,15 @@ static void test_audioclient(void) + else + ok(hr == S_OK, "SetClientProperties(offload) failed: %08x\n", hr); + +- /* disable offload */ + client_props.bIsOffload = FALSE; + hr = IAudioClient2_SetClientProperties(ac2, &client_props); + ok(hr == S_OK, "SetClientProperties failed: %08x\n", hr); + +- /* Options field added in Win 8.1 */ +- client_props.cbSize = sizeof(client_props); +- hr = IAudioClient2_SetClientProperties(ac2, &client_props); +- ok(hr == S_OK || +- broken(hr == E_INVALIDARG) /* <= win8 */, +- "SetClientProperties failed: %08x\n", hr); +- + IAudioClient2_Release(ac2); + } + else + win_skip("IAudioClient2 is not present on Win <= 7\n"); + +- hr = IAudioClient_QueryInterface(ac, &IID_IAudioClient3, (void**)&ac3); +- ok(hr == S_OK || +- broken(hr == E_NOINTERFACE) /* win8 */, +- "Failed to query IAudioClient3 interface: %08x\n", hr); +- +- if(hr == S_OK) +- IAudioClient3_Release(ac3); +- + test_uninitialized(ac); + + hr = IAudioClient_Initialize(ac, 3, 0, 5000000, 0, pwfx, NULL); +diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c +index 5f7d277ce9a354194123dbf3b01ef04f1c31db2d..636a04058056b4a83fd4657a0914c795c244463d 100644 +--- a/dlls/winealsa.drv/mmdevdrv.c ++++ b/dlls/winealsa.drv/mmdevdrv.c +@@ -90,7 +90,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -174,7 +174,7 @@ static const WCHAR drv_key_devicesW[] = {'S','o','f','t','w','a','r','e','\\', + 'w','i','n','e','a','l','s','a','.','d','r','v','\\','d','e','v','i','c','e','s',0}; + static const WCHAR guidW[] = {'g','u','i','d',0}; + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -187,9 +187,9 @@ static const IAudioSessionManager2Vtbl AudioSessionManager2_Vtbl; + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -831,7 +831,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + if(!This) + return E_OUTOFMEMORY; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -847,7 +847,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + return E_UNEXPECTED; + } + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -894,16 +894,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + This->parent = dev; + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -911,8 +911,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -925,18 +924,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + + ref = InterlockedDecrement(&This->ref); +@@ -953,7 +952,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) + CloseHandle(event); + } + +- IAudioClient3_Stop(iface); ++ IAudioClient2_Stop(iface); + IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); + This->lock.DebugInfo->Spare[0] = 0; +@@ -1282,12 +1281,12 @@ static void silence_buffer(ACImpl *This, BYTE *buffer, UINT32 frames) + memset(buffer, 0, frames * This->fmt->nBlockAlign); + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + snd_pcm_sw_params_t *sw_params = NULL; + snd_pcm_format_t format; + unsigned int rate, alsa_period_us; +@@ -1574,10 +1573,10 @@ exit: + return hr; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, out); + +@@ -1598,10 +1597,10 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, latency); + +@@ -1631,10 +1630,10 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, out); + +@@ -1658,11 +1657,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, + WAVEFORMATEX **out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + snd_pcm_format_mask_t *formats = NULL; + snd_pcm_format_t format; + HRESULT hr = S_OK; +@@ -1809,10 +1808,10 @@ exit: + return hr; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + snd_pcm_format_mask_t *formats; + unsigned int max_rate, max_channels; +@@ -1940,10 +1939,10 @@ exit: + return hr; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -2438,9 +2437,9 @@ static int alsa_rewind_best_effort(ACImpl *This) + return len; + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2506,9 +2505,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2534,9 +2533,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2581,10 +2580,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -2616,10 +2615,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -2700,10 +2699,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -2715,83 +2714,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -2811,9 +2769,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -2844,13 +2799,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -3010,13 +2965,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -3185,13 +3140,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -3303,13 +3258,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -3348,7 +3303,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -3396,7 +3351,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + EnterCriticalSection(&This->client->lock); + This->client->session_wrapper = NULL; + LeaveCriticalSection(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -3738,13 +3693,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/wineandroid.drv/mmdevdrv.c b/dlls/wineandroid.drv/mmdevdrv.c +index d9b7cde2c80af90cf44cfe33945a2a43fa41dd4b..aa32c49185501a58941c6065482928654541b6a2 100644 +--- a/dlls/wineandroid.drv/mmdevdrv.c ++++ b/dlls/wineandroid.drv/mmdevdrv.c +@@ -107,7 +107,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -174,7 +174,7 @@ static struct list g_sessions = LIST_INIT(g_sessions); + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -185,9 +185,9 @@ static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; + static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; + static const IAudioSessionManager2Vtbl AudioSessionManager2_Vtbl; + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -377,7 +377,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + if(!This) + return E_OUTOFMEMORY; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -385,7 +385,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + + This->dataflow = flow; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -398,16 +398,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + This->parent = dev; + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -415,8 +415,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -428,18 +427,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + + ref = InterlockedDecrement(&This->ref); +@@ -456,7 +455,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) + CloseHandle(event); + } + +- IAudioClient3_Stop(iface); ++ IAudioClient2_Stop(iface); + + IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); +@@ -786,12 +785,12 @@ static HRESULT try_open_capture_device(SLAndroidDataFormat_PCM_EX *pcm, unsigned + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + int i, num_buffers; + HRESULT hr; + SLresult sr; +@@ -1021,10 +1020,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *frames) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, frames); + +@@ -1047,10 +1046,10 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, latency); + +@@ -1073,10 +1072,10 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *numpad) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, numpad); + +@@ -1099,11 +1098,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, + WAVEFORMATEX **outpwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLAndroidDataFormat_PCM_EX pcm; + HRESULT hr; + +@@ -1135,7 +1134,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + + if(FAILED(hr)){ + if(outpwfx){ +- hr = IAudioClient3_GetMixFormat(iface, outpwfx); ++ hr = IAudioClient2_GetMixFormat(iface, outpwfx); + if(FAILED(hr)) + return hr; + return S_FALSE; +@@ -1149,10 +1148,10 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + return hr; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + + TRACE("(%p)->(%p)\n", This, pwfx); +@@ -1187,10 +1186,10 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -1344,9 +1343,9 @@ static void CALLBACK sl_period_callback(void *user, BOOLEAN timer) + SetEvent(This->event); + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLresult sr; + + TRACE("(%p)\n", This); +@@ -1398,9 +1397,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLresult sr; + + TRACE("(%p)\n", This); +@@ -1440,9 +1439,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + SLresult sr; + + TRACE("(%p)\n", This); +@@ -1497,10 +1496,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -1532,10 +1531,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -1616,10 +1615,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -1631,83 +1630,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -1727,9 +1685,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -1759,13 +1714,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -1926,13 +1881,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -2104,13 +2059,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -2200,13 +2155,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -2245,7 +2200,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -2293,7 +2248,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + EnterCriticalSection(&This->client->lock); + This->client->session_wrapper = NULL; + LeaveCriticalSection(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -2636,13 +2591,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c +index f07f4bae5fb211dabd23ddfc12c889aafb701ab9..03f8a0c030e8fe4ea3a33d8ecfffe428cb181843 100644 +--- a/dlls/winecoreaudio.drv/mmdevdrv.c ++++ b/dlls/winecoreaudio.drv/mmdevdrv.c +@@ -108,7 +108,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -151,7 +151,7 @@ struct ACImpl { + OSSpinLock lock; + }; + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -190,9 +190,9 @@ static struct list g_sessions = LIST_INIT(g_sessions); + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + static HRESULT ca_setvol(ACImpl *This, UINT32 index); + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -652,7 +652,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + if(!This) + return E_OUTOFMEMORY; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -672,7 +672,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + + This->lock = 0; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -688,16 +688,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + return AUDCLNT_E_DEVICE_INVALIDATED; + } + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -705,8 +705,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -719,18 +718,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedDecrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); +@@ -1276,12 +1275,12 @@ static HRESULT ca_setup_audiounit(EDataFlow dataflow, AudioComponentInstance uni + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + HRESULT hr; + OSStatus sc; + int i; +@@ -1480,10 +1479,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *frames) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, frames); + +@@ -1558,10 +1557,10 @@ static HRESULT ca_get_max_stream_latency(ACImpl *This, UInt32 *max) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + UInt32 latency, stream_latency, size; + AudioObjectPropertyAddress addr; + OSStatus sc; +@@ -1623,10 +1622,10 @@ static HRESULT AudioClient_GetCurrentPadding_nolock(ACImpl *This, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *numpad) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + HRESULT hr; + + TRACE("(%p)->(%p)\n", This, numpad); +@@ -1643,11 +1642,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return hr; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, + WAVEFORMATEX **outpwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + AudioStreamBasicDescription dev_desc; + AudioConverterRef converter; + AudioComponentInstance unit; +@@ -1710,7 +1709,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + + unsupported: + if(outpwfx){ +- hr = IAudioClient3_GetMixFormat(&This->IAudioClient3_iface, outpwfx); ++ hr = IAudioClient2_GetMixFormat(&This->IAudioClient2_iface, outpwfx); + if(FAILED(hr)) + return hr; + return S_FALSE; +@@ -1835,10 +1834,10 @@ static void convert_channel_layout(const AudioChannelLayout *ca_layout, WAVEFORM + fmt->dwChannelMask = ca_mask; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + OSStatus sc; + UInt32 size; +@@ -1954,10 +1953,10 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -1980,9 +1979,9 @@ void CALLBACK ca_period_cb(void *user, BOOLEAN timer) + SetEvent(This->event); + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2019,9 +2018,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2044,9 +2043,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -2084,10 +2083,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -2119,10 +2118,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -2203,10 +2202,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -2218,83 +2217,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -2314,9 +2272,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -2347,13 +2302,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -2504,13 +2459,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -2672,13 +2627,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -2768,13 +2723,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -2813,7 +2768,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- IAudioClient3_AddRef(&client->IAudioClient3_iface); ++ AudioClient2_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -2861,7 +2816,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + OSSpinLockLock(&This->client->lock); + This->client->session_wrapper = NULL; + OSSpinLockUnlock(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -3256,13 +3211,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c +index db2c6b23914d5e49ed7f125f16749f1f4cee45d2..3a3cb57b642493f5bc2cc01f002300497e78a625 100644 +--- a/dlls/wineoss.drv/mmdevdrv.c ++++ b/dlls/wineoss.drv/mmdevdrv.c +@@ -90,7 +90,7 @@ typedef struct _AudioSessionWrapper { + } AudioSessionWrapper; + + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -168,7 +168,7 @@ static struct list g_sessions = LIST_INIT(g_sessions); + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -179,9 +179,9 @@ static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; + static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; + static const IAudioSessionManager2Vtbl AudioSessionManager2_Vtbl; + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -605,7 +605,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + if(!This) + return E_OUTOFMEMORY; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient2_iface, &This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; +@@ -652,7 +652,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + TRACE("min_channels: %d\n", This->ai.min_channels); + TRACE("max_channels: %d\n", This->ai.max_channels); + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -665,16 +665,16 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, + This->parent = dev; + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if(!ppv) +@@ -682,8 +682,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); +@@ -695,18 +694,18 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + + ref = InterlockedDecrement(&This->ref); +@@ -723,7 +722,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) + CloseHandle(event); + } + +- IAudioClient3_Stop(iface); ++ IAudioClient2_Stop(iface); + IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); + This->lock.DebugInfo->Spare[0] = 0; +@@ -1030,12 +1029,12 @@ static HRESULT get_audio_session(const GUID *sessionguid, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + int i; + HRESULT hr; + +@@ -1160,10 +1159,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *frames) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, frames); + +@@ -1186,10 +1185,10 @@ static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, latency); + +@@ -1212,10 +1211,10 @@ static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *numpad) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, numpad); + +@@ -1238,11 +1237,11 @@ static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *pwfx, + WAVEFORMATEX **outpwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + int fd = -1; + HRESULT ret; + +@@ -1284,10 +1283,10 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + return ret; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + WAVEFORMATEXTENSIBLE *fmt; + int formats; + +@@ -1377,10 +1376,10 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -1561,9 +1560,9 @@ static void CALLBACK oss_period_callback(void *user, BOOLEAN timer) + SetEvent(This->event); + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -1598,9 +1597,9 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -1624,9 +1623,9 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)\n", This); + +@@ -1662,10 +1661,10 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, event); + +@@ -1697,10 +1696,10 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -1781,10 +1780,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -1796,83 +1795,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -1892,9 +1850,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -1924,13 +1879,13 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, +@@ -2090,13 +2045,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -2266,13 +2221,13 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) +@@ -2375,13 +2330,13 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, +@@ -2420,7 +2375,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if(client){ + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -2468,7 +2423,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + EnterCriticalSection(&This->client->lock); + This->client->session_wrapper = NULL; + LeaveCriticalSection(&This->client->lock); +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -2811,13 +2766,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +diff --git a/dlls/winepulse.drv/Makefile.in b/dlls/winepulse.drv/Makefile.in +index 4bf053d4e54f1790ef08bba4ef8330bd41a1f133..3082ed8a69ef642da648b1311b601e6d69a60d7c 100644 +--- a/dlls/winepulse.drv/Makefile.in ++++ b/dlls/winepulse.drv/Makefile.in +@@ -1,11 +1,8 @@ + MODULE = winepulse.drv + IMPORTS = dxguid uuid winmm user32 advapi32 ole32 +-EXTRALIBS = $(PULSE_LIBS) $(PTHREAD_LIBS) -Wl,--subsystem,native ++EXTRALIBS = $(PULSE_LIBS) $(PTHREAD_LIBS) + EXTRAINCL = $(PULSE_CFLAGS) +- +-EXTRADLLFLAGS = -mno-cygwin ++EXTRADEFS = -DWINE_NO_NAMELESS_EXTENSION + + C_SRCS = \ +- mmdevdrv.c \ +- mult.c \ +- pulse.c ++ mmdevdrv.c +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 67a42de97f96278b32988bdad5d168547edbe8f8..07407089ac5af65eb13d6e00b6d0969a61ec5589 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -18,15 +18,28 @@ + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + ++#define NONAMELESSUNION + #define COBJMACROS ++#define _GNU_SOURCE ++ ++#include "config.h" ++#include ++#include + + #include +-#include ++#include ++#include ++#include ++#include ++ ++#include + + #include "windef.h" + #include "winbase.h" +-#include "winternl.h" ++#include "winnls.h" ++#include "winreg.h" + #include "wine/debug.h" ++#include "wine/unicode.h" + #include "wine/list.h" + + #include "ole2.h" +@@ -43,12 +56,8 @@ + #include "endpointvolume.h" + #include "audiopolicy.h" + +-#include "unixlib.h" +- + WINE_DEFAULT_DEBUG_CHANNEL(pulse); + +-static UINT64 pulse_handle; +- + #define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) + + /* From */ +@@ -59,33 +68,52 @@ enum DriverPriority { + Priority_Preferred + }; + +-static struct pulse_config pulse_config; ++static const REFERENCE_TIME MinimumPeriod = 30000; ++static const REFERENCE_TIME DefaultPeriod = 100000; ++ ++static pa_context *pulse_ctx; ++static pa_mainloop *pulse_ml; + + static HANDLE pulse_thread; ++static pthread_mutex_t pulse_lock; ++static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; + static struct list g_sessions = LIST_INIT(g_sessions); + ++static UINT g_phys_speakers_mask = 0; ++ ++/* Mixer format + period times */ ++static WAVEFORMATEXTENSIBLE pulse_fmt[2]; ++static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2]; ++ + static GUID pulse_render_guid = + { 0xfd47d9cc, 0x4218, 0x4135, { 0x9c, 0xe2, 0x0c, 0x19, 0x5c, 0x87, 0x40, 0x5b } }; + static GUID pulse_capture_guid = + { 0x25da76d0, 0x033c, 0x4235, { 0x90, 0x02, 0x19, 0xf4, 0x88, 0x94, 0xac, 0x6f } }; + +-static CRITICAL_SECTION session_cs; +-static CRITICAL_SECTION_DEBUG session_cs_debug = { +- 0, 0, &session_cs, +- { &session_cs_debug.ProcessLocksList, +- &session_cs_debug.ProcessLocksList }, +- 0, 0, { (DWORD_PTR)(__FILE__ ": session_cs") } +-}; +-static CRITICAL_SECTION session_cs = { &session_cs_debug, -1, 0, 0, 0, 0 }; ++static UINT8 mult_alaw_sample(UINT8, float); ++static UINT8 mult_ulaw_sample(UINT8, float); + + BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) + { + if (reason == DLL_PROCESS_ATTACH) { ++ pthread_mutexattr_t attr; ++ + DisableThreadLibraryCalls(dll); +- if (__wine_init_unix_lib(dll, reason, NULL, &pulse_handle)) +- return FALSE; ++ ++ pthread_mutexattr_init(&attr); ++ pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); ++ ++ if (pthread_mutex_init(&pulse_lock, &attr) != 0) ++ pthread_mutex_init(&pulse_lock, NULL); + } else if (reason == DLL_PROCESS_DETACH) { +- __wine_init_unix_lib(dll, reason, NULL, NULL); ++ if (pulse_thread) ++ SetThreadPriority(pulse_thread, 0); ++ if (pulse_ctx) { ++ pa_context_disconnect(pulse_ctx); ++ pa_context_unref(pulse_ctx); ++ } ++ if (pulse_ml) ++ pa_mainloop_quit(pulse_ml, 0); + if (pulse_thread) { + WaitForSingleObject(pulse_thread, INFINITE); + CloseHandle(pulse_thread); +@@ -121,8 +149,15 @@ typedef struct _AudioSessionWrapper { + AudioSession *session; + } AudioSessionWrapper; + ++typedef struct _ACPacket { ++ struct list entry; ++ UINT64 qpcpos; ++ BYTE *data; ++ UINT32 discont; ++} ACPacket; ++ + struct ACImpl { +- IAudioClient3 IAudioClient3_iface; ++ IAudioClient2 IAudioClient2_iface; + IAudioRenderClient IAudioRenderClient_iface; + IAudioCaptureClient IAudioCaptureClient_iface; + IAudioClock IAudioClock_iface; +@@ -131,22 +166,36 @@ struct ACImpl { + IUnknown *marshal; + IMMDevice *parent; + struct list entry; +- float *vol; ++ float vol[PA_CHANNELS_MAX]; + + LONG ref; + EDataFlow dataflow; +- UINT32 channel_count; +- HANDLE timer; ++ DWORD flags; ++ AUDCLNT_SHAREMODE share; ++ HANDLE event; ++ ++ INT32 locked; ++ UINT32 bufsize_frames, bufsize_bytes, capture_period, pad, started, peek_ofs, wri_offs_bytes, lcl_offs_bytes; ++ UINT32 tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len; ++ BYTE *local_buffer, *tmp_buffer, *peek_buffer; ++ void *locked_ptr; ++ ++ pa_stream *stream; ++ pa_sample_spec ss; ++ pa_channel_map map; ++ pa_buffer_attr attr; + +- struct pulse_stream *pulse_stream; ++ INT64 clock_lastpos, clock_written; + + AudioSession *session; + AudioSessionWrapper *session_wrapper; ++ struct list packet_free_head; ++ struct list packet_filled_head; + }; + +-static const WCHAR defaultW[] = L"Pulseaudio"; ++static const WCHAR defaultW[] = {'P','u','l','s','e','a','u','d','i','o',0}; + +-static const IAudioClient3Vtbl AudioClient3_Vtbl; ++static const IAudioClient2Vtbl AudioClient2_Vtbl; + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; + static const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; +@@ -158,9 +207,9 @@ static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; + + static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); + +-static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) ++static inline ACImpl *impl_from_IAudioClient2(IAudioClient2 *iface) + { +- return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); ++ return CONTAINING_RECORD(iface, ACImpl, IAudioClient2_iface); + } + + static inline ACImpl *impl_from_IAudioRenderClient(IAudioRenderClient *iface) +@@ -203,65 +252,896 @@ static inline ACImpl *impl_from_IAudioStreamVolume(IAudioStreamVolume *iface) + return CONTAINING_RECORD(iface, ACImpl, IAudioStreamVolume_iface); + } + +-static void pulse_call(enum unix_funcs code, void *params) ++/* Following pulseaudio design here, mainloop has the lock taken whenever ++ * it is handling something for pulse, and the lock is required whenever ++ * doing any pa_* call that can affect the state in any way ++ * ++ * pa_cond_wait is used when waiting on results, because the mainloop needs ++ * the same lock taken to affect the state ++ * ++ * This is basically the same as the pa_threaded_mainloop implementation, ++ * but that cannot be used because it uses pthread_create directly ++ * ++ * pa_threaded_mainloop_(un)lock -> pthread_mutex_(un)lock ++ * pa_threaded_mainloop_signal -> pthread_cond_broadcast ++ * pa_threaded_mainloop_wait -> pthread_cond_wait ++ */ ++ ++static int pulse_poll_func(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata) { ++ int r; ++ pthread_mutex_unlock(&pulse_lock); ++ r = poll(ufds, nfds, timeout); ++ pthread_mutex_lock(&pulse_lock); ++ return r; ++} ++ ++static DWORD CALLBACK pulse_mainloop_thread(void *tmp) { ++ int ret; ++ pulse_ml = pa_mainloop_new(); ++ pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); ++ pthread_mutex_lock(&pulse_lock); ++ pthread_cond_broadcast(&pulse_cond); ++ pa_mainloop_run(pulse_ml, &ret); ++ pthread_mutex_unlock(&pulse_lock); ++ pa_mainloop_free(pulse_ml); ++ return ret; ++} ++ ++static void pulse_contextcallback(pa_context *c, void *userdata) + { +- NTSTATUS status; +- status = __wine_unix_call(pulse_handle, code, params); +- assert(!status); ++ switch (pa_context_get_state(c)) { ++ default: ++ FIXME("Unhandled state: %i\n", pa_context_get_state(c)); ++ return; ++ ++ case PA_CONTEXT_CONNECTING: ++ case PA_CONTEXT_UNCONNECTED: ++ case PA_CONTEXT_AUTHORIZING: ++ case PA_CONTEXT_SETTING_NAME: ++ case PA_CONTEXT_TERMINATED: ++ TRACE("State change to %i\n", pa_context_get_state(c)); ++ return; ++ ++ case PA_CONTEXT_READY: ++ TRACE("Ready\n"); ++ break; ++ ++ case PA_CONTEXT_FAILED: ++ WARN("Context failed: %s\n", pa_strerror(pa_context_errno(c))); ++ break; ++ } ++ pthread_cond_broadcast(&pulse_cond); + } + +-static void pulse_release_stream(struct pulse_stream *stream, HANDLE timer) ++static void pulse_stream_state(pa_stream *s, void *user) + { +- struct release_stream_params params; +- params.stream = stream; +- params.timer = timer; +- pulse_call(release_stream, ¶ms); ++ pa_stream_state_t state = pa_stream_get_state(s); ++ TRACE("Stream state changed to %i\n", state); ++ pthread_cond_broadcast(&pulse_cond); + } + +-static DWORD CALLBACK pulse_mainloop_thread(void *event) ++static const enum pa_channel_position pulse_pos_from_wfx[] = { ++ 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_FRONT_LEFT_OF_CENTER, ++ PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, ++ PA_CHANNEL_POSITION_REAR_CENTER, ++ PA_CHANNEL_POSITION_SIDE_LEFT, ++ PA_CHANNEL_POSITION_SIDE_RIGHT, ++ PA_CHANNEL_POSITION_TOP_CENTER, ++ PA_CHANNEL_POSITION_TOP_FRONT_LEFT, ++ PA_CHANNEL_POSITION_TOP_FRONT_CENTER, ++ PA_CHANNEL_POSITION_TOP_FRONT_RIGHT, ++ PA_CHANNEL_POSITION_TOP_REAR_LEFT, ++ PA_CHANNEL_POSITION_TOP_REAR_CENTER, ++ PA_CHANNEL_POSITION_TOP_REAR_RIGHT ++}; ++ ++static DWORD pulse_channel_map_to_channel_mask(const pa_channel_map *map) + { +- struct main_loop_params params; +- params.event = event; +- pulse_call(main_loop, ¶ms); +- return 0; ++ int i; ++ DWORD mask = 0; ++ ++ for (i = 0; i < map->channels; ++i) { ++ switch (map->map[i]) { ++ default: FIXME("Unhandled channel %s\n", pa_channel_position_to_string(map->map[i])); break; ++ case PA_CHANNEL_POSITION_FRONT_LEFT: mask |= SPEAKER_FRONT_LEFT; break; ++ case PA_CHANNEL_POSITION_MONO: ++ case PA_CHANNEL_POSITION_FRONT_CENTER: mask |= SPEAKER_FRONT_CENTER; break; ++ case PA_CHANNEL_POSITION_FRONT_RIGHT: mask |= SPEAKER_FRONT_RIGHT; break; ++ case PA_CHANNEL_POSITION_REAR_LEFT: mask |= SPEAKER_BACK_LEFT; break; ++ case PA_CHANNEL_POSITION_REAR_CENTER: mask |= SPEAKER_BACK_CENTER; break; ++ case PA_CHANNEL_POSITION_REAR_RIGHT: mask |= SPEAKER_BACK_RIGHT; break; ++ case PA_CHANNEL_POSITION_LFE: mask |= SPEAKER_LOW_FREQUENCY; break; ++ case PA_CHANNEL_POSITION_SIDE_LEFT: mask |= SPEAKER_SIDE_LEFT; break; ++ case PA_CHANNEL_POSITION_SIDE_RIGHT: mask |= SPEAKER_SIDE_RIGHT; break; ++ case PA_CHANNEL_POSITION_TOP_CENTER: mask |= SPEAKER_TOP_CENTER; break; ++ case PA_CHANNEL_POSITION_TOP_FRONT_LEFT: mask |= SPEAKER_TOP_FRONT_LEFT; break; ++ case PA_CHANNEL_POSITION_TOP_FRONT_CENTER: mask |= SPEAKER_TOP_FRONT_CENTER; break; ++ case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT: mask |= SPEAKER_TOP_FRONT_RIGHT; break; ++ case PA_CHANNEL_POSITION_TOP_REAR_LEFT: mask |= SPEAKER_TOP_BACK_LEFT; break; ++ case PA_CHANNEL_POSITION_TOP_REAR_CENTER: mask |= SPEAKER_TOP_BACK_CENTER; break; ++ case PA_CHANNEL_POSITION_TOP_REAR_RIGHT: mask |= SPEAKER_TOP_BACK_RIGHT; break; ++ case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: mask |= SPEAKER_FRONT_LEFT_OF_CENTER; break; ++ case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: mask |= SPEAKER_FRONT_RIGHT_OF_CENTER; break; ++ } ++ } ++ ++ return mask; + } + +-static char *get_application_name(void) ++/* For most hardware on Windows, users must choose a configuration with an even ++ * number of channels (stereo, quad, 5.1, 7.1). Users can then disable ++ * channels, but those channels are still reported to applications from ++ * GetMixFormat! Some applications behave badly if given an odd number of ++ * channels (e.g. 2.1). Here, we find the nearest configuration that Windows ++ * would report for a given channel layout. */ ++static void convert_channel_map(const pa_channel_map *pa_map, WAVEFORMATEXTENSIBLE *fmt) + { ++ DWORD pa_mask = pulse_channel_map_to_channel_mask(pa_map); ++ ++ TRACE("got mask for PA: 0x%x\n", pa_mask); ++ ++ if (pa_map->channels == 1) ++ { ++ fmt->Format.nChannels = 1; ++ fmt->dwChannelMask = pa_mask; ++ return; ++ } ++ ++ /* compare against known configurations and find smallest configuration ++ * which is a superset of the given speakers */ ++ ++ if (pa_map->channels <= 2 && ++ (pa_mask & ~KSAUDIO_SPEAKER_STEREO) == 0) ++ { ++ fmt->Format.nChannels = 2; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_STEREO; ++ return; ++ } ++ ++ if (pa_map->channels <= 4 && ++ (pa_mask & ~KSAUDIO_SPEAKER_QUAD) == 0) ++ { ++ fmt->Format.nChannels = 4; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_QUAD; ++ return; ++ } ++ ++ if (pa_map->channels <= 4 && ++ (pa_mask & ~KSAUDIO_SPEAKER_SURROUND) == 0) ++ { ++ fmt->Format.nChannels = 4; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_SURROUND; ++ return; ++ } ++ ++ if (pa_map->channels <= 6 && ++ (pa_mask & ~KSAUDIO_SPEAKER_5POINT1) == 0) ++ { ++ fmt->Format.nChannels = 6; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1; ++ return; ++ } ++ ++ if (pa_map->channels <= 6 && ++ (pa_mask & ~KSAUDIO_SPEAKER_5POINT1_SURROUND) == 0) ++ { ++ fmt->Format.nChannels = 6; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1_SURROUND; ++ return; ++ } ++ ++ if (pa_map->channels <= 8 && ++ (pa_mask & ~KSAUDIO_SPEAKER_7POINT1) == 0) ++ { ++ fmt->Format.nChannels = 8; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1; ++ return; ++ } ++ ++ if (pa_map->channels <= 8 && ++ (pa_mask & ~KSAUDIO_SPEAKER_7POINT1_SURROUND) == 0) ++ { ++ fmt->Format.nChannels = 8; ++ fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1_SURROUND; ++ return; ++ } ++ ++ /* oddball format, report truthfully */ ++ fmt->Format.nChannels = pa_map->channels; ++ fmt->dwChannelMask = pa_mask; ++} ++ ++static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { ++ WAVEFORMATEX *wfx = &fmt->Format; ++ pa_stream *stream; ++ pa_channel_map map; ++ pa_sample_spec ss; ++ pa_buffer_attr attr; ++ int ret; ++ unsigned int length = 0; ++ ++ pa_channel_map_init_auto(&map, 2, PA_CHANNEL_MAP_ALSA); ++ ss.rate = 48000; ++ ss.format = PA_SAMPLE_FLOAT32LE; ++ ss.channels = map.channels; ++ ++ attr.maxlength = -1; ++ attr.tlength = -1; ++ attr.minreq = attr.fragsize = pa_frame_size(&ss); ++ attr.prebuf = 0; ++ ++ stream = pa_stream_new(pulse_ctx, "format test stream", &ss, &map); ++ if (stream) ++ pa_stream_set_state_callback(stream, pulse_stream_state, NULL); ++ if (!stream) ++ ret = -1; ++ else if (render) ++ ret = pa_stream_connect_playback(stream, NULL, &attr, ++ PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS, NULL, NULL); ++ else ++ ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS); ++ if (ret >= 0) { ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && ++ pa_stream_get_state(stream) == PA_STREAM_CREATING) ++ {} ++ if (pa_stream_get_state(stream) == PA_STREAM_READY) { ++ ss = *pa_stream_get_sample_spec(stream); ++ map = *pa_stream_get_channel_map(stream); ++ if (render) ++ length = pa_stream_get_buffer_attr(stream)->minreq; ++ else ++ length = pa_stream_get_buffer_attr(stream)->fragsize; ++ pa_stream_disconnect(stream); ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && ++ pa_stream_get_state(stream) == PA_STREAM_READY) ++ {} ++ } ++ } ++ ++ if (stream) ++ pa_stream_unref(stream); ++ ++ if (length) ++ pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss); ++ ++ if (pulse_min_period[!render] < MinimumPeriod) ++ pulse_min_period[!render] = MinimumPeriod; ++ ++ if (pulse_def_period[!render] < DefaultPeriod) ++ pulse_def_period[!render] = DefaultPeriod; ++ ++ wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; ++ wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); ++ ++ convert_channel_map(&map, fmt); ++ ++ wfx->wBitsPerSample = 8 * pa_sample_size_of_format(ss.format); ++ wfx->nSamplesPerSec = ss.rate; ++ wfx->nBlockAlign = wfx->nChannels * wfx->wBitsPerSample / 8; ++ wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign; ++ if (ss.format != PA_SAMPLE_S24_32LE) ++ fmt->Samples.wValidBitsPerSample = wfx->wBitsPerSample; ++ else ++ fmt->Samples.wValidBitsPerSample = 24; ++ if (ss.format == PA_SAMPLE_FLOAT32LE) ++ fmt->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; ++ else ++ fmt->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; ++} ++ ++static HRESULT pulse_connect(void) ++{ ++ int len; + WCHAR path[MAX_PATH], *name; +- size_t len; + char *str; + ++ if (!pulse_thread) ++ { ++ if (!(pulse_thread = CreateThread(NULL, 0, pulse_mainloop_thread, NULL, 0, NULL))) ++ { ++ ERR("Failed to create mainloop thread.\n"); ++ return E_FAIL; ++ } ++ SetThreadPriority(pulse_thread, THREAD_PRIORITY_TIME_CRITICAL); ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ } ++ ++ if (pulse_ctx && PA_CONTEXT_IS_GOOD(pa_context_get_state(pulse_ctx))) ++ return S_OK; ++ if (pulse_ctx) ++ pa_context_unref(pulse_ctx); ++ + GetModuleFileNameW(NULL, path, ARRAY_SIZE(path)); +- name = wcsrchr(path, '\\'); ++ name = strrchrW(path, '\\'); + if (!name) + name = path; + else + name++; +- len = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, NULL, NULL); +- if (!(str = malloc(len))) +- return NULL; ++ len = WideCharToMultiByte(CP_UNIXCP, 0, name, -1, NULL, 0, NULL, NULL); ++ str = pa_xmalloc(len); + WideCharToMultiByte(CP_UNIXCP, 0, name, -1, str, len, NULL, NULL); +- return str; ++ TRACE("Name: %s\n", str); ++ pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), str); ++ pa_xfree(str); ++ if (!pulse_ctx) { ++ ERR("Failed to create context\n"); ++ return E_FAIL; ++ } ++ ++ pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); ++ ++ TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); ++ if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) ++ goto fail; ++ ++ /* Wait for connection */ ++ while (pthread_cond_wait(&pulse_cond, &pulse_lock)) { ++ pa_context_state_t state = pa_context_get_state(pulse_ctx); ++ ++ if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) ++ goto fail; ++ ++ if (state == PA_CONTEXT_READY) ++ break; ++ } ++ ++ TRACE("Connected to server %s with protocol version: %i.\n", ++ pa_context_get_server(pulse_ctx), ++ pa_context_get_server_protocol_version(pulse_ctx)); ++ return S_OK; ++ ++fail: ++ pa_context_unref(pulse_ctx); ++ pulse_ctx = NULL; ++ return E_FAIL; + } + +-static DWORD WINAPI pulse_timer_cb(void *user) ++/* For default PulseAudio render device, OR together all of the ++ * PKEY_AudioEndpoint_PhysicalSpeakers values of the sinks. */ ++static void pulse_phys_speakers_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) + { +- struct timer_loop_params params; +- ACImpl *This = user; +- params.stream = This->pulse_stream; +- pulse_call(timer_loop, ¶ms); +- return 0; ++ if (i) ++ g_phys_speakers_mask |= pulse_channel_map_to_channel_mask(&i->channel_map); ++} ++ ++/* some poorly-behaved applications call audio functions during DllMain, so we ++ * have to do as much as possible without creating a new thread. this function ++ * sets up a synchronous connection to verify the server is running and query ++ * static data. */ ++static HRESULT pulse_test_connect(void) ++{ ++ int len, ret; ++ WCHAR path[MAX_PATH], *name; ++ char *str; ++ pa_operation *o; ++ ++ pulse_ml = pa_mainloop_new(); ++ ++ pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); ++ ++ GetModuleFileNameW(NULL, path, ARRAY_SIZE(path)); ++ name = strrchrW(path, '\\'); ++ if (!name) ++ name = path; ++ else ++ name++; ++ len = WideCharToMultiByte(CP_UNIXCP, 0, name, -1, NULL, 0, NULL, NULL); ++ str = pa_xmalloc(len); ++ WideCharToMultiByte(CP_UNIXCP, 0, name, -1, str, len, NULL, NULL); ++ TRACE("Name: %s\n", str); ++ pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), str); ++ pa_xfree(str); ++ if (!pulse_ctx) { ++ ERR("Failed to create context\n"); ++ pa_mainloop_free(pulse_ml); ++ pulse_ml = NULL; ++ return E_FAIL; ++ } ++ ++ pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); ++ ++ TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); ++ if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) ++ goto fail; ++ ++ /* Wait for connection */ ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0) { ++ pa_context_state_t state = pa_context_get_state(pulse_ctx); ++ ++ if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) ++ goto fail; ++ ++ if (state == PA_CONTEXT_READY) ++ break; ++ } ++ ++ if (pa_context_get_state(pulse_ctx) != PA_CONTEXT_READY) ++ goto fail; ++ ++ TRACE("Test-connected to server %s with protocol version: %i.\n", ++ pa_context_get_server(pulse_ctx), ++ pa_context_get_server_protocol_version(pulse_ctx)); ++ ++ pulse_probe_settings(1, &pulse_fmt[0]); ++ pulse_probe_settings(0, &pulse_fmt[1]); ++ ++ g_phys_speakers_mask = 0; ++ o = pa_context_get_sink_info_list(pulse_ctx, &pulse_phys_speakers_cb, NULL); ++ if (o) { ++ while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && ++ pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ {} ++ pa_operation_unref(o); ++ } ++ ++ pa_context_unref(pulse_ctx); ++ pulse_ctx = NULL; ++ pa_mainloop_free(pulse_ml); ++ pulse_ml = NULL; ++ ++ return S_OK; ++ ++fail: ++ pa_context_unref(pulse_ctx); ++ pulse_ctx = NULL; ++ pa_mainloop_free(pulse_ml); ++ pulse_ml = NULL; ++ ++ return E_FAIL; ++} ++ ++static HRESULT pulse_stream_valid(ACImpl *This) { ++ if (!This->stream) ++ return AUDCLNT_E_NOT_INITIALIZED; ++ if (pa_stream_get_state(This->stream) != PA_STREAM_READY) ++ return AUDCLNT_E_DEVICE_INVALIDATED; ++ return S_OK; ++} ++ ++static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes) ++{ ++ memset(buffer, format == PA_SAMPLE_U8 ? 0x80 : 0, bytes); ++} ++ ++static void pulse_free_noop(void *buf) ++{ ++} ++ ++enum write_buffer_flags ++{ ++ WINEPULSE_WRITE_NOFREE = 0x01, ++ WINEPULSE_WRITE_SILENT = 0x02 ++}; ++ ++static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes, ++ enum write_buffer_flags flags) ++{ ++ float vol[PA_CHANNELS_MAX]; ++ BOOL adjust = FALSE; ++ UINT32 i, channels; ++ BYTE *end; ++ ++ if (!bytes) return 0; ++ if (This->session->mute || (flags & WINEPULSE_WRITE_SILENT)) ++ { ++ silence_buffer(This->ss.format, buffer, bytes); ++ goto write; ++ } ++ ++ /* Adjust the buffer based on the volume for each channel */ ++ channels = This->ss.channels; ++ for (i = 0; i < channels; i++) ++ { ++ vol[i] = This->vol[i] * This->session->master_vol * This->session->channel_vols[i]; ++ adjust |= vol[i] != 1.0f; ++ } ++ if (!adjust) goto write; ++ ++ end = buffer + bytes; ++ switch (This->ss.format) ++ { ++#ifndef WORDS_BIGENDIAN ++#define PROCESS_BUFFER(type) do \ ++{ \ ++ type *p = (type*)buffer; \ ++ do \ ++ { \ ++ for (i = 0; i < channels; i++) \ ++ p[i] = p[i] * vol[i]; \ ++ p += i; \ ++ } while ((BYTE*)p != end); \ ++} while (0) ++ case PA_SAMPLE_S16LE: ++ PROCESS_BUFFER(INT16); ++ break; ++ case PA_SAMPLE_S32LE: ++ PROCESS_BUFFER(INT32); ++ break; ++ case PA_SAMPLE_FLOAT32LE: ++ PROCESS_BUFFER(float); ++ break; ++#undef PROCESS_BUFFER ++ case PA_SAMPLE_S24_32LE: ++ { ++ UINT32 *p = (UINT32*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ { ++ p[i] = (INT32)((INT32)(p[i] << 8) * vol[i]); ++ p[i] >>= 8; ++ } ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ case PA_SAMPLE_S24LE: ++ { ++ /* do it 12 bytes at a time until it is no longer possible */ ++ UINT32 *q = (UINT32*)buffer; ++ BYTE *p; ++ ++ i = 0; ++ while (end - (BYTE*)q >= 12) ++ { ++ UINT32 v[4], k; ++ v[0] = q[0] << 8; ++ v[1] = q[1] << 16 | (q[0] >> 16 & ~0xff); ++ v[2] = q[2] << 24 | (q[1] >> 8 & ~0xff); ++ v[3] = q[2] & ~0xff; ++ for (k = 0; k < 4; k++) ++ { ++ v[k] = (INT32)((INT32)v[k] * vol[i]); ++ if (++i == channels) i = 0; ++ } ++ *q++ = v[0] >> 8 | (v[1] & ~0xff) << 16; ++ *q++ = v[1] >> 16 | (v[2] & ~0xff) << 8; ++ *q++ = v[2] >> 24 | (v[3] & ~0xff); ++ } ++ p = (BYTE*)q; ++ while (p != end) ++ { ++ UINT32 v = (INT32)((INT32)(p[0] << 8 | p[1] << 16 | p[2] << 24) * vol[i]); ++ *p++ = v >> 8 & 0xff; ++ *p++ = v >> 16 & 0xff; ++ *p++ = v >> 24; ++ if (++i == channels) i = 0; ++ } ++ break; ++ } ++#endif ++ case PA_SAMPLE_U8: ++ { ++ UINT8 *p = (UINT8*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ p[i] = (int)((p[i] - 128) * vol[i]) + 128; ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ case PA_SAMPLE_ALAW: ++ { ++ UINT8 *p = (UINT8*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ p[i] = mult_alaw_sample(p[i], vol[i]); ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ case PA_SAMPLE_ULAW: ++ { ++ UINT8 *p = (UINT8*)buffer; ++ do ++ { ++ for (i = 0; i < channels; i++) ++ p[i] = mult_ulaw_sample(p[i], vol[i]); ++ p += i; ++ } while ((BYTE*)p != end); ++ break; ++ } ++ default: ++ TRACE("Unhandled format %i, not adjusting volume.\n", This->ss.format); ++ break; ++ } ++ ++write: ++ return pa_stream_write(This->stream, buffer, bytes, ++ (flags & WINEPULSE_WRITE_NOFREE) ? pulse_free_noop : NULL, ++ 0, PA_SEEK_RELATIVE); + } + +-static void set_stream_volumes(ACImpl *This) ++static void dump_attr(const pa_buffer_attr *attr) { ++ TRACE("maxlength: %u\n", attr->maxlength); ++ TRACE("minreq: %u\n", attr->minreq); ++ TRACE("fragsize: %u\n", attr->fragsize); ++ TRACE("tlength: %u\n", attr->tlength); ++ TRACE("prebuf: %u\n", attr->prebuf); ++} ++ ++static void pulse_op_cb(pa_stream *s, int success, void *user) { ++ TRACE("Success: %i\n", success); ++ *(int*)user = success; ++ pthread_cond_broadcast(&pulse_cond); ++} ++ ++static void pulse_attr_update(pa_stream *s, void *user) { ++ const pa_buffer_attr *attr = pa_stream_get_buffer_attr(s); ++ TRACE("New attributes or device moved:\n"); ++ dump_attr(attr); ++} ++ ++/* Here's the buffer setup: ++ * ++ * vvvvvvvv sent to HW already ++ * vvvvvvvv in Pulse buffer but rewindable ++ * [dddddddddddddddd] Pulse buffer ++ * [dddddddddddddddd--------] mmdevapi buffer ++ * ^^^^^^^^^^^^^^^^ pad ++ * ^ lcl_offs_bytes ++ * ^^^^^^^^^ held_bytes ++ * ^ wri_offs_bytes ++ * ++ * GetCurrentPadding is pad ++ * ++ * During pulse_wr_callback, we decrement pad, fill Pulse buffer, and move ++ * lcl_offs forward ++ * ++ * During Stop, we flush the Pulse buffer ++ */ ++static void pulse_wr_callback(pa_stream *s, size_t bytes, void *userdata) + { +- struct set_volumes_params params; +- params.stream = This->pulse_stream; +- params.master_volume = This->session->mute ? 0.0f : This->session->master_vol; +- params.volumes = This->vol; +- params.session_volumes = This->session->channel_vols; +- pulse_call(set_volumes, ¶ms); ++ ACImpl *This = userdata; ++ UINT32 oldpad = This->pad; ++ ++ if(This->local_buffer){ ++ UINT32 to_write; ++ BYTE *buf = This->local_buffer + This->lcl_offs_bytes; ++ ++ if(This->pad > bytes){ ++ This->clock_written += bytes; ++ This->pad -= bytes; ++ }else{ ++ This->clock_written += This->pad; ++ This->pad = 0; ++ } ++ ++ bytes = min(bytes, This->held_bytes); ++ ++ if(This->lcl_offs_bytes + bytes > This->bufsize_bytes){ ++ to_write = This->bufsize_bytes - This->lcl_offs_bytes; ++ TRACE("writing small chunk of %u bytes\n", to_write); ++ write_buffer(This, buf, to_write, 0); ++ This->held_bytes -= to_write; ++ to_write = bytes - to_write; ++ This->lcl_offs_bytes = 0; ++ buf = This->local_buffer; ++ }else ++ to_write = bytes; ++ ++ TRACE("writing main chunk of %u bytes\n", to_write); ++ write_buffer(This, buf, to_write, 0); ++ This->lcl_offs_bytes += to_write; ++ This->lcl_offs_bytes %= This->bufsize_bytes; ++ This->held_bytes -= to_write; ++ }else{ ++ if (bytes < This->bufsize_bytes) ++ This->pad = This->bufsize_bytes - bytes; ++ else ++ This->pad = 0; ++ ++ if (oldpad == This->pad) ++ return; ++ ++ assert(oldpad > This->pad); ++ ++ This->clock_written += oldpad - This->pad; ++ TRACE("New pad: %zu (-%zu)\n", This->pad / pa_frame_size(&This->ss), (oldpad - This->pad) / pa_frame_size(&This->ss)); ++ } ++ ++ if (This->event) ++ SetEvent(This->event); ++} ++ ++static void pulse_underflow_callback(pa_stream *s, void *userdata) ++{ ++ WARN("Underflow\n"); ++} ++ ++/* Latency is periodically updated even when nothing is played, ++ * because of PA_STREAM_AUTO_TIMING_UPDATE so use it as timer ++ * ++ * Perfect for passing all tests :) ++ */ ++static void pulse_latency_callback(pa_stream *s, void *userdata) ++{ ++ ACImpl *This = userdata; ++ if (!This->pad && This->event) ++ SetEvent(This->event); ++} ++ ++static void pulse_started_callback(pa_stream *s, void *userdata) ++{ ++ TRACE("(Re)started playing\n"); ++} ++ ++static void pulse_rd_loop(ACImpl *This, size_t bytes) ++{ ++ while (bytes >= This->capture_period) { ++ ACPacket *p, *next; ++ LARGE_INTEGER stamp, freq; ++ BYTE *dst, *src; ++ size_t src_len, copy, rem = This->capture_period; ++ if (!(p = (ACPacket*)list_head(&This->packet_free_head))) { ++ p = (ACPacket*)list_head(&This->packet_filled_head); ++ if (!p->discont) { ++ next = (ACPacket*)p->entry.next; ++ next->discont = 1; ++ } else ++ p = (ACPacket*)list_tail(&This->packet_filled_head); ++ assert(This->pad == This->bufsize_bytes); ++ } else { ++ assert(This->pad < This->bufsize_bytes); ++ This->pad += This->capture_period; ++ assert(This->pad <= This->bufsize_bytes); ++ } ++ QueryPerformanceCounter(&stamp); ++ QueryPerformanceFrequency(&freq); ++ p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; ++ p->discont = 0; ++ list_remove(&p->entry); ++ list_add_tail(&This->packet_filled_head, &p->entry); ++ ++ dst = p->data; ++ while (rem) { ++ if (This->peek_len) { ++ copy = min(rem, This->peek_len - This->peek_ofs); ++ ++ memcpy(dst, This->peek_buffer + This->peek_ofs, copy); ++ ++ rem -= copy; ++ dst += copy; ++ This->peek_ofs += copy; ++ if(This->peek_len == This->peek_ofs) ++ This->peek_len = 0; ++ } else { ++ pa_stream_peek(This->stream, (const void**)&src, &src_len); ++ ++ copy = min(rem, src_len); ++ ++ memcpy(dst, src, rem); ++ ++ dst += copy; ++ rem -= copy; ++ ++ if (copy < src_len) { ++ if (src_len > This->peek_buffer_len) { ++ HeapFree(GetProcessHeap(), 0, This->peek_buffer); ++ This->peek_buffer = HeapAlloc(GetProcessHeap(), 0, src_len); ++ This->peek_buffer_len = src_len; ++ } ++ ++ memcpy(This->peek_buffer, src + copy, src_len - copy); ++ This->peek_len = src_len - copy; ++ This->peek_ofs = 0; ++ } ++ ++ pa_stream_drop(This->stream); ++ } ++ } ++ ++ bytes -= This->capture_period; ++ } ++} ++ ++static void pulse_rd_drop(ACImpl *This, size_t bytes) ++{ ++ while (bytes >= This->capture_period) { ++ size_t src_len, copy, rem = This->capture_period; ++ while (rem) { ++ const void *src; ++ pa_stream_peek(This->stream, &src, &src_len); ++ assert(src_len); ++ assert(This->peek_ofs < src_len); ++ src_len -= This->peek_ofs; ++ assert(src_len <= bytes); ++ ++ copy = rem; ++ if (copy > src_len) ++ copy = src_len; ++ ++ src_len -= copy; ++ rem -= copy; ++ ++ if (!src_len) { ++ This->peek_ofs = 0; ++ pa_stream_drop(This->stream); ++ } else ++ This->peek_ofs += copy; ++ bytes -= copy; ++ } ++ } ++} ++ ++static void pulse_rd_callback(pa_stream *s, size_t bytes, void *userdata) ++{ ++ ACImpl *This = userdata; ++ ++ TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(s)->fragsize); ++ assert(bytes >= This->peek_ofs); ++ bytes -= This->peek_ofs; ++ if (bytes < This->capture_period) ++ return; ++ ++ if (This->started) ++ pulse_rd_loop(This, bytes); ++ else ++ pulse_rd_drop(This, bytes); ++ ++ if (This->event) ++ SetEvent(This->event); ++} ++ ++static HRESULT pulse_stream_connect(ACImpl *This, UINT32 period_bytes) { ++ int ret; ++ char buffer[64]; ++ static LONG number; ++ pa_buffer_attr attr; ++ if (This->stream) { ++ pa_stream_disconnect(This->stream); ++ while (pa_stream_get_state(This->stream) == PA_STREAM_READY) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_stream_unref(This->stream); ++ } ++ ret = InterlockedIncrement(&number); ++ sprintf(buffer, "audio stream #%i", ret); ++ This->stream = pa_stream_new(pulse_ctx, buffer, &This->ss, &This->map); ++ ++ if (!This->stream) { ++ WARN("pa_stream_new returned error %i\n", pa_context_errno(pulse_ctx)); ++ return AUDCLNT_E_ENDPOINT_CREATE_FAILED; ++ } ++ ++ pa_stream_set_state_callback(This->stream, pulse_stream_state, This); ++ pa_stream_set_buffer_attr_callback(This->stream, pulse_attr_update, This); ++ pa_stream_set_moved_callback(This->stream, pulse_attr_update, This); ++ ++ /* PulseAudio will fill in correct values */ ++ attr.minreq = attr.fragsize = period_bytes; ++ attr.maxlength = attr.tlength = This->bufsize_bytes; ++ attr.prebuf = pa_frame_size(&This->ss); ++ dump_attr(&attr); ++ if (This->dataflow == eRender) ++ ret = pa_stream_connect_playback(This->stream, NULL, &attr, ++ PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_AUTO_TIMING_UPDATE|PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_EARLY_REQUESTS, NULL, NULL); ++ else ++ ret = pa_stream_connect_record(This->stream, NULL, &attr, ++ PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_AUTO_TIMING_UPDATE|PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_EARLY_REQUESTS); ++ if (ret < 0) { ++ WARN("Returns %i\n", ret); ++ return AUDCLNT_E_ENDPOINT_CREATE_FAILED; ++ } ++ while (pa_stream_get_state(This->stream) == PA_STREAM_CREATING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ if (pa_stream_get_state(This->stream) != PA_STREAM_READY) ++ return AUDCLNT_E_ENDPOINT_CREATE_FAILED; ++ ++ if (This->dataflow == eRender) { ++ pa_stream_set_write_callback(This->stream, pulse_wr_callback, This); ++ pa_stream_set_underflow_callback(This->stream, pulse_underflow_callback, This); ++ pa_stream_set_started_callback(This->stream, pulse_started_callback, This); ++ } else ++ pa_stream_set_read_callback(This->stream, pulse_rd_callback, This); ++ return S_OK; + } + + HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID **keys, +@@ -301,19 +1181,17 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, const WCHAR ***ids, GUID ** + + int WINAPI AUDDRV_GetPriority(void) + { +- struct test_connect_params params; +- char *name; +- +- params.name = name = get_application_name(); +- params.config = &pulse_config; +- pulse_call(test_connect, ¶ms); +- free(name); +- return SUCCEEDED(params.result) ? Priority_Preferred : Priority_Unavailable; ++ HRESULT hr; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_test_connect(); ++ pthread_mutex_unlock(&pulse_lock); ++ return SUCCEEDED(hr) ? Priority_Preferred : Priority_Unavailable; + } + + HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) + { + ACImpl *This; ++ int i; + EDataFlow dataflow; + HRESULT hr; + +@@ -331,7 +1209,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + if (!This) + return E_OUTOFMEMORY; + +- This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; ++ This->IAudioClient2_iface.lpVtbl = &AudioClient2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; +@@ -339,24 +1217,26 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient + This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; + This->dataflow = dataflow; + This->parent = dev; ++ for (i = 0; i < PA_CHANNELS_MAX; ++i) ++ This->vol[i] = 1.f; + +- hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal); ++ hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient2_iface, &This->marshal); + if (hr) { + HeapFree(GetProcessHeap(), 0, This); + return hr; + } + IMMDevice_AddRef(This->parent); + +- *out = (IAudioClient *)&This->IAudioClient3_iface; +- IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ *out = (IAudioClient *)&This->IAudioClient2_iface; ++ IAudioClient2_AddRef(&This->IAudioClient2_iface); + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient2 *iface, + REFIID riid, void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + +@@ -366,8 +1246,7 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + *ppv = NULL; + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioClient) || +- IsEqualIID(riid, &IID_IAudioClient2) || +- IsEqualIID(riid, &IID_IAudioClient3)) ++ IsEqualIID(riid, &IID_IAudioClient2)) + *ppv = iface; + if (*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); +@@ -381,31 +1260,39 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient3 *iface, + return E_NOINTERFACE; + } + +-static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_AddRef(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedIncrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + return ref; + } + +-static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) ++static ULONG WINAPI AudioClient_Release(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + ULONG ref; + ref = InterlockedDecrement(&This->ref); + TRACE("(%p) Refcount now %u\n", This, ref); + if (!ref) { +- if (This->pulse_stream) { +- pulse_release_stream(This->pulse_stream, This->timer); +- This->pulse_stream = NULL; +- EnterCriticalSection(&session_cs); ++ if (This->stream) { ++ pthread_mutex_lock(&pulse_lock); ++ if (PA_STREAM_IS_GOOD(pa_stream_get_state(This->stream))) { ++ pa_stream_disconnect(This->stream); ++ while (PA_STREAM_IS_GOOD(pa_stream_get_state(This->stream))) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ } ++ pa_stream_unref(This->stream); ++ This->stream = NULL; + list_remove(&This->entry); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + } + IUnknown_Release(This->marshal); + IMMDevice_Release(This->parent); ++ HeapFree(GetProcessHeap(), 0, This->tmp_buffer); ++ HeapFree(GetProcessHeap(), 0, This->peek_buffer); ++ HeapFree(GetProcessHeap(), 0, This->local_buffer); + HeapFree(GetProcessHeap(), 0, This); + } + return ref; +@@ -466,6 +1353,32 @@ static WAVEFORMATEX *clone_format(const WAVEFORMATEX *fmt) + return ret; + } + ++static DWORD get_channel_mask(unsigned int channels) ++{ ++ switch(channels) { ++ case 0: ++ return 0; ++ case 1: ++ return KSAUDIO_SPEAKER_MONO; ++ case 2: ++ return KSAUDIO_SPEAKER_STEREO; ++ case 3: ++ return KSAUDIO_SPEAKER_STEREO | SPEAKER_LOW_FREQUENCY; ++ case 4: ++ return KSAUDIO_SPEAKER_QUAD; /* not _SURROUND */ ++ case 5: ++ return KSAUDIO_SPEAKER_QUAD | SPEAKER_LOW_FREQUENCY; ++ case 6: ++ return KSAUDIO_SPEAKER_5POINT1; /* not 5POINT1_SURROUND */ ++ case 7: ++ return KSAUDIO_SPEAKER_5POINT1 | SPEAKER_BACK_CENTER; ++ case 8: ++ return KSAUDIO_SPEAKER_7POINT1_SURROUND; /* Vista deprecates 7POINT1 */ ++ } ++ FIXME("Unknown speaker configuration: %u\n", channels); ++ return 0; ++} ++ + static void session_init_vols(AudioSession *session, UINT channels) + { + if (session->channel_count < channels) { +@@ -545,24 +1458,127 @@ static HRESULT get_audio_session(const GUID *sessionguid, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ++static HRESULT pulse_spec_from_waveformat(ACImpl *This, const WAVEFORMATEX *fmt) ++{ ++ pa_channel_map_init(&This->map); ++ This->ss.rate = fmt->nSamplesPerSec; ++ This->ss.format = PA_SAMPLE_INVALID; ++ ++ switch(fmt->wFormatTag) { ++ case WAVE_FORMAT_IEEE_FLOAT: ++ if (!fmt->nChannels || fmt->nChannels > 2 || fmt->wBitsPerSample != 32) ++ break; ++ This->ss.format = PA_SAMPLE_FLOAT32LE; ++ pa_channel_map_init_auto(&This->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); ++ break; ++ case WAVE_FORMAT_PCM: ++ if (!fmt->nChannels || fmt->nChannels > 2) ++ break; ++ if (fmt->wBitsPerSample == 8) ++ This->ss.format = PA_SAMPLE_U8; ++ else if (fmt->wBitsPerSample == 16) ++ This->ss.format = PA_SAMPLE_S16LE; ++ else ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ pa_channel_map_init_auto(&This->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); ++ break; ++ case WAVE_FORMAT_EXTENSIBLE: { ++ WAVEFORMATEXTENSIBLE *wfe = (WAVEFORMATEXTENSIBLE*)fmt; ++ DWORD mask = wfe->dwChannelMask; ++ DWORD i = 0, j; ++ if (fmt->cbSize != (sizeof(*wfe) - sizeof(*fmt)) && fmt->cbSize != sizeof(*wfe)) ++ break; ++ if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) && ++ (!wfe->Samples.wValidBitsPerSample || wfe->Samples.wValidBitsPerSample == 32) && ++ fmt->wBitsPerSample == 32) ++ This->ss.format = PA_SAMPLE_FLOAT32LE; ++ else if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)) { ++ DWORD valid = wfe->Samples.wValidBitsPerSample; ++ if (!valid) ++ valid = fmt->wBitsPerSample; ++ if (!valid || valid > fmt->wBitsPerSample) ++ break; ++ switch (fmt->wBitsPerSample) { ++ case 8: ++ if (valid == 8) ++ This->ss.format = PA_SAMPLE_U8; ++ break; ++ case 16: ++ if (valid == 16) ++ This->ss.format = PA_SAMPLE_S16LE; ++ break; ++ case 24: ++ if (valid == 24) ++ This->ss.format = PA_SAMPLE_S24LE; ++ break; ++ case 32: ++ if (valid == 24) ++ This->ss.format = PA_SAMPLE_S24_32LE; ++ else if (valid == 32) ++ This->ss.format = PA_SAMPLE_S32LE; ++ break; ++ default: ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ } ++ This->map.channels = fmt->nChannels; ++ if (!mask || (mask & (SPEAKER_ALL|SPEAKER_RESERVED))) ++ mask = get_channel_mask(fmt->nChannels); ++ for (j = 0; j < ARRAY_SIZE(pulse_pos_from_wfx) && i < fmt->nChannels; ++j) { ++ if (mask & (1 << j)) ++ This->map.map[i++] = pulse_pos_from_wfx[j]; ++ } ++ ++ /* Special case for mono since pulse appears to map it differently */ ++ if (mask == SPEAKER_FRONT_CENTER) ++ This->map.map[0] = PA_CHANNEL_POSITION_MONO; ++ ++ if (i < fmt->nChannels || (mask & SPEAKER_RESERVED)) { ++ This->map.channels = 0; ++ ERR("Invalid channel mask: %i/%i and %x(%x)\n", i, fmt->nChannels, mask, wfe->dwChannelMask); ++ break; ++ } ++ break; ++ } ++ case WAVE_FORMAT_ALAW: ++ case WAVE_FORMAT_MULAW: ++ if (fmt->wBitsPerSample != 8) { ++ FIXME("Unsupported bpp %u for LAW\n", fmt->wBitsPerSample); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ if (fmt->nChannels != 1 && fmt->nChannels != 2) { ++ FIXME("Unsupported channels %u for LAW\n", fmt->nChannels); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ This->ss.format = fmt->wFormatTag == WAVE_FORMAT_MULAW ? PA_SAMPLE_ULAW : PA_SAMPLE_ALAW; ++ pa_channel_map_init_auto(&This->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); ++ break; ++ default: ++ WARN("Unhandled tag %x\n", fmt->wFormatTag); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ This->ss.channels = This->map.channels; ++ if (!pa_channel_map_valid(&This->map) || This->ss.format == PA_SAMPLE_INVALID) { ++ ERR("Invalid format! Channel spec valid: %i, format: %i\n", pa_channel_map_valid(&This->map), This->ss.format); ++ return AUDCLNT_E_UNSUPPORTED_FORMAT; ++ } ++ return S_OK; ++} ++ ++static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, DWORD flags, REFERENCE_TIME duration, + REFERENCE_TIME period, const WAVEFORMATEX *fmt, + const GUID *sessionguid) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct create_stream_params params; +- unsigned int i, channel_count; +- struct pulse_stream *stream; +- char *name; +- HRESULT hr; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; ++ UINT period_bytes; + + TRACE("(%p)->(%x, %x, %s, %s, %p, %s)\n", This, mode, flags, + wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid)); + + if (!fmt) + return E_POINTER; +- dump_fmt(fmt); + + if (mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE) + return E_INVALIDARG; +@@ -583,134 +1599,223 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, + return E_INVALIDARG; + } + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + +- if (This->pulse_stream) { +- LeaveCriticalSection(&session_cs); +- return AUDCLNT_E_ALREADY_INITIALIZED; +- } +- +- if (!pulse_thread) +- { +- HANDLE event = CreateEventW(NULL, TRUE, FALSE, NULL); +- if (!(pulse_thread = CreateThread(NULL, 0, pulse_mainloop_thread, event, 0, NULL))) +- { +- ERR("Failed to create mainloop thread.\n"); +- LeaveCriticalSection(&session_cs); +- CloseHandle(event); +- return E_FAIL; +- } +- SetThreadPriority(pulse_thread, THREAD_PRIORITY_TIME_CRITICAL); +- WaitForSingleObject(event, INFINITE); +- CloseHandle(event); +- } +- +- params.name = name = get_application_name(); +- params.dataflow = This->dataflow; +- params.mode = mode; +- params.flags = flags; +- params.duration = duration; +- params.fmt = fmt; +- params.stream = &stream; +- params.channel_count = &channel_count; +- pulse_call(create_stream, ¶ms); +- free(name); +- if (FAILED(hr = params.result)) +- { +- LeaveCriticalSection(&session_cs); ++ hr = pulse_connect(); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); + return hr; + } + +- if (!(This->vol = malloc(channel_count * sizeof(*This->vol)))) +- { +- pulse_release_stream(stream, NULL); +- LeaveCriticalSection(&session_cs); +- return E_OUTOFMEMORY; ++ if (This->stream) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_ALREADY_INITIALIZED; + } +- for (i = 0; i < channel_count; i++) +- This->vol[i] = 1.f; + +- hr = get_audio_session(sessionguid, This->parent, channel_count, &This->session); ++ hr = pulse_spec_from_waveformat(This, fmt); ++ TRACE("Obtaining format returns %08x\n", hr); ++ dump_fmt(fmt); ++ + if (FAILED(hr)) +- { +- free(This->vol); +- This->vol = NULL; +- LeaveCriticalSection(&session_cs); +- pulse_release_stream(stream, NULL); +- return E_OUTOFMEMORY; +- } ++ goto exit; + +- This->pulse_stream = stream; +- This->channel_count = channel_count; +- list_add_tail(&This->session->clients, &This->entry); +- set_stream_volumes(This); ++ if (mode == AUDCLNT_SHAREMODE_SHARED) { ++ REFERENCE_TIME def = pulse_def_period[This->dataflow == eCapture]; ++ REFERENCE_TIME min = pulse_min_period[This->dataflow == eCapture]; + +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ /* Switch to low latency mode if below 2 default periods, ++ * which is 20 ms by default, this will increase the amount ++ * of interrupts but allows very low latency. In dsound I ++ * managed to get a total latency of ~8ms, which is well below ++ * default ++ */ ++ if (duration < 2 * def) ++ period = min; ++ else ++ period = def; ++ if (duration < 2 * period) ++ duration = 2 * period; ++ ++ /* Uh oh, really low latency requested.. */ ++ if (duration <= 2 * period) ++ period /= 2; ++ } ++ period_bytes = pa_frame_size(&This->ss) * MulDiv(period, This->ss.rate, 10000000); ++ ++ if (duration < 20000000) ++ This->bufsize_frames = ceil((duration / 10000000.) * fmt->nSamplesPerSec); ++ else ++ This->bufsize_frames = 2 * fmt->nSamplesPerSec; ++ This->bufsize_bytes = This->bufsize_frames * pa_frame_size(&This->ss); ++ ++ This->share = mode; ++ This->flags = flags; ++ hr = pulse_stream_connect(This, period_bytes); ++ if (SUCCEEDED(hr)) { ++ UINT32 unalign; ++ const pa_buffer_attr *attr = pa_stream_get_buffer_attr(This->stream); ++ This->attr = *attr; ++ /* Update frames according to new size */ ++ dump_attr(attr); ++ if (This->dataflow == eRender) { ++ if (attr->tlength < This->bufsize_bytes) { ++ TRACE("PulseAudio buffer too small (%u < %u), using tmp buffer\n", attr->tlength, This->bufsize_bytes); ++ ++ This->local_buffer = HeapAlloc(GetProcessHeap(), 0, This->bufsize_bytes); ++ if(!This->local_buffer) ++ hr = E_OUTOFMEMORY; ++ } ++ } else { ++ UINT32 i, capture_packets; ++ ++ This->capture_period = period_bytes = attr->fragsize; ++ if ((unalign = This->bufsize_bytes % period_bytes)) ++ This->bufsize_bytes += period_bytes - unalign; ++ This->bufsize_frames = This->bufsize_bytes / pa_frame_size(&This->ss); ++ ++ capture_packets = This->bufsize_bytes / This->capture_period; ++ ++ This->local_buffer = HeapAlloc(GetProcessHeap(), 0, This->bufsize_bytes + capture_packets * sizeof(ACPacket)); ++ if (!This->local_buffer) ++ hr = E_OUTOFMEMORY; ++ else { ++ ACPacket *cur_packet = (ACPacket*)((char*)This->local_buffer + This->bufsize_bytes); ++ BYTE *data = This->local_buffer; ++ silence_buffer(This->ss.format, This->local_buffer, This->bufsize_bytes); ++ list_init(&This->packet_free_head); ++ list_init(&This->packet_filled_head); ++ for (i = 0; i < capture_packets; ++i, ++cur_packet) { ++ list_add_tail(&This->packet_free_head, &cur_packet->entry); ++ cur_packet->data = data; ++ data += This->capture_period; ++ } ++ assert(!This->capture_period || This->bufsize_bytes == This->capture_period * capture_packets); ++ assert(!capture_packets || data - This->bufsize_bytes == This->local_buffer); ++ } ++ } ++ } ++ if (SUCCEEDED(hr)) ++ hr = get_audio_session(sessionguid, This->parent, fmt->nChannels, &This->session); ++ if (SUCCEEDED(hr)) ++ list_add_tail(&This->session->clients, &This->entry); ++ ++exit: ++ if (FAILED(hr)) { ++ HeapFree(GetProcessHeap(), 0, This->local_buffer); ++ This->local_buffer = NULL; ++ if (This->stream) { ++ pa_stream_disconnect(This->stream); ++ pa_stream_unref(This->stream); ++ This->stream = NULL; ++ } ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct get_buffer_size_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, out); + + if (!out) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.size = out; +- pulse_call(get_buffer_size, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (SUCCEEDED(hr)) ++ *out = This->bufsize_frames; ++ pthread_mutex_unlock(&pulse_lock); ++ ++ return hr; + } + +-static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetStreamLatency(IAudioClient2 *iface, + REFERENCE_TIME *latency) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct get_latency_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ const pa_buffer_attr *attr; ++ REFERENCE_TIME lat; ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, latency); + + if (!latency) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.latency = latency; +- pulse_call(get_latency, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ attr = pa_stream_get_buffer_attr(This->stream); ++ if (This->dataflow == eRender){ ++ lat = attr->minreq / pa_frame_size(&This->ss); ++ lat += pulse_def_period[0]; ++ }else ++ lat = attr->fragsize / pa_frame_size(&This->ss); ++ *latency = 10000000; ++ *latency *= lat; ++ *latency /= This->ss.rate; ++ pthread_mutex_unlock(&pulse_lock); ++ TRACE("Latency: %u ms\n", (DWORD)(*latency / 10000)); ++ return S_OK; ++} ++ ++static void ACImpl_GetRenderPad(ACImpl *This, UINT32 *out) ++{ ++ *out = This->pad / pa_frame_size(&This->ss); ++} ++ ++static void ACImpl_GetCapturePad(ACImpl *This, UINT32 *out) ++{ ++ ACPacket *packet = This->locked_ptr; ++ if (!packet && !list_empty(&This->packet_filled_head)) { ++ packet = (ACPacket*)list_head(&This->packet_filled_head); ++ This->locked_ptr = packet; ++ list_remove(&packet->entry); ++ } ++ if (out) ++ *out = This->pad / pa_frame_size(&This->ss); + } + +-static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetCurrentPadding(IAudioClient2 *iface, + UINT32 *out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct get_current_padding_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, out); + + if (!out) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.padding = out; +- pulse_call(get_current_padding, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (This->dataflow == eRender) ++ ACImpl_GetRenderPad(This, out); ++ else ++ ACImpl_GetCapturePad(This, out); ++ pthread_mutex_unlock(&pulse_lock); ++ ++ TRACE("%p Pad: %u ms (%u)\n", This, MulDiv(*out, 1000, This->ss.rate), *out); ++ return S_OK; + } + +-static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient2 *iface, + AUDCLNT_SHAREMODE mode, const WAVEFORMATEX *fmt, + WAVEFORMATEX **out) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + HRESULT hr = S_OK; + WAVEFORMATEX *closest = NULL; + BOOL exclusive; +@@ -859,27 +1964,28 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient3 *iface, + return hr; + } + +-static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient2 *iface, + WAVEFORMATEX **pwfx) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ WAVEFORMATEXTENSIBLE *fmt = &pulse_fmt[This->dataflow == eCapture]; + + TRACE("(%p)->(%p)\n", This, pwfx); + + if (!pwfx) + return E_POINTER; + +- *pwfx = clone_format(&pulse_config.modes[This->dataflow == eCapture].format.Format); ++ *pwfx = clone_format(&fmt->Format); + if (!*pwfx) + return E_OUTOFMEMORY; + dump_fmt(*pwfx); + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient2 *iface, + REFERENCE_TIME *defperiod, REFERENCE_TIME *minperiod) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); + +@@ -887,90 +1993,187 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, + return E_POINTER; + + if (defperiod) +- *defperiod = pulse_config.modes[This->dataflow == eCapture].def_period; ++ *defperiod = pulse_def_period[This->dataflow == eCapture]; + if (minperiod) +- *minperiod = pulse_config.modes[This->dataflow == eCapture].min_period; ++ *minperiod = pulse_min_period[This->dataflow == eCapture]; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Start(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct start_params params; +- HRESULT hr; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; ++ int success; ++ pa_operation *o; + + TRACE("(%p)\n", This); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- pulse_call(start, ¶ms); +- if (FAILED(hr = params.result)) ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); + return hr; ++ } + +- if (!This->timer) { +- This->timer = CreateThread(NULL, 0, pulse_timer_cb, This, 0, NULL); +- SetThreadPriority(This->timer, THREAD_PRIORITY_TIME_CRITICAL); ++ if ((This->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !This->event) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_EVENTHANDLE_NOT_SET; + } + +- return S_OK; ++ if (This->started) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_NOT_STOPPED; ++ } ++ ++ if (pa_stream_is_corked(This->stream)) { ++ o = pa_stream_cork(This->stream, 0, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } else ++ success = 0; ++ if (!success) ++ hr = E_FAIL; ++ } ++ ++ if (SUCCEEDED(hr)) { ++ This->started = TRUE; ++ if (This->dataflow == eRender && This->event) ++ pa_stream_set_latency_update_callback(This->stream, pulse_latency_callback, This); ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Stop(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct stop_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; ++ pa_operation *o; ++ int success; + + TRACE("(%p)\n", This); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (!This->started) { ++ pthread_mutex_unlock(&pulse_lock); ++ return S_FALSE; ++ } + +- params.stream = This->pulse_stream; +- pulse_call(stop, ¶ms); +- return params.result; ++ if (This->dataflow == eRender) { ++ o = pa_stream_cork(This->stream, 1, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } else ++ success = 0; ++ if (!success) ++ hr = E_FAIL; ++ } ++ if (SUCCEEDED(hr)) { ++ This->started = FALSE; ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface) ++static HRESULT WINAPI AudioClient_Reset(IAudioClient2 *iface) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct reset_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr = S_OK; + + TRACE("(%p)\n", This); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (This->started) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_NOT_STOPPED; ++ } ++ ++ if (This->locked) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_BUFFER_OPERATION_PENDING; ++ } ++ ++ if (This->dataflow == eRender) { ++ /* If there is still data in the render buffer it needs to be removed from the server */ ++ int success = 0; ++ if (This->pad) { ++ pa_operation *o = pa_stream_flush(This->stream, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } ++ } ++ if (success || !This->pad){ ++ This->clock_lastpos = This->clock_written = This->pad = 0; ++ This->wri_offs_bytes = This->lcl_offs_bytes = This->held_bytes = 0; ++ } ++ } else { ++ ACPacket *p; ++ This->clock_written += This->pad; ++ This->pad = 0; ++ ++ if ((p = This->locked_ptr)) { ++ This->locked_ptr = NULL; ++ list_add_tail(&This->packet_free_head, &p->entry); ++ } ++ list_move_tail(&This->packet_free_head, &This->packet_filled_head); ++ } ++ pthread_mutex_unlock(&pulse_lock); + +- params.stream = This->pulse_stream; +- pulse_call(reset, ¶ms); +- return params.result; ++ return hr; + } + +-static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient2 *iface, + HANDLE event) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- struct set_event_handle_params params; ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, event); + + if (!event) + return E_INVALIDARG; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.event = event; +- pulse_call(set_event_handle, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ if (!(This->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) ++ hr = AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED; ++ else if (This->event) ++ hr = HRESULT_FROM_WIN32(ERROR_INVALID_NAME); ++ else ++ This->event = event; ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + +-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, ++static HRESULT WINAPI AudioClient_GetService(IAudioClient2 *iface, REFIID riid, + void **ppv) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); ++ HRESULT hr; + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + +@@ -978,8 +2181,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_POINTER; + *ppv = NULL; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ pthread_mutex_unlock(&pulse_lock); ++ if (FAILED(hr)) ++ return hr; + + if (IsEqualIID(riid, &IID_IAudioRenderClient)) { + if (This->dataflow != eRender) +@@ -1018,10 +2224,10 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, + return E_NOINTERFACE; + } + +-static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient2 *iface, + AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(0x%x, %p)\n", This, category, offload_capable); + +@@ -1033,83 +2239,42 @@ static HRESULT WINAPI AudioClient_IsOffloadCapable(IAudioClient3 *iface, + return S_OK; + } + +-static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_SetClientProperties(IAudioClient2 *iface, + const AudioClientProperties *prop) + { +- ACImpl *This = impl_from_IAudioClient3(iface); +- const Win8AudioClientProperties *legacy_prop = (const Win8AudioClientProperties *)prop; ++ ACImpl *This = impl_from_IAudioClient2(iface); + + TRACE("(%p)->(%p)\n", This, prop); + +- if(!legacy_prop) ++ if(!prop) + return E_POINTER; + +- if(legacy_prop->cbSize == sizeof(AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory, +- prop->Options); +- }else if(legacy_prop->cbSize == sizeof(Win8AudioClientProperties)){ +- TRACE("{ bIsOffload: %u, eCategory: 0x%x }\n", +- legacy_prop->bIsOffload, +- legacy_prop->eCategory); +- }else{ +- WARN("Unsupported Size = %d\n", legacy_prop->cbSize); ++ if(prop->cbSize != sizeof(*prop)) + return E_INVALIDARG; +- } + ++ TRACE("{ bIsOffload: %u, eCategory: 0x%x, Options: 0x%x }\n", ++ prop->bIsOffload, ++ prop->eCategory, ++ prop->Options); + +- if(legacy_prop->bIsOffload) ++ if(prop->bIsOffload) + return AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE; + + return S_OK; + } + +-static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient3 *iface, ++static HRESULT WINAPI AudioClient_GetBufferSizeLimits(IAudioClient2 *iface, + const WAVEFORMATEX *format, BOOL event_driven, REFERENCE_TIME *min_duration, + REFERENCE_TIME *max_duration) + { +- ACImpl *This = impl_from_IAudioClient3(iface); ++ ACImpl *This = impl_from_IAudioClient2(iface); + + FIXME("(%p)->(%p, %u, %p, %p)\n", This, format, event_driven, min_duration, max_duration); + + return E_NOTIMPL; + } + +-static HRESULT WINAPI AudioClient_GetSharedModeEnginePeriod(IAudioClient3 *iface, +- const WAVEFORMATEX *format, UINT32 *default_period_frames, UINT32 *unit_period_frames, +- UINT32 *min_period_frames, UINT32 *max_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p, %p, %p, %p)\n", This, format, default_period_frames, unit_period_frames, +- min_period_frames, max_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, +- WAVEFORMATEX **cur_format, UINT32 *cur_period_frames) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames); +- +- return E_NOTIMPL; +-} +- +-static HRESULT WINAPI AudioClient_InitializeSharedAudioStream(IAudioClient3 *iface, +- DWORD flags, UINT32 period_frames, const WAVEFORMATEX *format, +- const GUID *session_guid) +-{ +- ACImpl *This = impl_from_IAudioClient3(iface); +- +- FIXME("(%p)->(0x%x, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid)); +- +- return E_NOTIMPL; +-} +- +-static const IAudioClient3Vtbl AudioClient3_Vtbl = ++static const IAudioClient2Vtbl AudioClient2_Vtbl = + { + AudioClient_QueryInterface, + AudioClient_AddRef, +@@ -1129,9 +2294,6 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = + AudioClient_IsOffloadCapable, + AudioClient_SetClientProperties, + AudioClient_GetBufferSizeLimits, +- AudioClient_GetSharedModeEnginePeriod, +- AudioClient_GetCurrentSharedModeEnginePeriod, +- AudioClient_InitializeSharedAudioStream, + }; + + static HRESULT WINAPI AudioRenderClient_QueryInterface( +@@ -1162,52 +2324,192 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( + static ULONG WINAPI AudioRenderClient_AddRef(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_AddRef(&This->IAudioClient3_iface); ++ return AudioClient_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- return AudioClient_Release(&This->IAudioClient3_iface); ++ return AudioClient_Release(&This->IAudioClient2_iface); ++} ++ ++static void alloc_tmp_buffer(ACImpl *This, UINT32 bytes) ++{ ++ if(This->tmp_buffer_bytes >= bytes) ++ return; ++ ++ HeapFree(GetProcessHeap(), 0, This->tmp_buffer); ++ This->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, bytes); ++ This->tmp_buffer_bytes = bytes; + } + + static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface, + UINT32 frames, BYTE **data) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- struct get_render_buffer_params params; ++ size_t avail, req, bytes = frames * pa_frame_size(&This->ss); ++ UINT32 pad; ++ HRESULT hr = S_OK; ++ int ret = -1; + + TRACE("(%p)->(%u, %p)\n", This, frames, data); + + if (!data) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + *data = NULL; + +- params.stream = This->pulse_stream; +- params.frames = frames; +- params.data = data; +- pulse_call(get_render_buffer, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr) || This->locked) { ++ pthread_mutex_unlock(&pulse_lock); ++ return FAILED(hr) ? hr : AUDCLNT_E_OUT_OF_ORDER; ++ } ++ if (!frames) { ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; ++ } ++ ++ ACImpl_GetRenderPad(This, &pad); ++ avail = This->bufsize_frames - pad; ++ if (avail < frames || bytes > This->bufsize_bytes) { ++ pthread_mutex_unlock(&pulse_lock); ++ WARN("Wanted to write %u, but only %zu available\n", frames, avail); ++ return AUDCLNT_E_BUFFER_TOO_LARGE; ++ } ++ ++ if(This->local_buffer){ ++ if(This->wri_offs_bytes + bytes > This->bufsize_bytes){ ++ alloc_tmp_buffer(This, bytes); ++ *data = This->tmp_buffer; ++ This->locked = -frames; ++ }else{ ++ *data = This->local_buffer + This->wri_offs_bytes; ++ This->locked = frames; ++ } ++ }else{ ++ req = bytes; ++ ret = pa_stream_begin_write(This->stream, &This->locked_ptr, &req); ++ if (ret < 0 || req < bytes) { ++ FIXME("%p Not using pulse locked data: %i %zu/%u %u/%u\n", This, ret, req/pa_frame_size(&This->ss), frames, pad, This->bufsize_frames); ++ if (ret >= 0) ++ pa_stream_cancel_write(This->stream); ++ alloc_tmp_buffer(This, bytes); ++ *data = This->tmp_buffer; ++ This->locked_ptr = NULL; ++ } else ++ *data = This->locked_ptr; ++ ++ This->locked = frames; ++ } ++ ++ silence_buffer(This->ss.format, *data, bytes); ++ ++ pthread_mutex_unlock(&pulse_lock); ++ ++ return hr; ++} ++ ++static void pulse_wrap_buffer(ACImpl *This, BYTE *buffer, UINT32 written_bytes) ++{ ++ UINT32 chunk_bytes = This->bufsize_bytes - This->wri_offs_bytes; ++ ++ if(written_bytes <= chunk_bytes){ ++ memcpy(This->local_buffer + This->wri_offs_bytes, buffer, written_bytes); ++ }else{ ++ memcpy(This->local_buffer + This->wri_offs_bytes, buffer, chunk_bytes); ++ memcpy(This->local_buffer, buffer + chunk_bytes, ++ written_bytes - chunk_bytes); ++ } + } + + static HRESULT WINAPI AudioRenderClient_ReleaseBuffer( + IAudioRenderClient *iface, UINT32 written_frames, DWORD flags) + { + ACImpl *This = impl_from_IAudioRenderClient(iface); +- struct release_render_buffer_params params; ++ UINT32 written_bytes = written_frames * pa_frame_size(&This->ss); + + TRACE("(%p)->(%u, %x)\n", This, written_frames, flags); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; ++ pthread_mutex_lock(&pulse_lock); ++ if (!This->locked || !written_frames) { ++ if (This->locked_ptr) ++ pa_stream_cancel_write(This->stream); ++ This->locked = 0; ++ This->locked_ptr = NULL; ++ pthread_mutex_unlock(&pulse_lock); ++ return written_frames ? AUDCLNT_E_OUT_OF_ORDER : S_OK; ++ } ++ ++ if (This->locked < written_frames) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_INVALID_SIZE; ++ } ++ ++ if(This->local_buffer){ ++ BYTE *buffer; ++ ++ if(This->locked >= 0) ++ buffer = This->local_buffer + This->wri_offs_bytes; ++ else ++ buffer = This->tmp_buffer; ++ ++ if(flags & AUDCLNT_BUFFERFLAGS_SILENT) ++ silence_buffer(This->ss.format, buffer, written_bytes); ++ ++ if(This->locked < 0) ++ pulse_wrap_buffer(This, buffer, written_bytes); ++ ++ This->wri_offs_bytes += written_bytes; ++ This->wri_offs_bytes %= This->bufsize_bytes; ++ ++ This->pad += written_bytes; ++ This->held_bytes += written_bytes; ++ ++ if(This->held_bytes == This->pad){ ++ int e; ++ UINT32 to_write = min(This->attr.tlength, written_bytes); ++ ++ /* nothing in PA, so send data immediately */ ++ ++ TRACE("pre-writing %u bytes\n", to_write); ++ ++ e = write_buffer(This, buffer, to_write, 0); ++ if(e) ++ ERR("pa_stream_write failed: 0x%x\n", e); ++ ++ This->lcl_offs_bytes += to_write; ++ This->lcl_offs_bytes %= This->bufsize_bytes; ++ This->held_bytes -= to_write; ++ } ++ ++ }else{ ++ enum write_buffer_flags wr_flags = 0; ++ ++ if (flags & AUDCLNT_BUFFERFLAGS_SILENT) wr_flags |= WINEPULSE_WRITE_SILENT; ++ if (!This->locked_ptr) wr_flags |= WINEPULSE_WRITE_NOFREE; ++ ++ write_buffer(This, This->locked_ptr ? This->locked_ptr : This->tmp_buffer, written_bytes, wr_flags); ++ This->pad += written_bytes; ++ } + +- params.stream = This->pulse_stream; +- params.written_frames = written_frames; +- params.flags = flags; +- pulse_call(release_render_buffer, ¶ms); +- return params.result; ++ if (!pa_stream_is_corked(This->stream)) { ++ int success; ++ pa_operation *o; ++ o = pa_stream_trigger(This->stream, pulse_op_cb, &success); ++ if (o) { ++ while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } ++ } ++ ++ This->locked = 0; ++ This->locked_ptr = NULL; ++ TRACE("Released %u, pad %zu\n", written_frames, This->pad / pa_frame_size(&This->ss)); ++ assert(This->pad <= This->bufsize_bytes); ++ ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; + } + + static const IAudioRenderClientVtbl AudioRenderClient_Vtbl = { +@@ -1246,13 +2548,13 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( + static ULONG WINAPI AudioCaptureClient_AddRef(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioCaptureClient_Release(IAudioCaptureClient *iface) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, +@@ -1260,63 +2562,98 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface, + UINT64 *qpcpos) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- struct get_capture_buffer_params params; ++ HRESULT hr; ++ ACPacket *packet; + + TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags, + devpos, qpcpos); + + if (!data) + return E_POINTER; ++ + *data = NULL; ++ + if (!frames || !flags) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.data = data; +- params.frames = frames; +- params.flags = flags; +- params.devpos = devpos; +- params.qpcpos = qpcpos; +- pulse_call(get_capture_buffer, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr) || This->locked) { ++ pthread_mutex_unlock(&pulse_lock); ++ return FAILED(hr) ? hr : AUDCLNT_E_OUT_OF_ORDER; ++ } ++ ++ ACImpl_GetCapturePad(This, NULL); ++ if ((packet = This->locked_ptr)) { ++ *frames = This->capture_period / pa_frame_size(&This->ss); ++ *flags = 0; ++ if (packet->discont) ++ *flags |= AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY; ++ if (devpos) { ++ if (packet->discont) ++ *devpos = (This->clock_written + This->capture_period) / pa_frame_size(&This->ss); ++ else ++ *devpos = This->clock_written / pa_frame_size(&This->ss); ++ } ++ if (qpcpos) ++ *qpcpos = packet->qpcpos; ++ *data = packet->data; ++ } ++ else ++ *frames = 0; ++ This->locked = *frames; ++ pthread_mutex_unlock(&pulse_lock); ++ return *frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY; + } + + static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer( + IAudioCaptureClient *iface, UINT32 done) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- struct release_capture_buffer_params params; + + TRACE("(%p)->(%u)\n", This, done); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- params.done = done; +- pulse_call(release_capture_buffer, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ if (!This->locked && done) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_OUT_OF_ORDER; ++ } ++ if (done && This->locked != done) { ++ pthread_mutex_unlock(&pulse_lock); ++ return AUDCLNT_E_INVALID_SIZE; ++ } ++ if (done) { ++ ACPacket *packet = This->locked_ptr; ++ This->locked_ptr = NULL; ++ This->pad -= This->capture_period; ++ if (packet->discont) ++ This->clock_written += 2 * This->capture_period; ++ else ++ This->clock_written += This->capture_period; ++ list_add_tail(&This->packet_free_head, &packet->entry); ++ } ++ This->locked = 0; ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; + } + + static HRESULT WINAPI AudioCaptureClient_GetNextPacketSize( + IAudioCaptureClient *iface, UINT32 *frames) + { + ACImpl *This = impl_from_IAudioCaptureClient(iface); +- struct get_next_packet_size_params params; + + TRACE("(%p)->(%p)\n", This, frames); +- + if (!frames) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.frames = frames; +- pulse_call(get_next_packet_size, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ ACImpl_GetCapturePad(This, NULL); ++ if (This->locked_ptr) ++ *frames = This->capture_period / pa_frame_size(&This->ss); ++ else ++ *frames = 0; ++ pthread_mutex_unlock(&pulse_lock); ++ return S_OK; + } + + static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl = +@@ -1359,50 +2696,73 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface, + static ULONG WINAPI AudioClock_AddRef(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock_Release(IAudioClock *iface) + { + ACImpl *This = impl_from_IAudioClock(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock_GetFrequency(IAudioClock *iface, UINT64 *freq) + { + ACImpl *This = impl_from_IAudioClock(iface); +- struct get_frequency_params params; ++ HRESULT hr; + + TRACE("(%p)->(%p)\n", This, freq); + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- params.freq = freq; +- pulse_call(get_frequency, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (SUCCEEDED(hr)) { ++ *freq = This->ss.rate; ++ if (This->share == AUDCLNT_SHAREMODE_SHARED) ++ *freq *= pa_frame_size(&This->ss); ++ } ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + + static HRESULT WINAPI AudioClock_GetPosition(IAudioClock *iface, UINT64 *pos, + UINT64 *qpctime) + { + ACImpl *This = impl_from_IAudioClock(iface); +- struct get_position_params params; ++ HRESULT hr; + + TRACE("(%p)->(%p, %p)\n", This, pos, qpctime); + + if (!pos) + return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; + +- params.stream = This->pulse_stream; +- params.device = FALSE; +- params.pos = pos; +- params.qpctime = qpctime; +- pulse_call(get_position, ¶ms); +- return params.result; ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) { ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; ++ } ++ ++ *pos = This->clock_written; ++ ++ if (This->share == AUDCLNT_SHAREMODE_EXCLUSIVE) ++ *pos /= pa_frame_size(&This->ss); ++ ++ /* Make time never go backwards */ ++ if (*pos < This->clock_lastpos) ++ *pos = This->clock_lastpos; ++ else ++ This->clock_lastpos = *pos; ++ pthread_mutex_unlock(&pulse_lock); ++ ++ TRACE("%p Position: %u\n", This, (unsigned)*pos); ++ ++ if (qpctime) { ++ LARGE_INTEGER stamp, freq; ++ QueryPerformanceCounter(&stamp); ++ QueryPerformanceFrequency(&freq); ++ *qpctime = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; ++ } ++ ++ return S_OK; + } + + static HRESULT WINAPI AudioClock_GetCharacteristics(IAudioClock *iface, +@@ -1440,34 +2800,23 @@ static HRESULT WINAPI AudioClock2_QueryInterface(IAudioClock2 *iface, + static ULONG WINAPI AudioClock2_AddRef(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioClock2_Release(IAudioClock2 *iface) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioClock2_GetDevicePosition(IAudioClock2 *iface, + UINT64 *pos, UINT64 *qpctime) + { + ACImpl *This = impl_from_IAudioClock2(iface); +- struct get_position_params params; +- +- TRACE("(%p)->(%p, %p)\n", This, pos, qpctime); +- +- if (!pos) +- return E_POINTER; +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- +- params.stream = This->pulse_stream; +- params.device = TRUE; +- params.pos = pos; +- params.qpctime = qpctime; +- pulse_call(get_position, ¶ms); +- return params.result; ++ HRESULT hr = AudioClock_GetPosition(&This->IAudioClock_iface, pos, qpctime); ++ if (SUCCEEDED(hr) && This->share == AUDCLNT_SHAREMODE_SHARED) ++ *pos /= pa_frame_size(&This->ss); ++ return hr; + } + + static const IAudioClock2Vtbl AudioClock2_Vtbl = +@@ -1507,13 +2856,13 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface( + static ULONG WINAPI AudioStreamVolume_AddRef(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_AddRef(&This->IAudioClient3_iface); ++ return IAudioClient2_AddRef(&This->IAudioClient2_iface); + } + + static ULONG WINAPI AudioStreamVolume_Release(IAudioStreamVolume *iface) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); +- return IAudioClient3_Release(&This->IAudioClient3_iface); ++ return IAudioClient2_Release(&This->IAudioClient2_iface); + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelCount( +@@ -1526,7 +2875,7 @@ static HRESULT WINAPI AudioStreamVolume_GetChannelCount( + if (!out) + return E_POINTER; + +- *out = This->channel_count; ++ *out = This->ss.channels; + + return S_OK; + } +@@ -1540,6 +2889,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( + IAudioStreamVolume *iface, UINT32 count, const float *levels) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ HRESULT hr; + int i; + + TRACE("(%p)->(%d, %p)\n", This, count, levels); +@@ -1547,24 +2897,27 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( + if (!levels) + return E_POINTER; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (count != This->channel_count) ++ if (count != This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) ++ goto out; ++ + for (i = 0; i < count; ++i) + This->vol[i] = levels[i]; + +- set_stream_volumes(This); +- LeaveCriticalSection(&session_cs); +- return S_OK; ++out: ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + + static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( + IAudioStreamVolume *iface, UINT32 count, float *levels) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ HRESULT hr; + int i; + + TRACE("(%p)->(%d, %p)\n", This, count, levels); +@@ -1572,59 +2925,63 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( + if (!levels) + return E_POINTER; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (count != This->channel_count) ++ if (count != This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); ++ hr = pulse_stream_valid(This); ++ if (FAILED(hr)) ++ goto out; ++ + for (i = 0; i < count; ++i) + levels[i] = This->vol[i]; +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ ++out: ++ pthread_mutex_unlock(&pulse_lock); ++ return hr; + } + + static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( + IAudioStreamVolume *iface, UINT32 index, float level) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ HRESULT hr; ++ float volumes[PA_CHANNELS_MAX]; + + TRACE("(%p)->(%d, %f)\n", This, index, level); + + if (level < 0.f || level > 1.f) + return E_INVALIDARG; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (index >= This->channel_count) ++ if (index >= This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); +- This->vol[index] = level; +- set_stream_volumes(This); +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ hr = AudioStreamVolume_GetAllVolumes(iface, This->ss.channels, volumes); ++ volumes[index] = level; ++ if (SUCCEEDED(hr)) ++ hr = AudioStreamVolume_SetAllVolumes(iface, This->ss.channels, volumes); ++ return hr; + } + + static HRESULT WINAPI AudioStreamVolume_GetChannelVolume( + IAudioStreamVolume *iface, UINT32 index, float *level) + { + ACImpl *This = impl_from_IAudioStreamVolume(iface); ++ float volumes[PA_CHANNELS_MAX]; ++ HRESULT hr; + + TRACE("(%p)->(%d, %p)\n", This, index, level); + + if (!level) + return E_POINTER; + +- if (!This->pulse_stream) +- return AUDCLNT_E_NOT_INITIALIZED; +- if (index >= This->channel_count) ++ if (index >= This->ss.channels) + return E_INVALIDARG; + +- EnterCriticalSection(&session_cs); +- *level = This->vol[index]; +- LeaveCriticalSection(&session_cs); +- return S_OK; ++ hr = AudioStreamVolume_GetAllVolumes(iface, This->ss.channels, volumes); ++ if (SUCCEEDED(hr)) ++ *level = volumes[index]; ++ return hr; + } + + static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl = +@@ -1657,7 +3014,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) + ret->client = client; + if (client) { + ret->session = client->session; +- AudioClient_AddRef(&client->IAudioClient3_iface); ++ AudioClient_AddRef(&client->IAudioClient2_iface); + } + + return ret; +@@ -1703,7 +3060,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) + if (!ref) { + if (This->client) { + This->client->session_wrapper = NULL; +- AudioClient_Release(&This->client->IAudioClient3_iface); ++ AudioClient_Release(&This->client->IAudioClient2_iface); + } + HeapFree(GetProcessHeap(), 0, This); + } +@@ -1721,20 +3078,13 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, + if (!state) + return NULL_PTR_ERR; + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + if (list_empty(&This->session->clients)) { + *state = AudioSessionStateExpired; + goto out; + } + LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) { +- struct is_started_params params; +- +- if (!client->pulse_stream) +- continue; +- +- params.stream = client->pulse_stream; +- pulse_call(is_started, ¶ms); +- if (params.started) { ++ if (client->started) { + *state = AudioSessionStateActive; + goto out; + } +@@ -1742,7 +3092,7 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, + *state = AudioSessionStateInactive; + + out: +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + return S_OK; + } + +@@ -2106,7 +3456,6 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( + { + AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + + TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); + +@@ -2118,11 +3467,9 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( + + TRACE("PulseAudio does not support session volume control\n"); + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + session->master_vol = level; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + + return S_OK; + } +@@ -2148,18 +3495,13 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, + { + AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + + TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); + + if (context) + FIXME("Notifications not supported yet\n"); + +- EnterCriticalSection(&session_cs); + session->mute = mute; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); + + return S_OK; + } +@@ -2246,7 +3588,6 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( + { + AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + + TRACE("(%p)->(%d, %f, %s)\n", session, index, level, + wine_dbgstr_guid(context)); +@@ -2262,11 +3603,9 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( + + TRACE("PulseAudio does not support session volume control\n"); + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + session->channel_vols[index] = level; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + + return S_OK; + } +@@ -2296,7 +3635,6 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( + { + AudioSessionWrapper *This = impl_from_IChannelAudioVolume(iface); + AudioSession *session = This->session; +- ACImpl *client; + int i; + + TRACE("(%p)->(%d, %p, %s)\n", session, count, levels, +@@ -2313,12 +3651,10 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( + + TRACE("PulseAudio does not support session volume control\n"); + +- EnterCriticalSection(&session_cs); ++ pthread_mutex_lock(&pulse_lock); + for(i = 0; i < count; ++i) + session->channel_vols[i] = levels[i]; +- LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) +- set_stream_volumes(client); +- LeaveCriticalSection(&session_cs); ++ pthread_mutex_unlock(&pulse_lock); + return S_OK; + } + +@@ -2375,10 +3711,2001 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI + + if (IsEqualGUID(guid, &pulse_render_guid) && IsEqualPropertyKey(*prop, PKEY_AudioEndpoint_PhysicalSpeakers)) { + out->vt = VT_UI4; +- out->ulVal = pulse_config.speakers_mask; ++ out->u.ulVal = g_phys_speakers_mask; + +- return out->ulVal ? S_OK : E_FAIL; ++ return out->u.ulVal ? S_OK : E_FAIL; + } + + return E_NOTIMPL; + } ++ ++ ++ ++/********************************************************************** ++ * A-law and u-law sample manipulation functions ++ * Multiply with the given volume (vol must be between 0...1 inclusive) ++ * ++ * These were taken from PulseAudio's sources but adjusted to directly ++ * fit our usage (since we use floats directly) so they should be exact. ++ */ ++static UINT8 mult_alaw_sample(UINT8 sample, float vol) ++{ ++ static const float decode_to_13bits_float[1 << 8] = ++ { ++ -688.0f, -656.0f, -752.0f, -720.0f, -560.0f, -528.0f, -624.0f, -592.0f, ++ -944.0f, -912.0f, -1008.0f, -976.0f, -816.0f, -784.0f, -880.0f, -848.0f, ++ -344.0f, -328.0f, -376.0f, -360.0f, -280.0f, -264.0f, -312.0f, -296.0f, ++ -472.0f, -456.0f, -504.0f, -488.0f, -408.0f, -392.0f, -440.0f, -424.0f, ++ -2752.0f, -2624.0f, -3008.0f, -2880.0f, -2240.0f, -2112.0f, -2496.0f, -2368.0f, ++ -3776.0f, -3648.0f, -4032.0f, -3904.0f, -3264.0f, -3136.0f, -3520.0f, -3392.0f, ++ -1376.0f, -1312.0f, -1504.0f, -1440.0f, -1120.0f, -1056.0f, -1248.0f, -1184.0f, ++ -1888.0f, -1824.0f, -2016.0f, -1952.0f, -1632.0f, -1568.0f, -1760.0f, -1696.0f, ++ -43.0f, -41.0f, -47.0f, -45.0f, -35.0f, -33.0f, -39.0f, -37.0f, ++ -59.0f, -57.0f, -63.0f, -61.0f, -51.0f, -49.0f, -55.0f, -53.0f, ++ -11.0f, -9.0f, -15.0f, -13.0f, -3.0f, -1.0f, -7.0f, -5.0f, ++ -27.0f, -25.0f, -31.0f, -29.0f, -19.0f, -17.0f, -23.0f, -21.0f, ++ -172.0f, -164.0f, -188.0f, -180.0f, -140.0f, -132.0f, -156.0f, -148.0f, ++ -236.0f, -228.0f, -252.0f, -244.0f, -204.0f, -196.0f, -220.0f, -212.0f, ++ -86.0f, -82.0f, -94.0f, -90.0f, -70.0f, -66.0f, -78.0f, -74.0f, ++ -118.0f, -114.0f, -126.0f, -122.0f, -102.0f, -98.0f, -110.0f, -106.0f, ++ 688.0f, 656.0f, 752.0f, 720.0f, 560.0f, 528.0f, 624.0f, 592.0f, ++ 944.0f, 912.0f, 1008.0f, 976.0f, 816.0f, 784.0f, 880.0f, 848.0f, ++ 344.0f, 328.0f, 376.0f, 360.0f, 280.0f, 264.0f, 312.0f, 296.0f, ++ 472.0f, 456.0f, 504.0f, 488.0f, 408.0f, 392.0f, 440.0f, 424.0f, ++ 2752.0f, 2624.0f, 3008.0f, 2880.0f, 2240.0f, 2112.0f, 2496.0f, 2368.0f, ++ 3776.0f, 3648.0f, 4032.0f, 3904.0f, 3264.0f, 3136.0f, 3520.0f, 3392.0f, ++ 1376.0f, 1312.0f, 1504.0f, 1440.0f, 1120.0f, 1056.0f, 1248.0f, 1184.0f, ++ 1888.0f, 1824.0f, 2016.0f, 1952.0f, 1632.0f, 1568.0f, 1760.0f, 1696.0f, ++ 43.0f, 41.0f, 47.0f, 45.0f, 35.0f, 33.0f, 39.0f, 37.0f, ++ 59.0f, 57.0f, 63.0f, 61.0f, 51.0f, 49.0f, 55.0f, 53.0f, ++ 11.0f, 9.0f, 15.0f, 13.0f, 3.0f, 1.0f, 7.0f, 5.0f, ++ 27.0f, 25.0f, 31.0f, 29.0f, 19.0f, 17.0f, 23.0f, 21.0f, ++ 172.0f, 164.0f, 188.0f, 180.0f, 140.0f, 132.0f, 156.0f, 148.0f, ++ 236.0f, 228.0f, 252.0f, 244.0f, 204.0f, 196.0f, 220.0f, 212.0f, ++ 86.0f, 82.0f, 94.0f, 90.0f, 70.0f, 66.0f, 78.0f, 74.0f, ++ 118.0f, 114.0f, 126.0f, 122.0f, 102.0f, 98.0f, 110.0f, 106.0f ++ }; ++ ++ static const UINT8 encode[1 << 13] = ++ { ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, ++ 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x68, 0x68, 0x68, 0x68, 0x68, ++ 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6e, 0x6e, ++ 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, ++ 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, ++ 0x6d, 0x6d, 0x6d, 0x6d, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, ++ 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, ++ 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x66, 0x66, 0x66, ++ 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, ++ 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x65, ++ 0x65, 0x65, 0x65, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x78, 0x78, ++ 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, ++ 0x7f, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x72, 0x72, 0x72, 0x72, ++ 0x73, 0x73, 0x73, 0x73, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, 0x76, ++ 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, ++ 0x75, 0x75, 0x4a, 0x4a, 0x4b, 0x4b, 0x48, 0x48, 0x49, 0x49, 0x4e, 0x4e, 0x4f, ++ 0x4f, 0x4c, 0x4c, 0x4d, 0x4d, 0x42, 0x42, 0x43, 0x43, 0x40, 0x40, 0x41, 0x41, ++ 0x46, 0x46, 0x47, 0x47, 0x44, 0x44, 0x45, 0x45, 0x5a, 0x5a, 0x5b, 0x5b, 0x58, ++ 0x58, 0x59, 0x59, 0x5e, 0x5e, 0x5f, 0x5f, 0x5c, 0x5c, 0x5d, 0x5d, 0x52, 0x52, ++ 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, ++ 0x55, 0xd5, 0xd5, 0xd4, 0xd4, 0xd7, 0xd7, 0xd6, 0xd6, 0xd1, 0xd1, 0xd0, 0xd0, ++ 0xd3, 0xd3, 0xd2, 0xd2, 0xdd, 0xdd, 0xdc, 0xdc, 0xdf, 0xdf, 0xde, 0xde, 0xd9, ++ 0xd9, 0xd8, 0xd8, 0xdb, 0xdb, 0xda, 0xda, 0xc5, 0xc5, 0xc4, 0xc4, 0xc7, 0xc7, ++ 0xc6, 0xc6, 0xc1, 0xc1, 0xc0, 0xc0, 0xc3, 0xc3, 0xc2, 0xc2, 0xcd, 0xcd, 0xcc, ++ 0xcc, 0xcf, 0xcf, 0xce, 0xce, 0xc9, 0xc9, 0xc8, 0xc8, 0xcb, 0xcb, 0xca, 0xca, ++ 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, ++ 0xf6, 0xf6, 0xf6, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf3, ++ 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, ++ 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf9, 0xf9, 0xf9, ++ 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xe5, ++ 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, ++ 0xe4, 0xe4, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, ++ 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, ++ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, ++ 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xed, 0xed, ++ 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, ++ 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, ++ 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, ++ 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, ++ 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa ++ }; ++ ++ return encode[(int)(vol * decode_to_13bits_float[sample]) + ARRAY_SIZE(encode) / 2]; ++} ++ ++static UINT8 mult_ulaw_sample(UINT8 sample, float vol) ++{ ++ static const float decode_to_14bits_float[1 << 8] = ++ { ++ -8031.0f, -7775.0f, -7519.0f, -7263.0f, -7007.0f, -6751.0f, -6495.0f, -6239.0f, ++ -5983.0f, -5727.0f, -5471.0f, -5215.0f, -4959.0f, -4703.0f, -4447.0f, -4191.0f, ++ -3999.0f, -3871.0f, -3743.0f, -3615.0f, -3487.0f, -3359.0f, -3231.0f, -3103.0f, ++ -2975.0f, -2847.0f, -2719.0f, -2591.0f, -2463.0f, -2335.0f, -2207.0f, -2079.0f, ++ -1983.0f, -1919.0f, -1855.0f, -1791.0f, -1727.0f, -1663.0f, -1599.0f, -1535.0f, ++ -1471.0f, -1407.0f, -1343.0f, -1279.0f, -1215.0f, -1151.0f, -1087.0f, -1023.0f, ++ -975.0f, -943.0f, -911.0f, -879.0f, -847.0f, -815.0f, -783.0f, -751.0f, ++ -719.0f, -687.0f, -655.0f, -623.0f, -591.0f, -559.0f, -527.0f, -495.0f, ++ -471.0f, -455.0f, -439.0f, -423.0f, -407.0f, -391.0f, -375.0f, -359.0f, ++ -343.0f, -327.0f, -311.0f, -295.0f, -279.0f, -263.0f, -247.0f, -231.0f, ++ -219.0f, -211.0f, -203.0f, -195.0f, -187.0f, -179.0f, -171.0f, -163.0f, ++ -155.0f, -147.0f, -139.0f, -131.0f, -123.0f, -115.0f, -107.0f, -99.0f, ++ -93.0f, -89.0f, -85.0f, -81.0f, -77.0f, -73.0f, -69.0f, -65.0f, ++ -61.0f, -57.0f, -53.0f, -49.0f, -45.0f, -41.0f, -37.0f, -33.0f, ++ -30.0f, -28.0f, -26.0f, -24.0f, -22.0f, -20.0f, -18.0f, -16.0f, ++ -14.0f, -12.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, ++ 8031.0f, 7775.0f, 7519.0f, 7263.0f, 7007.0f, 6751.0f, 6495.0f, 6239.0f, ++ 5983.0f, 5727.0f, 5471.0f, 5215.0f, 4959.0f, 4703.0f, 4447.0f, 4191.0f, ++ 3999.0f, 3871.0f, 3743.0f, 3615.0f, 3487.0f, 3359.0f, 3231.0f, 3103.0f, ++ 2975.0f, 2847.0f, 2719.0f, 2591.0f, 2463.0f, 2335.0f, 2207.0f, 2079.0f, ++ 1983.0f, 1919.0f, 1855.0f, 1791.0f, 1727.0f, 1663.0f, 1599.0f, 1535.0f, ++ 1471.0f, 1407.0f, 1343.0f, 1279.0f, 1215.0f, 1151.0f, 1087.0f, 1023.0f, ++ 975.0f, 943.0f, 911.0f, 879.0f, 847.0f, 815.0f, 783.0f, 751.0f, ++ 719.0f, 687.0f, 655.0f, 623.0f, 591.0f, 559.0f, 527.0f, 495.0f, ++ 471.0f, 455.0f, 439.0f, 423.0f, 407.0f, 391.0f, 375.0f, 359.0f, ++ 343.0f, 327.0f, 311.0f, 295.0f, 279.0f, 263.0f, 247.0f, 231.0f, ++ 219.0f, 211.0f, 203.0f, 195.0f, 187.0f, 179.0f, 171.0f, 163.0f, ++ 155.0f, 147.0f, 139.0f, 131.0f, 123.0f, 115.0f, 107.0f, 99.0f, ++ 93.0f, 89.0f, 85.0f, 81.0f, 77.0f, 73.0f, 69.0f, 65.0f, ++ 61.0f, 57.0f, 53.0f, 49.0f, 45.0f, 41.0f, 37.0f, 33.0f, ++ 30.0f, 28.0f, 26.0f, 24.0f, 22.0f, 20.0f, 18.0f, 16.0f, ++ 14.0f, 12.0f, 10.0f, 8.0f, 6.0f, 4.0f, 2.0f, 0.0f ++ }; ++ ++ static const UINT8 encode[1 << 14] = ++ { ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, ++ 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, ++ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, ++ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, ++ 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, ++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, ++ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, ++ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, ++ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, ++ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, ++ 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, ++ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, ++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, ++ 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, ++ 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, ++ 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, ++ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, ++ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, ++ 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, ++ 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, ++ 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, ++ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, ++ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, ++ 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, ++ 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, ++ 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ++ 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, ++ 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, ++ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, ++ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, ++ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, ++ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, ++ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, ++ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, ++ 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, ++ 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, ++ 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, ++ 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, ++ 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, ++ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, ++ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, ++ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, ++ 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, ++ 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, ++ 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, ++ 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, ++ 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, ++ 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, ++ 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, ++ 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, ++ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, ++ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, ++ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, ++ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, ++ 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, ++ 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, ++ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, ++ 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, ++ 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, ++ 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, ++ 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, ++ 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, ++ 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, ++ 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, ++ 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, ++ 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, ++ 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, ++ 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, ++ 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, ++ 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, ++ 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, ++ 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, ++ 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, ++ 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, ++ 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, ++ 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, ++ 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, ++ 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, ++ 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, ++ 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, ++ 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, ++ 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, ++ 0x66, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, ++ 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, ++ 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, ++ 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, ++ 0x77, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, ++ 0x7e, 0x7e, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, ++ 0xf9, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, ++ 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, ++ 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, ++ 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, ++ 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, ++ 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, ++ 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, ++ 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, ++ 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, ++ 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, ++ 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, ++ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, ++ 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, ++ 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, ++ 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, ++ 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, ++ 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, ++ 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, ++ 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, ++ 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, ++ 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, ++ 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, ++ 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, ++ 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, ++ 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, ++ 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, ++ 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, ++ 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, ++ 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, ++ 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, ++ 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, ++ 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, ++ 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, ++ 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, ++ 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, ++ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, ++ 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, ++ 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, ++ 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, ++ 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, ++ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, ++ 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, ++ 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, ++ 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, ++ 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, ++ 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, ++ 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, ++ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, ++ 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, ++ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, ++ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, ++ 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, ++ 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, ++ 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, ++ 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, ++ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, ++ 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, ++ 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, ++ 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, ++ 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, ++ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, ++ 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, ++ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, ++ 0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, ++ 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, ++ 0xa0, 0xa0, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, ++ 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, ++ 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, ++ 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, ++ 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, ++ 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, ++ 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, ++ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, ++ 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, ++ 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, ++ 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, ++ 0x94, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, ++ 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, ++ 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, ++ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, ++ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, ++ 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, ++ 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, ++ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, ++ 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, ++ 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, ++ 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, ++ 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, ++ 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, ++ 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, ++ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, ++ 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, ++ 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, ++ 0x80, 0x80, 0x80, 0x80 ++ }; ++ ++ return encode[(int)(vol * decode_to_14bits_float[sample]) + ARRAY_SIZE(encode) / 2]; ++} +diff --git a/dlls/winepulse.drv/mult.c b/dlls/winepulse.drv/mult.c +deleted file mode 100644 +index 26b5e83c9cafad674bf80747bae1f5992538ee1c..0000000000000000000000000000000000000000 +--- a/dlls/winepulse.drv/mult.c ++++ /dev/null +@@ -1,2015 +0,0 @@ +-/* +- * Copyright 2011-2012 Maarten Lankhorst +- * Copyright 2010-2011 Maarten Lankhorst for CodeWeavers +- * Copyright 2011 Andrew Eikum for CodeWeavers +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 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 +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +- */ +- +-#include +- +-#if 0 +-#pragma makedep unix +-#endif +- +- +-/********************************************************************** +- * A-law and u-law sample manipulation functions +- * Multiply with the given volume (vol must be between 0...1 inclusive) +- * +- * These were taken from PulseAudio's sources but adjusted to directly +- * fit our usage (since we use floats directly) so they should be exact. +- */ +-UINT8 mult_alaw_sample(UINT8 sample, float vol) +-{ +- static const float decode_to_13bits_float[1 << 8] = +- { +- -688.0f, -656.0f, -752.0f, -720.0f, -560.0f, -528.0f, -624.0f, -592.0f, +- -944.0f, -912.0f, -1008.0f, -976.0f, -816.0f, -784.0f, -880.0f, -848.0f, +- -344.0f, -328.0f, -376.0f, -360.0f, -280.0f, -264.0f, -312.0f, -296.0f, +- -472.0f, -456.0f, -504.0f, -488.0f, -408.0f, -392.0f, -440.0f, -424.0f, +- -2752.0f, -2624.0f, -3008.0f, -2880.0f, -2240.0f, -2112.0f, -2496.0f, -2368.0f, +- -3776.0f, -3648.0f, -4032.0f, -3904.0f, -3264.0f, -3136.0f, -3520.0f, -3392.0f, +- -1376.0f, -1312.0f, -1504.0f, -1440.0f, -1120.0f, -1056.0f, -1248.0f, -1184.0f, +- -1888.0f, -1824.0f, -2016.0f, -1952.0f, -1632.0f, -1568.0f, -1760.0f, -1696.0f, +- -43.0f, -41.0f, -47.0f, -45.0f, -35.0f, -33.0f, -39.0f, -37.0f, +- -59.0f, -57.0f, -63.0f, -61.0f, -51.0f, -49.0f, -55.0f, -53.0f, +- -11.0f, -9.0f, -15.0f, -13.0f, -3.0f, -1.0f, -7.0f, -5.0f, +- -27.0f, -25.0f, -31.0f, -29.0f, -19.0f, -17.0f, -23.0f, -21.0f, +- -172.0f, -164.0f, -188.0f, -180.0f, -140.0f, -132.0f, -156.0f, -148.0f, +- -236.0f, -228.0f, -252.0f, -244.0f, -204.0f, -196.0f, -220.0f, -212.0f, +- -86.0f, -82.0f, -94.0f, -90.0f, -70.0f, -66.0f, -78.0f, -74.0f, +- -118.0f, -114.0f, -126.0f, -122.0f, -102.0f, -98.0f, -110.0f, -106.0f, +- 688.0f, 656.0f, 752.0f, 720.0f, 560.0f, 528.0f, 624.0f, 592.0f, +- 944.0f, 912.0f, 1008.0f, 976.0f, 816.0f, 784.0f, 880.0f, 848.0f, +- 344.0f, 328.0f, 376.0f, 360.0f, 280.0f, 264.0f, 312.0f, 296.0f, +- 472.0f, 456.0f, 504.0f, 488.0f, 408.0f, 392.0f, 440.0f, 424.0f, +- 2752.0f, 2624.0f, 3008.0f, 2880.0f, 2240.0f, 2112.0f, 2496.0f, 2368.0f, +- 3776.0f, 3648.0f, 4032.0f, 3904.0f, 3264.0f, 3136.0f, 3520.0f, 3392.0f, +- 1376.0f, 1312.0f, 1504.0f, 1440.0f, 1120.0f, 1056.0f, 1248.0f, 1184.0f, +- 1888.0f, 1824.0f, 2016.0f, 1952.0f, 1632.0f, 1568.0f, 1760.0f, 1696.0f, +- 43.0f, 41.0f, 47.0f, 45.0f, 35.0f, 33.0f, 39.0f, 37.0f, +- 59.0f, 57.0f, 63.0f, 61.0f, 51.0f, 49.0f, 55.0f, 53.0f, +- 11.0f, 9.0f, 15.0f, 13.0f, 3.0f, 1.0f, 7.0f, 5.0f, +- 27.0f, 25.0f, 31.0f, 29.0f, 19.0f, 17.0f, 23.0f, 21.0f, +- 172.0f, 164.0f, 188.0f, 180.0f, 140.0f, 132.0f, 156.0f, 148.0f, +- 236.0f, 228.0f, 252.0f, 244.0f, 204.0f, 196.0f, 220.0f, 212.0f, +- 86.0f, 82.0f, 94.0f, 90.0f, 70.0f, 66.0f, 78.0f, 74.0f, +- 118.0f, 114.0f, 126.0f, 122.0f, 102.0f, 98.0f, 110.0f, 106.0f +- }; +- +- static const UINT8 encode[1 << 13] = +- { +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, +- 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x68, 0x68, 0x68, 0x68, 0x68, +- 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6e, 0x6e, +- 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, +- 0x6f, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, +- 0x6d, 0x6d, 0x6d, 0x6d, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, +- 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, +- 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x66, 0x66, 0x66, +- 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, +- 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x65, +- 0x65, 0x65, 0x65, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x78, 0x78, +- 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, +- 0x7f, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x72, 0x72, 0x72, 0x72, +- 0x73, 0x73, 0x73, 0x73, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, 0x76, +- 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, +- 0x75, 0x75, 0x4a, 0x4a, 0x4b, 0x4b, 0x48, 0x48, 0x49, 0x49, 0x4e, 0x4e, 0x4f, +- 0x4f, 0x4c, 0x4c, 0x4d, 0x4d, 0x42, 0x42, 0x43, 0x43, 0x40, 0x40, 0x41, 0x41, +- 0x46, 0x46, 0x47, 0x47, 0x44, 0x44, 0x45, 0x45, 0x5a, 0x5a, 0x5b, 0x5b, 0x58, +- 0x58, 0x59, 0x59, 0x5e, 0x5e, 0x5f, 0x5f, 0x5c, 0x5c, 0x5d, 0x5d, 0x52, 0x52, +- 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, +- 0x55, 0xd5, 0xd5, 0xd4, 0xd4, 0xd7, 0xd7, 0xd6, 0xd6, 0xd1, 0xd1, 0xd0, 0xd0, +- 0xd3, 0xd3, 0xd2, 0xd2, 0xdd, 0xdd, 0xdc, 0xdc, 0xdf, 0xdf, 0xde, 0xde, 0xd9, +- 0xd9, 0xd8, 0xd8, 0xdb, 0xdb, 0xda, 0xda, 0xc5, 0xc5, 0xc4, 0xc4, 0xc7, 0xc7, +- 0xc6, 0xc6, 0xc1, 0xc1, 0xc0, 0xc0, 0xc3, 0xc3, 0xc2, 0xc2, 0xcd, 0xcd, 0xcc, +- 0xcc, 0xcf, 0xcf, 0xce, 0xce, 0xc9, 0xc9, 0xc8, 0xc8, 0xcb, 0xcb, 0xca, 0xca, +- 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, +- 0xf6, 0xf6, 0xf6, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf3, +- 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, +- 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf9, 0xf9, 0xf9, +- 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xe5, +- 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, +- 0xe4, 0xe4, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, +- 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, +- 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, +- 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xed, 0xed, +- 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, +- 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, +- 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, +- 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, +- 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa +- }; +- +- return encode[(int)(vol * decode_to_13bits_float[sample]) + ARRAY_SIZE(encode) / 2]; +-} +- +-UINT8 mult_ulaw_sample(UINT8 sample, float vol) +-{ +- static const float decode_to_14bits_float[1 << 8] = +- { +- -8031.0f, -7775.0f, -7519.0f, -7263.0f, -7007.0f, -6751.0f, -6495.0f, -6239.0f, +- -5983.0f, -5727.0f, -5471.0f, -5215.0f, -4959.0f, -4703.0f, -4447.0f, -4191.0f, +- -3999.0f, -3871.0f, -3743.0f, -3615.0f, -3487.0f, -3359.0f, -3231.0f, -3103.0f, +- -2975.0f, -2847.0f, -2719.0f, -2591.0f, -2463.0f, -2335.0f, -2207.0f, -2079.0f, +- -1983.0f, -1919.0f, -1855.0f, -1791.0f, -1727.0f, -1663.0f, -1599.0f, -1535.0f, +- -1471.0f, -1407.0f, -1343.0f, -1279.0f, -1215.0f, -1151.0f, -1087.0f, -1023.0f, +- -975.0f, -943.0f, -911.0f, -879.0f, -847.0f, -815.0f, -783.0f, -751.0f, +- -719.0f, -687.0f, -655.0f, -623.0f, -591.0f, -559.0f, -527.0f, -495.0f, +- -471.0f, -455.0f, -439.0f, -423.0f, -407.0f, -391.0f, -375.0f, -359.0f, +- -343.0f, -327.0f, -311.0f, -295.0f, -279.0f, -263.0f, -247.0f, -231.0f, +- -219.0f, -211.0f, -203.0f, -195.0f, -187.0f, -179.0f, -171.0f, -163.0f, +- -155.0f, -147.0f, -139.0f, -131.0f, -123.0f, -115.0f, -107.0f, -99.0f, +- -93.0f, -89.0f, -85.0f, -81.0f, -77.0f, -73.0f, -69.0f, -65.0f, +- -61.0f, -57.0f, -53.0f, -49.0f, -45.0f, -41.0f, -37.0f, -33.0f, +- -30.0f, -28.0f, -26.0f, -24.0f, -22.0f, -20.0f, -18.0f, -16.0f, +- -14.0f, -12.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, +- 8031.0f, 7775.0f, 7519.0f, 7263.0f, 7007.0f, 6751.0f, 6495.0f, 6239.0f, +- 5983.0f, 5727.0f, 5471.0f, 5215.0f, 4959.0f, 4703.0f, 4447.0f, 4191.0f, +- 3999.0f, 3871.0f, 3743.0f, 3615.0f, 3487.0f, 3359.0f, 3231.0f, 3103.0f, +- 2975.0f, 2847.0f, 2719.0f, 2591.0f, 2463.0f, 2335.0f, 2207.0f, 2079.0f, +- 1983.0f, 1919.0f, 1855.0f, 1791.0f, 1727.0f, 1663.0f, 1599.0f, 1535.0f, +- 1471.0f, 1407.0f, 1343.0f, 1279.0f, 1215.0f, 1151.0f, 1087.0f, 1023.0f, +- 975.0f, 943.0f, 911.0f, 879.0f, 847.0f, 815.0f, 783.0f, 751.0f, +- 719.0f, 687.0f, 655.0f, 623.0f, 591.0f, 559.0f, 527.0f, 495.0f, +- 471.0f, 455.0f, 439.0f, 423.0f, 407.0f, 391.0f, 375.0f, 359.0f, +- 343.0f, 327.0f, 311.0f, 295.0f, 279.0f, 263.0f, 247.0f, 231.0f, +- 219.0f, 211.0f, 203.0f, 195.0f, 187.0f, 179.0f, 171.0f, 163.0f, +- 155.0f, 147.0f, 139.0f, 131.0f, 123.0f, 115.0f, 107.0f, 99.0f, +- 93.0f, 89.0f, 85.0f, 81.0f, 77.0f, 73.0f, 69.0f, 65.0f, +- 61.0f, 57.0f, 53.0f, 49.0f, 45.0f, 41.0f, 37.0f, 33.0f, +- 30.0f, 28.0f, 26.0f, 24.0f, 22.0f, 20.0f, 18.0f, 16.0f, +- 14.0f, 12.0f, 10.0f, 8.0f, 6.0f, 4.0f, 2.0f, 0.0f +- }; +- +- static const UINT8 encode[1 << 14] = +- { +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +- 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +- 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, +- 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +- 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, +- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, +- 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, +- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, +- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +- 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, +- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +- 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, +- 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, +- 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, +- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, +- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, +- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, +- 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +- 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +- 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, +- 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +- 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, +- 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, +- 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +- 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +- 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, +- 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, +- 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, +- 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, +- 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, +- 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, +- 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +- 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, +- 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +- 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, +- 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, +- 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, +- 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, +- 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +- 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, +- 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, +- 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, +- 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, +- 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, +- 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, +- 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, +- 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +- 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, +- 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, +- 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, +- 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, +- 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, +- 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, +- 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, +- 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, +- 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, +- 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, +- 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, +- 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, +- 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, +- 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, +- 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, +- 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, +- 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, +- 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, +- 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, +- 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, +- 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, +- 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, +- 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, +- 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, +- 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, +- 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, +- 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, +- 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, +- 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, +- 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, +- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, +- 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, +- 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, +- 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, +- 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, +- 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, +- 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, +- 0x66, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, +- 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, +- 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, +- 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, +- 0x77, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, +- 0x7e, 0x7e, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, +- 0xf9, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, +- 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, +- 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, +- 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, +- 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, +- 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, +- 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, +- 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, +- 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, +- 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, +- 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, +- 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, +- 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, +- 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, +- 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, +- 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, +- 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, +- 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, +- 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, +- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, +- 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, +- 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, +- 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, +- 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, +- 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, +- 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, +- 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, +- 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, +- 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, +- 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, +- 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, +- 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, +- 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, +- 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, +- 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, +- 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +- 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, +- 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, +- 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, +- 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, +- 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, +- 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, +- 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, +- 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, +- 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, +- 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, +- 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, +- 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, +- 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, +- 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, +- 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, +- 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, +- 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, +- 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, +- 0xac, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, +- 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, +- 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, +- 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, +- 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, +- 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, +- 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, +- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, +- 0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, +- 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +- 0xa0, 0xa0, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, +- 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, +- 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, +- 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, +- 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, +- 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, +- 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, +- 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, +- 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, +- 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, +- 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, +- 0x94, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, +- 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, +- 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, +- 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, +- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, +- 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, +- 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, +- 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, +- 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, +- 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, +- 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +- 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, +- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, +- 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +- 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, +- 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, +- 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +- 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +- 0x80, 0x80, 0x80, 0x80 +- }; +- +- return encode[(int)(vol * decode_to_14bits_float[sample]) + ARRAY_SIZE(encode) / 2]; +-} +diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c +deleted file mode 100644 +index 55579ecda80bc557c00b2adba783d7d4b001f52e..0000000000000000000000000000000000000000 +--- a/dlls/winepulse.drv/pulse.c ++++ /dev/null +@@ -1,1984 +0,0 @@ +-/* +- * Copyright 2011-2012 Maarten Lankhorst +- * Copyright 2010-2011 Maarten Lankhorst for CodeWeavers +- * Copyright 2011 Andrew Eikum for CodeWeavers +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 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 +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +- */ +- +-#if 0 +-#pragma makedep unix +-#endif +- +-#define _NTSYSTEM_ +- +-#include +-#include +-#include +-#include +- +-#include +- +-#include "ntstatus.h" +-#define WIN32_NO_STATUS +-#include "winternl.h" +- +-#include "mmdeviceapi.h" +-#include "initguid.h" +-#include "audioclient.h" +- +-#include "unixlib.h" +- +-#include "wine/debug.h" +- +-WINE_DEFAULT_DEBUG_CHANNEL(pulse); +- +-struct pulse_stream +-{ +- EDataFlow dataflow; +- +- pa_stream *stream; +- pa_sample_spec ss; +- pa_channel_map map; +- pa_buffer_attr attr; +- +- DWORD flags; +- AUDCLNT_SHAREMODE share; +- HANDLE event; +- float vol[PA_CHANNELS_MAX]; +- BOOL mute; +- +- INT32 locked; +- BOOL started; +- SIZE_T bufsize_frames, alloc_size, real_bufsize_bytes, period_bytes; +- SIZE_T peek_ofs, read_offs_bytes, lcl_offs_bytes, pa_offs_bytes; +- SIZE_T tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len, pa_held_bytes; +- BYTE *local_buffer, *tmp_buffer, *peek_buffer; +- void *locked_ptr; +- BOOL please_quit, just_started, just_underran; +- pa_usec_t last_time, mmdev_period_usec; +- +- INT64 clock_lastpos, clock_written; +- +- struct list packet_free_head; +- struct list packet_filled_head; +-}; +- +-typedef struct _ACPacket +-{ +- struct list entry; +- UINT64 qpcpos; +- BYTE *data; +- UINT32 discont; +-} ACPacket; +- +-static pa_context *pulse_ctx; +-static pa_mainloop *pulse_ml; +- +-/* Mixer format + period times */ +-static WAVEFORMATEXTENSIBLE pulse_fmt[2]; +-static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2]; +- +-static UINT g_phys_speakers_mask = 0; +- +-static const REFERENCE_TIME MinimumPeriod = 30000; +-static const REFERENCE_TIME DefaultPeriod = 100000; +- +-static pthread_mutex_t pulse_mutex; +-static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; +- +-UINT8 mult_alaw_sample(UINT8, float); +-UINT8 mult_ulaw_sample(UINT8, float); +- +-static void pulse_lock(void) +-{ +- pthread_mutex_lock(&pulse_mutex); +-} +- +-static void pulse_unlock(void) +-{ +- pthread_mutex_unlock(&pulse_mutex); +-} +- +-static int pulse_cond_wait(void) +-{ +- return pthread_cond_wait(&pulse_cond, &pulse_mutex); +-} +- +-static void pulse_broadcast(void) +-{ +- pthread_cond_broadcast(&pulse_cond); +-} +- +-static void dump_attr(const pa_buffer_attr *attr) +-{ +- TRACE("maxlength: %u\n", attr->maxlength); +- TRACE("minreq: %u\n", attr->minreq); +- TRACE("fragsize: %u\n", attr->fragsize); +- TRACE("tlength: %u\n", attr->tlength); +- TRACE("prebuf: %u\n", attr->prebuf); +-} +- +-/* copied from kernelbase */ +-static int muldiv(int a, int b, int c) +-{ +- LONGLONG ret; +- +- if (!c) return -1; +- +- /* We want to deal with a positive divisor to simplify the logic. */ +- if (c < 0) +- { +- a = -a; +- c = -c; +- } +- +- /* If the result is positive, we "add" to round. else, we subtract to round. */ +- if ((a < 0 && b < 0) || (a >= 0 && b >= 0)) +- ret = (((LONGLONG)a * b) + (c / 2)) / c; +- else +- ret = (((LONGLONG)a * b) - (c / 2)) / c; +- +- if (ret > 2147483647 || ret < -2147483647) return -1; +- return ret; +-} +- +-/* Following pulseaudio design here, mainloop has the lock taken whenever +- * it is handling something for pulse, and the lock is required whenever +- * doing any pa_* call that can affect the state in any way +- * +- * pa_cond_wait is used when waiting on results, because the mainloop needs +- * the same lock taken to affect the state +- * +- * This is basically the same as the pa_threaded_mainloop implementation, +- * but that cannot be used because it uses pthread_create directly +- * +- * pa_threaded_mainloop_(un)lock -> pthread_mutex_(un)lock +- * pa_threaded_mainloop_signal -> pthread_cond_broadcast +- * pa_threaded_mainloop_wait -> pthread_cond_wait +- */ +-static int pulse_poll_func(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata) +-{ +- int r; +- pulse_unlock(); +- r = poll(ufds, nfds, timeout); +- pulse_lock(); +- return r; +-} +- +-static NTSTATUS pulse_main_loop(void *args) +-{ +- struct main_loop_params *params = args; +- int ret; +- pulse_lock(); +- pulse_ml = pa_mainloop_new(); +- pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); +- NtSetEvent(params->event, NULL); +- pa_mainloop_run(pulse_ml, &ret); +- pa_mainloop_free(pulse_ml); +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static void pulse_contextcallback(pa_context *c, void *userdata) +-{ +- switch (pa_context_get_state(c)) { +- default: +- FIXME("Unhandled state: %i\n", pa_context_get_state(c)); +- return; +- +- case PA_CONTEXT_CONNECTING: +- case PA_CONTEXT_UNCONNECTED: +- case PA_CONTEXT_AUTHORIZING: +- case PA_CONTEXT_SETTING_NAME: +- case PA_CONTEXT_TERMINATED: +- TRACE("State change to %i\n", pa_context_get_state(c)); +- return; +- +- case PA_CONTEXT_READY: +- TRACE("Ready\n"); +- break; +- +- case PA_CONTEXT_FAILED: +- WARN("Context failed: %s\n", pa_strerror(pa_context_errno(c))); +- break; +- } +- pulse_broadcast(); +-} +- +-static void pulse_stream_state(pa_stream *s, void *user) +-{ +- pa_stream_state_t state = pa_stream_get_state(s); +- TRACE("Stream state changed to %i\n", state); +- pulse_broadcast(); +-} +- +-static void pulse_attr_update(pa_stream *s, void *user) { +- const pa_buffer_attr *attr = pa_stream_get_buffer_attr(s); +- TRACE("New attributes or device moved:\n"); +- dump_attr(attr); +-} +- +-static void pulse_underflow_callback(pa_stream *s, void *userdata) +-{ +- struct pulse_stream *stream = userdata; +- WARN("%p: Underflow\n", userdata); +- stream->just_underran = TRUE; +- /* re-sync */ +- stream->pa_offs_bytes = stream->lcl_offs_bytes; +- stream->pa_held_bytes = stream->held_bytes; +-} +- +-static void pulse_started_callback(pa_stream *s, void *userdata) +-{ +- TRACE("%p: (Re)started playing\n", userdata); +-} +- +-static void pulse_op_cb(pa_stream *s, int success, void *user) +-{ +- TRACE("Success: %i\n", success); +- *(int*)user = success; +- pulse_broadcast(); +-} +- +-static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes) +-{ +- memset(buffer, format == PA_SAMPLE_U8 ? 0x80 : 0, bytes); +-} +- +-static BOOL pulse_stream_valid(struct pulse_stream *stream) +-{ +- return pa_stream_get_state(stream->stream) == PA_STREAM_READY; +-} +- +-static HRESULT pulse_connect(const char *name) +-{ +- if (pulse_ctx && PA_CONTEXT_IS_GOOD(pa_context_get_state(pulse_ctx))) +- return S_OK; +- if (pulse_ctx) +- pa_context_unref(pulse_ctx); +- +- pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), name); +- if (!pulse_ctx) { +- ERR("Failed to create context\n"); +- return E_FAIL; +- } +- +- pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); +- +- TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); +- if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) +- goto fail; +- +- /* Wait for connection */ +- while (pulse_cond_wait()) { +- pa_context_state_t state = pa_context_get_state(pulse_ctx); +- +- if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) +- goto fail; +- +- if (state == PA_CONTEXT_READY) +- break; +- } +- +- TRACE("Connected to server %s with protocol version: %i.\n", +- pa_context_get_server(pulse_ctx), +- pa_context_get_server_protocol_version(pulse_ctx)); +- return S_OK; +- +-fail: +- pa_context_unref(pulse_ctx); +- pulse_ctx = NULL; +- return E_FAIL; +-} +- +-static DWORD pulse_channel_map_to_channel_mask(const pa_channel_map *map) +-{ +- int i; +- DWORD mask = 0; +- +- for (i = 0; i < map->channels; ++i) { +- switch (map->map[i]) { +- default: FIXME("Unhandled channel %s\n", pa_channel_position_to_string(map->map[i])); break; +- case PA_CHANNEL_POSITION_FRONT_LEFT: mask |= SPEAKER_FRONT_LEFT; break; +- case PA_CHANNEL_POSITION_MONO: +- case PA_CHANNEL_POSITION_FRONT_CENTER: mask |= SPEAKER_FRONT_CENTER; break; +- case PA_CHANNEL_POSITION_FRONT_RIGHT: mask |= SPEAKER_FRONT_RIGHT; break; +- case PA_CHANNEL_POSITION_REAR_LEFT: mask |= SPEAKER_BACK_LEFT; break; +- case PA_CHANNEL_POSITION_REAR_CENTER: mask |= SPEAKER_BACK_CENTER; break; +- case PA_CHANNEL_POSITION_REAR_RIGHT: mask |= SPEAKER_BACK_RIGHT; break; +- case PA_CHANNEL_POSITION_LFE: mask |= SPEAKER_LOW_FREQUENCY; break; +- case PA_CHANNEL_POSITION_SIDE_LEFT: mask |= SPEAKER_SIDE_LEFT; break; +- case PA_CHANNEL_POSITION_SIDE_RIGHT: mask |= SPEAKER_SIDE_RIGHT; break; +- case PA_CHANNEL_POSITION_TOP_CENTER: mask |= SPEAKER_TOP_CENTER; break; +- case PA_CHANNEL_POSITION_TOP_FRONT_LEFT: mask |= SPEAKER_TOP_FRONT_LEFT; break; +- case PA_CHANNEL_POSITION_TOP_FRONT_CENTER: mask |= SPEAKER_TOP_FRONT_CENTER; break; +- case PA_CHANNEL_POSITION_TOP_FRONT_RIGHT: mask |= SPEAKER_TOP_FRONT_RIGHT; break; +- case PA_CHANNEL_POSITION_TOP_REAR_LEFT: mask |= SPEAKER_TOP_BACK_LEFT; break; +- case PA_CHANNEL_POSITION_TOP_REAR_CENTER: mask |= SPEAKER_TOP_BACK_CENTER; break; +- case PA_CHANNEL_POSITION_TOP_REAR_RIGHT: mask |= SPEAKER_TOP_BACK_RIGHT; break; +- case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: mask |= SPEAKER_FRONT_LEFT_OF_CENTER; break; +- case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: mask |= SPEAKER_FRONT_RIGHT_OF_CENTER; break; +- } +- } +- +- return mask; +-} +- +-/* For default PulseAudio render device, OR together all of the +- * PKEY_AudioEndpoint_PhysicalSpeakers values of the sinks. */ +-static void pulse_phys_speakers_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) +-{ +- if (i) +- g_phys_speakers_mask |= pulse_channel_map_to_channel_mask(&i->channel_map); +-} +- +-/* For most hardware on Windows, users must choose a configuration with an even +- * number of channels (stereo, quad, 5.1, 7.1). Users can then disable +- * channels, but those channels are still reported to applications from +- * GetMixFormat! Some applications behave badly if given an odd number of +- * channels (e.g. 2.1). Here, we find the nearest configuration that Windows +- * would report for a given channel layout. */ +-static void convert_channel_map(const pa_channel_map *pa_map, WAVEFORMATEXTENSIBLE *fmt) +-{ +- DWORD pa_mask = pulse_channel_map_to_channel_mask(pa_map); +- +- TRACE("got mask for PA: 0x%x\n", pa_mask); +- +- if (pa_map->channels == 1) +- { +- fmt->Format.nChannels = 1; +- fmt->dwChannelMask = pa_mask; +- return; +- } +- +- /* compare against known configurations and find smallest configuration +- * which is a superset of the given speakers */ +- +- if (pa_map->channels <= 2 && +- (pa_mask & ~KSAUDIO_SPEAKER_STEREO) == 0) +- { +- fmt->Format.nChannels = 2; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_STEREO; +- return; +- } +- +- if (pa_map->channels <= 4 && +- (pa_mask & ~KSAUDIO_SPEAKER_QUAD) == 0) +- { +- fmt->Format.nChannels = 4; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_QUAD; +- return; +- } +- +- if (pa_map->channels <= 4 && +- (pa_mask & ~KSAUDIO_SPEAKER_SURROUND) == 0) +- { +- fmt->Format.nChannels = 4; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_SURROUND; +- return; +- } +- +- if (pa_map->channels <= 6 && +- (pa_mask & ~KSAUDIO_SPEAKER_5POINT1) == 0) +- { +- fmt->Format.nChannels = 6; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1; +- return; +- } +- +- if (pa_map->channels <= 6 && +- (pa_mask & ~KSAUDIO_SPEAKER_5POINT1_SURROUND) == 0) +- { +- fmt->Format.nChannels = 6; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_5POINT1_SURROUND; +- return; +- } +- +- if (pa_map->channels <= 8 && +- (pa_mask & ~KSAUDIO_SPEAKER_7POINT1) == 0) +- { +- fmt->Format.nChannels = 8; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1; +- return; +- } +- +- if (pa_map->channels <= 8 && +- (pa_mask & ~KSAUDIO_SPEAKER_7POINT1_SURROUND) == 0) +- { +- fmt->Format.nChannels = 8; +- fmt->dwChannelMask = KSAUDIO_SPEAKER_7POINT1_SURROUND; +- return; +- } +- +- /* oddball format, report truthfully */ +- fmt->Format.nChannels = pa_map->channels; +- fmt->dwChannelMask = pa_mask; +-} +- +-static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { +- WAVEFORMATEX *wfx = &fmt->Format; +- pa_stream *stream; +- pa_channel_map map; +- pa_sample_spec ss; +- pa_buffer_attr attr; +- int ret; +- unsigned int length = 0; +- +- pa_channel_map_init_auto(&map, 2, PA_CHANNEL_MAP_ALSA); +- ss.rate = 48000; +- ss.format = PA_SAMPLE_FLOAT32LE; +- ss.channels = map.channels; +- +- attr.maxlength = -1; +- attr.tlength = -1; +- attr.minreq = attr.fragsize = pa_frame_size(&ss); +- attr.prebuf = 0; +- +- stream = pa_stream_new(pulse_ctx, "format test stream", &ss, &map); +- if (stream) +- pa_stream_set_state_callback(stream, pulse_stream_state, NULL); +- if (!stream) +- ret = -1; +- else if (render) +- ret = pa_stream_connect_playback(stream, NULL, &attr, +- PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS, NULL, NULL); +- else +- ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS); +- if (ret >= 0) { +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && +- pa_stream_get_state(stream) == PA_STREAM_CREATING) +- {} +- if (pa_stream_get_state(stream) == PA_STREAM_READY) { +- ss = *pa_stream_get_sample_spec(stream); +- map = *pa_stream_get_channel_map(stream); +- if (render) +- length = pa_stream_get_buffer_attr(stream)->minreq; +- else +- length = pa_stream_get_buffer_attr(stream)->fragsize; +- pa_stream_disconnect(stream); +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && +- pa_stream_get_state(stream) == PA_STREAM_READY) +- {} +- } +- } +- +- if (stream) +- pa_stream_unref(stream); +- +- if (length) +- pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss); +- +- if (pulse_min_period[!render] < MinimumPeriod) +- pulse_min_period[!render] = MinimumPeriod; +- +- if (pulse_def_period[!render] < DefaultPeriod) +- pulse_def_period[!render] = DefaultPeriod; +- +- wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; +- wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); +- +- convert_channel_map(&map, fmt); +- +- wfx->wBitsPerSample = 8 * pa_sample_size_of_format(ss.format); +- wfx->nSamplesPerSec = ss.rate; +- wfx->nBlockAlign = wfx->nChannels * wfx->wBitsPerSample / 8; +- wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign; +- if (ss.format != PA_SAMPLE_S24_32LE) +- fmt->Samples.wValidBitsPerSample = wfx->wBitsPerSample; +- else +- fmt->Samples.wValidBitsPerSample = 24; +- if (ss.format == PA_SAMPLE_FLOAT32LE) +- fmt->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; +- else +- fmt->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; +-} +- +-/* some poorly-behaved applications call audio functions during DllMain, so we +- * have to do as much as possible without creating a new thread. this function +- * sets up a synchronous connection to verify the server is running and query +- * static data. */ +-static NTSTATUS pulse_test_connect(void *args) +-{ +- struct test_connect_params *params = args; +- struct pulse_config *config = params->config; +- pa_operation *o; +- int ret; +- +- pulse_lock(); +- pulse_ml = pa_mainloop_new(); +- +- pa_mainloop_set_poll_func(pulse_ml, pulse_poll_func, NULL); +- +- pulse_ctx = pa_context_new(pa_mainloop_get_api(pulse_ml), params->name); +- if (!pulse_ctx) { +- ERR("Failed to create context\n"); +- pa_mainloop_free(pulse_ml); +- pulse_ml = NULL; +- pulse_unlock(); +- params->result = E_FAIL; +- return STATUS_SUCCESS; +- } +- +- pa_context_set_state_callback(pulse_ctx, pulse_contextcallback, NULL); +- +- TRACE("libpulse protocol version: %u. API Version %u\n", pa_context_get_protocol_version(pulse_ctx), PA_API_VERSION); +- if (pa_context_connect(pulse_ctx, NULL, 0, NULL) < 0) +- goto fail; +- +- /* Wait for connection */ +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0) { +- pa_context_state_t state = pa_context_get_state(pulse_ctx); +- +- if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) +- goto fail; +- +- if (state == PA_CONTEXT_READY) +- break; +- } +- +- if (pa_context_get_state(pulse_ctx) != PA_CONTEXT_READY) +- goto fail; +- +- TRACE("Test-connected to server %s with protocol version: %i.\n", +- pa_context_get_server(pulse_ctx), +- pa_context_get_server_protocol_version(pulse_ctx)); +- +- pulse_probe_settings(1, &pulse_fmt[0]); +- pulse_probe_settings(0, &pulse_fmt[1]); +- +- g_phys_speakers_mask = 0; +- o = pa_context_get_sink_info_list(pulse_ctx, &pulse_phys_speakers_cb, NULL); +- if (o) { +- while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 && +- pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- {} +- pa_operation_unref(o); +- } +- +- pa_context_unref(pulse_ctx); +- pulse_ctx = NULL; +- pa_mainloop_free(pulse_ml); +- pulse_ml = NULL; +- +- config->speakers_mask = g_phys_speakers_mask; +- config->modes[0].format = pulse_fmt[0]; +- config->modes[0].def_period = pulse_def_period[0]; +- config->modes[0].min_period = pulse_min_period[0]; +- config->modes[1].format = pulse_fmt[1]; +- config->modes[1].def_period = pulse_def_period[1]; +- config->modes[1].min_period = pulse_min_period[1]; +- +- pulse_unlock(); +- +- params->result = S_OK; +- return STATUS_SUCCESS; +- +-fail: +- pa_context_unref(pulse_ctx); +- pulse_ctx = NULL; +- pa_mainloop_free(pulse_ml); +- pulse_ml = NULL; +- pulse_unlock(); +- params->result = E_FAIL; +- return STATUS_SUCCESS; +-} +- +-static DWORD get_channel_mask(unsigned int channels) +-{ +- switch(channels) { +- case 0: +- return 0; +- case 1: +- return KSAUDIO_SPEAKER_MONO; +- case 2: +- return KSAUDIO_SPEAKER_STEREO; +- case 3: +- return KSAUDIO_SPEAKER_STEREO | SPEAKER_LOW_FREQUENCY; +- case 4: +- return KSAUDIO_SPEAKER_QUAD; /* not _SURROUND */ +- case 5: +- return KSAUDIO_SPEAKER_QUAD | SPEAKER_LOW_FREQUENCY; +- case 6: +- return KSAUDIO_SPEAKER_5POINT1; /* not 5POINT1_SURROUND */ +- case 7: +- return KSAUDIO_SPEAKER_5POINT1 | SPEAKER_BACK_CENTER; +- case 8: +- return KSAUDIO_SPEAKER_7POINT1_SURROUND; /* Vista deprecates 7POINT1 */ +- } +- FIXME("Unknown speaker configuration: %u\n", channels); +- return 0; +-} +- +-static const enum pa_channel_position pulse_pos_from_wfx[] = { +- 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_FRONT_LEFT_OF_CENTER, +- PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, +- PA_CHANNEL_POSITION_REAR_CENTER, +- PA_CHANNEL_POSITION_SIDE_LEFT, +- PA_CHANNEL_POSITION_SIDE_RIGHT, +- PA_CHANNEL_POSITION_TOP_CENTER, +- PA_CHANNEL_POSITION_TOP_FRONT_LEFT, +- PA_CHANNEL_POSITION_TOP_FRONT_CENTER, +- PA_CHANNEL_POSITION_TOP_FRONT_RIGHT, +- PA_CHANNEL_POSITION_TOP_REAR_LEFT, +- PA_CHANNEL_POSITION_TOP_REAR_CENTER, +- PA_CHANNEL_POSITION_TOP_REAR_RIGHT +-}; +- +-static HRESULT pulse_spec_from_waveformat(struct pulse_stream *stream, const WAVEFORMATEX *fmt) +-{ +- pa_channel_map_init(&stream->map); +- stream->ss.rate = fmt->nSamplesPerSec; +- stream->ss.format = PA_SAMPLE_INVALID; +- +- switch(fmt->wFormatTag) { +- case WAVE_FORMAT_IEEE_FLOAT: +- if (!fmt->nChannels || fmt->nChannels > 2 || fmt->wBitsPerSample != 32) +- break; +- stream->ss.format = PA_SAMPLE_FLOAT32LE; +- pa_channel_map_init_auto(&stream->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); +- break; +- case WAVE_FORMAT_PCM: +- if (!fmt->nChannels || fmt->nChannels > 2) +- break; +- if (fmt->wBitsPerSample == 8) +- stream->ss.format = PA_SAMPLE_U8; +- else if (fmt->wBitsPerSample == 16) +- stream->ss.format = PA_SAMPLE_S16LE; +- else +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- pa_channel_map_init_auto(&stream->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); +- break; +- case WAVE_FORMAT_EXTENSIBLE: { +- WAVEFORMATEXTENSIBLE *wfe = (WAVEFORMATEXTENSIBLE*)fmt; +- DWORD mask = wfe->dwChannelMask; +- DWORD i = 0, j; +- if (fmt->cbSize != (sizeof(*wfe) - sizeof(*fmt)) && fmt->cbSize != sizeof(*wfe)) +- break; +- if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) && +- (!wfe->Samples.wValidBitsPerSample || wfe->Samples.wValidBitsPerSample == 32) && +- fmt->wBitsPerSample == 32) +- stream->ss.format = PA_SAMPLE_FLOAT32LE; +- else if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)) { +- DWORD valid = wfe->Samples.wValidBitsPerSample; +- if (!valid) +- valid = fmt->wBitsPerSample; +- if (!valid || valid > fmt->wBitsPerSample) +- break; +- switch (fmt->wBitsPerSample) { +- case 8: +- if (valid == 8) +- stream->ss.format = PA_SAMPLE_U8; +- break; +- case 16: +- if (valid == 16) +- stream->ss.format = PA_SAMPLE_S16LE; +- break; +- case 24: +- if (valid == 24) +- stream->ss.format = PA_SAMPLE_S24LE; +- break; +- case 32: +- if (valid == 24) +- stream->ss.format = PA_SAMPLE_S24_32LE; +- else if (valid == 32) +- stream->ss.format = PA_SAMPLE_S32LE; +- break; +- default: +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- } +- stream->map.channels = fmt->nChannels; +- if (!mask || (mask & (SPEAKER_ALL|SPEAKER_RESERVED))) +- mask = get_channel_mask(fmt->nChannels); +- for (j = 0; j < ARRAY_SIZE(pulse_pos_from_wfx) && i < fmt->nChannels; ++j) { +- if (mask & (1 << j)) +- stream->map.map[i++] = pulse_pos_from_wfx[j]; +- } +- +- /* Special case for mono since pulse appears to map it differently */ +- if (mask == SPEAKER_FRONT_CENTER) +- stream->map.map[0] = PA_CHANNEL_POSITION_MONO; +- +- if (i < fmt->nChannels || (mask & SPEAKER_RESERVED)) { +- stream->map.channels = 0; +- ERR("Invalid channel mask: %i/%i and %x(%x)\n", i, fmt->nChannels, mask, wfe->dwChannelMask); +- break; +- } +- break; +- } +- case WAVE_FORMAT_ALAW: +- case WAVE_FORMAT_MULAW: +- if (fmt->wBitsPerSample != 8) { +- FIXME("Unsupported bpp %u for LAW\n", fmt->wBitsPerSample); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- if (fmt->nChannels != 1 && fmt->nChannels != 2) { +- FIXME("Unsupported channels %u for LAW\n", fmt->nChannels); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- stream->ss.format = fmt->wFormatTag == WAVE_FORMAT_MULAW ? PA_SAMPLE_ULAW : PA_SAMPLE_ALAW; +- pa_channel_map_init_auto(&stream->map, fmt->nChannels, PA_CHANNEL_MAP_ALSA); +- break; +- default: +- WARN("Unhandled tag %x\n", fmt->wFormatTag); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- stream->ss.channels = stream->map.channels; +- if (!pa_channel_map_valid(&stream->map) || stream->ss.format == PA_SAMPLE_INVALID) { +- ERR("Invalid format! Channel spec valid: %i, format: %i\n", +- pa_channel_map_valid(&stream->map), stream->ss.format); +- return AUDCLNT_E_UNSUPPORTED_FORMAT; +- } +- return S_OK; +-} +- +-static HRESULT pulse_stream_connect(struct pulse_stream *stream, UINT32 period_bytes) +-{ +- int ret; +- char buffer[64]; +- static LONG number; +- pa_buffer_attr attr; +- +- ret = InterlockedIncrement(&number); +- sprintf(buffer, "audio stream #%i", ret); +- stream->stream = pa_stream_new(pulse_ctx, buffer, &stream->ss, &stream->map); +- +- if (!stream->stream) { +- WARN("pa_stream_new returned error %i\n", pa_context_errno(pulse_ctx)); +- return AUDCLNT_E_ENDPOINT_CREATE_FAILED; +- } +- +- pa_stream_set_state_callback(stream->stream, pulse_stream_state, stream); +- pa_stream_set_buffer_attr_callback(stream->stream, pulse_attr_update, stream); +- pa_stream_set_moved_callback(stream->stream, pulse_attr_update, stream); +- +- /* PulseAudio will fill in correct values */ +- attr.minreq = attr.fragsize = period_bytes; +- attr.tlength = period_bytes * 3; +- attr.maxlength = stream->bufsize_frames * pa_frame_size(&stream->ss); +- attr.prebuf = pa_frame_size(&stream->ss); +- dump_attr(&attr); +- if (stream->dataflow == eRender) +- ret = pa_stream_connect_playback(stream->stream, NULL, &attr, +- PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_ADJUST_LATENCY, NULL, NULL); +- else +- ret = pa_stream_connect_record(stream->stream, NULL, &attr, +- PA_STREAM_START_CORKED|PA_STREAM_START_UNMUTED|PA_STREAM_ADJUST_LATENCY); +- if (ret < 0) { +- WARN("Returns %i\n", ret); +- return AUDCLNT_E_ENDPOINT_CREATE_FAILED; +- } +- while (pa_stream_get_state(stream->stream) == PA_STREAM_CREATING) +- pulse_cond_wait(); +- if (pa_stream_get_state(stream->stream) != PA_STREAM_READY) +- return AUDCLNT_E_ENDPOINT_CREATE_FAILED; +- +- if (stream->dataflow == eRender) { +- pa_stream_set_underflow_callback(stream->stream, pulse_underflow_callback, stream); +- pa_stream_set_started_callback(stream->stream, pulse_started_callback, stream); +- } +- return S_OK; +-} +- +-static NTSTATUS pulse_create_stream(void *args) +-{ +- struct create_stream_params *params = args; +- REFERENCE_TIME period, duration = params->duration; +- struct pulse_stream *stream; +- unsigned int i, bufsize_bytes; +- HRESULT hr; +- +- pulse_lock(); +- +- if (FAILED(params->result = pulse_connect(params->name))) +- { +- pulse_unlock(); +- return STATUS_SUCCESS; +- } +- +- if (!(stream = calloc(1, sizeof(*stream)))) +- { +- pulse_unlock(); +- params->result = E_OUTOFMEMORY; +- return STATUS_SUCCESS; +- } +- +- stream->dataflow = params->dataflow; +- for (i = 0; i < ARRAY_SIZE(stream->vol); ++i) +- stream->vol[i] = 1.f; +- +- hr = pulse_spec_from_waveformat(stream, params->fmt); +- TRACE("Obtaining format returns %08x\n", hr); +- +- if (FAILED(hr)) +- goto exit; +- +- period = pulse_def_period[stream->dataflow == eCapture]; +- if (duration < 3 * period) +- duration = 3 * period; +- +- stream->period_bytes = pa_frame_size(&stream->ss) * muldiv(period, stream->ss.rate, 10000000); +- +- stream->bufsize_frames = ceil((duration / 10000000.) * params->fmt->nSamplesPerSec); +- bufsize_bytes = stream->bufsize_frames * pa_frame_size(&stream->ss); +- stream->mmdev_period_usec = period / 10; +- +- stream->share = params->mode; +- stream->flags = params->flags; +- hr = pulse_stream_connect(stream, stream->period_bytes); +- if (SUCCEEDED(hr)) { +- UINT32 unalign; +- const pa_buffer_attr *attr = pa_stream_get_buffer_attr(stream->stream); +- stream->attr = *attr; +- /* Update frames according to new size */ +- dump_attr(attr); +- if (stream->dataflow == eRender) { +- stream->alloc_size = stream->real_bufsize_bytes = +- stream->bufsize_frames * 2 * pa_frame_size(&stream->ss); +- if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, +- 0, &stream->real_bufsize_bytes, MEM_COMMIT, PAGE_READWRITE)) +- hr = E_OUTOFMEMORY; +- } else { +- UINT32 i, capture_packets; +- +- if ((unalign = bufsize_bytes % stream->period_bytes)) +- bufsize_bytes += stream->period_bytes - unalign; +- stream->bufsize_frames = bufsize_bytes / pa_frame_size(&stream->ss); +- stream->real_bufsize_bytes = bufsize_bytes; +- +- capture_packets = stream->real_bufsize_bytes / stream->period_bytes; +- +- stream->alloc_size = stream->real_bufsize_bytes + capture_packets * sizeof(ACPacket); +- if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, +- 0, &stream->alloc_size, MEM_COMMIT, PAGE_READWRITE)) +- hr = E_OUTOFMEMORY; +- else { +- ACPacket *cur_packet = (ACPacket*)((char*)stream->local_buffer + stream->real_bufsize_bytes); +- BYTE *data = stream->local_buffer; +- silence_buffer(stream->ss.format, stream->local_buffer, stream->real_bufsize_bytes); +- list_init(&stream->packet_free_head); +- list_init(&stream->packet_filled_head); +- for (i = 0; i < capture_packets; ++i, ++cur_packet) { +- list_add_tail(&stream->packet_free_head, &cur_packet->entry); +- cur_packet->data = data; +- data += stream->period_bytes; +- } +- } +- } +- } +- +- *params->channel_count = stream->ss.channels; +- *params->stream = stream; +- +-exit: +- if (FAILED(params->result = hr)) { +- free(stream->local_buffer); +- if (stream->stream) { +- pa_stream_disconnect(stream->stream); +- pa_stream_unref(stream->stream); +- free(stream); +- } +- } +- +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_release_stream(void *args) +-{ +- struct release_stream_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- if(params->timer) { +- stream->please_quit = TRUE; +- NtWaitForSingleObject(params->timer, FALSE, NULL); +- NtClose(params->timer); +- } +- +- pulse_lock(); +- if (PA_STREAM_IS_GOOD(pa_stream_get_state(stream->stream))) { +- pa_stream_disconnect(stream->stream); +- while (PA_STREAM_IS_GOOD(pa_stream_get_state(stream->stream))) +- pulse_cond_wait(); +- } +- pa_stream_unref(stream->stream); +- pulse_unlock(); +- +- if (stream->tmp_buffer) +- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, +- &stream->tmp_buffer_bytes, MEM_RELEASE); +- if (stream->local_buffer) +- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, +- &stream->alloc_size, MEM_RELEASE); +- free(stream->peek_buffer); +- free(stream); +- return STATUS_SUCCESS; +-} +- +-static int write_buffer(const struct pulse_stream *stream, BYTE *buffer, UINT32 bytes) +-{ +- const float *vol = stream->vol; +- UINT32 i, channels, mute = 0; +- BOOL adjust = FALSE; +- BYTE *end; +- +- if (!bytes) return 0; +- +- /* Adjust the buffer based on the volume for each channel */ +- channels = stream->ss.channels; +- for (i = 0; i < channels; i++) +- { +- adjust |= vol[i] != 1.0f; +- if (vol[i] == 0.0f) +- mute++; +- } +- if (mute == channels) +- { +- silence_buffer(stream->ss.format, buffer, bytes); +- goto write; +- } +- if (!adjust) goto write; +- +- end = buffer + bytes; +- switch (stream->ss.format) +- { +-#ifndef WORDS_BIGENDIAN +-#define PROCESS_BUFFER(type) do \ +-{ \ +- type *p = (type*)buffer; \ +- do \ +- { \ +- for (i = 0; i < channels; i++) \ +- p[i] = p[i] * vol[i]; \ +- p += i; \ +- } while ((BYTE*)p != end); \ +-} while (0) +- case PA_SAMPLE_S16LE: +- PROCESS_BUFFER(INT16); +- break; +- case PA_SAMPLE_S32LE: +- PROCESS_BUFFER(INT32); +- break; +- case PA_SAMPLE_FLOAT32LE: +- PROCESS_BUFFER(float); +- break; +-#undef PROCESS_BUFFER +- case PA_SAMPLE_S24_32LE: +- { +- UINT32 *p = (UINT32*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- { +- p[i] = (INT32)((INT32)(p[i] << 8) * vol[i]); +- p[i] >>= 8; +- } +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- case PA_SAMPLE_S24LE: +- { +- /* do it 12 bytes at a time until it is no longer possible */ +- UINT32 *q = (UINT32*)buffer; +- BYTE *p; +- +- i = 0; +- while (end - (BYTE*)q >= 12) +- { +- UINT32 v[4], k; +- v[0] = q[0] << 8; +- v[1] = q[1] << 16 | (q[0] >> 16 & ~0xff); +- v[2] = q[2] << 24 | (q[1] >> 8 & ~0xff); +- v[3] = q[2] & ~0xff; +- for (k = 0; k < 4; k++) +- { +- v[k] = (INT32)((INT32)v[k] * vol[i]); +- if (++i == channels) i = 0; +- } +- *q++ = v[0] >> 8 | (v[1] & ~0xff) << 16; +- *q++ = v[1] >> 16 | (v[2] & ~0xff) << 8; +- *q++ = v[2] >> 24 | (v[3] & ~0xff); +- } +- p = (BYTE*)q; +- while (p != end) +- { +- UINT32 v = (INT32)((INT32)(p[0] << 8 | p[1] << 16 | p[2] << 24) * vol[i]); +- *p++ = v >> 8 & 0xff; +- *p++ = v >> 16 & 0xff; +- *p++ = v >> 24; +- if (++i == channels) i = 0; +- } +- break; +- } +-#endif +- case PA_SAMPLE_U8: +- { +- UINT8 *p = (UINT8*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- p[i] = (int)((p[i] - 128) * vol[i]) + 128; +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- case PA_SAMPLE_ALAW: +- { +- UINT8 *p = (UINT8*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- p[i] = mult_alaw_sample(p[i], vol[i]); +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- case PA_SAMPLE_ULAW: +- { +- UINT8 *p = (UINT8*)buffer; +- do +- { +- for (i = 0; i < channels; i++) +- p[i] = mult_ulaw_sample(p[i], vol[i]); +- p += i; +- } while ((BYTE*)p != end); +- break; +- } +- default: +- TRACE("Unhandled format %i, not adjusting volume.\n", stream->ss.format); +- break; +- } +- +-write: +- return pa_stream_write(stream->stream, buffer, bytes, NULL, 0, PA_SEEK_RELATIVE); +-} +- +-static void pulse_write(struct pulse_stream *stream) +-{ +- /* write as much data to PA as we can */ +- UINT32 to_write; +- BYTE *buf = stream->local_buffer + stream->pa_offs_bytes; +- UINT32 bytes = pa_stream_writable_size(stream->stream); +- +- if (stream->just_underran) +- { +- /* prebuffer with silence if needed */ +- if(stream->pa_held_bytes < bytes){ +- to_write = bytes - stream->pa_held_bytes; +- TRACE("prebuffering %u frames of silence\n", +- (int)(to_write / pa_frame_size(&stream->ss))); +- buf = calloc(1, to_write); +- pa_stream_write(stream->stream, buf, to_write, NULL, 0, PA_SEEK_RELATIVE); +- free(buf); +- } +- +- stream->just_underran = FALSE; +- } +- +- buf = stream->local_buffer + stream->pa_offs_bytes; +- TRACE("held: %lu, avail: %u\n", stream->pa_held_bytes, bytes); +- bytes = min(stream->pa_held_bytes, bytes); +- +- if (stream->pa_offs_bytes + bytes > stream->real_bufsize_bytes) +- { +- to_write = stream->real_bufsize_bytes - stream->pa_offs_bytes; +- TRACE("writing small chunk of %u bytes\n", to_write); +- write_buffer(stream, buf, to_write); +- stream->pa_held_bytes -= to_write; +- to_write = bytes - to_write; +- stream->pa_offs_bytes = 0; +- buf = stream->local_buffer; +- } +- else +- to_write = bytes; +- +- TRACE("writing main chunk of %u bytes\n", to_write); +- write_buffer(stream, buf, to_write); +- stream->pa_offs_bytes += to_write; +- stream->pa_offs_bytes %= stream->real_bufsize_bytes; +- stream->pa_held_bytes -= to_write; +-} +- +-static void pulse_read(struct pulse_stream *stream) +-{ +- size_t bytes = pa_stream_readable_size(stream->stream); +- +- TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(stream->stream)->fragsize); +- +- bytes += stream->peek_len - stream->peek_ofs; +- +- while (bytes >= stream->period_bytes) +- { +- BYTE *dst = NULL, *src; +- size_t src_len, copy, rem = stream->period_bytes; +- +- if (stream->started) +- { +- LARGE_INTEGER stamp, freq; +- ACPacket *p, *next; +- +- if (!(p = (ACPacket*)list_head(&stream->packet_free_head))) +- { +- p = (ACPacket*)list_head(&stream->packet_filled_head); +- if (!p) return; +- if (!p->discont) { +- next = (ACPacket*)p->entry.next; +- next->discont = 1; +- } else +- p = (ACPacket*)list_tail(&stream->packet_filled_head); +- } +- else +- { +- stream->held_bytes += stream->period_bytes; +- } +- NtQueryPerformanceCounter(&stamp, &freq); +- p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; +- p->discont = 0; +- list_remove(&p->entry); +- list_add_tail(&stream->packet_filled_head, &p->entry); +- +- dst = p->data; +- } +- +- while (rem) +- { +- if (stream->peek_len) +- { +- copy = min(rem, stream->peek_len - stream->peek_ofs); +- +- if (dst) +- { +- memcpy(dst, stream->peek_buffer + stream->peek_ofs, copy); +- dst += copy; +- } +- +- rem -= copy; +- stream->peek_ofs += copy; +- if(stream->peek_len == stream->peek_ofs) +- stream->peek_len = stream->peek_ofs = 0; +- +- } +- else if (pa_stream_peek(stream->stream, (const void**)&src, &src_len) == 0 && src_len) +- { +- copy = min(rem, src_len); +- +- if (dst) { +- if(src) +- memcpy(dst, src, copy); +- else +- silence_buffer(stream->ss.format, dst, copy); +- +- dst += copy; +- } +- +- rem -= copy; +- +- if (copy < src_len) +- { +- if (src_len > stream->peek_buffer_len) +- { +- free(stream->peek_buffer); +- stream->peek_buffer = malloc(src_len); +- stream->peek_buffer_len = src_len; +- } +- +- if(src) +- memcpy(stream->peek_buffer, src + copy, src_len - copy); +- else +- silence_buffer(stream->ss.format, stream->peek_buffer, src_len - copy); +- +- stream->peek_len = src_len - copy; +- stream->peek_ofs = 0; +- } +- +- pa_stream_drop(stream->stream); +- } +- } +- +- bytes -= stream->period_bytes; +- } +-} +- +-static NTSTATUS pulse_timer_loop(void *args) +-{ +- struct timer_loop_params *params = args; +- struct pulse_stream *stream = params->stream; +- LARGE_INTEGER delay; +- UINT32 adv_bytes; +- int success; +- pa_operation *o; +- +- pulse_lock(); +- delay.QuadPart = -stream->mmdev_period_usec * 10; +- pa_stream_get_time(stream->stream, &stream->last_time); +- pulse_unlock(); +- +- while (!stream->please_quit) +- { +- pa_usec_t now, adv_usec = 0; +- int err; +- +- NtDelayExecution(FALSE, &delay); +- +- pulse_lock(); +- +- delay.QuadPart = -stream->mmdev_period_usec * 10; +- +- o = pa_stream_update_timing_info(stream->stream, pulse_op_cb, &success); +- if (o) +- { +- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- err = pa_stream_get_time(stream->stream, &now); +- if (err == 0) +- { +- TRACE("got now: %s, last time: %s\n", wine_dbgstr_longlong(now), wine_dbgstr_longlong(stream->last_time)); +- if (stream->started && (stream->dataflow == eCapture || stream->held_bytes)) +- { +- if(stream->just_underran) +- { +- stream->last_time = now; +- stream->just_started = TRUE; +- } +- +- if (stream->just_started) +- { +- /* let it play out a period to absorb some latency and get accurate timing */ +- pa_usec_t diff = now - stream->last_time; +- +- if (diff > stream->mmdev_period_usec) +- { +- stream->just_started = FALSE; +- stream->last_time = now; +- } +- } +- else +- { +- INT32 adjust = stream->last_time + stream->mmdev_period_usec - now; +- +- adv_usec = now - stream->last_time; +- +- if(adjust > ((INT32)(stream->mmdev_period_usec / 2))) +- adjust = stream->mmdev_period_usec / 2; +- else if(adjust < -((INT32)(stream->mmdev_period_usec / 2))) +- adjust = -1 * stream->mmdev_period_usec / 2; +- +- delay.QuadPart = -(stream->mmdev_period_usec + adjust) * 10; +- +- stream->last_time += stream->mmdev_period_usec; +- } +- +- if (stream->dataflow == eRender) +- { +- pulse_write(stream); +- +- /* regardless of what PA does, advance one period */ +- adv_bytes = min(stream->period_bytes, stream->held_bytes); +- stream->lcl_offs_bytes += adv_bytes; +- stream->lcl_offs_bytes %= stream->real_bufsize_bytes; +- stream->held_bytes -= adv_bytes; +- } +- else if(stream->dataflow == eCapture) +- { +- pulse_read(stream); +- } +- } +- else +- { +- stream->last_time = now; +- delay.QuadPart = -stream->mmdev_period_usec * 10; +- } +- } +- +- if (stream->event) +- NtSetEvent(stream->event, NULL); +- +- TRACE("%p after update, adv usec: %d, held: %u, delay usec: %u\n", +- stream, (int)adv_usec, +- (int)(stream->held_bytes/ pa_frame_size(&stream->ss)), +- (unsigned int)(-delay.QuadPart / 10)); +- +- pulse_unlock(); +- } +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_start(void *args) +-{ +- struct start_params *params = args; +- struct pulse_stream *stream = params->stream; +- int success; +- pa_operation *o; +- +- params->result = S_OK; +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +- } +- +- if ((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_EVENTHANDLE_NOT_SET; +- return STATUS_SUCCESS; +- } +- +- if (stream->started) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_NOT_STOPPED; +- return STATUS_SUCCESS; +- } +- +- pulse_write(stream); +- +- if (pa_stream_is_corked(stream->stream)) +- { +- o = pa_stream_cork(stream->stream, 0, pulse_op_cb, &success); +- if (o) +- { +- while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- else +- success = 0; +- if (!success) +- params->result = E_FAIL; +- } +- +- if (SUCCEEDED(params->result)) +- { +- stream->started = TRUE; +- stream->just_started = TRUE; +- } +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_stop(void *args) +-{ +- struct stop_params *params = args; +- struct pulse_stream *stream = params->stream; +- pa_operation *o; +- int success; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (!stream->started) +- { +- pulse_unlock(); +- params->result = S_FALSE; +- return STATUS_SUCCESS; +- } +- +- params->result = S_OK; +- if (stream->dataflow == eRender) +- { +- o = pa_stream_cork(stream->stream, 1, pulse_op_cb, &success); +- if (o) +- { +- while(pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- else +- success = 0; +- if (!success) +- params->result = E_FAIL; +- } +- if (SUCCEEDED(params->result)) +- stream->started = FALSE; +- pulse_unlock(); +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_reset(void *args) +-{ +- struct reset_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (stream->started) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_NOT_STOPPED; +- return STATUS_SUCCESS; +- } +- +- if (stream->locked) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_BUFFER_OPERATION_PENDING; +- return STATUS_SUCCESS; +- } +- +- if (stream->dataflow == eRender) +- { +- /* If there is still data in the render buffer it needs to be removed from the server */ +- int success = 0; +- if (stream->held_bytes) +- { +- pa_operation *o = pa_stream_flush(stream->stream, pulse_op_cb, &success); +- if (o) +- { +- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) +- pulse_cond_wait(); +- pa_operation_unref(o); +- } +- } +- if (success || !stream->held_bytes) +- { +- stream->clock_lastpos = stream->clock_written = 0; +- stream->pa_offs_bytes = stream->lcl_offs_bytes = 0; +- stream->held_bytes = stream->pa_held_bytes = 0; +- } +- } +- else +- { +- ACPacket *p; +- stream->clock_written += stream->held_bytes; +- stream->held_bytes = 0; +- +- if ((p = stream->locked_ptr)) +- { +- stream->locked_ptr = NULL; +- list_add_tail(&stream->packet_free_head, &p->entry); +- } +- list_move_tail(&stream->packet_free_head, &stream->packet_filled_head); +- } +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static BOOL alloc_tmp_buffer(struct pulse_stream *stream, SIZE_T bytes) +-{ +- if (stream->tmp_buffer_bytes >= bytes) +- return TRUE; +- +- if (stream->tmp_buffer) +- { +- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, +- &stream->tmp_buffer_bytes, MEM_RELEASE); +- stream->tmp_buffer = NULL; +- stream->tmp_buffer_bytes = 0; +- } +- if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, +- 0, &bytes, MEM_COMMIT, PAGE_READWRITE)) +- return FALSE; +- +- stream->tmp_buffer_bytes = bytes; +- return TRUE; +-} +- +-static UINT32 pulse_render_padding(struct pulse_stream *stream) +-{ +- return stream->held_bytes / pa_frame_size(&stream->ss); +-} +- +-static UINT32 pulse_capture_padding(struct pulse_stream *stream) +-{ +- ACPacket *packet = stream->locked_ptr; +- if (!packet && !list_empty(&stream->packet_filled_head)) +- { +- packet = (ACPacket*)list_head(&stream->packet_filled_head); +- stream->locked_ptr = packet; +- list_remove(&packet->entry); +- } +- return stream->held_bytes / pa_frame_size(&stream->ss); +-} +- +-static NTSTATUS pulse_get_render_buffer(void *args) +-{ +- struct get_render_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- size_t bytes; +- UINT32 wri_offs_bytes; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (stream->locked) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_OUT_OF_ORDER; +- return STATUS_SUCCESS; +- } +- +- if (!params->frames) +- { +- pulse_unlock(); +- *params->data = NULL; +- params->result = S_OK; +- return STATUS_SUCCESS; +- } +- +- if (stream->held_bytes / pa_frame_size(&stream->ss) + params->frames > stream->bufsize_frames) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_BUFFER_TOO_LARGE; +- return STATUS_SUCCESS; +- } +- +- bytes = params->frames * pa_frame_size(&stream->ss); +- wri_offs_bytes = (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes; +- if (wri_offs_bytes + bytes > stream->real_bufsize_bytes) +- { +- if (!alloc_tmp_buffer(stream, bytes)) +- { +- pulse_unlock(); +- params->result = E_OUTOFMEMORY; +- return STATUS_SUCCESS; +- } +- *params->data = stream->tmp_buffer; +- stream->locked = -bytes; +- } +- else +- { +- *params->data = stream->local_buffer + wri_offs_bytes; +- stream->locked = bytes; +- } +- +- silence_buffer(stream->ss.format, *params->data, bytes); +- +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static void pulse_wrap_buffer(struct pulse_stream *stream, BYTE *buffer, UINT32 written_bytes) +-{ +- UINT32 wri_offs_bytes = (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes; +- UINT32 chunk_bytes = stream->real_bufsize_bytes - wri_offs_bytes; +- +- if (written_bytes <= chunk_bytes) +- { +- memcpy(stream->local_buffer + wri_offs_bytes, buffer, written_bytes); +- } +- else +- { +- memcpy(stream->local_buffer + wri_offs_bytes, buffer, chunk_bytes); +- memcpy(stream->local_buffer, buffer + chunk_bytes, written_bytes - chunk_bytes); +- } +-} +- +-static NTSTATUS pulse_release_render_buffer(void *args) +-{ +- struct release_render_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- UINT32 written_bytes; +- BYTE *buffer; +- +- pulse_lock(); +- if (!stream->locked || !params->written_frames) +- { +- stream->locked = 0; +- pulse_unlock(); +- params->result = params->written_frames ? AUDCLNT_E_OUT_OF_ORDER : S_OK; +- return STATUS_SUCCESS; +- } +- +- if (params->written_frames * pa_frame_size(&stream->ss) > +- (stream->locked >= 0 ? stream->locked : -stream->locked)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_INVALID_SIZE; +- return STATUS_SUCCESS; +- } +- +- if (stream->locked >= 0) +- buffer = stream->local_buffer + (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes; +- else +- buffer = stream->tmp_buffer; +- +- written_bytes = params->written_frames * pa_frame_size(&stream->ss); +- if (params->flags & AUDCLNT_BUFFERFLAGS_SILENT) +- silence_buffer(stream->ss.format, buffer, written_bytes); +- +- if (stream->locked < 0) +- pulse_wrap_buffer(stream, buffer, written_bytes); +- +- stream->held_bytes += written_bytes; +- stream->pa_held_bytes += written_bytes; +- if (stream->pa_held_bytes > stream->real_bufsize_bytes) +- { +- stream->pa_offs_bytes += stream->pa_held_bytes - stream->real_bufsize_bytes; +- stream->pa_offs_bytes %= stream->real_bufsize_bytes; +- stream->pa_held_bytes = stream->real_bufsize_bytes; +- } +- stream->clock_written += written_bytes; +- stream->locked = 0; +- +- TRACE("Released %u, held %lu\n", params->written_frames, stream->held_bytes / pa_frame_size(&stream->ss)); +- +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_capture_buffer(void *args) +-{ +- struct get_capture_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- ACPacket *packet; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- if (stream->locked) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_OUT_OF_ORDER; +- return STATUS_SUCCESS; +- } +- +- pulse_capture_padding(stream); +- if ((packet = stream->locked_ptr)) +- { +- *params->frames = stream->period_bytes / pa_frame_size(&stream->ss); +- *params->flags = 0; +- if (packet->discont) +- *params->flags |= AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY; +- if (params->devpos) +- { +- if (packet->discont) +- *params->devpos = (stream->clock_written + stream->period_bytes) / pa_frame_size(&stream->ss); +- else +- *params->devpos = stream->clock_written / pa_frame_size(&stream->ss); +- } +- if (params->qpcpos) +- *params->qpcpos = packet->qpcpos; +- *params->data = packet->data; +- } +- else +- *params->frames = 0; +- stream->locked = *params->frames; +- pulse_unlock(); +- params->result = *params->frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_release_capture_buffer(void *args) +-{ +- struct release_capture_buffer_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!stream->locked && params->done) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_OUT_OF_ORDER; +- return STATUS_SUCCESS; +- } +- if (params->done && stream->locked != params->done) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_INVALID_SIZE; +- return STATUS_SUCCESS; +- } +- if (params->done) +- { +- ACPacket *packet = stream->locked_ptr; +- stream->locked_ptr = NULL; +- stream->held_bytes -= stream->period_bytes; +- if (packet->discont) +- stream->clock_written += 2 * stream->period_bytes; +- else +- stream->clock_written += stream->period_bytes; +- list_add_tail(&stream->packet_free_head, &packet->entry); +- } +- stream->locked = 0; +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_buffer_size(void *args) +-{ +- struct get_buffer_size_params *params = args; +- +- params->result = S_OK; +- +- pulse_lock(); +- if (!pulse_stream_valid(params->stream)) +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- else +- *params->size = params->stream->bufsize_frames; +- pulse_unlock(); +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_latency(void *args) +-{ +- struct get_latency_params *params = args; +- struct pulse_stream *stream = params->stream; +- const pa_buffer_attr *attr; +- REFERENCE_TIME lat; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- attr = pa_stream_get_buffer_attr(stream->stream); +- if (stream->dataflow == eRender) +- lat = attr->minreq / pa_frame_size(&stream->ss); +- else +- lat = attr->fragsize / pa_frame_size(&stream->ss); +- *params->latency = (lat * 10000000) / stream->ss.rate + pulse_def_period[0]; +- pulse_unlock(); +- TRACE("Latency: %u ms\n", (DWORD)(*params->latency / 10000)); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_current_padding(void *args) +-{ +- struct get_current_padding_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- if (stream->dataflow == eRender) +- *params->padding = pulse_render_padding(stream); +- else +- *params->padding = pulse_capture_padding(stream); +- pulse_unlock(); +- +- TRACE("%p Pad: %u ms (%u)\n", stream, muldiv(*params->padding, 1000, stream->ss.rate), +- *params->padding); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_next_packet_size(void *args) +-{ +- struct get_next_packet_size_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- pulse_capture_padding(stream); +- if (stream->locked_ptr) +- *params->frames = stream->period_bytes / pa_frame_size(&stream->ss); +- else +- *params->frames = 0; +- pulse_unlock(); +- params->result = S_OK; +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_frequency(void *args) +-{ +- struct get_frequency_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- *params->freq = stream->ss.rate; +- if (stream->share == AUDCLNT_SHAREMODE_SHARED) +- *params->freq *= pa_frame_size(&stream->ss); +- pulse_unlock(); +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_get_position(void *args) +-{ +- struct get_position_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- { +- pulse_unlock(); +- params->result = AUDCLNT_E_DEVICE_INVALIDATED; +- return STATUS_SUCCESS; +- } +- +- *params->pos = stream->clock_written - stream->held_bytes; +- +- if (stream->share == AUDCLNT_SHAREMODE_EXCLUSIVE || params->device) +- *params->pos /= pa_frame_size(&stream->ss); +- +- /* Make time never go backwards */ +- if (*params->pos < stream->clock_lastpos) +- *params->pos = stream->clock_lastpos; +- else +- stream->clock_lastpos = *params->pos; +- pulse_unlock(); +- +- TRACE("%p Position: %u\n", stream, (unsigned)*params->pos); +- +- if (params->qpctime) +- { +- LARGE_INTEGER stamp, freq; +- NtQueryPerformanceCounter(&stamp, &freq); +- *params->qpctime = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart; +- } +- +- params->result = S_OK; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_set_volumes(void *args) +-{ +- struct set_volumes_params *params = args; +- struct pulse_stream *stream = params->stream; +- unsigned int i; +- +- for (i = 0; i < stream->ss.channels; i++) +- stream->vol[i] = params->volumes[i] * params->master_volume * params->session_volumes[i]; +- +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_set_event_handle(void *args) +-{ +- struct set_event_handle_params *params = args; +- struct pulse_stream *stream = params->stream; +- HRESULT hr = S_OK; +- +- pulse_lock(); +- if (!pulse_stream_valid(stream)) +- hr = AUDCLNT_E_DEVICE_INVALIDATED; +- else if (!(stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) +- hr = AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED; +- else if (stream->event) +- hr = HRESULT_FROM_WIN32(ERROR_INVALID_NAME); +- else +- stream->event = params->event; +- pulse_unlock(); +- +- params->result = hr; +- return STATUS_SUCCESS; +-} +- +-static NTSTATUS pulse_is_started(void *args) +-{ +- struct is_started_params *params = args; +- struct pulse_stream *stream = params->stream; +- +- pulse_lock(); +- params->started = pulse_stream_valid(stream) && stream->started; +- pulse_unlock(); +- +- return STATUS_SUCCESS; +-} +- +-static const unixlib_entry_t unix_funcs[] = +-{ +- pulse_main_loop, +- pulse_create_stream, +- pulse_release_stream, +- pulse_start, +- pulse_stop, +- pulse_reset, +- pulse_timer_loop, +- pulse_get_render_buffer, +- pulse_release_render_buffer, +- pulse_get_capture_buffer, +- pulse_release_capture_buffer, +- pulse_get_buffer_size, +- pulse_get_latency, +- pulse_get_current_padding, +- pulse_get_next_packet_size, +- pulse_get_frequency, +- pulse_get_position, +- pulse_set_volumes, +- pulse_set_event_handle, +- pulse_test_connect, +- pulse_is_started, +-}; +- +-NTSTATUS CDECL __wine_init_unix_lib(HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out) +-{ +- pthread_mutexattr_t attr; +- +- switch (reason) +- { +- case DLL_PROCESS_ATTACH: +- pthread_mutexattr_init(&attr); +- pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); +- +- if (pthread_mutex_init(&pulse_mutex, &attr) != 0) +- pthread_mutex_init(&pulse_mutex, NULL); +- +- *(UINT64 *)ptr_out = (UINT_PTR)&unix_funcs; +- break; +- case DLL_PROCESS_DETACH: +- if (pulse_ctx) +- { +- pa_context_disconnect(pulse_ctx); +- pa_context_unref(pulse_ctx); +- } +- if (pulse_ml) +- pa_mainloop_quit(pulse_ml, 0); +- +- } +- +- return STATUS_SUCCESS; +-} +diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h +deleted file mode 100644 +index 9e7af57b716e8d3edc4793ead64b35d4993a4a94..0000000000000000000000000000000000000000 +--- a/dlls/winepulse.drv/unixlib.h ++++ /dev/null +@@ -1,211 +0,0 @@ +-/* +- * Copyright 2021 Jacek Caban for CodeWeavers +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2.1 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 +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +- */ +- +-#include "wine/list.h" +- +-struct pulse_stream; +- +-struct pulse_config +-{ +- struct +- { +- WAVEFORMATEXTENSIBLE format; +- REFERENCE_TIME def_period; +- REFERENCE_TIME min_period; +- } modes[2]; +- unsigned int speakers_mask; +-}; +- +-struct main_loop_params +-{ +- HANDLE event; +-}; +- +-struct create_stream_params +-{ +- const char *name; +- EDataFlow dataflow; +- AUDCLNT_SHAREMODE mode; +- DWORD flags; +- REFERENCE_TIME duration; +- const WAVEFORMATEX *fmt; +- HRESULT result; +- UINT32 *channel_count; +- struct pulse_stream **stream; +-}; +- +-struct release_stream_params +-{ +- struct pulse_stream *stream; +- HANDLE timer; +- HRESULT result; +-}; +- +-struct start_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +-}; +- +-struct stop_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +-}; +- +-struct reset_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +-}; +- +-struct timer_loop_params +-{ +- struct pulse_stream *stream; +-}; +- +-struct get_render_buffer_params +-{ +- struct pulse_stream *stream; +- UINT32 frames; +- HRESULT result; +- BYTE **data; +-}; +- +-struct release_render_buffer_params +-{ +- struct pulse_stream *stream; +- UINT32 written_frames; +- DWORD flags; +- HRESULT result; +-}; +- +-struct get_capture_buffer_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- BYTE **data; +- UINT32 *frames; +- DWORD *flags; +- UINT64 *devpos; +- UINT64 *qpcpos; +-}; +- +-struct release_capture_buffer_params +-{ +- struct pulse_stream *stream; +- BOOL done; +- HRESULT result; +-}; +- +-struct get_buffer_size_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT32 *size; +-}; +- +-struct get_latency_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- REFERENCE_TIME *latency; +-}; +- +-struct get_current_padding_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT32 *padding; +-}; +- +-struct get_next_packet_size_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT32 *frames; +-}; +- +-struct get_frequency_params +-{ +- struct pulse_stream *stream; +- HRESULT result; +- UINT64 *freq; +-}; +- +-struct get_position_params +-{ +- struct pulse_stream *stream; +- BOOL device; +- HRESULT result; +- UINT64 *pos; +- UINT64 *qpctime; +-}; +- +-struct set_volumes_params +-{ +- struct pulse_stream *stream; +- float master_volume; +- const float *volumes; +- const float *session_volumes; +-}; +- +-struct set_event_handle_params +-{ +- struct pulse_stream *stream; +- HANDLE event; +- HRESULT result; +-}; +- +-struct test_connect_params +-{ +- const char *name; +- HRESULT result; +- struct pulse_config *config; +-}; +- +-struct is_started_params +-{ +- struct pulse_stream *stream; +- BOOL started; +-}; +- +-enum unix_funcs +-{ +- main_loop, +- create_stream, +- release_stream, +- start, +- stop, +- reset, +- timer_loop, +- get_render_buffer, +- release_render_buffer, +- get_capture_buffer, +- release_capture_buffer, +- get_buffer_size, +- get_latency, +- get_current_padding, +- get_next_packet_size, +- get_frequency, +- get_position, +- set_volumes, +- set_event_handle, +- test_connect, +- is_started, +-}; +diff --git a/include/audioclient.idl b/include/audioclient.idl +index 754ae58f78c9a014c5990250fa739c711902c819..c69a4116789190bc5ed025dc32176dd8b2081c07 100644 +--- a/include/audioclient.idl ++++ b/include/audioclient.idl +@@ -128,14 +128,6 @@ typedef struct _AudioClientProperties + AUDCLNT_STREAMOPTIONS Options; + } AudioClientProperties; + +-typedef struct _Win8AudioClientProperties +-{ +- UINT32 cbSize; +- BOOL bIsOffload; +- AUDIO_STREAM_CATEGORY eCategory; +- /* Options field added in Win 8.1 */ +-} Win8AudioClientProperties; +- + [ + local, + pointer_default(unique), +-- +2.32.0 + diff --git a/overlays/misc/wine-lowlatency.patch b/overlays/misc/wine/0002-5.14-Latency-Fix.patch similarity index 50% rename from overlays/misc/wine-lowlatency.patch rename to overlays/misc/wine/0002-5.14-Latency-Fix.patch index dfe464f..518538f 100644 --- a/overlays/misc/wine-lowlatency.patch +++ b/overlays/misc/wine/0002-5.14-Latency-Fix.patch @@ -1,18 +1,27 @@ -diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c -index 55579ecda80..6f7ff732135 100644 ---- a/dlls/winepulse.drv/pulse.c -+++ b/dlls/winepulse.drv/pulse.c -@@ -93,9 +93,6 @@ static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2]; - - static UINT g_phys_speakers_mask = 0; +From 4a2c23db4eddd827ac81513af43bc92475ad7d3a Mon Sep 17 00:00:00 2001 +From: Sebastian 'gonX' Jensen +Date: Sun, 20 Jun 2021 17:02:15 +0200 +Subject: [PATCH 2/4] 5.14 Latency Fix + +--- + dlls/winepulse.drv/mmdevdrv.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 07407089ac5af65eb13d6e00b6d0969a61ec5589..3ed47e38c830987e4bcc2e9f5c59c7773fe686f1 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -68,9 +68,6 @@ enum DriverPriority { + Priority_Preferred + }; -static const REFERENCE_TIME MinimumPeriod = 30000; -static const REFERENCE_TIME DefaultPeriod = 100000; - - static pthread_mutex_t pulse_mutex; - static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; + static pa_context *pulse_ctx; + static pa_mainloop *pulse_ml; -@@ -481,11 +478,12 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { +@@ -510,11 +507,12 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) { if (length) pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss); @@ -30,10 +39,11 @@ index 55579ecda80..6f7ff732135 100644 wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); -@@ -836,6 +834,13 @@ static NTSTATUS pulse_create_stream(void *args) - if (duration < 3 * period) - duration = 3 * period; - +@@ -1640,6 +1638,14 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient2 *iface, + if (duration <= 2 * period) + period /= 2; + } ++ + const char* denv = getenv("STAGING_AUDIO_DURATION"); + if (denv) { + int val = atoi(denv); @@ -41,6 +51,9 @@ index 55579ecda80..6f7ff732135 100644 + printf("Staging audio duration set to %d.\n", val); + } + - stream->period_bytes = pa_frame_size(&stream->ss) * muldiv(period, stream->ss.rate, 10000000); + period_bytes = pa_frame_size(&This->ss) * MulDiv(period, This->ss.rate, 10000000); - stream->bufsize_frames = ceil((duration / 10000000.) * params->fmt->nSamplesPerSec); + if (duration < 20000000) +-- +2.32.0 + diff --git a/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch b/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch new file mode 100644 index 0000000..7800d50 --- /dev/null +++ b/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch @@ -0,0 +1,26 @@ +From e17fb0bda3c042beec05b918e2d171211742e01c Mon Sep 17 00:00:00 2001 +From: Torge Matthies +Date: Fri, 12 Feb 2021 13:58:35 +0100 +Subject: [PATCH 3/4] secur32: Fix crash from invalid context in + InitializeSecurityContextW. + +Signed-off-by: Torge Matthies +--- + dlls/secur32/schannel.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c +index 9c7e98b32a4c55588a78ac6c3811b89db9e09db7..b2baefbc8caaf370c9c0ec31b7daf4cc9bb7fbb8 100644 +--- a/dlls/secur32/schannel.c ++++ b/dlls/secur32/schannel.c +@@ -983,6 +983,7 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW( + unsigned char *ptr; + + ctx = schan_get_object(phContext->dwLower, SCHAN_HANDLE_CTX); ++ if (!ctx) return SEC_E_INVALID_HANDLE; + if (pInput) + { + idx = schan_find_sec_buffer_idx(pInput, 0, SECBUFFER_TOKEN); +-- +2.32.0 + diff --git a/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch b/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch new file mode 100644 index 0000000..22cd561 --- /dev/null +++ b/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch @@ -0,0 +1,87 @@ +From b1ac42097f6f6e038a2e1fac773bc31e829fb891 Mon Sep 17 00:00:00 2001 +From: Torge Matthies +Date: Mon, 5 Apr 2021 05:48:28 +0200 +Subject: [PATCH 4/4] kernelbase: Cache last used locale->sortguid mapping. + +get_language_sort reads from the registry, which is not particularly fast. +Staging's implementation of CompareStringEx calls this function, and if +CompareStringEx is used in a loop over many elements, it will slow down the +application by a lot (> 30 seconds vs a few hundred ms in osu!, depends +on the CPU and the number of installed beatmaps). + +Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50923 +Signed-off-by: Torge Matthies +--- + dlls/kernelbase/locale.c | 42 +++++++++++++++++++++++++++++++++++++++- + 1 file changed, 41 insertions(+), 1 deletion(-) + +diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c +index 89b3577505348a001577ba3549b8af2d1e6cb456..db97383f2858455f8c329f326d4b3f9f3ec606cb 100644 +--- a/dlls/kernelbase/locale.c ++++ b/dlls/kernelbase/locale.c +@@ -619,6 +619,21 @@ static CRITICAL_SECTION_DEBUG critsect_debug = + }; + static CRITICAL_SECTION locale_section = { &critsect_debug, -1, 0, 0, 0, 0 }; + ++static struct ++{ ++ WCHAR locale[LOCALE_NAME_MAX_LENGTH]; /* The locale name */ ++ const struct sortguid *guid; /* The cached associated GUID */ ++} sortguid_cache; ++ ++static CRITICAL_SECTION sortguid_cache_section; ++static CRITICAL_SECTION_DEBUG sortguid_cache_section_debug = ++{ ++ 0, 0, &sortguid_cache_section, ++ { &sortguid_cache_section_debug.ProcessLocksList, &sortguid_cache_section_debug.ProcessLocksList }, ++ 0, 0, { (DWORD_PTR)(__FILE__ ": sortguid_cache_section") } ++}; ++static CRITICAL_SECTION sortguid_cache_section = { &sortguid_cache_section_debug, -1, 0, 0, 0, 0 }; ++ + + static void init_sortkeys( DWORD *ptr ) + { +@@ -656,7 +671,7 @@ static const struct sortguid *find_sortguid( const GUID *guid ) + } + + +-static const struct sortguid *get_language_sort( const WCHAR *locale ) ++static const struct sortguid *get_language_sort_uncached( const WCHAR *locale ) + { + WCHAR *p, *end, buffer[LOCALE_NAME_MAX_LENGTH], guidstr[39]; + const struct sortguid *ret; +@@ -699,6 +714,31 @@ done: + } + + ++static const struct sortguid *get_language_sort( const WCHAR *locale ) ++{ ++ const struct sortguid *ret = NULL; ++ ++ if (!locale) return get_language_sort_uncached( locale ); ++ ++ RtlEnterCriticalSection( &sortguid_cache_section ); ++ ++ if (sortguid_cache.guid && !wcsncmp( sortguid_cache.locale, locale, LOCALE_NAME_MAX_LENGTH )) ++ { ++ ret = sortguid_cache.guid; ++ goto done; ++ } ++ ++ ret = get_language_sort_uncached( locale ); ++ ++ lstrcpynW( sortguid_cache.locale, locale, LOCALE_NAME_MAX_LENGTH ); ++ sortguid_cache.guid = ret; ++ ++done: ++ RtlLeaveCriticalSection( &sortguid_cache_section ); ++ return ret; ++} ++ ++ + static LCID locale_to_lcid( WCHAR *win_name ) + { + WCHAR *p; +-- +2.32.0 + diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix index ce0f2fb..78be721 100644 --- a/overlays/wine-osu.nix +++ b/overlays/wine-osu.nix @@ -1,6 +1,6 @@ self: super: { wine-osu = (super.wineStaging.overrideDerivation(o: { - patches = (o.patches or []) ++ [ ./misc/wine-lowlatency.patch ]; + patches = (o.patches or []) ++ builtins.map (e: ./misc/wine + ("/" + e)) (builtins.attrNames (builtins.readDir ./misc/wine)); })).override { wineRelease = "staging"; wineBuild = "wineWow"; From e467153ddcb315d7a902b1bc0d0e79e8e5d7cb01 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 24 Jun 2021 08:44:19 +0700 Subject: [PATCH 0007/1112] pinning wine version --- overlays/wine-osu.nix | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix index 78be721..9fdbdfb 100644 --- a/overlays/wine-osu.nix +++ b/overlays/wine-osu.nix @@ -1,6 +1,32 @@ -self: super: { +self: super: +let + wine = super.fetchFromGitHub rec { + owner = "wine-mirror"; + repo = "wine"; + rev = "1de583a4dac7d704b2d4291ada4a1885cd8cd1c9"; + sha256 = "02v725qjsibiv6ad6hxsc6199dvlmnp7983286a4k8rygqnvqln9"; + }; + + staging = super.fetchFromGitHub rec { + owner = "wine-staging"; + repo = "wine-staging"; + rev = "432c0b5a838cb8ebb52d0d37150a57e393b6f33d"; + sha256 = "0gbci8fjvl1bdz7fj4bh25mqrgi1i04q5na2ckv9hj9nh9x7crbm"; + }; +in { wine-osu = (super.wineStaging.overrideDerivation(o: { patches = (o.patches or []) ++ builtins.map (e: ./misc/wine + ("/" + e)) (builtins.attrNames (builtins.readDir ./misc/wine)); + + src = wine; + postPatch = self.postPatch or "" + '' + patchShebangs tools + cp -r ${staging}/patches . + chmod +w patches + cd patches + patchShebangs gitapply.sh + ./patchinstall.sh DESTDIR="$PWD/.." --all + cd .. + ''; })).override { wineRelease = "staging"; wineBuild = "wineWow"; From 2c15a0fc756e66939e866f316052aca310e0edbc Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 24 Jun 2021 08:52:48 +0700 Subject: [PATCH 0008/1112] update wine sha256 the source aren't the same hmmmmmmmmmmmmmmmm --- overlays/wine-osu.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix index 9fdbdfb..d7d4a33 100644 --- a/overlays/wine-osu.nix +++ b/overlays/wine-osu.nix @@ -4,7 +4,7 @@ let owner = "wine-mirror"; repo = "wine"; rev = "1de583a4dac7d704b2d4291ada4a1885cd8cd1c9"; - sha256 = "02v725qjsibiv6ad6hxsc6199dvlmnp7983286a4k8rygqnvqln9"; + sha256 = "0h3wgd84lvv55b4fknzkclnmkj32c5xcr7z0fgqkfghv2b0ywpnb"; }; staging = super.fetchFromGitHub rec { From 3655af58284da1a427a064cd006f5fc7f44378f5 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 24 Jun 2021 08:59:59 +0700 Subject: [PATCH 0009/1112] update wine sha256 when you use nix-prefetch-url without --unpack --- overlays/wine-osu.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix index d7d4a33..9bdb29c 100644 --- a/overlays/wine-osu.nix +++ b/overlays/wine-osu.nix @@ -4,7 +4,7 @@ let owner = "wine-mirror"; repo = "wine"; rev = "1de583a4dac7d704b2d4291ada4a1885cd8cd1c9"; - sha256 = "0h3wgd84lvv55b4fknzkclnmkj32c5xcr7z0fgqkfghv2b0ywpnb"; + sha256 = "1mbyy3szwgi0wjgb30hqy8y9azx6xnjrz80j3j1liv3194bmsia1"; }; staging = super.fetchFromGitHub rec { From 23002bf18da367b421ad29f6b656646b4f3ad78e Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Fri, 25 Jun 2021 08:20:12 +0700 Subject: [PATCH 0010/1112] set kernel preempt --- overlays/linux.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/overlays/linux.nix b/overlays/linux.nix index 6f1eb90..be8cff2 100644 --- a/overlays/linux.nix +++ b/overlays/linux.nix @@ -46,6 +46,13 @@ self: super: { HZ_1000 = yes; HZ_1000_NODEF = yes; + # preempt + CONFIG_PREEMPT = yes; + CONFIG_PREEMPT_COUNT = yes; + CONFIG_PREEMPT_VOLUNTARY = no; + CONFIG_PREEMPTION = yes; + CONFIG_PREEMPT_DYNAMIC = yes; + # scheduler # SCHED_ALT = yes; # SCHED_PDS = yes; From e6c3fd1e9a9f597d51ec355db5162bcac092828d Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Fri, 25 Jun 2021 08:23:10 +0700 Subject: [PATCH 0011/1112] bump kernel - 5.12.13 --- overlays/linux.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overlays/linux.nix b/overlays/linux.nix index be8cff2..5e43fad 100644 --- a/overlays/linux.nix +++ b/overlays/linux.nix @@ -3,7 +3,7 @@ self: super: { let major = "5"; minor = "12"; - patch = "10"; + patch = "13"; tkg = "2da317c20ed6f70085b195639b9aad2cacf31ab5"; mm = "${major}.${minor}"; @@ -92,7 +92,7 @@ self: super: { # Kernel version patch { name = "patch-${patch}"; - patch = kernelUrl "patch-${mmp}" "06ddk5d81lnkkhg1691b7vh5zqqw93prkxsf3gy2cflzsjdb6kh3"; + patch = kernelUrl "patch-${mmp}" "17d38hns5qfbw1pajpa5y38v86r49nqnw7a3pwsay5fapj69z8w4"; } # AMD SI manual clocking From 3959c0fcf6bc7d60632b164d49e4849a6fc6df86 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Fri, 25 Jun 2021 10:04:38 +0700 Subject: [PATCH 0012/1112] add transmission-remote-gtk --- users/rin/home.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/users/rin/home.nix b/users/rin/home.nix index 47de358..d866e69 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -22,6 +22,7 @@ pavucontrol tor-browser-bundle-bin transcrypt + transmission-remote-gtk unrar vlc wine-osu From 020b686d69f72a035a4c38b3387d81c884a6d329 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Fri, 25 Jun 2021 11:03:26 +0700 Subject: [PATCH 0013/1112] pain --- overlays/linux.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/overlays/linux.nix b/overlays/linux.nix index 5e43fad..eceadd3 100644 --- a/overlays/linux.nix +++ b/overlays/linux.nix @@ -47,11 +47,11 @@ self: super: { HZ_1000_NODEF = yes; # preempt - CONFIG_PREEMPT = yes; - CONFIG_PREEMPT_COUNT = yes; - CONFIG_PREEMPT_VOLUNTARY = no; - CONFIG_PREEMPTION = yes; - CONFIG_PREEMPT_DYNAMIC = yes; + PREEMPT = yes; + PREEMPT_COUNT = yes; + PREEMPT_VOLUNTARY = no; + PREEMPTION = yes; + PREEMPT_DYNAMIC = yes; # scheduler # SCHED_ALT = yes; From 510d5ace8fa845189a025f0f643e3a7527b00f8a Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 26 Jun 2021 20:11:31 +0700 Subject: [PATCH 0014/1112] more decluttering --- users/rin/zsh.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index 8fb6d3b..1921aa6 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -125,6 +125,7 @@ in rec { XAUTHORITY = "$XDG_RUNTIME_DIR/Xauthority"; EDITOR = "nvim"; + _JAVA_OPTIONS = "-Djava.util.prefs.userRoot=${config.xdg.configHome}/java"; CARGO_HOME = "${config.xdg.dataHome}/cargo"; DIRENV_LOG_FORMAT = ""; GNUPGHOME = "${config.xdg.dataHome}/gnupg"; @@ -132,6 +133,7 @@ in rec { LESSHISTFILE = "-"; NODE_REPL_HISTORY="${config.xdg.dataHome}/nodejs/repl_history"; NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc"; + PUB_CACHE = "${config.xdg.cacheHome}/dart"; WGETRC = "${config.xdg.configHome}/wgetrc"; XINITRC = "${config.xdg.configHome}/xorg/xinitrc"; From 268a85c2efa45ac14b2a32270d2cc85559e7a912 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 26 Jun 2021 22:16:58 +0700 Subject: [PATCH 0015/1112] switch home-manager branch waiting for upstream, maybe :3 --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 5f307ab..d59f3ff 100644 --- a/flake.lock +++ b/flake.lock @@ -7,16 +7,16 @@ ] }, "locked": { - "lastModified": 1624126484, - "narHash": "sha256-x0LmdaceksI7posLR3yRzuIwuaK+Sf7/r+g9OX9uYAA=", + "lastModified": 1624718580, + "narHash": "sha256-hzt3zC4lm7XvvEISpaJirotBOo7XYdeI3cVslT/BvMw=", "owner": "LavaDesu", "repo": "home-manager", - "rev": "410c8a5d87e6d341fca25f8632b2e2e5df4c1982", + "rev": "c52a96d07de8930de256ffeffd82314757f7a5da", "type": "github" }, "original": { "owner": "LavaDesu", - "ref": "xsession-profilePath", + "ref": "aa", "repo": "home-manager", "type": "github" } diff --git a/flake.nix b/flake.nix index 6cd5567..2995406 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { inputs = { nixpkgs = { url = "github:NixOS/nixpkgs/nixos-unstable"; }; - home-manager = { url = "github:LavaDesu/home-manager/xsession-profilePath"; }; + home-manager = { url = "github:LavaDesu/home-manager/aa"; }; secrets = { url = "github:LavaDesu/flakes-secrets"; }; home-manager.inputs.nixpkgs.follows = "nixpkgs"; From d9b73bfd43ff31590a16c05fb87112c6f56cee62 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 26 Jun 2021 23:48:15 +0700 Subject: [PATCH 0016/1112] refactoring - overlays/{linux,wine-osu}.nix -> packages/{linux-lava,wine-osu}/ - overlays/misc/ -> overlays/patches/ - overlays/misc/0001...patch -> packages/linux-lava/si...patch - overlays/misc/wine/ -> packages/wine-osu/patches/ - flake.nix: - overlays are dynamically read from overlays/ - define custom packages separately - packages/* - now imported using callPackage --- flake.nix | 53 +++---- hosts/winter/kernel.nix | 2 +- overlays/linux.nix | 126 ----------------- overlays/{misc => patches}/startx.patch | 0 overlays/{misc => patches}/transcrypt.patch | 0 overlays/transcrypt.nix | 2 +- overlays/wine-osu.nix | 45 ------ overlays/xinit.nix | 2 +- packages/linux-lava/default.nix | 129 ++++++++++++++++++ .../linux-lava/si-manual-clocking.patch | 0 packages/wine-osu/default.nix | 51 +++++++ .../0001-Revert-to-5.14-winepulse.drv.patch | 0 .../patches}/0002-5.14-Latency-Fix.patch | 0 ...h-from-invalid-context-in-Initialize.patch | 0 ...he-last-used-locale-sortguid-mapping.patch | 0 15 files changed, 210 insertions(+), 200 deletions(-) delete mode 100644 overlays/linux.nix rename overlays/{misc => patches}/startx.patch (100%) rename overlays/{misc => patches}/transcrypt.patch (100%) delete mode 100644 overlays/wine-osu.nix create mode 100644 packages/linux-lava/default.nix rename overlays/misc/0001-Lava-s-amdgpu-patches.patch => packages/linux-lava/si-manual-clocking.patch (100%) create mode 100644 packages/wine-osu/default.nix rename {overlays/misc/wine => packages/wine-osu/patches}/0001-Revert-to-5.14-winepulse.drv.patch (100%) rename {overlays/misc/wine => packages/wine-osu/patches}/0002-5.14-Latency-Fix.patch (100%) rename {overlays/misc/wine => packages/wine-osu/patches}/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch (100%) rename {overlays/misc/wine => packages/wine-osu/patches}/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch (100%) diff --git a/flake.nix b/flake.nix index 2995406..f1585df 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,26 @@ outputs = inputs: with inputs; let + getPaths = root: builtins.map + (path: root + ("/" + path)) # Prepends root path + (builtins.attrNames (builtins.readDir root)); # Reads root path + + customPackages = pkgs: + let + callPackage = pkgs.callPackage; + in { + linux-lava = callPackage ./packages/linux-lava {}; + wine-osu = callPackage ./packages/wine-osu { inherit getPaths; }; + }; + + overlays = (builtins.map + (path: import path) # Imports path + (builtins.filter + (path: nixpkgs.lib.hasSuffix ".nix" path) # Checks file extension + (getPaths ./overlays) + ) + ) ++ [(self: super: customPackages super)]; + revCount = "297098"; base = { config, ... }: { system = { @@ -19,23 +39,14 @@ }; }; nix.registry.nixpkgs.flake = nixpkgs; - nixpkgs.overlays = builtins.attrValues overlays; + nixpkgs.overlays = overlays; }; + hm-base = { - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - }; - overlays = { - discord = import ./overlays/discord.nix; - linux = import ./overlays/linux.nix; - material-icons = import ./overlays/material-icons.nix; - mps-youtube = import ./overlays/mps-youtube.nix; - picom = import ./overlays/picom.nix; - polybar = import ./overlays/polybar.nix; - transcrypt = import ./overlays/transcrypt.nix; - winetricks = import ./overlays/winetricks.nix; - wine-osu = import ./overlays/wine-osu.nix; - xinit = import ./overlays/xinit.nix; + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + }; }; in { @@ -48,17 +59,7 @@ ./hosts/winter secrets.nixosModules.winter ]; - specialArgs = { inherit overlays; }; }; - - packages.x86_64-linux = - let - pkgs = import nixpkgs { - overlays = builtins.attrValues overlays; - system = "x86_64-linux"; - }; - in { - inherit (pkgs) linux-lava wine-osu; - }; + packages.x86_64-linux = customPackages nixpkgs.legacyPackages.x86_64-linux; }; } diff --git a/hosts/winter/kernel.nix b/hosts/winter/kernel.nix index 320a9c7..68f2cf6 100644 --- a/hosts/winter/kernel.nix +++ b/hosts/winter/kernel.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ...}: { +{ config, pkgs, ... }: { powerManagement.cpuFreqGovernor = "ondemand"; boot = { loader = { diff --git a/overlays/linux.nix b/overlays/linux.nix deleted file mode 100644 index eceadd3..0000000 --- a/overlays/linux.nix +++ /dev/null @@ -1,126 +0,0 @@ -self: super: { - linux-lava = super.buildLinux ( - let - major = "5"; - minor = "12"; - patch = "13"; - tkg = "2da317c20ed6f70085b195639b9aad2cacf31ab5"; - - mm = "${major}.${minor}"; - mmp = "${major}.${minor}.${patch}"; - - kernelUrl = name: sha256: builtins.fetchurl { - inherit sha256; - url = "https://cdn.kernel.org/pub/linux/kernel/v${major}.x/${name}.xz"; - }; - - tkgPatch = name: sha256: { - inherit name; - patch = builtins.fetchurl { - inherit sha256; - url = "https://raw.githubusercontent.com/Frogging-Family/linux-tkg/${tkg}/linux-tkg-patches/${mm}/${name}.patch"; - }; - }; - in { - version = "${mmp}-tkg-Lava"; - isZen = true; - # TODO: - # some stuff is set in pkgs/os-specific/linux/kernel/common-config.nix - # but i have no idea how to change it - structuredExtraConfig = with super.lib.kernel; builtins.mapAttrs (_: value: super.lib.mkForce value) { - LOCALVERSION = freeform "-tkg-Lava"; - ZENIFY = yes; - FUTEX2 = yes; - MHASWELL = yes; - WINESYNC = module; - - # timers - HZ_PERIODIC = no; - NO_HZ = yes; - NO_HZ_COMMON = yes; - NO_HZ_FULL = yes; - NO_HZ_IDLE = no; - CONTEXT_TRACKING = yes; - CONTEXT_TRACKING_FORCE = yes; - # HZ_100 = yes; - HZ_1000 = yes; - HZ_1000_NODEF = yes; - - # preempt - PREEMPT = yes; - PREEMPT_COUNT = yes; - PREEMPT_VOLUNTARY = no; - PREEMPTION = yes; - PREEMPT_DYNAMIC = yes; - - # scheduler - # SCHED_ALT = yes; - # SCHED_PDS = yes; - CACULE_SCHED = yes; - - # cacule stuff - SCHED_AUTOGROUP = yes; - BSD_PROCESS_ACCT = no; - TASK_XACCT = no; - CGROUP_CPUACCT = no; - CGROUP_DEBUG = no; - - # disable numa - NUMA = no; - AMD_NUMA = no; - X86_64_ACPI_NUMA = no; - NODES_SPAN_OTHER_NODES = no; - NUMA_EMU = no; - NEED_MULTIPLE_NODES = no; - USE_PERCPU_NUMA_NODE_ID = no; - ACPI_NUMA = no; - - # disable misc debugging - SLUB_DEBUG = no; - PM_DEBUG = no; - PM_ADVANCED_DEBUG = no; - PM_SLEEP_DEBUG = no; - ACPI_DEBUG = no; - SCHED_DEBUG = no; - LATENCYTOP = no; - DEBUG_PREEMPT = no; - }; - ignoreConfigErrors = true; - - src = kernelUrl "linux-${mm}.tar" "0rn3z942vjc7bixjw066rm6kcr0x0wzgxqfq1f6xd113pzrgc3bx"; - kernelPatches = [ - # Kernel version patch - { - name = "patch-${patch}"; - patch = kernelUrl "patch-${mmp}" "17d38hns5qfbw1pajpa5y38v86r49nqnw7a3pwsay5fapj69z8w4"; - } - - # AMD SI manual clocking - { - name = "amd"; - patch = ./misc/0001-Lava-s-amdgpu-patches.patch; - } - - # Graysky gcc patches - { - name = "graysky-gcc"; - patch = builtins.fetchurl { - url = "https://raw.githubusercontent.com/graysky2/kernel_gcc_patch/d2e7942c19ee568638d3795cf52db5274a90ce0a/more-uarches-for-kernel-5.8+.patch"; - sha256 = "16jbknjlg12jxbj8cjkk01djvr01n9zz7qlzxppcqizmz55vk0wh"; - }; - } - - # TK-Glitch patches - ( tkgPatch "0002-clear-patches" "1h1gx6rq2c961d36z1szqv9xpq1xgz2bhqjsyb03jjdrdzlcv9rm" ) - ( tkgPatch "0003-cacule-${mm}" "1rgdk1x514xsjwcjjcdmggbaj6biql5p41skn98ysqbjaw7k22ib" ) - ( tkgPatch "0003-glitched-base" "1dg177i3y54z5nadc5678hm67angram2vlr314mpxv3jgsh7vj8s" ) - ( tkgPatch "0003-glitched-cfs" "1cm4s72pymxnh37da84qrzvrwbbwagk46m1xsk99ir7cjb1l1zay" ) - # ( tkgPatch "0005-glitched-pds" "0833awp8n9ngyl5spx8znwyw1lj3nacp8vg7ffysw0j5r8akv9pw" ) - ( tkgPatch "0007-v${mm}-fsync" "0mplwdglw58bmkkxix4ccwgax3r02gahax9042dx33mybdnbl0mk" ) - ( tkgPatch "0007-v${mm}-futex2_interface" "1j29zyx2s85scfhbprgb9cs11rp50glbzczl4plphli8wds342pw" ) - ( tkgPatch "0007-v${mm}-winesync" "1av2k86ns0zc3lmgbfdch1z2a808brp2jvsfl4cwwlwwb51qzipp" ) - # ( tkgPatch "0009-prjc_v${mm}-r1" "1z731jiwyc7z4d5hzd6szrxnvw0iygbqx82y2anzm32n22731dqv" ) - ( tkgPatch "0012-misc-additions" "092ws9v1snk61i6x3gbqm5m803zd81wykkdxizn7knvy2r611cbz") - ]; - }); -} diff --git a/overlays/misc/startx.patch b/overlays/patches/startx.patch similarity index 100% rename from overlays/misc/startx.patch rename to overlays/patches/startx.patch diff --git a/overlays/misc/transcrypt.patch b/overlays/patches/transcrypt.patch similarity index 100% rename from overlays/misc/transcrypt.patch rename to overlays/patches/transcrypt.patch diff --git a/overlays/transcrypt.nix b/overlays/transcrypt.nix index 85f350f..cce969a 100644 --- a/overlays/transcrypt.nix +++ b/overlays/transcrypt.nix @@ -2,7 +2,7 @@ self: super: { transcrypt = super.transcrypt.overrideAttrs(o: rec { version = "2.1.0"; - patches = [ ./misc/transcrypt.patch ]; + patches = [ ./patches/transcrypt.patch ]; src = super.fetchFromGitHub { owner = "elasticdog"; repo = "transcrypt"; diff --git a/overlays/wine-osu.nix b/overlays/wine-osu.nix deleted file mode 100644 index 78be721..0000000 --- a/overlays/wine-osu.nix +++ /dev/null @@ -1,45 +0,0 @@ -self: super: { - wine-osu = (super.wineStaging.overrideDerivation(o: { - patches = (o.patches or []) ++ builtins.map (e: ./misc/wine + ("/" + e)) (builtins.attrNames (builtins.readDir ./misc/wine)); - })).override { - wineRelease = "staging"; - wineBuild = "wineWow"; - - pngSupport = true; - jpegSupport = true; - tiffSupport = true; - gettextSupport = true; - fontconfigSupport = true; - alsaSupport = true; - gtkSupport = true; - openglSupport = true; - tlsSupport = true; - gstreamerSupport = true; - #cupsSupport = true; - colorManagementSupport = true; - dbusSupport = true; - mpg123Support = true; - #openalSupport = true; - #openclSupport = true; - #cairoSupport = true; - #odbcSupport = true; - netapiSupport = true; - cursesSupport = true; - vaSupport = true; - pcapSupport = true; - #v4lSupport = true; - #saneSupport = true; - gsmSupport = true; - #gphoto2Support = true; - #ldapSupport = true; - pulseaudioSupport = true; - udevSupport = true; - xineramaSupport = true; - xmlSupport = true; - vulkanSupport = true; - sdlSupport = true; - faudioSupport = true; - vkd3dSupport = true; - mingwSupport = true; - }; -} diff --git a/overlays/xinit.nix b/overlays/xinit.nix index f89ce59..f9e13c7 100644 --- a/overlays/xinit.nix +++ b/overlays/xinit.nix @@ -4,7 +4,7 @@ self: super: { # Some info: # - Make startx use $XAUTHORITY as server auth files instead of .serverauth.$$ # - Make startx respect $XINITRC and $XSERVERRC - patches = o.patches ++ [ ./misc/startx.patch ]; + patches = o.patches ++ [ ./patches/startx.patch ]; }); }; } diff --git a/packages/linux-lava/default.nix b/packages/linux-lava/default.nix new file mode 100644 index 0000000..f57ea08 --- /dev/null +++ b/packages/linux-lava/default.nix @@ -0,0 +1,129 @@ +{ + buildLinux, + kernelPatches, + lib, + ... +} @ args: +let + major = "5"; + minor = "12"; + patch = "13"; + tkg = "2da317c20ed6f70085b195639b9aad2cacf31ab5"; + + mm = "${major}.${minor}"; + mmp = "${major}.${minor}.${patch}"; + + kernelUrl = name: sha256: builtins.fetchurl { + inherit sha256; + url = "https://cdn.kernel.org/pub/linux/kernel/v${major}.x/${name}.xz"; + }; + + tkgPatch = name: sha256: { + inherit name; + patch = builtins.fetchurl { + inherit sha256; + url = "https://raw.githubusercontent.com/Frogging-Family/linux-tkg/${tkg}/linux-tkg-patches/${mm}/${name}.patch"; + }; + }; +in buildLinux (args // { + version = "${mmp}-tkg-Lava"; + isZen = true; + # TODO: + # some stuff is set in pkgs/os-specific/linux/kernel/common-config.nix + # but i have no idea how to change it + structuredExtraConfig = with lib.kernel; builtins.mapAttrs (_: value: lib.mkForce value) { + LOCALVERSION = freeform "-tkg-Lava"; + ZENIFY = yes; + FUTEX2 = yes; + MHASWELL = yes; + WINESYNC = module; + + # timers + HZ_PERIODIC = no; + NO_HZ = yes; + NO_HZ_COMMON = yes; + NO_HZ_FULL = yes; + NO_HZ_IDLE = no; + CONTEXT_TRACKING = yes; + CONTEXT_TRACKING_FORCE = yes; + # HZ_100 = yes; + HZ_1000 = yes; + HZ_1000_NODEF = yes; + + # preempt + PREEMPT = yes; + PREEMPT_COUNT = yes; + PREEMPT_VOLUNTARY = no; + PREEMPTION = yes; + PREEMPT_DYNAMIC = yes; + + # scheduler + # SCHED_ALT = yes; + # SCHED_PDS = yes; + CACULE_SCHED = yes; + + # cacule stuff + SCHED_AUTOGROUP = yes; + BSD_PROCESS_ACCT = no; + TASK_XACCT = no; + CGROUP_CPUACCT = no; + CGROUP_DEBUG = no; + + # disable numa + NUMA = no; + AMD_NUMA = no; + X86_64_ACPI_NUMA = no; + NODES_SPAN_OTHER_NODES = no; + NUMA_EMU = no; + NEED_MULTIPLE_NODES = no; + USE_PERCPU_NUMA_NODE_ID = no; + ACPI_NUMA = no; + + # disable misc debugging + SLUB_DEBUG = no; + PM_DEBUG = no; + PM_ADVANCED_DEBUG = no; + PM_SLEEP_DEBUG = no; + ACPI_DEBUG = no; + SCHED_DEBUG = no; + LATENCYTOP = no; + DEBUG_PREEMPT = no; + }; + ignoreConfigErrors = true; + + src = kernelUrl "linux-${mm}.tar" "0rn3z942vjc7bixjw066rm6kcr0x0wzgxqfq1f6xd113pzrgc3bx"; + kernelPatches = [ + # Kernel version patch + { + name = "patch-${patch}"; + patch = kernelUrl "patch-${mmp}" "17d38hns5qfbw1pajpa5y38v86r49nqnw7a3pwsay5fapj69z8w4"; + } + + # AMD SI manual clocking + { + name = "si-clock"; + patch = ./si-manual-clocking.patch; + } + + # Graysky gcc patches + { + name = "graysky-gcc"; + patch = builtins.fetchurl { + url = "https://raw.githubusercontent.com/graysky2/kernel_gcc_patch/d2e7942c19ee568638d3795cf52db5274a90ce0a/more-uarches-for-kernel-5.8+.patch"; + sha256 = "16jbknjlg12jxbj8cjkk01djvr01n9zz7qlzxppcqizmz55vk0wh"; + }; + } + + # TK-Glitch patches + ( tkgPatch "0002-clear-patches" "1h1gx6rq2c961d36z1szqv9xpq1xgz2bhqjsyb03jjdrdzlcv9rm" ) + ( tkgPatch "0003-cacule-${mm}" "1rgdk1x514xsjwcjjcdmggbaj6biql5p41skn98ysqbjaw7k22ib" ) + ( tkgPatch "0003-glitched-base" "1dg177i3y54z5nadc5678hm67angram2vlr314mpxv3jgsh7vj8s" ) + ( tkgPatch "0003-glitched-cfs" "1cm4s72pymxnh37da84qrzvrwbbwagk46m1xsk99ir7cjb1l1zay" ) + # ( tkgPatch "0005-glitched-pds" "0833awp8n9ngyl5spx8znwyw1lj3nacp8vg7ffysw0j5r8akv9pw" ) + ( tkgPatch "0007-v${mm}-fsync" "0mplwdglw58bmkkxix4ccwgax3r02gahax9042dx33mybdnbl0mk" ) + ( tkgPatch "0007-v${mm}-futex2_interface" "1j29zyx2s85scfhbprgb9cs11rp50glbzczl4plphli8wds342pw" ) + ( tkgPatch "0007-v${mm}-winesync" "1av2k86ns0zc3lmgbfdch1z2a808brp2jvsfl4cwwlwwb51qzipp" ) + # ( tkgPatch "0009-prjc_v${mm}-r1" "1z731jiwyc7z4d5hzd6szrxnvw0iygbqx82y2anzm32n22731dqv" ) + ( tkgPatch "0012-misc-additions" "092ws9v1snk61i6x3gbqm5m803zd81wykkdxizn7knvy2r611cbz") + ]; +} // (args.argsOverride or {})) diff --git a/overlays/misc/0001-Lava-s-amdgpu-patches.patch b/packages/linux-lava/si-manual-clocking.patch similarity index 100% rename from overlays/misc/0001-Lava-s-amdgpu-patches.patch rename to packages/linux-lava/si-manual-clocking.patch diff --git a/packages/wine-osu/default.nix b/packages/wine-osu/default.nix new file mode 100644 index 0000000..955fd00 --- /dev/null +++ b/packages/wine-osu/default.nix @@ -0,0 +1,51 @@ +{ + getPaths, + winePackages, + wineUnstable, + wineStaging, + ... +}: +# TODO: Use winePackages.callPackage +(wineStaging.overrideDerivation(o: { + patches = (o.patches or []) ++ getPaths ./patches; +})).override { + wineRelease = "staging"; + wineBuild = "wineWow"; + + pngSupport = true; + jpegSupport = true; + tiffSupport = true; + gettextSupport = true; + fontconfigSupport = true; + alsaSupport = true; + gtkSupport = true; + openglSupport = true; + tlsSupport = true; + gstreamerSupport = true; + #cupsSupport = true; + colorManagementSupport = true; + dbusSupport = true; + mpg123Support = true; + #openalSupport = true; + #openclSupport = true; + #cairoSupport = true; + #odbcSupport = true; + netapiSupport = true; + cursesSupport = true; + vaSupport = true; + pcapSupport = true; + #v4lSupport = true; + #saneSupport = true; + gsmSupport = true; + #gphoto2Support = true; + #ldapSupport = true; + pulseaudioSupport = true; + udevSupport = true; + xineramaSupport = true; + xmlSupport = true; + vulkanSupport = true; + sdlSupport = true; + faudioSupport = true; + vkd3dSupport = true; + mingwSupport = true; +} diff --git a/overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch b/packages/wine-osu/patches/0001-Revert-to-5.14-winepulse.drv.patch similarity index 100% rename from overlays/misc/wine/0001-Revert-to-5.14-winepulse.drv.patch rename to packages/wine-osu/patches/0001-Revert-to-5.14-winepulse.drv.patch diff --git a/overlays/misc/wine/0002-5.14-Latency-Fix.patch b/packages/wine-osu/patches/0002-5.14-Latency-Fix.patch similarity index 100% rename from overlays/misc/wine/0002-5.14-Latency-Fix.patch rename to packages/wine-osu/patches/0002-5.14-Latency-Fix.patch diff --git a/overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch b/packages/wine-osu/patches/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch similarity index 100% rename from overlays/misc/wine/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch rename to packages/wine-osu/patches/0003-secur32-Fix-crash-from-invalid-context-in-Initialize.patch diff --git a/overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch b/packages/wine-osu/patches/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch similarity index 100% rename from overlays/misc/wine/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch rename to packages/wine-osu/patches/0004-kernelbase-Cache-last-used-locale-sortguid-mapping.patch From 94a3281cbe678b404ce7aeab263fa194ed4b0001 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Fri, 2 Jul 2021 07:21:55 +0700 Subject: [PATCH 0017/1112] switch back to home-manager master --- flake.lock | 11 +++++------ flake.nix | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/flake.lock b/flake.lock index d59f3ff..89477ae 100644 --- a/flake.lock +++ b/flake.lock @@ -7,16 +7,15 @@ ] }, "locked": { - "lastModified": 1624718580, - "narHash": "sha256-hzt3zC4lm7XvvEISpaJirotBOo7XYdeI3cVslT/BvMw=", - "owner": "LavaDesu", + "lastModified": 1625162737, + "narHash": "sha256-IzKTw2u/EKVr6TCQYylSAcOnrVRpir3wG3MUHj2LsTc=", + "owner": "nix-community", "repo": "home-manager", - "rev": "c52a96d07de8930de256ffeffd82314757f7a5da", + "rev": "7df6656b113ce0d39c8b7d30915cafe046e1d64e", "type": "github" }, "original": { - "owner": "LavaDesu", - "ref": "aa", + "owner": "nix-community", "repo": "home-manager", "type": "github" } diff --git a/flake.nix b/flake.nix index f1585df..a3f1c8a 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { inputs = { nixpkgs = { url = "github:NixOS/nixpkgs/nixos-unstable"; }; - home-manager = { url = "github:LavaDesu/home-manager/aa"; }; + home-manager = { url = "github:nix-community/home-manager"; }; secrets = { url = "github:LavaDesu/flakes-secrets"; }; home-manager.inputs.nixpkgs.follows = "nixpkgs"; From fa42005ff8a63e52bd51803fa805c13fdb1df518 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 3 Jul 2021 10:50:22 +0700 Subject: [PATCH 0018/1112] add polybar wm-restack --- users/rin/polybar.bspwm.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/users/rin/polybar.bspwm.nix b/users/rin/polybar.bspwm.nix index 27fe0cb..021a70d 100644 --- a/users/rin/polybar.bspwm.nix +++ b/users/rin/polybar.bspwm.nix @@ -18,6 +18,7 @@ bottom = 5; }; override-redirect = true; + wm-restack = "bspwm"; font = [ "NotoSans:style=Regular:size=11:antialias=true;2" From 41f125d4ca4f2cefb93ca365b9ba3beb708e8f85 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 3 Jul 2021 13:59:02 +0700 Subject: [PATCH 0019/1112] add eslint --- users/rin/neovim.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 982264d..3319776 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -80,10 +80,14 @@ in { " disable empty line tildes set fcs=eob:\ - let g:coc_global_extensions = ['coc-tsserver', 'coc-rust-analyzer', 'coc-flutter'] + let g:coc_global_extensions = ['coc-eslint', 'coc-tsserver', 'coc-rust-analyzer', 'coc-flutter'] ''; }; xdg.configFile."nvim/coc-settings.json".text = builtins.toJSON { + "eslint.enable" = true; + "eslint.options" = { + configFile = "./.eslintrc.json"; + }; "rust-analyzer.lens.enable" = false; "rust-analyzer.inlayHints.enable" = false; "rust-analyzer.serverPath" = pkgs.rust-analyzer + "/bin/rust-analyzer"; From 80bc8db0a98020f87c9f40a13692ae14d721df8c Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 4 Jul 2021 12:54:48 +0700 Subject: [PATCH 0020/1112] remove ale and vim-javascript --- users/rin/neovim.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 3319776..836e7f5 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -19,11 +19,11 @@ in { plugins = with pkgs.vimPlugins; [ # nerdtree # vim-fugitive - ale + # ale coc-nvim dart-vim-plugin vim-airline - vim-javascript + # vim-javascript vim-material vim-nix vim-repeat From 450fd2f3551d94970289699ab73ca8538e09d6f2 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 4 Jul 2021 14:15:19 +0700 Subject: [PATCH 0021/1112] bump nixpkgs - r299942.09c38c29f2c --- flake.lock | 6 +++--- flake.nix | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index 89477ae..9b3aaa2 100644 --- a/flake.lock +++ b/flake.lock @@ -22,11 +22,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1624271441, - "narHash": "sha256-26QNDCdRE5mPOWYJrPGpVzgrJ3ZxqvWOONfeMsjryz4=", + "lastModified": 1625281901, + "narHash": "sha256-DkZDtTIPzhXATqIps2ifNFpnI+PTcfMYdcrx/oFm00Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7e567a3d092b7de69cdf5deaeb8d9526de230916", + "rev": "09c38c29f2c719cd76ca17a596c2fdac9e186ceb", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a3f1c8a..f574ebf 100644 --- a/flake.nix +++ b/flake.nix @@ -29,7 +29,7 @@ ) ) ++ [(self: super: customPackages super)]; - revCount = "297098"; + revCount = "299942"; base = { config, ... }: { system = { configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; From e379ff4799befe02e07e2602976d23906b0bc0e8 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 4 Jul 2021 14:10:44 +0700 Subject: [PATCH 0022/1112] separate kernel sources into a file, and bump - 5.13.0 much easier to update also slightly modified config: - use 2000hz tickless - disable ftrace --- packages/linux-lava/default.nix | 80 ++++++--------------------------- packages/linux-lava/sources.nix | 51 +++++++++++++++++++++ 2 files changed, 65 insertions(+), 66 deletions(-) create mode 100644 packages/linux-lava/sources.nix diff --git a/packages/linux-lava/default.nix b/packages/linux-lava/default.nix index f57ea08..09777b1 100644 --- a/packages/linux-lava/default.nix +++ b/packages/linux-lava/default.nix @@ -1,32 +1,16 @@ { buildLinux, + callPackage, kernelPatches, lib, ... } @ args: + let - major = "5"; - minor = "12"; - patch = "13"; - tkg = "2da317c20ed6f70085b195639b9aad2cacf31ab5"; - - mm = "${major}.${minor}"; - mmp = "${major}.${minor}.${patch}"; - - kernelUrl = name: sha256: builtins.fetchurl { - inherit sha256; - url = "https://cdn.kernel.org/pub/linux/kernel/v${major}.x/${name}.xz"; - }; - - tkgPatch = name: sha256: { - inherit name; - patch = builtins.fetchurl { - inherit sha256; - url = "https://raw.githubusercontent.com/Frogging-Family/linux-tkg/${tkg}/linux-tkg-patches/${mm}/${name}.patch"; - }; - }; + sources = callPackage ./sources.nix {}; in buildLinux (args // { - version = "${mmp}-tkg-Lava"; + inherit (sources) src kernelPatches; + version = "${sources.version}-tkg-Lava"; isZen = true; # TODO: # some stuff is set in pkgs/os-specific/linux/kernel/common-config.nix @@ -38,17 +22,17 @@ in buildLinux (args // { MHASWELL = yes; WINESYNC = module; - # timers + # tickless timers HZ_PERIODIC = no; NO_HZ = yes; NO_HZ_COMMON = yes; NO_HZ_FULL = yes; + NO_HZ_FULL_NODEF = yes; NO_HZ_IDLE = no; CONTEXT_TRACKING = yes; - CONTEXT_TRACKING_FORCE = yes; - # HZ_100 = yes; - HZ_1000 = yes; - HZ_1000_NODEF = yes; + CONTEXT_TRACKING_FORCE = no; + HZ_2000 = yes; + HZ_2000_NODEF = yes; # preempt PREEMPT = yes; @@ -58,11 +42,7 @@ in buildLinux (args // { PREEMPT_DYNAMIC = yes; # scheduler - # SCHED_ALT = yes; - # SCHED_PDS = yes; CACULE_SCHED = yes; - - # cacule stuff SCHED_AUTOGROUP = yes; BSD_PROCESS_ACCT = no; TASK_XACCT = no; @@ -79,6 +59,10 @@ in buildLinux (args // { USE_PERCPU_NUMA_NODE_ID = no; ACPI_NUMA = no; + # disable ftrace + FUNCTION_TRACER = no; + FUNCTION_GRAPH_TRACER = no; + # disable misc debugging SLUB_DEBUG = no; PM_DEBUG = no; @@ -90,40 +74,4 @@ in buildLinux (args // { DEBUG_PREEMPT = no; }; ignoreConfigErrors = true; - - src = kernelUrl "linux-${mm}.tar" "0rn3z942vjc7bixjw066rm6kcr0x0wzgxqfq1f6xd113pzrgc3bx"; - kernelPatches = [ - # Kernel version patch - { - name = "patch-${patch}"; - patch = kernelUrl "patch-${mmp}" "17d38hns5qfbw1pajpa5y38v86r49nqnw7a3pwsay5fapj69z8w4"; - } - - # AMD SI manual clocking - { - name = "si-clock"; - patch = ./si-manual-clocking.patch; - } - - # Graysky gcc patches - { - name = "graysky-gcc"; - patch = builtins.fetchurl { - url = "https://raw.githubusercontent.com/graysky2/kernel_gcc_patch/d2e7942c19ee568638d3795cf52db5274a90ce0a/more-uarches-for-kernel-5.8+.patch"; - sha256 = "16jbknjlg12jxbj8cjkk01djvr01n9zz7qlzxppcqizmz55vk0wh"; - }; - } - - # TK-Glitch patches - ( tkgPatch "0002-clear-patches" "1h1gx6rq2c961d36z1szqv9xpq1xgz2bhqjsyb03jjdrdzlcv9rm" ) - ( tkgPatch "0003-cacule-${mm}" "1rgdk1x514xsjwcjjcdmggbaj6biql5p41skn98ysqbjaw7k22ib" ) - ( tkgPatch "0003-glitched-base" "1dg177i3y54z5nadc5678hm67angram2vlr314mpxv3jgsh7vj8s" ) - ( tkgPatch "0003-glitched-cfs" "1cm4s72pymxnh37da84qrzvrwbbwagk46m1xsk99ir7cjb1l1zay" ) - # ( tkgPatch "0005-glitched-pds" "0833awp8n9ngyl5spx8znwyw1lj3nacp8vg7ffysw0j5r8akv9pw" ) - ( tkgPatch "0007-v${mm}-fsync" "0mplwdglw58bmkkxix4ccwgax3r02gahax9042dx33mybdnbl0mk" ) - ( tkgPatch "0007-v${mm}-futex2_interface" "1j29zyx2s85scfhbprgb9cs11rp50glbzczl4plphli8wds342pw" ) - ( tkgPatch "0007-v${mm}-winesync" "1av2k86ns0zc3lmgbfdch1z2a808brp2jvsfl4cwwlwwb51qzipp" ) - # ( tkgPatch "0009-prjc_v${mm}-r1" "1z731jiwyc7z4d5hzd6szrxnvw0iygbqx82y2anzm32n22731dqv" ) - ( tkgPatch "0012-misc-additions" "092ws9v1snk61i6x3gbqm5m803zd81wykkdxizn7knvy2r611cbz") - ]; } // (args.argsOverride or {})) diff --git a/packages/linux-lava/sources.nix b/packages/linux-lava/sources.nix new file mode 100644 index 0000000..e52a5d3 --- /dev/null +++ b/packages/linux-lava/sources.nix @@ -0,0 +1,51 @@ +{ fetchFromGitHub, lib }: +let + version = "5.13.0"; + kernelHash = "1nc9didbjlycs9h8xahny1gwl8m8clylybnza6gl663myfbslsrz"; + kernelPatchHash = ""; + tkgRev = "1137522351b2044de4ac9edc6675b3dcb3de504a"; + tkgHash = "118hvwjjc71gh8jsyswpbap90fmqczcknxdf7bvyn7cgacaix7bq"; + + tkgPatches = [ + "0001-mm-Support-soft-dirty-flag-reset-for-VA-range" + "0002-clear-patches" + "0002-mm-Support-soft-dirty-flag-read-with-reset" + "0003-cacule-${mm}" + "0003-glitched-base" + "0003-glitched-cfs" + #"0007-v${mm}-fsync" + "0007-v${mm}-futex2_interface" + "0007-v${mm}-winesync" + "0012-misc-additions" + ]; + + + patch = path: { + name = "patch-${path}"; + patch = path; + }; + tkgSrc = fetchFromGitHub { + owner = "Frogging-Family"; + repo = "linux-tkg"; + rev = tkgRev; + sha256 = tkgHash; + }; + mm = lib.versions.majorMinor version; +in { + inherit version; + + src = builtins.fetchurl { + url = "https://cdn.kernel.org/pub/linux/kernel/v${lib.versions.major version}.x/linux-${mm}.tar.xz"; + sha256 = kernelHash; + }; + + kernelPatches = [(patch ./si-manual-clocking.patch)] + # ++ [(builtins.fetchurl { + # url = "https://cdn.kernel.org/pub/linux/kernel/v${lib.versions.major version}.x/patch${version}.xz"; + # sha256 = kernelPatchHash; + # })] + ++ builtins.map (name: { + inherit name; + patch = "${tkgSrc}/linux-tkg-patches/${mm}/${name}.patch"; + }) tkgPatches; +} From 3cc5c5271a2f70ce85dc3e37ddba3a8425b26257 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 4 Jul 2021 18:29:26 +0700 Subject: [PATCH 0023/1112] bump discord - 0.0.126 --- overlays/discord.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overlays/discord.nix b/overlays/discord.nix index a80f48b..d64a3c1 100644 --- a/overlays/discord.nix +++ b/overlays/discord.nix @@ -1,9 +1,9 @@ self: super: { discord-canary = super.discord-canary.override rec { - version = "0.0.125"; + version = "0.0.126"; src = builtins.fetchurl { url = "https://dl-canary.discordapp.net/apps/linux/${version}/discord-canary-${version}.tar.gz"; - sha256 = "0ly5a6l7rvl54mc39xma14jrcrf11q3ndnkkr16by5hy3palmz9g"; + sha256 = "0apj1c4my17ca452wdga2zb82iqsbljbbg2fylfdvslx286r7dhj"; }; }; } From d00655275500d8f8e4d612869f5ac5779e2db1c7 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 4 Jul 2021 21:25:20 +0700 Subject: [PATCH 0024/1112] simplify flake inputs --- flake.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index f574ebf..17a28b4 100644 --- a/flake.nix +++ b/flake.nix @@ -1,8 +1,8 @@ { inputs = { - nixpkgs = { url = "github:NixOS/nixpkgs/nixos-unstable"; }; - home-manager = { url = "github:nix-community/home-manager"; }; - secrets = { url = "github:LavaDesu/flakes-secrets"; }; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + home-manager.url = "github:nix-community/home-manager"; + secrets.url = "github:LavaDesu/flakes-secrets"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; }; From 9e6fd047494decb55f49a52da85a0f42d7fb8719 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 4 Jul 2021 21:28:03 +0700 Subject: [PATCH 0025/1112] various neovim configuration changes - use material.vim instead of vim-material - manage all coc extensions with nixpkgs - delete commented out plugins - new plugins (excl. old coc extensions): - coc-json - coc-yaml - nerdtree - new lsps: - rnix-lsp - deleted plugins (incl. old coc extensions): - coc-flutter - dart-vim-plugin --- users/rin/home.nix | 1 + users/rin/neovim.nix | 36 +++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/users/rin/home.nix b/users/rin/home.nix index d866e69..4d933b2 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -20,6 +20,7 @@ neofetch pamixer pavucontrol + rnix-lsp tor-browser-bundle-bin transcrypt transmission-remote-gtk diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 836e7f5..33ad5de 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -3,10 +3,10 @@ let vim-material = pkgs.vimUtils.buildVimPlugin { name = "vim-material"; src = pkgs.fetchFromGitHub { - owner = "hzchirs"; - repo = "vim-material"; - rev = "05461c967b861ef532c44d5348555febac94b0d5"; - sha256 = "1w59zqrx3scqsrg1a43497xybc3m4zm00kwfqpvjfw6qrpk2zb3f"; + owner = "kaicataldo"; + repo = "material.vim"; + rev = "7dfa4bbf1fe43fcebcd836ef4f3b1342b4ea69be"; + sha256 = "1ihakmh07j47rzy76242zbipcgdn4yh5bivz09469hr1jj2snyj3"; }; }; in { @@ -17,13 +17,15 @@ in { vimdiffAlias = true; plugins = with pkgs.vimPlugins; [ - # nerdtree - # vim-fugitive - # ale coc-nvim - dart-vim-plugin + coc-eslint + coc-json + coc-rust-analyzer + coc-tsserver + coc-yaml + + nerdtree vim-airline - # vim-javascript vim-material vim-nix vim-repeat @@ -48,12 +50,12 @@ in { set expandtab " theming - set termguicolors hi MatchParen cterm=underline ctermbg=none ctermfg=white - let g:material_style='oceanic' + set termguicolors let g:airline_theme='material' - set background=dark - colorscheme vim-material + let g:material_terminal_italics = 1 + let g:material_theme_style = 'ocean' + colorscheme material " using tab for trigger completion function! s:check_back_space() abort @@ -79,11 +81,15 @@ in { " disable empty line tildes set fcs=eob:\ - - let g:coc_global_extensions = ['coc-eslint', 'coc-tsserver', 'coc-rust-analyzer', 'coc-flutter'] ''; }; xdg.configFile."nvim/coc-settings.json".text = builtins.toJSON { + languageserver = { + nix = { + command = "rnix-lsp"; + filetypes = [ "nix" ]; + }; + }; "eslint.enable" = true; "eslint.options" = { configFile = "./.eslintrc.json"; From 5ce07a047a605a2ffe4949471d950d5064dbc84e Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 10:40:52 +0700 Subject: [PATCH 0026/1112] use neovim nightly --- flake.lock | 77 ++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 5 ++- users/rin/neovim.nix | 1 + 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/flake.lock b/flake.lock index 9b3aaa2..db42f85 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,36 @@ { "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1606424373, + "narHash": "sha256-oq8d4//CJOrVj+EcOaSXvMebvuTkmBJuT5tzlfewUnQ=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "99f1c2157fba4bfe6211a321fd0ee43199025dbf", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -20,6 +51,51 @@ "type": "github" } }, + "neovim-flake": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "dir": "contrib", + "lastModified": 1625382879, + "narHash": "sha256-pi9EfFYaAdzCJuar24CT+nhkS29FCg2nufai1Qb0mZA=", + "owner": "neovim", + "repo": "neovim", + "rev": "490615612ed5ec587c8023de28db495b3181de30", + "type": "github" + }, + "original": { + "dir": "contrib", + "owner": "neovim", + "repo": "neovim", + "type": "github" + } + }, + "neovim-nightly": { + "inputs": { + "flake-compat": "flake-compat", + "neovim-flake": "neovim-flake", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1625386273, + "narHash": "sha256-72a9jmmR5LDU68jiDzQuwme8DuwGgbfCoco0wIjzCq4=", + "owner": "nix-community", + "repo": "neovim-nightly-overlay", + "rev": "85ac1e60a0d8ec5bff474219bf64f2c4b320f9c1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "neovim-nightly-overlay", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1625281901, @@ -39,6 +115,7 @@ "root": { "inputs": { "home-manager": "home-manager", + "neovim-nightly": "neovim-nightly", "nixpkgs": "nixpkgs", "secrets": "secrets" } diff --git a/flake.nix b/flake.nix index 17a28b4..b184ea7 100644 --- a/flake.nix +++ b/flake.nix @@ -2,9 +2,11 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; + neovim-nightly.url = "github:nix-community/neovim-nightly-overlay"; secrets.url = "github:LavaDesu/flakes-secrets"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; + neovim-nightly.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = inputs: with inputs; @@ -27,7 +29,8 @@ (path: nixpkgs.lib.hasSuffix ".nix" path) # Checks file extension (getPaths ./overlays) ) - ) ++ [(self: super: customPackages super)]; + ) ++ [(self: super: customPackages super)] + ++ [inputs.neovim-nightly.overlay]; revCount = "299942"; base = { config, ... }: { diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 33ad5de..d9bd639 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -15,6 +15,7 @@ in { viAlias = true; vimAlias = true; vimdiffAlias = true; + package = pkgs.neovim-nightly; plugins = with pkgs.vimPlugins; [ coc-nvim From 3f121e3608ae70ca0aecba30dee903ff2ead58fd Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 11:24:16 +0700 Subject: [PATCH 0027/1112] add nvim-treesitter with nix and typescript --- users/rin/neovim.nix | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index d9bd639..a62f4ba 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -34,6 +34,10 @@ in { lf-vim vim-floaterm + (nvim-treesitter.withPlugins (p: with p; [ + tree-sitter-nix + tree-sitter-typescript + ])) ]; withNodeJs = true; @@ -82,6 +86,12 @@ in { " disable empty line tildes set fcs=eob:\ + + lua < Date: Mon, 5 Jul 2021 13:41:16 +0700 Subject: [PATCH 0028/1112] switch back to vim-material --- users/rin/neovim.nix | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index a62f4ba..0d848c5 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -3,10 +3,10 @@ let vim-material = pkgs.vimUtils.buildVimPlugin { name = "vim-material"; src = pkgs.fetchFromGitHub { - owner = "kaicataldo"; - repo = "material.vim"; - rev = "7dfa4bbf1fe43fcebcd836ef4f3b1342b4ea69be"; - sha256 = "1ihakmh07j47rzy76242zbipcgdn4yh5bivz09469hr1jj2snyj3"; + owner = "hzchirs"; + repo = "vim-material"; + rev = "05461c967b861ef532c44d5348555febac94b0d5"; + sha256 = "1w59zqrx3scqsrg1a43497xybc3m4zm00kwfqpvjfw6qrpk2zb3f"; }; }; in { @@ -58,9 +58,8 @@ in { hi MatchParen cterm=underline ctermbg=none ctermfg=white set termguicolors let g:airline_theme='material' - let g:material_terminal_italics = 1 - let g:material_theme_style = 'ocean' - colorscheme material + let g:material_style='oceanic' + colorscheme vim-material " using tab for trigger completion function! s:check_back_space() abort From b1e160b367bbabb71eb7ff5250b6ca6d7c3af96c Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 13:41:34 +0700 Subject: [PATCH 0029/1112] remove lf-vim and vim-floaterm --- users/rin/neovim.nix | 3 --- 1 file changed, 3 deletions(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 0d848c5..b3866d0 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -32,8 +32,6 @@ in { vim-repeat vim-surround - lf-vim - vim-floaterm (nvim-treesitter.withPlugins (p: with p; [ tree-sitter-nix tree-sitter-typescript @@ -76,7 +74,6 @@ in { inoremap coc#refresh() " various aliases - nnoremap :Lf nnoremap r :source $MYVIMRC command! -nargs=0 Sw w !doas tee % > /dev/null From ce9156620fbb375d1cc9d072873f5f541a0962e9 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 13:48:41 +0700 Subject: [PATCH 0030/1112] add ctrlp-vim --- users/rin/neovim.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index b3866d0..c860867 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -25,6 +25,7 @@ in { coc-tsserver coc-yaml + ctrlp-vim nerdtree vim-airline vim-material @@ -74,6 +75,7 @@ in { inoremap coc#refresh() " various aliases + nnoremap :NERDTreeToggle nnoremap r :source $MYVIMRC command! -nargs=0 Sw w !doas tee % > /dev/null From 60deb2da8d6b9cd69b83a58f4933f3b34965dd46 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 13:50:54 +0700 Subject: [PATCH 0031/1112] set cursorline --- users/rin/neovim.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index c860867..b76fdf5 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -44,6 +44,7 @@ in { " configuration syntax enable set relativenumber number + set cursorline set noswapfile set hlsearch set ignorecase From e2408b449c4007a86de3758f77d01760e9bbddb8 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 15:02:04 +0700 Subject: [PATCH 0032/1112] revert to cascadia-code 2102.25 i really can't handle the cursive anymore it's literally unreadable --- overlays/cascadia-code.nix | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 overlays/cascadia-code.nix diff --git a/overlays/cascadia-code.nix b/overlays/cascadia-code.nix new file mode 100644 index 0000000..7cfcf64 --- /dev/null +++ b/overlays/cascadia-code.nix @@ -0,0 +1,12 @@ +self: super: { + cascadia-code = let version = "2102.25"; in super.fetchzip { + name = "cascadia-code-${version}"; + url = "https://github.com/microsoft/cascadia-code/releases/download/v${version}/CascadiaCode-${version}.zip"; + sha256 = "14qhawcf1jmv68zdfbi2zfqdw4cf8fpk7plxzphmkqsp7hlw9pzx"; + postFetch = '' + mkdir -p $out/share/fonts/ + unzip -j $downloadedFile \*.otf -d $out/share/fonts/opentype + unzip -j $downloadedFile \*.ttf -d $out/share/fonts/truetype + ''; + }; +} From 294702c3306935986c600f7b2b9e9ce4bfc57eea Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 5 Jul 2021 15:03:57 +0700 Subject: [PATCH 0033/1112] switch from material and airline to tokyonight and lualine --- users/rin/neovim.nix | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index b76fdf5..703c4ce 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -1,12 +1,12 @@ { config, pkgs, ... }: let - vim-material = pkgs.vimUtils.buildVimPlugin { - name = "vim-material"; + tokyonight-nvim = pkgs.vimUtils.buildVimPlugin { + name = "tokyonight-nvim"; src = pkgs.fetchFromGitHub { - owner = "hzchirs"; - repo = "vim-material"; - rev = "05461c967b861ef532c44d5348555febac94b0d5"; - sha256 = "1w59zqrx3scqsrg1a43497xybc3m4zm00kwfqpvjfw6qrpk2zb3f"; + owner = "folke"; + repo = "tokyonight.nvim"; + rev = "0ead86afe390603f9bd688103d7a5fc6724a828e"; + sha256 = "1l6hscamapmqjn1kc2hrpynwwrljdlp84g27282wfvc2i0kpj884"; }; }; in { @@ -26,9 +26,9 @@ in { coc-yaml ctrlp-vim + lualine-nvim nerdtree - vim-airline - vim-material + tokyonight-nvim vim-nix vim-repeat vim-surround @@ -55,11 +55,8 @@ in { set expandtab " theming - hi MatchParen cterm=underline ctermbg=none ctermfg=white - set termguicolors - let g:airline_theme='material' - let g:material_style='oceanic' - colorscheme vim-material + let g:tokyonight_style='night' + colorscheme tokyonight " using tab for trigger completion function! s:check_back_space() abort @@ -87,9 +84,14 @@ in { set fcs=eob:\ lua < Date: Mon, 5 Jul 2021 15:05:01 +0700 Subject: [PATCH 0034/1112] add kitty --- users/rin/alacritty.nix | 2 +- users/rin/home.nix | 1 + users/rin/kitty.nix | 18 ++++++++++++++++++ users/rin/picom.nix | 2 ++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 users/rin/kitty.nix diff --git a/users/rin/alacritty.nix b/users/rin/alacritty.nix index bd814dd..bf37c56 100644 --- a/users/rin/alacritty.nix +++ b/users/rin/alacritty.nix @@ -8,7 +8,7 @@ }; font = { normal = { - family = "CascadiaCode"; + family = "CascadiaCodePL"; style = "Regular"; }; size = 8.6; diff --git a/users/rin/home.nix b/users/rin/home.nix index 4d933b2..d88a513 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -38,6 +38,7 @@ ./xdg.nix ./alacritty.nix + ./kitty.nix ./mpv.nix ./neovim.nix ./npm.nix diff --git a/users/rin/kitty.nix b/users/rin/kitty.nix new file mode 100644 index 0000000..35851ca --- /dev/null +++ b/users/rin/kitty.nix @@ -0,0 +1,18 @@ +{ config, pkgs, ... }: { + programs.kitty = { + enable = true; + font = { + package = pkgs.cascadia-code; + name = "Cascadia Code PL"; + size = 13; + }; + settings = { + font_features = "-ss01 +ss19"; + enable_audio_bell = false; + }; + extraConfig = builtins.readFile (builtins.fetchurl { + url = "https://raw.githubusercontent.com/folke/tokyonight.nvim/main/extras/kitty_tokyonight_night.conf"; + sha256 = "0mgjkmn4grr7rrxc5rrs1n0cghf03gp0v55hf3phll6czjavjldf"; + }); + }; +} diff --git a/users/rin/picom.nix b/users/rin/picom.nix index 7cf8349..dfce8c1 100644 --- a/users/rin/picom.nix +++ b/users/rin/picom.nix @@ -7,6 +7,7 @@ blurExclude = [ (builtins.concatStringsSep " && " [ "class_g != 'Alacritty'" + "class_g != 'kitty'" #"class_g != 'Polybar'" "class_g != 'URxvt'" ]) @@ -17,6 +18,7 @@ opacityRule = [ "80:class_g = 'Alacritty' && !focused" + "92:class_g = 'kitty' && !focused" ]; vSync = true; From 25d6a3572294b43c96e7ea3349f11e0bc746edf7 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 7 Jul 2021 08:28:21 +0700 Subject: [PATCH 0035/1112] add js and yaml tree-sitter plugins --- users/rin/neovim.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 703c4ce..2552f46 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -23,7 +23,6 @@ in { coc-json coc-rust-analyzer coc-tsserver - coc-yaml ctrlp-vim lualine-nvim @@ -34,8 +33,10 @@ in { vim-surround (nvim-treesitter.withPlugins (p: with p; [ + tree-sitter-javascript tree-sitter-nix tree-sitter-typescript + tree-sitter-yaml ])) ]; withNodeJs = true; @@ -53,6 +54,7 @@ in { set clipboard^=unnamed set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab set expandtab + let g:yaml_recommended_style=0 " theming let g:tokyonight_style='night' From 1b1ecd98182d8f15ff3c93245033e68f14320fc9 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 7 Jul 2021 08:29:57 +0700 Subject: [PATCH 0036/1112] add pnpm and use nodejs v16 --- users/rin/home.nix | 3 +++ users/rin/npm.nix | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/users/rin/home.nix b/users/rin/home.nix index d88a513..55aa5bf 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -18,6 +18,7 @@ lf mps-youtube neofetch + nodejs-16_x pamixer pavucontrol rnix-lsp @@ -30,6 +31,8 @@ (winetricks.override { wine = wine-osu; }) xorg.xgamma youtube-dl + + nodePackages_latest.pnpm ]; }; diff --git a/users/rin/npm.nix b/users/rin/npm.nix index db86429..815cd46 100644 --- a/users/rin/npm.nix +++ b/users/rin/npm.nix @@ -1,6 +1,4 @@ { config, pkgs, ... }: { - home.packages = [ pkgs.nodejs ]; - xdg.configFile."npm/npmrc".text = '' cache=${config.xdg.dataHome}/npm/cache prefix=${config.xdg.dataHome}/npm From 9a6c7b2b3e6f9c9a9cb98bc2767fa185cb1431c5 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 7 Jul 2021 19:52:44 +0700 Subject: [PATCH 0037/1112] add coc-rename mapping --- users/rin/neovim.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 2552f46..53c36d9 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -76,7 +76,8 @@ in { " various aliases nnoremap :NERDTreeToggle - nnoremap r :source $MYVIMRC + nnoremap rs :source $MYVIMRC + nmap rn (coc-rename) command! -nargs=0 Sw w !doas tee % > /dev/null " disable read-only warning From 1da5f5f443e4c57a97a5fc5cdac7d1bf3291f394 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 7 Jul 2021 19:53:20 +0700 Subject: [PATCH 0038/1112] remove alacritty --- users/rin/home.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/rin/home.nix b/users/rin/home.nix index 55aa5bf..65f9ab8 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -40,7 +40,7 @@ ./theming.nix ./xdg.nix - ./alacritty.nix + # ./alacritty.nix ./kitty.nix ./mpv.nix ./neovim.nix From 3c8155a2c48e8b08ab0bf3b773b68091178549e4 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 01:09:36 +0700 Subject: [PATCH 0039/1112] bump kernel - 5.13.1 --- packages/linux-lava/sources.nix | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/linux-lava/sources.nix b/packages/linux-lava/sources.nix index e52a5d3..bda931c 100644 --- a/packages/linux-lava/sources.nix +++ b/packages/linux-lava/sources.nix @@ -1,10 +1,10 @@ { fetchFromGitHub, lib }: let - version = "5.13.0"; + version = "5.13.1"; kernelHash = "1nc9didbjlycs9h8xahny1gwl8m8clylybnza6gl663myfbslsrz"; - kernelPatchHash = ""; - tkgRev = "1137522351b2044de4ac9edc6675b3dcb3de504a"; - tkgHash = "118hvwjjc71gh8jsyswpbap90fmqczcknxdf7bvyn7cgacaix7bq"; + kernelPatchHash = "0yaaap7z4j452q99139cajvflc6if0dm4yjhzzif9bpzd0s0fmmk"; + tkgRev = "1f9d4f458cfbd1a661fc973338e67477e0e9126c"; + tkgHash = "1jyc8vnhvfjq45gz93k50x1xsk772gbcm82i1d2jr36a562pskbc"; tkgPatches = [ "0001-mm-Support-soft-dirty-flag-reset-for-VA-range" @@ -30,6 +30,14 @@ let rev = tkgRev; sha256 = tkgHash; }; + kernelPatchSrc = { + name = "patch"; + patch = builtins.fetchurl { + url = "https://cdn.kernel.org/pub/linux/kernel/v${lib.versions.major version}.x/patch-${version}.xz"; + sha256 = kernelPatchHash; + }; + }; + mm = lib.versions.majorMinor version; in { inherit version; @@ -39,11 +47,10 @@ in { sha256 = kernelHash; }; - kernelPatches = [(patch ./si-manual-clocking.patch)] - # ++ [(builtins.fetchurl { - # url = "https://cdn.kernel.org/pub/linux/kernel/v${lib.versions.major version}.x/patch${version}.xz"; - # sha256 = kernelPatchHash; - # })] + kernelPatches = [ + kernelPatchSrc + (patch ./si-manual-clocking.patch) + ] ++ builtins.map (name: { inherit name; patch = "${tkgSrc}/linux-tkg-patches/${mm}/${name}.patch"; From c087b37ab6c446c5e4902ba450af6fc660e474a3 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 01:14:22 +0700 Subject: [PATCH 0040/1112] bump nixpkgs - r301044.87807e64a5e --- flake.lock | 6 +++--- flake.nix | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index db42f85..c870f08 100644 --- a/flake.lock +++ b/flake.lock @@ -98,11 +98,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1625281901, - "narHash": "sha256-DkZDtTIPzhXATqIps2ifNFpnI+PTcfMYdcrx/oFm00Q=", + "lastModified": 1625697353, + "narHash": "sha256-/v85RkZ0Z+lxipkG2sjYNRINktc8VySbLQmPbirY0hQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "09c38c29f2c719cd76ca17a596c2fdac9e186ceb", + "rev": "87807e64a5ef5206b745a40af118c7be8db73681", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index b184ea7..9e6a357 100644 --- a/flake.nix +++ b/flake.nix @@ -32,7 +32,7 @@ ) ++ [(self: super: customPackages super)] ++ [inputs.neovim-nightly.overlay]; - revCount = "299942"; + revCount = "301044"; base = { config, ... }: { system = { configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; From 54a5ac7099e8e5570b6a008658896f2b047bdb61 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 01:15:05 +0700 Subject: [PATCH 0041/1112] bump home-manager - 06ee8ec8dfc --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index c870f08..5796e1e 100644 --- a/flake.lock +++ b/flake.lock @@ -38,11 +38,11 @@ ] }, "locked": { - "lastModified": 1625162737, - "narHash": "sha256-IzKTw2u/EKVr6TCQYylSAcOnrVRpir3wG3MUHj2LsTc=", + "lastModified": 1625694413, + "narHash": "sha256-goRLk1I/OMclS9i17g932wyHyjiKI+htbuFIWIkzTbw=", "owner": "nix-community", "repo": "home-manager", - "rev": "7df6656b113ce0d39c8b7d30915cafe046e1d64e", + "rev": "06ee8ec8dfc4554c374052cd7b7083765748af99", "type": "github" }, "original": { From 4bba3359b4452bfd1737db7644509d7e3049f09f Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 01:15:44 +0700 Subject: [PATCH 0042/1112] bump neovim-nightly - ad6fda0e81c --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 5796e1e..318fd44 100644 --- a/flake.lock +++ b/flake.lock @@ -60,11 +60,11 @@ }, "locked": { "dir": "contrib", - "lastModified": 1625382879, - "narHash": "sha256-pi9EfFYaAdzCJuar24CT+nhkS29FCg2nufai1Qb0mZA=", + "lastModified": 1625818518, + "narHash": "sha256-ZF/gzwCQ/r6Yiq4fZe7DT/pQio6pO8HfJhB0Z+DJgn8=", "owner": "neovim", "repo": "neovim", - "rev": "490615612ed5ec587c8023de28db495b3181de30", + "rev": "1c416892879de6b78038f2cc2f1487eff46abb60", "type": "github" }, "original": { @@ -83,11 +83,11 @@ ] }, "locked": { - "lastModified": 1625386273, - "narHash": "sha256-72a9jmmR5LDU68jiDzQuwme8DuwGgbfCoco0wIjzCq4=", + "lastModified": 1625818601, + "narHash": "sha256-Yp/wapoOHrypGvqWppoB3Yu5w7IZvjVn4ppMfmjbWxA=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "85ac1e60a0d8ec5bff474219bf64f2c4b320f9c1", + "rev": "ad6fda0e81cd8dab6326dc1a45b11024ebcda5c2", "type": "github" }, "original": { From d900a50eaa321f09b36ee3ac942e41913d320f0f Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 07:33:17 +0700 Subject: [PATCH 0043/1112] fix systemctl autocomplete --- users/rin/zsh.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index 1921aa6..4ac8d0a 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -108,6 +108,7 @@ in rec { enableCompletion = true; initExtraBeforeCompInit = '' + fpath+=(/run/current-system/sw/share/zsh/site-functions) zstyle ':completion:*' completer _complete zstyle ':completion:*' matcher-list "" 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' '+l:|=* r:|=*' zstyle ':completion:*' menu select From 34ce4697845cd18800c0d42f391a93abaa8c7561 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 08:11:49 +0700 Subject: [PATCH 0044/1112] add png and jpeg mimeapps --- users/rin/xdg.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/users/rin/xdg.nix b/users/rin/xdg.nix index 1515e08..2f14461 100644 --- a/users/rin/xdg.nix +++ b/users/rin/xdg.nix @@ -17,8 +17,9 @@ let "application/x-extension-xhtml" "application/x-extension-xht" ] // { - # XXX: this thing found it unwritable so it just deletes it and rewrite??? "x-scheme-handler/tg" = "userapp-Kotatogram Desktop-CHJI40.desktop"; + "image/png" = "feh.desktop"; + "image/jpeg" = "feh.desktop"; }; in { xdg = { From ce0954fc61346b8776bea8edd9cb48f6a0d4f5ba Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sat, 10 Jul 2021 09:00:21 +0700 Subject: [PATCH 0045/1112] add snapper --- hosts/winter/default.nix | 1 + hosts/winter/hardware-configuration.nix | 6 ++++++ hosts/winter/snapper.nix | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 hosts/winter/snapper.nix diff --git a/hosts/winter/default.nix b/hosts/winter/default.nix index d7c8030..b587f5f 100644 --- a/hosts/winter/default.nix +++ b/hosts/winter/default.nix @@ -20,6 +20,7 @@ ./networking.nix ./packages.nix ./security.nix + ./snapper.nix ../../users/rin ]; diff --git a/hosts/winter/hardware-configuration.nix b/hosts/winter/hardware-configuration.nix index fee857b..faac99d 100644 --- a/hosts/winter/hardware-configuration.nix +++ b/hosts/winter/hardware-configuration.nix @@ -42,6 +42,12 @@ options = [ "autodefrag" "compress=zstd:3" "nossd" "nossd_spread" "relatime" "subvolid=260" ]; }; + fileSystems."/home/.snapshots" = + { device = "/dev/disk/by-uuid/8f0ba28e-5dff-4a4e-8db0-aa72cc90cb5d"; + fsType = "btrfs"; + options = [ "autodefrag" "compress=zstd:3" "nossd" "nossd_spread" "relatime" "subvolid=319" ]; + }; + fileSystems."/root" = { device = "/dev/disk/by-uuid/8f0ba28e-5dff-4a4e-8db0-aa72cc90cb5d"; fsType = "btrfs"; diff --git a/hosts/winter/snapper.nix b/hosts/winter/snapper.nix new file mode 100644 index 0000000..2bb55f0 --- /dev/null +++ b/hosts/winter/snapper.nix @@ -0,0 +1,18 @@ +{ config, lib, ... }: { + services.snapper = { + configs.home = { + fstype = "btrfs"; + subvolume = "/home"; + extraConfig = lib.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "${k}=${v}") { + TIMELINE_CLEANUP = "yes"; + TIMELINE_CREATE = "yes"; + TIMELINE_MIN_AGE = "1800"; + TIMELINE_LIMIT_HOURLY = "5"; + TIMELINE_LIMIT_DAILY = "7"; + TIMELINE_LIMIT_WEEKLY = "0"; + TIMELINE_LIMIT_MONTHLY = "0"; + TIMELINE_LIMIT_YEARLY = "0"; + }); + }; + }; +} From afa16aafccf7a1b8f810d006193d3ac9fc3b7520 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 11 Jul 2021 11:21:09 +0700 Subject: [PATCH 0046/1112] slightly increase opacity of kitty when unfocused --- users/rin/picom.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/rin/picom.nix b/users/rin/picom.nix index dfce8c1..7f95dfb 100644 --- a/users/rin/picom.nix +++ b/users/rin/picom.nix @@ -18,7 +18,7 @@ opacityRule = [ "80:class_g = 'Alacritty' && !focused" - "92:class_g = 'kitty' && !focused" + "95:class_g = 'kitty' && !focused" ]; vSync = true; From 2bc503a79152ac48cc36b6a40812350dd9bc4615 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 11 Jul 2021 11:48:02 +0700 Subject: [PATCH 0047/1112] move windowManager.i3 packages to home-manager oh my god i just realised my rofi configuration was ignored --- hosts/winter/gui.nix | 14 -------------- users/rin/home.nix | 4 ++++ users/rin/rofi.nix | 2 ++ 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/hosts/winter/gui.nix b/hosts/winter/gui.nix index 15cb649..6ad91dc 100644 --- a/hosts/winter/gui.nix +++ b/hosts/winter/gui.nix @@ -42,19 +42,5 @@ }; }; xkbOptions = "caps:escape"; - windowManager.i3 = { - enable = true; - package = pkgs.i3-gaps; - extraPackages = with pkgs; [ - dunst - feh - lxappearance - maim - picom - polybar - rofi - xclip - ]; - }; }; } diff --git a/users/rin/home.nix b/users/rin/home.nix index 65f9ab8..2f9e019 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -8,6 +8,7 @@ brave discord-canary element-desktop + feh ffmpeg gnome.file-roller ghidra-bin @@ -16,6 +17,8 @@ inkscape kotatogram-desktop lf + lxappearance + maim mps-youtube neofetch nodejs-16_x @@ -29,6 +32,7 @@ vlc wine-osu (winetricks.override { wine = wine-osu; }) + xclip xorg.xgamma youtube-dl diff --git a/users/rin/rofi.nix b/users/rin/rofi.nix index 6ec88d0..f32e183 100644 --- a/users/rin/rofi.nix +++ b/users/rin/rofi.nix @@ -1,7 +1,9 @@ { config, ... }: { programs.rofi = { + enable = true; font = "Open Sans 10"; scrollbar = false; + terminal = "kitty"; #theme = builtins.fetchUrl {}; }; } From e3c0bc48ab0a65978ee516c2ed01747f7905ead6 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Sun, 11 Jul 2021 13:54:48 +0700 Subject: [PATCH 0048/1112] add rust and toml tree-sitter plugins --- users/rin/neovim.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 53c36d9..4bb0941 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -35,6 +35,8 @@ in { (nvim-treesitter.withPlugins (p: with p; [ tree-sitter-javascript tree-sitter-nix + tree-sitter-rust + tree-sitter-toml tree-sitter-typescript tree-sitter-yaml ])) From 927488c5a90e00d22147929b3eff0734686e009f Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 12 Jul 2021 09:46:15 +0700 Subject: [PATCH 0049/1112] move zsh.sessionVariables to home.sessionVariables --- users/rin/home.nix | 26 ++++++++++++++++++++++++++ users/rin/zsh.nix | 25 ------------------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/users/rin/home.nix b/users/rin/home.nix index 2f9e019..d9821c3 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -38,6 +38,32 @@ nodePackages_latest.pnpm ]; + + sessionVariables = { + PATH = builtins.concatStringsSep ":" [ + "${config.home.homeDirectory}/.local/bin" + "${config.xdg.dataHome}/npm/bin" + "$PATH" + ]; + + XAUTHORITY = "$XDG_RUNTIME_DIR/Xauthority"; + EDITOR = "nvim"; + + _JAVA_OPTIONS = "-Djava.util.prefs.userRoot=${config.xdg.configHome}/java"; + CARGO_HOME = "${config.xdg.dataHome}/cargo"; + DIRENV_LOG_FORMAT = ""; + GNUPGHOME = "${config.xdg.dataHome}/gnupg"; + GTK2_RC_FILES = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + LESSHISTFILE = "-"; + NODE_REPL_HISTORY="${config.xdg.dataHome}/nodejs/repl_history"; + NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc"; + PUB_CACHE = "${config.xdg.cacheHome}/dart"; + WGETRC = "${config.xdg.configHome}/wgetrc"; + XINITRC = "${config.xdg.configHome}/xorg/xinitrc"; + + WINEPREFIX = "${config.xdg.dataHome}/wine64"; + WINEARCH = "win64"; + }; }; imports = [ diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index 4ac8d0a..3a2e8cb 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -116,31 +116,6 @@ in rec { zmodload zsh/complist ''; - sessionVariables = { - PATH = builtins.concatStringsSep ":" [ - "${config.home.homeDirectory}/.local/bin" - "${config.xdg.dataHome}/npm/bin" - "$PATH" - ]; - - XAUTHORITY = "$XDG_RUNTIME_DIR/Xauthority"; - EDITOR = "nvim"; - - _JAVA_OPTIONS = "-Djava.util.prefs.userRoot=${config.xdg.configHome}/java"; - CARGO_HOME = "${config.xdg.dataHome}/cargo"; - DIRENV_LOG_FORMAT = ""; - GNUPGHOME = "${config.xdg.dataHome}/gnupg"; - GTK2_RC_FILES = "${config.xdg.configHome}/gtk-2.0/gtkrc"; - LESSHISTFILE = "-"; - NODE_REPL_HISTORY="${config.xdg.dataHome}/nodejs/repl_history"; - NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc"; - PUB_CACHE = "${config.xdg.cacheHome}/dart"; - WGETRC = "${config.xdg.configHome}/wgetrc"; - XINITRC = "${config.xdg.configHome}/xorg/xinitrc"; - - WINEPREFIX = "${config.xdg.dataHome}/wine64"; - WINEARCH = "win64"; - }; localVariables = { PS1 = "%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b "; ZSH_AUTOSUGGEST_STRATEGY = ["completion"]; From 4f7670e690085afe00da6a45cfa112c6203e86f6 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 12 Jul 2021 10:03:53 +0700 Subject: [PATCH 0050/1112] fix zsh vim-mode delay when exiting insert --- users/rin/zsh.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index 3a2e8cb..cab44aa 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -117,6 +117,7 @@ in rec { ''; localVariables = { + KEYTIMEOUT = "1"; PS1 = "%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b "; ZSH_AUTOSUGGEST_STRATEGY = ["completion"]; ZSH_AUTOSUGGEST_USE_ASYNC = true; From 044bdc3ed918ea1387b602bd707f3f647c10769e Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 12 Jul 2021 10:09:38 +0700 Subject: [PATCH 0051/1112] add pure --- users/rin/zsh.nix | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index cab44aa..c217acb 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -118,7 +118,7 @@ in rec { localVariables = { KEYTIMEOUT = "1"; - PS1 = "%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b "; + #PS1 = "%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b "; ZSH_AUTOSUGGEST_STRATEGY = ["completion"]; ZSH_AUTOSUGGEST_USE_ASYNC = true; ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE = 40; @@ -132,7 +132,7 @@ in rec { autoload -U colors && colors ''; initExtra = lib.concatStringsSep "\n" [ - # pure + pure cursorShape direnv genAbbrs @@ -167,15 +167,15 @@ in rec { sha256 = "0m102makrfz1ibxq8rx77nngjyhdqrm8hsrr9342zzhq1nf4wxxc"; }; } - # { - # name = "pure"; - # src = pkgs.fetchFromGitHub { - # owner = "sindresorhus"; - # repo = "pure"; - # rev = "43aafe0b4dc05174c57ee623c03c64400e832ece"; - # sha256 = "0dadhbmq9ijk9nvkg936axgp12x2v2wppxqvlzn095d6v9nikc9p"; - # }; - # } + { + name = "pure"; + src = pkgs.fetchFromGitHub { + owner = "sindresorhus"; + repo = "pure"; + rev = "43aafe0b4dc05174c57ee623c03c64400e832ece"; + sha256 = "0qfs7rvpyd8jb7x4ziqrkh0b6g9ldds8sn6qbqgrir80vdk90gpa"; + }; + } ]; }; } From 835b7895dcf782a21c9fbf397ccbfe48c910d93b Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 12 Jul 2021 11:22:28 +0700 Subject: [PATCH 0052/1112] add keybinding to switch bspwm nodes --- users/rin/sxhkd.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/users/rin/sxhkd.nix b/users/rin/sxhkd.nix index e96d8b4..2f6dbfc 100644 --- a/users/rin/sxhkd.nix +++ b/users/rin/sxhkd.nix @@ -35,6 +35,10 @@ in rec { "super + {h,j,k,l}" = "bspc node -f {west,south,north,east}"; "super + {Left,Down,Up,Right}" = "bspc node -f {west,south,north,east}"; + # Switch windows + "super + shift + {h,j,k,l}" = "bspc node -s {west,south,north,east}"; + "super + shift + {Left,Down,Up,Right}" = "bspc node -s {west,south,north,east}"; + # Move focused window "super + shift + {1-9,0}" = "bspc node -d ^{1-9,10}"; From 112011f7667f7a00c46c64efa29afd7ef9f9d5b8 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 07:40:27 +0700 Subject: [PATCH 0053/1112] use flakes' revCount as part of the system version also disabled dirty rebuilds --- flake.nix | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 9e6a357..444c364 100644 --- a/flake.nix +++ b/flake.nix @@ -32,13 +32,16 @@ ) ++ [(self: super: customPackages super)] ++ [inputs.neovim-nightly.overlay]; - revCount = "301044"; base = { config, ... }: { - system = { - configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; + system = rec { + configurationRevision = + if self ? rev + then self.rev + else throw "Refusing to build from a dirty Git tree!"; nixos = rec { version = config.system.nixos.release + versionSuffix; - versionSuffix = ".${nixpkgs.lib.substring 0 8 (nixpkgs.lastModifiedDate or nixpkgs.lastModified or "19700101")}.r${revCount}-${nixpkgs.lib.substring 0 11 (nixpkgs.rev or "dirty")}"; + versionSuffix = "-${config.system.name}.r${builtins.toString self.revCount}.${self.shortRev}"; + #versionSuffix = ".${nixpkgs.lib.substring 0 8 (nixpkgs.lastModifiedDate or nixpkgs.lastModified or "19700101")}.r${revCount}-${nixpkgs.lib.substring 0 11 (nixpkgs.rev or "dirty")}"; }; }; nix.registry.nixpkgs.flake = nixpkgs; From de251c5fddaa6a1fcba5ee1fc73a949fddb9ddc6 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 07:42:25 +0700 Subject: [PATCH 0054/1112] switch to nixpkgs master --- flake.lock | 7 +++---- flake.nix | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 318fd44..ec87e45 100644 --- a/flake.lock +++ b/flake.lock @@ -98,16 +98,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1625697353, - "narHash": "sha256-/v85RkZ0Z+lxipkG2sjYNRINktc8VySbLQmPbirY0hQ=", + "lastModified": 1626221774, + "narHash": "sha256-in6vs5BcFs1XTC6NS7K8KtyYMB58ks5LtXV2LjOT4Dc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "87807e64a5ef5206b745a40af118c7be8db73681", + "rev": "a22d0fb4cf1dbee4ccf2fdc10e9f53aaafdb1128", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 444c364..cf0aa95 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs"; home-manager.url = "github:nix-community/home-manager"; neovim-nightly.url = "github:nix-community/neovim-nightly-overlay"; secrets.url = "github:LavaDesu/flakes-secrets"; From ebbb84b3b54dda39728bd5722833760b1a05b083 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 07:43:37 +0700 Subject: [PATCH 0055/1112] use nixpkgs' tokyonight-nvim --- users/rin/neovim.nix | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/users/rin/neovim.nix b/users/rin/neovim.nix index 4bb0941..a96b203 100644 --- a/users/rin/neovim.nix +++ b/users/rin/neovim.nix @@ -1,15 +1,4 @@ -{ config, pkgs, ... }: -let - tokyonight-nvim = pkgs.vimUtils.buildVimPlugin { - name = "tokyonight-nvim"; - src = pkgs.fetchFromGitHub { - owner = "folke"; - repo = "tokyonight.nvim"; - rev = "0ead86afe390603f9bd688103d7a5fc6724a828e"; - sha256 = "1l6hscamapmqjn1kc2hrpynwwrljdlp84g27282wfvc2i0kpj884"; - }; - }; -in { +{ config, pkgs, ... }: { programs.neovim = { enable = true; viAlias = true; From 6028b2c3b55255c661398bc34836323040b6df1d Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 10:50:29 +0700 Subject: [PATCH 0056/1112] add vim ft in zsh.nix --- users/rin/zsh.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index c217acb..047bcb2 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -1,3 +1,4 @@ +# vim: ft=nix { config, pkgs, ... }: let lib = pkgs.lib; From ced0bbf2a9cd85db8f8074a8a70d4120937404b4 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 10:55:11 +0700 Subject: [PATCH 0057/1112] bump home-manager --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index ec87e45..18da90e 100644 --- a/flake.lock +++ b/flake.lock @@ -38,11 +38,11 @@ ] }, "locked": { - "lastModified": 1625694413, - "narHash": "sha256-goRLk1I/OMclS9i17g932wyHyjiKI+htbuFIWIkzTbw=", + "lastModified": 1626073055, + "narHash": "sha256-vocByfpVu6m9zvtJugDvmd6/9iT2HJuG4tmDICKd0lI=", "owner": "nix-community", "repo": "home-manager", - "rev": "06ee8ec8dfc4554c374052cd7b7083765748af99", + "rev": "775cb20bd4af7781fbf336fb201df02ee3d544bb", "type": "github" }, "original": { From 1432ea461ccbfd730f3f21a08b15640c223eb97a Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 11:02:42 +0700 Subject: [PATCH 0058/1112] flake-managed zsh plugins --- flake.lock | 70 ++++++++++++++++++++++++++++++++++++++++++++++- flake.nix | 8 ++++++ users/rin/zsh.nix | 49 ++++++++------------------------- 3 files changed, 88 insertions(+), 39 deletions(-) diff --git a/flake.lock b/flake.lock index 18da90e..53c62fb 100644 --- a/flake.lock +++ b/flake.lock @@ -116,7 +116,11 @@ "home-manager": "home-manager", "neovim-nightly": "neovim-nightly", "nixpkgs": "nixpkgs", - "secrets": "secrets" + "secrets": "secrets", + "zsh-abbr": "zsh-abbr", + "zsh-fast-syntax-highlighting": "zsh-fast-syntax-highlighting", + "zsh-history-substring-search": "zsh-history-substring-search", + "zsh-pure": "zsh-pure" } }, "secrets": { @@ -133,6 +137,70 @@ "repo": "flakes-secrets", "type": "github" } + }, + "zsh-abbr": { + "flake": false, + "locked": { + "lastModified": 1619965311, + "narHash": "sha256-+oOk2ePd4/OjmRP245Kb5ku/R1PAQCI6IJth7GbcnwQ=", + "owner": "olets", + "repo": "zsh-abbr", + "rev": "99af0455b7b86ff3894a4bcf73380be2d595fa54", + "type": "github" + }, + "original": { + "owner": "olets", + "repo": "zsh-abbr", + "type": "github" + } + }, + "zsh-fast-syntax-highlighting": { + "flake": false, + "locked": { + "lastModified": 1621022231, + "narHash": "sha256-rHdOnA0Y/i/ISDlriGrGDXr5rD2nZ4T7iuG7PFUVIFQ=", + "owner": "zdharma", + "repo": "fast-syntax-highlighting", + "rev": "817916dfa907d179f0d46d8de355e883cf67bd97", + "type": "github" + }, + "original": { + "owner": "zdharma", + "repo": "fast-syntax-highlighting", + "type": "github" + } + }, + "zsh-history-substring-search": { + "flake": false, + "locked": { + "lastModified": 1557707754, + "narHash": "sha256-Ptxik1r6anlP7QTqsN1S2Tli5lyRibkgGlVlwWZRG3k=", + "owner": "zsh-users", + "repo": "zsh-history-substring-search", + "rev": "0f80b8eb3368b46e5e573c1d91ae69eb095db3fb", + "type": "github" + }, + "original": { + "owner": "zsh-users", + "repo": "zsh-history-substring-search", + "type": "github" + } + }, + "zsh-pure": { + "flake": false, + "locked": { + "lastModified": 1626016475, + "narHash": "sha256-6j6QZtsA5ZgfXthYjXRrND2zAJwZx0/6WRI1f3c+2mE=", + "owner": "sindresorhus", + "repo": "pure", + "rev": "f4c6d79ba2417d63c8008b6acce628631fd462ec", + "type": "github" + }, + "original": { + "owner": "sindresorhus", + "repo": "pure", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index cf0aa95..0918311 100644 --- a/flake.nix +++ b/flake.nix @@ -7,6 +7,12 @@ home-manager.inputs.nixpkgs.follows = "nixpkgs"; neovim-nightly.inputs.nixpkgs.follows = "nixpkgs"; + + # zsh plugins + zsh-abbr = { url = "github:olets/zsh-abbr"; flake = false; }; + zsh-history-substring-search = { url = "github:zsh-users/zsh-history-substring-search"; flake = false; }; + zsh-fast-syntax-highlighting = { url = "github:zdharma/fast-syntax-highlighting"; flake = false; }; + zsh-pure = { url = "github:sindresorhus/pure"; flake = false; }; }; outputs = inputs: with inputs; @@ -52,6 +58,7 @@ home-manager = { useGlobalPkgs = true; useUserPackages = true; + extraSpecialArgs = { inherit inputs; }; }; }; in @@ -65,6 +72,7 @@ ./hosts/winter secrets.nixosModules.winter ]; + specialArgs = { inherit inputs; }; }; packages.x86_64-linux = customPackages nixpkgs.legacyPackages.x86_64-linux; }; diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index 047bcb2..e66fcab 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -1,8 +1,13 @@ # vim: ft=nix -{ config, pkgs, ... }: +{ config, inputs, pkgs, ... }: let lib = pkgs.lib; + pluginFromInput = name: { + inherit name; + src = inputs.${name}; + }; + abbrs = { e = "$EDITOR"; rs = "source ~/.config/zsh/.zshrc"; @@ -140,43 +145,11 @@ in rec { viExtraNav ]; - plugins = [ - { - name = "zsh-abbr"; - src = pkgs.fetchFromGitHub { - owner = "olets"; - repo = "zsh-abbr"; - rev = "99af0455b7b86ff3894a4bcf73380be2d595fa54"; - sha256 = "014zvikfqqcv40x24h60ad3vyjz6kf9f7xhkk6iz7qyxwgcs90zs"; - }; - } - { - name = "zsh-history-substring-search"; - src = pkgs.fetchFromGitHub { - owner = "zsh-users"; - repo = "zsh-history-substring-search"; - rev = "0f80b8eb3368b46e5e573c1d91ae69eb095db3fb"; - sha256 = "0y8va5kc2ram38hbk2cibkk64ffrabfv1sh4xm7pjspsba9n5p1y"; - }; - } - { - name = "fast-syntax-highlighting"; - src = pkgs.fetchFromGitHub { - owner = "zdharma"; - repo = "fast-syntax-highlighting"; - rev = "817916dfa907d179f0d46d8de355e883cf67bd97"; - sha256 = "0m102makrfz1ibxq8rx77nngjyhdqrm8hsrr9342zzhq1nf4wxxc"; - }; - } - { - name = "pure"; - src = pkgs.fetchFromGitHub { - owner = "sindresorhus"; - repo = "pure"; - rev = "43aafe0b4dc05174c57ee623c03c64400e832ece"; - sha256 = "0qfs7rvpyd8jb7x4ziqrkh0b6g9ldds8sn6qbqgrir80vdk90gpa"; - }; - } + plugins = builtins.map (e: pluginFromInput e) [ + "zsh-abbr" + "zsh-history-substring-search" + "zsh-fast-syntax-highlighting" + "zsh-pure" ]; }; } From ac5e26ecda95bda0f8832dce0a6dbcef08485d56 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Wed, 14 Jul 2021 13:41:54 +0700 Subject: [PATCH 0059/1112] disallow dirty git trees --- flake.nix | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/flake.nix b/flake.nix index 0918311..f5b6ac4 100644 --- a/flake.nix +++ b/flake.nix @@ -38,12 +38,10 @@ ) ++ [(self: super: customPackages super)] ++ [inputs.neovim-nightly.overlay]; - base = { config, ... }: { + base = if !(self ? rev) then throw "Dirty git tree detected." else + { config, ... }: { system = rec { - configurationRevision = - if self ? rev - then self.rev - else throw "Refusing to build from a dirty Git tree!"; + configurationRevision = self.rev; nixos = rec { version = config.system.nixos.release + versionSuffix; versionSuffix = "-${config.system.name}.r${builtins.toString self.revCount}.${self.shortRev}"; From 84f9815ebb8d0f95bec93f2fb990c7c1bb6fd3e2 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 08:39:09 +0700 Subject: [PATCH 0060/1112] disallow ssh root login and password auth --- hosts/winter/security.nix | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hosts/winter/security.nix b/hosts/winter/security.nix index 78748e5..0cfde8e 100644 --- a/hosts/winter/security.nix +++ b/hosts/winter/security.nix @@ -1,6 +1,11 @@ { config, pkgs, ... }: { networking.firewall.enable = false; - services.openssh.enable = true; + + services.openssh = { + enable = true; + permitRootLogin = "no"; + passwordAuthentication = false; + }; security = { polkit.enable = true; From 5008989f2ebc49ce4b1cc6937e8d2cb599fe4d11 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 09:46:28 +0700 Subject: [PATCH 0061/1112] set snapper cleanup interval to 1h --- hosts/winter/snapper.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/winter/snapper.nix b/hosts/winter/snapper.nix index 2bb55f0..6883355 100644 --- a/hosts/winter/snapper.nix +++ b/hosts/winter/snapper.nix @@ -1,5 +1,6 @@ { config, lib, ... }: { services.snapper = { + cleanupInterval = "1h"; configs.home = { fstype = "btrfs"; subvolume = "/home"; From 38f13494a2dbee3845e22786267104cb51234e50 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 08:49:41 +0700 Subject: [PATCH 0062/1112] set polybar title font style to bold --- users/rin/polybar.bspwm.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/rin/polybar.bspwm.nix b/users/rin/polybar.bspwm.nix index 021a70d..5ec7de9 100644 --- a/users/rin/polybar.bspwm.nix +++ b/users/rin/polybar.bspwm.nix @@ -21,7 +21,7 @@ wm-restack = "bspwm"; font = [ - "NotoSans:style=Regular:size=11:antialias=true;2" + "NotoSans:style=SemiBold:size=11:antialias=true;2" "NotoSans:size=11:antialias=true;2" "MaterialIcons:size=17:antialias=true;6" From 57f5f73554eac8342052b30f125700ce12069c69 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 10:08:13 +0700 Subject: [PATCH 0063/1112] make h:m time in polybar bold --- users/rin/polybar.bspwm.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/users/rin/polybar.bspwm.nix b/users/rin/polybar.bspwm.nix index 5ec7de9..88ced08 100644 --- a/users/rin/polybar.bspwm.nix +++ b/users/rin/polybar.bspwm.nix @@ -85,8 +85,8 @@ "module/datetime" = { type = "internal/date"; date = { - text = "%{T2}%%{F#fff}%H:%M%%{F-}"; - alt = "%{T2}%%{F#ccc}%A, %d %B %Y %%{F#fff}%H:%M%%{F#666}:%%{F#ccc}%S%%{F-}"; + text = "%{T1}%%{F#fff}%H:%M%%{F-}"; + alt = "%{T2}%%{F#ccc}%A, %d %B %Y %{T1}%%{F#fff}%H:%M%%{F#666}:%{T2}%%{F#ccc}%S%%{F-}"; }; format = { padding = 4; From e5e4fc385c075fb18f18f55ba88ee2e185094e70 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 13:39:48 +0700 Subject: [PATCH 0064/1112] merge hm-base into base --- flake.nix | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index f5b6ac4..2cdb338 100644 --- a/flake.nix +++ b/flake.nix @@ -50,9 +50,7 @@ }; nix.registry.nixpkgs.flake = nixpkgs; nixpkgs.overlays = overlays; - }; - hm-base = { home-manager = { useGlobalPkgs = true; useUserPackages = true; @@ -66,12 +64,12 @@ modules = [ base home-manager.nixosModules.home-manager - hm-base ./hosts/winter secrets.nixosModules.winter ]; specialArgs = { inherit inputs; }; }; + packages.x86_64-linux = customPackages nixpkgs.legacyPackages.x86_64-linux; }; } From c8647160f39f02d3a24cec14c7c3dbfccf6924b5 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 13:46:11 +0700 Subject: [PATCH 0065/1112] remove unnecessary rec --- flake.nix | 2 +- users/rin/sxhkd.nix | 3 +-- users/rin/zsh.nix | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 2cdb338..7ca353a 100644 --- a/flake.nix +++ b/flake.nix @@ -40,7 +40,7 @@ base = if !(self ? rev) then throw "Dirty git tree detected." else { config, ... }: { - system = rec { + system = { configurationRevision = self.rev; nixos = rec { version = config.system.nixos.release + versionSuffix; diff --git a/users/rin/sxhkd.nix b/users/rin/sxhkd.nix index 2f6dbfc..b208461 100644 --- a/users/rin/sxhkd.nix +++ b/users/rin/sxhkd.nix @@ -2,8 +2,7 @@ let super = "Mod4"; alt = "Mod1"; - -in rec { +in { services.sxhkd = { enable = true; keybindings = { diff --git a/users/rin/zsh.nix b/users/rin/zsh.nix index e66fcab..1e22632 100644 --- a/users/rin/zsh.nix +++ b/users/rin/zsh.nix @@ -96,7 +96,7 @@ let bindkey -M vicmd 'k' history-substring-search-up bindkey -M vicmd 'j' history-substring-search-down ''; -in rec { +in { programs.zsh = { enable = true; dotDir = ".config/zsh"; From 7cd76b2b63131260de70276a42930756dd763f0d Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 13:46:01 +0700 Subject: [PATCH 0066/1112] add enableGUI option, with conditional modules depending on it --- flake.nix | 10 ++++++++-- users/rin/home.nix | 48 ++++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/flake.nix b/flake.nix index 7ca353a..6372738 100644 --- a/flake.nix +++ b/flake.nix @@ -54,7 +54,10 @@ home-manager = { useGlobalPkgs = true; useUserPackages = true; - extraSpecialArgs = { inherit inputs; }; + extraSpecialArgs = { + inherit inputs; + enableGUI = true; + }; }; }; in @@ -67,7 +70,10 @@ ./hosts/winter secrets.nixosModules.winter ]; - specialArgs = { inherit inputs; }; + specialArgs = { + inherit inputs; + enableGUI = true; + }; }; packages.x86_64-linux = customPackages nixpkgs.legacyPackages.x86_64-linux; diff --git a/users/rin/home.nix b/users/rin/home.nix index d9821c3..21d6beb 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -1,42 +1,43 @@ -{ config, pkgs, ... }: rec { +{ config, enableGUI, lib, pkgs, ... }: { home = { username = "rin"; homeDirectory = "/home/rin"; stateVersion = "21.05"; packages = with pkgs; [ appimage-run - brave - discord-canary - element-desktop - feh ffmpeg - gnome.file-roller - ghidra-bin - gimp gnupg - inkscape - kotatogram-desktop lf - lxappearance - maim mps-youtube neofetch nodejs-16_x pamixer - pavucontrol rnix-lsp - tor-browser-bundle-bin transcrypt - transmission-remote-gtk unrar - vlc wine-osu (winetricks.override { wine = wine-osu; }) - xclip - xorg.xgamma youtube-dl nodePackages_latest.pnpm + ] ++ lib.optionals enableGUI [ + brave + discord-canary + element-desktop + feh + gnome.file-roller + ghidra-bin + gimp + inkscape + kotatogram-desktop + lxappearance + maim + pavucontrol + tor-browser-bundle-bin + transmission-remote-gtk + vlc + xclip + xorg.xgamma ]; sessionVariables = { @@ -67,17 +68,18 @@ }; imports = [ + ./neovim.nix + ./npm.nix + ./zsh.nix + ] ++ lib.optionals enableGUI [ ./theming.nix ./xdg.nix # ./alacritty.nix ./kitty.nix ./mpv.nix - ./neovim.nix - ./npm.nix ./rofi.nix # ./urxvt.nix - ./zsh.nix ./dunst.nix ./picom.nix @@ -91,7 +93,7 @@ ]; programs = { - feh.enable = true; + feh.enable = enableGUI; direnv = { enable = true; @@ -123,7 +125,7 @@ clipmenu.enable = false; gpg-agent = { enable = true; - pinentryFlavor = "gnome3"; + pinentryFlavor = if enableGUI then "gnome3" else "tty"; }; }; From c8010af175bf3e95554cb14e6aa8938696d63a8e Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Thu, 15 Jul 2021 14:54:02 +0700 Subject: [PATCH 0067/1112] drop unused modules and packages in user removed modules: - alacritty.nix - i3.nix - polybar.i3.nix (polybar.bspwm.nix is now renamed to just polybar.nix) - urxvt.nix removed packages: - appimage-run - ghidra-bin - inkscape - lf - mps-youtube - vlc --- users/rin/alacritty.nix | 38 --- users/rin/home.nix | 12 +- users/rin/i3.nix | 233 --------------- users/rin/polybar.i3.nix | 291 ------------------- users/rin/{polybar.bspwm.nix => polybar.nix} | 0 users/rin/urxvt.nix | 23 -- 6 files changed, 1 insertion(+), 596 deletions(-) delete mode 100644 users/rin/alacritty.nix delete mode 100644 users/rin/i3.nix delete mode 100644 users/rin/polybar.i3.nix rename users/rin/{polybar.bspwm.nix => polybar.nix} (100%) delete mode 100644 users/rin/urxvt.nix diff --git a/users/rin/alacritty.nix b/users/rin/alacritty.nix deleted file mode 100644 index bf37c56..0000000 --- a/users/rin/alacritty.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ config, ... }: { - programs.alacritty = { - enable = true; - settings = { - scrolling = { - history = 10000; - multiplier = 3; - }; - font = { - normal = { - family = "CascadiaCodePL"; - style = "Regular"; - }; - size = 8.6; - }; - window = { - dynamic_title = true; - padding = { - x = 5; - y = 0; - }; - }; - # TODO: how - # hints.enabled = [{ - # command = "xdg-open"; - # post_processing = true; - # mouse = { - # enabled = true; - # mods = "Control"; - # }; - # }]; - - colors.primary.background = "#000000"; - background_opacity = 0.65; - draw_bold_text_with_bright_colors = true; - }; - }; -} diff --git a/users/rin/home.nix b/users/rin/home.nix index 21d6beb..b11d753 100644 --- a/users/rin/home.nix +++ b/users/rin/home.nix @@ -4,11 +4,8 @@ homeDirectory = "/home/rin"; stateVersion = "21.05"; packages = with pkgs; [ - appimage-run ffmpeg gnupg - lf - mps-youtube neofetch nodejs-16_x pamixer @@ -26,16 +23,13 @@ element-desktop feh gnome.file-roller - ghidra-bin gimp - inkscape kotatogram-desktop lxappearance maim pavucontrol tor-browser-bundle-bin transmission-remote-gtk - vlc xclip xorg.xgamma ]; @@ -75,21 +69,17 @@ ./theming.nix ./xdg.nix - # ./alacritty.nix ./kitty.nix ./mpv.nix ./rofi.nix - # ./urxvt.nix ./dunst.nix ./picom.nix - ./polybar.bspwm.nix - # ./polybar.i3.nix + ./polybar.nix ./xorg.nix ./sxhkd.nix ./bspwm.nix - # ./i3.nix ]; programs = { diff --git a/users/rin/i3.nix b/users/rin/i3.nix deleted file mode 100644 index 4c7cbc2..0000000 --- a/users/rin/i3.nix +++ /dev/null @@ -1,233 +0,0 @@ -{ config, pkgs, ... }: -let - super = "Mod4"; - alt = "Mod1"; - - mkGapsMode = mode: { - "plus" = "gaps ${mode} current plus 5"; - "minus" = "gaps ${mode} current minus 5"; - "0" = "gaps ${mode} current set 0"; - "Shift+plus" = "gaps ${mode} all plus 5"; - "Shift+minus" = "gaps ${mode} all minus 5"; - "Shift+0" = "gaps ${mode} all set 0"; - "Return" = "mode gapsMode"; - "Escape" = "mode default"; - }; - genGapsModes = modes: builtins.listToAttrs (builtins.map (mode: { - name = mode; - value = mkGapsMode mode; - }) modes); - genColors = states: builtins.listToAttrs (builtins.map (state: { - name = state; - value = { - background = "#2f343f"; - border = "#2f343f"; - childBorder = "#2f343f"; - indicator = "#2f343f"; - text = "#d8dee8"; - }; - }) states); - -in rec { - xsession.windowManager.i3 = { - enable = true; - package = pkgs.i3-gaps; - - config = { - startup = [ - { - # HACK: what is this lol - command = "systemctl --user restart polybar"; - always = true; - notification = false; - } - { - command = "feh --no-fehbg --bg-fill ${config.xdg.configHome}/xorg/wallpaper.png"; - always = true; - notification = false; - } - ]; - - fonts = { - names = [ - "Open Sans" - "HanaMinA" - "HanaMinB" - ]; - style = "Regular"; - size = 8.0; - }; - - floating = { - titlebar = false; - modifier = super; - border = 0; - }; - - window.border = 0; - bars = []; - - gaps = { - smartGaps = true; - inner = 5; - }; - - colors = genColors [ - "focused" - "focusedInactive" - "unfocused" - "urgent" - "placeholder" - ] // { background = "#2f343f"; }; - #colors.focused.background = "#1d242f"; - - modifier = super; - keybindings = { - # Rofi (App launcher) - "${super}+Return" = "exec rofi -lines 12 -padding 18 -width 60 -location 0 -show drun -sidebar-mode -columns 3 -font 'Noto Sans 8'"; - - # Printscreen - "Print" = "exec maim -us | tee ~/Pictures/Screenshots/$(date +%s)c.png | xclip -selection clipboard -t image/png"; - "Shift+Print" = "exec maim -u | tee ~/Pictures/Screenshots/$(date +%s).png | xclip -selection clipboard -t image/png"; - - # Quick-kill picom - "${super}+p" = "exec systemctl --user stop picom"; - "${super}+Shift+p" = "exec systemctl --user restart picom"; - - # Volume - "XF86AudioRaiseVolume" = "exec pamixer -i 5%"; - "XF86AudioLowerVolume" = "exec pamixer -d 5%"; - "XF86AudioMute" = "exec pamixer -t"; - - # Brightness - "XF86MonBrightnessUp" = "exec light -A 10"; - "XF86MonBrightnessDown" = "exec light -U 10"; - "Shift+XF86MonBrightnessUp" = "exec light -A 1"; - "Shift+XF86MonBrightnessDown" = "exec light -U 1"; - "Ctrl+XF86MonBrightnessUp" = "exec xgamma -gamma 1.3"; - "Ctrl+XF86MonBrightnessDown" = "exec xgamma -gamma 1"; - - # Music control - # "XF86AudioNext" = "exec mpc next"; - # "XF86AudioPrev" = "exec mpc prev"; - # "XF86AudioPlay" = "exec mpc toggle"; - # "XF86AudioStop" = "exec mpc stop"; - - # Kill focused window - "${super}+c" = "kill"; - "${alt}+F4" = "kill"; - - # Change focus - "${super}+Left" = "focus left"; - "${super}+Down" = "focus down"; - "${super}+Up" = "focus up"; - "${super}+Right" = "focus right"; - "${super}+h" = "focus left"; - "${super}+j" = "focus down"; - "${super}+k" = "focus up"; - "${super}+l" = "focus right"; - - # Move focused window - "${super}+Shift+Left" = "move left"; - "${super}+Shift+Down" = "move down"; - "${super}+Shift+Up" = "move up"; - "${super}+Shift+Right" = "move right"; - "${super}+Shift+h" = "move left"; - "${super}+Shift+j" = "move down"; - "${super}+Shift+k" = "move up"; - "${super}+Shift+l" = "move right"; - - # Change split modes - "${super}+b" = "split h"; - "${super}+v" = "split v"; - "${super}+s" = "layout toggle split"; - "${super}+w" = "layout tabbed"; - - # Enter fullscreen - "${super}+f" = "fullscreen toggle"; - - # Toggle floating windows - "${super}+space" = "floating toggle"; - - # Restart / Exit i3 - "${super}+Shift+r" = "restart"; - "${super}+q" = "exec i3-nagbar -m 'Exit?' -b 'Yes' 'i3-msg exit'"; - - # Modes - "${super}+r" = "mode Resize"; - "${super}+Shift+g" = "mode Gaps"; - - # Workspace switching - "${super}+1" = "workspace number $ws1"; - "${super}+2" = "workspace number $ws2"; - "${super}+3" = "workspace number $ws3"; - "${super}+4" = "workspace number $ws4"; - "${super}+5" = "workspace number $ws5"; - "${super}+6" = "workspace number $ws6"; - "${super}+7" = "workspace number $ws7"; - "${super}+8" = "workspace number $ws8"; - "${super}+9" = "workspace number $ws9"; - "${super}+0" = "workspace number $ws10"; - "${alt}+Control+Left" = "workspace prev"; - "${alt}+Control+Right" = "workspace next"; - "${alt}+Control+h" = "workspace prev"; - "${alt}+Control+l" = "workspace next"; - - "${super}+Shift+1" = "move container to workspace number $ws1"; - "${super}+Shift+2" = "move container to workspace number $ws2"; - "${super}+Shift+3" = "move container to workspace number $ws3"; - "${super}+Shift+4" = "move container to workspace number $ws4"; - "${super}+Shift+5" = "move container to workspace number $ws5"; - "${super}+Shift+6" = "move container to workspace number $ws6"; - "${super}+Shift+7" = "move container to workspace number $ws7"; - "${super}+Shift+8" = "move container to workspace number $ws8"; - "${super}+Shift+9" = "move container to workspace number $ws9"; - "${super}+Shift+0" = "move container to workspace number $ws10"; - }; - - modes = { - "Resize" = { - "Left" = "resize shrink width 5 px or 5 ppt"; - "Down" = "resize grow height 5 px or 5 ppt"; - "Up" = "resize shrink height 5 px or 5 ppt"; - "Right" = "resize grow width 5 px or 5 ppt"; - "Return" = "mode default"; - }; - "Gaps" = { - "o" = "mode Outer"; - "i" = "mode Inner"; - "h" = "mode Horizontal"; - "v" = "mode Vertical"; - "t" = "mode Top"; - "r" = "mode Right"; - "b" = "mode Bottom"; - "l" = "mode Left"; - "Return" = "mode Gaps"; - "Escape" = "mode default"; - }; - } // genGapsModes [ - "Outer" - "Inner" - "Horizontal" - "Vertical" - "Top" - "Right" - "Bottom" - "Left" - ]; - }; - - extraConfig = '' - set $ws1 "1:code" - set $ws2 "2:web" - set $ws3 "3:discord" - set $ws4 "4:game" - set $ws5 "5" - set $ws6 "6" - set $ws7 "7" - set $ws8 "8:steam" - set $ws9 "9:spotify" - set $ws10 "10:term" - ''; - }; -} diff --git a/users/rin/polybar.i3.nix b/users/rin/polybar.i3.nix deleted file mode 100644 index 215db94..0000000 --- a/users/rin/polybar.i3.nix +++ /dev/null @@ -1,291 +0,0 @@ -{ config, ... }: -let - memoryBar = { - width = 20; - foreground = [ - "#aaff77" - "#aaff77" - "#fba922" - "#ff5555" - ]; - indicator = { - text = "|"; - font = 6; - foreground = "#fff"; - }; - fill = { - text = "─"; - font = 6; - }; - empty = { - text = "─"; - font = 6; - foreground = "#444444"; - }; - }; - formatRampCoreload = text: color: { - inherit text; - font = 2; - foreground = color; - }; -in { - services.polybar = { - enable = true; - script = builtins.readFile ./scripts/polybar.sh; - settings = rec { - _base = { - monitor = "eDP-1"; - width = "100%"; - height = 22; - background = "#00"; - foreground = "#fff"; - line = { - color = "#00"; - size = 1; - }; - - enable-ipc = true; - }; - - "bar/top" = _base // { - spacing = 2; - padding = { - right = 5; - bottom = 5; - left = 5; - }; - - font = [ - "NotoSans-Regular:size=8.2;2" - "MaterialIcons:size=10;1" - "FontAwesome:size=10;3" - "NotoSans-Regular:size=10;2" - "MaterialIcons:size=12;4" - "FontAwesome5Brands:style=Solid:pixelsize=10;1" - "HanaMinA:size=9.8;1" - "HanaMinB:size=9.8;1" - ]; - - # enable-ipc = true; - modules = { - # left = "previous playpause next spotify"; - left = "title"; - right = "datetime"; - }; - }; - - "bar/bottom" = _base // { - bottom = true; - - spacing = 3; - padding = { - top = 5; - right = 5; - }; - module.margin = { - left = 2; - right = 2; - }; - - font = [ - "NotoSans-Regular:size=8.2;1" - "unifont:size=6;1" - "FontAwesome:size=10;1" - "NotoSans-Regular:size=10;1" - "MaterialIcons:size=12;4" - "FontAwesome5Brands:style=Solid:pixelsize=10;1" - ]; - - modules = { - left = "i3"; - right = "fs cpu memory swap wifi"; - }; - - tray = { - position = "right"; - padding = 2; - scale = 1.1; - }; - }; - - "module/i3" = { - type = "internal/i3"; - - format = " "; - strip.wsnumbers = true; - wrapping.scroll = false; - - ws.icon = { - text = [ - "1:code;" - "2:web;" - "3:discord;%{T6}" - "4:game;" - "8:steam;" - "9:spotify;" - "10:term;" - ]; - default = ""; - }; - - label = { - mode = { - text = "%mode%"; - padding = 5; - }; - - dimmed.underline = _base.background; - - focused = { - text = "%icon%"; - foreground = "#fff"; - background = "#773f3f3f"; - underline = "#c9665e"; - font = 4; - padding = 4; - }; - - unfocused = { - text = "%icon%"; - foreground = "#fff"; - background = "#00"; - underline = "#00"; - font = 4; - padding = 4; - }; - - visible = { - text = "%index%"; - underline = "#555555"; - padding = 4; - }; - - urgent = { - text = "%icon%"; - foreground = "#00"; - background = "#bd2c40"; - underline = "#9b0a20"; - font = 4; - padding = 4; - }; - }; - }; - - "module/cpu" = { - type = "internal/cpu"; - interval = 0.5; - label = "CPU %percentage%%"; - format = { - text = "